196 lines
8.1 KiB
C
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);
|
|
}
|
|
}
|