You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
398 lines
13 KiB
C++
398 lines
13 KiB
C++
// FARM DATA RELAY SYSTEM
|
|
//
|
|
// DETAILED NODES' CONFIGURATION CHECK
|
|
//
|
|
// Make sure #define DEBUG_CONFIG is not uncommented in your node's config
|
|
// (fdrs_node_config.h or fdrs_gateway_config.h). Otherwise check will be ignored.
|
|
// When the node powers up, it's full config will be printed to the serial console once.
|
|
// Be sure to add further checks as new configuration possibilities are added to FDRS.
|
|
//
|
|
// Contributed by Sascha Juch (sascha.juch@gmail.com)
|
|
//
|
|
#ifndef __FDRS_CHECKCONFIG_h__
|
|
#define __FDRS_CHECKCONFIG_h__
|
|
|
|
const char* separatorLine = "--------------------------------------------------------------";
|
|
const char* headerAndFooter = "==============================================================";
|
|
|
|
|
|
// helper function for obfuscating passwords
|
|
String obfuscatePassword(String password) {
|
|
char obfuscatedPass[password.length()];
|
|
// TO DO: The following line is disabled due to AVR incompatibility.
|
|
// std::fill(obfuscatedPass, obfuscatedPass + password.length(), '*');
|
|
return String(obfuscatedPass);
|
|
}
|
|
|
|
|
|
// helper function for small header above each sub section
|
|
void printSmallSectionHeader(const char* headerText) {
|
|
DBG(separatorLine);
|
|
DBG(headerText);
|
|
}
|
|
|
|
|
|
// helper function for a nice little header above each section
|
|
void printSectionHeader(const char* headerText) {
|
|
DBG(separatorLine);
|
|
DBG(headerText);
|
|
DBG(separatorLine);
|
|
}
|
|
|
|
|
|
// helper function for a nice little header above each main section
|
|
void printConfigHeader(const char* headerText) {
|
|
DBG(headerAndFooter);
|
|
DBG(headerText);
|
|
DBG(headerAndFooter);
|
|
}
|
|
|
|
|
|
// check which logging method(s) have been activated for a node
|
|
void printLoggingInformation() {
|
|
printSectionHeader("LOG SETTINGS OF DEVICE");
|
|
|
|
#if defined(USE_SD_LOG) && defined(USE_FS_LOG)
|
|
DBG("Logging to SD card AND file system is active! You should better use only one of them at a time");
|
|
#endif
|
|
|
|
#ifdef USE_SD_LOG
|
|
DBG("Logging to SD-Card : enabled");
|
|
#ifdef LOGBUF_DELAY
|
|
DBG("log buffer delay in ms: " + String(LOGBUF_DELAY));
|
|
#else
|
|
DBG("log buffer delay in ms: NOT SPECIFIED - check config!");
|
|
#endif
|
|
#ifdef LOG_FILENAME
|
|
DBG("log filename : " + LOG_FILENAME);
|
|
#else
|
|
DBG("log filename : NOT SPECIFIED - check config!");
|
|
#endif
|
|
#else
|
|
DBG("Logging to SD-Card : disabled");
|
|
#endif //USE_SD_LOG
|
|
|
|
#ifdef USE_FS_LOG
|
|
DBG("Logging to file system: enabled");
|
|
#ifdef LOGBUF_DELAY
|
|
DBG("log buffer delay in ms: " + String(LOGBUF_DELAY));
|
|
#else
|
|
DBG("log buffer delay in ms: NOT SPECIFIED - check config!");
|
|
#endif
|
|
#ifdef LOG_FILENAME
|
|
DBG("log filename : " + LOG_FILENAME);
|
|
#else
|
|
DBG("log filename : NOT SPECIFIED - check config!");
|
|
#endif
|
|
DBG("WARNING: Permanently logging to flash memory may destroy the flash memory of your device!");
|
|
#else
|
|
DBG("Logging to file system: disabled");
|
|
#endif //USE_FS_LOG
|
|
}
|
|
|
|
|
|
// check which protocols are activated and which are deactivated
|
|
void printActivatedProtocols() {
|
|
// current candidates are: ESPNOW, LORA and MQTT (WIFI)
|
|
printSectionHeader("ACTIVATED PROTOCOLS");
|
|
|
|
#ifdef USE_LORA
|
|
DBG("LoRa : ENABLED");
|
|
#else
|
|
DBG("LoRa : DISABLED");
|
|
#endif
|
|
|
|
#ifdef USE_ESPNOW
|
|
DBG("ESPNow : ENABLED");
|
|
#else
|
|
DBG("ESPNow : DISABLED");
|
|
#endif
|
|
|
|
#ifdef USE_WIFI
|
|
DBG("WiFi : ENABLED");
|
|
#else
|
|
DBG("WiFi : DISABLED");
|
|
#endif
|
|
|
|
#if defined(USE_WIFI) && defined(USE_ESPNOW)
|
|
DBG("WARNING: You must not use USE_ESPNOW and USE_WIFI together! USE_WIFI is only needed for MQTT!");
|
|
#endif
|
|
|
|
#ifdef USE_STATIC_IPADDRESS
|
|
DBG("Using Static IP Address");
|
|
#else
|
|
DBG("Using DHCP");
|
|
#endif
|
|
}
|
|
|
|
|
|
void printEspnowDetails() {
|
|
#ifdef USE_ESPNOW
|
|
|
|
#ifdef UNIT_MAC
|
|
printSmallSectionHeader("ESP-Now Details:");
|
|
DBG("Neighbor 1 address: " + String(ESPNOW_NEIGHBOR_1, HEX));
|
|
DBG("Neighbor 2 address: " + String(ESPNOW_NEIGHBOR_2, HEX));
|
|
#endif //UNIT_MAC
|
|
|
|
#endif //USE_ESPNOW
|
|
}
|
|
|
|
|
|
void printWifiDetails() {
|
|
#ifdef USE_WIFI
|
|
printSmallSectionHeader("WiFi Details:");
|
|
|
|
#if defined(WIFI_SSID)
|
|
DBG("WiFi SSID used from WIFI_SSID : " + String(FDRS_WIFI_SSID));
|
|
#elif defined (GLOBAL_WIFI_SSID)
|
|
DBG("WiFi SSID used from GLOBAL_WIFI_SSID : " + String(FDRS_WIFI_SSID));
|
|
#else
|
|
DBG("NO WiFi SSID defined! Please define in fdrs_globals.h (recommended) or in fdrs_node_config.h / fdrs_gateway_config.h");
|
|
//exit(0);
|
|
#endif //WIFI_SSID
|
|
|
|
#if defined(WIFI_PASS)
|
|
DBG("WiFi password used from WIFI_PASS : " + obfuscatePassword(FDRS_WIFI_PASS));
|
|
#elif defined (GLOBAL_WIFI_SSID)
|
|
DBG("WiFi password used from GLOBAL_WIFI_PASS : " + obfuscatePassword(FDRS_WIFI_PASS));
|
|
#else
|
|
DBG("NO WiFi password defined! Please define in fdrs_globals.h (recommended) or in fdrs_node_config.h / fdrs_gateway_config.h");
|
|
//exit(0);
|
|
#endif //WIFI_PASS
|
|
|
|
#ifdef USE_STATIC_IPADDRESS
|
|
#if defined(HOST_IPADDRESS)
|
|
DBG("Host IP Address used from HOST_IPADDRESS : " + String(FDRS_HOST_IPADDRESS));
|
|
#elif defined (GLOBAL_HOST_IPADDRESS)
|
|
DBG("Host IP Address used from GLOBAL_HOST_IPADDRESS : " + String(FDRS_HOST_IPADDRESS));
|
|
#else
|
|
DBG("NO Host IP Address defined! Please define in fdrs_globals.h (recommended) or in fdrs_gateway_config.h");
|
|
//exit(0);
|
|
#endif // HOST_IPADDRESS
|
|
|
|
#if defined(GW_IPADDRESS)
|
|
DBG("Gateway IP Address used from GW_IPADDRESS : " + String(FDRS_GW_IPADDRESS));
|
|
#elif defined (GLOBAL_GW_IPADDRESS)
|
|
DBG("Gateway IP Address used from GLOBAL_GW_IPADDRESS : " + String(FDRS_GW_IPADDRESS));
|
|
#else
|
|
DBG("NO Gateway IP Address defined! Please define in fdrs_globals.h (recommended) or in fdrs_gateway_config.h");
|
|
//exit(0);
|
|
#endif // GW_IPADDRESS
|
|
|
|
#if defined(SUBNET_ADDRESS)
|
|
DBG("Subnet Address used from SUBNET_ADDRESS : " + String(FDRS_SUBNET_ADDRESS));
|
|
#elif defined (GLOBAL_SUBNET_ADDRESS)
|
|
DBG("Subnet Address used from GLOBAL_SUBNET_ADDRESS : " + String(FDRS_SUBNET_ADDRESS));
|
|
#else
|
|
DBG("NO Subnet Address defined! Please define in fdrs_globals.h (recommended) or in fdrs_gateway_config.h");
|
|
//exit(0);
|
|
#endif // SUBNET_ADDRESS
|
|
|
|
#if defined(DNS2_IPADDRESS)
|
|
DBG("DNS2 IP Address used from DNS2_IPADDRESS : " + String(FDRS_DNS2_IPADDRESS));
|
|
#elif defined (GLOBAL_DNS2_IPADDRESS)
|
|
DBG("DNS2 IP Address used from GLOBAL_DNS2_IPADDRESS : " + String(FDRS_DNS2_IPADDRESS));
|
|
#endif // DNS2_IPADDRESS
|
|
#endif // USE_STATIC_IPADDRESS
|
|
|
|
#if defined(DNS1_IPADDRESS)
|
|
DBG("DNS1 IP Address used from DNS1_IPADDRESS : " + String(FDRS_DNS1_IPADDRESS));
|
|
#elif defined (GLOBAL_DNS1_IPADDRESS)
|
|
DBG("DNS1 IP Address used from GLOBAL_DNS1_IPADDRESS : " + String(FDRS_DNS1_IPADDRESS));
|
|
#else
|
|
DBG("NO DNS1 IP Address defined! Please define in fdrs_globals.h (recommended) or in fdrs_gateway_config.h");
|
|
//exit(0);
|
|
#endif // DNS1_IPADDRESS
|
|
|
|
|
|
printSmallSectionHeader("MQTT BROKER CONFIG:");
|
|
|
|
#if defined(MQTT_ADDR)
|
|
DBG("MQTT address used from MQTT_ADDR : " + String(FDRS_MQTT_ADDR));
|
|
#elif defined (GLOBAL_MQTT_ADDR)
|
|
DBG("MQTT address used from GLOBAL_MQTT_ADDR : " + String(FDRS_MQTT_ADDR));
|
|
#else
|
|
DBG("NO MQTT address defined! Please define in fdrs_globals.h (recommended) or in fdrs_node_config.h / fdrs_gateway_config.h");
|
|
//exit(0);
|
|
#endif //MQTT_ADDR
|
|
|
|
#if defined(MQTT_PORT)
|
|
DBG("MQTT port used from MQTT_PORT : " + String(FDRS_MQTT_PORT));
|
|
#elif defined (GLOBAL_MQTT_PORT)
|
|
DBG("MQTT port used from GLOBAL_MQTT_ADDR : " + String(FDRS_MQTT_PORT));
|
|
#else
|
|
DBG("Using default MQTT port : " + String(FDRS_MQTT_PORT));
|
|
#endif //MQTT_PORT
|
|
|
|
#ifdef FDRS_MQTT_AUTH
|
|
printSmallSectionHeader("MQTT AUTHENTIFICATION CONFIG:");
|
|
//GLOBAL_MQTT_AUTH
|
|
#if defined(MQTT_USER)
|
|
DBG("MQTT username used from MQTT_USER : " + String(FDRS_MQTT_USER));
|
|
#elif defined (GLOBAL_MQTT_USER)
|
|
DBG("MQTT username used from GLOBAL_MQTT_USER : " + String(FDRS_MQTT_USER));
|
|
#else
|
|
DBG("NO MQTT username defined! Please define in fdrs_globals.h (recommended) or in fdrs_node_config.h / fdrs_gateway_config.h");
|
|
//exit(0);
|
|
#endif //MQTT_USER
|
|
|
|
#if defined(MQTT_PASS)
|
|
DBG("MQTT password used from MQTT_PASS : " + obfuscatePassword(FDRS_MQTT_PASS));
|
|
#elif defined (GLOBAL_MQTT_PASS)
|
|
DBG("MQTT password used from GLOBAL_MQTT_PASS : " + obfuscatePassword(FDRS_MQTT_PASS));
|
|
#else
|
|
DBG("NO MQTT password defined! Please define in fdrs_globals.h (recommended) or in fdrs_node_config.h / fdrs_gateway_config.h");
|
|
//exit(0);
|
|
#endif //MQTT_PASS
|
|
|
|
#endif //FDRS_MQTT_AUTH
|
|
|
|
#if defined(TOPIC_DATA)
|
|
DBG("MQTT topic (TOPIC_DATA) : " + String(TOPIC_DATA));
|
|
#else
|
|
DBG("NO MQTT topic defined! Please define TOPIC_DATA in fdrs_globals.h (recommended) or in fdrs_node_config.h / fdrs_gateway_config.h");
|
|
//exit(0);
|
|
#endif //TOPIC_DATA
|
|
|
|
#if defined(TOPIC_STATUS)
|
|
DBG("MQTT topic (TOPIC_STATUS) : " + String(TOPIC_STATUS));
|
|
#else
|
|
DBG("NO MQTT topic defined! Please define TOPIC_STATUS in fdrs_globals.h (recommended) or in fdrs_node_config.h / fdrs_gateway_config.h");
|
|
//exit(0);
|
|
#endif //TOPIC_STATUS
|
|
|
|
#if defined(TOPIC_COMMAND)
|
|
DBG("MQTT topic (TOPIC_COMMAND) : " + String(TOPIC_COMMAND));
|
|
#else
|
|
DBG("NO MQTT topic defined! Please define TOPIC_COMMAND in fdrs_globals.h (recommended) or in fdrs_node_config.h / fdrs_gateway_config.h");
|
|
//exit(0);
|
|
#endif //TOPIC_COMMAND
|
|
|
|
DBG(separatorLine);
|
|
DBG(separatorLine);
|
|
|
|
#endif //USE_WIFI
|
|
}
|
|
|
|
|
|
void printLoraDetails() {
|
|
#ifdef USE_LORA
|
|
printSmallSectionHeader("LoRa Details:");
|
|
|
|
#if defined(FDRS_LORA_FREQUENCY)
|
|
DBG("LoRa frequency used from FDRS_LORA_FREQUENCY : " + String(FDRS_LORA_FREQUENCY));
|
|
#elif defined (GLOBAL_FDRS_LORA_FREQUENCY)
|
|
DBG("LoRa frequency used from GLOBAL_FDRS_LORA_FREQUENCY : " + String(FDRS_LORA_FREQUENCY));
|
|
#else
|
|
DBG("NO FDRS_LORA_FREQUENCY defined! Please define in fdrs_globals.h (recommended) or in fdrs_node_config.h");
|
|
//exit(0);
|
|
#endif //LORA-FREQUENCY
|
|
|
|
#if defined(LORA_SF)
|
|
DBG("LoRa SF used from LORA_SF : " + String(FDRS_LORA_SF));
|
|
#elif defined (GLOBAL_LORA_SF)
|
|
DBG("LoRa SF used from GLOBAL_LORA_SF : " + String(FDRS_LORA_SF));
|
|
#else
|
|
// ASSERT("NO LORA-SF defined! Please define in fdrs_globals.h (recommended) or in fdrs_node_config.h");
|
|
DBG("NO LORA_SF defined! Please define in fdrs_globals.h (recommended) or in fdrs_node_config.h");
|
|
//exit(0);
|
|
#endif //LORA_SF
|
|
|
|
#if defined(LORA_TXPWR)
|
|
DBG("LoRa TXPWR used from LORA_TXPWR : " + String(FDRS_LORA_TXPWR));
|
|
#elif defined (GLOBAL_LORA_TXPWR)
|
|
DBG("LoRa TXPWR used from GLOBAL_LORA_TXPWR : " + String(FDRS_LORA_TXPWR));
|
|
#else
|
|
// ASSERT("NO LORA-TXPWR defined! Please define in fdrs_globals.h (recommended) or in fdrs_node_config.h");
|
|
DBG("NO LORA_TXPWR defined! Please define in fdrs_globals.h (recommended) or in fdrs_node_config.h");
|
|
//exit(0);
|
|
#endif //LORA_TXPWR
|
|
|
|
#if defined(LORA_ACK)
|
|
DBG("LoRa acknowledgement used from LORA_ACK : enabled");
|
|
#elif defined (GLOBAL_LORA_ACK)
|
|
DBG("LoRa acknowledgement used from GLOBAL_LORA_ACK: enabled");
|
|
#else
|
|
DBG("LoRa acknowledgement : disabled");
|
|
#endif
|
|
|
|
#if defined(LORA_ACK) || defined(GLOBAL_LORA_ACK)
|
|
|
|
#if defined(LORA_ACK_TIMEOUT)
|
|
DBG("Timeout for Lora acknowledment (LORA_ACK) : " + String(LORA_ACK_TIMEOUT));
|
|
#else
|
|
DBG("NO LORA_ACK_TIMEOUT defined! Please define in fdrs_globals.h (recommended) or in fdrs_node_config.h");
|
|
#endif // LORA_ACK_TIMEOUT
|
|
|
|
#if defined(LORA_RETRIES)
|
|
DBG("Number of ack retries (LORA_RETRIES) : " + String(LORA_RETRIES));
|
|
|
|
if (LORA_RETRIES >= 0 && LORA_RETRIES <= 3)
|
|
{
|
|
DBG("Number of ack retries (LORA_RETRIES) : within allowed range.");
|
|
}
|
|
else {
|
|
DBG("Number of ack retries (LORA_RETRIES) : not within allowed range [0 - 3]! Please change to correct value.");
|
|
} // LORA_RETRIES RANGE CHECK
|
|
|
|
#else
|
|
DBG("NO LORA_RETRIES defined! Defaulting to 0. Please define in fdrs_globals.h (recommended) or in fdrs_node_config.h");
|
|
#endif // LORA_RETRIES
|
|
|
|
|
|
#endif //LORA_ACK || GLOBAL_LORA_ACK
|
|
|
|
#ifdef UNIT_MAC
|
|
DBG("LoRa Neighbors");
|
|
DBG("Neighbor 1 address: " + String(LORA_NEIGHBOR_1, HEX));
|
|
DBG("Neighbor 2 address: " + String(LORA_NEIGHBOR_2, HEX));
|
|
#endif //UNIT_MAC
|
|
|
|
#endif //USE_LORA
|
|
}
|
|
|
|
|
|
void checkConfig() {
|
|
printConfigHeader("NODE CONFIGURATION OVERVIEW");
|
|
#ifdef UNIT_MAC
|
|
DBG("Device Type : Gateway");
|
|
DBG("Gateway ID : " + String(UNIT_MAC, HEX));
|
|
#elif defined (READING_ID)
|
|
DBG("Device Type : Node");
|
|
DBG("Reading ID : " + String(READING_ID));
|
|
DBG("Node's Gateway: " + String(GTWY_MAC, HEX));
|
|
#else
|
|
DBG("Device Type : UNKNOWN!");
|
|
DBG("Please check config!");
|
|
DBG("If you have just created a new node type,");
|
|
DBG("please add it's config check to:");
|
|
DGB("fdrs_checkConfig.h");
|
|
#endif
|
|
|
|
printActivatedProtocols();
|
|
|
|
printSmallSectionHeader("PROTOCOL DETAILS");
|
|
|
|
#ifdef USE_LORA
|
|
printLoraDetails();
|
|
#endif
|
|
|
|
#ifdef USE_ESPNOW
|
|
printEspnowDetails();
|
|
#endif
|
|
|
|
#ifdef USE_WIFI
|
|
printWifiDetails();
|
|
#endif
|
|
|
|
printLoggingInformation();
|
|
|
|
printConfigHeader("NODE CONFIGURATION OVERVIEW END");
|
|
//DBG(separatorLine);
|
|
DBG("");
|
|
}
|
|
|
|
#endif //__FDRS_CHECKCONFIG_h__
|
|
|