mirror of
https://github.com/openshwprojects/OpenBK7231T_App.git
synced 2026-02-05 01:05:35 +00:00
adc button (multiple buttons on adc) driver
This commit is contained in:
@ -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>
|
||||
|
||||
@ -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" />
|
||||
|
||||
@ -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) {
|
||||
|
||||
@ -116,6 +116,8 @@ enum EventCode {
|
||||
|
||||
CMD_EVENT_CHANGE_NOMQTTTIME,
|
||||
|
||||
CMD_EVENT_ADC_BUTTON,
|
||||
|
||||
// must be lower than 256
|
||||
CMD_EVENT_MAX_TYPES
|
||||
};
|
||||
|
||||
89
src/driver/drv_adcButton.c
Normal file
89
src/driver/drv_adcButton.c
Normal 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;
|
||||
}
|
||||
}
|
||||
|
||||
@ -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();
|
||||
|
||||
@ -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",
|
||||
|
||||
@ -451,6 +451,10 @@ const char* htmlPinRoleNames[] = {
|
||||
"DoorSnsrWSleep_pd",
|
||||
"SGP_CLK",
|
||||
"SGP_DAT",
|
||||
"ADC_Button",
|
||||
"error",
|
||||
"error",
|
||||
"error",
|
||||
"error",
|
||||
"error",
|
||||
"error",
|
||||
|
||||
@ -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",
|
||||
|
||||
@ -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;
|
||||
|
||||
@ -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;
|
||||
|
||||
Reference in New Issue
Block a user