SysTimeStampingM.nc
上传用户:joranyuan
上传日期:2022-06-23
资源大小:3306k
文件大小:5k
源码类别:

网络

开发平台:

Others

  1. /*
  2.  * Copyright (c) 2002, Vanderbilt University
  3.  * All rights reserved.
  4.  *
  5.  * Permission to use, copy, modify, and distribute this software and its
  6.  * documentation for any purpose, without fee, and without written agreement is
  7.  * hereby granted, provided that the above copyright notice, the following
  8.  * two paragraphs and the author appear in all copies of this software.
  9.  * 
  10.  * IN NO EVENT SHALL THE VANDERBILT UNIVERSITY BE LIABLE TO ANY PARTY FOR
  11.  * DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES ARISING OUT
  12.  * OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN IF THE VANDERBILT
  13.  * UNIVERSITY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
  14.  * 
  15.  * THE VANDERBILT UNIVERSITY SPECIFICALLY DISCLAIMS ANY WARRANTIES,
  16.  * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY
  17.  * AND FITNESS FOR A PARTICULAR PURPOSE.  THE SOFTWARE PROVIDED HEREUNDER IS
  18.  * ON AN "AS IS" BASIS, AND THE VANDERBILT UNIVERSITY HAS NO OBLIGATION TO
  19.  * PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS.
  20.  *
  21.  * Author: Miklos Maroti
  22.  * Date last modified: 12/11/03
  23.  */
  24. #include "AM.h"
  25. module SysTimeStampingM
  26. {
  27. provides
  28. {
  29. interface TimeStamping;
  30. #ifdef TIMESTAMPING_CALIBRATE
  31. command uint8_t getBitOffset();
  32. #endif
  33. }
  34. uses
  35. {
  36. interface RadioCoordinator as RadioSendCoordinator;
  37. interface RadioCoordinator as RadioReceiveCoordinator;
  38. interface SysTime;
  39. }
  40. }
  41. implementation
  42. {
  43. #if defined(PLATFORM_MICA2)
  44. /* These are the calibrated bit offsets on the MICA2 for 19.2 Kbps transmit 
  45.  * rate, Manchester Encoding, using the systime with 921.6 KHz frequency.
  46.  * The actual values have been multiplied by two because we substract
  47.  * them before dividing by two. There is a noticable +-0.5 microsec bias
  48.  * for the bits 5 and 6 for unknown reasons, which is corrected here.
  49.  */
  50. static const int16_t BIT_CORRECTION[8] = { 2555, 2651, 2747, 2843, 2939, 3036, 3130, 3227 };
  51. enum { BYTE_TIME = 384 };
  52. #elif defined(PLATFORM_MICA2DOT)
  53. /* These are the calibrated bit offsets on the MICA2DOR for 19.2 Kbps 
  54.  * transmit rate, Manchester Encoding, using the systime with 500 KHz 
  55.  * frequency.
  56.  */
  57. static const int16_t BIT_CORRECTION[8] = { 1388, 1442, 1492, 1545, 1598, 1651, 1702, 1754 };
  58. enum { BYTE_TIME = 209 };
  59. #endif
  60. norace uint16_t interruptTime;
  61. async event void RadioSendCoordinator.blockTimer()
  62. {
  63. interruptTime = call SysTime.getTime16();
  64. }
  65. // both of these are called, so we just ignore the second
  66. async event void RadioReceiveCoordinator.blockTimer() { }
  67. // the time stamp of the last received message
  68. norace uint32_t receiveTime;
  69. command uint32_t TimeStamping.getStamp()
  70. {
  71. return receiveTime;
  72. }
  73. norace uint8_t bitOffset;
  74. #ifdef TIMESTAMPING_CALIBRATE
  75. command uint8_t getBitOffset()
  76. {
  77. return bitOffset;
  78. }
  79. #endif
  80. async event void RadioReceiveCoordinator.startSymbol(uint8_t bitsPerBlock, uint8_t offset, TOS_MsgPtr msgBuff)
  81. {
  82. bitOffset = offset;
  83. }
  84. norace int16_t avgCorrection;
  85. norace uint16_t referenceTime;
  86. async event void RadioReceiveCoordinator.byte(TOS_MsgPtr msg, uint8_t byteCount) 
  87. {
  88. uint16_t time = interruptTime;
  89. if( byteCount == 0 )
  90. {
  91. receiveTime = call SysTime.castTime16(time);
  92. referenceTime = time;
  93. }
  94. else if( byteCount == 3 )
  95. {
  96. avgCorrection = referenceTime - (uint16_t)receiveTime;
  97. referenceTime = time;
  98. }
  99. else if( byteCount < 6 )
  100. {
  101. referenceTime += BYTE_TIME;
  102. if( (int16_t)(time - referenceTime) < 0 )
  103. referenceTime = time;
  104. if( byteCount == 5 )
  105. {
  106. avgCorrection += referenceTime - (uint16_t)receiveTime;
  107. #ifndef TIMESTAMPING_CALIBRATE
  108. avgCorrection -= BIT_CORRECTION[bitOffset];
  109. #endif
  110. receiveTime += (avgCorrection >> 1);
  111. }
  112. }
  113. }
  114. // the offset of the time-stamp field in the message, 
  115. // or -1 if no stamp is necessariy.
  116. norace int8_t sendStampOffset = -1;
  117. command result_t TimeStamping.addStamp(int8_t offset)
  118. {
  119. // if correct value (negative value turns it off)
  120. if( 1 <= offset && offset <= TOSH_DATA_LENGTH-4 )
  121. {
  122. sendStampOffset = offset;
  123. return SUCCESS;
  124. }
  125. else
  126. {
  127. sendStampOffset = -1;
  128. return FAIL;
  129. }
  130. }
  131. norace uint32_t sendTime;
  132. async event void RadioSendCoordinator.startSymbol(uint8_t bitsPerBlock, uint8_t offset, TOS_MsgPtr msgBuff) { }
  133. async event void RadioSendCoordinator.byte(TOS_MsgPtr msg, uint8_t byteCount)
  134. {
  135. uint16_t time;
  136. if( sendStampOffset < 0 )
  137. return;
  138. time = interruptTime;
  139. if( byteCount == 0 )
  140. {
  141. sendTime = call SysTime.castTime16(time);
  142. referenceTime = time;
  143. }
  144. else if( byteCount == 3 )
  145. {
  146. avgCorrection = referenceTime - (uint16_t)sendTime;
  147. referenceTime = time;
  148. }
  149. else if( byteCount < 6 )
  150. {
  151. referenceTime += BYTE_TIME;
  152. if( (int16_t)(time - referenceTime) < 0 )
  153. referenceTime = time;
  154. if( byteCount == 5 )
  155. {
  156. avgCorrection += referenceTime - (uint16_t)sendTime;
  157. sendTime += (avgCorrection >> 1);
  158. *(uint32_t*)((int8_t*)msg->data + sendStampOffset) += sendTime;
  159. sendStampOffset = -1;
  160. }
  161. }
  162. }
  163. }