/* -*- 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;
/**
* \param energyJ Amount of energy to decrease (in Joules)
*
* This function decreases the remaining energy in the energy source by the
* specified amount. Provides linear interface for direct energy deduction.
*/
virtual void DecreaseRemainingEnergy (double energyJ) = 0;
/**
* \param energyJ Amount of energy to increase (in Joules)
*
* This function increases the remaining energy in the energy source by the
* specified amount. Provides linear interface for direct energy increase.
*/
virtual void IncreaseRemainingEnergy (double energyJ) = 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);
private:
/**
* All child's implementation must call BreakDeviceEnergyModelRefCycle to
* ensure reference cycles to DeviceEnergyModel objects are broken.
*/
virtual void DoDispose (void);
private:
/**
* List of device energy models installed on the same node.
*/
DeviceEnergyModelContainer m_models;
/**
* Pointer to node containing this EnergySource.
*/
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 */