PhyUtils.h

00001 #ifndef PHYUTILS_H_
00002 #define PHYUTILS_H_
00003 
00004 #include "AnalogueModel.h"
00005 #include "Mapping.h"
00006 
00007 #include <omnetpp.h>
00008 #include <iostream>
00009 #include <assert.h>
00010 #include <list>
00011 
00012 
00013 
00014 class RSAMMapping;
00015 
00040 class RadioStateAnalogueModel : public AnalogueModel
00041 {
00042   friend class RSAMMapping;
00043   friend class RSAMConstMappingIterator;
00044 
00045 protected:
00046 
00053   class ListEntry
00054   {
00055   protected:
00057     std::pair<simtime_t, double> basicTimestamp;
00058 
00059   public:
00061     ListEntry(simtime_t time, double value) {
00062       basicTimestamp = std::pair<simtime_t, double> (time, value);
00063     }
00064 
00065     virtual ~ListEntry() {}
00066 
00068     simtime_t getTime() const {
00069       return basicTimestamp.first;
00070     }
00071 
00073     void setTime(simtime_t time) {
00074       basicTimestamp.first = time;
00075     }
00076 
00078     double getValue() const {
00079       return basicTimestamp.second;
00080     }
00081 
00083     void setValue(double value) {
00084       basicTimestamp.second = value;
00085     }
00086 
00091     friend bool operator<(const ListEntry& e, const simtime_t& t) {
00092       return (e.getTime() < t);
00093     }
00094 
00099     friend bool operator<(const simtime_t& t, const ListEntry& e) {
00100       return (t < e.getTime());
00101     }
00102   };
00103 
00104 
00108   bool currentlyTracking;
00109 
00111   std::list<ListEntry> radioStateAttenuation;
00112 
00113 public:
00114 
00120   RadioStateAnalogueModel(double initValue,
00121               bool currentlyTracking = false,
00122               simtime_t initTime = 0)
00123     : currentlyTracking(currentlyTracking)
00124   {
00125     // put the initial time-stamp to the list
00126     radioStateAttenuation.push_back(ListEntry(initTime, initValue));
00127   }
00128 
00129   virtual ~RadioStateAnalogueModel() {}
00130 
00139   virtual void filterSignal(Signal& s);
00140 
00144   void setTrackingModeTo(bool b) {
00145     currentlyTracking = b;
00146   }
00147 
00157   void cleanUpUntil(simtime_t t);
00158 
00164   void writeRecvEntry(simtime_t time, double value);
00165 
00166 
00167 
00168 
00169 }; // end class RadioStateAnalogueModel
00170 
00171 
00172 
00173 
00190 class Radio
00191 {
00192 public:
00196   enum RadioState {
00198     RX = 0,
00200     TX,
00202     SLEEP,
00204     SWITCHING,
00205 
00215     NUM_RADIO_STATES
00216   };
00217 
00218 protected:
00219 
00221   cOutVector radioStates;
00223   cOutVector radioChannels;
00224 
00226   int state;
00228   int nextState;
00229 
00230 
00232   const int numRadioStates;
00234   simtime_t** swTimes;
00235 
00237   const double minAtt;
00239   const double maxAtt;
00240 
00246   RadioStateAnalogueModel rsam;
00247 
00249   int currentChannel;
00250 
00252   int nbChannels;
00253 
00254 public:
00255 
00266   static Radio* createNewRadio(bool recordStats = false,
00267                  int initialState = RX,
00268                  double minAtt = 1.0,
00269                  double maxAtt = 0.0,
00270                  int currentChannel=0, int nbChannels=1)
00271   {
00272     return new Radio(NUM_RADIO_STATES,
00273              recordStats,
00274              initialState,
00275              minAtt, maxAtt,
00276              currentChannel, nbChannels);
00277   }
00278 
00282   virtual ~Radio();
00283 
00293   virtual simtime_t switchTo(int newState, simtime_t now);
00294 
00300   virtual void setSwitchTime(int from, int to, simtime_t time);
00301 
00305   virtual int getCurrentState() const {
00306     return state;
00307   }
00308 
00309 
00310 
00320   virtual void endSwitch(simtime_t now);
00321 
00328   virtual RadioStateAnalogueModel* getAnalogueModel() {
00329     return (&rsam);
00330   }
00331 
00336   virtual void cleanAnalogueModelUntil(simtime_t t) {
00337     rsam.cleanUpUntil(t);
00338   }
00339 
00343   void setTrackingModeTo(bool b) {
00344     rsam.setTrackingModeTo(b);
00345   }
00346 
00353   void setCurrentChannel(int newChannel) {
00354     assert(newChannel > -1);
00355     assert(newChannel < nbChannels);
00356     currentChannel = newChannel;
00357     radioChannels.record(currentChannel);
00358   }
00359 
00364   int getCurrentChannel() {
00365     return currentChannel;
00366   }
00367 
00368 
00369 protected:
00385   Radio(int numRadioStates,
00386       bool recordStats,
00387       int initialState = RX,
00388       double minAtt = 1.0, double maxAtt = 0.0,
00389       int currentChannel = 0, int nbChannels = 1);
00390 
00394   virtual void makeRSAMEntry(simtime_t time, int state)
00395   {
00396     rsam.writeRecvEntry(time, mapStateToAtt(state));
00397   }
00398 
00403   virtual double mapStateToAtt(int state)
00404   {
00405     if (state == RX) {
00406       return minAtt;
00407     }
00408     else{
00409       return maxAtt;
00410     }
00411   }
00412 }; // end class Radio
00413 
00414 
00415 
00421 class RSAMConstMappingIterator : public ConstMappingIterator
00422 {
00423 protected:
00424 
00426   const RadioStateAnalogueModel* rsam;
00427 
00429   typedef std::list<RadioStateAnalogueModel::ListEntry> CurrList;
00431   CurrList::const_iterator it;
00432 
00434   Argument position;
00436   Argument nextPosition;
00437 
00439   simtime_t signalStart;
00441   simtime_t signalEnd;
00442 
00443 public:
00444 
00446   RSAMConstMappingIterator(const RadioStateAnalogueModel* rsam,
00447                simtime_t signalStart,
00448               simtime_t signalEnd);
00449 
00450   virtual ~RSAMConstMappingIterator() {}
00451 
00458   virtual void jumpTo(const Argument& pos);
00459 
00470   virtual void setNextPosition();
00471 
00477   virtual void jumpToBegin() {
00478     jumpTo(signalStart);
00479   }
00480 
00485   virtual void iterateTo(const Argument& pos);
00486 
00487 
00494   virtual void next() {
00495     iterateTo(nextPosition);
00496   }
00497 
00505   virtual bool inRange() const;
00506 
00511   virtual bool hasNext() const;
00512 
00516   virtual const Argument& getPosition() const {
00517     return position;
00518   }
00519 
00520   virtual const Argument& getNextPosition() const {
00521     return nextPosition;
00522   }
00523 
00528   virtual double getValue() const {
00529     return it->getValue();
00530   }
00531 
00532 
00537   virtual void iterateToOverZeroSwitches(simtime_t t);
00538 
00539 }; // end class RSAMConstMappingIterator
00540 
00541 
00558 class RSAMMapping : public ConstMapping
00559 {
00560 protected:
00561 
00563   const RadioStateAnalogueModel* rsam;
00565   simtime_t signalStart;
00567   simtime_t signalEnd;
00568 
00569 public:
00574   RSAMMapping(const RadioStateAnalogueModel* rsam,
00575         simtime_t signalStart,
00576         simtime_t signalEnd) :
00577     ConstMapping(),
00578     rsam(rsam),
00579     signalStart(signalStart),
00580     signalEnd(signalEnd)
00581   {
00582     assert(rsam);
00583     assert( !(signalStart < rsam->radioStateAttenuation.front().getTime()) );
00584   }
00585 
00586   virtual ~RSAMMapping() {}
00587 
00597   virtual double getValue(const Argument& pos) const;
00598 
00603   virtual ConstMappingIterator* createConstIterator()
00604   {
00605     return new RSAMConstMappingIterator(rsam, signalStart, signalEnd);
00606   }
00607 
00613   virtual ConstMappingIterator* createConstIterator(const Argument& pos);
00614 
00615   virtual ConstMapping* constClone() const {
00616     return new RSAMMapping(*this);
00617   }
00618 
00619 }; // end class RSAMMapping
00620 
00621 
00622 #endif /*PHYUTILS_H_*/