Commit Graph
3221 Commits
Author SHA1 Message Date
Liam CottleandGitHub 2183805c24 Merge pull request #2615 from omeg/omeg/respect-i2c-address
Respect predefined I2C addresses in EnvironmentSensorManager
2026-05-25 00:04:49 +12:00
Rafał Wojdyła eb53c61f17 Respect predefined I2C addresses in EnvironmentSensorManager 2026-05-24 13:16:50 +02:00
fdlamotteandGitHub 73c7718b9e Merge pull request #2235 from jirogit/fix/lr1110-rxgain-cli-guard
fix: enable radio.rxgain CLI command for LR1110 (T1000-E)
2026-05-24 11:56:23 +02:00
ripplebizandGitHub e251dc1659 Merge pull request #2540 from agessaman/feat/regions-quick-loasd
Add bulk region hierarchy command to CLI
2026-05-23 18:37:28 +10:00
ripplebizandGitHub 26d0001301 Merge pull request #2608 from recrof/flood-advert-interval-47
Set flood advert interval to 47h for new installs
2026-05-23 15:37:31 +10:00
ripplebizandGitHub dc00790f79 Merge pull request #2604 from recrof/patch-1
Companion repeat: update to more usable default EU frequency
2026-05-23 15:19:30 +10:00
Rastislav VysokyandGitHub a37078f6c5 Companion repeat: update to more usable default EU frequency
869.495 is in 869.4 to 869.65 range which does have 10% duty cycle and 500mW ERP.
2026-05-22 17:04:19 +02:00
Liam CottleandGitHub a35b1bbbfd Merge pull request #2590 from jocasmark/fix/typos
Fix typos in comments and docs
2026-05-22 19:38:19 +12:00
Mark Jocas bffd17a188 Revert typo fix from external libraries
Reverts typo fixes in comments within external libs.
2026-05-22 09:32:54 +02:00
Kevin Le da7663a6fb Fixed hasPendingWork for BLE companions 2026-05-22 10:58:21 +07:00
Kevin Le 280213d41f Fixed to put hasPendingWork out of ENV_INCLUDE_GPS 2026-05-22 10:58:21 +07:00
Kevin Le 6b1099161c Added Power Saving for NRF52 companions 2026-05-22 10:58:17 +07:00
agessaman 1296aa7792 Refactor region def with helpers, refine docs
Extract the inline cursor-walk in handleRegionCmd into file-local
helpers (skipSpaces, rtrimSpaces, takeToken, splitNameJump,
processRegionDefSegment), grouped immediately above the consumer.
Behavior is identical; addresses PR #2540 review feedback on
readability.

Tighten the region def docs: collapse five Note callouts into three
grouped paragraphs (Behavior / Existing regions / Limits), add a
case-sensitivity caveat plus an error example, note the cursor reset
between split commands, and use generic placeholder names.
2026-05-21 19:25:01 -07:00
Rastislav VysokyandGitHub 01500e55d8 Change room server flood advert interval to 47 hours 2026-05-21 14:53:49 +02:00
Rastislav VysokyandGitHub 40180b8fe6 Update repeater flood advert interval to 47 hours 2026-05-21 14:50:58 +02:00
ripplebizandGitHub 23f48e025f Merge pull request #2517 from oltaco/techo-card
Add support for LilyGo T-Echo Card (and tiny-ui!)
2026-05-21 20:45:54 +10:00
taco efaf95d685 fix debug params for t-echo card 2026-05-21 19:58:10 +10:00
taco 7c8d84ffb5 remove deprecated functions, fix typo and style 2026-05-21 19:58:10 +10:00
taco 26c641bc63 tiny ui rendering fixes 2026-05-21 19:58:10 +10:00
taco 9f683975c1 add torch 2026-05-21 19:58:10 +10:00
taco 8540c98947 add tinyui for lilygo t-echo card 2026-05-21 19:58:10 +10:00
taco 5058415fa3 u8g2 wrapper: allow larger font when size >= 2 2026-05-21 19:58:10 +10:00
pelgraineandtaco 2462cf6c97 add wrapper for u8g2 display driver 2026-05-21 19:58:10 +10:00
taco 1e740d30f2 initial t-echo card support 2026-05-21 19:58:10 +10:00
Huw DuddyandGitHub bfdceae16e Merge pull request #2443 from kizniche/fix-rxdelay-txdelay
Fix: Enforce upper bounds for rxdelay, txdelay, and direct.txdelay
2026-05-21 16:57:41 +10:00
Liam CottleandGitHub 683299079f Merge pull request #2594 from meshcore-dev/extended-ack
support for sending 6-byte ACKs
2026-05-21 17:45:03 +12:00
Valentin V. Bartenev e11d14e6cc Fix: expand HistorySample::recv_errors from uint16_t to uint32_t
The error_rate graph showed all zeros after ~65535 receive errors had
accumulated.  Root cause was a two-part bug:

1. In MyMesh::updateStatsHistory(), recv_errors was clamped to 0xFFFF
   via min<uint32_t>(..., 0xFFFF).  Once the counter reached 65535,
   every subsequent sample stored the same constant value, making the
   per-interval delta always zero and therefore error_rate always zero.

2. HistorySample::recv_errors was declared as uint16_t while the
   underlying counter (n_recv_errors) is uint32_t.  parseSummaryLine()
   also truncated the restored value back to uint16_t.

Fix:
- Remove the clamp in MyMesh::updateStatsHistory(); assign
  getPacketsRecvErrors() (uint32_t) directly.
- Change HistorySample::recv_errors from uint16_t to uint32_t,
  moving it next to the other uint32_t fields.
- Update both parseSummaryLine() code paths to cast recv_errors to
  uint32_t instead of uint16_t.

The archive format is unchanged: recv_errors is written as %u and
read back into an unsigned local, which is correct for a 32-bit
value on ESP32.
2026-05-20 19:53:12 +03:00
Scott Powell a130a95a0d * added 6th byte to ACK, with RNG 2026-05-21 00:00:03 +10:00
Huw DuddyandGitHub 0a13f6bcba Merge pull request #2576 from csrutil/fix/heltec-t096-sensor-env
Add Heltec T096 sensor environment
2026-05-20 22:21:58 +10:00
Liam CottleandGitHub f03662af11 Merge pull request #2592 from oltaco/nrf52-pio-target-fix
Fix upload and monitor targets for nrf52 envs
2026-05-20 22:26:58 +12:00
taco b92fcbed10 add openocd_target to lilygo t-impulse board.json 2026-05-20 20:02:18 +10:00
Mark Jocas 63fe3d42a2 Corrects typos and grammatical errors
Improves readability across documentation and inline comments by fixing common spelling mistakes and duplicate words.
2026-05-20 08:33:48 +02:00
Scott Powell 717142abd6 * bug fix 2026-05-19 17:06:42 +10:00
Valentin V. Bartenev 6a3a29f429 NetworkService: use NTP server from DHCP Option 42 when available
Call sntp_servermode_dhcp(1) before WiFi.begin() so that lwIP's DHCP
client passes any NTP server address received in DHCP Option 42 to the
SNTP client (slot 0).

Replace configTzTime() with explicit setenv/tzset + sntp_setservername
+ sntp_init() to avoid overwriting the DHCP-provided server.  Static
fallback servers (0.ru.pool.ntp.org, ntp.ix.ru, ntp21.vniiftri.ru) are
placed in slots 1-2 when DHCP provides a server, or slots 0-2 otherwise.

This relies on CONFIG_LWIP_DHCP_GET_NTP_SRV=y, which is already enabled
in the pre-built Arduino ESP32 core (framework-arduinoespressif32).

Add debug logging of the initialised NTP server list, guarded by
WIFI_DEBUG_LOGGING.
2026-05-18 01:12:19 +03:00
Valentin V. Bartenev 8a0d04fa86 Web: add meshcoretel.ru profile link button next to public key
Adds a hidden `ℹ` button (meshcoretelProfileBtn) in the Public Key
field of the Info panel.  After initApp() finishes loading the
"Loading info..." section, the public key value is read from the
DOM and validated against /^[0-9A-F]{64}$/.  If it passes, an onclick
handler is attached that opens https://meshcoretel.ru/<PUBLIC_KEY>
in a new tab, and the button is made visible.  The button remains
hidden if the key fails to load or does not match the expected 64-char
uppercase hex pattern, so the UI degrades gracefully on any firmware
that does not return a valid public key.

The container div is changed from fieldline (2-column grid: 1fr auto)
to inline-actions (3-column grid: minmax(0,1fr) auto auto) to accommodate
the second action button without wrapping.
2026-05-17 15:40:10 +03:00
Scott Powell 2eb747d504 * fix 2026-05-17 22:38:42 +10:00
Scott Powell f6e6fdaa05 * support for sending 5-byte ACKs 2026-05-17 22:10:13 +10:00
csrutil 0cf4d422a8 Add Heltec T096 sensor environment 2026-05-17 16:17:05 +08:00
Valentin V. Bartenev 7378666416 Web: link neighbour IDs to meshcoretel.ru profile pages
renderNeighbourId in the /stats neighbours table now checks for the
"full_id" field emitted by appendJsonNeighbours().  If the value is a
valid 64-character hex string (the node's full 32-byte public key),
the short ID is wrapped in an anchor tag pointing to
https://meshcoretel.ru/<FULL_ID_UPPERCASE> (target="_blank",
rel="noopener noreferrer").  Falls back to plain short ID when
"full_id" is absent or does not match the expected pattern.
2026-05-17 06:11:52 +03:00
Liam CottleandGitHub 39b333656b Merge pull request #2574 from ViezeVingertjes/docs/kiss-txbusy-error
Document HW_ERR_TX_BUSY in KISS modem protocol
2026-05-17 12:37:15 +12:00
Valentin V. Bartenev 88517878d6 Docs: update according to changes in the new versions
web-panel.md:
- Replace Start OTA nav item with dedicated Firmware Update section
- Update Info panel: Version/Client Version → Hardware/Firmware
- Add auto-refresh toggle to /stats element list
- Expand Trends list: add error_rate, core0_util, mcu_temp,
  note RX/TX stacked rendering of packets series
- Update sequential trend loading order accordingly
- Rewrite OTA subsection to describe native HTTPS upload flow

api.md:
- Add error_rate and core0_util to supported series list

boards.md:
- Add DIY_ESP32S3_N16R8_E22_Back2back to repeater_mqtt table

local-builds.md:
- Add DIY_ESP32S3_N16R8_E22_Back2back_repeater_mqtt
- Add Ebyte_EoRa-S3_Repeater_mqtt
- Add ThinkNode_M2_Repeater_mqtt
- Add ThinkNode_M5_Repeater_mqtt
2026-05-16 22:15:15 +03:00
agessaman f3c6c34883 Update CLI command from region bulk to region def 2026-05-16 10:47:51 -07:00
Valentin V. Bartenev 0005731c45 Web: fix bar chart hover index for edge columns
The hover index in syncHoverByX was computed as:

  Math.round(x / width * (n - 1))

which linearly maps the full canvas width [0, width] to indices
[0, n-1].  For bar charts (packets, gps_satellites) the bars are
drawn in a plot area with plotLeft=4 and plotRight=width-4 margins,
so bar centers are at plotLeft + slotWidth*i + slotWidth/2.  This
caused the first and last bars to require the cursor to be at the
very edge of the canvas to highlight correctly, while center bars
appeared fine.

For bar chart keys, use a slot-based formula instead:

  Math.floor((x - plotLeft) / slotWidth)

which maps the cursor to whichever slot it falls in, matching the
actual bar layout.  Line chart keys retain the original formula.
2026-05-16 16:58:16 +03:00
Valentin V. Bartenev d5d4311e0e Web: sync graph hover by timestamp instead of relative position
When hovering over a sparkline, the same X fraction was applied to
all other canvases to compute the highlighted point index.  Because
different series can have different numbers of valid samples (some
values are filtered out), the same fraction mapped to different
indices and therefore different timestamps on each graph.

Fix by reading the uptime_secs timestamp (point[0]) of the hovered
point on the source canvas and finding the closest-timestamp point
in each other series, instead of using the fractional position.

Also de-duplicate the near-identical onmousemove/ontouchstart and
onmouseleave/ontouchend handlers into syncHoverByX() and
syncHoverClear() helpers, reducing the block from 34 lines to 16.
2026-05-16 16:28:04 +03:00
Valentin V. Bartenev 7f17c3aeab Web: fix bogus packets/error_rate delta at SD archive restore boundary
restoreSummaryLog() seeds the ring buffer with one sample from the
previous session (summary.latest).  The next live sample has reset
counters and uptime starting from zero, so the delta across that
boundary is meaningless.

For the packets series this produced a zero point (same symptom as the
first-sample zero fixed in 1018404b, but at the restore boundary instead).
For error_rate it produced an inflated value because the counter difference
wraps around.

Fix by skipping any sample whose uptime_secs does not exceed the
previous sample's uptime_secs.  In buildPointValue this returns false;
in the buildSeriesJson packets loop it skips emission and does not
advance previous.

Also: move have_previous = false into the else branch (the packets
branch does not use it), drop the now-redundant >= guards in favour of
direct uint32_t subtraction, and replace a C-style cast with
static_cast<int> for consistency.
2026-05-16 15:29:11 +03:00
ViezeVingertjes 79caba5bab Document HW_ERR_TX_BUSY in KISS modem protocol 2026-05-16 11:32:33 +02:00
ripplebizandGitHub c940ea5f30 Merge pull request #2567 from recrof/patch-4
Change MeshCore intro video link to The Comms Channel's MC intro playlist
2026-05-16 13:03:00 +10:00
Valentin V. Bartenev 43d0e549fb Web: fix hover effect on disabled buttons
Disabled save buttons (e.g. the OTA upload button and the MQTT IATA
save button) were still showing a hover background change because the
generic `button:hover` rule applied unconditionally to all buttons,
including disabled ones.

The attempt in fbab1483 to fix this was incorrect: it added a
`.savebtn:not(:disabled):hover` rule, but that rule sets the same
`var(--accent-hover)` value that `button:hover` already provides.
It never prevented `button:hover` from firing on a disabled element — it
simply didn't match when the button was disabled, leaving `button:hover`
to win unchallenged.  The rule had zero net effect and was dead CSS.

The correct fix is to guard the root rule itself:

  button:not(:disabled):hover { background: var(--accent-hover); }

Adding `:not(:disabled)` raises the selector's specificity from (0,1,1)
to (0,2,1), which would have overridden `.iconbtn:hover` and
`.themebtn:hover` (both (0,2,0), no element selector).  Those two rules
are compensated by adding the `button` element qualifier, restoring
their specificity to (0,2,1) and keeping source-order tie-breaking
intact.

The now-redundant `.savebtn:not(:disabled):hover` rule is removed.
2026-05-16 02:20:34 +03:00
Valentin V. Bartenev 59f6df50c5 Web: replace unreliable post-OTA device poll with a countdown timer
After a successful OTA upload the web panel polled the device by
fetching "/" and waiting for a 200 OK response.  This approach
is fundamentally broken when the new firmware contains a freshly
generated self-signed certificate (e.g. from a clean CI build):

- The browser rejects the TLS handshake with a certificate error
  (MOZILLA_PKIX_ERROR_SELF_SIGNED_CERT in Firefox; other browsers
  report different error names but behave identically).  The fetch()
  call throws a generic TypeError — the same type thrown for any other
  network failure such as a refused or timed-out connection.  Browsers
  intentionally provide no way to distinguish a cert rejection from a
  plain connectivity failure, so the catch block cannot tell whether
  the device is up-but-cert-changed or simply not yet online.

- Switching to an explicit http:// URL to sidestep TLS is not an
  option: the web panel is served over HTTPS, and browsers block
  active mixed content (fetch/XHR to HTTP) unconditionally from an
  HTTPS origin.

Because no network-based probe can reliably detect device readiness
under these constraints without changing how the certificate is
generated, replace the polling loop with a simple 10-second countdown
timer that unconditionally redirects to the login page.  The device
is typically back online within ~7 seconds, so the 10-second wait
provides a reasonable safety margin.
2026-05-16 01:51:06 +03:00
Valentin V. Bartenev 1018404b82 Web: fix packets series emitting a spurious zero point at the start
The packets series is a delta series: each point represents the change in
packets_recv/packets_sent between two consecutive samples.  The oldest
point (index 0) has no predecessor, so no meaningful delta can be computed
for it.

Previously, buildSeriesJson() started the loop at i = 0 and guarded the
delta computation with have_previous, emitting [uptime, 0, 0] for the
first sample. This spurious zero point caused several visible problems:

 - Hovering over the leftmost column of the stacked packets graph showed
   a zero-height bar with a zero tooltip.

 - The min/max range display always showed min 0 because the zero point
   was included in the range calculation.

 - oldest_age_secs (computed via buildPointValue in the first loop) was
   anchored to the zero point rather than the oldest valid delta sample.

Fix by restructuring the packets branch in buildSeriesJson: read sample 0
into previous before the loop, then start the loop at i = step. This
eliminates the zero point at the source and removes the per-iteration
have_previous check from the inner loop.

Also change buildPointValue for the packets series to return false
when previous == nullptr, consistent with error_rate.  This ensures the
first loop (which computes oldest_age_secs) no longer treats the first
sample as a valid data point.  The current-value calculation is unaffected
because it already passes an explicit previous pointer for delta series.

As a side effect, the original loop incremented emitted for the wasted
first iteration, counting it against the emitted < points limit and
causing one fewer actual point to be serialized than requested.  The
new loop only increments emitted for real iterations, correcting this
off-by-one.
2026-05-15 23:00:15 +03:00