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 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

View File

@ -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))