diff --git a/src/meter/um24c.py b/src/meter/um24c.py index de574c9..73367cf 100644 --- a/src/meter/um24c.py +++ b/src/meter/um24c.py @@ -1,5 +1,6 @@ from time import sleep from struct import unpack +from enum import Enum from collections import namedtuple import bluetooth @@ -50,7 +51,13 @@ UMeterStatus = namedtuple('UMeterStatus', [ ) -UM24C_GET_STATUS = b'\xf0' +class Command(Enum): + GET_STATUS = b'\xf0' + NEXT_SCREEN = b'\xf1' + ROTATE_SCREEN = b'\xf2' + NEXT_GROUP = b'\xf3' + CLEAR_GROUP = b'\xf4' + # TODO: brightness def discover_devices(): @@ -67,7 +74,7 @@ def discover_devices(): """ try: nearby_devices = bluetooth.discover_devices(lookup_names=True) - except OSError as oserr: + except OSError: raise Exception('Cannot access bluetooth controller.') um24_meters = [] @@ -128,10 +135,16 @@ def is_connected(): return False -def get_meter_stats(timeout=50): +def send_command(command): global rfcomm - rfcomm.send(UM24C_GET_STATUS) - sleep(timeout) + rfcomm.send(command.value) + sleep(0.25) + + +def get_meter_stats(): + global rfcomm + rfcomm.send(Command.GET_STATUS.value) + sleep(0.25) data = rfcomm.recv(0x8f) # assert len(data) == 130 # assert data[0:2] == PACKET_MAGIC[0] and data[-2:] == PACKET_MAGIC[1] @@ -142,5 +155,5 @@ def get_meter_stats(timeout=50): values[i] = int.from_bytes(value.strip(b'\x00'), 'big', signed=False) return UMeterStatus(*values) - except: + except Exception: return None diff --git a/src/um24clab.py b/src/um24clab.py index 644ccb0..c89d291 100644 --- a/src/um24clab.py +++ b/src/um24clab.py @@ -1,7 +1,6 @@ #!/usr/bin/env python import sys import traceback -import random from PySide2.QtCore import ( Qt, QTimer, QObject, Signal, Slot, QRunnable, QThreadPool @@ -63,7 +62,7 @@ class UM24LabUIWorker(QRunnable): def run(self): try: result = self.fn(*self.args, **self.kwargs) - except: + except Exception: traceback.print_exc() exctype, value = sys.exc_info()[:2] self.signals.error.emit((exctype, value, traceback.format_exc())) @@ -90,15 +89,14 @@ class UM24LabWorker(UM24LabUIWorker): while um24c.is_connected(): try: result = self.fn(*self.args, **self.kwargs) - except: + # self.signals.progress.emit(result) + except Exception: traceback.print_exc() exctype, value = sys.exc_info()[:2] - self.signals.error.emit((exctype, value, traceback.format_exc())) + self.signals.error.emit((exctype, value, + traceback.format_exc())) else: self.signals.result.emit(result) - finally: - self.signals.finished.emit() - class UM24Lab(QMainWindow): @@ -133,12 +131,17 @@ class UM24Lab(QMainWindow): # TODO: Add splash screen, discover in background self.action_discover_devices() + self.ui.buttonNextScreen.clicked.connect(self.action_next_screen) + self.ui.buttonSwitchGroup.clicked.connect(self.action_next_group) + self.ui.buttonClearData.clicked.connect(self.action_clear_group) + self.ui.buttonRotateScreen.clicked.connect(self.action_rotate_screen) + # --- Plot setup --- self._setup_plots() self.timer_step = 0 - timer = QTimer(self) - timer.timeout.connect(self.update_graphs) - timer.start(50) + # timer = QTimer(self) + # timer.timeout.connect(self.update_graphs) + # timer.start(50) def _setup_plots(self): self.ui.plotVoltage = QtCharts.QChart() @@ -191,6 +194,18 @@ class UM24Lab(QMainWindow): self.current.addAxis(axis_y, Qt.AlignLeft) self.current_series.attachAxis(axis_y) + def action_next_screen(self): + um24c.send_command(um24c.Command.NEXT_SCREEN) + + def action_next_group(self): + um24c.send_command(um24c.Command.NEXT_GROUP) + + def action_rotate_screen(self): + um24c.send_command(um24c.Command.ROTATE_SCREEN) + + def action_clear_group(self): + um24c.send_command(um24c.Command.CLEAR_GROUP) + def do_discover_devices(self, progress_callback): return um24c.discover_devices() @@ -248,19 +263,41 @@ class UM24Lab(QMainWindow): def update_stats_progress(self, current): self.meter_stats = current + def update_stats_finished(self): + ui = self.ui + ui.lcdVoltage.display(self.meter_stats.Voltage / 100) + ui.lcdCurrent.display(self.meter_stats.Current / 1000) + ui.lcdImpedance.display(self.meter_stats.Load_equivalent_impedance + / 10) + ui.lcdPower.display(self.meter_stats.Power / 1000) + ui.lcdTempC.display(self.meter_stats.Temperature_Celcius) + ui.lcdTempF.display(self.meter_stats.Temperature_Fahrenheit) + ui.progressTempC.setValue(self.meter_stats.Temperature_Celcius) + ui.progressTempF.setValue(self.meter_stats.Temperature_Fahrenheit) + ui.lcdDataMinus.display(self.meter_stats.DMinus / 100) + ui.lcdDataPlus.display(self.meter_stats.DPlus / 100) + ui.lcdCapacityRecorded.display(self.meter_stats.Recorded_Capacity) + ui.lcdEnergyRecorded.display(self.meter_stats.Recorded_Energy) + ui.spinStopCurrent.setValue(self.meter_stats.Current_Trigger / 100) + ui.sliderBrightness.setValue(self.meter_stats.Display_brightness) + ui.sliderScreenOff.setValue(self.meter_stats.Display_timeout) + ui.buttonGroup.buttons()[self.meter_stats.Current_screen] \ + .setChecked(True) + def action_update_stats(self): worker = UM24LabWorker(self.do_update_stats) worker.signals.progress.connect(self.update_stats_progress) + worker.signals.finished.connect(self.update_stats_finished) self.threadpool.start(worker) def update_graphs(self): if um24c.is_connected() and self.meter_stats: ui = self.ui ui.lcdVoltage.display(self.meter_stats.Voltage / 100) - ui.lcdCurrent.display(self.meter_stats.Current / 100) + ui.lcdCurrent.display(self.meter_stats.Current / 1000) ui.lcdImpedance.display(self.meter_stats.Load_equivalent_impedance / 10) - ui.lcdPower.display(self.meter_stats.Power / 100) + ui.lcdPower.display(self.meter_stats.Power / 1000) ui.lcdTempC.display(self.meter_stats.Temperature_Celcius) ui.lcdTempF.display(self.meter_stats.Temperature_Fahrenheit) ui.progressTempC.setValue(self.meter_stats.Temperature_Celcius) @@ -272,7 +309,8 @@ class UM24Lab(QMainWindow): ui.spinStopCurrent.setValue(self.meter_stats.Current_Trigger / 100) ui.sliderBrightness.setValue(self.meter_stats.Display_brightness) ui.sliderScreenOff.setValue(self.meter_stats.Display_timeout) - ui.buttonGroup.buttons()[self.meter_stats.Current_screen].setChecked(True) + ui.buttonGroup.buttons()[self.meter_stats.Current_screen] \ + .setChecked(True) # self.voltage_series.append(self.timer_step, random.randint(0, 10)) # self.current_series.append(self.timer_step, random.randint(0, 10))