|
|
|
@ -1,21 +1,20 @@ |
|
|
|
#ifndef MYMESH_H |
|
|
|
#define MYMESH_H |
|
|
|
#pragma once |
|
|
|
|
|
|
|
#include <Arduino.h> |
|
|
|
#include <Mesh.h> |
|
|
|
#ifdef DISPLAY_CLASS |
|
|
|
#include "UITask.h" |
|
|
|
#include "UITask.h" |
|
|
|
#endif |
|
|
|
|
|
|
|
/*------------ Frame Protocol --------------*/ |
|
|
|
#define FIRMWARE_VER_CODE 5 |
|
|
|
#define FIRMWARE_VER_CODE 5 |
|
|
|
|
|
|
|
#ifndef FIRMWARE_BUILD_DATE |
|
|
|
#define FIRMWARE_BUILD_DATE "24 May 2025" |
|
|
|
#define FIRMWARE_BUILD_DATE "24 May 2025" |
|
|
|
#endif |
|
|
|
|
|
|
|
#ifndef FIRMWARE_VERSION |
|
|
|
#define FIRMWARE_VERSION "v1.6.2" |
|
|
|
#define FIRMWARE_VERSION "v1.6.2" |
|
|
|
#endif |
|
|
|
|
|
|
|
#if defined(NRF52_PLATFORM) || defined(STM32_PLATFORM) |
|
|
|
@ -26,258 +25,197 @@ |
|
|
|
#include <SPIFFS.h> |
|
|
|
#endif |
|
|
|
|
|
|
|
#include <helpers/ArduinoHelpers.h> |
|
|
|
#include <helpers/StaticPoolPacketManager.h> |
|
|
|
#include <helpers/SimpleMeshTables.h> |
|
|
|
#include <helpers/IdentityStore.h> |
|
|
|
#include <helpers/BaseSerialInterface.h> |
|
|
|
#include "NodePrefs.h" |
|
|
|
|
|
|
|
#include <RTClib.h> |
|
|
|
#include <helpers/ArduinoHelpers.h> |
|
|
|
#include <helpers/BaseSerialInterface.h> |
|
|
|
#include <helpers/IdentityStore.h> |
|
|
|
#include <helpers/SimpleMeshTables.h> |
|
|
|
#include <helpers/StaticPoolPacketManager.h> |
|
|
|
#include <target.h> |
|
|
|
|
|
|
|
/* ---------------------------------- CONFIGURATION ------------------------------------- */ |
|
|
|
|
|
|
|
#ifndef LORA_FREQ |
|
|
|
#define LORA_FREQ 915.0 |
|
|
|
#define LORA_FREQ 915.0 |
|
|
|
#endif |
|
|
|
#ifndef LORA_BW |
|
|
|
#define LORA_BW 250 |
|
|
|
#define LORA_BW 250 |
|
|
|
#endif |
|
|
|
#ifndef LORA_SF |
|
|
|
#define LORA_SF 10 |
|
|
|
#define LORA_SF 10 |
|
|
|
#endif |
|
|
|
#ifndef LORA_CR |
|
|
|
#define LORA_CR 5 |
|
|
|
#define LORA_CR 5 |
|
|
|
#endif |
|
|
|
#ifndef LORA_TX_POWER |
|
|
|
#define LORA_TX_POWER 20 |
|
|
|
#define LORA_TX_POWER 20 |
|
|
|
#endif |
|
|
|
#ifndef MAX_LORA_TX_POWER |
|
|
|
#define MAX_LORA_TX_POWER LORA_TX_POWER |
|
|
|
#define MAX_LORA_TX_POWER LORA_TX_POWER |
|
|
|
#endif |
|
|
|
|
|
|
|
#ifndef MAX_CONTACTS |
|
|
|
#define MAX_CONTACTS 100 |
|
|
|
#define MAX_CONTACTS 100 |
|
|
|
#endif |
|
|
|
|
|
|
|
#ifndef OFFLINE_QUEUE_SIZE |
|
|
|
#define OFFLINE_QUEUE_SIZE 16 |
|
|
|
#define OFFLINE_QUEUE_SIZE 16 |
|
|
|
#endif |
|
|
|
|
|
|
|
#ifndef BLE_NAME_PREFIX |
|
|
|
#define BLE_NAME_PREFIX "MeshCore-" |
|
|
|
#define BLE_NAME_PREFIX "MeshCore-" |
|
|
|
#endif |
|
|
|
|
|
|
|
#include <helpers/BaseChatMesh.h> |
|
|
|
|
|
|
|
#define SEND_TIMEOUT_BASE_MILLIS 500 |
|
|
|
#define FLOOD_SEND_TIMEOUT_FACTOR 16.0f |
|
|
|
#define DIRECT_SEND_PERHOP_FACTOR 6.0f |
|
|
|
#define DIRECT_SEND_PERHOP_EXTRA_MILLIS 250 |
|
|
|
#define LAZY_CONTACTS_WRITE_DELAY 5000 |
|
|
|
|
|
|
|
#define PUBLIC_GROUP_PSK "izOH6cXN6mrJ5e26oRXNcg==" |
|
|
|
|
|
|
|
#define CMD_APP_START 1 |
|
|
|
#define CMD_SEND_TXT_MSG 2 |
|
|
|
#define CMD_SEND_CHANNEL_TXT_MSG 3 |
|
|
|
#define CMD_GET_CONTACTS 4 // with optional 'since' (for efficient sync)
|
|
|
|
#define CMD_GET_DEVICE_TIME 5 |
|
|
|
#define CMD_SET_DEVICE_TIME 6 |
|
|
|
#define CMD_SEND_SELF_ADVERT 7 |
|
|
|
#define CMD_SET_ADVERT_NAME 8 |
|
|
|
#define CMD_ADD_UPDATE_CONTACT 9 |
|
|
|
#define CMD_SYNC_NEXT_MESSAGE 10 |
|
|
|
#define CMD_SET_RADIO_PARAMS 11 |
|
|
|
#define CMD_SET_RADIO_TX_POWER 12 |
|
|
|
#define CMD_RESET_PATH 13 |
|
|
|
#define CMD_SET_ADVERT_LATLON 14 |
|
|
|
#define CMD_REMOVE_CONTACT 15 |
|
|
|
#define CMD_SHARE_CONTACT 16 |
|
|
|
#define CMD_EXPORT_CONTACT 17 |
|
|
|
#define CMD_IMPORT_CONTACT 18 |
|
|
|
#define CMD_REBOOT 19 |
|
|
|
#define CMD_GET_BATTERY_VOLTAGE 20 |
|
|
|
#define CMD_SET_TUNING_PARAMS 21 |
|
|
|
#define CMD_DEVICE_QEURY 22 |
|
|
|
#define CMD_EXPORT_PRIVATE_KEY 23 |
|
|
|
#define CMD_IMPORT_PRIVATE_KEY 24 |
|
|
|
#define CMD_SEND_RAW_DATA 25 |
|
|
|
#define CMD_SEND_LOGIN 26 |
|
|
|
#define CMD_SEND_STATUS_REQ 27 |
|
|
|
#define CMD_HAS_CONNECTION 28 |
|
|
|
#define CMD_LOGOUT 29 // 'Disconnect'
|
|
|
|
#define CMD_GET_CONTACT_BY_KEY 30 |
|
|
|
#define CMD_GET_CHANNEL 31 |
|
|
|
#define CMD_SET_CHANNEL 32 |
|
|
|
#define CMD_SIGN_START 33 |
|
|
|
#define CMD_SIGN_DATA 34 |
|
|
|
#define CMD_SIGN_FINISH 35 |
|
|
|
#define CMD_SEND_TRACE_PATH 36 |
|
|
|
#define CMD_SET_DEVICE_PIN 37 |
|
|
|
#define CMD_SET_OTHER_PARAMS 38 |
|
|
|
#define CMD_SEND_TELEMETRY_REQ 39 |
|
|
|
#define CMD_GET_CUSTOM_VARS 40 |
|
|
|
#define CMD_SET_CUSTOM_VAR 41 |
|
|
|
|
|
|
|
#define RESP_CODE_OK 0 |
|
|
|
#define RESP_CODE_ERR 1 |
|
|
|
#define RESP_CODE_CONTACTS_START 2 // first reply to CMD_GET_CONTACTS
|
|
|
|
#define RESP_CODE_CONTACT 3 // multiple of these (after CMD_GET_CONTACTS)
|
|
|
|
#define RESP_CODE_END_OF_CONTACTS 4 // last reply to CMD_GET_CONTACTS
|
|
|
|
#define RESP_CODE_SELF_INFO 5 // reply to CMD_APP_START
|
|
|
|
#define RESP_CODE_SENT 6 // reply to CMD_SEND_TXT_MSG
|
|
|
|
#define RESP_CODE_CONTACT_MSG_RECV 7 // a reply to CMD_SYNC_NEXT_MESSAGE (ver < 3)
|
|
|
|
#define RESP_CODE_CHANNEL_MSG_RECV 8 // a reply to CMD_SYNC_NEXT_MESSAGE (ver < 3)
|
|
|
|
#define RESP_CODE_CURR_TIME 9 // a reply to CMD_GET_DEVICE_TIME
|
|
|
|
#define RESP_CODE_NO_MORE_MESSAGES 10 // a reply to CMD_SYNC_NEXT_MESSAGE
|
|
|
|
#define RESP_CODE_EXPORT_CONTACT 11 |
|
|
|
#define RESP_CODE_BATTERY_VOLTAGE 12 // a reply to a CMD_GET_BATTERY_VOLTAGE
|
|
|
|
#define RESP_CODE_DEVICE_INFO 13 // a reply to CMD_DEVICE_QEURY
|
|
|
|
#define RESP_CODE_PRIVATE_KEY 14 // a reply to CMD_EXPORT_PRIVATE_KEY
|
|
|
|
#define RESP_CODE_DISABLED 15 |
|
|
|
#define RESP_CODE_CONTACT_MSG_RECV_V3 16 // a reply to CMD_SYNC_NEXT_MESSAGE (ver >= 3)
|
|
|
|
#define RESP_CODE_CHANNEL_MSG_RECV_V3 17 // a reply to CMD_SYNC_NEXT_MESSAGE (ver >= 3)
|
|
|
|
#define RESP_CODE_CHANNEL_INFO 18 // a reply to CMD_GET_CHANNEL
|
|
|
|
#define RESP_CODE_SIGN_START 19 |
|
|
|
#define RESP_CODE_SIGNATURE 20 |
|
|
|
#define RESP_CODE_CUSTOM_VARS 21 |
|
|
|
#define SEND_TIMEOUT_BASE_MILLIS 500 |
|
|
|
#define FLOOD_SEND_TIMEOUT_FACTOR 16.0f |
|
|
|
#define DIRECT_SEND_PERHOP_FACTOR 6.0f |
|
|
|
#define DIRECT_SEND_PERHOP_EXTRA_MILLIS 250 |
|
|
|
#define LAZY_CONTACTS_WRITE_DELAY 5000 |
|
|
|
|
|
|
|
#define PUBLIC_GROUP_PSK "izOH6cXN6mrJ5e26oRXNcg==" |
|
|
|
|
|
|
|
// these are _pushed_ to client app at any time
|
|
|
|
#define PUSH_CODE_ADVERT 0x80 |
|
|
|
#define PUSH_CODE_PATH_UPDATED 0x81 |
|
|
|
#define PUSH_CODE_SEND_CONFIRMED 0x82 |
|
|
|
#define PUSH_CODE_MSG_WAITING 0x83 |
|
|
|
#define PUSH_CODE_RAW_DATA 0x84 |
|
|
|
#define PUSH_CODE_LOGIN_SUCCESS 0x85 |
|
|
|
#define PUSH_CODE_LOGIN_FAIL 0x86 |
|
|
|
#define PUSH_CODE_STATUS_RESPONSE 0x87 |
|
|
|
#define PUSH_CODE_LOG_RX_DATA 0x88 |
|
|
|
#define PUSH_CODE_TRACE_DATA 0x89 |
|
|
|
#define PUSH_CODE_NEW_ADVERT 0x8A |
|
|
|
#define PUSH_CODE_TELEMETRY_RESPONSE 0x8B |
|
|
|
|
|
|
|
#define ERR_CODE_UNSUPPORTED_CMD 1 |
|
|
|
#define ERR_CODE_NOT_FOUND 2 |
|
|
|
#define ERR_CODE_TABLE_FULL 3 |
|
|
|
#define ERR_CODE_BAD_STATE 4 |
|
|
|
#define ERR_CODE_FILE_IO_ERROR 5 |
|
|
|
#define ERR_CODE_ILLEGAL_ARG 6 |
|
|
|
#define PUSH_CODE_ADVERT 0x80 |
|
|
|
#define PUSH_CODE_PATH_UPDATED 0x81 |
|
|
|
#define PUSH_CODE_SEND_CONFIRMED 0x82 |
|
|
|
#define PUSH_CODE_MSG_WAITING 0x83 |
|
|
|
#define PUSH_CODE_RAW_DATA 0x84 |
|
|
|
#define PUSH_CODE_LOGIN_SUCCESS 0x85 |
|
|
|
#define PUSH_CODE_LOGIN_FAIL 0x86 |
|
|
|
#define PUSH_CODE_STATUS_RESPONSE 0x87 |
|
|
|
#define PUSH_CODE_LOG_RX_DATA 0x88 |
|
|
|
#define PUSH_CODE_TRACE_DATA 0x89 |
|
|
|
#define PUSH_CODE_NEW_ADVERT 0x8A |
|
|
|
#define PUSH_CODE_TELEMETRY_RESPONSE 0x8B |
|
|
|
|
|
|
|
#define ERR_CODE_UNSUPPORTED_CMD 1 |
|
|
|
#define ERR_CODE_NOT_FOUND 2 |
|
|
|
#define ERR_CODE_TABLE_FULL 3 |
|
|
|
#define ERR_CODE_BAD_STATE 4 |
|
|
|
#define ERR_CODE_FILE_IO_ERROR 5 |
|
|
|
#define ERR_CODE_ILLEGAL_ARG 6 |
|
|
|
|
|
|
|
/* -------------------------------------------------------------------------------------- */ |
|
|
|
|
|
|
|
#define REQ_TYPE_GET_STATUS 0x01 // same as _GET_STATS
|
|
|
|
#define REQ_TYPE_KEEP_ALIVE 0x02 |
|
|
|
#define REQ_TYPE_GET_TELEMETRY_DATA 0x03 |
|
|
|
#define REQ_TYPE_GET_STATUS 0x01 // same as _GET_STATS
|
|
|
|
#define REQ_TYPE_KEEP_ALIVE 0x02 |
|
|
|
#define REQ_TYPE_GET_TELEMETRY_DATA 0x03 |
|
|
|
|
|
|
|
#define MAX_SIGN_DATA_LEN (8*1024) // 8K
|
|
|
|
#define MAX_SIGN_DATA_LEN (8 * 1024) // 8K
|
|
|
|
|
|
|
|
class MyMesh : public BaseChatMesh { |
|
|
|
public: |
|
|
|
MyMesh(mesh::Radio& radio, mesh::RNG& rng, mesh::RTCClock& rtc, SimpleMeshTables& tables); |
|
|
|
|
|
|
|
void begin(FILESYSTEM& fs, bool has_display); |
|
|
|
void startInterface(BaseSerialInterface& serial); |
|
|
|
void loadPrefsInt(const char* filename); |
|
|
|
void savePrefs(); |
|
|
|
|
|
|
|
const char* getNodeName(); |
|
|
|
NodePrefs* getNodePrefs(); |
|
|
|
uint32_t getBLEPin(); |
|
|
|
|
|
|
|
void loop(); |
|
|
|
void handleCmdFrame(size_t len); |
|
|
|
bool advert(); |
|
|
|
MyMesh(mesh::Radio &radio, mesh::RNG &rng, mesh::RTCClock &rtc, SimpleMeshTables &tables); |
|
|
|
|
|
|
|
void begin(FILESYSTEM &fs, bool has_display); |
|
|
|
void startInterface(BaseSerialInterface &serial); |
|
|
|
void loadPrefsInt(const char *filename); |
|
|
|
void savePrefs(); |
|
|
|
|
|
|
|
const char *getNodeName(); |
|
|
|
NodePrefs *getNodePrefs(); |
|
|
|
uint32_t getBLEPin(); |
|
|
|
|
|
|
|
void loop(); |
|
|
|
void handleCmdFrame(size_t len); |
|
|
|
bool advert(); |
|
|
|
|
|
|
|
protected: |
|
|
|
float getAirtimeBudgetFactor() const override; |
|
|
|
int getInterferenceThreshold() const override; |
|
|
|
int calcRxDelay(float score, uint32_t air_time) const override; |
|
|
|
|
|
|
|
void logRxRaw(float snr, float rssi, const uint8_t raw[], int len) override; |
|
|
|
bool isAutoAddEnabled() const override; |
|
|
|
void onDiscoveredContact(ContactInfo& contact, bool is_new) override; |
|
|
|
void onContactPathUpdated(const ContactInfo& contact) override; |
|
|
|
bool processAck(const uint8_t *data) override; |
|
|
|
void queueMessage(const ContactInfo& from, uint8_t txt_type, mesh::Packet* pkt, |
|
|
|
uint32_t sender_timestamp, const uint8_t* extra, int extra_len, const char *text); |
|
|
|
|
|
|
|
void onMessageRecv(const ContactInfo& from, mesh::Packet* pkt, uint32_t sender_timestamp, const char *text) override; |
|
|
|
void onCommandDataRecv(const ContactInfo& from, mesh::Packet* pkt, uint32_t sender_timestamp, const char *text) override; |
|
|
|
void onSignedMessageRecv(const ContactInfo& from, mesh::Packet* pkt, uint32_t sender_timestamp, |
|
|
|
const uint8_t *sender_prefix, const char *text) override; |
|
|
|
void onChannelMessageRecv(const mesh::GroupChannel& channel, mesh::Packet* pkt, uint32_t timestamp, const char *text) override; |
|
|
|
|
|
|
|
uint8_t onContactRequest(const ContactInfo& contact, uint32_t sender_timestamp, const uint8_t* data, uint8_t len, uint8_t* reply) override; |
|
|
|
void onContactResponse(const ContactInfo& contact, const uint8_t* data, uint8_t len) override; |
|
|
|
void onRawDataRecv(mesh::Packet* packet) override; |
|
|
|
void onTraceRecv(mesh::Packet* packet, uint32_t tag, uint32_t auth_code, uint8_t flags, const uint8_t* path_snrs, |
|
|
|
const uint8_t* path_hashes, uint8_t path_len) override; |
|
|
|
|
|
|
|
uint32_t calcFloodTimeoutMillisFor(uint32_t pkt_airtime_millis) const override; |
|
|
|
uint32_t calcDirectTimeoutMillisFor(uint32_t pkt_airtime_millis, uint8_t path_len) const override; |
|
|
|
void onSendTimeout() override; |
|
|
|
float getAirtimeBudgetFactor() const override; |
|
|
|
int getInterferenceThreshold() const override; |
|
|
|
int calcRxDelay(float score, uint32_t air_time) const override; |
|
|
|
|
|
|
|
void logRxRaw(float snr, float rssi, const uint8_t raw[], int len) override; |
|
|
|
bool isAutoAddEnabled() const override; |
|
|
|
void onDiscoveredContact(ContactInfo &contact, bool is_new) override; |
|
|
|
void onContactPathUpdated(const ContactInfo &contact) override; |
|
|
|
bool processAck(const uint8_t *data) override; |
|
|
|
void queueMessage(const ContactInfo &from, uint8_t txt_type, mesh::Packet *pkt, uint32_t sender_timestamp, |
|
|
|
const uint8_t *extra, int extra_len, const char *text); |
|
|
|
|
|
|
|
void onMessageRecv(const ContactInfo &from, mesh::Packet *pkt, uint32_t sender_timestamp, |
|
|
|
const char *text) override; |
|
|
|
void onCommandDataRecv(const ContactInfo &from, mesh::Packet *pkt, uint32_t sender_timestamp, |
|
|
|
const char *text) override; |
|
|
|
void onSignedMessageRecv(const ContactInfo &from, mesh::Packet *pkt, uint32_t sender_timestamp, |
|
|
|
const uint8_t *sender_prefix, const char *text) override; |
|
|
|
void onChannelMessageRecv(const mesh::GroupChannel &channel, mesh::Packet *pkt, uint32_t timestamp, |
|
|
|
const char *text) override; |
|
|
|
|
|
|
|
uint8_t onContactRequest(const ContactInfo &contact, uint32_t sender_timestamp, const uint8_t *data, |
|
|
|
uint8_t len, uint8_t *reply) override; |
|
|
|
void onContactResponse(const ContactInfo &contact, const uint8_t *data, uint8_t len) override; |
|
|
|
void onRawDataRecv(mesh::Packet *packet) override; |
|
|
|
void onTraceRecv(mesh::Packet *packet, uint32_t tag, uint32_t auth_code, uint8_t flags, |
|
|
|
const uint8_t *path_snrs, const uint8_t *path_hashes, uint8_t path_len) override; |
|
|
|
|
|
|
|
uint32_t calcFloodTimeoutMillisFor(uint32_t pkt_airtime_millis) const override; |
|
|
|
uint32_t calcDirectTimeoutMillisFor(uint32_t pkt_airtime_millis, uint8_t path_len) const override; |
|
|
|
void onSendTimeout() override; |
|
|
|
|
|
|
|
private: |
|
|
|
void writeOKFrame(); |
|
|
|
void writeErrFrame(uint8_t err_code); |
|
|
|
void writeDisabledFrame(); |
|
|
|
void writeContactRespFrame(uint8_t code, const ContactInfo& contact); |
|
|
|
void updateContactFromFrame(ContactInfo& contact, const uint8_t* frame, int len); |
|
|
|
void addToOfflineQueue(const uint8_t frame[], int len); |
|
|
|
int getFromOfflineQueue(uint8_t frame[]); |
|
|
|
void loadMainIdentity(); |
|
|
|
bool saveMainIdentity(const mesh::LocalIdentity& identity); |
|
|
|
void loadContacts(); |
|
|
|
void saveContacts(); |
|
|
|
void loadChannels(); |
|
|
|
void saveChannels(); |
|
|
|
int getBlobByKey(const uint8_t key[], int key_len, uint8_t dest_buf[]) override; |
|
|
|
bool putBlobByKey(const uint8_t key[], int key_len, const uint8_t src_buf[], int len) override; |
|
|
|
void writeOKFrame(); |
|
|
|
void writeErrFrame(uint8_t err_code); |
|
|
|
void writeDisabledFrame(); |
|
|
|
void writeContactRespFrame(uint8_t code, const ContactInfo &contact); |
|
|
|
void updateContactFromFrame(ContactInfo &contact, const uint8_t *frame, int len); |
|
|
|
void addToOfflineQueue(const uint8_t frame[], int len); |
|
|
|
int getFromOfflineQueue(uint8_t frame[]); |
|
|
|
void loadMainIdentity(); |
|
|
|
bool saveMainIdentity(const mesh::LocalIdentity &identity); |
|
|
|
void loadContacts(); |
|
|
|
void saveContacts(); |
|
|
|
void loadChannels(); |
|
|
|
void saveChannels(); |
|
|
|
int getBlobByKey(const uint8_t key[], int key_len, uint8_t dest_buf[]) override; |
|
|
|
bool putBlobByKey(const uint8_t key[], int key_len, const uint8_t src_buf[], int len) override; |
|
|
|
|
|
|
|
private: |
|
|
|
FILESYSTEM* _fs; |
|
|
|
IdentityStore* _identity_store; |
|
|
|
NodePrefs _prefs; |
|
|
|
uint32_t pending_login; |
|
|
|
uint32_t pending_status; |
|
|
|
uint32_t pending_telemetry; |
|
|
|
BaseSerialInterface* _serial; |
|
|
|
|
|
|
|
ContactsIterator _iter; |
|
|
|
uint32_t _iter_filter_since; |
|
|
|
uint32_t _most_recent_lastmod; |
|
|
|
uint32_t _active_ble_pin; |
|
|
|
bool _iter_started; |
|
|
|
uint8_t app_target_ver; |
|
|
|
uint8_t* sign_data; |
|
|
|
uint32_t sign_data_len; |
|
|
|
unsigned long dirty_contacts_expiry; |
|
|
|
|
|
|
|
uint8_t cmd_frame[MAX_FRAME_SIZE + 1]; |
|
|
|
uint8_t out_frame[MAX_FRAME_SIZE + 1]; |
|
|
|
CayenneLPP telemetry; |
|
|
|
|
|
|
|
struct Frame { |
|
|
|
uint8_t len; |
|
|
|
uint8_t buf[MAX_FRAME_SIZE]; |
|
|
|
}; |
|
|
|
int offline_queue_len; |
|
|
|
Frame offline_queue[OFFLINE_QUEUE_SIZE]; |
|
|
|
|
|
|
|
struct AckTableEntry { |
|
|
|
unsigned long msg_sent; |
|
|
|
uint32_t ack; |
|
|
|
}; |
|
|
|
#define EXPECTED_ACK_TABLE_SIZE 8 |
|
|
|
AckTableEntry expected_ack_table[EXPECTED_ACK_TABLE_SIZE]; // circular table
|
|
|
|
int next_ack_idx; |
|
|
|
FILESYSTEM *_fs; |
|
|
|
IdentityStore *_identity_store; |
|
|
|
NodePrefs _prefs; |
|
|
|
uint32_t pending_login; |
|
|
|
uint32_t pending_status; |
|
|
|
uint32_t pending_telemetry; |
|
|
|
BaseSerialInterface *_serial; |
|
|
|
|
|
|
|
ContactsIterator _iter; |
|
|
|
uint32_t _iter_filter_since; |
|
|
|
uint32_t _most_recent_lastmod; |
|
|
|
uint32_t _active_ble_pin; |
|
|
|
bool _iter_started; |
|
|
|
uint8_t app_target_ver; |
|
|
|
uint8_t *sign_data; |
|
|
|
uint32_t sign_data_len; |
|
|
|
unsigned long dirty_contacts_expiry; |
|
|
|
|
|
|
|
uint8_t cmd_frame[MAX_FRAME_SIZE + 1]; |
|
|
|
uint8_t out_frame[MAX_FRAME_SIZE + 1]; |
|
|
|
CayenneLPP telemetry; |
|
|
|
|
|
|
|
struct Frame { |
|
|
|
uint8_t len; |
|
|
|
uint8_t buf[MAX_FRAME_SIZE]; |
|
|
|
}; |
|
|
|
int offline_queue_len; |
|
|
|
Frame offline_queue[OFFLINE_QUEUE_SIZE]; |
|
|
|
|
|
|
|
struct AckTableEntry { |
|
|
|
unsigned long msg_sent; |
|
|
|
uint32_t ack; |
|
|
|
}; |
|
|
|
#define EXPECTED_ACK_TABLE_SIZE 8 |
|
|
|
AckTableEntry expected_ack_table[EXPECTED_ACK_TABLE_SIZE]; // circular table
|
|
|
|
int next_ack_idx; |
|
|
|
}; |
|
|
|
|
|
|
|
extern StdRNG fast_rng; |
|
|
|
extern SimpleMeshTables tables; |
|
|
|
extern MyMesh the_mesh; |
|
|
|
#ifdef DISPLAY_CLASS |
|
|
|
extern UITask ui_task; |
|
|
|
#endif |
|
|
|
#endif // MYMESH_H
|
|
|
|
extern UITask ui_task; |
|
|
|
#endif |