mirror of
https://github.com/meshtastic/firmware.git
synced 2025-06-08 06:02:05 +00:00
Update drawCompassNorth to include radius
This commit is contained in:
parent
51c90be8ed
commit
673f5d3ede
@ -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");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -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);
|
||||||
|
|
||||||
|
@ -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));
|
||||||
|
@ -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
|
||||||
|
@ -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 =
|
||||||
|
@ -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
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user