Wiselib
wiselib.testing/algorithms/cluster/modules/chd/attr_chd.h
Go to the documentation of this file.
00001 /*
00002  * File:   attr_chd.h
00003  * Author: Amaxilatis
00004  */
00005 
00006 #ifndef __ATTRIBUTE_CHD_H_
00007 #define __ATTRIBUTE_CHD_H_
00008 
00009 namespace wiselib {
00015 template<typename OsModel_P, typename Radio_P>
00016 class AtributeClusterHeadDecision {
00017 public:
00018 
00019    typedef OsModel_P OsModel;
00020    //TYPEDEFS
00021    typedef Radio_P Radio;
00022    //typedef typename OsModel::Radio Radio;
00023    typedef typename OsModel::Debug Debug;
00024 
00025    // data types
00026    typedef int cluster_id_t;
00027    typedef int cluster_level_t; //quite useless within current scheme, supported for compatibility issues
00028    typedef typename Radio::node_id_t node_id_t;
00029    typedef typename Radio::size_t size_t;
00030    typedef typename Radio::block_data_t block_data_t;
00031 
00032    // delegate
00033    typedef delegate1<int, int*> chd_delegate_t;
00034 
00035    /*
00036     * Constructor
00037     * */
00038    AtributeClusterHeadDecision() :
00039       cluster_head_(false), theta_(30) {
00040    }
00041 
00042    /*
00043     * Destructor
00044     * */
00045    ~AtributeClusterHeadDecision() {
00046    }
00047 
00048    /*
00049     * INIT
00050     * initializes the values of radio and debug
00051     */
00052    void init(Radio& radio, Debug& debug) {
00053       radio_ = &radio;
00054       debug_ = &debug;
00055    }
00056 
00057    /* SET functions */
00058 
00059    void set_attribute(int theta) {
00060       theta_ = theta;
00061       min_theta_ = theta;
00062    }
00063 
00064    /* GET functions */
00065 
00066    // Returns if Cluster Head
00067 
00068    inline bool is_cluster_head(void) {
00069       return cluster_head_;
00070    }
00071 
00072    /*
00073     * Reset
00074     * resets the module
00075     * initializes values
00076     * */
00077    inline void reset() {
00078       cluster_head_ = false;
00079       min_theta_ = theta_;
00080    }
00081 
00082    /*
00083     * CALCULATE_HEAD
00084     * defines if the node is a cluster head or not
00085     * if a cluster head return true
00086     * */
00087    inline bool calculate_head() {
00088       // check condition to be a cluster head
00089                 //debug().debug("Node::%x::%x::",theta_,min_theta_);
00090       if (theta_ == min_theta_) {
00091          cluster_head_ = true;
00092       } else {
00093          cluster_head_ = false;
00094       }
00095       return cluster_head_;
00096    }
00097 
00098    void receive(node_id_t from, size_t len, block_data_t * mess) {
00099             
00100       AttributeClusterMsg<OsModel, Radio> msg;
00101       memcpy(&msg, mess, len);
00102       node_id_t mes_theta = msg.attribute();
00103                 
00104       if (mes_theta < min_theta_) {
00105          min_theta_ = mes_theta;
00106       }
00107                 //debug().debug("R::%x::%x::min(%x)::",radio().id(),mes_theta,min_theta_);
00108    }
00109 
00110    AttributeClusterMsg<OsModel, Radio> get_attribute_payload() {
00111       AttributeClusterMsg<OsModel, Radio> msg;
00112       msg.set_attribute(min_theta_);
00113 #ifdef DEBUG_PAYLOADS
00114       debug_->debug("Payload::%x::[%d|%x]::", radio_->id(), type, theta_);
00115 #endif
00116       return msg;
00117    }
00118 
00119 private:
00120 
00121    bool cluster_head_; // if a cluster head
00122    node_id_t theta_; // clustering parameter
00123    // delegate for callbacks
00124    chd_delegate_t winner_callback_;
00125    chd_delegate_t sender_callback_;
00126    int min_theta_;
00127 
00128    Radio * radio_;
00129    Debug * debug_;
00130 
00131 };
00132 
00133 }
00134 
00135 #endif
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Defines