Legacy branch migration
This commit is contained in:
82
firmware/devices/inputs.c
Normal file
82
firmware/devices/inputs.c
Normal file
@@ -0,0 +1,82 @@
|
||||
/**** 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;
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user