00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020 #include "wifi-mode.h"
00021 #include "ns3/assert.h"
00022
00023 namespace ns3 {
00024
00025 bool operator == (const WifiMode &a, const WifiMode &b)
00026 {
00027 return a.GetUid () == b.GetUid ();
00028 }
00029 std::ostream & operator << (std::ostream & os, const WifiMode &mode)
00030 {
00031 os << mode.GetUniqueName ();
00032 return os;
00033 }
00034 std::istream & operator >> (std::istream &is, WifiMode &mode)
00035 {
00036 std::string str;
00037 is >> str;
00038 if (!WifiModeFactory::GetFactory ()->Search (str, &mode))
00039 {
00040 is.setstate (std::ios_base::badbit);
00041 }
00042 return is;
00043 }
00044
00045 uint32_t
00046 WifiMode::GetBandwidth (void) const
00047 {
00048 struct WifiModeFactory::WifiModeItem *item = WifiModeFactory::GetFactory ()->Get (m_uid);
00049 return item->bandwidth;
00050 }
00051 uint32_t
00052 WifiMode::GetPhyRate (void) const
00053 {
00054 struct WifiModeFactory::WifiModeItem *item = WifiModeFactory::GetFactory ()->Get (m_uid);
00055 return item->phyRate;
00056 }
00057 uint32_t
00058 WifiMode::GetDataRate (void) const
00059 {
00060 struct WifiModeFactory::WifiModeItem *item = WifiModeFactory::GetFactory ()->Get (m_uid);
00061 return item->dataRate;
00062 }
00063 bool
00064 WifiMode::IsModulationBpsk (void) const
00065 {
00066 struct WifiModeFactory::WifiModeItem *item = WifiModeFactory::GetFactory ()->Get (m_uid);
00067 return item->modulation == WifiMode::BPSK;
00068 }
00069 bool
00070 WifiMode::IsModulationQam (void) const
00071 {
00072 struct WifiModeFactory::WifiModeItem *item = WifiModeFactory::GetFactory ()->Get (m_uid);
00073 return item->modulation == WifiMode::QAM;
00074 }
00075 enum WifiMode::ModulationType
00076 WifiMode::GetModulationType (void) const
00077 {
00078 struct WifiModeFactory::WifiModeItem *item = WifiModeFactory::GetFactory ()->Get (m_uid);
00079 return item->modulation;
00080 }
00081 uint8_t
00082 WifiMode::GetConstellationSize (void) const
00083 {
00084 struct WifiModeFactory::WifiModeItem *item = WifiModeFactory::GetFactory ()->Get (m_uid);
00085 return item->constellationSize;
00086 }
00087 std::string
00088 WifiMode::GetUniqueName (void) const
00089 {
00090 struct WifiModeFactory::WifiModeItem *item = WifiModeFactory::GetFactory ()->Get (m_uid);
00091 return item->uniqueUid;
00092 }
00093 bool
00094 WifiMode::IsMandatory (void) const
00095 {
00096 struct WifiModeFactory::WifiModeItem *item = WifiModeFactory::GetFactory ()->Get (m_uid);
00097 return item->isMandatory;
00098 }
00099 uint32_t
00100 WifiMode::GetUid (void) const
00101 {
00102 return m_uid;
00103 }
00104 WifiMode::WifiMode ()
00105 : m_uid (0)
00106 {}
00107 WifiMode::WifiMode (uint32_t uid)
00108 : m_uid (uid)
00109 {}
00110 WifiMode::WifiMode (std::string name)
00111 {
00112 if (!WifiModeFactory::GetFactory ()->Search (name, this))
00113 {
00114 NS_FATAL_ERROR ("Invalid requested wifi mode: " << name);
00115 }
00116 }
00117
00118 ATTRIBUTE_HELPER_CPP (WifiMode);
00119
00120 WifiModeFactory::WifiModeFactory ()
00121 {}
00122
00123 WifiMode
00124 WifiModeFactory::CreateBpsk (std::string uniqueName,
00125 bool isMandatory,
00126 uint32_t bandwidth,
00127 uint32_t dataRate,
00128 uint32_t phyRate)
00129 {
00130 WifiModeFactory *factory = GetFactory ();
00131 uint32_t uid = factory->AllocateUid (uniqueName);
00132 WifiModeItem *item = factory->Get (uid);
00133 item->uniqueUid = uniqueName;
00134 item->bandwidth = bandwidth;
00135 item->dataRate = dataRate;
00136 item->phyRate = phyRate;
00137 item->modulation = WifiMode::BPSK;
00138 item->constellationSize = 2;
00139 item->isMandatory = isMandatory;
00140 return WifiMode (uid);
00141 }
00142 WifiMode
00143 WifiModeFactory::CreateQam (std::string uniqueName,
00144 bool isMandatory,
00145 uint32_t bandwidth,
00146 uint32_t dataRate,
00147 uint32_t phyRate,
00148 uint8_t constellationSize)
00149 {
00150 WifiModeFactory *factory = GetFactory ();
00151 uint32_t uid = factory->AllocateUid (uniqueName);
00152 WifiModeItem *item = factory->Get (uid);
00153 item->uniqueUid = uniqueName;
00154 item->bandwidth = bandwidth;
00155 item->dataRate = dataRate;
00156 item->phyRate = phyRate;
00157 item->modulation = WifiMode::QAM;
00158 item->constellationSize = constellationSize;
00159 item->isMandatory = isMandatory;
00160 return WifiMode (uid);
00161 }
00162
00163 bool
00164 WifiModeFactory::Search (std::string name, WifiMode *mode)
00165 {
00166 uint32_t j = 1;
00167 for (WifiModeItemList::const_iterator i = m_itemList.begin ();
00168 i != m_itemList.end (); i++)
00169 {
00170 if (i->uniqueUid == name)
00171 {
00172 *mode = WifiMode (j);
00173 return true;
00174 }
00175 j++;
00176 }
00177 *mode = WifiMode (0);
00178 return false;
00179 }
00180
00181 uint32_t
00182 WifiModeFactory::AllocateUid (std::string uniqueUid)
00183 {
00184 uint32_t j = 1;
00185 for (WifiModeItemList::const_iterator i = m_itemList.begin ();
00186 i != m_itemList.end (); i++)
00187 {
00188 if (i->uniqueUid == uniqueUid)
00189 {
00190 return j;
00191 }
00192 j++;
00193 }
00194 m_itemList.push_back (WifiModeItem ());
00195 uint32_t uid = m_itemList.size ();
00196 return uid;
00197 }
00198
00199 struct WifiModeFactory::WifiModeItem *
00200 WifiModeFactory::Get (uint32_t uid)
00201 {
00202 NS_ASSERT (uid > 0 && uid <= m_itemList.size ());
00203 return &m_itemList[uid - 1];
00204 }
00205
00206 WifiModeFactory *
00207 WifiModeFactory::GetFactory (void)
00208 {
00209 static bool isFirstTime = true;
00210 static WifiModeFactory factory;
00211 if (isFirstTime)
00212 {
00213 factory.AllocateUid ("Invalid-WifiMode");
00214 isFirstTime = false;
00215 }
00216 return &factory;
00217 }
00218
00219 }