├── .gitignore ├── .gitmodules ├── .trunk ├── .gitignore ├── configs │ ├── .clang-format │ ├── .flake8 │ ├── .hadolint.yaml │ ├── .isort.cfg │ ├── .markdownlint.yaml │ ├── .shellcheckrc │ └── .yamllint.yaml └── trunk.yaml ├── .vscode └── settings.json ├── LICENSE ├── README.md ├── bin ├── littlefsbuilder.py ├── mklittlefs ├── regen-protos.bat └── regen-protos.sh ├── boards ├── ESP-4848S040.json ├── heltec-wireless-tracker.json ├── lilygo-t-hmi.json ├── seeed-sensecap-indicator.json ├── t-deck.json ├── t-watch-s3.json └── wt32-sc01-plus.json ├── docs ├── ESP32-4848S040.jpg ├── T-HMI.jpg ├── WT32-SC01-Plus.jpg └── native-mui.png ├── etc ├── MUI.desktop └── MUI.png ├── lib ├── log │ ├── Log.cpp │ └── Log.h └── mesh │ ├── external_callbacks.cpp │ ├── generated │ └── meshtastic │ │ ├── admin.pb.cpp │ │ ├── admin.pb.h │ │ ├── apponly.pb.cpp │ │ ├── apponly.pb.h │ │ ├── atak.pb.cpp │ │ ├── atak.pb.h │ │ ├── cannedmessages.pb.cpp │ │ ├── cannedmessages.pb.h │ │ ├── channel.pb.cpp │ │ ├── channel.pb.h │ │ ├── clientonly.pb.cpp │ │ ├── clientonly.pb.h │ │ ├── config.pb.cpp │ │ ├── config.pb.h │ │ ├── connection_status.pb.cpp │ │ ├── connection_status.pb.h │ │ ├── device_ui.pb.cpp │ │ ├── device_ui.pb.h │ │ ├── deviceonly.pb.cpp │ │ ├── deviceonly.pb.h │ │ ├── interdevice.pb.cpp │ │ ├── interdevice.pb.h │ │ ├── localonly.pb.cpp │ │ ├── localonly.pb.h │ │ ├── mesh.pb.cpp │ │ ├── mesh.pb.h │ │ ├── module_config.pb.cpp │ │ ├── module_config.pb.h │ │ ├── mqtt.pb.cpp │ │ ├── mqtt.pb.h │ │ ├── paxcount.pb.cpp │ │ ├── paxcount.pb.h │ │ ├── portnums.pb.cpp │ │ ├── portnums.pb.h │ │ ├── powermon.pb.cpp │ │ ├── powermon.pb.h │ │ ├── remote_hardware.pb.cpp │ │ ├── remote_hardware.pb.h │ │ ├── rtttl.pb.cpp │ │ ├── rtttl.pb.h │ │ ├── storeforward.pb.cpp │ │ ├── storeforward.pb.h │ │ ├── telemetry.pb.cpp │ │ ├── telemetry.pb.h │ │ ├── xmodem.pb.cpp │ │ └── xmodem.pb.h │ ├── mesh-pb-constants.cpp │ └── mesh-pb-constants.h ├── platformio.ini ├── squareline ├── t-deck │ ├── T_Deck_Meshtastic.sll │ └── T_Deck_Meshtastic.spj └── t-watch-s3 │ ├── T_Watch_Meshtastic.sll │ └── T_Watch_Meshtastic.spj ├── src └── main.cpp ├── test ├── definitions.cpp └── test_MeshEnvelope.cpp └── variants ├── esp-4848s040 └── pins_arduino.h ├── heltec-wireless-tracker └── pins_arduino.h ├── makerfabs-480x480 └── pins_arduino.h ├── seeed-sensecap-indicator └── pins_arduino.h ├── t-deck └── pins_arduino.h ├── t-watch-s3 └── pins_arduino.h └── wt32-sc01-plus └── pins_arduino.h /.gitignore: -------------------------------------------------------------------------------- 1 | .pio 2 | .vscode/.browse.c_cpp.db* 3 | .vscode/c_cpp_properties.json 4 | .vscode/extensions.json 5 | .vscode/launch.json 6 | .vscode/ipch 7 | squareline 8 | .vscode/extensions.json 9 | -------------------------------------------------------------------------------- /.gitmodules: -------------------------------------------------------------------------------- 1 | [submodule "protobufs"] 2 | path = protobufs 3 | url = https://github.com/meshtastic/protobufs 4 | -------------------------------------------------------------------------------- /.trunk/.gitignore: -------------------------------------------------------------------------------- 1 | *out 2 | *logs 3 | *actions 4 | *notifications 5 | *tools 6 | plugins 7 | user_trunk.yaml 8 | user.yaml 9 | tmp 10 | -------------------------------------------------------------------------------- /.trunk/configs/.clang-format: -------------------------------------------------------------------------------- 1 | Language: Cpp 2 | IndentWidth: 4 3 | ColumnLimit: 130 4 | PointerAlignment: Right 5 | BreakBeforeBraces: Linux 6 | AllowShortFunctionsOnASingleLine: Inline 7 | -------------------------------------------------------------------------------- /.trunk/configs/.flake8: -------------------------------------------------------------------------------- 1 | # Autoformatter friendly flake8 config (all formatting rules disabled) 2 | [flake8] 3 | extend-ignore = D1, D2, E1, E2, E3, E501, W1, W2, W3, W5 4 | -------------------------------------------------------------------------------- /.trunk/configs/.hadolint.yaml: -------------------------------------------------------------------------------- 1 | # Following source doesn't work in most setups 2 | ignored: 3 | - SC1090 4 | - SC1091 5 | -------------------------------------------------------------------------------- /.trunk/configs/.isort.cfg: -------------------------------------------------------------------------------- 1 | [settings] 2 | profile=black 3 | -------------------------------------------------------------------------------- /.trunk/configs/.markdownlint.yaml: -------------------------------------------------------------------------------- 1 | # Autoformatter friendly markdownlint config (all formatting rules disabled) 2 | default: true 3 | blank_lines: false 4 | bullet: false 5 | html: false 6 | indentation: false 7 | line_length: false 8 | spaces: false 9 | url: false 10 | whitespace: false 11 | -------------------------------------------------------------------------------- /.trunk/configs/.shellcheckrc: -------------------------------------------------------------------------------- 1 | enable=all 2 | source-path=SCRIPTDIR 3 | disable=SC2154 4 | disable=SC2248 5 | disable=SC2250 6 | 7 | # If you're having issues with shellcheck following source, disable the errors via: 8 | # disable=SC1090 9 | # disable=SC1091 10 | # -------------------------------------------------------------------------------- /.trunk/configs/.yamllint.yaml: -------------------------------------------------------------------------------- 1 | rules: 2 | quoted-strings: 3 | required: only-when-needed 4 | extra-allowed: ["{|}"] 5 | empty-values: 6 | forbid-in-block-mappings: false 7 | forbid-in-flow-mappings: true 8 | key-duplicates: {} 9 | octal-values: 10 | forbid-implicit-octal: true 11 | -------------------------------------------------------------------------------- /.trunk/trunk.yaml: -------------------------------------------------------------------------------- 1 | # This file controls the behavior of Trunk: https://docs.trunk.io/cli 2 | # To learn more about the format of this file, see https://docs.trunk.io/reference/trunk-yaml 3 | version: 0.1 4 | cli: 5 | version: 1.22.11 6 | # Trunk provides extensibility via plugins. (https://docs.trunk.io/plugins) 7 | plugins: 8 | sources: 9 | - id: trunk 10 | ref: v1.6.7 11 | uri: https://github.com/trunk-io/plugins 12 | # Many linters and tools depend on runtimes - configure them here. (https://docs.trunk.io/runtimes) 13 | runtimes: 14 | enabled: 15 | - go@1.21.0 16 | - node@18.20.5 17 | - python@3.10.8 18 | # This is the section where you manage your linters. (https://docs.trunk.io/check/configuration) 19 | lint: 20 | enabled: 21 | - trufflehog@3.88.18 22 | - yamllint@1.36.2 23 | - bandit@1.8.3 24 | - checkov@3.2.390 25 | - terrascan@1.19.1 26 | - trivy@0.60.0 27 | - taplo@0.9.3 28 | - ruff@0.11.1 29 | - isort@6.0.1 30 | - markdownlint@0.44.0 31 | - oxipng@9.1.4 32 | - svgo@3.3.2 33 | - actionlint@1.7.7 34 | - flake8@7.1.2 35 | - hadolint@2.12.1-beta 36 | - shfmt@3.6.0 37 | - shellcheck@0.10.0 38 | - black@25.1.0 39 | - git-diff-check 40 | - gitleaks@8.24.0 41 | - clang-format@16.0.3 42 | - prettier@3.5.3 43 | ignore: 44 | - linters: [ALL] 45 | paths: 46 | # Ignore generated files 47 | - generated/** 48 | actions: 49 | disabled: 50 | - trunk-announce 51 | enabled: 52 | - trunk-check-pre-push 53 | - trunk-fmt-pre-commit 54 | - trunk-upgrade-available 55 | -------------------------------------------------------------------------------- /.vscode/settings.json: -------------------------------------------------------------------------------- 1 | { 2 | "files.associations": { 3 | "lv_api_map.h": "c", 4 | "arduino.h": "c", 5 | "displaysettings": "cpp", 6 | "cstdint": "cpp", 7 | "array": "cpp", 8 | "atomic": "cpp", 9 | "*.tcc": "cpp", 10 | "cctype": "cpp", 11 | "chrono": "cpp", 12 | "clocale": "cpp", 13 | "cmath": "cpp", 14 | "condition_variable": "cpp", 15 | "cstdarg": "cpp", 16 | "cstddef": "cpp", 17 | "cstdio": "cpp", 18 | "cstdlib": "cpp", 19 | "cstring": "cpp", 20 | "ctime": "cpp", 21 | "cwchar": "cpp", 22 | "cwctype": "cpp", 23 | "deque": "cpp", 24 | "list": "cpp", 25 | "unordered_map": "cpp", 26 | "unordered_set": "cpp", 27 | "vector": "cpp", 28 | "exception": "cpp", 29 | "algorithm": "cpp", 30 | "functional": "cpp", 31 | "iterator": "cpp", 32 | "map": "cpp", 33 | "memory": "cpp", 34 | "memory_resource": "cpp", 35 | "numeric": "cpp", 36 | "optional": "cpp", 37 | "random": "cpp", 38 | "ratio": "cpp", 39 | "string": "cpp", 40 | "string_view": "cpp", 41 | "system_error": "cpp", 42 | "tuple": "cpp", 43 | "type_traits": "cpp", 44 | "utility": "cpp", 45 | "fstream": "cpp", 46 | "initializer_list": "cpp", 47 | "iomanip": "cpp", 48 | "iosfwd": "cpp", 49 | "istream": "cpp", 50 | "limits": "cpp", 51 | "mutex": "cpp", 52 | "new": "cpp", 53 | "ostream": "cpp", 54 | "sstream": "cpp", 55 | "stdexcept": "cpp", 56 | "streambuf": "cpp", 57 | "thread": "cpp", 58 | "cinttypes": "cpp", 59 | "typeinfo": "cpp", 60 | "lv_hal_tick.h": "c", 61 | "compare": "cpp", 62 | "lv_drv_conf.h": "c", 63 | "gc9a01.h": "c" 64 | }, 65 | "cmake.configureOnOpen": false, 66 | "C_Cpp.default.compilerPath": "/usr/lib64/ccache/g++" 67 | } -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # 2 | 3 |
4 | 5 | meshtastic 6 | 7 |

Meshtastic Standalone UI

8 |

A versatile UI for the meshtastic® project

9 |
10 | 11 | 12 | 13 |

14 | 15 | GitHub last commit 16 | 17 | GitHub issues 18 | 19 | Open Collective backers 20 | 21 |

22 | 23 |

24 | Vectors and icons by SVG Repo
25 | Graphics using LVGL library 26 |

27 | 28 | ## :wave: Introduction 29 | 30 | ### PlatformIO projects for standalone display devices 31 | 32 | This repository provides firmware source code for the following MUI devices and scenarios: 33 | 34 |

35 | 36 | - LilyGo T-HMI 2.8inch TFT (esp32-s3) - serial 37 | - ESP32-4848S040 4.0inch TFT (esp32-s3) - serial 38 | - WT32-SC01 Plus 3.5inch TFT (esp32-s3) - serial 39 | - Native linux X11 local/remote application - ethernet TCP/IP 40 | 41 | T-HMIESP32-4848S040WT32-SC01 PlusNative MUI Client 42 | 43 |

44 | 45 | ## :computer: Build & Flash 46 | 47 | Please follow the prerequisites for setting up the Linux Development Environment and the general build instructions.
48 | Then either install a Linux native device or use a esp32-s3 TFT device connected to a LoRa device via serial .

49 | Finally build the MUI standalone firmware using a linux terminal as follows: 50 | 51 | ```bash 52 | # checkout the repository from github 53 | git clone --depth=1 --recursive https://github.com/meshtastic/standalone-ui 54 | cd standalone-ui 55 | 56 | # activate the pio environment 57 | source $HOME/.platformio/bin/penv/activate 58 | 59 | # build and optionally upload the target(s) to your device(s) 60 | pio run -e t-hmi-mui -t upload 61 | pio run -e diy-replicator-mui -t upload 62 | pio run -e wt32-sc01-plus-mui -t upload 63 | 64 | # when connecting to another LoRa device its serial interface must be configured: 65 | meshtastic --set serial.enabled true --set serial.baud 38400 --set serial.mode PROTO 66 | # please configure the right GPIO serial ports for rx/tx, e.g. for RAK4631 67 | meshtastic --set serial.rxd 8 --set serial.txd 6 68 | 69 | # build the native MUI 70 | pio run -e native-mui 71 | 72 | # install MUI desktop icon 73 | mkdir -p $HOME/.icons $HOME/.local/share/applications $HOME/.local/bin 74 | cp etc/MUI.desktop $HOME/.local/share/applications 75 | cp etc/MUI.png $HOME/.icons 76 | cp .pio/build/native-mui/program $HOME/.local/bin/native-mui 77 | 78 | # run MUI native from CLI to connect to meshtasticd daemon 79 | .pio/build/native-mui/program 80 | ``` 81 | 82 | ## Stats 83 | 84 | ![Alt](https://repobeats.axiom.co/api/embed/7caf5492ebef98d9b88747eba781e592a9682f9d.svg "Repobeats analytics image") 85 | -------------------------------------------------------------------------------- /bin/littlefsbuilder.py: -------------------------------------------------------------------------------- 1 | Import("env") 2 | env.Replace( 3 | MKFSTOOL=env.get("PROJECT_DIR") + "/bin/mklittlefs" 4 | ) # PlatformIO now believes it has actually created a SPIFFS 5 | -------------------------------------------------------------------------------- /bin/mklittlefs: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/meshtastic/standalone-ui/c6068bc6d6418c3ac42976c99e8d56c3e93424d5/bin/mklittlefs -------------------------------------------------------------------------------- /bin/regen-protos.bat: -------------------------------------------------------------------------------- 1 | cd protobufs && ..\nanopb-0.4.8\generator-bin\protoc.exe --nanopb_out=-v:..\src -I=..\protobufs meshtastic\*.proto 2 | -------------------------------------------------------------------------------- /bin/regen-protos.sh: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env bash 2 | 3 | set -e 4 | 5 | echo "This script requires https://jpa.kapsi.fi/nanopb/download/ version 0.4.9.1 to be located in the" 6 | echo "firmware root directory if the following step fails, you should download the correct" 7 | echo "prebuilt binaries for your computer into nanopb-0.4.9.1" 8 | 9 | # the nanopb tool seems to require that the .options file be in the current directory! 10 | cd protobufs 11 | ../../nanopb-0.4.9.1/generator/protoc "--nanopb_out=-S.cpp -v:../lib/mesh/generated/" -I=../protobufs meshtastic/*.proto --experimental_allow_proto3_optional 12 | 13 | #echo "Regenerating protobuf documentation - if you see an error message" 14 | #echo "you can ignore it unless doing a new protobuf release to github." 15 | #bin/regen-docs.sh 16 | -------------------------------------------------------------------------------- /boards/ESP-4848S040.json: -------------------------------------------------------------------------------- 1 | { 2 | "build": { 3 | "arduino": { 4 | "ldscript": "esp32s3_out.ld", 5 | "memory_type": "qio_opi", 6 | "partitions": "default_16MB.csv" 7 | }, 8 | "core": "esp32", 9 | "extra_flags": [ 10 | "-DBOARD_HAS_PSRAM", 11 | "-DARDUINO_USB_CDC_ON_BOOT=0", 12 | "-DARDUINO_USB_MODE=1", 13 | "-DARDUINO_RUNNING_CORE=1", 14 | "-DARDUINO_EVENT_RUNNING_CORE=0" 15 | ], 16 | "f_cpu": "240000000L", 17 | "f_flash": "80000000L", 18 | "flash_mode": "qio", 19 | "hwids": [["0x1A86", "0x7523"]], 20 | "mcu": "esp32s3", 21 | "variant": "esp32s3" 22 | }, 23 | "connectivity": ["wifi", "bluetooth"], 24 | "debug": { 25 | "default_tool": "esp-builtin", 26 | "onboard_tools": ["esp-builtin"], 27 | "openocd_target": "esp32s3.cfg" 28 | }, 29 | "frameworks": ["arduino", "espidf"], 30 | "name": "ESP32-4848S040 (16 MB FLASH, 8 MB PSRAM)", 31 | "upload": { 32 | "flash_size": "16MB", 33 | "maximum_ram_size": 327680, 34 | "maximum_size": 16777216, 35 | "require_upload_port": true, 36 | "speed": 921600 37 | }, 38 | "monitor": { 39 | "speed": 115200 40 | }, 41 | "url": "https://vi.aliexpress.com/item/1005006478501734.html", 42 | "vendor": "Caturda" 43 | } 44 | -------------------------------------------------------------------------------- /boards/heltec-wireless-tracker.json: -------------------------------------------------------------------------------- 1 | { 2 | "build": { 3 | "arduino": { 4 | "ldscript": "esp32s3_out.ld", 5 | "partitions": "max_app_8MB.csv" 6 | }, 7 | "core": "esp32", 8 | "extra_flags": [ 9 | "-DARDUINO_USB_CDC_ON_BOOT=1", 10 | "-DARDUINO_USB_MODE=1", 11 | "-DARDUINO_RUNNING_CORE=1", 12 | "-DARDUINO_EVENT_RUNNING_CORE=1" 13 | ], 14 | "f_cpu": "240000000L", 15 | "f_flash": "80000000L", 16 | "flash_mode": "qio", 17 | "hwids": [["0x303A", "0x1001"]], 18 | "mcu": "esp32s3", 19 | "variant": "heltec-wireless-tracker" 20 | }, 21 | "connectivity": ["wifi", "bluetooth", "lora"], 22 | "debug": { 23 | "default_tool": "esp-builtin", 24 | "onboard_tools": ["esp-builtin"], 25 | "openocd_target": "esp32s3.cfg" 26 | }, 27 | "frameworks": ["arduino", "espidf"], 28 | "name": "Heltec Wireless Tracker (8MB Flash)", 29 | "upload": { 30 | "flash_size": "8MB", 31 | "maximum_ram_size": 327680, 32 | "maximum_size": 8388608, 33 | "require_upload_port": true, 34 | "speed": 921600 35 | }, 36 | "monitor": { 37 | "speed" : 115200 38 | }, 39 | "url": "https://heltec.org/project/wireless-tracker/", 40 | "vendor": "Heltec" 41 | } 42 | -------------------------------------------------------------------------------- /boards/lilygo-t-hmi.json: -------------------------------------------------------------------------------- 1 | { 2 | "build": { 3 | "arduino": { 4 | "ldscript": "esp32s3_out.ld", 5 | "memory_type": "qio_opi", 6 | "partitions": "default_16MB.csv" 7 | }, 8 | "core": "esp32", 9 | "extra_flags": [ 10 | "-DBOARD_HAS_PSRAM", 11 | "-DARDUINO_USB_CDC_ON_BOOT=1", 12 | "-DARDUINO_USB_MODE=1", 13 | "-DARDUINO_RUNNING_CORE=1", 14 | "-DARDUINO_EVENT_RUNNING_CORE=0" 15 | ], 16 | "f_cpu": "240000000L", 17 | "f_flash": "80000000L", 18 | "flash_mode": "qio", 19 | "hwids": [["0x303A", "0x1001"]], 20 | "mcu": "esp32s3", 21 | "variant": "esp32s3" 22 | }, 23 | "connectivity": ["wifi", "bluetooth"], 24 | "debug": { 25 | "default_tool": "esp-builtin", 26 | "onboard_tools": ["esp-builtin"], 27 | "openocd_target": "esp32s3.cfg" 28 | }, 29 | "frameworks": ["arduino", "espidf"], 30 | "name": "LILYGO T-HMI (16 MB FLASH, 8 MB PSRAM)", 31 | "upload": { 32 | "flash_size": "16MB", 33 | "maximum_ram_size": 327680, 34 | "maximum_size": 16777216, 35 | "require_upload_port": true, 36 | "speed": 921600 37 | }, 38 | "monitor": { 39 | "speed": 115200 40 | }, 41 | "url": "https://www.lilygo.cc/en-pl/products/t-hmi", 42 | "vendor": "LILYGO" 43 | } 44 | -------------------------------------------------------------------------------- /boards/seeed-sensecap-indicator.json: -------------------------------------------------------------------------------- 1 | { 2 | "build": { 3 | "arduino": { 4 | "ldscript": "esp32s3_out.ld", 5 | "partitions": "default_8MB.csv", 6 | "memory_type": "qio_opi" 7 | }, 8 | "core": "esp32", 9 | "extra_flags": [ 10 | "-DBOARD_HAS_PSRAM", 11 | "-DARDUINO_USB_CDC_ON_BOOT=0", 12 | "-DARDUINO_USB_MODE=1", 13 | "-DARDUINO_RUNNING_CORE=1", 14 | "-DARDUINO_EVENT_RUNNING_CORE=1" 15 | ], 16 | "f_cpu": "240000000L", 17 | "f_flash": "80000000L", 18 | "flash_mode": "qio", 19 | "hwids": [["0x1A86", "0x7523"]], 20 | "mcu": "esp32s3", 21 | "variant": "esp32s3" 22 | }, 23 | "connectivity": ["wifi", "bluetooth", "lora"], 24 | "debug": { 25 | "default_tool": "esp-builtin", 26 | "onboard_tools": ["esp-builtin"], 27 | "openocd_target": "esp32s3.cfg" 28 | }, 29 | "frameworks": ["arduino"], 30 | "name": "Seeed Studio SenseCAP Indicator", 31 | "upload": { 32 | "flash_size": "8MB", 33 | "maximum_ram_size": 327680, 34 | "maximum_size": 8388608, 35 | "require_upload_port": true, 36 | "use_1200bps_touch": true, 37 | "wait_for_upload_port": true, 38 | "speed": 921600 39 | }, 40 | "url": "https://www.seeedstudio.com/Indicator-for-Meshtastic.html", 41 | "vendor": "Seeed Studio" 42 | } 43 | -------------------------------------------------------------------------------- /boards/t-deck.json: -------------------------------------------------------------------------------- 1 | { 2 | "build": { 3 | "arduino": { 4 | "ldscript": "esp32s3_out.ld", 5 | "memory_type": "qio_opi", 6 | "partitions": "default_16MB.csv" 7 | }, 8 | "core": "esp32", 9 | "extra_flags": [ 10 | "-DBOARD_HAS_PSRAM", 11 | "-DARDUINO_USB_CDC_ON_BOOT=1", 12 | "-DARDUINO_USB_MODE=1", 13 | "-DARDUINO_RUNNING_CORE=1", 14 | "-DARDUINO_EVENT_RUNNING_CORE=0" 15 | ], 16 | "f_cpu": "240000000L", 17 | "f_flash": "80000000L", 18 | "flash_mode": "qio", 19 | "hwids": [["0x303A", "0x1001"]], 20 | "mcu": "esp32s3", 21 | "variant": "t-deck" 22 | }, 23 | "connectivity": ["wifi", "bluetooth", "lora"], 24 | "debug": { 25 | "default_tool": "esp-builtin", 26 | "onboard_tools": ["esp-builtin"], 27 | "openocd_target": "esp32s3.cfg" 28 | }, 29 | "frameworks": ["arduino", "espidf"], 30 | "name": "LilyGO T-Deck (16 MB FLASH, 8 MB PSRAM)", 31 | "upload": { 32 | "flash_size": "16MB", 33 | "maximum_ram_size": 327680, 34 | "maximum_size": 16777216, 35 | "require_upload_port": true, 36 | "speed": 921600 37 | }, 38 | "monitor": { 39 | "speed" : 115200 40 | }, 41 | "url": "https://www.lilygo.cc/en-pl/products/t-deck", 42 | "vendor": "LilyGO" 43 | } 44 | -------------------------------------------------------------------------------- /boards/t-watch-s3.json: -------------------------------------------------------------------------------- 1 | { 2 | "build": { 3 | "arduino": { 4 | "ldscript": "esp32s3_out.ld", 5 | "memory_type": "qio_opi", 6 | "partitions": "default_16MB.csv" 7 | }, 8 | "core": "esp32", 9 | "extra_flags": [ 10 | "-DBOARD_HAS_PSRAM", 11 | "-DARDUINO_USB_CDC_ON_BOOT=1", 12 | "-DARDUINO_USB_MODE=1", 13 | "-DARDUINO_RUNNING_CORE=1", 14 | "-DARDUINO_EVENT_RUNNING_CORE=1" 15 | ], 16 | "f_cpu": "240000000L", 17 | "f_flash": "80000000L", 18 | "flash_mode": "qio", 19 | "hwids": [["0x303A", "0x0002"]], 20 | "mcu": "esp32s3", 21 | "variant": "t-watch-s3" 22 | }, 23 | "connectivity": ["wifi", "bluetooth", "lora"], 24 | "debug": { 25 | "default_tool": "esp-builtin", 26 | "onboard_tools": ["esp-builtin"], 27 | "openocd_target": "esp32s3.cfg" 28 | }, 29 | "frameworks": ["arduino"], 30 | "name": "LilyGo T-Watch S3 (16M Flash, 8M PSRAM)", 31 | "upload": { 32 | "flash_size": "16MB", 33 | "maximum_ram_size": 327680, 34 | "maximum_size": 16777216, 35 | "require_upload_port": true, 36 | "speed": 921600 37 | }, 38 | "monitor": { 39 | "speed" : 115200 40 | }, 41 | "url": "https://www.lilygo.cc/en-pl/products/t-watch-s3", 42 | "vendor": "LilyGo" 43 | } 44 | -------------------------------------------------------------------------------- /boards/wt32-sc01-plus.json: -------------------------------------------------------------------------------- 1 | { 2 | "build": { 3 | "arduino": { 4 | "ldscript": "esp32s3_out.ld", 5 | "memory_type": "qio_qspi", 6 | "partitions": "default_16MB.csv" 7 | }, 8 | "core": "esp32", 9 | "extra_flags": [ 10 | "-DBOARD_HAS_PSRAM", 11 | "-DARDUINO_USB_CDC_ON_BOOT=1", 12 | "-DARDUINO_USB_MODE=1", 13 | "-DARDUINO_RUNNING_CORE=1", 14 | "-DARDUINO_EVENT_RUNNING_CORE=1" 15 | ], 16 | "f_cpu": "240000000L", 17 | "f_flash": "80000000L", 18 | "flash_mode": "qio", 19 | "hwids": [["0x303A", "0x80D0"]], 20 | "mcu": "esp32s3", 21 | "variant": "wt32-sc01-plus" 22 | }, 23 | "connectivity": ["wifi", "bluetooth"], 24 | "debug": { 25 | "default_tool": "esp-builtin", 26 | "onboard_tools": ["esp-builtin"], 27 | "openocd_target": "esp32s3.cfg" 28 | }, 29 | "frameworks": ["arduino", "espidf"], 30 | "name": "WT32-SC01 Plus (16 MB Flash, 8 MB PSRAM)", 31 | "upload": { 32 | "flash_size": "16MB", 33 | "maximum_ram_size": 327680, 34 | "maximum_size": 16777216, 35 | "require_upload_port": true, 36 | "speed": 921600 37 | }, 38 | "monitor": { 39 | "speed" : 115200 40 | }, 41 | "url": "http://en.wireless-tag.com/product-item-26.html", 42 | "vendor": "wireless-tag" 43 | } 44 | -------------------------------------------------------------------------------- /docs/ESP32-4848S040.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/meshtastic/standalone-ui/c6068bc6d6418c3ac42976c99e8d56c3e93424d5/docs/ESP32-4848S040.jpg -------------------------------------------------------------------------------- /docs/T-HMI.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/meshtastic/standalone-ui/c6068bc6d6418c3ac42976c99e8d56c3e93424d5/docs/T-HMI.jpg -------------------------------------------------------------------------------- /docs/WT32-SC01-Plus.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/meshtastic/standalone-ui/c6068bc6d6418c3ac42976c99e8d56c3e93424d5/docs/WT32-SC01-Plus.jpg -------------------------------------------------------------------------------- /docs/native-mui.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/meshtastic/standalone-ui/c6068bc6d6418c3ac42976c99e8d56c3e93424d5/docs/native-mui.png -------------------------------------------------------------------------------- /etc/MUI.desktop: -------------------------------------------------------------------------------- 1 | [Desktop Entry] 2 | Version=2.6 3 | Type=Application 4 | Name=MUI 5 | Comment=Meshtastic UI Client 6 | Exec=native-mui 7 | Icon=MUI.png 8 | Terminal=false 9 | Type=Application 10 | Categories=Network,Utility 11 | 12 | -------------------------------------------------------------------------------- /etc/MUI.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/meshtastic/standalone-ui/c6068bc6d6418c3ac42976c99e8d56c3e93424d5/etc/MUI.png -------------------------------------------------------------------------------- /lib/log/Log.cpp: -------------------------------------------------------------------------------- 1 | #include "Log.h" 2 | #include "stdarg.h" 3 | #include 4 | #include 5 | 6 | #define CL_LIGHTRED "\033[01;31m" //!< Light red. 7 | #define CL_RED "\033[22;31m" //!< Red. 8 | #define CL_YELLOW "\033[01;33m" //!< Yellow. 9 | #define CL_WHITE "\033[01;37m" //!< White. 10 | #define CL_DARKGRAY "\033[01;30m" //!< Dark gray. 11 | #define NORMAL "\x1B[0m" //!< Normal. 12 | 13 | #if defined(ARCH_ESP32) 14 | // simply forward all logs into the esp log forwarder 15 | #define VA_START(LVL, ARG, FMT) \ 16 | esp_log_write(LVL, "TFT", "%s | %s %d [%s] ", lvl[LVL], getTime(), int(millis() / 1000), "TFT"); \ 17 | va_start(ARG, FMT) 18 | #define LOG_FWD(LVL, TAG, FMT, ARG) esp_log_writev(LVL, TAG, FMT, ARG) 19 | #define LOG_CRLF(LVL, TAG) esp_log_write(LVL, TAG, "\n") 20 | #elif defined(ARCH_PORTDUINO) 21 | // #define _GNU_SOURCE 22 | #include 23 | #define VA_START(LVL, ARG, FMT) \ 24 | pthread_getname_np(pthread_self(), threadname, sizeof(threadname)); \ 25 | printf("%s | %s %d [%s] ", lvl[LVL], getTime(), int(millis() / 1000), threadname); \ 26 | va_start(ARG, FMT) 27 | #define LOG_FWD(LVL, TAG, FMT, ARG) vprintf(FMT, ARG) 28 | #define LOG_CRLF(LVL, TAG) printf(NORMAL "\n") 29 | #define esp_log_level_set(...) 30 | #endif 31 | 32 | extern "C" unsigned long millis(void); 33 | 34 | static time_t rawtime; 35 | struct tm *timeinfo; 36 | char buffer[20]; 37 | char threadname[16]; 38 | const char *lvl[] = {"NONE", CL_RED "ERROR", CL_YELLOW "WARN ", CL_WHITE "INFO ", "DEBUG", CL_DARKGRAY "TRACE"}; 39 | Log logger; 40 | 41 | char *getTime() 42 | { 43 | time(&rawtime); 44 | timeinfo = localtime(&rawtime); 45 | strftime(buffer, sizeof(buffer), "%H:%M:%S ", timeinfo); 46 | return buffer; 47 | } 48 | 49 | void Log::setDebugLevel(esp_log_level_t lvl) 50 | { 51 | esp_log_level_set("*", lvl); 52 | } 53 | 54 | void Log::log_debug(const char *format, ...) 55 | { 56 | va_list arg; 57 | VA_START(ESP_LOG_DEBUG, arg, format); 58 | LOG_FWD(ESP_LOG_DEBUG, "TFT", format, arg); 59 | va_end(arg); 60 | LOG_CRLF(ESP_LOG_DEBUG, "TFT"); 61 | } 62 | 63 | void Log::log_info(const char *format, ...) 64 | { 65 | va_list arg; 66 | VA_START(ESP_LOG_INFO, arg, format); 67 | LOG_FWD(ESP_LOG_INFO, "TFT", format, arg); 68 | va_end(arg); 69 | LOG_CRLF(ESP_LOG_INFO, "TFT"); 70 | } 71 | 72 | void Log::log_warn(const char *format, ...) 73 | { 74 | va_list arg; 75 | VA_START(ESP_LOG_WARN, arg, format); 76 | LOG_FWD(ESP_LOG_WARN, "TFT", format, arg); 77 | va_end(arg); 78 | LOG_CRLF(ESP_LOG_WARN, "TFT"); 79 | } 80 | 81 | void Log::log_error(const char *format, ...) 82 | { 83 | va_list arg; 84 | VA_START(ESP_LOG_ERROR, arg, format); 85 | LOG_FWD(ESP_LOG_ERROR, "TFT", format, arg); 86 | va_end(arg); 87 | LOG_CRLF(ESP_LOG_ERROR, "TFT"); 88 | } 89 | 90 | void Log::log_crit(const char *format, ...) 91 | { 92 | va_list arg; 93 | VA_START(ESP_LOG_ERROR, arg, format); 94 | LOG_FWD(ESP_LOG_ERROR, "TFT", format, arg); 95 | va_end(arg); 96 | LOG_CRLF(ESP_LOG_ERROR, "TFT"); 97 | } 98 | 99 | void Log::log_trace(const char *format, ...) 100 | { 101 | va_list arg; 102 | VA_START(ESP_LOG_VERBOSE, arg, format); 103 | LOG_FWD(ESP_LOG_VERBOSE, "TFT", format, arg); 104 | va_end(arg); 105 | LOG_CRLF(ESP_LOG_VERBOSE, "TFT"); 106 | } 107 | -------------------------------------------------------------------------------- /lib/log/Log.h: -------------------------------------------------------------------------------- 1 | #include "util/ILog.h" 2 | 3 | #if defined(ARCH_ESP32) 4 | #include "esp_log.h" 5 | #elif defined(ARCH_PORTDUINO) 6 | typedef enum { ESP_LOG_NONE, ESP_LOG_ERROR, ESP_LOG_WARN, ESP_LOG_INFO, ESP_LOG_DEBUG, ESP_LOG_VERBOSE } esp_log_level_t; 7 | #endif 8 | 9 | class Log : public ILog 10 | { 11 | public: 12 | Log() : ILog(this) { setDebugLevel(ESP_LOG_VERBOSE); } 13 | void setDebugLevel(esp_log_level_t lvl); 14 | 15 | protected: 16 | virtual void log_debug(const char *format, ...) override; 17 | virtual void log_info(const char *format, ...) override; 18 | virtual void log_warn(const char *format, ...) override; 19 | virtual void log_error(const char *format, ...) override; 20 | virtual void log_crit(const char *format, ...) override; 21 | virtual void log_trace(const char *format, ...) override; 22 | }; 23 | 24 | extern Log logger; 25 | -------------------------------------------------------------------------------- /lib/mesh/external_callbacks.cpp: -------------------------------------------------------------------------------- 1 | #include "mesh-pb-constants.h" 2 | 3 | #include 4 | #include 5 | #include 6 | 7 | bool meshtastic_DeviceState_callback(pb_istream_t *istream, pb_ostream_t *ostream, const pb_field_iter_t *field) 8 | { 9 | if (ostream) { 10 | std::vector *vec = (std::vector *)field->pData; 11 | for (auto item : *vec) { 12 | if (!pb_encode_tag_for_field(ostream, field)) 13 | return false; 14 | pb_encode_submessage(ostream, meshtastic_NodeInfoLite_fields, &item); 15 | } 16 | } 17 | if (istream) { 18 | meshtastic_NodeInfoLite node; // this gets good data 19 | std::vector *vec = (std::vector *)field->pData; 20 | 21 | if (istream->bytes_left && pb_decode(istream, meshtastic_NodeInfoLite_fields, &node)) 22 | vec->push_back(node); 23 | } 24 | return true; 25 | } 26 | -------------------------------------------------------------------------------- /lib/mesh/generated/meshtastic/admin.pb.cpp: -------------------------------------------------------------------------------- 1 | /* Automatically generated nanopb constant definitions */ 2 | /* Generated by nanopb-1.0.0-dev */ 3 | 4 | #include "meshtastic/admin.pb.h" 5 | #if PB_PROTO_HEADER_VERSION != 40 6 | #error Regenerate this file with the current version of nanopb generator. 7 | #endif 8 | 9 | PB_BIND(meshtastic_AdminMessage, meshtastic_AdminMessage, 2) 10 | 11 | PB_BIND(meshtastic_HamParameters, meshtastic_HamParameters, AUTO) 12 | 13 | PB_BIND(meshtastic_NodeRemoteHardwarePinsResponse, meshtastic_NodeRemoteHardwarePinsResponse, 2) 14 | 15 | PB_BIND(meshtastic_SharedContact, meshtastic_SharedContact, AUTO) 16 | -------------------------------------------------------------------------------- /lib/mesh/generated/meshtastic/apponly.pb.cpp: -------------------------------------------------------------------------------- 1 | /* Automatically generated nanopb constant definitions */ 2 | /* Generated by nanopb-1.0.0-dev */ 3 | 4 | #include "meshtastic/apponly.pb.h" 5 | #if PB_PROTO_HEADER_VERSION != 40 6 | #error Regenerate this file with the current version of nanopb generator. 7 | #endif 8 | 9 | PB_BIND(meshtastic_ChannelSet, meshtastic_ChannelSet, 2) 10 | -------------------------------------------------------------------------------- /lib/mesh/generated/meshtastic/apponly.pb.h: -------------------------------------------------------------------------------- 1 | /* Automatically generated nanopb header */ 2 | /* Generated by nanopb-1.0.0-dev */ 3 | 4 | #ifndef PB_MESHTASTIC_MESHTASTIC_APPONLY_PB_H_INCLUDED 5 | #define PB_MESHTASTIC_MESHTASTIC_APPONLY_PB_H_INCLUDED 6 | #include "meshtastic/channel.pb.h" 7 | #include "meshtastic/config.pb.h" 8 | #include 9 | 10 | #if PB_PROTO_HEADER_VERSION != 40 11 | #error Regenerate this file with the current version of nanopb generator. 12 | #endif 13 | 14 | /* Struct definitions */ 15 | /* This is the most compact possible representation for a set of channels. 16 | It includes only one PRIMARY channel (which must be first) and 17 | any SECONDARY channels. 18 | No DISABLED channels are included. 19 | This abstraction is used only on the the 'app side' of the world (ie python, javascript and android etc) to show a group of 20 | Channels as a (long) URL */ 21 | typedef struct _meshtastic_ChannelSet { 22 | /* Channel list with settings */ 23 | pb_size_t settings_count; 24 | meshtastic_ChannelSettings settings[8]; 25 | /* LoRa config */ 26 | bool has_lora_config; 27 | meshtastic_Config_LoRaConfig lora_config; 28 | } meshtastic_ChannelSet; 29 | 30 | #ifdef __cplusplus 31 | extern "C" { 32 | #endif 33 | 34 | /* Initializer values for message structs */ 35 | #define meshtastic_ChannelSet_init_default \ 36 | { \ 37 | 0, {meshtastic_ChannelSettings_init_default, meshtastic_ChannelSettings_init_default, \ 38 | meshtastic_ChannelSettings_init_default, meshtastic_ChannelSettings_init_default, \ 39 | meshtastic_ChannelSettings_init_default, meshtastic_ChannelSettings_init_default, \ 40 | meshtastic_ChannelSettings_init_default, meshtastic_ChannelSettings_init_default}, \ 41 | false, meshtastic_Config_LoRaConfig_init_default \ 42 | } 43 | #define meshtastic_ChannelSet_init_zero \ 44 | { \ 45 | 0, {meshtastic_ChannelSettings_init_zero, meshtastic_ChannelSettings_init_zero, meshtastic_ChannelSettings_init_zero, \ 46 | meshtastic_ChannelSettings_init_zero, meshtastic_ChannelSettings_init_zero, meshtastic_ChannelSettings_init_zero, \ 47 | meshtastic_ChannelSettings_init_zero, meshtastic_ChannelSettings_init_zero}, \ 48 | false, meshtastic_Config_LoRaConfig_init_zero \ 49 | } 50 | 51 | /* Field tags (for use in manual encoding/decoding) */ 52 | #define meshtastic_ChannelSet_settings_tag 1 53 | #define meshtastic_ChannelSet_lora_config_tag 2 54 | 55 | /* Struct field encoding specification for nanopb */ 56 | #define meshtastic_ChannelSet_FIELDLIST(X, a) \ 57 | X(a, STATIC, REPEATED, MESSAGE, settings, 1) \ 58 | X(a, STATIC, OPTIONAL, MESSAGE, lora_config, 2) 59 | #define meshtastic_ChannelSet_CALLBACK NULL 60 | #define meshtastic_ChannelSet_DEFAULT NULL 61 | #define meshtastic_ChannelSet_settings_MSGTYPE meshtastic_ChannelSettings 62 | #define meshtastic_ChannelSet_lora_config_MSGTYPE meshtastic_Config_LoRaConfig 63 | 64 | extern const pb_msgdesc_t meshtastic_ChannelSet_msg; 65 | 66 | /* Defines for backwards compatibility with code written before nanopb-0.4.0 */ 67 | #define meshtastic_ChannelSet_fields &meshtastic_ChannelSet_msg 68 | 69 | /* Maximum encoded size of messages (where known) */ 70 | #define MESHTASTIC_MESHTASTIC_APPONLY_PB_H_MAX_SIZE meshtastic_ChannelSet_size 71 | #define meshtastic_ChannelSet_size 679 72 | 73 | #ifdef __cplusplus 74 | } /* extern "C" */ 75 | #endif 76 | 77 | #endif 78 | -------------------------------------------------------------------------------- /lib/mesh/generated/meshtastic/atak.pb.cpp: -------------------------------------------------------------------------------- 1 | /* Automatically generated nanopb constant definitions */ 2 | /* Generated by nanopb-1.0.0-dev */ 3 | 4 | #include "meshtastic/atak.pb.h" 5 | #if PB_PROTO_HEADER_VERSION != 40 6 | #error Regenerate this file with the current version of nanopb generator. 7 | #endif 8 | 9 | PB_BIND(meshtastic_TAKPacket, meshtastic_TAKPacket, 2) 10 | 11 | PB_BIND(meshtastic_GeoChat, meshtastic_GeoChat, 2) 12 | 13 | PB_BIND(meshtastic_Group, meshtastic_Group, AUTO) 14 | 15 | PB_BIND(meshtastic_Status, meshtastic_Status, AUTO) 16 | 17 | PB_BIND(meshtastic_Contact, meshtastic_Contact, AUTO) 18 | 19 | PB_BIND(meshtastic_PLI, meshtastic_PLI, AUTO) 20 | -------------------------------------------------------------------------------- /lib/mesh/generated/meshtastic/cannedmessages.pb.cpp: -------------------------------------------------------------------------------- 1 | /* Automatically generated nanopb constant definitions */ 2 | /* Generated by nanopb-1.0.0-dev */ 3 | 4 | #include "meshtastic/cannedmessages.pb.h" 5 | #if PB_PROTO_HEADER_VERSION != 40 6 | #error Regenerate this file with the current version of nanopb generator. 7 | #endif 8 | 9 | PB_BIND(meshtastic_CannedMessageModuleConfig, meshtastic_CannedMessageModuleConfig, AUTO) 10 | -------------------------------------------------------------------------------- /lib/mesh/generated/meshtastic/cannedmessages.pb.h: -------------------------------------------------------------------------------- 1 | /* Automatically generated nanopb header */ 2 | /* Generated by nanopb-1.0.0-dev */ 3 | 4 | #ifndef PB_MESHTASTIC_MESHTASTIC_CANNEDMESSAGES_PB_H_INCLUDED 5 | #define PB_MESHTASTIC_MESHTASTIC_CANNEDMESSAGES_PB_H_INCLUDED 6 | #include 7 | 8 | #if PB_PROTO_HEADER_VERSION != 40 9 | #error Regenerate this file with the current version of nanopb generator. 10 | #endif 11 | 12 | /* Struct definitions */ 13 | /* Canned message module configuration. */ 14 | typedef struct _meshtastic_CannedMessageModuleConfig { 15 | /* Predefined messages for canned message module separated by '|' characters. */ 16 | char messages[201]; 17 | } meshtastic_CannedMessageModuleConfig; 18 | 19 | #ifdef __cplusplus 20 | extern "C" { 21 | #endif 22 | 23 | /* Initializer values for message structs */ 24 | #define meshtastic_CannedMessageModuleConfig_init_default \ 25 | { \ 26 | "" \ 27 | } 28 | #define meshtastic_CannedMessageModuleConfig_init_zero \ 29 | { \ 30 | "" \ 31 | } 32 | 33 | /* Field tags (for use in manual encoding/decoding) */ 34 | #define meshtastic_CannedMessageModuleConfig_messages_tag 1 35 | 36 | /* Struct field encoding specification for nanopb */ 37 | #define meshtastic_CannedMessageModuleConfig_FIELDLIST(X, a) X(a, STATIC, SINGULAR, STRING, messages, 1) 38 | #define meshtastic_CannedMessageModuleConfig_CALLBACK NULL 39 | #define meshtastic_CannedMessageModuleConfig_DEFAULT NULL 40 | 41 | extern const pb_msgdesc_t meshtastic_CannedMessageModuleConfig_msg; 42 | 43 | /* Defines for backwards compatibility with code written before nanopb-0.4.0 */ 44 | #define meshtastic_CannedMessageModuleConfig_fields &meshtastic_CannedMessageModuleConfig_msg 45 | 46 | /* Maximum encoded size of messages (where known) */ 47 | #define MESHTASTIC_MESHTASTIC_CANNEDMESSAGES_PB_H_MAX_SIZE meshtastic_CannedMessageModuleConfig_size 48 | #define meshtastic_CannedMessageModuleConfig_size 203 49 | 50 | #ifdef __cplusplus 51 | } /* extern "C" */ 52 | #endif 53 | 54 | #endif 55 | -------------------------------------------------------------------------------- /lib/mesh/generated/meshtastic/channel.pb.cpp: -------------------------------------------------------------------------------- 1 | /* Automatically generated nanopb constant definitions */ 2 | /* Generated by nanopb-1.0.0-dev */ 3 | 4 | #include "meshtastic/channel.pb.h" 5 | #if PB_PROTO_HEADER_VERSION != 40 6 | #error Regenerate this file with the current version of nanopb generator. 7 | #endif 8 | 9 | PB_BIND(meshtastic_ChannelSettings, meshtastic_ChannelSettings, AUTO) 10 | 11 | PB_BIND(meshtastic_ModuleSettings, meshtastic_ModuleSettings, AUTO) 12 | 13 | PB_BIND(meshtastic_Channel, meshtastic_Channel, AUTO) 14 | -------------------------------------------------------------------------------- /lib/mesh/generated/meshtastic/channel.pb.h: -------------------------------------------------------------------------------- 1 | /* Automatically generated nanopb header */ 2 | /* Generated by nanopb-1.0.0-dev */ 3 | 4 | #ifndef PB_MESHTASTIC_MESHTASTIC_CHANNEL_PB_H_INCLUDED 5 | #define PB_MESHTASTIC_MESHTASTIC_CHANNEL_PB_H_INCLUDED 6 | #include 7 | 8 | #if PB_PROTO_HEADER_VERSION != 40 9 | #error Regenerate this file with the current version of nanopb generator. 10 | #endif 11 | 12 | /* Enum definitions */ 13 | /* How this channel is being used (or not). 14 | Note: this field is an enum to give us options for the future. 15 | In particular, someday we might make a 'SCANNING' option. 16 | SCANNING channels could have different frequencies and the radio would 17 | occasionally check that freq to see if anything is being transmitted. 18 | For devices that have multiple physical radios attached, we could keep multiple PRIMARY/SCANNING channels active at once to allow 19 | cross band routing as needed. 20 | If a device has only a single radio (the common case) only one channel can be PRIMARY at a time 21 | (but any number of SECONDARY channels can't be sent received on that common frequency) */ 22 | typedef enum _meshtastic_Channel_Role { 23 | /* This channel is not in use right now */ 24 | meshtastic_Channel_Role_DISABLED = 0, 25 | /* This channel is used to set the frequency for the radio - all other enabled channels must be SECONDARY */ 26 | meshtastic_Channel_Role_PRIMARY = 1, 27 | /* Secondary channels are only used for encryption/decryption/authentication purposes. 28 | Their radio settings (freq etc) are ignored, only psk is used. */ 29 | meshtastic_Channel_Role_SECONDARY = 2 30 | } meshtastic_Channel_Role; 31 | 32 | /* Struct definitions */ 33 | /* This message is specifically for modules to store per-channel configuration data. */ 34 | typedef struct _meshtastic_ModuleSettings { 35 | /* Bits of precision for the location sent in position packets. */ 36 | uint32_t position_precision; 37 | /* Controls whether or not the phone / clients should mute the current channel 38 | Useful for noisy public channels you don't necessarily want to disable */ 39 | bool is_client_muted; 40 | } meshtastic_ModuleSettings; 41 | 42 | typedef PB_BYTES_ARRAY_T(32) meshtastic_ChannelSettings_psk_t; 43 | /* This information can be encoded as a QRcode/url so that other users can configure 44 | their radio to join the same channel. 45 | A note about how channel names are shown to users: channelname-X 46 | poundsymbol is a prefix used to indicate this is a channel name (idea from @professr). 47 | Where X is a letter from A-Z (base 26) representing a hash of the PSK for this 48 | channel - so that if the user changes anything about the channel (which does 49 | force a new PSK) this letter will also change. Thus preventing user confusion if 50 | two friends try to type in a channel name of "BobsChan" and then can't talk 51 | because their PSKs will be different. 52 | The PSK is hashed into this letter by "0x41 + [xor all bytes of the psk ] modulo 26" 53 | This also allows the option of someday if people have the PSK off (zero), the 54 | users COULD type in a channel name and be able to talk. 55 | FIXME: Add description of multi-channel support and how primary vs secondary channels are used. 56 | FIXME: explain how apps use channels for security. 57 | explain how remote settings and remote gpio are managed as an example */ 58 | typedef struct _meshtastic_ChannelSettings { 59 | /* Deprecated in favor of LoraConfig.channel_num */ 60 | uint32_t channel_num; 61 | /* A simple pre-shared key for now for crypto. 62 | Must be either 0 bytes (no crypto), 16 bytes (AES128), or 32 bytes (AES256). 63 | A special shorthand is used for 1 byte long psks. 64 | These psks should be treated as only minimally secure, 65 | because they are listed in this source code. 66 | Those bytes are mapped using the following scheme: 67 | `0` = No crypto 68 | `1` = The special "default" channel key: {0xd4, 0xf1, 0xbb, 0x3a, 0x20, 0x29, 0x07, 0x59, 0xf0, 0xbc, 0xff, 0xab, 0xcf, 0x4e, 69 | 0x69, 0x01} `2` through 10 = The default channel key, except with 1 through 9 added to the last byte. Shown to user as simple1 70 | through 10 */ 71 | meshtastic_ChannelSettings_psk_t psk; 72 | /* A SHORT name that will be packed into the URL. 73 | Less than 12 bytes. 74 | Something for end users to call the channel 75 | If this is the empty string it is assumed that this channel 76 | is the special (minimally secure) "Default"channel. 77 | In user interfaces it should be rendered as a local language translation of "X". 78 | For channel_num hashing empty string will be treated as "X". 79 | Where "X" is selected based on the English words listed above for ModemPreset */ 80 | char name[12]; 81 | /* Used to construct a globally unique channel ID. 82 | The full globally unique ID will be: "name.id" where ID is shown as base36. 83 | Assuming that the number of meshtastic users is below 20K (true for a long time) 84 | the chance of this 64 bit random number colliding with anyone else is super low. 85 | And the penalty for collision is low as well, it just means that anyone trying to decrypt channel messages might need to 86 | try multiple candidate channels. 87 | Any time a non wire compatible change is made to a channel, this field should be regenerated. 88 | There are a small number of 'special' globally known (and fairly) insecure standard channels. 89 | Those channels do not have a numeric id included in the settings, but instead it is pulled from 90 | a table of well known IDs. 91 | (see Well Known Channels FIXME) */ 92 | uint32_t id; 93 | /* If true, messages on the mesh will be sent to the *public* internet by any gateway ndoe */ 94 | bool uplink_enabled; 95 | /* If true, messages seen on the internet will be forwarded to the local mesh. */ 96 | bool downlink_enabled; 97 | /* Per-channel module settings. */ 98 | bool has_module_settings; 99 | meshtastic_ModuleSettings module_settings; 100 | } meshtastic_ChannelSettings; 101 | 102 | /* A pair of a channel number, mode and the (sharable) settings for that channel */ 103 | typedef struct _meshtastic_Channel { 104 | /* The index of this channel in the channel table (from 0 to MAX_NUM_CHANNELS-1) 105 | (Someday - not currently implemented) An index of -1 could be used to mean "set by name", 106 | in which case the target node will find and set the channel by settings.name. */ 107 | int8_t index; 108 | /* The new settings, or NULL to disable that channel */ 109 | bool has_settings; 110 | meshtastic_ChannelSettings settings; 111 | /* TODO: REPLACE */ 112 | meshtastic_Channel_Role role; 113 | } meshtastic_Channel; 114 | 115 | #ifdef __cplusplus 116 | extern "C" { 117 | #endif 118 | 119 | /* Helper constants for enums */ 120 | #define _meshtastic_Channel_Role_MIN meshtastic_Channel_Role_DISABLED 121 | #define _meshtastic_Channel_Role_MAX meshtastic_Channel_Role_SECONDARY 122 | #define _meshtastic_Channel_Role_ARRAYSIZE ((meshtastic_Channel_Role)(meshtastic_Channel_Role_SECONDARY + 1)) 123 | 124 | #define meshtastic_Channel_role_ENUMTYPE meshtastic_Channel_Role 125 | 126 | /* Initializer values for message structs */ 127 | #define meshtastic_ChannelSettings_init_default \ 128 | { \ 129 | 0, {0, {0}}, "", 0, 0, 0, false, meshtastic_ModuleSettings_init_default \ 130 | } 131 | #define meshtastic_ModuleSettings_init_default \ 132 | { \ 133 | 0, 0 \ 134 | } 135 | #define meshtastic_Channel_init_default \ 136 | { \ 137 | 0, false, meshtastic_ChannelSettings_init_default, _meshtastic_Channel_Role_MIN \ 138 | } 139 | #define meshtastic_ChannelSettings_init_zero \ 140 | { \ 141 | 0, {0, {0}}, "", 0, 0, 0, false, meshtastic_ModuleSettings_init_zero \ 142 | } 143 | #define meshtastic_ModuleSettings_init_zero \ 144 | { \ 145 | 0, 0 \ 146 | } 147 | #define meshtastic_Channel_init_zero \ 148 | { \ 149 | 0, false, meshtastic_ChannelSettings_init_zero, _meshtastic_Channel_Role_MIN \ 150 | } 151 | 152 | /* Field tags (for use in manual encoding/decoding) */ 153 | #define meshtastic_ModuleSettings_position_precision_tag 1 154 | #define meshtastic_ModuleSettings_is_client_muted_tag 2 155 | #define meshtastic_ChannelSettings_channel_num_tag 1 156 | #define meshtastic_ChannelSettings_psk_tag 2 157 | #define meshtastic_ChannelSettings_name_tag 3 158 | #define meshtastic_ChannelSettings_id_tag 4 159 | #define meshtastic_ChannelSettings_uplink_enabled_tag 5 160 | #define meshtastic_ChannelSettings_downlink_enabled_tag 6 161 | #define meshtastic_ChannelSettings_module_settings_tag 7 162 | #define meshtastic_Channel_index_tag 1 163 | #define meshtastic_Channel_settings_tag 2 164 | #define meshtastic_Channel_role_tag 3 165 | 166 | /* Struct field encoding specification for nanopb */ 167 | #define meshtastic_ChannelSettings_FIELDLIST(X, a) \ 168 | X(a, STATIC, SINGULAR, UINT32, channel_num, 1) \ 169 | X(a, STATIC, SINGULAR, BYTES, psk, 2) \ 170 | X(a, STATIC, SINGULAR, STRING, name, 3) \ 171 | X(a, STATIC, SINGULAR, FIXED32, id, 4) \ 172 | X(a, STATIC, SINGULAR, BOOL, uplink_enabled, 5) \ 173 | X(a, STATIC, SINGULAR, BOOL, downlink_enabled, 6) \ 174 | X(a, STATIC, OPTIONAL, MESSAGE, module_settings, 7) 175 | #define meshtastic_ChannelSettings_CALLBACK NULL 176 | #define meshtastic_ChannelSettings_DEFAULT NULL 177 | #define meshtastic_ChannelSettings_module_settings_MSGTYPE meshtastic_ModuleSettings 178 | 179 | #define meshtastic_ModuleSettings_FIELDLIST(X, a) \ 180 | X(a, STATIC, SINGULAR, UINT32, position_precision, 1) \ 181 | X(a, STATIC, SINGULAR, BOOL, is_client_muted, 2) 182 | #define meshtastic_ModuleSettings_CALLBACK NULL 183 | #define meshtastic_ModuleSettings_DEFAULT NULL 184 | 185 | #define meshtastic_Channel_FIELDLIST(X, a) \ 186 | X(a, STATIC, SINGULAR, INT32, index, 1) \ 187 | X(a, STATIC, OPTIONAL, MESSAGE, settings, 2) \ 188 | X(a, STATIC, SINGULAR, UENUM, role, 3) 189 | #define meshtastic_Channel_CALLBACK NULL 190 | #define meshtastic_Channel_DEFAULT NULL 191 | #define meshtastic_Channel_settings_MSGTYPE meshtastic_ChannelSettings 192 | 193 | extern const pb_msgdesc_t meshtastic_ChannelSettings_msg; 194 | extern const pb_msgdesc_t meshtastic_ModuleSettings_msg; 195 | extern const pb_msgdesc_t meshtastic_Channel_msg; 196 | 197 | /* Defines for backwards compatibility with code written before nanopb-0.4.0 */ 198 | #define meshtastic_ChannelSettings_fields &meshtastic_ChannelSettings_msg 199 | #define meshtastic_ModuleSettings_fields &meshtastic_ModuleSettings_msg 200 | #define meshtastic_Channel_fields &meshtastic_Channel_msg 201 | 202 | /* Maximum encoded size of messages (where known) */ 203 | #define MESHTASTIC_MESHTASTIC_CHANNEL_PB_H_MAX_SIZE meshtastic_Channel_size 204 | #define meshtastic_ChannelSettings_size 72 205 | #define meshtastic_Channel_size 87 206 | #define meshtastic_ModuleSettings_size 8 207 | 208 | #ifdef __cplusplus 209 | } /* extern "C" */ 210 | #endif 211 | 212 | #endif 213 | -------------------------------------------------------------------------------- /lib/mesh/generated/meshtastic/clientonly.pb.cpp: -------------------------------------------------------------------------------- 1 | /* Automatically generated nanopb constant definitions */ 2 | /* Generated by nanopb-1.0.0-dev */ 3 | 4 | #include "meshtastic/clientonly.pb.h" 5 | #if PB_PROTO_HEADER_VERSION != 40 6 | #error Regenerate this file with the current version of nanopb generator. 7 | #endif 8 | 9 | PB_BIND(meshtastic_DeviceProfile, meshtastic_DeviceProfile, 2) 10 | -------------------------------------------------------------------------------- /lib/mesh/generated/meshtastic/clientonly.pb.h: -------------------------------------------------------------------------------- 1 | /* Automatically generated nanopb header */ 2 | /* Generated by nanopb-1.0.0-dev */ 3 | 4 | #ifndef PB_MESHTASTIC_MESHTASTIC_CLIENTONLY_PB_H_INCLUDED 5 | #define PB_MESHTASTIC_MESHTASTIC_CLIENTONLY_PB_H_INCLUDED 6 | #include "meshtastic/localonly.pb.h" 7 | #include "meshtastic/mesh.pb.h" 8 | #include 9 | 10 | #if PB_PROTO_HEADER_VERSION != 40 11 | #error Regenerate this file with the current version of nanopb generator. 12 | #endif 13 | 14 | /* Struct definitions */ 15 | /* This abstraction is used to contain any configuration for provisioning a node on any client. 16 | It is useful for importing and exporting configurations. */ 17 | typedef struct _meshtastic_DeviceProfile { 18 | /* Long name for the node */ 19 | bool has_long_name; 20 | char long_name[40]; 21 | /* Short name of the node */ 22 | bool has_short_name; 23 | char short_name[5]; 24 | /* The url of the channels from our node */ 25 | pb_callback_t channel_url; 26 | /* The Config of the node */ 27 | bool has_config; 28 | meshtastic_LocalConfig config; 29 | /* The ModuleConfig of the node */ 30 | bool has_module_config; 31 | meshtastic_LocalModuleConfig module_config; 32 | /* Fixed position data */ 33 | bool has_fixed_position; 34 | meshtastic_Position fixed_position; 35 | /* Ringtone for ExternalNotification */ 36 | bool has_ringtone; 37 | char ringtone[231]; 38 | /* Predefined messages for CannedMessage */ 39 | bool has_canned_messages; 40 | char canned_messages[201]; 41 | } meshtastic_DeviceProfile; 42 | 43 | #ifdef __cplusplus 44 | extern "C" { 45 | #endif 46 | 47 | /* Initializer values for message structs */ 48 | #define meshtastic_DeviceProfile_init_default \ 49 | { \ 50 | false, "", false, "", {{NULL}, NULL}, false, meshtastic_LocalConfig_init_default, false, \ 51 | meshtastic_LocalModuleConfig_init_default, false, meshtastic_Position_init_default, false, "", false, "" \ 52 | } 53 | #define meshtastic_DeviceProfile_init_zero \ 54 | { \ 55 | false, "", false, "", {{NULL}, NULL}, false, meshtastic_LocalConfig_init_zero, false, \ 56 | meshtastic_LocalModuleConfig_init_zero, false, meshtastic_Position_init_zero, false, "", false, "" \ 57 | } 58 | 59 | /* Field tags (for use in manual encoding/decoding) */ 60 | #define meshtastic_DeviceProfile_long_name_tag 1 61 | #define meshtastic_DeviceProfile_short_name_tag 2 62 | #define meshtastic_DeviceProfile_channel_url_tag 3 63 | #define meshtastic_DeviceProfile_config_tag 4 64 | #define meshtastic_DeviceProfile_module_config_tag 5 65 | #define meshtastic_DeviceProfile_fixed_position_tag 6 66 | #define meshtastic_DeviceProfile_ringtone_tag 7 67 | #define meshtastic_DeviceProfile_canned_messages_tag 8 68 | 69 | /* Struct field encoding specification for nanopb */ 70 | #define meshtastic_DeviceProfile_FIELDLIST(X, a) \ 71 | X(a, STATIC, OPTIONAL, STRING, long_name, 1) \ 72 | X(a, STATIC, OPTIONAL, STRING, short_name, 2) \ 73 | X(a, CALLBACK, OPTIONAL, STRING, channel_url, 3) \ 74 | X(a, STATIC, OPTIONAL, MESSAGE, config, 4) \ 75 | X(a, STATIC, OPTIONAL, MESSAGE, module_config, 5) \ 76 | X(a, STATIC, OPTIONAL, MESSAGE, fixed_position, 6) \ 77 | X(a, STATIC, OPTIONAL, STRING, ringtone, 7) \ 78 | X(a, STATIC, OPTIONAL, STRING, canned_messages, 8) 79 | #define meshtastic_DeviceProfile_CALLBACK pb_default_field_callback 80 | #define meshtastic_DeviceProfile_DEFAULT NULL 81 | #define meshtastic_DeviceProfile_config_MSGTYPE meshtastic_LocalConfig 82 | #define meshtastic_DeviceProfile_module_config_MSGTYPE meshtastic_LocalModuleConfig 83 | #define meshtastic_DeviceProfile_fixed_position_MSGTYPE meshtastic_Position 84 | 85 | extern const pb_msgdesc_t meshtastic_DeviceProfile_msg; 86 | 87 | /* Defines for backwards compatibility with code written before nanopb-0.4.0 */ 88 | #define meshtastic_DeviceProfile_fields &meshtastic_DeviceProfile_msg 89 | 90 | /* Maximum encoded size of messages (where known) */ 91 | /* meshtastic_DeviceProfile_size depends on runtime parameters */ 92 | 93 | #ifdef __cplusplus 94 | } /* extern "C" */ 95 | #endif 96 | 97 | #endif 98 | -------------------------------------------------------------------------------- /lib/mesh/generated/meshtastic/config.pb.cpp: -------------------------------------------------------------------------------- 1 | /* Automatically generated nanopb constant definitions */ 2 | /* Generated by nanopb-1.0.0-dev */ 3 | 4 | #include "meshtastic/config.pb.h" 5 | #if PB_PROTO_HEADER_VERSION != 40 6 | #error Regenerate this file with the current version of nanopb generator. 7 | #endif 8 | 9 | PB_BIND(meshtastic_Config, meshtastic_Config, AUTO) 10 | 11 | PB_BIND(meshtastic_Config_DeviceConfig, meshtastic_Config_DeviceConfig, AUTO) 12 | 13 | PB_BIND(meshtastic_Config_PositionConfig, meshtastic_Config_PositionConfig, AUTO) 14 | 15 | PB_BIND(meshtastic_Config_PowerConfig, meshtastic_Config_PowerConfig, AUTO) 16 | 17 | PB_BIND(meshtastic_Config_NetworkConfig, meshtastic_Config_NetworkConfig, AUTO) 18 | 19 | PB_BIND(meshtastic_Config_NetworkConfig_IpV4Config, meshtastic_Config_NetworkConfig_IpV4Config, AUTO) 20 | 21 | PB_BIND(meshtastic_Config_DisplayConfig, meshtastic_Config_DisplayConfig, AUTO) 22 | 23 | PB_BIND(meshtastic_Config_LoRaConfig, meshtastic_Config_LoRaConfig, 2) 24 | 25 | PB_BIND(meshtastic_Config_BluetoothConfig, meshtastic_Config_BluetoothConfig, AUTO) 26 | 27 | PB_BIND(meshtastic_Config_SecurityConfig, meshtastic_Config_SecurityConfig, AUTO) 28 | 29 | PB_BIND(meshtastic_Config_SessionkeyConfig, meshtastic_Config_SessionkeyConfig, AUTO) 30 | -------------------------------------------------------------------------------- /lib/mesh/generated/meshtastic/connection_status.pb.cpp: -------------------------------------------------------------------------------- 1 | /* Automatically generated nanopb constant definitions */ 2 | /* Generated by nanopb-1.0.0-dev */ 3 | 4 | #include "meshtastic/connection_status.pb.h" 5 | #if PB_PROTO_HEADER_VERSION != 40 6 | #error Regenerate this file with the current version of nanopb generator. 7 | #endif 8 | 9 | PB_BIND(meshtastic_DeviceConnectionStatus, meshtastic_DeviceConnectionStatus, AUTO) 10 | 11 | PB_BIND(meshtastic_WifiConnectionStatus, meshtastic_WifiConnectionStatus, AUTO) 12 | 13 | PB_BIND(meshtastic_EthernetConnectionStatus, meshtastic_EthernetConnectionStatus, AUTO) 14 | 15 | PB_BIND(meshtastic_NetworkConnectionStatus, meshtastic_NetworkConnectionStatus, AUTO) 16 | 17 | PB_BIND(meshtastic_BluetoothConnectionStatus, meshtastic_BluetoothConnectionStatus, AUTO) 18 | 19 | PB_BIND(meshtastic_SerialConnectionStatus, meshtastic_SerialConnectionStatus, AUTO) 20 | -------------------------------------------------------------------------------- /lib/mesh/generated/meshtastic/connection_status.pb.h: -------------------------------------------------------------------------------- 1 | /* Automatically generated nanopb header */ 2 | /* Generated by nanopb-1.0.0-dev */ 3 | 4 | #ifndef PB_MESHTASTIC_MESHTASTIC_CONNECTION_STATUS_PB_H_INCLUDED 5 | #define PB_MESHTASTIC_MESHTASTIC_CONNECTION_STATUS_PB_H_INCLUDED 6 | #include 7 | 8 | #if PB_PROTO_HEADER_VERSION != 40 9 | #error Regenerate this file with the current version of nanopb generator. 10 | #endif 11 | 12 | /* Struct definitions */ 13 | /* Ethernet or WiFi connection status */ 14 | typedef struct _meshtastic_NetworkConnectionStatus { 15 | /* IP address of device */ 16 | uint32_t ip_address; 17 | /* Whether the device has an active connection or not */ 18 | bool is_connected; 19 | /* Whether the device has an active connection to an MQTT broker or not */ 20 | bool is_mqtt_connected; 21 | /* Whether the device is actively remote syslogging or not */ 22 | bool is_syslog_connected; 23 | } meshtastic_NetworkConnectionStatus; 24 | 25 | /* WiFi connection status */ 26 | typedef struct _meshtastic_WifiConnectionStatus { 27 | /* Connection status */ 28 | bool has_status; 29 | meshtastic_NetworkConnectionStatus status; 30 | /* WiFi access point SSID */ 31 | char ssid[33]; 32 | /* RSSI of wireless connection */ 33 | int32_t rssi; 34 | } meshtastic_WifiConnectionStatus; 35 | 36 | /* Ethernet connection status */ 37 | typedef struct _meshtastic_EthernetConnectionStatus { 38 | /* Connection status */ 39 | bool has_status; 40 | meshtastic_NetworkConnectionStatus status; 41 | } meshtastic_EthernetConnectionStatus; 42 | 43 | /* Bluetooth connection status */ 44 | typedef struct _meshtastic_BluetoothConnectionStatus { 45 | /* The pairing PIN for bluetooth */ 46 | uint32_t pin; 47 | /* RSSI of bluetooth connection */ 48 | int32_t rssi; 49 | /* Whether the device has an active connection or not */ 50 | bool is_connected; 51 | } meshtastic_BluetoothConnectionStatus; 52 | 53 | /* Serial connection status */ 54 | typedef struct _meshtastic_SerialConnectionStatus { 55 | /* Serial baud rate */ 56 | uint32_t baud; 57 | /* Whether the device has an active connection or not */ 58 | bool is_connected; 59 | } meshtastic_SerialConnectionStatus; 60 | 61 | typedef struct _meshtastic_DeviceConnectionStatus { 62 | /* WiFi Status */ 63 | bool has_wifi; 64 | meshtastic_WifiConnectionStatus wifi; 65 | /* WiFi Status */ 66 | bool has_ethernet; 67 | meshtastic_EthernetConnectionStatus ethernet; 68 | /* Bluetooth Status */ 69 | bool has_bluetooth; 70 | meshtastic_BluetoothConnectionStatus bluetooth; 71 | /* Serial Status */ 72 | bool has_serial; 73 | meshtastic_SerialConnectionStatus serial; 74 | } meshtastic_DeviceConnectionStatus; 75 | 76 | #ifdef __cplusplus 77 | extern "C" { 78 | #endif 79 | 80 | /* Initializer values for message structs */ 81 | #define meshtastic_DeviceConnectionStatus_init_default \ 82 | { \ 83 | false, meshtastic_WifiConnectionStatus_init_default, false, meshtastic_EthernetConnectionStatus_init_default, false, \ 84 | meshtastic_BluetoothConnectionStatus_init_default, false, meshtastic_SerialConnectionStatus_init_default \ 85 | } 86 | #define meshtastic_WifiConnectionStatus_init_default \ 87 | { \ 88 | false, meshtastic_NetworkConnectionStatus_init_default, "", 0 \ 89 | } 90 | #define meshtastic_EthernetConnectionStatus_init_default \ 91 | { \ 92 | false, meshtastic_NetworkConnectionStatus_init_default \ 93 | } 94 | #define meshtastic_NetworkConnectionStatus_init_default \ 95 | { \ 96 | 0, 0, 0, 0 \ 97 | } 98 | #define meshtastic_BluetoothConnectionStatus_init_default \ 99 | { \ 100 | 0, 0, 0 \ 101 | } 102 | #define meshtastic_SerialConnectionStatus_init_default \ 103 | { \ 104 | 0, 0 \ 105 | } 106 | #define meshtastic_DeviceConnectionStatus_init_zero \ 107 | { \ 108 | false, meshtastic_WifiConnectionStatus_init_zero, false, meshtastic_EthernetConnectionStatus_init_zero, false, \ 109 | meshtastic_BluetoothConnectionStatus_init_zero, false, meshtastic_SerialConnectionStatus_init_zero \ 110 | } 111 | #define meshtastic_WifiConnectionStatus_init_zero \ 112 | { \ 113 | false, meshtastic_NetworkConnectionStatus_init_zero, "", 0 \ 114 | } 115 | #define meshtastic_EthernetConnectionStatus_init_zero \ 116 | { \ 117 | false, meshtastic_NetworkConnectionStatus_init_zero \ 118 | } 119 | #define meshtastic_NetworkConnectionStatus_init_zero \ 120 | { \ 121 | 0, 0, 0, 0 \ 122 | } 123 | #define meshtastic_BluetoothConnectionStatus_init_zero \ 124 | { \ 125 | 0, 0, 0 \ 126 | } 127 | #define meshtastic_SerialConnectionStatus_init_zero \ 128 | { \ 129 | 0, 0 \ 130 | } 131 | 132 | /* Field tags (for use in manual encoding/decoding) */ 133 | #define meshtastic_NetworkConnectionStatus_ip_address_tag 1 134 | #define meshtastic_NetworkConnectionStatus_is_connected_tag 2 135 | #define meshtastic_NetworkConnectionStatus_is_mqtt_connected_tag 3 136 | #define meshtastic_NetworkConnectionStatus_is_syslog_connected_tag 4 137 | #define meshtastic_WifiConnectionStatus_status_tag 1 138 | #define meshtastic_WifiConnectionStatus_ssid_tag 2 139 | #define meshtastic_WifiConnectionStatus_rssi_tag 3 140 | #define meshtastic_EthernetConnectionStatus_status_tag 1 141 | #define meshtastic_BluetoothConnectionStatus_pin_tag 1 142 | #define meshtastic_BluetoothConnectionStatus_rssi_tag 2 143 | #define meshtastic_BluetoothConnectionStatus_is_connected_tag 3 144 | #define meshtastic_SerialConnectionStatus_baud_tag 1 145 | #define meshtastic_SerialConnectionStatus_is_connected_tag 2 146 | #define meshtastic_DeviceConnectionStatus_wifi_tag 1 147 | #define meshtastic_DeviceConnectionStatus_ethernet_tag 2 148 | #define meshtastic_DeviceConnectionStatus_bluetooth_tag 3 149 | #define meshtastic_DeviceConnectionStatus_serial_tag 4 150 | 151 | /* Struct field encoding specification for nanopb */ 152 | #define meshtastic_DeviceConnectionStatus_FIELDLIST(X, a) \ 153 | X(a, STATIC, OPTIONAL, MESSAGE, wifi, 1) \ 154 | X(a, STATIC, OPTIONAL, MESSAGE, ethernet, 2) \ 155 | X(a, STATIC, OPTIONAL, MESSAGE, bluetooth, 3) \ 156 | X(a, STATIC, OPTIONAL, MESSAGE, serial, 4) 157 | #define meshtastic_DeviceConnectionStatus_CALLBACK NULL 158 | #define meshtastic_DeviceConnectionStatus_DEFAULT NULL 159 | #define meshtastic_DeviceConnectionStatus_wifi_MSGTYPE meshtastic_WifiConnectionStatus 160 | #define meshtastic_DeviceConnectionStatus_ethernet_MSGTYPE meshtastic_EthernetConnectionStatus 161 | #define meshtastic_DeviceConnectionStatus_bluetooth_MSGTYPE meshtastic_BluetoothConnectionStatus 162 | #define meshtastic_DeviceConnectionStatus_serial_MSGTYPE meshtastic_SerialConnectionStatus 163 | 164 | #define meshtastic_WifiConnectionStatus_FIELDLIST(X, a) \ 165 | X(a, STATIC, OPTIONAL, MESSAGE, status, 1) \ 166 | X(a, STATIC, SINGULAR, STRING, ssid, 2) \ 167 | X(a, STATIC, SINGULAR, INT32, rssi, 3) 168 | #define meshtastic_WifiConnectionStatus_CALLBACK NULL 169 | #define meshtastic_WifiConnectionStatus_DEFAULT NULL 170 | #define meshtastic_WifiConnectionStatus_status_MSGTYPE meshtastic_NetworkConnectionStatus 171 | 172 | #define meshtastic_EthernetConnectionStatus_FIELDLIST(X, a) X(a, STATIC, OPTIONAL, MESSAGE, status, 1) 173 | #define meshtastic_EthernetConnectionStatus_CALLBACK NULL 174 | #define meshtastic_EthernetConnectionStatus_DEFAULT NULL 175 | #define meshtastic_EthernetConnectionStatus_status_MSGTYPE meshtastic_NetworkConnectionStatus 176 | 177 | #define meshtastic_NetworkConnectionStatus_FIELDLIST(X, a) \ 178 | X(a, STATIC, SINGULAR, FIXED32, ip_address, 1) \ 179 | X(a, STATIC, SINGULAR, BOOL, is_connected, 2) \ 180 | X(a, STATIC, SINGULAR, BOOL, is_mqtt_connected, 3) \ 181 | X(a, STATIC, SINGULAR, BOOL, is_syslog_connected, 4) 182 | #define meshtastic_NetworkConnectionStatus_CALLBACK NULL 183 | #define meshtastic_NetworkConnectionStatus_DEFAULT NULL 184 | 185 | #define meshtastic_BluetoothConnectionStatus_FIELDLIST(X, a) \ 186 | X(a, STATIC, SINGULAR, UINT32, pin, 1) \ 187 | X(a, STATIC, SINGULAR, INT32, rssi, 2) \ 188 | X(a, STATIC, SINGULAR, BOOL, is_connected, 3) 189 | #define meshtastic_BluetoothConnectionStatus_CALLBACK NULL 190 | #define meshtastic_BluetoothConnectionStatus_DEFAULT NULL 191 | 192 | #define meshtastic_SerialConnectionStatus_FIELDLIST(X, a) \ 193 | X(a, STATIC, SINGULAR, UINT32, baud, 1) \ 194 | X(a, STATIC, SINGULAR, BOOL, is_connected, 2) 195 | #define meshtastic_SerialConnectionStatus_CALLBACK NULL 196 | #define meshtastic_SerialConnectionStatus_DEFAULT NULL 197 | 198 | extern const pb_msgdesc_t meshtastic_DeviceConnectionStatus_msg; 199 | extern const pb_msgdesc_t meshtastic_WifiConnectionStatus_msg; 200 | extern const pb_msgdesc_t meshtastic_EthernetConnectionStatus_msg; 201 | extern const pb_msgdesc_t meshtastic_NetworkConnectionStatus_msg; 202 | extern const pb_msgdesc_t meshtastic_BluetoothConnectionStatus_msg; 203 | extern const pb_msgdesc_t meshtastic_SerialConnectionStatus_msg; 204 | 205 | /* Defines for backwards compatibility with code written before nanopb-0.4.0 */ 206 | #define meshtastic_DeviceConnectionStatus_fields &meshtastic_DeviceConnectionStatus_msg 207 | #define meshtastic_WifiConnectionStatus_fields &meshtastic_WifiConnectionStatus_msg 208 | #define meshtastic_EthernetConnectionStatus_fields &meshtastic_EthernetConnectionStatus_msg 209 | #define meshtastic_NetworkConnectionStatus_fields &meshtastic_NetworkConnectionStatus_msg 210 | #define meshtastic_BluetoothConnectionStatus_fields &meshtastic_BluetoothConnectionStatus_msg 211 | #define meshtastic_SerialConnectionStatus_fields &meshtastic_SerialConnectionStatus_msg 212 | 213 | /* Maximum encoded size of messages (where known) */ 214 | #define MESHTASTIC_MESHTASTIC_CONNECTION_STATUS_PB_H_MAX_SIZE meshtastic_DeviceConnectionStatus_size 215 | #define meshtastic_BluetoothConnectionStatus_size 19 216 | #define meshtastic_DeviceConnectionStatus_size 106 217 | #define meshtastic_EthernetConnectionStatus_size 13 218 | #define meshtastic_NetworkConnectionStatus_size 11 219 | #define meshtastic_SerialConnectionStatus_size 8 220 | #define meshtastic_WifiConnectionStatus_size 58 221 | 222 | #ifdef __cplusplus 223 | } /* extern "C" */ 224 | #endif 225 | 226 | #endif 227 | -------------------------------------------------------------------------------- /lib/mesh/generated/meshtastic/device_ui.pb.cpp: -------------------------------------------------------------------------------- 1 | /* Automatically generated nanopb constant definitions */ 2 | /* Generated by nanopb-1.0.0-dev */ 3 | 4 | #include "meshtastic/device_ui.pb.h" 5 | #if PB_PROTO_HEADER_VERSION != 40 6 | #error Regenerate this file with the current version of nanopb generator. 7 | #endif 8 | 9 | PB_BIND(meshtastic_DeviceUIConfig, meshtastic_DeviceUIConfig, AUTO) 10 | 11 | PB_BIND(meshtastic_NodeFilter, meshtastic_NodeFilter, AUTO) 12 | 13 | PB_BIND(meshtastic_NodeHighlight, meshtastic_NodeHighlight, AUTO) 14 | 15 | PB_BIND(meshtastic_GeoPoint, meshtastic_GeoPoint, AUTO) 16 | 17 | PB_BIND(meshtastic_Map, meshtastic_Map, AUTO) 18 | -------------------------------------------------------------------------------- /lib/mesh/generated/meshtastic/deviceonly.pb.cpp: -------------------------------------------------------------------------------- 1 | /* Automatically generated nanopb constant definitions */ 2 | /* Generated by nanopb-1.0.0-dev */ 3 | 4 | #include "meshtastic/deviceonly.pb.h" 5 | #if PB_PROTO_HEADER_VERSION != 40 6 | #error Regenerate this file with the current version of nanopb generator. 7 | #endif 8 | 9 | PB_BIND(meshtastic_PositionLite, meshtastic_PositionLite, AUTO) 10 | 11 | PB_BIND(meshtastic_UserLite, meshtastic_UserLite, AUTO) 12 | 13 | PB_BIND(meshtastic_NodeInfoLite, meshtastic_NodeInfoLite, AUTO) 14 | 15 | PB_BIND(meshtastic_DeviceState, meshtastic_DeviceState, 2) 16 | 17 | PB_BIND(meshtastic_NodeDatabase, meshtastic_NodeDatabase, AUTO) 18 | 19 | PB_BIND(meshtastic_ChannelFile, meshtastic_ChannelFile, 2) 20 | 21 | PB_BIND(meshtastic_BackupPreferences, meshtastic_BackupPreferences, 2) 22 | -------------------------------------------------------------------------------- /lib/mesh/generated/meshtastic/interdevice.pb.cpp: -------------------------------------------------------------------------------- 1 | /* Automatically generated nanopb constant definitions */ 2 | /* Generated by nanopb-1.0.0-dev */ 3 | 4 | #include "meshtastic/interdevice.pb.h" 5 | #if PB_PROTO_HEADER_VERSION != 40 6 | #error Regenerate this file with the current version of nanopb generator. 7 | #endif 8 | 9 | PB_BIND(meshtastic_SensorData, meshtastic_SensorData, AUTO) 10 | 11 | PB_BIND(meshtastic_InterdeviceMessage, meshtastic_InterdeviceMessage, 2) 12 | -------------------------------------------------------------------------------- /lib/mesh/generated/meshtastic/interdevice.pb.h: -------------------------------------------------------------------------------- 1 | /* Automatically generated nanopb header */ 2 | /* Generated by nanopb-1.0.0-dev */ 3 | 4 | #ifndef PB_MESHTASTIC_MESHTASTIC_INTERDEVICE_PB_H_INCLUDED 5 | #define PB_MESHTASTIC_MESHTASTIC_INTERDEVICE_PB_H_INCLUDED 6 | #include 7 | 8 | #if PB_PROTO_HEADER_VERSION != 40 9 | #error Regenerate this file with the current version of nanopb generator. 10 | #endif 11 | 12 | /* Enum definitions */ 13 | typedef enum _meshtastic_MessageType { 14 | meshtastic_MessageType_ACK = 0, 15 | meshtastic_MessageType_COLLECT_INTERVAL = 160, /* in ms */ 16 | meshtastic_MessageType_BEEP_ON = 161, /* duration ms */ 17 | meshtastic_MessageType_BEEP_OFF = 162, /* cancel prematurely */ 18 | meshtastic_MessageType_SHUTDOWN = 163, 19 | meshtastic_MessageType_POWER_ON = 164, 20 | meshtastic_MessageType_SCD41_TEMP = 176, 21 | meshtastic_MessageType_SCD41_HUMIDITY = 177, 22 | meshtastic_MessageType_SCD41_CO2 = 178, 23 | meshtastic_MessageType_AHT20_TEMP = 179, 24 | meshtastic_MessageType_AHT20_HUMIDITY = 180, 25 | meshtastic_MessageType_TVOC_INDEX = 181 26 | } meshtastic_MessageType; 27 | 28 | /* Struct definitions */ 29 | typedef struct _meshtastic_SensorData { 30 | /* The message type */ 31 | meshtastic_MessageType type; 32 | pb_size_t which_data; 33 | union _meshtastic_SensorData_data { 34 | float float_value; 35 | uint32_t uint32_value; 36 | } data; 37 | } meshtastic_SensorData; 38 | 39 | typedef struct _meshtastic_InterdeviceMessage { 40 | pb_size_t which_data; 41 | union _meshtastic_InterdeviceMessage_data { 42 | char nmea[1024]; 43 | meshtastic_SensorData sensor; 44 | } data; 45 | } meshtastic_InterdeviceMessage; 46 | 47 | #ifdef __cplusplus 48 | extern "C" { 49 | #endif 50 | 51 | /* Helper constants for enums */ 52 | #define _meshtastic_MessageType_MIN meshtastic_MessageType_ACK 53 | #define _meshtastic_MessageType_MAX meshtastic_MessageType_TVOC_INDEX 54 | #define _meshtastic_MessageType_ARRAYSIZE ((meshtastic_MessageType)(meshtastic_MessageType_TVOC_INDEX + 1)) 55 | 56 | #define meshtastic_SensorData_type_ENUMTYPE meshtastic_MessageType 57 | 58 | /* Initializer values for message structs */ 59 | #define meshtastic_SensorData_init_default \ 60 | { \ 61 | _meshtastic_MessageType_MIN, 0, \ 62 | { \ 63 | 0 \ 64 | } \ 65 | } 66 | #define meshtastic_InterdeviceMessage_init_default \ 67 | { \ 68 | 0, \ 69 | { \ 70 | "" \ 71 | } \ 72 | } 73 | #define meshtastic_SensorData_init_zero \ 74 | { \ 75 | _meshtastic_MessageType_MIN, 0, \ 76 | { \ 77 | 0 \ 78 | } \ 79 | } 80 | #define meshtastic_InterdeviceMessage_init_zero \ 81 | { \ 82 | 0, \ 83 | { \ 84 | "" \ 85 | } \ 86 | } 87 | 88 | /* Field tags (for use in manual encoding/decoding) */ 89 | #define meshtastic_SensorData_type_tag 1 90 | #define meshtastic_SensorData_float_value_tag 2 91 | #define meshtastic_SensorData_uint32_value_tag 3 92 | #define meshtastic_InterdeviceMessage_nmea_tag 1 93 | #define meshtastic_InterdeviceMessage_sensor_tag 2 94 | 95 | /* Struct field encoding specification for nanopb */ 96 | #define meshtastic_SensorData_FIELDLIST(X, a) \ 97 | X(a, STATIC, SINGULAR, UENUM, type, 1) \ 98 | X(a, STATIC, ONEOF, FLOAT, (data, float_value, data.float_value), 2) \ 99 | X(a, STATIC, ONEOF, UINT32, (data, uint32_value, data.uint32_value), 3) 100 | #define meshtastic_SensorData_CALLBACK NULL 101 | #define meshtastic_SensorData_DEFAULT NULL 102 | 103 | #define meshtastic_InterdeviceMessage_FIELDLIST(X, a) \ 104 | X(a, STATIC, ONEOF, STRING, (data, nmea, data.nmea), 1) \ 105 | X(a, STATIC, ONEOF, MESSAGE, (data, sensor, data.sensor), 2) 106 | #define meshtastic_InterdeviceMessage_CALLBACK NULL 107 | #define meshtastic_InterdeviceMessage_DEFAULT NULL 108 | #define meshtastic_InterdeviceMessage_data_sensor_MSGTYPE meshtastic_SensorData 109 | 110 | extern const pb_msgdesc_t meshtastic_SensorData_msg; 111 | extern const pb_msgdesc_t meshtastic_InterdeviceMessage_msg; 112 | 113 | /* Defines for backwards compatibility with code written before nanopb-0.4.0 */ 114 | #define meshtastic_SensorData_fields &meshtastic_SensorData_msg 115 | #define meshtastic_InterdeviceMessage_fields &meshtastic_InterdeviceMessage_msg 116 | 117 | /* Maximum encoded size of messages (where known) */ 118 | #define MESHTASTIC_MESHTASTIC_INTERDEVICE_PB_H_MAX_SIZE meshtastic_InterdeviceMessage_size 119 | #define meshtastic_InterdeviceMessage_size 1026 120 | #define meshtastic_SensorData_size 9 121 | 122 | #ifdef __cplusplus 123 | } /* extern "C" */ 124 | #endif 125 | 126 | #endif 127 | -------------------------------------------------------------------------------- /lib/mesh/generated/meshtastic/localonly.pb.cpp: -------------------------------------------------------------------------------- 1 | /* Automatically generated nanopb constant definitions */ 2 | /* Generated by nanopb-1.0.0-dev */ 3 | 4 | #include "meshtastic/localonly.pb.h" 5 | #if PB_PROTO_HEADER_VERSION != 40 6 | #error Regenerate this file with the current version of nanopb generator. 7 | #endif 8 | 9 | PB_BIND(meshtastic_LocalConfig, meshtastic_LocalConfig, 2) 10 | 11 | PB_BIND(meshtastic_LocalModuleConfig, meshtastic_LocalModuleConfig, 2) 12 | -------------------------------------------------------------------------------- /lib/mesh/generated/meshtastic/mesh.pb.cpp: -------------------------------------------------------------------------------- 1 | /* Automatically generated nanopb constant definitions */ 2 | /* Generated by nanopb-1.0.0-dev */ 3 | 4 | #include "meshtastic/mesh.pb.h" 5 | #if PB_PROTO_HEADER_VERSION != 40 6 | #error Regenerate this file with the current version of nanopb generator. 7 | #endif 8 | 9 | PB_BIND(meshtastic_Position, meshtastic_Position, AUTO) 10 | 11 | PB_BIND(meshtastic_User, meshtastic_User, AUTO) 12 | 13 | PB_BIND(meshtastic_RouteDiscovery, meshtastic_RouteDiscovery, AUTO) 14 | 15 | PB_BIND(meshtastic_Routing, meshtastic_Routing, AUTO) 16 | 17 | PB_BIND(meshtastic_Data, meshtastic_Data, 2) 18 | 19 | PB_BIND(meshtastic_Waypoint, meshtastic_Waypoint, AUTO) 20 | 21 | PB_BIND(meshtastic_MqttClientProxyMessage, meshtastic_MqttClientProxyMessage, 2) 22 | 23 | PB_BIND(meshtastic_MeshPacket, meshtastic_MeshPacket, 2) 24 | 25 | PB_BIND(meshtastic_NodeInfo, meshtastic_NodeInfo, 2) 26 | 27 | PB_BIND(meshtastic_MyNodeInfo, meshtastic_MyNodeInfo, AUTO) 28 | 29 | PB_BIND(meshtastic_LogRecord, meshtastic_LogRecord, 2) 30 | 31 | PB_BIND(meshtastic_QueueStatus, meshtastic_QueueStatus, AUTO) 32 | 33 | PB_BIND(meshtastic_FromRadio, meshtastic_FromRadio, 2) 34 | 35 | PB_BIND(meshtastic_ClientNotification, meshtastic_ClientNotification, 2) 36 | 37 | PB_BIND(meshtastic_FileInfo, meshtastic_FileInfo, AUTO) 38 | 39 | PB_BIND(meshtastic_ToRadio, meshtastic_ToRadio, 2) 40 | 41 | PB_BIND(meshtastic_Compressed, meshtastic_Compressed, AUTO) 42 | 43 | PB_BIND(meshtastic_NeighborInfo, meshtastic_NeighborInfo, AUTO) 44 | 45 | PB_BIND(meshtastic_Neighbor, meshtastic_Neighbor, AUTO) 46 | 47 | PB_BIND(meshtastic_DeviceMetadata, meshtastic_DeviceMetadata, AUTO) 48 | 49 | PB_BIND(meshtastic_Heartbeat, meshtastic_Heartbeat, AUTO) 50 | 51 | PB_BIND(meshtastic_NodeRemoteHardwarePin, meshtastic_NodeRemoteHardwarePin, AUTO) 52 | 53 | PB_BIND(meshtastic_ChunkedPayload, meshtastic_ChunkedPayload, AUTO) 54 | 55 | PB_BIND(meshtastic_resend_chunks, meshtastic_resend_chunks, AUTO) 56 | 57 | PB_BIND(meshtastic_ChunkedPayloadResponse, meshtastic_ChunkedPayloadResponse, AUTO) 58 | -------------------------------------------------------------------------------- /lib/mesh/generated/meshtastic/module_config.pb.cpp: -------------------------------------------------------------------------------- 1 | /* Automatically generated nanopb constant definitions */ 2 | /* Generated by nanopb-1.0.0-dev */ 3 | 4 | #include "meshtastic/module_config.pb.h" 5 | #if PB_PROTO_HEADER_VERSION != 40 6 | #error Regenerate this file with the current version of nanopb generator. 7 | #endif 8 | 9 | PB_BIND(meshtastic_ModuleConfig, meshtastic_ModuleConfig, AUTO) 10 | 11 | PB_BIND(meshtastic_ModuleConfig_MQTTConfig, meshtastic_ModuleConfig_MQTTConfig, AUTO) 12 | 13 | PB_BIND(meshtastic_ModuleConfig_MapReportSettings, meshtastic_ModuleConfig_MapReportSettings, AUTO) 14 | 15 | PB_BIND(meshtastic_ModuleConfig_RemoteHardwareConfig, meshtastic_ModuleConfig_RemoteHardwareConfig, AUTO) 16 | 17 | PB_BIND(meshtastic_ModuleConfig_NeighborInfoConfig, meshtastic_ModuleConfig_NeighborInfoConfig, AUTO) 18 | 19 | PB_BIND(meshtastic_ModuleConfig_DetectionSensorConfig, meshtastic_ModuleConfig_DetectionSensorConfig, AUTO) 20 | 21 | PB_BIND(meshtastic_ModuleConfig_AudioConfig, meshtastic_ModuleConfig_AudioConfig, AUTO) 22 | 23 | PB_BIND(meshtastic_ModuleConfig_PaxcounterConfig, meshtastic_ModuleConfig_PaxcounterConfig, AUTO) 24 | 25 | PB_BIND(meshtastic_ModuleConfig_SerialConfig, meshtastic_ModuleConfig_SerialConfig, AUTO) 26 | 27 | PB_BIND(meshtastic_ModuleConfig_ExternalNotificationConfig, meshtastic_ModuleConfig_ExternalNotificationConfig, AUTO) 28 | 29 | PB_BIND(meshtastic_ModuleConfig_StoreForwardConfig, meshtastic_ModuleConfig_StoreForwardConfig, AUTO) 30 | 31 | PB_BIND(meshtastic_ModuleConfig_RangeTestConfig, meshtastic_ModuleConfig_RangeTestConfig, AUTO) 32 | 33 | PB_BIND(meshtastic_ModuleConfig_TelemetryConfig, meshtastic_ModuleConfig_TelemetryConfig, AUTO) 34 | 35 | PB_BIND(meshtastic_ModuleConfig_CannedMessageConfig, meshtastic_ModuleConfig_CannedMessageConfig, AUTO) 36 | 37 | PB_BIND(meshtastic_ModuleConfig_AmbientLightingConfig, meshtastic_ModuleConfig_AmbientLightingConfig, AUTO) 38 | 39 | PB_BIND(meshtastic_RemoteHardwarePin, meshtastic_RemoteHardwarePin, AUTO) 40 | -------------------------------------------------------------------------------- /lib/mesh/generated/meshtastic/mqtt.pb.cpp: -------------------------------------------------------------------------------- 1 | /* Automatically generated nanopb constant definitions */ 2 | /* Generated by nanopb-1.0.0-dev */ 3 | 4 | #include "meshtastic/mqtt.pb.h" 5 | #if PB_PROTO_HEADER_VERSION != 40 6 | #error Regenerate this file with the current version of nanopb generator. 7 | #endif 8 | 9 | PB_BIND(meshtastic_ServiceEnvelope, meshtastic_ServiceEnvelope, AUTO) 10 | 11 | PB_BIND(meshtastic_MapReport, meshtastic_MapReport, AUTO) 12 | -------------------------------------------------------------------------------- /lib/mesh/generated/meshtastic/mqtt.pb.h: -------------------------------------------------------------------------------- 1 | /* Automatically generated nanopb header */ 2 | /* Generated by nanopb-1.0.0-dev */ 3 | 4 | #ifndef PB_MESHTASTIC_MESHTASTIC_MQTT_PB_H_INCLUDED 5 | #define PB_MESHTASTIC_MESHTASTIC_MQTT_PB_H_INCLUDED 6 | #include "meshtastic/config.pb.h" 7 | #include "meshtastic/mesh.pb.h" 8 | #include 9 | 10 | #if PB_PROTO_HEADER_VERSION != 40 11 | #error Regenerate this file with the current version of nanopb generator. 12 | #endif 13 | 14 | /* Struct definitions */ 15 | /* This message wraps a MeshPacket with extra metadata about the sender and how it arrived. */ 16 | typedef struct _meshtastic_ServiceEnvelope { 17 | /* The (probably encrypted) packet */ 18 | struct _meshtastic_MeshPacket *packet; 19 | /* The global channel ID it was sent on */ 20 | char *channel_id; 21 | /* The sending gateway node ID. Can we use this to authenticate/prevent fake 22 | nodeid impersonation for senders? - i.e. use gateway/mesh id (which is authenticated) + local node id as 23 | the globally trusted nodenum */ 24 | char *gateway_id; 25 | } meshtastic_ServiceEnvelope; 26 | 27 | /* Information about a node intended to be reported unencrypted to a map using MQTT. */ 28 | typedef struct _meshtastic_MapReport { 29 | /* A full name for this user, i.e. "Kevin Hester" */ 30 | char long_name[40]; 31 | /* A VERY short name, ideally two characters. 32 | Suitable for a tiny OLED screen */ 33 | char short_name[5]; 34 | /* Role of the node that applies specific settings for a particular use-case */ 35 | meshtastic_Config_DeviceConfig_Role role; 36 | /* Hardware model of the node, i.e. T-Beam, Heltec V3, etc... */ 37 | meshtastic_HardwareModel hw_model; 38 | /* Device firmware version string */ 39 | char firmware_version[18]; 40 | /* The region code for the radio (US, CN, EU433, etc...) */ 41 | meshtastic_Config_LoRaConfig_RegionCode region; 42 | /* Modem preset used by the radio (LongFast, MediumSlow, etc...) */ 43 | meshtastic_Config_LoRaConfig_ModemPreset modem_preset; 44 | /* Whether the node has a channel with default PSK and name (LongFast, MediumSlow, etc...) 45 | and it uses the default frequency slot given the region and modem preset. */ 46 | bool has_default_channel; 47 | /* Latitude: multiply by 1e-7 to get degrees in floating point */ 48 | int32_t latitude_i; 49 | /* Longitude: multiply by 1e-7 to get degrees in floating point */ 50 | int32_t longitude_i; 51 | /* Altitude in meters above MSL */ 52 | int32_t altitude; 53 | /* Indicates the bits of precision for latitude and longitude set by the sending node */ 54 | uint32_t position_precision; 55 | /* Number of online nodes (heard in the last 2 hours) this node has in its list that were received locally (not via MQTT) */ 56 | uint16_t num_online_local_nodes; 57 | /* User has opted in to share their location (map report) with the mqtt server 58 | Controlled by map_report.should_report_location */ 59 | bool has_opted_report_location; 60 | } meshtastic_MapReport; 61 | 62 | #ifdef __cplusplus 63 | extern "C" { 64 | #endif 65 | 66 | /* Initializer values for message structs */ 67 | #define meshtastic_ServiceEnvelope_init_default \ 68 | { \ 69 | NULL, NULL, NULL \ 70 | } 71 | #define meshtastic_MapReport_init_default \ 72 | { \ 73 | "", "", _meshtastic_Config_DeviceConfig_Role_MIN, _meshtastic_HardwareModel_MIN, "", \ 74 | _meshtastic_Config_LoRaConfig_RegionCode_MIN, _meshtastic_Config_LoRaConfig_ModemPreset_MIN, 0, 0, 0, 0, 0, 0, 0 \ 75 | } 76 | #define meshtastic_ServiceEnvelope_init_zero \ 77 | { \ 78 | NULL, NULL, NULL \ 79 | } 80 | #define meshtastic_MapReport_init_zero \ 81 | { \ 82 | "", "", _meshtastic_Config_DeviceConfig_Role_MIN, _meshtastic_HardwareModel_MIN, "", \ 83 | _meshtastic_Config_LoRaConfig_RegionCode_MIN, _meshtastic_Config_LoRaConfig_ModemPreset_MIN, 0, 0, 0, 0, 0, 0, 0 \ 84 | } 85 | 86 | /* Field tags (for use in manual encoding/decoding) */ 87 | #define meshtastic_ServiceEnvelope_packet_tag 1 88 | #define meshtastic_ServiceEnvelope_channel_id_tag 2 89 | #define meshtastic_ServiceEnvelope_gateway_id_tag 3 90 | #define meshtastic_MapReport_long_name_tag 1 91 | #define meshtastic_MapReport_short_name_tag 2 92 | #define meshtastic_MapReport_role_tag 3 93 | #define meshtastic_MapReport_hw_model_tag 4 94 | #define meshtastic_MapReport_firmware_version_tag 5 95 | #define meshtastic_MapReport_region_tag 6 96 | #define meshtastic_MapReport_modem_preset_tag 7 97 | #define meshtastic_MapReport_has_default_channel_tag 8 98 | #define meshtastic_MapReport_latitude_i_tag 9 99 | #define meshtastic_MapReport_longitude_i_tag 10 100 | #define meshtastic_MapReport_altitude_tag 11 101 | #define meshtastic_MapReport_position_precision_tag 12 102 | #define meshtastic_MapReport_num_online_local_nodes_tag 13 103 | #define meshtastic_MapReport_has_opted_report_location_tag 14 104 | 105 | /* Struct field encoding specification for nanopb */ 106 | #define meshtastic_ServiceEnvelope_FIELDLIST(X, a) \ 107 | X(a, POINTER, OPTIONAL, MESSAGE, packet, 1) \ 108 | X(a, POINTER, SINGULAR, STRING, channel_id, 2) \ 109 | X(a, POINTER, SINGULAR, STRING, gateway_id, 3) 110 | #define meshtastic_ServiceEnvelope_CALLBACK NULL 111 | #define meshtastic_ServiceEnvelope_DEFAULT NULL 112 | #define meshtastic_ServiceEnvelope_packet_MSGTYPE meshtastic_MeshPacket 113 | 114 | #define meshtastic_MapReport_FIELDLIST(X, a) \ 115 | X(a, STATIC, SINGULAR, STRING, long_name, 1) \ 116 | X(a, STATIC, SINGULAR, STRING, short_name, 2) \ 117 | X(a, STATIC, SINGULAR, UENUM, role, 3) \ 118 | X(a, STATIC, SINGULAR, UENUM, hw_model, 4) \ 119 | X(a, STATIC, SINGULAR, STRING, firmware_version, 5) \ 120 | X(a, STATIC, SINGULAR, UENUM, region, 6) \ 121 | X(a, STATIC, SINGULAR, UENUM, modem_preset, 7) \ 122 | X(a, STATIC, SINGULAR, BOOL, has_default_channel, 8) \ 123 | X(a, STATIC, SINGULAR, SFIXED32, latitude_i, 9) \ 124 | X(a, STATIC, SINGULAR, SFIXED32, longitude_i, 10) \ 125 | X(a, STATIC, SINGULAR, INT32, altitude, 11) \ 126 | X(a, STATIC, SINGULAR, UINT32, position_precision, 12) \ 127 | X(a, STATIC, SINGULAR, UINT32, num_online_local_nodes, 13) \ 128 | X(a, STATIC, SINGULAR, BOOL, has_opted_report_location, 14) 129 | #define meshtastic_MapReport_CALLBACK NULL 130 | #define meshtastic_MapReport_DEFAULT NULL 131 | 132 | extern const pb_msgdesc_t meshtastic_ServiceEnvelope_msg; 133 | extern const pb_msgdesc_t meshtastic_MapReport_msg; 134 | 135 | /* Defines for backwards compatibility with code written before nanopb-0.4.0 */ 136 | #define meshtastic_ServiceEnvelope_fields &meshtastic_ServiceEnvelope_msg 137 | #define meshtastic_MapReport_fields &meshtastic_MapReport_msg 138 | 139 | /* Maximum encoded size of messages (where known) */ 140 | /* meshtastic_ServiceEnvelope_size depends on runtime parameters */ 141 | #define MESHTASTIC_MESHTASTIC_MQTT_PB_H_MAX_SIZE meshtastic_MapReport_size 142 | #define meshtastic_MapReport_size 110 143 | 144 | #ifdef __cplusplus 145 | } /* extern "C" */ 146 | #endif 147 | 148 | #endif 149 | -------------------------------------------------------------------------------- /lib/mesh/generated/meshtastic/paxcount.pb.cpp: -------------------------------------------------------------------------------- 1 | /* Automatically generated nanopb constant definitions */ 2 | /* Generated by nanopb-1.0.0-dev */ 3 | 4 | #include "meshtastic/paxcount.pb.h" 5 | #if PB_PROTO_HEADER_VERSION != 40 6 | #error Regenerate this file with the current version of nanopb generator. 7 | #endif 8 | 9 | PB_BIND(meshtastic_Paxcount, meshtastic_Paxcount, AUTO) 10 | -------------------------------------------------------------------------------- /lib/mesh/generated/meshtastic/paxcount.pb.h: -------------------------------------------------------------------------------- 1 | /* Automatically generated nanopb header */ 2 | /* Generated by nanopb-1.0.0-dev */ 3 | 4 | #ifndef PB_MESHTASTIC_MESHTASTIC_PAXCOUNT_PB_H_INCLUDED 5 | #define PB_MESHTASTIC_MESHTASTIC_PAXCOUNT_PB_H_INCLUDED 6 | #include 7 | 8 | #if PB_PROTO_HEADER_VERSION != 40 9 | #error Regenerate this file with the current version of nanopb generator. 10 | #endif 11 | 12 | /* Struct definitions */ 13 | /* TODO: REPLACE */ 14 | typedef struct _meshtastic_Paxcount { 15 | /* seen Wifi devices */ 16 | uint32_t wifi; 17 | /* Seen BLE devices */ 18 | uint32_t ble; 19 | /* Uptime in seconds */ 20 | uint32_t uptime; 21 | } meshtastic_Paxcount; 22 | 23 | #ifdef __cplusplus 24 | extern "C" { 25 | #endif 26 | 27 | /* Initializer values for message structs */ 28 | #define meshtastic_Paxcount_init_default \ 29 | { \ 30 | 0, 0, 0 \ 31 | } 32 | #define meshtastic_Paxcount_init_zero \ 33 | { \ 34 | 0, 0, 0 \ 35 | } 36 | 37 | /* Field tags (for use in manual encoding/decoding) */ 38 | #define meshtastic_Paxcount_wifi_tag 1 39 | #define meshtastic_Paxcount_ble_tag 2 40 | #define meshtastic_Paxcount_uptime_tag 3 41 | 42 | /* Struct field encoding specification for nanopb */ 43 | #define meshtastic_Paxcount_FIELDLIST(X, a) \ 44 | X(a, STATIC, SINGULAR, UINT32, wifi, 1) \ 45 | X(a, STATIC, SINGULAR, UINT32, ble, 2) \ 46 | X(a, STATIC, SINGULAR, UINT32, uptime, 3) 47 | #define meshtastic_Paxcount_CALLBACK NULL 48 | #define meshtastic_Paxcount_DEFAULT NULL 49 | 50 | extern const pb_msgdesc_t meshtastic_Paxcount_msg; 51 | 52 | /* Defines for backwards compatibility with code written before nanopb-0.4.0 */ 53 | #define meshtastic_Paxcount_fields &meshtastic_Paxcount_msg 54 | 55 | /* Maximum encoded size of messages (where known) */ 56 | #define MESHTASTIC_MESHTASTIC_PAXCOUNT_PB_H_MAX_SIZE meshtastic_Paxcount_size 57 | #define meshtastic_Paxcount_size 18 58 | 59 | #ifdef __cplusplus 60 | } /* extern "C" */ 61 | #endif 62 | 63 | #endif 64 | -------------------------------------------------------------------------------- /lib/mesh/generated/meshtastic/portnums.pb.cpp: -------------------------------------------------------------------------------- 1 | /* Automatically generated nanopb constant definitions */ 2 | /* Generated by nanopb-1.0.0-dev */ 3 | 4 | #include "meshtastic/portnums.pb.h" 5 | #if PB_PROTO_HEADER_VERSION != 40 6 | #error Regenerate this file with the current version of nanopb generator. 7 | #endif 8 | -------------------------------------------------------------------------------- /lib/mesh/generated/meshtastic/portnums.pb.h: -------------------------------------------------------------------------------- 1 | /* Automatically generated nanopb header */ 2 | /* Generated by nanopb-1.0.0-dev */ 3 | 4 | #ifndef PB_MESHTASTIC_MESHTASTIC_PORTNUMS_PB_H_INCLUDED 5 | #define PB_MESHTASTIC_MESHTASTIC_PORTNUMS_PB_H_INCLUDED 6 | #include 7 | 8 | #if PB_PROTO_HEADER_VERSION != 40 9 | #error Regenerate this file with the current version of nanopb generator. 10 | #endif 11 | 12 | /* Enum definitions */ 13 | /* For any new 'apps' that run on the device or via sister apps on phones/PCs they should pick and use a 14 | unique 'portnum' for their application. 15 | If you are making a new app using meshtastic, please send in a pull request to add your 'portnum' to this 16 | master table. 17 | PortNums should be assigned in the following range: 18 | 0-63 Core Meshtastic use, do not use for third party apps 19 | 64-127 Registered 3rd party apps, send in a pull request that adds a new entry to portnums.proto to register your application 20 | 256-511 Use one of these portnums for your private applications that you don't want to register publically 21 | All other values are reserved. 22 | Note: This was formerly a Type enum named 'typ' with the same id # 23 | We have change to this 'portnum' based scheme for specifying app handlers for particular payloads. 24 | This change is backwards compatible by treating the legacy OPAQUE/CLEAR_TEXT values identically. */ 25 | typedef enum _meshtastic_PortNum { 26 | /* Deprecated: do not use in new code (formerly called OPAQUE) 27 | A message sent from a device outside of the mesh, in a form the mesh does not understand 28 | NOTE: This must be 0, because it is documented in IMeshService.aidl to be so 29 | ENCODING: binary undefined */ 30 | meshtastic_PortNum_UNKNOWN_APP = 0, 31 | /* A simple UTF-8 text message, which even the little micros in the mesh 32 | can understand and show on their screen eventually in some circumstances 33 | even signal might send messages in this form (see below) 34 | ENCODING: UTF-8 Plaintext (?) */ 35 | meshtastic_PortNum_TEXT_MESSAGE_APP = 1, 36 | /* Reserved for built-in GPIO/example app. 37 | See remote_hardware.proto/HardwareMessage for details on the message sent/received to this port number 38 | ENCODING: Protobuf */ 39 | meshtastic_PortNum_REMOTE_HARDWARE_APP = 2, 40 | /* The built-in position messaging app. 41 | Payload is a Position message. 42 | ENCODING: Protobuf */ 43 | meshtastic_PortNum_POSITION_APP = 3, 44 | /* The built-in user info app. 45 | Payload is a User message. 46 | ENCODING: Protobuf */ 47 | meshtastic_PortNum_NODEINFO_APP = 4, 48 | /* Protocol control packets for mesh protocol use. 49 | Payload is a Routing message. 50 | ENCODING: Protobuf */ 51 | meshtastic_PortNum_ROUTING_APP = 5, 52 | /* Admin control packets. 53 | Payload is a AdminMessage message. 54 | ENCODING: Protobuf */ 55 | meshtastic_PortNum_ADMIN_APP = 6, 56 | /* Compressed TEXT_MESSAGE payloads. 57 | ENCODING: UTF-8 Plaintext (?) with Unishox2 Compression 58 | NOTE: The Device Firmware converts a TEXT_MESSAGE_APP to TEXT_MESSAGE_COMPRESSED_APP if the compressed 59 | payload is shorter. There's no need for app developers to do this themselves. Also the firmware will decompress 60 | any incoming TEXT_MESSAGE_COMPRESSED_APP payload and convert to TEXT_MESSAGE_APP. */ 61 | meshtastic_PortNum_TEXT_MESSAGE_COMPRESSED_APP = 7, 62 | /* Waypoint payloads. 63 | Payload is a Waypoint message. 64 | ENCODING: Protobuf */ 65 | meshtastic_PortNum_WAYPOINT_APP = 8, 66 | /* Audio Payloads. 67 | Encapsulated codec2 packets. On 2.4 GHZ Bandwidths only for now 68 | ENCODING: codec2 audio frames 69 | NOTE: audio frames contain a 3 byte header (0xc0 0xde 0xc2) and a one byte marker for the decompressed bitrate. 70 | This marker comes from the 'moduleConfig.audio.bitrate' enum minus one. */ 71 | meshtastic_PortNum_AUDIO_APP = 9, 72 | /* Same as Text Message but originating from Detection Sensor Module. 73 | NOTE: This portnum traffic is not sent to the public MQTT starting at firmware version 2.2.9 */ 74 | meshtastic_PortNum_DETECTION_SENSOR_APP = 10, 75 | /* Same as Text Message but used for critical alerts. */ 76 | meshtastic_PortNum_ALERT_APP = 11, 77 | /* Provides a 'ping' service that replies to any packet it receives. 78 | Also serves as a small example module. 79 | ENCODING: ASCII Plaintext */ 80 | meshtastic_PortNum_REPLY_APP = 32, 81 | /* Used for the python IP tunnel feature 82 | ENCODING: IP Packet. Handled by the python API, firmware ignores this one and pases on. */ 83 | meshtastic_PortNum_IP_TUNNEL_APP = 33, 84 | /* Paxcounter lib included in the firmware 85 | ENCODING: protobuf */ 86 | meshtastic_PortNum_PAXCOUNTER_APP = 34, 87 | /* Provides a hardware serial interface to send and receive from the Meshtastic network. 88 | Connect to the RX/TX pins of a device with 38400 8N1. Packets received from the Meshtastic 89 | network is forwarded to the RX pin while sending a packet to TX will go out to the Mesh network. 90 | Maximum packet size of 240 bytes. 91 | Module is disabled by default can be turned on by setting SERIAL_MODULE_ENABLED = 1 in SerialPlugh.cpp. 92 | ENCODING: binary undefined */ 93 | meshtastic_PortNum_SERIAL_APP = 64, 94 | /* STORE_FORWARD_APP (Work in Progress) 95 | Maintained by Jm Casler (MC Hamster) : jm@casler.org 96 | ENCODING: Protobuf */ 97 | meshtastic_PortNum_STORE_FORWARD_APP = 65, 98 | /* Optional port for messages for the range test module. 99 | ENCODING: ASCII Plaintext 100 | NOTE: This portnum traffic is not sent to the public MQTT starting at firmware version 2.2.9 */ 101 | meshtastic_PortNum_RANGE_TEST_APP = 66, 102 | /* Provides a format to send and receive telemetry data from the Meshtastic network. 103 | Maintained by Charles Crossan (crossan007) : crossan007@gmail.com 104 | ENCODING: Protobuf */ 105 | meshtastic_PortNum_TELEMETRY_APP = 67, 106 | /* Experimental tools for estimating node position without a GPS 107 | Maintained by Github user a-f-G-U-C (a Meshtastic contributor) 108 | Project files at https://github.com/a-f-G-U-C/Meshtastic-ZPS 109 | ENCODING: arrays of int64 fields */ 110 | meshtastic_PortNum_ZPS_APP = 68, 111 | /* Used to let multiple instances of Linux native applications communicate 112 | as if they did using their LoRa chip. 113 | Maintained by GitHub user GUVWAF. 114 | Project files at https://github.com/GUVWAF/Meshtasticator 115 | ENCODING: Protobuf (?) */ 116 | meshtastic_PortNum_SIMULATOR_APP = 69, 117 | /* Provides a traceroute functionality to show the route a packet towards 118 | a certain destination would take on the mesh. Contains a RouteDiscovery message as payload. 119 | ENCODING: Protobuf */ 120 | meshtastic_PortNum_TRACEROUTE_APP = 70, 121 | /* Aggregates edge info for the network by sending out a list of each node's neighbors 122 | ENCODING: Protobuf */ 123 | meshtastic_PortNum_NEIGHBORINFO_APP = 71, 124 | /* ATAK Plugin 125 | Portnum for payloads from the official Meshtastic ATAK plugin */ 126 | meshtastic_PortNum_ATAK_PLUGIN = 72, 127 | /* Provides unencrypted information about a node for consumption by a map via MQTT */ 128 | meshtastic_PortNum_MAP_REPORT_APP = 73, 129 | /* PowerStress based monitoring support (for automated power consumption testing) */ 130 | meshtastic_PortNum_POWERSTRESS_APP = 74, 131 | /* Reticulum Network Stack Tunnel App 132 | ENCODING: Fragmented RNS Packet. Handled by Meshtastic RNS interface */ 133 | meshtastic_PortNum_RETICULUM_TUNNEL_APP = 76, 134 | /* Private applications should use portnums >= 256. 135 | To simplify initial development and testing you can use "PRIVATE_APP" 136 | in your code without needing to rebuild protobuf files (via 137 | [regen-protos.sh](https://github.com/meshtastic/firmware/blob/master/bin/regen-protos.sh)) */ 138 | meshtastic_PortNum_PRIVATE_APP = 256, 139 | /* ATAK Forwarder Module https://github.com/paulmandal/atak-forwarder 140 | ENCODING: libcotshrink */ 141 | meshtastic_PortNum_ATAK_FORWARDER = 257, 142 | /* Currently we limit port nums to no higher than this value */ 143 | meshtastic_PortNum_MAX = 511 144 | } meshtastic_PortNum; 145 | 146 | #ifdef __cplusplus 147 | extern "C" { 148 | #endif 149 | 150 | /* Helper constants for enums */ 151 | #define _meshtastic_PortNum_MIN meshtastic_PortNum_UNKNOWN_APP 152 | #define _meshtastic_PortNum_MAX meshtastic_PortNum_MAX 153 | #define _meshtastic_PortNum_ARRAYSIZE ((meshtastic_PortNum)(meshtastic_PortNum_MAX + 1)) 154 | 155 | #ifdef __cplusplus 156 | } /* extern "C" */ 157 | #endif 158 | 159 | #endif 160 | -------------------------------------------------------------------------------- /lib/mesh/generated/meshtastic/powermon.pb.cpp: -------------------------------------------------------------------------------- 1 | /* Automatically generated nanopb constant definitions */ 2 | /* Generated by nanopb-1.0.0-dev */ 3 | 4 | #include "meshtastic/powermon.pb.h" 5 | #if PB_PROTO_HEADER_VERSION != 40 6 | #error Regenerate this file with the current version of nanopb generator. 7 | #endif 8 | 9 | PB_BIND(meshtastic_PowerMon, meshtastic_PowerMon, AUTO) 10 | 11 | PB_BIND(meshtastic_PowerStressMessage, meshtastic_PowerStressMessage, AUTO) 12 | -------------------------------------------------------------------------------- /lib/mesh/generated/meshtastic/powermon.pb.h: -------------------------------------------------------------------------------- 1 | /* Automatically generated nanopb header */ 2 | /* Generated by nanopb-1.0.0-dev */ 3 | 4 | #ifndef PB_MESHTASTIC_MESHTASTIC_POWERMON_PB_H_INCLUDED 5 | #define PB_MESHTASTIC_MESHTASTIC_POWERMON_PB_H_INCLUDED 6 | #include 7 | 8 | #if PB_PROTO_HEADER_VERSION != 40 9 | #error Regenerate this file with the current version of nanopb generator. 10 | #endif 11 | 12 | /* Enum definitions */ 13 | /* Any significant power changing event in meshtastic should be tagged with a powermon state transition. 14 | If you are making new meshtastic features feel free to add new entries at the end of this definition. */ 15 | typedef enum _meshtastic_PowerMon_State { 16 | meshtastic_PowerMon_State_None = 0, 17 | meshtastic_PowerMon_State_CPU_DeepSleep = 1, 18 | meshtastic_PowerMon_State_CPU_LightSleep = 2, 19 | /* The external Vext1 power is on. Many boards have auxillary power rails that the CPU turns on only 20 | occasionally. In cases where that rail has multiple devices on it we usually want to have logging on 21 | the state of that rail as an independent record. 22 | For instance on the Heltec Tracker 1.1 board, this rail is the power source for the GPS and screen. 23 | 24 | The log messages will be short and complete (see PowerMon.Event in the protobufs for details). 25 | something like "S:PM:C,0x00001234,REASON" where the hex number is the bitmask of all current states. 26 | (We use a bitmask for states so that if a log message gets lost it won't be fatal) */ 27 | meshtastic_PowerMon_State_Vext1_On = 4, 28 | meshtastic_PowerMon_State_Lora_RXOn = 8, 29 | meshtastic_PowerMon_State_Lora_TXOn = 16, 30 | meshtastic_PowerMon_State_Lora_RXActive = 32, 31 | meshtastic_PowerMon_State_BT_On = 64, 32 | meshtastic_PowerMon_State_LED_On = 128, 33 | meshtastic_PowerMon_State_Screen_On = 256, 34 | meshtastic_PowerMon_State_Screen_Drawing = 512, 35 | meshtastic_PowerMon_State_Wifi_On = 1024, 36 | /* GPS is actively trying to find our location 37 | See GPSPowerState for more details */ 38 | meshtastic_PowerMon_State_GPS_Active = 2048 39 | } meshtastic_PowerMon_State; 40 | 41 | /* What operation would we like the UUT to perform. 42 | note: senders should probably set want_response in their request packets, so that they can know when the state 43 | machine has started processing their request */ 44 | typedef enum _meshtastic_PowerStressMessage_Opcode { 45 | /* Unset/unused */ 46 | meshtastic_PowerStressMessage_Opcode_UNSET = 0, 47 | meshtastic_PowerStressMessage_Opcode_PRINT_INFO = 48 | 1, /* Print board version slog and send an ack that we are alive and ready to process commands */ 49 | meshtastic_PowerStressMessage_Opcode_FORCE_QUIET = 2, /* Try to turn off all automatic processing of packets, screen, 50 | sleeping, etc (to make it easier to measure in isolation) */ 51 | meshtastic_PowerStressMessage_Opcode_END_QUIET = 3, /* Stop powerstress processing - probably by just rebooting the board */ 52 | meshtastic_PowerStressMessage_Opcode_SCREEN_ON = 16, /* Turn the screen on */ 53 | meshtastic_PowerStressMessage_Opcode_SCREEN_OFF = 17, /* Turn the screen off */ 54 | meshtastic_PowerStressMessage_Opcode_CPU_IDLE = 32, /* Let the CPU run but we assume mostly idling for num_seconds */ 55 | meshtastic_PowerStressMessage_Opcode_CPU_DEEPSLEEP = 33, /* Force deep sleep for FIXME seconds */ 56 | meshtastic_PowerStressMessage_Opcode_CPU_FULLON = 34, /* Spin the CPU as fast as possible for num_seconds */ 57 | meshtastic_PowerStressMessage_Opcode_LED_ON = 58 | 48, /* Turn the LED on for num_seconds (and leave it on - for baseline power measurement purposes) */ 59 | meshtastic_PowerStressMessage_Opcode_LED_OFF = 49, /* Force the LED off for num_seconds */ 60 | meshtastic_PowerStressMessage_Opcode_LORA_OFF = 64, /* Completely turn off the LORA radio for num_seconds */ 61 | meshtastic_PowerStressMessage_Opcode_LORA_TX = 65, /* Send Lora packets for num_seconds */ 62 | meshtastic_PowerStressMessage_Opcode_LORA_RX = 63 | 66, /* Receive Lora packets for num_seconds (node will be mostly just listening, unless an external agent is helping 64 | stress this by sending packets on the current channel) */ 65 | meshtastic_PowerStressMessage_Opcode_BT_OFF = 80, /* Turn off the BT radio for num_seconds */ 66 | meshtastic_PowerStressMessage_Opcode_BT_ON = 81, /* Turn on the BT radio for num_seconds */ 67 | meshtastic_PowerStressMessage_Opcode_WIFI_OFF = 96, /* Turn off the WIFI radio for num_seconds */ 68 | meshtastic_PowerStressMessage_Opcode_WIFI_ON = 97, /* Turn on the WIFI radio for num_seconds */ 69 | meshtastic_PowerStressMessage_Opcode_GPS_OFF = 112, /* Turn off the GPS radio for num_seconds */ 70 | meshtastic_PowerStressMessage_Opcode_GPS_ON = 113 /* Turn on the GPS radio for num_seconds */ 71 | } meshtastic_PowerStressMessage_Opcode; 72 | 73 | /* Struct definitions */ 74 | /* Note: There are no 'PowerMon' messages normally in use (PowerMons are sent only as structured logs - slogs). 75 | But we wrap our State enum in this message to effectively nest a namespace (without our linter yelling at us) */ 76 | typedef struct _meshtastic_PowerMon { 77 | char dummy_field; 78 | } meshtastic_PowerMon; 79 | 80 | /* PowerStress testing support via the C++ PowerStress module */ 81 | typedef struct _meshtastic_PowerStressMessage { 82 | /* What type of HardwareMessage is this? */ 83 | meshtastic_PowerStressMessage_Opcode cmd; 84 | float num_seconds; 85 | } meshtastic_PowerStressMessage; 86 | 87 | #ifdef __cplusplus 88 | extern "C" { 89 | #endif 90 | 91 | /* Helper constants for enums */ 92 | #define _meshtastic_PowerMon_State_MIN meshtastic_PowerMon_State_None 93 | #define _meshtastic_PowerMon_State_MAX meshtastic_PowerMon_State_GPS_Active 94 | #define _meshtastic_PowerMon_State_ARRAYSIZE ((meshtastic_PowerMon_State)(meshtastic_PowerMon_State_GPS_Active + 1)) 95 | 96 | #define _meshtastic_PowerStressMessage_Opcode_MIN meshtastic_PowerStressMessage_Opcode_UNSET 97 | #define _meshtastic_PowerStressMessage_Opcode_MAX meshtastic_PowerStressMessage_Opcode_GPS_ON 98 | #define _meshtastic_PowerStressMessage_Opcode_ARRAYSIZE \ 99 | ((meshtastic_PowerStressMessage_Opcode)(meshtastic_PowerStressMessage_Opcode_GPS_ON + 1)) 100 | 101 | #define meshtastic_PowerStressMessage_cmd_ENUMTYPE meshtastic_PowerStressMessage_Opcode 102 | 103 | /* Initializer values for message structs */ 104 | #define meshtastic_PowerMon_init_default \ 105 | { \ 106 | 0 \ 107 | } 108 | #define meshtastic_PowerStressMessage_init_default \ 109 | { \ 110 | _meshtastic_PowerStressMessage_Opcode_MIN, 0 \ 111 | } 112 | #define meshtastic_PowerMon_init_zero \ 113 | { \ 114 | 0 \ 115 | } 116 | #define meshtastic_PowerStressMessage_init_zero \ 117 | { \ 118 | _meshtastic_PowerStressMessage_Opcode_MIN, 0 \ 119 | } 120 | 121 | /* Field tags (for use in manual encoding/decoding) */ 122 | #define meshtastic_PowerStressMessage_cmd_tag 1 123 | #define meshtastic_PowerStressMessage_num_seconds_tag 2 124 | 125 | /* Struct field encoding specification for nanopb */ 126 | #define meshtastic_PowerMon_FIELDLIST(X, a) 127 | 128 | #define meshtastic_PowerMon_CALLBACK NULL 129 | #define meshtastic_PowerMon_DEFAULT NULL 130 | 131 | #define meshtastic_PowerStressMessage_FIELDLIST(X, a) \ 132 | X(a, STATIC, SINGULAR, UENUM, cmd, 1) \ 133 | X(a, STATIC, SINGULAR, FLOAT, num_seconds, 2) 134 | #define meshtastic_PowerStressMessage_CALLBACK NULL 135 | #define meshtastic_PowerStressMessage_DEFAULT NULL 136 | 137 | extern const pb_msgdesc_t meshtastic_PowerMon_msg; 138 | extern const pb_msgdesc_t meshtastic_PowerStressMessage_msg; 139 | 140 | /* Defines for backwards compatibility with code written before nanopb-0.4.0 */ 141 | #define meshtastic_PowerMon_fields &meshtastic_PowerMon_msg 142 | #define meshtastic_PowerStressMessage_fields &meshtastic_PowerStressMessage_msg 143 | 144 | /* Maximum encoded size of messages (where known) */ 145 | #define MESHTASTIC_MESHTASTIC_POWERMON_PB_H_MAX_SIZE meshtastic_PowerStressMessage_size 146 | #define meshtastic_PowerMon_size 0 147 | #define meshtastic_PowerStressMessage_size 7 148 | 149 | #ifdef __cplusplus 150 | } /* extern "C" */ 151 | #endif 152 | 153 | #endif 154 | -------------------------------------------------------------------------------- /lib/mesh/generated/meshtastic/remote_hardware.pb.cpp: -------------------------------------------------------------------------------- 1 | /* Automatically generated nanopb constant definitions */ 2 | /* Generated by nanopb-1.0.0-dev */ 3 | 4 | #include "meshtastic/remote_hardware.pb.h" 5 | #if PB_PROTO_HEADER_VERSION != 40 6 | #error Regenerate this file with the current version of nanopb generator. 7 | #endif 8 | 9 | PB_BIND(meshtastic_HardwareMessage, meshtastic_HardwareMessage, AUTO) 10 | -------------------------------------------------------------------------------- /lib/mesh/generated/meshtastic/remote_hardware.pb.h: -------------------------------------------------------------------------------- 1 | /* Automatically generated nanopb header */ 2 | /* Generated by nanopb-1.0.0-dev */ 3 | 4 | #ifndef PB_MESHTASTIC_MESHTASTIC_REMOTE_HARDWARE_PB_H_INCLUDED 5 | #define PB_MESHTASTIC_MESHTASTIC_REMOTE_HARDWARE_PB_H_INCLUDED 6 | #include 7 | 8 | #if PB_PROTO_HEADER_VERSION != 40 9 | #error Regenerate this file with the current version of nanopb generator. 10 | #endif 11 | 12 | /* Enum definitions */ 13 | /* TODO: REPLACE */ 14 | typedef enum _meshtastic_HardwareMessage_Type { 15 | /* Unset/unused */ 16 | meshtastic_HardwareMessage_Type_UNSET = 0, 17 | /* Set gpio gpios based on gpio_mask/gpio_value */ 18 | meshtastic_HardwareMessage_Type_WRITE_GPIOS = 1, 19 | /* We are now interested in watching the gpio_mask gpios. 20 | If the selected gpios change, please broadcast GPIOS_CHANGED. 21 | Will implicitly change the gpios requested to be INPUT gpios. */ 22 | meshtastic_HardwareMessage_Type_WATCH_GPIOS = 2, 23 | /* The gpios listed in gpio_mask have changed, the new values are listed in gpio_value */ 24 | meshtastic_HardwareMessage_Type_GPIOS_CHANGED = 3, 25 | /* Read the gpios specified in gpio_mask, send back a READ_GPIOS_REPLY reply with gpio_value populated */ 26 | meshtastic_HardwareMessage_Type_READ_GPIOS = 4, 27 | /* A reply to READ_GPIOS. gpio_mask and gpio_value will be populated */ 28 | meshtastic_HardwareMessage_Type_READ_GPIOS_REPLY = 5 29 | } meshtastic_HardwareMessage_Type; 30 | 31 | /* Struct definitions */ 32 | /* An example app to show off the module system. This message is used for 33 | REMOTE_HARDWARE_APP PortNums. 34 | Also provides easy remote access to any GPIO. 35 | In the future other remote hardware operations can be added based on user interest 36 | (i.e. serial output, spi/i2c input/output). 37 | FIXME - currently this feature is turned on by default which is dangerous 38 | because no security yet (beyond the channel mechanism). 39 | It should be off by default and then protected based on some TBD mechanism 40 | (a special channel once multichannel support is included?) */ 41 | typedef struct _meshtastic_HardwareMessage { 42 | /* What type of HardwareMessage is this? */ 43 | meshtastic_HardwareMessage_Type type; 44 | /* What gpios are we changing. Not used for all MessageTypes, see MessageType for details */ 45 | uint64_t gpio_mask; 46 | /* For gpios that were listed in gpio_mask as valid, what are the signal levels for those gpios. 47 | Not used for all MessageTypes, see MessageType for details */ 48 | uint64_t gpio_value; 49 | } meshtastic_HardwareMessage; 50 | 51 | #ifdef __cplusplus 52 | extern "C" { 53 | #endif 54 | 55 | /* Helper constants for enums */ 56 | #define _meshtastic_HardwareMessage_Type_MIN meshtastic_HardwareMessage_Type_UNSET 57 | #define _meshtastic_HardwareMessage_Type_MAX meshtastic_HardwareMessage_Type_READ_GPIOS_REPLY 58 | #define _meshtastic_HardwareMessage_Type_ARRAYSIZE \ 59 | ((meshtastic_HardwareMessage_Type)(meshtastic_HardwareMessage_Type_READ_GPIOS_REPLY + 1)) 60 | 61 | #define meshtastic_HardwareMessage_type_ENUMTYPE meshtastic_HardwareMessage_Type 62 | 63 | /* Initializer values for message structs */ 64 | #define meshtastic_HardwareMessage_init_default \ 65 | { \ 66 | _meshtastic_HardwareMessage_Type_MIN, 0, 0 \ 67 | } 68 | #define meshtastic_HardwareMessage_init_zero \ 69 | { \ 70 | _meshtastic_HardwareMessage_Type_MIN, 0, 0 \ 71 | } 72 | 73 | /* Field tags (for use in manual encoding/decoding) */ 74 | #define meshtastic_HardwareMessage_type_tag 1 75 | #define meshtastic_HardwareMessage_gpio_mask_tag 2 76 | #define meshtastic_HardwareMessage_gpio_value_tag 3 77 | 78 | /* Struct field encoding specification for nanopb */ 79 | #define meshtastic_HardwareMessage_FIELDLIST(X, a) \ 80 | X(a, STATIC, SINGULAR, UENUM, type, 1) \ 81 | X(a, STATIC, SINGULAR, UINT64, gpio_mask, 2) \ 82 | X(a, STATIC, SINGULAR, UINT64, gpio_value, 3) 83 | #define meshtastic_HardwareMessage_CALLBACK NULL 84 | #define meshtastic_HardwareMessage_DEFAULT NULL 85 | 86 | extern const pb_msgdesc_t meshtastic_HardwareMessage_msg; 87 | 88 | /* Defines for backwards compatibility with code written before nanopb-0.4.0 */ 89 | #define meshtastic_HardwareMessage_fields &meshtastic_HardwareMessage_msg 90 | 91 | /* Maximum encoded size of messages (where known) */ 92 | #define MESHTASTIC_MESHTASTIC_REMOTE_HARDWARE_PB_H_MAX_SIZE meshtastic_HardwareMessage_size 93 | #define meshtastic_HardwareMessage_size 24 94 | 95 | #ifdef __cplusplus 96 | } /* extern "C" */ 97 | #endif 98 | 99 | #endif 100 | -------------------------------------------------------------------------------- /lib/mesh/generated/meshtastic/rtttl.pb.cpp: -------------------------------------------------------------------------------- 1 | /* Automatically generated nanopb constant definitions */ 2 | /* Generated by nanopb-1.0.0-dev */ 3 | 4 | #include "meshtastic/rtttl.pb.h" 5 | #if PB_PROTO_HEADER_VERSION != 40 6 | #error Regenerate this file with the current version of nanopb generator. 7 | #endif 8 | 9 | PB_BIND(meshtastic_RTTTLConfig, meshtastic_RTTTLConfig, AUTO) 10 | -------------------------------------------------------------------------------- /lib/mesh/generated/meshtastic/rtttl.pb.h: -------------------------------------------------------------------------------- 1 | /* Automatically generated nanopb header */ 2 | /* Generated by nanopb-1.0.0-dev */ 3 | 4 | #ifndef PB_MESHTASTIC_MESHTASTIC_RTTTL_PB_H_INCLUDED 5 | #define PB_MESHTASTIC_MESHTASTIC_RTTTL_PB_H_INCLUDED 6 | #include 7 | 8 | #if PB_PROTO_HEADER_VERSION != 40 9 | #error Regenerate this file with the current version of nanopb generator. 10 | #endif 11 | 12 | /* Struct definitions */ 13 | /* Canned message module configuration. */ 14 | typedef struct _meshtastic_RTTTLConfig { 15 | /* Ringtone for PWM Buzzer in RTTTL Format. */ 16 | char ringtone[231]; 17 | } meshtastic_RTTTLConfig; 18 | 19 | #ifdef __cplusplus 20 | extern "C" { 21 | #endif 22 | 23 | /* Initializer values for message structs */ 24 | #define meshtastic_RTTTLConfig_init_default \ 25 | { \ 26 | "" \ 27 | } 28 | #define meshtastic_RTTTLConfig_init_zero \ 29 | { \ 30 | "" \ 31 | } 32 | 33 | /* Field tags (for use in manual encoding/decoding) */ 34 | #define meshtastic_RTTTLConfig_ringtone_tag 1 35 | 36 | /* Struct field encoding specification for nanopb */ 37 | #define meshtastic_RTTTLConfig_FIELDLIST(X, a) X(a, STATIC, SINGULAR, STRING, ringtone, 1) 38 | #define meshtastic_RTTTLConfig_CALLBACK NULL 39 | #define meshtastic_RTTTLConfig_DEFAULT NULL 40 | 41 | extern const pb_msgdesc_t meshtastic_RTTTLConfig_msg; 42 | 43 | /* Defines for backwards compatibility with code written before nanopb-0.4.0 */ 44 | #define meshtastic_RTTTLConfig_fields &meshtastic_RTTTLConfig_msg 45 | 46 | /* Maximum encoded size of messages (where known) */ 47 | #define MESHTASTIC_MESHTASTIC_RTTTL_PB_H_MAX_SIZE meshtastic_RTTTLConfig_size 48 | #define meshtastic_RTTTLConfig_size 233 49 | 50 | #ifdef __cplusplus 51 | } /* extern "C" */ 52 | #endif 53 | 54 | #endif 55 | -------------------------------------------------------------------------------- /lib/mesh/generated/meshtastic/storeforward.pb.cpp: -------------------------------------------------------------------------------- 1 | /* Automatically generated nanopb constant definitions */ 2 | /* Generated by nanopb-1.0.0-dev */ 3 | 4 | #include "meshtastic/storeforward.pb.h" 5 | #if PB_PROTO_HEADER_VERSION != 40 6 | #error Regenerate this file with the current version of nanopb generator. 7 | #endif 8 | 9 | PB_BIND(meshtastic_StoreAndForward, meshtastic_StoreAndForward, AUTO) 10 | 11 | PB_BIND(meshtastic_StoreAndForward_Statistics, meshtastic_StoreAndForward_Statistics, AUTO) 12 | 13 | PB_BIND(meshtastic_StoreAndForward_History, meshtastic_StoreAndForward_History, AUTO) 14 | 15 | PB_BIND(meshtastic_StoreAndForward_Heartbeat, meshtastic_StoreAndForward_Heartbeat, AUTO) 16 | -------------------------------------------------------------------------------- /lib/mesh/generated/meshtastic/storeforward.pb.h: -------------------------------------------------------------------------------- 1 | /* Automatically generated nanopb header */ 2 | /* Generated by nanopb-1.0.0-dev */ 3 | 4 | #ifndef PB_MESHTASTIC_MESHTASTIC_STOREFORWARD_PB_H_INCLUDED 5 | #define PB_MESHTASTIC_MESHTASTIC_STOREFORWARD_PB_H_INCLUDED 6 | #include 7 | 8 | #if PB_PROTO_HEADER_VERSION != 40 9 | #error Regenerate this file with the current version of nanopb generator. 10 | #endif 11 | 12 | /* Enum definitions */ 13 | /* 001 - 063 = From Router 14 | 064 - 127 = From Client */ 15 | typedef enum _meshtastic_StoreAndForward_RequestResponse { 16 | /* Unset/unused */ 17 | meshtastic_StoreAndForward_RequestResponse_UNSET = 0, 18 | /* Router is an in error state. */ 19 | meshtastic_StoreAndForward_RequestResponse_ROUTER_ERROR = 1, 20 | /* Router heartbeat */ 21 | meshtastic_StoreAndForward_RequestResponse_ROUTER_HEARTBEAT = 2, 22 | /* Router has requested the client respond. This can work as a 23 | "are you there" message. */ 24 | meshtastic_StoreAndForward_RequestResponse_ROUTER_PING = 3, 25 | /* The response to a "Ping" */ 26 | meshtastic_StoreAndForward_RequestResponse_ROUTER_PONG = 4, 27 | /* Router is currently busy. Please try again later. */ 28 | meshtastic_StoreAndForward_RequestResponse_ROUTER_BUSY = 5, 29 | /* Router is responding to a request for history. */ 30 | meshtastic_StoreAndForward_RequestResponse_ROUTER_HISTORY = 6, 31 | /* Router is responding to a request for stats. */ 32 | meshtastic_StoreAndForward_RequestResponse_ROUTER_STATS = 7, 33 | /* Router sends a text message from its history that was a direct message. */ 34 | meshtastic_StoreAndForward_RequestResponse_ROUTER_TEXT_DIRECT = 8, 35 | /* Router sends a text message from its history that was a broadcast. */ 36 | meshtastic_StoreAndForward_RequestResponse_ROUTER_TEXT_BROADCAST = 9, 37 | /* Client is an in error state. */ 38 | meshtastic_StoreAndForward_RequestResponse_CLIENT_ERROR = 64, 39 | /* Client has requested a replay from the router. */ 40 | meshtastic_StoreAndForward_RequestResponse_CLIENT_HISTORY = 65, 41 | /* Client has requested stats from the router. */ 42 | meshtastic_StoreAndForward_RequestResponse_CLIENT_STATS = 66, 43 | /* Client has requested the router respond. This can work as a 44 | "are you there" message. */ 45 | meshtastic_StoreAndForward_RequestResponse_CLIENT_PING = 67, 46 | /* The response to a "Ping" */ 47 | meshtastic_StoreAndForward_RequestResponse_CLIENT_PONG = 68, 48 | /* Client has requested that the router abort processing the client's request */ 49 | meshtastic_StoreAndForward_RequestResponse_CLIENT_ABORT = 106 50 | } meshtastic_StoreAndForward_RequestResponse; 51 | 52 | /* Struct definitions */ 53 | /* TODO: REPLACE */ 54 | typedef struct _meshtastic_StoreAndForward_Statistics { 55 | /* Number of messages we have ever seen */ 56 | uint32_t messages_total; 57 | /* Number of messages we have currently saved our history. */ 58 | uint32_t messages_saved; 59 | /* Maximum number of messages we will save */ 60 | uint32_t messages_max; 61 | /* Router uptime in seconds */ 62 | uint32_t up_time; 63 | /* Number of times any client sent a request to the S&F. */ 64 | uint32_t requests; 65 | /* Number of times the history was requested. */ 66 | uint32_t requests_history; 67 | /* Is the heartbeat enabled on the server? */ 68 | bool heartbeat; 69 | /* Maximum number of messages the server will return. */ 70 | uint32_t return_max; 71 | /* Maximum history window in minutes the server will return messages from. */ 72 | uint32_t return_window; 73 | } meshtastic_StoreAndForward_Statistics; 74 | 75 | /* TODO: REPLACE */ 76 | typedef struct _meshtastic_StoreAndForward_History { 77 | /* Number of that will be sent to the client */ 78 | uint32_t history_messages; 79 | /* The window of messages that was used to filter the history client requested */ 80 | uint32_t window; 81 | /* Index in the packet history of the last message sent in a previous request to the server. 82 | Will be sent to the client before sending the history and can be set in a subsequent request to avoid getting packets the server 83 | already sent to the client. */ 84 | uint32_t last_request; 85 | } meshtastic_StoreAndForward_History; 86 | 87 | /* TODO: REPLACE */ 88 | typedef struct _meshtastic_StoreAndForward_Heartbeat { 89 | /* Period in seconds that the heartbeat is sent out that will be sent to the client */ 90 | uint32_t period; 91 | /* If set, this is not the primary Store & Forward router on the mesh */ 92 | uint32_t secondary; 93 | } meshtastic_StoreAndForward_Heartbeat; 94 | 95 | typedef PB_BYTES_ARRAY_T(233) meshtastic_StoreAndForward_text_t; 96 | /* TODO: REPLACE */ 97 | typedef struct _meshtastic_StoreAndForward { 98 | /* TODO: REPLACE */ 99 | meshtastic_StoreAndForward_RequestResponse rr; 100 | pb_size_t which_variant; 101 | union _meshtastic_StoreAndForward_variant { 102 | /* TODO: REPLACE */ 103 | meshtastic_StoreAndForward_Statistics stats; 104 | /* TODO: REPLACE */ 105 | meshtastic_StoreAndForward_History history; 106 | /* TODO: REPLACE */ 107 | meshtastic_StoreAndForward_Heartbeat heartbeat; 108 | /* Text from history message. */ 109 | meshtastic_StoreAndForward_text_t text; 110 | } variant; 111 | } meshtastic_StoreAndForward; 112 | 113 | #ifdef __cplusplus 114 | extern "C" { 115 | #endif 116 | 117 | /* Helper constants for enums */ 118 | #define _meshtastic_StoreAndForward_RequestResponse_MIN meshtastic_StoreAndForward_RequestResponse_UNSET 119 | #define _meshtastic_StoreAndForward_RequestResponse_MAX meshtastic_StoreAndForward_RequestResponse_CLIENT_ABORT 120 | #define _meshtastic_StoreAndForward_RequestResponse_ARRAYSIZE \ 121 | ((meshtastic_StoreAndForward_RequestResponse)(meshtastic_StoreAndForward_RequestResponse_CLIENT_ABORT + 1)) 122 | 123 | #define meshtastic_StoreAndForward_rr_ENUMTYPE meshtastic_StoreAndForward_RequestResponse 124 | 125 | /* Initializer values for message structs */ 126 | #define meshtastic_StoreAndForward_init_default \ 127 | { \ 128 | _meshtastic_StoreAndForward_RequestResponse_MIN, 0, \ 129 | { \ 130 | meshtastic_StoreAndForward_Statistics_init_default \ 131 | } \ 132 | } 133 | #define meshtastic_StoreAndForward_Statistics_init_default \ 134 | { \ 135 | 0, 0, 0, 0, 0, 0, 0, 0, 0 \ 136 | } 137 | #define meshtastic_StoreAndForward_History_init_default \ 138 | { \ 139 | 0, 0, 0 \ 140 | } 141 | #define meshtastic_StoreAndForward_Heartbeat_init_default \ 142 | { \ 143 | 0, 0 \ 144 | } 145 | #define meshtastic_StoreAndForward_init_zero \ 146 | { \ 147 | _meshtastic_StoreAndForward_RequestResponse_MIN, 0, \ 148 | { \ 149 | meshtastic_StoreAndForward_Statistics_init_zero \ 150 | } \ 151 | } 152 | #define meshtastic_StoreAndForward_Statistics_init_zero \ 153 | { \ 154 | 0, 0, 0, 0, 0, 0, 0, 0, 0 \ 155 | } 156 | #define meshtastic_StoreAndForward_History_init_zero \ 157 | { \ 158 | 0, 0, 0 \ 159 | } 160 | #define meshtastic_StoreAndForward_Heartbeat_init_zero \ 161 | { \ 162 | 0, 0 \ 163 | } 164 | 165 | /* Field tags (for use in manual encoding/decoding) */ 166 | #define meshtastic_StoreAndForward_Statistics_messages_total_tag 1 167 | #define meshtastic_StoreAndForward_Statistics_messages_saved_tag 2 168 | #define meshtastic_StoreAndForward_Statistics_messages_max_tag 3 169 | #define meshtastic_StoreAndForward_Statistics_up_time_tag 4 170 | #define meshtastic_StoreAndForward_Statistics_requests_tag 5 171 | #define meshtastic_StoreAndForward_Statistics_requests_history_tag 6 172 | #define meshtastic_StoreAndForward_Statistics_heartbeat_tag 7 173 | #define meshtastic_StoreAndForward_Statistics_return_max_tag 8 174 | #define meshtastic_StoreAndForward_Statistics_return_window_tag 9 175 | #define meshtastic_StoreAndForward_History_history_messages_tag 1 176 | #define meshtastic_StoreAndForward_History_window_tag 2 177 | #define meshtastic_StoreAndForward_History_last_request_tag 3 178 | #define meshtastic_StoreAndForward_Heartbeat_period_tag 1 179 | #define meshtastic_StoreAndForward_Heartbeat_secondary_tag 2 180 | #define meshtastic_StoreAndForward_rr_tag 1 181 | #define meshtastic_StoreAndForward_stats_tag 2 182 | #define meshtastic_StoreAndForward_history_tag 3 183 | #define meshtastic_StoreAndForward_heartbeat_tag 4 184 | #define meshtastic_StoreAndForward_text_tag 5 185 | 186 | /* Struct field encoding specification for nanopb */ 187 | #define meshtastic_StoreAndForward_FIELDLIST(X, a) \ 188 | X(a, STATIC, SINGULAR, UENUM, rr, 1) \ 189 | X(a, STATIC, ONEOF, MESSAGE, (variant, stats, variant.stats), 2) \ 190 | X(a, STATIC, ONEOF, MESSAGE, (variant, history, variant.history), 3) \ 191 | X(a, STATIC, ONEOF, MESSAGE, (variant, heartbeat, variant.heartbeat), 4) \ 192 | X(a, STATIC, ONEOF, BYTES, (variant, text, variant.text), 5) 193 | #define meshtastic_StoreAndForward_CALLBACK NULL 194 | #define meshtastic_StoreAndForward_DEFAULT NULL 195 | #define meshtastic_StoreAndForward_variant_stats_MSGTYPE meshtastic_StoreAndForward_Statistics 196 | #define meshtastic_StoreAndForward_variant_history_MSGTYPE meshtastic_StoreAndForward_History 197 | #define meshtastic_StoreAndForward_variant_heartbeat_MSGTYPE meshtastic_StoreAndForward_Heartbeat 198 | 199 | #define meshtastic_StoreAndForward_Statistics_FIELDLIST(X, a) \ 200 | X(a, STATIC, SINGULAR, UINT32, messages_total, 1) \ 201 | X(a, STATIC, SINGULAR, UINT32, messages_saved, 2) \ 202 | X(a, STATIC, SINGULAR, UINT32, messages_max, 3) \ 203 | X(a, STATIC, SINGULAR, UINT32, up_time, 4) \ 204 | X(a, STATIC, SINGULAR, UINT32, requests, 5) \ 205 | X(a, STATIC, SINGULAR, UINT32, requests_history, 6) \ 206 | X(a, STATIC, SINGULAR, BOOL, heartbeat, 7) \ 207 | X(a, STATIC, SINGULAR, UINT32, return_max, 8) \ 208 | X(a, STATIC, SINGULAR, UINT32, return_window, 9) 209 | #define meshtastic_StoreAndForward_Statistics_CALLBACK NULL 210 | #define meshtastic_StoreAndForward_Statistics_DEFAULT NULL 211 | 212 | #define meshtastic_StoreAndForward_History_FIELDLIST(X, a) \ 213 | X(a, STATIC, SINGULAR, UINT32, history_messages, 1) \ 214 | X(a, STATIC, SINGULAR, UINT32, window, 2) \ 215 | X(a, STATIC, SINGULAR, UINT32, last_request, 3) 216 | #define meshtastic_StoreAndForward_History_CALLBACK NULL 217 | #define meshtastic_StoreAndForward_History_DEFAULT NULL 218 | 219 | #define meshtastic_StoreAndForward_Heartbeat_FIELDLIST(X, a) \ 220 | X(a, STATIC, SINGULAR, UINT32, period, 1) \ 221 | X(a, STATIC, SINGULAR, UINT32, secondary, 2) 222 | #define meshtastic_StoreAndForward_Heartbeat_CALLBACK NULL 223 | #define meshtastic_StoreAndForward_Heartbeat_DEFAULT NULL 224 | 225 | extern const pb_msgdesc_t meshtastic_StoreAndForward_msg; 226 | extern const pb_msgdesc_t meshtastic_StoreAndForward_Statistics_msg; 227 | extern const pb_msgdesc_t meshtastic_StoreAndForward_History_msg; 228 | extern const pb_msgdesc_t meshtastic_StoreAndForward_Heartbeat_msg; 229 | 230 | /* Defines for backwards compatibility with code written before nanopb-0.4.0 */ 231 | #define meshtastic_StoreAndForward_fields &meshtastic_StoreAndForward_msg 232 | #define meshtastic_StoreAndForward_Statistics_fields &meshtastic_StoreAndForward_Statistics_msg 233 | #define meshtastic_StoreAndForward_History_fields &meshtastic_StoreAndForward_History_msg 234 | #define meshtastic_StoreAndForward_Heartbeat_fields &meshtastic_StoreAndForward_Heartbeat_msg 235 | 236 | /* Maximum encoded size of messages (where known) */ 237 | #define MESHTASTIC_MESHTASTIC_STOREFORWARD_PB_H_MAX_SIZE meshtastic_StoreAndForward_size 238 | #define meshtastic_StoreAndForward_Heartbeat_size 12 239 | #define meshtastic_StoreAndForward_History_size 18 240 | #define meshtastic_StoreAndForward_Statistics_size 50 241 | #define meshtastic_StoreAndForward_size 238 242 | 243 | #ifdef __cplusplus 244 | } /* extern "C" */ 245 | #endif 246 | 247 | #endif 248 | -------------------------------------------------------------------------------- /lib/mesh/generated/meshtastic/telemetry.pb.cpp: -------------------------------------------------------------------------------- 1 | /* Automatically generated nanopb constant definitions */ 2 | /* Generated by nanopb-1.0.0-dev */ 3 | 4 | #include "meshtastic/telemetry.pb.h" 5 | #if PB_PROTO_HEADER_VERSION != 40 6 | #error Regenerate this file with the current version of nanopb generator. 7 | #endif 8 | 9 | PB_BIND(meshtastic_DeviceMetrics, meshtastic_DeviceMetrics, AUTO) 10 | 11 | PB_BIND(meshtastic_EnvironmentMetrics, meshtastic_EnvironmentMetrics, AUTO) 12 | 13 | PB_BIND(meshtastic_PowerMetrics, meshtastic_PowerMetrics, AUTO) 14 | 15 | PB_BIND(meshtastic_AirQualityMetrics, meshtastic_AirQualityMetrics, AUTO) 16 | 17 | PB_BIND(meshtastic_LocalStats, meshtastic_LocalStats, AUTO) 18 | 19 | PB_BIND(meshtastic_HealthMetrics, meshtastic_HealthMetrics, AUTO) 20 | 21 | PB_BIND(meshtastic_HostMetrics, meshtastic_HostMetrics, 2) 22 | 23 | PB_BIND(meshtastic_Telemetry, meshtastic_Telemetry, 2) 24 | 25 | PB_BIND(meshtastic_Nau7802Config, meshtastic_Nau7802Config, AUTO) 26 | -------------------------------------------------------------------------------- /lib/mesh/generated/meshtastic/xmodem.pb.cpp: -------------------------------------------------------------------------------- 1 | /* Automatically generated nanopb constant definitions */ 2 | /* Generated by nanopb-1.0.0-dev */ 3 | 4 | #include "meshtastic/xmodem.pb.h" 5 | #if PB_PROTO_HEADER_VERSION != 40 6 | #error Regenerate this file with the current version of nanopb generator. 7 | #endif 8 | 9 | PB_BIND(meshtastic_XModem, meshtastic_XModem, AUTO) 10 | -------------------------------------------------------------------------------- /lib/mesh/generated/meshtastic/xmodem.pb.h: -------------------------------------------------------------------------------- 1 | /* Automatically generated nanopb header */ 2 | /* Generated by nanopb-1.0.0-dev */ 3 | 4 | #ifndef PB_MESHTASTIC_MESHTASTIC_XMODEM_PB_H_INCLUDED 5 | #define PB_MESHTASTIC_MESHTASTIC_XMODEM_PB_H_INCLUDED 6 | #include 7 | 8 | #if PB_PROTO_HEADER_VERSION != 40 9 | #error Regenerate this file with the current version of nanopb generator. 10 | #endif 11 | 12 | /* Enum definitions */ 13 | typedef enum _meshtastic_XModem_Control { 14 | meshtastic_XModem_Control_NUL = 0, 15 | meshtastic_XModem_Control_SOH = 1, 16 | meshtastic_XModem_Control_STX = 2, 17 | meshtastic_XModem_Control_EOT = 4, 18 | meshtastic_XModem_Control_ACK = 6, 19 | meshtastic_XModem_Control_NAK = 21, 20 | meshtastic_XModem_Control_CAN = 24, 21 | meshtastic_XModem_Control_CTRLZ = 26 22 | } meshtastic_XModem_Control; 23 | 24 | /* Struct definitions */ 25 | typedef PB_BYTES_ARRAY_T(128) meshtastic_XModem_buffer_t; 26 | typedef struct _meshtastic_XModem { 27 | meshtastic_XModem_Control control; 28 | uint16_t seq; 29 | uint16_t crc16; 30 | meshtastic_XModem_buffer_t buffer; 31 | } meshtastic_XModem; 32 | 33 | #ifdef __cplusplus 34 | extern "C" { 35 | #endif 36 | 37 | /* Helper constants for enums */ 38 | #define _meshtastic_XModem_Control_MIN meshtastic_XModem_Control_NUL 39 | #define _meshtastic_XModem_Control_MAX meshtastic_XModem_Control_CTRLZ 40 | #define _meshtastic_XModem_Control_ARRAYSIZE ((meshtastic_XModem_Control)(meshtastic_XModem_Control_CTRLZ + 1)) 41 | 42 | #define meshtastic_XModem_control_ENUMTYPE meshtastic_XModem_Control 43 | 44 | /* Initializer values for message structs */ 45 | #define meshtastic_XModem_init_default \ 46 | { \ 47 | _meshtastic_XModem_Control_MIN, 0, 0, \ 48 | { \ 49 | 0, \ 50 | { \ 51 | 0 \ 52 | } \ 53 | } \ 54 | } 55 | #define meshtastic_XModem_init_zero \ 56 | { \ 57 | _meshtastic_XModem_Control_MIN, 0, 0, \ 58 | { \ 59 | 0, \ 60 | { \ 61 | 0 \ 62 | } \ 63 | } \ 64 | } 65 | 66 | /* Field tags (for use in manual encoding/decoding) */ 67 | #define meshtastic_XModem_control_tag 1 68 | #define meshtastic_XModem_seq_tag 2 69 | #define meshtastic_XModem_crc16_tag 3 70 | #define meshtastic_XModem_buffer_tag 4 71 | 72 | /* Struct field encoding specification for nanopb */ 73 | #define meshtastic_XModem_FIELDLIST(X, a) \ 74 | X(a, STATIC, SINGULAR, UENUM, control, 1) \ 75 | X(a, STATIC, SINGULAR, UINT32, seq, 2) \ 76 | X(a, STATIC, SINGULAR, UINT32, crc16, 3) \ 77 | X(a, STATIC, SINGULAR, BYTES, buffer, 4) 78 | #define meshtastic_XModem_CALLBACK NULL 79 | #define meshtastic_XModem_DEFAULT NULL 80 | 81 | extern const pb_msgdesc_t meshtastic_XModem_msg; 82 | 83 | /* Defines for backwards compatibility with code written before nanopb-0.4.0 */ 84 | #define meshtastic_XModem_fields &meshtastic_XModem_msg 85 | 86 | /* Maximum encoded size of messages (where known) */ 87 | #define MESHTASTIC_MESHTASTIC_XMODEM_PB_H_MAX_SIZE meshtastic_XModem_size 88 | #define meshtastic_XModem_size 141 89 | 90 | #ifdef __cplusplus 91 | } /* extern "C" */ 92 | #endif 93 | 94 | #endif 95 | -------------------------------------------------------------------------------- /lib/mesh/mesh-pb-constants.cpp: -------------------------------------------------------------------------------- 1 | #include "mesh-pb-constants.h" 2 | //@Ve #include "FSCommon.h" 3 | //#include "configuration.h" 4 | #include 5 | #include 6 | #include 7 | #include 8 | 9 | /// helper function for encoding a record as a protobuf, any failures to encode are fatal and we will panic 10 | /// returns the encoded packet size 11 | size_t pb_encode_to_bytes(uint8_t *destbuf, size_t destbufsize, const pb_msgdesc_t *fields, const void *src_struct) 12 | { 13 | pb_ostream_t stream = pb_ostream_from_buffer(destbuf, destbufsize); 14 | if (!pb_encode(&stream, fields, src_struct)) { 15 | //@Ve LOG_ERROR("Panic: can't encode protobuf reason='%s'\n", PB_GET_ERROR(&stream)); 16 | assert( 17 | 0); // If this assert fails it probably means you made a field too large for the max limits specified in mesh.options 18 | } else { 19 | return stream.bytes_written; 20 | } 21 | } 22 | 23 | /// helper function for decoding a record as a protobuf, we will return false if the decoding failed 24 | bool pb_decode_from_bytes(const uint8_t *srcbuf, size_t srcbufsize, const pb_msgdesc_t *fields, void *dest_struct) 25 | { 26 | pb_istream_t stream = pb_istream_from_buffer(srcbuf, srcbufsize); 27 | if (!pb_decode(&stream, fields, dest_struct)) { 28 | //@Ve LOG_ERROR("Can't decode protobuf reason='%s', pb_msgdesc %p\n", PB_GET_ERROR(&stream), fields); 29 | return false; 30 | } else { 31 | return true; 32 | } 33 | } 34 | 35 | #ifdef FSCom 36 | /// Read from an Arduino File 37 | bool readcb(pb_istream_t *stream, uint8_t *buf, size_t count) 38 | { 39 | bool status = false; 40 | File *file = (File *)stream->state; 41 | 42 | if (buf == NULL) { 43 | while (count-- && file->read() != EOF) 44 | ; 45 | return count == 0; 46 | } 47 | 48 | status = (file->read(buf, count) == (int)count); 49 | 50 | if (file->available() == 0) 51 | stream->bytes_left = 0; 52 | 53 | return status; 54 | } 55 | 56 | /// Write to an arduino file 57 | bool writecb(pb_ostream_t *stream, const uint8_t *buf, size_t count) 58 | { 59 | File *file = (File *)stream->state; 60 | // LOG_DEBUG("writing %d bytes to protobuf file\n", count); 61 | return file->write(buf, count) == count; 62 | } 63 | #endif 64 | 65 | bool is_in_helper(uint32_t n, const uint32_t *array, pb_size_t count) 66 | { 67 | for (pb_size_t i = 0; i < count; i++) 68 | if (array[i] == n) 69 | return true; 70 | 71 | return false; 72 | } 73 | -------------------------------------------------------------------------------- /lib/mesh/mesh-pb-constants.h: -------------------------------------------------------------------------------- 1 | #pragma once 2 | #include 3 | 4 | #include "mesh/generated/meshtastic/admin.pb.h" 5 | #include "mesh/generated/meshtastic/deviceonly.pb.h" 6 | #include "mesh/generated/meshtastic/localonly.pb.h" 7 | #include "mesh/generated/meshtastic/mesh.pb.h" 8 | 9 | // this file defines constants which come from mesh.options 10 | 11 | // Tricky macro to let you find the sizeof a type member 12 | #define member_size(type, member) sizeof(((type *)0)->member) 13 | 14 | /// max number of packets which can be waiting for delivery to android - note, this value comes from mesh.options protobuf 15 | // FIXME - max_count is actually 32 but we save/load this as one long string of preencoded MeshPacket bytes - not a big array in 16 | // RAM #define MAX_RX_TOPHONE (member_size(DeviceState, receive_queue) / member_size(DeviceState, receive_queue[0])) 17 | #ifndef MAX_RX_TOPHONE 18 | #define MAX_RX_TOPHONE 32 19 | #endif 20 | 21 | /// max number of nodes allowed in the mesh 22 | #ifndef MAX_NUM_NODES 23 | #define MAX_NUM_NODES 100 24 | #endif 25 | 26 | /// Max number of channels allowed 27 | #define MAX_NUM_CHANNELS (member_size(meshtastic_ChannelFile, channels) / member_size(meshtastic_ChannelFile, channels[0])) 28 | 29 | /// helper function for encoding a record as a protobuf, any failures to encode are fatal and we will panic 30 | /// returns the encoded packet size 31 | size_t pb_encode_to_bytes(uint8_t *destbuf, size_t destbufsize, const pb_msgdesc_t *fields, const void *src_struct); 32 | 33 | /// helper function for decoding a record as a protobuf, we will return false if the decoding failed 34 | bool pb_decode_from_bytes(const uint8_t *srcbuf, size_t srcbufsize, const pb_msgdesc_t *fields, void *dest_struct); 35 | 36 | /// Read from an Arduino File 37 | bool readcb(pb_istream_t *stream, uint8_t *buf, size_t count); 38 | 39 | /// Write to an arduino file 40 | bool writecb(pb_ostream_t *stream, const uint8_t *buf, size_t count); 41 | 42 | /** is_in_repeated is a macro/function that returns true if a specified word appears in a repeated protobuf array. 43 | * It relies on the following naming conventions from nanopb: 44 | * 45 | * pb_size_t ignore_incoming_count; 46 | * uint32_t ignore_incoming[3]; 47 | */ 48 | bool is_in_helper(uint32_t n, const uint32_t *array, pb_size_t count); 49 | 50 | #define is_in_repeated(name, n) is_in_helper(n, name, name##_count) -------------------------------------------------------------------------------- /platformio.ini: -------------------------------------------------------------------------------- 1 | ; PlatformIO Project Configuration File 2 | ; 3 | ; Build options: build flags, source filter 4 | ; Upload options: custom upload port, speed and extra flags 5 | ; Library options: dependencies, extra library storages 6 | ; Advanced options: extra scripting 7 | ; 8 | ; Please visit documentation for the other options and examples 9 | ; https://docs.platformio.org/page/projectconf.html 10 | 11 | [platformio] 12 | default_envs = native-mui 13 | 14 | [device-ui_base] 15 | lib_deps = 16 | https://github.com/meshtastic/device-ui/archive/405ca495322b7dc3b61f7588d28267d49b2ebc38.zip 17 | nanopb/Nanopb@^0.4.91 18 | 19 | 20 | [env] 21 | platform = espressif32@6.9.0 22 | framework = arduino 23 | upload_protocol = esp-builtin 24 | board_build.filesystem = littlefs 25 | extra_scripts = ./bin/littlefsbuilder.py 26 | build_type = release 27 | build_flags = -std=c++17 -Os 28 | -DCORE_DEBUG_LEVEL=ARDUHAL_LOG_LEVEL_VERBOSE 29 | -DLOG_LOCAL_LEVEL=ESP_LOG_VERBOSE 30 | -DCONFIG_ARDUHAL_ESP_LOG 31 | -DCONFIG_ARDUHAL_LOG_COLORS=1 32 | -DLV_LVGL_H_INCLUDE_SIMPLE 33 | -DLV_CONF_INCLUDE_SIMPLE 34 | -DLV_COMP_CONF_INCLUDE_SIMPLE 35 | -DLV_BUILD_TEST=0 36 | -I src 37 | -I src/mesh/generated 38 | lib_deps = 39 | ${device-ui_base.lib_deps} 40 | lovyan03/LovyanGFX@1.2.0 41 | 42 | [env:wt32-sc01-plus-mui] 43 | board = wt32-sc01-plus 44 | board_build.partitions = default_16MB.csv 45 | build_type = release 46 | build_flags = ${env.build_flags} -O2 47 | -D ARCH_ESP32 48 | -D WT32_SC01 49 | -D USE_ILOG 50 | -D LV_USE_LOG=0 51 | -D USE_SERIAL2 52 | -D WAIT_FOR_SERIAL0 53 | -D SERIAL_RX=10 54 | -D SERIAL_TX=11 55 | -D HAS_TFT=1 56 | -D RAM_SIZE=1560 57 | -D LV_CACHE_DEF_SIZE=1179648 58 | -D DISPLAY_SET_RESOLUTION 59 | -D LGFX_DRIVER=LGFX_WT_SC01_PLUS 60 | -D VIEW_320x240 61 | -D LV_USE_SYSMON=0 62 | -D LV_USE_PROFILER=0 63 | -D LV_USE_PERF_MONITOR=0 64 | -D LV_USE_MEM_MONITOR=0 65 | -D DONT_USE_ESP_TIMER 66 | -D HAS_SDCARD 67 | -D SDCARD_USE_SPI1 68 | -D SD_SPI_FREQUENCY=10000000 69 | -D MAP_FULL_REDRAW 70 | ;-D USE_LANDSCAPE 71 | -I lib 72 | -I lib/mesh/generated 73 | -I variants/wt32-sc01-plus 74 | build_src_filter = ${env.build_src_filter} 75 | +<../lib/mesh> 76 | lib_deps = ${env.lib_deps} 77 | LittleFS 78 | 79 | ; CYD original - this is the variant from Sunton store 80 | [env:cyd-2432S028-rv1-mui] 81 | board = esp32dev 82 | board_build.partitions = huge_app.csv 83 | upload_protocol = esptool 84 | build_flags = ${env.build_flags} -Wl,-Map,output.map -fno-omit-frame-pointer 85 | -D ARCH_ESP32 86 | -D ESP32_2432S028RV1 87 | -D USE_ILOG 88 | -D LV_USE_LOG=0 89 | -D WAKE_ON_SERIAL 90 | -D USE_SERIAL0 ; for header P1 power supply base (no debug output) 91 | ; -D SERIAL_RX=35 ; header P3 extended I/O (use with SERIAL1/2 for debugging) 92 | ; -D SERIAL_TX=22 ; header P3 extended I/O 93 | -D SERIAL_RX=3 ; header P1 power supply base (use with SERIAL0 in "production") 94 | -D SERIAL_TX=1 ; header P1 power supply base 95 | ; -D CALIBRATE_TOUCH=0 96 | -D LV_USE_PERF_MONITOR=0 97 | -D LV_USE_MEM_MONITOR=0 98 | -D HAS_TFT=1 99 | -D RAM_SIZE=96 100 | -D LGFX_DRIVER=LGFX_ESP2432S028RV1 101 | -D VIEW_320x240 102 | -I lib 103 | -I lib/mesh/generated 104 | -I variants/esp32_2432S028R 105 | build_src_filter = ${env.build_src_filter} 106 | +<../lib/mesh> 107 | lib_deps = ${env.lib_deps} 108 | LittleFS 109 | 110 | ; CYD clone - this is the variant from Estardyn store with USB-C 111 | [env:cyd-2432S028-rv2-mui] 112 | board = esp32dev 113 | board_build.partitions = huge_app.csv 114 | upload_protocol = esptool 115 | build_flags = ${env.build_flags} -Wl,-Map,output.map -fno-omit-frame-pointer 116 | -D ARCH_ESP32 117 | -D ESP32_2432S028RV2 118 | -D USE_ILOG 119 | -D LV_USE_LOG=0 120 | -D WAKE_ON_SERIAL 121 | -D USE_SERIAL0 ; Serial0 is for debug output 122 | ; -D SERIAL_RX=35 ; header P3 extended I/O (use with SERIAL1/2 for debugging) 123 | ; -D SERIAL_TX=22 ; header P3 extended I/O 124 | -D SERIAL_RX=3 ; header P1 power supply base (use with SERIAL0 in "production") 125 | -D SERIAL_TX=1 ; header P1 power supply base 126 | ; -D CALIBRATE_TOUCH=1 127 | -D LV_USE_PERF_MONITOR=1 128 | -D LV_USE_MEM_MONITOR=1 129 | -D RAM_SIZE=96 130 | -D HAS_TFT=1 131 | -D LGFX_DRIVER=LGFX_ESP2432S028RV2 132 | -D VIEW_320x240 133 | -I lib 134 | -I lib/mesh/generated 135 | -I variants/esp32_2432S028R 136 | build_src_filter = ${env.build_src_filter} 137 | +<../lib/mesh> 138 | lib_deps = ${env.lib_deps} 139 | LittleFS 140 | 141 | ; CYD 2.2inch variant - with MCU8080 ST7789 8bit parallel interface 142 | [env:cyd-2432S022-mui] 143 | board = esp32dev 144 | upload_protocol = esptool 145 | build_flags = ${env.build_flags} -Wl,-Map,output.map -fno-omit-frame-pointer 146 | -D ARCH_ESP32 147 | -D ESP32_2432S022 148 | -D USE_ILOG 149 | -D LV_USE_LOG=0 150 | -D WAKE_ON_SERIAL 151 | -D USE_SERIAL2 ; Serial0 is for debug output 152 | ; -D SERIAL_RX=35 ; header P3 extended I/O (use with SERIAL1/2 for debugging) 153 | ; -D SERIAL_TX=22 ; header P3 extended I/O 154 | ; -D SERIAL_RX=3 ; header P1 power supply base (use with SERIAL0 in "production") 155 | ; -D SERIAL_TX=1 ; header P1 power supply base 156 | -D CALIBRATE_TOUCH=0 157 | -D LV_USE_PERF_MONITOR=0 158 | -D LV_USE_MEM_MONITOR=0 159 | -D LV_LOG_LEVEL=LV_LOG_LEVEL_TRACE 160 | -D RAM_SIZE=96 161 | -D HAS_TFT=1 162 | -D LGFX_DRIVER=LGFX_ESP2432S022 163 | -D BUFFER_LINES=100 164 | -D VIEW_320x240 165 | -I lib 166 | -I lib/mesh/generated 167 | build_src_filter = ${env.build_src_filter} 168 | +<../lib/mesh> 169 | lib_deps = ${env.lib_deps} 170 | LittleFS 171 | 172 | [env:diy-nodemcu-ili9341-mui] ; diy project with nodemcu dev board and ILI9341 TFT touch display 173 | board = nodemcu-32s 174 | ;platform_packages = espressif/toolchain-xtensa-esp32@12.2.0+20230208 175 | upload_protocol = esptool 176 | build_flags = ${env.build_flags} -Os -Wl,-Map,output.map -fno-omit-frame-pointer 177 | -D ARCH_ESP32 178 | -D NODEMCU_32S 179 | -D USE_ILOG 180 | -D LV_USE_LOG=0 181 | -D USE_SERIAL2 182 | ; -D SERIAL_RX=16 183 | ; -D SERIAL_TX=17 184 | ; -D CALIBRATE_TOUCH=0 185 | -D RAM_SIZE=56 186 | -D HAS_TFT=1 187 | -D LGFX_DRIVER=LGFX_ESPILI9341XPT2046 188 | -D VIEW_320x240 189 | -I lib 190 | -I lib/mesh/generated 191 | build_src_filter = ${env.build_src_filter} 192 | +<../lib/mesh> 193 | lib_deps = ${env.lib_deps} 194 | LittleFS 195 | 196 | [env:diy-s2-mini-st7789-mui] 197 | board = lolin_s2_mini 198 | board_build.partitions = huge_app.csv 199 | # Name, Type, SubType, Offset, Size, Flags 200 | # nvs, data, nvs, 0x9000, 0x5000, 201 | # otadata, data, ota, 0xe000, 0x2000, 202 | # app0, app, ota_0, 0x10000, 0x300000, 203 | # spiffs, data, spiffs, 0x310000,0xE0000, 204 | # coredump, data, coredump,0x3F0000,0x10000, 205 | upload_protocol = esptool 206 | 207 | build_flags = ${env.build_flags} -Os -Wl,-Map,output.map -fno-omit-frame-pointer 208 | -D ARCH_ESP32 209 | -D TINY_S3 210 | -D USE_ILOG 211 | -D USE_SERIAL2 212 | ; -D SERIAL_RX=16 213 | ; -D SERIAL_TX=17 214 | -D RAM_SIZE=1024 215 | -D HAS_TFT=1 216 | -D LV_USE_LOG=0 217 | -D LV_USE_SYSMON=0 218 | -D LV_USE_PROFILER=0 219 | -D LV_USE_PERF_MONITOR=0 220 | -D LV_USE_MEM_MONITOR=0 221 | -D LGFX_DRIVER_TEMPLATE 222 | -D LGFX_DRIVER=LGFX_GENERIC 223 | -D LGFX_PANEL=ST7789 224 | -D LGFX_OFFSET_ROTATION=1 225 | -D LGFX_TOUCH=XPT2046 226 | -D LGFX_PIN_SCK=7 227 | -D LGFX_PIN_MOSI=11 228 | -D LGFX_PIN_MISO=9 229 | -D LGFX_PIN_CS=12 230 | -D LGFX_PIN_DC=3 231 | -D LGFX_PIN_RST=4 232 | -D LGFX_PIN_BL=16 233 | -D LGFX_TOUCH_INT=-1 234 | -D LGFX_TOUCH_CS=-1 235 | -D LGFX_TOUCH_CLK=-1 236 | -D LGFX_TOUCH_DO=-1 237 | -D LGFX_TOUCH_DIN=-1 238 | -D LGFX_TOUCH_X_MIN=300 239 | -D LGFX_TOUCH_X_MAX=3900 240 | -D LGFX_TOUCH_Y_MIN=400 241 | -D LGFX_TOUCH_Y_MAX=3900 242 | -D VIEW_320x240 243 | -I lib 244 | -I lib/mesh/generated 245 | build_src_filter = ${env.build_src_filter} 246 | +<../lib/mesh> 247 | lib_deps = ${env.lib_deps} 248 | LittleFS 249 | 250 | 251 | [env:t-hmi-mui] 252 | board = lilygo-t-hmi 253 | board_build.partitions = default_16MB.csv 254 | upload_protocol = esptool 255 | build_flags = ${env.build_flags} -fno-omit-frame-pointer 256 | -D ARCH_ESP32 257 | -D T_HMI 258 | -D USE_ILOG 259 | -D LV_USE_LOG=0 260 | ;-D WAIT_FOR_SERIAL0 261 | ;-D WAKE_ON_SERIAL 262 | -D USE_SERIAL1 263 | -D SERIAL_RX=15 264 | -D SERIAL_TX=16 265 | -D BUTTON_PIN=0 266 | -D INPUTDRIVER_BUTTON_TYPE=0 267 | -D PWR_ON_PIN=14 268 | -D PWR_EN_PIN=10 269 | -D HAS_SDCARD 270 | -D HAS_SD_MMC 271 | -D MAP_FULL_REDRAW 272 | -D SD_SCLK_PIN=12 273 | -D SD_MISO_PIN=13 274 | -D SD_MOSI_PIN=11 275 | -D BOARD_MAX_SDMMC_FREQ=56000 276 | -D HAS_TFT=1 277 | -D RAM_SIZE=5120 278 | -D LV_USE_SYSMON=0 279 | -D LV_USE_PROFILER=0 280 | -D LV_USE_PERF_MONITOR=0 281 | -D LV_USE_MEM_MONITOR=0 282 | -D DONT_USE_ESP_TIMER 283 | -D LGFX_DRIVER=LGFX_T_HMI 284 | -D VIEW_320x240 285 | -I lib 286 | -I lib/mesh/generated 287 | build_src_filter = ${env.build_src_filter} 288 | +<../lib/mesh> 289 | lib_deps = ${env.lib_deps} 290 | LittleFS 291 | 292 | [env:t-deck-mui] 293 | board = t-deck 294 | board_build.partitions = default_16MB.csv 295 | build_flags = ${env.build_flags} 296 | -D ARCH_ESP32 297 | -D T_DECK 298 | -D USE_ILOG 299 | -D USE_DUMMY_SERIAL 300 | -D CALIBRATE_TOUCH=0 301 | -D KB_POWERON=10 302 | -D HAS_TFT=1 303 | -D RAM_SIZE=5120 304 | -D LGFX_DRIVER=LGFX_TDECK 305 | -D VIEW_320x240 306 | -I lib 307 | -I lib/mesh/generated 308 | -I variants/t-deck 309 | build_src_filter = ${env.build_src_filter} 310 | +<../lib/mesh> 311 | lib_deps = ${env.lib_deps} 312 | LittleFS 313 | 314 | [env:t-watch-s3-mui] 315 | board = t-watch-s3 316 | board_build.partitions = default_16MB.csv 317 | upload_protocol = esptool 318 | build_flags = ${env.build_flags} 319 | -D ARCH_ESP32 320 | -D T_WATCH_S3 321 | -D USE_ILOG 322 | -D USE_DUMMY_SERIAL 323 | -D HAS_TFT=1 324 | -D RAM_SIZE=512 325 | -D LGFX_DRIVER=LGFX_TWATCH_S3 326 | -D VIEW_240x240 327 | -D TFT_BL=45 328 | -I lib 329 | -I lib/mesh/generated 330 | -I variants/t-watch-s3 331 | build_src_filter = ${env.build_src_filter} 332 | +<../lib/mesh> 333 | lib_deps = ${env.lib_deps} 334 | LittleFS 335 | 336 | [env:seeed-sensecap-indicator-mui] ; WIP 337 | platform_packages = 338 | ; platformio/framework-arduinoespressif32 @ symlink:///home/manuel/Documents/PlatformIO/Projects/arduino-esp32-fork 339 | platformio/framework-arduinoespressif32 @ https://github.com/mverch67/arduino-esp32.git#add_tca9535 ; based on 2.0.16 340 | board = seeed-sensecap-indicator 341 | board_build.partitions = default_8MB.csv 342 | upload_protocol = esptool 343 | build_flags = ${env.build_flags} 344 | -D ARCH_ESP32 345 | -D SENSECAP_INDICATOR 346 | -D IO_EXPANDER=0x40 347 | -D USE_ILOG 348 | -D USE_DUMMY_SERIAL 349 | ;-D CALIBRATE_TOUCH=0 350 | -D HAS_TFT=1 351 | -D RAM_SIZE=6144 352 | -D LV_CACHE_DEF_SIZE=2621440 353 | -D DISPLAY_SET_RESOLUTION 354 | -D LGFX_DRIVER=LGFX_INDICATOR 355 | -D VIEW_320x240 356 | -D LV_USE_SYSMON=0 357 | -D LV_USE_PROFILER=0 358 | -D LV_USE_PERF_MONITOR=0 359 | -D LV_USE_MEM_MONITOR=0 360 | -D LV_USE_LOG=0 361 | -I lib 362 | -I lib/mesh/generated 363 | -I variants/seeed-sensecap-indicator 364 | build_src_filter = ${env.build_src_filter} 365 | +<../lib/mesh> 366 | lib_deps = ${env.lib_deps} 367 | LittleFS 368 | 369 | ; https://vi.aliexpress.com/item/1005006478501734.html 370 | [env:diy-replicator-mui] 371 | board = ESP-4848S040 372 | board_build.partitions = default_8MB.csv 373 | upload_protocol = esptool 374 | debug_tool = esp-builtin 375 | debug_init_break = tbreak setup 376 | debug_port = /dev/ttyUSB0 377 | build_flags = ${env.build_flags} 378 | -D ARCH_ESP32 379 | -D ESP_4848S040 380 | -D USE_ILOG 381 | ; -D WAIT_FOR_SERIAL0 382 | ; -D WAKE_ON_SERIAL 383 | -D USE_SERIAL0 384 | -D SERIAL_RX=43 385 | -D SERIAL_TX=44 386 | ; -D BUTTON_PIN=0 387 | -D HAS_TFT=1 388 | -D RAM_SIZE=6144 389 | -D LV_CACHE_DEF_SIZE=3145728 390 | -D DISPLAY_SET_RESOLUTION 391 | -D LGFX_DRIVER=LGFX_4848S040 392 | -D VIEW_320x240 393 | -D LV_USE_SYSMON=0 394 | -D LV_USE_PROFILER=0 395 | -D LV_USE_PERF_MONITOR=0 396 | -D LV_USE_MEM_MONITOR=0 397 | -D LV_USE_LOG=0 398 | -D HAS_SDCARD 399 | -D MAP_FULL_REDRAW 400 | -I lib 401 | -I lib/mesh/generated 402 | -I variants/esp-4848s040 403 | build_src_filter = ${env.build_src_filter} 404 | +<../lib/mesh> 405 | lib_deps = ${env.lib_deps} 406 | LittleFS 407 | 408 | ; https://www.makerfabs.com/esp32-s3-parallel-tft-with-touch-4-inch.html 409 | [env:dyi-makerfabs-480x480-mui] 410 | board = ESP-4848S040 411 | board_build.partitions = default_8MB.csv 412 | upload_protocol = esptool 413 | debug_tool = esp-builtin 414 | debug_init_break = tbreak setup 415 | debug_port = /dev/ttyUSB0 416 | build_flags = ${env.build_flags} 417 | -D ARCH_ESP32 418 | -D MAKERFABS_480X480 419 | -D USE_ILOG 420 | ; -D WAIT_FOR_SERIAL0 421 | ; -D WAKE_ON_SERIAL 422 | ; -D USE_DUMMY_SERIAL 423 | -D USE_SERIAL0 424 | -D SERIAL_RX=20 425 | -D SERIAL_TX=19 426 | -D HAS_TFT=1 427 | -D RAM_SIZE=6144 428 | -D LV_CACHE_DEF_SIZE=2621440 429 | -D DISPLAY_SET_RESOLUTION 430 | -D LGFX_DRIVER=LGFX_MAKERFABS480X480 431 | -D VIEW_320x240 432 | -D LV_USE_SYSMON=0 433 | -D LV_USE_PROFILER=0 434 | -D LV_USE_PERF_MONITOR=0 435 | -D LV_USE_MEM_MONITOR=0 436 | -D LV_USE_LOG=0 437 | -I lib 438 | -I lib/mesh/generated 439 | -I variants/makerfabs-480x480 440 | build_src_filter = ${env.build_src_filter} 441 | +<../lib/mesh> 442 | lib_deps = ${env.lib_deps} 443 | LittleFS 444 | 445 | [env:heltec-tracker-mui] ; WIP 446 | board = heltec-wireless-tracker 447 | build_flags = ${env.build_flags} 448 | -D ARCH_ESP32 449 | -D HELTEC_TRACKER 450 | -D USE_ILOG 451 | -D USE_DUMMY_SERIAL 452 | -D RAM_SIZE=96 453 | -D LGFX_DRIVER=LGFX_HELTEC_TRACKER 454 | -D VIEW_160x80 455 | -I lib 456 | -I lib/mesh/generated 457 | -I variants/heltec-wireless-tracker 458 | build_src_filter = ${env.build_src_filter} 459 | +<../lib/mesh> 460 | lib_deps = ${env.lib_deps} 461 | LittleFS 462 | 463 | 464 | [env:diy-pico-oled-mui] 465 | platform = https://github.com/maxgerhardt/platform-raspberrypi.git 466 | board = pico 467 | board_build.filesystem_size = 0.5m 468 | board_build.core = earlephilhower 469 | upload_protocol = cmsis-dap 470 | debug_speed = 5000 471 | debug_init_break = tbreak setup 472 | debug_port = /dev/ttyACM0 473 | debug_tool = cmsis-dap 474 | build_flags = ${env.build_flags} -I. 475 | -D ARCH_RP2040 476 | -D PICO 477 | ;-D LIB_PICO_STDIO_USB ; for printf() via USB serial, not UART 478 | -D PICO_USB ; activate tinyusb 479 | -D USE_ILOG 480 | -D RAM_SIZE=64 481 | -D OLED_DRIVER=OLED 482 | -D VIEW_128x64 483 | -I lib 484 | -I lib/mesh/generated 485 | build_src_filter = ${env.build_src_filter} 486 | +<../lib/mesh> 487 | 488 | [env:native-mui] 489 | platform = https://github.com/meshtastic/platform-native.git#622341c6de8a239704318b10c3dbb00c21a3eab3 490 | board = cross_platform 491 | debug_test = * 492 | build_flags = ${env.build_flags} -O2 -Wall -Wextra -ffunction-sections -fdata-sections -fPIC -lstdc++fs -lgpiod -lX11 -linput -lxkbcommon -li2c 493 | -I src/platform/portduino 494 | -D RADIOLIB_EEPROM_UNSUPPORTED 495 | -D PORTDUINO_LINUX_HARDWARE 496 | -D ARCH_PORTDUINO 497 | -D USE_ILOG 498 | -D USE_X11 499 | -D HAS_TFT=1 500 | -D RAM_SIZE=16384 501 | -D LV_CACHE_DEF_SIZE=3145728 502 | -D LV_USE_LOG=0 503 | -D LV_USE_SYSMON=0 504 | -D LV_USE_PERF_MONITOR=0 505 | -D LV_USE_MEM_MONITOR=0 506 | -D LV_USE_PROFILER=0 507 | -D LV_USE_LIBINPUT=1 508 | -D VIEW_320x240 509 | -D MAP_FULL_REDRAW 510 | -I lib 511 | -I lib/mesh/generated 512 | -------------------------------------------------------------------------------- /squareline/t-watch-s3/T_Watch_Meshtastic.sll: -------------------------------------------------------------------------------- 1 | {"name":"T_Watch_Meshtastic.spj","depth":1,"width":240,"height":240,"rotation":0,"offset_x":0,"offset_y":0,"shape":"RECTANGLE","multilang":"DISABLE","description":"","board":"VSCode with lovyanGFX","board_version":"v1.0.0","editor_version":"1.3.4","image":"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","force_export_images":false,"flat_export":false,"pointfilter":false,"theme_simplified":false,"theme_dark":false,"theme_color1":5,"theme_color2":0,"uiExportFolderPath":"/home/manuel/SquareLine/Projects/T_Watch_Meshtastic/export/T_Watch_Meshtastic/src/ui","projectExportFolderPath":"/home/manuel/SquareLine/Projects/T_Watch_Meshtastic/export","backup_cnt":32,"autosave_cnt":0,"lvgl_version":"8.3.6","callfuncsexport":"CPP_FILE","lvgl_include_path":""} -------------------------------------------------------------------------------- /src/main.cpp: -------------------------------------------------------------------------------- 1 | #ifndef PIO_UNIT_TESTING 2 | 3 | #include "Arduino.h" 4 | #include "Log.h" 5 | #include "comms/EthClient.h" 6 | #include "comms/UARTClient.h" 7 | #include "graphics/DeviceScreen.h" 8 | 9 | #if defined(ARCH_PORTDUINO) 10 | #include 11 | #define FSBegin() true 12 | #else 13 | #include "LittleFS.h" 14 | #define FSCom LittleFS 15 | #define FSBegin() LittleFS.begin(true) 16 | #endif 17 | 18 | #if defined(I2C_SDA) || defined(I2C_SDA1) 19 | #include "Wire.h" 20 | #endif 21 | 22 | // this is pulled in by the device-ui library 23 | const char *firmware_version = "2.6.8"; 24 | 25 | #ifdef USE_DUMMY_SERIAL 26 | class DummyClient : public IClientBase 27 | { 28 | public: 29 | DummyClient() = default; 30 | void init(void) override {} 31 | bool connect(void) override { return true; } 32 | bool disconnect(void) override { return true; } 33 | bool isConnected(void) override { return false; } 34 | bool send(meshtastic_ToRadio &&to) override { return false; } 35 | meshtastic_FromRadio receive(void) override 36 | { 37 | meshtastic_FromRadio dummy{}; 38 | return dummy; 39 | } 40 | ~DummyClient(){}; 41 | } serial; 42 | #else 43 | IClientBase *client = nullptr; 44 | #endif 45 | 46 | DeviceScreen *screen = nullptr; 47 | 48 | void setup() 49 | { 50 | #if defined(__APPLE__) 51 | pthread_setname_np("setup"); 52 | #elif defined(__linux__) 53 | pthread_setname_np(pthread_self(), "setup"); 54 | #endif 55 | #ifdef KB_POWERON 56 | digitalWrite(KB_POWERON, HIGH); 57 | pinMode(KB_POWERON, OUTPUT); 58 | delay(200); // wait until keyboard mcu startup finished 59 | #endif 60 | 61 | #ifdef PWR_ON_PIN 62 | pinMode(PWR_ON_PIN, OUTPUT); 63 | digitalWrite(PWR_ON_PIN, HIGH); 64 | #endif 65 | 66 | #ifdef PWR_EN_PIN 67 | pinMode(PWR_EN_PIN, OUTPUT); 68 | digitalWrite(PWR_EN_PIN, HIGH); 69 | #endif 70 | 71 | #ifndef USE_SERIAL0 72 | #ifdef WAIT_FOR_SERIAL0 73 | delay(2000); 74 | #endif 75 | Serial.begin(115200); 76 | #ifdef WAIT_FOR_SERIAL0 77 | time_t timeout = millis(); 78 | while (!Serial && (millis() - timeout) < 2000) 79 | ; 80 | #endif 81 | logger.setDebugLevel(ESP_LOG_DEBUG); // use ESP_LOG_VERBOSE for trace category 82 | #else 83 | logger.setDebugLevel(ESP_LOG_NONE); // do not log when connected over serial0 84 | #endif 85 | 86 | #ifdef I2C_SDA 87 | if (!Wire.begin(I2C_SDA, I2C_SCL, 400000)) 88 | ILOG_ERROR("*** Failed to access I2C0(%d, %d)", I2C_SDA, I2C_SCL); 89 | #endif 90 | #ifdef I2C_SDA1 91 | if (!Wire.begin(I2C_SDA1, I2C_SCL1, 400000)) 92 | ILOG_ERROR("*** Failed to access I2C1(%d, %d)", I2C_SDA1, I2C_SCL1); 93 | #endif 94 | 95 | ILOG_INFO("\n//\\ E S H T /\\ S T / C U I\n"); 96 | #ifdef ARDUINO_ARCH_ESP32 97 | uint64_t chipid; 98 | chipid = ESP.getEfuseMac(); // The chip ID is essentially its MAC address(length: 6 bytes). 99 | ILOG_DEBUG(" ESP32 Chip ID = %04X %08X", (uint16_t)(chipid >> 32), (uint32_t)chipid); 100 | ILOG_DEBUG(" Flash size: %8d bytes", ESP.getFlashChipSize()); 101 | ILOG_DEBUG(" Heap size : %8d bytes", ESP.getHeapSize()); 102 | ILOG_DEBUG(" Free heap : %8d bytes", ESP.getFreeHeap()); 103 | ILOG_DEBUG(" PSRAM : %8d bytes", ESP.getFreePsram()); 104 | ILOG_DEBUG(" PSRAM max : %8d bytes", heap_caps_get_largest_free_block(MALLOC_CAP_SPIRAM)); 105 | ILOG_DEBUG("*****************************************"); 106 | #endif 107 | 108 | if (!FSBegin()) { 109 | ILOG_ERROR("LittleFS mount failed!"); 110 | } 111 | 112 | #ifdef ARCH_PORTDUINO 113 | const char *hostname = getenv("MUI_SERVER"); 114 | if (hostname == nullptr) { 115 | client = new EthClient(); 116 | } else { 117 | client = new EthClient(hostname); 118 | } 119 | int16_t x = 480; 120 | int16_t y = 480; 121 | const char *size = getenv("MUI_SIZE"); 122 | if (size != nullptr) { 123 | sscanf(size, "%" PRId16 "x%" PRId16, &x, &y); 124 | } 125 | if (x < 320 || x > 800) 126 | x = 480; 127 | if (y < 240 || y > 800) 128 | y = 480; 129 | screen = &DeviceScreen::create(DisplayDriverConfig(DisplayDriverConfig::device_t::X11, x, y)); 130 | #else 131 | client = new UARTClient(); 132 | screen = &DeviceScreen::create(); 133 | #endif 134 | 135 | screen->init(client); 136 | 137 | #ifdef ARDUINO_ARCH_ESP32 138 | ILOG_DEBUG("Free heap : %8d bytes", ESP.getFreeHeap()); 139 | ILOG_DEBUG("PSRAM : %8d bytes", ESP.getFreePsram()); 140 | #endif 141 | 142 | #ifdef ARCH_PORTDUINO 143 | // create separate thread to handle lvgl X11 GUI simulation 144 | // otherwise the GUI will slow down the main thread 145 | extern void tft_task_handler(void *param = nullptr); 146 | new std::thread([] { 147 | #ifdef __APPLE__ 148 | pthread_setname_np("tft"); 149 | #else 150 | pthread_setname_np(pthread_self(), "tft"); 151 | #endif 152 | tft_task_handler(); 153 | }); 154 | #endif 155 | 156 | ILOG_DEBUG("Setup done."); 157 | #if defined(__APPLE__) 158 | pthread_setname_np("loop"); 159 | #elif defined(__linux__) 160 | pthread_setname_np(pthread_self(), "loop"); 161 | #endif 162 | } 163 | 164 | #if defined(ARCH_ESP32) 165 | void loop() 166 | { 167 | screen->task_handler(); 168 | screen->sleep(5); 169 | } 170 | 171 | #elif defined(ARCH_PORTDUINO) 172 | void loop() 173 | { 174 | delay(1000); 175 | fflush(nullptr); 176 | } 177 | 178 | void tft_task_handler(void *) 179 | { 180 | ILOG_INFO("tft_task_handler started"); 181 | while (true) { 182 | screen->task_handler(); 183 | screen->sleep(5); 184 | } 185 | } 186 | #else 187 | #error "Unsupported architecture" 188 | #endif 189 | 190 | #endif -------------------------------------------------------------------------------- /test/definitions.cpp: -------------------------------------------------------------------------------- 1 | // make linker happy during pio unit testing 2 | 3 | #include "Arduino.h" 4 | #include "graphics/DeviceScreen.h" 5 | #include "Log.h" 6 | 7 | #ifdef USE_ILOG 8 | #include "util/ILog.h" 9 | 10 | ILog *ILog::_logger = nullptr; 11 | #endif 12 | 13 | Log *testLog = new Log; 14 | 15 | const char *firmware_version = "2.3.3"; 16 | 17 | DeviceScreen *screen = nullptr; 18 | 19 | #if defined(ARCH_PORTDUINO) 20 | void tft_task_handler(void *) 21 | { 22 | // linker-error in test build screen->task_handler(); 23 | delay(5); 24 | } 25 | #endif -------------------------------------------------------------------------------- /test/test_MeshEnvelope.cpp: -------------------------------------------------------------------------------- 1 | #include "comms/MeshEnvelope.h" 2 | #include 3 | 4 | uint8_t buffer[512]; 5 | char* buf = (char*)buffer; 6 | size_t size; 7 | size_t payload; 8 | 9 | 10 | void tearDown(void) { 11 | // clean stuff up here 12 | } 13 | 14 | void test_MeshEnvelope_ctor1(void) { 15 | MeshEnvelope envelope; 16 | } 17 | 18 | void test_MeshEnvelope_ctor2(void) { 19 | strcpy(buf, "\x01"); 20 | TEST_ASSERT_EQUAL(42, 42); 21 | } 22 | 23 | void test_MeshEnvelope_validate_size(void) { 24 | strcpy(buf, "\x01\x00"); 25 | size = 1; 26 | TEST_ASSERT_FALSE(MeshEnvelope::validate(buffer, size, payload)); 27 | } 28 | 29 | void test_MeshEnvelope_validate_wrong_magic1(void) { 30 | strcpy(buf, "\x01\x00"); 31 | size = 5; 32 | TEST_ASSERT_FALSE(MeshEnvelope::validate(buffer, size, payload)); 33 | } 34 | 35 | void test_MeshEnvelope_validate_wrong_magic2(void) { 36 | strcpy(buf, "\x94\x94\x00"); 37 | size = 5; 38 | TEST_ASSERT_FALSE(MeshEnvelope::validate(buffer, size, payload)); 39 | } 40 | 41 | void test_MeshEnvelope_validate_wrong_size(void) { 42 | memcpy(buf, "\x94\xc3\x00\x02", 4); 43 | size = 5; 44 | TEST_ASSERT_FALSE(MeshEnvelope::validate(buffer, size, payload)); 45 | TEST_ASSERT_EQUAL(2, payload); 46 | } 47 | 48 | void test_MeshEnvelope_validate_right_size(void) { 49 | memcpy(buf, "\x94\xc3\x00\x01", 4); 50 | size = 5; 51 | TEST_ASSERT_TRUE(MeshEnvelope::validate(buffer, size, payload)); 52 | TEST_ASSERT_EQUAL(payload, 1); 53 | } 54 | 55 | void test_MeshEnvelope_validate_partial_packet(void) { 56 | memcpy(buf, "\x94\xc3\x00\x03", 4); 57 | size = 5; 58 | TEST_ASSERT_FALSE(MeshEnvelope::validate(buffer, size, payload)); 59 | TEST_ASSERT_EQUAL(3, payload); 60 | } 61 | 62 | void test_MeshEnvelope_validate_skip_bytes(void) { 63 | memcpy(buf, "\x22\x23\x24\x94\xc3\x00\x04", 7); 64 | size = 9; 65 | TEST_ASSERT_FALSE(MeshEnvelope::validate(buffer, size, payload)); 66 | TEST_ASSERT_EQUAL(4, payload); 67 | TEST_ASSERT_EQUAL(0x94, buffer[0]); 68 | TEST_ASSERT_EQUAL(0xc3, buffer[1]); 69 | TEST_ASSERT_EQUAL(0x00, buffer[2]); 70 | TEST_ASSERT_EQUAL(0x04, buffer[3]); 71 | } 72 | 73 | void test_MeshEnvelope_validate_packet_with_skip_bytes(void) { 74 | memcpy(buf, "\x22\x23\x24\x94\xc3\x00\x05", 7); 75 | size = 15; 76 | TEST_ASSERT_TRUE(MeshEnvelope::validate(buffer, size, payload)); 77 | TEST_ASSERT_EQUAL(5, payload); 78 | TEST_ASSERT_EQUAL(0x94, buffer[0]); 79 | TEST_ASSERT_EQUAL(0xc3, buffer[1]); 80 | TEST_ASSERT_EQUAL(0x00, buffer[2]); 81 | TEST_ASSERT_EQUAL(0x05, buffer[3]); 82 | } 83 | 84 | 85 | void RUN_UNITY_TESTS() { 86 | UNITY_BEGIN(); 87 | RUN_TEST(test_MeshEnvelope_ctor1); 88 | RUN_TEST(test_MeshEnvelope_ctor2); 89 | RUN_TEST(test_MeshEnvelope_validate_size); 90 | RUN_TEST(test_MeshEnvelope_validate_wrong_magic1); 91 | RUN_TEST(test_MeshEnvelope_validate_wrong_magic2); 92 | RUN_TEST(test_MeshEnvelope_validate_wrong_size); 93 | RUN_TEST(test_MeshEnvelope_validate_right_size); 94 | RUN_TEST(test_MeshEnvelope_validate_partial_packet); 95 | RUN_TEST(test_MeshEnvelope_validate_skip_bytes); 96 | RUN_TEST(test_MeshEnvelope_validate_packet_with_skip_bytes); 97 | UNITY_END(); 98 | } 99 | 100 | #ifdef ARDUINO 101 | 102 | #include 103 | void setup() { 104 | size = 0; 105 | payload = 0; 106 | // NOTE!!! Wait for >2 secs 107 | // if board doesn't support software reset via Serial.DTR/RTS 108 | //delay(2000); 109 | 110 | RUN_UNITY_TESTS(); 111 | } 112 | 113 | void loop() { 114 | // digitalWrite(13, HIGH); 115 | // delay(100); 116 | // digitalWrite(13, LOW); 117 | // delay(500); 118 | } 119 | 120 | #else 121 | 122 | int main(int argc, char **argv) { 123 | RUN_UNITY_TESTS(); 124 | return 0; 125 | } 126 | 127 | #endif 128 | -------------------------------------------------------------------------------- /variants/esp-4848s040/pins_arduino.h: -------------------------------------------------------------------------------- 1 | #ifndef Pins_Arduino_h 2 | #define Pins_Arduino_h 3 | 4 | #include 5 | 6 | // static const uint8_t LED_BUILTIN = -1; 7 | 8 | #define SD_SPI_FREQUENCY 75000000U 9 | 10 | static const uint8_t RELAY_PIN = 40; 11 | 12 | static const uint8_t SPI_MOSI = 47; 13 | static const uint8_t SPI_SCK = 48; 14 | static const uint8_t SPI_MISO = 41; 15 | static const uint8_t SPI_CS = 42; 16 | static const uint8_t SDCARD_CS = SPI_CS; 17 | 18 | static const uint8_t TX = 43; 19 | static const uint8_t RX = 44; 20 | 21 | static const uint8_t SDA = 19; 22 | static const uint8_t SCL = 45; 23 | 24 | static const uint8_t SS = 39; 25 | static const uint8_t MOSI = 47; 26 | static const uint8_t MISO = 41; 27 | static const uint8_t SCK = 48; 28 | 29 | static const uint8_t A0 = 1; 30 | static const uint8_t A1 = 2; 31 | static const uint8_t A2 = 3; 32 | static const uint8_t A3 = 4; 33 | static const uint8_t A4 = 5; 34 | static const uint8_t A5 = 6; 35 | static const uint8_t A6 = 7; 36 | static const uint8_t A7 = 8; 37 | static const uint8_t A8 = 9; 38 | static const uint8_t A9 = 10; 39 | static const uint8_t A10 = 11; 40 | static const uint8_t A11 = 12; 41 | static const uint8_t A12 = 13; 42 | static const uint8_t A13 = 14; 43 | static const uint8_t A14 = 15; 44 | static const uint8_t A15 = 16; 45 | static const uint8_t A16 = 17; 46 | static const uint8_t A17 = 18; 47 | static const uint8_t A18 = 19; 48 | static const uint8_t A19 = 20; 49 | 50 | static const uint8_t T1 = 1; 51 | static const uint8_t T2 = 2; 52 | static const uint8_t T3 = 3; 53 | static const uint8_t T4 = 4; 54 | static const uint8_t T5 = 5; 55 | static const uint8_t T6 = 6; 56 | static const uint8_t T7 = 7; 57 | static const uint8_t T8 = 8; 58 | static const uint8_t T9 = 9; 59 | static const uint8_t T10 = 10; 60 | static const uint8_t T11 = 11; 61 | static const uint8_t T12 = 12; 62 | static const uint8_t T13 = 13; 63 | static const uint8_t T14 = 14; 64 | 65 | #endif /* Pins_Arduino_h */ -------------------------------------------------------------------------------- /variants/heltec-wireless-tracker/pins_arduino.h: -------------------------------------------------------------------------------- 1 | #ifndef Pins_Arduino_h 2 | #define Pins_Arduino_h 3 | 4 | #include "soc/soc_caps.h" 5 | #include 6 | 7 | #define WIFI_LoRa_32_V3 true 8 | #define DISPLAY_HEIGHT 64 9 | #define DISPLAY_WIDTH 128 10 | 11 | #define USB_VID 0x303a 12 | #define USB_PID 0x1001 13 | 14 | #define EXTERNAL_NUM_INTERRUPTS 46 15 | #define NUM_DIGITAL_PINS 48 16 | #define NUM_ANALOG_INPUTS 20 17 | 18 | static const uint8_t LED_BUILTIN = 18; 19 | #define BUILTIN_LED LED_BUILTIN // backward compatibility 20 | #define LED_BUILTIN LED_BUILTIN 21 | 22 | #define analogInputToDigitalPin(p) (((p) < 20) ? (analogChannelToDigitalPin(p)) : -1) 23 | #define digitalPinToInterrupt(p) (((p) < 48) ? (p) : -1) 24 | #define digitalPinHasPWM(p) (p < 46) 25 | 26 | static const uint8_t TX = 43; 27 | static const uint8_t RX = 44; 28 | 29 | static const uint8_t SDA = 41; 30 | static const uint8_t SCL = 42; 31 | 32 | static const uint8_t SS = 8; 33 | static const uint8_t MOSI = 10; 34 | static const uint8_t MISO = 11; 35 | static const uint8_t SCK = 9; 36 | 37 | static const uint8_t A0 = 1; 38 | static const uint8_t A1 = 2; 39 | static const uint8_t A2 = 3; 40 | static const uint8_t A3 = 4; 41 | static const uint8_t A4 = 5; 42 | static const uint8_t A5 = 6; 43 | static const uint8_t A6 = 7; 44 | static const uint8_t A7 = 8; 45 | static const uint8_t A8 = 9; 46 | static const uint8_t A9 = 10; 47 | static const uint8_t A10 = 11; 48 | static const uint8_t A11 = 12; 49 | static const uint8_t A12 = 13; 50 | static const uint8_t A13 = 14; 51 | static const uint8_t A14 = 15; 52 | static const uint8_t A15 = 16; 53 | static const uint8_t A16 = 17; 54 | static const uint8_t A17 = 18; 55 | static const uint8_t A18 = 19; 56 | static const uint8_t A19 = 20; 57 | 58 | static const uint8_t T1 = 1; 59 | static const uint8_t T2 = 2; 60 | static const uint8_t T3 = 3; 61 | static const uint8_t T4 = 4; 62 | static const uint8_t T5 = 5; 63 | static const uint8_t T6 = 6; 64 | static const uint8_t T7 = 7; 65 | static const uint8_t T8 = 8; 66 | static const uint8_t T9 = 9; 67 | static const uint8_t T10 = 10; 68 | static const uint8_t T11 = 11; 69 | static const uint8_t T12 = 12; 70 | static const uint8_t T13 = 13; 71 | static const uint8_t T14 = 14; 72 | 73 | static const uint8_t Vext = 36; 74 | static const uint8_t LED = 18; 75 | 76 | static const uint8_t RST_LoRa = 12; 77 | static const uint8_t BUSY_LoRa = 13; 78 | static const uint8_t DIO0 = 14; 79 | 80 | #endif /* Pins_Arduino_h */ 81 | -------------------------------------------------------------------------------- /variants/makerfabs-480x480/pins_arduino.h: -------------------------------------------------------------------------------- 1 | #ifndef Pins_Arduino_h 2 | #define Pins_Arduino_h 3 | 4 | #include 5 | 6 | // static const uint8_t LED_BUILTIN = -1; 7 | 8 | static const uint8_t TX = 19; 9 | static const uint8_t RX = 20; 10 | 11 | static const uint8_t SDA = 17; 12 | static const uint8_t SCL = 18; 13 | 14 | // Default SPI will be mapped to Radio 15 | static const uint8_t SS = 10; 16 | static const uint8_t MOSI = 11; 17 | static const uint8_t MISO = 13; 18 | static const uint8_t SCK = 12; 19 | 20 | static const uint8_t A0 = 1; 21 | static const uint8_t A1 = 2; 22 | static const uint8_t A2 = 3; 23 | static const uint8_t A3 = 4; 24 | static const uint8_t A4 = 5; 25 | static const uint8_t A5 = 6; 26 | static const uint8_t A6 = 7; 27 | static const uint8_t A7 = 8; 28 | static const uint8_t A8 = 9; 29 | static const uint8_t A9 = 10; 30 | static const uint8_t A10 = 11; 31 | static const uint8_t A11 = 12; 32 | static const uint8_t A12 = 13; 33 | static const uint8_t A13 = 14; 34 | static const uint8_t A14 = 15; 35 | static const uint8_t A15 = 16; 36 | static const uint8_t A16 = 17; 37 | static const uint8_t A17 = 18; 38 | static const uint8_t A18 = 19; 39 | static const uint8_t A19 = 20; 40 | 41 | static const uint8_t T1 = 1; 42 | static const uint8_t T2 = 2; 43 | static const uint8_t T3 = 3; 44 | static const uint8_t T4 = 4; 45 | static const uint8_t T5 = 5; 46 | static const uint8_t T6 = 6; 47 | static const uint8_t T7 = 7; 48 | static const uint8_t T8 = 8; 49 | static const uint8_t T9 = 9; 50 | static const uint8_t T10 = 10; 51 | static const uint8_t T11 = 11; 52 | static const uint8_t T12 = 12; 53 | static const uint8_t T13 = 13; 54 | static const uint8_t T14 = 14; 55 | 56 | #endif /* Pins_Arduino_h */ 57 | -------------------------------------------------------------------------------- /variants/seeed-sensecap-indicator/pins_arduino.h: -------------------------------------------------------------------------------- 1 | #ifndef Pins_Arduino_h 2 | #define Pins_Arduino_h 3 | 4 | #include 5 | 6 | // static const uint8_t LED_BUILTIN = -1; 7 | 8 | // static const uint8_t TX = 43; 9 | // static const uint8_t RX = 44; 10 | 11 | static const uint8_t SDA = 39; 12 | static const uint8_t SCL = 40; 13 | 14 | // Default SPI will be mapped to Radio 15 | static const uint8_t SS = -1; 16 | static const uint8_t MOSI = 48; 17 | static const uint8_t MISO = 47; 18 | static const uint8_t SCK = 41; 19 | 20 | static const uint8_t A0 = 1; 21 | static const uint8_t A1 = 2; 22 | static const uint8_t A2 = 3; 23 | static const uint8_t A3 = 4; 24 | static const uint8_t A4 = 5; 25 | static const uint8_t A5 = 6; 26 | static const uint8_t A6 = 7; 27 | static const uint8_t A7 = 8; 28 | static const uint8_t A8 = 9; 29 | static const uint8_t A9 = 10; 30 | static const uint8_t A10 = 11; 31 | static const uint8_t A11 = 12; 32 | static const uint8_t A12 = 13; 33 | static const uint8_t A13 = 14; 34 | static const uint8_t A14 = 15; 35 | static const uint8_t A15 = 16; 36 | static const uint8_t A16 = 17; 37 | static const uint8_t A17 = 18; 38 | static const uint8_t A18 = 19; 39 | static const uint8_t A19 = 20; 40 | 41 | static const uint8_t T1 = 1; 42 | static const uint8_t T2 = 2; 43 | static const uint8_t T3 = 3; 44 | static const uint8_t T4 = 4; 45 | static const uint8_t T5 = 5; 46 | static const uint8_t T6 = 6; 47 | static const uint8_t T7 = 7; 48 | static const uint8_t T8 = 8; 49 | static const uint8_t T9 = 9; 50 | static const uint8_t T10 = 10; 51 | static const uint8_t T11 = 11; 52 | static const uint8_t T12 = 12; 53 | static const uint8_t T13 = 13; 54 | static const uint8_t T14 = 14; 55 | 56 | #endif /* Pins_Arduino_h */ -------------------------------------------------------------------------------- /variants/t-deck/pins_arduino.h: -------------------------------------------------------------------------------- 1 | #ifndef Pins_Arduino_h 2 | #define Pins_Arduino_h 3 | 4 | #include 5 | 6 | #define USB_VID 0x303a 7 | #define USB_PID 0x1001 8 | 9 | #define EXTERNAL_NUM_INTERRUPTS 46 10 | #define NUM_DIGITAL_PINS 48 11 | #define NUM_ANALOG_INPUTS 20 12 | 13 | #define analogInputToDigitalPin(p) (((p) < NUM_ANALOG_INPUTS) ? (analogChannelToDigitalPin(p)) : -1) 14 | #define digitalPinToInterrupt(p) (((p) < NUM_DIGITAL_PINS) ? (p) : -1) 15 | #define digitalPinHasPWM(p) (p < EXTERNAL_NUM_INTERRUPTS) 16 | 17 | // static const uint8_t LED_BUILTIN = -1; 18 | 19 | static const uint8_t TX = 43; 20 | static const uint8_t RX = 44; 21 | 22 | static const uint8_t SDA = 18; 23 | static const uint8_t SCL = 8; 24 | 25 | // Default SPI will be mapped to Radio 26 | static const uint8_t SS = 9; 27 | static const uint8_t MOSI = 41; 28 | static const uint8_t MISO = 38; 29 | static const uint8_t SCK = 40; 30 | 31 | static const uint8_t A0 = 1; 32 | static const uint8_t A1 = 2; 33 | static const uint8_t A2 = 3; 34 | static const uint8_t A3 = 4; 35 | static const uint8_t A4 = 5; 36 | static const uint8_t A5 = 6; 37 | static const uint8_t A6 = 7; 38 | static const uint8_t A7 = 8; 39 | static const uint8_t A8 = 9; 40 | static const uint8_t A9 = 10; 41 | static const uint8_t A10 = 11; 42 | static const uint8_t A11 = 12; 43 | static const uint8_t A12 = 13; 44 | static const uint8_t A13 = 14; 45 | static const uint8_t A14 = 15; 46 | static const uint8_t A15 = 16; 47 | static const uint8_t A16 = 17; 48 | static const uint8_t A17 = 18; 49 | static const uint8_t A18 = 19; 50 | static const uint8_t A19 = 20; 51 | 52 | static const uint8_t T1 = 1; 53 | static const uint8_t T2 = 2; 54 | static const uint8_t T3 = 3; 55 | static const uint8_t T4 = 4; 56 | static const uint8_t T5 = 5; 57 | static const uint8_t T6 = 6; 58 | static const uint8_t T7 = 7; 59 | static const uint8_t T8 = 8; 60 | static const uint8_t T9 = 9; 61 | static const uint8_t T10 = 10; 62 | static const uint8_t T11 = 11; 63 | static const uint8_t T12 = 12; 64 | static const uint8_t T13 = 13; 65 | static const uint8_t T14 = 14; 66 | 67 | static const uint8_t BAT_ADC_PIN = 4; 68 | 69 | #endif /* Pins_Arduino_h */ 70 | -------------------------------------------------------------------------------- /variants/t-watch-s3/pins_arduino.h: -------------------------------------------------------------------------------- 1 | #ifndef Pins_Arduino_h 2 | #define Pins_Arduino_h 3 | 4 | #include 5 | 6 | #define EXTERNAL_NUM_INTERRUPTS 46 7 | #define NUM_DIGITAL_PINS 48 8 | #define NUM_ANALOG_INPUTS 20 9 | 10 | #define analogInputToDigitalPin(p) (((p) < NUM_ANALOG_INPUTS) ? (analogChannelToDigitalPin(p)) : -1) 11 | #define digitalPinToInterrupt(p) (((p) < NUM_DIGITAL_PINS) ? (p) : -1) 12 | #define digitalPinHasPWM(p) (p < EXTERNAL_NUM_INTERRUPTS) 13 | 14 | // static const uint8_t LED_BUILTIN = -1; 15 | 16 | // static const uint8_t TX = 43; 17 | // static const uint8_t RX = 44; 18 | 19 | static const uint8_t SDA = 10; 20 | static const uint8_t SCL = 11; 21 | 22 | // Default SPI will be mapped to Radio 23 | static const uint8_t SS = 5; 24 | static const uint8_t MOSI = 1; 25 | static const uint8_t MISO = 4; 26 | static const uint8_t SCK = 3; 27 | 28 | static const uint8_t A0 = 1; 29 | static const uint8_t A1 = 2; 30 | static const uint8_t A2 = 3; 31 | static const uint8_t A3 = 4; 32 | static const uint8_t A4 = 5; 33 | static const uint8_t A5 = 6; 34 | static const uint8_t A6 = 7; 35 | static const uint8_t A7 = 8; 36 | static const uint8_t A8 = 9; 37 | static const uint8_t A9 = 10; 38 | static const uint8_t A10 = 11; 39 | static const uint8_t A11 = 12; 40 | static const uint8_t A12 = 13; 41 | static const uint8_t A13 = 14; 42 | static const uint8_t A14 = 15; 43 | static const uint8_t A15 = 16; 44 | static const uint8_t A16 = 17; 45 | static const uint8_t A17 = 18; 46 | static const uint8_t A18 = 19; 47 | static const uint8_t A19 = 20; 48 | 49 | static const uint8_t T1 = 1; 50 | static const uint8_t T2 = 2; 51 | static const uint8_t T3 = 3; 52 | static const uint8_t T4 = 4; 53 | static const uint8_t T5 = 5; 54 | static const uint8_t T6 = 6; 55 | static const uint8_t T7 = 7; 56 | static const uint8_t T8 = 8; 57 | static const uint8_t T9 = 9; 58 | static const uint8_t T10 = 10; 59 | static const uint8_t T11 = 11; 60 | static const uint8_t T12 = 12; 61 | static const uint8_t T13 = 13; 62 | static const uint8_t T14 = 14; 63 | 64 | #endif /* Pins_Arduino_h */ -------------------------------------------------------------------------------- /variants/wt32-sc01-plus/pins_arduino.h: -------------------------------------------------------------------------------- 1 | #ifndef Pins_Arduino_h 2 | #define Pins_Arduino_h 3 | 4 | #include 5 | 6 | #define USB_VID 0x303A 7 | #define USB_PID 0x80D0 8 | #define USB_MANUFACTURER "wireless-tag" 9 | #define USB_PRODUCT "WT32-SC01 Plus" 10 | #define USB_SERIAL "" 11 | 12 | // #define EXTERNAL_NUM_INTERRUPTS 46 13 | // #define NUM_DIGITAL_PINS 17 14 | // #define NUM_ANALOG_INPUTS 9 15 | 16 | // #define analogInputToDigitalPin(p) (((p)<20)?(analogChannelToDigitalPin(p)):-1) 17 | // #define digitalPinToInterrupt(p) (((p)<48)?(p):-1) 18 | // #define digitalPinHasPWM(p) (p < 46) 19 | 20 | static const uint8_t SPI_MOSI = 40; 21 | static const uint8_t SPI_SCK = 39; 22 | static const uint8_t SPI_MISO = 38; 23 | static const uint8_t SPI_CS = 41; 24 | static const uint8_t SDCARD_CS = SPI_CS; 25 | 26 | static const uint8_t TX = 43; 27 | static const uint8_t RX = 44; 28 | 29 | static const uint8_t SDA = 8; 30 | static const uint8_t SCL = 9; 31 | 32 | static const uint8_t SS = 34; 33 | static const uint8_t MOSI = 35; 34 | static const uint8_t MISO = 37; 35 | static const uint8_t SDO = 35; 36 | static const uint8_t SDI = 37; 37 | static const uint8_t SCK = 36; 38 | 39 | static const uint8_t A0 = 1; 40 | static const uint8_t A1 = 2; 41 | static const uint8_t A2 = 3; 42 | static const uint8_t A3 = 4; 43 | static const uint8_t A4 = 5; 44 | static const uint8_t A5 = 6; 45 | static const uint8_t A6 = 7; 46 | static const uint8_t A7 = 8; 47 | static const uint8_t A8 = 9; 48 | 49 | static const uint8_t T1 = 1; 50 | static const uint8_t T2 = 2; 51 | static const uint8_t T3 = 3; 52 | static const uint8_t T4 = 4; 53 | static const uint8_t T5 = 5; 54 | static const uint8_t T6 = 6; 55 | static const uint8_t T7 = 7; 56 | static const uint8_t T8 = 8; 57 | static const uint8_t T9 = 9; 58 | 59 | static const uint8_t VBAT_SENSE = 10; 60 | static const uint8_t VBUS_SENSE = 33; 61 | 62 | static const uint8_t RGB_DATA = 18; 63 | static const uint8_t RGB_PWR = 17; 64 | 65 | #endif /* Pins_Arduino_h */ 66 | --------------------------------------------------------------------------------