From 367eaf54c0f51f62448d9f2d9585fd3629f6b770 Mon Sep 17 00:00:00 2001 From: Copilot <198982749+Copilot@users.noreply.github.com> Date: Sat, 8 Aug 2026 00:40:35 +0200 Subject: [PATCH] Fix GeoPos DMS edge carry rollback at clamped degree limits (#3284) * Initial plan * Fix geomap DMS wrap carry at clamped bounds Co-authored-by: gullradriel <3157857+gullradriel@users.noreply.github.com> --------- Co-authored-by: copilot-swe-agent[bot] <198982749+Copilot@users.noreply.github.com> Co-authored-by: gullradriel <3157857+gullradriel@users.noreply.github.com> --- firmware/application/ui/ui_geomap.cpp | 20 ++++++++++++++++++-- 1 file changed, 18 insertions(+), 2 deletions(-) diff --git a/firmware/application/ui/ui_geomap.cpp b/firmware/application/ui/ui_geomap.cpp index 4da7239b2..dac0fadb1 100644 --- a/firmware/application/ui/ui_geomap.cpp +++ b/firmware/application/ui/ui_geomap.cpp @@ -83,19 +83,35 @@ GeoPos::GeoPos( field_lon_seconds.on_change = changed_fn; const auto wrapped_lat_seconds = [this](int32_t v) { + const auto old_minutes = field_lat_minutes.value(); field_lat_minutes.on_encoder(v); + if (field_lat_minutes.value() == old_minutes) { + field_lat_seconds.set_value((v > 0) ? 59 : 0); + } }; const auto wrapped_lat_minutes = [this](int32_t v) { - field_lat_degrees.on_encoder((field_lat_degrees.value() >= 0) ? v : -v); + const auto old_degrees = field_lat_degrees.value(); + field_lat_degrees.on_encoder((old_degrees >= 0) ? v : -v); + if (field_lat_degrees.value() == old_degrees) { + field_lat_minutes.set_value((v > 0) ? 59 : 0); + } }; const auto wrapped_lon_seconds = [this](int32_t v) { + const auto old_minutes = field_lon_minutes.value(); field_lon_minutes.on_encoder(v); + if (field_lon_minutes.value() == old_minutes) { + field_lon_seconds.set_value((v > 0) ? 59 : 0); + } }; const auto wrapped_lon_minutes = [this](int32_t v) { - field_lon_degrees.on_encoder((field_lon_degrees.value() >= 0) ? v : -v); + const auto old_degrees = field_lon_degrees.value(); + field_lon_degrees.on_encoder((old_degrees >= 0) ? v : -v); + if (field_lon_degrees.value() == old_degrees) { + field_lon_minutes.set_value((v > 0) ? 59 : 0); + } }; field_lat_seconds.on_wrap = wrapped_lat_seconds;