X-Git-Url: https://oss.titaniummirror.com/gitweb/?a=blobdiff_plain;f=tos%2Fchips%2Ftda5250%2FTda5250RadioP.nc;h=de20682ead73a4f6645e40126518a48737f1f1e4;hb=a17321a72cfe58782f13e2b27afff01fae9b9e39;hp=20d39dcf9e563cbb0650354613aac7349a2b89f3;hpb=337d0b13acf569c2640b3ed7b7f5c7cec35d7ddd;p=tinyos-2.x.git diff --git a/tos/chips/tda5250/Tda5250RadioP.nc b/tos/chips/tda5250/Tda5250RadioP.nc index 20d39dcf..de20682e 100644 --- a/tos/chips/tda5250/Tda5250RadioP.nc +++ b/tos/chips/tda5250/Tda5250RadioP.nc @@ -54,6 +54,10 @@ module Tda5250RadioP { interface Tda5250Control; interface RadioByteComm; interface ResourceRequested; + interface ClkDiv; +#ifdef LNDW + interface RfPower; +#endif } uses { interface HplTda5250Config; @@ -78,6 +82,27 @@ implementation { 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; @@ -86,6 +111,7 @@ implementation { /**************** Radio Start *****************/ task void startDoneTask() { + signal ClkDiv.startDone(); signal SplitControl.startDone(SUCCESS); } @@ -135,22 +161,28 @@ implementation { switch(mode) { case RADIO_MODE_ON_TRANSITION: call HplTda5250Config.reset(); - call HplTda5250Config.SetRFPower(255); + 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(); @@ -405,6 +437,7 @@ implementation { signal Tda5250Control.RssiStable(); break; case RECEIVER_DELAY : + signal ClkDiv.startDone(); delayTimer = RSSISTABLE_DELAY; call DelayTimer.start(TDA5250_RSSI_STABLE_TIME-TDA5250_RECEIVER_SETUP_TIME); if (call DataResource.immediateRequest() == SUCCESS) { @@ -414,6 +447,7 @@ implementation { } break; case TRANSMITTER_DELAY : + signal ClkDiv.startDone(); if (call DataResource.immediateRequest() == SUCCESS) { switchDataResource(); } else { @@ -443,4 +477,17 @@ implementation { } default async event void RadioByteComm.txByteReady(error_t error) { } + default async event void ClkDiv.startDone() { + } + default async event void ClkDiv.stopping() { + } +#ifdef LNDW + async command error_t RfPower.set(uint8_t setting) { + atomic { + rfpower = setting; + rfpowerdirty = TRUE; + } + return SUCCESS; + } +#endif }