readyToTest

This commit is contained in:
richonguzman 2024-07-02 17:51:40 -04:00
parent ebc5fc580b
commit 22b7b100f6
7 changed files with 130 additions and 295 deletions

View File

@ -45,7 +45,7 @@ TinyGPSPlus gps;
OneButton userButton = OneButton(BUTTON_PIN, true, true); OneButton userButton = OneButton(BUTTON_PIN, true, true);
#endif #endif
String versionDate = "2024.07.01"; String versionDate = "2024.07.02";
uint8_t myBeaconsIndex = 0; uint8_t myBeaconsIndex = 0;
int myBeaconsSize = Config.beacons.size(); int myBeaconsSize = Config.beacons.size();
@ -106,6 +106,7 @@ void setup() {
STATION_Utils::loadIndex(0); STATION_Utils::loadIndex(0);
STATION_Utils::loadIndex(1); STATION_Utils::loadIndex(1);
STATION_Utils::nearTrackerInit();
startupScreen(loraIndex, versionDate); startupScreen(loraIndex, versionDate);
MSG_Utils::loadNumMessages(); MSG_Utils::loadNumMessages();

View File

@ -33,6 +33,8 @@ extern uint32_t lastTx;
double currentHeading = 0; double currentHeading = 0;
double previousHeading = 0; double previousHeading = 0;
float bearing = 0;
namespace GPS_Utils { 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 >= 354.375 || bearing < 5.625) return ">.NW.....(N).....NE.<"; // N
if (bearing >= 5.675 && bearing < 16.875) return ">.......N.|.....NE..<"; if (bearing >= 5.675 && bearing < 16.875) return ">.......N.|.....NE..<";
if (bearing >= 16.875 && bearing < 28.125) return ">.....N...|...NE....<"; // NEN 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 >= 320.625 && bearing < 331.875) return ">.......NW|.....N...<";
if (bearing >= 331.875 && bearing < 343.125) return ">.....NW..|...N.....<"; // NWN if (bearing >= 331.875 && bearing < 343.125) return ">.....NW..|...N.....<"; // NWN
if (bearing >= 343.125 && bearing < 354.375) return ">...NW....|.N.......<"; if (bearing >= 343.125 && bearing < 354.375) return ">...NW....|.N.......<";
return "?"; return "";
} }
} }

View File

@ -12,7 +12,7 @@ namespace GPS_Utils {
void calculateDistanceTraveled(); void calculateDistanceTraveled();
void calculateHeadingDelta(int speed); void calculateHeadingDelta(int speed);
void checkStartUpFrames(); void checkStartUpFrames();
String getCurrentHeadingHuman(float bearing); String getCardinalDirection(float course);
} }

View File

@ -62,6 +62,8 @@ String messageText = "";
int messagesIterator = 0; int messagesIterator = 0;
bool showHumanHeading = false;
bool mouseUpState = 0; bool mouseUpState = 0;
bool mouseDownState = 0; bool mouseDownState = 0;
bool mouseLeftState = 0; bool mouseLeftState = 0;
@ -532,6 +534,8 @@ namespace KEYBOARD_Utils {
} }
if (menuDisplay == 0 && key == 13) { // Main Menu if (menuDisplay == 0 && key == 13) { // Main Menu
menuDisplay = 1; menuDisplay = 1;
} else if (menuDisplay == 0 && key == 8) {
showHumanHeading = !showHumanHeading;
} else if (key == 27) { // ESC = return to Main Menu } else if (key == 27) { // ESC = return to Main Menu
menuDisplay = 0; menuDisplay = 0;
messagesIterator = 0; messagesIterator = 0;

View File

@ -8,6 +8,7 @@
#include "power_utils.h" #include "power_utils.h"
#include "menu_utils.h" #include "menu_utils.h"
#include "msg_utils.h" #include "msg_utils.h"
#include "gps_utils.h"
#include "bme_utils.h" #include "bme_utils.h"
#include "display.h" #include "display.h"
#include "utils.h" #include "utils.h"
@ -32,6 +33,7 @@ extern bool bluetoothActive;
extern bool displayEcoMode; extern bool displayEcoMode;
extern bool screenBrightness; extern bool screenBrightness;
extern bool disableGPS; extern bool disableGPS;
extern bool showHumanHeading;
extern APRSPacket lastReceivedPacket; extern APRSPacket lastReceivedPacket;
extern uint8_t winlinkStatus; extern uint8_t winlinkStatus;
@ -328,7 +330,7 @@ namespace MENU_Utils {
} }
break; break;
case 310: //3.Stations ---> Near By Stations case 310: //3.Stations ---> Near By Stations
show_display("NEAR BY >", STATION_Utils::getFirstNearTracker(), STATION_Utils::getSecondNearTracker(), STATION_Utils::getThirdNearTracker(), STATION_Utils::getFourthNearTracker(), "<Back"); show_display("NEAR BY >", STATION_Utils::getNearTracker(0), STATION_Utils::getNearTracker(1), STATION_Utils::getNearTracker(2), STATION_Utils::getNearTracker(3), "<Back");
break; break;
////////// //////////
@ -592,8 +594,12 @@ namespace MENU_Utils {
} }
#endif #endif
fifthRowMainMenu = "LAST Rx = "; if (showHumanHeading) {
fifthRowMainMenu += MSG_Utils::getLastHeardTracker(); fifthRowMainMenu = GPS_Utils::getCardinalDirection(gps.course.deg());
} else {
fifthRowMainMenu = "LAST Rx = ";
fifthRowMainMenu += MSG_Utils::getLastHeardTracker();
}
if (POWER_Utils::getBatteryInfoIsConnected()) { if (POWER_Utils::getBatteryInfoIsConnected()) {
String batteryVoltage = POWER_Utils::getBatteryInfoVoltage(); String batteryVoltage = POWER_Utils::getBatteryInfoVoltage();

View File

@ -45,314 +45,117 @@ uint32_t wxRequestTime = 0;
uint32_t lastTelemetryTx = 0; uint32_t lastTelemetryTx = 0;
uint32_t telemetryTx = millis(); uint32_t telemetryTx = millis();
String firstNearTracker;
String secondNearTracker;
String thirdNearTracker;
String fourthNearTracker;
uint32_t lastDeleteListenedTracker; uint32_t lastDeleteListenedTracker;
struct nearTracker {
String callsign;
float distance;
int course;
uint32_t lastTime;
};
nearTracker nearTrackers[4];
namespace STATION_Utils { namespace STATION_Utils {
const String getFirstNearTracker() { void nearTrackerInit() {
return String(firstNearTracker.substring(0, firstNearTracker.indexOf(","))); for (int i = 0; i < 4; i++) {
nearTrackers[i].callsign = "";
nearTrackers[i].distance = 0.0;
nearTrackers[i].course = 0;
nearTrackers[i].lastTime = 0;
}
} }
const String getSecondNearTracker() { const String getNearTracker(uint8_t position) {
return String(secondNearTracker.substring(0, secondNearTracker.indexOf(","))); if (nearTrackers[position].callsign == "") {
} return "";
} else {
const String getThirdNearTracker() { return nearTrackers[position].callsign + "> " + String(nearTrackers[position].distance,2) + "km " + String(nearTrackers[position].course);
return String(thirdNearTracker.substring(0, thirdNearTracker.indexOf(","))); }
}
const String getFourthNearTracker() {
return String(fourthNearTracker.substring(0, fourthNearTracker.indexOf(",")));
} }
void deleteListenedTrackersbyTime() { void deleteListenedTrackersbyTime() {
String firstNearTrackermillis, secondNearTrackermillis, thirdNearTrackermillis, fourthNearTrackermillis; for (int a = 0; a < 4; a++) { // clean nearTrackers[] after time
uint32_t firstTrackermillis, secondTrackermillis, thirdTrackermillis, fourthTrackermillis; if (nearTrackers[a].callsign != "" && (millis() - nearTrackers[a].lastTime > Config.rememberStationTime * 60 * 1000)) {
if (firstNearTracker != "") { nearTrackers[a].callsign = "";
firstNearTrackermillis = firstNearTracker.substring(firstNearTracker.indexOf(",") + 1); nearTrackers[a].distance = 0.0;
firstTrackermillis = firstNearTrackermillis.toInt(); nearTrackers[a].course = 0;
if ((millis() - firstTrackermillis) > Config.rememberStationTime * 60 * 1000) { nearTrackers[a].lastTime = 0;
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 = "";
} }
} }
if (thirdNearTracker == "") { for (int b = 0; b < 4 - 1; b++) {
thirdNearTracker = fourthNearTracker; for (int c = 0; c < 4 - b - 1; c++) {
fourthNearTracker = ""; if (nearTrackers[c].callsign == "") { // get "" nearTrackers[] at the end
} nearTracker temp = nearTrackers[c];
if (secondNearTracker == "") { nearTrackers[c] = nearTrackers[c + 1];
secondNearTracker = thirdNearTracker; nearTrackers[c + 1] = temp;
thirdNearTracker = fourthNearTracker; }
fourthNearTracker = ""; }
}
if (firstNearTracker == "") {
firstNearTracker = secondNearTracker;
secondNearTracker = thirdNearTracker;
thirdNearTracker = fourthNearTracker;
fourthNearTracker = "";
} }
lastDeleteListenedTracker = millis(); lastDeleteListenedTracker = millis();
} }
void checkListenedTrackersByTimeAndDelete() { void checkListenedTrackersByTimeAndDelete() {
if (millis() - lastDeleteListenedTracker > Config.rememberStationTime*60*1000) { if (millis() - lastDeleteListenedTracker > Config.rememberStationTime * 60 * 1000) {
deleteListenedTrackersbyTime(); deleteListenedTrackersbyTime();
} }
} }
void orderListenedTrackersByDistance(const String& callsign, float distance, float course) { void orderListenedTrackersByDistance(const String& callsign, float distance, float course) {
String firstNearTrackerDistance, secondNearTrackerDistance, thirdNearTrackerDistance, fourthNearTrackerDistance, firstNearTrackerCallsign, secondNearTrackerCallsign,thirdNearTrackerCallsign, fourthNearTrackerCallsign; bool shouldSortbyDistance = false;
float firstDistance = 0.0; bool callsignInNearTrackers = false;
float secondDistance = 0.0;
float thirdDistance = 0.0; for (int a = 0; a < 4; a++) { // check if callsign is in nearTrackers[]
float fourthDistance = 0.0; if (nearTrackers[a].callsign == callsign) {
if (firstNearTracker != "") { callsignInNearTrackers = true;
firstNearTrackerCallsign = firstNearTracker.substring(0, firstNearTracker.indexOf(">")); nearTrackers[a].lastTime = millis(); // update listened millis()
firstNearTrackerDistance = firstNearTracker.substring(firstNearTracker.indexOf(">") + 1, firstNearTracker.indexOf("km")); if (nearTrackers[a].distance != distance) { // update distance if needed
firstDistance = firstNearTrackerDistance.toFloat(); nearTrackers[a].distance = distance;
} shouldSortbyDistance = true;
if (secondNearTracker != "") { }
secondNearTrackerCallsign = secondNearTracker.substring(0, secondNearTracker.indexOf(">")); break;
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();
} }
String newTrackerInfo = callsign; if (!callsignInNearTrackers) { // callsign not in nearTrackers[]
newTrackerInfo += "> "; for (int b = 0; b < 4; b++) { // if nearTrackers[] is available
newTrackerInfo += String(distance,2); if (nearTrackers[b].callsign == "") {
newTrackerInfo += "km "; shouldSortbyDistance = true;
newTrackerInfo += String(int(course)); nearTrackers[b].callsign = callsign;
newTrackerInfo += ","; nearTrackers[b].distance = distance;
newTrackerInfo += String(millis()); nearTrackers[b].course = int(course);
nearTrackers[b].lastTime = millis();
break;
}
}
if (firstNearTracker == "" && secondNearTracker == "" && thirdNearTracker == "" && fourthNearTracker == "") { if (!shouldSortbyDistance) { // if no more nearTrackers[] available , it compares distances to move and replace
firstNearTracker = newTrackerInfo; for (int c = 0; c < 4; c++) {
} else if (firstNearTracker != "" && secondNearTracker == "" && thirdNearTracker == "" && fourthNearTracker == "") { if (nearTrackers[c].distance > distance) {
if (callsign != firstNearTrackerCallsign) { for (int d = 3; d > c; d--) {
if (distance < firstDistance) { nearTrackers[d] = nearTrackers[d - 1];
secondNearTracker = firstNearTracker;
firstNearTracker = newTrackerInfo;
} else {
secondNearTracker = newTrackerInfo;
}
} else {
if (distance != firstDistance) {
firstNearTracker = newTrackerInfo;
}
}
} 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;
}
} 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;
} }
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 && callsign != thirdNearTrackerCallsign) {
if (distance < firstDistance) { if (shouldSortbyDistance) { // sorts by distance (only nearTrackers[] that are not "")
fourthNearTracker = thirdNearTracker; for (int f = 0; f < 4 - 1; f++) {
thirdNearTracker = secondNearTracker; for (int g = 0; g < 4 - f - 1; g++) {
secondNearTracker = firstNearTracker; if (nearTrackers[g].callsign != "" && nearTrackers[g + 1].callsign != "") {
firstNearTracker = newTrackerInfo; if (nearTrackers[g].distance > nearTrackers[g + 1].distance) {
} else if (distance >= firstDistance && distance < secondDistance) { nearTracker temp = nearTrackers[g];
fourthNearTracker = thirdNearTracker; nearTrackers[g] = nearTrackers[g + 1];
thirdNearTracker = secondNearTracker; nearTrackers[g + 1] = temp;
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 += batteryChargeCurrent;
comment += "%)"; comment += "%)";
#endif #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 += " Bat=";
comment += String(batteryVoltage.toFloat(),2); comment += String(batteryVoltage.toFloat(),2);
comment += "V"; comment += "V";

View File

@ -5,10 +5,8 @@
namespace STATION_Utils { namespace STATION_Utils {
const String getFirstNearTracker(); void nearTrackerInit();
const String getSecondNearTracker(); const String getNearTracker(uint8_t position);
const String getThirdNearTracker();
const String getFourthNearTracker();
void deleteListenedTrackersbyTime(); void deleteListenedTrackersbyTime();
void checkListenedTrackersByTimeAndDelete(); void checkListenedTrackersByTimeAndDelete();