|
|
@ -458,15 +458,17 @@ class MsgPreviewScreen : public UIScreen { |
|
|
}; |
|
|
}; |
|
|
#define MAX_UNREAD_MSGS 32 |
|
|
#define MAX_UNREAD_MSGS 32 |
|
|
int num_unread; |
|
|
int num_unread; |
|
|
|
|
|
int head = MAX_UNREAD_MSGS - 1; // index of latest unread message
|
|
|
MsgEntry unread[MAX_UNREAD_MSGS]; |
|
|
MsgEntry unread[MAX_UNREAD_MSGS]; |
|
|
|
|
|
|
|
|
public: |
|
|
public: |
|
|
MsgPreviewScreen(UITask* task, mesh::RTCClock* rtc) : _task(task), _rtc(rtc) { num_unread = 0; } |
|
|
MsgPreviewScreen(UITask* task, mesh::RTCClock* rtc) : _task(task), _rtc(rtc) { num_unread = 0; } |
|
|
|
|
|
|
|
|
void addPreview(uint8_t path_len, const char* from_name, const char* msg) { |
|
|
void addPreview(uint8_t path_len, const char* from_name, const char* msg) { |
|
|
if (num_unread >= MAX_UNREAD_MSGS) return; // full
|
|
|
head = (head + 1) % MAX_UNREAD_MSGS; |
|
|
|
|
|
if (num_unread < MAX_UNREAD_MSGS) num_unread++; |
|
|
|
|
|
|
|
|
auto p = &unread[num_unread++]; |
|
|
auto p = &unread[head]; |
|
|
p->timestamp = _rtc->getCurrentTime(); |
|
|
p->timestamp = _rtc->getCurrentTime(); |
|
|
if (path_len == 0xFF) { |
|
|
if (path_len == 0xFF) { |
|
|
sprintf(p->origin, "(D) %s:", from_name); |
|
|
sprintf(p->origin, "(D) %s:", from_name); |
|
|
@ -484,7 +486,7 @@ public: |
|
|
sprintf(tmp, "Unread: %d", num_unread); |
|
|
sprintf(tmp, "Unread: %d", num_unread); |
|
|
display.print(tmp); |
|
|
display.print(tmp); |
|
|
|
|
|
|
|
|
auto p = &unread[0]; |
|
|
auto p = &unread[head]; |
|
|
|
|
|
|
|
|
int secs = _rtc->getCurrentTime() - p->timestamp; |
|
|
int secs = _rtc->getCurrentTime() - p->timestamp; |
|
|
if (secs < 60) { |
|
|
if (secs < 60) { |
|
|
@ -520,14 +522,10 @@ public: |
|
|
|
|
|
|
|
|
bool handleInput(char c) override { |
|
|
bool handleInput(char c) override { |
|
|
if (c == KEY_NEXT || c == KEY_RIGHT) { |
|
|
if (c == KEY_NEXT || c == KEY_RIGHT) { |
|
|
|
|
|
head = (head + MAX_UNREAD_MSGS - 1) % MAX_UNREAD_MSGS; |
|
|
num_unread--; |
|
|
num_unread--; |
|
|
if (num_unread == 0) { |
|
|
if (num_unread == 0) { |
|
|
_task->gotoHomeScreen(); |
|
|
_task->gotoHomeScreen(); |
|
|
} else { |
|
|
|
|
|
// delete first/curr item from unread queue
|
|
|
|
|
|
for (int i = 0; i < num_unread; i++) { |
|
|
|
|
|
unread[i] = unread[i + 1]; |
|
|
|
|
|
} |
|
|
|
|
|
} |
|
|
} |
|
|
return true; |
|
|
return true; |
|
|
} |
|
|
} |
|
|
|