Supporting comnmands

This commit is contained in:
jpk 2020-01-30 09:46:57 +01:00
parent b814c713a4
commit fd29339116
2 changed files with 70 additions and 19 deletions

View File

@ -1,5 +1,6 @@
from time import sleep from time import sleep
from struct import unpack from struct import unpack
from enum import Enum
from collections import namedtuple from collections import namedtuple
import bluetooth 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(): def discover_devices():
@ -67,7 +74,7 @@ def discover_devices():
""" """
try: try:
nearby_devices = bluetooth.discover_devices(lookup_names=True) nearby_devices = bluetooth.discover_devices(lookup_names=True)
except OSError as oserr: except OSError:
raise Exception('Cannot access bluetooth controller.') raise Exception('Cannot access bluetooth controller.')
um24_meters = [] um24_meters = []
@ -128,10 +135,16 @@ def is_connected():
return False return False
def get_meter_stats(timeout=50): def send_command(command):
global rfcomm global rfcomm
rfcomm.send(UM24C_GET_STATUS) rfcomm.send(command.value)
sleep(timeout) sleep(0.25)
def get_meter_stats():
global rfcomm
rfcomm.send(Command.GET_STATUS.value)
sleep(0.25)
data = rfcomm.recv(0x8f) data = rfcomm.recv(0x8f)
# assert len(data) == 130 # assert len(data) == 130
# assert data[0:2] == PACKET_MAGIC[0] and data[-2:] == PACKET_MAGIC[1] # 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', values[i] = int.from_bytes(value.strip(b'\x00'), 'big',
signed=False) signed=False)
return UMeterStatus(*values) return UMeterStatus(*values)
except: except Exception:
return None return None

View File

@ -1,7 +1,6 @@
#!/usr/bin/env python #!/usr/bin/env python
import sys import sys
import traceback import traceback
import random
from PySide2.QtCore import ( from PySide2.QtCore import (
Qt, QTimer, QObject, Signal, Slot, QRunnable, QThreadPool Qt, QTimer, QObject, Signal, Slot, QRunnable, QThreadPool
@ -63,7 +62,7 @@ class UM24LabUIWorker(QRunnable):
def run(self): def run(self):
try: try:
result = self.fn(*self.args, **self.kwargs) result = self.fn(*self.args, **self.kwargs)
except: except Exception:
traceback.print_exc() traceback.print_exc()
exctype, value = sys.exc_info()[:2] exctype, value = sys.exc_info()[:2]
self.signals.error.emit((exctype, value, traceback.format_exc())) self.signals.error.emit((exctype, value, traceback.format_exc()))
@ -90,15 +89,14 @@ class UM24LabWorker(UM24LabUIWorker):
while um24c.is_connected(): while um24c.is_connected():
try: try:
result = self.fn(*self.args, **self.kwargs) result = self.fn(*self.args, **self.kwargs)
except: # self.signals.progress.emit(result)
except Exception:
traceback.print_exc() traceback.print_exc()
exctype, value = sys.exc_info()[:2] 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: else:
self.signals.result.emit(result) self.signals.result.emit(result)
finally:
self.signals.finished.emit()
class UM24Lab(QMainWindow): class UM24Lab(QMainWindow):
@ -133,12 +131,17 @@ class UM24Lab(QMainWindow):
# TODO: Add splash screen, discover in background # TODO: Add splash screen, discover in background
self.action_discover_devices() 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 --- # --- Plot setup ---
self._setup_plots() self._setup_plots()
self.timer_step = 0 self.timer_step = 0
timer = QTimer(self) # timer = QTimer(self)
timer.timeout.connect(self.update_graphs) # timer.timeout.connect(self.update_graphs)
timer.start(50) # timer.start(50)
def _setup_plots(self): def _setup_plots(self):
self.ui.plotVoltage = QtCharts.QChart() self.ui.plotVoltage = QtCharts.QChart()
@ -191,6 +194,18 @@ class UM24Lab(QMainWindow):
self.current.addAxis(axis_y, Qt.AlignLeft) self.current.addAxis(axis_y, Qt.AlignLeft)
self.current_series.attachAxis(axis_y) 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): def do_discover_devices(self, progress_callback):
return um24c.discover_devices() return um24c.discover_devices()
@ -248,19 +263,41 @@ class UM24Lab(QMainWindow):
def update_stats_progress(self, current): def update_stats_progress(self, current):
self.meter_stats = 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): def action_update_stats(self):
worker = UM24LabWorker(self.do_update_stats) worker = UM24LabWorker(self.do_update_stats)
worker.signals.progress.connect(self.update_stats_progress) worker.signals.progress.connect(self.update_stats_progress)
worker.signals.finished.connect(self.update_stats_finished)
self.threadpool.start(worker) self.threadpool.start(worker)
def update_graphs(self): def update_graphs(self):
if um24c.is_connected() and self.meter_stats: if um24c.is_connected() and self.meter_stats:
ui = self.ui ui = self.ui
ui.lcdVoltage.display(self.meter_stats.Voltage / 100) 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 ui.lcdImpedance.display(self.meter_stats.Load_equivalent_impedance
/ 10) / 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.lcdTempC.display(self.meter_stats.Temperature_Celcius)
ui.lcdTempF.display(self.meter_stats.Temperature_Fahrenheit) ui.lcdTempF.display(self.meter_stats.Temperature_Fahrenheit)
ui.progressTempC.setValue(self.meter_stats.Temperature_Celcius) 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.spinStopCurrent.setValue(self.meter_stats.Current_Trigger / 100)
ui.sliderBrightness.setValue(self.meter_stats.Display_brightness) ui.sliderBrightness.setValue(self.meter_stats.Display_brightness)
ui.sliderScreenOff.setValue(self.meter_stats.Display_timeout) 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.voltage_series.append(self.timer_step, random.randint(0, 10))
# self.current_series.append(self.timer_step, random.randint(0, 10)) # self.current_series.append(self.timer_step, random.randint(0, 10))