diff --git a/openBeken_win32_mvsc2017.vcxproj b/openBeken_win32_mvsc2017.vcxproj
index e10c86258..4f6cfb17f 100644
--- a/openBeken_win32_mvsc2017.vcxproj
+++ b/openBeken_win32_mvsc2017.vcxproj
@@ -277,6 +277,7 @@
true
+
true
diff --git a/openBeken_win32_mvsc2017.vcxproj.filters b/openBeken_win32_mvsc2017.vcxproj.filters
index 2d07069c5..4b25b3d02 100644
--- a/openBeken_win32_mvsc2017.vcxproj.filters
+++ b/openBeken_win32_mvsc2017.vcxproj.filters
@@ -830,6 +830,9 @@
Drv
+
+ Drv
+
diff --git a/src/cmnds/cmd_eventHandlers.c b/src/cmnds/cmd_eventHandlers.c
index 2f22d84a9..f8a3e5bd4 100644
--- a/src/cmnds/cmd_eventHandlers.c
+++ b/src/cmnds/cmd_eventHandlers.c
@@ -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) {
diff --git a/src/cmnds/cmd_public.h b/src/cmnds/cmd_public.h
index b89d24f07..c5472bd32 100644
--- a/src/cmnds/cmd_public.h
+++ b/src/cmnds/cmd_public.h
@@ -116,6 +116,8 @@ enum EventCode {
CMD_EVENT_CHANGE_NOMQTTTIME,
+ CMD_EVENT_ADC_BUTTON,
+
// must be lower than 256
CMD_EVENT_MAX_TYPES
};
diff --git a/src/driver/drv_adcButton.c b/src/driver/drv_adcButton.c
new file mode 100644
index 000000000..ad7e481e8
--- /dev/null
+++ b/src/driver/drv_adcButton.c
@@ -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;
+ }
+}
+
diff --git a/src/driver/drv_local.h b/src/driver/drv_local.h
index 47126364b..7f24a7ff1 100644
--- a/src/driver/drv_local.h
+++ b/src/driver/drv_local.h
@@ -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();
diff --git a/src/driver/drv_main.c b/src/driver/drv_main.c
index 71de926a8..344a8aceb 100644
--- a/src/driver/drv_main.c
+++ b/src/driver/drv_main.c
@@ -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",
diff --git a/src/httpserver/new_http.c b/src/httpserver/new_http.c
index e95cc8b37..d0848b805 100644
--- a/src/httpserver/new_http.c
+++ b/src/httpserver/new_http.c
@@ -451,6 +451,10 @@ const char* htmlPinRoleNames[] = {
"DoorSnsrWSleep_pd",
"SGP_CLK",
"SGP_DAT",
+ "ADC_Button",
+ "error",
+ "error",
+ "error",
"error",
"error",
"error",
diff --git a/src/new_pins.h b/src/new_pins.h
index dc4efbd20..20260d397 100644
--- a/src/new_pins.h
+++ b/src/new_pins.h
@@ -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",
diff --git a/src/quicktick.h b/src/quicktick.h
index 83582ebd4..b20ab5fbf 100644
--- a/src/quicktick.h
+++ b/src/quicktick.h
@@ -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;
diff --git a/src/user_main.c b/src/user_main.c
index 0f5b8128c..29841e134 100644
--- a/src/user_main.c
+++ b/src/user_main.c
@@ -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;