174 lines
7.4 KiB
C++
174 lines
7.4 KiB
C++
#include <TinyGPS++.h>
|
|
#include "TimeLib.h"
|
|
#include "configuration.h"
|
|
#include "station_utils.h"
|
|
#include "boards_pinout.h"
|
|
#include "power_utils.h"
|
|
#include "sleep_utils.h"
|
|
#include "gps_utils.h"
|
|
#include "display.h"
|
|
#include "logger.h"
|
|
|
|
#include "APRSPacketLib.h"
|
|
|
|
#ifdef HIGH_GPS_BAUDRATE
|
|
#define GPS_BAUD 115200
|
|
#else
|
|
#define GPS_BAUD 9600
|
|
#endif
|
|
|
|
extern Configuration Config;
|
|
extern HardwareSerial neo6m_gps; // cambiar a gpsSerial
|
|
extern TinyGPSPlus gps;
|
|
extern Beacon *currentBeacon;
|
|
extern logging::Logger logger;
|
|
extern bool sendUpdate;
|
|
extern bool sendStandingUpdate;
|
|
|
|
extern uint32_t lastTxTime;
|
|
extern uint32_t txInterval;
|
|
extern double lastTxLat;
|
|
extern double lastTxLng;
|
|
extern double lastTxDistance;
|
|
extern uint32_t lastTx;
|
|
extern bool disableGPS;
|
|
extern bool gpsShouldSleep;
|
|
|
|
double currentHeading = 0;
|
|
double previousHeading = 0;
|
|
float bearing = 0;
|
|
|
|
bool gpsIsActive = true;
|
|
|
|
|
|
namespace GPS_Utils {
|
|
|
|
void setup() {
|
|
if (disableGPS) {
|
|
logger.log(logging::LoggerLevel::LOGGER_LEVEL_WARN, "Main", "GPS disabled");
|
|
return;
|
|
}
|
|
neo6m_gps.begin(GPS_BAUD, SERIAL_8N1, GPS_TX, GPS_RX);
|
|
}
|
|
|
|
void calculateDistanceCourse(const String& callsign, double checkpointLatitude, double checkPointLongitude) {
|
|
double distanceKm = TinyGPSPlus::distanceBetween(gps.location.lat(), gps.location.lng(), checkpointLatitude, checkPointLongitude) / 1000.0;
|
|
double courseTo = TinyGPSPlus::courseTo(gps.location.lat(), gps.location.lng(), checkpointLatitude, checkPointLongitude);
|
|
STATION_Utils::deleteListenedTrackersbyTime();
|
|
STATION_Utils::orderListenedTrackersByDistance(callsign, distanceKm, courseTo);
|
|
}
|
|
|
|
void getData() {
|
|
if (disableGPS) return;
|
|
while (neo6m_gps.available() > 0) {
|
|
gps.encode(neo6m_gps.read());
|
|
}
|
|
}
|
|
|
|
void setDateFromData() {
|
|
if (gps.time.isValid()) setTime(gps.time.hour(), gps.time.minute(), gps.time.second(), gps.date.day(), gps.date.month(), gps.date.year());
|
|
}
|
|
|
|
void calculateDistanceTraveled() {
|
|
currentHeading = gps.course.deg();
|
|
lastTxDistance = TinyGPSPlus::distanceBetween(gps.location.lat(), gps.location.lng(), lastTxLat, lastTxLng);
|
|
if (lastTx >= txInterval) {
|
|
if (lastTxDistance > currentBeacon->minTxDist) {
|
|
sendUpdate = true;
|
|
sendStandingUpdate = false;
|
|
} else {
|
|
if (currentBeacon->gpsEcoMode) {
|
|
//
|
|
Serial.print("minTxDistance not achieved : ");
|
|
Serial.println(lastTxDistance);
|
|
//
|
|
gpsShouldSleep = true;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
void calculateHeadingDelta(int speed) {
|
|
uint8_t TurnMinAngle;
|
|
double headingDelta = abs(previousHeading - currentHeading);
|
|
if (lastTx > currentBeacon->minDeltaBeacon * 1000) {
|
|
if (speed == 0) {
|
|
TurnMinAngle = currentBeacon->turnMinDeg + (currentBeacon->turnSlope/(speed + 1));
|
|
} else {
|
|
TurnMinAngle = currentBeacon->turnMinDeg + (currentBeacon->turnSlope/speed);
|
|
}
|
|
if (headingDelta > TurnMinAngle && lastTxDistance > currentBeacon->minTxDist) {
|
|
sendUpdate = true;
|
|
sendStandingUpdate = false;
|
|
}
|
|
}
|
|
}
|
|
|
|
void checkStartUpFrames() {
|
|
if (disableGPS) return;
|
|
if ((millis() > 10000 && gps.charsProcessed() < 10)) {
|
|
logger.log(logging::LoggerLevel::LOGGER_LEVEL_ERROR, "GPS",
|
|
"No GPS frames detected! Try to reset the GPS Chip with this "
|
|
"firmware: https://github.com/richonguzman/TTGO_T_BEAM_GPS_RESET");
|
|
show_display("ERROR", "No GPS frames!", "Reset the GPS Chip", 2000);
|
|
}
|
|
}
|
|
|
|
String getHumanBearing(const String& left, const String& center, const String& right) {
|
|
String bearing = ">.";
|
|
bearing += left;
|
|
for (int i = 0; i < 9; i++) {
|
|
bearing += ".";
|
|
}
|
|
bearing += "(";
|
|
bearing += center;
|
|
bearing += ").....";
|
|
if (right.length() == 1 && center.length() != 2) {
|
|
bearing += ".";
|
|
}
|
|
bearing += right;
|
|
bearing += ".<";
|
|
return bearing;
|
|
}
|
|
|
|
String getCardinalDirection(float course) {
|
|
if (gps.speed.kmph() > 0.5) {
|
|
bearing = course;
|
|
}
|
|
|
|
if (bearing >= 354.375 || bearing < 5.625) return ">.NW.....(N).....NE.<"; // N
|
|
if (bearing >= 5.675 && bearing < 16.875) return ">.......N.|.....NE..<";
|
|
if (bearing >= 16.875 && bearing < 28.125) return ">.....N...|...NE....<"; // NEN
|
|
if (bearing >= 28.125 && bearing < 39.375) return ">...N.....|.NE......<";
|
|
if (bearing >= 39.375 && bearing < 50.625) return ">.N......(NE).....E.<"; // NE
|
|
if (bearing >= 50.625 && bearing < 61.875) return ">.......NE|.....E...<";
|
|
if (bearing >= 61.875 && bearing < 73.125) return ">.....NE..|...E.....<"; // ENE
|
|
if (bearing >= 73.125 && bearing < 84.375) return ">...NE....|.E.......<";
|
|
if (bearing >= 84.375 && bearing < 95.625) return ">.NE.....(E).....SE.<"; // E
|
|
if (bearing >= 95.625 && bearing < 106.875) return ">.......E.|.....SE..<";
|
|
if (bearing >= 106.875 && bearing < 118.125) return ">.....E...|...SE....<"; // ESE
|
|
if (bearing >= 118.125 && bearing < 129.375) return ">...E.....|.SE......<";
|
|
if (bearing >= 129.375 && bearing < 140.625) return ">.E......(SE).....S.<"; // SE
|
|
if (bearing >= 140.625 && bearing < 151.875) return ">.......SE|.....S...<";
|
|
if (bearing >= 151.875 && bearing < 163.125) return ">.....SE..|...S.....<"; // SES
|
|
if (bearing >= 163.125 && bearing < 174.375) return ">...SE....|.S.......<";
|
|
if (bearing >= 174.375 && bearing < 185.625) return ">.SE.....(S).....SW.<"; // S
|
|
if (bearing >= 185.625 && bearing < 196.875) return ">.......S.|.....SW..<";
|
|
if (bearing >= 196.875 && bearing < 208.125) return ">.....S...|...SW....<"; // SWS
|
|
if (bearing >= 208.125 && bearing < 219.375) return ">...S.....|.SW......<";
|
|
if (bearing >= 219.375 && bearing < 230.625) return ">.S......(SW).....W.<"; // SW
|
|
if (bearing >= 230.625 && bearing < 241.875) return ">.......SW|.....W...<";
|
|
if (bearing >= 241.875 && bearing < 253.125) return ">.....SW..|...W.....<"; // WSW
|
|
if (bearing >= 253.125 && bearing < 264.375) return ">...SW....|.W.......<";
|
|
if (bearing >= 264.375 && bearing < 275.625) return ">.SW.....(W).....NW.<"; // W
|
|
if (bearing >= 275.625 && bearing < 286.875) return ">.......W.|.....NW..<";
|
|
if (bearing >= 286.875 && bearing < 298.125) return ">.....W...|...NW....<"; // WNW
|
|
if (bearing >= 298.125 && bearing < 309.375) return ">...W.....|.NW......<";
|
|
if (bearing >= 309.375 && bearing < 320.625) return ">.W......(NW).....N.<"; // NW
|
|
if (bearing >= 320.625 && bearing < 331.875) return ">.......NW|.....N...<";
|
|
if (bearing >= 331.875 && bearing < 343.125) return ">.....NW..|...N.....<"; // NWN
|
|
if (bearing >= 343.125 && bearing < 354.375) return ">...NW....|.N.......<";
|
|
return "";
|
|
}
|
|
|
|
} |