rfid_tag_mac.hpp

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 // PacketData Subclass
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 // RfidTagMac Class
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 // Inline Functions
00316 
00317 inline RfidTagMacPtr RfidTagMac::create(NodePtr node, 
00318    RfidTagAppPtr tagApp)
00319 {
00320    RfidTagMacPtr p(new RfidTagMac(node, tagApp));
00321    // weakThis *must* be set before the this* functions are called.
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 // Overloaded Operators
00362 
00364 // RfidTagMacData Inline Functions
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    // If the shared_ptr is empty, then the cast failed.
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 // Overloaded Operators
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 

Generated on Tue Dec 12 17:04:38 2006 for rfidsim by  doxygen 1.4.7