mirror of https://github.com/meshcore-dev/MeshCore
committed by
GitHub
11 changed files with 1872 additions and 1597 deletions
@ -0,0 +1,84 @@ |
|||||
|
# .clang-format |
||||
|
Language: Cpp |
||||
|
AccessModifierOffset: -2 |
||||
|
AlignAfterOpenBracket: Align |
||||
|
AlignConsecutiveAssignments: false |
||||
|
AlignConsecutiveDeclarations: false |
||||
|
AlignConsecutiveMacros: |
||||
|
Enabled: true |
||||
|
AcrossEmptyLines: true |
||||
|
AcrossComments: true |
||||
|
AlignOperands: true |
||||
|
AlignTrailingComments: true |
||||
|
AllowAllParametersOfDeclarationOnNextLine: false |
||||
|
AllowShortBlocksOnASingleLine: false |
||||
|
AllowShortCaseLabelsOnASingleLine: false |
||||
|
AllowShortFunctionsOnASingleLine: Inline |
||||
|
AllowShortIfStatementsOnASingleLine: true |
||||
|
AllowShortLoopsOnASingleLine: false |
||||
|
AlwaysBreakAfterDefinitionReturnType: None |
||||
|
AlwaysBreakAfterReturnType: None |
||||
|
AlwaysBreakBeforeMultilineStrings: false |
||||
|
AlwaysBreakTemplateDeclarations: No |
||||
|
BinPackArguments: true |
||||
|
BinPackParameters: true |
||||
|
BraceWrapping: |
||||
|
AfterClass: false |
||||
|
AfterControlStatement: false |
||||
|
AfterEnum: false |
||||
|
AfterFunction: false |
||||
|
AfterNamespace: false |
||||
|
AfterObjCDeclaration: false |
||||
|
AfterStruct: false |
||||
|
AfterUnion: false |
||||
|
BeforeCatch: true |
||||
|
BeforeElse: true |
||||
|
IndentBraces: false |
||||
|
BreakBeforeBinaryOperators: None |
||||
|
BreakBeforeBraces: Attach |
||||
|
BreakBeforeTernaryOperators: true |
||||
|
BreakConstructorInitializersBeforeComma: false |
||||
|
ColumnLimit: 110 |
||||
|
CommentPragmas: '^ IWYU pragma:' |
||||
|
CompactNamespaces: false |
||||
|
ConstructorInitializerAllOnOneLineOrOnePerLine: false |
||||
|
Cpp11BracedListStyle: false |
||||
|
DerivePointerAlignment: false |
||||
|
DisableFormat: false |
||||
|
IncludeBlocks: Regroup |
||||
|
IndentCaseLabels: false |
||||
|
IndentPPDirectives: None |
||||
|
IndentWidth: 2 |
||||
|
IndentWrappedFunctionNames: false |
||||
|
KeepEmptyLinesAtTheStartOfBlocks: true |
||||
|
MacroBlockBegin: '' |
||||
|
MacroBlockEnd: '' |
||||
|
MaxEmptyLinesToKeep: 1 |
||||
|
NamespaceIndentation: None |
||||
|
ObjCBinPackProtocolList: Auto |
||||
|
PenaltyBreakBeforeFirstCallParameter: 19 |
||||
|
PenaltyBreakComment: 300 |
||||
|
PenaltyBreakFirstLessLess: 120 |
||||
|
PenaltyBreakString: 1000 |
||||
|
PenaltyExcessCharacter: 100000 |
||||
|
PenaltyReturnTypeOnItsOwnLine: 60 |
||||
|
PointerAlignment: Right |
||||
|
ReflowComments: true |
||||
|
SortIncludes: true |
||||
|
SpaceAfterCStyleCast: false |
||||
|
SpaceAfterTemplateKeyword: true |
||||
|
SpaceBeforeAssignmentOperators: true |
||||
|
SpaceBeforeCtorInitializerColon: true |
||||
|
SpaceBeforeInheritanceColon: true |
||||
|
SpaceBeforeParens: ControlStatements |
||||
|
SpaceInEmptyParentheses: false |
||||
|
SpacesBeforeTrailingComments: 1 |
||||
|
SpacesInAngles: false |
||||
|
SpacesInContainerLiterals: false |
||||
|
SpacesInCStyleCastParentheses: false |
||||
|
SpacesInParentheses: false |
||||
|
SpacesInSquareBrackets: false |
||||
|
Standard: Auto |
||||
|
TabWidth: 2 |
||||
|
UseTab: Never |
||||
|
AlignEscapedNewlines: LeftWithLastLine |
||||
File diff suppressed because it is too large
@ -0,0 +1,221 @@ |
|||||
|
#pragma once |
||||
|
|
||||
|
#include <Arduino.h> |
||||
|
#include <Mesh.h> |
||||
|
#ifdef DISPLAY_CLASS |
||||
|
#include "UITask.h" |
||||
|
#endif |
||||
|
|
||||
|
/*------------ Frame Protocol --------------*/ |
||||
|
#define FIRMWARE_VER_CODE 5 |
||||
|
|
||||
|
#ifndef FIRMWARE_BUILD_DATE |
||||
|
#define FIRMWARE_BUILD_DATE "24 May 2025" |
||||
|
#endif |
||||
|
|
||||
|
#ifndef FIRMWARE_VERSION |
||||
|
#define FIRMWARE_VERSION "v1.6.2" |
||||
|
#endif |
||||
|
|
||||
|
#if defined(NRF52_PLATFORM) || defined(STM32_PLATFORM) |
||||
|
#include <InternalFileSystem.h> |
||||
|
#elif defined(RP2040_PLATFORM) |
||||
|
#include <LittleFS.h> |
||||
|
#elif defined(ESP32) |
||||
|
#include <SPIFFS.h> |
||||
|
#endif |
||||
|
|
||||
|
#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 |
||||
|
#endif |
||||
|
#ifndef LORA_BW |
||||
|
#define LORA_BW 250 |
||||
|
#endif |
||||
|
#ifndef LORA_SF |
||||
|
#define LORA_SF 10 |
||||
|
#endif |
||||
|
#ifndef LORA_CR |
||||
|
#define LORA_CR 5 |
||||
|
#endif |
||||
|
#ifndef LORA_TX_POWER |
||||
|
#define LORA_TX_POWER 20 |
||||
|
#endif |
||||
|
#ifndef MAX_LORA_TX_POWER |
||||
|
#define MAX_LORA_TX_POWER LORA_TX_POWER |
||||
|
#endif |
||||
|
|
||||
|
#ifndef MAX_CONTACTS |
||||
|
#define MAX_CONTACTS 100 |
||||
|
#endif |
||||
|
|
||||
|
#ifndef OFFLINE_QUEUE_SIZE |
||||
|
#define OFFLINE_QUEUE_SIZE 16 |
||||
|
#endif |
||||
|
|
||||
|
#ifndef BLE_NAME_PREFIX |
||||
|
#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==" |
||||
|
|
||||
|
// 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 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
|
||||
|
|
||||
|
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(); |
||||
|
|
||||
|
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; |
||||
|
|
||||
|
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; |
||||
|
|
||||
|
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; |
||||
|
}; |
||||
|
|
||||
|
extern StdRNG fast_rng; |
||||
|
extern SimpleMeshTables tables; |
||||
|
extern MyMesh the_mesh; |
||||
|
#ifdef DISPLAY_CLASS |
||||
|
extern UITask ui_task; |
||||
|
#endif |
||||
File diff suppressed because it is too large
Loading…
Reference in new issue