mirror of
https://github.com/portapack-mayhem/mayhem-firmware.git
synced 2026-09-11 09:09:29 +00:00
Add altitude-based color coding for map markers in adsb (#3004)
* Add altitude-based color coding for map markers in adsb
This commit is contained in:
@@ -320,6 +320,47 @@ void ADSBRxDetailsView::update(const AircraftRecentEntry& entry) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void ADSBRxDetailsView::get_altitude_color(int32_t alt_ft, uint8_t* r, uint8_t* g, uint8_t* b) {
|
||||||
|
static const struct {
|
||||||
|
int32_t alt;
|
||||||
|
uint8_t r, g, b;
|
||||||
|
} stops[] = {
|
||||||
|
{0, 220, 220, 220}, // 0 ft: White/Grey (Ground)
|
||||||
|
{2000, 255, 255, 0}, // 2k ft: Yellow
|
||||||
|
{10000, 0, 255, 0}, // 10k ft: Green
|
||||||
|
{20000, 0, 255, 255}, // 20k ft: Cyan
|
||||||
|
{30000, 60, 60, 255}, // 30k ft: Blue (Lightened for visibility on Black)
|
||||||
|
{40000, 255, 0, 255} // 40k+ ft: Magenta
|
||||||
|
};
|
||||||
|
if (alt_ft <= stops[0].alt) {
|
||||||
|
*r = stops[0].r;
|
||||||
|
*g = stops[0].g;
|
||||||
|
*b = stops[0].b;
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
const int count = sizeof(stops) / sizeof(stops[0]);
|
||||||
|
if (alt_ft >= stops[count - 1].alt) {
|
||||||
|
*r = stops[count - 1].r;
|
||||||
|
*g = stops[count - 1].g;
|
||||||
|
*b = stops[count - 1].b;
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
for (int i = 0; i < count - 1; i++) {
|
||||||
|
if (alt_ft < stops[i + 1].alt) {
|
||||||
|
float t = (float)(alt_ft - stops[i].alt) / (stops[i + 1].alt - stops[i].alt);
|
||||||
|
|
||||||
|
*r = (uint8_t)(stops[i].r + (stops[i + 1].r - stops[i].r) * t);
|
||||||
|
*g = (uint8_t)(stops[i].g + (stops[i + 1].g - stops[i].g) * t);
|
||||||
|
*b = (uint8_t)(stops[i].b + (stops[i + 1].b - stops[i].b) * t);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
// Fallback: in case no interval matched, default to ground color.
|
||||||
|
*r = stops[0].r;
|
||||||
|
*g = stops[0].g;
|
||||||
|
*b = stops[0].b;
|
||||||
|
}
|
||||||
|
|
||||||
void ADSBRxDetailsView::clear_map_markers() {
|
void ADSBRxDetailsView::clear_map_markers() {
|
||||||
if (geomap_view_)
|
if (geomap_view_)
|
||||||
geomap_view_->clear_markers();
|
geomap_view_->clear_markers();
|
||||||
@@ -335,6 +376,9 @@ bool ADSBRxDetailsView::add_map_marker(const AircraftRecentEntry& entry) {
|
|||||||
marker.lat = entry.pos.latitude;
|
marker.lat = entry.pos.latitude;
|
||||||
marker.angle = entry.velo.heading;
|
marker.angle = entry.velo.heading;
|
||||||
marker.tag = get_map_tag(entry);
|
marker.tag = get_map_tag(entry);
|
||||||
|
uint8_t r, g, b;
|
||||||
|
get_altitude_color(entry.pos.altitude, &r, &g, &b);
|
||||||
|
marker.color = Color(r, g, b);
|
||||||
|
|
||||||
auto markerStored = geomap_view_->store_marker(marker);
|
auto markerStored = geomap_view_->store_marker(marker);
|
||||||
return markerStored == MARKER_STORED;
|
return markerStored == MARKER_STORED;
|
||||||
|
|||||||
@@ -270,6 +270,7 @@ class ADSBRxDetailsView : public View {
|
|||||||
void focus() override;
|
void focus() override;
|
||||||
void update(const AircraftRecentEntry& entry);
|
void update(const AircraftRecentEntry& entry);
|
||||||
|
|
||||||
|
void get_altitude_color(int32_t alt_ft, uint8_t* r, uint8_t* g, uint8_t* b);
|
||||||
/* Calls forwarded to map view if shown. */
|
/* Calls forwarded to map view if shown. */
|
||||||
bool map_active() const { return geomap_view_; }
|
bool map_active() const { return geomap_view_; }
|
||||||
void clear_map_markers();
|
void clear_map_markers();
|
||||||
|
|||||||
@@ -265,7 +265,7 @@ void GeoMap::map_read_line_bin(ui::Color* buffer, uint16_t pixels) {
|
|||||||
|
|
||||||
void GeoMap::draw_markers(Painter& painter) {
|
void GeoMap::draw_markers(Painter& painter) {
|
||||||
for (int i = 0; i < markerListLen; ++i) {
|
for (int i = 0; i < markerListLen; ++i) {
|
||||||
draw_marker_item(painter, markerList[i], Color::blue(), Color::blue(), Color::magenta());
|
draw_marker_item(painter, markerList[i], markerList[i].color, markerList[i].color, Color::black());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -826,7 +826,7 @@ void GeoMap::update_my_position(float lat, float lon, int32_t altitude) {
|
|||||||
my_pos.lat = lat;
|
my_pos.lat = lat;
|
||||||
my_pos.lon = lon;
|
my_pos.lon = lon;
|
||||||
my_altitude = altitude;
|
my_altitude = altitude;
|
||||||
redraw_map = is_changed;
|
redraw_map |= is_changed;
|
||||||
set_dirty();
|
set_dirty();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -62,13 +62,14 @@ struct GeoMarker {
|
|||||||
float lon{0};
|
float lon{0};
|
||||||
uint16_t angle{0};
|
uint16_t angle{0};
|
||||||
std::string tag{""};
|
std::string tag{""};
|
||||||
|
Color color{Color::blue()};
|
||||||
|
|
||||||
GeoMarker& operator=(GeoMarker& rhs) {
|
GeoMarker& operator=(const GeoMarker& rhs) {
|
||||||
lat = rhs.lat;
|
lat = rhs.lat;
|
||||||
lon = rhs.lon;
|
lon = rhs.lon;
|
||||||
angle = rhs.angle;
|
angle = rhs.angle;
|
||||||
tag = rhs.tag;
|
tag = rhs.tag;
|
||||||
|
color = rhs.color;
|
||||||
return *this;
|
return *this;
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|||||||
Reference in New Issue
Block a user