You've already forked meshtastic-device-ui
mirror of
https://github.com/m5stack/meshtastic-device-ui.git
synced 2026-05-20 11:51:03 -07:00
75 lines
2.1 KiB
C++
75 lines
2.1 KiB
C++
#pragma once
|
|
|
|
#include "ILogEntry.h"
|
|
#include <assert.h>
|
|
#include <ctime>
|
|
#include <memory.h>
|
|
|
|
constexpr uint32_t messagePayloadSize = 233;
|
|
|
|
/**
|
|
* @brief Header for storing message logs containing the actual size of the payload
|
|
* Note: this struct does have vtable pointers, i.e. sizeof(LogMessageHeader)-8 is the real data size
|
|
*/
|
|
struct LogMessageHeader : public ILogEntry {
|
|
size_t length(void) const override { return _size; }
|
|
|
|
uint16_t _size;
|
|
time_t time;
|
|
uint32_t from;
|
|
uint32_t to;
|
|
uint8_t ch;
|
|
enum MsgStatus : uint8_t { eNone, eDefault, eHeard, eNoResponse, eAcked, eFailed, eDeleted, eUnread } status;
|
|
bool trashFlag;
|
|
uint32_t reserved;
|
|
};
|
|
|
|
/**
|
|
* @brief Structure for storing message logs containing the actual payload
|
|
*/
|
|
struct LogMessage : public LogMessageHeader {
|
|
uint8_t bytes[messagePayloadSize];
|
|
};
|
|
|
|
/**
|
|
* Log message envelope that implements the actual interface for ILogEntry
|
|
* (size, serialize and deserialize)
|
|
*/
|
|
class LogMessageEnv : public LogMessage
|
|
{
|
|
public:
|
|
LogMessageEnv(void) = default;
|
|
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);
|
|
_size = (uint16_t)_len;
|
|
time = _time;
|
|
from = _from;
|
|
to = _to;
|
|
ch = _ch;
|
|
status = _status;
|
|
trashFlag = _trashFlag;
|
|
reserved = 0;
|
|
memcpy(bytes, msg, _len);
|
|
}
|
|
|
|
size_t size(void) const override { return sizeof(LogMessageHeader) - 8 + _size; }
|
|
|
|
virtual size_t serialize(std::function<size_t(const uint8_t *, size_t)> write) const override
|
|
{
|
|
return write((uint8_t *)&_size, sizeof(LogMessageHeader) - 8) + write(bytes, _size);
|
|
}
|
|
|
|
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) {
|
|
len += read(bytes, _size);
|
|
bytes[_size] = 0;
|
|
} else {
|
|
bytes[0] = 0;
|
|
}
|
|
return len;
|
|
}
|
|
}; |