]> oss.titaniummirror.com Git - tinyos-2.x.git/blobdiff - tos/lib/net/zigbee/ieee802154/phy/PhyP.nc
Merge TinyOS 2.1.1 into master.
[tinyos-2.x.git] / tos / lib / net / zigbee / ieee802154 / phy / PhyP.nc
diff --git a/tos/lib/net/zigbee/ieee802154/phy/PhyP.nc b/tos/lib/net/zigbee/ieee802154/phy/PhyP.nc
new file mode 100644 (file)
index 0000000..ca9c842
--- /dev/null
@@ -0,0 +1,345 @@
+/*
+ * @author IPP HURRAY http://www.hurray.isep.ipp.pt/art-wise
+ * @author Andre Cunha
+ *
+ */
+
+#include "frame_format.h"
+
+#include "phy_const.h"
+#include "phy_enumerations.h"
+
+module PhyP {
+
+       provides interface SplitControl;
+       // provides interface Test_send;
+       
+       
+       //ieee802.15.4 phy interfaces
+       provides interface PD_DATA;
+       
+       provides interface PLME_ED;
+       provides interface PLME_CCA;
+       provides interface PLME_SET;
+       provides interface PLME_GET;
+       provides interface PLME_SET_TRX_STATE;
+       
+       
+       provides interface Init;
+       
+       uses interface Resource;
+       uses interface CC2420Power;
+       uses interface CC2420Config;
+       uses interface StdControl as SubControl;
+       
+       uses interface Random;
+       uses interface Leds;
+       
+       uses interface Sendframe;
+       
+       uses interface Receiveframe;
+
+}
+
+implementation {
+
+
+       phyPIB phy_PIB;
+       
+       //transceiver current status
+       //it can only be PHY_TRX_OFF, PHY_RX_ON and PHY_TX_ON
+       uint8_t currentRxTxState = PHY_TRX_OFF;
+       
+       //message received
+       //norace MPDU rxmpdu;
+       MPDU *rxmpdu_ptr;
+
+  
+  error_t sendErr = SUCCESS;
+
+  
+  
+  /** TRUE if we are to use CCA when sending the current packet */
+  norace bool ccaOn;
+  
+  /****************** Prototypes ****************/
+  task void startDone_task();
+  task void startDone_task();
+  task void stopDone_task();
+  task void sendDone_task();
+  
+  void shutdown();
+
+
+
+/***************** Init Commands ****************/
+  command error_t Init.init() {
+  
+  //atomic rxmpdu_ptr = &rxmpdu;
+  
+  //TODO
+  /*
+       //PHY PIB initialization
+       //phy_PIB.phyCurrentChannel=INIT_CURRENTCHANNEL;
+       phy_PIB.phyCurrentChannel=LOGICAL_CHANNEL;
+       phy_PIB.phyChannelsSupported=INIT_CHANNELSSUPPORTED;
+       phy_PIB.phyTransmitPower=INIT_TRANSMITPOWER;
+       phy_PIB.phyCcaMode=INIT_CCA_MODE;
+  */
+  
+    return SUCCESS;
+  }
+
+
+  /***************** SplitControl Commands ****************/
+  command error_t SplitControl.start() {
+   
+               //arrancar o controlo
+   
+      call CC2420Power.startVReg();
+         
+               
+      return SUCCESS;
+    
+
+  }
+
+  command error_t SplitControl.stop() {
+    return EBUSY;
+  }
+
+  /***************** Send Commands ****************/
+
+
+    async event void Sendframe.sendDone(error_t error )
+       {
+       
+           atomic sendErr = error;
+               post sendDone_task();
+       
+       }
+  
+  
+  
+
+  /**************** Events ****************/
+  async event void CC2420Power.startVRegDone() {
+    call Resource.request();
+
+  }
+  
+  event void Resource.granted() {
+    call CC2420Power.startOscillator();
+  }
+
+  async event void CC2420Power.startOscillatorDone() {
+    post startDone_task();
+  }
+  
+  
+  
+  /***************** Tasks ****************/
+  task void sendDone_task() {
+    error_t packetErr;
+    atomic packetErr = sendErr;
+       
+   // signal Send.sendDone( m_msg, packetErr );
+  }
+
+  task void startDone_task() {
+    call SubControl.start();
+    call CC2420Power.rxOn();
+    call Resource.release();
+  
+    signal SplitControl.startDone( SUCCESS );
+  }
+  
+  task void stopDone_task() {
+    
+    signal SplitControl.stopDone( SUCCESS );
+  }
+  
+  
+  /***************** Functions ****************/
+  /**
+   * Shut down all sub-components and turn off the radio
+   */
+  void shutdown() {
+    call SubControl.stop();
+    call CC2420Power.stopVReg();
+    post stopDone_task();
+  }
+
+  /***************** Defaults ***************/
+  default event void SplitControl.startDone(error_t error) {
+  }
+  
+  default event void SplitControl.stopDone(error_t error) {
+  }
+  
+  
+  
+  async event void Receiveframe.receive(uint8_t* frame, uint8_t rssi)
+  {
+  
+    rxmpdu_ptr=(MPDU*)frame;
+               
+       signal PD_DATA.indication(rxmpdu_ptr->length,(uint8_t*)rxmpdu_ptr, rssi);
+  /*
+  printfUART("n %i\n", TOS_NODE_ID); 
+  
+       printfUART("l %i\n", rxmpdu_ptr->length); 
+  printfUART("fc1 %i\n", rxmpdu_ptr->frame_control1); 
+  printfUART("fc2 %i\n", rxmpdu_ptr->frame_control2); 
+       printfUART("seq %i\n", rxmpdu_ptr->seq_num); 
+  
+  for (i=0;i<120;i++)
+  {
+       printfUART("d %i %x\n",i, rxmpdu_ptr->data[i]); 
+  
+  }
+  */
+  
+  
+  }
+  
+  
+  
+  event void CC2420Config.syncDone( error_t error )
+  {
+  
+  
+  
+  return;
+  }
+  
+  
+/*****************************************************************************************************/  
+/**************************************PD-DATA********************************************************/
+/*****************************************************************************************************/  
+
+
+async command error_t PD_DATA.request(uint8_t psduLength, uint8_t* psdu) {
+       
+       
+       call Sendframe.send(psdu,psduLength);
+
+
+       return SUCCESS;
+}
+
+
+/*****************************************************************************************************/  
+/********************************************PLME-ED**************************************************/
+/*****************************************************************************************************/  
+
+command error_t PLME_ED.request(){
+       //MAC asking for energy detection
+       //TODO
+       
+       return SUCCESS;
+}
+
+/*****************************************************************************************************/  
+/********************************************PLME-CCA*************************************************/
+/*****************************************************************************************************/
+
+command error_t PLME_CCA.request(){
+//MAC asking for CCA
+//TODO
+               
+       
+       return SUCCESS;
+}
+/*****************************************************************************************************/  
+/********************************************PLME-GET*************************************************/
+/*****************************************************************************************************/
+
+command error_t PLME_GET.request(uint8_t PIBAttribute){
+//MAC asking for PIBAttribute value
+  switch(PIBAttribute)
+               {
+                       case PHYCURRENTCHANNEL:
+                               signal PLME_GET.confirm(PHY_SUCCESS, PIBAttribute, phy_PIB.phyCurrentChannel);
+                               break;
+
+                       case PHYCHANNELSSUPPORTED:
+                               signal PLME_GET.confirm(PHY_SUCCESS, PIBAttribute, phy_PIB.phyChannelsSupported);
+                               break;
+
+                       case PHYTRANSMITPOWER:
+                               signal PLME_GET.confirm(PHY_SUCCESS, PIBAttribute, phy_PIB.phyTransmitPower);
+                               break;
+                       case PHYCCAMODE:
+                               signal PLME_GET.confirm(PHY_SUCCESS, PIBAttribute, phy_PIB.phyCcaMode);
+                               break;
+                       default:
+                               signal PLME_GET.confirm(PHY_UNSUPPORTED_ATTRIBUTE, PIBAttribute, 0x00);
+                               break;
+               }
+               
+  
+  return SUCCESS;
+  }
+  
+/*****************************************************************************************************/  
+/********************************************PLME-SET*************************************************/
+/*****************************************************************************************************/
+command error_t PLME_SET.request(uint8_t PIBAttribute, uint8_t PIBAttributeValue){
+  
+
+         //MAC is demanding for PHY to write the indicated PIB value
+         switch(PIBAttribute)
+                       {
+                               case PHYCURRENTCHANNEL:
+                                       
+                                       phy_PIB.phyCurrentChannel = PIBAttributeValue;
+                                       
+                                       call CC2420Config.setChannel(phy_PIB.phyCurrentChannel);
+                                       
+                                       call CC2420Config.sync();
+                                       
+                                       //TunePreset(phy_PIB.phyCurrentChannel);
+                                       signal PLME_SET.confirm(PHY_SUCCESS, PIBAttribute);
+                                       break;
+       
+                               case PHYCHANNELSSUPPORTED:
+                                       phy_PIB.phyChannelsSupported = PIBAttributeValue;
+                                       signal PLME_SET.confirm(PHY_SUCCESS, PIBAttribute);
+                                       break;
+       
+                               case PHYTRANSMITPOWER:
+                                       phy_PIB.phyTransmitPower= PIBAttributeValue;
+                                       //SetRFPower(phy_PIB.phyTransmitPower);
+                                       signal PLME_SET.confirm(PHY_SUCCESS, PIBAttribute);
+                                       break;
+                               case PHYCCAMODE:
+                                       phy_PIB.phyCcaMode= PIBAttributeValue;
+                                       signal PLME_SET.confirm(PHY_SUCCESS, PIBAttribute);
+                                       break;
+                               default:
+                                       signal PLME_SET.confirm(PHY_UNSUPPORTED_ATTRIBUTE, PIBAttribute);
+                                       break;
+                       }
+         return SUCCESS;
+}  
+
+/*****************************************************************************************************/  
+/**********************************PLME_SET_TRX_STATE*************************************************/
+/*****************************************************************************************************/
+
+
+async command error_t PLME_SET_TRX_STATE.request(uint8_t state){
+
+
+return SUCCESS;
+
+}
+
+
+
+}
+