00001 #ifndef PHYUAN_H_
00002 #define PHYUAN_H_
00003
00030
00060 #include "phy.h"
00061 #include "modulation.h"
00062 #include "uan-mac.h"
00063 #include "uan-tools.h"
00064 #include "propagation.h"
00065
00066 #include <list>
00067
00068 #define PHY_DEBUGF
00069
00070 #define UAN_PHY_PTDEF 10
00071 #define UAN_PHY_FDEF 24000
00072
00073 #define UAN_PHY_RXTDEF 10
00074 #define UAN_PHY_CSTDEF 10
00075 #define UAN_PHY_DEFCOLTIME 0.5
00076
00077 struct PacketInfo;
00078 struct PktHandler;
00079 class UanMac;
00080
00081
00082
00083 class UanPhy : public Phy {
00084 friend class PktHandler;
00085 public:
00087 UanPhy(void);
00088 ~UanPhy();
00089
00091 enum TransState {IDLE, RX, TX, CHIDLE, CHBUSY};
00092
00094 enum TransEvent {ECOLL, EERR, ENORX, EOK};
00095
00096
00098 virtual void recv(Packet *p, Handler *h);
00099
00101 virtual void sendDown(Packet *p);
00102
00104 virtual int sendUp(Packet *p);
00105
00110 virtual int command(int argc, const char*const* argv);
00111
00113 bool initialized();
00114
00119 bool isIdle(bool cs=false);
00120
00122 void setMac(UanMac *m);
00123
00125 double txtime(Packet *p);
00127 double txtime(int bytes);
00128
00129
00130
00132 inline double getAntennaZ() { return ant_->getZ(); }
00133
00135 bool csIdle();
00136
00138 double getFreq() {return txFreq;}
00140 double getTxPower() {return txPower;}
00141
00142
00143
00144
00151 virtual TransEvent rx(Packet *p);
00158 virtual TransEvent tx(Packet *p);
00159
00161 virtual double pktNoise(void);
00162
00163
00165 inline TransState getState(void) {return state;}
00166
00168 inline double getColTime(void) {return colTime;}
00169
00171 inline void setColTime(double c) {assert(c >= 0); colTime = c;}
00172
00173
00174 protected:
00176 UanMac *mac;
00177
00179 Modulation *modulation;
00180
00182 virtual void debugf(char *fmt, ...);
00183
00185 virtual void powerTrace(void);
00186
00188 virtual void updatePower(void);
00189
00191 void trace(char *fmt, ...);
00192
00193
00195 Antenna *ant_;
00196
00198 double txPower;
00200 double txFreq;
00202 double rxThresh;
00204 double csThresh;
00205
00206
00207
00208
00210 double txConsume;
00212 double rxConsume;
00214 double idleConsume;
00216 double powerTime;
00218 double joulesUsed;
00220 int tracePower;
00221
00223 Trace *et;
00224
00225
00226
00227
00229 double colTime;
00231 bool collision;
00232
00234 UanEventTimer *rxTimer;
00236 UanEventTimer *txTimer;
00237
00238
00240 Packet *pktRx;
00241
00242
00244 TransState state;
00245
00247 std::list<PacketInfo *> pktList;
00248
00250 void setState(TransState newState);
00252 static void rxHandler(void *t);
00254 static void txHandler(void *t);
00255
00257 PktHandler *pktHandler;
00258
00260 double getChBusyTime(void);
00261
00262 };
00263
00278 struct PacketInfo : public Event {
00280 double rxPwr;
00282 double txPwr;
00284 int size;
00286 int sourceAddr;
00288 double time;
00290 double x;
00292 double y;
00294 double z;
00295
00297 bool operator ==(PacketInfo &other) {
00298 return (rxPwr == other.rxPwr)&&(txPwr == other.txPwr)
00299 &&(sourceAddr == other.sourceAddr)&&(size = other.size)
00300 &&(time == other.time);
00301 }
00303 bool operator !=(PacketInfo &other) {
00304 return (rxPwr != other.rxPwr) || (txPwr != other.txPwr)
00305 || (sourceAddr != other.sourceAddr) ||
00306 (size != other.size) || (time != other.time);
00307 }
00309 bool operator <(PacketInfo &other) {
00310 return rxPwr < other.rxPwr;
00311 }
00313 PacketInfo() : rxPwr(-1), txPwr(-1), size(-1), sourceAddr(-1), time(-1) {}
00314
00316 PacketInfo(const Packet &p) { setinfo(p); }
00317
00319 void setinfo(const Packet &p) {
00320 PacketStamp ps = p.txinfo_;
00321 rxPwr = ps.RxPr;
00322 txPwr = ps.getTxPr();
00323 sourceAddr = ps.getNode()->address();
00324 size=HDR_CMN(&p)->size();
00325 time = Scheduler::instance().clock();
00326 x = ps.getNode()->X();
00327 y = ps.getNode()->Y();
00328 z = ps.getNode()->Z();
00329 }
00330
00331 };
00332
00341 class PktHandler : public Handler {
00342 public:
00344 PktHandler(UanPhy *p) : Handler(),phy(p) {}
00351 void handle(Event *e);
00352 protected:
00354 UanPhy *phy;
00355 };
00356
00357
00358 #endif