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;