Better feedback (lights and sounds) for reentry.

This commit is contained in:
Joe Kearney 2025-06-14 14:21:14 -05:00
parent 9431dc4534
commit 7c20b061ac
2 changed files with 93 additions and 5 deletions

View file

@ -24,6 +24,37 @@
static const char *KLOG_TAG = "STATE_PLAYING__TAGGED_OUT";
static TimerHandle_t TriggerLongPressTimer = NULL;
static StaticTimer_t xTriggerLongPressTimerBuffer;
static TickType_t xTriggerLongPressTimerPeriod = (1000 / portTICK_PERIOD_MS);
static uint_fast8_t SecondsUntilReentry = 6;
static void TriggerLongPressTimerCallback(TimerHandle_t xTimer)
{
SecondsUntilReentry--;
if (SecondsUntilReentry == 0)
{
static All_On_Data_T data;
data.color = ApplyMask(COLOR_GREEN, 0x70);
data.style = DISPLAY_STYLE_HEARTBEAT;
NeoPixelsAction_T neopixels_action = {.ID = NEOPIXELS_ALL_ON, .Prominence = NEOPIXELS_FOREGROUND, .Data = (void *)&data};
xQueueSend(xQueueNeoPixels, &neopixels_action, 0);
AudioAction_T audio_action = {.ID = AUDIO_PLAY_BEEP, .Data = (void *)0x00};
Perform_Audio_Action(&audio_action);
}
else
{
if (xTimerStart(TriggerLongPressTimer, 0) != pdPASS)
{
KLOG_ERROR(KLOG_TAG, "Couldn't start the TriggerLongPressTimer!");
}
AudioAction_T audio_action = {.ID = AUDIO_PLAY_BOOP, .Data = (void *)0x00};
Perform_Audio_Action(&audio_action);
}
}
static void Reset_Bombs()
{
uint8_t n_bombs;
@ -70,6 +101,24 @@ static void Playing__Tagged_Out_Entry(StateMachineContext_T * context)
BLE_UpdateStatusPacket(STATE_PLAYING__TAGGED_OUT);
Increment_Times_Tagged_Out();
SecondsUntilReentry = 6;
if (TriggerLongPressTimer == NULL)
{
TriggerLongPressTimer = xTimerCreateStatic(
"TaggedOutTriggerLongPress",
xTriggerLongPressTimerPeriod,
pdFALSE,
(void *)0,
TriggerLongPressTimerCallback,
&xTriggerLongPressTimerBuffer);
}
if (TriggerLongPressTimer == NULL)
{
KLOG_ERROR(KLOG_TAG, "Couldn't create the TriggerLongPressTimer!");
}
}
//! Executes the Tagged Out substate.
@ -107,19 +156,32 @@ static void Playing__Tagged_Out_Do(StateMachineContext_T * context)
BLE_FreePacketBuffer(Event.Data);
}
break;
case KEVENT_TRIGGER_SWITCH_PRESSED:
{
if (xTimerStart(TriggerLongPressTimer, 0) != pdPASS)
{
KLOG_ERROR(KLOG_TAG, "Couldn't start the TriggerLongPressTimer!");
}
}
break;
case KEVENT_TRIGGER_SWITCH_RELEASED:
{
uint32_t duration_of_press_in_ms = (uint32_t)Event.Data;
xTimerStop(TriggerLongPressTimer, 0);
// Was it a "long" press?
if (duration_of_press_in_ms > 5000)
// Was it in fact a "long" press?
if (SecondsUntilReentry == 0)
{
// Reenter the game.
Set_Health(Get_Max_Health());
Reset_Bombs();
Transition_For_Event(context, STATE_PLAYING__INTERACTING, &Event);
}
else
{
SecondsUntilReentry = 6;
}
}
break;