src/energy/model/basic-energy-source.cc
changeset 6938 85d201f1c67f
parent 6739 1b903a05007c
child 7385 10beb0e53130
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/energy/model/basic-energy-source.cc	Tue Mar 22 16:40:32 2011 -0700
@@ -0,0 +1,202 @@
+/* -*-  Mode: C++; c-file-style: "gnu"; indent-tabs-mode:nil; -*- */
+/*
+ * Copyright (c) 2010 Network Security Lab, University of Washington, Seattle.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 as
+ * published by the Free Software Foundation;
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+ *
+ * Authors: Sidharth Nabar <snabar@uw.edu>, He Wu <mdzz@u.washington.edu>
+ */
+
+#include "basic-energy-source.h"
+#include "ns3/log.h"
+#include "ns3/assert.h"
+#include "ns3/double.h"
+#include "ns3/trace-source-accessor.h"
+#include "ns3/simulator.h"
+
+NS_LOG_COMPONENT_DEFINE ("BasicEnergySource");
+
+namespace ns3 {
+
+NS_OBJECT_ENSURE_REGISTERED (BasicEnergySource);
+
+TypeId
+BasicEnergySource::GetTypeId (void)
+{
+  static TypeId tid = TypeId ("ns3::BasicEnergySource")
+    .SetParent<EnergySource> ()
+    .AddConstructor<BasicEnergySource> ()
+    .AddAttribute ("BasicEnergySourceInitialEnergyJ",
+                   "Initial energy stored in basic energy source.",
+                   DoubleValue (10),  // in Joules
+                   MakeDoubleAccessor (&BasicEnergySource::SetInitialEnergy,
+                                       &BasicEnergySource::GetInitialEnergy),
+                   MakeDoubleChecker<double> ())
+    .AddAttribute ("BasicEnergySupplyVoltageV",
+                   "Initial supply voltage for basic energy source.",
+                   DoubleValue (3.0), // in Volts
+                   MakeDoubleAccessor (&BasicEnergySource::SetSupplyVoltage,
+                                       &BasicEnergySource::GetSupplyVoltage),
+                   MakeDoubleChecker<double> ())
+    .AddAttribute ("PeriodicEnergyUpdateInterval",
+                   "Time between two consecutive periodic energy updates.",
+                   TimeValue (Seconds (1.0)),
+                   MakeTimeAccessor (&BasicEnergySource::SetEnergyUpdateInterval,
+                                     &BasicEnergySource::GetEnergyUpdateInterval),
+                   MakeTimeChecker ())
+    .AddTraceSource ("RemainingEnergy",
+                     "Remaining energy at BasicEnergySource.",
+                     MakeTraceSourceAccessor (&BasicEnergySource::m_remainingEnergyJ))
+  ;
+  return tid;
+}
+
+BasicEnergySource::BasicEnergySource ()
+{
+  m_lastUpdateTime = Seconds (0.0);
+}
+
+BasicEnergySource::~BasicEnergySource ()
+{
+}
+
+void
+BasicEnergySource::SetInitialEnergy (double initialEnergyJ)
+{
+  NS_LOG_FUNCTION (this << initialEnergyJ);
+  NS_ASSERT (initialEnergyJ >= 0);
+  m_initialEnergyJ = initialEnergyJ;
+  m_remainingEnergyJ = m_initialEnergyJ;
+}
+
+void
+BasicEnergySource::SetSupplyVoltage (double supplyVoltageV)
+{
+  NS_LOG_FUNCTION (this << supplyVoltageV);
+  m_supplyVoltageV = supplyVoltageV;
+}
+
+void
+BasicEnergySource::SetEnergyUpdateInterval (Time interval)
+{
+  NS_LOG_FUNCTION (this << interval);
+  m_energyUpdateInterval = interval;
+}
+
+Time
+BasicEnergySource::GetEnergyUpdateInterval (void) const
+{
+  return m_energyUpdateInterval;
+}
+
+double
+BasicEnergySource::GetSupplyVoltage (void) const
+{
+  return m_supplyVoltageV;
+}
+
+double
+BasicEnergySource::GetInitialEnergy (void) const
+{
+  return m_initialEnergyJ;
+}
+
+double
+BasicEnergySource::GetRemainingEnergy (void)
+{
+  NS_LOG_FUNCTION (this);
+  // update energy source to get the latest remaining energy.
+  UpdateEnergySource ();
+  return m_remainingEnergyJ;
+}
+
+double
+BasicEnergySource::GetEnergyFraction (void)
+{
+  NS_LOG_FUNCTION (this);
+  // update energy source to get the latest remaining energy.
+  UpdateEnergySource ();
+  return m_remainingEnergyJ / m_initialEnergyJ;
+}
+
+void
+BasicEnergySource::UpdateEnergySource (void)
+{
+  NS_LOG_FUNCTION (this);
+  NS_LOG_DEBUG ("BasicEnergySource:Updating remaining energy.");
+
+  // do not update if simulation has finished
+  if (Simulator::IsFinished ())
+    {
+      return;
+    }
+
+  m_energyUpdateEvent.Cancel ();
+
+  CalculateRemainingEnergy ();
+
+  if (m_remainingEnergyJ <= 0)
+    {
+      HandleEnergyDrainedEvent ();
+      return; // stop periodic update
+    }
+
+  m_lastUpdateTime = Simulator::Now ();
+
+  m_energyUpdateEvent = Simulator::Schedule (m_energyUpdateInterval,
+                                             &BasicEnergySource::UpdateEnergySource,
+                                             this);
+}
+
+/*
+ * Private functions start here.
+ */
+
+void
+BasicEnergySource::DoStart (void)
+{
+  NS_LOG_FUNCTION (this);
+  UpdateEnergySource ();  // start periodic update
+}
+
+void
+BasicEnergySource::DoDispose (void)
+{
+  NS_LOG_FUNCTION (this);
+  BreakDeviceEnergyModelRefCycle ();  // break reference cycle
+}
+
+void
+BasicEnergySource::HandleEnergyDrainedEvent (void)
+{
+  NS_LOG_FUNCTION (this);
+  NS_LOG_DEBUG ("BasicEnergySource:Energy depleted!");
+  NotifyEnergyDrained (); // notify DeviceEnergyModel objects
+  m_remainingEnergyJ = 0; // energy never goes below 0
+}
+
+void
+BasicEnergySource::CalculateRemainingEnergy (void)
+{
+  NS_LOG_FUNCTION (this);
+  double totalCurrentA = CalculateTotalCurrent ();
+  Time duration = Simulator::Now () - m_lastUpdateTime;
+  NS_ASSERT (duration.GetSeconds () >= 0);
+  // energy = current * voltage * time
+  double energyToDecreaseJ = totalCurrentA * m_supplyVoltageV * duration.GetSeconds ();
+  m_remainingEnergyJ -= energyToDecreaseJ;
+  NS_LOG_DEBUG ("BasicEnergySource:Remaining energy = " << m_remainingEnergyJ);
+}
+
+} // namespace ns3