Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 2 additions & 0 deletions cmake/Portduino.cmake
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,8 @@ FetchContent_Declare(
GIT_TAG "ce0ed7e9c62f3082b30ee9a5c369f30c1e55194a"
)
FetchContent_MakeAvailable(Portduino)
target_sources(Portduino PRIVATE ${portduino_SOURCE_DIR}/cores/portduino/PortduinoGPIO.cpp
${portduino_SOURCE_DIR}/cores/portduino/logging.cpp)
include_directories(${portduino_SOURCE_DIR}/cores/portduino)
include_directories(${portduino_SOURCE_DIR}/cores/portduino/FS)
include_directories(${portduino_SOURCE_DIR}/cores/arduino)
Expand Down
2 changes: 1 addition & 1 deletion cmake/protobuf.cmake
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,6 @@ message(STATUS "Fetching protobufs ...")
FetchContent_Declare(
Protobuf
GIT_REPOSITORY "https://github.com/meshtastic/protobufs"
GIT_TAG v2.7.8
GIT_TAG v2.7.26
)
FetchContent_MakeAvailable(Protobuf)
53 changes: 53 additions & 0 deletions include/graphics/common/MessageStatus.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,53 @@
#pragma once

#include "util/LogMessage.h"
#include <optional>

namespace MessageStatus
{
enum class State {
Sending,
ChannelImplicitAck,
DirectImplicitAck,
ExplicitAck,
NoAck,
NoChannel,
GenericEncryptedSendFailure,
RecipientKeyUnavailable,
RecipientNeedsSenderKey,
MessageTooLarge,
NoRadioInterface,
DutyCycleLimit,
RateLimited,
NoAppResponse,
InvalidRequest,
NotAuthorized,
AdminSessionExpired,
AdminKeyNotAuthorized,
};

enum class Tone {
Pending,
Success,
Warning,
RetryableFailure,
PermanentFailure,
};

struct Presentation {
const char *text;
const char *detail;
Tone tone;
bool retryable;
};

const Presentation &presentation(State state);
State deliveredState(bool channelMessage, bool explicitAck);
bool isImplicitDelivery(State state);
State preserveImplicitDelivery(std::optional<State> pendingStatus, State fallbackStatus);
LogMessage::MsgStatus logStatusForState(State state);
uint32_t persistedLogState(State state);
std::optional<State> stateFromPersistedLogState(uint32_t state);
std::optional<State> inlineStateForLogStatus(LogMessage::MsgStatus status, bool livePending);
std::optional<State> inlineStateForLogStatus(LogMessage::MsgStatus status, uint32_t persistedState, bool livePending);
} // namespace MessageStatus
3 changes: 2 additions & 1 deletion include/graphics/common/ResponseHandler.h
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,7 @@ class ResponseHandler
using Callback = std::function<void(const Request &, EventType, int32_t)>;

struct Request {
uint32_t requestId;
uint32_t id;
unsigned long timestamp;
enum RequestType type;
Expand Down Expand Up @@ -52,4 +53,4 @@ class ResponseHandler
private:
ResponseHandler(const ResponseHandler &) = delete;
ResponseHandler &operator=(const ResponseHandler &) = delete;
};
};
15 changes: 15 additions & 0 deletions include/graphics/common/ViewController.h
Original file line number Diff line number Diff line change
Expand Up @@ -2,9 +2,15 @@

#include "comms/IClientBase.h"
#include "util/LogRotate.h"
#include <optional>
#include <time.h>
#include <unordered_map>

class MeshtasticView;
namespace MessageStatus
{
enum class State;
}

class ViewController
{
Expand Down Expand Up @@ -66,6 +72,8 @@ class ViewController
virtual bool sendConfig(const char ringtone[231], uint32_t nodeId = 0);
virtual void sendTextMessage(uint32_t to, uint8_t ch, uint8_t hopLimit, uint32_t msgTime, uint32_t requestId, bool usePkc,
const char *textmsg);
virtual bool updateTextMessageStatus(uint32_t requestId, MessageStatus::State status, bool finalStatus);
virtual std::optional<MessageStatus::State> pendingTextMessageStatus(uint32_t requestId) const;
virtual void removeTextMessages(uint32_t from, uint32_t to, uint8_t ch);
virtual bool requestPosition(uint32_t to, uint8_t ch, uint32_t requestId);
virtual void traceRoute(uint32_t to, uint8_t ch, uint8_t hopLimit, uint32_t requestId);
Expand Down Expand Up @@ -105,6 +113,13 @@ class ViewController
MeshtasticView *view;
LogRotate log;
IClientBase *client;

struct PendingTextMessage {
LogRotate::EntryPosition logPosition;
std::optional<MessageStatus::State> status;
};
std::unordered_map<uint32_t, PendingTextMessage> pendingTextMessages;

uint32_t sendId;
uint32_t myNodeNum;
time_t lastrun1;
Expand Down
16 changes: 12 additions & 4 deletions include/graphics/view/TFT/TFTView_320x240.h
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
#pragma once

#include "graphics/common/MeshtasticView.h"
#include "graphics/common/MessageStatus.h"
#include "meshtastic/clientonly.pb.h"
#include <set>

Expand Down Expand Up @@ -159,7 +160,8 @@ class TFTView_320x240 : public MeshtasticView
// own chat message
virtual void handleAddMessage(char *msg);
// add own message to current chat
virtual void addMessage(lv_obj_t *container, uint32_t msgTime, uint32_t requestId, char *msg, LogMessage::MsgStatus status);
virtual void addMessage(lv_obj_t *container, uint32_t msgTime, uint32_t requestId, char *msg, LogMessage::MsgStatus status,
uint32_t persistedStatus = 0);
// add new message to container
virtual void newMessage(uint32_t nodeNum, lv_obj_t *container, uint8_t channel, const char *msg);
// create empty message container for node or group channel
Expand All @@ -168,8 +170,9 @@ class TFTView_320x240 : public MeshtasticView
virtual bool applyNodesFilter(uint32_t nodeNum, bool reset = false);
// display message alert popup
virtual void messageAlert(const char *alert, bool show);
// mark sent message as received
virtual void handleTextMessageResponse(uint32_t channelOrNode, uint32_t id, bool ack, bool err);
// mark sent message with its delivery status
virtual void handleTextMessageResponse(uint32_t channelOrNode, uint32_t id, MessageStatus::State status,
bool finalStatus = true);
// set node image based on role
virtual void setNodeImage(uint32_t nodeNum, eRole role, bool unmessagable, lv_obj_t *img);
// apply filter and count number of filtered nodes
Expand Down Expand Up @@ -285,6 +288,11 @@ class TFTView_320x240 : public MeshtasticView
static void ui_event_ChatButton(lv_event_t *e);
static void ui_event_ChatDelButton(lv_event_t *e);
static void ui_event_MsgPopupButton(lv_event_t *e);
static void ui_event_MessageStatus(lv_event_t *e);
static void ui_event_MessageStatusClose(lv_event_t *e);
static void ui_event_MessageStatusRetry(lv_event_t *e);
static void ui_event_MessageStatusDialogDelete(lv_event_t *e);
static void ui_event_SentMessageDelete(lv_event_t *e);
static void ui_event_MsgRestoreButton(lv_event_t *e);
static void ui_event_AlertButton(lv_event_t *e);

Expand Down Expand Up @@ -444,4 +452,4 @@ class TFTView_320x240 : public MeshtasticView
};

meshtastic_DeviceProfile_full db{}; // full copy of the node's configuration db (except nodeinfos) plus ui data
};
};
13 changes: 10 additions & 3 deletions include/util/LogMessage.h
Original file line number Diff line number Diff line change
Expand Up @@ -2,10 +2,17 @@

#include "ILogEntry.h"
#include <assert.h>
#include <cstring>
#include <ctime>
#include <memory.h>

constexpr uint32_t messagePayloadSize = 233;
constexpr uint32_t maxLogMessagePayloadLength = messagePayloadSize - 1;

constexpr bool fitsLogMessagePayload(size_t len)
{
return len <= maxLogMessagePayloadLength;
}

/**
* @brief Header for storing message logs containing the actual size of the payload
Expand Down Expand Up @@ -42,7 +49,7 @@ class LogMessageEnv : public LogMessage
LogMessageEnv(uint32_t _from, uint32_t _to, uint16_t _ch, time_t _time, MsgStatus _status, bool _trashFlag, uint32_t _len,
const uint8_t *msg)
{
assert(_len < messagePayloadSize);
assert(fitsLogMessagePayload(_len));
_size = (uint16_t)_len;
time = _time;
from = _from;
Expand All @@ -64,7 +71,7 @@ class LogMessageEnv : public LogMessage
virtual size_t deserialize(std::function<size_t(uint8_t *, size_t)> read) override
{
size_t len = read((uint8_t *)&_size, sizeof(LogMessageHeader) - 8);
if (len && _size < messagePayloadSize) {
if (len && fitsLogMessagePayload(_size)) {
len += read(bytes, _size);
bytes[_size] = 0;
} else {
Expand All @@ -73,4 +80,4 @@ class LogMessageEnv : public LogMessage
}
return len;
}
};
};
11 changes: 10 additions & 1 deletion include/util/LogRotate.h
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@

#include "FS.h"
#include "ILogEntry.h"
#include <functional>
#include <stdint.h>

/**
Expand All @@ -21,6 +22,11 @@
class LogRotate
{
public:
struct EntryPosition {
uint32_t logNum = 0;
uint32_t offset = 0;
};

LogRotate(fs::FS &fs, const char *logDir, uint32_t maxLen, uint32_t maxSize = 102400, uint32_t maxFiles = 25,
uint32_t maxFileSize = 4000);
// uint32_t maxSize = 4096, uint32_t maxFiles = 10, uint32_t maxFileSize = 400);
Expand All @@ -29,6 +35,9 @@ class LogRotate
void init(void);
// write a log entry to fs
bool write(const ILogEntry &entry);
bool write(const ILogEntry &entry, EntryPosition *position);
// update a previously written log entry in place
bool update(const EntryPosition &position, ILogEntry &entry, std::function<void(ILogEntry &)> update);
// read the next log entry from fs
bool readNext(ILogEntry &entry);
// remove all logs from fs
Expand Down Expand Up @@ -69,4 +78,4 @@ class LogRotate
uint32_t currentLogWrite; // current log number (when writing)
uint32_t currentSize; // size of current written log file
uint32_t totalSize; // size of all logs
};
};
2 changes: 1 addition & 1 deletion source/comms/serial/SerialClient.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -42,7 +42,7 @@ void SerialClient::init(void)
#elif defined(ARCH_PORTDUINO)
new std::thread([] {
#ifdef __APPLE__
pthread_setname_np(threadName);
pthread_setname_np(instance->threadName);
#else
pthread_setname_np(pthread_self(), instance->threadName);
#endif
Expand Down
Loading
Loading