OLD | NEW |
(Empty) | |
| 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>, Peish
uo Li <pressthunder@gmail.com> |
| 19 */ |
| 20 |
| 21 #include "lr-wpan-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 #include "ns3/boolean.h" |
| 28 |
| 29 NS_LOG_COMPONENT_DEFINE ("LrWpanEnergySource"); |
| 30 |
| 31 namespace ns3 { |
| 32 |
| 33 NS_OBJECT_ENSURE_REGISTERED (LrWpanEnergySource); |
| 34 |
| 35 TypeId |
| 36 LrWpanEnergySource::GetTypeId (void) |
| 37 { |
| 38 static TypeId tid = TypeId ("ns3::LrWpanEnergySource") |
| 39 .SetParent<EnergySource> () |
| 40 .AddConstructor<LrWpanEnergySource> () |
| 41 .AddAttribute ("LrWpanEnergySourceInitialEnergyJ", |
| 42 "Initial energy stored in basic energy source.", |
| 43 DoubleValue (10), // in Joules |
| 44 MakeDoubleAccessor (&LrWpanEnergySource::SetInitialEnergy, |
| 45 &LrWpanEnergySource::GetInitialEnergy), |
| 46 MakeDoubleChecker<double> ()) |
| 47 .AddAttribute ("LrWpanEnergySupplyVoltageV", |
| 48 "Initial supply voltage for basic energy source.", |
| 49 DoubleValue (3.0), // in Volts |
| 50 MakeDoubleAccessor (&LrWpanEnergySource::SetSupplyVoltage, |
| 51 &LrWpanEnergySource::GetSupplyVoltage), |
| 52 MakeDoubleChecker<double> ()) |
| 53 .AddAttribute ("PeriodicEnergyUpdateInterval", |
| 54 "Time between two consecutive periodic energy updates.", |
| 55 TimeValue (Seconds (1.0)), |
| 56 MakeTimeAccessor (&LrWpanEnergySource::SetEnergyUpdateInterva
l, |
| 57 &LrWpanEnergySource::GetEnergyUpdateInterva
l), |
| 58 MakeTimeChecker ()) |
| 59 .AddAttribute ("LrWpanUnlimitedEnergy", |
| 60 "Energy unlimited or not at LrWpanEnergySource.", |
| 61 BooleanValue (true), |
| 62 MakeBooleanAccessor (&LrWpanEnergySource::SetEnergyUnlimited
, |
| 63 &LrWpanEnergySource::GetEnergyUnlimited
), |
| 64 MakeBooleanChecker ()) |
| 65 .AddTraceSource ("RemainingEnergy", |
| 66 "Remaining energy at LrWpanEnergySource.", |
| 67 MakeTraceSourceAccessor (&LrWpanEnergySource::m_remainingEn
ergyJ)) |
| 68 |
| 69 ; |
| 70 return tid; |
| 71 } |
| 72 |
| 73 LrWpanEnergySource::LrWpanEnergySource () |
| 74 { |
| 75 NS_LOG_FUNCTION (this); |
| 76 m_lastUpdateTime = Seconds (0.0); |
| 77 } |
| 78 |
| 79 LrWpanEnergySource::~LrWpanEnergySource () |
| 80 { |
| 81 NS_LOG_FUNCTION (this); |
| 82 } |
| 83 |
| 84 void |
| 85 LrWpanEnergySource::SetInitialEnergy (double initialEnergyJ) |
| 86 { |
| 87 NS_LOG_FUNCTION (this << initialEnergyJ); |
| 88 NS_ASSERT (initialEnergyJ >= 0); |
| 89 m_initialEnergyJ = initialEnergyJ; |
| 90 m_remainingEnergyJ = m_initialEnergyJ; |
| 91 } |
| 92 |
| 93 void |
| 94 LrWpanEnergySource::SetSupplyVoltage (double supplyVoltageV) |
| 95 { |
| 96 NS_LOG_FUNCTION (this << supplyVoltageV); |
| 97 m_supplyVoltageV = supplyVoltageV; |
| 98 } |
| 99 |
| 100 void |
| 101 LrWpanEnergySource::SetEnergyUpdateInterval (Time interval) |
| 102 { |
| 103 NS_LOG_FUNCTION (this << interval); |
| 104 m_energyUpdateInterval = interval; |
| 105 } |
| 106 |
| 107 Time |
| 108 LrWpanEnergySource::GetEnergyUpdateInterval (void) const |
| 109 { |
| 110 NS_LOG_FUNCTION (this); |
| 111 return m_energyUpdateInterval; |
| 112 } |
| 113 |
| 114 double |
| 115 LrWpanEnergySource::GetSupplyVoltage (void) const |
| 116 { |
| 117 NS_LOG_FUNCTION (this); |
| 118 return m_supplyVoltageV; |
| 119 } |
| 120 |
| 121 double |
| 122 LrWpanEnergySource::GetInitialEnergy (void) const |
| 123 { |
| 124 NS_LOG_FUNCTION (this); |
| 125 return m_initialEnergyJ; |
| 126 } |
| 127 |
| 128 double |
| 129 LrWpanEnergySource::GetRemainingEnergy (void) |
| 130 { |
| 131 NS_LOG_FUNCTION (this); |
| 132 |
| 133 NS_LOG_DEBUG ("Get RemainingEnergy"); |
| 134 // update energy source to get the latest remaining energy. |
| 135 //UpdateEnergySource (); |
| 136 return m_remainingEnergyJ; |
| 137 } |
| 138 |
| 139 double |
| 140 LrWpanEnergySource::GetEnergyFraction (void) |
| 141 { |
| 142 NS_LOG_FUNCTION (this); |
| 143 // update energy source to get the latest remaining energy. |
| 144 UpdateEnergySource (); |
| 145 return m_remainingEnergyJ / m_initialEnergyJ; |
| 146 } |
| 147 |
| 148 void |
| 149 LrWpanEnergySource::UpdateEnergySource (void) |
| 150 { |
| 151 NS_LOG_FUNCTION (this); |
| 152 NS_LOG_DEBUG ("LrWpanEnergySource:Updating remaining energy."); |
| 153 |
| 154 // do not update if simulation has finished |
| 155 if (Simulator::IsFinished ()) |
| 156 { |
| 157 return; |
| 158 } |
| 159 |
| 160 m_energyUpdateEvent.Cancel (); |
| 161 |
| 162 CalculateRemainingEnergy (); |
| 163 |
| 164 m_lastUpdateTime = Simulator::Now (); |
| 165 |
| 166 if (m_remainingEnergyJ <= 0) |
| 167 { |
| 168 HandleEnergyDrainedEvent (); |
| 169 return; // stop periodic update |
| 170 } |
| 171 |
| 172 m_energyUpdateEvent = Simulator::Schedule (m_energyUpdateInterval, |
| 173 &LrWpanEnergySource::UpdateEnergySo
urce, |
| 174 this); |
| 175 } |
| 176 |
| 177 /* |
| 178 * Private functions start here. |
| 179 */ |
| 180 |
| 181 void |
| 182 LrWpanEnergySource::DoInitialize (void) |
| 183 { |
| 184 NS_LOG_FUNCTION (this); |
| 185 UpdateEnergySource (); // start periodic update |
| 186 } |
| 187 |
| 188 void |
| 189 LrWpanEnergySource::DoDispose (void) |
| 190 { |
| 191 NS_LOG_FUNCTION (this); |
| 192 BreakDeviceEnergyModelRefCycle (); // break reference cycle |
| 193 } |
| 194 |
| 195 void |
| 196 LrWpanEnergySource::HandleEnergyDrainedEvent (void) |
| 197 { |
| 198 NS_LOG_FUNCTION (this); |
| 199 NS_LOG_DEBUG ("LrWpanEnergySource:Energy depleted!"); |
| 200 m_remainingEnergyJ = 0; // energy never goes below 0 |
| 201 NotifyEnergyDrained (); // notify DeviceEnergyModel objects |
| 202 NS_LOG_DEBUG ("LrWpanEnergySource:Remaining energy = " << m_remainingEnergyJ); |
| 203 } |
| 204 |
| 205 void |
| 206 LrWpanEnergySource::CalculateRemainingEnergy (void) |
| 207 { |
| 208 NS_LOG_FUNCTION (this); |
| 209 double totalCurrentA = CalculateTotalCurrent (); |
| 210 Time duration = Simulator::Now () - m_lastUpdateTime; |
| 211 NS_ASSERT (duration.GetSeconds () >= 0); |
| 212 // energy = current * voltage * time |
| 213 |
| 214 if (!m_unlimited) |
| 215 { |
| 216 double energyToDecreaseJ = totalCurrentA * m_supplyVoltageV * duration.GetSe
conds (); |
| 217 m_remainingEnergyJ -= energyToDecreaseJ; |
| 218 NS_LOG_DEBUG ("LrWpanEnergySource:Remaining energy = " << m_remainingEnergyJ
); |
| 219 } |
| 220 else |
| 221 NS_LOG_DEBUG ("LrWpanEnergySource Energy Unlimited"); |
| 222 } |
| 223 |
| 224 void |
| 225 LrWpanEnergySource::SetEnergyUnlimited (bool unlimit) |
| 226 { |
| 227 NS_LOG_FUNCTION (this); |
| 228 m_unlimited = unlimit; |
| 229 } |
| 230 |
| 231 bool |
| 232 LrWpanEnergySource::GetEnergyUnlimited (void) const |
| 233 { |
| 234 NS_LOG_FUNCTION (this); |
| 235 return m_unlimited; |
| 236 } |
| 237 |
| 238 } // namespace ns3 |
OLD | NEW |