mirror of
https://github.com/meshtastic/firmware.git
synced 2026-08-01 02:48:49 -04:00
Merge branch 'develop' into feature/surgical-ci
Resolves conflicts from #11305 which made board_level explicit. - Keep PR's sophisticated select_changed logic in generate_ci_matrix.py - Update EMITTABLE_LEVELS to use 'release' instead of None - Add board_level validation in load_all_envs (fail fast on missing/unknown levels) - Update build_outlist to match 'release' explicitly instead of not-set - Update tests to use level='release' for release boards - Accept auto-merged board_level = release additions to ~100 variant files
This commit is contained in:
18
.github/copilot-instructions.md
vendored
18
.github/copilot-instructions.md
vendored
@@ -557,8 +557,9 @@ pio run -e native-macos # Build headless macOS meshtasticd (Homebrew prere
|
||||
1. Create directory under `variants/<arch>/<name>/`
|
||||
2. Add `variant.h` with pin definitions and hardware capability defines
|
||||
3. Add `platformio.ini` with build config - use `extends` to reference common base (e.g., `esp32s3_base`)
|
||||
4. Set `custom_meshtastic_support_level = 1` (PR builds) or `2` (merge builds)
|
||||
5. For e-ink displays, add `nicheGraphics.h` for InkHUD configuration
|
||||
4. Set `board_level` (required - `release` for a normal variant; see "Build Matrix Generation")
|
||||
5. Set `custom_meshtastic_support_level` (1-3) and the other `custom_meshtastic_*` metadata
|
||||
6. For e-ink displays, add `nicheGraphics.h` for InkHUD configuration
|
||||
|
||||
### Adding a New Telemetry Sensor
|
||||
|
||||
@@ -642,11 +643,16 @@ The CI uses `bin/generate_ci_matrix.py` to dynamically select which targets to b
|
||||
./bin/generate_ci_matrix.py all --level pr
|
||||
```
|
||||
|
||||
Variants can specify their support level in `platformio.ini`:
|
||||
Every variant env **must** declare a `board_level` in its `platformio.ini`; the matrix
|
||||
generator exits non-zero if any env is missing it or uses an unrecognized value:
|
||||
|
||||
- `custom_meshtastic_support_level = 1` - Actively supported, built on every PR
|
||||
- `custom_meshtastic_support_level = 2` - Supported, built on merge to main branches
|
||||
- `board_level = extra` - Extra builds, only on full releases
|
||||
- `board_level = pr` - Smallest subset, built on every PR (and in every larger matrix)
|
||||
- `board_level = release` - The full release matrix, built on push / schedule / `workflow_dispatch`
|
||||
- `board_level = extra` - Opt-in only, built when explicitly requested via `--level extra`
|
||||
|
||||
`custom_meshtastic_support_level` (1-3) is **not** part of this filtering. It is variant
|
||||
metadata that `bin/platformio-custom.py` emits as `supportLevel` in the generated
|
||||
hardware list; changing it does not change which targets CI builds.
|
||||
|
||||
### Running Workflows Locally
|
||||
|
||||
|
||||
2
.github/workflows/daily_packaging.yml
vendored
2
.github/workflows/daily_packaging.yml
vendored
@@ -35,8 +35,8 @@ jobs:
|
||||
series:
|
||||
- jammy # 22.04 LTS
|
||||
- noble # 24.04 LTS
|
||||
- questing # 25.10
|
||||
- resolute # 26.04 LTS
|
||||
- stonking # 26.10
|
||||
uses: ./.github/workflows/package_ppa.yml
|
||||
with:
|
||||
ppa_repo: ppa:meshtastic/daily
|
||||
|
||||
2
.github/workflows/release_channels.yml
vendored
2
.github/workflows/release_channels.yml
vendored
@@ -23,8 +23,8 @@ jobs:
|
||||
series:
|
||||
- jammy # 22.04 LTS
|
||||
- noble # 24.04 LTS
|
||||
- questing # 25.10
|
||||
- resolute # 26.04 LTS
|
||||
- stonking # 26.10
|
||||
uses: ./.github/workflows/package_ppa.yml
|
||||
with:
|
||||
ppa_repo: |-
|
||||
|
||||
44
.github/workflows/test_native.yml
vendored
44
.github/workflows/test_native.yml
vendored
@@ -7,6 +7,9 @@ on:
|
||||
permissions: {}
|
||||
|
||||
env:
|
||||
# Only pushes to the default branch (develop) populate the cache; PR / merge_group runs
|
||||
# restore it but never save, so they stop filling up the repo's Actions cache storage.
|
||||
SAVE_CACHE: ${{ github.event_name == 'push' && github.ref_name == github.event.repository.default_branch }}
|
||||
LCOV_CAPTURE_FLAGS: --quiet --capture --include "${PWD}/src/*" --exclude '*/src/mesh/generated/*' --directory .pio/build/coverage/src --base-directory "${PWD}"
|
||||
|
||||
jobs:
|
||||
@@ -17,7 +20,7 @@ jobs:
|
||||
# check here and fail the PR on a mismatch, keeping the manual count honest.
|
||||
suite-count-check:
|
||||
name: Native Suite Count
|
||||
runs-on: ubuntu-latest
|
||||
runs-on: ubuntu-slim
|
||||
permissions:
|
||||
contents: read
|
||||
steps:
|
||||
@@ -56,7 +59,7 @@ jobs:
|
||||
|
||||
simulator-tests:
|
||||
name: Native Simulator Tests
|
||||
runs-on: ubuntu-latest
|
||||
runs-on: ubuntu-24.04-arm
|
||||
needs: suite-count-check
|
||||
steps:
|
||||
- uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7
|
||||
@@ -70,10 +73,26 @@ jobs:
|
||||
- name: Install simulator dependencies
|
||||
run: pip install -U dotmap
|
||||
|
||||
- name: Restore PlatformIO cache
|
||||
id: pio-cache
|
||||
uses: actions/cache/restore@v6
|
||||
with:
|
||||
path: ~/.platformio/.cache
|
||||
key: pio-simulator-tests-${{ hashFiles('platformio.ini', 'variants/native/portduino.ini', 'variants/native/portduino/platformio.ini') }}
|
||||
restore-keys: |
|
||||
pio-simulator-tests-
|
||||
|
||||
# We now run integration test before other build steps (to quickly see runtime failures)
|
||||
- name: Build for native/coverage
|
||||
run: platformio run -e coverage
|
||||
|
||||
- name: Save PlatformIO cache
|
||||
if: env.SAVE_CACHE == 'true' && steps.pio-cache.outputs.cache-hit != 'true'
|
||||
uses: actions/cache/save@v6
|
||||
with:
|
||||
path: ~/.platformio/.cache
|
||||
key: pio-simulator-tests-${{ hashFiles('platformio.ini', 'variants/native/portduino.ini', 'variants/native/portduino/platformio.ini') }}
|
||||
|
||||
- name: Capture initial coverage information
|
||||
shell: bash
|
||||
run: |
|
||||
@@ -139,7 +158,7 @@ jobs:
|
||||
|
||||
platformio-tests:
|
||||
name: Native PlatformIO Tests
|
||||
runs-on: ubuntu-latest
|
||||
runs-on: ubuntu-24.04-arm
|
||||
needs: suite-count-check
|
||||
steps:
|
||||
- uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7
|
||||
@@ -159,11 +178,27 @@ jobs:
|
||||
- name: Disable BUILD_EPOCH
|
||||
run: sed -i 's/-DBUILD_EPOCH=$UNIX_TIME/#-DBUILD_EPOCH=$UNIX_TIME/' platformio.ini
|
||||
|
||||
- name: Restore PlatformIO cache
|
||||
id: pio-cache
|
||||
uses: actions/cache/restore@v6
|
||||
with:
|
||||
path: ~/.platformio/.cache
|
||||
key: pio-coverage-tests-${{ hashFiles('platformio.ini', 'variants/native/portduino.ini', 'variants/native/portduino/platformio.ini') }}
|
||||
restore-keys: |
|
||||
pio-coverage-tests-
|
||||
|
||||
- name: Build test programs once
|
||||
# One shared build of src + every test program. This is the single source build; gcov then
|
||||
# accumulates coverage counts into this shared .pio/build/coverage/src as the chunks run.
|
||||
run: platformio test -e coverage --without-testing
|
||||
|
||||
- name: Save PlatformIO cache
|
||||
if: env.SAVE_CACHE == 'true' && steps.pio-cache.outputs.cache-hit != 'true'
|
||||
uses: actions/cache/save@v6
|
||||
with:
|
||||
path: ~/.platformio/.cache
|
||||
key: pio-coverage-tests-${{ hashFiles('platformio.ini', 'variants/native/portduino.ini', 'variants/native/portduino/platformio.ini') }}
|
||||
|
||||
- name: Run tests one area at a time
|
||||
shell: bash
|
||||
run: |
|
||||
@@ -270,7 +305,8 @@ jobs:
|
||||
needs:
|
||||
- simulator-tests
|
||||
- platformio-tests
|
||||
if: always()
|
||||
# Run this job even if the previous jobs failed, but skip if the workflow was cancelled.
|
||||
if: ${{ !cancelled() }}
|
||||
steps:
|
||||
- uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7
|
||||
|
||||
|
||||
@@ -4,8 +4,8 @@
|
||||
|
||||
Enumerates every PlatformIO environment and prints a JSON list of
|
||||
``{"board", "platform"}`` entries for the requested selector ("all", "check", or a
|
||||
specific arch), honoring the per-env ``board_level`` tiers (``pr`` / ``extra`` /
|
||||
release-only).
|
||||
specific arch), honoring the per-env ``board_level`` tiers (``pr`` / ``release`` /
|
||||
``extra``).
|
||||
|
||||
On pull requests the workflow additionally passes ``--changed-files``: the matrix is
|
||||
then narrowed to just the environments a PR's changed files can affect (see
|
||||
@@ -37,8 +37,8 @@ COVERED_ELSEWHERE = {"native"}
|
||||
|
||||
# board_level values an env may carry and still be emittable. An ALLOWLIST (not a
|
||||
# denylist) so an unknown/typo'd level fails CLOSED (excluded) rather than silently
|
||||
# building. None = release board, "pr"/"extra" = the two explicit tiers.
|
||||
EMITTABLE_LEVELS = {None, "pr", "extra"}
|
||||
# building. "release" = full release matrix, "pr"/"extra" = the two explicit tiers.
|
||||
EMITTABLE_LEVELS = {"pr", "release", "extra"}
|
||||
|
||||
# Fallback platformio.ini globs that hold [env:...] / [*_base] definitions. Production
|
||||
# overrides the env-definition scan with the real [platformio] extra_configs (see
|
||||
@@ -206,10 +206,21 @@ def load_all_envs():
|
||||
cfg.get(f"env:{pio_env}", "board_check", default="false").strip().lower()
|
||||
== "true"
|
||||
)
|
||||
board_level = cfg.get(f"env:{pio_env}", "board_level", default=None)
|
||||
# Intentionally fail on a missing or unrecognized level: every env must opt in
|
||||
# explicitly, so a new variant can't silently drop out of (or into) the matrix.
|
||||
if board_level not in EMITTABLE_LEVELS:
|
||||
found = repr(board_level) if board_level is not None else "no value"
|
||||
print(
|
||||
f"Error: environment '{pio_env}' has {found} for 'board_level'; "
|
||||
f"expected one of: {', '.join(sorted(EMITTABLE_LEVELS))}",
|
||||
file=sys.stderr,
|
||||
)
|
||||
sys.exit(1)
|
||||
all_envs.append(
|
||||
{
|
||||
"ci": {"board": pio_env, "platform": env_platform},
|
||||
"board_level": cfg.get(f"env:{pio_env}", "board_level", default=None),
|
||||
"board_level": board_level,
|
||||
"board_check": board_check,
|
||||
"include_dirs": include_dirs,
|
||||
"def_dir": defdir.get(pio_env),
|
||||
@@ -370,8 +381,8 @@ def build_outlist(all_envs, platform, level, selected):
|
||||
# Include board_level = 'extra' when requested.
|
||||
elif "extra" in level and env["board_level"] == "extra":
|
||||
outlist.append(ci)
|
||||
# If no board level is specified, include in release builds (not PR).
|
||||
elif "pr" not in level and not env["board_level"]:
|
||||
# Include board_level = 'release' unless narrowed to the PR subset.
|
||||
elif "pr" not in level and env["board_level"] == "release":
|
||||
outlist.append(ci)
|
||||
return outlist
|
||||
|
||||
|
||||
@@ -38,7 +38,7 @@ BASE_INI_INCL = {"variants/esp32/esp32-common.ini": {"esp32"}}
|
||||
def env(
|
||||
board,
|
||||
platform,
|
||||
level=None,
|
||||
level="release",
|
||||
check=False,
|
||||
include_dirs=None,
|
||||
def_dir=None,
|
||||
@@ -68,7 +68,7 @@ def universe():
|
||||
env(
|
||||
"tbeam",
|
||||
"esp32",
|
||||
level=None,
|
||||
level="release",
|
||||
include_dirs=["variants/esp32/tbeam"],
|
||||
def_dir="variants/esp32/tbeam",
|
||||
src_platforms=_sp("esp32"),
|
||||
@@ -401,11 +401,12 @@ def test_platform_src_map_from_envs_derives_family_grouping():
|
||||
|
||||
|
||||
def test_emittable_allowlist_fails_closed():
|
||||
"""Unknown board_level values are excluded; only None/pr/extra emit."""
|
||||
assert gcm._emittable(env("a", "esp32", level=None))
|
||||
"""Unknown board_level values are excluded; only pr/release/extra emit."""
|
||||
assert gcm._emittable(env("a", "esp32", level="release"))
|
||||
assert gcm._emittable(env("a", "esp32", level="pr"))
|
||||
assert gcm._emittable(env("a", "esp32", level="extra"))
|
||||
# Retired 'community' tier and any typo fail closed.
|
||||
# Retired 'community' tier, None (missing level), and any typo fail closed.
|
||||
assert not gcm._emittable(env("a", "esp32", level=None))
|
||||
assert not gcm._emittable(env("a", "esp32", level="community"))
|
||||
assert not gcm._emittable(env("a", "esp32", level="bogus"))
|
||||
# covered-elsewhere platform is excluded regardless of a valid level.
|
||||
|
||||
3
debian/control
vendored
3
debian/control
vendored
@@ -28,7 +28,8 @@ Build-Depends: debhelper-compat (= 13),
|
||||
libinput-dev,
|
||||
libxkbcommon-x11-dev,
|
||||
libsqlite3-dev,
|
||||
libsdl2-dev
|
||||
libsdl2-dev,
|
||||
libcurl4-gnutls-dev
|
||||
Standards-Version: 4.6.2
|
||||
Homepage: https://github.com/meshtastic/firmware
|
||||
Rules-Requires-Root: no
|
||||
|
||||
@@ -41,6 +41,7 @@ BuildRequires: pkgconfig(libusb-1.0)
|
||||
BuildRequires: libi2c-devel
|
||||
BuildRequires: pkgconfig(libuv)
|
||||
BuildRequires: pkgconfig(sqlite3)
|
||||
BuildRequires: pkgconfig(libcurl)
|
||||
# Web components:
|
||||
BuildRequires: pkgconfig(openssl)
|
||||
BuildRequires: pkgconfig(liborcania)
|
||||
|
||||
@@ -1467,7 +1467,7 @@ void Screen::setFrames(FrameFocus focus)
|
||||
#if HAS_WIFI && !defined(ARCH_PORTDUINO)
|
||||
if (!hiddenFrames.wifi && isWifiAvailable()) {
|
||||
fsi.positions.wifi = numframes;
|
||||
normalFrames[numframes++] = graphics::DebugRenderer::drawDebugInfoWiFiTrampoline;
|
||||
normalFrames[numframes++] = graphics::DebugRenderer::drawFrameWiFi;
|
||||
indicatorIcons.push_back(icon_wifi);
|
||||
}
|
||||
#endif
|
||||
|
||||
@@ -195,27 +195,6 @@ enum class FrameDirection { NEXT, PREVIOUS };
|
||||
// Forward declarations
|
||||
class Screen;
|
||||
|
||||
/// Handles gathering and displaying debug information.
|
||||
class DebugInfo
|
||||
{
|
||||
public:
|
||||
DebugInfo(const DebugInfo &) = delete;
|
||||
DebugInfo &operator=(const DebugInfo &) = delete;
|
||||
|
||||
private:
|
||||
friend Screen;
|
||||
|
||||
DebugInfo() {}
|
||||
|
||||
/// Renders the debug screen.
|
||||
void drawFrame(OLEDDisplay *display, OLEDDisplayUiState *state, int16_t x, int16_t y);
|
||||
void drawFrameSettings(OLEDDisplay *display, OLEDDisplayUiState *state, int16_t x, int16_t y);
|
||||
void drawFrameWiFi(OLEDDisplay *display, OLEDDisplayUiState *state, int16_t x, int16_t y);
|
||||
|
||||
/// Protects all of internal state.
|
||||
concurrency::Lock lock;
|
||||
};
|
||||
|
||||
/**
|
||||
* @brief This class deals with showing things on the screen of the device.
|
||||
*
|
||||
@@ -647,11 +626,6 @@ class Screen : public concurrency::OSThread
|
||||
// stick to standard EASCII codes)
|
||||
}
|
||||
|
||||
/// Returns a handle to the DebugInfo screen.
|
||||
//
|
||||
// Use this handle to set things like battery status, user count, GPS status, etc.
|
||||
DebugInfo *debug_info() { return &debugInfo; }
|
||||
|
||||
// Handle observer events
|
||||
int handleStatusUpdate(const meshtastic::Status *arg);
|
||||
int handleUIFrameEvent(const UIFrameEvent *arg);
|
||||
@@ -824,9 +798,6 @@ class Screen : public concurrency::OSThread
|
||||
float compassHeading;
|
||||
uint32_t endCalibrationAt;
|
||||
|
||||
/// Holds state for debug information
|
||||
DebugInfo debugInfo;
|
||||
|
||||
/// Display device
|
||||
#ifdef USE_ST7789
|
||||
ST7789Spi *dispdev;
|
||||
|
||||
@@ -5,7 +5,6 @@
|
||||
#include "FSCommon.h"
|
||||
#include "MeshService.h"
|
||||
#include "NodeDB.h"
|
||||
#include "Throttle.h"
|
||||
#include "UIRenderer.h"
|
||||
#include "airtime.h"
|
||||
#include "gps/RTC.h"
|
||||
@@ -16,9 +15,6 @@
|
||||
#include "graphics/TimeFormatters.h"
|
||||
#include "graphics/images.h"
|
||||
#include "main.h"
|
||||
#include "mesh/Channels.h"
|
||||
#include "mesh/generated/meshtastic/deviceonly.pb.h"
|
||||
#include "sleep.h"
|
||||
|
||||
#if HAS_WIFI && !defined(ARCH_PORTDUINO)
|
||||
#include "mesh/wifi/WiFiAPClient.h"
|
||||
@@ -28,9 +24,6 @@
|
||||
#endif
|
||||
#endif
|
||||
|
||||
#ifdef ARCH_ESP32
|
||||
#include "modules/StoreForwardModule.h"
|
||||
#endif
|
||||
#include <DisplayFormatters.h>
|
||||
#include <RadioLibInterface.h>
|
||||
#include <target_specific.h>
|
||||
@@ -39,111 +32,17 @@ using namespace meshtastic;
|
||||
|
||||
// External variables
|
||||
extern std::unique_ptr<graphics::Screen> screen;
|
||||
extern PowerStatus *powerStatus;
|
||||
extern NodeStatus *nodeStatus;
|
||||
extern GPSStatus *gpsStatus;
|
||||
extern Channels channels;
|
||||
extern AirTime *airTime;
|
||||
|
||||
// External functions from Screen.cpp
|
||||
extern bool heartbeat;
|
||||
|
||||
#ifdef ARCH_ESP32
|
||||
extern StoreForwardModule *storeForwardModule;
|
||||
#endif
|
||||
|
||||
namespace graphics
|
||||
{
|
||||
namespace DebugRenderer
|
||||
{
|
||||
|
||||
void drawFrame(OLEDDisplay *display, OLEDDisplayUiState *state, int16_t x, int16_t y)
|
||||
{
|
||||
display->setFont(FONT_SMALL);
|
||||
|
||||
// The coordinates define the left starting point of the text
|
||||
display->setTextAlignment(TEXT_ALIGN_LEFT);
|
||||
|
||||
if (config.display.displaymode != meshtastic_Config_DisplayConfig_DisplayMode_INVERTED) {
|
||||
display->fillRect(0 + x, 0 + y, x + display->getWidth(), y + FONT_HEIGHT_SMALL);
|
||||
display->setColor(BLACK);
|
||||
}
|
||||
|
||||
char channelStr[20];
|
||||
snprintf(channelStr, sizeof(channelStr), "#%s", channels.getName(channels.getPrimaryIndex()));
|
||||
// Display nodes status
|
||||
if (config.display.displaymode == meshtastic_Config_DisplayConfig_DisplayMode_DEFAULT) {
|
||||
UIRenderer::drawNodes(display, x + (SCREEN_WIDTH * 0.25), y + 2, nodeStatus);
|
||||
} else {
|
||||
UIRenderer::drawNodes(display, x + (SCREEN_WIDTH * 0.25), y + 3, nodeStatus);
|
||||
}
|
||||
#if HAS_GPS
|
||||
// Display GPS status
|
||||
if (config.position.gps_mode != meshtastic_Config_PositionConfig_GpsMode_ENABLED) {
|
||||
UIRenderer::drawGpsPowerStatus(display, x, y + 2, gpsStatus);
|
||||
} else {
|
||||
if (config.display.displaymode == meshtastic_Config_DisplayConfig_DisplayMode_DEFAULT) {
|
||||
UIRenderer::drawGps(display, x + (SCREEN_WIDTH * 0.63), y + 2, gpsStatus);
|
||||
} else {
|
||||
UIRenderer::drawGps(display, x + (SCREEN_WIDTH * 0.63), y + 3, gpsStatus);
|
||||
}
|
||||
}
|
||||
#endif
|
||||
display->setColor(WHITE);
|
||||
// Draw the channel name
|
||||
display->drawString(x, y + FONT_HEIGHT_SMALL, channelStr);
|
||||
// Draw our hardware ID to assist with bluetooth pairing. Either prefix with Info or S&F Logo
|
||||
if (moduleConfig.store_forward.enabled) {
|
||||
#ifdef ARCH_ESP32
|
||||
if (!Throttle::isWithinTimespanMs(storeForwardModule->lastHeartbeat,
|
||||
(storeForwardModule->heartbeatInterval * 1200))) { // no heartbeat, overlap a bit
|
||||
#if (defined(USE_EINK) || defined(HAS_SPI_TFT) || ARCH_PORTDUINO) && !defined(DISPLAY_FORCE_SMALL_FONTS)
|
||||
display->drawFastImage(x + SCREEN_WIDTH - 14 - display->getStringWidth(screen->ourId), y + 3 + FONT_HEIGHT_SMALL, 12,
|
||||
8, imgQuestionL1);
|
||||
display->drawFastImage(x + SCREEN_WIDTH - 14 - display->getStringWidth(screen->ourId), y + 11 + FONT_HEIGHT_SMALL, 12,
|
||||
8, imgQuestionL2);
|
||||
#else
|
||||
display->drawFastImage(x + SCREEN_WIDTH - 10 - display->getStringWidth(screen->ourId), y + 2 + FONT_HEIGHT_SMALL, 8,
|
||||
8, imgQuestion);
|
||||
#endif
|
||||
} else {
|
||||
#if (defined(USE_EINK) || defined(HAS_SPI_TFT)) && !defined(DISPLAY_FORCE_SMALL_FONTS)
|
||||
display->drawFastImage(x + SCREEN_WIDTH - 18 - display->getStringWidth(screen->ourId), y + 3 + FONT_HEIGHT_SMALL, 16,
|
||||
8, imgSFL1);
|
||||
display->drawFastImage(x + SCREEN_WIDTH - 18 - display->getStringWidth(screen->ourId), y + 11 + FONT_HEIGHT_SMALL, 16,
|
||||
8, imgSFL2);
|
||||
#else
|
||||
display->drawFastImage(x + SCREEN_WIDTH - 13 - display->getStringWidth(screen->ourId), y + 2 + FONT_HEIGHT_SMALL, 11,
|
||||
8, imgSF);
|
||||
#endif
|
||||
}
|
||||
#endif
|
||||
} else {
|
||||
// TODO: Raspberry Pi supports more than just the one screen size
|
||||
#if (defined(USE_EINK) || defined(HAS_SPI_TFT) || ARCH_PORTDUINO) && !defined(DISPLAY_FORCE_SMALL_FONTS)
|
||||
display->drawFastImage(x + SCREEN_WIDTH - 14 - display->getStringWidth(screen->ourId), y + 3 + FONT_HEIGHT_SMALL, 12, 8,
|
||||
imgInfoL1);
|
||||
display->drawFastImage(x + SCREEN_WIDTH - 14 - display->getStringWidth(screen->ourId), y + 11 + FONT_HEIGHT_SMALL, 12, 8,
|
||||
imgInfoL2);
|
||||
#else
|
||||
display->drawFastImage(x + SCREEN_WIDTH - 10 - display->getStringWidth(screen->ourId), y + 2 + FONT_HEIGHT_SMALL, 8, 8,
|
||||
imgInfo);
|
||||
#endif
|
||||
}
|
||||
|
||||
display->drawString(x + SCREEN_WIDTH - display->getStringWidth(screen->ourId), y + FONT_HEIGHT_SMALL, screen->ourId);
|
||||
|
||||
// Draw any log messages
|
||||
display->drawLogBuffer(x, y + (FONT_HEIGHT_SMALL * 2));
|
||||
|
||||
/* Display a heartbeat pixel that blinks every time the frame is redrawn */
|
||||
#ifdef SHOW_REDRAWS
|
||||
if (heartbeat)
|
||||
display->setPixel(0, 0);
|
||||
heartbeat = !heartbeat;
|
||||
#endif
|
||||
}
|
||||
|
||||
// ****************************
|
||||
// * WiFi Screen *
|
||||
// ****************************
|
||||
@@ -230,12 +129,6 @@ void drawFrameWiFi(OLEDDisplay *display, OLEDDisplayUiState *state, int16_t x, i
|
||||
#endif
|
||||
}
|
||||
|
||||
// Trampoline functions for DebugInfo class access
|
||||
void drawDebugInfoWiFiTrampoline(OLEDDisplay *display, OLEDDisplayUiState *state, int16_t x, int16_t y)
|
||||
{
|
||||
drawFrameWiFi(display, state, x, y);
|
||||
}
|
||||
|
||||
// ****************************
|
||||
// * LoRa Focused Screen *
|
||||
// ****************************
|
||||
|
||||
@@ -8,7 +8,6 @@ namespace graphics
|
||||
|
||||
/// Forward declarations
|
||||
class Screen;
|
||||
class DebugInfo;
|
||||
|
||||
/**
|
||||
* @brief Debug and diagnostic drawing functions
|
||||
@@ -18,13 +17,9 @@ class DebugInfo;
|
||||
*/
|
||||
namespace DebugRenderer
|
||||
{
|
||||
// Debug frame functions
|
||||
void drawFrame(OLEDDisplay *display, OLEDDisplayUiState *state, int16_t x, int16_t y);
|
||||
// WiFi status display
|
||||
void drawFrameWiFi(OLEDDisplay *display, OLEDDisplayUiState *state, int16_t x, int16_t y);
|
||||
|
||||
// Trampoline functions for framework callback compatibility
|
||||
void drawDebugInfoWiFiTrampoline(OLEDDisplay *display, OLEDDisplayUiState *state, int16_t x, int16_t y);
|
||||
|
||||
// LoRa information display
|
||||
void drawLoRaFocused(OLEDDisplay *display, OLEDDisplayUiState *state, int16_t x, int16_t y);
|
||||
|
||||
|
||||
@@ -547,22 +547,6 @@ void UIRenderer::drawGps(OLEDDisplay *display, int16_t x, int16_t y, const mesht
|
||||
}
|
||||
}
|
||||
|
||||
// Draw status when GPS is disabled or not present
|
||||
void UIRenderer::drawGpsPowerStatus(OLEDDisplay *display, int16_t x, int16_t y, const meshtastic::GPSStatus *gps)
|
||||
{
|
||||
const char *displayLine;
|
||||
int pos;
|
||||
if (y < FONT_HEIGHT_SMALL) { // Line 1: use short string
|
||||
displayLine = config.position.gps_mode == meshtastic_Config_PositionConfig_GpsMode_NOT_PRESENT ? "No GPS" : "GPS off";
|
||||
pos = display->getWidth() - display->getStringWidth(displayLine);
|
||||
} else {
|
||||
displayLine = config.position.gps_mode == meshtastic_Config_PositionConfig_GpsMode_NOT_PRESENT ? "GPS not present"
|
||||
: "GPS is disabled";
|
||||
pos = (display->getWidth() - display->getStringWidth(displayLine)) / 2;
|
||||
}
|
||||
display->drawString(x + pos, y, displayLine);
|
||||
}
|
||||
|
||||
void UIRenderer::drawGpsAltitude(OLEDDisplay *display, int16_t x, int16_t y, const meshtastic::GPSStatus *gps)
|
||||
{
|
||||
char displayLine[32];
|
||||
|
||||
@@ -42,7 +42,6 @@ class UIRenderer
|
||||
static void drawGpsCoordinates(OLEDDisplay *display, int16_t x, int16_t y, const meshtastic::GPSStatus *gpsStatus,
|
||||
const char *mode = "line1");
|
||||
static void drawGpsAltitude(OLEDDisplay *display, int16_t x, int16_t y, const meshtastic::GPSStatus *gpsStatus);
|
||||
static void drawGpsPowerStatus(OLEDDisplay *display, int16_t x, int16_t y, const meshtastic::GPSStatus *gpsStatus);
|
||||
|
||||
// Overlay and special screens
|
||||
static void drawFrameText(OLEDDisplay *display, OLEDDisplayUiState *state, int16_t x, int16_t y, const char *text);
|
||||
|
||||
@@ -29,21 +29,6 @@ const uint8_t bluetoothConnectedIcon[36] PROGMEM = {0xfe, 0x01, 0xff, 0x03, 0x03
|
||||
0xf3, 0x3f, 0x33, 0x30, 0x33, 0x33, 0x33, 0x33, 0x03, 0x33, 0xff, 0x33,
|
||||
0xfe, 0x31, 0x00, 0x30, 0x30, 0x30, 0x30, 0x30, 0xf0, 0x3f, 0xe0, 0x1f};
|
||||
|
||||
#if (defined(USE_EINK) || defined(HAS_SPI_TFT) || ARCH_PORTDUINO) && !defined(DISPLAY_FORCE_SMALL_FONTS)
|
||||
const uint8_t imgQuestionL1[] PROGMEM = {0xff, 0x01, 0x01, 0x32, 0x7b, 0x49, 0x49, 0x6f, 0x26, 0x01, 0x01, 0xff};
|
||||
const uint8_t imgQuestionL2[] PROGMEM = {0x0f, 0x08, 0x08, 0x08, 0x06, 0x0f, 0x0f, 0x06, 0x08, 0x08, 0x08, 0x0f};
|
||||
const uint8_t imgInfoL1[] PROGMEM = {0xff, 0x01, 0x01, 0x01, 0x1e, 0x7f, 0x1e, 0x01, 0x01, 0x01, 0x01, 0xff};
|
||||
const uint8_t imgInfoL2[] PROGMEM = {0x0f, 0x08, 0x08, 0x08, 0x06, 0x0f, 0x0f, 0x06, 0x08, 0x08, 0x08, 0x0f};
|
||||
const uint8_t imgSFL1[] PROGMEM = {0xb6, 0x8f, 0x19, 0x11, 0x31, 0xe3, 0xc2, 0x01,
|
||||
0x01, 0xf9, 0xf9, 0x89, 0x89, 0x89, 0x09, 0xeb};
|
||||
const uint8_t imgSFL2[] PROGMEM = {0x0e, 0x09, 0x09, 0x09, 0x09, 0x09, 0x08, 0x08,
|
||||
0x00, 0x0f, 0x0f, 0x00, 0x08, 0x08, 0x08, 0x0f};
|
||||
#else
|
||||
const uint8_t imgInfo[] PROGMEM = {0xff, 0x81, 0x00, 0xfb, 0xfb, 0x00, 0x81, 0xff};
|
||||
const uint8_t imgQuestion[] PROGMEM = {0xbf, 0x41, 0xc0, 0x8b, 0xdb, 0x70, 0xa1, 0xdf};
|
||||
const uint8_t imgSF[] PROGMEM = {0xd2, 0xb7, 0xad, 0xbb, 0x92, 0x01, 0xfd, 0xfd, 0x15, 0x85, 0xf5};
|
||||
#endif
|
||||
|
||||
// === Horizontal battery ===
|
||||
// Basic battery design and all related pieces
|
||||
const unsigned char batteryBitmap_h_bottom[] PROGMEM = {
|
||||
|
||||
@@ -1,6 +1,7 @@
|
||||
; CircuitMess Chatter 2 based on ESP32-WROOM-32 (38 pins) devkit & DeeamLNK DL-LLCC68 or Heltec HT RA62 SX1262/SX1268 module
|
||||
[env:chatter2]
|
||||
extends = esp32_base
|
||||
board_level = release
|
||||
board = esp32doit-devkit-v1
|
||||
build_flags =
|
||||
${esp32_base.build_flags}
|
||||
|
||||
@@ -9,6 +9,7 @@ custom_meshtastic_display_name = Hydra
|
||||
custom_meshtastic_tags = DIY
|
||||
|
||||
extends = esp32_base
|
||||
board_level = release
|
||||
board = esp32doit-devkit-v1
|
||||
build_flags =
|
||||
${esp32_base.build_flags}
|
||||
|
||||
@@ -10,6 +10,7 @@ custom_meshtastic_images = diy.svg
|
||||
custom_meshtastic_tags = DIY
|
||||
|
||||
extends = esp32_base
|
||||
board_level = release
|
||||
board = esp32doit-devkit-v1
|
||||
board_check = true
|
||||
build_flags =
|
||||
|
||||
@@ -8,6 +8,7 @@ custom_meshtastic_display_name = M5 Stack
|
||||
custom_meshtastic_tags = M5Stack
|
||||
|
||||
extends = esp32_base
|
||||
board_level = release
|
||||
board = m5stack-core-esp32
|
||||
monitor_filters = esp32_exception_decoder
|
||||
build_src_filter =
|
||||
|
||||
@@ -1,5 +1,6 @@
|
||||
[env:m5stack-coreink]
|
||||
extends = esp32_base
|
||||
board_level = release
|
||||
board = m5stack-coreink
|
||||
board_check = true
|
||||
build_src_filter =
|
||||
|
||||
@@ -9,6 +9,7 @@ custom_meshtastic_display_name = Nano G1 Explorer
|
||||
custom_meshtastic_tags = B&Q
|
||||
|
||||
extends = esp32_base
|
||||
board_level = release
|
||||
board = ttgo-tbeam
|
||||
build_flags =
|
||||
${esp32_base.build_flags}
|
||||
|
||||
@@ -9,6 +9,7 @@ custom_meshtastic_display_name = Nano G1
|
||||
custom_meshtastic_tags = B&Q
|
||||
|
||||
extends = esp32_base
|
||||
board_level = release
|
||||
board = ttgo-tbeam
|
||||
build_flags =
|
||||
${esp32_base.build_flags}
|
||||
|
||||
@@ -1,5 +1,6 @@
|
||||
[env:radiomaster_900_bandit]
|
||||
extends = esp32_base
|
||||
board_level = release
|
||||
board = esp32doit-devkit-v1
|
||||
build_flags =
|
||||
${esp32_base.build_flags}
|
||||
|
||||
@@ -5,6 +5,7 @@
|
||||
;
|
||||
[env:radiomaster_900_bandit_micro]
|
||||
extends = esp32_base
|
||||
board_level = release
|
||||
board = esp32doit-devkit-v1
|
||||
build_flags =
|
||||
${esp32_base.build_flags}
|
||||
|
||||
@@ -8,6 +8,7 @@ custom_meshtastic_display_name = RadioMaster 900 Bandit Nano
|
||||
custom_meshtastic_tags = RadioMaster
|
||||
|
||||
extends = esp32_base
|
||||
board_level = release
|
||||
board = esp32doit-devkit-v1
|
||||
build_flags =
|
||||
${esp32_base.build_flags}
|
||||
|
||||
@@ -9,6 +9,7 @@ custom_meshtastic_images = rak11200.svg
|
||||
custom_meshtastic_tags = RAK
|
||||
|
||||
extends = esp32_base
|
||||
board_level = release
|
||||
board = wiscore_rak11200
|
||||
board_check = true
|
||||
build_flags =
|
||||
|
||||
@@ -9,6 +9,7 @@ custom_meshtastic_display_name = Station G1
|
||||
custom_meshtastic_tags = B&Q
|
||||
|
||||
extends = esp32_base
|
||||
board_level = release
|
||||
board = ttgo-tbeam
|
||||
build_flags =
|
||||
${esp32_base.build_flags}
|
||||
|
||||
@@ -10,6 +10,7 @@ custom_meshtastic_images = tbeam.svg
|
||||
custom_meshtastic_tags = LilyGo
|
||||
|
||||
extends = esp32_base
|
||||
board_level = release
|
||||
board = ttgo-tbeam
|
||||
|
||||
board_check = true
|
||||
|
||||
@@ -9,6 +9,7 @@ custom_meshtastic_images = tlora-v2-1-1_6.svg
|
||||
custom_meshtastic_tags = LilyGo
|
||||
|
||||
extends = esp32_base
|
||||
board_level = release
|
||||
board = ttgo-lora32-v21
|
||||
board_check = true
|
||||
build_flags =
|
||||
|
||||
@@ -1,5 +1,6 @@
|
||||
[env:tlora-v3-3-0-tcxo]
|
||||
extends = esp32_base
|
||||
board_level = release
|
||||
board = ttgo-lora32-v21
|
||||
build_flags =
|
||||
${esp32_base.build_flags}
|
||||
|
||||
@@ -1,5 +1,6 @@
|
||||
[env:heltec-hru-3601]
|
||||
extends = esp32c3_base
|
||||
board_level = release
|
||||
board = adafruit_qtpy_esp32c3
|
||||
build_flags =
|
||||
${esp32c3_base.build_flags}
|
||||
|
||||
@@ -9,6 +9,7 @@ custom_meshtastic_images = m5_c6l.svg
|
||||
custom_meshtastic_tags = M5Stack
|
||||
|
||||
extends = esp32c6_base
|
||||
board_level = release
|
||||
board = esp32-c6-devkitc-1
|
||||
board_upload.flash_size = 16MB
|
||||
board_build.partitions = default_16MB.csv
|
||||
|
||||
@@ -9,6 +9,7 @@ custom_meshtastic_tags = EByte
|
||||
custom_meshtastic_requires_dfu = true
|
||||
|
||||
extends = esp32s3_base
|
||||
board_level = release
|
||||
board = CDEBYTE_EoRa-S3
|
||||
build_flags =
|
||||
${esp32s3_base.build_flags}
|
||||
|
||||
@@ -1,5 +1,6 @@
|
||||
[env:thinknode_g3]
|
||||
extends = esp32s3_base
|
||||
board_level = release
|
||||
board = ESP32-S3-WROOM-1-N4
|
||||
board_build.psram_type = opi
|
||||
|
||||
|
||||
@@ -10,6 +10,7 @@ custom_meshtastic_tags = Elecrow
|
||||
custom_meshtastic_requires_dfu = false
|
||||
|
||||
extends = esp32s3_base
|
||||
board_level = release
|
||||
board = ESP32-S3-WROOM-1-N4
|
||||
build_flags =
|
||||
${esp32s3_base.build_flags}
|
||||
|
||||
@@ -10,6 +10,7 @@ custom_meshtastic_tags = Elecrow
|
||||
custom_meshtastic_requires_dfu = false
|
||||
|
||||
extends = esp32s3_base
|
||||
board_level = release
|
||||
board = ESP32-S3-WROOM-1-N4
|
||||
build_src_filter =
|
||||
${esp32s3_base.build_src_filter}
|
||||
|
||||
@@ -91,6 +91,7 @@ custom_meshtastic_partition_scheme = 16MB
|
||||
custom_meshtastic_has_mui = true
|
||||
|
||||
extends = crowpanel_small_esp32s3_base
|
||||
board_level = release
|
||||
build_flags =
|
||||
${crowpanel_small_esp32s3_base.build_flags}
|
||||
-D SPI_FREQUENCY=80000000
|
||||
@@ -127,6 +128,7 @@ custom_meshtastic_partition_scheme = 16MB
|
||||
custom_meshtastic_has_mui = true
|
||||
|
||||
extends = crowpanel_small_esp32s3_base
|
||||
board_level = release
|
||||
build_flags =
|
||||
${crowpanel_small_esp32s3_base.build_flags}
|
||||
-D LV_CACHE_DEF_SIZE=2097152
|
||||
@@ -166,6 +168,7 @@ custom_meshtastic_partition_scheme = 16MB
|
||||
custom_meshtastic_has_mui = true
|
||||
|
||||
extends = crowpanel_large_esp32s3_base
|
||||
board_level = release
|
||||
build_flags =
|
||||
${crowpanel_large_esp32s3_base.build_flags}
|
||||
-D VIEW_320x240
|
||||
|
||||
@@ -1,6 +1,7 @@
|
||||
; Hackaday Communicator
|
||||
[env:hackaday-communicator]
|
||||
extends = esp32s3_base
|
||||
board_level = release
|
||||
board = hackaday-communicator
|
||||
board_check = true
|
||||
board_build.partitions = default_16MB.csv
|
||||
|
||||
@@ -1,5 +1,6 @@
|
||||
[env:heltec_capsule_sensor_v3]
|
||||
extends = esp32s3_base
|
||||
board_level = release
|
||||
board = heltec_wifi_lora_32_V3
|
||||
board_check = true
|
||||
board_build.partitions = default_8MB.csv
|
||||
|
||||
@@ -1,5 +1,6 @@
|
||||
[env:heltec_sensor_hub]
|
||||
extends = esp32s3_base
|
||||
board_level = release
|
||||
board = heltec_wifi_lora_32_V3
|
||||
board_check = true
|
||||
|
||||
|
||||
@@ -24,6 +24,7 @@ custom_meshtastic_partition_scheme = 16MB
|
||||
custom_meshtastic_has_mui = true
|
||||
|
||||
extends = heltec_v4_base
|
||||
board_level = release
|
||||
build_flags =
|
||||
${heltec_v4_base.build_flags}
|
||||
-D HELTEC_V4_OLED
|
||||
@@ -48,6 +49,7 @@ custom_meshtastic_requires_dfu = true
|
||||
custom_meshtastic_partition_scheme = 16MB
|
||||
|
||||
extends = heltec_v4_base
|
||||
board_level = release
|
||||
build_flags =
|
||||
${heltec_v4_base.build_flags} ;-Os
|
||||
-D HELTEC_V4_TFT
|
||||
|
||||
@@ -24,6 +24,7 @@ custom_meshtastic_requires_dfu = true
|
||||
custom_meshtastic_partition_scheme = 16MB
|
||||
|
||||
extends = heltec_v4_r8_base
|
||||
board_level = release
|
||||
build_flags =
|
||||
${heltec_v4_r8_base.build_flags}
|
||||
-D HELTEC_V4_R8_OLED
|
||||
@@ -46,6 +47,7 @@ custom_meshtastic_requires_dfu = true
|
||||
custom_meshtastic_partition_scheme = 16MB
|
||||
|
||||
extends = heltec_v4_r8_base
|
||||
board_level = release
|
||||
build_flags =
|
||||
${heltec_v4_r8_base.build_flags} ;-Os
|
||||
-D HELTEC_V4_R8_TFT
|
||||
|
||||
@@ -12,6 +12,7 @@ custom_meshtastic_partition_scheme = 8MB
|
||||
custom_meshtastic_has_ink_hud = true
|
||||
|
||||
extends = esp32s3_base
|
||||
board_level = release
|
||||
board = heltec_vision_master_e213
|
||||
board_build.partitions = default_8MB.csv
|
||||
build_flags =
|
||||
|
||||
@@ -13,6 +13,7 @@ custom_meshtastic_partition_scheme = 8MB
|
||||
custom_meshtastic_has_ink_hud = true
|
||||
|
||||
extends = esp32s3_base
|
||||
board_level = release
|
||||
board = heltec_vision_master_e290
|
||||
board_build.partitions = default_8MB.csv
|
||||
build_flags =
|
||||
@@ -38,6 +39,7 @@ upload_speed = 115200
|
||||
|
||||
[env:heltec-vision-master-e290-inkhud]
|
||||
extends = esp32s3_base, inkhud
|
||||
board_level = release
|
||||
board = heltec_vision_master_e290
|
||||
board_build.partitions = default_8MB.csv
|
||||
build_src_filter =
|
||||
|
||||
@@ -11,6 +11,7 @@ custom_meshtastic_requires_dfu = true
|
||||
custom_meshtastic_partition_scheme = 8MB
|
||||
|
||||
extends = esp32s3_base
|
||||
board_level = release
|
||||
board = heltec_vision_master_t190
|
||||
board_build.partitions = default_8MB.csv
|
||||
build_flags =
|
||||
|
||||
@@ -12,6 +12,7 @@ custom_meshtastic_partition_scheme = 8MB
|
||||
custom_meshtastic_has_ink_hud = true
|
||||
|
||||
extends = esp32s3_base
|
||||
board_level = release
|
||||
board = heltec_wifi_lora_32_V3
|
||||
board_build.partitions = default_8MB.csv
|
||||
build_flags =
|
||||
@@ -35,6 +36,7 @@ upload_speed = 115200
|
||||
|
||||
[env:heltec-wireless-paper-inkhud]
|
||||
extends = esp32s3_base, inkhud
|
||||
board_level = release
|
||||
board = heltec_wifi_lora_32_V3
|
||||
board_build.partitions = default_8MB.csv
|
||||
build_src_filter =
|
||||
|
||||
@@ -11,6 +11,7 @@ custom_meshtastic_requires_dfu = true
|
||||
custom_meshtastic_partition_scheme = 8MB
|
||||
|
||||
extends = esp32s3_base
|
||||
board_level = release
|
||||
board = heltec_wireless_tracker
|
||||
board_build.partitions = default_8MB.csv
|
||||
upload_protocol = esptool
|
||||
|
||||
@@ -4,6 +4,7 @@ custom_meshtastic_images = heltec_wireless_tracker_v2.svg
|
||||
custom_meshtastic_tags = Heltec
|
||||
|
||||
extends = esp32s3_base
|
||||
board_level = release
|
||||
board = heltec_wireless_tracker_v2
|
||||
board_build.partitions = default_8MB.csv
|
||||
upload_protocol = esptool
|
||||
|
||||
@@ -10,6 +10,7 @@ custom_meshtastic_tags = Heltec
|
||||
custom_meshtastic_partition_scheme = 8MB
|
||||
|
||||
extends = esp32s3_base
|
||||
board_level = release
|
||||
board = heltec_wifi_lora_32_V3
|
||||
board_build.partitions = default_8MB.csv
|
||||
# Temporary until espressif creates a release with this new target
|
||||
|
||||
@@ -1,6 +1,7 @@
|
||||
; M5stack Cardputer Advanced
|
||||
[env:m5stack-cardputer-adv]
|
||||
extends = esp32s3_base
|
||||
board_level = release
|
||||
board = m5stack-stamps3
|
||||
board_check = true
|
||||
board_build.partitions = default_8MB.csv
|
||||
|
||||
@@ -1,6 +1,7 @@
|
||||
; M5stack CoreS3
|
||||
[env:m5stack-cores3]
|
||||
extends = esp32s3_base
|
||||
board_level = release
|
||||
board = m5stack-cores3
|
||||
board_check = true
|
||||
board_build.partitions = default_16MB.csv
|
||||
|
||||
@@ -17,6 +17,7 @@ board_build.psram_type = opi
|
||||
board_build.arduino.memory_type = qio_opi
|
||||
|
||||
extends = esp32s3_base
|
||||
board_level = release
|
||||
build_flags =
|
||||
${esp32s3_base.build_flags}
|
||||
-D MESHNOLOGY_W10
|
||||
|
||||
@@ -11,6 +11,7 @@ custom_meshtastic_requires_dfu = true
|
||||
custom_meshtastic_partition_scheme = 16MB
|
||||
|
||||
extends = esp32s3_base
|
||||
board_level = release
|
||||
board = esp32-s3-devkitc-1
|
||||
; ESP32-S3R8: 8 MB OPI PSRAM, 16 MB QIO flash
|
||||
board_build.partitions = default_16MB.csv
|
||||
|
||||
@@ -11,6 +11,7 @@ custom_meshtastic_requires_dfu = no
|
||||
custom_meshtastic_has_mui = false
|
||||
|
||||
extends = esp32s3_base
|
||||
board_level = release
|
||||
board = mini-epaper-s3
|
||||
board_check = true
|
||||
upload_protocol = esptool
|
||||
@@ -37,6 +38,7 @@ lib_deps =
|
||||
|
||||
[env:mini-epaper-s3-inkhud]
|
||||
extends = esp32s3_base, inkhud
|
||||
board_level = release
|
||||
board = mini-epaper-s3
|
||||
board_check = true
|
||||
upload_protocol = esptool
|
||||
|
||||
@@ -9,6 +9,7 @@ custom_meshtastic_partition_scheme = 8MB
|
||||
custom_meshtastic_has_mui = true
|
||||
|
||||
extends = esp32s3_base
|
||||
board_level = release
|
||||
board = bpi_picow_esp32_s3
|
||||
board_check = true
|
||||
board_build.partitions = partition-table-8MB.csv
|
||||
@@ -33,6 +34,7 @@ build_src_filter =
|
||||
|
||||
[env:picomputer-s3-tft]
|
||||
extends = env:picomputer-s3
|
||||
board_level = release
|
||||
|
||||
build_flags =
|
||||
${env:picomputer-s3.build_flags}
|
||||
|
||||
@@ -12,6 +12,7 @@ custom_meshtastic_partition_scheme = 16MB
|
||||
custom_meshtastic_has_mui = false
|
||||
|
||||
extends = esp32s3_base
|
||||
board_level = release
|
||||
board = wiscore_rak3312
|
||||
board_check = true
|
||||
upload_protocol = esptool
|
||||
|
||||
@@ -23,6 +23,7 @@ custom_meshtastic_partition_scheme = 16MB
|
||||
custom_meshtastic_has_mui = true
|
||||
|
||||
extends = esp32s3_base
|
||||
board_level = release
|
||||
board = wiscore_rak3312
|
||||
board_check = true
|
||||
upload_protocol = esptool
|
||||
@@ -41,6 +42,7 @@ lib_deps =
|
||||
|
||||
[env:rak_wismesh_tap_v2-tft]
|
||||
extends = env:rak_wismesh_tap_v2
|
||||
board_level = release
|
||||
; The MUI build overflows default_8MB.csv's 0x330000 app slots; use the MUI
|
||||
; layout (large app0 + small flasher slot) like the other has_mui 8MB boards.
|
||||
board_build.partitions = partition-table-8MB.csv
|
||||
|
||||
@@ -12,6 +12,7 @@ custom_meshtastic_partition_scheme = 8MB
|
||||
custom_meshtastic_has_mui = true
|
||||
|
||||
extends = esp32s3_base
|
||||
board_level = release
|
||||
platform_packages =
|
||||
; Version needs to match the pioarduino version used in esp32_common.ini
|
||||
platformio/framework-arduinoespressif32 @ https://github.com/mverch67/arduino-esp32#6dde0f3b58e32d9f884b94b4685b0f3a267c4624 ; 3.3.11
|
||||
|
||||
@@ -11,6 +11,7 @@ custom_meshtastic_requires_dfu = true
|
||||
custom_meshtastic_partition_scheme = 8MB
|
||||
|
||||
extends = esp32s3_base
|
||||
board_level = release
|
||||
board = seeed-xiao-s3
|
||||
board_check = true
|
||||
board_build.partitions = default_8MB.csv
|
||||
|
||||
@@ -11,6 +11,7 @@ custom_meshtastic_requires_dfu = true
|
||||
custom_meshtastic_partition_scheme = 16MB
|
||||
|
||||
extends = esp32s3_base
|
||||
board_level = release
|
||||
board = station-g2
|
||||
board_check = true
|
||||
board_build.partitions = default_16MB.csv
|
||||
|
||||
@@ -11,6 +11,7 @@ custom_meshtastic_requires_dfu = true
|
||||
custom_meshtastic_partition_scheme = 16MB
|
||||
|
||||
extends = esp32s3_base
|
||||
board_level = release
|
||||
board = station-g3
|
||||
board_check = true
|
||||
board_build.partitions = default_16MB.csv
|
||||
|
||||
@@ -11,6 +11,7 @@ custom_meshtastic_tags = LilyGo
|
||||
custom_meshtastic_has_mui = false
|
||||
|
||||
extends = esp32s3_base
|
||||
board_level = release
|
||||
board = t-beam-1w
|
||||
board_build.partitions = default_8MB.csv
|
||||
board_check = true
|
||||
|
||||
@@ -10,6 +10,7 @@ custom_meshtastic_images = tbeam-1w.svg
|
||||
custom_meshtastic_tags = LilyGo
|
||||
|
||||
extends = esp32s3_base
|
||||
board_level = release
|
||||
board = t-beam-bpf
|
||||
board_build.partitions = default_16MB.csv
|
||||
board_check = true
|
||||
|
||||
@@ -11,6 +11,7 @@ custom_meshtastic_requires_dfu = true
|
||||
custom_meshtastic_partition_scheme = 16MB
|
||||
|
||||
extends = esp32s3_base
|
||||
board_level = release
|
||||
board = t-deck-pro
|
||||
board_check = true
|
||||
upload_protocol = esptool
|
||||
|
||||
@@ -12,6 +12,7 @@ custom_meshtastic_partition_scheme = 16MB
|
||||
custom_meshtastic_has_mui = false
|
||||
|
||||
extends = esp32s3_base
|
||||
board_level = release
|
||||
board = t-deck-pro
|
||||
board_check = true
|
||||
upload_protocol = esptool
|
||||
|
||||
@@ -13,6 +13,7 @@ custom_meshtastic_partition_scheme = 16MB
|
||||
custom_meshtastic_has_mui = true
|
||||
|
||||
extends = esp32s3_base
|
||||
board_level = release
|
||||
board = t-deck
|
||||
board_check = true
|
||||
board_build.partitions = default_16MB.csv
|
||||
|
||||
@@ -1,5 +1,6 @@
|
||||
[env:t-eth-elite]
|
||||
extends = esp32s3_base
|
||||
board_level = release
|
||||
board = esp32s3box
|
||||
board_check = true
|
||||
board_build.partitions = default_16MB.csv
|
||||
|
||||
@@ -11,6 +11,7 @@ custom_meshtastic_tags = LilyGo
|
||||
custom_meshtastic_partition_scheme = 8MB
|
||||
|
||||
extends = esp32s3_base
|
||||
board_level = release
|
||||
board = t-watch-s3
|
||||
board_check = true
|
||||
board_build.partitions = default_16MB.csv
|
||||
|
||||
@@ -55,6 +55,7 @@ lib_deps =
|
||||
|
||||
[env:t5s3-epaper-v1] ; H752
|
||||
extends = t5s3_epaper_base
|
||||
board_level = release
|
||||
build_flags =
|
||||
${t5s3_epaper_base.build_flags}
|
||||
-D T5_S3_EPAPER_PRO_V1
|
||||
@@ -62,6 +63,7 @@ build_flags =
|
||||
|
||||
[env:t5s3-epaper-v2] ; H752-01
|
||||
extends = t5s3_epaper_base
|
||||
board_level = release
|
||||
build_flags =
|
||||
${t5s3_epaper_base.build_flags}
|
||||
-D T5_S3_EPAPER_PRO_V2
|
||||
|
||||
@@ -12,6 +12,7 @@ custom_meshtastic_requires_dfu = true
|
||||
custom_meshtastic_partition_scheme = 8MB
|
||||
|
||||
extends = esp32s3_base
|
||||
board_level = release
|
||||
board = tbeam-s3-core
|
||||
board_build.partitions = default_8MB.csv
|
||||
board_check = true
|
||||
|
||||
@@ -13,6 +13,7 @@ custom_meshtastic_partition_scheme = 16MB
|
||||
custom_meshtastic_has_mui = true
|
||||
|
||||
extends = esp32s3_base
|
||||
board_level = release
|
||||
board = t-deck-pro ; same as T-Deck Pro
|
||||
board_check = true
|
||||
board_build.partitions = default_16MB.csv
|
||||
|
||||
@@ -11,6 +11,7 @@ custom_meshtastic_requires_dfu = true
|
||||
custom_meshtastic_has_ink_hud = true
|
||||
|
||||
extends = esp32s3_base
|
||||
board_level = release
|
||||
board = tlora-t3s3-v1
|
||||
board_check = true
|
||||
board_build.partitions = partition-table-t3s3.csv
|
||||
@@ -39,6 +40,7 @@ lib_deps =
|
||||
|
||||
[env:tlora-t3s3-epaper-inkhud]
|
||||
extends = esp32s3_base, inkhud
|
||||
board_level = release
|
||||
board = tlora-t3s3-v1
|
||||
board_check = true
|
||||
board_build.partitions = partition-table-t3s3.csv
|
||||
|
||||
@@ -10,6 +10,7 @@ custom_meshtastic_tags = LilyGo
|
||||
custom_meshtastic_requires_dfu = true
|
||||
|
||||
extends = esp32s3_base
|
||||
board_level = release
|
||||
board = tlora-t3s3-v1
|
||||
board_check = true
|
||||
board_build.partitions = partition-table-t3s3.csv
|
||||
|
||||
@@ -9,6 +9,7 @@ custom_meshtastic_requires_dfu = true
|
||||
custom_meshtastic_partition_scheme = 8MB
|
||||
|
||||
extends = esp32s3_base
|
||||
board_level = release
|
||||
board = heltec_wireless_tracker
|
||||
board_build.partitions = default_8MB.csv
|
||||
upload_protocol = esp-builtin
|
||||
@@ -35,6 +36,7 @@ custom_meshtastic_requires_dfu = true
|
||||
custom_meshtastic_partition_scheme = 8MB
|
||||
|
||||
extends = esp32s3_base
|
||||
board_level = release
|
||||
board = heltec_wireless_tracker
|
||||
board_build.partitions = default_8MB.csv
|
||||
upload_protocol = esp-builtin
|
||||
@@ -60,6 +62,7 @@ custom_meshtastic_display_name = TrackSenger (big OLED)
|
||||
custom_meshtastic_partition_scheme = 8MB
|
||||
|
||||
extends = esp32s3_base
|
||||
board_level = release
|
||||
board = heltec_wireless_tracker
|
||||
board_build.partitions = default_8MB.csv
|
||||
upload_protocol = esp-builtin
|
||||
|
||||
@@ -11,6 +11,7 @@ custom_meshtastic_requires_dfu = true
|
||||
custom_meshtastic_partition_scheme = 8MB
|
||||
|
||||
extends = esp32s3_base
|
||||
board_level = release
|
||||
board = unphone
|
||||
board_build.partitions = partition-table-8MB.csv
|
||||
upload_speed = 921600
|
||||
|
||||
@@ -11,6 +11,7 @@ custom_meshtastic_tags = Elecrow
|
||||
custom_meshtastic_has_ink_hud = true
|
||||
|
||||
extends = nrf52840_base
|
||||
board_level = release
|
||||
board = ThinkNode-M1
|
||||
board_check = true
|
||||
debug_tool = jlink
|
||||
@@ -41,6 +42,7 @@ lib_deps =
|
||||
|
||||
[env:thinknode_m1-inkhud]
|
||||
extends = nrf52840_base, inkhud
|
||||
board_level = release
|
||||
board = ThinkNode-M1
|
||||
board_check = true
|
||||
debug_tool = jlink
|
||||
|
||||
@@ -4,6 +4,7 @@ custom_meshtastic_images = thinknode_m3.svg
|
||||
custom_meshtastic_tags = Elecrow
|
||||
|
||||
extends = nrf52840_base
|
||||
board_level = release
|
||||
board = ThinkNode-M3
|
||||
board_check = true
|
||||
debug_tool = jlink
|
||||
|
||||
@@ -1,6 +1,7 @@
|
||||
; ThinkNode M4 - Powerbank nrf52840/LR1110 by Elecrow
|
||||
[env:thinknode_m4]
|
||||
extends = nrf52840_base
|
||||
board_level = release
|
||||
board = ThinkNode-M4
|
||||
board_check = true
|
||||
debug_tool = jlink
|
||||
|
||||
@@ -10,6 +10,7 @@ custom_meshtastic_images = thinknode_m6.svg
|
||||
custom_meshtastic_tags = Elecrow
|
||||
|
||||
extends = nrf52840_base
|
||||
board_level = release
|
||||
board = ThinkNode-M6
|
||||
board_check = true
|
||||
debug_tool = jlink
|
||||
|
||||
@@ -10,6 +10,7 @@ custom_meshtastic_display_name = Elecrow ThinkNode M8
|
||||
custom_meshtastic_actively_supported = true
|
||||
|
||||
extends = nrf52840_base
|
||||
board_level = release
|
||||
board = ThinkNode-M8
|
||||
board_check = true
|
||||
debug_tool = jlink
|
||||
|
||||
@@ -9,6 +9,7 @@ custom_meshtastic_display_name = Canary One
|
||||
custom_meshtastic_tags = Canary
|
||||
|
||||
extends = nrf52840_base
|
||||
board_level = release
|
||||
board = canaryone
|
||||
debug_tool = jlink
|
||||
|
||||
|
||||
@@ -11,6 +11,7 @@ custom_meshtastic_tags = DIY
|
||||
custom_meshtastic_requires_dfu = true
|
||||
|
||||
extends = nrf52840_base
|
||||
board_level = release
|
||||
board = promicro-nrf52840
|
||||
build_flags = ${nrf52840_base.build_flags}
|
||||
-I variants/nrf52840/diy/nrf52_promicro_diy_tcxo
|
||||
|
||||
@@ -1,6 +1,7 @@
|
||||
; The very slick RAK wireless RAK 4631 / 4630 board - Unified firmware for 5005/19003, with or without OLED RAK 1921
|
||||
[env:feather_diy]
|
||||
extends = nrf52840_base
|
||||
board_level = release
|
||||
board = adafruit_feather_nrf52840
|
||||
build_flags = ${nrf52840_base.build_flags}
|
||||
-Ivariants/nrf52840/feather_diy
|
||||
|
||||
@@ -10,6 +10,7 @@ custom_meshtastic_images = heltec-mesh-node-t096.svg, heltec-mesh-node-t096-case
|
||||
custom_meshtastic_tags = Heltec
|
||||
|
||||
extends = nrf52840_base
|
||||
board_level = release
|
||||
board = heltec_mesh_node_t096
|
||||
debug_tool = jlink
|
||||
|
||||
|
||||
@@ -10,6 +10,7 @@ custom_meshtastic_images = heltec-mesh-node-t1.svg
|
||||
custom_meshtastic_tags = Heltec
|
||||
|
||||
extends = nrf52840_base
|
||||
board_level = release
|
||||
board = heltec_mesh_node_t1
|
||||
debug_tool = jlink
|
||||
|
||||
|
||||
@@ -5,6 +5,7 @@ custom_meshtastic_images = heltec_mesh_pocket.svg
|
||||
custom_meshtastic_tags = Heltec
|
||||
|
||||
extends = nrf52840_base
|
||||
board_level = release
|
||||
board = heltec_mesh_pocket
|
||||
debug_tool = jlink
|
||||
custom_device_hw_model = 94
|
||||
@@ -43,6 +44,7 @@ lib_deps =
|
||||
|
||||
[env:heltec-mesh-pocket-5000-inkhud]
|
||||
extends = nrf52840_base, inkhud
|
||||
board_level = release
|
||||
board = heltec_mesh_pocket
|
||||
custom_meshtastic_hw_model = 94
|
||||
custom_meshtastic_hw_model_slug = HELTEC_MESH_POCKET
|
||||
@@ -70,6 +72,7 @@ custom_meshtastic_images = heltec_mesh_pocket.svg
|
||||
custom_meshtastic_tags = Heltec
|
||||
|
||||
extends = nrf52840_base
|
||||
board_level = release
|
||||
board = heltec_mesh_pocket
|
||||
debug_tool = jlink
|
||||
custom_meshtastic_hw_model = 94
|
||||
@@ -107,6 +110,7 @@ lib_deps =
|
||||
|
||||
[env:heltec-mesh-pocket-10000-inkhud]
|
||||
extends = nrf52840_base, inkhud
|
||||
board_level = release
|
||||
board = heltec_mesh_pocket
|
||||
custom_meshtastic_hw_model = 94
|
||||
custom_meshtastic_hw_model_slug = HELTEC_MESH_POCKET
|
||||
|
||||
@@ -28,11 +28,13 @@ custom_meshtastic_images = heltec-mesh-solar.svg
|
||||
custom_meshtastic_tags = Heltec
|
||||
|
||||
extends = heltec_mesh_solar_base
|
||||
board_level = release
|
||||
build_flags = ${heltec_mesh_solar_base.build_flags}
|
||||
-DSPI_INTERFACES_COUNT=1
|
||||
|
||||
[env:heltec-mesh-solar-eink]
|
||||
extends = heltec_mesh_solar_base
|
||||
board_level = release
|
||||
build_flags = ${heltec_mesh_solar_base.build_flags}
|
||||
-DHELTEC_MESH_SOLAR_EINK
|
||||
-DSPI_INTERFACES_COUNT=2
|
||||
@@ -71,6 +73,7 @@ lib_deps =
|
||||
|
||||
[env:heltec-mesh-solar-inkhud]
|
||||
extends = heltec_mesh_solar_base, inkhud
|
||||
board_level = release
|
||||
build_src_filter = ${heltec_mesh_solar_base.build_src_filter} ${inkhud.build_src_filter}
|
||||
build_flags = ${heltec_mesh_solar_base.build_flags}
|
||||
${inkhud.build_flags}
|
||||
@@ -92,6 +95,7 @@ lib_deps =
|
||||
|
||||
[env:heltec-mesh-solar-oled]
|
||||
extends = heltec_mesh_solar_base
|
||||
board_level = release
|
||||
build_flags = ${heltec_mesh_solar_base.build_flags}
|
||||
-DHELTEC_MESH_SOLAR_OLED
|
||||
-DSPI_INTERFACES_COUNT=1
|
||||
@@ -103,6 +107,7 @@ build_flags = ${heltec_mesh_solar_base.build_flags}
|
||||
|
||||
[env:heltec-mesh-solar-tft]
|
||||
extends = heltec_mesh_solar_base
|
||||
board_level = release
|
||||
build_flags = ${heltec_mesh_solar_base.build_flags}
|
||||
-UOLEDDISPLAY_REDUCE_MEMORY ; TFTDisplay.cpp needs the lib's buffer_back for dirty-window diffing
|
||||
-DHELTEC_MESH_SOLAR_TFT
|
||||
|
||||
@@ -10,6 +10,7 @@ custom_meshtastic_images = heltec-mesh-tower-v2.svg
|
||||
custom_meshtastic_tags = Heltec
|
||||
|
||||
extends = nrf52840_base
|
||||
board_level = release
|
||||
board = heltec_mesh_tower_v2
|
||||
debug_tool = jlink
|
||||
|
||||
|
||||
@@ -9,6 +9,7 @@ custom_meshtastic_images = muzi_base.svg
|
||||
custom_meshtastic_tags = muzi
|
||||
|
||||
extends = nrf52840_base
|
||||
board_level = release
|
||||
board = muzi-base
|
||||
build_flags = ${nrf52840_base.build_flags}
|
||||
-I variants/nrf52840/muzi_base
|
||||
|
||||
@@ -10,6 +10,7 @@ custom_meshtastic_images = nano-g2-ultra.svg
|
||||
custom_meshtastic_tags = B&Q
|
||||
|
||||
extends = nrf52840_base
|
||||
board_level = release
|
||||
board = nano-g2-ultra
|
||||
debug_tool = jlink
|
||||
|
||||
|
||||
@@ -10,6 +10,7 @@ custom_meshtastic_images = muzi_r1_neo.svg
|
||||
custom_meshtastic_tags = muzi
|
||||
|
||||
extends = nrf52840_base
|
||||
board_level = release
|
||||
board = r1-neo
|
||||
board_check = true
|
||||
build_flags = ${nrf52840_base.build_flags}
|
||||
|
||||
@@ -10,6 +10,7 @@ custom_meshtastic_images = rak2560.svg
|
||||
custom_meshtastic_tags = RAK
|
||||
|
||||
extends = nrf52840_base
|
||||
board_level = release
|
||||
board = wiscore_rak4631
|
||||
board_check = true
|
||||
build_flags = ${nrf52840_base.build_flags}
|
||||
|
||||
@@ -11,6 +11,7 @@ custom_meshtastic_tags = RAK
|
||||
custom_meshtastic_requires_dfu = true
|
||||
|
||||
extends = nrf52840_base
|
||||
board_level = release
|
||||
board = wiscore_rak4631
|
||||
board_check = true
|
||||
build_flags = ${nrf52840_base.build_flags}
|
||||
@@ -39,6 +40,7 @@ lib_deps =
|
||||
; RAK10729 WisMesh Repeater Mini V2 HP (RAK3401 + RAK19007 + RAK13302 + solar battery)
|
||||
[env:rak_wismesh_repeater_mini_hp]
|
||||
extends = env:rak3401-1watt
|
||||
board_level = release
|
||||
custom_meshtastic_display_name = RAK WisMesh Repeater Mini V2 HP
|
||||
custom_meshtastic_images = rak3401.svg
|
||||
build_flags =
|
||||
|
||||
@@ -47,6 +47,7 @@ lib_deps =
|
||||
; RAK10728 WisMesh Repeater Mini V2 (RAK4631 + RAK19003 + solar battery + GPS module)
|
||||
[env:rak_wismesh_repeater_mini]
|
||||
extends = env:rak4631
|
||||
board_level = release
|
||||
custom_meshtastic_display_name = RAK WisMesh Repeater Mini V2
|
||||
custom_meshtastic_images = rak4631.svg
|
||||
build_flags =
|
||||
@@ -59,6 +60,7 @@ build_flags =
|
||||
; RAK WisMesh Pocket V3 - rak4631 pin map + OLED; no ethernet (unlike env:rak4631)
|
||||
[env:rak_wismesh_pocket]
|
||||
extends = env:rak4631
|
||||
board_level = release
|
||||
custom_meshtastic_display_name = RAK WisMesh Pocket V3
|
||||
custom_meshtastic_images = rak4631.svg
|
||||
build_flags =
|
||||
|
||||
@@ -1,6 +1,7 @@
|
||||
; The very slick RAK wireless RAK 4631 / 4630 board - Firmware for 5005 with the RAK 14000 ePaper
|
||||
[env:rak4631_eink]
|
||||
extends = nrf52840_base
|
||||
board_level = release
|
||||
board = wiscore_rak4631
|
||||
build_flags = ${nrf52840_base.build_flags}
|
||||
-I variants/nrf52840/rak4631_epaper
|
||||
|
||||
@@ -1,6 +1,7 @@
|
||||
; The very slick RAK wireless RAK 4631 / 4630 board - Unified firmware for 5005/19003, with or without OLED RAK 1921
|
||||
[env:rak4631_eth_gw]
|
||||
extends = nrf52840_base
|
||||
board_level = release
|
||||
board = wiscore_rak4631
|
||||
board_check = true
|
||||
build_flags = ${nrf52840_base.build_flags}
|
||||
|
||||
@@ -10,6 +10,7 @@ custom_meshtastic_images = meteor_pro.svg
|
||||
custom_meshtastic_tags = NomadStar
|
||||
|
||||
extends = nrf52840_base
|
||||
board_level = release
|
||||
board = wiscore_rak4631
|
||||
board_check = true
|
||||
build_flags = ${nrf52840_base.build_flags}
|
||||
|
||||
@@ -5,6 +5,7 @@ custom_meshtastic_images = rak_wismesh_tag.svg
|
||||
custom_meshtastic_tags = RAK
|
||||
|
||||
extends = nrf52840_base
|
||||
board_level = release
|
||||
board = wiscore_rak4631
|
||||
board_check = true
|
||||
custom_meshtastic_hw_model = 105
|
||||
@@ -26,6 +27,7 @@ build_src_filter = ${nrf52_base.build_src_filter} +<../variants/nrf52840/rak_wis
|
||||
; RAK WisMesh Pod - same board as Tag (no user buttons on hardware; shares Tag pin map)
|
||||
[env:rak_wismesh_pod]
|
||||
extends = env:rak_wismeshtag
|
||||
board_level = release
|
||||
custom_meshtastic_display_name = RAK WisMesh Pod
|
||||
build_flags =
|
||||
${env:rak_wismeshtag.build_flags}
|
||||
|
||||
@@ -10,6 +10,7 @@ custom_meshtastic_images = rak-wismeshtap.svg
|
||||
custom_meshtastic_tags = RAK
|
||||
|
||||
extends = nrf52840_base
|
||||
board_level = release
|
||||
board = wiscore_rak4631
|
||||
build_flags = ${nrf52840_base.build_flags}
|
||||
-UOLEDDISPLAY_REDUCE_MEMORY ; TFTDisplay.cpp needs the lib's buffer_back for dirty-window diffing
|
||||
|
||||
@@ -10,6 +10,7 @@ custom_meshtastic_tags = Seeed
|
||||
|
||||
board = seeed_solar_node
|
||||
extends = nrf52840_base
|
||||
board_level = release
|
||||
;board_level = extra
|
||||
build_flags = ${nrf52840_base.build_flags}
|
||||
-I variants/nrf52840/seeed_solar_node
|
||||
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user