From 567bc936233a1e6e81f7100629a3391925e44ee6 Mon Sep 17 00:00:00 2001
From: Theo Arends <11044339+arendst@users.noreply.github.com>
Date: Tue, 12 Feb 2019 11:55:47 +0100
Subject: [PATCH] Add Template GUI update
Initial support for online template change using command Template or GUI Configure Other (#5177)
---
sonoff/_changelog.ino | 2 +-
sonoff/language/bg-BG.h | 1 +
sonoff/language/cs-CZ.h | 1 +
sonoff/language/de-DE.h | 1 +
sonoff/language/el-GR.h | 1 +
sonoff/language/en-GB.h | 1 +
sonoff/language/es-AR.h | 1 +
sonoff/language/fr-FR.h | 1 +
sonoff/language/he-HE.h | 1 +
sonoff/language/hu-HU.h | 1 +
sonoff/language/it-IT.h | 1 +
sonoff/language/nl-NL.h | 1 +
sonoff/language/pl-PL.h | 1 +
sonoff/language/pt-BR.h | 1 +
sonoff/language/pt-PT.h | 1 +
sonoff/language/ru-RU.h | 1 +
sonoff/language/sk-SK.h | 1 +
sonoff/language/sv-SE.h | 1 +
sonoff/language/tr-TR.h | 1 +
sonoff/language/uk-UK.h | 1 +
sonoff/language/zh-CN.h | 1 +
sonoff/language/zh-TW.h | 1 +
sonoff/sonoff.ino | 13 +-
sonoff/support.ino | 349 +++++++++++++++++------------------
sonoff/xdrv_01_webserver.ino | 14 +-
25 files changed, 207 insertions(+), 192 deletions(-)
diff --git a/sonoff/_changelog.ino b/sonoff/_changelog.ino
index 12e639ddc..371cbeb7f 100644
--- a/sonoff/_changelog.ino
+++ b/sonoff/_changelog.ino
@@ -1,5 +1,5 @@
/* 6.4.1.16 20190211
- * Initial support for online template change using command Template (#5177)
+ * Initial support for online template change using command Template or GUI Configure Other (#5177)
*
* 6.4.1.15 20190208
* Change image name BE_MINIMAL to FIRMWARE_MINIMAL (#5106)
diff --git a/sonoff/language/bg-BG.h b/sonoff/language/bg-BG.h
index 176d45fb9..da1636422 100644
--- a/sonoff/language/bg-BG.h
+++ b/sonoff/language/bg-BG.h
@@ -288,6 +288,7 @@
#define D_TELEMETRY_PERIOD "Период на телеметрия"
#define D_OTHER_PARAMETERS "Други параметри"
+#define D_TEMPLATE "Template"
#define D_WEB_ADMIN_PASSWORD "Парола на уеб администратора"
#define D_MQTT_ENABLE "Активиране на MQTT"
#define D_FRIENDLY_NAME "Приятелско име"
diff --git a/sonoff/language/cs-CZ.h b/sonoff/language/cs-CZ.h
index 6f298912d..17d2df484 100644
--- a/sonoff/language/cs-CZ.h
+++ b/sonoff/language/cs-CZ.h
@@ -288,6 +288,7 @@
#define D_TELEMETRY_PERIOD "Interval telemetrie"
#define D_OTHER_PARAMETERS "Další nastavení"
+#define D_TEMPLATE "Template"
#define D_WEB_ADMIN_PASSWORD "Heslo Web administrátora"
#define D_MQTT_ENABLE "MQTT aktivní"
#define D_FRIENDLY_NAME "Friendly Name"
diff --git a/sonoff/language/de-DE.h b/sonoff/language/de-DE.h
index a71b01406..335a2892f 100644
--- a/sonoff/language/de-DE.h
+++ b/sonoff/language/de-DE.h
@@ -288,6 +288,7 @@
#define D_TELEMETRY_PERIOD "Telemetrieperiode"
#define D_OTHER_PARAMETERS "Sonstige Einstellungen"
+#define D_TEMPLATE "Template"
#define D_WEB_ADMIN_PASSWORD "Passwort für Web Oberfläche"
#define D_MQTT_ENABLE "MQTT aktivieren"
#define D_FRIENDLY_NAME "Name [friendly name]"
diff --git a/sonoff/language/el-GR.h b/sonoff/language/el-GR.h
index 316421146..3775135b5 100644
--- a/sonoff/language/el-GR.h
+++ b/sonoff/language/el-GR.h
@@ -288,6 +288,7 @@
#define D_TELEMETRY_PERIOD "Περίοδος τηλεμετρίας"
#define D_OTHER_PARAMETERS "Άλλες παράμετροι"
+#define D_TEMPLATE "Template"
#define D_WEB_ADMIN_PASSWORD "Κωδικός διαχειριστή"
#define D_MQTT_ENABLE "Ενεργοποίηση MQTT"
#define D_FRIENDLY_NAME "Φιλική ονομασία"
diff --git a/sonoff/language/en-GB.h b/sonoff/language/en-GB.h
index 156117bac..587f8c0f2 100644
--- a/sonoff/language/en-GB.h
+++ b/sonoff/language/en-GB.h
@@ -288,6 +288,7 @@
#define D_TELEMETRY_PERIOD "Telemetry period"
#define D_OTHER_PARAMETERS "Other parameters"
+#define D_TEMPLATE "Template"
#define D_WEB_ADMIN_PASSWORD "Web Admin Password"
#define D_MQTT_ENABLE "MQTT enable"
#define D_FRIENDLY_NAME "Friendly Name"
diff --git a/sonoff/language/es-AR.h b/sonoff/language/es-AR.h
index 68bacd865..4a4f7d2c6 100644
--- a/sonoff/language/es-AR.h
+++ b/sonoff/language/es-AR.h
@@ -288,6 +288,7 @@
#define D_TELEMETRY_PERIOD "Período de Telemetría"
#define D_OTHER_PARAMETERS "Otros parámetros"
+#define D_TEMPLATE "Template"
#define D_WEB_ADMIN_PASSWORD "Clave Administrador Web"
#define D_MQTT_ENABLE "Habilitar MQTT"
#define D_FRIENDLY_NAME "Nombre Amigable"
diff --git a/sonoff/language/fr-FR.h b/sonoff/language/fr-FR.h
index 0e0a9ed99..4b30de366 100644
--- a/sonoff/language/fr-FR.h
+++ b/sonoff/language/fr-FR.h
@@ -288,6 +288,7 @@
#define D_TELEMETRY_PERIOD "Période télémétrie"
#define D_OTHER_PARAMETERS "Autres paramètres"
+#define D_TEMPLATE "Template"
#define D_WEB_ADMIN_PASSWORD "Mot de passe Web Admin"
#define D_MQTT_ENABLE "MQTT activé"
#define D_FRIENDLY_NAME "Surnom"
diff --git a/sonoff/language/he-HE.h b/sonoff/language/he-HE.h
index 23e2f784a..6fc333a7b 100644
--- a/sonoff/language/he-HE.h
+++ b/sonoff/language/he-HE.h
@@ -288,6 +288,7 @@
#define D_TELEMETRY_PERIOD "Telemetry period"
#define D_OTHER_PARAMETERS "פרמטרים שונים"
+#define D_TEMPLATE "Template"
#define D_WEB_ADMIN_PASSWORD "סיסמת מנהל - אתר"
#define D_MQTT_ENABLE "MQTT אפשר"
#define D_FRIENDLY_NAME "שם ידידותי"
diff --git a/sonoff/language/hu-HU.h b/sonoff/language/hu-HU.h
index 8a093ccb3..43e6a51db 100644
--- a/sonoff/language/hu-HU.h
+++ b/sonoff/language/hu-HU.h
@@ -288,6 +288,7 @@
#define D_TELEMETRY_PERIOD "Telemetria (mp.)"
#define D_OTHER_PARAMETERS "Egyéb beállítások"
+#define D_TEMPLATE "Template"
#define D_WEB_ADMIN_PASSWORD "Web admin jelszó"
#define D_MQTT_ENABLE "MQTT engedélyezése"
#define D_FRIENDLY_NAME "Név"
diff --git a/sonoff/language/it-IT.h b/sonoff/language/it-IT.h
index 411087ea3..ec1e57aba 100644
--- a/sonoff/language/it-IT.h
+++ b/sonoff/language/it-IT.h
@@ -288,6 +288,7 @@
#define D_TELEMETRY_PERIOD "Periodo Telemetria"
#define D_OTHER_PARAMETERS "Altri parametri"
+#define D_TEMPLATE "Template"
#define D_WEB_ADMIN_PASSWORD "Password Amministratore Web"
#define D_MQTT_ENABLE "Abilita MQTT"
#define D_FRIENDLY_NAME "Nome confidenziale"
diff --git a/sonoff/language/nl-NL.h b/sonoff/language/nl-NL.h
index a5de69158..a27c76720 100644
--- a/sonoff/language/nl-NL.h
+++ b/sonoff/language/nl-NL.h
@@ -288,6 +288,7 @@
#define D_TELEMETRY_PERIOD "Telemetry periode"
#define D_OTHER_PARAMETERS "Overige parameters"
+#define D_TEMPLATE "Template"
#define D_WEB_ADMIN_PASSWORD "Web Admin Wachtwoord"
#define D_MQTT_ENABLE "MQTT ingeschakeld"
#define D_FRIENDLY_NAME "Beschrijvende naam"
diff --git a/sonoff/language/pl-PL.h b/sonoff/language/pl-PL.h
index a501ac2fd..cf68a65b4 100644
--- a/sonoff/language/pl-PL.h
+++ b/sonoff/language/pl-PL.h
@@ -288,6 +288,7 @@
#define D_TELEMETRY_PERIOD "Okres telemetrii"
#define D_OTHER_PARAMETERS "Inne parametry"
+#define D_TEMPLATE "Template"
#define D_WEB_ADMIN_PASSWORD "Hasło administratora Web"
#define D_MQTT_ENABLE "MQTT aktywne"
#define D_FRIENDLY_NAME "Twoja nazwa"
diff --git a/sonoff/language/pt-BR.h b/sonoff/language/pt-BR.h
index f94c0724b..4bc29d00f 100644
--- a/sonoff/language/pt-BR.h
+++ b/sonoff/language/pt-BR.h
@@ -288,6 +288,7 @@
#define D_TELEMETRY_PERIOD "Período de telemetria"
#define D_OTHER_PARAMETERS "Outros parâmetros"
+#define D_TEMPLATE "Template"
#define D_WEB_ADMIN_PASSWORD "Senha de WEB Admin"
#define D_MQTT_ENABLE "MQTT habilitado"
#define D_FRIENDLY_NAME "Nome amigável"
diff --git a/sonoff/language/pt-PT.h b/sonoff/language/pt-PT.h
index 9f5516661..3ad605076 100644
--- a/sonoff/language/pt-PT.h
+++ b/sonoff/language/pt-PT.h
@@ -288,6 +288,7 @@
#define D_TELEMETRY_PERIOD "Periodo de Telemetria"
#define D_OTHER_PARAMETERS "Outros parametros"
+#define D_TEMPLATE "Template"
#define D_WEB_ADMIN_PASSWORD "Palavra Chave de WEB Admin"
#define D_MQTT_ENABLE "MQTT habilitado"
#define D_FRIENDLY_NAME "Nome amigável"
diff --git a/sonoff/language/ru-RU.h b/sonoff/language/ru-RU.h
index ec8ef8543..908e3f2c8 100644
--- a/sonoff/language/ru-RU.h
+++ b/sonoff/language/ru-RU.h
@@ -288,6 +288,7 @@
#define D_TELEMETRY_PERIOD "Период телеметрии"
#define D_OTHER_PARAMETERS "Параметры Прочие"
+#define D_TEMPLATE "Template"
#define D_WEB_ADMIN_PASSWORD "Пароль Web администратора"
#define D_MQTT_ENABLE "MQTT активен"
#define D_FRIENDLY_NAME "Дружественное Имя"
diff --git a/sonoff/language/sk-SK.h b/sonoff/language/sk-SK.h
index 6be3edf86..42f398a99 100644
--- a/sonoff/language/sk-SK.h
+++ b/sonoff/language/sk-SK.h
@@ -288,6 +288,7 @@
#define D_TELEMETRY_PERIOD "Interval telemetrie"
#define D_OTHER_PARAMETERS "Ostatné nastavenia"
+#define D_TEMPLATE "Template"
#define D_WEB_ADMIN_PASSWORD "Heslo Web administrátora"
#define D_MQTT_ENABLE "MQTT aktívne"
#define D_FRIENDLY_NAME "Friendly Name"
diff --git a/sonoff/language/sv-SE.h b/sonoff/language/sv-SE.h
index ec0c9bc98..088238d37 100644
--- a/sonoff/language/sv-SE.h
+++ b/sonoff/language/sv-SE.h
@@ -288,6 +288,7 @@
#define D_TELEMETRY_PERIOD "Telemetriperiod"
#define D_OTHER_PARAMETERS "Andra parametrar"
+#define D_TEMPLATE "Template"
#define D_WEB_ADMIN_PASSWORD "Webbadmin-lösenord"
#define D_MQTT_ENABLE "MQTT aktivera"
#define D_FRIENDLY_NAME "Läsbart namn"
diff --git a/sonoff/language/tr-TR.h b/sonoff/language/tr-TR.h
index f41f89f5a..73ca99fb5 100755
--- a/sonoff/language/tr-TR.h
+++ b/sonoff/language/tr-TR.h
@@ -288,6 +288,7 @@
#define D_TELEMETRY_PERIOD "Telemetri peryodu"
#define D_OTHER_PARAMETERS "Diğer parametreler"
+#define D_TEMPLATE "Template"
#define D_WEB_ADMIN_PASSWORD "Web Yönetici Şifresi"
#define D_MQTT_ENABLE "MQTT aktif"
#define D_FRIENDLY_NAME "Kullanıcı Dostu İsim"
diff --git a/sonoff/language/uk-UK.h b/sonoff/language/uk-UK.h
index c571a1593..f6c080c1e 100644
--- a/sonoff/language/uk-UK.h
+++ b/sonoff/language/uk-UK.h
@@ -288,6 +288,7 @@
#define D_TELEMETRY_PERIOD "Період телеметрії"
#define D_OTHER_PARAMETERS "Параметри Інше"
+#define D_TEMPLATE "Template"
#define D_WEB_ADMIN_PASSWORD "Гасло Web адміністратора"
#define D_MQTT_ENABLE "MQTT активний"
#define D_FRIENDLY_NAME "Дружнє Ім'я"
diff --git a/sonoff/language/zh-CN.h b/sonoff/language/zh-CN.h
index 50804d307..646db7a91 100644
--- a/sonoff/language/zh-CN.h
+++ b/sonoff/language/zh-CN.h
@@ -288,6 +288,7 @@
#define D_TELEMETRY_PERIOD "上报周期"
#define D_OTHER_PARAMETERS "其他设置"
+#define D_TEMPLATE "Template"
#define D_WEB_ADMIN_PASSWORD "WEB 管理密码"
#define D_MQTT_ENABLE "启用MQTT"
#define D_FRIENDLY_NAME "昵称"
diff --git a/sonoff/language/zh-TW.h b/sonoff/language/zh-TW.h
index 46527a789..22bec6b99 100644
--- a/sonoff/language/zh-TW.h
+++ b/sonoff/language/zh-TW.h
@@ -288,6 +288,7 @@
#define D_TELEMETRY_PERIOD "上報周期"
#define D_OTHER_PARAMETERS "其他設置"
+#define D_TEMPLATE "Template"
#define D_WEB_ADMIN_PASSWORD "WEB管理密碼"
#define D_MQTT_ENABLE "啟用MQTT"
#define D_FRIENDLY_NAME "昵稱"
diff --git a/sonoff/sonoff.ino b/sonoff/sonoff.ino
index f496b82e6..34c422d20 100755
--- a/sonoff/sonoff.ino
+++ b/sonoff/sonoff.ino
@@ -952,7 +952,7 @@ void MqttDataHandler(char* topic, uint8_t* data, unsigned int data_len)
mqtt_data[0] = '\0';
}
else if (CMND_TEMPLATE == command_code) {
- // {"NAME":"Generic","GPIO":[17,254,29,254,7,254,254,254,138,254,139,254,254],"FLAG":1,"TYPE":255}
+ // {"NAME":"Generic","GPIO":[17,254,29,254,7,254,254,254,138,254,139,254,254],"FLAG":1,"BASE":255}
bool error = false;
if (!strstr(dataBuf, "{")) { // If no JSON it must be parameter
bool update = false;
@@ -1021,16 +1021,7 @@ void MqttDataHandler(char* topic, uint8_t* data, unsigned int data_len)
if (USER_MODULE == Settings.module) { restart_flag = 2; }
}
}
- if (!error) {
- snprintf_P(mqtt_data, sizeof(mqtt_data), PSTR("{\"" D_JSON_NAME "\":\"%s\",\"" D_JSON_GPIO "\":["), Settings.user_template.name);
- for (uint8_t i = 0; i < sizeof(Settings.user_template.gp); i++) {
- snprintf_P(mqtt_data, sizeof(mqtt_data), PSTR("%s%s%d"), mqtt_data, (i>0)?",":"", Settings.user_template.gp.io[i]);
- }
-// snprintf_P(mqtt_data, sizeof(mqtt_data), PSTR("%s],\"" D_JSON_FLAG "\":%d,\"" D_JSON_BASE "\":\"%d (%s)\"}"),
-// mqtt_data, Settings.user_template.flag, Settings.user_template_base +1, AnyModuleName(Settings.user_template_base).c_str());
- snprintf_P(mqtt_data, sizeof(mqtt_data), PSTR("%s],\"" D_JSON_FLAG "\":%d,\"" D_JSON_BASE "\":%d}"),
- mqtt_data, Settings.user_template.flag, Settings.user_template_base +1);
- }
+ if (!error) { TemplateJson(); }
}
else if ((CMND_PWM == command_code) && pwm_present && (index > 0) && (index <= MAX_PWMS)) {
if ((payload >= 0) && (payload <= Settings.pwm_range) && (pin[GPIO_PWM1 + index -1] < 99)) {
diff --git a/sonoff/support.ino b/sonoff/support.ino
index d915832aa..c728d28eb 100644
--- a/sonoff/support.ino
+++ b/sonoff/support.ino
@@ -305,27 +305,6 @@ char* UpperCase_P(char* dest, const char* source)
return dest;
}
-/*
-char* LTrim(char* p)
-{
- while ((*p != '\0') && (isblank(*p))) {
- p++; // Trim leading spaces
- }
- return p;
-}
-
-char* RTrim(char* p)
-{
- char* q = p + strlen(p) -1;
- while ((q >= p) && (isblank(*q))) {
- q--; // Trim trailing spaces
- }
- q++;
- *q = '\0';
- return p;
-}
-*/
-
char* Trim(char* p)
{
while ((*p != '\0') && isblank(*p)) { p++; } // Trim leading spaces
@@ -505,162 +484,6 @@ String PressureUnit(void)
return (Settings.flag.pressure_conversion) ? String(D_UNIT_MILLIMETER_MERCURY) : String(D_UNIT_PRESSURE);
}
-String AnyModuleName(uint8_t index)
-{
- if (USER_MODULE == index) {
- return String(Settings.user_template.name);
- } else {
- return FPSTR(kModules[index].name);
- }
-}
-
-String ModuleName()
-{
- return AnyModuleName(Settings.module);
-}
-
-void ModuleGpios(myio *gp)
-{
- uint8_t *dest = (uint8_t *)gp;
- memset(dest, GPIO_NONE, sizeof(myio));
-
- uint8_t src[sizeof(mycfgio)];
- if (USER_MODULE == Settings.module) {
-// src = Settings.user_template.gp;
- memcpy(&src, &Settings.user_template.gp, sizeof(mycfgio));
- } else {
- memcpy_P(&src, &kModules[Settings.module].gp, sizeof(mycfgio));
- }
- // 11 85 00 85 85 00 00 00 15 38 85 00 00 81
-
-// AddLogBuffer(LOG_LEVEL_DEBUG, (uint8_t *)&src, sizeof(mycfgio));
-
- uint8_t j = 0;
- for (uint8_t i = 0; i < sizeof(mycfgio); i++) {
- if (6 == i) { j = 9; }
- if (8 == i) { j = 12; }
- dest[j] = src[i];
- j++;
- }
- // 11 85 00 85 85 00 00 00 00 00 00 00 15 38 85 00 00 81
-
-// AddLogBuffer(LOG_LEVEL_DEBUG, (uint8_t *)gp, sizeof(myio));
-}
-
-gpio_flag ModuleFlag()
-{
- gpio_flag flag;
-
- if (USER_MODULE == Settings.module) {
- flag = Settings.user_template.flag;
- } else {
- memcpy_P(&flag, &kModules[Settings.module].flag, sizeof(gpio_flag));
- }
-
- return flag;
-}
-
-void ModuleDefault(uint8_t module)
-{
- if (USER_MODULE == module) { module = WEMOS; } // Generic
- Settings.user_template_base = module;
- memcpy_P(&Settings.user_template, &kModules[module], sizeof(mytmplt));
-}
-
-void SetModuleType()
-{
- my_module_type = (USER_MODULE == Settings.module) ? Settings.user_template_base : Settings.module;
-}
-
-uint8_t ValidPin(uint8_t pin, uint8_t gpio)
-{
- uint8_t result = gpio;
- if ((pin > 5) && (pin < 12)) {
- result = GPIO_NONE; // Disable all flash pins
- }
- if (Settings.flag3.user_esp8285_enable) {
- if ((pin == 9) || (pin == 10)) {
- result = gpio; // Allow optional flash pins
- }
- }
- return result;
-}
-
-bool ValidGPIO(uint8_t pin, uint8_t gpio)
-{
- bool result = false;
-
- if (USER_MODULE == Settings.module) {
- result = (ValidPin(pin, gpio) > GPIO_NONE); // Allow any pin
- } else {
- result = (GPIO_USER == ValidPin(pin, gpio)); // Only allow GPIO_USER pins
- }
- return result;
-}
-
-bool GetUsedInModule(uint8_t val, uint8_t *arr)
-{
- int offset = 0;
-
- if (USER_MODULE == Settings.module) { return false; }
-
- if (!val) { return false; } // None
-
- if ((val >= GPIO_KEY1) && (val < GPIO_KEY1 + MAX_KEYS)) {
- offset = (GPIO_KEY1_NP - GPIO_KEY1);
- }
- if ((val >= GPIO_KEY1_NP) && (val < GPIO_KEY1_NP + MAX_KEYS)) {
- offset = -(GPIO_KEY1_NP - GPIO_KEY1);
- }
- if ((val >= GPIO_KEY1_INV) && (val < GPIO_KEY1_INV + MAX_KEYS)) {
- offset = -(GPIO_KEY1_INV - GPIO_KEY1);
- }
- if ((val >= GPIO_KEY1_INV_NP) && (val < GPIO_KEY1_INV_NP + MAX_KEYS)) {
- offset = -(GPIO_KEY1_INV_NP - GPIO_KEY1);
- }
-
- if ((val >= GPIO_SWT1) && (val < GPIO_SWT1 + MAX_SWITCHES)) {
- offset = (GPIO_SWT1_NP - GPIO_SWT1);
- }
- if ((val >= GPIO_SWT1_NP) && (val < GPIO_SWT1_NP + MAX_SWITCHES)) {
- offset = -(GPIO_SWT1_NP - GPIO_SWT1);
- }
-
- if ((val >= GPIO_REL1) && (val < GPIO_REL1 + MAX_RELAYS)) {
- offset = (GPIO_REL1_INV - GPIO_REL1);
- }
- if ((val >= GPIO_REL1_INV) && (val < GPIO_REL1_INV + MAX_RELAYS)) {
- offset = -(GPIO_REL1_INV - GPIO_REL1);
- }
-
- if ((val >= GPIO_LED1) && (val < GPIO_LED1 + MAX_LEDS)) {
- offset = (GPIO_LED1_INV - GPIO_LED1);
- }
- if ((val >= GPIO_LED1_INV) && (val < GPIO_LED1_INV + MAX_LEDS)) {
- offset = -(GPIO_LED1_INV - GPIO_LED1);
- }
-
- if ((val >= GPIO_PWM1) && (val < GPIO_PWM1 + MAX_PWMS)) {
- offset = (GPIO_PWM1_INV - GPIO_PWM1);
- }
- if ((val >= GPIO_PWM1_INV) && (val < GPIO_PWM1_INV + MAX_PWMS)) {
- offset = -(GPIO_PWM1_INV - GPIO_PWM1);
- }
-
- if ((val >= GPIO_CNTR1) && (val < GPIO_CNTR1 + MAX_COUNTERS)) {
- offset = (GPIO_CNTR1_NP - GPIO_CNTR1);
- }
- if ((val >= GPIO_CNTR1_NP) && (val < GPIO_CNTR1_NP + MAX_COUNTERS)) {
- offset = -(GPIO_CNTR1_NP - GPIO_CNTR1);
- }
-
- for (uint8_t i = 0; i < MAX_GPIO_PIN; i++) {
- if (arr[i] == val) { return true; }
- if (arr[i] == val + offset) { return true; }
- }
- return false;
-}
-
void SetGlobalValues(float temperature, float humidity)
{
global_update = uptime;
@@ -872,6 +695,178 @@ void ShowSource(int source)
}
}
+/*********************************************************************************************\
+ * GPIO Module and Template management
+\*********************************************************************************************/
+
+String AnyModuleName(uint8_t index)
+{
+ if (USER_MODULE == index) {
+ return String(Settings.user_template.name);
+ } else {
+ return FPSTR(kModules[index].name);
+ }
+}
+
+String ModuleName()
+{
+ return AnyModuleName(Settings.module);
+}
+
+void ModuleGpios(myio *gp)
+{
+ uint8_t *dest = (uint8_t *)gp;
+ memset(dest, GPIO_NONE, sizeof(myio));
+
+ uint8_t src[sizeof(mycfgio)];
+ if (USER_MODULE == Settings.module) {
+// src = Settings.user_template.gp;
+ memcpy(&src, &Settings.user_template.gp, sizeof(mycfgio));
+ } else {
+ memcpy_P(&src, &kModules[Settings.module].gp, sizeof(mycfgio));
+ }
+ // 11 85 00 85 85 00 00 00 15 38 85 00 00 81
+
+// AddLogBuffer(LOG_LEVEL_DEBUG, (uint8_t *)&src, sizeof(mycfgio));
+
+ uint8_t j = 0;
+ for (uint8_t i = 0; i < sizeof(mycfgio); i++) {
+ if (6 == i) { j = 9; }
+ if (8 == i) { j = 12; }
+ dest[j] = src[i];
+ j++;
+ }
+ // 11 85 00 85 85 00 00 00 00 00 00 00 15 38 85 00 00 81
+
+// AddLogBuffer(LOG_LEVEL_DEBUG, (uint8_t *)gp, sizeof(myio));
+}
+
+gpio_flag ModuleFlag()
+{
+ gpio_flag flag;
+
+ if (USER_MODULE == Settings.module) {
+ flag = Settings.user_template.flag;
+ } else {
+ memcpy_P(&flag, &kModules[Settings.module].flag, sizeof(gpio_flag));
+ }
+
+ return flag;
+}
+
+void ModuleDefault(uint8_t module)
+{
+ if (USER_MODULE == module) { module = WEMOS; } // Generic
+ Settings.user_template_base = module;
+ memcpy_P(&Settings.user_template, &kModules[module], sizeof(mytmplt));
+}
+
+void SetModuleType()
+{
+ my_module_type = (USER_MODULE == Settings.module) ? Settings.user_template_base : Settings.module;
+}
+
+uint8_t ValidPin(uint8_t pin, uint8_t gpio)
+{
+ uint8_t result = gpio;
+ if ((pin > 5) && (pin < 12)) {
+ result = GPIO_NONE; // Disable all flash pins
+ }
+ if (Settings.flag3.user_esp8285_enable) {
+ if ((pin == 9) || (pin == 10)) {
+ result = gpio; // Allow optional flash pins
+ }
+ }
+ return result;
+}
+
+bool ValidGPIO(uint8_t pin, uint8_t gpio)
+{
+ bool result = false;
+
+ if (USER_MODULE == Settings.module) {
+ result = (ValidPin(pin, gpio) > GPIO_NONE); // Allow any pin
+ } else {
+ result = (GPIO_USER == ValidPin(pin, gpio)); // Only allow GPIO_USER pins
+ }
+ return result;
+}
+
+bool GetUsedInModule(uint8_t val, uint8_t *arr)
+{
+ int offset = 0;
+
+ if (USER_MODULE == Settings.module) { return false; }
+
+ if (!val) { return false; } // None
+
+ if ((val >= GPIO_KEY1) && (val < GPIO_KEY1 + MAX_KEYS)) {
+ offset = (GPIO_KEY1_NP - GPIO_KEY1);
+ }
+ if ((val >= GPIO_KEY1_NP) && (val < GPIO_KEY1_NP + MAX_KEYS)) {
+ offset = -(GPIO_KEY1_NP - GPIO_KEY1);
+ }
+ if ((val >= GPIO_KEY1_INV) && (val < GPIO_KEY1_INV + MAX_KEYS)) {
+ offset = -(GPIO_KEY1_INV - GPIO_KEY1);
+ }
+ if ((val >= GPIO_KEY1_INV_NP) && (val < GPIO_KEY1_INV_NP + MAX_KEYS)) {
+ offset = -(GPIO_KEY1_INV_NP - GPIO_KEY1);
+ }
+
+ if ((val >= GPIO_SWT1) && (val < GPIO_SWT1 + MAX_SWITCHES)) {
+ offset = (GPIO_SWT1_NP - GPIO_SWT1);
+ }
+ if ((val >= GPIO_SWT1_NP) && (val < GPIO_SWT1_NP + MAX_SWITCHES)) {
+ offset = -(GPIO_SWT1_NP - GPIO_SWT1);
+ }
+
+ if ((val >= GPIO_REL1) && (val < GPIO_REL1 + MAX_RELAYS)) {
+ offset = (GPIO_REL1_INV - GPIO_REL1);
+ }
+ if ((val >= GPIO_REL1_INV) && (val < GPIO_REL1_INV + MAX_RELAYS)) {
+ offset = -(GPIO_REL1_INV - GPIO_REL1);
+ }
+
+ if ((val >= GPIO_LED1) && (val < GPIO_LED1 + MAX_LEDS)) {
+ offset = (GPIO_LED1_INV - GPIO_LED1);
+ }
+ if ((val >= GPIO_LED1_INV) && (val < GPIO_LED1_INV + MAX_LEDS)) {
+ offset = -(GPIO_LED1_INV - GPIO_LED1);
+ }
+
+ if ((val >= GPIO_PWM1) && (val < GPIO_PWM1 + MAX_PWMS)) {
+ offset = (GPIO_PWM1_INV - GPIO_PWM1);
+ }
+ if ((val >= GPIO_PWM1_INV) && (val < GPIO_PWM1_INV + MAX_PWMS)) {
+ offset = -(GPIO_PWM1_INV - GPIO_PWM1);
+ }
+
+ if ((val >= GPIO_CNTR1) && (val < GPIO_CNTR1 + MAX_COUNTERS)) {
+ offset = (GPIO_CNTR1_NP - GPIO_CNTR1);
+ }
+ if ((val >= GPIO_CNTR1_NP) && (val < GPIO_CNTR1_NP + MAX_COUNTERS)) {
+ offset = -(GPIO_CNTR1_NP - GPIO_CNTR1);
+ }
+
+ for (uint8_t i = 0; i < MAX_GPIO_PIN; i++) {
+ if (arr[i] == val) { return true; }
+ if (arr[i] == val + offset) { return true; }
+ }
+ return false;
+}
+
+void TemplateJson()
+{
+ snprintf_P(mqtt_data, sizeof(mqtt_data), PSTR("{\"" D_JSON_NAME "\":\"%s\",\"" D_JSON_GPIO "\":["), Settings.user_template.name);
+ for (uint8_t i = 0; i < sizeof(Settings.user_template.gp); i++) {
+ snprintf_P(mqtt_data, sizeof(mqtt_data), PSTR("%s%s%d"), mqtt_data, (i>0)?",":"", Settings.user_template.gp.io[i]);
+ }
+// snprintf_P(mqtt_data, sizeof(mqtt_data), PSTR("%s],\"" D_JSON_FLAG "\":%d,\"" D_JSON_BASE "\":\"%d (%s)\"}"),
+// mqtt_data, Settings.user_template.flag, Settings.user_template_base +1, AnyModuleName(Settings.user_template_base).c_str());
+ snprintf_P(mqtt_data, sizeof(mqtt_data), PSTR("%s],\"" D_JSON_FLAG "\":%d,\"" D_JSON_BASE "\":%d}"),
+ mqtt_data, Settings.user_template.flag, Settings.user_template_base +1);
+}
+
/*********************************************************************************************\
* Sleep aware time scheduler functions borrowed from ESPEasy
\*********************************************************************************************/
diff --git a/sonoff/xdrv_01_webserver.ino b/sonoff/xdrv_01_webserver.ino
index 756805425..8001e507e 100644
--- a/sonoff/xdrv_01_webserver.ino
+++ b/sonoff/xdrv_01_webserver.ino
@@ -289,7 +289,7 @@ const char HTTP_FORM_LOG3[] PROGMEM =
"
" D_TELEMETRY_PERIOD " (" STR(TELE_PERIOD) ")
";
const char HTTP_FORM_OTHER[] PROGMEM =
"