diff --git a/Game/Game.h b/Game/Game.h index 356e9c7..a9ca257 100644 --- a/Game/Game.h +++ b/Game/Game.h @@ -23,24 +23,55 @@ #define GAME_H #include "Weapons.h" - + #define MAX_HEALTH 10 //! Implemented according to the 2024-07-20 "KTag Teams Compatibility Matrix". typedef enum { - TEAM_PURPLE = 0, - TEAM_RED = 1, - TEAM_BLUE = 2, - TEAM_WHITE = 3, - COMMON_TEAM_ID_MASK = 3, - TEAM_ORANGE = 4, - TEAM_GREEN = 5, - TEAM_YELLOW = 6, - TEAM_BLACK = 7, - EXTENDED_TEAM_ID_MASK = 7 + TEAM_PURPLE = 0, + BASIC_TEAMS_MINIMUM = 0, + TEAM_RED = 1, + TEAM_BLUE = 2, + BASIC_TEAMS_MAXIMUM = 2, + TEAM_WHITE = 3, + COMMON_TEAM_ID_MASK = 3, + TEAM_ORANGE = 4, + TEAM_GREEN = 5, + TEAM_YELLOW = 6, + TEAM_BLACK = 7, + EXTENDED_TEAM_ID_MASK = 7, + MAXIMUM_TEAM_ID = 7 } TeamID_t; +__attribute__((always_inline)) static inline SystemKResult_T Set_Team_With_Audio_Feedback(uint8_t team_ID) +{ + static uint8_t Team_ID = 0; // This is static because AUDIO_PRONOUNCE_NUMBER_0_TO_100 needs a *pointer*. + SystemKResult_T result = SYSTEMK_RESULT_SUCCESS; + + Team_ID = team_ID; + + if (Team_ID > MAXIMUM_TEAM_ID) + { + result = SYSTEMK_RESULT_OVERFLOW; + } + else + { + result = SETTINGS_set_uint8_t(SYSTEMK_SETTING_TEAMID, Team_ID); + + if (result == SYSTEMK_RESULT_SUCCESS) + { + AudioAction_T audio_action = {.ID = AUDIO_PLAY_TEAM_ID_PROMPT, .Play_To_Completion = true, .Data = (void *)0x00}; + Perform_Audio_Action(&audio_action); + + AudioAction_T volume_action = {.ID = AUDIO_PRONOUNCE_NUMBER_0_TO_100, .Play_To_Completion = true, .Data = (void *)&Team_ID}; + Perform_Audio_Action(&volume_action); + } + } + + return result; +} + __attribute__((always_inline)) inline TeamID_t Resolve_Common_Team_ID(uint8_t team_ID) { return (team_ID & COMMON_TEAM_ID_MASK); @@ -50,9 +81,9 @@ __attribute__((always_inline)) inline bool Team_Can_Tag_Me(uint8_t tagging_team_ { bool can_tag = false; uint8_t team_ID; - (void) SETTINGS_get_uint8_t(SYSTEMK_SETTING_TEAMID, &team_ID); + (void)SETTINGS_get_uint8_t(SYSTEMK_SETTING_TEAMID, &team_ID); TeamID_t my_common_team_ID = Resolve_Common_Team_ID(team_ID); - + if (tagging_team_ID == TEAM_PURPLE) { can_tag = true; @@ -67,7 +98,7 @@ __attribute__((always_inline)) inline bool Team_Can_Tag_Me(uint8_t tagging_team_ return can_tag; } - + typedef struct { uint8_t My_Health; @@ -82,7 +113,7 @@ typedef struct } KTag_Game_Data_T; extern KTag_Game_Data_T KTAG_Game_Data; - + __attribute__((always_inline)) inline uint8_t Get_Health() { return KTAG_Game_Data.My_Health; @@ -91,10 +122,10 @@ __attribute__((always_inline)) inline uint8_t Get_Health() __attribute__((always_inline)) inline void Set_Health(uint8_t health) { KTAG_Game_Data.My_Health = health; - + if (KTAG_Game_Data.My_Health == 0) { - KEvent_T tagged_out_event = { .ID = KEVENT_TAGGED_OUT, .Data = (void *)0x00 }; + KEvent_T tagged_out_event = {.ID = KEVENT_TAGGED_OUT, .Data = (void *)0x00}; Post_KEvent(&tagged_out_event); } } @@ -108,7 +139,7 @@ __attribute__((always_inline)) inline void Reduce_Health(uint8_t reduction) else { KTAG_Game_Data.My_Health = 0; - KEvent_T tagged_out_event = { .ID = KEVENT_TAGGED_OUT, .Data = (void *)0x00 }; + KEvent_T tagged_out_event = {.ID = KEVENT_TAGGED_OUT, .Data = (void *)0x00}; Post_KEvent(&tagged_out_event); } } @@ -234,5 +265,5 @@ __attribute__((always_inline)) inline bool Use_Bomb_If_Available() return available; } - + #endif // GAME_H diff --git a/Menu/GameSettings/TeamIDMenuItem.c b/Menu/GameSettings/TeamIDMenuItem.c index 14d97bb..7d363d2 100644 --- a/Menu/GameSettings/TeamIDMenuItem.c +++ b/Menu/GameSettings/TeamIDMenuItem.c @@ -22,8 +22,10 @@ #include "SystemK.h" -#define MIN_TEAM_ID 0 -#define MAX_TEAM_ID 3 +#define MIN_TEAM_ID BASIC_TEAMS_MINIMUM +#define MAX_TEAM_ID BASIC_TEAMS_MAXIMUM + +static const char * KLOG_TAG = "Team ID Menu"; static uint8_t Team_ID; @@ -73,13 +75,11 @@ static void OnIncrement() { Team_ID = MAX_TEAM_ID; } - (void) SETTINGS_set_uint8_t(SYSTEMK_SETTING_TEAMID, Team_ID); - - AudioAction_T audio_action = {.ID = AUDIO_PLAY_TEAM_ID_PROMPT, .Play_To_Completion = true, .Data = (void *)0x00}; - Perform_Audio_Action(&audio_action); - - AudioAction_T volume_action = {.ID = AUDIO_PRONOUNCE_NUMBER_0_TO_100, .Play_To_Completion = true, .Data = (void *)&Team_ID}; - Perform_Audio_Action(&volume_action); + + if (Set_Team_With_Audio_Feedback(Team_ID) != SYSTEMK_RESULT_SUCCESS) + { + KLOG_WARN(KLOG_TAG, "Failed to increment team!"); + } } static void OnDecrement() @@ -94,11 +94,9 @@ static void OnDecrement() { Team_ID = MIN_TEAM_ID; } - (void) SETTINGS_set_uint8_t(SYSTEMK_SETTING_TEAMID, Team_ID); - - AudioAction_T audio_action = {.ID = AUDIO_PLAY_TEAM_ID_PROMPT, .Play_To_Completion = true, .Data = (void *)0x00}; - Perform_Audio_Action(&audio_action); - - AudioAction_T volume_action = {.ID = AUDIO_PRONOUNCE_NUMBER_0_TO_100, .Play_To_Completion = true, .Data = (void *)&Team_ID}; - Perform_Audio_Action(&volume_action); + + if (Set_Team_With_Audio_Feedback(Team_ID) != SYSTEMK_RESULT_SUCCESS) + { + KLOG_WARN(KLOG_TAG, "Failed to decrement team!"); + } } \ No newline at end of file diff --git a/States/State_Configuring.c b/States/State_Configuring.c index 13141cd..6c79699 100644 --- a/States/State_Configuring.c +++ b/States/State_Configuring.c @@ -22,14 +22,14 @@ /* Include Files */ #include "SystemK.h" -static void Configuring_Entry(StateMachineContext_T * context); -static void Configuring_Do(StateMachineContext_T * context); -static void Configuring_Exit(StateMachineContext_T * context); +static void Configuring_Entry(StateMachineContext_T *context); +static void Configuring_Do(StateMachineContext_T *context); +static void Configuring_Exit(StateMachineContext_T *context); #define MAX_MENU_DEPTH 10 -static MenuItem_T const * CurrentMenuItem; +static MenuItem_T const *CurrentMenuItem; static uint8_t MenuItemHistoryIndex = 0; -static MenuItem_T const * MenuItemHistory[MAX_MENU_DEPTH]; +static MenuItem_T const *MenuItemHistory[MAX_MENU_DEPTH]; static const uint16_t LONG_PRESS_FOR_READY_in_ms = 5000; @@ -37,17 +37,16 @@ static const char *KLOG_TAG = "STATE_CONFIGURING"; //! Activities for the **Configuring** state. const StateActivity_T STATE_CONFIGURING_Activities = -{ - .Entry = Configuring_Entry, - .Do = Configuring_Do, - .Exit = Configuring_Exit -}; + { + .Entry = Configuring_Entry, + .Do = Configuring_Do, + .Exit = Configuring_Exit}; //! Sets up the Configuring state. /*! * \param context Context in which this state is being run. */ -static void Configuring_Entry(StateMachineContext_T * context) +static void Configuring_Entry(StateMachineContext_T *context) { LOG("Entering the Configuring state."); NeoPixelsAction_T neopixels_action = {.ID = NEOPIXELS_MENU, .Prominence = NEOPIXELS_FOREGROUND, .Data = (void *)0x00}; @@ -68,114 +67,134 @@ static void Configuring_Entry(StateMachineContext_T * context) /*! * \param context Context in which this state is being run. */ -static void Configuring_Do(StateMachineContext_T * context) -{ +static void Configuring_Do(StateMachineContext_T *context) +{ portBASE_TYPE xStatus; static KEvent_T Event; - + xStatus = Receive_KEvent(&Event); - + if (xStatus == pdPASS) { switch (Event.ID) { - case KEVENT_MENU_ENTER: + case KEVENT_MENU_ENTER: + if (CurrentMenuItem->OnFocus != NULL) + { + CurrentMenuItem->OnFocus(true); + } + break; + + case KEVENT_MENU_SELECT: + { + if (CurrentMenuItem->OnSelect != NULL) + { + MenuItem_T const *menuItem = CurrentMenuItem->OnSelect(); + + // Check to see if we have entered a submenu. + if (menuItem != NULL) + { + // Save off the old menu item, so we can get back to it later. + MenuItemHistoryIndex++; + MenuItemHistory[MenuItemHistoryIndex] = menuItem; + CurrentMenuItem = menuItem; + + if (CurrentMenuItem->OnFocus != NULL) + { + CurrentMenuItem->OnFocus(true); + } + } + } + } + break; + + case KEVENT_MENU_BACK: + if (MenuItemHistoryIndex > 0) + { + // Go up a menu. + MenuItemHistoryIndex--; + CurrentMenuItem = MenuItemHistory[MenuItemHistoryIndex]; if (CurrentMenuItem->OnFocus != NULL) { CurrentMenuItem->OnFocus(true); } - break; + } + break; - case KEVENT_MENU_SELECT: - { - if (CurrentMenuItem->OnSelect != NULL) - { - MenuItem_T const * menuItem = CurrentMenuItem->OnSelect(); - - // Check to see if we have entered a submenu. - if (menuItem != NULL) - { - // Save off the old menu item, so we can get back to it later. - MenuItemHistoryIndex++; - MenuItemHistory[MenuItemHistoryIndex] = menuItem; - CurrentMenuItem = menuItem; - - if (CurrentMenuItem->OnFocus != NULL) - { - CurrentMenuItem->OnFocus(true); - } - } - } - } - break; - - case KEVENT_MENU_BACK: - if (MenuItemHistoryIndex > 0) - { - // Go up a menu. - MenuItemHistoryIndex--; - CurrentMenuItem = MenuItemHistory[MenuItemHistoryIndex]; - if (CurrentMenuItem->OnFocus != NULL) - { - CurrentMenuItem->OnFocus(true); - } - } - break; - - case KEVENT_MENU_UP: - { - if (CurrentMenuItem->OnIncrement != NULL) - { - CurrentMenuItem->OnIncrement(); - } - } - break; - - case KEVENT_MENU_DOWN: - { - if (CurrentMenuItem->OnDecrement != NULL) - { - CurrentMenuItem->OnDecrement(); - } - } - break; - - case KEVENT_MENU_EXIT: - while (MenuItemHistoryIndex > 0) - { - // Go up a menu. - MenuItemHistoryIndex--; - CurrentMenuItem = MenuItemHistory[MenuItemHistoryIndex]; - if (CurrentMenuItem->OnFocus != NULL) - { - CurrentMenuItem->OnFocus(true); - } - } - break; + case KEVENT_MENU_UP: + { + if (CurrentMenuItem->OnIncrement != NULL) + { + CurrentMenuItem->OnIncrement(); + } + } + break; - case KEVENT_TRIGGER_SWITCH_RELEASED: - { - uint32_t duration_of_press_in_ms = (uint32_t)Event.Data; - - if (duration_of_press_in_ms > LONG_PRESS_FOR_READY_in_ms) - { - Transition_For_Event(context, STATE_READY, &Event); - } - } - break; + case KEVENT_MENU_DOWN: + { + if (CurrentMenuItem->OnDecrement != NULL) + { + CurrentMenuItem->OnDecrement(); + } + } + break; - case KEVENT_PLAY_PRESSED_ON_REMOTE: + case KEVENT_MENU_EXIT: + while (MenuItemHistoryIndex > 0) + { + // Go up a menu. + MenuItemHistoryIndex--; + CurrentMenuItem = MenuItemHistory[MenuItemHistoryIndex]; + if (CurrentMenuItem->OnFocus != NULL) + { + CurrentMenuItem->OnFocus(true); + } + } + break; + + case KEVENT_TRIGGER_SWITCH_RELEASED: + { + uint32_t duration_of_press_in_ms = (uint32_t)Event.Data; + + if (duration_of_press_in_ms > LONG_PRESS_FOR_READY_in_ms) + { Transition_For_Event(context, STATE_READY, &Event); - break; + } + } + break; - case KEVENT_REPROGRAM: - Transition_For_Event(context, STATE_REPROGRAMMING, &Event); - break; - - default: - // All other events are ignored in this state. - ProcessUnhandledEvent(&Event); - break; + case KEVENT_ACCESSORY_SWITCH_PRESSED: + { + uint8_t Team_ID; + + (void)SETTINGS_get_uint8_t(SYSTEMK_SETTING_TEAMID, &Team_ID); + + Team_ID++; + + if (Team_ID > BASIC_TEAMS_MAXIMUM) + { + Team_ID = BASIC_TEAMS_MINIMUM; + } + + if (Set_Team_With_Audio_Feedback(Team_ID) != SYSTEMK_RESULT_SUCCESS) + { + KLOG_WARN(KLOG_TAG, "Failed to increment team!"); + } + } + break; + + case KEVENT_PLAY_PRESSED_ON_REMOTE: + Transition_For_Event(context, STATE_READY, &Event); + break; + + case KEVENT_REPROGRAM: + Transition_For_Event(context, STATE_REPROGRAMMING, &Event); + break; + + default: + // All other events are ignored in this state. + ProcessUnhandledEvent(&Event); + break; } } } @@ -184,14 +203,14 @@ static void Configuring_Do(StateMachineContext_T * context) /*! * \param context Context in which this state is being run. */ -static void Configuring_Exit(StateMachineContext_T * context) +static void Configuring_Exit(StateMachineContext_T *context) { // Save any changes that were made to NVM. if (SETTINGS_Save() != SYSTEMK_RESULT_SUCCESS) { KLOG_ERROR(KLOG_TAG, "Couldn't save the settings to NVM!"); } - + NeoPixelsAction_T neopixels_action = {.ID = NEOPIXELS_ALL_OFF, .Prominence = NEOPIXELS_FOREGROUND, .Data = (void *)0x00}; xQueueSend(xQueueNeoPixels, &neopixels_action, 0); } diff --git a/SystemK.h b/SystemK.h index cd0e29e..289cfb1 100755 --- a/SystemK.h +++ b/SystemK.h @@ -93,8 +93,8 @@ #include "Logging/KLog.h" #include "Protocols/Protocols.h" #include "Settings/Settings_Interface.h" -#include "Game/Game.h" #include "Audio/Audio_HW_Interface.h" +#include "Game/Game.h" #include "NeoPixels/NeoPixels.h" #include "BLE/BLE_Packets.h" #include "BLE/BLE_Packet_Tracker.h"