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);
#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();

View File

@ -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 "";
}
}

View File

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

View File

@ -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;

View File

@ -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(), "<Back");
show_display("NEAR BY >", STATION_Utils::getNearTracker(0), STATION_Utils::getNearTracker(1), STATION_Utils::getNearTracker(2), STATION_Utils::getNearTracker(3), "<Back");
break;
//////////
@ -592,8 +594,12 @@ namespace MENU_Utils {
}
#endif
if (showHumanHeading) {
fifthRowMainMenu = GPS_Utils::getCardinalDirection(gps.course.deg());
} else {
fifthRowMainMenu = "LAST Rx = ";
fifthRowMainMenu += MSG_Utils::getLastHeardTracker();
}
if (POWER_Utils::getBatteryInfoIsConnected()) {
String batteryVoltage = POWER_Utils::getBatteryInfoVoltage();

View File

@ -45,314 +45,117 @@ uint32_t wxRequestTime = 0;
uint32_t lastTelemetryTx = 0;
uint32_t telemetryTx = millis();
String firstNearTracker;
String secondNearTracker;
String thirdNearTracker;
String fourthNearTracker;
uint32_t lastDeleteListenedTracker;
struct nearTracker {
String callsign;
float distance;
int course;
uint32_t lastTime;
};
nearTracker nearTrackers[4];
namespace STATION_Utils {
const String getFirstNearTracker() {
return String(firstNearTracker.substring(0, firstNearTracker.indexOf(",")));
void nearTrackerInit() {
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() {
return String(secondNearTracker.substring(0, secondNearTracker.indexOf(",")));
const String getNearTracker(uint8_t position) {
if (nearTrackers[position].callsign == "") {
return "";
} else {
return nearTrackers[position].callsign + "> " + String(nearTrackers[position].distance,2) + "km " + String(nearTrackers[position].course);
}
const String getThirdNearTracker() {
return String(thirdNearTracker.substring(0, thirdNearTracker.indexOf(",")));
}
const String getFourthNearTracker() {
return String(fourthNearTracker.substring(0, fourthNearTracker.indexOf(",")));
}
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 = "";
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;
}
if (secondNearTracker == "") {
secondNearTracker = thirdNearTracker;
thirdNearTracker = fourthNearTracker;
fourthNearTracker = "";
}
if (firstNearTracker == "") {
firstNearTracker = secondNearTracker;
secondNearTracker = thirdNearTracker;
thirdNearTracker = fourthNearTracker;
fourthNearTracker = "";
}
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();
bool shouldSortbyDistance = false;
bool callsignInNearTrackers = false;
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;
}
if (secondNearTracker != "") {
secondNearTrackerCallsign = secondNearTracker.substring(0, secondNearTracker.indexOf(">"));
secondNearTrackerDistance = secondNearTracker.substring(secondNearTracker.indexOf(">") + 1, secondNearTracker.indexOf("km"));
secondDistance = secondNearTrackerDistance.toFloat();
break;
}
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;
newTrackerInfo += "> ";
newTrackerInfo += String(distance,2);
newTrackerInfo += "km ";
newTrackerInfo += String(int(course));
newTrackerInfo += ",";
newTrackerInfo += String(millis());
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;
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];
}
} 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) {
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;
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;
}
}
}
@ -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";

View File

@ -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();