p802_15_4nam.cc
上传用户:rrhhcc
上传日期:2015-12-11
资源大小:54129k
文件大小:13k
源码类别:

通讯编程

开发平台:

Visual C++

  1. /********************************************/
  2. /*     NS2 Simulator for IEEE 802.15.4      */
  3. /*           (per P802.15.4/D18)            */
  4. /*------------------------------------------*/
  5. /* by:        Jianliang Zheng               */
  6. /*        (zheng@ee.ccny.cuny.edu)          */
  7. /*              Myung J. Lee                */
  8. /*          (lee@ccny.cuny.edu)             */
  9. /*        ~~~~~~~~~~~~~~~~~~~~~~~~~         */
  10. /*           SAIT-CUNY Joint Lab            */
  11. /********************************************/
  12. // File:  p802_15_4nam.cc
  13. // Mode:  C++; c-basic-offset:8; tab-width:8; indent-tabs-mode:t
  14. // $Header: /cvsroot/nsnam/ns-2/wpan/p802_15_4nam.cc,v 1.1 2005/01/24 18:34:25 haldar Exp $
  15. /*
  16.  * Copyright (c) 2003-2004 Samsung Advanced Institute of Technology and
  17.  * The City University of New York. All rights reserved.
  18.  *
  19.  * Redistribution and use in source and binary forms, with or without
  20.  * modification, are permitted provided that the following conditions
  21.  * are met:
  22.  * 1. Redistributions of source code must retain the above copyright
  23.  *    notice, this list of conditions and the following disclaimer.
  24.  * 2. Redistributions in binary form must reproduce the above copyright
  25.  *    notice, this list of conditions and the following disclaimer in the
  26.  *    documentation and/or other materials provided with the distribution.
  27.  * 3. All advertising materials mentioning features or use of this software
  28.  *    must display the following acknowledgement:
  29.  * This product includes software developed by the Joint Lab of Samsung 
  30.  *      Advanced Institute of Technology and The City University of New York.
  31.  * 4. Neither the name of Samsung Advanced Institute of Technology nor of 
  32.  *    The City University of New York may be used to endorse or promote 
  33.  *    products derived from this software without specific prior written 
  34.  *    permission.
  35.  *
  36.  * THIS SOFTWARE IS PROVIDED BY THE JOINT LAB OF SAMSUNG ADVANCED INSTITUTE
  37.  * OF TECHNOLOGY AND THE CITY UNIVERSITY OF NEW YORK ``AS IS'' AND ANY EXPRESS 
  38.  * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES 
  39.  * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN 
  40.  * NO EVENT SHALL SAMSUNG ADVANCED INSTITUTE OR THE CITY UNIVERSITY OF NEW YORK 
  41.  * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR 
  42.  * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE 
  43.  * GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 
  44.  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 
  45.  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT 
  46.  * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
  47.  */
  48. #include "p802_15_4mac.h"
  49. #include "p802_15_4nam.h"
  50. MACLINK *macLink1 = NULL;
  51. MACLINK *macLink2 = NULL;
  52. int addMacLink(int ad,Mac802_15_4 *m)
  53. {
  54. MACLINK *tmp;
  55. if (macLink2 == NULL) //not exist yet
  56. {
  57. macLink2 = new MACLINK(ad,m);
  58. if (macLink2 == NULL) return 1;
  59. macLink1 = macLink2;
  60. }
  61. else
  62. {
  63. tmp=new MACLINK(ad,m);
  64. if (tmp == NULL) return 1;
  65. tmp->last = macLink2;
  66. macLink2->next = tmp;
  67. macLink2 = tmp;
  68. }
  69. return 0;
  70. }
  71. int updateMacLink(int oper,int ad)
  72. {
  73. MACLINK *tmp;
  74. int rt;
  75. rt = 1;
  76. tmp = macLink1;
  77. while(tmp != NULL)
  78. {
  79. if (tmp->addr == ad)
  80. {
  81. if (oper == mac_oper_del) //delete an element
  82. {
  83. if(tmp->last != NULL)
  84. {
  85. tmp->last->next = tmp->next;
  86. if(tmp->next != NULL)
  87. tmp->next->last = tmp->last;
  88. else
  89. macLink2 = tmp->last;
  90. }
  91. else if (tmp->next != NULL)
  92. {
  93. macLink1 = tmp->next;
  94. tmp->next->last = NULL;
  95. }
  96. else
  97. {
  98. macLink1 = NULL;
  99. macLink2 = NULL;
  100. }
  101. delete tmp;
  102. }
  103. rt = 0;
  104. break;
  105. }
  106. tmp = tmp->next;
  107. }
  108. return rt;
  109. }
  110. Mac802_15_4 *getMacLink(int ad)
  111. {
  112. MACLINK *tmp;
  113. tmp = macLink1;
  114. while(tmp != NULL)
  115. {
  116. if(tmp->addr == ad)
  117. return tmp->mac;
  118. tmp = tmp->next;
  119. }
  120. return NULL;
  121. }
  122. int chkAddMacLink(int ad,Mac802_15_4 *m)
  123. {
  124.         int i;
  125.         i = updateMacLink(at_oper_est,ad);
  126.         if (i == 0) return 1;
  127.         i = addMacLink(ad,m);
  128.         if (i == 0) return 0;
  129.         else return 2;
  130. }
  131. //-------------------------------------------------------------------
  132. ATTRIBUTELINK *attrLink1 = NULL;
  133. ATTRIBUTELINK *attrLink2 = NULL;
  134. int ATTRIBUTE_SN = 32;
  135. packet_t nam_pktName2Type(const char *name)
  136. {
  137. //not all types included
  138. return (strcmp(packet_info.name(PT_TCP),name) == 0)?PT_TCP:
  139.                (strcmp(packet_info.name(PT_UDP),name) == 0)?PT_UDP: 
  140.                (strcmp(packet_info.name(PT_CBR),name) == 0)?PT_CBR: 
  141.                (strcmp(packet_info.name(PT_ACK),name) == 0)?PT_ACK: 
  142.                (strcmp(packet_info.name(PT_PRUNE),name) == 0)?PT_PRUNE: 
  143.                (strcmp(packet_info.name(PT_GRAFT),name) == 0)?PT_GRAFT: 
  144.                (strcmp(packet_info.name(PT_GRAFTACK),name) == 0)?PT_GRAFTACK: 
  145.                (strcmp(packet_info.name(PT_RTCP),name) == 0)?PT_RTCP: 
  146.                (strcmp(packet_info.name(PT_RTP),name) == 0)?PT_RTP: 
  147.                (strcmp(packet_info.name(PT_SRM),name) == 0)?PT_SRM: 
  148.                (strcmp(packet_info.name(PT_TELNET),name) == 0)?PT_TELNET: 
  149.                (strcmp(packet_info.name(PT_FTP),name) == 0)?PT_FTP: 
  150.                (strcmp(packet_info.name(PT_HTTP),name) == 0)?PT_HTTP: 
  151.                (strcmp(packet_info.name(PT_MFTP),name) == 0)?PT_MFTP: 
  152.                (strcmp(packet_info.name(PT_ARP),name) == 0)?PT_ARP: 
  153.                (strcmp(packet_info.name(PT_MAC),name) == 0)?PT_MAC: 
  154.                (strcmp(packet_info.name(PT_TORA),name) == 0)?PT_TORA: 
  155.                (strcmp(packet_info.name(PT_DSR),name) == 0)?PT_DSR: 
  156.                (strcmp(packet_info.name(PT_AODV),name) == 0)?PT_AODV: 
  157.                (strcmp(packet_info.name(PT_IMEP),name) == 0)?PT_IMEP: 
  158.                (strcmp(packet_info.name(PT_PING),name) == 0)?PT_PING: 
  159.                (strcmp(packet_info.name(PT_LDP),name) == 0)?PT_LDP: 
  160.                (strcmp(packet_info.name(PT_GAF),name) == 0)?PT_GAF: 
  161.                (strcmp(packet_info.name(PT_PGM),name) == 0)?PT_PGM:PT_NTYPE;
  162. }
  163. int addAttrLink(packet_t pt,char *clr,int s,int d)
  164. {
  165. ATTRIBUTELINK *tmp;
  166. if (attrLink2 == NULL) //not exist yet
  167. {
  168. attrLink2 = new ATTRIBUTELINK(pt,clr,s,d);
  169. if (attrLink2 == NULL) return 1;
  170. attrLink1 = attrLink2;
  171. }
  172. else
  173. {
  174. tmp=new ATTRIBUTELINK(pt,clr,s,d);
  175. if (tmp == NULL) return 1;
  176. tmp->last = attrLink2;
  177. attrLink2->next = tmp;
  178. attrLink2 = tmp;
  179. }
  180. return 0;
  181. }
  182. int updateAttrLink(int oper,packet_t pt,int s,int d)
  183. {
  184. ATTRIBUTELINK *tmp;
  185. int rt;
  186. rt = 1;
  187. tmp = attrLink1;
  188. while(tmp != NULL)
  189. {
  190. if ((tmp->ptype == pt)&&(tmp->src == s)&&(tmp->dst == d))
  191. {
  192. if (oper == at_oper_del) //delete an element
  193. {
  194. if(tmp->last != NULL)
  195. {
  196. tmp->last->next = tmp->next;
  197. if(tmp->next != NULL)
  198. tmp->next->last = tmp->last;
  199. else
  200. attrLink2 = tmp->last;
  201. }
  202. else if (tmp->next != NULL)
  203. {
  204. attrLink1 = tmp->next;
  205. tmp->next->last = NULL;
  206. }
  207. else
  208. {
  209. attrLink1 = NULL;
  210. attrLink2 = NULL;
  211. }
  212. delete tmp;
  213. }
  214. rt = 0;
  215. break;
  216. }
  217. tmp = tmp->next;
  218. }
  219. return rt;
  220. }
  221. int chkAddAttrLink(packet_t pt,char *clr,int s,int d)
  222. {
  223.         int i;
  224.         i = updateAttrLink(at_oper_est,pt,s,d);
  225.         if (i == 0) return 1;
  226.         i = addAttrLink(pt,clr,s,d);
  227.         if (i == 0) return 0;
  228.         else return 2;
  229. }
  230. ATTRIBUTELINK *findAttrLink(packet_t pt,int s,int d)
  231. {
  232. ATTRIBUTELINK *tmp;
  233. tmp = attrLink1;
  234. while(tmp != NULL)
  235. {
  236. if((tmp->ptype == pt)&&(tmp->src == s)&&(tmp->dst == d))
  237. return tmp;
  238. tmp = tmp->next;
  239. }
  240. return NULL;
  241. }
  242. //---------------------------------------------------------------------------
  243. bool Nam802_15_4::Nam_Status = false;
  244. bool Nam802_15_4::emStatus = false;
  245. bool Nam802_15_4::emHandling = true;
  246. char Nam802_15_4::def_PANCoor_clr[] = "tomato";
  247. char Nam802_15_4::def_Coor_clr[] = "blue";
  248. char Nam802_15_4::def_Dev_clr[] = "green3";
  249. char Nam802_15_4::def_Node_clr[] = "black";
  250. char Nam802_15_4::def_Mark_clr[] = "black";
  251. char Nam802_15_4::def_ColFlash_clr[] = "gold";
  252. char Nam802_15_4::def_NodeFail_clr[] = "grey";
  253. char Nam802_15_4::def_LinkFailFlash_clr[] = "red";
  254. Nam802_15_4::Nam802_15_4(const char *ncolor,const char *mcolor,Mac802_15_4 *m)
  255. {
  256. strncpy(nodeColor,ncolor,20);
  257. nodeColor[20] = 0;
  258. strcpy(nodePreColor,nodeColor);
  259. strncpy(markColor,mcolor,20);
  260. markColor[20] = 0;
  261. strcpy(label,"""");
  262. mac = m;
  263. }
  264. void Nam802_15_4::flowAttribute(int clrID,const char *clrName)
  265. {
  266. Tcl& tcl = Tcl::instance();
  267. if (!Nam_Status) return;
  268. tcl.evalf("[Simulator instance] puts-nam-traceall {c -t * -i %d -n %s}",
  269. clrID,clrName);
  270. }
  271. void Nam802_15_4::changePlaybackRate(double atTime,const char *stepLen)
  272. {
  273. Tcl& tcl = Tcl::instance();
  274. if (!Nam_Status) return;
  275. if (atTime > 0.0)
  276. atTime += 0.000000001;
  277. tcl.evalf("[Simulator instance] at %.9f {[Simulator instance] puts-nam-traceall {v -t %.9f -e set_rate_ext %s 1}}",
  278. atTime,atTime,stepLen);
  279. }
  280. void Nam802_15_4::changeNodeColor(double atTime,const char *newColor,bool save)
  281. {
  282. char t_newColor[21];
  283. Tcl& tcl = Tcl::instance();
  284. if (!Nam_Status) return;
  285. if (emStatus&&emHandling) return;
  286. if (atTime > 0.0)
  287. atTime += 0.000000001;
  288. tcl.evalf("[Simulator instance] at %.9f {[Simulator instance] puts-nam-traceall {n -t %.9f -s %d -S COLOR -c %s -o %s}}",
  289. atTime,atTime,mac->index_,newColor,nodeColor);
  290. if (save)
  291. {
  292. strncpy(t_newColor,newColor,20);
  293. t_newColor[20] = 0;
  294. strcpy(nodePreColor,nodeColor);
  295. strncpy(nodeColor,t_newColor,20);
  296. nodeColor[20] = 0;
  297. }
  298. }
  299. void Nam802_15_4::changeBackNodeColor(double atTime)
  300. {
  301. changeNodeColor(atTime,nodePreColor);
  302. }
  303. void Nam802_15_4::flashNodeColor(double atTime,const char *flashColor)
  304. {
  305. char t_flashColor[21];
  306. Tcl& tcl = Tcl::instance();
  307. if (!Nam_Status) return;
  308. if (emStatus&&emHandling) return;
  309. if (flashColor[0] == 0)
  310. strcpy(t_flashColor,Nam802_15_4::def_ColFlash_clr);
  311. else
  312. {
  313. strncpy(t_flashColor,flashColor,20);
  314. t_flashColor[20] = 0;
  315. }
  316. atTime += 0.000000001;
  317. tcl.evalf("[Simulator instance] at %.9f {[Simulator instance] puts-nam-traceall {n -t %.9f -s %d -S COLOR -c %s -o %s}}",
  318. atTime,atTime,mac->index_,t_flashColor,nodeColor);
  319. atTime += 0.010000000;
  320. tcl.evalf("[Simulator instance] at %.9f {[Simulator instance] puts-nam-traceall {n -t %.9f -s %d -S COLOR -c %s -o %s}}",
  321. atTime,atTime,mac->index_,"grey",t_flashColor);
  322. atTime += 0.010000000;
  323. tcl.evalf("[Simulator instance] at %.9f {[Simulator instance] puts-nam-traceall {n -t %.9f -s %d -S COLOR -c %s -o %s}}",
  324. atTime,atTime,mac->index_,nodeColor,"grey");
  325. }
  326. void Nam802_15_4::changeMarkColor(double atTime,const char *newColor)
  327. {
  328. Tcl& tcl = Tcl::instance();
  329. if (!Nam_Status) return;
  330. if (atTime > 0.0)
  331. atTime += 0.000000001;
  332. tcl.evalf("[Simulator instance] at %.9f {[Simulator instance] puts-nam-traceall {n -t %.9f -s %d -S COLOR -i %s -I %s -c %s -o %s}}",
  333. atTime,atTime,mac->index_,newColor,markColor,nodeColor,nodeColor);
  334. strncpy(markColor,newColor,20);
  335. markColor[20] = 0;
  336. }
  337. void Nam802_15_4::flashNodeMark(double atTime)
  338. {
  339. Tcl& tcl = Tcl::instance();
  340. if (!Nam_Status) return;
  341. if (emStatus&&emHandling) return;
  342. atTime += 0.010000000;
  343. tcl.evalf("[Simulator instance] at %.9f {[Simulator instance] puts-nam-traceall {n -t %.9f -s %d -S COLOR -i %s -I %s -c %s -o %s}}",
  344. atTime,atTime,mac->index_,"LightGrey",markColor,nodeColor,nodeColor);
  345. atTime += 0.010000000;
  346. tcl.evalf("[Simulator instance] at %.9f {[Simulator instance] puts-nam-traceall {n -t %.9f -s %d -S COLOR -i %s -I %s -c %s -o %s}}",
  347. atTime,atTime,mac->index_,markColor,"LightGrey",nodeColor,nodeColor);
  348. }
  349. void Nam802_15_4::changeLabel(double atTime,const char *lb)
  350. {
  351. Tcl& tcl = Tcl::instance();
  352. if (!Nam_Status) return;
  353. if (atTime > 0.0)
  354. atTime += 0.000000001;
  355. tcl.evalf("[Simulator instance] at %.9f {[Simulator instance] puts-nam-traceall {n -t %.9f -s %d -S DLABEL -l %s -L %s}}",
  356. atTime,atTime,mac->index_,lb,label);
  357. strncpy(label,lb,80);
  358. label[80] = 0;
  359. }
  360. void Nam802_15_4::flashLinkFail(double atTime,int dst,const char *flashColor)
  361. {
  362. char t_flashColor[21];
  363. Tcl& tcl = Tcl::instance();
  364. if (!Nam_Status) return;
  365. if (flashColor[0] == 0)
  366. strcpy(t_flashColor,Nam802_15_4::def_LinkFailFlash_clr);
  367. else
  368. {
  369. strncpy(t_flashColor,flashColor,20);
  370. t_flashColor[20] = 0;
  371. }
  372. atTime += 0.000000001;
  373. tcl.evalf("[Simulator instance] at %.9f {[Simulator instance] puts-nam-traceall {n -t %.9f -s %d -S DLABEL -l " ~ %d" -L %s}}",
  374. atTime,atTime,mac->index_,dst,label);
  375. atTime += 0.020000000;
  376. tcl.evalf("[Simulator instance] at %.9f {[Simulator instance] puts-nam-traceall {n -t %.9f -s %d -S DLABEL -l " " -L " ~ %d"}}",
  377. atTime,atTime,mac->index_,dst);
  378. atTime += 0.010000000;
  379. tcl.evalf("[Simulator instance] at %.9f {[Simulator instance] puts-nam-traceall {n -t %.9f -s %d -S DLABEL -l %s -L " ~ %d"}}",
  380. atTime,atTime,mac->index_,label,dst);
  381. }
  382. void Nam802_15_4::annotate(double atTime,const char *note)
  383. {
  384. Tcl& tcl = Tcl::instance();
  385. atTime += 0.000000001;
  386. tcl.evalf("[Simulator instance] at %.9f {[Simulator instance] trace-annotate %s}",atTime,note);
  387. }
  388. // End of file: p802_15_4nam.cc