85 lines
2.2 KiB
C
85 lines
2.2 KiB
C
#include "app_config.h"
|
|
#include "app_types.h"
|
|
#include "hardware.h"
|
|
#include "slave_inputs.h"
|
|
|
|
static uint8_t Analog_ToPercent(uint16_t raw)
|
|
{
|
|
uint32_t clamped = raw;
|
|
|
|
if (clamped > APP_ANALOG_MAX_RAW)
|
|
{
|
|
clamped = APP_ANALOG_MAX_RAW;
|
|
}
|
|
|
|
return (uint8_t)((clamped * 100U) / APP_ANALOG_MAX_RAW);
|
|
}
|
|
|
|
void SlaveInputs_Init(void)
|
|
{
|
|
for (uint8_t i = 0U; i < APP_BUTTON_COUNT; i++)
|
|
{
|
|
g_app.slave_inputs.buttons[i].pressed = Hardware_ReadButton(i);
|
|
g_app.slave_inputs.buttons[i].changed = false;
|
|
g_app.slave_inputs.buttons[i].last_change_ms = Hardware_GetTickMs();
|
|
}
|
|
|
|
g_app.slave_inputs.analog.raw = Hardware_ReadAnalogRaw();
|
|
g_app.slave_inputs.analog.filtered = g_app.slave_inputs.analog.raw;
|
|
g_app.slave_inputs.analog.percent = Analog_ToPercent(g_app.slave_inputs.analog.filtered);
|
|
}
|
|
|
|
void SlaveInputs_Process(void)
|
|
{
|
|
const uint32_t now = Hardware_GetTickMs();
|
|
|
|
for (uint8_t i = 0U; i < APP_BUTTON_COUNT; i++)
|
|
{
|
|
const bool pressed = Hardware_ReadButton(i);
|
|
AppButton_t *button = &g_app.slave_inputs.buttons[i];
|
|
|
|
if ((pressed != button->pressed) &&
|
|
((now - button->last_change_ms) >= APP_BUTTON_DEBOUNCE_MS))
|
|
{
|
|
button->pressed = pressed;
|
|
button->changed = true;
|
|
button->last_change_ms = now;
|
|
g_app.slave_inputs.sequence++;
|
|
}
|
|
}
|
|
|
|
const uint16_t raw = Hardware_ReadAnalogRaw();
|
|
AppAnalogChannel_t *analog = &g_app.slave_inputs.analog;
|
|
const uint16_t old_percent = analog->percent;
|
|
|
|
analog->raw = raw;
|
|
analog->filtered = (uint16_t)(((uint32_t)analog->filtered * 7U + raw) / 8U);
|
|
analog->percent = Analog_ToPercent(analog->filtered);
|
|
|
|
if (analog->percent != old_percent)
|
|
{
|
|
g_app.slave_inputs.sequence++;
|
|
}
|
|
}
|
|
|
|
int SlaveInputs_HasChanges(void)
|
|
{
|
|
for (uint8_t i = 0U; i < APP_BUTTON_COUNT; i++)
|
|
{
|
|
if (g_app.slave_inputs.buttons[i].changed)
|
|
{
|
|
return 1;
|
|
}
|
|
}
|
|
|
|
return 0;
|
|
}
|
|
|
|
void SlaveInputs_ClearChanges(void)
|
|
{
|
|
for (uint8_t i = 0U; i < APP_BUTTON_COUNT; i++)
|
|
{
|
|
g_app.slave_inputs.buttons[i].changed = false;
|
|
}
|
|
}
|