|
|
@ -90,6 +90,7 @@ class HomeScreen : public UIScreen { |
|
|
bool _shutdown_init; |
|
|
bool _shutdown_init; |
|
|
AdvertPath recent[UI_RECENT_LIST_SIZE]; |
|
|
AdvertPath recent[UI_RECENT_LIST_SIZE]; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
void renderBatteryIndicator(DisplayDriver& display, uint16_t batteryMilliVolts) { |
|
|
void renderBatteryIndicator(DisplayDriver& display, uint16_t batteryMilliVolts) { |
|
|
// Convert millivolts to percentage
|
|
|
// Convert millivolts to percentage
|
|
|
const int minMilliVolts = 3000; // Minimum voltage (e.g., 3.0V)
|
|
|
const int minMilliVolts = 3000; // Minimum voltage (e.g., 3.0V)
|
|
|
@ -157,10 +158,12 @@ public: |
|
|
int render(DisplayDriver& display) override { |
|
|
int render(DisplayDriver& display) override { |
|
|
char tmp[80]; |
|
|
char tmp[80]; |
|
|
// node name
|
|
|
// node name
|
|
|
display.setCursor(0, 0); |
|
|
|
|
|
display.setTextSize(1); |
|
|
display.setTextSize(1); |
|
|
display.setColor(DisplayDriver::GREEN); |
|
|
display.setColor(DisplayDriver::GREEN); |
|
|
display.print(_node_prefs->node_name); |
|
|
char filtered_name[sizeof(_node_prefs->node_name)]; |
|
|
|
|
|
display.translateUTF8ToBlocks(filtered_name, _node_prefs->node_name, sizeof(filtered_name)); |
|
|
|
|
|
display.setCursor(0, 0); |
|
|
|
|
|
display.print(filtered_name); |
|
|
|
|
|
|
|
|
// battery voltage
|
|
|
// battery voltage
|
|
|
renderBatteryIndicator(display, _task->getBattMilliVolts()); |
|
|
renderBatteryIndicator(display, _task->getBattMilliVolts()); |
|
|
@ -199,8 +202,6 @@ public: |
|
|
for (int i = 0; i < UI_RECENT_LIST_SIZE; i++, y += 11) { |
|
|
for (int i = 0; i < UI_RECENT_LIST_SIZE; i++, y += 11) { |
|
|
auto a = &recent[i]; |
|
|
auto a = &recent[i]; |
|
|
if (a->name[0] == 0) continue; // empty slot
|
|
|
if (a->name[0] == 0) continue; // empty slot
|
|
|
display.setCursor(0, y); |
|
|
|
|
|
display.print(a->name); |
|
|
|
|
|
int secs = _rtc->getCurrentTime() - a->recv_timestamp; |
|
|
int secs = _rtc->getCurrentTime() - a->recv_timestamp; |
|
|
if (secs < 60) { |
|
|
if (secs < 60) { |
|
|
sprintf(tmp, "%ds", secs); |
|
|
sprintf(tmp, "%ds", secs); |
|
|
@ -209,7 +210,14 @@ public: |
|
|
} else { |
|
|
} else { |
|
|
sprintf(tmp, "%dh", secs / (60*60)); |
|
|
sprintf(tmp, "%dh", secs / (60*60)); |
|
|
} |
|
|
} |
|
|
display.setCursor(display.width() - display.getTextWidth(tmp) - 1, y); |
|
|
|
|
|
|
|
|
int timestamp_width = display.getTextWidth(tmp); |
|
|
|
|
|
int max_name_width = display.width() - timestamp_width - 1; |
|
|
|
|
|
|
|
|
|
|
|
char filtered_recent_name[sizeof(a->name)]; |
|
|
|
|
|
display.translateUTF8ToBlocks(filtered_recent_name, a->name, sizeof(filtered_recent_name)); |
|
|
|
|
|
display.drawTextEllipsized(0, y, max_name_width, filtered_recent_name); |
|
|
|
|
|
display.setCursor(display.width() - timestamp_width - 1, y); |
|
|
display.print(tmp); |
|
|
display.print(tmp); |
|
|
} |
|
|
} |
|
|
} else if (_page == HomePage::RADIO) { |
|
|
} else if (_page == HomePage::RADIO) { |
|
|
@ -427,11 +435,15 @@ public: |
|
|
|
|
|
|
|
|
display.setCursor(0, 14); |
|
|
display.setCursor(0, 14); |
|
|
display.setColor(DisplayDriver::YELLOW); |
|
|
display.setColor(DisplayDriver::YELLOW); |
|
|
display.print(p->origin); |
|
|
char filtered_origin[sizeof(p->origin)]; |
|
|
|
|
|
display.translateUTF8ToBlocks(filtered_origin, p->origin, sizeof(filtered_origin)); |
|
|
|
|
|
display.print(filtered_origin); |
|
|
|
|
|
|
|
|
display.setCursor(0, 25); |
|
|
display.setCursor(0, 25); |
|
|
display.setColor(DisplayDriver::LIGHT); |
|
|
display.setColor(DisplayDriver::LIGHT); |
|
|
display.printWordWrap(p->msg, display.width()); |
|
|
char filtered_msg[sizeof(p->msg)]; |
|
|
|
|
|
display.translateUTF8ToBlocks(filtered_msg, p->msg, sizeof(filtered_msg)); |
|
|
|
|
|
display.printWordWrap(filtered_msg, display.width()); |
|
|
|
|
|
|
|
|
#if AUTO_OFF_MILLIS==0 // probably e-ink
|
|
|
#if AUTO_OFF_MILLIS==0 // probably e-ink
|
|
|
return 10000; // 10 s
|
|
|
return 10000; // 10 s
|
|
|
|