refactor(ui): rename "Breadcrumb" to "Trail" across the feature

User-facing label change requested for the GPS trail viewer. Carries
through internally for consistency:
- Files: Breadcrumb.h → Trail.h, BreadcrumbScreen.h → TrailScreen.h
- Types: BreadcrumbPoint/Store/Screen → Trail*
- NodePrefs fields: breadcrumb_*_idx → trail_*_idx (same byte layout, no
  sentinel bump needed)
- UITask: _breadcrumb, breadcrumb_screen, gotoBreadcrumbScreen,
  _next_breadcrumb_sample_ms → trail-prefixed equivalents
- Tools menu label "Breadcrumb" → "Trail", screen title "TRAIL"

Status bar indicator stays "G" — semantics ("GPS logging active") match.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
Jakub
2026-05-25 09:10:40 +02:00
co-authored by Claude Sonnet 4.6
parent adef2fceb9
commit ae783edc47
7 changed files with 48 additions and 48 deletions
@@ -44,9 +44,9 @@ public:
if (_sel == 1) { _task->gotoBotScreen(); return true; }
if (_sel == 2) { _task->gotoNearbyScreen(); return true; }
if (_sel == 3) { _task->gotoAutoAdvertScreen(); return true; }
if (_sel == 4) { _task->gotoBreadcrumbScreen(); return true; }
if (_sel == 4) { _task->gotoTrailScreen(); return true; }
}
return false;
}
};
const char* ToolsScreen::ITEMS[5] = { "Ringtone Editor", "Auto-Reply Bot", "Nearby Nodes", "Auto-Advert", "Breadcrumb" };
const char* ToolsScreen::ITEMS[5] = { "Ringtone Editor", "Auto-Reply Bot", "Nearby Nodes", "Auto-Advert", "Trail" };
@@ -1,23 +1,23 @@
#pragma once
// GPS breadcrumb viewer. Tools Breadcrumb.
// GPS trail viewer. Tools Trail.
// Phase 1: Summary view only. Phases 2/3 add Map and List views.
// Included by UITask.cpp after Breadcrumb store + ToolsScreen.
// Included by UITask.cpp after Trail store + ToolsScreen.
#include "../Breadcrumb.h"
#include "../Trail.h"
class BreadcrumbScreen : public UIScreen {
UITask* _task;
BreadcrumbStore* _store;
class TrailScreen : public UIScreen {
UITask* _task;
TrailStore* _store;
public:
BreadcrumbScreen(UITask* task, BreadcrumbStore* store) : _task(task), _store(store) {}
TrailScreen(UITask* task, TrailStore* store) : _task(task), _store(store) {}
void enter() { /* nothing to reset; live trail stays */ }
int render(DisplayDriver& display) override {
display.setTextSize(1);
display.setColor(DisplayDriver::LIGHT);
display.drawTextCentered(display.width() / 2, 0, "BREADCRUMB");
display.drawTextCentered(display.width() / 2, 0, "TRAIL");
display.fillRect(0, display.headerH() - 1, display.width(), display.sepH());
const int y0 = display.listStart();
@@ -31,7 +31,7 @@ public:
display.setCursor(2, y0);
display.print(buf);
snprintf(buf, sizeof(buf), "Points: %d / %d", _store->count(), BreadcrumbStore::CAPACITY);
snprintf(buf, sizeof(buf), "Points: %d / %d", _store->count(), TrailStore::CAPACITY);
display.setCursor(2, y0 + step);
display.print(buf);
+16 -16
View File
@@ -116,7 +116,7 @@ static const int QUICK_MSGS_MAX = 10;
#include "NearbyScreen.h"
#include "DashboardConfigScreen.h"
#include "AutoAdvertScreen.h"
#include "BreadcrumbScreen.h"
#include "TrailScreen.h"
#include "ToolsScreen.h"
// ── HomeScreen ────────────────────────────────────────────────────────────────
@@ -403,8 +403,8 @@ class HomeScreen : public UIScreen {
leftmostX = aX - 1;
}
// "G" indicator — GPS breadcrumb logging active. Same blink convention.
if (_task->breadcrumb().isActive()) {
// "G" indicator — GPS trail logging active. Same blink convention.
if (_task->trail().isActive()) {
int gX = leftmostX - ind;
bool show_g = Features::BLINK_INDICATORS ? ((millis() % 4000) < 2000) : true;
if (show_g) {
@@ -1088,7 +1088,7 @@ void UITask::begin(DisplayDriver* display, SensorManager* sensors, NodePrefs* no
nearby_screen = new NearbyScreen(this);
dashboard_config = new DashboardConfigScreen(this, node_prefs);
auto_advert_screen = new AutoAdvertScreen(this, node_prefs);
breadcrumb_screen = new BreadcrumbScreen(this, &_breadcrumb);
trail_screen = new TrailScreen(this, &_trail);
applyBrightness();
applyFont();
applyRotation();
@@ -1125,9 +1125,9 @@ void UITask::gotoDashboardConfig() {
setCurrScreen(dashboard_config);
}
void UITask::gotoBreadcrumbScreen() {
((BreadcrumbScreen*)breadcrumb_screen)->enter();
setCurrScreen(breadcrumb_screen);
void UITask::gotoTrailScreen() {
((TrailScreen*)trail_screen)->enter();
setCurrScreen(trail_screen);
}
void UITask::gotoAutoAdvertScreen() {
@@ -1747,19 +1747,19 @@ void UITask::loop() {
next_batt_chck = millis() + 8000;
}
// GPS breadcrumb sampling — runs in the background while the trail is
// GPS trail sampling — runs in the background while the trail is
// active, independent of which screen is shown. Skips silently if no GPS
// fix; min-delta gate inside addPoint() avoids near-stationary spam.
if (_breadcrumb.isActive() && _node_prefs != NULL
&& (int32_t)(millis() - _next_breadcrumb_sample_ms) >= 0) {
uint16_t interval_s = BreadcrumbStore::intervalSecs(_node_prefs->breadcrumb_interval_idx);
_next_breadcrumb_sample_ms = millis() + (uint32_t)interval_s * 1000UL;
if (_trail.isActive() && _node_prefs != NULL
&& (int32_t)(millis() - _next_trail_sample_ms) >= 0) {
uint16_t interval_s = TrailStore::intervalSecs(_node_prefs->trail_interval_idx);
_next_trail_sample_ms = millis() + (uint32_t)interval_s * 1000UL;
LocationProvider* loc = _sensors ? _sensors->getLocationProvider() : nullptr;
if (loc && loc->isValid()) {
uint16_t md = BreadcrumbStore::minDeltaMeters(_node_prefs->breadcrumb_min_delta_idx);
_breadcrumb.addPoint((int32_t)loc->getLatitude(),
(int32_t)loc->getLongitude(),
(uint32_t)rtc_clock.getCurrentTime(), md);
uint16_t md = TrailStore::minDeltaMeters(_node_prefs->trail_min_delta_idx);
_trail.addPoint((int32_t)loc->getLatitude(),
(int32_t)loc->getLongitude(),
(uint32_t)rtc_clock.getCurrentTime(), md);
}
}
}
+6 -6
View File
@@ -22,7 +22,7 @@
#include "../AbstractUITask.h"
#include "../NodePrefs.h"
#include "../Breadcrumb.h"
#include "../Trail.h"
class UITask : public AbstractUITask {
DisplayDriver* _display;
@@ -74,11 +74,11 @@ class UITask : public AbstractUITask {
UIScreen* nearby_screen;
UIScreen* dashboard_config;
UIScreen* auto_advert_screen;
UIScreen* breadcrumb_screen;
UIScreen* trail_screen;
UIScreen* curr;
CayenneLPP _dash_lpp;
BreadcrumbStore _breadcrumb;
uint32_t _next_breadcrumb_sample_ms = 0;
TrailStore _trail;
uint32_t _next_trail_sample_ms = 0;
void userLedHandler();
@@ -121,8 +121,8 @@ public:
void gotoNearbyScreen();
void gotoDashboardConfig();
void gotoAutoAdvertScreen();
void gotoBreadcrumbScreen();
BreadcrumbStore& breadcrumb() { return _breadcrumb; }
void gotoTrailScreen();
TrailStore& trail() { return _trail; }
void playMelody(const char* melody);
void stopMelody();
bool isMelodyPlaying();