packet.hpp

00001 
00002 #ifndef PACKET_H
00003 #define PACKET_H
00004 
00005 #include <map>
00006 #include <iostream>
00007 #include <iomanip>
00008 using namespace std;
00009 #include <boost/shared_ptr.hpp>
00010 
00011 #include "utility.hpp"
00012 #include "sim_time.hpp"
00013 #include "node.hpp"
00014 
00018 class PacketData {
00019 public:
00021    typedef boost::shared_ptr<PacketData> PacketDataPtr;
00022 
00024    virtual ~PacketData() {}
00025 
00030    static inline PacketDataPtr create()
00031    {
00032       PacketDataPtr p(new PacketData());
00033       return p;
00034    }
00035 
00040    static inline PacketDataPtr create(const PacketData& rhs)
00041    {
00042       return rhs.clone();
00043    }
00044 
00049    virtual inline t_uint getSizeInBytes() const
00050    {
00051       return m_DEFAULT_SIZE_IN_BYTES;
00052    }
00053 
00057    virtual inline ostream& print(ostream& s) const
00058    {
00059       return s << "sizeInBytes=" << getSizeInBytes();
00060    }
00061 
00062 protected:
00063 
00065    PacketData() {}
00066 
00068    PacketData(const PacketData& rhs) {}
00069 
00076    virtual PacketDataPtr clone() const
00077    {
00078       PacketDataPtr p(new PacketData(*this));
00079       return p;
00080    }
00081 
00082 private:
00083 
00085    static const t_uint m_DEFAULT_SIZE_IN_BYTES = 32;
00086 
00088    PacketData& operator= (const PacketData& rhs);
00089 
00090 };
00091 typedef boost::shared_ptr<PacketData> PacketDataPtr;
00092 
00097 class Packet {
00098 friend ostream& operator<< (ostream& s, const Packet& packet);
00099 public:
00101    typedef boost::shared_ptr<Packet> PacketPtr;
00102 
00107    enum DataTypes {
00108       DataTypes_Physical, 
00109       DataTypes_Link, 
00110       DataTypes_Network, 
00111       DataTypes_Transport, 
00112       DataTypes_Application 
00113    };
00114 
00116    typedef map<DataTypes,PacketDataPtr> DataTypeMap;
00117 
00119    virtual ~Packet();
00120 
00125    static inline PacketPtr create();
00126 
00131    static inline PacketPtr create(const Packet& rhs);
00132 
00138    inline t_uint getSizeInBytes() const;
00139 
00145    inline t_uint getSizeInBits() const;
00146 
00152    inline double getDataRate() const;
00153    
00159    inline void setDataRate(double dataRate);
00160 
00166    inline bool getHasError() const;
00167 
00174    inline void setHasError(bool hasError);
00175 
00180    SimTime getDuration() const;
00181 
00191    void addData(DataTypes dataType, const PacketData& data);
00192 
00200    PacketDataPtr getData(DataTypes dataType);
00201 
00209    bool removeData(DataTypes dataTypes);
00210 
00219    bool hasUpperLayerData(DataTypes dataTypes);
00220 
00228    inline void setDestination(const NodeId& destination);
00229 
00237    inline NodeId getDestination() const;
00238 
00254    inline void setTxPower(double txPower);
00255 
00271    inline double getTxPower() const;
00272 
00284    inline void setDoMaxTxPower(bool doMaxTxPower);
00285 
00297    inline bool getDoMaxTxPower() const;
00298 
00304    inline t_ulong getUniqueId() const;
00305 
00306 protected:
00307 
00309    Packet();
00310 
00312    Packet(const Packet& rhs);
00313 
00320    virtual PacketPtr clone() const;
00321 
00322 private:
00323 
00326    static const t_uint m_DEFAULT_SIZE_IN_BYTES;
00327 
00329    static const double m_DEFAULT_DATA_RATE;
00330 
00332    static const t_uint m_DEFAULT_DESTINATION;
00333 
00336    static t_ulong m_nextUniqueId;
00337 
00341    double m_dataRate;
00342 
00348    double m_txPower;
00349 
00355    bool m_doMaxTxPower;
00356 
00360    bool m_hasError;
00361 
00367    DataTypeMap m_data;
00368 
00375    NodeId m_destination;
00376 
00380    t_ulong m_uniqueId;
00381 
00383    Packet& operator= (const Packet& rhs);
00384 
00385 };
00386 
00387 typedef boost::shared_ptr<Packet> PacketPtr;
00388 typedef boost::shared_ptr<Packet const> ConstPacketPtr;
00389 
00391 // Inline Functions
00393 
00394 inline PacketPtr Packet::create()
00395 {
00396    PacketPtr p(new Packet());
00397    p->m_uniqueId = Packet::m_nextUniqueId++;
00398    return p;
00399 }
00400 
00401 inline PacketPtr Packet::create(const Packet& rhs)
00402 {
00403    return rhs.clone();
00404 }
00405 
00406 inline t_uint Packet::getSizeInBytes() const
00407 {
00408 
00409    t_uint sizeInBytes = m_DEFAULT_SIZE_IN_BYTES;
00410 
00411    // If data has been added to the packet, then
00412    // we'll sum up the size of all the data rather
00413    // than using the default size.
00414    if(m_data.begin() != m_data.end()) {
00415       sizeInBytes = 0;
00416       DataTypeMap::const_iterator p;
00417       for(p = m_data.begin(); p != m_data.end(); ++p) {
00418          sizeInBytes += p->second->getSizeInBytes();
00419       }
00420    }
00421 
00422    return sizeInBytes;
00423 }
00424 
00425 inline t_uint Packet::getSizeInBits() const
00426 {
00427    return (getSizeInBytes() * 8);
00428 }
00429 
00430 inline double Packet::getDataRate() const
00431 {
00432    return m_dataRate;
00433 }
00434 
00435 inline void Packet::setDataRate(double dataRate)
00436 {
00437    assert(dataRate > 0.0);
00438    m_dataRate = dataRate;
00439 }
00440 
00441 inline bool Packet::getHasError() const
00442 {
00443    return m_hasError;
00444 }
00445 
00446 inline void Packet::setHasError(bool hasError)
00447 {
00448    m_hasError = hasError;
00449 }
00450 
00451 inline void Packet::setDestination(const NodeId& destination)
00452 {
00453    m_destination = destination;
00454 }
00455 
00456 inline NodeId Packet::getDestination() const
00457 {
00458    return m_destination;
00459 }
00460 
00461 inline void Packet::setTxPower(double txPower)
00462 {
00463    assert(txPower >= 0.0);
00464    m_txPower = txPower;
00465 }
00466 
00467 inline double Packet::getTxPower() const
00468 {
00469    return m_txPower;
00470 }
00471 
00472 inline void Packet::setDoMaxTxPower(bool doMaxTxPower)
00473 {
00474    m_doMaxTxPower = doMaxTxPower;
00475 }
00476 
00477 inline bool Packet::getDoMaxTxPower() const
00478 {
00479    return m_doMaxTxPower;
00480 }
00481 
00482 inline t_ulong Packet::getUniqueId() const
00483 {
00484    return m_uniqueId;
00485 }
00486 
00488 // Overloaded Operators
00490 
00491 inline ostream& operator<< (ostream& s, 
00492    const Packet::DataTypes& dataType)
00493 {
00494    switch(dataType) {
00495    case Packet::DataTypes_Physical:
00496       s << "physical";
00497       break;
00498    case Packet::DataTypes_Link:
00499       s << "link";
00500       break;
00501    case Packet::DataTypes_Network:
00502       s << "network";
00503       break;
00504    case Packet::DataTypes_Transport:
00505       s << "transport";
00506       break;
00507    case Packet::DataTypes_Application:
00508       s << "application";
00509       break;
00510    }
00511    s << "LayerData";
00512    return s;
00513 }
00514 
00515 inline ostream& operator<< (ostream& s, const PacketData& data)
00516 {
00517    return data.print(s);
00518 }
00519 
00520 inline ostream& operator<< (ostream& s, const Packet& packet)
00521 {
00522    ostringstream powerStream;
00523    if(packet.getDoMaxTxPower()) {
00524       powerStream << ", doMaxTxPower=" << boolalpha << 
00525          packet.getDoMaxTxPower();
00526    } else {
00527       powerStream << ", txPower=" << packet.getTxPower();
00528    }
00529 
00530    // cout << "pointer=" << &packet;
00531    s << "[ packetState " << 
00532       "uniqueId=" << packet.getUniqueId() <<
00533       ", sizeInBytes=" << packet.getSizeInBytes() << 
00534       powerStream.str() <<
00535       ", dataRate=" << packet.getDataRate() << 
00536       ", durationInSeconds=" << setprecision(8) << 
00537       packet.getDuration() << 
00538       ", hasError=" << boolalpha << packet.getHasError() << " ]";
00539 
00540    typedef map<Packet::DataTypes,PacketDataPtr> DataTypeMap;
00541    // Put each of the packet headers in the stream
00542    if(packet.m_data.begin() != packet.m_data.end()) {
00543       DataTypeMap::const_iterator p;
00544       for(p = packet.m_data.begin(); p != packet.m_data.end(); ++p) {
00545          s << " [ " << p->first << " " << *p->second << " ]";
00546       }
00547    }
00548    return s;
00549 }
00550 
00551 #endif // PACKET_H
00552 

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