Geomap speed display (#1722)

* speed to geomap
* Add speed to map
* Fix hidden state
* UI fix on ADSB tx
* UI fixes
This commit is contained in:
Totoo 2024-01-05 13:44:30 +01:00 committed by GitHub
parent d303098e35
commit 82a6ae0791
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
9 changed files with 86 additions and 23 deletions

View File

@ -293,6 +293,7 @@ AISRecentEntryDetailView::AISRecentEntryDetailView(NavigationView& nav) {
ais::format::text(entry_.name), ais::format::text(entry_.name),
0, 0,
GeoPos::alt_unit::METERS, GeoPos::alt_unit::METERS,
GeoPos::spd_unit::NONE,
ais::format::latlon_float(entry_.last_position.latitude.normalized()), ais::format::latlon_float(entry_.last_position.latitude.normalized()),
ais::format::latlon_float(entry_.last_position.longitude.normalized()), ais::format::latlon_float(entry_.last_position.longitude.normalized()),
entry_.last_position.true_heading, entry_.last_position.true_heading,
@ -315,7 +316,7 @@ AISRecentEntryDetailView& AISRecentEntryDetailView::operator=(const AISRecentEnt
void AISRecentEntryDetailView::update_position() { void AISRecentEntryDetailView::update_position() {
if (send_updates) if (send_updates)
geomap_view->update_position(ais::format::latlon_float(entry_.last_position.latitude.normalized()), ais::format::latlon_float(entry_.last_position.longitude.normalized()), (float)entry_.last_position.true_heading, 0); geomap_view->update_position(ais::format::latlon_float(entry_.last_position.latitude.normalized()), ais::format::latlon_float(entry_.last_position.longitude.normalized()), (float)entry_.last_position.true_heading, 0, entry_.last_position.speed_over_ground);
} }
void AISRecentEntryDetailView::focus() { void AISRecentEntryDetailView::focus() {

View File

@ -266,6 +266,7 @@ ADSBRxDetailsView::ADSBRxDetailsView(
get_map_tag(entry_), get_map_tag(entry_),
entry_.pos.altitude, entry_.pos.altitude,
GeoPos::alt_unit::FEET, GeoPos::alt_unit::FEET,
GeoPos::spd_unit::MPH,
entry_.pos.latitude, entry_.pos.latitude,
entry_.pos.longitude, entry_.pos.longitude,
entry_.velo.heading); entry_.velo.heading);
@ -290,7 +291,7 @@ void ADSBRxDetailsView::update(const AircraftRecentEntry& entry) {
} else if (geomap_view_) { } else if (geomap_view_) {
// Map is showing, update the current item. // Map is showing, update the current item.
geomap_view_->update_tag(get_map_tag(entry_)); geomap_view_->update_tag(get_map_tag(entry_));
geomap_view_->update_position(entry.pos.latitude, entry.pos.longitude, entry.velo.heading, entry.pos.altitude); geomap_view_->update_position(entry.pos.latitude, entry.pos.longitude, entry.velo.heading, entry.pos.altitude, entry.velo.speed);
} else { } else {
// Details is showing, update details. // Details is showing, update details.
refresh_ui(); refresh_ui();

View File

@ -85,10 +85,12 @@ ADSBPositionView::ADSBPositionView(
nav.push<GeoMapView>( nav.push<GeoMapView>(
geopos.altitude(), geopos.altitude(),
GeoPos::alt_unit::FEET, GeoPos::alt_unit::FEET,
GeoPos::spd_unit::HIDDEN,
geopos.lat(), geopos.lat(),
geopos.lon(), geopos.lon(),
[this](int32_t altitude, float lat, float lon) { [this](int32_t altitude, float lat, float lon, int32_t speed) {
geopos.set_altitude(altitude); geopos.set_altitude(altitude);
geopos.set_speed(speed);
geopos.set_lat(lat); geopos.set_lat(lat);
geopos.set_lon(lon); geopos.set_lon(lon);
}); });

View File

@ -58,7 +58,8 @@ class ADSBPositionView : public OptionTabView {
private: private:
GeoPos geopos{ GeoPos geopos{
{0, 2 * 16}, {0, 2 * 16},
GeoPos::FEET}; GeoPos::FEET,
GeoPos::HIDDEN};
Button button_set_map{ Button button_set_map{
{8 * 8, 6 * 16, 14 * 8, 2 * 16}, {8 * 8, 6 * 16, 14 * 8, 2 * 16},

View File

@ -317,7 +317,7 @@ void APRSDetailsView::update() {
} }
if (send_updates) if (send_updates)
geomap_view->update_position(entry_copy.pos.latitude, entry_copy.pos.longitude, 0, 0); geomap_view->update_position(entry_copy.pos.latitude, entry_copy.pos.longitude, 0, 0, 0);
} }
APRSDetailsView::~APRSDetailsView() { APRSDetailsView::~APRSDetailsView() {
@ -339,6 +339,7 @@ APRSDetailsView::APRSDetailsView(
entry_copy.source_formatted, entry_copy.source_formatted,
0, // entry_copy.pos.altitude, 0, // entry_copy.pos.altitude,
GeoPos::alt_unit::FEET, GeoPos::alt_unit::FEET,
GeoPos::spd_unit::HIDDEN,
entry_copy.pos.latitude, entry_copy.pos.latitude,
entry_copy.pos.longitude, entry_copy.pos.longitude,
0, /*entry_copy.velo.heading,*/ 0, /*entry_copy.velo.heading,*/

View File

@ -94,6 +94,7 @@ SondeView::SondeView(NavigationView& nav)
sonde_id, sonde_id,
gps_info.alt, gps_info.alt,
GeoPos::alt_unit::METERS, GeoPos::alt_unit::METERS,
GeoPos::spd_unit::HIDDEN,
gps_info.lat, gps_info.lat,
gps_info.lon, gps_info.lon,
999); // set a dummy heading out of range to draw a cross...probably not ideal? 999); // set a dummy heading out of range to draw a cross...probably not ideal?

View File

@ -162,7 +162,8 @@ class SondeView : public View {
GeoPos geopos{ GeoPos geopos{
{0, 12 * 16}, {0, 12 * 16},
GeoPos::alt_unit::METERS}; GeoPos::alt_unit::METERS,
GeoPos::spd_unit::HIDDEN};
Button button_see_qr{ Button button_see_qr{
{2 * 8, 15 * 16, 12 * 8, 3 * 16}, {2 * 8, 15 * 16, 12 * 8, 3 * 16},

View File

@ -38,13 +38,17 @@ namespace ui {
GeoPos::GeoPos( GeoPos::GeoPos(
const Point pos, const Point pos,
const alt_unit altitude_unit) const alt_unit altitude_unit,
: altitude_unit_(altitude_unit) { const spd_unit speed_unit)
: altitude_unit_(altitude_unit), speed_unit_(speed_unit) {
set_parent_rect({pos, {30 * 8, 3 * 16}}); set_parent_rect({pos, {30 * 8, 3 * 16}});
add_children({&labels_position, add_children({&labels_position,
&label_spd_position,
&field_altitude, &field_altitude,
&field_speed,
&text_alt_unit, &text_alt_unit,
&text_speed_unit,
&field_lat_degrees, &field_lat_degrees,
&field_lat_minutes, &field_lat_minutes,
&field_lat_seconds, &field_lat_seconds,
@ -56,6 +60,7 @@ GeoPos::GeoPos(
// Defaults // Defaults
set_altitude(0); set_altitude(0);
set_speed(0);
set_lat(0); set_lat(0);
set_lon(0); set_lon(0);
@ -67,10 +72,11 @@ GeoPos::GeoPos(
text_lon_decimal.set(to_string_decimal(lon_value, 5)); text_lon_decimal.set(to_string_decimal(lon_value, 5));
if (on_change && report_change) if (on_change && report_change)
on_change(altitude(), lat_value, lon_value); on_change(altitude(), lat_value, lon_value, speed());
}; };
field_altitude.on_change = changed_fn; field_altitude.on_change = changed_fn;
field_speed.on_change = changed_fn;
field_lat_degrees.on_change = changed_fn; field_lat_degrees.on_change = changed_fn;
field_lat_minutes.on_change = changed_fn; field_lat_minutes.on_change = changed_fn;
field_lat_seconds.on_change = changed_fn; field_lat_seconds.on_change = changed_fn;
@ -79,11 +85,19 @@ GeoPos::GeoPos(
field_lon_seconds.on_change = changed_fn; field_lon_seconds.on_change = changed_fn;
text_alt_unit.set(altitude_unit_ ? "m" : "ft"); text_alt_unit.set(altitude_unit_ ? "m" : "ft");
if (speed_unit_ == KMPH) text_speed_unit.set("kmph");
if (speed_unit_ == MPH) text_speed_unit.set("mph");
if (speed_unit_ == HIDDEN) {
text_speed_unit.hidden(true);
label_spd_position.hidden(true);
field_speed.hidden(true);
}
} }
void GeoPos::set_read_only(bool v) { void GeoPos::set_read_only(bool v) {
// only setting altitude to read-only (allow manual panning via lat/lon fields) // only setting altitude to read-only (allow manual panning via lat/lon fields)
field_altitude.set_focusable(!v); field_altitude.set_focusable(!v);
field_speed.set_focusable(!v);
} }
// Stupid hack to avoid an event loop // Stupid hack to avoid an event loop
@ -98,14 +112,18 @@ void GeoPos::focus() {
field_lat_degrees.focus(); field_lat_degrees.focus();
} }
void GeoPos::hide_altitude() { void GeoPos::hide_altandspeed() {
// Color altitude grey to indicate it's not updated in manual panning mode // Color altitude grey to indicate it's not updated in manual panning mode
field_altitude.set_style(&Styles::grey); field_altitude.set_style(&Styles::grey);
field_speed.set_style(&Styles::grey);
} }
void GeoPos::set_altitude(int32_t altitude) { void GeoPos::set_altitude(int32_t altitude) {
field_altitude.set_value(altitude); field_altitude.set_value(altitude);
} }
void GeoPos::set_speed(int32_t speed) {
field_speed.set_value(speed);
}
void GeoPos::set_lat(float lat) { void GeoPos::set_lat(float lat) {
field_lat_degrees.set_value(lat); field_lat_degrees.set_value(lat);
@ -139,6 +157,10 @@ int32_t GeoPos::altitude() {
return field_altitude.value(); return field_altitude.value();
}; };
int32_t GeoPos::speed() {
return field_speed.value();
};
GeoMap::GeoMap( GeoMap::GeoMap(
Rect parent_rect) Rect parent_rect)
: Widget{parent_rect}, markerListLen(0) { : Widget{parent_rect}, markerListLen(0) {
@ -458,7 +480,7 @@ void GeoMapView::focus() {
nav_.display_modal("No map", "No world_map.bin file in\n/ADSB/ directory", ABORT); nav_.display_modal("No map", "No world_map.bin file in\n/ADSB/ directory", ABORT);
} }
void GeoMapView::update_position(float lat, float lon, uint16_t angle, int32_t altitude) { void GeoMapView::update_position(float lat, float lon, uint16_t angle, int32_t altitude, int32_t speed) {
if (geomap.manual_panning()) { if (geomap.manual_panning()) {
geomap.set_dirty(); geomap.set_dirty();
return; return;
@ -467,12 +489,14 @@ void GeoMapView::update_position(float lat, float lon, uint16_t angle, int32_t a
lat_ = lat; lat_ = lat;
lon_ = lon; lon_ = lon;
altitude_ = altitude; altitude_ = altitude;
speed_ = speed;
// Stupid hack to avoid an event loop // Stupid hack to avoid an event loop
geopos.set_report_change(false); geopos.set_report_change(false);
geopos.set_lat(lat_); geopos.set_lat(lat_);
geopos.set_lon(lon_); geopos.set_lon(lon_);
geopos.set_altitude(altitude_); geopos.set_altitude(altitude_);
geopos.set_speed(speed_);
geopos.set_report_change(true); geopos.set_report_change(true);
geomap.set_angle(angle); geomap.set_angle(angle);
@ -491,11 +515,12 @@ void GeoMapView::setup() {
geopos.set_lat(lat_); geopos.set_lat(lat_);
geopos.set_lon(lon_); geopos.set_lon(lon_);
geopos.on_change = [this](int32_t altitude, float lat, float lon) { geopos.on_change = [this](int32_t altitude, float lat, float lon, int32_t speed) {
altitude_ = altitude; altitude_ = altitude;
lat_ = lat; lat_ = lat;
lon_ = lon; lon_ = lon;
geopos.hide_altitude(); speed_ = speed;
geopos.hide_altandspeed();
geomap.set_manual_panning(true); geomap.set_manual_panning(true);
geomap.move(lon_, lat_); geomap.move(lon_, lat_);
geomap.set_dirty(); geomap.set_dirty();
@ -527,6 +552,7 @@ GeoMapView::GeoMapView(
const std::string& tag, const std::string& tag,
int32_t altitude, int32_t altitude,
GeoPos::alt_unit altitude_unit, GeoPos::alt_unit altitude_unit,
GeoPos::spd_unit speed_unit,
float lat, float lat,
float lon, float lon,
uint16_t angle, uint16_t angle,
@ -534,6 +560,7 @@ GeoMapView::GeoMapView(
: nav_(nav), : nav_(nav),
altitude_(altitude), altitude_(altitude),
altitude_unit_(altitude_unit), altitude_unit_(altitude_unit),
speed_unit_(speed_unit),
lat_(lat), lat_(lat),
lon_(lon), lon_(lon),
angle_(angle), angle_(angle),
@ -561,12 +588,14 @@ GeoMapView::GeoMapView(
NavigationView& nav, NavigationView& nav,
int32_t altitude, int32_t altitude,
GeoPos::alt_unit altitude_unit, GeoPos::alt_unit altitude_unit,
GeoPos::spd_unit speed_unit,
float lat, float lat,
float lon, float lon,
const std::function<void(int32_t, float, float)> on_done) const std::function<void(int32_t, float, float, int32_t)> on_done)
: nav_(nav), : nav_(nav),
altitude_(altitude), altitude_(altitude),
altitude_unit_(altitude_unit), altitude_unit_(altitude_unit),
speed_unit_(speed_unit),
lat_(lat), lat_(lat),
lon_(lon) { lon_(lon) {
mode_ = PROMPT; mode_ = PROMPT;
@ -585,7 +614,7 @@ GeoMapView::GeoMapView(
button_ok.on_select = [this, on_done, &nav](Button&) { button_ok.on_select = [this, on_done, &nav](Button&) {
if (on_done) if (on_done)
on_done(altitude_, lat_, lon_); on_done(altitude_, lat_, lon_, speed_);
nav.pop(); nav.pop();
}; };
} }

View File

@ -62,19 +62,27 @@ class GeoPos : public View {
FEET = 0, FEET = 0,
METERS METERS
}; };
enum spd_unit {
NONE = 0,
MPH,
KMPH,
HIDDEN = 255
};
std::function<void(int32_t, float, float)> on_change{}; std::function<void(int32_t, float, float, int32_t)> on_change{};
GeoPos(const Point pos, const alt_unit altitude_unit); GeoPos(const Point pos, const alt_unit altitude_unit, const spd_unit speed_unit);
void focus() override; void focus() override;
void set_read_only(bool v); void set_read_only(bool v);
void set_altitude(int32_t altitude); void set_altitude(int32_t altitude);
void set_speed(int32_t speed);
void set_lat(float lat); void set_lat(float lat);
void set_lon(float lon); void set_lon(float lon);
int32_t altitude(); int32_t altitude();
void hide_altitude(); int32_t speed();
void hide_altandspeed();
float lat(); float lat();
float lon(); float lon();
@ -84,22 +92,35 @@ class GeoPos : public View {
bool read_only{false}; bool read_only{false};
bool report_change{true}; bool report_change{true};
alt_unit altitude_unit_{}; alt_unit altitude_unit_{};
spd_unit speed_unit_{};
Labels labels_position{ Labels labels_position{
{{1 * 8, 0 * 16}, "Alt:", Color::light_grey()}, {{1 * 8, 0 * 16}, "Alt:", Color::light_grey()},
{{1 * 8, 1 * 16}, "Lat: \xB0 ' \"", Color::light_grey()}, // 0xB0 is degree ° symbol in our 8x16 font {{1 * 8, 1 * 16}, "Lat: \xB0 ' \"", Color::light_grey()}, // 0xB0 is degree ° symbol in our 8x16 font
{{1 * 8, 2 * 16}, "Lon: \xB0 ' \"", Color::light_grey()}, {{1 * 8, 2 * 16}, "Lon: \xB0 ' \"", Color::light_grey()},
}; };
Labels label_spd_position{
{{15 * 8, 0 * 16}, "Spd:", Color::light_grey()},
};
NumberField field_altitude{ NumberField field_altitude{
{6 * 8, 0 * 16}, {6 * 8, 0 * 16},
5, 5,
{-1000, 50000}, {-1000, 50000},
250, 250,
' '}; ' '};
NumberField field_speed{
{19 * 8, 0 * 16},
4,
{0, 5000},
1,
' '};
Text text_alt_unit{ Text text_alt_unit{
{12 * 8, 0 * 16, 2 * 8, 16}, {12 * 8, 0 * 16, 2 * 8, 16},
""}; ""};
Text text_speed_unit{
{25 * 8, 0 * 16, 4 * 8, 16},
""};
NumberField field_lat_degrees{ NumberField field_lat_degrees{
{5 * 8, 1 * 16}, {5 * 8, 1 * 16},
@ -224,6 +245,7 @@ class GeoMapView : public View {
const std::string& tag, const std::string& tag,
int32_t altitude, int32_t altitude,
GeoPos::alt_unit altitude_unit, GeoPos::alt_unit altitude_unit,
GeoPos::spd_unit speed_unit,
float lat, float lat,
float lon, float lon,
uint16_t angle, uint16_t angle,
@ -231,9 +253,10 @@ class GeoMapView : public View {
GeoMapView(NavigationView& nav, GeoMapView(NavigationView& nav,
int32_t altitude, int32_t altitude,
GeoPos::alt_unit altitude_unit, GeoPos::alt_unit altitude_unit,
GeoPos::spd_unit speed_unit,
float lat, float lat,
float lon, float lon,
const std::function<void(int32_t, float, float)> on_done); const std::function<void(int32_t, float, float, int32_t)> on_done);
~GeoMapView(); ~GeoMapView();
GeoMapView(const GeoMapView&) = delete; GeoMapView(const GeoMapView&) = delete;
@ -243,7 +266,7 @@ class GeoMapView : public View {
void focus() override; void focus() override;
void update_position(float lat, float lon, uint16_t angle, int32_t altitude); void update_position(float lat, float lon, uint16_t angle, int32_t altitude, int32_t speed = 0);
std::string title() const override { return "Map view"; }; std::string title() const override { return "Map view"; };
@ -257,10 +280,12 @@ class GeoMapView : public View {
void setup(); void setup();
const std::function<void(int32_t, float, float)> on_done{}; const std::function<void(int32_t, float, float, int32_t)> on_done{};
GeoMapMode mode_{}; GeoMapMode mode_{};
int32_t altitude_{}; int32_t altitude_{};
int32_t speed_{};
GeoPos::alt_unit altitude_unit_{}; GeoPos::alt_unit altitude_unit_{};
GeoPos::spd_unit speed_unit_{};
float lat_{}; float lat_{};
float lon_{}; float lon_{};
uint16_t angle_{}; uint16_t angle_{};
@ -270,7 +295,8 @@ class GeoMapView : public View {
GeoPos geopos{ GeoPos geopos{
{0, 0}, {0, 0},
altitude_unit_}; altitude_unit_,
speed_unit_};
GeoMap geomap{ GeoMap geomap{
{0, GeoMap::banner_height, GeoMap::geomap_rect_width, GeoMap::geomap_rect_height}}; {0, GeoMap::banner_height, GeoMap::geomap_rect_width, GeoMap::geomap_rect_height}};