diff --git a/openBeken_win32_mvsc2017.vcxproj b/openBeken_win32_mvsc2017.vcxproj index 274533e46..b1f2dfade 100644 --- a/openBeken_win32_mvsc2017.vcxproj +++ b/openBeken_win32_mvsc2017.vcxproj @@ -294,6 +294,7 @@ true + true diff --git a/openBeken_win32_mvsc2017.vcxproj.filters b/openBeken_win32_mvsc2017.vcxproj.filters index a250631fa..13d2ad334 100644 --- a/openBeken_win32_mvsc2017.vcxproj.filters +++ b/openBeken_win32_mvsc2017.vcxproj.filters @@ -426,6 +426,9 @@ Drv + + Drv + diff --git a/src/driver/drv_httpButtons.c b/src/driver/drv_httpButtons.c new file mode 100644 index 000000000..44838d505 --- /dev/null +++ b/src/driver/drv_httpButtons.c @@ -0,0 +1,226 @@ +#include "../new_common.h" +#include "../new_pins.h" +#include "../new_cfg.h" +// Commands register, execution API and cmd tokenizer +#include "../cmnds/cmd_public.h" +#include "../mqtt/new_mqtt.h" +#include "../logging/logging.h" +#include "../hal/hal_pins.h" +#include "../httpserver/new_http.h" + +typedef struct { + bool bEnabled; + char label[32]; + char command[128]; + char color[16]; +} httpButton_t; + +httpButton_t **g_buttons = 0; +int g_buttonCount = 0; + +httpButton_t *getOrAlloc(int idx) { + int i; + + if (idx >= g_buttonCount) { + g_buttons = (httpButton_t**)realloc(g_buttons, sizeof(httpButton_t*)*(idx + 1)); + for (i = g_buttonCount; i <= idx; i++) { + g_buttons[i] = 0; + } + g_buttonCount = idx + 1; + } + if (g_buttons[idx] == 0) { + g_buttons[idx] = (httpButton_t*)malloc(sizeof(httpButton_t)); + memset(g_buttons[idx], 0, sizeof(httpButton_t)); + } + return g_buttons[idx]; +} +httpButton_t *getSafe(int idx) { + if (idx >= g_buttonCount) { + return 0; + } + return g_buttons[idx]; +} +void setEnabled(int idx, bool b) { + httpButton_t *bt; + bt = getOrAlloc(idx); + if (bt == 0) + return; + bt->bEnabled = b; +} +void setLabel(int idx, const char *lab) { + httpButton_t *bt; + bt = getOrAlloc(idx); + if (bt == 0) + return; + strcpy_safe(bt->label, lab, sizeof(bt->label)); +} +void setCommand(int idx, const char *cmd) { + httpButton_t *bt; + bt = getOrAlloc(idx); + if (bt == 0) + return; + strcpy_safe(bt->command, cmd, sizeof(bt->command)); +} +void setColor(int idx, const char *cs) { + httpButton_t *bt; + bt = getOrAlloc(idx); + if (bt == 0) + return; + strcpy_safe(bt->color, cs, sizeof(bt->color)); +} +/* +Usage: + +startDriver httpButtons +setButtonEnabled 0 1 +setButtonLabel 0 "Turn off after 10 seconds" +setButtonCommand 0 "addRepeatingEvent 10 1 Power Off" +//setButtonColor 0 "#FF0000" + + +setButtonEnabled 1 1 +setButtonLabel 1 "Set Red 50% brightness" +setButtonCommand 1 "backlog led_basecolor_rgb FF0000; led_dimmer 50; led_enableAll 1" +//setButtonColor 1 "blue" + + + + + +*/ + + + + +void DRV_HTTPButtons_ProcessChanges(http_request_t *request) { + int j; + int val; + char tmpA[8]; + httpButton_t *bt; + + if (http_getArg(request->url, "act", tmpA, sizeof(tmpA))) { + j = atoi(tmpA); + hprintf255(request, "

Will do action %i!

", j); + bt = getSafe(j); + if (bt) { + CMD_ExecuteCommand(bt->command, 0); + } + } + +} +void DRV_HTTPButtons_AddToHtmlPage(http_request_t *request) { + int i; + const char *c; + + for (i = 0; i < g_buttonCount; i++) { + httpButton_t *bt = g_buttons[i]; + + if (bt == 0) + continue; + if (bt->bEnabled == false) + continue; + + + hprintf255(request, ""); + + c = ""; + if (!bt->color[0]) { + c = "bgrn"; + } + + poststr(request, "
"); + hprintf255(request, "", i); + hprintf255(request, "color[0]) { + hprintf255(request, "style = \"background-color:%s;\" ",bt->color); + } + hprintf255(request, "type = \"submit\" value=\"%s\"/>
", bt->label); + poststr(request, ""); + + + } +} + +commandResult_t CMD_setButtonColor(const void *context, const char *cmd, const char *args, int cmdFlags) { + int buttonIndex; + const char *cStr; + + Tokenizer_TokenizeString(args, TOKENIZER_ALLOW_QUOTES); + + if (Tokenizer_GetArgsCount() < 2) { + addLogAdv(LOG_INFO, LOG_FEATURE_CMD, "This command needs 2 arguments"); + return CMD_RES_NOT_ENOUGH_ARGUMENTS; + } + buttonIndex = Tokenizer_GetArgInteger(0); + cStr = Tokenizer_GetArg(1); + + setColor(buttonIndex, cStr); + + + return CMD_RES_OK; +} + +commandResult_t CMD_setButtonCommand(const void *context, const char *cmd, const char *args, int cmdFlags) { + int buttonIndex; + const char *cmdToSet; + + Tokenizer_TokenizeString(args, TOKENIZER_ALLOW_QUOTES); + + if (Tokenizer_GetArgsCount() < 2) { + addLogAdv(LOG_INFO, LOG_FEATURE_CMD, "This command needs 2 arguments"); + return CMD_RES_NOT_ENOUGH_ARGUMENTS; + } + buttonIndex = Tokenizer_GetArgInteger(0); + cmdToSet = Tokenizer_GetArg(1); + + setCommand(buttonIndex, cmdToSet); + + return CMD_RES_OK; +} +commandResult_t CMD_setButtonLabel(const void *context, const char *cmd, const char *args, int cmdFlags) { + int buttonIndex; + const char *lab; + + Tokenizer_TokenizeString(args, TOKENIZER_ALLOW_QUOTES); + + if (Tokenizer_GetArgsCount() < 2) { + addLogAdv(LOG_INFO, LOG_FEATURE_CMD, "This command needs 2 arguments"); + return CMD_RES_NOT_ENOUGH_ARGUMENTS; + } + buttonIndex = Tokenizer_GetArgInteger(0); + lab = Tokenizer_GetArg(1); + + setLabel(buttonIndex, lab); + + return CMD_RES_OK; +} +commandResult_t CMD_setButtonEnabled(const void *context, const char *cmd, const char *args, int cmdFlags) { + int buttonIndex; + int bOn; + + Tokenizer_TokenizeString(args,0); + + if (Tokenizer_GetArgsCount() < 2) { + addLogAdv(LOG_INFO, LOG_FEATURE_CMD, "This command needs 2 arguments"); + return CMD_RES_NOT_ENOUGH_ARGUMENTS; + } + buttonIndex = Tokenizer_GetArgInteger(0); + bOn = Tokenizer_GetArgInteger(1); + + setEnabled(buttonIndex, bOn); + return CMD_RES_OK; +} +void DRV_InitHTTPButtons() { + CMD_RegisterCommand("setButtonColor", "", CMD_setButtonColor, NULL, NULL); + CMD_RegisterCommand("setButtonCommand", "", CMD_setButtonCommand, NULL, NULL); + CMD_RegisterCommand("setButtonLabel", "", CMD_setButtonLabel, NULL, NULL); + CMD_RegisterCommand("setButtonEnabled", "", CMD_setButtonEnabled, NULL, NULL); +} + + + + + + + + diff --git a/src/driver/drv_local.h b/src/driver/drv_local.h index 8198564d3..7a7c71e05 100644 --- a/src/driver/drv_local.h +++ b/src/driver/drv_local.h @@ -59,3 +59,8 @@ void DRV_Toggler_AddToHtmlPage(http_request_t *request); void DRV_Toggler_AppendInformationToHTTPIndexPage(http_request_t* request); void DRV_InitPWMToggler(); + +void DRV_HTTPButtons_ProcessChanges(http_request_t *request); +void DRV_HTTPButtons_AddToHtmlPage(http_request_t *request); +void DRV_InitHTTPButtons(); + diff --git a/src/driver/drv_main.c b/src/driver/drv_main.c index 99286e51a..2ccaa68b6 100644 --- a/src/driver/drv_main.c +++ b/src/driver/drv_main.c @@ -77,7 +77,8 @@ static driver_t g_drivers[] = { //Test drivers { "TESTPOWER", Test_Power_Init, Test_Power_RunFrame, BL09XX_AppendInformationToHTTPIndexPage, NULL, NULL, NULL, false }, { "TESTLED", Test_LED_Driver_Init, Test_LED_Driver_RunFrame, NULL, NULL, NULL, Test_LED_Driver_OnChannelChanged, false }, - + { "HTTPButtons", DRV_InitHTTPButtons, NULL, NULL, NULL, NULL, NULL, false }, + #if PLATFORM_BEKEN { "SM16703P", SM16703P_Init, NULL, NULL, NULL, NULL, NULL, false }, diff --git a/src/httpserver/http_fns.c b/src/httpserver/http_fns.c index cb2b4ed4a..b13c27639 100644 --- a/src/httpserver/http_fns.c +++ b/src/httpserver/http_fns.c @@ -229,6 +229,11 @@ int http_fn_index(http_request_t* request) { if (DRV_IsRunning("PWMToggler")) { DRV_Toggler_ProcessChanges(request); } +#endif +#if defined(PLATFORM_BEKEN) || defined(WINDOWS) + if (DRV_IsRunning("httpButtons")) { + DRV_HTTPButtons_ProcessChanges(request); + } #endif if (http_getArg(request->url, "tgl", tmpA, sizeof(tmpA))) { j = atoi(tmpA); @@ -717,6 +722,11 @@ int http_fn_index(http_request_t* request) { DRV_Toggler_AddToHtmlPage(request); } #endif +#if defined(PLATFORM_BEKEN) || defined(WINDOWS) + if (DRV_IsRunning("httpButtons")) { + DRV_HTTPButtons_AddToHtmlPage(request); + } +#endif poststr(request, ""); #ifndef OBK_DISABLE_ALL_DRIVERS