Update drawCompassNorth to include radius

This commit is contained in:
Jason P 2025-06-06 15:35:20 -05:00
parent 51c90be8ed
commit 673f5d3ede
6 changed files with 20 additions and 12 deletions

View File

@ -39,20 +39,28 @@ struct Point {
} }
}; };
void drawCompassNorth(OLEDDisplay *display, int16_t compassX, int16_t compassY, float myHeading) void drawCompassNorth(OLEDDisplay *display, int16_t compassX, int16_t compassY, float myHeading, int16_t radius)
{ {
// Show the compass heading (not implemented in original) // Show the compass heading (not implemented in original)
// This could draw a "N" indicator or north arrow // This could draw a "N" indicator or north arrow
// For now, we'll draw a simple north indicator // For now, we'll draw a simple north indicator
const float radius = 8.0f; // const float radius = 17.0f;
if (display->width() > 128) {
radius += 4;
}
Point north(0, -radius); Point north(0, -radius);
north.rotate(-myHeading); north.rotate(-myHeading);
north.translate(compassX, compassY); north.translate(compassX, compassY);
// Draw a small "N" or north indicator
display->drawCircle(north.x, north.y, 2);
display->setFont(FONT_SMALL); display->setFont(FONT_SMALL);
display->setTextAlignment(TEXT_ALIGN_CENTER); display->setTextAlignment(TEXT_ALIGN_CENTER);
display->setColor(BLACK);
if (display->width() > 128) {
display->fillRect(north.x - 8, north.y - 1, display->getStringWidth("N") + 3, FONT_HEIGHT_SMALL - 6);
} else {
display->fillRect(north.x - 4, north.y - 1, display->getStringWidth("N") + 2, FONT_HEIGHT_SMALL - 6);
}
display->setColor(WHITE);
display->drawString(north.x, north.y - 3, "N"); display->drawString(north.x, north.y - 3, "N");
} }

View File

@ -20,7 +20,7 @@ class Screen;
namespace CompassRenderer namespace CompassRenderer
{ {
// Compass drawing functions // Compass drawing functions
void drawCompassNorth(OLEDDisplay *display, int16_t compassX, int16_t compassY, float myHeading); void drawCompassNorth(OLEDDisplay *display, int16_t compassX, int16_t compassY, float myHeading, int16_t radius);
void drawNodeHeading(OLEDDisplay *display, int16_t compassX, int16_t compassY, uint16_t compassDiam, float headingRadian); void drawNodeHeading(OLEDDisplay *display, int16_t compassX, int16_t compassY, uint16_t compassDiam, float headingRadian);
void drawArrowToNode(OLEDDisplay *display, int16_t x, int16_t y, int16_t size, float bearing); void drawArrowToNode(OLEDDisplay *display, int16_t x, int16_t y, int16_t size, float bearing);

View File

@ -758,7 +758,7 @@ void drawNodeInfo(OLEDDisplay *display, const OLEDDisplayUiState *state, int16_t
const auto &op = ourNode->position; const auto &op = ourNode->position;
float myHeading = screen->hasHeading() ? screen->getHeading() * PI / 180 float myHeading = screen->hasHeading() ? screen->getHeading() * PI / 180
: screen->estimatedHeading(DegD(op.latitude_i), DegD(op.longitude_i)); : screen->estimatedHeading(DegD(op.latitude_i), DegD(op.longitude_i));
CompassRenderer::drawCompassNorth(display, compassX, compassY, myHeading); CompassRenderer::drawCompassNorth(display, compassX, compassY, myHeading, compassRadius);
const auto &p = node->position; const auto &p = node->position;
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));
@ -801,7 +801,7 @@ void drawNodeInfo(OLEDDisplay *display, const OLEDDisplayUiState *state, int16_t
const auto &op = ourNode->position; const auto &op = ourNode->position;
float myHeading = screen->hasHeading() ? screen->getHeading() * PI / 180 float myHeading = screen->hasHeading() ? screen->getHeading() * PI / 180
: screen->estimatedHeading(DegD(op.latitude_i), DegD(op.longitude_i)); : screen->estimatedHeading(DegD(op.latitude_i), DegD(op.longitude_i));
CompassRenderer::drawCompassNorth(display, compassX, compassY, myHeading); CompassRenderer::drawCompassNorth(display, compassX, compassY, myHeading, compassRadius);
const auto &p = node->position; const auto &p = node->position;
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));

View File

@ -440,7 +440,6 @@ void drawNodeInfo(OLEDDisplay *display, const OLEDDisplayUiState *state, int16_t
const auto &op = ourNode->position; const auto &op = ourNode->position;
float myHeading = screen->hasHeading() ? screen->getHeading() * PI / 180 float myHeading = screen->hasHeading() ? screen->getHeading() * PI / 180
: screen->estimatedHeading(DegD(op.latitude_i), DegD(op.longitude_i)); : screen->estimatedHeading(DegD(op.latitude_i), DegD(op.longitude_i));
CompassRenderer::drawCompassNorth(display, compassX, compassY, myHeading);
const auto &p = node->position; const auto &p = node->position;
/* unused /* unused
@ -450,9 +449,10 @@ void drawNodeInfo(OLEDDisplay *display, const OLEDDisplayUiState *state, int16_t
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)
bearing -= myHeading; bearing -= myHeading;
CompassRenderer::drawNodeHeading(display, compassX, compassY, compassDiam, bearing);
display->drawCircle(compassX, compassY, compassRadius); display->drawCircle(compassX, compassY, compassRadius);
CompassRenderer::drawCompassNorth(display, compassX, compassY, myHeading, compassRadius);
CompassRenderer::drawNodeHeading(display, compassX, compassY, compassDiam, bearing);
} }
// else show nothing // else show nothing
} else { } else {
@ -489,7 +489,7 @@ void drawNodeInfo(OLEDDisplay *display, const OLEDDisplayUiState *state, int16_t
const auto &op = ourNode->position; const auto &op = ourNode->position;
float myHeading = screen->hasHeading() ? screen->getHeading() * PI / 180 float myHeading = screen->hasHeading() ? screen->getHeading() * PI / 180
: screen->estimatedHeading(DegD(op.latitude_i), DegD(op.longitude_i)); : screen->estimatedHeading(DegD(op.latitude_i), DegD(op.longitude_i));
graphics::CompassRenderer::drawCompassNorth(display, compassX, compassY, myHeading); graphics::CompassRenderer::drawCompassNorth(display, compassX, compassY, myHeading, compassRadius);
const auto &p = node->position; const auto &p = node->position;
/* unused /* unused

View File

@ -140,7 +140,7 @@ void WaypointModule::drawFrame(OLEDDisplay *display, OLEDDisplayUiState *state,
myHeading = (screen->getHeading()) * PI / 180; // gotta convert compass degrees to Radians myHeading = (screen->getHeading()) * PI / 180; // gotta convert compass degrees to Radians
else else
myHeading = screen->estimatedHeading(DegD(op.latitude_i), DegD(op.longitude_i)); myHeading = screen->estimatedHeading(DegD(op.latitude_i), DegD(op.longitude_i));
graphics::CompassRenderer::drawCompassNorth(display, compassX, compassY, myHeading); graphics::CompassRenderer::drawCompassNorth(display, compassX, compassY, myHeading, (compassDiam / 2));
// Compass bearing to waypoint // Compass bearing to waypoint
float bearingToOther = float bearingToOther =

View File

@ -60,7 +60,7 @@ void MotionSensor::drawFrameCalibration(OLEDDisplay *display, OLEDDisplayUiState
compassY = y + FONT_HEIGHT_SMALL + (display->getHeight() - FONT_HEIGHT_SMALL) / 2; compassY = y + FONT_HEIGHT_SMALL + (display->getHeight() - FONT_HEIGHT_SMALL) / 2;
} }
display->drawCircle(compassX, compassY, compassDiam / 2); display->drawCircle(compassX, compassY, compassDiam / 2);
graphics::CompassRenderer::drawCompassNorth(display, compassX, compassY, screen->getHeading() * PI / 180); graphics::CompassRenderer::drawCompassNorth(display, compassX, compassY, screen->getHeading() * PI / 180, (compassDiam / 2));
} }
#endif #endif