Copy disabled (too large)
Download .txt
Showing preview only (10,027K chars total). Download the full file to get everything.
Repository: meshtastic/firmware
Branch: develop
Commit: eb80d3141d2f
Files: 1572
Total size: 9.3 MB
Directory structure:
gitextract_d2spliar/
├── .clusterfuzzlite/
│ ├── Dockerfile
│ ├── README.md
│ ├── build.sh
│ ├── platformio-clusterfuzzlite-post.py
│ ├── platformio-clusterfuzzlite-pre.py
│ ├── project.yaml
│ ├── router_fuzzer.cpp
│ ├── router_fuzzer.options
│ └── router_fuzzer_seed_corpus.py
├── .devcontainer/
│ ├── 99-platformio-udev.rules
│ ├── Dockerfile
│ ├── devcontainer.json
│ └── setup.sh
├── .envrc
├── .gitattributes
├── .github/
│ ├── FUNDING.yml
│ ├── ISSUE_TEMPLATE/
│ │ ├── Bug Report.yml
│ │ ├── New Board.yml
│ │ └── feature.yml
│ ├── actionlint.yaml
│ ├── actions/
│ │ ├── build-variant/
│ │ │ └── action.yml
│ │ ├── setup-base/
│ │ │ └── action.yml
│ │ └── setup-native/
│ │ └── action.yml
│ ├── copilot-instructions.md
│ ├── pull_request_template.md
│ └── workflows/
│ ├── build_debian_src.yml
│ ├── build_firmware.yml
│ ├── build_one_target.yml
│ ├── daily_packaging.yml
│ ├── docker_build.yml
│ ├── docker_manifest.yml
│ ├── first_time_contributor.yml
│ ├── hook_copr.yml
│ ├── main_matrix.yml
│ ├── merge_queue.yml
│ ├── models_issue_triage.yml
│ ├── models_pr_triage.yml
│ ├── nightly.yml
│ ├── package_obs.yml
│ ├── package_pio_deps.yml
│ ├── package_ppa.yml
│ ├── pr_enforce_labels.yml
│ ├── pr_tests.yml
│ ├── release_channels.yml
│ ├── sec_sast_semgrep_cron.yml
│ ├── sec_sast_semgrep_pull.yml
│ ├── stale_bot.yml
│ ├── test_native.yml
│ ├── tests.yml
│ ├── trunk_annotate_pr.yml
│ ├── trunk_check.yml
│ └── update_protobufs.yml
├── .gitignore
├── .gitmodules
├── .gitpod.yml
├── .semgrepignore
├── .trunk/
│ ├── .gitignore
│ ├── configs/
│ │ ├── .bandit
│ │ ├── .clang-format
│ │ ├── .flake8
│ │ ├── .hadolint.yaml
│ │ ├── .isort.cfg
│ │ ├── .markdownlint.yaml
│ │ ├── .prettierignore
│ │ ├── .prettierrc
│ │ ├── .shellcheckrc
│ │ ├── .yamllint.yaml
│ │ ├── ruff.toml
│ │ └── svgo.config.js
│ └── trunk.yaml
├── .vscode/
│ ├── settings.json
│ └── tasks.json
├── CODE_OF_CONDUCT.md
├── CONTRIBUTING.md
├── Dockerfile
├── Dockerfile.test
├── LICENSE
├── README.md
├── SECURITY.md
├── alpine.Dockerfile
├── bin/
│ ├── .gitignore
│ ├── 99-meshtasticd-udev.rules
│ ├── Meshtastic_nRF52_factory_erase_v3_S140_6.1.0.uf2
│ ├── Meshtastic_nRF52_factory_erase_v3_S140_7.3.0.uf2
│ ├── analyze_map.py
│ ├── base64_to_hex.py
│ ├── build-esp32.sh
│ ├── build-firmware.sh
│ ├── build-native.sh
│ ├── build-nrf52.sh
│ ├── build-rp2xx0.sh
│ ├── build-stm32wl.sh
│ ├── build-userprefs-json.py
│ ├── buildinfo.py
│ ├── bump_metainfo/
│ │ ├── bump_metainfo.py
│ │ └── requirements.txt
│ ├── bump_version.py
│ ├── check-all.sh
│ ├── check-dependencies.sh
│ ├── config-dist.yaml
│ ├── config.d/
│ │ ├── MUI/
│ │ │ └── X11_480x480.yaml
│ │ ├── OpenWRT/
│ │ │ ├── BananaPi-BPI-R4-sx1262.yaml
│ │ │ ├── OpenWRT-One-mikroBUS-LR-IOT-CLICK.yaml
│ │ │ └── OpenWRT_One_mikroBUS_sx1262.yaml
│ │ ├── display-waveshare-1-44.yaml
│ │ ├── display-waveshare-2.8.yaml
│ │ ├── femtofox/
│ │ │ ├── femtofox_LR1121_TCXO.yaml
│ │ │ ├── femtofox_SX1262_TCXO.yaml
│ │ │ └── femtofox_SX1262_XTAL.yaml
│ │ ├── lora-Adafruit-RFM9x.yaml
│ │ ├── lora-MeshAdv-900M30S.yaml
│ │ ├── lora-MeshAdv-Mini-900M22S.yaml
│ │ ├── lora-RAK6421-13300-slot1.yaml
│ │ ├── lora-RAK6421-13300-slot2.yaml
│ │ ├── lora-RAK6421-13302-slot1.yaml
│ │ ├── lora-RAK6421-13302-slot2.yaml
│ │ ├── lora-hat-rak-6421-pi-hat.yaml
│ │ ├── lora-lyra-picocalc-wio-sx1262.yaml
│ │ ├── lora-lyra-ultra_1w.yaml
│ │ ├── lora-lyra-ultra_2w.yaml
│ │ ├── lora-lyra-ws-raspberry-pi-pico-hat.yaml
│ │ ├── lora-meshstick-1262.yaml
│ │ ├── lora-piggystick-lr1121.yaml
│ │ ├── lora-pinedio-usb-sx1262.yaml
│ │ ├── lora-raxda-rock2f-starter-edition-hat.yaml
│ │ ├── lora-starter-edition-sx1262-i2c.yaml
│ │ ├── lora-usb-meshstick-1262.yaml
│ │ ├── lora-usb-meshtoad-e22.yaml
│ │ ├── lora-usb-umesh-1262-30dbm.yaml
│ │ ├── lora-usb-umesh-1268-30dbm.yaml
│ │ ├── lora-waveshare-sxxx.yaml
│ │ ├── lora-ws-raspberry-pi-pico-to-rpi-adapter.yaml
│ │ └── lora-ws-raspberry-pico-to-orangepi-03.yaml
│ ├── device-install.bat
│ ├── device-install.sh
│ ├── device-install_test.ps1
│ ├── device-update.bat
│ ├── device-update.sh
│ ├── dump-ram-users.sh
│ ├── exception_decoder.py
│ ├── gen-images.sh
│ ├── generate_ci_matrix.py
│ ├── generate_release_notes.py
│ ├── generic/
│ │ ├── Meshtastic_6.1.0_bootloader-0.9.2_s140_6.1.1.hex
│ │ ├── Meshtastic_7.3.0_bootloader-0.9.2_s140_7.3.0.hex
│ │ ├── update-Meshtastic_6.1.0_bootloader-0.9.2_nosd.uf2
│ │ └── update-Meshtastic_7.3.0_bootloader-0.9.2_nosd.uf2
│ ├── genpartitions.py
│ ├── kill-github-actions.sh
│ ├── mergehex
│ ├── meshtasticd-start.sh
│ ├── meshtasticd.service
│ ├── native-gdbserver.sh
│ ├── native-install.sh
│ ├── native-run.sh
│ ├── org.meshtastic.meshtasticd.desktop
│ ├── org.meshtastic.meshtasticd.metainfo.xml
│ ├── platformio-custom.py
│ ├── platformio-pre.py
│ ├── promote-release.sh
│ ├── read-system-info.sh
│ ├── readprops.py
│ ├── regen-protos.bat
│ ├── regen-protos.sh
│ ├── rpkg.macros
│ ├── s140_nrf52_7.3.0_softdevice.hex
│ ├── setup-python-for-esp-debug.sh
│ ├── shame.py
│ ├── test-native-docker.sh
│ ├── test-simulator.sh
│ ├── uf2-convert.bat
│ ├── uf2conv.py
│ ├── update-lilygo_techo_bootloader-0.6.1_nosd.uf2
│ ├── view-map.sh
│ └── web.version
├── boards/
│ ├── CDEBYTE_EoRa-Hub.json
│ ├── CDEBYTE_EoRa-S3.json
│ ├── ESP32-S3-WROOM-1-N4.json
│ ├── ThinkNode-M1.json
│ ├── ThinkNode-M3.json
│ ├── ThinkNode-M4.json
│ ├── ThinkNode-M6.json
│ ├── bpi_picow_esp32_s3.json
│ ├── canaryone.json
│ ├── crowpanel.json
│ ├── eink0.1.json
│ ├── esp32-s3-pico.json
│ ├── esp32-s3-zero.json
│ ├── gat562_mesh_trial_tracker.json
│ ├── hackaday-communicator.json
│ ├── heltec_mesh_node_t114.json
│ ├── heltec_mesh_pocket.json
│ ├── heltec_mesh_solar.json
│ ├── heltec_v4.json
│ ├── heltec_vision_master_e213.json
│ ├── heltec_vision_master_e290.json
│ ├── heltec_vision_master_t190.json
│ ├── heltec_wireless_tracker.json
│ ├── heltec_wireless_tracker_v2.json
│ ├── icarus.json
│ ├── me25ls01-4y10td.json
│ ├── mesh-tab.json
│ ├── meshlink.json
│ ├── meshtiny.json
│ ├── mini-epaper-s3.json
│ ├── minimesh_lite.json
│ ├── ms24sf1.json
│ ├── muzi-base.json
│ ├── my-esp32s3-diy-oled.json
│ ├── my_esp32s3_diy_eink.json
│ ├── nano-g2-ultra.json
│ ├── nordic_pca10059.json
│ ├── nrf52840_dk.json
│ ├── promicro-nrf52840.json
│ ├── r1-neo.json
│ ├── seeed-sensecap-indicator.json
│ ├── seeed-xiao-s3.json
│ ├── seeed_solar_node.json
│ ├── seeed_wio_tracker_L1.json
│ ├── seeed_xiao_nrf52840_kit.json
│ ├── station-g2.json
│ ├── t-beam-1w.json
│ ├── t-deck-pro.json
│ ├── t-deck.json
│ ├── t-echo.json
│ ├── t-watch-s3.json
│ ├── tbeam-s3-core.json
│ ├── tlora-t3s3-v1.json
│ ├── tracker-t1000-e.json
│ ├── unphone.json
│ ├── wio-sdk-wm1110.json
│ ├── wio-t1000-s.json
│ ├── wio-tracker-wm1110.json
│ ├── wiphone.json
│ ├── wiscore_rak11200.json
│ ├── wiscore_rak3172.json
│ ├── wiscore_rak3312.json
│ ├── wiscore_rak4600.json
│ ├── wiscore_rak4631.json
│ └── xiao_ble_sense.json
├── branding/
│ └── README.md
├── data/
│ └── static/
│ └── .gitkeep
├── debian/
│ ├── .gitignore
│ ├── changelog
│ ├── ci_changelog.sh
│ ├── ci_pack_sdeb.sh
│ ├── control
│ ├── meshtasticd.dirs
│ ├── meshtasticd.install
│ ├── meshtasticd.postinst
│ ├── meshtasticd.postrm
│ ├── meshtasticd.udev
│ ├── rules
│ └── source/
│ ├── format
│ ├── include-binaries
│ └── options
├── docker-compose.yml
├── extra_scripts/
│ ├── README.md
│ ├── disable_adafruit_usb.py
│ ├── esp32_extra.py
│ ├── esp32_pre.py
│ ├── nrf52_extra.py
│ └── stm32_extra.py
├── flake.nix
├── meshtasticd.spec.rpkg
├── monitor/
│ └── filter_c3_exception_decoder.py
├── partition-table-8MB.csv
├── partition-table.csv
├── platformio.ini
├── pyocd.yaml
├── renovate.json
├── rpkg.conf
├── shell.nix
├── src/
│ ├── AmbientLightingThread.h
│ ├── AudioThread.h
│ ├── BluetoothCommon.cpp
│ ├── BluetoothCommon.h
│ ├── BluetoothStatus.h
│ ├── DebugConfiguration.cpp
│ ├── DebugConfiguration.h
│ ├── DisplayFormatters.cpp
│ ├── DisplayFormatters.h
│ ├── FSCommon.cpp
│ ├── FSCommon.h
│ ├── Fusion/
│ │ ├── Fusion.h
│ │ ├── FusionAhrs.c
│ │ ├── FusionAhrs.h
│ │ ├── FusionAxes.h
│ │ ├── FusionCalibration.h
│ │ ├── FusionCompass.c
│ │ ├── FusionCompass.h
│ │ ├── FusionConvention.h
│ │ ├── FusionMath.h
│ │ ├── FusionOffset.c
│ │ └── FusionOffset.h
│ ├── GPSStatus.h
│ ├── GpioLogic.cpp
│ ├── GpioLogic.h
│ ├── MessageStore.cpp
│ ├── MessageStore.h
│ ├── NodeStatus.h
│ ├── Observer.cpp
│ ├── Observer.h
│ ├── Power.cpp
│ ├── PowerFSM.cpp
│ ├── PowerFSM.h
│ ├── PowerFSMThread.h
│ ├── PowerMon.cpp
│ ├── PowerMon.h
│ ├── PowerStatus.h
│ ├── RF95Configuration.h
│ ├── RedirectablePrint.cpp
│ ├── RedirectablePrint.h
│ ├── SPILock.cpp
│ ├── SPILock.h
│ ├── SafeFile.cpp
│ ├── SafeFile.h
│ ├── SerialConsole.cpp
│ ├── SerialConsole.h
│ ├── Status.h
│ ├── airtime.cpp
│ ├── airtime.h
│ ├── buzz/
│ │ ├── BuzzerFeedbackThread.cpp
│ │ ├── BuzzerFeedbackThread.h
│ │ ├── buzz.cpp
│ │ └── buzz.h
│ ├── commands.h
│ ├── concurrency/
│ │ ├── BinarySemaphoreFreeRTOS.cpp
│ │ ├── BinarySemaphoreFreeRTOS.h
│ │ ├── BinarySemaphorePosix.cpp
│ │ ├── BinarySemaphorePosix.h
│ │ ├── InterruptableDelay.cpp
│ │ ├── InterruptableDelay.h
│ │ ├── Lock.cpp
│ │ ├── Lock.h
│ │ ├── LockGuard.cpp
│ │ ├── LockGuard.h
│ │ ├── NotifiedWorkerThread.cpp
│ │ ├── NotifiedWorkerThread.h
│ │ ├── OSThread.cpp
│ │ ├── OSThread.h
│ │ └── Periodic.h
│ ├── configuration.h
│ ├── detect/
│ │ ├── LoRaRadioType.h
│ │ ├── ScanI2C.cpp
│ │ ├── ScanI2C.h
│ │ ├── ScanI2CConsumer.cpp
│ │ ├── ScanI2CConsumer.h
│ │ ├── ScanI2CTwoWire.cpp
│ │ ├── ScanI2CTwoWire.h
│ │ ├── einkScan.h
│ │ ├── reClockI2C.cpp
│ │ └── reClockI2C.h
│ ├── error.h
│ ├── freertosinc.h
│ ├── gps/
│ │ ├── GPS.cpp
│ │ ├── GPS.h
│ │ ├── GPSUpdateScheduling.cpp
│ │ ├── GPSUpdateScheduling.h
│ │ ├── GeoCoord.cpp
│ │ ├── GeoCoord.h
│ │ ├── NMEAWPL.cpp
│ │ ├── NMEAWPL.h
│ │ ├── RTC.cpp
│ │ ├── RTC.h
│ │ ├── cas.h
│ │ └── ubx.h
│ ├── graphics/
│ │ ├── EInkDisplay2.cpp
│ │ ├── EInkDisplay2.h
│ │ ├── EInkDynamicDisplay.cpp
│ │ ├── EInkDynamicDisplay.h
│ │ ├── EmoteRenderer.cpp
│ │ ├── EmoteRenderer.h
│ │ ├── GxEPD2Multi.h
│ │ ├── NomadStarLED.h
│ │ ├── Panel_sdl.cpp
│ │ ├── Panel_sdl.hpp
│ │ ├── PointStruct.h
│ │ ├── Screen.cpp
│ │ ├── Screen.h
│ │ ├── ScreenFonts.h
│ │ ├── ScreenGlobals.cpp
│ │ ├── SharedUIDisplay.cpp
│ │ ├── SharedUIDisplay.h
│ │ ├── TFTDisplay.cpp
│ │ ├── TFTDisplay.h
│ │ ├── TimeFormatters.cpp
│ │ ├── TimeFormatters.h
│ │ ├── VirtualKeyboard.cpp
│ │ ├── VirtualKeyboard.h
│ │ ├── draw/
│ │ │ ├── ClockRenderer.cpp
│ │ │ ├── ClockRenderer.h
│ │ │ ├── CompassRenderer.cpp
│ │ │ ├── CompassRenderer.h
│ │ │ ├── DebugRenderer.cpp
│ │ │ ├── DebugRenderer.h
│ │ │ ├── DrawRenderers.h
│ │ │ ├── MenuHandler.cpp
│ │ │ ├── MenuHandler.h
│ │ │ ├── MessageRenderer.cpp
│ │ │ ├── MessageRenderer.h
│ │ │ ├── NodeListRenderer.cpp
│ │ │ ├── NodeListRenderer.h
│ │ │ ├── NotificationRenderer.cpp
│ │ │ ├── NotificationRenderer.h
│ │ │ ├── UIRenderer.cpp
│ │ │ └── UIRenderer.h
│ │ ├── emotes.cpp
│ │ ├── emotes.h
│ │ ├── fonts/
│ │ │ ├── EinkDisplayFonts.cpp
│ │ │ ├── EinkDisplayFonts.h
│ │ │ ├── OLEDDisplayFontsCS.cpp
│ │ │ ├── OLEDDisplayFontsCS.h
│ │ │ ├── OLEDDisplayFontsGR.cpp
│ │ │ ├── OLEDDisplayFontsGR.h
│ │ │ ├── OLEDDisplayFontsPL.cpp
│ │ │ ├── OLEDDisplayFontsPL.h
│ │ │ ├── OLEDDisplayFontsRU.cpp
│ │ │ ├── OLEDDisplayFontsRU.h
│ │ │ ├── OLEDDisplayFontsUA.cpp
│ │ │ └── OLEDDisplayFontsUA.h
│ │ ├── images.h
│ │ ├── img/
│ │ │ ├── icon.xbm
│ │ │ └── icon_small.xbm
│ │ ├── niche/
│ │ │ ├── Drivers/
│ │ │ │ ├── Backlight/
│ │ │ │ │ ├── LatchingBacklight.cpp
│ │ │ │ │ └── LatchingBacklight.h
│ │ │ │ ├── EInk/
│ │ │ │ │ ├── DEPG0213BNS800.cpp
│ │ │ │ │ ├── DEPG0213BNS800.h
│ │ │ │ │ ├── DEPG0290BNS800.cpp
│ │ │ │ │ ├── DEPG0290BNS800.h
│ │ │ │ │ ├── E0213A367.cpp
│ │ │ │ │ ├── E0213A367.h
│ │ │ │ │ ├── EInk.cpp
│ │ │ │ │ ├── EInk.h
│ │ │ │ │ ├── GDEW0102T4.cpp
│ │ │ │ │ ├── GDEW0102T4.h
│ │ │ │ │ ├── GDEY0154D67.cpp
│ │ │ │ │ ├── GDEY0154D67.h
│ │ │ │ │ ├── GDEY0213B74.cpp
│ │ │ │ │ ├── GDEY0213B74.h
│ │ │ │ │ ├── HINK_E0213A289.cpp
│ │ │ │ │ ├── HINK_E0213A289.h
│ │ │ │ │ ├── HINK_E042A87.cpp
│ │ │ │ │ ├── HINK_E042A87.h
│ │ │ │ │ ├── LCMEN2R13ECC1.cpp
│ │ │ │ │ ├── LCMEN2R13ECC1.h
│ │ │ │ │ ├── LCMEN2R13EFC1.cpp
│ │ │ │ │ ├── LCMEN2R13EFC1.h
│ │ │ │ │ ├── README.md
│ │ │ │ │ ├── SSD1682.cpp
│ │ │ │ │ ├── SSD1682.h
│ │ │ │ │ ├── SSD16XX.cpp
│ │ │ │ │ ├── SSD16XX.h
│ │ │ │ │ ├── UC8175.cpp
│ │ │ │ │ ├── UC8175.h
│ │ │ │ │ ├── ZJY122250_0213BAAMFGN.cpp
│ │ │ │ │ ├── ZJY122250_0213BAAMFGN.h
│ │ │ │ │ ├── ZJY128296_029EAAMFGN.cpp
│ │ │ │ │ ├── ZJY128296_029EAAMFGN.h
│ │ │ │ │ └── ZJY200200_0154DAAMFGN.h
│ │ │ │ └── README.md
│ │ │ ├── Fonts/
│ │ │ │ ├── FreeSans12pt_Win1250.h
│ │ │ │ ├── FreeSans12pt_Win1251.h
│ │ │ │ ├── FreeSans12pt_Win1252.h
│ │ │ │ ├── FreeSans12pt_Win1253.h
│ │ │ │ ├── FreeSans6pt7b.h
│ │ │ │ ├── FreeSans6pt_Win1250.h
│ │ │ │ ├── FreeSans6pt_Win1251.h
│ │ │ │ ├── FreeSans6pt_Win1252.h
│ │ │ │ ├── FreeSans6pt_Win1253.h
│ │ │ │ ├── FreeSans9pt_Win1250.h
│ │ │ │ ├── FreeSans9pt_Win1251.h
│ │ │ │ ├── FreeSans9pt_Win1252.h
│ │ │ │ ├── FreeSans9pt_Win1253.h
│ │ │ │ └── README.md
│ │ │ ├── InkHUD/
│ │ │ │ ├── Applet.cpp
│ │ │ │ ├── Applet.h
│ │ │ │ ├── AppletFont.cpp
│ │ │ │ ├── AppletFont.h
│ │ │ │ ├── Applets/
│ │ │ │ │ ├── Bases/
│ │ │ │ │ │ ├── Map/
│ │ │ │ │ │ │ ├── MapApplet.cpp
│ │ │ │ │ │ │ └── MapApplet.h
│ │ │ │ │ │ └── NodeList/
│ │ │ │ │ │ ├── NodeListApplet.cpp
│ │ │ │ │ │ └── NodeListApplet.h
│ │ │ │ │ ├── Examples/
│ │ │ │ │ │ ├── BasicExample/
│ │ │ │ │ │ │ ├── BasicExampleApplet.cpp
│ │ │ │ │ │ │ └── BasicExampleApplet.h
│ │ │ │ │ │ ├── NewMsgExample/
│ │ │ │ │ │ │ ├── NewMsgExampleApplet.cpp
│ │ │ │ │ │ │ └── NewMsgExampleApplet.h
│ │ │ │ │ │ └── UserAppletInputExample/
│ │ │ │ │ │ ├── UserAppletInputExample.cpp
│ │ │ │ │ │ └── UserAppletInputExample.h
│ │ │ │ │ ├── System/
│ │ │ │ │ │ ├── AlignStick/
│ │ │ │ │ │ │ ├── AlignStickApplet.cpp
│ │ │ │ │ │ │ └── AlignStickApplet.h
│ │ │ │ │ │ ├── BatteryIcon/
│ │ │ │ │ │ │ ├── BatteryIconApplet.cpp
│ │ │ │ │ │ │ └── BatteryIconApplet.h
│ │ │ │ │ │ ├── Keyboard/
│ │ │ │ │ │ │ ├── KeyboardApplet.cpp
│ │ │ │ │ │ │ └── KeyboardApplet.h
│ │ │ │ │ │ ├── Logo/
│ │ │ │ │ │ │ ├── LogoApplet.cpp
│ │ │ │ │ │ │ └── LogoApplet.h
│ │ │ │ │ │ ├── Menu/
│ │ │ │ │ │ │ ├── MenuAction.h
│ │ │ │ │ │ │ ├── MenuApplet.cpp
│ │ │ │ │ │ │ ├── MenuApplet.h
│ │ │ │ │ │ │ ├── MenuItem.h
│ │ │ │ │ │ │ └── MenuPage.h
│ │ │ │ │ │ ├── Notification/
│ │ │ │ │ │ │ ├── Notification.h
│ │ │ │ │ │ │ ├── NotificationApplet.cpp
│ │ │ │ │ │ │ └── NotificationApplet.h
│ │ │ │ │ │ ├── Pairing/
│ │ │ │ │ │ │ ├── PairingApplet.cpp
│ │ │ │ │ │ │ └── PairingApplet.h
│ │ │ │ │ │ ├── Placeholder/
│ │ │ │ │ │ │ ├── PlaceholderApplet.cpp
│ │ │ │ │ │ │ └── PlaceholderApplet.h
│ │ │ │ │ │ └── Tips/
│ │ │ │ │ │ ├── TipsApplet.cpp
│ │ │ │ │ │ └── TipsApplet.h
│ │ │ │ │ └── User/
│ │ │ │ │ ├── AllMessage/
│ │ │ │ │ │ ├── AllMessageApplet.cpp
│ │ │ │ │ │ └── AllMessageApplet.h
│ │ │ │ │ ├── DM/
│ │ │ │ │ │ ├── DMApplet.cpp
│ │ │ │ │ │ └── DMApplet.h
│ │ │ │ │ ├── FavoritesMap/
│ │ │ │ │ │ ├── FavoritesMapApplet.cpp
│ │ │ │ │ │ └── FavoritesMapApplet.h
│ │ │ │ │ ├── Heard/
│ │ │ │ │ │ ├── HeardApplet.cpp
│ │ │ │ │ │ └── HeardApplet.h
│ │ │ │ │ ├── Positions/
│ │ │ │ │ │ ├── PositionsApplet.cpp
│ │ │ │ │ │ └── PositionsApplet.h
│ │ │ │ │ ├── RecentsList/
│ │ │ │ │ │ ├── RecentsListApplet.cpp
│ │ │ │ │ │ └── RecentsListApplet.h
│ │ │ │ │ └── ThreadedMessage/
│ │ │ │ │ ├── ThreadedMessageApplet.cpp
│ │ │ │ │ └── ThreadedMessageApplet.h
│ │ │ │ ├── DisplayHealth.cpp
│ │ │ │ ├── DisplayHealth.h
│ │ │ │ ├── Events.cpp
│ │ │ │ ├── Events.h
│ │ │ │ ├── InkHUD.cpp
│ │ │ │ ├── InkHUD.h
│ │ │ │ ├── MessageStore.cpp
│ │ │ │ ├── MessageStore.h
│ │ │ │ ├── Persistence.cpp
│ │ │ │ ├── Persistence.h
│ │ │ │ ├── PlatformioConfig.ini
│ │ │ │ ├── Renderer.cpp
│ │ │ │ ├── Renderer.h
│ │ │ │ ├── SystemApplet.h
│ │ │ │ ├── Tile.cpp
│ │ │ │ ├── Tile.h
│ │ │ │ ├── WindowManager.cpp
│ │ │ │ ├── WindowManager.h
│ │ │ │ └── docs/
│ │ │ │ └── README.md
│ │ │ ├── Inputs/
│ │ │ │ ├── README.md
│ │ │ │ ├── TwoButton.cpp
│ │ │ │ ├── TwoButton.h
│ │ │ │ ├── TwoButtonExtended.cpp
│ │ │ │ └── TwoButtonExtended.h
│ │ │ ├── README.md
│ │ │ └── Utils/
│ │ │ ├── CannedMessageStore.cpp
│ │ │ ├── CannedMessageStore.h
│ │ │ └── FlashData.h
│ │ └── tftSetup.cpp
│ ├── input/
│ │ ├── BBQ10Keyboard.cpp
│ │ ├── BBQ10Keyboard.h
│ │ ├── ButtonThread.cpp
│ │ ├── ButtonThread.h
│ │ ├── CardputerKeyboard.cpp
│ │ ├── CardputerKeyboard.h
│ │ ├── ExpressLRSFiveWay.cpp
│ │ ├── ExpressLRSFiveWay.h
│ │ ├── HackadayCommunicatorKeyboard.cpp
│ │ ├── HackadayCommunicatorKeyboard.h
│ │ ├── InputBroker.cpp
│ │ ├── InputBroker.h
│ │ ├── LinuxInput.cpp
│ │ ├── LinuxInput.h
│ │ ├── LinuxInputImpl.cpp
│ │ ├── LinuxInputImpl.h
│ │ ├── MPR121Keyboard.cpp
│ │ ├── MPR121Keyboard.h
│ │ ├── RotaryEncoderImpl.cpp
│ │ ├── RotaryEncoderImpl.h
│ │ ├── RotaryEncoderInterruptBase.cpp
│ │ ├── RotaryEncoderInterruptBase.h
│ │ ├── RotaryEncoderInterruptImpl1.cpp
│ │ ├── RotaryEncoderInterruptImpl1.h
│ │ ├── SeesawRotary.cpp
│ │ ├── SeesawRotary.h
│ │ ├── SerialKeyboard.cpp
│ │ ├── SerialKeyboard.h
│ │ ├── SerialKeyboardImpl.cpp
│ │ ├── SerialKeyboardImpl.h
│ │ ├── TCA8418Keyboard.cpp
│ │ ├── TCA8418Keyboard.h
│ │ ├── TCA8418KeyboardBase.cpp
│ │ ├── TCA8418KeyboardBase.h
│ │ ├── TDeckProKeyboard.cpp
│ │ ├── TDeckProKeyboard.h
│ │ ├── TLoraPagerKeyboard.cpp
│ │ ├── TLoraPagerKeyboard.h
│ │ ├── TouchScreenBase.cpp
│ │ ├── TouchScreenBase.h
│ │ ├── TouchScreenImpl1.cpp
│ │ ├── TouchScreenImpl1.h
│ │ ├── TrackballInterruptBase.cpp
│ │ ├── TrackballInterruptBase.h
│ │ ├── TrackballInterruptImpl1.cpp
│ │ ├── TrackballInterruptImpl1.h
│ │ ├── UpDownInterruptBase.cpp
│ │ ├── UpDownInterruptBase.h
│ │ ├── UpDownInterruptImpl1.cpp
│ │ ├── UpDownInterruptImpl1.h
│ │ ├── cardKbI2cImpl.cpp
│ │ ├── cardKbI2cImpl.h
│ │ ├── i2cButton.cpp
│ │ ├── i2cButton.h
│ │ ├── kbI2cBase.cpp
│ │ ├── kbI2cBase.h
│ │ ├── kbMatrixBase.cpp
│ │ ├── kbMatrixBase.h
│ │ ├── kbMatrixImpl.cpp
│ │ └── kbMatrixImpl.h
│ ├── main.cpp
│ ├── main.h
│ ├── memGet.cpp
│ ├── memGet.h
│ ├── mesh/
│ │ ├── Channels.cpp
│ │ ├── Channels.h
│ │ ├── CryptoEngine.cpp
│ │ ├── CryptoEngine.h
│ │ ├── Default.cpp
│ │ ├── Default.h
│ │ ├── FloodingRouter.cpp
│ │ ├── FloodingRouter.h
│ │ ├── InterfacesTemplates.cpp
│ │ ├── LLCC68Interface.cpp
│ │ ├── LLCC68Interface.h
│ │ ├── LR1110Interface.cpp
│ │ ├── LR1110Interface.h
│ │ ├── LR1120Interface.cpp
│ │ ├── LR1120Interface.h
│ │ ├── LR1121Interface.cpp
│ │ ├── LR1121Interface.h
│ │ ├── LR11x0Interface.cpp
│ │ ├── LR11x0Interface.h
│ │ ├── LoRaFEMInterface.cpp
│ │ ├── LoRaFEMInterface.h
│ │ ├── MemoryPool.h
│ │ ├── MeshModule.cpp
│ │ ├── MeshModule.h
│ │ ├── MeshPacketQueue.cpp
│ │ ├── MeshPacketQueue.h
│ │ ├── MeshRadio.h
│ │ ├── MeshService.cpp
│ │ ├── MeshService.h
│ │ ├── MeshTypes.h
│ │ ├── NextHopRouter.cpp
│ │ ├── NextHopRouter.h
│ │ ├── NodeDB.cpp
│ │ ├── NodeDB.h
│ │ ├── PacketCache.cpp
│ │ ├── PacketCache.h
│ │ ├── PacketHistory.cpp
│ │ ├── PacketHistory.h
│ │ ├── PhoneAPI.cpp
│ │ ├── PhoneAPI.h
│ │ ├── PointerQueue.h
│ │ ├── ProtobufModule.cpp
│ │ ├── ProtobufModule.h
│ │ ├── RF95Interface.cpp
│ │ ├── RF95Interface.h
│ │ ├── RadioInterface.cpp
│ │ ├── RadioInterface.h
│ │ ├── RadioLibInterface.cpp
│ │ ├── RadioLibInterface.h
│ │ ├── RadioLibRF95.cpp
│ │ ├── RadioLibRF95.h
│ │ ├── ReliableRouter.cpp
│ │ ├── ReliableRouter.h
│ │ ├── Router.cpp
│ │ ├── Router.h
│ │ ├── STM32WLE5JCInterface.cpp
│ │ ├── STM32WLE5JCInterface.h
│ │ ├── SX1262Interface.cpp
│ │ ├── SX1262Interface.h
│ │ ├── SX1268Interface.cpp
│ │ ├── SX1268Interface.h
│ │ ├── SX126xInterface.cpp
│ │ ├── SX126xInterface.h
│ │ ├── SX1280Interface.cpp
│ │ ├── SX1280Interface.h
│ │ ├── SX128xInterface.cpp
│ │ ├── SX128xInterface.h
│ │ ├── SinglePortModule.h
│ │ ├── StaticPointerQueue.h
│ │ ├── StreamAPI.cpp
│ │ ├── StreamAPI.h
│ │ ├── Throttle.cpp
│ │ ├── Throttle.h
│ │ ├── TransmitHistory.cpp
│ │ ├── TransmitHistory.h
│ │ ├── TypeConversions.cpp
│ │ ├── TypeConversions.h
│ │ ├── TypedQueue.h
│ │ ├── aes-ccm.cpp
│ │ ├── aes-ccm.h
│ │ ├── api/
│ │ │ ├── PacketAPI.cpp
│ │ │ ├── PacketAPI.h
│ │ │ ├── ServerAPI.cpp
│ │ │ ├── ServerAPI.h
│ │ │ ├── WiFiServerAPI.cpp
│ │ │ ├── WiFiServerAPI.h
│ │ │ ├── ethServerAPI.cpp
│ │ │ └── ethServerAPI.h
│ │ ├── compression/
│ │ │ ├── unishox2.cpp
│ │ │ └── unishox2.h
│ │ ├── eth/
│ │ │ ├── ethClient.cpp
│ │ │ └── ethClient.h
│ │ ├── generated/
│ │ │ ├── .clang-format
│ │ │ └── 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
│ │ ├── http/
│ │ │ ├── ContentHandler.cpp
│ │ │ ├── ContentHandler.h
│ │ │ ├── ContentHelper.cpp
│ │ │ ├── ContentHelper.h
│ │ │ ├── WebServer.cpp
│ │ │ └── WebServer.h
│ │ ├── mesh-pb-constants.cpp
│ │ ├── mesh-pb-constants.h
│ │ ├── raspihttp/
│ │ │ ├── PiWebServer.cpp
│ │ │ └── PiWebServer.h
│ │ ├── udp/
│ │ │ └── UdpMulticastHandler.h
│ │ └── wifi/
│ │ ├── WiFiAPClient.cpp
│ │ └── WiFiAPClient.h
│ ├── meshUtils.cpp
│ ├── meshUtils.h
│ ├── modules/
│ │ ├── AdminModule.cpp
│ │ ├── AdminModule.h
│ │ ├── AtakPluginModule.cpp
│ │ ├── AtakPluginModule.h
│ │ ├── CannedMessageModule.cpp
│ │ ├── CannedMessageModule.h
│ │ ├── DetectionSensorModule.cpp
│ │ ├── DetectionSensorModule.h
│ │ ├── DropzoneModule.cpp
│ │ ├── DropzoneModule.h
│ │ ├── ExternalNotificationModule.cpp
│ │ ├── ExternalNotificationModule.h
│ │ ├── GenericThreadModule.cpp
│ │ ├── GenericThreadModule.h
│ │ ├── KeyVerificationModule.cpp
│ │ ├── KeyVerificationModule.h
│ │ ├── ModuleDev.h
│ │ ├── Modules.cpp
│ │ ├── Modules.h
│ │ ├── NeighborInfoModule.cpp
│ │ ├── NeighborInfoModule.h
│ │ ├── NodeInfoModule.cpp
│ │ ├── NodeInfoModule.h
│ │ ├── OnScreenKeyboardModule.cpp
│ │ ├── OnScreenKeyboardModule.h
│ │ ├── PositionModule.cpp
│ │ ├── PositionModule.h
│ │ ├── PowerStressModule.cpp
│ │ ├── PowerStressModule.h
│ │ ├── RangeTestModule.cpp
│ │ ├── RangeTestModule.h
│ │ ├── RemoteHardwareModule.cpp
│ │ ├── RemoteHardwareModule.h
│ │ ├── ReplyBotModule.cpp
│ │ ├── ReplyBotModule.h
│ │ ├── ReplyModule.cpp
│ │ ├── ReplyModule.h
│ │ ├── RoutingModule.cpp
│ │ ├── RoutingModule.h
│ │ ├── SerialModule.cpp
│ │ ├── SerialModule.h
│ │ ├── StatusLEDModule.cpp
│ │ ├── StatusLEDModule.h
│ │ ├── StatusMessageModule.cpp
│ │ ├── StatusMessageModule.h
│ │ ├── StoreForwardModule.cpp
│ │ ├── StoreForwardModule.h
│ │ ├── SystemCommandsModule.cpp
│ │ ├── SystemCommandsModule.h
│ │ ├── Telemetry/
│ │ │ ├── AirQualityTelemetry.cpp
│ │ │ ├── AirQualityTelemetry.h
│ │ │ ├── BaseTelemetryModule.h
│ │ │ ├── DeviceTelemetry.cpp
│ │ │ ├── DeviceTelemetry.h
│ │ │ ├── EnvironmentTelemetry.cpp
│ │ │ ├── EnvironmentTelemetry.h
│ │ │ ├── HealthTelemetry.cpp
│ │ │ ├── HealthTelemetry.h
│ │ │ ├── HostMetrics.cpp
│ │ │ ├── HostMetrics.h
│ │ │ ├── PowerTelemetry.cpp
│ │ │ ├── PowerTelemetry.h
│ │ │ ├── Sensor/
│ │ │ │ ├── AHT10.cpp
│ │ │ │ ├── AHT10.h
│ │ │ │ ├── AddI2CSensorTemplate.h
│ │ │ │ ├── BH1750Sensor.cpp
│ │ │ │ ├── BH1750Sensor.h
│ │ │ │ ├── BME280Sensor.cpp
│ │ │ │ ├── BME280Sensor.h
│ │ │ │ ├── BME680Sensor.cpp
│ │ │ │ ├── BME680Sensor.h
│ │ │ │ ├── BMP085Sensor.cpp
│ │ │ │ ├── BMP085Sensor.h
│ │ │ │ ├── BMP280Sensor.cpp
│ │ │ │ ├── BMP280Sensor.h
│ │ │ │ ├── BMP3XXSensor.cpp
│ │ │ │ ├── BMP3XXSensor.h
│ │ │ │ ├── CGRadSensSensor.cpp
│ │ │ │ ├── CGRadSensSensor.h
│ │ │ │ ├── CurrentSensor.h
│ │ │ │ ├── DFRobotGravitySensor.cpp
│ │ │ │ ├── DFRobotGravitySensor.h
│ │ │ │ ├── DFRobotLarkSensor.cpp
│ │ │ │ ├── DFRobotLarkSensor.h
│ │ │ │ ├── DPS310Sensor.cpp
│ │ │ │ ├── DPS310Sensor.h
│ │ │ │ ├── INA219Sensor.cpp
│ │ │ │ ├── INA219Sensor.h
│ │ │ │ ├── INA226Sensor.cpp
│ │ │ │ ├── INA226Sensor.h
│ │ │ │ ├── INA260Sensor.cpp
│ │ │ │ ├── INA260Sensor.h
│ │ │ │ ├── INA3221Sensor.cpp
│ │ │ │ ├── INA3221Sensor.h
│ │ │ │ ├── IndicatorSensor.cpp
│ │ │ │ ├── IndicatorSensor.h
│ │ │ │ ├── LPS22HBSensor.cpp
│ │ │ │ ├── LPS22HBSensor.h
│ │ │ │ ├── LTR390UVSensor.cpp
│ │ │ │ ├── LTR390UVSensor.h
│ │ │ │ ├── MAX17048Sensor.cpp
│ │ │ │ ├── MAX17048Sensor.h
│ │ │ │ ├── MAX30102Sensor.cpp
│ │ │ │ ├── MAX30102Sensor.h
│ │ │ │ ├── MCP9808Sensor.cpp
│ │ │ │ ├── MCP9808Sensor.h
│ │ │ │ ├── MLX90614Sensor.cpp
│ │ │ │ ├── MLX90614Sensor.h
│ │ │ │ ├── MLX90632Sensor.cpp
│ │ │ │ ├── MLX90632Sensor.h
│ │ │ │ ├── NAU7802Sensor.cpp
│ │ │ │ ├── NAU7802Sensor.h
│ │ │ │ ├── OPT3001Sensor.cpp
│ │ │ │ ├── OPT3001Sensor.h
│ │ │ │ ├── PCT2075Sensor.cpp
│ │ │ │ ├── PCT2075Sensor.h
│ │ │ │ ├── PMSA003ISensor.cpp
│ │ │ │ ├── PMSA003ISensor.h
│ │ │ │ ├── RAK12035Sensor.cpp
│ │ │ │ ├── RAK12035Sensor.h
│ │ │ │ ├── RAK9154Sensor.cpp
│ │ │ │ ├── RAK9154Sensor.h
│ │ │ │ ├── RCWL9620Sensor.cpp
│ │ │ │ ├── RCWL9620Sensor.h
│ │ │ │ ├── SCD30Sensor.cpp
│ │ │ │ ├── SCD30Sensor.h
│ │ │ │ ├── SCD4XSensor.cpp
│ │ │ │ ├── SCD4XSensor.h
│ │ │ │ ├── SEN5XSensor.cpp
│ │ │ │ ├── SEN5XSensor.h
│ │ │ │ ├── SFA30Sensor.cpp
│ │ │ │ ├── SFA30Sensor.h
│ │ │ │ ├── SHT31Sensor.cpp
│ │ │ │ ├── SHT31Sensor.h
│ │ │ │ ├── SHT4XSensor.cpp
│ │ │ │ ├── SHT4XSensor.h
│ │ │ │ ├── SHTC3Sensor.cpp
│ │ │ │ ├── SHTC3Sensor.h
│ │ │ │ ├── T1000xSensor.cpp
│ │ │ │ ├── T1000xSensor.h
│ │ │ │ ├── TSL2561Sensor.cpp
│ │ │ │ ├── TSL2561Sensor.h
│ │ │ │ ├── TSL2591Sensor.cpp
│ │ │ │ ├── TSL2591Sensor.h
│ │ │ │ ├── TelemetrySensor.cpp
│ │ │ │ ├── TelemetrySensor.h
│ │ │ │ ├── VEML7700Sensor.cpp
│ │ │ │ ├── VEML7700Sensor.h
│ │ │ │ ├── VoltageSensor.h
│ │ │ │ ├── nullSensor.cpp
│ │ │ │ └── nullSensor.h
│ │ │ ├── UnitConversions.cpp
│ │ │ └── UnitConversions.h
│ │ ├── TextMessageModule.cpp
│ │ ├── TextMessageModule.h
│ │ ├── TraceRouteModule.cpp
│ │ ├── TraceRouteModule.h
│ │ ├── TrafficManagementModule.cpp
│ │ ├── TrafficManagementModule.h
│ │ ├── WaypointModule.cpp
│ │ ├── WaypointModule.h
│ │ └── esp32/
│ │ ├── AudioModule.cpp
│ │ ├── AudioModule.h
│ │ ├── PaxcounterModule.cpp
│ │ └── PaxcounterModule.h
│ ├── motion/
│ │ ├── AccelerometerThread.h
│ │ ├── BMA423Sensor.cpp
│ │ ├── BMA423Sensor.h
│ │ ├── BMI270Sensor.cpp
│ │ ├── BMI270Sensor.h
│ │ ├── BMM150Sensor.cpp
│ │ ├── BMM150Sensor.h
│ │ ├── BMX160Sensor.cpp
│ │ ├── BMX160Sensor.h
│ │ ├── ICM20948Sensor.cpp
│ │ ├── ICM20948Sensor.h
│ │ ├── LIS3DHSensor.cpp
│ │ ├── LIS3DHSensor.h
│ │ ├── LSM6DS3Sensor.cpp
│ │ ├── LSM6DS3Sensor.h
│ │ ├── MPU6050Sensor.cpp
│ │ ├── MPU6050Sensor.h
│ │ ├── MotionSensor.cpp
│ │ ├── MotionSensor.h
│ │ ├── QMA6100PSensor.cpp
│ │ ├── QMA6100PSensor.h
│ │ ├── STK8XXXSensor.cpp
│ │ └── STK8XXXSensor.h
│ ├── mqtt/
│ │ ├── MQTT.cpp
│ │ ├── MQTT.h
│ │ ├── ServiceEnvelope.cpp
│ │ └── ServiceEnvelope.h
│ ├── network-stubs.cpp
│ ├── nimble/
│ │ ├── NimbleBluetooth.cpp
│ │ └── NimbleBluetooth.h
│ ├── platform/
│ │ ├── esp32/
│ │ │ ├── ESP32CryptoEngine.cpp
│ │ │ ├── MeshtasticOTA.cpp
│ │ │ ├── MeshtasticOTA.h
│ │ │ ├── SimpleAllocator.cpp
│ │ │ ├── SimpleAllocator.h
│ │ │ ├── architecture.h
│ │ │ ├── iram-quirk.c
│ │ │ └── main-esp32.cpp
│ │ ├── extra_variants/
│ │ │ ├── README.md
│ │ │ ├── heltec_wireless_tracker/
│ │ │ │ └── variant.cpp
│ │ │ ├── t_deck_pro/
│ │ │ │ └── variant.cpp
│ │ │ ├── t_lora_pager/
│ │ │ │ └── variant.cpp
│ │ │ └── tbeam_displayshield/
│ │ │ └── variant.cpp
│ │ ├── nrf52/
│ │ │ ├── AsyncUDP.cpp
│ │ │ ├── AsyncUDP.h
│ │ │ ├── BLEDfuSecure.cpp
│ │ │ ├── BLEDfuSecure.h
│ │ │ ├── NRF52Bluetooth.cpp
│ │ │ ├── NRF52Bluetooth.h
│ │ │ ├── NRF52CryptoEngine.cpp
│ │ │ ├── aes-256/
│ │ │ │ ├── tiny-aes.cpp
│ │ │ │ └── tiny-aes.h
│ │ │ ├── alloc.cpp
│ │ │ ├── architecture.h
│ │ │ ├── hardfault.cpp
│ │ │ ├── main-bare.cpp
│ │ │ ├── main-nrf52.cpp
│ │ │ ├── nrf52840_s140_v7.ld
│ │ │ └── softdevice/
│ │ │ ├── ble.h
│ │ │ ├── ble_err.h
│ │ │ ├── ble_gap.h
│ │ │ ├── ble_gatt.h
│ │ │ ├── ble_gattc.h
│ │ │ ├── ble_gatts.h
│ │ │ ├── ble_hci.h
│ │ │ ├── ble_l2cap.h
│ │ │ ├── ble_ranges.h
│ │ │ ├── ble_types.h
│ │ │ ├── nrf52/
│ │ │ │ └── nrf_mbr.h
│ │ │ ├── nrf_error.h
│ │ │ ├── nrf_error_sdm.h
│ │ │ ├── nrf_error_soc.h
│ │ │ ├── nrf_nvic.h
│ │ │ ├── nrf_sdm.h
│ │ │ ├── nrf_soc.h
│ │ │ └── nrf_svc.h
│ │ ├── portduino/
│ │ │ ├── PortduinoGlue.cpp
│ │ │ ├── PortduinoGlue.h
│ │ │ ├── SimRadio.cpp
│ │ │ ├── SimRadio.h
│ │ │ ├── USBHal.h
│ │ │ └── architecture.h
│ │ ├── rp2xx0/
│ │ │ ├── architecture.h
│ │ │ ├── hardware_rosc/
│ │ │ │ ├── include/
│ │ │ │ │ └── hardware/
│ │ │ │ │ └── rosc.h
│ │ │ │ └── rosc.c
│ │ │ ├── main-rp2xx0.cpp
│ │ │ └── pico_sleep/
│ │ │ ├── include/
│ │ │ │ └── pico/
│ │ │ │ └── sleep.h
│ │ │ └── sleep.c
│ │ └── stm32wl/
│ │ ├── LittleFS.cpp
│ │ ├── LittleFS.h
│ │ ├── STM32_LittleFS.cpp
│ │ ├── STM32_LittleFS.h
│ │ ├── STM32_LittleFS_File.cpp
│ │ ├── STM32_LittleFS_File.h
│ │ ├── architecture.h
│ │ ├── littlefs/
│ │ │ ├── lfs.c
│ │ │ ├── lfs.h
│ │ │ ├── lfs_util.c
│ │ │ └── lfs_util.h
│ │ └── main-stm32wl.cpp
│ ├── power/
│ │ ├── PowerHAL.cpp
│ │ └── PowerHAL.h
│ ├── power.h
│ ├── serialization/
│ │ ├── JSON.cpp
│ │ ├── JSON.h
│ │ ├── JSONValue.cpp
│ │ ├── JSONValue.h
│ │ ├── MeshPacketSerializer.cpp
│ │ ├── MeshPacketSerializer.h
│ │ ├── MeshPacketSerializer_nRF52.cpp
│ │ ├── cobs.cpp
│ │ └── cobs.h
│ ├── sleep.cpp
│ ├── sleep.h
│ ├── target_specific.h
│ ├── watchdog/
│ │ ├── watchdogThread.cpp
│ │ └── watchdogThread.h
│ ├── xmodem.cpp
│ └── xmodem.h
├── suppressions.txt
├── test/
│ ├── TestUtil.cpp
│ ├── TestUtil.h
│ ├── test_admin_radio/
│ │ └── test_main.cpp
│ ├── test_atak/
│ │ └── test_main.cpp
│ ├── test_crypto/
│ │ └── test_main.cpp
│ ├── test_default/
│ │ └── test_main.cpp
│ ├── test_http_content_handler/
│ │ └── test_main.cpp
│ ├── test_mesh_module/
│ │ └── test_main.cpp
│ ├── test_meshpacket_serializer/
│ │ ├── ports/
│ │ │ ├── test_encrypted.cpp
│ │ │ ├── test_nodeinfo.cpp
│ │ │ ├── test_position.cpp
│ │ │ ├── test_telemetry.cpp
│ │ │ ├── test_text_message.cpp
│ │ │ └── test_waypoint.cpp
│ │ ├── test_helpers.h
│ │ └── test_serializer.cpp
│ ├── test_mqtt/
│ │ └── MQTT.cpp
│ ├── test_radio/
│ │ └── test_main.cpp
│ ├── test_serial/
│ │ └── SerialModule.cpp
│ ├── test_traffic_management/
│ │ └── test_main.cpp
│ └── test_transmit_history/
│ └── test_main.cpp
├── userPrefs.jsonc
├── variants/
│ ├── esp32/
│ │ ├── betafpv_2400_tx_micro/
│ │ │ ├── platformio.ini
│ │ │ └── variant.h
│ │ ├── betafpv_900_tx_nano/
│ │ │ ├── platformio.ini
│ │ │ └── variant.h
│ │ ├── chatter2/
│ │ │ ├── platformio.ini
│ │ │ └── variant.h
│ │ ├── diy/
│ │ │ ├── 9m2ibr_aprs_lora_tracker/
│ │ │ │ ├── platformio.ini
│ │ │ │ ├── variant.cpp
│ │ │ │ └── variant.h
│ │ │ ├── dr-dev/
│ │ │ │ ├── platformio.ini
│ │ │ │ └── variant.h
│ │ │ ├── hydra/
│ │ │ │ ├── platformio.ini
│ │ │ │ └── variant.h
│ │ │ ├── v1/
│ │ │ │ ├── platformio.ini
│ │ │ │ └── variant.h
│ │ │ └── v1_1/
│ │ │ ├── platformio.ini
│ │ │ └── variant.h
│ │ ├── esp32-common.ini
│ │ ├── esp32.ini
│ │ ├── hackerboxes_esp32_io/
│ │ │ ├── platformio.ini
│ │ │ └── variant.h
│ │ ├── heltec_v1/
│ │ │ ├── platformio.ini
│ │ │ └── variant.h
│ │ ├── heltec_v2/
│ │ │ ├── platformio.ini
│ │ │ └── variant.h
│ │ ├── heltec_v2.1/
│ │ │ ├── platformio.ini
│ │ │ └── variant.h
│ │ ├── heltec_wireless_bridge/
│ │ │ ├── platformio.ini
│ │ │ └── variant.h
│ │ ├── heltec_wsl_v2.1/
│ │ │ ├── platformio.ini
│ │ │ └── variant.h
│ │ ├── m5stack_core/
│ │ │ ├── pins_arduino.h
│ │ │ ├── platformio.ini
│ │ │ └── variant.h
│ │ ├── m5stack_coreink/
│ │ │ ├── pins_arduino.h
│ │ │ ├── platformio.ini
│ │ │ └── variant.h
│ │ ├── nano-g1/
│ │ │ ├── platformio.ini
│ │ │ └── variant.h
│ │ ├── nano-g1-explorer/
│ │ │ ├── platformio.ini
│ │ │ └── variant.h
│ │ ├── radiomaster_900_bandit/
│ │ │ ├── platformio.ini
│ │ │ └── variant.h
│ │ ├── radiomaster_900_bandit_micro/
│ │ │ └── platformio.ini
│ │ ├── radiomaster_900_bandit_nano/
│ │ │ ├── platformio.ini
│ │ │ └── variant.h
│ │ ├── rak11200/
│ │ │ ├── pins_arduino.h
│ │ │ ├── platformio.ini
│ │ │ └── variant.h
│ │ ├── station-g1/
│ │ │ ├── platformio.ini
│ │ │ └── variant.h
│ │ ├── tbeam/
│ │ │ ├── platformio.ini
│ │ │ └── variant.h
│ │ ├── tbeam_v07/
│ │ │ ├── platformio.ini
│ │ │ └── variant.h
│ │ ├── tlora_v1/
│ │ │ ├── platformio.ini
│ │ │ └── variant.h
│ │ ├── tlora_v1_3/
│ │ │ ├── platformio.ini
│ │ │ └── variant.h
│ │ ├── tlora_v2/
│ │ │ ├── platformio.ini
│ │ │ └── variant.h
│ │ ├── tlora_v2_1_16/
│ │ │ ├── platformio.ini
│ │ │ └── variant.h
│ │ ├── tlora_v2_1_16_tcxo/
│ │ │ └── platformio.ini
│ │ ├── tlora_v2_1_18/
│ │ │ ├── platformio.ini
│ │ │ └── variant.h
│ │ ├── tlora_v3_3_0_tcxo/
│ │ │ └── platformio.ini
│ │ ├── trackerd/
│ │ │ ├── platformio.ini
│ │ │ └── variant.h
│ │ └── wiphone/
│ │ ├── pins_arduino.h
│ │ ├── platformio.ini
│ │ └── variant.h
│ ├── esp32c3/
│ │ ├── ai-c3/
│ │ │ ├── platformio.ini
│ │ │ └── variant.h
│ │ ├── diy/
│ │ │ └── esp32c3_super_mini/
│ │ │ ├── pins_arduino.h
│ │ │ ├── platformio.ini
│ │ │ └── variant.h
│ │ ├── esp32c3.ini
│ │ ├── hackerboxes_esp32c3_oled/
│ │ │ ├── platformio.ini
│ │ │ └── variant.h
│ │ ├── heltec_esp32c3/
│ │ │ ├── pins_arduino.h
│ │ │ ├── platformio.ini
│ │ │ └── variant.h
│ │ ├── heltec_hru_3601/
│ │ │ ├── pins_arduino.h
│ │ │ ├── platformio.ini
│ │ │ └── variant.h
│ │ └── m5stack-stamp-c3/
│ │ ├── pins_arduino.h
│ │ ├── platformio.ini
│ │ └── variant.h
│ ├── esp32c6/
│ │ ├── esp32c6.ini
│ │ ├── m5stack_unitc6l/
│ │ │ ├── pins_arduino.h
│ │ │ ├── platformio.ini
│ │ │ ├── variant.cpp
│ │ │ └── variant.h
│ │ └── tlora_c6/
│ │ ├── platformio.ini
│ │ └── variant.h
│ ├── esp32s2/
│ │ ├── esp32s2.ini
│ │ └── nugget_s2_lora/
│ │ ├── platformio.ini
│ │ └── variant.h
│ ├── esp32s3/
│ │ ├── CDEBYTE_EoRa-Hub/
│ │ │ ├── pins_arduino.h
│ │ │ ├── platformio.ini
│ │ │ ├── rfswitch.h
│ │ │ └── variant.h
│ │ ├── CDEBYTE_EoRa-S3/
│ │ │ ├── pins_arduino.h
│ │ │ ├── platformio.ini
│ │ │ └── variant.h
│ │ ├── EBYTE_ESP32-S3/
│ │ │ ├── pins_arduino.h
│ │ │ ├── platformio.ini
│ │ │ └── variant.h
│ │ ├── ELECROW-ThinkNode-M2/
│ │ │ ├── pins_arduino.h
│ │ │ ├── platformio.ini
│ │ │ └── variant.h
│ │ ├── ELECROW-ThinkNode-M5/
│ │ │ ├── pins_arduino.h
│ │ │ ├── platformio.ini
│ │ │ ├── variant.cpp
│ │ │ └── variant.h
│ │ ├── bpi_picow_esp32_s3/
│ │ │ ├── pins_arduino.h
│ │ │ ├── platformio.ini
│ │ │ └── variant.h
│ │ ├── crowpanel-esp32s3-5-epaper/
│ │ │ ├── pins_arduino.h
│ │ │ ├── platformio.ini
│ │ │ └── variant.h
│ │ ├── diy/
│ │ │ ├── my_esp32s3_diy_eink/
│ │ │ │ ├── pins_arduino.h
│ │ │ │ ├── platformio.ini
│ │ │ │ └── variant.h
│ │ │ ├── my_esp32s3_diy_oled/
│ │ │ │ ├── pins_arduino.h
│ │ │ │ ├── platformio.ini
│ │ │ │ └── variant.h
│ │ │ └── t-energy-s3_e22/
│ │ │ ├── platformio.ini
│ │ │ └── variant.h
│ │ ├── dreamcatcher/
│ │ │ ├── platformio.ini
│ │ │ ├── rfswitch.h
│ │ │ └── variant.h
│ │ ├── elecrow_panel/
│ │ │ ├── pins_arduino.h
│ │ │ ├── platformio.ini
│ │ │ └── variant.h
│ │ ├── esp32-s3-pico/
│ │ │ ├── pins_arduino.h
│ │ │ ├── platformio.ini
│ │ │ └── variant.h
│ │ ├── esp32s3.ini
│ │ ├── hackaday-communicator/
│ │ │ ├── pins_arduino.h
│ │ │ ├── platformio.ini
│ │ │ ├── variant.cpp
│ │ │ └── variant.h
│ │ ├── heltec_capsule_sensor_v3/
│ │ │ ├── platformio.ini
│ │ │ └── variant.h
│ │ ├── heltec_sensor_hub/
│ │ │ ├── platformio.ini
│ │ │ └── variant.h
│ │ ├── heltec_v3/
│ │ │ ├── platformio.ini
│ │ │ └── variant.h
│ │ ├── heltec_v4/
│ │ │ ├── pins_arduino.h
│ │ │ ├── platformio.ini
│ │ │ └── variant.h
│ │ ├── heltec_vision_master_e213/
│ │ │ ├── einkDetect.h
│ │ │ ├── nicheGraphics.h
│ │ │ ├── pins_arduino.h
│ │ │ ├── platformio.ini
│ │ │ └── variant.h
│ │ ├── heltec_vision_master_e290/
│ │ │ ├── nicheGraphics.h
│ │ │ ├── pins_arduino.h
│ │ │ ├── platformio.ini
│ │ │ └── variant.h
│ │ ├── heltec_vision_master_t190/
│ │ │ ├── pins_arduino.h
│ │ │ ├── platformio.ini
│ │ │ └── variant.h
│ │ ├── heltec_wireless_paper/
│ │ │ ├── einkDetect.h
│ │ │ ├── nicheGraphics.h
│ │ │ ├── pins_arduino.h
│ │ │ ├── platformio.ini
│ │ │ └── variant.h
│ │ ├── heltec_wireless_paper_v1/
│ │ │ ├── pins_arduino.h
│ │ │ ├── platformio.ini
│ │ │ └── variant.h
│ │ ├── heltec_wireless_tracker/
│ │ │ ├── pins_arduino.h
│ │ │ ├── platformio.ini
│ │ │ └── variant.h
│ │ ├── heltec_wireless_tracker_V1_0/
│ │ │ ├── pins_arduino.h
│ │ │ ├── platformio.ini
│ │ │ └── variant.h
│ │ ├── heltec_wireless_tracker_v2/
│ │ │ ├── pins_arduino.h
│ │ │ ├── platformio.ini
│ │ │ └── variant.h
│ │ ├── heltec_wsl_v3/
│ │ │ ├── platformio.ini
│ │ │ └── variant.h
│ │ ├── icarus/
│ │ │ ├── pins_arduino.h
│ │ │ ├── platformio.ini
│ │ │ └── variant.h
│ │ ├── link32_s3_v1/
│ │ │ ├── pins_arduino.h
│ │ │ ├── platformio.ini
│ │ │ └── variant.h
│ │ ├── m5stack_cardputer_adv/
│ │ │ ├── pins_arduino.h
│ │ │ ├── platformio.ini
│ │ │ └── variant.h
│ │ ├── m5stack_cores3/
│ │ │ ├── pins_arduino.h
│ │ │ ├── platformio.ini
│ │ │ └── variant.h
│ │ ├── mesh-tab/
│ │ │ ├── pins_arduino.h
│ │ │ ├── platformio.ini
│ │ │ └── variant.h
│ │ ├── mini-epaper-s3/
│ │ │ ├── nicheGraphics.h
│ │ │ ├── pins_arduino.h
│ │ │ ├── platformio.ini
│ │ │ └── variant.h
│ │ ├── nibble_esp32/
│ │ │ ├── platformio.ini
│ │ │ └── variant.h
│ │ ├── nugget_s3_lora/
│ │ │ ├── platformio.ini
│ │ │ └── variant.h
│ │ ├── picomputer-s3/
│ │ │ ├── pins_arduino.h
│ │ │ ├── platformio.ini
│ │ │ └── variant.h
│ │ ├── rak3312/
│ │ │ ├── pins_arduino.h
│ │ │ ├── platformio.ini
│ │ │ └── variant.h
│ │ ├── rak_wismesh_tap_v2/
│ │ │ ├── pins_arduino.h
│ │ │ ├── platformio.ini
│ │ │ └── variant.h
│ │ ├── seeed-sensecap-indicator/
│ │ │ ├── pins_arduino.h
│ │ │ ├── platformio.ini
│ │ │ └── variant.h
│ │ ├── seeed_xiao_s3/
│ │ │ ├── pins_arduino.h
│ │ │ ├── platformio.ini
│ │ │ └── variant.h
│ │ ├── station-g2/
│ │ │ ├── pins_arduino.h
│ │ │ ├── platformio.ini
│ │ │ └── variant.h
│ │ ├── t-beam-1w/
│ │ │ ├── pins_arduino.h
│ │ │ ├── platformio.ini
│ │ │ └── variant.h
│ │ ├── t-deck/
│ │ │ ├── pins_arduino.h
│ │ │ ├── platformio.ini
│ │ │ ├── variant.cpp
│ │ │ └── variant.h
│ │ ├── t-deck-pro/
│ │ │ ├── pins_arduino.h
│ │ │ ├── platformio.ini
│ │ │ ├── variant.cpp
│ │ │ └── variant.h
│ │ ├── t-eth-elite/
│ │ │ ├── pins_arduino.h
│ │ │ ├── platformio.ini
│ │ │ ├── rfswitch.h
│ │ │ └── variant.h
│ │ ├── t-watch-s3/
│ │ │ ├── pins_arduino.h
│ │ │ ├── platformio.ini
│ │ │ └── variant.h
│ │ ├── tbeam-s3-core/
│ │ │ ├── pins_arduino.h
│ │ │ ├── platformio.ini
│ │ │ ├── rfswitch.h
│ │ │ └── variant.h
│ │ ├── tlora-pager/
│ │ │ ├── pins_arduino.h
│ │ │ ├── platformio.ini
│ │ │ ├── rfswitch.h
│ │ │ ├── variant.cpp
│ │ │ └── variant.h
│ │ ├── tlora_t3s3_epaper/
│ │ │ ├── nicheGraphics.h
│ │ │ ├── pins_arduino.h
│ │ │ ├── platformio.ini
│ │ │ └── variant.h
│ │ ├── tlora_t3s3_v1/
│ │ │ ├── pins_arduino.h
│ │ │ ├── platformio.ini
│ │ │ ├── rfswitch.h
│ │ │ └── variant.h
│ │ ├── tracksenger/
│ │ │ ├── internal/
│ │ │ │ ├── pins_arduino.h
│ │ │ │ └── variant.h
│ │ │ ├── lcd/
│ │ │ │ ├── pins_arduino.h
│ │ │ │ └── variant.h
│ │ │ ├── oled/
│ │ │ │ ├── pins_arduino.h
│ │ │ │ └── variant.h
│ │ │ └── platformio.ini
│ │ └── unphone/
│ │ ├── pins_arduino.h
│ │ ├── platformio.ini
│ │ ├── variant.cpp
│ │ └── variant.h
│ ├── native/
│ │ ├── portduino/
│ │ │ ├── platformio.ini
│ │ │ └── variant.h
│ │ ├── portduino-buildroot/
│ │ │ ├── platformio.ini
│ │ │ └── variant.h
│ │ └── portduino.ini
│ ├── nrf52840/
│ │ ├── Dongle_nRF52840-pca10059-v1/
│ │ │ ├── platformio.ini
│ │ │ ├── variant.cpp
│ │ │ └── variant.h
│ │ ├── ELECROW-ThinkNode-M1/
│ │ │ ├── nicheGraphics.h
│ │ │ ├── platformio.ini
│ │ │ ├── variant.cpp
│ │ │ └── variant.h
│ │ ├── ELECROW-ThinkNode-M3/
│ │ │ ├── platformio.ini
│ │ │ ├── rfswitch.h
│ │ │ ├── variant.cpp
│ │ │ └── variant.h
│ │ ├── ELECROW-ThinkNode-M4/
│ │ │ ├── platformio.ini
│ │ │ ├── rfswitch.h
│ │ │ ├── variant.cpp
│ │ │ └── variant.h
│ │ ├── ELECROW-ThinkNode-M6/
│ │ │ ├── platformio.ini
│ │ │ ├── variant.cpp
│ │ │ └── variant.h
│ │ ├── ME25LS01-4Y10TD/
│ │ │ ├── platformio.ini
│ │ │ ├── rfswitch.h
│ │ │ ├── variant.cpp
│ │ │ └── variant.h
│ │ ├── ME25LS01-4Y10TD_e-ink/
│ │ │ ├── platformio.ini
│ │ │ ├── rfswitch.h
│ │ │ ├── variant.cpp
│ │ │ └── variant.h
│ │ ├── MS24SF1/
│ │ │ ├── platformio.ini
│ │ │ ├── variant.cpp
│ │ │ └── variant.h
│ │ ├── MakePython_nRF52840_eink/
│ │ │ ├── platformio.ini
│ │ │ ├── variant.cpp
│ │ │ └── variant.h
│ │ ├── MakePython_nRF52840_oled/
│ │ │ ├── platformio.ini
│ │ │ ├── variant.cpp
│ │ │ └── variant.h
│ │ ├── TWC_mesh_v4/
│ │ │ ├── platformio.ini
│ │ │ ├── variant.cpp
│ │ │ └── variant.h
│ │ ├── canaryone/
│ │ │ ├── platformio.ini
│ │ │ ├── variant.cpp
│ │ │ └── variant.h
│ │ ├── cpp_overrides/
│ │ │ └── lfs_util.h
│ │ ├── diy/
│ │ │ ├── WashTastic/
│ │ │ │ └── platformio.ini
│ │ │ ├── nrf52_promicro_diy_tcxo/
│ │ │ │ ├── custom_build_tasks.py
│ │ │ │ ├── nicheGraphics.h
│ │ │ │ ├── platformio.ini
│ │ │ │ ├── readme.md
│ │ │ │ ├── rfswitch.h
│ │ │ │ ├── variant.cpp
│ │ │ │ └── variant.h
│ │ │ ├── seeed-xiao-nrf52840-wio-sx1262/
│ │ │ │ ├── README.md
│ │ │ │ └── platformio.ini
│ │ │ ├── seeed_xiao_nrf52840_e22/
│ │ │ │ └── platformio.ini
│ │ │ └── xiao_ble/
│ │ │ ├── README.md
│ │ │ └── platformio.ini
│ │ ├── dls_Minimesh_Lite/
│ │ │ ├── platformio.ini
│ │ │ ├── variant.cpp
│ │ │ └── variant.h
│ │ ├── feather_diy/
│ │ │ ├── platformio.ini
│ │ │ ├── variant.cpp
│ │ │ └── variant.h
│ │ ├── gat562_mesh_trial_tracker/
│ │ │ ├── platformio.ini
│ │ │ ├── variant.cpp
│ │ │ └── variant.h
│ │ ├── heltec_mesh_node_t114/
│ │ │ ├── platformio.ini
│ │ │ ├── variant.cpp
│ │ │ └── variant.h
│ │ ├── heltec_mesh_node_t114-inkhud/
│ │ │ ├── custom_build_tasks.py
│ │ │ ├── nicheGraphics.h
│ │ │ ├── platformio.ini
│ │ │ ├── variant.cpp
│ │ │ └── variant.h
│ │ ├── heltec_mesh_pocket/
│ │ │ ├── nicheGraphics.h
│ │ │ ├── platformio.ini
│ │ │ ├── variant.cpp
│ │ │ └── variant.h
│ │ ├── heltec_mesh_solar/
│ │ │ ├── nicheGraphics.h
│ │ │ ├── platformio.ini
│ │ │ ├── variant.cpp
│ │ │ └── variant.h
│ │ ├── meshlink/
│ │ │ ├── platformio.ini
│ │ │ ├── variant.cpp
│ │ │ └── variant.h
│ │ ├── meshtiny/
│ │ │ ├── platformio.ini
│ │ │ ├── variant.cpp
│ │ │ └── variant.h
│ │ ├── monteops_hw1/
│ │ │ ├── platformio.ini
│ │ │ ├── variant.cpp
│ │ │ └── variant.h
│ │ ├── muzi_base/
│ │ │ ├── platformio.ini
│ │ │ ├── rfswitch.h
│ │ │ ├── variant.cpp
│ │ │ └── variant.h
│ │ ├── nano-g2-ultra/
│ │ │ ├── platformio.ini
│ │ │ ├── variant.cpp
│ │ │ └── variant.h
│ │ ├── nrf52.ini
│ │ ├── nrf52832.ini
│ │ ├── nrf52840.ini
│ │ ├── r1-neo/
│ │ │ ├── platformio.ini
│ │ │ ├── variant.cpp
│ │ │ └── variant.h
│ │ ├── rak2560/
│ │ │ ├── platformio.ini
│ │ │ ├── variant.cpp
│ │ │ └── variant.h
│ │ ├── rak3401_1watt/
│ │ │ ├── platformio.ini
│ │ │ ├── variant.cpp
│ │ │ └── variant.h
│ │ ├── rak4631/
│ │ │ ├── platformio.ini
│ │ │ ├── variant.cpp
│ │ │ └── variant.h
│ │ ├── rak4631_epaper/
│ │ │ ├── platformio.ini
│ │ │ ├── variant.cpp
│ │ │ └── variant.h
│ │ ├── rak4631_epaper_onrxtx/
│ │ │ ├── platformio.ini
│ │ │ ├── variant.cpp
│ │ │ └── variant.h
│ │ ├── rak4631_eth_gw/
│ │ │ ├── platformio.ini
│ │ │ ├── variant.cpp
│ │ │ └── variant.h
│ │ ├── rak4631_nomadstar_meteor_pro/
│ │ │ ├── platformio.ini
│ │ │ ├── variant.cpp
│ │ │ └── variant.h
│ │ ├── rak_wismeshtag/
│ │ │ ├── platformio.ini
│ │ │ ├── variant.cpp
│ │ │ └── variant.h
│ │ ├── rak_wismeshtap/
│ │ │ ├── platformio.ini
│ │ │ ├── variant.cpp
│ │ │ └── variant.h
│ │ ├── seeed_solar_node/
│ │ │ ├── platformio.ini
│ │ │ ├── variant.cpp
│ │ │ └── variant.h
│ │ ├── seeed_wio_tracker_L1/
│ │ │ ├── platformio.ini
│ │ │ ├── variant.cpp
│ │ │ └── variant.h
│ │ ├── seeed_wio_tracker_L1_eink/
│ │ │ ├── nicheGraphics.h
│ │ │ ├── platformio.ini
│ │ │ ├── variant.cpp
│ │ │ └── variant.h
│ │ ├── seeed_xiao_nrf52840_kit/
│ │ │ ├── platformio.ini
│ │ │ ├── variant.cpp
│ │ │ └── variant.h
│ │ ├── t-echo/
│ │ │ ├── nicheGraphics.h
│ │ │ ├── platformio.ini
│ │ │ ├── variant.cpp
│ │ │ └── variant.h
│ │ ├── t-echo-lite/
│ │ │ ├── platformio.ini
│ │ │ ├── variant.cpp
│ │ │ └── variant.h
│ │ ├── t-echo-plus/
│ │ │ ├── nicheGraphics.h
│ │ │ ├── platformio.ini
│ │ │ ├── variant.cpp
│ │ │ └── variant.h
│ │ ├── tracker-t1000-e/
│ │ │ ├── platformio.ini
│ │ │ ├── rfswitch.h
│ │ │ ├── variant.cpp
│ │ │ └── variant.h
│ │ ├── wio-sdk-wm1110/
│ │ │ ├── platformio.ini
│ │ │ ├── rfswitch.h
│ │ │ ├── variant.cpp
│ │ │ └── variant.h
│ │ ├── wio-t1000-s/
│ │ │ ├── platformio.ini
│ │ │ ├── rfswitch.h
│ │ │ ├── variant.cpp
│ │ │ └── variant.h
│ │ └── wio-tracker-wm1110/
│ │ ├── platformio.ini
│ │ ├── rfswitch.h
│ │ ├── variant.cpp
│ │ └── variant.h
│ ├── rp2040/
│ │ ├── challenger_2040_lora/
│ │ │ ├── pins_arduino.h
│ │ │ ├── platformio.ini
│ │ │ └── variant.h
│ │ ├── ec_catsniffer/
│ │ │ ├── platformio.ini
│ │ │ ├── variant.cpp
│ │ │ └── variant.h
│ │ ├── feather_rp2040_rfm95/
│ │ │ ├── platformio.ini
│ │ │ └── variant.h
│ │ ├── nibble_rp2040/
│ │ │ ├── platformio.ini
│ │ │ └── variant.h
│ │ ├── rak11310/
│ │ │ ├── pins_arduino.h
│ │ │ ├── platformio.ini
│ │ │ └── variant.h
│ │ ├── rp2040-lora/
│ │ │ ├── platformio.ini
│ │ │ └── variant.h
│ │ ├── rp2040.ini
│ │ ├── rpipico/
│ │ │ ├── platformio.ini
│ │ │ └── variant.h
│ │ ├── rpipico-slowclock/
│ │ │ ├── platformio.ini
│ │ │ └── variant.h
│ │ ├── rpipicow/
│ │ │ ├── platformio.ini
│ │ │ └── variant.h
│ │ └── senselora_rp2040/
│ │ ├── pins_arduino.h
│ │ ├── platformio.ini
│ │ └── variant.h
│ ├── rp2350/
│ │ ├── rp2350.ini
│ │ ├── rpipico2/
│ │ │ ├── platformio.ini
│ │ │ └── variant.h
│ │ └── rpipico2w/
│ │ ├── platformio.ini
│ │ └── variant.h
│ └── stm32/
│ ├── CDEBYTE_E77-MBL/
│ │ ├── platformio.ini
│ │ ├── rfswitch.h
│ │ └── variant.h
│ ├── milesight_gs301/
│ │ ├── platformio.ini
│ │ ├── rfswitch.h
│ │ ├── variant.cpp
│ │ └── variant.h
│ ├── rak3172/
│ │ ├── platformio.ini
│ │ ├── rfswitch.h
│ │ └── variant.h
│ ├── russell/
│ │ ├── platformio.ini
│ │ ├── rfswitch.h
│ │ └── variant.h
│ ├── stm32.ini
│ └── wio-e5/
│ ├── platformio.ini
│ ├── rfswitch.h
│ └── variant.h
└── version.properties
================================================
FILE CONTENTS
================================================
================================================
FILE: .clusterfuzzlite/Dockerfile
================================================
# This container is used to build Meshtastic with the libraries required by the fuzzer.
# ClusterFuzzLite starts the container, runs the build.sh script, and then exits.
# As this is not a long running service, health-checks are not required. ClusterFuzzLite
# also only works if the user remains unchanged from the base image (it expects to run
# as root).
# trunk-ignore-all(trivy/DS026): No healthcheck is needed for this builder container
# trunk-ignore-all(checkov/CKV_DOCKER_2): No healthcheck is needed for this builder container
# trunk-ignore-all(checkov/CKV_DOCKER_3): We must run as root for this container
# trunk-ignore-all(trivy/DS002): We must run as root for this container
# trunk-ignore-all(checkov/CKV_DOCKER_8): We must run as root for this container
# trunk-ignore-all(hadolint/DL3002): We must run as root for this container
FROM gcr.io/oss-fuzz-base/base-builder:v1
ENV PIP_ROOT_USER_ACTION=ignore
# trunk-ignore(hadolint/DL3008): apt packages are not pinned.
# trunk-ignore(terrascan/AC_DOCKER_0002): apt packages are not pinned.
RUN apt-get update && apt-get install --no-install-recommends -y \
cmake git zip libgpiod-dev libbluetooth-dev libi2c-dev \
libunistring-dev libmicrohttpd-dev libgnutls28-dev libgcrypt20-dev \
libusb-1.0-0-dev libssl-dev pkg-config libsqlite3-dev libsdl2-dev && \
apt-get clean && rm -rf /var/lib/apt/lists/* && \
pip install --no-cache-dir -U \
platformio==6.1.16 \
grpcio-tools==1.68.1 \
meshtastic==2.5.9
# Ugly hack to avoid clang detecting a conflict between the math "log" function and the "log" function in framework-portduino/cores/portduino/logging.h
RUN sed -i -e 's/__MATHCALL_VEC (log,, (_Mdouble_ __x));//' /usr/include/x86_64-linux-gnu/bits/mathcalls.h
# A few dependencies are too old on the base-builder image. More recent versions are built from source.
WORKDIR $SRC
RUN git config --global advice.detachedHead false && \
git clone --depth 1 --branch 0.8.0 https://github.com/jbeder/yaml-cpp.git && \
git clone --depth 1 --branch v2.3.3 https://github.com/babelouest/orcania.git && \
git clone --depth 1 --branch v1.4.20 https://github.com/babelouest/yder.git && \
git clone --depth 1 --branch v2.7.15 https://github.com/babelouest/ulfius.git
COPY ./.clusterfuzzlite/build.sh $SRC/
WORKDIR $SRC/firmware
COPY . $SRC/firmware/
# https://docs.platformio.org/en/latest/envvars.html
ENV PLATFORMIO_CORE_DIR=$SRC/pio/core \
PLATFORMIO_LIBDEPS_DIR=$SRC/pio/libdeps \
PLATFORMIO_PACKAGES_DIR=$SRC/pio/packages \
PLATFORMIO_SETTING_ENABLE_CACHE=No \
PIO_ENV=buildroot
RUN platformio pkg install --environment $PIO_ENV
================================================
FILE: .clusterfuzzlite/README.md
================================================
# ClusterFuzzLite for Meshtastic
This directory contains the fuzzer implementation for Meshtastic using the ClusterFuzzLite framework.
See the [ClusterFuzzLite documentation](https://google.github.io/clusterfuzzlite/) for more details.
## Running locally
ClusterFuzzLite uses the OSS-Fuzz toolchain. To build the fuzzer manually, first grab a copy of OSS-Fuzz.
```shell
git clone https://github.com/google/oss-fuzz.git
cd oss-fuzz
```
To build the fuzzer, run:
```shell
python3 infra/helper.py build_image --external $PATH_TO_MESHTASTIC_FIRMWARE_DIRECTORY
python3 infra/helper.py build_fuzzers --external $PATH_TO_MESHTASTIC_FIRMWARE_DIRECTORY --sanitizer address
```
To run the fuzzer, run:
```shell
python3 infra/helper.py run_fuzzer --external --corpus-dir=<path-to-temp-corpus-dir> $PATH_TO_MESHTASTIC_FIRMWARE_DIRECTORY router_fuzzer
```
More background on these commands can be found in the
[ClusterFuzzLite documentation](https://google.github.io/clusterfuzzlite/build-integration/#testing-locally).
## router_fuzzer.cpp
This fuzzer submits MeshPacket protos to the `Router::enqueueReceivedMessage` method. It takes the binary
data from the fuzzer and decodes that data to a MeshPacket using nanopb. A few fields in
the MeshPacket are modified by the fuzzer.
- If the `to` field is 0, it will be replaced with the NodeID of the running node.
- If the `from` field is 0, it will be replaced with the NodeID of the running node.
- If the `id` field is 0, it will be replaced with an incrementing counter value.
- If the `pki_encrypted` field is true, the `public_key` field will be populated with the first admin key.
The `router_fuzzer_seed_corpus.py` file contains a list of MeshPackets. It is run from inside build.sh and
writes the binary MeshPacket protos to files. These files are use used by the fuzzer as its initial seed data,
helping the fuzzer to start off with a few known inputs.
### Interpreting a fuzzer crash
If the fuzzer crashes, it'll write the input bytes used for the test case to a file and notify about the
location of that file. The contents of the file are a binary serialized MeshPacket protobuf. The following
snippet of Python code can be used to parse the file into a human readable form.
```python
from meshtastic.protobuf import mesh_pb2
mesh_pb2.MeshPacket.FromString(open("crash-XXXX-file", "rb").read())
```
Consider adding any such crash results to the `router_fuzzer_seed_corpus.py` file to ensure there a isn't
a future regression for that crash test case.
================================================
FILE: .clusterfuzzlite/build.sh
================================================
#!/bin/bash -eu
# Build Meshtastic and a few needed dependencies using clang++
# and the OSS-Fuzz required build flags.
env
cd "$SRC"
NPROC=$(nproc || echo 1)
LDFLAGS=-lpthread cmake -S "$SRC/yaml-cpp" -B "$WORK/yaml-cpp/$SANITIZER" \
-DBUILD_SHARED_LIBS=OFF
cmake --build "$WORK/yaml-cpp/$SANITIZER" -j "$NPROC"
cmake --install "$WORK/yaml-cpp/$SANITIZER" --prefix /usr
cmake -S "$SRC/orcania" -B "$WORK/orcania/$SANITIZER" \
-DBUILD_STATIC=ON
cmake --build "$WORK/orcania/$SANITIZER" -j "$NPROC"
cmake --install "$WORK/orcania/$SANITIZER" --prefix /usr
cmake -S "$SRC/yder" -B "$WORK/yder/$SANITIZER" \
-DBUILD_STATIC=ON -DWITH_JOURNALD=OFF
cmake --build "$WORK/yder/$SANITIZER" -j "$NPROC"
cmake --install "$WORK/yder/$SANITIZER" --prefix /usr
cmake -S "$SRC/ulfius" -B "$WORK/ulfius/$SANITIZER" \
-DBUILD_STATIC=ON -DWITH_JANSSON=OFF -DWITH_CURL=OFF -DWITH_WEBSOCKET=OFF
cmake --build "$WORK/ulfius/$SANITIZER" -j "$NPROC"
cmake --install "$WORK/ulfius/$SANITIZER" --prefix /usr
cd "$SRC/firmware"
PLATFORMIO_EXTRA_SCRIPTS=$(echo -e "pre:.clusterfuzzlite/platformio-clusterfuzzlite-pre.py\npost:.clusterfuzzlite/platformio-clusterfuzzlite-post.py")
STATIC_LIBS=$(pkg-config --libs --static libulfius openssl libgpiod yaml-cpp bluez --silence-errors)
export PLATFORMIO_EXTRA_SCRIPTS
export STATIC_LIBS
export PLATFORMIO_WORKSPACE_DIR="$WORK/pio/$SANITIZER"
export TARGET_CC=$CC
export TARGET_CXX=$CXX
export TARGET_LD=$CXX
export TARGET_AR=llvm-ar
export TARGET_AS=llvm-as
export TARGET_OBJCOPY=llvm-objcopy
export TARGET_RANLIB=llvm-ranlib
mkdir -p "$OUT/lib"
cp .clusterfuzzlite/*_fuzzer.options "$OUT/"
for f in .clusterfuzzlite/*_fuzzer.cpp; do
fuzzer=$(basename "$f" .cpp)
cp -f "$f" src/fuzzer.cpp
pio run -vvv --environment "$PIO_ENV"
program="$PLATFORMIO_WORKSPACE_DIR/build/$PIO_ENV/meshtasticd"
cp "$program" "$OUT/$fuzzer"
# Copy shared libraries used by the fuzzer.
read -d '' -ra shared_libs < <(ldd "$program" | sed -n 's/[^=]\+=> \([^ ]\+\).*/\1/p') || true
cp -f "${shared_libs[@]}" "$OUT/lib/"
# Build the initial fuzzer seed corpus.
corpus_name="${fuzzer}_seed_corpus"
corpus_generator="$PWD/.clusterfuzzlite/${corpus_name}.py"
if [[ -f $corpus_generator ]]; then
mkdir "$corpus_name"
pushd "$corpus_name"
python3 "$corpus_generator"
popd
zip -D "$OUT/${corpus_name}.zip" "$corpus_name"/*
fi
done
================================================
FILE: .clusterfuzzlite/platformio-clusterfuzzlite-post.py
================================================
"""PlatformIO build script (post: runs after other Meshtastic scripts)."""
import os
import shlex
from SCons.Script import DefaultEnvironment
env = DefaultEnvironment()
# Remove any static libraries from the LIBS environment. Static libraries are
# handled in platformio-clusterfuzzlite-pre.py.
static_libs = set(lib[2:] for lib in shlex.split(os.getenv("STATIC_LIBS")))
env.Replace(
LIBS=[
lib for lib in env["LIBS"] if not (isinstance(lib, str) and lib in static_libs)
],
)
# FrameworkArduino/portduino/main.cpp contains the "main" function the binary.
# The fuzzing framework also provides a "main" function and needs to be run
# before Meshtastic is started. We rename the "main" function for Meshtastic to
# "portduino_main" here so that it can be called inside the fuzzer.
env.AddPostAction(
"$BUILD_DIR/FrameworkArduino/portduino/main.cpp.o",
env.VerboseAction(
" ".join(
[
"$OBJCOPY",
"--redefine-sym=main=portduino_main",
"$BUILD_DIR/FrameworkArduino/portduino/main.cpp.o",
]
),
"Renaming main symbol to portduino_main",
),
)
================================================
FILE: .clusterfuzzlite/platformio-clusterfuzzlite-pre.py
================================================
"""PlatformIO build script (pre: runs before other Meshtastic scripts).
ClusterFuzzLite executes in a different container from the build. During the build,
attempt to link statically to as many dependencies as possible. For dependencies that
do not have static libraries, the shared library files are copied to the output
directory by the build.sh script.
"""
import glob
import os
import shlex
from SCons.Script import DefaultEnvironment, Literal
env = DefaultEnvironment()
cxxflags = shlex.split(os.getenv("CXXFLAGS"))
sanitizer_flags = shlex.split(os.getenv("SANITIZER_FLAGS"))
lib_fuzzing_engine = shlex.split(os.getenv("LIB_FUZZING_ENGINE"))
statics = glob.glob("/usr/lib/lib*.a") + glob.glob("/usr/lib/*/lib*.a")
no_static = set(("-ldl",))
def replaceStatic(lib):
"""Replace -l<libname> with the static .a file for the library."""
if not lib.startswith("-l") or lib in no_static:
return lib
static_name = f"/lib{lib[2:]}.a"
static = [s for s in statics if s.endswith(static_name)]
if len(static) == 1:
return static[0]
return lib
# Setup the environment for building with Clang and the OSS-Fuzz required build flags.
env.Append(
CFLAGS=os.getenv("CFLAGS"),
CXXFLAGS=cxxflags,
LIBSOURCE_DIRS=["/usr/lib/x86_64-linux-gnu"],
LINKFLAGS=cxxflags
+ sanitizer_flags
+ lib_fuzzing_engine
+ ["-stdlib=libc++", "-std=c++17"],
_LIBFLAGS=[replaceStatic(s) for s in shlex.split(os.getenv("STATIC_LIBS"))]
+ [
"/usr/lib/x86_64-linux-gnu/libunistring.a", # Needs to be at the end.
# Find the shared libraries in a subdirectory named lib
# within the same directory as the binary.
Literal("-Wl,-rpath,$ORIGIN/lib"),
"-Wl,-z,origin",
],
)
================================================
FILE: .clusterfuzzlite/project.yaml
================================================
language: c++
================================================
FILE: .clusterfuzzlite/router_fuzzer.cpp
================================================
// Fuzzer implementation that sends MeshPackets to Router::enqueueReceivedMessage.
#include <condition_variable>
#include <cstdlib>
#include <mutex>
#include <pb_decode.h>
#include <stdexcept>
#include <string>
#include <thread>
#include "PortduinoGPIO.h"
#include "PortduinoGlue.h"
#include "PowerFSM.h"
#include "mesh/MeshTypes.h"
#include "mesh/NodeDB.h"
#include "mesh/Router.h"
#include "mesh/TypeConversions.h"
#include "mesh/mesh-pb-constants.h"
namespace
{
constexpr uint32_t nodeId = 0x12345678;
// Set to true when lateInitVariant finishes. Used to ensure lateInitVariant was called during startup.
bool hasBeenConfigured = false;
// These are used to block the Arduino loop() function until a fuzzer input is ready. This is
// an optimization that prevents a sleep from happening before the loop is run. The Arduino loop
// function calls loopCanSleep() before sleeping. loopCanSleep is implemented here in the fuzzer
// and blocks until runLoopOnce() is called to signal for the loop to run.
bool fuzzerRunning = false; // Set to true once LLVMFuzzerTestOneInput has started running.
bool loopCanRun = true; // The main Arduino loop() can run when this is true.
bool loopIsWaiting = false; // The main Arduino loop() is waiting to be signaled to run.
bool loopShouldExit = false; // Indicates that the main Arduino thread should exit by throwing ShouldExitException.
std::mutex loopLock;
std::condition_variable loopCV;
std::thread meshtasticThread;
// This exception is thrown when the portuino main thread should exit.
class ShouldExitException : public std::runtime_error
{
public:
using std::runtime_error::runtime_error;
};
// Start the loop for one test case and wait till the loop has completed. This ensures fuzz
// test cases do not overlap with one another. This helps the fuzzer attribute a crash to the
// single, currently running, test case.
void runLoopOnce()
{
realHardware = true; // Avoids delay(100) within portduino/main.cpp
std::unique_lock<std::mutex> lck(loopLock);
fuzzerRunning = true;
loopCanRun = true;
loopCV.notify_one();
loopCV.wait(lck, [] { return !loopCanRun && loopIsWaiting; });
}
} // namespace
// Called in the main Arduino loop function to determine if the loop can delay/sleep before running again.
// We use this as a way to block the loop from sleeping and to start the loop function immediately when a
// fuzzer input is ready.
bool loopCanSleep()
{
std::unique_lock<std::mutex> lck(loopLock);
loopIsWaiting = true;
loopCV.notify_one();
loopCV.wait(lck, [] { return loopCanRun || loopShouldExit; });
loopIsWaiting = false;
if (loopShouldExit)
throw ShouldExitException("exit");
if (!fuzzerRunning)
return true; // The loop can sleep before the fuzzer starts.
loopCanRun = false; // Only run the loop once before waiting again.
return false;
}
// Called just prior to starting Meshtastic. Allows for setting config values before startup.
void lateInitVariant()
{
portduino_config.logoutputlevel = level_error;
channelFile.channels[0] = meshtastic_Channel{
.has_settings = true,
.settings =
meshtastic_ChannelSettings{
.psk = {.size = 1, .bytes = {/*defaultpskIndex=*/1}},
.name = "LongFast",
.uplink_enabled = true,
.has_module_settings = true,
.module_settings = {.position_precision = 16},
},
.role = meshtastic_Channel_Role_PRIMARY,
};
config.security.admin_key[0] = {
.size = 32,
.bytes = {0xcd, 0xc0, 0xb4, 0x3c, 0x53, 0x24, 0xdf, 0x13, 0xca, 0x5a, 0xa6, 0x0c, 0x0d, 0xec, 0x85, 0x5a,
0x4c, 0xf6, 0x1a, 0x96, 0x04, 0x1a, 0x3e, 0xfc, 0xbb, 0x8e, 0x33, 0x71, 0xe5, 0xfc, 0xff, 0x3c},
};
config.security.admin_key_count = 1;
config.lora.region = meshtastic_Config_LoRaConfig_RegionCode_US;
moduleConfig.has_mqtt = true;
moduleConfig.mqtt = meshtastic_ModuleConfig_MQTTConfig{
.enabled = true,
.proxy_to_client_enabled = true,
};
moduleConfig.has_store_forward = true;
moduleConfig.store_forward = meshtastic_ModuleConfig_StoreForwardConfig{
.enabled = true,
.history_return_max = 4,
.history_return_window = 600,
.is_server = true,
};
meshtastic_Position fixedGPS = meshtastic_Position{
.has_latitude_i = true,
.latitude_i = static_cast<uint32_t>(1 * 1e7),
.has_longitude_i = true,
.longitude_i = static_cast<uint32_t>(3 * 1e7),
.has_altitude = true,
.altitude = 64,
.location_source = meshtastic_Position_LocSource_LOC_MANUAL,
};
nodeDB->setLocalPosition(fixedGPS);
config.has_position = true;
config.position.fixed_position = true;
meshtastic_NodeInfoLite *info = nodeDB->getMeshNode(nodeDB->getNodeNum());
info->has_position = true;
info->position = TypeConversions::ConvertToPositionLite(fixedGPS);
hasBeenConfigured = true;
}
extern "C" {
int portduino_main(int argc, char **argv); // Renamed "main" function from Meshtastic binary.
// Start Meshtastic in a thread and wait till it has reached the ON state.
int LLVMFuzzerInitialize(int *argc, char ***argv)
{
portduino_config.maxtophone = 5;
meshtasticThread = std::thread([program = *argv[0]]() {
char nodeIdStr[12];
strcpy(nodeIdStr, std::to_string(nodeId).c_str());
int argc = 7;
char *argv[] = {program, "-d", "/tmp/meshtastic", "-h", nodeIdStr, "-p", "0", nullptr};
try {
portduino_main(argc, argv);
} catch (const ShouldExitException &) {
}
});
std::atexit([] {
{
const std::lock_guard<std::mutex> lck(loopLock);
loopShouldExit = true;
loopCV.notify_one();
}
meshtasticThread.join();
});
// Wait for startup.
for (int i = 1; i < 20; ++i) {
if (powerFSM.getState() == &stateON) {
assert(hasBeenConfigured);
assert(router);
assert(nodeDB);
return 0;
}
std::this_thread::sleep_for(std::chrono::seconds(1));
}
return 1;
}
// This is the main entrypoint for the fuzzer (the fuzz target). The fuzzer will provide an array of bytes to be
// interpreted by this method. To keep things simple, the bytes are interpreted as a binary serialized MeshPacket
// proto. Any crashes discovered by the fuzzer will be written to a file. Unserialize that file to print the MeshPacket
// that caused the failure.
//
// This guide provides best practices for writing a fuzzer target.
// https://github.com/google/fuzzing/blob/master/docs/good-fuzz-target.md
int LLVMFuzzerTestOneInput(const uint8_t *data, size_t length)
{
meshtastic_MeshPacket p = meshtastic_MeshPacket_init_default;
pb_istream_t stream = pb_istream_from_buffer(data, length);
// Ignore any inputs that fail to decode or have fields set that are not transmitted over LoRa.
if (!pb_decode(&stream, &meshtastic_MeshPacket_msg, &p) || p.rx_time || p.rx_snr || p.priority || p.rx_rssi || p.delayed ||
p.public_key.size || p.next_hop || p.relay_node || p.tx_after)
return -1; // Reject: The input will not be added to the corpus.
if (p.which_payload_variant == meshtastic_MeshPacket_decoded_tag) {
meshtastic_Data d;
stream = pb_istream_from_buffer(p.decoded.payload.bytes, p.decoded.payload.size);
if (!pb_decode(&stream, &meshtastic_Data_msg, &d))
return -1; // Reject: The input will not be added to the corpus.
}
// Provide default values for a few fields so the fuzzer doesn't need to guess them.
if (p.from == 0)
p.from = nodeDB->getNodeNum();
if (p.to == 0)
p.to = nodeDB->getNodeNum();
static uint32_t packetId = 0;
if (p.id == 0)
p.id == ++packetId;
if (p.pki_encrypted && config.security.admin_key_count)
memcpy(&p.public_key, &config.security.admin_key[0], sizeof(p.public_key));
router->enqueueReceivedMessage(packetPool.allocCopy(p));
runLoopOnce();
return 0; // Accept: The input may be added to the corpus.
}
}
================================================
FILE: .clusterfuzzlite/router_fuzzer.options
================================================
[libfuzzer]
max_len=256
================================================
FILE: .clusterfuzzlite/router_fuzzer_seed_corpus.py
================================================
"""Generate an initial set of MeshPackets.
The fuzzer uses these MeshPackets as an initial seed of test candidates.
It's also good to add any previously discovered crash test cases to this list
to avoid future regressions.
If left unset, the following values will be automatically set by the fuzzer.
- to: automatically set to the running node's NodeID
- from: automatically set to the running node's NodeID
- id: automatically set to the value of an incrementing counter
Additionally, if `pki_encrypted` is populated in the packet, the first admin key
will be copied into the `public_key` field.
"""
import base64
from meshtastic import BROADCAST_NUM
from meshtastic.protobuf import (
admin_pb2,
atak_pb2,
mesh_pb2,
portnums_pb2,
telemetry_pb2,
)
def From(node: int = 9):
"""Return a dict suitable for **kwargs for populating the 'from' field.
'from' is a reserved keyword in Python. It can't be used directly as an
argument to the MeshPacket constructor. Rather **From() can be used as
the final argument to provide the from node as a **kwarg.
Defaults to 9 if no value is provided.
"""
return {"from": node}
packets = (
(
"position",
mesh_pb2.MeshPacket(
decoded=mesh_pb2.Data(
portnum=portnums_pb2.PortNum.POSITION_APP,
payload=mesh_pb2.Position(
latitude_i=int(1 * 1e7),
longitude_i=int(2 * 1e7),
altitude=5,
precision_bits=32,
).SerializeToString(),
),
to=BROADCAST_NUM,
**From(),
),
),
(
"telemetry",
mesh_pb2.MeshPacket(
decoded=mesh_pb2.Data(
portnum=portnums_pb2.PortNum.TELEMETRY_APP,
payload=telemetry_pb2.Telemetry(
time=1736192207,
device_metrics=telemetry_pb2.DeviceMetrics(
battery_level=101,
channel_utilization=8,
air_util_tx=2,
uptime_seconds=42,
),
).SerializeToString(),
),
to=BROADCAST_NUM,
**From(),
),
),
(
"text",
mesh_pb2.MeshPacket(
decoded=mesh_pb2.Data(
portnum=portnums_pb2.PortNum.TEXT_MESSAGE_APP,
payload=b"Hello world",
),
to=BROADCAST_NUM,
**From(),
),
),
(
"user",
mesh_pb2.MeshPacket(
decoded=mesh_pb2.Data(
portnum=portnums_pb2.PortNum.NODEINFO_APP,
payload=mesh_pb2.User(
id="!00000009",
long_name="Node 9",
short_name="N9",
macaddr=b"\x00\x00\x00\x00\x00\x09",
hw_model=mesh_pb2.HardwareModel.RAK4631,
public_key=base64.b64decode(
"L0ih/6F41itofdE8mYyHk1SdfOJ/QRM1KQ+pO4vEEjQ="
),
).SerializeToString(),
),
**From(),
),
),
(
"traceroute",
mesh_pb2.MeshPacket(
decoded=mesh_pb2.Data(
portnum=portnums_pb2.PortNum.TRACEROUTE_APP,
payload=mesh_pb2.RouteDiscovery(
route=[10],
).SerializeToString(),
),
**From(),
),
),
(
"routing",
mesh_pb2.MeshPacket(
decoded=mesh_pb2.Data(
portnum=portnums_pb2.PortNum.ROUTING_APP,
payload=mesh_pb2.Routing(
error_reason=mesh_pb2.Routing.NO_RESPONSE,
).SerializeToString(),
),
**From(),
),
),
(
"admin",
mesh_pb2.MeshPacket(
decoded=mesh_pb2.Data(
portnum=portnums_pb2.PortNum.ADMIN_APP,
payload=admin_pb2.AdminMessage(
get_owner_request=True,
).SerializeToString(),
),
pki_encrypted=True,
**From(),
),
),
(
"atak",
mesh_pb2.MeshPacket(
decoded=mesh_pb2.Data(
portnum=portnums_pb2.PortNum.ATAK_PLUGIN,
payload=atak_pb2.TAKPacket(
is_compressed=True,
# Note, the strings are not valid for a compressed message, but will
# give the fuzzer a starting point.
contact=atak_pb2.Contact(
callsign="callsign", device_callsign="device_callsign"
),
chat=atak_pb2.GeoChat(
message="message", to="to", to_callsign="to_callsign"
),
).SerializeToString(),
),
**From(),
),
),
)
for name, packet in packets:
with open(f"{name}.MeshPacket", "wb") as f:
f.write(packet.SerializeToString())
================================================
FILE: .devcontainer/99-platformio-udev.rules
================================================
# Copyright (c) 2014-present PlatformIO <contact@platformio.org>
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
#####################################################################################
#
# INSTALLATION
#
# Please visit > https://docs.platformio.org/en/latest/core/installation/udev-rules.html
#
#####################################################################################
#
# Boards
#
# CP210X USB UART
ATTRS{idVendor}=="10c4", ATTRS{idProduct}=="ea[67][013]", MODE:="0666", ENV{ID_MM_DEVICE_IGNORE}="1", ENV{ID_MM_PORT_IGNORE}="1"
ATTRS{idVendor}=="10c4", ATTRS{idProduct}=="80a9", MODE:="0666", ENV{ID_MM_DEVICE_IGNORE}="1", ENV{ID_MM_PORT_IGNORE}="1"
# FT231XS USB UART
ATTRS{idVendor}=="0403", ATTRS{idProduct}=="6015", MODE:="0666", ENV{ID_MM_DEVICE_IGNORE}="1", ENV{ID_MM_PORT_IGNORE}="1"
# Prolific Technology, Inc. PL2303 Serial Port
ATTRS{idVendor}=="067b", ATTRS{idProduct}=="2303", MODE:="0666", ENV{ID_MM_DEVICE_IGNORE}="1", ENV{ID_MM_PORT_IGNORE}="1"
# QinHeng Electronics HL-340 USB-Serial adapter
ATTRS{idVendor}=="1a86", ATTRS{idProduct}=="7523", MODE:="0666", ENV{ID_MM_DEVICE_IGNORE}="1", ENV{ID_MM_PORT_IGNORE}="1"
# QinHeng Electronics CH343 USB-Serial adapter
ATTRS{idVendor}=="1a86", ATTRS{idProduct}=="55d3", MODE:="0666", ENV{ID_MM_DEVICE_IGNORE}="1", ENV{ID_MM_PORT_IGNORE}="1"
# QinHeng Electronics CH9102 USB-Serial adapter
ATTRS{idVendor}=="1a86", ATTRS{idProduct}=="55d4", MODE:="0666", ENV{ID_MM_DEVICE_IGNORE}="1", ENV{ID_MM_PORT_IGNORE}="1"
# Arduino boards
ATTRS{idVendor}=="2341", ATTRS{idProduct}=="[08][023]*", MODE:="0666", ENV{ID_MM_DEVICE_IGNORE}="1", ENV{ID_MM_PORT_IGNORE}="1"
ATTRS{idVendor}=="2a03", ATTRS{idProduct}=="[08][02]*", MODE:="0666", ENV{ID_MM_DEVICE_IGNORE}="1", ENV{ID_MM_PORT_IGNORE}="1"
# Arduino SAM-BA
ATTRS{idVendor}=="03eb", ATTRS{idProduct}=="6124", MODE:="0666", ENV{ID_MM_DEVICE_IGNORE}="1", ENV{MTP_NO_PROBE}="1"
# Digistump boards
ATTRS{idVendor}=="16d0", ATTRS{idProduct}=="0753", MODE:="0666", ENV{ID_MM_DEVICE_IGNORE}="1", ENV{ID_MM_PORT_IGNORE}="1"
# Maple with DFU
ATTRS{idVendor}=="1eaf", ATTRS{idProduct}=="000[34]", MODE:="0666", ENV{ID_MM_DEVICE_IGNORE}="1", ENV{ID_MM_PORT_IGNORE}="1"
# USBtiny
ATTRS{idProduct}=="0c9f", ATTRS{idVendor}=="1781", MODE:="0666", ENV{ID_MM_DEVICE_IGNORE}="1", ENV{ID_MM_PORT_IGNORE}="1"
# USBasp V2.0
ATTRS{idVendor}=="16c0", ATTRS{idProduct}=="05dc", MODE:="0666", ENV{ID_MM_DEVICE_IGNORE}="1", ENV{ID_MM_PORT_IGNORE}="1"
# Teensy boards
ATTRS{idVendor}=="16c0", ATTRS{idProduct}=="04[789B]?", ENV{ID_MM_DEVICE_IGNORE}="1", ENV{ID_MM_PORT_IGNORE}="1"
ATTRS{idVendor}=="16c0", ATTRS{idProduct}=="04[789A]?", ENV{MTP_NO_PROBE}="1"
SUBSYSTEMS=="usb", ATTRS{idVendor}=="16c0", ATTRS{idProduct}=="04[789ABCD]?", MODE:="0666"
KERNEL=="ttyACM*", ATTRS{idVendor}=="16c0", ATTRS{idProduct}=="04[789B]?", MODE:="0666"
# TI Stellaris Launchpad
ATTRS{idVendor}=="1cbe", ATTRS{idProduct}=="00fd", MODE="0666", ENV{ID_MM_DEVICE_IGNORE}="1", ENV{ID_MM_PORT_IGNORE}="1"
# TI MSP430 Launchpad
ATTRS{idVendor}=="0451", ATTRS{idProduct}=="f432", MODE="0666", ENV{ID_MM_DEVICE_IGNORE}="1", ENV{ID_MM_PORT_IGNORE}="1"
# GD32V DFU Bootloader
ATTRS{idVendor}=="28e9", ATTRS{idProduct}=="0189", MODE="0666", ENV{ID_MM_DEVICE_IGNORE}="1", ENV{ID_MM_PORT_IGNORE}="1"
# FireBeetle-ESP32
ATTRS{idVendor}=="1a86", ATTRS{idProduct}=="7522", MODE="0666", ENV{ID_MM_DEVICE_IGNORE}="1", ENV{ID_MM_PORT_IGNORE}="1"
# Wio Terminal
ATTRS{idVendor}=="2886", ATTRS{idProduct}=="[08]02d", MODE="0666", ENV{ID_MM_DEVICE_IGNORE}="1", ENV{ID_MM_PORT_IGNORE}="1"
# Raspberry Pi Pico
ATTRS{idVendor}=="2e8a", ATTRS{idProduct}=="[01]*", MODE:="0666", ENV{ID_MM_DEVICE_IGNORE}="1", ENV{ID_MM_PORT_IGNORE}="1"
# AIR32F103
ATTRS{idVendor}=="0d28", ATTRS{idProduct}=="0204", MODE="0666", ENV{ID_MM_DEVICE_IGNORE}="1", ENV{ID_MM_PORT_IGNORE}="1"
# STM32 virtual COM port
ATTRS{idVendor}=="0483", ATTRS{idProduct}=="5740", MODE="0666", ENV{ID_MM_DEVICE_IGNORE}="1", ENV{ID_MM_PORT_IGNORE}="1"
#
# Debuggers
#
# Black Magic Probe
SUBSYSTEM=="tty", ATTRS{interface}=="Black Magic GDB Server", MODE="0666", ENV{ID_MM_DEVICE_IGNORE}="1", ENV{ID_MM_PORT_IGNORE}="1"
SUBSYSTEM=="tty", ATTRS{interface}=="Black Magic UART Port", MODE="0666", ENV{ID_MM_DEVICE_IGNORE}="1", ENV{ID_MM_PORT_IGNORE}="1"
# opendous and estick
ATTRS{idVendor}=="03eb", ATTRS{idProduct}=="204f", MODE="0666", ENV{ID_MM_DEVICE_IGNORE}="1", ENV{ID_MM_PORT_IGNORE}="1"
# Original FT232/FT245/FT2232/FT232H/FT4232
ATTRS{idVendor}=="0403", ATTRS{idProduct}=="60[01][104]", MODE="0666", ENV{ID_MM_DEVICE_IGNORE}="1", ENV{ID_MM_PORT_IGNORE}="1"
# DISTORTEC JTAG-lock-pick Tiny 2
ATTRS{idVendor}=="0403", ATTRS{idProduct}=="8220", MODE="0666", ENV{ID_MM_DEVICE_IGNORE}="1", ENV{ID_MM_PORT_IGNORE}="1"
# TUMPA, TUMPA Lite
ATTRS{idVendor}=="0403", ATTRS{idProduct}=="8a9[89]", MODE="0666", ENV{ID_MM_DEVICE_IGNORE}="1", ENV{ID_MM_PORT_IGNORE}="1"
# XDS100v2
ATTRS{idVendor}=="0403", ATTRS{idProduct}=="a6d0", MODE="0666", ENV{ID_MM_DEVICE_IGNORE}="1", ENV{ID_MM_PORT_IGNORE}="1"
# Xverve Signalyzer Tool (DT-USB-ST), Signalyzer LITE (DT-USB-SLITE)
ATTRS{idVendor}=="0403", ATTRS{idProduct}=="bca[01]", MODE="0666", ENV{ID_MM_DEVICE_IGNORE}="1", ENV{ID_MM_PORT_IGNORE}="1"
# TI/Luminary Stellaris Evaluation Board FTDI (several)
ATTRS{idVendor}=="0403", ATTRS{idProduct}=="bcd[9a]", MODE="0666", ENV{ID_MM_DEVICE_IGNORE}="1", ENV{ID_MM_PORT_IGNORE}="1"
# egnite Turtelizer 2
ATTRS{idVendor}=="0403", ATTRS{idProduct}=="bdc8", MODE="0666", ENV{ID_MM_DEVICE_IGNORE}="1", ENV{ID_MM_PORT_IGNORE}="1"
# Section5 ICEbear
ATTRS{idVendor}=="0403", ATTRS{idProduct}=="c14[01]", MODE="0666", ENV{ID_MM_DEVICE_IGNORE}="1", ENV{ID_MM_PORT_IGNORE}="1"
# Amontec JTAGkey and JTAGkey-tiny
ATTRS{idVendor}=="0403", ATTRS{idProduct}=="cff8", MODE="0666", ENV{ID_MM_DEVICE_IGNORE}="1", ENV{ID_MM_PORT_IGNORE}="1"
# TI ICDI
ATTRS{idVendor}=="0451", ATTRS{idProduct}=="c32a", MODE="0666", ENV{ID_MM_DEVICE_IGNORE}="1", ENV{ID_MM_PORT_IGNORE}="1"
# STLink probes
ATTRS{idVendor}=="0483", MODE="0666", ENV{ID_MM_DEVICE_IGNORE}="1", ENV{ID_MM_PORT_IGNORE}="1"
# Hilscher NXHX Boards
ATTRS{idVendor}=="0640", ATTRS{idProduct}=="0028", MODE="0666", ENV{ID_MM_DEVICE_IGNORE}="1", ENV{ID_MM_PORT_IGNORE}="1"
# Hitex probes
ATTRS{idVendor}=="0640", MODE="0666", ENV{ID_MM_DEVICE_IGNORE}="1", ENV{ID_MM_PORT_IGNORE}="1"
# Altera USB Blaster
ATTRS{idVendor}=="09fb", ATTRS{idProduct}=="6001", MODE="0666", ENV{ID_MM_DEVICE_IGNORE}="1", ENV{ID_MM_PORT_IGNORE}="1"
# Amontec JTAGkey-HiSpeed
ATTRS{idVendor}=="0fbb", ATTRS{idProduct}=="1000", MODE="0666", ENV{ID_MM_DEVICE_IGNORE}="1", ENV{ID_MM_PORT_IGNORE}="1"
# SEGGER J-Link
ATTRS{idVendor}=="1366", MODE="0666", ENV{ID_MM_DEVICE_IGNORE}="1", ENV{ID_MM_PORT_IGNORE}="1"
# Raisonance RLink
ATTRS{idVendor}=="138e", ATTRS{idProduct}=="9000", MODE="0666", ENV{ID_MM_DEVICE_IGNORE}="1", ENV{ID_MM_PORT_IGNORE}="1"
# Debug Board for Neo1973
ATTRS{idVendor}=="1457", ATTRS{idProduct}=="5118", MODE="0666", ENV{ID_MM_DEVICE_IGNORE}="1", ENV{ID_MM_PORT_IGNORE}="1"
# Olimex probes
ATTRS{idVendor}=="15ba", MODE="0666", ENV{ID_MM_DEVICE_IGNORE}="1", ENV{ID_MM_PORT_IGNORE}="1"
# USBprog with OpenOCD firmware
ATTRS{idVendor}=="1781", ATTRS{idProduct}=="0c63", MODE="0666", ENV{ID_MM_DEVICE_IGNORE}="1", ENV{ID_MM_PORT_IGNORE}="1"
# TI/Luminary Stellaris In-Circuit Debug Interface (ICDI) Board
ATTRS{idVendor}=="1cbe", ATTRS{idProduct}=="00fd", MODE="0666", ENV{ID_MM_DEVICE_IGNORE}="1", ENV{ID_MM_PORT_IGNORE}="1"
# Marvell Sheevaplug
ATTRS{idVendor}=="9e88", ATTRS{idProduct}=="9e8f", MODE="0666", ENV{ID_MM_DEVICE_IGNORE}="1", ENV{ID_MM_PORT_IGNORE}="1"
# Keil Software, Inc. ULink
ATTRS{idVendor}=="c251", ATTRS{idProduct}=="2710", MODE="0666", ENV{ID_MM_DEVICE_IGNORE}="1", ENV{ID_MM_PORT_IGNORE}="1"
# CMSIS-DAP compatible adapters
ATTRS{product}=="*CMSIS-DAP*", MODE="0666", ENV{ID_MM_DEVICE_IGNORE}="1", ENV{ID_MM_PORT_IGNORE}="1"
# Atmel AVR Dragon
ATTRS{idVendor}=="03eb", ATTRS{idProduct}=="2107", MODE="0666", ENV{ID_MM_DEVICE_IGNORE}="1", ENV{ID_MM_PORT_IGNORE}="1"
# Espressif USB JTAG/serial debug unit
ATTRS{idVendor}=="303a", ATTRS{idProduct}=="1001", MODE="0666", ENV{ID_MM_DEVICE_IGNORE}="1", ENV{ID_MM_PORT_IGNORE}="1"
# Zephyr framework USB CDC-ACM
ATTRS{idVendor}=="2fe3", ATTRS{idProduct}=="0100", MODE="0666", ENV{ID_MM_DEVICE_IGNORE}="1", ENV{ID_MM_PORT_IGNORE}="1"
================================================
FILE: .devcontainer/Dockerfile
================================================
# trunk-ignore-all(terrascan/AC_DOCKER_0002): Known terrascan issue
# trunk-ignore-all(hadolint/DL3008): Do not pin apt package versions
# trunk-ignore-all(hadolint/DL3013): Do not pin pip package versions
FROM mcr.microsoft.com/devcontainers/cpp:2-debian-13
USER root
RUN apt-get update && export DEBIAN_FRONTEND=noninteractive \
&& apt-get -y install --no-install-recommends \
ca-certificates \
g++ \
git \
libbluetooth-dev \
libgpiod-dev \
liborcania-dev \
libssl-dev \
libulfius-dev \
libyaml-cpp-dev \
pipx \
pkg-config \
python3 \
python3-pip \
python3-venv \
python3-wheel \
wget \
zip \
usbutils \
hwdata \
gpg \
gnupg2 \
libusb-1.0-0-dev \
libuv1-dev \
libi2c-dev \
libxcb-xkb-dev \
libxkbcommon-dev \
libinput-dev \
&& apt-get clean && rm -rf /var/lib/apt/lists/*
RUN pipx install platformio
COPY 99-platformio-udev.rules /etc/udev/rules.d/99-platformio-udev.rules
USER vscode
HEALTHCHECK NONE
================================================
FILE: .devcontainer/devcontainer.json
================================================
// For format details, see https://aka.ms/devcontainer.json. For config options, see the
// README at: https://github.com/devcontainers/templates/tree/main/src/cpp
{
"name": "Meshtastic Firmware Dev",
"build": {
"dockerfile": "Dockerfile"
},
"features": {
"ghcr.io/devcontainers/features/python:1": {
"installTools": true,
"version": "3.14"
}
},
"customizations": {
"vscode": {
"extensions": [
"ms-vscode.cpptools",
"platformio.platformio-ide",
"Trunk.io"
],
"unwantedRecommendations": ["ms-azuretools.vscode-docker"],
"settings": {
"extensions.ignoreRecommendations": true
}
}
},
// Use 'forwardPorts' to make a list of ports inside the container available locally.
"forwardPorts": [4403],
// Use "--device=" to make a local device available inside the container.
// "runArgs": ["--device=/dev/ttyACM0"],
// Run commands to prepare the container for use
"postCreateCommand": ".devcontainer/setup.sh"
}
================================================
FILE: .devcontainer/setup.sh
================================================
#!/usr/bin/env sh
git submodule update --init
pip install --no-cache-dir setuptools
pipx install esptool
================================================
FILE: .envrc
================================================
use nix
================================================
FILE: .gitattributes
================================================
* text=auto eol=lf
*.cmd text eol=crlf
*.bat text eol=crlf
*.ps1 text eol=crlf
*.{sh,[sS][hH]} text eol=lf
================================================
FILE: .github/FUNDING.yml
================================================
# These are supported funding model platforms
open_collective: meshtastic
================================================
FILE: .github/ISSUE_TEMPLATE/Bug Report.yml
================================================
name: Bug Report
description: File a bug report
title: "[Bug]: "
labels: [bug, triage]
body:
- type: markdown
attributes:
value: |
Thanks for taking the time to fill out this bug report!
- type: dropdown
id: category
attributes:
label: Category
description: How would you catagorize this issue?
multiple: true
options:
- Hardware Compatibility
- BLE
- Serial
- WiFi
- Other
validations:
required: true
- type: dropdown
id: hardware
attributes:
label: Hardware
description: What hardware are you encountering this issue on?
multiple: true
options:
- Not Applicable
- T-Beam
- T-Beam S3
- T-Beam 0.7
- T-Lora v1
- T-Lora v1.3
- T-Lora v2 1.6
- T-Deck
- T-Echo
- T-Watch
- Rak4631
- Rak11200
- Rak11310
- Heltec v1
- Heltec v2
- Heltec v2.1
- Heltec V3
- Heltec Wireless Paper
- Heltec Wireless Tracker
- Heltec Mesh Node T114
- Heltec Vision Master E213
- Heltec Vision Master E290
- Heltec Vision Master T190
- Nano G1
- Nano G1 Explorer
- Nano G2 Ultra
- Raspberry Pi Pico (W)
- Relay v1
- Relay v2
- Seeed Wio Tracker 1110
- Seeed Card Tracker T1000-E
- Station G1
- Station G2
- unPhone
- CanaryOne
- Chatter
- Linux Native
- DIY
- Other
validations:
required: true
- type: checkboxes
id: mui
attributes:
label: Is this bug report about any UI component firmware like InkHUD or Meshtatic UI (MUI)?
options:
- label: Meshtastic UI aka MUI colorTFT
- label: InkHUD ePaper
- label: OLED slide UI on any display
- type: input
id: version
attributes:
label: Firmware Version
description: This can be found on the device's screen or via one of the apps.
placeholder: x.x.x.yyyyyyy
validations:
required: true
- type: textarea
id: body
attributes:
label: Description
description: Please provide details on what steps you performed for this to happen.
validations:
required: true
- type: textarea
id: logs
attributes:
label: Relevant log output
description: If you have any log output to help in diagnosing your bug, please provide it here.
render: Shell
validations:
required: false
================================================
FILE: .github/ISSUE_TEMPLATE/New Board.yml
================================================
name: New Board
description: Request us to support new hardware
title: "[Board]: "
labels: [enhancement, triage]
body:
- type: markdown
attributes:
value: |
Thanks for requesting a new board, this will not gurantee that we will support it, but will be on our radar.
- type: dropdown
id: soc
attributes:
label: SOC
description: What SOC does your board have?
multiple: true
options:
- NRF52
- ESP32
- Other
validations:
required: true
- type: input
id: lora
attributes:
label: Lora IC
description: What LoRa IC does the board have?
validations:
required: true
- type: input
id: link
attributes:
label: Product Link
description: Where can we find this product?
validations:
required: true
- type: textarea
id: body
attributes:
label: Description
description: Please provide any further details you think we may need.
validations:
required: true
================================================
FILE: .github/ISSUE_TEMPLATE/feature.yml
================================================
name: Feature Request
description: Request a new feature
title: "[Feature Request]: "
labels: [enhancement]
body:
- type: markdown
attributes:
value: |
Thanks for your request this will not gurantee that we will implement it, but it will be reviewed.
- type: dropdown
id: soc
attributes:
label: Platform
description: What device platform will support your feature?
multiple: true
options:
- NRF52
- ESP32
- RP2040
- Linux Native
- Cross-Platform
- other
validations:
required: true
- type: textarea
id: body
attributes:
label: Description
description: Please provide details about your enhancement.
validations:
required: true
================================================
FILE: .github/actionlint.yaml
================================================
# Configuration related to self-hosted runner.
self-hosted-runner:
# Labels of self-hosted runner in array of strings.
labels:
- arctastic
- test-runner
================================================
FILE: .github/actions/build-variant/action.yml
================================================
name: Setup Build Variant Composite Action
description: Variant build actions for Meshtastic Platform IO steps
inputs:
board:
description: The board to build for
required: true
github_token:
description: GitHub token
required: true
build-script-path:
description: Path to the build script
required: true
remove-debug-flags:
description: A space separated list of files to remove debug flags from
required: false
default: ""
ota-firmware-source:
description: The OTA firmware file to pull
required: false
default: ""
ota-firmware-target:
description: The target path to store the OTA firmware file
required: false
default: ""
artifact-paths:
description: A newline separated list of paths to store as artifacts
required: false
default: ""
# include-web-ui:
# description: Include the web UI in the build
# required: false
# default: "false"
arch:
description: Processor arch name
required: true
default: esp32
runs:
using: composite
steps:
- name: Build base
id: base
uses: ./.github/actions/setup-base
# - name: Get web ui version
# if: inputs.include-web-ui == 'true'
# id: webver
# shell: bash
# run: |
# echo "ver=$(cat bin/web.version)" >> $GITHUB_OUTPUT
# - name: Pull web ui
# if: inputs.include-web-ui == 'true'
# uses: dsaltares/fetch-gh-release-asset@master
# with:
# repo: meshtastic/web
# file: build.tar
# target: build.tar
# token: ${{ inputs.github_token }}
# version: tags/v${{ steps.webver.outputs.ver }}
# - name: Unpack web ui
# if: inputs.include-web-ui == 'true'
# shell: bash
# run: |
# tar -xf build.tar -C data/static
# rm build.tar
- name: Remove debug flags for release
shell: bash
if: inputs.remove-debug-flags != ''
run: |
for INI_FILE in ${{ inputs.remove-debug-flags }}; do
sed -i '/DDEBUG_HEAP/d' ${INI_FILE}
done
- name: PlatformIO ${{ inputs.arch }} download cache
uses: actions/cache@v5
with:
path: ~/.platformio/.cache
key: pio-cache-${{ inputs.arch }}-${{ hashFiles('.github/actions/**', '**.ini') }}
- name: Build ${{ inputs.board }}
shell: bash
run: ${{ inputs.build-script-path }} ${{ inputs.board }}
- name: Pull OTA Firmware
if: inputs.ota-firmware-source != '' && inputs.ota-firmware-target != ''
uses: dsaltares/fetch-gh-release-asset@master
with:
repo: meshtastic/firmware-ota
file: ${{ inputs.ota-firmware-source }}
target: ${{ inputs.ota-firmware-target }}
token: ${{ inputs.github_token }}
- name: Get release version string
shell: bash
run: echo "long=$(./bin/buildinfo.py long)" >> $GITHUB_OUTPUT
id: version
- name: Store binaries as an artifact
uses: actions/upload-artifact@v7
with:
name: firmware-${{ inputs.arch }}-${{ inputs.board }}-${{ steps.version.outputs.long }}
overwrite: true
path: |
${{ inputs.artifact-paths }}
================================================
FILE: .github/actions/setup-base/action.yml
================================================
name: Setup Build Base Composite Action
description: Base build actions for Meshtastic Platform IO steps
runs:
using: composite
steps:
- name: Checkout code
uses: actions/checkout@v6
with:
submodules: recursive
ref: ${{github.event.pull_request.head.ref}}
repository: ${{github.event.pull_request.head.repo.full_name}}
- name: Install dependencies
shell: bash
run: |
sudo apt-get -y update --fix-missing
sudo apt-get install -y cppcheck libbluetooth-dev libgpiod-dev libyaml-cpp-dev lsb-release
- name: Setup Python
uses: actions/setup-python@v6
with:
python-version: 3.x
cache: pip
cache-dependency-path: |
.github/actions/**
**.ini
- name: Upgrade python tools
shell: bash
run: |
python -m pip install --upgrade pip
pip install -U --no-build-isolation --no-cache-dir "setuptools<72"
pip install -U platformio adafruit-nrfutil --no-build-isolation
pip install -U poetry --no-build-isolation
pip install -U meshtastic --pre --no-build-isolation
- name: Upgrade platformio
shell: bash
run: |
pio upgrade
================================================
FILE: .github/actions/setup-native/action.yml
================================================
name: Setup native build
description: Install libraries needed for building the Native/Portduino build
runs:
using: composite
steps:
- name: Setup base
id: base
uses: ./.github/actions/setup-base
- name: Install libs needed for native build
shell: bash
run: |
sudo apt-get install -y libbluetooth-dev libgpiod-dev libyaml-cpp-dev openssl libssl-dev libulfius-dev liborcania-dev libusb-1.0-0-dev libi2c-dev libuv1-dev
================================================
FILE: .github/copilot-instructions.md
================================================
# Meshtastic Firmware - Copilot Instructions
This document provides context and guidelines for AI assistants working with the Meshtastic firmware codebase.
## Project Overview
Meshtastic is an open-source LoRa mesh networking project for long-range, low-power communication without relying on internet or cellular infrastructure. The firmware enables text messaging, location sharing, and telemetry over a decentralized mesh network.
### Supported Hardware Platforms
- **ESP32** (ESP32, ESP32-S3, ESP32-C3) - Most common platform
- **nRF52** (nRF52840, nRF52833) - Low power Nordic chips
- **RP2040/RP2350** - Raspberry Pi Pico variants
- **STM32WL** - STM32 with integrated LoRa
- **Linux/Portduino** - Native Linux builds (Raspberry Pi, etc.)
### Supported Radio Chips
- **SX1262/SX1268** - Sub-GHz LoRa (868/915 MHz regions)
- **SX1280** - 2.4 GHz LoRa
- **LR1110/LR1120/LR1121** - Wideband radios (sub-GHz and 2.4 GHz capable, but not simultaneously)
- **RF95** - Legacy RFM95 modules
- **LLCC68** - Low-cost LoRa
### MQTT Integration
MQTT provides a bridge between Meshtastic mesh networks and the internet, enabling nodes with network connectivity to share messages with remote meshes or external services.
#### Key Components
- **`src/mqtt/MQTT.cpp`** - Main MQTT client singleton, handles connection and message routing
- **`src/mqtt/ServiceEnvelope.cpp`** - Protobuf wrapper for mesh packets sent over MQTT
- **`moduleConfig.mqtt`** - MQTT module configuration
#### MQTT Topic Structure
Messages are published/subscribed using a hierarchical topic format:
```
{root}/{channel_id}/{gateway_id}
```
- `root` - Configurable prefix (default: `msh`)
- `channel_id` - Channel name/identifier
- `gateway_id` - Node ID of the publishing gateway
#### Configuration Defaults (from `Default.h`)
```cpp
#define default_mqtt_address "mqtt.meshtastic.org"
#define default_mqtt_username "meshdev"
#define default_mqtt_password "large4cats"
#define default_mqtt_root "msh"
#define default_mqtt_encryption_enabled true
#define default_mqtt_tls_enabled false
```
#### Key Concepts
- **Uplink** - Mesh packets sent TO the MQTT broker (controlled by `uplink_enabled` per channel)
- **Downlink** - MQTT messages received and injected INTO the mesh (controlled by `downlink_enabled` per channel)
- **Encryption** - When `encryption_enabled` is true, only encrypted packets are sent; plaintext JSON is disabled
- **ServiceEnvelope** - Protobuf wrapper containing packet + channel_id + gateway_id for routing
- **JSON Support** - Optional JSON encoding for integration with external systems (disabled on nRF52 by default)
#### PKI Messages
PKI (Public Key Infrastructure) messages have special handling:
- Accepted on a special "PKI" channel
- Allow encrypted DMs between nodes that discovered each other on downlink-enabled channels
## Project Structure
```
firmware/
├── src/ # Main source code
│ ├── main.cpp # Application entry point
│ ├── mesh/ # Core mesh networking
│ │ ├── NodeDB.* # Node database management
│ │ ├── Router.* # Packet routing
│ │ ├── Channels.* # Channel management
│ │ ├── *Interface.* # Radio interface implementations
│ │ └── generated/ # Protobuf generated code
│ ├── modules/ # Feature modules (Position, Telemetry, etc.)
│ ├── gps/ # GPS handling
│ ├── graphics/ # Display drivers and UI
│ ├── platform/ # Platform-specific code
│ ├── input/ # Input device handling
│ └── concurrency/ # Threading utilities
├── variants/ # Hardware variant definitions
│ ├── esp32/ # ESP32 variants
│ ├── esp32s3/ # ESP32-S3 variants
│ ├── nrf52/ # nRF52 variants
│ └── rp2xxx/ # RP2040/RP2350 variants
├── protobufs/ # Protocol buffer definitions
├── boards/ # Custom PlatformIO board definitions
└── bin/ # Build and utility scripts
```
## Coding Conventions
### General Style
- Follow existing code style - run `trunk fmt` before commits
- Prefer `LOG_DEBUG`, `LOG_INFO`, `LOG_WARN`, `LOG_ERROR` for logging
- Use `assert()` for invariants that should never fail
### Naming Conventions
- Classes: `PascalCase` (e.g., `PositionModule`, `NodeDB`)
- Functions/Methods: `camelCase` (e.g., `sendOurPosition`, `getNodeNum`)
- Constants/Defines: `UPPER_SNAKE_CASE` (e.g., `MAX_INTERVAL`, `ONE_DAY`)
- Member variables: `camelCase` (e.g., `lastGpsSend`, `nodeDB`)
- Config defines: `USERPREFS_*` for user-configurable options
### Key Patterns
#### Module System
Modules inherit from `MeshModule` or `ProtobufModule<T>` and implement:
- `handleReceivedProtobuf()` - Process incoming packets
- `allocReply()` - Generate response packets
- `runOnce()` - Periodic task execution (returns next run interval in ms)
```cpp
class MyModule : public ProtobufModule<meshtastic_MyMessage>
{
protected:
virtual bool handleReceivedProtobuf(const meshtastic_MeshPacket &mp, meshtastic_MyMessage *msg) override;
virtual int32_t runOnce() override;
};
```
#### Configuration Access
- `config.*` - Device configuration (LoRa, position, power, etc.)
- `moduleConfig.*` - Module-specific configuration
- `channels.*` - Channel configuration and management
#### Default Values
Use the `Default` class helpers in `src/mesh/Default.h`:
- `Default::getConfiguredOrDefaultMs(configured, default)` - Returns ms, using default if configured is 0
- `Default::getConfiguredOrMinimumValue(configured, min)` - Enforces minimum values
- `Default::getConfiguredOrDefaultMsScaled(configured, default, numNodes)` - Scales based on network size
#### Thread Safety
- Use `concurrency::Lock` for mutex protection
- Radio SPI access uses `SPILock`
- Prefer `OSThread` for background tasks
### Hardware Variants
Each hardware variant has:
- `variant.h` - Pin definitions and hardware capabilities
- `platformio.ini` - Build configuration
- Optional: `pins_arduino.h`, `rfswitch.h`
Key defines in variant.h:
```cpp
#define USE_SX1262 // Radio chip selection
#define HAS_GPS 1 // Hardware capabilities
#define LORA_CS 36 // Pin assignments
#define SX126X_DIO1 14 // Radio-specific pins
```
### Protobuf Messages
- Defined in `protobufs/meshtastic/*.proto`
- Generated code in `src/mesh/generated/`
- Regenerate with `bin/regen-protos.sh`
- Message types prefixed with `meshtastic_`
### Conditional Compilation
```cpp
#if !MESHTASTIC_EXCLUDE_GPS // Feature exclusion
#ifdef ARCH_ESP32 // Architecture-specific
#if defined(USE_SX1262) // Radio-specific
#ifdef HAS_SCREEN // Hardware capability
#if USERPREFS_EVENT_MODE // User preferences
```
## Build System
Uses **PlatformIO** with custom scripts:
- `bin/platformio-pre.py` - Pre-build script
- `bin/platformio-custom.py` - Custom build logic
Build commands:
```bash
pio run -e tbeam # Build specific target
pio run -e tbeam -t upload # Build and upload
pio run -e native # Build native/Linux version
```
## Common Tasks
### Adding a New Module
1. Create `src/modules/MyModule.cpp` and `.h`
2. Inherit from appropriate base class
3. Register in `src/modules/Modules.cpp`
4. Add protobuf messages if needed in `protobufs/`
### Adding a New Hardware Variant
1. Create directory under `variants/<arch>/<name>/`
2. Add `variant.h` with pin definitions
3. Add `platformio.ini` with build config
4. Reference common configs with `extends`
### Modifying Configuration Defaults
- Check `src/mesh/Default.h` for default value defines
- Check `src/mesh/NodeDB.cpp` for initialization logic
- Consider `isDefaultChannel()` checks for public channel restrictions
## Important Considerations
### Traffic Management
The mesh network has limited bandwidth. When modifying broadcast intervals:
- Respect minimum intervals on default/public channels
- Use `Default::getConfiguredOrMinimumValue()` to enforce minimums
- Consider `numOnlineNodes` scaling for congestion control
### Power Management
Many devices are battery-powered:
- Use `IF_ROUTER(routerVal, normalVal)` for role-based defaults
- Check `config.power.is_power_saving` for power-saving modes
- Implement proper `sleep()` methods in radio interfaces
### Channel Security
- `channels.isDefaultChannel(index)` - Check if using default/public settings
- Default channels get stricter rate limits to prevent abuse
- Private channels may have relaxed limits
## GitHub Actions CI/CD
The project uses GitHub Actions extensively for CI/CD. Key workflows are in `.github/workflows/`:
### Core CI Workflows
- **`main_matrix.yml`** - Main CI pipeline, runs on push to `master`/`develop` and PRs
- Uses `bin/generate_ci_matrix.py` to dynamically generate build targets
- Builds all supported hardware variants
- PRs build a subset (`--level pr`) for faster feedback
- **`trunk_check.yml`** - Code quality checks on PRs
- Runs Trunk.io for linting and formatting
- Must pass before merge
- **`tests.yml`** - End-to-end and hardware tests
- Runs daily on schedule
- Includes native tests and hardware-in-the-loop testing
- **`test_native.yml`** - Native platform unit tests
- Runs `pio test -e native`
### Release Workflows
- **`release_channels.yml`** - Triggered on GitHub release publish
- Builds Docker images
- Packages for PPA (Ubuntu), OBS (openSUSE), and COPR (Fedora)
- Handles Alpha/Beta/Stable release channels
- **`nightly.yml`** - Nightly builds from develop branch
- **`docker_build.yml`** / **`docker_manifest.yml`** - Docker image builds
### Build Matrix Generation
The CI uses `bin/generate_ci_matrix.py` to dynamically select which targets to build:
```bash
# Generate full build matrix
./bin/generate_ci_matrix.py all
# Generate PR-level matrix (subset for faster builds)
./bin/generate_ci_matrix.py all --level pr
```
Variants can specify their support level in `platformio.ini`:
- `custom_meshtastic_support_level = 1` - Actively supported, built on every PR
- `custom_meshtastic_support_level = 2` - Supported, built on merge to main branches
- `board_level = extra` - Extra builds, only on full releases
### Running Workflows Locally
Most workflows can be triggered manually via `workflow_dispatch` for testing.
## Testing
- Unit tests in `test/` directory
- Run with `pio test -e native`
- Use `bin/test-simulator.sh` for simulation testing
## Resources
- [Documentation](https://meshtastic.org/docs/)
================================================
FILE: .github/pull_request_template.md
================================================
## 🙏 Thank you for sending in a pull request, here's some tips to get started!
### ❌ (Please delete all these tips and replace them with your text) ❌
- Before starting on some new big chunk of code, it it is optional but highly recommended to open an issue first
to say "Hey, I think this idea X should be implemented and I'm starting work on it. My general plan is Y, any feedback
is appreciated." This will allow other devs to potentially save you time by not accidentally duplicating work etc...
- Please do not check in files that don't have real changes
- Please do not reformat lines that you didn't have to change the code on
- We recommend using the [Visual Studio Code](https://platformio.org/install/ide?install=vscode) editor along with the ['Trunk Check' extension](https://marketplace.visualstudio.com/items?itemName=trunk.io) (In beta for windows, WSL2 for the Linux version),
because it automatically follows our indentation rules and its auto reformatting will not cause spurious changes to lines.
- If your PR fixes a bug, mention "fixes #bugnum" somewhere in your pull request description.
- If your other co-developers have comments on your PR please tweak as needed.
- Please also enable "Allow edits by maintainers".
- Please do not submit untested code.
- If you do not have the affected hardware to test your code changes adequately against regressions, please indicate this, so that contributors and community members can help test your changes.
- If your PR gets accepted you can request a "Contributor" role in the Meshtastic Discord
## 🤝 Attestations
- [ ] I have tested that my proposed changes behave as described.
- [ ] I have tested that my proposed changes do not cause any obvious regressions on the following devices:
- [ ] Heltec (Lora32) V3
- [ ] LilyGo T-Deck
- [ ] LilyGo T-Beam
- [ ] RAK WisBlock 4631
- [ ] Seeed Studio T-1000E tracker card
- [ ] Other (please specify below)
================================================
FILE: .github/workflows/build_debian_src.yml
================================================
name: Build Debian Source Package
on:
workflow_call:
secrets:
PPA_GPG_PRIVATE_KEY:
required: false
inputs:
series:
description: Ubuntu/Debian series to target
required: true
type: string
build_location:
description: Location where build will execute
required: true
type: string
permissions:
contents: write
packages: write
jobs:
build-debian-src:
runs-on: ubuntu-24.04
steps:
- name: Checkout code
uses: actions/checkout@v6
with:
submodules: recursive
path: meshtasticd
ref: ${{github.event.pull_request.head.ref}}
repository: ${{github.event.pull_request.head.repo.full_name}}
- name: Install deps
shell: bash
working-directory: meshtasticd
run: |
sudo apt-get update -y --fix-missing
sudo apt-get install -y software-properties-common build-essential devscripts equivs
sudo add-apt-repository ppa:meshtastic/build-tools -y
sudo apt-get update -y --fix-missing
sudo mk-build-deps --install --remove --tool='apt-get -o Debug::pkgProblemResolver=yes --no-install-recommends --yes' debian/control
- name: Import GPG key
uses: crazy-max/ghaction-import-gpg@v7
with:
gpg_private_key: ${{ secrets.PPA_GPG_PRIVATE_KEY }}
id: gpg
- name: Get release version string
working-directory: meshtasticd
run: |
echo "deb=$(./bin/buildinfo.py deb)" >> $GITHUB_OUTPUT
env:
BUILD_LOCATION: ${{ inputs.build_location }}
id: version
- name: Fetch libdeps, package debian source
working-directory: meshtasticd
run: debian/ci_pack_sdeb.sh
env:
SERIES: ${{ inputs.series }}
GPG_KEY_ID: ${{ steps.gpg.outputs.keyid }}
PKG_VERSION: ${{ steps.version.outputs.deb }}
- name: Store binaries as an artifact
uses: actions/upload-artifact@v7
with:
name: firmware-debian-${{ steps.version.outputs.deb }}~${{ inputs.series }}-src
overwrite: true
path: |
meshtasticd_${{ steps.version.outputs.deb }}*
================================================
FILE: .github/workflows/build_firmware.yml
================================================
name: Build
on:
workflow_call:
inputs:
version:
required: true
type: string
platform:
required: true
type: string
pio_env:
required: true
type: string
permissions: read-all
jobs:
pio-build:
name: build-${{ inputs.platform }}
# Use 'arctastic' self-hosted runner pool when building in the main repo
runs-on: ${{ github.repository_owner == 'meshtastic' && 'arctastic' || 'ubuntu-latest' }}
outputs:
artifact-id: ${{ steps.upload-firmware.outputs.artifact-id }}
steps:
- uses: actions/checkout@v6
with:
submodules: recursive
ref: ${{github.event.pull_request.head.ref}}
repository: ${{github.event.pull_request.head.repo.full_name}}
- name: Build ${{ inputs.platform }}
id: build
uses: meshtastic/gh-action-firmware@main
with:
pio_platform: ${{ inputs.platform }}
pio_env: ${{ inputs.pio_env }}
pio_target: build
- name: ESP32 - Download Unified OTA firmware
# Currently only esp32 and esp32s3 use the unified ota
if: inputs.platform == 'esp32' || inputs.platform == 'esp32s3'
id: dl-ota-unified
env:
PIO_PLATFORM: ${{ inputs.platform }}
PIO_ENV: ${{ inputs.pio_env }}
OTA_URL: https://github.com/meshtastic/esp32-unified-ota/releases/latest/download/mt-${{ inputs.platform }}-ota.bin
working-directory: release
run: |
curl -L -o "mt-$PIO_PLATFORM-ota.bin" $OTA_URL
- name: ESP32-C* - Download BLE-Only OTA firmware
if: inputs.platform == 'esp32c3' || inputs.platform == 'esp32c6'
id: dl-ota-ble
env:
PIO_ENV: ${{ inputs.pio_env }}
OTA_URL: https://github.com/meshtastic/firmware-ota/releases/latest/download/firmware-c3.bin
working-directory: release
run: |
curl -L -o bleota-c3.bin $OTA_URL
- name: Update manifest with OTA file
if: inputs.platform == 'esp32' || inputs.platform == 'esp32s3' || inputs.platform == 'esp32c3' || inputs.platform == 'esp32c6'
working-directory: release
env:
PIO_PLATFORM: ${{ inputs.platform }}
run: |
# Determine OTA filename based on platform
if [[ "$PIO_PLATFORM" == "esp32" || "$PIO_PLATFORM" == "esp32s3" ]]; then
OTA_FILE="mt-${PIO_PLATFORM}-ota.bin"
else
OTA_FILE="bleota-c3.bin"
fi
# Check if OTA file exists
if [[ ! -f "$OTA_FILE" ]]; then
echo "OTA file $OTA_FILE not found, skipping manifest update"
exit 0
fi
# Calculate MD5 and size
if command -v md5sum &> /dev/null; then
OTA_MD5=$(md5sum "$OTA_FILE" | cut -d' ' -f1)
else
OTA_MD5=$(md5 -q "$OTA_FILE")
fi
OTA_SIZE=$(stat -f%z "$OTA_FILE" 2>/dev/null || stat -c%s "$OTA_FILE")
# Find and update manifest file
for manifest in firmware-*.mt.json; do
if [[ -f "$manifest" ]]; then
echo "Updating $manifest with $OTA_FILE (md5: $OTA_MD5, size: $OTA_SIZE)"
# Add OTA entry to files array if not already present
jq --arg name "$OTA_FILE" --arg md5 "$OTA_MD5" --argjson bytes "$OTA_SIZE" --arg part "app1" \
'if .files | map(select(.name == $name)) | length == 0 then .files += [{"name": $name, "md5": $md5, "bytes": $bytes, "part_name": $part}] else . end' \
"$manifest" > "${manifest}.tmp" && mv "${manifest}.tmp" "$manifest"
fi
done
- name: Job summary
env:
PIO_ENV: ${{ inputs.pio_env }}
run: |
echo "## $PIO_ENV" >> $GITHUB_STEP_SUMMARY
echo "<details><summary><strong>Manifest</strong></summary>" >> $GITHUB_STEP_SUMMARY
echo '' >> $GITHUB_STEP_SUMMARY
echo '```json' >> $GITHUB_STEP_SUMMARY
cat release/firmware-*.mt.json >> $GITHUB_STEP_SUMMARY
echo '' >> $GITHUB_STEP_SUMMARY
echo '```' >> $GITHUB_STEP_SUMMARY
echo "</details>" >> $GITHUB_STEP_SUMMARY
- name: Store binaries as an artifact
uses: actions/upload-artifact@v7
id: upload-firmware
with:
name: firmware-${{ inputs.platform }}-${{ inputs.pio_env }}-${{ inputs.version }}
overwrite: true
path: |
release/*.mt.json
release/*.bin
release/*.elf
release/*.uf2
release/*.hex
release/*.zip
release/device-*.sh
release/device-*.bat
- name: Store manifests as an artifact
uses: actions/upload-artifact@v7
id: upload-manifest
with:
name: manifest-${{ inputs.platform }}-${{ inputs.pio_env }}-${{ inputs.version }}
overwrite: true
path: |
release/*.mt.json
================================================
FILE: .github/workflows/build_one_target.yml
================================================
name: Build One Target
on:
workflow_dispatch:
inputs:
# trunk-ignore(checkov/CKV_GHA_7)
arch:
type: choice
options:
- esp32
- esp32s3
- esp32c3
- esp32c6
- nrf52840
- rp2040
- rp2350
- stm32
target:
type: string
required: false
description: Choose the target board, e.g. nrf52_promicro_diy_tcxo. If blank, will find available targets.
# find-target:
# type: boolean
# default: true
# description: 'Find the available targets'
permissions: read-all
jobs:
find-targets:
if: ${{ inputs.target == '' }}
strategy:
fail-fast: false
matrix:
arch:
- esp32
- esp32s3
- esp32c3
- esp32c6
- nrf52840
- rp2040
- rp2350
- stm32
runs-on: ubuntu-24.04
steps:
- uses: actions/checkout@v6
- uses: actions/setup-python@v6
with:
python-version: 3.x
cache: pip
- run: pip install -U platformio
- name: Generate matrix
id: jsonStep
run: |
TARGETS=$(./bin/generate_ci_matrix.py ${{matrix.arch}} --level extra)
echo "Name: $GITHUB_REF_NAME" >> $GITHUB_STEP_SUMMARY
echo "Base: $GITHUB_BASE_REF" >> $GITHUB_STEP_SUMMARY
echo "Arch: ${{matrix.arch}}" >> $GITHUB_STEP_SUMMARY
echo "Ref: $GITHUB_REF" >> $GITHUB_STEP_SUMMARY
echo "Targets:" >> $GITHUB_STEP_SUMMARY
echo $TARGETS | jq -r 'sort_by(.board) |.[] | "- " + .board' >> $GITHUB_STEP_SUMMARY
version:
if: ${{ inputs.target != '' }}
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v6
- name: Get release version string
run: |
echo "long=$(./bin/buildinfo.py long)" >> $GITHUB_OUTPUT
echo "deb=$(./bin/buildinfo.py deb)" >> $GITHUB_OUTPUT
id: version
env:
BUILD_LOCATION: local
outputs:
long: ${{ steps.version.outputs.long }}
deb: ${{ steps.version.outputs.deb }}
build:
if: ${{ inputs.target != '' && inputs.arch != 'native' }}
needs: [version]
uses: ./.github/workflows/build_firmware.yml
with:
version: ${{ needs.version.outputs.long }}
pio_env: ${{ inputs.target }}
platform: ${{ inputs.arch }}
gather-artifacts:
permissions:
contents: write
pull-requests: write
runs-on: ubuntu-latest
needs: [version, build]
steps:
- name: Checkout code
uses: actions/checkout@v6
with:
ref: ${{github.event.pull_request.head.ref}}
repository: ${{github.event.pull_request.head.repo.full_name}}
- uses: actions/download-artifact@v8
with:
path: ./
pattern: firmware-*-*
merge-multiple: true
- name: Display structure of downloaded files
run: ls -R
- name: Move files up
run: mv -b -t ./ ./bin/device-*.sh ./bin/device-*.bat
- name: Repackage in single firmware zip
uses: actions/upload-artifact@v7
with:
name: firmware-${{inputs.target}}-${{ needs.version.outputs.long }}
overwrite: true
path: |
./firmware-*.bin
./firmware-*.uf2
./firmware-*.hex
./firmware-*.zip
./device-*.sh
./device-*.bat
./littlefs-*.bin
./bleota*bin
./Meshtastic_nRF52_factory_erase*.uf2
retention-days: 30
- uses: actions/download-artifact@v8
with:
pattern: firmware-*-${{ needs.version.outputs.long }}
merge-multiple: true
path: ./output
# For diagnostics
- name: Show artifacts
run: ls -lR
- name: Device scripts permissions
run: |
chmod +x ./output/device-install.sh || true
chmod +x ./output/device-update.sh || true
- name: Zip firmware
run: zip -j -9 -r ./firmware-${{inputs.target}}-${{ needs.version.outputs.long }}.zip ./output
- name: Repackage in single elfs zip
uses: actions/upload-artifact@v7
with:
name: debug-elfs-${{inputs.target}}-${{ needs.version.outputs.long }}.zip
overwrite: true
path: ./*.elf
retention-days: 30
- uses: scruplelesswizard/comment-artifact@main
if: ${{ github.event_name == 'pull_request' }}
with:
name: firmware-${{inputs.target}}-${{ needs.version.outputs.long }}
description: "Download firmware-${{inputs.target}}-${{ needs.version.outputs.long }}.zip. This artifact will be available for 90 days from creation"
github-token: ${{ secrets.GITHUB_TOKEN }}
================================================
FILE: .github/workflows/daily_packaging.yml
================================================
name: Daily Packaging
on:
schedule:
- cron: 0 2 * * *
workflow_dispatch:
push:
branches:
- master
paths:
- debian/**
- "*.rpkg"
- .github/workflows/nightly_packaging.yml
- .github/workflows/build_debian_src.yml
- .github/workflows/package_ppa.yml
- .github/workflows/package_obs.yml
- .github/workflows/hook_copr.yml
permissions:
contents: write
packages: write
jobs:
docker-multiarch:
if: github.repository == 'meshtastic/firmware'
uses: ./.github/workflows/docker_manifest.yml
with:
release_channel: daily
secrets: inherit
package-ppa:
if: github.repository == 'meshtastic/firmware'
strategy:
fail-fast: false
matrix:
series:
- jammy # 22.04 LTS
- noble # 24.04 LTS
- questing # 25.10
- resolute # 26.04 LTS
uses: ./.github/workflows/package_ppa.yml
with:
ppa_repo: ppa:meshtastic/daily
series: ${{ matrix.series }}
secrets: inherit
package-obs:
if: github.repository == 'meshtastic/firmware'
uses: ./.github/workflows/package_obs.yml
with:
obs_project: network:Meshtastic:daily
series: unstable
secrets: inherit
hook-copr:
if: github.repository == 'meshtastic/firmware'
uses: ./.github/workflows/hook_copr.yml
with:
copr_project: daily
secrets: inherit
================================================
FILE: .github/workflows/docker_build.yml
================================================
name: Build Docker
# Build Docker image, push untagged (digest-only)
on:
workflow_call:
secrets:
DOCKER_FIRMWARE_TOKEN:
required: false # Only required for push
inputs:
distro:
description: Distro to target
required: true
type: string
# choices: [debian, alpine]
platform:
description: Platform to target
required: true
type: string
runs-on:
description: Runner to use
required: true
type: string
push:
description: Push images to registry
required: false
type: boolean
default: false
pio_env:
description: PlatformIO environment to build
required: false
type: string
default: native
outputs:
digest:
description: Digest of built image
value: ${{ jobs.docker-build.outputs.digest }}
permissions:
contents: write
packages: write
jobs:
docker-build:
outputs:
digest: ${{ steps.docker_variant.outputs.digest }}
runs-on: ${{ inputs.runs-on }}
steps:
- name: Checkout code
uses: actions/checkout@v6
with:
submodules: recursive
ref: ${{github.event.pull_request.head.ref}}
repository: ${{github.event.pull_request.head.repo.full_name}}
- name: Get release version string
run: |
echo "long=$(./bin/buildinfo.py long)" >> $GITHUB_OUTPUT
id: version
- name: Docker login
if: ${{ inputs.push }}
uses: docker/login-action@v4
with:
username: meshtastic
password: ${{ secrets.DOCKER_FIRMWARE_TOKEN }}
- name: Set up QEMU
uses: docker/setup-qemu-action@v4
- name: Docker setup
uses: docker/setup-buildx-action@v4
- name: Sanitize platform string
id: sanitize_platform
# Replace slashes with underscores
run: echo "cleaned_platform=${{ inputs.platform }}" | sed 's/\//_/g' >> $GITHUB_OUTPUT
- name: Docker tag
id: meta
uses: docker/metadata-action@v6
with:
images: meshtastic/meshtasticd
tags: |
GHA-${{ steps.version.outputs.long }}-${{ inputs.distro }}-${{ steps.sanitize_platform.outputs.cleaned_platform }}
flavor: latest=false
- name: Docker build and push
uses: docker/build-push-action@v7
id: docker_variant
with:
context: .
file: |
${{ contains(inputs.distro, 'debian') && './Dockerfile' || contains(inputs.distro, 'alpine') && './alpine.Dockerfile' }}
push: ${{ inputs.push }}
tags: ${{ steps.meta.outputs.tags }} # Tag is only meant to be consumed by the "manifest" job
platforms: ${{ inputs.platform }}
build-args: |
PIO_ENV=${{ inputs.pio_env }}
================================================
FILE: .github/workflows/docker_manifest.yml
================================================
name: Build Docker Multi-Arch Manifest
on:
workflow_call:
secrets:
DOCKER_FIRMWARE_TOKEN:
required: true
inputs:
release_channel:
description: Release channel to target
required: true
type: string
permissions:
contents: write
packages: write
jobs:
docker-debian-amd64:
uses: ./.github/workflows/docker_build.yml
with:
distro: debian
platform: linux/amd64
runs-on: ubuntu-24.04
push: true
secrets: inherit
docker-debian-arm64:
uses: ./.github/workflows/docker_build.yml
with:
distro: debian
platform: linux/arm64
runs-on: ubuntu-24.04-arm
push: true
secrets: inherit
docker-debian-armv7:
uses: ./.github/workflows/docker_build.yml
with:
distro: debian
platform: linux/arm/v7
runs-on: ubuntu-24.04-arm
push: true
secrets: inherit
docker-alpine-amd64:
uses: ./.github/workflows/docker_build.yml
with:
distro: alpine
platform: linux/amd64
runs-on: ubuntu-24.04
push: true
secrets: inherit
docker-alpine-arm64:
uses: ./.github/workflows/docker_build.yml
with:
distro: alpine
platform: linux/arm64
runs-on: ubuntu-24.04-arm
push: true
secrets: inherit
docker-alpine-armv7:
uses: ./.github/workflows/docker_build.yml
with:
distro: alpine
platform: linux/arm/v7
runs-on: ubuntu-24.04-arm
push: true
secrets: inherit
docker-manifest:
needs:
# Debian
- docker-debian-amd64
- docker-debian-arm64
- docker-debian-armv7
# Alpine
- docker-alpine-amd64
- docker-alpine-arm64
- docker-alpine-armv7
runs-on: ubuntu-24.04
steps:
- name: Checkout code
uses: actions/checkout@v6
with:
submodules: recursive
ref: ${{github.event.pull_request.head.ref}}
repository: ${{github.event.pull_request.head.repo.full_name}}
- name: Get release version string
run: |
echo "long=$(./bin/buildinfo.py long)" >> $GITHUB_OUTPUT
echo "short=$(./bin/buildinfo.py short)" >> $GITHUB_OUTPUT
id: version
- name: Enumerate tags
shell: python
run: |
import os
short = "${{ steps.version.outputs.short }}"
long = "${{ steps.version.outputs.long }}"
release_channel = "${{ inputs.release_channel }}"
tags = {
"beta": {
"debian": [
f"{short}", f"{long}", f"{short}-beta", f"{long}-beta", "beta", "latest",
f"{short}-debian", f"{long}-debian", f"{short}-beta-debian", f"{long}-beta-debian", "beta-debian"
],
"alpine": [
f"{short}-alpine", f"{long}-alpine", f"{short}-beta-alpine", f"{long}-beta-alpine", "beta-alpine"
]
},
"alpha": {
"debian": [
f"{short}-alpha", f"{long}-alpha", "alpha",
f"{short}-alpha-debian", f"{long}-alpha-debian", "alpha-debian"
],
"alpine": [
f"{short}-alpha-alpine", f"{long}-alpha-alpine", "alpha-alpine"
]
},
"daily": {
"debian": ["daily", "daily-debian"],
"alpine": ["daily-alpine"]
}
}
with open(os.environ["GITHUB_OUTPUT"], "a") as fh:
fh.write("debian<<EOF\n")
fh.write("\n".join(tags[release_channel]["debian"]))
fh.write("\nEOF\n")
fh.write("alpine<<EOF\n")
fh.write("\n".join(tags[release_channel]["alpine"]))
fh.write("\nEOF\n")
id: tags
- name: Docker login
uses: docker/login-action@v4
with:
username: meshtastic
password: ${{ secrets.DOCKER_FIRMWARE_TOKEN }}
- name: Docker meta (Debian)
id: meta_debian
uses: docker/metadata-action@v6
with:
images: meshtastic/meshtasticd
tags: |
${{ steps.tags.outputs.debian }}
flavor: latest=false
- name: Create Docker manifest (Debian)
id: manifest_debian
uses: int128/docker-manifest-create-action@v2
with:
tags: |
${{ steps.meta_debian.outputs.tags }}
push: true
sources: |
meshtastic/meshtasticd@${{ needs.docker-debian-amd64.outputs.digest }}
meshtastic/meshtasticd@${{ needs.docker-debian-arm64.outputs.digest }}
meshtastic/meshtasticd@${{ needs.docker-debian-armv7.outputs.digest }}
- name: Docker meta (Alpine)
id: meta_alpine
uses: docker/metadata-action@v6
with:
images: meshtastic/meshtasticd
tags: |
${{ steps.tags.outputs.alpine }}
- name: Create Docker manifest (Alpine)
id: manifest_alpine
uses: int128/docker-manifest-create-action@v2
with:
tags: |
${{ steps.meta_alpine.outputs.tags }}
push: true
sources: |
meshtastic/meshtasticd@${{ needs.docker-alpine-amd64.outputs.digest }}
meshtastic/meshtasticd@${{ needs.docker-alpine-arm64.outputs.digest }}
meshtastic/meshtasticd@${{ needs.docker-alpine-armv7.outputs.digest }}
================================================
FILE: .github/workflows/first_time_contributor.yml
================================================
name: Welcome First-Time Contributor
on:
issues:
types: opened
pull_request_target:
types: opened
permissions: {}
jobs:
welcome:
runs-on: ubuntu-latest
permissions:
issues: write # Required to post comments and labels on issues
pull-requests: write # Required to post comments and labels on PRs
steps:
- uses: plbstl/first-contribution@v4
with:
labels: first-contribution
issue-opened-msg: |
### @{fc-author}, Welcome to Meshtastic! :wave:
Thanks for opening your first issue. If it's helpful, an easy way
to get logs is the "Open Serial Monitor" button on the [Web Flasher](https://flasher.meshtastic.org).
If you have ideas for features, note that we often debate big ideas
in the [discussions tab](https://github.com/meshtastic/firmware/discussions/categories/ideas)
first. This tracker tends to be for ideas that have community
consensus and a clear implementation.
We're very active [on discord](https://discord.com/invite/meshtastic),
especially the \#firmware and \#alphanauts-testing channels. If you'll
be around for a while, we'd love to see you there!
Welcome to the community! :heart:
pr-opened-msg: |
### @{fc-author}, Welcome to Meshtastic!
Thanks for opening your first pull request. We really appreciate it.
We discuss work as a team in discord, please join us in the [#firmware channel](https://discord.com/invite/meshtastic).
There's a big backlog of patches at the moment. If you have time,
please help us with some code review and testing of [other PRs](https://github.com/meshtastic/firmware/pulls)!
Welcome to the team :smile:
================================================
FILE: .github/workflows/hook_copr.yml
================================================
name: Trigger COPR build
on:
workflow_call:
secrets:
COPR_API_CONFIG:
inputs:
copr_project:
description: COPR project to target
required: true
type: string
permissions:
contents: write
packages: write
jobs:
build-copr-hook:
runs-on: ubuntu-24.04
steps:
- name: Checkout code
uses: actions/checkout@v6
with:
submodules: recursive
ref: ${{ github.ref }}
repository: ${{ github.repository }}
- name: Trigger COPR build
uses: vidplace7/copr-build@main
id: copr_build
env:
COPR_API_TOKEN_CONFIG: ${{ secrets.COPR_API_CONFIG }}
with:
owner: "@meshtastic"
package-name: meshtasticd
project-name: ${{ inputs.copr_project }}
git-remote: "${{ github.server_url }}/${{ github.repository }}.git"
committish: ${{ github.sha }}
================================================
FILE: .github/workflows/main_matrix.yml
================================================
name: CI
concurrency:
group: ci-${{ github.head_ref || github.run_id }}
cancel-in-progress: true
on:
# # Triggers the workflow on push but only for the main branches
push:
branches:
- master
- develop
- pioarduino # Remove when merged // use `feature/` in the future.
- event/*
- feature/*
paths-ignore:
- "**.md"
- version.properties
# Note: This is different from "pull_request". Need to specify ref when doing checkouts.
pull_request_target:
branches:
- master
- develop
- pioarduino # Remove when merged // use `feature/` in the future.
- event/*
- feature/*
paths-ignore:
- "**.md"
#- "**.yml"
workflow_dispatch:
jobs:
setup:
strategy:
fail-fast: true
matrix:
arch:
- all
- check
runs-on: ubuntu-24.04
steps:
- uses: actions/checkout@v6
- uses: actions/setup-python@v6
with:
python-version: 3.x
cache: pip
- run: pip install -U platformio
- name: Generate matrix
id: jsonStep
run: |
if [[ "$GITHUB_HEAD_REF" == "" ]]; then
TARGETS=$(./bin/generate_ci_matrix.py ${{matrix.arch}})
else
TARGETS=$(./bin/generate_ci_matrix.py ${{matrix.arch}} --level pr)
fi
echo "Name: $GITHUB_REF_NAME Base: $GITHUB_BASE_REF Ref: $GITHUB_REF"
echo "${{matrix.arch}}=$TARGETS" >> $GITHUB_OUTPUT
echo "$TARGETS" >> $GITHUB_STEP_SUMMARY
outputs:
all: ${{ steps.jsonStep.outputs.all }}
check: ${{ steps.jsonStep.outputs.check }}
version:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v6
- name: Get release version string
run: |
echo "long=$(./bin/buildinfo.py long)" >> $GITHUB_OUTPUT
echo "deb=$(./bin/buildinfo.py deb)" >> $GITHUB_OUTPUT
id: version
env:
BUILD_LOCATION: local
outputs:
long: ${{ steps.version.outputs.long }}
deb: ${{ steps.version.outputs.deb }}
check:
needs: setup
strategy:
fail-fast: false
matrix:
check: ${{ fromJson(needs.setup.outputs.check) }}
# Use 'arctastic' self-hosted runner pool when checking in the main repo
runs-on: ${{ github.repository_owner == 'meshtastic' && 'arctastic' || 'ubuntu-latest' }}
if: ${{ github.event_name != 'workflow_dispatch' && github.repository == 'meshtastic/firmware' }}
steps:
- uses: actions/checkout@v6
with:
submodules: recursive
ref: ${{github.event.pull_request.head.ref}}
repository: ${{github.event.pull_request.head.repo.full_name}}
- name: Check ${{ matrix.check.board }}
uses: meshtastic/gh-action-firmware@main
with:
pio_platform: ${{ matrix.check.platform }}
pio_env: ${{ matrix.check.board }}
pio_target: check
build:
needs: [setup, version]
strategy:
fail-fast: false
matrix:
build: ${{ fromJson(needs.setup.outputs.all) }}
uses: ./.github/workflows/build_firmware.yml
with:
version: ${{ needs.version.outputs.long }}
pio_env: ${{ matrix.build.board }}
platform: ${{ matrix.build.platform }}
build-debian-src:
if: github.repository == 'meshtastic/firmware'
uses: ./.github/workflows/build_debian_src.yml
with:
series: UNRELEASED
build_location: local
secrets: inherit
package-pio-deps-native-tft:
if: ${{ github.repository == 'meshtastic/firmware' && github.event_name == 'workflow_dispatch' }}
uses: ./.github/workflows/package_pio_deps.yml
with:
pio_env: native-tft
secrets: inherit
test-native:
if: ${{ !contains(github.ref_name, 'event/') && github.repository == 'meshtastic/firmware' }}
uses: ./.github/workflows/test_native.yml
docker:
strategy:
fail-fast: false
matrix:
distro: [debian, alpine]
platform: [linux/amd64, linux/arm64, linux/arm/v7]
pio_env: [native, native-tft]
exclude:
- distro: alpine
platform: linux/arm/v7
- pio_env: native-tft
platform: linux/arm64
- pio_env: native-tft
platform: linux/arm/v7
uses: ./.github/workflows/docker_build.yml
with:
distro: ${{ matrix.distro }}
platform: ${{ matrix.platform }}
runs-on: ${{ contains(matrix.platform, 'arm') && 'ubuntu-24.04-arm' || 'ubuntu-24.04' }}
pio_env: ${{ matrix.pio_env }}
push: false
gather-artifacts:
# trunk-ignore(checkov/CKV2_GHA_1)
if: github.repository == 'meshtastic/firmware'
permissions:
contents: write
pull-requests: write
strategy:
fail-fast: false
matrix:
arch:
- esp32
- esp32s3
- esp32c3
- esp32c6
- nrf52840
- rp2040
- rp2350
- stm32
runs-on: ubuntu-latest
needs: [version, build]
steps:
- name: Checkout code
uses: actions/checkout@v6
with:
ref: ${{github.event.pull_request.head.ref}}
repository: ${{github.event.pull_request.head.repo.full_name}}
- uses: actions/download-artifact@v8
with:
path: ./
pattern: firmware-${{matrix.arch}}-*
merge-multiple: true
- name: Display structure of downloaded files
run: ls -R
- name: Repackage in single firmware zip
uses: actions/upload-artifact@v7
with:
name: firmware-${{matrix.arch}}-${{ needs.version.outputs.long }}
overwrite: true
path: |
./firmware-*.mt.json
./firmware-*.bin
./firmware-*.uf2
./firmware-*.hex
./firmware-*.zip
./device-*.sh
./device-*.bat
./littlefs-*.bin
./bleota*bin
./mt-*-ota.bin
./Meshtastic_nRF52_factory_erase*.uf2
retention-days: 30
- uses: actions/download-artifact@v8
with:
name: firmware-${{matrix.arch}}-${{ needs.version.outputs.long }}
merge-multiple: true
path: ./output
# For diagnostics
- name: Show artifacts
run: ls -lR
- name: Device scripts permissions
run: |
chmod +x ./output/device-install.sh || true
chmod +x ./output/device-update.sh || true
- name: Zip firmware
run: zip -j -9 -r ./firmware-${{matrix.arch}}-${{ needs.version.outputs.long }}.zip ./output
- name: Repackage in single elfs zip
uses: actions/upload-artifact@v7
with:
name: debug-elfs-${{matrix.arch}}-${{ needs.version.outputs.long }}
overwrite: true
path: ./*.elf
retention-days: 30
- uses: scruplelesswizard/comment-artifact@main
if: ${{ github.event_name == 'pull_request' }}
with:
name: firmware-${{matrix.arch}}-${{ needs.version.outputs.long }}
description: "Download firmware-${{matrix.arch}}-${{ needs.version.outputs.long }}.zip. This artifact will be available for 90 days from creation"
github-token: ${{ secrets.GITHUB_TOKEN }}
shame:
if: github.repository == 'meshtastic/firmware'
continue-on-error: true
runs-on: ubuntu-latest
needs: [build]
steps:
- uses: actions/checkout@v6
if: github.event_name == 'pull_request_target'
with:
filter: blob:none # means we download all the git history but none of the commit (except ones with checkout like the head)
fetch-depth: 0
- name: Download the current manifests
uses: actions/download-artifact@v8
with:
path: ./manifests-new/
pattern: manifest-*
merge-multiple: true
- name: Upload combined manifests for later commit and global stats crunching.
uses: actions/upload-artifact@v7
id: upload-manifest
with:
name: manifests-${{ github.sha }}
overwrite: true
path: manifests-new/*.mt.json
- name: Find the merge base
if: github.event_name == 'pull_request_target'
run: echo "MERGE_BASE=$(git merge-base "origin/$base" "$head")" >> $GITHUB_ENV
env:
base: ${{ github.base_ref }}
head: ${{ github.sha }}
# Currently broken (for-loop through EVERY artifact -- rate limiting)
# - name: Download the old manifests
# if: github.event_name == 'pull_request_target'
# run: gh run download -R "$repo" --name "manifests-$merge_base" --dir manifest-old/
# env:
# GH_TOKEN: ${{ github.token }}
# merge_base: ${{ env.MERGE_BASE }}
# repo: ${{ github.repository }}
# - name: Do scan and post comment
# if: github.event_name == 'pull_request_target'
# run: python3 bin/shame.py ${{ github.event.pull_request.number }} manifests-old/ manifests-new/
release-artifacts:
runs-on: ubuntu-latest
if: ${{ github.event_name == 'workflow_dispatch' && github.repository == 'meshtastic/firmware' }}
outputs:
upload_url: ${{ steps.create_release.outputs.upload_url }}
needs:
- setup
- version
- gather-artifacts
- build-debian-src
- package-pio-deps-native-tft
steps:
- name: Checkout
uses: actions/checkout@v6
with:
fetch-depth: 0
- name: Setup Python
uses: actions/setup-python@v6
with:
python-version: 3.x
- name: Generate release notes
id: release_notes
run: |
chmod +x ./bin/generate_release_notes.py
NOTES=$(./bin/generate_release_notes.py ${{ needs.version.outputs.long }})
echo "notes<<EOF" >> $GITHUB_OUTPUT
echo "$NOTES" >> $GITHUB_OUTPUT
echo "EOF" >> $GITHUB_OUTPUT
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
- name: Create release
uses: softprops/action-gh-release@v2
id: create_release
with:
draft: true
prerelease: true
name: Meshtastic Firmware ${{ needs.version.outputs.long }} Alpha
tag_name: v${{ needs.version.outputs.long }}
body: ${{ steps.release_notes.outputs.notes }}
- name: Download source deb
uses: actions/download-artifact@v8
with:
pattern: firmware-debian-${{ needs.version.outputs.deb }}~UNRELEASED-src
merge-multiple: true
path: ./output/debian-src
- name: Download `native-tft` pio deps
uses: actions/download-artifact@v8
with:
pattern: platformio-deps-native-tft-${{ needs.version.outputs.long }}
merge-multiple: true
path: ./output/pio-deps-native-tft
- name: Zip Linux sources
working-directory: output
run: |
zip -j -9 -r ./meshtasticd-${{ needs.version.outputs.deb }}-src.zip ./debian-src
zip -9 -r ./platformio-deps-native-tft-${{ needs.version.outputs.long }}.zip ./pio-deps-native-tft
# For diagnostics
- name: Display structure of downloaded files
run: ls -lR
- name: Generate Release manifest
run: |
jq -n --arg ver "${{ needs.version.outputs.long }}" --argjson targets ${{ toJson(needs.setup.outputs.all) }} '{
"version": $ver,
"targets": $targets
}' > firmware-${{ needs.version.outputs.long }}.json
- name: Save Release manifest artifact
uses: actions/upload-artifact@v7
with:
name: manifest-${{ needs.version.outputs.long }}
overwrite: true
path: firmware-${{ needs.version.outputs.long }}.json
- name: Add sources to GitHub Release
# Only run when targeting master branch with workflow_dispatch
if: ${{ github.ref_name == 'master' }}
run: |
gh release upload v${{ needs.version.outputs.long }} ./firmware-${{ needs.version.outputs.long }}.json
gh release upload v${{ needs.version.outputs.long }} ./output/meshtasticd-${{ needs.version.outputs.deb }}-src.zip
gh release upload v${{ needs.version.outputs.long }} ./output/platformio-deps-native-tft-${{ needs.version.outputs.long }}.zip
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
release-firmware:
strategy:
fail-fast: false
matrix:
arch:
- esp32
- esp32s3
- esp32c3
- esp32c6
- nrf52840
- rp2040
- rp2350
- stm32
runs-on: ubuntu-latest
if: ${{ github.event_name == 'workflow_dispatch' && github.repository == 'meshtastic/firmware'}}
needs: [release-artifacts, version]
steps:
- name: Checkout
uses: actions/checkout@v6
- name: Setup Python
uses: actions/setup-python@v6
with:
python-version: 3.x
- uses: actions/download-artifact@v8
with:
pattern: firmware-${{matrix.arch}}-${{ needs.version.outputs.long }}
merge-multiple: true
path: ./output
- name: Display structure of downloaded files
run: ls -lR
- name: Device scripts permissions
run: |
chmod +x ./output/device-install.sh || true
chmod +x ./output/device-update.sh || true
- name: Zip firmware
run: zip -j -9 -r ./firmware-${{matrix.arch}}-${{ needs.version.outputs.long }}.zip ./output
- uses: actions/download-artifact@v8
with:
name: debug-elfs-${{matrix.arch}}-${{ needs.version.outputs.long }}
merge-multiple: true
path: ./elfs
- name: Zip debug elfs
run: zip -j -9 -r ./debug-elfs-${{matrix.arch}}-${{ needs.version.outputs.long }}.zip ./elfs
# For diagnostics
- name: Display structure of downloaded files
run: ls -lR
- name: Add bins and debug elfs to GitHub Release
# Only run when targeting master branch with workflow_dispatch
if: ${{ github.ref_name == 'master' }}
run: |
gh release upload v${{ needs.version.outputs.long }} ./firmware-${{matrix.arch}}-${{ needs.version.outputs.long }}.zip
gh release upload v${{ needs.version.outputs.long }} ./debug-elfs-${{matrix.arch}}-${{ needs.version.outputs.long }}.zip
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
publish-firmware:
runs-on: ubuntu-24.04
if: ${{ github.event_name == 'workflow_dispatch' }}
needs: [release-firmware, version]
env:
targets: |-
esp32,esp32s3,esp32c3,esp32c6,nrf52840,rp2040,rp2350,stm32
steps:
- name: Checkout
uses: actions/checkout@v6
with:
fetch-depth: 0
- name: Setup Python
uses: actions/setup-python@v6
with:
python-version: 3.x
- name: Get firmware artifacts
uses: actions/download-artifact@v8
with:
pattern: firmware-{${{ env.targets }}}-${{ needs.version.outputs.long }}
merge-multiple: true
path: ./publish
- name: Get manifest artifact
uses: actions/download-artifact@v8
with:
pattern: manifest-${{ needs.version.outputs.long }}
path: ./publish
- name: Generate release notes
run: |
chmod +x ./bin/generate_release_notes.py
./bin/generate_release_notes.py ${{ needs.version.outputs.long }} > ./publish/release_notes.md
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
- name: Publish firmware to meshtastic.github.io
uses: peaceiris/actions-gh-pages@v4
env:
# On event/* branches, use the event name as the destination prefix
DEST_PREFIX: ${{ contains(github.ref_name, 'event/') && format('{0}/', github.ref_name) || '' }}
with:
deploy_key: ${{ secrets.DIST_PAGES_DEPLOY_KEY }}
external_repository: meshtastic/meshtastic.github.io
publish_branch: master
publish_dir: ./publish
destination_dir: ${{ env.DEST_PREFIX }}firmware-${{ needs.version.outputs.long }}
keep_files: true
user_name: github-actions[bot]
user_email: github-actions[bot]@users.noreply.github.com
commit_message: ${{ needs.version.outputs.long }}
enable_jekyll: true
================================================
FILE: .github/workflows/merge_queue.yml
================================================
name: Merge Queue
# Not sure how concurrency works in merge_queue, removing for now.
# concurrency:
# group: merge-queue-${{ github.head_ref || github.run_id }}
# cancel-in-progress: true
on:
# Merge group is a special trigger that is used to trigger the workflow when a merge group is created.
merge_group:
jobs:
setup:
strategy:
fail-fast: true
matrix:
arch:
- all
- check
runs-on: ubuntu-24.04
steps:
- uses: actions/checkout@v6
- uses: actions/setup-python@v6
with:
python-version: 3.x
cache: pip
- run: pip install -U platformio
- name: Generate matrix
id: jsonStep
run: |
if [[ "$GITHUB_HEAD_REF" == "" ]]; then
TARGETS=$(./bin/generate_ci_matrix.py ${{matrix.arch}})
else
TARGETS=$(./bin/generate_ci_matrix.py ${{matrix.arch}} --level pr)
fi
echo "Name: $GITHUB_REF_NAME Base: $GITHUB_BASE_REF Ref: $GITHUB_REF"
echo "${{matrix.arch}}=$TARGETS" >> $GITHUB_OUTPUT
outputs:
all: ${{ steps.jsonStep.outputs.all }}
check: ${{ steps.jsonStep.outputs.check }}
version:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v6
- name: Get release version string
run: |
echo "long=$(./bin/buildinfo.py long)" >> $GITHUB_OUTPUT
echo "deb=$(./bin/buildinfo.py deb)" >> $GITHUB_OUTPUT
id: version
env:
BUILD_LOCATION: local
outputs:
long: ${{ steps.version.outputs.long }}
deb: ${{ steps.version.outputs.deb }}
check:
needs: setup
strategy:
fail-fast: true
matrix:
check: ${{ fromJson(needs.setup.outputs.check) }}
runs-on: ubuntu-latest
if: ${{ github.event_name != 'workflow_dispatch' }}
steps:
- uses: actions/checkout@v6
- name: Build base
id: base
uses: ./.github/actions/setup-base
- name: Check ${{ matrix.check.board }}
run: bin/check-all.sh ${{ matrix.check.board }}
build:
needs: [setup, version]
strategy:
matrix:
build: ${{ fromJson(needs.setup.outputs.all) }}
uses: ./.github/workflows/build_firmware.yml
with:
version: ${{ needs.version.outputs.long }}
pio_env: ${{ matrix.build.board }}
platform: ${{ matrix.build.platform }}
build-debian-src:
if: github.repository == 'meshtastic/firmware'
uses: ./.github/workflows/build_debian_src.yml
with:
series: UNRELEASED
build_location: local
secrets: inherit
package-pio-deps-native-tft:
if: ${{ github.event_name == 'workflow_dispatch' }}
uses: ./.github/workflows/package_pio_deps.yml
with:
pio_env: native-tft
secrets: inherit
test-native:
if: ${{ !contains(github.ref_name, 'event/') }}
uses: ./.github/workflows/test_native.yml
docker:
strategy:
fail-fast: false
matrix:
distro: [debian, alpine]
platform: [linux/amd64, linux/arm64, linux/arm/v7]
pio_env: [native, native-tft]
exclude:
- distro: alpine
platform: linux/arm/v7
- pio_env: native-tft
platform: linux/arm64
- pio_env: native-tft
platform: linux/arm/v7
uses: ./.github/workflows/docker_build.yml
with:
distro: ${{ matrix.distro }}
platform: ${{ matrix.platform }}
runs-on: ${{ contains(matrix.platform, 'arm') && 'ubuntu-24.04-arm' || 'ubuntu-24.04' }}
pio_env: ${{ matrix.pio_env }}
push: false
gather-artifacts:
# trunk-ignore(checkov/CKV2_GHA_1)
permissions:
contents: write
pull-requests: write
strategy:
fail-fast: false
matrix:
arch:
- esp32
- esp32s3
- esp32c3
- esp32c6
- nrf52840
- rp2040
- rp2350
- stm32
runs-on: ubuntu-latest
needs: [version, build]
steps:
- name: Checkout code
uses: actions/checkout@v6
with:
ref: ${{github.event.pull_request.head.ref}}
repository: ${{github.event.pull_request.head.repo.full_name}}
- uses: actions/download-artifact@v8
with:
path: ./
pattern: firmware-${{matrix.arch}}-*
merge-multiple: true
- name: Display structure of downloaded files
run: ls -R
- name: Move files up
run: mv -b -t ./ ./bin/device-*.sh ./bin/device-*.bat
- name: Repackage in single firmware zip
uses: actions/upload-artifact@v7
with:
name: firmware-${{matrix.arch}}-${{ needs.version.outputs.long }}
overwrite: true
path: |
./firmware-*.bin
./firmware-*.uf2
./firmware-*.hex
./firmware-*.zip
./device-*.sh
./device-*.bat
./littlefs-*.bin
./bleota*bin
./Meshtastic_nRF52_factory_erase*.uf2
retention-days: 30
- uses: actions/download-artifact@v8
with:
name: firmware-${{matrix.arch}}-${{ needs.version.outputs.long }}
merge-multiple: true
path: ./output
# For diagnostics
- name: Show artifacts
run: ls -lR
- name: Device scripts permissions
run: |
chmod +x ./output/device-install.sh || true
chmod +x ./output/device-update.sh || true
- name: Zip firmware
run: zip -j -9 -r ./firmware-${{matrix.arch}}-${{ needs.version.outputs.long }}.zip ./output
- name: Repackage in single elfs zip
uses: actions/upload-artifact@v7
with:
name: debug-elfs-${{matrix.arch}}-${{ needs.version.outputs.long }}
overwrite: true
path: ./*.elf
retention-days: 30
- uses: scruplelesswizard/comment-artifact@main
if: ${{ github.event_name == 'pull_request' }}
with:
name: firmware-${{matrix.arch}}-${{ needs.version.outputs.long }}
description: "Download firmware-${{matrix.arch}}-${{ needs.version.outputs.long }}.zip. This artifact will be available for 90 days from creation"
github-token: ${{ secrets.GITHUB_TOKEN }}
release-artifacts:
runs-on: ubuntu-latest
if: ${{ github.event_name == 'workflow_dispatch' }}
outputs:
upload_url: ${{ steps.create_release.outputs.upload_url }}
needs:
- version
- gather-artifacts
- build-debian-src
- package-pio-deps-native-tft
steps:
- name: Checkout
uses: actions/checkout@v6
- name: Create release
uses: softprops/action-gh-release@v2
id: create_release
with:
draft: true
prerelease: true
name: Meshtastic Firmware ${{ needs.version.outputs.long }} Alpha
tag_name: v${{ needs.version.outputs.long }}
body: |
Autogenerated by github action, developer should edit as required before publishing...
- name: Download source deb
uses: actions/download-artifact@v8
with:
pattern: firmware-debian-${{ needs.version.outputs.deb }}~UNRELEASED-src
merge-multiple: true
path: ./output/debian-src
- name: Download `native-tft` pio deps
uses: actions/download-artifact@v8
with:
pattern: platformio-deps-native-tft-${{ needs.version.outputs.long }}
merge-multiple: true
path: ./output/pio-deps-native-tft
- name: Zip Linux sources
working-directory: output
run: |
zip -j -9 -r ./meshtasticd-${{ needs.version.outputs.deb }}-src.zip ./debian-src
zip -9 -r ./platformio-deps-native-tft-${{ needs.version.outputs.long }}.zip ./pio-deps-native-tft
# For diagnostics
- name: Display structure of downloaded files
run: ls -lR
- name: Add Linux sources to GtiHub Release
# Only run when targeting master branch with workflow_dispatch
if: ${{ github.ref_name == 'master' }}
run: |
gh release upload v${{ needs.version.outputs.long }} ./output/meshtasticd-${{ needs.version.outputs.deb }}-src.zip
gh release upload v${{ needs.version.outputs.long }} ./output/platformio-deps-native-tft-${{ needs.version.outputs.long }}.zip
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
release-firmware:
strategy:
fail-fast: false
matrix:
arch:
- esp32
- esp32s3
- esp32c3
- esp32c6
- nrf52840
- rp2040
- rp2350
- stm32
runs-on: ubuntu-latest
if: ${{ github.event_name == 'workflow_dispatch' }}
needs: [release-artifacts, version]
steps:
- name: Checkout
uses: actions/checkout@v6
- name: Setup Python
uses: actions/setup-python@v6
with:
python-version: 3.x
- uses: actions/download-artifact@v8
with:
pattern: firmware-${{matrix.arch}}-${{ needs.version.outputs.long }}
merge-multiple: true
path: ./output
- name: Display structure of downloaded files
run: ls -lR
- name: Device scripts permissions
run: |
chmod +x ./output/device-install.sh || true
chmod +x ./output/device-update.sh || true
- name: Zip firmware
run: zip -j -9 -r ./firmware-${{matrix.arch}}-${{ needs.version.outputs.long }}.zip ./output
- uses: actions/download-artifact@v8
with:
name: debug-elfs-${{matrix.arch}}-${{ needs.version.outputs.long }}
merge-multiple: true
path: ./elfs
- name: Zip debug elfs
run: zip -j -9 -r ./debug-elfs-${{matrix.arch}}-${{ needs.version.outputs.long }}.zip ./elfs
# For diagnostics
- name: Display structure of downloaded files
run: ls -lR
- name: Add bins and debug elfs to GitHub Release
# Only run when targeting master branch with workflow_dispatch
if: ${{ github.ref_name == 'master' }}
run: |
gh release upload v${{ needs.version.outputs.long }} ./firmware-${{matrix.arch}}-${{ needs.version.outputs.long }}.zip
gh release upload v${{ needs.version.outputs.long }} ./debug-elfs-${{matrix.arch}}-${{ needs.version.outputs.long }}.zip
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
publish-firmware:
runs-on: ubuntu-24.04
if: ${{ github.event_name == 'workflow_dispatch' }}
needs: [release-firmware, version]
env:
targets: |-
esp32,esp32s3,esp32c3,esp32c6,nrf52840,rp2040,rp2350,stm32
steps:
- name: Checkout
uses: actions/checkout@v6
- name: Setup Python
uses: actions/setup-python@v6
with:
python-version: 3.x
- uses: actions/download-artifact@v8
with:
pattern: firmware-{${{ env.targets }}}-${{ needs.version.outputs.long }}
merge-multiple: true
path: ./publish
- name: Publish firmware to meshtastic.github.io
uses: peaceiris/actions-gh-pages@v4
env:
# On event/* branches, use the event name as the destination prefix
DEST_PREFIX: ${{ contains(github.ref_name, 'event/') && format('{0}/', github.ref_name) || '' }}
with:
deploy_key: ${{ secrets.DIST_PAGES_DEPLOY_KEY }}
external_repository: meshtastic/meshtastic.github.io
publish_branch: master
publish_dir: ./publish
destination_dir: ${{ env.DEST_PREFIX }}firmware-${{ needs.version.outputs.long }}
keep_files: true
user_name: github-actions[bot]
user_email: github-actions[bot]@users.noreply.github.com
commit_message: ${{ needs.version.outputs.long }}
enable_jekyll: true
================================================
FILE: .github/workflows/models_issue_triage.yml
================================================
name: Issue Triage (Models)
on:
issues:
types: [opened]
permissions:
issues: write
models: read
concurrency:
group: ${{ github.workflow }}-${{ github.event.issue.number }}
cancel-in-progress: true
jobs:
triage:
if: ${{ github.repository == 'meshtastic/firmware' && github.event.issue.user.type != 'Bot' }}
runs-on: ubuntu-latest
steps:
# ─────────────────────────────────────────────────────────────────────────
# Step 1: Quality check (spam/AI-slop detection) - runs first, exits early if spam
# ─────────────────────────────────────────────────────────────────────────
- name: Detect spam or low-quality content
uses: actions/ai-inference@v2
id: quality
continue-on-error: true
with:
max-tokens: 20
prompt: |
Is this GitHub issue spam, AI-generated slop, or low quality?
Title: ${{ github.event.issue.title }}
Body: ${{ github.event.issue.body }}
Respond with exactly one of: spam, ai-generated, needs-review, ok
system-prompt: You detect spam and low-quality contributions. Be conservative - only flag obvious spam or AI slop.
model: openai/gpt-4o-mini
- name: Apply quality label if needed
if: steps.quality.outputs.response != '' && steps.quality.outputs.response != 'ok'
uses: actions/github-script@v8
env:
QUALITY_LABEL: ${{ steps.quality.outputs.response }}
with:
script: |
const label = (process.env.QUALITY_LABEL || '').trim().toLowerCase();
const labelMeta = {
'spam': { color: 'd73a4a', description: 'Possible spam' },
'ai-generated': { color: 'fbca04', description: 'Possible AI-generated low-quality content' },
'needs-review': { color: 'f9d0c4', description: 'Needs human review' },
};
const meta = labelMeta[label];
if (!meta) return;
// Ensure label exists
try {
await github.rest.issues.getLabel({ owner: context.repo.owner, repo: context.repo.repo, name: label });
} catch (e) {
if (e.status !== 404) throw e;
await github.rest.issues.createLabel({ owner: context.repo.owner, repo: context.repo.repo, name: label, color: meta.color, description: meta.description });
}
// Apply label
await github.rest.issues.addLabels({ owner: context.repo.owner, repo: context.repo.repo, issue_number: context.payload.issue.number, labels: [label] });
// Set output to skip remaining steps
core.setOutput('is_spam', 'true');
# ─────────────────────────────────────────────────────────────────────────
# Step 2: Duplicate detection - only if not spam
# ─────────────────────────────────────────────────────────────────────────
- name: Detect duplicate issues
if: steps.quality.outputs.response == 'ok' || steps.quality.outputs.response == ''
uses: pelikhan/action-genai-issue-dedup@bdb3b5d9451c1090ffcdf123d7447a5e7c7a2528 # v0.0.19
with:
github_token: ${{ secrets.GITHUB_TOKEN }}
# ─────────────────────────────────────────────────────────────────────────
# Step 3: Completeness check + auto-labeling (combined into one AI call)
# ─────────────────────────────────────────────────────────────────────────
- name: Determine if completeness check should be skipped
if: steps.quality.outputs.response == 'ok' || steps.quality.outputs.response == ''
uses: actions/github-script@v8
id: check-skip
with:
script: |
const title = (context.payload.issue.title || '').toLowerCase();
const labels = (context.payload.issue.labels || []).map(label => label.name);
const hasFeatureRequest = title.includes('feature request');
const hasEnhancement = labels.includes('enhancement');
const shouldSkip = hasFeatureRequest && hasEnhancement;
core.setOutput('should_skip', shouldSkip ? 'true' : 'false');
- name: Analyze issue completeness and determine labels
if: (steps.quality.outputs.response == 'ok' || steps.quality.outputs.response == '') && steps.check-skip.outputs.should_skip != 'true'
uses: actions/ai-inference@v2
id: analysis
continue-on-error: true
with:
prompt: |
Analyze this GitHub issue for completeness and determine if it needs labels.
IMPORTANT: Distinguish between:
- Device/firmware bugs (crashes, reboots, lockups, radio/GPS/display/power issues) - these need device logs
- Build/release/packaging issues (missing files, CI failures, download problems) - these do NOT need device logs
- Documentation or website issues - these do NOT need device logs
If this is a device/firmware bug, request device logs and explain how to get them:
Web Flasher logs:
- Go to https://flasher.meshtastic.org
- Connect the device via USB and click Connect
- Open the device console/log output, reproduce the problem, then copy/download and attach/paste the logs
Meshtastic CLI logs:
- Run: meshtastic --port <serial-port> --noproto
- Reproduce the problem, then copy/paste the terminal output
Also request key context if missing: device model/variant, firmware version, region, steps to reproduce, expected vs actual.
Respond ONLY with valid JSON (no markdown, no code fences):
{"complete": true, "comment": "", "label": "none"}
OR
{"complete": false, "comment": "Your helpful comment", "label": "needs-logs"}
Use "needs-logs" ONLY if this is a device/firmware bug AND no logs are attached.
Use "needs-info" if basic info like firmware version or steps to reproduce are missing.
Use "none" if the issue is complete, is a feature request, or is a build/CI/packaging issue.
Title: ${{ github.event.issue.title }}
Body: ${{ github.event.issue.body }}
system-prompt: You are a helpful assistant that triages GitHub issues. Be conservative with labels. Only request device logs for actual device/firmware bugs, not for build/release/CI issues.
model: openai/gpt-4o-mini
- name: Process analysis result
if: (steps.quality.outputs.response == 'ok' || steps.quality.outputs.response == '') && steps.check-skip.outputs.should_skip != 'true' && steps.analysis.outputs.response != ''
uses: actions/github-script@v8
id: process
env:
AI_RESPONSE: ${{ steps.analysis.outputs.response }}
with:
script: |
let raw = (process.env.AI_RESPONSE || '').trim();
// Strip markdown code fences if present
raw = raw.replace(/^```(?:json)?\s*/i, '').replace(/\s*```$/i, '').trim();
let complete = true;
let comment = '';
let label = 'none';
try {
const parsed = JSON.parse(raw);
complete = !!parsed.complete;
comment = (parsed.comment ?? '').toString().trim();
label = (parsed.label ?? 'none').toString().trim().toLowerCase();
} catch {
// If JSON parse fails, log warning and don't comment (avoid posting raw JSON)
console.log('Failed to parse AI response as JSON:', raw);
complete = true;
comment = '';
label = 'none';
}
// Validate label
const allowedLabels = new Set(['needs-logs', 'needs-info', 'none']);
if (!allowedLabels.has(label)) label = 'none';
// Only comment if we have a valid parsed comment (not raw JSON)
const shouldComment = !complete && comment.length > 0 && !comment.startsWith('{');
core.setOutput('should_comment', shouldComment ? 'true' : 'false');
core.setOutput('comment_body', comment);
core.setOutput('label', label);
- name: Apply triage label
if: steps.process.outputs.label != '' && steps.process.outputs.label != 'none'
uses: actions/github-script@v8
env:
LABEL_NAME: ${{ steps.process.outputs.label }}
with:
script: |
const label = process.env.LABEL_NAME;
const labelMeta = {
'needs-logs': { color: 'cfd3d7', description: 'Device logs requested for triage' },
'needs-info': { color: 'f9d0c4', description: 'More information requested for triage' },
};
const meta = labelMeta[label];
if (!meta) return;
// Ensure label exists
try {
await github.rest.issues.getLabel({ owner: context.repo.owner, repo: context.repo.repo, name: label });
} catch (e) {
if (e.status !== 404) throw e;
await github.rest.issues.createLabel({ owner: context.repo.owner, repo: context.repo.repo, name: label, color: meta.color, description: meta.description });
}
// Apply label
await github.rest.issues.addLabels({ owner: context.repo.owner, repo: context.repo.repo, issue_number: context.payload.issue.number, labels: [label] });
- name: Comment on issue
if: steps.process.outputs.should_comment == 'true'
uses: actions/github-script@v8
env:
COMMENT_BODY: ${{ steps.process.outputs.comment_body }}
with:
script: |
await github.rest.issues.createComment({
owner: context.repo.owner,
repo: context.repo.repo,
issue_number: context.payload.issue.number,
body: process.env.COMMENT_BODY
});
================================================
FILE: .github/workflows/models_pr_triage.yml
================================================
name: PR Triage (Models)
on:
pull_request_target:
types: [opened]
permissions:
pull-requests: write
issues: write
models: read
concurrency:
group: ${{ github.workflow }}-${{ github.event.pull_request.number }}
cancel-in-progress: true
jobs:
triage:
if: ${{ github.repository == 'meshtastic/firmware' && github.event.pull_request.user.type != 'Bot' }}
runs-on: ubuntu-latest
steps:
# ─────────────────────────────────────────────────────────────────────────
# Step 1: Check if PR already has automation/type labels (skip if so)
# ─────────────────────────────────────────────────────────────────────────
- name: Check existing labels
uses: actions/github-script@v8
id: check-labels
with:
script: |
const skipLabels = new Set(['automation']);
const typeLabels = new Set(['bugfix', 'hardware-support', 'enhancement', 'dependencies', 'submodules', 'github_actions', 'trunk', 'cleanup']);
const prLabels = context.payload.pull_request.labels.map(l => l.name);
const shouldSkipAll = prLabels.some(l => skipLabels.has(l));
const hasTypeLabel = prLabels.some(l => typeLabels.has(l));
core.setOutput('skip_all', shouldSkipAll ? 'true' : 'false');
core.setOutput('has_type_label', hasTypeLabel ? 'true' : 'false');
# ─────────────────────────────────────────────────────────────────────────
# Step 2: Quality check (spam/AI-slop detection)
# ─────────────────────────────────────────────────────────────────────────
- name: Detect spam or low-quality content
if: steps.check-labels.outputs.skip_all != 'true'
uses: actions/ai-inference@v2
id: quality
continue-on-error: true
with:
max-tokens: 20
prompt: |
Is this GitHub pull request spam, AI-generated slop, or low quality?
Title: ${{ github.event.pull_request.title }}
Body: ${{ github.event.pull_request.body }}
Respond with exactly one of: spam, ai-generated, needs-review, ok
system-prompt: You detect spam and low-quality contributions. Be conservative - only flag obvious spam or AI slop.
model: openai/gpt-4o-mini
- name: Apply quality label if needed
if: steps.check-labels.outputs.skip_all != 'true' && steps.quality.outputs.response != '' && steps.quality.outputs.response != 'ok'
uses: actions/github-script@v8
id: quality-label
env:
QUALITY_LABEL: ${{ steps.quality.outputs.response }}
with:
script: |
const label = (process.env.QUALITY_LABEL || '').trim().toLowerCase();
const labelMeta = {
'spam': { color: 'd73a4a', description: 'Possible spam' },
'ai-generated': { color: 'fbca04', description: 'Possible AI-generated low-quality content' },
'needs-review': { color: 'f9d0c4', description: 'Needs human review' },
};
const meta = labelMeta[label];
if (!meta) return;
// Ensure label exists
try {
await github.rest.issues.getLabel({ owner: context.repo.owner, repo: context.repo.repo, name: label });
} catch (e) {
if (e.status !== 404) throw e;
await github.rest.issues.createLabel({ owner: context.repo.owner, repo: context.repo.repo, name: label, color: meta.color, description: meta.description });
}
// Apply label
await github.rest.issues.addLabels({ owner: context.repo.owner, repo: context.repo.repo, issue_number: context.payload.pull_request.number, labels: [label] });
core.setOutput('is_spam', 'true');
# ─────────────────────────────────────────────────────────────────────────
# Step 3: Auto-label PR type (bugfix/hardware-support/enhancement)
# Only skip for spam/ai-generated; still classify needs-review PRs
# ─────────────────────────────────────────────────────────────────────────
- name: Classify PR for labeling
if: steps.check-labels.outputs.skip_all != 'true' && steps.check-labels.outputs.has_type_label != 'true' && steps.quality.outputs.response != 'spam' && steps.quality.outputs.response != 'ai-generated'
uses: actions/ai-inference@v2
id: classify
continue-on-error: true
with:
max-tokens: 30
prompt: |
Classify this pull request into exactly one category.
Return exactly one of: bugfix, hardware-support, enhancement
Use bugfix if it fixes a bug, crash, or incorrect behavior.
Use hardware-support if it adds or improves support for a specific hardware device/variant.
Use enhancement if it adds a new feature, improves performance, or refactors code.
Title: ${{ github.event.pull_request.title }}
Body: ${{ github.event.pull_request.body }}
system-prompt: You classify pull requests into categories. Be conservative and pick the most appropriate single label.
model: openai/gpt-4o-mini
- name: Apply type label
if: steps.check-labels.outputs.skip_all != 'true' && steps.check-labels.outputs.has_type_label != 'true' && steps.classify.outputs.response != ''
uses: actions/github-script@v8
env:
TYPE_LABEL: ${{ steps.classify.outputs.response }}
with:
script: |
const label = (process.env.TYPE_LABEL || '').trim().toLowerCase();
const labelMeta = {
'bugfix': { color: 'd73a4a', description: 'Bug fix' },
'hardware-support': { color: '0e8a16', description: 'Hardware support addition or improvement' },
'enhancement': { color: 'a2eeef', description: 'New feature or enhancement' },
};
const meta = labelMeta[label];
if (!meta) return;
// Ensure label exists
try {
await github.rest.issues.getLabel({ owner: context.repo.owner, repo: context.repo.repo, name: label });
} catch (e) {
if (e.status !== 404) throw e;
await github.rest.issues.createLabel({ owner: context.repo.owner, repo: context.repo.repo, name: label, color: meta.color, description: meta.description });
}
// Apply label
await github.rest.issues.addLabels({ owner: context.repo.owner, repo: context.repo.repo, issue_number: context.payload.pull_request.number, labels: [label] });
================================================
FILE: .github/workflows/nightly.yml
================================================
name: Nightly
on:
schedule:
- cron: 0 8 * * 1-5
workflow_dispatch: {}
permissions: read-all
jobs:
trunk_check:
if: github.repository == 'meshtastic/firmware'
name: Trunk Check and Upload
runs-on: ubuntu-24.04
steps:
- name: Checkout
uses: actions/checkout@v6
- name: Trunk Check
uses: trunk-io/trunk-action@v1
with:
trunk-token: ${{ secrets.TRUNK_TOKEN }}
trunk_upgrade:
if: github.repository == 'meshtastic/firmware'
# See: https://github.com/trunk-io/trunk-action/blob/v1/readme.md#automatic-upgrades
name: Trunk Upgrade (PR)
runs-on: ubuntu-24.04
permissions:
contents: write # For trunk to create PRs
pull-requests: write # For trunk to create PRs
steps:
- name: Checkout
uses: actions/checkout@v6
- name: Trunk Upgrade
uses: trunk-io/trunk-action/upgrade@v1
with:
base: master
================================================
FILE: .github/workflows/package_obs.yml
================================================
name: Package for OpenSUSE Build Service
on:
workflow_call:
secrets:
OBS_PASSWORD:
required: true
PPA_GPG_PRIVATE_KEY:
required: true
inputs:
obs_project:
description: Meshtastic OBS project to target
required: true
type: string
series:
description: Debian series to target
required: true
type: string
permissions:
contents: write
packages: write
jobs:
build-debian-src:
uses: ./.github/workflows/build_debian_src.yml
secrets: inherit
with:
series: ${{ inputs.series }}
build_location: obs
package-obs:
runs-on: ubuntu-24.04
needs: build-debian-src
steps:
- name: Checkout code
uses: actions/checkout@v6
with:
submodules: recursive
path: meshtasticd
ref: ${{github.event.pull_request.head.ref}}
repository: ${{github.event.pull_request.head.repo.full_name}}
- name: Install OpenSUSE Build Service deps
shell: bash
run: |
echo 'deb http://download.opensuse.org/repositories/openSUSE:/Tools/xUbuntu_24.04/ /' | sudo tee /etc/apt/sources.list.d/openSUSE:Tools.list
curl -fsSL https://download.opensuse.org/repositories/openSUSE:Tools/xUbuntu_24.04/Release.key | gpg --dearmor | sudo tee /etc/apt/trusted.gpg.d/openSUSE_Tools.gpg > /dev/null
sudo apt-get update -y --fix-missing
sudo apt-get install -y osc
- name: Get release version string
working-directory: meshtasticd
run: |
echo "deb=$(./bin/buildinfo.py deb)" >> $GITHUB_OUTPUT
env:
BUILD_LOCATION: obs
id: version
- name: Download artifacts
uses: actions/download-artifact@v8
with:
name: firmware-debian-${{ steps.version.outputs.deb }}~${{ inputs.series }}-src
merge-multiple: true
- name: Display structure of downloaded files
run: ls -lah
- name: Configure osc
env:
OBS_USERNAME: meshtastic
run: |
# Setup OpenSUSE Build Service credentials
mkdir -p ~/.config/osc
echo "[general]" > ~/.config/osc/oscrc
echo "apiurl=https://api.opensuse.org" >> ~/.config/osc/oscrc
echo "[https://api.opensuse.org]" >> ~/.config/osc/oscrc
echo "user=${{ env.OBS_USERNAME }}" >> ~/.config/osc/oscrc
echo "pass=${{ secrets.OBS_PASSWORD }}" >> ~/.config/osc/oscrc
echo "credentials_mgr_class=osc.credentials.PlaintextConfigFileCredentialsManager" >> ~/.config/osc/oscrc
# Create a temporary directory for osc checkout
mkdir -p osc
# Intentionally fail if credentials are invalid
# Update secrets if this returns `401`
- name: Verify OBS authentication
run: osc token
- name: Upload package to OBS
shell: bash
working-directory: osc
env:
OBS_PROJECT: ${{ inputs.obs_project }}
OBS_PACKAGE: meshtasticd
run: |
# Initialize the package in the current directory
osc checkout --output-dir . $OBS_PROJECT $OBS_PACKAGE
# Remove the existing package files
rm -rf *.dsc *.tar.xz
# Copy new package files to the directory
cp $GITHUB_WORKSPACE/*.dsc .
cp $GITHUB_WORKSPACE/*.tar.xz .
# Add/Remove the files
osc addremove
# Commit changes and push to OpenSUSE Build Service
osc commit -m "GitHub Actions: ${{ steps.version.outputs.deb }}~${{ inputs.series }}"
================================================
FILE: .github/workflows/package_pio_deps.yml
================================================
name: Package PlatformIO Library Dependencies
# trunk-ignore-all(checkov/CKV_GHA_7): Allow workflow_dispatch inputs for testing
on:
workflow_call:
inputs:
pio_env:
description: PlatformIO environment to target
required: true
type: string
workflow_dispatch:
inputs:
pio_env:
description: PlatformIO environment to target
required: true
type: string
permissions:
contents: write
packages: write
jobs:
pkg-pio-libdeps:
runs-on: ubuntu-24.04
steps:
- name: Checkout code
uses: actions/checkout@v6
with:
submodules: recursive
ref: ${{github.event.pull_request.head.ref}}
repository: ${{github.event.pull_request.head.repo.full_name}}
- name: Setup Python
uses: actions/setup-python@v6
with:
python-version: 3.x
- name: Install deps
shell: bash
run: |
pip install platformio
- name: Get release version string
run: |
echo "long=$(./bin/buildinfo.py long)" >> $GITHUB_OUTPUT
id: version
- name: Fetch libdeps
shell: bash
run: |-
platformio pkg install -e ${{ inputs.pio_env }}
platformio pkg install -e ${{ inputs.pio_env }} -t platformio/tool-scons@4.40502.0
env:
PLATFORMIO_LIBDEPS_DIR: pio/libdeps
PLATFORMIO_PACKAGES_DIR: pio/packages
PLATFORMIO_CORE_DIR: pio/core
PLATFORMIO_SETTING_ENABLE_TELEMETRY: 0
PLATFORMIO_SETTING_CHECK_PLATFORMIO_INTERVAL: 3650
PLATFORMIO_SETTING_CHECK_PRUNE_SYSTEM_THRESHOLD: 10240
- name: Mangle platformio cache
# Add "1" to epoch-timestamps of all downloads in the cache.
# This is a hack to prevent internet access at build-time.
run: |
cp pio/core/.cache/downloads/usage.db pio/core/.cache/downloads/usage.db.bak
jq -c 'with_entries(.value |= (. | tostring + "1" | tonumber))' pio/core/.cache/downloads/usage.db.bak > pio/core/.cache/downloads/usage.db
- name: Store binaries as an artifact
uses: actions/upload-artifact@v7
with:
name: platformio-deps-${{ inputs.pio_env }}-${{ steps.version.outputs.long }}
overwrite: true
include-hidden-files: true
path: |
pio/*
================================================
FILE: .github/workflows/package_ppa.yml
================================================
name: Package for Launchpad PPA
on:
workflow_call:
secrets:
PPA_GPG_PRIVATE_KEY:
required: true
inputs:
ppa_repo:
description: Meshtastic PPA to target
required: true
type: string
series:
description: Ubuntu series to target
required: true
type: string
permissions:
contents: write
packages: write
jobs:
build-debian-src:
uses: ./.github/workflows/build_debian_src.yml
secrets: inherit
with:
series: ${{ inputs.series }}
build_location: ppa
package-ppa:
runs-on: ubuntu-24.04
needs: build-debian-src
steps:
- name: Checkout code
uses: actions/checkout@v6
with:
submodules: recursive
path: meshtasticd
ref: ${{github.event.pull_request.head.ref}}
repository: ${{github.event.pull_request.head.repo.full_name}}
- name: Install deps
shell: bash
run: |
sudo apt-get update -y --fix-missing
sudo apt-get install -y dput
- name: Import GPG key
uses: crazy-max/ghaction-import-gpg@v7
with:
gpg_private_key: ${{ secrets.PPA_GPG_PRIVATE_KEY }}
id: gpg
- name: Get release version string
working-directory: meshtasticd
run: |
echo "deb=$(./bin/buildinfo.py deb)" >> $GITHUB_OUTPUT
env:
BUILD_LOCATION: ppa
id: version
- name: Download artifacts
uses: actions/download-artifact@v8
with:
name: firmware-debian-${{ steps.version.outputs.deb }}~${{ inputs.series }}-src
merge-multiple: true
- name: Display structure of downloaded files
run: ls -lah
- name: Publish with dput
if: ${{ github.event_name != 'pull_request_target' && github.event_name != 'pull_request' }}
run: |
dput ${{ inputs.ppa_repo }} meshtasticd_${{ steps.version.outputs.deb }}~${{ inputs.series }}_source.changes
================================================
FILE: .github/workflows/pr_enforce_labels.yml
================================================
name: Check PR Labels
on:
pull_request:
types: [opened, edited, labeled, unlabeled, synchronize, reopened]
permissions:
pull-requests: read
contents: read
jobs:
check-label:
runs-on: ubuntu-latest
steps:
- name: Check for PR labels
uses: actions/github-script@v8
with:
script: |
const labels = context.payload.pull_request.labels.map(label => label.name);
const requiredLabels = ['bugfix', 'enhancement', 'hardware-support', 'dependencies', 'submodules', 'github_actions', 'trunk', 'cleanup'];
const hasRequiredLabel = labels.some(label => requiredLabels.includes(label));
if (!hasRequiredLabel) {
core.setFailed(`PR must have at least one of the following labels before it can be merged: ${requiredLabels.join(', ')}.`);
}
================================================
FILE: .github/workflows/pr_tests.yml
================================================
name: Tests
# DISABLED: Changed from automatic PR triggers to manual only
on:
workflow_dispatch:
inputs:
reason:
description: "Reason for manual test run"
required: false
default: "Manual test execution"
concurrency:
group: tests-${{ github.head_ref || github.run_id }}
cancel-in-progress: true
permissions:
contents: read
actions: read
checks: write
pull-requests: write
jobs:
native-tests:
name: "🧪 Native Tests"
if: github.repository == 'meshtastic/firmware'
uses: ./.github/workflows/test_native.yml
permissions:
contents: read
actions: read
checks: write
test-summary:
name: "📊 Test Results"
runs-on: ubuntu-latest
needs: [native-tests]
if: always()
permissions:
contents: read
actions: read
checks: write
pull-requests: write
steps:
- uses: actions/checkout@v6
with:
submodules: recursive
- name: Get release version string
run: echo "long=$(./bin/buildinfo.py long)" >> $GITHUB_OUTPUT
id: version
- name: Download test artifacts
if: needs.native-tests.result != 'skipped'
uses: actions/download-artifact@v8
with:
name: platformio-test-report-${{ steps.version.outputs.long }}
merge-multiple: true
- name: Parse test results and create detailed summary
id: test-results
run: |
echo "## 🧪 Test Results Summary" >> $GITHUB_STEP_SUMMARY
echo "" >> $GITHUB_STEP_SUMMARY
# Check overall job status first
if [[ "${{ needs.native-tests.result }}" == "success" ]]; then
echo "✅ **Overall Status**: PASSED" >> $GITHUB_STEP_SUMMARY
elif [[ "${{ needs.native-tests.result }}" == "failure" ]]; then
echo "❌ **Overall Status**: FAILED" >> $GITHUB_STEP_SUMMARY
elif [[ "${{ needs.native-tests.result }}" == "cancelled" ]]; then
echo "⏸️ **Overall Status**: CANCELLED" >> $GITHUB_STEP_SUMMARY
echo "" >> $GITHUB_STEP_SUMMARY
echo "Tests were cancelled before completion." >> $GITHUB_STEP_SUMMARY
exit 0
else
echo "⚠️ **Overall Status**: SKIPPED" >> $GITHUB_STEP_SUMMARY
echo "" >> $GITHUB_STEP_SUMMARY
echo "Tests were skipped." >> $GITHUB_STEP_SUMMARY
exit 0
fi
echo "" >> $GITHUB_STEP_SUMMARY
# Parse detailed test results if available
if [ -f "testreport.xml" ]; then
echo "### 🔍 Individual Test Results" >> $GITHUB_STEP_SUMMARY
echo "" >> $GITHUB_STEP_SUMMARY
python3 << 'EOF'
import xml.etree.ElementTree as ET
import os
try:
tree = ET.parse('testreport.xml')
root = tree.getroot()
total_tests = 0
passed_tests = 0
failed_tests = 0
skipped_tests = 0
# Parse testsuite elements
for testsuite in root.findall('.//testsuite'):
suite_name = testsuite.get('name', 'Unknown')
suite_tests = int(testsuite.get('tests', '0'))
suite_failures = int(testsuite.get('failures', '0'))
suite_errors = int(testsuite.get('errors', '0'))
suite_skipped = int(testsuite.get('skipped', '0'))
total_tests += suite_tests
failed_tests += suite_failures + suite_errors
skipped_tests += suite_skipped
passed_tests += suite_tests - suite_failures - suite_errors - suite_skipped
if suite_tests > 0:
status = "✅" if (suite_failures + suite_errors) == 0 else "❌"
print(f"**{status} Test Suite: {suite_name}**")
print(f"- Total: {suite_tests}")
print(f"- Passed: ✅ {suite_tests - suite_failures - suite_errors - suite_skipped}")
print(f"- Failed: ❌ {suite_failures + suite_errors}")
if suite_skipped > 0:
print(f"- Skipped: ⏭️ {suite_skipped}")
print("")
# Show individual test results for failed suites
if suite_failures + suite_errors > 0:
print("**Failed Tests:**")
for testcase in testsuite.findall('testcase'):
test_name = testcase.get('name', 'Unknown')
failure = testcase.find('failure')
error = testcase.find('error')
if failure is not None:
msg = failure.get('message', 'Unknown error')[:100]
print(f"- ❌ `{test_name}`: {msg}")
elif error is not None:
msg = error.get('message', 'Unknown error')[:100]
print(f"- ❌ `{test_name}`: ERROR - {msg}")
print("")
else:
# Show passed tests for successful suites
passed_count = 0
for testcase in testsuite.findall('testcase'):
if testcase.find('failure') is None and testcase.find('error') is None:
if passed_count < 5: # Limit to first 5 to avoid spam
test_name = testcase.get('name', 'Unknown')
print(f"- ✅ `{test_name}`: PASSED")
passed_count += 1
if passed_count > 5:
print(f"- ... and {passed_count - 5} more tests passed")
print("")
# Summary statistics
print("### 📊 Test Statistics")
print(f"- **Total Tests**: {total_tests}")
print(f"- **Passed**: ✅ {passed_tests}")
print(f"- **Failed**: ❌ {failed_tests}")
if skipped_tests > 0:
print(f"- **Skipped**: ⏭️ {skipped_tests}")
if failed_tests > 0:
print(f"\n❌ **{failed_tests} tests failed out of {total_tests} total**")
else:
print(f"\n✅ **All {total_tests} tests passed!**")
except Exception as e:
print(f"❌ Error parsing test results: {e}")
EOF
else
echo "⚠️ **No detailed test report available**" >> $GITHUB_STEP_SUMMARY
echo "" >> $GITHUB_STEP_SUMMARY
echo "Test artifacts may not have been generated properly." >> $GITHUB_STEP_SUMMARY
fi
echo "" >> $GITHUB_STEP_SUMMARY
echo "---" >> $GITHUB_STEP_SUMMARY
echo "View detailed logs in the [Actions tab](${{ github.server_url }}/${{ github.repository }}/actions/runs/${{ github.run_id }})" >> $GITHUB_STEP_SUMMARY
- name: Comment test results on PR
if: github.event_name == 'pull_request' && needs.native-tests.result != 'skipped'
uses: actions/github-script@v8
with:
script: |
const fs = require('fs');
// Read the step summary to use as PR comment
let testSummary = "## 🧪 Test Results Summary\n\n";
if ("${{ needs.native-tests.result }}" === "success") {
testSummary += "✅ **All tests passed!**\n\n";
} else if ("${{ needs.native-tests.result }}" === "failure") {
testSummary += "❌ **Some tests failed.**\n\n";
} else {
testSummary += "⚠️ **Tests did not complete normally.**\n\n";
}
testSummary += `View detailed results: [Actions Run](${context.payload.repository.html_url}/actions/runs/${context.runId})\n\n`;
testSummary += "---\n";
testSummary += "*This comment will be automatically updated when new commits are pushed.*";
// Find existing comment
const comments = await github.rest.issues.listComments({
owner: context.repo.owner,
repo: context.repo.repo,
issue_number: context.issue.number
});
const botComment = comments.data.find(comment =>
comment.user.type === 'Bot' &&
comment.body.includes('🧪 Test Results Summary')
);
if (botComment) {
// Update existing comment
await github.rest.issues.updateComment({
owner: context.repo.owner,
repo: context.repo.repo,
comment_id: botComment.id,
body: testSummary
});
} else {
// Create new comment
await github.rest.issues.createComment({
owner: context.repo.owner,
repo: context.repo.repo,
issue_number: context.issue.number,
body: testSummary
});
}
- name: Set overall status
run: |
if [[ "${{ needs.native-tests.result }}" == "success" ]]; then
echo "All tests passed! ✅"
exit 0
else
echo "Some tests failed! ❌"
exit 1
fi
================================================
FILE: .github/workflows/release_channels.yml
================================================
name: Trigger release workflows upon Publish
on:
release:
types: [published, released]
permissions:
contents: write
packages: write
jobs:
build-docker:
uses: ./.github/workflows/docker_manifest.yml
with:
release_channel: |-
${{ contains(github.event.release.name, 'Beta') && 'beta' || contains(github.event.release.name, 'Alpha') && 'alpha' }}
secrets: inherit
package-ppa:
strategy:
fail-fast: false
matrix:
series:
- jammy # 22.04 LTS
- noble # 24.04 LTS
- questing # 25.10
- resolute # 26.04 LTS
uses: ./.github/workflows/package_ppa.yml
with:
ppa_repo: |-
ppa:meshtastic/${{ contains(github.event.release.name, 'Beta') && 'beta' || contains(github.event.release.name, 'Alpha') && 'alpha' }}
series: ${{ matrix.series }}
secrets: inherit
package-obs:
uses: ./.github/workflows/package_obs.yml
with:
obs_project: |-
network:Meshtastic:${{ contains(github.event.release.name, 'Beta') && 'beta' || contains(github.event.release.name, 'Alpha') && 'alpha' }}
series: |-
${{ contains(github.event.release.name, 'Beta') && 'beta' || contains(github.event.release.name, 'Alpha') && 'alpha' }}
secrets: inherit
hook-copr:
uses: ./.github/workflows/hook_copr.yml
with:
copr_project: |-
${{ contains(github.event.release.name, 'Beta') && 'beta' || contains(github.event.release.name, 'Alpha') && 'alpha' }}
secrets: inherit
publish-release-notes:
if: github.event.action == 'published'
runs-on: ubuntu-latest
steps:
- name: Get release version
id: version
run: |
# Extract version from tag (e.g., v2.7.15.567b8ea -> 2.7.15.567b8ea)
VERSION=${GITHUB_REF#refs/tags/v}
echo "version=$VERSION" >> $GITHUB_OUTPUT
- name: Get release notes
run: |
mkdir -p ./publish
gh release view ${{ github.event.release.tag_name }} --json body --jq '.body' > ./publish/release_notes.md
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
- name: Publish release notes to meshtastic.github.io
uses: peaceiris/actions-gh-pages@v4
with:
deploy_key: ${{ secrets.DIST_PAGES_DEPLOY_KEY }}
external_repository: meshtastic/meshtastic.github.io
publish_branch: master
publish_dir: ./publish
destination_dir: firmware-${{ steps.version.outputs.version }}
user_name: github-actions[bot]
user_email: github-actions[bot]@users.noreply.github.com
commit_message: Release notes for ${{ steps.version.outputs.version }}
enable_jekyll: true
# Create a PR to bump version when a release is Published
bump-version:
if: github.event.action == 'published'
runs-on: ubuntu-latest
permissions:
pull-requests: write
contents: write
defaults:
run:
shell: bash
steps:
- name: Checkout
uses: actions/checkout@v6
with:
# Always use master branch for version bumps
ref: master
- name: Setup Python
uses: actions/setup-python@v6
with:
python-version: 3.x
- name: Bump version.properties
run: |
# Bump version.properties
chmod +x ./bin/bump_version.py
./bin/bump_version.py
- name: Get new release version string
run: |
echo "short=$(./bin/buildinfo.py short)" >> $GITHUB_OUTPUT
id: new_version
- name: Ensure debian deps are installed
run: |
sudo apt-get update -y --fix-missing
sudo apt-get install -y devscripts
- name: Update debian changelog
run: |
# Update debian changelog
chmod +x ./debian/ci_changelog.sh
./debian/ci_changelog.sh
- name: Bump org.meshtastic.meshtasticd.metainfo.xml
run: |
# Bump org.meshtastic.meshtasticd.metainfo.xml
pip install -r bin/bump_metainfo/requirements.txt -q
chmod +x ./bin/bump_metainfo/bump_metainfo.py
./bin/bump_metainfo/bump_metainfo.py --file bin/org.meshtastic.meshtasticd.metainfo.xml "${{ steps.new_version.outputs.short }}"
env:
PIP_DISABLE_PIP_VERSION_CHECK: 1
- name: Create Bumps pull request
uses: peter-evans/create-pull-request@v8
with:
base: ${{ github.event.repository.default_branch }}
branch: create-pull-request/bump-version
labels: github_actions
title: Bump release version
commit-message: Automated version bumps
add-paths: |
version.properties
debian/changelog
bin/org.meshtastic.meshtasticd.metainfo.xml
================================================
FILE: .github/workflows/sec_sast_semgrep_cron.yml
================================================
---
name: Semgrep Full Scan
on:
workflow_dispatch:
schedule:
- cron: 0 1 * * 6
permissions:
actions: read
contents: read
security-events: write
jobs:
semgrep-full:
if: github.repository == 'meshtastic/firmware'
runs-on: ubuntu-24.04
container:
image: semgrep/semgrep
steps:
# step 1
- name: clone application source code
uses: actions/checkout@v6
# step 2
- name: full scan
run: |
semgrep \
--sarif --output report.sarif \
--metrics=off \
--config="p/default"
# step 3
- name: save report as pipeline artifact
uses: actions/upload-artifact@v7
with:
name: report.sarif
overwrite: true
path: report.sarif
# step 4
- name: publish code scanning alerts
uses: github/codeql-action/upload-sarif@v4
with:
sarif_file: report.sarif
category: semgrep
================================================
FILE: .github/workflows/sec_sast_semgrep_pull.yml
================================================
---
name: Semgrep Differential Scan
on: pull_request
permissions: read-all
jobs:
semgrep-diff:
runs-on: ubuntu-24.04
container:
image: semgrep/semgrep
steps:
# step 1
- name: clone application source code
uses: actions/checkout@v6
with:
fetch-depth: 0
# step 2
- name: differential scan
run: |
semgrep scan \
--error \
--metrics=off \
--baseline-commit ${{ github.event.pull_request.base.sha }} \
--config="p/default"
================================================
FILE: .github/workflows/stale_bot.yml
================================================
name: process stale Issues and PR's
on:
schedule:
- cron: 0 6 * * *
workflow_dispatch: {}
permissions:
issues: write
pull-requests: write
actions: write
jobs:
stale_issues:
if: github.repository == 'meshtastic/firmware'
name: Close Stale Issues
runs-on: ubuntu-latest
steps:
- name: Stale PR+Issues
uses: actions/stale@v10.2.0
with:
days-before-stale: 45
stale-issue-message: This issue has not had any comment or update in the last month. If it is still relevant, please post update comments. If no comments are made, this issue will be closed automagically in 7 days.
close-issue-message: This issue has not had any comment since the last notice. It has been closed automatically. If this is incorrect, or the issue becomes relevant again, please request that it is reopened.
exempt-issue-labels: pinned,3.0,triaged,backlog
exempt-pr-labels: pinned,3.0,triaged,backlog
================================================
FILE: .github/workflows/test_native.yml
================================================
name: Run Tests on Native platform
on:
workflow_call:
workflow_dispatch:
permissions: {}
env:
LCOV_CAPTURE_FLAGS: --quiet --capture --include "${PWD}/src/*" --exclude '*/src/mesh/generated/*' --directory .pio/build/coverage/src --base-directory "${PWD}"
jobs:
simulator-tests:
name: Native Simulator Tests
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v6
with:
ref: ${{github.event.pull_request.head.ref}}
repository: ${{github.event.pull_request.head.repo.full_name}}
submodules: recursive
- name: Setup native build
id: base
uses: ./.github/actions/setup-native
- name: Install simulator dependencies
run: pip install -U dotmap
# We now run integration test before other build steps (to quickly see runtime failures)
- name: Build for native/coverage
run: platformio run -e coverage
- name: Capture initial coverage information
shell: bash
run: |
sudo apt-get install -y lcov
lcov ${{ env.LCOV_CAPTURE_FLAGS }} --initial --output-file coverage_base.info
sed -i -e "s#${PWD}#.#" coverage_base.info # Make paths relative.
- name: Integration test
run: |
.pio/build/coverage/meshtasticd -s &
PID=$!
timeout 20 bash -c "until ls -al /proc/$PID/fd | grep socket; do sleep 1; done"
echo "Simulator started, launching python test..."
python3 -c 'from meshtastic.test import testSimulator; testSimulator()'
wait
- name: Capture coverage information
if: always() # run this step even if previous step failed
run: |
lcov ${{ env.LCOV_CAPTURE_FLAGS }} --test-name integration --output-file coverage_integration.info
sed -i -e "s#${PWD}#.#" coverage_integration.info # Make paths relative.
- name: Get release version string
if: always() # run this step even if previous step failed
run: echo "long=$(./bin/buildinfo.py long)" >> $GITHUB_OUTPUT
id: version
- name: Save coverage information
uses: actions/upload-artifact@v7
if: always() # run this step even if previous step failed
with:
name: lcov-coverage-info-native-simulator-test-${{ steps.version.outputs.long }}
overwrite: true
path: ./coverage_*.info
platformio-tests:
name: Native PlatformIO Tests
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v6
with:
ref: ${{github.event.pull_request.head.ref}}
repository: ${{github.event.pull_request.head.repo.full_name}}
submodules: recursive
- name: Setup native build
id: base
uses: ./.github/actions/setup-native
- name: Get release version string
run: echo "long=$(./bin/buildinfo.py long)" >> $GITHUB_OUTPUT
id: version
# Disable (comment-out) BUILD_EPOCH. It causes a full rebuild between tests and resets the
# coverage information each time.
- name: Disable BUILD_EPOCH
run: sed -i 's/-DBUILD_EPOCH=$UNIX_TIME/#-DBUILD_EPOCH=$UNIX_TIME/' platformio.ini
- name: PlatformIO Tests
run: platformio test -e coverage -v --junit-output-path testreport.xml
- name: Save test results
if: always() # run this step even if previous step failed
uses: actions/upload-artifact@v7
with:
name: platformio-test-report-${{ steps.version.outputs.long }}
overwrite: true
path: ./testreport.xml
- name: Capture coverage information
if: always() # run this step even if previous step failed
run: |
sudo apt-get install -y lcov
lcov ${{ env.LCOV_CAPTURE_FLAGS }} --test-name tests --output-file coverage_tests.info
sed -i -e "s#${PWD}#.#" coverage_tests.info # Make paths relative.
- name: Save coverage information
uses: actions/upload-artifact@v7
if: always() # run this step even if previous step failed
with:
name: lcov-coverage-info-native-platformio-tests-${{ steps.version.outputs.long }}
overwrite: true
path: ./coverage_*.info
generate-reports:
name: Generate Test Reports
runs-on: ubuntu-latest
permissions: # Needed for dorny/test-reporter.
contents: read
actions: read
checks: write
needs:
- simulator-tests
- platformio-tests
if: always()
steps:
- uses: actions/checkout@v6
with:
ref: ${{github.event.pull_request.head.ref}}
repository: ${{github.event.pull_request.head.repo.full_name}}
- name: Get release version string
run: echo "long=$(./bin/buildinfo.py long)" >> $GITHUB_OUTPUT
id: version
- name: Download test artifacts
uses: actions/download-artifact@v8
with:
name: platformio-test-report-${{ steps.version.outputs.long }}
merge-multiple: true
- name: Test Report
uses: dorny/test-reporter@v2.6.0
with:
name: PlatformIO Tests
path: testreport.xml
reporter: java-junit
- name: Download coverage artifacts
uses: actions/download-artifact@v8
with:
pattern: lcov-coverage-info-native-*-${{ steps.version.outputs.long }}
path: code-coverage-report
merge-multiple: true
- name: Generate Code Coverage Report
run: |
sudo apt-get install -y lcov
lcov --quiet --add-tracefile code-coverage-report/coverage_base.info --add-tracefile code-coverage-report/coverage_integration.info --add-tracefile code-coverage-report/coverage_tests.info --output-file code-coverage-report/coverage_src.info
genhtml --quiet --legend --prefix "${PWD}" code-coverage-report/coverage_src.info --output-directory code-coverage-report
- name: Save Code Coverage Report
uses: actions/upload-artifact@v7
with:
name: code-coverage-report-${{ steps.version.outputs.long }}
path: code-coverage-report
================================================
FILE: .github/workflows/tests.yml
================================================
name: End to end tests
on:
schedule:
- cron: 0 0 * * * # Run every day at midnight
workflow_dispatch: {}
permissions:
contents: read
actions: read
checks: write
jobs:
native-tests:
if: github.repository == 'meshtastic/firmware'
uses: ./.github/workflows/test_native.yml
hardware-tests:
if: github.repository == 'meshtastic/firmware'
runs-on: test-runner
steps:
- name: Checkout code
uses: actions/checkout@v6
# - uses: actions/setup-python@v6
# with:
# python-version: '3.10'
# pipx install "setuptools<72"
- name: Upgrade python tools
shell: bash
run: |
pipx install adafruit-nrfutil
pipx install poetry
pipx install meshtastic --pip-args=--pre
- name: Install PlatformIO from script
shell: bash
run: |
curl -fsSL -o get-platformio.py https://raw.githubusercontent.com/platformio/platformio-core-installer/master/get-platformio.py
python3 get-platformio.py
- name: Upgrade platformio
shell: bash
run: |
export PATH=$PATH:$HOME/.local/bin
pio upgrade
- name: Setup Node
uses: actions/setup-node@v6
with:
node-version: 24
- name: Setup pnpm
uses: pnpm/action-setup@v5
with:
version: latest
- name: Install dependencies, setup devices and run
shell: bash
run: |
git submodule update --init --recursive
cd meshtestic/
pnpm install
pnpm run setup
pnpm run test
================================================
FILE: .github/workflows/trunk_annotate_pr.yml
================================================
name: Annotate PR with trunk issues
# See: https://github.com/trunk-io/trunk-action/blob/v1/readme.md#getting-inline-annotations-for-fork-prs
on:
workflow_run:
workflows: [Pull Request] # Name from `trunk_check.yml`
types: [completed]
permissions: read-all
jobs:
trunk_check:
name: Trunk Code Quality Annotate
runs-on: ubuntu-24.04
permissions:
checks: write # For trunk to post annotations
contents: read # For repo checkout
steps:
- name: Checkout
uses: actions/checkout@v6
- name: Trunk Check
uses: trunk-io/trunk-action@v1
with:
post-annotations: true
================================================
FILE: .github/workflows/trunk_check.yml
================================================
name: Pull Request
on: [pull_request]
concurrency:
group: ${{ github.head_ref || github.run_id }}
cancel-in-progress: true
permissions: read-all
jobs:
trunk_check:
name: Trunk Check Runner
runs-on: ubuntu-24.04
permissions:
checks: write # For trunk to post annotations
contents: read # For repo checkout
steps:
- name: Checkout
uses: actions/checkout@v6
- name: Trunk Check
uses: trunk-io/trunk-action@v1
with:
save-annotations: true
================================================
FILE: .github/workflows/update_protobufs.yml
================================================
name: Update protobufs and regenerate classes
on: workflow_dispatch
permissions: read-all
jobs:
update-protobufs:
runs-on: ubuntu-latest
permissions:
contents: write
pull-requests: write
steps:
- name: Checkout code
uses: actions/checkout@v6
with:
submodules: true
- name: Update submodule
if: ${{ github.ref == 'refs/heads/master' || github.ref == 'refs/heads/develop' }}
run: |
git submodule update --remote protobufs
- name: Download nanopb
run: |
wget https://jpa.kapsi.fi/nanopb/download/nanopb-0.4.9.1-linux-x86.tar.gz
tar xvzf nanopb-0.4.9.1-linux-x86.tar.gz
mv nanopb-0.4.9.1-linux-x86 nanopb-0.4.9
- name: Re-generate protocol buffers
run: |
./bin/regen-protos.sh
- name: Create pull request
uses: peter-evans/create-pull-request@v8
with:
branch: create-pull-request/update-protobufs
labels: submodules
title: Update protobufs and classes
commit-message: Update protobufs
add-paths: |
protobufs
src/mesh
================================================
FILE: .gitignore
================================================
.pio
pio
pio.tar
web
web.tar
# ignore vscode IDE settings files
.vscode/*
!.vscode/settings.json
!.vscode/tasks.json
!.vscode/extensions.json
*.code-workspace
.idea
.platformio
.local
.cache
.DS_Store
Thumbs.db
.autotools
.built
.context
.cproject
.vagrant
nanopb*
flash.uf2
cmake-build*
__pycache__
*.swp
*.swo
*~
venv/
.venv/
release/
.vscode/extensions.json
/compile_commands.json
src/mesh/raspihttp/certificate.pem
src/mesh/raspihttp/private_key.pem
# Ignore logo (set at build time with platformio-custom.py)
data/boot/logo.*
# pioarduino platform
managed_components/*
arduino-lib-builder*
dependencies.lock
idf_component.yml
CMakeLists.txt
/sdkconfig.*
.dummy/*
# PYTHONPATH used by the Nix shell
.python3
================================================
FILE: .gitmodules
================================================
[submodule "protobufs"]
path = protobufs
url = https://github.com/meshtastic/protobufs.git
[submodule "meshtestic"]
path = meshtestic
url = https://github.com/meshtastic/meshTestic
================================================
FILE: .gitpod.yml
================================================
tasks:
- init: pip install platformio && pip install --upgrade pip
================================================
FILE: .semgrepignore
================================================
.github/workflows/main_matrix.yml
src/mesh/compression/unishox2.cpp
================================================
FILE: .trunk/.gitignore
================================================
*out
*logs
*actions
*notifications
*tools
plugins
user_trunk.yaml
user.yaml
tmp
================================================
FILE: .trunk/configs/.bandit
================================================
[bandit]
skips = B101
================================================
FILE: .trunk/configs/.clang-format
================================================
Language: Cpp
IndentWidth: 4
ColumnLimit: 130
PointerAlignment: Right
BreakBeforeBraces: Linux
AllowShortFunctionsOnASingleLine: Inline
================================================
FILE: .trunk/configs/.flake8
================================================
# Autoformatter friendly flake8 config (all formatting rules disabled)
[flake8]
extend-ignore = D1, D2, E1, E2, E3, E501, W1, W2, W3, W5
================================================
FILE: .trunk/configs/.hadolint.yaml
================================================
# Following source doesn't work in most setups
ignored:
- SC1090
- SC1091
================================================
FILE: .trunk/configs/.isort.cfg
================================================
[settings]
profile=black
================================================
FILE: .trunk/configs/.markdownlint.yaml
================================================
# Autoformatter friendly markdownlint config (all formatting rules disabled)
default: true
blank_lines: false
bullet: false
html: false
indentation: false
line_length: false
spaces: false
url: false
whitespace: false
headings: false
================================================
FILE: .trunk/configs/.prettierignore
================================================
renovate.json
================================================
FILE: .trunk/configs/.prettierrc
================================================
{
"overrides": [
{
"files": "userPrefs.jsonc",
"options": {
"trailingComma": "none"
}
}
]
}
================================================
FILE: .trunk/configs/.shellcheckrc
================================================
enable=all
source-path=SCRIPTDIR
disable=SC2154
disable=SC2248
disable=SC2250
# If you're having issues with shellcheck following source, disable the errors via:
# disable=SC1090
# disable=SC1091
#
================================================
FILE: .trunk/configs/.yamllint.yaml
================================================
rules:
quoted-strings:
required: only-when-needed
extra-allowed: ["{|}"]
empty-values:
forbid-in-block-mappings: false
forbid-in-flow-mappings: true
key-duplicates: {}
octal-values:
forbid-implicit-octal: true
================================================
FILE: .trunk/configs/ruff.toml
================================================
# Generic, formatter-friendly config.
select = ["B", "D3", "D4", "E", "F"]
# Never enforce `E501` (line length violations). This should be handled by formatters.
ignore = ["E501"]
================================================
FILE: .trunk/configs/svgo.config.js
================================================
module.exports = {
plugins: [
{
name: "preset-default",
params: {
overrides: {
removeViewBox: false, // https://github.com/svg/svgo/issues/1128
sortAttrs: true,
removeOffCanvasPaths: true,
},
},
},
],
};
================================================
FILE: .trunk/trunk.yaml
================================================
version: 0.1
cli:
version: 1.25.0
plugins:
sources:
- id: trunk
ref: v1.7.6
uri: https://github.com/trunk-io/plugins
lint:
enabled:
- checkov@3.2.510
- renovate@43.78.0
- prettier@3.8.1
- trufflehog@3.93.8
- yamllint@1.38.0
- bandit@1.9.4
- trivy@0.69.3
- taplo@0.10.0
- ruff@0.15.6
- isort@8.0.1
- markdownlint@0.48.0
- oxipng@10.1.0
- svgo@4.0.1
- actionlint@1.7.11
- flake8@7.3.0
- hadolint@2.14.0
- shfmt@3.6.0
- shellcheck@0.11.0
- black@26.3.1
- git-diff-check
- gitleaks@8.30.0
- clang-format@16.0.3
ignore:
- linters: [ALL]
paths:
- bin/**
runtimes:
enabled:
- python@3.10.8
- go@1.21.0
- node@22.16.0
actions:
disabled:
- trunk-announce
enabled:
- trunk-fmt-pre-commit
- trunk-check-pre-push
- trunk-upgrade-available
================================================
FILE: .vscode/settings.json
================================================
{
"editor.formatOnSave": true,
"editor.defaultFormatter": "trunk.io",
"trunk.enableWindows": true,
"files.insertFinalNewline": false,
"files.trimFinalNewlines": false,
"cmake.configureOnOpen": false,
"[cpp]": {
"editor.defaultFormatter": "trunk.io"
},
"[powershell]": {
"editor.defaultFormatter": "ms-vscode.powershell"
}
}
================================================
FILE: .vscode/tasks.json
================================================
{
"version": "2.0.0",
"tasks": [
{
"type": "PlatformIO",
"task": "Build",
"problemMatcher": ["$platformio"],
"group": {
"kind": "build",
"isDefault": true
},
"label": "PlatformIO: Build"
}
]
}
================================================
FILE: CODE_OF_CONDUCT.md
================================================
# Contributor Covenant Code of Conduct
The Meshtastic Firmware project is subject to the code of conduct for the parent project, which can be found here:
https://meshtastic.org/docs/legal/conduct/
================================================
FILE: CONTRIBUTING.md
================================================
# Contributing to Meshtastic Firmware
We're excited that you're interested in contributing to the Meshtastic firmware! This document provides a high-level overview of how you can get involved.
## Important First Steps
Before you begin, please:
1. **Read our documentation**: Our [official documentation](https://meshtastic.org/docs/) is a crucial resource. It contains essential information about the project.
2. **Check out the firmware build guide**: For specific instructions on setting up your development environment and building the firmware, refer to our [Firmware Build Guide](https://meshtastic.org/docs/development/firmware/build/).
3. Read our [Code of Conduct](https://meshtastic.org/docs/legal/conduct/)
4. Join our [Discord community](https://discord.com/invite/ktMAKGBnBs) to connect with developers and other contributors to get help.
## Getting Help and Discussing Ideas
We encourage open communication and discussion before diving into code changes:
1. **Use GitHub Discussions**: For new ideas, questions, or to discuss potential changes, start a conversation in our [GitHub Discussions](https://github.com/meshtastic/firmware/discussions) first. This helps us collaborate and avoid duplicate work.
2. **Join our Discord**: For real-time chat and quick questions, join our [Discord server](https://discord.com/invite/ktMAKGBnBs). It's a great place to get help and connect with other developers and the community.
3. **Reporting Issues**: If you've identified a bug, please use our bug report template when creating a new issue in the [issue tracker](https://github.com/meshtastic/firmware/issues). Ensure you've searched existing issues to avoid duplicates.
## Making Contributions
> [!IMPORTANT]
> Before making any contributions, you must sign our Contributor License Agreement (CLA). You can do this by visiting https://cla-assistant.io/meshtastic/firmware. Be sure to use the GitHub account you will use to submit your contributions when signing.
1. Fork the repository
2. Create a new branch for your feature or bug fix
3. Make your changes
4. Test your changes thoroughly
5. Create a pull request with a clear description, using the provided template, of your changes. Be sure to enable "Allow edits from maintainers".
## Coding Standards
To ensure consistent code formatting across the project:
1. Install the [Trunk](https://marketplace.visualstudio.com/items?itemName=Trunk.io) extension for Visual Studio Code.
2. Before submitting your changes, run `trunk fmt` to automatically format your code according to our standards.
Adhering to these formatting guidelines helps maintain code consistency and makes the review process smoother.
Thank you for contributing to Meshtastic!
================================================
FILE: Dockerfile
================================================
# trunk-ignore-all(trivy/DS002): We must run as root for this container
# trunk-ignore-all(hadolint/DL3002): We must run as root for this container
# trunk-ignore-all(hadolint/DL3008): Do not pin apt package versions
# trunk-ignore-all(hadolint/DL3013): Do not pin pip package versions
FROM python:3.14-slim-trixie AS builder
ARG PIO_ENV=native
ENV DEBIAN_FRONTEND=noninteractive
ENV TZ=Etc/UTC
# Install Dependencies
ENV PIP_ROOT_USER_ACTION=ignore
RUN apt-get update && apt-get install --no-install-recommends -y \
curl wget g++ zip git ca-certificates pkg-config \
libgpiod-dev libyaml-cpp-dev libbluetooth-dev libi2c-dev libuv1-dev \
libusb-1.0-0-dev libulfius-dev liborcania-dev libssl-dev \
libx11-dev libinput-dev libxkbcommon-x11-dev libsqlite3-dev libsdl2-dev \
&& apt-get clean && rm -rf /var/lib/apt/lists/* \
&& pip install --no-cache-dir -U platformio \
&& mkdir /tmp/firmware
# Copy source code
WORKDIR /tmp/firmware
COPY . /tmp/firmware
# Build
RUN bash ./bin/build-native.sh "$PIO_ENV" && \
cp "/tmp/firmware/release/meshtasticd_linux_$(uname -m)" "/tmp/firmware/release/meshtasticd"
# Fetch web assets
RUN curl -L "https://github.com/meshtastic/web/releases/download/v$(cat /tmp/firmware/bin/web.version)/build.tar" -o /tmp/web.tar \
&& mkdir -p /tmp/web \
&& tar -xf /tmp/web.tar -C /tmp/web/ \
&& gzip -dr /tmp/web \
&& rm /tmp/web.tar
##### PRODUCTION BUILD #############
FROM debian:trixie-slim
LABEL org.opencontainers.image.title="Meshtastic" \
org.opencontainers.image.description="Debian Meshtastic daemon and web interface" \
org.opencontainers.image.url="https://meshtastic.org" \
org.opencontainers.image.documentation="https://meshtastic.org/docs/" \
org.opencontainers.image.authors="Meshtastic" \
org.opencontainers.image.licenses="GPL-3.0-or-later" \
org.opencontainers.image.source="https://github.com/meshtastic/firmware/"
ENV DEBIAN_FRONTEND=noninteractive
ENV TZ=Etc/UTC
# nosemgrep: dockerfile.security.last-user-is-root.last-user-is-root
USER root
RUN apt-get update && apt-get --no-install-recommends -y install \
libc-bin libc6 libgpiod3 libyaml-cpp0.8 libi2c0 libuv1t64 libusb-1.0-0-dev \
liborcania2.3 libulfius2.7t64 libssl3t64 \
libx11-6 libinput10 libxkbcommon-x11-0 libsdl2-2.0-0 \
&& apt-get clean && rm -rf /var/lib/apt/lists/* \
&& mkdir -p /var/lib/meshtasticd \
&& mkdir -p /etc/meshtasticd/config.d \
&& mkdir -p /etc/meshtasticd/ssl
# Fetch compiled binary from the builder
COPY --from=builder /tmp/firmware/release/meshtasticd /usr/bin/
COPY --from=builder /tmp/web /usr/share/meshtasticd/web/
# Copy config templates
COPY ./bin/config.d /etc/meshtasticd/available.d
WORKDIR /var/lib/meshtasticd
VOLUME /var/lib/meshtasticd
# Expose Meshtastic TCP API port from the host
EXPOSE 4403
# Expose Meshtastic Web UI port from the host
EXPOSE 9443
CMD [ "sh", "-cx", "meshtasticd --fsdir=/var/lib/meshtasticd" ]
HEALTHCHECK NONE
================================================
FILE: Dockerfile.test
================================================
# Lightweight container for running native PlatformIO tests on non-Linux hosts
FROM python:3.14-slim-trixie
ENV DEBIAN_FRONTEND=noninteractive
ENV PIP_ROOT_USER_ACTION=ignore
# hadolint ignore=DL3008
RUN apt-get update && apt-get install --no-install-recommends -y \
g++ git ca-certificates pkg-config \
libgpiod-dev libyaml-cpp-dev libbluetooth-dev libi2c-dev libuv1-dev \
libusb-1.0-0-dev libulfius-dev liborcania-dev libssl-dev \
libx11-dev libinput-dev libxkbcommon-x11-dev libsqlite3-dev libsdl2-dev \
&& apt-get clean && rm -rf /var/lib/apt/lists/* \
&& pip install --no-cache-dir platformio==6.1.19 \
&& useradd --create-home --shell /usr/sbin/nologin meshtastic
WORKDIR /firmware
RUN chown -R meshtastic:meshtastic /firmware
HEALTHCHECK --interval=30s --timeout=5s --start-period=10s --retries=3 \
CMD platformio --version || exit 1
USER meshtastic
# Run tests by default; override with docker run args for specific filters
CMD ["platformio", "test", "-e", "coverage", "-v"]
================================================
FILE: LICENSE
================================================
GNU GENERAL PUBLIC LICENSE
Version 3, 29 June 2007
Copyright (C) 2007 Free Software Foundation, Inc. <http://fsf.org/>
Everyone is permitted to copy and distribute verbatim copies
of this license document, but changing it is not allowed.
Preamble
The GNU General Public License is a free, copyleft license for
software and other kinds of works.
The licenses for most software and other practical works are designed
to take away your freedom to share and change the works. By contrast,
the GNU General Public License is intended to guarantee your freedom to
share and change all versions of a program--to make sure it remains free
software for all its users. We, the Free Software Foundation, use the
GNU General Public License for most of our software; it applies also to
any other work released this way by its authors. You can apply it to
your programs, too.
When we speak of free software, we are referring to freedom, not
price. Our General Public Licenses are designed to make sure that you
have the freedom to distribute copies of free software (and charge for
them if you wish), that you receive source code or can get it if you
want it, that you can change the software or use pieces of it in new
free programs, and that you know you can do these things.
To protect your rights, we need to prevent others from denying you
these rights or asking you to surrender the rights. Therefore, you have
certain responsibilities if you distribute copies of the software, or if
you modify it: responsibilities to respect the freedom of others.
For example, if you distribute copies of such a program, whether
gratis or for a fee, you must pass on to the recipients the same
freedoms that you received. You must make sure that they, too, receive
or can get the source code. And you must show them these terms so they
know their rights.
Developers that use the GNU GPL protect your rights with two steps:
(1) assert copyright on the software, and (2) offer you this License
giving you legal permission to copy, distribute and/or modify it.
For the developers' and authors' protection, the GPL clearly explains
that there is no warranty for this free software. For both users' and
authors' sake, the GPL requires that modified versions be marked as
changed, so that their problems will not be attributed erroneously to
authors of previous versions.
Some devices are designed to deny users access to install or run
modified versions of the software inside them, although the manufacturer
can do so. This is fundamentally incompatible with the aim of
protecting users' freedom to change the software. The systematic
pattern of such abuse occurs in the area of products for individuals to
use, which is precisely where it is most unacceptable. Therefore, we
have designed this version of the GPL to prohibit the practice for those
products. If such problems arise substantially in other domains, we
stand ready to extend this provision to those domains in future versions
of the GPL, as needed to protect the freedom of users.
Finally, every program is threatened constantly by software patents.
States should not allow patents to restrict development and use of
software on general-purpose computers, but in those that do, we wish to
avoid the special danger that patents applied to a free program could
make it effectively proprietary. To prevent this, the GPL assures that
patents cannot be used to render the program non-free.
The precise terms and conditions for copying, distribution and
modification follow.
TERMS AND CONDITIONS
0. Definitions.
"This License" refers to version 3 of the GNU General Public License.
"Copyright" also means copyright-like laws that apply to other kinds of
works, such as semiconductor masks.
"The Program" refers to any copyrightable work licensed under this
License. Each licensee is addressed as "you". "Licensees" and
"recipients" may be individuals or organizations.
To "modify" a work means to copy from or adapt all or part of the work
in a fashion requiring copyright permission, other than the making of an
exact copy. The resulting work is called a "modified version" of the
earlier work or a work "based on" the earlier work.
A "covered work" means either the unmodified Program or a work based
on the Program.
To "propagate" a work means to do anything with it that, without
permission, would make you directly or secondarily liable for
infringement under applicable copyright law, except executing it on a
computer or modifying a private copy. Propagation includes copying,
distribution (with or without modification), making available to the
public, and in some countries other activities as well.
To "convey" a work means any kind of propagation that enables other
parties to make or receive copies. Mere interaction with a user through
a computer network, with no transfer of a copy, is not conveying.
An interactive user interface displays "Appropriate Legal Notices"
to the extent that it includes a convenient and prominently visible
feature that (1) displays an appropriate copyright notice, and (2)
tells the user that there is no warranty for the work (except to the
extent that warranties are provided), that licensees may convey the
work under this License, and how to view a copy of this License. If
the interface presents a list of user commands or options, such as a
menu, a prominent item in the list meets this criterion.
1. Source Code.
The "source code" for a work means the preferred form of the work
for making modifications to it. "Object code" means any non-source
form of a work.
A "Standard Interface" means an interface that either is an official
standard defined by a recognized standards body, or, in the case of
interfaces specified for a particular programming language, one that
is widely used among developers working in that language.
The "System Libraries" of an executable work include anything, other
than the work as a whole, that (a) is included in the normal form of
packaging a Major Component, but which is not part of that Major
Component, and (b) serves only to enable use of the work with that
Major Component, or to implement a Standard Interface for which an
implementation is available to the public in source code form. A
"Major Component", in this context, means a major essential component
(kernel, window system, and so on) of the specific operating system
(if any) on which the executable work runs, or a compiler used to
produce the work, or an object code interpreter used to run it.
The "Corresponding Source" for a work in object code form means all
the source code needed to generate, install, and (for an executable
work) run the object code and to modify the work, including scripts to
control those activities. However, it does not include the work's
System Libraries, or general-purpose tools or generally available free
programs which are used unmodified in performing those activities but
which are not part of the work. For example, Corresponding Source
includes interface definition files associated with source files for
the work, and the source code for shared libraries and dynamically
linked subprograms that the work is specifically designed to require,
such as by intimate data communication or control flow between those
subprograms and other parts of the work.
The Corresponding Source need not include anything that users
can regenerate automatically from other parts of the Corresponding
Source.
The Corresponding Source for a work in source code form is that
same work.
2. Basic Permissions.
All rights granted under this License are granted for the term of
copyright on the Program, and are irrevocable provided the stated
conditions are met. This License explicitly affirms your unlimited
permission to run the unmodified Program. The output from running a
covered work is covered by this License only if the output, given its
content, constitutes a covered work. This License acknowledges your
rights of fair use or other equivalent, as provided by copyright law.
You may make, run and propagate covered works that you do not
convey, without conditions so long as your license otherwise remains
in force. You may convey covered works to others for the sole purpose
of having them make modifications exclusively for you, or provide you
with facilities for running those works, provided that you comply with
the terms of this License in conveying all material for which you do
not control copyright. Those thus making or running the covered works
for you must do so exclusively on your behalf, under your direction
and control, on terms that prohibit them from making any copies of
your copyrighted material outside their relationship with you.
Conveying under any other circumstances is permitted solely under
the conditions stated below. Sublicensing is not allowed; section 10
makes it unnecessary.
3. Protecting Users' Legal Rights From Anti-Circumvention Law.
No covered work shall be deemed part of an effective technological
measure under any applicable law fulfilling obligations under article
11 of the WIPO copyright treaty adopted on 20 December 1996, or
similar laws prohibiting or restricting circumvention of such
measures.
When you convey a covered work, you waive any legal power to forbid
circumvention of technological measures to the extent such circumvention
is effected by exercising rights under this License with respect to
the covered work, and you disclaim any intention to limit operation or
modification of the work as a means of enforcing, against the work's
users, your or third parties' legal rights to forbid circumvention of
technological measures.
4. Conveying Verbatim Copies.
You may convey verbatim copies of the Program's source code as you
receive it, in any medium, provided that you conspicuously and
appropriately publish on each copy an appropriate copyright notice;
keep intact all notices stating that this License and any
non-permissive terms added in accord with section 7 apply to the code;
keep intact all notices of the absence of any warranty; and give all
recipients a copy of this License along with the Program.
You may charge any price or no price for each copy that you convey,
and you may offer support or warranty protection for a fee.
5. Conveying Modified Source Versions.
You may convey a work based on the Program, or the modifications to
produce it from the Program, in the form of source code under the
terms of section 4, provided that you also meet all of these conditions:
a) The work must carry prominent notices stating that you modified
it, and giving a relevant date.
b) The work must carry prominent notices stating that it is
released under this License and any conditions added under section
7. This requirement modifies the requirement in section 4 to
"keep intact all notices".
c) You must license the entire work, as a whole, under this
License to anyone who comes into possession of a copy. This
License will therefore apply, along with any applicable section 7
additional terms, to the whole of the work, and all its parts,
regardless of how they are packaged. This License gives no
permission to license the work in any other way, but it does not
invalidate such permission if you have separately received it.
d) If the work has interactive user interfaces, each must display
Appropriate Legal Notices; however, if the Program has interactive
interfaces that do not display Appropriate Legal Notices, your
work need not make them do so.
A compilation of a covered work with other separate and independent
works, which are not by their nature extensions of the covered work,
and which are not combined with it such as to form a larger program,
in or on a volume of a storage or distribution medium, is called an
"aggregate" if the compilation and its resulting copyright are not
used to limit the access or legal rights of the compilation's users
beyond what the individual works permit. Inclusion of a covered work
in an aggregate does not cause this License to apply to the other
parts of the aggregate.
6. Conveying Non-Source Forms.
You may convey a covered work in object code form under the terms
of sections 4 and 5, provided that you also convey the
machine-readable Corresponding Source under the terms of this License,
in one of these ways:
a) Convey the object code in, or embodied in, a physical product
(including a physical distribution medium), accompanied by the
Corresponding Source fixed on a durable physical medium
customarily used for software interchange.
b) Convey the object code in, or embodied in, a physical product
(including a physical distribution medium), accompanied by a
written offer, valid for at least three years and valid for as
long as you offer spare parts or customer support for that product
model, to give anyone who possesses the object code either (1) a
copy of the Corresponding Source for all the software in the
product that is covered by this License, on a durable physical
medium customarily used for software interchange, for a price no
more than your reasonable cost of physically performing this
conveying of source, or (2) access to copy the
Corresponding Source from a network server at no charge.
c) Convey individual copies of the object code with a copy of the
written offer to provide the Corresponding Source. This
alternative is allowed only occasionally and noncommercially, and
only if you received the object code with such an offer, in accord
with subsection 6b.
d) Convey the object code by offering access from a designated
place (gratis or for a charge), and offer equivalent access to the
Corresponding Source in the same way through the same place at no
further charge. You need not require recipients to copy the
Corresponding Source along with the object code. If the place to
copy the object code is a network server, the Corresponding Source
may be on a different server (operated by you or a third party)
that supports equivalent copying facilities, provided you maintain
clear directions next to the object code saying where to find the
Corresponding Source. Regardless of what server hosts the
Corresponding Source, you remain obligated to ensure that it is
available for as long as needed to satisfy these requirements.
e) Convey the object code using peer-to-peer transmission, provided
you inform other peers where
gitextract_d2spliar/ ├── .clusterfuzzlite/ │ ├── Dockerfile │ ├── README.md │ ├── build.sh │ ├── platformio-clusterfuzzlite-post.py │ ├── platformio-clusterfuzzlite-pre.py │ ├── project.yaml │ ├── router_fuzzer.cpp │ ├── router_fuzzer.options │ └── router_fuzzer_seed_corpus.py ├── .devcontainer/ │ ├── 99-platformio-udev.rules │ ├── Dockerfile │ ├── devcontainer.json │ └── setup.sh ├── .envrc ├── .gitattributes ├── .github/ │ ├── FUNDING.yml │ ├── ISSUE_TEMPLATE/ │ │ ├── Bug Report.yml │ │ ├── New Board.yml │ │ └── feature.yml │ ├── actionlint.yaml │ ├── actions/ │ │ ├── build-variant/ │ │ │ └── action.yml │ │ ├── setup-base/ │ │ │ └── action.yml │ │ └── setup-native/ │ │ └── action.yml │ ├── copilot-instructions.md │ ├── pull_request_template.md │ └── workflows/ │ ├── build_debian_src.yml │ ├── build_firmware.yml │ ├── build_one_target.yml │ ├── daily_packaging.yml │ ├── docker_build.yml │ ├── docker_manifest.yml │ ├── first_time_contributor.yml │ ├── hook_copr.yml │ ├── main_matrix.yml │ ├── merge_queue.yml │ ├── models_issue_triage.yml │ ├── models_pr_triage.yml │ ├── nightly.yml │ ├── package_obs.yml │ ├── package_pio_deps.yml │ ├── package_ppa.yml │ ├── pr_enforce_labels.yml │ ├── pr_tests.yml │ ├── release_channels.yml │ ├── sec_sast_semgrep_cron.yml │ ├── sec_sast_semgrep_pull.yml │ ├── stale_bot.yml │ ├── test_native.yml │ ├── tests.yml │ ├── trunk_annotate_pr.yml │ ├── trunk_check.yml │ └── update_protobufs.yml ├── .gitignore ├── .gitmodules ├── .gitpod.yml ├── .semgrepignore ├── .trunk/ │ ├── .gitignore │ ├── configs/ │ │ ├── .bandit │ │ ├── .clang-format │ │ ├── .flake8 │ │ ├── .hadolint.yaml │ │ ├── .isort.cfg │ │ ├── .markdownlint.yaml │ │ ├── .prettierignore │ │ ├── .prettierrc │ │ ├── .shellcheckrc │ │ ├── .yamllint.yaml │ │ ├── ruff.toml │ │ └── svgo.config.js │ └── trunk.yaml ├── .vscode/ │ ├── settings.json │ └── tasks.json ├── CODE_OF_CONDUCT.md ├── CONTRIBUTING.md ├── Dockerfile ├── Dockerfile.test ├── LICENSE ├── README.md ├── SECURITY.md ├── alpine.Dockerfile ├── bin/ │ ├── .gitignore │ ├── 99-meshtasticd-udev.rules │ ├── Meshtastic_nRF52_factory_erase_v3_S140_6.1.0.uf2 │ ├── Meshtastic_nRF52_factory_erase_v3_S140_7.3.0.uf2 │ ├── analyze_map.py │ ├── base64_to_hex.py │ ├── build-esp32.sh │ ├── build-firmware.sh │ ├── build-native.sh │ ├── build-nrf52.sh │ ├── build-rp2xx0.sh │ ├── build-stm32wl.sh │ ├── build-userprefs-json.py │ ├── buildinfo.py │ ├── bump_metainfo/ │ │ ├── bump_metainfo.py │ │ └── requirements.txt │ ├── bump_version.py │ ├── check-all.sh │ ├── check-dependencies.sh │ ├── config-dist.yaml │ ├── config.d/ │ │ ├── MUI/ │ │ │ └── X11_480x480.yaml │ │ ├── OpenWRT/ │ │ │ ├── BananaPi-BPI-R4-sx1262.yaml │ │ │ ├── OpenWRT-One-mikroBUS-LR-IOT-CLICK.yaml │ │ │ └── OpenWRT_One_mikroBUS_sx1262.yaml │ │ ├── display-waveshare-1-44.yaml │ │ ├── display-waveshare-2.8.yaml │ │ ├── femtofox/ │ │ │ ├── femtofox_LR1121_TCXO.yaml │ │ │ ├── femtofox_SX1262_TCXO.yaml │ │ │ └── femtofox_SX1262_XTAL.yaml │ │ ├── lora-Adafruit-RFM9x.yaml │ │ ├── lora-MeshAdv-900M30S.yaml │ │ ├── lora-MeshAdv-Mini-900M22S.yaml │ │ ├── lora-RAK6421-13300-slot1.yaml │ │ ├── lora-RAK6421-13300-slot2.yaml │ │ ├── lora-RAK6421-13302-slot1.yaml │ │ ├── lora-RAK6421-13302-slot2.yaml │ │ ├── lora-hat-rak-6421-pi-hat.yaml │ │ ├── lora-lyra-picocalc-wio-sx1262.yaml │ │ ├── lora-lyra-ultra_1w.yaml │ │ ├── lora-lyra-ultra_2w.yaml │ │ ├── lora-lyra-ws-raspberry-pi-pico-hat.yaml │ │ ├── lora-meshstick-1262.yaml │ │ ├── lora-piggystick-lr1121.yaml │ │ ├── lora-pinedio-usb-sx1262.yaml │ │ ├── lora-raxda-rock2f-starter-edition-hat.yaml │ │ ├── lora-starter-edition-sx1262-i2c.yaml │ │ ├── lora-usb-meshstick-1262.yaml │ │ ├── lora-usb-meshtoad-e22.yaml │ │ ├── lora-usb-umesh-1262-30dbm.yaml │ │ ├── lora-usb-umesh-1268-30dbm.yaml │ │ ├── lora-waveshare-sxxx.yaml │ │ ├── lora-ws-raspberry-pi-pico-to-rpi-adapter.yaml │ │ └── lora-ws-raspberry-pico-to-orangepi-03.yaml │ ├── device-install.bat │ ├── device-install.sh │ ├── device-install_test.ps1 │ ├── device-update.bat │ ├── device-update.sh │ ├── dump-ram-users.sh │ ├── exception_decoder.py │ ├── gen-images.sh │ ├── generate_ci_matrix.py │ ├── generate_release_notes.py │ ├── generic/ │ │ ├── Meshtastic_6.1.0_bootloader-0.9.2_s140_6.1.1.hex │ │ ├── Meshtastic_7.3.0_bootloader-0.9.2_s140_7.3.0.hex │ │ ├── update-Meshtastic_6.1.0_bootloader-0.9.2_nosd.uf2 │ │ └── update-Meshtastic_7.3.0_bootloader-0.9.2_nosd.uf2 │ ├── genpartitions.py │ ├── kill-github-actions.sh │ ├── mergehex │ ├── meshtasticd-start.sh │ ├── meshtasticd.service │ ├── native-gdbserver.sh │ ├── native-install.sh │ ├── native-run.sh │ ├── org.meshtastic.meshtasticd.desktop │ ├── org.meshtastic.meshtasticd.metainfo.xml │ ├── platformio-custom.py │ ├── platformio-pre.py │ ├── promote-release.sh │ ├── read-system-info.sh │ ├── readprops.py │ ├── regen-protos.bat │ ├── regen-protos.sh │ ├── rpkg.macros │ ├── s140_nrf52_7.3.0_softdevice.hex │ ├── setup-python-for-esp-debug.sh │ ├── shame.py │ ├── test-native-docker.sh │ ├── test-simulator.sh │ ├── uf2-convert.bat │ ├── uf2conv.py │ ├── update-lilygo_techo_bootloader-0.6.1_nosd.uf2 │ ├── view-map.sh │ └── web.version ├── boards/ │ ├── CDEBYTE_EoRa-Hub.json │ ├── CDEBYTE_EoRa-S3.json │ ├── ESP32-S3-WROOM-1-N4.json │ ├── ThinkNode-M1.json │ ├── ThinkNode-M3.json │ ├── ThinkNode-M4.json │ ├── ThinkNode-M6.json │ ├── bpi_picow_esp32_s3.json │ ├── canaryone.json │ ├── crowpanel.json │ ├── eink0.1.json │ ├── esp32-s3-pico.json │ ├── esp32-s3-zero.json │ ├── gat562_mesh_trial_tracker.json │ ├── hackaday-communicator.json │ ├── heltec_mesh_node_t114.json │ ├── heltec_mesh_pocket.json │ ├── heltec_mesh_solar.json │ ├── heltec_v4.json │ ├── heltec_vision_master_e213.json │ ├── heltec_vision_master_e290.json │ ├── heltec_vision_master_t190.json │ ├── heltec_wireless_tracker.json │ ├── heltec_wireless_tracker_v2.json │ ├── icarus.json │ ├── me25ls01-4y10td.json │ ├── mesh-tab.json │ ├── meshlink.json │ ├── meshtiny.json │ ├── mini-epaper-s3.json │ ├── minimesh_lite.json │ ├── ms24sf1.json │ ├── muzi-base.json │ ├── my-esp32s3-diy-oled.json │ ├── my_esp32s3_diy_eink.json │ ├── nano-g2-ultra.json │ ├── nordic_pca10059.json │ ├── nrf52840_dk.json │ ├── promicro-nrf52840.json │ ├── r1-neo.json │ ├── seeed-sensecap-indicator.json │ ├── seeed-xiao-s3.json │ ├── seeed_solar_node.json │ ├── seeed_wio_tracker_L1.json │ ├── seeed_xiao_nrf52840_kit.json │ ├── station-g2.json │ ├── t-beam-1w.json │ ├── t-deck-pro.json │ ├── t-deck.json │ ├── t-echo.json │ ├── t-watch-s3.json │ ├── tbeam-s3-core.json │ ├── tlora-t3s3-v1.json │ ├── tracker-t1000-e.json │ ├── unphone.json │ ├── wio-sdk-wm1110.json │ ├── wio-t1000-s.json │ ├── wio-tracker-wm1110.json │ ├── wiphone.json │ ├── wiscore_rak11200.json │ ├── wiscore_rak3172.json │ ├── wiscore_rak3312.json │ ├── wiscore_rak4600.json │ ├── wiscore_rak4631.json │ └── xiao_ble_sense.json ├── branding/ │ └── README.md ├── data/ │ └── static/ │ └── .gitkeep ├── debian/ │ ├── .gitignore │ ├── changelog │ ├── ci_changelog.sh │ ├── ci_pack_sdeb.sh │ ├── control │ ├── meshtasticd.dirs │ ├── meshtasticd.install │ ├── meshtasticd.postinst │ ├── meshtasticd.postrm │ ├── meshtasticd.udev │ ├── rules │ └── source/ │ ├── format │ ├── include-binaries │ └── options ├── docker-compose.yml ├── extra_scripts/ │ ├── README.md │ ├── disable_adafruit_usb.py │ ├── esp32_extra.py │ ├── esp32_pre.py │ ├── nrf52_extra.py │ └── stm32_extra.py ├── flake.nix ├── meshtasticd.spec.rpkg ├── monitor/ │ └── filter_c3_exception_decoder.py ├── partition-table-8MB.csv ├── partition-table.csv ├── platformio.ini ├── pyocd.yaml ├── renovate.json ├── rpkg.conf ├── shell.nix ├── src/ │ ├── AmbientLightingThread.h │ ├── AudioThread.h │ ├── BluetoothCommon.cpp │ ├── BluetoothCommon.h │ ├── BluetoothStatus.h │ ├── DebugConfiguration.cpp │ ├── DebugConfiguration.h │ ├── DisplayFormatters.cpp │ ├── DisplayFormatters.h │ ├── FSCommon.cpp │ ├── FSCommon.h │ ├── Fusion/ │ │ ├── Fusion.h │ │ ├── FusionAhrs.c │ │ ├── FusionAhrs.h │ │ ├── FusionAxes.h │ │ ├── FusionCalibration.h │ │ ├── FusionCompass.c │ │ ├── FusionCompass.h │ │ ├── FusionConvention.h │ │ ├── FusionMath.h │ │ ├── FusionOffset.c │ │ └── FusionOffset.h │ ├── GPSStatus.h │ ├── GpioLogic.cpp │ ├── GpioLogic.h │ ├── MessageStore.cpp │ ├── MessageStore.h │ ├── NodeStatus.h │ ├── Observer.cpp │ ├── Observer.h │ ├── Power.cpp │ ├── PowerFSM.cpp │ ├── PowerFSM.h │ ├── PowerFSMThread.h │ ├── PowerMon.cpp │ ├── PowerMon.h │ ├── PowerStatus.h │ ├── RF95Configuration.h │ ├── RedirectablePrint.cpp │ ├── RedirectablePrint.h │ ├── SPILock.cpp │ ├── SPILock.h │ ├── SafeFile.cpp │ ├── SafeFile.h │ ├── SerialConsole.cpp │ ├── SerialConsole.h │ ├── Status.h │ ├── airtime.cpp │ ├── airtime.h │ ├── buzz/ │ │ ├── BuzzerFeedbackThread.cpp │ │ ├── BuzzerFeedbackThread.h │ │ ├── buzz.cpp │ │ └── buzz.h │ ├── commands.h │ ├── concurrency/ │ │ ├── BinarySemaphoreFreeRTOS.cpp │ │ ├── BinarySemaphoreFreeRTOS.h │ │ ├── BinarySemaphorePosix.cpp │ │ ├── BinarySemaphorePosix.h │ │ ├── InterruptableDelay.cpp │ │ ├── InterruptableDelay.h │ │ ├── Lock.cpp │ │ ├── Lock.h │ │ ├── LockGuard.cpp │ │ ├── LockGuard.h │ │ ├── NotifiedWorkerThread.cpp │ │ ├── NotifiedWorkerThread.h │ │ ├── OSThread.cpp │ │ ├── OSThread.h │ │ └── Periodic.h │ ├── configuration.h │ ├── detect/ │ │ ├── LoRaRadioType.h │ │ ├── ScanI2C.cpp │ │ ├── ScanI2C.h │ │ ├── ScanI2CConsumer.cpp │ │ ├── ScanI2CConsumer.h │ │ ├── ScanI2CTwoWire.cpp │ │ ├── ScanI2CTwoWire.h │ │ ├── einkScan.h │ │ ├── reClockI2C.cpp │ │ └── reClockI2C.h │ ├── error.h │ ├── freertosinc.h │ ├── gps/ │ │ ├── GPS.cpp │ │ ├── GPS.h │ │ ├── GPSUpdateScheduling.cpp │ │ ├── GPSUpdateScheduling.h │ │ ├── GeoCoord.cpp │ │ ├── GeoCoord.h │ │ ├── NMEAWPL.cpp │ │ ├── NMEAWPL.h │ │ ├── RTC.cpp │ │ ├── RTC.h │ │ ├── cas.h │ │ └── ubx.h │ ├── graphics/ │ │ ├── EInkDisplay2.cpp │ │ ├── EInkDisplay2.h │ │ ├── EInkDynamicDisplay.cpp │ │ ├── EInkDynamicDisplay.h │ │ ├── EmoteRenderer.cpp │ │ ├── EmoteRenderer.h │ │ ├── GxEPD2Multi.h │ │ ├── NomadStarLED.h │ │ ├── Panel_sdl.cpp │ │ ├── Panel_sdl.hpp │ │ ├── PointStruct.h │ │ ├── Screen.cpp │ │ ├── Screen.h │ │ ├── ScreenFonts.h │ │ ├── ScreenGlobals.cpp │ │ ├── SharedUIDisplay.cpp │ │ ├── SharedUIDisplay.h │ │ ├── TFTDisplay.cpp │ │ ├── TFTDisplay.h │ │ ├── TimeFormatters.cpp │ │ ├── TimeFormatters.h │ │ ├── VirtualKeyboard.cpp │ │ ├── VirtualKeyboard.h │ │ ├── draw/ │ │ │ ├── ClockRenderer.cpp │ │ │ ├── ClockRenderer.h │ │ │ ├── CompassRenderer.cpp │ │ │ ├── CompassRenderer.h │ │ │ ├── DebugRenderer.cpp │ │ │ ├── DebugRenderer.h │ │ │ ├── DrawRenderers.h │ │ │ ├── MenuHandler.cpp │ │ │ ├── MenuHandler.h │ │ │ ├── MessageRenderer.cpp │ │ │ ├── MessageRenderer.h │ │ │ ├── NodeListRenderer.cpp │ │ │ ├── NodeListRenderer.h │ │ │ ├── NotificationRenderer.cpp │ │ │ ├── NotificationRenderer.h │ │ │ ├── UIRenderer.cpp │ │ │ └── UIRenderer.h │ │ ├── emotes.cpp │ │ ├── emotes.h │ │ ├── fonts/ │ │ │ ├── EinkDisplayFonts.cpp │ │ │ ├── EinkDisplayFonts.h │ │ │ ├── OLEDDisplayFontsCS.cpp │ │ │ ├── OLEDDisplayFontsCS.h │ │ │ ├── OLEDDisplayFontsGR.cpp │ │ │ ├── OLEDDisplayFontsGR.h │ │ │ ├── OLEDDisplayFontsPL.cpp │ │ │ ├── OLEDDisplayFontsPL.h │ │ │ ├── OLEDDisplayFontsRU.cpp │ │ │ ├── OLEDDisplayFontsRU.h │ │ │ ├── OLEDDisplayFontsUA.cpp │ │ │ └── OLEDDisplayFontsUA.h │ │ ├── images.h │ │ ├── img/ │ │ │ ├── icon.xbm │ │ │ └── icon_small.xbm │ │ ├── niche/ │ │ │ ├── Drivers/ │ │ │ │ ├── Backlight/ │ │ │ │ │ ├── LatchingBacklight.cpp │ │ │ │ │ └── LatchingBacklight.h │ │ │ │ ├── EInk/ │ │ │ │ │ ├── DEPG0213BNS800.cpp │ │ │ │ │ ├── DEPG0213BNS800.h │ │ │ │ │ ├── DEPG0290BNS800.cpp │ │ │ │ │ ├── DEPG0290BNS800.h │ │ │ │ │ ├── E0213A367.cpp │ │ │ │ │ ├── E0213A367.h │ │ │ │ │ ├── EInk.cpp │ │ │ │ │ ├── EInk.h │ │ │ │ │ ├── GDEW0102T4.cpp │ │ │ │ │ ├── GDEW0102T4.h │ │ │ │ │ ├── GDEY0154D67.cpp │ │ │ │ │ ├── GDEY0154D67.h │ │ │ │ │ ├── GDEY0213B74.cpp │ │ │ │ │ ├── GDEY0213B74.h │ │ │ │ │ ├── HINK_E0213A289.cpp │ │ │ │ │ ├── HINK_E0213A289.h │ │ │ │ │ ├── HINK_E042A87.cpp │ │ │ │ │ ├── HINK_E042A87.h │ │ │ │ │ ├── LCMEN2R13ECC1.cpp │ │ │ │ │ ├── LCMEN2R13ECC1.h │ │ │ │ │ ├── LCMEN2R13EFC1.cpp │ │ │ │ │ ├── LCMEN2R13EFC1.h │ │ │ │ │ ├── README.md │ │ │ │ │ ├── SSD1682.cpp │ │ │ │ │ ├── SSD1682.h │ │ │ │ │ ├── SSD16XX.cpp │ │ │ │ │ ├── SSD16XX.h │ │ │ │ │ ├── UC8175.cpp │ │ │ │ │ ├── UC8175.h │ │ │ │ │ ├── ZJY122250_0213BAAMFGN.cpp │ │ │ │ │ ├── ZJY122250_0213BAAMFGN.h │ │ │ │ │ ├── ZJY128296_029EAAMFGN.cpp │ │ │ │ │ ├── ZJY128296_029EAAMFGN.h │ │ │ │ │ └── ZJY200200_0154DAAMFGN.h │ │ │ │ └── README.md │ │ │ ├── Fonts/ │ │ │ │ ├── FreeSans12pt_Win1250.h │ │ │ │ ├── FreeSans12pt_Win1251.h │ │ │ │ ├── FreeSans12pt_Win1252.h │ │ │ │ ├── FreeSans12pt_Win1253.h │ │ │ │ ├── FreeSans6pt7b.h │ │ │ │ ├── FreeSans6pt_Win1250.h │ │ │ │ ├── FreeSans6pt_Win1251.h │ │ │ │ ├── FreeSans6pt_Win1252.h │ │ │ │ ├── FreeSans6pt_Win1253.h │ │ │ │ ├── FreeSans9pt_Win1250.h │ │ │ │ ├── FreeSans9pt_Win1251.h │ │ │ │ ├── FreeSans9pt_Win1252.h │ │ │ │ ├── FreeSans9pt_Win1253.h │ │ │ │ └── README.md │ │ │ ├── InkHUD/ │ │ │ │ ├── Applet.cpp │ │ │ │ ├── Applet.h │ │ │ │ ├── AppletFont.cpp │ │ │ │ ├── AppletFont.h │ │ │ │ ├── Applets/ │ │ │ │ │ ├── Bases/ │ │ │ │ │ │ ├── Map/ │ │ │ │ │ │ │ ├── MapApplet.cpp │ │ │ │ │ │ │ └── MapApplet.h │ │ │ │ │ │ └── NodeList/ │ │ │ │ │ │ ├── NodeListApplet.cpp │ │ │ │ │ │ └── NodeListApplet.h │ │ │ │ │ ├── Examples/ │ │ │ │ │ │ ├── BasicExample/ │ │ │ │ │ │ │ ├── BasicExampleApplet.cpp │ │ │ │ │ │ │ └── BasicExampleApplet.h │ │ │ │ │ │ ├── NewMsgExample/ │ │ │ │ │ │ │ ├── NewMsgExampleApplet.cpp │ │ │ │ │ │ │ └── NewMsgExampleApplet.h │ │ │ │ │ │ └── UserAppletInputExample/ │ │ │ │ │ │ ├── UserAppletInputExample.cpp │ │ │ │ │ │ └── UserAppletInputExample.h │ │ │ │ │ ├── System/ │ │ │ │ │ │ ├── AlignStick/ │ │ │ │ │ │ │ ├── AlignStickApplet.cpp │ │ │ │ │ │ │ └── AlignStickApplet.h │ │ │ │ │ │ ├── BatteryIcon/ │ │ │ │ │ │ │ ├── BatteryIconApplet.cpp │ │ │ │ │ │ │ └── BatteryIconApplet.h │ │ │ │ │ │ ├── Keyboard/ │ │ │ │ │ │ │ ├── KeyboardApplet.cpp │ │ │ │ │ │ │ └── KeyboardApplet.h │ │ │ │ │ │ ├── Logo/ │ │ │ │ │ │ │ ├── LogoApplet.cpp │ │ │ │ │ │ │ └── LogoApplet.h │ │ │ │ │ │ ├── Menu/ │ │ │ │ │ │ │ ├── MenuAction.h │ │ │ │ │ │ │ ├── MenuApplet.cpp │ │ │ │ │ │ │ ├── MenuApplet.h │ │ │ │ │ │ │ ├── MenuItem.h │ │ │ │ │ │ │ └── MenuPage.h │ │ │ │ │ │ ├── Notification/ │ │ │ │ │ │ │ ├── Notification.h │ │ │ │ │ │ │ ├── NotificationApplet.cpp │ │ │ │ │ │ │ └── NotificationApplet.h │ │ │ │ │ │ ├── Pairing/ │ │ │ │ │ │ │ ├── PairingApplet.cpp │ │ │ │ │ │ │ └── PairingApplet.h │ │ │ │ │ │ ├── Placeholder/ │ │ │ │ │ │ │ ├── PlaceholderApplet.cpp │ │ │ │ │ │ │ └── PlaceholderApplet.h │ │ │ │ │ │ └── Tips/ │ │ │ │ │ │ ├── TipsApplet.cpp │ │ │ │ │ │ └── TipsApplet.h │ │ │ │ │ └── User/ │ │ │ │ │ ├── AllMessage/ │ │ │ │ │ │ ├── AllMessageApplet.cpp │ │ │ │ │ │ └── AllMessageApplet.h │ │ │ │ │ ├── DM/ │ │ │ │ │ │ ├── DMApplet.cpp │ │ │ │ │ │ └── DMApplet.h │ │ │ │ │ ├── FavoritesMap/ │ │ │ │ │ │ ├── FavoritesMapApplet.cpp │ │ │ │ │ │ └── FavoritesMapApplet.h │ │ │ │ │ ├── Heard/ │ │ │ │ │ │ ├── HeardApplet.cpp │ │ │ │ │ │ └── HeardApplet.h │ │ │ │ │ ├── Positions/ │ │ │ │ │ │ ├── PositionsApplet.cpp │ │ │ │ │ │ └── PositionsApplet.h │ │ │ │ │ ├── RecentsList/ │ │ │ │ │ │ ├── RecentsListApplet.cpp │ │ │ │ │ │ └── RecentsListApplet.h │ │ │ │ │ └── ThreadedMessage/ │ │ │ │ │ ├── ThreadedMessageApplet.cpp │ │ │ │ │ └── ThreadedMessageApplet.h │ │ │ │ ├── DisplayHealth.cpp │ │ │ │ ├── DisplayHealth.h │ │ │ │ ├── Events.cpp │ │ │ │ ├── Events.h │ │ │ │ ├── InkHUD.cpp │ │ │ │ ├── InkHUD.h │ │ │ │ ├── MessageStore.cpp │ │ │ │ ├── MessageStore.h │ │ │ │ ├── Persistence.cpp │ │ │ │ ├── Persistence.h │ │ │ │ ├── PlatformioConfig.ini │ │ │ │ ├── Renderer.cpp │ │ │ │ ├── Renderer.h │ │ │ │ ├── SystemApplet.h │ │ │ │ ├── Tile.cpp │ │ │ │ ├── Tile.h │ │ │ │ ├── WindowManager.cpp │ │ │ │ ├── WindowManager.h │ │ │ │ └── docs/ │ │ │ │ └── README.md │ │ │ ├── Inputs/ │ │ │ │ ├── README.md │ │ │ │ ├── TwoButton.cpp │ │ │ │ ├── TwoButton.h │ │ │ │ ├── TwoButtonExtended.cpp │ │ │ │ └── TwoButtonExtended.h │ │ │ ├── README.md │ │ │ └── Utils/ │ │ │ ├── CannedMessageStore.cpp │ │ │ ├── CannedMessageStore.h │ │ │ └── FlashData.h │ │ └── tftSetup.cpp │ ├── input/ │ │ ├── BBQ10Keyboard.cpp │ │ ├── BBQ10Keyboard.h │ │ ├── ButtonThread.cpp │ │ ├── ButtonThread.h │ │ ├── CardputerKeyboard.cpp │ │ ├── CardputerKeyboard.h │ │ ├── ExpressLRSFiveWay.cpp │ │ ├── ExpressLRSFiveWay.h │ │ ├── HackadayCommunicatorKeyboard.cpp │ │ ├── HackadayCommunicatorKeyboard.h │ │ ├── InputBroker.cpp │ │ ├── InputBroker.h │ │ ├── LinuxInput.cpp │ │ ├── LinuxInput.h │ │ ├── LinuxInputImpl.cpp │ │ ├── LinuxInputImpl.h │ │ ├── MPR121Keyboard.cpp │ │ ├── MPR121Keyboard.h │ │ ├── RotaryEncoderImpl.cpp │ │ ├── RotaryEncoderImpl.h │ │ ├── RotaryEncoderInterruptBase.cpp │ │ ├── RotaryEncoderInterruptBase.h │ │ ├── RotaryEncoderInterruptImpl1.cpp │ │ ├── RotaryEncoderInterruptImpl1.h │ │ ├── SeesawRotary.cpp │ │ ├── SeesawRotary.h │ │ ├── SerialKeyboard.cpp │ │ ├── SerialKeyboard.h │ │ ├── SerialKeyboardImpl.cpp │ │ ├── SerialKeyboardImpl.h │ │ ├── TCA8418Keyboard.cpp │ │ ├── TCA8418Keyboard.h │ │ ├── TCA8418KeyboardBase.cpp │ │ ├── TCA8418KeyboardBase.h │ │ ├── TDeckProKeyboard.cpp │ │ ├── TDeckProKeyboard.h │ │ ├── TLoraPagerKeyboard.cpp │ │ ├── TLoraPagerKeyboard.h │ │ ├── TouchScreenBase.cpp │ │ ├── TouchScreenBase.h │ │ ├── TouchScreenImpl1.cpp │ │ ├── TouchScreenImpl1.h │ │ ├── TrackballInterruptBase.cpp │ │ ├── TrackballInterruptBase.h │ │ ├── TrackballInterruptImpl1.cpp │ │ ├── TrackballInterruptImpl1.h │ │ ├── UpDownInterruptBase.cpp │ │ ├── UpDownInterruptBase.h │ │ ├── UpDownInterruptImpl1.cpp │ │ ├── UpDownInterruptImpl1.h │ │ ├── cardKbI2cImpl.cpp │ │ ├── cardKbI2cImpl.h │ │ ├── i2cButton.cpp │ │ ├── i2cButton.h │ │ ├── kbI2cBase.cpp │ │ ├── kbI2cBase.h │ │ ├── kbMatrixBase.cpp │ │ ├── kbMatrixBase.h │ │ ├── kbMatrixImpl.cpp │ │ └── kbMatrixImpl.h │ ├── main.cpp │ ├── main.h │ ├── memGet.cpp │ ├── memGet.h │ ├── mesh/ │ │ ├── Channels.cpp │ │ ├── Channels.h │ │ ├── CryptoEngine.cpp │ │ ├── CryptoEngine.h │ │ ├── Default.cpp │ │ ├── Default.h │ │ ├── FloodingRouter.cpp │ │ ├── FloodingRouter.h │ │ ├── InterfacesTemplates.cpp │ │ ├── LLCC68Interface.cpp │ │ ├── LLCC68Interface.h │ │ ├── LR1110Interface.cpp │ │ ├── LR1110Interface.h │ │ ├── LR1120Interface.cpp │ │ ├── LR1120Interface.h │ │ ├── LR1121Interface.cpp │ │ ├── LR1121Interface.h │ │ ├── LR11x0Interface.cpp │ │ ├── LR11x0Interface.h │ │ ├── LoRaFEMInterface.cpp │ │ ├── LoRaFEMInterface.h │ │ ├── MemoryPool.h │ │ ├── MeshModule.cpp │ │ ├── MeshModule.h │ │ ├── MeshPacketQueue.cpp │ │ ├── MeshPacketQueue.h │ │ ├── MeshRadio.h │ │ ├── MeshService.cpp │ │ ├── MeshService.h │ │ ├── MeshTypes.h │ │ ├── NextHopRouter.cpp │ │ ├── NextHopRouter.h │ │ ├── NodeDB.cpp │ │ ├── NodeDB.h │ │ ├── PacketCache.cpp │ │ ├── PacketCache.h │ │ ├── PacketHistory.cpp │ │ ├── PacketHistory.h │ │ ├── PhoneAPI.cpp │ │ ├── PhoneAPI.h │ │ ├── PointerQueue.h │ │ ├── ProtobufModule.cpp │ │ ├── ProtobufModule.h │ │ ├── RF95Interface.cpp │ │ ├── RF95Interface.h │ │ ├── RadioInterface.cpp │ │ ├── RadioInterface.h │ │ ├── RadioLibInterface.cpp │ │ ├── RadioLibInterface.h │ │ ├── RadioLibRF95.cpp │ │ ├── RadioLibRF95.h │ │ ├── ReliableRouter.cpp │ │ ├── ReliableRouter.h │ │ ├── Router.cpp │ │ ├── Router.h │ │ ├── STM32WLE5JCInterface.cpp │ │ ├── STM32WLE5JCInterface.h │ │ ├── SX1262Interface.cpp │ │ ├── SX1262Interface.h │ │ ├── SX1268Interface.cpp │ │ ├── SX1268Interface.h │ │ ├── SX126xInterface.cpp │ │ ├── SX126xInterface.h │ │ ├── SX1280Interface.cpp │ │ ├── SX1280Interface.h │ │ ├── SX128xInterface.cpp │ │ ├── SX128xInterface.h │ │ ├── SinglePortModule.h │ │ ├── StaticPointerQueue.h │ │ ├── StreamAPI.cpp │ │ ├── StreamAPI.h │ │ ├── Throttle.cpp │ │ ├── Throttle.h │ │ ├── TransmitHistory.cpp │ │ ├── TransmitHistory.h │ │ ├── TypeConversions.cpp │ │ ├── TypeConversions.h │ │ ├── TypedQueue.h │ │ ├── aes-ccm.cpp │ │ ├── aes-ccm.h │ │ ├── api/ │ │ │ ├── PacketAPI.cpp │ │ │ ├── PacketAPI.h │ │ │ ├── ServerAPI.cpp │ │ │ ├── ServerAPI.h │ │ │ ├── WiFiServerAPI.cpp │ │ │ ├── WiFiServerAPI.h │ │ │ ├── ethServerAPI.cpp │ │ │ └── ethServerAPI.h │ │ ├── compression/ │ │ │ ├── unishox2.cpp │ │ │ └── unishox2.h │ │ ├── eth/ │ │ │ ├── ethClient.cpp │ │ │ └── ethClient.h │ │ ├── generated/ │ │ │ ├── .clang-format │ │ │ └── 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 │ │ ├── http/ │ │ │ ├── ContentHandler.cpp │ │ │ ├── ContentHandler.h │ │ │ ├── ContentHelper.cpp │ │ │ ├── ContentHelper.h │ │ │ ├── WebServer.cpp │ │ │ └── WebServer.h │ │ ├── mesh-pb-constants.cpp │ │ ├── mesh-pb-constants.h │ │ ├── raspihttp/ │ │ │ ├── PiWebServer.cpp │ │ │ └── PiWebServer.h │ │ ├── udp/ │ │ │ └── UdpMulticastHandler.h │ │ └── wifi/ │ │ ├── WiFiAPClient.cpp │ │ └── WiFiAPClient.h │ ├── meshUtils.cpp │ ├── meshUtils.h │ ├── modules/ │ │ ├── AdminModule.cpp │ │ ├── AdminModule.h │ │ ├── AtakPluginModule.cpp │ │ ├── AtakPluginModule.h │ │ ├── CannedMessageModule.cpp │ │ ├── CannedMessageModule.h │ │ ├── DetectionSensorModule.cpp │ │ ├── DetectionSensorModule.h │ │ ├── DropzoneModule.cpp │ │ ├── DropzoneModule.h │ │ ├── ExternalNotificationModule.cpp │ │ ├── ExternalNotificationModule.h │ │ ├── GenericThreadModule.cpp │ │ ├── GenericThreadModule.h │ │ ├── KeyVerificationModule.cpp │ │ ├── KeyVerificationModule.h │ │ ├── ModuleDev.h │ │ ├── Modules.cpp │ │ ├── Modules.h │ │ ├── NeighborInfoModule.cpp │ │ ├── NeighborInfoModule.h │ │ ├── NodeInfoModule.cpp │ │ ├── NodeInfoModule.h │ │ ├── OnScreenKeyboardModule.cpp │ │ ├── OnScreenKeyboardModule.h │ │ ├── PositionModule.cpp │ │ ├── PositionModule.h │ │ ├── PowerStressModule.cpp │ │ ├── PowerStressModule.h │ │ ├── RangeTestModule.cpp │ │ ├── RangeTestModule.h │ │ ├── RemoteHardwareModule.cpp │ │ ├── RemoteHardwareModule.h │ │ ├── ReplyBotModule.cpp │ │ ├── ReplyBotModule.h │ │ ├── ReplyModule.cpp │ │ ├── ReplyModule.h │ │ ├── RoutingModule.cpp │ │ ├── RoutingModule.h │ │ ├── SerialModule.cpp │ │ ├── SerialModule.h │ │ ├── StatusLEDModule.cpp │ │ ├── StatusLEDModule.h │ │ ├── StatusMessageModule.cpp │ │ ├── StatusMessageModule.h │ │ ├── StoreForwardModule.cpp │ │ ├── StoreForwardModule.h │ │ ├── SystemCommandsModule.cpp │ │ ├── SystemCommandsModule.h │ │ ├── Telemetry/ │ │ │ ├── AirQualityTelemetry.cpp │ │ │ ├── AirQualityTelemetry.h │ │ │ ├── BaseTelemetryModule.h │ │ │ ├── DeviceTelemetry.cpp │ │ │ ├── DeviceTelemetry.h │ │ │ ├── EnvironmentTelemetry.cpp │ │ │ ├── EnvironmentTelemetry.h │ │ │ ├── HealthTelemetry.cpp │ │ │ ├── HealthTelemetry.h │ │ │ ├── HostMetrics.cpp │ │ │ ├── HostMetrics.h │ │ │ ├── PowerTelemetry.cpp │ │ │ ├── PowerTelemetry.h │ │ │ ├── Sensor/ │ │ │ │ ├── AHT10.cpp │ │ │ │ ├── AHT10.h │ │ │ │ ├── AddI2CSensorTemplate.h │ │ │ │ ├── BH1750Sensor.cpp │ │ │ │ ├── BH1750Sensor.h │ │ │ │ ├── BME280Sensor.cpp │ │ │ │ ├── BME280Sensor.h │ │ │ │ ├── BME680Sensor.cpp │ │ │ │ ├── BME680Sensor.h │ │ │ │ ├── BMP085Sensor.cpp │ │ │ │ ├── BMP085Sensor.h │ │ │ │ ├── BMP280Sensor.cpp │ │ │ │ ├── BMP280Sensor.h │ │ │ │ ├── BMP3XXSensor.cpp │ │ │ │ ├── BMP3XXSensor.h │ │ │ │ ├── CGRadSensSensor.cpp │ │ │ │ ├── CGRadSensSensor.h │ │ │ │ ├── CurrentSensor.h │ │ │ │ ├── DFRobotGravitySensor.cpp │ │ │ │ ├── DFRobotGravitySensor.h │ │ │ │ ├── DFRobotLarkSensor.cpp │ │ │ │ ├── DFRobotLarkSensor.h │ │ │ │ ├── DPS310Sensor.cpp │ │ │ │ ├── DPS310Sensor.h │ │ │ │ ├── INA219Sensor.cpp │ │ │ │ ├── INA219Sensor.h │ │ │ │ ├── INA226Sensor.cpp │ │ │ │ ├── INA226Sensor.h │ │ │ │ ├── INA260Sensor.cpp │ │ │ │ ├── INA260Sensor.h │ │ │ │ ├── INA3221Sensor.cpp │ │ │ │ ├── INA3221Sensor.h │ │ │ │ ├── IndicatorSensor.cpp │ │ │ │ ├── IndicatorSensor.h │ │ │ │ ├── LPS22HBSensor.cpp │ │ │ │ ├── LPS22HBSensor.h │ │ │ │ ├── LTR390UVSensor.cpp │ │ │ │ ├── LTR390UVSensor.h │ │ │ │ ├── MAX17048Sensor.cpp │ │ │ │ ├── MAX17048Sensor.h │ │ │ │ ├── MAX30102Sensor.cpp │ │ │ │ ├── MAX30102Sensor.h │ │ │ │ ├── MCP9808Sensor.cpp │ │ │ │ ├── MCP9808Sensor.h │ │ │ │ ├── MLX90614Sensor.cpp │ │ │ │ ├── MLX90614Sensor.h │ │ │ │ ├── MLX90632Sensor.cpp │ │ │ │ ├── MLX90632Sensor.h │ │ │ │ ├── NAU7802Sensor.cpp │ │ │ │ ├── NAU7802Sensor.h │ │ │ │ ├── OPT3001Sensor.cpp │ │ │ │ ├── OPT3001Sensor.h │ │ │ │ ├── PCT2075Sensor.cpp │ │ │ │ ├── PCT2075Sensor.h │ │ │ │ ├── PMSA003ISensor.cpp │ │ │ │ ├── PMSA003ISensor.h │ │ │ │ ├── RAK12035Sensor.cpp │ │ │ │ ├── RAK12035Sensor.h │ │ │ │ ├── RAK9154Sensor.cpp │ │ │ │ ├── RAK9154Sensor.h │ │ │ │ ├── RCWL9620Sensor.cpp │ │ │ │ ├── RCWL9620Sensor.h │ │ │ │ ├── SCD30Sensor.cpp │ │ │ │ ├── SCD30Sensor.h │ │ │ │ ├── SCD4XSensor.cpp │ │ │ │ ├── SCD4XSensor.h │ │ │ │ ├── SEN5XSensor.cpp │ │ │ │ ├── SEN5XSensor.h │ │ │ │ ├── SFA30Sensor.cpp │ │ │ │ ├── SFA30Sensor.h │ │ │ │ ├── SHT31Sensor.cpp │ │ │ │ ├── SHT31Sensor.h │ │ │ │ ├── SHT4XSensor.cpp │ │ │ │ ├── SHT4XSensor.h │ │ │ │ ├── SHTC3Sensor.cpp │ │ │ │ ├── SHTC3Sensor.h │ │ │ │ ├── T1000xSensor.cpp │ │ │ │ ├── T1000xSensor.h │ │ │ │ ├── TSL2561Sensor.cpp │ │ │ │ ├── TSL2561Sensor.h │ │ │ │ ├── TSL2591Sensor.cpp │ │ │ │ ├── TSL2591Sensor.h │ │ │ │ ├── TelemetrySensor.cpp │ │ │ │ ├── TelemetrySensor.h │ │ │ │ ├── VEML7700Sensor.cpp │ │ │ │ ├── VEML7700Sensor.h │ │ │ │ ├── VoltageSensor.h │ │ │ │ ├── nullSensor.cpp │ │ │ │ └── nullSensor.h │ │ │ ├── UnitConversions.cpp │ │ │ └── UnitConversions.h │ │ ├── TextMessageModule.cpp │ │ ├── TextMessageModule.h │ │ ├── TraceRouteModule.cpp │ │ ├── TraceRouteModule.h │ │ ├── TrafficManagementModule.cpp │ │ ├── TrafficManagementModule.h │ │ ├── WaypointModule.cpp │ │ ├── WaypointModule.h │ │ └── esp32/ │ │ ├── AudioModule.cpp │ │ ├── AudioModule.h │ │ ├── PaxcounterModule.cpp │ │ └── PaxcounterModule.h │ ├── motion/ │ │ ├── AccelerometerThread.h │ │ ├── BMA423Sensor.cpp │ │ ├── BMA423Sensor.h │ │ ├── BMI270Sensor.cpp │ │ ├── BMI270Sensor.h │ │ ├── BMM150Sensor.cpp │ │ ├── BMM150Sensor.h │ │ ├── BMX160Sensor.cpp │ │ ├── BMX160Sensor.h │ │ ├── ICM20948Sensor.cpp │ │ ├── ICM20948Sensor.h │ │ ├── LIS3DHSensor.cpp │ │ ├── LIS3DHSensor.h │ │ ├── LSM6DS3Sensor.cpp │ │ ├── LSM6DS3Sensor.h │ │ ├── MPU6050Sensor.cpp │ │ ├── MPU6050Sensor.h │ │ ├── MotionSensor.cpp │ │ ├── MotionSensor.h │ │ ├── QMA6100PSensor.cpp │ │ ├── QMA6100PSensor.h │ │ ├── STK8XXXSensor.cpp │ │ └── STK8XXXSensor.h │ ├── mqtt/ │ │ ├── MQTT.cpp │ │ ├── MQTT.h │ │ ├── ServiceEnvelope.cpp │ │ └── ServiceEnvelope.h │ ├── network-stubs.cpp │ ├── nimble/ │ │ ├── NimbleBluetooth.cpp │ │ └── NimbleBluetooth.h │ ├── platform/ │ │ ├── esp32/ │ │ │ ├── ESP32CryptoEngine.cpp │ │ │ ├── MeshtasticOTA.cpp │ │ │ ├── MeshtasticOTA.h │ │ │ ├── SimpleAllocator.cpp │ │ │ ├── SimpleAllocator.h │ │ │ ├── architecture.h │ │ │ ├── iram-quirk.c │ │ │ └── main-esp32.cpp │ │ ├── extra_variants/ │ │ │ ├── README.md │ │ │ ├── heltec_wireless_tracker/ │ │ │ │ └── variant.cpp │ │ │ ├── t_deck_pro/ │ │ │ │ └── variant.cpp │ │ │ ├── t_lora_pager/ │ │ │ │ └── variant.cpp │ │ │ └── tbeam_displayshield/ │ │ │ └── variant.cpp │ │ ├── nrf52/ │ │ │ ├── AsyncUDP.cpp │ │ │ ├── AsyncUDP.h │ │ │ ├── BLEDfuSecure.cpp │ │ │ ├── BLEDfuSecure.h │ │ │ ├── NRF52Bluetooth.cpp │ │ │ ├── NRF52Bluetooth.h │ │ │ ├── NRF52CryptoEngine.cpp │ │ │ ├── aes-256/ │ │ │ │ ├── tiny-aes.cpp │ │ │ │ └── tiny-aes.h │ │ │ ├── alloc.cpp │ │ │ ├── architecture.h │ │ │ ├── hardfault.cpp │ │ │ ├── main-bare.cpp │ │ │ ├── main-nrf52.cpp │ │ │ ├── nrf52840_s140_v7.ld │ │ │ └── softdevice/ │ │ │ ├── ble.h │ │ │ ├── ble_err.h │ │ │ ├── ble_gap.h │ │ │ ├── ble_gatt.h │ │ │ ├── ble_gattc.h │ │ │ ├── ble_gatts.h │ │ │ ├── ble_hci.h │ │ │ ├── ble_l2cap.h │ │ │ ├── ble_ranges.h │ │ │ ├── ble_types.h │ │ │ ├── nrf52/ │ │ │ │ └── nrf_mbr.h │ │ │ ├── nrf_error.h │ │ │ ├── nrf_error_sdm.h │ │ │ ├── nrf_error_soc.h │ │ │ ├── nrf_nvic.h │ │ │ ├── nrf_sdm.h │ │ │ ├── nrf_soc.h │ │ │ └── nrf_svc.h │ │ ├── portduino/ │ │ │ ├── PortduinoGlue.cpp │ │ │ ├── PortduinoGlue.h │ │ │ ├── SimRadio.cpp │ │ │ ├── SimRadio.h │ │ │ ├── USBHal.h │ │ │ └── architecture.h │ │ ├── rp2xx0/ │ │ │ ├── architecture.h │ │ │ ├── hardware_rosc/ │ │ │ │ ├── include/ │ │ │ │ │ └── hardware/ │ │ │ │ │ └── rosc.h │ │ │ │ └── rosc.c │ │ │ ├── main-rp2xx0.cpp │ │ │ └── pico_sleep/ │ │ │ ├── include/ │ │ │ │ └── pico/ │ │ │ │ └── sleep.h │ │ │ └── sleep.c │ │ └── stm32wl/ │ │ ├── LittleFS.cpp │ │ ├── LittleFS.h │ │ ├── STM32_LittleFS.cpp │ │ ├── STM32_LittleFS.h │ │ ├── STM32_LittleFS_File.cpp │ │ ├── STM32_LittleFS_File.h │ │ ├── architecture.h │ │ ├── littlefs/ │ │ │ ├── lfs.c │ │ │ ├── lfs.h │ │ │ ├── lfs_util.c │ │ │ └── lfs_util.h │ │ └── main-stm32wl.cpp │ ├── power/ │ │ ├── PowerHAL.cpp │ │ └── PowerHAL.h │ ├── power.h │ ├── serialization/ │ │ ├── JSON.cpp │ │ ├── JSON.h │ │ ├── JSONValue.cpp │ │ ├── JSONValue.h │ │ ├── MeshPacketSerializer.cpp │ │ ├── MeshPacketSerializer.h │ │ ├── MeshPacketSerializer_nRF52.cpp │ │ ├── cobs.cpp │ │ └── cobs.h │ ├── sleep.cpp │ ├── sleep.h │ ├── target_specific.h │ ├── watchdog/ │ │ ├── watchdogThread.cpp │ │ └── watchdogThread.h │ ├── xmodem.cpp │ └── xmodem.h ├── suppressions.txt ├── test/ │ ├── TestUtil.cpp │ ├── TestUtil.h │ ├── test_admin_radio/ │ │ └── test_main.cpp │ ├── test_atak/ │ │ └── test_main.cpp │ ├── test_crypto/ │ │ └── test_main.cpp │ ├── test_default/ │ │ └── test_main.cpp │ ├── test_http_content_handler/ │ │ └── test_main.cpp │ ├── test_mesh_module/ │ │ └── test_main.cpp │ ├── test_meshpacket_serializer/ │ │ ├── ports/ │ │ │ ├── test_encrypted.cpp │ │ │ ├── test_nodeinfo.cpp │ │ │ ├── test_position.cpp │ │ │ ├── test_telemetry.cpp │ │ │ ├── test_text_message.cpp │ │ │ └── test_waypoint.cpp │ │ ├── test_helpers.h │ │ └── test_serializer.cpp │ ├── test_mqtt/ │ │ └── MQTT.cpp │ ├── test_radio/ │ │ └── test_main.cpp │ ├── test_serial/ │ │ └── SerialModule.cpp │ ├── test_traffic_management/ │ │ └── test_main.cpp │ └── test_transmit_history/ │ └── test_main.cpp ├── userPrefs.jsonc ├── variants/ │ ├── esp32/ │ │ ├── betafpv_2400_tx_micro/ │ │ │ ├── platformio.ini │ │ │ └── variant.h │ │ ├── betafpv_900_tx_nano/ │ │ │ ├── platformio.ini │ │ │ └── variant.h │ │ ├── chatter2/ │ │ │ ├── platformio.ini │ │ │ └── variant.h │ │ ├── diy/ │ │ │ ├── 9m2ibr_aprs_lora_tracker/ │ │ │ │ ├── platformio.ini │ │ │ │ ├── variant.cpp │ │ │ │ └── variant.h │ │ │ ├── dr-dev/ │ │ │ │ ├── platformio.ini │ │ │ │ └── variant.h │ │ │ ├── hydra/ │ │ │ │ ├── platformio.ini │ │ │ │ └── variant.h │ │ │ ├── v1/ │ │ │ │ ├── platformio.ini │ │ │ │ └── variant.h │ │ │ └── v1_1/ │ │ │ ├── platformio.ini │ │ │ └── variant.h │ │ ├── esp32-common.ini │ │ ├── esp32.ini │ │ ├── hackerboxes_esp32_io/ │ │ │ ├── platformio.ini │ │ │ └── variant.h │ │ ├── heltec_v1/ │ │ │ ├── platformio.ini │ │ │ └── variant.h │ │ ├── heltec_v2/ │ │ │ ├── platformio.ini │ │ │ └── variant.h │ │ ├── heltec_v2.1/ │ │ │ ├── platformio.ini │ │ │ └── variant.h │ │ ├── heltec_wireless_bridge/ │ │ │ ├── platformio.ini │ │ │ └── variant.h │ │ ├── heltec_wsl_v2.1/ │ │ │ ├── platformio.ini │ │ │ └── variant.h │ │ ├── m5stack_core/ │ │ │ ├── pins_arduino.h │ │ │ ├── platformio.ini │ │ │ └── variant.h │ │ ├── m5stack_coreink/ │ │ │ ├── pins_arduino.h │ │ │ ├── platformio.ini │ │ │ └── variant.h │ │ ├── nano-g1/ │ │ │ ├── platformio.ini │ │ │ └── variant.h │ │ ├── nano-g1-explorer/ │ │ │ ├── platformio.ini │ │ │ └── variant.h │ │ ├── radiomaster_900_bandit/ │ │ │ ├── platformio.ini │ │ │ └── variant.h │ │ ├── radiomaster_900_bandit_micro/ │ │ │ └── platformio.ini │ │ ├── radiomaster_900_bandit_nano/ │ │ │ ├── platformio.ini │ │ │ └── variant.h │ │ ├── rak11200/ │ │ │ ├── pins_arduino.h │ │ │ ├── platformio.ini │ │ │ └── variant.h │ │ ├── station-g1/ │ │ │ ├── platformio.ini │ │ │ └── variant.h │ │ ├── tbeam/ │ │ │ ├── platformio.ini │ │ │ └── variant.h │ │ ├── tbeam_v07/ │ │ │ ├── platformio.ini │ │ │ └── variant.h │ │ ├── tlora_v1/ │ │ │ ├── platformio.ini │ │ │ └── variant.h │ │ ├── tlora_v1_3/ │ │ │ ├── platformio.ini │ │ │ └── variant.h │ │ ├── tlora_v2/ │ │ │ ├── platformio.ini │ │ │ └── variant.h │ │ ├── tlora_v2_1_16/ │ │ │ ├── platformio.ini │ │ │ └── variant.h │ │ ├── tlora_v2_1_16_tcxo/ │ │ │ └── platformio.ini │ │ ├── tlora_v2_1_18/ │ │ │ ├── platformio.ini │ │ │ └── variant.h │ │ ├── tlora_v3_3_0_tcxo/ │ │ │ └── platformio.ini │ │ ├── trackerd/ │ │ │ ├── platformio.ini │ │ │ └── variant.h │ │ └── wiphone/ │ │ ├── pins_arduino.h │ │ ├── platformio.ini │ │ └── variant.h │ ├── esp32c3/ │ │ ├── ai-c3/ │ │ │ ├── platformio.ini │ │ │ └── variant.h │ │ ├── diy/ │ │ │ └── esp32c3_super_mini/ │ │ │ ├── pins_arduino.h │ │ │ ├── platformio.ini │ │ │ └── variant.h │ │ ├── esp32c3.ini │ │ ├── hackerboxes_esp32c3_oled/ │ │ │ ├── platformio.ini │ │ │ └── variant.h │ │ ├── heltec_esp32c3/ │ │ │ ├── pins_arduino.h │ │ │ ├── platformio.ini │ │ │ └── variant.h │ │ ├── heltec_hru_3601/ │ │ │ ├── pins_arduino.h │ │ │ ├── platformio.ini │ │ │ └── variant.h │ │ └── m5stack-stamp-c3/ │ │ ├── pins_arduino.h │ │ ├── platformio.ini │ │ └── variant.h │ ├── esp32c6/ │ │ ├── esp32c6.ini │ │ ├── m5stack_unitc6l/ │ │ │ ├── pins_arduino.h │ │ │ ├── platformio.ini │ │ │ ├── variant.cpp │ │ │ └── variant.h │ │ └── tlora_c6/ │ │ ├── platformio.ini │ │ └── variant.h │ ├── esp32s2/ │ │ ├── esp32s2.ini │ │ └── nugget_s2_lora/ │ │ ├── platformio.ini │ │ └── variant.h │ ├── esp32s3/ │ │ ├── CDEBYTE_EoRa-Hub/ │ │ │ ├── pins_arduino.h │ │ │ ├── platformio.ini │ │ │ ├── rfswitch.h │ │ │ └── variant.h │ │ ├── CDEBYTE_EoRa-S3/ │ │ │ ├── pins_arduino.h │ │ │ ├── platformio.ini │ │ │ └── variant.h │ │ ├── EBYTE_ESP32-S3/ │ │ │ ├── pins_arduino.h │ │ │ ├── platformio.ini │ │ │ └── variant.h │ │ ├── ELECROW-ThinkNode-M2/ │ │ │ ├── pins_arduino.h │ │ │ ├── platformio.ini │ │ │ └── variant.h │ │ ├── ELECROW-ThinkNode-M5/ │ │ │ ├── pins_arduino.h │ │ │ ├── platformio.ini │ │ │ ├── variant.cpp │ │ │ └── variant.h │ │ ├── bpi_picow_esp32_s3/ │ │ │ ├── pins_arduino.h │ │ │ ├── platformio.ini │ │ │ └── variant.h │ │ ├── crowpanel-esp32s3-5-epaper/ │ │ │ ├── pins_arduino.h │ │ │ ├── platformio.ini │ │ │ └── variant.h │ │ ├── diy/ │ │ │ ├── my_esp32s3_diy_eink/ │ │ │ │ ├── pins_arduino.h │ │ │ │ ├── platformio.ini │ │ │ │ └── variant.h │ │ │ ├── my_esp32s3_diy_oled/ │ │ │ │ ├── pins_arduino.h │ │ │ │ ├── platformio.ini │ │ │ │ └── variant.h │ │ │ └── t-energy-s3_e22/ │ │ │ ├── platformio.ini │ │ │ └── variant.h │ │ ├── dreamcatcher/ │ │ │ ├── platformio.ini │ │ │ ├── rfswitch.h │ │ │ └── variant.h │ │ ├── elecrow_panel/ │ │ │ ├── pins_arduino.h │ │ │ ├── platformio.ini │ │ │ └── variant.h │ │ ├── esp32-s3-pico/ │ │ │ ├── pins_arduino.h │ │ │ ├── platformio.ini │ │ │ └── variant.h │ │ ├── esp32s3.ini │ │ ├── hackaday-communicator/ │ │ │ ├── pins_arduino.h │ │ │ ├── platformio.ini │ │ │ ├── variant.cpp │ │ │ └── variant.h │ │ ├── heltec_capsule_sensor_v3/ │ │ │ ├── platformio.ini │ │ │ └── variant.h │ │ ├── heltec_sensor_hub/ │ │ │ ├── platformio.ini │ │ │ └── variant.h │ │ ├── heltec_v3/ │ │ │ ├── platformio.ini │ │ │ └── variant.h │ │ ├── heltec_v4/ │ │ │ ├── pins_arduino.h │ │ │ ├── platformio.ini │ │ │ └── variant.h │ │ ├── heltec_vision_master_e213/ │ │ │ ├── einkDetect.h │ │ │ ├── nicheGraphics.h │ │ │ ├── pins_arduino.h │ │ │ ├── platformio.ini │ │ │ └── variant.h │ │ ├── heltec_vision_master_e290/ │ │ │ ├── nicheGraphics.h │ │ │ ├── pins_arduino.h │ │ │ ├── platformio.ini │ │ │ └── variant.h │ │ ├── heltec_vision_master_t190/ │ │ │ ├── pins_arduino.h │ │ │ ├── platformio.ini │ │ │ └── variant.h │ │ ├── heltec_wireless_paper/ │ │ │ ├── einkDetect.h │ │ │ ├── nicheGraphics.h │ │ │ ├── pins_arduino.h │ │ │ ├── platformio.ini │ │ │ └── variant.h │ │ ├── heltec_wireless_paper_v1/ │ │ │ ├── pins_arduino.h │ │ │ ├── platformio.ini │ │ │ └── variant.h │ │ ├── heltec_wireless_tracker/ │ │ │ ├── pins_arduino.h │ │ │ ├── platformio.ini │ │ │ └── variant.h │ │ ├── heltec_wireless_tracker_V1_0/ │ │ │ ├── pins_arduino.h │ │ │ ├── platformio.ini │ │ │ └── variant.h │ │ ├── heltec_wireless_tracker_v2/ │ │ │ ├── pins_arduino.h │ │ │ ├── platformio.ini │ │ │ └── variant.h │ │ ├── heltec_wsl_v3/ │ │ │ ├── platformio.ini │ │ │ └── variant.h │ │ ├── icarus/ │ │ │ ├── pins_arduino.h │ │ │ ├── platformio.ini │ │ │ └── variant.h │ │ ├── link32_s3_v1/ │ │ │ ├── pins_arduino.h │ │ │ ├── platformio.ini │ │ │ └── variant.h │ │ ├── m5stack_cardputer_adv/ │ │ │ ├── pins_arduino.h │ │ │ ├── platformio.ini │ │ │ └── variant.h │ │ ├── m5stack_cores3/ │ │ │ ├── pins_arduino.h │ │ │ ├── platformio.ini │ │ │ └── variant.h │ │ ├── mesh-tab/ │ │ │ ├── pins_arduino.h │ │ │ ├── platformio.ini │ │ │ └── variant.h │ │ ├── mini-epaper-s3/ │ │ │ ├── nicheGraphics.h │ │ │ ├── pins_arduino.h │ │ │ ├── platformio.ini │ │ │ └── variant.h │ │ ├── nibble_esp32/ │ │ │ ├── platformio.ini │ │ │ └── variant.h │ │ ├── nugget_s3_lora/ │ │ │ ├── platformio.ini │ │ │ └── variant.h │ │ ├── picomputer-s3/ │ │ │ ├── pins_arduino.h │ │ │ ├── platformio.ini │ │ │ └── variant.h │ │ ├── rak3312/ │ │ │ ├── pins_arduino.h │ │ │ ├── platformio.ini │ │ │ └── variant.h │ │ ├── rak_wismesh_tap_v2/ │ │ │ ├── pins_arduino.h │ │ │ ├── platformio.ini │ │ │ └── variant.h │ │ ├── seeed-sensecap-indicator/ │ │ │ ├── pins_arduino.h │ │ │ ├── platformio.ini │ │ │ └── variant.h │ │ ├── seeed_xiao_s3/ │ │ │ ├── pins_arduino.h │ │ │ ├── platformio.ini │ │ │ └── variant.h │ │ ├── station-g2/ │ │ │ ├── pins_arduino.h │ │ │ ├── platformio.ini │ │ │ └── variant.h │ │ ├── t-beam-1w/ │ │ │ ├── pins_arduino.h │ │ │ ├── platformio.ini │ │ │ └── variant.h │ │ ├── t-deck/ │ │ │ ├── pins_arduino.h │ │ │ ├── platformio.ini │ │ │ ├── variant.cpp │ │ │ └── variant.h │ │ ├── t-deck-pro/ │ │ │ ├── pins_arduino.h │ │ │ ├── platformio.ini │ │ │ ├── variant.cpp │ │ │ └── variant.h │ │ ├── t-eth-elite/ │ │ │ ├── pins_arduino.h │ │ │ ├── platformio.ini │ │ │ ├── rfswitch.h │ │ │ └── variant.h │ │ ├── t-watch-s3/ │ │ │ ├── pins_arduino.h │ │ │ ├── platformio.ini │ │ │ └── variant.h │ │ ├── tbeam-s3-core/ │ │ │ ├── pins_arduino.h │ │ │ ├── platformio.ini │ │ │ ├── rfswitch.h │ │ │ └── variant.h │ │ ├── tlora-pager/ │ │ │ ├── pins_arduino.h │ │ │ ├── platformio.ini │ │ │ ├── rfswitch.h │ │ │ ├── variant.cpp │ │ │ └── variant.h │ │ ├── tlora_t3s3_epaper/ │ │ │ ├── nicheGraphics.h │ │ │ ├── pins_arduino.h │ │ │ ├── platformio.ini │ │ │ └── variant.h │ │ ├── tlora_t3s3_v1/ │ │ │ ├── pins_arduino.h │ │ │ ├── platformio.ini │ │ │ ├── rfswitch.h │ │ │ └── variant.h │ │ ├── tracksenger/ │ │ │ ├── internal/ │ │ │ │ ├── pins_arduino.h │ │ │ │ └── variant.h │ │ │ ├── lcd/ │ │ │ │ ├── pins_arduino.h │ │ │ │ └── variant.h │ │ │ ├── oled/ │ │ │ │ ├── pins_arduino.h │ │ │ │ └── variant.h │ │ │ └── platformio.ini │ │ └── unphone/ │ │ ├── pins_arduino.h │ │ ├── platformio.ini │ │ ├── variant.cpp │ │ └── variant.h │ ├── native/ │ │ ├── portduino/ │ │ │ ├── platformio.ini │ │ │ └── variant.h │ │ ├── portduino-buildroot/ │ │ │ ├── platformio.ini │ │ │ └── variant.h │ │ └── portduino.ini │ ├── nrf52840/ │ │ ├── Dongle_nRF52840-pca10059-v1/ │ │ │ ├── platformio.ini │ │ │ ├── variant.cpp │ │ │ └── variant.h │ │ ├── ELECROW-ThinkNode-M1/ │ │ │ ├── nicheGraphics.h │ │ │ ├── platformio.ini │ │ │ ├── variant.cpp │ │ │ └── variant.h │ │ ├── ELECROW-ThinkNode-M3/ │ │ │ ├── platformio.ini │ │ │ ├── rfswitch.h │ │ │ ├── variant.cpp │ │ │ └── variant.h │ │ ├── ELECROW-ThinkNode-M4/ │ │ │ ├── platformio.ini │ │ │ ├── rfswitch.h │ │ │ ├── variant.cpp │ │ │ └── variant.h │ │ ├── ELECROW-ThinkNode-M6/ │ │ │ ├── platformio.ini │ │ │ ├── variant.cpp │ │ │ └── variant.h │ │ ├── ME25LS01-4Y10TD/ │ │ │ ├── platformio.ini │ │ │ ├── rfswitch.h │ │ │ ├── variant.cpp │ │ │ └── variant.h │ │ ├── ME25LS01-4Y10TD_e-ink/ │ │ │ ├── platformio.ini │ │ │ ├── rfswitch.h │ │ │ ├── variant.cpp │ │ │ └── variant.h │ │ ├── MS24SF1/ │ │ │ ├── platformio.ini │ │ │ ├── variant.cpp │ │ │ └── variant.h │ │ ├── MakePython_nRF52840_eink/ │ │ │ ├── platformio.ini │ │ │ ├── variant.cpp │ │ │ └── variant.h │ │ ├── MakePython_nRF52840_oled/ │ │ │ ├── platformio.ini │ │ │ ├── variant.cpp │ │ │ └── variant.h │ │ ├── TWC_mesh_v4/ │ │ │ ├── platformio.ini │ │ │ ├── variant.cpp │ │ │ └── variant.h │ │ ├── canaryone/ │ │ │ ├── platformio.ini │ │ │ ├── variant.cpp │ │ │ └── variant.h │ │ ├── cpp_overrides/ │ │ │ └── lfs_util.h │ │ ├── diy/ │ │ │ ├── WashTastic/ │ │ │ │ └── platformio.ini │ │ │ ├── nrf52_promicro_diy_tcxo/ │ │ │ │ ├── custom_build_tasks.py │ │ │ │ ├── nicheGraphics.h │ │ │ │ ├── platformio.ini │ │ │ │ ├── readme.md │ │ │ │ ├── rfswitch.h │ │ │ │ ├── variant.cpp │ │ │ │ └── variant.h │ │ │ ├── seeed-xiao-nrf52840-wio-sx1262/ │ │ │ │ ├── README.md │ │ │ │ └── platformio.ini │ │ │ ├── seeed_xiao_nrf52840_e22/ │ │ │ │ └── platformio.ini │ │ │ └── xiao_ble/ │ │ │ ├── README.md │ │ │ └── platformio.ini │ │ ├── dls_Minimesh_Lite/ │ │ │ ├── platformio.ini │ │ │ ├── variant.cpp │ │ │ └── variant.h │ │ ├── feather_diy/ │ │ │ ├── platformio.ini │ │ │ ├── variant.cpp │ │ │ └── variant.h │ │ ├── gat562_mesh_trial_tracker/ │ │ │ ├── platformio.ini │ │ │ ├── variant.cpp │ │ │ └── variant.h │ │ ├── heltec_mesh_node_t114/ │ │ │ ├── platformio.ini │ │ │ ├── variant.cpp │ │ │ └── variant.h │ │ ├── heltec_mesh_node_t114-inkhud/ │ │ │ ├── custom_build_tasks.py │ │ │ ├── nicheGraphics.h │ │ │ ├── platformio.ini │ │ │ ├── variant.cpp │ │ │ └── variant.h │ │ ├── heltec_mesh_pocket/ │ │ │ ├── nicheGraphics.h │ │ │ ├── platformio.ini │ │ │ ├── variant.cpp │ │ │ └── variant.h │ │ ├── heltec_mesh_solar/ │ │ │ ├── nicheGraphics.h │ │ │ ├── platformio.ini │ │ │ ├── variant.cpp │ │ │ └── variant.h │ │ ├── meshlink/ │ │ │ ├── platformio.ini │ │ │ ├── variant.cpp │ │ │ └── variant.h │ │ ├── meshtiny/ │ │ │ ├── platformio.ini │ │ │ ├── variant.cpp │ │ │ └── variant.h │ │ ├── monteops_hw1/ │ │ │ ├── platformio.ini │ │ │ ├── variant.cpp │ │ │ └── variant.h │ │ ├── muzi_base/ │ │ │ ├── platformio.ini │ │ │ ├── rfswitch.h │ │ │ ├── variant.cpp │ │ │ └── variant.h │ │ ├── nano-g2-ultra/ │ │ │ ├── platformio.ini │ │ │ ├── variant.cpp │ │ │ └── variant.h │ │ ├── nrf52.ini │ │ ├── nrf52832.ini │ │ ├── nrf52840.ini │ │ ├── r1-neo/ │ │ │ ├── platformio.ini │ │ │ ├── variant.cpp │ │ │ └── variant.h │ │ ├── rak2560/ │ │ │ ├── platformio.ini │ │ │ ├── variant.cpp │ │ │ └── variant.h │ │ ├── rak3401_1watt/ │ │ │ ├── platformio.ini │ │ │ ├── variant.cpp │ │ │ └── variant.h │ │ ├── rak4631/ │ │ │ ├── platformio.ini │ │ │ ├── variant.cpp │ │ │ └── variant.h │ │ ├── rak4631_epaper/ │ │ │ ├── platformio.ini │ │ │ ├── variant.cpp │ │ │ └── variant.h │ │ ├── rak4631_epaper_onrxtx/ │ │ │ ├── platformio.ini │ │ │ ├── variant.cpp │ │ │ └── variant.h │ │ ├── rak4631_eth_gw/ │ │ │ ├── platformio.ini │ │ │ ├── variant.cpp │ │ │ └── variant.h │ │ ├── rak4631_nomadstar_meteor_pro/ │ │ │ ├── platformio.ini │ │ │ ├── variant.cpp │ │ │ └── variant.h │ │ ├── rak_wismeshtag/ │ │ │ ├── platformio.ini │ │ │ ├── variant.cpp │ │ │ └── variant.h │ │ ├── rak_wismeshtap/ │ │ │ ├── platformio.ini │ │ │ ├── variant.cpp │ │ │ └── variant.h │ │ ├── seeed_solar_node/ │ │ │ ├── platformio.ini │ │ │ ├── variant.cpp │ │ │ └── variant.h │ │ ├── seeed_wio_tracker_L1/ │ │ │ ├── platformio.ini │ │ │ ├── variant.cpp │ │ │ └── variant.h │ │ ├── seeed_wio_tracker_L1_eink/ │ │ │ ├── nicheGraphics.h │ │ │ ├── platformio.ini │ │ │ ├── variant.cpp │ │ │ └── variant.h │ │ ├── seeed_xiao_nrf52840_kit/ │ │ │ ├── platformio.ini │ │ │ ├── variant.cpp │ │ │ └── variant.h │ │ ├── t-echo/ │ │ │ ├── nicheGraphics.h │ │ │ ├── platformio.ini │ │ │ ├── variant.cpp │ │ │ └── variant.h │ │ ├── t-echo-lite/ │ │ │ ├── platformio.ini │ │ │ ├── variant.cpp │ │ │ └── variant.h │ │ ├── t-echo-plus/ │ │ │ ├── nicheGraphics.h │ │ │ ├── platformio.ini │ │ │ ├── variant.cpp │ │ │ └── variant.h │ │ ├── tracker-t1000-e/ │ │ │ ├── platformio.ini │ │ │ ├── rfswitch.h │ │ │ ├── variant.cpp │ │ │ └── variant.h │ │ ├── wio-sdk-wm1110/ │ │ │ ├── platformio.ini │ │ │ ├── rfswitch.h │ │ │ ├── variant.cpp │ │ │ └── variant.h │ │ ├── wio-t1000-s/ │ │ │ ├── platformio.ini │ │ │ ├── rfswitch.h │ │ │ ├── variant.cpp │ │ │ └── variant.h │ │ └── wio-tracker-wm1110/ │ │ ├── platformio.ini │ │ ├── rfswitch.h │ │ ├── variant.cpp │ │ └── variant.h │ ├── rp2040/ │ │ ├── challenger_2040_lora/ │ │ │ ├── pins_arduino.h │ │ │ ├── platformio.ini │ │ │ └── variant.h │ │ ├── ec_catsniffer/ │ │ │ ├── platformio.ini │ │ │ ├── variant.cpp │ │ │ └── variant.h │ │ ├── feather_rp2040_rfm95/ │ │ │ ├── platformio.ini │ │ │ └── variant.h │ │ ├── nibble_rp2040/ │ │ │ ├── platformio.ini │ │ │ └── variant.h │ │ ├── rak11310/ │ │ │ ├── pins_arduino.h │ │ │ ├── platformio.ini │ │ │ └── variant.h │ │ ├── rp2040-lora/ │ │ │ ├── platformio.ini │ │ │ └── variant.h │ │ ├── rp2040.ini │ │ ├── rpipico/ │ │ │ ├── platformio.ini │ │ │ └── variant.h │ │ ├── rpipico-slowclock/ │ │ │ ├── platformio.ini │ │ │ └── variant.h │ │ ├── rpipicow/ │ │ │ ├── platformio.ini │ │ │ └── variant.h │ │ └── senselora_rp2040/ │ │ ├── pins_arduino.h │ │ ├── platformio.ini │ │ └── variant.h │ ├── rp2350/ │ │ ├── rp2350.ini │ │ ├── rpipico2/ │ │ │ ├── platformio.ini │ │ │ └── variant.h │ │ └── rpipico2w/ │ │ ├── platformio.ini │ │ └── variant.h │ └── stm32/ │ ├── CDEBYTE_E77-MBL/ │ │ ├── platformio.ini │ │ ├── rfswitch.h │ │ └── variant.h │ ├── milesight_gs301/ │ │ ├── platformio.ini │ │ ├── rfswitch.h │ │ ├── variant.cpp │ │ └── variant.h │ ├── rak3172/ │ │ ├── platformio.ini │ │ ├── rfswitch.h │ │ └── variant.h │ ├── russell/ │ │ ├── platformio.ini │ │ ├── rfswitch.h │ │ └── variant.h │ ├── stm32.ini │ └── wio-e5/ │ ├── platformio.ini │ ├── rfswitch.h │ └── variant.h └── version.properties
Showing preview only (244K chars total). Download the full file or copy to clipboard to get everything.
SYMBOL INDEX (2514 symbols across 612 files)
FILE: .clusterfuzzlite/platformio-clusterfuzzlite-pre.py
function replaceStatic (line 24) | def replaceStatic(lib):
FILE: .clusterfuzzlite/router_fuzzer.cpp
class ShouldExitException (line 38) | class ShouldExitException : public std::runtime_error
function runLoopOnce (line 47) | void runLoopOnce()
function loopCanSleep (line 61) | bool loopCanSleep()
function lateInitVariant (line 77) | void lateInitVariant()
function LLVMFuzzerInitialize (line 133) | int LLVMFuzzerInitialize(int *argc, char ***argv)
function LLVMFuzzerTestOneInput (line 176) | int LLVMFuzzerTestOneInput(const uint8_t *data, size_t length)
FILE: .clusterfuzzlite/router_fuzzer_seed_corpus.py
function From (line 29) | def From(node: int = 9):
FILE: bin/analyze_map.py
function human_size (line 25) | def human_size(num_bytes: int) -> str:
function shorten_path (line 37) | def shorten_path(path: str, root: str) -> str:
function describe_object (line 58) | def describe_object(raw_object: str, root: str) -> Tuple[str, str]:
function parse_map (line 77) | def parse_map(map_path: str, repo_root: str) -> Tuple[Dict[str, int], Di...
function format_section_breakdown (line 111) | def format_section_breakdown(section_sizes: Dict[str, int], total: int, ...
function print_report (line 124) | def print_report(map_path: str, top_n: int, per_object: Dict[str, int], ...
function main (line 151) | def main() -> None:
FILE: bin/base64_to_hex.py
function base64_to_hex_string (line 4) | def base64_to_hex_string(b64_string):
FILE: bin/build-userprefs-json.py
function get_macros_from_header (line 5) | def get_macros_from_header(header_file):
function write_macros_to_json (line 21) | def write_macros_to_json(macros, output_file):
function main (line 25) | def main():
FILE: bin/bump_metainfo/bump_metainfo.py
function indent (line 9) | def indent(elem, level=0):
function main (line 22) | def main():
FILE: bin/exception_decoder.py
class ExceptionDataParser (line 98) | class ExceptionDataParser(object):
method __init__ (line 99) | def __init__(self):
method _parse_backtrace (line 116) | def _parse_backtrace(self, line):
method _parse_exception (line 125) | def _parse_exception(self, line):
method _parse_counters (line 132) | def _parse_counters(self, line):
method _parse_ctx (line 143) | def _parse_ctx(self, line):
method _parse_pointers (line 150) | def _parse_pointers(self, line):
method _parse_stack_begin (line 159) | def _parse_stack_begin(self, line):
method _parse_stack_line (line 164) | def _parse_stack_line(self, line):
method parse_file (line 182) | def parse_file(self, file, platform, stack_only=False):
class AddressResolver (line 200) | class AddressResolver(object):
method __init__ (line 201) | def __init__(self, tool_path, elf_path):
method _lookup (line 206) | def _lookup(self, addresses):
method fill (line 235) | def fill(self, parser):
method _sanitize_addr (line 250) | def _sanitize_addr(self, addr):
method resolve_addr (line 257) | def resolve_addr(self, addr):
method resolve_stack_addr (line 265) | def resolve_stack_addr(self, addr, full=True):
function print_addr (line 276) | def print_addr(name, value, resolver):
function print_stack_full (line 280) | def print_stack_full(lines, resolver):
function print_stack (line 288) | def print_stack(lines, resolver):
function print_result (line 298) | def print_result(parser, resolver, platform, full=True, stack_only=False):
function parse_args (line 326) | def parse_args():
FILE: bin/generate_release_notes.py
function get_last_release_tag (line 14) | def get_last_release_tag():
function get_tag_date (line 25) | def get_tag_date(tag):
function get_merged_prs_since_tag (line 36) | def get_merged_prs_since_tag(tag, branch):
function get_pr_details (line 68) | def get_pr_details(pr_number):
function should_exclude_pr (line 89) | def should_exclude_pr(pr_details):
function is_dependency_update (line 111) | def is_dependency_update(pr_details):
function is_enhancement (line 140) | def is_enhancement(pr_details):
function clean_title (line 161) | def clean_title(title):
function format_pr_line (line 192) | def format_pr_line(pr_details):
function get_new_contributors (line 201) | def get_new_contributors(pr_details_list, tag, repo="meshtastic/firmware"):
function main (line 270) | def main():
FILE: bin/platformio-custom.py
function infer_architecture (line 20) | def infer_architecture(board_cfg):
function manifest_gather (line 48) | def manifest_gather(source, target, env):
function manifest_write (line 103) | def manifest_write(files, env):
function get_display_resolution (line 264) | def get_display_resolution(build_flags):
function load_boot_logo (line 273) | def load_boot_logo(source, target, env):
function skip_manifest (line 307) | def skip_manifest(source, target, env):
FILE: bin/readprops.py
function readProps (line 7) | def readProps(prefsLoc):
FILE: bin/shame.py
function parseFile (line 6) | def parseFile(path):
FILE: bin/uf2conv.py
function is_uf2 (line 44) | def is_uf2(buf):
function is_hex (line 49) | def is_hex(buf):
function convert_from_uf2 (line 59) | def convert_from_uf2(buf):
function convert_to_carray (line 96) | def convert_to_carray(file_content):
function convert_to_uf2 (line 106) | def convert_to_uf2(file_content):
class Block (line 138) | class Block:
method __init__ (line 139) | def __init__(self, addr):
method encode (line 143) | def encode(self, blockno, numblocks):
function convert_from_hex_to_uf2 (line 166) | def convert_from_hex_to_uf2(buf):
function to_str (line 207) | def to_str(b):
function get_drives (line 211) | def get_drives():
function board_id (line 250) | def board_id(path):
function list_drives (line 256) | def list_drives():
function write_file (line 261) | def write_file(name, buf):
function main (line 267) | def main():
FILE: extra_scripts/esp32_extra.py
function esp32_create_combined_bin (line 22) | def esp32_create_combined_bin(source, target, env):
FILE: extra_scripts/esp32_pre.py
function _parse_size (line 12) | def _parse_size(value):
function _parse_partitions (line 25) | def _parse_partitions(env):
function mtjson_esp32_part (line 65) | def mtjson_esp32_part(target, source, env):
FILE: extra_scripts/nrf52_extra.py
function nrf52_hex_to_uf2 (line 13) | def nrf52_hex_to_uf2(source, target, env):
function nrf52_mergehex (line 26) | def nrf52_mergehex(source, target, env):
FILE: monitor/filter_c3_exception_decoder.py
class Esp32C3ExceptionDecoder (line 32) | class Esp32C3ExceptionDecoder(DeviceMonitorFilterBase):
method __call__ (line 37) | def __call__(self):
method setup_paths (line 54) | def setup_paths(self):
method rx (line 92) | def rx(self, text):
method get_backtrace (line 123) | def get_backtrace(self, match):
method strip_project_dir (line 143) | def strip_project_dir(self, trace):
FILE: src/AmbientLightingThread.h
function setLightingOff (line 132) | int setLightingOff(void *unused)
FILE: src/AudioThread.h
function class (line 22) | class AudioThread : public concurrency::OSThread
FILE: src/BluetoothCommon.h
function class (line 24) | class BluetoothApi
FILE: src/BluetoothStatus.h
function namespace (line 8) | namespace meshtastic
FILE: src/DebugConfiguration.cpp
function logLegacy (line 34) | void logLegacy(const char *level, const char *fmt, ...)
type meshtastic (line 44) | namespace meshtastic
function Syslog (line 56) | Syslog &Syslog::server(const char *server, uint16_t port)
function Syslog (line 67) | Syslog &Syslog::server(IPAddress ip, uint16_t port)
function Syslog (line 75) | Syslog &Syslog::deviceHostname(const char *deviceHostname)
function Syslog (line 81) | Syslog &Syslog::appName(const char *appName)
function Syslog (line 87) | Syslog &Syslog::defaultPriority(uint16_t pri)
function Syslog (line 93) | Syslog &Syslog::logMask(uint8_t priMask)
FILE: src/DebugConfiguration.h
function namespace (line 165) | namespace meshtastic
FILE: src/DisplayFormatters.h
function class (line 4) | class DisplayFormatters
FILE: src/FSCommon.cpp
function copyFile (line 40) | bool copyFile(const char *from, const char *to)
function renameFile (line 79) | bool renameFile(const char *pathFrom, const char *pathTo)
function getFiles (line 114) | std::vector<meshtastic_FileInfo> getFiles(const char *dirname, uint8_t l...
function listDir (line 163) | void listDir(const char *dirname, uint8_t levels, bool del)
function rmDir (line 268) | void rmDir(const char *dirname)
function preFSBegin (line 285) | __attribute__((weak, noinline)) void preFSBegin() {}
function fsInit (line 287) | void fsInit()
function setupSDCard (line 308) | void setupSDCard()
FILE: src/Fusion/FusionAhrs.c
function FusionAhrsInitialise (line 46) | void FusionAhrsInitialise(FusionAhrs *const ahrs)
function FusionAhrsReset (line 65) | void FusionAhrsReset(FusionAhrs *const ahrs)
function FusionAhrsSetSettings (line 87) | void FusionAhrsSetSettings(FusionAhrs *const ahrs, const FusionAhrsSetti...
function FusionAhrsUpdate (line 120) | void FusionAhrsUpdate(FusionAhrs *const ahrs, const FusionVector gyrosco...
function FusionVector (line 241) | static inline FusionVector HalfGravity(const FusionAhrs *const ahrs)
function FusionVector (line 272) | static inline FusionVector HalfMagnetic(const FusionAhrs *const ahrs)
function FusionVector (line 311) | static inline FusionVector Feedback(const FusionVector sensor, const Fus...
function Clamp (line 326) | static inline int Clamp(const int value, const int min, const int max)
function FusionAhrsUpdateNoMagnetometer (line 345) | void FusionAhrsUpdateNoMagnetometer(FusionAhrs *const ahrs, const Fusion...
function FusionAhrsUpdateExternalHeading (line 367) | void FusionAhrsUpdateExternalHeading(FusionAhrs *const ahrs, const Fusio...
function FusionQuaternion (line 394) | FusionQuaternion FusionAhrsGetQuaternion(const FusionAhrs *const ahrs)
function FusionAhrsSetQuaternion (line 404) | void FusionAhrsSetQuaternion(FusionAhrs *const ahrs, const FusionQuatern...
function FusionVector (line 415) | FusionVector FusionAhrsGetLinearAcceleration(const FusionAhrs *const ahrs)
function FusionVector (line 446) | FusionVector FusionAhrsGetEarthAcceleration(const FusionAhrs *const ahrs)
function FusionAhrsInternalStates (line 485) | FusionAhrsInternalStates FusionAhrsGetInternalStates(const FusionAhrs *c...
function FusionAhrsFlags (line 508) | FusionAhrsFlags FusionAhrsGetFlags(const FusionAhrs *const ahrs)
function FusionAhrsSetHeading (line 526) | void FusionAhrsSetHeading(FusionAhrs *const ahrs, const float heading)
FILE: src/Fusion/FusionAhrs.h
type FusionAhrsSettings (line 24) | typedef struct {
type FusionAhrs (line 37) | typedef struct {
type FusionAhrsInternalStates (line 58) | typedef struct {
type FusionAhrsFlags (line 70) | typedef struct {
FILE: src/Fusion/FusionAxes.h
type FusionAxesAlignment (line 24) | typedef enum {
function FusionVector (line 60) | static inline FusionVector FusionAxesSwap(const FusionVector sensor, con...
FILE: src/Fusion/FusionCalibration.h
function FusionVector (line 26) | static inline FusionVector FusionCalibrationInertial(const FusionVector ...
function FusionVector (line 40) | static inline FusionVector FusionCalibrationMagnetic(const FusionVector ...
FILE: src/Fusion/FusionCompass.c
function FusionCompassCalculateHeading (line 25) | float FusionCompassCalculateHeading(const FusionConvention convention, c...
FILE: src/Fusion/FusionConvention.h
type FusionConvention (line 16) | typedef enum {
FILE: src/Fusion/FusionMath.h
type FusionVector (line 23) | typedef union {
type FusionQuaternion (line 36) | typedef union {
type FusionMatrix (line 51) | typedef union {
type FusionEuler (line 71) | typedef union {
function FusionDegreesToRadians (line 127) | static inline float FusionDegreesToRadians(const float degrees)
function FusionRadiansToDegrees (line 137) | static inline float FusionRadiansToDegrees(const float radians)
function FusionAsin (line 150) | static inline float FusionAsin(const float value)
function FusionFastInverseSqrt (line 172) | static inline float FusionFastInverseSqrt(const float x)
function FusionVectorIsZero (line 195) | static inline bool FusionVectorIsZero(const FusionVector vector)
function FusionVector (line 206) | static inline FusionVector FusionVectorAdd(const FusionVector vectorA, c...
function FusionVector (line 222) | static inline FusionVector FusionVectorSubtract(const FusionVector vecto...
function FusionVectorSum (line 237) | static inline float FusionVectorSum(const FusionVector vector)
function FusionVector (line 248) | static inline FusionVector FusionVectorMultiplyScalar(const FusionVector...
function FusionVector (line 264) | static inline FusionVector FusionVectorHadamardProduct(const FusionVecto...
function FusionVector (line 280) | static inline FusionVector FusionVectorCrossProduct(const FusionVector v...
function FusionVectorDotProduct (line 300) | static inline float FusionVectorDotProduct(const FusionVector vectorA, c...
function FusionVectorMagnitudeSquared (line 310) | static inline float FusionVectorMagnitudeSquared(const FusionVector vector)
function FusionVectorMagnitude (line 320) | static inline float FusionVectorMagnitude(const FusionVector vector)
function FusionVector (line 330) | static inline FusionVector FusionVectorNormalise(const FusionVector vector)
function FusionQuaternion (line 349) | static inline FusionQuaternion FusionQuaternionAdd(const FusionQuaternio...
function FusionQuaternion (line 366) | static inline FusionQuaternion FusionQuaternionMultiply(const FusionQuat...
function FusionQuaternion (line 390) | static inline FusionQuaternion FusionQuaternionMultiplyVector(const Fusi...
function FusionQuaternion (line 410) | static inline FusionQuaternion FusionQuaternionNormalise(const FusionQua...
function FusionVector (line 437) | static inline FusionVector FusionMatrixMultiplyVector(const FusionMatrix...
function FusionMatrix (line 457) | static inline FusionMatrix FusionQuaternionToMatrix(const FusionQuaterni...
function FusionEuler (line 487) | static inline FusionEuler FusionQuaternionToEuler(const FusionQuaternion...
FILE: src/Fusion/FusionOffset.c
function FusionOffsetInitialise (line 40) | void FusionOffsetInitialise(FusionOffset *const offset, const unsigned i...
function FusionVector (line 55) | FusionVector FusionOffsetUpdate(FusionOffset *const offset, FusionVector...
FILE: src/Fusion/FusionOffset.h
type FusionOffset (line 23) | typedef struct {
FILE: src/GPSStatus.h
function namespace (line 7) | namespace meshtastic
FILE: src/GpioLogic.h
function class (line 16) | class GpioPin
function class (line 25) | class GpioHwPin : public GpioPin
function class (line 42) | class GpioVirtPin : public GpioPin
function class (line 64) | class GpioTransformer
function class (line 84) | class GpioUnaryTransformer : public GpioTransformer
function class (line 103) | class GpioNotTransformer : public GpioUnaryTransformer
function class (line 120) | class GpioBinaryTransformer : public GpioTransformer
function class (line 145) | class GpioSplitter : public GpioPin
FILE: src/MessageStore.cpp
function resetMessagePool (line 26) | static inline void resetMessagePool()
function storeTextInPool (line 41) | static inline uint16_t storeTextInPool(const char *src, size_t len)
function assignTimestamp (line 67) | static inline void assignTimestamp(StoredMessage &sm)
function pushWithLimit (line 80) | static inline void pushWithLimit(std::deque<T> &queue, const T &msg)
function pushWithLimit (line 87) | static inline void pushWithLimit(std::deque<T> &queue, T &&msg)
function autosaveIntervalMs (line 114) | static inline uint32_t autosaveIntervalMs()
function reachedMs (line 122) | static inline bool reachedMs(uint32_t now, uint32_t target)
function markMessageStoreUnsaved (line 128) | static inline void markMessageStoreUnsaved()
function autosaveTick (line 138) | static inline void autosaveTick(MessageStore *store)
function StoredMessage (line 165) | const StoredMessage &MessageStore::addFromPacket(const meshtastic_MeshPa...
type StoredMessageRecord (line 231) | struct __attribute__((packed)) StoredMessageRecord {
function writeMessageRecord (line 244) | static inline void writeMessageRecord(SafeFile &f, const StoredMessage &m)
function readMessageRecord (line 265) | static inline bool readMessageRecord(File &f, StoredMessage &m)
function eraseIf (line 376) | static void eraseIf(std::deque<StoredMessage> &deque, Predicate pred, bo...
function messageStoreAutosaveTick (line 505) | void messageStoreAutosaveTick()
FILE: src/MessageStore.h
type class (line 41) | enum class
type class (line 47) | enum class
type StoredMessage (line 55) | struct StoredMessage {
FILE: src/NodeStatus.h
function namespace (line 6) | namespace meshtastic
FILE: src/Observer.h
function addObserver (line 82) | void addObserver(Observer<T> *o) { observers.push_back(o); }
function removeObserver (line 84) | void removeObserver(Observer<T> *o) { observers.remove(o); }
FILE: src/Power.cpp
class HasBatteryLevel (line 149) | class HasBatteryLevel
method getBatteryPercent (line 155) | virtual int getBatteryPercent() { return -1; }
method getBattVoltage (line 160) | virtual uint16_t getBattVoltage() { return 0; }
method isBatteryConnect (line 165) | virtual bool isBatteryConnect() { return false; }
method isVbusIn (line 167) | virtual bool isVbusIn() { return false; }
method isCharging (line 168) | virtual bool isCharging() { return false; }
function battery_adcEnable (line 192) | void battery_adcEnable()
function battery_adcDisable (line 212) | static void battery_adcDisable()
class AnalogBatteryLevel (line 233) | class AnalogBatteryLevel : public HasBatteryLevel
method getBatteryPercent (line 239) | virtual int getBatteryPercent() override
method getBattVoltage (line 288) | virtual uint16_t getBattVoltage() override
method espAdcRead (line 362) | uint32_t espAdcRead()
method isBatteryConnect (line 423) | virtual bool isBatteryConnect() override { return true; }
method isBatteryConnect (line 425) | virtual bool isBatteryConnect() override
method isBatteryConnect (line 439) | virtual bool isBatteryConnect() override { return getBatteryPercent() ...
method isVbusIn (line 446) | virtual bool isVbusIn() override
method isCharging (line 476) | virtual bool isCharging() override
method getRAKVoltage (line 528) | uint16_t getRAKVoltage() { return rak9154Sensor.getBusVoltageMv(); }
method hasRAK (line 530) | bool hasRAK()
method getINAVoltage (line 539) | uint16_t getINAVoltage()
method getINACurrent (line 556) | int16_t getINACurrent()
method hasINA (line 570) | bool hasINA()
class MAX17048BatteryLevel (line 1328) | class MAX17048BatteryLevel : public HasBatteryLevel
method runOnce (line 1337) | bool runOnce()
method getBatteryPercent (line 1353) | virtual int getBatteryPercent() override { return max17048->getBusBatt...
method getBattVoltage (line 1358) | virtual uint16_t getBattVoltage() override { return max17048->getBusVo...
method isBatteryConnect (line 1363) | virtual bool isBatteryConnect() override { return max17048->isBatteryC...
method isVbusIn (line 1368) | virtual bool isVbusIn() override { return max17048->isExternallyPowere...
method isCharging (line 1373) | virtual bool isCharging() override { return max17048->isBatteryChargin...
class CW2015BatteryLevel (line 1403) | class CW2015BatteryLevel : public AnalogBatteryLevel
method getBatteryPercent (line 1409) | virtual int getBatteryPercent() override
method getBattVoltage (line 1425) | virtual uint16_t getBattVoltage() override
class LipoCharger (line 1487) | class LipoCharger : public HasBatteryLevel
method runOnce (line 1496) | bool runOnce()
method getBatteryPercent (line 1560) | virtual int getBatteryPercent() override
method getBattVoltage (line 1570) | virtual uint16_t getBattVoltage() override { return bq->getVoltage(); }
method isBatteryConnect (line 1575) | virtual bool isBatteryConnect() override { return PPM->getBattVoltage(...
method isVbusIn (line 1580) | virtual bool isVbusIn() override { return PPM->isVbusIn(); }
method isCharging (line 1585) | virtual bool isCharging() override
class meshSolarBatteryLevel (line 1630) | class meshSolarBatteryLevel : public HasBatteryLevel
method runOnce (line 1637) | bool runOnce()
method getBatteryPercent (line 1646) | virtual int getBatteryPercent() override { return meshSolarGetBatteryP...
method getBattVoltage (line 1651) | virtual uint16_t getBattVoltage() override { return meshSolarGetBattVo...
method isBatteryConnect (line 1656) | virtual bool isBatteryConnect() override { return meshSolarIsBatteryCo...
method isVbusIn (line 1661) | virtual bool isVbusIn() override { return meshSolarIsVbusIn(); }
method isCharging (line 1666) | virtual bool isCharging() override { return meshSolarIsCharging(); }
class SerialBatteryLevel (line 1701) | class SerialBatteryLevel : public HasBatteryLevel
method runOnce (line 1708) | bool runOnce()
method getBatteryPercent (line 1718) | virtual int getBatteryPercent() override { return v_percent; }
method getBattVoltage (line 1723) | virtual uint16_t getBattVoltage() override { return voltage * 1000; }
method isBatteryConnect (line 1728) | virtual bool isBatteryConnect() override
method isVbusIn (line 1768) | virtual bool isVbusIn() override
method isCharging (line 1778) | virtual bool isCharging() override
FILE: src/PowerFSM.cpp
function isPowered (line 34) | static bool isPowered()
function sdsEnter (line 61) | static void sdsEnter()
function lowBattSDSEnter (line 68) | static void lowBattSDSEnter()
function shutdownEnter (line 75) | static void shutdownEnter()
function lsEnter (line 85) | static void lsEnter()
function lsIdle (line 95) | static void lsIdle()
function lsExit (line 159) | static void lsExit()
function nbEnter (line 164) | static void nbEnter()
function darkEnter (line 177) | static void darkEnter()
function serialEnter (line 185) | static void serialEnter()
function serialExit (line 194) | static void serialExit()
function powerEnter (line 201) | static void powerEnter()
function powerIdle (line 216) | static void powerIdle()
function powerExit (line 226) | static void powerExit()
function onEnter (line 232) | static void onEnter()
function onIdle (line 240) | static void onIdle()
function bootEnter (line 249) | static void bootEnter()
function PowerFSM_setup (line 266) | void PowerFSM_setup()
FILE: src/PowerFSM.h
function class (line 32) | class FakeFsm
FILE: src/PowerFSMThread.h
function namespace (line 9) | namespace concurrency
FILE: src/PowerMon.cpp
function powerMonInit (line 44) | void powerMonInit()
FILE: src/PowerMon.h
function class (line 16) | class PowerMon
FILE: src/PowerStatus.h
function namespace (line 6) | namespace meshtastic
FILE: src/RedirectablePrint.cpp
function meshtastic_LogRecord_Level (line 254) | meshtastic_LogRecord_Level RedirectablePrint::getLogLevel(const char *lo...
FILE: src/RedirectablePrint.h
function class (line 14) | class RedirectablePrint : public Print
FILE: src/SPILock.cpp
function initSPI (line 8) | void initSPI()
FILE: src/SafeFile.cpp
function File (line 6) | static File openFile(const char *filename, bool fullAtomic)
FILE: src/SafeFile.h
function class (line 25) | class SafeFile : public Print
FILE: src/SerialConsole.cpp
function consoleInit (line 31) | void consoleInit()
function consolePrintf (line 44) | void consolePrintf(const char *format, ...)
FILE: src/SerialConsole.h
function virtual (line 25) | virtual size_t write(uint8_t c) override
FILE: src/Status.h
function namespace (line 12) | namespace meshtastic
FILE: src/airtime.h
type reportTypes (line 36) | enum reportTypes { TX_LOG, RX_LOG, RX_ALL_LOG }
function class (line 42) | class AirTime : private concurrency::OSThread
FILE: src/buzz/BuzzerFeedbackThread.h
function class (line 7) | class BuzzerFeedbackThread
FILE: src/buzz/buzz.cpp
type ToneDuration (line 13) | struct ToneDuration {
function playTones (line 53) | void playTones(const ToneDuration *tone_durations, int size)
function playBeep (line 74) | void playBeep()
function playLongBeep (line 80) | void playLongBeep()
function playGPSEnableBeep (line 86) | void playGPSEnableBeep()
function playGPSDisableBeep (line 97) | void playGPSDisableBeep()
function playStartMelody (line 109) | void playStartMelody()
function playShutdownMelody (line 115) | void playShutdownMelody()
function playChirp (line 121) | void playChirp()
function playClick (line 128) | void playClick()
function playBoop (line 135) | void playBoop()
function playLongPressLeadUp (line 142) | void playLongPressLeadUp()
function playNextLeadUpNote (line 164) | bool playNextLeadUpNote()
function resetLeadUpSequence (line 182) | void resetLeadUpSequence()
function playComboTune (line 187) | void playComboTune()
function play4ClickDown (line 201) | void play4ClickDown()
function play4ClickUp (line 208) | void play4ClickUp()
FILE: src/commands.h
function Cmd (line 6) | enum class Cmd {
FILE: src/concurrency/BinarySemaphoreFreeRTOS.cpp
type concurrency (line 7) | namespace concurrency
function IRAM_ATTR (line 33) | IRAM_ATTR void BinarySemaphoreFreeRTOS::giveFromISR(BaseType_t *pxHigh...
FILE: src/concurrency/BinarySemaphoreFreeRTOS.h
function namespace (line 5) | namespace concurrency
FILE: src/concurrency/BinarySemaphorePosix.cpp
type concurrency (line 6) | namespace concurrency
function IRAM_ATTR (line 24) | IRAM_ATTR void BinarySemaphorePosix::giveFromISR(BaseType_t *pxHigherP...
FILE: src/concurrency/BinarySemaphorePosix.h
function namespace (line 5) | namespace concurrency
FILE: src/concurrency/InterruptableDelay.cpp
type concurrency (line 4) | namespace concurrency
function IRAM_ATTR (line 30) | IRAM_ATTR void InterruptableDelay::interruptFromISR(BaseType_t *pxHigh...
FILE: src/concurrency/InterruptableDelay.h
function namespace (line 13) | namespace concurrency
FILE: src/concurrency/Lock.cpp
type concurrency (line 5) | namespace concurrency
FILE: src/concurrency/Lock.h
function namespace (line 5) | namespace concurrency
FILE: src/concurrency/LockGuard.cpp
type concurrency (line 4) | namespace concurrency
FILE: src/concurrency/LockGuard.h
function namespace (line 5) | namespace concurrency
FILE: src/concurrency/NotifiedWorkerThread.cpp
type concurrency (line 5) | namespace concurrency
function IRAM_ATTR (line 26) | IRAM_ATTR bool NotifiedWorkerThread::notifyCommon(uint32_t v, bool ove...
function IRAM_ATTR (line 51) | IRAM_ATTR bool NotifiedWorkerThread::notifyFromISR(BaseType_t *highPri...
FILE: src/concurrency/NotifiedWorkerThread.h
function namespace (line 6) | namespace concurrency
FILE: src/concurrency/OSThread.cpp
type concurrency (line 6) | namespace concurrency
function assertIsSetup (line 125) | void assertIsSetup()
FILE: src/concurrency/OSThread.h
function namespace (line 10) | namespace concurrency
FILE: src/concurrency/Periodic.h
function namespace (line 8) | namespace concurrency
FILE: src/detect/LoRaRadioType.h
type LoRaRadioType (line 3) | enum LoRaRadioType {
FILE: src/detect/ScanI2C.h
function class (line 6) | class ScanI2C
FILE: src/detect/ScanI2CConsumer.cpp
function ScanI2CCompleted (line 11) | void ScanI2CCompleted(ScanI2C *i2cScanner)
FILE: src/detect/ScanI2CConsumer.h
function class (line 6) | class ScanI2CConsumer
FILE: src/detect/ScanI2CTwoWire.cpp
function in_array (line 16) | bool in_array(uint8_t *array, int size, uint8_t lookfor)
function String (line 143) | String readSEN5xProductName(TwoWire *i2cBus, uint8_t address)
function TwoWire (line 765) | TwoWire *ScanI2CTwoWire::fetchI2CBus(ScanI2C::DeviceAddress address)
FILE: src/detect/ScanI2CTwoWire.h
function class (line 17) | class ScanI2CTwoWire : public ScanI2C
FILE: src/detect/einkScan.h
function d_writeCommand (line 7) | void d_writeCommand(uint8_t c)
function d_writeData (line 22) | void d_writeData(uint8_t d)
function d_waitWhileBusy (line 33) | unsigned long d_waitWhileBusy(uint16_t busy_time)
function scanEInkDevice (line 54) | void scanEInkDevice(void)
FILE: src/detect/reClockI2C.cpp
function reClockI2C (line 4) | uint32_t reClockI2C(uint32_t desiredClock, TwoWire *i2cBus, bool force)
FILE: src/freertosinc.h
type TickType_t (line 34) | typedef uint32_t TickType_t;
type BaseType_t (line 35) | typedef uint32_t BaseType_t;
type eNotifyAction (line 45) | enum eNotifyAction { eNoAction, eSetValueWithoutOverwrite, eSetValueWith...
FILE: src/gps/GPS.cpp
function array_count (line 36) | std::size_t array_count(const T (&)[N])
type uBloxGnssModelInfo (line 63) | struct uBloxGnssModelInfo {
function gpsSwitch (line 101) | static int32_t gpsSwitch()
function UBXChecksum (line 141) | static void UBXChecksum(uint8_t *message, size_t length)
function CASChecksum (line 157) | static void CASChecksum(uint8_t *message, size_t length)
function GPS_RESPONSE (line 234) | GPS_RESPONSE GPS::getACK(const char *message, uint32_t waitMillis)
function GPS_RESPONSE (line 270) | GPS_RESPONSE GPS::getACKCas(uint8_t class_id, uint8_t msg_id, uint32_t w...
function GPS_RESPONSE (line 331) | GPS_RESPONSE GPS::getACK(uint8_t class_id, uint8_t msg_id, uint32_t wait...
function GnssModel_t (line 1271) | GnssModel_t GPS::probe(int serialSpeed)
function GnssModel_t (line 1485) | GnssModel_t GPS::getProbeResponse(unsigned long timeout, const std::vect...
function toDegInt (line 1643) | static int32_t toDegInt(RawDegrees d)
type tm (line 1667) | struct tm
type tm (line 1797) | struct tm
FILE: src/gps/GPS.h
type GnssModel_t (line 29) | typedef enum {
type GPS_RESPONSE (line 48) | typedef enum {
type GPSPowerState (line 55) | enum GPSPowerState : uint8_t {
type ChipInfo (line 63) | struct ChipInfo {
function disable (line 99) | int32_t disable() override;
FILE: src/gps/GPSUpdateScheduling.h
function class (line 6) | class GPSUpdateScheduling
FILE: src/gps/GeoCoord.h
type DMS (line 18) | struct DMS {
type UTM (line 30) | struct UTM {
type MGRS (line 38) | struct MGRS {
type OSGR (line 48) | struct OSGR {
type OLC (line 56) | struct OLC {
function class (line 60) | class GeoCoord
FILE: src/gps/NMEAWPL.cpp
function printWPL (line 22) | uint32_t printWPL(char *buf, size_t bufsz, const meshtastic_PositionLite...
function printWPL (line 38) | uint32_t printWPL(char *buf, size_t bufsz, const meshtastic_Position &po...
function printGGA (line 75) | uint32_t printGGA(char *buf, size_t bufsz, const meshtastic_Position &pos)
FILE: src/gps/RTC.cpp
function RTCQuality (line 15) | RTCQuality getRTCQuality()
type timeval (line 31) | struct timeval
type timeval (line 171) | struct timeval
function RTCSetResult (line 315) | RTCSetResult perhapsSetRTC(RTCQuality q, const struct tm &t)
function getTZOffset (line 362) | int32_t getTZOffset()
function getTime (line 380) | uint32_t getTime(bool local)
function getValidTime (line 395) | uint32_t getValidTime(RTCQuality minQuality, bool local)
function time_t (line 400) | time_t gm_mktime(const struct tm *tm)
FILE: src/gps/RTC.h
type RTCQuality (line 11) | enum RTCQuality {
type RTCSetResult (line 31) | enum RTCSetResult {
type timeval (line 43) | struct timeval
type tm (line 44) | struct tm
type tm (line 57) | struct tm
FILE: src/graphics/EInkDisplay2.h
function class (line 34) | class EInkDisplay : public OLEDDisplay
FILE: src/graphics/EInkDynamicDisplay.h
function enableUnlimitedFastMode (line 28) | void enableUnlimitedFastMode() { addFrameFlag(UNLIMITED_FAST); }
function disableUnlimitedFastMode (line 29) | void disableUnlimitedFastMode() { frameFlags = (frameFlagTypes)(frameFla...
type frameFlagTypes (line 32) | enum frameFlagTypes : uint8_t {
function display (line 43) | void display() override;
FILE: src/graphics/EmoteRenderer.cpp
type graphics (line 8) | namespace graphics
type EmoteRenderer (line 10) | namespace EmoteRenderer
function getStringWidth (line 13) | static inline int getStringWidth(OLEDDisplay *display, const char *t...
function utf8CharLen (line 23) | size_t utf8CharLen(uint8_t c)
function isPossibleEmoteLead (line 34) | static inline bool isPossibleEmoteLead(uint8_t c)
function getUtf8ChunkWidth (line 40) | static inline int getUtf8ChunkWidth(OLEDDisplay *display, const char...
function isFE0FAt (line 49) | static inline bool isFE0FAt(const char *s, size_t pos, size_t len)
function isSkinToneAt (line 55) | static inline bool isSkinToneAt(const char *s, size_t pos, size_t len)
function ignorableModifierLenAt (line 62) | static inline size_t ignorableModifierLenAt(const char *s, size_t po...
function Emote (line 72) | const Emote *findEmoteByLabel(const char *label, const Emote *emoteS...
function matchAtIgnoringModifiers (line 85) | static bool matchAtIgnoringModifiers(const char *text, size_t textLe...
function Emote (line 142) | const Emote *findEmoteAt(const char *text, size_t textLen, size_t po...
function LineMetrics (line 186) | static LineMetrics analyzeLineInternal(OLEDDisplay *display, const c...
function LineMetrics (line 221) | LineMetrics analyzeLine(OLEDDisplay *display, const char *line, int ...
function maxEmoteHeight (line 227) | int maxEmoteHeight(const Emote *emoteSet, int emoteCount)
function measureStringWithEmotes (line 237) | int measureStringWithEmotes(OLEDDisplay *display, const char *line, ...
function appendTextSpanAndMeasure (line 248) | static int appendTextSpanAndMeasure(OLEDDisplay *display, int cursor...
function truncateToWidth (line 284) | size_t truncateToWidth(OLEDDisplay *display, const char *line, char ...
function drawStringWithEmotes (line 367) | void drawStringWithEmotes(OLEDDisplay *display, int x, int y, const ...
FILE: src/graphics/EmoteRenderer.h
function namespace (line 11) | namespace graphics
FILE: src/graphics/GxEPD2Multi.h
function nextPage (line 18) | bool nextPage()
function hibernate (line 26) | void hibernate()
function setRotation (line 50) | void setRotation(uint8_t x)
function setPartialWindow (line 58) | void setPartialWindow(uint16_t x, uint16_t y, uint16_t w, uint16_t h)
function setFullWindow (line 66) | void setFullWindow()
function width (line 74) | int16_t width()
function height (line 82) | int16_t height()
function endAsyncFull (line 98) | void endAsyncFull()
function class (line 107) | class Epd2Wrapper
FILE: src/graphics/Panel_sdl.cpp
type lgfx (line 36) | namespace lgfx
type v1 (line 38) | inline namespace v1
function heap_free (line 54) | static inline void heap_free(void *buf)
function monitor_t (line 61) | static monitor_t *const getMonitorByWindowID(uint32_t windowID)
function detectDebugger (line 203) | static int detectDebugger(bool *running)
function color_depth_t (line 371) | color_depth_t Panel_sdl::setColorDepth(color_depth_t depth)
function uint_fast8_t (line 455) | uint_fast8_t Panel_sdl::getTouchRaw(touch_point_t *tp, uint_fast8_t ...
FILE: src/graphics/Panel_sdl.hpp
type lgfx (line 39) | namespace lgfx
type v1 (line 41) | inline namespace v1
type Panel_sdl (line 44) | struct Panel_sdl
method gpio_hi (line 110) | static volatile void gpio_hi(uint32_t pin) { _gpio_dummy_values[pi...
method gpio_lo (line 111) | static volatile void gpio_lo(uint32_t pin) { _gpio_dummy_values[pi...
method gpio_in (line 112) | static volatile bool gpio_in(uint32_t pin) { return _gpio_dummy_va...
method setShortcutKeymod (line 120) | static void setShortcutKeymod(SDL_Keymod keymod) { _keymod = keymo...
type KeyCodeMapping_t (line 122) | struct KeyCodeMapping_t {
method sdl_invalidate (line 148) | void sdl_invalidate(void) { _invalidated = true; }
type lock_t (line 155) | struct lock_t {
type monitor_t (line 45) | struct monitor_t {
type Touch_sdl (line 69) | struct Touch_sdl : public ITouch {
method init (line 70) | bool init(void) override { return true; }
method wakeup (line 71) | void wakeup(void) override {}
method sleep (line 72) | void sleep(void) override {}
method isEnable (line 73) | bool isEnable(void) override { return true; }
method uint_fast8_t (line 74) | uint_fast8_t getTouchRaw(touch_point_t *tp, uint_fast8_t count) ov...
type Panel_sdl (line 79) | struct Panel_sdl : public Panel_FrameBufferBase {
method gpio_hi (line 110) | static volatile void gpio_hi(uint32_t pin) { _gpio_dummy_values[pi...
method gpio_lo (line 111) | static volatile void gpio_lo(uint32_t pin) { _gpio_dummy_values[pi...
method gpio_in (line 112) | static volatile bool gpio_in(uint32_t pin) { return _gpio_dummy_va...
method setShortcutKeymod (line 120) | static void setShortcutKeymod(SDL_Keymod keymod) { _keymod = keymo...
type KeyCodeMapping_t (line 122) | struct KeyCodeMapping_t {
method sdl_invalidate (line 148) | void sdl_invalidate(void) { _invalidated = true; }
type lock_t (line 155) | struct lock_t {
FILE: src/graphics/PointStruct.h
type PointStruct (line 1) | struct PointStruct {
FILE: src/graphics/Screen.cpp
type graphics (line 95) | namespace graphics
function drawModuleFrame (line 245) | static void drawModuleFrame(OLEDDisplay *display, OLEDDisplayUiState *...
function shouldWakeOnReceivedMessage (line 1852) | bool shouldWakeOnReceivedMessage()
FILE: src/graphics/Screen.h
function namespace (line 13) | namespace graphics
function namespace (line 33) | namespace graphics
function class (line 135) | class Point
function FrameDirection (line 172) | enum class FrameDirection { NEXT, PREVIOUS };
FILE: src/graphics/SharedUIDisplay.cpp
type graphics (line 16) | namespace graphics
function ScreenResolution (line 19) | ScreenResolution determineScreenResolution(int16_t screenheight, int16...
function decomposeTime (line 45) | void decomposeTime(uint32_t rtc_sec, int &hour, int &minute, int &second)
function drawRoundedHighlight (line 71) | void drawRoundedHighlight(OLEDDisplay *display, int16_t x, int16_t y, ...
function drawCommonHeader (line 88) | void drawCommonHeader(OLEDDisplay *display, int16_t x, int16_t y, cons...
function drawCommonFooter (line 427) | void drawCommonFooter(OLEDDisplay *display, int16_t x, int16_t y)
function isAllowedPunctuation (line 459) | bool isAllowedPunctuation(char c)
function replaceAll (line 465) | static void replaceAll(std::string &s, const std::string &from, const ...
function sanitizeString (line 476) | std::string sanitizeString(const std::string &input)
FILE: src/graphics/SharedUIDisplay.h
function namespace (line 6) | namespace graphics
FILE: src/graphics/TFTDisplay.cpp
class LGFX (line 32) | class LGFX : public lgfx::LGFX_Device
method LGFX (line 39) | LGFX(void)
method init_impl (line 149) | bool init_impl(bool use_reset, bool use_clear) override
method LGFX (line 173) | LGFX(void)
method LGFX (line 312) | LGFX(void)
method LGFX (line 498) | LGFX(void)
method LGFX (line 633) | LGFX(void)
method LGFX (line 727) | LGFX(void)
method LGFX (line 933) | LGFX(void)
method LGFX (line 1037) | LGFX(void)
function rak14014_tpIntHandle (line 122) | static void rak14014_tpIntHandle(void)
class LGFX (line 139) | class LGFX : public lgfx::LGFX_Device
method LGFX (line 39) | LGFX(void)
method init_impl (line 149) | bool init_impl(bool use_reset, bool use_clear) override
method LGFX (line 173) | LGFX(void)
method LGFX (line 312) | LGFX(void)
method LGFX (line 498) | LGFX(void)
method LGFX (line 633) | LGFX(void)
method LGFX (line 727) | LGFX(void)
method LGFX (line 933) | LGFX(void)
method LGFX (line 1037) | LGFX(void)
class LGFX (line 304) | class LGFX : public lgfx::LGFX_Device
method LGFX (line 39) | LGFX(void)
method init_impl (line 149) | bool init_impl(bool use_reset, bool use_clear) override
method LGFX (line 173) | LGFX(void)
method LGFX (line 312) | LGFX(void)
method LGFX (line 498) | LGFX(void)
method LGFX (line 633) | LGFX(void)
method LGFX (line 727) | LGFX(void)
method LGFX (line 933) | LGFX(void)
method LGFX (line 1037) | LGFX(void)
type lgfx (line 434) | namespace lgfx
type v1 (line 436) | inline namespace v1
class TOUCH_CHSC6X (line 438) | class TOUCH_CHSC6X : public ITouch
method TOUCH_CHSC6X (line 441) | TOUCH_CHSC6X(void)
method init (line 450) | bool init(void) override
method uint_fast8_t (line 459) | uint_fast8_t getTouchRaw(touch_point_t *tp, uint_fast8_t count) ov...
class LGFX (line 482) | class LGFX : public lgfx::LGFX_Device
method LGFX (line 39) | LGFX(void)
method init_impl (line 149) | bool init_impl(bool use_reset, bool use_clear) override
method LGFX (line 173) | LGFX(void)
method LGFX (line 312) | LGFX(void)
method LGFX (line 498) | LGFX(void)
method LGFX (line 633) | LGFX(void)
method LGFX (line 727) | LGFX(void)
method LGFX (line 933) | LGFX(void)
method LGFX (line 1037) | LGFX(void)
class LGFX (line 626) | class LGFX : public lgfx::LGFX_Device
method LGFX (line 39) | LGFX(void)
method init_impl (line 149) | bool init_impl(bool use_reset, bool use_clear) override
method LGFX (line 173) | LGFX(void)
method LGFX (line 312) | LGFX(void)
method LGFX (line 498) | LGFX(void)
method LGFX (line 633) | LGFX(void)
method LGFX (line 727) | LGFX(void)
method LGFX (line 933) | LGFX(void)
method LGFX (line 1037) | LGFX(void)
class LGFX (line 716) | class LGFX : public lgfx::LGFX_Device
method LGFX (line 39) | LGFX(void)
method init_impl (line 149) | bool init_impl(bool use_reset, bool use_clear) override
method LGFX (line 173) | LGFX(void)
method LGFX (line 312) | LGFX(void)
method LGFX (line 498) | LGFX(void)
method LGFX (line 633) | LGFX(void)
method LGFX (line 727) | LGFX(void)
method LGFX (line 933) | LGFX(void)
method LGFX (line 1037) | LGFX(void)
function LGFX (line 824) | LGFX(void)
method LGFX (line 39) | LGFX(void)
method init_impl (line 149) | bool init_impl(bool use_reset, bool use_clear) override
method LGFX (line 173) | LGFX(void)
method LGFX (line 312) | LGFX(void)
method LGFX (line 498) | LGFX(void)
method LGFX (line 633) | LGFX(void)
method LGFX (line 727) | LGFX(void)
method LGFX (line 933) | LGFX(void)
method LGFX (line 1037) | LGFX(void)
class LGFX (line 924) | class LGFX : public lgfx::LGFX_Device
method LGFX (line 39) | LGFX(void)
method init_impl (line 149) | bool init_impl(bool use_reset, bool use_clear) override
method LGFX (line 173) | LGFX(void)
method LGFX (line 312) | LGFX(void)
method LGFX (line 498) | LGFX(void)
method LGFX (line 633) | LGFX(void)
method LGFX (line 727) | LGFX(void)
method LGFX (line 933) | LGFX(void)
method LGFX (line 1037) | LGFX(void)
class PanelInit_ST7701 (line 1009) | class PanelInit_ST7701 : public lgfx::Panel_ST7701
class LGFX (line 1029) | class LGFX : public lgfx::LGFX_Device
method LGFX (line 39) | LGFX(void)
method init_impl (line 149) | bool init_impl(bool use_reset, bool use_clear) override
method LGFX (line 173) | LGFX(void)
method LGFX (line 312) | LGFX(void)
method LGFX (line 498) | LGFX(void)
method LGFX (line 633) | LGFX(void)
method LGFX (line 727) | LGFX(void)
method LGFX (line 933) | LGFX(void)
method LGFX (line 1037) | LGFX(void)
FILE: src/graphics/TFTDisplay.h
function class (line 15) | class TFTDisplay : public OLEDDisplay
FILE: src/graphics/TimeFormatters.cpp
function deltaToTimestamp (line 7) | bool deltaToTimestamp(uint32_t secondsAgo, uint8_t *hours, uint8_t *minu...
function getTimeAgoStr (line 76) | void getTimeAgoStr(uint32_t agoSecs, char *timeStr, uint8_t maxLength)
function getUptimeStr (line 105) | void getUptimeStr(uint32_t uptimeMillis, const char *prefix, char *uptim...
FILE: src/graphics/VirtualKeyboard.cpp
type graphics (line 11) | namespace graphics
FILE: src/graphics/VirtualKeyboard.h
function namespace (line 8) | namespace graphics
FILE: src/graphics/draw/ClockRenderer.cpp
type graphics (line 15) | namespace graphics
type ClockRenderer (line 18) | namespace ClockRenderer
function drawSegmentedDisplayColon (line 46) | void drawSegmentedDisplayColon(OLEDDisplay *display, int x, int y, f...
function drawSegmentedDisplayCharacter (line 64) | void drawSegmentedDisplayCharacter(OLEDDisplay *display, int x, int ...
function drawHorizontalSegment (line 114) | void drawHorizontalSegment(OLEDDisplay *display, int x, int y, int w...
function drawVerticalSegment (line 127) | void drawVerticalSegment(OLEDDisplay *display, int x, int y, int wid...
function drawDigitalClockFrame (line 140) | void drawDigitalClockFrame(OLEDDisplay *display, OLEDDisplayUiState ...
function drawAnalogClockFrame (line 294) | void drawAnalogClockFrame(OLEDDisplay *display, OLEDDisplayUiState *...
FILE: src/graphics/draw/ClockRenderer.h
function namespace (line 6) | namespace graphics
FILE: src/graphics/draw/CompassRenderer.cpp
type graphics (line 12) | namespace graphics
type CompassRenderer (line 14) | namespace CompassRenderer
type Point (line 18) | struct Point {
method Point (line 20) | Point(float x, float y) : x(x), y(y) {}
method rotate (line 22) | void rotate(float angle)
method scale (line 32) | void scale(float factor)
method translate (line 38) | void translate(float dx, float dy)
function drawCompassNorth (line 45) | void drawCompassNorth(OLEDDisplay *display, int16_t compassX, int16_...
function drawNodeHeading (line 71) | void drawNodeHeading(OLEDDisplay *display, int16_t compassX, int16_t...
function drawArrowToNode (line 93) | void drawArrowToNode(OLEDDisplay *display, int16_t x, int16_t y, int...
function estimatedHeading (line 116) | float estimatedHeading(double lat, double lon)
function getCompassDiam (line 123) | uint16_t getCompassDiam(uint32_t displayWidth, uint32_t displayHeight)
FILE: src/graphics/draw/CompassRenderer.h
function namespace (line 8) | namespace graphics
FILE: src/graphics/draw/DebugRenderer.cpp
type graphics (line 53) | namespace graphics
type DebugRenderer (line 55) | namespace DebugRenderer
function drawFrame (line 58) | void drawFrame(OLEDDisplay *display, OLEDDisplayUiState *state, int1...
function drawFrameWiFi (line 157) | void drawFrameWiFi(OLEDDisplay *display, OLEDDisplayUiState *state, ...
function drawFrameSettings (line 240) | void drawFrameSettings(OLEDDisplay *display, OLEDDisplayUiState *sta...
function drawDebugInfoTrampoline (line 355) | void drawDebugInfoTrampoline(OLEDDisplay *display, OLEDDisplayUiStat...
function drawDebugInfoSettingsTrampoline (line 360) | void drawDebugInfoSettingsTrampoline(OLEDDisplay *display, OLEDDispl...
function drawDebugInfoWiFiTrampoline (line 365) | void drawDebugInfoWiFiTrampoline(OLEDDisplay *display, OLEDDisplayUi...
function drawLoRaFocused (line 373) | void drawLoRaFocused(OLEDDisplay *display, OLEDDisplayUiState *state...
function drawSystemScreen (line 517) | void drawSystemScreen(OLEDDisplay *display, OLEDDisplayUiState *stat...
function drawChirpy (line 709) | void drawChirpy(OLEDDisplay *display, OLEDDisplayUiState *state, int...
FILE: src/graphics/draw/DebugRenderer.h
function namespace (line 6) | namespace graphics
FILE: src/graphics/draw/DrawRenderers.h
function namespace (line 16) | namespace graphics
FILE: src/graphics/draw/MenuHandler.cpp
type graphics (line 34) | namespace graphics
function BannerOverlayOptions (line 42) | BannerOverlayOptions createStaticBannerOptions(const char *message, co...
type optionsNumbers (line 70) | enum optionsNumbers { Back = 0, DeviceRolePicker = 1, RadioPresetPicke...
type optionsNumbers (line 94) | enum optionsNumbers { OK, got }
type optionsNumbers (line 204) | enum optionsNumbers {
type ReplyOptions (line 238) | enum ReplyOptions : int { Back = -1 }
type optionsNumbers (line 351) | enum optionsNumbers { Back = 0, twelve = 1, twentyfour = 2 }
type optionsNumbers (line 492) | enum optionsNumbers { Back = 0, Clock = 1, Time = 2, Timezone = 3 }
type optionsNumbers (line 513) | enum optionsNumbers { Back = 0, ViewMode, DeleteMenu, ReplyMenu, MuteC...
type replyOptions (line 601) | enum replyOptions { Back = 0, ReplyPreset, ReplyFreetext, enumEnd }
type optionsNumbers (line 696) | enum optionsNumbers { Back = 0, DeleteOldest, DeleteThis, DeleteAll, e...
type optionsNumbers (line 917) | enum optionsNumbers { Back, Mute, Backlight, Position, Preset, Freetex...
type optionsNumbers (line 1006) | enum optionsNumbers { Back, Preset, Freetext, enumEnd }
type optionsNumbers (line 1035) | enum optionsNumbers { Back, Notifications, ScreenOptions, Bluetooth, W...
type optionsNumbers (line 1110) | enum optionsNumbers { Back, Preset, Freetext, GoToChat, Remove, TraceR...
type PositionAction (line 1186) | enum class PositionAction {
type optionsNumbers (line 1277) | enum optionsNumbers { Back, NodePicker, TraceRoute, Verify, Reset, Nod...
type optionsNumbers (line 1338) | enum optionsNumbers { Back, Favorite, Mute, TraceRoute, KeyVerificatio...
type optionsNumbers (line 2200) | enum optionsNumbers { Back, NumberPicker, ShowChirpy }
type optionsNumbers (line 2240) | enum optionsNumbers { Back, Wifi_toggle }
type optionsNumbers (line 2258) | enum optionsNumbers { Back, Wifi_disable, Wifi_enable }
type optionsNumbers (line 2297) | enum optionsNumbers { Back, Brightness, ScreenColor, FrameToggles, Dis...
type optionsNumbers (line 2356) | enum optionsNumbers { Back, Reboot, Shutdown, MUI }
type optionsNumbers (line 2431) | enum optionsNumbers {
type optionsNumbers (line 2575) | enum optionsNumbers { Back, MetricUnits, ImperialUnits }
type optionsNumbers (line 2603) | enum optionsNumbers { Back, ShowBubbles, HideBubbles }
FILE: src/graphics/draw/MenuHandler.h
function class (line 7) | class menuHandler
type class (line 123) | enum class
type ScreenColor (line 139) | struct ScreenColor {
FILE: src/graphics/draw/MessageRenderer.cpp
type graphics (line 29) | namespace graphics
type MessageRenderer (line 31) | namespace MessageRenderer
function scrollUp (line 48) | void scrollUp()
function scrollDown (line 56) | void scrollDown()
function drawStringWithEmotes (line 74) | void drawStringWithEmotes(OLEDDisplay *display, int x, int y, const ...
function resetScrollState (line 80) | void resetScrollState()
function nudgeScroll (line 91) | void nudgeScroll(int8_t direction)
function clearMessageCache (line 134) | void clearMessageCache()
function clearThreadRegistries (line 153) | void clearThreadRegistries()
function setThreadMode (line 160) | void setThreadMode(ThreadMode mode, int channel /* = -1 */, uint32_t...
function ThreadMode (line 182) | ThreadMode getThreadMode()
function getThreadChannel (line 187) | int getThreadChannel()
function getThreadPeer (line 192) | uint32_t getThreadPeer()
function centerYForRow (line 207) | static int centerYForRow(int y, int size)
function drawCheckMark (line 214) | static void drawCheckMark(OLEDDisplay *display, int x, int y, int size)
function drawXMark (line 224) | static void drawXMark(OLEDDisplay *display, int x, int y, int size = 8)
function drawRelayMark (line 234) | static void drawRelayMark(OLEDDisplay *display, int x, int y, int si...
function getRenderedLineWidth (line 246) | static inline int getRenderedLineWidth(OLEDDisplay *display, const s...
type MessageBlock (line 251) | struct MessageBlock {
function getDrawnLinePixelBottom (line 257) | static int getDrawnLinePixelBottom(int lineTopY, const std::string &...
function buildMessageBlocks (line 271) | static std::vector<MessageBlock> buildMessageBlocks(const std::vecto...
function drawMessageScrollbar (line 302) | static void drawMessageScrollbar(OLEDDisplay *display, int visibleHe...
function drawTextMessageFrame (line 318) | void drawTextMessageFrame(OLEDDisplay *display, OLEDDisplayUiState *...
function generateLines (line 815) | std::vector<std::string> generateLines(OLEDDisplay *display, const c...
function calculateLineHeights (line 862) | std::vector<int> calculateLineHeights(const std::vector<std::string>...
function handleNewMessage (line 922) | void handleNewMessage(OLEDDisplay *display, const StoredMessage &sm,...
function setThreadFor (line 1033) | void setThreadFor(const StoredMessage &sm, const meshtastic_MeshPack...
FILE: src/graphics/draw/MessageRenderer.h
function namespace (line 14) | namespace MessageRenderer
FILE: src/graphics/draw/NodeListRenderer.cpp
type graphics (line 16) | namespace graphics
type NodeListRenderer (line 29) | namespace NodeListRenderer
function drawScaledXBitmap16x16 (line 33) | void drawScaledXBitmap16x16(int x, int y, int width, int height, con...
function scrollUp (line 64) | void scrollUp()
function scrollDown (line 72) | void scrollDown()
function getSafeNodeName (line 82) | std::string getSafeNodeName(OLEDDisplay *display, meshtastic_NodeInf...
function getNodeNameMaxWidth (line 136) | static int getNodeNameMaxWidth(int columnWidth, int baseWidth)
function getModeCycleIntervalMs (line 146) | unsigned long getModeCycleIntervalMs()
function calculateMaxScroll (line 151) | int calculateMaxScroll(int totalEntries, int visibleRows)
function drawColumnSeparator (line 156) | void drawColumnSeparator(OLEDDisplay *display, int16_t x, int16_t yS...
function drawScrollbar (line 164) | void drawScrollbar(OLEDDisplay *display, int visibleNodeRows, int to...
function drawEntryLastHeard (line 184) | void drawEntryLastHeard(OLEDDisplay *display, meshtastic_NodeInfoLit...
function drawEntryHopSignal (line 236) | void drawEntryHopSignal(OLEDDisplay *display, meshtastic_NodeInfoLit...
function drawNodeDistance (line 296) | void drawNodeDistance(OLEDDisplay *display, meshtastic_NodeInfoLite ...
function drawEntryDynamic_Nodes (line 386) | void drawEntryDynamic_Nodes(OLEDDisplay *display, meshtastic_NodeInf...
function drawEntryCompass (line 400) | void drawEntryCompass(OLEDDisplay *display, meshtastic_NodeInfoLite ...
function drawCompassArrow (line 434) | void drawCompassArrow(OLEDDisplay *display, meshtastic_NodeInfoLite ...
function drawNodeListScreen (line 487) | void drawNodeListScreen(OLEDDisplay *display, OLEDDisplayUiState *st...
function drawDynamicListScreen_Nodes (line 665) | void drawDynamicListScreen_Nodes(OLEDDisplay *display, OLEDDisplayUi...
function drawDynamicListScreen_Location (line 701) | void drawDynamicListScreen_Location(OLEDDisplay *display, OLEDDispla...
function drawLastHeardScreen (line 744) | void drawLastHeardScreen(OLEDDisplay *display, OLEDDisplayUiState *s...
function drawHopSignalScreen (line 750) | void drawHopSignalScreen(OLEDDisplay *display, OLEDDisplayUiState *s...
function drawDistanceScreen (line 760) | void drawDistanceScreen(OLEDDisplay *display, OLEDDisplayUiState *st...
function drawNodeListWithCompasses (line 766) | void drawNodeListWithCompasses(OLEDDisplay *display, OLEDDisplayUiSt...
function drawColumns (line 800) | void drawColumns(OLEDDisplay *display, int16_t x, int16_t y, const c...
type graphics (line 27) | namespace graphics
type NodeListRenderer (line 29) | namespace NodeListRenderer
function drawScaledXBitmap16x16 (line 33) | void drawScaledXBitmap16x16(int x, int y, int width, int height, con...
function scrollUp (line 64) | void scrollUp()
function scrollDown (line 72) | void scrollDown()
function getSafeNodeName (line 82) | std::string getSafeNodeName(OLEDDisplay *display, meshtastic_NodeInf...
function getNodeNameMaxWidth (line 136) | static int getNodeNameMaxWidth(int columnWidth, int baseWidth)
function getModeCycleIntervalMs (line 146) | unsigned long getModeCycleIntervalMs()
function calculateMaxScroll (line 151) | int calculateMaxScroll(int totalEntries, int visibleRows)
function drawColumnSeparator (line 156) | void drawColumnSeparator(OLEDDisplay *display, int16_t x, int16_t yS...
function drawScrollbar (line 164) | void drawScrollbar(OLEDDisplay *display, int visibleNodeRows, int to...
function drawEntryLastHeard (line 184) | void drawEntryLastHeard(OLEDDisplay *display, meshtastic_NodeInfoLit...
function drawEntryHopSignal (line 236) | void drawEntryHopSignal(OLEDDisplay *display, meshtastic_NodeInfoLit...
function drawNodeDistance (line 296) | void drawNodeDistance(OLEDDisplay *display, meshtastic_NodeInfoLite ...
function drawEntryDynamic_Nodes (line 386) | void drawEntryDynamic_Nodes(OLEDDisplay *display, meshtastic_NodeInf...
function drawEntryCompass (line 400) | void drawEntryCompass(OLEDDisplay *display, meshtastic_NodeInfoLite ...
function drawCompassArrow (line 434) | void drawCompassArrow(OLEDDisplay *display, meshtastic_NodeInfoLite ...
function drawNodeListScreen (line 487) | void drawNodeListScreen(OLEDDisplay *display, OLEDDisplayUiState *st...
function drawDynamicListScreen_Nodes (line 665) | void drawDynamicListScreen_Nodes(OLEDDisplay *display, OLEDDisplayUi...
function drawDynamicListScreen_Location (line 701) | void drawDynamicListScreen_Location(OLEDDisplay *display, OLEDDispla...
function drawLastHeardScreen (line 744) | void drawLastHeardScreen(OLEDDisplay *display, OLEDDisplayUiState *s...
function drawHopSignalScreen (line 750) | void drawHopSignalScreen(OLEDDisplay *display, OLEDDisplayUiState *s...
function drawDistanceScreen (line 760) | void drawDistanceScreen(OLEDDisplay *display, OLEDDisplayUiState *st...
function drawNodeListWithCompasses (line 766) | void drawNodeListWithCompasses(OLEDDisplay *display, OLEDDisplayUiSt...
function drawColumns (line 800) | void drawColumns(OLEDDisplay *display, int16_t x, int16_t y, const c...
FILE: src/graphics/draw/NodeListRenderer.h
function namespace (line 9) | namespace graphics
FILE: src/graphics/draw/NotificationRenderer.cpp
type graphics (line 40) | namespace graphics
function pow_of_10 (line 58) | uint32_t pow_of_10(uint32_t n)
FILE: src/graphics/draw/NotificationRenderer.h
function namespace (line 12) | namespace graphics
FILE: src/graphics/draw/UIRenderer.cpp
type graphics (line 26) | namespace graphics
function drawSatelliteIcon (line 31) | static inline void drawSatelliteIcon(OLEDDisplay *display, int16_t x, ...
function isLeapYear (line 941) | constexpr bool isLeapYear(int year)
FILE: src/graphics/draw/UIRenderer.h
function namespace (line 14) | namespace meshtastic
function namespace (line 21) | namespace graphics
FILE: src/graphics/emotes.cpp
type graphics (line 5) | namespace graphics
FILE: src/graphics/emotes.h
function namespace (line 4) | namespace graphics
FILE: src/graphics/niche/Drivers/Backlight/LatchingBacklight.cpp
function LatchingBacklight (line 20) | LatchingBacklight *LatchingBacklight::getInstance()
FILE: src/graphics/niche/Drivers/Backlight/LatchingBacklight.h
function namespace (line 18) | namespace NicheGraphics::Drivers
FILE: src/graphics/niche/Drivers/EInk/DEPG0213BNS800.h
function namespace (line 22) | namespace NicheGraphics::Drivers
FILE: src/graphics/niche/Drivers/EInk/DEPG0290BNS800.h
function namespace (line 20) | namespace NicheGraphics::Drivers
FILE: src/graphics/niche/Drivers/EInk/E0213A367.h
function namespace (line 20) | namespace NicheGraphics::Drivers
FILE: src/graphics/niche/Drivers/EInk/EInk.h
function namespace (line 15) | namespace NicheGraphics::Drivers
FILE: src/graphics/niche/Drivers/EInk/GDEW0102T4.h
function namespace (line 19) | namespace NicheGraphics::Drivers
FILE: src/graphics/niche/Drivers/EInk/GDEY0154D67.h
function namespace (line 20) | namespace NicheGraphics::Drivers
FILE: src/graphics/niche/Drivers/EInk/GDEY0213B74.h
function namespace (line 22) | namespace NicheGraphics::Drivers
FILE: src/graphics/niche/Drivers/EInk/HINK_E0213A289.h
function namespace (line 22) | namespace NicheGraphics::Drivers
FILE: src/graphics/niche/Drivers/EInk/HINK_E042A87.h
function namespace (line 23) | namespace NicheGraphics::Drivers
FILE: src/graphics/niche/Drivers/EInk/LCMEN2R13ECC1.h
function namespace (line 19) | namespace NicheGraphics::Drivers
FILE: src/graphics/niche/Drivers/EInk/LCMEN2R13EFC1.h
function namespace (line 23) | namespace NicheGraphics::Drivers
FILE: src/graphics/niche/Drivers/EInk/SSD1682.h
function namespace (line 18) | namespace NicheGraphics::Drivers
FILE: src/graphics/niche/Drivers/EInk/SSD16XX.h
function namespace (line 19) | namespace NicheGraphics::Drivers
FILE: src/graphics/niche/Drivers/EInk/UC8175.h
function namespace (line 11) | namespace NicheGraphics::Drivers
FILE: src/graphics/niche/Drivers/EInk/ZJY122250_0213BAAMFGN.h
function namespace (line 20) | namespace NicheGraphics::Drivers
FILE: src/graphics/niche/Drivers/EInk/ZJY128296_029EAAMFGN.h
function namespace (line 22) | namespace NicheGraphics::Drivers
FILE: src/graphics/niche/Drivers/EInk/ZJY200200_0154DAAMFGN.h
function namespace (line 25) | namespace NicheGraphics::Drivers
FILE: src/graphics/niche/InkHUD/Applet.cpp
type Point (line 868) | struct Point {
FILE: src/graphics/niche/InkHUD/Applet.h
function namespace (line 27) | namespace NicheGraphics::InkHUD
FILE: src/graphics/niche/InkHUD/AppletFont.h
function namespace (line 17) | namespace NicheGraphics::InkHUD
FILE: src/graphics/niche/InkHUD/Applets/Bases/Map/MapApplet.h
function namespace (line 24) | namespace NicheGraphics::InkHUD
FILE: src/graphics/niche/InkHUD/Applets/Bases/NodeList/NodeListApplet.cpp
function ProcessMessage (line 40) | ProcessMessage InkHUD::NodeListApplet::handleReceived(const meshtastic_M...
FILE: src/graphics/niche/InkHUD/Applets/Bases/NodeList/NodeListApplet.h
function namespace (line 28) | namespace NicheGraphics::InkHUD
FILE: src/graphics/niche/InkHUD/Applets/Examples/BasicExample/BasicExampleApplet.h
function namespace (line 22) | namespace NicheGraphics::InkHUD
FILE: src/graphics/niche/InkHUD/Applets/Examples/NewMsgExample/NewMsgExampleApplet.cpp
function ProcessMessage (line 8) | ProcessMessage InkHUD::NewMsgExampleApplet::handleReceived(const meshtas...
FILE: src/graphics/niche/InkHUD/Applets/Examples/NewMsgExample/NewMsgExampleApplet.h
function namespace (line 27) | namespace NicheGraphics::InkHUD
FILE: src/graphics/niche/InkHUD/Applets/Examples/UserAppletInputExample/UserAppletInputExample.h
function namespace (line 9) | namespace NicheGraphics::InkHUD
FILE: src/graphics/niche/InkHUD/Applets/System/AlignStick/AlignStickApplet.h
function namespace (line 18) | namespace NicheGraphics::InkHUD
FILE: src/graphics/niche/InkHUD/Applets/System/BatteryIcon/BatteryIconApplet.h
function namespace (line 18) | namespace NicheGraphics::InkHUD
FILE: src/graphics/niche/InkHUD/Applets/System/Keyboard/KeyboardApplet.h
function namespace (line 15) | namespace NicheGraphics::InkHUD
FILE: src/graphics/niche/InkHUD/Applets/System/Logo/LogoApplet.h
function namespace (line 17) | namespace NicheGraphics::InkHUD
FILE: src/graphics/niche/InkHUD/Applets/System/Menu/MenuAction.h
function namespace (line 16) | namespace NicheGraphics::InkHUD
FILE: src/graphics/niche/InkHUD/Applets/System/Menu/MenuApplet.cpp
type PositionPrecisionOption (line 30) | struct PositionPrecisionOption {
function applyLoRaRegion (line 170) | static void applyLoRaRegion(meshtastic_Config_LoRaConfig_RegionCode region)
function applyDeviceRole (line 204) | static void applyDeviceRole(meshtastic_Config_DeviceConfig_Role role)
function applyLoRaPreset (line 221) | static void applyLoRaPreset(meshtastic_Config_LoRaConfig_ModemPreset pre...
function applyTimezone (line 284) | static void applyTimezone(const char *tz)
FILE: src/graphics/niche/InkHUD/Applets/System/Menu/MenuApplet.h
function namespace (line 17) | namespace NicheGraphics::InkHUD
FILE: src/graphics/niche/InkHUD/Applets/System/Menu/MenuItem.h
function namespace (line 22) | namespace NicheGraphics::InkHUD
FILE: src/graphics/niche/InkHUD/Applets/System/Menu/MenuPage.h
function namespace (line 14) | namespace NicheGraphics::InkHUD
FILE: src/graphics/niche/InkHUD/Applets/System/Notification/Notification.h
function namespace (line 16) | namespace NicheGraphics::InkHUD
FILE: src/graphics/niche/InkHUD/Applets/System/Notification/NotificationApplet.h
function namespace (line 21) | namespace NicheGraphics::InkHUD
FILE: src/graphics/niche/InkHUD/Applets/System/Pairing/PairingApplet.h
function namespace (line 17) | namespace NicheGraphics::InkHUD
FILE: src/graphics/niche/InkHUD/Applets/System/Placeholder/PlaceholderApplet.h
function namespace (line 14) | namespace NicheGraphics::InkHUD
FILE: src/graphics/niche/InkHUD/Applets/System/Tips/TipsApplet.h
function namespace (line 17) | namespace NicheGraphics::InkHUD
FILE: src/graphics/niche/InkHUD/Applets/User/AllMessage/AllMessageApplet.h
function namespace (line 25) | namespace NicheGraphics::InkHUD
FILE: src/graphics/niche/InkHUD/Applets/User/DM/DMApplet.h
function namespace (line 25) | namespace NicheGraphics::InkHUD
FILE: src/graphics/niche/InkHUD/Applets/User/FavoritesMap/FavoritesMapApplet.cpp
function ProcessMessage (line 33) | ProcessMessage InkHUD::FavoritesMapApplet::handleReceived(const meshtast...
FILE: src/graphics/niche/InkHUD/Applets/User/FavoritesMap/FavoritesMapApplet.h
function namespace (line 20) | namespace NicheGraphics::InkHUD
FILE: src/graphics/niche/InkHUD/Applets/User/Heard/HeardApplet.h
function namespace (line 16) | namespace NicheGraphics::InkHUD
FILE: src/graphics/niche/InkHUD/Applets/User/Positions/PositionsApplet.cpp
function ProcessMessage (line 24) | ProcessMessage InkHUD::PositionsApplet::handleReceived(const meshtastic_...
FILE: src/graphics/niche/InkHUD/Applets/User/Positions/PositionsApplet.h
function namespace (line 20) | namespace NicheGraphics::InkHUD
FILE: src/graphics/niche/InkHUD/Applets/User/RecentsList/RecentsListApplet.h
function namespace (line 18) | namespace NicheGraphics::InkHUD
FILE: src/graphics/niche/InkHUD/Applets/User/ThreadedMessage/ThreadedMessageApplet.cpp
function ProcessMessage (line 187) | ProcessMessage InkHUD::ThreadedMessageApplet::handleReceived(const mesht...
FILE: src/graphics/niche/InkHUD/Applets/User/ThreadedMessage/ThreadedMessageApplet.h
function namespace (line 28) | namespace NicheGraphics::InkHUD
FILE: src/graphics/niche/InkHUD/DisplayHealth.h
function namespace (line 21) | namespace NicheGraphics::InkHUD
FILE: src/graphics/niche/InkHUD/Events.h
function namespace (line 21) | namespace NicheGraphics::InkHUD
FILE: src/graphics/niche/InkHUD/InkHUD.h
function namespace (line 21) | namespace NicheGraphics::InkHUD
FILE: src/graphics/niche/InkHUD/MessageStore.h
function namespace (line 19) | namespace NicheGraphics::InkHUD
FILE: src/graphics/niche/InkHUD/Persistence.h
function namespace (line 21) | namespace NicheGraphics::InkHUD
FILE: src/graphics/niche/InkHUD/Renderer.h
function namespace (line 22) | namespace NicheGraphics::InkHUD
FILE: src/graphics/niche/InkHUD/SystemApplet.h
function namespace (line 17) | namespace NicheGraphics::InkHUD
FILE: src/graphics/niche/InkHUD/Tile.cpp
function runtaskHighlight (line 16) | static int32_t runtaskHighlight()
function inittaskHighlight (line 24) | static void inittaskHighlight()
FILE: src/graphics/niche/InkHUD/Tile.h
function namespace (line 20) | namespace NicheGraphics::InkHUD
FILE: src/graphics/niche/InkHUD/WindowManager.h
function namespace (line 18) | namespace NicheGraphics::InkHUD
FILE: src/graphics/niche/Inputs/TwoButton.cpp
function TwoButton (line 30) | TwoButton *TwoButton::getInstance()
FILE: src/graphics/niche/Inputs/TwoButton.h
function namespace (line 25) | namespace NicheGraphics::Inputs
FILE: src/graphics/niche/Inputs/TwoButtonExtended.cpp
function TwoButtonExtended (line 34) | TwoButtonExtended *TwoButtonExtended::getInstance()
FILE: src/graphics/niche/Inputs/TwoButtonExtended.h
function namespace (line 33) | namespace NicheGraphics::Inputs
FILE: src/graphics/niche/Utils/CannedMessageStore.cpp
function CannedMessageStore (line 26) | CannedMessageStore *CannedMessageStore::getInstance()
FILE: src/graphics/niche/Utils/CannedMessageStore.h
function namespace (line 25) | namespace NicheGraphics
FILE: src/graphics/niche/Utils/FlashData.h
function namespace (line 19) | namespace NicheGraphics
FILE: src/graphics/tftSetup.cpp
function tft_task_handler (line 27) | void tft_task_handler(void *param = nullptr)
function tftSetup (line 37) | void tftSetup(void)
FILE: src/input/BBQ10Keyboard.h
function class (line 11) | class BBQ10Keyboard
FILE: src/input/ButtonThread.h
function isHeld (line 10) | struct ButtonConfig {
FILE: src/input/CardputerKeyboard.h
function class (line 3) | class CardputerKeyboard : public TCA8418KeyboardBase
FILE: src/input/ExpressLRSFiveWay.h
type KeyType (line 42) | typedef enum {
type PressLength (line 52) | typedef enum { SHORT, LONG } PressLength;
function inCannedMessageMenu (line 67) | inline bool inCannedMessageMenu() { return cannedMessageModule->shouldDr...
FILE: src/input/HackadayCommunicatorKeyboard.h
function class (line 3) | class HackadayCommunicatorKeyboard : public TCA8418KeyboardBase
FILE: src/input/InputBroker.h
type input_broker_event (line 13) | enum input_broker_event {
type InputEvent (line 51) | typedef struct _InputEvent {
function class (line 59) | class InputPollable
function injectInputEvent (line 75) | void injectInputEvent(const InputEvent *event) { handleInputEvent(event); }
FILE: src/input/LinuxInput.cpp
type input_event (line 72) | struct input_event
type input_event (line 74) | struct input_event
type input_event (line 75) | struct input_event
FILE: src/input/LinuxInput.h
type epoll_event (line 40) | struct epoll_event
type epoll_event (line 45) | struct epoll_event
FILE: src/input/LinuxInputImpl.h
function class (line 14) | class LinuxInputImpl : public LinuxInput
FILE: src/input/MPR121Keyboard.h
function class (line 8) | class MPR121Keyboard
FILE: src/input/RotaryEncoderInterruptBase.cpp
function RotaryEncoderInterruptBaseStateType (line 140) | RotaryEncoderInterruptBaseStateType RotaryEncoderInterruptBase::intHandl...
FILE: src/input/RotaryEncoderInterruptBase.h
type RotaryEncoderInterruptBaseStateType (line 7) | enum RotaryEncoderInterruptBaseStateType { ROTARY_EVENT_OCCURRED, ROTARY...
type RotaryEncoderInterruptBaseActionType (line 9) | enum RotaryEncoderInterruptBaseActionType { ROTARY_ACTION_NONE, ROTARY_A...
FILE: src/input/RotaryEncoderInterruptImpl1.h
function class (line 11) | class RotaryEncoderInterruptImpl1 : public RotaryEncoderInterruptBase
FILE: src/input/SerialKeyboardImpl.h
function class (line 12) | class SerialKeyboardImpl : public SerialKeyboard
FILE: src/input/TCA8418Keyboard.h
function class (line 6) | class TCA8418Keyboard : public TCA8418KeyboardBase
FILE: src/input/TCA8418KeyboardBase.h
function class (line 11) | class TCA8418KeyboardBase
FILE: src/input/TDeckProKeyboard.h
function class (line 3) | class TDeckProKeyboard : public TCA8418KeyboardBase
FILE: src/input/TLoraPagerKeyboard.h
function class (line 3) | class TLoraPagerKeyboard : public TCA8418KeyboardBase
FILE: src/input/TouchScreenBase.h
type TouchEvent (line 8) | typedef struct _TouchEvent {
type TouchScreenBaseStateType (line 22) | enum TouchScreenBaseStateType { TOUCH_EVENT_OCCURRED, TOUCH_EVENT_CLEARED }
type TouchScreenBaseEventType (line 24) | enum TouchScreenBaseEventType {
FILE: src/input/TouchScreenImpl1.h
function class (line 4) | class TouchScreenImpl1 : public TouchScreenBase
FILE: src/input/TrackballInterruptBase.h
type TrackballInterruptBaseActionType (line 35) | enum TrackballInterruptBaseActionType {
FILE: src/input/TrackballInterruptImpl1.h
function class (line 4) | class TrackballInterruptImpl1 : public TrackballInterruptBase
FILE: src/input/UpDownInterruptBase.h
type UpDownInterruptBaseActionType (line 29) | enum UpDownInterruptBaseActionType {
FILE: src/input/UpDownInterruptImpl1.h
function class (line 4) | class UpDownInterruptImpl1 : public UpDownInterruptBase
FILE: src/input/cardKbI2cImpl.h
function class (line 11) | class CardKbI2cImpl : public KbI2cBase
FILE: src/input/kbI2cBase.cpp
function read_from_14004 (line 38) | uint8_t read_from_14004(TwoWire *i2cBus, uint8_t reg, uint8_t *data, uin...
FILE: src/input/kbMatrixImpl.h
function class (line 12) | class KbMatrixImpl : public KbMatrixBase
FILE: src/main.cpp
function printPartitionTable (line 90) | void printPartitionTable()
function loopCanSleep (line 255) | __attribute__((weak, noinline)) bool loopCanSleep()
function lateInitVariant (line 263) | void lateInitVariant() {}
function earlyInitVariant (line 266) | void earlyInitVariant() {}
function waitUntilPowerLevelSafe (line 279) | void waitUntilPowerLevelSafe()
function printInfo (line 303) | void printInfo()
type timeval (line 379) | struct timeval
function meshtastic_DeviceMetadata (line 1038) | extern meshtastic_DeviceMetadata getDeviceMetadata()
function scannerToSensorsMap (line 1101) | void scannerToSensorsMap(const std::unique_ptr<ScanI2CTwoWire> &i2cScann...
function loop (line 1113) | void loop()
FILE: src/memGet.cpp
type mallinfo (line 32) | struct mallinfo
type mallinfo (line 53) | struct mallinfo
function displayPercentHeapFree (line 93) | void displayPercentHeapFree()
FILE: src/memGet.h
function class (line 7) | class MemGet
FILE: src/mesh/Channels.cpp
function xorHash (line 27) | uint8_t xorHash(const uint8_t *p, size_t len)
function meshtastic_Channel (line 57) | meshtastic_Channel &Channels::fixupChannel(ChannelIndex chIndex)
function CryptoKey (line 208) | CryptoKey Channels::getKey(ChannelIndex chIndex)
function meshtastic_Channel (line 306) | meshtastic_Channel &Channels::getByIndex(ChannelIndex chIndex)
function meshtastic_Channel (line 318) | meshtastic_Channel &Channels::getByName(const char *chName)
FILE: src/mesh/Channels.h
type ChannelIndex (line 10) | typedef uint8_t ChannelIndex;
type ChannelHash (line 15) | typedef uint8_t ChannelHash;
function class (line 18) | class Channels
FILE: src/mesh/CryptoEngine.h
type CryptoKey (line 12) | struct CryptoKey {
function class (line 27) | class CryptoEngine
FILE: src/mesh/Default.h
function class (line 58) | class Default
FILE: src/mesh/FloodingRouter.cpp
function ErrorCode (line 19) | ErrorCode FloodingRouter::send(meshtastic_MeshPacket *p)
FILE: src/mesh/FloodingRouter.h
function class (line 28) | class FloodingRouter : public Router
FILE: src/mesh/InterfacesTemplates.cpp
class SX126xInterface<SX1262> (line 12) | class SX126xInterface<SX1262>
class SX126xInterface<SX1268> (line 13) | class SX126xInterface<SX1268>
class SX126xInterface<LLCC68> (line 14) | class SX126xInterface<LLCC68>
class SX128xInterface<SX1280> (line 17) | class SX128xInterface<SX1280>
class LR11x0Interface<LR1110> (line 20) | class LR11x0Interface<LR1110>
class LR11x0Interface<LR1120> (line 21) | class LR11x0Interface<LR1120>
class LR11x0Interface<LR1121> (line 22) | class LR11x0Interface<LR1121>
class SX126xInterface<STM32WLx> (line 25) | class SX126xInterface<STM32WLx>
class ServerAPI<EthernetClient> (line 30) | class ServerAPI<EthernetClient>
class APIServerPort<ethServerAPI, EthernetServer> (line 31) | class APIServerPort<ethServerAPI, EthernetServer>
class ServerAPI<WiFiClient> (line 36) | class ServerAPI<WiFiClient>
class APIServerPort<WiFiServerAPI, WiFiServer> (line 37) | class APIServerPort<WiFiServerAPI, WiFiServer>
FILE: src/mesh/LLCC68Interface.h
function class (line 13) | class LLCC68Interface : public SX126xInterface<LLCC68>
FILE: src/mesh/LR1110Interface.h
function class (line 8) | class LR1110Interface : public LR11x0Interface<LR1110>
FILE: src/mesh/LR1120Interface.h
function class (line 8) | class LR1120Interface : public LR11x0Interface<LR1120>
FILE: src/mesh/LR1121Interface.h
function class (line 9) | class LR1121Interface : public LR11x0Interface<LR1121>
FILE: src/mesh/LR11x0Interface.h
function virtual (line 18) | virtual bool init() override;
function virtual (line 43) | virtual void disableInterrupt() override;
FILE: src/mesh/LoRaFEMInterface.h
type LoRaFEMType (line 6) | typedef enum { GC1109_PA, KCT8103L_PA, OTHER_FEM_TYPES } LoRaFEMType;
function class (line 8) | class LoRaFEMInterface
FILE: src/mesh/MemoryPool.h
function virtual (line 16) | virtual ~Allocator() {}
function T (line 20) | T *allocZeroed()
function T (line 31) | T *allocZeroed(TickType_t maxWait)
function T (line 41) | T *allocCopy(const T &src, TickType_t maxWait = portMAX_DELAY)
FILE: src/mesh/MeshModule.cpp
function meshtastic_MeshPacket (line 48) | meshtastic_MeshPacket *MeshModule::allocAckNak(meshtastic_Routing_Error ...
function meshtastic_MeshPacket (line 76) | meshtastic_MeshPacket *MeshModule::allocErrorResponse(meshtastic_Routing...
function meshtastic_MeshPacket (line 207) | meshtastic_MeshPacket *MeshModule::allocReply()
function setReplyTo (line 233) | void setReplyTo(meshtastic_MeshPacket *p, const meshtastic_MeshPacket &to)
function AdminMessageHandleResult (line 280) | AdminMessageHandleResult MeshModule::handleAdminMessageForAllModules(con...
FILE: src/mesh/MeshModule.h
function ProcessMessage (line 21) | enum class ProcessMessage {
FILE: src/mesh/MeshPacketQueue.cpp
function getPriority (line 9) | inline uint32_t getPriority(const meshtastic_MeshPacket *p)
function CompareMeshPacketFunc (line 16) | bool CompareMeshPacketFunc(const meshtastic_MeshPacket *p1, const meshta...
function fixPriority (line 41) | void fixPriority(meshtastic_MeshPacket *p)
function meshtastic_MeshPacket (line 92) | meshtastic_MeshPacket *MeshPacketQueue::dequeue()
function meshtastic_MeshPacket (line 103) | meshtastic_MeshPacket *MeshPacketQueue::getFront()
function meshtastic_MeshPacket (line 114) | meshtastic_MeshPacket *MeshPacketQueue::getPacketFromQueue(NodeNum from,...
function meshtastic_MeshPacket (line 127) | meshtastic_MeshPacket *MeshPacketQueue::remove(NodeNum from, PacketId id...
FILE: src/mesh/MeshPacketQueue.h
function class (line 10) | class MeshPacketQueue
FILE: src/mesh/MeshRadio.h
type RegionProfile (line 13) | struct RegionProfile {
type RegionInfo (line 33) | struct RegionInfo {
function getNumPresets (line 47) | size_t getNumPresets() const
function clampCodingRate (line 85) | static inline uint8_t clampCodingRate(uint8_t cr)
function clampBandwidthKHz (line 93) | static inline float clampBandwidthKHz(float bwKHz)
function bwCodeToKHz (line 100) | static inline float bwCodeToKHz(uint16_t bwCode)
function bwKHzToCode (line 117) | static inline uint16_t bwKHzToCode(float bwKHz)
function modemPresetToParams (line 134) | static inline void modemPresetToParams(meshtastic_Config_LoRaConfig_Mode...
function modemPresetToBwKHz (line 186) | static inline float modemPresetToBwKHz(meshtastic_Config_LoRaConfig_Mode...
FILE: src/mesh/MeshService.cpp
function NodeNum (line 159) | NodeNum MeshService::getNodenumFromRequestId(uint32_t request_id)
function ErrorCode (line 225) | ErrorCode MeshService::sendQueueStatusToPhone(const meshtastic_QueueStat...
function meshtastic_NodeInfoLite (line 390) | meshtastic_NodeInfoLite *MeshService::refreshLocalMeshNode()
FILE: src/mesh/MeshService.h
function class (line 35) | class MeshService
FILE: src/mesh/MeshTypes.h
type NodeNum (line 9) | typedef uint32_t NodeNum;
type PacketId (line 10) | typedef uint32_t PacketId;
type RxSource (line 25) | enum RxSource {
type ErrorCode (line 48) | typedef int ErrorCode;
FILE: src/mesh/NextHopRouter.cpp
function ErrorCode (line 23) | ErrorCode NextHopRouter::send(meshtastic_MeshPacket *p)
function PendingPacket (line 206) | PendingPacket *NextHopRouter::findPendingPacket(GlobalPacketId key)
function PendingPacket (line 265) | PendingPacket *NextHopRouter::startRetransmission(meshtastic_MeshPacket ...
FILE: src/mesh/NextHopRouter.h
function GlobalPacketId (line 11) | struct GlobalPacketId {
type PendingPacket (line 33) | struct PendingPacket {
function class (line 46) | class GlobalPacketIdHashFunction
function class (line 62) | class NextHopRouter : public FloodingRouter
FILE: src/mesh/NodeDB.cpp
function read8 (line 84) | uint32_t read8(uint8_t bits, uint8_t dummy, uint8_t cs, uint8_t sck, uin...
function write9 (line 109) | void write9(uint8_t val, uint8_t dc_val, uint8_t cs, uint8_t sck, uint8_...
function readwrite8 (line 123) | uint32_t readwrite8(uint8_t cmd, uint8_t bits, uint8_t dummy, uint8_t cs...
function get_st7789_id (line 132) | uint32_t get_st7789_id(uint8_t cs, uint8_t sck, uint8_t mosi, uint8_t dc...
function meshtastic_NodeDatabase_callback (line 153) | bool meshtastic_NodeDatabase_callback(pb_istream_t *istream, pb_ostream_...
function NodeNum (line 459) | NodeNum getFrom(const meshtastic_MeshPacket *p)
function isFromUs (line 465) | bool isFromUs(const meshtastic_MeshPacket *p)
function isToUs (line 471) | bool isToUs(const meshtastic_MeshPacket *p)
function isBroadcast (line 476) | bool isBroadcast(uint32_t dest)
function LoadFileResult (line 1153) | LoadFileResult NodeDB::loadProto(const char *filename, size_t protoSize,...
function meshtastic_NodeInfoLite (line 1622) | const meshtastic_NodeInfoLite *NodeDB::readNextMeshNode(uint32_t &readIn...
function sinceLastSeen (line 1631) | uint32_t sinceLastSeen(const meshtastic_NodeInfoLite *n)
function sinceReceived (line 1642) | uint32_t sinceReceived(const meshtastic_MeshPacket *p)
function HopStartStatus (line 1653) | HopStartStatus classifyHopStart(const meshtastic_MeshPacket &p)
function getHopsAway (line 1672) | int8_t getHopsAway(const meshtastic_MeshPacket &p, int8_t defaultIfUnknown)
function logHopStartDrop (line 1711) | void logHopStartDrop(const meshtastic_MeshPacket &p, const char *context)
function meshtastic_NodeInfoLite (line 2088) | meshtastic_NodeInfoLite *NodeDB::getMeshNode(NodeNum n)
function meshtastic_NodeInfoLite (line 2104) | meshtastic_NodeInfoLite *NodeDB::getOrCreateMeshNode(NodeNum n)
function UserLicenseStatus (line 2166) | UserLicenseStatus NodeDB::getLicenseStatus(uint32_t nodeNum)
function recordCriticalError (line 2281) | void recordCriticalError(meshtastic_CriticalErrorCode code, uint32_t add...
FILE: src/mesh/NodeDB.h
function HopStartStatus (line 117) | enum class HopStartStatus : uint8_t { VALID = 0, MISSING_OR_UNKNOWN, INV...
FILE: src/mesh/PacketCache.cpp
function PacketCacheEntry (line 9) | PacketCacheEntry *PacketCache::cache(const meshtastic_MeshPacket *p, boo...
function PacketCacheEntry (line 102) | PacketCacheEntry *PacketCache::find(NodeNum from, PacketId id)
function PacketCacheEntry (line 117) | PacketCacheEntry *PacketCache::find(PacketHash h)
FILE: src/mesh/PacketCache.h
type PacketHash (line 5) | typedef uint16_t PacketHash;
type PacketCacheEntry (line 10) | typedef struct PacketCacheEntry {
FILE: src/mesh/PacketHistory.h
function class (line 14) | class PacketHistory
FILE: src/mesh/PhoneAPI.h
function class (line 35) | class PhoneAPI
FILE: src/mesh/PointerQueue.h
function T (line 14) | T *dequeuePtr(TickType_t maxWait = portMAX_DELAY)
function T (line 23) | T *dequeuePtrFromISR(BaseType_t *higherPriWoken)
FILE: src/mesh/ProtobufModule.h
function meshtastic_MeshPacket (line 43) | meshtastic_MeshPacket *allocDataProtobuf(const T &payload)
function handleStatusUpdate (line 65) | int handleStatusUpdate(const meshtastic::Status *arg)
function override (line 79) | handleReceived(const meshtastic_MeshPacket &mp) override
FILE: src/mesh/RF95Interface.cpp
function DACDB (line 31) | DACDB interpolate(uint8_t dbm, uint8_t dbm1, uint8_t dbm2, DACDB val1, D...
function DACDB (line 41) | DACDB getDACandDB(uint8_t dbm)
FILE: src/mesh/RF95Interface.h
function class (line 10) | class RF95Interface : public RadioLibInterface
FILE: src/mesh/RadioInterface.cpp
function initLoRa (line 250) | std::unique_ptr<RadioInterface> initLoRa()
function initRegion (line 509) | void initRegion()
function RegionInfo (line 524) | const RegionInfo *getRegion(meshtastic_Config_LoRaConfig_RegionCode code)
function printPacket (line 624) | void printPacket(const char *prefix, const meshtastic_MeshPacket *p)
function hash (line 721) | uint32_t hash(const char *str)
function sendErrorNotification (line 767) | static void sendErrorNotification(const char *msg)
FILE: src/mesh/RadioInterface.h
type meshtastic_Config_LoRaConfig (line 16) | typedef struct _meshtastic_Config_LoRaConfig meshtastic_Config_LoRaConfig;
type PacketHeader (line 34) | typedef struct {
type RadioBuffer (line 61) | typedef struct {
function class (line 75) | class RadioInterface
function reloadConfig (line 294) | int reloadConfig(void *unused)
FILE: src/mesh/RadioLibInterface.cpp
function ErrorCode (line 142) | ErrorCode RadioLibInterface::send(meshtastic_MeshPacket *p)
function meshtastic_QueueStatus (line 203) | meshtastic_QueueStatus RadioLibInterface::getQueueStatus()
FILE: src/mesh/RadioLibInterface.h
function class (line 27) | class LockingArduinoHal : public ArduinoHal
function class (line 44) | class STM32WLx_ModuleWrapper : public STM32WLx_Module
function DataRate_t (line 67) | DataRate_t getDataRate() const { return {.lora = {.spreadingFactor = sf,...
function virtual (line 146) | virtual bool canSleep() override;
FILE: src/mesh/RadioLibRF95.h
function class (line 10) | class RadioLibRF95 : public SX1278
FILE: src/mesh/ReliableRouter.cpp
function ErrorCode (line 17) | ErrorCode ReliableRouter::send(meshtastic_MeshPacket *p)
FILE: src/mesh/ReliableRouter.h
function class (line 8) | class ReliableRouter : public NextHopRouter
FILE: src/mesh/Router.cpp
function PacketId (line 186) | PacketId generatePacketId()
function meshtastic_MeshPacket (line 208) | meshtastic_MeshPacket *Router::allocForSending()
function meshtastic_QueueStatus (line 246) | meshtastic_QueueStatus Router::getQueueStatus()
function ErrorCode (line 256) | ErrorCode Router::sendLocal(meshtastic_MeshPacket *p, RxSource src)
function ErrorCode (line 300) | ErrorCode Router::rawSend(meshtastic_MeshPacket *p)
function ErrorCode (line 311) | ErrorCode Router::send(meshtastic_MeshPacket *p)
function DecodeState (line 431) | DecodeState perhapsDecode(meshtastic_MeshPacket *p)
function meshtastic_Routing_Error (line 586) | meshtastic_Routing_Error perhapsEncode(meshtastic_MeshPacket *p)
function NodeNum (line 724) | NodeNum Router::getNodeNum()
FILE: src/mesh/Router.h
function addInterface (line 36) | void addInterface(std::unique_ptr<RadioInterface> _iface) { iface = std:...
function virtual (line 42) | virtual int32_t runOnce() override;
type DecodeState (line 160) | enum DecodeState { DECODE_SUCCESS, DECODE_FAILURE, DECODE_FATAL }
FILE: src/mesh/STM32WLE5JCInterface.h
function class (line 10) | class STM32WLE5JCInterface : public SX126xInterface<STM32WLx>
FILE: src/mesh/SX1262Interface.h
function class (line 9) | class SX1262Interface : public SX126xInterface<SX1262>
FILE: src/mesh/SX1268Interface.h
function class (line 9) | class SX1268Interface : public SX126xInterface<SX1268>
FILE: src/mesh/SX126xInterface.h
function virtual (line 19) | virtual bool init() override;
function resetAGC (line 31) | void resetAGC() override;
function virtual (line 47) | virtual void disableInterrupt() override;
FILE: src/mesh/SX1280Interface.h
function class (line 9) | class SX1280Interface : public SX128xInterface<SX1280>
FILE: src/mesh/SX128xInterface.h
function virtual (line 18) | virtual bool init() override;
function virtual (line 41) | virtual void disableInterrupt() override;
FILE: src/mesh/SinglePortModule.h
function class (line 9) | class SinglePortModule : public MeshModule
function meshtastic_MeshPacket (line 31) | meshtastic_MeshPacket *allocDataPacket()
FILE: src/mesh/StaticPointerQueue.h
function enqueue (line 37) | bool enqueue(T *x, TickType_t maxWait = portMAX_DELAY)
function dequeue (line 54) | bool dequeue(T **p, TickType_t maxWait = portMAX_DELAY)
function T (line 67) | T *dequeuePtr(TickType_t maxWait = portMAX_DELAY)
function setReader (line 73) | void setReader(concurrency::OSThread *t) { reader = t; }
FILE: src/mesh/StreamAPI.h
function class (line 32) | class StreamAPI : public PhoneAPI
FILE: src/mesh/Throttle.h
function class (line 5) | class Throttle
FILE: src/mesh/TransmitHistory.cpp
function TransmitHistory (line 11) | TransmitHistory *TransmitHistory::getInstance()
function TransmitHistory (line 171) | TransmitHistory *TransmitHistory::getInstance()
FILE: src/mesh/TransmitHistory.h
function class (line 22) | class TransmitHistory
FILE: src/mesh/TypeConversions.cpp
function meshtastic_NodeInfo (line 5) | meshtastic_NodeInfo TypeConversions::ConvertToNodeInfo(const meshtastic_...
function meshtastic_PositionLite (line 49) | meshtastic_PositionLite TypeConversions::ConvertToPositionLite(meshtasti...
function meshtastic_Position (line 61) | meshtastic_Position TypeConversions::ConvertToPosition(meshtastic_Positi...
function meshtastic_UserLite (line 79) | meshtastic_UserLite TypeConversions::ConvertToUserLite(meshtastic_User u...
function meshtastic_User (line 96) | meshtastic_User TypeConversions::ConvertToUser(uint32_t nodeNum, meshtas...
FILE: src/mesh/TypeConversions.h
function class (line 7) | class TypeConversions
FILE: src/mesh/TypedQueue.h
function numFree (line 26) | int numFree() { return uxQueueSpacesAvailable(h); }
function isEmpty (line 28) | bool isEmpty() { return uxQueueMessagesWaiting(h) == 0; }
function numUsed (line 30) | int numUsed() { return uxQueueMessagesWaiting(h); }
function enqueue (line 34) | bool enqueue(T x, TickType_t maxWait)
function enqueueFromISR (line 43) | bool enqueueFromISR(T x, BaseType_t *higherPriWoken)
function dequeue (line 52) | bool dequeue(T *p, TickType_t maxWait = portMAX_DELAY) { return xQueueRe...
function dequeueFromISR (line 54) | bool dequeueFromISR(T *p, BaseType_t *higherPriWoken) { return xQueueRec...
function setReader (line 62) | void setReader(concurrency::OSThread *t) { reader = t; }
function numFree (line 82) | int numFree()
function isEmpty (line 89) | bool isEmpty() { return q.empty(); }
function numUsed (line 91) | int numUsed() { return q.size(); }
function enqueue (line 93) | bool enqueue(T x, TickType_t maxWait = portMAX_DELAY)
function dequeue (line 109) | bool dequeue(T *p, TickType_t maxWait = portMAX_DELAY)
function setReader (line 122) | void setReader(concurrency::OSThread *t) { reader = t; }
FILE: src/mesh/aes-ccm.cpp
function constant_time_compare (line 21) | static int constant_time_compare(const void *a_, const void *b_, size_t ...
function WPA_PUT_BE16 (line 39) | static void WPA_PUT_BE16(uint8_t *a, uint16_t val)
function xor_aes_block (line 45) | static void xor_aes_block(uint8_t *dst, const uint8_t *src)
function aes_ccm_auth_start (line 51) | static void aes_ccm_auth_start(size_t M, size_t L, const uint8_t *nonce,...
function aes_ccm_auth (line 77) | static void aes_ccm_auth(const uint8_t *data, size_t len, uint8_t *x)
function aes_ccm_encr_start (line 94) | static void aes_ccm_encr_start(size_t L, const uint8_t *nonce, uint8_t *a)
function aes_ccm_encr (line 100) | static void aes_ccm_encr(size_t L, const uint8_t *in, size_t len, uint8_...
function aes_ccm_encr_auth (line 121) | static void aes_ccm_encr_auth(size_t M, const uint8_t *x, uint8_t *a, ui...
function aes_ccm_decr_auth (line 131) | static void aes_ccm_decr_auth(size_t M, uint8_t *a, const uint8_t *auth,...
function aes_ccm_ae (line 142) | int aes_ccm_ae(const uint8_t *key, size_t key_len, const uint8_t *nonce,...
function aes_ccm_ad (line 159) | bool aes_ccm_ad(const uint8_t *key, size_t key_len, const uint8_t *nonce...
FILE: src/mesh/api/PacketAPI.cpp
function PacketAPI (line 11) | PacketAPI *PacketAPI::create(PacketServer *_server)
FILE: src/mesh/api/PacketAPI.h
function virtual (line 16) | virtual ~PacketAPI(){}
function onNowHasData (line 24) | void onNowHasData(uint32_t fromRadioNum) override {}
function onConnectionChanged (line 25) | void onConnectionChanged(bool connected) override {}
FILE: src/mesh/api/ServerAPI.h
function private (line 12) | private concurrency::OSThread
FILE: src/mesh/api/WiFiServerAPI.cpp
function initApiServer (line 9) | void initApiServer(int port)
function deInitApiServer (line 18) | void deInitApiServer()
FILE: src/mesh/api/WiFiServerAPI.h
function class (line 15) | class WiFiServerAPI : public ServerAPI<WiFiClient>
FILE: src/mesh/api/ethServerAPI.cpp
function initApiServer (line 10) | void initApiServer(int port)
function deInitApiServer (line 20) | void deInitApiServer()
FILE: src/mesh/api/ethServerAPI.h
function class (line 11) | class ethServerAPI : public ServerAPI<EthernetClient>
FILE: src/mesh/compression/unishox2.cpp
function init_coder (line 128) | void init_coder()
function append_bits (line 152) | int append_bits(char *out, int olen, int ol, uint8_t code, int clen)
function append_switch_code (line 190) | int append_switch_code(char *out, int olen, int ol, uint8_t state)
function append_code (line 201) | int append_code(char *out, int olen, int ol, uint8_t code, uint8_t *stat...
function encodeCount (line 239) | int encodeCount(char *out, int olen, int ol, int count)
function encodeUnicode (line 263) | int encodeUnicode(char *out, int olen, int ol, int32_t code, int32_t pre...
function readUTF8 (line 302) | int32_t readUTF8(const char *in, int len, int l, int *utf8len)
function matchOccurance (line 342) | int matchOccurance(const char *in, int len, int l, char *out, int olen, ...
function matchLine (line 386) | int matchLine(const char *in, int len, int l, char *out, int olen, int *...
function getBaseCode (line 447) | uint8_t getBaseCode(char ch)
function getNibbleType (line 464) | char getNibbleType(char ch)
function append_nibble_escape (line 476) | int append_nibble_escape(char *out, int olen, int ol, uint8_t state, con...
function min_of (line 485) | long min_of(long c, long i)
function append_final_bits (line 491) | int append_final_bits(char *const out, const int olen, int ol, const uin...
function unishox2_compress_lines (line 526) | int unishox2_compress_lines(const char *in, int len, UNISHOX_API_OUT_AND...
function unishox2_compress (line 865) | int unishox2_compress(const char *in, int len, UNISHOX_API_OUT_AND_LEN(c...
function unishox2_compress_simple (line 873) | int unishox2_compress_simple(const char *in, int len, char *out)
function readBit (line 880) | int readBit(const char *in, int bit_no)
function read8bitCode (line 886) | int read8bitCode(const char *in, int len, int bit_no)
function readVCodeIdx (line 929) | int readVCodeIdx(const char *in, int len, int *bit_no_p)
function readHCodeIdx (line 954) | int readHCodeIdx(const char *in, int len, int *bit_no_p, const uint8_t u...
function getStepCodeIdx (line 972) | int getStepCodeIdx(const char *in, int len, int *bit_no_p, int limit)
function getNumFromBits (line 988) | int32_t getNumFromBits(const char *in, int len, int bit_no, int count)
function readCount (line 999) | int32_t readCount(const char *in, int *bit_no_p, int len)
function readUnicode (line 1013) | int32_t readUnicode(const char *in, int *bit_no_p, int len)
function writeUTF8 (line 1060) | int writeUTF8(char *out, int olen, int ol, int uni)
function decodeRepeat (line 1079) | int decodeRepeat(const char *in, int len, char *out, int olen, int ol, i...
function getHexChar (line 1127) | char getHexChar(int32_t nibble, int hex_type)
function unishox2_decompress_lines (line 1137) | int unishox2_decompress_lines(const char *in, int len, UNISHOX_API_OUT_A...
function unishox2_decompress (line 1421) | int unishox2_decompress(const char *in, int len, UNISHOX_API_OUT_AND_LEN...
function unishox2_decompress_simple (line 1429) | int unishox2_decompress_simple(const char *in, int len, char *out)
FILE: src/mesh/compression/unishox2.h
type us_lnk_lst (line 246) | struct us_lnk_lst {
type us_lnk_lst (line 331) | struct us_lnk_lst
type us_lnk_lst (line 345) | struct us_lnk_lst
FILE: src/mesh/eth/ethClient.cpp
function reconnectETH (line 32) | static int32_t reconnectETH()
function initEthernet (line 169) | bool initEthernet()
function isEthernetAvailable (line 246) | bool isEthernetAvailable()
FILE: src/mesh/generated/meshtastic/admin.pb.h
type meshtastic_OTAMode (line 20) | typedef enum _meshtastic_OTAMode {
type meshtastic_AdminMessage_ConfigType (line 30) | typedef enum _meshtastic_AdminMessage_ConfigType {
type meshtastic_AdminMessage_ModuleConfigType (line 54) | typedef enum _meshtastic_AdminMessage_ModuleConfigType {
type meshtastic_AdminMessage_BackupLocation (line 89) | typedef enum _meshtastic_AdminMessage_BackupLocation {
type meshtastic_KeyVerificationAdmin_MessageType (line 97) | typedef enum _meshtastic_KeyVerificationAdmin_MessageType {
type meshtastic_AdminMessage_InputEvent (line 111) | typedef struct _meshtastic_AdminMessage_InputEvent {
type meshtastic_AdminMessage_OTAEvent (line 125) | typedef struct _meshtastic_AdminMessage_OTAEvent {
type meshtastic_HamParameters (line 134) | typedef struct _meshtastic_HamParameters {
type meshtastic_NodeRemoteHardwarePinsResponse (line 148) | typedef struct _meshtastic_NodeRemoteHardwarePinsResponse {
type meshtastic_SharedContact (line 154) | typedef struct _meshtastic_SharedContact {
type meshtastic_KeyVerificationAdmin (line 167) | typedef struct _meshtastic_KeyVerificationAdmin {
type meshtastic_SCD4X_config (line 178) | typedef struct _meshtastic_SCD4X_config {
type meshtastic_SEN5X_config (line 202) | typedef struct _meshtastic_SEN5X_config {
type meshtastic_SCD30_config (line 211) | typedef struct _meshtastic_SCD30_config {
type meshtastic_SHTXX_config (line 232) | typedef struct _meshtastic_SHTXX_config {
type meshtastic_SensorConfig (line 238) | typedef struct _meshtastic_SensorConfig {
type meshtastic_AdminMessage (line 257) | typedef struct _meshtastic_AdminMessage {
FILE: src/mesh/generated/meshtastic/apponly.pb.h
type meshtastic_ChannelSet (line 20) | typedef struct _meshtastic_ChannelSet {
FILE: src/mesh/generated/meshtastic/atak.pb.h
type meshtastic_Team (line 13) | typedef enum _meshtastic_Team {
type meshtastic_MemberRole (line 47) | typedef enum _meshtastic_MemberRole {
type meshtastic_GeoChat (line 70) | typedef struct _meshtastic_GeoChat {
type meshtastic_Group (line 83) | typedef struct _meshtastic_Group {
type meshtastic_Status (line 93) | typedef struct _meshtastic_Status {
type meshtastic_Contact (line 100) | typedef struct _meshtastic_Contact {
type meshtastic_PLI (line 108) | typedef struct _meshtastic_PLI {
type meshtastic_TAKPacket (line 123) | typedef PB_BYTES_ARRAY_T(220) meshtastic_TAKPacket_detail_t;
FILE: src/mesh/generated/meshtastic/cannedmessages.pb.h
type meshtastic_CannedMessageModuleConfig (line 14) | typedef struct _meshtastic_CannedMessageModuleConfig {
FILE: src/mesh/generated/meshtastic/channel.pb.h
type meshtastic_Channel_Role (line 22) | typedef enum _meshtastic_Channel_Role {
type meshtastic_ModuleSettings (line 34) | typedef struct _meshtastic_ModuleSettings {
type meshtastic_ChannelSettings (line 58) | typedef struct _meshtastic_ChannelSettings {
type meshtastic_Channel (line 103) | typedef struct _meshtastic_Channel {
FILE: src/mesh/generated/meshtastic/clientonly.pb.h
type meshtastic_DeviceProfile (line 17) | typedef struct _meshtastic_DeviceProfile {
FILE: src/mesh/generated/meshtastic/config.pb.h
type meshtastic_Config_DeviceConfig_Role (line 15) | typedef enum _meshtastic_Config_DeviceConfig_Role {
type meshtastic_Config_DeviceConfig_RebroadcastMode (line 77) | typedef enum _meshtastic_Config_DeviceConfig_RebroadcastMode {
type meshtastic_Config_DeviceConfig_BuzzerMode (line 98) | typedef enum _meshtastic_Config_DeviceConfig_BuzzerMode {
type meshtastic_Config_PositionConfig_PositionFlags (line 124) | typedef enum _meshtastic_Config_PositionConfig_PositionFlags {
type meshtastic_Config_PositionConfig_GpsMode (line 153) | typedef enum _meshtastic_Config_PositionConfig_GpsMode {
type meshtastic_Config_NetworkConfig_AddressMode (line 162) | typedef enum _meshtastic_Config_NetworkConfig_AddressMode {
type meshtastic_Config_NetworkConfig_ProtocolFlags (line 170) | typedef enum _meshtastic_Config_NetworkConfig_ProtocolFlags {
type meshtastic_Config_DisplayConfig_DeprecatedGpsCoordinateFormat (line 178) | typedef enum _meshtastic_Config_DisplayConfig_DeprecatedGpsCoordinateFor...
type meshtastic_Config_DisplayConfig_DisplayUnits (line 183) | typedef enum _meshtastic_Config_DisplayConfig_DisplayUnits {
type meshtastic_Config_DisplayConfig_OledType (line 191) | typedef enum _meshtastic_Config_DisplayConfig_OledType {
type meshtastic_Config_DisplayConfig_DisplayMode (line 204) | typedef enum _meshtastic_Config_DisplayConfig_DisplayMode {
type meshtastic_Config_DisplayConfig_CompassOrientation (line 215) | typedef enum _meshtastic_Config_DisplayConfig_CompassOrientation {
type meshtastic_Config_LoRaConfig_RegionCode (line 234) | typedef enum _meshtastic_Config_LoRaConfig_RegionCode {
type meshtastic_Config_LoRaConfig_ModemPreset (line 293) | typedef enum _meshtastic_Config_LoRaConfig_ModemPreset {
type meshtastic_Config_LoRaConfig_FEM_LNA_Mode (line 321) | typedef enum _meshtastic_Config_LoRaConfig_FEM_LNA_Mode {
type meshtastic_Config_BluetoothConfig_PairingMode (line 330) | typedef enum _meshtastic_Config_BluetoothConfig_PairingMode {
type meshtastic_Config_DeviceConfig (line 341) | typedef struct _meshtastic_Config_DeviceConfig {
type meshtastic_Config_PositionConfig (line 376) | typedef struct _meshtastic_Config_PositionConfig {
type meshtastic_Config_PowerConfig (line 413) | typedef struct _meshtastic_Config_PowerConfig {
type meshtastic_Config_NetworkConfig_IpV4Config (line 446) | typedef struct _meshtastic_Config_NetworkConfig_IpV4Config {
type meshtastic_Config_NetworkConfig (line 458) | typedef struct _meshtastic_Config_NetworkConfig {
type meshtastic_Config_DisplayConfig (line 484) | typedef struct _meshtastic_Config_DisplayConfig {
type meshtastic_Config_LoRaConfig (line 522) | typedef struct _meshtastic_Config_LoRaConfig {
type meshtastic_Config_BluetoothConfig (line 595) | typedef struct _meshtastic_Config_BluetoothConfig {
type meshtastic_Config_SecurityConfig_private_key_t (line 604) | typedef PB_BYTES_ARRAY_T(32) meshtastic_Config_SecurityConfig_public_key_t;
type meshtastic_Config_SecurityConfig (line 606) | typedef PB_BYTES_ARRAY_T(32) meshtastic_Config_SecurityConfig_admin_key_t;
type meshtastic_Config_SessionkeyConfig (line 630) | typedef struct _meshtastic_Config_SessionkeyConfig {
type meshtastic_Config (line 634) | typedef struct _meshtastic_Config {
FILE: src/mesh/generated/meshtastic/connection_status.pb.h
type meshtastic_NetworkConnectionStatus (line 14) | typedef struct _meshtastic_NetworkConnectionStatus {
type meshtastic_WifiConnectionStatus (line 26) | typedef struct _meshtastic_WifiConnectionStatus {
type meshtastic_EthernetConnectionStatus (line 37) | typedef struct _meshtastic_EthernetConnectionStatus {
type meshtastic_BluetoothConnectionStatus (line 44) | typedef struct _meshtastic_BluetoothConnectionStatus {
type meshtastic_SerialConnectionStatus (line 54) | typedef struct _meshtastic_SerialConnectionStatus {
type meshtastic_DeviceConnectionStatus (line 61) | typedef struct _meshtastic_DeviceConnectionStatus {
FILE: src/mesh/generated/meshtastic/device_ui.pb.h
type meshtastic_CompassMode (line 13) | typedef enum _meshtastic_CompassMode {
type meshtastic_Theme (line 22) | typedef enum _meshtastic_Theme {
type meshtastic_Language (line 32) | typedef enum _meshtastic_Language {
type meshtastic_DeviceUIConfig_GpsCoordinateFormat (line 80) | typedef enum _meshtastic_DeviceUIConfig_GpsCoordinateFormat {
type meshtastic_NodeFilter (line 106) | typedef struct _meshtastic_NodeFilter {
type meshtastic_NodeHighlight (line 123) | typedef struct _meshtastic_NodeHighlight {
type meshtastic_GeoPoint (line 136) | typedef struct _meshtastic_GeoPoint {
type meshtastic_Map (line 145) | typedef struct _meshtastic_Map {
type meshtastic_DeviceUIConfig (line 155) | typedef PB_BYTES_ARRAY_T(16) meshtastic_DeviceUIConfig_calibration_data_t;
FILE: src/mesh/generated/meshtastic/deviceonly.pb.h
type meshtastic_PositionLite (line 20) | typedef struct _meshtastic_PositionLite {
type meshtastic_UserLite (line 38) | typedef PB_BYTES_ARRAY_T(32) meshtastic_UserLite_public_key_t;
type meshtastic_NodeInfoLite (line 66) | typedef struct _meshtastic_NodeInfoLite {
type meshtastic_DeviceState (line 110) | typedef struct _meshtastic_DeviceState {
type meshtastic_NodeDatabase (line 146) | typedef struct _meshtastic_NodeDatabase {
type meshtastic_ChannelFile (line 156) | typedef struct _meshtastic_ChannelFile {
type meshtastic_BackupPreferences (line 167) | typedef struct _meshtastic_BackupPreferences {
FILE: src/mesh/generated/meshtastic/interdevice.pb.h
type meshtastic_MessageType (line 13) | typedef enum _meshtastic_MessageType {
type meshtastic_SensorData (line 29) | typedef struct _meshtastic_SensorData {
type meshtastic_InterdeviceMessage (line 39) | typedef struct _meshtastic_InterdeviceMessage {
FILE: src/mesh/generated/meshtastic/localonly.pb.h
type meshtastic_LocalConfig (line 15) | typedef struct _meshtastic_LocalConfig {
type meshtastic_LocalModuleConfig (line 46) | typedef struct _meshtastic_LocalModuleConfig {
FILE: src/mesh/generated/meshtastic/mesh.pb.h
type meshtastic_HardwareModel (line 24) | typedef enum _meshtastic_HardwareModel {
type meshtastic_Constants (line 316) | typedef enum _meshtastic_Constants {
type meshtastic_CriticalErrorCode (line 330) | typedef enum _meshtastic_CriticalErrorCode {
type meshtastic_FirmwareEdition (line 369) | typedef enum _meshtastic_FirmwareEdition {
type meshtastic_ExcludedModules (line 389) | typedef enum _meshtastic_ExcludedModules {
type meshtastic_Position_LocSource (line 425) | typedef enum _meshtastic_Position_LocSource {
type meshtastic_Position_AltSource (line 438) | typedef enum _meshtastic_Position_AltSource {
type meshtastic_Routing_Error (line 453) | typedef enum _meshtastic_Routing_Error {
type meshtastic_StoreForwardPlusPlus_SFPP_message_type (line 497) | typedef enum _meshtastic_StoreForwardPlusPlus_SFPP_message_type {
type meshtastic_MeshPacket_Priority (line 530) | typedef enum _meshtastic_MeshPacket_Priority {
type meshtastic_MeshPacket_Delayed (line 558) | typedef enum _meshtastic_MeshPacket_Delayed {
type meshtastic_MeshPacket_TransportMechanism (line 568) | typedef enum _meshtastic_MeshPacket_TransportMechanism {
type meshtastic_LogRecord_Level (line 588) | typedef enum _meshtastic_LogRecord_Level {
type meshtastic_Position (line 607) | typedef struct _meshtastic_Position {
type meshtastic_User (line 703) | typedef struct _meshtastic_User {
type meshtastic_RouteDiscovery (line 738) | typedef struct _meshtastic_RouteDiscovery {
type meshtastic_Routing (line 754) | typedef struct _meshtastic_Routing {
type meshtastic_Data (line 771) | typedef struct _meshtastic_Data {
type meshtastic_KeyVerification_hash2_t (line 803) | typedef PB_BYTES_ARRAY_T(32) meshtastic_KeyVerification_hash1_t;
type meshtastic_KeyVerification (line 806) | typedef struct _meshtastic_KeyVerification {
type meshtastic_StoreForwardPlusPlus_commit_hash_t (line 816) | typedef PB_BYTES_ARRAY_T(32) meshtastic_StoreForwardPlusPlus_message_has...
type meshtastic_StoreForwardPlusPlus_message_t (line 818) | typedef PB_BYTES_ARRAY_T(32) meshtastic_StoreForwardPlusPlus_root_hash_t;
type meshtastic_StoreForwardPlusPlus (line 821) | typedef struct _meshtastic_StoreForwardPlusPlus {
type meshtastic_Waypoint (line 845) | typedef struct _meshtastic_Waypoint {
type meshtastic_StatusMessage (line 868) | typedef struct _meshtastic_StatusMessage {
type meshtastic_MqttClientProxyMessage (line 874) | typedef struct _meshtastic_MqttClientProxyMessage {
type meshtastic_MeshPacket_public_key_t (line 888) | typedef PB_BYTES_ARRAY_T(256) meshtastic_MeshPacket_encrypted_t;
type meshtastic_MeshPacket (line 893) | typedef struct _meshtastic_MeshPacket {
type meshtastic_NodeInfo (line 998) | typedef struct _meshtastic_NodeInfo {
type meshtastic_MyNodeInfo (line 1042) | typedef struct _meshtastic_MyNodeInfo {
type meshtastic_LogRecord (line 1068) | typedef struct _meshtastic_LogRecord {
type meshtastic_QueueStatus (line 1079) | typedef struct _meshtastic_QueueStatus {
type meshtastic_KeyVerificationNumberInform (line 1090) | typedef struct _meshtastic_KeyVerificationNumberInform {
type meshtastic_KeyVerificationNumberRequest (line 1096) | typedef struct _meshtastic_KeyVerificationNumberRequest {
type meshtastic_KeyVerificationFinal (line 1101) | typedef struct _meshtastic_KeyVerificationFinal {
type meshtastic_DuplicatedPublicKey (line 1108) | typedef struct _meshtastic_DuplicatedPublicKey {
type meshtastic_LowEntropyKey (line 1112) | typedef struct _meshtastic_LowEntropyKey {
type meshtastic_ClientNotification (line 1120) | typedef struct _meshtastic_ClientNotification {
type meshtastic_FileInfo (line 1141) | typedef struct _meshtastic_FileInfo {
type meshtastic_Compressed (line 1148) | typedef PB_BYTES_ARRAY_T(233) meshtastic_Compressed_data_t;
type meshtastic_Neighbor (line 1158) | typedef struct _meshtastic_Neighbor {
type meshtastic_NeighborInfo (line 1172) | typedef struct _meshtastic_NeighborInfo {
type meshtastic_DeviceMetadata (line 1185) | typedef struct _meshtastic_DeviceMetadata {
type meshtastic_FromRadio (line 1217) | typedef struct _meshtastic_FromRadio {
type meshtastic_Heartbeat (line 1268) | typedef struct _meshtastic_Heartbeat {
type meshtastic_ToRadio (line 1275) | typedef struct _meshtastic_ToRadio {
type meshtastic_NodeRemoteHardwarePin (line 1302) | typedef struct _meshtastic_NodeRemoteHardwarePin {
type meshtastic_ChunkedPayload (line 1310) | typedef PB_BYTES_ARRAY_T(228) meshtastic_ChunkedPayload_payload_chunk_t;
type meshtastic_resend_chunks (line 1323) | typedef struct _meshtastic_resend_chunks {
type meshtastic_ChunkedPayloadResponse (line 1328) | typedef struct _meshtastic_ChunkedPayloadResponse {
FILE: src/mesh/generated/meshtastic/module_config.pb.h
type meshtastic_RemoteHardwarePinType (line 14) | typedef enum _meshtastic_RemoteHardwarePinType {
type meshtastic_ModuleConfig_DetectionSensorConfig_TriggerType (line 23) | typedef enum _meshtastic_ModuleConfig_DetectionSensorConfig_TriggerType {
type meshtastic_ModuleConfig_AudioConfig_Audio_Baud (line 41) | typedef enum _meshtastic_ModuleConfig_AudioConfig_Audio_Baud {
type meshtastic_ModuleConfig_SerialConfig_Serial_Baud (line 54) | typedef enum _meshtastic_ModuleConfig_SerialConfig_Serial_Baud {
type meshtastic_ModuleConfig_SerialConfig_Serial_Mode (line 74) | typedef enum _meshtastic_ModuleConfig_SerialConfig_Serial_Mode {
type meshtastic_ModuleConfig_CannedMessageConfig_InputEventChar (line 96) | typedef enum _meshtastic_ModuleConfig_CannedMessageConfig_InputEventChar {
type meshtastic_ModuleConfig_MapReportSettings (line 117) | typedef struct _meshtastic_ModuleConfig_MapReportSettings {
type meshtastic_ModuleConfig_MQTTConfig (line 127) | typedef struct _meshtastic_ModuleConfig_MQTTConfig {
type meshtastic_ModuleConfig_NeighborInfoConfig (line 164) | typedef struct _meshtastic_ModuleConfig_NeighborInfoConfig {
type meshtastic_ModuleConfig_DetectionSensorConfig (line 176) | typedef struct _meshtastic_ModuleConfig_DetectionSensorConfig {
type meshtastic_ModuleConfig_AudioConfig (line 204) | typedef struct _meshtastic_ModuleConfig_AudioConfig {
type meshtastic_ModuleConfig_PaxcounterConfig (line 222) | typedef struct _meshtastic_ModuleConfig_PaxcounterConfig {
type meshtastic_ModuleConfig_TrafficManagementConfig (line 234) | typedef struct _meshtastic_ModuleConfig_TrafficManagementConfig {
type meshtastic_ModuleConfig_SerialConfig (line 266) | typedef struct _meshtastic_ModuleConfig_SerialConfig {
type meshtastic_ModuleConfig_ExternalNotificationConfig (line 288) | typedef struct _meshtastic_ModuleConfig_ExternalNotificationConfig {
type meshtastic_ModuleConfig_StoreForwardConfig (line 333) | typedef struct _meshtastic_ModuleConfig_StoreForwardConfig {
type meshtastic_ModuleConfig_RangeTestConfig (line 349) | typedef struct _meshtastic_ModuleConfig_RangeTestConfig {
type meshtastic_ModuleConfig_TelemetryConfig (line 363) | typedef struct _meshtastic_ModuleConfig_TelemetryConfig {
type meshtastic_ModuleConfig_CannedMessageConfig (line 404) | typedef struct _meshtastic_ModuleConfig_CannedMessageConfig {
type meshtastic_ModuleConfig_AmbientLightingConfig (line 433) | typedef struct _meshtastic_ModuleConfig_AmbientLightingConfig {
type meshtastic_ModuleConfig_StatusMessageConfig (line 447) | typedef struct _meshtastic_ModuleConfig_StatusMessageConfig {
type meshtastic_ModuleConfig_TAKConfig (line 453) | typedef struct _meshtastic_ModuleConfig_TAKConfig {
type meshtastic_RemoteHardwarePin (line 463) | typedef struct _meshtastic_RemoteHardwarePin {
type meshtastic_ModuleConfig_RemoteHardwareConfig (line 473) | typedef struct _meshtastic_ModuleConfig_RemoteHardwareConfig {
type meshtastic_ModuleConfig (line 484) | typedef struct _meshtastic_ModuleConfig {
FILE: src/mesh/generated/meshtastic/mqtt.pb.h
type meshtastic_ServiceEnvelope (line 16) | typedef struct _meshtastic_ServiceEnvelope {
type meshtastic_MapReport (line 28) | typedef struct _meshtastic_MapReport {
FILE: src/mesh/generated/meshtastic/paxcount.pb.h
type meshtastic_Paxcount (line 14) | typedef struct _meshtastic_Paxcount {
FILE: src/mesh/generated/meshtastic/portnums.pb.h
type meshtastic_PortNum (line 25) | typedef enum _meshtastic_PortNum {
FILE: src/mesh/generated/meshtastic/powermon.pb.h
type meshtastic_PowerMon_State (line 15) | typedef enum _meshtastic_PowerMon_State {
type meshtastic_PowerStressMessage_Opcode (line 44) | typedef enum _meshtastic_PowerStressMessage_Opcode {
type meshtastic_PowerMon (line 71) | typedef struct _meshtastic_PowerMon {
type meshtastic_PowerStressMessage (line 76) | typedef struct _meshtastic_PowerStressMessage {
FILE: src/mesh/generated/meshtastic/remote_hardware.pb.h
type meshtastic_HardwareMessage_Type (line 14) | typedef enum _meshtastic_HardwareMessage_Type {
type meshtastic_HardwareMessage (line 41) | typedef struct _meshtastic_HardwareMessage {
FILE: src/mesh/generated/meshtastic/rtttl.pb.h
type meshtastic_RTTTLConfig (line 14) | typedef struct _meshtastic_RTTTLConfig {
FILE: src/mesh/generated/meshtastic/storeforward.pb.h
type meshtastic_StoreAndForward_RequestResponse (line 15) | typedef enum _meshtastic_StoreAndForward_RequestResponse {
type meshtastic_StoreAndForward_Statistics (line 54) | typedef struct _meshtastic_StoreAndForward_Statistics {
type meshtastic_StoreAndForward_History (line 76) | typedef struct _meshtastic_StoreAndForward_History {
type meshtastic_StoreAndForward_Heartbeat (line 87) | typedef struct _meshtastic_StoreAndForward_Heartbeat {
type meshtastic_StoreAndForward (line 94) | typedef PB_BYTES_ARRAY_T(233) meshtastic_StoreAndForward_text_t;
FILE: src/mesh/generated/meshtastic/telemetry.pb.h
type meshtastic_TelemetrySensorType (line 14) | typedef enum _meshtastic_TelemetrySensorType {
type meshtastic_DeviceMetrics (line 121) | typedef struct _meshtastic_DeviceMetrics {
type meshtastic_EnvironmentMetrics (line 140) | typedef struct _meshtastic_EnvironmentMetrics {
type meshtastic_PowerMetrics (line 212) | typedef struct _meshtastic_PowerMetrics {
type meshtastic_AirQualityMetrics (line 264) | typedef struct _meshtastic_AirQualityMetrics {
type meshtastic_LocalStats (line 343) | typedef struct _meshtastic_LocalStats {
type meshtastic_TrafficManagementStats (line 379) | typedef struct _meshtastic_TrafficManagementStats {
type meshtastic_HealthMetrics (line 397) | typedef struct _meshtastic_HealthMetrics {
type meshtastic_HostMetrics (line 410) | typedef struct _meshtastic_HostMetrics {
type meshtastic_Telemetry (line 436) | typedef struct _meshtastic_Telemetry {
type meshtastic_Nau7802Config (line 461) | typedef struct _meshtastic_Nau7802Config {
type meshtastic_SEN5XState (line 469) | typedef struct _meshtastic_SEN5XState {
FILE: src/mesh/generated/meshtastic/xmodem.pb.h
type meshtastic_XModem_Control (line 13) | typedef enum _meshtastic_XModem_Control {
type meshtastic_XModem (line 25) | typedef PB_BYTES_ARRAY_T(128) meshtastic_XModem_buffer_t;
FILE: src/mesh/http/ContentHandler.cpp
function registerHandlers (line 65) | void registerHandlers(HTTPServer *insecureServer, HTTPSServer *secureSer...
function handleAPIv1FromRadio (line 141) | void handleAPIv1FromRadio(HTTPRequest *req, HTTPResponse *res)
function handleAPIv1ToRadio (line 200) | void handleAPIv1ToRadio(HTTPRequest *req, HTTPResponse *res)
function htmlDeleteDir (line 232) | void htmlDeleteDir(const char *dirname)
function JSONArray (line 262) | JSONArray htmlListDir(const char *dirname, uint8_t levels)
function handleFsBrowseStatic (line 314) | void handleFsBrowseStatic(HTTPRequest *req, HTTPResponse *res)
function handleFsDeleteStatic (line 345) | void handleFsDeleteStatic(HTTPRequest *req, HTTPResponse *res)
function handleStatic (line 381) | void handleStatic(HTTPRequest *req, HTTPResponse *res)
function handleFormUpload (line 473) | void handleFormUpload(HTTPRequest *req, HTTPResponse *res)
function handleReport (line 600) | void handleReport(HTTPRequest *req, HTTPResponse *res)
function handleNodes (line 709) | void handleNodes(HTTPRequest *req, HTTPResponse *res)
function handleHotspot (line 784) | void handleHotspot(HTTPRequest *req, HTTPResponse *res)
function handleDeleteFsContent (line 803) | void handleDeleteFsContent(HTTPRequest *req, HTTPResponse *res)
function handleAdmin (line 820) | void handleAdmin(HTTPRequest *req, HTTPResponse *res)
function handleAdminSettings (line 832) | void handleAdminSettings(HTTPRequest *req, HTTPResponse *res)
function handleAdminSettingsApply (line 854) | void handleAdminSettingsApply(HTTPRequest *req, HTTPResponse *res)
function handleFs (line 866) | void handleFs(HTTPRequest *req, HTTPResponse *res)
function handleRestart (line 878) | void handleRestart(HTTPRequest *req, HTTPResponse *res)
function handleScanNetworks (line 891) | void handleScanNetworks(HTTPRequest *req, HTTPResponse *res)
FILE: src/mesh/http/ContentHandler.h
function class (line 24) | class HttpAPI : public PhoneAPI
FILE: src/mesh/http/ContentHelper.cpp
function replaceAll (line 5) | void replaceAll(std::string &str, const std::string &from, const std::st...
FILE: src/mesh/http/WebServer.cpp
function handleWebResponse (line 72) | static void handleWebResponse()
function taskCreateCert (line 96) | static void taskCreateCert(void *parameter)
function createSSLCert (line 156) | void createSSLCert()
function initWebServer (line 246) | void initWebServer()
FILE: src/mesh/http/WebServer.h
function class (line 11) | class WebServerThread : private concurrency::OSThread
FILE: src/mesh/mesh-pb-constants.cpp
function pb_encode_to_bytes (line 12) | size_t pb_encode_to_bytes(uint8_t *destbuf, size_t destbufsize, const pb...
function pb_decode_from_bytes (line 24) | bool pb_decode_from_bytes(const uint8_t *srcbuf, size_t srcbufsize, cons...
function readcb (line 37) | bool readcb(pb_istream_t *stream, uint8_t *buf, size_t count)
function writecb (line 57) | bool writecb(pb_ostream_t *stream, const uint8_t *buf, size_t count)
function is_in_helper (line 68) | bool is_in_helper(uint32_t n, const uint32_t *array, pb_size_t count)
FILE: src/mesh/mesh-pb-constants.h
function get_max_num_nodes (line 52) | static inline int get_max_num_nodes()
FILE: src/mesh/raspihttp/PiWebServer.cpp
type _file_config (line 71) | struct _file_config
function callback_static_file_stream (line 109) | static ssize_t callback_static_file_stream(void *cls, uint64_t pos, char...
function callback_static_file_stream_free (line 122) | static void callback_static_file_stream_free(void *cls)
function callback_static_file (line 132) | int callback_static_file(const struct _u_request *request, struct _u_res...
function handleWebResponse (line 219) | static void handleWebResponse() {}
function handleAPIv1ToRadio (line 225) | int handleAPIv1ToRadio(const struct _u_request *req, struct _u_response ...
function handleAPIv1FromRadio (line 260) | int handleAPIv1FromRadio(const struct _u_request *req, struct _u_respons...
function generate_rsa_key (line 308) | int generate_rsa_key(EVP_PKEY **pkey)
function generate_self_signed_x509 (line 323) | int generate_self_signed_x509(EVP_PKEY *pkey, X509 **x509)
function initWebServer (line 448) | void initWebServer() {}
FILE: src/mesh/raspihttp/PiWebServer.h
type _u_request (line 14) | struct _u_request
type _u_response (line 14) | struct _u_response
type _file_config (line 17) | struct _file_config {
function virtual (line 33) | virtual bool checkIsConnected() override { return true; }
function class (line 41) | class PiWebServerThread
FILE: src/mesh/udp/UdpMulticastHandler.h
function class (line 22) | class UdpMulticastHandler final
FILE: src/mesh/wifi/WiFiAPClient.cpp
function initEthernet (line 67) | bool initEthernet()
function onNetworkConnected (line 82) | static void onNetworkConnected()
function reconnectWiFi (line 154) | static int32_t reconnectWiFi()
function isWifiAvailable (line 232) | bool isWifiAvailable()
function deinitWifi (line 252) | void deinitWifi()
function initWifi (line 269) | bool initWifi()
function IPv6Address (line 342) | IPv6Address GlobalIPv6()
function WiFiEvent (line 355) | static void WiFiEvent(WiFiEvent_t event)
function getWifiDisconnectReason (line 552) | uint8_t getWifiDisconnectReason()
FILE: src/meshUtils.cpp
function printBytes (line 61) | void printBytes(const char *label, const uint8_t *p, size_t numbytes)
function memfll (line 73) | bool memfll(const uint8_t *mem, uint8_t find, size_t numbytes)
function isOneOf (line 82) | bool isOneOf(int item, int count, ...)
function vformat (line 97) | const std::string vformat(const char *const zcFormat, ...)
function pb_string_length (line 111) | size_t pb_string_length(const char *str, size_t max_len)
FILE: src/meshUtils.h
function pow_of_2 (line 42) | inline uint32_t pow_of_2(uint32_t n)
FILE: src/modules/AdminModule.cpp
function writeSecret (line 59) | static void writeSecret(char *buf, size_t bufsz, const char *currentVal)
type timeval (line 445) | struct timeval
function disableBluetooth (line 1561) | void disableBluetooth()
FILE: src/modules/AdminModule.h
type AdminModule_ObserverData (line 14) | struct AdminModule_ObserverData {
FILE: src/modules/AtakPluginModule.cpp
function meshtastic_TAKPacket (line 34) | meshtastic_TAKPacket AtakPluginModule::cloneTAKPacketData(meshtastic_TAK...
FILE: src/modules/CannedMessageModule.cpp
type graphics (line 50) | namespace graphics
function hasKeyForNode (line 142) | bool hasKeyForNode(const meshtastic_NodeInfoLite *node)
function getRowHeightForEmoteText (line 312) | static int getRowHeightForEmoteText(const char *text, int minimumHeight,...
function drawCenteredEmoteText (line 320) | static void drawCenteredEmoteText(OLEDDisplay *display, int x, int y, in...
function firstWrappedTokenLen (line 331) | static size_t firstWrappedTokenLen(const char *text)
function drawWrappedEmoteText (line 345) | static void drawWrappedEmoteText(OLEDDisplay *display, int x, int y, con...
function String (line 1462) | String CannedMessageModule::keyForCoordinates(uint x, uint y)
function getSnrLimit (line 2103) | static float getSnrLimit(meshtastic_Config_LoRaConfig_ModemPreset preset)
function ProcessMessage (line 2144) | ProcessMessage CannedMessageModule::handleReceived(const meshtastic_Mesh...
function AdminMessageHandleResult (line 2315) | AdminMessageHandleResult CannedMessageModule::handleAdminMessageForModul...
function String (line 2370) | String CannedMessageModule::drawWithCursor(String text, int cursor)
FILE: src/modules/CannedMessageModule.h
type cannedMessageModuleRunState (line 10) | enum cannedMessageModuleRunState {
type CannedMessageModuleIconType (line 25) | enum CannedMessageModuleIconType { shift, backspace, space, enter }
type Letter (line 34) | struct Letter {
type NodeEntry (line 43) | struct NodeEntry {
function isCharInputAllowed (line 77) | bool isCharInputAllowed() const;
function virtual (line 93) | virtual bool wantPacket(const meshtastic_MeshPacket *p) override
function virtual (line 123) | virtual bool wantUIFrame() override { return shouldDraw(); }
function UIFrameEvent (line 124) | const UIFrameEvent *> *getUIFrameObservable() override { return this; }
FILE: src/modules/DetectionSensorModule.cpp
function DetectionSensorTriggerVerdict (line 22) | static DetectionSensorTriggerVerdict detection_trigger_logic_level(bool ...
function DetectionSensorTriggerVerdict (line 27) | static DetectionSensorTriggerVerdict detection_trigger_single_edge(bool ...
function DetectionSensorTriggerVerdict (line 32) | static DetectionSensorTriggerVerdict detection_trigger_either_edge(bool ...
FILE: src/modules/DropzoneModule.cpp
function ProcessMessage (line 30) | ProcessMessage DropzoneModule::handleReceived(const meshtastic_MeshPacke...
function meshtastic_MeshPacket (line 49) | meshtastic_MeshPacket *DropzoneModule::sendConditions()
FILE: src/modules/ExternalNotificationModule.cpp
function ProcessMessage (line 349) | ProcessMessage ExternalNotificationModule::handleReceived(const meshtast...
function AdminMessageHandleResult (line 459) | AdminMessageHandleResult ExternalNotificationModule::handleAdminMessageF...
FILE: src/modules/ExternalNotificationModule.h
function class (line 17) | class rtttl
function setMute (line 51) | void setMute(bool mute) { isSilenced = mute; }
function getMute (line 52) | bool getMute() { return isSilenced; }
FILE: src/modules/GenericThreadModule.h
function class (line 9) | class GenericThreadModule : private concurrency::OSThread
FILE: src/modules/KeyVerificationModule.cpp
function AdminMessageHandleResult (line 19) | AdminMessageHandleResult KeyVerificationModule::handleAdminMessageForMod...
function meshtastic_MeshPacket (line 148) | meshtastic_MeshPacket *KeyVerificationModule::allocReply()
FILE: src/modules/KeyVerificationModule.h
type KeyVerificationState (line 6) | enum KeyVerificationState {
function class (line 15) | class KeyVerificationModule : public ProtobufModule<meshtastic_KeyVerifi...
FILE: src/modules/Modules.cpp
function setupModules (line 113) | void setupModules()
FILE: src/modules/NeighborInfoModule.cpp
function meshtastic_MeshPacket (line 137) | meshtastic_MeshPacket *NeighborInfoModule::allocReply()
function meshtastic_Neighbor (line 212) | meshtastic_Neighbor *NeighborInfoModule::getOrCreateNeighbor(NodeNum ori...
FILE: src/modules/NeighborInfoModule.h
function runOnce (line 64) | int32_t runOnce() override;
FILE: src/modules/NodeInfoModule.cpp
function meshtastic_MeshPacket (line 121) | meshtastic_MeshPacket *NodeInfoModule::allocReply()
FILE: src/modules/OnScreenKeyboardModule.cpp
type graphics (line 12) | namespace graphics
function OnScreenKeyboardModule (line 15) | OnScreenKeyboardModule &OnScreenKeyboardModule::instance()
FILE: src/modules/OnScreenKeyboardModule.h
function namespace (line 12) | namespace graphics
FILE: src/modules/PositionModule.cpp
type timeval (line 148) | struct timeval
function meshtastic_MeshPacket (line 179) | meshtastic_MeshPacket *PositionModule::allocPositionPacket()
function meshtastic_MeshPacket (line 292) | meshtastic_MeshPacket *PositionModule::allocReply()
function meshtastic_MeshPacket (line 308) | meshtastic_MeshPacket *PositionModule::allocAtakPli()
function computeImpreciseLatLon (line 507) | static inline void computeImpreciseLatLon(int32_t inLat, int32_t inLon, ...
type SmartPosition (line 533) | struct SmartPosition
FILE: src/modules/PositionModule.h
type SmartPosition (line 59) | struct SmartPosition
type SmartPosition (line 80) | struct SmartPosition {
FILE: src/modules/RangeTestModule.cpp
function ProcessMessage (line 136) | ProcessMessage RangeTestModuleRadio::handleReceived(const meshtastic_Mes...
type timeval (line 256) | struct timeval
FILE: src/modules/RangeTestModule.h
function class (line 9) | class RangeTestModule : private concurrency::OSThread
function class (line 27) | class RangeTestModuleRadio : public SinglePortModule
FILE: src/modules/RemoteHardwareModule.cpp
function pinAccessAllowed (line 19) | static bool pinAccessAllowed(uint64_t mask, uint8_t pin)
function pinModes (line 35) | static void pinModes(uint64_t mask, uint8_t mode, uint64_t maskAvailable)
function digitalReads (line 47) | static uint64_t digitalReads(uint64_t mask, uint64_t maskAvailable)
FILE: src/modules/ReplyBotModule.cpp
type ReplyBotCooldownEntry (line 35) | struct ReplyBotCooldownEntry {
function replybotRateLimited (line 49) | static bool replybotRateLimited(uint32_t from, uint32_t cooldownMs)
function ProcessMessage (line 89) | ProcessMessage ReplyBotModule::handleReceived(const meshtastic_MeshPacke...
FILE: src/modules/ReplyBotModule.h
function class (line 7) | class ReplyBotModule : public SinglePortModule
FILE: src/modules/ReplyModule.cpp
function meshtastic_MeshPacket (line 8) | meshtastic_MeshPacket *ReplyModule::allocReply()
FILE: src/modules/ReplyModule.h
function class (line 7) | class ReplyModule : public SinglePortModule
FILE: src/modules/RoutingModule.cpp
function meshtastic_MeshPacket (line 43) | meshtastic_MeshPacket *RoutingModule::allocReply()
function meshtastic_MeshPacket (line 79) | meshtastic_MeshPacket *RoutingModule::allocAckNak(meshtastic_Routing_Err...
FILE: src/modules/RoutingModule.h
function class (line 8) | class RoutingModule : public ProtobufModule<meshtastic_Routing>
FILE: src/modules/SerialModule.cpp
function meshtastic_MeshPacket (line 331) | meshtastic_MeshPacket *SerialModuleRadio::allocReply()
function ProcessMessage (line 368) | ProcessMessage SerialModuleRadio::handleReceived(const meshtastic_MeshPa...
type ParsedLine (line 472) | struct ParsedLine {
function ParsedLine (line 482) | ParsedLine parseLine(const char *line)
FILE: src/modules/SerialModule.h
function class (line 43) | class SerialModuleRadio : public MeshModule
FILE: src/modules/StatusLEDModule.h
function class (line 16) | class StatusLEDModule : private concurrency::OSThread
FILE: src/modules/StatusMessageModule.cpp
function ProcessMessage (line 29) | ProcessMessage StatusMessageModule::handleReceived(const meshtastic_Mesh...
FILE: src/modules/StoreForwardModule.cpp
function meshtastic_MeshPacket (line 152) | meshtastic_MeshPacket *StoreForwardModule::getForPhone()
function meshtastic_MeshPacket (line 240) | meshtastic_MeshPacket *StoreForwardModule::preparePayload(NodeNum dest, ...
function ProcessMessage (line 394) | ProcessMessage StoreForwardModule::handleReceived(const meshtastic_MeshP...
FILE: src/modules/StoreForwardModule.h
type PacketHistoryStruct (line 12) | struct PacketHistoryStruct {
function isServer (line 74) | bool isServer() { return is_server; }
function virtual (line 79) | virtual bool wantPacket(const meshtastic_MeshPacket *p) override
FILE: src/modules/SystemCommandsModule.h
function class (line 9) | class SystemCommandsModule
FILE: src/modules/Telemetry/AirQualityTelemetry.cpp
function meshtastic_MeshPacket (line 327) | meshtastic_MeshPacket *AirQualityTelemetryModule::allocReply()
function AdminMessageHandleResult (line 450) | AdminMessageHandleResult AirQualityTelemetryModule::handleAdminMessageFo...
FILE: src/modules/Telemetry/BaseTelemetryModule.h
function class (line 6) | class BaseTelemetryModule
FILE: src/modules/Telemetry/DeviceTelemetry.cpp
function meshtastic_MeshPacket (line 63) | meshtastic_MeshPacket *DeviceTelemetryModule::allocReply()
function meshtastic_Telemetry (line 93) | meshtastic_Telemetry DeviceTelemetryModule::getDeviceTelemetry()
function meshtastic_Telemetry (line 116) | meshtastic_Telemetry DeviceTelemetryModule::getLocalStatsTelemetry()
FILE: src/modules/Telemetry/DeviceTelemetry.h
function virtual (line 26) | virtual bool wantUIFrame() { return false; }
function virtual (line 34) | virtual int32_t runOnce() override;
function refreshUptime (line 55) | void refreshUptime()
FILE: src/modules/Telemetry/EnvironmentTelemetry.cpp
type graphics (line 32) | namespace graphics
function meshtastic_MeshPacket (line 586) | meshtastic_MeshPacket *EnvironmentTelemetryModule::allocReply()
function AdminMessageHandleResult (line 678) | AdminMessageHandleResult EnvironmentTelemetryModule::handleAdminMessageF...
FILE: src/modules/Telemetry/HealthTelemetry.cpp
function meshtastic_MeshPacket (line 197) | meshtastic_MeshPacket *HealthTelemetryModule::allocReply()
FILE: src/modules/Telemetry/HostMetrics.cpp
function meshtastic_Telemetry (line 68) | meshtastic_Telemetry HostMetricsModule::getHostMetrics()
FILE: src/modules/Telemetry/HostMetrics.h
function virtual (line 20) | virtual bool wantUIFrame() { return false; }
FILE: src/modules/Telemetry/PowerTelemetry.cpp
type graphics (line 28) | namespace graphics
function meshtastic_MeshPacket (line 222) | meshtastic_MeshPacket *PowerTelemetryModule::allocReply()
FILE: src/modules/Telemetry/Sensor/AHT10.h
function class (line 17) | class AHT10Sensor : public TelemetrySensor
FILE: src/modules/Telemetry/Sensor/BH1750Sensor.h
function class (line 10) | class BH1750Sensor : public TelemetrySensor
FILE: src/modules/Telemetry/Sensor/BME280Sensor.h
function class (line 9) | class BME280Sensor : public TelemetrySensor
FILE: src/modules/Telemetry/Sensor/BME680Sensor.h
function class (line 23) | class BME680Sensor : public TelemetrySensor
FILE: src/modules/Telemetry/Sensor/BMP085Sensor.h
function class (line 9) | class BMP085Sensor : public TelemetrySensor
FILE: src/modules/Telemetry/Sensor/BMP280Sensor.h
function class (line 9) | class BMP280Sensor : public TelemetrySensor
FILE: src/modules/Telemetry/Sensor/BMP3XXSensor.cpp
function BMP3XXSingleton (line 62) | BMP3XXSingleton *BMP3XXSingleton::GetInstance()
FILE: src/modules/Telemetry/Sensor/BMP3XXSensor.h
function class (line 15) | class BMP3XXSingleton : public Adafruit_BMP3XX
function class (line 42) | class BMP3XXSensor : public TelemetrySensor
FILE: src/modules/Telemetry/Sensor/CGRadSensSensor.h
function class (line 13) | class CGRadSensSensor : public TelemetrySensor
FILE: src/modules/Telemetry/Sensor/CurrentSensor.h
function class (line 7) | class CurrentSensor
FILE: src/modules/Telemetry/Sensor/DFRobotGravitySensor.h
function class (line 14) | class DFRobotGravitySensor : public TelemetrySensor
FILE: src/modules/Telemetry/Sensor/DFRobotLarkSensor.h
function class (line 14) | class DFRobotLarkSensor : public TelemetrySensor
FILE: src/modules/Telemetry/Sensor/DPS310Sensor.h
function class (line 9) | class DPS310Sensor : public TelemetrySensor
FILE: src/modules/Telemetry/Sensor/INA3221Sensor.cpp
type _INA3221Measurement (line 30) | struct _INA3221Measurement
type _INA3221Measurement (line 32) | struct _INA3221Measurement
type _INA3221Measurements (line 40) | struct _INA3221Measurements
type _INA3221Measurements (line 42) | struct _INA3221Measurements
type _INA3221Measurement (line 68) | struct _INA3221Measurement
type _INA3221Measurements (line 81) | struct _INA3221Measurements
FILE: src/modules/Telemetry/Sensor/INA3221Sensor.h
type _INA3221Measurement (line 31) | struct _INA3221Measurement
type _INA3221Measurements (line 34) | struct _INA3221Measurements
type _INA3221Measurement (line 50) | struct _INA3221Measurement {
type _INA3221Measurements (line 55) | struct _INA3221Measurements {
FILE: src/modules/Telemetry/Sensor/IndicatorSensor.cpp
type sensor_pkt_type (line 21) | enum sensor_pkt_type {
function cmd_send (line 36) | static int cmd_send(uint8_t cmd, const char *p_data, uint8_t len)
FILE: src/modules/Telemetry/Sensor/IndicatorSensor.h
function class (line 8) | class IndicatorSensor : public TelemetrySensor
FILE: src/modules/Telemetry/Sensor/LPS22HBSensor.h
function class (line 10) | class LPS22HBSensor : public TelemetrySensor
FILE: src/modules/Telemetry/Sensor/LTR390UVSensor.h
function class (line 9) | class LTR390UVSensor : public TelemetrySensor
FILE: src/modules/Telemetry/Sensor/MAX17048Sensor.h
type MAX17048ChargeSample (line 27) | struct MAX17048ChargeSample {
type MAX17048ChargeState (line 32) | enum MAX17048ChargeState { IDLE, EXPORT, IMPORT }
function class (line 35) | class MAX17048Singleton : public Adafruit_MAX17048
FILE: src/modules/Telemetry/Sensor/MAX30102Sensor.h
function class (line 11) | class MAX30102Sensor : public TelemetrySensor
FILE: src/modules/Telemetry/Sensor/MCP9808Sensor.h
function class (line 9) | class MCP9808Sensor : public TelemetrySensor
FILE: src/modules/Telemetry/Sensor/MLX90614Sensor.h
function class (line 10) | class MLX90614Sensor : public TelemetrySensor
FILE: src/modules/Telemetry/Sensor/MLX90632Sensor.h
function class (line 9) | class MLX90632Sensor : public TelemetrySensor
FILE: src/modules/Telemetry/Sensor/NAU7802Sensor.cpp
function AdminMessageHandleResult (line 66) | AdminMessageHandleResult NAU7802Sensor::handleAdminMessage(const meshtas...
FILE: src/modules/Telemetry/Sensor/NAU7802Sensor.h
function class (line 10) | class NAU7802Sensor : public TelemetrySensor
FILE: src/modules/Telemetry/Sensor/OPT3001Sensor.h
function class (line 10) | class OPT3001Sensor : public TelemetrySensor
FILE: src/modules/Telemetry/Sensor/PCT2075Sensor.h
function class (line 10) | class PCT2075Sensor : public TelemetrySensor
FILE: src/modules/Telemetry/Sensor/PMSA003ISensor.h
function class (line 13) | class PMSA003ISensor : public TelemetrySensor
FILE: src/modules/Telemetry/Sensor/RAK12035Sensor.h
function class (line 15) | class RAK12035Sensor : public TelemetrySensor
FILE: src/modules/Telemetry/Sensor/RAK9154Sensor.cpp
function onewire_evt (line 31) | static void onewire_evt(const uint8_t pid, const uint8_t sid, const SNHU...
function onewireHandle (line 130) | static int32_t onewireHandle()
FILE: src/modules/Telemetry/Sensor/RAK9154Sensor.h
function hasSensor (line 21) | bool hasSensor() { return true; }
FILE: src/modules/Telemetry/Sensor/RCWL9620Sensor.h
function class (line 9) | class RCWL9620Sensor : public TelemetrySensor
FILE: src/modules/Telemetry/Sensor/SCD30Sensor.cpp
function AdminMessageHandleResult (line 435) | AdminMessageHandleResult SCD30Sensor::handleAdminMessage(const meshtasti...
FILE: src/modules/Telemetry/Sensor/SCD30Sensor.h
function class (line 11) | class SCD30Sensor : public TelemetrySensor
FILE: src/modules/Telemetry/Sensor/SCD4XSensor.cpp
function AdminMessageHandleResult (line 794) | AdminMessageHandleResult SCD4XSensor::handleAdminMessage(const meshtasti...
FILE: src/modules/Telemetry/Sensor/SCD4XSensor.h
function class (line 14) | class SCD4XSensor : public TelemetrySensor
FILE: src/modules/Telemetry/Sensor/SEN5XSensor.cpp
function AdminMessageHandleResult (line 930) | AdminMessageHandleResult SEN5XSensor::handleAdminMessage(const meshtasti...
FILE: src/modules/Telemetry/Sensor/SEN5XSensor.h
type _SEN5XMeasurements (line 43) | struct _SEN5XMeasurements {
function class (line 60) | class SEN5XSensor : public TelemetrySensor
FILE: src/modules/Telemetry/Sensor/SFA30Sensor.h
function class (line 14) | class SFA30Sensor : public TelemetrySensor
FILE: src/modules/Telemetry/Sensor/SHT31Sensor.h
function class (line 9) | class SHT31Sensor : public TelemetrySensor
FILE: src/modules/Telemetry/Sensor/SHT4XSensor.h
function class (line 9) | class SHT4XSensor : public TelemetrySensor
FILE: src/modules/Telemetry/Sensor/SHTC3Sensor.h
function class (line 9) | class SHTC3Sensor : public TelemetrySensor
FILE: src/modules/Telemetry/Sensor/T1000xSensor.h
function class (line 8) | class T1000xSensor : public TelemetrySensor
FILE: src/modules/Telemetry/Sensor/TSL2561Sensor.h
function class (line 9) | class TSL2561Sensor : public TelemetrySensor
FILE: src/modules/Telemetry/Sensor/TSL2591Sensor.h
function class (line 9) | class TSL2591Sensor : public TelemetrySensor
FILE: src/modules/Telemetry/Sensor/TelemetrySensor.h
function class (line 19) | class TelemetrySensor
function initI2CSensor (line 33) | int32_t initI2CSensor()
function virtual (line 47) | virtual void setup() {}
function hasSensor (line 60) | bool hasSensor() { return nodeTelemetrySensorsMap[sensorType].first > 0; }
function virtual (line 64) | virtual void sleep(){}
function virtual (line 65) | virtual uint32_t wakeUp() { return 0; }
function virtual (line 66) | virtual bool isActive() { return true; }
function virtual (line 67) | virtual bool canSleep() { return false; }
function virtual (line 68) | virtual int32_t wakeUpTimeMs() { return 0; }
function virtual (line 69) | virtual int32_t pendingForReadyMs() { return 0; }
function virtual (line 73) | virtual bool onlyWire1() { return false; }
function virtual (line 75) | virtual int32_t runOnce() { return INT32_MAX; }
function virtual (line 76) | virtual bool isInitialized() { return initialized; }
function virtual (line 78) | virtual bool isRunning() { return status > 0; }
function virtual (line 81) | virtual bool initDevice(TwoWire *bus, ScanI2C::FoundDevice *dev) { retur...
FILE: src/modules/Telemetry/Sensor/VEML7700Sensor.h
function class (line 9) | class VEML7700Sensor : public TelemetrySensor
FILE: src/modules/Telemetry/Sensor/VoltageSensor.h
function class (line 7) | class VoltageSensor
FILE: src/modules/Telemetry/Sensor/nullSensor.h
function virtual (line 20) | virtual int32_t runOnce() override;
FILE: src/modules/Telemetry/UnitConversions.h
function class (line 3) | class UnitConversions
FILE: src/modules/TextMessageModule.cpp
function ProcessMessage (line 14) | ProcessMessage TextMessageModule::handleReceived(const meshtastic_MeshPa...
FILE: src/modules/TraceRouteModule.cpp
function meshtastic_MeshPacket (line 460) | meshtastic_MeshPacket *TraceRouteModule::allocReply()
FILE: src/modules/TraceRouteModule.h
type TraceRouteRunState (line 17) | enum TraceRouteRunState { TRACEROUTE_STATE_IDLE, TRACEROUTE_STATE_TRACKI...
function virtual (line 36) | virtual bool wantUIFrame() override { return shouldDraw(); }
function UIFrameEvent (line 37) | const UIFrameEvent *> *getUIFrameObservable() override { return this; }
FILE: src/modules/TrafficManagementModule.cpp
function secsToMs (line 42) | uint32_t secsToMs(uint32_t secs)
function sanitizePositionPrecision (line 54) | uint8_t sanitizePositionPrecision(uint8_t precision)
function isWithinWindow (line 71) | bool isWithinWindow(uint32_t nowMs, uint32_t startMs, uint32_t intervalMs)
function truncateLatLon (line 89) | int32_t truncateLatLon(int32_t value, uint8_t precision)
function saturatingIncrement (line 107) | inline void saturatingIncrement(uint8_t &counter)
function meshtastic_TrafficManagementStats (line 268) | meshtastic_TrafficManagementStats TrafficManagementModule::getStats() const
function ProcessMessage (line 885) | ProcessMessage TrafficManagementModule::handleReceived(const meshtastic_...
FILE: src/modules/TrafficManagementModule.h
function meshtastic_TrafficManagementStats (line 37) | meshtastic_TrafficManagementStats getStats() const;
function wantPacket (line 53) | bool wantPacket(const meshtastic_MeshPacket *p) override { return true; }
function runOnce (line 55) | int32_t runOnce() override;
function cuckooHash2 (line 126) | inline uint16_t cuckooHash2(NodeNum node) const { return ((node * 265443...
function nodeInfoHash1 (line 157) | inline uint16_t nodeInfoHash1(NodeNum node) const { return node & nodeIn...
function nodeInfoHash2 (line 158) | inline uint16_t nodeInfoHash2(NodeNum node) const
function calcTimeResolution (line 183) | static uint16_t calcTimeResolution(uint32_t intervalSecs)
function toRelativeTime (line 196) | uint8_t toRelativeTime(uint32_t nowMs, uint16_t resolutionSecs) const
function fromRelativeTime (line 201) | uint32_t fromRelativeTime(uint8_t ticks, uint16_t resolutionSecs) const
function toRelativePosTime (line 207) | uint8_t toRelativePosTime(uint32_t nowMs) const { return toRelativeTime(...
function fromRelativePosTime (line 208) | uint32_t fromRelativePosTime(uint8_t t) const { return fromRelativeTime(...
function toRelativeRateTime (line 210) | uint8_t toRelativeRateTime(uint32_t nowMs) const { return toRelativeTime...
function fromRelativeRateTime (line 211) | uint32_t fromRelativeRateTime(uint8_t t) const { return fromRelativeTime...
function toRelativeUnknownTime (line 213) | uint8_t toRelativeUnknownTime(uint32_t nowMs) const { return toRelativeT...
function fromRelativeUnknownTime (line 214) | uint32_t fromRelativeUnknownTime(uint8_t t) const { return fromRelativeT...
function needsEpochReset (line 218) | bool needsEpochReset(uint32_t nowMs) const
type NodeInfoPayloadEntry (line 252) | struct NodeInfoPayloadEntry {
function countNodeInfoEntriesLocked (line 319) | uint16_t countNodeInfoEntriesLocked() const;
function cacheSize (line 367) | constexpr uint16_t TrafficManagementModule::cacheSize()
function cacheMask (line 372) | constexpr uint16_t TrafficManagementModule::cacheMask()
function cuckooHashBits (line 377) | constexpr uint8_t TrafficManagementModule::cuckooHashBits()
function nodeInfoTargetEntries (line 382) | constexpr uint16_t TrafficManagementModule::nodeInfoTargetEntries()
function nodeInfoIndexMetadataBudgetBytes (line 387) | constexpr uint16_t TrafficManagementModule::nodeInfoIndexMetadataBudgetB...
function nodeInfoTargetOccupancyPercent (line 392) | constexpr uint8_t TrafficManagementModule::nodeInfoTargetOccupancyPercent()
function nodeInfoBucketSize (line 397) | constexpr uint8_t TrafficManagementModule::nodeInfoBucketSize()
function nodeInfoTagBits (line 402) | constexpr uint8_t TrafficManagementModule::nodeInfoTagBits()
function nodeInfoTagMask (line 407) | constexpr uint16_t TrafficManagementModule::nodeInfoTagMask()
function nodeInfoIndexSlots (line 412) | constexpr uint16_t TrafficManagementModule::nodeInfoIndexSlots()
function nodeInfoBucketCount (line 417) | constexpr uint16_t TrafficManagementModule::nodeInfoBucketCount()
function nodeInfoBucketMask (line 422) | constexpr uint16_t TrafficManagementModule::nodeInfoBucketMask()
function nodeInfoBucketHashBits (line 427) | constexpr uint8_t TrafficManagementModule::nodeInfoBucketHashBits()
FILE: src/modules/WaypointModule.cpp
function degToRad (line 18) | static inline float degToRad(float deg)
function radToDeg (line 22) | static inline float radToDeg(float rad)
function ProcessMessage (line 27) | ProcessMessage WaypointModule::handleReceived(const meshtastic_MeshPacke...
FILE: src/modules/WaypointModule.h
function virtual (line 27) | virtual bool wantUIFrame() override { return this->shouldDraw(); }
FILE: src/modules/esp32/AudioModule.cpp
function run_codec2 (line 44) | void run_codec2(void *parameter)
function meshtastic_MeshPacket (line 242) | meshtastic_MeshPacket *AudioModule::allocReply()
function ProcessMessage (line 271) | ProcessMessage AudioModule::handleReceived(const meshtastic_MeshPacket &mp)
FILE: src/modules/esp32/AudioModule.h
type RadioState (line 16) | enum RadioState { standby, rx, tx }
type c2_header (line 20) | struct c2_header {
type CODEC2 (line 50) | struct CODEC2
function virtual (line 66) | virtual int32_t runOnce() override;
function UIFrameEvent (line 71) | const UIFrameEvent *> *getUIFrameObservable() override { return this; }
FILE: src/modules/esp32/PaxcounterModule.cpp
function meshtastic_MeshPacket (line 70) | meshtastic_MeshPacket *PaxcounterModule::allocReply()
type libpax_config_t (line 87) | struct libpax_config_t
FILE: src/modules/esp32/PaxcounterModule.h
type count_payload_t (line 25) | struct count_payload_t
function virtual (line 26) | virtual int32_t runOnce() override;
function virtual (line 32) | virtual bool wantUIFrame() override { return isActive(); }
FILE: src/motion/AccelerometerThread.h
function class (line 32) | class AccelerometerThread : public concurrency::OSThread
FILE: src/motion/BMI270Sensor.h
function class (line 9) | class BMI270Sensor : public MotionSensor
FILE: src/motion/BMM150Sensor.cpp
function BMM150Singleton (line 55) | BMM150Singleton *BMM150Singleton::GetInstance(ScanI2C::FoundDevice device)
FILE: src/motion/BMM150Sensor.h
function class (line 16) | class BMM150Singleton : public DFRobot_BMM150_I2C
function class (line 39) | class BMM150Sensor : public MotionSensor
FILE: src/motion/BMX160Sensor.h
function class (line 15) | class BMX160Sensor : public MotionSensor
function class (line 32) | class BMX160Sensor : public MotionSensor
FILE: src/motion/ICM20948Sensor.cpp
function ICM20948SetInterrupt (line 14) | void ICM20948SetInterrupt()
function ICM20948Singleton (line 199) | ICM20948Singleton *ICM20948Singleton::GetInstance()
FILE: src/motion/ICM20948Sensor.h
function class (line 49) | class ICM20948Singleton : public ICM_20948_I2C
function class (line 80) | class ICM20948Sensor : public MotionSensor
FILE: src/motion/LSM6DS3Sensor.h
function class (line 15) | class LSM6DS3Sensor : public MotionSensor
FILE: src/motion/MotionSensor.h
function class (line 20) | class MotionSensor
FILE: src/motion/QMA6100PSensor.cpp
function QMA6100PSetInterrupt (line 9) | void QMA6100PSetInterrupt()
function QMA6100PSingleton (line 65) | QMA6100PSingleton *QMA6100PSingleton::GetInstance()
FILE: src/motion/QMA6100PSensor.h
function class (line 20) | class QMA6100PSingleton : public QMA6100P
function class (line 46) | class QMA6100PSensor : public MotionSensor
FILE: src/motion/STK8XXXSensor.h
function class (line 13) | class STK8XXXSensor : public MotionSensor
function class (line 27) | class STK8XXXSensor : public MotionSensor
FILE: src/mqtt/MQTT.cpp
function onReceiveProto (line 59) | inline void onReceiveProto(char *topic, byte *payload, size_t length)
function isValidJsonEnvelope (line 153) | inline bool isValidJsonEnvelope(JSONObject &json)
function onReceiveJson (line 166) | inline void onReceiveJson(byte *payload, size_t length)
function isPrivateIpAddress (line 242) | bool isPrivateIpAddress(const IPAddress &ip)
function parseHostAndPort (line 267) | std::pair<String, uint16_t> parseHostAndPort(String server, uint16_t por...
function isDefaultServer (line 282) | bool isDefaultServer(const String &host)
function isDefaultRootTopic (line 287) | bool isDefaultRootTopic(const String &root)
type PubSubConfig (line 292) | struct PubSubConfig {
method PubSubConfig (line 293) | explicit PubSubConfig(const meshtastic_ModuleConfig_MQTTConfig &config)
function connectPubSub (line 319) | bool connectPubSub(const PubSubConfig &config, PubSubClient &pubSub, Cli...
function isConnectedToNetwork (line 342) | inline bool isConnectedToNetwork()
function wantsLink (line 360) | bool wantsLink()
function mqttInit (line 408) | void mqttInit()
function else (line 495) | else if (isConnectedDirectly()) {
function else (line 518) | else if (isConnectedDirectly()) {
FILE: src/mqtt/MQTT.h
function isEnabled (line 57) | bool isEnabled() { return this->enabled; }
function start (line 59) | void start() { setIntervalFromNow(0); }
function isUsingDefaultServer (line 61) | bool isUsingDefaultServer() { return isConfiguredForDefaultServer; }
function isUsingDefaultRootTopic (line 62) | bool isUsingDefaultRootTopic() { return isConfiguredForDefaultRootTopic; }
function isValidConfig (line 65) | static bool isValidConfig(const meshtastic_ModuleConfig_MQTTConfig &conf...
type QueueEntry (line 68) | struct QueueEntry {
FILE: src/mqtt/ServiceEnvelope.h
function meshtastic_ServiceEnvelope (line 6) | struct DecodedServiceEnvelope : public meshtastic_ServiceEnvelope {
FILE: src/network-stubs.cpp
function initWifi (line 5) | bool initWifi()
function deinitWifi (line 10) | void deinitWifi() {}
function isWifiAvailable (line 12) | bool isWifiAvailable()
function initEthernet (line 21) | bool initEthernet()
function isEthernetAvailable (line 26) | bool isEthernetAvailable()
FILE: src/nimble/NimbleBluetooth.cpp
function clearPairingDisplay (line 55) | static void clearPairingDisplay()
class BluetoothPhoneAPI (line 69) | class BluetoothPhoneAPI : public PhoneAPI, public concurrency::OSThread
method BluetoothPhoneAPI (line 136) | BluetoothPhoneAPI() : concurrency::OSThread("NimbleBluetooth") { api_t...
method runOnce (line 160) | virtual int32_t runOnce() override
method onConfigStart (line 190) | virtual void onConfigStart() override
method onConfigComplete (line 203) | virtual void onConfigComplete() override
method runOnceHasWorkToDo (line 216) | bool runOnceHasWorkToDo() { return runOnceHasWorkToPhone() || runOnceH...
method runOnceHasWorkToPhone (line 218) | bool runOnceHasWorkToPhone() { return onReadCallbackIsWaitingForData |...
method runOnceToPhoneCanPreloadNextPacket (line 220) | bool runOnceToPhoneCanPreloadNextPacket()
method runOnceHandleToPhoneQueue (line 245) | void runOnceHandleToPhoneQueue()
method runOnceHasWorkFromPhone (line 292) | bool runOnceHasWorkFromPhone() { return fromPhoneQueueSize > 0; }
method runOnceHandleFromPhoneQueue (line 294) | void runOnceHandleFromPhoneQueue()
method onNowHasData (line 326) | virtual void onNowHasData(uint32_t fromRadioNum)
method checkIsConnected (line 353) | virtual bool checkIsConnected() { return bleServer && bleServer->getCo...
method requestHighThroughputConnection (line 355) | void requestHighThroughputConnection(uint16_t conn_handle)
method requestLowerPowerConnection (line 380) | void requestLowerPowerConnection(uint16_t conn_handle)
function onWrite (line 417) | virtual void onWrite(NimBLECharacteristic *pCharacteristic)
function onRead (line 469) | virtual void onRead(NimBLECharacteristic *pCharacteristic)
function NimbleBluetoothServerCallback (line 580) | NimbleBluetoothServerCallback(NimbleBluetooth *ble) { this->ble = ble; }
function onPassKeyRequest (line 587) | virtual uint32_t onPassKeyRequest()
function onAuthenticationComplete (line 640) | virtual void onAuthenticationComplete(ble_gap_conn_desc *desc)
function onConnect (line 658) | virtual void onConnect(NimBLEServer *pServer, NimBLEConnInfo &connInfo)
function onDisconnect (line 686) | virtual void onDisconnect(NimBLEServer *pServer, NimBLEConnInfo &connInf...
function updateBatteryLevel (line 962) | void updateBatteryLevel(uint8_t level)
function clearNVS (line 992) | void clearNVS()
FILE: src/nimble/NimbleBluetooth.h
function class (line 4) | class NimbleBluetooth : BluetoothApi
FILE: src/platform/esp32/ESP32CryptoEngine.cpp
class ESP32CryptoEngine (line 6) | class ESP32CryptoEngine : public CryptoEngine
method ESP32CryptoEngine (line 12) | ESP32CryptoEngine() { mbedtls_aes_init(&aes); }
method encryptAESCtr (line 22) | virtual void encryptAESCtr(CryptoKey _key, uint8_t *_nonce, size_t num...
FILE: src/platform/esp32/MeshtasticOTA.cpp
type MeshtasticOTA (line 8) | namespace MeshtasticOTA
function isUpdated (line 18) | bool isUpdated()
function initialize (line 23) | void initialize()
function recoverConfig (line 35) | void recoverConfig(meshtastic_Config_NetworkConfig *network)
function saveConfig (line 50) | void saveConfig(meshtastic_Config_NetworkConfig *network, meshtastic_O...
function esp_partition_t (line 64) | const esp_partition_t *getAppPartition()
function getAppDesc (line 69) | bool getAppDesc(const esp_partition_t *part, esp_app_desc_t *app_desc)
function checkOTACapability (line 78) | bool checkOTACapability(const esp_app_desc_t *app_desc, uint8_t method)
function trySwitchToOTA (line 97) | bool trySwitchToOTA()
FILE: src/platform/esp32/MeshtasticOTA.h
function namespace (line 13) | namespace MeshtasticOTA
FILE: src/platform/esp32/SimpleAllocator.h
function class (line 15) | class SimpleAllocator
function class (line 38) | class AllocatorScope
FILE: src/platform/esp32/iram-quirk.c
function IRAM_ATTR (line 11) | IRAM_ATTR esp_err_t stub_probe(esp_flash_t *chip, uint32_t flash_id)
FILE: src/platform/esp32/main-esp32.cpp
function variant_shutdown (line 30) | void variant_shutdown() {}
function setBluetoothEnable (line 33) | void setBluetoothEnable(bool enable)
function setBluetoothEnable (line 56) | void setBluetoothEnable(bool enable) {}
function updateBatteryLevel (line 57) | void updateBatteryLevel(uint8_t level) {}
function getMacAddr (line 60) | void getMacAddr(uint8_t *dmac)
function calibrate_one (line 74) | static uint32_t calibrate_one(rtc_cal_sel_t cal_clk, const char *name)
function enableSlowCLK (line 85) | void enableSlowCLK()
function esp32Setup (line 109) | void esp32Setup()
function esp32Loop (line 187) | void esp32Loop()
function cpuDeepSleep (line 195) | void cpuDeepSleep(uint32_t msecToWake)
FILE: src/platform/extra_variants/heltec_wireless_tracker/variant.cpp
function lateInitVariant (line 10) | void lateInitVariant()
FILE: src/platform/extra_variants/t_deck_pro/variant.cpp
function readTouch (line 11) | bool readTouch(int16_t *x, int16_t *y)
function lateInitVariant (line 22) | void lateInitVariant()
FILE: src/platform/extra_variants/t_lora_pager/variant.cpp
function lateInitVariant (line 11) | void lateInitVariant()
FILE: src/platform/extra_variants/tbeam_displayshield/variant.cpp
function readTouch (line 13) | bool readTouch(int16_t *x, int16_t *y)
function lateInitVariant (line 29) | void lateInitVariant()
FILE: src/platform/nrf52/AsyncUDP.cpp
function IPAddress (line 59) | IPAddress AsyncUDPPacket::remoteIP()
FILE: src/platform/nrf52/AsyncUDP.h
function class (line 39) | class AsyncUDPPacket
function isMulticast (line 58) | inline bool isMulticast(const IPAddress &ip)
FILE: src/platform/nrf52/BLEDfuSecure.cpp
function crc16 (line 49) | static uint16_t crc16(const uint8_t *data_p, uint8_t length)
function bledfu_control_wr_authorize_cb (line 61) | static void bledfu_control_wr_authorize_cb(uint16_t conn_hdl, BLECharact...
function err_t (line 132) | err_t BLEDfuSecure::begin(void)
FILE: src/platform/nrf52/BLEDfuSecure.h
function class (line 44) | class BLEDfuSecure : public BLEService
FILE: src/platform/nrf52/NRF52Bluetooth.cpp
class BluetoothPhoneAPI (line 37) | class BluetoothPhoneAPI : public PhoneAPI
method onNowHasData (line 42) | virtual void onNowHasData(uint32_t fromRadioNum) override
method checkIsConnected (line 51) | virtual bool checkIsConnected() override { return Bluefruit.connected(...
method BluetoothPhoneAPI (line 54) | BluetoothPhoneAPI() { api_type = TYPE_BLE; }
function onConnect (line 59) | void onConnect(uint16_t conn_handle)
function onDisconnect (line 77) | void onDisconnect(uint16_t conn_handle, uint8_t reason)
function onCccd (line 101) | void onCccd(uint16_t conn_hdl, BLECharacteristic *chr, uint16_t cccd_value)
function startAdv (line 120) | void startAdv(void)
function authorizeRead (line 146) | static void authorizeRead(uint16_t conn_hdl)
function onFromRadioAuthorize (line 155) | void onFromRadioAuthorize(uint16_t conn_hdl, BLECharacteristic *chr, ble...
function onToRadioWrite (line 169) | void onToRadioWrite(uint16_t conn_hdl, BLECharacteristic *chr, uint8_t *...
function setupMeshService (line 181) | void setupMeshService(void)
function updateBatteryLevel (line 351) | void updateBatteryLevel(uint8_t level)
FILE: src/platform/nrf52/NRF52Bluetooth.h
function class (line 6) | class NRF52Bluetooth : BluetoothApi
FILE: src/platform/nrf52/NRF52CryptoEngine.cpp
class NRF52CryptoEngine (line 5) | class NRF52CryptoEngine : public CryptoEngine
method NRF52CryptoEngine (line 8) | NRF52CryptoEngine() {}
method encryptAESCtr (line 12) | virtual void encryptAESCtr(CryptoKey _key, uint8_t *_nonce, size_t num...
FILE: src/platform/nrf52/aes-256/tiny-aes.cpp
function KeyExpansion (line 40) | static void KeyExpansion(uint8_t *RoundKey, const uint8_t *Key)
function AES_init_ctx (line 89) | void AES_init_ctx(struct AES_ctx *ctx, const uint8_t *key)
function AES_init_ctx_iv (line 93) | void AES_init_ctx_iv(struct AES_ctx *ctx, const uint8_t *key, const uint...
function AES_ctx_set_iv (line 98) | void AES_ctx_set_iv(struct AES_ctx *ctx, const uint8_t *iv)
function AddRoundKey (line 103) | static void AddRoundKey(uint8_t round, state_t *state, const uint8_t *Ro...
function SubBytes (line 112) | static void SubBytes(state_t *state)
function ShiftRows (line 121) | static void ShiftRows(state_t *state)
function xtime (line 144) | static uint8_t xtime(uint8_t x)
function MixColumns (line 149) | static void MixColumns(state_t *state)
function Cipher (line 173) | static void Cipher(state_t *state, const uint8_t *RoundKey)
function AES_CTR_xcrypt_buffer (line 191) | void AES_CTR_xcrypt_buffer(struct AES_ctx *ctx, uint8_t *buf, size_t len...
FILE: src/platform/nrf52/aes-256/tiny-aes.h
type AES_ctx (line 11) | struct AES_ctx {
type AES_ctx (line 16) | struct AES_ctx
type AES_ctx (line 17) | struct AES_ctx
type AES_ctx (line 18) | struct AES_ctx
type AES_ctx (line 20) | struct AES_ctx
FILE: src/platform/nrf52/hardfault.cpp
function printUsageErrorMsg (line 13) | static void printUsageErrorMsg(uint32_t cfsr)
function printBusErrorMsg (line 29) | static void printBusErrorMsg(uint32_t cfsr)
function printMemErrorMsg (line 41) | static void printMemErrorMsg(uint32_t cfsr)
function HardFault_Impl (line 51) | void HardFault_Impl(uint32_t stack[])
function HardFault_Handler (line 88) | void HardFault_Handler(void)
function HardFault_Handler (line 101) | void HardFault_Handler(void)
FILE: src/platform/nrf52/main-nrf52.cpp
function variant_shutdown (line 52) | void variant_shutdown() {}
function debugger_break (line 63) | static inline void debugger_break(void)
function powerHAL_isVBUSConnected (line 70) | bool powerHAL_isVBUSConnected()
function powerHAL_isPowerLevelSafe (line 75) | bool powerHAL_isPowerLevelSafe()
function powerHAL_platformInit (line 97) | void powerHAL_platformInit()
function getVDDVoltage (line 126) | uint16_t getVDDVoltage()
function loopCanSleep (line 146) | bool loopCanSleep()
function __assert_func (line 155) | void __attribute__((noreturn)) __assert_func(const char *file, int line,...
function getMacAddr (line 163) | void getMacAddr(uint8_t *dmac)
function setBluetoothEnable (line 175) | void setBluetoothEnable(bool enable)
function setBluetoothEnable (line 218) | void setBluetoothEnable(bool enable) {}
function printf (line 223) | int printf(const char *fmt, ...)
function reportLittleFSCorruptionOnce (line 239) | inline void reportLittleFSCorruptionOnce()
function preFSBegin (line 249) | void preFSBegin()
function lfs_assert (line 261) | void lfs_assert(const char *reason)
function checkSDEvents (line 295) | void checkSDEvents()
function nrf52Loop (line 316) | void nrf52Loop()
function nrf52InitSemiHosting (line 344) | void nrf52InitSemiHosting()
function nrf52Setup (line 358) | void nrf52Setup()
function cpuDeepSleep (line 412) | void cpuDeepSleep(uint32_t msecToWake)
function clearBonds (line 498) | void clearBonds()
function enterDfuMode (line 507) | void enterDfuMode()
FILE: src/platform/nrf52/softdevice/ble.h
type BLE_COMMON_SVCS (line 72) | enum BLE_COMMON_SVCS {
type BLE_COMMON_EVTS (line 89) | enum BLE_COMMON_EVTS {
type BLE_CONN_CFGS (line 99) | enum BLE_CONN_CFGS {
type BLE_COMMON_CFGS (line 111) | enum BLE_COMMON_CFGS {
type BLE_COMMON_OPTS (line 118) | enum BLE_COMMON_OPTS {
type ble_user_mem_block_t (line 170) | typedef struct {
type ble_evt_user_mem_request_t (line 176) | typedef struct {
type ble_evt_user_mem_release_t (line 181) | typedef struct {
type ble_common_evt_t (line 187) | typedef struct {
type ble_evt_hdr_t (line 196) | typedef struct {
type ble_evt_t (line 202) | typedef struct {
type ble_version_t (line 216) | typedef struct {
type ble_pa_lna_cfg_t (line 228) | typedef struct {
type ble_common_opt_pa_lna_t (line 247) | typedef struct {
type ble_common_opt_conn_evt_ext_t (line 267) | typedef struct {
type ble_common_opt_extended_rc_cal_t (line 286) | typedef struct {
type ble_common_opt_t (line 291) | typedef union {
type ble_opt_t (line 298) | typedef union {
type ble_conn_cfg_t (line 321) | typedef struct {
type ble_common_cfg_vs_uuid_t (line 340) | typedef struct {
type ble_common_cfg_t (line 347) | typedef union {
type ble_cfg_t (line 352) | typedef union {
FILE: src/platform/nrf52/softdevice/ble_gap.h
type BLE_GAP_SVCS (line 65) | enum BLE_GAP_SVCS {
type BLE_GAP_EVTS (line 115) | enum BLE_GAP_EVTS {
type BLE_GAP_OPTS (line 180) | enum BLE_GAP_OPTS {
type BLE_GAP_CFGS (line 195) | enum BLE_GAP_CFGS {
type BLE_GAP_TX_POWER_ROLES (line 206) | enum BLE_GAP_TX_POWER_ROLES {
type ble_gap_adv_properties_t (line 784) | typedef struct {
type ble_gap_adv_report_type_t (line 794) | typedef struct {
type ble_gap_aux_pointer_t (line 805) | typedef struct {
type ble_gap_addr_t (line 811) | typedef struct {
type ble_gap_conn_params_t (line 836) | typedef struct {
type ble_gap_conn_sec_mode_t (line 853) | typedef struct {
type ble_gap_conn_sec_t (line 860) | typedef struct {
type ble_gap_irk_t (line 867) | typedef struct {
type ble_gap_adv_params_t (line 879) | typedef struct {
type ble_gap_adv_data_t (line 954) | typedef struct {
type ble_gap_scan_params_t (line 966) | typedef struct {
type ble_gap_privacy_params_t (line 1033) | typedef struct {
type ble_gap_phys_t (line 1055) | typedef struct {
type ble_gap_sec_kdist_t (line 1061) | typedef struct {
type ble_gap_sec_params_t (line 1069) | typedef struct {
type ble_gap_enc_info_t (line 1089) | typedef struct {
type ble_gap_master_id_t (line 1097) | typedef struct {
type ble_gap_sign_info_t (line 1103) | typedef struct {
type ble_gap_lesc_p256_pk_t (line 1108) | typedef struct {
type ble_gap_lesc_dhkey_t (line 1114) | typedef struct {
type ble_gap_lesc_oob_data_t (line 1119) | typedef struct {
type ble_gap_evt_connected_t (line 1126) | typedef struct {
type ble_gap_evt_disconnected_t (line 1141) | typedef struct {
type ble_gap_evt_conn_param_update_t (line 1146) | typedef struct {
type ble_gap_evt_phy_update_request_t (line 1151) | typedef struct {
type ble_gap_evt_phy_update_t (line 1156) | typedef struct {
type ble_gap_evt_sec_params_request_t (line 1163) | typedef struct {
type ble_gap_evt_sec_info_request_t (line 1168) | typedef struct {
type ble_gap_evt_passkey_display_t (line 1177) | typedef struct {
type ble_gap_evt_key_pressed_t (line 1185) | typedef struct {
type ble_gap_evt_auth_key_request_t (line 1190) | typedef struct {
type ble_gap_evt_lesc_dhkey_request_t (line 1195) | typedef struct {
type ble_gap_sec_levels_t (line 1206) | typedef struct {
type ble_gap_enc_key_t (line 1214) | typedef struct {
type ble_gap_id_key_t (line 1220) | typedef struct {
type ble_gap_sec_keys_t (line 1226) | typedef struct {
type ble_gap_sec_keyset_t (line 1235) | typedef struct {
type ble_gap_data_length_params_t (line 1243) | typedef struct {
type ble_gap_data_length_limitation_t (line 1255) | typedef struct {
type ble_gap_evt_auth_status_t (line 1263) | typedef struct {
type ble_gap_evt_conn_sec_update_t (line 1277) | typedef struct {
type ble_gap_evt_timeout_t (line 1282) | typedef struct {
type ble_gap_evt_rssi_changed_t (line 1291) | typedef struct {
type ble_gap_evt_adv_set_terminated_t (line 1299) | typedef struct {
type ble_gap_evt_adv_report_t (line 1318) | typedef struct {
type ble_gap_evt_sec_request_t (line 1360) | typedef struct {
type ble_gap_evt_conn_param_update_request_t (line 1368) | typedef struct {
type ble_gap_evt_scan_req_report_t (line 1373) | typedef struct {
type ble_gap_evt_data_length_update_request_t (line 1383) | typedef struct {
type ble_gap_evt_data_length_update_t (line 1391) | typedef struct {
type ble_gap_evt_qos_channel_survey_report_t (line 1396) | typedef struct {
type ble_gap_evt_t (line 1405) | typedef struct {
type ble_gap_conn_cfg_t (line 1444) | typedef struct {
type ble_gap_cfg_role_count_t (line 1466) | typedef struct {
type ble_gap_cfg_device_name_t (line 1506) | typedef struct {
type ble_gap_cfg_ppcp_incl_cfg_t (line 1515) | typedef struct {
type ble_gap_cfg_car_incl_cfg_t (line 1521) | typedef struct {
type ble_gap_cfg_t (line 1527) | typedef union {
type ble_gap_opt_ch_map_t (line 1559) | typedef struct {
type ble_gap_opt_local_conn_latency_t (line 1586) | typedef struct {
type ble_gap_opt_slave_latency_disable_t (line 1605) | typedef struct {
type ble_gap_opt_passkey_t (line 1625) | typedef struct {
type ble_gap_opt_compat_mode_1_t (line 1645) | typedef struct {
type ble_gap_opt_auth_payload_timeout_t (line 1668) | typedef struct {
type ble_gap_opt_t (line 1674) | typedef union {
type ble_gap_conn_event_trigger_t (line 1684) | typedef struct {
FILE: src/platform/nrf52/softdevice/ble_gatt.h
type ble_gatt_conn_cfg_t (line 196) | typedef struct {
type ble_gatt_char_props_t (line 207) | typedef struct {
type ble_gatt_char_ext_props_t (line 219) | typedef struct {
FILE: src/platform/nrf52/softdevice/ble_gattc.h
type BLE_GATTC_SVCS (line 65) | enum BLE_GATTC_SVCS {
type BLE_GATTC_EVTS (line 82) | enum BLE_GATTC_EVTS {
type BLE_GATTC_OPTS (line 111) | enum BLE_GATTC_OPTS {
type ble_gattc_conn_cfg_t (line 145) | typedef struct {
type ble_gattc_handle_range_t (line 151) | typedef struct {
type ble_gattc_service_t (line 157) | typedef struct {
type ble_gattc_include_t (line 163) | typedef struct {
type ble_gattc_char_t (line 169) | typedef struct {
type ble_gattc_desc_t (line 178) | typedef struct {
type ble_gattc_write_params_t (line 184) | typedef struct {
type ble_gattc_attr_info16_t (line 194) | typedef struct {
type ble_gattc_attr_info128_t (line 200) | typedef struct {
type ble_gattc_evt_prim_srvc_disc_rsp_t (line 206) | typedef struct {
type ble_gattc_evt_rel_disc_rsp_t (line 214) | typedef struct {
type ble_gattc_evt_char_disc_rsp_t (line 222) | typedef struct {
type ble_gattc_evt_desc_disc_rsp_t (line 230) | typedef struct {
type ble_gattc_evt_attr_info_disc_rsp_t (line 238) | typedef struct {
type ble_gattc_handle_value_t (line 254) | typedef struct {
type ble_gattc_evt_char_val_by_uuid_read_rsp_t (line 261) | typedef struct {
type ble_gattc_evt_read_rsp_t (line 272) | typedef struct {
type ble_gattc_evt_char_vals_read_rsp_t (line 282) | typedef struct {
type ble_gattc_evt_write_rsp_t (line 290) | typedef struct {
type ble_gattc_evt_hvx_t (line 301) | typedef struct {
type ble_gattc_evt_exchange_mtu_rsp_t (line 311) | typedef struct {
type ble_gattc_evt_timeout_t (line 316) | typedef struct {
type ble_gattc_evt_write_cmd_tx_complete_t (line 321) | typedef struct {
type ble_gattc_evt_t (line 326) | typedef struct {
type ble_gattc_opt_uuid_disc_t (line 372) | typedef struct {
type ble_gattc_opt_t (line 377) | typedef union {
function __STATIC_INLINE (line 739) | __STATIC_INLINE uint32_t sd_ble_gattc_evt_char_val_by_uuid_read_rsp_iter...
FILE: src/platform/nrf52/softdevice/ble_gatts.h
type BLE_GATTS_SVCS (line 68) | enum BLE_GATTS_SVCS {
type BLE_GATTS_EVTS (line 89) | enum BLE_GATTS_EVTS {
type BLE_GATTS_CFGS (line 114) | enum BLE_GATTS_CFGS {
type ble_gatts_conn_cfg_t (line 219) | typedef struct {
type ble_gatts_attr_md_t (line 225) | typedef struct {
type ble_gatts_attr_t (line 236) | typedef struct {
type ble_gatts_value_t (line 251) | typedef struct {
type ble_gatts_char_pf_t (line 260) | typedef struct {
type ble_gatts_char_md_t (line 269) | typedef struct {
type ble_gatts_char_handles_t (line 287) | typedef struct {
type ble_gatts_hvx_params_t (line 297) | typedef struct {
type ble_gatts_authorize_params_t (line 306) | typedef struct {
type ble_gatts_rw_authorize_reply_params_t (line 317) | typedef struct {
type ble_gatts_cfg_service_changed_t (line 326) | typedef struct {
type ble_gatts_cfg_service_changed_cccd_perm_t (line 344) | typedef struct {
type ble_gatts_cfg_attr_tab_size_t (line 356) | typedef struct {
type ble_gatts_cfg_t (line 362) | typedef union {
type ble_gatts_evt_write_t (line 371) | typedef struct {
type ble_gatts_evt_read_t (line 385) | typedef struct {
type ble_gatts_evt_rw_authorize_request_t (line 392) | typedef struct {
type ble_gatts_evt_sys_attr_missing_t (line 401) | typedef struct {
type ble_gatts_evt_hvc_t (line 406) | typedef struct {
type ble_gatts_evt_exchange_mtu_request_t (line 411) | typedef struct {
type ble_gatts_evt_timeout_t (line 416) | typedef struct {
type ble_gatts_evt_hvn_tx_complete_t (line 421) | typedef struct {
type ble_gatts_evt_t (line 426) | typedef struct {
FILE: src/platform/nrf52/softdevice/ble_l2cap.h
type BLE_L2CAP_SVCS (line 85) | enum BLE_L2CAP_SVCS {
type BLE_L2CAP_EVTS (line 94) | enum BLE_L2CAP_EVTS {
type ble_l2cap_conn_cfg_t (line 174) | typedef struct {
type ble_l2cap_ch_rx_params_t (line 193) | typedef struct {
type ble_l2cap_ch_setup_params_t (line 209) | typedef struct {
type ble_l2cap_ch_tx_params_t (line 219) | typedef struct {
type ble_l2cap_evt_ch_setup_request_t (line 232) | typedef struct {
type ble_l2cap_evt_ch_setup_refused_t (line 238) | typedef struct {
type ble_l2cap_evt_ch_setup_t (line 244) | typedef struct {
type ble_l2cap_evt_ch_sdu_buf_released_t (line 249) | typedef struct {
type ble_l2cap_evt_ch_credit_t (line 257) | typedef struct {
type ble_l2cap_evt_ch_rx_t (line 262) | typedef struct {
type ble_l2cap_evt_ch_tx_t (line 271) | typedef struct {
type ble_l2cap_evt_t (line 276) | typedef struct {
FILE: src/platform/nrf52/softdevice/ble_types.h
type ble_uuid128_t (line 190) | typedef struct {
type ble_uuid_t (line 195) | typedef struct {
type ble_data_t (line 202) | typedef struct {
FILE: src/platform/nrf52/softdevice/nrf52/nrf_mbr.h
type NRF_MBR_SVCS (line 88) | enum NRF_MBR_SVCS {
type NRF_MBR_COMMANDS (line 93) | enum NRF_MBR_COMMANDS {
type sd_mbr_command_copy_sd_t (line 122) | typedef struct {
type sd_mbr_command_compare_t (line 133) | typedef struct {
type sd_mbr_command_copy_bl_t (line 161) | typedef struct {
type sd_mbr_command_vector_table_base_set_t (line 188) | typedef struct {
type sd_mbr_command_irq_forward_address_set_t (line 199) | typedef struct {
type sd_mbr_command_t (line 209) | typedef struct {
FILE: src/platform/nrf52/softdevice/nrf_nvic.h
type nrf_nvic_state_t (line 113) | typedef struct {
function __STATIC_INLINE (line 283) | __STATIC_INLINE int __sd_nvic_irq_disable(void)
function __STATIC_INLINE (line 290) | __STATIC_INLINE void __sd_nvic_irq_enable(void)
function __STATIC_INLINE (line 295) | __STATIC_INLINE uint32_t __sd_nvic_app_accessible_irq(IRQn_Type IRQn)
function __STATIC_INLINE (line 306) | __STATIC_INLINE uint32_t __sd_nvic_is_app_accessible_priority(uint32_t p...
function __STATIC_INLINE (line 314) | __STATIC_INLINE uint32_t sd_nvic_EnableIRQ(IRQn_Type IRQn)
function __STATIC_INLINE (line 332) | __STATIC_INLINE uint32_t sd_nvic_DisableIRQ(IRQn_Type IRQn)
function __STATIC_INLINE (line 347) | __STATIC_INLINE uint32_t sd_nvic_GetPendingIRQ(IRQn_Type IRQn, uint32_t ...
function __STATIC_INLINE (line 357) | __STATIC_INLINE uint32_t sd_nvic_SetPendingIRQ(IRQn_Type IRQn)
function __STATIC_INLINE (line 367) | __STATIC_INLINE uint32_t sd_nvic_ClearPendingIRQ(IRQn_Type IRQn)
function __STATIC_INLINE (line 377) | __STATIC_INLINE uint32_t sd_nvic_SetPriority(IRQn_Type IRQn, uint32_t pr...
function __STATIC_INLINE (line 391) | __STATIC_INLINE uint32_t sd_nvic_GetPriority(IRQn_Type IRQn, uint32_t *p...
function __STATIC_INLINE (line 401) | __STATIC_INLINE uint32_t sd_nvic_SystemReset(void)
function __STATIC_INLINE (line 407) | __STATIC_INLINE uint32_t sd_nvic_critical_region_enter(uint8_t *p_is_nes...
function __STATIC_INLINE (line 426) | __STATIC_INLINE uint32_t sd_nvic_critical_region_exit(uint8_t is_nested_...
FILE: src/platform/nrf52/softdevice/nrf_sdm.h
type NRF_SD_SVCS (line 199) | enum NRF_SD_SVCS {
type nrf_clock_lf_cfg_t (line 245) | typedef struct {
FILE: src/platform/nrf52/softdevice/nrf_soc.h
type NRF_SOC_SVCS (line 124) | enum NRF_SOC_SVCS {
type NRF_MUTEX_VALUES (line 177) | enum NRF_MUTEX_VALUES { NRF_MUTEX_FREE, NRF_MUTEX_TAKEN }
type NRF_POWER_MODES (line 180) | enum NRF_POWER_MODES {
type NRF_POWER_THRESHOLDS (line 186) | enum NRF_POWER_THRESHOLDS {
type NRF_POWER_THRESHOLDVDDHS (line 202) | enum NRF_POWER_THRESHOLDVDDHS {
type NRF_POWER_DCDC_MODES (line 222) | enum NRF_POWER_DCDC_MODES {
type NRF_RADIO_NOTIFICATION_DISTANCES (line 228) | enum NRF_RADIO_NOTIFICATION_DISTANCES {
type NRF_RADIO_NOTIFICATION_TYPES (line 239) | enum NRF_RADIO_NOTIFICATION_TYPES {
type NRF_RADIO_CALLBACK_SIGNAL_TYPE (line 248) | enum NRF_RADIO_CALLBACK_SIGNAL_TYPE {
type NRF_RADIO_SIGNAL_CALLBACK_ACTION (line 261) | enum NRF_RADIO_SIGNAL_CALLBACK_ACTION {
type NRF_RADIO_HFCLK_CFG (line 274) | enum NRF_RADIO_HFCLK_CFG {
type NRF_RADIO_PRIORITY (line 291) | enum NRF_RADIO_PRIORITY {
type NRF_RADIO_REQUEST_TYPE (line 297) | enum NRF_RADIO_REQUEST_TYPE {
type NRF_SOC_EVTS (line 304) | enum NRF_SOC_EVTS {
type nrf_mutex_t (line 329) | typedef volatile uint8_t nrf_mutex_t;
type nrf_radio_request_earliest_t (line 332) | typedef struct {
type nrf_radio_request_normal_t (line 341) | typedef struct {
type nrf_radio_request_t (line 350) | typedef struct {
type nrf_radio_signal_callback_return_param_t (line 359) | typedef struct {
type nrf_radio_signal_callback_return_param_t (line 385) | typedef nrf_radio_signal_callback_return_param_t *(*nrf_radio_signal_cal...
type nrf_ecb_hal_data_t (line 393) | typedef struct {
type nrf_ecb_hal_data_block_t (line 401) | typedef struct {
FILE: src/platform/portduino/PortduinoGlue.cpp
function setBluetoothEnable (line 48) | void setBluetoothEnable(bool enable)
function cpuDeepSleep (line 53) | void cpuDeepSleep(uint32_t msecs)
function error_t (line 63) | static error_t parse_opt(int key, char *arg, struct argp_state *state)
function portduinoCustomInit (line 97) | void portduinoCustomInit()
function getMacAddr (line 114) | void getMacAddr(uint8_t *dmac)
function cleanupNameForAutoconf (line 157) | std::string cleanupNameForAutoconf(std::string name)
function portduinoSetup (line 175) | void portduinoSetup()
function initGPIOPin (line 652) | int initGPIOPin(int pinNum, const std::string &gpioChipName, int line)
function loadConfig (line 673) | bool loadConfig(const char *configPath)
function ends_with (line 1025) | static bool ends_with(std::string_view str, std::string_view suffix)
function MAC_from_string (line 1030) | bool MAC_from_string(std::string mac_str, uint8_t *dmac)
function exec (line 1046) | std::string exec(const char *cmd)
function readGPIOFromYaml (line 1060) | void readGPIOFromYaml(YAML::Node sourceNode, pinMapping &destPin, int pi...
FILE: src/platform/portduino/PortduinoGlue.h
type portduino_status_struct (line 13) | struct portduino_status_struct {
type screen_modules (line 32) | enum screen_modules { no_screen, x11, fb, st7789, st7735, st7735s, st779...
type touchscreen_modules (line 33) | enum touchscreen_modules { no_touchscreen, xpt2046, stmpe610, gt911, ft5...
type portduino_log_level (line 34) | enum portduino_log_level { level_error, level_warn, level_info, level_de...
type lora_module_enum (line 35) | enum lora_module_enum {
type pinMapping (line 48) | struct pinMapping {
FILE: src/platform/portduino/SimRadio.cpp
function ErrorCode (line 12) | ErrorCode SimRadio::send(meshtastic_MeshPacket *p)
function meshtastic_QueueStatus (line 288) | meshtastic_QueueStatus SimRadio::getQueueStatus()
FILE: src/platform/portduino/USBHal.h
function class (line 28) | class Ch341Hal : public RadioLibHal
function getSerialString (line 60) | void getSerialString(char *_serial, size_t len)
function getProductString (line 66) | void getProductString(char *_product_string, size_t len)
function init (line 72) | void init() override {}
function term (line 73) | void term() override {}
function pinMode (line 77) | void pinMode(uint32_t pin, uint32_t mode) override
function digitalWrite (line 91) | void digitalWrite(uint32_t pin, uint32_t value) override
function digitalRead (line 106) | uint32_t digitalRead(uint32_t pin) override
function attachInterrupt (line 123) | void attachInterrupt(uint32_t interruptNum, void (*interruptCb)(void), u...
function detachInterrupt (line 135) | void detachInterrupt(uint32_t interruptNum) override
function delay (line 147) | void delay(unsigned long ms) override { delayMicroseconds(ms * 1000); }
function delayMicroseconds (line 149) | void delayMicroseconds(unsigned long us) override
function yield (line 158) | void yield() override { sched_yield(); }
function millis (line 160) | unsigned long millis() override
function micros (line 167) | unsigned long micros() override
function pulseIn (line 174) | long pulseIn(uint32_t pin, uint32_t state, unsigned long timeout) override
function spiBegin (line 180) | void spiBegin() {}
function spiBeginTransaction (line 181) | void spiBeginTransaction() {}
function spiTransfer (line 183) | void spiTransfer(uint8_t *out, size_t len, uint8_t *in)
function spiEndTransaction (line 194) | void spiEndTransaction() {}
function spiEnd (line 195) | void spiEnd() {}
function checkError (line 196) | bool checkError()
FILE: src/platform/rp2xx0/hardware_rosc/include/hardware/rosc.h
function rosc_clear_bad_write (line 71) | inline static void rosc_clear_bad_write(void)
function rosc_write_okay (line 76) | inline static bool rosc_write_okay(void)
function rosc_write (line 81) | inline static void rosc_write(io_rw_32 *addr, uint32_t value)
FILE: src/platform/rp2xx0/hardware_rosc/rosc.c
function next_rosc_code (line 15) | uint32_t next_rosc_code(uint32_t code)
function uint (line 20) | uint rosc_find_freq(uint32_t low_mhz, uint32_t high_mhz)
function rosc_set_div (line 34) | void rosc_set_div(uint32_t div)
function rosc_set_freq (line 40) | void rosc_set_freq(uint32_t code)
function rosc_set_range (line 46) | void rosc_set_range(uint range)
function rosc_disable (line 52) | void rosc_disable(void)
function rosc_set_dormant (line 63) | void rosc_set_dormant(void)
FILE: src/platform/rp2xx0/main-rp2xx0.cpp
function sleep_callback (line 13) | static void sleep_callback(void)
function epoch_to_datetime (line 18) | void epoch_to_datetime(time_t epoch, datetime_t *dt)
function debug_date (line 32) | void debug_date(datetime_t t)
function cpuDeepSleep (line 38) | void cpuDeepSleep(uint32_t msecs)
function cpuDeepSleep (line 70) | void cpuDeepSleep(uint32_t msecs)
function setBluetoothEnable (line 77) | void setBluetoothEnable(bool enable)
function updateBatteryLevel (line 82) | void updateBatteryLevel(uint8_t level)
function getMacAddr (line 87) | void getMacAddr(uint8_t *dmac)
function rp2040Setup (line 99) | void rp2040Setup()
function enterDfuMode (line 128) | void enterDfuMode()
function initVariant (line 135) | void initVariant()
FILE: src/platform/rp2xx0/pico_sleep/include/pico/sleep.h
type dormant_source_t (line 33) | typedef enum { DORMANT_SOURCE_NONE, DORMANT_SOURCE_XOSC, DORMANT_SOURCE_...
function sleep_run_from_xosc (line 45) | static inline void sleep_run_from_xosc(void)
function sleep_run_from_rosc (line 53) | static inline void sleep_run_from_rosc(void)
function sleep_goto_dormant_until_edge_high (line 86) | static inline void sleep_goto_dormant_until_edge_high(uint gpio_pin)
function sleep_goto_dormant_until_level_high (line 98) | static inline void sleep_goto_dormant_until_level_high(uint gpio_pin)
FILE: src/platform/rp2xx0/pico_sleep/sleep.c
function dormant_source_valid (line 36) | bool dormant_source_valid(dormant_source_t dormant_source)
function sleep_run_from_dormant_source (line 44) | void sleep_run_from_dormant_source(dormant_source_t dormant_source)
function sleep_goto_sleep_until (line 99) | void sleep_goto_sleep_until(datetime_t *t, rtc_callback_t callback)
function _go_dormant (line 118) | static void _go_dormant(void)
function sleep_goto_dormant_until_pin (line 129) | void sleep_goto_dormant_until_pin(uint gpio_pin, bool edge, bool high)
FILE: src/platform/stm32wl/LittleFS.cpp
function _internal_flash_read (line 58) | static int _internal_flash_read(const struct lfs_config *c, lfs_block_t ...
function _internal_flash_prog (line 77) | static int _internal_flash_prog(const struct lfs_config *c, lfs_block_t ...
function _internal_flash_erase (line 117) | static int _internal_flash_erase(const struct lfs_config *c, lfs_block_t...
function _internal_flash_sync (line 142) | static int _internal_flash_sync(const struct lfs_config *c)
type lfs_config (line 150) | struct lfs_config
FILE: src/platform/stm32wl/LittleFS.h
function class (line 30) | class LittleFS : public STM32_LittleFS
FILE: src/platform/stm32wl/STM32_LittleFS.cpp
type lfs_config (line 40) | struct lfs_config
type lfs_config (line 52) | struct lfs_config
type lfs_info (line 144) | struct lfs_info
FILE: src/platform/stm32wl/STM32_LittleFS.h
function class (line 36) | class STM32_LittleFS
FILE: src/platform/stm32wl/STM32_LittleFS_File.cpp
type lfs_info (line 129) | struct lfs_info
function File (line 354) | File File::openNextFile(uint8_t mode)
FILE: src/platform/stm32wl/STM32_LittleFS_File.h
function namespace (line 33) | namespace STM32_LittleFS_Namespace
FILE: src/platform/stm32wl/littlefs/lfs.c
function lfs_cache_read (line 13) | static int lfs_cache_read(lfs_t *lfs, lfs_cache_t *rcache, const lfs_cac...
function lfs_cache_cmp (line 68) | static int lfs_cache_cmp(lfs_t *lfs, lfs_cache_t *rcache, const lfs_cach...
function lfs_cache_crc (line 88) | static int lfs_cache_crc(lfs_t *lfs, lfs_cache_t *rcache, const lfs_cach...
function lfs_cache_drop (line 104) | static inline void lfs_cache_drop(lfs_t *lfs, lfs_cache_t *rcache)
function lfs_cache_zero (line 112) | static inline void lfs_cache_zero(lfs_t *lfs, lfs_cache_t *pcache)
function lfs_cache_flush (line 119) | static int lfs_cache_flush(lfs_t *lfs, lfs_cache_t *pcache, lfs_cache_t ...
function lfs_cache_prog (line 144) | static int lfs_cache_prog(lfs_t *lfs, lfs_cache_t *pcache, lfs_cache_t *...
function lfs_bd_read (line 209) | static int lfs_bd_read(lfs_t *lfs, lfs_block_t block, lfs_off_t off, voi...
function lfs_bd_prog (line 216) | static int lfs_bd_prog(lfs_t *lfs, lfs_block_t block, lfs_off_t off, con...
function lfs_bd_cmp (line 221) | static int lfs_bd_cmp(lfs_t *lfs, lfs_block_t block, lfs_off_t off, cons...
function lfs_bd_crc (line 226) | static int lfs_bd_crc(lfs_t *lfs, lfs_block_t block, lfs_off_t off, lfs_...
function lfs_bd_erase (line 231) | static int lfs_bd_erase(lfs_t *lfs, lfs_block_t block)
function lfs_bd_sync (line 236) | static int lfs_bd_sync(lfs_t *lfs)
function lfs_alloc_lookahead (line 257) | static int lfs_alloc_lookahead(void *p, lfs_block_t block)
function lfs_alloc (line 270) | static int lfs_alloc(lfs_t *lfs, lfs_block_t *block)
function lfs_alloc_ack (line 312) | static void lfs_alloc_ack(lfs_t *lfs)
function lfs_dir_fromle32 (line 318) | static void lfs_dir_fromle32(struct lfs_disk_dir *d)
function lfs_dir_tole32 (line 326) | static void lfs_dir_tole32(struct lfs_disk_dir *d)
function lfs_entry_fromle32 (line 334) | static void lfs_entry_fromle32(struct lfs_disk_entry *d)
function lfs_entry_tole32 (line 340) | static void lfs_entry_tole32(struct lfs_disk_entry *d)
function lfs_superblock_fromle32 (line 346) | static void lfs_superblock_fromle32(struct lfs_disk_superblock *d)
function lfs_superblock_tole32 (line 355) | static void lfs_superblock_tole32(struct lfs_disk_superblock *d)
function lfs_pairswap (line 365) | static inline void lfs_pairswap(lfs_block_t pair[2])
function lfs_pairisnull (line 372) | static inline bool lfs_pairisnull(const lfs_block_t pair[2])
function lfs_paircmp (line 377) | static inline int lfs_paircmp(const lfs_block_t paira[2], const lfs_bloc...
function lfs_pairsync (line 382) | static inline bool lfs_pairsync(const lfs_block_t paira[2], const lfs_bl...
function lfs_size_t (line 387) | static inline lfs_size_t lfs_entry_size(const lfs_entry_t *entry)
function lfs_dir_alloc (line 392) | static int lfs_dir_alloc(lfs_t *lfs, lfs_dir_t *dir)
function lfs_dir_fetch (line 424) | static int lfs_dir_fetch(lfs_t *lfs, lfs_dir_t *dir, const lfs_block_t p...
type lfs_region (line 483) | struct lfs_region {
function lfs_dir_commit (line 490) | static int lfs_dir_commit(lfs_t *lfs, lfs_dir_t *dir, const struct lfs_r...
function lfs_dir_update (line 636) | static int lfs_dir_update(lfs_t *lfs, lfs_dir_t *dir, lfs_entry_t *entry...
function lfs_dir_append (line 647) | static int lfs_dir_append(lfs_t *lfs, lfs_dir_t *dir, lfs_entry_t *entry...
function lfs_dir_remove (line 695) | static int lfs_dir_remove(lfs_t *lfs, lfs_dir_t *dir, lfs_entry_t *entry)
function lfs_dir_next (line 747) | static int lfs_dir_next(lfs_t *lfs, lfs_dir_t *dir, lfs_entry_t *entry)
function lfs_dir_find (line 776) | static int lfs_dir_find(lfs_t *lfs, lfs_dir_t *dir, lfs_entry_t *entry, ...
function lfs_mkdir (line 879) | int lfs_mkdir(lfs_t *lfs, const char *path)
function lfs_dir_open (line 932) | int lfs_dir_open(lfs_t *lfs, lfs_dir_t *dir, const char *path)
function lfs_dir_close (line 964) | int lfs_dir_close(lfs_t *lfs, lfs_dir_t *dir)
function lfs_dir_read (line 977) | int lfs_dir_read(lfs_t *lfs, lfs_dir_t *dir, struct lfs_info *info)
function lfs_dir_seek (line 1035) | int lfs_dir_seek(lfs_t *lfs, lfs_dir_t *dir, lfs_off_t off)
function lfs_dir_rewind (line 1060) | int lfs_dir_rewind(lfs_t *lfs, lfs_dir_t *dir)
function lfs_ctz_index (line 1076) | static int lfs_ctz_index(lfs_t *lfs, lfs_off_t *off)
function lfs_ctz_find (line 1090) | static int lfs_ctz_find(lfs_t *lfs, lfs_cache_t *rcache, const lfs_cache...
function lfs_ctz_extend (line 1120) | static int lfs_ctz_extend(lfs_t *lfs, lfs_cache_t *rcache, lfs_cache_t *...
function lfs_ctz_traverse (line 1213) | static int lfs_ctz_traverse(lfs_t *lfs, lfs_cache_t *rcache, const lfs_c...
function lfs_file_opencfg (line 1254) | int lfs_file_opencfg(lfs_t *lfs, lfs_file_t *file, const char *path, int...
function lfs_file_open (line 1347) | int lfs_file_open(lfs_t *lfs, lfs_file_t *file, const char *path, int fl...
function lfs_file_close (line 1352) | int lfs_file_close(lfs_t *lfs, lfs_file_t *file)
function lfs_file_relocate (line 1372) | static int lfs_file_relocate(lfs_t *lfs, lfs_file_t *file)
function lfs_file_flush (line 1419) | static int lfs_file_flush(lfs_t *lfs, lfs_file_t *file)
function lfs_file_sync (line 1491) | int lfs_file_sync(lfs_t *lfs, lfs_file_t *file)
function lfs_ssize_t (line 1528) | lfs_ssize_t lfs_file_read(lfs_t *lfs, lfs_file_t *file, void *buffer, lf...
function lfs_ssize_t (line 1580) | lfs_ssize_t lfs_file_write(lfs_t *lfs, lfs_file_t *file, const void *buf...
function lfs_soff_t (line 1673) | lfs_soff_t lfs_file_seek(lfs_t *lfs, lfs_file_t *file, lfs_soff_t off, i...
function lfs_file_truncate (line 1701) | int lfs_file_truncate(lfs_t *lfs, lfs_file_t *file, lfs_off_t size)
function lfs_soff_t (line 1752) | lfs_soff_t lfs_file_tell(lfs_t *lfs, lfs_file_t const *file)
function lfs_file_rewind (line 1758) | int lfs_file_rewind(lfs_t *lfs, lfs_file_t *file)
function lfs_soff_t (line 1768) | lfs_soff_t lfs_file_size(lfs_t *lfs, lfs_file_t *file)
function lfs_stat (line 1779) | int lfs_stat(lfs_t *lfs, const char *path, struct lfs_info *info)
function lfs_remove (line 1806) | int lfs_remove(lfs_t *lfs, const char *path)
function lfs_rename (line 1864) | int lfs_rename(lfs_t *lfs, const char *oldpath, const char *newpath)
function lfs_deinit (line 1973) | static void lfs_deinit(lfs_t *lfs)
function lfs_init (line 1989) | static int lfs_init(lfs_t *lfs, const struct lfs_config *cfg)
function lfs_format (line 2050) | int lfs_format(lfs_t *lfs, const struct lfs_config *cfg)
function lfs_mount (line 2137) | int lfs_mount(lfs_t *lfs, const struct lfs_config *cfg)
function lfs_unmount (line 2194) | int lfs_unmount(lfs_t *lfs)
function lfs_traverse (line 2201) | int lfs_traverse(lfs_t *lfs, int (*cb)(void *, lfs_block_t), void *data)
function lfs_pred (line 2270) | static int lfs_pred(lfs_t *lfs, const lfs_block_t dir[2], lfs_dir_t *pdir)
function lfs_parent (line 2296) | static int lfs_parent(lfs_t *lfs, const lfs_block_t dir[2], lfs_dir_t *p...
function lfs_moved (line 2331) | static int lfs_moved(lfs_t *lfs, const void *e)
function lfs_relocate (line 2371) | static int lfs_relocate(lfs_t *lfs, const lfs_block_t oldpair[2], const ...
function lfs_deorphan (line 2420) | int lfs_deorphan(lfs_t *lfs)
FILE: src/platform/stm32wl/littlefs/lfs.h
type lfs_size_t (line 36) | typedef uint32_t lfs_size_t;
type lfs_off_t (line 37) | typedef uint32_t lfs_off_t;
type lfs_ssize_t (line 39) | typedef int32_t lfs_ssize_t;
type lfs_soff_t (line 40) | typedef int32_t lfs_soff_t;
type lfs_block_t (line 42) | typedef uint32_t lfs_block_t;
type lfs_error (line 51) | enum lfs_error {
type lfs_type (line 67) | enum lfs_type {
type lfs_open_flags (line 74) | enum lfs_open_flags {
type lfs_whence_flags (line 92) | enum lfs_whence_flags {
type lfs_config (line 99) | struct lfs_config {
type lfs_file_config (line 165) | struct lfs_file_config {
type lfs_info (line 172) | struct lfs_info {
type lfs_entry_t (line 184) | typedef struct lfs_entry {
type lfs_cache_t (line 202) | typedef struct lfs_cache {
type lfs_file_t (line 208) | typedef struct lfs_file {
type lfs_dir_t (line 224) | typedef struct lfs_dir {
type lfs_superblock_t (line 239) | typedef struct lfs_superblock {
type lfs_free_t (line 255) | typedef struct lfs_free {
type lfs_t (line 264) | typedef struct lfs {
type lfs_config (line 287) | struct lfs_config
type lfs_config (line 297) | struct lfs_config
type lfs_info (line 325) | struct lfs_info
type lfs_file_config (line 347) | struct lfs_file_config
type lfs_info (line 429) | struct lfs_info
FILE: src/platform/stm32wl/littlefs/lfs_util.c
function lfs_crc (line 13) | void lfs_crc(uint32_t *restrict crc, const void *buffer, size_t size)
FILE: src/platform/stm32wl/littlefs/lfs_util.h
function lfs_max (line 83) | static inline uint32_t lfs_max(uint32_t a, uint32_t b)
function lfs_min (line 88) | static inline uint32_t lfs_min(uint32_t a, uint32_t b)
function lfs_npw2 (line 94) | static inline uint32_t lfs_npw2(uint32_t a)
function lfs_ctz (line 120) | static inline uint32_t lfs_ctz(uint32_t a)
function lfs_popc (line 130) | static inline uint32_t lfs_popc(uint32_t a)
function lfs_scmp (line 143) | static inline int lfs_scmp(uint32_t a, uint32_t b)
function lfs_fromle32 (line 149) | static inline uint32_t lfs_fromle32(uint32_t a)
function lfs_tole32 (line 165) | static inline uint32_t lfs_tole32(uint32_t a)
function lfs_free (line 185) | static inline void lfs_free(void *p)
FILE: src/platform/stm32wl/main-stm32wl.cpp
function setBluetoothEnable (line 6) | void setBluetoothEnable(bool enable) {}
function playStartMelody (line 8) | void playStartMelody() {}
function updateBatteryLevel (line 10) | void updateBatteryLevel(uint8_t level) {}
function getMacAddr (line 12) | void getMacAddr(uint8_t *dmac)
function cpuDeepSleep (line 28) | void cpuDeepSleep(uint32_t msecToWake) {}
function __wrap___assert_func (line 33) | void __wrap___assert_func(const char *, int, const char *, const char *)
type _reent (line 48) | struct _reent
function __wrap__tzset_unlocked_r (line 52) | void __wrap__tzset_unlocked_r(struct _reent *reent_ptr)
FILE: src/power.h
function virtual (line 95) | virtual int32_t runOnce() override;
FILE: src/power/PowerHAL.cpp
function powerHAL_init (line 4) | void powerHAL_init()
function powerHAL_platformInit (line 9) | __attribute__((weak, noinline)) void powerHAL_platformInit() {}
function powerHAL_isPowerLevelSafe (line 11) | __attribute__((weak, noinline)) bool powerHAL_isPowerLevelSafe()
function powerHAL_isVBUSConnected (line 16) | __attribute__((weak, noinline)) bool powerHAL_isVBUSConnected()
FILE: src/serialization/JSON.cpp
function JSONValue (line 44) | JSONValue *JSON::Parse(const char *data)
FILE: src/serialization/JSON.h
function simplejson_csnlen (line 34) | static inline bool simplejson_csnlen(const char *s, size_t n)
type std (line 50) | typedef std::vector<JSONValue *> JSONArray;
type std (line 51) | typedef std::map<std::string, JSONValue *> JSONObject;
function class (line 55) | class JSON
FILE: src/serialization/JSONValue.cpp
function JSONValue (line 60) | JSONValue *JSONValue::Parse(const char **data)
function JSONArray (line 597) | const JSONArray &JSONValue::AsArray() const
function JSONObject (li
Copy disabled (too large)
Download .json
Condensed preview — 1572 files, each showing path, character count, and a content snippet. Download the .json file for the full structured content (10,129K chars).
[
{
"path": ".clusterfuzzlite/Dockerfile",
"chars": 2678,
"preview": "# This container is used to build Meshtastic with the libraries required by the fuzzer.\n# ClusterFuzzLite starts the con"
},
{
"path": ".clusterfuzzlite/README.md",
"chars": 2517,
"preview": "# ClusterFuzzLite for Meshtastic\n\nThis directory contains the fuzzer implementation for Meshtastic using the ClusterFuzz"
},
{
"path": ".clusterfuzzlite/build.sh",
"chars": 2359,
"preview": "#!/bin/bash -eu\n\n# Build Meshtastic and a few needed dependencies using clang++\n# and the OSS-Fuzz required build flags."
},
{
"path": ".clusterfuzzlite/platformio-clusterfuzzlite-post.py",
"chars": 1164,
"preview": "\"\"\"PlatformIO build script (post: runs after other Meshtastic scripts).\"\"\"\n\nimport os\nimport shlex\n\nfrom SCons.Script im"
},
{
"path": ".clusterfuzzlite/platformio-clusterfuzzlite-pre.py",
"chars": 1758,
"preview": "\"\"\"PlatformIO build script (pre: runs before other Meshtastic scripts).\n\nClusterFuzzLite executes in a different contain"
},
{
"path": ".clusterfuzzlite/project.yaml",
"chars": 14,
"preview": "language: c++\n"
},
{
"path": ".clusterfuzzlite/router_fuzzer.cpp",
"chars": 8224,
"preview": "// Fuzzer implementation that sends MeshPackets to Router::enqueueReceivedMessage.\n#include <condition_variable>\n#includ"
},
{
"path": ".clusterfuzzlite/router_fuzzer.options",
"chars": 24,
"preview": "[libfuzzer]\nmax_len=256\n"
},
{
"path": ".clusterfuzzlite/router_fuzzer_seed_corpus.py",
"chars": 5131,
"preview": "\"\"\"Generate an initial set of MeshPackets.\n\nThe fuzzer uses these MeshPackets as an initial seed of test candidates.\n\nIt"
},
{
"path": ".devcontainer/99-platformio-udev.rules",
"chars": 8888,
"preview": "# Copyright (c) 2014-present PlatformIO <contact@platformio.org>\n#\n# Licensed under the Apache License, Version 2.0 (the"
},
{
"path": ".devcontainer/Dockerfile",
"chars": 1025,
"preview": "# trunk-ignore-all(terrascan/AC_DOCKER_0002): Known terrascan issue\n# trunk-ignore-all(hadolint/DL3008): Do not pin apt "
},
{
"path": ".devcontainer/devcontainer.json",
"chars": 1026,
"preview": "// For format details, see https://aka.ms/devcontainer.json. For config options, see the\n// README at: https://github.co"
},
{
"path": ".devcontainer/setup.sh",
"chars": 107,
"preview": "#!/usr/bin/env sh\n\ngit submodule update --init\n\npip install --no-cache-dir setuptools\npipx install esptool\n"
},
{
"path": ".envrc",
"chars": 7,
"preview": "use nix"
},
{
"path": ".gitattributes",
"chars": 107,
"preview": "* text=auto eol=lf\n*.cmd text eol=crlf\n*.bat text eol=crlf\n*.ps1 text eol=crlf\n*.{sh,[sS][hH]} text eol=lf\n"
},
{
"path": ".github/FUNDING.yml",
"chars": 75,
"preview": "# These are supported funding model platforms\n\nopen_collective: meshtastic\n"
},
{
"path": ".github/ISSUE_TEMPLATE/Bug Report.yml",
"chars": 2598,
"preview": "name: Bug Report\ndescription: File a bug report\ntitle: \"[Bug]: \"\nlabels: [bug, triage]\nbody:\n - type: markdown\n attr"
},
{
"path": ".github/ISSUE_TEMPLATE/New Board.yml",
"chars": 1031,
"preview": "name: New Board\ndescription: Request us to support new hardware\ntitle: \"[Board]: \"\nlabels: [enhancement, triage]\nbody:\n "
},
{
"path": ".github/ISSUE_TEMPLATE/feature.yml",
"chars": 771,
"preview": "name: Feature Request\ndescription: Request a new feature\ntitle: \"[Feature Request]: \"\nlabels: [enhancement]\nbody:\n - ty"
},
{
"path": ".github/actionlint.yaml",
"chars": 165,
"preview": "# Configuration related to self-hosted runner.\nself-hosted-runner:\n # Labels of self-hosted runner in array of strings."
},
{
"path": ".github/actions/build-variant/action.yml",
"chars": 3179,
"preview": "name: Setup Build Variant Composite Action\ndescription: Variant build actions for Meshtastic Platform IO steps\n\ninputs:\n"
},
{
"path": ".github/actions/setup-base/action.yml",
"chars": 1224,
"preview": "name: Setup Build Base Composite Action\ndescription: Base build actions for Meshtastic Platform IO steps\n\nruns:\n using:"
},
{
"path": ".github/actions/setup-native/action.yml",
"chars": 463,
"preview": "name: Setup native build\ndescription: Install libraries needed for building the Native/Portduino build\n\nruns:\n using: c"
},
{
"path": ".github/copilot-instructions.md",
"chars": 10576,
"preview": "# Meshtastic Firmware - Copilot Instructions\n\nThis document provides context and guidelines for AI assistants working wi"
},
{
"path": ".github/pull_request_template.md",
"chars": 1938,
"preview": "## 🙏 Thank you for sending in a pull request, here's some tips to get started!\n\n### ❌ (Please delete all these tips and "
},
{
"path": ".github/workflows/build_debian_src.yml",
"chars": 2237,
"preview": "name: Build Debian Source Package\n\non:\n workflow_call:\n secrets:\n PPA_GPG_PRIVATE_KEY:\n required: false\n"
},
{
"path": ".github/workflows/build_firmware.yml",
"chars": 4997,
"preview": "name: Build\n\non:\n workflow_call:\n inputs:\n version:\n required: true\n type: string\n platform:"
},
{
"path": ".github/workflows/build_one_target.yml",
"chars": 4812,
"preview": "name: Build One Target\n\non:\n workflow_dispatch:\n inputs:\n # trunk-ignore(checkov/CKV_GHA_7)\n arch:\n "
},
{
"path": ".github/workflows/daily_packaging.yml",
"chars": 1403,
"preview": "name: Daily Packaging\non:\n schedule:\n - cron: 0 2 * * *\n workflow_dispatch:\n push:\n branches:\n - master\n "
},
{
"path": ".github/workflows/docker_build.yml",
"chars": 2880,
"preview": "name: Build Docker\n\n# Build Docker image, push untagged (digest-only)\n\non:\n workflow_call:\n secrets:\n DOCKER_FI"
},
{
"path": ".github/workflows/docker_manifest.yml",
"chars": 5404,
"preview": "name: Build Docker Multi-Arch Manifest\n\non:\n workflow_call:\n secrets:\n DOCKER_FIRMWARE_TOKEN:\n required:"
},
{
"path": ".github/workflows/first_time_contributor.yml",
"chars": 1846,
"preview": "name: Welcome First-Time Contributor\n\non:\n issues:\n types: opened\n pull_request_target:\n types: opened\n\npermissi"
},
{
"path": ".github/workflows/hook_copr.yml",
"chars": 928,
"preview": "name: Trigger COPR build\n\non:\n workflow_call:\n secrets:\n COPR_API_CONFIG:\n inputs:\n copr_project:\n "
},
{
"path": ".github/workflows/main_matrix.yml",
"chars": 16474,
"preview": "name: CI\nconcurrency:\n group: ci-${{ github.head_ref || github.run_id }}\n cancel-in-progress: true\non:\n # # Triggers "
},
{
"path": ".github/workflows/merge_queue.yml",
"chars": 11905,
"preview": "name: Merge Queue\n# Not sure how concurrency works in merge_queue, removing for now.\n# concurrency:\n# group: merge-que"
},
{
"path": ".github/workflows/models_issue_triage.yml",
"chars": 10002,
"preview": "name: Issue Triage (Models)\n\non:\n issues:\n types: [opened]\n\npermissions:\n issues: write\n models: read\n\nconcurrency"
},
{
"path": ".github/workflows/models_pr_triage.yml",
"chars": 6638,
"preview": "name: PR Triage (Models)\n\non:\n pull_request_target:\n types: [opened]\n\npermissions:\n pull-requests: write\n issues: "
},
{
"path": ".github/workflows/nightly.yml",
"chars": 944,
"preview": "name: Nightly\non:\n schedule:\n - cron: 0 8 * * 1-5\n workflow_dispatch: {}\n\npermissions: read-all\n\njobs:\n trunk_chec"
},
{
"path": ".github/workflows/package_obs.yml",
"chars": 3606,
"preview": "name: Package for OpenSUSE Build Service\n\non:\n workflow_call:\n secrets:\n OBS_PASSWORD:\n required: true\n "
},
{
"path": ".github/workflows/package_pio_deps.yml",
"chars": 2372,
"preview": "name: Package PlatformIO Library Dependencies\n# trunk-ignore-all(checkov/CKV_GHA_7): Allow workflow_dispatch inputs for "
},
{
"path": ".github/workflows/package_ppa.yml",
"chars": 1999,
"preview": "name: Package for Launchpad PPA\n\non:\n workflow_call:\n secrets:\n PPA_GPG_PRIVATE_KEY:\n required: true\n "
},
{
"path": ".github/workflows/pr_enforce_labels.yml",
"chars": 853,
"preview": "name: Check PR Labels\n\non:\n pull_request:\n types: [opened, edited, labeled, unlabeled, synchronize, reopened]\n\npermi"
},
{
"path": ".github/workflows/pr_tests.yml",
"chars": 9651,
"preview": "name: Tests\n\n# DISABLED: Changed from automatic PR triggers to manual only\non:\n workflow_dispatch:\n inputs:\n re"
},
{
"path": ".github/workflows/release_channels.yml",
"chars": 4828,
"preview": "name: Trigger release workflows upon Publish\n\non:\n release:\n types: [published, released]\n\npermissions:\n contents: "
},
{
"path": ".github/workflows/sec_sast_semgrep_cron.yml",
"chars": 978,
"preview": "---\nname: Semgrep Full Scan\n\non:\n workflow_dispatch:\n schedule:\n - cron: 0 1 * * 6\n\npermissions:\n actions: read\n "
},
{
"path": ".github/workflows/sec_sast_semgrep_pull.yml",
"chars": 558,
"preview": "---\nname: Semgrep Differential Scan\non: pull_request\n\npermissions: read-all\n\njobs:\n semgrep-diff:\n runs-on: ubuntu-2"
},
{
"path": ".github/workflows/stale_bot.yml",
"chars": 978,
"preview": "name: process stale Issues and PR's\non:\n schedule:\n - cron: 0 6 * * *\n workflow_dispatch: {}\n\npermissions:\n issues"
},
{
"path": ".github/workflows/test_native.yml",
"chars": 6141,
"preview": "name: Run Tests on Native platform\n\non:\n workflow_call:\n workflow_dispatch:\n\npermissions: {}\n\nenv:\n LCOV_CAPTURE_FLAG"
},
{
"path": ".github/workflows/tests.yml",
"chars": 1622,
"preview": "name: End to end tests\n\non:\n schedule:\n - cron: 0 0 * * * # Run every day at midnight\n workflow_dispatch: {}\n\npermi"
},
{
"path": ".github/workflows/trunk_annotate_pr.yml",
"chars": 647,
"preview": "name: Annotate PR with trunk issues\n# See: https://github.com/trunk-io/trunk-action/blob/v1/readme.md#getting-inline-ann"
},
{
"path": ".github/workflows/trunk_check.yml",
"chars": 519,
"preview": "name: Pull Request\non: [pull_request]\nconcurrency:\n group: ${{ github.head_ref || github.run_id }}\n cancel-in-progress"
},
{
"path": ".github/workflows/update_protobufs.yml",
"chars": 1173,
"preview": "name: Update protobufs and regenerate classes\non: workflow_dispatch\n\npermissions: read-all\n\njobs:\n update-protobufs:\n "
},
{
"path": ".gitignore",
"chars": 720,
"preview": ".pio\npio\npio.tar\nweb\nweb.tar\n\n# ignore vscode IDE settings files\n.vscode/*\n!.vscode/settings.json\n!.vscode/tasks.json\n!."
},
{
"path": ".gitmodules",
"chars": 185,
"preview": "[submodule \"protobufs\"]\n\tpath = protobufs\n\turl = https://github.com/meshtastic/protobufs.git\n[submodule \"meshtestic\"]\n\tp"
},
{
"path": ".gitpod.yml",
"chars": 69,
"preview": "tasks:\n - init: pip install platformio && pip install --upgrade pip\n"
},
{
"path": ".semgrepignore",
"chars": 68,
"preview": ".github/workflows/main_matrix.yml\nsrc/mesh/compression/unishox2.cpp\n"
},
{
"path": ".trunk/.gitignore",
"chars": 80,
"preview": "*out\n*logs\n*actions\n*notifications\n*tools\nplugins\nuser_trunk.yaml\nuser.yaml\ntmp\n"
},
{
"path": ".trunk/configs/.bandit",
"chars": 21,
"preview": "[bandit]\nskips = B101"
},
{
"path": ".trunk/configs/.clang-format",
"chars": 136,
"preview": "Language: Cpp\nIndentWidth: 4\nColumnLimit: 130\nPointerAlignment: Right\nBreakBeforeBraces: Linux\nAllowShortFunctionsOnASin"
},
{
"path": ".trunk/configs/.flake8",
"chars": 137,
"preview": "# Autoformatter friendly flake8 config (all formatting rules disabled)\n[flake8]\nextend-ignore = D1, D2, E1, E2, E3, E501"
},
{
"path": ".trunk/configs/.hadolint.yaml",
"chars": 78,
"preview": "# Following source doesn't work in most setups\nignored:\n - SC1090\n - SC1091\n"
},
{
"path": ".trunk/configs/.isort.cfg",
"chars": 25,
"preview": "[settings]\nprofile=black\n"
},
{
"path": ".trunk/configs/.markdownlint.yaml",
"chars": 233,
"preview": "# Autoformatter friendly markdownlint config (all formatting rules disabled)\ndefault: true\nblank_lines: false\nbullet: fa"
},
{
"path": ".trunk/configs/.prettierignore",
"chars": 14,
"preview": "renovate.json\n"
},
{
"path": ".trunk/configs/.prettierrc",
"chars": 130,
"preview": "{\n \"overrides\": [\n {\n \"files\": \"userPrefs.jsonc\",\n \"options\": {\n \"trailingComma\": \"none\"\n }\n "
},
{
"path": ".trunk/configs/.shellcheckrc",
"chars": 199,
"preview": "enable=all\nsource-path=SCRIPTDIR\ndisable=SC2154\ndisable=SC2248\ndisable=SC2250\n\n# If you're having issues with shellcheck"
},
{
"path": ".trunk/configs/.yamllint.yaml",
"chars": 238,
"preview": "rules:\n quoted-strings:\n required: only-when-needed\n extra-allowed: [\"{|}\"]\n empty-values:\n forbid-in-block-m"
},
{
"path": ".trunk/configs/ruff.toml",
"chars": 181,
"preview": "# Generic, formatter-friendly config.\nselect = [\"B\", \"D3\", \"D4\", \"E\", \"F\"]\n\n# Never enforce `E501` (line length violatio"
},
{
"path": ".trunk/configs/svgo.config.js",
"chars": 280,
"preview": "module.exports = {\n plugins: [\n {\n name: \"preset-default\",\n params: {\n overrides: {\n remov"
},
{
"path": ".trunk/trunk.yaml",
"chars": 891,
"preview": "version: 0.1\ncli:\n version: 1.25.0\nplugins:\n sources:\n - id: trunk\n ref: v1.7.6\n uri: https://github.com/"
},
{
"path": ".vscode/settings.json",
"chars": 352,
"preview": "{\n \"editor.formatOnSave\": true,\n \"editor.defaultFormatter\": \"trunk.io\",\n \"trunk.enableWindows\": true,\n \"files.insert"
},
{
"path": ".vscode/tasks.json",
"chars": 259,
"preview": "{\n \"version\": \"2.0.0\",\n \"tasks\": [\n {\n \"type\": \"PlatformIO\",\n \"task\": \"Build\",\n \"problemMatcher\": [\""
},
{
"path": "CODE_OF_CONDUCT.md",
"chars": 198,
"preview": "# Contributor Covenant Code of Conduct\n\nThe Meshtastic Firmware project is subject to the code of conduct for the parent"
},
{
"path": "CONTRIBUTING.md",
"chars": 2727,
"preview": "# Contributing to Meshtastic Firmware\n\nWe're excited that you're interested in contributing to the Meshtastic firmware! "
},
{
"path": "Dockerfile",
"chars": 3030,
"preview": "# trunk-ignore-all(trivy/DS002): We must run as root for this container\n# trunk-ignore-all(hadolint/DL3002): We must run"
},
{
"path": "Dockerfile.test",
"chars": 1041,
"preview": "# Lightweight container for running native PlatformIO tests on non-Linux hosts\nFROM python:3.14-slim-trixie\n\nENV DEBIAN_"
},
{
"path": "LICENSE",
"chars": 35148,
"preview": " GNU GENERAL PUBLIC LICENSE\n Version 3, 29 June 2007\n\n Copyright (C) 2007 Free "
},
{
"path": "README.md",
"chars": 2317,
"preview": "<div align=\"center\" markdown=\"1\">\n\n<img src=\".github/meshtastic_logo.png\" alt=\"Meshtastic Logo\" width=\"80\"/>\n<h1>Meshtas"
},
{
"path": "SECURITY.md",
"chars": 489,
"preview": "# Security Policy\n\n## Supported Versions\n\n| Firmware Version | Supported |\n| ---------------- | ---------------"
},
{
"path": "alpine.Dockerfile",
"chars": 2373,
"preview": "# trunk-ignore-all(trivy/DS002): We must run as root for this container\n# trunk-ignore-all(hadolint/DL3002): We must run"
},
{
"path": "bin/.gitignore",
"chars": 12,
"preview": "config.yaml\n"
},
{
"path": "bin/99-meshtasticd-udev.rules",
"chars": 352,
"preview": "# Set spidev ownership to 'spi' group\nSUBSYSTEM==\"spidev\", KERNEL==\"spidev*\", GROUP=\"spi\", MODE=\"0660\"\n# Allow access to"
},
{
"path": "bin/analyze_map.py",
"chars": 6542,
"preview": "#!/usr/bin/env python3\n\"\"\"Summarise linker map output to highlight heavy object files and libraries.\n\nUsage:\n python "
},
{
"path": "bin/base64_to_hex.py",
"chars": 1056,
"preview": "import sys\nimport base64\n\ndef base64_to_hex_string(b64_string):\n try:\n # Decode the Base64 string to raw bytes"
},
{
"path": "bin/build-esp32.sh",
"chars": 1056,
"preview": "#!/usr/bin/env bash\n\nset -e\n\nVERSION=`bin/buildinfo.py long`\nSHORT_VERSION=`bin/buildinfo.py short`\n\nBUILDDIR=.pio/build"
},
{
"path": "bin/build-firmware.sh",
"chars": 353,
"preview": "#!/usr/bin/env bash\n\nexport PIP_BREAK_SYSTEM_PACKAGES=1\n\nif (echo $2 | grep -q \"esp32\"); then\n bin/build-esp32.sh $1\nel"
},
{
"path": "bin/build-native.sh",
"chars": 1041,
"preview": "#!/usr/bin/env bash\n\nset -e\n\nplatformioFailed() {\n\t[[ $VIRTUAL_ENV != \"\" ]] && exit 1 # don't hint at virtualenv if it's"
},
{
"path": "bin/build-nrf52.sh",
"chars": 1220,
"preview": "#!/usr/bin/env bash\n\nset -e\n\nVERSION=$(bin/buildinfo.py long)\nSHORT_VERSION=$(bin/buildinfo.py short)\n\nBUILDDIR=.pio/bui"
},
{
"path": "bin/build-rp2xx0.sh",
"chars": 766,
"preview": "#!/usr/bin/env bash\n\nset -e\n\nVERSION=`bin/buildinfo.py long`\nSHORT_VERSION=`bin/buildinfo.py short`\n\nBUILDDIR=.pio/build"
},
{
"path": "bin/build-stm32wl.sh",
"chars": 774,
"preview": "#!/usr/bin/env bash\n\nset -e\n\nVERSION=$(bin/buildinfo.py long)\nSHORT_VERSION=$(bin/buildinfo.py short)\n\nBUILDDIR=.pio/bui"
},
{
"path": "bin/build-userprefs-json.py",
"chars": 1669,
"preview": "import json\nimport subprocess\nimport re\n\ndef get_macros_from_header(header_file):\n # Run clang to preprocess the head"
},
{
"path": "bin/buildinfo.py",
"chars": 161,
"preview": "#!/usr/bin/env python3\nimport sys\n\nfrom readprops import readProps\n\nverObj = readProps(\"version.properties\")\npropName = "
},
{
"path": "bin/bump_metainfo/bump_metainfo.py",
"chars": 2403,
"preview": "#!/usr/bin/env python3\nimport argparse\nimport xml.etree.ElementTree as ET\nfrom defusedxml.ElementTree import parse\nfrom "
},
{
"path": "bin/bump_metainfo/requirements.txt",
"chars": 18,
"preview": "defusedxml==0.7.1\n"
},
{
"path": "bin/bump_version.py",
"chars": 447,
"preview": "#!/usr/bin/env python\n\"\"\"Bump the version number\"\"\"\n\nlines = None\n\nwith open('version.properties', 'r', encoding='utf-8'"
},
{
"path": "bin/check-all.sh",
"chars": 796,
"preview": "#!/usr/bin/env bash\n\n# Note: This is a prototype for how we could add static code analysis to the CI.\n\nset -e\n\nVERSION=$"
},
{
"path": "bin/check-dependencies.sh",
"chars": 584,
"preview": "#!/usr/bin/env bash\n\n# Note: This is a prototype for how we could add static code analysis to the CI.\n\nset -e\n\nif [[ $# "
},
{
"path": "bin/config-dist.yaml",
"chars": 5824,
"preview": "### Many device configs have been moved to /etc/meshtasticd/available.d\n### To activate, simply copy or link the appropr"
},
{
"path": "bin/config.d/MUI/X11_480x480.yaml",
"chars": 48,
"preview": "Display:\n Panel: X11\n Width: 480\n Height: 480"
},
{
"path": "bin/config.d/OpenWRT/BananaPi-BPI-R4-sx1262.yaml",
"chars": 182,
"preview": "Lora:\n Module: sx1262 # BananaPi-BPI-R4 SPI via 26p GPIO Header\n## CS: 28\n IRQ: 50\n Busy: 62\n Reset: 51\n spidev: "
},
{
"path": "bin/config.d/OpenWRT/OpenWRT-One-mikroBUS-LR-IOT-CLICK.yaml",
"chars": 193,
"preview": "## https://www.mikroe.com/lr-iot-click\nLora:\n Module: lr1110 # OpenWRT ONE mikroBUS with LR-IOT-CLICK\n# CS: 25\n IRQ"
},
{
"path": "bin/config.d/OpenWRT/OpenWRT_One_mikroBUS_sx1262.yaml",
"chars": 128,
"preview": "Lora:\n Module: sx1262\n IRQ: 10\n Busy: 12\n# Reset: 2\n spidev: spidev2.0\n DIO2_AS_RF_SWITCH: true\n DIO3_TCXO_VOLTAG"
},
{
"path": "bin/config.d/display-waveshare-1-44.yaml",
"chars": 582,
"preview": "### Waveshare 1.44inch LCD HAT\nDisplay:\n Panel: ST7735S\n spidev: spidev0.0 # Specify either the spidev here, or the C"
},
{
"path": "bin/config.d/display-waveshare-2.8.yaml",
"chars": 372,
"preview": "Display:\n\n### Waveshare 2.8inch RPi LCD\n Panel: ST7789\n CS: 8\n DC: 22 # Data/Command pin\n Backlight: 18\n Wid"
},
{
"path": "bin/config.d/femtofox/femtofox_LR1121_TCXO.yaml",
"chars": 425,
"preview": "---\r\nLora:\r\n## Ebyte E80-900M22S\r\n## This is a bit experimental\r\n## \r\n##\r\n Module: lr1121\r\n gpiochip: 1 # subtract 32 "
},
{
"path": "bin/config.d/femtofox/femtofox_SX1262_TCXO.yaml",
"chars": 797,
"preview": "---\r\nLora:\r\n## Ebyte E22-900M30S, E22-900M22S with or without external RF switching setup\r\n## HT-RA62 (Has internal swit"
},
{
"path": "bin/config.d/femtofox/femtofox_SX1262_XTAL.yaml",
"chars": 707,
"preview": "---\r\nLora:\r\n## Ebyte E22-900MM22S with no external RF switching setup\r\n## Waveshare SX126X XXXM, AI Thinker RA-01SH\r\n## "
},
{
"path": "bin/config.d/lora-Adafruit-RFM9x.yaml",
"chars": 81,
"preview": "Lora:\n Module: RF95 # Adafruit RFM9x\n Reset: 25\n CS: 7\n IRQ: 22\n# Busy: 23\n"
},
{
"path": "bin/config.d/lora-MeshAdv-900M30S.yaml",
"chars": 275,
"preview": "# MeshAdv-Pi E22-900M30S\n# https://github.com/chrismyers2000/MeshAdv-Pi-Hat\nLora:\n Module: sx1262\n CS: 21\n IRQ: 16\n "
},
{
"path": "bin/config.d/lora-MeshAdv-Mini-900M22S.yaml",
"chars": 225,
"preview": "# MeshAdv Mini E22-900M22S\n# https://github.com/chrismyers2000/MeshAdv-Mini\nLora:\n Module: sx1262 # Ebyte E22-900M22S "
},
{
"path": "bin/config.d/lora-RAK6421-13300-slot1.yaml",
"chars": 234,
"preview": "Lora:\n\n ### RAK13300in Slot 1\n Module: sx1262\n IRQ: 22 #IO6\n Reset: 16 # IO4\n Busy: 24 # IO5\n # Ant_sw: 13 # IO3 \n"
},
{
"path": "bin/config.d/lora-RAK6421-13300-slot2.yaml",
"chars": 169,
"preview": "Lora:\n ### RAK13300in Slot 2 pins\n IRQ: 18 #IO6\n Reset: 24 # IO4\n Busy: 19 # IO5\n # Ant_sw: 23 # IO3 \n Enable_Pins"
},
{
"path": "bin/config.d/lora-RAK6421-13302-slot1.yaml",
"chars": 332,
"preview": "Lora:\n\n ### RAK13300in Slot 1\n Module: sx1262\n IRQ: 22 #IO6\n Reset: 16 # IO4\n Busy: 24 # IO5\n # Ant_sw: 13 # IO3 \n"
},
{
"path": "bin/config.d/lora-RAK6421-13302-slot2.yaml",
"chars": 267,
"preview": "Lora:\n ### RAK13300in Slot 2 pins\n IRQ: 18 #IO6\n Reset: 24 # IO4\n Busy: 19 # IO5\n # Ant_sw: 23 # IO3 \n Enable_Pins"
},
{
"path": "bin/config.d/lora-hat-rak-6421-pi-hat.yaml",
"chars": 323,
"preview": "Lora:\n\n ### RAK13300in Slot 1\n Module: sx1262\n IRQ: 22 #IO6\n Reset: 16 # IO4\n Busy: 24 # IO5\n Enable_Pins:\n - 1"
},
{
"path": "bin/config.d/lora-lyra-picocalc-wio-sx1262.yaml",
"chars": 286,
"preview": "Lora:\n Module: sx1262\n DIO2_AS_RF_SWITCH: true\n DIO3_TCXO_VOLTAGE: true\n gpiochip: 0\n MOSI: 12\n MISO: 13\n IRQ: 1\n"
},
{
"path": "bin/config.d/lora-lyra-ultra_1w.yaml",
"chars": 435,
"preview": "# For use with Armbian luckfox-lyra-ultra-w\n# Enable overlay 'luckfox-lyra-ultra-w-spi0-cs0-spidev' with armbian-config\n"
},
{
"path": "bin/config.d/lora-lyra-ultra_2w.yaml",
"chars": 457,
"preview": "# For use with Armbian luckfox-lyra-ultra-w\n# Enable overlay 'luckfox-lyra-ultra-w-spi0-cs0-spidev' with armbian-config\n"
},
{
"path": "bin/config.d/lora-lyra-ws-raspberry-pi-pico-hat.yaml",
"chars": 561,
"preview": "# For use with Armbian luckfox-lyra // luckfox-lyra-plus\n# Enable overlay 'luckfox-lyra-plus-spi0-cs0_rmio13-spidev' wit"
},
{
"path": "bin/config.d/lora-meshstick-1262.yaml",
"chars": 166,
"preview": "Lora:\n Module: sx1262\n CS: 0\n IRQ: 6\n Reset: 2\n Busy: 4\n spidev: ch341\n DIO3_TCXO_VOLTAGE: true\n# USB_Serialnum:"
},
{
"path": "bin/config.d/lora-piggystick-lr1121.yaml",
"chars": 165,
"preview": "Lora:\n Module: lr1121\n CS: 0\n IRQ: 6\n Reset: 2\n Busy: 4\n spidev: ch341\n DIO3_TCXO_VOLTAGE: 1.8\n# USB_Serialnum: "
},
{
"path": "bin/config.d/lora-pinedio-usb-sx1262.yaml",
"chars": 57,
"preview": "Lora:\n Module: sx1262\n CS: 0 \n IRQ: 10\n spidev: ch341"
},
{
"path": "bin/config.d/lora-raxda-rock2f-starter-edition-hat.yaml",
"chars": 1729,
"preview": "Lora:\n\n### Raxda Rock 2F running Armbian Linux 6.1.99-vendor-rk35xx\n### https://github.com/markbirss/rock-2f\n### https:/"
},
{
"path": "bin/config.d/lora-starter-edition-sx1262-i2c.yaml",
"chars": 271,
"preview": "# https://www.waveshare.com/core1262-868m.htm\n# https://github.com/markbirss/lora-starter-edition-sx1262-i2c\nLora:\n Mod"
},
{
"path": "bin/config.d/lora-usb-meshstick-1262.yaml",
"chars": 224,
"preview": "Lora:\n Module: sx1262\n CS: 0\n IRQ: 6\n Reset: 2\n Busy: 4\n RXen: 1\n DIO2_AS_RF_SWITCH: true\n spidev: ch341\n DIO3_"
},
{
"path": "bin/config.d/lora-usb-meshtoad-e22.yaml",
"chars": 364,
"preview": "Lora:\n Module: sx1262\n CS: 0\n IRQ: 6\n Reset: 2\n Busy: 4\n RXen: 1\n DIO2_AS_RF_SWITCH: true\n DIO3_TCXO_VOLTAGE: tr"
},
{
"path": "bin/config.d/lora-usb-umesh-1262-30dbm.yaml",
"chars": 856,
"preview": "Lora:\n Module: sx1262\n CS: 0\n IRQ: 6\n Reset: 1\n Busy: 4\n RXen: 2\n DIO2_AS_RF_SWITCH: true\n spidev: ch341\n USB_P"
},
{
"path": "bin/config.d/lora-usb-umesh-1268-30dbm.yaml",
"chars": 856,
"preview": "Lora:\n Module: sx1268\n CS: 0\n IRQ: 6\n Reset: 1\n Busy: 4\n RXen: 2\n DIO2_AS_RF_SWITCH: true\n spidev: ch341\n USB_P"
},
{
"path": "bin/config.d/lora-waveshare-sxxx.yaml",
"chars": 135,
"preview": "Lora:\n Module: sx1262 # Waveshare SX126X XXXM\n DIO2_AS_RF_SWITCH: true\n CS: 21\n IRQ: 16\n Busy: 20\n Reset: 18\n SX"
},
{
"path": "bin/config.d/lora-ws-raspberry-pi-pico-to-rpi-adapter.yaml",
"chars": 302,
"preview": "# https://www.waveshare.com/pico-lora-sx1262-868m.htm\n# https://github.com/markbirss/lora-ws-raspberry-pi-pico-to-rpi-ad"
},
{
"path": "bin/config.d/lora-ws-raspberry-pico-to-orangepi-03.yaml",
"chars": 1545,
"preview": "# https://www.waveshare.com/pico-lora-sx1262-868m.htm\n# http://www.orangepi.org/html/hardWare/computerAndMicrocontroller"
},
{
"path": "bin/device-install.bat",
"chars": 9435,
"preview": "@ECHO OFF\r\nSETLOCAL EnableDelayedExpansion\r\nTITLE Meshtastic device-install\r\n\r\nSET \"SCRIPT_NAME=%~nx0\"\r\nSET \"DEBUG=0\"\r\nS"
},
{
"path": "bin/device-install.sh",
"chars": 4809,
"preview": "#!/usr/bin/env bash\n\nPYTHON=${PYTHON:-$(which python3 python | head -n 1)}\nBPS_RESET=false\nMCU=\"\"\n\n# Constants\nRESET_BAU"
},
{
"path": "bin/device-install_test.ps1",
"chars": 4578,
"preview": "<#\r\n .SYNOPSIS\r\n Unit-test for .\\device-install.bat.\r\n\r\n .DESCRIPTION\r\n This script performs a positive unit"
},
{
"path": "bin/device-update.bat",
"chars": 6744,
"preview": "@ECHO OFF\r\nSETLOCAL EnableDelayedExpansion\r\nTITLE Meshtastic device-update\r\n\r\nSET \"SCRIPT_NAME=%~nx0\"\r\nSET \"DEBUG=0\"\r\nSE"
},
{
"path": "bin/device-update.sh",
"chars": 2660,
"preview": "#!/usr/bin/env bash\n\nPYTHON=${PYTHON:-$(which python3 python|head -n 1)}\nCHANGE_MODE=false\n\n# Constants\nFLASH_BAUD=11520"
},
{
"path": "bin/dump-ram-users.sh",
"chars": 160,
"preview": "#!/usr/bin/env bash\n\narm-none-eabi-readelf -s -e .pio/build/nrf52dk/firmware.elf | head -80\n\nnm -CSr --size-sort .pio/bu"
},
{
"path": "bin/exception_decoder.py",
"chars": 12656,
"preview": "#!/usr/bin/env python3\n\n\"\"\"ESP Exception Decoder\n\ngithub: https://github.com/janLo/EspArduinoExceptionDecoder\nlicense: "
},
{
"path": "bin/gen-images.sh",
"chars": 649,
"preview": "#!/usr/bin/env bash\n\nset -e \n\n# regen the design bins first\ncd design\nbin/generate-pngs.sh\ncd ..\n\n# assumes 50 wide, 28 "
},
{
"path": "bin/generate_ci_matrix.py",
"chars": 2404,
"preview": "#!/usr/bin/env python3\n\n\"\"\"Generate the CI matrix.\"\"\"\n\nimport argparse\nimport json\nimport re\nfrom platformio.project.con"
},
{
"path": "bin/generate_release_notes.py",
"chars": 10656,
"preview": "#!/usr/bin/env python3\n\"\"\"\nGenerate release notes from merged PRs on develop and master branches.\nCategorizes PRs into E"
},
{
"path": "bin/generic/Meshtastic_6.1.0_bootloader-0.9.2_s140_6.1.1.hex",
"chars": 516492,
"preview": ":04000003F000B2CD8A\n:020000040000FA\n:1000000000040020810A000015070000610A0000BA\n:100010001F07000029070000330700000000000"
},
{
"path": "bin/generic/Meshtastic_7.3.0_bootloader-0.9.2_s140_7.3.0.hex",
"chars": 521200,
"preview": ":04000003F000B2CD8A\n:020000040000FA\n:1000000000040020810A000015070000610A0000BA\n:100010001F07000029070000330700000000000"
},
{
"path": "bin/genpartitions.py",
"chars": 1212,
"preview": "#!/usr/bin/env python2\n\n# This is a layout for 4MB of flash\n# Name, Type, SubType, Offset, Size, Flags\n# nvs, da"
},
{
"path": "bin/kill-github-actions.sh",
"chars": 3421,
"preview": "#!/bin/bash\n\n# Script to cancel all running GitHub Actions workflows\n# Requires GitHub CLI (gh) to be installed and auth"
},
{
"path": "bin/meshtasticd-start.sh",
"chars": 922,
"preview": "#!/usr/bin/env sh\n\nINSTANCE=$1\nCONF_DIR=\"/etc/meshtasticd/config.d\"\nVFS_DIR=\"/var/lib\"\n\n# If no instance ID provided, st"
},
{
"path": "bin/meshtasticd.service",
"chars": 317,
"preview": "[Unit]\nDescription=Meshtastic %i Daemon\nAfter=network-online.target\nStartLimitInterval=200\nStartLimitBurst=5\n\n[Service]\n"
},
{
"path": "bin/native-gdbserver.sh",
"chars": 124,
"preview": "#!/usr/bin/env bash\n\nset -e\npio run --environment native\ngdbserver --once localhost:2345 .pio/build/native/meshtasticd \""
},
{
"path": "bin/native-install.sh",
"chars": 415,
"preview": "#!/usr/bin/env bash\n\ncp \"release/meshtasticd_linux_$(uname -m)\" /usr/bin/meshtasticd\ncp \"bin/meshtasticd-start.sh\" /usr/"
},
{
"path": "bin/native-run.sh",
"chars": 92,
"preview": "#!/usr/bin/env bash\n\nset -e\npio run --environment native\n.pio/build/native/meshtasticd \"$@\"\n"
},
{
"path": "bin/org.meshtastic.meshtasticd.desktop",
"chars": 168,
"preview": "[Desktop Entry]\nName=Meshtastic\nComment=Meshtastic App\nExec=meshtasticd\nIcon=org.meshtastic.meshtasticd\nTerminal=true\nTy"
},
{
"path": "bin/org.meshtastic.meshtasticd.metainfo.xml",
"chars": 8089,
"preview": "<?xml version='1.0' encoding='UTF-8'?>\n<component type=\"desktop-application\">\n <id>org.meshtastic.meshtasticd</id>\n\n <"
},
{
"path": "bin/platformio-custom.py",
"chars": 11634,
"preview": "#!/usr/bin/env python3\n# trunk-ignore-all(ruff/F821)\n# trunk-ignore-all(flake8/F821): For SConstruct imports\nimport sys\n"
},
{
"path": "bin/platformio-pre.py",
"chars": 709,
"preview": "#!/usr/bin/env python3\n# trunk-ignore-all(ruff/F821)\n# trunk-ignore-all(flake8/F821): For SConstruct imports\nImport(\"env"
},
{
"path": "bin/promote-release.sh",
"chars": 419,
"preview": "#!/usr/bin/env bash\n\nset -e \n\necho \"This script is only for developers who are publishing new builds on github. Most us"
},
{
"path": "bin/read-system-info.sh",
"chars": 87,
"preview": "#!/usr/bin/env bash\n\nesptool.py --baud 115200 read_flash 0x1000 0xf000 system-info.img\n"
},
{
"path": "bin/readprops.py",
"chars": 1643,
"preview": "import configparser\nimport subprocess\nimport os\nrun_number = os.getenv('GITHUB_RUN_NUMBER', '0')\nbuild_location = os.get"
},
{
"path": "bin/regen-protos.bat",
"chars": 262,
"preview": "@ECHO OFF\r\nSETLOCAL\r\n\r\ncd protobufs\r\n..\\nanopb-0.4.9\\generator-bin\\protoc.exe --experimental_allow_proto3_optional \"--na"
},
{
"path": "bin/regen-protos.sh",
"chars": 541,
"preview": "#!/usr/bin/env bash\n\nset -e\n\necho \"This script requires https://jpa.kapsi.fi/nanopb/download/ version 0.4.9 to be locate"
},
{
"path": "bin/rpkg.macros",
"chars": 418,
"preview": "function meshtastic_version {\n meshtastic_version=$(python3 bin/buildinfo.py short)\n echo -n \"$meshtastic_version\""
},
{
"path": "bin/s140_nrf52_7.3.0_softdevice.hex",
"chars": 427812,
"preview": ":020000040000FA\n:1000000000040020810A000015070000610A0000BA\n:100010001F07000029070000330700000000000050\n:100020000000000"
},
{
"path": "bin/setup-python-for-esp-debug.sh",
"chars": 543,
"preview": "# shellcheck shell=bash\n# (this minor script is actually shell agnostic, and is intended to be sourced rather than run i"
},
{
"path": "bin/shame.py",
"chars": 2998,
"preview": "import sys\nimport os\nimport json\nfrom github import Github\n\ndef parseFile(path):\n with open(path, \"r\") as f:\n "
},
{
"path": "bin/test-native-docker.sh",
"chars": 1480,
"preview": "#!/usr/bin/env bash\n# Run native PlatformIO tests inside Docker (for macOS / non-Linux hosts).\n#\n# Usage:\n# ./bin/test"
},
{
"path": "bin/test-simulator.sh",
"chars": 251,
"preview": "#!/usr/bin/env bash\n\nset -e\n\necho \"Starting simulator\"\n.pio/build/native/meshtasticd -s &\nsleep 20 # 5 seconds was not e"
},
{
"path": "bin/uf2-convert.bat",
"chars": 3939,
"preview": "@ECHO OFF\r\nSETLOCAL EnableDelayedExpansion\r\nTITLE Meshtastic uf2-convert\r\n\r\nSET \"SCRIPT_NAME=%~nx0\"\r\nSET \"DEBUG=0\"\r\nSET "
},
{
"path": "bin/uf2conv.py",
"chars": 10316,
"preview": "#!/usr/bin/env python3\nimport argparse\nimport os\nimport os.path\nimport re\nimport struct\nimport subprocess\nimport sys\n\nUF"
},
{
"path": "bin/view-map.sh",
"chars": 91,
"preview": "#!/usr/bin/env bash\n\necho using amap tool to display memory map\namap .pio/build/output.map\n"
},
{
"path": "bin/web.version",
"chars": 5,
"preview": "2.6.7"
},
{
"path": "boards/CDEBYTE_EoRa-Hub.json",
"chars": 918,
"preview": "{\n \"build\": {\n \"arduino\": {\n \"ldscript\": \"esp32s3_out.ld\",\n \"partitions\": \"default.csv\",\n \"memory_typ"
},
{
"path": "boards/CDEBYTE_EoRa-S3.json",
"chars": 938,
"preview": "{\n \"build\": {\n \"arduino\": {\n \"ldscript\": \"esp32s3_out.ld\"\n },\n \"core\": \"esp32\",\n \"extra_flags\": [\n "
},
{
"path": "boards/ESP32-S3-WROOM-1-N4.json",
"chars": 1086,
"preview": "{\n \"build\": {\n \"arduino\": {\n \"ldscript\": \"esp32s3_out.ld\"\n },\n \"core\": \"esp32\",\n \"extra_flags\": [\n "
},
{
"path": "boards/ThinkNode-M1.json",
"chars": 1387,
"preview": "{\n \"build\": {\n \"arduino\": {\n \"ldscript\": \"nrf52840_s140_v6.ld\"\n },\n \"core\": \"nRF5\",\n \"cpu\": \"cortex-m4"
},
{
"path": "boards/ThinkNode-M3.json",
"chars": 1233,
"preview": "{\n \"build\": {\n \"arduino\": {\n \"ldscript\": \"nrf52840_s140_v6.ld\"\n },\n \"core\": \"nRF5\",\n \"cpu\": \"cortex-m4"
},
{
"path": "boards/ThinkNode-M4.json",
"chars": 1402,
"preview": "{\n \"build\": {\n \"arduino\": {\n \"ldscript\": \"nrf52840_s140_v6.ld\"\n },\n \"core\": \"nRF5\",\n \"cpu\": \"cortex-m4"
},
{
"path": "boards/ThinkNode-M6.json",
"chars": 1383,
"preview": "{\n \"build\": {\n \"arduino\": {\n \"ldscript\": \"nrf52840_s140_v6.ld\"\n },\n \"core\": \"nRF5\",\n \"cpu\": \"cortex-m4"
},
{
"path": "boards/bpi_picow_esp32_s3.json",
"chars": 937,
"preview": "{\n \"build\": {\n \"arduino\": {\n \"ldscript\": \"esp32s3_out.ld\"\n },\n \"core\": \"esp32\",\n \"extra_flags\": [\n "
},
{
"path": "boards/canaryone.json",
"chars": 1263,
"preview": "{\n \"build\": {\n \"arduino\": {\n \"ldscript\": \"nrf52840_s140_v6.ld\"\n },\n \"core\": \"nRF5\",\n \"cpu\": \"cortex-m4"
},
{
"path": "boards/crowpanel.json",
"chars": 1164,
"preview": "{\n \"build\": {\n \"arduino\": {\n \"ldscript\": \"esp32s3_out.ld\",\n \"memory_type\": \"qio_opi\",\n \"partitions\": "
},
{
"path": "boards/eink0.1.json",
"chars": 1115,
"preview": "{\n \"build\": {\n \"arduino\": {\n \"ldscript\": \"nrf52840_s140_v6.ld\"\n },\n \"core\": \"nRF5\",\n \"cpu\": \"cortex-m4"
},
{
"path": "boards/esp32-s3-pico.json",
"chars": 1110,
"preview": "{\n \"build\": {\n \"arduino\": {\n \"ldscript\": \"esp32s3_out.ld\",\n \"partitions\": \"default_16MB.csv\"\n },\n \"c"
},
{
"path": "boards/esp32-s3-zero.json",
"chars": 1120,
"preview": "{\n \"build\": {\n \"arduino\": {\n \"partitions\": \"default.csv\",\n \"memory_type\": \"qio_qspi\"\n },\n \"core\": \"e"
},
{
"path": "boards/gat562_mesh_trial_tracker.json",
"chars": 1291,
"preview": "{\n \"build\": {\n \"arduino\": {\n \"ldscript\": \"nrf52840_s140_v6.ld\"\n },\n \"core\": \"nRF5\",\n \"cpu\": \"cortex-m4"
},
{
"path": "boards/hackaday-communicator.json",
"chars": 1057,
"preview": "{\n \"build\": {\n \"arduino\": {\n \"ldscript\": \"esp32s3_out.ld\",\n \"memory_type\": \"qio_opi\"\n },\n \"core\": \"e"
},
{
"path": "boards/heltec_mesh_node_t114.json",
"chars": 1327,
"preview": "{\n \"build\": {\n \"arduino\": {\n \"ldscript\": \"nrf52840_s140_v6.ld\"\n },\n \"core\": \"nRF5\",\n \"cpu\": \"cortex-m4"
},
{
"path": "boards/heltec_mesh_pocket.json",
"chars": 1278,
"preview": "{\n \"build\": {\n \"arduino\": {\n \"ldscript\": \"nrf52840_s140_v6.ld\"\n },\n \"core\": \"nRF5\",\n \"cpu\": \"cortex-m4"
},
{
"path": "boards/heltec_mesh_solar.json",
"chars": 1304,
"preview": "{\n \"build\": {\n \"arduino\": {\n \"ldscript\": \"nrf52840_s140_v6.ld\"\n },\n \"core\": \"nRF5\",\n \"cpu\": \"cortex-m4"
},
{
"path": "boards/heltec_v4.json",
"chars": 1118,
"preview": "{\n \"build\": {\n \"arduino\": {\n \"ldscript\": \"esp32s3_out.ld\",\n \"partitions\": \"default_16MB.csv\",\n \"memor"
},
{
"path": "boards/heltec_vision_master_e213.json",
"chars": 1099,
"preview": "{\n \"build\": {\n \"arduino\": {\n \"ldscript\": \"esp32s3_out.ld\",\n \"partitions\": \"default_8MB.csv\",\n \"memory"
},
{
"path": "boards/heltec_vision_master_e290.json",
"chars": 1099,
"preview": "{\n \"build\": {\n \"arduino\": {\n \"ldscript\": \"esp32s3_out.ld\",\n \"partitions\": \"default_8MB.csv\",\n \"memory"
},
{
"path": "boards/heltec_vision_master_t190.json",
"chars": 1099,
"preview": "{\n \"build\": {\n \"arduino\": {\n \"ldscript\": \"esp32s3_out.ld\",\n \"partitions\": \"default_8MB.csv\",\n \"memory"
},
{
"path": "boards/heltec_wireless_tracker.json",
"chars": 973,
"preview": "{\n \"build\": {\n \"arduino\": {\n \"ldscript\": \"esp32s3_out.ld\",\n \"partitions\": \"default_8MB.csv\"\n },\n \"co"
},
{
"path": "boards/heltec_wireless_tracker_v2.json",
"chars": 918,
"preview": "{\n \"build\": {\n \"arduino\": {\n \"ldscript\": \"esp32s3_out.ld\",\n \"partitions\": \"default_8MB.csv\"\n },\n \"co"
},
{
"path": "boards/icarus.json",
"chars": 1018,
"preview": "{\n \"build\": {\n \"arduino\": {\n \"ldscript\": \"esp32s3_out.ld\",\n \"memory_type\": \"qio_opi\"\n },\n \"core\": \"e"
},
{
"path": "boards/me25ls01-4y10td.json",
"chars": 1352,
"preview": "{\n \"build\": {\n \"arduino\": {\n \"ldscript\": \"nrf52840_s140_v7.ld\"\n },\n \"core\": \"nRF5\",\n \"cpu\": \"cortex-m4"
},
{
"path": "boards/mesh-tab.json",
"chars": 1108,
"preview": "{\n \"build\": {\n \"arduino\": {\n \"ldscript\": \"esp32s3_out.ld\",\n \"partitions\": \"default_16MB.csv\",\n \"memor"
},
{
"path": "boards/meshlink.json",
"chars": 1245,
"preview": "{\n \"build\": {\n \"arduino\": {\n \"ldscript\": \"nrf52840_s140_v6.ld\"\n },\n \"core\": \"nRF5\",\n \"cpu\": \"cortex-m4"
},
{
"path": "boards/meshtiny.json",
"chars": 1258,
"preview": "{\n \"build\": {\n \"arduino\": {\n \"ldscript\": \"nrf52840_s140_v6.ld\"\n },\n \"core\": \"nRF5\",\n \"cpu\": \"cortex-m4"
},
{
"path": "boards/mini-epaper-s3.json",
"chars": 993,
"preview": "{\n \"build\": {\n \"arduino\": {\n \"ldscript\": \"esp32s3_out.ld\",\n \"partitions\": \"default.csv\"\n },\n \"core\":"
},
{
"path": "boards/minimesh_lite.json",
"chars": 1217,
"preview": "{\n \"build\": {\n \"arduino\": {\n \"ldscript\": \"nrf52840_s140_v6.ld\"\n },\n \"core\": \"nRF5\",\n \"cpu\": \"cortex-m4"
}
]
// ... and 1372 more files (download for full content)
About this extraction
This page contains the full source code of the meshtastic/firmware GitHub repository, extracted and formatted as plain text for AI agents and large language models (LLMs). The extraction includes 1572 files (9.3 MB), approximately 2.5M tokens, and a symbol index with 2514 extracted functions, classes, methods, constants, and types. Use this with OpenClaw, Claude, ChatGPT, Cursor, Windsurf, or any other AI tool that accepts text input. You can copy the full output to your clipboard or download it as a .txt file.
Extracted by GitExtract — free GitHub repo to text converter for AI. Built by Nikandr Surkov.