From a3f3b2c23e62bdfa73a205faf091ca37e308b2df Mon Sep 17 00:00:00 2001 From: jazzpi Date: Wed, 10 Aug 2022 13:14:43 +0200 Subject: [PATCH] Parse new logging format --- charger-display.py | 70 ++++++++++++++++++++++++++++++++++------------ 1 file changed, 52 insertions(+), 18 deletions(-) diff --git a/charger-display.py b/charger-display.py index 7ae802a..1350114 100755 --- a/charger-display.py +++ b/charger-display.py @@ -33,8 +33,8 @@ LOG_FRAME_LENGTH = 8 # bytes PARALLEL_CELLS = 9 CELLS_PER_SLAVE = 10 TEMP_SENSORS_PER_SLAVE = 32 -VOLTAGE_CONV = 5.0 / 255 # volts/quantum -TEMP_CONV = 0.0625 * 16 # °C/quantum +VOLTAGE_CONV = 5.0 / 0xFFFF # volts/quantum +TEMP_CONV = 0.0625 # °C/quantum ERRORCODE_TIMEOUT_SLAVE = 1 ERRORCODE_SLAVE_PANIC = 2 @@ -53,6 +53,8 @@ MASTER_THRESH_OT = 1 MASTER_THRESH_UV = 2 MASTER_THRESH_OV = 3 +TS_ERROR = 4 + class SlaveData: cell_voltages: list[float] @@ -60,7 +62,9 @@ class SlaveData: def __init__(self) -> None: self.cell_voltages = [-1] * CELLS_PER_SLAVE - self.cell_temps = [-1] * TEMP_SENSORS_PER_SLAVE + self.cell_temps = ([-1] * (TEMP_SENSORS_PER_SLAVE // 2)) + ( + [0] * (TEMP_SENSORS_PER_SLAVE // 2) + ) class AccumulatorData: @@ -492,6 +496,10 @@ class Worker(QObject): self.decode_panic_frame(rx_data[frame_start + 3 : frame_start + 11]) rx_data = rx_data[frame_start + 11 :] continue + elif (frame_start := self.check_status_start(rx_data)) != -1: + self.decode_status_frame(rx_data[frame_start + 3 : frame_start + 11]) + rx_data = rx_data[frame_start + 11 :] + continue break def check_log_start(self, buf: bytes): @@ -503,6 +511,9 @@ class Worker(QObject): def check_panic_start(self, buf: bytes): return buf[:-12].find(b"PAN") + def check_status_start(self, buf: bytes): + return buf[:-12].find(b"STA") + def decode_log_frame(self, buf: bytes): msg_id = buf[0] slave = msg_id >> 4 @@ -512,25 +523,44 @@ class Worker(QObject): return if frame_id == 0: - for i in range(7): - data.slaves[slave].cell_voltages[i] = buf[i + 1] * VOLTAGE_CONV + for i in range(3): + raw = (buf[i * 2 + 1] << 8) | buf[i * 2 + 2] + data.slaves[slave].cell_voltages[i] = raw * VOLTAGE_CONV elif frame_id == 1: for i in range(3): - data.slaves[slave].cell_voltages[i + 7] = buf[i + 1] * VOLTAGE_CONV - for i in range(4): - data.slaves[slave].cell_temps[i] = buf[i + 4] * TEMP_CONV + raw = (buf[i * 2 + 1] << 8) | buf[i * 2 + 2] + data.slaves[slave].cell_voltages[i + 3] = raw * VOLTAGE_CONV elif frame_id == 2: - for i in range(7): - data.slaves[slave].cell_temps[i + 4] = buf[i + 1] * TEMP_CONV + for i in range(3): + raw = (buf[i * 2 + 1] << 8) | buf[i * 2 + 2] + data.slaves[slave].cell_voltages[i + 6] = raw * VOLTAGE_CONV elif frame_id == 3: - for i in range(7): - data.slaves[slave].cell_temps[i + 11] = buf[i + 1] * TEMP_CONV + for i in range(1): + raw = (buf[i * 2 + 1] << 8) | buf[i * 2 + 2] + data.slaves[slave].cell_voltages[i + 9] = raw * VOLTAGE_CONV + for i in range(2): + raw = (buf[i * 2 + 3] << 8) | buf[i * 2 + 4] + data.slaves[slave].cell_temps[i] = raw * TEMP_CONV elif frame_id == 4: - for i in range(7): - data.slaves[slave].cell_temps[i + 18] = buf[i + 1] * TEMP_CONV + for i in range(3): + raw = (buf[i * 2 + 1] << 8) | buf[i * 2 + 2] + data.slaves[slave].cell_temps[i + 2] = raw * TEMP_CONV elif frame_id == 5: - for i in range(7): - data.slaves[slave].cell_temps[i + 25] = buf[i + 1] * TEMP_CONV + for i in range(3): + raw = (buf[i * 2 + 1] << 8) | buf[i * 2 + 2] + data.slaves[slave].cell_temps[i + 5] = raw * TEMP_CONV + elif frame_id == 6: + for i in range(3): + raw = (buf[i * 2 + 1] << 8) | buf[i * 2 + 2] + data.slaves[slave].cell_temps[i + 8] = raw * TEMP_CONV + elif frame_id == 7: + for i in range(3): + raw = (buf[i * 2 + 1] << 8) | buf[i * 2 + 2] + data.slaves[slave].cell_temps[i + 11] = raw * TEMP_CONV + elif frame_id == 8: + for i in range(3): + raw = (buf[i * 2 + 1] << 8) | buf[i * 2 + 2] + data.slaves[slave].cell_temps[i + 14] = raw * TEMP_CONV else: print(f"Unknown frame ID: {frame_id} (buf: {repr(buf)})", file=sys.stderr) # time.sleep(1) @@ -609,6 +639,10 @@ class Worker(QObject): data.panic_errorcode = buf[0] data.panic_errorarg = buf[1] + def decode_status_frame(self, buf: bytes): + ts_state = buf[1] & 0x7F + data.panic = ts_state == TS_ERROR + INTERNAL_RESISTANCE_CURVE_X = [2.0, 4.12] INTERNAL_RESISTANCE_CURVE_Y = [0.0528, 0.0294] SOC_OCV_X = [2.1, 2.9, 3.2, 3.3, 3.4, 3.5, 3.68, 4.0, 4.15, 4.2] @@ -633,8 +667,8 @@ class Worker(QObject): temps = [-1] min_t = min(temps) max_t = max(temps) - for i in range(16, 32): - data.slaves[slave].cell_temps[i] = random.randint(min_t, max_t) + # for i in range(16, 32): + # data.slaves[slave].cell_temps[i] = random.randint(min_t, max_t) def stop(self): self.continue_run = False # set the run condition to false on stop