interface DataRequest;
interface FrameRx as CoordRealignmentRx;
interface Resource as Token;
+ interface ResourceTransferred as TokenTransferred;
interface ResourceTransfer as TokenToCap;
interface TimeCalc;
interface IEEE154Frame as Frame;
};
norace bool m_tracking = FALSE;
- bool m_updatePending = FALSE;
+ norace bool m_updatePending = FALSE;
uint8_t m_updateLogicalChannel;
bool m_updateTrackBeacon;
bool m_stopTracking = FALSE;
bool m_internalRequest = FALSE;
- uint8_t m_numBeaconsLost;
+ norace uint8_t m_numBeaconsLost;
uint8_t m_coordAddress[8];
message_t m_beaconBuffer;
norace message_t *m_beaconBufferPtr = &m_beaconBuffer;
norace uint16_t m_BLELen;
norace bool m_broadcastPending;
uint8_t m_gtsField[1+1+3*7];
+
task void processBeaconTask();
+ void getNextBeacon();
+ task void signalGrantedTask();
command error_t Reset.init()
{
m_stopTracking = FALSE;
m_updateLogicalChannel = logicalChannel;
m_updateTrackBeacon = trackBeacon;
- m_updatePending = TRUE;
m_internalRequest = FALSE;
+ m_updatePending = TRUE;
call Debug.log(LEVEL_INFO,SyncP_RESOURCE_REQUEST, 0, 0, 0);
call Token.request();
}
event void Token.granted()
{
- bool missed = FALSE;
call Debug.flush();
call Debug.log(LEVEL_INFO,SyncP_GOT_RESOURCE, m_lastBeaconRxTime+m_beaconInterval,
m_beaconInterval, (m_updatePending<<1)+m_tracking);
m_numBeaconsLost = IEEE154_aMaxLostBeacons; // will be reset when beacon is received
call Debug.log(LEVEL_INFO,SyncP_UPDATING, call MLME_GET.macCoordShortAddress(),
call MLME_GET.macPANId(), m_updateLogicalChannel);
- } else {
+ }
+ getNextBeacon();
+ }
+
+ void getNextBeacon()
+ {
+ bool missed = FALSE;
+ if (m_state != S_FIRST_SCAN){
+ // we have received at least one previous beacon
m_state = S_PREPARE;
if (!m_tracking){
call Debug.log(LEVEL_INFO,SyncP_RELEASE_RESOURCE, 0, 0, 0);
return;
}
while (call TimeCalc.hasExpired(m_lastBeaconRxTime, m_dt)){ // missed a beacon
+ missed = TRUE;
call Debug.log(LEVEL_INFO,SyncP_BEACON_MISSED_1, m_lastBeaconRxTime, m_dt, missed);
m_dt += m_beaconInterval;
m_numBeaconsLost++;
- missed = TRUE;
}
if (m_numBeaconsLost >= IEEE154_aMaxLostBeacons){
post processBeaconTask();
signal RadioOff.offDone();
}
+ async event void TokenTransferred.transferred()
+ {
+ if (m_updatePending)
+ post signalGrantedTask();
+ else
+ getNextBeacon();
+ }
+
+ task void signalGrantedTask()
+ {
+ signal Token.granted();
+ }
+
async event void TrackAlarm.fired()
{
call Debug.log(LEVEL_IMPORTANT,SyncP_TRACK_ALARM, m_state,m_lastBeaconRxTime,m_dt);