A Discrete-Event Network Simulator
API
acoustic-modem-energy-model.cc
Go to the documentation of this file.
1/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
2/*
3 * Copyright (c) 2010 Andrea Sacco
4 *
5 * This program is free software; you can redistribute it and/or modify
6 * it under the terms of the GNU General Public License version 2 as
7 * published by the Free Software Foundation;
8 *
9 * This program is distributed in the hope that it will be useful,
10 * but WITHOUT ANY WARRANTY; without even the implied warranty of
11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12 * GNU General Public License for more details.
13 *
14 * You should have received a copy of the GNU General Public License
15 * along with this program; if not, write to the Free Software
16 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
17 *
18 * Author: Andrea Sacco <andrea.sacco85@gmail.com>
19 */
20
21#include "ns3/log.h"
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"
29
30namespace ns3 {
31
32NS_LOG_COMPONENT_DEFINE ("AcousticModemEnergyModel");
33
34NS_OBJECT_ENSURE_REGISTERED (AcousticModemEnergyModel);
35
36TypeId
38{
39 static TypeId tid = TypeId ("ns3::AcousticModemEnergyModel")
41 .AddConstructor<AcousticModemEnergyModel> ()
42 .AddAttribute ("TxPowerW",
43 "The modem Tx power in Watts",
44 DoubleValue (50),
47 MakeDoubleChecker<double> ())
48 .AddAttribute ("RxPowerW",
49 "The modem Rx power in Watts",
50 DoubleValue (0.158),
53 MakeDoubleChecker<double> ())
54 .AddAttribute ("IdlePowerW",
55 "The modem Idle power in Watts",
56 DoubleValue (0.158),
59 MakeDoubleChecker<double> ())
60 .AddAttribute ("SleepPowerW",
61 "The modem Sleep power in Watts",
62 DoubleValue (0.0058),
65 MakeDoubleChecker<double> ())
66 .AddTraceSource ("TotalEnergyConsumption",
67 "Total energy consumption of the modem device.",
69 "ns3::TracedValueCallback::Double")
70 ;
71 return tid;
72}
73
75{
76 NS_LOG_FUNCTION (this);
77 m_currentState = UanPhy::IDLE; // initially IDLE
80 m_node = 0;
81 m_source = 0;
82}
83
85{
86}
87
88void
90{
91 NS_LOG_FUNCTION (this << node);
92 NS_ASSERT (node != 0);
93 m_node = node;
94}
95
98{
99 return m_node;
100}
101
102void
104{
105 NS_LOG_FUNCTION (this << source);
106 NS_ASSERT (source != 0);
107 m_source = source;
108}
109
110double
112{
113 NS_LOG_FUNCTION (this);
115}
116
117double
119{
120 NS_LOG_FUNCTION (this);
121 return m_txPowerW;
122}
123
124void
126{
127 NS_LOG_FUNCTION (this << txPowerW);
128 m_txPowerW = txPowerW;
129}
130
131double
133{
134 NS_LOG_FUNCTION (this);
135 return m_rxPowerW;
136}
137
138void
140{
141 NS_LOG_FUNCTION (this << rxPowerW);
142 m_rxPowerW = rxPowerW;
143}
144
145double
147{
148 NS_LOG_FUNCTION (this);
149 return m_idlePowerW;
150}
151
152void
154{
155 NS_LOG_FUNCTION (this << idlePowerW);
156 m_idlePowerW = idlePowerW;
157}
158
159double
161{
162 NS_LOG_FUNCTION (this);
163 return m_sleepPowerW;
164}
165
166void
168{
169 NS_LOG_FUNCTION (this << sleepPowerW);
170 m_sleepPowerW = sleepPowerW;
171}
172
173int
175{
176 NS_LOG_FUNCTION (this);
177 return m_currentState;
178}
179
180void
183{
184 NS_LOG_FUNCTION (this);
185 if (callback.IsNull ())
186 {
187 NS_LOG_DEBUG ("AcousticModemEnergyModel:Setting NULL energy depletion callback!");
188 }
189 m_energyDepletionCallback = callback;
190}
191
192void
195{
196 NS_LOG_FUNCTION (this);
197 if (callback.IsNull ())
198 {
199 NS_LOG_DEBUG ("AcousticModemEnergyModel:Setting NULL energy recharge callback!");
200 }
201 m_energyRechargeCallback = callback;
202}
203
204void
206{
207 NS_LOG_FUNCTION (this << newState);
208 // NS_ASSERT (IsStateTransitionValid ((MicroModemState) newState));
209
210 Time duration = Simulator::Now () - m_lastUpdateTime;
211 NS_ASSERT (duration.GetNanoSeconds () >= 0); // check if duration is valid
212
213 // energy to decrease = current * voltage * time
214 double energyToDecrease = 0.0;
215
216 switch (m_currentState)
217 {
218 case UanPhy::TX:
219 energyToDecrease = duration.GetSeconds () * m_txPowerW;
220 break;
221 case UanPhy::RX:
222 energyToDecrease = duration.GetSeconds () * m_rxPowerW;
223 break;
224 case UanPhy::IDLE:
225 energyToDecrease = duration.GetSeconds () * m_idlePowerW;
226 break;
227 case UanPhy::SLEEP:
228 energyToDecrease = duration.GetSeconds () * m_sleepPowerW;
229 break;
230 case UanPhy::DISABLED:
231 energyToDecrease = 0;
232 break;
233 default:
234 NS_FATAL_ERROR ("AcousticModemEnergyModel:Undefined radio state!");
235 }
236
237 // update total energy consumption
238 m_totalEnergyConsumption += energyToDecrease;
239
240 // update last update time stamp
242
243 // notify energy source
244 m_source->UpdateEnergySource ();
245
247 {
248 // update current state & last update time stamp
249 SetMicroModemState (newState);
250 }
251
252 // some debug message
253 NS_LOG_DEBUG ("AcousticModemEnergyModel:Total energy consumption at node #" <<
254 m_node->GetId () << " is " << m_totalEnergyConsumption << "J");
255}
256
257void
259{
260 NS_LOG_FUNCTION (this);
261 NS_LOG_DEBUG ("AcousticModemEnergyModel:Energy is depleted at node #" <<
262 m_node->GetId ());
263 // invoke energy depletion callback, if set.
265 {
267 }
268 // invoke the phy energy depletion handler
270 dev->GetPhy ()->EnergyDepletionHandler ();
272}
273
274void
276{
277 NS_LOG_FUNCTION (this);
278 NS_LOG_DEBUG ("AcousticModemEnergyModel:Energy is recharged at node #" <<
279 m_node->GetId ());
280 // invoke energy recharge callback, if set.
282 {
284 }
285 // invoke the phy energy recharge handler
287 dev->GetPhy ()->EnergyRechargeHandler ();
289}
290
291void
293{
294 NS_LOG_FUNCTION (this);
295 //Not implemented
296}
297
298
299/*
300 * Private functions start here.
301 */
302
303void
305{
306 NS_LOG_FUNCTION (this);
307 m_node = 0;
308 m_source = 0;
310}
311
312double
314{
315 NS_LOG_FUNCTION (this);
316
317 double supplyVoltage = m_source->GetSupplyVoltage ();
318 NS_ASSERT (supplyVoltage != 0.0);
319 double stateCurrent = 0.0;
320 switch (m_currentState)
321 {
322 case UanPhy::TX:
323 stateCurrent = m_txPowerW / supplyVoltage;
324 break;
325 case UanPhy::RX:
326 stateCurrent = m_rxPowerW / supplyVoltage;
327 break;
328 case UanPhy::IDLE:
329 stateCurrent = m_idlePowerW / supplyVoltage;
330 break;
331 case UanPhy::SLEEP:
332 stateCurrent = m_sleepPowerW / supplyVoltage;
333 break;
334 case UanPhy::DISABLED:
335 stateCurrent = 0.0;
336 break;
337 default:
338 NS_FATAL_ERROR ("AcousticModemEnergyModel:Undefined radio state!");
339 }
340
341 return stateCurrent;
342}
343
344bool
346{
347 NS_LOG_FUNCTION (this << destState);
348 return true;
349}
350
351void
353{
354 NS_LOG_FUNCTION (this);
355 if (IsStateTransitionValid (state))
356 {
357 m_currentState = state;
358 std::string stateName;
359 switch (state)
360 {
361 case UanPhy::TX:
362 stateName = "TX";
363 break;
364 case UanPhy::RX:
365 stateName = "RX";
366 break;
367 case UanPhy::IDLE:
368 stateName = "IDLE";
369 break;
370 case UanPhy::SLEEP:
371 stateName = "SLEEP";
372 break;
373 case UanPhy::DISABLED:
374 stateName = "DISABLED";
375 break;
376 }
377 NS_LOG_DEBUG ("AcousticModemEnergyModel:Switching to state: " << stateName <<
378 " at time = " << Simulator::Now ());
379 }
380 else
381 {
382 NS_FATAL_ERROR ("AcousticModemEnergyModel:Invalid state transition!");
383 }
384}
385
386} // namespace ns3
Ptr< EnergySource > m_source
The energy source.
void SetEnergyRechargeCallback(AcousticModemEnergyRechargeCallback callback)
double m_rxPowerW
The receiver power, in watts.
double GetRxPowerW(void) const
Get the receiving power.
double m_idlePowerW
The idle power, in watts.
void SetRxPowerW(double rxPowerW)
Set the receiving power of the modem.
Time m_lastUpdateTime
Time stamp of previous energy update.
void DoDispose(void)
Destructor implementation.
double m_txPowerW
The transmitter power, in watts.
double GetIdlePowerW(void) const
Get the idle power of the modem.
TracedValue< double > m_totalEnergyConsumption
The total energy consumed by this model.
virtual void SetNode(Ptr< Node > node)
Sets pointer to node.
virtual double DoGetCurrentA(void) const
virtual ~AcousticModemEnergyModel()
Dummy destructor, see DoDispose.
static TypeId GetTypeId(void)
Register this type.
virtual double GetTotalEnergyConsumption(void) const
AcousticModemEnergyDepletionCallback m_energyDepletionCallback
Energy depletion callback.
double GetSleepPowerW(void) const
Get the sleep state power of the modem.
void SetIdlePowerW(double idlePowerW)
Set the idle state power of the modem.
virtual void HandleEnergyDepletion(void)
Handles energy depletion.
virtual void HandleEnergyRecharged(void)
Handles energy recharged.
double m_sleepPowerW
The sleep power, in watts.
virtual void ChangeState(int newState)
Changes state of the AcousticModemEnergyModel.
void SetSleepPowerW(double sleepPowerW)
Set the sleep power of the modem.
void SetEnergyDepletionCallback(AcousticModemEnergyDepletionCallback callback)
virtual Ptr< Node > GetNode(void) const
Gets pointer to node.
AcousticModemEnergyRechargeCallback m_energyRechargeCallback
Energy recharge callback.
void SetTxPowerW(double txPowerW)
Set the transmission power of the modem.
virtual void SetEnergySource(Ptr< EnergySource > source)
int GetCurrentState(void) const
Get the current state of the modem.
bool IsStateTransitionValid(const int destState)
double GetTxPowerW(void) const
Get the transmission power of the modem.
virtual void HandleEnergyChanged(void)
Handles energy changed.
Ptr< Node > m_node
The node hosting this transducer.
bool IsNull(void) const
Check for null implementation.
Definition: callback.h:1386
void Nullify(void)
Discard the implementation, set it to null.
Definition: callback.h:1391
Base class for device energy models.
This class can be used to hold variables of floating point type such as 'double' or 'float'.
Definition: double.h:41
uint32_t GetId(void) const
Definition: node.cc:109
Ptr< NetDevice > GetDevice(uint32_t index) const
Retrieve the index-th NetDevice associated to this node.
Definition: node.cc:144
Ptr< T > GetObject(void) const
Get a pointer to the requested aggregated Object.
Definition: object.h:470
static Time Now(void)
Return the current simulation virtual time.
Definition: simulator.cc:195
Simulation virtual time values and global simulation resolution.
Definition: nstime.h:103
double GetSeconds(void) const
Get an approximation of the time stored in this instance in the indicated unit.
Definition: nstime.h:379
int64_t GetNanoSeconds(void) const
Get an approximation of the time stored in this instance in the indicated unit.
Definition: nstime.h:391
a unique identifier for an interface.
Definition: type-id.h:59
TypeId SetParent(TypeId tid)
Set the parent TypeId.
Definition: type-id.cc:922
Net device for UAN models.
@ RX
Receiving.
Definition: uan-phy.h:186
@ SLEEP
Sleeping.
Definition: uan-phy.h:188
@ IDLE
Idle state.
Definition: uan-phy.h:184
@ DISABLED
Disabled.
Definition: uan-phy.h:189
@ TX
Transmitting.
Definition: uan-phy.h:187
#define NS_ASSERT(condition)
At runtime, in debugging builds, if this condition is not true, the program prints the source file,...
Definition: assert.h:67
Ptr< const AttributeAccessor > MakeDoubleAccessor(T1 a1)
Definition: double.h:42
#define NS_FATAL_ERROR(msg)
Report a fatal error with a message and terminate.
Definition: fatal-error.h:165
#define NS_LOG_COMPONENT_DEFINE(name)
Define a Log component with a specific name.
Definition: log.h:205
#define NS_LOG_DEBUG(msg)
Use NS_LOG to output a message of level LOG_DEBUG.
Definition: log.h:273
#define NS_LOG_FUNCTION(parameters)
If log level LOG_FUNCTION is enabled, this macro will output all input parameters separated by ",...
#define NS_OBJECT_ENSURE_REGISTERED(type)
Register an Object subclass with the TypeId system.
Definition: object-base.h:45
Time Seconds(double value)
Construct a Time in the indicated unit.
Definition: nstime.h:1244
Ptr< const TraceSourceAccessor > MakeTraceSourceAccessor(T a)
Create a TraceSourceAccessor which will control access to the underlying trace source.
Every class exported by the ns3 library is enclosed in the ns3 namespace.