Supporting comnmands
This commit is contained in:
parent
b814c713a4
commit
fd29339116
|
@ -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
|
||||
|
|
|
@ -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))
|
||||
|
|
Loading…
Reference in New Issue