redmacp.nc

来自「tinyos-2.x.rar」· NC 代码 · 共 1,354 行 · 第 1/3 页

NC
1,354
字号
                            action = CCA_ACK;
                            if(level == 2) {
                                getMetadata(msg)->ack = WAS_ACKED;
                            }
                        }
                        else {
                            // sdDebug(198);
                            if(action != RX) {
                                nav = ((red_mac_header_t*)payload)->repetitionCounter *
                                    (SUB_HEADER_TIME + getHeader(msg)->length*BYTE_TIME +
                                     SUB_FOOTER_TIME + RX_ACK_TIMEOUT + TX_SETUP_TIME) + ACK_DURATION;
                                action = SLEEP;
                            }
                        }
                    }
                    else {
                        // sdDebug(199);
                        action = RX;
                    }
                }
                else {
                    // sdDebug(200);
                    action = SLEEP;
                    if(!isCnt) {
                        nav = ((red_mac_header_t*)payload)->repetitionCounter *
                            (SUB_HEADER_TIME + getHeader(msg)->length*BYTE_TIME +
                             SUB_FOOTER_TIME + RX_ACK_TIMEOUT + TX_SETUP_TIME) +
                            ACK_DURATION;
                    }
                }
            }
            else {
                // sdDebug(201);
                action = SLEEP;
            }
        }
        else if(macState == RX_ACK_P) {
            if(error == SUCCESS) {
                if(ackIsForMe(msg)) {
                    // sdDebug(202);
                    getMetadata(txBufPtr)->ack = WAS_ACKED;
                    getMetadata(txBufPtr)->repetitions = txMacHdr->repetitionCounter;
                    if(isFlagSet(&flags, TEAMGEIST_ACTIVE) &&
                       (getHeader(txBufPtr)->type == teamgeistType))
                    {
                        signal Teamgeist.gotAck(txBufPtr, getHeader(msg)->src,
                                                getMetadata(txBufPtr)->strength);
                    }
                    // sdDebug(203);
                    signalSendDone(SUCCESS);
                    // sdDebug(30000 + getHeader(msg)->src);
                    action = SLEEP;
                }
                else {
                    // sdDebug(203);
                    updateLongRetryCounters(); // this will eventually schedule the right backoff
                    macState = SLEEP;          // so much traffic is going on -- take a nap
                    setSleepMode();
                    action = INIT;             // a difficult way to say: do nothing
                }
            }
            else {
                if(call Timer.isRunning()) {
                    // sdDebug(204);
                    action = RX_ACK;
                }
                else {
                    // sdDebug(205);
                    updateLongRetryCounters();
                    action = RX;
                }
            }
        }
        else {
            // sdDebug(206);
            action = INIT;
        }
        if(action == CCA_ACK) {
            macState = CCA_ACK;
            if(call Random.rand16() & 2) {
                call Timer.start(RX_SETUP_TIME - TX_SETUP_TIME + 16 - level*8 + ADDED_DELAY);
            }
            else {
                macState = TX_ACK;
                call Timer.start(RX_SETUP_TIME - TX_SETUP_TIME + 16);
            }
            prepareAck(msg);
        }
        else if(action == RX_ACK) {
            macState = RX_ACK;
        }
        else if(action == RX) {
            macState = RX;
            checkCounter = 0;
            call Timer.start(DATA_DETECT_TIME);
        }
        else if(action == SLEEP) {
            macState = SLEEP;
            if(isFlagSet(&flags, RESUME_BACKOFF)) {
                nav = nav*(uint32_t)ADD_NAV/(uint32_t)NAV_FACTOR;
                if(nav > restLaufzeit) restLaufzeit += nav;
            }
            else {
                setFlag(&flags, RESUME_BACKOFF);
                restLaufzeit = call Random.rand16() & ZERO_BACKOFF_MASK;
            }
            setSleepMode();
        }
        else if(action == INIT) {
            clearFlag(&flags, UNHANDLED_PACKET);
        }
        else {
            // sdDebug(207);
        }
#ifdef REDMAC_PERFORMANCE
        if(error == SUCCESS) {
            rxStat.type = getHeader(msg)->type;
            rxStat.from = getHeader(msg)->src;
            rxStat.to = getHeader(msg)->dest;
            rxStat.token = getHeader(msg)->token;
            if(!isControl(msg)) rxStat.repCounter  = ((red_mac_header_t*)payload)->repetitionCounter;
            rxStat.payloadLength = len;
            rxStat.strength = rssiValue;
            rxStat.creationTime = getMetadata(msg)->time;
            call Performance.macRxStats(&rxStat);
        }
#endif
        return m;
    }

    async event void PacketSend.sendDone(message_t* msg, error_t error) {
        if(macState == TX) {
            macState = RX_ACK;
            setRxMode();
            call Timer.start(RX_ACK_TIMEOUT);
            // sdDebug(220);
            checkCounter = 0;
        }
        else if(macState == TX_ACK) {
            checkCounter = 0;
            macState = SLEEP;
            setSleepMode();
            // macState = RX;
            // setRxMode();
            // sdDebug(221);
#ifdef REDMAC_DEBUG            
            // sdDebug(40000U + repCounter);
#endif
        }
    }
    
    /***** TimeStamping stuff **************************/
    async event void RadioTimeStamping.receivedSFD( uint16_t time ) {
        if(call RssiAdcResource.isOwner()) call ChannelMonitorData.getSnr();
        if(macState == RX_P) {
            rxTime = call LocalTime32kHz.get();
            call ChannelMonitor.rxSuccess();
        }
    }
    
    async event void RadioTimeStamping.transmittedSFD( uint16_t time, message_t* p_msg ) {
        if((macState == TX) && (p_msg == txBufPtr)) {
#ifdef DELTATIMEDEBUG
            dTrace.now = call LocalTime32kHz.get();
            dTrace.msgTime = getMetadata(p_msg)->time;
            dTrace.delta = call TimeDiff32.computeDelta(dTrace.now, dTrace.msgTime);
            txMacHdr->time = dTrace.delta;
            call DeltaTrace.traceTx(&dTrace);
            getMetadata(p_msg)->sfdtime = dTrace.now;
#else
            getMetadata(p_msg)->sfdtime = call LocalTime32kHz.get();
            txMacHdr->time =
                call TimeDiff32.computeDelta(getMetadata(p_msg)->sfdtime,
                                             getMetadata(p_msg)->time);
#endif
        }
    }
    
    /****** Timer ******************************/

    void checkOnBusy() {
        setFlag(&flags, ACTION_DETECTED);
        if((macState == RX) || (macState == CCA) || (macState == CCA_ACK)) {
            if(macState == CCA) {
                computeBackoff();
#ifdef REDMAC_PERFORMANCE
                call Performance.macBusyOnCca();
#endif
            }
            requestAdc();
            // sdDebug(230);
            macState = RX;
            checkCounter = 0;
            call Timer.start(TX_GAP_TIME>>1);
        }
    }

    void checkOnIdle()  {
        if(macState == RX) {
            checkCounter++;
            if(checkCounter >= 3) {
                // sdDebug(240);
                macState = SLEEP;
                setSleepMode();
            }
            else {
                // sdDebug(241);
                call Timer.start(TX_GAP_TIME >> 1);
                requestAdc();
            }
        }
        else if(macState == CCA) {
            checkCounter++;
            if(checkCounter < 3) {
                // sdDebug(242);                
                call Timer.start(TX_GAP_TIME >> 1);
                requestAdc();
            }
            else {
                // sdDebug(243);
                macState = TX;
                setTxMode();
#ifdef REDMAC_PERFORMANCE
                call Performance.macIdleOnCca();
                txStat.txModeTime = call LocalTime32kHz.get();
#endif
            }
        }
        else if(macState == CCA_ACK) {
            // sdDebug(244);
            macState = TX_ACK;
            setTxMode();
            // sdDebug(20000 + getHeader(&ackMsg)->dest);
#ifdef REDMAC_PERFORMANCE
            call Performance.macTxAckStats(getHeader(&ackMsg)->type,
                                          getHeader(&ackMsg)->dest,
                                          getHeader(&ackMsg)->token);
#endif
        }
    }
    
    async event void Timer.fired() {
        // sdDebug(250);
        if((macState == RX) || (macState == CCA) || (macState == CCA_ACK)) {
            if((!call RssiAdcResource.isOwner()) || (call ChannelMonitor.start() != SUCCESS)) {
                if(call UartPhyControl.isBusy()) {
                    // sdDebug(251);
                    checkOnBusy();
                }
                else {
                    // sdDebug(252);
                    checkOnIdle();
                }
            }
        }
        else if(macState == RX_ACK) {
            if(prepareRepetition()) {
                // sdDebug(253);
                macState = TX;
                setTxMode();
            }
            else {
                if(needsAckTx(txBufPtr)) {
                    // sdDebug(254);
#ifdef REDMAC_PERFORMANCE
                    call Performance.macAckTimeout();
#endif
                    updateLongRetryCounters();
                }
                else {
                    // sdDebug(255);
                    signalSendDone(SUCCESS);
                }
                macState = SLEEP;
                setSleepMode();
            }
        }
        else if(macState == TX_ACK) {
            setTxMode();
            // sdDebug(10000 + getHeader(&ackMsg)->dest);
        }
        else if(macState == SLEEP) {
             if(isFlagSet(&flags, SWITCHING)) {
                 // sdDebug(256);
                 call Timer.start(call Random.rand16() & 0x0f);
             }
             else {
                 if(isFlagSet(&flags, RESUME_BACKOFF)) {
                     // sdDebug(261);
                     clearFlag(&flags, RESUME_BACKOFF);
                     call Timer.start(restLaufzeit);
                     restLaufzeit = 0;
                 }
                 else {
                     // sdDebug(262);
                     checkSend();
                 }
             }
        }
        else if((macState == RX_ACK_P) || (macState == RX_P)) {
            // sdDebug(258);
        }
        else if(macState == INIT) {
            // sdDebug(259);
            post StartDoneTask();
        }
        else {
            // sdDebug(260);
        }
    }
    
    /****** SampleTimer ******************************/
    async event void SampleTimer.fired() {
        call SampleTimer.start(localSleeptime);
        // sdDebug(270);
        if((macState == SLEEP) && (!isFlagSet(&flags, SWITCHING))) {
            clearFlag(&flags, ACTION_DETECTED);
            interruptBackoffTimer();
            macState = RX;
            // sdDebug(271);
            setRxMode();
            call Timer.stop();
        }
    }

    /***** Sleeptime **********************************/
    async command void Sleeptime.setLocalSleeptime(uint16_t sT) {
        atomic localSleeptime = sT;
    }

    async command uint16_t Sleeptime.getLocalSleeptime() {
        uint16_t st;
        atomic st = localSleeptime;
        return st;        
    }

    async command void Sleeptime.setNetworkSleeptime(uint16_t sT) {
        atomic {
            networkSleeptime = sT;
            for(MIN_BACKOFF_MASK = 1; MIN_BACKOFF_MASK < sT; ) {
                MIN_BACKOFF_MASK = (MIN_BACKOFF_MASK << 1) + 1;
            }
            MIN_BACKOFF_MASK >>= 3;
        }
    }
    
    async command uint16_t Sleeptime.getNetworkSleeptime() {
        uint16_t st;
        atomic st = networkSleeptime;
        return st;
    }

    /****** ChannelMonitor events *********************/

    async event void ChannelMonitor.channelBusy() {
        // sdDebug(280);
        checkOnBusy();
    }

    async event void ChannelMonitor.channelIdle() {
        // sdDebug(281);
        checkOnIdle();
    }

    /****** ChannelMonitorControl events **************/
    
    event void ChannelMonitorControl.updateNoiseFloorDone() {
        if(macState == INIT) {
            // sdDebug(290);
            call Timer.start(call Random.rand16() % localSleeptime);
            setSleepMode();
        } else {
            // sdDebug(291);
        }
    }

    /***** ChannelMonitorData events ******************/
    
    async event void ChannelMonitorData.getSnrDone(int16_t data) {
        atomic if((macState == RX_P) || (macState == RX_ACK_P)) rssiValue = data;
    }
    
    /***** Rssi Resource events ******************/
    event void RssiAdcResource.granted() {
        macState_t ms;
        atomic ms = macState;
        if(ms < SLEEP) {
            // sdDebug(300);
        }
        else if(ms == INIT) {
            // sdDebug(301);
            call ChannelMonitorControl.updateNoiseFloor();            
        }
        else {
            // sdDebug(302);
            post ReleaseAdcTask();
        }
    }
    
    /***** default Teamgeist events **************************/

    default event am_id_t Teamgeist.observedAMType() {
        clearFlag(&flags, TEAMGEIST_ACTIVE);
        return teamgeistType;
    }

    default async event bool Teamgeist.needsAck(message_t *msg, am_addr_t src, am_addr_t dest, uint16_t snr) {
        clearFlag(&flags, TEAMGEIST_ACTIVE);
        return TRUE;
    }

    default async event uint8_t Teamgeist.estimateForwarders(message_t *msg) {
        return 1;
    }

    default async event am_addr_t Teamgeist.getDestination(message_t *msg, uint8_t retryCounter) {
        return getHeader(msg)->dest;
    }
    
    default async event void Teamgeist.gotAck(message_t *msg, am_addr_t ackSender, uint16_t snr) {
    }
    
    default async event void ChannelCongestion.congestionEvent(uint8_t level) {}

    /***** Mac Eval *******************************************/
#ifdef MAC_EVAL
    async command void MacEval.setBackoffMask(uint16_t mask) {
        atomic MIN_BACKOFF_MASK = mask;
    }
    async command void MacEval.increaseBackoff(bool value) {
        atomic INCREASE_BACKOFF = value;
    }
    async command void MacEval.addNav(uint8_t value) {
        atomic ADD_NAV = value;
    }
    async command void MacEval.setLongRetry(uint8_t lr) {
        atomic MAX_LONG_RETRY = lr;
    }
    async command void MacEval.setShortRetry(uint8_t sr) {
        atomic MAX_SHORT_RETRY = sr;
    }    
#endif
    
    /***** unused Radio Modes events **************************/
    async event void RadioModes.TimerModeDone() {}
    async event void RadioModes.SelfPollingModeDone() {}
    async event void RadioModes.PWDDDInterrupt() {}
}

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?