diff --git a/src/LoRa_APRS_Tracker.cpp b/src/LoRa_APRS_Tracker.cpp index 442d93b..9498abf 100644 --- a/src/LoRa_APRS_Tracker.cpp +++ b/src/LoRa_APRS_Tracker.cpp @@ -15,8 +15,9 @@ #include "display.h" #include "pins.h" #include "power_management.h" +#include "lora_utils.h" -#define VERSION "2023.06.02" +#define VERSION "2023.06.03" logging::Logger logger; @@ -30,10 +31,6 @@ OneButton userButton = OneButton(BUTTON_PIN, true, true); HardwareSerial neo6m_gps(1); TinyGPSPlus gps; -void validateConfigFile(); -void setup_lora(); -void setup_gps(); - char *ax25_base91enc(char *s, uint8_t n, uint32_t v); String createDateString(time_t t); String createTimeString(time_t t); @@ -90,29 +87,6 @@ void setup_gps() { neo6m_gps.begin(9600, SERIAL_8N1, GPS_TX, GPS_RX); } -void setup_lora() { - logger.log(logging::LoggerLevel::LOGGER_LEVEL_INFO, "LoRa", "Set SPI pins!"); - SPI.begin(LORA_SCK, LORA_MISO, LORA_MOSI, LORA_CS); - logger.log(logging::LoggerLevel::LOGGER_LEVEL_INFO, "LoRa", "Set LoRa pins!"); - LoRa.setPins(LORA_CS, LORA_RST, LORA_IRQ); - - long freq = Config.loramodule.frequency; - logger.log(logging::LoggerLevel::LOGGER_LEVEL_INFO, "LoRa", "frequency: %d", freq); - if (!LoRa.begin(freq)) { - logger.log(logging::LoggerLevel::LOGGER_LEVEL_ERROR, "LoRa", "Starting LoRa failed!"); - show_display("ERROR", "Starting LoRa failed!"); - while (true) { - } - } - LoRa.setSpreadingFactor(Config.loramodule.spreadingFactor); - LoRa.setSignalBandwidth(Config.loramodule.signalBandwidth); - LoRa.setCodingRate4(Config.loramodule.codingRate4); - LoRa.enableCrc(); - - LoRa.setTxPower(Config.loramodule.power); - logger.log(logging::LoggerLevel::LOGGER_LEVEL_INFO, "LoRa", "LoRa init done!"); -} - void loadMessagesFromMemory() { File fileToRead; noMessageWarning = false; @@ -144,15 +118,6 @@ void deleteFile() { SPIFFS.remove("/aprsMessages.txt"); } -void sendNewLoraPacket(String newPacket) { - LoRa.beginPacket(); - LoRa.write('<'); - LoRa.write(0xFF); - LoRa.write(0x01); - LoRa.write((const uint8_t *)newPacket.c_str(), newPacket.length()); - LoRa.endPacket(); -} - void sendMessage(String station, String textMessage) { String messageToSend; for(int i = station.length(); i < 9; i++) { @@ -167,7 +132,7 @@ void sendMessage(String station, String textMessage) { } else { show_display("MSG Tx >>", "", messageToSend, 1000); } - sendNewLoraPacket(messageToSend); + LoRaUtils::sendNewPacket(messageToSend); } static void ButtonSinglePress() { @@ -249,7 +214,7 @@ static void ButtonDoublePress() { void startingStatus() { delay(2000); - sendNewLoraPacket(currentBeacon->callsign + ">" + Config.destination + "," + Config.path + ":>" + Config.defaultStatus); + LoRaUtils::sendNewPacket(currentBeacon->callsign + ">" + Config.destination + "," + Config.path + ":>" + Config.defaultStatus); statusAfterBootState = false; } @@ -714,10 +679,10 @@ void setup() { setup_display(); show_display(" LoRa APRS", "", " Richonguzman", " -- CD2RXU --", "", " " VERSION, 4000); - validateConfigFile(); + Config.validateConfigFile(currentBeacon->callsign); loadNumMessages(); setup_gps(); - setup_lora(); + LoRaUtils::setup(); WiFi.mode(WIFI_OFF); btStop(); @@ -942,7 +907,7 @@ void loop() { logger.log(logging::LoggerLevel::LOGGER_LEVEL_DEBUG, "Loop", "%s", data.c_str()); show_display("<<< TX >>>", "", data); - sendNewLoraPacket(data); + LoRaUtils::sendNewPacket(data); if (currentBeacon->smartBeaconState) { lastTxLat = gps.location.lat(); @@ -1074,14 +1039,6 @@ void loop() { } /// FUNCTIONS /// -void validateConfigFile() { - if (currentBeacon->callsign == "NOCALL-7") { - logger.log(logging::LoggerLevel::LOGGER_LEVEL_ERROR, "Config", "Change your settings in 'data/tracker_config.json' and upload it via 'Upload File System image'"); - show_display("ERROR", "Change your settings", "'tracker_config.json'", "upload it via --> ", "'Upload File System image'"); - while (true) {} - } -} - char *ax25_base91enc(char *s, uint8_t n, uint32_t v) { /* Creates a Base-91 representation of the value in v in the string */ /* pointed to by s, n-characters long. String length should be n+1. */ diff --git a/src/configuration.cpp b/src/configuration.cpp new file mode 100644 index 0000000..c03e29c --- /dev/null +++ b/src/configuration.cpp @@ -0,0 +1,75 @@ +#include "configuration.h" +#include "logger.h" +#include "display.h" + +extern logging::Logger logger; + +Configuration::Configuration(const String &filePath) { + _filePath = filePath; + if (!SPIFFS.begin(false)) { + Serial.println("SPIFFS Mount Failed"); + return; + } + readFile(SPIFFS, _filePath.c_str()); +} + +void Configuration::readFile(fs::FS &fs, const char *fileName) { + StaticJsonDocument<2048> data; + File configFile = fs.open(fileName, "r"); + DeserializationError error = deserializeJson(data, configFile); + if (error) { + Serial.println("Failed to read file, using default configuration"); + } + + JsonArray BeaconsArray = data["beacons"]; + for (int i = 0; i < BeaconsArray.size(); i++) { + Beacon bcn; + + bcn.callsign = BeaconsArray[i]["callsign"].as(); + bcn.symbol = BeaconsArray[i]["symbol"].as(); + bcn.comment = BeaconsArray[i]["comment"].as(); + + bcn.smartBeaconState = BeaconsArray[i]["smart_beacon"]["active"].as(); + bcn.slowRate = BeaconsArray[i]["smart_beacon"]["slowRate"].as(); + bcn.slowSpeed = BeaconsArray[i]["smart_beacon"]["slowSpeed"].as(); + bcn.fastRate = BeaconsArray[i]["smart_beacon"]["fastRate"].as(); + bcn.fastSpeed = BeaconsArray[i]["smart_beacon"]["fastSpeed"].as(); + bcn.minTxDist = BeaconsArray[i]["smart_beacon"]["minTxDist"].as(); + bcn.minDeltaBeacon = BeaconsArray[i]["smart_beacon"]["minDeltaBeacon"].as(); + bcn.turnMinDeg = BeaconsArray[i]["smart_beacon"]["turnMinDeg"].as(); + bcn.turnSlope = BeaconsArray[i]["smart_beacon"]["turnSlope"].as(); + + beacons.push_back(bcn); + } + + loramodule.frequency = data["lora"]["frequency"].as(); + loramodule.spreadingFactor = data["lora"]["spreadingFactor"].as(); + loramodule.signalBandwidth = data["lora"]["signalBandwidth"].as(); + loramodule.codingRate4 = data["lora"]["codingRate4"].as(); + loramodule.power = data["lora"]["power"].as(); + + displayEcoMode = data["other"]["displayEcoMode"].as(); + displayTimeout = data["other"]["displayTimeout"].as(); + destination = data["other"]["destination"].as(); + path = data["other"]["path"].as(); + overlay = data["other"]["overlay"].as(); + nonSmartBeaconRate = data["other"]["nonSmartBeaconRate"].as(); + listeningTrackerTime = data["other"]["listeningTrackerTime"].as(); + maxDistanceToTracker = data["other"]["maxDistanceToTracker"].as(); + defaultStatusAfterBoot = data["other"]["defaultStatusAfterBoot"].as(); + defaultStatus = data["other"]["defaultStatus"].as(); + standingUpdateTime = data["other"]["standingUpdateTime"].as(); + sendAltitude = data["other"]["sendAltitude"].as(); + + configFile.close(); +} + +void Configuration::validateConfigFile(String currentBeaconCallsign) { + if (currentBeaconCallsign == "NOCALL-7") { + logger.log(logging::LoggerLevel::LOGGER_LEVEL_ERROR, "Config", "Change your settings in 'data/tracker_config.json' and upload it via 'Upload File System image'"); + show_display("ERROR", "Change your settings", "'tracker_config.json'", "upload it via --> ", "'Upload File System image'"); + while (true) { + delay(1000); + } + } +} \ No newline at end of file diff --git a/src/configuration.h b/src/configuration.h index d2aac75..c9e4983 100644 --- a/src/configuration.h +++ b/src/configuration.h @@ -32,7 +32,6 @@ public: int power; }; - class Configuration { public: @@ -49,74 +48,16 @@ public: int maxDistanceToTracker; bool defaultStatusAfterBoot; String defaultStatus; - bool ecoMode; bool standingUpdate; int standingUpdateTime; bool sendAltitude; - - Configuration(String &filePath) { - _filePath = filePath; - if (!SPIFFS.begin(false)) { - Serial.println("SPIFFS Mount Failed"); - return; - } - readFile(SPIFFS, _filePath.c_str()); - } + Configuration(const String &filePath); + void validateConfigFile(String currentBeaconCallsign); private: + Configuration() {}; // Hide default constructor + void readFile(fs::FS &fs, const char *fileName) ; String _filePath; - - void readFile(fs::FS &fs, const char *fileName) { - StaticJsonDocument<2048> data; - File configFile = fs.open(fileName, "r"); - DeserializationError error = deserializeJson(data, configFile); - if (error) { - Serial.println("Failed to read file, using default configuration"); - } - - JsonArray BeaconsArray = data["beacons"]; - for (int i = 0; i < BeaconsArray.size(); i++) { - Beacon bcn; - - bcn.callsign = BeaconsArray[i]["callsign"].as(); - bcn.symbol = BeaconsArray[i]["symbol"].as(); - bcn.comment = BeaconsArray[i]["comment"].as(); - - bcn.smartBeaconState = BeaconsArray[i]["smart_beacon"]["active"].as(); - bcn.slowRate = BeaconsArray[i]["smart_beacon"]["slowRate"].as(); - bcn.slowSpeed = BeaconsArray[i]["smart_beacon"]["slowSpeed"].as(); - bcn.fastRate = BeaconsArray[i]["smart_beacon"]["fastRate"].as(); - bcn.fastSpeed = BeaconsArray[i]["smart_beacon"]["fastSpeed"].as(); - bcn.minTxDist = BeaconsArray[i]["smart_beacon"]["minTxDist"].as(); - bcn.minDeltaBeacon = BeaconsArray[i]["smart_beacon"]["minDeltaBeacon"].as(); - bcn.turnMinDeg = BeaconsArray[i]["smart_beacon"]["turnMinDeg"].as(); - bcn.turnSlope = BeaconsArray[i]["smart_beacon"]["turnSlope"].as(); - - beacons.push_back(bcn); - } - - loramodule.frequency = data["lora"]["frequency"].as(); - loramodule.spreadingFactor = data["lora"]["spreadingFactor"].as(); - loramodule.signalBandwidth = data["lora"]["signalBandwidth"].as(); - loramodule.codingRate4 = data["lora"]["codingRate4"].as(); - loramodule.power = data["lora"]["power"].as(); - - displayEcoMode = data["other"]["displayEcoMode"].as(); - displayTimeout = data["other"]["displayTimeout"].as(); - destination = data["other"]["destination"].as(); - path = data["other"]["path"].as(); - overlay = data["other"]["overlay"].as(); - nonSmartBeaconRate = data["other"]["nonSmartBeaconRate"].as(); - listeningTrackerTime = data["other"]["listeningTrackerTime"].as(); - maxDistanceToTracker = data["other"]["maxDistanceToTracker"].as(); - defaultStatusAfterBoot = data["other"]["defaultStatusAfterBoot"].as(); - defaultStatus = data["other"]["defaultStatus"].as(); - ecoMode = data["other"]["ecoMode "].as(); - standingUpdateTime = data["other"]["standingUpdateTime"].as(); - sendAltitude = data["other"]["sendAltitude"].as(); - - configFile.close(); - } }; #endif \ No newline at end of file diff --git a/src/lora_utils.cpp b/src/lora_utils.cpp new file mode 100644 index 0000000..ac9f239 --- /dev/null +++ b/src/lora_utils.cpp @@ -0,0 +1,61 @@ +#include +#include +#include "configuration.h" +#include "display.h" + +extern logging::Logger logger; +extern Configuration Config; + +namespace LoRaUtils { + +void setup() { + logger.log(logging::LoggerLevel::LOGGER_LEVEL_INFO, "LoRa", "Set SPI pins!"); + SPI.begin(LORA_SCK, LORA_MISO, LORA_MOSI, LORA_CS); + logger.log(logging::LoggerLevel::LOGGER_LEVEL_INFO, "LoRa", "Set LoRa pins!"); + LoRa.setPins(LORA_CS, LORA_RST, LORA_IRQ); + + long freq = Config.loramodule.frequency; + logger.log(logging::LoggerLevel::LOGGER_LEVEL_INFO, "LoRa", "frequency: %d", freq); + if (!LoRa.begin(freq)) { + logger.log(logging::LoggerLevel::LOGGER_LEVEL_ERROR, "LoRa", "Starting LoRa failed!"); + show_display("ERROR", "Starting LoRa failed!"); + //displayUtils::show("ERROR", "Starting LoRa failed!"); + while (true) { + delay(1000); + } + } + LoRa.setSpreadingFactor(Config.loramodule.spreadingFactor); + LoRa.setSignalBandwidth(Config.loramodule.signalBandwidth); + LoRa.setCodingRate4(Config.loramodule.codingRate4); + LoRa.enableCrc(); + + LoRa.setTxPower(Config.loramodule.power); + logger.log(logging::LoggerLevel::LOGGER_LEVEL_INFO, "LoRa", "LoRa init done!"); +} + +void sendNewPacket(const String &newPacket) { + LoRa.beginPacket(); + LoRa.write('<'); + LoRa.write(0xFF); + LoRa.write(0x01); + LoRa.write((const uint8_t *)newPacket.c_str(), newPacket.length()); + LoRa.endPacket(); +} + + +/*String receivePacket() { + String loraPacket; + int packetSize = LoRa.parsePacket(); // Listening for LoRa Packets + if (packetSize) { + while (LoRa.available()) { + int inChar = LoRa.read(); + loraPacket += (char)inChar; + } + } + + return loraPacket; +}*/ + + + +} \ No newline at end of file diff --git a/src/lora_utils.h b/src/lora_utils.h new file mode 100644 index 0000000..1d022a5 --- /dev/null +++ b/src/lora_utils.h @@ -0,0 +1,11 @@ +#ifndef LORA_UTILS_H_ +#define LORA_UTILS_H_ + +namespace LoRaUtils { + +void setup(); +void sendNewPacket(const String &newPacket); +//String receivePacket(); + +} +#endif \ No newline at end of file