diff --git a/ohmpi/hardware_components/abstract_hardware_components.py b/ohmpi/hardware_components/abstract_hardware_components.py index f2e61dbb0e3156d26ab48f8ff80cf106d7cbe168..60999509e7b93dd1f91ac2f6e66cc44d3fd6537c 100644 --- a/ohmpi/hardware_components/abstract_hardware_components.py +++ b/ohmpi/hardware_components/abstract_hardware_components.py @@ -56,6 +56,7 @@ class PwrAbstract(ABC): self._voltage_min = kwargs.pop('voltage_min', 0.) self._voltage_max = kwargs.pop('voltage_max', 0.) self.connection = kwargs.pop('connection', None) + self._battery_voltage = np.nan @property @abstractmethod @@ -92,10 +93,20 @@ class PwrAbstract(ABC): if not self.voltage_adjustable: self.exec_logger.debug(f'Voltage cannot be set on {self.model}...') else: - assert self._voltage_min < value < self._voltage_max + assert self._voltage_min <= value <= self._voltage_max # add actions to set the DPS voltage self._voltage = value + def battery_voltage(self): + # add actions to read the DPS voltage + self.exec_logger.debug(f'Battery voltage cannot be read on {self.model}...') + return self._battery_voltage + + def reset_voltage(self): + if not self.voltage_adjustable: + self.exec_logger.debug(f'Voltage cannot be set on {self.model}...') + else: + self.voltage = self._voltage_min class MuxAbstract(ABC): def __init__(self, **kwargs): diff --git a/ohmpi/hardware_components/mb_2023_0_X.py b/ohmpi/hardware_components/mb_2023_0_X.py index 196d54e1f322e03f4420a5f8428a0de385e90f65..bd98758be653b9f85842d8c184848ffdc6963945 100644 --- a/ohmpi/hardware_components/mb_2023_0_X.py +++ b/ohmpi/hardware_components/mb_2023_0_X.py @@ -7,6 +7,7 @@ from digitalio import Direction # noqa from busio import I2C # noqa import time import os +import numpy as np from ohmpi.hardware_components import TxAbstract, RxAbstract from ohmpi.utils import enforce_specs @@ -181,9 +182,13 @@ class Tx(TxAbstract): @property def tx_bat(self): - self.soh_logger.warning(f'Cannot get battery voltage on {self.model}') - self.exec_logger.debug(f'{self.model} cannot read battery voltage. Returning default battery voltage.') - return self.pwr.voltage + if np.isnan(self.tx.pwr.battery_voltage): + self.soh_logger.warning(f'Cannot get battery voltage on {self.model}') + self.exec_logger.debug(f'{self.model} cannot read battery voltage. Returning default battery voltage.') + return self.pwr.voltage + else: + return self.tx.pwr.battery_voltage + def voltage_pulse(self, voltage=None, length=None, polarity=1): """ Generates a square voltage pulse diff --git a/ohmpi/hardware_components/mb_2024_0_2.py b/ohmpi/hardware_components/mb_2024_0_2.py index 62b32bed182f79ba8fd0c63a2dbb4fd178c6645d..5ace4148597d7b9cd5deb324566abf894e7ff432 100644 --- a/ohmpi/hardware_components/mb_2024_0_2.py +++ b/ohmpi/hardware_components/mb_2024_0_2.py @@ -91,7 +91,6 @@ class Tx(Tx_mb_2023): Tx_mb_2023.inject(self, polarity=polarity, injection_duration=injection_duration) self.pin6.value = False - class Rx(Rx_mb_2023): def __init__(self, **kwargs): if 'model' not in kwargs.keys(): diff --git a/ohmpi/hardware_components/pwr_dps5005.py b/ohmpi/hardware_components/pwr_dps5005.py index 1ee2f2bb86ff7fbfe531ddc5da6a554833547f69..7de8394941872304a7cacc29c953c2de6b6ac61b 100644 --- a/ohmpi/hardware_components/pwr_dps5005.py +++ b/ohmpi/hardware_components/pwr_dps5005.py @@ -2,12 +2,15 @@ from ohmpi.hardware_components.abstract_hardware_components import PwrAbstract import numpy as np import datetime import os +import time from ohmpi.utils import enforce_specs #import minimalmodbus # noqa # hardware characteristics and limitations SPECS = {'model': {'default': os.path.basename(__file__).rstrip('.py')}, 'voltage': {'default': 12., 'max': 50., 'min': 0.}, + 'voltage_min': {'default': 0}, + 'voltage_max': {'default': 0}, 'current_max': {'default': 100.}, 'current_adjustable': {'default': False}, 'voltage_adjustable': {'default': True} @@ -54,20 +57,21 @@ class Pwr(PwrAbstract): def turn_on(self): self.connection.write_register(0x09, 1) self.exec_logger.debug(f'{self.model} is on') + time.sleep(.3) @property def voltage(self): - return PwrAbstract.voltage.fget(self) + # return PwrAbstract.voltage.fget(self) + return self._voltage @voltage.setter def voltage(self, value): self.connection.write_register(0x0000, value, 2) + self._voltage = value def battery_voltage(self): - self.connection.read_register(0x05, 2) + self._battery_voltage = self.connection.read_register(0x05, 2) + return self._battery_voltage def current_max(self, value): self.connection.write_register(0x0001, value * 10, 0) - - def reset_voltage(self): - self.DPS.write_register(0x0000, 0, 2) # reset to 0 volt \ No newline at end of file diff --git a/ohmpi/hardware_system.py b/ohmpi/hardware_system.py index 19c0724c58b6de1adc4e541ecb4c717a76524bf4..7997e50eb49bdb9215f4f8b22f8c274ba7e7426a 100644 --- a/ohmpi/hardware_system.py +++ b/ohmpi/hardware_system.py @@ -209,7 +209,7 @@ class OhmPiHardware: mux.barrier = self.mux_barrier @property - def pulses(self): + def pulses(self): # TODO: is this obsolete? pulses = {} for i in np.unique(self.readings[:, 1]): r = self.readings[self.readings[:, 1] == i, :] @@ -409,15 +409,16 @@ class OhmPiHardware: self._vab_pulses(vab, durations, sampling_rate, polarities=polarities, append=append) self.exec_logger.event(f'OhmPiHardware\tvab_square_wave\tend\t{datetime.datetime.utcnow()}') - def _vab_pulse(self, vab, duration, sampling_rate=None, polarity=1, append=False): + def _vab_pulse(self, vab=None, duration=1., sampling_rate=None, polarity=1, append=False): """ Gets VMN and IAB from a single voltage pulse """ #self.tx.polarity = polarity if sampling_rate is None: sampling_rate = RX_CONFIG['sampling_rate'] if self.tx.pwr.voltage_adjustable: - self.tx.pwr.voltage = vab - else: + if self.tx.pwr.voltage != vab: + self.tx.pwr.voltage = vab + else : vab = self.tx.pwr.voltage # reads current and voltage during the pulse injection = Thread(target=self._inject, kwargs={'injection_duration': duration, 'polarity': polarity}) @@ -431,6 +432,10 @@ class OhmPiHardware: def _vab_pulses(self, vab, durations, sampling_rate, polarities=None, append=False): n_pulses = len(durations) self.exec_logger.debug(f'n_pulses: {n_pulses}') + if self.tx.pwr.voltage_adjustable: + self.tx.pwr.voltage = vab + else: + vab = self.tx.pwr.voltage if sampling_rate is None: sampling_rate = RX_CONFIG['sampling_rate'] if polarities is not None: @@ -440,7 +445,7 @@ class OhmPiHardware: if not append: self._clear_values() for i in range(n_pulses): - self._vab_pulse(self, duration=durations[i], sampling_rate=sampling_rate, polarity=polarities[i], + self._vab_pulse(self, vab, duration=durations[i], sampling_rate=sampling_rate, polarity=polarities[i], append=True) def switch_mux(self, electrodes, roles=None, state='off', **kwargs):