Files
OpenBK7231T_App/src/driver/drv_adcButton.c
openshwprojects de9dd07fbf docs
2023-04-16 17:24:25 +02:00

90 lines
2.2 KiB
C

#include "../new_common.h"
#include "../new_pins.h"
#include "../quicktick.h"
#include "../cmnds/cmd_public.h"
#include "drv_local.h"
#include "drv_public.h"
#include "../logging/logging.h"
#include "../hal/hal_pins.h"
#include "../hal/hal_adc.h"
#include "../mqtt/new_mqtt.h"
// Like: 450 1250 2900
static int *g_ranges = 0;
static int g_numRanges = 0;
static int g_prevButton = -1;
static int g_timeAccum = 0;
static int chooseButton(int value) {
int i;
for (i = 0; i < g_numRanges; i++) {
if (g_ranges[i] > value) {
return i;
}
}
return g_numRanges;
}
commandResult_t Cmd_ADCButtonMap(const void* context, const char* cmd, const char* args, int cmdFlags) {
int cnt, i;
Tokenizer_TokenizeString(args, 0);
// following check must be done after 'Tokenizer_TokenizeString',
// so we know arguments count in Tokenizer. 'cmd' argument is
// only for warning display
if (Tokenizer_CheckArgsCountAndPrintWarning(cmd, 1))
{
return CMD_RES_NOT_ENOUGH_ARGUMENTS;
}
if (g_ranges)
free(g_ranges);
cnt = Tokenizer_GetArgsCount();
g_ranges = (int*)malloc(sizeof(int)*cnt);
for (i = 0; i < cnt; i++) {
g_ranges[i] = Tokenizer_GetArgInteger(i);
}
g_numRanges = cnt;
return CMD_RES_OK;
}
void DRV_ADCButton_Init() {
//cmddetail:{"name":"AB_Map","args":"[int]",
//cmddetail:"descr":"Sets margines for ADC button codes. For given N margins, there are N+1 possible ADC button values (one should be reserved for 'no button')",
//cmddetail:"fn":"Cmd_ADCButtonMap","file":"drv/drv_adcButton.c","requires":"",
//cmddetail:"examples":""}
CMD_RegisterCommand("AB_Map", Cmd_ADCButtonMap, NULL);
}
void DRV_ADCButtonDoMeasurement() {
int newButton;
int adcValue;
int adcPin;
adcPin = PIN_FindPinIndexForRole(IOR_ADC_Button, -1);
if (adcPin == -1) {
return;
}
adcValue = HAL_ADC_Read(adcPin);
newButton = chooseButton(adcValue);
addLogAdv(LOG_INFO, LOG_FEATURE_GENERAL, "ADC %i -> button %i (total %i)\r\n", adcValue, newButton, g_numRanges);
if (newButton != g_prevButton) {
EventHandlers_FireEvent(CMD_EVENT_ADC_BUTTON, newButton);
g_prevButton = newButton;
}
}
void DRV_ADCButton_RunFrame() {
g_timeAccum += g_deltaTimeMS;
if (g_timeAccum > 100) {
DRV_ADCButtonDoMeasurement();
g_timeAccum = 0;
}
}