From a9a38d387f98b29b68f97b8a9c6858d2b399caf0 Mon Sep 17 00:00:00 2001 From: Loek Le Blansch Date: Wed, 29 May 2024 17:41:41 +0200 Subject: WIP puzzle bus driver rework --- shared/include.cmake | 5 +++++ shared/pb/bus.h | 18 ++++++++++++++++++ shared/pb/driver.c | 31 +++++++++++++++++++++++++++++++ shared/pb/driver.h | 24 ++++++++++++++++++++++++ shared/pb/types.h | 52 ++++++++++++++++++++++++++++++++++++++++++++++++++++ shared/puzbus.h | 39 --------------------------------------- 6 files changed, 130 insertions(+), 39 deletions(-) create mode 100644 shared/include.cmake create mode 100644 shared/pb/bus.h create mode 100644 shared/pb/driver.c create mode 100644 shared/pb/driver.h create mode 100644 shared/pb/types.h delete mode 100644 shared/puzbus.h (limited to 'shared') diff --git a/shared/include.cmake b/shared/include.cmake new file mode 100644 index 0000000..f07a78b --- /dev/null +++ b/shared/include.cmake @@ -0,0 +1,5 @@ +include_directories(${CMAKE_CURRENT_LIST_DIR}) +add_library(puzbus STATIC + ${CMAKE_CURRENT_LIST_DIR}/pb/driver.c + ) + diff --git a/shared/pb/bus.h b/shared/pb/bus.h new file mode 100644 index 0000000..6f464c3 --- /dev/null +++ b/shared/pb/bus.h @@ -0,0 +1,18 @@ +#pragma once + +// Adafruit NeoTrellis modules +#define BUSADDR_ADA_NEO_1 0x2E +#define BUSADDR_ADA_NEO_2 0x2F +#define BUSADDR_ADA_NEO_3 0x30 +#define BUSADDR_ADA_NEO_4 0x32 + +// TODO: ??? +#define BUSADDR_MOD_NEOTRELLIS 0 +#define BUSADDR_MOD_SOFTWARE 0 +#define BUSADDR_MOD_HARDWARE 0 +#define BUSADDR_MOD_VAULT 0 +// #define BUSADDR_MOD_AUTOMATION 0 + +// main controller +#define BUSADDR_MAIN 0x00 + diff --git a/shared/pb/driver.c b/shared/pb/driver.c new file mode 100644 index 0000000..2552b61 --- /dev/null +++ b/shared/pb/driver.c @@ -0,0 +1,31 @@ +#include "types.h" +#include "driver.h" + +__weak bool pbdrv_hook_cmd() { + return false; +} + +__weak void pbdrv_i2c_recv(uint16_t addr, const char * buf, size_t sz) { + if (sz == 0) return; + enum pb_cmd cmd = (enum pb_cmd) buf[0]; + + // shift buffer pointer to only contain the puzzle bus message buf + buf++; + sz--; + + // allow user to override command handler while still using this weak + // function + if (pbdrv_hook_cmd(cmd, buf, sz)) return; + + switch (cmd) { + case PB_CMD_READ: return pbdrv_handle_read(buf, sz); + // case PB_CMD_WRITE: return pbdrv_handle_write(buf, sz); + // case PB_CMD_MAGIC: return pbdrv_handle_magic(buf, sz); + default: return; + } +} + +__weak void pbdrv_i2c_send(uint16_t addr, const char * buf, size_t sz) { + return; +} + diff --git a/shared/pb/driver.h b/shared/pb/driver.h new file mode 100644 index 0000000..1c9c3a3 --- /dev/null +++ b/shared/pb/driver.h @@ -0,0 +1,24 @@ +#pragma once + +#include +#include +#include + +#include "types.h" + +#ifdef __cplusplus +extern "C" { +#endif + +void pbdrv_i2c_recv(uint16_t addr, const char * buf, size_t sz); +void pbdrv_i2c_send(uint16_t addr, const char * buf, size_t sz); + +void pbdrv_hook_state(enum pb_global_state * state, bool rw); +bool pbdrv_hook_cmd(enum pb_cmd cmd, const char * buf, size_t sz); + +void pbdrv_handle_read(const char * buf, size_t sz); + +#ifdef __cplusplus +} +#endif + diff --git a/shared/pb/types.h b/shared/pb/types.h new file mode 100644 index 0000000..8150194 --- /dev/null +++ b/shared/pb/types.h @@ -0,0 +1,52 @@ +#pragma once +#include + +#ifdef __cplusplus +extern "C" { +#endif + +#ifdef __GNUC__ +#define __packed __attribute__((packed)) +#define __weak __attribute__((weak)) +#endif +#ifndef __packed +#error Could not determine packed attribute for current compiler +#define __packed +#endif +#ifndef __weak +#error Could not determine weak attribute for current compiler +#define __weak +#endif + +/** + * \brief puzzle bus command types + * + * The first byte of a puzzle bus message's data indicates the command type. + */ +enum __packed pb_cmd { + PB_CMD_READ, //!< read a puzzle module property + PB_CMD_WRITE, //!< write to a puzzle module property + // PB_CMD_UPDATE, //!< request an update +}; + +/** \brief Puzzle bus global states */ +enum __packed pb_global_state { + PB_GS_NOINIT, //!< uninitialized (only used by puzzle modules) + PB_GS_IDLE, //!< puzzle not started yet + PB_GS_PLAYING, //!< puzzle actively being solved + PB_GS_SOLVED, //!< puzzle completed +}; + +typedef struct __packed { + uint8_t address; +} pb_cmd_read_t; + +typedef struct __packed { + uint8_t address; + uint8_t data[]; +} pb_cmd_write_t; + +#ifdef __cplusplus +} +#endif + diff --git a/shared/puzbus.h b/shared/puzbus.h deleted file mode 100644 index 59a8867..0000000 --- a/shared/puzbus.h +++ /dev/null @@ -1,39 +0,0 @@ -#pragma once - -/** \file bus address reference */ - -// Adafruit NeoTrellis modules -#define BUSADDR_ADA_NEO_1 0x2E -#define BUSADDR_ADA_NEO_2 0x2F -#define BUSADDR_ADA_NEO_3 0x30 -#define BUSADDR_ADA_NEO_4 0x32 - -// TODO: ??? -#define BUSADDR_MOD_NEOTRELLIS 0 -#define BUSADDR_MOD_SOFTWARE 0 -#define BUSADDR_MOD_HARDWARE 0 -#define BUSADDR_MOD_VAULT 0 -#define BUSADDR_MOD_AUTOMATION 0 - -// main controller -#define BUSADDR_MAIN 0x00 - -/** - * \brief puzzle bus command types - * - * The first byte of a puzzle bus message's data indicates the command type. - */ -enum pb_cmd { - PB_CMD_READ, //!< read a puzzle module property - PB_CMD_WRITE, //!< write to a puzzle module property - // PB_CMD_UPDATE, //!< request an update -}; - -/** \brief Puzzle bus global states */ -enum pb_global_state { - PB_GS_NOINIT, //!< uninitialized (only used by puzzle modules) - PB_GS_IDLE, //!< puzzle not started yet - PB_GS_PLAYING, //!< puzzle actively being solved - PB_GS_SOLVED, //!< puzzle completed -}; - -- cgit v1.2.3