phy state logger
authorMathieu Lacage <mathieu.lacage@sophia.inria.fr>
Wed, 31 Oct 2007 12:27:20 +0100
changeset 2055 8899d6ef5d52
parent 2054 ba8e810bae4c
child 2056 013fa0b61714
phy state logger
samples/main-ap-wifi.cc
src/devices/wifi/wifi-net-device.cc
src/devices/wifi/wifi-phy.cc
src/devices/wifi/wifi-phy.h
src/devices/wifi/wscript
--- a/samples/main-ap-wifi.cc	Wed Oct 31 12:05:25 2007 +0100
+++ b/samples/main-ap-wifi.cc	Wed Oct 31 12:27:20 2007 +0100
@@ -20,6 +20,8 @@
 
 #include "ns3/wifi-net-device.h"
 #include "ns3/wifi-channel.h"
+#include "ns3/wifi-phy.h"
+
 #include "ns3/simulator.h"
 #include "ns3/callback.h"
 #include "ns3/ptr.h"
@@ -44,6 +46,26 @@
 {
   std::cout << context << " ad=" << address << " p: " << p << std::endl;
 }
+static void
+WifiPhyStateTrace (const TraceContext &context, Time start, Time duration, enum WifiPhy::State state)
+{
+  std::cout << context << " state=";
+  switch (state) {
+  case WifiPhy::TX:
+    std::cout << "tx      ";
+    break;
+  case WifiPhy::SYNC:
+    std::cout << "sync    ";
+    break;
+  case WifiPhy::CCA_BUSY:
+    std::cout << "cca-busy";
+    break;
+  case WifiPhy::IDLE:
+    std::cout << "idle    ";
+    break;
+  }
+  std::cout << " start="<<start<<" duration="<<duration<<std::endl;
+}
 
 static Ptr<Node>
 CreateApNode (Ptr<WifiChannel> channel,
@@ -165,6 +187,7 @@
   GlobalRouteManager::PopulateRoutingTables ();
 
   NodeList::Connect ("/nodes/*/devices/*/*", MakeCallback (&WifiNetDeviceTrace));
+  NodeList::Connect ("/nodes/*/devices/*/phy/state", MakeCallback (&WifiPhyStateTrace));
 
   Simulator::Run ();
 
--- a/src/devices/wifi/wifi-net-device.cc	Wed Oct 31 12:05:25 2007 +0100
+++ b/src/devices/wifi/wifi-net-device.cc	Wed Oct 31 12:27:20 2007 +0100
@@ -221,6 +221,7 @@
                                  "Mac48Address", "the destination of the packet"),
                        m_txLogger,
                        WifiNetDeviceTraceType (WifiNetDeviceTraceType::TX));
+  resolver->AddComposite ("phy", m_phy);
   resolver->SetParentResolver (NetDevice::GetTraceResolver ());
   return resolver;
 }
--- a/src/devices/wifi/wifi-phy.cc	Wed Oct 31 12:05:25 2007 +0100
+++ b/src/devices/wifi/wifi-phy.cc	Wed Oct 31 12:27:20 2007 +0100
@@ -29,6 +29,7 @@
 #include "ns3/random-variable.h"
 #include "ns3/assert.h"
 #include "ns3/log.h"
+#include "ns3/composite-trace-resolver.h"
 #include <math.h>
 
 NS_LOG_COMPONENT_DEFINE ("WifiPhy");
@@ -203,6 +204,20 @@
   m_modes.clear ();
 }
 
+Ptr<TraceResolver> 
+WifiPhy::GetTraceResolver (void) const
+{
+  Ptr<CompositeTraceResolver> resolver =
+    Create<CompositeTraceResolver> ();
+  resolver->AddSource ("state",
+                       TraceDoc ("The WifiPhy state",
+                                 "Time", "start time",
+                                 "Time", "duration", 
+                                 "enum WifiPhy::State", "the state of the PHY layer."),
+                       m_stateLogger);
+  resolver->SetParentResolver (Object::GetTraceResolver ());
+  return resolver;
+}
 
 
 void 
@@ -494,7 +509,7 @@
 }
 
 char const *
-WifiPhy::StateToString (enum WifiPhyState state)
+WifiPhy::StateToString (enum State state)
 {
   switch (state) {
   case TX:
@@ -514,7 +529,7 @@
     break;
   }
 }
-enum WifiPhy::WifiPhyState 
+enum WifiPhy::State 
 WifiPhy::GetState (void)
 {
   if (m_endTx > Simulator::Now ()) 
@@ -617,9 +632,9 @@
       m_endCcaBusy > m_endTx) {
     Time ccaBusyStart = Max (m_endTx, m_endSync);
     ccaBusyStart = Max (ccaBusyStart, m_startCcaBusy);
-    m_stateLogger (ccaBusyStart, idleStart - ccaBusyStart, 2);
+    m_stateLogger (ccaBusyStart, idleStart - ccaBusyStart, WifiPhy::CCA_BUSY);
   }
-  m_stateLogger (idleStart, now - idleStart, 3);
+  m_stateLogger (idleStart, now - idleStart, WifiPhy::IDLE);
 }
 
 void
@@ -632,12 +647,12 @@
      * as its endSync event are cancelled by the caller.
      */
     m_syncing = false;
-    m_stateLogger (m_startSync, now - m_startSync, 1);
+    m_stateLogger (m_startSync, now - m_startSync, WifiPhy::SYNC);
     break;
   case WifiPhy::CCA_BUSY: {
     Time ccaStart = Max (m_endSync, m_endTx);
     ccaStart = Max (ccaStart, m_startCcaBusy);
-    m_stateLogger (ccaStart, now - ccaStart, 2);
+    m_stateLogger (ccaStart, now - ccaStart, WifiPhy::CCA_BUSY);
   } break;
   case WifiPhy::IDLE:
     LogPreviousIdleAndCcaBusyStates ();
@@ -646,7 +661,7 @@
     NS_ASSERT (false);
     break;
   }
-  m_stateLogger (now, txDuration, 0);
+  m_stateLogger (now, txDuration, WifiPhy::TX);
   m_previousStateChangeTime = now;
   m_endTx = now + txDuration;
   m_startTx = now;
@@ -664,7 +679,7 @@
   case WifiPhy::CCA_BUSY: {
     Time ccaStart = Max (m_endSync, m_endTx);
     ccaStart = Max (ccaStart, m_startCcaBusy);
-    m_stateLogger (ccaStart, now - ccaStart, 2);
+    m_stateLogger (ccaStart, now - ccaStart, WifiPhy::CCA_BUSY);
   } break;
   case WifiPhy::SYNC:
   case WifiPhy::TX:
@@ -684,7 +699,7 @@
   NS_ASSERT (m_syncing);
 
   Time now = Simulator::Now ();
-  m_stateLogger (m_startSync, now - m_startSync, 1);
+  m_stateLogger (m_startSync, now - m_startSync, WifiPhy::SYNC);
   m_previousStateChangeTime = now;
   m_syncing = false;
 
--- a/src/devices/wifi/wifi-phy.h	Wed Oct 31 12:05:25 2007 +0100
+++ b/src/devices/wifi/wifi-phy.h	Wed Oct 31 12:27:20 2007 +0100
@@ -72,6 +72,12 @@
 class WifiPhy : public Object
 {
 public:
+  enum State {
+    SYNC,
+    TX,
+    CCA_BUSY,
+    IDLE
+  };
   typedef Callback<void,Packet, double, WifiMode, enum WifiPreamble> SyncOkCallback;
   typedef Callback<void,Packet, double> SyncErrorCallback;
 
@@ -105,12 +111,6 @@
   double CalculateSnr (WifiMode txMode, double ber) const;
 
 private:
-  enum WifiPhyState {
-    SYNC,
-    TX,
-    CCA_BUSY,
-    IDLE
-  };
   class NiChange {
   public:
     NiChange (Time time, double delta);
@@ -126,10 +126,12 @@
   typedef std::list<Ptr<RxEvent> > Events;
   typedef std::vector <NiChange> NiChanges;
 
-private:  
+private:
+  // inherited from ns3::Object.
+  virtual Ptr<TraceResolver> GetTraceResolver (void) const;
   void Configure80211a (void);
-  char const *StateToString (enum WifiPhyState state);
-  enum WifiPhyState GetState (void);
+  char const *StateToString (enum State state);
+  enum WifiPhy::State GetState (void);
   double GetEdThresholdW (void) const;
   double DbmToW (double dbm) const;
   double DbToRatio (double db) const;
@@ -236,12 +238,7 @@
    * Invoked whenever we send the first bit of a signal.
    */
   CallbackTraceSource<Time, uint32_t, double> m_startTxLogger;
-  /* 80211-phy-state
-   * param1: Start
-   * param2: Duration
-   * param3: state: 0 -> TX, 1 -> SYNC, 2 -> CCA, 3 -> IDLE
-   */
-  CallbackTraceSource<Time,Time,uint8_t> m_stateLogger;
+  CallbackTraceSource<Time,Time,enum WifiPhy::State> m_stateLogger;
 };
 
 } // namespace ns3
--- a/src/devices/wifi/wscript	Wed Oct 31 12:05:25 2007 +0100
+++ b/src/devices/wifi/wscript	Wed Oct 31 12:27:20 2007 +0100
@@ -41,4 +41,5 @@
         'wifi-mode.h',
         'ssid.h',
         'wifi-preamble.h',
+        'wifi-phy.h',
         ]