From 311bf3e60bbcfcbf67043f0499273e545d83106b Mon Sep 17 00:00:00 2001 From: KubaPro010 Date: Sun, 15 Feb 2026 09:17:37 +0100 Subject: [PATCH] add some stuff --- protocol.py | 51 +++++++++++++++++++++++++++++++++++++++++++++++++++ rtc.py | 21 +++++++++++++++++++++ 2 files changed, 72 insertions(+) create mode 100644 protocol.py create mode 100644 rtc.py diff --git a/protocol.py b/protocol.py new file mode 100644 index 0000000..e9123eb --- /dev/null +++ b/protocol.py @@ -0,0 +1,51 @@ +import serial +import struct +import time + +class I2CPCClient: + def __init__(self, port, baudrate=115200, timeout=1): + self.ser = serial.Serial(port=port, baudrate=baudrate, timeout=timeout) + self.ser.write(b"~/") + self.ser.flush() + while not ((d := self.ser.read_all()) and b"\x01\xff" in d): time.sleep(0.01) + + def _send_packet(self, payload: bytes): + self.ser.write(bytes([len(payload)]) + payload) + + # Read response length + resp_len_raw = self.ser.read(1) + if not resp_len_raw: + raise TimeoutError("Error") + + resp_len = resp_len_raw[0] + response = self.ser.read(resp_len) + + if len(response) != resp_len: raise TimeoutError("Incomplete response") + + return response + + def set_clock(self, clock_hz: int): + payload = bytes([0]) + struct.pack(">I", clock_hz) + return self._send_packet(payload) + + def write_i2c(self, addr: int, data: bytes): + payload = bytes([1, addr]) + data + return self._send_packet(payload) + + def write_read_i2c(self, addr: int, write_data: bytes, read_len: int): + payload = bytes([2, addr, len(write_data)]) + write_data + bytes([read_len]) + return self._send_packet(payload) + + def version(self): return self._send_packet(bytes([4])) + + def quit(self): return self._send_packet(bytes([3])) + + def reboot(self): return self._send_packet(bytes([5])) + + def set_baudrate(self, baud: int): + payload = bytes([6]) + struct.pack(">I", baud) + out = self._send_packet(payload) + self.ser.baudrate = baud + return out + + def close(self): self.ser.close() \ No newline at end of file diff --git a/rtc.py b/rtc.py new file mode 100644 index 0000000..1347e31 --- /dev/null +++ b/rtc.py @@ -0,0 +1,21 @@ +import datetime +from protocol import I2CPCClient + +def sync_rtc(p: I2CPCClient): + ADDRESS = 0x32 + p.write_i2c(ADDRESS, b"\x1f\x40") # halt the clock + + dtime = datetime.datetime.now() + def toBCD(val: int) -> int: + return ((val // 10) << 4) | (val % 10) + data = b"\x10" + data += toBCD(dtime.second).to_bytes(1) + data += toBCD(dtime.minute).to_bytes(1) + data += toBCD(dtime.hour).to_bytes(1) + data += toBCD(1 << dtime.weekday()).to_bytes(1) + data += toBCD(dtime.day).to_bytes(1) + data += toBCD(dtime.month).to_bytes(1) + data += toBCD((1900 + dtime.year - 26) % 100).to_bytes(1) + p.write_i2c(ADDRESS, data) + + p.write_i2c(ADDRESS, b"\x1f\x00") # start the clock \ No newline at end of file