mirror of
https://github.com/MarekZegare4/MeshCore-Solo.git
synced 2026-08-02 10:16:11 +00:00
feat: add Fav filter and clearer bearing display in NearbyScreen
- Add "Fav" as first filter category (contacts with flags & 1) - Show distance and bearing on separate lines in detail view - Add cardinal direction to bearing: "Az: 245d (SW)" Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
co-authored by
Claude Sonnet 4.6
parent
083ddac85c
commit
404cb6956d
@@ -13,7 +13,7 @@ class NearbyScreen : public UIScreen {
|
|||||||
static const int START_Y = 12;
|
static const int START_Y = 12;
|
||||||
static const int DIST_COL = 86;
|
static const int DIST_COL = 86;
|
||||||
|
|
||||||
static const int FILTER_COUNT = 5;
|
static const int FILTER_COUNT = 6;
|
||||||
static const char* FILTER_LABELS[FILTER_COUNT];
|
static const char* FILTER_LABELS[FILTER_COUNT];
|
||||||
static const uint8_t FILTER_TYPES[FILTER_COUNT];
|
static const uint8_t FILTER_TYPES[FILTER_COUNT];
|
||||||
|
|
||||||
@@ -64,6 +64,11 @@ class NearbyScreen : public UIScreen {
|
|||||||
return (int)(b + 0.5f) % 360;
|
return (int)(b + 0.5f) % 360;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static const char* bearingCardinal(int deg) {
|
||||||
|
static const char* dirs[] = { "N","NE","E","SE","S","SW","W","NW" };
|
||||||
|
return dirs[((deg + 22) % 360) / 45];
|
||||||
|
}
|
||||||
|
|
||||||
static void fmtDist(char* buf, int n, float km) {
|
static void fmtDist(char* buf, int n, float km) {
|
||||||
if (km < 1.0f) snprintf(buf, n, "%dm", (int)(km * 1000 + 0.5f));
|
if (km < 1.0f) snprintf(buf, n, "%dm", (int)(km * 1000 + 0.5f));
|
||||||
else if (km < 100.0f) snprintf(buf, n, "%.1fkm", km);
|
else if (km < 100.0f) snprintf(buf, n, "%.1fkm", km);
|
||||||
@@ -104,7 +109,8 @@ class NearbyScreen : public UIScreen {
|
|||||||
for (int i = 0; i < nc && _count < MAX_NEARBY; i++) {
|
for (int i = 0; i < nc && _count < MAX_NEARBY; i++) {
|
||||||
ContactInfo ci;
|
ContactInfo ci;
|
||||||
if (!the_mesh.getContactByIdx(i, ci)) continue;
|
if (!the_mesh.getContactByIdx(i, ci)) continue;
|
||||||
if (_filter > 0 && ci.type != FILTER_TYPES[_filter]) continue;
|
if (_filter == 0 && !(ci.flags & 1)) continue; // Fav: only starred
|
||||||
|
if (_filter >= 2 && ci.type != FILTER_TYPES[_filter]) continue; // type filter
|
||||||
|
|
||||||
Entry& e = _entries[_count++];
|
Entry& e = _entries[_count++];
|
||||||
strncpy(e.name, ci.name, sizeof(e.name) - 1);
|
strncpy(e.name, ci.name, sizeof(e.name) - 1);
|
||||||
@@ -181,14 +187,18 @@ public:
|
|||||||
if (e.dist_km >= 0.0f) {
|
if (e.dist_km >= 0.0f) {
|
||||||
char dist[12];
|
char dist[12];
|
||||||
fmtDist(dist, sizeof(dist), e.dist_km);
|
fmtDist(dist, sizeof(dist), e.dist_km);
|
||||||
snprintf(buf, sizeof(buf), "Dist:%s %dd", dist, bearingDeg(_own_lat, _own_lon, e.lat_e6, e.lon_e6));
|
int az = bearingDeg(_own_lat, _own_lon, e.lat_e6, e.lon_e6);
|
||||||
|
snprintf(buf, sizeof(buf), "Dist: %s", dist);
|
||||||
display.setCursor(2, 31); display.print(buf);
|
display.setCursor(2, 31); display.print(buf);
|
||||||
|
snprintf(buf, sizeof(buf), "Az: %dd (%s)", az, bearingCardinal(az));
|
||||||
|
display.setCursor(2, 40); display.print(buf);
|
||||||
} else {
|
} else {
|
||||||
display.setCursor(2, 31); display.print("Dist: no own GPS");
|
display.setCursor(2, 31); display.print("Dist: no own GPS");
|
||||||
|
display.setCursor(2, 40); display.print("Az: unknown");
|
||||||
}
|
}
|
||||||
|
|
||||||
snprintf(buf, sizeof(buf), "Type:%s", typeName(e.type));
|
snprintf(buf, sizeof(buf), "Type:%s", typeName(e.type));
|
||||||
display.setCursor(2, 40); display.print(buf);
|
display.setCursor(2, 49); display.print(buf);
|
||||||
|
|
||||||
return 2000;
|
return 2000;
|
||||||
}
|
}
|
||||||
@@ -309,5 +319,5 @@ public:
|
|||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
const char* NearbyScreen::FILTER_LABELS[5] = { "ALL", "Comp", "Rpt", "Room", "Snsr" };
|
const char* NearbyScreen::FILTER_LABELS[6] = { "Fav", "ALL", "Comp", "Rpt", "Room", "Snsr" };
|
||||||
const uint8_t NearbyScreen::FILTER_TYPES[5] = { 0, ADV_TYPE_CHAT, ADV_TYPE_REPEATER, ADV_TYPE_ROOM, ADV_TYPE_SENSOR };
|
const uint8_t NearbyScreen::FILTER_TYPES[6] = { 0, 0, ADV_TYPE_CHAT, ADV_TYPE_REPEATER, ADV_TYPE_ROOM, ADV_TYPE_SENSOR };
|
||||||
|
|||||||
Reference in New Issue
Block a user