diff options
author | Loek Le Blansch <loek@pipeframe.xyz> | 2024-06-24 15:00:22 +0200 |
---|---|---|
committer | Loek Le Blansch <loek@pipeframe.xyz> | 2024-06-24 15:00:22 +0200 |
commit | a7271f52ef235c9035849c310bf341fe84f2815a (patch) | |
tree | e779fedaff6e7c9084f7ec1eead98b54e900bcd1 /main/i2c.c | |
parent | 1d6d54478a368a011415e43f7667a263209bb2b0 (diff) | |
parent | a0c664908b9112306c5858ccb106d1a0e5555df7 (diff) |
Merge branch 'wip/mc' of github.com:lonkaars/puzzelbox
Diffstat (limited to 'main/i2c.c')
-rw-r--r-- | main/i2c.c | 72 |
1 files changed, 69 insertions, 3 deletions
@@ -12,10 +12,10 @@ #include "pb-buf.h" #include "pb-send.h" +static pb_global_state_t _global_state = PB_GS_IDLE; +pb_puzzle_module_t modules[CFG_PB_MOD_MAX]; // stolen from lib/pico-sdk/src/rp2_common/hardware_i2c/i2c.c #define i2c_reserved_addr(addr) (((addr) & 0x78) == 0 || ((addr) & 0x78) == 0x78) - -i2c_addr_t modules[CFG_PB_MOD_MAX]; size_t modules_size = 0; static void bus_scan() { @@ -34,6 +34,8 @@ static void bus_scan() { } static void state_exchange() { + + for (size_t i = 0; i < modules_size; i++) { pb_buf_t buf = pb_send_state_req(); @@ -41,6 +43,49 @@ static void state_exchange() { } } +void update_state() { + // TODO: Add calculation(?) to get global state + // all states idle == idle -> set first address as playingz + // all states solved == solved + // any state plater == playing + + pb_global_state_t module_state; + bool playing = false; // default false -> loop through modules to see if one is playing -> set to true + bool solved = true; // default true -> loop through modules to see if any is not solved -> set to false + + for (size_t i = 0; i < modules_size; i++) { + module_state = modules[i].state; + if (module_state != PB_GS_SOLVED) + solved == false; + + if (module_state == PB_GS_PLAYING) + playing == true; + } + + // set state if no further processing is needed + if (solved == true) { + pb_hook_mod_state_write(PB_GS_SOLVED); + return; + } else if (playing == true) { + pb_hook_mod_state_write(PB_GS_PLAYING); + return; + } + + // IF no module playing, get/set next module THAT IS NOT SOLVED to playing + // and set mc state to playing + // pb_i2c_send(addr, buff.msg, buff.size) + + for (size_t i = 0; i < modules_size; i++) { + module_state = modules[i].state; + if (module_state == PB_GS_IDLE) { + pb_buf_t buff = pb_send_state_set(PB_GS_PLAYING); + pb_i2c_send(modules[i].sender, (uint8_t*)buff.data, buff.size); + pb_hook_mod_state_write(PB_GS_PLAYING); + return; + } + } +} + void bus_task() { // do a scan of the bus bus_scan(); @@ -67,7 +112,28 @@ void bus_task() { */ void pb_route_cmd_magic_res(pb_msg_t * msg) { if (modules_size == CFG_PB_MOD_MAX) return; - modules[modules_size++] = msg->sender; + pb_puzzle_module_t tmp_module = {msg->sender, PB_GS_NOINIT}; + modules[modules_size++] = tmp_module; printf("i2c: registered puzzle module w/ address 0x%02x\n", msg->sender); } +void pb_route_cmd_state_res(pb_msg_t * msg) { + pb_cmd_state_t * cmd = msg->cmd; + i2c_addr_t sender = msg->sender; + + // update sender state + for( size_t i = 0; i < modules_size; i++ ) { + if (modules[i].sender == sender) { + modules[i].state = (pb_global_state_t)cmd; + break; + } + } +} + +pb_global_state_t pb_hook_mod_state_read() { + return _global_state; +} + +void pb_hook_mod_state_write(pb_global_state_t state) { + _global_state = state; +} |