Merge branch 'meshtastic:master' into master

This commit is contained in:
Mictronics 2024-12-27 10:59:03 +01:00 committed by GitHub
commit da12dffca1
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
34 changed files with 2246 additions and 111 deletions

4
.env.example Normal file
View File

@ -0,0 +1,4 @@
# Absolute path to the local meshtastic config.yaml file
CONFIG_PATH=/path/to/meshtastic/config.yaml
# USB device to passthrough (`lsusb -t`: look for `ch341`)
USB_DEVICE=/dev/bus/usb/001/037

View File

@ -10,12 +10,6 @@ jobs:
build-native: build-native:
runs-on: ubuntu-latest runs-on: ubuntu-latest
steps: steps:
- name: Install libs needed for native build
shell: bash
run: |
sudo apt-get update --fix-missing
sudo apt-get install -y libbluetooth-dev libgpiod-dev libyaml-cpp-dev openssl libssl-dev libulfius-dev liborcania-dev libusb-1.0-0-dev
- name: Checkout code - name: Checkout code
uses: actions/checkout@v4 uses: actions/checkout@v4
with: with:
@ -23,21 +17,6 @@ jobs:
ref: ${{github.event.pull_request.head.ref}} ref: ${{github.event.pull_request.head.ref}}
repository: ${{github.event.pull_request.head.repo.full_name}} repository: ${{github.event.pull_request.head.repo.full_name}}
- name: Upgrade python tools
shell: bash
run: |
python -m pip install --upgrade pip
pip install -U platformio adafruit-nrfutil
pip install -U meshtastic --pre
- name: Upgrade platformio
shell: bash
run: |
pio upgrade
- name: Build Native
run: bin/build-native.sh
- name: Get release version string - name: Get release version string
run: echo "version=$(./bin/buildinfo.py long)" >> $GITHUB_OUTPUT run: echo "version=$(./bin/buildinfo.py long)" >> $GITHUB_OUTPUT
id: version id: version

View File

@ -8,12 +8,15 @@ on:
jobs: jobs:
test-simulator: test-simulator:
runs-on: ubuntu-latest runs-on: ubuntu-latest
env:
LCOV_CAPTURE_FLAGS: --quiet --capture --include "${PWD}/src/*" --exclude '*/src/mesh/generated/*' --directory .pio/build/coverage/src --base-directory "${PWD}"
steps: steps:
- name: Install libs needed for native build - name: Install libs needed for native build
shell: bash shell: bash
run: | run: |
sudo apt-get update --fix-missing sudo apt-get update --fix-missing
sudo apt-get install -y libbluetooth-dev libgpiod-dev libyaml-cpp-dev openssl libssl-dev libulfius-dev liborcania-dev libusb-1.0-0-dev libi2c-dev sudo apt-get install -y libbluetooth-dev libgpiod-dev libyaml-cpp-dev openssl libssl-dev libulfius-dev liborcania-dev libusb-1.0-0-dev libi2c-dev
sudo apt-get install -y lcov
- name: Checkout code - name: Checkout code
uses: actions/checkout@v4 uses: actions/checkout@v4
@ -24,7 +27,7 @@ jobs:
shell: bash shell: bash
run: | run: |
python -m pip install --upgrade pip python -m pip install --upgrade pip
pip install -U platformio adafruit-nrfutil pip install -U platformio adafruit-nrfutil dotmap
pip install -U meshtastic --pre pip install -U meshtastic --pre
- name: Upgrade platformio - name: Upgrade platformio
@ -36,17 +39,25 @@ jobs:
run: bin/build-native.sh run: bin/build-native.sh
# 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/coverage
run: platformio run -e native run: |
platformio run -e coverage
lcov ${{ env.LCOV_CAPTURE_FLAGS }} --initial --output-file coverage_base.info
- name: Integration test - name: Integration test
run: | run: |
.pio/build/native/program & sleep 10 # 5 seconds was not enough .pio/build/coverage/program &
PID=$!
timeout 20 bash -c "until ls -al /proc/$PID/fd | grep socket; do sleep 1; done"
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()'
wait
lcov ${{ env.LCOV_CAPTURE_FLAGS }} --test-name integration --output-file coverage_integration.info
- name: PlatformIO Tests - name: PlatformIO Tests
run: platformio test -e native --junit-output-path testreport.xml run: |
platformio test -e coverage --junit-output-path testreport.xml
lcov ${{ env.LCOV_CAPTURE_FLAGS }} --test-name tests --output-file coverage_tests.info
- name: Test Report - name: Test Report
uses: dorny/test-reporter@v1.9.1 uses: dorny/test-reporter@v1.9.1
@ -56,6 +67,19 @@ jobs:
path: testreport.xml path: testreport.xml
reporter: java-junit reporter: java-junit
- name: Generate Code Coverage Report
run: |
lcov --quiet --add-tracefile coverage_base.info --add-tracefile coverage_integration.info --add-tracefile coverage_tests.info --output-file coverage_src.info
mkdir code-coverage-report
genhtml --quiet --legend --prefix "${PWD}" coverage_src.info --output-directory code-coverage-report
mv coverage_*.info code-coverage-report
- name: Save Code Coverage Report
uses: actions/upload-artifact@v4
with:
name: code-coverage-report
path: code-coverage-report
hardware-tests: hardware-tests:
runs-on: test-runner runs-on: test-runner
steps: steps:

View File

@ -1,32 +1,29 @@
FROM debian:bookworm-slim AS builder # trunk-ignore-all(terrascan/AC_DOCKER_0002): Known terrascan issue
# trunk-ignore-all(hadolint/DL3008): Use latest version of apt packages for buildchain
# trunk-ignore-all(trivy/DS002): We must run as root for this container
# trunk-ignore-all(checkov/CKV_DOCKER_8): We must run as root for this container
# trunk-ignore-all(hadolint/DL3002): We must run as root for this container
FROM python:3.12-bookworm AS builder
ENV DEBIAN_FRONTEND=noninteractive ENV DEBIAN_FRONTEND=noninteractive
ENV TZ=Etc/UTC ENV TZ=Etc/UTC
# http://bugs.python.org/issue19846 # Install Dependencies
# > At the moment, setting "LANG=C" on a Linux system *fundamentally breaks Python 3*, and that's not OK. ENV PIP_ROOT_USER_ACTION=ignore
ENV LANG C.UTF-8 RUN apt-get update && apt-get install --no-install-recommends -y wget g++ zip git ca-certificates \
libgpiod-dev libyaml-cpp-dev libbluetooth-dev libi2c-dev \
# Install build deps libusb-1.0-0-dev libulfius-dev liborcania-dev libssl-dev pkg-config && \
USER root apt-get clean && rm -rf /var/lib/apt/lists/* && \
pip install --no-cache-dir -U platformio==6.1.16 && \
# trunk-ignore(terrascan/AC_DOCKER_0002): Known terrascan issue mkdir /tmp/firmware
# trunk-ignore(hadolint/DL3008): Use latest version of packages for buildchain
RUN apt-get update && apt-get install --no-install-recommends -y wget python3 python3-pip python3-wheel python3-venv g++ zip git \
ca-certificates libgpiod-dev libyaml-cpp-dev libbluetooth-dev \
libusb-1.0-0-dev libulfius-dev liborcania-dev libssl-dev pkg-config && \
apt-get clean && rm -rf /var/lib/apt/lists/* && mkdir /tmp/firmware
RUN groupadd -g 1000 mesh && useradd -ml -u 1000 -g 1000 mesh && chown mesh:mesh /tmp/firmware
USER mesh
# Copy source code
WORKDIR /tmp/firmware WORKDIR /tmp/firmware
RUN python3 -m venv /tmp/firmware COPY . /tmp/firmware
RUN bash -o pipefail -c "source bin/activate; pip3 install --no-cache-dir -U platformio==6.1.15"
# trunk-ignore(terrascan/AC_DOCKER_00024): We would actually like these files to be owned by mesh tyvm # Build
COPY --chown=mesh:mesh . /tmp/firmware RUN bash ./bin/build-native.sh && \
RUN bash -o pipefail -c "source ./bin/activate && bash ./bin/build-native.sh" cp "/tmp/firmware/release/meshtasticd_linux_$(uname -m)" "/tmp/firmware/release/meshtasticd"
RUN cp "/tmp/firmware/release/meshtasticd_linux_$(uname -m)" "/tmp/firmware/release/meshtasticd"
##### PRODUCTION BUILD ############# ##### PRODUCTION BUILD #############
@ -35,20 +32,25 @@ FROM debian:bookworm-slim
ENV DEBIAN_FRONTEND=noninteractive ENV DEBIAN_FRONTEND=noninteractive
ENV TZ=Etc/UTC ENV TZ=Etc/UTC
# trunk-ignore(terrascan/AC_DOCKER_0002): Known terrascan issue # nosemgrep: dockerfile.security.last-user-is-root.last-user-is-root
# trunk-ignore(hadolint/DL3008): Use latest version of packages for buildchain USER root
RUN apt-get update && apt-get --no-install-recommends -y install libc-bin libc6 libgpiod2 libyaml-cpp0.7 libulfius2.7 libusb-1.0-0-dev liborcania2.3 libssl3 && \
apt-get clean && rm -rf /var/lib/apt/lists/*
RUN groupadd -g 1000 mesh && useradd -ml -u 1000 -g 1000 mesh RUN apt-get update && apt-get --no-install-recommends -y install libc-bin libc6 libgpiod2 libyaml-cpp0.7 libi2c0 libulfius2.7 libusb-1.0-0-dev liborcania2.3 libssl3 && \
USER mesh apt-get clean && rm -rf /var/lib/apt/lists/* \
&& mkdir -p /var/lib/meshtasticd \
&& mkdir -p /etc/meshtasticd/config.d
WORKDIR /home/mesh # Fetch compiled binary from the builder
COPY --from=builder /tmp/firmware/release/meshtasticd /home/mesh/ COPY --from=builder /tmp/firmware/release/meshtasticd /usr/sbin/
# Copy config templates
COPY ./bin/config.d /etc/meshtasticd/available.d
RUN mkdir data WORKDIR /var/lib/meshtasticd
VOLUME /home/mesh/data VOLUME /var/lib/meshtasticd
CMD [ "sh", "-cx", "./meshtasticd -d /home/mesh/data --hwid=${HWID:-$RANDOM}" ] # Expose Meshtastic TCP API port from the host
EXPOSE 4403
CMD [ "sh", "-cx", "meshtasticd -d /var/lib/meshtasticd" ]
HEALTHCHECK NONE HEALTHCHECK NONE

42
alpine.Dockerfile Normal file
View File

@ -0,0 +1,42 @@
# trunk-ignore-all(trivy/DS002): We must run as root for this container
# trunk-ignore-all(checkov/CKV_DOCKER_8): We must run as root for this container
# trunk-ignore-all(hadolint/DL3002): We must run as root for this container
FROM python:3.12-alpine3.21 AS builder
ENV PIP_ROOT_USER_ACTION=ignore
RUN apk add bash g++ libstdc++-dev linux-headers zip git ca-certificates libgpiod-dev yaml-cpp-dev bluez-dev \
libusb-dev i2c-tools-dev openssl-dev pkgconf argp-standalone && \
pip install --no-cache-dir -U platformio==6.1.16 && \
mkdir /tmp/firmware
WORKDIR /tmp/firmware
COPY . /tmp/firmware
# Create small package (no debugging symbols)
# Add `argp` for musl
ENV PLATFORMIO_BUILD_FLAGS="-Os -ffunction-sections -fdata-sections -Wl,--gc-sections -largp"
RUN bash ./bin/build-native.sh && \
cp "/tmp/firmware/release/meshtasticd_linux_$(uname -m)" "/tmp/firmware/release/meshtasticd"
# ##### PRODUCTION BUILD #############
FROM alpine:3.21
# nosemgrep: dockerfile.security.last-user-is-root.last-user-is-root
USER root
RUN apk add libstdc++ libgpiod yaml-cpp libusb i2c-tools \
&& mkdir -p /var/lib/meshtasticd \
&& mkdir -p /etc/meshtasticd/config.d
COPY --from=builder /tmp/firmware/release/meshtasticd /usr/sbin/
WORKDIR /var/lib/meshtasticd
VOLUME /var/lib/meshtasticd
EXPOSE 4403
CMD [ "sh", "-cx", "meshtasticd --fsdir=/var/lib/meshtasticd" ]
HEALTHCHECK NONE

View File

@ -26,7 +26,7 @@ lib_deps =
${radiolib_base.lib_deps} ${radiolib_base.lib_deps}
rweather/Crypto@^0.4.0 rweather/Crypto@^0.4.0
https://github.com/lovyan03/LovyanGFX.git#1401c28a47646fe00538d487adcb2eb3c72de805 https://github.com/lovyan03/LovyanGFX.git#1401c28a47646fe00538d487adcb2eb3c72de805
https://github.com/pine64/libch341-spi-userspace#8695637adeabf5abf5601d8e82cb0ba19ce9ec46 https://github.com/pine64/libch341-spi-userspace#a9b17e3452f7fb747000d9b4ad4409155b39f6ef
build_flags = build_flags =
${arduino_base.build_flags} ${arduino_base.build_flags}

View File

@ -1,13 +1,26 @@
version: "3.7" # USB-Based Meshtastic container-node!
# Copy .env.example to .env and set the USB_DEVICE and CONFIG_PATH variables
services: services:
meshtastic-node: meshtastic-node:
build: . build: .
deploy: container_name: meshtasticd
mode: replicated
replicas: 4
networks:
- mesh
networks: # Pass USB device through to the container
mesh: devices:
- "${USB_DEVICE}"
# Mount local config file and named volume for data persistence
volumes:
- "${CONFIG_PATH}:/etc/meshtasticd/config.yaml:ro"
- meshtastic_data:/var/lib/meshtasticd
# Forward the containers port 4403 to the host
ports:
- 4403:4403
restart: unless-stopped
volumes:
meshtastic_data:

@ -1 +1 @@
Subproject commit 2cffaf53e3faf1b6e41a8b8f05312f2f893be413 Subproject commit c55f120a9c1ce90c85e4826907a0b9bcb2d5f5a2

View File

@ -45,7 +45,7 @@
#define LOG_CRIT(...) SEGGER_RTT_printf(0, __VA_ARGS__) #define LOG_CRIT(...) SEGGER_RTT_printf(0, __VA_ARGS__)
#define LOG_TRACE(...) SEGGER_RTT_printf(0, __VA_ARGS__) #define LOG_TRACE(...) SEGGER_RTT_printf(0, __VA_ARGS__)
#else #else
#if defined(DEBUG_PORT) && !defined(DEBUG_MUTE) && !defined(PIO_UNIT_TESTING) #if defined(DEBUG_PORT) && !defined(DEBUG_MUTE)
#define LOG_DEBUG(...) DEBUG_PORT.log(MESHTASTIC_LOG_LEVEL_DEBUG, __VA_ARGS__) #define LOG_DEBUG(...) DEBUG_PORT.log(MESHTASTIC_LOG_LEVEL_DEBUG, __VA_ARGS__)
#define LOG_INFO(...) DEBUG_PORT.log(MESHTASTIC_LOG_LEVEL_INFO, __VA_ARGS__) #define LOG_INFO(...) DEBUG_PORT.log(MESHTASTIC_LOG_LEVEL_INFO, __VA_ARGS__)
#define LOG_WARN(...) DEBUG_PORT.log(MESHTASTIC_LOG_LEVEL_WARN, __VA_ARGS__) #define LOG_WARN(...) DEBUG_PORT.log(MESHTASTIC_LOG_LEVEL_WARN, __VA_ARGS__)

View File

@ -55,6 +55,15 @@ extern "C" void lfs_assert(const char *reason)
{ {
LOG_ERROR("LFS assert: %s", reason); LOG_ERROR("LFS assert: %s", reason);
lfs_assert_failed = true; lfs_assert_failed = true;
#ifndef ARCH_PORTDUINO
#ifdef FSCom
// CORRUPTED FILESYSTEM. This causes bootloop so
// might as well try formatting now.
LOG_ERROR("Trying FSCom.format()");
FSCom.format();
#endif
#endif
} }
/** /**

View File

@ -458,11 +458,11 @@ void ScanI2CTwoWire::scanPort(I2CPort port, uint8_t *address, uint8_t asize)
i2cBus->endTransmission(); i2cBus->endTransmission();
len = i2cBus->readBytes(info, 5); len = i2cBus->readBytes(info, 5);
if (len == 5 && memcmp(expectedInfo, info, len) == 0) { if (len == 5 && memcmp(expectedInfo, info, len) == 0) {
LOG_INFO("NXP SE050 crypto chip found\n"); LOG_INFO("NXP SE050 crypto chip found");
type = NXP_SE050; type = NXP_SE050;
} else { } else {
LOG_INFO("FT6336U touchscreen found\n"); LOG_INFO("FT6336U touchscreen found");
type = FT6336U; type = FT6336U;
} }
break; break;

View File

@ -126,7 +126,7 @@ static bool heartbeat = false;
/// Check if the display can render a string (detect special chars; emoji) /// Check if the display can render a string (detect special chars; emoji)
static bool haveGlyphs(const char *str) static bool haveGlyphs(const char *str)
{ {
#if defined(OLED_PL) || defined(OLED_UA) || defined(OLED_RU) #if defined(OLED_PL) || defined(OLED_UA) || defined(OLED_RU) || defined(OLED_CS)
// Don't want to make any assumptions about custom language support // Don't want to make any assumptions about custom language support
return true; return true;
#endif #endif

View File

@ -427,6 +427,86 @@ class Screen : public concurrency::OSThread
if (ch == 0xC2 || ch == 0xC3 || ch == 0x82 || ch == 0xD0 || ch == 0xD1) if (ch == 0xC2 || ch == 0xC3 || ch == 0x82 || ch == 0xD0 || ch == 0xD1)
return (uint8_t)0; return (uint8_t)0;
#endif
#if defined(OLED_CS)
switch (last) {
case 0xC2: {
SKIPREST = false;
return (uint8_t)ch;
}
case 0xC3: {
SKIPREST = false;
return (uint8_t)(ch | 0xC0);
}
case 0xC4: {
SKIPREST = false;
if (ch == 140)
return (uint8_t)(129); // Č
if (ch == 141)
return (uint8_t)(138); // č
if (ch == 142)
return (uint8_t)(130); // Ď
if (ch == 143)
return (uint8_t)(139); // ď
if (ch == 154)
return (uint8_t)(131); // Ě
if (ch == 155)
return (uint8_t)(140); // ě
// Slovak specific glyphs
if (ch == 185)
return (uint8_t)(147); // Ĺ
if (ch == 186)
return (uint8_t)(148); // ĺ
if (ch == 189)
return (uint8_t)(149); // Ľ
if (ch == 190)
return (uint8_t)(150); // ľ
break;
}
case 0xC5: {
SKIPREST = false;
if (ch == 135)
return (uint8_t)(132); // Ň
if (ch == 136)
return (uint8_t)(141); // ň
if (ch == 152)
return (uint8_t)(133); // Ř
if (ch == 153)
return (uint8_t)(142); // ř
if (ch == 160)
return (uint8_t)(134); // Š
if (ch == 161)
return (uint8_t)(143); // š
if (ch == 164)
return (uint8_t)(135); // Ť
if (ch == 165)
return (uint8_t)(144); // ť
if (ch == 174)
return (uint8_t)(136); // Ů
if (ch == 175)
return (uint8_t)(145); // ů
if (ch == 189)
return (uint8_t)(137); // Ž
if (ch == 190)
return (uint8_t)(146); // ž
// Slovak specific glyphs
if (ch == 148)
return (uint8_t)(151); // Ŕ
if (ch == 149)
return (uint8_t)(152); // ŕ
break;
}
}
// We want to strip out prefix chars for two-byte char formats
if (ch == 0xC2 || ch == 0xC3 || ch == 0xC4 || ch == 0xC5)
return (uint8_t)0;
#endif #endif
// If we already returned an unconvertable-character symbol for this unconvertable-character sequence, return NULs for the // If we already returned an unconvertable-character symbol for this unconvertable-character sequence, return NULs for the

View File

@ -12,6 +12,10 @@
#include "graphics/fonts/OLEDDisplayFontsUA.h" #include "graphics/fonts/OLEDDisplayFontsUA.h"
#endif #endif
#ifdef OLED_CS
#include "graphics/fonts/OLEDDisplayFontsCS.h"
#endif
#if (defined(USE_EINK) || defined(ILI9341_DRIVER) || defined(ILI9342_DRIVER) || defined(ST7701_CS) || defined(ST7735_CS) || \ #if (defined(USE_EINK) || defined(ILI9341_DRIVER) || defined(ILI9342_DRIVER) || defined(ST7701_CS) || defined(ST7735_CS) || \
defined(ST7789_CS) || defined(USE_ST7789) || defined(HX8357_CS)) && \ defined(ST7789_CS) || defined(USE_ST7789) || defined(HX8357_CS)) && \
!defined(DISPLAY_FORCE_SMALL_FONTS) !defined(DISPLAY_FORCE_SMALL_FONTS)
@ -29,21 +33,33 @@
#ifdef OLED_UA #ifdef OLED_UA
#define FONT_SMALL ArialMT_Plain_10_UA // Height: 13 #define FONT_SMALL ArialMT_Plain_10_UA // Height: 13
#else #else
#ifdef OLED_CS
#define FONT_SMALL ArialMT_Plain_10_CS
#else
#define FONT_SMALL ArialMT_Plain_10 // Height: 13 #define FONT_SMALL ArialMT_Plain_10 // Height: 13
#endif #endif
#endif #endif
#endif #endif
#endif
#ifdef OLED_UA #ifdef OLED_UA
#define FONT_MEDIUM ArialMT_Plain_16_UA // Height: 19 #define FONT_MEDIUM ArialMT_Plain_16_UA // Height: 19
#else #else
#ifdef OLED_CS
#define FONT_MEDIUM ArialMT_Plain_16_CS
#else
#define FONT_MEDIUM ArialMT_Plain_16 // Height: 19 #define FONT_MEDIUM ArialMT_Plain_16 // Height: 19
#endif #endif
#endif
#ifdef OLED_UA #ifdef OLED_UA
#define FONT_LARGE ArialMT_Plain_24_UA // Height: 28 #define FONT_LARGE ArialMT_Plain_24_UA // Height: 28
#else #else
#ifdef OLED_CS
#define FONT_LARGE ArialMT_Plain_24_CS // Height: 28
#else
#define FONT_LARGE ArialMT_Plain_24 // Height: 28 #define FONT_LARGE ArialMT_Plain_24 // Height: 28
#endif #endif
#endif #endif
#endif
#define _fontHeight(font) ((font)[1] + 1) // height is position 1 #define _fontHeight(font) ((font)[1] + 1) // height is position 1

File diff suppressed because it is too large Load Diff

View File

@ -0,0 +1,16 @@
#ifndef OLEDDISPLAYFONTSCS_h
#define OLEDDISPLAYFONTSCS_h
#ifdef ARDUINO
#include <Arduino.h>
#elif __MBED__
#define PROGMEM
#endif
/**
* Localization for Czech and Slovak language containing glyphs with diacritic.
*/
extern const uint8_t ArialMT_Plain_10_CS[] PROGMEM;
extern const uint8_t ArialMT_Plain_16_CS[] PROGMEM;
extern const uint8_t ArialMT_Plain_24_CS[] PROGMEM;
#endif

View File

@ -87,7 +87,7 @@ uint8_t MPR121_KeyMap[12] = {2, 5, 8, 11, 1, 4, 7, 10, 0, 3, 6, 9};
MPR121Keyboard::MPR121Keyboard() : m_wire(nullptr), m_addr(0), readCallback(nullptr), writeCallback(nullptr) MPR121Keyboard::MPR121Keyboard() : m_wire(nullptr), m_addr(0), readCallback(nullptr), writeCallback(nullptr)
{ {
// LOG_DEBUG("MPR121 @ %02x\n", m_addr); // LOG_DEBUG("MPR121 @ %02x", m_addr);
state = Init; state = Init;
last_key = -1; last_key = -1;
last_tap = 0L; last_tap = 0L;

View File

@ -113,13 +113,13 @@ int32_t TouchScreenBase::runOnce()
if (_tapped) { if (_tapped) {
_tapped = false; _tapped = false;
e.touchEvent = static_cast<char>(TOUCH_ACTION_TAP); e.touchEvent = static_cast<char>(TOUCH_ACTION_TAP);
LOG_DEBUG("action TAP(%d/%d)\n", _last_x, _last_y); LOG_DEBUG("action TAP(%d/%d)", _last_x, _last_y);
} }
} else { } else {
if (_tapped && (time_t(millis()) - _start) > TIME_LONG_PRESS - 50) { if (_tapped && (time_t(millis()) - _start) > TIME_LONG_PRESS - 50) {
_tapped = false; _tapped = false;
e.touchEvent = static_cast<char>(TOUCH_ACTION_TAP); e.touchEvent = static_cast<char>(TOUCH_ACTION_TAP);
LOG_DEBUG("action TAP(%d/%d)\n", _last_x, _last_y); LOG_DEBUG("action TAP(%d/%d)", _last_x, _last_y);
} }
} }
#else #else

View File

@ -57,6 +57,7 @@ NodeDB *nodeDB = nullptr;
EXT_RAM_BSS_ATTR meshtastic_DeviceState devicestate; EXT_RAM_BSS_ATTR meshtastic_DeviceState devicestate;
meshtastic_MyNodeInfo &myNodeInfo = devicestate.my_node; meshtastic_MyNodeInfo &myNodeInfo = devicestate.my_node;
meshtastic_LocalConfig config; meshtastic_LocalConfig config;
meshtastic_DeviceUIConfig uiconfig{.screen_brightness = 153, .screen_timeout = 30};
meshtastic_LocalModuleConfig moduleConfig; meshtastic_LocalModuleConfig moduleConfig;
meshtastic_ChannelFile channelFile; meshtastic_ChannelFile channelFile;
@ -895,6 +896,7 @@ void NodeDB::pickNewNodeNum()
static const char *prefFileName = "/prefs/db.proto"; static const char *prefFileName = "/prefs/db.proto";
static const char *configFileName = "/prefs/config.proto"; static const char *configFileName = "/prefs/config.proto";
static const char *uiconfigFileName = "/prefs/uiconfig.proto";
static const char *moduleConfigFileName = "/prefs/module.proto"; static const char *moduleConfigFileName = "/prefs/module.proto";
static const char *channelFileName = "/prefs/channels.proto"; static const char *channelFileName = "/prefs/channels.proto";
@ -1054,6 +1056,12 @@ void NodeDB::loadFromDisk()
} }
} }
state = loadProto(uiconfigFileName, meshtastic_DeviceUIConfig_size, sizeof(meshtastic_DeviceUIConfig),
&meshtastic_DeviceUIConfig_msg, &uiconfig);
if (state == LoadFileResult::LOAD_SUCCESS) {
LOG_INFO("Loaded UIConfig");
}
// 2.4.X - configuration migration to update new default intervals // 2.4.X - configuration migration to update new default intervals
if (moduleConfig.version < 23) { if (moduleConfig.version < 23) {
LOG_DEBUG("ModuleConfig version %d is stale, upgrading to new default intervals", moduleConfig.version); LOG_DEBUG("ModuleConfig version %d is stale, upgrading to new default intervals", moduleConfig.version);

View File

@ -29,6 +29,7 @@ extern meshtastic_DeviceState devicestate;
extern meshtastic_ChannelFile channelFile; extern meshtastic_ChannelFile channelFile;
extern meshtastic_MyNodeInfo &myNodeInfo; extern meshtastic_MyNodeInfo &myNodeInfo;
extern meshtastic_LocalConfig config; extern meshtastic_LocalConfig config;
extern meshtastic_DeviceUIConfig uiconfig;
extern meshtastic_LocalModuleConfig moduleConfig; extern meshtastic_LocalModuleConfig moduleConfig;
extern meshtastic_User &owner; extern meshtastic_User &owner;
extern meshtastic_Position localPosition; extern meshtastic_Position localPosition;

View File

@ -188,7 +188,6 @@ size_t PhoneAPI::getFromRadio(uint8_t *buf)
case STATE_SEND_NOTHING: case STATE_SEND_NOTHING:
LOG_DEBUG("FromRadio=STATE_SEND_NOTHING"); LOG_DEBUG("FromRadio=STATE_SEND_NOTHING");
break; break;
case STATE_SEND_MY_INFO: case STATE_SEND_MY_INFO:
LOG_DEBUG("FromRadio=STATE_SEND_MY_INFO"); LOG_DEBUG("FromRadio=STATE_SEND_MY_INFO");
// If the user has specified they don't want our node to share its location, make sure to tell the phone // If the user has specified they don't want our node to share its location, make sure to tell the phone
@ -196,11 +195,18 @@ size_t PhoneAPI::getFromRadio(uint8_t *buf)
fromRadioScratch.which_payload_variant = meshtastic_FromRadio_my_info_tag; fromRadioScratch.which_payload_variant = meshtastic_FromRadio_my_info_tag;
strncpy(myNodeInfo.pio_env, optstr(APP_ENV), sizeof(myNodeInfo.pio_env)); strncpy(myNodeInfo.pio_env, optstr(APP_ENV), sizeof(myNodeInfo.pio_env));
fromRadioScratch.my_info = myNodeInfo; fromRadioScratch.my_info = myNodeInfo;
state = STATE_SEND_OWN_NODEINFO; state = STATE_SEND_UIDATA;
service->refreshLocalMeshNode(); // Update my NodeInfo because the client will be asking for it soon. service->refreshLocalMeshNode(); // Update my NodeInfo because the client will be asking for it soon.
break; break;
case STATE_SEND_UIDATA:
LOG_INFO("getFromRadio=STATE_SEND_UIDATA");
fromRadioScratch.which_payload_variant = meshtastic_FromRadio_deviceuiConfig_tag;
fromRadioScratch.deviceuiConfig = uiconfig;
state = STATE_SEND_OWN_NODEINFO;
break;
case STATE_SEND_OWN_NODEINFO: { case STATE_SEND_OWN_NODEINFO: {
LOG_DEBUG("Send My NodeInfo"); LOG_DEBUG("Send My NodeInfo");
auto us = nodeDB->readNextMeshNode(readIndex); auto us = nodeDB->readNextMeshNode(readIndex);
@ -518,6 +524,7 @@ bool PhoneAPI::available()
case STATE_SEND_NOTHING: case STATE_SEND_NOTHING:
return false; return false;
case STATE_SEND_MY_INFO: case STATE_SEND_MY_INFO:
case STATE_SEND_UIDATA:
case STATE_SEND_CHANNELS: case STATE_SEND_CHANNELS:
case STATE_SEND_CONFIG: case STATE_SEND_CONFIG:
case STATE_SEND_MODULECONFIG: case STATE_SEND_MODULECONFIG:

View File

@ -34,6 +34,7 @@ class PhoneAPI
{ {
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_UIDATA, // send stored data for device-ui
STATE_SEND_MY_INFO, // send our my info record STATE_SEND_MY_INFO, // send our my info record
STATE_SEND_OWN_NODEINFO, STATE_SEND_OWN_NODEINFO,
STATE_SEND_METADATA, STATE_SEND_METADATA,

View File

@ -313,6 +313,7 @@ void printPacket(const char *prefix, const meshtastic_MeshPacket *p)
out += DEBUG_PORT.mt_sprintf(" failId=%08x", s.ackVariant.fail_id); */ out += DEBUG_PORT.mt_sprintf(" failId=%08x", s.ackVariant.fail_id); */
} else { } else {
out += " encrypted"; out += " encrypted";
out += DEBUG_PORT.mt_sprintf(" len=%d", p->encrypted.size + sizeof(PacketHeader));
} }
if (p->rx_time != 0) if (p->rx_time != 0)

View File

@ -58,7 +58,13 @@ typedef enum _meshtastic_Config_DeviceConfig_Role {
Technical Details: Turns off many of the routine broadcasts to favor ATAK CoT packet stream Technical Details: Turns off many of the routine broadcasts to favor ATAK CoT packet stream
and automatic TAK PLI (position location information) broadcasts. and automatic TAK PLI (position location information) broadcasts.
Uses position module configuration to determine TAK PLI broadcast interval. */ Uses position module configuration to determine TAK PLI broadcast interval. */
meshtastic_Config_DeviceConfig_Role_TAK_TRACKER = 10 meshtastic_Config_DeviceConfig_Role_TAK_TRACKER = 10,
/* Description: Will always rebroadcast packets, but will do so after all other modes.
Technical Details: Used for router nodes that are intended to provide additional coverage
in areas not already covered by other routers, or to bridge around problematic terrain,
but should not be given priority over other routers in order to avoid unnecessaraily
consuming hops. */
meshtastic_Config_DeviceConfig_Role_ROUTER_LATE = 11
} meshtastic_Config_DeviceConfig_Role; } meshtastic_Config_DeviceConfig_Role;
/* Defines the device's behavior for how messages are rebroadcast */ /* Defines the device's behavior for how messages are rebroadcast */
@ -588,8 +594,8 @@ extern "C" {
/* Helper constants for enums */ /* Helper constants for enums */
#define _meshtastic_Config_DeviceConfig_Role_MIN meshtastic_Config_DeviceConfig_Role_CLIENT #define _meshtastic_Config_DeviceConfig_Role_MIN meshtastic_Config_DeviceConfig_Role_CLIENT
#define _meshtastic_Config_DeviceConfig_Role_MAX meshtastic_Config_DeviceConfig_Role_TAK_TRACKER #define _meshtastic_Config_DeviceConfig_Role_MAX meshtastic_Config_DeviceConfig_Role_ROUTER_LATE
#define _meshtastic_Config_DeviceConfig_Role_ARRAYSIZE ((meshtastic_Config_DeviceConfig_Role)(meshtastic_Config_DeviceConfig_Role_TAK_TRACKER+1)) #define _meshtastic_Config_DeviceConfig_Role_ARRAYSIZE ((meshtastic_Config_DeviceConfig_Role)(meshtastic_Config_DeviceConfig_Role_ROUTER_LATE+1))
#define _meshtastic_Config_DeviceConfig_RebroadcastMode_MIN meshtastic_Config_DeviceConfig_RebroadcastMode_ALL #define _meshtastic_Config_DeviceConfig_RebroadcastMode_MIN meshtastic_Config_DeviceConfig_RebroadcastMode_ALL
#define _meshtastic_Config_DeviceConfig_RebroadcastMode_MAX meshtastic_Config_DeviceConfig_RebroadcastMode_CORE_PORTNUMS_ONLY #define _meshtastic_Config_DeviceConfig_RebroadcastMode_MAX meshtastic_Config_DeviceConfig_RebroadcastMode_CORE_PORTNUMS_ONLY

View File

@ -770,6 +770,10 @@ typedef struct _meshtastic_MeshPacket {
/* Last byte of the node number of the node that will relay/relayed this packet. /* Last byte of the node number of the node that will relay/relayed this packet.
Set by the firmware internally, clients are not supposed to set this. */ Set by the firmware internally, clients are not supposed to set this. */
uint8_t relay_node; uint8_t relay_node;
/* *Never* sent over the radio links.
Timestamp after which this packet may be sent.
Set by the firmware internally, clients are not supposed to set this. */
uint32_t tx_after;
} meshtastic_MeshPacket; } meshtastic_MeshPacket;
/* The bluetooth to device link: /* The bluetooth to device link:
@ -1178,7 +1182,7 @@ extern "C" {
#define meshtastic_Data_init_default {_meshtastic_PortNum_MIN, {0, {0}}, 0, 0, 0, 0, 0, 0, false, 0} #define meshtastic_Data_init_default {_meshtastic_PortNum_MIN, {0, {0}}, 0, 0, 0, 0, 0, 0, false, 0}
#define meshtastic_Waypoint_init_default {0, false, 0, false, 0, 0, 0, "", "", 0} #define meshtastic_Waypoint_init_default {0, false, 0, false, 0, 0, 0, "", "", 0}
#define meshtastic_MqttClientProxyMessage_init_default {"", 0, {{0, {0}}}, 0} #define meshtastic_MqttClientProxyMessage_init_default {"", 0, {{0, {0}}}, 0}
#define meshtastic_MeshPacket_init_default {0, 0, 0, 0, {meshtastic_Data_init_default}, 0, 0, 0, 0, 0, _meshtastic_MeshPacket_Priority_MIN, 0, _meshtastic_MeshPacket_Delayed_MIN, 0, 0, {0, {0}}, 0, 0, 0} #define meshtastic_MeshPacket_init_default {0, 0, 0, 0, {meshtastic_Data_init_default}, 0, 0, 0, 0, 0, _meshtastic_MeshPacket_Priority_MIN, 0, _meshtastic_MeshPacket_Delayed_MIN, 0, 0, {0, {0}}, 0, 0, 0, 0}
#define meshtastic_NodeInfo_init_default {0, false, meshtastic_User_init_default, false, meshtastic_Position_init_default, 0, 0, false, meshtastic_DeviceMetrics_init_default, 0, 0, false, 0, 0, 0} #define meshtastic_NodeInfo_init_default {0, false, meshtastic_User_init_default, false, meshtastic_Position_init_default, 0, 0, false, meshtastic_DeviceMetrics_init_default, 0, 0, false, 0, 0, 0}
#define meshtastic_MyNodeInfo_init_default {0, 0, 0, {0, {0}}, ""} #define meshtastic_MyNodeInfo_init_default {0, 0, 0, {0, {0}}, ""}
#define meshtastic_LogRecord_init_default {"", 0, "", _meshtastic_LogRecord_Level_MIN} #define meshtastic_LogRecord_init_default {"", 0, "", _meshtastic_LogRecord_Level_MIN}
@ -1203,7 +1207,7 @@ extern "C" {
#define meshtastic_Data_init_zero {_meshtastic_PortNum_MIN, {0, {0}}, 0, 0, 0, 0, 0, 0, false, 0} #define meshtastic_Data_init_zero {_meshtastic_PortNum_MIN, {0, {0}}, 0, 0, 0, 0, 0, 0, false, 0}
#define meshtastic_Waypoint_init_zero {0, false, 0, false, 0, 0, 0, "", "", 0} #define meshtastic_Waypoint_init_zero {0, false, 0, false, 0, 0, 0, "", "", 0}
#define meshtastic_MqttClientProxyMessage_init_zero {"", 0, {{0, {0}}}, 0} #define meshtastic_MqttClientProxyMessage_init_zero {"", 0, {{0, {0}}}, 0}
#define meshtastic_MeshPacket_init_zero {0, 0, 0, 0, {meshtastic_Data_init_zero}, 0, 0, 0, 0, 0, _meshtastic_MeshPacket_Priority_MIN, 0, _meshtastic_MeshPacket_Delayed_MIN, 0, 0, {0, {0}}, 0, 0, 0} #define meshtastic_MeshPacket_init_zero {0, 0, 0, 0, {meshtastic_Data_init_zero}, 0, 0, 0, 0, 0, _meshtastic_MeshPacket_Priority_MIN, 0, _meshtastic_MeshPacket_Delayed_MIN, 0, 0, {0, {0}}, 0, 0, 0, 0}
#define meshtastic_NodeInfo_init_zero {0, false, meshtastic_User_init_zero, false, meshtastic_Position_init_zero, 0, 0, false, meshtastic_DeviceMetrics_init_zero, 0, 0, false, 0, 0, 0} #define meshtastic_NodeInfo_init_zero {0, false, meshtastic_User_init_zero, false, meshtastic_Position_init_zero, 0, 0, false, meshtastic_DeviceMetrics_init_zero, 0, 0, false, 0, 0, 0}
#define meshtastic_MyNodeInfo_init_zero {0, 0, 0, {0, {0}}, ""} #define meshtastic_MyNodeInfo_init_zero {0, 0, 0, {0, {0}}, ""}
#define meshtastic_LogRecord_init_zero {"", 0, "", _meshtastic_LogRecord_Level_MIN} #define meshtastic_LogRecord_init_zero {"", 0, "", _meshtastic_LogRecord_Level_MIN}
@ -1301,6 +1305,7 @@ extern "C" {
#define meshtastic_MeshPacket_pki_encrypted_tag 17 #define meshtastic_MeshPacket_pki_encrypted_tag 17
#define meshtastic_MeshPacket_next_hop_tag 18 #define meshtastic_MeshPacket_next_hop_tag 18
#define meshtastic_MeshPacket_relay_node_tag 19 #define meshtastic_MeshPacket_relay_node_tag 19
#define meshtastic_MeshPacket_tx_after_tag 20
#define meshtastic_NodeInfo_num_tag 1 #define meshtastic_NodeInfo_num_tag 1
#define meshtastic_NodeInfo_user_tag 2 #define meshtastic_NodeInfo_user_tag 2
#define meshtastic_NodeInfo_position_tag 3 #define meshtastic_NodeInfo_position_tag 3
@ -1497,7 +1502,8 @@ X(a, STATIC, SINGULAR, UINT32, hop_start, 15) \
X(a, STATIC, SINGULAR, BYTES, public_key, 16) \ X(a, STATIC, SINGULAR, BYTES, public_key, 16) \
X(a, STATIC, SINGULAR, BOOL, pki_encrypted, 17) \ X(a, STATIC, SINGULAR, BOOL, pki_encrypted, 17) \
X(a, STATIC, SINGULAR, UINT32, next_hop, 18) \ X(a, STATIC, SINGULAR, UINT32, next_hop, 18) \
X(a, STATIC, SINGULAR, UINT32, relay_node, 19) X(a, STATIC, SINGULAR, UINT32, relay_node, 19) \
X(a, STATIC, SINGULAR, UINT32, tx_after, 20)
#define meshtastic_MeshPacket_CALLBACK NULL #define meshtastic_MeshPacket_CALLBACK NULL
#define meshtastic_MeshPacket_DEFAULT NULL #define meshtastic_MeshPacket_DEFAULT NULL
#define meshtastic_MeshPacket_payload_variant_decoded_MSGTYPE meshtastic_Data #define meshtastic_MeshPacket_payload_variant_decoded_MSGTYPE meshtastic_Data
@ -1747,7 +1753,7 @@ extern const pb_msgdesc_t meshtastic_ChunkedPayloadResponse_msg;
#define meshtastic_FromRadio_size 510 #define meshtastic_FromRadio_size 510
#define meshtastic_Heartbeat_size 0 #define meshtastic_Heartbeat_size 0
#define meshtastic_LogRecord_size 426 #define meshtastic_LogRecord_size 426
#define meshtastic_MeshPacket_size 371 #define meshtastic_MeshPacket_size 378
#define meshtastic_MqttClientProxyMessage_size 501 #define meshtastic_MqttClientProxyMessage_size 501
#define meshtastic_MyNodeInfo_size 77 #define meshtastic_MyNodeInfo_size 77
#define meshtastic_NeighborInfo_size 258 #define meshtastic_NeighborInfo_size 258

View File

@ -175,6 +175,12 @@ bool AdminModule::handleReceivedProtobuf(const meshtastic_MeshPacket &mp, meshta
LOG_INFO("Client set ham mode"); LOG_INFO("Client set ham mode");
handleSetHamMode(r->set_ham_mode); handleSetHamMode(r->set_ham_mode);
break; break;
case meshtastic_AdminMessage_get_ui_config_request_tag: {
LOG_INFO("Client is getting device-ui config");
handleGetDeviceUIConfig(mp);
handled = true;
break;
}
/** /**
* Other * Other
@ -234,6 +240,11 @@ bool AdminModule::handleReceivedProtobuf(const meshtastic_MeshPacket &mp, meshta
reboot(DEFAULT_REBOOT_SECONDS); reboot(DEFAULT_REBOOT_SECONDS);
break; break;
} }
case meshtastic_AdminMessage_store_ui_config_tag: {
LOG_INFO("Storing device-ui config");
handleStoreDeviceUIConfig(r->store_ui_config);
break;
}
case meshtastic_AdminMessage_begin_edit_settings_tag: { case meshtastic_AdminMessage_begin_edit_settings_tag: {
LOG_INFO("Begin transaction for editing settings"); LOG_INFO("Begin transaction for editing settings");
hasOpenEditTransaction = true; hasOpenEditTransaction = true;
@ -358,7 +369,7 @@ bool AdminModule::handleReceivedProtobuf(const meshtastic_MeshPacket &mp, meshta
#ifdef ARCH_PORTDUINO #ifdef ARCH_PORTDUINO
case meshtastic_AdminMessage_exit_simulator_tag: case meshtastic_AdminMessage_exit_simulator_tag:
LOG_INFO("Exiting simulator"); LOG_INFO("Exiting simulator");
_exit(0); exit(0);
break; break;
#endif #endif
@ -477,7 +488,7 @@ void AdminModule::handleSetConfig(const meshtastic_Config &c)
IS_ONE_OF(config.device.role, meshtastic_Config_DeviceConfig_Role_ROUTER, IS_ONE_OF(config.device.role, meshtastic_Config_DeviceConfig_Role_ROUTER,
meshtastic_Config_DeviceConfig_Role_REPEATER)) { meshtastic_Config_DeviceConfig_Role_REPEATER)) {
config.device.rebroadcast_mode = meshtastic_Config_DeviceConfig_RebroadcastMode_ALL; config.device.rebroadcast_mode = meshtastic_Config_DeviceConfig_RebroadcastMode_ALL;
const char *warning = "Rebroadcast mode can't be set to NONE for a router or repeater\n"; const char *warning = "Rebroadcast mode can't be set to NONE for a router or repeater";
LOG_WARN(warning); LOG_WARN(warning);
sendWarning(warning); sendWarning(warning);
} }
@ -995,6 +1006,14 @@ void AdminModule::handleGetChannel(const meshtastic_MeshPacket &req, uint32_t ch
} }
} }
void AdminModule::handleGetDeviceUIConfig(const meshtastic_MeshPacket &req)
{
meshtastic_AdminMessage r = meshtastic_AdminMessage_init_default;
r.which_payload_variant = meshtastic_AdminMessage_get_ui_config_response_tag;
r.store_ui_config = uiconfig;
myReply = allocDataProtobuf(r);
}
void AdminModule::reboot(int32_t seconds) void AdminModule::reboot(int32_t seconds)
{ {
LOG_INFO("Reboot in %d seconds", seconds); LOG_INFO("Reboot in %d seconds", seconds);
@ -1015,6 +1034,11 @@ void AdminModule::saveChanges(int saveWhat, bool shouldReboot)
} }
} }
void AdminModule::handleStoreDeviceUIConfig(const meshtastic_DeviceUIConfig &uicfg)
{
nodeDB->saveProto("/prefs/uiconfig.proto", meshtastic_DeviceUIConfig_size, &meshtastic_DeviceUIConfig_msg, &uicfg);
}
void AdminModule::handleSetHamMode(const meshtastic_HamParameters &p) void AdminModule::handleSetHamMode(const meshtastic_HamParameters &p)
{ {
// Set call sign and override lora limitations for licensed use // Set call sign and override lora limitations for licensed use
@ -1081,7 +1105,8 @@ bool AdminModule::messageIsResponse(const meshtastic_AdminMessage *r)
r->which_payload_variant == meshtastic_AdminMessage_get_ringtone_response_tag || r->which_payload_variant == meshtastic_AdminMessage_get_ringtone_response_tag ||
r->which_payload_variant == meshtastic_AdminMessage_get_device_connection_status_response_tag || r->which_payload_variant == meshtastic_AdminMessage_get_device_connection_status_response_tag ||
r->which_payload_variant == meshtastic_AdminMessage_get_node_remote_hardware_pins_response_tag || r->which_payload_variant == meshtastic_AdminMessage_get_node_remote_hardware_pins_response_tag ||
r->which_payload_variant == meshtastic_NodeRemoteHardwarePinsResponse_node_remote_hardware_pins_tag) r->which_payload_variant == meshtastic_NodeRemoteHardwarePinsResponse_node_remote_hardware_pins_tag ||
r->which_payload_variant == meshtastic_AdminMessage_get_ui_config_response_tag)
return true; return true;
else else
return false; return false;
@ -1097,7 +1122,8 @@ bool AdminModule::messageIsRequest(const meshtastic_AdminMessage *r)
r->which_payload_variant == meshtastic_AdminMessage_get_device_metadata_request_tag || r->which_payload_variant == meshtastic_AdminMessage_get_device_metadata_request_tag ||
r->which_payload_variant == meshtastic_AdminMessage_get_ringtone_request_tag || r->which_payload_variant == meshtastic_AdminMessage_get_ringtone_request_tag ||
r->which_payload_variant == meshtastic_AdminMessage_get_device_connection_status_request_tag || r->which_payload_variant == meshtastic_AdminMessage_get_device_connection_status_request_tag ||
r->which_payload_variant == meshtastic_AdminMessage_get_node_remote_hardware_pins_request_tag) r->which_payload_variant == meshtastic_AdminMessage_get_node_remote_hardware_pins_request_tag ||
r->which_payload_variant == meshtastic_AdminMessage_get_ui_config_request_tag)
return true; return true;
else else
return false; return false;

View File

@ -43,6 +43,7 @@ class AdminModule : public ProtobufModule<meshtastic_AdminMessage>, public Obser
void handleGetDeviceMetadata(const meshtastic_MeshPacket &req); void handleGetDeviceMetadata(const meshtastic_MeshPacket &req);
void handleGetDeviceConnectionStatus(const meshtastic_MeshPacket &req); void handleGetDeviceConnectionStatus(const meshtastic_MeshPacket &req);
void handleGetNodeRemoteHardwarePins(const meshtastic_MeshPacket &req); void handleGetNodeRemoteHardwarePins(const meshtastic_MeshPacket &req);
void handleGetDeviceUIConfig(const meshtastic_MeshPacket &req);
/** /**
* Setters * Setters
*/ */
@ -52,6 +53,7 @@ class AdminModule : public ProtobufModule<meshtastic_AdminMessage>, public Obser
void handleSetModuleConfig(const meshtastic_ModuleConfig &c); void handleSetModuleConfig(const meshtastic_ModuleConfig &c);
void handleSetChannel(); void handleSetChannel();
void handleSetHamMode(const meshtastic_HamParameters &req); void handleSetHamMode(const meshtastic_HamParameters &req);
void handleStoreDeviceUIConfig(const meshtastic_DeviceUIConfig &uicfg);
void reboot(int32_t seconds); void reboot(int32_t seconds);
void setPassKey(meshtastic_AdminMessage *res); void setPassKey(meshtastic_AdminMessage *res);

View File

@ -88,13 +88,13 @@ bool QMA6100PSingleton::init(ScanI2C::FoundDevice device)
bool status = begin(device.address.address, &Wire); bool status = begin(device.address.address, &Wire);
#endif #endif
if (status != true) { if (status != true) {
LOG_WARN("QMA6100P init begin failed\n"); LOG_WARN("QMA6100P init begin failed");
return false; return false;
} }
delay(20); delay(20);
// SW reset to make sure the device starts in a known state // SW reset to make sure the device starts in a known state
if (softwareReset() != true) { if (softwareReset() != true) {
LOG_WARN("QMA6100P init reset failed\n"); LOG_WARN("QMA6100P init reset failed");
return false; return false;
} }
delay(20); delay(20);

View File

@ -96,6 +96,9 @@ inline void onReceiveProto(char *topic, byte *payload, size_t length)
UniquePacketPoolPacket p = packetPool.allocUniqueCopy(*e.packet); UniquePacketPoolPacket p = packetPool.allocUniqueCopy(*e.packet);
p->via_mqtt = true; // Mark that the packet was received via MQTT p->via_mqtt = true; // Mark that the packet was received via MQTT
// Unset received SNR/RSSI which might have been added by the MQTT gateway
p->rx_snr = 0;
p->rx_rssi = 0;
if (p->which_payload_variant == meshtastic_MeshPacket_decoded_tag) { if (p->which_payload_variant == meshtastic_MeshPacket_decoded_tag) {
if (moduleConfig.mqtt.encryption_enabled) { if (moduleConfig.mqtt.encryption_enabled) {

18
test/TestUtil.cpp Normal file
View File

@ -0,0 +1,18 @@
#include "SerialConsole.h"
#include "concurrency/OSThread.h"
#include "gps/RTC.h"
#include "TestUtil.h"
void initializeTestEnvironment()
{
concurrency::hasBeenSetup = true;
consoleInit();
#if ARCH_PORTDUINO
struct timeval tv;
tv.tv_sec = time(NULL);
tv.tv_usec = 0;
perhapsSetRTC(RTCQualityNTP, &tv);
#endif
concurrency::OSThread::setup();
}

4
test/TestUtil.h Normal file
View File

@ -0,0 +1,4 @@
#pragma once
// Initialize testing environment.
void initializeTestEnvironment();

View File

@ -1,5 +1,6 @@
#include "CryptoEngine.h" #include "CryptoEngine.h"
#include "TestUtil.h"
#include <unity.h> #include <unity.h>
void HexToBytes(uint8_t *result, const std::string hex, size_t len = 0) void HexToBytes(uint8_t *result, const std::string hex, size_t len = 0)
@ -170,15 +171,14 @@ void setup()
delay(10); delay(10);
delay(2000); delay(2000);
initializeTestEnvironment();
UNITY_BEGIN(); // IMPORTANT LINE! UNITY_BEGIN(); // IMPORTANT LINE!
RUN_TEST(test_SHA256); RUN_TEST(test_SHA256);
RUN_TEST(test_ECB_AES256); RUN_TEST(test_ECB_AES256);
RUN_TEST(test_DH25519); RUN_TEST(test_DH25519);
RUN_TEST(test_AES_CTR); RUN_TEST(test_AES_CTR);
RUN_TEST(test_PKC_Decrypt); RUN_TEST(test_PKC_Decrypt);
exit(UNITY_END()); // stop unit testing
} }
void loop() void loop() {}
{
UNITY_END(); // stop unit testing
}

View File

@ -9,3 +9,7 @@ build_flags = ${portduino_base.build_flags} -O0 -I variants/portduino
board = cross_platform board = cross_platform
lib_deps = ${portduino_base.lib_deps} lib_deps = ${portduino_base.lib_deps}
build_src_filter = ${portduino_base.build_src_filter} build_src_filter = ${portduino_base.build_src_filter}
[env:coverage]
extends = env:native
build_flags = -lgcov --coverage -fprofile-abs-path ${env:native.build_flags}

View File

@ -37,11 +37,11 @@ static void onewire_evt(const uint8_t pid, const uint8_t sid, const SNHUBAPI_EVT
break; break;
case SNHUBAPI_EVT_ADD_SID: case SNHUBAPI_EVT_ADD_SID:
// LOG_INFO("+ADD:SID:[%02x]\r\n", msg[0]); // LOG_INFO("+ADD:SID:[%02x]", msg[0]);
break; break;
case SNHUBAPI_EVT_ADD_PID: case SNHUBAPI_EVT_ADD_PID:
// LOG_INFO("+ADD:PID:[%02x]\r\n", msg[0]); // LOG_INFO("+ADD:PID:[%02x]", msg[0]);
#ifdef BOOT_DATA_REQ #ifdef BOOT_DATA_REQ
provision = msg[0]; provision = msg[0];
#endif #endif
@ -55,12 +55,12 @@ static void onewire_evt(const uint8_t pid, const uint8_t sid, const SNHUBAPI_EVT
case SNHUBAPI_EVT_SDATA_REQ: case SNHUBAPI_EVT_SDATA_REQ:
// LOG_INFO("+EVT:PID[%02x],IPSO[%02x]\r\n",pid,msg[0]); // LOG_INFO("+EVT:PID[%02x],IPSO[%02x]",pid,msg[0]);
// for( uint16_t i=1; i<len; i++) // for( uint16_t i=1; i<len; i++)
// { // {
// LOG_INFO("%02x,", msg[i]); // LOG_INFO("%02x,", msg[i]);
// } // }
// LOG_INFO("\r\n"); // LOG_INFO("");
switch (msg[0]) { switch (msg[0]) {
case RAK_IPSO_CAPACITY: case RAK_IPSO_CAPACITY:
dc_prec = msg[1]; dc_prec = msg[1];
@ -82,12 +82,12 @@ static void onewire_evt(const uint8_t pid, const uint8_t sid, const SNHUBAPI_EVT
break; break;
case SNHUBAPI_EVT_REPORT: case SNHUBAPI_EVT_REPORT:
// LOG_INFO("+EVT:PID[%02x],IPSO[%02x]\r\n",pid,msg[0]); // LOG_INFO("+EVT:PID[%02x],IPSO[%02x]",pid,msg[0]);
// for( uint16_t i=1; i<len; i++) // for( uint16_t i=1; i<len; i++)
// { // {
// LOG_INFO("%02x,", msg[i]); // LOG_INFO("%02x,", msg[i]);
// } // }
// LOG_INFO("\r\n"); // LOG_INFO("");
switch (msg[0]) { switch (msg[0]) {
case RAK_IPSO_CAPACITY: case RAK_IPSO_CAPACITY:
@ -110,11 +110,11 @@ static void onewire_evt(const uint8_t pid, const uint8_t sid, const SNHUBAPI_EVT
break; break;
case SNHUBAPI_EVT_CHKSUM_ERR: case SNHUBAPI_EVT_CHKSUM_ERR:
LOG_INFO("+ERR:CHKSUM\r\n"); LOG_INFO("+ERR:CHKSUM");
break; break;
case SNHUBAPI_EVT_SEQ_ERR: case SNHUBAPI_EVT_SEQ_ERR:
LOG_INFO("+ERR:SEQUCE\r\n"); LOG_INFO("+ERR:SEQUCE");
break; break;
default: default: