diff --git a/src/graphics/Screen.cpp b/src/graphics/Screen.cpp index ed5e1c3a0..09cafc348 100644 --- a/src/graphics/Screen.cpp +++ b/src/graphics/Screen.cpp @@ -380,13 +380,16 @@ static void drawTextMessageFrame(OLEDDisplay *display, OLEDDisplayUiState *state display->setColor(BLACK); } - tm *tm = localtime(reinterpret_cast(&mp.rx_time)); + uint32_t seconds = sinceReceived(&mp); + uint32_t minutes = seconds / 60; + uint32_t hours = minutes / 60; + uint32_t days = hours / 24; if (config.display.heading_bold) { - display->drawStringf(1 + x, 0 + y, tempBuf, "[%02d:%02d:%02d] From: %s", tm->tm_hour, tm->tm_min, tm->tm_sec, + display->drawStringf(1 + x, 0 + y, tempBuf, "%s ago from %s", screen->drawTimeDelta(days, hours, minutes, seconds), (node && node->has_user) ? node->user.short_name : "???"); } - display->drawStringf(0 + x, 0 + y, tempBuf, "[%02d:%02d:%02d] From: %s", tm->tm_hour, tm->tm_min, tm->tm_sec, + display->drawStringf(0 + x, 0 + y, tempBuf, "%s ago from %s", screen->drawTimeDelta(days, hours, minutes, seconds), (node && node->has_user) ? node->user.short_name : "???"); display->setColor(WHITE); @@ -417,38 +420,6 @@ static void drawColumns(OLEDDisplay *display, int16_t x, int16_t y, const char * } } -#if 0 - /// Draw a series of fields in a row, wrapping to multiple rows if needed - /// @return the max y we ended up printing to - static uint32_t drawRows(OLEDDisplay *display, int16_t x, int16_t y, const char **fields) - { - // The coordinates define the left starting point of the text - display->setTextAlignment(TEXT_ALIGN_LEFT); - - const char **f = fields; - int xo = x, yo = y; - const int COLUMNS = 2; // hardwired for two columns per row.... - int col = 0; // track which column we are on - while (*f) { - display->drawString(xo, yo, *f); - xo += SCREEN_WIDTH / COLUMNS; - // Wrap to next row, if needed. - if (++col >= COLUMNS) { - xo = x; - yo += FONT_HEIGHT_SMALL; - col = 0; - } - f++; - } - if (col != 0) { - // Include last incomplete line in our total. - yo += FONT_HEIGHT_SMALL; - } - - return yo; - } -#endif - // Draw power bars or a charging indicator on an image of a battery, determined by battery charge voltage or percentage. static void drawBattery(OLEDDisplay *display, int16_t x, int16_t y, uint8_t *imgBuffer, const PowerStatus *powerStatus) { @@ -1365,6 +1336,20 @@ void Screen::blink() dispdev.setBrightness(brightness); } +String Screen::drawTimeDelta(uint32_t days, uint32_t hours, uint32_t minutes, uint32_t seconds) +{ + String uptime; + if (days >= 2) + uptime = String(days) + "d"; + else if (hours >= 2) + uptime = String(hours) + "h"; + else if (minutes >= 1) + uptime = String(minutes) + "m"; + else + uptime = String(seconds) + "s"; + return uptime; +} + void Screen::handlePrint(const char *text) { // the string passed into us probably has a newline, but that would confuse the logging system @@ -1729,15 +1714,7 @@ void DebugInfo::drawFrameSettings(OLEDDisplay *display, OLEDDisplayUiState *stat display->setColor(WHITE); // Show uptime as days, hours, minutes OR seconds - String uptime; - if (days >= 2) - uptime += String(days) + "d "; - else if (hours >= 2) - uptime += String(hours) + "h "; - else if (minutes >= 1) - uptime += String(minutes) + "m "; - else - uptime += String(seconds) + "s "; + String uptime = screen->drawTimeDelta(days, hours, minutes, seconds); uint32_t rtc_sec = getValidTime(RTCQuality::RTCQualityDevice); if (rtc_sec > 0) { @@ -1753,7 +1730,7 @@ void DebugInfo::drawFrameSettings(OLEDDisplay *display, OLEDDisplayUiState *stat int sec = (hms % SEC_PER_HOUR) % SEC_PER_MIN; // or hms % SEC_PER_MIN char timebuf[9]; - snprintf(timebuf, sizeof(timebuf), "%02d:%02d:%02d", hour, min, sec); + snprintf(timebuf, sizeof(timebuf), " %02d:%02d:%02d", hour, min, sec); uptime += timebuf; } diff --git a/src/graphics/Screen.h b/src/graphics/Screen.h index db851e8bb..1d732ad4c 100644 --- a/src/graphics/Screen.h +++ b/src/graphics/Screen.h @@ -206,6 +206,9 @@ class Screen : public concurrency::OSThread } } + /// generates a very brief time delta display + String drawTimeDelta(uint32_t days, uint32_t hours, uint32_t minutes, uint32_t seconds); + /// Overrides the default utf8 character conversion, to replace empty space with question marks static char customFontTableLookup(const uint8_t ch) { diff --git a/src/mesh/NodeDB.cpp b/src/mesh/NodeDB.cpp index 37697bc18..89063f550 100644 --- a/src/mesh/NodeDB.cpp +++ b/src/mesh/NodeDB.cpp @@ -599,6 +599,17 @@ uint32_t sinceLastSeen(const meshtastic_NodeInfo *n) return delta; } +uint32_t sinceReceived(const meshtastic_MeshPacket *p) +{ + uint32_t now = getTime(); + + int delta = (int)(now - p->rx_time); + if (delta < 0) // our clock must be slightly off still - not set from GPS yet + delta = 0; + + return delta; +} + #define NUM_ONLINE_SECS (60 * 60 * 2) // 2 hrs to consider someone offline size_t NodeDB::getNumOnlineNodes() diff --git a/src/mesh/NodeDB.h b/src/mesh/NodeDB.h index 106d35402..a6fbd9cb0 100644 --- a/src/mesh/NodeDB.h +++ b/src/mesh/NodeDB.h @@ -32,6 +32,9 @@ extern meshtastic_User &owner; /// Given a node, return how many seconds in the past (vs now) that we last heard from it uint32_t sinceLastSeen(const meshtastic_NodeInfo *n); +/// Given a packet, return how many seconds in the past (vs now) it was received +uint32_t sinceReceived(const meshtastic_MeshPacket *p); + class NodeDB { // NodeNum provisionalNodeNum; // if we are trying to find a node num this is our current attempt