2026-07-10 10:38:57 +02:00

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()")