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 = "
 " D_OTHER_PARAMETERS " 
" -// "" + "
" D_TEMPLATE "

" "
" D_WEB_ADMIN_PASSWORD "

" "
" D_MQTT_ENABLE "
"; const char HTTP_FORM_OTHER2[] PROGMEM = @@ -309,7 +309,7 @@ const char HTTP_FORM_UPG[] PROGMEM = "
" "
 " D_UPGRADE_BY_WEBSERVER " " "" - "
" D_OTA_URL "

" + "
" D_OTA_URL "

" "
" "


" "
 " D_UPGRADE_BY_FILE_UPLOAD " "; @@ -1164,6 +1164,8 @@ void HandleOtherConfiguration(void) page.replace(F("{v}"), FPSTR(S_CONFIGURE_OTHER)); page += FPSTR(HTTP_HEAD_STYLE); page += FPSTR(HTTP_FORM_OTHER); + TemplateJson(); + page.replace(F("{t1"), mqtt_data); page.replace(F("{r1"), (Settings.flag.mqtt_enabled) ? F(" checked") : F("")); uint8_t maxfn = (devices_present > MAX_FRIENDLYNAMES) ? MAX_FRIENDLYNAMES : (!devices_present) ? 1 : devices_present; @@ -1194,7 +1196,7 @@ void HandleOtherConfiguration(void) void OtherSaveSettings(void) { - char tmp[100]; + char tmp[128]; char stemp[TOPSZ]; char stemp2[TOPSZ]; @@ -1214,6 +1216,12 @@ void OtherSaveSettings(void) snprintf_P(log_data, sizeof(log_data), PSTR("%s%s %s"), log_data, (i) ? "," : "", Settings.friendlyname[i]); } AddLog(LOG_LEVEL_INFO); + WebGetArg("t1", tmp, sizeof(tmp)); + if (strlen(tmp)) { // {"NAME":"12345678901234","GPIO":[255,255,255,255,255,255,255,255,255,255,255,255,255],"FLAG":255,"BASE":255} + char svalue[128]; + snprintf_P(svalue, sizeof(svalue), PSTR(D_CMND_TEMPLATE " %s"), tmp); + ExecuteWebCommand(svalue, SRC_WEBGUI); + } } /*-------------------------------------------------------------------------------------------*/