src/devices/wifi/wifi-phy-state-helper.cc
author Pavel Boyko <boyko@iitp.ru>
Tue, 16 Jun 2009 17:58:16 +0400
changeset 5074 355de6af8ea9
parent 3905 99c9346b5d71
child 5189 8fcdf87a790a
permissions -rw-r--r--
merged with nsnam
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
3898
0d0517e7a557 add missing license headers
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 3897
diff changeset
     1
/* -*-  Mode: C++; c-file-style: "gnu"; indent-tabs-mode:nil; -*- */
0d0517e7a557 add missing license headers
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 3897
diff changeset
     2
/*
0d0517e7a557 add missing license headers
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 3897
diff changeset
     3
 * Copyright (c) 2005,2006 INRIA
0d0517e7a557 add missing license headers
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 3897
diff changeset
     4
 *
0d0517e7a557 add missing license headers
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 3897
diff changeset
     5
 * This program is free software; you can redistribute it and/or modify
0d0517e7a557 add missing license headers
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 3897
diff changeset
     6
 * it under the terms of the GNU General Public License version 2 as 
0d0517e7a557 add missing license headers
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 3897
diff changeset
     7
 * published by the Free Software Foundation;
0d0517e7a557 add missing license headers
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 3897
diff changeset
     8
 *
0d0517e7a557 add missing license headers
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 3897
diff changeset
     9
 * This program is distributed in the hope that it will be useful,
0d0517e7a557 add missing license headers
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 3897
diff changeset
    10
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
0d0517e7a557 add missing license headers
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 3897
diff changeset
    11
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
0d0517e7a557 add missing license headers
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 3897
diff changeset
    12
 * GNU General Public License for more details.
0d0517e7a557 add missing license headers
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 3897
diff changeset
    13
 *
0d0517e7a557 add missing license headers
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 3897
diff changeset
    14
 * You should have received a copy of the GNU General Public License
0d0517e7a557 add missing license headers
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 3897
diff changeset
    15
 * along with this program; if not, write to the Free Software
0d0517e7a557 add missing license headers
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 3897
diff changeset
    16
 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
0d0517e7a557 add missing license headers
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 3897
diff changeset
    17
 *
0d0517e7a557 add missing license headers
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 3897
diff changeset
    18
 * Author: Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
0d0517e7a557 add missing license headers
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 3897
diff changeset
    19
 */
3897
44645cec42f2 split state management in a helper class
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    20
#include "wifi-phy-state-helper.h"
44645cec42f2 split state management in a helper class
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    21
#include "ns3/log.h"
44645cec42f2 split state management in a helper class
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    22
#include "ns3/simulator.h"
3900
1687492ff059 re-enable tracing of wifi phy state.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 3899
diff changeset
    23
#include "ns3/trace-source-accessor.h"
3897
44645cec42f2 split state management in a helper class
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    24
44645cec42f2 split state management in a helper class
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    25
NS_LOG_COMPONENT_DEFINE ("WifiPhyStateHelper");
44645cec42f2 split state management in a helper class
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    26
44645cec42f2 split state management in a helper class
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    27
namespace ns3 {
44645cec42f2 split state management in a helper class
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    28
3905
99c9346b5d71 split interference calculation from YansWifiPhy. Move them to InterferenceHelper
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 3900
diff changeset
    29
NS_OBJECT_ENSURE_REGISTERED (WifiPhyStateHelper);
99c9346b5d71 split interference calculation from YansWifiPhy. Move them to InterferenceHelper
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 3900
diff changeset
    30
3900
1687492ff059 re-enable tracing of wifi phy state.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 3899
diff changeset
    31
TypeId 
1687492ff059 re-enable tracing of wifi phy state.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 3899
diff changeset
    32
WifiPhyStateHelper::GetTypeId (void)
1687492ff059 re-enable tracing of wifi phy state.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 3899
diff changeset
    33
{
1687492ff059 re-enable tracing of wifi phy state.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 3899
diff changeset
    34
  static TypeId tid = TypeId ("ns3::WifiPhyStateHelper")
1687492ff059 re-enable tracing of wifi phy state.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 3899
diff changeset
    35
    .SetParent<Object> ()
1687492ff059 re-enable tracing of wifi phy state.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 3899
diff changeset
    36
    .AddConstructor<WifiPhyStateHelper> ()
1687492ff059 re-enable tracing of wifi phy state.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 3899
diff changeset
    37
    .AddTraceSource ("State",
1687492ff059 re-enable tracing of wifi phy state.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 3899
diff changeset
    38
                     "The state of the PHY layer",
1687492ff059 re-enable tracing of wifi phy state.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 3899
diff changeset
    39
                     MakeTraceSourceAccessor (&WifiPhyStateHelper::m_stateLogger))
1687492ff059 re-enable tracing of wifi phy state.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 3899
diff changeset
    40
    .AddTraceSource ("RxOk",
1687492ff059 re-enable tracing of wifi phy state.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 3899
diff changeset
    41
                     "A packet has been received successfully.",
1687492ff059 re-enable tracing of wifi phy state.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 3899
diff changeset
    42
                     MakeTraceSourceAccessor (&WifiPhyStateHelper::m_rxOkTrace))
1687492ff059 re-enable tracing of wifi phy state.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 3899
diff changeset
    43
    .AddTraceSource ("RxError",
1687492ff059 re-enable tracing of wifi phy state.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 3899
diff changeset
    44
                     "A packet has been received unsuccessfully.",
1687492ff059 re-enable tracing of wifi phy state.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 3899
diff changeset
    45
                     MakeTraceSourceAccessor (&WifiPhyStateHelper::m_rxErrorTrace))
1687492ff059 re-enable tracing of wifi phy state.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 3899
diff changeset
    46
    .AddTraceSource ("Tx", "Packet transmission is starting.",
1687492ff059 re-enable tracing of wifi phy state.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 3899
diff changeset
    47
                     MakeTraceSourceAccessor (&WifiPhyStateHelper::m_txTrace))
1687492ff059 re-enable tracing of wifi phy state.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 3899
diff changeset
    48
    ;
1687492ff059 re-enable tracing of wifi phy state.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 3899
diff changeset
    49
  return tid;
1687492ff059 re-enable tracing of wifi phy state.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 3899
diff changeset
    50
}
1687492ff059 re-enable tracing of wifi phy state.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 3899
diff changeset
    51
3897
44645cec42f2 split state management in a helper class
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    52
WifiPhyStateHelper::WifiPhyStateHelper ()
44645cec42f2 split state management in a helper class
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    53
  : m_syncing (false),
44645cec42f2 split state management in a helper class
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    54
    m_endTx (Seconds (0)),
44645cec42f2 split state management in a helper class
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    55
    m_endSync (Seconds (0)),
44645cec42f2 split state management in a helper class
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    56
    m_endCcaBusy (Seconds (0)),
44645cec42f2 split state management in a helper class
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    57
    m_startTx (Seconds (0)),
44645cec42f2 split state management in a helper class
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    58
    m_startSync (Seconds (0)),
44645cec42f2 split state management in a helper class
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    59
    m_startCcaBusy (Seconds (0)),
44645cec42f2 split state management in a helper class
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    60
    m_previousStateChangeTime (Seconds (0))
44645cec42f2 split state management in a helper class
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    61
{
44645cec42f2 split state management in a helper class
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    62
  NS_LOG_FUNCTION (this);
44645cec42f2 split state management in a helper class
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    63
}
44645cec42f2 split state management in a helper class
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    64
44645cec42f2 split state management in a helper class
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    65
void 
44645cec42f2 split state management in a helper class
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    66
WifiPhyStateHelper::SetReceiveOkCallback (WifiPhy::SyncOkCallback callback)
44645cec42f2 split state management in a helper class
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    67
{
44645cec42f2 split state management in a helper class
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    68
  m_syncOkCallback = callback;
44645cec42f2 split state management in a helper class
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    69
}
44645cec42f2 split state management in a helper class
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    70
void 
44645cec42f2 split state management in a helper class
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    71
WifiPhyStateHelper::SetReceiveErrorCallback (WifiPhy::SyncErrorCallback callback)
44645cec42f2 split state management in a helper class
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    72
{
44645cec42f2 split state management in a helper class
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    73
  m_syncErrorCallback = callback;
44645cec42f2 split state management in a helper class
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    74
}
44645cec42f2 split state management in a helper class
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    75
void 
44645cec42f2 split state management in a helper class
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    76
WifiPhyStateHelper::RegisterListener (WifiPhyListener *listener)
44645cec42f2 split state management in a helper class
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    77
{
44645cec42f2 split state management in a helper class
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    78
  m_listeners.push_back (listener);
44645cec42f2 split state management in a helper class
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    79
}
44645cec42f2 split state management in a helper class
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    80
44645cec42f2 split state management in a helper class
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    81
bool 
44645cec42f2 split state management in a helper class
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    82
WifiPhyStateHelper::IsStateCcaBusy (void)
44645cec42f2 split state management in a helper class
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    83
{
44645cec42f2 split state management in a helper class
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    84
  return GetState () == WifiPhy::CCA_BUSY;
44645cec42f2 split state management in a helper class
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    85
}
44645cec42f2 split state management in a helper class
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    86
 
44645cec42f2 split state management in a helper class
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    87
bool 
44645cec42f2 split state management in a helper class
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    88
WifiPhyStateHelper::IsStateIdle (void)
44645cec42f2 split state management in a helper class
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    89
{
44645cec42f2 split state management in a helper class
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    90
  return (GetState () == WifiPhy::IDLE)?true:false;
44645cec42f2 split state management in a helper class
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    91
}
44645cec42f2 split state management in a helper class
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    92
bool 
44645cec42f2 split state management in a helper class
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    93
WifiPhyStateHelper::IsStateBusy (void)
44645cec42f2 split state management in a helper class
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    94
{
44645cec42f2 split state management in a helper class
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    95
  return (GetState () != WifiPhy::IDLE)?true:false;
44645cec42f2 split state management in a helper class
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    96
}
44645cec42f2 split state management in a helper class
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    97
bool 
44645cec42f2 split state management in a helper class
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    98
WifiPhyStateHelper::IsStateSync (void)
44645cec42f2 split state management in a helper class
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    99
{
44645cec42f2 split state management in a helper class
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   100
  return (GetState () == WifiPhy::SYNC)?true:false;
44645cec42f2 split state management in a helper class
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   101
}
44645cec42f2 split state management in a helper class
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   102
bool 
44645cec42f2 split state management in a helper class
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   103
WifiPhyStateHelper::IsStateTx (void)
44645cec42f2 split state management in a helper class
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   104
{
44645cec42f2 split state management in a helper class
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   105
  return (GetState () == WifiPhy::TX)?true:false;
44645cec42f2 split state management in a helper class
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   106
}
44645cec42f2 split state management in a helper class
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   107
44645cec42f2 split state management in a helper class
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   108
44645cec42f2 split state management in a helper class
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   109
44645cec42f2 split state management in a helper class
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   110
Time
44645cec42f2 split state management in a helper class
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   111
WifiPhyStateHelper::GetStateDuration (void)
44645cec42f2 split state management in a helper class
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   112
{
44645cec42f2 split state management in a helper class
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   113
  return Simulator::Now () - m_previousStateChangeTime;
44645cec42f2 split state management in a helper class
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   114
}
44645cec42f2 split state management in a helper class
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   115
44645cec42f2 split state management in a helper class
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   116
Time
44645cec42f2 split state management in a helper class
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   117
WifiPhyStateHelper::GetDelayUntilIdle (void)
44645cec42f2 split state management in a helper class
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   118
{
44645cec42f2 split state management in a helper class
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   119
  Time retval;
44645cec42f2 split state management in a helper class
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   120
44645cec42f2 split state management in a helper class
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   121
  switch (GetState ()) {
44645cec42f2 split state management in a helper class
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   122
  case WifiPhy::SYNC:
44645cec42f2 split state management in a helper class
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   123
    retval = m_endSync - Simulator::Now ();
44645cec42f2 split state management in a helper class
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   124
    break;
44645cec42f2 split state management in a helper class
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   125
  case WifiPhy::TX:
44645cec42f2 split state management in a helper class
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   126
    retval = m_endTx - Simulator::Now ();
44645cec42f2 split state management in a helper class
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   127
    break;
44645cec42f2 split state management in a helper class
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   128
  case WifiPhy::CCA_BUSY:
44645cec42f2 split state management in a helper class
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   129
    retval = m_endCcaBusy - Simulator::Now ();
44645cec42f2 split state management in a helper class
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   130
    break;
44645cec42f2 split state management in a helper class
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   131
  case WifiPhy::IDLE:
44645cec42f2 split state management in a helper class
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   132
    retval = Seconds (0);
44645cec42f2 split state management in a helper class
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   133
    break;
44645cec42f2 split state management in a helper class
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   134
  default:
44645cec42f2 split state management in a helper class
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   135
    NS_ASSERT (false);
44645cec42f2 split state management in a helper class
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   136
    // NOTREACHED
44645cec42f2 split state management in a helper class
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   137
    retval = Seconds (0);
44645cec42f2 split state management in a helper class
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   138
    break;
44645cec42f2 split state management in a helper class
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   139
  }
44645cec42f2 split state management in a helper class
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   140
  retval = Max (retval, Seconds (0));
44645cec42f2 split state management in a helper class
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   141
  return retval;
44645cec42f2 split state management in a helper class
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   142
}
44645cec42f2 split state management in a helper class
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   143
44645cec42f2 split state management in a helper class
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   144
Time 
44645cec42f2 split state management in a helper class
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   145
WifiPhyStateHelper::GetLastRxStartTime (void) const
44645cec42f2 split state management in a helper class
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   146
{
44645cec42f2 split state management in a helper class
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   147
  return m_startSync;
44645cec42f2 split state management in a helper class
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   148
}
44645cec42f2 split state management in a helper class
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   149
44645cec42f2 split state management in a helper class
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   150
char const *
44645cec42f2 split state management in a helper class
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   151
WifiPhyStateHelper::StateToString (enum WifiPhy::State state)
44645cec42f2 split state management in a helper class
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   152
{
44645cec42f2 split state management in a helper class
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   153
  switch (state) {
44645cec42f2 split state management in a helper class
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   154
  case WifiPhy::TX:
44645cec42f2 split state management in a helper class
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   155
    return "TX";
44645cec42f2 split state management in a helper class
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   156
    break;
44645cec42f2 split state management in a helper class
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   157
  case WifiPhy::CCA_BUSY:
44645cec42f2 split state management in a helper class
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   158
    return "CCA_BUSY";
44645cec42f2 split state management in a helper class
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   159
    break;
44645cec42f2 split state management in a helper class
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   160
  case WifiPhy::IDLE:
44645cec42f2 split state management in a helper class
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   161
    return "IDLE";
44645cec42f2 split state management in a helper class
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   162
    break;
44645cec42f2 split state management in a helper class
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   163
  case WifiPhy::SYNC:
44645cec42f2 split state management in a helper class
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   164
    return "SYNC";
44645cec42f2 split state management in a helper class
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   165
    break;
44645cec42f2 split state management in a helper class
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   166
  default:
44645cec42f2 split state management in a helper class
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   167
    NS_ASSERT (false);
44645cec42f2 split state management in a helper class
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   168
    // quiet compiler
44645cec42f2 split state management in a helper class
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   169
    return "INVALID";
44645cec42f2 split state management in a helper class
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   170
    break;
44645cec42f2 split state management in a helper class
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   171
  }
44645cec42f2 split state management in a helper class
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   172
}
44645cec42f2 split state management in a helper class
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   173
44645cec42f2 split state management in a helper class
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   174
enum WifiPhy::State 
44645cec42f2 split state management in a helper class
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   175
WifiPhyStateHelper::GetState (void)
44645cec42f2 split state management in a helper class
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   176
{
44645cec42f2 split state management in a helper class
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   177
  if (m_endTx > Simulator::Now ()) 
44645cec42f2 split state management in a helper class
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   178
    {
44645cec42f2 split state management in a helper class
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   179
      return WifiPhy::TX;
44645cec42f2 split state management in a helper class
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   180
    } 
44645cec42f2 split state management in a helper class
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   181
  else if (m_syncing) 
44645cec42f2 split state management in a helper class
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   182
    {
44645cec42f2 split state management in a helper class
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   183
      return WifiPhy::SYNC;
44645cec42f2 split state management in a helper class
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   184
    } 
44645cec42f2 split state management in a helper class
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   185
  else if (m_endCcaBusy > Simulator::Now ()) 
44645cec42f2 split state management in a helper class
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   186
    {
44645cec42f2 split state management in a helper class
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   187
      return WifiPhy::CCA_BUSY;
44645cec42f2 split state management in a helper class
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   188
    } 
44645cec42f2 split state management in a helper class
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   189
  else 
44645cec42f2 split state management in a helper class
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   190
    {
44645cec42f2 split state management in a helper class
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   191
      return WifiPhy::IDLE;
44645cec42f2 split state management in a helper class
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   192
    }
44645cec42f2 split state management in a helper class
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   193
}
44645cec42f2 split state management in a helper class
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   194
44645cec42f2 split state management in a helper class
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   195
44645cec42f2 split state management in a helper class
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   196
void 
44645cec42f2 split state management in a helper class
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   197
WifiPhyStateHelper::NotifyTxStart (Time duration)
44645cec42f2 split state management in a helper class
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   198
{
44645cec42f2 split state management in a helper class
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   199
  for (Listeners::const_iterator i = m_listeners.begin (); i != m_listeners.end (); i++) {
44645cec42f2 split state management in a helper class
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   200
    (*i)->NotifyTxStart (duration);
44645cec42f2 split state management in a helper class
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   201
  }
44645cec42f2 split state management in a helper class
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   202
}
44645cec42f2 split state management in a helper class
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   203
void 
44645cec42f2 split state management in a helper class
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   204
WifiPhyStateHelper::NotifySyncStart (Time duration)
44645cec42f2 split state management in a helper class
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   205
{
44645cec42f2 split state management in a helper class
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   206
  for (Listeners::const_iterator i = m_listeners.begin (); i != m_listeners.end (); i++) {
44645cec42f2 split state management in a helper class
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   207
    (*i)->NotifyRxStart (duration);
44645cec42f2 split state management in a helper class
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   208
  }
44645cec42f2 split state management in a helper class
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   209
}
44645cec42f2 split state management in a helper class
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   210
void 
44645cec42f2 split state management in a helper class
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   211
WifiPhyStateHelper::NotifySyncEndOk (void)
44645cec42f2 split state management in a helper class
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   212
{
44645cec42f2 split state management in a helper class
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   213
  for (Listeners::const_iterator i = m_listeners.begin (); i != m_listeners.end (); i++) {
44645cec42f2 split state management in a helper class
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   214
    (*i)->NotifyRxEndOk ();
44645cec42f2 split state management in a helper class
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   215
  }
44645cec42f2 split state management in a helper class
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   216
}
44645cec42f2 split state management in a helper class
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   217
void 
44645cec42f2 split state management in a helper class
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   218
WifiPhyStateHelper::NotifySyncEndError (void)
44645cec42f2 split state management in a helper class
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   219
{
44645cec42f2 split state management in a helper class
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   220
  for (Listeners::const_iterator i = m_listeners.begin (); i != m_listeners.end (); i++) {
44645cec42f2 split state management in a helper class
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   221
    (*i)->NotifyRxEndError ();
44645cec42f2 split state management in a helper class
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   222
  }
44645cec42f2 split state management in a helper class
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   223
}
44645cec42f2 split state management in a helper class
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   224
void 
3905
99c9346b5d71 split interference calculation from YansWifiPhy. Move them to InterferenceHelper
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 3900
diff changeset
   225
WifiPhyStateHelper::NotifyMaybeCcaBusyStart (Time duration)
3897
44645cec42f2 split state management in a helper class
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   226
{
44645cec42f2 split state management in a helper class
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   227
  for (Listeners::const_iterator i = m_listeners.begin (); i != m_listeners.end (); i++) {
3905
99c9346b5d71 split interference calculation from YansWifiPhy. Move them to InterferenceHelper
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 3900
diff changeset
   228
    (*i)->NotifyMaybeCcaBusyStart (duration);
3897
44645cec42f2 split state management in a helper class
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   229
  }
44645cec42f2 split state management in a helper class
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   230
}
44645cec42f2 split state management in a helper class
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   231
44645cec42f2 split state management in a helper class
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   232
void
44645cec42f2 split state management in a helper class
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   233
WifiPhyStateHelper::LogPreviousIdleAndCcaBusyStates (void)
44645cec42f2 split state management in a helper class
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   234
{
44645cec42f2 split state management in a helper class
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   235
  Time now = Simulator::Now ();
44645cec42f2 split state management in a helper class
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   236
  Time idleStart = Max (m_endCcaBusy, m_endSync);
44645cec42f2 split state management in a helper class
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   237
  idleStart = Max (idleStart, m_endTx);
44645cec42f2 split state management in a helper class
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   238
  NS_ASSERT (idleStart <= now);
44645cec42f2 split state management in a helper class
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   239
  if (m_endCcaBusy > m_endSync && 
44645cec42f2 split state management in a helper class
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   240
      m_endCcaBusy > m_endTx) {
44645cec42f2 split state management in a helper class
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   241
    Time ccaBusyStart = Max (m_endTx, m_endSync);
44645cec42f2 split state management in a helper class
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   242
    ccaBusyStart = Max (ccaBusyStart, m_startCcaBusy);
44645cec42f2 split state management in a helper class
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   243
    m_stateLogger (ccaBusyStart, idleStart - ccaBusyStart, WifiPhy::CCA_BUSY);
44645cec42f2 split state management in a helper class
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   244
  }
44645cec42f2 split state management in a helper class
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   245
  m_stateLogger (idleStart, now - idleStart, WifiPhy::IDLE);
44645cec42f2 split state management in a helper class
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   246
}
44645cec42f2 split state management in a helper class
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   247
44645cec42f2 split state management in a helper class
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   248
void
44645cec42f2 split state management in a helper class
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   249
WifiPhyStateHelper::SwitchToTx (Time txDuration, Ptr<const Packet> packet, WifiMode txMode, 
44645cec42f2 split state management in a helper class
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   250
			  WifiPreamble preamble, uint8_t txPower)
44645cec42f2 split state management in a helper class
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   251
{
44645cec42f2 split state management in a helper class
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   252
  m_txTrace (packet, txMode, preamble, txPower);
44645cec42f2 split state management in a helper class
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   253
  NotifyTxStart (txDuration);
44645cec42f2 split state management in a helper class
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   254
  Time now = Simulator::Now ();
44645cec42f2 split state management in a helper class
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   255
  switch (GetState ()) {
44645cec42f2 split state management in a helper class
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   256
  case WifiPhy::SYNC:
44645cec42f2 split state management in a helper class
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   257
    /* The packet which is being received as well
44645cec42f2 split state management in a helper class
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   258
     * as its endSync event are cancelled by the caller.
44645cec42f2 split state management in a helper class
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   259
     */
44645cec42f2 split state management in a helper class
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   260
    m_syncing = false;
44645cec42f2 split state management in a helper class
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   261
    m_stateLogger (m_startSync, now - m_startSync, WifiPhy::SYNC);
44645cec42f2 split state management in a helper class
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   262
    m_endSync = now;
44645cec42f2 split state management in a helper class
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   263
    break;
44645cec42f2 split state management in a helper class
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   264
  case WifiPhy::CCA_BUSY: {
44645cec42f2 split state management in a helper class
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   265
    Time ccaStart = Max (m_endSync, m_endTx);
44645cec42f2 split state management in a helper class
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   266
    ccaStart = Max (ccaStart, m_startCcaBusy);
44645cec42f2 split state management in a helper class
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   267
    m_stateLogger (ccaStart, now - ccaStart, WifiPhy::CCA_BUSY);
44645cec42f2 split state management in a helper class
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   268
  } break;
44645cec42f2 split state management in a helper class
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   269
  case WifiPhy::IDLE:
44645cec42f2 split state management in a helper class
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   270
    LogPreviousIdleAndCcaBusyStates ();
44645cec42f2 split state management in a helper class
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   271
    break;
44645cec42f2 split state management in a helper class
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   272
  default:
44645cec42f2 split state management in a helper class
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   273
    NS_ASSERT (false);
44645cec42f2 split state management in a helper class
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   274
    break;
44645cec42f2 split state management in a helper class
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   275
  }
44645cec42f2 split state management in a helper class
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   276
  m_stateLogger (now, txDuration, WifiPhy::TX);
44645cec42f2 split state management in a helper class
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   277
  m_previousStateChangeTime = now;
44645cec42f2 split state management in a helper class
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   278
  m_endTx = now + txDuration;
44645cec42f2 split state management in a helper class
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   279
  m_startTx = now;
44645cec42f2 split state management in a helper class
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   280
}
44645cec42f2 split state management in a helper class
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   281
void
44645cec42f2 split state management in a helper class
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   282
WifiPhyStateHelper::SwitchToSync (Time rxDuration)
44645cec42f2 split state management in a helper class
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   283
{
44645cec42f2 split state management in a helper class
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   284
  NS_ASSERT (IsStateIdle () || IsStateCcaBusy ());
44645cec42f2 split state management in a helper class
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   285
  NS_ASSERT (!m_syncing);
44645cec42f2 split state management in a helper class
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   286
  NotifySyncStart (rxDuration);
44645cec42f2 split state management in a helper class
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   287
  Time now = Simulator::Now ();
44645cec42f2 split state management in a helper class
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   288
  switch (GetState ()) {
44645cec42f2 split state management in a helper class
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   289
  case WifiPhy::IDLE:
44645cec42f2 split state management in a helper class
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   290
    LogPreviousIdleAndCcaBusyStates ();
44645cec42f2 split state management in a helper class
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   291
    break;
44645cec42f2 split state management in a helper class
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   292
  case WifiPhy::CCA_BUSY: {
44645cec42f2 split state management in a helper class
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   293
    Time ccaStart = Max (m_endSync, m_endTx);
44645cec42f2 split state management in a helper class
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   294
    ccaStart = Max (ccaStart, m_startCcaBusy);
44645cec42f2 split state management in a helper class
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   295
    m_stateLogger (ccaStart, now - ccaStart, WifiPhy::CCA_BUSY);
44645cec42f2 split state management in a helper class
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   296
  } break;
44645cec42f2 split state management in a helper class
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   297
  case WifiPhy::SYNC:
44645cec42f2 split state management in a helper class
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   298
  case WifiPhy::TX:
44645cec42f2 split state management in a helper class
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   299
    NS_ASSERT (false);
44645cec42f2 split state management in a helper class
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   300
    break;
44645cec42f2 split state management in a helper class
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   301
  }
44645cec42f2 split state management in a helper class
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   302
  m_previousStateChangeTime = now;
44645cec42f2 split state management in a helper class
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   303
  m_syncing = true;
44645cec42f2 split state management in a helper class
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   304
  m_startSync = now;
44645cec42f2 split state management in a helper class
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   305
  m_endSync = now + rxDuration;
44645cec42f2 split state management in a helper class
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   306
  NS_ASSERT (IsStateSync ());
44645cec42f2 split state management in a helper class
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   307
}
44645cec42f2 split state management in a helper class
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   308
void 
44645cec42f2 split state management in a helper class
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   309
WifiPhyStateHelper::SwitchFromSyncEndOk (Ptr<Packet> packet, double snr, WifiMode mode, enum WifiPreamble preamble)
44645cec42f2 split state management in a helper class
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   310
{
44645cec42f2 split state management in a helper class
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   311
  m_rxOkTrace (packet, snr, mode, preamble);
44645cec42f2 split state management in a helper class
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   312
  NotifySyncEndOk ();
44645cec42f2 split state management in a helper class
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   313
  DoSwitchFromSync ();
44645cec42f2 split state management in a helper class
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   314
  if (!m_syncOkCallback.IsNull ())
44645cec42f2 split state management in a helper class
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   315
    {
44645cec42f2 split state management in a helper class
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   316
      m_syncOkCallback (packet, snr, mode, preamble);
44645cec42f2 split state management in a helper class
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   317
    }
44645cec42f2 split state management in a helper class
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   318
44645cec42f2 split state management in a helper class
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   319
}
44645cec42f2 split state management in a helper class
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   320
void 
44645cec42f2 split state management in a helper class
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   321
WifiPhyStateHelper::SwitchFromSyncEndError (Ptr<const Packet> packet, double snr)
44645cec42f2 split state management in a helper class
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   322
{
44645cec42f2 split state management in a helper class
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   323
  m_rxErrorTrace (packet, snr);
44645cec42f2 split state management in a helper class
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   324
  NotifySyncEndError ();
44645cec42f2 split state management in a helper class
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   325
  DoSwitchFromSync ();
44645cec42f2 split state management in a helper class
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   326
  if (!m_syncErrorCallback.IsNull ())
44645cec42f2 split state management in a helper class
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   327
    {
3899
804d92c1f7c3 constify
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 3898
diff changeset
   328
      m_syncErrorCallback (packet, snr);
3897
44645cec42f2 split state management in a helper class
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   329
    }
44645cec42f2 split state management in a helper class
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   330
}
44645cec42f2 split state management in a helper class
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   331
44645cec42f2 split state management in a helper class
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   332
void
44645cec42f2 split state management in a helper class
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   333
WifiPhyStateHelper::DoSwitchFromSync (void)
44645cec42f2 split state management in a helper class
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   334
{
44645cec42f2 split state management in a helper class
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   335
  NS_ASSERT (IsStateSync ());
44645cec42f2 split state management in a helper class
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   336
  NS_ASSERT (m_syncing);
44645cec42f2 split state management in a helper class
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   337
44645cec42f2 split state management in a helper class
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   338
  Time now = Simulator::Now ();
44645cec42f2 split state management in a helper class
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   339
  m_stateLogger (m_startSync, now - m_startSync, WifiPhy::SYNC);
44645cec42f2 split state management in a helper class
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   340
  m_previousStateChangeTime = now;
44645cec42f2 split state management in a helper class
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   341
  m_syncing = false;
44645cec42f2 split state management in a helper class
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   342
44645cec42f2 split state management in a helper class
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   343
  NS_ASSERT (IsStateIdle () || IsStateCcaBusy ());
44645cec42f2 split state management in a helper class
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   344
}
44645cec42f2 split state management in a helper class
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   345
void
44645cec42f2 split state management in a helper class
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   346
WifiPhyStateHelper::SwitchMaybeToCcaBusy (Time duration)
44645cec42f2 split state management in a helper class
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   347
{
3905
99c9346b5d71 split interference calculation from YansWifiPhy. Move them to InterferenceHelper
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 3900
diff changeset
   348
  NotifyMaybeCcaBusyStart (duration);
3897
44645cec42f2 split state management in a helper class
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   349
  Time now = Simulator::Now ();
44645cec42f2 split state management in a helper class
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   350
  switch (GetState ()) {
44645cec42f2 split state management in a helper class
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   351
  case WifiPhy::IDLE:
44645cec42f2 split state management in a helper class
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   352
    LogPreviousIdleAndCcaBusyStates ();
44645cec42f2 split state management in a helper class
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   353
  break;
44645cec42f2 split state management in a helper class
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   354
  case WifiPhy::CCA_BUSY:
44645cec42f2 split state management in a helper class
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   355
    break;
44645cec42f2 split state management in a helper class
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   356
  case WifiPhy::SYNC:
44645cec42f2 split state management in a helper class
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   357
    break;
44645cec42f2 split state management in a helper class
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   358
  case WifiPhy::TX:
44645cec42f2 split state management in a helper class
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   359
    break;
44645cec42f2 split state management in a helper class
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   360
  }
44645cec42f2 split state management in a helper class
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   361
  m_startCcaBusy = now;
3905
99c9346b5d71 split interference calculation from YansWifiPhy. Move them to InterferenceHelper
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 3900
diff changeset
   362
  m_endCcaBusy = std::max (m_endCcaBusy, now + duration);
3897
44645cec42f2 split state management in a helper class
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   363
}
44645cec42f2 split state management in a helper class
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   364
44645cec42f2 split state management in a helper class
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   365
} // namespace ns3