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
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 };
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 };
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 };
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 };
00620
00621
00622 #endif