tda5250radiop.nc

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

NC
494
字号
/* -*- mode:c++; indent-tabs-mode: nil -*-
 * Copyright (c) 2004-2006, Technische Universitaet Berlin
 * All rights reserved.
 *
 * Redistribution and use in source and binary forms, with or without
 * modification, are permitted provided that the following conditions
 * are met:
 * - Redistributions of source code must retain the above copyright notice,
 *   this list of conditions and the following disclaimer.
 * - Redistributions in binary form must reproduce the above copyright
 *   notice, this list of conditions and the following disclaimer in the
 *   documentation and/or other materials provided with the distribution.
 * - Neither the name of the Technische Universitaet Berlin nor the names
 *   of its contributors may be used to endorse or promote products derived
 *   from this software without specific prior written permission.
 *
 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
 * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
 * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
 * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
 * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
 * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED
 * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA,
 * OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
 * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE
 * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 *
 * - Revision -------------------------------------------------------------
 * $Revision: 1.9 $
 * $Date: 2008/06/18 01:25:54 $
 * @author: Kevin Klues (klues@tkn.tu-berlin.de)
 * ========================================================================
 */

#include "tda5250Const.h"


/*
 * Controlling the Tda5250
 *
 * Switch modes and initialize.
 *
 * @author Kevin Klues
 * @author Philipp Huppertz
 * @author Andreas Koepke
 */
#include "Timer.h"

module Tda5250RadioP {
    provides {
        interface Init;
        interface SplitControl;
        interface Tda5250Control;
        interface RadioByteComm;
        interface ResourceRequested;
        interface ClkDiv;
#ifdef LNDW
        interface RfPower;
#endif
    }
    uses {
        interface HplTda5250Config;
        interface HplTda5250Data;
        interface HplTda5250DataControl;
        interface Resource as ConfigResource;
        interface Resource as DataResource;
        interface ResourceRequested as DataResourceRequested;
        interface Alarm<T32khz, uint16_t> as DelayTimer;
    }
}

implementation {
  
    typedef enum {
        TRANSMITTER_DELAY,
        RECEIVER_DELAY,
        RSSISTABLE_DELAY
    } delayTimer_t;
  
    delayTimer_t delayTimer;  // current Mode of the Timer (RssiStable, TxSetupTime, RxSetupTime)
    radioMode_t radioMode;    // Current Mode of the Radio
    float onTime, offTime;

#ifdef LNDW
    norace bool rfpowerdirty = FALSE;
    norace uint8_t rfpower = INITIAL_RF_POWER;
    task void setRfPower() {
        uint8_t rp, rd;
        atomic {
            rp = rfpower;
            rd = rfpowerdirty;
        }
        if(rd) {
            if(call ConfigResource.immediateRequest() == SUCCESS)  {
                call HplTda5250Config.SetRFPower(rp);                
                atomic rfpowerdirty = FALSE;
            }
            else {
                post setRfPower();
            }
        }
    }
#endif
    
    /**************** Radio Init *****************/
    command error_t Init.init() {
        radioMode = RADIO_MODE_OFF;
        return SUCCESS;
    }

    /**************** Radio Start  *****************/
    task void startDoneTask() {
        signal ClkDiv.startDone();
        signal SplitControl.startDone(SUCCESS);
    }
      
    command error_t SplitControl.start() {
        radioMode_t mode;
        atomic mode = radioMode;
        if(mode == RADIO_MODE_OFF) {
            atomic radioMode = RADIO_MODE_ON_TRANSITION;
            return call ConfigResource.request();
        }
        return FAIL;
    }

    /**************** Radio Stop  *****************/
    task void stopDoneTask() {
        signal SplitControl.stopDone(SUCCESS); 
    }
      
    command error_t SplitControl.stop(){
        atomic radioMode = RADIO_MODE_OFF_TRANSITION;
        return call ConfigResource.request();
    }

    /* radioBusy
     * This function checks whether the radio is busy
     * so as to decide whether it can perform some operation or not.
     */
    bool radioBusy() {
        switch(radioMode) {
            case RADIO_MODE_OFF:
            case RADIO_MODE_ON_TRANSITION:
            case RADIO_MODE_OFF_TRANSITION:
            case RADIO_MODE_TX_TRANSITION:
            case RADIO_MODE_RX_TRANSITION:
            case RADIO_MODE_TIMER_TRANSITION:
            case RADIO_MODE_SELF_POLLING_TRANSITION:
            case RADIO_MODE_SLEEP_TRANSITION:
                return TRUE;
            default:
                return FALSE;
        }
    }

    void switchConfigResource() {
        radioMode_t mode;
        atomic mode = radioMode;
        switch(mode) {
            case RADIO_MODE_ON_TRANSITION:
                call HplTda5250Config.reset();
                call HplTda5250Config.SetRFPower(INITIAL_RF_POWER);
                // call HplTda5250Config.SetClockOnDuringPowerDown();
                call ConfigResource.release();
                atomic radioMode = RADIO_MODE_ON;
                post startDoneTask();
                break;
            case RADIO_MODE_OFF_TRANSITION:
                signal ClkDiv.stopping();
                call HplTda5250Config.SetSleepMode();
                call ConfigResource.release();
                atomic radioMode = RADIO_MODE_OFF;
                post stopDoneTask();
                break;
            case RADIO_MODE_SLEEP_TRANSITION:
                signal ClkDiv.stopping();
                call HplTda5250Config.SetSlaveMode();
                call HplTda5250Config.SetSleepMode();
                atomic radioMode = RADIO_MODE_SLEEP;
                signal Tda5250Control.SleepModeDone();
#ifdef LNDW
                if(rfpowerdirty) post setRfPower();
#endif
                break;
            case RADIO_MODE_TX_TRANSITION:
                call HplTda5250Config.SetSlaveMode();
                call HplTda5250Config.SetTxMode();
                if (!(call HplTda5250Config.IsTxRxPinControlled()))
                    call ConfigResource.release();
                atomic delayTimer = TRANSMITTER_DELAY;
                call DelayTimer.start(TDA5250_TRANSMITTER_SETUP_TIME);
                break;
            case RADIO_MODE_RX_TRANSITION:
                call HplTda5250Config.SetSlaveMode();
                call HplTda5250Config.SetRxMode();
                if (!(call HplTda5250Config.IsTxRxPinControlled()))
                    call ConfigResource.release();
                atomic delayTimer = RECEIVER_DELAY;
                call DelayTimer.start(TDA5250_RECEIVER_SETUP_TIME);
                break;
            case RADIO_MODE_TIMER_TRANSITION:
                call HplTda5250Config.SetTimerMode(onTime, offTime);
                call ConfigResource.release();
                atomic radioMode = RADIO_MODE_TIMER;
                signal Tda5250Control.TimerModeDone();
                break;
            case RADIO_MODE_SELF_POLLING_TRANSITION:
                call HplTda5250Config.SetSelfPollingMode(onTime, offTime);
                call ConfigResource.release();
                atomic radioMode = RADIO_MODE_SELF_POLLING;
                signal Tda5250Control.SelfPollingModeDone();
                break;
            default:
                break;
        }
    }

    event void ConfigResource.granted() {
        switchConfigResource();
    }

    void switchDataResource() {
        radioMode_t mode;
        atomic mode = radioMode;
        switch(mode) {
          case RADIO_MODE_TX_TRANSITION:
            atomic radioMode = RADIO_MODE_TX;
            signal Tda5250Control.TxModeDone();
            break;
          case RADIO_MODE_RX_TRANSITION:
            atomic radioMode = RADIO_MODE_RX;
            signal Tda5250Control.RxModeDone();
            break;
          default:
            break;
        }
    }
      
    event void DataResource.granted() {
        switchDataResource();
    }
      
    // information for higher layers that the DataResource has been requested
    async event void DataResourceRequested.requested() {
        signal ResourceRequested.requested();

⌨️ 快捷键说明

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