Wiselib
|
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