diff --git a/CMakeLists.txt b/CMakeLists.txt index c8a30b3..68ba6b3 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -11,6 +11,7 @@ idf_component_register( "src/WiFiTransport.c" "src/GSMTransport.c" "src/ETHTransport.c" + "src/LoRaWANTransport.c" "src/SNTP.c" "src/MQTT.c" "src/MQTTSysHandler.c" @@ -33,4 +34,5 @@ idf_component_register( esp_https_ota app_update jReadWrite + ttn-esp32 ) \ No newline at end of file diff --git a/Kconfig b/Kconfig index 7b86cb0..327f2d0 100644 --- a/Kconfig +++ b/Kconfig @@ -420,8 +420,6 @@ menu "WebGUIApp" endif endmenu - - menu "GPRS settings" config WEBGUIAPP_GPRS_ENABLE bool "Enabled GPRS PPP interface" @@ -576,7 +574,49 @@ menu "WebGUIApp" endif endmenu - + + menu "LoRaWAN settings" + config WEBGUIAPP_LORAWAN_ENABLE + bool "Enabled LoRaWAN interface" + default n + help + Set enabled LoRaWAN module + + if WEBGUIAPP_LORAWAN_ENABLE + config LORA_SPI_CS_GPIO + int "SPI CS GPIO number for LoRa module" + range 0 33 + default 4 + help + Set the GPIO number used by SPI chip select for LoRa module. + config LORA_DIO0_GPIO + int "DIO0 GPIO number for LoRa module" + range 0 39 + default 34 + help + Set the GPIO number used by . + + config LORA_DIO1_GPIO + int "DIO1 GPI1 number for LoRa module" + range 0 39 + default 35 + help + Set the GPIO number used by . + config LORA_APP_ID + string "Default LoRaWAN Application ID" + default "BBBBBBBBBBBBBBBB" + help + Set default application ID for LoRaWAN network + + config LORA_APP_KEY + string "Default LoRaWAN Application key" + default "CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC" + help + Set default application key for LoRaWAN network + endif + endmenu + + menu "MQTT settings" config WEBGUIAPP_MQTT_ENABLE bool "Enabled MQTT transport" diff --git a/include/NetTransport.h b/include/NetTransport.h index 0f8ba5b..44d828e 100644 --- a/include/NetTransport.h +++ b/include/NetTransport.h @@ -46,18 +46,25 @@ typedef struct //#define DEFAULT_FALLBACK_DNS "8.8.8.8" - QueueHandle_t MQTT1MessagesQueueHandle; QueueHandle_t MQTT2MessagesQueueHandle; - EventGroupHandle_t transport_event_group; +typedef enum +{ + MQTT = 0, +} transport_data_type; +typedef struct +{ + transport_data_type dType; + char *raw_data_ptr; + int data_length; +} net_transport_data_t; void StartTimeGet(void); - void WiFiAPStart(void); void WiFiSTAStart(void); void EthStart(void); diff --git a/include/SystemConfiguration.h b/include/SystemConfiguration.h index ad23f99..76354c0 100644 --- a/include/SystemConfiguration.h +++ b/include/SystemConfiguration.h @@ -76,11 +76,6 @@ #define DEFAULT_DNS2 "4.4.8.8" #define DEFAULT_DNS3 "1.1.1.1" - /*GSM DEFAULT SETTINGS*/ -#define DEFAULT_GSM_GLOBAL_ENABLED true - - -//#define LOCK_RELAY_ON // Application-dependent structure used to contain address information @@ -240,6 +235,27 @@ } gsmSettings; #endif + struct + { + char DevEui[8]; + char AppEui[8]; + char AppKey[16]; + + struct + { + char b0 :1; + char b1 :1; + char b2 :1; + char b3 :1; + char b4 :1; + char b5 :1; + char b6 :1; + char bIsLoRaWANEnabled :1; + } Flags1; // Flag structure + + } lorawanSettings; + + } SYS_CONFIG; esp_err_t ReadNVSSysConfig(SYS_CONFIG *SysConf); diff --git a/src/HTTPPrintSystem.c b/src/HTTPPrintSystem.c index ae421da..5c5aeae 100644 --- a/src/HTTPPrintSystem.c +++ b/src/HTTPPrintSystem.c @@ -461,6 +461,41 @@ void HTTPPrint_gsmmac(char *VarData, void *arg) } #endif + +#ifdef CONFIG_WEBGUIAPP_LORAWAN_ENABLE +/*LORAWAN settings*/ +void HTTPPrint_lren(char *VarData, void *arg) +{ + PrintCheckbox(VarData, arg, GetSysConf()->lorawanSettings.Flags1.bIsLoRaWANEnabled); +} +void HTTPPrint_lrstat(char *VarData, void *arg) +{ + if (isLORAConnected()) + snprintf(VarData, MAX_DYNVAR_LENGTH, "CONNECTED"); + else + snprintf(VarData, MAX_DYNVAR_LENGTH, "DISCONNECTED"); +} +void HTTPPrint_lrdvid(char *VarData, void *arg) +{ + uint8_t temp[16]; + BytesToStr((unsigned char*) &GetSysConf()->lorawanSettings.DevEui, temp, 8); + snprintf(VarData, MAX_DYNVAR_LENGTH, "%s", temp); +} + +void HTTPPrint_lrapid(char *VarData, void *arg) +{ + uint8_t temp[16]; + BytesToStr((unsigned char*) &GetSysConf()->lorawanSettings.AppEui, temp, 8); + snprintf(VarData, MAX_DYNVAR_LENGTH, "%s", temp); +} +void HTTPPrint_lrapkey(char *VarData, void *arg) +{ + uint8_t temp[32]; + BytesToStr((unsigned char*) &GetSysConf()->lorawanSettings.AppKey, temp, 16); + snprintf(VarData, MAX_DYNVAR_LENGTH, "%s", temp); +} +#endif + #if CONFIG_WEBGUIAPP_MQTT_ENABLE void HTTPPrint_mqen1(char *VarData, void *arg) { @@ -564,97 +599,116 @@ static void HTTPPrint_mqtt2st(char *VarData, void *arg) snprintf(VarData, MAX_DYNVAR_LENGTH, "DISCONNECTED"); } - /* Pass build configuration to web interface*/ -static void HTTPPrint_ifc_gprs(char *VarData, void *arg) +static void HTTPPrint_hide_gprs(char *VarData, void *arg) { #if CONFIG_WEBGUIAPP_GPRS_ENABLE - snprintf(VarData, MAX_DYNVAR_LENGTH, "1"); + snprintf(VarData, MAX_DYNVAR_LENGTH, " "); #else - snprintf(VarData, MAX_DYNVAR_LENGTH, "0"); + snprintf(VarData, MAX_DYNVAR_LENGTH, "hide"); #endif } -static void HTTPPrint_ifc_mq2(char *VarData, void *arg) +static void HTTPPrint_hide_mqtt1(char *VarData, void *arg) +{ + snprintf(VarData, MAX_DYNVAR_LENGTH, " "); +} + +static void HTTPPrint_hide_mqtt2(char *VarData, void *arg) { #if CONFIG_WEBGUIAPP_MQTT_CLIENTS_NUM == 2 - snprintf(VarData, MAX_DYNVAR_LENGTH, "1"); + snprintf(VarData, MAX_DYNVAR_LENGTH, " "); #else - snprintf(VarData, MAX_DYNVAR_LENGTH, "0"); + snprintf(VarData, MAX_DYNVAR_LENGTH, "hide"); #endif } +static void HTTPPrint_hide_lora(char *VarData, void *arg) +{ + snprintf(VarData, MAX_DYNVAR_LENGTH, " "); +} + +static void HTTPPrint_hide_eth(char *VarData, void *arg) +{ + snprintf(VarData, MAX_DYNVAR_LENGTH, " "); +} + +static void HTTPPrint_hide_wifi(char *VarData, void *arg) +{ + snprintf(VarData, MAX_DYNVAR_LENGTH, " "); +} + static void HTTPPrint_testvariable(char *VarData, void *arg) { -static int counter = 1; -snprintf(VarData, MAX_DYNVAR_LENGTH, "[Long extended dynamic variable number %d]", counter++); + static int counter = 1; + snprintf(VarData, MAX_DYNVAR_LENGTH, "[Long extended dynamic variable number %d]", counter++); } //Default string if not found handler static void HTTPPrint_DEF(char *VarData, void *arg) { -snprintf(VarData, MAX_DYNVAR_LENGTH, "#DEF"); + snprintf(VarData, MAX_DYNVAR_LENGTH, "#DEF"); } dyn_var_handler_t HANDLERS_ARRAY[] = { - /*Ststem settings*/ - { "name", sizeof("name") - 1, &HTTPPrint_name }, - { "dname", sizeof("dname") - 1, &HTTPPrint_dname }, - { "login", sizeof("login") - 1, &HTTPPrint_login }, - { "pass", sizeof("pass") - 1, &HTTPPrint_pass }, - { "ota", sizeof("ota") - 1, &HTTPPrint_ota }, - { "fver", sizeof("fver") - 1, &HTTPPrint_fver }, - { "idfver", sizeof("idfver") - 1, &HTTPPrint_idfver }, - { "builddate", sizeof("builddate") - 1, &HTTPPrint_builddate }, - { "serial", sizeof("serial") - 1, &HTTPPrint_serial }, - { "serial10", sizeof("serial10") - 1, &HTTPPrint_serial10 }, - { "otaurl", sizeof("otaurl") - 1, &HTTPPrint_otaurl }, + /*Ststem settings*/ + { "name", sizeof("name") - 1, &HTTPPrint_name }, + { "dname", sizeof("dname") - 1, &HTTPPrint_dname }, + { "login", sizeof("login") - 1, &HTTPPrint_login }, + { "pass", sizeof("pass") - 1, &HTTPPrint_pass }, + { "ota", sizeof("ota") - 1, &HTTPPrint_ota }, + { "fver", sizeof("fver") - 1, &HTTPPrint_fver }, + { "idfver", sizeof("idfver") - 1, &HTTPPrint_idfver }, + { "builddate", sizeof("builddate") - 1, &HTTPPrint_builddate }, + { "serial", sizeof("serial") - 1, &HTTPPrint_serial }, + { "serial10", sizeof("serial10") - 1, &HTTPPrint_serial10 }, + { "otaurl", sizeof("otaurl") - 1, &HTTPPrint_otaurl }, - { "time", sizeof("time") - 1, &HTTPPrint_time }, - { "uptime", sizeof("uptime") - 1, &HTTPPrint_uptime }, - { "tshift", sizeof("tshift") - 1, &HTTPPrint_tshift }, - { "tz", sizeof("tz") - 1, &HTTPPrint_tz }, + { "time", sizeof("time") - 1, &HTTPPrint_time }, + { "uptime", sizeof("uptime") - 1, &HTTPPrint_uptime }, + { "tshift", sizeof("tshift") - 1, &HTTPPrint_tshift }, + { "tz", sizeof("tz") - 1, &HTTPPrint_tz }, - { "defadp", sizeof("defadp") - 1, &HTTPPrint_defadp }, - { "wlev", sizeof("wlev") - 1, &HTTPPrint_wlev }, + { "defadp", sizeof("defadp") - 1, &HTTPPrint_defadp }, + { "wlev", sizeof("wlev") - 1, &HTTPPrint_wlev }, #if CONFIG_WEBGUIAPP_WIFI_ENABLE - /*WiFi network*/ - { "wfen", sizeof("wfen") - 1, &HTTPPrint_wfen }, - { "wfstat", sizeof("wfstat") - 1, &HTTPPrint_wfstat }, - { "cln", sizeof("cln") - 1, &HTTPPrint_cln }, - { "apn", sizeof("apn") - 1, &HTTPPrint_apn }, - { "ssidap", sizeof("ssidap") - 1, &HTTPPrint_ssidap }, - { "wkeyap", sizeof("wkeyap") - 1, &HTTPPrint_wkeyap }, - { "ipap", sizeof("ipap") - 1, &HTTPPrint_ipap }, - { "ssid", sizeof("ssid") - 1, &HTTPPrint_ssid }, - { "wkey", sizeof("wkey") - 1, &HTTPPrint_wkey }, - { "cbdh", sizeof("cbdh") - 1, &HTTPPrint_cbdh }, - { "ip", sizeof("ip") - 1, &HTTPPrint_ip }, - { "msk", sizeof("msk") - 1, &HTTPPrint_msk }, - { "gate", sizeof("gate") - 1, &HTTPPrint_gate }, - { "dns", sizeof("dns") - 1, &HTTPPrint_dns }, - { "dns2", sizeof("dns2") - 1, &HTTPPrint_dns2 }, - { "dns3", sizeof("dns3") - 1, &HTTPPrint_dns3 }, - { "macadr", sizeof("macadr") - 1, &HTTPPrint_macadr }, - { "apmacadr", sizeof("apmacadr") - 1, &HTTPPrint_apmacadr }, - #endif + /*WiFi network*/ + { "wfen", sizeof("wfen") - 1, &HTTPPrint_wfen }, + { "wfstat", sizeof("wfstat") - 1, &HTTPPrint_wfstat }, + { "cln", sizeof("cln") - 1, &HTTPPrint_cln }, + { "apn", sizeof("apn") - 1, &HTTPPrint_apn }, + { "ssidap", sizeof("ssidap") - 1, &HTTPPrint_ssidap }, + { "wkeyap", sizeof("wkeyap") - 1, &HTTPPrint_wkeyap }, + { "ipap", sizeof("ipap") - 1, &HTTPPrint_ipap }, + { "ssid", sizeof("ssid") - 1, &HTTPPrint_ssid }, + { "wkey", sizeof("wkey") - 1, &HTTPPrint_wkey }, + { "cbdh", sizeof("cbdh") - 1, &HTTPPrint_cbdh }, + { "ip", sizeof("ip") - 1, &HTTPPrint_ip }, + { "msk", sizeof("msk") - 1, &HTTPPrint_msk }, + { "gate", sizeof("gate") - 1, &HTTPPrint_gate }, + { "dns", sizeof("dns") - 1, &HTTPPrint_dns }, + { "dns2", sizeof("dns2") - 1, &HTTPPrint_dns2 }, + { "dns3", sizeof("dns3") - 1, &HTTPPrint_dns3 }, + { "macadr", sizeof("macadr") - 1, &HTTPPrint_macadr }, + { "apmacadr", sizeof("apmacadr") - 1, &HTTPPrint_apmacadr }, + #endif #if CONFIG_WEBGUIAPP_ETHERNET_ENABLE - /*ETHERNET network*/ - { "ethen", sizeof("ethen") - 1, &HTTPPrint_ethen }, - { "ecbdh", sizeof("ecbdh") - 1, &HTTPPrint_ecbdh }, - { "ethstat", sizeof("ethstat") - 1, &HTTPPrint_ethstat }, - { "eip", sizeof("eip") - 1, &HTTPPrint_eip }, - { "emsk", sizeof("emsk") - 1, &HTTPPrint_emsk }, - { "egate", sizeof("egate") - 1, &HTTPPrint_egate }, - { "edns", sizeof("edns") - 1, &HTTPPrint_edns }, - { "bkedns", sizeof("bkedns") - 1, &HTTPPrint_bkedns }, - { "fledns", sizeof("fledns") - 1, &HTTPPrint_fledns }, - { "emacadr", sizeof("emacadr") - 1, &HTTPPrint_emacadr }, - #endif + /*ETHERNET network*/ + { "ethen", sizeof("ethen") - 1, &HTTPPrint_ethen }, + { "ecbdh", sizeof("ecbdh") - 1, &HTTPPrint_ecbdh }, + { "ethstat", sizeof("ethstat") - 1, &HTTPPrint_ethstat }, + { "eip", sizeof("eip") - 1, &HTTPPrint_eip }, + { "emsk", sizeof("emsk") - 1, &HTTPPrint_emsk }, + { "egate", sizeof("egate") - 1, &HTTPPrint_egate }, + { "edns", sizeof("edns") - 1, &HTTPPrint_edns }, + { "bkedns", sizeof("bkedns") - 1, &HTTPPrint_bkedns }, + { "fledns", sizeof("fledns") - 1, &HTTPPrint_fledns }, + { "emacadr", sizeof("emacadr") - 1, &HTTPPrint_emacadr }, + #endif - { "gsmstat", sizeof("gsmstat") - 1, &HTTPPrint_gsmstat }, + { "gsmstat", sizeof("gsmstat") - 1, &HTTPPrint_gsmstat }, #if CONFIG_WEBGUIAPP_GPRS_ENABLE /*GSM modem*/ @@ -673,17 +727,25 @@ dyn_var_handler_t HANDLERS_ARRAY[] = { { "gsmmac", sizeof("gsmmac") - 1, &HTTPPrint_gsmmac }, #endif +#ifdef CONFIG_WEBGUIAPP_LORAWAN_ENABLE + /*LORAWAN settings*/ + { "lren", sizeof("lren") - 1, &HTTPPrint_lren }, + { "lrstat", sizeof("lrstat") - 1, &HTTPPrint_lrstat }, + { "lrdvid", sizeof("lrdvid") - 1, &HTTPPrint_lrdvid }, + { "lrapid", sizeof("lrapid") - 1, &HTTPPrint_lrapid }, + { "lrapkey", sizeof("lrapkey") - 1, &HTTPPrint_lrapkey }, +#endif #if CONFIG_WEBGUIAPP_MQTT_ENABLE - /*MQTT*/ - { "mqen1", sizeof("mqen1") - 1, &HTTPPrint_mqen1 }, - { "mqurl1", sizeof("mqurl1") - 1, &HTTPPrint_mqurl1 }, - { "mqport1", sizeof("mqport1") - 1, &HTTPPrint_mqport1 }, - { "mqsys1", sizeof("mqsys1") - 1, &HTTPPrint_mqsys1 }, - { "mqgrp1", sizeof("mqgrp1") - 1, &HTTPPrint_mqgrp1 }, - { "mqid1", sizeof("mqid1") - 1, &HTTPPrint_mqid1 }, - { "mqname1", sizeof("mqname1") - 1, &HTTPPrint_mqname1 }, - { "mqpass1", sizeof("mqpass1") - 1, &HTTPPrint_mqpass1 }, - #if CONFIG_WEBGUIAPP_MQTT_CLIENTS_NUM == 2 + /*MQTT*/ + { "mqen1", sizeof("mqen1") - 1, &HTTPPrint_mqen1 }, + { "mqurl1", sizeof("mqurl1") - 1, &HTTPPrint_mqurl1 }, + { "mqport1", sizeof("mqport1") - 1, &HTTPPrint_mqport1 }, + { "mqsys1", sizeof("mqsys1") - 1, &HTTPPrint_mqsys1 }, + { "mqgrp1", sizeof("mqgrp1") - 1, &HTTPPrint_mqgrp1 }, + { "mqid1", sizeof("mqid1") - 1, &HTTPPrint_mqid1 }, + { "mqname1", sizeof("mqname1") - 1, &HTTPPrint_mqname1 }, + { "mqpass1", sizeof("mqpass1") - 1, &HTTPPrint_mqpass1 }, + #if CONFIG_WEBGUIAPP_MQTT_CLIENTS_NUM == 2 { "mqen2", sizeof("mqen2") - 1, &HTTPPrint_mqen2 }, { "mqurl2", sizeof("mqurl2") - 1, &HTTPPrint_mqurl2 }, { "mqport2", sizeof("mqport2") - 1, &HTTPPrint_mqport2 }, @@ -692,87 +754,92 @@ dyn_var_handler_t HANDLERS_ARRAY[] = { { "mqgrp2", sizeof("mqgrp2") - 1, &HTTPPrint_mqgrp2 }, { "mqname2", sizeof("mqname2") - 1, &HTTPPrint_mqname2 }, { "mqpass2", sizeof("mqpass2") - 1, &HTTPPrint_mqpass2 }, + #endif #endif -#endif - /*SNTP*/ - { "sntpen", sizeof("sntpen") - 1, &HTTPPrint_sntpen }, - { "tmsrv", sizeof("tmsrv") - 1, &HTTPPrint_tmsrv }, + /*SNTP*/ + { "sntpen", sizeof("sntpen") - 1, &HTTPPrint_sntpen }, + { "tmsrv", sizeof("tmsrv") - 1, &HTTPPrint_tmsrv }, - { "freeram", sizeof("freeram") - 1, &HTTPPrint_freeram }, - { "minram", sizeof("minram") - 1, &HTTPPrint_minram }, - { "mqtt1st", sizeof("mqtt1st") - 1, &HTTPPrint_mqtt1st }, - { "mqtt2st", sizeof("mqtt2st") - 1, &HTTPPrint_mqtt2st }, + { "freeram", sizeof("freeram") - 1, &HTTPPrint_freeram }, + { "minram", sizeof("minram") - 1, &HTTPPrint_minram }, + { "mqtt1st", sizeof("mqtt1st") - 1, &HTTPPrint_mqtt1st }, + { "mqtt2st", sizeof("mqtt2st") - 1, &HTTPPrint_mqtt2st }, - /*ERROR report*/ - { "status_fail", sizeof("status_fail") - 1, &HTTPPrint_status_fail }, + /*ERROR report*/ + { "status_fail", sizeof("status_fail") - 1, &HTTPPrint_status_fail }, - { "ifc_gprs", sizeof("ifc_gprs") - 1, &HTTPPrint_ifc_gprs }, - { "ifc_mq2", sizeof("ifc_mq2") - 1, &HTTPPrint_ifc_mq2 }, - { "testvariable", sizeof("testvariable") - 1, &HTTPPrint_testvariable}, + { "hide_eth", sizeof("hide_eth") - 1, &HTTPPrint_hide_eth }, + { "hide_wifi", sizeof("hide_wifi") - 1, &HTTPPrint_hide_wifi }, + { "hide_lora", sizeof("hide_lora") - 1, &HTTPPrint_hide_lora }, + { "hide_gprs", sizeof("hide_gprs") - 1, &HTTPPrint_hide_gprs }, + { "hide_mqtt1", sizeof("hide_mqtt1") - 1, &HTTPPrint_hide_mqtt1 }, + { "hide_mqtt2", sizeof("hide_mqtt2") - 1, &HTTPPrint_hide_mqtt2 }, + + { "testvariable", sizeof("testvariable") - 1, &HTTPPrint_testvariable }, }; int HTTPPrint(httpd_req_t *req, char *buf, char *var) { -char VarData[MAX_DYNVAR_LENGTH]; -const char incPat[] = "inc:"; -const int incPatLen = sizeof(incPat) - 1; -if (!memcmp(var, incPat, incPatLen)) -{ - const char rootFS[] = "/"; - char filename[32]; - filename[0] = 0x00; - var += incPatLen; - strcat(filename, rootFS); - strcat(filename, var); - espfs_file_t *file = espfs_fopen(fs, filename); - struct espfs_stat_t stat; - if (file) + char VarData[MAX_DYNVAR_LENGTH]; + const char incPat[] = "inc:"; + const int incPatLen = sizeof(incPat) - 1; + if (!memcmp(var, incPat, incPatLen)) { - espfs_fstat(file, &stat); - int readBytes = espfs_fread(file, buf, stat.size); - espfs_fclose(file); - return readBytes; - } -} - -bool fnd = false; -char *p2 = var + strlen(var) - 1; //last var symbol -int arg = 0; -//searching for tag in handles array -for (int i = 0; i < (sizeof(HANDLERS_ARRAY) / sizeof(HANDLERS_ARRAY[0])); ++i) -{ - if (*p2 == ')') - { //found close brace - char *p1 = p2; - while ((*p1 != '(') && (p1 > var)) - --p1; - if (*p1 == '(') - { //found open brace - *p1 = 0x00; //trim variable to name part - ++p1; //to begin of argument - *p2 = 0x00; //set end of argument - arg = atoi(p1); + const char rootFS[] = "/"; + char filename[32]; + filename[0] = 0x00; + var += incPatLen; + strcat(filename, rootFS); + strcat(filename, var); + espfs_file_t *file = espfs_fopen(fs, filename); + struct espfs_stat_t stat; + if (file) + { + espfs_fstat(file, &stat); + int readBytes = espfs_fread(file, buf, stat.size); + espfs_fclose(file); + return readBytes; } } - if (strcmp(var, HANDLERS_ARRAY[i].tag) == 0 - && HANDLERS_ARRAY[i].HandlerRoutine != NULL) + + bool fnd = false; + char *p2 = var + strlen(var) - 1; //last var symbol + int arg = 0; +//searching for tag in handles array + for (int i = 0; i < (sizeof(HANDLERS_ARRAY) / sizeof(HANDLERS_ARRAY[0])); ++i) { - HANDLERS_ARRAY[i].HandlerRoutine(VarData, (void*) &arg); - fnd = true; - break; + if (*p2 == ')') + { //found close brace + char *p1 = p2; + while ((*p1 != '(') && (p1 > var)) + --p1; + if (*p1 == '(') + { //found open brace + *p1 = 0x00; //trim variable to name part + ++p1; //to begin of argument + *p2 = 0x00; //set end of argument + arg = atoi(p1); + } + } + if (strcmp(var, HANDLERS_ARRAY[i].tag) == 0 + && HANDLERS_ARRAY[i].HandlerRoutine != NULL) + { + HANDLERS_ARRAY[i].HandlerRoutine(VarData, (void*) &arg); + fnd = true; + break; + } } -} -if (!fnd) -{ - if (HTTPPrintCust != NULL) - return HTTPPrintCust(req, buf, var, arg); - else - HTTPPrint_DEF(VarData, NULL); - -} -int dLen = strlen(VarData); -memcpy(buf, VarData, dLen); -return dLen; + if (!fnd) + { + if (HTTPPrintCust != NULL) + return HTTPPrintCust(req, buf, var, arg); + else + HTTPPrint_DEF(VarData, NULL); + + } + int dLen = strlen(VarData); + memcpy(buf, VarData, dLen); + return dLen; } diff --git a/src/LoRaWANTransport.c b/src/LoRaWANTransport.c new file mode 100644 index 0000000..f937f09 --- /dev/null +++ b/src/LoRaWANTransport.c @@ -0,0 +1,195 @@ +/* Copyright 2022 Bogdan Pilyugin + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + * File name: LoRaWANTransport.c + * Project: MStation2Firmware + * Created on: 2022-12-17 + * Author: bogd + * Description: + */ + +#include "ttn.h" +#include "driver/spi_common.h" +#include "freertos/FreeRTOS.h" +#include "freertos/task.h" +#include "driver/gpio.h" +#include "Helpers.h" +#include "SystemConfiguration.h" +#include "NetTransport.h" +#include "webguiapp.h" + +// Pins and other resources +/*Defined in global configuration*/ + +#ifdef CONFIG_WEBGUIAPP_LORAWAN_ENABLE + +#define TTN_SPI_HOST CONFIG_SPI_HOST +#define TTN_PIN_NSS CONFIG_LORA_SPI_CS_GPIO +#define TTN_PIN_RXTX TTN_NOT_CONNECTED +#define TTN_PIN_RST TTN_NOT_CONNECTED +#define TTN_PIN_DIO0 CONFIG_LORA_DIO0_GPIO +#define TTN_PIN_DIO1 CONFIG_LORA_DIO1_GPIO + +#define LORAWAN_DELIVERY_RETRY_PERIOD 10 +#define MESSAGE_LENGTH 32 +#define TAG "LoRaWANApp" +#define LORAWAN_APP_LOG_ENABLED 1 +#define LORAWAN_MESSAGE_BUFER_LENTH 32 + +static const int LORA_WAIT_DELIVERY_BIT = BIT2; + +QueueHandle_t LORAMessagesQueueHandle; +static StaticQueue_t xStaticLoRaMessagesQueue; +uint8_t LoRaMessagesQueueStorageArea[LORAWAN_MESSAGE_BUFER_LENTH + * sizeof(DATA_SEND_STRUCT)]; + +esp_err_t LORASendData(DATA_SEND_STRUCT *pdss) +{ + char *ptr = (char*) malloc(MESSAGE_LENGTH); + if (ptr) + { + memcpy(ptr, pdss->raw_data_ptr, MESSAGE_LENGTH); + DATA_SEND_STRUCT DSS; + DSS.raw_data_ptr = ptr; + DSS.data_length = MESSAGE_LENGTH; + + if (xQueueSend(LORAMessagesQueueHandle, &DSS, + pdMS_TO_TICKS(1000)) == pdPASS) + return ESP_OK; + else + { + free(ptr); + return ESP_ERR_TIMEOUT; + } + } + else + return ESP_ERR_NO_MEM; +} + +void messageReceived(const uint8_t *message, size_t length, ttn_port_t port) +{ +#if LORAWAN_APP_LOG_ENABLED == 1 + if (length == MESSAGE_LENGTH && port == 1) + { + char P[MESSAGE_LENGTH * 2 + 1]; + P[MESSAGE_LENGTH * 2] = 0x00; + BytesToStr((unsigned char*) message, (unsigned char*) P, length); + ESP_LOGI(TAG, "Received=%s", P); + } +#endif + //TODO Here registered from application handler must be called + +} + +void LoRaWANTransportTask(void *pvParameter) +{ + DATA_SEND_STRUCT DSS; + while (!LORAMessagesQueueHandle) + vTaskDelay(pdMS_TO_TICKS(300)); //wait for LORA queue ready + while (1) + { + while (!ttn_is_connected()) + vTaskDelay(pdMS_TO_TICKS(300)); + + if (ttn_is_provisioned()) + { + xEventGroupClearBits(transport_event_group, LORA_WAIT_DELIVERY_BIT); + xQueuePeek(LORAMessagesQueueHandle, &DSS, portMAX_DELAY); + +#if LORAWAN_APP_LOG_ENABLED == 1 + char P[MESSAGE_LENGTH * 2 + 1]; + BytesToStr((unsigned char*) DSS.raw_data_ptr, (unsigned char*) P, MESSAGE_LENGTH); + P[MESSAGE_LENGTH * 2] = 0x00; + ESP_LOGI(TAG, "Sent=%s", P); +#endif + ttn_transmit_message((const uint8_t*) DSS.raw_data_ptr, MESSAGE_LENGTH, 1, true); + xQueueReceive(LORAMessagesQueueHandle, &DSS, 0); + + } + else + { +#if LORAWAN_APP_LOG_ENABLED == 1 + ESP_LOGW(TAG, "Transmit fail, transport not ready"); +#endif + } + } +} + + + +void LoRaWANRejoin(void) +{ + ttn_rejoin(); +} + +void LoRaWANInitJoinTask(void *pvParameter) +{ + LORAMessagesQueueHandle = NULL; + if (GetSysConf()->lorawanSettings.Flags1.bIsLoRaWANEnabled) + LORAMessagesQueueHandle = xQueueCreateStatic(LORAWAN_MESSAGE_BUFER_LENTH, + sizeof(DATA_SEND_STRUCT), + LoRaMessagesQueueStorageArea, + &xStaticLoRaMessagesQueue); + + ttn_init(); + // Configure the SX127x pins + ttn_configure_pins(TTN_SPI_HOST, TTN_PIN_NSS, TTN_PIN_RXTX, -1, + TTN_PIN_DIO0, + TTN_PIN_DIO1); + + char devEui[17], appEui[17], appKey[33]; + BytesToStr((unsigned char*) &GetSysConf()->lorawanSettings.DevEui, + (unsigned char*) devEui, + 8); + BytesToStr((unsigned char*) &GetSysConf()->lorawanSettings.AppEui, + (unsigned char*) appEui, + 8); + BytesToStr((unsigned char*) &GetSysConf()->lorawanSettings.AppKey, + (unsigned char*) appKey, + 16); + + // Register callback for received messages + ttn_on_message(messageReceived); + + while (!ttn_join(devEui, appEui, appKey)) + { + }; + + xTaskCreate(LoRaWANTransportTask, "LoRaWANTransportTask", 1024 * 4, + (void*) 0, + 3, + NULL); + + vTaskDelete(NULL); +} +#endif + + +void LoRaWANStart(void) +{ +#ifdef CONFIG_WEBGUIAPP_LORAWAN_ENABLE + xTaskCreate(LoRaWANInitJoinTask, "LoRaWANInitJoinTask", 1024 * 4, (void*) 0, + 3, + NULL); +#endif +} + +bool isLORAConnected(void) +{ +#ifdef CONFIG_WEBGUIAPP_LORAWAN_ENABLE + return ttn_is_connected(); +#else + return false; +#endif +} diff --git a/src/SystemConfiguration.c b/src/SystemConfiguration.c index 0257af2..141edf0 100644 --- a/src/SystemConfiguration.c +++ b/src/SystemConfiguration.c @@ -109,6 +109,14 @@ esp_err_t WebGuiAppInit(void) PPPModemStart(); #endif + /*LoRaWAN start if enabled*/ +#if !CONFIG_TTN_LORA_FREQ_DISABLED + if (GetSysConf()->lorawanSettings.Flags1.bIsLoRaWANEnabled) + { + LoRaWANStart(); + } +#endif + #if CONFIG_WEBGUIAPP_ETHERNET_ENABLE /*Start Ethernet connection*/ if (GetSysConf()->ethSettings.Flags1.bIsETHEnabled) @@ -318,6 +326,19 @@ esp_netif_str_to_ip4(CONFIG_WEBGUIAPP_DNS3_ADDRESS_DEFAULT, (esp_ip4_addr_t*) &C Conf->sntpClient.Flags1.bIsWifiEnabled = DEFAULT_SNTP_WIFI_IS_ENABLED; Conf->sntpClient.Flags1.bIsGlobalEnabled = DEFAULT_SNTP_GLOBAL_ENABLED; Conf->sntpClient.TimeZone = DEFAULT_SNTP_TIMEZONE; + +#ifdef CONFIG_WEBGUIAPP_LORAWAN_ENABLE + Conf->lorawanSettings.Flags1.bIsLoRaWANEnabled = true; + Conf->Flags1.bIsLoRaConfirm = false; + unsigned char temp[16] = { 0 }; + GetChipId((uint8_t*) temp + 4); + memcpy(Conf->lorawanSettings.DevEui, temp, 8); + StrToBytes((unsigned char*) CONFIG_LORA_APP_KEY, temp); + memcpy(Conf->lorawanSettings.AppKey, temp, 16); + StrToBytes((unsigned char*) CONFIG_LORA_APP_ID, temp); + memcpy(Conf->lorawanSettings.AppEui, temp, 8); +#endif + } esp_err_t ReadNVSSysConfig(SYS_CONFIG *SysConf)