Actually honor the points-north setting

This commit is contained in:
Jonathan Bennett 2025-06-25 11:17:04 -05:00
parent cab6707ca0
commit 20988aa4fa
3 changed files with 37 additions and 23 deletions

View File

@ -558,19 +558,20 @@ void drawNodeListWithCompasses(OLEDDisplay *display, OLEDDisplayUiState *state,
double lat = 0; double lat = 0;
double lon = 0; double lon = 0;
if (!config.display.compass_north_top) {
#if HAS_GPS #if HAS_GPS
if (screen->hasHeading()) { if (screen->hasHeading()) {
heading = screen->getHeading(); // degrees heading = screen->getHeading(); // degrees
validHeading = true; validHeading = true;
} else { } else {
heading = screen->estimatedHeading(lat, lon); heading = screen->estimatedHeading(lat, lon);
validHeading = !isnan(heading); validHeading = !isnan(heading);
} }
#endif #endif
if (!validHeading) if (!validHeading)
return; return;
}
drawNodeListScreen(display, state, x, y, "Bearings", drawEntryCompass, drawCompassArrow, heading, lat, lon); drawNodeListScreen(display, state, x, y, "Bearings", drawEntryCompass, drawCompassArrow, heading, lat, lon);
} }

View File

@ -444,8 +444,11 @@ void UIRenderer::drawNodeInfo(OLEDDisplay *display, const OLEDDisplayUiState *st
GeoCoord::latLongToMeter(DegD(p.latitude_i), DegD(p.longitude_i), DegD(op.latitude_i), DegD(op.longitude_i)); GeoCoord::latLongToMeter(DegD(p.latitude_i), DegD(p.longitude_i), DegD(op.latitude_i), DegD(op.longitude_i));
*/ */
float bearing = GeoCoord::bearing(DegD(op.latitude_i), DegD(op.longitude_i), DegD(p.latitude_i), DegD(p.longitude_i)); float bearing = GeoCoord::bearing(DegD(op.latitude_i), DegD(op.longitude_i), DegD(p.latitude_i), DegD(p.longitude_i));
if (!config.display.compass_north_top) if (config.display.compass_north_top) {
myHeading = 0;
} else {
bearing -= myHeading; bearing -= myHeading;
}
display->drawCircle(compassX, compassY, compassRadius); display->drawCircle(compassX, compassY, compassRadius);
CompassRenderer::drawCompassNorth(display, compassX, compassY, myHeading, compassRadius); CompassRenderer::drawCompassNorth(display, compassX, compassY, myHeading, compassRadius);
@ -485,8 +488,11 @@ void UIRenderer::drawNodeInfo(OLEDDisplay *display, const OLEDDisplayUiState *st
int compassY = yBelowContent + availableHeight / 2; int compassY = yBelowContent + availableHeight / 2;
const auto &op = ourNode->position; const auto &op = ourNode->position;
float myHeading = screen->hasHeading() ? screen->getHeading() * PI / 180 float myHeading = 0;
: screen->estimatedHeading(DegD(op.latitude_i), DegD(op.longitude_i)); if (!config.display.compass_north_top) {
myHeading = screen->hasHeading() ? screen->getHeading() * PI / 180
: screen->estimatedHeading(DegD(op.latitude_i), DegD(op.longitude_i));
}
graphics::CompassRenderer::drawCompassNorth(display, compassX, compassY, myHeading, compassRadius); graphics::CompassRenderer::drawCompassNorth(display, compassX, compassY, myHeading, compassRadius);
const auto &p = node->position; const auto &p = node->position;
@ -926,15 +932,18 @@ void UIRenderer::drawCompassAndLocationScreen(OLEDDisplay *display, OLEDDisplayU
int32_t(gpsStatus->getAltitude())); int32_t(gpsStatus->getAltitude()));
// === Determine Compass Heading === // === Determine Compass Heading ===
float heading; float heading = 0;
bool validHeading = false; bool validHeading = false;
if (config.display.compass_north_top) {
if (screen->hasHeading()) {
heading = radians(screen->getHeading());
validHeading = true; validHeading = true;
} else { } else {
heading = screen->estimatedHeading(geoCoord.getLatitude() * 1e-7, geoCoord.getLongitude() * 1e-7); if (screen->hasHeading()) {
validHeading = !isnan(heading); heading = radians(screen->getHeading());
validHeading = true;
} else {
heading = screen->estimatedHeading(geoCoord.getLatitude() * 1e-7, geoCoord.getLongitude() * 1e-7);
validHeading = !isnan(heading);
}
} }
// If GPS is off, no need to display these parts // If GPS is off, no need to display these parts

View File

@ -137,10 +137,14 @@ void WaypointModule::drawFrame(OLEDDisplay *display, OLEDDisplayUiState *state,
if (ourNode && (nodeDB->hasValidPosition(ourNode) || screen->hasHeading())) { if (ourNode && (nodeDB->hasValidPosition(ourNode) || screen->hasHeading())) {
const meshtastic_PositionLite &op = ourNode->position; const meshtastic_PositionLite &op = ourNode->position;
float myHeading; float myHeading;
if (screen->hasHeading()) if (config.display.compass_north_top) {
myHeading = (screen->getHeading()) * PI / 180; // gotta convert compass degrees to Radians myHeading = 0;
else } else {
myHeading = screen->estimatedHeading(DegD(op.latitude_i), DegD(op.longitude_i)); if (screen->hasHeading())
myHeading = (screen->getHeading()) * PI / 180; // gotta convert compass degrees to Radians
else
myHeading = screen->estimatedHeading(DegD(op.latitude_i), DegD(op.longitude_i));
}
graphics::CompassRenderer::drawCompassNorth(display, compassX, compassY, myHeading, (compassDiam / 2)); graphics::CompassRenderer::drawCompassNorth(display, compassX, compassY, myHeading, (compassDiam / 2));
// Compass bearing to waypoint // Compass bearing to waypoint