LoRa_APRS_Tracker111/src/LoRa_APRS_Tracker.cpp

236 lines
9.1 KiB
C++

/*__________________________________________________________________________________________________________________________________
██╗ ██████╗ ██████╗ █████╗ █████╗ ██████╗ ██████╗ ███████╗ ████████╗██████╗ █████╗ ██████╗██╗ ██╗███████╗██████╗
██║ ██╔═══██╗██╔══██╗██╔══██╗ ██╔══██╗██╔══██╗██╔══██╗██╔════╝ ╚══██╔══╝██╔══██╗██╔══██╗██╔════╝██║ ██╔╝██╔════╝██╔══██╗
██║ ██║ ██║██████╔╝███████║ ███████║██████╔╝██████╔╝███████╗ ██║ ██████╔╝███████║██║ █████╔╝ █████╗ ██████╔╝
██║ ██║ ██║██╔══██╗██╔══██║ ██╔══██║██╔═══╝ ██╔══██╗╚════██║ ██║ ██╔══██╗██╔══██║██║ ██╔═██╗ ██╔══╝ ██╔══██╗
███████╗╚██████╔╝██║ ██║██║ ██║ ██║ ██║██║ ██║ ██║███████║ ██║ ██║ ██║██║ ██║╚██████╗██║ ██╗███████╗██║ ██║
╚══════╝ ╚═════╝ ╚═╝ ╚═╝╚═╝ ╚═╝ ╚═╝ ╚═╝╚═╝ ╚═╝ ╚═╝╚══════╝ ╚═╝ ╚═╝ ╚═╝╚═╝ ╚═╝ ╚═════╝╚═╝ ╚═╝╚══════╝╚═╝ ╚═╝
Ricardo Guzman - CA2RXU
https://github.com/richonguzman/LoRa_APRS_Tracker
(donations : http://paypal.me/richonguzman)
__________________________________________________________________________________________________________________________________*/
#include <BluetoothSerial.h>
#include <OneButton.h>
#include <TinyGPS++.h>
#include <Arduino.h>
#include <logger.h>
#include <WiFi.h>
#include "APRSPacketLib.h"
#include "smartbeacon_utils.h"
#include "bluetooth_utils.h"
#include "keyboard_utils.h"
#include "configuration.h"
#include "station_utils.h"
#include "boards_pinout.h"
#include "button_utils.h"
#include "power_utils.h"
#include "sleep_utils.h"
#include "menu_utils.h"
#include "lora_utils.h"
#include "wifi_utils.h"
#include "msg_utils.h"
#include "gps_utils.h"
#include "web_utils.h"
#include "ble_utils.h"
#include "wx_utils.h"
#include "display.h"
#include "utils.h"
Configuration Config;
HardwareSerial gpsSerial(1);
TinyGPSPlus gps;
#ifdef HAS_BT_CLASSIC
BluetoothSerial SerialBT;
#endif
#ifdef BUTTON_PIN
OneButton userButton = OneButton(BUTTON_PIN, true, true);
#endif
String versionDate = "2024.10.11";
uint8_t myBeaconsIndex = 0;
int myBeaconsSize = Config.beacons.size();
Beacon *currentBeacon = &Config.beacons[myBeaconsIndex];
uint8_t loraIndex = 0;
int loraIndexSize = Config.loraTypes.size();
LoraType *currentLoRaType = &Config.loraTypes[loraIndex];
int menuDisplay = 100;
bool statusState = true;
bool displayEcoMode = Config.display.ecoMode;
bool displayState = true;
uint32_t displayTime = millis();
uint32_t refreshDisplayTime = millis();
bool sendUpdate = true;
bool bluetoothConnected = false;
bool sendBleToLoRa = false;
String BLEToLoRaPacket = "";
uint32_t lastTx = 0.0;
uint32_t txInterval = 60000L;
uint32_t lastTxTime = 0;
double lastTxLat = 0.0;
double lastTxLng = 0.0;
double lastTxDistance = 0.0;
uint32_t menuTime = millis();
bool flashlight = false;
bool digirepeaterActive = false;
bool sosActive = false;
bool miceActive = false;
bool smartBeaconActive = true;
int ackRequestNumber;
uint32_t lastGPSTime = 0;
APRSPacket lastReceivedPacket;
logging::Logger logger;
//#define DEBUG
extern bool gpsIsActive;
void setup() {
Serial.begin(115200);
#ifndef DEBUG
logger.setDebugLevel(logging::LoggerLevel::LOGGER_LEVEL_INFO);
#endif
POWER_Utils::setup();
displaySetup();
POWER_Utils::externalPinSetup();
STATION_Utils::loadIndex(0);
STATION_Utils::loadIndex(1);
STATION_Utils::nearTrackerInit();
startupScreen(loraIndex, versionDate);
WIFI_Utils::checkIfWiFiAP();
MSG_Utils::loadNumMessages();
GPS_Utils::setup();
currentLoRaType = &Config.loraTypes[loraIndex];
LoRa_Utils::setup();
WX_Utils::setup();
ackRequestNumber = random(1,999);
WiFi.mode(WIFI_OFF);
logger.log(logging::LoggerLevel::LOGGER_LEVEL_DEBUG, "Main", "WiFi controller stopped");
if (Config.bluetooth.type == 0 || Config.bluetooth.type == 2) {
BLE_Utils::setup();
} else {
#ifdef HAS_BT_CLASSIC
BLUETOOTH_Utils::setup();
#endif
}
if (!Config.simplifiedTrackerMode) {
#ifdef BUTTON_PIN
userButton.attachClick(BUTTON_Utils::singlePress);
userButton.attachLongPressStart(BUTTON_Utils::longPress);
userButton.attachDoubleClick(BUTTON_Utils::doublePress);
userButton.attachMultiClick(BUTTON_Utils::multiPress);
#endif
KEYBOARD_Utils::setup();
}
POWER_Utils::lowerCpuFrequency();
logger.log(logging::LoggerLevel::LOGGER_LEVEL_DEBUG, "Main", "Smart Beacon is: %s", Utils::getSmartBeaconState());
logger.log(logging::LoggerLevel::LOGGER_LEVEL_INFO, "Main", "Setup Done!");
menuDisplay = 0;
}
void loop() {
currentBeacon = &Config.beacons[myBeaconsIndex];
if (statusState) {
if (Config.validateConfigFile(currentBeacon->callsign)) {
KEYBOARD_Utils::rightArrow();
currentBeacon = &Config.beacons[myBeaconsIndex];
}
miceActive = Config.validateMicE(currentBeacon->micE);
}
POWER_Utils::batteryManager();
SMARTBEACON_Utils::checkValues(myBeaconsIndex);
SMARTBEACON_Utils::checkState();
if (!Config.simplifiedTrackerMode) {
#ifdef BUTTON_PIN
userButton.tick();
#endif
}
Utils::checkDisplayEcoMode();
KEYBOARD_Utils::read();
#if defined(TTGO_T_DECK_GPS) || defined(TTGO_T_DECK_PLUS)
KEYBOARD_Utils::mouseRead();
#endif
MSG_Utils::checkReceivedMessage(LoRa_Utils::receivePacket());
MSG_Utils::processOutputBuffer();
MSG_Utils::clean25SegBuffer();
MSG_Utils::ledNotification();
Utils::checkFlashlight();
STATION_Utils::checkListenedTrackersByTimeAndDelete();
if (Config.bluetooth.type == 0 || Config.bluetooth.type == 2) {
BLE_Utils::sendToLoRa();
} else {
#ifdef HAS_BT_CLASSIC
BLUETOOTH_Utils::sendToLoRa();
#endif
}
lastTx = millis() - lastTxTime;
if (gpsIsActive) {
GPS_Utils::getData();
bool gps_time_update = gps.time.isUpdated();
bool gps_loc_update = gps.location.isUpdated();
GPS_Utils::setDateFromData();
int currentSpeed = (int) gps.speed.kmph();
if (gps_loc_update) {
Utils::checkStatus();
STATION_Utils::checkTelemetryTx();
}
if (!sendUpdate && gps_loc_update && smartBeaconActive) {
GPS_Utils::calculateDistanceTraveled();
if (!sendUpdate) {
GPS_Utils::calculateHeadingDelta(currentSpeed);
}
STATION_Utils::checkStandingUpdateTime();
}
SMARTBEACON_Utils::checkFixedBeaconTime();
if (sendUpdate && gps_loc_update) STATION_Utils::sendBeacon(0);
if (gps_time_update) SMARTBEACON_Utils::checkInterval(currentSpeed);
if (millis() - refreshDisplayTime >= 1000 || gps_time_update) {
GPS_Utils::checkStartUpFrames();
MENU_Utils::showOnScreen();
refreshDisplayTime = millis();
}
SLEEP_Utils::checkIfGPSShouldSleep();
} else {
if (millis() - lastGPSTime > txInterval) {
SLEEP_Utils::gpsWakeUp();
}
STATION_Utils::checkStandingUpdateTime();
if (millis() - refreshDisplayTime >= 1000) {
MENU_Utils::showOnScreen();
refreshDisplayTime = millis();
}
}
}