|
@@ -43,50 +43,50 @@ class MeasurementController:
|
|
|
while True:
|
|
while True:
|
|
|
await asyncio.sleep(polling_interval)
|
|
await asyncio.sleep(polling_interval)
|
|
|
for device_id, device in self.devices.items():
|
|
for device_id, device in self.devices.items():
|
|
|
|
|
+ try:
|
|
|
|
|
+ # Read slot status via I2C
|
|
|
|
|
+ new_status_list = self.i2c_service.request_status_list(device.i2c_address, len(device.slots))
|
|
|
|
|
+ except Exception as e:
|
|
|
|
|
+ logger.error(f"Error during polling device: {device.id}:\n{str(e)}")
|
|
|
|
|
+ continue
|
|
|
|
|
+
|
|
|
|
|
+ if len(new_status_list) != len(device.slots):
|
|
|
|
|
+ logger.error(f"Invalid status list length: {len(new_status_list)} != {len(device.slots)}")
|
|
|
|
|
+ continue
|
|
|
|
|
+
|
|
|
|
|
+ # Update the (change of) status for each slot and act accordingly
|
|
|
|
|
+ for idx, status in enumerate(new_status_list):
|
|
|
try:
|
|
try:
|
|
|
- # Read slot status via I2C
|
|
|
|
|
- new_status_list = self.i2c_service.request_status_list(device.i2c_address, len(device.slots))
|
|
|
|
|
- except Exception as e:
|
|
|
|
|
- logger.error(f"Error during polling device: {device.id}:\n{str(e)}")
|
|
|
|
|
- continue
|
|
|
|
|
-
|
|
|
|
|
- if len(new_status_list) != len(device.slots):
|
|
|
|
|
- logger.error(f"Invalid status list length: {len(new_status_list)} != {len(device.slots)}")
|
|
|
|
|
- continue
|
|
|
|
|
-
|
|
|
|
|
- # Change the (change of) status for each slot and act accordingly
|
|
|
|
|
- for idx, status in enumerate(new_status_list):
|
|
|
|
|
- try:
|
|
|
|
|
- slot = device.slots[idx]
|
|
|
|
|
- prev_state = device.status_list[idx]
|
|
|
|
|
- device.status_list[idx] = status
|
|
|
|
|
|
|
+ slot = device.slots[idx]
|
|
|
|
|
+ prev_state = device.status_list[idx]
|
|
|
|
|
+ device.status_list[idx] = status
|
|
|
|
|
|
|
|
- if slot.is_empty() and status is not DeviceStatus.EMPTY:
|
|
|
|
|
- logging.warning(f"Device {device.id}, Slot {slot.id} is empty, but status is {status}")
|
|
|
|
|
- continue
|
|
|
|
|
-
|
|
|
|
|
- # Check for unconfigured cell (could also be when the device resets)
|
|
|
|
|
- cell = slot.get_cell()
|
|
|
|
|
- if status is DeviceStatus.INSERTED and cell and not cell.limits_transmitted:
|
|
|
|
|
- self._update_cell_limits(device, slot)
|
|
|
|
|
- cell.limits_transmitted = True
|
|
|
|
|
- continue
|
|
|
|
|
- # Check for state transitions to "DONE"
|
|
|
|
|
- if prev_state is DeviceStatus.MEASURING and status is DeviceStatus.DONE and cell:
|
|
|
|
|
- self._process_done(device, slot)
|
|
|
|
|
- cell.limits_transmitted = False
|
|
|
|
|
- continue
|
|
|
|
|
- # Check for state transitions to "ERROR"
|
|
|
|
|
- if status is DeviceStatus.ERROR and prev_state is not DeviceStatus.ERROR:
|
|
|
|
|
- self._process_error(device, slot)
|
|
|
|
|
- continue
|
|
|
|
|
- if status is DeviceStatus.MEASURING:
|
|
|
|
|
- self._collect_measurement(device, slot)
|
|
|
|
|
- continue
|
|
|
|
|
|
|
+ if slot.is_empty() and status is not DeviceStatus.EMPTY:
|
|
|
|
|
+ logging.warning(f"Device {device.id}, Slot {slot.id} is empty, but status is {status}")
|
|
|
|
|
+ continue
|
|
|
|
|
+
|
|
|
|
|
+ # Check for unconfigured cell (could also be when the device resets)
|
|
|
|
|
+ cell = slot.get_cell()
|
|
|
|
|
+ if status is DeviceStatus.INSERTED and cell and not cell.limits_transmitted:
|
|
|
|
|
+ self._update_cell_limits(device, slot)
|
|
|
|
|
+ cell.limits_transmitted = True
|
|
|
|
|
+ continue
|
|
|
|
|
+ # Check for state transitions to "DONE"
|
|
|
|
|
+ if prev_state is DeviceStatus.MEASURING and status is DeviceStatus.DONE and cell:
|
|
|
|
|
+ self._process_done(device, slot)
|
|
|
|
|
+ cell.limits_transmitted = False
|
|
|
|
|
+ continue
|
|
|
|
|
+ # Check for state transitions to "ERROR"
|
|
|
|
|
+ if status is DeviceStatus.ERROR and prev_state is not DeviceStatus.ERROR:
|
|
|
|
|
+ self._process_error(device, slot)
|
|
|
|
|
+ continue
|
|
|
|
|
+ if status is DeviceStatus.MEASURING:
|
|
|
|
|
+ self._collect_measurement(device, slot)
|
|
|
|
|
+ continue
|
|
|
|
|
|
|
|
- except Exception as e:
|
|
|
|
|
- logger.error(f"Error during processing status {status} for device {device.id}, slot {slot.id}: {str(e)}")
|
|
|
|
|
- continue
|
|
|
|
|
|
|
+ except Exception as e:
|
|
|
|
|
+ logger.error(f"Error during processing status {status} for device {device.id}, slot {slot.id}: {str(e)}")
|
|
|
|
|
+ continue
|
|
|
|
|
|
|
|
def _update_cell_limits(self, device: Device, slot: Slot):
|
|
def _update_cell_limits(self, device: Device, slot: Slot):
|
|
|
"""Send battery limits to the device."""
|
|
"""Send battery limits to the device."""
|