diff --git a/espmusicmouse/host_driver.py b/espmusicmouse/host_driver/host_driver.py similarity index 59% rename from espmusicmouse/host_driver.py rename to espmusicmouse/host_driver/host_driver.py index 029f802..5327ed2 100644 --- a/espmusicmouse/host_driver.py +++ b/espmusicmouse/host_driver/host_driver.py @@ -4,6 +4,8 @@ from enum import Enum from dataclasses import dataclass import struct +from led_cmds import * + MAGIC_TOKEN_HOST_TO_FW = 0x1d6379e3 MAGIC_TOKEN_FW_TO_HOST = 0x10c65631 @@ -21,75 +23,41 @@ class MessageHostToFw(Enum): LED_WHEEL_EFFECT_RANDOM_TWO_COLOR_INTERPOLATION = 3 -@dataclass -class ColorRGBW: - r: float - g: float - b: float - w: float - - def as_bytes(self) -> bytes: - return struct.pack("BBBB", self.r * 255, self.g * 255, self.b * 255, self.w * 255) - - -@dataclass -class EffectStaticConfig: - color: ColorRGBW - - def as_bytes(self) -> bytes: - return self.color.as_bytes() - - -@dataclass -class EffectAlexaSwipeConfig: - primaryColorWidth: float # in degrees - transitionWidth: float # in degrees - swipeSpeed: float # in degrees per second - bellCurveWidthInLeds: float - startPosition: float # in degrees - forward: bool - primaryColor: ColorRGBW - secondaryColor: ColorRGBW - - def as_bytes(self) -> bytes: - return struct.pack( - "fffff?", self.primaryColorWidth, self.transitionWidth, self.swipeSpeed, - self.bellCurveWidthInLeds, self.startPosition, - self.forward) + self.primaryColor.as_bytes() + self.secondaryColor.as_bytes() - - -@dataclass -class EffectCircularConfig: - speed: float # in degrees per second - width: float # in degrees - color: ColorRGBW - - def as_bytes(self) -> bytes: - return struct.pack("ff", self.speed, self.width) + self.color.as_bytes() - - -messageTypeMap = { +outgoingMsgMap = { EffectStaticConfig: 0, EffectAlexaSwipeConfig: 1, EffectCircularConfig: 2, } +class RfidTokenRead: + def __init__(self, id: bytes): + self.id = id + + def __repr__(self): + return "RFID Token (" + " ".join(f"{v:02x}" for v in self.id) + ")" + + +incomingMsgMap = {0: RfidTokenRead} + + class MusicMouseProtocol(asyncio.Protocol): def connection_made(self, transport): self.transport = transport + self.in_buff = bytes() def send_message(self, message): msg_content = message.as_bytes() print("Sending message content", len(msg_content)) - header = struct.pack("= HEADER_SIZE: + token, msg_type, msg_size = struct.unpack("= HEADER_SIZE + msg_size: + self._on_msg_receive(msg_type, self.in_buff[HEADER_SIZE:HEADER_SIZE + msg_size]) + self.in_buff = self.in_buff[HEADER_SIZE + msg_size:] + else: + idx = self.in_buff.find("\n".encode()) + if idx >= 0: + text_msg = self.in_buff[:idx] + print("LOG:", text_msg.decode()) + self.in_buff = self.in_buff[idx + 1:] + + def _on_msg_receive(self, msg_type, msg_payload): + parsed_msg = incomingMsgMap[msg_type](msg_payload) + print("MSG:", parsed_msg) + async def main(protocol: MusicMouseProtocol): for i in range(10): @@ -120,6 +108,6 @@ coro = serial_asyncio.create_serial_connection(loop, '/dev/ttyUSB0', baudrate=115200) transport, protocol = loop.run_until_complete(coro) -loop.create_task(main(protocol)) +#loop.create_task(main(protocol)) loop.run_forever() loop.close() \ No newline at end of file diff --git a/espmusicmouse/host_driver/led_cmds.py b/espmusicmouse/host_driver/led_cmds.py new file mode 100644 index 0000000..f325c2f --- /dev/null +++ b/espmusicmouse/host_driver/led_cmds.py @@ -0,0 +1,88 @@ +from dataclasses import dataclass +import struct + + +@dataclass +class ColorRGBW: + r: float + g: float + b: float + w: float + + def as_bytes(self) -> bytes: + return struct.pack(" bytes: + return struct.pack(" bytes: + return self.color.as_bytes() + + +@dataclass +class EffectAlexaSwipeConfig: + primary_color_width: float # in degrees + transition_width: float # in degrees + swipe_speed: float # in degrees per second + bell_curve_width_in_leds: float + start_position: float # in degrees + forward: bool + primary_color: ColorRGBW + secondary_color: ColorRGBW + + def as_bytes(self) -> bytes: + return struct.pack( + " bytes: + return struct.pack(" bytes: + return struct.pack(" diff --git a/espmusicmouse/src/main.cpp b/espmusicmouse/src/main.cpp index 908c474..dba588a 100644 --- a/espmusicmouse/src/main.cpp +++ b/espmusicmouse/src/main.cpp @@ -34,6 +34,7 @@ void tag_handler(uint8_t *sn) Serial.printf("Tag: %#x %#x %#x %#x %#x\n", sn[0], sn[1], sn[2], sn[3], sn[4]); + sendMessageToHost(MsgRfidTokenRead{{sn[0], sn[1], sn[2], sn[3], sn[4]}}); if (sn[4] == 0x30) { Serial.println("Fuchs"); @@ -41,8 +42,8 @@ void tag_handler(uint8_t *sn) //ledTask.startEffect(EffectCircularConfig{2 * 360, 180, ColorRGBW{0, 0, 255, 0}}); ledTask.startEffect(EffectAlexaSwipeConfig{20, 30, 3 * 360, 3, 180, true, ColorRGBW{0, 255, 0, 0}, ColorRGBW{0, 0, 255, 0}}); delay(1000); - ledTask.startEffect(EffectRandomTwoColorInterpolationConfig{6000, true, 6, rgb2hsv(ColorRGBW{128, 0, 0, 0}), - rgb2hsv(ColorRGBW{0, 0, 128, 0}), false, false}); + ledTask.startEffect(EffectRandomTwoColorInterpolationConfig{6000, true, 6, false, false, rgb2hsv(ColorRGBW{128, 0, 0, 0}), + rgb2hsv(ColorRGBW{0, 0, 128, 0})}); } if (sn[4] == 0xf0) { @@ -56,8 +57,8 @@ void tag_handler(uint8_t *sn) fox = true; ledTask.startEffect(EffectAlexaSwipeConfig{20, 30, 3 * 360, 3, 180, true, ColorRGBW{0, 0, 255, 0}, ColorRGBW{0, 200, 255, 0}}); delay(1000); - ledTask.startEffect(EffectRandomTwoColorInterpolationConfig{6000, true, 3, rgb2hsv(ColorRGBW{0, 0, 255, 0}), - rgb2hsv(ColorRGBW{0, 200, 255, 0}), false, false}); + ledTask.startEffect(EffectRandomTwoColorInterpolationConfig{6000, true, 3, false, false, rgb2hsv(ColorRGBW{0, 0, 255, 0}), + rgb2hsv(ColorRGBW{0, 200, 255, 0})}); } } else