feat: add packets
This commit is contained in:
parent
842339a60e
commit
3679e3e8e8
1 changed files with 96 additions and 0 deletions
96
packets.py
Normal file
96
packets.py
Normal file
|
@ -0,0 +1,96 @@
|
||||||
|
class Packet:
|
||||||
|
"""Represents an 8-byte I2C packet."""
|
||||||
|
LENGTH = 8
|
||||||
|
|
||||||
|
def __init__(self, data=None):
|
||||||
|
if data is None:
|
||||||
|
data = [0] * self.LENGTH
|
||||||
|
if len(data) != self.LENGTH:
|
||||||
|
raise ValueError(f"Packet must be {self.LENGTH} bytes")
|
||||||
|
self.bytes = data
|
||||||
|
|
||||||
|
@classmethod
|
||||||
|
def from_bytes(cls, byte_list):
|
||||||
|
"""Create Packet from list of bytes."""
|
||||||
|
return cls(byte_list[:cls.LENGTH])
|
||||||
|
|
||||||
|
def __getitem__(self, idx):
|
||||||
|
return self.bytes[idx]
|
||||||
|
|
||||||
|
def __setitem__(self, idx, value):
|
||||||
|
self.bytes[idx] = value
|
||||||
|
|
||||||
|
def __repr__(self):
|
||||||
|
fields = [f"Byte {i}: 0x{b:02X}" for i, b in enumerate(self.bytes)]
|
||||||
|
return "\n".join(fields)
|
||||||
|
|
||||||
|
def as_list(self):
|
||||||
|
return self.bytes
|
||||||
|
|
||||||
|
def is_valid(self):
|
||||||
|
"""Verify checksum (XOR of bytes 0-6 equals byte 7)."""
|
||||||
|
cs = 0
|
||||||
|
for b in self.bytes[:-1]:
|
||||||
|
cs ^= b
|
||||||
|
return cs == self.bytes[-1]
|
||||||
|
|
||||||
|
def create_motor_state_packet(fl=None, fr=None, bl=None, br=None):
|
||||||
|
"""
|
||||||
|
Create an 8-byte packet to set motor states for I2C transfer.
|
||||||
|
Packet format:
|
||||||
|
[0x01, 0x00, FL, FR, BL, BR, 0x00, checksum]
|
||||||
|
- 0x01: Command for Motor State Packet
|
||||||
|
- 0x00: Target/channel (set as needed)
|
||||||
|
- FL, FR, BL, BR: Motor states (0x00 = off, 0x01 = forward, 0x02 = backward)
|
||||||
|
- checksum: XOR of bytes 0-6
|
||||||
|
"""
|
||||||
|
def getByteForState(state):
|
||||||
|
if state:
|
||||||
|
return 0x01
|
||||||
|
elif not state:
|
||||||
|
return 0x02
|
||||||
|
else:
|
||||||
|
return 0x00
|
||||||
|
|
||||||
|
packet = [0x01, 0x00, getByteForState(fl), getByteForState(fr), getByteForState(bl), getByteForState(br), 0x00]
|
||||||
|
checksum = 0
|
||||||
|
for b in packet:
|
||||||
|
checksum ^= b
|
||||||
|
packet.append(checksum)
|
||||||
|
return Packet.from_bytes(bytes(packet))
|
||||||
|
|
||||||
|
def create_tail_wagging_packet(wagging=False):
|
||||||
|
"""
|
||||||
|
Create an 8-byte packet to set wagging for I2C transfer.
|
||||||
|
Packet format:
|
||||||
|
[0x02, 0x00, Wagging, 0x00, 0x00, 0x00, 0x00, checksum]
|
||||||
|
- 0x02: Command for Wagging Packet
|
||||||
|
- 0x00: Target/channel (set as needed)
|
||||||
|
- Wagging: 0x00 = false, 0x01 = true
|
||||||
|
- checksum: XOR of bytes 0-6
|
||||||
|
"""
|
||||||
|
packet = [0x02, 0x00, 0x01 if wagging else 0x00, 0x00, 0x00, 0x00, 0x00]
|
||||||
|
checksum = 0
|
||||||
|
for b in packet:
|
||||||
|
checksum ^= b
|
||||||
|
packet.append(checksum)
|
||||||
|
return Packet.from_bytes(bytes(packet))
|
||||||
|
|
||||||
|
def create_set_led_mode(mode=0):
|
||||||
|
"""
|
||||||
|
Create an 8-byte packet to set led mode for I2C transfer.
|
||||||
|
Packet format:
|
||||||
|
[0x02, 0x00, Mode, 0x00, 0x00, 0x00, 0x00, checksum]
|
||||||
|
- 0x02: Command for led mode
|
||||||
|
- 0x00: Target/channel (set as needed)
|
||||||
|
- Wagging: 0x00 = standard, 0x01 = rot, 0x02 = rainbow
|
||||||
|
- checksum: XOR of bytes 0-6
|
||||||
|
"""
|
||||||
|
packet = [0x02, 0x00, mode & 0xFF, 0x00, 0x00, 0x00, 0x00]
|
||||||
|
checksum = 0
|
||||||
|
for b in packet:
|
||||||
|
checksum ^= b
|
||||||
|
packet.append(checksum)
|
||||||
|
return Packet.from_bytes(bytes(packet))
|
||||||
|
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue