From 82ec410264cd43e5dbd1778a1dc51ebf36f2f0b5 Mon Sep 17 00:00:00 2001 From: Joe Kearney Date: Sat, 15 Feb 2025 19:58:52 -0600 Subject: [PATCH] Added BLE events --- BLE/BLE_Packets.h | 10 +++ BLE/BLE_Utils.c | 2 +- Events/KEvents.h | 2 + States/Playing/State_Playing__Interacting.c | 21 +++---- States/Playing/State_Playing__Tagged_Out.c | 6 +- States/State_Configuring.c | 19 +++--- States/State_Machine.c | 67 +++++++++++++++++++++ States/State_Machine.h | 1 + States/State_Ready.c | 6 ++ States/State_Wrapping_Up.c | 10 ++- 10 files changed, 121 insertions(+), 23 deletions(-) diff --git a/BLE/BLE_Packets.h b/BLE/BLE_Packets.h index a849a07..4d140b3 100644 --- a/BLE/BLE_Packets.h +++ b/BLE/BLE_Packets.h @@ -93,6 +93,16 @@ typedef struct uint8_t unused[13]; } __attribute__((packed, aligned(1))) BLE_InstigationPacket_T; +typedef enum +{ + BLE_EVENT_NO_EVENT = 0, + BLE_EVENT_CONFIGURE = 1, + BLE_EVENT_CONFIGURED = 2, + BLE_EVENT_WRAPUP_COMPLETE = 3, + BLE_EVENT_GAME_OVER = 4, + BLE_EVENT_UNUSED = 0xFFFFFFFF +} BLE_EventID_T; + //! Contents of the BLE packet #BLE_PACKET_TYPE_EVENT. typedef struct { diff --git a/BLE/BLE_Utils.c b/BLE/BLE_Utils.c index 15ec5cd..1a05031 100644 --- a/BLE/BLE_Utils.c +++ b/BLE/BLE_Utils.c @@ -38,7 +38,7 @@ const char *BLE_ADDR_To_Str(const uint8_t bd_addr[6]) // Convert each byte and add separating colons. for (int i = 0; i < 6; i++) { - snprintf(&str_addr[i * 3], sizeof(str_addr) - (i * 3), "%02X", bd_addr[i]); + snprintf(&str_addr[i * 3], sizeof(str_addr) - (i * 3), "%02X", bd_addr[5-i]); // Add colon separator except after the last byte. if (i < 5) diff --git a/Events/KEvents.h b/Events/KEvents.h index a992606..027a733 100755 --- a/Events/KEvents.h +++ b/Events/KEvents.h @@ -79,6 +79,8 @@ typedef enum KEVENT_AUDIO_COMPLETED = 36, KEVENT_GAME_OVER = 37, KEVENT_PLAY_PRESSED_ON_REMOTE = 38, + //! For #KEVENT_BLE_EVENT_RECEIVED, #KEvent_T::Data contains the BLE_EventID_T of the received event. + KEVENT_BLE_EVENT_RECEIVED = 39, // KEVENT_IS_OUT_OF_RANGE is one more than the last valid event. KEVENT_IS_OUT_OF_RANGE } KEvent_ID_T; diff --git a/States/Playing/State_Playing__Interacting.c b/States/Playing/State_Playing__Interacting.c index f8d968f..8adc07e 100644 --- a/States/Playing/State_Playing__Interacting.c +++ b/States/Playing/State_Playing__Interacting.c @@ -344,14 +344,7 @@ static void Playing__Interacting_Do(StateMachineContext_T * context) case KEVENT_BLE_PACKET_RECEIVED: #ifdef LOG_INTERACTING_SUBSTATE - //KLOG_INFO(KLOG_TAG, "KEVENT_BLE_PACKET_RECEIVED from %02X:%02X:%02X:%02X:%02X:%02X", - // ((BLE_Packet_T *)Event.Data)->Generic.BD_ADDR[5], - // ((BLE_Packet_T *)Event.Data)->Generic.BD_ADDR[4], - // ((BLE_Packet_T *)Event.Data)->Generic.BD_ADDR[3], - // ((BLE_Packet_T *)Event.Data)->Generic.BD_ADDR[2], - // ((BLE_Packet_T *)Event.Data)->Generic.BD_ADDR[1], - // ((BLE_Packet_T *)Event.Data)->Generic.BD_ADDR[0] - //); + KLOG_INFO(KLOG_TAG, "KEVENT_BLE_PACKET_RECEIVED from %s", BLE_ADDR_To_Str(((BLE_Packet_T *)Event.Data)->Generic.BD_ADDR)); #endif // LOG_INTERACTING_SUBSTATE if (((BLE_Packet_T *)Event.Data)->Generic.type == BLE_PACKET_TYPE_STATUS) { @@ -361,8 +354,14 @@ static void Playing__Interacting_Do(StateMachineContext_T * context) { HandleBLETagPacket((BLE_TagPacket_T *)Event.Data); } - - BLE_FreePacketBuffer(Event.Data); + else if (((BLE_Packet_T *)Event.Data)->Generic.type == BLE_PACKET_TYPE_EVENT) + { + HandleBLEEventPacket((BLE_EventPacket_T *)Event.Data, context); + } + else + { + BLE_FreePacketBuffer(Event.Data); + } break; case KEVENT_ACCESSORY_SWITCH_PRESSED: @@ -398,7 +397,7 @@ static void Playing__Interacting_Do(StateMachineContext_T * context) case KEVENT_GAME_OVER: { - AudioAction_T audio_action = {.ID = AUDIO_PLAY_GAME_OVER, .Data = (void *)0x00}; + AudioAction_T audio_action = {.ID = AUDIO_PLAY_GAME_OVER, .Play_To_Completion = true}; Perform_Audio_Action(&audio_action); Transition_For_Event(context, STATE_WRAPPING_UP, &Event); } diff --git a/States/Playing/State_Playing__Tagged_Out.c b/States/Playing/State_Playing__Tagged_Out.c index 007d60c..3bbd22a 100644 --- a/States/Playing/State_Playing__Tagged_Out.c +++ b/States/Playing/State_Playing__Tagged_Out.c @@ -83,6 +83,10 @@ static void Playing__Tagged_Out_Do(StateMachineContext_T * context) Transition_For_Event(context, STATE_PLAYING__INTERACTING, &Event); } } + else if (((BLE_Packet_T *)Event.Data)->Generic.type == BLE_PACKET_TYPE_EVENT) + { + HandleBLEEventPacket((BLE_EventPacket_T *)Event.Data, context); + } else { BLE_FreePacketBuffer(Event.Data); @@ -107,7 +111,7 @@ static void Playing__Tagged_Out_Do(StateMachineContext_T * context) case KEVENT_GAME_OVER: { - AudioAction_T audio_action = {.ID = AUDIO_PLAY_GAME_OVER, .Data = (void *)0x00}; + AudioAction_T audio_action = {.ID = AUDIO_PLAY_GAME_OVER, .Play_To_Completion = true}; Perform_Audio_Action(&audio_action); Transition_For_Event(context, STATE_WRAPPING_UP, &Event); } diff --git a/States/State_Configuring.c b/States/State_Configuring.c index a399ec4..02074da 100644 --- a/States/State_Configuring.c +++ b/States/State_Configuring.c @@ -27,7 +27,6 @@ static void Configuring_Do(StateMachineContext_T *context); static void Configuring_Exit(StateMachineContext_T *context); static void HandleBLEConfigurationPacket(const BLE_ConfigurationPacket_T *const packet); -static void HandleBLEEventPacket(const BLE_EventPacket_T *const packet); static TimerHandle_t BLEConfigurationResponseTimer = NULL; static StaticTimer_t xBLEConfigurationResponseTimerBuffer; @@ -64,6 +63,12 @@ static void Configuring_Entry(StateMachineContext_T *context) NeoPixelsAction_T neopixels_action = {.ID = NEOPIXELS_MENU, .Prominence = NEOPIXELS_FOREGROUND, .Data = (void *)0x00}; xQueueSend(xQueueNeoPixels, &neopixels_action, 0); + if (context->Cause_Of_Transition->ID == KEVENT_BLE_EVENT_RECEIVED) + { + AudioAction_T audio_action = {.ID = AUDIO_PLAY_BEEP, .Data = (void *)0x00}; + Perform_Audio_Action(&audio_action); + } + BLE_UpdateHelloPacket(); if (BLE_ScanAndAdvertise() != SYSTEMK_RESULT_SUCCESS) @@ -230,10 +235,12 @@ static void Configuring_Do(StateMachineContext_T *context) } else if (((BLE_Packet_T *)Event.Data)->Generic.type == BLE_PACKET_TYPE_EVENT) { - HandleBLEEventPacket((BLE_EventPacket_T *)Event.Data); + HandleBLEEventPacket((BLE_EventPacket_T *)Event.Data, context); + } + else + { + BLE_FreePacketBuffer(Event.Data); } - - BLE_FreePacketBuffer(Event.Data); break; default: @@ -319,7 +326,3 @@ void HandleBLEConfigurationPacket(const BLE_ConfigurationPacket_T *const packet) } } } - -static void HandleBLEEventPacket(const BLE_EventPacket_T *const packet) -{ -} diff --git a/States/State_Machine.c b/States/State_Machine.c index 5f056f9..7bb4151 100644 --- a/States/State_Machine.c +++ b/States/State_Machine.c @@ -128,3 +128,70 @@ void ProcessUnhandledEvent(KEvent_T * Event) break; } } + +void HandleBLEEventPacket(const BLE_EventPacket_T *const packet, StateMachineContext_T *context) +{ + if (BLE_IsBLEPacketForMe(packet->target_BD_ADDR)) + { + if (BLE_IsPacketNew(packet->BD_ADDR, BLE_PACKET_TYPE_EVENT, packet->event_number)) + { + if (packet->event_ID == BLE_EVENT_CONFIGURED) + { + if (context->States.Current_State == STATE_CONFIGURING) + { + static KEvent_T Event = + { + .ID = KEVENT_BLE_EVENT_RECEIVED, + .Data = (void *)BLE_EVENT_CONFIGURED + }; + Transition_For_Event(context, STATE_READY, &Event); + } + } + else if (packet->event_ID == BLE_EVENT_CONFIGURE) + { + if (context->States.Current_State == STATE_READY) + { + static KEvent_T Event = + { + .ID = KEVENT_BLE_EVENT_RECEIVED, + .Data = (void *)BLE_EVENT_CONFIGURE + }; + Transition_For_Event(context, STATE_CONFIGURING, &Event); + } + } + else if (packet->event_ID == BLE_EVENT_WRAPUP_COMPLETE) + { + if (context->States.Current_State == STATE_WRAPPING_UP) + { + StateID_T next_state = (StateID_T)packet->event_data; + + if (next_state < STATE_IS_OUT_OF_RANGE) + { + static KEvent_T Event = + { + .ID = KEVENT_BLE_EVENT_RECEIVED, + .Data = (void *)BLE_EVENT_WRAPUP_COMPLETE + }; + Transition_For_Event(context, next_state, &Event); + } + else + { + KLOG_WARN("STATE", "Received a BLE Wrapup Complete event with an invalid Next State!"); + } + } + } + else if (packet->event_ID == BLE_EVENT_GAME_OVER) + { + if ((context->States.Current_State == STATE_PLAYING__INTERACTING) || + (context->States.Current_State == STATE_PLAYING__TAGGED_OUT)) + { + KEvent_T game_over_event = { .ID = KEVENT_GAME_OVER, .Data = (void *)0x00 }; + Post_KEvent(&game_over_event); + } + } + } + } + + BLE_FreePacketBuffer((BLE_GenericPacketType_T *)packet); +} + diff --git a/States/State_Machine.h b/States/State_Machine.h index 5656daa..981986e 100644 --- a/States/State_Machine.h +++ b/States/State_Machine.h @@ -106,6 +106,7 @@ extern TaskHandle_t State_Machine_Task_Handle; void State_Machine_Task(void * pvParameters); void ProcessUnhandledEvent(KEvent_T * Event); +void HandleBLEEventPacket(const BLE_EventPacket_T *const packet, StateMachineContext_T *context); inline void Transition_For_Event(StateMachineContext_T* context, StateID_T next_state, KEvent_T* event) { diff --git a/States/State_Ready.c b/States/State_Ready.c index c58c4bb..e5be80d 100644 --- a/States/State_Ready.c +++ b/States/State_Ready.c @@ -54,6 +54,8 @@ static void Ready_Entry(StateMachineContext_T * context) } AudioAction_T audio_action = {.ID = AUDIO_PLAY_GAME_ON, .Data = (void *)0x00}; Perform_Audio_Action(&audio_action); + + Set_Health(MAX_HEALTH); } //! Executes the Ready state. @@ -90,6 +92,10 @@ static void Ready_Do(StateMachineContext_T * context) { Transition_For_Event(context, STATE_STARTING_GAME__RESPONDING, &Event); } + else if (((BLE_Packet_T *)Event.Data)->Generic.type == BLE_PACKET_TYPE_EVENT) + { + HandleBLEEventPacket((BLE_EventPacket_T *)Event.Data, context); + } else { BLE_FreePacketBuffer(Event.Data); diff --git a/States/State_Wrapping_Up.c b/States/State_Wrapping_Up.c index af0d07c..81273bf 100644 --- a/States/State_Wrapping_Up.c +++ b/States/State_Wrapping_Up.c @@ -84,8 +84,14 @@ static void Wrapping_Up_Do(StateMachineContext_T * context) break; case KEVENT_BLE_PACKET_RECEIVED: - // TODO - BLE_FreePacketBuffer(Event.Data); + if (((BLE_Packet_T *)Event.Data)->Generic.type == BLE_PACKET_TYPE_EVENT) + { + HandleBLEEventPacket((BLE_EventPacket_T *)Event.Data, context); + } + else + { + BLE_FreePacketBuffer(Event.Data); + } break; default: