#include #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 ""; } }