A Discrete-Event Network Simulator
API
basic-energy-source.cc
Go to the documentation of this file.
1 /* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
2 /*
3  * Copyright (c) 2010 Network Security Lab, University of Washington, Seattle.
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  * Authors: Sidharth Nabar <snabar@uw.edu>, He Wu <mdzz@u.washington.edu>
19  */
20 
21 #include "basic-energy-source.h"
22 #include "ns3/log.h"
23 #include "ns3/assert.h"
24 #include "ns3/double.h"
25 #include "ns3/trace-source-accessor.h"
26 #include "ns3/simulator.h"
27 
28 namespace ns3 {
29 
30 NS_LOG_COMPONENT_DEFINE ("BasicEnergySource");
31 
32 NS_OBJECT_ENSURE_REGISTERED (BasicEnergySource);
33 
34 TypeId
36 {
37  static TypeId tid = TypeId ("ns3::BasicEnergySource")
39  .AddConstructor<BasicEnergySource> ()
40  .AddAttribute ("BasicEnergySourceInitialEnergyJ",
41  "Initial energy stored in basic energy source.",
42  DoubleValue (10), // in Joules
45  MakeDoubleChecker<double> ())
46  .AddAttribute ("BasicEnergySupplyVoltageV",
47  "Initial supply voltage for basic energy source.",
48  DoubleValue (3.0), // in Volts
51  MakeDoubleChecker<double> ())
52  .AddAttribute ("BasicEnergyLowBatteryThreshold",
53  "Low battery threshold for basic energy source.",
54  DoubleValue (0.10), // as a fraction of the initial energy
56  MakeDoubleChecker<double> ())
57  .AddAttribute ("BasicEnergyHighBatteryThreshold",
58  "High battery threshold for basic energy source.",
59  DoubleValue (0.15), // as a fraction of the initial energy
61  MakeDoubleChecker<double> ())
62  .AddAttribute ("PeriodicEnergyUpdateInterval",
63  "Time between two consecutive periodic energy updates.",
64  TimeValue (Seconds (1.0)),
67  MakeTimeChecker ())
68  .AddTraceSource ("RemainingEnergy",
69  "Remaining energy at BasicEnergySource.",
71  "ns3::TracedValue::DoubleCallback")
72  ;
73  return tid;
74 }
75 
77 {
78  NS_LOG_FUNCTION (this);
79  m_lastUpdateTime = Seconds (0.0);
80  m_depleted = false;
81 }
82 
84 {
85  NS_LOG_FUNCTION (this);
86 }
87 
88 void
89 BasicEnergySource::SetInitialEnergy (double initialEnergyJ)
90 {
91  NS_LOG_FUNCTION (this << initialEnergyJ);
92  NS_ASSERT (initialEnergyJ >= 0);
93  m_initialEnergyJ = initialEnergyJ;
95 }
96 
97 void
98 BasicEnergySource::SetSupplyVoltage (double supplyVoltageV)
99 {
100  NS_LOG_FUNCTION (this << supplyVoltageV);
101  m_supplyVoltageV = supplyVoltageV;
102 }
103 
104 void
106 {
107  NS_LOG_FUNCTION (this << interval);
108  m_energyUpdateInterval = interval;
109 }
110 
111 Time
113 {
114  NS_LOG_FUNCTION (this);
115  return m_energyUpdateInterval;
116 }
117 
118 double
120 {
121  NS_LOG_FUNCTION (this);
122  return m_supplyVoltageV;
123 }
124 
125 double
127 {
128  NS_LOG_FUNCTION (this);
129  return m_initialEnergyJ;
130 }
131 
132 double
134 {
135  NS_LOG_FUNCTION (this);
136  // update energy source to get the latest remaining energy.
138  return m_remainingEnergyJ;
139 }
140 
141 double
143 {
144  NS_LOG_FUNCTION (this);
145  // update energy source to get the latest remaining energy.
148 }
149 
150 void
152 {
153  NS_LOG_FUNCTION (this);
154  NS_LOG_DEBUG ("BasicEnergySource:Updating remaining energy.");
155 
156  // do not update if simulation has finished
157  if (Simulator::IsFinished ())
158  {
159  return;
160  }
161 
163 
165 
167 
169  {
170  m_depleted = true;
172  }
173 
174  if (m_depleted && m_remainingEnergyJ > m_highBatteryTh * m_initialEnergyJ)
175  {
176  m_depleted = false;
178  }
179 
182  this);
183 }
184 
185 /*
186  * Private functions start here.
187  */
188 
189 void
191 {
192  NS_LOG_FUNCTION (this);
193  UpdateEnergySource (); // start periodic update
194 }
195 
196 void
198 {
199  NS_LOG_FUNCTION (this);
200  BreakDeviceEnergyModelRefCycle (); // break reference cycle
201 }
202 
203 void
205 {
206  NS_LOG_FUNCTION (this);
207  NS_LOG_DEBUG ("BasicEnergySource:Energy depleted!");
208  NotifyEnergyDrained (); // notify DeviceEnergyModel objects
209  if (m_remainingEnergyJ <= 0)
210  {
211  m_remainingEnergyJ = 0; // energy never goes below 0
212  }
213 }
214 
215 void
217 {
218  NS_LOG_FUNCTION (this);
219  NS_LOG_DEBUG ("BasicEnergySource:Energy recharged!");
220  NotifyEnergyRecharged (); // notify DeviceEnergyModel objects
221 }
222 
223 void
225 {
226  NS_LOG_FUNCTION (this);
227  double totalCurrentA = CalculateTotalCurrent ();
228  Time duration = Simulator::Now () - m_lastUpdateTime;
229  NS_ASSERT (duration.GetSeconds () >= 0);
230  // energy = current * voltage * time
231  double energyToDecreaseJ = totalCurrentA * m_supplyVoltageV * duration.GetSeconds ();
232  m_remainingEnergyJ -= energyToDecreaseJ;
233  NS_LOG_DEBUG ("BasicEnergySource:Remaining energy = " << m_remainingEnergyJ);
234 }
235 
236 } // namespace ns3
void CalculateRemainingEnergy(void)
Calculates remaining energy.
Simulation virtual time values and global simulation resolution.
Definition: nstime.h:95
#define NS_LOG_FUNCTION(parameters)
If log level LOG_FUNCTION is enabled, this macro will output all input parameters separated by "...
Time GetEnergyUpdateInterval(void) const
#define NS_OBJECT_ENSURE_REGISTERED(type)
Register an Object subclass with the TypeId system.
Definition: object-base.h:44
virtual double GetSupplyVoltage(void) const
Introspection did not find any typical Config paths.
Definition: energy-source.h:81
virtual double GetRemainingEnergy(void)
#define NS_ASSERT(condition)
At runtime, in debugging builds, if this condition is not true, the program prints the source file...
Definition: assert.h:61
#define NS_LOG_COMPONENT_DEFINE(name)
Define a Log component with a specific name.
Definition: log.h:201
virtual void UpdateEnergySource(void)
Implements UpdateEnergySource.
static EventId Schedule(Time const &time, MEM mem_ptr, OBJ obj)
Schedule an event to expire at the relative time "time" is reached.
Definition: simulator.h:819
void HandleEnergyDrainedEvent(void)
Handles the remaining energy going to zero event.
Ptr< const TraceSourceAccessor > MakeTraceSourceAccessor(T a)
Create a TraceSourceAccessor which will control access to the underlying trace source.
Ptr< const AttributeChecker > MakeTimeChecker(const Time min, const Time max)
Helper to make a Time checker with bounded range.
Definition: time.cc:439
void BreakDeviceEnergyModelRefCycle(void)
This function is called to break reference cycle between EnergySource and DeviceEnergyModel.
double GetSeconds(void) const
Get an approximation of the time stored in this instance in the indicated unit.
Definition: nstime.h:327
virtual double GetInitialEnergy(void) const
void DoDispose(void)
Defined in ns3::Object.
AttributeValue implementation for Time.
Definition: nstime.h:921
TracedValue< double > m_remainingEnergyJ
void NotifyEnergyRecharged(void)
This function notifies all DeviceEnergyModel of energy recharged event.
void HandleEnergyRechargedEvent(void)
Handles the remaining energy exceeding the high threshold after it went below the low threshold...
static TypeId GetTypeId(void)
double CalculateTotalCurrent(void)
Every class exported by the ns3 library is enclosed in the ns3 namespace.
void DoInitialize(void)
Defined in ns3::Object.
Ptr< const AttributeAccessor > MakeTimeAccessor(T1 a1)
Create an AttributeAccessor for a class data member, or a lone class get functor or set method...
Definition: nstime.h:922
static Time Now(void)
Return the current simulation virtual time.
Definition: simulator.cc:223
Ptr< const AttributeAccessor > MakeDoubleAccessor(T1 a1)
Create an AttributeAccessor for a class data member, or a lone class get functor or set method...
Definition: double.h:42
void NotifyEnergyDrained(void)
This function notifies all DeviceEnergyModel of energy depletion event.
void SetSupplyVoltage(double supplyVoltageV)
void SetEnergyUpdateInterval(Time interval)
#define NS_LOG_DEBUG(msg)
Use NS_LOG to output a message of level LOG_DEBUG.
Definition: log.h:236
Time Seconds(double value)
Construct a Time in the indicated unit.
Definition: nstime.h:859
void Cancel(void)
This method is syntactic sugar for the ns3::Simulator::Cancel method.
Definition: event-id.cc:53
static bool IsFinished(void)
Check if the simulation should finish.
Definition: simulator.cc:193
void SetInitialEnergy(double initialEnergyJ)
This class can be used to hold variables of floating point type such as 'double' or 'float'...
Definition: double.h:41
a unique identifier for an interface.
Definition: type-id.h:51
TypeId SetParent(TypeId tid)
Definition: type-id.cc:631
virtual double GetEnergyFraction(void)