Wiselib
|
00001 #ifndef _MOCA_JD_H 00002 #define _MOCA_JD_H 00003 00004 namespace wiselib { 00005 00011 template<typename OsModel_P> 00012 00013 class MocaJoinDecision { 00014 public: 00015 00016 //TYPEDEFS 00017 typedef OsModel_P OsModel; 00018 typedef typename OsModel::Radio Radio; 00019 typedef typename OsModel::Debug Debug; 00020 00021 00022 // data types 00023 typedef typename Radio::node_id_t node_id_t; 00024 typedef typename Radio::block_data_t block_data_t; 00025 typedef node_id_t cluster_id_t; 00026 00027 /* 00028 * Constructor 00029 * */ 00030 MocaJoinDecision() : 00031 id_(0), 00032 maxhops_(0) { 00033 }; 00034 00035 /* 00036 * Destructor 00037 * */ 00038 ~MocaJoinDecision() { 00039 }; 00040 00041 /* 00042 * INIT 00043 * initializes the values of radio and debug 00044 */ 00045 void init(Radio& radio, Debug& debug) { 00046 radio_ = &radio; 00047 debug_ = &debug; 00048 }; 00049 00050 00051 /* SET functions */ 00052 00053 //set the id 00054 00055 void set_id(node_id_t id) { 00056 id_ = id; 00057 }; 00058 00059 void set_maxhops(int maxhops){ 00060 maxhops_ = maxhops; 00061 } 00062 00063 00064 /* GET functions */ 00065 00066 //get the CH_ADVERTISE payload 00067 00068 void get_join_request_payload(block_data_t * mess) { 00069 00070 //block_data_t ret[ get_payload_length(JOIN) ]; 00071 00072 uint8_t type = JOIN; 00073 memcpy(mess,&type,sizeof(uint8_t)); 00074 // ret[0] = JOIN; // type of message 00075 00076 memcpy(mess+sizeof(uint8_t),&id_,sizeof(cluster_id_t)); 00077 // ret[1] = cluster_id_ % 256; // cluster_id 00078 // ret[2] = cluster_id_ / 256; 00079 00080 // ret[3] = hops_ + 1; // hops 00081 uint8_t now_hops = 1; 00082 memcpy(mess+sizeof(uint8_t)+sizeof(cluster_id_t),&now_hops,sizeof(uint8_t)); 00083 00084 //memcpy(mess, ret, get_payload_length(JOIN)); 00085 }; 00086 00087 size_t get_payload_length(int type) { 00088 if (type == JOIN) 00089 return 1+sizeof(cluster_id_t)+1; 00090 else 00091 return 0; 00092 }; 00093 00094 00095 /* 00096 * JOIN 00097 * respond to an JOIN message received 00098 * either join to a cluster or not 00099 * */ 00100 bool join(uint8_t *payload, uint8_t length) { 00101 //copy message to local memory 00102 00103 uint8_t hops; 00104 memcpy(&hops, payload+1+sizeof(cluster_id_t),sizeof(uint8_t)); 00105 00106 //if cluser is close 00107 if (hops <= maxhops_) { 00108 //join the cluster 00109 //return true 00110 return true; 00111 }//if cluster is away 00112 else { 00113 //return false 00114 return false; 00115 } 00116 }; 00117 00118 /* 00119 * ENABLE 00120 * enables the module 00121 * initializes values 00122 * */ 00123 void enable() { 00124 id_ = -1; 00125 maxhops_ = 0; 00126 }; 00127 00128 /* 00129 * DISABLE 00130 * disables this bfsclustering module 00131 * unregisters callbacks 00132 * */ 00133 void disable() { 00134 }; 00135 00136 00137 private: 00138 node_id_t id_; //the node's id 00139 int maxhops_; //hops from cluster head 00140 00141 Radio * radio_; //radio module 00142 Debug * debug_; //debug module 00143 00144 Radio& radio() { 00145 return *radio_; 00146 } 00147 00148 Debug& debug() { 00149 return *debug_; 00150 } 00151 00152 }; 00153 } 00154 00155 00156 #endif 00157