00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033
00034
00035
00036
00037
00038
00039
00040
00041
00042
00043
00044
00045
00046
00047
00048
00049
00050
00051
00052
00053 #ifndef p802_15_4phy_h
00054 #define p802_15_4phy_h
00055
00056
00057 #include <packet.h>
00058 #include <wireless-phy.h>
00059 #include "p802_15_4def.h"
00060
00061
00062 typedef enum
00063 {
00064 p_BUSY = 0,
00065 p_BUSY_RX,
00066 p_BUSY_TX,
00067 p_FORCE_TRX_OFF,
00068 p_IDLE,
00069 p_INVALID_PARAMETER,
00070 p_RX_ON,
00071 p_SUCCESS,
00072 p_TRX_OFF,
00073 p_TX_ON,
00074 p_UNSUPPORT_ATTRIBUTE,
00075 p_UNDEFINED
00076 }PHYenum;
00077
00078
00079 typedef enum
00080 {
00081 phyCurrentChannel = 0x00,
00082 phyChannelsSupported,
00083 phyTransmitPower,
00084 phyCCAMode
00085 }PPIBAenum;
00086
00087 struct PHY_PIB
00088 {
00089 UINT_8 phyCurrentChannel;
00090 UINT_32 phyChannelsSupported;
00091 UINT_8 phyTransmitPower;
00092 UINT_8 phyCCAMode;
00093 };
00094
00095
00096 #define phyCCAHType 1
00097 #define phyEDHType 2
00098 #define phyTRXHType 3
00099 #define phyRecvOverHType 4
00100 #define phySendOverHType 5
00101 #define phyCCAReportHType 6 // 2.31 change: new timer added for CCA reporting
00102 class Phy802_15_4;
00103 class Phy802_15_4Timer : public Handler
00104 {
00105 friend class Phy802_15_4;
00106 public:
00107 Phy802_15_4Timer(Phy802_15_4 *p, int tp) : Handler()
00108 {
00109 phy = p;
00110 type = tp;
00111 active = false;
00112 }
00113 virtual void start(double wtime);
00114 virtual void cancel(void);
00115 virtual void handle(Event* e);
00116
00117 protected:
00118 Phy802_15_4 *phy;
00119 int type;
00120 bool active;
00121 Event nullEvent;
00122 };
00123
00124 class Mac802_15_4;
00125 class Phy802_15_4 : public WirelessPhy
00126 {
00127 friend class Phy802_15_4Timer;
00128 public:
00129 Phy802_15_4(PHY_PIB *pp);
00130 void macObj(Mac802_15_4 *m);
00131 bool channelSupported(UINT_8 channel);
00132 double getRate(char dataOrSymbol);
00133 double trxTime(Packet *p,bool phyPkt = false);
00134 void construct_PPDU(UINT_8 psduLength,Packet *psdu);
00135 void PD_DATA_request(UINT_8 psduLength,Packet *psdu);
00136 void PD_DATA_indication(UINT_8 psduLength,Packet *psdu,UINT_8 ppduLinkQuality);
00137 void PLME_CCA_request();
00138 void PLME_ED_request();
00139 void PLME_GET_request(PPIBAenum PIBAttribute);
00140 void PLME_SET_TRX_STATE_request(PHYenum state);
00141 void PLME_SET_request(PPIBAenum PIBAttribute,PHY_PIB *PIBAttributeValue);
00142 UINT_8 measureLinkQ(Packet *p);
00143 void recv(Packet *p, Handler *h);
00144 Packet* rxPacket(void) {return rxPkt;}
00145 void wakeupNode(int cause);
00146 void putNodeToSleep();
00147 double channel_sleep_time_;
00148 double T_transition_local_;
00149
00150
00151 public:
00152 static PHY_PIB PPIB;
00153 double last_tx_time;
00154
00155 protected:
00156 void CCAHandler(void);
00157 void EDHandler(void);
00158 void TRXHandler(void);
00159 void recvOverHandler(Packet *p);
00160 void sendOverHandler(void);
00161 void CCAReportHandler(void);
00162
00163 private:
00164 PHY_PIB ppib;
00165 PHYenum trx_state;
00166 PHYenum trx_state_defer_set;
00167 PHYenum trx_state_turnaround;
00168 PHYenum tx_state;
00169 PHYenum sensed_ch_state;
00170 Packet *rxPkt;
00171
00172
00173
00174 Packet *txPkt;
00175 Packet *txPktCopy;
00176 double rxTotPower[27];
00177 double rxEDPeakPower;
00178 UINT_32 rxTotNum[27];
00179 UINT_32 rxThisTotNum[27];
00180 Mac802_15_4 *mac;
00181 Phy802_15_4Timer CCAH;
00182 Phy802_15_4Timer EDH;
00183 Phy802_15_4Timer TRXH;
00184 Phy802_15_4Timer recvOverH;
00185 Phy802_15_4Timer sendOverH;
00186 Phy802_15_4Timer CCAReportH;
00187 };
00188
00189 #endif
00190
00191