mirror of
https://github.com/meshtastic/firmware.git
synced 2026-01-17 15:27:29 +00:00
Compare commits
11 Commits
adaptive-c
...
buzzer-fix
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
978922296b | ||
|
|
01ed5041df | ||
|
|
71eddb2d29 | ||
|
|
6e110788fd | ||
|
|
86326f294d | ||
|
|
fb7af18f4f | ||
|
|
4d303c95d1 | ||
|
|
1a6cbb5caa | ||
|
|
70f909d718 | ||
|
|
9c1d55c844 | ||
|
|
ba9d0e6fa3 |
@@ -1,43 +0,0 @@
|
|||||||
# Minimal container to run PlatformIO native/portduino tests
|
|
||||||
FROM ubuntu:22.04
|
|
||||||
|
|
||||||
ENV DEBIAN_FRONTEND=noninteractive
|
|
||||||
|
|
||||||
RUN apt-get update \
|
|
||||||
&& apt-get install -y --no-install-recommends \
|
|
||||||
python3 \
|
|
||||||
python3-pip \
|
|
||||||
git \
|
|
||||||
build-essential \
|
|
||||||
cmake \
|
|
||||||
pkg-config \
|
|
||||||
libssl-dev \
|
|
||||||
libncurses5 \
|
|
||||||
libsdl2-dev \
|
|
||||||
libx11-dev \
|
|
||||||
libxext-dev \
|
|
||||||
libusb-1.0-0-dev \
|
|
||||||
libyaml-cpp-dev \
|
|
||||||
libuv1-dev \
|
|
||||||
libgpiod-dev \
|
|
||||||
libbluetooth-dev \
|
|
||||||
libulfius-dev \
|
|
||||||
liborcania-dev \
|
|
||||||
libmicrohttpd-dev \
|
|
||||||
libjansson-dev \
|
|
||||||
libgnutls28-dev \
|
|
||||||
libcurl4-gnutls-dev \
|
|
||||||
libi2c-dev \
|
|
||||||
openssl \
|
|
||||||
lsb-release \
|
|
||||||
cppcheck \
|
|
||||||
uuid-dev \
|
|
||||||
zlib1g-dev \
|
|
||||||
libbsd-dev \
|
|
||||||
gdb \
|
|
||||||
&& pip3 install --no-cache-dir platformio \
|
|
||||||
&& rm -rf /var/lib/apt/lists/*
|
|
||||||
|
|
||||||
WORKDIR /workspace
|
|
||||||
|
|
||||||
CMD ["bash"]
|
|
||||||
@@ -38,4 +38,4 @@ cp bin/device-install.* $OUTDIR/
|
|||||||
cp bin/device-update.* $OUTDIR/
|
cp bin/device-update.* $OUTDIR/
|
||||||
|
|
||||||
echo "Copying manifest"
|
echo "Copying manifest"
|
||||||
cp $BUILDDIR/$basename.mt.json $OUTDIR/$basename.mt.json
|
cp $BUILDDIR/$basename.mt.json $OUTDIR/$basename.mt.json || true
|
||||||
|
|||||||
@@ -49,4 +49,4 @@ if (echo $1 | grep -q "rak4631"); then
|
|||||||
fi
|
fi
|
||||||
|
|
||||||
echo "Copying manifest"
|
echo "Copying manifest"
|
||||||
cp $BUILDDIR/$basename.mt.json $OUTDIR/$basename.mt.json
|
cp $BUILDDIR/$basename.mt.json $OUTDIR/$basename.mt.json || true
|
||||||
|
|||||||
@@ -30,4 +30,4 @@ echo "Copying uf2 file"
|
|||||||
cp $BUILDDIR/$basename.uf2 $OUTDIR/$basename.uf2
|
cp $BUILDDIR/$basename.uf2 $OUTDIR/$basename.uf2
|
||||||
|
|
||||||
echo "Copying manifest"
|
echo "Copying manifest"
|
||||||
cp $BUILDDIR/$basename.mt.json $OUTDIR/$basename.mt.json
|
cp $BUILDDIR/$basename.mt.json $OUTDIR/$basename.mt.json || true
|
||||||
|
|||||||
@@ -30,4 +30,4 @@ echo "Copying STM32 bin file"
|
|||||||
cp $BUILDDIR/$basename.bin $OUTDIR/$basename.bin
|
cp $BUILDDIR/$basename.bin $OUTDIR/$basename.bin
|
||||||
|
|
||||||
echo "Copying manifest"
|
echo "Copying manifest"
|
||||||
cp $BUILDDIR/$basename.mt.json $OUTDIR/$basename.mt.json
|
cp $BUILDDIR/$basename.mt.json $OUTDIR/$basename.mt.json || true
|
||||||
|
|||||||
14
bin/config.d/lora-usb-meshstick-1262.yaml
Normal file
14
bin/config.d/lora-usb-meshstick-1262.yaml
Normal file
@@ -0,0 +1,14 @@
|
|||||||
|
Lora:
|
||||||
|
Module: sx1262
|
||||||
|
CS: 0
|
||||||
|
IRQ: 6
|
||||||
|
Reset: 2
|
||||||
|
Busy: 4
|
||||||
|
RXen: 1
|
||||||
|
DIO2_AS_RF_SWITCH: true
|
||||||
|
spidev: ch341
|
||||||
|
DIO3_TCXO_VOLTAGE: true
|
||||||
|
# USB_Serialnum: 12345678
|
||||||
|
USB_PID: 0x5512
|
||||||
|
USB_VID: 0x1A86
|
||||||
|
SX126X_MAX_POWER: 22
|
||||||
@@ -2,11 +2,12 @@
|
|||||||
# trunk-ignore-all(ruff/F821)
|
# trunk-ignore-all(ruff/F821)
|
||||||
# trunk-ignore-all(flake8/F821): For SConstruct imports
|
# trunk-ignore-all(flake8/F821): For SConstruct imports
|
||||||
import sys
|
import sys
|
||||||
from os.path import join, basename, isfile
|
from os.path import join
|
||||||
import subprocess
|
import subprocess
|
||||||
import json
|
import json
|
||||||
import re
|
import re
|
||||||
from datetime import datetime
|
from datetime import datetime
|
||||||
|
from typing import Dict
|
||||||
|
|
||||||
from readprops import readProps
|
from readprops import readProps
|
||||||
|
|
||||||
@@ -14,8 +15,47 @@ Import("env")
|
|||||||
platform = env.PioPlatform()
|
platform = env.PioPlatform()
|
||||||
progname = env.get("PROGNAME")
|
progname = env.get("PROGNAME")
|
||||||
lfsbin = f"{progname.replace('firmware-', 'littlefs-')}.bin"
|
lfsbin = f"{progname.replace('firmware-', 'littlefs-')}.bin"
|
||||||
|
manifest_ran = False
|
||||||
|
|
||||||
|
def infer_architecture(board_cfg):
|
||||||
|
try:
|
||||||
|
mcu = board_cfg.get("build.mcu") if board_cfg else None
|
||||||
|
except KeyError:
|
||||||
|
mcu = None
|
||||||
|
except Exception:
|
||||||
|
mcu = None
|
||||||
|
if not mcu:
|
||||||
|
return None
|
||||||
|
mcu_l = str(mcu).lower()
|
||||||
|
if "esp32s3" in mcu_l:
|
||||||
|
return "esp32-s3"
|
||||||
|
if "esp32c6" in mcu_l:
|
||||||
|
return "esp32-c6"
|
||||||
|
if "esp32c3" in mcu_l:
|
||||||
|
return "esp32-c3"
|
||||||
|
if "esp32" in mcu_l:
|
||||||
|
return "esp32"
|
||||||
|
if "rp2040" in mcu_l:
|
||||||
|
return "rp2040"
|
||||||
|
if "rp2350" in mcu_l:
|
||||||
|
return "rp2350"
|
||||||
|
if "nrf52" in mcu_l or "nrf52840" in mcu_l:
|
||||||
|
return "nrf52840"
|
||||||
|
if "stm32" in mcu_l:
|
||||||
|
return "stm32"
|
||||||
|
return None
|
||||||
|
|
||||||
def manifest_gather(source, target, env):
|
def manifest_gather(source, target, env):
|
||||||
|
global manifest_ran
|
||||||
|
if manifest_ran:
|
||||||
|
return
|
||||||
|
# Skip manifest generation if we cannot determine architecture (host/native builds)
|
||||||
|
board_arch = infer_architecture(env.BoardConfig())
|
||||||
|
if not board_arch:
|
||||||
|
print(f"Skipping mtjson generation for unknown architecture (env={env.get('PIOENV')})")
|
||||||
|
manifest_ran = True
|
||||||
|
return
|
||||||
|
manifest_ran = True
|
||||||
out = []
|
out = []
|
||||||
board_platform = env.BoardConfig().get("platform")
|
board_platform = env.BoardConfig().get("platform")
|
||||||
needs_ota_suffix = board_platform == "nordicnrf52"
|
needs_ota_suffix = board_platform == "nordicnrf52"
|
||||||
@@ -47,14 +87,39 @@ def manifest_gather(source, target, env):
|
|||||||
manifest_write(out, env)
|
manifest_write(out, env)
|
||||||
|
|
||||||
def manifest_write(files, env):
|
def manifest_write(files, env):
|
||||||
|
# Defensive: also skip manifest writing if we cannot determine architecture
|
||||||
|
def get_project_option(name):
|
||||||
|
try:
|
||||||
|
return env.GetProjectOption(name)
|
||||||
|
except Exception:
|
||||||
|
return None
|
||||||
|
|
||||||
|
def get_project_option_any(names):
|
||||||
|
for name in names:
|
||||||
|
val = get_project_option(name)
|
||||||
|
if val is not None:
|
||||||
|
return val
|
||||||
|
return None
|
||||||
|
|
||||||
|
def as_bool(val):
|
||||||
|
return str(val).strip().lower() in ("1", "true", "yes", "on")
|
||||||
|
|
||||||
|
def as_int(val):
|
||||||
|
try:
|
||||||
|
return int(str(val), 10)
|
||||||
|
except (TypeError, ValueError):
|
||||||
|
return None
|
||||||
|
|
||||||
|
def as_list(val):
|
||||||
|
return [item.strip() for item in str(val).split(",") if item.strip()]
|
||||||
|
|
||||||
manifest = {
|
manifest = {
|
||||||
"version": verObj["long"],
|
"version": verObj["long"],
|
||||||
"build_epoch": build_epoch,
|
"build_epoch": build_epoch,
|
||||||
"board": env.get("PIOENV"),
|
"platformioTarget": env.get("PIOENV"),
|
||||||
"mcu": env.get("BOARD_MCU"),
|
"mcu": env.get("BOARD_MCU"),
|
||||||
"repo": repo_owner,
|
"repo": repo_owner,
|
||||||
"files": files,
|
"files": files,
|
||||||
"part": None,
|
|
||||||
"has_mui": False,
|
"has_mui": False,
|
||||||
"has_inkhud": False,
|
"has_inkhud": False,
|
||||||
}
|
}
|
||||||
@@ -69,6 +134,51 @@ def manifest_write(files, env):
|
|||||||
if "MESHTASTIC_INCLUDE_INKHUD" in env.get("CPPDEFINES", []):
|
if "MESHTASTIC_INCLUDE_INKHUD" in env.get("CPPDEFINES", []):
|
||||||
manifest["has_inkhud"] = True
|
manifest["has_inkhud"] = True
|
||||||
|
|
||||||
|
pioenv = env.get("PIOENV")
|
||||||
|
device_meta = {}
|
||||||
|
device_meta_fields = [
|
||||||
|
("hwModel", ["custom_meshtastic_hw_model"], as_int),
|
||||||
|
("hwModelSlug", ["custom_meshtastic_hw_model_slug"], str),
|
||||||
|
("architecture", ["custom_meshtastic_architecture"], str),
|
||||||
|
("activelySupported", ["custom_meshtastic_actively_supported"], as_bool),
|
||||||
|
("displayName", ["custom_meshtastic_display_name"], str),
|
||||||
|
("supportLevel", ["custom_meshtastic_support_level"], as_int),
|
||||||
|
("images", ["custom_meshtastic_images"], as_list),
|
||||||
|
("tags", ["custom_meshtastic_tags"], as_list),
|
||||||
|
("requiresDfu", ["custom_meshtastic_requires_dfu"], as_bool),
|
||||||
|
("partitionScheme", ["custom_meshtastic_partition_scheme"], str),
|
||||||
|
("url", ["custom_meshtastic_url"], str),
|
||||||
|
("key", ["custom_meshtastic_key"], str),
|
||||||
|
("variant", ["custom_meshtastic_variant"], str),
|
||||||
|
]
|
||||||
|
|
||||||
|
|
||||||
|
for manifest_key, option_keys, caster in device_meta_fields:
|
||||||
|
raw_val = get_project_option_any(option_keys)
|
||||||
|
if raw_val is None:
|
||||||
|
continue
|
||||||
|
parsed = caster(raw_val) if callable(caster) else raw_val
|
||||||
|
if parsed is not None and parsed != "":
|
||||||
|
device_meta[manifest_key] = parsed
|
||||||
|
|
||||||
|
# Determine architecture once; if we can't infer it, skip manifest generation
|
||||||
|
board_arch = device_meta.get("architecture") or infer_architecture(env.BoardConfig())
|
||||||
|
if not board_arch:
|
||||||
|
print(f"Skipping mtjson write for unknown architecture (env={env.get('PIOENV')})")
|
||||||
|
return
|
||||||
|
|
||||||
|
device_meta["architecture"] = board_arch
|
||||||
|
|
||||||
|
# Always set requiresDfu: true for nrf52840 targets
|
||||||
|
if board_arch == "nrf52840":
|
||||||
|
device_meta["requiresDfu"] = True
|
||||||
|
|
||||||
|
device_meta.setdefault("displayName", pioenv)
|
||||||
|
device_meta.setdefault("activelySupported", False)
|
||||||
|
|
||||||
|
if device_meta:
|
||||||
|
manifest.update(device_meta)
|
||||||
|
|
||||||
# Write the manifest to the build directory
|
# Write the manifest to the build directory
|
||||||
with open(env.subst("$BUILD_DIR/${PROGNAME}.mt.json"), "w") as f:
|
with open(env.subst("$BUILD_DIR/${PROGNAME}.mt.json"), "w") as f:
|
||||||
json.dump(manifest, f, indent=2)
|
json.dump(manifest, f, indent=2)
|
||||||
@@ -166,8 +276,12 @@ def load_boot_logo(source, target, env):
|
|||||||
if ("HAS_TFT", 1) in env.get("CPPDEFINES", []):
|
if ("HAS_TFT", 1) in env.get("CPPDEFINES", []):
|
||||||
env.AddPreAction(f"$BUILD_DIR/{lfsbin}", load_boot_logo)
|
env.AddPreAction(f"$BUILD_DIR/{lfsbin}", load_boot_logo)
|
||||||
|
|
||||||
mtjson_deps = ["buildprog"]
|
board_arch = infer_architecture(env.BoardConfig())
|
||||||
if platform.name == "espressif32":
|
should_skip_manifest = board_arch is None
|
||||||
|
|
||||||
|
# For host/native envs, avoid depending on 'buildprog' (some targets don't define it)
|
||||||
|
mtjson_deps = [] if should_skip_manifest else ["buildprog"]
|
||||||
|
if not should_skip_manifest and platform.name == "espressif32":
|
||||||
# Build littlefs image as part of mtjson target
|
# Build littlefs image as part of mtjson target
|
||||||
# Equivalent to `pio run -t buildfs`
|
# Equivalent to `pio run -t buildfs`
|
||||||
target_lfs = env.DataToBin(
|
target_lfs = env.DataToBin(
|
||||||
@@ -175,11 +289,27 @@ if platform.name == "espressif32":
|
|||||||
)
|
)
|
||||||
mtjson_deps.append(target_lfs)
|
mtjson_deps.append(target_lfs)
|
||||||
|
|
||||||
env.AddCustomTarget(
|
if should_skip_manifest:
|
||||||
name="mtjson",
|
def skip_manifest(source, target, env):
|
||||||
dependencies=mtjson_deps,
|
print(f"mtjson: skipped for native environment: {env.get('PIOENV')}")
|
||||||
actions=[manifest_gather],
|
|
||||||
title="Meshtastic Manifest",
|
env.AddCustomTarget(
|
||||||
description="Generating Meshtastic manifest JSON + Checksums",
|
name="mtjson",
|
||||||
always_build=False,
|
dependencies=mtjson_deps,
|
||||||
)
|
actions=[skip_manifest],
|
||||||
|
title="Meshtastic Manifest (skipped)",
|
||||||
|
description="mtjson generation is skipped for native environments",
|
||||||
|
always_build=True,
|
||||||
|
)
|
||||||
|
else:
|
||||||
|
env.AddCustomTarget(
|
||||||
|
name="mtjson",
|
||||||
|
dependencies=mtjson_deps,
|
||||||
|
actions=[manifest_gather],
|
||||||
|
title="Meshtastic Manifest",
|
||||||
|
description="Generating Meshtastic manifest JSON + Checksums",
|
||||||
|
always_build=True,
|
||||||
|
)
|
||||||
|
|
||||||
|
# Run manifest generation as part of the default build pipeline for non-native builds.
|
||||||
|
env.Default("mtjson")
|
||||||
|
|||||||
@@ -18,8 +18,9 @@ def readProps(prefsLoc):
|
|||||||
|
|
||||||
# Try to find current build SHA if if the workspace is clean. This could fail if git is not installed
|
# Try to find current build SHA if if the workspace is clean. This could fail if git is not installed
|
||||||
try:
|
try:
|
||||||
|
# Pin abbreviation length to keep local builds and CI matching (avoid auto-shortening)
|
||||||
sha = (
|
sha = (
|
||||||
subprocess.check_output(["git", "rev-parse", "--short", "HEAD"])
|
subprocess.check_output(["git", "rev-parse", "--short=7", "HEAD"])
|
||||||
.decode("utf-8")
|
.decode("utf-8")
|
||||||
.strip()
|
.strip()
|
||||||
)
|
)
|
||||||
|
|||||||
@@ -22,15 +22,19 @@ int BuzzerFeedbackThread::handleInputEvent(const InputEvent *event)
|
|||||||
|
|
||||||
// Handle different input events with appropriate buzzer feedback
|
// Handle different input events with appropriate buzzer feedback
|
||||||
switch (event->inputEvent) {
|
switch (event->inputEvent) {
|
||||||
case INPUT_BROKER_USER_PRESS:
|
#ifdef INPUTDRIVER_ENCODER_TYPE
|
||||||
case INPUT_BROKER_ALT_PRESS:
|
|
||||||
playClick(); // Low delay feedback
|
|
||||||
break;
|
|
||||||
|
|
||||||
case INPUT_BROKER_SELECT:
|
case INPUT_BROKER_SELECT:
|
||||||
case INPUT_BROKER_SELECT_LONG:
|
case INPUT_BROKER_SELECT_LONG:
|
||||||
playBeep(); // Confirmation feedback
|
playClick();
|
||||||
break;
|
break;
|
||||||
|
#else
|
||||||
|
case INPUT_BROKER_USER_PRESS:
|
||||||
|
case INPUT_BROKER_ALT_PRESS:
|
||||||
|
case INPUT_BROKER_SELECT:
|
||||||
|
case INPUT_BROKER_SELECT_LONG:
|
||||||
|
playBeep();
|
||||||
|
break;
|
||||||
|
#endif
|
||||||
|
|
||||||
case INPUT_BROKER_UP:
|
case INPUT_BROKER_UP:
|
||||||
case INPUT_BROKER_UP_LONG:
|
case INPUT_BROKER_UP_LONG:
|
||||||
|
|||||||
@@ -65,7 +65,7 @@ void playTones(const ToneDuration *tone_durations, int size)
|
|||||||
|
|
||||||
void playBeep()
|
void playBeep()
|
||||||
{
|
{
|
||||||
ToneDuration melody[] = {{NOTE_B3, DURATION_1_8}};
|
ToneDuration melody[] = {{NOTE_B3, DURATION_1_16}};
|
||||||
playTones(melody, sizeof(melody) / sizeof(ToneDuration));
|
playTones(melody, sizeof(melody) / sizeof(ToneDuration));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -487,7 +487,7 @@ void ScanI2CTwoWire::scanPort(I2CPort port, uint8_t *address, uint8_t asize)
|
|||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case TSL25911_ADDR:
|
case TSL25911_ADDR:
|
||||||
registerValue = getRegisterValue(ScanI2CTwoWire::RegisterLocation(addr, 0x12), 1);
|
registerValue = getRegisterValue(ScanI2CTwoWire::RegisterLocation(addr, 0xA0 | 0x12), 1);
|
||||||
if (registerValue == 0x50) {
|
if (registerValue == 0x50) {
|
||||||
type = TSL2591;
|
type = TSL2591;
|
||||||
logFoundDevice("TSL25911", (uint8_t)addr.address);
|
logFoundDevice("TSL25911", (uint8_t)addr.address);
|
||||||
|
|||||||
@@ -449,13 +449,14 @@ void menuHandler::clockMenu()
|
|||||||
}
|
}
|
||||||
void menuHandler::messageResponseMenu()
|
void menuHandler::messageResponseMenu()
|
||||||
{
|
{
|
||||||
enum optionsNumbers { Back = 0, ViewMode, DeleteAll, DeleteOldest, ReplyMenu, Aloud, enumEnd };
|
enum optionsNumbers { Back = 0, ViewMode, DeleteAll, DeleteOldest, ReplyMenu, MuteChannel, Aloud, enumEnd };
|
||||||
|
|
||||||
static const char *optionsArray[enumEnd];
|
static const char *optionsArray[enumEnd];
|
||||||
static int optionsEnumArray[enumEnd];
|
static int optionsEnumArray[enumEnd];
|
||||||
int options = 0;
|
int options = 0;
|
||||||
|
|
||||||
auto mode = graphics::MessageRenderer::getThreadMode();
|
auto mode = graphics::MessageRenderer::getThreadMode();
|
||||||
|
int threadChannel = graphics::MessageRenderer::getThreadChannel();
|
||||||
|
|
||||||
optionsArray[options] = "Back";
|
optionsArray[options] = "Back";
|
||||||
optionsEnumArray[options++] = Back;
|
optionsEnumArray[options++] = Back;
|
||||||
@@ -467,6 +468,15 @@ void menuHandler::messageResponseMenu()
|
|||||||
optionsArray[options] = "View Chats";
|
optionsArray[options] = "View Chats";
|
||||||
optionsEnumArray[options++] = ViewMode;
|
optionsEnumArray[options++] = ViewMode;
|
||||||
|
|
||||||
|
// If viewing ALL chats, hide “Mute Chat”
|
||||||
|
if (mode != graphics::MessageRenderer::ThreadMode::ALL && mode != graphics::MessageRenderer::ThreadMode::DIRECT) {
|
||||||
|
const uint8_t chIndex = (threadChannel != 0) ? (uint8_t)threadChannel : channels.getPrimaryIndex();
|
||||||
|
auto &chan = channels.getByIndex(chIndex);
|
||||||
|
|
||||||
|
optionsArray[options] = chan.settings.module_settings.is_muted ? "Unmute Channel" : "Mute Channel";
|
||||||
|
optionsEnumArray[options++] = MuteChannel;
|
||||||
|
}
|
||||||
|
|
||||||
// Delete submenu
|
// Delete submenu
|
||||||
optionsArray[options] = "Delete";
|
optionsArray[options] = "Delete";
|
||||||
optionsEnumArray[options++] = 900;
|
optionsEnumArray[options++] = 900;
|
||||||
@@ -502,6 +512,14 @@ void menuHandler::messageResponseMenu()
|
|||||||
menuHandler::menuQueue = menuHandler::reply_menu;
|
menuHandler::menuQueue = menuHandler::reply_menu;
|
||||||
screen->runNow();
|
screen->runNow();
|
||||||
|
|
||||||
|
} else if (selected == MuteChannel) {
|
||||||
|
const uint8_t chIndex = (ch != 0) ? (uint8_t)ch : channels.getPrimaryIndex();
|
||||||
|
auto &chan = channels.getByIndex(chIndex);
|
||||||
|
if (chan.settings.has_module_settings) {
|
||||||
|
chan.settings.module_settings.is_muted = !chan.settings.module_settings.is_muted;
|
||||||
|
nodeDB->saveToDisk();
|
||||||
|
}
|
||||||
|
|
||||||
// Delete submenu
|
// Delete submenu
|
||||||
} else if (selected == 900) {
|
} else if (selected == 900) {
|
||||||
menuHandler::menuQueue = menuHandler::delete_messages_menu;
|
menuHandler::menuQueue = menuHandler::delete_messages_menu;
|
||||||
|
|||||||
@@ -4,6 +4,7 @@
|
|||||||
#include "configuration.h"
|
#include "configuration.h"
|
||||||
#include "mesh-pb-constants.h"
|
#include "mesh-pb-constants.h"
|
||||||
#include "meshUtils.h"
|
#include "meshUtils.h"
|
||||||
|
#include "modules/TextMessageModule.h"
|
||||||
#if !MESHTASTIC_EXCLUDE_TRACEROUTE
|
#if !MESHTASTIC_EXCLUDE_TRACEROUTE
|
||||||
#include "modules/TraceRouteModule.h"
|
#include "modules/TraceRouteModule.h"
|
||||||
#endif
|
#endif
|
||||||
@@ -35,6 +36,10 @@ bool FloodingRouter::shouldFilterReceived(const meshtastic_MeshPacket *p)
|
|||||||
return true; // we handled it, so stop processing
|
return true; // we handled it, so stop processing
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (!seenRecently && !wasUpgraded && textMessageModule) {
|
||||||
|
seenRecently = textMessageModule->recentlySeen(p->id);
|
||||||
|
}
|
||||||
|
|
||||||
if (seenRecently) {
|
if (seenRecently) {
|
||||||
printPacket("Ignore dupe incoming msg", p);
|
printPacket("Ignore dupe incoming msg", p);
|
||||||
rxDupe++;
|
rxDupe++;
|
||||||
|
|||||||
@@ -238,12 +238,6 @@ bool NextHopRouter::stopRetransmission(GlobalPacketId key)
|
|||||||
// call to startRetransmission.
|
// call to startRetransmission.
|
||||||
packetPool.release(p);
|
packetPool.release(p);
|
||||||
|
|
||||||
#ifdef USE_ADAPTIVE_CODING_RATE
|
|
||||||
if (iface) {
|
|
||||||
iface->clearAdaptiveCodingRateState(getFrom(p), p->id);
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
} else
|
} else
|
||||||
return false;
|
return false;
|
||||||
|
|||||||
@@ -246,7 +246,8 @@ uint32_t RadioInterface::getPacketTime(const meshtastic_MeshPacket *p, bool rece
|
|||||||
/** The delay to use for retransmitting dropped packets */
|
/** The delay to use for retransmitting dropped packets */
|
||||||
uint32_t RadioInterface::getRetransmissionMsec(const meshtastic_MeshPacket *p)
|
uint32_t RadioInterface::getRetransmissionMsec(const meshtastic_MeshPacket *p)
|
||||||
{
|
{
|
||||||
size_t numbytes = pb_encode_to_bytes(bytes, sizeof(bytes), &meshtastic_Data_msg, &p->decoded);
|
size_t numbytes =p->which_payload_variant == meshtastic_MeshPacket_decoded_tag ?
|
||||||
|
pb_encode_to_bytes(bytes, sizeof(bytes), &meshtastic_Data_msg, &p->decoded) : p->encrypted.size+MESHTASTIC_HEADER_LENGTH;
|
||||||
uint32_t packetAirtime = getPacketTime(numbytes + sizeof(PacketHeader));
|
uint32_t packetAirtime = getPacketTime(numbytes + sizeof(PacketHeader));
|
||||||
// Make sure enough time has elapsed for this packet to be sent and an ACK is received.
|
// Make sure enough time has elapsed for this packet to be sent and an ACK is received.
|
||||||
// LOG_DEBUG("Waiting for flooding message with airtime %d and slotTime is %d", packetAirtime, slotTimeMsec);
|
// LOG_DEBUG("Waiting for flooding message with airtime %d and slotTime is %d", packetAirtime, slotTimeMsec);
|
||||||
@@ -618,13 +619,6 @@ void RadioInterface::applyModemConfig()
|
|||||||
slotTimeMsec = computeSlotTimeMsec();
|
slotTimeMsec = computeSlotTimeMsec();
|
||||||
preambleTimeMsec = preambleLength * (pow_of_2(sf) / bw);
|
preambleTimeMsec = preambleLength * (pow_of_2(sf) / bw);
|
||||||
|
|
||||||
#ifdef USE_ADAPTIVE_CODING_RATE
|
|
||||||
if (adaptiveCrOverride >= 5 && adaptiveCrOverride <= 8 && cr != adaptiveCrOverride) {
|
|
||||||
cr = adaptiveCrOverride;
|
|
||||||
LOG_DEBUG("Adaptive coding rate override set to %u", cr);
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
LOG_INFO("Radio freq=%.3f, config.lora.frequency_offset=%.3f", freq, loraConfig.frequency_offset);
|
LOG_INFO("Radio freq=%.3f, config.lora.frequency_offset=%.3f", freq, loraConfig.frequency_offset);
|
||||||
LOG_INFO("Set radio: region=%s, name=%s, config=%u, ch=%d, power=%d", myRegion->name, channelName, loraConfig.modem_preset,
|
LOG_INFO("Set radio: region=%s, name=%s, config=%u, ch=%d, power=%d", myRegion->name, channelName, loraConfig.modem_preset,
|
||||||
channel_num, power);
|
channel_num, power);
|
||||||
@@ -737,70 +731,3 @@ size_t RadioInterface::beginSending(meshtastic_MeshPacket *p)
|
|||||||
sendingPacket = p;
|
sendingPacket = p;
|
||||||
return p->encrypted.size + sizeof(PacketHeader);
|
return p->encrypted.size + sizeof(PacketHeader);
|
||||||
}
|
}
|
||||||
|
|
||||||
#ifdef USE_ADAPTIVE_CODING_RATE
|
|
||||||
uint8_t RadioInterface::computeAdaptiveCodingRate(uint8_t attempt) const
|
|
||||||
{
|
|
||||||
if (attempt <= 1) {
|
|
||||||
return 5; // Attempt 1: 4/5
|
|
||||||
}
|
|
||||||
if (attempt == 2) {
|
|
||||||
return 7; // Attempt 2: 4/7
|
|
||||||
}
|
|
||||||
return 8; // Attempt 3+: 4/8
|
|
||||||
}
|
|
||||||
|
|
||||||
uint64_t RadioInterface::adaptiveKey(NodeNum from, PacketId id) const
|
|
||||||
{
|
|
||||||
return (static_cast<uint64_t>(from) << 32) | id;
|
|
||||||
}
|
|
||||||
|
|
||||||
void RadioInterface::pruneAdaptiveAttempts(uint32_t now)
|
|
||||||
{
|
|
||||||
const uint32_t expiryMsec = 5 * 60 * 1000UL; // drop state after 5 minutes
|
|
||||||
for (auto it = adaptiveAttempts.begin(); it != adaptiveAttempts.end();) {
|
|
||||||
if (now - it->second.lastUseMsec > expiryMsec) {
|
|
||||||
it = adaptiveAttempts.erase(it);
|
|
||||||
} else {
|
|
||||||
++it;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
uint8_t RadioInterface::recordAdaptiveAttempt(const meshtastic_MeshPacket *p)
|
|
||||||
{
|
|
||||||
const uint32_t now = millis();
|
|
||||||
pruneAdaptiveAttempts(now);
|
|
||||||
|
|
||||||
const uint64_t key = adaptiveKey(getFrom(p), p->id);
|
|
||||||
auto &state = adaptiveAttempts[key];
|
|
||||||
if (state.attempts < UINT8_MAX) {
|
|
||||||
state.attempts++;
|
|
||||||
}
|
|
||||||
state.lastUseMsec = now;
|
|
||||||
return state.attempts;
|
|
||||||
}
|
|
||||||
|
|
||||||
bool RadioInterface::applyAdaptiveCodingRate(const meshtastic_MeshPacket *p)
|
|
||||||
{
|
|
||||||
const uint8_t attempt = recordAdaptiveAttempt(p);
|
|
||||||
const uint8_t desiredCr = computeAdaptiveCodingRate(attempt);
|
|
||||||
if (desiredCr < 5 || desiredCr > 8) {
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
adaptiveCrOverride = desiredCr;
|
|
||||||
if (cr != desiredCr) {
|
|
||||||
cr = desiredCr;
|
|
||||||
reconfigure();
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
void RadioInterface::clearAdaptiveCodingRateState(NodeNum from, PacketId id)
|
|
||||||
{
|
|
||||||
adaptiveAttempts.erase(adaptiveKey(from, id));
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|||||||
@@ -6,9 +6,6 @@
|
|||||||
#include "PointerQueue.h"
|
#include "PointerQueue.h"
|
||||||
#include "airtime.h"
|
#include "airtime.h"
|
||||||
#include "error.h"
|
#include "error.h"
|
||||||
#ifdef USE_ADAPTIVE_CODING_RATE
|
|
||||||
#include <unordered_map>
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#define MAX_TX_QUEUE 16 // max number of packets which can be waiting for transmission
|
#define MAX_TX_QUEUE 16 // max number of packets which can be waiting for transmission
|
||||||
|
|
||||||
@@ -223,11 +220,6 @@ class RadioInterface
|
|||||||
// Whether we use the default frequency slot given our LoRa config (region and modem preset)
|
// Whether we use the default frequency slot given our LoRa config (region and modem preset)
|
||||||
static bool uses_default_frequency_slot;
|
static bool uses_default_frequency_slot;
|
||||||
|
|
||||||
#ifdef USE_ADAPTIVE_CODING_RATE
|
|
||||||
/** Clear adaptive coding rate tracking for a completed packet id */
|
|
||||||
void clearAdaptiveCodingRateState(NodeNum from, PacketId id);
|
|
||||||
#endif
|
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
int8_t power = 17; // Set by applyModemConfig()
|
int8_t power = 17; // Set by applyModemConfig()
|
||||||
|
|
||||||
@@ -258,20 +250,6 @@ class RadioInterface
|
|||||||
*/
|
*/
|
||||||
virtual void saveChannelNum(uint32_t savedChannelNum);
|
virtual void saveChannelNum(uint32_t savedChannelNum);
|
||||||
|
|
||||||
#ifdef USE_ADAPTIVE_CODING_RATE
|
|
||||||
bool applyAdaptiveCodingRate(const meshtastic_MeshPacket *p);
|
|
||||||
struct AdaptiveAttemptState {
|
|
||||||
uint8_t attempts = 0;
|
|
||||||
uint32_t lastUseMsec = 0;
|
|
||||||
};
|
|
||||||
std::unordered_map<uint64_t, AdaptiveAttemptState> adaptiveAttempts;
|
|
||||||
uint8_t adaptiveCrOverride = 0;
|
|
||||||
uint8_t recordAdaptiveAttempt(const meshtastic_MeshPacket *p);
|
|
||||||
uint8_t computeAdaptiveCodingRate(uint8_t attempt) const;
|
|
||||||
void pruneAdaptiveAttempts(uint32_t now);
|
|
||||||
uint64_t adaptiveKey(NodeNum from, PacketId id) const;
|
|
||||||
#endif
|
|
||||||
|
|
||||||
private:
|
private:
|
||||||
/**
|
/**
|
||||||
* Convert our modemConfig enum into wf, sf, etc...
|
* Convert our modemConfig enum into wf, sf, etc...
|
||||||
|
|||||||
@@ -540,9 +540,6 @@ bool RadioLibInterface::startSend(meshtastic_MeshPacket *txp)
|
|||||||
packetPool.release(txp);
|
packetPool.release(txp);
|
||||||
return false;
|
return false;
|
||||||
} else {
|
} else {
|
||||||
#ifdef USE_ADAPTIVE_CODING_RATE
|
|
||||||
applyAdaptiveCodingRate(txp);
|
|
||||||
#endif
|
|
||||||
configHardwareForSend(); // must be after setStandby
|
configHardwareForSend(); // must be after setStandby
|
||||||
|
|
||||||
size_t numbytes = beginSending(txp);
|
size_t numbytes = beginSending(txp);
|
||||||
|
|||||||
@@ -53,13 +53,21 @@ template <typename T> bool SX126xInterface<T>::init()
|
|||||||
#endif
|
#endif
|
||||||
|
|
||||||
#if defined(USE_GC1109_PA)
|
#if defined(USE_GC1109_PA)
|
||||||
|
// GC1109 FEM chip initialization
|
||||||
|
// See variant.h for full pin mapping and control logic documentation
|
||||||
|
|
||||||
|
// VFEM_Ctrl (LORA_PA_POWER): Power enable for GC1109 LDO (always on)
|
||||||
pinMode(LORA_PA_POWER, OUTPUT);
|
pinMode(LORA_PA_POWER, OUTPUT);
|
||||||
digitalWrite(LORA_PA_POWER, HIGH);
|
digitalWrite(LORA_PA_POWER, HIGH);
|
||||||
|
|
||||||
|
// CSD (LORA_PA_EN): Chip enable - must be HIGH to enable GC1109 for both RX and TX
|
||||||
pinMode(LORA_PA_EN, OUTPUT);
|
pinMode(LORA_PA_EN, OUTPUT);
|
||||||
digitalWrite(LORA_PA_EN, LOW);
|
digitalWrite(LORA_PA_EN, HIGH);
|
||||||
|
|
||||||
|
// CPS (LORA_PA_TX_EN): PA mode select - HIGH enables full PA during TX, LOW for RX (don't care)
|
||||||
|
// Note: TX/RX path switching (CTX) is handled by DIO2 via SX126X_DIO2_AS_RF_SWITCH
|
||||||
pinMode(LORA_PA_TX_EN, OUTPUT);
|
pinMode(LORA_PA_TX_EN, OUTPUT);
|
||||||
digitalWrite(LORA_PA_TX_EN, LOW);
|
digitalWrite(LORA_PA_TX_EN, LOW); // Start in RX-ready state
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifdef RF95_FAN_EN
|
#ifdef RF95_FAN_EN
|
||||||
@@ -377,13 +385,13 @@ template <typename T> bool SX126xInterface<T>::sleep()
|
|||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
/** Some boards require GPIO control of tx vs rx paths */
|
/** Control PA mode for GC1109 FEM - CPS pin selects full PA (txon=true) or bypass mode (txon=false) */
|
||||||
template <typename T> void SX126xInterface<T>::setTransmitEnable(bool txon)
|
template <typename T> void SX126xInterface<T>::setTransmitEnable(bool txon)
|
||||||
{
|
{
|
||||||
#if defined(USE_GC1109_PA)
|
#if defined(USE_GC1109_PA)
|
||||||
digitalWrite(LORA_PA_POWER, HIGH);
|
digitalWrite(LORA_PA_POWER, HIGH); // Ensure LDO is on
|
||||||
digitalWrite(LORA_PA_EN, HIGH);
|
digitalWrite(LORA_PA_EN, HIGH); // CSD=1: Chip enabled
|
||||||
digitalWrite(LORA_PA_TX_EN, txon ? 1 : 0);
|
digitalWrite(LORA_PA_TX_EN, txon ? 1 : 0); // CPS: 1=full PA, 0=bypass (for RX, CPS is don't care)
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -45,9 +45,9 @@ int SystemCommandsModule::handleInputEvent(const InputEvent *event)
|
|||||||
// Mute
|
// Mute
|
||||||
case INPUT_BROKER_MSG_MUTE_TOGGLE:
|
case INPUT_BROKER_MSG_MUTE_TOGGLE:
|
||||||
if (moduleConfig.external_notification.enabled && externalNotificationModule) {
|
if (moduleConfig.external_notification.enabled && externalNotificationModule) {
|
||||||
externalNotificationModule->setMute(externalNotificationModule->getMute());
|
externalNotificationModule->setMute(!externalNotificationModule->getMute());
|
||||||
IF_SCREEN(if (!externalNotificationModule->getMute()) externalNotificationModule->stopNow(); screen->showSimpleBanner(
|
IF_SCREEN(if (!externalNotificationModule->getMute()) externalNotificationModule->stopNow(); screen->showSimpleBanner(
|
||||||
externalNotificationModule->getMute() ? "Notifications\nEnabled" : "Notifications\nDisabled", 3000);)
|
externalNotificationModule->getMute() ? "Notifications\nDisabled" : "Notifications\nEnabled", 3000);)
|
||||||
}
|
}
|
||||||
return 0;
|
return 0;
|
||||||
// Bluetooth
|
// Bluetooth
|
||||||
|
|||||||
@@ -17,6 +17,9 @@ ProcessMessage TextMessageModule::handleReceived(const meshtastic_MeshPacket &mp
|
|||||||
auto &p = mp.decoded;
|
auto &p = mp.decoded;
|
||||||
LOG_INFO("Received text msg from=0x%0x, id=0x%x, msg=%.*s", mp.from, mp.id, p.payload.size, p.payload.bytes);
|
LOG_INFO("Received text msg from=0x%0x, id=0x%x, msg=%.*s", mp.from, mp.id, p.payload.size, p.payload.bytes);
|
||||||
#endif
|
#endif
|
||||||
|
// add packet ID to the rolling list of packets
|
||||||
|
textPacketList[textPacketListIndex] = mp.id;
|
||||||
|
textPacketListIndex = (textPacketListIndex + 1) % TEXT_PACKET_LIST_SIZE;
|
||||||
|
|
||||||
// We only store/display messages destined for us.
|
// We only store/display messages destined for us.
|
||||||
devicestate.rx_text_message = mp;
|
devicestate.rx_text_message = mp;
|
||||||
@@ -47,3 +50,13 @@ bool TextMessageModule::wantPacket(const meshtastic_MeshPacket *p)
|
|||||||
{
|
{
|
||||||
return MeshService::isTextPayload(p);
|
return MeshService::isTextPayload(p);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool TextMessageModule::recentlySeen(uint32_t id)
|
||||||
|
{
|
||||||
|
for (size_t i = 0; i < TEXT_PACKET_LIST_SIZE; i++) {
|
||||||
|
if (textPacketList[i] != 0 && textPacketList[i] == id) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
@@ -1,6 +1,7 @@
|
|||||||
#pragma once
|
#pragma once
|
||||||
#include "Observer.h"
|
#include "Observer.h"
|
||||||
#include "SinglePortModule.h"
|
#include "SinglePortModule.h"
|
||||||
|
#define TEXT_PACKET_LIST_SIZE 50
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Text message handling for Meshtastic.
|
* Text message handling for Meshtastic.
|
||||||
@@ -19,6 +20,8 @@ class TextMessageModule : public SinglePortModule, public Observable<const mesht
|
|||||||
*/
|
*/
|
||||||
TextMessageModule() : SinglePortModule("text", meshtastic_PortNum_TEXT_MESSAGE_APP) {}
|
TextMessageModule() : SinglePortModule("text", meshtastic_PortNum_TEXT_MESSAGE_APP) {}
|
||||||
|
|
||||||
|
bool recentlySeen(uint32_t id);
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
/** Called to handle a particular incoming message
|
/** Called to handle a particular incoming message
|
||||||
*
|
*
|
||||||
@@ -27,6 +30,10 @@ class TextMessageModule : public SinglePortModule, public Observable<const mesht
|
|||||||
*/
|
*/
|
||||||
virtual ProcessMessage handleReceived(const meshtastic_MeshPacket &mp) override;
|
virtual ProcessMessage handleReceived(const meshtastic_MeshPacket &mp) override;
|
||||||
virtual bool wantPacket(const meshtastic_MeshPacket *p) override;
|
virtual bool wantPacket(const meshtastic_MeshPacket *p) override;
|
||||||
|
|
||||||
|
private:
|
||||||
|
uint32_t textPacketList[TEXT_PACKET_LIST_SIZE] = {0};
|
||||||
|
size_t textPacketListIndex = 0;
|
||||||
};
|
};
|
||||||
|
|
||||||
extern TextMessageModule *textMessageModule;
|
extern TextMessageModule *textMessageModule;
|
||||||
@@ -366,6 +366,14 @@ void portduinoSetup()
|
|||||||
cleanupNameForAutoconf("lora-hat-" + std::string(hat_vendor) + "-" + autoconf_product + ".yaml");
|
cleanupNameForAutoconf("lora-hat-" + std::string(hat_vendor) + "-" + autoconf_product + ".yaml");
|
||||||
} else if (found_ch341) {
|
} else if (found_ch341) {
|
||||||
product_config = cleanupNameForAutoconf("lora-usb-" + std::string(autoconf_product) + ".yaml");
|
product_config = cleanupNameForAutoconf("lora-usb-" + std::string(autoconf_product) + ".yaml");
|
||||||
|
// look for more data after the null terminator
|
||||||
|
size_t len = strlen(autoconf_product);
|
||||||
|
if (len < 74) {
|
||||||
|
memcpy(portduino_config.device_id, autoconf_product + len + 1, 16);
|
||||||
|
if (!memfll(portduino_config.device_id, '\0', 16) && !memfll(portduino_config.device_id, 0xff, 16)) {
|
||||||
|
portduino_config.has_device_id = true;
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// Don't try to automatically find config for a device with RAK eeprom.
|
// Don't try to automatically find config for a device with RAK eeprom.
|
||||||
|
|||||||
@@ -64,7 +64,7 @@ class Ch341Hal : public RadioLibHal
|
|||||||
void getProductString(char *_product_string, size_t len)
|
void getProductString(char *_product_string, size_t len)
|
||||||
{
|
{
|
||||||
len = len > 95 ? 95 : len;
|
len = len > 95 ? 95 : len;
|
||||||
strncpy(_product_string, pinedio.product_string, len);
|
memcpy(_product_string, pinedio.product_string, len);
|
||||||
}
|
}
|
||||||
|
|
||||||
void init() override {}
|
void init() override {}
|
||||||
|
|||||||
@@ -1,8 +1,6 @@
|
|||||||
#include "SerialConsole.h"
|
#include "SerialConsole.h"
|
||||||
#include "concurrency/OSThread.h"
|
#include "concurrency/OSThread.h"
|
||||||
#include "gps/RTC.h"
|
#include "gps/RTC.h"
|
||||||
#include "mesh/MeshRadio.h"
|
|
||||||
#include "mesh/NodeDB.h"
|
|
||||||
|
|
||||||
#include "TestUtil.h"
|
#include "TestUtil.h"
|
||||||
|
|
||||||
@@ -16,19 +14,5 @@ void initializeTestEnvironment()
|
|||||||
tv.tv_usec = 0;
|
tv.tv_usec = 0;
|
||||||
perhapsSetRTC(RTCQualityNTP, &tv);
|
perhapsSetRTC(RTCQualityNTP, &tv);
|
||||||
#endif
|
#endif
|
||||||
concurrency::OSThread::setup();
|
|
||||||
}
|
|
||||||
|
|
||||||
void initializeTestEnvironmentMinimal()
|
|
||||||
{
|
|
||||||
// Only satisfy OSThread assertions; skip SerialConsole and platform-specific setup
|
|
||||||
concurrency::hasBeenSetup = true;
|
|
||||||
|
|
||||||
// Ensure region/config globals are sane before any RadioInterface instances compute slot timing
|
|
||||||
config.lora.region = meshtastic_Config_LoRaConfig_RegionCode_UNSET;
|
|
||||||
config.lora.use_preset = true;
|
|
||||||
config.lora.modem_preset = meshtastic_Config_LoRaConfig_ModemPreset_LONG_FAST;
|
|
||||||
initRegion();
|
|
||||||
|
|
||||||
concurrency::OSThread::setup();
|
concurrency::OSThread::setup();
|
||||||
}
|
}
|
||||||
@@ -1,7 +1,4 @@
|
|||||||
#pragma once
|
#pragma once
|
||||||
|
|
||||||
// Initialize testing environment.
|
// Initialize testing environment.
|
||||||
void initializeTestEnvironment();
|
void initializeTestEnvironment();
|
||||||
|
|
||||||
// Minimal init without creating SerialConsole or portduino peripherals (useful for lightweight logic tests)
|
|
||||||
void initializeTestEnvironmentMinimal();
|
|
||||||
@@ -1,164 +0,0 @@
|
|||||||
#include <Arduino.h>
|
|
||||||
#include <unity.h>
|
|
||||||
|
|
||||||
#include "TestUtil.h"
|
|
||||||
// Ensure adaptive coding rate logic is available during tests
|
|
||||||
#ifndef USE_ADAPTIVE_CODING_RATE
|
|
||||||
#define USE_ADAPTIVE_CODING_RATE 1
|
|
||||||
#endif
|
|
||||||
#include "mesh/RadioInterface.h"
|
|
||||||
|
|
||||||
class TestRadio : public RadioInterface
|
|
||||||
{
|
|
||||||
public:
|
|
||||||
bool applyForTest(const meshtastic_MeshPacket *p) { return applyAdaptiveCodingRate(p); }
|
|
||||||
|
|
||||||
uint8_t getAttempts(NodeNum from, PacketId id)
|
|
||||||
{
|
|
||||||
#ifdef USE_ADAPTIVE_CODING_RATE
|
|
||||||
auto it = adaptiveAttempts.find(adaptiveKey(from, id));
|
|
||||||
return (it == adaptiveAttempts.end()) ? 0 : it->second.attempts;
|
|
||||||
#else
|
|
||||||
(void)from;
|
|
||||||
(void)id;
|
|
||||||
return 0;
|
|
||||||
#endif
|
|
||||||
}
|
|
||||||
|
|
||||||
#ifdef USE_ADAPTIVE_CODING_RATE
|
|
||||||
void setAdaptiveState(NodeNum from, PacketId id, uint8_t attempts, uint32_t lastUse)
|
|
||||||
{
|
|
||||||
adaptiveAttempts[adaptiveKey(from, id)] = {attempts, lastUse};
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
uint8_t currentCr() const { return cr; }
|
|
||||||
void setCrForTest(uint8_t value) { cr = value; }
|
|
||||||
|
|
||||||
ErrorCode send(meshtastic_MeshPacket *p) override
|
|
||||||
{
|
|
||||||
packetPool.release(p);
|
|
||||||
return ERRNO_OK;
|
|
||||||
}
|
|
||||||
|
|
||||||
uint32_t getPacketTime(uint32_t /*totalPacketLen*/, bool /*received*/ = false) override { return 0; }
|
|
||||||
|
|
||||||
bool reconfigure() override
|
|
||||||
{
|
|
||||||
reconfigureCount++;
|
|
||||||
lastCr = cr;
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
uint32_t reconfigureCount = 0;
|
|
||||||
uint8_t lastCr = 0;
|
|
||||||
};
|
|
||||||
|
|
||||||
void test_attempt_progression()
|
|
||||||
{
|
|
||||||
TestRadio radio;
|
|
||||||
meshtastic_MeshPacket packet = {};
|
|
||||||
packet.from = 0xABCDEF01;
|
|
||||||
packet.id = 0x1;
|
|
||||||
|
|
||||||
TEST_ASSERT_FALSE(radio.applyForTest(&packet));
|
|
||||||
TEST_ASSERT_EQUAL_UINT8(1, radio.getAttempts(packet.from, packet.id));
|
|
||||||
TEST_ASSERT_EQUAL_UINT8(5, radio.currentCr());
|
|
||||||
TEST_ASSERT_EQUAL_UINT32(0, radio.reconfigureCount);
|
|
||||||
|
|
||||||
TEST_ASSERT_TRUE(radio.applyForTest(&packet));
|
|
||||||
TEST_ASSERT_EQUAL_UINT8(2, radio.getAttempts(packet.from, packet.id));
|
|
||||||
TEST_ASSERT_EQUAL_UINT8(7, radio.currentCr());
|
|
||||||
TEST_ASSERT_EQUAL_UINT32(1, radio.reconfigureCount);
|
|
||||||
TEST_ASSERT_EQUAL_UINT8(7, radio.lastCr);
|
|
||||||
|
|
||||||
TEST_ASSERT_TRUE(radio.applyForTest(&packet));
|
|
||||||
TEST_ASSERT_EQUAL_UINT8(3, radio.getAttempts(packet.from, packet.id));
|
|
||||||
TEST_ASSERT_EQUAL_UINT8(8, radio.currentCr());
|
|
||||||
TEST_ASSERT_EQUAL_UINT32(2, radio.reconfigureCount);
|
|
||||||
TEST_ASSERT_EQUAL_UINT8(8, radio.lastCr);
|
|
||||||
}
|
|
||||||
|
|
||||||
void test_attempts_are_per_packet()
|
|
||||||
{
|
|
||||||
TestRadio radio;
|
|
||||||
meshtastic_MeshPacket first = {};
|
|
||||||
first.from = 0x1001;
|
|
||||||
first.id = 0xA;
|
|
||||||
|
|
||||||
meshtastic_MeshPacket second = {};
|
|
||||||
second.from = 0x1001;
|
|
||||||
second.id = 0xB;
|
|
||||||
|
|
||||||
radio.applyForTest(&first);
|
|
||||||
radio.applyForTest(&second);
|
|
||||||
radio.applyForTest(&first);
|
|
||||||
|
|
||||||
TEST_ASSERT_EQUAL_UINT8(2, radio.getAttempts(first.from, first.id));
|
|
||||||
TEST_ASSERT_EQUAL_UINT8(1, radio.getAttempts(second.from, second.id));
|
|
||||||
TEST_ASSERT_EQUAL_UINT8(7, radio.currentCr());
|
|
||||||
}
|
|
||||||
|
|
||||||
void test_clear_resets_attempts_and_rate()
|
|
||||||
{
|
|
||||||
TestRadio radio;
|
|
||||||
meshtastic_MeshPacket packet = {};
|
|
||||||
packet.from = 0xCAFE;
|
|
||||||
packet.id = 0x55;
|
|
||||||
|
|
||||||
radio.applyForTest(&packet);
|
|
||||||
radio.applyForTest(&packet);
|
|
||||||
radio.applyForTest(&packet);
|
|
||||||
|
|
||||||
radio.reconfigureCount = 0;
|
|
||||||
radio.setCrForTest(8);
|
|
||||||
radio.clearAdaptiveCodingRateState(packet.from, packet.id);
|
|
||||||
|
|
||||||
TEST_ASSERT_TRUE(radio.applyForTest(&packet));
|
|
||||||
TEST_ASSERT_EQUAL_UINT8(1, radio.getAttempts(packet.from, packet.id));
|
|
||||||
TEST_ASSERT_EQUAL_UINT8(5, radio.currentCr());
|
|
||||||
TEST_ASSERT_EQUAL_UINT32(1, radio.reconfigureCount);
|
|
||||||
}
|
|
||||||
|
|
||||||
void test_prunes_expired_state()
|
|
||||||
{
|
|
||||||
TestRadio radio;
|
|
||||||
meshtastic_MeshPacket packet = {};
|
|
||||||
packet.from = 0xBEEF;
|
|
||||||
packet.id = 0x99;
|
|
||||||
|
|
||||||
radio.applyForTest(&packet);
|
|
||||||
#ifdef USE_ADAPTIVE_CODING_RATE
|
|
||||||
const uint32_t now = millis();
|
|
||||||
radio.setAdaptiveState(packet.from, packet.id, 3, now - (5 * 60 * 1000UL + 50));
|
|
||||||
#endif
|
|
||||||
radio.reconfigureCount = 0;
|
|
||||||
radio.setCrForTest(5);
|
|
||||||
|
|
||||||
TEST_ASSERT_FALSE(radio.applyForTest(&packet));
|
|
||||||
TEST_ASSERT_EQUAL_UINT8(1, radio.getAttempts(packet.from, packet.id));
|
|
||||||
TEST_ASSERT_EQUAL_UINT32(0, radio.reconfigureCount);
|
|
||||||
}
|
|
||||||
|
|
||||||
void setup()
|
|
||||||
{
|
|
||||||
printf("AdaptiveCodingRate test setup start\n");
|
|
||||||
fflush(stdout);
|
|
||||||
// Use minimal init to avoid pulling in SerialConsole/portduino peripherals for these logic-only tests
|
|
||||||
initializeTestEnvironmentMinimal();
|
|
||||||
|
|
||||||
printf("AdaptiveCodingRate test init done\n");
|
|
||||||
fflush(stdout);
|
|
||||||
|
|
||||||
UNITY_BEGIN();
|
|
||||||
RUN_TEST(test_attempt_progression);
|
|
||||||
RUN_TEST(test_attempts_are_per_packet);
|
|
||||||
RUN_TEST(test_clear_resets_attempts_and_rate);
|
|
||||||
RUN_TEST(test_prunes_expired_state);
|
|
||||||
UNITY_END();
|
|
||||||
}
|
|
||||||
|
|
||||||
void loop()
|
|
||||||
{
|
|
||||||
delay(1000);
|
|
||||||
}
|
|
||||||
@@ -1,5 +1,12 @@
|
|||||||
; Port to Disaster Radio's ESP32-v3 Dev Board
|
; Port to Disaster Radio's ESP32-v3 Dev Board
|
||||||
[env:meshtastic-dr-dev]
|
[env:meshtastic-dr-dev]
|
||||||
|
custom_meshtastic_hw_model = 41
|
||||||
|
custom_meshtastic_hw_model_slug = DR_DEV
|
||||||
|
custom_meshtastic_architecture = esp32
|
||||||
|
custom_meshtastic_actively_supported = false
|
||||||
|
custom_meshtastic_display_name = DR-DEV
|
||||||
|
custom_meshtastic_tags = DIY
|
||||||
|
|
||||||
extends = esp32_base
|
extends = esp32_base
|
||||||
board = esp32doit-devkit-v1
|
board = esp32doit-devkit-v1
|
||||||
board_level = extra
|
board_level = extra
|
||||||
|
|||||||
@@ -1,5 +1,13 @@
|
|||||||
; Hydra - Meshtastic DIY v1 hardware with some specific changes
|
; Hydra - Meshtastic DIY v1 hardware with some specific changes
|
||||||
[env:hydra]
|
[env:hydra]
|
||||||
|
custom_meshtastic_hw_model = 39
|
||||||
|
custom_meshtastic_hw_model_slug = HYDRA
|
||||||
|
custom_meshtastic_architecture = esp32
|
||||||
|
custom_meshtastic_actively_supported = true
|
||||||
|
custom_meshtastic_support_level = 3
|
||||||
|
custom_meshtastic_display_name = Hydra
|
||||||
|
custom_meshtastic_tags = DIY
|
||||||
|
|
||||||
extends = esp32_base
|
extends = esp32_base
|
||||||
board = esp32doit-devkit-v1
|
board = esp32doit-devkit-v1
|
||||||
build_flags =
|
build_flags =
|
||||||
|
|||||||
@@ -1,5 +1,14 @@
|
|||||||
; Meshtastic DIY v1 by Nano VHF Schematic based on ESP32-WROOM-32 (38 pins) devkit & EBYTE E22 SX1262/SX1268 module
|
; Meshtastic DIY v1 by Nano VHF Schematic based on ESP32-WROOM-32 (38 pins) devkit & EBYTE E22 SX1262/SX1268 module
|
||||||
[env:meshtastic-diy-v1]
|
[env:meshtastic-diy-v1]
|
||||||
|
custom_meshtastic_hw_model = 39
|
||||||
|
custom_meshtastic_hw_model_slug = DIY_V1
|
||||||
|
custom_meshtastic_architecture = esp32
|
||||||
|
custom_meshtastic_actively_supported = true
|
||||||
|
custom_meshtastic_support_level = 3
|
||||||
|
custom_meshtastic_display_name = DIY V1
|
||||||
|
custom_meshtastic_images = diy.svg
|
||||||
|
custom_meshtastic_tags = DIY
|
||||||
|
|
||||||
extends = esp32_base
|
extends = esp32_base
|
||||||
board = esp32doit-devkit-v1
|
board = esp32doit-devkit-v1
|
||||||
board_check = true
|
board_check = true
|
||||||
|
|||||||
@@ -1,4 +1,11 @@
|
|||||||
[env:heltec-v1]
|
[env:heltec-v1]
|
||||||
|
custom_meshtastic_hw_model = 11
|
||||||
|
custom_meshtastic_hw_model_slug = HELTEC_V1
|
||||||
|
custom_meshtastic_architecture = esp32
|
||||||
|
custom_meshtastic_actively_supported = false
|
||||||
|
custom_meshtastic_display_name = Heltec V1
|
||||||
|
custom_meshtastic_tags = Heltec
|
||||||
|
|
||||||
;build_type = debug ; to make it possible to step through our jtag debugger
|
;build_type = debug ; to make it possible to step through our jtag debugger
|
||||||
extends = esp32_base
|
extends = esp32_base
|
||||||
board_level = extra
|
board_level = extra
|
||||||
|
|||||||
@@ -1,4 +1,11 @@
|
|||||||
[env:heltec-v2_1]
|
[env:heltec-v2_1]
|
||||||
|
custom_meshtastic_hw_model = 10
|
||||||
|
custom_meshtastic_hw_model_slug = HELTEC_V2_1
|
||||||
|
custom_meshtastic_architecture = esp32
|
||||||
|
custom_meshtastic_actively_supported = false
|
||||||
|
custom_meshtastic_display_name = Heltec V2.1
|
||||||
|
custom_meshtastic_tags = Heltec
|
||||||
|
|
||||||
board_level = extra
|
board_level = extra
|
||||||
;build_type = debug ; to make it possible to step through our jtag debugger
|
;build_type = debug ; to make it possible to step through our jtag debugger
|
||||||
extends = esp32_base
|
extends = esp32_base
|
||||||
|
|||||||
@@ -1,4 +1,11 @@
|
|||||||
[env:heltec-v2_0]
|
[env:heltec-v2_0]
|
||||||
|
custom_meshtastic_hw_model = 5
|
||||||
|
custom_meshtastic_hw_model_slug = HELTEC_V2_0
|
||||||
|
custom_meshtastic_architecture = esp32
|
||||||
|
custom_meshtastic_actively_supported = false
|
||||||
|
custom_meshtastic_display_name = Heltec V2.0
|
||||||
|
custom_meshtastic_tags = Heltec
|
||||||
|
|
||||||
;build_type = debug ; to make it possible to step through our jtag debugger
|
;build_type = debug ; to make it possible to step through our jtag debugger
|
||||||
board_level = extra
|
board_level = extra
|
||||||
extends = esp32_base
|
extends = esp32_base
|
||||||
|
|||||||
@@ -1,4 +1,12 @@
|
|||||||
[env:m5stack-core]
|
[env:m5stack-core]
|
||||||
|
custom_meshtastic_hw_model = 42
|
||||||
|
custom_meshtastic_hw_model_slug = M5STACK
|
||||||
|
custom_meshtastic_architecture = esp32
|
||||||
|
custom_meshtastic_actively_supported = true
|
||||||
|
custom_meshtastic_support_level = 3
|
||||||
|
custom_meshtastic_display_name = M5 Stack
|
||||||
|
custom_meshtastic_tags = M5Stack
|
||||||
|
|
||||||
extends = esp32_base
|
extends = esp32_base
|
||||||
board = m5stack-core-esp32
|
board = m5stack-core-esp32
|
||||||
monitor_filters = esp32_exception_decoder
|
monitor_filters = esp32_exception_decoder
|
||||||
|
|||||||
@@ -1,5 +1,13 @@
|
|||||||
; The 1.0 release of the nano-g1-explorer board
|
; The 1.0 release of the nano-g1-explorer board
|
||||||
[env:nano-g1-explorer]
|
[env:nano-g1-explorer]
|
||||||
|
custom_meshtastic_hw_model = 17
|
||||||
|
custom_meshtastic_hw_model_slug = NANO_G1_EXPLORER
|
||||||
|
custom_meshtastic_architecture = esp32
|
||||||
|
custom_meshtastic_actively_supported = true
|
||||||
|
custom_meshtastic_support_level = 3
|
||||||
|
custom_meshtastic_display_name = Nano G1 Explorer
|
||||||
|
custom_meshtastic_tags = B&Q
|
||||||
|
|
||||||
extends = esp32_base
|
extends = esp32_base
|
||||||
board = ttgo-t-beam
|
board = ttgo-t-beam
|
||||||
build_flags =
|
build_flags =
|
||||||
|
|||||||
@@ -1,5 +1,13 @@
|
|||||||
; The 1.0 release of the nano-g1 board
|
; The 1.0 release of the nano-g1 board
|
||||||
[env:nano-g1]
|
[env:nano-g1]
|
||||||
|
custom_meshtastic_hw_model = 14
|
||||||
|
custom_meshtastic_hw_model_slug = NANO_G1
|
||||||
|
custom_meshtastic_architecture = esp32
|
||||||
|
custom_meshtastic_actively_supported = true
|
||||||
|
custom_meshtastic_support_level = 3
|
||||||
|
custom_meshtastic_display_name = Nano G1
|
||||||
|
custom_meshtastic_tags = B&Q
|
||||||
|
|
||||||
extends = esp32_base
|
extends = esp32_base
|
||||||
board = ttgo-t-beam
|
board = ttgo-t-beam
|
||||||
build_flags =
|
build_flags =
|
||||||
|
|||||||
@@ -1,4 +1,12 @@
|
|||||||
[env:radiomaster_900_bandit_nano]
|
[env:radiomaster_900_bandit_nano]
|
||||||
|
custom_meshtastic_hw_model = 64
|
||||||
|
custom_meshtastic_hw_model_slug = RADIOMASTER_900_BANDIT_NANO
|
||||||
|
custom_meshtastic_architecture = esp32
|
||||||
|
custom_meshtastic_actively_supported = true
|
||||||
|
custom_meshtastic_support_level = 2
|
||||||
|
custom_meshtastic_display_name = RadioMaster 900 Bandit Nano
|
||||||
|
custom_meshtastic_tags = RadioMaster
|
||||||
|
|
||||||
extends = esp32_base
|
extends = esp32_base
|
||||||
board = esp32doit-devkit-v1
|
board = esp32doit-devkit-v1
|
||||||
build_flags =
|
build_flags =
|
||||||
|
|||||||
@@ -1,4 +1,13 @@
|
|||||||
[env:rak11200]
|
[env:rak11200]
|
||||||
|
custom_meshtastic_hw_model = 13
|
||||||
|
custom_meshtastic_hw_model_slug = RAK11200
|
||||||
|
custom_meshtastic_architecture = esp32
|
||||||
|
custom_meshtastic_actively_supported = true
|
||||||
|
custom_meshtastic_support_level = 3
|
||||||
|
custom_meshtastic_display_name = RAK WisBlock 11200
|
||||||
|
custom_meshtastic_images = rak11200.svg
|
||||||
|
custom_meshtastic_tags = RAK
|
||||||
|
|
||||||
extends = esp32_base
|
extends = esp32_base
|
||||||
board = wiscore_rak11200
|
board = wiscore_rak11200
|
||||||
board_level = pr
|
board_level = pr
|
||||||
|
|||||||
@@ -1,5 +1,13 @@
|
|||||||
; The 1.0 release of the nano-g1 board
|
; The 1.0 release of the nano-g1 board
|
||||||
[env:station-g1]
|
[env:station-g1]
|
||||||
|
custom_meshtastic_hw_model = 25
|
||||||
|
custom_meshtastic_hw_model_slug = STATION_G1
|
||||||
|
custom_meshtastic_architecture = esp32
|
||||||
|
custom_meshtastic_actively_supported = true
|
||||||
|
custom_meshtastic_support_level = 3
|
||||||
|
custom_meshtastic_display_name = Station G1
|
||||||
|
custom_meshtastic_tags = B&Q
|
||||||
|
|
||||||
extends = esp32_base
|
extends = esp32_base
|
||||||
board = ttgo-t-beam
|
board = ttgo-t-beam
|
||||||
build_flags =
|
build_flags =
|
||||||
|
|||||||
@@ -1,5 +1,14 @@
|
|||||||
; The 1.0 release of the TBEAM board
|
; The 1.0 release of the TBEAM board
|
||||||
[env:tbeam]
|
[env:tbeam]
|
||||||
|
custom_meshtastic_hw_model = 4
|
||||||
|
custom_meshtastic_hw_model_slug = TBEAM
|
||||||
|
custom_meshtastic_architecture = esp32
|
||||||
|
custom_meshtastic_actively_supported = true
|
||||||
|
custom_meshtastic_support_level = 3
|
||||||
|
custom_meshtastic_display_name = LILYGO T-Beam
|
||||||
|
custom_meshtastic_images = tbeam.svg
|
||||||
|
custom_meshtastic_tags = LilyGo
|
||||||
|
|
||||||
extends = esp32_base
|
extends = esp32_base
|
||||||
board = ttgo-t-beam
|
board = ttgo-t-beam
|
||||||
|
|
||||||
|
|||||||
@@ -1,5 +1,12 @@
|
|||||||
; The original TBEAM board without the AXP power chip and a few other changes
|
; The original TBEAM board without the AXP power chip and a few other changes
|
||||||
[env:tbeam0_7]
|
[env:tbeam0_7]
|
||||||
|
custom_meshtastic_hw_model = 6
|
||||||
|
custom_meshtastic_hw_model_slug = TBEAM_V0P7
|
||||||
|
custom_meshtastic_architecture = esp32
|
||||||
|
custom_meshtastic_actively_supported = false
|
||||||
|
custom_meshtastic_display_name = LILYGO T-Beam V0.7
|
||||||
|
custom_meshtastic_tags = LilyGo
|
||||||
|
|
||||||
board_level = extra
|
board_level = extra
|
||||||
extends = esp32_base
|
extends = esp32_base
|
||||||
board = ttgo-t-beam
|
board = ttgo-t-beam
|
||||||
|
|||||||
@@ -1,4 +1,11 @@
|
|||||||
[env:tlora-v1]
|
[env:tlora-v1]
|
||||||
|
custom_meshtastic_hw_model = 2
|
||||||
|
custom_meshtastic_hw_model_slug = TLORA_V1
|
||||||
|
custom_meshtastic_architecture = esp32
|
||||||
|
custom_meshtastic_actively_supported = false
|
||||||
|
custom_meshtastic_display_name = LILYGO T-LoRa V1
|
||||||
|
custom_meshtastic_tags = LilyGo
|
||||||
|
|
||||||
board_level = extra
|
board_level = extra
|
||||||
extends = esp32_base
|
extends = esp32_base
|
||||||
board = ttgo-lora32-v1
|
board = ttgo-lora32-v1
|
||||||
|
|||||||
@@ -1,4 +1,11 @@
|
|||||||
[env:tlora-v2]
|
[env:tlora-v2]
|
||||||
|
custom_meshtastic_hw_model = 1
|
||||||
|
custom_meshtastic_hw_model_slug = TLORA_V2
|
||||||
|
custom_meshtastic_architecture = esp32
|
||||||
|
custom_meshtastic_actively_supported = false
|
||||||
|
custom_meshtastic_display_name = LILYGO T-LoRa V2
|
||||||
|
custom_meshtastic_tags = LilyGo
|
||||||
|
|
||||||
board_level = extra
|
board_level = extra
|
||||||
extends = esp32_base
|
extends = esp32_base
|
||||||
board = ttgo-lora32-v1
|
board = ttgo-lora32-v1
|
||||||
|
|||||||
@@ -1,4 +1,13 @@
|
|||||||
[env:tlora-v2-1-1_6]
|
[env:tlora-v2-1-1_6]
|
||||||
|
custom_meshtastic_hw_model = 3
|
||||||
|
custom_meshtastic_hw_model_slug = TLORA_V2_1_1P6
|
||||||
|
custom_meshtastic_architecture = esp32
|
||||||
|
custom_meshtastic_actively_supported = true
|
||||||
|
custom_meshtastic_support_level = 3
|
||||||
|
custom_meshtastic_display_name = LILYGO T-LoRa V2.1-1.6
|
||||||
|
custom_meshtastic_images = tlora-v2-1-1_6.svg
|
||||||
|
custom_meshtastic_tags = LilyGo
|
||||||
|
|
||||||
extends = esp32_base
|
extends = esp32_base
|
||||||
board = ttgo-lora32-v21
|
board = ttgo-lora32-v21
|
||||||
board_check = true
|
board_check = true
|
||||||
|
|||||||
@@ -1,4 +1,13 @@
|
|||||||
[env:tlora-v2-1-1_8]
|
[env:tlora-v2-1-1_8]
|
||||||
|
custom_meshtastic_hw_model = 15
|
||||||
|
custom_meshtastic_hw_model_slug = TLORA_V2_1_1P8
|
||||||
|
custom_meshtastic_architecture = esp32
|
||||||
|
custom_meshtastic_actively_supported = true
|
||||||
|
custom_meshtastic_support_level = 3
|
||||||
|
custom_meshtastic_display_name = LILYGO T-LoRa V2.1-1.8
|
||||||
|
custom_meshtastic_images = tlora-v2-1-1_8.svg
|
||||||
|
custom_meshtastic_tags = LilyGo, 2.4GHz
|
||||||
|
|
||||||
extends = esp32_base
|
extends = esp32_base
|
||||||
board_level = extra
|
board_level = extra
|
||||||
board = ttgo-lora32-v21
|
board = ttgo-lora32-v21
|
||||||
|
|||||||
@@ -1,4 +1,13 @@
|
|||||||
[env:heltec-ht62-esp32c3-sx1262]
|
[env:heltec-ht62-esp32c3-sx1262]
|
||||||
|
custom_meshtastic_hw_model = 53
|
||||||
|
custom_meshtastic_hw_model_slug = HELTEC_HT62
|
||||||
|
custom_meshtastic_architecture = esp32-c3
|
||||||
|
custom_meshtastic_actively_supported = true
|
||||||
|
custom_meshtastic_support_level = 1
|
||||||
|
custom_meshtastic_display_name = Heltec HT62
|
||||||
|
custom_meshtastic_images = heltec-ht62-esp32c3-sx1262.svg
|
||||||
|
custom_meshtastic_tags = Heltec
|
||||||
|
|
||||||
extends = esp32c3_base
|
extends = esp32c3_base
|
||||||
board = esp32-c3-devkitm-1
|
board = esp32-c3-devkitm-1
|
||||||
board_level = pr
|
board_level = pr
|
||||||
|
|||||||
@@ -1,4 +1,13 @@
|
|||||||
[env:m5stack-unitc6l]
|
[env:m5stack-unitc6l]
|
||||||
|
custom_meshtastic_hw_model = 111
|
||||||
|
custom_meshtastic_hw_model_slug = M5STACK_C6L
|
||||||
|
custom_meshtastic_architecture = esp32-c6
|
||||||
|
custom_meshtastic_actively_supported = true
|
||||||
|
custom_meshtastic_support_level = 1
|
||||||
|
custom_meshtastic_display_name = M5Stack Unit C6L
|
||||||
|
custom_meshtastic_images = m5_c6l.svg
|
||||||
|
custom_meshtastic_tags = M5Stack
|
||||||
|
|
||||||
extends = esp32c6_base
|
extends = esp32c6_base
|
||||||
board = esp32-c6-devkitc-1
|
board = esp32-c6-devkitc-1
|
||||||
;OpenOCD flash method
|
;OpenOCD flash method
|
||||||
|
|||||||
@@ -1,4 +1,13 @@
|
|||||||
[env:CDEBYTE_EoRa-S3]
|
[env:CDEBYTE_EoRa-S3]
|
||||||
|
custom_meshtastic_hw_model = 61
|
||||||
|
custom_meshtastic_hw_model_slug = CDEBYTE_EORA_S3
|
||||||
|
custom_meshtastic_architecture = esp32-s3
|
||||||
|
custom_meshtastic_actively_supported = true
|
||||||
|
custom_meshtastic_support_level = 3
|
||||||
|
custom_meshtastic_display_name = EBYTE EoRa-S3
|
||||||
|
custom_meshtastic_tags = EByte
|
||||||
|
custom_meshtastic_requires_dfu = true
|
||||||
|
|
||||||
extends = esp32s3_base
|
extends = esp32s3_base
|
||||||
board = CDEBYTE_EoRa-S3
|
board = CDEBYTE_EoRa-S3
|
||||||
build_flags =
|
build_flags =
|
||||||
|
|||||||
@@ -1,4 +1,14 @@
|
|||||||
[env:thinknode_m2]
|
[env:thinknode_m2]
|
||||||
|
custom_meshtastic_hw_model = 90
|
||||||
|
custom_meshtastic_hw_model_slug = THINKNODE_M2
|
||||||
|
custom_meshtastic_architecture = esp32-s3
|
||||||
|
custom_meshtastic_actively_supported = true
|
||||||
|
custom_meshtastic_support_level = 1
|
||||||
|
custom_meshtastic_display_name = ThinkNode M2
|
||||||
|
custom_meshtastic_images = thinknode_m2.svg
|
||||||
|
custom_meshtastic_tags = Elecrow
|
||||||
|
custom_meshtastic_requires_dfu = false
|
||||||
|
|
||||||
extends = esp32s3_base
|
extends = esp32s3_base
|
||||||
board = ESP32-S3-WROOM-1-N4
|
board = ESP32-S3-WROOM-1-N4
|
||||||
build_flags =
|
build_flags =
|
||||||
|
|||||||
@@ -1,4 +1,14 @@
|
|||||||
[env:thinknode_m5]
|
[env:thinknode_m5]
|
||||||
|
custom_meshtastic_hw_model = 107
|
||||||
|
custom_meshtastic_hw_model_slug = THINKNODE_M5
|
||||||
|
custom_meshtastic_architecture = esp32-s3
|
||||||
|
custom_meshtastic_actively_supported = true
|
||||||
|
custom_meshtastic_support_level = 1
|
||||||
|
custom_meshtastic_display_name = ThinkNode M5
|
||||||
|
custom_meshtastic_images = thinknode_m1.svg
|
||||||
|
custom_meshtastic_tags = Elecrow
|
||||||
|
custom_meshtastic_requires_dfu = false
|
||||||
|
|
||||||
extends = esp32s3_base
|
extends = esp32s3_base
|
||||||
board = ESP32-S3-WROOM-1-N4
|
board = ESP32-S3-WROOM-1-N4
|
||||||
build_flags =
|
build_flags =
|
||||||
|
|||||||
@@ -75,6 +75,17 @@ build_flags =
|
|||||||
-D DISPLAY_SET_RESOLUTION
|
-D DISPLAY_SET_RESOLUTION
|
||||||
|
|
||||||
[env:elecrow-adv-24-28-tft]
|
[env:elecrow-adv-24-28-tft]
|
||||||
|
custom_meshtastic_hw_model = 97
|
||||||
|
custom_meshtastic_hw_model_slug = CROWPANEL
|
||||||
|
custom_meshtastic_architecture = esp32-s3
|
||||||
|
custom_meshtastic_actively_supported = true
|
||||||
|
custom_meshtastic_support_level = 1
|
||||||
|
custom_meshtastic_display_name = Crowpanel Adv 2.4/2.8 TFT
|
||||||
|
custom_meshtastic_images = crowpanel_2_4.svg, crowpanel_2_8.svg
|
||||||
|
custom_meshtastic_tags = Elecrow
|
||||||
|
custom_meshtastic_requires_dfu = true
|
||||||
|
custom_meshtastic_partition_scheme = 16MB
|
||||||
|
|
||||||
extends = crowpanel_small_esp32s3_base
|
extends = crowpanel_small_esp32s3_base
|
||||||
build_flags =
|
build_flags =
|
||||||
${crowpanel_small_esp32s3_base.build_flags}
|
${crowpanel_small_esp32s3_base.build_flags}
|
||||||
@@ -99,6 +110,17 @@ build_flags =
|
|||||||
-D LGFX_TOUCH_ROTATION=0
|
-D LGFX_TOUCH_ROTATION=0
|
||||||
|
|
||||||
[env:elecrow-adv-35-tft]
|
[env:elecrow-adv-35-tft]
|
||||||
|
custom_meshtastic_hw_model = 97
|
||||||
|
custom_meshtastic_hw_model_slug = CROWPANEL
|
||||||
|
custom_meshtastic_architecture = esp32-s3
|
||||||
|
custom_meshtastic_actively_supported = true
|
||||||
|
custom_meshtastic_support_level = 1
|
||||||
|
custom_meshtastic_display_name = Crowpanel Adv 3.5 TFT
|
||||||
|
custom_meshtastic_images = crowpanel_3_5.svg
|
||||||
|
custom_meshtastic_tags = Elecrow
|
||||||
|
custom_meshtastic_requires_dfu = true
|
||||||
|
custom_meshtastic_partition_scheme = 16MB
|
||||||
|
|
||||||
extends = crowpanel_small_esp32s3_base
|
extends = crowpanel_small_esp32s3_base
|
||||||
board_level = pr
|
board_level = pr
|
||||||
build_flags =
|
build_flags =
|
||||||
@@ -127,6 +149,17 @@ build_flags =
|
|||||||
|
|
||||||
; 4.3, 5.0, 7.0 inch 800x480 IPS (V1)
|
; 4.3, 5.0, 7.0 inch 800x480 IPS (V1)
|
||||||
[env:elecrow-adv1-43-50-70-tft]
|
[env:elecrow-adv1-43-50-70-tft]
|
||||||
|
custom_meshtastic_hw_model = 97
|
||||||
|
custom_meshtastic_hw_model_slug = CROWPANEL
|
||||||
|
custom_meshtastic_architecture = esp32-s3
|
||||||
|
custom_meshtastic_actively_supported = true
|
||||||
|
custom_meshtastic_support_level = 1
|
||||||
|
custom_meshtastic_display_name = Crowpanel Adv 4.3/5.0/7.0 TFT
|
||||||
|
custom_meshtastic_images = crowpanel_5_0.svg, crowpanel_7_0.svg
|
||||||
|
custom_meshtastic_tags = Elecrow
|
||||||
|
custom_meshtastic_requires_dfu = true
|
||||||
|
custom_meshtastic_partition_scheme = 16MB
|
||||||
|
|
||||||
extends = crowpanel_large_esp32s3_base
|
extends = crowpanel_large_esp32s3_base
|
||||||
build_flags =
|
build_flags =
|
||||||
${crowpanel_large_esp32s3_base.build_flags}
|
${crowpanel_large_esp32s3_base.build_flags}
|
||||||
|
|||||||
@@ -1,4 +1,14 @@
|
|||||||
[env:heltec-v3]
|
[env:heltec-v3]
|
||||||
|
custom_meshtastic_hw_model = 43
|
||||||
|
custom_meshtastic_hw_model_slug = HELTEC_V3
|
||||||
|
custom_meshtastic_architecture = esp32-s3
|
||||||
|
custom_meshtastic_actively_supported = true
|
||||||
|
custom_meshtastic_support_level = 1
|
||||||
|
custom_meshtastic_display_name = Heltec V3
|
||||||
|
custom_meshtastic_images = heltec-v3.svg, heltec-v3-case.svg
|
||||||
|
custom_meshtastic_tags = Heltec
|
||||||
|
custom_meshtastic_partition_scheme = 8MB
|
||||||
|
|
||||||
extends = esp32s3_base
|
extends = esp32s3_base
|
||||||
board = heltec_wifi_lora_32_V3
|
board = heltec_wifi_lora_32_V3
|
||||||
board_level = pr
|
board_level = pr
|
||||||
|
|||||||
@@ -10,6 +10,17 @@ build_flags =
|
|||||||
|
|
||||||
|
|
||||||
[env:heltec-v4]
|
[env:heltec-v4]
|
||||||
|
custom_meshtastic_hw_model = 110
|
||||||
|
custom_meshtastic_hw_model_slug = HELTEC_V4
|
||||||
|
custom_meshtastic_architecture = esp32-s3
|
||||||
|
custom_meshtastic_actively_supported = true
|
||||||
|
custom_meshtastic_support_level = 1
|
||||||
|
custom_meshtastic_display_name = Heltec V4
|
||||||
|
custom_meshtastic_images = heltec_v4.svg
|
||||||
|
custom_meshtastic_tags = Heltec
|
||||||
|
custom_meshtastic_requires_dfu = true
|
||||||
|
custom_meshtastic_partition_scheme = 16MB
|
||||||
|
|
||||||
extends = heltec_v4_base
|
extends = heltec_v4_base
|
||||||
build_flags =
|
build_flags =
|
||||||
${heltec_v4_base.build_flags}
|
${heltec_v4_base.build_flags}
|
||||||
|
|||||||
@@ -29,10 +29,32 @@
|
|||||||
#define SX126X_DIO2_AS_RF_SWITCH
|
#define SX126X_DIO2_AS_RF_SWITCH
|
||||||
#define SX126X_DIO3_TCXO_VOLTAGE 1.8
|
#define SX126X_DIO3_TCXO_VOLTAGE 1.8
|
||||||
|
|
||||||
#define USE_GC1109_PA // We have a GC1109 power amplifier+attenuator
|
// ---- GC1109 RF FRONT END CONFIGURATION ----
|
||||||
#define LORA_PA_POWER 7 // power en
|
// The Heltec V4 uses a GC1109 FEM chip with integrated PA and LNA
|
||||||
#define LORA_PA_EN 2
|
// RF path: SX1262 -> GC1109 PA -> Pi attenuator -> Antenna
|
||||||
#define LORA_PA_TX_EN 46 // enable tx
|
// Measured net TX gain (non-linear due to PA compression):
|
||||||
|
// +11dB at 0-15dBm input (e.g., 10dBm in -> 21dBm out)
|
||||||
|
// +10dB at 16-17dBm input
|
||||||
|
// +9dB at 18-19dBm input
|
||||||
|
// +7dB at 21dBm input (e.g., 21dBm in -> 28dBm out max)
|
||||||
|
// Control logic (from GC1109 datasheet):
|
||||||
|
// Shutdown: CSD=0, CTX=X, CPS=X
|
||||||
|
// Receive LNA: CSD=1, CTX=0, CPS=X (17dB gain, 2dB NF)
|
||||||
|
// Transmit bypass: CSD=1, CTX=1, CPS=0 (~1dB loss, no PA)
|
||||||
|
// Transmit PA: CSD=1, CTX=1, CPS=1 (full PA enabled)
|
||||||
|
// Pin mapping:
|
||||||
|
// CTX (pin 6) -> SX1262 DIO2: TX/RX path select (automatic via SX126X_DIO2_AS_RF_SWITCH)
|
||||||
|
// CSD (pin 4) -> GPIO2: Chip enable (HIGH=on, LOW=shutdown)
|
||||||
|
// CPS (pin 5) -> GPIO46: PA mode select (HIGH=full PA, LOW=bypass)
|
||||||
|
// VCC0/VCC1 -> Vfem via U3 LDO, controlled by GPIO7
|
||||||
|
#define USE_GC1109_PA
|
||||||
|
#define LORA_PA_POWER 7 // VFEM_Ctrl - GC1109 LDO power enable
|
||||||
|
#define LORA_PA_EN 2 // CSD - GC1109 chip enable (HIGH=on)
|
||||||
|
#define LORA_PA_TX_EN 46 // CPS - GC1109 PA mode (HIGH=full PA, LOW=bypass)
|
||||||
|
|
||||||
|
// GC1109 FEM: TX/RX path switching is handled by DIO2 -> CTX pin (via SX126X_DIO2_AS_RF_SWITCH)
|
||||||
|
// GPIO46 is CPS (PA mode), not TX control - setTransmitEnable() handles it in SX126xInterface.cpp
|
||||||
|
// Do NOT use SX126X_TXEN/RXEN as that would cause double-control of GPIO46
|
||||||
|
|
||||||
#if HAS_TFT
|
#if HAS_TFT
|
||||||
#define USE_TFTDISPLAY 1
|
#define USE_TFTDISPLAY 1
|
||||||
|
|||||||
@@ -1,4 +1,15 @@
|
|||||||
[env:heltec-vision-master-e213]
|
[env:heltec-vision-master-e213]
|
||||||
|
custom_meshtastic_hw_model = 67
|
||||||
|
custom_meshtastic_hw_model_slug = HELTEC_VISION_MASTER_E213
|
||||||
|
custom_meshtastic_architecture = esp32-s3
|
||||||
|
custom_meshtastic_actively_supported = true
|
||||||
|
custom_meshtastic_support_level = 1
|
||||||
|
custom_meshtastic_display_name = Heltec Vision Master E213
|
||||||
|
custom_meshtastic_images = heltec-vision-master-e213.svg
|
||||||
|
custom_meshtastic_tags = Heltec
|
||||||
|
custom_meshtastic_requires_dfu = true
|
||||||
|
custom_meshtastic_partition_scheme = 8MB
|
||||||
|
|
||||||
extends = esp32s3_base
|
extends = esp32s3_base
|
||||||
board = heltec_vision_master_e213
|
board = heltec_vision_master_e213
|
||||||
board_build.partitions = default_8MB.csv
|
board_build.partitions = default_8MB.csv
|
||||||
|
|||||||
@@ -1,5 +1,16 @@
|
|||||||
; Using the original screen class
|
; Using the original screen class
|
||||||
[env:heltec-vision-master-e290]
|
[env:heltec-vision-master-e290]
|
||||||
|
custom_meshtastic_hw_model = 68
|
||||||
|
custom_meshtastic_hw_model_slug = HELTEC_VISION_MASTER_E290
|
||||||
|
custom_meshtastic_architecture = esp32-s3
|
||||||
|
custom_meshtastic_actively_supported = true
|
||||||
|
custom_meshtastic_support_level = 1
|
||||||
|
custom_meshtastic_display_name = Heltec Vision Master E290
|
||||||
|
custom_meshtastic_images = heltec-vision-master-e290.svg
|
||||||
|
custom_meshtastic_tags = Heltec
|
||||||
|
custom_meshtastic_requires_dfu = true
|
||||||
|
custom_meshtastic_partition_scheme = 8MB
|
||||||
|
|
||||||
extends = esp32s3_base
|
extends = esp32s3_base
|
||||||
board = heltec_vision_master_e290
|
board = heltec_vision_master_e290
|
||||||
board_build.partitions = default_8MB.csv
|
board_build.partitions = default_8MB.csv
|
||||||
|
|||||||
@@ -1,4 +1,15 @@
|
|||||||
[env:heltec-vision-master-t190]
|
[env:heltec-vision-master-t190]
|
||||||
|
custom_meshtastic_hw_model = 66
|
||||||
|
custom_meshtastic_hw_model_slug = HELTEC_VISION_MASTER_T190
|
||||||
|
custom_meshtastic_architecture = esp32-s3
|
||||||
|
custom_meshtastic_actively_supported = true
|
||||||
|
custom_meshtastic_support_level = 1
|
||||||
|
custom_meshtastic_display_name = Heltec Vision Master T190
|
||||||
|
custom_meshtastic_images = heltec-vision-master-t190.svg
|
||||||
|
custom_meshtastic_tags = Heltec
|
||||||
|
custom_meshtastic_requires_dfu = true
|
||||||
|
custom_meshtastic_partition_scheme = 8MB
|
||||||
|
|
||||||
extends = esp32s3_base
|
extends = esp32s3_base
|
||||||
board = heltec_vision_master_t190
|
board = heltec_vision_master_t190
|
||||||
board_build.partitions = default_8MB.csv
|
board_build.partitions = default_8MB.csv
|
||||||
|
|||||||
@@ -1,5 +1,15 @@
|
|||||||
; Using the original screen class
|
; Using the original screen class
|
||||||
[env:heltec-wireless-paper]
|
[env:heltec-wireless-paper]
|
||||||
|
custom_meshtastic_hw_model = 49
|
||||||
|
custom_meshtastic_hw_model_slug = HELTEC_WIRELESS_PAPER
|
||||||
|
custom_meshtastic_architecture = esp32-s3
|
||||||
|
custom_meshtastic_actively_supported = true
|
||||||
|
custom_meshtastic_support_level = 1
|
||||||
|
custom_meshtastic_display_name = Heltec Wireless Paper
|
||||||
|
custom_meshtastic_images = heltec-wireless-paper.svg
|
||||||
|
custom_meshtastic_tags = Heltec
|
||||||
|
custom_meshtastic_partition_scheme = 8MB
|
||||||
|
|
||||||
extends = esp32s3_base
|
extends = esp32s3_base
|
||||||
board = heltec_wifi_lora_32_V3
|
board = heltec_wifi_lora_32_V3
|
||||||
board_build.partitions = default_8MB.csv
|
board_build.partitions = default_8MB.csv
|
||||||
|
|||||||
@@ -1,4 +1,14 @@
|
|||||||
[env:heltec-wireless-paper-v1_0]
|
[env:heltec-wireless-paper-v1_0]
|
||||||
|
custom_meshtastic_hw_model = 57
|
||||||
|
custom_meshtastic_hw_model_slug = HELTEC_WIRELESS_PAPER_V1_0
|
||||||
|
custom_meshtastic_architecture = esp32-s3
|
||||||
|
custom_meshtastic_actively_supported = false
|
||||||
|
custom_meshtastic_support_level = 3
|
||||||
|
custom_meshtastic_display_name = Heltec Wireless Paper V1.0
|
||||||
|
custom_meshtastic_images = heltec-wireless-paper-v1_0.svg
|
||||||
|
custom_meshtastic_tags = Heltec
|
||||||
|
custom_meshtastic_partition_scheme = 8MB
|
||||||
|
|
||||||
extends = esp32s3_base
|
extends = esp32s3_base
|
||||||
board_level = extra
|
board_level = extra
|
||||||
board = heltec_wifi_lora_32_V3
|
board = heltec_wifi_lora_32_V3
|
||||||
|
|||||||
@@ -1,4 +1,15 @@
|
|||||||
[env:heltec-wireless-tracker]
|
[env:heltec-wireless-tracker]
|
||||||
|
custom_meshtastic_hw_model = 48
|
||||||
|
custom_meshtastic_hw_model_slug = HELTEC_WIRELESS_TRACKER
|
||||||
|
custom_meshtastic_architecture = esp32-s3
|
||||||
|
custom_meshtastic_actively_supported = true
|
||||||
|
custom_meshtastic_support_level = 1
|
||||||
|
custom_meshtastic_display_name = Heltec Wireless Tracker V1.1
|
||||||
|
custom_meshtastic_images = heltec-wireless-tracker.svg
|
||||||
|
custom_meshtastic_tags = Heltec
|
||||||
|
custom_meshtastic_requires_dfu = true
|
||||||
|
custom_meshtastic_partition_scheme = 8MB
|
||||||
|
|
||||||
extends = esp32s3_base
|
extends = esp32s3_base
|
||||||
board = heltec_wireless_tracker
|
board = heltec_wireless_tracker
|
||||||
board_build.partitions = default_8MB.csv
|
board_build.partitions = default_8MB.csv
|
||||||
|
|||||||
@@ -1,4 +1,14 @@
|
|||||||
[env:heltec-wireless-tracker-V1-0]
|
[env:heltec-wireless-tracker-V1-0]
|
||||||
|
custom_meshtastic_hw_model = 58
|
||||||
|
custom_meshtastic_hw_model_slug = HELTEC_WIRELESS_TRACKER_V1_0
|
||||||
|
custom_meshtastic_architecture = esp32-s3
|
||||||
|
custom_meshtastic_actively_supported = false
|
||||||
|
custom_meshtastic_support_level = 3
|
||||||
|
custom_meshtastic_display_name = Heltec Wireless Tracker V1.0
|
||||||
|
custom_meshtastic_images = heltec-wireless-tracker.svg
|
||||||
|
custom_meshtastic_requires_dfu = true
|
||||||
|
custom_meshtastic_partition_scheme = 8MB
|
||||||
|
|
||||||
extends = esp32s3_base
|
extends = esp32s3_base
|
||||||
board_level = extra
|
board_level = extra
|
||||||
board = heltec_wireless_tracker
|
board = heltec_wireless_tracker
|
||||||
|
|||||||
@@ -73,7 +73,29 @@
|
|||||||
#define SX126X_DIO2_AS_RF_SWITCH
|
#define SX126X_DIO2_AS_RF_SWITCH
|
||||||
#define SX126X_DIO3_TCXO_VOLTAGE 1.8
|
#define SX126X_DIO3_TCXO_VOLTAGE 1.8
|
||||||
|
|
||||||
#define USE_GC1109_PA // We have a GC1109 power amplifier+attenuator
|
// ---- GC1109 RF FRONT END CONFIGURATION ----
|
||||||
#define LORA_PA_POWER 7 // power en
|
// The Heltec Wireless Tracker V2 uses a GC1109 FEM chip with integrated PA and LNA
|
||||||
#define LORA_PA_EN 4
|
// RF path: SX1262 -> GC1109 PA -> Pi attenuator -> Antenna
|
||||||
#define LORA_PA_TX_EN 46 // enable tx
|
// Measured net TX gain (non-linear due to PA compression):
|
||||||
|
// +11dB at 0-15dBm input (e.g., 10dBm in -> 21dBm out)
|
||||||
|
// +10dB at 16-17dBm input
|
||||||
|
// +9dB at 18-19dBm input
|
||||||
|
// +7dB at 21dBm input (e.g., 21dBm in -> 28dBm out max)
|
||||||
|
// Control logic (from GC1109 datasheet):
|
||||||
|
// Shutdown: CSD=0, CTX=X, CPS=X
|
||||||
|
// Receive LNA: CSD=1, CTX=0, CPS=X (17dB gain, 2dB NF)
|
||||||
|
// Transmit bypass: CSD=1, CTX=1, CPS=0 (~1dB loss, no PA)
|
||||||
|
// Transmit PA: CSD=1, CTX=1, CPS=1 (full PA enabled)
|
||||||
|
// Pin mapping:
|
||||||
|
// CTX (pin 6) -> SX1262 DIO2: TX/RX path select (automatic via SX126X_DIO2_AS_RF_SWITCH)
|
||||||
|
// CSD (pin 4) -> GPIO4: Chip enable (HIGH=on, LOW=shutdown)
|
||||||
|
// CPS (pin 5) -> GPIO46: PA mode select (HIGH=full PA, LOW=bypass)
|
||||||
|
// VCC0/VCC1 -> Vfem via U3 LDO, controlled by GPIO7
|
||||||
|
#define USE_GC1109_PA
|
||||||
|
#define LORA_PA_POWER 7 // VFEM_Ctrl - GC1109 LDO power enable
|
||||||
|
#define LORA_PA_EN 4 // CSD - GC1109 chip enable (HIGH=on)
|
||||||
|
#define LORA_PA_TX_EN 46 // CPS - GC1109 PA mode (HIGH=full PA, LOW=bypass)
|
||||||
|
|
||||||
|
// GC1109 FEM: TX/RX path switching is handled by DIO2 -> CTX pin (via SX126X_DIO2_AS_RF_SWITCH)
|
||||||
|
// GPIO46 is CPS (PA mode), not TX control - setTransmitEnable() handles it in SX126xInterface.cpp
|
||||||
|
// Do NOT use SX126X_TXEN/RXEN as that would cause double-control of GPIO46
|
||||||
@@ -1,4 +1,14 @@
|
|||||||
[env:heltec-wsl-v3]
|
[env:heltec-wsl-v3]
|
||||||
|
custom_meshtastic_hw_model = 44
|
||||||
|
custom_meshtastic_hw_model_slug = HELTEC_WSL_V3
|
||||||
|
custom_meshtastic_architecture = esp32-s3
|
||||||
|
custom_meshtastic_actively_supported = true
|
||||||
|
custom_meshtastic_support_level = 1
|
||||||
|
custom_meshtastic_display_name = Heltec Wireless Stick Lite V3
|
||||||
|
custom_meshtastic_images = heltec-wsl-v3.svg
|
||||||
|
custom_meshtastic_tags = Heltec
|
||||||
|
custom_meshtastic_partition_scheme = 8MB
|
||||||
|
|
||||||
extends = esp32s3_base
|
extends = esp32s3_base
|
||||||
board = heltec_wifi_lora_32_V3
|
board = heltec_wifi_lora_32_V3
|
||||||
board_build.partitions = default_8MB.csv
|
board_build.partitions = default_8MB.csv
|
||||||
|
|||||||
@@ -1,4 +1,12 @@
|
|||||||
[env:picomputer-s3]
|
[env:picomputer-s3]
|
||||||
|
custom_meshtastic_hw_model = 52
|
||||||
|
custom_meshtastic_hw_model_slug = PICOMPUTER_S3
|
||||||
|
custom_meshtastic_architecture = esp32-s3
|
||||||
|
custom_meshtastic_actively_supported = true
|
||||||
|
custom_meshtastic_support_level = 3
|
||||||
|
custom_meshtastic_display_name = Pi Computer S3
|
||||||
|
custom_meshtastic_partition_scheme = 8MB
|
||||||
|
|
||||||
extends = esp32s3_base
|
extends = esp32s3_base
|
||||||
board = bpi_picow_esp32_s3
|
board = bpi_picow_esp32_s3
|
||||||
board_check = true
|
board_check = true
|
||||||
|
|||||||
@@ -1,4 +1,15 @@
|
|||||||
[env:rak3312]
|
[env:rak3312]
|
||||||
|
custom_meshtastic_hw_model = 106
|
||||||
|
custom_meshtastic_hw_model_slug = RAK3312
|
||||||
|
custom_meshtastic_architecture = esp32-s3
|
||||||
|
custom_meshtastic_actively_supported = true
|
||||||
|
custom_meshtastic_support_level = 1
|
||||||
|
custom_meshtastic_display_name = RAK3312
|
||||||
|
custom_meshtastic_images = rak_3312.svg
|
||||||
|
custom_meshtastic_tags = RAK
|
||||||
|
custom_meshtastic_requires_dfu = false
|
||||||
|
custom_meshtastic_partition_scheme = 16MB
|
||||||
|
|
||||||
extends = esp32s3_base
|
extends = esp32s3_base
|
||||||
board = wiscore_rak3312
|
board = wiscore_rak3312
|
||||||
board_level = pr
|
board_level = pr
|
||||||
|
|||||||
@@ -1,5 +1,16 @@
|
|||||||
; Seeed Studio SenseCAP Indicator
|
; Seeed Studio SenseCAP Indicator
|
||||||
[env:seeed-sensecap-indicator]
|
[env:seeed-sensecap-indicator]
|
||||||
|
custom_meshtastic_hw_model = 70
|
||||||
|
custom_meshtastic_hw_model_slug = SENSECAP_INDICATOR
|
||||||
|
custom_meshtastic_architecture = esp32-s3
|
||||||
|
custom_meshtastic_actively_supported = true
|
||||||
|
custom_meshtastic_support_level = 1
|
||||||
|
custom_meshtastic_display_name = Seeed SenseCAP Indicator
|
||||||
|
custom_meshtastic_images = seeed-sensecap-indicator.svg
|
||||||
|
custom_meshtastic_tags = Seeed
|
||||||
|
custom_meshtastic_partition_scheme = 8MB
|
||||||
|
= true
|
||||||
|
|
||||||
extends = esp32s3_base
|
extends = esp32s3_base
|
||||||
platform_packages =
|
platform_packages =
|
||||||
platformio/framework-arduinoespressif32 @ https://github.com/mverch67/arduino-esp32/archive/aef7fef6de3329ed6f75512d46d63bba12b09bb5.zip ; add_tca9535 (based on 2.0.16)
|
platformio/framework-arduinoespressif32 @ https://github.com/mverch67/arduino-esp32/archive/aef7fef6de3329ed6f75512d46d63bba12b09bb5.zip ; add_tca9535 (based on 2.0.16)
|
||||||
|
|||||||
@@ -1,4 +1,15 @@
|
|||||||
[env:seeed-xiao-s3]
|
[env:seeed-xiao-s3]
|
||||||
|
custom_meshtastic_hw_model = 81
|
||||||
|
custom_meshtastic_hw_model_slug = SEEED_XIAO_S3
|
||||||
|
custom_meshtastic_architecture = esp32-s3
|
||||||
|
custom_meshtastic_actively_supported = true
|
||||||
|
custom_meshtastic_support_level = 3
|
||||||
|
custom_meshtastic_display_name = Seeed Xiao ESP32-S3
|
||||||
|
custom_meshtastic_images = seeed-xiao-s3.svg
|
||||||
|
custom_meshtastic_tags = Seeed
|
||||||
|
custom_meshtastic_requires_dfu = true
|
||||||
|
custom_meshtastic_partition_scheme = 8MB
|
||||||
|
|
||||||
extends = esp32s3_base
|
extends = esp32s3_base
|
||||||
board = seeed-xiao-s3
|
board = seeed-xiao-s3
|
||||||
board_level = pr
|
board_level = pr
|
||||||
|
|||||||
@@ -1,4 +1,15 @@
|
|||||||
[env:station-g2]
|
[env:station-g2]
|
||||||
|
custom_meshtastic_hw_model = 31
|
||||||
|
custom_meshtastic_hw_model_slug = STATION_G2
|
||||||
|
custom_meshtastic_architecture = esp32-s3
|
||||||
|
custom_meshtastic_actively_supported = true
|
||||||
|
custom_meshtastic_support_level = 2
|
||||||
|
custom_meshtastic_display_name = Station G2
|
||||||
|
custom_meshtastic_images = station-g2.svg
|
||||||
|
custom_meshtastic_tags = B&Q
|
||||||
|
custom_meshtastic_requires_dfu = true
|
||||||
|
custom_meshtastic_partition_scheme = 16MB
|
||||||
|
|
||||||
extends = esp32s3_base
|
extends = esp32s3_base
|
||||||
board = station-g2
|
board = station-g2
|
||||||
board_level = pr
|
board_level = pr
|
||||||
|
|||||||
@@ -1,4 +1,15 @@
|
|||||||
[env:t-deck-pro]
|
[env:t-deck-pro]
|
||||||
|
custom_meshtastic_hw_model = 102
|
||||||
|
custom_meshtastic_hw_model_slug = T_DECK_PRO
|
||||||
|
custom_meshtastic_architecture = esp32-s3
|
||||||
|
custom_meshtastic_actively_supported = true
|
||||||
|
custom_meshtastic_support_level = 1
|
||||||
|
custom_meshtastic_display_name = LILYGO T-Deck Pro
|
||||||
|
custom_meshtastic_images = tdeck_pro.svg
|
||||||
|
custom_meshtastic_tags = LilyGo
|
||||||
|
custom_meshtastic_requires_dfu = true
|
||||||
|
custom_meshtastic_partition_scheme = 16MB
|
||||||
|
|
||||||
extends = esp32s3_base
|
extends = esp32s3_base
|
||||||
board = t-deck-pro
|
board = t-deck-pro
|
||||||
board_check = true
|
board_check = true
|
||||||
|
|||||||
@@ -1,5 +1,16 @@
|
|||||||
; LilyGo T-Deck
|
; LilyGo T-Deck
|
||||||
[env:t-deck]
|
[env:t-deck]
|
||||||
|
custom_meshtastic_hw_model = 50
|
||||||
|
custom_meshtastic_hw_model_slug = T_DECK
|
||||||
|
custom_meshtastic_architecture = esp32-s3
|
||||||
|
custom_meshtastic_actively_supported = true
|
||||||
|
custom_meshtastic_support_level = 1
|
||||||
|
custom_meshtastic_display_name = LILYGO T-Deck
|
||||||
|
custom_meshtastic_images = t-deck.svg
|
||||||
|
custom_meshtastic_tags = LilyGo
|
||||||
|
custom_meshtastic_requires_dfu = true
|
||||||
|
custom_meshtastic_partition_scheme = 16MB
|
||||||
|
|
||||||
extends = esp32s3_base
|
extends = esp32s3_base
|
||||||
board = t-deck
|
board = t-deck
|
||||||
board_check = true
|
board_check = true
|
||||||
|
|||||||
@@ -1,5 +1,15 @@
|
|||||||
; LilyGo T-Watch S3
|
; LilyGo T-Watch S3
|
||||||
[env:t-watch-s3]
|
[env:t-watch-s3]
|
||||||
|
custom_meshtastic_hw_model = 51
|
||||||
|
custom_meshtastic_hw_model_slug = T_WATCH_S3
|
||||||
|
custom_meshtastic_architecture = esp32-s3
|
||||||
|
custom_meshtastic_actively_supported = true
|
||||||
|
custom_meshtastic_support_level = 3
|
||||||
|
custom_meshtastic_display_name = LILYGO T-Watch S3
|
||||||
|
custom_meshtastic_images = t-watch-s3.svg
|
||||||
|
custom_meshtastic_tags = LilyGo
|
||||||
|
custom_meshtastic_partition_scheme = 8MB
|
||||||
|
|
||||||
extends = esp32s3_base
|
extends = esp32s3_base
|
||||||
board = t-watch-s3
|
board = t-watch-s3
|
||||||
board_check = true
|
board_check = true
|
||||||
|
|||||||
@@ -1,5 +1,16 @@
|
|||||||
; The 1.0 release of the LilyGo TBEAM-S3-Core board
|
; The 1.0 release of the LilyGo TBEAM-S3-Core board
|
||||||
[env:tbeam-s3-core]
|
[env:tbeam-s3-core]
|
||||||
|
custom_meshtastic_hw_model = 12
|
||||||
|
custom_meshtastic_hw_model_slug = LILYGO_TBEAM_S3_CORE
|
||||||
|
custom_meshtastic_architecture = esp32-s3
|
||||||
|
custom_meshtastic_actively_supported = true
|
||||||
|
custom_meshtastic_support_level = 1
|
||||||
|
custom_meshtastic_display_name = LILYGO T-Beam Supreme
|
||||||
|
custom_meshtastic_images = tbeam-s3-core.svg
|
||||||
|
custom_meshtastic_tags = LilyGo
|
||||||
|
custom_meshtastic_requires_dfu = true
|
||||||
|
custom_meshtastic_partition_scheme = 8MB
|
||||||
|
|
||||||
extends = esp32s3_base
|
extends = esp32s3_base
|
||||||
board = tbeam-s3-core
|
board = tbeam-s3-core
|
||||||
board_build.partitions = default_8MB.csv
|
board_build.partitions = default_8MB.csv
|
||||||
|
|||||||
@@ -1,5 +1,16 @@
|
|||||||
; LilyGo T-Lora-Pager
|
; LilyGo T-Lora-Pager
|
||||||
[env:tlora-pager]
|
[env:tlora-pager]
|
||||||
|
custom_meshtastic_hw_model = 103
|
||||||
|
custom_meshtastic_hw_model_slug = T_LORA_PAGER
|
||||||
|
custom_meshtastic_architecture = esp32-s3
|
||||||
|
custom_meshtastic_actively_supported = true
|
||||||
|
custom_meshtastic_support_level = 1
|
||||||
|
custom_meshtastic_display_name = LILYGO T-LoRa Pager
|
||||||
|
custom_meshtastic_images = lilygo-tlora-pager.svg
|
||||||
|
custom_meshtastic_tags = LilyGo
|
||||||
|
custom_meshtastic_requires_dfu = true
|
||||||
|
custom_meshtastic_partition_scheme = 16MB
|
||||||
|
|
||||||
extends = esp32s3_base
|
extends = esp32s3_base
|
||||||
board = t-deck-pro ; same as T-Deck Pro
|
board = t-deck-pro ; same as T-Deck Pro
|
||||||
board_check = true
|
board_check = true
|
||||||
|
|||||||
@@ -1,4 +1,14 @@
|
|||||||
[env:tlora-t3s3-epaper]
|
[env:tlora-t3s3-epaper]
|
||||||
|
custom_meshtastic_hw_model = 16
|
||||||
|
custom_meshtastic_hw_model_slug = TLORA_T3_S3
|
||||||
|
custom_meshtastic_architecture = esp32-s3
|
||||||
|
custom_meshtastic_actively_supported = true
|
||||||
|
custom_meshtastic_support_level = 1
|
||||||
|
custom_meshtastic_display_name = LILYGO T-LoRa T3-S3 E-Ink
|
||||||
|
custom_meshtastic_images = tlora-t3s3-epaper.svg
|
||||||
|
custom_meshtastic_tags = LilyGo
|
||||||
|
custom_meshtastic_requires_dfu = true
|
||||||
|
|
||||||
extends = esp32s3_base
|
extends = esp32s3_base
|
||||||
board = tlora-t3s3-v1
|
board = tlora-t3s3-v1
|
||||||
board_check = true
|
board_check = true
|
||||||
|
|||||||
@@ -1,4 +1,14 @@
|
|||||||
[env:tlora-t3s3-v1]
|
[env:tlora-t3s3-v1]
|
||||||
|
custom_meshtastic_hw_model = 16
|
||||||
|
custom_meshtastic_hw_model_slug = TLORA_T3_S3
|
||||||
|
custom_meshtastic_architecture = esp32-s3
|
||||||
|
custom_meshtastic_actively_supported = true
|
||||||
|
custom_meshtastic_support_level = 1
|
||||||
|
custom_meshtastic_display_name = LILYGO T-LoRa T3-S3
|
||||||
|
custom_meshtastic_images = tlora-t3s3-v1.svg
|
||||||
|
custom_meshtastic_tags = LilyGo
|
||||||
|
custom_meshtastic_requires_dfu = true
|
||||||
|
|
||||||
extends = esp32s3_base
|
extends = esp32s3_base
|
||||||
board = tlora-t3s3-v1
|
board = tlora-t3s3-v1
|
||||||
board_check = true
|
board_check = true
|
||||||
|
|||||||
@@ -1,4 +1,13 @@
|
|||||||
[env:tracksenger]
|
[env:tracksenger]
|
||||||
|
custom_meshtastic_hw_model = 48
|
||||||
|
custom_meshtastic_hw_model_slug = HELTEC_WIRELESS_TRACKER
|
||||||
|
custom_meshtastic_architecture = esp32-s3
|
||||||
|
custom_meshtastic_actively_supported = true
|
||||||
|
custom_meshtastic_support_level = 3
|
||||||
|
custom_meshtastic_display_name = TrackSenger (small TFT)
|
||||||
|
custom_meshtastic_requires_dfu = true
|
||||||
|
custom_meshtastic_partition_scheme = 8MB
|
||||||
|
|
||||||
extends = esp32s3_base
|
extends = esp32s3_base
|
||||||
board = heltec_wireless_tracker
|
board = heltec_wireless_tracker
|
||||||
board_build.partitions = default_8MB.csv
|
board_build.partitions = default_8MB.csv
|
||||||
@@ -16,6 +25,15 @@ lib_deps =
|
|||||||
lovyan03/LovyanGFX@1.2.7
|
lovyan03/LovyanGFX@1.2.7
|
||||||
|
|
||||||
[env:tracksenger-lcd]
|
[env:tracksenger-lcd]
|
||||||
|
custom_meshtastic_hw_model = 48
|
||||||
|
custom_meshtastic_hw_model_slug = HELTEC_WIRELESS_TRACKER
|
||||||
|
custom_meshtastic_architecture = esp32-s3
|
||||||
|
custom_meshtastic_actively_supported = false
|
||||||
|
custom_meshtastic_support_level = 3
|
||||||
|
custom_meshtastic_display_name = TrackSenger (big TFT)
|
||||||
|
custom_meshtastic_requires_dfu = true
|
||||||
|
custom_meshtastic_partition_scheme = 8MB
|
||||||
|
|
||||||
extends = esp32s3_base
|
extends = esp32s3_base
|
||||||
board = heltec_wireless_tracker
|
board = heltec_wireless_tracker
|
||||||
board_build.partitions = default_8MB.csv
|
board_build.partitions = default_8MB.csv
|
||||||
@@ -33,6 +51,14 @@ lib_deps =
|
|||||||
lovyan03/LovyanGFX@1.2.7
|
lovyan03/LovyanGFX@1.2.7
|
||||||
|
|
||||||
[env:tracksenger-oled]
|
[env:tracksenger-oled]
|
||||||
|
custom_meshtastic_hw_model = 48
|
||||||
|
custom_meshtastic_hw_model_slug = HELTEC_WIRELESS_TRACKER
|
||||||
|
custom_meshtastic_architecture = esp32-s3
|
||||||
|
custom_meshtastic_actively_supported = true
|
||||||
|
custom_meshtastic_support_level = 3
|
||||||
|
custom_meshtastic_display_name = TrackSenger (big OLED)
|
||||||
|
custom_meshtastic_partition_scheme = 8MB
|
||||||
|
|
||||||
extends = esp32s3_base
|
extends = esp32s3_base
|
||||||
board = heltec_wireless_tracker
|
board = heltec_wireless_tracker
|
||||||
board_build.partitions = default_8MB.csv
|
board_build.partitions = default_8MB.csv
|
||||||
|
|||||||
@@ -1,6 +1,15 @@
|
|||||||
; platformio.ini for unphone meshtastic
|
; platformio.ini for unphone meshtastic
|
||||||
|
|
||||||
[env:unphone]
|
[env:unphone]
|
||||||
|
custom_meshtastic_hw_model = 59
|
||||||
|
custom_meshtastic_hw_model_slug = UNPHONE
|
||||||
|
custom_meshtastic_architecture = esp32-s3
|
||||||
|
custom_meshtastic_actively_supported = true
|
||||||
|
custom_meshtastic_support_level = 3
|
||||||
|
custom_meshtastic_display_name = unPhone
|
||||||
|
custom_meshtastic_requires_dfu = true
|
||||||
|
custom_meshtastic_partition_scheme = 8MB
|
||||||
|
|
||||||
extends = esp32s3_base
|
extends = esp32s3_base
|
||||||
board = unphone
|
board = unphone
|
||||||
board_build.partitions = partition-table-8MB.csv
|
board_build.partitions = partition-table-8MB.csv
|
||||||
|
|||||||
@@ -2,9 +2,6 @@
|
|||||||
extends = portduino_base
|
extends = portduino_base
|
||||||
build_flags = ${portduino_base.build_flags} -I variants/native/portduino
|
build_flags = ${portduino_base.build_flags} -I variants/native/portduino
|
||||||
-I /usr/include
|
-I /usr/include
|
||||||
-I /opt/homebrew/include
|
|
||||||
-L /opt/homebrew/lib -largp
|
|
||||||
-DUSE_ADAPTIVE_CODING_RATE
|
|
||||||
board = cross_platform
|
board = cross_platform
|
||||||
board_level = extra
|
board_level = extra
|
||||||
lib_deps =
|
lib_deps =
|
||||||
@@ -12,11 +9,6 @@ lib_deps =
|
|||||||
# renovate: datasource=custom.pio depName=Melopero RV3028 packageName=melopero/library/Melopero RV3028
|
# renovate: datasource=custom.pio depName=Melopero RV3028 packageName=melopero/library/Melopero RV3028
|
||||||
melopero/Melopero RV3028@1.2.0
|
melopero/Melopero RV3028@1.2.0
|
||||||
|
|
||||||
; Disable LovyanGFX for native test builds to avoid missing macOS system headers
|
|
||||||
lib_ignore =
|
|
||||||
${portduino_base.lib_ignore}
|
|
||||||
LovyanGFX
|
|
||||||
|
|
||||||
build_src_filter = ${portduino_base.build_src_filter}
|
build_src_filter = ${portduino_base.build_src_filter}
|
||||||
|
|
||||||
[env:native]
|
[env:native]
|
||||||
|
|||||||
@@ -1,5 +1,14 @@
|
|||||||
; First prototype eink/nrf52840/sx1262 device
|
; First prototype eink/nrf52840/sx1262 device
|
||||||
[env:thinknode_m1]
|
[env:thinknode_m1]
|
||||||
|
custom_meshtastic_hw_model = 89
|
||||||
|
custom_meshtastic_hw_model_slug = THINKNODE_M1
|
||||||
|
custom_meshtastic_architecture = nrf52840
|
||||||
|
custom_meshtastic_actively_supported = true
|
||||||
|
custom_meshtastic_support_level = 1
|
||||||
|
custom_meshtastic_display_name = ThinkNode M1
|
||||||
|
custom_meshtastic_images = thinknode_m1.svg
|
||||||
|
custom_meshtastic_tags = Elecrow
|
||||||
|
|
||||||
extends = nrf52840_base
|
extends = nrf52840_base
|
||||||
board = ThinkNode-M1
|
board = ThinkNode-M1
|
||||||
board_check = true
|
board_check = true
|
||||||
|
|||||||
@@ -1,13 +1,21 @@
|
|||||||
[env:thinknode_m3]
|
[env:thinknode_m3]
|
||||||
|
custom_meshtastic_support_level = 1
|
||||||
|
custom_meshtastic_images = thinknode_m3.svg
|
||||||
|
custom_meshtastic_tags = Elecrow
|
||||||
|
|
||||||
extends = nrf52840_base
|
extends = nrf52840_base
|
||||||
board = ThinkNode-M3
|
board = ThinkNode-M3
|
||||||
board_check = true
|
board_check = true
|
||||||
debug_tool = jlink
|
debug_tool = jlink
|
||||||
|
custom_meshtastic_hw_model = 115
|
||||||
|
custom_meshtastic_hw_model_slug = THINKNODE_M3
|
||||||
|
custom_meshtastic_architecture = nrf52840
|
||||||
|
custom_meshtastic_display_name = Elecrow ThinkNode M3
|
||||||
|
custom_meshtastic_actively_supported = true
|
||||||
build_flags =
|
build_flags =
|
||||||
${nrf52840_base.build_flags}
|
${nrf52840_base.build_flags}
|
||||||
-Ivariants/nrf52840/ELECROW-ThinkNode-M3
|
-Ivariants/nrf52840/ELECROW-ThinkNode-M3
|
||||||
-DELECROW_ThinkNode_M3
|
-DELECROW_ThinkNode_M3
|
||||||
-DUSE_ADAPTIVE_CODING_RATE
|
|
||||||
-DGPS_POWER_TOGGLE
|
-DGPS_POWER_TOGGLE
|
||||||
-D CONFIG_NFCT_PINS_AS_GPIOS=1
|
-D CONFIG_NFCT_PINS_AS_GPIOS=1
|
||||||
-L "${platformio.libdeps_dir}/${this.__env__}/bsec2/src/cortex-m4/fpv4-sp-d16-hard"
|
-L "${platformio.libdeps_dir}/${this.__env__}/bsec2/src/cortex-m4/fpv4-sp-d16-hard"
|
||||||
|
|||||||
@@ -1,5 +1,14 @@
|
|||||||
; ThinkNode M6 - Outdoor Solar Power nrf52840/sx1262 device
|
; ThinkNode M6 - Outdoor Solar Power nrf52840/sx1262 device
|
||||||
[env:thinknode_m6]
|
[env:thinknode_m6]
|
||||||
|
custom_meshtastic_hw_model = 120
|
||||||
|
custom_meshtastic_hw_model_slug = THINKNODE_M6
|
||||||
|
custom_meshtastic_architecture = nrf52840
|
||||||
|
custom_meshtastic_actively_supported = false
|
||||||
|
custom_meshtastic_support_level = 1
|
||||||
|
custom_meshtastic_display_name = ThinkNode M6
|
||||||
|
custom_meshtastic_images = thinknode_m6.svg
|
||||||
|
custom_meshtastic_tags = Elecrow
|
||||||
|
|
||||||
extends = nrf52840_base
|
extends = nrf52840_base
|
||||||
board = ThinkNode-M6
|
board = ThinkNode-M6
|
||||||
board_check = true
|
board_check = true
|
||||||
|
|||||||
@@ -1,5 +1,13 @@
|
|||||||
; Public Beta oled/nrf52840/sx1262 device
|
; Public Beta oled/nrf52840/sx1262 device
|
||||||
[env:canaryone]
|
[env:canaryone]
|
||||||
|
custom_meshtastic_hw_model = 29
|
||||||
|
custom_meshtastic_hw_model_slug = CANARYONE
|
||||||
|
custom_meshtastic_architecture = nrf52840
|
||||||
|
custom_meshtastic_actively_supported = true
|
||||||
|
custom_meshtastic_support_level = 3
|
||||||
|
custom_meshtastic_display_name = Canary One
|
||||||
|
custom_meshtastic_tags = Canary
|
||||||
|
|
||||||
extends = nrf52840_base
|
extends = nrf52840_base
|
||||||
board = canaryone
|
board = canaryone
|
||||||
debug_tool = jlink
|
debug_tool = jlink
|
||||||
|
|||||||
@@ -1,5 +1,15 @@
|
|||||||
; Promicro + E22(0)-xxxM / HT-RA62 modules board variant - DIY - with TCXO
|
; Promicro + E22(0)-xxxM / HT-RA62 modules board variant - DIY - with TCXO
|
||||||
[env:nrf52_promicro_diy_tcxo]
|
[env:nrf52_promicro_diy_tcxo]
|
||||||
|
custom_meshtastic_hw_model = 63
|
||||||
|
custom_meshtastic_hw_model_slug = NRF52_PROMICRO_DIY
|
||||||
|
custom_meshtastic_architecture = nrf52840
|
||||||
|
custom_meshtastic_actively_supported = true
|
||||||
|
custom_meshtastic_support_level = 3
|
||||||
|
custom_meshtastic_display_name = NRF52 Pro-micro DIY
|
||||||
|
custom_meshtastic_images = promicro.svg
|
||||||
|
custom_meshtastic_tags = DIY
|
||||||
|
custom_meshtastic_requires_dfu = true
|
||||||
|
|
||||||
extends = nrf52840_base
|
extends = nrf52840_base
|
||||||
board = promicro-nrf52840
|
board = promicro-nrf52840
|
||||||
build_flags = ${nrf52840_base.build_flags}
|
build_flags = ${nrf52840_base.build_flags}
|
||||||
|
|||||||
@@ -1,5 +1,14 @@
|
|||||||
; First prototype nrf52840/sx1262 device
|
; First prototype nrf52840/sx1262 device
|
||||||
[env:heltec-mesh-node-t114]
|
[env:heltec-mesh-node-t114]
|
||||||
|
custom_meshtastic_hw_model = 69
|
||||||
|
custom_meshtastic_hw_model_slug = HELTEC_MESH_NODE_T114
|
||||||
|
custom_meshtastic_architecture = nrf52840
|
||||||
|
custom_meshtastic_actively_supported = true
|
||||||
|
custom_meshtastic_support_level = 1
|
||||||
|
custom_meshtastic_display_name = Heltec Mesh Node T114
|
||||||
|
custom_meshtastic_images = heltec-mesh-node-t114.svg, heltec-mesh-node-t114-case.svg
|
||||||
|
custom_meshtastic_tags = Heltec
|
||||||
|
|
||||||
extends = nrf52840_base
|
extends = nrf52840_base
|
||||||
board = heltec_mesh_node_t114
|
board = heltec_mesh_node_t114
|
||||||
board_level = pr
|
board_level = pr
|
||||||
|
|||||||
@@ -1,15 +1,26 @@
|
|||||||
; First prototype nrf52840/sx1262 device
|
; First prototype nrf52840/sx1262 device
|
||||||
[env:heltec-mesh-pocket-5000]
|
[env:heltec-mesh-pocket-5000]
|
||||||
|
custom_meshtastic_support_level = 1
|
||||||
|
custom_meshtastic_images = heltec_mesh_pocket.svg
|
||||||
|
custom_meshtastic_tags = Heltec
|
||||||
|
|
||||||
extends = nrf52840_base
|
extends = nrf52840_base
|
||||||
board = heltec_mesh_pocket
|
board = heltec_mesh_pocket
|
||||||
debug_tool = jlink
|
debug_tool = jlink
|
||||||
|
custom_device_hw_model = 94
|
||||||
|
custom_meshtastic_hw_model = 94
|
||||||
|
custom_meshtastic_hw_model_slug = HELTEC_MESH_POCKET
|
||||||
|
custom_meshtastic_architecture = nrf52840
|
||||||
|
custom_meshtastic_display_name = Heltec Mesh Pocket
|
||||||
|
custom_meshtastic_actively_supported = true
|
||||||
|
custom_meshtastic_variant = 5000mAh
|
||||||
|
custom_meshtastic_key = heltec_mesh_pocket
|
||||||
|
|
||||||
# add -DCFG_SYSVIEW if you want to use the Segger systemview tool for OS profiling.
|
# add -DCFG_SYSVIEW if you want to use the Segger systemview tool for OS profiling.
|
||||||
build_flags = ${nrf52840_base.build_flags}
|
build_flags = ${nrf52840_base.build_flags}
|
||||||
-Ivariants/nrf52840/heltec_mesh_pocket
|
-Ivariants/nrf52840/heltec_mesh_pocket
|
||||||
-DHELTEC_MESH_POCKET
|
-DHELTEC_MESH_POCKET
|
||||||
-DHELTEC_MESH_POCKET_BATTERY_5000
|
-DHELTEC_MESH_POCKET_BATTERY_5000
|
||||||
-DUSE_ADAPTIVE_CODING_RATE
|
|
||||||
-DUSE_EINK
|
-DUSE_EINK
|
||||||
-DEINK_DISPLAY_MODEL=GxEPD2_213_B74
|
-DEINK_DISPLAY_MODEL=GxEPD2_213_B74
|
||||||
-DEINK_WIDTH=250
|
-DEINK_WIDTH=250
|
||||||
@@ -32,6 +43,13 @@ lib_deps =
|
|||||||
[env:heltec-mesh-pocket-5000-inkhud]
|
[env:heltec-mesh-pocket-5000-inkhud]
|
||||||
extends = nrf52840_base, inkhud
|
extends = nrf52840_base, inkhud
|
||||||
board = heltec_mesh_pocket
|
board = heltec_mesh_pocket
|
||||||
|
custom_meshtastic_hw_model = 94
|
||||||
|
custom_meshtastic_hw_model_slug = HELTEC_MESH_POCKET
|
||||||
|
custom_meshtastic_architecture = nrf52840
|
||||||
|
custom_meshtastic_display_name = Heltec Mesh Pocket
|
||||||
|
custom_meshtastic_actively_supported = true
|
||||||
|
custom_meshtastic_variant = 5000mAh InkHUD
|
||||||
|
custom_meshtastic_key = heltec_mesh_pocket
|
||||||
build_src_filter = ${nrf52_base.build_src_filter} +<../variants/nrf52840/heltec_mesh_pocket> ${inkhud.build_src_filter}
|
build_src_filter = ${nrf52_base.build_src_filter} +<../variants/nrf52840/heltec_mesh_pocket> ${inkhud.build_src_filter}
|
||||||
build_flags =
|
build_flags =
|
||||||
${inkhud.build_flags}
|
${inkhud.build_flags}
|
||||||
@@ -39,7 +57,6 @@ build_flags =
|
|||||||
-I variants/nrf52840/heltec_mesh_pocket
|
-I variants/nrf52840/heltec_mesh_pocket
|
||||||
-D HELTEC_MESH_POCKET
|
-D HELTEC_MESH_POCKET
|
||||||
-D HELTEC_MESH_POCKET_BATTERY_5000
|
-D HELTEC_MESH_POCKET_BATTERY_5000
|
||||||
-DUSE_ADAPTIVE_CODING_RATE
|
|
||||||
lib_deps =
|
lib_deps =
|
||||||
${inkhud.lib_deps} ; InkHUD libs first, so we get GFXRoot instead of AdafruitGFX
|
${inkhud.lib_deps} ; InkHUD libs first, so we get GFXRoot instead of AdafruitGFX
|
||||||
${nrf52840_base.lib_deps}
|
${nrf52840_base.lib_deps}
|
||||||
@@ -47,16 +64,26 @@ lib_deps =
|
|||||||
|
|
||||||
; First prototype nrf52840/sx1262 device
|
; First prototype nrf52840/sx1262 device
|
||||||
[env:heltec-mesh-pocket-10000]
|
[env:heltec-mesh-pocket-10000]
|
||||||
|
custom_meshtastic_support_level = 1
|
||||||
|
custom_meshtastic_images = heltec_mesh_pocket.svg
|
||||||
|
custom_meshtastic_tags = Heltec
|
||||||
|
|
||||||
extends = nrf52840_base
|
extends = nrf52840_base
|
||||||
board = heltec_mesh_pocket
|
board = heltec_mesh_pocket
|
||||||
debug_tool = jlink
|
debug_tool = jlink
|
||||||
|
custom_meshtastic_hw_model = 94
|
||||||
|
custom_meshtastic_hw_model_slug = HELTEC_MESH_POCKET
|
||||||
|
custom_meshtastic_architecture = nrf52840
|
||||||
|
custom_meshtastic_display_name = Heltec Mesh Pocket
|
||||||
|
custom_meshtastic_actively_supported = true
|
||||||
|
custom_meshtastic_variant = 10000mAh
|
||||||
|
custom_meshtastic_key = heltec_mesh_pocket
|
||||||
|
|
||||||
# add -DCFG_SYSVIEW if you want to use the Segger systemview tool for OS profiling.
|
# add -DCFG_SYSVIEW if you want to use the Segger systemview tool for OS profiling.
|
||||||
build_flags = ${nrf52840_base.build_flags}
|
build_flags = ${nrf52840_base.build_flags}
|
||||||
-Ivariants/nrf52840/heltec_mesh_pocket
|
-Ivariants/nrf52840/heltec_mesh_pocket
|
||||||
-DHELTEC_MESH_POCKET
|
-DHELTEC_MESH_POCKET
|
||||||
-DHELTEC_MESH_POCKET_BATTERY_10000
|
-DHELTEC_MESH_POCKET_BATTERY_10000
|
||||||
-DUSE_ADAPTIVE_CODING_RATE
|
|
||||||
-DUSE_EINK
|
-DUSE_EINK
|
||||||
-DEINK_DISPLAY_MODEL=GxEPD2_213_B74
|
-DEINK_DISPLAY_MODEL=GxEPD2_213_B74
|
||||||
-DEINK_WIDTH=250
|
-DEINK_WIDTH=250
|
||||||
@@ -79,6 +106,13 @@ lib_deps =
|
|||||||
[env:heltec-mesh-pocket-10000-inkhud]
|
[env:heltec-mesh-pocket-10000-inkhud]
|
||||||
extends = nrf52840_base, inkhud
|
extends = nrf52840_base, inkhud
|
||||||
board = heltec_mesh_pocket
|
board = heltec_mesh_pocket
|
||||||
|
custom_meshtastic_hw_model = 94
|
||||||
|
custom_meshtastic_hw_model_slug = HELTEC_MESH_POCKET
|
||||||
|
custom_meshtastic_architecture = nrf52840
|
||||||
|
custom_meshtastic_display_name = Heltec Mesh Pocket
|
||||||
|
custom_meshtastic_actively_supported = true
|
||||||
|
custom_meshtastic_variant = 10000mAh InkHUD
|
||||||
|
custom_meshtastic_key = heltec_mesh_pocket
|
||||||
build_src_filter = ${nrf52_base.build_src_filter} +<../variants/nrf52840/heltec_mesh_pocket> ${inkhud.build_src_filter}
|
build_src_filter = ${nrf52_base.build_src_filter} +<../variants/nrf52840/heltec_mesh_pocket> ${inkhud.build_src_filter}
|
||||||
build_flags =
|
build_flags =
|
||||||
${inkhud.build_flags}
|
${inkhud.build_flags}
|
||||||
@@ -86,7 +120,6 @@ build_flags =
|
|||||||
-I variants/nrf52840/heltec_mesh_pocket
|
-I variants/nrf52840/heltec_mesh_pocket
|
||||||
-D HELTEC_MESH_POCKET
|
-D HELTEC_MESH_POCKET
|
||||||
-D HELTEC_MESH_POCKET_BATTERY_10000
|
-D HELTEC_MESH_POCKET_BATTERY_10000
|
||||||
-DUSE_ADAPTIVE_CODING_RATE
|
|
||||||
lib_deps =
|
lib_deps =
|
||||||
${inkhud.lib_deps} ; InkHUD libs first, so we get GFXRoot instead of AdafruitGFX
|
${inkhud.lib_deps} ; InkHUD libs first, so we get GFXRoot instead of AdafruitGFX
|
||||||
${nrf52840_base.lib_deps}
|
${nrf52840_base.lib_deps}
|
||||||
|
|||||||
@@ -19,6 +19,15 @@ lib_deps =
|
|||||||
bblanchon/ArduinoJson@6.21.4
|
bblanchon/ArduinoJson@6.21.4
|
||||||
|
|
||||||
[env:heltec-mesh-solar]
|
[env:heltec-mesh-solar]
|
||||||
|
custom_meshtastic_hw_model = 108
|
||||||
|
custom_meshtastic_hw_model_slug = HELTEC_MESH_SOLAR
|
||||||
|
custom_meshtastic_architecture = nrf52840
|
||||||
|
custom_meshtastic_actively_supported = false
|
||||||
|
custom_meshtastic_support_level = 1
|
||||||
|
custom_meshtastic_display_name = Heltec MeshSolar
|
||||||
|
custom_meshtastic_images = heltec-mesh-solar.svg
|
||||||
|
custom_meshtastic_tags = Heltec
|
||||||
|
|
||||||
extends = heltec_mesh_solar_base
|
extends = heltec_mesh_solar_base
|
||||||
build_flags = ${heltec_mesh_solar_base.build_flags}
|
build_flags = ${heltec_mesh_solar_base.build_flags}
|
||||||
-DSPI_INTERFACES_COUNT=1
|
-DSPI_INTERFACES_COUNT=1
|
||||||
|
|||||||
@@ -1,4 +1,13 @@
|
|||||||
[env:muzi-base]
|
[env:muzi-base]
|
||||||
|
custom_meshtastic_hw_model = 93
|
||||||
|
custom_meshtastic_hw_model_slug = MUZI_BASE
|
||||||
|
custom_meshtastic_architecture = nrf52840
|
||||||
|
custom_meshtastic_actively_supported = true
|
||||||
|
custom_meshtastic_support_level = 1
|
||||||
|
custom_meshtastic_display_name = muzi BASE
|
||||||
|
custom_meshtastic_images = muzi_base.svg
|
||||||
|
custom_meshtastic_tags = muzi
|
||||||
|
|
||||||
extends = nrf52840_base
|
extends = nrf52840_base
|
||||||
board = muzi-base
|
board = muzi-base
|
||||||
build_flags = ${nrf52840_base.build_flags}
|
build_flags = ${nrf52840_base.build_flags}
|
||||||
|
|||||||
@@ -1,5 +1,14 @@
|
|||||||
; First prototype eink/nrf52840/sx1262 device
|
; First prototype eink/nrf52840/sx1262 device
|
||||||
[env:nano-g2-ultra]
|
[env:nano-g2-ultra]
|
||||||
|
custom_meshtastic_hw_model = 18
|
||||||
|
custom_meshtastic_hw_model_slug = NANO_G2_ULTRA
|
||||||
|
custom_meshtastic_architecture = nrf52840
|
||||||
|
custom_meshtastic_actively_supported = true
|
||||||
|
custom_meshtastic_support_level = 2
|
||||||
|
custom_meshtastic_display_name = Nano G2 Ultra
|
||||||
|
custom_meshtastic_images = nano-g2-ultra.svg
|
||||||
|
custom_meshtastic_tags = B&Q
|
||||||
|
|
||||||
extends = nrf52840_base
|
extends = nrf52840_base
|
||||||
board = nano-g2-ultra
|
board = nano-g2-ultra
|
||||||
debug_tool = jlink
|
debug_tool = jlink
|
||||||
|
|||||||
@@ -1,5 +1,14 @@
|
|||||||
; The R1 Neo board
|
; The R1 Neo board
|
||||||
[env:r1-neo]
|
[env:r1-neo]
|
||||||
|
custom_meshtastic_hw_model = 101
|
||||||
|
custom_meshtastic_hw_model_slug = MUZI_R1_NEO
|
||||||
|
custom_meshtastic_architecture = nrf52840
|
||||||
|
custom_meshtastic_actively_supported = true
|
||||||
|
custom_meshtastic_support_level = 1
|
||||||
|
custom_meshtastic_display_name = muzi R1 Neo
|
||||||
|
custom_meshtastic_images = muzi_r1_neo.svg
|
||||||
|
custom_meshtastic_tags = muzi
|
||||||
|
|
||||||
extends = nrf52840_base
|
extends = nrf52840_base
|
||||||
board = r1-neo
|
board = r1-neo
|
||||||
board_check = true
|
board_check = true
|
||||||
|
|||||||
@@ -1,5 +1,14 @@
|
|||||||
; Firmware for the WisMesh HUB RAK2560, including a onewire module to talk to the RAK 9154 solar battery.
|
; Firmware for the WisMesh HUB RAK2560, including a onewire module to talk to the RAK 9154 solar battery.
|
||||||
[env:rak2560]
|
[env:rak2560]
|
||||||
|
custom_meshtastic_hw_model = 22
|
||||||
|
custom_meshtastic_hw_model_slug = WISMESH_HUB
|
||||||
|
custom_meshtastic_architecture = nrf52840
|
||||||
|
custom_meshtastic_actively_supported = true
|
||||||
|
custom_meshtastic_support_level = 1
|
||||||
|
custom_meshtastic_display_name = RAK WisMesh Repeater
|
||||||
|
custom_meshtastic_images = rak2560.svg
|
||||||
|
custom_meshtastic_tags = RAK
|
||||||
|
|
||||||
extends = nrf52840_base
|
extends = nrf52840_base
|
||||||
board = wiscore_rak4631
|
board = wiscore_rak4631
|
||||||
board_check = true
|
board_check = true
|
||||||
|
|||||||
@@ -1,5 +1,15 @@
|
|||||||
; The very slick RAK wireless RAK 4631 / 4630 board - Unified firmware for 5005/19003, with or without OLED RAK 1921
|
; The very slick RAK wireless RAK 4631 / 4630 board - Unified firmware for 5005/19003, with or without OLED RAK 1921
|
||||||
[env:rak3401-1watt]
|
[env:rak3401-1watt]
|
||||||
|
custom_meshtastic_hw_model = 117
|
||||||
|
custom_meshtastic_hw_model_slug = RAK3401
|
||||||
|
custom_meshtastic_architecture = nrf52840
|
||||||
|
custom_meshtastic_actively_supported = true
|
||||||
|
custom_meshtastic_support_level = 1
|
||||||
|
custom_meshtastic_display_name = RAK3401 1W
|
||||||
|
custom_meshtastic_images = rak3401.svg
|
||||||
|
custom_meshtastic_tags = RAK
|
||||||
|
custom_meshtastic_requires_dfu = true
|
||||||
|
|
||||||
extends = nrf52840_base
|
extends = nrf52840_base
|
||||||
board = wiscore_rak4631
|
board = wiscore_rak4631
|
||||||
board_check = true
|
board_check = true
|
||||||
|
|||||||
@@ -1,5 +1,14 @@
|
|||||||
; The very slick RAK wireless RAK 4631 / 4630 board - Unified firmware for 5005/19003, with or without OLED RAK 1921
|
; The very slick RAK wireless RAK 4631 / 4630 board - Unified firmware for 5005/19003, with or without OLED RAK 1921
|
||||||
[env:rak4631]
|
[env:rak4631]
|
||||||
|
custom_meshtastic_hw_model = 9
|
||||||
|
custom_meshtastic_hw_model_slug = RAK4631
|
||||||
|
custom_meshtastic_architecture = nrf52840
|
||||||
|
custom_meshtastic_actively_supported = true
|
||||||
|
custom_meshtastic_support_level = 1
|
||||||
|
custom_meshtastic_display_name = RAK WisBlock 4631
|
||||||
|
custom_meshtastic_images = rak4631.svg, rak4631_case.svg
|
||||||
|
custom_meshtastic_tags = RAK
|
||||||
|
|
||||||
extends = nrf52840_base
|
extends = nrf52840_base
|
||||||
board = wiscore_rak4631
|
board = wiscore_rak4631
|
||||||
board_level = pr
|
board_level = pr
|
||||||
|
|||||||
@@ -1,5 +1,14 @@
|
|||||||
; NomadStar Meteor Pro based on RAK4631 with RGBW LED LP5562 support
|
; NomadStar Meteor Pro based on RAK4631 with RGBW LED LP5562 support
|
||||||
[env:rak4631_nomadstar_meteor_pro]
|
[env:rak4631_nomadstar_meteor_pro]
|
||||||
|
custom_meshtastic_hw_model = 96
|
||||||
|
custom_meshtastic_hw_model_slug = NOMADSTAR_METEOR_PRO
|
||||||
|
custom_meshtastic_architecture = nrf52840
|
||||||
|
custom_meshtastic_actively_supported = true
|
||||||
|
custom_meshtastic_support_level = 1
|
||||||
|
custom_meshtastic_display_name = NomadStar Meteor Pro
|
||||||
|
custom_meshtastic_images = meteor_pro.svg
|
||||||
|
custom_meshtastic_tags = NomadStar
|
||||||
|
|
||||||
extends = nrf52840_base
|
extends = nrf52840_base
|
||||||
board = wiscore_rak4631
|
board = wiscore_rak4631
|
||||||
board_check = true
|
board_check = true
|
||||||
|
|||||||
@@ -1,13 +1,21 @@
|
|||||||
; The very slick RAK wireless RAK 4631 / 4630 board - Unified firmware for 5005/19003, with or without OLED RAK 1921
|
; The very slick RAK wireless RAK 4631 / 4630 board - Unified firmware for 5005/19003, with or without OLED RAK 1921
|
||||||
[env:rak_wismeshtag]
|
[env:rak_wismeshtag]
|
||||||
|
custom_meshtastic_support_level = 1
|
||||||
|
custom_meshtastic_images = rak_wismesh_tag.svg
|
||||||
|
custom_meshtastic_tags = RAK
|
||||||
|
|
||||||
extends = nrf52840_base
|
extends = nrf52840_base
|
||||||
board = wiscore_rak4631
|
board = wiscore_rak4631
|
||||||
board_check = true
|
board_check = true
|
||||||
|
custom_meshtastic_hw_model = 105
|
||||||
|
custom_meshtastic_hw_model_slug = WISMESH_TAG
|
||||||
|
custom_meshtastic_architecture = nrf52840
|
||||||
|
custom_meshtastic_display_name = RAK WisMesh Tag
|
||||||
|
custom_meshtastic_actively_supported = true
|
||||||
build_flags = ${nrf52840_base.build_flags}
|
build_flags = ${nrf52840_base.build_flags}
|
||||||
-I variants/nrf52840/rak_wismeshtag
|
-I variants/nrf52840/rak_wismeshtag
|
||||||
-D WISMESH_TAG
|
-D WISMESH_TAG
|
||||||
-D RAK_4631
|
-D RAK_4631
|
||||||
-DUSE_ADAPTIVE_CODING_RATE
|
|
||||||
-DRADIOLIB_EXCLUDE_SX128X=1
|
-DRADIOLIB_EXCLUDE_SX128X=1
|
||||||
-DRADIOLIB_EXCLUDE_SX127X=1
|
-DRADIOLIB_EXCLUDE_SX127X=1
|
||||||
-DRADIOLIB_EXCLUDE_LR11X0=1
|
-DRADIOLIB_EXCLUDE_LR11X0=1
|
||||||
|
|||||||
@@ -1,5 +1,14 @@
|
|||||||
; The very slick RAK wireless RAK10701 Field Tester device. Note you will have to flash to Arduino bootloader to use this firmware. Be aware touch is not currently working.
|
; The very slick RAK wireless RAK10701 Field Tester device. Note you will have to flash to Arduino bootloader to use this firmware. Be aware touch is not currently working.
|
||||||
[env:rak_wismeshtap]
|
[env:rak_wismeshtap]
|
||||||
|
custom_meshtastic_hw_model = 84
|
||||||
|
custom_meshtastic_hw_model_slug = WISMESH_TAP
|
||||||
|
custom_meshtastic_architecture = nrf52840
|
||||||
|
custom_meshtastic_actively_supported = true
|
||||||
|
custom_meshtastic_support_level = 1
|
||||||
|
custom_meshtastic_display_name = RAK WisMesh Tap
|
||||||
|
custom_meshtastic_images = rak-wismeshtap.svg
|
||||||
|
custom_meshtastic_tags = RAK
|
||||||
|
|
||||||
extends = nrf52840_base
|
extends = nrf52840_base
|
||||||
board = wiscore_rak4631
|
board = wiscore_rak4631
|
||||||
build_flags = ${nrf52840_base.build_flags}
|
build_flags = ${nrf52840_base.build_flags}
|
||||||
|
|||||||
@@ -1,4 +1,13 @@
|
|||||||
[env:seeed_solar_node]
|
[env:seeed_solar_node]
|
||||||
|
custom_meshtastic_hw_model = 95
|
||||||
|
custom_meshtastic_hw_model_slug = SEEED_SOLAR_NODE
|
||||||
|
custom_meshtastic_architecture = nrf52840
|
||||||
|
custom_meshtastic_actively_supported = true
|
||||||
|
custom_meshtastic_support_level = 1
|
||||||
|
custom_meshtastic_display_name = Seeed SenseCAP Solar Node
|
||||||
|
custom_meshtastic_images = seeed_solar.svg
|
||||||
|
custom_meshtastic_tags = Seeed
|
||||||
|
|
||||||
board = seeed_solar_node
|
board = seeed_solar_node
|
||||||
extends = nrf52840_base
|
extends = nrf52840_base
|
||||||
;board_level = extra
|
;board_level = extra
|
||||||
|
|||||||
@@ -1,4 +1,14 @@
|
|||||||
[env:seeed_wio_tracker_L1]
|
[env:seeed_wio_tracker_L1]
|
||||||
|
custom_meshtastic_hw_model = 99
|
||||||
|
custom_meshtastic_hw_model_slug = SEEED_WIO_TRACKER_L1
|
||||||
|
custom_meshtastic_architecture = nrf52840
|
||||||
|
custom_meshtastic_actively_supported = true
|
||||||
|
custom_meshtastic_support_level = 1
|
||||||
|
custom_meshtastic_display_name = Seeed Wio Tracker L1
|
||||||
|
custom_meshtastic_images = wio_tracker_l1_case.svg
|
||||||
|
custom_meshtastic_tags = Seeed
|
||||||
|
custom_meshtastic_requires_dfu = true
|
||||||
|
|
||||||
board = seeed_wio_tracker_L1
|
board = seeed_wio_tracker_L1
|
||||||
extends = nrf52840_base
|
extends = nrf52840_base
|
||||||
build_flags = ${nrf52840_base.build_flags}
|
build_flags = ${nrf52840_base.build_flags}
|
||||||
|
|||||||
@@ -1,4 +1,13 @@
|
|||||||
[env:seeed_wio_tracker_L1_eink]
|
[env:seeed_wio_tracker_L1_eink]
|
||||||
|
custom_meshtastic_hw_model = 100
|
||||||
|
custom_meshtastic_hw_model_slug = SEEED_WIO_TRACKER_L1_EINK
|
||||||
|
custom_meshtastic_architecture = nrf52840
|
||||||
|
custom_meshtastic_actively_supported = true
|
||||||
|
custom_meshtastic_support_level = 1
|
||||||
|
custom_meshtastic_display_name = Seeed Wio Tracker L1 E-Ink
|
||||||
|
custom_meshtastic_images = wio_tracker_l1_eink.svg
|
||||||
|
custom_meshtastic_tags = Seeed
|
||||||
|
|
||||||
board = seeed_wio_tracker_L1
|
board = seeed_wio_tracker_L1
|
||||||
extends = nrf52840_base
|
extends = nrf52840_base
|
||||||
;board_level = extra
|
;board_level = extra
|
||||||
|
|||||||
@@ -1,5 +1,14 @@
|
|||||||
; Seeed Xiao BLE: https://wiki.seeedstudio.com/XIAO_BLE/
|
; Seeed Xiao BLE: https://wiki.seeedstudio.com/XIAO_BLE/
|
||||||
[env:seeed_xiao_nrf52840_kit]
|
[env:seeed_xiao_nrf52840_kit]
|
||||||
|
custom_meshtastic_hw_model = 88
|
||||||
|
custom_meshtastic_hw_model_slug = XIAO_NRF52_KIT
|
||||||
|
custom_meshtastic_architecture = nrf52840
|
||||||
|
custom_meshtastic_actively_supported = true
|
||||||
|
custom_meshtastic_support_level = 1
|
||||||
|
custom_meshtastic_display_name = Seeed Xiao NRF52840 Kit
|
||||||
|
custom_meshtastic_images = seeed_xiao_nrf52_kit.svg
|
||||||
|
custom_meshtastic_tags = Seeed
|
||||||
|
|
||||||
extends = nrf52840_base
|
extends = nrf52840_base
|
||||||
board = xiao_ble_sense
|
board = xiao_ble_sense
|
||||||
board_level = pr
|
board_level = pr
|
||||||
|
|||||||
@@ -1,5 +1,14 @@
|
|||||||
; Using original screen class
|
; Using original screen class
|
||||||
[env:t-echo-lite]
|
[env:t-echo-lite]
|
||||||
|
custom_meshtastic_hw_model = 109
|
||||||
|
custom_meshtastic_hw_model_slug = T_ECHO_LITE
|
||||||
|
custom_meshtastic_architecture = nrf52840
|
||||||
|
custom_meshtastic_actively_supported = false
|
||||||
|
custom_meshtastic_support_level = 1
|
||||||
|
custom_meshtastic_display_name = LILYGO T-Echo Lite
|
||||||
|
custom_meshtastic_images = techo_lite.svg
|
||||||
|
custom_meshtastic_tags = LilyGo
|
||||||
|
|
||||||
extends = nrf52840_base
|
extends = nrf52840_base
|
||||||
board = t-echo
|
board = t-echo
|
||||||
board_check = true
|
board_check = true
|
||||||
|
|||||||
@@ -1,5 +1,14 @@
|
|||||||
; Using original screen class
|
; Using original screen class
|
||||||
[env:t-echo]
|
[env:t-echo]
|
||||||
|
custom_meshtastic_hw_model = 7
|
||||||
|
custom_meshtastic_hw_model_slug = T_ECHO
|
||||||
|
custom_meshtastic_architecture = nrf52840
|
||||||
|
custom_meshtastic_actively_supported = true
|
||||||
|
custom_meshtastic_support_level = 1
|
||||||
|
custom_meshtastic_display_name = LILYGO T-Echo
|
||||||
|
custom_meshtastic_images = t-echo.svg
|
||||||
|
custom_meshtastic_tags = LilyGo
|
||||||
|
|
||||||
extends = nrf52840_base
|
extends = nrf52840_base
|
||||||
board = t-echo
|
board = t-echo
|
||||||
board_level = pr
|
board_level = pr
|
||||||
|
|||||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user