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

通讯编程

开发平台:

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_4timer.cc
  13. // Mode:  C++; c-basic-offset:8; tab-width:8; indent-tabs-mode:t
  14. // $Header: /cvsroot/nsnam/ns-2/wpan/p802_15_4timer.cc,v 1.2 2007/01/30 05:00:52 tom_henderson 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 <packet.h>
  49. #include <random.h>
  50. #include "p802_15_4csmaca.h"
  51. #include "p802_15_4timer.h"
  52. //--base timer class for MAC sublayer---
  53. Mac802_15_4Timer::Mac802_15_4Timer()
  54. {
  55. reset();
  56. }
  57. void Mac802_15_4Timer::reset(void)
  58. {
  59. busy_ = 0;
  60. paused_ = 0;
  61. stime = 0.0;
  62. wtime = 0.0;
  63. }
  64. void Mac802_15_4Timer::start(double time)
  65. {
  66. Scheduler &s = Scheduler::instance();
  67. assert(busy_ == 0);
  68. busy_ = 1;
  69. paused_ = 0;
  70. stime = s.clock();
  71. wtime = time;
  72. assert(wtime >= 0.0);
  73. event.uid_ = 0;
  74. s.schedule(this, &event, wtime);
  75. }
  76. void Mac802_15_4Timer::stop(void)
  77. {
  78. Scheduler &s = Scheduler::instance();
  79. assert(busy_);
  80. if(paused_ == 0)
  81. s.cancel(&event);
  82. reset();
  83. }
  84. //---timers for MAC sublayer---
  85. macBackoffTimer::macBackoffTimer(CsmaCA802_15_4 *csma) : Mac802_15_4Timer()
  86. {
  87. csmaca = csma;
  88. }
  89. /*
  90. void macBackoffTimer::start(double time, double st, bool idle)
  91. {
  92. wtime = time;
  93. slottime = st;
  94. if(idle == 0)
  95. paused_ = 1;
  96. else
  97. Mac802_15_4Timer::start(wtime);
  98. }
  99. */
  100. void macBackoffTimer::handle(Event *)
  101. {
  102. reset();
  103. csmaca->backoffHandler();
  104. }
  105. /*
  106. void macBackoffTimer::pause()
  107. {
  108. int slots;
  109. double sr;
  110. Scheduler &s = Scheduler::instance();
  111. sr = s.clock() - stime;
  112. slots = (int)(sr/slottime);
  113. if(slots < 0) slots = 0;
  114. assert(busy_ && ! paused_);
  115. paused_ = 1;
  116. wtime -= (slots * slottime);
  117. assert(wtime >= 0.0);
  118. s.cancel(&event);
  119. }
  120. void macBackoffTimer::resume(double beacontime)
  121. {
  122. Scheduler &s = Scheduler::instance();
  123. assert(busy_ && paused_);
  124. paused_ = 0;
  125. stime = s.clock();
  126. assert(wtime >= 0.0);
  127. s.schedule(this, &event, wtime);
  128. }
  129. */
  130. //------------------------------------------------------
  131. macBeaconOtherTimer::macBeaconOtherTimer(CsmaCA802_15_4 *csma) : Mac802_15_4Timer()
  132. {
  133. csmaca = csma;
  134. }
  135. void macBeaconOtherTimer::handle(Event *)
  136. {
  137. reset();
  138. csmaca->bcnOtherHandler();
  139. }
  140. //------------------------------------------------------
  141. macDeferCCATimer::macDeferCCATimer(CsmaCA802_15_4 *csma) : Mac802_15_4Timer()
  142. {
  143. csmaca = csma;
  144. }
  145. void macDeferCCATimer::handle(Event *)
  146. {
  147. reset();
  148. csmaca->deferCCAHandler();
  149. }
  150. //------------------------------------------------------
  151. void macTxOverTimer::handle(Event *)
  152. {
  153. reset();
  154. mac->txOverHandler();
  155. }
  156. //------------------------------------------------------
  157. void macTxTimer::handle(Event *)
  158. {
  159. reset();
  160. mac->txHandler();
  161. }
  162. //------------------------------------------------------
  163. void macExtractTimer::backoffCAP(double time)
  164. {
  165. double t_bcnRxTime,t_sSlotDuration,t_endCAP,t_endBackoff;
  166. t_bcnRxTime = mac->macBcnRxTime / mac->phy->getRate('s');
  167. t_sSlotDuration = mac->sfSpec2.sd / mac->phy->getRate('s');
  168. /* Linux floating number compatibility
  169. t_endCAP = t_bcnRxTime + (mac->sfSpec2.FinCAP + 1) * t_sSlotDuration;
  170. */
  171. {
  172. double tmpf;
  173. tmpf = (mac->sfSpec2.FinCAP + 1) * t_sSlotDuration;
  174. t_endCAP = t_bcnRxTime + tmpf;
  175. }
  176. t_endBackoff = CURRENT_TIME + time;
  177. if (t_endBackoff > t_endCAP) //count-down should be paused at the end of CAP and resumed when receiving next superframe
  178. leftTime = t_endBackoff - t_endCAP;
  179. else
  180. {
  181. onlyCAP = false;
  182. Mac802_15_4Timer::start(time);
  183. }
  184. }
  185. void macExtractTimer::start(double time,bool onlycap)
  186. {
  187. if (!onlycap)
  188. {
  189. onlyCAP = false;
  190. Mac802_15_4Timer::start(time);
  191. }
  192. else
  193. {
  194. onlyCAP = true;
  195. backoffCAP(time);
  196. }
  197. }
  198. void macExtractTimer::stop(void)
  199. {
  200. if (onlyCAP)
  201. onlyCAP = false;
  202. else
  203. Mac802_15_4Timer::stop();
  204. }
  205. void macExtractTimer::handle(Event *)
  206. {
  207. onlyCAP = false;
  208. reset();
  209. mac->extractHandler();
  210. }
  211. void macExtractTimer::resume(void)
  212. {
  213. //this function will be called by MAC each time a new beacon transmitted by the coordinator (only in beacon enabled mode)
  214. if (onlyCAP)
  215. backoffCAP(leftTime);
  216. }
  217. //------------------------------------------------------
  218. void macAssoRspWaitTimer::handle(Event *)
  219. {
  220. reset();
  221. mac->assoRspWaitHandler();
  222. }
  223. //------------------------------------------------------
  224. void macDataWaitTimer::handle(Event *)
  225. {
  226. reset();
  227. mac->dataWaitHandler();
  228. }
  229. //------------------------------------------------------
  230. void macRxEnableTimer::handle(Event *)
  231. {
  232. reset();
  233. mac->rxEnableHandler();
  234. }
  235. //------------------------------------------------------
  236. void macScanTimer::handle(Event *)
  237. {
  238. reset();
  239. mac->scanHandler();
  240. }
  241. //------------------------------------------------------
  242. void macBeaconTxTimer::start(bool reset, bool fortx, double wt)
  243. {
  244. double wtime;
  245. if (reset)
  246. {
  247. forTX = fortx;
  248. macBeaconOrder_last = 15;
  249. if (Mac802_15_4Timer::busy())
  250. Mac802_15_4Timer::stop();
  251. Mac802_15_4Timer::start(wt);
  252. return;
  253. }
  254. else
  255. {
  256. forTX = (!forTX);
  257. }
  258. if (!forTX)
  259. Mac802_15_4Timer::start(12 / mac->phy->getRate('s'));
  260. else if (mac->mpib.macBeaconOrder != 15)
  261. {
  262. wtime = ((aBaseSuperframeDuration * (1 << mac->mpib.macBeaconOrder) - 12) / mac->phy->getRate('s'));
  263. Mac802_15_4Timer::start(wtime);
  264. macBeaconOrder_last = mac->mpib.macBeaconOrder;
  265. }
  266. else if (macBeaconOrder_last != 15)
  267. {
  268. wtime = ((aBaseSuperframeDuration * (1 << macBeaconOrder_last) - 12) / mac->phy->getRate('s'));
  269. Mac802_15_4Timer::start(wtime);
  270. }
  271. }
  272. void macBeaconTxTimer::handle(Event *e)
  273. {
  274. reset();
  275. mac->beaconTxHandler(forTX);
  276. }
  277. //------------------------------------------------------
  278. void macBeaconRxTimer::start(void)
  279. {
  280. double BI,bcnRxTime,now,len12s,wtime;
  281. double tmpf;
  282. BI = (aBaseSuperframeDuration * (1 << mac->macBeaconOrder2)) / mac->phy->getRate('s');
  283. bcnRxTime = mac->macBcnRxTime / mac->phy->getRate('s');
  284. now = CURRENT_TIME;
  285. while (now - bcnRxTime > BI)
  286. bcnRxTime += BI;
  287. len12s = 12 / mac->phy->getRate('s');
  288. /* Linux floating number compatibility
  289. wtime = BI - (now - bcnRxTime);
  290. */
  291. {
  292. tmpf = (now - bcnRxTime);;
  293. wtime = BI - tmpf;
  294. }
  295. if (wtime >= len12s)
  296. wtime -= len12s;
  297. /* Linux floating number compatibility
  298. if (now + wtime - lastTime < BI - len12s)
  299. */
  300. tmpf = now + wtime;
  301. if (tmpf - lastTime < BI - len12s)
  302. {
  303. tmpf = 2 * BI;
  304. tmpf = tmpf - now;
  305. tmpf = tmpf + bcnRxTime;
  306. wtime = tmpf - len12s;
  307. //wtime = 2* BI - (now - bcnRxTime) - len12s;
  308. }
  309. lastTime = now + wtime;
  310. Mac802_15_4Timer::start(wtime);
  311. }
  312. void macBeaconRxTimer::handle(Event *e)
  313. {
  314. reset();
  315. mac->beaconRxHandler();
  316. }
  317. //------------------------------------------------------
  318. void macBeaconSearchTimer::handle(Event *e)
  319. {
  320. reset();
  321. mac->beaconSearchHandler();
  322. }
  323. // 2.31 change: Timer to control node shutdown and wakeup
  324. void macWakeupTimer::start(void)
  325. {
  326. double BI,bcnRxTime,now,wtime;
  327. double tmpf;
  328. BI = (aBaseSuperframeDuration * (1 << mac->macBeaconOrder2)) / mac->phy->getRate('s');
  329. bcnRxTime = mac->macBcnRxTime / mac->phy->getRate('s');
  330. now = CURRENT_TIME;
  331. while (now - bcnRxTime > BI)
  332. bcnRxTime += BI;
  333. {
  334. tmpf = (now - bcnRxTime);;
  335. wtime = BI - tmpf-aTurnaroundTime/mac->phy->getRate('s');
  336. // wtime=wtime-3*mac->csmaca->bPeriod;
  337. if (wtime < 0) {
  338. printf("WARNING: negative time for wakeup timer");
  339. abort();
  340. }
  341. }
  342. tmpf = now + wtime;
  343. lastTime = now + wtime;
  344. Mac802_15_4Timer::start(wtime);
  345. }
  346. // 2.31 change: Timer to control node shutdown and wakeup
  347. void macWakeupTimer::handle(Event *e)
  348. {
  349. reset();
  350. EnergyModel *em = mac->netif_->node()->energy_model();
  351. if (em)
  352. {
  353. mac->phy->wakeupNode(0);
  354. }
  355. }
  356. // End of file: p802_15_4timer.cc