src/energy/model/basic-energy-source.cc
changeset 10883 d919e7194e23
parent 10652 dc18deba4502
child 10968 2d29fee2b7b8
--- a/src/energy/model/basic-energy-source.cc	Fri Sep 05 15:38:55 2014 -0700
+++ b/src/energy/model/basic-energy-source.cc	Fri Sep 05 16:33:57 2014 -0700
@@ -49,6 +49,16 @@
                    MakeDoubleAccessor (&BasicEnergySource::SetSupplyVoltage,
                                        &BasicEnergySource::GetSupplyVoltage),
                    MakeDoubleChecker<double> ())
+    .AddAttribute ("BasicEnergyLowBatteryThreshold",
+                   "Low battery threshold for basic energy source.",
+                   DoubleValue (0.10), // as a fraction of the initial energy
+                   MakeDoubleAccessor (&BasicEnergySource::m_lowBatteryTh),
+                   MakeDoubleChecker<double> ())
+    .AddAttribute ("BasicEnergyHighBatteryThreshold",
+                   "High battery threshold for basic energy source.",
+                   DoubleValue (0.15), // as a fraction of the initial energy
+                   MakeDoubleAccessor (&BasicEnergySource::m_highBatteryTh),
+                   MakeDoubleChecker<double> ())
     .AddAttribute ("PeriodicEnergyUpdateInterval",
                    "Time between two consecutive periodic energy updates.",
                    TimeValue (Seconds (1.0)),
@@ -66,6 +76,7 @@
 {
   NS_LOG_FUNCTION (this);
   m_lastUpdateTime = Seconds (0.0);
+  m_depleted = false;
 }
 
 BasicEnergySource::~BasicEnergySource ()
@@ -151,13 +162,19 @@
 
   CalculateRemainingEnergy ();
 
-  if (m_remainingEnergyJ <= 0)
+  m_lastUpdateTime = Simulator::Now ();
+
+  if (!m_depleted && m_remainingEnergyJ <= m_lowBatteryTh * m_initialEnergyJ)
     {
+      m_depleted = true;
       HandleEnergyDrainedEvent ();
-      return; // stop periodic update
     }
 
-  m_lastUpdateTime = Simulator::Now ();
+  if (m_depleted && m_remainingEnergyJ > m_highBatteryTh * m_initialEnergyJ)
+    {
+      m_depleted = false;
+      HandleEnergyRechargedEvent ();
+    }
 
   m_energyUpdateEvent = Simulator::Schedule (m_energyUpdateInterval,
                                              &BasicEnergySource::UpdateEnergySource,
@@ -188,7 +205,18 @@
   NS_LOG_FUNCTION (this);
   NS_LOG_DEBUG ("BasicEnergySource:Energy depleted!");
   NotifyEnergyDrained (); // notify DeviceEnergyModel objects
-  m_remainingEnergyJ = 0; // energy never goes below 0
+  if (m_remainingEnergyJ <= 0)
+    {
+      m_remainingEnergyJ = 0; // energy never goes below 0
+    }
+}
+
+void
+BasicEnergySource::HandleEnergyRechargedEvent (void)
+{
+  NS_LOG_FUNCTION (this);
+  NS_LOG_DEBUG ("BasicEnergySource:Energy recharged!");
+  NotifyEnergyRecharged (); // notify DeviceEnergyModel objects
 }
 
 void