diff options
Diffstat (limited to 'shared')
-rw-r--r-- | shared/pb.cmake | 20 | ||||
-rw-r--r-- | shared/pb/bus.h | 18 | ||||
-rw-r--r-- | shared/pb/drv/arduino/mod.cpp | 33 | ||||
-rw-r--r-- | shared/pb/drv/arduino/mod.h | 19 | ||||
-rw-r--r-- | shared/pb/mod/main.h | 13 | ||||
-rw-r--r-- | shared/pb/moddrv.c | 25 | ||||
-rw-r--r-- | shared/pb/moddrv.h | 32 | ||||
-rw-r--r-- | shared/pb/spec.adoc | 133 | ||||
-rw-r--r-- | shared/pb/types.h | 90 |
9 files changed, 0 insertions, 383 deletions
diff --git a/shared/pb.cmake b/shared/pb.cmake deleted file mode 100644 index 71a28cb..0000000 --- a/shared/pb.cmake +++ /dev/null @@ -1,20 +0,0 @@ -if(DEFINED ARDUINO) - set(PBDRV_ARDUINO true) -endif() - -include_directories(${CMAKE_CURRENT_LIST_DIR}) - -list(APPEND PBDRV_SRCS "${CMAKE_CURRENT_LIST_DIR}/pb/moddrv.c") - -if(PBDRV_ARDUINO) - list(APPEND PBDRV_SRCS "${CMAKE_CURRENT_LIST_DIR}/pb/drv/arduino/mod.cpp") -endif() - -add_library(pbdrv-mod STATIC ${PBDRV_SRCS}) - -if(PBDRV_ARDUINO) - target_link_arduino_libraries(pbdrv-mod - core - Wire - ) -endif() diff --git a/shared/pb/bus.h b/shared/pb/bus.h deleted file mode 100644 index 6f464c3..0000000 --- a/shared/pb/bus.h +++ /dev/null @@ -1,18 +0,0 @@ -#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/drv/arduino/mod.cpp b/shared/pb/drv/arduino/mod.cpp deleted file mode 100644 index c7bbe45..0000000 --- a/shared/pb/drv/arduino/mod.cpp +++ /dev/null @@ -1,33 +0,0 @@ -#ifndef ARDUINO -#error This driver only works on the Arduino platform! -#endif - -#include <Arduino.h> -#include <Wire.h> - -#include <stdlib.h> -#include <stdint.h> - -#include "mod.h" - -static void recv_event(int bytes) { - uint8_t * data = (uint8_t *) malloc(bytes); - size_t size = 0; - while (Wire.available()) { - data[size++] = Wire.read(); - } - - pbdrv_i2c_recv(data, size); -} - -void pbdrv_setup() { - Wire.begin((int) PBDRV_MOD_ADDR); - Wire.onReceive(recv_event); -} - -__weak void pbdrv_i2c_send(i2c_addr_t addr, const uint8_t * buf, size_t sz) { - Wire.beginTransmission((int) addr); - Wire.write(buf, sz); - Wire.endTransmission(); -} - diff --git a/shared/pb/drv/arduino/mod.h b/shared/pb/drv/arduino/mod.h deleted file mode 100644 index e2e3b6d..0000000 --- a/shared/pb/drv/arduino/mod.h +++ /dev/null @@ -1,19 +0,0 @@ -#pragma once - -#include "../../moddrv.h" - -#ifdef __cplusplus -extern "C" { -#endif - -/** - * \brief puzzle bus driver setup - * - * This function should be called from the Arduino \c setup() function. - */ -void pbdrv_setup(); - -#ifdef __cplusplus -} -#endif - diff --git a/shared/pb/mod/main.h b/shared/pb/mod/main.h deleted file mode 100644 index 56ccd3d..0000000 --- a/shared/pb/mod/main.h +++ /dev/null @@ -1,13 +0,0 @@ -#pragma once - -#include "../types.h" - -typedef struct __packed { - const uint8_t addr; - const enum pb_state state; -} pb_mod_main_mod_t; - -enum __packed { - PB_MOD_MAIN_ADDR_MODS = 0x01, //!< connected puzzle modules -}; - diff --git a/shared/pb/moddrv.c b/shared/pb/moddrv.c deleted file mode 100644 index b17b7ac..0000000 --- a/shared/pb/moddrv.c +++ /dev/null @@ -1,25 +0,0 @@ -#include "types.h" -#include "moddrv.h" - -//! fallback module name -__weak const char * PBDRV_MOD_NAME = "???"; - -//! [private] placeholder global state variable -static pb_global_state_t _global_state = PB_GS_NOINIT; - -//! [private] main controller global state -static pb_global_state_t _main_state = PB_GS_NOINIT; - -// __weak enum pb_state pbdrv_hook_mod_state_read() { -// return _global_state; -// } - -// __weak void pbdrv_hook_mod_state_write(enum pb_state state) { -// _global_state = state; -// } - -__weak void pbdrv_i2c_recv(const uint8_t * buf, size_t sz) { - return; -} - -__weak void pbdrv_hook_main_state_update(pb_global_state_t state) { } diff --git a/shared/pb/moddrv.h b/shared/pb/moddrv.h deleted file mode 100644 index b48f4db..0000000 --- a/shared/pb/moddrv.h +++ /dev/null @@ -1,32 +0,0 @@ -#pragma once - -/** - * \file puzzle bus driver implementation - * - * Most \c pbdrv_* functions have a weak implementation, which may be - * overwritten by a custom implementation. This allows you to use the default - * implementation where possible, and only implement extensions required for - * your puzzle module. Please see spec.adoc for more information about how to - * use the puzzle bus driver library. - */ - -#include <stdint.h> -#include <stddef.h> -#include <stdbool.h> - -#include "types.h" - -extern const char * PBDRV_MOD_NAME; -extern const i2c_addr_t PBDRV_MOD_ADDR; - -#ifdef __cplusplus -extern "C" { -#endif - -void pbdrv_i2c_recv(const uint8_t * buf, size_t sz); -void pbdrv_i2c_send(i2c_addr_t i2c_addr, const uint8_t * buf, size_t sz); - -#ifdef __cplusplus -} -#endif - diff --git a/shared/pb/spec.adoc b/shared/pb/spec.adoc deleted file mode 100644 index 3172e84..0000000 --- a/shared/pb/spec.adoc +++ /dev/null @@ -1,133 +0,0 @@ -= Puzzle module specification - -This folder contains an implementation of the puzzle bus protocol -specification, and is targeted at puzzle module developers. This document -describes the required implementation steps for integrating a new game into the -puzzle module framework. - -== The bus - -The puzzle bus carries data over a standard I^2^C bus. Additional details about -this bus can be found in the link:../../docs/design.adoc[Design document]. - -The following details are important to puzzle module developers, as they may -cause unexpected behavior: - -- *Addresses influence the puzzle box's behavior*. The order of puzzles is - determined by the puzzle module address. Two puzzle modules may use the same - address, but this will mean that they cannot be used simultaniously in the - same puzzle box. Known addresses are documented in link:bus.h[]. -- *The read/write bit of an I^2^C frame determines how it's handled*. I^2^C - *read* frames are treated as requests, while *write* frames are treated as - responses. - -== Puzzle bus driver (pbdrv) - -The library in this folder is a partial implementation of the puzzle bus -specification *for puzzle modules*. Most functions in the driver are marked -with the 'weak' attribute, which allows you to override them by providing an -implementation. - -In order to utilize this driver, the following must be done: - -- The ``pbdrv_i2c_recv`` function must be *called* for every received *I^2^C - read* frame -- The ``pbdrv_i2c_send`` function must be *implemented* with the - platform-specific *I^2^C write* function - -This is enough to get the puzzle module registered. You may also want to -implement some of the following integrations: - -- If your game uses the global state variable, you should implement the - <<sec:state-global,global state hooks>> to point the driver to your own - global state variable, and be notified of reads/writes to it. -- If you want to expose additional game state variables over the puzzle bus, - you should implement the <<sec:state-aux,auxiliary state hooks>>. -- If you want to implement custom puzzle bus commands, you can implement the - <<sec:cmd,command hook>>. - -All other kinds of integrations/hooks can likely be realized by overriding the -default implementations, but this is discouraged. - -[[sec:state-global]] -== Global state - -If your puzzle module defines its own global ``enum pb_state``, you can tell -the driver to use it by implementing the ``pbdrv_hook_state_read`` and -``pbdrv_hook_state_write`` functions. These functions are also used by the -default implementation of the read/write commands to address 0 (global state). - -Example: - -```c -pb_state_t global_state = PB_GS_NOINIT; - -pb_state_t pbdrv_hook_mod_state_read() { - return global_state; -} - -void pbdrv_hook_mod_state_write(pb_state_t state) { - global_state = state; -} -``` - -[[sec:state-aux]] -== Auxiliary state - -You can expose additional state variables by implementing the -``pbdrv_hook_read`` and ``pbdrv_hook_write`` functions. These functions should -return ``true`` for state addresses you want to override. - -Example: - -```c -#define CUSTOM_VAR_ADDR 0x01 -uint8_t my_custom_variable = 10; - -bool pbdrv_hook_read(uint16_t i2c_addr, uint8_t addr) { - switch (addr) { - case CUSTOM_VAR_ADDR: { - char res[] = { PB_CMD_READ, addr, my_custom_variable }; - pbdrv_i2c_send(i2c_addr, res, sizeof(res)); - break; - } - default: return false; - } - - return true; -} - -bool pbdrv_hook_write(uint16_t i2c_addr, uint8_t addr, const char * buf, size_t sz) { - switch (addr) { - case CUSTOM_VAR_ADDR: { - if (sz != 1) return false; - my_custom_variable = buf[0]; - break; - } - default: return false; - } - - return true; -} -``` - -[[sec:cmd]] -== Custom commands - -Similar to the auxiliary state, custom commands can be added by implementing -the ``pbdrv_hook_cmd`` function, which should return ``true`` for the -command(s) that you want to overwrite. - -Example: - -```c -bool pbdrv_hook_cmd(uint16_t i2c_addr, enum pb_cmd cmd, const char * buf, size_t sz) { - if (cmd == 0x54) { - printf("custom command received!\n"); - return true; - } - - return false; -} -``` - diff --git a/shared/pb/types.h b/shared/pb/types.h deleted file mode 100644 index 186066b..0000000 --- a/shared/pb/types.h +++ /dev/null @@ -1,90 +0,0 @@ -#pragma once -#include <stdint.h> - -#ifdef __cplusplus -extern "C" { -#endif - -#ifdef __GNUC__ -#define __weak __attribute__((weak)) -#endif -#ifndef __weak -#error Could not determine weak attribute for current compiler -#define __weak -#endif - -typedef uint16_t i2c_addr_t; - -//! puzzle bus command types -enum pb_cmd_id { - PB_CMD_REQ_READ, //!< request a puzzle module property - PB_CMD_RES_READ, //!< respond to a puzzle module property request - PB_CMD_REQ_WRITE, //!< request to write a puzzle module property - PB_CMD_REQ_STATE, //!< request global state - PB_CMD_RES_STATE, //!< respond to a global state request - PB_CMD_MAGIC, //!< magic message (regular i2c command) -}; -typedef enum pb_cmd_id pb_cmd_id_t; - -//! magic sent from main controller to puzzle module -static const char pb_cmd_magic_msg[] = { 0x70, 0x75, 0x7a, 0x62, 0x75, 0x73 }; -//! magic reply from puzzle module back to main controller -static const char pb_cmd_magic_res[] = { 0x67, 0x61, 0x6d, 0x69, 0x6e, 0x67 }; - -//! 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 -}; -typedef enum pb_global_state pb_global_state_t; - -//! puzzle bus message header (shared by all commands) -typedef struct { - const pb_cmd_id_t type; //!< command type - const i2c_addr_t sender; //!< i2c address of sender -} pb_msg_header_t; - -//! PB_CMD_REQ_READ data -typedef struct { - const pb_msg_header_t header; - const uint8_t propid; //!< state property id to return -} pb_cmd_req_read_t; - -//! PB_CMD_RES_READ data -typedef struct { - const pb_msg_header_t header; - const uint8_t propid; //!< id of returned state property - const uint8_t value[]; -} pb_cmd_res_read_t; - -//! PB_CMD_REQ_WRITE data -typedef struct { - const pb_msg_header_t header; - const uint8_t propid; //!< state property id to write - const uint8_t value[]; //!< new value of property -} pb_cmd_req_write_t; - -//! PB_CMD_REQ_STATE data -typedef struct { - const pb_msg_header_t header; - const pb_global_state_t state; //!< global state of sender -} pb_cmd_req_state_t; - -//! PB_CMD_RES_STATE data -typedef struct { - const pb_msg_header_t header; - const pb_global_state_t state; //!< global state of sender -} pb_cmd_res_state_t; - -//! PB_CMD_MAGIC data -typedef struct { - const pb_msg_header_t header; - const char magic[]; //!< magic value -} pb_cmd_magic_t; - -#ifdef __cplusplus -} -#endif - |