2020TPC-SW/2020TPCApp1.cydsn/Switches.c
2025-02-01 19:52:04 -06:00

196 lines
8.1 KiB
C

/* Include Files */
#include "KTag.h"
TaskHandle_t Switches_Task_Handle;
#define SWITCHES_TASK_PERIOD_IN_TICKS (100 / portTICK_PERIOD_MS)
//! Continuously pressing a switch for this length of time will be interpreted as a long press.
/*!
* #Duration_Of_Long_Press_in_Ticks must be an integer multiple of #SWITCHES_TASK_PERIOD_IN_TICKS!
*/
static const TickType_t Duration_Of_Long_Press_in_Ticks = (10 * SWITCHES_TASK_PERIOD_IN_TICKS);
#if (defined LIL_BRUV) || (defined LITTLE_BOY_BLUE)
static TickType_t Up_Switch_Time_Pressed_in_Ticks = 0;
static TickType_t Up_Switch_Time_Released_in_Ticks = 0;
static TickType_t Down_Switch_Time_Pressed_in_Ticks = 0;
static TickType_t Down_Switch_Time_Released_in_Ticks = 0;
static TickType_t Forward_Switch_Time_Pressed_in_Ticks = 0;
static TickType_t Forward_Switch_Time_Released_in_Ticks = 0;
static TickType_t Backward_Switch_Time_Pressed_in_Ticks = 0;
static TickType_t Backward_Switch_Time_Released_in_Ticks = 0;
#elif (defined TWENTY20TPC)
static TickType_t Accessory_Switch_Time_Pressed_in_Ticks = 0;
static TickType_t Accessory_Switch_Total_Time_Pressed_in_Ticks = 0;
static TickType_t Accessory_Switch_Time_Released_in_Ticks = 0;
static TickType_t Accessory_Switch_Time_Since_Last_Release_in_Ticks = 0;
#endif // Model
void Switches_Init(void)
{
}
//! Reads the hardware switches and creates press and release events.
/*!
* This is a periodic task--see https://www.freertos.org/vtaskdelayuntil.html.
*/
void Switches_Task(void * pvParameters)
{
TickType_t xLastWakeTime;
// Initialize the xLastWakeTime variable with the current time.
xLastWakeTime = xTaskGetTickCount();
while (true)
{
#if (defined LIL_BRUV) || (defined LITTLE_BOY_BLUE)
if (Cy_GPIO_Read(Pin_Up_PORT, Pin_Up_NUM) == 0)
{
if (Up_Switch_Time_Pressed_in_Ticks == 0)
{
Up_Switch_Time_Released_in_Ticks = 0;
KEvent_T switch_event = {.ID = KEVENT_UP_SWITCH_PRESSED, .Data = &Up_Switch_Time_Released_in_Ticks};
Post_KEvent(&switch_event);
}
else if (Up_Switch_Time_Pressed_in_Ticks == Duration_Of_Long_Press_in_Ticks)
{
KEvent_T switch_event = {.ID = KEVENT_UP_SWITCH_LONG_PRESSED, .Data = &Up_Switch_Time_Pressed_in_Ticks};
Post_KEvent(&switch_event);
}
Up_Switch_Time_Pressed_in_Ticks += SWITCHES_TASK_PERIOD_IN_TICKS;
}
else
{
if (Up_Switch_Time_Released_in_Ticks == 0)
{
Up_Switch_Time_Pressed_in_Ticks = 0;
KEvent_T switch_event = {.ID = KEVENT_UP_SWITCH_RELEASED, .Data = &Up_Switch_Time_Pressed_in_Ticks};
Post_KEvent(&switch_event);
}
Up_Switch_Time_Released_in_Ticks += SWITCHES_TASK_PERIOD_IN_TICKS;
}
if (Cy_GPIO_Read(Pin_Down_PORT, Pin_Down_NUM) == 0)
{
if (Down_Switch_Time_Pressed_in_Ticks == 0)
{
Down_Switch_Time_Released_in_Ticks = 0;
KEvent_T switch_event = {.ID = KEVENT_DOWN_SWITCH_PRESSED, .Data = &Down_Switch_Time_Released_in_Ticks};
Post_KEvent(&switch_event);
}
else if (Down_Switch_Time_Pressed_in_Ticks == Duration_Of_Long_Press_in_Ticks)
{
KEvent_T switch_event = {.ID = KEVENT_DOWN_SWITCH_LONG_PRESSED, .Data = &Down_Switch_Time_Pressed_in_Ticks};
Post_KEvent(&switch_event);
}
Down_Switch_Time_Pressed_in_Ticks += SWITCHES_TASK_PERIOD_IN_TICKS;
}
else
{
if (Down_Switch_Time_Released_in_Ticks == 0)
{
Down_Switch_Time_Pressed_in_Ticks = 0;
KEvent_T switch_event = {.ID = KEVENT_DOWN_SWITCH_RELEASED, .Data = &Down_Switch_Time_Pressed_in_Ticks};
Post_KEvent(&switch_event);
}
Down_Switch_Time_Released_in_Ticks += SWITCHES_TASK_PERIOD_IN_TICKS;
}
if (Cy_GPIO_Read(Pin_Forward_PORT, Pin_Forward_NUM) == 0)
{
if (Forward_Switch_Time_Pressed_in_Ticks == 0)
{
Forward_Switch_Time_Released_in_Ticks = 0;
KEvent_T switch_event = {.ID = KEVENT_FORWARD_SWITCH_PRESSED, .Data = &Forward_Switch_Time_Released_in_Ticks};
Post_KEvent(&switch_event);
}
else if (Forward_Switch_Time_Pressed_in_Ticks == Duration_Of_Long_Press_in_Ticks)
{
KEvent_T switch_event = {.ID = KEVENT_FORWARD_SWITCH_LONG_PRESSED, .Data = &Forward_Switch_Time_Pressed_in_Ticks};
Post_KEvent(&switch_event);
}
Forward_Switch_Time_Pressed_in_Ticks += SWITCHES_TASK_PERIOD_IN_TICKS;
}
else
{
if (Forward_Switch_Time_Released_in_Ticks == 0)
{
Forward_Switch_Time_Pressed_in_Ticks = 0;
KEvent_T switch_event = {.ID = KEVENT_FORWARD_SWITCH_RELEASED, .Data = &Forward_Switch_Time_Pressed_in_Ticks};
Post_KEvent(&switch_event);
}
Forward_Switch_Time_Released_in_Ticks += SWITCHES_TASK_PERIOD_IN_TICKS;
}
if (Cy_GPIO_Read(Pin_Backward_PORT, Pin_Backward_NUM) == 0)
{
if (Backward_Switch_Time_Pressed_in_Ticks == 0)
{
Backward_Switch_Time_Released_in_Ticks = 0;
KEvent_T switch_event = {.ID = KEVENT_BACKWARD_SWITCH_PRESSED, .Data = &Backward_Switch_Time_Released_in_Ticks};
Post_KEvent(&switch_event);
}
else if (Backward_Switch_Time_Pressed_in_Ticks == Duration_Of_Long_Press_in_Ticks)
{
KEvent_T switch_event = {.ID = KEVENT_BACKWARD_SWITCH_LONG_PRESSED, .Data = &Backward_Switch_Time_Pressed_in_Ticks};
Post_KEvent(&switch_event);
}
Backward_Switch_Time_Pressed_in_Ticks += SWITCHES_TASK_PERIOD_IN_TICKS;
}
else
{
if (Backward_Switch_Time_Released_in_Ticks == 0)
{
Backward_Switch_Time_Pressed_in_Ticks = 0;
KEvent_T switch_event = {.ID = KEVENT_BACKWARD_SWITCH_RELEASED, .Data = &Backward_Switch_Time_Pressed_in_Ticks};
Post_KEvent(&switch_event);
}
Backward_Switch_Time_Released_in_Ticks += SWITCHES_TASK_PERIOD_IN_TICKS;
}
#elif (defined TWENTY20TPC)
// Use the Remote Trigger pin as the Accessory input, since we never got around to using remote triggers.
if (Cy_GPIO_Read(Pin_Remote_Trigger_PORT, Pin_Remote_Trigger_NUM) == 0)
{
if (Accessory_Switch_Time_Pressed_in_Ticks == 0)
{
Accessory_Switch_Time_Since_Last_Release_in_Ticks = Accessory_Switch_Time_Released_in_Ticks;
KEvent_T switch_event = {.ID = KEVENT_ACCESSORY_SWITCH_PRESSED, .Data = (void *) pdTICKS_TO_MS(Accessory_Switch_Time_Since_Last_Release_in_Ticks)};
Post_KEvent(&switch_event);
Accessory_Switch_Time_Released_in_Ticks = 0;
}
if ((UINT32_MAX - Accessory_Switch_Time_Pressed_in_Ticks) > SWITCHES_TASK_PERIOD_IN_TICKS)
{
Accessory_Switch_Time_Pressed_in_Ticks += SWITCHES_TASK_PERIOD_IN_TICKS;
}
}
else
{
if (Accessory_Switch_Time_Released_in_Ticks == 0)
{
Accessory_Switch_Total_Time_Pressed_in_Ticks = Accessory_Switch_Time_Pressed_in_Ticks;
KEvent_T switch_event = {.ID = KEVENT_ACCESSORY_SWITCH_RELEASED, .Data = (void *) pdTICKS_TO_MS(Accessory_Switch_Total_Time_Pressed_in_Ticks)};
Post_KEvent(&switch_event);
Accessory_Switch_Time_Pressed_in_Ticks = 0;
}
if ((UINT32_MAX - Accessory_Switch_Time_Released_in_Ticks) > SWITCHES_TASK_PERIOD_IN_TICKS)
{
Accessory_Switch_Time_Released_in_Ticks += SWITCHES_TASK_PERIOD_IN_TICKS;
}
}
#endif // Model
// Wait for the next cycle.
vTaskDelayUntil(&xLastWakeTime, SWITCHES_TASK_PERIOD_IN_TICKS);
}
}