diff --git a/src/LoRa_APRS_Tracker.cpp b/src/LoRa_APRS_Tracker.cpp index 0b72f0d..0641fbc 100644 --- a/src/LoRa_APRS_Tracker.cpp +++ b/src/LoRa_APRS_Tracker.cpp @@ -45,7 +45,7 @@ TinyGPSPlus gps; OneButton userButton = OneButton(BUTTON_PIN, true, true); #endif -String versionDate = "2024.07.01"; +String versionDate = "2024.07.02"; uint8_t myBeaconsIndex = 0; int myBeaconsSize = Config.beacons.size(); @@ -106,6 +106,7 @@ void setup() { STATION_Utils::loadIndex(0); STATION_Utils::loadIndex(1); + STATION_Utils::nearTrackerInit(); startupScreen(loraIndex, versionDate); MSG_Utils::loadNumMessages(); diff --git a/src/gps_utils.cpp b/src/gps_utils.cpp index 6ecd7bd..7f0beaa 100644 --- a/src/gps_utils.cpp +++ b/src/gps_utils.cpp @@ -33,6 +33,8 @@ extern uint32_t lastTx; double currentHeading = 0; double previousHeading = 0; +float bearing = 0; + namespace GPS_Utils { @@ -104,7 +106,28 @@ namespace GPS_Utils { } } - String getCurrentHeadingHuman(float bearing) { + 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 @@ -137,7 +160,7 @@ namespace GPS_Utils { 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 "?"; + return ""; } } \ No newline at end of file diff --git a/src/gps_utils.h b/src/gps_utils.h index aa562c4..ff7046f 100644 --- a/src/gps_utils.h +++ b/src/gps_utils.h @@ -12,7 +12,7 @@ namespace GPS_Utils { void calculateDistanceTraveled(); void calculateHeadingDelta(int speed); void checkStartUpFrames(); - String getCurrentHeadingHuman(float bearing); + String getCardinalDirection(float course); } diff --git a/src/keyboard_utils.cpp b/src/keyboard_utils.cpp index f92e162..2624fd5 100644 --- a/src/keyboard_utils.cpp +++ b/src/keyboard_utils.cpp @@ -62,6 +62,8 @@ String messageText = ""; int messagesIterator = 0; +bool showHumanHeading = false; + bool mouseUpState = 0; bool mouseDownState = 0; bool mouseLeftState = 0; @@ -532,6 +534,8 @@ namespace KEYBOARD_Utils { } if (menuDisplay == 0 && key == 13) { // Main Menu menuDisplay = 1; + } else if (menuDisplay == 0 && key == 8) { + showHumanHeading = !showHumanHeading; } else if (key == 27) { // ESC = return to Main Menu menuDisplay = 0; messagesIterator = 0; diff --git a/src/menu_utils.cpp b/src/menu_utils.cpp index a376f22..3de3846 100644 --- a/src/menu_utils.cpp +++ b/src/menu_utils.cpp @@ -8,6 +8,7 @@ #include "power_utils.h" #include "menu_utils.h" #include "msg_utils.h" +#include "gps_utils.h" #include "bme_utils.h" #include "display.h" #include "utils.h" @@ -32,6 +33,7 @@ extern bool bluetoothActive; extern bool displayEcoMode; extern bool screenBrightness; extern bool disableGPS; +extern bool showHumanHeading; extern APRSPacket lastReceivedPacket; extern uint8_t winlinkStatus; @@ -328,7 +330,7 @@ namespace MENU_Utils { } break; case 310: //3.Stations ---> Near By Stations - show_display("NEAR BY >", STATION_Utils::getFirstNearTracker(), STATION_Utils::getSecondNearTracker(), STATION_Utils::getThirdNearTracker(), STATION_Utils::getFourthNearTracker(), "", STATION_Utils::getNearTracker(0), STATION_Utils::getNearTracker(1), STATION_Utils::getNearTracker(2), STATION_Utils::getNearTracker(3), " " + String(nearTrackers[position].distance,2) + "km " + String(nearTrackers[position].course); + } } void deleteListenedTrackersbyTime() { - String firstNearTrackermillis, secondNearTrackermillis, thirdNearTrackermillis, fourthNearTrackermillis; - uint32_t firstTrackermillis, secondTrackermillis, thirdTrackermillis, fourthTrackermillis; - if (firstNearTracker != "") { - firstNearTrackermillis = firstNearTracker.substring(firstNearTracker.indexOf(",") + 1); - firstTrackermillis = firstNearTrackermillis.toInt(); - if ((millis() - firstTrackermillis) > Config.rememberStationTime * 60 * 1000) { - firstNearTracker = ""; - } - } - if (secondNearTracker != "") { - secondNearTrackermillis = secondNearTracker.substring(secondNearTracker.indexOf(",") + 1); - secondTrackermillis = secondNearTrackermillis.toInt(); - if ((millis() - secondTrackermillis) > Config.rememberStationTime * 60 * 1000) { - secondNearTracker = ""; - } - } - if (thirdNearTracker != "") { - thirdNearTrackermillis = thirdNearTracker.substring(thirdNearTracker.indexOf(",") + 1); - thirdTrackermillis = thirdNearTrackermillis.toInt(); - if ((millis() - thirdTrackermillis) > Config.rememberStationTime * 60 * 1000) { - thirdNearTracker = ""; - } - } - if (fourthNearTracker != "") { - fourthNearTrackermillis = fourthNearTracker.substring(fourthNearTracker.indexOf(",") + 1); - fourthTrackermillis = fourthNearTrackermillis.toInt(); - if ((millis() - fourthTrackermillis) > Config.rememberStationTime * 60 * 1000) { - fourthNearTracker = ""; + for (int a = 0; a < 4; a++) { // clean nearTrackers[] after time + if (nearTrackers[a].callsign != "" && (millis() - nearTrackers[a].lastTime > Config.rememberStationTime * 60 * 1000)) { + nearTrackers[a].callsign = ""; + nearTrackers[a].distance = 0.0; + nearTrackers[a].course = 0; + nearTrackers[a].lastTime = 0; } } - if (thirdNearTracker == "") { - thirdNearTracker = fourthNearTracker; - fourthNearTracker = ""; - } - if (secondNearTracker == "") { - secondNearTracker = thirdNearTracker; - thirdNearTracker = fourthNearTracker; - fourthNearTracker = ""; - } - if (firstNearTracker == "") { - firstNearTracker = secondNearTracker; - secondNearTracker = thirdNearTracker; - thirdNearTracker = fourthNearTracker; - fourthNearTracker = ""; + for (int b = 0; b < 4 - 1; b++) { + for (int c = 0; c < 4 - b - 1; c++) { + if (nearTrackers[c].callsign == "") { // get "" nearTrackers[] at the end + nearTracker temp = nearTrackers[c]; + nearTrackers[c] = nearTrackers[c + 1]; + nearTrackers[c + 1] = temp; + } + } } lastDeleteListenedTracker = millis(); } void checkListenedTrackersByTimeAndDelete() { - if (millis() - lastDeleteListenedTracker > Config.rememberStationTime*60*1000) { + if (millis() - lastDeleteListenedTracker > Config.rememberStationTime * 60 * 1000) { deleteListenedTrackersbyTime(); } } - void orderListenedTrackersByDistance(const String& callsign, float distance, float course) { - String firstNearTrackerDistance, secondNearTrackerDistance, thirdNearTrackerDistance, fourthNearTrackerDistance, firstNearTrackerCallsign, secondNearTrackerCallsign,thirdNearTrackerCallsign, fourthNearTrackerCallsign; - float firstDistance = 0.0; - float secondDistance = 0.0; - float thirdDistance = 0.0; - float fourthDistance = 0.0; - if (firstNearTracker != "") { - firstNearTrackerCallsign = firstNearTracker.substring(0, firstNearTracker.indexOf(">")); - firstNearTrackerDistance = firstNearTracker.substring(firstNearTracker.indexOf(">") + 1, firstNearTracker.indexOf("km")); - firstDistance = firstNearTrackerDistance.toFloat(); - } - if (secondNearTracker != "") { - secondNearTrackerCallsign = secondNearTracker.substring(0, secondNearTracker.indexOf(">")); - secondNearTrackerDistance = secondNearTracker.substring(secondNearTracker.indexOf(">") + 1, secondNearTracker.indexOf("km")); - secondDistance = secondNearTrackerDistance.toFloat(); - } - if (thirdNearTracker != "") { - thirdNearTrackerCallsign = thirdNearTracker.substring(0, thirdNearTracker.indexOf(">")); - thirdNearTrackerDistance = thirdNearTracker.substring(thirdNearTracker.indexOf(">") + 1, thirdNearTracker.indexOf("km")); - thirdDistance = thirdNearTrackerDistance.toFloat(); - } - if (fourthNearTracker != "") { - fourthNearTrackerCallsign = fourthNearTracker.substring(0, fourthNearTracker.indexOf(">")); - fourthNearTrackerDistance = fourthNearTracker.substring(fourthNearTracker.indexOf(">") + 1, fourthNearTracker.indexOf("km")); - fourthDistance = fourthNearTrackerDistance.toFloat(); - } + void orderListenedTrackersByDistance(const String& callsign, float distance, float course) { + bool shouldSortbyDistance = false; + bool callsignInNearTrackers = false; - String newTrackerInfo = callsign; - newTrackerInfo += "> "; - newTrackerInfo += String(distance,2); - newTrackerInfo += "km "; - newTrackerInfo += String(int(course)); - newTrackerInfo += ","; - newTrackerInfo += String(millis()); + for (int a = 0; a < 4; a++) { // check if callsign is in nearTrackers[] + if (nearTrackers[a].callsign == callsign) { + callsignInNearTrackers = true; + nearTrackers[a].lastTime = millis(); // update listened millis() + if (nearTrackers[a].distance != distance) { // update distance if needed + nearTrackers[a].distance = distance; + shouldSortbyDistance = true; + } + break; + } + } + + if (!callsignInNearTrackers) { // callsign not in nearTrackers[] + for (int b = 0; b < 4; b++) { // if nearTrackers[] is available + if (nearTrackers[b].callsign == "") { + shouldSortbyDistance = true; + nearTrackers[b].callsign = callsign; + nearTrackers[b].distance = distance; + nearTrackers[b].course = int(course); + nearTrackers[b].lastTime = millis(); + break; + } + } - if (firstNearTracker == "" && secondNearTracker == "" && thirdNearTracker == "" && fourthNearTracker == "") { - firstNearTracker = newTrackerInfo; - } else if (firstNearTracker != "" && secondNearTracker == "" && thirdNearTracker == "" && fourthNearTracker == "") { - if (callsign != firstNearTrackerCallsign) { - if (distance < firstDistance) { - secondNearTracker = firstNearTracker; - firstNearTracker = newTrackerInfo; - } else { - secondNearTracker = newTrackerInfo; - } - } else { - if (distance != firstDistance) { - firstNearTracker = newTrackerInfo; + if (!shouldSortbyDistance) { // if no more nearTrackers[] available , it compares distances to move and replace + for (int c = 0; c < 4; c++) { + if (nearTrackers[c].distance > distance) { + for (int d = 3; d > c; d--) { + nearTrackers[d] = nearTrackers[d - 1]; + } + nearTrackers[c].callsign = callsign; + nearTrackers[c].distance = distance; + nearTrackers[c].course = int(course); + nearTrackers[c].lastTime = millis(); + break; + } } } - } else if (firstNearTracker != "" && secondNearTracker != "" && thirdNearTracker == "" && fourthNearTracker == "") { - if (callsign != firstNearTrackerCallsign && callsign != secondNearTrackerCallsign) { - if (distance < firstDistance) { - thirdNearTracker = secondNearTracker; - secondNearTracker = firstNearTracker; - firstNearTracker = newTrackerInfo; - } else if (distance < secondDistance && distance >= firstDistance) { - thirdNearTracker = secondNearTracker; - secondNearTracker = newTrackerInfo; - } else if (distance >= secondDistance) { - thirdNearTracker = newTrackerInfo; + } + + if (shouldSortbyDistance) { // sorts by distance (only nearTrackers[] that are not "") + for (int f = 0; f < 4 - 1; f++) { + for (int g = 0; g < 4 - f - 1; g++) { + if (nearTrackers[g].callsign != "" && nearTrackers[g + 1].callsign != "") { + if (nearTrackers[g].distance > nearTrackers[g + 1].distance) { + nearTracker temp = nearTrackers[g]; + nearTrackers[g] = nearTrackers[g + 1]; + nearTrackers[g + 1] = temp; + } + } } - } else { - if (callsign == firstNearTrackerCallsign) { - if (distance != firstDistance) { - if (distance > secondDistance) { - firstNearTracker = secondNearTracker; - secondNearTracker = newTrackerInfo; - } else { - firstNearTracker = newTrackerInfo; - } - } - } else if (callsign == secondNearTrackerCallsign) { - if (distance != secondDistance) { - if (distance < firstDistance) { - secondNearTracker = firstNearTracker; - firstNearTracker = newTrackerInfo; - } else { - secondNearTracker = newTrackerInfo; - } - } - } - } - } else if (firstNearTracker != "" && secondNearTracker != "" && thirdNearTracker != "" && fourthNearTracker == "") { - if (callsign != firstNearTrackerCallsign && callsign != secondNearTrackerCallsign && callsign != thirdNearTrackerCallsign) { - if (distance < firstDistance) { - fourthNearTracker = thirdNearTracker; - thirdNearTracker = secondNearTracker; - secondNearTracker = firstNearTracker; - firstNearTracker = newTrackerInfo; - } else if (distance >= firstDistance && distance < secondDistance) { - fourthNearTracker = thirdNearTracker; - thirdNearTracker = secondNearTracker; - secondNearTracker = newTrackerInfo; - } else if (distance >= secondDistance && distance < thirdDistance) { - fourthNearTracker = thirdNearTracker; - thirdNearTracker = newTrackerInfo; - } else if (distance >= thirdDistance) { - fourthNearTracker = newTrackerInfo; - } - } else { - if (callsign == firstNearTrackerCallsign) { - if (distance != firstDistance) { - if (distance > thirdDistance) { - firstNearTracker = secondNearTracker; - secondNearTracker = thirdNearTracker; - thirdNearTracker = newTrackerInfo; - } else if (distance <= thirdDistance && distance > secondDistance) { - firstNearTracker = secondNearTracker; - secondNearTracker = newTrackerInfo; - } else if (distance <= secondDistance) { - firstNearTracker = newTrackerInfo; - } - } - } else if (callsign == secondNearTrackerCallsign) { - if (distance != secondDistance) { - if (distance > thirdDistance) { - secondNearTracker = thirdNearTracker; - thirdNearTracker = newTrackerInfo; - } else if (distance <= thirdDistance && distance > firstDistance) { - secondNearTracker = newTrackerInfo; - } else if (distance <= firstDistance) { - secondNearTracker = firstNearTracker; - firstNearTracker = newTrackerInfo; - } - } - } else if (callsign == thirdNearTrackerCallsign) { - if (distance != thirdDistance) { - if (distance <= firstDistance) { - thirdNearTracker = secondNearTracker; - secondNearTracker = firstNearTracker; - firstNearTracker = newTrackerInfo; - } else if (distance > firstDistance && distance <= secondDistance) { - thirdNearTracker = secondNearTracker; - secondNearTracker = newTrackerInfo; - } else if (distance > secondDistance) { - thirdNearTracker = newTrackerInfo; - } - } - } - } - } else if (firstNearTracker != "" && secondNearTracker != "" && thirdNearTracker != "" && fourthNearTracker != "") { - if (callsign != firstNearTrackerCallsign && callsign != secondNearTrackerCallsign && callsign != thirdNearTrackerCallsign && callsign != fourthNearTrackerCallsign) { - if (distance < firstDistance) { - fourthNearTracker = thirdNearTracker; - thirdNearTracker = secondNearTracker; - secondNearTracker = firstNearTracker; - firstNearTracker = newTrackerInfo; - } else if (distance < secondDistance && distance >= firstDistance) { - fourthNearTracker = thirdNearTracker; - thirdNearTracker = secondNearTracker; - secondNearTracker = newTrackerInfo; - } else if (distance < thirdDistance && distance >= secondDistance) { - fourthNearTracker = thirdNearTracker; - thirdNearTracker = newTrackerInfo; - } else if (distance < fourthDistance && distance >= thirdDistance) { - fourthNearTracker = newTrackerInfo; - } - } else { - if (callsign == firstNearTrackerCallsign) { - if (distance != firstDistance) { - if (distance > fourthDistance) { - firstNearTracker = secondNearTracker; - secondNearTracker = thirdNearTracker; - thirdNearTracker = fourthNearTracker; - fourthNearTracker = newTrackerInfo; - } else if (distance > thirdDistance && distance <= fourthDistance) { - firstNearTracker = secondNearTracker; - secondNearTracker = thirdNearTracker; - thirdNearTracker = newTrackerInfo; - } else if (distance > secondDistance && distance <= thirdDistance) { - firstNearTracker = secondNearTracker; - secondNearTracker = newTrackerInfo; - } else if (distance <= secondDistance) { - firstNearTracker = newTrackerInfo; - } - } - } else if (callsign == secondNearTrackerCallsign) { - if (distance != secondDistance) { - if (distance > fourthDistance) { - secondNearTracker = thirdNearTracker; - thirdNearTracker = fourthNearTracker; - fourthNearTracker = newTrackerInfo; - } else if (distance > thirdDistance && distance <= fourthDistance) { - secondNearTracker = thirdNearTracker; - thirdNearTracker = newTrackerInfo; - } else if (distance > firstDistance && distance <= thirdDistance) { - secondNearTracker = newTrackerInfo; - } else if (distance <= firstDistance) { - secondNearTracker = firstNearTracker; - firstNearTracker = newTrackerInfo; - } - } - } else if (callsign == thirdNearTrackerCallsign) { - if (distance != thirdDistance) { - if (distance > fourthDistance) { - thirdNearTracker = fourthNearTracker; - fourthNearTracker = newTrackerInfo; - } else if (distance > secondDistance && distance <= fourthDistance) { - thirdNearTracker = newTrackerInfo; - } else if (distance > firstDistance && distance <= secondDistance) { - thirdNearTracker = secondNearTracker; - secondNearTracker = newTrackerInfo; - } else if (distance <= firstDistance) { - thirdNearTracker = secondNearTracker; - secondNearTracker = firstNearTracker; - firstNearTracker = newTrackerInfo; - } - } - } else if (callsign == fourthNearTrackerCallsign) { - if (distance != fourthDistance) { - if (distance > thirdDistance) { - fourthNearTracker = newTrackerInfo; - } else if (distance > secondDistance && distance <= thirdDistance) { - fourthNearTracker = thirdNearTracker; - thirdNearTracker = newTrackerInfo; - } else if (distance > firstDistance && distance <= secondDistance) { - fourthNearTracker = thirdNearTracker; - thirdNearTracker = secondNearTracker; - secondNearTracker = newTrackerInfo; - } else if (distance <= firstDistance) { - fourthNearTracker = thirdNearTracker; - thirdNearTracker = secondNearTracker; - secondNearTracker = firstNearTracker; - firstNearTracker = newTrackerInfo; - } - } - } } } } @@ -445,7 +248,7 @@ namespace STATION_Utils { comment += batteryChargeCurrent; comment += "%)"; #endif - #if defined(HELTEC_V3_GPS) || defined(HELTEC_WIRELESS_TRACKER) + #if defined(HELTEC_V3_GPS) || defined(HELTEC_WIRELESS_TRACKER) || defined(TTGO_T_DECK_GPS) comment += " Bat="; comment += String(batteryVoltage.toFloat(),2); comment += "V"; diff --git a/src/station_utils.h b/src/station_utils.h index fe041c0..4c04cf6 100644 --- a/src/station_utils.h +++ b/src/station_utils.h @@ -5,10 +5,8 @@ namespace STATION_Utils { - const String getFirstNearTracker(); - const String getSecondNearTracker(); - const String getThirdNearTracker(); - const String getFourthNearTracker(); + void nearTrackerInit(); + const String getNearTracker(uint8_t position); void deleteListenedTrackersbyTime(); void checkListenedTrackersByTimeAndDelete();