mirror of
https://github.com/meshtastic/firmware.git
synced 2025-08-06 05:34:45 +00:00
Draw last-seen time instead of compass
This is likely more important - don't want to wander to a device that is off.
This commit is contained in:
parent
9104070e94
commit
32be1d9f6c
@ -98,7 +98,7 @@ int BRCAddress::radial(char *buf, size_t len)
|
|||||||
return snprintf(buf, len, "%d:%02d", hour, minute);
|
return snprintf(buf, len, "%d:%02d", hour, minute);
|
||||||
};
|
};
|
||||||
|
|
||||||
int BRCAddress::annular(char *buf, size_t len)
|
int BRCAddress::annular(char *buf, size_t len, bool noUnit)
|
||||||
{
|
{
|
||||||
const char *unit = "m";
|
const char *unit = "m";
|
||||||
float unitMultiplier = FEET_TO_METER;
|
float unitMultiplier = FEET_TO_METER;
|
||||||
@ -106,6 +106,7 @@ int BRCAddress::annular(char *buf, size_t len)
|
|||||||
unitMultiplier = 1.0;
|
unitMultiplier = 1.0;
|
||||||
unit = "ft";
|
unit = "ft";
|
||||||
}
|
}
|
||||||
|
if (noUnit) unit = "";
|
||||||
|
|
||||||
if (bearing > 1.75 && bearing < 10.25) {
|
if (bearing > 1.75 && bearing < 10.25) {
|
||||||
const char *street = nullptr;
|
const char *street = nullptr;
|
||||||
@ -134,7 +135,17 @@ int BRCAddress::full(char *buf, size_t len)
|
|||||||
*(buf++) = ' ';
|
*(buf++) = ' ';
|
||||||
*(buf++) = '&';
|
*(buf++) = '&';
|
||||||
*(buf++) = ' ';
|
*(buf++) = ' ';
|
||||||
buf += annular(buf, len - l - 4);
|
buf += annular(buf, len - l - 4, false);
|
||||||
|
buf[l] = 0; // always null terminated
|
||||||
|
return l;
|
||||||
|
};
|
||||||
|
|
||||||
|
int BRCAddress::compact(char *buf, size_t len)
|
||||||
|
{
|
||||||
|
auto l = radial(buf, len - 2);
|
||||||
|
buf += l;
|
||||||
|
*(buf++) = '&';
|
||||||
|
buf += annular(buf, len - l - 2, true);
|
||||||
buf[l] = 0; // always null terminated
|
buf[l] = 0; // always null terminated
|
||||||
return l;
|
return l;
|
||||||
};
|
};
|
||||||
|
@ -6,8 +6,9 @@ class BRCAddress
|
|||||||
BRCAddress(int32_t lat, int32_t lon);
|
BRCAddress(int32_t lat, int32_t lon);
|
||||||
|
|
||||||
int radial(char *buf, size_t len);
|
int radial(char *buf, size_t len);
|
||||||
int annular(char *buf, size_t len);
|
int annular(char *buf, size_t len, bool noUnit);
|
||||||
int full(char *buf, size_t len);
|
int full(char *buf, size_t len);
|
||||||
|
int compact(char *buf, size_t len);
|
||||||
|
|
||||||
private:
|
private:
|
||||||
float bearing;
|
float bearing;
|
||||||
|
@ -345,15 +345,16 @@ void drawEntryBRC(OLEDDisplay *display, meshtastic_NodeInfoLite *node, int16_t x
|
|||||||
int nameMaxWidth = columnWidth - (isHighResolution ? (isLeftCol ? 25 : 28) : (isLeftCol ? 20 : 22));
|
int nameMaxWidth = columnWidth - (isHighResolution ? (isLeftCol ? 25 : 28) : (isLeftCol ? 20 : 22));
|
||||||
|
|
||||||
const char *nodeName = getSafeNodeName(node);
|
const char *nodeName = getSafeNodeName(node);
|
||||||
auto nameWidth = display->getStringWidth("XXXXX");
|
|
||||||
display->setTextAlignment(TEXT_ALIGN_LEFT);
|
display->setTextAlignment(TEXT_ALIGN_LEFT);
|
||||||
display->setFont(FONT_SMALL);
|
display->setFont(FONT_SMALL);
|
||||||
auto xText = x + ((isHighResolution) ? 6 : 3);
|
auto xText = x + ((isHighResolution) ? 6 : 3);
|
||||||
display->drawStringMaxWidth(xText, y, nameMaxWidth, nodeName);
|
display->drawString(xText, y, nodeName);
|
||||||
|
|
||||||
|
char buf[14] = "";
|
||||||
|
BRCAddress(node->position.latitude_i, node->position.longitude_i).compact(buf, 14);
|
||||||
|
auto nameWidth = display->getStringWidth("WWWW"); // Fixed width so they are aligned.
|
||||||
|
display->drawString(xText + nameWidth, y, buf);
|
||||||
|
|
||||||
char buf[32] = "";
|
|
||||||
BRCAddress(node->position.latitude_i, node->position.longitude_i).full(buf, 32);
|
|
||||||
display->drawStringMaxWidth(xText + nameWidth, y, nameMaxWidth - nameWidth + 20, buf);
|
|
||||||
|
|
||||||
if (node->is_favorite) {
|
if (node->is_favorite) {
|
||||||
if (isHighResolution) {
|
if (isHighResolution) {
|
||||||
@ -413,6 +414,34 @@ void drawCompassArrow(OLEDDisplay *display, meshtastic_NodeInfoLite *node, int16
|
|||||||
*/
|
*/
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void drawLastSeenExtra(OLEDDisplay *display, meshtastic_NodeInfoLite *node, int16_t x, int16_t y, int columnWidth,
|
||||||
|
float /*myHeading*/, double /*userLat*/, double /*userLon*/)
|
||||||
|
{
|
||||||
|
char timeStr[10];
|
||||||
|
uint32_t seconds = sinceLastSeen(node);
|
||||||
|
if (seconds == 0 || seconds == UINT32_MAX) {
|
||||||
|
snprintf(timeStr, sizeof(timeStr), "?");
|
||||||
|
} else {
|
||||||
|
uint32_t minutes = seconds / 60, hours = minutes / 60, days = hours / 24;
|
||||||
|
snprintf(timeStr, sizeof(timeStr), (days > 99 ? "?" : "%d%c"),
|
||||||
|
(days ? days
|
||||||
|
: hours ? hours
|
||||||
|
: minutes),
|
||||||
|
(days ? 'd'
|
||||||
|
: hours ? 'h'
|
||||||
|
: 'm'));
|
||||||
|
}
|
||||||
|
|
||||||
|
bool isLeftCol = (x < SCREEN_WIDTH / 2);
|
||||||
|
int timeOffset = (isHighResolution) ? (isLeftCol ? 7 : 10) : (isLeftCol ? 3 : 7);
|
||||||
|
int rightEdge = x + columnWidth - timeOffset;
|
||||||
|
if (timeStr[strlen(timeStr) - 1] == 'm') // Fix the fact that our fonts don't line up well all the time
|
||||||
|
rightEdge -= 1;
|
||||||
|
//display->setTextAlignment(TEXT_ALIGN_RIGHT);
|
||||||
|
int textWidth = display->getStringWidth(timeStr);
|
||||||
|
display->drawString(rightEdge - textWidth, y, timeStr);
|
||||||
|
}
|
||||||
|
|
||||||
// =============================
|
// =============================
|
||||||
// Main Screen Functions
|
// Main Screen Functions
|
||||||
// =============================
|
// =============================
|
||||||
@ -569,27 +598,11 @@ void drawNodeListWithCompasses(OLEDDisplay *display, OLEDDisplayUiState *state,
|
|||||||
|
|
||||||
void drawBRCList(OLEDDisplay *display, OLEDDisplayUiState *state, int16_t x, int16_t y)
|
void drawBRCList(OLEDDisplay *display, OLEDDisplayUiState *state, int16_t x, int16_t y)
|
||||||
{
|
{
|
||||||
float heading = 0;
|
|
||||||
bool validHeading = false;
|
|
||||||
auto ourNode = nodeDB->getMeshNode(nodeDB->getNodeNum());
|
auto ourNode = nodeDB->getMeshNode(nodeDB->getNodeNum());
|
||||||
double lat = DegD(ourNode->position.latitude_i);
|
double lat = DegD(ourNode->position.latitude_i);
|
||||||
double lon = DegD(ourNode->position.longitude_i);
|
double lon = DegD(ourNode->position.longitude_i);
|
||||||
|
|
||||||
if (uiconfig.compass_mode != meshtastic_CompassMode_FREEZE_HEADING) {
|
drawNodeListScreen(display, state, x, y, "BRC", drawEntryBRC, drawLastSeenExtra, 0, lat, lon, 1);
|
||||||
#if HAS_GPS
|
|
||||||
if (screen->hasHeading()) {
|
|
||||||
heading = screen->getHeading(); // degrees
|
|
||||||
validHeading = true;
|
|
||||||
} else {
|
|
||||||
heading = screen->estimatedHeading(lat, lon);
|
|
||||||
validHeading = !isnan(heading);
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
if (!validHeading)
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
drawNodeListScreen(display, state, x, y, "Black Rock City", drawEntryBRC, drawCompassArrow, heading, lat, lon, 1);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Draw a series of fields in a column, wrapping to multiple columns if needed
|
/// Draw a series of fields in a column, wrapping to multiple columns if needed
|
||||||
|
Loading…
Reference in New Issue
Block a user