src/energy/model/energy-source.h
changeset 6938 85d201f1c67f
parent 6699 d8909a1fd0ff
child 7238 85a7e87bb4cc
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/energy/model/energy-source.h	Tue Mar 22 16:40:32 2011 -0700
@@ -0,0 +1,205 @@
+/* -*-  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>
+ */
+
+#ifndef ENERGY_SOURCE_H
+#define ENERGY_SOURCE_H
+
+#include "ns3/object.h"
+#include "ns3/ptr.h"
+#include "ns3/type-id.h"
+#include "ns3/node.h"
+#include "device-energy-model-container.h"  // #include "device-energy-model.h"
+
+namespace ns3 {
+
+/**
+ * \brief Energy source base class.
+ *
+ * This is the base class for energy sources. Energy sources keep track of
+ * remaining energy. Device energy models will be updating the remaining energy
+ * in the energy source. The energy source itself does not update the remaining
+ * energy. Energy source also keeps a list of device energy models installed on
+ * the same node. When the remaining energy level reaches 0, the energy source
+ * will notify all device energy models stored in the list.
+ *
+ * EnergySource provides 2 types of interfaces for DeviceEnergyModels to update
+ * the remaining energy stored in EnergySource:
+ *  -Direct energy update interface (Joules):
+ *    DecreaseRemainingEnergy
+ *    IncreaseRemainingEnergy
+ *  -Indirect energy update interface (Current):
+ *    UpdateEnergySource
+ * Direct energy update interface will decrease/increase energy from the source
+ * directly (in Joules). Direct energy update interface is typically used by
+ * simple DeviceEnergyModel which knows only average power consumption for each
+ * of its state.
+ * Indirect energy update interface uses the total current cumulated from all
+ * DeviceEnergyModel to calculate energy to decrease from the source. Indirect
+ * energy update interface is typically used by DeviceEnergyModel who knows its
+ * current draw for each of its states. Nonlinear EnergySource also uses this
+ * interface.
+ *
+ * Unit of energy is chosen as Joules since energy models typically calculate
+ * energy as (time in seconds * power in Watts). If the energy source stores
+ * energy in different units (eg. kWh), a simple converter function should
+ * suffice.
+ */
+class EnergySource : public Object
+{
+public:
+  static TypeId GetTypeId (void);
+  EnergySource ();
+  virtual ~EnergySource ();
+
+  /**
+   * \returns Supply voltage of the energy source.
+   *
+   * Set method is to be defined in child class only if necessary. For sources
+   * with a fixed supply voltage, set method is not needed.
+   */
+  virtual double GetSupplyVoltage (void) const = 0;
+
+  /**
+   * \returns Initial energy (capacity) of the energy source.
+   *
+   * Set method is to be defined in child class only if necessary. For sources
+   * with a fixed initial energy (energy capacity), set method is not needed.
+   */
+  virtual double GetInitialEnergy (void) const = 0;
+
+  /**
+   * \returns Remaining energy at the energy source.
+   */
+  virtual double GetRemainingEnergy (void) = 0;
+
+  /**
+   * \return Energy fraction = remaining energy / initial energy [0, 1]
+   *
+   * This function returns the percentage of energy left in the energy source.
+   */
+  virtual double GetEnergyFraction (void) = 0;
+
+  /**
+   * This function goes through the list of DeviceEnergyModels to obtain total
+   * current draw at the energy source and updates remaining energy. Called by
+   * DeviceEnergyModels to inform EnergySource of a state change.
+   */
+  virtual void UpdateEnergySource (void) = 0;
+
+  /**
+   * \brief Sets pointer to node containing this EnergySource.
+   *
+   * \param node Pointer to node containing this EnergySource.
+   */
+  void SetNode (Ptr<Node> node);
+
+  /**
+   * \returns Pointer to node containing this EnergySource.
+   *
+   * When a subclass needs to get access to the underlying node base class to
+   * print the nodeId for example, it can invoke this method.
+   */
+  Ptr<Node> GetNode (void) const;
+
+  /**
+   * \param deviceEnergyModelPtr Pointer to device energy model.
+   *
+   * This function appends a device energy model to the end of a list of
+   * DeviceEnergyModelInfo structs.
+   */
+  void AppendDeviceEnergyModel (Ptr<DeviceEnergyModel> deviceEnergyModelPtr);
+
+  /**
+   * \param tid TypeId of the DeviceEnergyModel we are searching for.
+   * \returns List of pointers to DeviceEnergyModel objects installed on node.
+   */
+  DeviceEnergyModelContainer FindDeviceEnergyModels (TypeId tid);
+
+  /**
+   * \param name name of the DeviceEnergyModel we are searching for.
+   * \returns List of pointers to DeviceEnergyModel objects installed on node.
+   */
+  DeviceEnergyModelContainer FindDeviceEnergyModels (std::string name);
+
+  /**
+   * Calls Start () method of the device energy models. Device energy models are
+   * not aggregated to the node, therefore we need to manually start them here.
+   * Called by EnergySourceContainer, which is aggregated to the node.
+   */
+  void StartDeviceModels (void);
+
+  /**
+   * Calls Dispose () method of the device energy models. Device energy models
+   * are not aggregated to the node, therefore we need to manually start them
+   * here. Called by EnergySourceContainer, which is aggregated to the node.
+   */
+  void DisposeDeviceModels (void);
+
+
+private:
+  /**
+   * All child's implementation must call BreakDeviceEnergyModelRefCycle to
+   * ensure reference cycles to DeviceEnergyModel objects are broken.
+   *
+   * Defined in ns3::Object
+   */
+  virtual void DoDispose (void);
+
+private:
+  /**
+   * List of device energy models installed on the same node.
+   */
+  DeviceEnergyModelContainer m_models;
+
+  /**
+   * Pointer to node containing this EnergySource. Used by helper class to make
+   * sure device models are installed onto the corresponding node.
+   */
+  Ptr<Node> m_node;
+
+
+protected:
+  /**
+   * \returns Total current draw from all DeviceEnergyModels.
+   */
+  double CalculateTotalCurrent (void);
+
+  /**
+   * This function notifies all DeviceEnergyModel of energy depletion event. It
+   * is called by the child EnergySource class when energy depletion happens.
+   */
+  void NotifyEnergyDrained (void);
+
+  /**
+   * This function is called to break reference cycle between EnergySource and
+   * DeviceEnergyModel. Child of the EnergySource base class must call this
+   * function in their implementation of DoDispose to make sure the reference
+   * cycle is broken.
+   *
+   * Normally this work will be completed by the DoDispose function. However it
+   * will be overridden in the child class. Hence we introduced this function.
+   */
+  void BreakDeviceEnergyModelRefCycle (void);
+
+};
+
+} // namespace ns3
+
+#endif /* ENERGY_SOURCE_H */