/home/ltracy/workspace/NSUAN/uan/uan-phy.h

00001 #ifndef PHYUAN_H_
00002 #define PHYUAN_H_
00003 
00030 //Doxygen add on to create a main page comment
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); //Receive packet from channel or MAC
00099         
00101         virtual void sendDown(Packet *p);  //Propagate packet on channel
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         //There is no doubt.  This is a stupid hack.  This is an effort to fit into the mobile node model.
00130         //Don't really want an antenna underwater.
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         //Stuff from Transducer
00144         
00151         virtual TransEvent rx(Packet *p);  //Log an incoming packet
00158         virtual TransEvent tx(Packet *p);  //TX packet
00159         
00161         virtual double pktNoise(void); //Combined noise from passing
00162                                                                    //Packets
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         //Propagation *propagation;
00195         Antenna *ant_;
00196         
00198         double txPower;
00200         double txFreq;
00202         double rxThresh;
00204         double csThresh;
00205         
00206         
00207         //power info
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         //From Transducer
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 /*PHYUAN_H_*/

Generated on Mon Oct 1 12:12:43 2007 for UANModule by  doxygen 1.5.1