]> oss.titaniummirror.com Git - tinyos-2.x.git/blobdiff - tos/chips/tda5250/Tda5250RadioP.nc
Merge over into the trunk.
[tinyos-2.x.git] / tos / chips / tda5250 / Tda5250RadioP.nc
index 309936732a656b4f8399dcaf7402243055a49e95..0ae7224c88a589ecb8d1c06c848fb25db127861a 100644 (file)
@@ -50,12 +50,16 @@ module Tda5250RadioP {
     interface SplitControl;
     interface Tda5250Control;
     interface RadioByteComm;
+    interface ResourceRequested;
   }
   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;
   }
 }
@@ -144,19 +148,24 @@ implementation {
           case RADIO_MODE_SLEEP_TRANSITION:
             call HplTda5250Config.SetSlaveMode();
             call HplTda5250Config.SetSleepMode();
-            call ConfigResource.release();
+            if (!(call HplTda5250Config.IsTxRxPinControlled()))
+              call ConfigResource.release();
             atomic radioMode = RADIO_MODE_SLEEP;
             signal Tda5250Control.SleepModeDone();
             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;
@@ -186,12 +195,12 @@ implementation {
         atomic mode = radioMode;
         switch(mode) {
           case RADIO_MODE_TX_TRANSITION:
-            call HplTda5250Data.enableTx();
+            call HplTda5250DataControl.setToTx();
             atomic radioMode = RADIO_MODE_TX;
             signal Tda5250Control.TxModeDone();
             break;
           case RADIO_MODE_RX_TRANSITION:
-            call HplTda5250Data.enableRx();
+            call HplTda5250DataControl.setToRx();
             atomic radioMode = RADIO_MODE_RX;
             signal Tda5250Control.RxModeDone();
             break;
@@ -203,36 +212,49 @@ implementation {
       event void DataResource.granted() {
         switchDataResource();
       }
+      
+      // information for higher layers that the DataResource has been requested
+      async event void DataResourceRequested.requested() {
+        signal ResourceRequested.requested();
+      }
+
+      async event void DataResourceRequested.immediateRequested() {
+        signal ResourceRequested.immediateRequested();
+      }
 
   /**
       Set the mode of the radio
       The choices are TIMER_MODE, SELF_POLLING_MODE
   */
       async command error_t Tda5250Control.TimerMode(float on_time, float off_time) {
+        radioMode_t mode;
         atomic {
           if(radioBusy() == FALSE) {
             radioMode = RADIO_MODE_TIMER_TRANSITION;
             onTime = on_time;
             offTime = off_time;
           }
+          mode = radioMode;
         }
         if(radioMode == RADIO_MODE_TIMER_TRANSITION) {
           call DataResource.release();
-          if (call ConfigResource.immediateRequest() == SUCCESS) {
-            switchConfigResource();
-          } else {
+         if (call ConfigResource.immediateRequest() == SUCCESS) {
+           switchConfigResource();
+         } else {
             call ConfigResource.request();
-          }
+         }
           return SUCCESS;
         }
         return FAIL;
       }
 
       async command error_t Tda5250Control.ResetTimerMode() {
+        radioMode_t mode;
         atomic {
           if(radioBusy() == FALSE) {
             radioMode = RADIO_MODE_TIMER_TRANSITION;
           }
+          mode = radioMode;
         }
         if(radioMode == RADIO_MODE_TIMER_TRANSITION) {
           call DataResource.release();
@@ -247,12 +269,14 @@ implementation {
       }
 
       async command error_t Tda5250Control.SelfPollingMode(float on_time, float off_time) {
+        radioMode_t mode;
         atomic {
           if(radioBusy() == FALSE) {
             radioMode = RADIO_MODE_SELF_POLLING_TRANSITION;
             onTime = on_time;
             offTime = off_time;
           }
+          mode = radioMode;
         }
         if(radioMode == RADIO_MODE_SELF_POLLING_TRANSITION) {
           call DataResource.release();
@@ -267,10 +291,12 @@ implementation {
       }
 
       async command error_t Tda5250Control.ResetSelfPollingMode() {
+        radioMode_t mode;
         atomic {
           if(radioBusy() == FALSE) {
             radioMode = RADIO_MODE_SELF_POLLING_TRANSITION;
           }
+          mode = radioMode;
         }
         if(radioMode == RADIO_MODE_SELF_POLLING_TRANSITION) {
           call DataResource.release();
@@ -287,19 +313,21 @@ implementation {
       async command error_t Tda5250Control.SleepMode() {
         radioMode_t mode;
         atomic{
-          mode = radioMode;
           if(radioBusy() == FALSE) {
-            mode = radioMode = RADIO_MODE_SLEEP_TRANSITION;
+            radioMode = RADIO_MODE_SLEEP_TRANSITION;
           }
+          mode = radioMode;
         }
         if(mode == RADIO_MODE_SLEEP_TRANSITION) {
-          call HplTda5250Data.disableTx();     
-          call HplTda5250Data.disableRx();     
           call DataResource.release();
-          if (call ConfigResource.immediateRequest() == SUCCESS) {
+          if (call HplTda5250Config.IsTxRxPinControlled()) {
             switchConfigResource();
           } else {
-            call ConfigResource.request();
+            if (call ConfigResource.immediateRequest() == SUCCESS) {
+              switchConfigResource();
+            } else {
+              call ConfigResource.request();
+            }
           }
           return SUCCESS;
         }
@@ -309,16 +337,21 @@ implementation {
       async command error_t Tda5250Control.TxMode() {
         radioMode_t mode;
         atomic {
-          if(radioBusy() == FALSE)
+          if(radioBusy() == FALSE) {
             radioMode = RADIO_MODE_TX_TRANSITION;
+          }
+          mode = radioMode;
         }
-        atomic mode = radioMode;
         if(mode == RADIO_MODE_TX_TRANSITION) {
           call DataResource.release();
-          if (call ConfigResource.immediateRequest() == SUCCESS) {
+          if (call HplTda5250Config.IsTxRxPinControlled()) {
             switchConfigResource();
           } else {
-            call ConfigResource.request();
+            if (call ConfigResource.immediateRequest() == SUCCESS) {
+              switchConfigResource();
+            } else {
+              call ConfigResource.request();
+            }
           }
           return SUCCESS;
         }
@@ -331,14 +364,18 @@ implementation {
           if(radioBusy() == FALSE) {
             radioMode = RADIO_MODE_RX_TRANSITION;
           }
+          mode = radioMode;
         }
-        atomic mode = radioMode;
         if(mode == RADIO_MODE_RX_TRANSITION) {
           call DataResource.release();
-          if (call ConfigResource.immediateRequest() == SUCCESS) {
+          if (call HplTda5250Config.IsTxRxPinControlled()) {
             switchConfigResource();
           } else {
-            call ConfigResource.request();
+            if (call ConfigResource.immediateRequest() == SUCCESS) {
+              switchConfigResource();
+            } else {
+              call ConfigResource.request();
+            }
           }
           return SUCCESS;
         }
@@ -364,7 +401,8 @@ implementation {
       }
 
       async command bool RadioByteComm.isTxDone() {
-        return call HplTda5250Data.isTxDone();
+        //return call HplTda5250Data.isTxDone();
+        return TRUE;
       }
       
       /* Generate events (these are no interrupts */
@@ -378,7 +416,6 @@ implementation {
           case RECEIVER_DELAY :
             delayTimer = RSSISTABLE_DELAY;
             call DelayTimer.start(TDA5250_RSSI_STABLE_TIME-TDA5250_RECEIVER_SETUP_TIME);
-            call ConfigResource.release();
             if (call DataResource.immediateRequest() == SUCCESS) {
               switchDataResource();
             } else {
@@ -386,8 +423,7 @@ implementation {
             }
             break;
           case TRANSMITTER_DELAY :
-            call ConfigResource.release();
-            if (call DataResource.immediateRequest() == SUCCESS) {
+           if (call DataResource.immediateRequest() == SUCCESS) {
               switchDataResource();
             } else {
               call DataResource.request();
@@ -396,6 +432,10 @@ implementation {
         }
       }
 
+      default async event void ResourceRequested.requested() {
+      }
+      default async event void ResourceRequested.immediateRequested() {
+      }
       default async event void Tda5250Control.TimerModeDone(){
       }
       default async event void Tda5250Control.SelfPollingModeDone(){