83 lines
2.0 KiB
C
83 lines
2.0 KiB
C
/**** Includes ****/
|
|
#include "hal/udccd_hal.h"
|
|
#include "inputs.h"
|
|
|
|
/**** Private definitions ****/
|
|
|
|
/**** Private variables ****/
|
|
static const uint8_t def_debounce_lim = 10;
|
|
|
|
/**** Private function declarations ****/
|
|
static void InitDefaultInput(inCh_t* inp);
|
|
static void ProcessInput(uint8_t read_lvl, inCh_t* inp);
|
|
|
|
/**** Public function definitions ****/
|
|
void Inputs_DefInit(inputs_t* inputs)
|
|
{
|
|
InitDefaultInput(&inputs->handbrake);
|
|
InitDefaultInput(&inputs->brakes);
|
|
InitDefaultInput(&inputs->dimm);
|
|
InitDefaultInput(&inputs->up);
|
|
InitDefaultInput(&inputs->down);
|
|
InitDefaultInput(&inputs->mode);
|
|
}
|
|
|
|
void Inputs_UpdateAll(inputs_t* inputs)
|
|
{
|
|
// Chassis inputs
|
|
ProcessInput(HAL_ReadLvl_Handbrake(), &inputs->handbrake);
|
|
ProcessInput(HAL_ReadLvl_Brake(), &inputs->brakes);
|
|
ProcessInput(HAL_ReadLvl_Dimm(), &inputs->dimm);
|
|
|
|
// User inputs
|
|
ProcessInput(HAL_ReadLvl_BtnUp(), &inputs->up);
|
|
ProcessInput(HAL_ReadLvl_BtnDown(), &inputs->down);
|
|
ProcessInput(HAL_ReadLvl_BtnMode(), &inputs->mode);
|
|
}
|
|
|
|
void Inputs_SetHanbrakePullUp(uint8_t on)
|
|
{
|
|
if(on) HAL_SetPull_Handbrake(HIGH);
|
|
else HAL_SetPull_Handbrake(HIZ);
|
|
}
|
|
|
|
/**** Private function definitions ****/
|
|
static void InitDefaultInput(inCh_t* inp)
|
|
{
|
|
inp->is_active = 0;
|
|
inp->is_new = 0;
|
|
inp->state_timer = 0;
|
|
inp->cfg.act_level = LOW;
|
|
inp->cfg.dbnc_treshold = def_debounce_lim;
|
|
inp->proc.level = LOW;
|
|
inp->proc.dbnc_counter = 0;
|
|
}
|
|
|
|
static void ProcessInput(uint8_t read_lvl, inCh_t* inp)
|
|
{
|
|
if(inp->state_timer < 0xFFFF) inp->state_timer++;
|
|
|
|
if(read_lvl != inp->proc.level)
|
|
{
|
|
//Debounce ongoing
|
|
inp->proc.dbnc_counter++;
|
|
if(inp->proc.dbnc_counter < inp->cfg.dbnc_treshold) return;
|
|
|
|
//Save level
|
|
inp->proc.level = read_lvl;
|
|
//Change state
|
|
if(inp->proc.level == inp->cfg.act_level) inp->is_active = 1;
|
|
else inp->is_active = 0;
|
|
// Update new flag
|
|
inp->is_new = 1;
|
|
// Reset state timer
|
|
inp->state_timer = 0;
|
|
return;
|
|
}
|
|
else
|
|
{
|
|
//Debounce failed
|
|
if(inp->proc.dbnc_counter) inp->proc.dbnc_counter = 0;
|
|
}
|
|
}
|