38 lines
1.0 KiB
Python
38 lines
1.0 KiB
Python
import sys
|
|
import serial
|
|
import struct
|
|
import time
|
|
|
|
from PySide6.QtCore import QObject, Signal
|
|
|
|
START_OF_TEMPS = bytes((0xFF, 0xFF))
|
|
N_SENSORS = 12
|
|
TEMP_QUANT = 0.0625 # °C/quant
|
|
|
|
|
|
class Temperatures(QObject):
|
|
temperaturesUpdated = Signal(list)
|
|
|
|
_temps: list[float]
|
|
|
|
def __init__(self, uart_path: str):
|
|
super().__init__(parent=None)
|
|
self.dev = serial.Serial(uart_path, 115200)
|
|
self._temps = [0.0] * N_SENSORS
|
|
|
|
def run(self):
|
|
while True:
|
|
time.sleep(0.1)
|
|
self.dev.read_until(START_OF_TEMPS)
|
|
data = self.dev.read(N_SENSORS * 2)
|
|
temps = struct.unpack(f">{N_SENSORS}h", data)
|
|
for i, t in enumerate(temps):
|
|
if (t & 0x0F) != 0:
|
|
print(
|
|
f"WARN: temperature had a non-zero least-significant nibble: {t:04x}",
|
|
file=sys.stderr,
|
|
)
|
|
else:
|
|
self._temps[i] = (t >> 4) * TEMP_QUANT
|
|
self.temperaturesUpdated.emit(self._temps)
|