00001
00002 #ifndef RFID_TAG_MAC_H
00003 #define RFID_TAG_MAC_H
00004
00005 #include <boost/shared_ptr.hpp>
00006
00007 #include "simulator.hpp"
00008 #include "mac_protocol.hpp"
00009 #include "packet.hpp"
00010
00011 class RfidReaderMacData;
00012 typedef boost::shared_ptr<RfidReaderMacData> RfidReaderMacDataPtr;
00013 class RfidTagApp;
00014 typedef boost::shared_ptr<RfidTagApp> RfidTagAppPtr;
00015
00017
00019
00024 class RfidTagMacData : public PacketData {
00025 public:
00027 typedef boost::shared_ptr<RfidTagMacData> RfidTagMacDataPtr;
00028
00033 enum Types {
00034 Types_Generic,
00035 Types_Reply
00036 };
00037
00042 static inline RfidTagMacDataPtr create();
00043
00048 static inline RfidTagMacDataPtr create(
00049 const RfidTagMacData& rhs);
00050
00055 virtual inline t_uint getSizeInBytes() const;
00056
00061 void setSenderId(const NodeId& nodeId);
00062
00067 NodeId getSenderId() const;
00068
00073 void setReceiverId(const NodeId& nodeId);
00074
00079 NodeId getReceiverId() const;
00080
00085 inline void setType(Types type);
00086
00091 inline Types getType() const;
00092
00096 inline ostream& print(ostream& s) const;
00097
00098 protected:
00099
00101 RfidTagMacData();
00102
00104 RfidTagMacData(const RfidTagMacData& rhs);
00105
00112 virtual PacketDataPtr clone() const;
00113
00114 private:
00115
00118 static const t_uint m_senderIdBytes = 12;
00119
00121 static const t_uint m_receiverIdBytes = 4;
00122
00124 static const t_uint m_typeBytes = 1;
00125
00127 t_uchar m_senderId[m_senderIdBytes];
00128
00130 t_uchar m_receiverId[m_receiverIdBytes];
00131
00133 Types m_type;
00134
00135 };
00136 typedef boost::shared_ptr<RfidTagMacData> RfidTagMacDataPtr;
00137
00139
00141
00145 class RfidTagMac : public SlottedMac {
00146 public:
00148 typedef boost::shared_ptr<RfidTagMac> RfidTagMacPtr;
00149
00151 virtual ~RfidTagMac();
00152
00159 static inline RfidTagMacPtr create(NodePtr node,
00160 RfidTagAppPtr tagApp);
00161
00168 virtual inline RfidTagMacPtr thisRfidTagMac();
00169
00176 virtual inline SlottedMacPtr thisSlottedMac();
00177
00184 virtual inline MacProtocolPtr thisMacProtocol();
00185
00192 virtual inline SimulationEndListenerPtr thisSimulationEndListener();
00193
00197 virtual void simulationEndHandler();
00198
00206 bool handleRecvdMacPacket(PacketPtr packet,
00207 t_uint sendingLayerIdx);
00208
00216 bool handleRecvdUpperLayerPacket(PacketPtr packet,
00217 t_uint sendingLayerIdx);
00218
00226 virtual void handleChannelBusy(PacketPtr packet);
00227
00235 virtual void handlePacketSent(PacketPtr packet);
00236
00237 protected:
00238
00241 static const double m_TAG_GENERIC_IFS;
00242
00245 static const double m_TAG_REPLY_IFS;
00246
00248 RfidTagAppPtr m_tagApp;
00249
00251 RfidTagMac(NodePtr node, RfidTagAppPtr tagApp);
00252
00256 virtual void beginSlotEvent();
00257
00266 bool handleRequestPacket(RfidReaderMacDataPtr macData,
00267 t_uint sendingLayerIdx);
00268
00275 PacketPtr createReplyPacket(NodeId receiverId) const;
00276
00283 void addGenericHeader(PacketPtr packet, NodeId receiverId) const;
00284
00290 bool packetIsForMe(RfidReaderMacDataPtr macData) const;
00291
00299 bool isPacketType(PacketPtr packet,
00300 RfidTagMacData::Types type) const;
00301
00302 private:
00303
00304 static const bool m_DEBUG = true;
00305
00308 boost::weak_ptr<RfidTagMac> m_weakThis;
00309
00310 };
00311 typedef boost::shared_ptr<RfidTagMac> RfidTagMacPtr;
00312
00314
00316
00317 inline RfidTagMacPtr RfidTagMac::create(NodePtr node,
00318 RfidTagAppPtr tagApp)
00319 {
00320 RfidTagMacPtr p(new RfidTagMac(node, tagApp));
00321
00322 p->m_weakThis = p;
00323
00324 SlottedMacSlotEventPtr slotEvent =
00325 SlottedMacSlotEvent::create(p->thisSlottedMac());
00326 p->m_slotTimer = Timer::create(p->getNode(), slotEvent);
00327 p->m_slotTimer->start(SimTime(0.0));
00328
00329 Simulator::instance()->addSimulationEndListener(
00330 p->thisSimulationEndListener());
00331
00332 return p;
00333 }
00334
00335 inline RfidTagMacPtr RfidTagMac::thisRfidTagMac()
00336 {
00337 RfidTagMacPtr p(m_weakThis);
00338 return p;
00339 }
00340
00341 inline SlottedMacPtr RfidTagMac::thisSlottedMac()
00342 {
00343 SlottedMacPtr p(m_weakThis);
00344 return p;
00345 }
00346
00347 inline MacProtocolPtr RfidTagMac::thisMacProtocol()
00348 {
00349 MacProtocolPtr p(m_weakThis);
00350 return p;
00351 }
00352
00353 inline SimulationEndListenerPtr RfidTagMac::thisSimulationEndListener()
00354 {
00355 SimulationEndListenerPtr p(m_weakThis);
00356 return p;
00357 }
00358
00360
00362
00364
00366
00367 inline RfidTagMacDataPtr RfidTagMacData::create()
00368 {
00369 RfidTagMacDataPtr p(new RfidTagMacData());
00370 return p;
00371 }
00372
00373 inline RfidTagMacDataPtr RfidTagMacData::create(const RfidTagMacData& rhs)
00374 {
00375 RfidTagMacDataPtr p =
00376 boost::dynamic_pointer_cast<RfidTagMacData>(rhs.clone());
00377
00378 assert(p.get() != 0);
00379 return p;
00380 }
00381
00382 inline void RfidTagMacData::setType(RfidTagMacData::Types type)
00383 {
00384 m_type = type;
00385 }
00386
00387 inline RfidTagMacData::Types RfidTagMacData::getType() const
00388 {
00389 return m_type;
00390 }
00391
00392
00393 inline t_uint RfidTagMacData::getSizeInBytes() const
00394 {
00395 return (m_senderIdBytes + m_receiverIdBytes + m_typeBytes);
00396 }
00397
00399
00401
00402 inline ostream& operator<< (ostream& s,
00403 const RfidTagMacData::Types& dataType)
00404 {
00405 switch(dataType) {
00406 case RfidTagMacData::Types_Generic:
00407 s << "GENERIC";
00408 break;
00409 case RfidTagMacData::Types_Reply:
00410 s << "REPLY";
00411 break;
00412 }
00413 return s;
00414 }
00415
00416 inline ostream& RfidTagMacData::print(ostream& s) const
00417 {
00418 s << "type=" << m_type << ", " <<
00419 "senderId=" <<
00420 NodeId(m_senderId, m_senderIdBytes) << ", " <<
00421 "receiverId=" <<
00422 NodeId(m_receiverId, m_receiverIdBytes);
00423 return s;
00424 }
00425
00426
00427 #endif // RFID_TAG_MAC_H
00428