mirror of
https://github.com/openshwprojects/OpenBK7231T_App.git
synced 2026-03-03 14:06:09 +01:00
90 lines
2.2 KiB
C
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;
|
|
}
|
|
}
|
|
|