adc button (multiple buttons on adc) driver

This commit is contained in:
openshwprojects
2023-04-14 21:57:32 +02:00
parent 427cdaf6f8
commit f5e245a75f
11 changed files with 128 additions and 11 deletions

View File

@ -277,6 +277,7 @@
<ClCompile Include="src\devicegroups\deviceGroups_write.c">
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Debug Win32 ScriptOnly|Win32'">true</ExcludedFromBuild>
</ClCompile>
<ClCompile Include="src\driver\drv_adcButton.c" />
<ClCompile Include="src\driver\drv_battery.c" />
<ClCompile Include="src\driver\drv_bl0937.c">
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Debug Win32 ScriptOnly|Win32'">true</ExcludedFromBuild>

View File

@ -830,6 +830,9 @@
<ClCompile Include="src\driver\drv_sgp.c">
<Filter>Drv</Filter>
</ClCompile>
<ClCompile Include="src\driver\drv_adcButton.c">
<Filter>Drv</Filter>
</ClCompile>
</ItemGroup>
<ItemGroup>
<ClInclude Include="src\new_cfg.h" />

View File

@ -193,7 +193,9 @@ static int EVENT_ParseEventName(const char *s) {
if (!stricmp(s, "WiFiState"))
return CMD_EVENT_WIFI_STATE;
if (!stricmp(s, "TuyaMCUParsed"))
return CMD_EVENT_TUYAMCU_PARSED;
return CMD_EVENT_TUYAMCU_PARSED;
if (!stricmp(s, "OnADCButton"))
return CMD_EVENT_ADC_BUTTON;
return CMD_EVENT_NONE;
}
static bool EVENT_EvaluateCondition(int code, int argument, int next) {

View File

@ -116,6 +116,8 @@ enum EventCode {
CMD_EVENT_CHANGE_NOMQTTTIME,
CMD_EVENT_ADC_BUTTON,
// must be lower than 256
CMD_EVENT_MAX_TYPES
};

View File

@ -0,0 +1,89 @@
#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":"cqqqqs",
//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;
}
}

View File

@ -24,6 +24,9 @@ void DRV_MAX72XX_Clock_OnEverySecond();
void DRV_MAX72XX_Clock_RunFrame();
void DRV_MAX72XX_Clock_Init();
void DRV_ADCButton_Init();
void DRV_ADCButton_RunFrame();
void SM2135_Init();
void SM2235_Init();

View File

@ -187,7 +187,11 @@ static driver_t g_drivers[] = {
//drvdetail:"descr":"Simple hardcoded driver for MAX72XX clock. Requirex manual start of MAX72XX driver with MAX72XX setup and NTP start.",
//drvdetail:"requires":""}
{ "MAX72XX_Clock", DRV_MAX72XX_Clock_Init, DRV_MAX72XX_Clock_OnEverySecond, NULL, DRV_MAX72XX_Clock_RunFrame, NULL, NULL, false },
//drvdetail:{"name":"ADCButton",
//drvdetail:"title":"TODO",
//drvdetail:"descr":".",
//drvdetail:"requires":""}
{ "ADCButton", DRV_ADCButton_Init, NULL, NULL, DRV_ADCButton_RunFrame, NULL, NULL, false },
#endif
#ifdef ENABLE_DRIVER_LED
//drvdetail:{"name":"SM2135",

View File

@ -451,6 +451,10 @@ const char* htmlPinRoleNames[] = {
"DoorSnsrWSleep_pd",
"SGP_CLK",
"SGP_DAT",
"ADC_Button",
"error",
"error",
"error",
"error",
"error",
"error",

View File

@ -481,6 +481,13 @@ typedef enum ioRole_e {
//iodetail:"file":"new_pins.h",
//iodetail:"driver":""}
IOR_SGP_DAT,
//iodetail:{"name":"ADC_Button",
//iodetail:"title":"TODO",
//iodetail:"descr":"Single ADC with multiple buttons connected.d",
//iodetail:"enum":"ADC_Button",
//iodetail:"file":"new_pins.h",
//iodetail:"driver":""}
IOR_ADC_Button,
//iodetail:{"name":"Total_Options",
//iodetail:"title":"TODO",
//iodetail:"descr":"Current total number of available IOR roles",

View File

@ -5,3 +5,4 @@
// define this to use edge based GPI interrupts to drive Pin_ticks()
//#define BEKEN_PIN_GPI_INTERRUPTS
extern unsigned int g_deltaTimeMS;

View File

@ -665,6 +665,7 @@ static int g_wifi_ledState = 0;
static uint32_t g_time = 0;
static uint32_t g_last_time = 0;
int g_bWantPinDeepSleep;
unsigned int g_deltaTimeMS;
/////////////////////////////////////////////////////
// this is what we do in a qucik tick
@ -687,23 +688,23 @@ void QuickTick(void* param)
#else
g_time += QUICK_TMR_DURATION;
#endif
uint32_t t_diff = g_time - g_last_time;
g_deltaTimeMS = g_time - g_last_time;
// cope with wrap
if (t_diff > 0x4000) {
t_diff = ((g_time + 0x4000) - (g_last_time + 0x4000));
if (g_deltaTimeMS > 0x4000) {
g_deltaTimeMS = ((g_time + 0x4000) - (g_last_time + 0x4000));
}
g_last_time = g_time;
#if (defined WINDOWS) || (defined PLATFORM_BEKEN)
SVM_RunThreads(t_diff);
SVM_RunThreads(g_deltaTimeMS);
#endif
RepeatingEvents_RunUpdate(t_diff * 0.001f);
RepeatingEvents_RunUpdate(g_deltaTimeMS * 0.001f);
#ifndef OBK_DISABLE_ALL_DRIVERS
DRV_RunQuickTick();
#endif
#ifdef WINDOWS
NewTuyaMCUSimulator_RunQuickTick(t_diff);
NewTuyaMCUSimulator_RunQuickTick(g_deltaTimeMS);
#endif
CMD_RunUartCmndIfRequired();
@ -711,13 +712,13 @@ void QuickTick(void* param)
MQTT_RunQuickTick();
if (CFG_HasFlag(OBK_FLAG_LED_SMOOTH_TRANSITIONS) == true) {
LED_RunQuickColorLerp(t_diff);
LED_RunQuickColorLerp(g_deltaTimeMS);
}
// WiFi LED
// In Open Access point mode, fast blink
if (Main_IsOpenAccessPointMode()) {
g_wifiLedToggleTime += t_diff;
g_wifiLedToggleTime += g_deltaTimeMS;
if (g_wifiLedToggleTime > WIFI_LED_FAST_BLINK_DURATION) {
g_wifi_ledState = !g_wifi_ledState;
g_wifiLedToggleTime = 0;
@ -730,7 +731,7 @@ void QuickTick(void* param)
}
else {
// in connecting mode, slow blink
g_wifiLedToggleTime += t_diff;
g_wifiLedToggleTime += g_deltaTimeMS;
if (g_wifiLedToggleTime > WIFI_LED_SLOW_BLINK_DURATION) {
g_wifi_ledState = !g_wifi_ledState;
g_wifiLedToggleTime = 0;