mirror of
https://github.com/alexhopeoconnor/firmware.git
synced 2026-10-22 03:02:08 +10:00
Compare commits
19
Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
8d5dbdbdbf | ||
|
|
9cf369c5d0 | ||
|
|
2ca03fbf4b | ||
|
|
567b8ea1c2 | ||
|
|
d39d1917ad | ||
|
|
b202559d37 | ||
|
|
85ea22ac38 | ||
|
|
15257b017c | ||
|
|
59864dd09d | ||
|
|
edcdb2dcb2 | ||
|
|
ef4cb2abfb | ||
|
|
c34f94abda | ||
|
|
a8d1a90e16 | ||
|
|
501c296e75 | ||
|
|
ec5e79585b | ||
|
|
438e170b03 | ||
|
|
43e0c35466 | ||
|
|
6e3be132f2 | ||
|
|
0aa11d810c |
@@ -1,7 +1,7 @@
|
|||||||
# trunk-ignore-all(terrascan/AC_DOCKER_0002): Known terrascan issue
|
# trunk-ignore-all(terrascan/AC_DOCKER_0002): Known terrascan issue
|
||||||
# trunk-ignore-all(hadolint/DL3008): Do not pin apt package versions
|
# trunk-ignore-all(hadolint/DL3008): Do not pin apt package versions
|
||||||
# trunk-ignore-all(hadolint/DL3013): Do not pin pip package versions
|
# trunk-ignore-all(hadolint/DL3013): Do not pin pip package versions
|
||||||
FROM mcr.microsoft.com/devcontainers/cpp:2-debian-12
|
FROM mcr.microsoft.com/devcontainers/cpp:2-debian-13
|
||||||
|
|
||||||
USER root
|
USER root
|
||||||
|
|
||||||
|
|||||||
@@ -143,7 +143,7 @@ jobs:
|
|||||||
merge-multiple: true
|
merge-multiple: true
|
||||||
|
|
||||||
- name: Test Report
|
- name: Test Report
|
||||||
uses: dorny/test-reporter@v2.1.1
|
uses: dorny/test-reporter@v2.2.0
|
||||||
with:
|
with:
|
||||||
name: PlatformIO Tests
|
name: PlatformIO Tests
|
||||||
path: testreport.xml
|
path: testreport.xml
|
||||||
|
|||||||
+4
-3
@@ -8,7 +8,8 @@ ARG PIO_ENV=native
|
|||||||
ENV PIP_ROOT_USER_ACTION=ignore
|
ENV PIP_ROOT_USER_ACTION=ignore
|
||||||
|
|
||||||
RUN apk --no-cache add \
|
RUN apk --no-cache add \
|
||||||
bash g++ libstdc++-dev linux-headers zip git ca-certificates libgpiod-dev yaml-cpp-dev bluez-dev \
|
bash g++ libstdc++-dev linux-headers zip git ca-certificates libbsd-dev \
|
||||||
|
libgpiod-dev yaml-cpp-dev bluez-dev \
|
||||||
libusb-dev i2c-tools-dev libuv-dev openssl-dev pkgconf argp-standalone \
|
libusb-dev i2c-tools-dev libuv-dev openssl-dev pkgconf argp-standalone \
|
||||||
libx11-dev libinput-dev libxkbcommon-dev \
|
libx11-dev libinput-dev libxkbcommon-dev \
|
||||||
&& rm -rf /var/cache/apk/* \
|
&& rm -rf /var/cache/apk/* \
|
||||||
@@ -40,8 +41,8 @@ LABEL org.opencontainers.image.title="Meshtastic" \
|
|||||||
USER root
|
USER root
|
||||||
|
|
||||||
RUN apk --no-cache add \
|
RUN apk --no-cache add \
|
||||||
shadow libstdc++ libgpiod yaml-cpp libusb i2c-tools libuv \
|
shadow libstdc++ libbsd libgpiod yaml-cpp libusb \
|
||||||
libx11 libinput libxkbcommon \
|
i2c-tools libuv libx11 libinput libxkbcommon \
|
||||||
&& rm -rf /var/cache/apk/* \
|
&& rm -rf /var/cache/apk/* \
|
||||||
&& mkdir -p /var/lib/meshtasticd \
|
&& mkdir -p /var/lib/meshtasticd \
|
||||||
&& mkdir -p /etc/meshtasticd/config.d \
|
&& mkdir -p /etc/meshtasticd/config.d \
|
||||||
|
|||||||
@@ -87,6 +87,9 @@
|
|||||||
</screenshots>
|
</screenshots>
|
||||||
|
|
||||||
<releases>
|
<releases>
|
||||||
|
<release version="2.7.15" date="2025-11-13">
|
||||||
|
<url type="details">https://github.com/meshtastic/firmware/releases?q=tag%3Av2.7.15</url>
|
||||||
|
</release>
|
||||||
<release version="2.7.14" date="2025-11-03">
|
<release version="2.7.14" date="2025-11-03">
|
||||||
<url type="details">https://github.com/meshtastic/firmware/releases?q=tag%3Av2.7.14</url>
|
<url type="details">https://github.com/meshtastic/firmware/releases?q=tag%3Av2.7.14</url>
|
||||||
</release>
|
</release>
|
||||||
|
|||||||
Vendored
+6
@@ -1,3 +1,9 @@
|
|||||||
|
meshtasticd (2.7.15.0) unstable; urgency=medium
|
||||||
|
|
||||||
|
* Version 2.7.15
|
||||||
|
|
||||||
|
-- GitHub Actions <github-actions[bot]@users.noreply.github.com> Thu, 13 Nov 2025 12:31:57 +0000
|
||||||
|
|
||||||
meshtasticd (2.7.14.0) unstable; urgency=medium
|
meshtasticd (2.7.14.0) unstable; urgency=medium
|
||||||
|
|
||||||
* Version 2.7.14
|
* Version 2.7.14
|
||||||
|
|||||||
Vendored
+1
@@ -3,6 +3,7 @@ Section: misc
|
|||||||
Priority: optional
|
Priority: optional
|
||||||
Maintainer: Austin Lane <vidplace7@gmail.com>
|
Maintainer: Austin Lane <vidplace7@gmail.com>
|
||||||
Build-Depends: debhelper-compat (= 13),
|
Build-Depends: debhelper-compat (= 13),
|
||||||
|
libc6-dev (>= 2.38) | libbsd-dev,
|
||||||
lsb-release,
|
lsb-release,
|
||||||
tar,
|
tar,
|
||||||
gzip,
|
gzip,
|
||||||
|
|||||||
@@ -49,6 +49,13 @@ BuildRequires: pkgconfig(x11)
|
|||||||
BuildRequires: pkgconfig(libinput)
|
BuildRequires: pkgconfig(libinput)
|
||||||
BuildRequires: pkgconfig(xkbcommon-x11)
|
BuildRequires: pkgconfig(xkbcommon-x11)
|
||||||
|
|
||||||
|
# libbsd is needed on older Fedora/RHEL to provide 'strlcpy'
|
||||||
|
%if 0%{?fedora} >= 39 || 0%{?rhel} >= 10
|
||||||
|
BuildRequires: glibc-devel >= 2.38
|
||||||
|
%else
|
||||||
|
BuildRequires: pkgconfig(libbsd-overlay)
|
||||||
|
%endif
|
||||||
|
|
||||||
Requires: systemd-udev
|
Requires: systemd-udev
|
||||||
|
|
||||||
%description
|
%description
|
||||||
|
|||||||
+1
-1
@@ -62,7 +62,7 @@ monitor_speed = 115200
|
|||||||
monitor_filters = direct
|
monitor_filters = direct
|
||||||
lib_deps =
|
lib_deps =
|
||||||
# renovate: datasource=git-refs depName=meshtastic-esp8266-oled-ssd1306 packageName=https://github.com/meshtastic/esp8266-oled-ssd1306 gitBranch=master
|
# renovate: datasource=git-refs depName=meshtastic-esp8266-oled-ssd1306 packageName=https://github.com/meshtastic/esp8266-oled-ssd1306 gitBranch=master
|
||||||
https://github.com/meshtastic/esp8266-oled-ssd1306/archive/0cbc26b1f8f61957af0475f486b362eafe7cc4e2.zip
|
https://github.com/meshtastic/esp8266-oled-ssd1306/archive/2887bf4a19f64d92c984dcc8fd5ca7429e425e4a.zip
|
||||||
# renovate: datasource=git-refs depName=meshtastic-OneButton packageName=https://github.com/meshtastic/OneButton gitBranch=master
|
# renovate: datasource=git-refs depName=meshtastic-OneButton packageName=https://github.com/meshtastic/OneButton gitBranch=master
|
||||||
https://github.com/meshtastic/OneButton/archive/fa352d668c53f290cfa480a5f79ad422cd828c70.zip
|
https://github.com/meshtastic/OneButton/archive/fa352d668c53f290cfa480a5f79ad422cd828c70.zip
|
||||||
# renovate: datasource=git-refs depName=meshtastic-arduino-fsm packageName=https://github.com/meshtastic/arduino-fsm gitBranch=master
|
# renovate: datasource=git-refs depName=meshtastic-arduino-fsm packageName=https://github.com/meshtastic/arduino-fsm gitBranch=master
|
||||||
|
|||||||
@@ -50,6 +50,7 @@ void consolePrintf(const char *format, ...)
|
|||||||
|
|
||||||
SerialConsole::SerialConsole() : StreamAPI(&Port), RedirectablePrint(&Port), concurrency::OSThread("SerialConsole")
|
SerialConsole::SerialConsole() : StreamAPI(&Port), RedirectablePrint(&Port), concurrency::OSThread("SerialConsole")
|
||||||
{
|
{
|
||||||
|
api_type = TYPE_SERIAL;
|
||||||
assert(!console);
|
assert(!console);
|
||||||
console = this;
|
console = this;
|
||||||
canWrite = false; // We don't send packets to our port until it has talked to us first
|
canWrite = false; // We don't send packets to our port until it has talked to us first
|
||||||
|
|||||||
@@ -1,6 +1,8 @@
|
|||||||
#include "configuration.h"
|
#include "configuration.h"
|
||||||
#if HAS_SCREEN
|
#if HAS_SCREEN
|
||||||
|
#include "MeshService.h"
|
||||||
#include "RTC.h"
|
#include "RTC.h"
|
||||||
|
#include "draw/NodeListRenderer.h"
|
||||||
#include "graphics/ScreenFonts.h"
|
#include "graphics/ScreenFonts.h"
|
||||||
#include "graphics/SharedUIDisplay.h"
|
#include "graphics/SharedUIDisplay.h"
|
||||||
#include "graphics/draw/UIRenderer.h"
|
#include "graphics/draw/UIRenderer.h"
|
||||||
@@ -398,6 +400,43 @@ const int *getTextPositions(OLEDDisplay *display)
|
|||||||
return textPositions;
|
return textPositions;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// *************************
|
||||||
|
// * Common Footer Drawing *
|
||||||
|
// *************************
|
||||||
|
void drawCommonFooter(OLEDDisplay *display, int16_t x, int16_t y)
|
||||||
|
{
|
||||||
|
bool drawConnectionState = false;
|
||||||
|
if (service->api_state == service->STATE_BLE || service->api_state == service->STATE_WIFI ||
|
||||||
|
service->api_state == service->STATE_SERIAL || service->api_state == service->STATE_PACKET ||
|
||||||
|
service->api_state == service->STATE_HTTP || service->api_state == service->STATE_ETH) {
|
||||||
|
drawConnectionState = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (drawConnectionState) {
|
||||||
|
if (isHighResolution) {
|
||||||
|
const int scale = 2;
|
||||||
|
const int bytesPerRow = (connection_icon_width + 7) / 8;
|
||||||
|
int iconX = 0;
|
||||||
|
int iconY = SCREEN_HEIGHT - (connection_icon_height * 2);
|
||||||
|
|
||||||
|
for (int yy = 0; yy < connection_icon_height; ++yy) {
|
||||||
|
const uint8_t *rowPtr = connection_icon + yy * bytesPerRow;
|
||||||
|
for (int xx = 0; xx < connection_icon_width; ++xx) {
|
||||||
|
const uint8_t byteVal = pgm_read_byte(rowPtr + (xx >> 3));
|
||||||
|
const uint8_t bitMask = 1U << (xx & 7); // XBM is LSB-first
|
||||||
|
if (byteVal & bitMask) {
|
||||||
|
display->fillRect(iconX + xx * scale, iconY + yy * scale, scale, scale);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
} else {
|
||||||
|
display->drawXbm(0, SCREEN_HEIGHT - connection_icon_height, connection_icon_width, connection_icon_height,
|
||||||
|
connection_icon);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
bool isAllowedPunctuation(char c)
|
bool isAllowedPunctuation(char c)
|
||||||
{
|
{
|
||||||
const std::string allowed = ".,!?;:-_()[]{}'\"@#$/\\&+=%~^ ";
|
const std::string allowed = ".,!?;:-_()[]{}'\"@#$/\\&+=%~^ ";
|
||||||
|
|||||||
@@ -52,6 +52,9 @@ void drawRoundedHighlight(OLEDDisplay *display, int16_t x, int16_t y, int16_t w,
|
|||||||
void drawCommonHeader(OLEDDisplay *display, int16_t x, int16_t y, const char *titleStr = "", bool force_no_invert = false,
|
void drawCommonHeader(OLEDDisplay *display, int16_t x, int16_t y, const char *titleStr = "", bool force_no_invert = false,
|
||||||
bool show_date = false);
|
bool show_date = false);
|
||||||
|
|
||||||
|
// Shared battery/time/mail header
|
||||||
|
void drawCommonFooter(OLEDDisplay *display, int16_t x, int16_t y);
|
||||||
|
|
||||||
const int *getTextPositions(OLEDDisplay *display);
|
const int *getTextPositions(OLEDDisplay *display);
|
||||||
|
|
||||||
bool isAllowedPunctuation(char c);
|
bool isAllowedPunctuation(char c);
|
||||||
|
|||||||
@@ -483,6 +483,8 @@ class LGFX : public lgfx::LGFX_Device
|
|||||||
lgfx::Touch_FT5x06 _touch_instance;
|
lgfx::Touch_FT5x06 _touch_instance;
|
||||||
#elif defined(HELTEC_V4_TFT)
|
#elif defined(HELTEC_V4_TFT)
|
||||||
lgfx::TOUCH_CHSC6X _touch_instance;
|
lgfx::TOUCH_CHSC6X _touch_instance;
|
||||||
|
#elif defined(HELTEC_V4_TFT)
|
||||||
|
lgfx::TOUCH_CHSC6X _touch_instance;
|
||||||
#else
|
#else
|
||||||
lgfx::Touch_GT911 _touch_instance;
|
lgfx::Touch_GT911 _touch_instance;
|
||||||
#endif
|
#endif
|
||||||
|
|||||||
@@ -302,6 +302,8 @@ void drawDigitalClockFrame(OLEDDisplay *display, OLEDDisplayUiState *state, int1
|
|||||||
display->drawString(startingHourMinuteTextX + timeStringWidth - xOffset, (display->getHeight() - hourMinuteTextY) - yOffset,
|
display->drawString(startingHourMinuteTextX + timeStringWidth - xOffset, (display->getHeight() - hourMinuteTextY) - yOffset,
|
||||||
secondString);
|
secondString);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
graphics::drawCommonFooter(display, x, y);
|
||||||
}
|
}
|
||||||
|
|
||||||
void drawBluetoothConnectedIcon(OLEDDisplay *display, int16_t x, int16_t y)
|
void drawBluetoothConnectedIcon(OLEDDisplay *display, int16_t x, int16_t y)
|
||||||
@@ -516,6 +518,7 @@ void drawAnalogClockFrame(OLEDDisplay *display, OLEDDisplayUiState *state, int16
|
|||||||
display->drawLine(centerX, centerY, secondX, secondY);
|
display->drawLine(centerX, centerY, secondX, secondY);
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
graphics::drawCommonFooter(display, x, y);
|
||||||
}
|
}
|
||||||
|
|
||||||
} // namespace ClockRenderer
|
} // namespace ClockRenderer
|
||||||
|
|||||||
@@ -3,6 +3,7 @@
|
|||||||
#include "../Screen.h"
|
#include "../Screen.h"
|
||||||
#include "DebugRenderer.h"
|
#include "DebugRenderer.h"
|
||||||
#include "FSCommon.h"
|
#include "FSCommon.h"
|
||||||
|
#include "MeshService.h"
|
||||||
#include "NodeDB.h"
|
#include "NodeDB.h"
|
||||||
#include "Throttle.h"
|
#include "Throttle.h"
|
||||||
#include "UIRenderer.h"
|
#include "UIRenderer.h"
|
||||||
@@ -223,6 +224,8 @@ void drawFrameWiFi(OLEDDisplay *display, OLEDDisplayUiState *state, int16_t x, i
|
|||||||
|
|
||||||
display->drawString(x, getTextPositions(display)[line++], "URL: http://meshtastic.local");
|
display->drawString(x, getTextPositions(display)[line++], "URL: http://meshtastic.local");
|
||||||
|
|
||||||
|
graphics::drawCommonFooter(display, x, y);
|
||||||
|
|
||||||
/* Display a heartbeat pixel that blinks every time the frame is redrawn */
|
/* Display a heartbeat pixel that blinks every time the frame is redrawn */
|
||||||
#ifdef SHOW_REDRAWS
|
#ifdef SHOW_REDRAWS
|
||||||
if (heartbeat)
|
if (heartbeat)
|
||||||
@@ -503,6 +506,7 @@ void drawLoRaFocused(OLEDDisplay *display, OLEDDisplayUiState *state, int16_t x,
|
|||||||
display->drawString(starting_position + chUtil_x + chutil_bar_width + extraoffset, getTextPositions(display)[line++],
|
display->drawString(starting_position + chUtil_x + chutil_bar_width + extraoffset, getTextPositions(display)[line++],
|
||||||
chUtilPercentage);
|
chUtilPercentage);
|
||||||
#endif
|
#endif
|
||||||
|
graphics::drawCommonFooter(display, x, y);
|
||||||
}
|
}
|
||||||
|
|
||||||
// ****************************
|
// ****************************
|
||||||
@@ -642,10 +646,9 @@ void drawSystemScreen(OLEDDisplay *display, OLEDDisplayUiState *state, int16_t x
|
|||||||
int textWidth = display->getStringWidth(appversionstr);
|
int textWidth = display->getStringWidth(appversionstr);
|
||||||
int nameX = (SCREEN_WIDTH - textWidth) / 2;
|
int nameX = (SCREEN_WIDTH - textWidth) / 2;
|
||||||
|
|
||||||
display->drawString(nameX, getTextPositions(display)[line], appversionstr);
|
display->drawString(nameX, getTextPositions(display)[line++], appversionstr);
|
||||||
#if !defined(M5STACK_UNITC6L)
|
|
||||||
if (SCREEN_HEIGHT > 64 || (SCREEN_HEIGHT <= 64 && line < 4)) { // Only show uptime if the screen can show it
|
if (SCREEN_HEIGHT > 64 || (SCREEN_HEIGHT <= 64 && line <= 5)) { // Only show uptime if the screen can show it
|
||||||
line += 1;
|
|
||||||
char uptimeStr[32] = "";
|
char uptimeStr[32] = "";
|
||||||
uint32_t uptime = millis() / 1000;
|
uint32_t uptime = millis() / 1000;
|
||||||
uint32_t days = uptime / 86400;
|
uint32_t days = uptime / 86400;
|
||||||
@@ -660,9 +663,41 @@ void drawSystemScreen(OLEDDisplay *display, OLEDDisplayUiState *state, int16_t x
|
|||||||
snprintf(uptimeStr, sizeof(uptimeStr), " Uptime: %um", mins);
|
snprintf(uptimeStr, sizeof(uptimeStr), " Uptime: %um", mins);
|
||||||
textWidth = display->getStringWidth(uptimeStr);
|
textWidth = display->getStringWidth(uptimeStr);
|
||||||
nameX = (SCREEN_WIDTH - textWidth) / 2;
|
nameX = (SCREEN_WIDTH - textWidth) / 2;
|
||||||
display->drawString(nameX, getTextPositions(display)[line], uptimeStr);
|
display->drawString(nameX, getTextPositions(display)[line++], uptimeStr);
|
||||||
}
|
}
|
||||||
#endif
|
|
||||||
|
if (SCREEN_HEIGHT > 64 || (SCREEN_HEIGHT <= 64 && line <= 5)) { // Only show API state if the screen can show it
|
||||||
|
char api_state[32] = "";
|
||||||
|
const char *clientWord = nullptr;
|
||||||
|
|
||||||
|
// Determine if narrow or wide screen
|
||||||
|
if (isHighResolution) {
|
||||||
|
clientWord = "Client";
|
||||||
|
} else {
|
||||||
|
clientWord = "App";
|
||||||
|
}
|
||||||
|
snprintf(api_state, sizeof(api_state), "No %ss Connected", clientWord);
|
||||||
|
|
||||||
|
if (service->api_state == service->STATE_BLE) {
|
||||||
|
snprintf(api_state, sizeof(api_state), "%s Connected (BLE)", clientWord);
|
||||||
|
} else if (service->api_state == service->STATE_WIFI) {
|
||||||
|
snprintf(api_state, sizeof(api_state), "%s Connected (WiFi)", clientWord);
|
||||||
|
} else if (service->api_state == service->STATE_SERIAL) {
|
||||||
|
snprintf(api_state, sizeof(api_state), "%s Connected (Serial)", clientWord);
|
||||||
|
} else if (service->api_state == service->STATE_PACKET) {
|
||||||
|
snprintf(api_state, sizeof(api_state), "%s Connected (Internal)", clientWord);
|
||||||
|
} else if (service->api_state == service->STATE_HTTP) {
|
||||||
|
snprintf(api_state, sizeof(api_state), "%s Connected (HTTP)", clientWord);
|
||||||
|
} else if (service->api_state == service->STATE_ETH) {
|
||||||
|
snprintf(api_state, sizeof(api_state), "%s Connected (Ethernet)", clientWord);
|
||||||
|
}
|
||||||
|
if (api_state[0] != '\0') {
|
||||||
|
display->drawString((SCREEN_WIDTH - display->getStringWidth(api_state)) / 2, getTextPositions(display)[line++],
|
||||||
|
api_state);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
graphics::drawCommonFooter(display, x, y);
|
||||||
}
|
}
|
||||||
|
|
||||||
// ****************************
|
// ****************************
|
||||||
|
|||||||
@@ -790,17 +790,24 @@ void menuHandler::nodeNameLengthMenu()
|
|||||||
|
|
||||||
void menuHandler::resetNodeDBMenu()
|
void menuHandler::resetNodeDBMenu()
|
||||||
{
|
{
|
||||||
static const char *optionsArray[] = {"Back", "Confirm"};
|
static const char *optionsArray[] = {"Back", "Reset All", "Preserve Favorites"};
|
||||||
BannerOverlayOptions bannerOptions;
|
BannerOverlayOptions bannerOptions;
|
||||||
bannerOptions.message = "Confirm Reset NodeDB";
|
bannerOptions.message = "Confirm Reset NodeDB";
|
||||||
bannerOptions.optionsArrayPtr = optionsArray;
|
bannerOptions.optionsArrayPtr = optionsArray;
|
||||||
bannerOptions.optionsCount = 2;
|
bannerOptions.optionsCount = 3;
|
||||||
bannerOptions.bannerCallback = [](int selected) -> void {
|
bannerOptions.bannerCallback = [](int selected) -> void {
|
||||||
if (selected == 1) {
|
if (selected == 1 || selected == 2) {
|
||||||
disableBluetooth();
|
disableBluetooth();
|
||||||
|
screen->setFrames(Screen::FOCUS_DEFAULT);
|
||||||
|
}
|
||||||
|
if (selected == 1) {
|
||||||
LOG_INFO("Initiate node-db reset");
|
LOG_INFO("Initiate node-db reset");
|
||||||
nodeDB->resetNodes();
|
nodeDB->resetNodes();
|
||||||
rebootAtMsec = (millis() + DEFAULT_REBOOT_SECONDS * 1000);
|
rebootAtMsec = (millis() + DEFAULT_REBOOT_SECONDS * 1000);
|
||||||
|
} else if (selected == 2) {
|
||||||
|
LOG_INFO("Initiate node-db reset but keeping favorites");
|
||||||
|
nodeDB->resetNodes(1);
|
||||||
|
rebootAtMsec = (millis() + DEFAULT_REBOOT_SECONDS * 1000);
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
screen->showOverlayBanner(bannerOptions);
|
screen->showOverlayBanner(bannerOptions);
|
||||||
|
|||||||
@@ -213,6 +213,7 @@ void drawTextMessageFrame(OLEDDisplay *display, OLEDDisplayUiState *state, int16
|
|||||||
#else
|
#else
|
||||||
display->drawString(center_text, getTextPositions(display)[2], messageString);
|
display->drawString(center_text, getTextPositions(display)[2], messageString);
|
||||||
#endif
|
#endif
|
||||||
|
graphics::drawCommonFooter(display, x, y);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -423,6 +424,7 @@ void drawTextMessageFrame(OLEDDisplay *display, OLEDDisplayUiState *state, int16
|
|||||||
// Draw header at the end to sort out overlapping elements
|
// Draw header at the end to sort out overlapping elements
|
||||||
graphics::drawCommonHeader(display, x, y, titleStr);
|
graphics::drawCommonHeader(display, x, y, titleStr);
|
||||||
#endif
|
#endif
|
||||||
|
graphics::drawCommonFooter(display, x, y);
|
||||||
}
|
}
|
||||||
|
|
||||||
std::vector<std::string> generateLines(OLEDDisplay *display, const char *headerStr, const char *messageBuf, int textWidth)
|
std::vector<std::string> generateLines(OLEDDisplay *display, const char *headerStr, const char *messageBuf, int textWidth)
|
||||||
|
|||||||
@@ -492,6 +492,7 @@ void drawNodeListScreen(OLEDDisplay *display, OLEDDisplayUiState *state, int16_t
|
|||||||
#endif
|
#endif
|
||||||
const int scrollStartY = y + 3;
|
const int scrollStartY = y + 3;
|
||||||
drawScrollbar(display, visibleNodeRows, totalEntries, scrollIndex, 2, scrollStartY);
|
drawScrollbar(display, visibleNodeRows, totalEntries, scrollIndex, 2, scrollStartY);
|
||||||
|
graphics::drawCommonFooter(display, x, y);
|
||||||
}
|
}
|
||||||
|
|
||||||
// =============================
|
// =============================
|
||||||
|
|||||||
@@ -552,6 +552,7 @@ void UIRenderer::drawNodeInfo(OLEDDisplay *display, const OLEDDisplayUiState *st
|
|||||||
// else show nothing
|
// else show nothing
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
graphics::drawCommonFooter(display, x, y);
|
||||||
}
|
}
|
||||||
|
|
||||||
// ****************************
|
// ****************************
|
||||||
@@ -771,6 +772,7 @@ void UIRenderer::drawDeviceFocused(OLEDDisplay *display, OLEDDisplayUiState *sta
|
|||||||
display->drawString(nameX, getTextPositions(display)[line++], shortnameble);
|
display->drawString(nameX, getTextPositions(display)[line++], shortnameble);
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
graphics::drawCommonFooter(display, x, y);
|
||||||
}
|
}
|
||||||
|
|
||||||
// Start Functions to write date/time to the screen
|
// Start Functions to write date/time to the screen
|
||||||
@@ -1183,6 +1185,7 @@ void UIRenderer::drawCompassAndLocationScreen(OLEDDisplay *display, OLEDDisplayU
|
|||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
#endif // HAS_GPS
|
#endif // HAS_GPS
|
||||||
|
graphics::drawCommonFooter(display, x, y);
|
||||||
}
|
}
|
||||||
|
|
||||||
#ifdef USERPREFS_OEM_TEXT
|
#ifdef USERPREFS_OEM_TEXT
|
||||||
@@ -1267,7 +1270,13 @@ void UIRenderer::drawNavigationBar(OLEDDisplay *display, OLEDDisplayUiState *sta
|
|||||||
if (totalIcons == 0)
|
if (totalIcons == 0)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
const size_t iconsPerPage = (SCREEN_WIDTH + spacing) / (iconSize + spacing);
|
const int navPadding = isHighResolution ? 24 : 12; // padding per side
|
||||||
|
|
||||||
|
int usableWidth = SCREEN_WIDTH - (navPadding * 2);
|
||||||
|
if (usableWidth < iconSize)
|
||||||
|
usableWidth = iconSize;
|
||||||
|
|
||||||
|
const size_t iconsPerPage = usableWidth / (iconSize + spacing);
|
||||||
const size_t currentPage = currentFrame / iconsPerPage;
|
const size_t currentPage = currentFrame / iconsPerPage;
|
||||||
const size_t pageStart = currentPage * iconsPerPage;
|
const size_t pageStart = currentPage * iconsPerPage;
|
||||||
const size_t pageEnd = min(pageStart + iconsPerPage, totalIcons);
|
const size_t pageEnd = min(pageStart + iconsPerPage, totalIcons);
|
||||||
@@ -1338,6 +1347,47 @@ void UIRenderer::drawNavigationBar(OLEDDisplay *display, OLEDDisplayUiState *sta
|
|||||||
display->setColor(WHITE);
|
display->setColor(WHITE);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Compact arrow drawer
|
||||||
|
auto drawArrow = [&](bool rightSide) {
|
||||||
|
display->setColor(WHITE);
|
||||||
|
|
||||||
|
const int offset = isHighResolution ? 3 : 1;
|
||||||
|
const int halfH = rectHeight / 2;
|
||||||
|
|
||||||
|
const int top = (y - 2) + (rectHeight - halfH) / 2;
|
||||||
|
const int bottom = top + halfH - 1;
|
||||||
|
const int midY = top + (halfH / 2);
|
||||||
|
|
||||||
|
const int maxW = 4;
|
||||||
|
|
||||||
|
// Determine left X coordinate
|
||||||
|
int baseX = rightSide ? (rectX + rectWidth + offset) : // right arrow
|
||||||
|
(rectX - offset - 1); // left arrow
|
||||||
|
|
||||||
|
for (int yy = top; yy <= bottom; yy++) {
|
||||||
|
int dist = abs(yy - midY);
|
||||||
|
int lineW = maxW - (dist * maxW / (halfH / 2));
|
||||||
|
if (lineW < 1)
|
||||||
|
lineW = 1;
|
||||||
|
|
||||||
|
if (rightSide) {
|
||||||
|
display->drawHorizontalLine(baseX, yy, lineW);
|
||||||
|
} else {
|
||||||
|
display->drawHorizontalLine(baseX - lineW + 1, yy, lineW);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
};
|
||||||
|
// Right arrow
|
||||||
|
if (pageEnd < totalIcons) {
|
||||||
|
drawArrow(true);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Left arrow
|
||||||
|
if (pageStart > 0) {
|
||||||
|
drawArrow(false);
|
||||||
|
}
|
||||||
|
|
||||||
// Knock the corners off the square
|
// Knock the corners off the square
|
||||||
display->setColor(BLACK);
|
display->setColor(BLACK);
|
||||||
display->drawRect(rectX, y - 2, 1, 1);
|
display->drawRect(rectX, y - 2, 1, 1);
|
||||||
|
|||||||
@@ -360,6 +360,10 @@ const uint8_t chirpy_hirez[] = {
|
|||||||
#define chirpy_small_image_height 8
|
#define chirpy_small_image_height 8
|
||||||
const uint8_t chirpy_small[] = {0x7f, 0x41, 0x55, 0x55, 0x55, 0x55, 0x41, 0x7f};
|
const uint8_t chirpy_small[] = {0x7f, 0x41, 0x55, 0x55, 0x55, 0x55, 0x41, 0x7f};
|
||||||
|
|
||||||
|
#define connection_icon_width 7
|
||||||
|
#define connection_icon_height 5
|
||||||
|
const uint8_t connection_icon[] = {0x36, 0x41, 0x5D, 0x41, 0x36};
|
||||||
|
|
||||||
#ifdef M5STACK_UNITC6L
|
#ifdef M5STACK_UNITC6L
|
||||||
#include "img/icon_small.xbm"
|
#include "img/icon_small.xbm"
|
||||||
#else
|
#else
|
||||||
|
|||||||
@@ -92,10 +92,10 @@ bool CryptoEngine::encryptCurve25519(uint32_t toNode, uint32_t fromNode, meshtas
|
|||||||
LOG_DEBUG("Node %d or their public_key not found", toNode);
|
LOG_DEBUG("Node %d or their public_key not found", toNode);
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
if (!crypto->setDHPublicKey(remotePublic.bytes)) {
|
if (!setDHPublicKey(remotePublic.bytes)) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
crypto->hash(shared_key, 32);
|
hash(shared_key, 32);
|
||||||
initNonce(fromNode, packetNum, extraNonceTmp);
|
initNonce(fromNode, packetNum, extraNonceTmp);
|
||||||
|
|
||||||
// Calculate the shared secret with the destination node and encrypt
|
// Calculate the shared secret with the destination node and encrypt
|
||||||
@@ -134,10 +134,10 @@ bool CryptoEngine::decryptCurve25519(uint32_t fromNode, meshtastic_UserLite_publ
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Calculate the shared secret with the sending node and decrypt
|
// Calculate the shared secret with the sending node and decrypt
|
||||||
if (!crypto->setDHPublicKey(remotePublic.bytes)) {
|
if (!setDHPublicKey(remotePublic.bytes)) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
crypto->hash(shared_key, 32);
|
hash(shared_key, 32);
|
||||||
|
|
||||||
initNonce(fromNode, packetNum, extraNonce);
|
initNonce(fromNode, packetNum, extraNonce);
|
||||||
printBytes("Attempt decrypt with nonce: ", nonce, 13);
|
printBytes("Attempt decrypt with nonce: ", nonce, 13);
|
||||||
|
|||||||
@@ -79,6 +79,18 @@ class MeshService
|
|||||||
uint32_t oldFromNum = 0;
|
uint32_t oldFromNum = 0;
|
||||||
|
|
||||||
public:
|
public:
|
||||||
|
enum APIState {
|
||||||
|
STATE_DISCONNECTED, // Initial state, no API is connected
|
||||||
|
STATE_BLE,
|
||||||
|
STATE_WIFI,
|
||||||
|
STATE_SERIAL,
|
||||||
|
STATE_PACKET,
|
||||||
|
STATE_HTTP,
|
||||||
|
STATE_ETH
|
||||||
|
};
|
||||||
|
|
||||||
|
APIState api_state = STATE_DISCONNECTED;
|
||||||
|
|
||||||
static bool isTextPayload(const meshtastic_MeshPacket *p)
|
static bool isTextPayload(const meshtastic_MeshPacket *p)
|
||||||
{
|
{
|
||||||
if (moduleConfig.range_test.enabled && p->decoded.portnum == meshtastic_PortNum_RANGE_TEST_APP) {
|
if (moduleConfig.range_test.enabled && p->decoded.portnum == meshtastic_PortNum_RANGE_TEST_APP) {
|
||||||
|
|||||||
@@ -87,6 +87,18 @@ void PhoneAPI::handleStartConfig()
|
|||||||
void PhoneAPI::close()
|
void PhoneAPI::close()
|
||||||
{
|
{
|
||||||
LOG_DEBUG("PhoneAPI::close()");
|
LOG_DEBUG("PhoneAPI::close()");
|
||||||
|
if (service->api_state == service->STATE_BLE && api_type == TYPE_BLE)
|
||||||
|
service->api_state = service->STATE_DISCONNECTED;
|
||||||
|
else if (service->api_state == service->STATE_WIFI && api_type == TYPE_WIFI)
|
||||||
|
service->api_state = service->STATE_DISCONNECTED;
|
||||||
|
else if (service->api_state == service->STATE_SERIAL && api_type == TYPE_SERIAL)
|
||||||
|
service->api_state = service->STATE_DISCONNECTED;
|
||||||
|
else if (service->api_state == service->STATE_PACKET && api_type == TYPE_PACKET)
|
||||||
|
service->api_state = service->STATE_DISCONNECTED;
|
||||||
|
else if (service->api_state == service->STATE_HTTP && api_type == TYPE_HTTP)
|
||||||
|
service->api_state = service->STATE_DISCONNECTED;
|
||||||
|
else if (service->api_state == service->STATE_ETH && api_type == TYPE_ETH)
|
||||||
|
service->api_state = service->STATE_DISCONNECTED;
|
||||||
|
|
||||||
if (state != STATE_SEND_NOTHING) {
|
if (state != STATE_SEND_NOTHING) {
|
||||||
state = STATE_SEND_NOTHING;
|
state = STATE_SEND_NOTHING;
|
||||||
@@ -578,6 +590,19 @@ void PhoneAPI::sendConfigComplete()
|
|||||||
fromRadioScratch.config_complete_id = config_nonce;
|
fromRadioScratch.config_complete_id = config_nonce;
|
||||||
config_nonce = 0;
|
config_nonce = 0;
|
||||||
state = STATE_SEND_PACKETS;
|
state = STATE_SEND_PACKETS;
|
||||||
|
if (api_type == TYPE_BLE) {
|
||||||
|
service->api_state = service->STATE_BLE;
|
||||||
|
} else if (api_type == TYPE_WIFI) {
|
||||||
|
service->api_state = service->STATE_WIFI;
|
||||||
|
} else if (api_type == TYPE_SERIAL) {
|
||||||
|
service->api_state = service->STATE_SERIAL;
|
||||||
|
} else if (api_type == TYPE_PACKET) {
|
||||||
|
service->api_state = service->STATE_PACKET;
|
||||||
|
} else if (api_type == TYPE_HTTP) {
|
||||||
|
service->api_state = service->STATE_HTTP;
|
||||||
|
} else if (api_type == TYPE_ETH) {
|
||||||
|
service->api_state = service->STATE_ETH;
|
||||||
|
}
|
||||||
|
|
||||||
// Allow subclasses to know we've entered steady-state so they can lower power consumption
|
// Allow subclasses to know we've entered steady-state so they can lower power consumption
|
||||||
onConfigComplete();
|
onConfigComplete();
|
||||||
|
|||||||
@@ -167,6 +167,18 @@ class PhoneAPI
|
|||||||
/// begin a new connection
|
/// begin a new connection
|
||||||
void handleStartConfig();
|
void handleStartConfig();
|
||||||
|
|
||||||
|
enum APIType {
|
||||||
|
TYPE_NONE, // Initial state, don't send anything until the client starts asking for config
|
||||||
|
TYPE_BLE,
|
||||||
|
TYPE_WIFI,
|
||||||
|
TYPE_SERIAL,
|
||||||
|
TYPE_PACKET,
|
||||||
|
TYPE_HTTP,
|
||||||
|
TYPE_ETH
|
||||||
|
};
|
||||||
|
|
||||||
|
APIType api_type = TYPE_NONE;
|
||||||
|
|
||||||
private:
|
private:
|
||||||
void releasePhonePacket();
|
void releasePhonePacket();
|
||||||
|
|
||||||
|
|||||||
@@ -19,6 +19,7 @@ PacketAPI *PacketAPI::create(PacketServer *_server)
|
|||||||
PacketAPI::PacketAPI(PacketServer *_server)
|
PacketAPI::PacketAPI(PacketServer *_server)
|
||||||
: concurrency::OSThread("PacketAPI"), isConnected(false), programmingMode(false), server(_server)
|
: concurrency::OSThread("PacketAPI"), isConnected(false), programmingMode(false), server(_server)
|
||||||
{
|
{
|
||||||
|
api_type = TYPE_PACKET;
|
||||||
}
|
}
|
||||||
|
|
||||||
int32_t PacketAPI::runOnce()
|
int32_t PacketAPI::runOnce()
|
||||||
|
|||||||
@@ -25,6 +25,7 @@ void deInitApiServer()
|
|||||||
|
|
||||||
WiFiServerAPI::WiFiServerAPI(WiFiClient &_client) : ServerAPI(_client)
|
WiFiServerAPI::WiFiServerAPI(WiFiClient &_client) : ServerAPI(_client)
|
||||||
{
|
{
|
||||||
|
api_type = TYPE_WIFI;
|
||||||
LOG_INFO("Incoming wifi connection");
|
LOG_INFO("Incoming wifi connection");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -20,6 +20,7 @@ void initApiServer(int port)
|
|||||||
ethServerAPI::ethServerAPI(EthernetClient &_client) : ServerAPI(_client)
|
ethServerAPI::ethServerAPI(EthernetClient &_client) : ServerAPI(_client)
|
||||||
{
|
{
|
||||||
LOG_INFO("Incoming ethernet connection");
|
LOG_INFO("Incoming ethernet connection");
|
||||||
|
api_type = TYPE_ETH;
|
||||||
}
|
}
|
||||||
|
|
||||||
ethServerPort::ethServerPort(int port) : APIServerPort(port) {}
|
ethServerPort::ethServerPort(int port) : APIServerPort(port) {}
|
||||||
|
|||||||
@@ -26,7 +26,7 @@ class HttpAPI : public PhoneAPI
|
|||||||
{
|
{
|
||||||
|
|
||||||
public:
|
public:
|
||||||
// Nothing here yet
|
HttpAPI() { api_type = TYPE_HTTP; }
|
||||||
|
|
||||||
private:
|
private:
|
||||||
// Nothing here yet
|
// Nothing here yet
|
||||||
|
|||||||
@@ -27,7 +27,7 @@ class HttpAPI : public PhoneAPI
|
|||||||
{
|
{
|
||||||
|
|
||||||
public:
|
public:
|
||||||
// Nothing here yet
|
HttpAPI() { api_type = TYPE_HTTP; }
|
||||||
|
|
||||||
private:
|
private:
|
||||||
// Nothing here yet
|
// Nothing here yet
|
||||||
|
|||||||
@@ -65,13 +65,22 @@ SerialModuleRadio *serialModuleRadio;
|
|||||||
|
|
||||||
#if defined(TTGO_T_ECHO) || defined(CANARYONE) || defined(MESHLINK) || defined(ELECROW_ThinkNode_M1) || \
|
#if defined(TTGO_T_ECHO) || defined(CANARYONE) || defined(MESHLINK) || defined(ELECROW_ThinkNode_M1) || \
|
||||||
defined(ELECROW_ThinkNode_M5) || defined(HELTEC_MESH_SOLAR) || defined(T_ECHO_LITE)
|
defined(ELECROW_ThinkNode_M5) || defined(HELTEC_MESH_SOLAR) || defined(T_ECHO_LITE)
|
||||||
SerialModule::SerialModule() : StreamAPI(&Serial), concurrency::OSThread("Serial") {}
|
SerialModule::SerialModule() : StreamAPI(&Serial), concurrency::OSThread("Serial")
|
||||||
|
{
|
||||||
|
api_type = TYPE_SERIAL;
|
||||||
|
}
|
||||||
static Print *serialPrint = &Serial;
|
static Print *serialPrint = &Serial;
|
||||||
#elif defined(CONFIG_IDF_TARGET_ESP32C6) || defined(RAK3172) || defined(EBYTE_E77_MBL)
|
#elif defined(CONFIG_IDF_TARGET_ESP32C6) || defined(RAK3172) || defined(EBYTE_E77_MBL)
|
||||||
SerialModule::SerialModule() : StreamAPI(&Serial1), concurrency::OSThread("Serial") {}
|
SerialModule::SerialModule() : StreamAPI(&Serial1), concurrency::OSThread("Serial")
|
||||||
|
{
|
||||||
|
api_type = TYPE_SERIAL;
|
||||||
|
}
|
||||||
static Print *serialPrint = &Serial1;
|
static Print *serialPrint = &Serial1;
|
||||||
#else
|
#else
|
||||||
SerialModule::SerialModule() : StreamAPI(&Serial2), concurrency::OSThread("Serial") {}
|
SerialModule::SerialModule() : StreamAPI(&Serial2), concurrency::OSThread("Serial")
|
||||||
|
{
|
||||||
|
api_type = TYPE_SERIAL;
|
||||||
|
}
|
||||||
static Print *serialPrint = &Serial2;
|
static Print *serialPrint = &Serial2;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
|||||||
@@ -85,10 +85,8 @@ int SystemCommandsModule::handleInputEvent(const InputEvent *event)
|
|||||||
switch (event->inputEvent) {
|
switch (event->inputEvent) {
|
||||||
// GPS
|
// GPS
|
||||||
case INPUT_BROKER_GPS_TOGGLE:
|
case INPUT_BROKER_GPS_TOGGLE:
|
||||||
LOG_WARN("GPS Toggle");
|
|
||||||
#if !MESHTASTIC_EXCLUDE_GPS
|
#if !MESHTASTIC_EXCLUDE_GPS
|
||||||
if (gps) {
|
if (gps) {
|
||||||
LOG_WARN("GPS Toggle2");
|
|
||||||
if (config.position.gps_mode == meshtastic_Config_PositionConfig_GpsMode_ENABLED &&
|
if (config.position.gps_mode == meshtastic_Config_PositionConfig_GpsMode_ENABLED &&
|
||||||
config.position.fixed_position == false) {
|
config.position.fixed_position == false) {
|
||||||
nodeDB->clearLocalPosition();
|
nodeDB->clearLocalPosition();
|
||||||
|
|||||||
@@ -510,6 +510,7 @@ void EnvironmentTelemetryModule::drawFrame(OLEDDisplay *display, OLEDDisplayUiSt
|
|||||||
|
|
||||||
currentY += rowHeight;
|
currentY += rowHeight;
|
||||||
}
|
}
|
||||||
|
graphics::drawCommonFooter(display, x, y);
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
|||||||
@@ -165,6 +165,7 @@ void PowerTelemetryModule::drawFrame(OLEDDisplay *display, OLEDDisplayUiState *s
|
|||||||
if (m.has_ch3_voltage || m.has_ch3_current) {
|
if (m.has_ch3_voltage || m.has_ch3_current) {
|
||||||
drawLine("Ch3", m.ch3_voltage, m.ch3_current);
|
drawLine("Ch3", m.ch3_voltage, m.ch3_current);
|
||||||
}
|
}
|
||||||
|
graphics::drawCommonFooter(display, x, y);
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
|||||||
@@ -141,6 +141,7 @@ void PaxcounterModule::drawFrame(OLEDDisplay *display, OLEDDisplayUiState *state
|
|||||||
display->drawStringf(display->getWidth() / 2 + x, graphics::getTextPositions(display)[line++], buffer,
|
display->drawStringf(display->getWidth() / 2 + x, graphics::getTextPositions(display)[line++], buffer,
|
||||||
"WiFi: %d\nBLE: %d\nUptime: %ds", count_from_libpax.wifi_count, count_from_libpax.ble_count,
|
"WiFi: %d\nBLE: %d\nUptime: %ds", count_from_libpax.wifi_count, count_from_libpax.ble_count,
|
||||||
millis() / 1000);
|
millis() / 1000);
|
||||||
|
graphics::drawCommonFooter(display, x, y);
|
||||||
}
|
}
|
||||||
#endif // HAS_SCREEN
|
#endif // HAS_SCREEN
|
||||||
|
|
||||||
|
|||||||
@@ -116,6 +116,7 @@ void BMX160Sensor::calibrate(uint16_t forSeconds)
|
|||||||
{
|
{
|
||||||
#if !defined(MESHTASTIC_EXCLUDE_SCREEN)
|
#if !defined(MESHTASTIC_EXCLUDE_SCREEN)
|
||||||
LOG_DEBUG("BMX160 calibration started for %is", forSeconds);
|
LOG_DEBUG("BMX160 calibration started for %is", forSeconds);
|
||||||
|
highestX = 0, lowestX = 0, highestY = 0, lowestY = 0, highestZ = 0, lowestZ = 0;
|
||||||
|
|
||||||
doCalibration = true;
|
doCalibration = true;
|
||||||
uint16_t calibrateFor = forSeconds * 1000; // calibrate for seconds provided
|
uint16_t calibrateFor = forSeconds * 1000; // calibrate for seconds provided
|
||||||
|
|||||||
@@ -157,6 +157,7 @@ void ICM20948Sensor::calibrate(uint16_t forSeconds)
|
|||||||
{
|
{
|
||||||
#if !defined(MESHTASTIC_EXCLUDE_SCREEN) && HAS_SCREEN
|
#if !defined(MESHTASTIC_EXCLUDE_SCREEN) && HAS_SCREEN
|
||||||
LOG_DEBUG("BMX160 calibration started for %is", forSeconds);
|
LOG_DEBUG("BMX160 calibration started for %is", forSeconds);
|
||||||
|
highestX = 0, lowestX = 0, highestY = 0, lowestY = 0, highestZ = 0, lowestZ = 0;
|
||||||
|
|
||||||
doCalibration = true;
|
doCalibration = true;
|
||||||
uint16_t calibrateFor = forSeconds * 1000; // calibrate for seconds provided
|
uint16_t calibrateFor = forSeconds * 1000; // calibrate for seconds provided
|
||||||
|
|||||||
@@ -69,7 +69,8 @@ void MotionSensor::wakeScreen()
|
|||||||
{
|
{
|
||||||
if (powerFSM.getState() == &stateDARK) {
|
if (powerFSM.getState() == &stateDARK) {
|
||||||
LOG_DEBUG("Motion wakeScreen detected");
|
LOG_DEBUG("Motion wakeScreen detected");
|
||||||
powerFSM.trigger(EVENT_INPUT);
|
if (config.display.wake_on_tap_or_motion)
|
||||||
|
powerFSM.trigger(EVENT_INPUT);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
+9
-2
@@ -51,6 +51,7 @@ constexpr int reconnectMax = 5;
|
|||||||
static uint8_t bytes[meshtastic_MqttClientProxyMessage_size + 30]; // 12 for channel name and 16 for nodeid
|
static uint8_t bytes[meshtastic_MqttClientProxyMessage_size + 30]; // 12 for channel name and 16 for nodeid
|
||||||
|
|
||||||
static bool isMqttServerAddressPrivate = false;
|
static bool isMqttServerAddressPrivate = false;
|
||||||
|
static bool isConnected = false;
|
||||||
|
|
||||||
inline void onReceiveProto(char *topic, byte *payload, size_t length)
|
inline void onReceiveProto(char *topic, byte *payload, size_t length)
|
||||||
{
|
{
|
||||||
@@ -320,8 +321,10 @@ bool connectPubSub(const PubSubConfig &config, PubSubClient &pubSub, Client &cli
|
|||||||
std::string nodeId = nodeDB->getNodeId();
|
std::string nodeId = nodeDB->getNodeId();
|
||||||
const bool connected = pubSub.connect(nodeId.c_str(), config.mqttUsername, config.mqttPassword);
|
const bool connected = pubSub.connect(nodeId.c_str(), config.mqttUsername, config.mqttPassword);
|
||||||
if (connected) {
|
if (connected) {
|
||||||
|
isConnected = true;
|
||||||
LOG_INFO("MQTT connected");
|
LOG_INFO("MQTT connected");
|
||||||
} else {
|
} else {
|
||||||
|
isConnected = false;
|
||||||
LOG_WARN("Failed to connect to MQTT server");
|
LOG_WARN("Failed to connect to MQTT server");
|
||||||
}
|
}
|
||||||
return connected;
|
return connected;
|
||||||
@@ -507,6 +510,7 @@ bool MQTT::publish(const char *topic, const uint8_t *payload, size_t length, boo
|
|||||||
|
|
||||||
void MQTT::reconnect()
|
void MQTT::reconnect()
|
||||||
{
|
{
|
||||||
|
isConnected = false;
|
||||||
if (wantsLink()) {
|
if (wantsLink()) {
|
||||||
if (moduleConfig.mqtt.proxy_to_client_enabled) {
|
if (moduleConfig.mqtt.proxy_to_client_enabled) {
|
||||||
LOG_INFO("MQTT connect via client proxy instead");
|
LOG_INFO("MQTT connect via client proxy instead");
|
||||||
@@ -534,7 +538,7 @@ void MQTT::reconnect()
|
|||||||
runASAP = true;
|
runASAP = true;
|
||||||
reconnectCount = 0;
|
reconnectCount = 0;
|
||||||
isMqttServerAddressPrivate = isPrivateIpAddress(clientConnection->remoteIP());
|
isMqttServerAddressPrivate = isPrivateIpAddress(clientConnection->remoteIP());
|
||||||
|
isConnected = true;
|
||||||
publishNodeInfo();
|
publishNodeInfo();
|
||||||
sendSubscriptions();
|
sendSubscriptions();
|
||||||
} else {
|
} else {
|
||||||
@@ -688,7 +692,10 @@ void MQTT::publishNodeInfo()
|
|||||||
}
|
}
|
||||||
void MQTT::publishQueuedMessages()
|
void MQTT::publishQueuedMessages()
|
||||||
{
|
{
|
||||||
if (mqttQueue.isEmpty())
|
if (mqttQueue.isEmpty() || !isConnected)
|
||||||
|
return;
|
||||||
|
|
||||||
|
if (!moduleConfig.mqtt.proxy_to_client_enabled && !isConnected)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
LOG_DEBUG("Publish enqueued MQTT message");
|
LOG_DEBUG("Publish enqueued MQTT message");
|
||||||
|
|||||||
@@ -20,13 +20,14 @@
|
|||||||
#include "PowerStatus.h"
|
#include "PowerStatus.h"
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#if defined(CONFIG_IDF_TARGET_ESP32S3) || defined(CONFIG_IDF_TARGET_ESP32C6)
|
|
||||||
#if defined(CONFIG_NIMBLE_CPP_IDF)
|
#if defined(CONFIG_NIMBLE_CPP_IDF)
|
||||||
#include "host/ble_gap.h"
|
#include "host/ble_gap.h"
|
||||||
#else
|
#else
|
||||||
#include "nimble/nimble/host/include/host/ble_gap.h"
|
#include "nimble/nimble/host/include/host/ble_gap.h"
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#if defined(CONFIG_IDF_TARGET_ESP32S3) || defined(CONFIG_IDF_TARGET_ESP32C6)
|
||||||
|
|
||||||
namespace
|
namespace
|
||||||
{
|
{
|
||||||
constexpr uint16_t kPreferredBleMtu = 517;
|
constexpr uint16_t kPreferredBleMtu = 517;
|
||||||
@@ -118,7 +119,7 @@ class BluetoothPhoneAPI : public PhoneAPI, public concurrency::OSThread
|
|||||||
*/
|
*/
|
||||||
|
|
||||||
public:
|
public:
|
||||||
BluetoothPhoneAPI() : concurrency::OSThread("NimbleBluetooth") {}
|
BluetoothPhoneAPI() : concurrency::OSThread("NimbleBluetooth") { api_type = TYPE_BLE; }
|
||||||
|
|
||||||
/* Packets from phone (BLE onWrite callback) */
|
/* Packets from phone (BLE onWrite callback) */
|
||||||
std::mutex fromPhoneMutex;
|
std::mutex fromPhoneMutex;
|
||||||
@@ -776,16 +777,35 @@ bool NimbleBluetooth::isConnected()
|
|||||||
|
|
||||||
int NimbleBluetooth::getRssi()
|
int NimbleBluetooth::getRssi()
|
||||||
{
|
{
|
||||||
if (bleServer && isConnected()) {
|
#if defined(CONFIG_IDF_TARGET_ESP32S3) || defined(CONFIG_IDF_TARGET_ESP32C6)
|
||||||
auto service = bleServer->getServiceByUUID(MESH_SERVICE_UUID);
|
if (!bleServer || !isConnected()) {
|
||||||
uint16_t handle = service->getHandle();
|
return 0; // No active BLE connection
|
||||||
#ifdef NIMBLE_TWO
|
|
||||||
return NimBLEDevice::getClientByHandle(handle)->getRssi();
|
|
||||||
#else
|
|
||||||
return NimBLEDevice::getClientByID(handle)->getRssi();
|
|
||||||
#endif
|
|
||||||
}
|
}
|
||||||
return 0; // FIXME figure out where to source this
|
|
||||||
|
uint16_t connHandle = nimbleBluetoothConnHandle.load();
|
||||||
|
|
||||||
|
if (connHandle == BLE_HS_CONN_HANDLE_NONE) {
|
||||||
|
const auto peers = bleServer->getPeerDevices();
|
||||||
|
if (!peers.empty()) {
|
||||||
|
connHandle = peers.front();
|
||||||
|
nimbleBluetoothConnHandle = connHandle;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (connHandle == BLE_HS_CONN_HANDLE_NONE) {
|
||||||
|
return 0; // Connection handle not available yet
|
||||||
|
}
|
||||||
|
|
||||||
|
int8_t rssi = 0;
|
||||||
|
const int rc = ble_gap_conn_rssi(connHandle, &rssi);
|
||||||
|
|
||||||
|
if (rc == 0) {
|
||||||
|
return rssi;
|
||||||
|
}
|
||||||
|
LOG_DEBUG("BLE RSSI read failed, rc=%d", rc);
|
||||||
|
#endif
|
||||||
|
|
||||||
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
void NimbleBluetooth::setup()
|
void NimbleBluetooth::setup()
|
||||||
|
|||||||
@@ -48,6 +48,9 @@ class BluetoothPhoneAPI : public PhoneAPI
|
|||||||
|
|
||||||
/// Check the current underlying physical link to see if the client is currently connected
|
/// Check the current underlying physical link to see if the client is currently connected
|
||||||
virtual bool checkIsConnected() override { return Bluefruit.connected(connectionHandle); }
|
virtual bool checkIsConnected() override { return Bluefruit.connected(connectionHandle); }
|
||||||
|
|
||||||
|
public:
|
||||||
|
BluetoothPhoneAPI() { api_type = TYPE_BLE; }
|
||||||
};
|
};
|
||||||
|
|
||||||
static BluetoothPhoneAPI *bluetoothPhoneAPI;
|
static BluetoothPhoneAPI *bluetoothPhoneAPI;
|
||||||
|
|||||||
@@ -0,0 +1,16 @@
|
|||||||
|
; Elecrow ThinkNode M4 (nRF52840 + LR1110)
|
||||||
|
[env:thinknode_m4]
|
||||||
|
extends = nrf52840_base
|
||||||
|
board = ThinkNode-M4
|
||||||
|
board_check = true
|
||||||
|
debug_tool = jlink
|
||||||
|
|
||||||
|
build_flags = ${nrf52840_base.build_flags}
|
||||||
|
-Ivariants/nrf52840/ELECROW-ThinkNode-M4
|
||||||
|
-DELECROW_ThinkNode_M4
|
||||||
|
|
||||||
|
build_src_filter = ${nrf52_base.build_src_filter} +<../variants/nrf52840/ELECROW-ThinkNode-M4>
|
||||||
|
lib_deps =
|
||||||
|
${nrf52840_base.lib_deps}
|
||||||
|
lewisxhe/PCF8563_Library@^1.0.1
|
||||||
|
|
||||||
+14
-5
@@ -24,15 +24,24 @@
|
|||||||
#include "wiring_digital.h"
|
#include "wiring_digital.h"
|
||||||
|
|
||||||
const uint32_t g_ADigitalPinMap[] = {
|
const uint32_t g_ADigitalPinMap[] = {
|
||||||
// P0
|
// P0 - pins 0 and 1 are hardwired for xtal and should never be enabled
|
||||||
0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31,
|
0xff, 0xff, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31,
|
||||||
|
|
||||||
// P1
|
// P1
|
||||||
32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47};
|
32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47};
|
||||||
|
|
||||||
void initVariant()
|
void initVariant()
|
||||||
{
|
{
|
||||||
// 3V3 Power Rail
|
#if (PIN_LED1 >= 0)
|
||||||
pinMode(PIN_3V3_EN, OUTPUT);
|
pinMode(PIN_LED1, OUTPUT);
|
||||||
digitalWrite(PIN_3V3_EN, HIGH);
|
ledOff(PIN_LED1);
|
||||||
|
#endif
|
||||||
|
#if (PIN_LED2 >= 0)
|
||||||
|
pinMode(PIN_LED2, OUTPUT);
|
||||||
|
ledOff(PIN_LED2);
|
||||||
|
#endif
|
||||||
|
#if (PIN_LED3 >= 0)
|
||||||
|
pinMode(PIN_LED3, OUTPUT);
|
||||||
|
ledOff(PIN_LED3);
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
@@ -0,0 +1,122 @@
|
|||||||
|
/*
|
||||||
|
Copyright (c) 2014-2015 Arduino LLC. All right reserved.
|
||||||
|
Copyright (c) 2016 Sandeep Mistry All right reserved.
|
||||||
|
Copyright (c) 2018, Adafruit Industries (adafruit.com)
|
||||||
|
|
||||||
|
This library is free software; you can redistribute it and/or
|
||||||
|
modify it under the terms of the GNU Lesser General Public
|
||||||
|
License as published by the Free Software Foundation; either
|
||||||
|
version 2.1 of the License, or (at your option) any later version.
|
||||||
|
|
||||||
|
This library is distributed in the hope that it will be useful,
|
||||||
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
|
||||||
|
See the GNU Lesser General Public License for more details.
|
||||||
|
You should have received a copy of the GNU Lesser General Public
|
||||||
|
License along with this library; if not, write to the Free Software
|
||||||
|
Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef _VARIANT_ELECROW_THINKNODE_M4_
|
||||||
|
#define _VARIANT_ELECROW_THINKNODE_M4_
|
||||||
|
|
||||||
|
/** Master clock frequency */
|
||||||
|
#define VARIANT_MCK (64000000ul)
|
||||||
|
|
||||||
|
#define USE_LFXO // Board uses 32 kHz crystal for LF domain
|
||||||
|
|
||||||
|
/*----------------------------------------------------------------------------
|
||||||
|
* Headers
|
||||||
|
*----------------------------------------------------------------------------*/
|
||||||
|
|
||||||
|
#include "WVariant.h"
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
extern "C" {
|
||||||
|
#endif // __cplusplus
|
||||||
|
|
||||||
|
// Number of pins defined in PinDescription array
|
||||||
|
#define PINS_COUNT (48)
|
||||||
|
#define NUM_DIGITAL_PINS (48)
|
||||||
|
#define NUM_ANALOG_INPUTS (6)
|
||||||
|
#define NUM_ANALOG_OUTPUTS (0)
|
||||||
|
|
||||||
|
// LEDs
|
||||||
|
#define PIN_LED1 (32 + 9) // P1.09, status LED (blue)
|
||||||
|
#define PIN_LED2 -1
|
||||||
|
#define PIN_LED3 -1
|
||||||
|
|
||||||
|
#define LED_BUILTIN PIN_LED1
|
||||||
|
#define LED_STATE_ON 0 // active-low LED drive
|
||||||
|
|
||||||
|
// Buttons
|
||||||
|
#define PIN_BUTTON1 (0 + 4) // P0.04 KEY input
|
||||||
|
|
||||||
|
// USB / power detection
|
||||||
|
#define EXT_PWR_DETECT (32 + 3) // P1.03 USB present sense
|
||||||
|
|
||||||
|
// I2C bus
|
||||||
|
#define WIRE_INTERFACES_COUNT 1
|
||||||
|
#define PIN_WIRE_SDA (32 + 0) // P1.00 SDA1
|
||||||
|
#define PIN_WIRE_SCL (32 + 5) // P1.05 SCL1
|
||||||
|
|
||||||
|
// Analog pins
|
||||||
|
#define PIN_A0 (2) // P0.02
|
||||||
|
#define BATTERY_PIN PIN_A0
|
||||||
|
#define BATTERY_SENSE_SAMPLES 30
|
||||||
|
#define ADC_RESOLUTION 14
|
||||||
|
#define BATTERY_SENSE_RESOLUTION_BITS 12
|
||||||
|
#define BATTERY_SENSE_RESOLUTION 4096.0
|
||||||
|
#define ADC_MULTIPLIER (2.00F)
|
||||||
|
#undef AREF_VOLTAGE
|
||||||
|
#define AREF_VOLTAGE 3.0
|
||||||
|
#define VBAT_AR_INTERNAL AR_INTERNAL_3_0
|
||||||
|
|
||||||
|
// GPS interface (L76K)
|
||||||
|
#define HAS_GPS 1
|
||||||
|
#define GPS_L76K
|
||||||
|
#define GPS_BAUDRATE 9600
|
||||||
|
#define PIN_GPS_REINIT (0 + 3) // P0.03 GPS_RST
|
||||||
|
#define PIN_GPS_STANDBY (0 + 28) // P0.28 GPS_STANDBY
|
||||||
|
#define PIN_GPS_EN (32 + 11) // P1.11 GPS_EN
|
||||||
|
#define GPS_EN_ACTIVE HIGH
|
||||||
|
#define GPS_TX_PIN (32 + 12) // P1.12 GPS_TX -> MCU RX
|
||||||
|
#define GPS_RX_PIN (32 + 14) // P1.14 GPS_RX -> MCU TX
|
||||||
|
#define PIN_SERIAL1_RX GPS_TX_PIN
|
||||||
|
#define PIN_SERIAL1_TX GPS_RX_PIN
|
||||||
|
#define GPS_THREAD_INTERVAL 50
|
||||||
|
|
||||||
|
// LoRa (LR1110) SPI bus
|
||||||
|
#define SPI_INTERFACES_COUNT 1
|
||||||
|
#define PIN_SPI_MISO (0 + 8) // P0.08
|
||||||
|
#define PIN_SPI_MOSI (0 + 7) // P0.07
|
||||||
|
#define PIN_SPI_SCK (0 + 6) // P0.06
|
||||||
|
#define PIN_SPI_NSS (0 + 27) // P0.27
|
||||||
|
|
||||||
|
#define LORA_CS PIN_SPI_NSS
|
||||||
|
#define LORA_SCK PIN_SPI_SCK
|
||||||
|
#define LORA_MISO PIN_SPI_MISO
|
||||||
|
#define LORA_MOSI PIN_SPI_MOSI
|
||||||
|
#define LORA_RESET (32 + 8) // P1.08 LR_NRESET
|
||||||
|
#define LORA_DIO1 (0 + 24) // P0.24 LR_DIO1 / IRQ
|
||||||
|
#define LORA_DIO2 (0 + 26) // P0.26 LR_BUSY (treated as DIO2)
|
||||||
|
|
||||||
|
#define USE_LR1110
|
||||||
|
#define LR1110_IRQ_PIN LORA_DIO1
|
||||||
|
#define LR1110_NRESET_PIN LORA_RESET
|
||||||
|
#define LR1110_BUSY_PIN LORA_DIO2
|
||||||
|
#define LR1110_SPI_NSS_PIN LORA_CS
|
||||||
|
#define LR1110_SPI_SCK_PIN LORA_SCK
|
||||||
|
#define LR1110_SPI_MOSI_PIN LORA_MOSI
|
||||||
|
#define LR1110_SPI_MISO_PIN LORA_MISO
|
||||||
|
#define LR11X0_DIO3_TCXO_VOLTAGE 3.3f
|
||||||
|
#define LR11X0_DIO_AS_RF_SWITCH
|
||||||
|
|
||||||
|
// Peripheral power control
|
||||||
|
#define PIN_POWER_EN (0 + 11) // P0.11 PERIPH_EN
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#endif // _VARIANT_ELECROW_THINKNODE_M4_
|
||||||
-9836
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
@@ -4,7 +4,9 @@
|
|||||||
|
|
||||||
## General
|
## General
|
||||||
|
|
||||||
The pinout is contained in the variant.h file, and a [generic schematic](./Schematic_Pro-Micro_Pinouts%202024-12-14.pdf) is located in this directory.
|
The pinout is contained in the variant.h file, and a [generic schematic](./Schematic_Pro-Micro_Pinouts.pdf) is located in this directory.
|
||||||
|
|
||||||
|
This variant is suitable for both TCXO and XTAL types of modules. The old XTAL variant has been removed to reduce confusion.
|
||||||
|
|
||||||
### Note on DIO2, RXEN, TXEN, and RF switching
|
### Note on DIO2, RXEN, TXEN, and RF switching
|
||||||
|
|
||||||
@@ -17,9 +19,13 @@ Several modules require external switching between transmit (Tx) and receive (Rx
|
|||||||
RXEN is not required to be connected if the selected module already has internal RF switching, or if external RF switching logic is already applied.
|
RXEN is not required to be connected if the selected module already has internal RF switching, or if external RF switching logic is already applied.
|
||||||
Also worth noting that the Seeed WIO SX1262 in particular only has RXEN exposed (marked RF_SW) and has the DIO2-TXEN link internally.
|
Also worth noting that the Seeed WIO SX1262 in particular only has RXEN exposed (marked RF_SW) and has the DIO2-TXEN link internally.
|
||||||
|
|
||||||
|
## Making a node based on this variant
|
||||||
|
|
||||||
|
Making your own node based on this design is straightforward. There are various open source and free to use PCB design files available, or you can solder wires directly from a module to the pro-micro.
|
||||||
|
|
||||||
<details>
|
<details>
|
||||||
|
|
||||||
<summary> The table of known modules is at the bottom of the variant.h, and reproduced here for convenience. </summary>
|
<summary> < Click to expand > The table of known modules is at the bottom of the variant.h, and reproduced here for convenience. </summary>
|
||||||
|
|
||||||
| Mfr | Module | TCXO | RF Switch | Notes |
|
| Mfr | Module | TCXO | RF Switch | Notes |
|
||||||
| ------------ | ---------------- | ---- | --------- | ------------------------------------- |
|
| ------------ | ---------------- | ---- | --------- | ------------------------------------- |
|
||||||
@@ -34,6 +40,7 @@ Also worth noting that the Seeed WIO SX1262 in particular only has RXEN exposed
|
|||||||
| Waveshare | Core1262-HF | yes | Ext | |
|
| Waveshare | Core1262-HF | yes | Ext | |
|
||||||
| Waveshare | LoRa Node Module | yes | Int | |
|
| Waveshare | LoRa Node Module | yes | Int | |
|
||||||
| Seeed | Wio-SX1262 | yes | Ext | Cute! DIO2/TXEN are not exposed |
|
| Seeed | Wio-SX1262 | yes | Ext | Cute! DIO2/TXEN are not exposed |
|
||||||
|
| Seeed | Wio-LR1121 | yes | Int | LR1121, needs alternate rfswitch.h |
|
||||||
| AI-Thinker | RA-02 | No | Int | SX1278 **433mhz band only** |
|
| AI-Thinker | RA-02 | No | Int | SX1278 **433mhz band only** |
|
||||||
| RF Solutions | RFM95 | No | Int | Untested |
|
| RF Solutions | RFM95 | No | Int | Untested |
|
||||||
| Ebyte | E80-900M2213S | Yes | Int | LR1121 radio |
|
| Ebyte | E80-900M2213S | Yes | Int | LR1121 radio |
|
||||||
@@ -72,6 +79,10 @@ The Semtech default, the values are (taken from [here](https://github.com/Lora-n
|
|||||||
|
|
||||||
<details>
|
<details>
|
||||||
|
|
||||||
|
<summary> < Click to expand >
|
||||||
|
|
||||||
|
</summary>
|
||||||
|
|
||||||
```cpp
|
```cpp
|
||||||
.rfswitch = {
|
.rfswitch = {
|
||||||
.enable = LR11XX_SYSTEM_RFSW0_HIGH | LR11XX_SYSTEM_RFSW1_HIGH | LR11XX_SYSTEM_RFSW2_HIGH,
|
.enable = LR11XX_SYSTEM_RFSW0_HIGH | LR11XX_SYSTEM_RFSW1_HIGH | LR11XX_SYSTEM_RFSW2_HIGH,
|
||||||
|
|||||||
@@ -175,6 +175,7 @@ settings.
|
|||||||
| Waveshare | Core1262-HF | yes | Ext | |
|
| Waveshare | Core1262-HF | yes | Ext | |
|
||||||
| Waveshare | LoRa Node Module | yes | Int | |
|
| Waveshare | LoRa Node Module | yes | Int | |
|
||||||
| Seeed | Wio-SX1262 | yes | Ext | Cute! DIO2/TXEN are not exposed |
|
| Seeed | Wio-SX1262 | yes | Ext | Cute! DIO2/TXEN are not exposed |
|
||||||
|
| Seeed | Wio-LR1121 | yes | Int | LR1121, needs alternate rfswitch.h |
|
||||||
| AI-Thinker | RA-02 | No | Int | SX1278 **433mhz band only** |
|
| AI-Thinker | RA-02 | No | Int | SX1278 **433mhz band only** |
|
||||||
| RF Solutions | RFM95 | No | Int | Untested |
|
| RF Solutions | RFM95 | No | Int | Untested |
|
||||||
| Ebyte | E80-900M2213S | Yes | Int | LR1121 radio |
|
| Ebyte | E80-900M2213S | Yes | Int | LR1121 radio |
|
||||||
|
|||||||
@@ -1,12 +0,0 @@
|
|||||||
; Promicro + E22(0)-xxxMM / RA-01SH modules board variant - DIY - without TCXO
|
|
||||||
[env:nrf52_promicro_diy_xtal]
|
|
||||||
extends = nrf52840_base
|
|
||||||
board = promicro-nrf52840
|
|
||||||
board_level = extra
|
|
||||||
build_flags = ${nrf52840_base.build_flags}
|
|
||||||
-I variants/nrf52840/diy/nrf52_promicro_diy_xtal
|
|
||||||
-D NRF52_PROMICRO_DIY
|
|
||||||
build_src_filter = ${nrf52_base.build_src_filter} +<../variants/nrf52840/diy/nrf52_promicro_diy_xtal>
|
|
||||||
lib_deps =
|
|
||||||
${nrf52840_base.lib_deps}
|
|
||||||
debug_tool = jlink
|
|
||||||
@@ -1,154 +0,0 @@
|
|||||||
#ifndef _VARIANT_PROMICRO_DIY_
|
|
||||||
#define _VARIANT_PROMICRO_DIY_
|
|
||||||
|
|
||||||
/** Master clock frequency */
|
|
||||||
#define VARIANT_MCK (64000000ul)
|
|
||||||
|
|
||||||
// #define USE_LFXO // Board uses 32khz crystal for LF
|
|
||||||
#define USE_LFRC // Board uses RC for LF
|
|
||||||
|
|
||||||
#define PROMICRO_DIY_XTAL
|
|
||||||
/*----------------------------------------------------------------------------
|
|
||||||
* Headers
|
|
||||||
*----------------------------------------------------------------------------*/
|
|
||||||
|
|
||||||
#include "WVariant.h"
|
|
||||||
|
|
||||||
#ifdef __cplusplus
|
|
||||||
extern "C" {
|
|
||||||
#endif // __cplusplus
|
|
||||||
|
|
||||||
/*
|
|
||||||
NRF52 PRO MICRO PIN ASSIGNMENT
|
|
||||||
|
|
||||||
| Pin | Function | | Pin | Function |
|
|
||||||
|-------|------------|---|---------|-------------|
|
|
||||||
| Gnd | | | vbat | |
|
|
||||||
| P0.06 | Serial2 RX | | vbat | |
|
|
||||||
| P0.08 | Serial2 TX | | Gnd | |
|
|
||||||
| Gnd | | | reset | |
|
|
||||||
| Gnd | | | ext_vcc | *see 0.13 |
|
|
||||||
| P0.17 | RXEN | | P0.31 | BATTERY_PIN |
|
|
||||||
| P0.20 | GPS_RX | | P0.29 | BUSY |
|
|
||||||
| P0.22 | GPS_TX | | P0.02 | MISO |
|
|
||||||
| P0.24 | GPS_EN | | P1.15 | MOSI |
|
|
||||||
| P1.00 | BUTTON_PIN | | P1.13 | CS |
|
|
||||||
| P0.11 | SCL | | P1.11 | SCK |
|
|
||||||
| P1.04 | SDA | | P0.10 | DIO1/IRQ |
|
|
||||||
| P1.06 | Free pin | | P0.09 | RESET |
|
|
||||||
| | | | | |
|
|
||||||
| | Mid board | | | Internal |
|
|
||||||
| P1.01 | Free pin | | 0.15 | LED |
|
|
||||||
| P1.02 | Free pin | | 0.13 | 3V3_EN |
|
|
||||||
| P1.07 | Free pin | | | |
|
|
||||||
*/
|
|
||||||
|
|
||||||
// Number of pins defined in PinDescription array
|
|
||||||
#define PINS_COUNT (48)
|
|
||||||
#define NUM_DIGITAL_PINS (48)
|
|
||||||
#define NUM_ANALOG_INPUTS (1)
|
|
||||||
#define NUM_ANALOG_OUTPUTS (0)
|
|
||||||
|
|
||||||
// Pin 13 enables 3.3V periphery. If the Lora module is on this pin, then it should stay enabled at all times.
|
|
||||||
#define PIN_3V3_EN (0 + 13) // P0.13
|
|
||||||
|
|
||||||
// Analog pins
|
|
||||||
#define BATTERY_PIN (0 + 31) // P0.31 Battery ADC
|
|
||||||
#define ADC_CHANNEL ADC1_GPIO4_CHANNEL
|
|
||||||
#define ADC_RESOLUTION 14
|
|
||||||
#define BATTERY_SENSE_RESOLUTION_BITS 12
|
|
||||||
#define BATTERY_SENSE_RESOLUTION 4096.0
|
|
||||||
// Definition of milliVolt per LSB => 3.0V ADC range and 12-bit ADC resolution = 3000mV/4096
|
|
||||||
#define VBAT_MV_PER_LSB (0.73242188F)
|
|
||||||
// Voltage divider value => 1.5M + 1M voltage divider on VBAT = (1.5M / (1M + 1.5M))
|
|
||||||
#define VBAT_DIVIDER (0.6F)
|
|
||||||
// Compensation factor for the VBAT divider
|
|
||||||
#define VBAT_DIVIDER_COMP (1.73)
|
|
||||||
// Fixed calculation of milliVolt from compensation value
|
|
||||||
#define REAL_VBAT_MV_PER_LSB (VBAT_DIVIDER_COMP * VBAT_MV_PER_LSB)
|
|
||||||
#undef AREF_VOLTAGE
|
|
||||||
#define AREF_VOLTAGE 3.0
|
|
||||||
#define VBAT_AR_INTERNAL AR_INTERNAL_3_0
|
|
||||||
#define ADC_MULTIPLIER VBAT_DIVIDER_COMP // REAL_VBAT_MV_PER_LSB
|
|
||||||
#define VBAT_RAW_TO_SCALED(x) (REAL_VBAT_MV_PER_LSB * x)
|
|
||||||
|
|
||||||
// WIRE IC AND IIC PINS
|
|
||||||
#define WIRE_INTERFACES_COUNT 1
|
|
||||||
|
|
||||||
#define PIN_WIRE_SDA (32 + 4) // P1.04
|
|
||||||
#define PIN_WIRE_SCL (0 + 11) // P0.11
|
|
||||||
|
|
||||||
// LED
|
|
||||||
#define PIN_LED1 (0 + 15) // P0.15
|
|
||||||
#define LED_BUILTIN PIN_LED1
|
|
||||||
// Actually red
|
|
||||||
#define LED_BLUE PIN_LED1
|
|
||||||
#define LED_STATE_ON 1 // State when LED is lit
|
|
||||||
|
|
||||||
// Button
|
|
||||||
#define BUTTON_PIN (32 + 0) // P1.00
|
|
||||||
|
|
||||||
// GPS
|
|
||||||
#define PIN_GPS_TX (0 + 22) // P0.22
|
|
||||||
#define PIN_GPS_RX (0 + 20) // P0.20
|
|
||||||
|
|
||||||
#define PIN_GPS_EN (0 + 24) // P0.24
|
|
||||||
#define GPS_UBLOX
|
|
||||||
// define GPS_DEBUG
|
|
||||||
|
|
||||||
// UART interfaces
|
|
||||||
#define PIN_SERIAL1_RX PIN_GPS_TX
|
|
||||||
#define PIN_SERIAL1_TX PIN_GPS_RX
|
|
||||||
|
|
||||||
#define PIN_SERIAL2_RX (0 + 6) // P0.06
|
|
||||||
#define PIN_SERIAL2_TX (0 + 8) // P0.08
|
|
||||||
|
|
||||||
// Serial interfaces
|
|
||||||
#define SPI_INTERFACES_COUNT 1
|
|
||||||
|
|
||||||
#define PIN_SPI_MISO (0 + 2) // P0.02
|
|
||||||
#define PIN_SPI_MOSI (32 + 15) // P1.15
|
|
||||||
#define PIN_SPI_SCK (32 + 11) // P1.11
|
|
||||||
|
|
||||||
// LORA MODULES
|
|
||||||
#define USE_LLCC68
|
|
||||||
#define USE_SX1262
|
|
||||||
// #define USE_RF95
|
|
||||||
#define USE_SX1268
|
|
||||||
|
|
||||||
// LORA CONFIG
|
|
||||||
#define SX126X_CS (32 + 13) // P1.13 FIXME - we really should define LORA_CS instead
|
|
||||||
#define SX126X_DIO1 (0 + 10) // P0.10 IRQ
|
|
||||||
#define SX126X_DIO2_AS_RF_SWITCH // Note for E22 modules: DIO2 is not attached internally to TXEN for automatic TX/RX switching,
|
|
||||||
// so it needs connecting externally if it is used in this way
|
|
||||||
#define SX126X_BUSY (0 + 29) // P0.29
|
|
||||||
#define SX126X_RESET (0 + 9) // P0.09
|
|
||||||
#define SX126X_RXEN (0 + 17) // P0.17
|
|
||||||
#define SX126X_TXEN RADIOLIB_NC // Assuming that DIO2 is connected to TXEN pin. If not, TXEN must be connected.
|
|
||||||
|
|
||||||
/*
|
|
||||||
On the SX1262, DIO3 sets the voltage for an external TCXO, if one is present. If one is not present, then this should not be used.
|
|
||||||
|
|
||||||
Ebyte
|
|
||||||
e22-900mm22s has no TCXO
|
|
||||||
e22-900m22s has TCXO
|
|
||||||
e220-900mm22s has no TCXO, works with/without this definition, looks like DIO3 not connected at all
|
|
||||||
|
|
||||||
AI-thinker
|
|
||||||
RA-01SH does not have TCXO
|
|
||||||
|
|
||||||
Waveshare
|
|
||||||
Core1262 has TCXO
|
|
||||||
|
|
||||||
*/
|
|
||||||
// #define SX126X_DIO3_TCXO_VOLTAGE 1.8
|
|
||||||
|
|
||||||
#ifdef __cplusplus
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/*----------------------------------------------------------------------------
|
|
||||||
* Arduino objects - C++ only
|
|
||||||
*----------------------------------------------------------------------------*/
|
|
||||||
|
|
||||||
#endif
|
|
||||||
+1
-1
@@ -1,4 +1,4 @@
|
|||||||
[VERSION]
|
[VERSION]
|
||||||
major = 2
|
major = 2
|
||||||
minor = 7
|
minor = 7
|
||||||
build = 14
|
build = 15
|
||||||
|
|||||||
Reference in New Issue
Block a user