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  .SetGroupName ("Energy")
40  .AddConstructor<BasicEnergySource> ()
41  .AddAttribute ("BasicEnergySourceInitialEnergyJ",
42  "Initial energy stored in basic energy source.",
43  DoubleValue (10), // in Joules
46  MakeDoubleChecker<double> ())
47  .AddAttribute ("BasicEnergySupplyVoltageV",
48  "Initial supply voltage for basic energy source.",
49  DoubleValue (3.0), // in Volts
52  MakeDoubleChecker<double> ())
53  .AddAttribute ("BasicEnergyLowBatteryThreshold",
54  "Low battery threshold for basic energy source.",
55  DoubleValue (0.10), // as a fraction of the initial energy
57  MakeDoubleChecker<double> ())
58  .AddAttribute ("BasicEnergyHighBatteryThreshold",
59  "High battery threshold for basic energy source.",
60  DoubleValue (0.15), // as a fraction of the initial energy
62  MakeDoubleChecker<double> ())
63  .AddAttribute ("PeriodicEnergyUpdateInterval",
64  "Time between two consecutive periodic energy updates.",
65  TimeValue (Seconds (1.0)),
68  MakeTimeChecker ())
69  .AddTraceSource ("RemainingEnergy",
70  "Remaining energy at BasicEnergySource.",
72  "ns3::TracedValueCallback::Double")
73  ;
74  return tid;
75 }
76 
78 {
79  NS_LOG_FUNCTION (this);
80  m_lastUpdateTime = Seconds (0.0);
81  m_depleted = false;
82 }
83 
85 {
86  NS_LOG_FUNCTION (this);
87 }
88 
89 void
90 BasicEnergySource::SetInitialEnergy (double initialEnergyJ)
91 {
92  NS_LOG_FUNCTION (this << initialEnergyJ);
93  NS_ASSERT (initialEnergyJ >= 0);
94  m_initialEnergyJ = initialEnergyJ;
96 }
97 
98 void
99 BasicEnergySource::SetSupplyVoltage (double supplyVoltageV)
100 {
101  NS_LOG_FUNCTION (this << supplyVoltageV);
102  m_supplyVoltageV = supplyVoltageV;
103 }
104 
105 void
107 {
108  NS_LOG_FUNCTION (this << interval);
109  m_energyUpdateInterval = interval;
110 }
111 
112 Time
114 {
115  NS_LOG_FUNCTION (this);
116  return m_energyUpdateInterval;
117 }
118 
119 double
121 {
122  NS_LOG_FUNCTION (this);
123  return m_supplyVoltageV;
124 }
125 
126 double
128 {
129  NS_LOG_FUNCTION (this);
130  return m_initialEnergyJ;
131 }
132 
133 double
135 {
136  NS_LOG_FUNCTION (this);
137  // update energy source to get the latest remaining energy.
139  return m_remainingEnergyJ;
140 }
141 
142 double
144 {
145  NS_LOG_FUNCTION (this);
146  // update energy source to get the latest remaining energy.
149 }
150 
151 void
153 {
154  NS_LOG_FUNCTION (this);
155  NS_LOG_DEBUG ("BasicEnergySource:Updating remaining energy.");
156 
157  // do not update if simulation has finished
158  if (Simulator::IsFinished ())
159  {
160  return;
161  }
162 
164 
165  double remainingEnergy = m_remainingEnergyJ;
167 
169 
171  {
172  m_depleted = true;
174  }
175  else if (m_depleted && m_remainingEnergyJ > m_highBatteryTh * m_initialEnergyJ)
176  {
177  m_depleted = false;
179  }
180  else if (m_remainingEnergyJ != remainingEnergy)
181  {
183  }
184 
187  this);
188 }
189 
190 /*
191  * Private functions start here.
192  */
193 
194 void
196 {
197  NS_LOG_FUNCTION (this);
198  UpdateEnergySource (); // start periodic update
199 }
200 
201 void
203 {
204  NS_LOG_FUNCTION (this);
205  BreakDeviceEnergyModelRefCycle (); // break reference cycle
206 }
207 
208 void
210 {
211  NS_LOG_FUNCTION (this);
212  NS_LOG_DEBUG ("BasicEnergySource:Energy depleted!");
213  NotifyEnergyDrained (); // notify DeviceEnergyModel objects
214 }
215 
216 void
218 {
219  NS_LOG_FUNCTION (this);
220  NS_LOG_DEBUG ("BasicEnergySource:Energy recharged!");
221  NotifyEnergyRecharged (); // notify DeviceEnergyModel objects
222 }
223 
224 void
226 {
227  NS_LOG_FUNCTION (this);
228  double totalCurrentA = CalculateTotalCurrent ();
229  Time duration = Simulator::Now () - m_lastUpdateTime;
230  NS_ASSERT (duration.IsPositive ());
231  // energy = current * voltage * time
232  double energyToDecreaseJ = (totalCurrentA * m_supplyVoltageV * duration.GetNanoSeconds ()) / 1e9;
233  NS_ASSERT (m_remainingEnergyJ >= energyToDecreaseJ);
234  m_remainingEnergyJ -= energyToDecreaseJ;
235  NS_LOG_DEBUG ("BasicEnergySource:Remaining energy = " << m_remainingEnergyJ);
236 }
237 
238 } // namespace ns3
void CalculateRemainingEnergy(void)
Calculates remaining energy.
Simulation virtual time values and global simulation resolution.
Definition: nstime.h:102
bool IsPositive(void) const
Definition: nstime.h:298
#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:45
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:67
#define NS_LOG_COMPONENT_DEFINE(name)
Define a Log component with a specific name.
Definition: log.h:202
BasicEnergySource decreases/increases remaining energy stored in itself in linearly.
virtual void UpdateEnergySource(void)
Implements UpdateEnergySource.
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:446
void BreakDeviceEnergyModelRefCycle(void)
This function is called to break reference cycle between EnergySource and DeviceEnergyModel.
virtual double GetInitialEnergy(void) const
void DoDispose(void)
Defined in ns3::Object.
static EventId Schedule(Time const &delay, MEM mem_ptr, OBJ obj)
Schedule an event to expire after delay.
Definition: simulator.h:1381
AttributeValue implementation for Time.
Definition: nstime.h:1069
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...
void NotifyEnergyChanged(void)
This function notifies all DeviceEnergyModel of energy changed event.
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:1070
static Time Now(void)
Return the current simulation virtual time.
Definition: simulator.cc:249
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
int64_t GetNanoSeconds(void) const
Get an approximation of the time stored in this instance in the indicated unit.
Definition: nstime.h:367
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:270
Time Seconds(double value)
Construct a Time in the indicated unit.
Definition: nstime.h:1007
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:219
void SetInitialEnergy(double initialEnergyJ)
This class can be used to hold variables of floating point type such as &#39;double&#39; or &#39;float&#39;...
Definition: double.h:41
a unique identifier for an interface.
Definition: type-id.h:58
TypeId SetParent(TypeId tid)
Set the parent TypeId.
Definition: type-id.cc:915
virtual double GetEnergyFraction(void)