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

93 lines
3.4 KiB
Python

from ScEpTIC.emulator.energy import energy_utils
from ScEpTIC.emulator.energy.system_energy_model import SystemEnergyModel
from ScEpTIC.exceptions import ConfigurationException
class ChangePointDetectorLogic:
"""
Base model of the FBTC Changepoint Detector.
"""
def __init__(self, R1, R2, system_model):
"""
:param R1: R1 of the changepoint detector's voltage divider
:param R2: R2 of the changepoint detector's voltage divider
:param system_model: the SystemEnergyModel
"""
if not isinstance(system_model, SystemEnergyModel):
raise ConfigurationException(f"{system_model.__class__.__name__} is not a valid SystemEnergyModel for {self.__class__.__name__}")
self.system_model = system_model
self.R1 = energy_utils.str_to_float(R1)
self.R2 = energy_utils.str_to_float(R2)
self.partition = self.R2 / (self.R1 + self.R2)
def output(self, vreg_voltage):
"""
Outputs the logical value of the Changepoint Detector
:param vreg_voltage: voltage of the voltage regulator
:return: a changepoint is reached
"""
raise Exception(f"{self.__class__.__name__} must implement output()")
def _get_output_charge_detector(self, vreg_voltage):
"""
Outputs the logical value of the Changepoint Detector configured to detect charge
:param vreg_voltage: voltage of the voltage regulator
:return: a charge changepoint is reached
"""
v_buff = self.system_model.energy_buffer.get_voltage() * self.partition
#print(f"Charge state: v_buff = {v_buff}V; v_sup = {vreg_voltage}V; {v_buff > vreg_voltage}")
return v_buff > vreg_voltage
def _get_output_discharge_detector(self, vreg_voltage):
"""
Outputs the logical value of the Changepoint Detector configured to detect discharge
:param vreg_voltage: voltage of the voltage regulator
:return: a discharge changepoint is reached
"""
v_buff = self.system_model.energy_buffer.get_voltage() * self.partition
#print(f"Discharge state: v_buff = {v_buff}V; v_sup = {vreg_voltage}V; {v_buff < vreg_voltage}")
return v_buff < vreg_voltage
class ChangepointChargeDetectorLogic(ChangePointDetectorLogic):
"""
Model of the FBTC Changepoint Charge Detector.
It consists in an OpAmp that outputs if the voltage of the energy buffer is higher than a certain threshold w.r.t.
the voltage of the voltage regulator.
"""
def output(self, vreg_voltage):
"""
Outputs the logical value of the Changepoint Charge Detector
:param vreg_voltage: voltage of the voltage regulator
:return: a charge changepoint is reached
"""
return self._get_output_charge_detector(vreg_voltage)
class ChangepointDischargeDetectorLogic(ChangePointDetectorLogic):
"""
Model of the FBTC Changepoint Discharge Detector.
It consists in an OpAmp that outputs if the voltage of the energy buffer is lower than a certain threshold w.r.t.
the voltage of the voltage regulator.
"""
def output(self, vreg_voltage):
"""
Outputs the logical value of the Changepoint Discharge Detector
:param vreg_voltage: voltage of the voltage regulator
:return: a discharge changepoint is reached
"""
return self._get_output_discharge_detector(vreg_voltage)