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