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

📄 speckmacdp.nc

📁 tinyos2.0版本驱动
💻 NC
📖 第 1 页 / 共 3 页
字号:
        rxStat.repCounter = 0xff;#endif        if(macState == RX_P) {            if(error == SUCCESS) {                isCnt = isControl(msg);                if(msgIsForMe(msg)) {                    if(!isCnt) {                        if(isNewMsg(msg)) {#ifdef SPECKMAC_PERFORMANCE                            rxStat.duplicate = PERF_NEW_MSG;#endif                            storeStrength(msg);                            getMetadata(msg)->time = calcGeneratedTime((red_mac_header_t*) payload);                            getMetadata(msg)->ack = WAS_NOT_ACKED;                            m = signal MacReceive.receiveDone(msg);                            // assume a buffer swap -- if buffer is not swapped, assume that the                            // message was not successfully delivered to upper layers                            if(m != msg) {                                rememberMsg(msg);                            } else {                                action = RX;#ifdef SPECKMAC_PERFORMANCE                                call Performance.macQueueFull();#endif                            }                        }#ifdef SPECKMAC_PERFORMANCE                        else {                            rxStat.duplicate = PERF_REPEATED_MSG;                        }#endif                                          if(needsAckRx(msg) && (action != RX)) {                            if(((red_mac_header_t*)payload)->repetitionCounter == 0) {                                action = CCA_ACK;                            }                            else {                                action = RX;                            }                        }                        else {                            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 {                        action = RX;                    }                }                else {                    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 {                action = SLEEP;            }        }        else if(macState == RX_ACK_P) {            if(error == SUCCESS) {                if(ackIsForMe(msg)) {                    storeStrength(msg);                    getMetadata(txBufPtr)->ack = WAS_ACKED;                    getMetadata(txBufPtr)->repetitions = txMacHdr->repetitionCounter;                    signalSendDone(SUCCESS);                    action = SLEEP;                }                else {                    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()) {                    action = RX_ACK;                }                else {                    updateLongRetryCounters();                    action = RX;                }            }        }        else {            action = INIT;        }        if(action == CCA_ACK) {            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)) {                if(nav > restLaufzeit) {                    if(nav > restLaufzeit) restLaufzeit += ((uint32_t)ADD_NAV*nav/NAV_FACTOR);                }            }            else {                setFlag(&flags, RESUME_BACKOFF);                restLaufzeit = call Random.rand16() & ZERO_BACKOFF_MASK;            }            setSleepMode();        }        else if(action == INIT) {            clearFlag(&flags, UNHANDLED_PACKET);        }        else {        }#ifdef SPECKMAC_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) {            if(prepareRepetition()) {                call PacketSend.send(txBufPtr, txLen);            }            else {                macState = RX_ACK;                setRxMode();                call Timer.start(RX_ACK_TIMEOUT);                checkCounter = 0;            }        }        else if(macState == TX_ACK) {            checkCounter = 0;            macState = RX;            setRxMode();#ifdef SPECKMAC_DEBUG#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)) {            txMacHdr->time =                call TimeDiff32.computeDelta(call LocalTime32kHz.get(), getMetadata(p_msg)->time);        }    }        /****** Timer ******************************/    void checkOnBusy() {        setFlag(&flags, ACTION_DETECTED);        if((macState == RX) || (macState == CCA) || (macState == CCA_ACK)) {            if(macState == CCA) {                computeBackoff();#ifdef SPECKMAC_PERFORMANCE                call Performance.macBusyOnCca();#endif            }            requestAdc();            macState = RX;            checkCounter = 0;            call Timer.start(TX_GAP_TIME>>1);        }    }    void checkOnIdle()  {        if(macState == RX) {            checkCounter++;            if(checkCounter < 2) {                call Timer.start(DATA_DETECT_TIME);                requestAdc();            } else {                macState = SLEEP;                setSleepMode();            }        }        else if(macState == CCA) {            checkCounter++;            if(checkCounter < 3) {                call Timer.start(TX_GAP_TIME >> 1);                requestAdc();            }            else {                macState = TX;                setTxMode();#ifdef SPECKMAC_PERFORMANCE                call Performance.macIdleOnCca();                txStat.txModeTime = call LocalTime32kHz.get();#endif            }        }    }        async event void Timer.fired() {        if((macState == RX) || (macState == CCA) || (macState == CCA_ACK)) {            if((!call RssiAdcResource.isOwner()) || (call ChannelMonitor.start() != SUCCESS)) {                if(call UartPhyControl.isBusy()) {                    checkOnBusy();                }                else {                    checkOnIdle();                }            }        }        else if(macState == RX_ACK) {            if(needsAckTx(txBufPtr)) {#ifdef SPECKMAC_PERFORMANCE                call Performance.macAckTimeout();#endif                updateLongRetryCounters();            }            else {                signalSendDone(SUCCESS);            }            macState = SLEEP;            setSleepMode();        }        else if(macState == TX_ACK) {            setTxMode();        }        else if(macState == SLEEP) {             if(isFlagSet(&flags, SWITCHING)) {                 call Timer.start(call Random.rand16() & 0x0f);             }             else {                 if(isFlagSet(&flags, RESUME_BACKOFF)) {                     clearFlag(&flags, RESUME_BACKOFF);                     call Timer.start(restLaufzeit);                     restLaufzeit = 0;                 }                 else {                     checkSend();                 }             }        }        else if((macState == RX_ACK_P) || (macState == RX_P)) {        }        else if(macState == INIT) {            post StartDoneTask();            sdDebug(50);        }        else {        }    }    /****** SampleTimer ******************************/    async event void SampleTimer.fired() {        call SampleTimer.start(localSleeptime);        if((macState == SLEEP) && (!isFlagSet(&flags, SWITCHING))) {            clearFlag(&flags, ACTION_DETECTED);            interruptBackoffTimer();            macState = RX;            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() {        checkOnBusy();    }    async event void ChannelMonitor.channelIdle() {        checkOnIdle();    }    /****** ChannelMonitorControl events **************/        event void ChannelMonitorControl.updateNoiseFloorDone() {        if(macState == INIT) {            call Timer.start(call Random.rand16() % localSleeptime);            setSleepMode();            sdDebug(40);        } else {        }    }    /***** 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) {        }        else if(ms == INIT) {            sdDebug(30);            call ChannelMonitorControl.updateNoiseFloor();                    }        else {            post ReleaseAdcTask();        }    }        /***** 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(bool 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 events **************************/    default async event void ChannelCongestion.congestionEvent(uint8_t level) {}    /***** 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 + -