From 8ba5a0252633171125f38b89bb7f918f675ca12a Mon Sep 17 00:00:00 2001 From: Peter Buchegger Date: Sun, 6 Dec 2020 22:28:14 +0100 Subject: [PATCH 1/8] version bump to dev --- src/LoRa_APRS_iGate.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/LoRa_APRS_iGate.cpp b/src/LoRa_APRS_iGate.cpp index 4bd5c40..51c1c17 100644 --- a/src/LoRa_APRS_iGate.cpp +++ b/src/LoRa_APRS_iGate.cpp @@ -84,9 +84,9 @@ void setup() delay(500); logPrintlnA("LoRa APRS iGate & Digi by OE5BPA (Peter Buchegger)"); - logPrintlnA("Version: 20.49.0"); + logPrintlnA("Version: 20.49.0-dev"); setup_display(); - show_display("OE5BPA", "LoRa APRS iGate & Digi", "by Peter Buchegger", "20.49.0", 3000); + show_display("OE5BPA", "LoRa APRS iGate & Digi", "by Peter Buchegger", "20.49.0-dev", 3000); load_config(); setup_lora(); From 194a1d653298e62343076dedde3aa9bd5d3f50c9 Mon Sep 17 00:00:00 2001 From: Peter Buchegger Date: Sun, 6 Dec 2020 22:57:00 +0100 Subject: [PATCH 2/8] move config into external repository --- .gitmodules | 3 + lib | 1 + src/configuration.cpp | 155 ------------------------ src/configuration.h | 125 -------------------- src/display.cpp | 127 -------------------- src/display.h | 15 --- src/logger.cpp | 248 --------------------------------------- src/logger.h | 75 ------------ src/pins.h | 56 --------- src/power_management.cpp | 55 --------- src/power_management.h | 26 ---- 11 files changed, 4 insertions(+), 882 deletions(-) create mode 100644 .gitmodules create mode 160000 lib delete mode 100644 src/configuration.cpp delete mode 100644 src/configuration.h delete mode 100644 src/display.cpp delete mode 100644 src/display.h delete mode 100644 src/logger.cpp delete mode 100644 src/logger.h delete mode 100644 src/pins.h delete mode 100644 src/power_management.cpp delete mode 100644 src/power_management.h diff --git a/.gitmodules b/.gitmodules new file mode 100644 index 0000000..37a6bca --- /dev/null +++ b/.gitmodules @@ -0,0 +1,3 @@ +[submodule "lib"] + path = lib + url = ../LoRa_APRS_Common diff --git a/lib b/lib new file mode 160000 index 0000000..757733b --- /dev/null +++ b/lib @@ -0,0 +1 @@ +Subproject commit 757733be04730095a27be008363b4f51dd68bacb diff --git a/src/configuration.cpp b/src/configuration.cpp deleted file mode 100644 index bbc8d3a..0000000 --- a/src/configuration.cpp +++ /dev/null @@ -1,155 +0,0 @@ -#include - -#include "configuration.h" -#include "logger.h" - -ConfigurationManagement::ConfigurationManagement(String FilePath) - : mFilePath(FilePath) -{ - if(!SPIFFS.begin(true)) - { - logPrintlnE("Mounting SPIFFS was not possible. Trying to format SPIFFS..."); - SPIFFS.format(); - if(!SPIFFS.begin()) - { - logPrintlnE("Formating SPIFFS was not okay!"); - } - } -} - -Configuration ConfigurationManagement::readConfiguration() -{ - File file = SPIFFS.open(mFilePath); - if(!file) - { - logPrintlnE("Failed to open file for reading..."); - return Configuration(); - } - DynamicJsonDocument data(2048); - DeserializationError error = deserializeJson(data, file); - if(error) - { - logPrintlnW("Failed to read file, using default configuration."); - } - //serializeJson(data, Serial); - //Serial.println(); - file.close(); - - Configuration conf; - if(data.containsKey("callsign")) - conf.callsign = data["callsign"].as(); - - conf.wifi.active = data["wifi"]["active"] | false; - JsonArray aps = data["wifi"]["AP"].as(); - for(JsonVariant v : aps) - { - Configuration::Wifi::AP ap; - ap.SSID = v["SSID"].as(); - ap.password = v["password"].as(); - conf.wifi.APs.push_back(ap); - } - if(data.containsKey("beacon") && data["beacon"].containsKey("message")) - conf.beacon.message = data["beacon"]["message"].as(); - conf.beacon.positionLatitude = data["beacon"]["position"]["latitude"] | 0.0; - conf.beacon.positionLongitude = data["beacon"]["position"]["longitude"] | 0.0; - conf.aprs_is.active = data["aprs_is"]["active"] | false; - if(data.containsKey("aprs_is") && data["aprs_is"].containsKey("password")) - conf.aprs_is.password = data["aprs_is"]["password"].as(); - if(data.containsKey("aprs_is") && data["aprs_is"].containsKey("server")) - conf.aprs_is.server = data["aprs_is"]["server"].as(); - conf.aprs_is.port = data["aprs_is"]["port"] | 14580; - conf.aprs_is.beacon = data["aprs_is"]["beacon"] | true; - conf.aprs_is.beaconTimeout = data["aprs_is"]["beacon_timeout"] | 15; - conf.digi.active = data["digi"]["active"] | false; - conf.digi.forwardTimeout = data["digi"]["forward_timeout"] | 5; - conf.digi.beacon = data["digi"]["beacon"] | true; - conf.digi.beaconTimeout = data["digi"]["beacon_timeout"] | 30; - - conf.lora.frequencyRx = data["lora"]["frequency_rx"] | 433775000; - conf.lora.frequencyTx = data["lora"]["frequency_tx"] | 433775000; - conf.lora.power = data["lora"]["power"] | 20; - conf.lora.spreadingFactor = data["lora"]["spreading_factor"] | 12; - conf.lora.signalBandwidth = data["lora"]["signal_bandwidth"] | 125000; - conf.lora.codingRate4 = data["lora"]["coding_rate4"] | 5; - conf.display.alwaysOn = data["display"]["always_on"] | true; - conf.display.timeout = data["display"]["timeout"] | 10; - conf.display.overwritePin = data["display"]["overwrite_pin"] | 0; - - conf.ftp.active = data["ftp"]["active"] | false; - JsonArray users = data["ftp"]["user"].as(); - for(JsonVariant u : users) - { - Configuration::Ftp::User us; - us.name = u["name"].as(); - us.password = u["password"].as(); - conf.ftp.users.push_back(us); - } - if(conf.ftp.users.empty()) - { - Configuration::Ftp::User us; - us.name = "ftp"; - us.password = "ftp"; - conf.ftp.users.push_back(us); - } - - // update config in memory to get the new fields: - writeConfiguration(conf); - - return conf; -} - -void ConfigurationManagement::writeConfiguration(Configuration conf) -{ - File file = SPIFFS.open(mFilePath, "w"); - if(!file) - { - logPrintlnE("Failed to open file for writing..."); - return; - } - DynamicJsonDocument data(2048); - - data["callsign"] = conf.callsign; - data["wifi"]["active"] = conf.wifi.active; - JsonArray aps = data["wifi"].createNestedArray("AP"); - for(Configuration::Wifi::AP ap : conf.wifi.APs) - { - JsonObject v = aps.createNestedObject(); - v["SSID"] = ap.SSID; - v["password"] = ap.password; - } - data["beacon"]["message"] = conf.beacon.message; - data["beacon"]["position"]["latitude"] = conf.beacon.positionLatitude; - data["beacon"]["position"]["longitude"] = conf.beacon.positionLongitude; - data["aprs_is"]["active"] = conf.aprs_is.active; - data["aprs_is"]["password"] = conf.aprs_is.password; - data["aprs_is"]["server"] = conf.aprs_is.server; - data["aprs_is"]["port"] = conf.aprs_is.port; - data["aprs_is"]["beacon"] = conf.aprs_is.beacon; - data["aprs_is"]["beacon_timeout"] = conf.aprs_is.beaconTimeout; - data["digi"]["active"] = conf.digi.active; - data["digi"]["forward_timeout"] = conf.digi.forwardTimeout; - data["digi"]["beacon"] = conf.digi.beacon; - data["digi"]["beacon_timeout"] = conf.digi.beaconTimeout; - data["lora"]["frequency_rx"] = conf.lora.frequencyRx; - data["lora"]["frequency_tx"] = conf.lora.frequencyTx; - data["lora"]["power"] = conf.lora.power; - data["lora"]["spreading_factor"] = conf.lora.spreadingFactor; - data["lora"]["signal_bandwidth"] = conf.lora.signalBandwidth; - data["lora"]["coding_rate4"] = conf.lora.codingRate4; - data["display"]["always_on"] = conf.display.alwaysOn; - data["display"]["timeout"] = conf.display.timeout; - data["display"]["overwrite_pin"] = conf.display.overwritePin; - data["ftp"]["active"] = conf.ftp.active; - JsonArray users = data["ftp"].createNestedArray("user"); - for(Configuration::Ftp::User u : conf.ftp.users) - { - JsonObject v = users.createNestedObject(); - v["name"] = u.name; - v["password"] = u.password; - } - - serializeJson(data, file); - //serializeJson(data, Serial); - //Serial.println(); - file.close(); -} diff --git a/src/configuration.h b/src/configuration.h deleted file mode 100644 index 8e7e101..0000000 --- a/src/configuration.h +++ /dev/null @@ -1,125 +0,0 @@ -#ifndef CONFIGURATION_H_ -#define CONFIGURATION_H_ - -#include - -#include -#include - -class Configuration -{ -public: - class Wifi - { - public: - class AP - { - public: - String SSID; - String password; - }; - - Wifi() : active(false) {} - - bool active; - std::list APs; - }; - - class Beacon - { - public: - Beacon() : message("LoRa iGATE & Digi, Info: github.com/peterus/LoRa_APRS_iGate"), positionLatitude(0.0), positionLongitude(0.0) {} - - String message; - double positionLatitude; - double positionLongitude; - }; - - class APRS_IS - { - public: - APRS_IS() : active(false), server("euro.aprs2.net"), port(14580), beacon(true), beaconTimeout(15) {} - - bool active; - String password; - String server; - int port; - bool beacon; - int beaconTimeout; - }; - - class Digi - { - public: - Digi() : active(false), forwardTimeout(5), beacon(true), beaconTimeout(30) {} - - bool active; - int forwardTimeout; - bool beacon; - int beaconTimeout; - }; - - class LoRa - { - public: - LoRa() : frequencyRx(433775000), frequencyTx(433775000), power(20), spreadingFactor(12), signalBandwidth(125000), codingRate4(5) {} - - long frequencyRx; - long frequencyTx; - int power; - int spreadingFactor; - long signalBandwidth; - int codingRate4; - }; - - class Display - { - public: - Display() : alwaysOn(true), timeout(10), overwritePin(0) {} - - bool alwaysOn; - int timeout; - int overwritePin; - }; - - class Ftp - { - public: - class User - { - public: - String name; - String password; - }; - - Ftp() : active(false) {} - - bool active; - std::list users; - }; - - Configuration() : callsign("NOCALL-10") {}; - - String callsign; - Wifi wifi; - Beacon beacon; - APRS_IS aprs_is; - Digi digi; - LoRa lora; - Display display; - Ftp ftp; -}; - -class ConfigurationManagement -{ -public: - explicit ConfigurationManagement(String FilePath); - - Configuration readConfiguration(); - void writeConfiguration(Configuration conf); - -private: - const String mFilePath; -}; - -#endif diff --git a/src/display.cpp b/src/display.cpp deleted file mode 100644 index 292b63e..0000000 --- a/src/display.cpp +++ /dev/null @@ -1,127 +0,0 @@ - -#include -#include -#include - -#include "display.h" -#include "pins.h" -#include "logger.h" - -Adafruit_SSD1306 display(128, 64, &Wire); - -void setup_display() -{ - Wire.begin(OLED_SDA, OLED_SCL); - if(!display.begin(SSD1306_SWITCHCAPVCC, 0x3c, false, false)) - { - logPrintlnE("SSD1306 allocation failed"); - while (1); - } - logPrintlnI("Display init done!"); -} - -void turn_off_display() -{ - display.ssd1306_command(SSD1306_DISPLAYOFF); -} - -void show_display(String header, int wait) -{ - display.clearDisplay(); - display.setTextColor(WHITE); - display.setTextSize(2); - display.setCursor(0,0); - display.println(header); - display.display(); - delay(wait); -} - -void show_display(String header, String line1, int wait) -{ - display.clearDisplay(); - display.setTextColor(WHITE); - display.setTextSize(2); - display.setCursor(0,0); - display.println(header); - display.setTextSize(1); - display.setCursor(0,16); - display.println(line1); - display.display(); - delay(wait); -} - -void show_display(String header, String line1, String line2, int wait) -{ - display.clearDisplay(); - display.setTextColor(WHITE); - display.setTextSize(2); - display.setCursor(0,0); - display.println(header); - display.setTextSize(1); - display.setCursor(0,16); - display.println(line1); - display.setCursor(0,26); - display.println(line2); - display.display(); - delay(wait); -} - -void show_display(String header, String line1, String line2, String line3, int wait) -{ - display.clearDisplay(); - display.setTextColor(WHITE); - display.setTextSize(2); - display.setCursor(0,0); - display.println(header); - display.setTextSize(1); - display.setCursor(0,16); - display.println(line1); - display.setCursor(0,26); - display.println(line2); - display.setCursor(0,36); - display.println(line3); - display.display(); - delay(wait); -} - -void show_display(String header, String line1, String line2, String line3, String line4, int wait) -{ - display.clearDisplay(); - display.setTextColor(WHITE); - display.setTextSize(2); - display.setCursor(0,0); - display.println(header); - display.setTextSize(1); - display.setCursor(0,16); - display.println(line1); - display.setCursor(0,26); - display.println(line2); - display.setCursor(0,36); - display.println(line3); - display.setCursor(0,46); - display.println(line4); - display.display(); - delay(wait); -} - -void show_display(String header, String line1, String line2, String line3, String line4, String line5, int wait) -{ - display.clearDisplay(); - display.setTextColor(WHITE); - display.setTextSize(2); - display.setCursor(0,0); - display.println(header); - display.setTextSize(1); - display.setCursor(0,16); - display.println(line1); - display.setCursor(0,26); - display.println(line2); - display.setCursor(0,36); - display.println(line3); - display.setCursor(0,46); - display.println(line4); - display.setCursor(0,56); - display.println(line5); - display.display(); - delay(wait); -} diff --git a/src/display.h b/src/display.h deleted file mode 100644 index 2df251a..0000000 --- a/src/display.h +++ /dev/null @@ -1,15 +0,0 @@ - -#ifndef DISPLAY_H_ -#define DISPLAY_H_ - -void setup_display(); -void turn_off_display(); - -void show_display(String header, int wait = 0); -void show_display(String header, String line1, int wait = 0); -void show_display(String header, String line1, String line2, int wait = 0); -void show_display(String header, String line1, String line2, String line3, int wait = 0); -void show_display(String header, String line1, String line2, String line3, String line4, int wait = 0); -void show_display(String header, String line1, String line2, String line3, String line4, String line5, int wait = 0); - -#endif diff --git a/src/logger.cpp b/src/logger.cpp deleted file mode 100644 index 0e63503..0000000 --- a/src/logger.cpp +++ /dev/null @@ -1,248 +0,0 @@ -#include "logger.h" - -#undef LOG_RESET_COLOR -#undef LOG_COLOR_E -#undef LOG_COLOR_W -#undef LOG_COLOR_I -#undef LOG_COLOR_D -#undef LOG_COLOR_V - -#define LOG_COLOR_BLACK "30" -#define LOG_COLOR_RED "31" -#define LOG_COLOR_GREEN "32" -#define LOG_COLOR_BROWN "33" -#define LOG_COLOR_BLUE "34" -#define LOG_COLOR_PURPLE "35" -#define LOG_COLOR_CYAN "36" -#define LOG_COLOR(COLOR) "\033[0;" COLOR "m" -#define LOG_BOLD(COLOR) "\033[1;" COLOR "m" -#define LOG_RESET_COLOR "\033[0m" -#define LOG_COLOR_E LOG_COLOR(LOG_COLOR_RED) -#define LOG_COLOR_W LOG_COLOR(LOG_COLOR_BROWN) -#define LOG_COLOR_I LOG_COLOR(LOG_COLOR_GREEN) -#define LOG_COLOR_D LOG_COLOR(LOG_COLOR_BLUE) -#define LOG_COLOR_V LOG_COLOR(LOG_COLOR_CYAN) - -Logger::Logger() - : _serial(Serial), _level(DEBUG_LEVEL_DEBUG), _printIsNewline(true) -{ -} - -// cppcheck-suppress unusedFunction -void Logger::setSerial(const HardwareSerial & serial) -{ - _serial = serial; -} - -// cppcheck-suppress unusedFunction -void Logger::setDebugLevel(debug_level_t level) -{ - _level = level; -} - -// cppcheck-suppress unusedFunction -void Logger::printA(const String & text, const char * file, uint32_t line) -{ - printStartColor(DEBUG_LEVEL_NONE); - printHeader(DEBUG_LEVEL_NONE, file, line, false); - _serial.print(text); - printEndColor(DEBUG_LEVEL_NONE); -} - -// cppcheck-suppress unusedFunction -void Logger::printE(const String & text, const char * file, uint32_t line) -{ - printStartColor(DEBUG_LEVEL_ERROR); - printHeader(DEBUG_LEVEL_ERROR, file, line, false); - _serial.print(text); - printEndColor(DEBUG_LEVEL_ERROR); -} - -// cppcheck-suppress unusedFunction -void Logger::printlnA(const String & text, const char * file, uint32_t line) -{ - printStartColor(DEBUG_LEVEL_NONE); - printHeader(DEBUG_LEVEL_NONE, file, line, true); - _serial.println(text); - printEndColor(DEBUG_LEVEL_NONE); -} - -// cppcheck-suppress unusedFunction -void Logger::printlnE(const String & text, const char * file, uint32_t line) -{ - printStartColor(DEBUG_LEVEL_ERROR); - printHeader(DEBUG_LEVEL_ERROR, file, line, true); - _serial.println(text); - printEndColor(DEBUG_LEVEL_ERROR); -} - -// cppcheck-suppress unusedFunction -void Logger::printV(const String & text, const char * file, uint32_t line) -{ - if (_level >= DEBUG_LEVEL_VERBOSE) - { - printStartColor(DEBUG_LEVEL_VERBOSE); - printHeader(DEBUG_LEVEL_VERBOSE, file, line, false); - _serial.print(text); - printEndColor(DEBUG_LEVEL_VERBOSE); - } -} - -// cppcheck-suppress unusedFunction -void Logger::printD(const String & text, const char * file, uint32_t line) -{ - if (_level >= DEBUG_LEVEL_DEBUG) - { - printStartColor(DEBUG_LEVEL_DEBUG); - printHeader(DEBUG_LEVEL_DEBUG, file, line, false); - _serial.print(text); - printEndColor(DEBUG_LEVEL_DEBUG); - } -} - -// cppcheck-suppress unusedFunction -void Logger::printI(const String & text, const char * file, uint32_t line) -{ - if (_level >= DEBUG_LEVEL_INFO) - { - printStartColor(DEBUG_LEVEL_INFO); - printHeader(DEBUG_LEVEL_INFO, file, line, false); - _serial.print(text); - printEndColor(DEBUG_LEVEL_INFO); - } -} - -// cppcheck-suppress unusedFunction -void Logger::printW(const String & text, const char * file, uint32_t line) -{ - if (_level >= DEBUG_LEVEL_WARN) - { - printStartColor(DEBUG_LEVEL_WARN); - printHeader(DEBUG_LEVEL_WARN, file, line, false); - _serial.print(text); - printEndColor(DEBUG_LEVEL_WARN); - } -} - -// cppcheck-suppress unusedFunction -void Logger::printlnV(const String & text, const char * file, uint32_t line) -{ - if (_level >= DEBUG_LEVEL_VERBOSE) - { - printStartColor(DEBUG_LEVEL_VERBOSE); - printHeader(DEBUG_LEVEL_VERBOSE, file, line, true); - _serial.println(text); - printEndColor(DEBUG_LEVEL_VERBOSE); - } -} - -// cppcheck-suppress unusedFunction -void Logger::printlnD(const String & text, const char * file, uint32_t line) -{ - if (_level >= DEBUG_LEVEL_DEBUG) - { - printStartColor(DEBUG_LEVEL_DEBUG); - printHeader(DEBUG_LEVEL_DEBUG, file, line, true); - _serial.println(text); - printEndColor(DEBUG_LEVEL_DEBUG); - } -} - -// cppcheck-suppress unusedFunction -void Logger::printlnI(const String & text, const char * file, uint32_t line) -{ - if (_level >= DEBUG_LEVEL_INFO) - { - printStartColor(DEBUG_LEVEL_INFO); - printHeader(DEBUG_LEVEL_INFO, file, line, true); - _serial.println(text); - printEndColor(DEBUG_LEVEL_INFO); - } -} - -// cppcheck-suppress unusedFunction -void Logger::printlnW(const String & text, const char * file, uint32_t line) -{ - if (_level >= DEBUG_LEVEL_WARN) - { - printStartColor(DEBUG_LEVEL_WARN); - printHeader(DEBUG_LEVEL_WARN, file, line, true); - _serial.println(text); - printEndColor(DEBUG_LEVEL_WARN); - } -} - -void Logger::printStartColor(debug_level_t level) -{ - switch (level) - { - case DEBUG_LEVEL_ERROR: - _serial.print(LOG_COLOR_E); - break; - case DEBUG_LEVEL_WARN: - _serial.print(LOG_COLOR_W); - break; - case DEBUG_LEVEL_INFO: - _serial.print(LOG_COLOR_I); - break; - case DEBUG_LEVEL_DEBUG: - _serial.print(LOG_COLOR_D); - break; - case DEBUG_LEVEL_VERBOSE: - _serial.print(LOG_COLOR_V); - break; - default: - break; - } -} - -void Logger::printHeader(debug_level_t level, const char * file, uint32_t line, bool isln) -{ - if (_printIsNewline) - { - Serial.printf("%c %25s %4d : ", levelToChar(level), file, line); - if(!isln) - { - _printIsNewline = false; - } - } - else - { - _printIsNewline = isln; - } -} - -void Logger::printEndColor(debug_level_t level) -{ - switch (level) - { - case DEBUG_LEVEL_ERROR: - case DEBUG_LEVEL_WARN: - case DEBUG_LEVEL_INFO: - case DEBUG_LEVEL_DEBUG: - case DEBUG_LEVEL_VERBOSE: - _serial.print(LOG_RESET_COLOR); - break; - default: - break; - } -} - -char Logger::levelToChar(debug_level_t level) -{ - switch (level) - { - case DEBUG_LEVEL_ERROR: - return 'E'; - case DEBUG_LEVEL_WARN: - return 'W'; - case DEBUG_LEVEL_INFO: - return 'I'; - case DEBUG_LEVEL_DEBUG: - return 'D'; - case DEBUG_LEVEL_VERBOSE: - return 'V'; - default: - return ' '; - } -} diff --git a/src/logger.h b/src/logger.h deleted file mode 100644 index 51ddedb..0000000 --- a/src/logger.h +++ /dev/null @@ -1,75 +0,0 @@ -#ifndef _LOGGER_H_ -#define _LOGGER_H_ - -#include - -class Logger -{ -public: - enum debug_level_t { - DEBUG_LEVEL_NONE, // No debug output - DEBUG_LEVEL_ERROR, // Critical errors - DEBUG_LEVEL_WARN, // Error conditions but not critical - DEBUG_LEVEL_INFO, // Information messages - DEBUG_LEVEL_DEBUG, // Extra information - default level (if not changed) - DEBUG_LEVEL_VERBOSE, // More information than the usual - DEBUG_LEVELS_SIZE - }; - - static Logger & instance() - { - static Logger _instance; - return _instance; - } - - ~Logger() {} - - void setSerial(const HardwareSerial & serial = Serial); - void setDebugLevel(debug_level_t level); - - // print always: - void printA(const String & text, const char * file, uint32_t line); // always - void printE(const String & text, const char * file, uint32_t line); // error - void printlnA(const String & text, const char * file, uint32_t line); // always with new line - void printlnE(const String & text, const char * file, uint32_t line); // error with new line - - // depending on verbose level: - void printV(const String & text, const char * file, uint32_t line); // verbose - void printD(const String & text, const char * file, uint32_t line); // debug - void printI(const String & text, const char * file, uint32_t line); // information - void printW(const String & text, const char * file, uint32_t line); // warning - - void printlnV(const String & text, const char * file, uint32_t line); // verbose with new line - void printlnD(const String & text, const char * file, uint32_t line); // debug with new line - void printlnI(const String & text, const char * file, uint32_t line); // information with new line - void printlnW(const String & text, const char * file, uint32_t line); // warning with new line - -private: - HardwareSerial & _serial; - debug_level_t _level; - bool _printIsNewline; - - void printStartColor(debug_level_t level); - void printHeader(debug_level_t level, const char * file, uint32_t line, bool isln); - void printEndColor(debug_level_t level); - char levelToChar(debug_level_t level); - - Logger(); - Logger(const Logger &); - Logger & operator = (const Logger &); -}; - -#define logPrintA(text) Logger::instance().printA(text, __FILE__, __LINE__) -#define logPrintE(text) Logger::instance().printE(text, __FILE__, __LINE__) -#define logPrintlnA(text) Logger::instance().printlnA(text, __FILE__, __LINE__) -#define logPrintlnE(text) Logger::instance().printlnE(text, __FILE__, __LINE__) -#define logPrintV(text) Logger::instance().printV(text, __FILE__, __LINE__) -#define logPrintD(text) Logger::instance().printD(text, __FILE__, __LINE__) -#define logPrintI(text) Logger::instance().printI(text, __FILE__, __LINE__) -#define logPrintW(text) Logger::instance().printW(text, __FILE__, __LINE__) -#define logPrintlnV(text) Logger::instance().printlnV(text, __FILE__, __LINE__) -#define logPrintlnD(text) Logger::instance().printlnD(text, __FILE__, __LINE__) -#define logPrintlnI(text) Logger::instance().printlnI(text, __FILE__, __LINE__) -#define logPrintlnW(text) Logger::instance().printlnW(text, __FILE__, __LINE__) - -#endif diff --git a/src/pins.h b/src/pins.h deleted file mode 100644 index 4c764cb..0000000 --- a/src/pins.h +++ /dev/null @@ -1,56 +0,0 @@ -#ifndef PINS_H_ -#define PINS_H_ - -#undef OLED_SDA -#undef OLED_SCL -#undef OLED_RST - -#if defined(HELTEC_WIFI_LORA_32_V1) || defined(HELTEC_WIFI_LORA_32_V2) || defined(TTGO_LORA32_V1) - #define OLED_SDA 4 - #define OLED_SCL 15 -#endif - -#if defined(TTGO_LORA32_V2) || defined(TTGO_T_Beam_V0_7) || defined(TTGO_T_Beam_V1_0) - #define OLED_SDA 21 - #define OLED_SCL 22 -#endif - -#ifdef TRACKERD - #define OLED_SDA 5 - #define OLED_SCL 4 -#endif - -#ifdef ETH_BOARD - #define OLED_SDA 33 - #define OLED_SCL 32 - #define ETH_POWER_PIN -1 - #define ETH_TYPE ETH_PHY_LAN8720 - #define ETH_ADDR 0 - #define ETH_MDC_PIN 23 - #define ETH_MDIO_PIN 18 - #define NRST 5 -#endif - -#ifdef ETH_BOARD_V1_0 - #define ETH_CLK ETH_CLOCK_GPIO17_OUT // TTGO PoE V1.0 -#endif - -#ifdef ETH_BOARD_V1_2 - #define ETH_CLK ETH_CLOCK_GPIO0_OUT // TTGO PoE V1.2 -#endif - - -#undef KEY_BUILTIN -#if defined(TTGO_T_Beam_V0_7) - #define KEY_BUILTIN 39 -#endif - -#if defined(TTGO_T_Beam_V1_0) - #define KEY_BUILTIN 38 -#endif - -#ifndef KEY_BUILTIN - #define KEY_BUILTIN 0 -#endif - -#endif diff --git a/src/power_management.cpp b/src/power_management.cpp deleted file mode 100644 index 8f017b6..0000000 --- a/src/power_management.cpp +++ /dev/null @@ -1,55 +0,0 @@ - -#include "power_management.h" - -// cppcheck-suppress uninitMemberVar -PowerManagement::PowerManagement() -{ -} - -// cppcheck-suppress unusedFunction -bool PowerManagement::begin(TwoWire & port) -{ - bool result = axp.begin(port, AXP192_SLAVE_ADDRESS); - if(!result) - { - axp.setDCDC1Voltage(3300); - } - return result; -} - -// cppcheck-suppress unusedFunction -void PowerManagement::activateLoRa() -{ - axp.setPowerOutPut(AXP192_LDO2, AXP202_ON); -} - -// cppcheck-suppress unusedFunction -void PowerManagement::deactivateLoRa() -{ - axp.setPowerOutPut(AXP192_LDO2, AXP202_OFF); -} - -// cppcheck-suppress unusedFunction -void PowerManagement::activateGPS() -{ - axp.setPowerOutPut(AXP192_LDO3, AXP202_ON); -} - -// cppcheck-suppress unusedFunction -void PowerManagement::deactivateGPS() -{ - axp.setPowerOutPut(AXP192_LDO3, AXP202_OFF); -} - -// cppcheck-suppress unusedFunction -void PowerManagement::activateOLED() -{ - axp.setPowerOutPut(AXP192_DCDC1, AXP202_ON); -} - -// cppcheck-suppress unusedFunction -void PowerManagement::decativateOLED() -{ - axp.setPowerOutPut(AXP192_DCDC1, AXP202_OFF); -} - diff --git a/src/power_management.h b/src/power_management.h deleted file mode 100644 index ecd6cf6..0000000 --- a/src/power_management.h +++ /dev/null @@ -1,26 +0,0 @@ -#ifndef POWER_MANAGEMENT_H_ -#define POWER_MANAGEMENT_H_ - -#include -#include - -class PowerManagement -{ -public: - PowerManagement(); - bool begin(TwoWire & port); - - void activateLoRa(); - void deactivateLoRa(); - - void activateGPS(); - void deactivateGPS(); - - void activateOLED(); - void decativateOLED(); - -private: - AXP20X_Class axp; -}; - -#endif From fec518d73b0980f7f5ecb8d5d950a386950a2921 Mon Sep 17 00:00:00 2001 From: Peter Buchegger Date: Sun, 6 Dec 2020 23:11:54 +0100 Subject: [PATCH 3/8] add github submodule support --- .github/workflows/build_check.yml | 4 ++++ .github/workflows/release.yml | 2 ++ 2 files changed, 6 insertions(+) diff --git a/.github/workflows/build_check.yml b/.github/workflows/build_check.yml index a65a723..7034fd3 100644 --- a/.github/workflows/build_check.yml +++ b/.github/workflows/build_check.yml @@ -16,6 +16,8 @@ jobs: - run: pip3 install platformio - run: echo "$HOME/.local/bin" >> $GITHUB_PATH - uses: actions/checkout@v2 + with: + submodules: 'recursive' - run: platformio check --fail-on-defect low --fail-on-defect medium --fail-on-defect high --skip-packages --flags "--suppress=*:*.pio\* --inline-suppr" -v PlatformIO-Build: @@ -25,6 +27,8 @@ jobs: - run: pip3 install platformio - run: echo "$HOME/.local/bin" >> $GITHUB_PATH - uses: actions/checkout@v2 + with: + submodules: 'recursive' - run: platformio run - uses: actions/upload-artifact@v2 with: diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 8c763dc..8edda0f 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -14,6 +14,8 @@ jobs: - run: pip3 install platformio - run: echo "$HOME/.local/bin" >> $GITHUB_PATH - uses: actions/checkout@v2 + with: + submodules: 'recursive' - run: platformio run - id: create_release uses: actions/create-release@v1 From d0cfe7f580f7d5f5a5644a8d56f1e49b82b6ccba Mon Sep 17 00:00:00 2001 From: Peter Buchegger Date: Sun, 6 Dec 2020 23:51:59 +0100 Subject: [PATCH 4/8] update config handling on project level --- .gitmodules | 2 +- lib | 1 - lib/Common | 1 + src/LoRa_APRS_iGate.cpp | 112 +++++++++++++++---------------- src/project_configuration.cpp | 109 ++++++++++++++++++++++++++++++ src/project_configuration.h | 121 ++++++++++++++++++++++++++++++++++ 6 files changed, 288 insertions(+), 58 deletions(-) delete mode 160000 lib create mode 160000 lib/Common create mode 100644 src/project_configuration.cpp create mode 100644 src/project_configuration.h diff --git a/.gitmodules b/.gitmodules index 37a6bca..2a34780 100644 --- a/.gitmodules +++ b/.gitmodules @@ -1,3 +1,3 @@ [submodule "lib"] - path = lib + path = lib/Common url = ../LoRa_APRS_Common diff --git a/lib b/lib deleted file mode 160000 index 757733b..0000000 --- a/lib +++ /dev/null @@ -1 +0,0 @@ -Subproject commit 757733be04730095a27be008363b4f51dd68bacb diff --git a/lib/Common b/lib/Common new file mode 160000 index 0000000..ae8be81 --- /dev/null +++ b/lib/Common @@ -0,0 +1 @@ +Subproject commit ae8be81399487ba62ea04bc771d2c628c41135c4 diff --git a/src/LoRa_APRS_iGate.cpp b/src/LoRa_APRS_iGate.cpp index 51c1c17..bde09dc 100644 --- a/src/LoRa_APRS_iGate.cpp +++ b/src/LoRa_APRS_iGate.cpp @@ -17,7 +17,7 @@ #include "pins.h" #include "display.h" -#include "configuration.h" +#include "project_configuration.h" #if defined(ARDUINO_T_Beam) && !defined(ARDUINO_T_Beam_V0_7) #include "power_management.h" @@ -35,7 +35,7 @@ WiFiMulti WiFiMulti; WiFiUDP ntpUDP; NTPClient timeClient(ntpUDP, 60*60); FTPServer ftpServer; -Configuration Config; +Configuration * Config; APRS_IS * aprs_is = 0; LoRa_APRS lora_aprs; std::shared_ptr BeaconMsg; @@ -97,7 +97,7 @@ void setup() setup_ftp(); setup_aprs_is(); #else - if(Config.wifi.active) + if(Config->wifi.active) { setup_wifi(); setup_ota(); @@ -110,14 +110,14 @@ void setup() WiFi.mode(WIFI_OFF); btStop(); } - if(Config.aprs_is.active) setup_aprs_is(); + if(Config->aprs_is.active) setup_aprs_is(); #endif setup_timer(); - if(Config.display.overwritePin != 0) + if(Config->display.overwritePin != 0) { - pinMode(Config.display.overwritePin, INPUT); - pinMode(Config.display.overwritePin, INPUT_PULLUP); + pinMode(Config->display.overwritePin, INPUT); + pinMode(Config->display.overwritePin, INPUT_PULLUP); } delay(500); @@ -129,37 +129,37 @@ void setup() void loop() { static bool display_is_on = true; - if(Config.display.overwritePin != 0 && !digitalRead(Config.display.overwritePin)) + if(Config->display.overwritePin != 0 && !digitalRead(Config->display.overwritePin)) { secondsSinceDisplay = 0; display_is_on = true; setup_display(); } else - if(!Config.display.alwaysOn && secondsSinceDisplay > Config.display.timeout && display_is_on) + if(!Config->display.alwaysOn && secondsSinceDisplay > Config->display.timeout && display_is_on) { turn_off_display(); display_is_on = false; } - static bool beacon_aprs_is = Config.aprs_is.active && Config.aprs_is.beacon; - static bool beacon_digi = Config.digi.active && Config.digi.beacon; + static bool beacon_aprs_is = Config->aprs_is.active && Config->aprs_is.beacon; + static bool beacon_digi = Config->digi.active && Config->digi.beacon; - if(Config.aprs_is.active && Config.aprs_is.beacon && secondsSinceLastAPRSISBeacon >= (Config.aprs_is.beaconTimeout*60)) + if(Config->aprs_is.active && Config->aprs_is.beacon && secondsSinceLastAPRSISBeacon >= (Config->aprs_is.beaconTimeout*60)) { portENTER_CRITICAL(&timerMux); - secondsSinceLastAPRSISBeacon -= (Config.aprs_is.beaconTimeout*60); + secondsSinceLastAPRSISBeacon -= (Config->aprs_is.beaconTimeout*60); portEXIT_CRITICAL(&timerMux); beacon_aprs_is = true; } - if(Config.digi.active && Config.digi.beacon && secondsSinceLastDigiBeacon >= (Config.digi.beaconTimeout*60)) + if(Config->digi.active && Config->digi.beacon && secondsSinceLastDigiBeacon >= (Config->digi.beaconTimeout*60)) { portENTER_CRITICAL(&timerMux); - secondsSinceLastDigiBeacon -= (Config.digi.beaconTimeout*60); + secondsSinceLastDigiBeacon -= (Config->digi.beaconTimeout*60); portEXIT_CRITICAL(&timerMux); beacon_digi = true; } - if(Config.ftp.active) + if(Config->ftp.active) { ftpServer.handle(); static bool configWasOpen = false; @@ -175,8 +175,8 @@ void loop() } } - if(Config.wifi.active || eth_connected) ArduinoOTA.handle(); - if(Config.wifi.active && WiFiMulti.run() != WL_CONNECTED) + if(Config->wifi.active || eth_connected) ArduinoOTA.handle(); + if(Config->wifi.active && WiFiMulti.run() != WL_CONNECTED) { setup_display(); secondsSinceDisplay = 0; display_is_on = true; logPrintlnE("WiFi not connected!"); @@ -184,15 +184,15 @@ void loop() delay(1000); return; } - if((eth_connected && !aprs_is->connected()) || (Config.aprs_is.active && !aprs_is->connected())) + if((eth_connected && !aprs_is->connected()) || (Config->aprs_is.active && !aprs_is->connected())) { setup_display(); secondsSinceDisplay = 0; display_is_on = true; logPrintI("connecting to APRS-IS server: "); - logPrintI(Config.aprs_is.server); + logPrintI(Config->aprs_is.server); logPrintI(" on port: "); - logPrintlnI(String(Config.aprs_is.port)); + logPrintlnI(String(Config->aprs_is.port)); show_display("INFO", "Connecting to APRS-IS server"); - if(!aprs_is->connect(Config.aprs_is.server, Config.aprs_is.port)) + if(!aprs_is->connect(Config->aprs_is.server, Config->aprs_is.port)) { logPrintlnE("Connection failed."); logPrintlnI("Waiting 5 seconds before retrying..."); @@ -202,7 +202,7 @@ void loop() } logPrintlnI("Connected to APRS-IS server!"); } - if(Config.aprs_is.active && aprs_is->available() > 0) + if(Config->aprs_is.active && aprs_is->available() > 0) { String str = aprs_is->getMessage(); logPrintD("[" + timeClient.getFormattedTime() + "] "); @@ -213,7 +213,7 @@ void loop() std::shared_ptr msg = lora_aprs.getMessage(); setup_display(); secondsSinceDisplay = 0; display_is_on = true; - show_display(Config.callsign, timeClient.getFormattedTime() + " LoRa", "RSSI: " + String(lora_aprs.packetRssi()) + ", SNR: " + String(lora_aprs.packetSnr()), msg->toString()); + show_display(Config->callsign, timeClient.getFormattedTime() + " LoRa", "RSSI: " + String(lora_aprs.packetRssi()) + ", SNR: " + String(lora_aprs.packetSnr()), msg->toString()); logPrintD("[" + timeClient.getFormattedTime() + "] "); logPrintD(" Received packet '"); logPrintD(msg->toString()); @@ -222,13 +222,13 @@ void loop() logPrintD(" and SNR "); logPrintlnD(String(lora_aprs.packetSnr())); - if(Config.aprs_is.active) + if(Config->aprs_is.active) { aprs_is->sendMessage(msg->encode()); } - if(Config.digi.active) + if(Config->digi.active) { - if(msg->getSource().indexOf(Config.callsign) != -1) + if(msg->getSource().indexOf(Config->callsign) != -1) { logPrintD("Message already received as repeater: '"); logPrintD(msg->toString()); @@ -254,14 +254,14 @@ void loop() if(foundMsg == lastMessages.end()) { setup_display(); secondsSinceDisplay = 0; display_is_on = true; - show_display(Config.callsign, "RSSI: " + String(lora_aprs.packetRssi()) + ", SNR: " + String(lora_aprs.packetSnr()), msg->toString(), 0); + show_display(Config->callsign, "RSSI: " + String(lora_aprs.packetRssi()) + ", SNR: " + String(lora_aprs.packetSnr()), msg->toString(), 0); logPrintD("Received packet '"); logPrintD(msg->toString()); logPrintD("' with RSSI "); logPrintD(String(lora_aprs.packetRssi())); logPrintD(" and SNR "); logPrintlnD(String(lora_aprs.packetSnr())); - msg->setPath(String(Config.callsign) + "*"); + msg->setPath(String(Config->callsign) + "*"); lora_aprs.sendMessage(msg); lastMessages.insert({secondsSinceStartup, msg}); } @@ -277,11 +277,11 @@ void loop() return; } } - if(Config.digi.active) + if(Config->digi.active) { for(std::map>::iterator iter = lastMessages.begin(); iter != lastMessages.end(); ) { - if(secondsSinceStartup >= iter->first + Config.digi.forwardTimeout*60) + if(secondsSinceStartup >= iter->first + Config->digi.forwardTimeout*60) { iter = lastMessages.erase(iter); } @@ -295,30 +295,30 @@ void loop() { beacon_digi = false; setup_display(); secondsSinceDisplay = 0; display_is_on = true; - show_display(Config.callsign, "Beacon to HF..."); + show_display(Config->callsign, "Beacon to HF..."); logPrintD("[" + timeClient.getFormattedTime() + "] "); logPrintlnD(BeaconMsg->encode()); lora_aprs.sendMessage(BeaconMsg); logPrintlnD("finished TXing..."); - show_display(Config.callsign, "Standby..."); + show_display(Config->callsign, "Standby..."); } if(beacon_aprs_is) { beacon_aprs_is = false; setup_display(); secondsSinceDisplay = 0; display_is_on = true; - show_display(Config.callsign, "Beacon to APRS-IS Server..."); + show_display(Config->callsign, "Beacon to APRS-IS Server..."); logPrintD("[" + timeClient.getFormattedTime() + "] "); logPrintlnD(BeaconMsg->encode()); aprs_is->sendMessage(BeaconMsg); - show_display(Config.callsign, "Standby..."); + show_display(Config->callsign, "Standby..."); } } void load_config() { - ConfigurationManagement confmg("/is-cfg.json"); + ProjectConfigurationManagement confmg; Config = confmg.readConfiguration(); - if(Config.callsign == "NOCALL-10") + if(Config->callsign == "NOCALL-10") { logPrintlnE("You have to change your settings in 'data/is-cfg.json' and upload it via \"Upload File System image\"!"); show_display("ERROR", "You have to change your settings in 'data/is-cfg.json' and upload it via \"Upload File System image\"!"); @@ -327,7 +327,7 @@ void load_config() } #ifndef ETH_BOARD - if(Config.aprs_is.active && !Config.wifi.active) + if(Config->aprs_is.active && !Config->wifi.active) { logPrintlnE("You have to activate Wifi for APRS IS to work, please check your settings!"); show_display("ERROR", "You have to activate Wifi for APRS IS to work, please check your settings!"); @@ -336,9 +336,9 @@ void load_config() } #endif - if(KEY_BUILTIN != 0 && Config.display.overwritePin == 0) + if(KEY_BUILTIN != 0 && Config->display.overwritePin == 0) { - Config.display.overwritePin = KEY_BUILTIN; + Config->display.overwritePin = KEY_BUILTIN; } logPrintlnI("Configuration loaded!"); } @@ -403,8 +403,8 @@ void setup_eth() void setup_wifi() { WiFi.config(INADDR_NONE, INADDR_NONE, INADDR_NONE); - WiFi.setHostname(Config.callsign.c_str()); - for(Configuration::Wifi::AP ap : Config.wifi.APs) + WiFi.setHostname(Config->callsign.c_str()); + for(Configuration::Wifi::AP ap : Config->wifi.APs) { logPrintD("Looking for AP: "); logPrintlnD(ap.SSID); @@ -459,34 +459,34 @@ void setup_ota() else if (error == OTA_RECEIVE_ERROR) Serial.println("Receive Failed"); else if (error == OTA_END_ERROR) Serial.println("End Failed"); }); - ArduinoOTA.setHostname(Config.callsign.c_str()); + ArduinoOTA.setHostname(Config->callsign.c_str()); ArduinoOTA.begin(); logPrintlnI("OTA init done!"); } void setup_lora() { - lora_aprs.setRxFrequency(Config.lora.frequencyRx); - lora_aprs.setTxFrequency(Config.lora.frequencyTx); + lora_aprs.setRxFrequency(Config->lora.frequencyRx); + lora_aprs.setTxFrequency(Config->lora.frequencyTx); if (!lora_aprs.begin(lora_aprs.getRxFrequency())) { logPrintlnE("Starting LoRa failed!"); show_display("ERROR", "Starting LoRa failed!"); while (1); } - lora_aprs.setTxPower(Config.lora.power); - lora_aprs.setSpreadingFactor(Config.lora.spreadingFactor); - lora_aprs.setSignalBandwidth(Config.lora.signalBandwidth); - lora_aprs.setCodingRate4(Config.lora.codingRate4); + lora_aprs.setTxPower(Config->lora.power); + lora_aprs.setSpreadingFactor(Config->lora.spreadingFactor); + lora_aprs.setSignalBandwidth(Config->lora.signalBandwidth); + lora_aprs.setCodingRate4(Config->lora.codingRate4); logPrintlnI("LoRa init done!"); show_display("INFO", "LoRa init done!", 2000); BeaconMsg = std::shared_ptr(new APRSMessage()); - BeaconMsg->setSource(Config.callsign); + BeaconMsg->setSource(Config->callsign); BeaconMsg->setDestination("APLG0"); - String lat = create_lat_aprs(Config.beacon.positionLatitude); - String lng = create_long_aprs(Config.beacon.positionLongitude); - BeaconMsg->getAPRSBody()->setData(String("=") + lat + "I" + lng + "&" + Config.beacon.message); + String lat = create_lat_aprs(Config->beacon.positionLatitude); + String lng = create_long_aprs(Config->beacon.positionLongitude); + BeaconMsg->getAPRSBody()->setData(String("=") + lat + "I" + lng + "&" + Config->beacon.message); } void setup_ntp() @@ -503,7 +503,7 @@ void setup_ntp() void setup_aprs_is() { - aprs_is = new APRS_IS(Config.callsign, Config.aprs_is.password , "ESP32-APRS-IS", "0.1"); + aprs_is = new APRS_IS(Config->callsign, Config->aprs_is.password , "ESP32-APRS-IS", "0.1"); } void IRAM_ATTR onTimer() @@ -526,11 +526,11 @@ void setup_timer() void setup_ftp() { - if(!Config.ftp.active) + if(!Config->ftp.active) { return; } - for(Configuration::Ftp::User user : Config.ftp.users) + for(Configuration::Ftp::User user : Config->ftp.users) { logPrintD("Adding user to FTP Server: "); logPrintlnD(user.name); diff --git a/src/project_configuration.cpp b/src/project_configuration.cpp new file mode 100644 index 0000000..6cfaec8 --- /dev/null +++ b/src/project_configuration.cpp @@ -0,0 +1,109 @@ +#include + +#include "project_configuration.h" +#include "logger.h" + +Configuration * ProjectConfigurationManagement::readProjectConfiguration(DynamicJsonDocument & data) +{ + Configuration * conf = new Configuration; + if(data.containsKey("callsign")) + conf->callsign = data["callsign"].as(); + + conf->wifi.active = data["wifi"]["active"] | false; + JsonArray aps = data["wifi"]["AP"].as(); + for(JsonVariant v : aps) + { + Configuration::Wifi::AP ap; + ap.SSID = v["SSID"].as(); + ap.password = v["password"].as(); + conf->wifi.APs.push_back(ap); + } + if(data.containsKey("beacon") && data["beacon"].containsKey("message")) + conf->beacon.message = data["beacon"]["message"].as(); + conf->beacon.positionLatitude = data["beacon"]["position"]["latitude"] | 0.0; + conf->beacon.positionLongitude = data["beacon"]["position"]["longitude"] | 0.0; + conf->aprs_is.active = data["aprs_is"]["active"] | false; + if(data.containsKey("aprs_is") && data["aprs_is"].containsKey("password")) + conf->aprs_is.password = data["aprs_is"]["password"].as(); + if(data.containsKey("aprs_is") && data["aprs_is"].containsKey("server")) + conf->aprs_is.server = data["aprs_is"]["server"].as(); + conf->aprs_is.port = data["aprs_is"]["port"] | 14580; + conf->aprs_is.beacon = data["aprs_is"]["beacon"] | true; + conf->aprs_is.beaconTimeout = data["aprs_is"]["beacon_timeout"] | 15; + conf->digi.active = data["digi"]["active"] | false; + conf->digi.forwardTimeout = data["digi"]["forward_timeout"] | 5; + conf->digi.beacon = data["digi"]["beacon"] | true; + conf->digi.beaconTimeout = data["digi"]["beacon_timeout"] | 30; + + conf->lora.frequencyRx = data["lora"]["frequency_rx"] | 433775000; + conf->lora.frequencyTx = data["lora"]["frequency_tx"] | 433775000; + conf->lora.power = data["lora"]["power"] | 20; + conf->lora.spreadingFactor = data["lora"]["spreading_factor"] | 12; + conf->lora.signalBandwidth = data["lora"]["signal_bandwidth"] | 125000; + conf->lora.codingRate4 = data["lora"]["coding_rate4"] | 5; + conf->display.alwaysOn = data["display"]["always_on"] | true; + conf->display.timeout = data["display"]["timeout"] | 10; + conf->display.overwritePin = data["display"]["overwrite_pin"] | 0; + + conf->ftp.active = data["ftp"]["active"] | false; + JsonArray users = data["ftp"]["user"].as(); + for(JsonVariant u : users) + { + Configuration::Ftp::User us; + us.name = u["name"].as(); + us.password = u["password"].as(); + conf->ftp.users.push_back(us); + } + if(conf->ftp.users.empty()) + { + Configuration::Ftp::User us; + us.name = "ftp"; + us.password = "ftp"; + conf->ftp.users.push_back(us); + } + + return conf; +} + +void ProjectConfigurationManagement::writeProjectConfiguration(Configuration * conf, DynamicJsonDocument & data) +{ + data["callsign"] = conf->callsign; + data["wifi"]["active"] = conf->wifi.active; + JsonArray aps = data["wifi"].createNestedArray("AP"); + for(Configuration::Wifi::AP ap : conf->wifi.APs) + { + JsonObject v = aps.createNestedObject(); + v["SSID"] = ap.SSID; + v["password"] = ap.password; + } + data["beacon"]["message"] = conf->beacon.message; + data["beacon"]["position"]["latitude"] = conf->beacon.positionLatitude; + data["beacon"]["position"]["longitude"] = conf->beacon.positionLongitude; + data["aprs_is"]["active"] = conf->aprs_is.active; + data["aprs_is"]["password"] = conf->aprs_is.password; + data["aprs_is"]["server"] = conf->aprs_is.server; + data["aprs_is"]["port"] = conf->aprs_is.port; + data["aprs_is"]["beacon"] = conf->aprs_is.beacon; + data["aprs_is"]["beacon_timeout"] = conf->aprs_is.beaconTimeout; + data["digi"]["active"] = conf->digi.active; + data["digi"]["forward_timeout"] = conf->digi.forwardTimeout; + data["digi"]["beacon"] = conf->digi.beacon; + data["digi"]["beacon_timeout"] = conf->digi.beaconTimeout; + data["lora"]["frequency_rx"] = conf->lora.frequencyRx; + data["lora"]["frequency_tx"] = conf->lora.frequencyTx; + data["lora"]["power"] = conf->lora.power; + data["lora"]["spreading_factor"] = conf->lora.spreadingFactor; + data["lora"]["signal_bandwidth"] = conf->lora.signalBandwidth; + data["lora"]["coding_rate4"] = conf->lora.codingRate4; + data["display"]["always_on"] = conf->display.alwaysOn; + data["display"]["timeout"] = conf->display.timeout; + data["display"]["overwrite_pin"] = conf->display.overwritePin; + data["ftp"]["active"] = conf->ftp.active; + JsonArray users = data["ftp"].createNestedArray("user"); + for(Configuration::Ftp::User u : conf->ftp.users) + { + JsonObject v = users.createNestedObject(); + v["name"] = u.name; + v["password"] = u.password; + } +} diff --git a/src/project_configuration.h b/src/project_configuration.h new file mode 100644 index 0000000..5a65724 --- /dev/null +++ b/src/project_configuration.h @@ -0,0 +1,121 @@ +#ifndef PROJECT_CONFIGURATION_H_ +#define PROJECT_CONFIGURATION_H_ + +#include "configuration.h" + +class Configuration +{ +public: + class Wifi + { + public: + class AP + { + public: + String SSID; + String password; + }; + + Wifi() : active(false) {} + + bool active; + std::list APs; + }; + + class Beacon + { + public: + Beacon() : message("LoRa iGATE & Digi, Info: github.com/peterus/LoRa_APRS_iGate"), positionLatitude(0.0), positionLongitude(0.0) {} + + String message; + double positionLatitude; + double positionLongitude; + }; + + class APRS_IS + { + public: + APRS_IS() : active(false), server("euro.aprs2.net"), port(14580), beacon(true), beaconTimeout(15) {} + + bool active; + String password; + String server; + int port; + bool beacon; + int beaconTimeout; + }; + + class Digi + { + public: + Digi() : active(false), forwardTimeout(5), beacon(true), beaconTimeout(30) {} + + bool active; + int forwardTimeout; + bool beacon; + int beaconTimeout; + }; + + class LoRa + { + public: + LoRa() : frequencyRx(433775000), frequencyTx(433775000), power(20), spreadingFactor(12), signalBandwidth(125000), codingRate4(5) {} + + long frequencyRx; + long frequencyTx; + int power; + int spreadingFactor; + long signalBandwidth; + int codingRate4; + }; + + class Display + { + public: + Display() : alwaysOn(true), timeout(10), overwritePin(0) {} + + bool alwaysOn; + int timeout; + int overwritePin; + }; + + class Ftp + { + public: + class User + { + public: + String name; + String password; + }; + + Ftp() : active(false) {} + + bool active; + std::list users; + }; + + Configuration() : callsign("NOCALL-10") {}; + + String callsign; + Wifi wifi; + Beacon beacon; + APRS_IS aprs_is; + Digi digi; + LoRa lora; + Display display; + Ftp ftp; +}; + +class ProjectConfigurationManagement : public ConfigurationManagement +{ +public: + explicit ProjectConfigurationManagement() : ConfigurationManagement("/is-cfg.json") {} + virtual ~ProjectConfigurationManagement() {} + +private: + virtual Configuration * readProjectConfiguration(DynamicJsonDocument & data); + virtual void writeProjectConfiguration(Configuration * conf, DynamicJsonDocument & data); +}; + +#endif From 9a9b494ab9fa9c892174bc18a0197aaa3fb8bf4d Mon Sep 17 00:00:00 2001 From: Peter Buchegger Date: Sun, 6 Dec 2020 23:54:35 +0100 Subject: [PATCH 5/8] lib update --- lib/Common | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/Common b/lib/Common index ae8be81..87d7cb9 160000 --- a/lib/Common +++ b/lib/Common @@ -1 +1 @@ -Subproject commit ae8be81399487ba62ea04bc771d2c628c41135c4 +Subproject commit 87d7cb9c81d691acb3a22a0b26ca071be56d1816 From 89f55526b95dcca9da0ca3016d8812523792ca48 Mon Sep 17 00:00:00 2001 From: Peter Buchegger Date: Fri, 11 Dec 2020 00:46:23 +0100 Subject: [PATCH 6/8] Create auto_assign.yml --- .github/auto_assign.yml | 9 +++++++++ 1 file changed, 9 insertions(+) create mode 100644 .github/auto_assign.yml diff --git a/.github/auto_assign.yml b/.github/auto_assign.yml new file mode 100644 index 0000000..7b01d44 --- /dev/null +++ b/.github/auto_assign.yml @@ -0,0 +1,9 @@ +# Set to true to add reviewers to pull requests +addReviewers: true + +# Set to true to add assignees to pull requests +addAssignees: true + +# A list of reviewers to be added to pull requests (GitHub user name) +reviewers: + - peterus From 3eb24519c6e4aeb00f61958da2558f08738a2184 Mon Sep 17 00:00:00 2001 From: Peter Buchegger Date: Fri, 11 Dec 2020 01:12:48 +0100 Subject: [PATCH 7/8] Update issue templates --- .github/ISSUE_TEMPLATE/bug_report.md | 35 +++++++++++++++++++++++ .github/ISSUE_TEMPLATE/feature_request.md | 20 +++++++++++++ 2 files changed, 55 insertions(+) create mode 100644 .github/ISSUE_TEMPLATE/bug_report.md create mode 100644 .github/ISSUE_TEMPLATE/feature_request.md diff --git a/.github/ISSUE_TEMPLATE/bug_report.md b/.github/ISSUE_TEMPLATE/bug_report.md new file mode 100644 index 0000000..b4c7c0e --- /dev/null +++ b/.github/ISSUE_TEMPLATE/bug_report.md @@ -0,0 +1,35 @@ +--- +name: Bug report +about: Create a report to help us improve +title: '' +labels: bug +assignees: peterus + +--- + +**Describe the bug** +A clear and concise description of what the bug is. + +**To Reproduce** +Steps to reproduce the behavior: +1. Go to '...' +2. Click on '....' +3. Scroll down to '....' +4. See error + +**Expected behavior** +A clear and concise description of what you expected to happen. + +**Screenshots** +If applicable, add screenshots to help explain your problem. + +**Desktop (please complete the following information):** + - OS: + - PlatformIO Version: + - Firmware Version: + +**Board name:** +- + +**Additional context** +Add any other context about the problem here. diff --git a/.github/ISSUE_TEMPLATE/feature_request.md b/.github/ISSUE_TEMPLATE/feature_request.md new file mode 100644 index 0000000..620755e --- /dev/null +++ b/.github/ISSUE_TEMPLATE/feature_request.md @@ -0,0 +1,20 @@ +--- +name: Feature request +about: Suggest an idea for this project +title: '' +labels: enhancement +assignees: peterus + +--- + +**Is your feature request related to a problem? Please describe.** +A clear and concise description of what the problem is. Ex. I'm always frustrated when [...] + +**Describe the solution you'd like** +A clear and concise description of what you want to happen. + +**Describe alternatives you've considered** +A clear and concise description of any alternative solutions or features you've considered. + +**Additional context** +Add any other context or screenshots about the feature request here. From 7ae1238fe625dc5540ef5e3ff3877ab5e79bd681 Mon Sep 17 00:00:00 2001 From: Peter Buchegger Date: Sun, 13 Dec 2020 22:05:53 +0100 Subject: [PATCH 8/8] working cppcheck --- .github/workflows/build_check.yml | 2 +- .gitmodules | 2 +- lib/{Common => common} | 0 platformio.ini | 2 +- src/project_configuration.h | 4 ++-- 5 files changed, 5 insertions(+), 5 deletions(-) rename lib/{Common => common} (100%) diff --git a/.github/workflows/build_check.yml b/.github/workflows/build_check.yml index 7034fd3..3298f0b 100644 --- a/.github/workflows/build_check.yml +++ b/.github/workflows/build_check.yml @@ -18,7 +18,7 @@ jobs: - uses: actions/checkout@v2 with: submodules: 'recursive' - - run: platformio check --fail-on-defect low --fail-on-defect medium --fail-on-defect high --skip-packages --flags "--suppress=*:*.pio\* --inline-suppr" -v + - run: platformio check --fail-on-defect low --fail-on-defect medium --fail-on-defect high --skip-packages --flags "--suppress=*:*.pio\* --inline-suppr lib/common/src" -v PlatformIO-Build: runs-on: ubuntu-latest diff --git a/.gitmodules b/.gitmodules index 2a34780..e8683d4 100644 --- a/.gitmodules +++ b/.gitmodules @@ -1,3 +1,3 @@ [submodule "lib"] - path = lib/Common + path = lib/common url = ../LoRa_APRS_Common diff --git a/lib/Common b/lib/common similarity index 100% rename from lib/Common rename to lib/common diff --git a/platformio.ini b/platformio.ini index d03274d..5a3bcde 100644 --- a/platformio.ini +++ b/platformio.ini @@ -16,7 +16,7 @@ lib_deps = peterus/LoRa-APRS-Lib @ 0.0.5 check_tool = cppcheck check_flags = - cppcheck: --suppress=*:*.pio\* --inline-suppr + cppcheck: --suppress=*:*.pio\* --inline-suppr lib/common/src monitor_flags = --raw # activate for OTA Update, use the CALLSIGN from is-cfg.h as upload_port: #upload_protocol = espota diff --git a/src/project_configuration.h b/src/project_configuration.h index 5a65724..1e8a71a 100644 --- a/src/project_configuration.h +++ b/src/project_configuration.h @@ -114,8 +114,8 @@ public: virtual ~ProjectConfigurationManagement() {} private: - virtual Configuration * readProjectConfiguration(DynamicJsonDocument & data); - virtual void writeProjectConfiguration(Configuration * conf, DynamicJsonDocument & data); + virtual Configuration * readProjectConfiguration(DynamicJsonDocument & data) override; + virtual void writeProjectConfiguration(Configuration * conf, DynamicJsonDocument & data) override; }; #endif