⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 redmacp.nc

📁 tinyos2.0版本驱动
💻 NC
📖 第 1 页 / 共 3 页
字号:
                        if(needsAckRx(msg, &level) && (action != RX)) {                            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();            sdDebug(221);        }    }        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);#else            txMacHdr->time =                call TimeDiff32.computeDelta(call LocalTime32kHz.get(), 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 + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -