22 #include "ns3/double.h"
23 #include "ns3/simulator.h"
24 #include "ns3/trace-source-accessor.h"
25 #include "ns3/energy-source.h"
26 #include "ns3/uan-phy.h"
27 #include "ns3/uan-net-device.h"
28 #include "acoustic-modem-energy-model.h"
34 NS_OBJECT_ENSURE_REGISTERED (AcousticModemEnergyModel);
37 AcousticModemEnergyModel::GetTypeId (
void)
39 static TypeId tid = TypeId (
"ns3::AcousticModemEnergyModel")
40 .SetParent<DeviceEnergyModel> ()
41 .AddConstructor<AcousticModemEnergyModel> ()
42 .AddAttribute (
"TxPowerW",
43 "The modem Tx power in Watts",
47 MakeDoubleChecker<double> ())
48 .AddAttribute (
"RxPowerW",
49 "The modem Rx power in Watts",
53 MakeDoubleChecker<double> ())
54 .AddAttribute (
"IdlePowerW",
55 "The modem Idle power in Watts",
59 MakeDoubleChecker<double> ())
60 .AddAttribute (
"SleepPowerW",
61 "The modem Sleep power in Watts",
65 MakeDoubleChecker<double> ())
66 .AddTraceSource (
"TotalEnergyConsumption",
67 "Total energy consumption of the modem device.",
73 AcousticModemEnergyModel::AcousticModemEnergyModel ()
76 m_currentState = UanPhy::IDLE;
77 m_lastUpdateTime =
Seconds (0.0);
78 m_energyDepletionCallback.Nullify ();
83 AcousticModemEnergyModel::~AcousticModemEnergyModel ()
113 return m_totalEnergyConsumption;
127 m_txPowerW = txPowerW;
141 m_rxPowerW = rxPowerW;
155 m_idlePowerW = idlePowerW;
162 return m_sleepPowerW;
169 m_sleepPowerW = sleepPowerW;
176 return m_currentState;
184 if (callback.IsNull ())
186 NS_LOG_DEBUG (
"AcousticModemEnergyModel:Setting NULL energy depletion callback!");
188 m_energyDepletionCallback = callback;
201 double energyToDecrease = 0.0;
202 double supplyVoltage = m_source->GetSupplyVoltage ();
203 switch (m_currentState)
206 energyToDecrease = duration.
GetSeconds () * m_txPowerW * supplyVoltage;
209 energyToDecrease = duration.
GetSeconds () * m_rxPowerW * supplyVoltage;
212 energyToDecrease = duration.
GetSeconds () * m_idlePowerW * supplyVoltage;
215 energyToDecrease = duration.
GetSeconds () * m_sleepPowerW * supplyVoltage;
218 NS_FATAL_ERROR (
"AcousticModemEnergyModel:Undefined radio state!");
222 m_totalEnergyConsumption += energyToDecrease;
228 m_source->UpdateEnergySource ();
234 NS_LOG_DEBUG (
"AcousticModemEnergyModel:Total energy consumption at node #" <<
235 m_node->
GetId () <<
" is " << m_totalEnergyConsumption <<
"J");
242 NS_LOG_DEBUG (
"AcousticModemEnergyModel:Energy is depleted at node #" <<
245 if (!m_energyDepletionCallback.IsNull ())
247 m_energyDepletionCallback ();
251 dev->GetPhy ()->EnergyDepletionHandler ();
264 m_energyDepletionCallback.Nullify ();
272 double supplyVoltage = m_source->GetSupplyVoltage ();
274 double stateCurrent = 0.0;
275 switch (m_currentState)
278 stateCurrent = m_txPowerW / supplyVoltage;
281 stateCurrent = m_rxPowerW / supplyVoltage;
284 stateCurrent = m_idlePowerW / supplyVoltage;
287 stateCurrent = m_sleepPowerW / supplyVoltage;
290 NS_FATAL_ERROR (
"AcousticModemEnergyModel:Undefined radio state!");
309 m_currentState = state;
310 std::string stateName;
326 NS_LOG_DEBUG (
"AcousticModemEnergyModel:Switching to state: " << stateName <<
331 NS_FATAL_ERROR (
"AcousticModemEnergyModel:Invalid state transition!");
double GetRxPowerW(void) const
virtual void ChangeState(int newState)
Changes state of the AcousticModemEnergyModel.
virtual void HandleEnergyDepletion(void)
Handles energy depletion.
#define NS_LOG_FUNCTION(parameters)
virtual double DoGetCurrentA(void) const
virtual double GetTotalEnergyConsumption(void) const
#define NS_ASSERT(condition)
#define NS_LOG_COMPONENT_DEFINE(name)
void SetIdlePowerW(double idlePowerW)
bool IsStateTransitionValid(const int destState)
#define NS_FATAL_ERROR(msg)
fatal error handling
double GetSeconds(void) const
void SetEnergyDepletionCallback(AcousticModemEnergyDepletionCallback callback)
void SetTxPowerW(double txPowerW)
Ptr< NetDevice > GetDevice(uint32_t index) const
void SetRxPowerW(double rxPowerW)
virtual void SetEnergySource(Ptr< EnergySource > source)
Sets pointer to EnergySouce installed on node.
Ptr< const TraceSourceAccessor > MakeTraceSourceAccessor(T a)
Net device for UAN models.
int64_t GetNanoSeconds(void) const
Time Seconds(double seconds)
create ns3::Time instances in units of seconds.
uint32_t GetId(void) const
double GetSleepPowerW(void) const
double GetTxPowerW(void) const
virtual Ptr< Node > GetNode(void) const
Gets pointer to node.
#define NS_LOG_DEBUG(msg)
virtual void SetNode(Ptr< Node > node)
Sets pointer to node.
void SetSleepPowerW(double sleepPowerW)
int GetCurrentState(void) const
double GetIdlePowerW(void) const
void SetMicroModemState(const int state)