75 lines
2.6 KiB
Python
75 lines
2.6 KiB
Python
from ScEpTIC.emulator.energy import energy_utils
|
|
from ScEpTIC.exceptions import ConfigurationException
|
|
from ScEpTIC.emulator.energy.energy_source import EnergySourceModel
|
|
|
|
|
|
class EnergyHarvesterModel:
|
|
"""
|
|
Base class of an energy harvester.
|
|
"""
|
|
|
|
__DEFAULT_R = 30000.0
|
|
|
|
def __init__(self, equivalent_resistance=None):
|
|
"""
|
|
:param equivalent_resistance: Equivalent resistance of the energy harvester.
|
|
"""
|
|
self.energy_source = None
|
|
self.equivalent_resistance = self.__DEFAULT_R
|
|
|
|
self.update_energy_source_load_resistance = False
|
|
|
|
if equivalent_resistance is not None:
|
|
self.set_equivalent_resistance(equivalent_resistance)
|
|
|
|
# Proxy energy source method
|
|
self.get_current_sample_remaining_time = lambda: exec('raise Exception("Energy source not attached!")')
|
|
|
|
def set_equivalent_resistance(self, r):
|
|
"""
|
|
Sets the energy harvester equivalent resistance
|
|
:param r: the equivalent resistance (str)
|
|
"""
|
|
self.equivalent_resistance = energy_utils.str_to_float(r)
|
|
|
|
if self.update_energy_source_load_resistance and self.energy_source is not None:
|
|
self.energy_source.set_load_resistance(self.equivalent_resistance)
|
|
|
|
def get_equivalent_resistance(self):
|
|
"""
|
|
:return: The equivalent resistance of the energy harvester.
|
|
"""
|
|
return self.equivalent_resistance
|
|
|
|
def attach_energy_source(self, energy_source):
|
|
"""
|
|
:param energy_source: an energy source model
|
|
"""
|
|
if not isinstance(energy_source, EnergySourceModel):
|
|
raise ConfigurationException(f"{self.__class__.__name__}.attach_energy_source() requires a EnergySourceModel but {energy_source.__class__.__name__} was given")
|
|
|
|
self.energy_source = energy_source
|
|
self.get_current_sample_remaining_time = energy_source.get_current_sample_remaining_time
|
|
|
|
if self.energy_source.load_resistance_unset():
|
|
self.update_energy_source_load_resistance = True
|
|
|
|
if self.update_energy_source_load_resistance:
|
|
self.energy_source.set_load_resistance(self.equivalent_resistance)
|
|
|
|
|
|
def get_voltage(self):
|
|
"""
|
|
:return: energy harvester current voltage
|
|
"""
|
|
raise NotImplementedError(f"{self.__class__.__name__} must implement get_voltage()")
|
|
|
|
|
|
def get_voltage_intervals(self, t):
|
|
"""
|
|
Returns voltage intervals of the energy source
|
|
:param t: elapsed time
|
|
:return: a list of (voltage, energy, elapsed_time)
|
|
"""
|
|
raise NotImplementedError(f"{self.__class__.__name__} must implement get_voltage_intervals()")
|