Merge branch 'master' into sx126x-rx-boosted-gain

This commit is contained in:
Ben Meadors
2023-01-18 16:57:41 -06:00
committed by GitHub
co-authored by GitHub
90 changed files with 1751 additions and 1374 deletions
+15 -12
View File
@@ -33,7 +33,7 @@ jobs:
- board: m5stack-coreink - board: m5stack-coreink
- board: tbeam-s3-core - board: tbeam-s3-core
- board: tlora-t3s3-v1 - board: tlora-t3s3-v1
runs-on: ubuntu-latest runs-on: ubuntu-latest
steps: steps:
- uses: actions/checkout@v3 - uses: actions/checkout@v3
@@ -41,6 +41,9 @@ jobs:
id: base id: base
uses: ./.github/actions/setup-base uses: ./.github/actions/setup-base
- name: Trunk Check
uses: trunk-io/trunk-action@v1
- name: Check ${{ matrix.board }} - name: Check ${{ matrix.board }}
run: bin/check-all.sh ${{ matrix.board }} run: bin/check-all.sh ${{ matrix.board }}
@@ -109,14 +112,14 @@ jobs:
uses: ./.github/actions/setup-base uses: ./.github/actions/setup-base
# We now run integration test before other build steps (to quickly see runtime failures) # We now run integration test before other build steps (to quickly see runtime failures)
- name: Build for native #- name: Build for native
run: platformio run -e native # run: platformio run -e native
- name: Integration test #- name: Integration test
run: | # run: |
.pio/build/native/program & #.pio/build/native/program
sleep 20 # 5 seconds was not enough #& sleep 20 # 5 seconds was not enough
echo "Simulator started, launching python test..." #echo "Simulator started, launching python test..."
python3 -c 'from meshtastic.test import testSimulator; testSimulator()' #python3 -c 'from meshtastic.test import testSimulator; testSimulator()'
- name: Build Native - name: Build Native
run: bin/build-native.sh run: bin/build-native.sh
@@ -132,11 +135,11 @@ jobs:
path: | path: |
release/device-*.sh release/device-*.sh
release/device-*.bat release/device-*.bat
- name: Docker login - name: Docker login
if: ${{ github.event_name == 'workflow_dispatch' }} if: ${{ github.event_name == 'workflow_dispatch' }}
uses: docker/login-action@v2 uses: docker/login-action@v2
with: with:
username: meshtastic username: meshtastic
password: ${{ secrets.DOCKER_TOKEN }} password: ${{ secrets.DOCKER_TOKEN }}
@@ -152,7 +155,7 @@ jobs:
file: ./Dockerfile file: ./Dockerfile
push: true push: true
tags: meshtastic/device-simulator:latest tags: meshtastic/device-simulator:latest
after-checks: after-checks:
runs-on: ubuntu-latest runs-on: ubuntu-latest
needs: [check] needs: [check]
+19
View File
@@ -0,0 +1,19 @@
name: Nightly
on:
schedule:
- cron: 0 8 * * 1-5
workflow_dispatch: {}
jobs:
trunk_check:
name: Trunk Check Upload
runs-on: ubuntu-latest
steps:
- name: Checkout
uses: actions/checkout@v3
- name: Trunk Check
uses: trunk-io/trunk-action@v1
with:
trunk-token: ${{ secrets.TRUNK_TOKEN }}
+7
View File
@@ -0,0 +1,7 @@
*out
*logs
*actions
*notifications
plugins
user_trunk.yaml
user.yaml
+4
View File
@@ -0,0 +1,4 @@
# Following source doesn't work in most setups
ignored:
- SC1090
- SC1091
+10
View File
@@ -0,0 +1,10 @@
# Autoformatter friendly markdownlint config (all formatting rules disabled)
default: true
blank_lines: false
bullet: false
html: false
indentation: false
line_length: false
spaces: false
url: false
whitespace: false
+7
View File
@@ -0,0 +1,7 @@
enable=all
source-path=SCRIPTDIR
disable=SC2154
# If you're having issues with shellcheck following source, disable the errors via:
# disable=SC1090
# disable=SC1091
+14
View File
@@ -0,0 +1,14 @@
module.exports = {
plugins: [
{
name: "preset-default",
params: {
overrides: {
removeViewBox: false, // https://github.com/svg/svgo/issues/1128
sortAttrs: true,
removeOffCanvasPaths: true,
},
},
},
],
};
+32
View File
@@ -0,0 +1,32 @@
version: 0.1
cli:
version: 1.3.1
plugins:
sources:
- id: trunk
ref: v0.0.8
uri: https://github.com/trunk-io/plugins
lint:
enabled:
- shellcheck@0.9.0
- shfmt@3.5.0
- oxipng@8.0.0
- actionlint@1.6.22
- git-diff-check
- gitleaks@8.15.2
- markdownlint@0.33.0
- hadolint@2.12.0
- clang-format@14.0.0
- prettier@2.8.3
- svgo@3.0.2
runtimes:
enabled:
- go@1.18.3
- node@18.12.1
actions:
disabled:
- trunk-announce
- trunk-check-pre-push
- trunk-fmt-pre-commit
enabled:
- trunk-upgrade-available
+2 -4
View File
@@ -2,10 +2,8 @@
// See http://go.microsoft.com/fwlink/?LinkId=827846 // See http://go.microsoft.com/fwlink/?LinkId=827846
// for the documentation about the extensions.json format // for the documentation about the extensions.json format
"recommendations": [ "recommendations": [
"ms-vscode.cpptools",
"platformio.platformio-ide", "platformio.platformio-ide",
"xaver.clang-format" "trunk.io"
], ],
"unwantedRecommendations": [
"ms-vscode.cpptools-extension-pack"
]
} }
+3 -79
View File
@@ -1,80 +1,4 @@
{ {
"files.associations": { "editor.formatOnSave": true,
"type_traits": "cpp", "editor.defaultFormatter": "trunk.io"
"array": "cpp", }
"*.tcc": "cpp",
"cctype": "cpp",
"clocale": "cpp",
"cmath": "cpp",
"cstdarg": "cpp",
"cstddef": "cpp",
"cstdint": "cpp",
"cstdio": "cpp",
"cstdlib": "cpp",
"cstring": "cpp",
"ctime": "cpp",
"cwchar": "cpp",
"cwctype": "cpp",
"deque": "cpp",
"unordered_map": "cpp",
"unordered_set": "cpp",
"vector": "cpp",
"exception": "cpp",
"algorithm": "cpp",
"functional": "cpp",
"system_error": "cpp",
"tuple": "cpp",
"fstream": "cpp",
"initializer_list": "cpp",
"iomanip": "cpp",
"iosfwd": "cpp",
"istream": "cpp",
"limits": "cpp",
"memory": "cpp",
"new": "cpp",
"ostream": "cpp",
"numeric": "cpp",
"sstream": "cpp",
"stdexcept": "cpp",
"streambuf": "cpp",
"cinttypes": "cpp",
"utility": "cpp",
"typeinfo": "cpp",
"string": "cpp",
"*.xbm": "cpp",
"list": "cpp",
"atomic": "cpp",
"memory_resource": "cpp",
"optional": "cpp",
"string_view": "cpp",
"cassert": "cpp",
"iterator": "cpp",
"shared_mutex": "cpp",
"iostream": "cpp",
"esp_nimble_hci.h": "c",
"map": "cpp",
"random": "cpp",
"*.tpp": "cpp"
},
"cSpell.words": [
"Blox",
"EINK",
"HFSR",
"Meshtastic",
"NEMAGPS",
"NMEAGPS",
"RDEF",
"Ublox",
"bkpt",
"cfsr",
"descs",
"ocrypto",
"protobufs",
"wifi"
],
"C_Cpp.dimInactiveRegions": true,
"cmake.configureOnOpen": true,
"protoc": {
"compile_on_save": false,
}
}
+1 -1
View File
@@ -1 +1 @@
cd protobufs && ..\nanopb-0.4.7\generator-bin\protoc.exe --nanopb_out=-v:..\src\mesh\generated -I=..\protobufs *.proto cd protobufs && ..\nanopb-0.4.7\generator-bin\protoc.exe --nanopb_out=-v:..\src\mesh\generated\meshtastic -I=..\protobufs meshtastic\*.proto
+6 -1
View File
@@ -8,7 +8,12 @@ echo "prebuilt binaries for your computer into nanopb-0.4.7"
# the nanopb tool seems to require that the .options file be in the current directory! # the nanopb tool seems to require that the .options file be in the current directory!
cd protobufs cd protobufs
../nanopb-0.4.7/generator-bin/protoc --nanopb_out=-v:../src/mesh/generated -I=../protobufs *.proto ../nanopb-0.4.7/generator-bin/protoc --nanopb_out=-v:../src/mesh/generated/ -I=../protobufs meshtastic/*.proto
cd ../src/mesh/generated/meshtastic
sed -i 's/#include "meshtastic/#include "./g' *
sed -i 's/meshtastic_//g' *
#echo "Regenerating protobuf documentation - if you see an error message" #echo "Regenerating protobuf documentation - if you see an error message"
#echo "you can ignore it unless doing a new protobuf release to github." #echo "you can ignore it unless doing a new protobuf release to github."
+20 -19
View File
@@ -1,11 +1,11 @@
#include "../configuration.h" #include "../configuration.h"
#include "../main.h" #include "../main.h"
#include "mesh/generated/meshtastic/telemetry.pb.h"
#include <Wire.h> #include <Wire.h>
#include "mesh/generated/telemetry.pb.h"
// AXP192 and AXP2101 have the same device address, we just need to identify it in Power.cpp // AXP192 and AXP2101 have the same device address, we just need to identify it in Power.cpp
#ifndef XPOWERS_AXP192_AXP2101_ADDRESS #ifndef XPOWERS_AXP192_AXP2101_ADDRESS
#define XPOWERS_AXP192_AXP2101_ADDRESS 0x34 #define XPOWERS_AXP192_AXP2101_ADDRESS 0x34
#endif #endif
#if HAS_WIRE #if HAS_WIRE
@@ -16,27 +16,27 @@ void printATECCInfo()
atecc.readConfigZone(false); atecc.readConfigZone(false);
LOG_DEBUG("ATECC608B Serial Number: "); LOG_DEBUG("ATECC608B Serial Number: ");
for (int i = 0 ; i < 9 ; i++) { for (int i = 0; i < 9; i++) {
LOG_DEBUG("%02x",atecc.serialNumber[i]); LOG_DEBUG("%02x", atecc.serialNumber[i]);
} }
LOG_DEBUG(", Rev Number: "); LOG_DEBUG(", Rev Number: ");
for (int i = 0 ; i < 4 ; i++) { for (int i = 0; i < 4; i++) {
LOG_DEBUG("%02x",atecc.revisionNumber[i]); LOG_DEBUG("%02x", atecc.revisionNumber[i]);
} }
LOG_DEBUG("\n"); LOG_DEBUG("\n");
LOG_DEBUG("ATECC608B Config %s",atecc.configLockStatus ? "Locked" : "Unlocked"); LOG_DEBUG("ATECC608B Config %s", atecc.configLockStatus ? "Locked" : "Unlocked");
LOG_DEBUG(", Data %s",atecc.dataOTPLockStatus ? "Locked" : "Unlocked"); LOG_DEBUG(", Data %s", atecc.dataOTPLockStatus ? "Locked" : "Unlocked");
LOG_DEBUG(", Slot 0 %s\n",atecc.slot0LockStatus ? "Locked" : "Unlocked"); LOG_DEBUG(", Slot 0 %s\n", atecc.slot0LockStatus ? "Locked" : "Unlocked");
if (atecc.configLockStatus && atecc.dataOTPLockStatus && atecc.slot0LockStatus) { if (atecc.configLockStatus && atecc.dataOTPLockStatus && atecc.slot0LockStatus) {
if (atecc.generatePublicKey() == false) { if (atecc.generatePublicKey() == false) {
LOG_DEBUG("ATECC608B Error generating public key\n"); LOG_DEBUG("ATECC608B Error generating public key\n");
} else { } else {
LOG_DEBUG("ATECC608B Public Key: "); LOG_DEBUG("ATECC608B Public Key: ");
for (int i = 0 ; i < 64 ; i++) { for (int i = 0; i < 64; i++) {
LOG_DEBUG("%02x",atecc.publicKey64Bytes[i]); LOG_DEBUG("%02x", atecc.publicKey64Bytes[i]);
} }
LOG_DEBUG("\n"); LOG_DEBUG("\n");
} }
@@ -44,7 +44,8 @@ void printATECCInfo()
#endif #endif
} }
uint16_t getRegisterValue(uint8_t address, uint8_t reg, uint8_t length) { uint16_t getRegisterValue(uint8_t address, uint8_t reg, uint8_t length)
{
uint16_t value = 0x00; uint16_t value = 0x00;
Wire.beginTransmission(address); Wire.beginTransmission(address);
Wire.write(reg); Wire.write(reg);
@@ -54,7 +55,7 @@ uint16_t getRegisterValue(uint8_t address, uint8_t reg, uint8_t length) {
LOG_DEBUG("Wire.available() = %d\n", Wire.available()); LOG_DEBUG("Wire.available() = %d\n", Wire.available());
if (Wire.available() == 2) { if (Wire.available() == 2) {
// Read MSB, then LSB // Read MSB, then LSB
value = (uint16_t)Wire.read() << 8; value = (uint16_t)Wire.read() << 8;
value |= Wire.read(); value |= Wire.read();
} else if (Wire.available()) { } else if (Wire.available()) {
value = Wire.read(); value = Wire.read();
@@ -81,7 +82,7 @@ uint8_t oled_probe(byte addr)
if (r == 0x08 || r == 0x00) { if (r == 0x08 || r == 0x00) {
o_probe = 2; // SH1106 o_probe = 2; // SH1106
} else if ( r == 0x03 || r == 0x04 || r == 0x06 || r == 0x07) { } else if (r == 0x03 || r == 0x04 || r == 0x06 || r == 0x07) {
o_probe = 1; // SSD1306 o_probe = 1; // SSD1306
} }
c++; c++;
@@ -126,17 +127,17 @@ void scanI2Cdevice()
} }
#endif #endif
#ifdef RV3028_RTC #ifdef RV3028_RTC
if (addr == RV3028_RTC){ if (addr == RV3028_RTC) {
rtc_found = addr; rtc_found = addr;
LOG_INFO("RV3028 RTC found\n"); LOG_INFO("RV3028 RTC found\n");
Melopero_RV3028 rtc; Melopero_RV3028 rtc;
rtc.initI2C(); rtc.initI2C();
rtc.writeToRegister(0x35,0x07); // no Clkout rtc.writeToRegister(0x35, 0x07); // no Clkout
rtc.writeToRegister(0x37,0xB4); rtc.writeToRegister(0x37, 0xB4);
} }
#endif #endif
#ifdef PCF8563_RTC #ifdef PCF8563_RTC
if (addr == PCF8563_RTC){ if (addr == PCF8563_RTC) {
rtc_found = addr; rtc_found = addr;
LOG_INFO("PCF8563 RTC found\n"); LOG_INFO("PCF8563 RTC found\n");
} }
@@ -225,7 +226,7 @@ void scanI2Cdevice()
if (nDevices == 0) if (nDevices == 0)
LOG_INFO("No I2C devices found\n"); LOG_INFO("No I2C devices found\n");
else else
LOG_INFO("%i I2C devices found\n",nDevices); LOG_INFO("%i I2C devices found\n", nDevices);
} }
#else #else
void scanI2Cdevice() {} void scanI2Cdevice() {}
+3 -2
View File
@@ -2,10 +2,11 @@
#include <Arduino.h> #include <Arduino.h>
#include "mesh/generated/mesh.pb.h" // For CriticalErrorCode #include "mesh/generated/meshtastic/mesh.pb.h" // For CriticalErrorCode
/// A macro that include filename and line /// A macro that include filename and line
#define RECORD_CRITICALERROR(code) recordCriticalError(code, __LINE__, __FILE__) #define RECORD_CRITICALERROR(code) recordCriticalError(code, __LINE__, __FILE__)
/// Record an error that should be reported via analytics /// Record an error that should be reported via analytics
void recordCriticalError(CriticalErrorCode code = CriticalErrorCode_UNSPECIFIED, uint32_t address = 0, const char *filename = NULL); void recordCriticalError(CriticalErrorCode code = CriticalErrorCode_UNSPECIFIED, uint32_t address = 0,
const char *filename = NULL);
+84 -76
View File
@@ -33,9 +33,9 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
#include "main.h" #include "main.h"
#include "mesh-pb-constants.h" #include "mesh-pb-constants.h"
#include "mesh/Channels.h" #include "mesh/Channels.h"
#include "mesh/generated/deviceonly.pb.h" #include "mesh/generated/meshtastic/deviceonly.pb.h"
#include "modules/TextMessageModule.h"
#include "modules/ExternalNotificationModule.h" #include "modules/ExternalNotificationModule.h"
#include "modules/TextMessageModule.h"
#include "sleep.h" #include "sleep.h"
#include "target_specific.h" #include "target_specific.h"
#include "utils.h" #include "utils.h"
@@ -69,7 +69,7 @@ static uint32_t targetFramerate = IDLE_FRAMERATE;
static char btPIN[16] = "888888"; static char btPIN[16] = "888888";
uint32_t logo_timeout = 5000; // 4 seconds for EACH logo uint32_t logo_timeout = 5000; // 4 seconds for EACH logo
// This image definition is here instead of images.h because it's modified dynamically by the drawBattery function // This image definition is here instead of images.h because it's modified dynamically by the drawBattery function
uint8_t imgBattery[16] = {0xFF, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0xE7, 0x3C}; uint8_t imgBattery[16] = {0xFF, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0xE7, 0x3C};
@@ -97,9 +97,9 @@ static uint16_t displayWidth, displayHeight;
#if defined(USE_EINK) || defined(ILI9341_DRIVER) || defined(ST7735_CS) #if defined(USE_EINK) || defined(ILI9341_DRIVER) || defined(ST7735_CS)
// The screen is bigger so use bigger fonts // The screen is bigger so use bigger fonts
#define FONT_SMALL ArialMT_Plain_16 // Height: 19 #define FONT_SMALL ArialMT_Plain_16 // Height: 19
#define FONT_MEDIUM ArialMT_Plain_24 // Height: 28 #define FONT_MEDIUM ArialMT_Plain_24 // Height: 28
#define FONT_LARGE ArialMT_Plain_24 // Height: 28 #define FONT_LARGE ArialMT_Plain_24 // Height: 28
#else #else
#ifdef OLED_RU #ifdef OLED_RU
#define FONT_SMALL ArialMT_Plain_10_RU #define FONT_SMALL ArialMT_Plain_10_RU
@@ -107,7 +107,7 @@ static uint16_t displayWidth, displayHeight;
#define FONT_SMALL ArialMT_Plain_10 // Height: 13 #define FONT_SMALL ArialMT_Plain_10 // Height: 13
#endif #endif
#define FONT_MEDIUM ArialMT_Plain_16 // Height: 19 #define FONT_MEDIUM ArialMT_Plain_16 // Height: 19
#define FONT_LARGE ArialMT_Plain_24 // Height: 28 #define FONT_LARGE ArialMT_Plain_24 // Height: 28
#endif #endif
#define fontHeight(font) ((font)[1] + 1) // height is position 1 #define fontHeight(font) ((font)[1] + 1) // height is position 1
@@ -118,7 +118,6 @@ static uint16_t displayWidth, displayHeight;
#define getStringCenteredX(s) ((SCREEN_WIDTH - display->getStringWidth(s)) / 2) #define getStringCenteredX(s) ((SCREEN_WIDTH - display->getStringWidth(s)) / 2)
/** /**
* Draw the icon with extra info printed around the corners * Draw the icon with extra info printed around the corners
*/ */
@@ -236,7 +235,7 @@ static void drawWelcomeScreen(OLEDDisplay *display, OLEDDisplayUiState *state, i
display->drawString(64 + x, y, "//\\ E S H T /\\ S T / C"); display->drawString(64 + x, y, "//\\ E S H T /\\ S T / C");
display->drawString(64 + x, y + FONT_HEIGHT_SMALL, getDeviceName()); display->drawString(64 + x, y + FONT_HEIGHT_SMALL, getDeviceName());
display->setTextAlignment(TEXT_ALIGN_LEFT); display->setTextAlignment(TEXT_ALIGN_LEFT);
if ((millis() / 10000) % 2) { if ((millis() / 10000) % 2) {
display->drawString(x, y + FONT_HEIGHT_SMALL * 2 - 3, "Set the region using the"); display->drawString(x, y + FONT_HEIGHT_SMALL * 2 - 3, "Set the region using the");
display->drawString(x, y + FONT_HEIGHT_SMALL * 3 - 3, "Meshtastic Android, iOS,"); display->drawString(x, y + FONT_HEIGHT_SMALL * 3 - 3, "Meshtastic Android, iOS,");
@@ -292,7 +291,7 @@ static void drawFrameBluetooth(OLEDDisplay *display, OLEDDisplayUiState *state,
display->drawString(x_offset + x, y_offset + y, "Bluetooth"); display->drawString(x_offset + x, y_offset + y, "Bluetooth");
display->setFont(FONT_SMALL); display->setFont(FONT_SMALL);
y_offset = display->height() == 64 ? y_offset + FONT_HEIGHT_MEDIUM -4 : y_offset + FONT_HEIGHT_MEDIUM + 5; y_offset = display->height() == 64 ? y_offset + FONT_HEIGHT_MEDIUM - 4 : y_offset + FONT_HEIGHT_MEDIUM + 5;
display->drawString(x_offset + x, y_offset + y, "Enter this code"); display->drawString(x_offset + x, y_offset + y, "Enter this code");
display->setFont(FONT_LARGE); display->setFont(FONT_LARGE);
@@ -302,7 +301,7 @@ static void drawFrameBluetooth(OLEDDisplay *display, OLEDDisplayUiState *state,
display->drawString(x_offset + x, y_offset + y, pin); display->drawString(x_offset + x, y_offset + y, pin);
display->setFont(FONT_SMALL); display->setFont(FONT_SMALL);
String deviceName = "Name: "; String deviceName = "Name: ";
deviceName.concat(getDeviceName()); deviceName.concat(getDeviceName());
y_offset = display->height() == 64 ? y_offset + FONT_HEIGHT_LARGE - 6 : y_offset + FONT_HEIGHT_LARGE + 5; y_offset = display->height() == 64 ? y_offset + FONT_HEIGHT_LARGE - 6 : y_offset + FONT_HEIGHT_LARGE + 5;
display->drawString(x_offset + x, y_offset + y, deviceName); display->drawString(x_offset + x, y_offset + y, deviceName);
@@ -332,7 +331,8 @@ static void drawFrameFirmware(OLEDDisplay *display, OLEDDisplayUiState *state, i
display->setFont(FONT_SMALL); display->setFont(FONT_SMALL);
display->setTextAlignment(TEXT_ALIGN_LEFT); display->setTextAlignment(TEXT_ALIGN_LEFT);
display->drawStringMaxWidth(0 + x, 2 + y + FONT_HEIGHT_SMALL *2, x + display->getWidth(), "Please be patient and do not power off."); display->drawStringMaxWidth(0 + x, 2 + y + FONT_HEIGHT_SMALL * 2, x + display->getWidth(),
"Please be patient and do not power off.");
} }
/// Draw the last text message we received /// Draw the last text message we received
@@ -354,8 +354,7 @@ static void drawCriticalFaultFrame(OLEDDisplay *display, OLEDDisplayUiState *sta
// Ignore messages orginating from phone (from the current node 0x0) unless range test or store and forward module are enabled // Ignore messages orginating from phone (from the current node 0x0) unless range test or store and forward module are enabled
static bool shouldDrawMessage(const MeshPacket *packet) static bool shouldDrawMessage(const MeshPacket *packet)
{ {
return packet->from != 0 && !moduleConfig.range_test.enabled && return packet->from != 0 && !moduleConfig.range_test.enabled && !moduleConfig.store_forward.enabled;
!moduleConfig.store_forward.enabled;
} }
/// Draw the last text message we received /// Draw the last text message we received
@@ -381,7 +380,7 @@ static void drawTextMessageFrame(OLEDDisplay *display, OLEDDisplayUiState *state
display->setColor(BLACK); display->setColor(BLACK);
} }
display->drawStringf(0 + x, 0 + y, tempBuf, "From: %s", (node && node->has_user) ? node->user.short_name : "???"); display->drawStringf(0 + x, 0 + y, tempBuf, "From: %s", (node && node->has_user) ? node->user.short_name : "???");
if(config.display.heading_bold) { if (config.display.heading_bold) {
display->drawStringf(1 + x, 0 + y, tempBuf, "From: %s", (node && node->has_user) ? node->user.short_name : "???"); display->drawStringf(1 + x, 0 + y, tempBuf, "From: %s", (node && node->has_user) ? node->user.short_name : "???");
} }
display->setColor(WHITE); display->setColor(WHITE);
@@ -477,7 +476,7 @@ static void drawNodes(OLEDDisplay *display, int16_t x, int16_t y, NodeStatus *no
display->drawFastImage(x, y, 8, 8, imgUser); display->drawFastImage(x, y, 8, 8, imgUser);
#endif #endif
display->drawString(x + 10, y - 2, usersString); display->drawString(x + 10, y - 2, usersString);
if(config.display.heading_bold) if (config.display.heading_bold)
display->drawString(x + 11, y - 2, usersString); display->drawString(x + 11, y - 2, usersString);
} }
@@ -487,20 +486,20 @@ static void drawGPS(OLEDDisplay *display, int16_t x, int16_t y, const GPSStatus
if (config.position.fixed_position) { if (config.position.fixed_position) {
// GPS coordinates are currently fixed // GPS coordinates are currently fixed
display->drawString(x - 1, y - 2, "Fixed GPS"); display->drawString(x - 1, y - 2, "Fixed GPS");
if(config.display.heading_bold) if (config.display.heading_bold)
display->drawString(x, y - 2, "Fixed GPS"); display->drawString(x, y - 2, "Fixed GPS");
return; return;
} }
if (!gps->getIsConnected()) { if (!gps->getIsConnected()) {
display->drawString(x, y - 2, "No GPS"); display->drawString(x, y - 2, "No GPS");
if(config.display.heading_bold) if (config.display.heading_bold)
display->drawString(x + 1, y - 2, "No GPS"); display->drawString(x + 1, y - 2, "No GPS");
return; return;
} }
display->drawFastImage(x, y, 6, 8, gps->getHasLock() ? imgPositionSolid : imgPositionEmpty); display->drawFastImage(x, y, 6, 8, gps->getHasLock() ? imgPositionSolid : imgPositionEmpty);
if (!gps->getHasLock()) { if (!gps->getHasLock()) {
display->drawString(x + 8, y - 2, "No sats"); display->drawString(x + 8, y - 2, "No sats");
if(config.display.heading_bold) if (config.display.heading_bold)
display->drawString(x + 9, y - 2, "No sats"); display->drawString(x + 9, y - 2, "No sats");
return; return;
} else { } else {
@@ -523,24 +522,24 @@ static void drawGPS(OLEDDisplay *display, int16_t x, int16_t y, const GPSStatus
// Draw the number of satellites // Draw the number of satellites
snprintf(satsString, sizeof(satsString), "%u", gps->getNumSatellites()); snprintf(satsString, sizeof(satsString), "%u", gps->getNumSatellites());
display->drawString(x + 34, y - 2, satsString); display->drawString(x + 34, y - 2, satsString);
if(config.display.heading_bold) if (config.display.heading_bold)
display->drawString(x + 35, y - 2, satsString); display->drawString(x + 35, y - 2, satsString);
} }
} }
//Draw status when gps is disabled by PMU // Draw status when gps is disabled by PMU
static void drawGPSpowerstat(OLEDDisplay *display, int16_t x, int16_t y, const GPSStatus *gps) static void drawGPSpowerstat(OLEDDisplay *display, int16_t x, int16_t y, const GPSStatus *gps)
{ {
#ifdef HAS_PMU #ifdef HAS_PMU
String displayLine = "GPS disabled"; String displayLine = "GPS disabled";
int16_t xPos = display->getStringWidth(displayLine); int16_t xPos = display->getStringWidth(displayLine);
if (!config.position.gps_enabled){ if (!config.position.gps_enabled) {
display->drawString(x + xPos, y, displayLine); display->drawString(x + xPos, y, displayLine);
#ifdef GPS_POWER_TOGGLE #ifdef GPS_POWER_TOGGLE
display->drawString(x + xPos, y - 2 + FONT_HEIGHT_SMALL, " by button"); display->drawString(x + xPos, y - 2 + FONT_HEIGHT_SMALL, " by button");
#endif #endif
//display->drawString(x + xPos, y + 2, displayLine); // display->drawString(x + xPos, y + 2, displayLine);
} }
#endif #endif
} }
@@ -582,22 +581,23 @@ static void drawGPScoordinates(OLEDDisplay *display, int16_t x, int16_t y, const
if (gpsFormat != Config_DisplayConfig_GpsCoordinateFormat_DMS) { if (gpsFormat != Config_DisplayConfig_GpsCoordinateFormat_DMS) {
char coordinateLine[22]; char coordinateLine[22];
if (gpsFormat == Config_DisplayConfig_GpsCoordinateFormat_DEC) { // Decimal Degrees if (gpsFormat == Config_DisplayConfig_GpsCoordinateFormat_DEC) { // Decimal Degrees
snprintf(coordinateLine, sizeof(coordinateLine), "%f %f", geoCoord.getLatitude() * 1e-7, geoCoord.getLongitude() * 1e-7); snprintf(coordinateLine, sizeof(coordinateLine), "%f %f", geoCoord.getLatitude() * 1e-7,
geoCoord.getLongitude() * 1e-7);
} else if (gpsFormat == Config_DisplayConfig_GpsCoordinateFormat_UTM) { // Universal Transverse Mercator } else if (gpsFormat == Config_DisplayConfig_GpsCoordinateFormat_UTM) { // Universal Transverse Mercator
snprintf(coordinateLine, sizeof(coordinateLine), "%2i%1c %06u %07u", geoCoord.getUTMZone(), geoCoord.getUTMBand(), snprintf(coordinateLine, sizeof(coordinateLine), "%2i%1c %06u %07u", geoCoord.getUTMZone(), geoCoord.getUTMBand(),
geoCoord.getUTMEasting(), geoCoord.getUTMNorthing()); geoCoord.getUTMEasting(), geoCoord.getUTMNorthing());
} else if (gpsFormat == Config_DisplayConfig_GpsCoordinateFormat_MGRS) { // Military Grid Reference System } else if (gpsFormat == Config_DisplayConfig_GpsCoordinateFormat_MGRS) { // Military Grid Reference System
snprintf(coordinateLine, sizeof(coordinateLine), "%2i%1c %1c%1c %05u %05u", geoCoord.getMGRSZone(), geoCoord.getMGRSBand(), snprintf(coordinateLine, sizeof(coordinateLine), "%2i%1c %1c%1c %05u %05u", geoCoord.getMGRSZone(),
geoCoord.getMGRSEast100k(), geoCoord.getMGRSNorth100k(), geoCoord.getMGRSEasting(), geoCoord.getMGRSBand(), geoCoord.getMGRSEast100k(), geoCoord.getMGRSNorth100k(),
geoCoord.getMGRSNorthing()); geoCoord.getMGRSEasting(), geoCoord.getMGRSNorthing());
} else if (gpsFormat == Config_DisplayConfig_GpsCoordinateFormat_OLC) { // Open Location Code } else if (gpsFormat == Config_DisplayConfig_GpsCoordinateFormat_OLC) { // Open Location Code
geoCoord.getOLCCode(coordinateLine); geoCoord.getOLCCode(coordinateLine);
} else if (gpsFormat == Config_DisplayConfig_GpsCoordinateFormat_OSGR) { // Ordnance Survey Grid Reference } else if (gpsFormat == Config_DisplayConfig_GpsCoordinateFormat_OSGR) { // Ordnance Survey Grid Reference
if (geoCoord.getOSGRE100k() == 'I' || geoCoord.getOSGRN100k() == 'I') // OSGR is only valid around the UK region if (geoCoord.getOSGRE100k() == 'I' || geoCoord.getOSGRN100k() == 'I') // OSGR is only valid around the UK region
snprintf(coordinateLine, sizeof(coordinateLine), "%s", "Out of Boundary"); snprintf(coordinateLine, sizeof(coordinateLine), "%s", "Out of Boundary");
else else
snprintf(coordinateLine, sizeof(coordinateLine), "%1c%1c %05u %05u", geoCoord.getOSGRE100k(), geoCoord.getOSGRN100k(), snprintf(coordinateLine, sizeof(coordinateLine), "%1c%1c %05u %05u", geoCoord.getOSGRE100k(),
geoCoord.getOSGREasting(), geoCoord.getOSGRNorthing()); geoCoord.getOSGRN100k(), geoCoord.getOSGREasting(), geoCoord.getOSGRNorthing());
} }
// If fixed position, display text "Fixed GPS" alternating with the coordinates. // If fixed position, display text "Fixed GPS" alternating with the coordinates.
@@ -614,10 +614,10 @@ static void drawGPScoordinates(OLEDDisplay *display, int16_t x, int16_t y, const
} else { } else {
char latLine[22]; char latLine[22];
char lonLine[22]; char lonLine[22];
snprintf(latLine, sizeof(latLine), "%2i° %2i' %2u\" %1c", geoCoord.getDMSLatDeg(), geoCoord.getDMSLatMin(), geoCoord.getDMSLatSec(), snprintf(latLine, sizeof(latLine), "%2i° %2i' %2u\" %1c", geoCoord.getDMSLatDeg(), geoCoord.getDMSLatMin(),
geoCoord.getDMSLatCP()); geoCoord.getDMSLatSec(), geoCoord.getDMSLatCP());
snprintf(lonLine, sizeof(lonLine), "%3i° %2i' %2u\" %1c", geoCoord.getDMSLonDeg(), geoCoord.getDMSLonMin(), geoCoord.getDMSLonSec(), snprintf(lonLine, sizeof(lonLine), "%3i° %2i' %2u\" %1c", geoCoord.getDMSLonDeg(), geoCoord.getDMSLonMin(),
geoCoord.getDMSLonCP()); geoCoord.getDMSLonSec(), geoCoord.getDMSLonCP());
display->drawString(x + (SCREEN_WIDTH - (display->getStringWidth(latLine))) / 2, y - FONT_HEIGHT_SMALL * 1, latLine); display->drawString(x + (SCREEN_WIDTH - (display->getStringWidth(latLine))) / 2, y - FONT_HEIGHT_SMALL * 1, latLine);
display->drawString(x + (SCREEN_WIDTH - (display->getStringWidth(lonLine))) / 2, y, lonLine); display->drawString(x + (SCREEN_WIDTH - (display->getStringWidth(lonLine))) / 2, y, lonLine);
} }
@@ -653,8 +653,8 @@ class Point
void scale(float f) void scale(float f)
{ {
//We use -f here to counter the flip that happens // We use -f here to counter the flip that happens
//on the y axis when drawing and rotating on screen // on the y axis when drawing and rotating on screen
x *= f; x *= f;
y *= -f; y *= -f;
} }
@@ -713,7 +713,7 @@ static uint16_t getCompassDiam(OLEDDisplay *display)
offset = FONT_HEIGHT_SMALL; offset = FONT_HEIGHT_SMALL;
// get the smaller of the 2 dimensions and subtract 20 // get the smaller of the 2 dimensions and subtract 20
if(display->getWidth() > (display->getHeight() - offset)) { if (display->getWidth() > (display->getHeight() - offset)) {
diam = display->getHeight() - offset; diam = display->getHeight() - offset;
// if 2/3 of the other size would be smaller, use that // if 2/3 of the other size would be smaller, use that
if (diam > (display->getWidth() * 2 / 3)) { if (diam > (display->getWidth() * 2 / 3)) {
@@ -725,7 +725,7 @@ static uint16_t getCompassDiam(OLEDDisplay *display)
diam = (display->getHeight() - offset) * 2 / 3; diam = (display->getHeight() - offset) * 2 / 3;
} }
} }
return diam - 20; return diam - 20;
}; };
@@ -756,10 +756,10 @@ static void drawNodeHeading(OLEDDisplay *display, int16_t compassX, int16_t comp
// Draw north // Draw north
static void drawCompassNorth(OLEDDisplay *display, int16_t compassX, int16_t compassY, float myHeading) static void drawCompassNorth(OLEDDisplay *display, int16_t compassX, int16_t compassY, float myHeading)
{ {
//If north is supposed to be at the top of the compass we want rotation to be +0 // If north is supposed to be at the top of the compass we want rotation to be +0
if(config.display.compass_north_top) if (config.display.compass_north_top)
myHeading = -0; myHeading = -0;
Point N1(-0.04f, 0.65f), N2(0.04f, 0.65f); Point N1(-0.04f, 0.65f), N2(0.04f, 0.65f);
Point N3(-0.04f, 0.55f), N4(0.04f, 0.55f); Point N3(-0.04f, 0.55f), N4(0.04f, 0.55f);
Point *rosePoints[] = {&N1, &N2, &N3, &N4}; Point *rosePoints[] = {&N1, &N2, &N3, &N4};
@@ -874,7 +874,7 @@ static void drawNodeInfo(OLEDDisplay *display, OLEDDisplayUiState *state, int16_
GeoCoord::bearing(DegD(op.latitude_i), DegD(op.longitude_i), DegD(p.latitude_i), DegD(p.longitude_i)); GeoCoord::bearing(DegD(op.latitude_i), DegD(op.longitude_i), DegD(p.latitude_i), DegD(p.longitude_i));
// If the top of the compass is a static north then bearingToOther can be drawn on the compass directly // If the top of the compass is a static north then bearingToOther can be drawn on the compass directly
// If the top of the compass is not a static north we need adjust bearingToOther based on heading // If the top of the compass is not a static north we need adjust bearingToOther based on heading
if(!config.display.compass_north_top) if (!config.display.compass_north_top)
bearingToOther -= myHeading; bearingToOther -= myHeading;
drawNodeHeading(display, compassX, compassY, bearingToOther); drawNodeHeading(display, compassX, compassY, bearingToOther);
} }
@@ -1000,8 +1000,8 @@ void Screen::setup()
#ifdef SCREEN_MIRROR #ifdef SCREEN_MIRROR
dispdev.mirrorScreen(); dispdev.mirrorScreen();
#else #else
// Standard behaviour is to FLIP the screen (needed on T-Beam). If this config item is set, unflip it, and thereby logically flip it. // Standard behaviour is to FLIP the screen (needed on T-Beam). If this config item is set, unflip it, and thereby logically
// If you have a headache now, you're welcome. // flip it. If you have a headache now, you're welcome.
if (!config.display.flip_screen) { if (!config.display.flip_screen) {
dispdev.flipScreenVertically(); dispdev.flipScreenVertically();
} }
@@ -1071,7 +1071,7 @@ int32_t Screen::runOnce()
static const int bootOEMFrameCount = sizeof(bootOEMFrames) / sizeof(bootOEMFrames[0]); static const int bootOEMFrameCount = sizeof(bootOEMFrames) / sizeof(bootOEMFrames[0]);
ui.setFrames(bootOEMFrames, bootOEMFrameCount); ui.setFrames(bootOEMFrames, bootOEMFrameCount);
ui.update(); ui.update();
#ifndef USE_EINK #ifndef USE_EINK
ui.update(); ui.update();
#endif #endif
showingOEMBootScreen = false; showingOEMBootScreen = false;
@@ -1414,7 +1414,7 @@ void DebugInfo::drawFrame(OLEDDisplay *display, OLEDDisplayUiState *state, int16
// Display power status // Display power status
if (powerStatus->getHasBattery()) { if (powerStatus->getHasBattery()) {
if (config.display.displaymode == Config_DisplayConfig_DisplayMode_DEFAULT) { if (config.display.displaymode == Config_DisplayConfig_DisplayMode_DEFAULT) {
drawBattery(display, x , y + 2, imgBattery, powerStatus); drawBattery(display, x, y + 2, imgBattery, powerStatus);
} else { } else {
drawBattery(display, x + 1, y + 3, imgBattery, powerStatus); drawBattery(display, x + 1, y + 3, imgBattery, powerStatus);
} }
@@ -1432,7 +1432,7 @@ void DebugInfo::drawFrame(OLEDDisplay *display, OLEDDisplayUiState *state, int16
drawNodes(display, x + (SCREEN_WIDTH * 0.25), y + 3, nodeStatus); drawNodes(display, x + (SCREEN_WIDTH * 0.25), y + 3, nodeStatus);
} }
// Display GPS status // Display GPS status
if (!config.position.gps_enabled){ if (!config.position.gps_enabled) {
int16_t yPos = y + 2; int16_t yPos = y + 2;
#ifdef GPS_POWER_TOGGLE #ifdef GPS_POWER_TOGGLE
yPos = (y + 10 + FONT_HEIGHT_SMALL); yPos = (y + 10 + FONT_HEIGHT_SMALL);
@@ -1451,27 +1451,36 @@ void DebugInfo::drawFrame(OLEDDisplay *display, OLEDDisplayUiState *state, int16
display->drawString(x, y + FONT_HEIGHT_SMALL, channelStr); display->drawString(x, y + FONT_HEIGHT_SMALL, channelStr);
// Draw our hardware ID to assist with bluetooth pairing. Either prefix with Info or S&F Logo // Draw our hardware ID to assist with bluetooth pairing. Either prefix with Info or S&F Logo
if (moduleConfig.store_forward.enabled) { if (moduleConfig.store_forward.enabled) {
#ifdef ARCH_ESP32 #ifdef ARCH_ESP32
if (millis() - storeForwardModule->lastHeartbeat > (storeForwardModule->heartbeatInterval * 1200)) { //no heartbeat, overlap a bit if (millis() - storeForwardModule->lastHeartbeat >
(storeForwardModule->heartbeatInterval * 1200)) { // no heartbeat, overlap a bit
#if defined(USE_EINK) || defined(ILI9341_DRIVER) || defined(ST7735_CS) #if defined(USE_EINK) || defined(ILI9341_DRIVER) || defined(ST7735_CS)
display->drawFastImage(x + SCREEN_WIDTH - 14 - display->getStringWidth(ourId), y + 3 + FONT_HEIGHT_SMALL, 12, 8, imgQuestionL1); display->drawFastImage(x + SCREEN_WIDTH - 14 - display->getStringWidth(ourId), y + 3 + FONT_HEIGHT_SMALL, 12, 8,
display->drawFastImage(x + SCREEN_WIDTH - 14 - display->getStringWidth(ourId), y + 11 + FONT_HEIGHT_SMALL, 12, 8, imgQuestionL2); imgQuestionL1);
display->drawFastImage(x + SCREEN_WIDTH - 14 - display->getStringWidth(ourId), y + 11 + FONT_HEIGHT_SMALL, 12, 8,
imgQuestionL2);
#else #else
display->drawFastImage(x + SCREEN_WIDTH - 10 - display->getStringWidth(ourId), y + 2 + FONT_HEIGHT_SMALL, 8, 8, imgQuestion); display->drawFastImage(x + SCREEN_WIDTH - 10 - display->getStringWidth(ourId), y + 2 + FONT_HEIGHT_SMALL, 8, 8,
imgQuestion);
#endif #endif
} else { } else {
#if defined(USE_EINK) || defined(ILI9341_DRIVER) || defined(ST7735_CS) #if defined(USE_EINK) || defined(ILI9341_DRIVER) || defined(ST7735_CS)
display->drawFastImage(x + SCREEN_WIDTH - 18 - display->getStringWidth(ourId), y + 3 + FONT_HEIGHT_SMALL, 16, 8, imgSFL1); display->drawFastImage(x + SCREEN_WIDTH - 18 - display->getStringWidth(ourId), y + 3 + FONT_HEIGHT_SMALL, 16, 8,
display->drawFastImage(x + SCREEN_WIDTH - 18 - display->getStringWidth(ourId), y + 11 + FONT_HEIGHT_SMALL, 16, 8, imgSFL2); imgSFL1);
display->drawFastImage(x + SCREEN_WIDTH - 18 - display->getStringWidth(ourId), y + 11 + FONT_HEIGHT_SMALL, 16, 8,
imgSFL2);
#else #else
display->drawFastImage(x + SCREEN_WIDTH - 13 - display->getStringWidth(ourId), y + 2 + FONT_HEIGHT_SMALL, 11, 8, imgSF); display->drawFastImage(x + SCREEN_WIDTH - 13 - display->getStringWidth(ourId), y + 2 + FONT_HEIGHT_SMALL, 11, 8,
imgSF);
#endif #endif
} }
#endif #endif
} else { } else {
#if defined(USE_EINK) || defined(ILI9341_DRIVER) || defined(ST7735_CS) #if defined(USE_EINK) || defined(ILI9341_DRIVER) || defined(ST7735_CS)
display->drawFastImage(x + SCREEN_WIDTH - 14 - display->getStringWidth(ourId), y + 3 + FONT_HEIGHT_SMALL, 12, 8, imgInfoL1); display->drawFastImage(x + SCREEN_WIDTH - 14 - display->getStringWidth(ourId), y + 3 + FONT_HEIGHT_SMALL, 12, 8,
display->drawFastImage(x + SCREEN_WIDTH - 14 - display->getStringWidth(ourId), y + 11 + FONT_HEIGHT_SMALL, 12, 8, imgInfoL2); imgInfoL1);
display->drawFastImage(x + SCREEN_WIDTH - 14 - display->getStringWidth(ourId), y + 11 + FONT_HEIGHT_SMALL, 12, 8,
imgInfoL2);
#else #else
display->drawFastImage(x + SCREEN_WIDTH - 10 - display->getStringWidth(ourId), y + 2 + FONT_HEIGHT_SMALL, 8, 8, imgInfo); display->drawFastImage(x + SCREEN_WIDTH - 10 - display->getStringWidth(ourId), y + 2 + FONT_HEIGHT_SMALL, 8, 8, imgInfo);
#endif #endif
@@ -1510,16 +1519,16 @@ void DebugInfo::drawFrameWiFi(OLEDDisplay *display, OLEDDisplayUiState *state, i
if (WiFi.status() != WL_CONNECTED) { if (WiFi.status() != WL_CONNECTED) {
display->drawString(x, y, String("WiFi: Not Connected")); display->drawString(x, y, String("WiFi: Not Connected"));
if(config.display.heading_bold) if (config.display.heading_bold)
display->drawString(x + 1, y, String("WiFi: Not Connected")); display->drawString(x + 1, y, String("WiFi: Not Connected"));
} else { } else {
display->drawString(x, y, String("WiFi: Connected")); display->drawString(x, y, String("WiFi: Connected"));
if(config.display.heading_bold) if (config.display.heading_bold)
display->drawString(x + 1, y, String("WiFi: Connected")); display->drawString(x + 1, y, String("WiFi: Connected"));
display->drawString(x + SCREEN_WIDTH - display->getStringWidth("RSSI " + String(WiFi.RSSI())), y, display->drawString(x + SCREEN_WIDTH - display->getStringWidth("RSSI " + String(WiFi.RSSI())), y,
"RSSI " + String(WiFi.RSSI())); "RSSI " + String(WiFi.RSSI()));
if(config.display.heading_bold) { if (config.display.heading_bold) {
display->drawString(x + SCREEN_WIDTH - display->getStringWidth("RSSI " + String(WiFi.RSSI())) - 1, y, display->drawString(x + SCREEN_WIDTH - display->getStringWidth("RSSI " + String(WiFi.RSSI())) - 1, y,
"RSSI " + String(WiFi.RSSI())); "RSSI " + String(WiFi.RSSI()));
} }
@@ -1650,12 +1659,12 @@ void DebugInfo::drawFrameSettings(OLEDDisplay *display, OLEDDisplayUiState *stat
// Line 1 // Line 1
display->drawString(x, y, batStr); display->drawString(x, y, batStr);
if(config.display.heading_bold) if (config.display.heading_bold)
display->drawString(x + 1, y, batStr); display->drawString(x + 1, y, batStr);
} else { } else {
// Line 1 // Line 1
display->drawString(x, y, String("USB")); display->drawString(x, y, String("USB"));
if(config.display.heading_bold) if (config.display.heading_bold)
display->drawString(x + 1, y, String("USB")); display->drawString(x + 1, y, String("USB"));
} }
@@ -1689,7 +1698,7 @@ void DebugInfo::drawFrameSettings(OLEDDisplay *display, OLEDDisplayUiState *stat
} }
display->drawString(x + SCREEN_WIDTH - display->getStringWidth(mode), y, mode); display->drawString(x + SCREEN_WIDTH - display->getStringWidth(mode), y, mode);
if(config.display.heading_bold) if (config.display.heading_bold)
display->drawString(x + SCREEN_WIDTH - display->getStringWidth(mode) - 1, y, mode); display->drawString(x + SCREEN_WIDTH - display->getStringWidth(mode) - 1, y, mode);
// Line 2 // Line 2
@@ -1740,17 +1749,16 @@ void DebugInfo::drawFrameSettings(OLEDDisplay *display, OLEDDisplayUiState *stat
char chUtil[13]; char chUtil[13];
snprintf(chUtil, sizeof(chUtil), "ChUtil %2.0f%%", airTime->channelUtilizationPercent()); snprintf(chUtil, sizeof(chUtil), "ChUtil %2.0f%%", airTime->channelUtilizationPercent());
display->drawString(x + SCREEN_WIDTH - display->getStringWidth(chUtil), y + FONT_HEIGHT_SMALL * 1, chUtil); display->drawString(x + SCREEN_WIDTH - display->getStringWidth(chUtil), y + FONT_HEIGHT_SMALL * 1, chUtil);
if (config.position.gps_enabled) { if (config.position.gps_enabled) {
// Line 3 // Line 3
if (config.display.gps_format != if (config.display.gps_format != Config_DisplayConfig_GpsCoordinateFormat_DMS) // if DMS then don't draw altitude
Config_DisplayConfig_GpsCoordinateFormat_DMS) // if DMS then don't draw altitude drawGPSAltitude(display, x, y + FONT_HEIGHT_SMALL * 2, gpsStatus);
drawGPSAltitude(display, x, y + FONT_HEIGHT_SMALL * 2, gpsStatus);
// Line 4 // Line 4
drawGPScoordinates(display, x, y + FONT_HEIGHT_SMALL * 3, gpsStatus); drawGPScoordinates(display, x, y + FONT_HEIGHT_SMALL * 3, gpsStatus);
} else { } else {
drawGPSpowerstat(display, x - (SCREEN_WIDTH / 4), y + FONT_HEIGHT_SMALL * 2, gpsStatus); drawGPSpowerstat(display, x - (SCREEN_WIDTH / 4), y + FONT_HEIGHT_SMALL * 2, gpsStatus);
} }
/* Display a heartbeat pixel that blinks every time the frame is redrawn */ /* Display a heartbeat pixel that blinks every time the frame is redrawn */
#ifdef SHOW_REDRAWS #ifdef SHOW_REDRAWS
if (heartbeat) if (heartbeat)
+2 -2
View File
@@ -1,11 +1,11 @@
#pragma once #pragma once
#include <map>
#include "GPSStatus.h" #include "GPSStatus.h"
#include "NodeStatus.h" #include "NodeStatus.h"
#include "PowerStatus.h" #include "PowerStatus.h"
#include "graphics/Screen.h" #include "graphics/Screen.h"
#include "mesh/generated/telemetry.pb.h" #include "mesh/generated/meshtastic/telemetry.pb.h"
#include <map>
#if !defined(ARCH_PORTDUINO) && !defined(ARCH_STM32WL) #if !defined(ARCH_PORTDUINO) && !defined(ARCH_STM32WL)
#include <SparkFun_ATECCX08a_Arduino_Library.h> #include <SparkFun_ATECCX08a_Arduino_Library.h>
#endif #endif
+20 -2
View File
@@ -6,6 +6,7 @@
#include "PowerFSM.h" #include "PowerFSM.h"
#include "RadioInterface.h" #include "RadioInterface.h"
#include "configuration.h" #include "configuration.h"
#include "xmodem.h"
#if FromRadio_size > MAX_TO_FROM_RADIO_SIZE #if FromRadio_size > MAX_TO_FROM_RADIO_SIZE
#error FromRadio is too big #error FromRadio is too big
@@ -31,6 +32,7 @@ void PhoneAPI::handleStartConfig()
if (!isConnected()) { if (!isConnected()) {
onConnectionChanged(true); onConnectionChanged(true);
observe(&service.fromNumChanged); observe(&service.fromNumChanged);
observe(&xModem.packetReady);
} }
// even if we were already connected - restart our state machine // even if we were already connected - restart our state machine
@@ -48,6 +50,7 @@ void PhoneAPI::close()
state = STATE_SEND_NOTHING; state = STATE_SEND_NOTHING;
unobserve(&service.fromNumChanged); unobserve(&service.fromNumChanged);
unobserve(&xModem.packetReady);
releasePhonePacket(); // Don't leak phone packets on shutdown releasePhonePacket(); // Don't leak phone packets on shutdown
releaseQueueStatusPhonePacket(); releaseQueueStatusPhonePacket();
@@ -90,6 +93,10 @@ bool PhoneAPI::handleToRadio(const uint8_t *buf, size_t bufLength)
LOG_INFO("Disconnecting from phone\n"); LOG_INFO("Disconnecting from phone\n");
close(); close();
break; break;
case ToRadio_xmodemPacket_tag:
LOG_INFO("Got xmodem packet\n");
xModem.handlePacket(toRadioScratch.xmodemPacket);
break;
default: default:
// Ignore nop messages // Ignore nop messages
// LOG_DEBUG("Error: unexpected ToRadio variant\n"); // LOG_DEBUG("Error: unexpected ToRadio variant\n");
@@ -150,7 +157,7 @@ size_t PhoneAPI::getFromRadio(uint8_t *buf)
if (info) { if (info) {
LOG_INFO("Sending nodeinfo: num=0x%x, lastseen=%u, id=%s, name=%s\n", info->num, info->last_heard, info->user.id, LOG_INFO("Sending nodeinfo: num=0x%x, lastseen=%u, id=%s, name=%s\n", info->num, info->last_heard, info->user.id,
info->user.long_name); info->user.long_name);
fromRadioScratch.which_payload_variant = FromRadio_node_info_tag; fromRadioScratch.which_payload_variant = FromRadio_node_info_tag;
fromRadioScratch.node_info = *info; fromRadioScratch.node_info = *info;
// Stay in current state until done sending nodeinfos // Stay in current state until done sending nodeinfos
@@ -287,10 +294,14 @@ size_t PhoneAPI::getFromRadio(uint8_t *buf)
// Do we have a message from the mesh? // Do we have a message from the mesh?
LOG_INFO("getFromRadio=STATE_SEND_PACKETS\n"); LOG_INFO("getFromRadio=STATE_SEND_PACKETS\n");
if (queueStatusPacketForPhone) { if (queueStatusPacketForPhone) {
fromRadioScratch.which_payload_variant = FromRadio_queueStatus_tag; fromRadioScratch.which_payload_variant = FromRadio_queueStatus_tag;
fromRadioScratch.queueStatus = *queueStatusPacketForPhone; fromRadioScratch.queueStatus = *queueStatusPacketForPhone;
releaseQueueStatusPhonePacket(); releaseQueueStatusPhonePacket();
} else if (xmodemPacketForPhone) {
fromRadioScratch.which_payload_variant = FromRadio_xmodemPacket_tag;
fromRadioScratch.xmodemPacket = *xmodemPacketForPhone;
free(xmodemPacketForPhone);
xmodemPacketForPhone = NULL;
} else if (packetForPhone) { } else if (packetForPhone) {
printPacket("phone downloaded packet", packetForPhone); printPacket("phone downloaded packet", packetForPhone);
@@ -353,6 +364,7 @@ bool PhoneAPI::available()
case STATE_SEND_MODULECONFIG: case STATE_SEND_MODULECONFIG:
case STATE_SEND_COMPLETE_ID: case STATE_SEND_COMPLETE_ID:
return true; return true;
case STATE_SEND_NODEINFO: case STATE_SEND_NODEINFO:
if (!nodeInfoForPhone) if (!nodeInfoForPhone)
nodeInfoForPhone = nodeDB.readNextInfo(); nodeInfoForPhone = nodeDB.readNextInfo();
@@ -365,6 +377,12 @@ bool PhoneAPI::available()
if (hasPacket) if (hasPacket)
return true; return true;
if (!xmodemPacketForPhone)
xmodemPacketForPhone = xModem.getForPhone();
hasPacket = !!packetForPhone;
if (hasPacket)
return true;
if (!packetForPhone) if (!packetForPhone)
packetForPhone = service.getForPhone(); packetForPhone = service.getForPhone();
hasPacket = !!packetForPhone; hasPacket = !!packetForPhone;
+12 -8
View File
@@ -16,14 +16,15 @@
* Eventually there should be once instance of this class for each live connection (because it has a bit of state * Eventually there should be once instance of this class for each live connection (because it has a bit of state
* for that connection) * for that connection)
*/ */
class PhoneAPI : public Observer<uint32_t> // FIXME, we shouldn't be inheriting from Observer, instead use CallbackObserver as a member class PhoneAPI
: public Observer<uint32_t> // FIXME, we shouldn't be inheriting from Observer, instead use CallbackObserver as a member
{ {
enum State { enum State {
STATE_SEND_NOTHING, // Initial state, don't send anything until the client starts asking for config STATE_SEND_NOTHING, // Initial state, don't send anything until the client starts asking for config
STATE_SEND_MY_INFO, // send our my info record STATE_SEND_MY_INFO, // send our my info record
STATE_SEND_NODEINFO, // states progress in this order as the device sends to to the client STATE_SEND_NODEINFO, // states progress in this order as the device sends to to the client
STATE_SEND_CHANNELS, // Send all channels STATE_SEND_CHANNELS, // Send all channels
STATE_SEND_CONFIG, // Replacement for the old Radioconfig STATE_SEND_CONFIG, // Replacement for the old Radioconfig
STATE_SEND_MODULECONFIG, // Send Module specific config STATE_SEND_MODULECONFIG, // Send Module specific config
STATE_SEND_COMPLETE_ID, STATE_SEND_COMPLETE_ID,
STATE_SEND_PACKETS // send packets or debug strings STATE_SEND_PACKETS // send packets or debug strings
@@ -42,6 +43,9 @@ class PhoneAPI : public Observer<uint32_t> // FIXME, we shouldn't be inheriting
/// downloads it /// downloads it
MeshPacket *packetForPhone = NULL; MeshPacket *packetForPhone = NULL;
// file transfer packets destined for phone. Push it to the queue then free it.
XModem *xmodemPacketForPhone = NULL;
// Keep QueueStatus packet just as packetForPhone // Keep QueueStatus packet just as packetForPhone
QueueStatus *queueStatusPacketForPhone = NULL; QueueStatus *queueStatusPacketForPhone = NULL;
@@ -62,7 +66,7 @@ class PhoneAPI : public Observer<uint32_t> // FIXME, we shouldn't be inheriting
// Call this when the client drops the connection, resets the state to STATE_SEND_NOTHING // Call this when the client drops the connection, resets the state to STATE_SEND_NOTHING
// Unregisters our observer. A closed connection **can** be reopened by calling init again. // Unregisters our observer. A closed connection **can** be reopened by calling init again.
virtual void close(); virtual void close();
/** /**
* Handle a ToRadio protobuf * Handle a ToRadio protobuf
* @return true true if a packet was queued for sending (so that caller can yield) * @return true true if a packet was queued for sending (so that caller can yield)
@@ -92,7 +96,7 @@ class PhoneAPI : public Observer<uint32_t> // FIXME, we shouldn't be inheriting
/** the last msec we heard from the client on the other side of this link */ /** the last msec we heard from the client on the other side of this link */
uint32_t lastContactMsec = 0; uint32_t lastContactMsec = 0;
/// Hookable to find out when connection changes /// Hookable to find out when connection changes
virtual void onConnectionChanged(bool connected) {} virtual void onConnectionChanged(bool connected) {}
+2
View File
@@ -0,0 +1,2 @@
DisableFormat: true
SortIncludes: false
@@ -1,7 +1,7 @@
/* Automatically generated nanopb constant definitions */ /* Automatically generated nanopb constant definitions */
/* Generated by nanopb-0.4.7 */ /* Generated by nanopb-0.4.7 */
#include "admin.pb.h" #include "./admin.pb.h"
#if PB_PROTO_HEADER_VERSION != 40 #if PB_PROTO_HEADER_VERSION != 40
#error Regenerate this file with the current version of nanopb generator. #error Regenerate this file with the current version of nanopb generator.
#endif #endif
@@ -1,14 +1,14 @@
/* Automatically generated nanopb header */ /* Automatically generated nanopb header */
/* Generated by nanopb-0.4.7 */ /* Generated by nanopb-0.4.7 */
#ifndef PB_ADMIN_PB_H_INCLUDED #ifndef PB_MESHTASTIC_MESHTASTIC_ADMIN_PB_H_INCLUDED
#define PB_ADMIN_PB_H_INCLUDED #define PB_MESHTASTIC_MESHTASTIC_ADMIN_PB_H_INCLUDED
#include <pb.h> #include <pb.h>
#include "channel.pb.h" #include "./channel.pb.h"
#include "config.pb.h" #include "./config.pb.h"
#include "device_metadata.pb.h" #include "./device_metadata.pb.h"
#include "mesh.pb.h" #include "./mesh.pb.h"
#include "module_config.pb.h" #include "./module_config.pb.h"
#if PB_PROTO_HEADER_VERSION != 40 #if PB_PROTO_HEADER_VERSION != 40
#error Regenerate this file with the current version of nanopb generator. #error Regenerate this file with the current version of nanopb generator.
@@ -155,40 +155,40 @@ extern "C" {
/* Initializer values for message structs */ /* Initializer values for message structs */
#define AdminMessage_init_default {0, {0}} #define AdminMessage_init_default {0, {0}}
#define AdminMessage_init_zero {0, {0}} #define AdminMessage_init_zero {0, {0}}
/* Field tags (for use in manual encoding/decoding) */ /* Field tags (for use in manual encoding/decoding) */
#define AdminMessage_get_channel_request_tag 1 #define AdminMessage_get_channel_request_tag 1
#define AdminMessage_get_channel_response_tag 2 #define AdminMessage_get_channel_response_tag 2
#define AdminMessage_get_owner_request_tag 3 #define AdminMessage_get_owner_request_tag 3
#define AdminMessage_get_owner_response_tag 4 #define AdminMessage_get_owner_response_tag 4
#define AdminMessage_get_config_request_tag 5 #define AdminMessage_get_config_request_tag 5
#define AdminMessage_get_config_response_tag 6 #define AdminMessage_get_config_response_tag 6
#define AdminMessage_get_module_config_request_tag 7 #define AdminMessage_get_module_config_request_tag 7
#define AdminMessage_get_module_config_response_tag 8 #define AdminMessage_get_module_config_response_tag 8
#define AdminMessage_get_canned_message_module_messages_request_tag 10 #define AdminMessage_get_canned_message_module_messages_request_tag 10
#define AdminMessage_get_canned_message_module_messages_response_tag 11 #define AdminMessage_get_canned_message_module_messages_response_tag 11
#define AdminMessage_get_device_metadata_request_tag 12 #define AdminMessage_get_device_metadata_request_tag 12
#define AdminMessage_get_device_metadata_response_tag 13 #define AdminMessage_get_device_metadata_response_tag 13
#define AdminMessage_get_ringtone_request_tag 14 #define AdminMessage_get_ringtone_request_tag 14
#define AdminMessage_get_ringtone_response_tag 15 #define AdminMessage_get_ringtone_response_tag 15
#define AdminMessage_set_owner_tag 32 #define AdminMessage_set_owner_tag 32
#define AdminMessage_set_channel_tag 33 #define AdminMessage_set_channel_tag 33
#define AdminMessage_set_config_tag 34 #define AdminMessage_set_config_tag 34
#define AdminMessage_set_module_config_tag 35 #define AdminMessage_set_module_config_tag 35
#define AdminMessage_set_canned_message_module_messages_tag 36 #define AdminMessage_set_canned_message_module_messages_tag 36
#define AdminMessage_set_ringtone_message_tag 37 #define AdminMessage_set_ringtone_message_tag 37
#define AdminMessage_begin_edit_settings_tag 64 #define AdminMessage_begin_edit_settings_tag 64
#define AdminMessage_commit_edit_settings_tag 65 #define AdminMessage_commit_edit_settings_tag 65
#define AdminMessage_confirm_set_channel_tag 66 #define AdminMessage_confirm_set_channel_tag 66
#define AdminMessage_confirm_set_radio_tag 67 #define AdminMessage_confirm_set_radio_tag 67
#define AdminMessage_reboot_ota_seconds_tag 95 #define AdminMessage_reboot_ota_seconds_tag 95
#define AdminMessage_exit_simulator_tag 96 #define AdminMessage_exit_simulator_tag 96
#define AdminMessage_reboot_seconds_tag 97 #define AdminMessage_reboot_seconds_tag 97
#define AdminMessage_shutdown_seconds_tag 98 #define AdminMessage_shutdown_seconds_tag 98
#define AdminMessage_factory_reset_tag 99 #define AdminMessage_factory_reset_tag 99
#define AdminMessage_nodedb_reset_tag 100 #define AdminMessage_nodedb_reset_tag 100
/* Struct field encoding specification for nanopb */ /* Struct field encoding specification for nanopb */
#define AdminMessage_FIELDLIST(X, a) \ #define AdminMessage_FIELDLIST(X, a) \
@@ -240,7 +240,7 @@ extern const pb_msgdesc_t AdminMessage_msg;
#define AdminMessage_fields &AdminMessage_msg #define AdminMessage_fields &AdminMessage_msg
/* Maximum encoded size of messages (where known) */ /* Maximum encoded size of messages (where known) */
#define AdminMessage_size 234 #define AdminMessage_size 234
#ifdef __cplusplus #ifdef __cplusplus
} /* extern "C" */ } /* extern "C" */
@@ -1,7 +1,7 @@
/* Automatically generated nanopb constant definitions */ /* Automatically generated nanopb constant definitions */
/* Generated by nanopb-0.4.7 */ /* Generated by nanopb-0.4.7 */
#include "apponly.pb.h" #include "./apponly.pb.h"
#if PB_PROTO_HEADER_VERSION != 40 #if PB_PROTO_HEADER_VERSION != 40
#error Regenerate this file with the current version of nanopb generator. #error Regenerate this file with the current version of nanopb generator.
#endif #endif
@@ -1,11 +1,11 @@
/* Automatically generated nanopb header */ /* Automatically generated nanopb header */
/* Generated by nanopb-0.4.7 */ /* Generated by nanopb-0.4.7 */
#ifndef PB_APPONLY_PB_H_INCLUDED #ifndef PB_MESHTASTIC_MESHTASTIC_APPONLY_PB_H_INCLUDED
#define PB_APPONLY_PB_H_INCLUDED #define PB_MESHTASTIC_MESHTASTIC_APPONLY_PB_H_INCLUDED
#include <pb.h> #include <pb.h>
#include "channel.pb.h" #include "./channel.pb.h"
#include "config.pb.h" #include "./config.pb.h"
#if PB_PROTO_HEADER_VERSION != 40 #if PB_PROTO_HEADER_VERSION != 40
#error Regenerate this file with the current version of nanopb generator. #error Regenerate this file with the current version of nanopb generator.
@@ -32,12 +32,12 @@ extern "C" {
#endif #endif
/* Initializer values for message structs */ /* Initializer values for message structs */
#define ChannelSet_init_default {0, {ChannelSettings_init_default, ChannelSettings_init_default, ChannelSettings_init_default, ChannelSettings_init_default, ChannelSettings_init_default, ChannelSettings_init_default, ChannelSettings_init_default, ChannelSettings_init_default}, false, Config_LoRaConfig_init_default} #define ChannelSet_init_default {0, {ChannelSettings_init_default, ChannelSettings_init_default, ChannelSettings_init_default, ChannelSettings_init_default, ChannelSettings_init_default, ChannelSettings_init_default, ChannelSettings_init_default, ChannelSettings_init_default}, false, Config_LoRaConfig_init_default}
#define ChannelSet_init_zero {0, {ChannelSettings_init_zero, ChannelSettings_init_zero, ChannelSettings_init_zero, ChannelSettings_init_zero, ChannelSettings_init_zero, ChannelSettings_init_zero, ChannelSettings_init_zero, ChannelSettings_init_zero}, false, Config_LoRaConfig_init_zero} #define ChannelSet_init_zero {0, {ChannelSettings_init_zero, ChannelSettings_init_zero, ChannelSettings_init_zero, ChannelSettings_init_zero, ChannelSettings_init_zero, ChannelSettings_init_zero, ChannelSettings_init_zero, ChannelSettings_init_zero}, false, Config_LoRaConfig_init_zero}
/* Field tags (for use in manual encoding/decoding) */ /* Field tags (for use in manual encoding/decoding) */
#define ChannelSet_settings_tag 1 #define ChannelSet_settings_tag 1
#define ChannelSet_lora_config_tag 2 #define ChannelSet_lora_config_tag 2
/* Struct field encoding specification for nanopb */ /* Struct field encoding specification for nanopb */
#define ChannelSet_FIELDLIST(X, a) \ #define ChannelSet_FIELDLIST(X, a) \
@@ -54,7 +54,7 @@ extern const pb_msgdesc_t ChannelSet_msg;
#define ChannelSet_fields &ChannelSet_msg #define ChannelSet_fields &ChannelSet_msg
/* Maximum encoded size of messages (where known) */ /* Maximum encoded size of messages (where known) */
#define ChannelSet_size 584 #define ChannelSet_size 584
#ifdef __cplusplus #ifdef __cplusplus
} /* extern "C" */ } /* extern "C" */
@@ -1,7 +1,7 @@
/* Automatically generated nanopb constant definitions */ /* Automatically generated nanopb constant definitions */
/* Generated by nanopb-0.4.7 */ /* Generated by nanopb-0.4.7 */
#include "cannedmessages.pb.h" #include "./cannedmessages.pb.h"
#if PB_PROTO_HEADER_VERSION != 40 #if PB_PROTO_HEADER_VERSION != 40
#error Regenerate this file with the current version of nanopb generator. #error Regenerate this file with the current version of nanopb generator.
#endif #endif
@@ -1,8 +1,8 @@
/* Automatically generated nanopb header */ /* Automatically generated nanopb header */
/* Generated by nanopb-0.4.7 */ /* Generated by nanopb-0.4.7 */
#ifndef PB_CANNEDMESSAGES_PB_H_INCLUDED #ifndef PB_MESHTASTIC_MESHTASTIC_CANNEDMESSAGES_PB_H_INCLUDED
#define PB_CANNEDMESSAGES_PB_H_INCLUDED #define PB_MESHTASTIC_MESHTASTIC_CANNEDMESSAGES_PB_H_INCLUDED
#include <pb.h> #include <pb.h>
#if PB_PROTO_HEADER_VERSION != 40 #if PB_PROTO_HEADER_VERSION != 40
@@ -22,11 +22,11 @@ extern "C" {
#endif #endif
/* Initializer values for message structs */ /* Initializer values for message structs */
#define CannedMessageModuleConfig_init_default {""} #define CannedMessageModuleConfig_init_default {""}
#define CannedMessageModuleConfig_init_zero {""} #define CannedMessageModuleConfig_init_zero {""}
/* Field tags (for use in manual encoding/decoding) */ /* Field tags (for use in manual encoding/decoding) */
#define CannedMessageModuleConfig_messages_tag 1 #define CannedMessageModuleConfig_messages_tag 1
/* Struct field encoding specification for nanopb */ /* Struct field encoding specification for nanopb */
#define CannedMessageModuleConfig_FIELDLIST(X, a) \ #define CannedMessageModuleConfig_FIELDLIST(X, a) \
@@ -40,7 +40,7 @@ extern const pb_msgdesc_t CannedMessageModuleConfig_msg;
#define CannedMessageModuleConfig_fields &CannedMessageModuleConfig_msg #define CannedMessageModuleConfig_fields &CannedMessageModuleConfig_msg
/* Maximum encoded size of messages (where known) */ /* Maximum encoded size of messages (where known) */
#define CannedMessageModuleConfig_size 203 #define CannedMessageModuleConfig_size 203
#ifdef __cplusplus #ifdef __cplusplus
} /* extern "C" */ } /* extern "C" */
@@ -1,7 +1,7 @@
/* Automatically generated nanopb constant definitions */ /* Automatically generated nanopb constant definitions */
/* Generated by nanopb-0.4.7 */ /* Generated by nanopb-0.4.7 */
#include "channel.pb.h" #include "./channel.pb.h"
#if PB_PROTO_HEADER_VERSION != 40 #if PB_PROTO_HEADER_VERSION != 40
#error Regenerate this file with the current version of nanopb generator. #error Regenerate this file with the current version of nanopb generator.
#endif #endif
@@ -1,8 +1,8 @@
/* Automatically generated nanopb header */ /* Automatically generated nanopb header */
/* Generated by nanopb-0.4.7 */ /* Generated by nanopb-0.4.7 */
#ifndef PB_CHANNEL_PB_H_INCLUDED #ifndef PB_MESHTASTIC_MESHTASTIC_CHANNEL_PB_H_INCLUDED
#define PB_CHANNEL_PB_H_INCLUDED #define PB_MESHTASTIC_MESHTASTIC_CHANNEL_PB_H_INCLUDED
#include <pb.h> #include <pb.h>
#if PB_PROTO_HEADER_VERSION != 40 #if PB_PROTO_HEADER_VERSION != 40
@@ -119,21 +119,21 @@ extern "C" {
/* Initializer values for message structs */ /* Initializer values for message structs */
#define ChannelSettings_init_default {0, {0, {0}}, "", 0, 0, 0} #define ChannelSettings_init_default {0, {0, {0}}, "", 0, 0, 0}
#define Channel_init_default {0, false, ChannelSettings_init_default, _Channel_Role_MIN} #define Channel_init_default {0, false, ChannelSettings_init_default, _Channel_Role_MIN}
#define ChannelSettings_init_zero {0, {0, {0}}, "", 0, 0, 0} #define ChannelSettings_init_zero {0, {0, {0}}, "", 0, 0, 0}
#define Channel_init_zero {0, false, ChannelSettings_init_zero, _Channel_Role_MIN} #define Channel_init_zero {0, false, ChannelSettings_init_zero, _Channel_Role_MIN}
/* Field tags (for use in manual encoding/decoding) */ /* Field tags (for use in manual encoding/decoding) */
#define ChannelSettings_channel_num_tag 1 #define ChannelSettings_channel_num_tag 1
#define ChannelSettings_psk_tag 2 #define ChannelSettings_psk_tag 2
#define ChannelSettings_name_tag 3 #define ChannelSettings_name_tag 3
#define ChannelSettings_id_tag 4 #define ChannelSettings_id_tag 4
#define ChannelSettings_uplink_enabled_tag 5 #define ChannelSettings_uplink_enabled_tag 5
#define ChannelSettings_downlink_enabled_tag 6 #define ChannelSettings_downlink_enabled_tag 6
#define Channel_index_tag 1 #define Channel_index_tag 1
#define Channel_settings_tag 2 #define Channel_settings_tag 2
#define Channel_role_tag 3 #define Channel_role_tag 3
/* Struct field encoding specification for nanopb */ /* Struct field encoding specification for nanopb */
#define ChannelSettings_FIELDLIST(X, a) \ #define ChannelSettings_FIELDLIST(X, a) \
@@ -162,8 +162,8 @@ extern const pb_msgdesc_t Channel_msg;
#define Channel_fields &Channel_msg #define Channel_fields &Channel_msg
/* Maximum encoded size of messages (where known) */ /* Maximum encoded size of messages (where known) */
#define ChannelSettings_size 62 #define ChannelSettings_size 62
#define Channel_size 77 #define Channel_size 77
#ifdef __cplusplus #ifdef __cplusplus
} /* extern "C" */ } /* extern "C" */
@@ -1,7 +1,7 @@
/* Automatically generated nanopb constant definitions */ /* Automatically generated nanopb constant definitions */
/* Generated by nanopb-0.4.7 */ /* Generated by nanopb-0.4.7 */
#include "config.pb.h" #include "./config.pb.h"
#if PB_PROTO_HEADER_VERSION != 40 #if PB_PROTO_HEADER_VERSION != 40
#error Regenerate this file with the current version of nanopb generator. #error Regenerate this file with the current version of nanopb generator.
#endif #endif
@@ -1,8 +1,8 @@
/* Automatically generated nanopb header */ /* Automatically generated nanopb header */
/* Generated by nanopb-0.4.7 */ /* Generated by nanopb-0.4.7 */
#ifndef PB_CONFIG_PB_H_INCLUDED #ifndef PB_MESHTASTIC_MESHTASTIC_CONFIG_PB_H_INCLUDED
#define PB_CONFIG_PB_H_INCLUDED #define PB_MESHTASTIC_MESHTASTIC_CONFIG_PB_H_INCLUDED
#include <pb.h> #include <pb.h>
#if PB_PROTO_HEADER_VERSION != 40 #if PB_PROTO_HEADER_VERSION != 40
@@ -300,6 +300,8 @@ typedef struct _Config_NetworkConfig {
/* struct to keep static address */ /* struct to keep static address */
bool has_ipv4_config; bool has_ipv4_config;
Config_NetworkConfig_IpV4Config ipv4_config; Config_NetworkConfig_IpV4Config ipv4_config;
/* rsyslog Server and Port */
char rsyslog_server[33];
} Config_NetworkConfig; } Config_NetworkConfig;
/* Display Config */ /* Display Config */
@@ -472,91 +474,92 @@ extern "C" {
/* Initializer values for message structs */ /* Initializer values for message structs */
#define Config_init_default {0, {Config_DeviceConfig_init_default}} #define Config_init_default {0, {Config_DeviceConfig_init_default}}
#define Config_DeviceConfig_init_default {_Config_DeviceConfig_Role_MIN, 0, 0, 0, 0} #define Config_DeviceConfig_init_default {_Config_DeviceConfig_Role_MIN, 0, 0, 0, 0}
#define Config_PositionConfig_init_default {0, 0, 0, 0, 0, 0, 0, 0, 0} #define Config_PositionConfig_init_default {0, 0, 0, 0, 0, 0, 0, 0, 0}
#define Config_PowerConfig_init_default {0, 0, 0, 0, 0, 0, 0, 0} #define Config_PowerConfig_init_default {0, 0, 0, 0, 0, 0, 0, 0}
#define Config_NetworkConfig_init_default {0, "", "", "", 0, _Config_NetworkConfig_AddressMode_MIN, false, Config_NetworkConfig_IpV4Config_init_default} #define Config_NetworkConfig_init_default {0, "", "", "", 0, _Config_NetworkConfig_AddressMode_MIN, false, Config_NetworkConfig_IpV4Config_init_default, ""}
#define Config_NetworkConfig_IpV4Config_init_default {0, 0, 0, 0} #define Config_NetworkConfig_IpV4Config_init_default {0, 0, 0, 0}
#define Config_DisplayConfig_init_default {0, _Config_DisplayConfig_GpsCoordinateFormat_MIN, 0, 0, 0, _Config_DisplayConfig_DisplayUnits_MIN, _Config_DisplayConfig_OledType_MIN, _Config_DisplayConfig_DisplayMode_MIN, 0} #define Config_DisplayConfig_init_default {0, _Config_DisplayConfig_GpsCoordinateFormat_MIN, 0, 0, 0, _Config_DisplayConfig_DisplayUnits_MIN, _Config_DisplayConfig_OledType_MIN, _Config_DisplayConfig_DisplayMode_MIN, 0}
#define Config_LoRaConfig_init_default {0, _Config_LoRaConfig_ModemPreset_MIN, 0, 0, 0, 0, _Config_LoRaConfig_RegionCode_MIN, 0, 0, 0, 0, 0, 0, {0, 0, 0}} #define Config_LoRaConfig_init_default {0, _Config_LoRaConfig_ModemPreset_MIN, 0, 0, 0, 0, _Config_LoRaConfig_RegionCode_MIN, 0, 0, 0, 0, 0, 0, {0, 0, 0}}
#define Config_BluetoothConfig_init_default {0, _Config_BluetoothConfig_PairingMode_MIN, 0} #define Config_BluetoothConfig_init_default {0, _Config_BluetoothConfig_PairingMode_MIN, 0}
#define Config_init_zero {0, {Config_DeviceConfig_init_zero}} #define Config_init_zero {0, {Config_DeviceConfig_init_zero}}
#define Config_DeviceConfig_init_zero {_Config_DeviceConfig_Role_MIN, 0, 0, 0, 0} #define Config_DeviceConfig_init_zero {_Config_DeviceConfig_Role_MIN, 0, 0, 0, 0}
#define Config_PositionConfig_init_zero {0, 0, 0, 0, 0, 0, 0, 0, 0} #define Config_PositionConfig_init_zero {0, 0, 0, 0, 0, 0, 0, 0, 0}
#define Config_PowerConfig_init_zero {0, 0, 0, 0, 0, 0, 0, 0} #define Config_PowerConfig_init_zero {0, 0, 0, 0, 0, 0, 0, 0}
#define Config_NetworkConfig_init_zero {0, "", "", "", 0, _Config_NetworkConfig_AddressMode_MIN, false, Config_NetworkConfig_IpV4Config_init_zero} #define Config_NetworkConfig_init_zero {0, "", "", "", 0, _Config_NetworkConfig_AddressMode_MIN, false, Config_NetworkConfig_IpV4Config_init_zero, ""}
#define Config_NetworkConfig_IpV4Config_init_zero {0, 0, 0, 0} #define Config_NetworkConfig_IpV4Config_init_zero {0, 0, 0, 0}
#define Config_DisplayConfig_init_zero {0, _Config_DisplayConfig_GpsCoordinateFormat_MIN, 0, 0, 0, _Config_DisplayConfig_DisplayUnits_MIN, _Config_DisplayConfig_OledType_MIN, _Config_DisplayConfig_DisplayMode_MIN, 0} #define Config_DisplayConfig_init_zero {0, _Config_DisplayConfig_GpsCoordinateFormat_MIN, 0, 0, 0, _Config_DisplayConfig_DisplayUnits_MIN, _Config_DisplayConfig_OledType_MIN, _Config_DisplayConfig_DisplayMode_MIN, 0}
#define Config_LoRaConfig_init_zero {0, _Config_LoRaConfig_ModemPreset_MIN, 0, 0, 0, 0, _Config_LoRaConfig_RegionCode_MIN, 0, 0, 0, 0, 0, 0, {0, 0, 0}} #define Config_LoRaConfig_init_zero {0, _Config_LoRaConfig_ModemPreset_MIN, 0, 0, 0, 0, _Config_LoRaConfig_RegionCode_MIN, 0, 0, 0, 0, 0, 0, {0, 0, 0}}
#define Config_BluetoothConfig_init_zero {0, _Config_BluetoothConfig_PairingMode_MIN, 0} #define Config_BluetoothConfig_init_zero {0, _Config_BluetoothConfig_PairingMode_MIN, 0}
/* Field tags (for use in manual encoding/decoding) */ /* Field tags (for use in manual encoding/decoding) */
#define Config_DeviceConfig_role_tag 1 #define Config_DeviceConfig_role_tag 1
#define Config_DeviceConfig_serial_enabled_tag 2 #define Config_DeviceConfig_serial_enabled_tag 2
#define Config_DeviceConfig_debug_log_enabled_tag 3 #define Config_DeviceConfig_debug_log_enabled_tag 3
#define Config_DeviceConfig_button_gpio_tag 4 #define Config_DeviceConfig_button_gpio_tag 4
#define Config_DeviceConfig_buzzer_gpio_tag 5 #define Config_DeviceConfig_buzzer_gpio_tag 5
#define Config_PositionConfig_position_broadcast_secs_tag 1 #define Config_PositionConfig_position_broadcast_secs_tag 1
#define Config_PositionConfig_position_broadcast_smart_enabled_tag 2 #define Config_PositionConfig_position_broadcast_smart_enabled_tag 2
#define Config_PositionConfig_fixed_position_tag 3 #define Config_PositionConfig_fixed_position_tag 3
#define Config_PositionConfig_gps_enabled_tag 4 #define Config_PositionConfig_gps_enabled_tag 4
#define Config_PositionConfig_gps_update_interval_tag 5 #define Config_PositionConfig_gps_update_interval_tag 5
#define Config_PositionConfig_gps_attempt_time_tag 6 #define Config_PositionConfig_gps_attempt_time_tag 6
#define Config_PositionConfig_position_flags_tag 7 #define Config_PositionConfig_position_flags_tag 7
#define Config_PositionConfig_rx_gpio_tag 8 #define Config_PositionConfig_rx_gpio_tag 8
#define Config_PositionConfig_tx_gpio_tag 9 #define Config_PositionConfig_tx_gpio_tag 9
#define Config_PowerConfig_is_power_saving_tag 1 #define Config_PowerConfig_is_power_saving_tag 1
#define Config_PowerConfig_on_battery_shutdown_after_secs_tag 2 #define Config_PowerConfig_on_battery_shutdown_after_secs_tag 2
#define Config_PowerConfig_adc_multiplier_override_tag 3 #define Config_PowerConfig_adc_multiplier_override_tag 3
#define Config_PowerConfig_wait_bluetooth_secs_tag 4 #define Config_PowerConfig_wait_bluetooth_secs_tag 4
#define Config_PowerConfig_mesh_sds_timeout_secs_tag 5 #define Config_PowerConfig_mesh_sds_timeout_secs_tag 5
#define Config_PowerConfig_sds_secs_tag 6 #define Config_PowerConfig_sds_secs_tag 6
#define Config_PowerConfig_ls_secs_tag 7 #define Config_PowerConfig_ls_secs_tag 7
#define Config_PowerConfig_min_wake_secs_tag 8 #define Config_PowerConfig_min_wake_secs_tag 8
#define Config_NetworkConfig_IpV4Config_ip_tag 1 #define Config_NetworkConfig_IpV4Config_ip_tag 1
#define Config_NetworkConfig_IpV4Config_gateway_tag 2 #define Config_NetworkConfig_IpV4Config_gateway_tag 2
#define Config_NetworkConfig_IpV4Config_subnet_tag 3 #define Config_NetworkConfig_IpV4Config_subnet_tag 3
#define Config_NetworkConfig_IpV4Config_dns_tag 4 #define Config_NetworkConfig_IpV4Config_dns_tag 4
#define Config_NetworkConfig_wifi_enabled_tag 1 #define Config_NetworkConfig_wifi_enabled_tag 1
#define Config_NetworkConfig_wifi_ssid_tag 3 #define Config_NetworkConfig_wifi_ssid_tag 3
#define Config_NetworkConfig_wifi_psk_tag 4 #define Config_NetworkConfig_wifi_psk_tag 4
#define Config_NetworkConfig_ntp_server_tag 5 #define Config_NetworkConfig_ntp_server_tag 5
#define Config_NetworkConfig_eth_enabled_tag 6 #define Config_NetworkConfig_eth_enabled_tag 6
#define Config_NetworkConfig_address_mode_tag 7 #define Config_NetworkConfig_address_mode_tag 7
#define Config_NetworkConfig_ipv4_config_tag 8 #define Config_NetworkConfig_ipv4_config_tag 8
#define Config_DisplayConfig_screen_on_secs_tag 1 #define Config_NetworkConfig_rsyslog_server_tag 9
#define Config_DisplayConfig_gps_format_tag 2 #define Config_DisplayConfig_screen_on_secs_tag 1
#define Config_DisplayConfig_gps_format_tag 2
#define Config_DisplayConfig_auto_screen_carousel_secs_tag 3 #define Config_DisplayConfig_auto_screen_carousel_secs_tag 3
#define Config_DisplayConfig_compass_north_top_tag 4 #define Config_DisplayConfig_compass_north_top_tag 4
#define Config_DisplayConfig_flip_screen_tag 5 #define Config_DisplayConfig_flip_screen_tag 5
#define Config_DisplayConfig_units_tag 6 #define Config_DisplayConfig_units_tag 6
#define Config_DisplayConfig_oled_tag 7 #define Config_DisplayConfig_oled_tag 7
#define Config_DisplayConfig_displaymode_tag 8 #define Config_DisplayConfig_displaymode_tag 8
#define Config_DisplayConfig_heading_bold_tag 9 #define Config_DisplayConfig_heading_bold_tag 9
#define Config_LoRaConfig_use_preset_tag 1 #define Config_LoRaConfig_use_preset_tag 1
#define Config_LoRaConfig_modem_preset_tag 2 #define Config_LoRaConfig_modem_preset_tag 2
#define Config_LoRaConfig_bandwidth_tag 3 #define Config_LoRaConfig_bandwidth_tag 3
#define Config_LoRaConfig_spread_factor_tag 4 #define Config_LoRaConfig_spread_factor_tag 4
#define Config_LoRaConfig_coding_rate_tag 5 #define Config_LoRaConfig_coding_rate_tag 5
#define Config_LoRaConfig_frequency_offset_tag 6 #define Config_LoRaConfig_frequency_offset_tag 6
#define Config_LoRaConfig_region_tag 7 #define Config_LoRaConfig_region_tag 7
#define Config_LoRaConfig_hop_limit_tag 8 #define Config_LoRaConfig_hop_limit_tag 8
#define Config_LoRaConfig_tx_enabled_tag 9 #define Config_LoRaConfig_tx_enabled_tag 9
#define Config_LoRaConfig_tx_power_tag 10 #define Config_LoRaConfig_tx_power_tag 10
#define Config_LoRaConfig_channel_num_tag 11 #define Config_LoRaConfig_channel_num_tag 11
#define Config_LoRaConfig_override_duty_cycle_tag 12 #define Config_LoRaConfig_override_duty_cycle_tag 12
#define Config_LoRaConfig_ignore_incoming_tag 103 #define Config_LoRaConfig_ignore_incoming_tag 103
#define Config_BluetoothConfig_enabled_tag 1 #define Config_BluetoothConfig_enabled_tag 1
#define Config_BluetoothConfig_mode_tag 2 #define Config_BluetoothConfig_mode_tag 2
#define Config_BluetoothConfig_fixed_pin_tag 3 #define Config_BluetoothConfig_fixed_pin_tag 3
#define Config_device_tag 1 #define Config_device_tag 1
#define Config_position_tag 2 #define Config_position_tag 2
#define Config_power_tag 3 #define Config_power_tag 3
#define Config_network_tag 4 #define Config_network_tag 4
#define Config_display_tag 5 #define Config_display_tag 5
#define Config_lora_tag 6 #define Config_lora_tag 6
#define Config_bluetooth_tag 7 #define Config_bluetooth_tag 7
/* Struct field encoding specification for nanopb */ /* Struct field encoding specification for nanopb */
#define Config_FIELDLIST(X, a) \ #define Config_FIELDLIST(X, a) \
@@ -618,7 +621,8 @@ X(a, STATIC, SINGULAR, STRING, wifi_psk, 4) \
X(a, STATIC, SINGULAR, STRING, ntp_server, 5) \ X(a, STATIC, SINGULAR, STRING, ntp_server, 5) \
X(a, STATIC, SINGULAR, BOOL, eth_enabled, 6) \ X(a, STATIC, SINGULAR, BOOL, eth_enabled, 6) \
X(a, STATIC, SINGULAR, UENUM, address_mode, 7) \ X(a, STATIC, SINGULAR, UENUM, address_mode, 7) \
X(a, STATIC, OPTIONAL, MESSAGE, ipv4_config, 8) X(a, STATIC, OPTIONAL, MESSAGE, ipv4_config, 8) \
X(a, STATIC, SINGULAR, STRING, rsyslog_server, 9)
#define Config_NetworkConfig_CALLBACK NULL #define Config_NetworkConfig_CALLBACK NULL
#define Config_NetworkConfig_DEFAULT NULL #define Config_NetworkConfig_DEFAULT NULL
#define Config_NetworkConfig_ipv4_config_MSGTYPE Config_NetworkConfig_IpV4Config #define Config_NetworkConfig_ipv4_config_MSGTYPE Config_NetworkConfig_IpV4Config
@@ -690,15 +694,15 @@ extern const pb_msgdesc_t Config_BluetoothConfig_msg;
#define Config_BluetoothConfig_fields &Config_BluetoothConfig_msg #define Config_BluetoothConfig_fields &Config_BluetoothConfig_msg
/* Maximum encoded size of messages (where known) */ /* Maximum encoded size of messages (where known) */
#define Config_BluetoothConfig_size 10 #define Config_BluetoothConfig_size 10
#define Config_DeviceConfig_size 18 #define Config_DeviceConfig_size 18
#define Config_DisplayConfig_size 26 #define Config_DisplayConfig_size 26
#define Config_LoRaConfig_size 70 #define Config_LoRaConfig_size 70
#define Config_NetworkConfig_IpV4Config_size 20 #define Config_NetworkConfig_IpV4Config_size 20
#define Config_NetworkConfig_size 161 #define Config_NetworkConfig_size 195
#define Config_PositionConfig_size 42 #define Config_PositionConfig_size 42
#define Config_PowerConfig_size 43 #define Config_PowerConfig_size 43
#define Config_size 164 #define Config_size 198
#ifdef __cplusplus #ifdef __cplusplus
} /* extern "C" */ } /* extern "C" */
@@ -1,7 +1,7 @@
/* Automatically generated nanopb constant definitions */ /* Automatically generated nanopb constant definitions */
/* Generated by nanopb-0.4.7 */ /* Generated by nanopb-0.4.7 */
#include "device_metadata.pb.h" #include "./device_metadata.pb.h"
#if PB_PROTO_HEADER_VERSION != 40 #if PB_PROTO_HEADER_VERSION != 40
#error Regenerate this file with the current version of nanopb generator. #error Regenerate this file with the current version of nanopb generator.
#endif #endif
@@ -1,9 +1,10 @@
/* Automatically generated nanopb header */ /* Automatically generated nanopb header */
/* Generated by nanopb-0.4.7 */ /* Generated by nanopb-0.4.7 */
#ifndef PB_DEVICE_METADATA_PB_H_INCLUDED #ifndef PB_MESHTASTIC_MESHTASTIC_DEVICE_METADATA_PB_H_INCLUDED
#define PB_DEVICE_METADATA_PB_H_INCLUDED #define PB_MESHTASTIC_MESHTASTIC_DEVICE_METADATA_PB_H_INCLUDED
#include <pb.h> #include <pb.h>
#include "./config.pb.h"
#if PB_PROTO_HEADER_VERSION != 40 #if PB_PROTO_HEADER_VERSION != 40
#error Regenerate this file with the current version of nanopb generator. #error Regenerate this file with the current version of nanopb generator.
@@ -24,6 +25,10 @@ typedef struct _DeviceMetadata {
bool hasBluetooth; bool hasBluetooth;
/* Indicates that the device has an ethernet peripheral */ /* Indicates that the device has an ethernet peripheral */
bool hasEthernet; bool hasEthernet;
/* Indicates that the device's role in the mesh */
Config_DeviceConfig_Role role;
/* Indicates the device's current enabled position flags */
uint32_t position_flags;
} DeviceMetadata; } DeviceMetadata;
@@ -32,16 +37,18 @@ extern "C" {
#endif #endif
/* Initializer values for message structs */ /* Initializer values for message structs */
#define DeviceMetadata_init_default {"", 0, 0, 0, 0, 0} #define DeviceMetadata_init_default {"", 0, 0, 0, 0, 0, _Config_DeviceConfig_Role_MIN, 0}
#define DeviceMetadata_init_zero {"", 0, 0, 0, 0, 0} #define DeviceMetadata_init_zero {"", 0, 0, 0, 0, 0, _Config_DeviceConfig_Role_MIN, 0}
/* Field tags (for use in manual encoding/decoding) */ /* Field tags (for use in manual encoding/decoding) */
#define DeviceMetadata_firmware_version_tag 1 #define DeviceMetadata_firmware_version_tag 1
#define DeviceMetadata_device_state_version_tag 2 #define DeviceMetadata_device_state_version_tag 2
#define DeviceMetadata_canShutdown_tag 3 #define DeviceMetadata_canShutdown_tag 3
#define DeviceMetadata_hasWifi_tag 4 #define DeviceMetadata_hasWifi_tag 4
#define DeviceMetadata_hasBluetooth_tag 5 #define DeviceMetadata_hasBluetooth_tag 5
#define DeviceMetadata_hasEthernet_tag 6 #define DeviceMetadata_hasEthernet_tag 6
#define DeviceMetadata_role_tag 7
#define DeviceMetadata_position_flags_tag 8
/* Struct field encoding specification for nanopb */ /* Struct field encoding specification for nanopb */
#define DeviceMetadata_FIELDLIST(X, a) \ #define DeviceMetadata_FIELDLIST(X, a) \
@@ -50,7 +57,9 @@ X(a, STATIC, SINGULAR, UINT32, device_state_version, 2) \
X(a, STATIC, SINGULAR, BOOL, canShutdown, 3) \ X(a, STATIC, SINGULAR, BOOL, canShutdown, 3) \
X(a, STATIC, SINGULAR, BOOL, hasWifi, 4) \ X(a, STATIC, SINGULAR, BOOL, hasWifi, 4) \
X(a, STATIC, SINGULAR, BOOL, hasBluetooth, 5) \ X(a, STATIC, SINGULAR, BOOL, hasBluetooth, 5) \
X(a, STATIC, SINGULAR, BOOL, hasEthernet, 6) X(a, STATIC, SINGULAR, BOOL, hasEthernet, 6) \
X(a, STATIC, SINGULAR, UENUM, role, 7) \
X(a, STATIC, SINGULAR, UINT32, position_flags, 8)
#define DeviceMetadata_CALLBACK NULL #define DeviceMetadata_CALLBACK NULL
#define DeviceMetadata_DEFAULT NULL #define DeviceMetadata_DEFAULT NULL
@@ -60,7 +69,7 @@ extern const pb_msgdesc_t DeviceMetadata_msg;
#define DeviceMetadata_fields &DeviceMetadata_msg #define DeviceMetadata_fields &DeviceMetadata_msg
/* Maximum encoded size of messages (where known) */ /* Maximum encoded size of messages (where known) */
#define DeviceMetadata_size 33 #define DeviceMetadata_size 41
#ifdef __cplusplus #ifdef __cplusplus
} /* extern "C" */ } /* extern "C" */
@@ -1,7 +1,7 @@
/* Automatically generated nanopb constant definitions */ /* Automatically generated nanopb constant definitions */
/* Generated by nanopb-0.4.7 */ /* Generated by nanopb-0.4.7 */
#include "deviceonly.pb.h" #include "./deviceonly.pb.h"
#if PB_PROTO_HEADER_VERSION != 40 #if PB_PROTO_HEADER_VERSION != 40
#error Regenerate this file with the current version of nanopb generator. #error Regenerate this file with the current version of nanopb generator.
#endif #endif
@@ -1,11 +1,11 @@
/* Automatically generated nanopb header */ /* Automatically generated nanopb header */
/* Generated by nanopb-0.4.7 */ /* Generated by nanopb-0.4.7 */
#ifndef PB_DEVICEONLY_PB_H_INCLUDED #ifndef PB_MESHTASTIC_MESHTASTIC_DEVICEONLY_PB_H_INCLUDED
#define PB_DEVICEONLY_PB_H_INCLUDED #define PB_MESHTASTIC_MESHTASTIC_DEVICEONLY_PB_H_INCLUDED
#include <pb.h> #include <pb.h>
#include "channel.pb.h" #include "./channel.pb.h"
#include "mesh.pb.h" #include "./mesh.pb.h"
#if PB_PROTO_HEADER_VERSION != 40 #if PB_PROTO_HEADER_VERSION != 40
#error Regenerate this file with the current version of nanopb generator. #error Regenerate this file with the current version of nanopb generator.
@@ -103,30 +103,30 @@ extern "C" {
/* Initializer values for message structs */ /* Initializer values for message structs */
#define DeviceState_init_default {false, MyNodeInfo_init_default, false, User_init_default, 0, {NodeInfo_init_default, NodeInfo_init_default, NodeInfo_init_default, NodeInfo_init_default, NodeInfo_init_default, NodeInfo_init_default, NodeInfo_init_default, NodeInfo_init_default, NodeInfo_init_default, NodeInfo_init_default, NodeInfo_init_default, NodeInfo_init_default, NodeInfo_init_default, NodeInfo_init_default, NodeInfo_init_default, NodeInfo_init_default, NodeInfo_init_default, NodeInfo_init_default, NodeInfo_init_default, NodeInfo_init_default, NodeInfo_init_default, NodeInfo_init_default, NodeInfo_init_default, NodeInfo_init_default, NodeInfo_init_default, NodeInfo_init_default, NodeInfo_init_default, NodeInfo_init_default, NodeInfo_init_default, NodeInfo_init_default, NodeInfo_init_default, NodeInfo_init_default, NodeInfo_init_default, NodeInfo_init_default, NodeInfo_init_default, NodeInfo_init_default, NodeInfo_init_default, NodeInfo_init_default, NodeInfo_init_default, NodeInfo_init_default, NodeInfo_init_default, NodeInfo_init_default, NodeInfo_init_default, NodeInfo_init_default, NodeInfo_init_default, NodeInfo_init_default, NodeInfo_init_default, NodeInfo_init_default, NodeInfo_init_default, NodeInfo_init_default, NodeInfo_init_default, NodeInfo_init_default, NodeInfo_init_default, NodeInfo_init_default, NodeInfo_init_default, NodeInfo_init_default, NodeInfo_init_default, NodeInfo_init_default, NodeInfo_init_default, NodeInfo_init_default, NodeInfo_init_default, NodeInfo_init_default, NodeInfo_init_default, NodeInfo_init_default, NodeInfo_init_default, NodeInfo_init_default, NodeInfo_init_default, NodeInfo_init_default, NodeInfo_init_default, NodeInfo_init_default, NodeInfo_init_default, NodeInfo_init_default, NodeInfo_init_default, NodeInfo_init_default, NodeInfo_init_default, NodeInfo_init_default, NodeInfo_init_default, NodeInfo_init_default, NodeInfo_init_default, NodeInfo_init_default}, 0, {MeshPacket_init_default}, false, MeshPacket_init_default, 0, 0, 0} #define DeviceState_init_default {false, MyNodeInfo_init_default, false, User_init_default, 0, {NodeInfo_init_default, NodeInfo_init_default, NodeInfo_init_default, NodeInfo_init_default, NodeInfo_init_default, NodeInfo_init_default, NodeInfo_init_default, NodeInfo_init_default, NodeInfo_init_default, NodeInfo_init_default, NodeInfo_init_default, NodeInfo_init_default, NodeInfo_init_default, NodeInfo_init_default, NodeInfo_init_default, NodeInfo_init_default, NodeInfo_init_default, NodeInfo_init_default, NodeInfo_init_default, NodeInfo_init_default, NodeInfo_init_default, NodeInfo_init_default, NodeInfo_init_default, NodeInfo_init_default, NodeInfo_init_default, NodeInfo_init_default, NodeInfo_init_default, NodeInfo_init_default, NodeInfo_init_default, NodeInfo_init_default, NodeInfo_init_default, NodeInfo_init_default, NodeInfo_init_default, NodeInfo_init_default, NodeInfo_init_default, NodeInfo_init_default, NodeInfo_init_default, NodeInfo_init_default, NodeInfo_init_default, NodeInfo_init_default, NodeInfo_init_default, NodeInfo_init_default, NodeInfo_init_default, NodeInfo_init_default, NodeInfo_init_default, NodeInfo_init_default, NodeInfo_init_default, NodeInfo_init_default, NodeInfo_init_default, NodeInfo_init_default, NodeInfo_init_default, NodeInfo_init_default, NodeInfo_init_default, NodeInfo_init_default, NodeInfo_init_default, NodeInfo_init_default, NodeInfo_init_default, NodeInfo_init_default, NodeInfo_init_default, NodeInfo_init_default, NodeInfo_init_default, NodeInfo_init_default, NodeInfo_init_default, NodeInfo_init_default, NodeInfo_init_default, NodeInfo_init_default, NodeInfo_init_default, NodeInfo_init_default, NodeInfo_init_default, NodeInfo_init_default, NodeInfo_init_default, NodeInfo_init_default, NodeInfo_init_default, NodeInfo_init_default, NodeInfo_init_default, NodeInfo_init_default, NodeInfo_init_default, NodeInfo_init_default, NodeInfo_init_default, NodeInfo_init_default}, 0, {MeshPacket_init_default}, false, MeshPacket_init_default, 0, 0, 0}
#define ChannelFile_init_default {0, {Channel_init_default, Channel_init_default, Channel_init_default, Channel_init_default, Channel_init_default, Channel_init_default, Channel_init_default, Channel_init_default}, 0} #define ChannelFile_init_default {0, {Channel_init_default, Channel_init_default, Channel_init_default, Channel_init_default, Channel_init_default, Channel_init_default, Channel_init_default, Channel_init_default}, 0}
#define OEMStore_init_default {0, 0, {0, {0}}, _ScreenFonts_MIN, "", {0, {0}}} #define OEMStore_init_default {0, 0, {0, {0}}, _ScreenFonts_MIN, "", {0, {0}}}
#define DeviceState_init_zero {false, MyNodeInfo_init_zero, false, User_init_zero, 0, {NodeInfo_init_zero, NodeInfo_init_zero, NodeInfo_init_zero, NodeInfo_init_zero, NodeInfo_init_zero, NodeInfo_init_zero, NodeInfo_init_zero, NodeInfo_init_zero, NodeInfo_init_zero, NodeInfo_init_zero, NodeInfo_init_zero, NodeInfo_init_zero, NodeInfo_init_zero, NodeInfo_init_zero, NodeInfo_init_zero, NodeInfo_init_zero, NodeInfo_init_zero, NodeInfo_init_zero, NodeInfo_init_zero, NodeInfo_init_zero, NodeInfo_init_zero, NodeInfo_init_zero, NodeInfo_init_zero, NodeInfo_init_zero, NodeInfo_init_zero, NodeInfo_init_zero, NodeInfo_init_zero, NodeInfo_init_zero, NodeInfo_init_zero, NodeInfo_init_zero, NodeInfo_init_zero, NodeInfo_init_zero, NodeInfo_init_zero, NodeInfo_init_zero, NodeInfo_init_zero, NodeInfo_init_zero, NodeInfo_init_zero, NodeInfo_init_zero, NodeInfo_init_zero, NodeInfo_init_zero, NodeInfo_init_zero, NodeInfo_init_zero, NodeInfo_init_zero, NodeInfo_init_zero, NodeInfo_init_zero, NodeInfo_init_zero, NodeInfo_init_zero, NodeInfo_init_zero, NodeInfo_init_zero, NodeInfo_init_zero, NodeInfo_init_zero, NodeInfo_init_zero, NodeInfo_init_zero, NodeInfo_init_zero, NodeInfo_init_zero, NodeInfo_init_zero, NodeInfo_init_zero, NodeInfo_init_zero, NodeInfo_init_zero, NodeInfo_init_zero, NodeInfo_init_zero, NodeInfo_init_zero, NodeInfo_init_zero, NodeInfo_init_zero, NodeInfo_init_zero, NodeInfo_init_zero, NodeInfo_init_zero, NodeInfo_init_zero, NodeInfo_init_zero, NodeInfo_init_zero, NodeInfo_init_zero, NodeInfo_init_zero, NodeInfo_init_zero, NodeInfo_init_zero, NodeInfo_init_zero, NodeInfo_init_zero, NodeInfo_init_zero, NodeInfo_init_zero, NodeInfo_init_zero, NodeInfo_init_zero}, 0, {MeshPacket_init_zero}, false, MeshPacket_init_zero, 0, 0, 0} #define DeviceState_init_zero {false, MyNodeInfo_init_zero, false, User_init_zero, 0, {NodeInfo_init_zero, NodeInfo_init_zero, NodeInfo_init_zero, NodeInfo_init_zero, NodeInfo_init_zero, NodeInfo_init_zero, NodeInfo_init_zero, NodeInfo_init_zero, NodeInfo_init_zero, NodeInfo_init_zero, NodeInfo_init_zero, NodeInfo_init_zero, NodeInfo_init_zero, NodeInfo_init_zero, NodeInfo_init_zero, NodeInfo_init_zero, NodeInfo_init_zero, NodeInfo_init_zero, NodeInfo_init_zero, NodeInfo_init_zero, NodeInfo_init_zero, NodeInfo_init_zero, NodeInfo_init_zero, NodeInfo_init_zero, NodeInfo_init_zero, NodeInfo_init_zero, NodeInfo_init_zero, NodeInfo_init_zero, NodeInfo_init_zero, NodeInfo_init_zero, NodeInfo_init_zero, NodeInfo_init_zero, NodeInfo_init_zero, NodeInfo_init_zero, NodeInfo_init_zero, NodeInfo_init_zero, NodeInfo_init_zero, NodeInfo_init_zero, NodeInfo_init_zero, NodeInfo_init_zero, NodeInfo_init_zero, NodeInfo_init_zero, NodeInfo_init_zero, NodeInfo_init_zero, NodeInfo_init_zero, NodeInfo_init_zero, NodeInfo_init_zero, NodeInfo_init_zero, NodeInfo_init_zero, NodeInfo_init_zero, NodeInfo_init_zero, NodeInfo_init_zero, NodeInfo_init_zero, NodeInfo_init_zero, NodeInfo_init_zero, NodeInfo_init_zero, NodeInfo_init_zero, NodeInfo_init_zero, NodeInfo_init_zero, NodeInfo_init_zero, NodeInfo_init_zero, NodeInfo_init_zero, NodeInfo_init_zero, NodeInfo_init_zero, NodeInfo_init_zero, NodeInfo_init_zero, NodeInfo_init_zero, NodeInfo_init_zero, NodeInfo_init_zero, NodeInfo_init_zero, NodeInfo_init_zero, NodeInfo_init_zero, NodeInfo_init_zero, NodeInfo_init_zero, NodeInfo_init_zero, NodeInfo_init_zero, NodeInfo_init_zero, NodeInfo_init_zero, NodeInfo_init_zero, NodeInfo_init_zero}, 0, {MeshPacket_init_zero}, false, MeshPacket_init_zero, 0, 0, 0}
#define ChannelFile_init_zero {0, {Channel_init_zero, Channel_init_zero, Channel_init_zero, Channel_init_zero, Channel_init_zero, Channel_init_zero, Channel_init_zero, Channel_init_zero}, 0} #define ChannelFile_init_zero {0, {Channel_init_zero, Channel_init_zero, Channel_init_zero, Channel_init_zero, Channel_init_zero, Channel_init_zero, Channel_init_zero, Channel_init_zero}, 0}
#define OEMStore_init_zero {0, 0, {0, {0}}, _ScreenFonts_MIN, "", {0, {0}}} #define OEMStore_init_zero {0, 0, {0, {0}}, _ScreenFonts_MIN, "", {0, {0}}}
/* Field tags (for use in manual encoding/decoding) */ /* Field tags (for use in manual encoding/decoding) */
#define DeviceState_my_node_tag 2 #define DeviceState_my_node_tag 2
#define DeviceState_owner_tag 3 #define DeviceState_owner_tag 3
#define DeviceState_node_db_tag 4 #define DeviceState_node_db_tag 4
#define DeviceState_receive_queue_tag 5 #define DeviceState_receive_queue_tag 5
#define DeviceState_rx_text_message_tag 7 #define DeviceState_rx_text_message_tag 7
#define DeviceState_version_tag 8 #define DeviceState_version_tag 8
#define DeviceState_no_save_tag 9 #define DeviceState_no_save_tag 9
#define DeviceState_did_gps_reset_tag 11 #define DeviceState_did_gps_reset_tag 11
#define ChannelFile_channels_tag 1 #define ChannelFile_channels_tag 1
#define ChannelFile_version_tag 2 #define ChannelFile_version_tag 2
#define OEMStore_oem_icon_width_tag 1 #define OEMStore_oem_icon_width_tag 1
#define OEMStore_oem_icon_height_tag 2 #define OEMStore_oem_icon_height_tag 2
#define OEMStore_oem_icon_bits_tag 3 #define OEMStore_oem_icon_bits_tag 3
#define OEMStore_oem_font_tag 4 #define OEMStore_oem_font_tag 4
#define OEMStore_oem_text_tag 5 #define OEMStore_oem_text_tag 5
#define OEMStore_oem_aes_key_tag 6 #define OEMStore_oem_aes_key_tag 6
/* Struct field encoding specification for nanopb */ /* Struct field encoding specification for nanopb */
#define DeviceState_FIELDLIST(X, a) \ #define DeviceState_FIELDLIST(X, a) \
@@ -173,9 +173,9 @@ extern const pb_msgdesc_t OEMStore_msg;
#define OEMStore_fields &OEMStore_msg #define OEMStore_fields &OEMStore_msg
/* Maximum encoded size of messages (where known) */ /* Maximum encoded size of messages (where known) */
#define ChannelFile_size 638 #define ChannelFile_size 638
#define DeviceState_size 21800 #define DeviceState_size 21800
#define OEMStore_size 2140 #define OEMStore_size 2140
#ifdef __cplusplus #ifdef __cplusplus
} /* extern "C" */ } /* extern "C" */
@@ -1,7 +1,7 @@
/* Automatically generated nanopb constant definitions */ /* Automatically generated nanopb constant definitions */
/* Generated by nanopb-0.4.7 */ /* Generated by nanopb-0.4.7 */
#include "localonly.pb.h" #include "./localonly.pb.h"
#if PB_PROTO_HEADER_VERSION != 40 #if PB_PROTO_HEADER_VERSION != 40
#error Regenerate this file with the current version of nanopb generator. #error Regenerate this file with the current version of nanopb generator.
#endif #endif
@@ -1,11 +1,11 @@
/* Automatically generated nanopb header */ /* Automatically generated nanopb header */
/* Generated by nanopb-0.4.7 */ /* Generated by nanopb-0.4.7 */
#ifndef PB_LOCALONLY_PB_H_INCLUDED #ifndef PB_MESHTASTIC_MESHTASTIC_LOCALONLY_PB_H_INCLUDED
#define PB_LOCALONLY_PB_H_INCLUDED #define PB_MESHTASTIC_MESHTASTIC_LOCALONLY_PB_H_INCLUDED
#include <pb.h> #include <pb.h>
#include "config.pb.h" #include "./config.pb.h"
#include "module_config.pb.h" #include "./module_config.pb.h"
#if PB_PROTO_HEADER_VERSION != 40 #if PB_PROTO_HEADER_VERSION != 40
#error Regenerate this file with the current version of nanopb generator. #error Regenerate this file with the current version of nanopb generator.
@@ -80,30 +80,30 @@ extern "C" {
#endif #endif
/* Initializer values for message structs */ /* Initializer values for message structs */
#define LocalConfig_init_default {false, Config_DeviceConfig_init_default, false, Config_PositionConfig_init_default, false, Config_PowerConfig_init_default, false, Config_NetworkConfig_init_default, false, Config_DisplayConfig_init_default, false, Config_LoRaConfig_init_default, false, Config_BluetoothConfig_init_default, 0} #define LocalConfig_init_default {false, Config_DeviceConfig_init_default, false, Config_PositionConfig_init_default, false, Config_PowerConfig_init_default, false, Config_NetworkConfig_init_default, false, Config_DisplayConfig_init_default, false, Config_LoRaConfig_init_default, false, Config_BluetoothConfig_init_default, 0}
#define LocalModuleConfig_init_default {false, ModuleConfig_MQTTConfig_init_default, false, ModuleConfig_SerialConfig_init_default, false, ModuleConfig_ExternalNotificationConfig_init_default, false, ModuleConfig_StoreForwardConfig_init_default, false, ModuleConfig_RangeTestConfig_init_default, false, ModuleConfig_TelemetryConfig_init_default, false, ModuleConfig_CannedMessageConfig_init_default, 0, false, ModuleConfig_AudioConfig_init_default, false, ModuleConfig_RemoteHardwareConfig_init_default} #define LocalModuleConfig_init_default {false, ModuleConfig_MQTTConfig_init_default, false, ModuleConfig_SerialConfig_init_default, false, ModuleConfig_ExternalNotificationConfig_init_default, false, ModuleConfig_StoreForwardConfig_init_default, false, ModuleConfig_RangeTestConfig_init_default, false, ModuleConfig_TelemetryConfig_init_default, false, ModuleConfig_CannedMessageConfig_init_default, 0, false, ModuleConfig_AudioConfig_init_default, false, ModuleConfig_RemoteHardwareConfig_init_default}
#define LocalConfig_init_zero {false, Config_DeviceConfig_init_zero, false, Config_PositionConfig_init_zero, false, Config_PowerConfig_init_zero, false, Config_NetworkConfig_init_zero, false, Config_DisplayConfig_init_zero, false, Config_LoRaConfig_init_zero, false, Config_BluetoothConfig_init_zero, 0} #define LocalConfig_init_zero {false, Config_DeviceConfig_init_zero, false, Config_PositionConfig_init_zero, false, Config_PowerConfig_init_zero, false, Config_NetworkConfig_init_zero, false, Config_DisplayConfig_init_zero, false, Config_LoRaConfig_init_zero, false, Config_BluetoothConfig_init_zero, 0}
#define LocalModuleConfig_init_zero {false, ModuleConfig_MQTTConfig_init_zero, false, ModuleConfig_SerialConfig_init_zero, false, ModuleConfig_ExternalNotificationConfig_init_zero, false, ModuleConfig_StoreForwardConfig_init_zero, false, ModuleConfig_RangeTestConfig_init_zero, false, ModuleConfig_TelemetryConfig_init_zero, false, ModuleConfig_CannedMessageConfig_init_zero, 0, false, ModuleConfig_AudioConfig_init_zero, false, ModuleConfig_RemoteHardwareConfig_init_zero} #define LocalModuleConfig_init_zero {false, ModuleConfig_MQTTConfig_init_zero, false, ModuleConfig_SerialConfig_init_zero, false, ModuleConfig_ExternalNotificationConfig_init_zero, false, ModuleConfig_StoreForwardConfig_init_zero, false, ModuleConfig_RangeTestConfig_init_zero, false, ModuleConfig_TelemetryConfig_init_zero, false, ModuleConfig_CannedMessageConfig_init_zero, 0, false, ModuleConfig_AudioConfig_init_zero, false, ModuleConfig_RemoteHardwareConfig_init_zero}
/* Field tags (for use in manual encoding/decoding) */ /* Field tags (for use in manual encoding/decoding) */
#define LocalConfig_device_tag 1 #define LocalConfig_device_tag 1
#define LocalConfig_position_tag 2 #define LocalConfig_position_tag 2
#define LocalConfig_power_tag 3 #define LocalConfig_power_tag 3
#define LocalConfig_network_tag 4 #define LocalConfig_network_tag 4
#define LocalConfig_display_tag 5 #define LocalConfig_display_tag 5
#define LocalConfig_lora_tag 6 #define LocalConfig_lora_tag 6
#define LocalConfig_bluetooth_tag 7 #define LocalConfig_bluetooth_tag 7
#define LocalConfig_version_tag 8 #define LocalConfig_version_tag 8
#define LocalModuleConfig_mqtt_tag 1 #define LocalModuleConfig_mqtt_tag 1
#define LocalModuleConfig_serial_tag 2 #define LocalModuleConfig_serial_tag 2
#define LocalModuleConfig_external_notification_tag 3 #define LocalModuleConfig_external_notification_tag 3
#define LocalModuleConfig_store_forward_tag 4 #define LocalModuleConfig_store_forward_tag 4
#define LocalModuleConfig_range_test_tag 5 #define LocalModuleConfig_range_test_tag 5
#define LocalModuleConfig_telemetry_tag 6 #define LocalModuleConfig_telemetry_tag 6
#define LocalModuleConfig_canned_message_tag 7 #define LocalModuleConfig_canned_message_tag 7
#define LocalModuleConfig_version_tag 8 #define LocalModuleConfig_version_tag 8
#define LocalModuleConfig_audio_tag 9 #define LocalModuleConfig_audio_tag 9
#define LocalModuleConfig_remote_hardware_tag 10 #define LocalModuleConfig_remote_hardware_tag 10
/* Struct field encoding specification for nanopb */ /* Struct field encoding specification for nanopb */
#define LocalConfig_FIELDLIST(X, a) \ #define LocalConfig_FIELDLIST(X, a) \
@@ -156,8 +156,8 @@ extern const pb_msgdesc_t LocalModuleConfig_msg;
#define LocalModuleConfig_fields &LocalModuleConfig_msg #define LocalModuleConfig_fields &LocalModuleConfig_msg
/* Maximum encoded size of messages (where known) */ /* Maximum encoded size of messages (where known) */
#define LocalConfig_size 391 #define LocalConfig_size 425
#define LocalModuleConfig_size 412 #define LocalModuleConfig_size 412
#ifdef __cplusplus #ifdef __cplusplus
} /* extern "C" */ } /* extern "C" */
@@ -1,7 +1,7 @@
/* Automatically generated nanopb constant definitions */ /* Automatically generated nanopb constant definitions */
/* Generated by nanopb-0.4.7 */ /* Generated by nanopb-0.4.7 */
#include "mesh.pb.h" #include "./mesh.pb.h"
#if PB_PROTO_HEADER_VERSION != 40 #if PB_PROTO_HEADER_VERSION != 40
#error Regenerate this file with the current version of nanopb generator. #error Regenerate this file with the current version of nanopb generator.
#endif #endif
@@ -1,15 +1,15 @@
/* Automatically generated nanopb header */ /* Automatically generated nanopb header */
/* Generated by nanopb-0.4.7 */ /* Generated by nanopb-0.4.7 */
#ifndef PB_MESH_PB_H_INCLUDED #ifndef PB_MESHTASTIC_MESHTASTIC_MESH_PB_H_INCLUDED
#define PB_MESH_PB_H_INCLUDED #define PB_MESHTASTIC_MESHTASTIC_MESH_PB_H_INCLUDED
#include <pb.h> #include <pb.h>
#include "channel.pb.h" #include "./channel.pb.h"
#include "config.pb.h" #include "./config.pb.h"
#include "module_config.pb.h" #include "./module_config.pb.h"
#include "portnums.pb.h" #include "./portnums.pb.h"
#include "telemetry.pb.h" #include "./telemetry.pb.h"
#include "xmodem.pb.h" #include "./xmodem.pb.h"
#if PB_PROTO_HEADER_VERSION != 40 #if PB_PROTO_HEADER_VERSION != 40
#error Regenerate this file with the current version of nanopb generator. #error Regenerate this file with the current version of nanopb generator.
@@ -781,145 +781,145 @@ extern "C" {
/* Initializer values for message structs */ /* Initializer values for message structs */
#define Position_init_default {0, 0, 0, 0, _Position_LocSource_MIN, _Position_AltSource_MIN, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0} #define Position_init_default {0, 0, 0, 0, _Position_LocSource_MIN, _Position_AltSource_MIN, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}
#define User_init_default {"", "", "", {0}, _HardwareModel_MIN, 0} #define User_init_default {"", "", "", {0}, _HardwareModel_MIN, 0}
#define RouteDiscovery_init_default {0, {0, 0, 0, 0, 0, 0, 0, 0}} #define RouteDiscovery_init_default {0, {0, 0, 0, 0, 0, 0, 0, 0}}
#define Routing_init_default {0, {RouteDiscovery_init_default}} #define Routing_init_default {0, {RouteDiscovery_init_default}}
#define Data_init_default {_PortNum_MIN, {0, {0}}, 0, 0, 0, 0, 0, 0} #define Data_init_default {_PortNum_MIN, {0, {0}}, 0, 0, 0, 0, 0, 0}
#define Waypoint_init_default {0, 0, 0, 0, 0, "", "", 0} #define Waypoint_init_default {0, 0, 0, 0, 0, "", "", 0}
#define MeshPacket_init_default {0, 0, 0, 0, {Data_init_default}, 0, 0, 0, 0, 0, _MeshPacket_Priority_MIN, 0, _MeshPacket_Delayed_MIN} #define MeshPacket_init_default {0, 0, 0, 0, {Data_init_default}, 0, 0, 0, 0, 0, _MeshPacket_Priority_MIN, 0, _MeshPacket_Delayed_MIN}
#define NodeInfo_init_default {0, false, User_init_default, false, Position_init_default, 0, 0, false, DeviceMetrics_init_default} #define NodeInfo_init_default {0, false, User_init_default, false, Position_init_default, 0, 0, false, DeviceMetrics_init_default}
#define MyNodeInfo_init_default {0, 0, 0, "", _CriticalErrorCode_MIN, 0, 0, 0, 0, 0, 0, 0, {0, 0, 0, 0, 0, 0, 0, 0}, 0, {0, 0, 0, 0, 0, 0, 0, 0}, 0, 0, 0} #define MyNodeInfo_init_default {0, 0, 0, "", _CriticalErrorCode_MIN, 0, 0, 0, 0, 0, 0, 0, {0, 0, 0, 0, 0, 0, 0, 0}, 0, {0, 0, 0, 0, 0, 0, 0, 0}, 0, 0, 0}
#define LogRecord_init_default {"", 0, "", _LogRecord_Level_MIN} #define LogRecord_init_default {"", 0, "", _LogRecord_Level_MIN}
#define QueueStatus_init_default {0, 0, 0, 0} #define QueueStatus_init_default {0, 0, 0, 0}
#define FromRadio_init_default {0, 0, {MeshPacket_init_default}} #define FromRadio_init_default {0, 0, {MeshPacket_init_default}}
#define ToRadio_init_default {0, {MeshPacket_init_default}} #define ToRadio_init_default {0, {MeshPacket_init_default}}
#define Compressed_init_default {_PortNum_MIN, {0, {0}}} #define Compressed_init_default {_PortNum_MIN, {0, {0}}}
#define Position_init_zero {0, 0, 0, 0, _Position_LocSource_MIN, _Position_AltSource_MIN, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0} #define Position_init_zero {0, 0, 0, 0, _Position_LocSource_MIN, _Position_AltSource_MIN, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}
#define User_init_zero {"", "", "", {0}, _HardwareModel_MIN, 0} #define User_init_zero {"", "", "", {0}, _HardwareModel_MIN, 0}
#define RouteDiscovery_init_zero {0, {0, 0, 0, 0, 0, 0, 0, 0}} #define RouteDiscovery_init_zero {0, {0, 0, 0, 0, 0, 0, 0, 0}}
#define Routing_init_zero {0, {RouteDiscovery_init_zero}} #define Routing_init_zero {0, {RouteDiscovery_init_zero}}
#define Data_init_zero {_PortNum_MIN, {0, {0}}, 0, 0, 0, 0, 0, 0} #define Data_init_zero {_PortNum_MIN, {0, {0}}, 0, 0, 0, 0, 0, 0}
#define Waypoint_init_zero {0, 0, 0, 0, 0, "", "", 0} #define Waypoint_init_zero {0, 0, 0, 0, 0, "", "", 0}
#define MeshPacket_init_zero {0, 0, 0, 0, {Data_init_zero}, 0, 0, 0, 0, 0, _MeshPacket_Priority_MIN, 0, _MeshPacket_Delayed_MIN} #define MeshPacket_init_zero {0, 0, 0, 0, {Data_init_zero}, 0, 0, 0, 0, 0, _MeshPacket_Priority_MIN, 0, _MeshPacket_Delayed_MIN}
#define NodeInfo_init_zero {0, false, User_init_zero, false, Position_init_zero, 0, 0, false, DeviceMetrics_init_zero} #define NodeInfo_init_zero {0, false, User_init_zero, false, Position_init_zero, 0, 0, false, DeviceMetrics_init_zero}
#define MyNodeInfo_init_zero {0, 0, 0, "", _CriticalErrorCode_MIN, 0, 0, 0, 0, 0, 0, 0, {0, 0, 0, 0, 0, 0, 0, 0}, 0, {0, 0, 0, 0, 0, 0, 0, 0}, 0, 0, 0} #define MyNodeInfo_init_zero {0, 0, 0, "", _CriticalErrorCode_MIN, 0, 0, 0, 0, 0, 0, 0, {0, 0, 0, 0, 0, 0, 0, 0}, 0, {0, 0, 0, 0, 0, 0, 0, 0}, 0, 0, 0}
#define LogRecord_init_zero {"", 0, "", _LogRecord_Level_MIN} #define LogRecord_init_zero {"", 0, "", _LogRecord_Level_MIN}
#define QueueStatus_init_zero {0, 0, 0, 0} #define QueueStatus_init_zero {0, 0, 0, 0}
#define FromRadio_init_zero {0, 0, {MeshPacket_init_zero}} #define FromRadio_init_zero {0, 0, {MeshPacket_init_zero}}
#define ToRadio_init_zero {0, {MeshPacket_init_zero}} #define ToRadio_init_zero {0, {MeshPacket_init_zero}}
#define Compressed_init_zero {_PortNum_MIN, {0, {0}}} #define Compressed_init_zero {_PortNum_MIN, {0, {0}}}
/* Field tags (for use in manual encoding/decoding) */ /* Field tags (for use in manual encoding/decoding) */
#define Position_latitude_i_tag 1 #define Position_latitude_i_tag 1
#define Position_longitude_i_tag 2 #define Position_longitude_i_tag 2
#define Position_altitude_tag 3 #define Position_altitude_tag 3
#define Position_time_tag 4 #define Position_time_tag 4
#define Position_location_source_tag 5 #define Position_location_source_tag 5
#define Position_altitude_source_tag 6 #define Position_altitude_source_tag 6
#define Position_timestamp_tag 7 #define Position_timestamp_tag 7
#define Position_timestamp_millis_adjust_tag 8 #define Position_timestamp_millis_adjust_tag 8
#define Position_altitude_hae_tag 9 #define Position_altitude_hae_tag 9
#define Position_altitude_geoidal_separation_tag 10 #define Position_altitude_geoidal_separation_tag 10
#define Position_PDOP_tag 11 #define Position_PDOP_tag 11
#define Position_HDOP_tag 12 #define Position_HDOP_tag 12
#define Position_VDOP_tag 13 #define Position_VDOP_tag 13
#define Position_gps_accuracy_tag 14 #define Position_gps_accuracy_tag 14
#define Position_ground_speed_tag 15 #define Position_ground_speed_tag 15
#define Position_ground_track_tag 16 #define Position_ground_track_tag 16
#define Position_fix_quality_tag 17 #define Position_fix_quality_tag 17
#define Position_fix_type_tag 18 #define Position_fix_type_tag 18
#define Position_sats_in_view_tag 19 #define Position_sats_in_view_tag 19
#define Position_sensor_id_tag 20 #define Position_sensor_id_tag 20
#define Position_next_update_tag 21 #define Position_next_update_tag 21
#define Position_seq_number_tag 22 #define Position_seq_number_tag 22
#define User_id_tag 1 #define User_id_tag 1
#define User_long_name_tag 2 #define User_long_name_tag 2
#define User_short_name_tag 3 #define User_short_name_tag 3
#define User_macaddr_tag 4 #define User_macaddr_tag 4
#define User_hw_model_tag 5 #define User_hw_model_tag 5
#define User_is_licensed_tag 6 #define User_is_licensed_tag 6
#define RouteDiscovery_route_tag 1 #define RouteDiscovery_route_tag 1
#define Routing_route_request_tag 1 #define Routing_route_request_tag 1
#define Routing_route_reply_tag 2 #define Routing_route_reply_tag 2
#define Routing_error_reason_tag 3 #define Routing_error_reason_tag 3
#define Data_portnum_tag 1 #define Data_portnum_tag 1
#define Data_payload_tag 2 #define Data_payload_tag 2
#define Data_want_response_tag 3 #define Data_want_response_tag 3
#define Data_dest_tag 4 #define Data_dest_tag 4
#define Data_source_tag 5 #define Data_source_tag 5
#define Data_request_id_tag 6 #define Data_request_id_tag 6
#define Data_reply_id_tag 7 #define Data_reply_id_tag 7
#define Data_emoji_tag 8 #define Data_emoji_tag 8
#define Waypoint_id_tag 1 #define Waypoint_id_tag 1
#define Waypoint_latitude_i_tag 2 #define Waypoint_latitude_i_tag 2
#define Waypoint_longitude_i_tag 3 #define Waypoint_longitude_i_tag 3
#define Waypoint_expire_tag 4 #define Waypoint_expire_tag 4
#define Waypoint_locked_to_tag 5 #define Waypoint_locked_to_tag 5
#define Waypoint_name_tag 6 #define Waypoint_name_tag 6
#define Waypoint_description_tag 7 #define Waypoint_description_tag 7
#define Waypoint_icon_tag 8 #define Waypoint_icon_tag 8
#define MeshPacket_from_tag 1 #define MeshPacket_from_tag 1
#define MeshPacket_to_tag 2 #define MeshPacket_to_tag 2
#define MeshPacket_channel_tag 3 #define MeshPacket_channel_tag 3
#define MeshPacket_decoded_tag 4 #define MeshPacket_decoded_tag 4
#define MeshPacket_encrypted_tag 5 #define MeshPacket_encrypted_tag 5
#define MeshPacket_id_tag 6 #define MeshPacket_id_tag 6
#define MeshPacket_rx_time_tag 7 #define MeshPacket_rx_time_tag 7
#define MeshPacket_rx_snr_tag 8 #define MeshPacket_rx_snr_tag 8
#define MeshPacket_hop_limit_tag 9 #define MeshPacket_hop_limit_tag 9
#define MeshPacket_want_ack_tag 10 #define MeshPacket_want_ack_tag 10
#define MeshPacket_priority_tag 11 #define MeshPacket_priority_tag 11
#define MeshPacket_rx_rssi_tag 12 #define MeshPacket_rx_rssi_tag 12
#define MeshPacket_delayed_tag 13 #define MeshPacket_delayed_tag 13
#define NodeInfo_num_tag 1 #define NodeInfo_num_tag 1
#define NodeInfo_user_tag 2 #define NodeInfo_user_tag 2
#define NodeInfo_position_tag 3 #define NodeInfo_position_tag 3
#define NodeInfo_snr_tag 4 #define NodeInfo_snr_tag 4
#define NodeInfo_last_heard_tag 5 #define NodeInfo_last_heard_tag 5
#define NodeInfo_device_metrics_tag 6 #define NodeInfo_device_metrics_tag 6
#define MyNodeInfo_my_node_num_tag 1 #define MyNodeInfo_my_node_num_tag 1
#define MyNodeInfo_has_gps_tag 2 #define MyNodeInfo_has_gps_tag 2
#define MyNodeInfo_max_channels_tag 3 #define MyNodeInfo_max_channels_tag 3
#define MyNodeInfo_firmware_version_tag 4 #define MyNodeInfo_firmware_version_tag 4
#define MyNodeInfo_error_code_tag 5 #define MyNodeInfo_error_code_tag 5
#define MyNodeInfo_error_address_tag 6 #define MyNodeInfo_error_address_tag 6
#define MyNodeInfo_error_count_tag 7 #define MyNodeInfo_error_count_tag 7
#define MyNodeInfo_reboot_count_tag 8 #define MyNodeInfo_reboot_count_tag 8
#define MyNodeInfo_bitrate_tag 9 #define MyNodeInfo_bitrate_tag 9
#define MyNodeInfo_message_timeout_msec_tag 10 #define MyNodeInfo_message_timeout_msec_tag 10
#define MyNodeInfo_min_app_version_tag 11 #define MyNodeInfo_min_app_version_tag 11
#define MyNodeInfo_air_period_tx_tag 12 #define MyNodeInfo_air_period_tx_tag 12
#define MyNodeInfo_air_period_rx_tag 13 #define MyNodeInfo_air_period_rx_tag 13
#define MyNodeInfo_has_wifi_tag 14 #define MyNodeInfo_has_wifi_tag 14
#define MyNodeInfo_channel_utilization_tag 15 #define MyNodeInfo_channel_utilization_tag 15
#define MyNodeInfo_air_util_tx_tag 16 #define MyNodeInfo_air_util_tx_tag 16
#define LogRecord_message_tag 1 #define LogRecord_message_tag 1
#define LogRecord_time_tag 2 #define LogRecord_time_tag 2
#define LogRecord_source_tag 3 #define LogRecord_source_tag 3
#define LogRecord_level_tag 4 #define LogRecord_level_tag 4
#define QueueStatus_res_tag 1 #define QueueStatus_res_tag 1
#define QueueStatus_free_tag 2 #define QueueStatus_free_tag 2
#define QueueStatus_maxlen_tag 3 #define QueueStatus_maxlen_tag 3
#define QueueStatus_mesh_packet_id_tag 4 #define QueueStatus_mesh_packet_id_tag 4
#define FromRadio_id_tag 1 #define FromRadio_id_tag 1
#define FromRadio_packet_tag 2 #define FromRadio_packet_tag 2
#define FromRadio_my_info_tag 3 #define FromRadio_my_info_tag 3
#define FromRadio_node_info_tag 4 #define FromRadio_node_info_tag 4
#define FromRadio_config_tag 5 #define FromRadio_config_tag 5
#define FromRadio_log_record_tag 6 #define FromRadio_log_record_tag 6
#define FromRadio_config_complete_id_tag 7 #define FromRadio_config_complete_id_tag 7
#define FromRadio_rebooted_tag 8 #define FromRadio_rebooted_tag 8
#define FromRadio_moduleConfig_tag 9 #define FromRadio_moduleConfig_tag 9
#define FromRadio_channel_tag 10 #define FromRadio_channel_tag 10
#define FromRadio_queueStatus_tag 11 #define FromRadio_queueStatus_tag 11
#define FromRadio_xmodemPacket_tag 12 #define FromRadio_xmodemPacket_tag 12
#define ToRadio_packet_tag 1 #define ToRadio_packet_tag 1
#define ToRadio_want_config_id_tag 3 #define ToRadio_want_config_id_tag 3
#define ToRadio_disconnect_tag 4 #define ToRadio_disconnect_tag 4
#define ToRadio_xmodemPacket_tag 5 #define ToRadio_xmodemPacket_tag 5
#define Compressed_portnum_tag 1 #define Compressed_portnum_tag 1
#define Compressed_data_tag 2 #define Compressed_data_tag 2
/* Struct field encoding specification for nanopb */ /* Struct field encoding specification for nanopb */
#define Position_FIELDLIST(X, a) \ #define Position_FIELDLIST(X, a) \
@@ -1136,20 +1136,20 @@ extern const pb_msgdesc_t Compressed_msg;
#define Compressed_fields &Compressed_msg #define Compressed_fields &Compressed_msg
/* Maximum encoded size of messages (where known) */ /* Maximum encoded size of messages (where known) */
#define Compressed_size 243 #define Compressed_size 243
#define Data_size 270 #define Data_size 270
#define FromRadio_size 330 #define FromRadio_size 330
#define LogRecord_size 81 #define LogRecord_size 81
#define MeshPacket_size 321 #define MeshPacket_size 321
#define MyNodeInfo_size 179 #define MyNodeInfo_size 179
#define NodeInfo_size 258 #define NodeInfo_size 258
#define Position_size 137 #define Position_size 137
#define QueueStatus_size 23 #define QueueStatus_size 23
#define RouteDiscovery_size 40 #define RouteDiscovery_size 40
#define Routing_size 42 #define Routing_size 42
#define ToRadio_size 324 #define ToRadio_size 324
#define User_size 77 #define User_size 77
#define Waypoint_size 165 #define Waypoint_size 165
#ifdef __cplusplus #ifdef __cplusplus
} /* extern "C" */ } /* extern "C" */
@@ -1,7 +1,7 @@
/* Automatically generated nanopb constant definitions */ /* Automatically generated nanopb constant definitions */
/* Generated by nanopb-0.4.7 */ /* Generated by nanopb-0.4.7 */
#include "module_config.pb.h" #include "./module_config.pb.h"
#if PB_PROTO_HEADER_VERSION != 40 #if PB_PROTO_HEADER_VERSION != 40
#error Regenerate this file with the current version of nanopb generator. #error Regenerate this file with the current version of nanopb generator.
#endif #endif
@@ -1,8 +1,8 @@
/* Automatically generated nanopb header */ /* Automatically generated nanopb header */
/* Generated by nanopb-0.4.7 */ /* Generated by nanopb-0.4.7 */
#ifndef PB_MODULE_CONFIG_PB_H_INCLUDED #ifndef PB_MESHTASTIC_MESHTASTIC_MODULE_CONFIG_PB_H_INCLUDED
#define PB_MODULE_CONFIG_PB_H_INCLUDED #define PB_MESHTASTIC_MESHTASTIC_MODULE_CONFIG_PB_H_INCLUDED
#include <pb.h> #include <pb.h>
#if PB_PROTO_HEADER_VERSION != 40 #if PB_PROTO_HEADER_VERSION != 40
@@ -317,49 +317,49 @@ extern "C" {
/* Initializer values for message structs */ /* Initializer values for message structs */
#define ModuleConfig_init_default {0, {ModuleConfig_MQTTConfig_init_default}} #define ModuleConfig_init_default {0, {ModuleConfig_MQTTConfig_init_default}}
#define ModuleConfig_MQTTConfig_init_default {0, "", "", "", 0, 0} #define ModuleConfig_MQTTConfig_init_default {0, "", "", "", 0, 0}
#define ModuleConfig_RemoteHardwareConfig_init_default {0} #define ModuleConfig_RemoteHardwareConfig_init_default {0}
#define ModuleConfig_AudioConfig_init_default {0, 0, _ModuleConfig_AudioConfig_Audio_Baud_MIN, 0, 0, 0, 0} #define ModuleConfig_AudioConfig_init_default {0, 0, _ModuleConfig_AudioConfig_Audio_Baud_MIN, 0, 0, 0, 0}
#define ModuleConfig_SerialConfig_init_default {0, 0, 0, 0, _ModuleConfig_SerialConfig_Serial_Baud_MIN, 0, _ModuleConfig_SerialConfig_Serial_Mode_MIN} #define ModuleConfig_SerialConfig_init_default {0, 0, 0, 0, _ModuleConfig_SerialConfig_Serial_Baud_MIN, 0, _ModuleConfig_SerialConfig_Serial_Mode_MIN}
#define ModuleConfig_ExternalNotificationConfig_init_default {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0} #define ModuleConfig_ExternalNotificationConfig_init_default {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}
#define ModuleConfig_StoreForwardConfig_init_default {0, 0, 0, 0, 0} #define ModuleConfig_StoreForwardConfig_init_default {0, 0, 0, 0, 0}
#define ModuleConfig_RangeTestConfig_init_default {0, 0, 0} #define ModuleConfig_RangeTestConfig_init_default {0, 0, 0}
#define ModuleConfig_TelemetryConfig_init_default {0, 0, 0, 0, 0} #define ModuleConfig_TelemetryConfig_init_default {0, 0, 0, 0, 0}
#define ModuleConfig_CannedMessageConfig_init_default {0, 0, 0, 0, _ModuleConfig_CannedMessageConfig_InputEventChar_MIN, _ModuleConfig_CannedMessageConfig_InputEventChar_MIN, _ModuleConfig_CannedMessageConfig_InputEventChar_MIN, 0, 0, "", 0} #define ModuleConfig_CannedMessageConfig_init_default {0, 0, 0, 0, _ModuleConfig_CannedMessageConfig_InputEventChar_MIN, _ModuleConfig_CannedMessageConfig_InputEventChar_MIN, _ModuleConfig_CannedMessageConfig_InputEventChar_MIN, 0, 0, "", 0}
#define ModuleConfig_init_zero {0, {ModuleConfig_MQTTConfig_init_zero}} #define ModuleConfig_init_zero {0, {ModuleConfig_MQTTConfig_init_zero}}
#define ModuleConfig_MQTTConfig_init_zero {0, "", "", "", 0, 0} #define ModuleConfig_MQTTConfig_init_zero {0, "", "", "", 0, 0}
#define ModuleConfig_RemoteHardwareConfig_init_zero {0} #define ModuleConfig_RemoteHardwareConfig_init_zero {0}
#define ModuleConfig_AudioConfig_init_zero {0, 0, _ModuleConfig_AudioConfig_Audio_Baud_MIN, 0, 0, 0, 0} #define ModuleConfig_AudioConfig_init_zero {0, 0, _ModuleConfig_AudioConfig_Audio_Baud_MIN, 0, 0, 0, 0}
#define ModuleConfig_SerialConfig_init_zero {0, 0, 0, 0, _ModuleConfig_SerialConfig_Serial_Baud_MIN, 0, _ModuleConfig_SerialConfig_Serial_Mode_MIN} #define ModuleConfig_SerialConfig_init_zero {0, 0, 0, 0, _ModuleConfig_SerialConfig_Serial_Baud_MIN, 0, _ModuleConfig_SerialConfig_Serial_Mode_MIN}
#define ModuleConfig_ExternalNotificationConfig_init_zero {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0} #define ModuleConfig_ExternalNotificationConfig_init_zero {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}
#define ModuleConfig_StoreForwardConfig_init_zero {0, 0, 0, 0, 0} #define ModuleConfig_StoreForwardConfig_init_zero {0, 0, 0, 0, 0}
#define ModuleConfig_RangeTestConfig_init_zero {0, 0, 0} #define ModuleConfig_RangeTestConfig_init_zero {0, 0, 0}
#define ModuleConfig_TelemetryConfig_init_zero {0, 0, 0, 0, 0} #define ModuleConfig_TelemetryConfig_init_zero {0, 0, 0, 0, 0}
#define ModuleConfig_CannedMessageConfig_init_zero {0, 0, 0, 0, _ModuleConfig_CannedMessageConfig_InputEventChar_MIN, _ModuleConfig_CannedMessageConfig_InputEventChar_MIN, _ModuleConfig_CannedMessageConfig_InputEventChar_MIN, 0, 0, "", 0} #define ModuleConfig_CannedMessageConfig_init_zero {0, 0, 0, 0, _ModuleConfig_CannedMessageConfig_InputEventChar_MIN, _ModuleConfig_CannedMessageConfig_InputEventChar_MIN, _ModuleConfig_CannedMessageConfig_InputEventChar_MIN, 0, 0, "", 0}
/* Field tags (for use in manual encoding/decoding) */ /* Field tags (for use in manual encoding/decoding) */
#define ModuleConfig_MQTTConfig_enabled_tag 1 #define ModuleConfig_MQTTConfig_enabled_tag 1
#define ModuleConfig_MQTTConfig_address_tag 2 #define ModuleConfig_MQTTConfig_address_tag 2
#define ModuleConfig_MQTTConfig_username_tag 3 #define ModuleConfig_MQTTConfig_username_tag 3
#define ModuleConfig_MQTTConfig_password_tag 4 #define ModuleConfig_MQTTConfig_password_tag 4
#define ModuleConfig_MQTTConfig_encryption_enabled_tag 5 #define ModuleConfig_MQTTConfig_encryption_enabled_tag 5
#define ModuleConfig_MQTTConfig_json_enabled_tag 6 #define ModuleConfig_MQTTConfig_json_enabled_tag 6
#define ModuleConfig_RemoteHardwareConfig_enabled_tag 1 #define ModuleConfig_RemoteHardwareConfig_enabled_tag 1
#define ModuleConfig_AudioConfig_codec2_enabled_tag 1 #define ModuleConfig_AudioConfig_codec2_enabled_tag 1
#define ModuleConfig_AudioConfig_ptt_pin_tag 2 #define ModuleConfig_AudioConfig_ptt_pin_tag 2
#define ModuleConfig_AudioConfig_bitrate_tag 3 #define ModuleConfig_AudioConfig_bitrate_tag 3
#define ModuleConfig_AudioConfig_i2s_ws_tag 4 #define ModuleConfig_AudioConfig_i2s_ws_tag 4
#define ModuleConfig_AudioConfig_i2s_sd_tag 5 #define ModuleConfig_AudioConfig_i2s_sd_tag 5
#define ModuleConfig_AudioConfig_i2s_din_tag 6 #define ModuleConfig_AudioConfig_i2s_din_tag 6
#define ModuleConfig_AudioConfig_i2s_sck_tag 7 #define ModuleConfig_AudioConfig_i2s_sck_tag 7
#define ModuleConfig_SerialConfig_enabled_tag 1 #define ModuleConfig_SerialConfig_enabled_tag 1
#define ModuleConfig_SerialConfig_echo_tag 2 #define ModuleConfig_SerialConfig_echo_tag 2
#define ModuleConfig_SerialConfig_rxd_tag 3 #define ModuleConfig_SerialConfig_rxd_tag 3
#define ModuleConfig_SerialConfig_txd_tag 4 #define ModuleConfig_SerialConfig_txd_tag 4
#define ModuleConfig_SerialConfig_baud_tag 5 #define ModuleConfig_SerialConfig_baud_tag 5
#define ModuleConfig_SerialConfig_timeout_tag 6 #define ModuleConfig_SerialConfig_timeout_tag 6
#define ModuleConfig_SerialConfig_mode_tag 7 #define ModuleConfig_SerialConfig_mode_tag 7
#define ModuleConfig_ExternalNotificationConfig_enabled_tag 1 #define ModuleConfig_ExternalNotificationConfig_enabled_tag 1
#define ModuleConfig_ExternalNotificationConfig_output_ms_tag 2 #define ModuleConfig_ExternalNotificationConfig_output_ms_tag 2
#define ModuleConfig_ExternalNotificationConfig_output_tag 3 #define ModuleConfig_ExternalNotificationConfig_output_tag 3
@@ -380,8 +380,8 @@ extern "C" {
#define ModuleConfig_StoreForwardConfig_history_return_max_tag 4 #define ModuleConfig_StoreForwardConfig_history_return_max_tag 4
#define ModuleConfig_StoreForwardConfig_history_return_window_tag 5 #define ModuleConfig_StoreForwardConfig_history_return_window_tag 5
#define ModuleConfig_RangeTestConfig_enabled_tag 1 #define ModuleConfig_RangeTestConfig_enabled_tag 1
#define ModuleConfig_RangeTestConfig_sender_tag 2 #define ModuleConfig_RangeTestConfig_sender_tag 2
#define ModuleConfig_RangeTestConfig_save_tag 3 #define ModuleConfig_RangeTestConfig_save_tag 3
#define ModuleConfig_TelemetryConfig_device_update_interval_tag 1 #define ModuleConfig_TelemetryConfig_device_update_interval_tag 1
#define ModuleConfig_TelemetryConfig_environment_update_interval_tag 2 #define ModuleConfig_TelemetryConfig_environment_update_interval_tag 2
#define ModuleConfig_TelemetryConfig_environment_measurement_enabled_tag 3 #define ModuleConfig_TelemetryConfig_environment_measurement_enabled_tag 3
@@ -398,15 +398,15 @@ extern "C" {
#define ModuleConfig_CannedMessageConfig_enabled_tag 9 #define ModuleConfig_CannedMessageConfig_enabled_tag 9
#define ModuleConfig_CannedMessageConfig_allow_input_source_tag 10 #define ModuleConfig_CannedMessageConfig_allow_input_source_tag 10
#define ModuleConfig_CannedMessageConfig_send_bell_tag 11 #define ModuleConfig_CannedMessageConfig_send_bell_tag 11
#define ModuleConfig_mqtt_tag 1 #define ModuleConfig_mqtt_tag 1
#define ModuleConfig_serial_tag 2 #define ModuleConfig_serial_tag 2
#define ModuleConfig_external_notification_tag 3 #define ModuleConfig_external_notification_tag 3
#define ModuleConfig_store_forward_tag 4 #define ModuleConfig_store_forward_tag 4
#define ModuleConfig_range_test_tag 5 #define ModuleConfig_range_test_tag 5
#define ModuleConfig_telemetry_tag 6 #define ModuleConfig_telemetry_tag 6
#define ModuleConfig_canned_message_tag 7 #define ModuleConfig_canned_message_tag 7
#define ModuleConfig_audio_tag 8 #define ModuleConfig_audio_tag 8
#define ModuleConfig_remote_hardware_tag 9 #define ModuleConfig_remote_hardware_tag 9
/* Struct field encoding specification for nanopb */ /* Struct field encoding specification for nanopb */
#define ModuleConfig_FIELDLIST(X, a) \ #define ModuleConfig_FIELDLIST(X, a) \
@@ -550,16 +550,16 @@ extern const pb_msgdesc_t ModuleConfig_CannedMessageConfig_msg;
#define ModuleConfig_CannedMessageConfig_fields &ModuleConfig_CannedMessageConfig_msg #define ModuleConfig_CannedMessageConfig_fields &ModuleConfig_CannedMessageConfig_msg
/* Maximum encoded size of messages (where known) */ /* Maximum encoded size of messages (where known) */
#define ModuleConfig_AudioConfig_size 19 #define ModuleConfig_AudioConfig_size 19
#define ModuleConfig_CannedMessageConfig_size 49 #define ModuleConfig_CannedMessageConfig_size 49
#define ModuleConfig_ExternalNotificationConfig_size 40 #define ModuleConfig_ExternalNotificationConfig_size 40
#define ModuleConfig_MQTTConfig_size 201 #define ModuleConfig_MQTTConfig_size 201
#define ModuleConfig_RangeTestConfig_size 10 #define ModuleConfig_RangeTestConfig_size 10
#define ModuleConfig_RemoteHardwareConfig_size 2 #define ModuleConfig_RemoteHardwareConfig_size 2
#define ModuleConfig_SerialConfig_size 26 #define ModuleConfig_SerialConfig_size 26
#define ModuleConfig_StoreForwardConfig_size 22 #define ModuleConfig_StoreForwardConfig_size 22
#define ModuleConfig_TelemetryConfig_size 18 #define ModuleConfig_TelemetryConfig_size 18
#define ModuleConfig_size 204 #define ModuleConfig_size 204
#ifdef __cplusplus #ifdef __cplusplus
} /* extern "C" */ } /* extern "C" */
@@ -1,7 +1,7 @@
/* Automatically generated nanopb constant definitions */ /* Automatically generated nanopb constant definitions */
/* Generated by nanopb-0.4.7 */ /* Generated by nanopb-0.4.7 */
#include "mqtt.pb.h" #include "./mqtt.pb.h"
#if PB_PROTO_HEADER_VERSION != 40 #if PB_PROTO_HEADER_VERSION != 40
#error Regenerate this file with the current version of nanopb generator. #error Regenerate this file with the current version of nanopb generator.
#endif #endif
@@ -1,10 +1,10 @@
/* Automatically generated nanopb header */ /* Automatically generated nanopb header */
/* Generated by nanopb-0.4.7 */ /* Generated by nanopb-0.4.7 */
#ifndef PB_MQTT_PB_H_INCLUDED #ifndef PB_MESHTASTIC_MESHTASTIC_MQTT_PB_H_INCLUDED
#define PB_MQTT_PB_H_INCLUDED #define PB_MESHTASTIC_MESHTASTIC_MQTT_PB_H_INCLUDED
#include <pb.h> #include <pb.h>
#include "mesh.pb.h" #include "./mesh.pb.h"
#if PB_PROTO_HEADER_VERSION != 40 #if PB_PROTO_HEADER_VERSION != 40
#error Regenerate this file with the current version of nanopb generator. #error Regenerate this file with the current version of nanopb generator.
@@ -29,13 +29,13 @@ extern "C" {
#endif #endif
/* Initializer values for message structs */ /* Initializer values for message structs */
#define ServiceEnvelope_init_default {NULL, NULL, NULL} #define ServiceEnvelope_init_default {NULL, NULL, NULL}
#define ServiceEnvelope_init_zero {NULL, NULL, NULL} #define ServiceEnvelope_init_zero {NULL, NULL, NULL}
/* Field tags (for use in manual encoding/decoding) */ /* Field tags (for use in manual encoding/decoding) */
#define ServiceEnvelope_packet_tag 1 #define ServiceEnvelope_packet_tag 1
#define ServiceEnvelope_channel_id_tag 2 #define ServiceEnvelope_channel_id_tag 2
#define ServiceEnvelope_gateway_id_tag 3 #define ServiceEnvelope_gateway_id_tag 3
/* Struct field encoding specification for nanopb */ /* Struct field encoding specification for nanopb */
#define ServiceEnvelope_FIELDLIST(X, a) \ #define ServiceEnvelope_FIELDLIST(X, a) \
@@ -1,7 +1,7 @@
/* Automatically generated nanopb constant definitions */ /* Automatically generated nanopb constant definitions */
/* Generated by nanopb-0.4.7 */ /* Generated by nanopb-0.4.7 */
#include "portnums.pb.h" #include "./portnums.pb.h"
#if PB_PROTO_HEADER_VERSION != 40 #if PB_PROTO_HEADER_VERSION != 40
#error Regenerate this file with the current version of nanopb generator. #error Regenerate this file with the current version of nanopb generator.
#endif #endif
@@ -1,8 +1,8 @@
/* Automatically generated nanopb header */ /* Automatically generated nanopb header */
/* Generated by nanopb-0.4.7 */ /* Generated by nanopb-0.4.7 */
#ifndef PB_PORTNUMS_PB_H_INCLUDED #ifndef PB_MESHTASTIC_MESHTASTIC_PORTNUMS_PB_H_INCLUDED
#define PB_PORTNUMS_PB_H_INCLUDED #define PB_MESHTASTIC_MESHTASTIC_PORTNUMS_PB_H_INCLUDED
#include <pb.h> #include <pb.h>
#if PB_PROTO_HEADER_VERSION != 40 #if PB_PROTO_HEADER_VERSION != 40
@@ -1,7 +1,7 @@
/* Automatically generated nanopb constant definitions */ /* Automatically generated nanopb constant definitions */
/* Generated by nanopb-0.4.7 */ /* Generated by nanopb-0.4.7 */
#include "remote_hardware.pb.h" #include "./remote_hardware.pb.h"
#if PB_PROTO_HEADER_VERSION != 40 #if PB_PROTO_HEADER_VERSION != 40
#error Regenerate this file with the current version of nanopb generator. #error Regenerate this file with the current version of nanopb generator.
#endif #endif
@@ -1,8 +1,8 @@
/* Automatically generated nanopb header */ /* Automatically generated nanopb header */
/* Generated by nanopb-0.4.7 */ /* Generated by nanopb-0.4.7 */
#ifndef PB_REMOTE_HARDWARE_PB_H_INCLUDED #ifndef PB_MESHTASTIC_MESHTASTIC_REMOTE_HARDWARE_PB_H_INCLUDED
#define PB_REMOTE_HARDWARE_PB_H_INCLUDED #define PB_MESHTASTIC_MESHTASTIC_REMOTE_HARDWARE_PB_H_INCLUDED
#include <pb.h> #include <pb.h>
#if PB_PROTO_HEADER_VERSION != 40 #if PB_PROTO_HEADER_VERSION != 40
@@ -62,13 +62,13 @@ extern "C" {
/* Initializer values for message structs */ /* Initializer values for message structs */
#define HardwareMessage_init_default {_HardwareMessage_Type_MIN, 0, 0} #define HardwareMessage_init_default {_HardwareMessage_Type_MIN, 0, 0}
#define HardwareMessage_init_zero {_HardwareMessage_Type_MIN, 0, 0} #define HardwareMessage_init_zero {_HardwareMessage_Type_MIN, 0, 0}
/* Field tags (for use in manual encoding/decoding) */ /* Field tags (for use in manual encoding/decoding) */
#define HardwareMessage_type_tag 1 #define HardwareMessage_type_tag 1
#define HardwareMessage_gpio_mask_tag 2 #define HardwareMessage_gpio_mask_tag 2
#define HardwareMessage_gpio_value_tag 3 #define HardwareMessage_gpio_value_tag 3
/* Struct field encoding specification for nanopb */ /* Struct field encoding specification for nanopb */
#define HardwareMessage_FIELDLIST(X, a) \ #define HardwareMessage_FIELDLIST(X, a) \
@@ -84,7 +84,7 @@ extern const pb_msgdesc_t HardwareMessage_msg;
#define HardwareMessage_fields &HardwareMessage_msg #define HardwareMessage_fields &HardwareMessage_msg
/* Maximum encoded size of messages (where known) */ /* Maximum encoded size of messages (where known) */
#define HardwareMessage_size 24 #define HardwareMessage_size 24
#ifdef __cplusplus #ifdef __cplusplus
} /* extern "C" */ } /* extern "C" */
@@ -1,7 +1,7 @@
/* Automatically generated nanopb constant definitions */ /* Automatically generated nanopb constant definitions */
/* Generated by nanopb-0.4.7 */ /* Generated by nanopb-0.4.7 */
#include "rtttl.pb.h" #include "./rtttl.pb.h"
#if PB_PROTO_HEADER_VERSION != 40 #if PB_PROTO_HEADER_VERSION != 40
#error Regenerate this file with the current version of nanopb generator. #error Regenerate this file with the current version of nanopb generator.
#endif #endif
@@ -1,8 +1,8 @@
/* Automatically generated nanopb header */ /* Automatically generated nanopb header */
/* Generated by nanopb-0.4.7 */ /* Generated by nanopb-0.4.7 */
#ifndef PB_RTTTL_PB_H_INCLUDED #ifndef PB_MESHTASTIC_MESHTASTIC_RTTTL_PB_H_INCLUDED
#define PB_RTTTL_PB_H_INCLUDED #define PB_MESHTASTIC_MESHTASTIC_RTTTL_PB_H_INCLUDED
#include <pb.h> #include <pb.h>
#if PB_PROTO_HEADER_VERSION != 40 #if PB_PROTO_HEADER_VERSION != 40
@@ -22,11 +22,11 @@ extern "C" {
#endif #endif
/* Initializer values for message structs */ /* Initializer values for message structs */
#define RTTTLConfig_init_default {""} #define RTTTLConfig_init_default {""}
#define RTTTLConfig_init_zero {""} #define RTTTLConfig_init_zero {""}
/* Field tags (for use in manual encoding/decoding) */ /* Field tags (for use in manual encoding/decoding) */
#define RTTTLConfig_ringtone_tag 1 #define RTTTLConfig_ringtone_tag 1
/* Struct field encoding specification for nanopb */ /* Struct field encoding specification for nanopb */
#define RTTTLConfig_FIELDLIST(X, a) \ #define RTTTLConfig_FIELDLIST(X, a) \
@@ -40,7 +40,7 @@ extern const pb_msgdesc_t RTTTLConfig_msg;
#define RTTTLConfig_fields &RTTTLConfig_msg #define RTTTLConfig_fields &RTTTLConfig_msg
/* Maximum encoded size of messages (where known) */ /* Maximum encoded size of messages (where known) */
#define RTTTLConfig_size 232 #define RTTTLConfig_size 232
#ifdef __cplusplus #ifdef __cplusplus
} /* extern "C" */ } /* extern "C" */
@@ -1,7 +1,7 @@
/* Automatically generated nanopb constant definitions */ /* Automatically generated nanopb constant definitions */
/* Generated by nanopb-0.4.7 */ /* Generated by nanopb-0.4.7 */
#include "storeforward.pb.h" #include "./storeforward.pb.h"
#if PB_PROTO_HEADER_VERSION != 40 #if PB_PROTO_HEADER_VERSION != 40
#error Regenerate this file with the current version of nanopb generator. #error Regenerate this file with the current version of nanopb generator.
#endif #endif
@@ -1,8 +1,8 @@
/* Automatically generated nanopb header */ /* Automatically generated nanopb header */
/* Generated by nanopb-0.4.7 */ /* Generated by nanopb-0.4.7 */
#ifndef PB_STOREFORWARD_PB_H_INCLUDED #ifndef PB_MESHTASTIC_MESHTASTIC_STOREFORWARD_PB_H_INCLUDED
#define PB_STOREFORWARD_PB_H_INCLUDED #define PB_MESHTASTIC_MESHTASTIC_STOREFORWARD_PB_H_INCLUDED
#include <pb.h> #include <pb.h>
#if PB_PROTO_HEADER_VERSION != 40 #if PB_PROTO_HEADER_VERSION != 40
@@ -120,35 +120,35 @@ extern "C" {
/* Initializer values for message structs */ /* Initializer values for message structs */
#define StoreAndForward_init_default {_StoreAndForward_RequestResponse_MIN, 0, {StoreAndForward_Statistics_init_default}} #define StoreAndForward_init_default {_StoreAndForward_RequestResponse_MIN, 0, {StoreAndForward_Statistics_init_default}}
#define StoreAndForward_Statistics_init_default {0, 0, 0, 0, 0, 0, 0, 0, 0} #define StoreAndForward_Statistics_init_default {0, 0, 0, 0, 0, 0, 0, 0, 0}
#define StoreAndForward_History_init_default {0, 0, 0} #define StoreAndForward_History_init_default {0, 0, 0}
#define StoreAndForward_Heartbeat_init_default {0, 0} #define StoreAndForward_Heartbeat_init_default {0, 0}
#define StoreAndForward_init_zero {_StoreAndForward_RequestResponse_MIN, 0, {StoreAndForward_Statistics_init_zero}} #define StoreAndForward_init_zero {_StoreAndForward_RequestResponse_MIN, 0, {StoreAndForward_Statistics_init_zero}}
#define StoreAndForward_Statistics_init_zero {0, 0, 0, 0, 0, 0, 0, 0, 0} #define StoreAndForward_Statistics_init_zero {0, 0, 0, 0, 0, 0, 0, 0, 0}
#define StoreAndForward_History_init_zero {0, 0, 0} #define StoreAndForward_History_init_zero {0, 0, 0}
#define StoreAndForward_Heartbeat_init_zero {0, 0} #define StoreAndForward_Heartbeat_init_zero {0, 0}
/* Field tags (for use in manual encoding/decoding) */ /* Field tags (for use in manual encoding/decoding) */
#define StoreAndForward_Statistics_messages_total_tag 1 #define StoreAndForward_Statistics_messages_total_tag 1
#define StoreAndForward_Statistics_messages_saved_tag 2 #define StoreAndForward_Statistics_messages_saved_tag 2
#define StoreAndForward_Statistics_messages_max_tag 3 #define StoreAndForward_Statistics_messages_max_tag 3
#define StoreAndForward_Statistics_up_time_tag 4 #define StoreAndForward_Statistics_up_time_tag 4
#define StoreAndForward_Statistics_requests_tag 5 #define StoreAndForward_Statistics_requests_tag 5
#define StoreAndForward_Statistics_requests_history_tag 6 #define StoreAndForward_Statistics_requests_history_tag 6
#define StoreAndForward_Statistics_heartbeat_tag 7 #define StoreAndForward_Statistics_heartbeat_tag 7
#define StoreAndForward_Statistics_return_max_tag 8 #define StoreAndForward_Statistics_return_max_tag 8
#define StoreAndForward_Statistics_return_window_tag 9 #define StoreAndForward_Statistics_return_window_tag 9
#define StoreAndForward_History_history_messages_tag 1 #define StoreAndForward_History_history_messages_tag 1
#define StoreAndForward_History_window_tag 2 #define StoreAndForward_History_window_tag 2
#define StoreAndForward_History_last_request_tag 3 #define StoreAndForward_History_last_request_tag 3
#define StoreAndForward_Heartbeat_period_tag 1 #define StoreAndForward_Heartbeat_period_tag 1
#define StoreAndForward_Heartbeat_secondary_tag 2 #define StoreAndForward_Heartbeat_secondary_tag 2
#define StoreAndForward_rr_tag 1 #define StoreAndForward_rr_tag 1
#define StoreAndForward_stats_tag 2 #define StoreAndForward_stats_tag 2
#define StoreAndForward_history_tag 3 #define StoreAndForward_history_tag 3
#define StoreAndForward_heartbeat_tag 4 #define StoreAndForward_heartbeat_tag 4
#define StoreAndForward_empty_tag 5 #define StoreAndForward_empty_tag 5
/* Struct field encoding specification for nanopb */ /* Struct field encoding specification for nanopb */
#define StoreAndForward_FIELDLIST(X, a) \ #define StoreAndForward_FIELDLIST(X, a) \
@@ -201,10 +201,10 @@ extern const pb_msgdesc_t StoreAndForward_Heartbeat_msg;
#define StoreAndForward_Heartbeat_fields &StoreAndForward_Heartbeat_msg #define StoreAndForward_Heartbeat_fields &StoreAndForward_Heartbeat_msg
/* Maximum encoded size of messages (where known) */ /* Maximum encoded size of messages (where known) */
#define StoreAndForward_Heartbeat_size 12 #define StoreAndForward_Heartbeat_size 12
#define StoreAndForward_History_size 18 #define StoreAndForward_History_size 18
#define StoreAndForward_Statistics_size 50 #define StoreAndForward_Statistics_size 50
#define StoreAndForward_size 54 #define StoreAndForward_size 54
#ifdef __cplusplus #ifdef __cplusplus
} /* extern "C" */ } /* extern "C" */
@@ -1,7 +1,7 @@
/* Automatically generated nanopb constant definitions */ /* Automatically generated nanopb constant definitions */
/* Generated by nanopb-0.4.7 */ /* Generated by nanopb-0.4.7 */
#include "telemetry.pb.h" #include "./telemetry.pb.h"
#if PB_PROTO_HEADER_VERSION != 40 #if PB_PROTO_HEADER_VERSION != 40
#error Regenerate this file with the current version of nanopb generator. #error Regenerate this file with the current version of nanopb generator.
#endif #endif
@@ -1,8 +1,8 @@
/* Automatically generated nanopb header */ /* Automatically generated nanopb header */
/* Generated by nanopb-0.4.7 */ /* Generated by nanopb-0.4.7 */
#ifndef PB_TELEMETRY_PB_H_INCLUDED #ifndef PB_MESHTASTIC_MESHTASTIC_TELEMETRY_PB_H_INCLUDED
#define PB_TELEMETRY_PB_H_INCLUDED #define PB_MESHTASTIC_MESHTASTIC_TELEMETRY_PB_H_INCLUDED
#include <pb.h> #include <pb.h>
#if PB_PROTO_HEADER_VERSION != 40 #if PB_PROTO_HEADER_VERSION != 40
@@ -101,27 +101,27 @@ extern "C" {
/* Initializer values for message structs */ /* Initializer values for message structs */
#define DeviceMetrics_init_default {0, 0, 0, 0} #define DeviceMetrics_init_default {0, 0, 0, 0}
#define EnvironmentMetrics_init_default {0, 0, 0, 0, 0, 0} #define EnvironmentMetrics_init_default {0, 0, 0, 0, 0, 0}
#define Telemetry_init_default {0, 0, {DeviceMetrics_init_default}} #define Telemetry_init_default {0, 0, {DeviceMetrics_init_default}}
#define DeviceMetrics_init_zero {0, 0, 0, 0} #define DeviceMetrics_init_zero {0, 0, 0, 0}
#define EnvironmentMetrics_init_zero {0, 0, 0, 0, 0, 0} #define EnvironmentMetrics_init_zero {0, 0, 0, 0, 0, 0}
#define Telemetry_init_zero {0, 0, {DeviceMetrics_init_zero}} #define Telemetry_init_zero {0, 0, {DeviceMetrics_init_zero}}
/* Field tags (for use in manual encoding/decoding) */ /* Field tags (for use in manual encoding/decoding) */
#define DeviceMetrics_battery_level_tag 1 #define DeviceMetrics_battery_level_tag 1
#define DeviceMetrics_voltage_tag 2 #define DeviceMetrics_voltage_tag 2
#define DeviceMetrics_channel_utilization_tag 3 #define DeviceMetrics_channel_utilization_tag 3
#define DeviceMetrics_air_util_tx_tag 4 #define DeviceMetrics_air_util_tx_tag 4
#define EnvironmentMetrics_temperature_tag 1 #define EnvironmentMetrics_temperature_tag 1
#define EnvironmentMetrics_relative_humidity_tag 2 #define EnvironmentMetrics_relative_humidity_tag 2
#define EnvironmentMetrics_barometric_pressure_tag 3 #define EnvironmentMetrics_barometric_pressure_tag 3
#define EnvironmentMetrics_gas_resistance_tag 4 #define EnvironmentMetrics_gas_resistance_tag 4
#define EnvironmentMetrics_voltage_tag 5 #define EnvironmentMetrics_voltage_tag 5
#define EnvironmentMetrics_current_tag 6 #define EnvironmentMetrics_current_tag 6
#define Telemetry_time_tag 1 #define Telemetry_time_tag 1
#define Telemetry_device_metrics_tag 2 #define Telemetry_device_metrics_tag 2
#define Telemetry_environment_metrics_tag 3 #define Telemetry_environment_metrics_tag 3
/* Struct field encoding specification for nanopb */ /* Struct field encoding specification for nanopb */
#define DeviceMetrics_FIELDLIST(X, a) \ #define DeviceMetrics_FIELDLIST(X, a) \
@@ -161,9 +161,9 @@ extern const pb_msgdesc_t Telemetry_msg;
#define Telemetry_fields &Telemetry_msg #define Telemetry_fields &Telemetry_msg
/* Maximum encoded size of messages (where known) */ /* Maximum encoded size of messages (where known) */
#define DeviceMetrics_size 21 #define DeviceMetrics_size 21
#define EnvironmentMetrics_size 30 #define EnvironmentMetrics_size 30
#define Telemetry_size 37 #define Telemetry_size 37
#ifdef __cplusplus #ifdef __cplusplus
} /* extern "C" */ } /* extern "C" */
@@ -1,7 +1,7 @@
/* Automatically generated nanopb constant definitions */ /* Automatically generated nanopb constant definitions */
/* Generated by nanopb-0.4.7 */ /* Generated by nanopb-0.4.7 */
#include "xmodem.pb.h" #include "./xmodem.pb.h"
#if PB_PROTO_HEADER_VERSION != 40 #if PB_PROTO_HEADER_VERSION != 40
#error Regenerate this file with the current version of nanopb generator. #error Regenerate this file with the current version of nanopb generator.
#endif #endif
@@ -1,8 +1,8 @@
/* Automatically generated nanopb header */ /* Automatically generated nanopb header */
/* Generated by nanopb-0.4.7 */ /* Generated by nanopb-0.4.7 */
#ifndef PB_XMODEM_PB_H_INCLUDED #ifndef PB_MESHTASTIC_MESHTASTIC_XMODEM_PB_H_INCLUDED
#define PB_XMODEM_PB_H_INCLUDED #define PB_MESHTASTIC_MESHTASTIC_XMODEM_PB_H_INCLUDED
#include <pb.h> #include <pb.h>
#if PB_PROTO_HEADER_VERSION != 40 #if PB_PROTO_HEADER_VERSION != 40
@@ -44,14 +44,14 @@ extern "C" {
/* Initializer values for message structs */ /* Initializer values for message structs */
#define XModem_init_default {_XModem_Control_MIN, 0, 0, {0, {0}}} #define XModem_init_default {_XModem_Control_MIN, 0, 0, {0, {0}}}
#define XModem_init_zero {_XModem_Control_MIN, 0, 0, {0, {0}}} #define XModem_init_zero {_XModem_Control_MIN, 0, 0, {0, {0}}}
/* Field tags (for use in manual encoding/decoding) */ /* Field tags (for use in manual encoding/decoding) */
#define XModem_control_tag 1 #define XModem_control_tag 1
#define XModem_seq_tag 2 #define XModem_seq_tag 2
#define XModem_crc16_tag 3 #define XModem_crc16_tag 3
#define XModem_buffer_tag 4 #define XModem_buffer_tag 4
/* Struct field encoding specification for nanopb */ /* Struct field encoding specification for nanopb */
#define XModem_FIELDLIST(X, a) \ #define XModem_FIELDLIST(X, a) \
@@ -68,7 +68,7 @@ extern const pb_msgdesc_t XModem_msg;
#define XModem_fields &XModem_msg #define XModem_fields &XModem_msg
/* Maximum encoded size of messages (where known) */ /* Maximum encoded size of messages (where known) */
#define XModem_size 141 #define XModem_size 141
#ifdef __cplusplus #ifdef __cplusplus
} /* extern "C" */ } /* extern "C" */
+7 -7
View File
@@ -1,9 +1,9 @@
#pragma once #pragma once
#include "mesh/generated/mesh.pb.h" #include "mesh/generated/meshtastic/admin.pb.h"
#include "mesh/generated/localonly.pb.h" #include "mesh/generated/meshtastic/deviceonly.pb.h"
#include "mesh/generated/deviceonly.pb.h" #include "mesh/generated/meshtastic/localonly.pb.h"
#include "mesh/generated/admin.pb.h" #include "mesh/generated/meshtastic/mesh.pb.h"
// this file defines constants which come from mesh.options // this file defines constants which come from mesh.options
@@ -11,8 +11,8 @@
#define member_size(type, member) sizeof(((type *)0)->member) #define member_size(type, member) sizeof(((type *)0)->member)
/// max number of packets which can be waiting for delivery to android - note, this value comes from mesh.options protobuf /// max number of packets which can be waiting for delivery to android - note, this value comes from mesh.options protobuf
// FIXME - max_count is actually 32 but we save/load this as one long string of preencoded MeshPacket bytes - not a big array in RAM // FIXME - max_count is actually 32 but we save/load this as one long string of preencoded MeshPacket bytes - not a big array in
// #define MAX_RX_TOPHONE (member_size(DeviceState, receive_queue) / member_size(DeviceState, receive_queue[0])) // RAM #define MAX_RX_TOPHONE (member_size(DeviceState, receive_queue) / member_size(DeviceState, receive_queue[0]))
#define MAX_RX_TOPHONE 32 #define MAX_RX_TOPHONE 32
/// max number of nodes allowed in the mesh /// max number of nodes allowed in the mesh
@@ -36,7 +36,7 @@ bool writecb(pb_ostream_t *stream, const uint8_t *buf, size_t count);
/** is_in_repeated is a macro/function that returns true if a specified word appears in a repeated protobuf array. /** is_in_repeated is a macro/function that returns true if a specified word appears in a repeated protobuf array.
* It relies on the following naming conventions from nanopb: * It relies on the following naming conventions from nanopb:
* *
* pb_size_t ignore_incoming_count; * pb_size_t ignore_incoming_count;
* uint32_t ignore_incoming[3]; * uint32_t ignore_incoming[3];
*/ */
+108 -107
View File
@@ -109,11 +109,11 @@ bool AdminModule::handleReceivedProtobuf(const MeshPacket &mp, AdminMessage *r)
} }
case AdminMessage_reboot_ota_seconds_tag: { case AdminMessage_reboot_ota_seconds_tag: {
int32_t s = r->reboot_ota_seconds; int32_t s = r->reboot_ota_seconds;
#ifdef ARCH_ESP32 #ifdef ARCH_ESP32
if (BleOta::getOtaAppVersion().isEmpty()) { if (BleOta::getOtaAppVersion().isEmpty()) {
LOG_INFO("No OTA firmware available, scheduling regular reboot in %d seconds\n", s); LOG_INFO("No OTA firmware available, scheduling regular reboot in %d seconds\n", s);
screen->startRebootScreen(); screen->startRebootScreen();
}else{ } else {
screen->startFirmwareUpdateScreen(); screen->startFirmwareUpdateScreen();
BleOta::switchToOtaApp(); BleOta::switchToOtaApp();
LOG_INFO("Rebooting to OTA in %d seconds\n", s); LOG_INFO("Rebooting to OTA in %d seconds\n", s);
@@ -141,7 +141,8 @@ bool AdminModule::handleReceivedProtobuf(const MeshPacket &mp, AdminMessage *r)
nodeDB.factoryReset(); nodeDB.factoryReset();
reboot(DEFAULT_REBOOT_SECONDS); reboot(DEFAULT_REBOOT_SECONDS);
break; break;
} case AdminMessage_nodedb_reset_tag: { }
case AdminMessage_nodedb_reset_tag: {
LOG_INFO("Initiating node-db reset\n"); LOG_INFO("Initiating node-db reset\n");
nodeDB.resetNodes(); nodeDB.resetNodes();
reboot(DEFAULT_REBOOT_SECONDS); reboot(DEFAULT_REBOOT_SECONDS);
@@ -179,7 +180,7 @@ bool AdminModule::handleReceivedProtobuf(const MeshPacket &mp, AdminMessage *r)
} }
break; break;
} }
// If asked for a response and it is not yet set, generate an 'ACK' response // If asked for a response and it is not yet set, generate an 'ACK' response
if (mp.decoded.want_response && !myReply) { if (mp.decoded.want_response && !myReply) {
myReply = allocErrorResponse(Routing_Error_NONE, &mp); myReply = allocErrorResponse(Routing_Error_NONE, &mp);
@@ -213,7 +214,7 @@ void AdminModule::handleSetOwner(const User &o)
changed = 1; changed = 1;
licensed_changed = true; licensed_changed = true;
owner.is_licensed = o.is_licensed; owner.is_licensed = o.is_licensed;
config.lora.override_duty_cycle = owner.is_licensed; // override duty cycle for licensed operators config.lora.override_duty_cycle = owner.is_licensed; // override duty cycle for licensed operators
} }
if (changed) { // If nothing really changed, don't broadcast on the network or write to flash if (changed) { // If nothing really changed, don't broadcast on the network or write to flash
@@ -228,106 +229,104 @@ void AdminModule::handleSetConfig(const Config &c)
bool isRegionUnset = (config.lora.region == Config_LoRaConfig_RegionCode_UNSET); bool isRegionUnset = (config.lora.region == Config_LoRaConfig_RegionCode_UNSET);
switch (c.which_payload_variant) { switch (c.which_payload_variant) {
case Config_device_tag: case Config_device_tag:
LOG_INFO("Setting config: Device\n"); LOG_INFO("Setting config: Device\n");
config.has_device = true; config.has_device = true;
config.device = c.payload_variant.device; config.device = c.payload_variant.device;
// If we're setting router role for the first time, install its intervals // If we're setting router role for the first time, install its intervals
if (!isRouter && if (!isRouter && c.payload_variant.device.role == Config_DeviceConfig_Role_ROUTER) {
c.payload_variant.device.role == Config_DeviceConfig_Role_ROUTER) { nodeDB.initConfigIntervals();
nodeDB.initConfigIntervals(); nodeDB.initModuleConfigIntervals();
nodeDB.initModuleConfigIntervals(); }
} break;
break; case Config_position_tag:
case Config_position_tag: LOG_INFO("Setting config: Position\n");
LOG_INFO("Setting config: Position\n"); config.has_position = true;
config.has_position = true; config.position = c.payload_variant.position;
config.position = c.payload_variant.position; // Save nodedb as well in case we got a fixed position packet
// Save nodedb as well in case we got a fixed position packet saveChanges(SEGMENT_DEVICESTATE, false);
saveChanges(SEGMENT_DEVICESTATE, false); break;
break; case Config_power_tag:
case Config_power_tag: LOG_INFO("Setting config: Power\n");
LOG_INFO("Setting config: Power\n"); config.has_power = true;
config.has_power = true; config.power = c.payload_variant.power;
config.power = c.payload_variant.power; break;
break; case Config_network_tag:
case Config_network_tag: LOG_INFO("Setting config: WiFi\n");
LOG_INFO("Setting config: WiFi\n"); config.has_network = true;
config.has_network = true; config.network = c.payload_variant.network;
config.network = c.payload_variant.network; break;
break; case Config_display_tag:
case Config_display_tag: LOG_INFO("Setting config: Display\n");
LOG_INFO("Setting config: Display\n"); config.has_display = true;
config.has_display = true; config.display = c.payload_variant.display;
config.display = c.payload_variant.display; break;
break; case Config_lora_tag:
case Config_lora_tag: LOG_INFO("Setting config: LoRa\n");
LOG_INFO("Setting config: LoRa\n"); config.has_lora = true;
config.has_lora = true; config.lora = c.payload_variant.lora;
config.lora = c.payload_variant.lora; if (isRegionUnset && config.lora.region > Config_LoRaConfig_RegionCode_UNSET) {
if (isRegionUnset && config.lora.tx_enabled = true;
config.lora.region > Config_LoRaConfig_RegionCode_UNSET) { }
config.lora.tx_enabled = true; break;
} case Config_bluetooth_tag:
break; LOG_INFO("Setting config: Bluetooth\n");
case Config_bluetooth_tag: config.has_bluetooth = true;
LOG_INFO("Setting config: Bluetooth\n"); config.bluetooth = c.payload_variant.bluetooth;
config.has_bluetooth = true; break;
config.bluetooth = c.payload_variant.bluetooth;
break;
} }
saveChanges(SEGMENT_CONFIG); saveChanges(SEGMENT_CONFIG);
} }
void AdminModule::handleSetModuleConfig(const ModuleConfig &c) void AdminModule::handleSetModuleConfig(const ModuleConfig &c)
{ {
switch (c.which_payload_variant) { switch (c.which_payload_variant) {
case ModuleConfig_mqtt_tag: case ModuleConfig_mqtt_tag:
LOG_INFO("Setting module config: MQTT\n"); LOG_INFO("Setting module config: MQTT\n");
moduleConfig.has_mqtt = true; moduleConfig.has_mqtt = true;
moduleConfig.mqtt = c.payload_variant.mqtt; moduleConfig.mqtt = c.payload_variant.mqtt;
break; break;
case ModuleConfig_serial_tag: case ModuleConfig_serial_tag:
LOG_INFO("Setting module config: Serial\n"); LOG_INFO("Setting module config: Serial\n");
moduleConfig.has_serial = true; moduleConfig.has_serial = true;
moduleConfig.serial = c.payload_variant.serial; moduleConfig.serial = c.payload_variant.serial;
break; break;
case ModuleConfig_external_notification_tag: case ModuleConfig_external_notification_tag:
LOG_INFO("Setting module config: External Notification\n"); LOG_INFO("Setting module config: External Notification\n");
moduleConfig.has_external_notification = true; moduleConfig.has_external_notification = true;
moduleConfig.external_notification = c.payload_variant.external_notification; moduleConfig.external_notification = c.payload_variant.external_notification;
break; break;
case ModuleConfig_store_forward_tag: case ModuleConfig_store_forward_tag:
LOG_INFO("Setting module config: Store & Forward\n"); LOG_INFO("Setting module config: Store & Forward\n");
moduleConfig.has_store_forward = true; moduleConfig.has_store_forward = true;
moduleConfig.store_forward = c.payload_variant.store_forward; moduleConfig.store_forward = c.payload_variant.store_forward;
break; break;
case ModuleConfig_range_test_tag: case ModuleConfig_range_test_tag:
LOG_INFO("Setting module config: Range Test\n"); LOG_INFO("Setting module config: Range Test\n");
moduleConfig.has_range_test = true; moduleConfig.has_range_test = true;
moduleConfig.range_test = c.payload_variant.range_test; moduleConfig.range_test = c.payload_variant.range_test;
break; break;
case ModuleConfig_telemetry_tag: case ModuleConfig_telemetry_tag:
LOG_INFO("Setting module config: Telemetry\n"); LOG_INFO("Setting module config: Telemetry\n");
moduleConfig.has_telemetry = true; moduleConfig.has_telemetry = true;
moduleConfig.telemetry = c.payload_variant.telemetry; moduleConfig.telemetry = c.payload_variant.telemetry;
break; break;
case ModuleConfig_canned_message_tag: case ModuleConfig_canned_message_tag:
LOG_INFO("Setting module config: Canned Message\n"); LOG_INFO("Setting module config: Canned Message\n");
moduleConfig.has_canned_message = true; moduleConfig.has_canned_message = true;
moduleConfig.canned_message = c.payload_variant.canned_message; moduleConfig.canned_message = c.payload_variant.canned_message;
break; break;
case ModuleConfig_audio_tag: case ModuleConfig_audio_tag:
LOG_INFO("Setting module config: Audio\n"); LOG_INFO("Setting module config: Audio\n");
moduleConfig.has_audio = true; moduleConfig.has_audio = true;
moduleConfig.audio = c.payload_variant.audio; moduleConfig.audio = c.payload_variant.audio;
break; break;
case ModuleConfig_remote_hardware_tag: case ModuleConfig_remote_hardware_tag:
LOG_INFO("Setting module config: Remote Hardware\n"); LOG_INFO("Setting module config: Remote Hardware\n");
moduleConfig.has_remote_hardware = true; moduleConfig.has_remote_hardware = true;
moduleConfig.remote_hardware = c.payload_variant.remote_hardware; moduleConfig.remote_hardware = c.payload_variant.remote_hardware;
break; break;
} }
saveChanges(SEGMENT_MODULECONFIG); saveChanges(SEGMENT_MODULECONFIG);
@@ -381,7 +380,8 @@ void AdminModule::handleGetConfig(const MeshPacket &req, const uint32_t configTy
LOG_INFO("Getting config: Network\n"); LOG_INFO("Getting config: Network\n");
res.get_config_response.which_payload_variant = Config_network_tag; res.get_config_response.which_payload_variant = Config_network_tag;
res.get_config_response.payload_variant.network = config.network; res.get_config_response.payload_variant.network = config.network;
writeSecret(res.get_config_response.payload_variant.network.wifi_psk, sizeof(res.get_config_response.payload_variant.network.wifi_psk), config.network.wifi_psk); writeSecret(res.get_config_response.payload_variant.network.wifi_psk,
sizeof(res.get_config_response.payload_variant.network.wifi_psk), config.network.wifi_psk);
break; break;
case AdminMessage_ConfigType_DISPLAY_CONFIG: case AdminMessage_ConfigType_DISPLAY_CONFIG:
LOG_INFO("Getting config: Display\n"); LOG_INFO("Getting config: Display\n");
@@ -430,8 +430,7 @@ void AdminModule::handleGetModuleConfig(const MeshPacket &req, const uint32_t co
case AdminMessage_ModuleConfigType_EXTNOTIF_CONFIG: case AdminMessage_ModuleConfigType_EXTNOTIF_CONFIG:
LOG_INFO("Getting module config: External Notification\n"); LOG_INFO("Getting module config: External Notification\n");
res.get_module_config_response.which_payload_variant = ModuleConfig_external_notification_tag; res.get_module_config_response.which_payload_variant = ModuleConfig_external_notification_tag;
res.get_module_config_response.payload_variant.external_notification = res.get_module_config_response.payload_variant.external_notification = moduleConfig.external_notification;
moduleConfig.external_notification;
break; break;
case AdminMessage_ModuleConfigType_STOREFORWARD_CONFIG: case AdminMessage_ModuleConfigType_STOREFORWARD_CONFIG:
LOG_INFO("Getting module config: Store & Forward\n"); LOG_INFO("Getting module config: Store & Forward\n");
@@ -477,9 +476,10 @@ void AdminModule::handleGetModuleConfig(const MeshPacket &req, const uint32_t co
} }
} }
void AdminModule::handleGetDeviceMetadata(const MeshPacket &req) { void AdminModule::handleGetDeviceMetadata(const MeshPacket &req)
{
AdminMessage r = AdminMessage_init_default; AdminMessage r = AdminMessage_init_default;
DeviceMetadata deviceMetadata; DeviceMetadata deviceMetadata;
strncpy(deviceMetadata.firmware_version, myNodeInfo.firmware_version, 18); strncpy(deviceMetadata.firmware_version, myNodeInfo.firmware_version, 18);
deviceMetadata.device_state_version = DEVICESTATE_CUR_VER; deviceMetadata.device_state_version = DEVICESTATE_CUR_VER;
@@ -487,6 +487,8 @@ void AdminModule::handleGetDeviceMetadata(const MeshPacket &req) {
deviceMetadata.hasBluetooth = HAS_BLUETOOTH; deviceMetadata.hasBluetooth = HAS_BLUETOOTH;
deviceMetadata.hasWifi = HAS_WIFI; deviceMetadata.hasWifi = HAS_WIFI;
deviceMetadata.hasEthernet = HAS_ETHERNET; deviceMetadata.hasEthernet = HAS_ETHERNET;
deviceMetadata.role = config.device.role;
deviceMetadata.position_flags = config.position.position_flags;
r.get_device_metadata_response = deviceMetadata; r.get_device_metadata_response = deviceMetadata;
r.which_payload_variant = AdminMessage_get_device_metadata_response_tag; r.which_payload_variant = AdminMessage_get_device_metadata_response_tag;
@@ -504,14 +506,14 @@ void AdminModule::handleGetChannel(const MeshPacket &req, uint32_t channelIndex)
} }
} }
void AdminModule::reboot(int32_t seconds) void AdminModule::reboot(int32_t seconds)
{ {
LOG_INFO("Rebooting in %d seconds\n", seconds); LOG_INFO("Rebooting in %d seconds\n", seconds);
screen->startRebootScreen(); screen->startRebootScreen();
rebootAtMsec = (seconds < 0) ? 0 : (millis() + seconds * 1000); rebootAtMsec = (seconds < 0) ? 0 : (millis() + seconds * 1000);
} }
void AdminModule::saveChanges(int saveWhat, bool shouldReboot) void AdminModule::saveChanges(int saveWhat, bool shouldReboot)
{ {
if (!hasOpenEditTransaction) { if (!hasOpenEditTransaction) {
LOG_INFO("Saving changes to disk\n"); LOG_INFO("Saving changes to disk\n");
@@ -519,8 +521,7 @@ void AdminModule::saveChanges(int saveWhat, bool shouldReboot)
} else { } else {
LOG_INFO("Delaying save of changes to disk until the open transaction is committed\n"); LOG_INFO("Delaying save of changes to disk until the open transaction is committed\n");
} }
if (shouldReboot) if (shouldReboot) {
{
reboot(DEFAULT_REBOOT_SECONDS); reboot(DEFAULT_REBOOT_SECONDS);
} }
} }
+96 -93
View File
@@ -2,10 +2,10 @@
#if HAS_SCREEN #if HAS_SCREEN
#include "CannedMessageModule.h" #include "CannedMessageModule.h"
#include "FSCommon.h" #include "FSCommon.h"
#include "NodeDB.h"
#include "MeshService.h" #include "MeshService.h"
#include "NodeDB.h"
#include "PowerFSM.h" // neede for button bypass #include "PowerFSM.h" // neede for button bypass
#include "mesh/generated/cannedmessages.pb.h" #include "mesh/generated/meshtastic/cannedmessages.pb.h"
#ifdef OLED_RU #ifdef OLED_RU
#include "graphics/fonts/OLEDDisplayFontsRU.h" #include "graphics/fonts/OLEDDisplayFontsRU.h"
@@ -149,10 +149,10 @@ int CannedMessageModule::handleInputEvent(const InputEvent *event)
this->lastTouchMillis = 0; this->lastTouchMillis = 0;
validEvent = true; validEvent = true;
} }
if ((event->inputEvent == static_cast<char>(ModuleConfig_CannedMessageConfig_InputEventChar_BACK)) || if ((event->inputEvent == static_cast<char>(ModuleConfig_CannedMessageConfig_InputEventChar_BACK)) ||
(event->inputEvent == static_cast<char>(ModuleConfig_CannedMessageConfig_InputEventChar_LEFT)) || (event->inputEvent == static_cast<char>(ModuleConfig_CannedMessageConfig_InputEventChar_LEFT)) ||
(event->inputEvent == static_cast<char>(ModuleConfig_CannedMessageConfig_InputEventChar_RIGHT))) { (event->inputEvent == static_cast<char>(ModuleConfig_CannedMessageConfig_InputEventChar_RIGHT))) {
LOG_DEBUG("Canned message event (%x)\n",event->kbchar); LOG_DEBUG("Canned message event (%x)\n", event->kbchar);
if (this->runState == CANNED_MESSAGE_RUN_STATE_FREETEXT) { if (this->runState == CANNED_MESSAGE_RUN_STATE_FREETEXT) {
// pass the pressed key // pass the pressed key
this->payload = event->kbchar; this->payload = event->kbchar;
@@ -163,7 +163,8 @@ int CannedMessageModule::handleInputEvent(const InputEvent *event)
if (event->inputEvent == static_cast<char>(ANYKEY)) { if (event->inputEvent == static_cast<char>(ANYKEY)) {
LOG_DEBUG("Canned message event any key pressed\n"); LOG_DEBUG("Canned message event any key pressed\n");
// when inactive, this will switch to the freetext mode // when inactive, this will switch to the freetext mode
if ((this->runState == CANNED_MESSAGE_RUN_STATE_INACTIVE) || (this->runState == CANNED_MESSAGE_RUN_STATE_ACTIVE) || (this->runState == CANNED_MESSAGE_RUN_STATE_DISABLED)) { if ((this->runState == CANNED_MESSAGE_RUN_STATE_INACTIVE) || (this->runState == CANNED_MESSAGE_RUN_STATE_ACTIVE) ||
(this->runState == CANNED_MESSAGE_RUN_STATE_DISABLED)) {
this->runState = CANNED_MESSAGE_RUN_STATE_FREETEXT; this->runState = CANNED_MESSAGE_RUN_STATE_FREETEXT;
} }
// pass the pressed key // pass the pressed key
@@ -176,7 +177,7 @@ int CannedMessageModule::handleInputEvent(const InputEvent *event)
// this will send the text immediately on matrix press // this will send the text immediately on matrix press
this->runState = CANNED_MESSAGE_RUN_STATE_ACTION_SELECT; this->runState = CANNED_MESSAGE_RUN_STATE_ACTION_SELECT;
this->payload = MATRIXKEY; this->payload = MATRIXKEY;
this->currentMessageIndex = event->kbchar -1; this->currentMessageIndex = event->kbchar - 1;
this->lastTouchMillis = millis(); this->lastTouchMillis = millis();
validEvent = true; validEvent = true;
} }
@@ -224,7 +225,8 @@ int32_t CannedMessageModule::runOnce()
this->cursor = 0; this->cursor = 0;
this->destSelect = false; this->destSelect = false;
this->notifyObservers(&e); this->notifyObservers(&e);
} else if (((this->runState == CANNED_MESSAGE_RUN_STATE_ACTIVE) || (this->runState == CANNED_MESSAGE_RUN_STATE_FREETEXT)) && ((millis() - this->lastTouchMillis) > INACTIVATE_AFTER_MS)) { } else if (((this->runState == CANNED_MESSAGE_RUN_STATE_ACTIVE) || (this->runState == CANNED_MESSAGE_RUN_STATE_FREETEXT)) &&
((millis() - this->lastTouchMillis) > INACTIVATE_AFTER_MS)) {
// Reset module // Reset module
LOG_DEBUG("Reset due to lack of activity.\n"); LOG_DEBUG("Reset due to lack of activity.\n");
e.frameChanged = true; e.frameChanged = true;
@@ -245,7 +247,7 @@ int32_t CannedMessageModule::runOnce()
} }
} else { } else {
if ((this->messagesCount > this->currentMessageIndex) && (strlen(this->messages[this->currentMessageIndex]) > 0)) { if ((this->messagesCount > this->currentMessageIndex) && (strlen(this->messages[this->currentMessageIndex]) > 0)) {
if(strcmp (this->messages[this->currentMessageIndex], "~") == 0) { if (strcmp(this->messages[this->currentMessageIndex], "~") == 0) {
powerFSM.trigger(EVENT_PRESS); powerFSM.trigger(EVENT_PRESS);
return INT32_MAX; return INT32_MAX;
} else { } else {
@@ -264,7 +266,7 @@ int32_t CannedMessageModule::runOnce()
this->destSelect = false; this->destSelect = false;
this->notifyObservers(&e); this->notifyObservers(&e);
return 2000; return 2000;
} else if ((this->runState != CANNED_MESSAGE_RUN_STATE_FREETEXT) && (this->currentMessageIndex == -1)) { } else if ((this->runState != CANNED_MESSAGE_RUN_STATE_FREETEXT) && (this->currentMessageIndex == -1)) {
this->currentMessageIndex = 0; this->currentMessageIndex = 0;
LOG_DEBUG("First touch (%d):%s\n", this->currentMessageIndex, this->getCurrentMessage()); LOG_DEBUG("First touch (%d):%s\n", this->currentMessageIndex, this->getCurrentMessage());
e.frameChanged = true; e.frameChanged = true;
@@ -290,81 +292,81 @@ int32_t CannedMessageModule::runOnce()
} else if (this->runState == CANNED_MESSAGE_RUN_STATE_FREETEXT) { } else if (this->runState == CANNED_MESSAGE_RUN_STATE_FREETEXT) {
e.frameChanged = true; e.frameChanged = true;
switch (this->payload) { switch (this->payload) {
case 0xb4: // left case 0xb4: // left
if (this->destSelect){ if (this->destSelect) {
size_t numNodes = nodeDB.getNumNodes(); size_t numNodes = nodeDB.getNumNodes();
if(this->dest == NODENUM_BROADCAST) { if (this->dest == NODENUM_BROADCAST) {
this->dest = nodeDB.getNodeNum(); this->dest = nodeDB.getNodeNum();
} }
for (unsigned int i = 0; i < numNodes; i++) { for (unsigned int i = 0; i < numNodes; i++) {
if (nodeDB.getNodeByIndex(i)->num == this->dest) { if (nodeDB.getNodeByIndex(i)->num == this->dest) {
this->dest = (i > 0) ? nodeDB.getNodeByIndex(i-1)->num : nodeDB.getNodeByIndex(numNodes-1)->num; this->dest = (i > 0) ? nodeDB.getNodeByIndex(i - 1)->num : nodeDB.getNodeByIndex(numNodes - 1)->num;
break; break;
}
}
if(this->dest == nodeDB.getNodeNum()) {
this->dest = NODENUM_BROADCAST;
}
}else{
if (this->cursor > 0) {
this->cursor--;
} }
} }
break; if (this->dest == nodeDB.getNodeNum()) {
case 0xb7: // right this->dest = NODENUM_BROADCAST;
if (this->destSelect){
size_t numNodes = nodeDB.getNumNodes();
if(this->dest == NODENUM_BROADCAST) {
this->dest = nodeDB.getNodeNum();
}
for (unsigned int i = 0; i < numNodes; i++) {
if (nodeDB.getNodeByIndex(i)->num == this->dest) {
this->dest = (i < numNodes-1) ? nodeDB.getNodeByIndex(i+1)->num : nodeDB.getNodeByIndex(0)->num;
break;
}
}
if(this->dest == nodeDB.getNodeNum()) {
this->dest = NODENUM_BROADCAST;
}
}else{
if (this->cursor < this->freetext.length()) {
this->cursor++;
}
} }
break; } else {
case 0x08: // backspace if (this->cursor > 0) {
if (this->freetext.length() > 0) {
if(this->cursor == this->freetext.length()) {
this->freetext = this->freetext.substring(0, this->freetext.length() - 1);
} else {
this->freetext = this->freetext.substring(0, this->cursor - 1) + this->freetext.substring(this->cursor, this->freetext.length());
}
this->cursor--; this->cursor--;
} }
break; }
case 0x09: // tab break;
if(this->destSelect) { case 0xb7: // right
this->destSelect = false; if (this->destSelect) {
size_t numNodes = nodeDB.getNumNodes();
if (this->dest == NODENUM_BROADCAST) {
this->dest = nodeDB.getNodeNum();
}
for (unsigned int i = 0; i < numNodes; i++) {
if (nodeDB.getNodeByIndex(i)->num == this->dest) {
this->dest = (i < numNodes - 1) ? nodeDB.getNodeByIndex(i + 1)->num : nodeDB.getNodeByIndex(0)->num;
break;
}
}
if (this->dest == nodeDB.getNodeNum()) {
this->dest = NODENUM_BROADCAST;
}
} else {
if (this->cursor < this->freetext.length()) {
this->cursor++;
}
}
break;
case 0x08: // backspace
if (this->freetext.length() > 0) {
if (this->cursor == this->freetext.length()) {
this->freetext = this->freetext.substring(0, this->freetext.length() - 1);
} else { } else {
this->destSelect = true; this->freetext = this->freetext.substring(0, this->cursor - 1) +
this->freetext.substring(this->cursor, this->freetext.length());
} }
break; this->cursor--;
default: }
if(this->cursor == this->freetext.length()) { break;
this->freetext += this->payload; case 0x09: // tab
} else { if (this->destSelect) {
this->freetext = this->freetext.substring(0, this->cursor) this->destSelect = false;
+ this->payload } else {
+ this->freetext.substring(this->cursor); this->destSelect = true;
} }
this->cursor += 1; break;
if (this->freetext.length() > Constants_DATA_PAYLOAD_LEN) { default:
this->cursor = Constants_DATA_PAYLOAD_LEN; if (this->cursor == this->freetext.length()) {
this->freetext = this->freetext.substring(0, Constants_DATA_PAYLOAD_LEN); this->freetext += this->payload;
} } else {
break; this->freetext =
this->freetext.substring(0, this->cursor) + this->payload + this->freetext.substring(this->cursor);
}
this->cursor += 1;
if (this->freetext.length() > Constants_DATA_PAYLOAD_LEN) {
this->cursor = Constants_DATA_PAYLOAD_LEN;
this->freetext = this->freetext.substring(0, Constants_DATA_PAYLOAD_LEN);
}
break;
} }
this->lastTouchMillis = millis(); this->lastTouchMillis = millis();
this->notifyObservers(&e); this->notifyObservers(&e);
return INACTIVATE_AFTER_MS; return INACTIVATE_AFTER_MS;
@@ -376,7 +378,7 @@ int32_t CannedMessageModule::runOnce()
return INACTIVATE_AFTER_MS; return INACTIVATE_AFTER_MS;
} }
return INT32_MAX; return INT32_MAX;
} }
const char *CannedMessageModule::getCurrentMessage() const char *CannedMessageModule::getCurrentMessage()
@@ -391,14 +393,15 @@ const char *CannedMessageModule::getNextMessage()
{ {
return this->messages[this->getNextIndex()]; return this->messages[this->getNextIndex()];
} }
const char* CannedMessageModule::getNodeName(NodeNum node) { const char *CannedMessageModule::getNodeName(NodeNum node)
if (node == NODENUM_BROADCAST){ {
if (node == NODENUM_BROADCAST) {
return "Broadcast"; return "Broadcast";
}else{ } else {
NodeInfo *info = nodeDB.getNode(node); NodeInfo *info = nodeDB.getNode(node);
if(info != NULL) { if (info != NULL) {
return info->user.long_name; return info->user.long_name;
}else{ } else {
return "Unknown"; return "Unknown";
} }
} }
@@ -444,7 +447,7 @@ void CannedMessageModule::drawFrame(OLEDDisplay *display, OLEDDisplayUiState *st
display->setTextAlignment(TEXT_ALIGN_LEFT); display->setTextAlignment(TEXT_ALIGN_LEFT);
display->setFont(FONT_SMALL); display->setFont(FONT_SMALL);
display->drawString(10 + x, 0 + y + FONT_HEIGHT_SMALL, "Canned Message\nModule disabled."); display->drawString(10 + x, 0 + y + FONT_HEIGHT_SMALL, "Canned Message\nModule disabled.");
}else if (cannedMessageModule->runState == CANNED_MESSAGE_RUN_STATE_FREETEXT) { } else if (cannedMessageModule->runState == CANNED_MESSAGE_RUN_STATE_FREETEXT) {
display->setTextAlignment(TEXT_ALIGN_LEFT); display->setTextAlignment(TEXT_ALIGN_LEFT);
display->setFont(FONT_SMALL); display->setFont(FONT_SMALL);
if (this->destSelect) { if (this->destSelect) {
@@ -460,7 +463,9 @@ void CannedMessageModule::drawFrame(OLEDDisplay *display, OLEDDisplayUiState *st
display->drawString(x + display->getWidth() - display->getStringWidth(buffer) - 1, y + 0, buffer); display->drawString(x + display->getWidth() - display->getStringWidth(buffer) - 1, y + 0, buffer);
} }
display->setColor(WHITE); display->setColor(WHITE);
display->drawStringMaxWidth(0 + x, 0 + y + FONT_HEIGHT_SMALL, x + display->getWidth(), cannedMessageModule->drawWithCursor(cannedMessageModule->freetext, cannedMessageModule->cursor)); display->drawStringMaxWidth(
0 + x, 0 + y + FONT_HEIGHT_SMALL, x + display->getWidth(),
cannedMessageModule->drawWithCursor(cannedMessageModule->freetext, cannedMessageModule->cursor));
} else { } else {
if (this->messagesCount > 0) { if (this->messagesCount > 0) {
display->setTextAlignment(TEXT_ALIGN_LEFT); display->setTextAlignment(TEXT_ALIGN_LEFT);
@@ -479,7 +484,7 @@ void CannedMessageModule::drawFrame(OLEDDisplay *display, OLEDDisplayUiState *st
void CannedMessageModule::loadProtoForModule() void CannedMessageModule::loadProtoForModule()
{ {
if (!nodeDB.loadProto(cannedMessagesConfigFile, CannedMessageModuleConfig_size, sizeof(CannedMessageModuleConfig), if (!nodeDB.loadProto(cannedMessagesConfigFile, CannedMessageModuleConfig_size, sizeof(CannedMessageModuleConfig),
&CannedMessageModuleConfig_msg, &cannedMessageModuleConfig)) { &CannedMessageModuleConfig_msg, &cannedMessageModuleConfig)) {
installDefaultCannedMessageModuleConfig(); installDefaultCannedMessageModuleConfig();
} }
} }
@@ -498,8 +503,8 @@ bool CannedMessageModule::saveProtoForModule()
FS.mkdir("/prefs"); FS.mkdir("/prefs");
#endif #endif
okay &= nodeDB.saveProto(cannedMessagesConfigFile, CannedMessageModuleConfig_size, okay &= nodeDB.saveProto(cannedMessagesConfigFile, CannedMessageModuleConfig_size, &CannedMessageModuleConfig_msg,
&CannedMessageModuleConfig_msg, &cannedMessageModuleConfig); &cannedMessageModuleConfig);
return okay; return okay;
} }
@@ -549,13 +554,13 @@ AdminMessageHandleResult CannedMessageModule::handleAdminMessageForModule(const
void CannedMessageModule::handleGetCannedMessageModuleMessages(const MeshPacket &req, AdminMessage *response) void CannedMessageModule::handleGetCannedMessageModuleMessages(const MeshPacket &req, AdminMessage *response)
{ {
LOG_DEBUG("*** handleGetCannedMessageModuleMessages\n"); LOG_DEBUG("*** handleGetCannedMessageModuleMessages\n");
if(req.decoded.want_response) { if (req.decoded.want_response) {
response->which_payload_variant = AdminMessage_get_canned_message_module_messages_response_tag; response->which_payload_variant = AdminMessage_get_canned_message_module_messages_response_tag;
strncpy(response->get_canned_message_module_messages_response, cannedMessageModuleConfig.messages, sizeof(response->get_canned_message_module_messages_response)); strncpy(response->get_canned_message_module_messages_response, cannedMessageModuleConfig.messages,
sizeof(response->get_canned_message_module_messages_response));
} // Don't send anything if not instructed to. Better than asserting. } // Don't send anything if not instructed to. Better than asserting.
} }
void CannedMessageModule::handleSetCannedMessageModuleMessages(const char *from_msg) void CannedMessageModule::handleSetCannedMessageModuleMessages(const char *from_msg)
{ {
int changed = 0; int changed = 0;
@@ -573,9 +578,7 @@ void CannedMessageModule::handleSetCannedMessageModuleMessages(const char *from_
String CannedMessageModule::drawWithCursor(String text, int cursor) String CannedMessageModule::drawWithCursor(String text, int cursor)
{ {
String result = text.substring(0, cursor) String result = text.substring(0, cursor) + "_" + text.substring(cursor);
+ "_"
+ text.substring(cursor);
return result; return result;
} }
+49 -50
View File
@@ -5,7 +5,7 @@
#include "Router.h" #include "Router.h"
#include "buzz/buzz.h" #include "buzz/buzz.h"
#include "configuration.h" #include "configuration.h"
#include "mesh/generated/rtttl.pb.h" #include "mesh/generated/meshtastic/rtttl.pb.h"
#include <Arduino.h> #include <Arduino.h>
#ifndef PIN_BUZZER #ifndef PIN_BUZZER
@@ -58,19 +58,19 @@ int32_t ExternalNotificationModule::runOnce()
// If the output is turned on, turn it back off after the given period of time. // If the output is turned on, turn it back off after the given period of time.
if (isNagging) { if (isNagging) {
if (externalTurnedOn[0] + (moduleConfig.external_notification.output_ms if (externalTurnedOn[0] + (moduleConfig.external_notification.output_ms ? moduleConfig.external_notification.output_ms
? moduleConfig.external_notification.output_ms : EXT_NOTIFICATION_MODULE_OUTPUT_MS) <
: EXT_NOTIFICATION_MODULE_OUTPUT_MS) < millis()) { millis()) {
getExternal(0) ? setExternalOff(0) : setExternalOn(0); getExternal(0) ? setExternalOff(0) : setExternalOn(0);
} }
if (externalTurnedOn[1] + (moduleConfig.external_notification.output_ms if (externalTurnedOn[1] + (moduleConfig.external_notification.output_ms ? moduleConfig.external_notification.output_ms
? moduleConfig.external_notification.output_ms : EXT_NOTIFICATION_MODULE_OUTPUT_MS) <
: EXT_NOTIFICATION_MODULE_OUTPUT_MS) < millis()) { millis()) {
getExternal(1) ? setExternalOff(1) : setExternalOn(1); getExternal(1) ? setExternalOff(1) : setExternalOn(1);
} }
if (externalTurnedOn[2] + (moduleConfig.external_notification.output_ms if (externalTurnedOn[2] + (moduleConfig.external_notification.output_ms ? moduleConfig.external_notification.output_ms
? moduleConfig.external_notification.output_ms : EXT_NOTIFICATION_MODULE_OUTPUT_MS) <
: EXT_NOTIFICATION_MODULE_OUTPUT_MS) < millis()) { millis()) {
getExternal(2) ? setExternalOff(2) : setExternalOn(2); getExternal(2) ? setExternalOff(2) : setExternalOn(2);
} }
} }
@@ -93,18 +93,18 @@ void ExternalNotificationModule::setExternalOn(uint8_t index)
externalCurrentState[index] = 1; externalCurrentState[index] = 1;
externalTurnedOn[index] = millis(); externalTurnedOn[index] = millis();
switch(index) { switch (index) {
case 1: case 1:
if(moduleConfig.external_notification.output_vibra) if (moduleConfig.external_notification.output_vibra)
digitalWrite(moduleConfig.external_notification.output_vibra, true); digitalWrite(moduleConfig.external_notification.output_vibra, true);
break; break;
case 2: case 2:
if(moduleConfig.external_notification.output_buzzer) if (moduleConfig.external_notification.output_buzzer)
digitalWrite(moduleConfig.external_notification.output_buzzer, true); digitalWrite(moduleConfig.external_notification.output_buzzer, true);
break; break;
default: default:
digitalWrite(output, (moduleConfig.external_notification.active ? true : false)); digitalWrite(output, (moduleConfig.external_notification.active ? true : false));
break; break;
} }
} }
@@ -113,18 +113,18 @@ void ExternalNotificationModule::setExternalOff(uint8_t index)
externalCurrentState[index] = 0; externalCurrentState[index] = 0;
externalTurnedOn[index] = millis(); externalTurnedOn[index] = millis();
switch(index) { switch (index) {
case 1: case 1:
if(moduleConfig.external_notification.output_vibra) if (moduleConfig.external_notification.output_vibra)
digitalWrite(moduleConfig.external_notification.output_vibra, false); digitalWrite(moduleConfig.external_notification.output_vibra, false);
break; break;
case 2: case 2:
if(moduleConfig.external_notification.output_buzzer) if (moduleConfig.external_notification.output_buzzer)
digitalWrite(moduleConfig.external_notification.output_buzzer, false); digitalWrite(moduleConfig.external_notification.output_buzzer, false);
break; break;
default: default:
digitalWrite(output, (moduleConfig.external_notification.active ? false : true)); digitalWrite(output, (moduleConfig.external_notification.active ? false : true));
break; break;
} }
} }
@@ -133,7 +133,8 @@ bool ExternalNotificationModule::getExternal(uint8_t index)
return externalCurrentState[index]; return externalCurrentState[index];
} }
void ExternalNotificationModule::stopNow() { void ExternalNotificationModule::stopNow()
{
rtttl::stop(); rtttl::stop();
nagCycleCutoff = 1; // small value nagCycleCutoff = 1; // small value
isNagging = false; isNagging = false;
@@ -161,40 +162,39 @@ ExternalNotificationModule::ExternalNotificationModule()
// moduleConfig.external_notification.output_buzzer = 10; // RAK4631 IO6 // moduleConfig.external_notification.output_buzzer = 10; // RAK4631 IO6
// moduleConfig.external_notification.output_vibra = 28; // RAK4631 IO7 // moduleConfig.external_notification.output_vibra = 28; // RAK4631 IO7
// moduleConfig.external_notification.nag_timeout = 300; // moduleConfig.external_notification.nag_timeout = 300;
if (moduleConfig.external_notification.enabled) { if (moduleConfig.external_notification.enabled) {
if (!nodeDB.loadProto(rtttlConfigFile, RTTTLConfig_size, sizeof(RTTTLConfig), &RTTTLConfig_msg, &rtttlConfig)) { if (!nodeDB.loadProto(rtttlConfigFile, RTTTLConfig_size, sizeof(RTTTLConfig), &RTTTLConfig_msg, &rtttlConfig)) {
memset(rtttlConfig.ringtone, 0, sizeof(rtttlConfig.ringtone)); memset(rtttlConfig.ringtone, 0, sizeof(rtttlConfig.ringtone));
strncpy(rtttlConfig.ringtone, "a:d=8,o=5,b=125:4d#6,a#,2d#6,16p,g#,4a#,4d#.,p,16g,16a#,d#6,a#,f6,2d#6,16p,c#.6,16c6,16a#,g#.,2a#", sizeof(rtttlConfig.ringtone)); strncpy(rtttlConfig.ringtone,
"a:d=8,o=5,b=125:4d#6,a#,2d#6,16p,g#,4a#,4d#.,p,16g,16a#,d#6,a#,f6,2d#6,16p,c#.6,16c6,16a#,g#.,2a#",
sizeof(rtttlConfig.ringtone));
} }
LOG_INFO("Initializing External Notification Module\n"); LOG_INFO("Initializing External Notification Module\n");
output = moduleConfig.external_notification.output output = moduleConfig.external_notification.output ? moduleConfig.external_notification.output
? moduleConfig.external_notification.output : EXT_NOTIFICATION_MODULE_OUTPUT;
: EXT_NOTIFICATION_MODULE_OUTPUT;
// Set the direction of a pin // Set the direction of a pin
LOG_INFO("Using Pin %i in digital mode\n", output); LOG_INFO("Using Pin %i in digital mode\n", output);
pinMode(output, OUTPUT); pinMode(output, OUTPUT);
setExternalOff(0); setExternalOff(0);
externalTurnedOn[0] = 0; externalTurnedOn[0] = 0;
if(moduleConfig.external_notification.output_vibra) { if (moduleConfig.external_notification.output_vibra) {
LOG_INFO("Using Pin %i for vibra motor\n", moduleConfig.external_notification.output_vibra); LOG_INFO("Using Pin %i for vibra motor\n", moduleConfig.external_notification.output_vibra);
pinMode(moduleConfig.external_notification.output_vibra, OUTPUT); pinMode(moduleConfig.external_notification.output_vibra, OUTPUT);
setExternalOff(1); setExternalOff(1);
externalTurnedOn[1] = 0; externalTurnedOn[1] = 0;
} }
if(moduleConfig.external_notification.output_buzzer) { if (moduleConfig.external_notification.output_buzzer) {
if (!moduleConfig.external_notification.use_pwm) { if (!moduleConfig.external_notification.use_pwm) {
LOG_INFO("Using Pin %i for buzzer\n", moduleConfig.external_notification.output_buzzer); LOG_INFO("Using Pin %i for buzzer\n", moduleConfig.external_notification.output_buzzer);
pinMode(moduleConfig.external_notification.output_buzzer, OUTPUT); pinMode(moduleConfig.external_notification.output_buzzer, OUTPUT);
setExternalOff(2); setExternalOff(2);
externalTurnedOn[2] = 0; externalTurnedOn[2] = 0;
} else { } else {
config.device.buzzer_gpio = config.device.buzzer_gpio config.device.buzzer_gpio = config.device.buzzer_gpio ? config.device.buzzer_gpio : PIN_BUZZER;
? config.device.buzzer_gpio
: PIN_BUZZER;
// in PWM Mode we force the buzzer pin if it is set // in PWM Mode we force the buzzer pin if it is set
LOG_INFO("Using Pin %i in PWM mode\n", config.device.buzzer_gpio); LOG_INFO("Using Pin %i in PWM mode\n", config.device.buzzer_gpio);
} }
@@ -274,7 +274,6 @@ ProcessMessage ExternalNotificationModule::handleReceived(const MeshPacket &mp)
} }
} }
if (moduleConfig.external_notification.alert_message_vibra) { if (moduleConfig.external_notification.alert_message_vibra) {
LOG_INFO("externalNotificationModule - Notification Module (Vibra)\n"); LOG_INFO("externalNotificationModule - Notification Module (Vibra)\n");
isNagging = true; isNagging = true;
@@ -300,7 +299,7 @@ ProcessMessage ExternalNotificationModule::handleReceived(const MeshPacket &mp)
nagCycleCutoff = millis() + moduleConfig.external_notification.output_ms; nagCycleCutoff = millis() + moduleConfig.external_notification.output_ms;
} }
} }
setIntervalFromNow(0); // run once so we know if we should do something setIntervalFromNow(0); // run once so we know if we should do something
} }
@@ -320,7 +319,8 @@ ProcessMessage ExternalNotificationModule::handleReceived(const MeshPacket &mp)
* @return AdminMessageHandleResult HANDLED if message was handled * @return AdminMessageHandleResult HANDLED if message was handled
* HANDLED_WITH_RESULT if a result is also prepared. * HANDLED_WITH_RESULT if a result is also prepared.
*/ */
AdminMessageHandleResult ExternalNotificationModule::handleAdminMessageForModule(const MeshPacket &mp, AdminMessage *request, AdminMessage *response) AdminMessageHandleResult ExternalNotificationModule::handleAdminMessageForModule(const MeshPacket &mp, AdminMessage *request,
AdminMessage *response)
{ {
AdminMessageHandleResult result; AdminMessageHandleResult result;
@@ -347,13 +347,12 @@ AdminMessageHandleResult ExternalNotificationModule::handleAdminMessageForModule
void ExternalNotificationModule::handleGetRingtone(const MeshPacket &req, AdminMessage *response) void ExternalNotificationModule::handleGetRingtone(const MeshPacket &req, AdminMessage *response)
{ {
LOG_INFO("*** handleGetRingtone\n"); LOG_INFO("*** handleGetRingtone\n");
if(req.decoded.want_response) { if (req.decoded.want_response) {
response->which_payload_variant = AdminMessage_get_ringtone_response_tag; response->which_payload_variant = AdminMessage_get_ringtone_response_tag;
strncpy(response->get_ringtone_response, rtttlConfig.ringtone, sizeof(response->get_ringtone_response)); strncpy(response->get_ringtone_response, rtttlConfig.ringtone, sizeof(response->get_ringtone_response));
} // Don't send anything if not instructed to. Better than asserting. } // Don't send anything if not instructed to. Better than asserting.
} }
void ExternalNotificationModule::handleSetRingtone(const char *from_msg) void ExternalNotificationModule::handleSetRingtone(const char *from_msg)
{ {
int changed = 0; int changed = 0;
+4 -3
View File
@@ -1,7 +1,7 @@
#pragma once #pragma once
#include "ProtobufModule.h" #include "ProtobufModule.h"
#include "mesh/generated/remote_hardware.pb.h"
#include "concurrency/OSThread.h" #include "concurrency/OSThread.h"
#include "mesh/generated/meshtastic/remote_hardware.pb.h"
/** /**
* A module that provides easy low-level remote access to device hardware. * A module that provides easy low-level remote access to device hardware.
@@ -9,13 +9,14 @@
class RemoteHardwareModule : public ProtobufModule<HardwareMessage>, private concurrency::OSThread class RemoteHardwareModule : public ProtobufModule<HardwareMessage>, private concurrency::OSThread
{ {
/// The current set of GPIOs we've been asked to watch for changes /// The current set of GPIOs we've been asked to watch for changes
uint64_t watchGpios = 0; uint64_t watchGpios = 0;
/// The previously read value of watched pins /// The previously read value of watched pins
uint64_t previousWatch = 0; uint64_t previousWatch = 0;
/// The timestamp of our last watch event (we throttle watches to 1 change every 30 seconds) /// The timestamp of our last watch event (we throttle watches to 1 change every 30 seconds)
uint32_t lastWatchMsec = 0; uint32_t lastWatchMsec = 0;
public: public:
/** Constructor /** Constructor
* name is for debugging output * name is for debugging output
@@ -32,7 +33,7 @@ class RemoteHardwareModule : public ProtobufModule<HardwareMessage>, private con
/** /**
* Periodically read the gpios we have been asked to WATCH, if they have changed, * Periodically read the gpios we have been asked to WATCH, if they have changed,
* broadcast a message with the change information. * broadcast a message with the change information.
* *
* The method that will be called each time our thread gets a chance to run * The method that will be called each time our thread gets a chance to run
* *
* Returns desired period for next invocation (or RUN_SAME for no change) * Returns desired period for next invocation (or RUN_SAME for no change)
+10 -16
View File
@@ -1,5 +1,5 @@
#include "DeviceTelemetry.h" #include "DeviceTelemetry.h"
#include "../mesh/generated/telemetry.pb.h" #include "../mesh/generated/meshtastic/telemetry.pb.h"
#include "MeshService.h" #include "MeshService.h"
#include "NodeDB.h" #include "NodeDB.h"
#include "PowerFSM.h" #include "PowerFSM.h"
@@ -9,13 +9,12 @@
#include "main.h" #include "main.h"
#include <OLEDDisplay.h> #include <OLEDDisplay.h>
#include <OLEDDisplayUi.h> #include <OLEDDisplayUi.h>
#include "MeshService.h"
int32_t DeviceTelemetryModule::runOnce() int32_t DeviceTelemetryModule::runOnce()
{ {
uint32_t now = millis(); uint32_t now = millis();
if ((lastSentToMesh == 0 || if ((lastSentToMesh == 0 ||
(now - lastSentToMesh) >= getConfiguredOrDefaultMs(moduleConfig.telemetry.device_update_interval)) && (now - lastSentToMesh) >= getConfiguredOrDefaultMs(moduleConfig.telemetry.device_update_interval)) &&
airTime->isTxAllowedChannelUtil() && airTime->isTxAllowedAirUtil()) { airTime->isTxAllowedChannelUtil() && airTime->isTxAllowedAirUtil()) {
sendTelemetry(); sendTelemetry();
lastSentToMesh = now; lastSentToMesh = now;
@@ -31,13 +30,10 @@ bool DeviceTelemetryModule::handleReceivedProtobuf(const MeshPacket &mp, Telemet
{ {
if (t->which_variant == Telemetry_device_metrics_tag) { if (t->which_variant == Telemetry_device_metrics_tag) {
const char *sender = getSenderShortName(mp); const char *sender = getSenderShortName(mp);
LOG_INFO("(Received from %s): air_util_tx=%f, channel_utilization=%f, battery_level=%i, voltage=%f\n", LOG_INFO("(Received from %s): air_util_tx=%f, channel_utilization=%f, battery_level=%i, voltage=%f\n", sender,
sender, t->variant.device_metrics.air_util_tx, t->variant.device_metrics.channel_utilization,
t->variant.device_metrics.air_util_tx, t->variant.device_metrics.battery_level, t->variant.device_metrics.voltage);
t->variant.device_metrics.channel_utilization,
t->variant.device_metrics.battery_level,
t->variant.device_metrics.voltage);
lastMeasurementPacket = packetPool.allocCopy(mp); lastMeasurementPacket = packetPool.allocCopy(mp);
@@ -58,11 +54,9 @@ bool DeviceTelemetryModule::sendTelemetry(NodeNum dest, bool phoneOnly)
t.variant.device_metrics.channel_utilization = myNodeInfo.channel_utilization; t.variant.device_metrics.channel_utilization = myNodeInfo.channel_utilization;
t.variant.device_metrics.voltage = powerStatus->getBatteryVoltageMv() / 1000.0; t.variant.device_metrics.voltage = powerStatus->getBatteryVoltageMv() / 1000.0;
LOG_INFO("(Sending): air_util_tx=%f, channel_utilization=%f, battery_level=%i, voltage=%f\n", LOG_INFO("(Sending): air_util_tx=%f, channel_utilization=%f, battery_level=%i, voltage=%f\n",
t.variant.device_metrics.air_util_tx, t.variant.device_metrics.air_util_tx, t.variant.device_metrics.channel_utilization,
t.variant.device_metrics.channel_utilization, t.variant.device_metrics.battery_level, t.variant.device_metrics.voltage);
t.variant.device_metrics.battery_level,
t.variant.device_metrics.voltage);
MeshPacket *p = allocDataProtobuf(t); MeshPacket *p = allocDataProtobuf(t);
p->to = dest; p->to = dest;
+3 -3
View File
@@ -1,5 +1,5 @@
#pragma once #pragma once
#include "../mesh/generated/telemetry.pb.h" #include "../mesh/generated/meshtastic/telemetry.pb.h"
#include "NodeDB.h" #include "NodeDB.h"
#include "ProtobufModule.h" #include "ProtobufModule.h"
#include <OLEDDisplay.h> #include <OLEDDisplay.h>
@@ -11,8 +11,8 @@ class DeviceTelemetryModule : private concurrency::OSThread, public ProtobufModu
DeviceTelemetryModule() DeviceTelemetryModule()
: concurrency::OSThread("DeviceTelemetryModule"), ProtobufModule("DeviceTelemetry", PortNum_TELEMETRY_APP, &Telemetry_msg) : concurrency::OSThread("DeviceTelemetryModule"), ProtobufModule("DeviceTelemetry", PortNum_TELEMETRY_APP, &Telemetry_msg)
{ {
lastMeasurementPacket = nullptr; lastMeasurementPacket = nullptr;
setIntervalFromNow(10 * 1000); setIntervalFromNow(10 * 1000);
} }
virtual bool wantUIFrame() { return false; } virtual bool wantUIFrame() { return false; }
+29 -34
View File
@@ -1,5 +1,5 @@
#include "EnvironmentTelemetry.h" #include "EnvironmentTelemetry.h"
#include "../mesh/generated/telemetry.pb.h" #include "../mesh/generated/meshtastic/telemetry.pb.h"
#include "MeshService.h" #include "MeshService.h"
#include "NodeDB.h" #include "NodeDB.h"
#include "PowerFSM.h" #include "PowerFSM.h"
@@ -9,18 +9,17 @@
#include "main.h" #include "main.h"
#include <OLEDDisplay.h> #include <OLEDDisplay.h>
#include <OLEDDisplayUi.h> #include <OLEDDisplayUi.h>
#include "MeshService.h"
// Sensors // Sensors
#include "Sensor/BMP280Sensor.h"
#include "Sensor/BME280Sensor.h" #include "Sensor/BME280Sensor.h"
#include "Sensor/BME680Sensor.h" #include "Sensor/BME680Sensor.h"
#include "Sensor/MCP9808Sensor.h" #include "Sensor/BMP280Sensor.h"
#include "Sensor/INA260Sensor.h"
#include "Sensor/INA219Sensor.h" #include "Sensor/INA219Sensor.h"
#include "Sensor/SHTC3Sensor.h" #include "Sensor/INA260Sensor.h"
#include "Sensor/LPS22HBSensor.h" #include "Sensor/LPS22HBSensor.h"
#include "Sensor/MCP9808Sensor.h"
#include "Sensor/SHT31Sensor.h" #include "Sensor/SHT31Sensor.h"
#include "Sensor/SHTC3Sensor.h"
BMP280Sensor bmp280Sensor; BMP280Sensor bmp280Sensor;
BME280Sensor bme280Sensor; BME280Sensor bme280Sensor;
@@ -59,13 +58,12 @@ int32_t EnvironmentTelemetryModule::runOnce()
Uncomment the preferences below if you want to use the module Uncomment the preferences below if you want to use the module
without having to configure it from the PythonAPI or WebUI. without having to configure it from the PythonAPI or WebUI.
*/ */
// moduleConfig.telemetry.environment_measurement_enabled = 1; // moduleConfig.telemetry.environment_measurement_enabled = 1;
// moduleConfig.telemetry.environment_screen_enabled = 1; // moduleConfig.telemetry.environment_screen_enabled = 1;
// moduleConfig.telemetry.environment_update_interval = 45; // moduleConfig.telemetry.environment_update_interval = 45;
if (!(moduleConfig.telemetry.environment_measurement_enabled || if (!(moduleConfig.telemetry.environment_measurement_enabled || moduleConfig.telemetry.environment_screen_enabled)) {
moduleConfig.telemetry.environment_screen_enabled)) {
// If this module is not enabled, and the user doesn't want the display screen don't waste any OSThread time on it // If this module is not enabled, and the user doesn't want the display screen don't waste any OSThread time on it
return disable(); return disable();
} }
@@ -78,15 +76,15 @@ int32_t EnvironmentTelemetryModule::runOnce()
LOG_INFO("Environment Telemetry: Initializing\n"); LOG_INFO("Environment Telemetry: Initializing\n");
// it's possible to have this module enabled, only for displaying values on the screen. // it's possible to have this module enabled, only for displaying values on the screen.
// therefore, we should only enable the sensor loop if measurement is also enabled // therefore, we should only enable the sensor loop if measurement is also enabled
if (bmp280Sensor.hasSensor()) if (bmp280Sensor.hasSensor())
result = bmp280Sensor.runOnce(); result = bmp280Sensor.runOnce();
if (bme280Sensor.hasSensor()) if (bme280Sensor.hasSensor())
result = bme280Sensor.runOnce(); result = bme280Sensor.runOnce();
if (bme680Sensor.hasSensor()) if (bme680Sensor.hasSensor())
result = bme680Sensor.runOnce(); result = bme680Sensor.runOnce();
if (mcp9808Sensor.hasSensor()) if (mcp9808Sensor.hasSensor())
result = mcp9808Sensor.runOnce(); result = mcp9808Sensor.runOnce();
if (ina260Sensor.hasSensor()) if (ina260Sensor.hasSensor())
result = ina260Sensor.runOnce(); result = ina260Sensor.runOnce();
if (ina219Sensor.hasSensor()) if (ina219Sensor.hasSensor())
result = ina219Sensor.runOnce(); result = ina219Sensor.runOnce();
@@ -105,8 +103,8 @@ int32_t EnvironmentTelemetryModule::runOnce()
return result; return result;
uint32_t now = millis(); uint32_t now = millis();
if ((lastSentToMesh == 0 || if ((lastSentToMesh == 0 ||
(now - lastSentToMesh) >= getConfiguredOrDefaultMs(moduleConfig.telemetry.environment_update_interval)) && (now - lastSentToMesh) >= getConfiguredOrDefaultMs(moduleConfig.telemetry.environment_update_interval)) &&
airTime->isTxAllowedAirUtil()) { airTime->isTxAllowedAirUtil()) {
sendTelemetry(); sendTelemetry();
lastSentToMesh = now; lastSentToMesh = now;
@@ -173,13 +171,15 @@ void EnvironmentTelemetryModule::drawFrame(OLEDDisplay *display, OLEDDisplayUiSt
} }
display->drawString(x, y += fontHeight(FONT_MEDIUM) - 2, "From: " + String(lastSender) + "(" + String(agoSecs) + "s)"); display->drawString(x, y += fontHeight(FONT_MEDIUM) - 2, "From: " + String(lastSender) + "(" + String(agoSecs) + "s)");
display->drawString(x, y += fontHeight(FONT_SMALL) - 2, display->drawString(x, y += fontHeight(FONT_SMALL) - 2,
"Temp/Hum: " + last_temp + " / " + String(lastMeasurement.variant.environment_metrics.relative_humidity, 0) + "%"); "Temp/Hum: " + last_temp + " / " +
String(lastMeasurement.variant.environment_metrics.relative_humidity, 0) + "%");
if (lastMeasurement.variant.environment_metrics.barometric_pressure != 0) if (lastMeasurement.variant.environment_metrics.barometric_pressure != 0)
display->drawString(x, y += fontHeight(FONT_SMALL), display->drawString(x, y += fontHeight(FONT_SMALL),
"Press: " + String(lastMeasurement.variant.environment_metrics.barometric_pressure, 0) + "hPA"); "Press: " + String(lastMeasurement.variant.environment_metrics.barometric_pressure, 0) + "hPA");
if (lastMeasurement.variant.environment_metrics.voltage != 0) if (lastMeasurement.variant.environment_metrics.voltage != 0)
display->drawString(x, y += fontHeight(FONT_SMALL), display->drawString(x, y += fontHeight(FONT_SMALL),
"Volt/Cur: " + String(lastMeasurement.variant.environment_metrics.voltage, 0) + "V / " + String(lastMeasurement.variant.environment_metrics.current, 0) + "mA"); "Volt/Cur: " + String(lastMeasurement.variant.environment_metrics.voltage, 0) + "V / " +
String(lastMeasurement.variant.environment_metrics.current, 0) + "mA");
} }
bool EnvironmentTelemetryModule::handleReceivedProtobuf(const MeshPacket &mp, Telemetry *t) bool EnvironmentTelemetryModule::handleReceivedProtobuf(const MeshPacket &mp, Telemetry *t)
@@ -187,14 +187,11 @@ bool EnvironmentTelemetryModule::handleReceivedProtobuf(const MeshPacket &mp, Te
if (t->which_variant == Telemetry_environment_metrics_tag) { if (t->which_variant == Telemetry_environment_metrics_tag) {
const char *sender = getSenderShortName(mp); const char *sender = getSenderShortName(mp);
LOG_INFO("(Received from %s): barometric_pressure=%f, current=%f, gas_resistance=%f, relative_humidity=%f, temperature=%f, voltage=%f\n", LOG_INFO("(Received from %s): barometric_pressure=%f, current=%f, gas_resistance=%f, relative_humidity=%f, "
sender, "temperature=%f, voltage=%f\n",
t->variant.environment_metrics.barometric_pressure, sender, t->variant.environment_metrics.barometric_pressure, t->variant.environment_metrics.current,
t->variant.environment_metrics.current, t->variant.environment_metrics.gas_resistance, t->variant.environment_metrics.relative_humidity,
t->variant.environment_metrics.gas_resistance, t->variant.environment_metrics.temperature, t->variant.environment_metrics.voltage);
t->variant.environment_metrics.relative_humidity,
t->variant.environment_metrics.temperature,
t->variant.environment_metrics.voltage);
lastMeasurementPacket = packetPool.allocCopy(mp); lastMeasurementPacket = packetPool.allocCopy(mp);
} }
@@ -234,13 +231,11 @@ bool EnvironmentTelemetryModule::sendTelemetry(NodeNum dest, bool phoneOnly)
if (ina260Sensor.hasSensor()) if (ina260Sensor.hasSensor())
ina260Sensor.getMetrics(&m); ina260Sensor.getMetrics(&m);
LOG_INFO("(Sending): barometric_pressure=%f, current=%f, gas_resistance=%f, relative_humidity=%f, temperature=%f, voltage=%f\n", LOG_INFO(
m.variant.environment_metrics.barometric_pressure, "(Sending): barometric_pressure=%f, current=%f, gas_resistance=%f, relative_humidity=%f, temperature=%f, voltage=%f\n",
m.variant.environment_metrics.current, m.variant.environment_metrics.barometric_pressure, m.variant.environment_metrics.current,
m.variant.environment_metrics.gas_resistance, m.variant.environment_metrics.gas_resistance, m.variant.environment_metrics.relative_humidity,
m.variant.environment_metrics.relative_humidity, m.variant.environment_metrics.temperature, m.variant.environment_metrics.voltage);
m.variant.environment_metrics.temperature,
m.variant.environment_metrics.voltage);
sensor_read_error_count = 0; sensor_read_error_count = 0;
+3 -3
View File
@@ -1,5 +1,5 @@
#pragma once #pragma once
#include "../mesh/generated/telemetry.pb.h" #include "../mesh/generated/meshtastic/telemetry.pb.h"
#include "NodeDB.h" #include "NodeDB.h"
#include "ProtobufModule.h" #include "ProtobufModule.h"
#include <OLEDDisplay.h> #include <OLEDDisplay.h>
@@ -12,8 +12,8 @@ class EnvironmentTelemetryModule : private concurrency::OSThread, public Protobu
: concurrency::OSThread("EnvironmentTelemetryModule"), : concurrency::OSThread("EnvironmentTelemetryModule"),
ProtobufModule("EnvironmentTelemetry", PortNum_TELEMETRY_APP, &Telemetry_msg) ProtobufModule("EnvironmentTelemetry", PortNum_TELEMETRY_APP, &Telemetry_msg)
{ {
lastMeasurementPacket = nullptr; lastMeasurementPacket = nullptr;
setIntervalFromNow(10 * 1000); setIntervalFromNow(10 * 1000);
} }
virtual bool wantUIFrame() override; virtual bool wantUIFrame() override;
#if !HAS_SCREEN #if !HAS_SCREEN
+18 -20
View File
@@ -1,35 +1,33 @@
#include "../mesh/generated/telemetry.pb.h"
#include "configuration.h"
#include "TelemetrySensor.h"
#include "BME280Sensor.h" #include "BME280Sensor.h"
#include "../mesh/generated/meshtastic/telemetry.pb.h"
#include "TelemetrySensor.h"
#include "configuration.h"
#include <Adafruit_BME280.h> #include <Adafruit_BME280.h>
#include <typeinfo> #include <typeinfo>
BME280Sensor::BME280Sensor() : BME280Sensor::BME280Sensor() : TelemetrySensor(TelemetrySensorType_BME280, "BME280") {}
TelemetrySensor(TelemetrySensorType_BME280, "BME280")
{
}
int32_t BME280Sensor::runOnce() { int32_t BME280Sensor::runOnce()
{
LOG_INFO("Init sensor: %s\n", sensorName); LOG_INFO("Init sensor: %s\n", sensorName);
if (!hasSensor()) { if (!hasSensor()) {
return DEFAULT_SENSOR_MINIMUM_WAIT_TIME_BETWEEN_READS; return DEFAULT_SENSOR_MINIMUM_WAIT_TIME_BETWEEN_READS;
} }
status = bme280.begin(nodeTelemetrySensorsMap[sensorType]); status = bme280.begin(nodeTelemetrySensorsMap[sensorType]);
bme280.setSampling( Adafruit_BME280::MODE_FORCED, bme280.setSampling(Adafruit_BME280::MODE_FORCED,
Adafruit_BME280::SAMPLING_X1, // Temp. oversampling Adafruit_BME280::SAMPLING_X1, // Temp. oversampling
Adafruit_BME280::SAMPLING_X1, // Pressure oversampling Adafruit_BME280::SAMPLING_X1, // Pressure oversampling
Adafruit_BME280::SAMPLING_X1, // Humidity oversampling Adafruit_BME280::SAMPLING_X1, // Humidity oversampling
Adafruit_BME280::FILTER_OFF, Adafruit_BME280::FILTER_OFF, Adafruit_BME280::STANDBY_MS_1000);
Adafruit_BME280::STANDBY_MS_1000);
return initI2CSensor(); return initI2CSensor();
} }
void BME280Sensor::setup() { } void BME280Sensor::setup() {}
bool BME280Sensor::getMetrics(Telemetry *measurement) { bool BME280Sensor::getMetrics(Telemetry *measurement)
{
LOG_DEBUG("BME280Sensor::getMetrics\n"); LOG_DEBUG("BME280Sensor::getMetrics\n");
bme280.takeForcedMeasurement(); bme280.takeForcedMeasurement();
measurement->variant.environment_metrics.temperature = bme280.readTemperature(); measurement->variant.environment_metrics.temperature = bme280.readTemperature();
@@ -37,4 +35,4 @@ bool BME280Sensor::getMetrics(Telemetry *measurement) {
measurement->variant.environment_metrics.barometric_pressure = bme280.readPressure() / 100.0F; measurement->variant.environment_metrics.barometric_pressure = bme280.readPressure() / 100.0F;
return true; return true;
} }
+7 -6
View File
@@ -1,16 +1,17 @@
#include "../mesh/generated/telemetry.pb.h" #include "../mesh/generated/meshtastic/telemetry.pb.h"
#include "TelemetrySensor.h" #include "TelemetrySensor.h"
#include <Adafruit_BME280.h> #include <Adafruit_BME280.h>
class BME280Sensor : virtual public TelemetrySensor { class BME280Sensor : virtual public TelemetrySensor
private: {
private:
Adafruit_BME280 bme280; Adafruit_BME280 bme280;
protected: protected:
virtual void setup() override; virtual void setup() override;
public: public:
BME280Sensor(); BME280Sensor();
virtual int32_t runOnce() override; virtual int32_t runOnce() override;
virtual bool getMetrics(Telemetry *measurement) override; virtual bool getMetrics(Telemetry *measurement) override;
}; };
+10 -11
View File
@@ -1,15 +1,13 @@
#include "../mesh/generated/telemetry.pb.h"
#include "configuration.h"
#include "TelemetrySensor.h"
#include "BME680Sensor.h" #include "BME680Sensor.h"
#include "../mesh/generated/meshtastic/telemetry.pb.h"
#include "TelemetrySensor.h"
#include "configuration.h"
#include <Adafruit_BME680.h> #include <Adafruit_BME680.h>
BME680Sensor::BME680Sensor() : BME680Sensor::BME680Sensor() : TelemetrySensor(TelemetrySensorType_BME680, "BME680") {}
TelemetrySensor(TelemetrySensorType_BME680, "BME680")
{
}
int32_t BME680Sensor::runOnce() { int32_t BME680Sensor::runOnce()
{
LOG_INFO("Init sensor: %s\n", sensorName); LOG_INFO("Init sensor: %s\n", sensorName);
if (!hasSensor()) { if (!hasSensor()) {
return DEFAULT_SENSOR_MINIMUM_WAIT_TIME_BETWEEN_READS; return DEFAULT_SENSOR_MINIMUM_WAIT_TIME_BETWEEN_READS;
@@ -19,9 +17,10 @@ int32_t BME680Sensor::runOnce() {
return initI2CSensor(); return initI2CSensor();
} }
void BME680Sensor::setup() { } void BME680Sensor::setup() {}
bool BME680Sensor::getMetrics(Telemetry *measurement) { bool BME680Sensor::getMetrics(Telemetry *measurement)
{
bme680.performReading(); bme680.performReading();
measurement->variant.environment_metrics.temperature = bme680.temperature; measurement->variant.environment_metrics.temperature = bme680.temperature;
measurement->variant.environment_metrics.relative_humidity = bme680.humidity; measurement->variant.environment_metrics.relative_humidity = bme680.humidity;
@@ -29,4 +28,4 @@ bool BME680Sensor::getMetrics(Telemetry *measurement) {
measurement->variant.environment_metrics.gas_resistance = bme680.gas_resistance / 1000.0; measurement->variant.environment_metrics.gas_resistance = bme680.gas_resistance / 1000.0;
return true; return true;
} }
+8 -7
View File
@@ -1,16 +1,17 @@
#include "../mesh/generated/telemetry.pb.h" #include "../mesh/generated/meshtastic/telemetry.pb.h"
#include "TelemetrySensor.h" #include "TelemetrySensor.h"
#include <Adafruit_BME680.h> #include <Adafruit_BME680.h>
class BME680Sensor : virtual public TelemetrySensor { class BME680Sensor : virtual public TelemetrySensor
private: {
private:
Adafruit_BME680 bme680; Adafruit_BME680 bme680;
protected: protected:
virtual void setup() override; virtual void setup() override;
public: public:
BME680Sensor(); BME680Sensor();
virtual int32_t runOnce() override; virtual int32_t runOnce() override;
virtual bool getMetrics(Telemetry *measurement) override; virtual bool getMetrics(Telemetry *measurement) override;
}; };
+15 -17
View File
@@ -1,38 +1,36 @@
#include "../mesh/generated/telemetry.pb.h"
#include "configuration.h"
#include "TelemetrySensor.h"
#include "BMP280Sensor.h" #include "BMP280Sensor.h"
#include "../mesh/generated/meshtastic/telemetry.pb.h"
#include "TelemetrySensor.h"
#include "configuration.h"
#include <Adafruit_BMP280.h> #include <Adafruit_BMP280.h>
#include <typeinfo> #include <typeinfo>
BMP280Sensor::BMP280Sensor() : BMP280Sensor::BMP280Sensor() : TelemetrySensor(TelemetrySensorType_BMP280, "BMP280") {}
TelemetrySensor(TelemetrySensorType_BMP280, "BMP280")
{
}
int32_t BMP280Sensor::runOnce() { int32_t BMP280Sensor::runOnce()
{
LOG_INFO("Init sensor: %s\n", sensorName); LOG_INFO("Init sensor: %s\n", sensorName);
if (!hasSensor()) { if (!hasSensor()) {
return DEFAULT_SENSOR_MINIMUM_WAIT_TIME_BETWEEN_READS; return DEFAULT_SENSOR_MINIMUM_WAIT_TIME_BETWEEN_READS;
} }
status = bmp280.begin(nodeTelemetrySensorsMap[sensorType]); status = bmp280.begin(nodeTelemetrySensorsMap[sensorType]);
bmp280.setSampling( Adafruit_BMP280::MODE_FORCED, bmp280.setSampling(Adafruit_BMP280::MODE_FORCED,
Adafruit_BMP280::SAMPLING_X1, // Temp. oversampling Adafruit_BMP280::SAMPLING_X1, // Temp. oversampling
Adafruit_BMP280::SAMPLING_X1, // Pressure oversampling Adafruit_BMP280::SAMPLING_X1, // Pressure oversampling
Adafruit_BMP280::FILTER_OFF, Adafruit_BMP280::FILTER_OFF, Adafruit_BMP280::STANDBY_MS_1000);
Adafruit_BMP280::STANDBY_MS_1000);
return initI2CSensor(); return initI2CSensor();
} }
void BMP280Sensor::setup() { } void BMP280Sensor::setup() {}
bool BMP280Sensor::getMetrics(Telemetry *measurement) { bool BMP280Sensor::getMetrics(Telemetry *measurement)
{
LOG_DEBUG("BMP280Sensor::getMetrics\n"); LOG_DEBUG("BMP280Sensor::getMetrics\n");
bmp280.takeForcedMeasurement(); bmp280.takeForcedMeasurement();
measurement->variant.environment_metrics.temperature = bmp280.readTemperature(); measurement->variant.environment_metrics.temperature = bmp280.readTemperature();
measurement->variant.environment_metrics.barometric_pressure = bmp280.readPressure() / 100.0F; measurement->variant.environment_metrics.barometric_pressure = bmp280.readPressure() / 100.0F;
return true; return true;
} }
+7 -6
View File
@@ -1,16 +1,17 @@
#include "../mesh/generated/telemetry.pb.h" #include "../mesh/generated/meshtastic/telemetry.pb.h"
#include "TelemetrySensor.h" #include "TelemetrySensor.h"
#include <Adafruit_BMP280.h> #include <Adafruit_BMP280.h>
class BMP280Sensor : virtual public TelemetrySensor { class BMP280Sensor : virtual public TelemetrySensor
private: {
private:
Adafruit_BMP280 bmp280; Adafruit_BMP280 bmp280;
protected: protected:
virtual void setup() override; virtual void setup() override;
public: public:
BMP280Sensor(); BMP280Sensor();
virtual int32_t runOnce() override; virtual int32_t runOnce() override;
virtual bool getMetrics(Telemetry *measurement) override; virtual bool getMetrics(Telemetry *measurement) override;
}; };
+10 -13
View File
@@ -1,15 +1,13 @@
#include "../mesh/generated/telemetry.pb.h"
#include "configuration.h"
#include "TelemetrySensor.h"
#include "INA219Sensor.h" #include "INA219Sensor.h"
#include "../mesh/generated/meshtastic/telemetry.pb.h"
#include "TelemetrySensor.h"
#include "configuration.h"
#include <Adafruit_INA219.h> #include <Adafruit_INA219.h>
INA219Sensor::INA219Sensor() : INA219Sensor::INA219Sensor() : TelemetrySensor(TelemetrySensorType_INA219, "INA219") {}
TelemetrySensor(TelemetrySensorType_INA219, "INA219")
{
}
int32_t INA219Sensor::runOnce() { int32_t INA219Sensor::runOnce()
{
LOG_INFO("Init sensor: %s\n", sensorName); LOG_INFO("Init sensor: %s\n", sensorName);
if (!hasSensor()) { if (!hasSensor()) {
return DEFAULT_SENSOR_MINIMUM_WAIT_TIME_BETWEEN_READS; return DEFAULT_SENSOR_MINIMUM_WAIT_TIME_BETWEEN_READS;
@@ -19,12 +17,11 @@ int32_t INA219Sensor::runOnce() {
return initI2CSensor(); return initI2CSensor();
} }
void INA219Sensor::setup() void INA219Sensor::setup() {}
{
}
bool INA219Sensor::getMetrics(Telemetry *measurement) { bool INA219Sensor::getMetrics(Telemetry *measurement)
{
measurement->variant.environment_metrics.voltage = ina219.getBusVoltage_V(); measurement->variant.environment_metrics.voltage = ina219.getBusVoltage_V();
measurement->variant.environment_metrics.current = ina219.getCurrent_mA(); measurement->variant.environment_metrics.current = ina219.getCurrent_mA();
return true; return true;
} }
+8 -8
View File
@@ -1,17 +1,17 @@
#include "../mesh/generated/telemetry.pb.h" #include "../mesh/generated/meshtastic/telemetry.pb.h"
#include "TelemetrySensor.h" #include "TelemetrySensor.h"
#include <Adafruit_INA219.h> #include <Adafruit_INA219.h>
class INA219Sensor : virtual public TelemetrySensor
class INA219Sensor : virtual public TelemetrySensor { {
private: private:
Adafruit_INA219 ina219; Adafruit_INA219 ina219;
protected: protected:
virtual void setup() override; virtual void setup() override;
public: public:
INA219Sensor(); INA219Sensor();
virtual int32_t runOnce() override; virtual int32_t runOnce() override;
virtual bool getMetrics(Telemetry *measurement) override; virtual bool getMetrics(Telemetry *measurement) override;
}; };
+10 -13
View File
@@ -1,15 +1,13 @@
#include "../mesh/generated/telemetry.pb.h"
#include "configuration.h"
#include "TelemetrySensor.h"
#include "INA260Sensor.h" #include "INA260Sensor.h"
#include "../mesh/generated/meshtastic/telemetry.pb.h"
#include "TelemetrySensor.h"
#include "configuration.h"
#include <Adafruit_INA260.h> #include <Adafruit_INA260.h>
INA260Sensor::INA260Sensor() : INA260Sensor::INA260Sensor() : TelemetrySensor(TelemetrySensorType_INA260, "INA260") {}
TelemetrySensor(TelemetrySensorType_INA260, "INA260")
{
}
int32_t INA260Sensor::runOnce() { int32_t INA260Sensor::runOnce()
{
LOG_INFO("Init sensor: %s\n", sensorName); LOG_INFO("Init sensor: %s\n", sensorName);
if (!hasSensor()) { if (!hasSensor()) {
return DEFAULT_SENSOR_MINIMUM_WAIT_TIME_BETWEEN_READS; return DEFAULT_SENSOR_MINIMUM_WAIT_TIME_BETWEEN_READS;
@@ -18,13 +16,12 @@ int32_t INA260Sensor::runOnce() {
return initI2CSensor(); return initI2CSensor();
} }
void INA260Sensor::setup() void INA260Sensor::setup() {}
{
}
bool INA260Sensor::getMetrics(Telemetry *measurement) { bool INA260Sensor::getMetrics(Telemetry *measurement)
{
// mV conversion to V // mV conversion to V
measurement->variant.environment_metrics.voltage = ina260.readBusVoltage() / 1000; measurement->variant.environment_metrics.voltage = ina260.readBusVoltage() / 1000;
measurement->variant.environment_metrics.current = ina260.readCurrent(); measurement->variant.environment_metrics.current = ina260.readCurrent();
return true; return true;
} }
+8 -8
View File
@@ -1,17 +1,17 @@
#include "../mesh/generated/telemetry.pb.h" #include "../mesh/generated/meshtastic/telemetry.pb.h"
#include "TelemetrySensor.h" #include "TelemetrySensor.h"
#include <Adafruit_INA260.h> #include <Adafruit_INA260.h>
class INA260Sensor : virtual public TelemetrySensor
class INA260Sensor : virtual public TelemetrySensor { {
private: private:
Adafruit_INA260 ina260 = Adafruit_INA260(); Adafruit_INA260 ina260 = Adafruit_INA260();
protected: protected:
virtual void setup() override; virtual void setup() override;
public: public:
INA260Sensor(); INA260Sensor();
virtual int32_t runOnce() override; virtual int32_t runOnce() override;
virtual bool getMetrics(Telemetry *measurement) override; virtual bool getMetrics(Telemetry *measurement) override;
}; };
+10 -11
View File
@@ -1,16 +1,14 @@
#include "../mesh/generated/telemetry.pb.h"
#include "configuration.h"
#include "TelemetrySensor.h"
#include "LPS22HBSensor.h" #include "LPS22HBSensor.h"
#include "../mesh/generated/meshtastic/telemetry.pb.h"
#include "TelemetrySensor.h"
#include "configuration.h"
#include <Adafruit_LPS2X.h> #include <Adafruit_LPS2X.h>
#include <Adafruit_Sensor.h> #include <Adafruit_Sensor.h>
LPS22HBSensor::LPS22HBSensor() : LPS22HBSensor::LPS22HBSensor() : TelemetrySensor(TelemetrySensorType_LPS22, "LPS22HB") {}
TelemetrySensor(TelemetrySensorType_LPS22, "LPS22HB")
{
}
int32_t LPS22HBSensor::runOnce() { int32_t LPS22HBSensor::runOnce()
{
LOG_INFO("Init sensor: %s\n", sensorName); LOG_INFO("Init sensor: %s\n", sensorName);
if (!hasSensor()) { if (!hasSensor()) {
return DEFAULT_SENSOR_MINIMUM_WAIT_TIME_BETWEEN_READS; return DEFAULT_SENSOR_MINIMUM_WAIT_TIME_BETWEEN_READS;
@@ -19,12 +17,13 @@ int32_t LPS22HBSensor::runOnce() {
return initI2CSensor(); return initI2CSensor();
} }
void LPS22HBSensor::setup() void LPS22HBSensor::setup()
{ {
lps22hb.setDataRate(LPS22_RATE_10_HZ); lps22hb.setDataRate(LPS22_RATE_10_HZ);
} }
bool LPS22HBSensor::getMetrics(Telemetry *measurement) { bool LPS22HBSensor::getMetrics(Telemetry *measurement)
{
sensors_event_t temp; sensors_event_t temp;
sensors_event_t pressure; sensors_event_t pressure;
lps22hb.getEvent(&pressure, &temp); lps22hb.getEvent(&pressure, &temp);
@@ -33,4 +32,4 @@ bool LPS22HBSensor::getMetrics(Telemetry *measurement) {
measurement->variant.environment_metrics.barometric_pressure = pressure.pressure; measurement->variant.environment_metrics.barometric_pressure = pressure.pressure;
return true; return true;
} }
+8 -7
View File
@@ -1,17 +1,18 @@
#include "../mesh/generated/telemetry.pb.h" #include "../mesh/generated/meshtastic/telemetry.pb.h"
#include "TelemetrySensor.h" #include "TelemetrySensor.h"
#include <Adafruit_LPS2X.h> #include <Adafruit_LPS2X.h>
#include <Adafruit_Sensor.h> #include <Adafruit_Sensor.h>
class LPS22HBSensor : virtual public TelemetrySensor { class LPS22HBSensor : virtual public TelemetrySensor
private: {
private:
Adafruit_LPS22 lps22hb; Adafruit_LPS22 lps22hb;
protected: protected:
virtual void setup() override; virtual void setup() override;
public: public:
LPS22HBSensor(); LPS22HBSensor();
virtual int32_t runOnce() override; virtual int32_t runOnce() override;
virtual bool getMetrics(Telemetry *measurement) override; virtual bool getMetrics(Telemetry *measurement) override;
}; };
+11 -11
View File
@@ -1,15 +1,13 @@
#include "../mesh/generated/telemetry.pb.h"
#include "configuration.h"
#include "TelemetrySensor.h"
#include "MCP9808Sensor.h" #include "MCP9808Sensor.h"
#include "../mesh/generated/meshtastic/telemetry.pb.h"
#include "TelemetrySensor.h"
#include "configuration.h"
#include <Adafruit_MCP9808.h> #include <Adafruit_MCP9808.h>
MCP9808Sensor::MCP9808Sensor() : MCP9808Sensor::MCP9808Sensor() : TelemetrySensor(TelemetrySensorType_MCP9808, "MCP9808") {}
TelemetrySensor(TelemetrySensorType_MCP9808, "MCP9808")
{
}
int32_t MCP9808Sensor::runOnce() { int32_t MCP9808Sensor::runOnce()
{
LOG_INFO("Init sensor: %s\n", sensorName); LOG_INFO("Init sensor: %s\n", sensorName);
if (!hasSensor()) { if (!hasSensor()) {
return DEFAULT_SENSOR_MINIMUM_WAIT_TIME_BETWEEN_READS; return DEFAULT_SENSOR_MINIMUM_WAIT_TIME_BETWEEN_READS;
@@ -18,12 +16,14 @@ int32_t MCP9808Sensor::runOnce() {
return initI2CSensor(); return initI2CSensor();
} }
void MCP9808Sensor::setup() { void MCP9808Sensor::setup()
{
mcp9808.setResolution(2); mcp9808.setResolution(2);
} }
bool MCP9808Sensor::getMetrics(Telemetry *measurement) { bool MCP9808Sensor::getMetrics(Telemetry *measurement)
{
LOG_DEBUG("MCP9808Sensor::getMetrics\n"); LOG_DEBUG("MCP9808Sensor::getMetrics\n");
measurement->variant.environment_metrics.temperature = mcp9808.readTempC(); measurement->variant.environment_metrics.temperature = mcp9808.readTempC();
return true; return true;
} }
+8 -7
View File
@@ -1,16 +1,17 @@
#include "../mesh/generated/telemetry.pb.h" #include "../mesh/generated/meshtastic/telemetry.pb.h"
#include "TelemetrySensor.h" #include "TelemetrySensor.h"
#include <Adafruit_MCP9808.h> #include <Adafruit_MCP9808.h>
class MCP9808Sensor : virtual public TelemetrySensor { class MCP9808Sensor : virtual public TelemetrySensor
private: {
private:
Adafruit_MCP9808 mcp9808; Adafruit_MCP9808 mcp9808;
protected: protected:
virtual void setup() override; virtual void setup() override;
public: public:
MCP9808Sensor(); MCP9808Sensor();
virtual int32_t runOnce() override; virtual int32_t runOnce() override;
virtual bool getMetrics(Telemetry *measurement) override; virtual bool getMetrics(Telemetry *measurement) override;
}; };
+11 -12
View File
@@ -1,31 +1,30 @@
#include "../mesh/generated/telemetry.pb.h"
#include "configuration.h"
#include "TelemetrySensor.h"
#include "SHT31Sensor.h" #include "SHT31Sensor.h"
#include "../mesh/generated/meshtastic/telemetry.pb.h"
#include "TelemetrySensor.h"
#include "configuration.h"
#include <Adafruit_SHT31.h> #include <Adafruit_SHT31.h>
SHT31Sensor::SHT31Sensor() : SHT31Sensor::SHT31Sensor() : TelemetrySensor(TelemetrySensorType_SHT31, "SHT31") {}
TelemetrySensor(TelemetrySensorType_SHT31, "SHT31")
{
}
int32_t SHT31Sensor::runOnce() { int32_t SHT31Sensor::runOnce()
{
LOG_INFO("Init sensor: %s\n", sensorName); LOG_INFO("Init sensor: %s\n", sensorName);
if (!hasSensor()) { if (!hasSensor()) {
return DEFAULT_SENSOR_MINIMUM_WAIT_TIME_BETWEEN_READS; return DEFAULT_SENSOR_MINIMUM_WAIT_TIME_BETWEEN_READS;
} }
status = sht31.begin(); status = sht31.begin();
return initI2CSensor(); return initI2CSensor();
} }
void SHT31Sensor::setup() void SHT31Sensor::setup()
{ {
// Set up oversampling and filter initialization // Set up oversampling and filter initialization
} }
bool SHT31Sensor::getMetrics(Telemetry *measurement) { bool SHT31Sensor::getMetrics(Telemetry *measurement)
{
measurement->variant.environment_metrics.temperature = sht31.readTemperature(); measurement->variant.environment_metrics.temperature = sht31.readTemperature();
measurement->variant.environment_metrics.relative_humidity = sht31.readHumidity(); measurement->variant.environment_metrics.relative_humidity = sht31.readHumidity();
return true; return true;
} }
+8 -7
View File
@@ -1,16 +1,17 @@
#include "../mesh/generated/telemetry.pb.h" #include "../mesh/generated/meshtastic/telemetry.pb.h"
#include "TelemetrySensor.h" #include "TelemetrySensor.h"
#include <Adafruit_SHT31.h> #include <Adafruit_SHT31.h>
class SHT31Sensor : virtual public TelemetrySensor { class SHT31Sensor : virtual public TelemetrySensor
private: {
private:
Adafruit_SHT31 sht31 = Adafruit_SHT31(); Adafruit_SHT31 sht31 = Adafruit_SHT31();
protected: protected:
virtual void setup() override; virtual void setup() override;
public: public:
SHT31Sensor(); SHT31Sensor();
virtual int32_t runOnce() override; virtual int32_t runOnce() override;
virtual bool getMetrics(Telemetry *measurement) override; virtual bool getMetrics(Telemetry *measurement) override;
}; };
+11 -12
View File
@@ -1,29 +1,28 @@
#include "../mesh/generated/telemetry.pb.h"
#include "configuration.h"
#include "TelemetrySensor.h"
#include "SHTC3Sensor.h" #include "SHTC3Sensor.h"
#include "../mesh/generated/meshtastic/telemetry.pb.h"
#include "TelemetrySensor.h"
#include "configuration.h"
#include <Adafruit_SHTC3.h> #include <Adafruit_SHTC3.h>
SHTC3Sensor::SHTC3Sensor() : SHTC3Sensor::SHTC3Sensor() : TelemetrySensor(TelemetrySensorType_SHTC3, "SHTC3") {}
TelemetrySensor(TelemetrySensorType_SHTC3, "SHTC3")
{
}
int32_t SHTC3Sensor::runOnce() { int32_t SHTC3Sensor::runOnce()
{
LOG_INFO("Init sensor: %s\n", sensorName); LOG_INFO("Init sensor: %s\n", sensorName);
if (!hasSensor()) { if (!hasSensor()) {
return DEFAULT_SENSOR_MINIMUM_WAIT_TIME_BETWEEN_READS; return DEFAULT_SENSOR_MINIMUM_WAIT_TIME_BETWEEN_READS;
} }
status = shtc3.begin(); status = shtc3.begin();
return initI2CSensor(); return initI2CSensor();
} }
void SHTC3Sensor::setup() void SHTC3Sensor::setup()
{ {
// Set up oversampling and filter initialization // Set up oversampling and filter initialization
} }
bool SHTC3Sensor::getMetrics(Telemetry *measurement) { bool SHTC3Sensor::getMetrics(Telemetry *measurement)
{
sensors_event_t humidity, temp; sensors_event_t humidity, temp;
shtc3.getEvent(&humidity, &temp); shtc3.getEvent(&humidity, &temp);
@@ -31,4 +30,4 @@ bool SHTC3Sensor::getMetrics(Telemetry *measurement) {
measurement->variant.environment_metrics.relative_humidity = humidity.relative_humidity; measurement->variant.environment_metrics.relative_humidity = humidity.relative_humidity;
return true; return true;
} }
+8 -7
View File
@@ -1,16 +1,17 @@
#include "../mesh/generated/telemetry.pb.h" #include "../mesh/generated/meshtastic/telemetry.pb.h"
#include "TelemetrySensor.h" #include "TelemetrySensor.h"
#include <Adafruit_SHTC3.h> #include <Adafruit_SHTC3.h>
class SHTC3Sensor : virtual public TelemetrySensor { class SHTC3Sensor : virtual public TelemetrySensor
private: {
private:
Adafruit_SHTC3 shtc3 = Adafruit_SHTC3(); Adafruit_SHTC3 shtc3 = Adafruit_SHTC3();
protected: protected:
virtual void setup() override; virtual void setup() override;
public: public:
SHTC3Sensor(); SHTC3Sensor();
virtual int32_t runOnce() override; virtual int32_t runOnce() override;
virtual bool getMetrics(Telemetry *measurement) override; virtual bool getMetrics(Telemetry *measurement) override;
}; };
@@ -1,4 +1,4 @@
#include "TelemetrySensor.h" #include "TelemetrySensor.h"
#include "../mesh/generated/telemetry.pb.h" #include "../mesh/generated/meshtastic/telemetry.pb.h"
#include "NodeDB.h" #include "NodeDB.h"
#include "main.h" #include "main.h"
@@ -1,5 +1,5 @@
#pragma once #pragma once
#include "../mesh/generated/telemetry.pb.h" #include "../mesh/generated/meshtastic/telemetry.pb.h"
#include "NodeDB.h" #include "NodeDB.h"
#include "main.h" #include "main.h"
@@ -19,7 +19,8 @@ class TelemetrySensor
TelemetrySensorType sensorType; TelemetrySensorType sensorType;
unsigned status; unsigned status;
int32_t initI2CSensor() { int32_t initI2CSensor()
{
if (!status) { if (!status) {
LOG_WARN("Could not connect to detected %s sensor.\n Removing from nodeTelemetrySensorsMap.\n", sensorName); LOG_WARN("Could not connect to detected %s sensor.\n Removing from nodeTelemetrySensorsMap.\n", sensorName);
nodeTelemetrySensorsMap[sensorType] = 0; nodeTelemetrySensorsMap[sensorType] = 0;
@@ -32,9 +33,7 @@ class TelemetrySensor
virtual void setup(); virtual void setup();
public: public:
bool hasSensor() { bool hasSensor() { return sensorType < sizeof(nodeTelemetrySensorsMap) && nodeTelemetrySensorsMap[sensorType] > 0; }
return sensorType < sizeof(nodeTelemetrySensorsMap) && nodeTelemetrySensorsMap[sensorType] > 0;
}
virtual int32_t runOnce() = 0; virtual int32_t runOnce() = 0;
virtual bool getMetrics(Telemetry *measurement) = 0; virtual bool getMetrics(Telemetry *measurement) = 0;
+114 -108
View File
@@ -6,7 +6,7 @@
#include "airtime.h" #include "airtime.h"
#include "configuration.h" #include "configuration.h"
#include "mesh-pb-constants.h" #include "mesh-pb-constants.h"
#include "mesh/generated/storeforward.pb.h" #include "mesh/generated/meshtastic/storeforward.pb.h"
#include "modules/ModuleDev.h" #include "modules/ModuleDev.h"
#include <Arduino.h> #include <Arduino.h>
#include <iterator> #include <iterator>
@@ -63,7 +63,8 @@ void StoreForwardModule::populatePSRAM()
https://learn.upesy.com/en/programmation/psram.html#psram-tab https://learn.upesy.com/en/programmation/psram.html#psram-tab
*/ */
LOG_DEBUG("*** Before PSRAM initilization: heap %d/%d PSRAM %d/%d\n", ESP.getFreeHeap(), ESP.getHeapSize(), ESP.getFreePsram(), ESP.getPsramSize()); LOG_DEBUG("*** Before PSRAM initilization: heap %d/%d PSRAM %d/%d\n", ESP.getFreeHeap(), ESP.getHeapSize(),
ESP.getFreePsram(), ESP.getPsramSize());
this->packetHistoryTXQueue = this->packetHistoryTXQueue =
static_cast<PacketHistoryStruct *>(ps_calloc(this->historyReturnMax, sizeof(PacketHistoryStruct))); static_cast<PacketHistoryStruct *>(ps_calloc(this->historyReturnMax, sizeof(PacketHistoryStruct)));
@@ -76,7 +77,8 @@ void StoreForwardModule::populatePSRAM()
this->packetHistory = static_cast<PacketHistoryStruct *>(ps_calloc(numberOfPackets, sizeof(PacketHistoryStruct))); this->packetHistory = static_cast<PacketHistoryStruct *>(ps_calloc(numberOfPackets, sizeof(PacketHistoryStruct)));
LOG_DEBUG("*** After PSRAM initilization: heap %d/%d PSRAM %d/%d\n", ESP.getFreeHeap(), ESP.getHeapSize(), ESP.getFreePsram(), ESP.getPsramSize()); LOG_DEBUG("*** After PSRAM initilization: heap %d/%d PSRAM %d/%d\n", ESP.getFreeHeap(), ESP.getHeapSize(), ESP.getFreePsram(),
ESP.getPsramSize());
LOG_DEBUG("*** numberOfPackets for packetHistory - %u\n", numberOfPackets); LOG_DEBUG("*** numberOfPackets for packetHistory - %u\n", numberOfPackets);
} }
@@ -296,123 +298,125 @@ bool StoreForwardModule::handleReceivedProtobuf(const MeshPacket &mp, StoreAndFo
requests++; requests++;
switch (p->rr) { switch (p->rr) {
case StoreAndForward_RequestResponse_CLIENT_ERROR: case StoreAndForward_RequestResponse_CLIENT_ERROR:
case StoreAndForward_RequestResponse_CLIENT_ABORT: case StoreAndForward_RequestResponse_CLIENT_ABORT:
if(is_server) { if (is_server) {
// stop sending stuff, the client wants to abort or has another error // stop sending stuff, the client wants to abort or has another error
if ((this->busy) && (this->busyTo == getFrom(&mp))) { if ((this->busy) && (this->busyTo == getFrom(&mp))) {
LOG_ERROR("*** Client in ERROR or ABORT requested\n"); LOG_ERROR("*** Client in ERROR or ABORT requested\n");
this->packetHistoryTXQueue_index = 0; this->packetHistoryTXQueue_index = 0;
this->busy = false; this->busy = false;
}
} }
break; }
break;
case StoreAndForward_RequestResponse_CLIENT_HISTORY: case StoreAndForward_RequestResponse_CLIENT_HISTORY:
if(is_server) { if (is_server) {
requests_history++; requests_history++;
LOG_INFO("*** Client Request to send HISTORY\n"); LOG_INFO("*** Client Request to send HISTORY\n");
// Send the last 60 minutes of messages. // Send the last 60 minutes of messages.
if (this->busy) { if (this->busy) {
storeForwardModule->sendMessage(getFrom(&mp), StoreAndForward_RequestResponse_ROUTER_BUSY); storeForwardModule->sendMessage(getFrom(&mp), StoreAndForward_RequestResponse_ROUTER_BUSY);
LOG_INFO("*** S&F - Busy. Try again shortly.\n"); LOG_INFO("*** S&F - Busy. Try again shortly.\n");
} else {
if ((p->which_variant == StoreAndForward_history_tag) && (p->variant.history.window > 0)) {
storeForwardModule->historySend(p->variant.history.window * 60000, getFrom(&mp)); // window is in minutes
} else { } else {
if ((p->which_variant == StoreAndForward_history_tag) && (p->variant.history.window > 0)){ storeForwardModule->historySend(historyReturnWindow * 60000, getFrom(&mp)); // defaults to 4 hours
storeForwardModule->historySend(p->variant.history.window * 60000, getFrom(&mp)); // window is in minutes
} else {
storeForwardModule->historySend(historyReturnWindow * 60000, getFrom(&mp)); // defaults to 4 hours
}
} }
} }
break; }
break;
case StoreAndForward_RequestResponse_CLIENT_PING: case StoreAndForward_RequestResponse_CLIENT_PING:
if(is_server) { if (is_server) {
LOG_INFO("*** StoreAndForward_RequestResponse_CLIENT_PING\n"); LOG_INFO("*** StoreAndForward_RequestResponse_CLIENT_PING\n");
// respond with a ROUTER PONG // respond with a ROUTER PONG
storeForwardModule->sendMessage(getFrom(&mp), StoreAndForward_RequestResponse_ROUTER_PONG); storeForwardModule->sendMessage(getFrom(&mp), StoreAndForward_RequestResponse_ROUTER_PONG);
}
break;
case StoreAndForward_RequestResponse_CLIENT_PONG:
if (is_server) {
LOG_INFO("*** StoreAndForward_RequestResponse_CLIENT_PONG\n");
// The Client is alive, update NodeDB
nodeDB.updateFrom(mp);
}
break;
case StoreAndForward_RequestResponse_CLIENT_STATS:
if (is_server) {
LOG_INFO("*** Client Request to send STATS\n");
if (this->busy) {
storeForwardModule->sendMessage(getFrom(&mp), StoreAndForward_RequestResponse_ROUTER_BUSY);
LOG_INFO("*** S&F - Busy. Try again shortly.\n");
} else {
storeForwardModule->statsSend(getFrom(&mp));
} }
break; }
break;
case StoreAndForward_RequestResponse_CLIENT_PONG: case StoreAndForward_RequestResponse_ROUTER_ERROR:
if(is_server) { case StoreAndForward_RequestResponse_ROUTER_BUSY:
LOG_INFO("*** StoreAndForward_RequestResponse_CLIENT_PONG\n"); if (is_client) {
// The Client is alive, update NodeDB LOG_DEBUG("*** StoreAndForward_RequestResponse_ROUTER_BUSY\n");
nodeDB.updateFrom(mp); // retry in messages_saved * packetTimeMax ms
retry_delay =
millis() + packetHistoryCurrent * packetTimeMax * (StoreAndForward_RequestResponse_ROUTER_ERROR ? 2 : 1);
}
break;
case StoreAndForward_RequestResponse_ROUTER_PONG:
// A router responded, this is equal to receiving a heartbeat
case StoreAndForward_RequestResponse_ROUTER_HEARTBEAT:
if (is_client) {
// register heartbeat and interval
if (p->which_variant == StoreAndForward_heartbeat_tag) {
heartbeatInterval = p->variant.heartbeat.period;
} }
break; lastHeartbeat = millis();
LOG_INFO("*** StoreAndForward Heartbeat received\n");
}
break;
case StoreAndForward_RequestResponse_CLIENT_STATS: case StoreAndForward_RequestResponse_ROUTER_PING:
if(is_server) { if (is_client) {
LOG_INFO("*** Client Request to send STATS\n"); LOG_DEBUG("*** StoreAndForward_RequestResponse_ROUTER_PING\n");
if (this->busy) { // respond with a CLIENT PONG
storeForwardModule->sendMessage(getFrom(&mp), StoreAndForward_RequestResponse_ROUTER_BUSY); storeForwardModule->sendMessage(getFrom(&mp), StoreAndForward_RequestResponse_CLIENT_PONG);
LOG_INFO("*** S&F - Busy. Try again shortly.\n"); }
} else { break;
storeForwardModule->statsSend(getFrom(&mp));
} case StoreAndForward_RequestResponse_ROUTER_STATS:
if (is_client) {
LOG_DEBUG("*** Router Response STATS\n");
// These fields only have informational purpose on a client. Fill them to consume later.
if (p->which_variant == StoreAndForward_stats_tag) {
this->packetHistoryMax = p->variant.stats.messages_total;
this->packetHistoryCurrent = p->variant.stats.messages_saved;
this->records = p->variant.stats.messages_max;
this->requests = p->variant.stats.requests;
this->requests_history = p->variant.stats.requests_history;
this->heartbeat = p->variant.stats.heartbeat;
this->historyReturnMax = p->variant.stats.return_max;
this->historyReturnWindow = p->variant.stats.return_window;
} }
break; }
break;
case StoreAndForward_RequestResponse_ROUTER_ERROR: case StoreAndForward_RequestResponse_ROUTER_HISTORY:
case StoreAndForward_RequestResponse_ROUTER_BUSY: if (is_client) {
if(is_client) { // These fields only have informational purpose on a client. Fill them to consume later.
LOG_DEBUG("*** StoreAndForward_RequestResponse_ROUTER_BUSY\n"); if (p->which_variant == StoreAndForward_history_tag) {
// retry in messages_saved * packetTimeMax ms this->historyReturnWindow = p->variant.history.window / 60000;
retry_delay = millis() + packetHistoryCurrent * packetTimeMax * (StoreAndForward_RequestResponse_ROUTER_ERROR ? 2 : 1); LOG_INFO("*** Router Response HISTORY - Sending %d messages from last %d minutes\n",
p->variant.history.history_messages, this->historyReturnWindow);
} }
break; }
break;
case StoreAndForward_RequestResponse_ROUTER_PONG: default:
// A router responded, this is equal to receiving a heartbeat assert(0); // unexpected state
case StoreAndForward_RequestResponse_ROUTER_HEARTBEAT:
if(is_client) {
// register heartbeat and interval
if (p->which_variant == StoreAndForward_heartbeat_tag) {
heartbeatInterval = p->variant.heartbeat.period;
}
lastHeartbeat = millis();
LOG_INFO("*** StoreAndForward Heartbeat received\n");
}
break;
case StoreAndForward_RequestResponse_ROUTER_PING:
if(is_client) {
LOG_DEBUG("*** StoreAndForward_RequestResponse_ROUTER_PING\n");
// respond with a CLIENT PONG
storeForwardModule->sendMessage(getFrom(&mp), StoreAndForward_RequestResponse_CLIENT_PONG);
}
break;
case StoreAndForward_RequestResponse_ROUTER_STATS:
if(is_client) {
LOG_DEBUG("*** Router Response STATS\n");
// These fields only have informational purpose on a client. Fill them to consume later.
if (p->which_variant == StoreAndForward_stats_tag) {
this->packetHistoryMax = p->variant.stats.messages_total;
this->packetHistoryCurrent = p->variant.stats.messages_saved;
this->records = p->variant.stats.messages_max;
this->requests = p->variant.stats.requests;
this->requests_history = p->variant.stats.requests_history;
this->heartbeat = p->variant.stats.heartbeat;
this->historyReturnMax = p->variant.stats.return_max;
this->historyReturnWindow = p->variant.stats.return_window;
}
}
break;
case StoreAndForward_RequestResponse_ROUTER_HISTORY:
if(is_client) {
// These fields only have informational purpose on a client. Fill them to consume later.
if (p->which_variant == StoreAndForward_history_tag) {
this->historyReturnWindow = p->variant.history.window / 60000;
LOG_INFO("*** Router Response HISTORY - Sending %d messages from last %d minutes\n", p->variant.history.history_messages, this->historyReturnWindow);
}
}
break;
default:
assert(0); // unexpected state
} }
return true; // There's no need for others to look at this message. return true; // There's no need for others to look at this message.
} }
@@ -437,7 +441,8 @@ StoreForwardModule::StoreForwardModule()
if (moduleConfig.store_forward.enabled) { if (moduleConfig.store_forward.enabled) {
// Router // Router
if ((config.device.role == Config_DeviceConfig_Role_ROUTER) || (config.device.role == Config_DeviceConfig_Role_ROUTER_CLIENT)) { if ((config.device.role == Config_DeviceConfig_Role_ROUTER) ||
(config.device.role == Config_DeviceConfig_Role_ROUTER_CLIENT)) {
LOG_INFO("*** Initializing Store & Forward Module in Router mode\n"); LOG_INFO("*** Initializing Store & Forward Module in Router mode\n");
if (ESP.getPsramSize() > 0) { if (ESP.getPsramSize() > 0) {
if (ESP.getFreePsram() >= 1024 * 1024) { if (ESP.getFreePsram() >= 1024 * 1024) {
@@ -474,7 +479,8 @@ StoreForwardModule::StoreForwardModule()
// Client // Client
} }
if ((config.device.role == Config_DeviceConfig_Role_CLIENT) || (config.device.role == Config_DeviceConfig_Role_ROUTER_CLIENT)) { if ((config.device.role == Config_DeviceConfig_Role_CLIENT) ||
(config.device.role == Config_DeviceConfig_Role_ROUTER_CLIENT)) {
is_client = true; is_client = true;
LOG_INFO("*** Initializing Store & Forward Module in Client mode\n"); LOG_INFO("*** Initializing Store & Forward Module in Client mode\n");
} }
+10 -11
View File
@@ -2,7 +2,7 @@
#include "ProtobufModule.h" #include "ProtobufModule.h"
#include "concurrency/OSThread.h" #include "concurrency/OSThread.h"
#include "mesh/generated/storeforward.pb.h" #include "mesh/generated/meshtastic/storeforward.pb.h"
#include "configuration.h" #include "configuration.h"
#include <Arduino.h> #include <Arduino.h>
@@ -66,12 +66,12 @@ class StoreForwardModule : private concurrency::OSThread, public ProtobufModule<
*/ */
virtual bool wantPacket(const MeshPacket *p) override virtual bool wantPacket(const MeshPacket *p) override
{ {
switch(p->decoded.portnum) { switch (p->decoded.portnum) {
case PortNum_TEXT_MESSAGE_APP: case PortNum_TEXT_MESSAGE_APP:
case PortNum_STORE_FORWARD_APP: case PortNum_STORE_FORWARD_APP:
return true; return true;
default: default:
return false; return false;
} }
} }
@@ -79,10 +79,10 @@ class StoreForwardModule : private concurrency::OSThread, public ProtobufModule<
void populatePSRAM(); void populatePSRAM();
// S&F Defaults // S&F Defaults
uint32_t historyReturnMax = 250; // 250 records uint32_t historyReturnMax = 250; // 250 records
uint32_t historyReturnWindow = 240; // 4 hours uint32_t historyReturnWindow = 240; // 4 hours
uint32_t records = 0; // Calculated uint32_t records = 0; // Calculated
bool heartbeat = false; // No heartbeat. bool heartbeat = false; // No heartbeat.
// stats // stats
uint32_t requests = 0; uint32_t requests = 0;
@@ -100,7 +100,6 @@ class StoreForwardModule : private concurrency::OSThread, public ProtobufModule<
*/ */
virtual ProcessMessage handleReceived(const MeshPacket &mp) override; virtual ProcessMessage handleReceived(const MeshPacket &mp) override;
virtual bool handleReceivedProtobuf(const MeshPacket &mp, StoreAndForward *p); virtual bool handleReceivedProtobuf(const MeshPacket &mp, StoreAndForward *p);
}; };
extern StoreForwardModule *storeForwardModule; extern StoreForwardModule *storeForwardModule;
+47 -27
View File
@@ -5,15 +5,15 @@
#include "main.h" #include "main.h"
#include "mesh/Channels.h" #include "mesh/Channels.h"
#include "mesh/Router.h" #include "mesh/Router.h"
#include "mesh/generated/mqtt.pb.h" #include "mesh/generated/meshtastic/mqtt.pb.h"
#include "mesh/generated/telemetry.pb.h" #include "mesh/generated/meshtastic/telemetry.pb.h"
#include "mesh/http/WiFiAPClient.h" #include "mesh/http/WiFiAPClient.h"
#include "sleep.h" #include "sleep.h"
#if HAS_WIFI #if HAS_WIFI
#include <WiFi.h> #include <WiFi.h>
#endif #endif
#include <assert.h>
#include "mqtt/JSON.h" #include "mqtt/JSON.h"
#include <assert.h>
MQTT *mqtt; MQTT *mqtt;
@@ -55,11 +55,15 @@ void MQTT::onPublish(char *topic, byte *payload, unsigned int length)
} }
LOG_DEBUG("Looking for Channel name: %s\n", ptr); LOG_DEBUG("Looking for Channel name: %s\n", ptr);
Channel sendChannel = channels.getByName(ptr); Channel sendChannel = channels.getByName(ptr);
LOG_DEBUG("Found Channel name: %s (Index %d)\n", channels.getGlobalId(sendChannel.settings.channel_num), sendChannel.settings.channel_num); LOG_DEBUG("Found Channel name: %s (Index %d)\n", channels.getGlobalId(sendChannel.settings.channel_num),
sendChannel.settings.channel_num);
if ((json.find("sender") != json.end()) && (json.find("payload") != json.end()) && (json.find("type") != json.end()) && json["type"]->IsString() && (json["type"]->AsString().compare("sendtext") == 0)) { if ((json.find("sender") != json.end()) && (json.find("payload") != json.end()) &&
(json.find("type") != json.end()) && json["type"]->IsString() &&
(json["type"]->AsString().compare("sendtext") == 0)) {
// this is a valid envelope // this is a valid envelope
if (json["payload"]->IsString() && json["type"]->IsString() && (json["sender"]->AsString().compare(owner.id) != 0)) { if (json["payload"]->IsString() && json["type"]->IsString() &&
(json["sender"]->AsString().compare(owner.id) != 0)) {
std::string jsonPayloadStr = json["payload"]->AsString(); std::string jsonPayloadStr = json["payload"]->AsString();
LOG_INFO("JSON payload %s, length %u\n", jsonPayloadStr.c_str(), jsonPayloadStr.length()); LOG_INFO("JSON payload %s, length %u\n", jsonPayloadStr.c_str(), jsonPayloadStr.length());
@@ -77,16 +81,20 @@ void MQTT::onPublish(char *topic, byte *payload, unsigned int length)
LOG_WARN("Received MQTT json payload too long, dropping\n"); LOG_WARN("Received MQTT json payload too long, dropping\n");
} }
} else { } else {
LOG_WARN("Received MQTT json payload on channel %s, but downlink is disabled, dropping\n", sendChannel.settings.name); LOG_WARN("Received MQTT json payload on channel %s, but downlink is disabled, dropping\n",
sendChannel.settings.name);
} }
} else { } else {
LOG_DEBUG("JSON Ignoring downlink message we originally sent.\n"); LOG_DEBUG("JSON Ignoring downlink message we originally sent.\n");
} }
} else if ((json.find("sender") != json.end()) && (json.find("payload") != json.end()) && (json.find("type") != json.end()) && json["type"]->IsString() && (json["type"]->AsString().compare("sendposition") == 0)) { } else if ((json.find("sender") != json.end()) && (json.find("payload") != json.end()) &&
//invent the "sendposition" type for a valid envelope (json.find("type") != json.end()) && json["type"]->IsString() &&
if (json["payload"]->IsObject() && json["type"]->IsString() && (json["sender"]->AsString().compare(owner.id) != 0)) { (json["type"]->AsString().compare("sendposition") == 0)) {
// invent the "sendposition" type for a valid envelope
if (json["payload"]->IsObject() && json["type"]->IsString() &&
(json["sender"]->AsString().compare(owner.id) != 0)) {
JSONObject posit; JSONObject posit;
posit = json["payload"]->AsObject(); //get nested JSON Position posit = json["payload"]->AsObject(); // get nested JSON Position
Position pos = Position_init_default; Position pos = Position_init_default;
pos.latitude_i = posit["latitude_i"]->AsNumber(); pos.latitude_i = posit["latitude_i"]->AsNumber();
pos.longitude_i = posit["longitude_i"]->AsNumber(); pos.longitude_i = posit["longitude_i"]->AsNumber();
@@ -98,15 +106,17 @@ void MQTT::onPublish(char *topic, byte *payload, unsigned int length)
p->decoded.portnum = PortNum_POSITION_APP; p->decoded.portnum = PortNum_POSITION_APP;
p->channel = sendChannel.settings.channel_num; p->channel = sendChannel.settings.channel_num;
if (sendChannel.settings.downlink_enabled) { if (sendChannel.settings.downlink_enabled) {
p->decoded.payload.size = pb_encode_to_bytes(p->decoded.payload.bytes, sizeof(p->decoded.payload.bytes), &Position_msg, &pos); //make the Data protobuf from position p->decoded.payload.size = pb_encode_to_bytes(p->decoded.payload.bytes, sizeof(p->decoded.payload.bytes),
&Position_msg, &pos); // make the Data protobuf from position
service.sendToMesh(p, RX_SRC_LOCAL); service.sendToMesh(p, RX_SRC_LOCAL);
} else { } else {
LOG_WARN("Received MQTT json payload on channel %s, but downlink is disabled, dropping\n", sendChannel.settings.name); LOG_WARN("Received MQTT json payload on channel %s, but downlink is disabled, dropping\n",
sendChannel.settings.name);
} }
} else { } else {
LOG_DEBUG("JSON Ignoring downlink message we originally sent.\n"); LOG_DEBUG("JSON Ignoring downlink message we originally sent.\n");
} }
} else{ } else {
LOG_ERROR("JSON Received payload on MQTT but not a valid envelope\n"); LOG_ERROR("JSON Received payload on MQTT but not a valid envelope\n");
} }
} else { } else {
@@ -118,7 +128,7 @@ void MQTT::onPublish(char *topic, byte *payload, unsigned int length)
if (!pb_decode_from_bytes(payload, length, &ServiceEnvelope_msg, &e)) { if (!pb_decode_from_bytes(payload, length, &ServiceEnvelope_msg, &e)) {
LOG_ERROR("Invalid MQTT service envelope, topic %s, len %u!\n", topic, length); LOG_ERROR("Invalid MQTT service envelope, topic %s, len %u!\n", topic, length);
return; return;
}else { } else {
if (strcmp(e.gateway_id, owner.id) == 0) if (strcmp(e.gateway_id, owner.id) == 0)
LOG_INFO("Ignoring downlink message we originally sent.\n"); LOG_INFO("Ignoring downlink message we originally sent.\n");
else { else {
@@ -148,7 +158,7 @@ void mqttInit()
MQTT::MQTT() : concurrency::OSThread("mqtt"), pubSub(mqttClient), mqttQueue(MAX_MQTT_QUEUE) MQTT::MQTT() : concurrency::OSThread("mqtt"), pubSub(mqttClient), mqttQueue(MAX_MQTT_QUEUE)
{ {
if(moduleConfig.mqtt.enabled) { if (moduleConfig.mqtt.enabled) {
assert(!mqtt); assert(!mqtt);
mqtt = this; mqtt = this;
@@ -170,7 +180,7 @@ void MQTT::reconnect()
{ {
if (wantsLink()) { if (wantsLink()) {
// Defaults // Defaults
int serverPort = 1883; int serverPort = 1883;
const char *serverAddr = default_mqtt_address; const char *serverAddr = default_mqtt_address;
const char *mqttUsername = default_mqtt_username; const char *mqttUsername = default_mqtt_username;
const char *mqttPassword = default_mqtt_password; const char *mqttPassword = default_mqtt_password;
@@ -192,7 +202,8 @@ void MQTT::reconnect()
pubSub.setServer(serverAddr, serverPort); pubSub.setServer(serverAddr, serverPort);
pubSub.setBufferSize(512); pubSub.setBufferSize(512);
LOG_INFO("Connecting to MQTT server %s, port: %d, username: %s, password: %s\n", serverAddr, serverPort, mqttUsername, mqttPassword); LOG_INFO("Connecting to MQTT server %s, port: %d, username: %s, password: %s\n", serverAddr, serverPort, mqttUsername,
mqttPassword);
auto myStatus = (statusTopic + owner.id); auto myStatus = (statusTopic + owner.id);
bool connected = pubSub.connect(owner.id, mqttUsername, mqttPassword, myStatus.c_str(), 1, true, "offline"); bool connected = pubSub.connect(owner.id, mqttUsername, mqttPassword, myStatus.c_str(), 1, true, "offline");
if (connected) { if (connected) {
@@ -208,7 +219,7 @@ void MQTT::reconnect()
sendSubscriptions(); sendSubscriptions();
} else { } else {
#if HAS_WIFI && !defined(ARCH_PORTDUINO) #if HAS_WIFI && !defined(ARCH_PORTDUINO)
LOG_ERROR("Failed to contact MQTT server (%d/5)...\n",reconnectCount + 1); LOG_ERROR("Failed to contact MQTT server (%d/5)...\n", reconnectCount + 1);
if (reconnectCount >= 4) { if (reconnectCount >= 4) {
needReconnect = true; needReconnect = true;
wifiReconnect->setIntervalFromNow(0); wifiReconnect->setIntervalFromNow(0);
@@ -216,7 +227,7 @@ void MQTT::reconnect()
} else { } else {
reconnectCount++; reconnectCount++;
} }
#endif #endif
} }
} }
@@ -267,7 +278,7 @@ bool MQTT::wantsLink() const
int32_t MQTT::runOnce() int32_t MQTT::runOnce()
{ {
if(!moduleConfig.mqtt.enabled) { if (!moduleConfig.mqtt.enabled) {
return disable(); return disable();
} }
bool wantConnection = wantsLink(); bool wantConnection = wantsLink();
@@ -277,7 +288,8 @@ int32_t MQTT::runOnce()
if (wantConnection) { if (wantConnection) {
reconnect(); reconnect();
// If we succeeded, empty the queue one by one and start reading rapidly, else try again in 30 seconds (TCP connections are EXPENSIVE so try rarely) // If we succeeded, empty the queue one by one and start reading rapidly, else try again in 30 seconds (TCP
// connections are EXPENSIVE so try rarely)
if (pubSub.connected()) { if (pubSub.connected()) {
if (!mqttQueue.isEmpty()) { if (!mqttQueue.isEmpty()) {
// FIXME - this size calculation is super sloppy, but it will go away once we dynamically alloc meshpackets // FIXME - this size calculation is super sloppy, but it will go away once we dynamically alloc meshpackets
@@ -295,7 +307,8 @@ int32_t MQTT::runOnce()
auto jsonString = this->downstreamPacketToJson(env->packet); auto jsonString = this->downstreamPacketToJson(env->packet);
if (jsonString.length() != 0) { if (jsonString.length() != 0) {
String topicJson = jsonTopic + env->channel_id + "/" + owner.id; String topicJson = jsonTopic + env->channel_id + "/" + owner.id;
LOG_INFO("JSON publish message to %s, %u bytes: %s\n", topicJson.c_str(), jsonString.length(), jsonString.c_str()); LOG_INFO("JSON publish message to %s, %u bytes: %s\n", topicJson.c_str(), jsonString.length(),
jsonString.c_str());
pubSub.publish(topicJson.c_str(), jsonString.c_str(), false); pubSub.publish(topicJson.c_str(), jsonString.c_str(), false);
} }
} }
@@ -348,7 +361,8 @@ void MQTT::onSend(const MeshPacket &mp, ChannelIndex chIndex)
auto jsonString = this->downstreamPacketToJson((MeshPacket *)&mp); auto jsonString = this->downstreamPacketToJson((MeshPacket *)&mp);
if (jsonString.length() != 0) { if (jsonString.length() != 0) {
String topicJson = jsonTopic + channelId + "/" + owner.id; String topicJson = jsonTopic + channelId + "/" + owner.id;
LOG_INFO("JSON publish message to %s, %u bytes: %s\n", topicJson.c_str(), jsonString.length(), jsonString.c_str()); LOG_INFO("JSON publish message to %s, %u bytes: %s\n", topicJson.c_str(), jsonString.length(),
jsonString.c_str());
pubSub.publish(topicJson.c_str(), jsonString.c_str(), false); pubSub.publish(topicJson.c_str(), jsonString.c_str(), false);
} }
} }
@@ -453,11 +467,17 @@ std::string MQTT::downstreamPacketToJson(MeshPacket *mp)
memset(&scratch, 0, sizeof(scratch)); memset(&scratch, 0, sizeof(scratch));
if (pb_decode_from_bytes(mp->decoded.payload.bytes, mp->decoded.payload.size, &Position_msg, &scratch)) { if (pb_decode_from_bytes(mp->decoded.payload.bytes, mp->decoded.payload.size, &Position_msg, &scratch)) {
decoded = &scratch; decoded = &scratch;
if((int)decoded->time){msgPayload["time"] = new JSONValue((int)decoded->time);} if ((int)decoded->time) {
if ((int)decoded->timestamp){msgPayload["timestamp"] = new JSONValue((int)decoded->timestamp);} msgPayload["time"] = new JSONValue((int)decoded->time);
}
if ((int)decoded->timestamp) {
msgPayload["timestamp"] = new JSONValue((int)decoded->timestamp);
}
msgPayload["latitude_i"] = new JSONValue((int)decoded->latitude_i); msgPayload["latitude_i"] = new JSONValue((int)decoded->latitude_i);
msgPayload["longitude_i"] = new JSONValue((int)decoded->longitude_i); msgPayload["longitude_i"] = new JSONValue((int)decoded->longitude_i);
if((int)decoded->altitude){msgPayload["altitude"] = new JSONValue((int)decoded->altitude);} if ((int)decoded->altitude) {
msgPayload["altitude"] = new JSONValue((int)decoded->altitude);
}
jsonObj["payload"] = new JSONValue(msgPayload); jsonObj["payload"] = new JSONValue(msgPayload);
} else { } else {
LOG_ERROR("Error decoding protobuf for position message!\n"); LOG_ERROR("Error decoding protobuf for position message!\n");
+3 -3
View File
@@ -4,7 +4,7 @@
#include "concurrency/OSThread.h" #include "concurrency/OSThread.h"
#include "mesh/Channels.h" #include "mesh/Channels.h"
#include "mesh/generated/mqtt.pb.h" #include "mesh/generated/meshtastic/mqtt.pb.h"
#include <PubSubClient.h> #include <PubSubClient.h>
#if HAS_WIFI #if HAS_WIFI
#include <WiFiClient.h> #include <WiFiClient.h>
@@ -53,7 +53,7 @@ class MQTT : private concurrency::OSThread
void reconnect(); void reconnect();
bool connected(); bool connected();
protected: protected:
PointerQueue<ServiceEnvelope> mqttQueue; PointerQueue<ServiceEnvelope> mqttQueue;
@@ -80,7 +80,7 @@ class MQTT : private concurrency::OSThread
std::string downstreamPacketToJson(MeshPacket *mp); std::string downstreamPacketToJson(MeshPacket *mp);
/// Return 0 if sleep is okay, veto sleep if we are connected to pubsub server /// Return 0 if sleep is okay, veto sleep if we are connected to pubsub server
// int preflightSleepCb(void *unused = NULL) { return pubSub.connected() ? 1 : 0; } // int preflightSleepCb(void *unused = NULL) { return pubSub.connected() ? 1 : 0; }
}; };
void mqttInit(); void mqttInit();
+221
View File
@@ -0,0 +1,221 @@
/***********************************************************************************************************************
* based on XMODEM implementation by Georges Menie (www.menie.org)
***********************************************************************************************************************
* Copyright 2001-2019 Georges Menie (www.menie.org)
* All rights reserved.
*
* Adapted for protobuf encapsulation. this is not really Xmodem any more.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are met:
*
* * Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
* * Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
* * Neither the name of the University of California, Berkeley nor the
* names of its contributors may be used to endorse or promote products
* derived from this software without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND ANY
* EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
* DISCLAIMED. IN NO EVENT SHALL THE REGENTS AND CONTRIBUTORS BE LIABLE FOR ANY
* DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
**********************************************************************************************************************/
#include "xmodem.h"
XModemAdapter xModem;
XModemAdapter::XModemAdapter()
{
xmodemStore = (XModem *)malloc(XModem_size);
}
unsigned short XModemAdapter::crc16_ccitt(const pb_byte_t *buffer, int length)
{
unsigned short crc16 = 0;
while (length != 0) {
crc16 = (unsigned char)(crc16 >> 8) | (crc16 << 8);
crc16 ^= *buffer;
crc16 ^= (unsigned char)(crc16 & 0xff) >> 4;
crc16 ^= (crc16 << 8) << 4;
crc16 ^= ((crc16 & 0xff) << 4) << 1;
buffer++;
length--;
}
return crc16;
}
int XModemAdapter::check(const pb_byte_t *buf, int sz, unsigned short tcrc)
{
unsigned short crc = crc16_ccitt(buf, sz);
if (crc == tcrc)
return 1;
else
return 0;
}
void XModemAdapter::sendControl(XModem_Control c)
{
memset(xmodemStore, 0, XModem_size);
xmodemStore->control = c;
LOG_DEBUG("XModem: Notify Sending control %d.\n", c);
packetReady.notifyObservers(packetno);
}
XModem *XModemAdapter::getForPhone()
{
if (xmodemStore) {
return xmodemStore;
} else {
return NULL;
}
}
void XModemAdapter::handlePacket(XModem xmodemPacket)
{
switch (xmodemPacket.control) {
case XModem_Control_SOH:
case XModem_Control_STX:
if ((xmodemPacket.seq == 0) && !isReceiving && !isTransmitting) {
// NULL packet has the destination filename
memcpy(filename, &xmodemPacket.buffer.bytes, xmodemPacket.buffer.size);
if (xmodemPacket.control == XModem_Control_SOH) { // Receive this file and put to Flash
file = FSCom.open(filename, FILE_O_WRITE);
if (file) {
sendControl(XModem_Control_ACK);
isReceiving = true;
packetno = 1;
break;
}
sendControl(XModem_Control_NAK);
isReceiving = false;
break;
} else { // Transmit this file from Flash
LOG_INFO("XModem: Transmitting file %s\n", filename);
file = FSCom.open(filename, FILE_O_READ);
if (file) {
packetno = 1;
isTransmitting = true;
memset(xmodemStore, 0, XModem_size);
xmodemStore->control = XModem_Control_SOH;
xmodemStore->seq = packetno;
xmodemStore->buffer.size = file.read(xmodemStore->buffer.bytes, sizeof(XModem_buffer_t::bytes));
xmodemStore->crc16 = crc16_ccitt(xmodemStore->buffer.bytes, xmodemStore->buffer.size);
LOG_DEBUG("XModem: STX Notify Sending packet %d, %d Bytes.\n", packetno, xmodemStore->buffer.size);
if (xmodemStore->buffer.size < sizeof(XModem_buffer_t::bytes)) {
isEOT = true;
// send EOT on next Ack
}
packetReady.notifyObservers(packetno);
break;
}
sendControl(XModem_Control_NAK);
isTransmitting = false;
break;
}
} else {
if (isReceiving) {
// normal file data packet
if ((xmodemPacket.seq == packetno) &&
check(xmodemPacket.buffer.bytes, xmodemPacket.buffer.size, xmodemPacket.crc16)) {
// valid packet
file.write(xmodemPacket.buffer.bytes, xmodemPacket.buffer.size);
sendControl(XModem_Control_ACK);
packetno++;
break;
}
// invalid packet
sendControl(XModem_Control_NAK);
break;
} else if (isTransmitting) {
// just received something weird.
sendControl(XModem_Control_CAN);
isTransmitting = false;
break;
}
}
break;
case XModem_Control_EOT:
// End of transmission
sendControl(XModem_Control_ACK);
file.close();
isReceiving = false;
break;
case XModem_Control_CAN:
// Cancel transmission and remove file
sendControl(XModem_Control_ACK);
file.close();
FSCom.remove(filename);
isReceiving = false;
break;
case XModem_Control_ACK:
// Acknowledge Send the next packet
if (isTransmitting) {
if (isEOT) {
sendControl(XModem_Control_EOT);
file.close();
LOG_INFO("XModem: Finished sending file %s\n", filename);
isTransmitting = false;
isEOT = false;
break;
}
retrans = MAXRETRANS; // reset retransmit counter
packetno++;
memset(xmodemStore, 0, XModem_size);
xmodemStore->control = XModem_Control_SOH;
xmodemStore->seq = packetno;
xmodemStore->buffer.size = file.read(xmodemStore->buffer.bytes, sizeof(XModem_buffer_t::bytes));
xmodemStore->crc16 = crc16_ccitt(xmodemStore->buffer.bytes, xmodemStore->buffer.size);
LOG_DEBUG("XModem: ACK Notify Sending packet %d, %d Bytes.\n", packetno, xmodemStore->buffer.size);
if (xmodemStore->buffer.size < sizeof(XModem_buffer_t::bytes)) {
isEOT = true;
// send EOT on next Ack
}
packetReady.notifyObservers(packetno);
} else {
// just received something weird.
sendControl(XModem_Control_CAN);
}
break;
case XModem_Control_NAK:
// Negative acknowledge. Send the same buffer again
if (isTransmitting) {
if (--retrans <= 0) {
sendControl(XModem_Control_CAN);
file.close();
LOG_INFO("XModem: Retransmit timeout, cancelling file %s\n", filename);
isTransmitting = false;
break;
}
memset(xmodemStore, 0, XModem_size);
xmodemStore->control = XModem_Control_SOH;
xmodemStore->seq = packetno;
file.seek((packetno - 1) * sizeof(XModem_buffer_t::bytes));
xmodemStore->buffer.size = file.read(xmodemStore->buffer.bytes, sizeof(XModem_buffer_t::bytes));
xmodemStore->crc16 = crc16_ccitt(xmodemStore->buffer.bytes, xmodemStore->buffer.size);
LOG_DEBUG("XModem: NAK Notify Sending packet %d, %d Bytes.\n", packetno, xmodemStore->buffer.size);
if (xmodemStore->buffer.size < sizeof(XModem_buffer_t::bytes)) {
isEOT = true;
// send EOT on next Ack
}
packetReady.notifyObservers(packetno);
} else {
// just received something weird.
sendControl(XModem_Control_CAN);
}
break;
default:
// Unknown control character
break;
}
}
+76
View File
@@ -0,0 +1,76 @@
/***********************************************************************************************************************
* based on XMODEM implementation by Georges Menie (www.menie.org)
***********************************************************************************************************************
* Copyright 2001-2019 Georges Menie (www.menie.org)
* All rights reserved.
*
* Adapted for protobuf encapsulation. this is not really Xmodem any more.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are met:
*
* * Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
* * Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
* * Neither the name of the University of California, Berkeley nor the
* names of its contributors may be used to endorse or promote products
* derived from this software without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND ANY
* EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
* DISCLAIMED. IN NO EVENT SHALL THE REGENTS AND CONTRIBUTORS BE LIABLE FOR ANY
* DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
**********************************************************************************************************************/
#pragma once
#include "FSCommon.h"
#include "configuration.h"
#include "mesh/generated/meshtastic/xmodem.pb.h"
#define MAXRETRANS 25
class XModemAdapter
{
public:
// Called when we put a fragment in the outgoing memory
Observable<uint32_t> packetReady;
XModemAdapter();
void handlePacket(XModem xmodemPacket);
XModem *getForPhone();
private:
bool isReceiving = false;
bool isTransmitting = false;
bool isEOT = false;
int retrans = MAXRETRANS;
uint16_t packetno = 0;
#ifdef ARCH_NRF52
File file = File(FSCom);
#else
File file;
#endif
char filename[sizeof(XModem_buffer_t::bytes)] = {0};
protected:
XModem *xmodemStore = NULL;
unsigned short crc16_ccitt(const pb_byte_t *buffer, int length);
int check(const pb_byte_t *buf, int sz, unsigned short tcrc);
void sendControl(XModem_Control c);
};
extern XModemAdapter xModem;