Compare commits

...
75 Commits
Author SHA1 Message Date
shade 8ba2fb33f1 branding: show the real compile date in Device > Firmware 2026-10-20 10:19:49 +03:00
shade 413d0b7030 branding: posadmesh.ru v1.0 on boot splash and Device > Firmware 2026-10-20 10:17:09 +03:00
shade f9a556bf8a lang: Russian v33 with beta_98 repeater-admin strings 2026-10-20 09:57:21 +03:00
shade 8c894e3e68 merge beta_98 into MeshInfo fork; keep RF locale, presets and meshinfo store 2026-10-20 09:56:50 +03:00
shade a56a9a35ae readme: merged image is built, not committed 2026-10-20 09:49:25 +03:00
shade d4b0b7d0d6 meshinfo fork: Russian UI, RF timezones/presets, meshinfo store, stability fixes 2026-10-20 09:46:51 +03:00
Kaj SchittecatandClaude Opus 5.5 1eac81b81f touch: beta_98 - release notes, language store v28
Repeater and room server admin, SenseCAP Indicator D1L, CrowPanel 10.1 touch,
OTA watchdog fix (#689), backup names (#688), P4 C6 recovery (#685), the web
client, sync cursor reuse.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-18 19:50:23 +02:00
Kaj SchittecatandClaude Opus 5.5 f0dc398cf2 companion sync: recycle the stalest cursor when all 8 are taken
Every browser running the web client now keeps its own sync cursor; with all
slots taken a new client was never synced at all.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-18 17:47:47 +02:00
Kaj SchittecatandClaude Opus 5.5 5350db0110 deploy+site: the Wi-Fi copy is wifi.app.wadamesh.com
Two levels deep: proxied (origin IP stays hidden) but outside Universal
SSL, so https fails and Chrome stays on http.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-18 17:22:45 +02:00
Kaj SchittecatandClaude Opus 5.5 8a24c42969 site: drop the unverified Insecure-content tip
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-18 16:59:38 +02:00
Kaj SchittecatandClaude Opus 5.5 7d8a094ecf site: the Wi-Fi version lives on wifi.wadamesh.com
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-18 16:59:29 +02:00
Kaj SchittecatandClaude Opus 5.5 6657014035 deploy: serve the web client's Wi-Fi copy on wifi.wadamesh.com
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-18 16:59:18 +02:00
Kaj Schittecat 8954fe06df Merge repeater-admin: repeater and room server admin app
# Conflicts:
#	deploy/apps/lang/bg.lang
#	deploy/apps/lang/cs.lang
#	deploy/apps/lang/de.lang
#	deploy/apps/lang/el.lang
#	deploy/apps/lang/es.lang
#	deploy/apps/lang/fr.lang
#	deploy/apps/lang/hu.lang
#	deploy/apps/lang/it.lang
#	deploy/apps/lang/nl.lang
#	deploy/apps/lang/pt-br.lang
#	deploy/apps/lang/ro.lang
#	deploy/apps/lang/ru.lang
#	deploy/apps/lang/sr.lang
#	deploy/apps/lang/uk.lang
#	src/ui-touch/i18n_builtin.h
2026-10-18 15:34:38 +02:00
Kaj SchittecatandClaude Opus 5.5 7ee059b803 i18n: regenerate the V4 table for the repeater admin strings
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-18 15:17:08 +02:00
Kaj SchittecatandClaude Opus 5.5 2a4e48bc50 touch: repeater and room server admin app
The contact sheet's Admin button (repeaters, and now room servers) opens a
full admin app instead of a password box and a raw console. Login as admin
or guest (remembered password logs in at once), then an overview with the
node's status (GET_STATUS), firmware and owner info (GET_OWNER_INFO),
neighbours (GET_NEIGHBOURS, paged, newest or strongest), telemetry, the
access list with role changes (GET_ACCESS_LIST + setperm), settings pages
(identity and location, radio, repeating and limits, adverts, passwords and
access, regions) and actions (adverts, clock sync, discover neighbours,
reset counters, reboot, firmware update). The old CLI console stays as
Advanced > Console.

Every CLI line carries the "wX|" correlation prefix MeshCore echoes back, so
a reply always lands on the field that asked; one request is in flight at a
time, reads retry once, writes never, and a write is followed by a re-read.
Radio changes go through a confirm that shows old and new values, with a
10 minute tempradio trial before a saved change, and a reboot offer after.

MyMesh gains uiSendBinaryRequest (UiReqKind::Binary -> onBinaryReply) and
uiLastLoginInfo (the LOGIN_OK ACL byte and firmware level). The repeater
ping toast read uptime from the airtime field (offset 16, not 20); fixed.
Parsing lives in RepeaterAdminProto.h with a host test. Translations for all
14 languages. -DDOC_CAPTURE -DDOC_AUDIT_FOCUS -DDOC_ADMIN_AUDIT captures the
app against a node in range as a guest.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-18 15:17:08 +02:00
Kaj Schittecat 10b541cbbd Merge crowpanel-touch: CrowPanel 10.1 touch (GPIO45 SD power pin), tiles on storage, C6 version, quiet SD probe 2026-10-18 15:12:15 +02:00
Kaj Schittecat e566823d0f Merge p4-ui-bits: P4 always-external antenna, slim landscape composer, Glass tiles switch 2026-10-18 15:12:14 +02:00
Kaj Schittecat 33426ffaa4 Merge p4-at-recovery: the AT C6 resets and rejoins when it stops answering (#685) 2026-10-18 15:12:14 +02:00
Kaj SchittecatandClaude Opus 5.5 d2ec668535 site: the web client (app.wadamesh.com), its page, and a third hero button
- webclient.html: what the web client is, how to connect (USB, Bluetooth,
  Wi-Fi), where it works (desktop, Android, iPhone), the https / http split
  for Wi-Fi, where data lives, what only a device can do, and a FAQ, with
  screenshots of the real client.
- index: "Use the web client" next to Install and Join the community, a Web
  client button on the side rail and a resource card; sitemap.
- deploy/nginx/app.wadamesh.com.conf: the vhost (COOP/COEP/CORP, versioned
  bundles cached, same-origin /tiles/ and /fw/apps/ handed to the tiles and
  firmware vhosts over loopback). scripts/deploy-webclient.sh publishes
  web/dist (and web/dist-nothreads to nt/).

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-18 15:09:22 +02:00
Kaj SchittecatandClaude Opus 5.5 d20e3702bb crowpanel_p4_101: fix touch (SD_MMC tore down I2C0 on GPIO45), quieter boot
Touch: the generic esp32p4 Arduino variant defines BOARD_SDMMC_POWER_PIN 45
(the Function EV board's SD power switch). SD_MMC.begin() did pinMode(45,
OUTPUT) and SD_MMC.end() cleared it, so the peripheral manager detached I2C0
(i2cDeinit) that ESP32Board::begin had started on SDA45/SCL46. Every Wire
call after the boot SD probe failed with "bus is not initialized". build.sh
now guards that block behind WADA_SDMMC_NO_POWER_PIN (defined for this board,
whose card has no power switch), failing the build if upstream drifts.

GT911 init now goes: LDO4 check -> bus begin/re-begin with a logged result
and the pin owner on failure -> RST/INT strap per the datasheet (0x5D, then
0x14, then RST only) -> full scan logged -> address pick -> product id,
firmware, config version, resolution and touch count logged. Three attempts,
700 ms apart, each actually on the bus.

Tiles: no free flash for a "tiles" partition without moving user data, so
CAP_TILES_ON_STORAGE routes the cache to microSD or the internal 'storage'
LittleFS, now with a 30% (min 2 MB) free-space floor for user data. The
"tiles" mount is only tried when the partition exists (no more partition
not found / format failed errors), and logs name the board.

SD: one quiet 400 kHz identification probe at boot; an empty slot logs "no
card or not responding" once and skips the 3-step ladder.

C6: the INIT-event firmware version is kept (build.sh patch) and logged
plainly against the host version; an older C6 gets 60 s Wi-Fi retries.

Also: no setCpuFrequencyMhz on the P4 (fixed 360 MHz), no SPIFFS purge walk
where SPIFFS is not mounted, and SdNvsPrefs asks nvs_open() before a
read-only Preferences open so absent namespaces no longer log NOT_FOUND.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-18 15:06:21 +02:00
Kaj SchittecatandClaude Opus 5.5 737b51aaa0 touch: regenerate the V4 language table for the new strings
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-18 15:06:00 +02:00
Kaj SchittecatandClaude Opus 5.5 f71a42ef0e touch: P4 always-external antenna, slim landscape composer, Glass tiles switch
- T-Display P4 (CAP_ANTENNA_SELECT): Radio settings "Always use the external
  antenna (MMCX)". Boot selects the external socket only with this opt-in,
  which asks first with a damage warning. Own NVS key ant_ext (never the
  reserved cfg byte p4_antenna), left out of the settings backup. Turning it
  off goes back to the on-board antenna at once. The control panel gets an
  Antenna tile (filled + "MMCX" on external); a tap asks for the external
  socket through the same warning, hold opens Radio settings.
- Large screens in landscape (P4 landscape, Tanmatsu, CrowPanel 5.0/10.1):
  the empty composer text box is one line tall and grows from there; the row
  stays as tall as its buttons and a shorter box sits centred on them. P4
  portrait two-row layout unchanged.
- Settings > Theme > Background: "Glass tiles" (default on). Off draws Home
  widgets, cards, the control panel and its tiles solid. Pending + Apply.
- 11 new strings translated in all 14 languages.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-18 15:06:00 +02:00
Kaj SchittecatandClaude Opus 5.5 ce620f2671 tdisplay_p4: reset and rejoin a wedged ESP-AT C6 at runtime (#685)
On units whose C6 runs LilyGo's factory ESP-AT image, Wi-Fi died after
about an hour: scans came back empty, Connect did nothing, and only a
reboot helped. The AT worker brought the SDIO link up once at boot and
never again, so a C6 that wedged mid-session left every command timing
out for the rest of the session.

Link health: AT commands now report OK / ERROR / TIMEOUT / BUSY. A
timeout or busy reply asks for a plain "AT" ping; a ping that times out,
or three command timeouts in a row with no answer between them, is a
stall. ERROR replies are answers and never count. Connects to dead hosts
(CIPSTART) and missing CIPSEND prompts only ask for a ping. The decision
logic lives in c6_link_health.h with a host test.

Recovery: on a stall the worker takes the link down at once (queued
requests fail fast, links read closed so the TCP/WS companion servers
prune them), then runs sdio_bring_down + the XL9535 C6 reset +
c6at_begin, the same path as boot. Resets back off 30 s, 60 s, 120 s,
240 s, then every 5 min; 10 min of a healthy link resets the ladder.
After a successful reset it rejoins the last network and the kept
listener want-flag re-arms AT+CIPSERVER, so port 5000 comes back without
app-side changes. The Wi-Fi status reads "reconnecting" meanwhile, and
main.cpp no longer treats the reset as "radio off".

Join/disconnect: one latest-wins slot instead of the 6-deep queue, so
the user's Connect can no longer be dropped behind 10 s retry pairs and
a stale CWQAP can no longer undo a fresh join. c6at_join_busy() gates
main.cpp's retry while a join is pending or running.

Bring-up now also sends AT+SLEEP=0 and sets AT+CWRECONNCFG=5,0 when the
AT build supports it (query first; ERROR on old images is ignored).

The esp-hosted build is unchanged: everything is in the c6_at component
or behind !TDP4_C6_HOSTED.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-18 15:05:54 +02:00
Kaj SchittecatandClaude Opus 5.5 17c3d6392f site: the P4 installer names the blue screen as the sign to pick Never connects
On a P4 whose C6 still runs the factory ESP-AT firmware the esp-hosted image
can stop on a teal/blue screen right after the logo (Discord), not only fail
to connect; both P4 cards' help text now names that symptom too.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-18 14:51:03 +02:00
Kaj SchittecatandClaude Opus 5.5 66a0c30945 release: the SenseCAP Indicator D1L ships in betas and the web flasher
The #682 port is merged; add its env to release.sh, a flasher manifest, a
card under Seeed Studio on wadamesh.com (experimental, community port, no
device updates) and the README. The site card points at the beta feed, so
deploy the site after the next beta publishes. Board count 16.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-18 14:50:26 +02:00
Kaj SchittecatandClaude Opus 5.5 d1524fd45b touch: backup names probe by opening the file (Tanmatsu FFat)
#688 picks the first free meshcore-backup-nodate-N with fs->exists(). On the
Tanmatsu FFat's exists() reports files that are there as missing (and stat
lies on the P4), so without a card every export would pick nodate-1 and
overwrite the previous one. Probe with open() instead.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-18 14:49:39 +02:00
Kaj Schittecat 75074e9d2a Merge PR #688: backups get one meshcore-backup-<date> name, no overwrite without a clock (#686) 2026-10-18 14:43:17 +02:00
Kaj Schittecat 2656327d2a Merge PR #682: SenseCAP Indicator D1L touch target (ST7701S, FT6336, SX1262 behind a TCA9535) 2026-10-18 14:41:21 +02:00
Kaj SchittecatandClaude Opus 5.5 35f462ecc8 touch: OTA update no longer trips the task watchdog while it waits (#689)
otaWorkerRun streamed the image with Update.writeStream(), which reads
through Stream::timedRead: that spins without yielding until HTTPClient's
20 s timeout. The OTA runs on the core-0 tile worker, so a slow start starved
IDLE0 and the 5 s task watchdog rebooted the device: "stuck at 0%, then a
restart" on a T-Deck Plus (#689). The image is now copied by hand through an
internal 4 KB buffer, waiting with vTaskDelay and yielding after every block,
giving up after 15 s without data (the same loop as the SD download).

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-18 14:38:11 +02:00
Michael A. CojocariandClaude Opus 5.5 c67d07e252 Backups: one meshcore-backup-<date> name, no overwrite without a clock (#686)
With the clock unset, Export backup named the file after uptime seconds
(meshcore-backup-86.json), which read as a broken date and repeated after
every reboot, so a later export could overwrite an earlier backup.

Every timestamped backup is now meshcore-backup-YYYYMMDD-HHMMSS.json (was
meshcore-YYYYMMDD-HHMMSS.json), so the date always ends the name. Without a
set clock it is meshcore-backup-nodate-N.json; the Backups page picks the
first N not already on the card or in internal storage. The web download
uses the same pattern without the storage probe. Older names still list
and restore (the filters match meshcore-*.json).

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01MjAKa5hXgyBykCLqnwcjEy
2026-10-17 19:35:48 -04:00
Confituurke d37d1798e7 docs(sensecap-indicator): port notes and device table entry
PORT.md records what a reviewer or tester needs and the code does not
say in one place: the pin and expander maps, the boot order and why the
display comes before the radio, the /INT dispatch and DIO1 edge rules,
the TCXO strap and retry, the display timings, pixel clock and draw
band, the touch mapping, the flash layout and image size, what the port
leaves out (RP2040 peripherals, maps, deep sleep, OTA artifacts) and
what has been exercised on a D1L.

DEVICES.md lists the D1L as an experimental development-build target
with no battery and the untested D1Pro, and drops it from the requested
boards (#14).

Signed-off-by: Confituurke <9595028+Confituurke@users.noreply.github.com>
2026-10-17 22:39:32 +02:00
Confituurke 0aaafba96c feat(sensecap-indicator): hide Power off, nothing can wake the board
The Indicator's only user button is GPIO38, which is not an RTC GPIO on
the ESP32-S3 (those are 0..21), so it cannot wake the chip from deep
sleep, and the touch interrupt is behind the I2C expander. A software
power-off that only unplugging USB can undo reads as a freeze (#310,
#406), which is why the Wio Tracker L2 and the T-Display P4 hide it.

The board joins them in the Power-off gate, and its power menu card is
sized for the three remaining rows.

Signed-off-by: Confituurke <9595028+Confituurke@users.noreply.github.com>
2026-10-17 22:39:30 +02:00
Confituurke 8acb68415d feat(sensecap-indicator): SX1262 behind the TCA9535 via a RadioLib HAL
The SX1262's NSS, RESET, BUSY and DIO1 sit on the TCA9535 (P0.0..P0.3)
while SCK/MISO/MOSI are real GPIOs. IndicatorRadioHal derives from
ArduinoHal, keeps hardware FSPI at 4 MHz and maps the virtual pins
0x40..0x43 onto expander transfers; every other pin goes straight to
the Arduino pin and interrupt functions, as ArduinoHal does. The
meshcomod core is used as is: CustomSX1262 and its wrapper run
unchanged on top of the HAL.

DIO1 has no GPIO edge. The expander's open-drain /INT on GPIO42 has an
IRAM ISR that only notifies a dispatch task, because the read needs
I2C and the bus mutex. That task reads both input bytes under the bus
lock: the TCA9535 releases /INT only when the port that changed is
read, and several port-1 inputs float, so a port-0-only read could
leave GPIO42 low for good. Every port-0 byte feeds a small edge
detector (Dio1Edge) through the expander's port-0 observer, which
calls the callback RadioLib attached to DIO1 once per rise. That
callback is the core's setFlag, so TX-done and RX-done reach the core
exactly as they would from a DIO1 interrupt.

A BUSY poll is a port-0 read as well, and it clears /INT. Sampling DIO1
in those reads means a rise that lands while RadioLib waits on BUSY
fires the callback from that read instead of being lost; the dispatch
task's next read sees the level already high and does not fire again.
The task also re-reads every 50 ms, so a rise whose /INT was missed
still fires the callback, at most 50 ms late. MESH_RADIO_DIO1_POLLED is
not set: polling the IRQ register would add an SPI transfer, and with
it expander writes for NSS, on every pass of the receive path.

Floating port-1 inputs can keep /INT toggling, each toggle an I2C read
at high priority. The task counts ISR wakes and timeouts and logs them
for each of the first six 10 s windows, then only above 500 wakes/s
and at most once a minute, so the idle wake rate is visible at
bring-up without flooding the console later.

TCXO or crystal comes from the radio strap read at boot: the env's
SX126X_DIO3_TCXO_VOLTAGE calls indicatorTcxoVoltage(), which returns
2.4 V for the TCXO radio and 0 for the crystal one. radio_init() starts
the radio with the strap's setting and, if that fails, with the other
one, because std_init only falls back from TCXO to 0 V and a TCXO board
whose strap misread as crystal would never start otherwise. main.cpp's
one retry runs both again. The log says which voltage was requested and
which one the radio came up with.

The board reports GPIO42 (indicator::kExpanderIntGpio, shared with the
HAL) as its IRQ line and never light-sleeps: the inherited ESP32Board
versions would treat the virtual DIO1 pin as a GPIO, and /INT is active
low while the light-sleep wake source is high-level.

test_indicator_dio1 covers the virtual-pin routing and the
once-per-rise rule across dispatch and BUSY reads; run-host-tests.sh
gets its include path.

Signed-off-by: Confituurke <9595028+Confituurke@users.noreply.github.com>
2026-10-17 22:39:29 +02:00
Confituurke 3ccd27c80a feat(sensecap-indicator): FT6336 touch on the shared expander bus
The FT6336 sits at 0x48 on the same SDA39/SCL40 bus as the TCA9535,
and its reset is expander pin P0.7, so the driver takes
IndicatorIo::BusLock for every register write + read and pulses reset
through the expander. It implements the heltecV4CapTouch* interface
the touch UI already polls, with the same tap and swipe thresholds as
the Wio Tracker L2, so UITask needs no new touch path.

The controller reports both axes mirrored against the panel, so points
are mapped as 479 - raw and clamped; the raw point is kept for the
diagnostic overlay.

UITask calls begin on every loop pass until it succeeds. Pulsing reset
and waiting 300 ms on each call would starve loopTask when the
controller does not answer, so reset runs on the first probe only,
later probes run at most every 2 s, and the failure is logged once.
The chip and vendor ids are logged, not checked, so a compatible
controller with another id still works.

Signed-off-by: Confituurke <9595028+Confituurke@users.noreply.github.com>
2026-10-17 22:39:27 +02:00
Confituurke c2d50b5430 feat(sensecap-indicator): ST7701S RGB panel on LovyanGFX
IndicatorDisplay drives the 480x480 ST7701S through LovyanGFX's Bus_RGB
and Panel_ST7701 on the stock core; the CrowPanel 5.0 drives its RGB
panel through the same Bus_RGB. The panel's CS and RESET sit on the TCA9535, so LovyanGFX
gets pin_cs/pin_rst = -1 and begin() drives them through IndicatorIo:
reset pulse, CS low, lcd.init(), CS high. The bus lock is held from CS
low to CS high because the panel's 3-wire init shares GPIO41/48 with
the radio SPI, and no other task may move the radio's NSS meanwhile.

The second init list is Meshtastic device-ui's Indicator list (GPL-3.0,
credited in NOTICE): MADCTL 0x10 and SDIR 0x04 in BK0 flip both axes,
and the closing 0xFF,0xFF terminator keeps the colours from coming up
inverted.

The pixel clock is INDICATOR_PCLK_HZ, 12 MHz by default. The RGB bus
reads its frame buffer out of PSRAM continuously and this core has no
bounce buffers, so PSRAM bandwidth under Wi-Fi and flash traffic sets
the limit, not the panel; 12 MHz leaves margin for that, and the value
is a build flag.

The backlight is Light_PWM on GPIO45, LEDC channel 7; brightness 0
writes duty 0, so it goes dark. begin() returns false with the
backlight off when lcd.init() or any expander write in the sequence
fails, since the panel may then have missed its reset or init. UITask
keeps driving the backlight through the global display even when
begin() failed, so setBrightness() and turnOn() do nothing until the
panel has come up; otherwise the first brightness or wake request
would light a blank panel.

UITask: a 480 px draw band in internal DMA RAM (with LVGL told its full
size), because the RGB panel scans its frame buffer out of PSRAM all
the time and an internal band makes the flush a single PSRAM write. The
resolution is 480x480 with no UI rotation, and the board shares the
Wio L2's brightness, screen-sleep and no-keyboard-rotate branches.

Signed-off-by: Confituurke <9595028+Confituurke@users.noreply.github.com>
2026-10-17 22:39:25 +02:00
Confituurke d8200c35b3 feat(sensecap-indicator): board skeleton, TCA9535 expander and build target
Add the Seeed SenseCAP Indicator D1L as a new touch target. This step
builds and boots to a blank screen; the panel, touch and radio drivers
follow in their own commits so each can be reviewed against the
hardware it drives.

The SX1262's NSS, RESET, BUSY and DIO1, the LCD CS/reset and the touch
reset all sit on a TCA9535 at 0x20 on the SDA39/SCL40 bus, not on ESP32
GPIOs, so everything after this commit depends on the expander. The env
gives the radio lines virtual pin numbers 0x40..0x43 for a radio HAL to
map onto expander bits; until that HAL exists the radio is a plain
Module that links but cannot drive the chip.

The expander driver is header-only so a host test can cover it:
- its output and config shadows are seeded from the chip, because a
  warm reset or the previous firmware may have left pins driven and
  writing the power-on defaults back would glitch the radio, panel and
  RP2040 resets;
- a failed write rolls both shadows back to the last state written in
  full, and the next write brings the chip back in line with them;
- polarity inversion is cleared when a previous firmware left it set,
  since it would invert BUSY, DIO1 and the strap; it is written only
  when it is not already 0;
- every read of input port 0 is reported to an observer, so a DIO1 edge
  is not lost when another reader clears /INT.
A five-sample majority of the P1.3 strap selects the TCXO (2.4 V) or
crystal radio at run time, so one noisy read cannot pick the wrong
oscillator.

The expander, the touch driver and the display init serialise on one
recursive mutex over the shared Wire bus (IndicatorIo::BusLock). It is a function-local static, so the compiler
guards its creation when two tasks reach the first lock together.
IndicatorIo::begin() logs the registers it inherited and names the
step that failed, since a dead expander takes the panel and radio down
with it and is otherwise silent.

The board has 8 MB of flash. The partition table has one 4.5 MB
factory app slot, a 3.375 MB SPIFFS (as on the 16 MB boards) and a
64 KB coredump, with no map tile partition. The factory slot is larger
than the 0x3E0000 OTA slots of the 16 MB boards, so an image that fits
those fits here. CAP_OTA is off: with one app slot there is no in-place
update. CAP_BATTERY is 0: no battery is fitted.

Montserrat 18/20/24 for the UI-size presets are the generated faces; the
board joins their gate in ui_font_18/20/24.c, gen-touch-fonts.sh,
hwFitFont and luaHostFigureFont. LVGL is built at -O2 with the Arabic and newlib-memcpy
settings the other envs use.

run-host-tests.sh builds every test/test_*.cpp, so the new expander
test gets its include path there in the same commit.
build-upload-monitor.sh gets --sensecap-indicator.

Signed-off-by: Confituurke <9595028+Confituurke@users.noreply.github.com>
2026-10-17 22:39:16 +02:00
Kaj SchittecatandClaude Opus 5.5 5833e00d25 touch: beta_97 release notes
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-17 21:18:07 +02:00
Kaj SchittecatandClaude Opus 5.5 18279edac9 release: the CrowPanel Advanced 10.1 (P4) ships in betas and the web flasher
- p4-release.sh builds and verifies the three revisions (V1.2, V1.1, V1.0)
  from crowpanel_p4_101/ in the same loop as the T-Display P4 images, with
  the same OTA-name and tag checks.
- Self-update is on (CAP_OTA 1): each revision updates from its own
  wadamesh-crowpanel-p4-101-v1x.bin, so a V1.0 never takes a V1.2 image.
- gen-flasher-meta writes a manifest per revision; wadamesh.com gets a
  CrowPanel Advanced 10.1 card with a V1.2 / V1.1 / V1.0 picker, and the
  standalone flasher one card per revision. Both point at the beta feed,
  so nothing shows until the next beta publishes the images.
- README, DEVICES.md and the site's board count (15).

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-17 21:02:37 +02:00
Kaj Schittecat cff8bd4eea Merge crowpanel-p4-101: experimental Elecrow CrowPanel Advanced 10.1" ESP32-P4 port 2026-10-17 20:56:50 +02:00
Kaj SchittecatandClaude Opus 5.5 328434cbda touch: repeater status and telemetry requests go direct first (#683)
The Request button (and Ping) always reset the path, flooded a blank guest
LOGIN, and sent the STATUS/TELEMETRY REQ from inside the LOGIN-OK callback,
while the repeater's flooded login reply was still being repeated around us.
Bench against a repeater next to a T-Deck, 8 tries each: login-first got the
login answer 7 times but telemetry back only 2 times; a direct request like
the MeshCore app's got 8 of 8, about 1 s each (#683 reports under 5% from the
device, over 90% from the app on the same T-Deck).

Now the REQ goes out directly first on the stored path (flood when there is
none). Only when no reply comes within 6 s (12 s when it flooded) does the UI
fall back to the guest login, and after LOGIN-OK the REQ waits 2 s instead of
firing from the callback. Same bench: 7 of 8 answered (one through the
fallback, 17 s), and the login route alone went from 2 of 8 to 6 of 8. A reply
cancels the pending fallback.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-17 20:54:39 +02:00
Kaj SchittecatandClaude Opus 5.5 e37258018a crowpanel_p4_101: experimental Elecrow CrowPanel Advanced 10.1" ESP32-P4 port
Standalone ESP-IDF target (crowpanel_p4_101/) modelled on tdisplay_p4/, sharing its
ESP-IDF, components and esp-hosted 2.12.3 backend. Untested on hardware.

- variants/crowpanel_p4_101: EK79007 MIPI-DSI 1024x600 display (Elecrow timings,
  LEDC backlight on GPIO31), GT911 touch on I2C0 45/46 (RST40/INT42), SX1262 on the
  J9/J11 header with a real DIO1 IRQ, LDO3/LDO4 bring-up, C6_EN reset callback on
  GPIO32, full-system-reset restart shim.
- Board revision is a build option: WADA_CP_REV=1.0|1.1|1.2 (default 1.2). V1.2 moves
  LoRa DIO1/NRST from GPIO53/54 to 27/28; V1.0 has the C6 SDIO data lines reversed
  (run 1-bit like Elecrow's V1.0 lesson). hostedSetPins() overrides Arduino's
  generic esp32p4 SDIO pin defaults, which only match V1.0.
- LVGL at native 1024x600 with the large-screen layouts; fixed landscape.
- Shared src/: one CAP_* block in device_caps.h plus HAS_CROWPANEL_P4_101 at the P4
  platform sites (storage law, SD_MMC, hosted BLE, no RTC_CNTL, no MQTT, fonts) and
  the CrowPanel no-unlock-control sites. navOpenChatPanel/navGoToMainTab get
  fallbacks for boards without CAP_KEYPAD_NAV.
- build.sh merge writes a 0x0 merged image per revision.

T-Display P4 still builds from the same tree.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-17 20:22:13 +02:00
Kaj SchittecatandClaude Opus 5.5 ed896b3404 touch: history never drops records at the segment cap; host test for the scheduler
fcb392a merged two neighbouring segments at the 24-file cap and, when no pair
fitted in one file, retired the oldest segment. A host simulation showed that
fallback does fire for heavy users (many quiet chats next to a few busy ones):
up to 626 old messages dropped over 60 reboots on 3 of 8 seeds. Now 24 is a
soft cap: at 24 pending compactions run first, then the best merge, and only
when no pair fits may a new segment open, up to a hard cap of 48. Below 41
files some adjacent pair of the 5000 ring records always fits, so the hard
cap never stops a save and nothing is dropped; files only pass 24 in that
heavy case, so older builds still read every file for almost everyone.

test/history_segments/run.sh lifts the scheduler out of UITask.cpp verbatim
and runs it against a simulated card: mixed, many-quiet, one-busy and
reboot-heavy workloads plus power cuts between a merged write and the
absorbed file's removal. 60k messages per run, every live record must
survive every reboot with no duplicates. beta_95's code loses ~48k of 60k in
the same run; this passes every mode (max 29 files).

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-17 17:59:29 +02:00
Kaj SchittecatandClaude Opus 5.5 0351cf4410 apps: Store installs no longer leave a cut-off app behind
luaStoreDownloadWorker wrote each downloaded file to the card with one
f.write() straight from its PSRAM buffer, and an SD write from PSRAM can come
back short. Blackjack (48 KB, the first downloaded app past ~32 KB) landed cut
off near 32 KB: the install reported a network error, and the half .lua stayed
behind as an installed app that failed with "syntax error near <eof>"
(Discord). Files now go through the internal bounce-buffer writer into a .tmp,
are size-checked on the card and only then replace the real name, so a failed
install leaves nothing and a failed update keeps the old version.

wada.fs.write and the Home widget snapshot wrote from PSRAM the same way (Lua
strings live in the app's PSRAM heap); both go through a 2 KB internal buffer.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-17 17:32:41 +02:00
Kaj SchittecatandClaude Opus 5.5 94baf4deac touch: beta_96 - release notes, language store v27, Blackjack on the App Store page
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-17 15:22:25 +02:00
Kaj SchittecatandClaude Opus 5.5 d900bb83aa fonts: bidi and zero-width marks stay invisible with the '*' fallback
#679 ends every font chain in a '*' placeholder. LVGL itself only gives
<0x20, F8FF and 200C zero width, so LRM/RLM (common in Arabic and Hebrew
messages), ZWSP, ZWJ, word joiner, the embeddings, isolates and the BOM would
each have drawn a '*'. They now resolve to an empty glyph with no advance.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-17 15:22:25 +02:00
Kaj Schittecat e43c06b09a Merge PR #681: Blackjack 1.0 in the Store 2026-10-17 15:17:16 +02:00
Kaj Schittecat 39cbbea6b7 Merge PR #679: one '*' placeholder for missing glyphs, hide skin tones (#673) 2026-10-17 15:17:16 +02:00
Kaj Schittecat 6a17f2a836 Merge PR #676: lock screen PIN, the keyboard's Sym/Alt layer stays live (#675) 2026-10-17 15:17:16 +02:00
Kaj Schittecat d89185367d Merge PR #630: Touch UI design calls (P4 one-row bar, chat clock, Device page, Bluetooth at setup)
# Conflicts:
#	src/ui-touch/UITask.cpp
2026-10-17 15:17:16 +02:00
Kaj Schittecat 1e72667b97 Merge PR #680: Web page Up/Down scroll the text on keypad boards (#677) 2026-10-17 15:16:56 +02:00
Kaj SchittecatandClaude Opus 5.5 aa5de751a5 touch: chats list ticks, M9 header layout code, contact popup titles, lock wallpaper veil
- #670: the chats list kept one tick after a DM was delivered. Its change
  signature never included the delivery state, so the rebuild was skipped;
  a delivery now bumps a generation it mixes in (and marks threads dirty).
- #672: on the M9 the keyboard layout code (EN, BG) sat on top of the GPS
  glyph in the chat header. It now has its own slot left of the clock, the
  GPS glyph moves left of it and the title leaves room for both.
- #668: with Large Text a long node name wrapped in the contact popup and its
  second line ran under the buttons. The title gets a fixed one- or two-line
  box (two when the name needs it) and the card uses most of a 320 px screen
  (up to 300 wide). The scroll check also counts the nickname line now.
- #652: a custom lock wallpaper was veiled with the theme background at
  150/255, milky on Day and cloudy on Night. It gets a lighter black veil and
  light text whatever the theme, like a phone lock screen.
- [HIST] boot line: segments and records loaded, for field reports.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-17 12:15:24 +02:00
Kaj SchittecatandClaude Opus 5.5 9eda9b0f26 apps: Store lists up to 40 apps, canvases fit the big screens, button:bg
- The catalog parse stopped at 16 rows and the catalog has 16, so a 17th app
  (Blackjack, #681) was silently never listed; installed apps had the same
  cap. Both are 40 now, and the catalog buffer grows from 8 KB to 24 KB so
  the JSON is not cut off. PSRAM only.
- wada.ui.canvas raised a Lua error above 480 px, which killed apps that size
  a canvas from on_open(w, h) on the T-Display P4 (body ~575 tall), Tanmatsu
  and CrowPanel 5 (800 wide) (Discord). Sides are now clamped to the screen's
  long side instead.
- button:bg(fill [, border]) colours a button (or boxes a label), so apps no
  longer fake coloured buttons from panels that keys cannot focus (Discord).

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-17 12:15:18 +02:00
Kaj SchittecatandClaude Opus 5.5 5198813f99 usb files: Lua apps can be dropped into the apps folder
/meshcomod/apps on the card and /apps internally now take top-level .lua and
.json files, so an app can be side-loaded without pulling the card (Discord).
Everything else there stays read-only: the folder itself, subfolders (<id>.d
data), app save files (.sav, .wgt), hidden names and 8.3 aliases. A change
from the page invalidates the cached app listing, so the drawer and the Store
pick the new app up the next time they open. Host tests cover the policy.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-17 11:54:47 +02:00
Kaj SchittecatandClaude Opus 5.5 fcb392afd0 touch: chat history kept saving at the 24-segment cap; open chats under a locked screen stay unread
History: at the segment table cap a new segment waits for the oldest to age
out of the RAM ring, but after a reboot the ring only holds what was loaded
(per-chat caps thin segments without emptying them), so nothing was ever
evicted and every new message stayed RAM-only until the next reboot lost it
(Discord, "messages are going away after Oct 13th"). segBuildJob now merges
the adjacent pair with the fewest live records into the older file (the
absorbed file is unlinked after the merged one lands; the loader's
monotonic-seq filter covers a crash in between), and retires the oldest
segment when no pair fits. A flush with records still pending no longer
reports "everything durable": it logs [HIST] flush stuck and retries.

Read state: refreshChatDetail marked the open chat read on every refresh, so
messages arriving under a dark or locked screen were cleared at once and the
lock screen's unread cards stayed empty (Discord). Only mark read while the
chat is really in view; wake, unlock and the glance closing re-run the check.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-17 11:54:42 +02:00
Kaj SchittecatandClaude Opus 5.5 8daf59bdd7 doc: DOC_APPS_AUDIT capture tour for every Store app
Launches each catalog app (kAuditStore, generated by gen-radio-audit-apps.py
into the gitignored doc_radio_apps.h) and captures store_<id> for the
website's App Store page. Music gets two bench tracks and a play tap first.
Capture builds only.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-17 11:54:31 +02:00
Kaj SchittecatandClaude Opus 5.5 2986354f3c site: Join the community (Discord) button next to Install
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-17 10:38:17 +02:00
Kaj SchittecatandClaude Opus 5.5 8109bbf43a site: App Store page listing every Store app, with the SDK and how to submit
apps.html is generated from deploy/apps/apps.json (the catalog the devices
read) plus the site-only write-ups in deploy/site/apps-info.json, by
scripts/build/gen-apps-page.py, which deploy-site.sh now runs on every
deploy. Linked from the home page (Apps button + resource card), the SDK
guide and the sitemap.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-17 09:17:59 +02:00
halflive-743 bc32153c69 apps: add Blackjack 1.0 to the Store catalog 2026-10-16 22:06:13 -06:00
Michael A. CojocariandCopilot 7f29bccf76 docs: M9 Web page Up/Down reading (#677)
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
2026-10-16 21:02:59 -04:00
Michael A. CojocariandCopilot 3470c308d9 Web page: Up/Down scroll the text on keypad boards (#677)
Links were the page body's only focus targets, so spatial nav jumped from
a link to the next one however far down, or straight to the toolbar, and
the text in between could not be read on the M9 (or with a d-pad).

Up/Down on the Web page now move to the next link already on screen, else
scroll the body a page (handing focus to a link coming on screen when the
focused one scrolls off); only at the end of the page does focus leave for
the address row or toolbar. navMoveDir reports when the page took the press
so the M9 and Attaky "focus did not move" fallbacks don't scroll twice.

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
2026-10-16 20:23:34 -04:00
Michael A. CojocariandCopilot 77f6a04543 fix(ui): one '*' placeholder for missing glyphs, hide skin tones (#673)
Missing characters drew as '*' in labels that went through
copyUtf8ReplacingMissingGlyphs() and as LVGL's empty box everywhere else.
Every text chain (g_font_12/14/16 incl. the Tanmatsu accent slots, the
Pager map font, the glance body) now ends in a font that draws the base
Montserrat '*' for any codepoint nothing else has. It is flagged
is_placeholder, which LVGL still draws, so Constellation's name filter
keeps dropping undrawable characters.

Skin-tone modifiers U+1F3FB-1F3FF have no baked image; map them to the
invisible zero glyph (as U+FE0F is), so a toned emoji shows its base.

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
2026-10-16 19:52:47 -04:00
Michael A. CojocariandClaude Opus 5.5 9aa590f0c1 fix(touch): the keyboard's Sym/Alt layer stays live while a PIN is typed on the lock screen (#675)
Locked, the T-Deck loop switched the keyboard modifiers off, and the PIN
screen opens over the lock screen, still locked, so a PIN was typed with
Sym off. Sym+mic ('0') sent nothing, and Sym+W..O sent the letter under
the digit, which a PIN accepts, so the PIN silently came out wrong.
Setting the PIN in Settings worked because the device isn't locked there.

Now the modifiers stay on while the device is locked, lit and has a PIN
(the first key typed on the lock screen opens the PIN screen and counts).
The Pager-style keyboards (Pager, T-Deck Pro, Max) had the same rule for
a tapped Alt, cleared every tick while locked; the same exception
applies there.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Us6CjkLFga9GkFJmmr3rrq
2026-10-15 14:55:28 -04:00
Michael A. CojocariandCopilot ea4c791270 i18n: regenerate the V4 table for the Device page strings
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
2026-10-15 14:15:52 -04:00
Michael A. CojocariandCopilot 896c8e7030 Settings: the group is 'Display & lock', so 'Hardware' only names the Device page's card
docs.html follows: the group's name, Theme under it, and Run setup again
and Reboot on the Device page rather than General.

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
2026-10-15 14:15:25 -04:00
Michael A. CojocariandCopilot b9ff27de8c site: Settings > About is now Settings > Device
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
2026-10-15 14:15:25 -04:00
Michael A. CojocariandCopilot e83c483a0f i18n: rows for the Settings > Device and keyboard protocol strings
Hardware, the setup wizard Bluetooth hint, Radio:/Keyboard: and the four
keyboard protocol states in all 14 languages, taken from #631 so they
ship with the code that uses them.

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
2026-10-15 14:15:25 -04:00
Michael A. CojocariandCopilot a913b1331e Settings: one 'Device' page; keyboard protocol switch on Keyboard page
The settings group that held Display/Theme/Lock is now 'Hardware', so
'Device' only names the page that was About. Run setup again and Reboot
move from General to an untitled card on that page. The older keyboard
protocol switch is also on the Keyboard page instead of a note pointing
elsewhere.

Refs #416

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
2026-10-15 14:15:14 -04:00
Michael A. CojocariandCopilot ec5e08038b P4 Bluetooth: the status-bar glyph shows when Bluetooth runs; setup applies only a flipped switch
- The round one-row bar hid the Bluetooth glyph outright, but the esp-hosted
  P4 build does run Bluetooth on the C6. The glyph now follows
  hasBleCapability() && isBleEnabled() as on every other board (so never on
  the ESP-AT build), with a slot in statusBarPackRound between Wi-Fi and GPS.
- The one-row repack signature includes the Bluetooth and GPS glyphs, so
  either appearing re-packs the row.
- Setup's Bluetooth switch shows Bluetooth as it is when step 3 opens, and
  Finish applies it only if the user flipped it. A switch left alone no
  longer tries to start a Bluetooth that could not start at boot, which
  showed the P4 its 'not enough memory' alert on first boot (#612).
- tdisplay_p4/main/main.cpp: drop the stale 'keep BLE gated OFF' comment.

Refs #416

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
2026-10-15 14:15:14 -04:00
Michael A. CojocariandClaude Opus 5.5 6f2783c8c9 P4 landscape Settings: two real columns, Device row full width
The wide landing wrapped groups two to a row, so each row was as tall as
its taller group: Device (one row) sat beside Mesh with a gap under it,
Connections beside the Device group, and System alone at the bottom.

In two-column mode the untitled group holding the Device row now spans
both columns at the top, and the remaining groups stack in two column
containers, split in order at the point that makes the taller column
shortest. Value-slot width is tracked per row since the spanning row is
wider.

Unchanged.
(from 7d6875a)

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01XERzMfBu6rw4behJzs9Hmw
2026-10-15 14:15:14 -04:00
Michael A. CojocariandCopilot 43c80a1b0f fix(touch): chat header keeps the clock and battery at the bar's normal height
The taller chat bar centred them on its full height, so opening a chat
dropped them below where they sit on every other screen. The round P4 packs
them on the one-row bar's line; the double-bar boards lift them by half the
extra height (the Pager's bar does not grow, so it is unchanged).

Unchanged.
(from 5f9f5ee)

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
2026-10-15 14:15:14 -04:00
Michael A. CojocariandCopilot d4a8a09310 P4: one-row status bar
The round-cornered T-Display P4 drops its two-row bar for one row: the
title on the left, then the clock beside the icons on the right (battery,
signal, Wi-Fi, GPS, the DND moon), every glyph's ink on one bottom line.
No Bluetooth glyph (wadamesh does not drive the P4's Bluetooth) and no
battery %. The stacked chat header only shows while a chat is open.

Split out of 4844a9b (Touch UI follow-ups 4) and rebased onto beta_92,
whose GPS glyph joins the packed row.

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
2026-10-15 14:15:14 -04:00
Michael A. CojocariandClaude Opus 5.5 3e8bf7c51d fix(touch): first-boot setup keeps Bluetooth on and shows a switch for it (#416)
Since beb85bd a fresh install forced Bluetooth off and persisted it when
the setup wizard opened, and nothing on screen said so: the device was
invisible to the MeshCore app until the user found the control-center
toggle. A format + clean install hits exactly that path, which fits the
T-Deck Plus report (stock MeshCore, always advertising, paired fine).

Setup no longer forces Bluetooth off; it stays as it booted (on by
default, as with stock MeshCore). Step 3 "Wi-Fi & Bluetooth" gets a
Bluetooth switch, on for a first boot and showing the live state on
"Run setup again". Finish applies only a change, via the same
enableBle()/disableBle() path as the control center, and shows the usual
failure text if the heap guard refuses a cold start. Skip leaves
Bluetooth on.

The step's paragraph is shorter, so the switch row still fits above the
buttons on 240 px-tall panels. The new string is translated in all 14
languages; i18n_builtin.h regenerated.

(cherry picked from commit 700355a23c465faa2df3b2ec5d46f06dbb8d7873)

Translations are in the i18n PR.
(from 3e2b8b5)

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_016zE15egJdCZ9nRBZmg1YUq
2026-10-15 14:15:14 -04:00
Michael A. CojocariandClaude Opus 5.5 b4c6c20900 feat(tanmatsu): report the LoRa chip, so Device names a radio on every build (#596)
Every PlatformIO touch build and both T-Display P4 radio builds define
RADIO_CLASS, which the Device page already reads. The Tanmatsu has none:
its SX1262/SX1268 sits behind the ESP32-C6 and is reached through
TanmatsuLoraRadio. That bridge now asks the coprocessor once at init
(lora_get_status, before RX polling starts) and exposes chipName(), and
deviceRadioName() uses it, falling back to "SX126x" if the C6 did not
answer.

(cherry picked from commit 94056e7eb7baf136d0f17ffa04e7e48cbe9ac712)

Unchanged.
(from 53c1cd9)

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_016zE15egJdCZ9nRBZmg1YUq
2026-10-15 14:15:14 -04:00
Michael A. CojocariandClaude Opus 5.5 07c92b2af8 feat(touch): Device shows the radio; info pages scroll by keypad, close with X (#596)
- The Device page lists the radio this build drives ("Radio: SX1262"),
  from RADIO_CLASS with the "Custom" prefix dropped. The Device card's
  second line shows it too on boards without the T-Deck keyboard, which
  is what tells the T-LoRa Pager's SX1262 and LR1121 builds apart.
- System Information and Memory detail close with a compact X instead
  of a "Close" button.
- Their text now scrolls from the keyboard: the X is the only focus
  stop, so Up/Down and the Pager's wheel found nothing to move to and
  the text was unreachable off-touch. A shared navInfoModalScroll()
  scrolls the body instead, from navMoveDir (trackball / d-pad / arrow
  keys) and the Pager encoder; the M9's own special case now uses it.
  Focus stays on the X at either edge.

"Radio:" translated in all 14 languages; i18n_builtin.h regenerated.

(cherry picked from commit 4b99579b4e58aa78d165204502c14263559c563e)

Translations are in the i18n PR.
(from e56c6ea)

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_016zE15egJdCZ9nRBZmg1YUq
2026-10-15 14:15:14 -04:00
Michael A. CojocariandClaude Opus 5.5 671213771b feat(touch): Device section at the top of Settings, About merged in (#596)
Settings opens with a Device card that names the hardware on a second
line ("LilyGo T-Deck · newer keyboard"), so a wrongly detected or set
variant is visible before anyone opens a page. It replaces About, which
moves from the bottom of the list; its content is unchanged and now sits
under a new hardware block:

- Model, and on the T-Deck the keyboard the protocol probe settled on,
  or "set manually" when the override is on (new
  tdeckKeyboardDetectedMode() getter).
- The T-Deck "Older keyboard protocol" switch, moved here from the
  Keyboard page, which keeps a one-line pointer to it. Flipping it
  updates the card and the page in place.

The update-available dot moves to the Device card, and the "Diagnostics
are on the About page" hint now points at Device.

New strings are translated in all 14 languages; the moved switch's label
and note were English-only in 12 and are now translated too. The old
About rows stay for firmware that still asks for them. i18n_builtin.h
regenerated. The site docs now say Settings > Device.

Not included: a T-Deck Pro touchscreen override (V1.0 and V1.1 are
separate builds, so it cannot change at runtime; the card shows which
build is installed) and an inaccurate-RTC flag (new clock behaviour,
better as its own ticket).

Fixes #596

(cherry picked from commit 726905ea607dea496f5e74e90e7b13068552007e)

Rebased onto beta_92's card-based Settings: the hardware readout and the switch are a Hardware card on the Device page. Its translations are in the i18n PR.
(from ddcff4e)

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_016zE15egJdCZ9nRBZmg1YUq
2026-10-15 14:15:14 -04:00
184 changed files with 93617 additions and 14621 deletions

No files matched your search

+10 -1
View File
@@ -16,10 +16,12 @@ USB) and the [GitHub releases](https://github.com/ALLFATHER-BV/wadamesh/releases
| Elecrow ThinkNode M9 | ESP32-S3, LR1110 | 2.4" 240x320 (no touch), I2C QWERTY + d-pad | Web flasher | Beta (new in beta_38) | Hardware-complete community port by ded (#138): GPS, microSD, buzzer, lock screen, d-pad navigation |
| Elecrow CrowPanel Advance 3.5 | ESP32-S3, external SX1262 | 3.5" ILI9488 480x320 touch (GT911) | Web flasher (beta) | Beta, hardware validation pending | Requires an SX1262 module in the LoRa expansion slot; not for other CrowPanel models |
| Elecrow CrowPanel Advance 5.0 | ESP32-S3, external SX1262 | 5" ST7262 RGB 800x480 touch (GT911) | Web flasher (beta) | Beta, hardware-tested (display, touch, radio) | V1.1+ boards; SX1262 in the wireless slot with the function DIP switch on the wireless module; no SD, GPS or battery gauge |
| Seeed SenseCAP Indicator D1L | ESP32-S3, SX1262 | 4" 480x480 touch (FT6336) | Development build only | Experimental | Hardware-tested (display, touch, radio); USB-powered, no battery; the RP2040's buzzer and microSD are not used |
| RAK WisMesh Tap V2 (RAK3312) | ESP32-S3, SX1262 | Touch display (LovyanGFX, 30+ fps) | Web flasher | Beta (new in beta_38) | Early community port by Ethac.chen (#136); core mesh, chat and map working |
| LilyGo T-Lora Pager | ESP32-S3, LR1121 or SX1262 | 2.33" IPS LCD, 480x222 (no touch), QWERTY + rotary encoder | Web flasher (pick the build matching your radio) | Beta (new in beta_45) | Fully supported; keyboard-first navigation, microSD, map tile packs |
| Heltec V4-R8 + Expansion Kit V2 | ESP32-S3 (8 MB octal PSRAM), SX1262 | 2.4" touch (CHSC6x) | Web flasher | Beta (new in beta_45) | As the V4 plus microSD and the Expansion Kit sensors; buzzer supported |
| LilyGo T-Display P4 | ESP32-P4 + ESP32-C6, SX1262 or LR2021 | AMOLED or TFT-LCD, touch | Web flasher | Beta (new in beta_45) | Four panel/radio builds; AMOLED + SX1262 hardware-tested, the other combinations need validation |
| Elecrow CrowPanel Advanced 10.1 | ESP32-P4 + ESP32-C6, external SX1262 | 10.1" EK79007 MIPI-DSI 1024x600 touch (GT911) | Web flasher (beta) | Experimental (new in beta_97), not yet tested on hardware | One image per board revision (V1.0, V1.1, V1.2); SX1262 in the wireless slot; no battery reading, sound or GPS |
| Attaky Mesh Series | ESP32-S3, SX1262 | Touch display + front D-pad | Web flasher | Beta (new in beta_47) | Community port by attakygit (#158/#169); detachable keyboard supported; the front D-pad + SELECT navigate the UI |
## Feature notes per board
@@ -164,6 +166,14 @@ USB) and the [GitHub releases](https://github.com/ALLFATHER-BV/wadamesh/releases
full install and an on-device update, whose long flash erases the panel
recovers from. Select it in
the upload helper with `scripts/build-upload-monitor.sh --crowpanel-50`.
- **SenseCAP Indicator D1L**: `sensecap_indicator_companion_radio_touch` drives
the 480x480 ST7701S RGB panel, the FT6336 touch controller and the SX1262,
whose control lines sit on a TCA9535 I/O expander. It is USB-powered with no
battery, so the battery readouts and Power off are hidden. The RP2040
peripherals (buzzer, microSD, Grove, D1Pro sensors) are not used, and without
storage there are no map tiles. The D1Pro shares the ESP32 side and is expected
to run the same image, but is untested. See
[variants/sensecap_indicator/PORT.md](variants/sensecap_indicator/PORT.md).
## Requested boards
@@ -172,7 +182,6 @@ Open hardware requests, roughly in demand order. Ports are welcome, see
PRs.
- LilyGo T-Deck Pro hardware validation / T-Deck Max variants: [#62](https://github.com/ALLFATHER-BV/wadamesh/issues/62)
- SenseCAP Indicator D1L: [#14](https://github.com/ALLFATHER-BV/wadamesh/issues/14)
## Channels
+4 -3
View File
@@ -68,9 +68,10 @@ catalog is the third.
min_api, boards allow-list, icon glyph, description) on the active storage
root (SD where adopted, internal FS otherwise) — same resolution as chat
history.
- Catalog: `https://firmware.wadamesh.com/apps/apps.json` + one `.lua` +
`.json` per app in `apps/<id>/<version>/`. Served like firmware: VPS rsync,
immutable per-version paths, mutable index. Device store page = fetch
- Catalog: `http://meshinfo.ru/firmware/apps/apps.json` + one `.lua` +
`.json` per app in `apps/<id>/<version>/`. Served by nginx from
`/var/www/meshinfo/firmware/apps` over plain HTTP for the device (and HTTPS
for browsers), immutable per-version paths, mutable index. Device store page = fetch
index → list → install (download 2 files) → appears in the drawer.
Uninstall = delete 2 files. Update = version compare against the index.
- The Store page also lists the **built-in removable apps** (Snake, Airtime,
+10 -1
View File
@@ -88,7 +88,16 @@ driver, variants/tdisplay_p4/P4Audio.cpp)
Espressif's public es8311.c/es8311_reg.h; P4Audio.cpp additionally
re-bases the esp-bsp init flow onto Arduino Wire.
LovyanGFX (RAK WisMesh Tap V2 display backend)
ST7701S panel init list (SenseCAP Indicator display driver,
variants/sensecap_indicator/IndicatorDisplay.cpp)
Copyright (c) Meshtastic
GPL-3.0 License — https://github.com/meshtastic/device-ui
The panel's second init command list (MADCTL vertical flip, SDIR
horizontal flip) is taken from Meshtastic device-ui's
include/graphics/LGFX/LGFX_INDICATOR.h (Panel_Indicator::getInitCommands).
The rest of the driver is original code on LovyanGFX's Panel_ST7701.
LovyanGFX (display backend: RAK WisMesh Tap V2, SenseCAP Indicator and others)
Copyright (c) lovyan03 — FreeBSD License — https://github.com/lovyan03/LovyanGFX
Camillia-MT (CrowPanel Advance 3.5 software-SPI microSD backend)
+41
View File
@@ -1,3 +1,42 @@
# WADAMESH — форк MeshInfo
Этот репозиторий — форк [ALLFATHER-BV/wadamesh](https://github.com/ALLFATHER-BV/wadamesh),
адаптированный под российскую MeshCore-сеть и хостинг MeshInfo. База — **beta_98**
(Repeater Admin, браузерный клиент, Glass tiles, SenseCAP/CrowPanel/P4) плюс
локальные доработки. Ниже перечислены ключевые отличия от upstream; оригинальный
README начинается после горизонтальной линии.
## Ключевые отличия от оригинала
- **Store и языки — на `meshinfo.ru`.** Прошивка скачивает `apps.json`, `langs.json`,
`.lua` и `.lang` с `http://meshinfo.ru/firmware/apps/...`, а не с
`firmware.wadamesh.com`. Причина переноса: с оригинального хоста файлы
скачивались нестабильно, а Cloudflare, по наблюдениям, блокировал нашу локацию.
Nginx отдаёт `/firmware/` по HTTP без редиректа на HTTPS (устройство не умеет
TLS), остальной сайт `meshinfo.ru` остаётся на HTTPS. Скрипт публикации —
`scripts/deploy-apps.sh` — по умолчанию пишет в
`/var/www/meshinfo/firmware/apps`.
- **Русская локализация.** `deploy/apps/lang/ru.lang` версии 33: переведены
missing/blank-строки, английские заглушки и helper-подписи настроек
(`setCard`, `setSwitchRow`, `setField` и т.п.). Аудит
`scripts/build/audit-lang.py` даёт 0 непереведённых строк и 0 несовпадений
формата.
- **Часовые пояса России.** 11 российских зон (UTC+2…UTC+12) без DST, UTC и
«Свой сдвиг UTC»; Москва — по умолчанию. US/Канада/Бразилия/Индия/Китай/Япония/
Австралия убраны.
- **Радио-пресеты России.** 50 городских пресетов с [meshcoretel.ru](https://meshcoretel.ru)
(частота, полоса, SF, CR) вместо глобального списка Australia/US/EU. Остался
только `Custom (manual)`.
- **Устойчивость загрузок.** Range-докачка оборванных `.lua`/`.lang` с места
обрыва; отключена фоновая автозагрузка языка при старте; стек задачи
`tile_fetch` увеличен до 10 КБ; таблицы разделов переведены в ASCII, чтобы
`checkprogsize` не падал на русской Windows.
- **Сборка.** T-Deck Plus: `pio run -e LilyGo_TDeck_companion_radio_touch`;
merged-образ для прошивки по `0x0` собирается в `out/` командой
`pio run -e LilyGo_TDeck_companion_radio_touch -t mergebin`.
---
<p align="center">
<picture>
<source media="(prefers-color-scheme: dark)" srcset="assets/wadamesh-readme-dark.svg">
@@ -28,6 +67,8 @@ per-board status.
- LilyGo T-Lora Pager: envs `tlora_pager_lr1121_companion_radio_touch` / `tlora_pager_sx1262_companion_radio_touch` (beta); [keyboard shortcuts](TLORA_PAGER_SHORTCUTS.md)
- Heltec V4-R8 + Expansion Kit V2: env `heltec_v4_r8_tft_companion_radio_usb_tcp_touch` (beta)
- LilyGo T-Display P4: built from `tdisplay_p4/` (ESP-IDF); AMOLED + SX1262 by default, with `WADA_P4_LCD=1` for TFT-LCD and `WADA_P4_LR2021=1` for LR2021 (beta)
- Seeed SenseCAP Indicator D1L: env `sensecap_indicator_companion_radio_touch` (experimental, community port, PR #682)
- Elecrow CrowPanel Advanced 10.1 (ESP32-P4): built from `crowpanel_p4_101/` (ESP-IDF), one image per board revision with `WADA_CP_REV=1.0|1.1|1.2` (experimental, not yet tested on hardware; requires an SX1262 in the wireless slot)
- Attaky Mesh Series: env `attaky_mesh_series_companion_radio_touch` (beta)
- Elecrow CrowPanel Advance 3.5: env `crowpanel_35_companion_radio_touch` (beta, hardware validation pending; requires an SX1262 in the expansion slot)
- Elecrow CrowPanel Advance 5.0: env `crowpanel_50_companion_radio_touch` (beta, hardware validation pending; requires an SX1262 in the wireless slot and the DIP switch set to it)
+9
View File
@@ -84,6 +84,15 @@ select OSM, and enable **Tiles from SD card**. See the
[offline map tile guide](README.md#offline-map-tiles) for the QGIS export steps
and map-provider policy requirements.
## Web pages
In the Web browser, **Up** and **Down** read the page: each press moves the
highlight to the next link already on screen, or, when there is none, scrolls
the text by about two-thirds of a screen. If the highlighted link scrolls out
of view, the highlight moves to a link coming into view. Only at the top or
bottom of the page does focus leave for the address bar or the toolbar.
**OK** opens the highlighted link.
## Typing & editing
Inside a text field the left/right arrows move the caret, and when the caret
+38
View File
@@ -0,0 +1,38 @@
{
"build": {
"arduino": {
"ldscript": "esp32s3_out.ld",
"partitions": "default_8MB.csv",
"memory_type": "qio_opi"
},
"core": "esp32",
"extra_flags": [
"-DBOARD_HAS_PSRAM",
"-DARDUINO_RUNNING_CORE=1",
"-DARDUINO_EVENT_RUNNING_CORE=1"
],
"f_cpu": "240000000L",
"f_flash": "80000000L",
"flash_mode": "qio",
"psram_type": "opi",
"mcu": "esp32s3",
"variant": "esp32s3"
},
"connectivity": ["wifi", "bluetooth", "lora"],
"debug": {
"default_tool": "esp-builtin",
"onboard_tools": ["esp-builtin"],
"openocd_target": "esp32s3.cfg"
},
"frameworks": ["arduino", "espidf"],
"name": "Seeed SenseCAP Indicator D1L (8 MB FLASH, 8 MB PSRAM)",
"upload": {
"flash_size": "8MB",
"maximum_ram_size": 8388608,
"maximum_size": 8388608,
"require_upload_port": true,
"speed": 921600
},
"url": "",
"vendor": "Seeed Studio"
}
+8
View File
@@ -0,0 +1,8 @@
# build output + component manager cache (project-local ESP-IDF comes in via the ../tanmatsu symlinks)
build/
managed_components/
sdkconfig
sdkconfig.old
dependencies.lock
# flashable images produced by build.sh merge
*.bin
+3
View File
@@ -0,0 +1,3 @@
cmake_minimum_required(VERSION 3.10)
include($ENV{IDF_PATH}/tools/cmake/project.cmake)
project(application)
+245
View File
@@ -0,0 +1,245 @@
#!/usr/bin/env bash
# wadamesh / Elecrow CrowPanel Advanced 10.1" ESP32-P4 HMI build wrapper. EXPERIMENTAL.
# Standalone ESP-IDF app modelled on tdisplay_p4/build.sh: reuses the Tanmatsu's project-local
# ESP-IDF 5.5.1 (esp32p4) via the ../tanmatsu symlinks and the shared P4 components.
# ./build.sh build # board revision V1.2 (default, newest)
# WADA_CP_REV=1.1 ./build.sh build # V1.1 (SX1262 DIO1/RST on GPIO53/54)
# WADA_CP_REV=1.0 ./build.sh build # V1.0 (same LoRa pins as V1.1, reversed 1-bit C6 SDIO)
# ./build.sh merge # build + one flashable image at 0x0 (build/<target>/*-merged.bin)
# ./build.sh flash -p /dev/cu.usbserial-XXXX
# ./build.sh fullclean # remove this revision's build tree only
set -e
PROJECT_DIR="$(cd "$(dirname "$0")" && pwd)"
CP_REV="${WADA_CP_REV:-1.2}"
case "$CP_REV" in
1.2) CP_SDIO_FRAG="sdio_v11" ;;
1.1) CP_SDIO_FRAG="sdio_v11" ;;
1.0) CP_SDIO_FRAG="sdio_v10" ;;
*) echo "[build.sh] WADA_CP_REV must be 1.0, 1.1 or 1.2 (got '$CP_REV')" >&2; exit 1 ;;
esac
export WADA_CP_REV="$CP_REV"
P4_BUILD_TARGET="crowpanel_p4_101_v${CP_REV/./}"
P4_BUILD_DIR="$PROJECT_DIR/build/$P4_BUILD_TARGET"
# This project intentionally applies compatibility fixes inside managed_components
# before every build. ESP-IDF's stock fullclean also runs remove_managed_components,
# which rejects those expected hash changes and aborts. A P4 full clean therefore
# removes only the generated CMake/Ninja tree; dependencies stay in place and the
# idempotent patches below remain valid.
if [ "$#" -eq 1 ] && [ "$1" = "fullclean" ]; then
# Plain rm -rf: cmake is not on PATH before export.sh. Each revision has its own build tree
# (and its own sdkconfig inside it), so this removes only the selected one.
if [ -d "$P4_BUILD_DIR" ]; then
rm -rf "${P4_BUILD_DIR:?}" || { echo "[build.sh] FAILED to remove $P4_BUILD_DIR" >&2; exit 1; }
fi
if [ -d "$P4_BUILD_DIR" ]; then
echo "[build.sh] FAILED to remove $P4_BUILD_DIR" >&2
exit 1
fi
echo "[build.sh] removed build/$P4_BUILD_TARGET (patched managed components preserved)"
exit 0
fi
# Keep the baked-in translation + Lua app tables in step with deploy/apps/.
# Same for the seeded Lua apps. The PlatformIO envs get this from a pre: hook;
# the IDF builds need it here or the P4 boards ship stale copies.
python3 "$(cd "$(dirname "$0")/.." && pwd)/scripts/build/pre_gen_baked.py"
# LVGL is vendored (gitignored) by fetch-deps.sh, so a copy vendored before the
# anim_timer use-after-free fix (#428) still needs it. Idempotent; fails on drift.
python3 "$(cd "$(dirname "$0")/.." && pwd)/scripts/build/patch_lvgl_anim_uaf.py" \
--patch-file "$(cd "$(dirname "$0")" && pwd)/components/lvgl/upstream/src/misc/lv_anim.c"
python3 "$(cd "$(dirname "$0")/.." && pwd)/scripts/build/patch_lvgl_arabic.py" \
--patch-file "$(cd "$(dirname "$0")" && pwd)/components/lvgl/upstream/src/misc/lv_txt_ap.c"
cd "$PROJECT_DIR"
export IDF_TOOLS_PATH="$PWD/esp-idf-tools"
# VS Code may launch this wrapper from PlatformIO's virtualenv. Pin the
# project-local IDF environment before export.sh inspects that unrelated Python.
if [ -z "${IDF_PYTHON_ENV_PATH:-}" ]; then
for idf_py_env in "$IDF_TOOLS_PATH"/python_env/idf5.5_py*_env; do
if [ -x "$idf_py_env/bin/python" ]; then
export IDF_PYTHON_ENV_PATH="$idf_py_env"
break
fi
done
fi
unset VIRTUAL_ENV CONDA_PREFIX
# shellcheck disable=SC1091
source esp-idf/export.sh >/dev/null 2>&1
WADA_FW_TAG="${WADA_FW_TAG:-$(git describe --tags --match 'beta_*' --always 2>/dev/null || echo dev)}"
WADA_FW_DATE="$(date '+%-d %b %Y')"
IDF_ARGS=(-B "build/$P4_BUILD_TARGET" \
-DDEVICE=crowpanel_p4_101 \
-DSDKCONFIG="$P4_BUILD_DIR/sdkconfig" \
-DSDKCONFIG_DEFAULTS="sdkconfigs/general;sdkconfigs/wadamesh;sdkconfigs/crowpanel_p4_101;sdkconfigs/$CP_SDIO_FRAG" \
-DWADA_FW_TAG="$WADA_FW_TAG" -DWADA_FW_DATE="$WADA_FW_DATE" \
-DIDF_TARGET=esp32p4)
# A fresh clone has no managed_components yet. Configure once to download them,
# then apply the compatibility patches below before the first compilation.
if [ ! -f managed_components/espressif__libsodium/CMakeLists.txt ]; then
idf.py "${IDF_ARGS[@]}" reconfigure
fi
# --- Build-time patch: libsodium forced includes in paths with spaces -----------------------------
# The managed component emits `SHELL:-include <absolute path>`. CMake leaves that
# path unquoted in Ninja, so a checkout such as "T7 Shield" reaches GCC as two
# input files. GCC accepts the joined -include<path> form, which cannot split.
SODIUM_CMAKE="managed_components/espressif__libsodium/CMakeLists.txt"
if [ -f "$SODIUM_CMAKE" ] && grep -q 'SHELL:-include' "$SODIUM_CMAKE"; then
sed -i '' -e 's|SHELL:-include ${CMAKE_CURRENT_SOURCE_DIR}|-include${CMAKE_CURRENT_SOURCE_DIR}|g' \
-e 's|SHELL:-include${CMAKE_CURRENT_SOURCE_DIR}|-include${CMAKE_CURRENT_SOURCE_DIR}|g' "$SODIUM_CMAKE"
echo "[build.sh] patched libsodium forced includes (space-safe paths)"
fi
# --- Build-time patch: SD_MMC internal pull-ups (P4 boards) ------------------------------------------
# The board has no external pull-ups on the SD data lines; the IDF sdmmc host explicitly FLOATS the
# pads unless SDMMC_SLOT_FLAG_INTERNAL_PULLUP is set (so pre-begin gpio_pullup_en gets undone).
# Meck-P4's working SD init sets the flag; Arduino's SD_MMC never does and has no API for it. Patch
# the P4's own managed copy. Idempotent.
SDMMC_C="managed_components/espressif__arduino-esp32/libraries/SD_MMC/src/SD_MMC.cpp"
if [ -f "$SDMMC_C" ] && ! grep -q 'wadamesh P4: internal pullups' "$SDMMC_C"; then
sed -i '' 's|sdmmc_slot_config_t slot_config = SDMMC_SLOT_CONFIG_DEFAULT();|sdmmc_slot_config_t slot_config = SDMMC_SLOT_CONFIG_DEFAULT();\n slot_config.flags \|= SDMMC_SLOT_FLAG_INTERNAL_PULLUP; // wadamesh P4: internal pullups (no external ones on the SD lines)|' "$SDMMC_C"
echo "[build.sh] patched arduino SD_MMC.cpp (internal pull-ups on the SD slot)"
fi
# --- Build-time patch: a dead C6 must not spin the SDIO rx task -----------------------------------
# With CONFIG_ESP_HOSTED_TRANSPORT_RESTART_ON_FAILURE=n (see sdkconfigs/tdisplay_p4 for why it is
# off), sdio_read_task posts ESP_HOSTED_EVENT_TRANSPORT_FAILURE and then `continue`s: straight back
# into a register read that is going to fail again. On a unit whose C6 runs factory ESP-AT the
# transport NEVER comes up, so that is an unbounded retry storm: measured at ~16 failed reads per
# second, forever, with the whole transport re-initialising on top of it. It floods the USB-CDC the
# companion app talks over and keeps a task busy for the life of the session.
#
# Turning the restart back on is not the answer: that is the boot loop this board had before.
# Both are the same mistake: a co-processor that cannot be reached is a permanent condition, and
# the driver treats it as transient. Park the task instead. The failure event has already been
# posted, Wi-Fi and BLE are simply unavailable, and everything else on the device keeps running.
# Idempotent.
HOSTED_SDIO="managed_components/nicolaielectronics__esp-hosted-tanmatsu/host/drivers/transport/sdio/sdio_drv.c"
if [ -f "$HOSTED_SDIO" ] && ! grep -q 'wadamesh: park instead of spinning' "$HOSTED_SDIO"; then
python3 - "$HOSTED_SDIO" <<'PYEOF'
import re, sys
p = sys.argv[1]
s = open(p).read()
# Both failure arms look identical apart from the log line: event post, optional restart, continue.
old = """#if H_TRANSPORT_RESTART_ON_FAILURE
ESP_LOGI(TAG, "Host is resetting itself, to avoid any sdio race condition");
g_h.funcs->_h_restart_host();
#endif
continue;"""
new = """#if H_TRANSPORT_RESTART_ON_FAILURE
ESP_LOGI(TAG, "Host is resetting itself, to avoid any sdio race condition");
g_h.funcs->_h_restart_host();
#else
/* wadamesh: park instead of spinning. The transport is down and we are
* not allowed to reboot the host, so retrying can only fail again at
* full speed. The failure event is already posted; stop here and let the
* rest of the device run without Wi-Fi/BLE. */
ESP_LOGE(TAG, "transport down, host restart disabled: parking rx task (Wi-Fi/BLE unavailable)");
while (1) g_h.funcs->_h_msleep(60000);
#endif
continue;"""
n = s.count(old)
if n == 0:
sys.exit("esp-hosted sdio_drv.c: failure arm not found; patch needs updating")
s = s.replace(old, new)
open(p, "w").write(s)
print(" patched %d failure arm(s)" % n)
PYEOF
echo "[build.sh] patched esp-hosted sdio_drv.c (park the rx task on a dead transport)"
fi
# ⚠️ The P4/slot-0 branch REBUILDS slot_config from scratch with `.flags = 0`, silently discarding
# the flag added above (that's the branch that actually runs with BOARD_SDMMC_SLOT=0): so patch that
# struct literal too. Without the flag the IDF host explicitly FLOATS the pads -> deterministic 0x109
# CRC at the first data read regardless of card/frequency.
if [ -f "$SDMMC_C" ] && ! grep -q 'wadamesh P4: slot0 pullups' "$SDMMC_C"; then
sed -i '' 's|^ .flags = 0,$| .flags = SDMMC_SLOT_FLAG_INTERNAL_PULLUP, // wadamesh P4: slot0 pullups (struct rebuilt here; the earlier flag is discarded)|' "$SDMMC_C"
echo "[build.sh] patched arduino SD_MMC.cpp (slot-0 struct pull-up flag)"
fi
# --- Build-time patch: the generic esp32p4 variant's SD power pin is THIS board's touch SDA ---------
# Arduino's esp32p4 variant (the Espressif P4 Function EV board) defines BOARD_SDMMC_POWER_PIN 45, so
# SD_MMC.begin() does pinMode(45, OUTPUT) + a 200 ms power toggle, leaves it driven LOW, and
# SD_MMC.end() clears the pin again. On the CrowPanel GPIO45 is I2C0 SDA (GT911, codec, HY2.0 port):
# the pinMode makes the peripheral manager detach I2C0 (i2cDeinit), so every Wire call afterwards
# failed with "bus is not initialized" and touch never came up (beta_97, tester V1.0 log). The card
# here is powered straight from VDD_3V3 (no switch), so the block has no job on this board at all.
# main/CMakeLists.txt defines WADA_SDMMC_NO_POWER_PIN; the guard below makes SD_MMC honour it. Fails
# the build if the upstream lines change, because touch depends on it. Idempotent.
if [ -f "$SDMMC_C" ] && ! grep -q 'WADA_SDMMC_NO_POWER_PIN' "$SDMMC_C"; then
if [ "$(grep -c '^#if defined(BOARD_SDMMC_POWER_PIN)$' "$SDMMC_C")" -lt 2 ]; then
echo "[build.sh] SD_MMC.cpp: BOARD_SDMMC_POWER_PIN blocks not found; the GPIO45 patch needs updating" >&2
exit 1
fi
sed -i '' 's|^#if defined(BOARD_SDMMC_POWER_PIN)$|#if defined(BOARD_SDMMC_POWER_PIN) \&\& !defined(WADA_SDMMC_NO_POWER_PIN) // wadamesh CrowPanel P4: GPIO45 is I2C SDA|' "$SDMMC_C"
echo "[build.sh] patched arduino SD_MMC.cpp (no SD power pin: GPIO45 stays I2C SDA)"
fi
# --- Build-time patch: remember the C6's esp-hosted version from its init event ---------------------
# The slave reports its firmware version in the transport INIT event; the host only compares it
# (major.minor) and logs a warning. Keep the raw value so main.cpp can say plainly which C6
# firmware is fitted. Asking for it over RPC instead (esp_hosted_get_coprocessor_fwversion) is what
# an old co-processor may not answer. The variable is defined in variants/crowpanel_p4_101/target.cpp.
HOSTED_TDRV="managed_components/nicolaielectronics__esp-hosted-tanmatsu/host/drivers/transport/transport_drv.c"
if [ -f "$HOSTED_TDRV" ] && ! grep -q 'wadamesh_c6_fw_version' "$HOSTED_TDRV"; then
python3 - "$HOSTED_TDRV" <<'PYEOF'
import sys
p = sys.argv[1]
s = open(p).read()
old = "\t// if ESP_PRIV_FIRMWARE_VERSION was not received, slave version will be 0.0.0\n\tcompare_fw_version(slave_fw_version);\n"
new = ("\t// if ESP_PRIV_FIRMWARE_VERSION was not received, slave version will be 0.0.0\n"
"\t{ extern volatile uint32_t wadamesh_c6_fw_version; extern volatile int wadamesh_c6_fw_known;\n"
"\t wadamesh_c6_fw_version = slave_fw_version; wadamesh_c6_fw_known = 1; } /* wadamesh: C6 version for the boot log */\n"
"\tcompare_fw_version(slave_fw_version);\n")
if s.count(old) != 1:
sys.exit("esp-hosted transport_drv.c: version compare not found; patch needs updating")
open(p, "w").write(s.replace(old, new))
PYEOF
echo "[build.sh] patched esp-hosted transport_drv.c (keep the C6 firmware version)"
fi
# --- Build-time patch: this board's C6 ships esp-hosted, so Arduino's hostedInit() must be the real
# one. A managed_components tree copied from a legacy ESP-AT T-Display build may carry the stub.
HOSTED_C="managed_components/espressif__arduino-esp32/cores/esp32/esp32-hal-hosted.c"
if [ -f "$HOSTED_C" ] && grep -q 'wadamesh P4: never start esp_hosted' "$HOSTED_C"; then
sed -i '' 's|^static bool hostedInit() { return false; // wadamesh P4: never start esp_hosted.*$|static bool hostedInit() {|' "$HOSTED_C"
echo "[build.sh] restored arduino hostedInit() (hosted C6 build)"
fi
BLEDEV_CPP="managed_components/espressif__arduino-esp32/libraries/BLE/src/BLEDevice.cpp"
if [ -f "$BLEDEV_CPP" ] && grep -q 'int rc = ble_gap_read_local_irk(irk);' "$BLEDEV_CPP"; then
sed -i '' 's|int rc = ble_gap_read_local_irk(irk);|int rc = 0; (void)irk; // wadamesh: arduino BLE unused; symbol renamed in IDF 5.5 NimBLE|' "$BLEDEV_CPP"
echo "[build.sh] patched arduino BLEDevice.cpp (stub renamed ble_gap_read_local_irk)"
fi
# --- Build-time patch: neutralize esp-hosted's auto-init constructor (P4-ONLY) --------------------
# Initialization must not run before app_main: the C6 is brought up lazily through Arduino
# hostedInit() after the UI, so a C6 that does not answer can only cost Wi-Fi/BLE.
# Two copies get pulled in (espressif__esp_hosted via arduino-esp32, and the nicolaielectronics__
# esp-hosted-tanmatsu fork via tanmatsu-wifi/badge-bsp). The build actually links the fork, so patch
# BOTH so whichever is linked never grabs the SDIO.
for HDIR in espressif__esp_hosted nicolaielectronics__esp-hosted-tanmatsu; do
HINIT_C="managed_components/$HDIR/host/port/esp/freertos/src/port_esp_hosted_host_init.c"
if [ -f "$HINIT_C" ] && grep -q 'ESP_ERROR_CHECK(esp_hosted_init());' "$HINIT_C"; then
sed -i '' 's|ESP_ERROR_CHECK(esp_hosted_init());|/* wadamesh P4: C6 initialized lazily via hostedInit() after the UI */|' "$HINIT_C"
echo "[build.sh] neutralized $HDIR auto-init constructor (defer until board power)"
fi
done
if [ "$#" -eq 1 ] && [ "$1" = "merge" ]; then
idf.py "${IDF_ARGS[@]}" build
OUT="$P4_BUILD_DIR/wadamesh-crowpanel-p4-101-v${CP_REV/./}-merged.bin"
# Same offsets and flash settings as scripts/build/p4-release.sh (bootloader 0x2000 on the P4).
python -m esptool --chip esp32p4 merge_bin --flash_mode dio --flash_size 16MB --flash_freq 80m \
-o "$OUT" \
0x2000 "$P4_BUILD_DIR/bootloader/bootloader.bin" \
0x8000 "$P4_BUILD_DIR/partition_table/partition-table.bin" \
0xf000 "$P4_BUILD_DIR/ota_data_initial.bin" \
0x20000 "$P4_BUILD_DIR/application.bin"
echo "[build.sh] merged image: $OUT (flash at 0x0)"
exit 0
fi
exec idf.py "${IDF_ARGS[@]}" "$@"
+1
View File
@@ -0,0 +1 @@
../../tdisplay_p4/components/RadioLib
+1
View File
@@ -0,0 +1 @@
../../tanmatsu/components/ardlibs
+1
View File
@@ -0,0 +1 @@
../../tanmatsu/components/esp_hosted
+1
View File
@@ -0,0 +1 @@
../../tanmatsu/components/lvgl
+1
View File
@@ -0,0 +1 @@
../../tdisplay_p4/components/meshcore
@@ -0,0 +1,22 @@
# The wadamesh app layer (MyMesh + DataStore + helpers + transports + the LVGL UITask), compiled from
# the repo's src/ plus variants/crowpanel_p4_101/. Mirrors tdisplay_p4/components/wadamesh_app, minus
# the ESP-AT c6_at component (this board's C6 ships esp-hosted firmware).
set(REPO "${CMAKE_CURRENT_LIST_DIR}/../../..")
set(APP "${REPO}/src")
file(GLOB_RECURSE APP_SRCS "${APP}/*.cpp" "${APP}/*.c" "${REPO}/variants/crowpanel_p4_101/*.cpp" "${REPO}/variants/crowpanel_p4_101/*.c")
list(FILTER APP_SRCS EXCLUDE REGEX "/main\\.cpp$")
list(FILTER APP_SRCS EXCLUDE REGEX "/helpers/input/(HeltecV4CapTouch|TDeckKeyboard|TDeckTouch|TDeckTrackball|RakTapV2Touch)\\.cpp$")
file(GLOB LUA_SRCS "${REPO}/lib/lua/src/*.c")
idf_component_register(
SRCS ${APP_SRCS} ${LUA_SRCS}
INCLUDE_DIRS "${APP}" "${APP}/ui-touch" "${REPO}/include" "${REPO}/variants/crowpanel_p4_101" "${REPO}/lib/lua/src"
REQUIRES espressif__arduino-esp32 meshcore lvgl ardlibs RadioLib nvs_flash esp_lcd fatfs
esp_driver_i2c esp_driver_gpio esp_driver_ledc esp_hosted h2zero__esp-nimble-cpp bt
soc esp_hw_support app_update driver esp_timer esp_partition spi_flash esp_adc esp_pm espcoredump
espressif__esp_lcd_ek79007 esp_mm # esp_mm: esp_cache_msync (framebuffer clear)
WHOLE_ARCHIVE
)
target_compile_options(${COMPONENT_LIB} PRIVATE -w
-include "${REPO}/variants/tdisplay_p4/tdisplay_p4_compat.h") # adcAttachPin() shim (arduino 3.x dropped it)
+1
View File
@@ -0,0 +1 @@
../tanmatsu/esp-idf
+1
View File
@@ -0,0 +1 @@
../tanmatsu/esp-idf-tools
+98
View File
@@ -0,0 +1,98 @@
idf_build_get_property(idf_target IDF_TARGET)
idf_component_register(
SRCS
"main.cpp"
PRIV_REQUIRES
esp_lcd # MIPI-DSI (EK79007)
esp_driver_i2c
esp_driver_gpio
fatfs # SD_MMC storage
nvs_flash
bt # NimBLE companion (BLE over the C6)
espressif__arduino-esp32
esp_hosted # ESP32-C6 Wi-Fi/BLE over SDIO slot 1
meshcore
lvgl
RadioLib # target.h (included by main.cpp) pulls <RadioLib.h>
wadamesh_app
INCLUDE_DIRS
"."
)
# Same warning policy as tdisplay_p4/main: vendored code must not fail the build on warnings.
idf_build_set_property(COMPILE_OPTIONS "-Wno-error=unused-variable" APPEND)
idf_build_set_property(COMPILE_OPTIONS "-Wno-error=unused-const-variable" APPEND)
idf_build_set_property(COMPILE_OPTIONS "-Wno-error=stringop-truncation" APPEND)
idf_build_set_property(COMPILE_OPTIONS "-Wno-error=stringop-overflow" APPEND)
idf_build_set_property(COMPILE_OPTIONS "-Wno-error=array-bounds" APPEND)
idf_build_set_property(COMPILE_OPTIONS "-Wno-error=restrict" APPEND)
idf_build_set_property(COMPILE_OPTIONS "-Wno-error=maybe-uninitialized" APPEND)
idf_build_get_property(_co COMPILE_OPTIONS)
list(REMOVE_ITEM _co "-Werror=all")
idf_build_set_property(COMPILE_OPTIONS "${_co}")
# ---- Elecrow CrowPanel Advanced 10.1" ESP32-P4 (EXPERIMENTAL) app define set. -------------------
# Pins: Elecrow schematics V1.0/V1.1/V1.2 + their ESP-IDF lessons; per-pin status and sources in
# the pin table at the top of variants/crowpanel_p4_101/target.h.
#
# Board revision (build.sh WADA_CP_REV=1.0|1.1|1.2, default 1.2). Only two things differ:
# - the SX1262 DIO1/NRST pair (J9.1 / J11.1): GPIO53/54 on V1.0 + V1.1, GPIO27/28 on V1.2;
# - the C6 SDIO data-pin order (sdkconfig fragment, build.sh).
if(NOT DEFINED ENV{WADA_CP_REV} OR "$ENV{WADA_CP_REV}" STREQUAL "1.2")
set(CP_REV_DEFS CP_REV=12 P_LORA_DIO_1=27 P_LORA_RESET=28)
message(STATUS "wadamesh: CrowPanel P4 10.1 board revision V1.2")
elseif("$ENV{WADA_CP_REV}" STREQUAL "1.1")
set(CP_REV_DEFS CP_REV=11 P_LORA_DIO_1=53 P_LORA_RESET=54)
message(STATUS "wadamesh: CrowPanel P4 10.1 board revision V1.1")
elseif("$ENV{WADA_CP_REV}" STREQUAL "1.0")
set(CP_REV_DEFS CP_REV=10 P_LORA_DIO_1=53 P_LORA_RESET=54)
message(STATUS "wadamesh: CrowPanel P4 10.1 board revision V1.0")
else()
message(FATAL_ERROR "WADA_CP_REV must be 1.0, 1.1 or 1.2 (got '$ENV{WADA_CP_REV}')")
endif()
set(WADA_DEFS
HAS_CROWPANEL_P4_101=1 ESP32_PLATFORM MC_VENDORED_TOUCH_APP UI_LVGL=1 HAS_TOUCH_UI=1
${CP_REV_DEFS}
USE_SX1262 RADIO_CLASS=CustomSX1262 WRAPPER_CLASS=CustomSX1262Wrapper
SX126X_RX_BOOSTED_GAIN=1 SX126X_CURRENT_LIMIT=140
SX126X_DIO2_AS_RF_SWITCH=true SX126X_DIO3_TCXO_VOLTAGE=1.6f # Elecrow Lesson14: RadioLib defaults + 1.6 V TCXO
MULTI_TRANSPORT_COMPANION TCP_PORT=5000 WS_PORT=8765 BLE_PIN_CODE=123456
LORA_FREQ=869.618 LORA_BW=62.5 LORA_SF=8 # EU 868 default like the other P4 boards; region is a setting
LORA_TX_POWER=22 MAX_LORA_TX_POWER=22
MAX_CONTACTS=2000 MAX_GROUP_CHANNELS=40 # 32 MB PSRAM
ENABLE_PRIVATE_KEY_IMPORT=1 ENABLE_PRIVATE_KEY_EXPORT=1
# --- SX1262 on the external wireless header J9/J11 (SPI3). DIO1/NRST from the revision block. ---
P_LORA_NSS=10 P_LORA_BUSY=9 P_LORA_SCLK=8 P_LORA_MISO=7 P_LORA_MOSI=6
# --- Display: EK79007 1024x600 MIPI-DSI, native landscape, LVGL at native resolution. ---
DISPLAY_CLASS=EK79007Display SCREEN_WIDTH=1024 SCREEN_HEIGHT=600
# --- Touch GT911 + shared board I2C0 (codec, HY2.0 port). Wire is begun by ESP32Board::begin. ---
PIN_BOARD_SDA=45 PIN_BOARD_SCL=46 PIN_TOUCH_SDA=45 PIN_TOUCH_SCL=46 PIN_TOUCH_RST=40 PIN_TOUCH_INT=42
# --- microSD: SDMMC slot 0, 1-bit (only D0 is wired): CLK43 / CMD44 / D0 39. C6 is slot 1. ---
BOARD_HAS_SDMMC=1 BOARD_SDMMC_SLOT=0
# The generic esp32p4 Arduino variant names GPIO45 as an SD power switch (BOARD_SDMMC_POWER_PIN);
# here 45 is the touch/codec I2C SDA and the card has no power switch. build.sh makes SD_MMC.cpp
# skip that pin when this is defined; without it every SD_MMC.begin()/end() tore down I2C0.
WADA_SDMMC_NO_POWER_PIN=1
)
foreach(_d ${WADA_DEFS})
idf_build_set_property(COMPILE_OPTIONS "-D${_d}" APPEND)
endforeach()
# Firmware version/tag (build.sh passes WADA_FW_TAG/-DATE from git describe + date).
if(NOT WADA_FW_TAG)
set(WADA_FW_TAG "dev")
endif()
if(NOT WADA_FW_DATE)
set(WADA_FW_DATE "")
endif()
idf_build_set_property(COMPILE_OPTIONS "-DFIRMWARE_RELEASE_TAG=\"${WADA_FW_TAG}\"" APPEND)
idf_build_set_property(COMPILE_OPTIONS "-DFIRMWARE_BUILD_DATE=\"${WADA_FW_DATE}\"" APPEND)
idf_build_set_property(COMPILE_OPTIONS "-DFIRMWARE_VERSION=\"wadamesh ${WADA_FW_TAG}\"" APPEND)
# NOTE: no FIRMWARE_OTA_ENV on purpose. This is an experimental board with no release artifact on
# firmware.wadamesh.com yet, so the on-device update UI stays hidden (CAP_OTA 0 in device_caps.h).
+12
View File
@@ -0,0 +1,12 @@
dependencies:
idf: ">=5.5.1"
# Same component set as the T-Display P4 (esp-hosted 2.12.3 fork via tanmatsu-wifi, arduino-esp32
# for the shared Arduino src/, esp-nimble-cpp for BLE over the C6). badge-bsp is not initialised on
# this board; it is here because tanmatsu-wifi depends on it.
badgeteam/badge-bsp: "^0.9.9"
nicolaielectronics/tanmatsu-wifi: "^1.1.2"
nicolaielectronics/tanmatsu-lora: "^0.3.0"
espressif/arduino-esp32: "3.3.10"
h2zero/esp-nimble-cpp: "^2.3.0"
# EK79007 MIPI-DSI panel driver (Elecrow's lessons pin ^1.0.2).
espressif/esp_lcd_ek79007: "^1.0.2"
+277
View File
@@ -0,0 +1,277 @@
// wadamesh on the Elecrow CrowPanel Advanced 10.1" ESP32-P4 HMI (1024x600). EXPERIMENTAL.
//
// Standalone ESP-IDF app, modelled on tdisplay_p4/main/main.cpp (same P4 + C6 esp-hosted pairing,
// same storage law: hot store on the internal LittleFS 'storage' partition, the microSD for tiles and
// bulk). The board has no I/O expander, so bring-up is: on-chip LDO rails -> EK79007 panel -> radio
// -> storage -> UI, and the C6 last. Board globals + radio_init() live in
// variants/crowpanel_p4_101/target.cpp. Pin map: the table in variants/crowpanel_p4_101/target.h.
#include "../../variants/tdisplay_p4/tdisplay_p4_compat.h" // adcAttachPin() shim, BEFORE target.h
#include <Arduino.h>
#include <Mesh.h>
#include "MyMesh.h"
#include <new>
#include "esp_heap_caps.h"
#include "UITask.h"
#include "target.h"
#include <LittleFS.h>
#include <SD_MMC.h>
#include <WiFi.h>
#include "../../src/helpers/esp32/MultiTransportCompanionInterface.h"
#include <helpers/esp32/WifiRuntimeStore.h>
#include <helpers/esp32/TouchPrefsStore.h>
#include "../../src/helpers/esp32/BootTimeSync.h"
#include "esp_hosted.h"
#include "esp_netif.h"
#include "esp_event.h"
#include "driver/gpio.h"
#include "lvgl.h"
#ifndef TCP_PORT
#define TCP_PORT 5000
#endif
#ifndef WS_PORT
#define WS_PORT 8765
#endif
#if defined(CONFIG_BT_NIMBLE_TRANSPORT_UART)
#error "CrowPanel P4 C6 requires NimBLE hosted HCI; disable CONFIG_BT_NIMBLE_TRANSPORT_UART"
#endif
extern "C" bool hostedInitBLE(); // arduino-esp32 BLE controller bring-up over esp-hosted
extern "C" bool hostedSetPins(int8_t clk, int8_t cmd, int8_t d0, int8_t d1, int8_t d2, int8_t d3, int8_t rst);
// C6 SDIO pin set. Arduino's hostedInit() does NOT take these from sdkconfig: it passes the generic
// esp32p4 variant's BOARD_SDIO_ESP_HOSTED_* (CLK18 CMD19 D0-D3 = 14,15,16,17, RST 54) to
// esp_hosted_sdio_set_config(), which overrides Kconfig. That order happens to match the T-Display
// P4 and the CrowPanel V1.0, but V1.1/V1.2 route D0..D3 to GPIO17..14, and C6_EN is GPIO32 on every
// revision. Must run before anything can start esp-hosted (Wi-Fi, BLE, boot time sync).
// The bus width (4-bit, or 1-bit on V1.0) still comes from the sdkconfig fragment.
// Say once, plainly, which esp-hosted firmware the C6 runs (known once the transport is up). A C6
// older than the host (V1.0 units have shipped with 2.3.0 against this 2.12.x host) can leave RPCs
// unanswered, each costing the 5 s RPC timeout on the calling task, so Wi-Fi reconnects are spaced
// out further on such a C6 rather than stalling the UI loop every 10 s.
static int s_c6_state = -1; // -1 unknown, 0 matches the host, 1 older than the host
static void crowpanelC6ReportOnce(const char* when) {
static bool s_done = false;
if (s_done) return;
char line[200];
const int st = crowpanelC6Describe(line, sizeof line);
if (st < 0) return;
s_done = true;
s_c6_state = st;
printf("[C6] %s (seen at %s)\n", line, when);
if (st == 1) printf("[C6] old co-processor: Wi-Fi reconnect attempts every 60 s instead of 10 s\n");
}
static void crowpanelC6Pins() {
#if CP_REV == 10
const bool ok = hostedSetPins(18, 19, 14, 15, 16, 17, 32);
#else
const bool ok = hostedSetPins(18, 19, 17, 16, 15, 14, 32);
#endif
printf("[BOOT] C6 SDIO pins set for V%d.%d: %s\n", CP_REV / 10, CP_REV % 10, ok ? "ok" : "FAILED");
}
// Boot-trace hooks the shared code defines on the S3 boards (src/main.cpp, excluded here).
volatile int g_boot_phase = 0;
extern "C" void set_boot_phase(int phase) { g_boot_phase = phase; }
// App globals: src/main.cpp declares these on the S3 boards; this build owns them.
DataStore store(LittleFS, rtc_clock);
bool g_fs_ok = false; // internal 'storage' (LittleFS) mounted
bool g_sd_ok = false; // microSD mounted
bool g_sd_no_card_at_boot = false; // boot probe: no card answered (UITask's first lazy mount skips)
MultiTransportCompanionInterface serial_interface;
StdRNG fast_rng;
SimpleMeshTables tables;
UITask ui_task(&board, &serial_interface);
static MyMesh& makeTheMesh() {
void* mem = heap_caps_malloc(sizeof(MyMesh), MALLOC_CAP_SPIRAM | MALLOC_CAP_8BIT);
if (!mem) mem = malloc(sizeof(MyMesh));
return *new (mem) MyMesh(radio_driver, fast_rng, rtc_clock, tables, store, &ui_task);
}
MyMesh& the_mesh = makeTheMesh();
static void wadameshSetup() {
Serial.begin(115200);
delay(150);
printf("[BOOT] wadamesh / CrowPanel P4 10.1 (board revision V%d.%d, EXPERIMENTAL)\n", CP_REV / 10, CP_REV % 10);
// 1. On-chip LDO rails (DSI PHY + the 3.3 V pad domain of touch/LCD-reset/SD), backlight + amp off.
crowpanelP4PowerOn();
// 2. Shared I2C0 (GT911, codec, HY2.0 port) on 45/46.
board.begin();
// 3. EK79007 panel, before LVGL flushes to it.
if (!display.begin()) printf("[BOOT] EK79007 display init FAILED\n");
// 4. lwIP/tcpip + default event loop before any Wi-Fi/netif call (esp_wifi_remote needs it).
esp_netif_init();
esp_event_loop_create_default();
crowpanelC6Pins();
printf("[BOOT] C6 = esp-hosted (lazy Wi-Fi/BLE initialization)\n");
// 5. Radio (SX1262 on J9/J11).
if (!radio_init()) printf("[BOOT] radio_init FAILED\n");
DisplayDriver* disp = &display;
// 6. Storage: internal LittleFS 'storage' = the hot store; the microSD = tiles, backups, bulk.
g_fs_ok = LittleFS.begin(true, "/lfs", 10, "storage");
printf("[storage] LittleFS(storage) = %s\n", g_fs_ok ? "OK" : "FAILED");
if (g_fs_ok) { LittleFS.mkdir("/identity"); LittleFS.mkdir("/bl"); }
// microSD on SDMMC slot 0, 1-bit: the J5 slot only has D0 routed (CLK43 / CMD44 / D0 39), as in
// Elecrow's Lesson08. Pad power is LDO4, which crowpanelP4PowerOn() already holds, so SD_MMC must
// not try to claim it again (-1 = external power; the card itself is on VDD_3V3 with no switch).
// The card has pull-ups on CMD/D0 (R27/R28); the build also enables the internal ones (build.sh
// patch), as Elecrow does. DAT1-DAT3 are not connected to the P4 (schematic V1.0-V1.2), so the slot
// can only run 1-bit. V1.0 also shows a 10k pull-down on the card's DAT3 (R33, with the pull-up
// R29 marked "10K/NC"); a card that sees DAT3 low at its first command enters SPI mode and never
// answers in SD mode, which would look exactly like an empty slot (unverified on hardware).
SD_MMC.setPowerChannel(-1);
SD_MMC.setPins(43, 44, 39);
for (int p : {44, 39}) gpio_pullup_en((gpio_num_t)p);
// Quiet presence check first: an empty slot (or a card that never answers the first command) is
// reported once, instead of three IDF + Arduino error pairs from the mount ladder below. The
// ladder only runs when a card answered, which is when a lower clock can actually help.
const esp_err_t sd_probe = crowpanelSdProbe();
if (sd_probe == ESP_ERR_TIMEOUT) {
g_sd_no_card_at_boot = true;
sdMountDiagBegin();
sdMountDiagAttempt(400000u, false, false);
sdMountDiagSetMounted(false, 0);
printf("[storage] SD_MMC = no card or not responding (1-bit slot, no answer at 400 kHz)\n");
} else {
if (sd_probe != ESP_OK)
printf("[storage] SD_MMC probe: card answered but init failed (%s); trying the mount ladder\n",
esp_err_to_name(sd_probe));
struct { int khz; const char* tag; } tries[] = {
{ SDMMC_FREQ_DEFAULT, "1-bit 20MHz" },
{ 10000, "1-bit 10MHz (Elecrow)" },
{ 5000, "1-bit 5MHz" },
};
sdMountDiagBegin();
uint32_t mounted_hz = 0;
for (auto& t : tries) {
const bool begin_ok = SD_MMC.begin("/sdcard", true, false, t.khz);
g_sd_ok = begin_ok && SD_MMC.cardType() != CARD_NONE;
sdMountDiagAttempt((uint32_t)t.khz * 1000u, begin_ok, g_sd_ok);
printf("[storage] SD_MMC try %s -> %s\n", t.tag, g_sd_ok ? "OK" : "fail");
if (g_sd_ok) { mounted_hz = (uint32_t)t.khz * 1000u; break; }
SD_MMC.end();
delay(120);
}
sdMountDiagSetMounted(g_sd_ok, mounted_hz);
printf("[storage] SD_MMC = %s\n", g_sd_ok ? "OK" : "card present but mount failed");
}
store.begin(); // internal LittleFS is the DataStore root (P4 storage law)
the_mesh.begin(disp != NULL);
wifiConfigBegin(); // NVS only, no radio
serial_interface.begin(Serial, TCP_PORT, WS_PORT);
serial_interface.setBroadcastResponses(true);
the_mesh.startInterface(serial_interface);
sensors.begin();
ui_task.begin(disp, &sensors, the_mesh.getNodePrefs());
board.onBootComplete();
printf("[BOOT] setup done\n");
// ---- C6 bring-up, AFTER the UI ----------------------------------------------------------------
// A C6 that does not answer (wrong firmware, wrong SDIO pin set for the revision) must cost Wi-Fi
// and BLE only: display, touch and LoRa are already up by now.
#if defined(BLE_PIN_CODE)
char* nm = the_mesh.getNodePrefs()->node_name;
serial_interface.prepareBle("wadamesh-", nm, the_mesh.getBLEPin());
if (wifiConfigGetBleEnabled()) {
if (hostedInitBLE()) serial_interface.beginBle("wadamesh-", nm, the_mesh.getBLEPin());
else printf("[BOOT] hostedInitBLE FAILED (BLE unavailable; LoRa, touch and the UI keep running)\n");
crowpanelC6ReportOnce("BLE start");
} else {
printf("[BOOT] BLE off in settings: C6 not started for it\n");
}
#endif
{
uint32_t synced_epoch = 0;
const BootTimeSyncResult r = bootTimeSyncRun(rtc_clock.timeIsCurrent(), synced_epoch);
if (r == BootTimeSyncResult::Ok) {
rtc_clock.setCurrentTime(synced_epoch);
printf("[BOOT] cold-boot time sync ok: %lu\n", (unsigned long)synced_epoch);
} else if (r != BootTimeSyncResult::Skipped) {
printf("[BOOT] cold-boot time sync: %s\n", bootTimeSyncResultName(r));
}
}
}
extern "C" void app_main(void) {
crowpanelP4InstallFullRestart(); // before anything else registers a shutdown handler
initArduino();
wadameshSetup();
// Wi-Fi state machine + SNTP + TCP/WS companion server, as in tdisplay_p4/main/main.cpp
// (esp-hosted backend: Arduino's real WiFi over esp_wifi_remote).
bool wifi_started = false, wifi_radio_prev = true, wifi_radio_inited = false;
bool sntp_kicked = false, sntp_pushed = false, modem_sleep_set = false;
uint32_t last_wifi_retry_ms = 0;
const uint32_t WIFI_RETRY_INTERVAL_MS = 10000;
const uint32_t WIFI_RETRY_INTERVAL_OLD_C6_MS = 60000; // see crowpanelC6ReportOnce()
for (;;) {
ui_task.loop();
bool wifi_radio_en = wifiConfigWantsWifi();
if (!wifi_radio_inited) {
wifi_radio_inited = true;
wifi_radio_prev = wifi_radio_en;
} else if (wifi_radio_en != wifi_radio_prev) {
wifi_radio_prev = wifi_radio_en;
if (!wifi_radio_en) { WiFi.disconnect(true); delay(50); WiFi.mode(WIFI_OFF); }
wifi_started = false;
}
if (wifiConfigConsumeApplyRequest()) {
if (wifi_started) {
if (!wifi_radio_en) { WiFi.disconnect(true); delay(50); WiFi.mode(WIFI_OFF); }
else { WiFi.disconnect(false, false); delay(50); }
}
wifi_started = false; last_wifi_retry_ms = 0;
}
if (wifi_radio_en) {
if (!wifi_started) {
wifi_started = true;
WiFi.mode(WIFI_STA);
if (wifiConfigHasRuntime()) {
char ssid[WIFI_CONFIG_SSID_MAX], pwd[WIFI_CONFIG_PWD_MAX];
wifiConfigGetSsid(ssid, sizeof(ssid)); wifiConfigGetPwd(pwd, sizeof(pwd));
if (strlen(ssid) > 0) { WiFi.begin(ssid, pwd[0] ? pwd : nullptr); last_wifi_retry_ms = millis(); }
}
}
if (wifiConfigHasRuntime() && WiFi.status() != WL_CONNECTED) {
uint32_t now = millis();
crowpanelC6ReportOnce("Wi-Fi start");
const uint32_t retry_ms = (s_c6_state == 1) ? WIFI_RETRY_INTERVAL_OLD_C6_MS : WIFI_RETRY_INTERVAL_MS;
if ((uint32_t)(now - last_wifi_retry_ms) >= retry_ms) {
last_wifi_retry_ms = now;
char ssid[WIFI_CONFIG_SSID_MAX], pwd[WIFI_CONFIG_PWD_MAX];
wifiConfigGetSsid(ssid, sizeof(ssid)); wifiConfigGetPwd(pwd, sizeof(pwd));
if (strlen(ssid) > 0) { WiFi.disconnect(false, true); WiFi.begin(ssid, pwd[0] ? pwd : nullptr); }
}
}
if (WiFi.status() == WL_CONNECTED) {
if (!modem_sleep_set) { WiFi.setSleep(true); modem_sleep_set = true; crowpanelC6ReportOnce("Wi-Fi connected"); }
serial_interface.startTcpServer(true);
if (!sntp_pushed) {
if (!sntp_kicked) { configTime(0, 0, "pool.ntp.org", "time.nist.gov"); sntp_kicked = true; }
const uint32_t e = (uint32_t)time(nullptr);
if (e > 1700000000) { rtc_clock.setCurrentTime(e); sntp_pushed = true; printf("[TIME] SNTP -> rtc %lu\n", (unsigned long)e); }
}
}
}
serial_interface.tickWebSocketHandshake();
sensors.loop();
the_mesh.loop();
vTaskDelay(1);
}
}
@@ -0,0 +1,12 @@
# Elecrow CrowPanel P4 10.1: standalone 16 MB partition table (same layout as the T-Display P4).
# NOT an AppFS/launcher app (that's the Tanmatsu): this flashes bootloader+app directly.
# Dual OTA app slots (4 MB each; the P4 wadamesh image is ~2.5-3 MB) + a big FAT for
# identity/prefs/contacts/chat history + map tiles.
# Name, Type, SubType, Offset, Size, Flags
nvs, data, nvs, 0x9000, 24K,
otadata, data, ota, 0xF000, 8K,
phy_init, data, phy, 0x11000, 4K,
ota_0, app, ota_0, 0x20000, 4M,
ota_1, app, ota_1, 0x420000, 4M,
storage, data, fat, 0x820000, 8000K,
coredump, data, coredump, 0xFF0000, 64K,
1 # Elecrow CrowPanel P4 10.1: standalone 16 MB partition table (same layout as the T-Display P4).
2 # NOT an AppFS/launcher app (that's the Tanmatsu): this flashes bootloader+app directly.
3 # Dual OTA app slots (4 MB each; the P4 wadamesh image is ~2.5-3 MB) + a big FAT for
4 # identity/prefs/contacts/chat history + map tiles.
5 # Name, Type, SubType, Offset, Size, Flags
6 nvs, data, nvs, 0x9000, 24K,
7 otadata, data, ota, 0xF000, 8K,
8 phy_init, data, phy, 0x11000, 4K,
9 ota_0, app, ota_0, 0x20000, 4M,
10 ota_1, app, ota_1, 0x420000, 4M,
11 storage, data, fat, 0x820000, 8000K,
12 coredump, data, coredump, 0xFF0000, 64K,
@@ -0,0 +1,58 @@
# Elecrow CrowPanel Advanced 10.1" ESP32-P4 HMI (1024x600) board sdkconfig fragment. EXPERIMENTAL.
# Modelled on sdkconfigs/tdisplay_p4 (same ESP32-P4NRW32 + ESP32-C6-MINI-1 esp-hosted pairing). The
# C6 SDIO pin/width set lives in a per-revision fragment (sdio_v10 / sdio_v11), layered after this.
CONFIG_IDF_TARGET="esp32p4"
# 32 MB HEX PSRAM @ 200 MHz (in-package on the P4NRW32; Elecrow's V1.0/V1.1 lessons run HEX 200M).
# 200 MHz is behind CONFIG_IDF_EXPERIMENTAL_FEATURES on IDF 5.5; without it Kconfig drops to 20 MHz
# and the DPI panel underruns fetching its PSRAM framebuffer.
CONFIG_SPIRAM=y
CONFIG_IDF_EXPERIMENTAL_FEATURES=y
CONFIG_SPIRAM_SPEED_200M=y
CONFIG_SPIRAM_MALLOC_RESERVE_INTERNAL=65536
# 16 MB W25Q128 + our standalone dual-OTA partition table (same layout as the T-Display P4).
CONFIG_ESPTOOLPY_FLASHSIZE_16MB=y
CONFIG_PARTITION_TABLE_CUSTOM=y
CONFIG_PARTITION_TABLE_CUSTOM_FILENAME="partition_tables/crowpanel_p4_101_16M.csv"
# MIPI-DSI (EK79007)
CONFIG_LCD_DSI_ISR_IRAM_SAFE=y
# ESP32-C6-MINI-1 co-processor over SDIO slot 1 (CLK18 / CMD19; data pins per revision fragment).
# Factory C6 firmware is esp-hosted MCU 2.12.3 (Elecrow "Advance_P4_On-Board_ESP32C6_Firmware_V2.12.3"),
# the same version as the hosted fork tanmatsu-wifi pulls in.
CONFIG_SLAVE_IDF_TARGET_ESP32C6=y
CONFIG_ESP_HOSTED_CP_TARGET_ESP32C6=y
CONFIG_ESP_HOSTED_SDIO_CLOCK_FREQ_KHZ=40000
# C6_EN = GPIO32 (schematic, all revisions). Reset through hosted_reset_slave_callback() in
# variants/crowpanel_p4_101/target.cpp, so the polarity and the GPIO are explicit in code.
CONFIG_ESP_HOSTED_SLAVE_RESET_ONLY_IF_NECESSARY=y
CONFIG_ESP_HOSTED_RESET_SLAVE_USING_CALLBACK=y
CONFIG_ESP_HOSTED_SDIO_RESET_SLAVE_USING_CALLBACK=y
CONFIG_ESP_HOSTED_ENABLE_BT_NIMBLE=y
# The P4 has no Bluetooth controller of its own: NimBLE's HCI runs over esp-hosted SDIO.
CONFIG_BT_ENABLED=y
CONFIG_BT_NIMBLE_ENABLED=y
CONFIG_BT_CONTROLLER_DISABLED=y
# CONFIG_BT_NIMBLE_TRANSPORT_UART is not set
# A C6 that cannot be reached must cost Wi-Fi and BLE, never the device (see sdkconfigs/tdisplay_p4).
CONFIG_ESP_HOSTED_HOST_RESTART_NO_COMMUNICATION_WITH_SLAVE=n
CONFIG_ESP_HOSTED_TRANSPORT_RESTART_ON_FAILURE=n
# Panic coredump -> the 64K 'coredump' partition (ELF, decodable against the build's elf).
CONFIG_ESP_COREDUMP_ENABLE_TO_FLASH=y
CONFIG_ESP_COREDUMP_DATA_FORMAT_ELF=y
CONFIG_ESP_COREDUMP_CHECKSUM_CRC32=y
CONFIG_ESP_COREDUMP_MAX_TASKS_NUM=64
# DPI/video panel: the 1.2 MB framebuffer lives in PSRAM and is streamed continuously, so the same
# underrun mitigations as the T-Display P4: run code from PSRAM (flash writes no longer drop the
# cache under the DSI DMA), a 256 KB L2 cache with 128 B lines, -O2.
CONFIG_SPIRAM_XIP_FROM_PSRAM=y
CONFIG_COMPILER_OPTIMIZATION_SIZE=n
CONFIG_COMPILER_OPTIMIZATION_PERF=y
CONFIG_CACHE_L2_CACHE_128KB=n
CONFIG_CACHE_L2_CACHE_256KB=y
CONFIG_CACHE_L2_CACHE_LINE_64B=n
CONFIG_CACHE_L2_CACHE_LINE_128B=y
+1
View File
@@ -0,0 +1 @@
../../tanmatsu/sdkconfigs/general
+9
View File
@@ -0,0 +1,9 @@
# CrowPanel P4 10.1 V1.0: the C6 data lines run the other way round (schematic: GPIO14 = SD2_D0 ->
# C6 IO20 ... GPIO17 = SD2_D3 -> C6 IO23), and V1.0 has none of the series resistors / caps V1.1
# added on those lines. Elecrow's V1.0 Lesson17 runs the link 1-bit (D0 = GPIO14, D1 = GPIO15 as the
# interrupt line), so this does the same.
CONFIG_ESP_HOSTED_SDIO_1_BIT_BUS=y
CONFIG_ESP_HOSTED_PRIV_SDIO_PIN_CLK_SLOT_1=18
CONFIG_ESP_HOSTED_PRIV_SDIO_PIN_CMD_SLOT_1=19
CONFIG_ESP_HOSTED_PRIV_SDIO_PIN_D0_SLOT_1=14
CONFIG_ESP_HOSTED_PRIV_SDIO_PIN_D1_1BIT_BUS_SLOT_1=15
+10
View File
@@ -0,0 +1,10 @@
# CrowPanel P4 10.1 V1.1 and V1.2: C6 SDIO 4-bit, P4 GPIO17/16/15/14 = D0/D1/D2/D3.
# Source: V1.1/V1.2 schematics (net SD2_D0 = GPIO17 -> C6 IO20 ... SD2_D3 = GPIO14 -> C6 IO23) and
# Elecrow's V1.1/V1.2 Lesson17 sdkconfig (4-bit, same pins).
CONFIG_ESP_HOSTED_SDIO_4_BIT_BUS=y
CONFIG_ESP_HOSTED_PRIV_SDIO_PIN_CLK_SLOT_1=18
CONFIG_ESP_HOSTED_PRIV_SDIO_PIN_CMD_SLOT_1=19
CONFIG_ESP_HOSTED_PRIV_SDIO_PIN_D0_SLOT_1=17
CONFIG_ESP_HOSTED_PRIV_SDIO_PIN_D1_4BIT_BUS_SLOT_1=16
CONFIG_ESP_HOSTED_PRIV_SDIO_PIN_D2_4BIT_BUS_SLOT_1=15
CONFIG_ESP_HOSTED_PRIV_SDIO_PIN_D3_4BIT_BUS_SLOT_1=14
+1
View File
@@ -0,0 +1 @@
../../tanmatsu/sdkconfigs/wadamesh
+1 -1
View File
@@ -1,7 +1,7 @@
# Submitting an app to the WADAMESH store
Apps are small Lua programs that appear in the device's **Apps** drawer and are
downloaded over Wi-Fi from `firmware.wadamesh.com/apps/`. Snake, RF Monitor and
downloaded over Wi-Fi from `meshinfo.ru/firmware/apps/`. Snake, RF Monitor and
Airtime all ship this way — they are ordinary submissions, not special cases, so
reading their source is the fastest way to see what an app looks like.
+8
View File
@@ -113,6 +113,14 @@
"icon": "music",
"requires": "audio",
"seed": false
},
{
"id": "blackjack",
"name": "Blackjack",
"ver": "1.0",
"desc": "Casino Blackjack (21) with split, double down, 6-deck shoe, persistent bankroll, and T-Deck/T-Display P4 controls. Contributed by halflive-743.",
"icon": "game",
"seed": false
}
]
}
+1
View File
@@ -0,0 +1 @@
{"id":"blackjack","name":"Blackjack","ver":"1.0","desc":"Casino Blackjack (21) with split, double down, 6-deck shoe, persistent bankroll, and auto-scaling UI for T-Deck & T-Display P4 (AMOLED/LCD).","icon":"game"}
File diff suppressed because it is too large. Load diff
File diff suppressed because it is too large. Load diff
File diff suppressed because it is too large. Load diff
File diff suppressed because it is too large. Load diff
File diff suppressed because it is too large. Load diff
File diff suppressed because it is too large. Load diff
File diff suppressed because it is too large. Load diff
File diff suppressed because it is too large. Load diff
File diff suppressed because it is too large. Load diff
File diff suppressed because it is too large. Load diff
File diff suppressed because it is too large. Load diff
File diff suppressed because it is too large. Load diff
File diff suppressed because it is too large. Load diff
File diff suppressed because it is too large. Load diff
File diff suppressed because it is too large. Load diff
File diff suppressed because it is too large. Load diff
File diff suppressed because it is too large. Load diff
File diff suppressed because it is too large. Load diff
File diff suppressed because it is too large. Load diff
File diff suppressed because it is too large. Load diff
File diff suppressed because it is too large. Load diff
File diff suppressed because it is too large. Load diff
File diff suppressed because it is too large. Load diff
File diff suppressed because it is too large. Load diff
File diff suppressed because it is too large. Load diff
File diff suppressed because it is too large. Load diff
File diff suppressed because it is too large. Load diff
File diff suppressed because it is too large. Load diff
File diff suppressed because it is too large. Load diff
File diff suppressed because it is too large. Load diff
File diff suppressed because it is too large. Load diff
+174 -1
View File
@@ -1,7 +1,7 @@
# wadamesh language file
# canonical source - translators: edit this file and PR it
# code: bg
# ver: 26
# ver: 28
# name: Български
# base: bg
(device behind) (устройството изостава)
@@ -1987,3 +1987,176 @@ Showing the first %d tracks Показани са първите %d песни
Sound is off: Settings > Sound Звукът е изключен: Настройки > Звук
Stopped Спряно
This device cannot play music. Това устройство не може да пуска музика.
# Settings > Device / keyboard protocol / setup wizard strings
Hardware Хардуер
Display & lock Дисплей и заключване
Keep Bluetooth on to pair the MeshCore app on your phone. Wi-Fi can be set up anytime in Settings. Оставете Bluetooth включен, за да сдвоите приложението MeshCore на телефона си. Wi-Fi може да се настрои по всяко време в Настройки.
Radio: Радио:
Keyboard: Клавиатура:
newer keyboard по-нова клавиатура
older keyboard по-стара клавиатура
older keyboard (set manually) по-стара клавиатура (ръчно)
keyboard not detected yet клавиатурата още не е разпозната
Always use the external antenna (MMCX) Винаги външната антена (MMCX)
Starts on the external socket at every boot. Only for an antenna that stays connected. Стартира на външния конектор при всяко включване. Само за антена, която остава свързана.
Only pick External with an antenna fitted to the external socket. After a reboot it starts on the on-board antenna, unless the switch below is on. Избирайте Външна само с антена на външния конектор. След рестарт започва на вградената антена, освен ако превключвателят по-долу е включен.
Always use the external antenna?\n\nThe radio will start on the external (MMCX) socket at every boot. Transmitting without an antenna attached can damage the radio.\n\nOnly turn this on if your external antenna stays connected. Винаги да се ползва външната антена?\n\nРадиото ще стартира на външния конектор (MMCX) при всяко включване. Предаване без свързана антена може да повреди радиото.\n\nВключете това само ако външната антена остава свързана.
Turn on Включи
On-board antenna selected Избрана е вградената антена
External antenna at every boot Външна антена при всяко включване
Antenna Антена
On-board Вградена
Glass tiles Стъклени плочки
Widgets, cards and panel tiles let the background show through. Off: solid tiles. Джаджите, картите и плочките в панела пропускат фона. Изключено: плътни плочки.
# repeater admin app
0 to 9. Higher waits longer between sends. От 0 до 9. По-високо чака по-дълго между изпращанията.
A name is required Нужно е име
A node clock only moves forward: syncing cannot set it back. Часовникът на възел върви само напред: синхронизирането не може да го върне назад.
A room server lists only its admins here. Room сървър показва тук само своите администратори.
Access Достъп
Access changed Достъпът е променен
Actions Действия
Admin password Парола на администратор
Admin password changed. Паролата на администратора е променена.
Admin password for full control, or the room password. Парола на администратор за пълен контрол, или паролата на стаята.
Admin password for full control. A guest sees status and neighbours. Парола на администратор за пълен контрол. Гост вижда състоянието и съседите.
Advanced Разширени
Advert hop limit Лимит на скоковете за обяви
Advert intervals Интервали на обявите
Adverts Обяви
Again Отново
Airtime factor Коефициент на ефирно време
Bandwidth Честотна лента
Change Промени
Change radio settings Промяна на радионастройките
Change the admin password? If you lose it you can no longer manage this node over the mesh. Да се промени ли паролата на администратора? Ако я загубите, вече няма да можете да управлявате този възел през мрежата.
Clients Клиенти
Coding rate Кодова скорост
Console Конзола
Current Текущи
Decimal degrees, for example 4.4025 Десетични градуси, например 4.4025
Decimal degrees, for example 51.2194 Десетични градуси, например 51.2194
Direct send delay Закъснение при директно изпращане
Discover neighbours Търсене на съседи
Duplicates Дубликати
Enter a number Въведете число
Enter a password Въведете парола
Error Грешка
Errors Грешки
Firmware update: the node opens a Wi-Fi access point; join it and upload the new firmware in a browser, as the node's own instructions say. Обновяване: възелът отваря Wi-Fi точка за достъп; свържете се с нея и качете новия фърмуер в браузър, както казват инструкциите на възела.
Flood advert Flood обява
Flood hop limit Лимит на скоковете за flood
Flood send delay Закъснение при flood изпращане
Floods with more hops are not repeated. 0 to 64. Flood с повече скокове не се повтаря. От 0 до 64.
Frequency: 150 to 2500 MHz Честота: от 150 до 2500 MHz
Guest Гост
Guest password Парола за гост
Hours between flood adverts: 0 (off) or 3 to 168. Часове между flood обявите: 0 (изкл.) или от 3 до 168.
How hard to drop packets that came back around. Колко строго да се изхвърлят пакети, върнали се в кръг.
Identity Идентичност
Identity & location Идентичност и местоположение
Last reply Последен отговор
Last signal Последен сигнал
Lets a wrong or blank password in to read, not to post. Пуска с грешна или празна парола за четене, не за публикуване.
Load more (%d of %u) Зареди още (%d от %u)
Local advert Локална обява
Location Местоположение
Log in Вход
Log in as admin Вход като администратор
Log in as guest Вход като гост
Logged in as a guest: you can read the status and neighbours. Log in with the admin password to change settings. Влезли сте като гост: можете да четете състоянието и съседите. Влезте с паролата на администратора, за да променяте настройки.
Logged in without admin rights. Log in with the admin password to change settings. Влезли сте без права на администратор. Влезте с паролата на администратора, за да променяте настройки.
Logging in... Влизане...
Login refused. Входът е отказан.
Logs in as a guest. Blank lets anyone in as a guest. Up to 15 characters. Влиза като гост. Празна пуска всеки като гост. До 15 знака.
Loop detection Откриване на цикли
Manage Управление
Members log in with it to post. Up to 15 characters. Членовете влизат с нея, за да публикуват. До 15 знака.
Minutes between zero-hop adverts: 0 (off) or 60 to 240. Минути между обявите без скок: 0 (изкл.) или от 60 до 240.
Moderate Умерено
Neighbours Съседи
New password Нова парола
Newest Най-нови
No neighbours heard yet. Още не са чути съседи.
No reply Няма отговор
No reply from the node Възелът не отговаря
No reply. Check the password, that the node is in range, and this device's clock. Няма отговор. Проверете паролата, дали възелът е в обхват, и часовника на това устройство.
No reply. It may or may not have been applied: read it again. Няма отговор. Може да е приложено, а може и да не е: прочетете отново.
No spaces Без интервали
Nobody on the list. Няма никой в списъка.
Node clock Часовник на възела
Noise floor Ниво на шума
Not in your contacts Не е в контактите ви
Not in your contacts, so only removing is possible here. Не е в контактите ви, затова тук може само да се премахне.
Not saved Не е запазено
Off: this node stops forwarding anything. Изкл.: този възел спира да препраща каквото и да е.
Order Ред
Owner Собственик
Owner info Информация за собственика
Password Парола
Passwords Пароли
Passwords & access Пароли и достъп
Posts Публикации
Prefers stronger copies of a flood. 0 to 20. Предпочита по-силните копия на flood. От 0 до 20.
Queue Опашка
Random delay factor before repeating a flood. 0 to 2. Случаен коефициент на закъснение преди повтаряне на flood. От 0 до 2.
Read again Прочети отново
Read-only Само четене
Read-only access Достъп само за четене
Read-write Четене и запис
Reading... Четене...
Reboot sent. The node is back in about 10 s. Рестартът е изпратен. Възелът се връща след около 10 s.
Reboot the node? It is off the air for about 10 s and forgets guest logins. Да се рестартира ли възелът? Той е извън ефир около 10 s и забравя входовете на гостите.
Receive delay Закъснение при приемане
Received Получени
Refresh Опресни
Regions Региони
Remove access Премахни достъпа
Remove this client's access? Да се премахне ли достъпът на този клиент?
Repeat packets Повтаряй пакети
Repeaters this node hears directly, with the signal it hears them at. Ретранслатори, които този възел чува директно, със сигнала, с който ги чува.
Repeating Повтаряне
Repeating & limits Повтаряне и ограничения
Reset counters Нулиране на броячите
Reset the node's packet counters? Да се нулират ли броячите на пакети на възела?
Room password Парола на стаята
Save (after a reboot) Запази (след рестарт)
Save new radio settings?\nNow: %s\nNew: %s\nThey apply after a reboot. Wrong values can cut this node off for good. Да се запазят ли новите радионастройки?\nСега: %s\nНови: %s\nВлизат в сила след рестарт. Грешни стойности могат завинаги да откъснат този възел.
Saved. Applies after a reboot. Запазено. Влиза в сила след рестарт.
Saved. The node uses the new radio settings after a reboot. Reboot it now? Запазено. Възелът ползва новите радионастройки след рестарт. Да се рестартира ли сега?
Saving... Запазване...
Send flood advert Изпрати flood обява
Send now Изпрати сега
Send zero-hop advert Изпрати обява без скок
Set the node's position to this device's position? Да се зададе ли позицията на възела като тази на това устройство?
Shown to anyone who asks this node. Up to 119 characters. Показва се на всеки, който попита този възел. До 119 знака.
Spreading factor Фактор на разпръскване
Start a firmware update on the node? It opens its own Wi-Fi access point until it is updated or rebooted, and stops repeating meanwhile. Да се стартира ли обновяване на фърмуера на възела? Той отваря своя Wi-Fi точка за достъп, докато не бъде обновен или рестартиран, и междувременно не повтаря нищо.
Start firmware update Стартирай обновяване на фърмуера
Strict Строго
Strongest Най-силни
Sync clock to this device Синхронизирай часовника с това устройство
The node's region tree: ^ marks its home region, F that it repeats floods for that region. Edit regions in the Console. Дървото с региони на възела: ^ отбелязва домашния му регион, F че повтаря flood за този регион. Регионите се редактират в Конзолата.
The passwords do not match Паролите не съвпадат
The position goes out in the node's adverts. Позицията се изпраща в обявите на възела.
The same for direct packets. 0 to 2. Същото за директни пакети. От 0 до 2.
The same limit for adverts. 0 to 64. Същият лимит за обяви. От 0 до 64.
This device Това устройство
This device has no position Това устройство няма позиция
Transmit power Мощност на предаване
Try Опитай
Try for 10 minutes Опитай за 10 минути
Try new radio settings for %u minutes?\nNow: %s\nTry: %s\nThe node goes back by itself. Until then you reach it only on the new settings. Да се опитат ли нови радионастройки за %u минути?\nСега: %s\nОпит: %s\nВъзелът се връща сам. Дотогава го достигате само с новите настройки.
Up to 31 characters, without [ ] \\ : , ? * До 31 знака, без [ ] \\ : , ? *
Updated %s ago Обновено преди %s
Uptime Време на работа
Use my position Използвай моята позиция
Use this device's settings Използвай настройките на това устройство
Wrong radio settings can cut this node off: you then reach it only on the new settings, or not at all. Try them first; the node goes back by itself. Грешни радионастройки могат да откъснат този възел: тогава го достигате само с новите настройки, или изобщо не. Първо ги опитайте; възелът се връща сам.
dBm, -9 to 30. Applies at once. dBm, от -9 до 30. Важи веднага.
pushed изпратени
you вие
Flood in / out Flood вход / изход
Direct in / out Директни вход / изход
Airtime TX / RX Ефирно време TX / RX
+174 -1
View File
@@ -1,7 +1,7 @@
# wadamesh language file
# canonical source - translators: edit this file and PR it
# code: cs
# ver: 26
# ver: 28
# name: Čeština
# base: cs
(device behind) (zařízení za)
@@ -2003,3 +2003,176 @@ Showing the first %d tracks Zobrazeno prvních %d skladeb
Sound is off: Settings > Sound Zvuk je vypnutý: Nastavení > Zvuk
Stopped Zastaveno
This device cannot play music. Toto zařízení neumí přehrávat hudbu.
# Settings > Device / keyboard protocol / setup wizard strings
Hardware Hardware
Display & lock Displej a zámek
Keep Bluetooth on to pair the MeshCore app on your phone. Wi-Fi can be set up anytime in Settings. Nechte Bluetooth zapnutý, abyste mohli spárovat aplikaci MeshCore v telefonu. Wi-Fi lze nastavit kdykoli v Nastavení.
Radio: Rádio:
Keyboard: Klávesnice:
newer keyboard novější klávesnice
older keyboard starší klávesnice
older keyboard (set manually) starší klávesnice (nastaveno ručně)
keyboard not detected yet klávesnice zatím nerozpoznána
Always use the external antenna (MMCX) Vždy používat externí anténu (MMCX)
Starts on the external socket at every boot. Only for an antenna that stays connected. Při každém spuštění začne na externím konektoru. Jen pro anténu, která zůstává připojená.
Only pick External with an antenna fitted to the external socket. After a reboot it starts on the on-board antenna, unless the switch below is on. Externí vyberte jen s anténou na externím konektoru. Po restartu začne na vestavěné anténě, pokud není zapnutý přepínač níže.
Always use the external antenna?\n\nThe radio will start on the external (MMCX) socket at every boot. Transmitting without an antenna attached can damage the radio.\n\nOnly turn this on if your external antenna stays connected. Vždy používat externí anténu?\n\nRádio začne při každém spuštění na externím konektoru (MMCX). Vysílání bez připojené antény může rádio poškodit.\n\nZapněte to jen tehdy, když externí anténa zůstává připojená.
Turn on Zapnout
On-board antenna selected Vybrána vestavěná anténa
External antenna at every boot Externí anténa při každém startu
Antenna Anténa
On-board Vestavěná
Glass tiles Skleněné dlaždice
Widgets, cards and panel tiles let the background show through. Off: solid tiles. Widgety, karty a dlaždice panelu nechají prosvítat pozadí. Vypnuto: plné dlaždice.
# repeater admin app
0 to 9. Higher waits longer between sends. 0 až 9. Vyšší čeká mezi odesláními déle.
A name is required Jméno je povinné
A node clock only moves forward: syncing cannot set it back. Hodiny uzlu jdou jen dopředu: synchronizace je nemůže vrátit.
A room server lists only its admins here. Room server zde uvádí jen své správce.
Access Přístup
Access changed Přístup změněn
Actions Akce
Admin password Heslo správce
Admin password changed. Heslo správce změněno.
Admin password for full control, or the room password. Heslo správce pro plnou kontrolu, nebo heslo místnosti.
Admin password for full control. A guest sees status and neighbours. Heslo správce pro plnou kontrolu. Host vidí stav a sousedy.
Advanced Pokročilé
Advert hop limit Limit skoků pro adverty
Advert intervals Intervaly advertů
Adverts Adverty
Again Znovu
Airtime factor Faktor vysílacího času
Bandwidth Šířka pásma
Change Změnit
Change radio settings Změnit nastavení rádia
Change the admin password? If you lose it you can no longer manage this node over the mesh. Změnit heslo správce? Pokud ho ztratíte, nebudete moci tento uzel spravovat přes síť.
Clients Klienti
Coding rate Kódovací poměr
Console Konzole
Current Aktuální
Decimal degrees, for example 4.4025 Desetinné stupně, například 4.4025
Decimal degrees, for example 51.2194 Desetinné stupně, například 51.2194
Direct send delay Zpoždění přímého odeslání
Discover neighbours Hledat sousedy
Duplicates Duplikáty
Enter a number Zadejte číslo
Enter a password Zadejte heslo
Error Chyba
Errors Chyby
Firmware update: the node opens a Wi-Fi access point; join it and upload the new firmware in a browser, as the node's own instructions say. Aktualizace: uzel otevře přístupový bod Wi-Fi; připojte se k němu a nahrajte nový firmware v prohlížeči podle pokynů uzlu.
Flood advert Flood advert
Flood hop limit Limit skoků pro floody
Flood send delay Zpoždění odeslání floodu
Floods with more hops are not repeated. 0 to 64. Floody s více skoky se neopakují. 0 až 64.
Frequency: 150 to 2500 MHz Frekvence: 150 až 2500 MHz
Guest Host
Guest password Heslo hosta
Hours between flood adverts: 0 (off) or 3 to 168. Hodiny mezi flood adverty: 0 (vypnuto) nebo 3 až 168.
How hard to drop packets that came back around. Jak přísně zahazovat pakety, které se vrátily dokola.
Identity Identita
Identity & location Identita a poloha
Last reply Poslední odpověď
Last signal Poslední signál
Lets a wrong or blank password in to read, not to post. Pustí dovnitř se špatným nebo prázdným heslem ke čtení, ne k psaní.
Load more (%d of %u) Načíst další (%d z %u)
Local advert Místní advert
Location Poloha
Log in Přihlásit
Log in as admin Přihlásit jako správce
Log in as guest Přihlásit jako host
Logged in as a guest: you can read the status and neighbours. Log in with the admin password to change settings. Přihlášeno jako host: můžete číst stav a sousedy. Pro změnu nastavení se přihlaste heslem správce.
Logged in without admin rights. Log in with the admin password to change settings. Přihlášeno bez práv správce. Pro změnu nastavení se přihlaste heslem správce.
Logging in... Přihlašování...
Login refused. Přihlášení odmítnuto.
Logs in as a guest. Blank lets anyone in as a guest. Up to 15 characters. Přihlásí jako hosta. Prázdné pustí kohokoli jako hosta. Až 15 znaků.
Loop detection Detekce smyček
Manage Spravovat
Members log in with it to post. Up to 15 characters. Členové se jím přihlašují, aby mohli psát. Až 15 znaků.
Minutes between zero-hop adverts: 0 (off) or 60 to 240. Minuty mezi adverty bez skoku: 0 (vypnuto) nebo 60 až 240.
Moderate Střední
Neighbours Sousedé
New password Nové heslo
Newest Nejnovější
No neighbours heard yet. Zatím nebyli slyšet žádní sousedé.
No reply Bez odpovědi
No reply from the node Uzel neodpovídá
No reply. Check the password, that the node is in range, and this device's clock. Bez odpovědi. Zkontrolujte heslo, zda je uzel v dosahu, a hodiny tohoto zařízení.
No reply. It may or may not have been applied: read it again. Bez odpovědi. Možná bylo použito, možná ne: načtěte znovu.
No spaces Bez mezer
Nobody on the list. Na seznamu nikdo není.
Node clock Hodiny uzlu
Noise floor Šumové pozadí
Not in your contacts Není ve vašich kontaktech
Not in your contacts, so only removing is possible here. Není ve vašich kontaktech, takže zde lze jen odebrat.
Not saved Neuloženo
Off: this node stops forwarding anything. Vypnuto: tento uzel přestane cokoli přeposílat.
Order Pořadí
Owner Vlastník
Owner info Info vlastníka
Password Heslo
Passwords Hesla
Passwords & access Hesla a přístup
Posts Příspěvky
Prefers stronger copies of a flood. 0 to 20. Dává přednost silnějším kopiím floodu. 0 až 20.
Queue Fronta
Random delay factor before repeating a flood. 0 to 2. Náhodný faktor zpoždění před opakováním floodu. 0 až 2.
Read again Načíst znovu
Read-only Jen čtení
Read-only access Přístup jen pro čtení
Read-write Čtení a zápis
Reading... Načítání...
Reboot sent. The node is back in about 10 s. Restart odeslán. Uzel se vrátí asi za 10 s.
Reboot the node? It is off the air for about 10 s and forgets guest logins. Restartovat uzel? Asi 10 s nebude vysílat a zapomene přihlášení hostů.
Receive delay Zpoždění příjmu
Received Přijato
Refresh Obnovit
Regions Regiony
Remove access Odebrat přístup
Remove this client's access? Odebrat přístup tohoto klienta?
Repeat packets Opakovat pakety
Repeaters this node hears directly, with the signal it hears them at. Opakovače, které tento uzel slyší přímo, se signálem, se kterým je slyší.
Repeating Opakování
Repeating & limits Opakování a limity
Reset counters Vynulovat počítadla
Reset the node's packet counters? Vynulovat počítadla paketů uzlu?
Room password Heslo místnosti
Save (after a reboot) Uložit (po restartu)
Save new radio settings?\nNow: %s\nNew: %s\nThey apply after a reboot. Wrong values can cut this node off for good. Uložit nové nastavení rádia?\nNyní: %s\nNové: %s\nPlatí po restartu. Špatné hodnoty mohou tento uzel navždy odříznout.
Saved. Applies after a reboot. Uloženo. Platí po restartu.
Saved. The node uses the new radio settings after a reboot. Reboot it now? Uloženo. Uzel použije nové nastavení rádia po restartu. Restartovat nyní?
Saving... Ukládání...
Send flood advert Odeslat flood advert
Send now Odeslat nyní
Send zero-hop advert Odeslat advert bez skoku
Set the node's position to this device's position? Nastavit polohu uzlu na polohu tohoto zařízení?
Shown to anyone who asks this node. Up to 119 characters. Zobrazí se každému, kdo se uzlu zeptá. Až 119 znaků.
Spreading factor Rozprostírací faktor
Start a firmware update on the node? It opens its own Wi-Fi access point until it is updated or rebooted, and stops repeating meanwhile. Spustit aktualizaci firmwaru na uzlu? Otevře vlastní přístupový bod Wi-Fi, dokud nebude aktualizován nebo restartován, a mezitím nic neopakuje.
Start firmware update Spustit aktualizaci firmwaru
Strict Přísná
Strongest Nejsilnější
Sync clock to this device Synchronizovat hodiny s tímto zařízením
The node's region tree: ^ marks its home region, F that it repeats floods for that region. Edit regions in the Console. Strom regionů uzlu: ^ označuje jeho domovský region, F že opakuje floody pro tento region. Regiony upravujte v Konzoli.
The passwords do not match Hesla se neshodují
The position goes out in the node's adverts. Poloha se posílá v advertech uzlu.
The same for direct packets. 0 to 2. Totéž pro přímé pakety. 0 až 2.
The same limit for adverts. 0 to 64. Stejný limit pro adverty. 0 až 64.
This device Toto zařízení
This device has no position Toto zařízení nemá polohu
Transmit power Vysílací výkon
Try Zkusit
Try for 10 minutes Zkusit na 10 minut
Try new radio settings for %u minutes?\nNow: %s\nTry: %s\nThe node goes back by itself. Until then you reach it only on the new settings. Zkusit nové nastavení rádia na %u minut?\nNyní: %s\nZkouška: %s\nUzel se vrátí sám. Do té doby ho zastihnete jen na novém nastavení.
Up to 31 characters, without [ ] \\ : , ? * Až 31 znaků, bez [ ] \\ : , ? *
Updated %s ago Aktualizováno před %s
Uptime Doba běhu
Use my position Použít mou polohu
Use this device's settings Použít nastavení tohoto zařízení
Wrong radio settings can cut this node off: you then reach it only on the new settings, or not at all. Try them first; the node goes back by itself. Špatné nastavení rádia může tento uzel odříznout: zastihnete ho pak jen na novém nastavení, nebo vůbec. Nejdřív ho zkuste; uzel se vrátí sám.
dBm, -9 to 30. Applies at once. dBm, -9 až 30. Platí ihned.
pushed odesláno
you vy
Flood in / out Flood příchozí / odchozí
Direct in / out Přímé příchozí / odchozí
Airtime TX / RX Vysílací čas TX / RX
+175 -1
View File
@@ -1,7 +1,7 @@
# wadamesh language file
# canonical source - translators: edit this file and PR it
# code: de
# ver: 26
# ver: 28
# name: Deutsch
# base: de
(device behind) (Gerät geht nach)
@@ -1984,3 +1984,177 @@ Showing the first %d tracks Die ersten %d Titel werden gezeigt
Sound is off: Settings > Sound Ton ist aus: Einstellungen > Ton
Stopped Gestoppt
This device cannot play music. Dieses Gerät kann keine Musik abspielen.
# Settings > Device / keyboard protocol / setup wizard strings
Hardware Hardware
Display & lock Anzeige & Sperre
Keep Bluetooth on to pair the MeshCore app on your phone. Wi-Fi can be set up anytime in Settings. Lass Bluetooth an, um die MeshCore-App auf deinem Handy zu koppeln. WLAN kannst du jederzeit in den Einstellungen einrichten.
Radio: Funkmodul:
Keyboard: Tastatur:
newer keyboard neuere Tastatur
older keyboard ältere Tastatur
older keyboard (set manually) ältere Tastatur (manuell gesetzt)
keyboard not detected yet Tastatur noch nicht erkannt
Always use the external antenna (MMCX) Immer die externe Antenne nutzen (MMCX)
Starts on the external socket at every boot. Only for an antenna that stays connected. Startet bei jedem Booten an der externen Buchse. Nur für eine Antenne, die dauerhaft angeschlossen bleibt.
Only pick External with an antenna fitted to the external socket. After a reboot it starts on the on-board antenna, unless the switch below is on. Extern nur wählen, wenn eine Antenne an der externen Buchse steckt. Nach einem Neustart läuft es über die interne Antenne, außer der Schalter unten ist an.
Always use the external antenna?\n\nThe radio will start on the external (MMCX) socket at every boot. Transmitting without an antenna attached can damage the radio.\n\nOnly turn this on if your external antenna stays connected. Immer die externe Antenne nutzen?\n\nDas Funkmodul startet bei jedem Booten an der externen Buchse (MMCX). Senden ohne angeschlossene Antenne kann das Funkmodul beschädigen.\n\nNur einschalten, wenn deine externe Antenne angeschlossen bleibt.
Turn on Einschalten
On-board antenna selected Interne Antenne gewählt
External antenna at every boot Externe Antenne bei jedem Start
Antenna Antenne
On-board Intern
Glass tiles Glas-Kacheln
Widgets, cards and panel tiles let the background show through. Off: solid tiles. Widgets, Karten und Kacheln im Kontrollfeld lassen den Hintergrund durchscheinen. Aus: deckende Kacheln.
# repeater admin app
0 to 9. Higher waits longer between sends. 0 bis 9. Höher wartet länger zwischen Sendungen.
A name is required Ein Name ist nötig
A node clock only moves forward: syncing cannot set it back. Die Uhr eines Knotens läuft nur vorwärts: Synchronisieren kann sie nicht zurückstellen.
A room server lists only its admins here. Ein Room-Server listet hier nur seine Admins.
Access Zugang
Access changed Zugang geändert
Actions Aktionen
Admin password Admin-Passwort
Admin password changed. Admin-Passwort geändert.
Admin password for full control, or the room password. Admin-Passwort für volle Kontrolle, oder das Raum-Passwort.
Admin password for full control. A guest sees status and neighbours. Admin-Passwort für volle Kontrolle. Ein Gast sieht Status und Nachbarn.
Advanced Erweitert
Advert hop limit Hop-Limit für Adverts
Advert intervals Advert-Intervalle
Adverts Adverts
Again Wiederholen
Airtime factor Sendezeit-Faktor
Bandwidth Bandbreite
Change Ändern
Change radio settings Funkeinstellungen ändern
Change the admin password? If you lose it you can no longer manage this node over the mesh. Admin-Passwort ändern? Geht es verloren, kannst du diesen Knoten nicht mehr über das Mesh verwalten.
Clients Clients
Coding rate Coding-Rate
Console Konsole
Current Aktuell
Decimal degrees, for example 4.4025 Dezimalgrad, zum Beispiel 4.4025
Decimal degrees, for example 51.2194 Dezimalgrad, zum Beispiel 51.2194
Direct send delay Sendeverzögerung direkt
Discover neighbours Nachbarn suchen
Duplicates Duplikate
Enter a number Gib eine Zahl ein
Enter a password Gib ein Passwort ein
Error Fehler
Errors Fehler
Firmware update: the node opens a Wi-Fi access point; join it and upload the new firmware in a browser, as the node's own instructions say. Firmware-Update: Der Knoten öffnet einen WLAN-Zugangspunkt; verbinde dich damit und lade die neue Firmware im Browser hoch, wie es die Anweisungen des Knotens sagen.
Flood advert Flood-Advert
Flood hop limit Hop-Limit für Floods
Flood send delay Sendeverzögerung Flood
Floods with more hops are not repeated. 0 to 64. Floods mit mehr Hops werden nicht wiederholt. 0 bis 64.
Frequency: 150 to 2500 MHz Frequenz: 150 bis 2500 MHz
Guest Gast
Guest password Gast-Passwort
Hours between flood adverts: 0 (off) or 3 to 168. Stunden zwischen Flood-Adverts: 0 (aus) oder 3 bis 168.
How hard to drop packets that came back around. Wie streng Pakete verworfen werden, die im Kreis zurückkamen.
Identity Identität
Identity & location Identität & Standort
Last reply Letzte Antwort
Last signal Letztes Signal
Lets a wrong or blank password in to read, not to post. Lässt ein falsches oder leeres Passwort zum Lesen herein, nicht zum Posten.
Load more (%d of %u) Mehr laden (%d von %u)
Local advert Lokales Advert
Location Standort
Log in Anmelden
Log in as admin Als Admin anmelden
Log in as guest Als Gast anmelden
Logged in as a guest: you can read the status and neighbours. Log in with the admin password to change settings. Als Gast angemeldet: Du kannst Status und Nachbarn lesen. Melde dich mit dem Admin-Passwort an, um Einstellungen zu ändern.
Logged in without admin rights. Log in with the admin password to change settings. Ohne Admin-Rechte angemeldet. Melde dich mit dem Admin-Passwort an, um Einstellungen zu ändern.
Logging in... Anmeldung läuft...
Login refused. Anmeldung abgelehnt.
Logs in as a guest. Blank lets anyone in as a guest. Up to 15 characters. Meldet als Gast an. Leer lässt jeden als Gast herein. Bis zu 15 Zeichen.
Loop detection Schleifenerkennung
Manage Verwalten
Members log in with it to post. Up to 15 characters. Mitglieder melden sich damit an, um zu posten. Bis zu 15 Zeichen.
Minutes between zero-hop adverts: 0 (off) or 60 to 240. Minuten zwischen Zero-Hop-Adverts: 0 (aus) oder 60 bis 240.
Moderate Mittel
Neighbours Nachbarn
New password Neues Passwort
Newest Neueste
No neighbours heard yet. Noch keine Nachbarn gehört.
No reply Keine Antwort
No reply from the node Keine Antwort vom Knoten
No reply. Check the password, that the node is in range, and this device's clock. Keine Antwort. Prüfe das Passwort, ob der Knoten in Reichweite ist, und die Uhr dieses Geräts.
No reply. It may or may not have been applied: read it again. Keine Antwort. Vielleicht wurde es übernommen, vielleicht nicht: lies es erneut.
No spaces Keine Leerzeichen
Nobody on the list. Niemand auf der Liste.
Node clock Uhr des Knotens
Noise floor Grundrauschen
Not in your contacts Nicht in deinen Kontakten
Not in your contacts, so only removing is possible here. Nicht in deinen Kontakten, daher ist hier nur Entfernen möglich.
Not saved Nicht gespeichert
Off: this node stops forwarding anything. Aus: Dieser Knoten leitet nichts mehr weiter.
Order Reihenfolge
Owner Besitzer
Owner info Besitzer-Info
Password Passwort
Passwords Passwörter
Passwords & access Passwörter & Zugang
Posts Beiträge
Prefers stronger copies of a flood. 0 to 20. Bevorzugt stärkere Kopien eines Floods. 0 bis 20.
Queue Warteschlange
Random delay factor before repeating a flood. 0 to 2. Zufälliger Verzögerungsfaktor vor dem Wiederholen eines Floods. 0 bis 2.
Read again Erneut lesen
Read-only Nur lesen
Read-only access Nur-Lese-Zugang
Read-write Lesen und schreiben
Reading... Wird gelesen...
Reboot sent. The node is back in about 10 s. Neustart gesendet. Der Knoten ist in etwa 10 s zurück.
Reboot the node? It is off the air for about 10 s and forgets guest logins. Knoten neu starten? Er ist etwa 10 s nicht erreichbar und vergisst Gast-Anmeldungen.
Receive delay Empfangsverzögerung
Received Empfangen
Refresh Aktualisieren
Regions Regionen
Remove access Zugang entfernen
Remove this client's access? Den Zugang dieses Clients entfernen?
Repeat packets Pakete wiederholen
Repeaters this node hears directly, with the signal it hears them at. Repeater, die dieser Knoten direkt hört, mit dem Signal, mit dem er sie hört.
Repeating Wiederholen
Repeating & limits Wiederholen & Limits
Reset counters Zähler zurücksetzen
Reset the node's packet counters? Die Paketzähler des Knotens zurücksetzen?
Room password Raum-Passwort
Save (after a reboot) Speichern (nach Neustart)
Save new radio settings?\nNow: %s\nNew: %s\nThey apply after a reboot. Wrong values can cut this node off for good. Neue Funkeinstellungen speichern?\nJetzt: %s\nNeu: %s\nSie gelten nach einem Neustart. Falsche Werte können diesen Knoten für immer abschneiden.
Saved. Applies after a reboot. Gespeichert. Gilt nach einem Neustart.
Saved. The node uses the new radio settings after a reboot. Reboot it now? Gespeichert. Der Knoten nutzt die neuen Funkeinstellungen nach einem Neustart. Jetzt neu starten?
Saving... Wird gespeichert...
Send flood advert Flood-Advert senden
Send now Jetzt senden
Send zero-hop advert Zero-Hop-Advert senden
Set the node's position to this device's position? Die Position des Knotens auf die Position dieses Geräts setzen?
Shown to anyone who asks this node. Up to 119 characters. Wird jedem gezeigt, der diesen Knoten fragt. Bis zu 119 Zeichen.
Spreading factor Spreizfaktor
Start a firmware update on the node? It opens its own Wi-Fi access point until it is updated or rebooted, and stops repeating meanwhile. Ein Firmware-Update auf dem Knoten starten? Er öffnet einen eigenen WLAN-Zugangspunkt, bis er aktualisiert oder neu gestartet ist, und wiederholt so lange nichts.
Start firmware update Firmware-Update starten
Status Status
Strict Streng
Strongest Stärkste
Sync clock to this device Uhr mit diesem Gerät abgleichen
The node's region tree: ^ marks its home region, F that it repeats floods for that region. Edit regions in the Console. Der Regionsbaum des Knotens: ^ markiert seine Heimatregion, F dass er Floods für diese Region wiederholt. Regionen bearbeitest du in der Konsole.
The passwords do not match Die Passwörter stimmen nicht überein
The position goes out in the node's adverts. Die Position wird in den Adverts des Knotens gesendet.
The same for direct packets. 0 to 2. Dasselbe für direkte Pakete. 0 bis 2.
The same limit for adverts. 0 to 64. Dasselbe Limit für Adverts. 0 bis 64.
This device Dieses Gerät
This device has no position Dieses Gerät hat keine Position
Transmit power Sendeleistung
Try Testen
Try for 10 minutes 10 Minuten testen
Try new radio settings for %u minutes?\nNow: %s\nTry: %s\nThe node goes back by itself. Until then you reach it only on the new settings. Neue Funkeinstellungen %u Minuten lang testen?\nJetzt: %s\nTest: %s\nDer Knoten wechselt von selbst zurück. Bis dahin erreichst du ihn nur mit den neuen Einstellungen.
Up to 31 characters, without [ ] \\ : , ? * Bis zu 31 Zeichen, ohne [ ] \\ : , ? *
Updated %s ago Vor %s aktualisiert
Uptime Laufzeit
Use my position Meine Position verwenden
Use this device's settings Einstellungen dieses Geräts verwenden
Wrong radio settings can cut this node off: you then reach it only on the new settings, or not at all. Try them first; the node goes back by itself. Falsche Funkeinstellungen können diesen Knoten abschneiden: Dann erreichst du ihn nur mit den neuen Einstellungen oder gar nicht. Teste sie zuerst; der Knoten wechselt von selbst zurück.
dBm, -9 to 30. Applies at once. dBm, -9 bis 30. Gilt sofort.
pushed gepusht
you du
Flood in / out Flood ein / aus
Direct in / out Direkt ein / aus
Airtime TX / RX Sendezeit TX / RX
+174 -1
View File
@@ -1,7 +1,7 @@
# wadamesh language file
# canonical source - translators: edit this file and PR it
# code: el
# ver: 26
# ver: 28
# name: Ελληνικά
# base: el
(device behind) (συσκευή πίσω)
@@ -1987,3 +1987,176 @@ Showing the first %d tracks Εμφανίζονται τα πρώτα %d κομμ
Sound is off: Settings > Sound Ο ήχος είναι κλειστός: Ρυθμίσεις > Ήχος
Stopped Σταμάτησε
This device cannot play music. Αυτή η συσκευή δεν μπορεί να παίξει μουσική.
# Settings > Device / keyboard protocol / setup wizard strings
Hardware Υλικό
Display & lock Οθόνη & κλείδωμα
Keep Bluetooth on to pair the MeshCore app on your phone. Wi-Fi can be set up anytime in Settings. Αφήστε το Bluetooth ενεργό για να συνδέσετε την εφαρμογή MeshCore στο τηλέφωνό σας. Το Wi-Fi ρυθμίζεται οποτεδήποτε από τις Ρυθμίσεις.
Radio: Πομποδέκτης:
Keyboard: Πληκτρολόγιο:
newer keyboard νεότερο πληκτρολόγιο
older keyboard παλαιότερο πληκτρολόγιο
older keyboard (set manually) παλαιότερο πληκτρολόγιο (χειροκίνητα)
keyboard not detected yet το πληκτρολόγιο δεν έχει εντοπιστεί ακόμα
Always use the external antenna (MMCX) Πάντα η εξωτερική κεραία (MMCX)
Starts on the external socket at every boot. Only for an antenna that stays connected. Ξεκινά στην εξωτερική υποδοχή σε κάθε εκκίνηση. Μόνο για κεραία που μένει συνδεδεμένη.
Only pick External with an antenna fitted to the external socket. After a reboot it starts on the on-board antenna, unless the switch below is on. Επιλέξτε Εξωτερική μόνο με κεραία στην εξωτερική υποδοχή. Μετά από επανεκκίνηση ξεκινά στην ενσωματωμένη κεραία, εκτός αν ο διακόπτης παρακάτω είναι ενεργός.
Always use the external antenna?\n\nThe radio will start on the external (MMCX) socket at every boot. Transmitting without an antenna attached can damage the radio.\n\nOnly turn this on if your external antenna stays connected. Πάντα η εξωτερική κεραία;\n\nΟ πομποδέκτης θα ξεκινά στην εξωτερική υποδοχή (MMCX) σε κάθε εκκίνηση. Η εκπομπή χωρίς συνδεδεμένη κεραία μπορεί να καταστρέψει τον πομποδέκτη.\n\nΕνεργοποιήστε το μόνο αν η εξωτερική κεραία μένει συνδεδεμένη.
Turn on Ενεργοποίηση
On-board antenna selected Επιλέχθηκε η ενσωματωμένη κεραία
External antenna at every boot Εξωτερική κεραία σε κάθε εκκίνηση
Antenna Κεραία
On-board Ενσωμ.
Glass tiles Γυάλινα πλακίδια
Widgets, cards and panel tiles let the background show through. Off: solid tiles. Τα widget, οι κάρτες και τα πλακίδια του πίνακα αφήνουν να φαίνεται το φόντο. Ανενεργό: συμπαγή πλακίδια.
# repeater admin app
0 to 9. Higher waits longer between sends. 0 έως 9. Μεγαλύτερο σημαίνει μεγαλύτερη αναμονή μεταξύ αποστολών.
A name is required Απαιτείται όνομα
A node clock only moves forward: syncing cannot set it back. Το ρολόι ενός κόμβου πάει μόνο μπροστά: ο συγχρονισμός δεν μπορεί να το γυρίσει πίσω.
A room server lists only its admins here. Ένας room server εμφανίζει εδώ μόνο τους διαχειριστές του.
Access Πρόσβαση
Access changed Η πρόσβαση άλλαξε
Actions Ενέργειες
Admin password Κωδικός διαχειριστή
Admin password changed. Ο κωδικός διαχειριστή άλλαξε.
Admin password for full control, or the room password. Κωδικός διαχειριστή για πλήρη έλεγχο, ή ο κωδικός του δωματίου.
Admin password for full control. A guest sees status and neighbours. Κωδικός διαχειριστή για πλήρη έλεγχο. Ένας επισκέπτης βλέπει κατάσταση και γείτονες.
Advanced Για προχωρημένους
Advert hop limit Όριο αλμάτων για adverts
Advert intervals Διαστήματα advert
Adverts Adverts
Again Ξανά
Airtime factor Συντελεστής χρόνου εκπομπής
Bandwidth Εύρος ζώνης
Change Αλλαγή
Change radio settings Αλλαγή ρυθμίσεων ραδιοφώνου
Change the admin password? If you lose it you can no longer manage this node over the mesh. Αλλαγή κωδικού διαχειριστή; Αν τον χάσετε, δεν θα μπορείτε πια να διαχειριστείτε αυτόν τον κόμβο μέσω του δικτύου.
Clients Πελάτες
Coding rate Ρυθμός κωδικοποίησης
Console Κονσόλα
Current Τρέχον
Decimal degrees, for example 4.4025 Δεκαδικές μοίρες, για παράδειγμα 4.4025
Decimal degrees, for example 51.2194 Δεκαδικές μοίρες, για παράδειγμα 51.2194
Direct send delay Καθυστέρηση άμεσης αποστολής
Discover neighbours Αναζήτηση γειτόνων
Duplicates Διπλότυπα
Enter a number Εισαγάγετε αριθμό
Enter a password Εισαγάγετε κωδικό
Error Σφάλμα
Errors Σφάλματα
Firmware update: the node opens a Wi-Fi access point; join it and upload the new firmware in a browser, as the node's own instructions say. Ενημέρωση: ο κόμβος ανοίγει σημείο πρόσβασης Wi-Fi· συνδεθείτε και ανεβάστε το νέο υλικολογισμικό από φυλλομετρητή, όπως λένε οι οδηγίες του κόμβου.
Flood advert Flood advert
Flood hop limit Όριο αλμάτων για floods
Flood send delay Καθυστέρηση αποστολής flood
Floods with more hops are not repeated. 0 to 64. Τα floods με περισσότερα άλματα δεν επαναλαμβάνονται. 0 έως 64.
Frequency: 150 to 2500 MHz Συχνότητα: 150 έως 2500 MHz
Guest Επισκέπτης
Guest password Κωδικός επισκέπτη
Hours between flood adverts: 0 (off) or 3 to 168. Ώρες μεταξύ flood adverts: 0 (ανενεργό) ή 3 έως 168.
How hard to drop packets that came back around. Πόσο αυστηρά απορρίπτονται πακέτα που γύρισαν κυκλικά.
Identity Ταυτότητα
Identity & location Ταυτότητα και τοποθεσία
Last reply Τελευταία απάντηση
Last signal Τελευταίο σήμα
Lets a wrong or blank password in to read, not to post. Αφήνει να μπει με λάθος ή κενό κωδικό για ανάγνωση, όχι για δημοσίευση.
Load more (%d of %u) Φόρτωση περισσότερων (%d από %u)
Local advert Τοπικό advert
Location Τοποθεσία
Log in Σύνδεση
Log in as admin Σύνδεση ως διαχειριστής
Log in as guest Σύνδεση ως επισκέπτης
Logged in as a guest: you can read the status and neighbours. Log in with the admin password to change settings. Συνδεθήκατε ως επισκέπτης: βλέπετε κατάσταση και γείτονες. Συνδεθείτε με τον κωδικό διαχειριστή για να αλλάξετε ρυθμίσεις.
Logged in without admin rights. Log in with the admin password to change settings. Συνδεθήκατε χωρίς δικαιώματα διαχειριστή. Συνδεθείτε με τον κωδικό διαχειριστή για να αλλάξετε ρυθμίσεις.
Logging in... Σύνδεση...
Login refused. Η σύνδεση απορρίφθηκε.
Logs in as a guest. Blank lets anyone in as a guest. Up to 15 characters. Σύνδεση ως επισκέπτης. Κενός αφήνει οποιονδήποτε ως επισκέπτη. Έως 15 χαρακτήρες.
Loop detection Ανίχνευση βρόχων
Manage Διαχείριση
Members log in with it to post. Up to 15 characters. Τα μέλη συνδέονται με αυτόν για να δημοσιεύουν. Έως 15 χαρακτήρες.
Minutes between zero-hop adverts: 0 (off) or 60 to 240. Λεπτά μεταξύ zero-hop adverts: 0 (ανενεργό) ή 60 έως 240.
Moderate Μέτρια
Neighbours Γείτονες
New password Νέος κωδικός
Newest Νεότεροι
No neighbours heard yet. Δεν έχουν ακουστεί γείτονες ακόμα.
No reply Καμία απάντηση
No reply from the node Ο κόμβος δεν απαντά
No reply. Check the password, that the node is in range, and this device's clock. Καμία απάντηση. Ελέγξτε τον κωδικό, ότι ο κόμβος είναι εντός εμβέλειας, και το ρολόι αυτής της συσκευής.
No reply. It may or may not have been applied: read it again. Καμία απάντηση. Ίσως εφαρμόστηκε, ίσως όχι: διαβάστε το ξανά.
No spaces Χωρίς κενά
Nobody on the list. Κανείς στη λίστα.
Node clock Ρολόι κόμβου
Noise floor Επίπεδο θορύβου
Not in your contacts Δεν είναι στις επαφές σας
Not in your contacts, so only removing is possible here. Δεν είναι στις επαφές σας, οπότε εδώ μπορεί μόνο να αφαιρεθεί.
Not saved Δεν αποθηκεύτηκε
Off: this node stops forwarding anything. Ανενεργό: ο κόμβος σταματά να προωθεί οτιδήποτε.
Order Σειρά
Owner Ιδιοκτήτης
Owner info Πληροφορίες ιδιοκτήτη
Password Κωδικός
Passwords Κωδικοί
Passwords & access Κωδικοί και πρόσβαση
Posts Αναρτήσεις
Prefers stronger copies of a flood. 0 to 20. Προτιμά τα ισχυρότερα αντίγραφα ενός flood. 0 έως 20.
Queue Ουρά
Random delay factor before repeating a flood. 0 to 2. Τυχαίος συντελεστής καθυστέρησης πριν από επανάληψη flood. 0 έως 2.
Read again Ανάγνωση ξανά
Read-only Μόνο ανάγνωση
Read-only access Πρόσβαση μόνο ανάγνωσης
Read-write Ανάγνωση και εγγραφή
Reading... Ανάγνωση...
Reboot sent. The node is back in about 10 s. Η επανεκκίνηση στάλθηκε. Ο κόμβος επιστρέφει σε περίπου 10 s.
Reboot the node? It is off the air for about 10 s and forgets guest logins. Επανεκκίνηση του κόμβου; Μένει εκτός αέρα περίπου 10 s και ξεχνά τις συνδέσεις επισκεπτών.
Receive delay Καθυστέρηση λήψης
Received Ελήφθησαν
Refresh Ανανέωση
Regions Περιοχές
Remove access Αφαίρεση πρόσβασης
Remove this client's access? Αφαίρεση της πρόσβασης αυτού του πελάτη;
Repeat packets Επανάληψη πακέτων
Repeaters this node hears directly, with the signal it hears them at. Αναμεταδότες που ακούει απευθείας αυτός ο κόμβος, με το σήμα που τους ακούει.
Repeating Επανάληψη
Repeating & limits Επανάληψη και όρια
Reset counters Μηδενισμός μετρητών
Reset the node's packet counters? Μηδενισμός των μετρητών πακέτων του κόμβου;
Room password Κωδικός δωματίου
Save (after a reboot) Αποθήκευση (μετά από επανεκκίνηση)
Save new radio settings?\nNow: %s\nNew: %s\nThey apply after a reboot. Wrong values can cut this node off for good. Αποθήκευση νέων ρυθμίσεων ραδιοφώνου;\nΤώρα: %s\nΝέες: %s\nΙσχύουν μετά από επανεκκίνηση. Λάθος τιμές μπορούν να αποκόψουν οριστικά αυτόν τον κόμβο.
Saved. Applies after a reboot. Αποθηκεύτηκε. Ισχύει μετά από επανεκκίνηση.
Saved. The node uses the new radio settings after a reboot. Reboot it now? Αποθηκεύτηκε. Ο κόμβος χρησιμοποιεί τις νέες ρυθμίσεις μετά από επανεκκίνηση. Επανεκκίνηση τώρα;
Saving... Αποθήκευση...
Send flood advert Αποστολή flood advert
Send now Αποστολή τώρα
Send zero-hop advert Αποστολή zero-hop advert
Set the node's position to this device's position? Ορισμός της θέσης του κόμβου στη θέση αυτής της συσκευής;
Shown to anyone who asks this node. Up to 119 characters. Εμφανίζεται σε όποιον ρωτήσει αυτόν τον κόμβο. Έως 119 χαρακτήρες.
Spreading factor Συντελεστής διασποράς
Start a firmware update on the node? It opens its own Wi-Fi access point until it is updated or rebooted, and stops repeating meanwhile. Έναρξη ενημέρωσης υλικολογισμικού στον κόμβο; Ανοίγει δικό του σημείο πρόσβασης Wi-Fi μέχρι να ενημερωθεί ή να επανεκκινηθεί, και στο μεταξύ δεν επαναλαμβάνει τίποτα.
Start firmware update Έναρξη ενημέρωσης υλικολογισμικού
Strict Αυστηρή
Strongest Ισχυρότεροι
Sync clock to this device Συγχρονισμός ρολογιού με αυτή τη συσκευή
The node's region tree: ^ marks its home region, F that it repeats floods for that region. Edit regions in the Console. Το δέντρο περιοχών του κόμβου: το ^ σημειώνει την οικεία περιοχή του, το F ότι επαναλαμβάνει floods για την περιοχή. Επεξεργαστείτε τις περιοχές στην Κονσόλα.
The passwords do not match Οι κωδικοί δεν ταιριάζουν
The position goes out in the node's adverts. Η θέση στέλνεται στα adverts του κόμβου.
The same for direct packets. 0 to 2. Το ίδιο για άμεσα πακέτα. 0 έως 2.
The same limit for adverts. 0 to 64. Το ίδιο όριο για adverts. 0 έως 64.
This device Αυτή η συσκευή
This device has no position Αυτή η συσκευή δεν έχει θέση
Transmit power Ισχύς εκπομπής
Try Δοκιμή
Try for 10 minutes Δοκιμή για 10 λεπτά
Try new radio settings for %u minutes?\nNow: %s\nTry: %s\nThe node goes back by itself. Until then you reach it only on the new settings. Δοκιμή νέων ρυθμίσεων ραδιοφώνου για %u λεπτά;\nΤώρα: %s\nΔοκιμή: %s\nΟ κόμβος επιστρέφει μόνος του. Ως τότε τον βρίσκετε μόνο με τις νέες ρυθμίσεις.
Up to 31 characters, without [ ] \\ : , ? * Έως 31 χαρακτήρες, χωρίς [ ] \\ : , ? *
Updated %s ago Ενημερώθηκε πριν από %s
Uptime Χρόνος λειτουργίας
Use my position Χρήση της θέσης μου
Use this device's settings Χρήση των ρυθμίσεων αυτής της συσκευής
Wrong radio settings can cut this node off: you then reach it only on the new settings, or not at all. Try them first; the node goes back by itself. Λάθος ρυθμίσεις ραδιοφώνου μπορούν να αποκόψουν τον κόμβο: τότε τον βρίσκετε μόνο με τις νέες ρυθμίσεις, ή καθόλου. Δοκιμάστε τες πρώτα· ο κόμβος επιστρέφει μόνος του.
dBm, -9 to 30. Applies at once. dBm, -9 έως 30. Ισχύει αμέσως.
pushed προωθήθηκαν
you εσείς
Flood in / out Flood εισ. / εξ.
Direct in / out Άμεσα εισ. / εξ.
Airtime TX / RX Χρόνος εκπομπής TX / RX
+174 -1
View File
@@ -1,7 +1,7 @@
# wadamesh language file
# canonical source - translators: edit this file and PR it
# code: es
# ver: 26
# ver: 28
# name: Español
# base: es
(device behind) (dispositivo atrasado)
@@ -1987,3 +1987,176 @@ Showing the first %d tracks Se muestran las primeras %d pistas
Sound is off: Settings > Sound El sonido está apagado: Ajustes > Sonido
Stopped Detenido
This device cannot play music. Este dispositivo no puede reproducir música.
# Settings > Device / keyboard protocol / setup wizard strings
Hardware Hardware
Display & lock Pantalla y bloqueo
Keep Bluetooth on to pair the MeshCore app on your phone. Wi-Fi can be set up anytime in Settings. Deja el Bluetooth activado para emparejar la app MeshCore de tu teléfono. El Wi-Fi se puede configurar en cualquier momento en Ajustes.
Radio: Radio:
Keyboard: Teclado:
newer keyboard teclado nuevo
older keyboard teclado antiguo
older keyboard (set manually) teclado antiguo (ajustado a mano)
keyboard not detected yet teclado aún no detectado
Always use the external antenna (MMCX) Usar siempre la antena externa (MMCX)
Starts on the external socket at every boot. Only for an antenna that stays connected. Arranca en el conector externo en cada inicio. Solo para una antena que queda conectada.
Only pick External with an antenna fitted to the external socket. After a reboot it starts on the on-board antenna, unless the switch below is on. Elige Externa solo con una antena puesta en el conector externo. Tras reiniciar arranca en la antena integrada, salvo que el interruptor de abajo esté activado.
Always use the external antenna?\n\nThe radio will start on the external (MMCX) socket at every boot. Transmitting without an antenna attached can damage the radio.\n\nOnly turn this on if your external antenna stays connected. ¿Usar siempre la antena externa?\n\nLa radio arrancará en el conector externo (MMCX) en cada inicio. Transmitir sin una antena conectada puede dañar la radio.\n\nActívalo solo si tu antena externa queda conectada.
Turn on Activar
On-board antenna selected Antena integrada seleccionada
External antenna at every boot Antena externa en cada inicio
Antenna Antena
On-board Integrada
Glass tiles Mosaicos de cristal
Widgets, cards and panel tiles let the background show through. Off: solid tiles. Los widgets, tarjetas y mosaicos del panel dejan ver el fondo. Apagado: mosaicos sólidos.
# repeater admin app
0 to 9. Higher waits longer between sends. 0 a 9. Más alto espera más entre envíos.
A name is required Hace falta un nombre
A node clock only moves forward: syncing cannot set it back. El reloj de un nodo solo avanza: sincronizar no puede atrasarlo.
A room server lists only its admins here. Un servidor de sala solo lista aquí a sus administradores.
Access Acceso
Access changed Acceso cambiado
Actions Acciones
Admin password Contraseña de administrador
Admin password changed. Contraseña de administrador cambiada.
Admin password for full control, or the room password. Contraseña de administrador para el control total, o la contraseña de la sala.
Admin password for full control. A guest sees status and neighbours. Contraseña de administrador para el control total. Un invitado ve el estado y los vecinos.
Advanced Avanzado
Advert hop limit Límite de saltos de anuncios
Advert intervals Intervalos de anuncio
Adverts Anuncios
Again Otra vez
Airtime factor Factor de tiempo en el aire
Bandwidth Ancho de banda
Change Cambiar
Change radio settings Cambiar ajustes de radio
Change the admin password? If you lose it you can no longer manage this node over the mesh. ¿Cambiar la contraseña de administrador? Si la pierdes, ya no podrás gestionar este nodo por la malla.
Clients Clientes
Coding rate Tasa de codificación
Console Consola
Current Actual
Decimal degrees, for example 4.4025 Grados decimales, por ejemplo 4.4025
Decimal degrees, for example 51.2194 Grados decimales, por ejemplo 51.2194
Direct send delay Retardo de envío directo
Discover neighbours Buscar vecinos
Duplicates Duplicados
Enter a number Introduce un número
Enter a password Introduce una contraseña
Error Error
Errors Errores
Firmware update: the node opens a Wi-Fi access point; join it and upload the new firmware in a browser, as the node's own instructions say. Actualización: el nodo abre un punto de acceso Wi-Fi; conéctate y sube el nuevo firmware en un navegador, como dicen las instrucciones del nodo.
Flood advert Anuncio flood
Flood hop limit Límite de saltos de floods
Flood send delay Retardo de envío flood
Floods with more hops are not repeated. 0 to 64. Los floods con más saltos no se repiten. 0 a 64.
Frequency: 150 to 2500 MHz Frecuencia: 150 a 2500 MHz
Guest Invitado
Guest password Contraseña de invitado
Hours between flood adverts: 0 (off) or 3 to 168. Horas entre anuncios flood: 0 (apagado) o 3 a 168.
How hard to drop packets that came back around. Con qué rigor se descartan los paquetes que vuelven en bucle.
Identity Identidad
Identity & location Identidad y ubicación
Last reply Última respuesta
Last signal Última señal
Lets a wrong or blank password in to read, not to post. Deja entrar con una contraseña errónea o vacía para leer, no para publicar.
Load more (%d of %u) Cargar más (%d de %u)
Local advert Anuncio local
Location Ubicación
Log in Iniciar sesión
Log in as admin Entrar como administrador
Log in as guest Entrar como invitado
Logged in as a guest: you can read the status and neighbours. Log in with the admin password to change settings. Sesión de invitado: puedes leer el estado y los vecinos. Entra con la contraseña de administrador para cambiar ajustes.
Logged in without admin rights. Log in with the admin password to change settings. Sesión sin derechos de administrador. Entra con la contraseña de administrador para cambiar ajustes.
Logging in... Iniciando sesión...
Login refused. Inicio de sesión rechazado.
Logs in as a guest. Blank lets anyone in as a guest. Up to 15 characters. Entra como invitado. Vacía deja entrar a cualquiera como invitado. Hasta 15 caracteres.
Loop detection Detección de bucles
Manage Gestionar
Members log in with it to post. Up to 15 characters. Los miembros entran con ella para publicar. Hasta 15 caracteres.
Minutes between zero-hop adverts: 0 (off) or 60 to 240. Minutos entre anuncios de cero saltos: 0 (apagado) o 60 a 240.
Moderate Moderada
Neighbours Vecinos
New password Nueva contraseña
Newest Más recientes
No neighbours heard yet. Aún no se ha oído ningún vecino.
No reply Sin respuesta
No reply from the node El nodo no responde
No reply. Check the password, that the node is in range, and this device's clock. Sin respuesta. Comprueba la contraseña, que el nodo esté al alcance y el reloj de este dispositivo.
No reply. It may or may not have been applied: read it again. Sin respuesta. Puede que se haya aplicado o no: vuelve a leerlo.
No spaces Sin espacios
Nobody on the list. Nadie en la lista.
Node clock Reloj del nodo
Noise floor Ruido de fondo
Not in your contacts No está en tus contactos
Not in your contacts, so only removing is possible here. No está en tus contactos, así que aquí solo se puede quitar.
Not saved No guardado
Off: this node stops forwarding anything. Apagado: este nodo deja de reenviar nada.
Order Orden
Owner Propietario
Owner info Info del propietario
Password Contraseña
Passwords Contraseñas
Passwords & access Contraseñas y acceso
Posts Mensajes
Prefers stronger copies of a flood. 0 to 20. Prefiere las copias más fuertes de un flood. 0 a 20.
Queue Cola
Random delay factor before repeating a flood. 0 to 2. Factor de retardo aleatorio antes de repetir un flood. 0 a 2.
Read again Volver a leer
Read-only Solo lectura
Read-only access Acceso de solo lectura
Read-write Lectura y escritura
Reading... Leyendo...
Reboot sent. The node is back in about 10 s. Reinicio enviado. El nodo vuelve en unos 10 s.
Reboot the node? It is off the air for about 10 s and forgets guest logins. ¿Reiniciar el nodo? Queda fuera del aire unos 10 s y olvida las sesiones de invitado.
Receive delay Retardo de recepción
Received Recibidos
Refresh Actualizar
Regions Regiones
Remove access Quitar acceso
Remove this client's access? ¿Quitar el acceso de este cliente?
Repeat packets Repetir paquetes
Repeaters this node hears directly, with the signal it hears them at. Repetidores que este nodo oye directamente, con la señal con que los oye.
Repeating Repetición
Repeating & limits Repetición y límites
Reset counters Poner contadores a cero
Reset the node's packet counters? ¿Poner a cero los contadores de paquetes del nodo?
Room password Contraseña de la sala
Save (after a reboot) Guardar (tras reiniciar)
Save new radio settings?\nNow: %s\nNew: %s\nThey apply after a reboot. Wrong values can cut this node off for good. ¿Guardar los nuevos ajustes de radio?\nAhora: %s\nNuevos: %s\nSe aplican tras un reinicio. Valores erróneos pueden dejar este nodo aislado para siempre.
Saved. Applies after a reboot. Guardado. Se aplica tras un reinicio.
Saved. The node uses the new radio settings after a reboot. Reboot it now? Guardado. El nodo usa los nuevos ajustes de radio tras un reinicio. ¿Reiniciarlo ahora?
Saving... Guardando...
Send flood advert Enviar anuncio flood
Send now Enviar ahora
Send zero-hop advert Enviar anuncio de cero saltos
Set the node's position to this device's position? ¿Poner la posición del nodo en la de este dispositivo?
Shown to anyone who asks this node. Up to 119 characters. Se muestra a quien pregunte a este nodo. Hasta 119 caracteres.
Spreading factor Factor de dispersión
Start a firmware update on the node? It opens its own Wi-Fi access point until it is updated or rebooted, and stops repeating meanwhile. ¿Iniciar una actualización de firmware en el nodo? Abre su propio punto de acceso Wi-Fi hasta que se actualice o reinicie, y mientras tanto no repite nada.
Start firmware update Iniciar actualización de firmware
Strict Estricta
Strongest Más fuertes
Sync clock to this device Sincronizar reloj con este dispositivo
The node's region tree: ^ marks its home region, F that it repeats floods for that region. Edit regions in the Console. El árbol de regiones del nodo: ^ marca su región de origen, F que repite floods de esa región. Edita las regiones en la Consola.
The passwords do not match Las contraseñas no coinciden
The position goes out in the node's adverts. La posición sale en los anuncios del nodo.
The same for direct packets. 0 to 2. Lo mismo para paquetes directos. 0 a 2.
The same limit for adverts. 0 to 64. El mismo límite para anuncios. 0 a 64.
This device Este dispositivo
This device has no position Este dispositivo no tiene posición
Transmit power Potencia de transmisión
Try Probar
Try for 10 minutes Probar 10 minutos
Try new radio settings for %u minutes?\nNow: %s\nTry: %s\nThe node goes back by itself. Until then you reach it only on the new settings. ¿Probar nuevos ajustes de radio durante %u minutos?\nAhora: %s\nPrueba: %s\nEl nodo vuelve solo. Hasta entonces solo lo alcanzas con los nuevos ajustes.
Up to 31 characters, without [ ] \\ : , ? * Hasta 31 caracteres, sin [ ] \\ : , ? *
Updated %s ago Actualizado hace %s
Uptime Tiempo activo
Use my position Usar mi posición
Use this device's settings Usar los ajustes de este dispositivo
Wrong radio settings can cut this node off: you then reach it only on the new settings, or not at all. Try them first; the node goes back by itself. Ajustes de radio erróneos pueden aislar este nodo: entonces solo lo alcanzas con los nuevos ajustes, o nunca. Pruébalos primero; el nodo vuelve solo.
dBm, -9 to 30. Applies at once. dBm, -9 a 30. Se aplica al momento.
pushed enviados
you tú
Flood in / out Flood entrada / salida
Direct in / out Directo entrada / salida
Airtime TX / RX Tiempo en aire TX / RX
+174 -1
View File
@@ -1,7 +1,7 @@
# wadamesh language file
# canonical source - translators: edit this file and PR it
# code: fr
# ver: 26
# ver: 28
# name: Français
# base: fr
(device behind) (appareil en retard)
@@ -1986,3 +1986,176 @@ Showing the first %d tracks Les %d premiers titres sont affichés
Sound is off: Settings > Sound Le son est coupé: Paramètres > Son
Stopped Arrêté
This device cannot play music. Cet appareil ne peut pas lire de musique.
# Settings > Device / keyboard protocol / setup wizard strings
Hardware Matériel
Display & lock Affichage et verrouillage
Keep Bluetooth on to pair the MeshCore app on your phone. Wi-Fi can be set up anytime in Settings. Laissez le Bluetooth activé pour appairer l'application MeshCore de votre téléphone. Le Wi-Fi peut être configuré à tout moment dans Réglages.
Radio: Radio :
Keyboard: Clavier :
newer keyboard clavier récent
older keyboard ancien clavier
older keyboard (set manually) ancien clavier (réglé manuellement)
keyboard not detected yet clavier pas encore détecté
Always use the external antenna (MMCX) Toujours utiliser l'antenne externe (MMCX)
Starts on the external socket at every boot. Only for an antenna that stays connected. Démarre sur la prise externe à chaque démarrage. Seulement pour une antenne qui reste branchée.
Only pick External with an antenna fitted to the external socket. After a reboot it starts on the on-board antenna, unless the switch below is on. Ne choisissez Externe qu'avec une antenne branchée sur la prise externe. Après un redémarrage, c'est l'antenne embarquée, sauf si l'interrupteur ci-dessous est activé.
Always use the external antenna?\n\nThe radio will start on the external (MMCX) socket at every boot. Transmitting without an antenna attached can damage the radio.\n\nOnly turn this on if your external antenna stays connected. Toujours utiliser l'antenne externe ?\n\nLa radio démarrera sur la prise externe (MMCX) à chaque démarrage. Émettre sans antenne branchée peut endommager la radio.\n\nN'activez ceci que si votre antenne externe reste branchée.
Turn on Activer
On-board antenna selected Antenne embarquée sélectionnée
External antenna at every boot Antenne externe à chaque démarrage
Antenna Antenne
On-board Interne
Glass tiles Tuiles en verre
Widgets, cards and panel tiles let the background show through. Off: solid tiles. Les widgets, cartes et tuiles du panneau laissent voir le fond. Désactivé : tuiles opaques.
# repeater admin app
0 to 9. Higher waits longer between sends. 0 à 9. Plus haut attend plus longtemps entre deux envois.
A name is required Un nom est requis
A node clock only moves forward: syncing cannot set it back. L'horloge d'un nœud ne fait qu'avancer : la synchroniser ne peut pas la reculer.
A room server lists only its admins here. Un serveur de salon ne liste ici que ses admins.
Access Accès
Access changed Accès modifié
Actions Actions
Admin password Mot de passe admin
Admin password changed. Mot de passe admin modifié.
Admin password for full control, or the room password. Mot de passe admin pour le contrôle complet, ou le mot de passe du salon.
Admin password for full control. A guest sees status and neighbours. Mot de passe admin pour le contrôle complet. Un invité voit l'état et les voisins.
Advanced Avancé
Advert hop limit Limite de sauts des annonces
Advert intervals Intervalles d'annonce
Adverts Annonces
Again Encore
Airtime factor Facteur de temps d'antenne
Bandwidth Bande passante
Change Changer
Change radio settings Changer les réglages radio
Change the admin password? If you lose it you can no longer manage this node over the mesh. Changer le mot de passe admin ? Si vous le perdez, vous ne pourrez plus gérer ce nœud par le maillage.
Clients Clients
Coding rate Taux de codage
Console Console
Current Actuel
Decimal degrees, for example 4.4025 Degrés décimaux, par exemple 4.4025
Decimal degrees, for example 51.2194 Degrés décimaux, par exemple 51.2194
Direct send delay Délai d'envoi direct
Discover neighbours Chercher des voisins
Duplicates Doublons
Enter a number Entrez un nombre
Enter a password Entrez un mot de passe
Error Erreur
Errors Erreurs
Firmware update: the node opens a Wi-Fi access point; join it and upload the new firmware in a browser, as the node's own instructions say. Mise à jour : le nœud ouvre un point d'accès Wi-Fi ; connectez-vous et envoyez le nouveau firmware dans un navigateur, comme l'indiquent les instructions du nœud.
Flood advert Annonce flood
Flood hop limit Limite de sauts des floods
Flood send delay Délai d'envoi flood
Floods with more hops are not repeated. 0 to 64. Les floods avec plus de sauts ne sont pas répétés. 0 à 64.
Frequency: 150 to 2500 MHz Fréquence : 150 à 2500 MHz
Guest Invité
Guest password Mot de passe invité
Hours between flood adverts: 0 (off) or 3 to 168. Heures entre annonces flood : 0 (arrêt) ou 3 à 168.
How hard to drop packets that came back around. Avec quelle rigueur jeter les paquets revenus en boucle.
Identity Identité
Identity & location Identité et position
Last reply Dernière réponse
Last signal Dernier signal
Lets a wrong or blank password in to read, not to post. Laisse entrer un mot de passe faux ou vide pour lire, pas pour publier.
Load more (%d of %u) Charger plus (%d sur %u)
Local advert Annonce locale
Location Position
Log in Se connecter
Log in as admin Se connecter en admin
Log in as guest Se connecter en invité
Logged in as a guest: you can read the status and neighbours. Log in with the admin password to change settings. Connecté en invité : vous pouvez lire l'état et les voisins. Connectez-vous avec le mot de passe admin pour changer les réglages.
Logged in without admin rights. Log in with the admin password to change settings. Connecté sans droits admin. Connectez-vous avec le mot de passe admin pour changer les réglages.
Logging in... Connexion...
Login refused. Connexion refusée.
Logs in as a guest. Blank lets anyone in as a guest. Up to 15 characters. Connexion en invité. Vide laisse entrer tout le monde en invité. 15 caractères au plus.
Loop detection Détection de boucles
Manage Gérer
Members log in with it to post. Up to 15 characters. Les membres se connectent avec pour publier. 15 caractères au plus.
Minutes between zero-hop adverts: 0 (off) or 60 to 240. Minutes entre annonces zéro saut : 0 (arrêt) ou 60 à 240.
Moderate Modérée
Neighbours Voisins
New password Nouveau mot de passe
Newest Plus récents
No neighbours heard yet. Aucun voisin entendu pour l'instant.
No reply Pas de réponse
No reply from the node Pas de réponse du nœud
No reply. Check the password, that the node is in range, and this device's clock. Pas de réponse. Vérifiez le mot de passe, que le nœud est à portée, et l'horloge de cet appareil.
No reply. It may or may not have been applied: read it again. Pas de réponse. Appliqué ou non, impossible de savoir : relisez la valeur.
No spaces Pas d'espaces
Nobody on the list. Personne dans la liste.
Node clock Horloge du nœud
Noise floor Bruit de fond
Not in your contacts Pas dans vos contacts
Not in your contacts, so only removing is possible here. Pas dans vos contacts : seule la suppression est possible ici.
Not saved Non enregistré
Off: this node stops forwarding anything. Arrêt : ce nœud ne relaie plus rien.
Order Ordre
Owner Propriétaire
Owner info Infos propriétaire
Password Mot de passe
Passwords Mots de passe
Passwords & access Mots de passe et accès
Posts Messages
Prefers stronger copies of a flood. 0 to 20. Préfère les copies plus fortes d'un flood. 0 à 20.
Queue File d'attente
Random delay factor before repeating a flood. 0 to 2. Facteur de délai aléatoire avant de répéter un flood. 0 à 2.
Read again Relire
Read-only Lecture seule
Read-only access Accès en lecture seule
Read-write Lecture et écriture
Reading... Lecture...
Reboot sent. The node is back in about 10 s. Redémarrage envoyé. Le nœud revient dans 10 s environ.
Reboot the node? It is off the air for about 10 s and forgets guest logins. Redémarrer le nœud ? Il est hors antenne 10 s environ et oublie les connexions invité.
Receive delay Délai de réception
Received Reçus
Refresh Actualiser
Regions Régions
Remove access Retirer l'accès
Remove this client's access? Retirer l'accès de ce client ?
Repeat packets Répéter les paquets
Repeaters this node hears directly, with the signal it hears them at. Les répéteurs que ce nœud entend directement, avec le signal reçu.
Repeating Répétition
Repeating & limits Répétition et limites
Reset counters Remettre les compteurs à zéro
Reset the node's packet counters? Remettre à zéro les compteurs de paquets du nœud ?
Room password Mot de passe du salon
Save (after a reboot) Enregistrer (après redémarrage)
Save new radio settings?\nNow: %s\nNew: %s\nThey apply after a reboot. Wrong values can cut this node off for good. Enregistrer les nouveaux réglages radio ?\nActuel : %s\nNouveau : %s\nIls s'appliquent après un redémarrage. De mauvaises valeurs peuvent couper ce nœud pour de bon.
Saved. Applies after a reboot. Enregistré. S'applique après un redémarrage.
Saved. The node uses the new radio settings after a reboot. Reboot it now? Enregistré. Le nœud utilise les nouveaux réglages radio après un redémarrage. Redémarrer maintenant ?
Saving... Enregistrement...
Send flood advert Envoyer une annonce flood
Send now Envoyer maintenant
Send zero-hop advert Envoyer une annonce zéro saut
Set the node's position to this device's position? Mettre la position du nœud à celle de cet appareil ?
Shown to anyone who asks this node. Up to 119 characters. Montré à quiconque interroge ce nœud. 119 caractères au plus.
Spreading factor Facteur d'étalement
Start a firmware update on the node? It opens its own Wi-Fi access point until it is updated or rebooted, and stops repeating meanwhile. Lancer une mise à jour du firmware sur le nœud ? Il ouvre son propre point d'accès Wi-Fi jusqu'à la mise à jour ou un redémarrage, et ne répète plus rien entre-temps.
Start firmware update Lancer la mise à jour
Strict Stricte
Strongest Plus forts
Sync clock to this device Régler l'horloge sur cet appareil
The node's region tree: ^ marks its home region, F that it repeats floods for that region. Edit regions in the Console. L'arbre des régions du nœud : ^ marque sa région d'origine, F qu'il répète les floods de cette région. Modifiez les régions dans la Console.
The passwords do not match Les mots de passe ne correspondent pas
The position goes out in the node's adverts. La position part dans les annonces du nœud.
The same for direct packets. 0 to 2. Pareil pour les paquets directs. 0 à 2.
The same limit for adverts. 0 to 64. La même limite pour les annonces. 0 à 64.
This device Cet appareil
This device has no position Cet appareil n'a pas de position
Transmit power Puissance d'émission
Try Essayer
Try for 10 minutes Essayer 10 minutes
Try new radio settings for %u minutes?\nNow: %s\nTry: %s\nThe node goes back by itself. Until then you reach it only on the new settings. Essayer de nouveaux réglages radio pendant %u minutes ?\nActuel : %s\nEssai : %s\nLe nœud revient seul en arrière. D'ici là, vous ne le joignez qu'avec les nouveaux réglages.
Up to 31 characters, without [ ] \\ : , ? * 31 caractères au plus, sans [ ] \\ : , ? *
Updated %s ago Mis à jour il y a %s
Uptime Temps de fonctionnement
Use my position Utiliser ma position
Use this device's settings Utiliser les réglages de cet appareil
Wrong radio settings can cut this node off: you then reach it only on the new settings, or not at all. Try them first; the node goes back by itself. De mauvais réglages radio peuvent couper ce nœud : vous ne le joignez alors qu'avec les nouveaux réglages, ou plus du tout. Essayez-les d'abord ; le nœud revient seul en arrière.
dBm, -9 to 30. Applies at once. dBm, -9 à 30. S'applique tout de suite.
pushed poussés
you vous
Flood in / out Flood reçus / émis
Direct in / out Direct reçus / émis
Airtime TX / RX Temps d'antenne TX / RX
+174 -1
View File
@@ -1,7 +1,7 @@
# wadamesh language file
# canonical source - translators: edit this file and PR it
# code: hu
# ver: 26
# ver: 28
# name: Magyar
# base: hu
(device behind) (készülék hátulján)
@@ -1997,3 +1997,176 @@ Showing the first %d tracks Az első %d szám látható
Sound is off: Settings > Sound A hang ki van kapcsolva: Beállítások > Hang
Stopped Leállítva
This device cannot play music. Ez az eszköz nem tud zenét lejátszani.
# Settings > Device / keyboard protocol / setup wizard strings
Hardware Hardver
Display & lock Kijelző és zár
Keep Bluetooth on to pair the MeshCore app on your phone. Wi-Fi can be set up anytime in Settings. Hagyd bekapcsolva a Bluetooth-t, hogy párosíthasd a telefonodon a MeshCore alkalmazást. A Wi-Fi bármikor beállítható a Beállításokban.
Radio: Rádió:
Keyboard: Billentyűzet:
newer keyboard újabb billentyűzet
older keyboard régebbi billentyűzet
older keyboard (set manually) régebbi billentyűzet (kézzel beállítva)
keyboard not detected yet a billentyűzet még nincs felismerve
Always use the external antenna (MMCX) Mindig a külső antenna (MMCX)
Starts on the external socket at every boot. Only for an antenna that stays connected. Minden indításkor a külső csatlakozón indul. Csak tartósan csatlakoztatott antennához.
Only pick External with an antenna fitted to the external socket. After a reboot it starts on the on-board antenna, unless the switch below is on. Külsőt csak akkor válassz, ha antenna van a külső csatlakozón. Újraindítás után a beépített antennán indul, kivéve ha az alábbi kapcsoló be van kapcsolva.
Always use the external antenna?\n\nThe radio will start on the external (MMCX) socket at every boot. Transmitting without an antenna attached can damage the radio.\n\nOnly turn this on if your external antenna stays connected. Mindig a külső antennát használod?\n\nA rádió minden indításkor a külső (MMCX) csatlakozón indul. Antenna nélküli adás károsíthatja a rádiót.\n\nCsak akkor kapcsold be, ha a külső antenna csatlakoztatva marad.
Turn on Bekapcsol
On-board antenna selected Beépített antenna kiválasztva
External antenna at every boot Külső antenna minden indításkor
Antenna Antenna
On-board Beépített
Glass tiles Üveg csempék
Widgets, cards and panel tiles let the background show through. Off: solid tiles. A widgetek, kártyák és a panel csempéi átengedik a hátteret. Ki: tömör csempék.
# repeater admin app
0 to 9. Higher waits longer between sends. 0 és 9 között. Magasabb érték több várakozás a küldések között.
A name is required Név megadása kötelező
A node clock only moves forward: syncing cannot set it back. Egy node órája csak előre jár: a szinkronizálás nem tudja visszaállítani.
A room server lists only its admins here. Egy room szerver itt csak az adminjait listázza.
Access Hozzáférés
Access changed Hozzáférés módosítva
Actions Műveletek
Admin password Admin jelszó
Admin password changed. Admin jelszó megváltoztatva.
Admin password for full control, or the room password. Admin jelszó a teljes irányításhoz, vagy a szoba jelszava.
Admin password for full control. A guest sees status and neighbours. Admin jelszó a teljes irányításhoz. Vendégként az állapot és a szomszédok láthatók.
Advanced Haladó
Advert hop limit Hop korlát advertekhez
Advert intervals Advert időközök
Adverts Advertek
Again Újra
Airtime factor Adásidő szorzó
Bandwidth Sávszélesség
Change Módosítás
Change radio settings Rádióbeállítások módosítása
Change the admin password? If you lose it you can no longer manage this node over the mesh. Megváltoztatod az admin jelszót? Ha elveszíted, többé nem kezelheted ezt a node-ot a hálón keresztül.
Clients Kliensek
Coding rate Kódolási arány
Console Konzol
Current Jelenlegi
Decimal degrees, for example 4.4025 Tizedes fok, például 4.4025
Decimal degrees, for example 51.2194 Tizedes fok, például 51.2194
Direct send delay Direkt küldési késleltetés
Discover neighbours Szomszédok keresése
Duplicates Duplikátumok
Enter a number Adj meg egy számot
Enter a password Adj meg egy jelszót
Error Hiba
Errors Hibák
Firmware update: the node opens a Wi-Fi access point; join it and upload the new firmware in a browser, as the node's own instructions say. Firmware frissítés: a node Wi-Fi hozzáférési pontot nyit; csatlakozz hozzá, és töltsd fel az új firmware-t böngészőben, ahogy a node utasításai mondják.
Flood advert Flood advert
Flood hop limit Hop korlát floodokhoz
Flood send delay Flood küldési késleltetés
Floods with more hops are not repeated. 0 to 64. A több hopos floodokat nem ismétli. 0 és 64 között.
Frequency: 150 to 2500 MHz Frekvencia: 150 és 2500 MHz között
Guest Vendég
Guest password Vendég jelszó
Hours between flood adverts: 0 (off) or 3 to 168. Órák a flood advertek között: 0 (ki) vagy 3 és 168 között.
How hard to drop packets that came back around. Mennyire szigorúan dobja el a körbe visszaért csomagokat.
Identity Azonosító
Identity & location Azonosító és hely
Last reply Utolsó válasz
Last signal Utolsó jel
Lets a wrong or blank password in to read, not to post. Hibás vagy üres jelszóval is beenged olvasni, de írni nem.
Load more (%d of %u) Továbbiak betöltése (%d / %u)
Local advert Helyi advert
Location Hely
Log in Bejelentkezés
Log in as admin Bejelentkezés adminként
Log in as guest Bejelentkezés vendégként
Logged in as a guest: you can read the status and neighbours. Log in with the admin password to change settings. Vendégként bejelentkezve: olvashatod az állapotot és a szomszédokat. A beállítások módosításához jelentkezz be az admin jelszóval.
Logged in without admin rights. Log in with the admin password to change settings. Admin jogok nélkül bejelentkezve. A beállítások módosításához jelentkezz be az admin jelszóval.
Logging in... Bejelentkezés...
Login refused. Bejelentkezés elutasítva.
Logs in as a guest. Blank lets anyone in as a guest. Up to 15 characters. Vendégként jelentkeztet be. Üresen bárkit beenged vendégként. Legfeljebb 15 karakter.
Loop detection Hurokészlelés
Manage Kezelés
Members log in with it to post. Up to 15 characters. A tagok ezzel jelentkeznek be, hogy írhassanak. Legfeljebb 15 karakter.
Minutes between zero-hop adverts: 0 (off) or 60 to 240. Percek a zero-hop advertek között: 0 (ki) vagy 60 és 240 között.
Moderate Mérsékelt
Neighbours Szomszédok
New password Új jelszó
Newest Legújabb
No neighbours heard yet. Még nem hallott szomszédot.
No reply Nincs válasz
No reply from the node A node nem válaszol
No reply. Check the password, that the node is in range, and this device's clock. Nincs válasz. Ellenőrizd a jelszót, hogy a node hatótávon belül van-e, és ennek az eszköznek az óráját.
No reply. It may or may not have been applied: read it again. Nincs válasz. Lehet, hogy érvénybe lépett, lehet, hogy nem: olvasd be újra.
No spaces Szóközök nélkül
Nobody on the list. Senki sincs a listán.
Node clock A node órája
Noise floor Zajszint
Not in your contacts Nincs a névjegyeid között
Not in your contacts, so only removing is possible here. Nincs a névjegyeid között, ezért itt csak eltávolítani lehet.
Not saved Nincs mentve
Off: this node stops forwarding anything. Ki: ez a node semmit sem továbbít.
Order Sorrend
Owner Tulajdonos
Owner info Tulajdonos infó
Password Jelszó
Passwords Jelszavak
Passwords & access Jelszavak és hozzáférés
Posts Bejegyzések
Prefers stronger copies of a flood. 0 to 20. A flood erősebb példányait részesíti előnyben. 0 és 20 között.
Queue Sor
Random delay factor before repeating a flood. 0 to 2. Véletlen késleltetési szorzó egy flood ismétlése előtt. 0 és 2 között.
Read again Újraolvasás
Read-only Csak olvasás
Read-only access Csak olvasási hozzáférés
Read-write Olvasás és írás
Reading... Olvasás...
Reboot sent. The node is back in about 10 s. Újraindítás elküldve. A node kb. 10 mp múlva visszatér.
Reboot the node? It is off the air for about 10 s and forgets guest logins. Újraindítod a node-ot? Kb. 10 mp-ig nem ad, és elfelejti a vendég bejelentkezéseket.
Receive delay Vételi késleltetés
Received Fogadott
Refresh Frissítés
Regions Régiók
Remove access Hozzáférés eltávolítása
Remove this client's access? Eltávolítod ennek a kliensnek a hozzáférését?
Repeat packets Csomagok ismétlése
Repeaters this node hears directly, with the signal it hears them at. Az átjátszók, amelyeket ez a node közvetlenül hall, azzal a jellel, ahogy hallja őket.
Repeating Ismétlés
Repeating & limits Ismétlés és korlátok
Reset counters Számlálók nullázása
Reset the node's packet counters? Nullázod a node csomagszámlálóit?
Room password Szoba jelszó
Save (after a reboot) Mentés (újraindítás után)
Save new radio settings?\nNow: %s\nNew: %s\nThey apply after a reboot. Wrong values can cut this node off for good. Mented az új rádióbeállításokat?\nMost: %s\nÚj: %s\nÚjraindítás után lépnek életbe. Hibás értékek végleg elvághatják ezt a node-ot.
Saved. Applies after a reboot. Mentve. Újraindítás után lép életbe.
Saved. The node uses the new radio settings after a reboot. Reboot it now? Mentve. A node újraindítás után használja az új rádióbeállításokat. Újraindítod most?
Saving... Mentés...
Send flood advert Flood advert küldése
Send now Küldés most
Send zero-hop advert Zero-hop advert küldése
Set the node's position to this device's position? A node helyét ennek az eszköznek a helyére állítod?
Shown to anyone who asks this node. Up to 119 characters. Bárki láthatja, aki megkérdezi a node-ot. Legfeljebb 119 karakter.
Spreading factor Szórási tényező
Start a firmware update on the node? It opens its own Wi-Fi access point until it is updated or rebooted, and stops repeating meanwhile. Firmware frissítést indítasz a node-on? Saját Wi-Fi hozzáférési pontot nyit, amíg frissítik vagy újraindul, és addig semmit sem ismétel.
Start firmware update Firmware frissítés indítása
Strict Szigorú
Strongest Legerősebb
Sync clock to this device Óra szinkronizálása ehhez az eszközhöz
The node's region tree: ^ marks its home region, F that it repeats floods for that region. Edit regions in the Console. A node régiófája: ^ jelöli az otthoni régióját, F azt, hogy ismétli a floodokat abban a régióban. A régiókat a Konzolban szerkesztheted.
The passwords do not match A jelszavak nem egyeznek
The position goes out in the node's adverts. A hely a node advertjeiben megy ki.
The same for direct packets. 0 to 2. Ugyanez a direkt csomagokra. 0 és 2 között.
The same limit for adverts. 0 to 64. Ugyanez a korlát advertekre. 0 és 64 között.
This device Ez az eszköz
This device has no position Ennek az eszköznek nincs helyzete
Transmit power Adóteljesítmény
Try Kipróbálás
Try for 10 minutes Kipróbálás 10 percig
Try new radio settings for %u minutes?\nNow: %s\nTry: %s\nThe node goes back by itself. Until then you reach it only on the new settings. Kipróbálod az új rádióbeállításokat %u percig?\nMost: %s\nPróba: %s\nA node magától visszaáll. Addig csak az új beállításokkal éred el.
Up to 31 characters, without [ ] \\ : , ? * Legfeljebb 31 karakter, ezek nélkül: [ ] \\ : , ? *
Updated %s ago Frissítve %s ezelőtt
Uptime Üzemidő
Use my position Saját helyem használata
Use this device's settings Ennek az eszköznek a beállításai
Wrong radio settings can cut this node off: you then reach it only on the new settings, or not at all. Try them first; the node goes back by itself. A hibás rádióbeállítások elvághatják ezt a node-ot: akkor csak az új beállításokkal éred el, vagy sehogy. Előbb próbáld ki őket; a node magától visszaáll.
dBm, -9 to 30. Applies at once. dBm, -9 és 30 között. Azonnal érvényes.
pushed kiküldve
you te
Flood in / out Flood be / ki
Direct in / out Direkt be / ki
Airtime TX / RX Adásidő TX / RX
+174 -1
View File
@@ -1,7 +1,7 @@
# wadamesh language file
# canonical source - translators: edit this file and PR it
# code: it
# ver: 26
# ver: 28
# name: Italiano
# base: it
(device behind) (dispositivo indietro)
@@ -1986,3 +1986,176 @@ Showing the first %d tracks Mostro i primi %d brani
Sound is off: Settings > Sound Il suono è spento: Impostazioni > Suono
Stopped Fermo
This device cannot play music. Questo dispositivo non può riprodurre musica.
# Settings > Device / keyboard protocol / setup wizard strings
Hardware Hardware
Display & lock Schermo e blocco
Keep Bluetooth on to pair the MeshCore app on your phone. Wi-Fi can be set up anytime in Settings. Lascia attivo il Bluetooth per associare l'app MeshCore sul telefono. Il Wi-Fi si può configurare in qualsiasi momento in Impostazioni.
Radio: Radio:
Keyboard: Tastiera:
newer keyboard tastiera nuova
older keyboard tastiera vecchia
older keyboard (set manually) tastiera vecchia (impostata a mano)
keyboard not detected yet tastiera non ancora rilevata
Always use the external antenna (MMCX) Usa sempre l'antenna esterna (MMCX)
Starts on the external socket at every boot. Only for an antenna that stays connected. Si avvia sul connettore esterno a ogni accensione. Solo per un'antenna che resta collegata.
Only pick External with an antenna fitted to the external socket. After a reboot it starts on the on-board antenna, unless the switch below is on. Scegli Esterna solo con un'antenna montata sul connettore esterno. Dopo un riavvio parte sull'antenna integrata, a meno che l'interruttore qui sotto sia attivo.
Always use the external antenna?\n\nThe radio will start on the external (MMCX) socket at every boot. Transmitting without an antenna attached can damage the radio.\n\nOnly turn this on if your external antenna stays connected. Usare sempre l'antenna esterna?\n\nLa radio partirà sul connettore esterno (MMCX) a ogni accensione. Trasmettere senza un'antenna collegata può danneggiare la radio.\n\nAttivalo solo se la tua antenna esterna resta collegata.
Turn on Attiva
On-board antenna selected Antenna integrata selezionata
External antenna at every boot Antenna esterna a ogni avvio
Antenna Antenna
On-board Integrata
Glass tiles Riquadri in vetro
Widgets, cards and panel tiles let the background show through. Off: solid tiles. Widget, schede e riquadri del pannello lasciano vedere lo sfondo. Spento: riquadri pieni.
# repeater admin app
0 to 9. Higher waits longer between sends. Da 0 a 9. Più alto attende di più tra un invio e l'altro.
A name is required Serve un nome
A node clock only moves forward: syncing cannot set it back. L'orologio di un nodo va solo avanti: sincronizzarlo non può riportarlo indietro.
A room server lists only its admins here. Un room server qui elenca solo i suoi amministratori.
Access Accesso
Access changed Accesso modificato
Actions Azioni
Admin password Password admin
Admin password changed. Password admin cambiata.
Admin password for full control, or the room password. Password admin per il controllo completo, oppure la password della stanza.
Admin password for full control. A guest sees status and neighbours. Password admin per il controllo completo. Un ospite vede stato e vicini.
Advanced Avanzate
Advert hop limit Limite di salti per gli advert
Advert intervals Intervalli degli advert
Adverts Advert
Again Di nuovo
Airtime factor Fattore tempo di trasmissione
Bandwidth Larghezza di banda
Change Cambia
Change radio settings Cambia impostazioni radio
Change the admin password? If you lose it you can no longer manage this node over the mesh. Cambiare la password admin? Se la perdi non potrai più gestire questo nodo tramite la mesh.
Clients Client
Coding rate Coding rate
Console Console
Current Attuale
Decimal degrees, for example 4.4025 Gradi decimali, per esempio 4.4025
Decimal degrees, for example 51.2194 Gradi decimali, per esempio 51.2194
Direct send delay Ritardo di invio diretto
Discover neighbours Cerca vicini
Duplicates Duplicati
Enter a number Inserisci un numero
Enter a password Inserisci una password
Error Errore
Errors Errori
Firmware update: the node opens a Wi-Fi access point; join it and upload the new firmware in a browser, as the node's own instructions say. Aggiornamento: il nodo apre un access point Wi-Fi; collegati e carica il nuovo firmware in un browser, come dicono le istruzioni del nodo.
Flood advert Advert flood
Flood hop limit Limite di salti per i flood
Flood send delay Ritardo di invio flood
Floods with more hops are not repeated. 0 to 64. I flood con più salti non vengono ripetuti. Da 0 a 64.
Frequency: 150 to 2500 MHz Frequenza: da 150 a 2500 MHz
Guest Ospite
Guest password Password ospite
Hours between flood adverts: 0 (off) or 3 to 168. Ore tra advert flood: 0 (spento) o da 3 a 168.
How hard to drop packets that came back around. Quanto severamente scartare i pacchetti tornati in giro.
Identity Identità
Identity & location Identità e posizione
Last reply Ultima risposta
Last signal Ultimo segnale
Lets a wrong or blank password in to read, not to post. Fa entrare con una password sbagliata o vuota per leggere, non per scrivere.
Load more (%d of %u) Carica altri (%d di %u)
Local advert Advert locale
Location Posizione
Log in Accedi
Log in as admin Accedi come admin
Log in as guest Accedi come ospite
Logged in as a guest: you can read the status and neighbours. Log in with the admin password to change settings. Accesso come ospite: puoi leggere stato e vicini. Accedi con la password admin per cambiare le impostazioni.
Logged in without admin rights. Log in with the admin password to change settings. Accesso senza diritti di admin. Accedi con la password admin per cambiare le impostazioni.
Logging in... Accesso in corso...
Login refused. Accesso rifiutato.
Logs in as a guest. Blank lets anyone in as a guest. Up to 15 characters. Accede come ospite. Vuota fa entrare chiunque come ospite. Fino a 15 caratteri.
Loop detection Rilevamento dei loop
Manage Gestisci
Members log in with it to post. Up to 15 characters. I membri accedono con questa per scrivere. Fino a 15 caratteri.
Minutes between zero-hop adverts: 0 (off) or 60 to 240. Minuti tra advert a zero salti: 0 (spento) o da 60 a 240.
Moderate Moderato
Neighbours Vicini
New password Nuova password
Newest Più recenti
No neighbours heard yet. Nessun vicino sentito finora.
No reply Nessuna risposta
No reply from the node Nessuna risposta dal nodo
No reply. Check the password, that the node is in range, and this device's clock. Nessuna risposta. Controlla la password, che il nodo sia in portata e l'orologio di questo dispositivo.
No reply. It may or may not have been applied: read it again. Nessuna risposta. Potrebbe essere stato applicato o no: rileggilo.
No spaces Niente spazi
Nobody on the list. Nessuno nell'elenco.
Node clock Orologio del nodo
Noise floor Rumore di fondo
Not in your contacts Non è nei tuoi contatti
Not in your contacts, so only removing is possible here. Non è nei tuoi contatti, quindi qui si può solo rimuovere.
Not saved Non salvato
Off: this node stops forwarding anything. Spento: questo nodo smette di inoltrare qualsiasi cosa.
Order Ordine
Owner Proprietario
Owner info Info proprietario
Password Password
Passwords Password
Passwords & access Password e accesso
Posts Messaggi
Prefers stronger copies of a flood. 0 to 20. Preferisce le copie più forti di un flood. Da 0 a 20.
Queue Coda
Random delay factor before repeating a flood. 0 to 2. Fattore di ritardo casuale prima di ripetere un flood. Da 0 a 2.
Read again Rileggi
Read-only Sola lettura
Read-only access Accesso in sola lettura
Read-write Lettura e scrittura
Reading... Lettura...
Reboot sent. The node is back in about 10 s. Riavvio inviato. Il nodo torna tra circa 10 s.
Reboot the node? It is off the air for about 10 s and forgets guest logins. Riavviare il nodo? Resta fuori onda per circa 10 s e dimentica gli accessi degli ospiti.
Receive delay Ritardo di ricezione
Received Ricevuti
Refresh Aggiorna
Regions Regioni
Remove access Rimuovi accesso
Remove this client's access? Rimuovere l'accesso di questo client?
Repeat packets Ripeti pacchetti
Repeaters this node hears directly, with the signal it hears them at. I ripetitori che questo nodo sente direttamente, con il segnale con cui li sente.
Repeating Ripetizione
Repeating & limits Ripetizione e limiti
Reset counters Azzera contatori
Reset the node's packet counters? Azzerare i contatori di pacchetti del nodo?
Room password Password della stanza
Save (after a reboot) Salva (dopo un riavvio)
Save new radio settings?\nNow: %s\nNew: %s\nThey apply after a reboot. Wrong values can cut this node off for good. Salvare le nuove impostazioni radio?\nOra: %s\nNuove: %s\nValgono dopo un riavvio. Valori sbagliati possono isolare questo nodo per sempre.
Saved. Applies after a reboot. Salvato. Vale dopo un riavvio.
Saved. The node uses the new radio settings after a reboot. Reboot it now? Salvato. Il nodo usa le nuove impostazioni radio dopo un riavvio. Riavviarlo ora?
Saving... Salvataggio...
Send flood advert Invia advert flood
Send now Invia ora
Send zero-hop advert Invia advert a zero salti
Set the node's position to this device's position? Impostare la posizione del nodo su quella di questo dispositivo?
Shown to anyone who asks this node. Up to 119 characters. Mostrato a chiunque chieda a questo nodo. Fino a 119 caratteri.
Spreading factor Spreading factor
Start a firmware update on the node? It opens its own Wi-Fi access point until it is updated or rebooted, and stops repeating meanwhile. Avviare un aggiornamento del firmware sul nodo? Apre un suo access point Wi-Fi finché non viene aggiornato o riavviato, e intanto non ripete nulla.
Start firmware update Avvia aggiornamento firmware
Strict Rigoroso
Strongest Più forti
Sync clock to this device Sincronizza l'orologio con questo dispositivo
The node's region tree: ^ marks its home region, F that it repeats floods for that region. Edit regions in the Console. L'albero delle regioni del nodo: ^ indica la sua regione di casa, F che ripete i flood per quella regione. Le regioni si modificano nella Console.
The passwords do not match Le password non corrispondono
The position goes out in the node's adverts. La posizione viene inviata negli advert del nodo.
The same for direct packets. 0 to 2. Lo stesso per i pacchetti diretti. Da 0 a 2.
The same limit for adverts. 0 to 64. Lo stesso limite per gli advert. Da 0 a 64.
This device Questo dispositivo
This device has no position Questo dispositivo non ha una posizione
Transmit power Potenza di trasmissione
Try Prova
Try for 10 minutes Prova per 10 minuti
Try new radio settings for %u minutes?\nNow: %s\nTry: %s\nThe node goes back by itself. Until then you reach it only on the new settings. Provare nuove impostazioni radio per %u minuti?\nOra: %s\nProva: %s\nIl nodo torna indietro da solo. Fino ad allora lo raggiungi solo con le nuove impostazioni.
Up to 31 characters, without [ ] \\ : , ? * Fino a 31 caratteri, senza [ ] \\ : , ? *
Updated %s ago Aggiornato %s fa
Uptime Tempo di attività
Use my position Usa la mia posizione
Use this device's settings Usa le impostazioni di questo dispositivo
Wrong radio settings can cut this node off: you then reach it only on the new settings, or not at all. Try them first; the node goes back by itself. Impostazioni radio sbagliate possono isolare questo nodo: lo raggiungi solo con le nuove impostazioni, o per niente. Provale prima; il nodo torna indietro da solo.
dBm, -9 to 30. Applies at once. dBm, da -9 a 30. Vale subito.
pushed inviati
you tu
Flood in / out Flood in / out
Direct in / out Diretti in / out
Airtime TX / RX Tempo in onda TX / RX
+175 -1
View File
@@ -1,7 +1,7 @@
# wadamesh language file
# canonical source - translators: edit this file and PR it
# code: nl
# ver: 26
# ver: 28
# name: Nederlands
# base: nl
(device behind) (apparaat loopt achter)
@@ -1984,3 +1984,177 @@ Showing the first %d tracks De eerste %d nummers worden getoond
Sound is off: Settings > Sound Geluid staat uit: Instellingen > Geluid
Stopped Gestopt
This device cannot play music. Dit toestel kan geen muziek afspelen.
# Settings > Device / keyboard protocol / setup wizard strings
Hardware Hardware
Display & lock Scherm & vergrendeling
Keep Bluetooth on to pair the MeshCore app on your phone. Wi-Fi can be set up anytime in Settings. Laat Bluetooth aan om de MeshCore-app op je telefoon te koppelen. Wi-Fi kun je altijd later instellen in Instellingen.
Radio: Radio:
Keyboard: Toetsenbord:
newer keyboard nieuwer toetsenbord
older keyboard ouder toetsenbord
older keyboard (set manually) ouder toetsenbord (handmatig ingesteld)
keyboard not detected yet toetsenbord nog niet herkend
Always use the external antenna (MMCX) Altijd de externe antenne gebruiken (MMCX)
Starts on the external socket at every boot. Only for an antenna that stays connected. Start bij elke opstart op de externe aansluiting. Alleen voor een antenne die aangesloten blijft.
Only pick External with an antenna fitted to the external socket. After a reboot it starts on the on-board antenna, unless the switch below is on. Kies Extern alleen met een antenne op de externe aansluiting. Na een herstart begint hij op de ingebouwde antenne, tenzij de schakelaar hieronder aan staat.
Always use the external antenna?\n\nThe radio will start on the external (MMCX) socket at every boot. Transmitting without an antenna attached can damage the radio.\n\nOnly turn this on if your external antenna stays connected. Altijd de externe antenne gebruiken?\n\nDe radio start bij elke opstart op de externe (MMCX) aansluiting. Zenden zonder aangesloten antenne kan de radio beschadigen.\n\nZet dit alleen aan als je externe antenne aangesloten blijft.
Turn on Aanzetten
On-board antenna selected Ingebouwde antenne geselecteerd
External antenna at every boot Externe antenne bij elke opstart
Antenna Antenne
On-board Intern
Glass tiles Glazen tegels
Widgets, cards and panel tiles let the background show through. Off: solid tiles. Widgets, kaarten en tegels in het bedieningspaneel laten de achtergrond doorschijnen. Uit: effen tegels.
# repeater admin app
0 to 9. Higher waits longer between sends. 0 tot 9. Hoger wacht langer tussen verzendingen.
A name is required Een naam is verplicht
A node clock only moves forward: syncing cannot set it back. De klok van een node gaat alleen vooruit: synchroniseren kan hem niet terugzetten.
A room server lists only its admins here. Een room server toont hier alleen zijn admins.
Access Toegang
Access changed Toegang gewijzigd
Actions Acties
Admin password Adminwachtwoord
Admin password changed. Adminwachtwoord gewijzigd.
Admin password for full control, or the room password. Adminwachtwoord voor volledige controle, of het roomwachtwoord.
Admin password for full control. A guest sees status and neighbours. Adminwachtwoord voor volledige controle. Een gast ziet status en buren.
Advanced Geavanceerd
Advert hop limit Hoplimiet voor adverts
Advert intervals Advertintervallen
Adverts Adverts
Again Nogmaals
Airtime factor Zendtijdfactor
Bandwidth Bandbreedte
Change Wijzigen
Change radio settings Radio-instellingen wijzigen
Change the admin password? If you lose it you can no longer manage this node over the mesh. Adminwachtwoord wijzigen? Ben je het kwijt, dan kun je deze node niet meer via het mesh beheren.
Clients Clients
Coding rate Codeersnelheid
Console Console
Current Huidig
Decimal degrees, for example 4.4025 Decimale graden, bijvoorbeeld 4.4025
Decimal degrees, for example 51.2194 Decimale graden, bijvoorbeeld 51.2194
Direct send delay Zendvertraging direct
Discover neighbours Buren zoeken
Duplicates Duplicaten
Enter a number Voer een getal in
Enter a password Voer een wachtwoord in
Error Fout
Errors Fouten
Firmware update: the node opens a Wi-Fi access point; join it and upload the new firmware in a browser, as the node's own instructions say. Firmware-update: de node opent een wifi-toegangspunt; maak er verbinding mee en upload de nieuwe firmware in een browser, zoals de instructies van de node zeggen.
Flood advert Flood-advert
Flood hop limit Hoplimiet voor floods
Flood send delay Zendvertraging flood
Floods with more hops are not repeated. 0 to 64. Floods met meer hops worden niet herhaald. 0 tot 64.
Frequency: 150 to 2500 MHz Frequentie: 150 tot 2500 MHz
Guest Gast
Guest password Gastwachtwoord
Hours between flood adverts: 0 (off) or 3 to 168. Uren tussen flood-adverts: 0 (uit) of 3 tot 168.
How hard to drop packets that came back around. Hoe streng pakketten die rondgingen worden weggegooid.
Identity Identiteit
Identity & location Identiteit & locatie
Last reply Laatste antwoord
Last signal Laatste signaal
Lets a wrong or blank password in to read, not to post. Laat een fout of leeg wachtwoord binnen om te lezen, niet om te posten.
Load more (%d of %u) Meer laden (%d van %u)
Local advert Lokale advert
Location Locatie
Log in Inloggen
Log in as admin Inloggen als admin
Log in as guest Inloggen als gast
Logged in as a guest: you can read the status and neighbours. Log in with the admin password to change settings. Ingelogd als gast: je kunt de status en buren lezen. Log in met het adminwachtwoord om instellingen te wijzigen.
Logged in without admin rights. Log in with the admin password to change settings. Ingelogd zonder adminrechten. Log in met het adminwachtwoord om instellingen te wijzigen.
Logging in... Inloggen...
Login refused. Inloggen geweigerd.
Logs in as a guest. Blank lets anyone in as a guest. Up to 15 characters. Logt in als gast. Leeg laat iedereen als gast binnen. Tot 15 tekens.
Loop detection Lusdetectie
Manage Beheren
Members log in with it to post. Up to 15 characters. Leden loggen hiermee in om te posten. Tot 15 tekens.
Minutes between zero-hop adverts: 0 (off) or 60 to 240. Minuten tussen zero-hop-adverts: 0 (uit) of 60 tot 240.
Moderate Gemiddeld
Neighbours Buren
New password Nieuw wachtwoord
Newest Nieuwste
No neighbours heard yet. Nog geen buren gehoord.
No reply Geen antwoord
No reply from the node Geen antwoord van de node
No reply. Check the password, that the node is in range, and this device's clock. Geen antwoord. Controleer het wachtwoord, of de node in bereik is, en de klok van dit toestel.
No reply. It may or may not have been applied: read it again. Geen antwoord. Misschien is het toegepast, misschien niet: lees het opnieuw.
No spaces Geen spaties
Nobody on the list. Niemand op de lijst.
Node clock Klok van de node
Noise floor Ruisvloer
Not in your contacts Niet in je contacten
Not in your contacts, so only removing is possible here. Niet in je contacten, dus hier is alleen verwijderen mogelijk.
Not saved Niet opgeslagen
Off: this node stops forwarding anything. Uit: deze node stuurt niets meer door.
Order Volgorde
Owner Eigenaar
Owner info Eigenaarsinfo
Password Wachtwoord
Passwords Wachtwoorden
Passwords & access Wachtwoorden & toegang
Posts Berichten
Prefers stronger copies of a flood. 0 to 20. Verkiest sterkere kopieën van een flood. 0 tot 20.
Queue Wachtrij
Random delay factor before repeating a flood. 0 to 2. Willekeurige vertragingsfactor voor het herhalen van een flood. 0 tot 2.
Read again Opnieuw lezen
Read-only Alleen lezen
Read-only access Alleen-lezentoegang
Read-write Lezen en schrijven
Reading... Lezen...
Reboot sent. The node is back in about 10 s. Herstart verstuurd. De node is over ongeveer 10 s terug.
Reboot the node? It is off the air for about 10 s and forgets guest logins. De node herstarten? Hij is ongeveer 10 s uit de lucht en vergeet gastlogins.
Receive delay Ontvangstvertraging
Received Ontvangen
Refresh Vernieuwen
Regions Regio's
Remove access Toegang verwijderen
Remove this client's access? De toegang van deze client verwijderen?
Repeat packets Pakketten herhalen
Repeaters this node hears directly, with the signal it hears them at. Repeaters die deze node rechtstreeks hoort, met het signaal waarmee hij ze hoort.
Repeating Herhalen
Repeating & limits Herhalen & limieten
Reset counters Tellers resetten
Reset the node's packet counters? De pakkettellers van de node resetten?
Room password Roomwachtwoord
Save (after a reboot) Opslaan (na een herstart)
Save new radio settings?\nNow: %s\nNew: %s\nThey apply after a reboot. Wrong values can cut this node off for good. Nieuwe radio-instellingen opslaan?\nNu: %s\nNieuw: %s\nZe gelden na een herstart. Foute waarden kunnen deze node voorgoed afsnijden.
Saved. Applies after a reboot. Opgeslagen. Geldt na een herstart.
Saved. The node uses the new radio settings after a reboot. Reboot it now? Opgeslagen. De node gebruikt de nieuwe radio-instellingen na een herstart. Nu herstarten?
Saving... Opslaan...
Send flood advert Flood-advert versturen
Send now Nu versturen
Send zero-hop advert Zero-hop-advert versturen
Set the node's position to this device's position? De positie van de node instellen op de positie van dit toestel?
Shown to anyone who asks this node. Up to 119 characters. Getoond aan iedereen die deze node vraagt. Tot 119 tekens.
Spreading factor Spreidingsfactor
Start a firmware update on the node? It opens its own Wi-Fi access point until it is updated or rebooted, and stops repeating meanwhile. Een firmware-update op de node starten? Hij opent een eigen wifi-toegangspunt tot hij bijgewerkt of herstart is, en herhaalt intussen niets.
Start firmware update Firmware-update starten
Status Status
Strict Streng
Strongest Sterkste
Sync clock to this device Klok gelijkzetten met dit toestel
The node's region tree: ^ marks its home region, F that it repeats floods for that region. Edit regions in the Console. De regioboom van de node: ^ markeert zijn thuisregio, F dat hij floods voor die regio herhaalt. Regio's bewerk je in de Console.
The passwords do not match De wachtwoorden komen niet overeen
The position goes out in the node's adverts. De positie gaat mee in de adverts van de node.
The same for direct packets. 0 to 2. Hetzelfde voor directe pakketten. 0 tot 2.
The same limit for adverts. 0 to 64. Dezelfde limiet voor adverts. 0 tot 64.
This device Dit toestel
This device has no position Dit toestel heeft geen positie
Transmit power Zendvermogen
Try Proberen
Try for 10 minutes 10 minuten proberen
Try new radio settings for %u minutes?\nNow: %s\nTry: %s\nThe node goes back by itself. Until then you reach it only on the new settings. Nieuwe radio-instellingen %u minuten proberen?\nNu: %s\nProef: %s\nDe node gaat vanzelf terug. Tot dan bereik je hem alleen met de nieuwe instellingen.
Up to 31 characters, without [ ] \\ : , ? * Tot 31 tekens, zonder [ ] \\ : , ? *
Updated %s ago %s geleden bijgewerkt
Uptime Uptime
Use my position Mijn positie gebruiken
Use this device's settings Instellingen van dit toestel gebruiken
Wrong radio settings can cut this node off: you then reach it only on the new settings, or not at all. Try them first; the node goes back by itself. Foute radio-instellingen kunnen deze node afsnijden: je bereikt hem dan alleen met de nieuwe instellingen, of helemaal niet. Probeer ze eerst; de node gaat vanzelf terug.
dBm, -9 to 30. Applies at once. dBm, -9 tot 30. Geldt meteen.
pushed gepusht
you jij
Flood in / out Flood in / uit
Direct in / out Direct in / uit
Airtime TX / RX Zendtijd TX / RX
+175 -1
View File
@@ -1,7 +1,7 @@
# wadamesh language file
# canonical source - translators: edit this file and PR it
# code: pt-br
# ver: 26
# ver: 28
# name: Português (BR)
# base: pt-br
(device behind) (dispositivo atrasado)
@@ -1986,3 +1986,177 @@ Showing the first %d tracks Mostrando as primeiras %d faixas
Sound is off: Settings > Sound O som está desligado: Ajustes > Som
Stopped Parado
This device cannot play music. Este dispositivo não toca música.
# Settings > Device / keyboard protocol / setup wizard strings
Hardware Hardware
Display & lock Tela e bloqueio
Keep Bluetooth on to pair the MeshCore app on your phone. Wi-Fi can be set up anytime in Settings. Deixe o Bluetooth ligado para parear o app MeshCore no seu celular. O Wi-Fi pode ser configurado a qualquer momento em Configurações.
Radio: Rádio:
Keyboard: Teclado:
newer keyboard teclado novo
older keyboard teclado antigo
older keyboard (set manually) teclado antigo (definido manualmente)
keyboard not detected yet teclado ainda não detectado
Always use the external antenna (MMCX) Sempre usar a antena externa (MMCX)
Starts on the external socket at every boot. Only for an antenna that stays connected. Inicia no conector externo a cada boot. Só para uma antena que fica conectada.
Only pick External with an antenna fitted to the external socket. After a reboot it starts on the on-board antenna, unless the switch below is on. Escolha Externa só com uma antena no conector externo. Depois de reiniciar, começa na antena embutida, a menos que a chave abaixo esteja ligada.
Always use the external antenna?\n\nThe radio will start on the external (MMCX) socket at every boot. Transmitting without an antenna attached can damage the radio.\n\nOnly turn this on if your external antenna stays connected. Sempre usar a antena externa?\n\nO rádio vai iniciar no conector externo (MMCX) a cada boot. Transmitir sem uma antena conectada pode danificar o rádio.\n\nSó ligue isto se a sua antena externa ficar conectada.
Turn on Ligar
On-board antenna selected Antena embutida selecionada
External antenna at every boot Antena externa a cada boot
Antenna Antena
On-board Embutida
Glass tiles Blocos de vidro
Widgets, cards and panel tiles let the background show through. Off: solid tiles. Widgets, cartões e blocos do painel deixam o fundo aparecer. Desligado: blocos sólidos.
# repeater admin app
0 to 9. Higher waits longer between sends. 0 a 9. Mais alto espera mais entre envios.
A name is required É preciso um nome
A node clock only moves forward: syncing cannot set it back. O relógio de um nó só avança: sincronizar não consegue atrasá-lo.
A room server lists only its admins here. Um servidor de sala lista aqui apenas seus administradores.
Access Acesso
Access changed Acesso alterado
Actions Ações
Admin password Senha de administrador
Admin password changed. Senha de administrador alterada.
Admin password for full control, or the room password. Senha de administrador para controle total, ou a senha da sala.
Admin password for full control. A guest sees status and neighbours. Senha de administrador para controle total. Um convidado vê o status e os vizinhos.
Advanced Avançado
Advert hop limit Limite de saltos de anúncios
Advert intervals Intervalos de anúncio
Adverts Anúncios
Again De novo
Airtime factor Fator de tempo no ar
Bandwidth Largura de banda
Change Alterar
Change radio settings Alterar ajustes de rádio
Change the admin password? If you lose it you can no longer manage this node over the mesh. Alterar a senha de administrador? Se você a perder, não poderá mais gerenciar este nó pela malha.
Clients Clientes
Coding rate Taxa de codificação
Console Console
Current Atual
Decimal degrees, for example 4.4025 Graus decimais, por exemplo 4.4025
Decimal degrees, for example 51.2194 Graus decimais, por exemplo 51.2194
Direct send delay Atraso de envio direto
Discover neighbours Procurar vizinhos
Duplicates Duplicados
Enter a number Digite um número
Enter a password Digite uma senha
Error Erro
Errors Erros
Firmware update: the node opens a Wi-Fi access point; join it and upload the new firmware in a browser, as the node's own instructions say. Atualização: o nó abre um ponto de acesso Wi-Fi; conecte-se a ele e envie o novo firmware num navegador, como dizem as instruções do nó.
Flood advert Anúncio flood
Flood hop limit Limite de saltos de floods
Flood send delay Atraso de envio flood
Floods with more hops are not repeated. 0 to 64. Floods com mais saltos não são repetidos. 0 a 64.
Frequency: 150 to 2500 MHz Frequência: 150 a 2500 MHz
Guest Convidado
Guest password Senha de convidado
Hours between flood adverts: 0 (off) or 3 to 168. Horas entre anúncios flood: 0 (desligado) ou 3 a 168.
How hard to drop packets that came back around. Com que rigor descartar pacotes que voltaram em loop.
Identity Identidade
Identity & location Identidade e local
Last reply Última resposta
Last signal Último sinal
Lets a wrong or blank password in to read, not to post. Deixa entrar com senha errada ou vazia para ler, não para postar.
Load more (%d of %u) Carregar mais (%d de %u)
Local advert Anúncio local
Location Local
Log in Entrar
Log in as admin Entrar como administrador
Log in as guest Entrar como convidado
Logged in as a guest: you can read the status and neighbours. Log in with the admin password to change settings. Conectado como convidado: você pode ler o status e os vizinhos. Entre com a senha de administrador para alterar ajustes.
Logged in without admin rights. Log in with the admin password to change settings. Conectado sem direitos de administrador. Entre com a senha de administrador para alterar ajustes.
Logging in... Entrando...
Login refused. Login recusado.
Logs in as a guest. Blank lets anyone in as a guest. Up to 15 characters. Entra como convidado. Vazia deixa qualquer um entrar como convidado. Até 15 caracteres.
Loop detection Detecção de loops
Manage Gerenciar
Members log in with it to post. Up to 15 characters. Os membros entram com ela para postar. Até 15 caracteres.
Minutes between zero-hop adverts: 0 (off) or 60 to 240. Minutos entre anúncios de salto zero: 0 (desligado) ou 60 a 240.
Moderate Moderada
Neighbours Vizinhos
New password Nova senha
Newest Mais recentes
No neighbours heard yet. Nenhum vizinho ouvido ainda.
No reply Sem resposta
No reply from the node O nó não respondeu
No reply. Check the password, that the node is in range, and this device's clock. Sem resposta. Confira a senha, se o nó está ao alcance e o relógio deste aparelho.
No reply. It may or may not have been applied: read it again. Sem resposta. Pode ter sido aplicado ou não: leia de novo.
No spaces Sem espaços
Nobody on the list. Ninguém na lista.
Node clock Relógio do nó
Noise floor Ruído de fundo
Not in your contacts Não está nos seus contatos
Not in your contacts, so only removing is possible here. Não está nos seus contatos, então aqui só é possível remover.
Not saved Não salvo
Off: this node stops forwarding anything. Desligado: este nó para de encaminhar qualquer coisa.
Order Ordem
Owner Dono
Owner info Info do dono
Password Senha
Passwords Senhas
Passwords & access Senhas e acesso
Posts Mensagens
Prefers stronger copies of a flood. 0 to 20. Prefere as cópias mais fortes de um flood. 0 a 20.
Queue Fila
Random delay factor before repeating a flood. 0 to 2. Fator de atraso aleatório antes de repetir um flood. 0 a 2.
Read again Ler de novo
Read-only Somente leitura
Read-only access Acesso somente leitura
Read-write Leitura e escrita
Reading... Lendo...
Reboot sent. The node is back in about 10 s. Reinício enviado. O nó volta em cerca de 10 s.
Reboot the node? It is off the air for about 10 s and forgets guest logins. Reiniciar o nó? Ele fica fora do ar por cerca de 10 s e esquece os logins de convidado.
Receive delay Atraso de recepção
Received Recebidos
Refresh Atualizar
Regions Regiões
Remove access Remover acesso
Remove this client's access? Remover o acesso deste cliente?
Repeat packets Repetir pacotes
Repeaters this node hears directly, with the signal it hears them at. Repetidores que este nó ouve diretamente, com o sinal com que os ouve.
Repeating Repetição
Repeating & limits Repetição e limites
Reset counters Zerar contadores
Reset the node's packet counters? Zerar os contadores de pacotes do nó?
Room password Senha da sala
Save (after a reboot) Salvar (após reiniciar)
Save new radio settings?\nNow: %s\nNew: %s\nThey apply after a reboot. Wrong values can cut this node off for good. Salvar novos ajustes de rádio?\nAgora: %s\nNovos: %s\nEles valem após um reinício. Valores errados podem isolar este nó para sempre.
Saved. Applies after a reboot. Salvo. Vale após um reinício.
Saved. The node uses the new radio settings after a reboot. Reboot it now? Salvo. O nó usa os novos ajustes de rádio após um reinício. Reiniciar agora?
Saving... Salvando...
Send flood advert Enviar anúncio flood
Send now Enviar agora
Send zero-hop advert Enviar anúncio de salto zero
Set the node's position to this device's position? Definir a posição do nó como a posição deste aparelho?
Shown to anyone who asks this node. Up to 119 characters. Mostrado a quem perguntar a este nó. Até 119 caracteres.
Spreading factor Fator de espalhamento
Start a firmware update on the node? It opens its own Wi-Fi access point until it is updated or rebooted, and stops repeating meanwhile. Iniciar uma atualização de firmware no nó? Ele abre seu próprio ponto de acesso Wi-Fi até ser atualizado ou reiniciado, e enquanto isso não repete nada.
Start firmware update Iniciar atualização de firmware
Status Status
Strict Rigorosa
Strongest Mais fortes
Sync clock to this device Sincronizar relógio com este aparelho
The node's region tree: ^ marks its home region, F that it repeats floods for that region. Edit regions in the Console. A árvore de regiões do nó: ^ marca sua região de origem, F que ele repete floods dessa região. Edite as regiões no Console.
The passwords do not match As senhas não coincidem
The position goes out in the node's adverts. A posição vai nos anúncios do nó.
The same for direct packets. 0 to 2. O mesmo para pacotes diretos. 0 a 2.
The same limit for adverts. 0 to 64. O mesmo limite para anúncios. 0 a 64.
This device Este aparelho
This device has no position Este aparelho não tem posição
Transmit power Potência de transmissão
Try Testar
Try for 10 minutes Testar por 10 minutos
Try new radio settings for %u minutes?\nNow: %s\nTry: %s\nThe node goes back by itself. Until then you reach it only on the new settings. Testar novos ajustes de rádio por %u minutos?\nAgora: %s\nTeste: %s\nO nó volta sozinho. Até lá, você só o alcança com os novos ajustes.
Up to 31 characters, without [ ] \\ : , ? * Até 31 caracteres, sem [ ] \\ : , ? *
Updated %s ago Atualizado há %s
Uptime Tempo ligado
Use my position Usar minha posição
Use this device's settings Usar os ajustes deste aparelho
Wrong radio settings can cut this node off: you then reach it only on the new settings, or not at all. Try them first; the node goes back by itself. Ajustes de rádio errados podem isolar este nó: você só o alcança com os novos ajustes, ou nunca mais. Teste-os primeiro; o nó volta sozinho.
dBm, -9 to 30. Applies at once. dBm, -9 a 30. Vale na hora.
pushed enviados
you você
Flood in / out Flood entrada / saída
Direct in / out Direto entrada / saída
Airtime TX / RX Tempo no ar TX / RX
+174 -1
View File
@@ -1,7 +1,7 @@
# wadamesh language file
# canonical source - translators: edit this file and PR it
# code: ro
# ver: 26
# ver: 28
# name: Română
# base: ro
(device behind) (dispozitiv în urmă)
@@ -1988,3 +1988,176 @@ Showing the first %d tracks Se arată primele %d piese
Sound is off: Settings > Sound Sunetul este oprit: Setări > Sunet
Stopped Oprit
This device cannot play music. Acest dispozitiv nu poate reda muzică.
# Settings > Device / keyboard protocol / setup wizard strings
Hardware Hardware
Display & lock Afişaj şi blocare
Keep Bluetooth on to pair the MeshCore app on your phone. Wi-Fi can be set up anytime in Settings. Lasă Bluetooth pornit pentru a asocia aplicația MeshCore de pe telefon. Wi-Fi se poate configura oricând din Setări.
Radio: Radio:
Keyboard: Tastatură:
newer keyboard tastatură nouă
older keyboard tastatură veche
older keyboard (set manually) tastatură veche (setată manual)
keyboard not detected yet tastatura nu a fost detectată încă
Always use the external antenna (MMCX) Folosește mereu antena externă (MMCX)
Starts on the external socket at every boot. Only for an antenna that stays connected. Pornește pe conectorul extern la fiecare pornire. Doar pentru o antenă care rămâne conectată.
Only pick External with an antenna fitted to the external socket. After a reboot it starts on the on-board antenna, unless the switch below is on. Alege Externă doar cu o antenă montată pe conectorul extern. După o repornire pornește pe antena integrată, dacă comutatorul de mai jos nu este activ.
Always use the external antenna?\n\nThe radio will start on the external (MMCX) socket at every boot. Transmitting without an antenna attached can damage the radio.\n\nOnly turn this on if your external antenna stays connected. Folosești mereu antena externă?\n\nRadioul va porni pe conectorul extern (MMCX) la fiecare pornire. Transmisia fără antenă conectată poate defecta radioul.\n\nActivează doar dacă antena externă rămâne conectată.
Turn on Activează
On-board antenna selected Antenă integrată selectată
External antenna at every boot Antenă externă la fiecare pornire
Antenna Antenă
On-board Integrată
Glass tiles Plăci de sticlă
Widgets, cards and panel tiles let the background show through. Off: solid tiles. Widgeturile, cardurile și plăcile din panou lasă fundalul să se vadă. Oprit: plăci opace.
# repeater admin app
0 to 9. Higher waits longer between sends. 0 până la 9. Mai mare așteaptă mai mult între trimiteri.
A name is required Este nevoie de un nume
A node clock only moves forward: syncing cannot set it back. Ceasul unui nod merge doar înainte: sincronizarea nu îl poate da înapoi.
A room server lists only its admins here. Un server de cameră listează aici doar administratorii săi.
Access Acces
Access changed Acces schimbat
Actions Acțiuni
Admin password Parolă de administrator
Admin password changed. Parola de administrator a fost schimbată.
Admin password for full control, or the room password. Parola de administrator pentru control complet, sau parola camerei.
Admin password for full control. A guest sees status and neighbours. Parola de administrator pentru control complet. Un oaspete vede starea și vecinii.
Advanced Avansat
Advert hop limit Limită de salturi pentru anunțuri
Advert intervals Intervale de anunț
Adverts Anunțuri
Again Din nou
Airtime factor Factor de timp în aer
Bandwidth Lățime de bandă
Change Schimbă
Change radio settings Schimbă setările radio
Change the admin password? If you lose it you can no longer manage this node over the mesh. Schimbi parola de administrator? Dacă o pierzi, nu mai poți administra acest nod prin rețea.
Clients Clienți
Coding rate Rată de codare
Console Consolă
Current Actual
Decimal degrees, for example 4.4025 Grade zecimale, de exemplu 4.4025
Decimal degrees, for example 51.2194 Grade zecimale, de exemplu 51.2194
Direct send delay Întârziere trimitere directă
Discover neighbours Caută vecini
Duplicates Duplicate
Enter a number Introdu un număr
Enter a password Introdu o parolă
Error Eroare
Errors Erori
Firmware update: the node opens a Wi-Fi access point; join it and upload the new firmware in a browser, as the node's own instructions say. Actualizare: nodul deschide un punct de acces Wi-Fi; conectează-te la el și încarcă noul firmware într-un browser, cum spun instrucțiunile nodului.
Flood advert Anunț flood
Flood hop limit Limită de salturi pentru flood
Flood send delay Întârziere trimitere flood
Floods with more hops are not repeated. 0 to 64. Floodurile cu mai multe salturi nu sunt repetate. 0 până la 64.
Frequency: 150 to 2500 MHz Frecvență: 150 până la 2500 MHz
Guest Oaspete
Guest password Parolă de oaspete
Hours between flood adverts: 0 (off) or 3 to 168. Ore între anunțuri flood: 0 (oprit) sau 3 până la 168.
How hard to drop packets that came back around. Cât de strict se aruncă pachetele care s-au întors în buclă.
Identity Identitate
Identity & location Identitate și locație
Last reply Ultimul răspuns
Last signal Ultimul semnal
Lets a wrong or blank password in to read, not to post. Lasă să intre cu o parolă greșită sau goală pentru citire, nu pentru postare.
Load more (%d of %u) Încarcă mai mult (%d din %u)
Local advert Anunț local
Location Locație
Log in Autentificare
Log in as admin Autentificare ca administrator
Log in as guest Autentificare ca oaspete
Logged in as a guest: you can read the status and neighbours. Log in with the admin password to change settings. Autentificat ca oaspete: poți citi starea și vecinii. Autentifică-te cu parola de administrator pentru a schimba setările.
Logged in without admin rights. Log in with the admin password to change settings. Autentificat fără drepturi de administrator. Autentifică-te cu parola de administrator pentru a schimba setările.
Logging in... Autentificare...
Login refused. Autentificare refuzată.
Logs in as a guest. Blank lets anyone in as a guest. Up to 15 characters. Autentifică ca oaspete. Goală lasă pe oricine ca oaspete. Până la 15 caractere.
Loop detection Detectare bucle
Manage Administrare
Members log in with it to post. Up to 15 characters. Membrii se autentifică cu ea ca să posteze. Până la 15 caractere.
Minutes between zero-hop adverts: 0 (off) or 60 to 240. Minute între anunțuri zero-hop: 0 (oprit) sau 60 până la 240.
Moderate Moderată
Neighbours Vecini
New password Parolă nouă
Newest Cele mai noi
No neighbours heard yet. Niciun vecin auzit încă.
No reply Niciun răspuns
No reply from the node Nodul nu răspunde
No reply. Check the password, that the node is in range, and this device's clock. Niciun răspuns. Verifică parola, dacă nodul e în rază și ceasul acestui dispozitiv.
No reply. It may or may not have been applied: read it again. Niciun răspuns. Poate s-a aplicat, poate nu: citește din nou.
No spaces Fără spații
Nobody on the list. Nimeni pe listă.
Node clock Ceasul nodului
Noise floor Zgomot de fond
Not in your contacts Nu e în contactele tale
Not in your contacts, so only removing is possible here. Nu e în contactele tale, deci aici se poate doar elimina.
Not saved Nesalvat
Off: this node stops forwarding anything. Oprit: acest nod nu mai retransmite nimic.
Order Ordine
Owner Proprietar
Owner info Info proprietar
Password Parolă
Passwords Parole
Passwords & access Parole și acces
Posts Postări
Prefers stronger copies of a flood. 0 to 20. Preferă copiile mai puternice ale unui flood. 0 până la 20.
Queue Coadă
Random delay factor before repeating a flood. 0 to 2. Factor de întârziere aleator înainte de a repeta un flood. 0 până la 2.
Read again Citește din nou
Read-only Doar citire
Read-only access Acces doar citire
Read-write Citire și scriere
Reading... Se citește...
Reboot sent. The node is back in about 10 s. Repornire trimisă. Nodul revine în circa 10 s.
Reboot the node? It is off the air for about 10 s and forgets guest logins. Repornești nodul? Nu emite circa 10 s și uită autentificările oaspeților.
Receive delay Întârziere recepție
Received Primite
Refresh Reîmprospătează
Regions Regiuni
Remove access Elimină accesul
Remove this client's access? Elimini accesul acestui client?
Repeat packets Repetă pachete
Repeaters this node hears directly, with the signal it hears them at. Repetoarele pe care acest nod le aude direct, cu semnalul cu care le aude.
Repeating Repetare
Repeating & limits Repetare și limite
Reset counters Resetează contoarele
Reset the node's packet counters? Resetezi contoarele de pachete ale nodului?
Room password Parola camerei
Save (after a reboot) Salvează (după repornire)
Save new radio settings?\nNow: %s\nNew: %s\nThey apply after a reboot. Wrong values can cut this node off for good. Salvezi noile setări radio?\nAcum: %s\nNoi: %s\nSe aplică după o repornire. Valori greșite pot izola definitiv acest nod.
Saved. Applies after a reboot. Salvat. Se aplică după o repornire.
Saved. The node uses the new radio settings after a reboot. Reboot it now? Salvat. Nodul folosește noile setări radio după o repornire. Îl repornești acum?
Saving... Se salvează...
Send flood advert Trimite anunț flood
Send now Trimite acum
Send zero-hop advert Trimite anunț zero-hop
Set the node's position to this device's position? Setezi poziția nodului la poziția acestui dispozitiv?
Shown to anyone who asks this node. Up to 119 characters. Afișat oricui întreabă acest nod. Până la 119 caractere.
Spreading factor Factor de împrăștiere
Start a firmware update on the node? It opens its own Wi-Fi access point until it is updated or rebooted, and stops repeating meanwhile. Pornești o actualizare de firmware pe nod? Deschide propriul punct de acces Wi-Fi până e actualizat sau repornit și între timp nu mai repetă nimic.
Start firmware update Pornește actualizarea de firmware
Strict Strictă
Strongest Cele mai puternice
Sync clock to this device Sincronizează ceasul cu acest dispozitiv
The node's region tree: ^ marks its home region, F that it repeats floods for that region. Edit regions in the Console. Arborele de regiuni al nodului: ^ marchează regiunea de bază, F că repetă floodurile pentru acea regiune. Regiunile se editează în Consolă.
The passwords do not match Parolele nu se potrivesc
The position goes out in the node's adverts. Poziția pleacă în anunțurile nodului.
The same for direct packets. 0 to 2. La fel pentru pachetele directe. 0 până la 2.
The same limit for adverts. 0 to 64. Aceeași limită pentru anunțuri. 0 până la 64.
This device Acest dispozitiv
This device has no position Acest dispozitiv nu are poziție
Transmit power Putere de emisie
Try Încearcă
Try for 10 minutes Încearcă 10 minute
Try new radio settings for %u minutes?\nNow: %s\nTry: %s\nThe node goes back by itself. Until then you reach it only on the new settings. Încerci noi setări radio timp de %u minute?\nAcum: %s\nTest: %s\nNodul revine singur. Până atunci îl găsești doar pe noile setări.
Up to 31 characters, without [ ] \\ : , ? * Până la 31 de caractere, fără [ ] \\ : , ? *
Updated %s ago Actualizat acum %s
Uptime Timp de funcționare
Use my position Folosește poziția mea
Use this device's settings Folosește setările acestui dispozitiv
Wrong radio settings can cut this node off: you then reach it only on the new settings, or not at all. Try them first; the node goes back by itself. Setări radio greșite pot izola acest nod: îl găsești apoi doar pe noile setări, sau deloc. Încearcă-le întâi; nodul revine singur.
dBm, -9 to 30. Applies at once. dBm, -9 până la 30. Se aplică imediat.
pushed trimise
you tu
Flood in / out Flood intrare / ieșire
Direct in / out Direct intrare / ieșire
Airtime TX / RX Timp în aer TX / RX
+951 -749
View File
File diff suppressed because it is too large. Load diff
+174 -1
View File
@@ -1,7 +1,7 @@
# wadamesh language file
# canonical source - translators: edit this file and PR it
# code: sr
# ver: 26
# ver: 28
# name: Српски
# base: sr
(device behind) (уређај касни)
@@ -1987,3 +1987,176 @@ Showing the first %d tracks Приказано првих %d песама
Sound is off: Settings > Sound Звук је искључен: Подешавања > Звук
Stopped Заустављено
This device cannot play music. Овај уређај не може да пушта музику.
# Settings > Device / keyboard protocol / setup wizard strings
Hardware Хардвер
Display & lock Приказ и закључавање
Keep Bluetooth on to pair the MeshCore app on your phone. Wi-Fi can be set up anytime in Settings. Оставите Bluetooth укључен да бисте упарили апликацију MeshCore на телефону. Wi-Fi можете подесити било када у Подешавањима.
Radio: Радио:
Keyboard: Тастатура:
newer keyboard новија тастатура
older keyboard старија тастатура
older keyboard (set manually) старија тастатура (ручно подешено)
keyboard not detected yet тастатура још није препозната
Always use the external antenna (MMCX) Увек спољна антена (MMCX)
Starts on the external socket at every boot. Only for an antenna that stays connected. При сваком покретању ради преко спољног прикључка. Само за антену која остаје прикључена.
Only pick External with an antenna fitted to the external socket. After a reboot it starts on the on-board antenna, unless the switch below is on. Изаберите Спољну само са антеном на спољном прикључку. После поновног покретања креће на уграђеној антени, осим ако је прекидач испод укључен.
Always use the external antenna?\n\nThe radio will start on the external (MMCX) socket at every boot. Transmitting without an antenna attached can damage the radio.\n\nOnly turn this on if your external antenna stays connected. Увек користити спољну антену?\n\nРадио ће се покретати на спољном прикључку (MMCX) при сваком укључивању. Слање без прикључене антене може оштетити радио.\n\nУкључите ово само ако спољна антена остаје прикључена.
Turn on Укључи
On-board antenna selected Изабрана уграђена антена
External antenna at every boot Спољна антена при сваком покретању
Antenna Антена
On-board Уграђена
Glass tiles Стаклене плочице
Widgets, cards and panel tiles let the background show through. Off: solid tiles. Виџети, картице и плочице панела пропуштају позадину. Искључено: пуне плочице.
# repeater admin app
0 to 9. Higher waits longer between sends. Од 0 до 9. Веће чека дуже између слања.
A name is required Име је обавезно
A node clock only moves forward: syncing cannot set it back. Сат чвора иде само унапред: синхронизација не може да га врати уназад.
A room server lists only its admins here. Room сервер овде приказује само своје администраторе.
Access Приступ
Access changed Приступ је промењен
Actions Радње
Admin password Лозинка администратора
Admin password changed. Лозинка администратора је промењена.
Admin password for full control, or the room password. Лозинка администратора за пуну контролу, или лозинка собе.
Admin password for full control. A guest sees status and neighbours. Лозинка администратора за пуну контролу. Гост види стање и суседе.
Advanced Напредно
Advert hop limit Ограничење скокова за огласе
Advert intervals Интервали огласа
Adverts Огласи
Again Поново
Airtime factor Фактор времена емитовања
Bandwidth Ширина опсега
Change Промени
Change radio settings Промени радио подешавања
Change the admin password? If you lose it you can no longer manage this node over the mesh. Променити лозинку администратора? Ако је изгубите, више не можете да управљате овим чвором преко мреже.
Clients Клијенти
Coding rate Брзина кодирања
Console Конзола
Current Тренутно
Decimal degrees, for example 4.4025 Децимални степени, на пример 4.4025
Decimal degrees, for example 51.2194 Децимални степени, на пример 51.2194
Direct send delay Кашњење директног слања
Discover neighbours Тражи суседе
Duplicates Дупликати
Enter a number Унесите број
Enter a password Унесите лозинку
Error Грешка
Errors Грешке
Firmware update: the node opens a Wi-Fi access point; join it and upload the new firmware in a browser, as the node's own instructions say. Ажурирање: чвор отвара Wi-Fi приступну тачку; повежите се на њу и отпремите нови фирмвер у прегледачу, како кажу упутства чвора.
Flood advert Flood оглас
Flood hop limit Ограничење скокова за flood
Flood send delay Кашњење flood слања
Floods with more hops are not repeated. 0 to 64. Flood са више скокова се не понавља. Од 0 до 64.
Frequency: 150 to 2500 MHz Фреквенција: од 150 до 2500 MHz
Guest Гост
Guest password Лозинка госта
Hours between flood adverts: 0 (off) or 3 to 168. Сати између flood огласа: 0 (искључено) или од 3 до 168.
How hard to drop packets that came back around. Колико строго одбацити пакете који су се вратили у круг.
Identity Идентитет
Identity & location Идентитет и локација
Last reply Последњи одговор
Last signal Последњи сигнал
Lets a wrong or blank password in to read, not to post. Пушта са погрешном или празном лозинком ради читања, не објављивања.
Load more (%d of %u) Учитај још (%d од %u)
Local advert Локални оглас
Location Локација
Log in Пријава
Log in as admin Пријава као администратор
Log in as guest Пријава као гост
Logged in as a guest: you can read the status and neighbours. Log in with the admin password to change settings. Пријављени сте као гост: можете да читате стање и суседе. Пријавите се лозинком администратора да бисте мењали подешавања.
Logged in without admin rights. Log in with the admin password to change settings. Пријављени сте без права администратора. Пријавите се лозинком администратора да бисте мењали подешавања.
Logging in... Пријављивање...
Login refused. Пријава је одбијена.
Logs in as a guest. Blank lets anyone in as a guest. Up to 15 characters. Пријављује као госта. Празна пушта свакога као госта. До 15 знакова.
Loop detection Откривање петљи
Manage Управљање
Members log in with it to post. Up to 15 characters. Чланови се њом пријављују да би објављивали. До 15 знакова.
Minutes between zero-hop adverts: 0 (off) or 60 to 240. Минути између огласа без скока: 0 (искључено) или од 60 до 240.
Moderate Умерено
Neighbours Суседи
New password Нова лозинка
Newest Најновији
No neighbours heard yet. Још нису чути суседи.
No reply Нема одговора
No reply from the node Чвор не одговара
No reply. Check the password, that the node is in range, and this device's clock. Нема одговора. Проверите лозинку, да ли је чвор у домету, и сат овог уређаја.
No reply. It may or may not have been applied: read it again. Нема одговора. Можда је примењено, а можда није: прочитајте поново.
No spaces Без размака
Nobody on the list. На листи нема никога.
Node clock Сат чвора
Noise floor Ниво шума
Not in your contacts Није у вашим контактима
Not in your contacts, so only removing is possible here. Није у вашим контактима, па је овде могуће само уклањање.
Not saved Није сачувано
Off: this node stops forwarding anything. Искључено: овај чвор престаје да прослеђује било шта.
Order Редослед
Owner Власник
Owner info Подаци о власнику
Password Лозинка
Passwords Лозинке
Passwords & access Лозинке и приступ
Posts Објаве
Prefers stronger copies of a flood. 0 to 20. Даје предност јачим копијама flood-а. Од 0 до 20.
Queue Ред чекања
Random delay factor before repeating a flood. 0 to 2. Насумични фактор кашњења пре понављања flood-а. Од 0 до 2.
Read again Прочитај поново
Read-only Само читање
Read-only access Приступ само за читање
Read-write Читање и писање
Reading... Читање...
Reboot sent. The node is back in about 10 s. Поновно покретање послато. Чвор се враћа за око 10 s.
Reboot the node? It is off the air for about 10 s and forgets guest logins. Поново покренути чвор? Око 10 s није у етру и заборавља пријаве гостију.
Receive delay Кашњење пријема
Received Примљено
Refresh Освежи
Regions Региони
Remove access Уклони приступ
Remove this client's access? Уклонити приступ овог клијента?
Repeat packets Понављај пакете
Repeaters this node hears directly, with the signal it hears them at. Репетитори које овај чвор чује директно, са сигналом са којим их чује.
Repeating Понављање
Repeating & limits Понављање и ограничења
Reset counters Ресетуј бројаче
Reset the node's packet counters? Ресетовати бројаче пакета чвора?
Room password Лозинка собе
Save (after a reboot) Сачувај (после поновног покретања)
Save new radio settings?\nNow: %s\nNew: %s\nThey apply after a reboot. Wrong values can cut this node off for good. Сачувати нова радио подешавања?\nСада: %s\nНова: %s\nВаже после поновног покретања. Погрешне вредности могу заувек да одсеку овај чвор.
Saved. Applies after a reboot. Сачувано. Важи после поновног покретања.
Saved. The node uses the new radio settings after a reboot. Reboot it now? Сачувано. Чвор користи нова радио подешавања после поновног покретања. Поново покренути сада?
Saving... Чување...
Send flood advert Пошаљи flood оглас
Send now Пошаљи сада
Send zero-hop advert Пошаљи оглас без скока
Set the node's position to this device's position? Поставити позицију чвора на позицију овог уређаја?
Shown to anyone who asks this node. Up to 119 characters. Приказује се свакоме ко пита овај чвор. До 119 знакова.
Spreading factor Фактор ширења
Start a firmware update on the node? It opens its own Wi-Fi access point until it is updated or rebooted, and stops repeating meanwhile. Покренути ажурирање фирмвера на чвору? Отвара сопствену Wi-Fi приступну тачку док не буде ажуриран или поново покренут, и у међувремену ништа не понавља.
Start firmware update Покрени ажурирање фирмвера
Strict Строго
Strongest Најјачи
Sync clock to this device Синхронизуј сат са овим уређајем
The node's region tree: ^ marks its home region, F that it repeats floods for that region. Edit regions in the Console. Стабло региона чвора: ^ означава његов матични регион, F да понавља flood за тај регион. Регионе мењајте у Конзоли.
The passwords do not match Лозинке се не поклапају
The position goes out in the node's adverts. Позиција иде у огласима чвора.
The same for direct packets. 0 to 2. Исто за директне пакете. Од 0 до 2.
The same limit for adverts. 0 to 64. Исто ограничење за огласе. Од 0 до 64.
This device Овај уређај
This device has no position Овај уређај нема позицију
Transmit power Снага предаје
Try Пробај
Try for 10 minutes Пробај 10 минута
Try new radio settings for %u minutes?\nNow: %s\nTry: %s\nThe node goes back by itself. Until then you reach it only on the new settings. Пробати нова радио подешавања %u минута?\nСада: %s\nПроба: %s\nЧвор се сам враћа. Дотле га достижете само на новим подешавањима.
Up to 31 characters, without [ ] \\ : , ? * До 31 знака, без [ ] \\ : , ? *
Updated %s ago Ажурирано пре %s
Uptime Време рада
Use my position Користи моју позицију
Use this device's settings Користи подешавања овог уређаја
Wrong radio settings can cut this node off: you then reach it only on the new settings, or not at all. Try them first; the node goes back by itself. Погрешна радио подешавања могу да одсеку овај чвор: тада га достижете само на новим подешавањима, или никако. Прво их пробајте; чвор се сам враћа.
dBm, -9 to 30. Applies at once. dBm, од -9 до 30. Важи одмах.
pushed послато
you ви
Flood in / out Flood улаз / излаз
Direct in / out Директни улаз / излаз
Airtime TX / RX Време емитовања TX / RX
+174 -1
View File
@@ -1,7 +1,7 @@
# wadamesh language file
# canonical source - translators: edit this file and PR it
# code: uk
# ver: 26
# ver: 28
# name: Українська
# base: uk
(device behind) (пристрій відстає)
@@ -1987,3 +1987,176 @@ Showing the first %d tracks Показано перші %d треків
Sound is off: Settings > Sound Звук вимкнено: Налаштування > Звук
Stopped Зупинено
This device cannot play music. Цей пристрій не може відтворювати музику.
# Settings > Device / keyboard protocol / setup wizard strings
Hardware Обладнання
Display & lock Екран і блокування
Keep Bluetooth on to pair the MeshCore app on your phone. Wi-Fi can be set up anytime in Settings. Залиште Bluetooth увімкненим, щоб під'єднати застосунок MeshCore на телефоні. Wi-Fi можна налаштувати будь-коли в Налаштуваннях.
Radio: Радіомодуль:
Keyboard: Клавіатура:
newer keyboard новіша клавіатура
older keyboard старіша клавіатура
older keyboard (set manually) старіша клавіатура (задано вручну)
keyboard not detected yet клавіатуру ще не визначено
Always use the external antenna (MMCX) Завжди зовнішня антена (MMCX)
Starts on the external socket at every boot. Only for an antenna that stays connected. Під час кожного запуску працює через зовнішній роз'єм. Лише для антени, що лишається підключеною.
Only pick External with an antenna fitted to the external socket. After a reboot it starts on the on-board antenna, unless the switch below is on. Обирайте Зовнішню лише з антеною на зовнішньому роз'ємі. Після перезапуску вмикається вбудована антена, якщо перемикач нижче не ввімкнено.
Always use the external antenna?\n\nThe radio will start on the external (MMCX) socket at every boot. Transmitting without an antenna attached can damage the radio.\n\nOnly turn this on if your external antenna stays connected. Завжди використовувати зовнішню антену?\n\nРадіо запускатиметься на зовнішньому роз'ємі (MMCX) під час кожного ввімкнення. Передавання без підключеної антени може пошкодити радіо.\n\nВмикайте, лише якщо зовнішня антена лишається підключеною.
Turn on Увімкнути
On-board antenna selected Вибрано вбудовану антену
External antenna at every boot Зовнішня антена під час кожного запуску
Antenna Антена
On-board Вбудов.
Glass tiles Скляні плитки
Widgets, cards and panel tiles let the background show through. Off: solid tiles. Віджети, картки й плитки панелі пропускають тло. Вимк.: суцільні плитки.
# repeater admin app
0 to 9. Higher waits longer between sends. Від 0 до 9. Більше значення довше чекає між надсиланнями.
A name is required Потрібне ім'я
A node clock only moves forward: syncing cannot set it back. Годинник вузла йде лише вперед: синхронізація не може повернути його назад.
A room server lists only its admins here. Room-сервер показує тут лише своїх адміністраторів.
Access Доступ
Access changed Доступ змінено
Actions Дії
Admin password Пароль адміністратора
Admin password changed. Пароль адміністратора змінено.
Admin password for full control, or the room password. Пароль адміністратора для повного керування або пароль кімнати.
Admin password for full control. A guest sees status and neighbours. Пароль адміністратора для повного керування. Гість бачить стан і сусідів.
Advanced Додатково
Advert hop limit Ліміт хопів для оголошень
Advert intervals Інтервали оголошень
Adverts Оголошення
Again Ще раз
Airtime factor Коефіцієнт ефірного часу
Bandwidth Ширина смуги
Change Змінити
Change radio settings Змінити налаштування радіо
Change the admin password? If you lose it you can no longer manage this node over the mesh. Змінити пароль адміністратора? Якщо ви його втратите, то більше не зможете керувати цим вузлом через мережу.
Clients Клієнти
Coding rate Швидкість кодування
Console Консоль
Current Поточні
Decimal degrees, for example 4.4025 Десяткові градуси, наприклад 4.4025
Decimal degrees, for example 51.2194 Десяткові градуси, наприклад 51.2194
Direct send delay Затримка прямого надсилання
Discover neighbours Шукати сусідів
Duplicates Дублікати
Enter a number Введіть число
Enter a password Введіть пароль
Error Помилка
Errors Помилки
Firmware update: the node opens a Wi-Fi access point; join it and upload the new firmware in a browser, as the node's own instructions say. Оновлення: вузол відкриває точку доступу Wi-Fi; під'єднайтеся до неї й завантажте нову прошивку в браузері, як сказано в інструкціях вузла.
Flood advert Flood-оголошення
Flood hop limit Ліміт хопів для flood
Flood send delay Затримка надсилання flood
Floods with more hops are not repeated. 0 to 64. Flood з більшою кількістю хопів не повторюється. Від 0 до 64.
Frequency: 150 to 2500 MHz Частота: від 150 до 2500 МГц
Guest Гість
Guest password Пароль гостя
Hours between flood adverts: 0 (off) or 3 to 168. Години між flood-оголошеннями: 0 (вимк.) або від 3 до 168.
How hard to drop packets that came back around. Наскільки суворо відкидати пакети, що повернулися по колу.
Identity Ідентифікація
Identity & location Ідентифікація і місце
Last reply Остання відповідь
Last signal Останній сигнал
Lets a wrong or blank password in to read, not to post. Пускає з неправильним або порожнім паролем для читання, але не для дописів.
Load more (%d of %u) Завантажити ще (%d з %u)
Local advert Локальне оголошення
Location Місцезнаходження
Log in Увійти
Log in as admin Увійти як адміністратор
Log in as guest Увійти як гість
Logged in as a guest: you can read the status and neighbours. Log in with the admin password to change settings. Вхід як гість: можна читати стан і сусідів. Увійдіть із паролем адміністратора, щоб змінювати налаштування.
Logged in without admin rights. Log in with the admin password to change settings. Вхід без прав адміністратора. Увійдіть із паролем адміністратора, щоб змінювати налаштування.
Logging in... Вхід...
Login refused. Вхід відхилено.
Logs in as a guest. Blank lets anyone in as a guest. Up to 15 characters. Вхід як гість. Порожній пускає будь-кого гостем. До 15 символів.
Loop detection Виявлення петель
Manage Керування
Members log in with it to post. Up to 15 characters. Учасники входять із ним, щоб писати. До 15 символів.
Minutes between zero-hop adverts: 0 (off) or 60 to 240. Хвилини між оголошеннями без хопів: 0 (вимк.) або від 60 до 240.
Moderate Помірне
Neighbours Сусіди
New password Новий пароль
Newest Найновіші
No neighbours heard yet. Сусідів ще не чути.
No reply Немає відповіді
No reply from the node Вузол не відповідає
No reply. Check the password, that the node is in range, and this device's clock. Немає відповіді. Перевірте пароль, чи вузол у зоні зв'язку, і годинник цього пристрою.
No reply. It may or may not have been applied: read it again. Немає відповіді. Можливо, застосовано, а можливо, ні: прочитайте знову.
No spaces Без пробілів
Nobody on the list. У списку нікого немає.
Node clock Годинник вузла
Noise floor Рівень шуму
Not in your contacts Немає у ваших контактах
Not in your contacts, so only removing is possible here. Немає у ваших контактах, тож тут можна лише видалити.
Not saved Не збережено
Off: this node stops forwarding anything. Вимк.: цей вузол перестає будь-що пересилати.
Order Порядок
Owner Власник
Owner info Інформація власника
Password Пароль
Passwords Паролі
Passwords & access Паролі й доступ
Posts Дописи
Prefers stronger copies of a flood. 0 to 20. Надає перевагу сильнішим копіям flood. Від 0 до 20.
Queue Черга
Random delay factor before repeating a flood. 0 to 2. Випадковий коефіцієнт затримки перед повтором flood. Від 0 до 2.
Read again Прочитати знову
Read-only Лише читання
Read-only access Доступ лише для читання
Read-write Читання й запис
Reading... Читання...
Reboot sent. The node is back in about 10 s. Перезавантаження надіслано. Вузол повернеться приблизно за 10 с.
Reboot the node? It is off the air for about 10 s and forgets guest logins. Перезавантажити вузол? Він буде поза ефіром близько 10 с і забуде входи гостей.
Receive delay Затримка приймання
Received Отримано
Refresh Оновити
Regions Регіони
Remove access Видалити доступ
Remove this client's access? Видалити доступ цього клієнта?
Repeat packets Повторювати пакети
Repeaters this node hears directly, with the signal it hears them at. Ретранслятори, які цей вузол чує напряму, із сигналом, з яким він їх чує.
Repeating Повтор
Repeating & limits Повтор і обмеження
Reset counters Скинути лічильники
Reset the node's packet counters? Скинути лічильники пакетів вузла?
Room password Пароль кімнати
Save (after a reboot) Зберегти (після перезавантаження)
Save new radio settings?\nNow: %s\nNew: %s\nThey apply after a reboot. Wrong values can cut this node off for good. Зберегти нові налаштування радіо?\nЗараз: %s\nНові: %s\nВони діють після перезавантаження. Неправильні значення можуть назавжди відрізати цей вузол.
Saved. Applies after a reboot. Збережено. Діє після перезавантаження.
Saved. The node uses the new radio settings after a reboot. Reboot it now? Збережено. Вузол використає нові налаштування радіо після перезавантаження. Перезавантажити зараз?
Saving... Збереження...
Send flood advert Надіслати flood-оголошення
Send now Надіслати зараз
Send zero-hop advert Надіслати оголошення без хопів
Set the node's position to this device's position? Встановити позицію вузла за позицією цього пристрою?
Shown to anyone who asks this node. Up to 119 characters. Показується кожному, хто запитає цей вузол. До 119 символів.
Spreading factor Фактор розширення
Start a firmware update on the node? It opens its own Wi-Fi access point until it is updated or rebooted, and stops repeating meanwhile. Почати оновлення прошивки на вузлі? Він відкриє власну точку доступу Wi-Fi до оновлення чи перезавантаження і тим часом нічого не повторює.
Start firmware update Почати оновлення прошивки
Strict Суворе
Strongest Найсильніші
Sync clock to this device Синхронізувати годинник із цим пристроєм
The node's region tree: ^ marks its home region, F that it repeats floods for that region. Edit regions in the Console. Дерево регіонів вузла: ^ позначає його домашній регіон, F що він повторює flood для цього регіону. Регіони змінюються в Консолі.
The passwords do not match Паролі не збігаються
The position goes out in the node's adverts. Позиція передається в оголошеннях вузла.
The same for direct packets. 0 to 2. Те саме для прямих пакетів. Від 0 до 2.
The same limit for adverts. 0 to 64. Той самий ліміт для оголошень. Від 0 до 64.
This device Цей пристрій
This device has no position Цей пристрій не має позиції
Transmit power Потужність передавання
Try Спробувати
Try for 10 minutes Спробувати 10 хвилин
Try new radio settings for %u minutes?\nNow: %s\nTry: %s\nThe node goes back by itself. Until then you reach it only on the new settings. Спробувати нові налаштування радіо на %u хвилин?\nЗараз: %s\nПроба: %s\nВузол повернеться сам. До того він доступний лише на нових налаштуваннях.
Up to 31 characters, without [ ] \\ : , ? * До 31 символу, без [ ] \\ : , ? *
Updated %s ago Оновлено %s тому
Uptime Час роботи
Use my position Використати мою позицію
Use this device's settings Використати налаштування цього пристрою
Wrong radio settings can cut this node off: you then reach it only on the new settings, or not at all. Try them first; the node goes back by itself. Неправильні налаштування радіо можуть відрізати цей вузол: тоді він доступний лише на нових налаштуваннях або зовсім недоступний. Спершу спробуйте їх; вузол повернеться сам.
dBm, -9 to 30. Applies at once. дБм, від -9 до 30. Діє одразу.
pushed надіслано
you ви
Flood in / out Flood вхід / вихід
Direct in / out Прямі вхід / вихід
Airtime TX / RX Ефірний час TX / RX
+14 -14
View File
@@ -3,72 +3,72 @@
{
"code": "bg",
"name": "Български",
"ver": "26"
"ver": "28"
},
{
"code": "de",
"name": "Deutsch",
"ver": "26"
"ver": "28"
},
{
"code": "el",
"name": "Ελληνικά",
"ver": "26"
"ver": "28"
},
{
"code": "es",
"name": "Español",
"ver": "26"
"ver": "28"
},
{
"code": "fr",
"name": "Français",
"ver": "26"
"ver": "28"
},
{
"code": "hu",
"name": "Magyar",
"ver": "26"
"ver": "28"
},
{
"code": "it",
"name": "Italiano",
"ver": "26"
"ver": "28"
},
{
"code": "nl",
"name": "Nederlands",
"ver": "26"
"ver": "28"
},
{
"code": "pt-br",
"name": "Português (BR)",
"ver": "26"
"ver": "28"
},
{
"code": "ro",
"name": "Română",
"ver": "26"
"ver": "28"
},
{
"code": "cs",
"name": "Čeština",
"ver": "26"
"ver": "28"
},
{
"code": "ru",
"name": "Русский",
"ver": "26"
"ver": "33"
},
{
"code": "sr",
"name": "Српски",
"ver": "26"
"ver": "28"
},
{
"code": "uk",
"name": "Українська",
"ver": "26"
"ver": "28"
}
]
}
+2 -2
View File
@@ -336,8 +336,8 @@ class Link {
let link = null, info = null, root = null, cwd = '/', entries = [], busy = false, cancelled = false, pingTimer = 0;
const rootsById = {};
const HINTS = {
sd: 'The meshcomod folder is the device\'s own data. You can download it, but not change it here.',
internal: 'Files the device keeps in use (identity, contacts, settings, chat history) are download-only. Put your own files in the transfer folder; settings backups (meshcore-*.json) go in the top folder.',
sd: 'The meshcomod folder is the device\'s own data. You can download it, but not change it here. The one exception is meshcomod/apps, which takes Lua apps (.lua and .json files).',
internal: 'Files the device keeps in use (identity, contacts, settings, chat history) are download-only. Put your own files in the transfer folder; settings backups (meshcore-*.json) go in the top folder, Lua apps (.lua and .json) in the apps folder.',
tiles: 'Offline map tiles, stored as zoom/x/y.png. Upload a tile folder to use it on the map.',
};
+21
View File
@@ -118,6 +118,27 @@
<esp-web-install-button manifest="https://firmware.wadamesh.com/latest-beta/manifest-crowpanel-50.json"></esp-web-install-button>
<span class="unsupported">Use Chrome or Edge on desktop (Web Serial).</span>
</div>
<div class="card">
<h2>Elecrow CrowPanel Advanced 10.1 <span class="beta">Beta</span> <span style="font-weight:600;color:var(--mut)">V1.2</span></h2>
<p>10.1&quot; 1024&times;600 ESP32-P4 touch display and an SX1262 module in the wireless slot.</p>
<p class="warn">Experimental, not yet tested on hardware. Only for <b>board revision V1.2</b> (printed on the board); the other revisions need their own card.</p>
<esp-web-install-button manifest="https://firmware.wadamesh.com/latest-beta/manifest-crowpanel-p4-101-v12.json"></esp-web-install-button>
<span class="unsupported">Use Chrome or Edge on desktop (Web Serial).</span>
</div>
<div class="card">
<h2>Elecrow CrowPanel Advanced 10.1 <span class="beta">Beta</span> <span style="font-weight:600;color:var(--mut)">V1.1</span></h2>
<p>10.1&quot; 1024&times;600 ESP32-P4 touch display and an SX1262 module in the wireless slot.</p>
<p class="warn">Experimental, not yet tested on hardware. Only for <b>board revision V1.1</b> (printed on the board); the other revisions need their own card.</p>
<esp-web-install-button manifest="https://firmware.wadamesh.com/latest-beta/manifest-crowpanel-p4-101-v11.json"></esp-web-install-button>
<span class="unsupported">Use Chrome or Edge on desktop (Web Serial).</span>
</div>
<div class="card">
<h2>Elecrow CrowPanel Advanced 10.1 <span class="beta">Beta</span> <span style="font-weight:600;color:var(--mut)">V1.0</span></h2>
<p>10.1&quot; 1024&times;600 ESP32-P4 touch display and an SX1262 module in the wireless slot.</p>
<p class="warn">Experimental, not yet tested on hardware. Only for <b>board revision V1.0</b> (printed on the board); the other revisions need their own card.</p>
<esp-web-install-button manifest="https://firmware.wadamesh.com/latest-beta/manifest-crowpanel-p4-101-v10.json"></esp-web-install-button>
<span class="unsupported">Use Chrome or Edge on desktop (Web Serial).</span>
</div>
</div>
<div class="note">
<b>How it works:</b> plug the device in over USB, click <b>Connect</b>, pick the serial port,
+96
View File
@@ -0,0 +1,96 @@
# app.wadamesh.com: the WADAMESH web client (web/ in this repo, built by web/build.sh).
#
# Two names, the same files:
# https://app.wadamesh.com full client: USB (Web Serial), Bluetooth, location.
# Cloudflare-proxied (SSL "Flexible"), so it reaches this
# origin on port 80.
# http://wifi.app.wadamesh.com the Wi-Fi version: a node's plain ws:// is mixed
# content from https. Proxied like the rest, but two levels
# deep, which Cloudflare's Universal SSL (apex + *.wadamesh.com)
# does not cover, so https to it fails. That matters: Chrome
# upgrades any http:// URL to https when the name answers
# https, so http://app.wadamesh.com bounces straight back to
# the https copy; a failed https makes Chrome stay on http.
# Keep Cloudflare's "Always Use HTTPS" OFF for the zone.
# The page picks its bundle itself: crossOriginIsolated (https) -> the pthreads build
# in /, otherwise the no-threads build in /nt/ (plain http is not a secure context, so
# COOP/COEP cannot enable SharedArrayBuffer there).
#
# Every response carries COOP/COEP/CORP: the threaded build needs a cross-origin
# isolated page. nginx replaces outer add_header sets inside a location that has its
# own, so each location repeats them ("always" keeps them on 304/404 too).
#
# Map tiles and the app Store are same-origin paths here (no CORS needed, COEP happy):
# they are handed to the tiles / firmware vhosts on this same box over loopback, so
# their rules, caches and allow-lists apply unchanged and nothing goes back out
# through Cloudflare.
server {
listen 80;
listen [::]:80;
server_name app.wadamesh.com wifi.app.wadamesh.com;
root /srv/wadamesh/app;
index index.html;
add_header Cross-Origin-Opener-Policy "same-origin" always;
add_header Cross-Origin-Embedder-Policy "require-corp" always;
add_header Cross-Origin-Resource-Policy "same-origin" always;
gzip_static on;
# The page and the manifest: always revalidate, so a release shows at once.
location / {
try_files $uri $uri/ =404;
add_header Cross-Origin-Opener-Policy "same-origin" always;
add_header Cross-Origin-Embedder-Policy "require-corp" always;
add_header Cross-Origin-Resource-Policy "same-origin" always;
add_header Cache-Control "no-cache" always;
}
# Bundles are requested with ?v=<build hash>: cache them for good.
location ~* \.(wasm|js|css|png|svg|ico|webmanifest)$ {
types {
application/wasm wasm;
text/javascript js;
text/css css;
image/png png;
image/svg+xml svg;
image/x-icon ico;
application/manifest+json webmanifest;
}
add_header Cross-Origin-Opener-Policy "same-origin" always;
add_header Cross-Origin-Embedder-Policy "require-corp" always;
add_header Cross-Origin-Resource-Policy "same-origin" always;
add_header Cache-Control "public, max-age=31536000, immutable" always;
}
# Map tiles: only z/x/y tiles (optionally a style folder) and the elevation query,
# handed to the tiles.wadamesh.com vhost on this box.
location ^~ /tiles/ {
location ~ "^/tiles/((?:[a-z]+/)?[0-9]{1,2}/[0-9]{1,7}/[0-9]{1,7}\.(?:jpg|png)|elev)$" {
rewrite ^/tiles/(.*)$ /$1 break;
proxy_pass http://127.0.0.1:80;
proxy_set_header Host tiles.wadamesh.com;
proxy_set_header Cookie "";
proxy_hide_header Set-Cookie;
add_header Cross-Origin-Resource-Policy "same-origin" always;
add_header Cache-Control "public, max-age=1209600" always;
}
return 404;
}
# The app Store: the catalogs, versioned app folders and language files only (the
# update check, OTA images and reports on that vhost stay unreachable from here).
location ^~ /fw/apps/ {
location ~ "^/fw/apps/(apps\.json|langs\.json|[A-Za-z0-9_-]{1,20}/[0-9][0-9.]{0,7}/[A-Za-z0-9_-][A-Za-z0-9._-]{0,39}|lang/([0-9][0-9.]{0,7}/)?[a-z]{2}(-[a-z]{2})?\.lang)$" {
rewrite ^/fw/(apps/.*)$ /$1 break;
proxy_pass http://127.0.0.1:80;
proxy_set_header Host firmware.wadamesh.com;
proxy_set_header Cookie "";
proxy_hide_header Set-Cookie;
add_header Cross-Origin-Resource-Policy "same-origin" always;
}
return 404;
}
}
+233
View File
@@ -0,0 +1,233 @@
{
"_comment": "Site-only text for wadamesh.com/apps.html. Names, versions and requirements come from deploy/apps/apps.json (the Store catalog); scripts/build/gen-apps-page.py merges the two at every site deploy. One entry per app id. No em dashes.",
"categories": [
{
"id": "radio",
"name": "Radio tools",
"hue": "--hue-radio"
},
{
"id": "outdoors",
"name": "Navigation and outdoors",
"hue": "--hue-place"
},
{
"id": "messaging",
"name": "Messaging and safety",
"hue": "--hue-msg"
},
{
"id": "media",
"name": "Media",
"hue": "--hue-device"
},
{
"id": "games",
"name": "Games",
"hue": "--hue-bad"
},
{
"id": "tools",
"name": "Tools",
"hue": "--hue-sys"
}
],
"apps": {
"monitor": {
"category": "radio",
"glyph": "signal",
"tagline": "Your channel at a glance, and every packet you hear.",
"about": "Live RSSI and noise as tiles and a filled chart, with the noise floor dashed underneath, and the packets heard most recently with their type, signal bars, SNR and hop count. Tap a packet for its details: who sent it, the route it took, how far its SNR sat above what your spreading factor can still decode, its size and how long it was on the air.",
"highlights": [
"Margin above the decode limit, per packet",
"Packet type, route and airtime",
"Works with keys and trackball too"
],
"shot": "img/apps/monitor.png"
},
"airtime": {
"category": "radio",
"glyph": "chart",
"tagline": "How busy the channel really is.",
"about": "The live channel load as a big figure, the average and peak over the session, and your own time on the air. A filled chart shows the load against your region's duty-cycle limit, and a bar splits the airtime into what you received and what you sent. While it runs it keeps a Home widget with the load up to date.",
"highlights": [
"Duty-cycle limit on the chart",
"Receive and transmit split",
"Home widget while it runs (not on the 2 MB Heltec V4)"
],
"shot": "img/apps/airtime.png"
},
"wardrive": {
"category": "radio",
"glyph": "map",
"tagline": "Survey your coverage while you drive or walk.",
"about": "Every 20 seconds it sends a discovery probe that every node in earshot answers, and logs each reply with your GPS position, altitude and both directions of the link: how well you heard them and how well they heard you. The run goes to a CSV you can take off the device, and it plots back on the map so you can check coverage before you drive it again.",
"highlights": [
"Both link directions per node",
"CSV log with position and altitude",
"Run plotted on the map"
]
},
"ping": {
"category": "messaging",
"glyph": "message",
"tagline": "Round-trip time to any contact, with distance and bearing.",
"about": "Sends a ping as a direct message and measures how long the answer takes. Both devices swap their GPS position, so the result shows the round-trip time, the distance and the bearing when both have a fix. It also answers pings from other people running Ping.",
"highlights": [
"Round-trip time over the mesh",
"Distance and bearing when both have GPS",
"Answers other people's pings"
],
"credit": "samuelcoustet"
},
"mecp": {
"category": "messaging",
"glyph": "bell",
"tagline": "Emergency messages everyone can read in their own language.",
"about": "Writes and reads messages in the Mesh Emergency Communication Protocol. Pick a severity and the codes (injury, flooding, need water and many more), add the number of people and your position, and post it to the channel you choose. MECP lines heard on your channels while the app is open are shown decoded in plain words.",
"highlights": [
"Severity, codes, head count and position",
"Decodes MECP messages you receive",
"Plain text, so it crosses any channel"
],
"credit_note": "Code table: MECP by xiang-dev-1, CC BY 4.0",
"credit_user": "xiang-dev-1"
},
"nearby": {
"category": "outdoors",
"glyph": "person",
"tagline": "Your contacts on a real map, nearest first.",
"about": "Shows the contacts that share a position on the firmware's own map tiles, sorted by distance, with the bearing to each one and a live count of the packets you hear. It is also the reference app for the SDK's map, list, geo and packet calls, so it is a good place to start reading code.",
"highlights": [
"Real map tiles inside the app",
"Distance and bearing to each contact",
"Reference app for wada.map and wada.geo"
]
},
"gpscompass": {
"category": "outdoors",
"glyph": "compass",
"tagline": "A compass dial, the live GPS fix, and the way to a contact.",
"about": "A heading dial with the live GPS fix underneath. On the ThinkNode M9 the heading comes from its magnetometer, with a calibration you run once by turning the device around; on other boards it uses your GPS course while you move. Pick a contact with a known position and it appears on the dial with its bearing and range.",
"highlights": [
"Magnetometer heading on the M9",
"GPS course on every other board",
"Bearing and range to a contact"
]
},
"tripodometer": {
"category": "outdoors",
"glyph": "gps",
"tagline": "A trip computer for your walk or ride.",
"about": "Tracks the distance, time, speed and altitude of a trip from the GPS. Start and stop it as you go, reset it for the next trip, and it keeps your trip across app restarts.",
"highlights": [
"Distance, time, speed and altitude",
"Survives app restarts",
"Needs a GPS"
],
"credit": "samuelcoustet"
},
"protreck": {
"category": "outdoors",
"glyph": "star",
"tagline": "An outdoor watch: sun, moon, stopwatch, timer and altitude.",
"about": "Four tools you swipe between. Astro shows sunrise, sunset and the moon phase for where you are. Chrono is a stopwatch with laps, Timer a countdown with an alarm, and Alti your GPS altitude with its minimum, maximum and a trend graph.",
"highlights": [
"Sunrise, sunset and moon phase",
"Stopwatch with laps and a countdown timer",
"Altitude trend graph"
],
"credit": "samuelcoustet"
},
"music": {
"category": "media",
"glyph": "music",
"tagline": "Your MP3s and WAVs from the SD card, with the screen off.",
"about": "Plays the MP3 and WAV files in a Music folder on the SD card, three folder levels deep, so Music/Artist/Album works. Previous, play and pause, next, shuffle and repeat, and it keeps going through the list with the screen off. It follows the device's sound switch and volume, and message chimes stay quiet while a track plays.",
"highlights": [
"Shuffle and repeat, one track or all",
"Keeps playing with the screen off",
"T-Deck, T-LoRa Pager, T-Display P4, Tanmatsu, T-Deck Max"
],
"shot": "img/apps/music.png",
"shot_tall": true
},
"snake": {
"category": "games",
"glyph": "snake",
"tagline": "The classic. Swipe to steer.",
"about": "Eat the food, grow longer, do not bite yourself. Steer with swipes, the trackball or the arrow keys, and tap after a game over to play again. Small enough to read in one sitting, which makes it the SDK's first reference app.",
"highlights": [
"Swipe, trackball or keys",
"Runs on every board, the Heltec V4 included",
"Reference app for wada.ui and wada.input"
]
},
"2048": {
"category": "games",
"glyph": "grid",
"tagline": "The sliding-tile puzzle, with your best score kept.",
"about": "Slide the tiles, merge equal numbers and reach 2048. Swipe or use the trackball to move, tap to start again, and your best score is kept between games.",
"highlights": [
"Best score kept",
"Swipe or trackball"
],
"credit": "pisti87"
},
"tetris": {
"category": "games",
"glyph": "blocks",
"tagline": "The falling-block puzzle.",
"about": "Swipe left and right to move, up to rotate and down to drop. On a keyboard the arrows move and rotate, and Enter or Space drops.",
"highlights": [
"Touch and keyboard controls"
],
"credit": "samuelcoustet"
},
"breakout": {
"category": "games",
"glyph": "bricks",
"tagline": "Brick-breaker, level after level.",
"about": "Move the paddle with swipes or the arrow keys, launch the ball with a swipe up or Enter, and clear every brick to reach the next level.",
"highlights": [
"Levels",
"Touch and keyboard controls"
],
"credit": "samuelcoustet"
},
"blackjack": {
"category": "games",
"glyph": "cards",
"tagline": "Casino Blackjack, with your bankroll kept between sessions.",
"about": "Twenty-one against the dealer from a six-deck shoe. Hit, stand, double down and split, set your bet before each hand, and your bankroll is still there the next time you open the app. Play it by touch, on the keyboard (H, S, D, P) or with the trackball, and the table scales to the screen, the T-Display P4 included.",
"highlights": [
"Split and double down",
"Bankroll kept between sessions",
"Touch, keyboard or trackball"
],
"credit": "halflive-743"
},
"sdscan": {
"category": "tools",
"glyph": "search",
"tagline": "Finds and removes Windows malware on the SD card.",
"about": "Written for the SD-card worm some ThinkNode M9 cards shipped with: a hidden autorun file and Windows programs disguised as shortcuts. They cannot run on a radio, but they run on the first Windows PC the card goes into. The firmware decides what counts as a threat, so the app can remove those files and nothing else: never map tiles, backups or chat history.",
"highlights": [
"Firmware decides what is a threat",
"Cannot delete your own files",
"Asks before removing anything"
]
},
"sdktest": {
"category": "tools",
"glyph": "settings",
"tagline": "For app makers: checks the extended SDK on your board.",
"about": "Runs through the extended Lua SDK on the board in your hand and shows the results on screen: capabilities, clock, battery, GPS, private files, audio, SD listing, crypto against published test vectors and channel discovery. A few buttons transmit test messages, so it is a bench tool rather than something to leave running.",
"highlights": [
"Crypto checked against RFC test vectors",
"Every capability flag on one screen",
"Some buttons transmit"
]
}
}
}
+337
View File
@@ -0,0 +1,337 @@
<!doctype html>
<html lang="en" data-sky="soft">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<script>try{if(localStorage.getItem('wm-theme')==='light')document.documentElement.setAttribute('data-theme','light')}catch(e){}</script>
<meta name="theme-color" content="#000400">
<title>WADAMESH · App Store</title>
<meta name="description" content="The Lua apps you can install on a WADAMESH device from its built-in Store: radio tools, navigation, emergency messaging, music and games. Free, sandboxed and reviewed. Write your own with the SDK.">
<link rel="canonical" href="https://wadamesh.com/apps.html">
<meta property="og:type" content="website">
<meta property="og:site_name" content="WADAMESH">
<meta property="og:url" content="https://wadamesh.com/apps.html">
<meta property="og:title" content="WADAMESH · App Store">
<meta property="og:description" content="Radio tools, navigation, emergency messaging, music and games for your mesh radio. Free, sandboxed and reviewed.">
<meta property="og:image" content="https://wadamesh.com/og-image.png?v=2">
<meta property="og:image:width" content="1200">
<meta property="og:image:height" content="630">
<meta name="twitter:card" content="summary_large_image">
<link rel="icon" href="favicon.ico" sizes="32x32">
<link rel="icon" href="wadamesh-badge.svg" type="image/svg+xml">
<link rel="apple-touch-icon" href="apple-touch-icon.png">
<link rel="preconnect" href="https://fonts.googleapis.com">
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
<link href="https://fonts.googleapis.com/css2?family=Montserrat:wght@500;600;700&family=JetBrains+Mono:wght@600;700&display=swap" rel="stylesheet">
<style>
:root{--bg:#000400; --ink:#E6EBED; --mut:#B0BAC0; --line:#1C2428; --teal:#15B6A6; --teal-ink:#19D6C2; color-scheme:dark}
*{box-sizing:border-box;margin:0;padding:0}
body{font:16px/1.65 -apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,sans-serif; background:var(--bg); color:var(--ink); -webkit-font-smoothing:antialiased}
a{color:var(--teal-ink); text-decoration:none}
a:hover{text-decoration:underline}
.top{position:sticky; top:0; z-index:30; display:flex; align-items:center; gap:14px; padding:12px 22px;
background:var(--bar); -webkit-backdrop-filter:saturate(1.2) blur(10px); backdrop-filter:saturate(1.2) blur(10px); border-bottom:1px solid var(--line)}
.top .word{font-weight:700; letter-spacing:2px; font-size:1.05rem; color:var(--ink)}
.top .word .t{color:var(--teal)}
.top .tag{font-family:'JetBrains Mono',monospace; font-size:.66rem; letter-spacing:.18em; text-transform:uppercase; color:var(--mut); border:1px solid var(--line); border-radius:100px; padding:4px 9px}
.top .sp{flex:1}
.top .home{display:inline-flex; align-items:center; gap:7px; color:var(--mut); font-size:.86rem; border:1px solid var(--line); border-radius:100px; padding:6px 13px; background:var(--control)}
.top .home:hover{color:var(--teal-ink); border-color:var(--teal); text-decoration:none}
.top .home svg{width:16px;height:16px}
.wrap{max-width:1080px; margin:0 auto; padding:0 22px 80px}
h1{font-size:2.1rem; line-height:1.15; margin:38px 0 10px; letter-spacing:-.01em; text-wrap:balance; text-shadow:var(--glow-text)}
.lede{color:var(--sky-sub); max-width:66ch; font-size:1.03rem; text-shadow:var(--glow-text)}
.cta{display:flex; flex-wrap:wrap; gap:10px; margin-top:20px}
.btn{display:inline-flex; align-items:center; gap:8px; padding:10px 18px; border-radius:100px; font-size:.92rem; font-weight:600;
border:1px solid var(--line); background:var(--control); color:var(--ink)}
.btn:hover{text-decoration:none; border-color:var(--teal)}
.btn.pri{background:var(--accent-fill); border-color:var(--accent-fill); color:var(--on-accent)}
.btn svg{width:17px; height:17px}
.steps{display:grid; grid-template-columns:repeat(3,minmax(0,1fr)); gap:12px; margin:30px 0 8px}
.step{padding:14px 16px; border-radius:14px; background:var(--surface); border:1px solid var(--line); font-size:.9rem; color:var(--mut)}
.step b{display:block; color:var(--ink); font-size:.95rem; margin-bottom:2px}
.step .n{font-family:'JetBrains Mono',monospace; color:var(--teal-ink); font-size:.75rem; letter-spacing:.12em}
.chips{display:flex; flex-wrap:wrap; gap:8px; margin:34px -10px 4px; position:sticky; top:66px; z-index:20; padding:8px 10px; border-radius:18px;
background:var(--bar); -webkit-backdrop-filter:saturate(1.2) blur(10px); backdrop-filter:saturate(1.2) blur(10px)}
.chip{display:inline-flex; align-items:center; gap:7px; padding:7px 13px; border-radius:100px; cursor:pointer; font:inherit; font-size:.85rem;
border:1px solid var(--line); background:var(--control); color:var(--ink2)}
.chip span{color:var(--dim); font-size:.78rem; font-variant-numeric:tabular-nums}
.chip:hover{border-color:var(--teal)}
.chip.on{border-color:var(--teal); background:var(--accent-soft); color:var(--teal-ink); font-weight:600}
.cat h2{font-size:1.15rem; margin:30px 0 12px; text-shadow:var(--glow-text)}
.grid{display:grid; grid-template-columns:repeat(auto-fill,minmax(300px,1fr)); gap:16px; align-items:start}
.app{border-radius:16px; background:var(--surface); border:1px solid var(--line); padding:16px; box-shadow:var(--shadow); scroll-margin-top:150px}
.app .shot{margin:-4px -4px 14px; border-radius:11px; background:#05080A; border:1px solid var(--frame-edge); display:grid; place-items:center; padding:10px; height:200px}
.app .shot.poster{color:var(--hue); border-color:color-mix(in srgb, var(--hue) 22%, transparent);
background:radial-gradient(120% 90% at 50% 110%, color-mix(in srgb, var(--hue) 26%, transparent), transparent 70%), var(--bg2)}
.app .shot.poster .pg{width:72px; height:72px; stroke-width:1.3; opacity:.9; filter:drop-shadow(0 0 18px color-mix(in srgb, var(--hue) 55%, transparent))}
.app .shot img{max-width:100%; max-height:180px; width:auto; height:auto; border-radius:6px; display:block}
.app .shot.tall img{width:170px; height:180px; max-height:none; object-fit:cover; object-position:top; border-radius:8px}
.app .head{display:flex; gap:12px; align-items:flex-start}
.app .ico{flex:none; width:46px; height:46px; border-radius:13px; display:grid; place-items:center;
color:var(--hue); background:color-mix(in srgb, var(--hue) 15%, transparent); box-shadow:inset 0 0 0 1px color-mix(in srgb, var(--hue) 30%, transparent)}
.app .ico .g{width:24px; height:24px}
.app h3{font-size:1.05rem; line-height:1.25}
.app .ver{font-family:'JetBrains Mono',monospace; font-size:.7rem; color:var(--dim); font-weight:600; margin-left:4px}
.app .tl{color:var(--mut); font-size:.9rem; margin-top:2px}
.app .runs{display:inline-block; margin-top:12px; padding:3px 10px; border-radius:100px; font-size:.76rem; font-weight:600}
.app .runs.every{color:var(--ok); background:var(--ok-bg)}
.app .runs.most{color:var(--info); background:color-mix(in srgb, var(--info) 14%, transparent)}
.app .runs.some{color:var(--warn-ink); background:var(--warn-bg)}
.app .by{font-size:.8rem; color:var(--dim); margin-top:8px}
.app details{margin-top:10px; border-top:1px solid var(--line); padding-top:8px}
.app summary{cursor:pointer; font-size:.85rem; color:var(--teal-ink); list-style:none}
.app summary::-webkit-details-marker{display:none}
.app summary::before{content:"+ "; font-family:'JetBrains Mono',monospace}
.app details[open] summary::before{content:"\2212 "}
.app details p{font-size:.9rem; color:var(--ink2); margin-top:8px}
.app details ul{margin:8px 0 2px 18px; font-size:.86rem; color:var(--mut)}
.make{scroll-margin-top:140px; margin-top:56px; padding:26px; border-radius:18px; background:var(--surface); border:1px solid var(--line)}
.make h2{font-size:1.4rem; margin-bottom:6px}
.make > p{color:var(--mut); max-width:70ch}
.mk{display:grid; grid-template-columns:repeat(2,minmax(0,1fr)); gap:14px; margin-top:20px}
.mk div{padding:16px 18px; border-radius:14px; background:var(--bg2); border:1px solid var(--line)}
.mk h3{font-size:.98rem; margin-bottom:6px}
.mk p, .mk li{font-size:.9rem; color:var(--mut)}
.mk ul{margin:6px 0 0 18px}
code{font-family:'JetBrains Mono',monospace; font-size:.82em; background:var(--bg2); border:1px solid var(--line); padding:1px 6px; border-radius:6px; color:var(--ink2); overflow-wrap:anywhere}
.foot{margin-top:40px; padding-top:18px; border-top:1px solid var(--line); color:var(--mut); font-size:.85rem}
[hidden]{display:none!important}
@media (max-width:760px){
.steps,.mk{grid-template-columns:1fr}
h1{font-size:1.65rem}
.wrap{padding:0 16px 60px}
.top{padding:10px 16px}
.top .tag{display:none}
.chips{top:60px; margin-inline:-6px; padding-inline:6px; flex-wrap:nowrap; overflow-x:auto; scrollbar-width:none}
.chips::-webkit-scrollbar{display:none}
.chip{flex:none}
.app .shot{height:160px}
.app .shot img,.app .shot.tall img{max-height:140px}
.app .shot.tall img{height:140px; width:140px}
.grid{grid-template-columns:1fr}
.make{padding:18px}
}
</style>
<link rel="stylesheet" href="theme.css?v=2">
<script src="theme.js?v=2" defer></script>
</head>
<body>
<header class="top">
<span class="word">WADA<span class="t">MESH</span></span>
<span class="tag">app store</span>
<span class="sp"></span>
<button type="button" class="wm-theme" data-theme-toggle aria-label="Switch to light mode" title="Switch to light mode"><svg class="i-moon" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="M12 3a6 6 0 0 0 9 9 9 9 0 1 1-9-9Z"/></svg><svg class="i-sun" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><circle cx="12" cy="12" r="4"/><path d="M12 2v2M12 20v2M4.93 4.93l1.41 1.41M17.66 17.66l1.41 1.41M2 12h2M20 12h2M6.34 17.66l-1.41 1.41M19.07 4.93l-1.41 1.41"/></svg></button>
<a class="home" href="/">
<svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><path d="M3 11l9-8 9 8M5 10v10h14V10"/></svg>
Home
</a>
</header>
<main class="wrap">
<h1>Apps for your mesh radio</h1>
<p class="lede">17 small apps you install from the Store on the device itself, over Wi-Fi. Radio tools, navigation, emergency messages, music and games. They are free, run in a sandbox that keeps them away from your keys, and every one is read before it is listed.</p>
<div class="cta">
<a class="btn pri" href="#make"><svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round"><path d="M12 5v14M5 12h14"/></svg>Make your own app</a>
<a class="btn" href="sdk.html"><svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="m16 18 6-6-6-6M8 6l-6 6 6 6"/></svg>Lua SDK guide</a>
</div>
<div class="steps">
<div class="step"><span class="n">01</span><b>Open the Store</b>In the app drawer, tap Store. It needs Wi-Fi.</div>
<div class="step"><span class="n">02</span><b>Tap Get</b>The app installs in a few seconds and shows up in the drawer.</div>
<div class="step"><span class="n">03</span><b>Updates find you</b>The Store tile shows a number when an installed app has a newer version.</div>
</div>
<nav class="chips" aria-label="Filter by category">
<button type="button" class="chip on" data-f="all">All <span>17</span></button>
<button type="button" class="chip" data-f="radio">Radio tools <span>3</span></button>
<button type="button" class="chip" data-f="outdoors">Navigation and outdoors <span>4</span></button>
<button type="button" class="chip" data-f="messaging">Messaging and safety <span>2</span></button>
<button type="button" class="chip" data-f="media">Media <span>1</span></button>
<button type="button" class="chip" data-f="games">Games <span>5</span></button>
<button type="button" class="chip" data-f="tools">Tools <span>2</span></button>
</nav>
<section class="cat" data-cat="radio"><h2>Radio tools</h2><div class="grid">
<article class="app" id="monitor" data-cat="radio" style="--hue:var(--hue-radio)">
<div class="shot"><img src="img/apps/monitor.png" alt="RF Monitor on a device" loading="lazy" width="320" height="240"></div>
<div class="head"><span class="ico"><svg class="g" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.8" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="M2 20h.01M7 20v-4M12 20v-8M17 20V8M22 4v16"/></svg></span><div><h3>RF Monitor <span class="ver">v1.4</span></h3><p class="tl">Your channel at a glance, and every packet you hear.</p></div></div>
<p class="runs every">Every board</p>
<details><summary>More about RF Monitor</summary><p>Live RSSI and noise as tiles and a filled chart, with the noise floor dashed underneath, and the packets heard most recently with their type, signal bars, SNR and hop count. Tap a packet for its details: who sent it, the route it took, how far its SNR sat above what your spreading factor can still decode, its size and how long it was on the air.</p>
<ul><li>Margin above the decode limit, per packet</li><li>Packet type, route and airtime</li><li>Works with keys and trackball too</li></ul>
</details></article>
<article class="app" id="airtime" data-cat="radio" style="--hue:var(--hue-radio)">
<div class="shot"><img src="img/apps/airtime.png" alt="Airtime on a device" loading="lazy" width="320" height="240"></div>
<div class="head"><span class="ico"><svg class="g" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.8" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="M3 3v18h18"/><path d="m7 15 4-4 3 3 6-7"/></svg></span><div><h3>Airtime <span class="ver">v1.6</span></h3><p class="tl">How busy the channel really is.</p></div></div>
<p class="runs every">Every board</p>
<details><summary>More about Airtime</summary><p>The live channel load as a big figure, the average and peak over the session, and your own time on the air. A filled chart shows the load against your region&#x27;s duty-cycle limit, and a bar splits the airtime into what you received and what you sent. While it runs it keeps a Home widget with the load up to date.</p>
<ul><li>Duty-cycle limit on the chart</li><li>Receive and transmit split</li><li>Home widget while it runs (not on the 2 MB Heltec V4)</li></ul>
</details></article>
<article class="app" id="wardrive" data-cat="radio" style="--hue:var(--hue-radio)">
<div class="shot poster"><svg class="pg" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.8" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="M9 4 3 6v14l6-2 6 2 6-2V4l-6 2-6-2Z"/><path d="M9 4v14M15 6v14"/></svg></div>
<div class="head"><span class="ico"><svg class="g" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.8" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="M9 4 3 6v14l6-2 6 2 6-2V4l-6 2-6-2Z"/><path d="M9 4v14M15 6v14"/></svg></span><div><h3>Wardrive <span class="ver">v1.2</span></h3><p class="tl">Survey your coverage while you drive or walk.</p></div></div>
<p class="runs most">Every board but the 2 MB Heltec V4</p>
<details><summary>More about Wardrive</summary><p>Every 20 seconds it sends a discovery probe that every node in earshot answers, and logs each reply with your GPS position, altitude and both directions of the link: how well you heard them and how well they heard you. The run goes to a CSV you can take off the device, and it plots back on the map so you can check coverage before you drive it again.</p>
<ul><li>Both link directions per node</li><li>CSV log with position and altitude</li><li>Run plotted on the map</li></ul>
</details></article>
</div></section>
<section class="cat" data-cat="outdoors"><h2>Navigation and outdoors</h2><div class="grid">
<article class="app" id="protreck" data-cat="outdoors" style="--hue:var(--hue-place)">
<div class="shot poster"><svg class="pg" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.8" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="m12 3 2.7 5.6 6.1.9-4.4 4.3 1 6.1L12 17l-5.4 2.9 1-6.1-4.4-4.3 6.1-.9Z"/></svg></div>
<div class="head"><span class="ico"><svg class="g" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.8" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="m12 3 2.7 5.6 6.1.9-4.4 4.3 1 6.1L12 17l-5.4 2.9 1-6.1-4.4-4.3 6.1-.9Z"/></svg></span><div><h3>ProTreck <span class="ver">v1.0</span></h3><p class="tl">An outdoor watch: sun, moon, stopwatch, timer and altitude.</p></div></div>
<p class="runs every">Every board</p>
<p class="by">By <a href="https://github.com/samuelcoustet" target="_blank" rel="noopener">samuelcoustet</a></p>
<details><summary>More about ProTreck</summary><p>Four tools you swipe between. Astro shows sunrise, sunset and the moon phase for where you are. Chrono is a stopwatch with laps, Timer a countdown with an alarm, and Alti your GPS altitude with its minimum, maximum and a trend graph.</p>
<ul><li>Sunrise, sunset and moon phase</li><li>Stopwatch with laps and a countdown timer</li><li>Altitude trend graph</li></ul>
</details></article>
<article class="app" id="nearby" data-cat="outdoors" style="--hue:var(--hue-place)">
<div class="shot poster"><svg class="pg" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.8" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><circle cx="12" cy="8" r="4"/><path d="M4 21v-1a6 6 0 0 1 6-6h4a6 6 0 0 1 6 6v1"/></svg></div>
<div class="head"><span class="ico"><svg class="g" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.8" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><circle cx="12" cy="8" r="4"/><path d="M4 21v-1a6 6 0 0 1 6-6h4a6 6 0 0 1 6 6v1"/></svg></span><div><h3>Nearby <span class="ver">v1.0</span></h3><p class="tl">Your contacts on a real map, nearest first.</p></div></div>
<p class="runs most">Every board but the 2 MB Heltec V4</p>
<details><summary>More about Nearby</summary><p>Shows the contacts that share a position on the firmware&#x27;s own map tiles, sorted by distance, with the bearing to each one and a live count of the packets you hear. It is also the reference app for the SDK&#x27;s map, list, geo and packet calls, so it is a good place to start reading code.</p>
<ul><li>Real map tiles inside the app</li><li>Distance and bearing to each contact</li><li>Reference app for wada.map and wada.geo</li></ul>
</details></article>
<article class="app" id="gpscompass" data-cat="outdoors" style="--hue:var(--hue-place)">
<div class="shot poster"><svg class="pg" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.8" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><circle cx="12" cy="12" r="9"/><path d="m15.5 8.5-2 5-5 2 2-5Z"/></svg></div>
<div class="head"><span class="ico"><svg class="g" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.8" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><circle cx="12" cy="12" r="9"/><path d="m15.5 8.5-2 5-5 2 2-5Z"/></svg></span><div><h3>GPS Compass <span class="ver">v1.0</span></h3><p class="tl">A compass dial, the live GPS fix, and the way to a contact.</p></div></div>
<p class="runs every">Every board</p>
<details><summary>More about GPS Compass</summary><p>A heading dial with the live GPS fix underneath. On the ThinkNode M9 the heading comes from its magnetometer, with a calibration you run once by turning the device around; on other boards it uses your GPS course while you move. Pick a contact with a known position and it appears on the dial with its bearing and range.</p>
<ul><li>Magnetometer heading on the M9</li><li>GPS course on every other board</li><li>Bearing and range to a contact</li></ul>
</details></article>
<article class="app" id="tripodometer" data-cat="outdoors" style="--hue:var(--hue-place)">
<div class="shot poster"><svg class="pg" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.8" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="M12 21s-7-6.3-7-11a7 7 0 0 1 14 0c0 4.7-7 11-7 11Z"/><circle cx="12" cy="10" r="2.5"/></svg></div>
<div class="head"><span class="ico"><svg class="g" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.8" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="M12 21s-7-6.3-7-11a7 7 0 0 1 14 0c0 4.7-7 11-7 11Z"/><circle cx="12" cy="10" r="2.5"/></svg></span><div><h3>Trip Odometer <span class="ver">v1.0</span></h3><p class="tl">A trip computer for your walk or ride.</p></div></div>
<p class="runs most">Needs a GPS</p>
<p class="by">By <a href="https://github.com/samuelcoustet" target="_blank" rel="noopener">samuelcoustet</a></p>
<details><summary>More about Trip Odometer</summary><p>Tracks the distance, time, speed and altitude of a trip from the GPS. Start and stop it as you go, reset it for the next trip, and it keeps your trip across app restarts.</p>
<ul><li>Distance, time, speed and altitude</li><li>Survives app restarts</li><li>Needs a GPS</li></ul>
</details></article>
</div></section>
<section class="cat" data-cat="messaging"><h2>Messaging and safety</h2><div class="grid">
<article class="app" id="ping" data-cat="messaging" style="--hue:var(--hue-msg)">
<div class="shot poster"><svg class="pg" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.8" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="M21 15a2 2 0 0 1-2 2H8l-5 4V5a2 2 0 0 1 2-2h14a2 2 0 0 1 2 2Z"/></svg></div>
<div class="head"><span class="ico"><svg class="g" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.8" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="M21 15a2 2 0 0 1-2 2H8l-5 4V5a2 2 0 0 1 2-2h14a2 2 0 0 1 2 2Z"/></svg></span><div><h3>Ping <span class="ver">v1.0</span></h3><p class="tl">Round-trip time to any contact, with distance and bearing.</p></div></div>
<p class="runs most">Every board but the 2 MB Heltec V4</p>
<p class="by">By <a href="https://github.com/samuelcoustet" target="_blank" rel="noopener">samuelcoustet</a></p>
<details><summary>More about Ping</summary><p>Sends a ping as a direct message and measures how long the answer takes. Both devices swap their GPS position, so the result shows the round-trip time, the distance and the bearing when both have a fix. It also answers pings from other people running Ping.</p>
<ul><li>Round-trip time over the mesh</li><li>Distance and bearing when both have GPS</li><li>Answers other people&#x27;s pings</li></ul>
</details></article>
<article class="app" id="mecp" data-cat="messaging" style="--hue:var(--hue-msg)">
<div class="shot poster"><svg class="pg" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.8" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="M6 8a6 6 0 0 1 12 0c0 7 3 9 3 9H3s3-2 3-9"/><path d="M10.3 21a1.94 1.94 0 0 0 3.4 0"/></svg></div>
<div class="head"><span class="ico"><svg class="g" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.8" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="M6 8a6 6 0 0 1 12 0c0 7 3 9 3 9H3s3-2 3-9"/><path d="M10.3 21a1.94 1.94 0 0 0 3.4 0"/></svg></span><div><h3>MECP <span class="ver">v1.0</span></h3><p class="tl">Emergency messages everyone can read in their own language.</p></div></div>
<p class="runs most">Every board but the 2 MB Heltec V4</p>
<p class="by">Code table: MECP by <a href="https://github.com/xiang-dev-1" target="_blank" rel="noopener">xiang-dev-1</a>, CC BY 4.0</p>
<details><summary>More about MECP</summary><p>Writes and reads messages in the Mesh Emergency Communication Protocol. Pick a severity and the codes (injury, flooding, need water and many more), add the number of people and your position, and post it to the channel you choose. MECP lines heard on your channels while the app is open are shown decoded in plain words.</p>
<ul><li>Severity, codes, head count and position</li><li>Decodes MECP messages you receive</li><li>Plain text, so it crosses any channel</li></ul>
</details></article>
</div></section>
<section class="cat" data-cat="media"><h2>Media</h2><div class="grid">
<article class="app" id="music" data-cat="media" style="--hue:var(--hue-device)">
<div class="shot tall"><img src="img/apps/music.png" alt="Music on a device" loading="lazy" width="284" height="616"></div>
<div class="head"><span class="ico"><svg class="g" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.8" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="M9 18V5l12-2v13"/><circle cx="6" cy="18" r="3"/><circle cx="18" cy="16" r="3"/></svg></span><div><h3>Music <span class="ver">v1.0</span></h3><p class="tl">Your MP3s and WAVs from the SD card, with the screen off.</p></div></div>
<p class="runs some">Boards with a speaker</p>
<details><summary>More about Music</summary><p>Plays the MP3 and WAV files in a Music folder on the SD card, three folder levels deep, so Music/Artist/Album works. Previous, play and pause, next, shuffle and repeat, and it keeps going through the list with the screen off. It follows the device&#x27;s sound switch and volume, and message chimes stay quiet while a track plays.</p>
<ul><li>Shuffle and repeat, one track or all</li><li>Keeps playing with the screen off</li><li>T-Deck, T-LoRa Pager, T-Display P4, Tanmatsu, T-Deck Max</li></ul>
</details></article>
</div></section>
<section class="cat" data-cat="games"><h2>Games</h2><div class="grid">
<article class="app" id="snake" data-cat="games" style="--hue:var(--hue-bad)">
<div class="shot poster"><svg class="pg" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.8" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="M4 18h6a3 3 0 0 0 0-6H8a3 3 0 0 1 0-6h10"/><circle cx="19.5" cy="6" r="1.5"/></svg></div>
<div class="head"><span class="ico"><svg class="g" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.8" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="M4 18h6a3 3 0 0 0 0-6H8a3 3 0 0 1 0-6h10"/><circle cx="19.5" cy="6" r="1.5"/></svg></span><div><h3>Snake <span class="ver">v1.0</span></h3><p class="tl">The classic. Swipe to steer.</p></div></div>
<p class="runs every">Every board</p>
<details><summary>More about Snake</summary><p>Eat the food, grow longer, do not bite yourself. Steer with swipes, the trackball or the arrow keys, and tap after a game over to play again. Small enough to read in one sitting, which makes it the SDK&#x27;s first reference app.</p>
<ul><li>Swipe, trackball or keys</li><li>Runs on every board, the Heltec V4 included</li><li>Reference app for wada.ui and wada.input</li></ul>
</details></article>
<article class="app" id="tetris" data-cat="games" style="--hue:var(--hue-bad)">
<div class="shot poster"><svg class="pg" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.8" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="M4 14h5v5H4zM9 14h5v5H9zM9 9h5v5H9zM15 4h5v5h-5z"/></svg></div>
<div class="head"><span class="ico"><svg class="g" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.8" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="M4 14h5v5H4zM9 14h5v5H9zM9 9h5v5H9zM15 4h5v5h-5z"/></svg></span><div><h3>Tetris <span class="ver">v1.0</span></h3><p class="tl">The falling-block puzzle.</p></div></div>
<p class="runs every">Every board</p>
<p class="by">By <a href="https://github.com/samuelcoustet" target="_blank" rel="noopener">samuelcoustet</a></p>
<details><summary>More about Tetris</summary><p>Swipe left and right to move, up to rotate and down to drop. On a keyboard the arrows move and rotate, and Enter or Space drops.</p>
<ul><li>Touch and keyboard controls</li></ul>
</details></article>
<article class="app" id="2048" data-cat="games" style="--hue:var(--hue-bad)">
<div class="shot poster"><svg class="pg" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.8" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><rect x="3" y="3" width="18" height="18" rx="3"/><path d="M9 3v18M15 3v18M3 9h18M3 15h18"/></svg></div>
<div class="head"><span class="ico"><svg class="g" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.8" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><rect x="3" y="3" width="18" height="18" rx="3"/><path d="M9 3v18M15 3v18M3 9h18M3 15h18"/></svg></span><div><h3>2048 <span class="ver">v1.2</span></h3><p class="tl">The sliding-tile puzzle, with your best score kept.</p></div></div>
<p class="runs every">Every board</p>
<p class="by">By <a href="https://github.com/pisti87" target="_blank" rel="noopener">pisti87</a></p>
<details><summary>More about 2048</summary><p>Slide the tiles, merge equal numbers and reach 2048. Swipe or use the trackball to move, tap to start again, and your best score is kept between games.</p>
<ul><li>Best score kept</li><li>Swipe or trackball</li></ul>
</details></article>
<article class="app" id="breakout" data-cat="games" style="--hue:var(--hue-bad)">
<div class="shot poster"><svg class="pg" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.8" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="M3 4h8v4H3zM13 4h8v4h-8zM7 10h10v4H7z"/><path d="M8 20h8"/><circle cx="12" cy="17" r="1.2"/></svg></div>
<div class="head"><span class="ico"><svg class="g" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.8" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="M3 4h8v4H3zM13 4h8v4h-8zM7 10h10v4H7z"/><path d="M8 20h8"/><circle cx="12" cy="17" r="1.2"/></svg></span><div><h3>Breakout <span class="ver">v1.0</span></h3><p class="tl">Brick-breaker, level after level.</p></div></div>
<p class="runs every">Every board</p>
<p class="by">By <a href="https://github.com/samuelcoustet" target="_blank" rel="noopener">samuelcoustet</a></p>
<details><summary>More about Breakout</summary><p>Move the paddle with swipes or the arrow keys, launch the ball with a swipe up or Enter, and clear every brick to reach the next level.</p>
<ul><li>Levels</li><li>Touch and keyboard controls</li></ul>
</details></article>
<article class="app" id="blackjack" data-cat="games" style="--hue:var(--hue-bad)">
<div class="shot poster"><svg class="pg" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.8" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><rect x="3" y="6" width="11" height="15" rx="2"/><path d="m10 6 .6-2.1a2 2 0 0 1 2.4-1.4l6.6 1.8a2 2 0 0 1 1.4 2.4l-3 11.3"/><path d="M8.5 11v5M6 13.5h5"/></svg></div>
<div class="head"><span class="ico"><svg class="g" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.8" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><rect x="3" y="6" width="11" height="15" rx="2"/><path d="m10 6 .6-2.1a2 2 0 0 1 2.4-1.4l6.6 1.8a2 2 0 0 1 1.4 2.4l-3 11.3"/><path d="M8.5 11v5M6 13.5h5"/></svg></span><div><h3>Blackjack <span class="ver">v1.0</span></h3><p class="tl">Casino Blackjack, with your bankroll kept between sessions.</p></div></div>
<p class="runs every">Every board</p>
<p class="by">By <a href="https://github.com/halflive-743" target="_blank" rel="noopener">halflive-743</a></p>
<details><summary>More about Blackjack</summary><p>Twenty-one against the dealer from a six-deck shoe. Hit, stand, double down and split, set your bet before each hand, and your bankroll is still there the next time you open the app. Play it by touch, on the keyboard (H, S, D, P) or with the trackball, and the table scales to the screen, the T-Display P4 included.</p>
<ul><li>Split and double down</li><li>Bankroll kept between sessions</li><li>Touch, keyboard or trackball</li></ul>
</details></article>
</div></section>
<section class="cat" data-cat="tools"><h2>Tools</h2><div class="grid">
<article class="app" id="sdktest" data-cat="tools" style="--hue:var(--hue-sys)">
<div class="shot poster"><svg class="pg" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.8" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><circle cx="12" cy="12" r="3"/><path d="M19.4 15a1.6 1.6 0 0 0 .3 1.8l.1.1a2 2 0 1 1-2.8 2.8l-.1-.1a1.6 1.6 0 0 0-1.8-.3 1.6 1.6 0 0 0-1 1.5V21a2 2 0 1 1-4 0v-.1a1.6 1.6 0 0 0-1-1.5 1.6 1.6 0 0 0-1.8.3l-.1.1a2 2 0 1 1-2.8-2.8l.1-.1a1.6 1.6 0 0 0 .3-1.8 1.6 1.6 0 0 0-1.5-1H3a2 2 0 1 1 0-4h.1a1.6 1.6 0 0 0 1.5-1 1.6 1.6 0 0 0-.3-1.8l-.1-.1a2 2 0 1 1 2.8-2.8l.1.1a1.6 1.6 0 0 0 1.8.3H9a1.6 1.6 0 0 0 1-1.5V3a2 2 0 1 1 4 0v.1a1.6 1.6 0 0 0 1 1.5 1.6 1.6 0 0 0 1.8-.3l.1-.1a2 2 0 1 1 2.8 2.8l-.1.1a1.6 1.6 0 0 0-.3 1.8V9a1.6 1.6 0 0 0 1.5 1H21a2 2 0 1 1 0 4h-.1a1.6 1.6 0 0 0-1.5 1Z"/></svg></div>
<div class="head"><span class="ico"><svg class="g" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.8" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><circle cx="12" cy="12" r="3"/><path d="M19.4 15a1.6 1.6 0 0 0 .3 1.8l.1.1a2 2 0 1 1-2.8 2.8l-.1-.1a1.6 1.6 0 0 0-1.8-.3 1.6 1.6 0 0 0-1 1.5V21a2 2 0 1 1-4 0v-.1a1.6 1.6 0 0 0-1-1.5 1.6 1.6 0 0 0-1.8.3l-.1.1a2 2 0 1 1-2.8-2.8l.1-.1a1.6 1.6 0 0 0 .3-1.8 1.6 1.6 0 0 0-1.5-1H3a2 2 0 1 1 0-4h.1a1.6 1.6 0 0 0 1.5-1 1.6 1.6 0 0 0-.3-1.8l-.1-.1a2 2 0 1 1 2.8-2.8l.1.1a1.6 1.6 0 0 0 1.8.3H9a1.6 1.6 0 0 0 1-1.5V3a2 2 0 1 1 4 0v.1a1.6 1.6 0 0 0 1 1.5 1.6 1.6 0 0 0 1.8-.3l.1-.1a2 2 0 1 1 2.8 2.8l-.1.1a1.6 1.6 0 0 0-.3 1.8V9a1.6 1.6 0 0 0 1.5 1H21a2 2 0 1 1 0 4h-.1a1.6 1.6 0 0 0-1.5 1Z"/></svg></span><div><h3>SDK Test <span class="ver">v1.7</span></h3><p class="tl">For app makers: checks the extended SDK on your board.</p></div></div>
<p class="runs most">Every board but the 2 MB Heltec V4</p>
<details><summary>More about SDK Test</summary><p>Runs through the extended Lua SDK on the board in your hand and shows the results on screen: capabilities, clock, battery, GPS, private files, audio, SD listing, crypto against published test vectors and channel discovery. A few buttons transmit test messages, so it is a bench tool rather than something to leave running.</p>
<ul><li>Crypto checked against RFC test vectors</li><li>Every capability flag on one screen</li><li>Some buttons transmit</li></ul>
</details></article>
<article class="app" id="sdscan" data-cat="tools" style="--hue:var(--hue-sys)">
<div class="shot poster"><svg class="pg" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.8" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><circle cx="11" cy="11" r="7"/><path d="m21 21-4.3-4.3"/></svg></div>
<div class="head"><span class="ico"><svg class="g" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.8" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><circle cx="11" cy="11" r="7"/><path d="m21 21-4.3-4.3"/></svg></span><div><h3>SD Scan <span class="ver">v1.1</span></h3><p class="tl">Finds and removes Windows malware on the SD card.</p></div></div>
<p class="runs most">Boards with an SD card</p>
<details><summary>More about SD Scan</summary><p>Written for the SD-card worm some ThinkNode M9 cards shipped with: a hidden autorun file and Windows programs disguised as shortcuts. They cannot run on a radio, but they run on the first Windows PC the card goes into. The firmware decides what counts as a threat, so the app can remove those files and nothing else: never map tiles, backups or chat history.</p>
<ul><li>Firmware decides what is a threat</li><li>Cannot delete your own files</li><li>Asks before removing anything</li></ul>
</details></article>
</div></section>
<section class="make" id="make">
<h2>Make your own app</h2>
<p>Apps are one Lua file plus a one-line manifest. They talk to the device through the <code>wada.*</code> API: screens and input, timers, storage, the mesh, GPS, the map and audio. Read a reference app, write yours on the device, and send it in for everyone.</p>
<div class="mk">
<div><h3>1. Read the SDK guide</h3><p>The <a href="sdk.html">SDK guide</a> starts with <a href="sdk.html#hello">your first app</a> in ten lines and documents every call. Snake, RF Monitor and Nearby are small enough to read in one sitting.</p></div>
<div><h3>2. Try it on your own device</h3><p>Copy your <code>.lua</code> file to <code>/meshcomod/apps/</code> on the SD card (or <code>/apps/</code> on boards that store internally) and it appears in the app drawer, no manifest needed. <a href="sdk.html#install">How side-loading works</a>.</p></div>
<div><h3>3. Send it in</h3><p>Fork <a href="https://github.com/ALLFATHER-BV/wadamesh" target="_blank" rel="noopener">ALLFATHER-BV/wadamesh</a>, add <code>deploy/apps/&lt;id&gt;/&lt;ver&gt;/</code> with your <code>.lua</code> and manifest, add your app to <code>deploy/apps/apps.json</code>, and open a pull request saying what it does and which boards you tried. A published version is never edited: a change ships as the next version. No git? <a href="https://github.com/ALLFATHER-BV/wadamesh/issues/new" target="_blank" rel="noopener">Open an issue</a> with the file attached. <a href="https://github.com/ALLFATHER-BV/wadamesh/blob/main/deploy/apps/README.md" target="_blank" rel="noopener">The full guide</a>.</p></div>
<div><h3>4. What review looks for</h3><ul>
<li>Never reads, sends or stores keys, identities or channel secrets</li>
<li>No flash writes in a loop or on every packet</li>
<li>Nothing that needs more than the Heltec V4's 2 MB of PSRAM</li>
<li>Transmits or changes radio settings only when the user asks</li>
<li>Data leaves the device only when the user asked for it</li>
</ul><p style="margin-top:6px">If something needs changing we say what and why on the PR, and help you land it. Apps are published under GPL-3.0 like the rest of the firmware.</p></div>
</div>
</section>
<p class="foot">This page is generated from the same catalog the devices read, so the versions here are the versions you get. Questions? Ask on <a href="https://discord.gg/T8X2UaQ7Sm" target="_blank" rel="noopener">Discord</a> or read the <a href="docs.html">user guide</a>.</p>
</main>
<script>
(function(){
var chips=document.querySelectorAll('.chip'), cats=document.querySelectorAll('.cat');
function show(f){
chips.forEach(function(c){c.classList.toggle('on', c.dataset.f===f)});
cats.forEach(function(s){s.hidden = !(f==='all' || s.dataset.cat===f)});
}
chips.forEach(function(c){c.addEventListener('click', function(){show(c.dataset.f)})});
// a link to #<app id> opens that app's details
var id=location.hash.slice(1), el=id && document.getElementById(id);
if(el && el.classList.contains('app')){var d=el.querySelector('details'); if(d) d.open=true}
})();
</script>
</body>
</html>
+1 -1
View File
@@ -159,7 +159,7 @@
<div class="how">
<div class="card">
<h3>It works</h3>
<p>On the device: Settings, About, "Send a test report". Tick what you actually
<p>On the device: Settings, Device, "Send a test report". Tick what you actually
exercised, say how long you have been running it, and send. It takes one tap and
needs Wi-Fi on the device. Nothing identifying is sent, and the device lists
exactly what it will send before it sends it.</p>
+19 -17
View File
@@ -223,7 +223,7 @@
<p>Firmware for the ESP32-S3 boards builds with PlatformIO from the repo. The <b>Tanmatsu</b> is different: it runs under badge.team's launcher as an app rather than as standalone firmware, and flashing it the usual way replaces the launcher OS. There is a separate guide for that: <a href="tanmatsu.html">Sideloading on the Tanmatsu</a>.</p>
<p>If you only want to write software for the device, you do not need a firmware build at all: see the <a href="sdk.html">Lua app SDK</a>.</p>
<h3>Is my history actually saving?</h3>
<p><b>Settings &rarr; About &rarr; Chat store</b> is the answer: it names the storage in use, when history last saved successfully, and the exact stage and error a failing save is hitting. Worth a look if messages seem to vanish across a reboot.</p>
<p><b>Settings &rarr; Device &rarr; Chat store</b> is the answer: it names the storage in use, when history last saved successfully, and the exact stage and error a failing save is hitting. Worth a look if messages seem to vanish across a reboot.</p>
</div>
<div class="shot"><div class="device"><img class="screen" src="docs-img/home.png?v=92" alt="Home: the App drawer"></div><div class="cap">Home: the App drawer</div></div>
</div>
@@ -320,12 +320,12 @@
<h2><span class="ico"><svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><circle cx="12" cy="12" r="3"/><path d="M19.4 15a1.65 1.65 0 0 0 .33 1.82l.06.06a2 2 0 1 1-2.83 2.83l-.06-.06a1.65 1.65 0 0 0-2.4.33 1.65 1.65 0 0 0-1 1.51V21a2 2 0 0 1-4 0v-.09A1.65 1.65 0 0 0 8 19.4a1.65 1.65 0 0 0-1.82.33l-.06.06a2 2 0 1 1-2.83-2.83l.06-.06a1.65 1.65 0 0 0 .33-2.4 1.65 1.65 0 0 0-1.51-1H1a2 2 0 0 1 0-4h.09A1.65 1.65 0 0 0 3 8z"/></svg></span> Settings</h2>
<div class="row">
<div class="prose">
<p>Settings opens on a list in four groups. Each page has its icon and, where it fits, its current state beside the name: your node name, the frequency, the network, the language, the charge.</p>
<p>Settings opens with <b>Device</b>, which names the hardware beside it (on the T-Deck, the keyboard it detected too), then a list in four groups. Each page has its icon and, where it fits, its current state beside the name: your node name, the frequency, the network, the language, the charge.</p>
<ul>
<li><b>Mesh</b>: Profile, Radio &amp; Mesh, Auto-add, Quick replies.</li>
<li><b>Connections</b>: Wi-Fi, Bluetooth, GPS, MQTT bridge.</li>
<li><b>Device</b>: Display, Lock screen, Sound, Keyboard, Language, Clock &amp; time, Battery, and Sensors on boards that have them.</li>
<li><b>System</b>: General, Backups, App permissions, About.</li>
<li><b>Display &amp; lock</b>: Display, Theme, Lock screen, Sound, Keyboard, Language, Clock &amp; time, Battery, and Sensors on boards that have them.</li>
<li><b>System</b>: General, Backups, App permissions.</li>
</ul>
<p>Tap a row to open its page; the bar at the top then carries a back chevron. Every page is described in <a href="#settings-pages">Settings pages</a> below. <b>Hold the Settings tab</b> to go straight to the <a href="#control">control panel</a> instead. On the T-LoRa Pager, hold its Settings key, <b>S</b>.</p>
</div>
@@ -447,7 +447,7 @@
<h2><span class="ico"><svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><circle cx="13.5" cy="6.5" r=".5" fill="currentColor"/><circle cx="17.5" cy="10.5" r=".5" fill="currentColor"/><circle cx="8.5" cy="7.5" r=".5" fill="currentColor"/><circle cx="6.5" cy="12.5" r=".5" fill="currentColor"/><path d="M12 2C6.5 2 2 6.5 2 12s4.5 10 10 10c.926 0 1.648-.746 1.648-1.688 0-.437-.18-.835-.437-1.125-.29-.289-.438-.652-.438-1.125a1.64 1.64 0 0 1 1.668-1.668h1.996c3.051 0 5.555-2.503 5.555-5.554C21.965 6.012 17.461 2 12 2z"/></svg></span> Colours &amp; theme</h2>
<div class="row">
<div class="prose">
<p>The look of the whole interface lives on one page: <b>Settings &rarr; Theme</b>, under Device. Holding the theme chip in the <a href="#control">control panel</a> opens it too.</p>
<p>The look of the whole interface lives on one page: <b>Settings &rarr; Theme</b>, under Display &amp; lock. Holding the theme chip in the <a href="#control">control panel</a> opens it too.</p>
<p>It opens on a <b>preview</b>: a corner of the launcher, a chat and the send button, drawn in whatever you have picked, so you see the result before anything restarts. Under it:</p>
<ul>
<li><b>Mode</b>: Night and Day as two small screens, with <b>High contrast</b> under them.</li>
@@ -632,17 +632,17 @@
<h2><span class="ico"><svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M23 4v6h-6"/><path d="M1 20v-6h6"/><path d="M3.51 9a9 9 0 0 1 14.85-3.36L23 10M1 14l4.64 4.36A9 9 0 0 0 20.49 15"/></svg></span> Updates &amp; test builds</h2>
<div class="row">
<div class="prose">
<p>WADAMESH checks for new firmware on its own. When one is available, <b>Settings &rarr; About</b> shows it and you can flash it straight from the device with <b>Install update</b>, over Wi-Fi, with no computer needed. (A T-Deck running under Launcher updates through Launcher instead, and the Tanmatsu through its app store.)</p>
<p>WADAMESH checks for new firmware on its own. When one is available, <b>Settings &rarr; Device</b> shows it and you can flash it straight from the device with <b>Install update</b>, over Wi-Fi, with no computer needed. (A T-Deck running under Launcher updates through Launcher instead, and the Tanmatsu through its app store.)</p>
<h3>Two channels: Stable and Test</h3>
<ul>
<li><b>Stable</b> is the default. It is the build that has been tested and is recommended for everyday use. Leave your device on this unless you want to help test.</li>
<li><b>Test (beta)</b> gets new features and fixes earlier, before they are proven. It can be rough, so it is meant for trying things early and reporting bugs, not for a device you rely on.</li>
</ul>
<h3>Turn on test builds</h3>
<p>Flip <b>Settings &rarr; About &rarr; "Get test builds (beta)"</b> on. From then on, both the update check and <b>Install update</b> follow the test channel, so the device offers the newest test build over Wi-Fi. Turn the switch back off to return to stable. You can switch either way at any time.</p>
<p>Flip <b>Settings &rarr; Device &rarr; "Get test builds (beta)"</b> on. From then on, both the update check and <b>Install update</b> follow the test channel, so the device offers the newest test build over Wi-Fi. Turn the switch back off to return to stable. You can switch either way at any time.</p>
<p>Prefer to start on a test build from scratch? Pick <b>Beta &middot; testing</b> when you flash from <a href="https://flasher.wadamesh.com" target="_blank" rel="noopener">flasher.wadamesh.com</a>.</p>
</div>
<div class="shot"><div class="device"><img class="screen" src="docs-img/set_about.png?v=92" alt="About page"></div><div class="cap">The About page</div></div>
<div class="shot"><div class="device"><img class="screen" src="docs-img/set_about.png?v=92" alt="Device page"></div><div class="cap">The Device page</div></div>
</div>
</section>
@@ -741,7 +741,7 @@
</div>
</div>
<div class="sgrp">Device</div>
<div class="sgrp">Display &amp; lock</div>
<div class="scards">
<div class="scard">
<div class="thumb"><img src="docs-img/set_display.png?v=92" alt="Display settings"></div>
@@ -839,8 +839,6 @@
<ul>
<li><b>Send advert now</b></li>
<li><b>Store data on SD</b> (restart)</li>
<li><b>Run setup again</b> from scratch</li>
<li><b>Reboot device</b></li>
</ul>
</div>
<div class="scard">
@@ -863,15 +861,19 @@
</ul>
</div>
<div class="scard">
<div class="thumb"><img src="docs-img/set_about.png?v=92" alt="About settings"></div>
<h3>About</h3>
<div class="lede">Version, updates and diagnostics.</div>
<div class="thumb"><img src="docs-img/set_about.png?v=92" alt="Device settings"></div>
<h3>Device</h3>
<div class="lede">The hardware, its overrides, version, updates and diagnostics.</div>
<ul>
<li><b>Firmware version</b> plus update check and install</li>
<li><b>Get test builds (beta)</b>: opt into the <a href="#updates">test channel</a></li>
<li><b>Model</b>, <b>radio</b> (e.g. SX1262 or LR1121) and the hardware detected at boot; the Device row names it too</li>
<li><b>Older keyboard protocol</b> (T-Deck): turn on if the keyboard types the wrong letters</li>
<li><b>Firmware version</b> plus update check / install</li>
<li><b>Get test builds (beta)</b> switch: opt into the <a href="#updates">test channel</a></li>
<li><b>Send a test report</b> and <b>Report a bug</b>: see <a href="#testing">Testing a beta</a></li>
<li>Full <b>system information</b>: uptime, chip, memory, flash, storage</li>
<li><b>Device ID</b> and crash-report export</li>
<li><b>Run setup again</b> from scratch</li>
<li><b>Reboot device</b></li>
</ul>
</div>
</div>
@@ -895,7 +897,7 @@
<section class="doc" id="testing">
<h2><span class="ico"><svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M9 11l3 3L22 4"/><path d="M21 12v7a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V5a2 2 0 0 1 2-2h11"/></svg></span> Testing a beta</h2>
<div class="prose" style="max-width:64ch">
<p>A test build becomes the stable release when it has been shown to work, and with this many board images most of them are in hands we never hear from. So the device can report: <b>Settings &rarr; About &rarr; "Send a test report"</b>. What you send appears on the <a href="beta.html">test matrix</a>, which is what the next promotion is decided on.</p>
<p>A test build becomes the stable release when it has been shown to work, and with this many board images most of them are in hands we never hear from. So the device can report: <b>Settings &rarr; Device &rarr; "Send a test report"</b>. What you send appears on the <a href="beta.html">test matrix</a>, which is what the next promotion is decided on.</p>
<h3>What a report says</h3>
<p>Tick only the areas you actually exercised, say how long you have been running the build, and add a line if you have something to say. The areas matter: "it works" from somebody who watched it boot and "it works" from somebody who messaged on it all week are not the same claim, and a board only turns green on two reports of the second kind from two different devices.</p>
Binary file not shown.

After

Width:  |  Height:  |  Size: 20 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 17 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 27 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 94 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 94 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 115 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 66 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 183 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 114 KiB

+71 -11
View File
@@ -5,13 +5,13 @@
<meta name="viewport" content="width=device-width, initial-scale=1">
<script>try{if(localStorage.getItem('wm-theme')==='light')document.documentElement.setAttribute('data-theme','light')}catch(e){}</script>
<title>WADAMESH: MeshCore firmware with the whole mesh on the radio</title>
<meta name="description" content="Free, open-source MeshCore firmware with chat, channels, a map and apps on the radio itself, by touch, keyboard or trackball. Runs on 14 boards.">
<meta name="description" content="Free, open-source MeshCore firmware with chat, channels, a map and apps on the radio itself, by touch, keyboard or trackball. Runs on 16 boards.">
<link rel="canonical" href="https://wadamesh.com/">
<meta property="og:type" content="website">
<meta property="og:site_name" content="WADAMESH">
<meta property="og:url" content="https://wadamesh.com/">
<meta property="og:title" content="WADAMESH: MeshCore firmware with the whole mesh on the radio">
<meta property="og:description" content="Chat, channels, contacts, a map and apps on the radio itself, by touch, keyboard or trackball, and a companion radio for the MeshCore app at the same time. Free and open source, on 14 boards.">
<meta property="og:description" content="Chat, channels, contacts, a map and apps on the radio itself, by touch, keyboard or trackball, and a companion radio for the MeshCore app at the same time. Free and open source, on 16 boards.">
<meta property="og:image" content="https://wadamesh.com/og-image.png?v=2">
<meta property="og:image:width" content="1200">
<meta property="og:image:height" content="630">
@@ -422,13 +422,19 @@
.cookiebar a{color:var(--teal-ink); cursor:pointer}
.cookiebar button{background:var(--accent-fill); color:var(--on-accent); border:0; border-radius:8px; padding:8px 16px; font-weight:650; cursor:pointer; font-size:.86rem; flex:none; font-family:inherit}
/* the way in, straight under the intro */
.cta-row{margin-top:26px}
.cta-row{margin-top:26px; display:flex; flex-wrap:wrap; justify-content:center; gap:12px}
.cta{display:inline-flex; align-items:center; gap:10px; padding:13px 26px; border-radius:100px;
background:var(--accent-fill); color:var(--on-accent); font-weight:700; font-size:1.02rem; text-shadow:none;
box-shadow:0 16px 36px -14px rgba(25,214,194,.6); transition:transform .15s, filter .15s}
.cta:hover, .cta:focus-visible{transform:translateY(-2px); filter:brightness(1.08); outline:none}
.cta:focus-visible{box-shadow:0 0 0 3px var(--bg), 0 0 0 5px var(--teal)}
.cta svg{width:19px; height:19px}
.cta.alt{background:var(--control); color:var(--ink); box-shadow:inset 0 0 0 1px var(--line), var(--shadow);
-webkit-backdrop-filter:blur(8px); backdrop-filter:blur(8px)}
.cta.alt svg{color:#5865F2}
.cta.alt.web svg{color:var(--teal-ink)}
.cta.alt.web:hover, .cta.alt.web:focus-visible{box-shadow:inset 0 0 0 1px var(--teal), var(--shadow)}
.cta.alt:hover, .cta.alt:focus-visible{box-shadow:inset 0 0 0 1px #5865F2, var(--shadow)}
/* a soft dark scrim behind the hero text, so it reads on the brightest part of the sky */
header{position:relative; isolation:isolate}
header::before{content:""; position:absolute; z-index:-1; left:50%; top:20px; transform:translateX(-50%);
@@ -466,6 +472,14 @@
<span class="ic"><svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="M15 2H6a2 2 0 0 0-2 2v16a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V7z"/><path d="M14 2v5h5"/><path d="M16 13H8"/><path d="M16 17H8"/><path d="M10 9H8"/></svg></span>
<span class="lb">Docs</span>
</a>
<a class="fab" style="--hue:var(--hue-msg)" id="webBtn" href="webclient.html" aria-label="Web client: wadamesh in your browser" title="Web client">
<span class="ic"><svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><circle cx="12" cy="12" r="10"/><path d="M2 12h20"/><path d="M12 2a15.3 15.3 0 0 1 4 10 15.3 15.3 0 0 1-4 10 15.3 15.3 0 0 1-4-10 15.3 15.3 0 0 1 4-10z"/></svg></span>
<span class="lb">Web client</span>
</a>
<a class="fab" style="--hue:var(--hue-radio)" id="appsBtn" href="apps.html" aria-label="App Store: every Lua app" title="App Store">
<span class="ic"><svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><rect x="3" y="3" width="7" height="7" rx="1.5"/><rect x="14" y="3" width="7" height="7" rx="1.5"/><rect x="3" y="14" width="7" height="7" rx="1.5"/><path d="M17.5 14v7M14 17.5h7"/></svg></span>
<span class="lb">Apps</span>
</a>
<a class="fab" style="--hue:var(--hue-sys)" id="sdkBtn" href="sdk.html" aria-label="Lua app SDK" title="Lua app SDK">
<span class="ic"><svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="m18 16 4-4-4-4"/><path d="m6 8-4 4 4 4"/><path d="m14.5 4-5 16"/></svg></span>
<span class="lb">Lua SDK</span>
@@ -524,8 +538,8 @@
<span class="byline">by meshcomod</span>
</div>
<p class="lede">The whole mesh, on the radio itself.</p>
<p class="sub">MeshCore firmware with chat, channels, contacts, a map and apps on the device itself, by touch, keyboard or trackball, <b>and</b> a companion radio for the <b>MeshCore app</b> at the same time. Runs on <a href="#devices">14 boards</a>, from the <b>LilyGo&nbsp;T-Deck</b> and <b>Heltec&nbsp;V4</b> to the <b>Tanmatsu</b>.</p>
<div class="cta-row"><a class="cta" href="#install"><svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="M12 3v12"/><path d="m7 11 5 5 5-5"/><path d="M5 21h14"/></svg>Install WADAMESH</a></div>
<p class="sub">MeshCore firmware with chat, channels, contacts, a map and apps on the device itself, by touch, keyboard or trackball, <b>and</b> a companion radio for the <b>MeshCore app</b> at the same time. Runs on <a href="#devices">16 boards</a>, from the <b>LilyGo&nbsp;T-Deck</b> and <b>Heltec&nbsp;V4</b> to the <b>Tanmatsu</b>.</p>
<div class="cta-row"><a class="cta" href="#install"><svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="M12 3v12"/><path d="m7 11 5 5 5-5"/><path d="M5 21h14"/></svg>Install WADAMESH</a><a class="cta alt" href="https://discord.gg/T8X2UaQ7Sm" target="_blank" rel="noopener"><svg viewBox="0 0 24 24" fill="currentColor" aria-hidden="true"><path d="M20.317 4.369a19.79 19.79 0 0 0-4.885-1.515.074.074 0 0 0-.079.037c-.21.375-.444.864-.608 1.249a18.27 18.27 0 0 0-5.487 0 12.6 12.6 0 0 0-.617-1.249.077.077 0 0 0-.079-.037A19.74 19.74 0 0 0 3.677 4.369a.07.07 0 0 0-.032.027C.533 9.046-.32 13.58.099 18.057a.082.082 0 0 0 .031.057 19.9 19.9 0 0 0 5.993 3.03.078.078 0 0 0 .084-.028 14.2 14.2 0 0 0 1.226-1.994.076.076 0 0 0-.041-.106 13.1 13.1 0 0 1-1.872-.892.077.077 0 0 1-.008-.128c.126-.094.252-.192.372-.291a.074.074 0 0 1 .078-.01c3.927 1.793 8.18 1.793 12.061 0a.074.074 0 0 1 .079.009c.12.099.246.198.373.292a.077.077 0 0 1-.006.127 12.3 12.3 0 0 1-1.873.891.077.077 0 0 0-.041.107c.36.698.772 1.362 1.225 1.993a.076.076 0 0 0 .084.028 19.84 19.84 0 0 0 6.002-3.03.077.077 0 0 0 .032-.054c.5-5.177-.838-9.674-3.549-13.66a.06.06 0 0 0-.031-.029zM8.02 15.331c-1.182 0-2.157-1.086-2.157-2.419 0-1.333.956-2.419 2.157-2.419 1.21 0 2.176 1.096 2.157 2.42 0 1.332-.956 2.418-2.157 2.418zm7.975 0c-1.183 0-2.157-1.086-2.157-2.419 0-1.333.955-2.419 2.157-2.419 1.21 0 2.176 1.096 2.157 2.42 0 1.332-.946 2.418-2.157 2.418z"/></svg>Join the community</a><a class="cta alt web" href="https://app.wadamesh.com/"><svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><circle cx="12" cy="12" r="10"/><path d="M2 12h20"/><path d="M12 2a15.3 15.3 0 0 1 4 10 15.3 15.3 0 0 1-4 10 15.3 15.3 0 0 1-4-10 15.3 15.3 0 0 1 4-10z"/></svg>Use the web client</a></div>
<div class="pills">
<span class="pill" tabindex="0" style="--hue:var(--hue-place)"><svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><path d="M9 20l-6-3V4l6 3 6-3 6 3v13l-6-3-6 3z"/><path d="M9 7v13M15 4v13"/></svg>Offline map
<span class="pop"><b>Offline map</b>A real OpenStreetMap you can pan and zoom on the device. Pre-load tile packs to an SD card for fully offline use, or fetch over Wi-Fi, and see your contacts' GPS positions plotted on it.</span></span>
@@ -583,7 +597,7 @@
<section id="devices">
<div class="wrap">
<h2 class="h2">Runs on 14 boards</h2>
<h2 class="h2">Runs on 16 boards</h2>
<p class="p">From keyboard handhelds to touch panels. Pick yours to jump straight to its installer.</p>
<div class="devgrid">
<a class="devtile" href="#standalone" data-find="t-deck plus"><span class="mk">LilyGo</span><b>T-Deck / Plus</b><span class="spec">Keyboard, trackball and touchscreen handheld.</span><span class="st"><span class="lvl full">Fully supported</span><span class="ch">Stable</span></span></a>
@@ -641,7 +655,7 @@
<button type="button" data-wm-ch="stable" style="font:inherit;font-size:.85rem;font-weight:600;padding:7px 16px;border:0;background:var(--control);color:var(--mut);cursor:pointer">Stable</button>
<button type="button" data-wm-ch="beta" style="font:inherit;font-size:.85rem;font-weight:600;padding:7px 16px;border:0;border-left:1px solid var(--line);background:var(--control);color:var(--mut);cursor:pointer">Beta · testing</button>
</div>
<p style="margin:12px auto 0;max-width:600px;text-align:left;font-size:.88rem;line-height:1.6"><b>Stable</b> is the tested default. Pick it unless you want to help test. <b>Beta &middot; testing</b> gets new features and fixes earlier, before they are proven, so it can be rough. It is for trying things early and reporting bugs.<br>Already running WADAMESH? You do not have to reflash to switch channels: turn on <b>Settings &rarr; About &rarr; "Get test builds (beta)"</b> on the device and it updates to test builds over Wi-Fi. Switch it off to go back to stable.<br>Testing a beta? Report from the device (Settings &rarr; About &rarr; "Send a test report") and it shows up on the <a href="beta.html">test matrix</a>, which is what the next stable is promoted on.</p>
<p style="margin:12px auto 0;max-width:600px;text-align:left;font-size:.88rem;line-height:1.6"><b>Stable</b> is the tested default. Pick it unless you want to help test. <b>Beta &middot; testing</b> gets new features and fixes earlier, before they are proven, so it can be rough. It is for trying things early and reporting bugs.<br>Already running WADAMESH? You do not have to reflash to switch channels: turn on <b>Settings &rarr; Device &rarr; "Get test builds (beta)"</b> on the device and it updates to test builds over Wi-Fi. Switch it off to go back to stable.<br>Testing a beta? Report from the device (Settings &rarr; Device &rarr; "Send a test report") and it shows up on the <a href="beta.html">test matrix</a>, which is what the next stable is promoted on.</p>
<p data-wm-betahint hidden style="margin:8px auto 0;font-size:.84rem;color:var(--warn);max-width:560px">Beta builds are newer and less tested: for trying things early and reporting bugs. On a T-Deck under Launcher you download the .bin and side-load it.</p>
<details class="wn" data-whatsnew hidden style="margin:18px auto 0;max-width:560px;border-radius:12px;padding:13px 16px;text-align:left">
<summary><span class="wn-caret" aria-hidden="true">&#9656;</span><span>See what&rsquo;s new in <span data-wn-tag style="color:var(--teal-ink)">the latest build</span><span data-wn-count class="wn-count"></span></span></summary>
@@ -686,7 +700,7 @@
<span class="sup part" tabindex="0"><span class="dot"></span>Partially supported<span class="pop"><b>Partially supported</b>The AMOLED + SX1262 model is hardware-tested. LR2021 support is compile-tested and needs device validation. Bluetooth pairing is unavailable; use Wi-Fi or USB for the phone-app link.</span></span>
<div class="p4q"><span>Radio</span><div class="seg" role="group" aria-label="Radio chip"><button type="button" data-p4-radio="sx1262" aria-pressed="true">SX1262</button><button type="button" data-p4-radio="lr2021" aria-pressed="false">LR2021</button></div></div>
<div class="p4q"><span>Wi-Fi</span><div class="seg" role="group" aria-label="Wi-Fi after installing"><button type="button" data-p4-wifi="hosted" aria-pressed="true">Works</button><button type="button" data-p4-wifi="at" aria-pressed="false">Never connects</button></div></div>
<p class="p4help">The radio is the option you picked when you ordered. Not sure about Wi-Fi? Start with <b>Works</b>. If Wi-Fi then never connects, your unit's Wi-Fi chip still runs LilyGo's factory firmware (ESP-AT): pick <b>Never connects</b> and install that image, it brings Wi-Fi back.</p>
<p class="p4help">The radio is the option you picked when you ordered. Not sure about Wi-Fi? Start with <b>Works</b>. If the screen then turns <b>blue or teal right after the logo</b>, or Wi-Fi never connects, your unit's Wi-Fi chip still runs LilyGo's factory firmware (ESP-AT): pick <b>Never connects</b> and install that image, it fixes both.</p>
<div class="p4v" data-radio="sx1262" data-wifi="hosted"><p class="p4lbl">SX1262 radio</p>
<esp-web-install-button id="inst-tdp4" manifest="https://firmware.wadamesh.com/latest-beta/manifest-tdisplay-p4.json"></esp-web-install-button>
<a class="dl2" data-dl-board="tdisplay-p4" data-dl-betaonly download href="https://firmware.wadamesh.com/latest-beta/wadamesh-tdisplay-p4-merged.bin"><span class="dl2-row"><svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><path d="M12 3v12M7 11l5 5 5-5M5 21h14"/></svg>Download .bin</span><span class="dlver" data-dl-ver></span></a></div>
@@ -704,7 +718,7 @@
<span class="sup part" tabindex="0"><span class="dot"></span>Partially supported<span class="pop"><b>Partially supported</b>Both LCD radio variants are compile-tested and need hardware validation. Bluetooth pairing is unavailable; use Wi-Fi or USB for the phone-app link.</span></span>
<div class="p4q"><span>Radio</span><div class="seg" role="group" aria-label="Radio chip"><button type="button" data-p4-radio="sx1262" aria-pressed="true">SX1262</button><button type="button" data-p4-radio="lr2021" aria-pressed="false">LR2021</button></div></div>
<div class="p4q"><span>Wi-Fi</span><div class="seg" role="group" aria-label="Wi-Fi after installing"><button type="button" data-p4-wifi="hosted" aria-pressed="true">Works</button><button type="button" data-p4-wifi="at" aria-pressed="false">Never connects</button></div></div>
<p class="p4help">The radio is the option you picked when you ordered. Not sure about Wi-Fi? Start with <b>Works</b>. If Wi-Fi then never connects, your unit's Wi-Fi chip still runs LilyGo's factory firmware (ESP-AT): pick <b>Never connects</b> and install that image, it brings Wi-Fi back.</p>
<p class="p4help">The radio is the option you picked when you ordered. Not sure about Wi-Fi? Start with <b>Works</b>. If the screen then turns <b>blue or teal right after the logo</b>, or Wi-Fi never connects, your unit's Wi-Fi chip still runs LilyGo's factory firmware (ESP-AT): pick <b>Never connects</b> and install that image, it fixes both.</p>
<div class="p4v" data-radio="sx1262" data-wifi="hosted"><p class="p4lbl">SX1262 radio</p>
<esp-web-install-button id="inst-tdp4-lcd"></esp-web-install-button>
<a class="dl2" id="dl-tdp4-lcd" download><span class="dl2-row"><svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><path d="M12 3v12M7 11l5 5 5-5M5 21h14"/></svg>Download .bin</span><span class="dlver" id="dl-tdp4-lcd-ver"></span></a></div>
@@ -763,6 +777,20 @@
<esp-web-install-button id="inst-crowpanel-50" manifest="https://firmware.wadamesh.com/latest-beta/manifest-crowpanel-50.json"></esp-web-install-button>
<a class="dl2" data-dl-board="crowpanel-50" data-dl-betaonly download href="https://firmware.wadamesh.com/latest-beta/wadamesh-crowpanel-50-merged.bin"><span class="dl2-row"><svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><path d="M12 3v12M7 11l5 5 5-5M5 21h14"/></svg>Download .bin</span><span class="dlver" data-dl-ver></span></a>
<p data-wm-betaonly style="color:var(--mut);font-size:.78rem;margin:6px 0 0">Beta only. Set the DIP switch and attach the SX1262 before booting; flash with care and report what works.</p></div>
<div class="board" data-search="elecrow crowpanel advanced 10.1 10 inch esp32-p4 p4 ek79007 mipi dsi gt911 sx1262 c6 touchscreen lora experimental"><h4>CrowPanel Advanced 10.1 <span style="font-weight:600;color:var(--mut)">(experimental)</span></h4><p>10.1&quot; 1024&times;600 ESP32-P4 touch display with an SX1262 module in the wireless slot. One image per board revision.</p>
<span class="sup part" tabindex="0"><span class="dot"></span>Partially supported<span class="pop"><b>Not yet tested on hardware</b>This build is for the ESP32-P4 CrowPanel Advanced 10.1 (1024&times;600), not the ESP32-S3 Advance boards. Display, touch, backlight, Wi-Fi and Bluetooth through the C6, the SX1262 and the microSD slot are ported from Elecrow's schematics and example code; nothing has run on a physical unit yet. No battery reading, sound or GPS.</span></span>
<div class="p4q"><span>Revision</span><div class="seg" role="group" aria-label="Board revision"><button type="button" data-cprev-pick="12" aria-pressed="true">V1.2</button><button type="button" data-cprev-pick="11" aria-pressed="false">V1.1</button><button type="button" data-cprev-pick="10" aria-pressed="false">V1.0</button></div></div>
<p class="p4help">The revision is printed on the board. The pins for the radio and the Wi-Fi chip moved between revisions, so the wrong image leaves LoRa or Wi-Fi dead.</p>
<div class="p4v" data-cprev="12"><p class="p4lbl">Board revision V1.2</p>
<esp-web-install-button id="inst-crowpanel-p4-101-v12" manifest="https://firmware.wadamesh.com/latest-beta/manifest-crowpanel-p4-101-v12.json"></esp-web-install-button>
<a class="dl2" data-dl-board="crowpanel-p4-101-v12" data-dl-betaonly download href="https://firmware.wadamesh.com/latest-beta/wadamesh-crowpanel-p4-101-v12-merged.bin"><span class="dl2-row"><svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><path d="M12 3v12M7 11l5 5 5-5M5 21h14"/></svg>Download .bin</span><span class="dlver" data-dl-ver></span></a></div>
<div class="p4v" data-cprev="11" hidden><p class="p4lbl">Board revision V1.1</p>
<esp-web-install-button id="inst-crowpanel-p4-101-v11" manifest="https://firmware.wadamesh.com/latest-beta/manifest-crowpanel-p4-101-v11.json"></esp-web-install-button>
<a class="dl2" data-dl-board="crowpanel-p4-101-v11" data-dl-betaonly download href="https://firmware.wadamesh.com/latest-beta/wadamesh-crowpanel-p4-101-v11-merged.bin"><span class="dl2-row"><svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><path d="M12 3v12M7 11l5 5 5-5M5 21h14"/></svg>Download .bin</span><span class="dlver" data-dl-ver></span></a></div>
<div class="p4v" data-cprev="10" hidden><p class="p4lbl">Board revision V1.0</p>
<esp-web-install-button id="inst-crowpanel-p4-101-v10" manifest="https://firmware.wadamesh.com/latest-beta/manifest-crowpanel-p4-101-v10.json"></esp-web-install-button>
<a class="dl2" data-dl-board="crowpanel-p4-101-v10" data-dl-betaonly download href="https://firmware.wadamesh.com/latest-beta/wadamesh-crowpanel-p4-101-v10-merged.bin"><span class="dl2-row"><svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><path d="M12 3v12M7 11l5 5 5-5M5 21h14"/></svg>Download .bin</span><span class="dlver" data-dl-ver></span></a></div>
<p data-wm-betaonly style="color:var(--mut);font-size:.78rem;margin:6px 0 0">Experimental and beta only. Attach the SX1262 before booting, power it from one USB cable, and please report what works.</p></div>
</div>
</details>
@@ -805,6 +833,11 @@
<esp-web-install-button id="inst-wio-tracker-l2" manifest="https://firmware.wadamesh.com/latest-beta/manifest-wio-tracker-l2.json"></esp-web-install-button>
<a class="dl2" data-dl-board="wio-tracker-l2" data-dl-betaonly download href="https://firmware.wadamesh.com/latest-beta/wadamesh-wio-tracker-l2-merged.bin"><span class="dl2-row"><svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><path d="M12 3v12M7 11l5 5 5-5M5 21h14"/></svg>Download .bin</span><span class="dlver" data-dl-ver></span></a>
<p data-wm-betaonly style="color:var(--mut);font-size:.78rem;margin:6px 0 0">Beta channel only until the next stable.</p></div>
<div class="board" data-search="seeed sensecap indicator d1l d1pro esp32-s3 st7701s ft6336 sx1262 480x480 touch desk experimental"><h4>SenseCAP Indicator D1L <span style="font-weight:600;color:var(--mut)">(experimental)</span></h4><p>ESP32-S3 &middot; 4&quot; 480&times;480 touch desk display &middot; SX1262.</p>
<span class="sup part" tabindex="0"><span class="dot"></span>Partially supported<span class="pop"><b>Community port, beta</b>Contributed by the community (PR #682) and tested by its contributor on one unit: display, touch and LoRa messaging work. It is USB-powered with no battery, so the battery readouts and Power off are hidden. The RP2040 side (buzzer, microSD, Grove, sensors) is not used, so there are no map tiles. No updates from the device: update from this page.</span></span>
<esp-web-install-button id="inst-sensecap-indicator" manifest="https://firmware.wadamesh.com/latest-beta/manifest-sensecap-indicator.json"></esp-web-install-button>
<a class="dl2" data-dl-board="sensecap-indicator" data-dl-betaonly download href="https://firmware.wadamesh.com/latest-beta/wadamesh-sensecap-indicator-merged.bin"><span class="dl2-row"><svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><path d="M12 3v12M7 11l5 5 5-5M5 21h14"/></svg>Download .bin</span><span class="dlver" data-dl-ver></span></a>
<p data-wm-betaonly style="color:var(--mut);font-size:.78rem;margin:6px 0 0">Experimental and beta only. Please report what works.</p></div>
</div>
</details>
</div>
@@ -852,8 +885,8 @@
<details><summary>Is it really free?</summary><div class="a">Yes. WADAMESH is open source under GPL-3.0: no licence key and nothing locked. The code is on <a href="https://github.com/ALLFATHER-BV/wadamesh" target="_blank" rel="noopener">GitHub</a>.</div></details>
<details><summary>Does it work with the MeshCore app?</summary><div class="a">Yes. The device can be the radio for the official MeshCore app on your phone (iOS and Android) over Bluetooth, Wi-Fi or USB, while you keep using it on its own. On the T-Display P4, Bluetooth pairing isn't available yet and on the Tanmatsu it has known gaps, so use Wi-Fi or USB there.</div></details>
<details><summary>Will I keep my identity, contacts and channels?</summary><div class="a">Updating from the device keeps everything. A fresh install from this page can erase what is on the board, so make a backup first: <b>Settings &rarr; Backups &rarr; Export backup</b> saves your whole setup, including your node's identity, to the SD card when one is in. Without a card it stays on the board, so copy it off first with <a href="https://files.wadamesh.com" target="_blank" rel="noopener">USB Files</a>. <b>Restore</b> on the same page brings it back.</div></details>
<details><summary>How do I update later?</summary><div class="a">From the device. When a new build is out, <b>Settings &rarr; About</b> shows it and <b>Install update</b> flashes it over Wi-Fi, no computer needed. A T-Deck under Launcher updates through Launcher, and the Tanmatsu through its app store.</div></details>
<details><summary>Stable or Beta?</summary><div class="a"><b>Stable</b> is the tested build and the default. <b>Beta</b> gets new features and fixes first and can be rough: it is for trying things early and reporting bugs. Switch any time on the device with <b>Settings &rarr; About &rarr; Get test builds (beta)</b>.</div></details>
<details><summary>How do I update later?</summary><div class="a">From the device. When a new build is out, <b>Settings &rarr; Device</b> shows it and <b>Install update</b> flashes it over Wi-Fi, no computer needed. A T-Deck under Launcher updates through Launcher, and the Tanmatsu through its app store.</div></details>
<details><summary>Stable or Beta?</summary><div class="a"><b>Stable</b> is the tested build and the default. <b>Beta</b> gets new features and fixes first and can be rough: it is for trying things early and reporting bugs. Switch any time on the device with <b>Settings &rarr; Device &rarr; Get test builds (beta)</b>.</div></details>
<details><summary>Why can't I install from my phone?</summary><div class="a">The firmware goes onto the board over a USB cable, and only Chrome and Edge on a computer let a web page do that. Open wadamesh.com on a computer. A Tanmatsu installs WADAMESH from its own app store.</div></details>
<details><summary>My board isn't detected</summary><div class="a">Try another cable first: many USB cables only charge. Close anything else using the port, such as a serial monitor or another tab, then put the board in download mode. On a T-Deck, hold the trackball while you tap reset.</div></details>
<details><summary>Can I go back to the original firmware?</summary><div class="a">Yes, nothing is locked. Flash stock MeshCore the same way from the official <a href="https://flasher.meshcore.io/" target="_blank" rel="noopener">MeshCore web flasher</a>, or your board maker's own firmware.</div></details>
@@ -875,6 +908,20 @@
<span class="go">Read the guide</span>
</a>
<a class="rescard" style="--hue:var(--hue-msg)" href="webclient.html">
<span class="ico"><svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><circle cx="12" cy="12" r="10"/><path d="M2 12h20"/><path d="M12 2a15.3 15.3 0 0 1 4 10 15.3 15.3 0 0 1-4 10 15.3 15.3 0 0 1-4-10 15.3 15.3 0 0 1 4-10z"/></svg></span>
<h4>Web client</h4>
<p>The WADAMESH interface in your browser, for any MeshCore node over USB, Bluetooth or Wi-Fi. Try the demo, nothing to install.</p>
<span class="go">How it works</span>
</a>
<a class="rescard" style="--hue:var(--hue-radio)" href="apps.html">
<span class="ico"><svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><rect x="3" y="3" width="7" height="7" rx="1.5"/><rect x="14" y="3" width="7" height="7" rx="1.5"/><rect x="3" y="14" width="7" height="7" rx="1.5"/><path d="M17.5 14v7M14 17.5h7"/></svg></span>
<h4>App Store</h4>
<p>Every app you can install from the Store on the device: radio tools, navigation, emergency messages, music and games.</p>
<span class="go">Browse the apps</span>
</a>
<a class="rescard" style="--hue:var(--hue-sys)" href="sdk.html">
<span class="ico"><svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="m18 16 4-4-4-4"/><path d="m6 8-4 4 4 4"/><path d="m14.5 4-5 16"/></svg></span>
<h4>Lua app SDK</h4>
@@ -1288,6 +1335,19 @@ We use no tracking, analytics, or advertising cookies. Our CDN and security prov
sync();
});
// ---- CrowPanel Advanced 10.1: the board revision picks the image ----
document.querySelectorAll('#devsel .board').forEach(card => {
const picks = card.querySelectorAll('[data-cprev-pick]');
if (!picks.length) return;
let rev = '12';
const sync = () => {
picks.forEach(b => b.setAttribute('aria-pressed', b.getAttribute('data-cprev-pick') === rev ? 'true' : 'false'));
card.querySelectorAll('.p4v[data-cprev]').forEach(v => { v.hidden = v.dataset.cprev !== rev; });
};
picks.forEach(b => b.addEventListener('click', () => { rev = b.getAttribute('data-cprev-pick'); sync(); }));
sync();
});
// ---- "open this page on a computer": copy the link ----
document.querySelectorAll('[data-copyurl]').forEach(b => b.addEventListener('click', () => {
const code = b.parentElement.querySelector('code');
+5 -2
View File
@@ -182,7 +182,7 @@
<main>
<div class="hero">
<h1>Lua app SDK</h1>
<p>WADAMESH runs small Lua apps. They live on the device as a single <code>.lua</code> file, appear in the app drawer next to the built-ins, and can be installed and updated from the Store over the air.</p>
<p>WADAMESH runs small Lua apps. They live on the device as a single <code>.lua</code> file, appear in the app drawer next to the built-ins, and can be installed and updated from the Store over the air. The <a href="apps.html">App Store page</a> lists every one of them.</p>
<div class="meta"><span class="chip">API v1</span> <span class="chip">Lua 5.4</span></div>
</div>
@@ -261,17 +261,19 @@ return app</code></pre>
<tr><td>wada.ui.clear()</td><td>Remove every widget from the app's page, leaving the page itself. This is how you build an app with more than one screen: clear, then create the next screen's widgets in the same place you built the first. <b>Any handle you still hold from before the clear is dead</b>: calling a method on it does nothing rather than crashing, but it will not come back, so re-create and re-assign. Older firmware has no <code>ui.clear</code>: write <code>local clear = ui.clear or function() end</code> if you need to run on both.</td></tr>
<tr><td>wada.ui.list(x, y, w, h)</td><td>A scrollable list of selectable rows, the "pick one of N" widget. Methods: <code>add(text [, fn])</code> returning the row index, <code>set(i, text)</code>, <code>color(i, c)</code>, <code>select(i)</code> (highlights <i>and</i> scrolls it into view), <code>selected()</code>, <code>count()</code>, <code>clear()</code>, <code>pos(x, y)</code>. Rows are real buttons, so keyboard and trackball navigation walks them on touchless boards without you doing anything.</td></tr>
<tr><td>wada.ui.input(title, initial, cb)</td><td>A modal text field. <code>cb(text)</code> on OK, <code>cb(nil)</code> on cancel or on the dialog being closed any other way: exactly one call, always, so an app that disabled itself while waiting always gets to re-enable. Uses the firmware's own dialog and keyboard, so it behaves identically on a touchscreen, on the Tanmatsu's physical keyboard and on a trackball board. One prompt at a time.</td></tr>
<tr><td>wada.ui.canvas(w, h)</td><td>A drawing surface. See the canvas methods below.</td></tr>
<tr><td>wada.ui.canvas(w, h)</td><td>A drawing surface. See the canvas methods below. Each side is clamped to the screen's long side (at least 480), so sizing it from <code>on_open(w, h)</code> is safe on every board.</td></tr>
<tr><td>wada.ui.chart(points)</td><td>A line chart sized to the page. The Airtime and RF Monitor primitive.</td></tr>
<tr><td>wada.ui.scroll(on)</td><td>Allow the page to scroll when content is taller than the screen.</td></tr>
<tr><td>wada.ui.text_h(size)</td><td>Line height in pixels for a size class. Use it to lay out a canvas.</td></tr>
<tr><td>wada.ui.colors</td><td>Theme table: <code>text</code>, <code>sub</code>, <code>bg</code>, <code>panel</code>, <code>accent</code>, <code>good</code>, <code>bad</code>, and on newer firmware <code>warn</code> (amber) and <code>border</code> (a panel's frame). Write <code>colors.warn or 0xE8A33D</code> to run on both.</td></tr>
</table>
<h3>Label handle</h3>
<p>A button returns the same kind of handle, so all of these work on buttons too; <code>color</code> sets a button's text colour.</p>
<table class="api">
<tr><td>lbl:set(text)</td><td>Replace the text.</td></tr>
<tr><td>lbl:color(c)</td><td>Set the colour, e.g. <code>wada.ui.colors.accent</code>.</td></tr>
<tr><td>lbl:pos(x, y)</td><td>Place it explicitly instead of in flow.</td></tr>
<tr><td>lbl:bg(fill [, border])</td><td>Fill colour behind it: on a button handle, the button's own colour (and its frame when <code>border</code> is given), so a coloured button stays a focus stop for the keys and trackball. New in beta_96: write <code>if b.bg then b:bg(c) end</code> to run on older firmware too.</td></tr>
<tr><td>lbl:width(px, [align])</td><td>Fix the width; longer text wraps instead of running off the panel. Optional <code>"center"</code> / <code>"right"</code> aligns the text inside that width (default left).</td></tr>
</table>
<h3>Canvas handle</h3>
@@ -632,6 +634,7 @@ end</code></pre>
<h2>Install your own</h2>
<div class="row"><div class="prose">
<p>Drop a bare <code>.lua</code> file into <code>/meshcomod/apps/</code> on the SD card (<code>/apps/</code> when the device stores internally) and it shows up in the drawer, no manifest needed. The filename becomes the name. That is the fast loop while you are writing something.</p>
<p>No need to pull the card each time: plug the device in over USB, open <a href="https://files.wadamesh.com" target="_blank" rel="noopener">USB Files</a> in Chrome or Edge and drop the file into that same apps folder. It takes <code>.lua</code> and <code>.json</code> files there (from beta_96); the app shows up the next time you open the drawer.</p>
<p>Apps you side-load appear in the Store under <b>Your own apps</b>, where you can remove them again. A long press on the drawer tile also offers to remove.</p>
<p>On boards without an SD card the same path lives on internal storage.</p>
<p>No card slot you can reach (the ThinkNode M9's card is soldered on)? Push the files over the USB serial console instead: <code>scripts/sideload_app.py --port /dev/cu.wchusbserial10 --reboot deploy/apps/&lt;id&gt;/&lt;ver&gt;</code> sends the <code>.lua</code> + <code>.json</code> through the firmware's <code>fput</code>/<code>fadd</code>/<code>fend</code> commands into the same <code>/apps/</code> the Store uses (<code>--dest /lang</code> for a language file). Needs pyserial.</p>
+2
View File
@@ -2,6 +2,8 @@
<urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9">
<url><loc>https://wadamesh.com/</loc></url>
<url><loc>https://wadamesh.com/docs.html</loc></url>
<url><loc>https://wadamesh.com/webclient.html</loc></url>
<url><loc>https://wadamesh.com/apps.html</loc></url>
<url><loc>https://wadamesh.com/sdk.html</loc></url>
<url><loc>https://wadamesh.com/changelog.html</loc></url>
<url><loc>https://wadamesh.com/beta.html</loc></url>
+263
View File
@@ -0,0 +1,263 @@
<!doctype html>
<html lang="en" data-sky="soft">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<script>try{if(localStorage.getItem('wm-theme')==='light')document.documentElement.setAttribute('data-theme','light')}catch(e){}</script>
<meta name="theme-color" content="#000400">
<title>WADAMESH · Web client</title>
<meta name="description" content="The WADAMESH interface in your browser: try the demo, or drive any MeshCore companion node over USB, Bluetooth or Wi-Fi from a computer or phone. Free, no install, no account.">
<link rel="canonical" href="https://wadamesh.com/webclient.html">
<meta property="og:type" content="website">
<meta property="og:site_name" content="WADAMESH">
<meta property="og:url" content="https://wadamesh.com/webclient.html">
<meta property="og:title" content="WADAMESH · Web client">
<meta property="og:description" content="The WADAMESH interface in your browser, for any MeshCore node: USB, Bluetooth or Wi-Fi. Free, no install.">
<meta property="og:image" content="https://wadamesh.com/og-image.png?v=2">
<meta property="og:image:width" content="1200">
<meta property="og:image:height" content="630">
<meta name="twitter:card" content="summary_large_image">
<link rel="icon" href="favicon.ico" sizes="32x32">
<link rel="icon" href="wadamesh-badge.svg" type="image/svg+xml">
<link rel="apple-touch-icon" href="apple-touch-icon.png">
<link rel="preconnect" href="https://fonts.googleapis.com">
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
<link href="https://fonts.googleapis.com/css2?family=Montserrat:wght@500;600;700&family=JetBrains+Mono:wght@600;700&display=swap" rel="stylesheet">
<style>
:root{--bg:#000400; --ink:#E6EBED; --mut:#B0BAC0; --line:#1C2428; --teal:#15B6A6; --teal-ink:#19D6C2; color-scheme:dark}
*{box-sizing:border-box;margin:0;padding:0}
body{font:16px/1.65 -apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,sans-serif; background:var(--bg); color:var(--ink); -webkit-font-smoothing:antialiased}
a{color:var(--teal-ink); text-decoration:none}
a:hover{text-decoration:underline}
.top{position:sticky; top:0; z-index:30; display:flex; align-items:center; gap:14px; padding:12px 22px;
background:var(--bar); -webkit-backdrop-filter:saturate(1.2) blur(10px); backdrop-filter:saturate(1.2) blur(10px); border-bottom:1px solid var(--line)}
.top .word{font-weight:700; letter-spacing:2px; font-size:1.05rem; color:var(--ink)}
.top .word .t{color:var(--teal)}
.top .tag{font-family:'JetBrains Mono',monospace; font-size:.66rem; letter-spacing:.18em; text-transform:uppercase; color:var(--mut); border:1px solid var(--line); border-radius:100px; padding:4px 9px}
.top .sp{flex:1}
.top .home{display:inline-flex; align-items:center; gap:7px; color:var(--mut); font-size:.86rem; border:1px solid var(--line); border-radius:100px; padding:6px 13px; background:var(--control)}
.top .home:hover{color:var(--teal-ink); border-color:var(--teal); text-decoration:none}
.top .home svg{width:16px;height:16px}
.wrap{max-width:1080px; margin:0 auto; padding:0 22px 80px}
h1{font-size:2.1rem; line-height:1.15; margin:38px 0 10px; letter-spacing:-.01em; text-wrap:balance; text-shadow:var(--glow-text)}
.lede{color:var(--sky-sub); max-width:66ch; font-size:1.03rem; text-shadow:var(--glow-text)}
.cta{display:flex; flex-wrap:wrap; gap:10px; margin-top:20px}
.btn{display:inline-flex; align-items:center; gap:8px; padding:10px 18px; border-radius:100px; font-size:.92rem; font-weight:600;
border:1px solid var(--line); background:var(--control); color:var(--ink)}
.btn:hover{text-decoration:none; border-color:var(--teal)}
.btn.pri{background:var(--accent-fill); border-color:var(--accent-fill); color:var(--on-accent)}
.btn svg{width:17px; height:17px}
.steps{display:grid; grid-template-columns:repeat(3,minmax(0,1fr)); gap:12px; margin:30px 0 8px}
.step{padding:14px 16px; border-radius:14px; background:var(--surface); border:1px solid var(--line); font-size:.9rem; color:var(--mut)}
.step b{display:block; color:var(--ink); font-size:.95rem; margin-bottom:2px}
.step .n{font-family:'JetBrains Mono',monospace; color:var(--teal-ink); font-size:.75rem; letter-spacing:.12em}
.chips{display:flex; flex-wrap:wrap; gap:8px; margin:34px -10px 4px; position:sticky; top:66px; z-index:20; padding:8px 10px; border-radius:18px;
background:var(--bar); -webkit-backdrop-filter:saturate(1.2) blur(10px); backdrop-filter:saturate(1.2) blur(10px)}
.chip{display:inline-flex; align-items:center; gap:7px; padding:7px 13px; border-radius:100px; cursor:pointer; font:inherit; font-size:.85rem;
border:1px solid var(--line); background:var(--control); color:var(--ink2)}
.chip span{color:var(--dim); font-size:.78rem; font-variant-numeric:tabular-nums}
.chip:hover{border-color:var(--teal)}
.chip.on{border-color:var(--teal); background:var(--accent-soft); color:var(--teal-ink); font-weight:600}
.cat h2{font-size:1.15rem; margin:30px 0 12px; text-shadow:var(--glow-text)}
.grid{display:grid; grid-template-columns:repeat(auto-fill,minmax(300px,1fr)); gap:16px; align-items:start}
.app{border-radius:16px; background:var(--surface); border:1px solid var(--line); padding:16px; box-shadow:var(--shadow); scroll-margin-top:150px}
.app .shot{margin:-4px -4px 14px; border-radius:11px; background:#05080A; border:1px solid var(--frame-edge); display:grid; place-items:center; padding:10px; height:200px}
.app .shot.poster{color:var(--hue); border-color:color-mix(in srgb, var(--hue) 22%, transparent);
background:radial-gradient(120% 90% at 50% 110%, color-mix(in srgb, var(--hue) 26%, transparent), transparent 70%), var(--bg2)}
.app .shot.poster .pg{width:72px; height:72px; stroke-width:1.3; opacity:.9; filter:drop-shadow(0 0 18px color-mix(in srgb, var(--hue) 55%, transparent))}
.app .shot img{max-width:100%; max-height:180px; width:auto; height:auto; border-radius:6px; display:block}
.app .shot.tall img{width:170px; height:180px; max-height:none; object-fit:cover; object-position:top; border-radius:8px}
.app .head{display:flex; gap:12px; align-items:flex-start}
.app .ico{flex:none; width:46px; height:46px; border-radius:13px; display:grid; place-items:center;
color:var(--hue); background:color-mix(in srgb, var(--hue) 15%, transparent); box-shadow:inset 0 0 0 1px color-mix(in srgb, var(--hue) 30%, transparent)}
.app .ico .g{width:24px; height:24px}
.app h3{font-size:1.05rem; line-height:1.25}
.app .ver{font-family:'JetBrains Mono',monospace; font-size:.7rem; color:var(--dim); font-weight:600; margin-left:4px}
.app .tl{color:var(--mut); font-size:.9rem; margin-top:2px}
.app .runs{display:inline-block; margin-top:12px; padding:3px 10px; border-radius:100px; font-size:.76rem; font-weight:600}
.app .runs.every{color:var(--ok); background:var(--ok-bg)}
.app .runs.most{color:var(--info); background:color-mix(in srgb, var(--info) 14%, transparent)}
.app .runs.some{color:var(--warn-ink); background:var(--warn-bg)}
.app .by{font-size:.8rem; color:var(--dim); margin-top:8px}
.app details{margin-top:10px; border-top:1px solid var(--line); padding-top:8px}
.app summary{cursor:pointer; font-size:.85rem; color:var(--teal-ink); list-style:none}
.app summary::-webkit-details-marker{display:none}
.app summary::before{content:"+ "; font-family:'JetBrains Mono',monospace}
.app details[open] summary::before{content:"\2212 "}
.app details p{font-size:.9rem; color:var(--ink2); margin-top:8px}
.app details ul{margin:8px 0 2px 18px; font-size:.86rem; color:var(--mut)}
.make{scroll-margin-top:140px; margin-top:56px; padding:26px; border-radius:18px; background:var(--surface); border:1px solid var(--line)}
.make h2{font-size:1.4rem; margin-bottom:6px}
.make > p{color:var(--mut); max-width:70ch}
.mk{display:grid; grid-template-columns:repeat(2,minmax(0,1fr)); gap:14px; margin-top:20px}
.mk div{padding:16px 18px; border-radius:14px; background:var(--bg2); border:1px solid var(--line)}
.mk h3{font-size:.98rem; margin-bottom:6px}
.mk p, .mk li{font-size:.9rem; color:var(--mut)}
.mk ul{margin:6px 0 0 18px}
code{font-family:'JetBrains Mono',monospace; font-size:.82em; background:var(--bg2); border:1px solid var(--line); padding:1px 6px; border-radius:6px; color:var(--ink2); overflow-wrap:anywhere}
.foot{margin-top:40px; padding-top:18px; border-top:1px solid var(--line); color:var(--mut); font-size:.85rem}
[hidden]{display:none!important}
@media (max-width:760px){
.steps,.mk{grid-template-columns:1fr}
h1{font-size:1.65rem}
.wrap{padding:0 16px 60px}
.top{padding:10px 16px}
.top .tag{display:none}
.chips{top:60px; margin-inline:-6px; padding-inline:6px; flex-wrap:nowrap; overflow-x:auto; scrollbar-width:none}
.chips::-webkit-scrollbar{display:none}
.chip{flex:none}
.app .shot{height:160px}
.app .shot img,.app .shot.tall img{max-height:140px}
.app .shot.tall img{height:140px; width:140px}
.grid{grid-template-columns:1fr}
.make{padding:18px}
}
.gal{display:grid; grid-template-columns:repeat(2,minmax(0,1fr)); gap:14px; margin-top:28px}
.gal figure{margin:0; border-radius:14px; overflow:hidden; background:#05080A; box-shadow:0 0 0 1px var(--frame-edge), var(--shadow)}
.gal img{display:block; width:100%; height:auto}
.gal figcaption{padding:9px 12px; font-size:.84rem; color:var(--mut); background:var(--surface)}
.sec{margin-top:52px}
.sec h2{font-size:1.4rem; margin-bottom:6px; text-shadow:var(--glow-text)}
.sec > p{color:var(--mut); max-width:72ch}
.ways{display:grid; grid-template-columns:repeat(3,minmax(0,1fr)); gap:14px; margin-top:18px}
.way{padding:16px 18px; border-radius:14px; background:var(--surface); border:1px solid var(--line)}
.way h3{font-size:1.02rem; margin-bottom:4px; display:flex; align-items:center; gap:9px}
.way h3 svg{width:20px; height:20px; color:var(--teal-ink)}
.way .who{font-size:.8rem; color:var(--dim); margin-bottom:8px}
.way ol{margin:0 0 0 18px; font-size:.9rem; color:var(--ink2)}
.way li{margin:3px 0}
.tbl{width:100%; border-collapse:collapse; margin-top:16px; font-size:.9rem}
.tblwrap{overflow-x:auto; border-radius:14px; border:1px solid var(--line); background:var(--surface); margin-top:16px}
.tblwrap .tbl{margin:0}
.tbl th,.tbl td{padding:9px 12px; text-align:left; border-bottom:1px solid var(--line); white-space:nowrap}
.tbl tr:last-child td{border-bottom:0}
.tbl th{color:var(--mut); font-weight:600; font-size:.8rem; letter-spacing:.04em}
.tbl td.y{color:var(--ok)} .tbl td.n{color:var(--dim)}
.note{margin-top:12px; font-size:.86rem; color:var(--mut); max-width:80ch}
.two{display:grid; grid-template-columns:repeat(2,minmax(0,1fr)); gap:14px; margin-top:18px}
.box{padding:16px 18px; border-radius:14px; background:var(--surface); border:1px solid var(--line)}
.box h3{font-size:1rem; margin-bottom:6px}
.box p,.box li{font-size:.9rem; color:var(--mut)}
.box ul{margin:6px 0 0 18px}
.faq details{border-top:1px solid var(--line); padding:12px 0}
.faq details:last-child{border-bottom:1px solid var(--line)}
.faq summary{cursor:pointer; font-weight:600}
.faq details p{margin-top:8px; color:var(--mut); max-width:75ch; font-size:.92rem}
@media (max-width:760px){
.gal,.ways,.two{grid-template-columns:1fr}
}
</style>
<link rel="stylesheet" href="theme.css?v=2">
<script src="theme.js?v=2" defer></script>
</head>
<body>
<header class="top">
<span class="word">WADA<span class="t">MESH</span></span>
<span class="tag">web client</span>
<span class="sp"></span>
<button type="button" class="wm-theme" data-theme-toggle aria-label="Switch to light mode" title="Switch to light mode"><svg class="i-moon" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="M12 3a6 6 0 0 0 9 9 9 9 0 1 1-9-9Z"/></svg><svg class="i-sun" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><circle cx="12" cy="12" r="4"/><path d="M12 2v2M12 20v2M4.93 4.93l1.41 1.41M17.66 17.66l1.41 1.41M2 12h2M20 12h2M6.34 17.66l-1.41 1.41M19.07 4.93l-1.41 1.41"/></svg></button>
<a class="home" href="/">
<svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><path d="M3 11l9-8 9 8M5 10v10h14V10"/></svg>
Home
</a>
</header>
<main class="wrap">
<h1>WADAMESH in your browser</h1>
<p class="lede">The same interface you run on a T-Deck or a Heltec, in a browser tab. Try it on demo data, or connect it to your own MeshCore companion node over a USB cable, Bluetooth or Wi-Fi, from a computer or a phone. Free, nothing to install, no account.</p>
<div class="cta">
<a class="btn pri" href="https://app.wadamesh.com/" data-app-link><svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><circle cx="12" cy="12" r="10"/><path d="M2 12h20"/><path d="M12 2a15.3 15.3 0 0 1 4 10 15.3 15.3 0 0 1-4 10 15.3 15.3 0 0 1-4-10 15.3 15.3 0 0 1 4-10z"/></svg>Open the web client</a>
<a class="btn" href="#connect"><svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="M12 2v14"/><path d="m8 6 4-4 4 4"/><circle cx="12" cy="19" r="3"/><path d="M8 11h8"/></svg>How to connect</a>
</div>
<div class="gal">
<figure><img src="img/webclient/home.jpg" alt="Home screen with widgets in the web client" width="800" height="480" loading="lazy"><figcaption>Home, widgets and all, at full size</figcaption></figure>
<figure><img src="img/webclient/chat.jpg" alt="A conversation in the web client" width="800" height="480" loading="lazy"><figcaption>Chats, channels and rooms with delivery ticks</figcaption></figure>
<figure><img src="img/webclient/map.jpg" alt="The map with your location in the web client" width="800" height="480" loading="lazy"><figcaption>The map, centred on where your computer or phone is</figcaption></figure>
<figure><img src="img/webclient/store.jpg" alt="The app Store in the web client" width="800" height="480" loading="lazy"><figcaption>The Store and Lua apps, kept in your browser</figcaption></figure>
</div>
<section class="sec" id="what">
<h2>The real interface, not a lookalike</h2>
<p>The web client is built from exactly the same code that runs on the devices, so it looks and behaves the same and gets every improvement with each release. Your browser does the drawing; the node does the radio. Anything a MeshCore companion node can do through its app link, the web client can do: chats, channels, rooms, contacts, repeater status and telemetry, repeater admin, the terminal, settings for your node, the map, the Store and its apps.</p>
</section>
<section class="sec" id="connect">
<h2>Connect your node</h2>
<p>Open the web client, press <b>Connect</b> and pick how your node is attached. It works with stock MeshCore companion firmware as well as WADAMESH and meshcomod. The page remembers your choice and reconnects by itself next time.</p>
<div class="ways">
<div class="way"><h3><svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="M12 2v14"/><path d="m8 6 4-4 4 4"/><circle cx="12" cy="19" r="3"/><path d="M8 11h8"/></svg>USB cable</h3><p class="who">Chrome or Edge on a computer</p><ol>
<li>Plug the node into the computer with a data cable.</li>
<li>Press Connect, then USB cable.</li>
<li>Pick the node's port in the browser's list.</li></ol></div>
<div class="way"><h3><svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="m7 7 10 10-5 5V2l5 5L7 17"/></svg>Bluetooth</h3><p class="who">Chrome or Edge on a computer or an Android phone</p><ol>
<li>Turn Bluetooth on, on the node.</li>
<li>Press Connect, then Bluetooth.</li>
<li>Pick the node and enter its PIN if it asks.</li></ol></div>
<div class="way"><h3><svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="M5 12.55a11 11 0 0 1 14 0"/><path d="M1.42 9a16 16 0 0 1 21.16 0"/><path d="M8.53 16.11a6 6 0 0 1 6.95 0"/><path d="M12 20h.01"/></svg>Wi-Fi</h3><p class="who">Any browser, nodes with WADAMESH or meshcomod firmware</p><ol>
<li>Turn Wi-Fi on, on the node, on the same network as you.</li>
<li>Open the <a href="http://wifi.app.wadamesh.com/">Wi-Fi version</a> (wifi.app.wadamesh.com) of the web client.</li>
<li>Press Connect, then Wi-Fi, and type the node's address.</li></ol></div>
</div>
<p class="note">Why a separate Wi-Fi version? Nodes speak plain, unencrypted WebSocket on your network (encryption is too heavy for the radio's chip next to Wi-Fi), and browsers do not let a secure https page open an unencrypted connection. The Wi-Fi version is the same client on plain http. Browsers in turn only allow USB, Bluetooth and your location on secure pages, so those work in the main version.</p>
</section>
<section class="sec" id="where">
<h2>Where it works</h2>
<div class="tblwrap"><table class="tbl">
<tr><th></th><th>Demo</th><th>USB</th><th>Bluetooth</th><th>Wi-Fi</th><th>Your location</th></tr>
<tr><td>Chrome or Edge, computer</td><td class="y">Yes</td><td class="y">Yes</td><td class="y">Yes</td><td class="y">Yes</td><td class="y">Yes</td></tr>
<tr><td>Firefox or Safari, computer</td><td class="y">Yes</td><td class="n">No</td><td class="n">No</td><td class="y">Yes</td><td class="y">Yes</td></tr>
<tr><td>Android, Chrome</td><td class="y">Yes</td><td class="n">Depends on the phone</td><td class="y">Yes</td><td class="y">Yes</td><td class="y">Yes</td></tr>
<tr><td>iPhone and iPad</td><td class="y">Yes</td><td class="n">No</td><td class="n">No</td><td class="y">Yes</td><td class="y">Yes</td></tr>
</table></div>
<p class="note">Apple does not allow USB or Bluetooth from a web page in any iPhone or iPad browser, so on those the web client connects over Wi-Fi only. On a phone the interface switches to portrait, uses your phone's own keyboard, and can be added to your home screen to open like an app.</p>
</section>
<section class="sec" id="data">
<h2>Your data stays with you</h2>
<div class="two">
<div class="box"><h3>Kept in your browser</h3><p>Chat history, settings and installed apps live in this browser on this device, nowhere else. Each node you connect gets its own storage, separate from the demo. Use <b>Backup this browser</b> in the page menu to move everything to another browser or computer.</p></div>
<div class="box"><h3>Your location</h3><p>The browser asks before it shares your location, and the web client uses it for the map, distances and bearings. It only reaches your node, and from there the mesh, when that node's own "share my position" setting is on, exactly as with a GPS on a device.</p></div>
</div>
</section>
<section class="sec" id="diff">
<h2>What is different from a device</h2>
<div class="two">
<div class="box"><h3>Works the same</h3><ul>
<li>Chats, channels, rooms and contacts</li>
<li>Repeater status, telemetry and admin</li>
<li>The map, with tiles and your location</li>
<li>The Store, Lua apps and languages</li>
<li>Your node's settings and the terminal</li></ul></div>
<div class="box"><h3>Only on a device</h3><ul>
<li>The radio tools: Spectrum, RF Monitor and Airtime</li>
<li>Discover scans and wardriving</li>
<li>Sound, the SD card and USB Files</li>
<li>Firmware updates (the web client is always the latest)</li></ul></div>
</div>
</section>
<section class="sec faq" id="faq">
<h2>Questions</h2>
<details><summary>Do I need a WADAMESH device?</summary><p>No. Any MeshCore companion node works, including stock MeshCore firmware on a Heltec, RAK or T-Beam. The demo needs no node at all.</p></details>
<details><summary>Is it the MeshCore app?</summary><p>No, it is the WADAMESH interface. It talks to your node over the same companion link the MeshCore app uses, so you use one or the other at a time on a given connection.</p></details>
<details><summary>Does anything go through your servers?</summary><p>The page itself, map tiles and the app Store come from wadamesh.com. Your messages go straight between your browser and your node.</p></details>
<details><summary>Can I use it offline?</summary><p>Once loaded, chatting through a connected node keeps working without internet. Map tiles and the Store need a connection.</p></details>
<details><summary>Something does not work</summary><p>Ask on <a href="https://discord.gg/T8X2UaQ7Sm" target="_blank" rel="noopener">Discord</a> or <a href="https://github.com/ALLFATHER-BV/wadamesh/issues" target="_blank" rel="noopener">open an issue</a>, and say which browser and node you use.</p></details>
</section>
<p class="foot" style="margin-top:40px;color:var(--mut);font-size:.85rem">Open source under GPL-3.0, like the firmware. <a href="/">Back to wadamesh.com</a></p>
</main>
</body>
</html>
+12 -12
View File
@@ -1,26 +1,26 @@
# Heltec V4 TFT touch firmware — custom partition table.
# Heltec V4 TFT touch firmware - custom partition table.
#
# 16 MB layout with TWO EQUAL OTA app slots so the touch firmware can
# self-update (HTTP OTA via the meshcomod proxy). The app region (app0+app1)
# is split evenly at 3.875 MB each — the firmware is ~2.4–2.5 MB, leaving
# is split evenly at 3.875 MB each - the firmware is ~2.4-2.5 MB, leaving
# ~1.3 MB of growth headroom per slot. The tiles + spiffs offsets are UNCHANGED,
# so an OTA (or the one-time USB re-flash that installs this table) keeps the
# map tile cache and all user data (/new_prefs, /contacts3, /channels2, chat
# history) intact.
# - app0 3.875 MB (ota_0) ┐ equal A/B slots; OTA ping-pongs between them
# - app1 3.875 MB (ota_1) ┘ (was 1.5 MB — too small to hold the image)
# - app0 3.875 MB (ota_0) + equal A/B slots; OTA ping-pongs between them
# - app1 3.875 MB (ota_1) + (was 1.5 MB - too small to hold the image)
# - "tiles" 4.75 MB (subtype 0x83 = LittleFS) for the map tab's tile pack
# - spiffs 3.375 MB for user data
#
# Layout (16 MB total):
# 0x000000–0x009000 bootloader + partition table
# 0x009000–0x00E000 nvs (20 KB, unchanged)
# 0x00E000–0x010000 otadata (8 KB, unchanged)
# 0x010000–0x3F0000 app0 (3.875 MB, ota_0)
# 0x3F0000–0x7D0000 app1 (3.875 MB, ota_1 — grown from 1.5 MB)
# 0x7D0000–0xC90000 tiles (4.75 MB, LittleFS, type 0x83) [unchanged]
# 0xC90000–0xFF0000 spiffs (3.375 MB) [unchanged]
# 0xFF0000–0x1000000 coredump (64 KB, unchanged)
# 0x000000-0x009000 bootloader + partition table
# 0x009000-0x00E000 nvs (20 KB, unchanged)
# 0x00E000-0x010000 otadata (8 KB, unchanged)
# 0x010000-0x3F0000 app0 (3.875 MB, ota_0)
# 0x3F0000-0x7D0000 app1 (3.875 MB, ota_1 - grown from 1.5 MB)
# 0x7D0000-0xC90000 tiles (4.75 MB, LittleFS, type 0x83) [unchanged]
# 0xC90000-0xFF0000 spiffs (3.375 MB) [unchanged]
# 0xFF0000-0x1000000 coredump (64 KB, unchanged)
#
# Subtype 0x83 = ESP-IDF LittleFS subtype. The Arduino LittleFSFS instance
# in UITask.cpp mounts this by partition label "tiles". SPIFFS.begin()
Can't render this file because it contains an unexpected character in line 12 and column 7.
+158
View File
@@ -1635,6 +1635,164 @@ lib_deps =
densaugeo/base64 @ ~1.4.0
knolleary/PubSubClient @ ^2.8.0
; ======================================================================
; Seeed SenseCAP Indicator D1L — 480x480 RGB touch panel, SX1262 behind a TCA9535.
; The radio's NSS/RESET/BUSY/DIO1 are expander pins; P_LORA_* 0x40..0x43 are
; virtual pin numbers the radio HAL maps onto them. 8 MB flash, two OTA slots.
; ======================================================================
[env:sensecap_indicator_companion_radio_touch]
platform = platformio/espressif32@6.11.0
framework = arduino
board = sensecap_indicator
monitor_speed = 115200
upload_speed = 921600
board_build.arduino.memory_type = qio_opi
board_build.flash_size = 8MB
board_upload.flash_size = 8MB
board_upload.maximum_size = 8388608
board_build.partitions = variants/sensecap_indicator/partitions_sensecap_indicator.csv
extra_scripts = pre:scripts/build/pre_gen_baked.py, pre:scripts/inject_wifi_env.py, pre:scripts/build/patch_lvgl_anim_uaf.py, pre:scripts/build/patch_lvgl_arabic.py, pre:scripts/build/patch_meshcore_txt_timestamp.py, pre:scripts/build/perf_lvgl.py, merge-bin.py
custom_lvgl_o2 = yes ; LVGL at -O2 (scripts/build/perf_lvgl.py), like the T-Deck
; No custom_lvgl_iram: it costs +5.9 KB IRAM, and with this board's 23 KB internal draw
; band (see UITask::begin) that would leave less internal heap than the T-Deck's.
build_unflags =
-std=gnu++11
build_flags =
-I"${platformio.libdeps_dir}/${this.__env__}/MicroNMEA/src"
-I"${platformio.libdeps_dir}/${this.__env__}/LovyanGFX/src"
-I variants/sensecap_indicator
-I include
-I src
-I src/ui-touch
-Wno-deprecated-declarations
-Wno-unused-parameter
-std=gnu++17
-DNDEBUG
-DRADIOLIB_STATIC_ONLY=1
-DRADIOLIB_GODMODE=1
-D MC_VENDORED_TOUCH_APP
-D ESP32_PLATFORM
-D HAS_SENSECAP_INDICATOR=1
-D BOARD_HAS_PSRAM=1
-D ESP32_CPU_FREQ=240
-D CORE_DEBUG_LEVEL=0
-D LORA_FREQ=869.618
-D LORA_BW=62.5
-D LORA_SF=8
-D USE_SX1262
-D RADIO_CLASS=CustomSX1262
-D WRAPPER_CLASS=CustomSX1262Wrapper
-D LORA_TX_POWER=22
-D P_LORA_NSS=0x40
-D P_LORA_RESET=0x41
-D P_LORA_BUSY=0x42
-D P_LORA_DIO_1=0x43
-D P_LORA_SCLK=41
-D P_LORA_MISO=47
-D P_LORA_MOSI=48
-D SX126X_DIO2_AS_RF_SWITCH=true
; The radio strap picks TCXO (2.4 V) or crystal at run time. The inner quotes
; keep the parentheses away from the shell that runs the compiler.
-D SX126X_DIO3_TCXO_VOLTAGE="'indicatorTcxoVoltage()'"
-D SX126X_CURRENT_LIMIT=140
-D SX126X_RX_BOOSTED_GAIN=1
-D INDICATOR_PCLK_HZ=12000000
-D RADIOLIB_EXCLUDE_CC1101=1
-D RADIOLIB_EXCLUDE_RF69=1
-D RADIOLIB_EXCLUDE_SX1231=1
-D RADIOLIB_EXCLUDE_SI443X=1
-D RADIOLIB_EXCLUDE_RFM2X=1
-D RADIOLIB_EXCLUDE_SX128X=1
-D RADIOLIB_EXCLUDE_AFSK=1
-D RADIOLIB_EXCLUDE_AX25=1
-D RADIOLIB_EXCLUDE_HELLSCHREIBER=1
-D RADIOLIB_EXCLUDE_MORSE=1
-D RADIOLIB_EXCLUDE_APRS=1
-D RADIOLIB_EXCLUDE_BELL=1
-D RADIOLIB_EXCLUDE_RTTY=1
-D RADIOLIB_EXCLUDE_SSTV=1
-D ENV_INCLUDE_GPS=0
-D ENV_INCLUDE_AHTX0=0
-D ENV_INCLUDE_BME280=0
-D ENV_INCLUDE_BMP280=0
-D ENV_INCLUDE_SHTC3=0
-D ENV_INCLUDE_SHT4X=0
-D ENV_INCLUDE_LPS22HB=0
-D ENV_INCLUDE_INA3221=0
-D ENV_INCLUDE_INA219=0
-D ENV_INCLUDE_INA226=0
-D ENV_INCLUDE_INA260=0
-D ENV_INCLUDE_MLX90614=0
-D ENV_INCLUDE_VL53L0X=0
-D ENV_INCLUDE_BME680=0
-D ENV_INCLUDE_BMP085=0
-D PIN_BOARD_SDA=39
-D PIN_BOARD_SCL=40
-D PIN_USER_BTN=38
-D PIN_TFT_LEDA_CTL=-1
-D PIN_TFT_RST=-1
-D PIN_TFT_DC=-1
-D DISPLAY_CLASS=IndicatorDisplay
-D DISPLAY_ROTATION=0
-D DISPLAY_SCALE_X=1.0
-D DISPLAY_SCALE_Y=1.0
-D UI_LVGL=1
-D HAS_TOUCH_UI=1
-D FIRMWARE_OTA_ENV='"sensecap_indicator_companion_radio_touch"'
-D ENABLE_ADVERT_ON_BOOT=0
-D LV_CONF_PATH=lv_conf.h
-D LV_CONF_INCLUDE_SIMPLE=1
-D LV_MEMCPY_MEMSET_STD=1 ; newlib memcpy/memset in LVGL (see include/lv_conf.h)
; The UI-size presets use Montserrat 18/20/24. Those are generated fonts
; (src/ui-touch/ui_font_NN.c, gated on this board's macro in the generator), not
; LVGL's: never force LV_FONT_MONTSERRAT_NN=1 here, it would link LVGL's copy too.
-D MAX_CONTACTS=2000
-D MAX_GROUP_CHANNELS=40
-D ADMIN_PASSWORD='"password"'
-D MULTI_TRANSPORT_COMPANION=1
-D WADAMESH_FORK_BUILD=1
-D TCP_PORT=5000
-D WS_PORT=8765
-D BLE_PIN_CODE=123456
-D ENABLE_PRIVATE_KEY_IMPORT=1
-D ENABLE_PRIVATE_KEY_EXPORT=1
-D CONFIG_MBEDTLS_ASYMMETRIC_CONTENT_LEN=1
-D CONFIG_MBEDTLS_SSL_IN_CONTENT_LEN=16384
-D CONFIG_MBEDTLS_SSL_OUT_CONTENT_LEN=4096
build_src_filter =
+<*.cpp>
+<*.c>
+<helpers/*.cpp>
+<helpers/esp32/*.cpp>
+<helpers/input/*.cpp>
-<helpers/input/TDeckTouch.cpp>
+<helpers/ui/UIColorPalette.cpp>
+<ui-touch/*.cpp>
+<ui-touch/*.c>
+<../variants/sensecap_indicator/*.cpp>
lib_deps =
https://github.com/ALLFATHER-BV/meshcomod.git#core-v1.18.0
SPI
Wire
SD_MMC
jgromes/RadioLib @ ^7.6.0
rweather/Crypto @ ^0.4.0
adafruit/RTClib @ ^2.1.3
melopero/Melopero RV3028 @ ^1.1.0
electroniccats/CayenneLPP @ 1.6.1
h2zero/NimBLE-Arduino @ 1.4.3
stevemarple/MicroNMEA @ ^2.0.6
ESP32Async/ESPAsyncWebServer @ 3.10.3
file://arch/esp32/AsyncElegantOTA
lvgl/lvgl @ ^8.3.11
lovyan03/LovyanGFX @ 1.2.27
densaugeo/base64 @ ~1.4.0
knolleary/PubSubClient @ ^2.8.0
[env:tlora_pager_lr1121_companion_radio_touch]
platform = platformio/espressif32@6.11.0
framework = arduino
+32
View File
@@ -0,0 +1,32 @@
# beta_96 - chat history keeps saving on busy devices, unread messages under a locked screen, Settings > Device, Lua apps over USB, Blackjack. TEST BUILD.
# One user-facing note per non-blank, non-# line; # lines are section comments.
# Order: what this build is, the important fix, new things, fixes, for app makers.
Test build, on top of beta_95. The stable build stays beta_85.
# --- Important fix ---
Chat history keeps saving on a device with a lot of it. Once the history on the card or in the device's storage reached its 24 files, a reboot could leave every new message in memory only, so it was gone after the next restart, without any warning (reported on Discord). Full files are now merged to make room, and a save that cannot land says so. Messages lost before this build cannot be recovered; older history is untouched.
Messages that arrive in a chat you left open while the screen is off or locked stay unread, so the lock screen shows them. They count as read once you wake the device and see the chat (reported on Discord).
# --- New ---
Settings opens with a Device page: what this unit is, its radio and hardware, and the About information, with Run setup again and Reboot. The group with Display, Theme, Lock screen, Sound and Keyboard is now called Display & lock (#596 by oumike, asked for by Jess-39).
First-time setup keeps Bluetooth on and shows a switch for it (#416, by oumike).
T-Display P4: a one-row status bar with the title on the left and the clock beside the icons, and Settings in landscape uses two real columns (by oumike).
In a chat, the clock and battery stay at the height they have on every other screen (by oumike).
USB Files can put Lua apps on the device: drop a .lua or .json file into the apps folder (meshcomod/apps on the SD card) at files.wadamesh.com, no need to take the card out. It shows up the next time you open the app drawer (asked for on Discord).
New in the Store: Blackjack, with split, double down and your bankroll kept between sessions (#681 by halflive-743).
The Store now lists more than 16 apps; it stopped at 16 before, so new apps would not have shown up.
# --- Fixes ---
ThinkNode M9 and other keypad boards: Up and Down on a web page scroll the text instead of jumping past it to the toolbar (#680 by oumike, reported by Buko84 in #677).
A lock screen PIN with a 0 (or any digit on the Sym layer) can be typed on the T-Deck (#676 by oumike, reported by TerryTel93 in #675).
Characters a font cannot draw show as one "*" everywhere, skin-tone modifiers are hidden, and invisible marks in Arabic and Hebrew messages stay invisible (#679 by oumike, reported by neoemit in #673).
The chats list shows the double tick as soon as a direct message is delivered (reported by neoemit in #670).
ThinkNode M9: the keyboard language code in the chat header no longer sits on top of the GPS icon (reported by neoemit in #672).
The contact popup is wider on 320 pixel screens and gives a long name a second line, so with Large Text it no longer runs under the buttons (reported by Danie10 in #668).
A lock screen with your own picture is no longer milky: a lighter dark tint and light text on every theme (reported by Flyflinger in #652).
Translations: this build's new texts in all 14 languages.
# --- For app makers ---
Canvases larger than 480 pixels are fitted to the screen instead of stopping the app, so apps that size their canvas from on_open work on the T-Display P4, Tanmatsu and CrowPanel 5 (reported on Discord).
button:bg(colour) gives a button its own fill colour, and it stays reachable with the keys and trackball (SDK guide).
+14
View File
@@ -0,0 +1,14 @@
# beta_97 - chat history never drops old messages, Store installs complete, repeater requests answer, CrowPanel Advanced 10.1. TEST BUILD.
# One user-facing note per non-blank, non-# line; # lines are section comments.
# Order: what this build is, fixes, the new board.
Test build, on top of beta_96. The stable build stays beta_85.
# --- Fixes ---
Chat history: when the history files can no longer be merged to make room, a new file is opened instead of retiring the oldest one, so no message is ever dropped to keep saving. beta_96 could still lose old messages on devices with a lot of history in many quiet chats. Checked with a simulation of 60,000 messages, constant reboots and power cuts in the middle of a merge.
Store installs complete: a downloaded app could land cut off on the SD card, which reported a network error and left an app that failed to start with "syntax error near <eof>" (Blackjack, reported by halflive-743 on Discord). Downloads are now written in pieces, checked on the card and only then installed, so a failed install leaves nothing behind and a failed update keeps the old version.
Repeater telemetry and status requests answer: the device now asks directly first, the way the MeshCore app does, and only logs in when that gets no reply. The old order (log in, then ask) got an answer 2 times out of 8 from a repeater next to the device; this build 7 out of 8 (#683, reported by 900steve).
Lua apps that save larger files with wada.fs.write no longer risk a file that is cut off on the SD card.
# --- New board ---
Elecrow CrowPanel Advanced 10.1 (ESP32-P4, 1024 by 600) is in the web flasher as an experimental board, with one image per board revision (V1.0, V1.1, V1.2, printed on the board). It needs an SX1262 module in the wireless slot. It has not run on a real unit yet, so please report what works (asked for on Discord).
+22
View File
@@ -0,0 +1,22 @@
# beta_98 - repeater and room server admin, SenseCAP Indicator, CrowPanel 10.1 touch, OTA and backup fixes, wadamesh in the browser. TEST BUILD.
# One user-facing note per non-blank, non-# line; # lines are section comments.
# Order: what this build is, new, fixes, boards.
Test build, on top of beta_97. The stable build stays beta_85.
# --- New ---
Repeater and room server admin: the Admin button on a repeater or room server now opens a full admin app instead of a password box and a raw console. Log in as admin or guest (a remembered password logs in at once), then see the node's status, firmware and owner, its neighbours (newest or strongest), telemetry and the access list, change roles, edit identity and location, radio, repeating and limits, adverts, passwords and regions, and run actions such as an advert, a clock sync, discovering neighbours, resetting counters, a reboot or a firmware update. The old console stays under Advanced.
wadamesh in your browser: the same touch UI runs at app.wadamesh.com and drives your own MeshCore node over USB or Bluetooth (Chrome or Edge), or a wadamesh or meshcomod node over Wi-Fi from wifi.app.wadamesh.com. It brings the map, the Store and Lua apps, backups and your device's location, keeps its chats in the browser, and works on phones in portrait. Without a node it runs a demo mesh.
Theme: Settings, Theme, Background has a Glass tiles switch (on by default); off draws the Home tiles solid.
Large screens in landscape (T-Display P4, Tanmatsu, CrowPanel 5.0 and 10.1): the empty message box is one line tall and grows as you type.
# --- Fixes ---
Firmware updates over Wi-Fi no longer stop at 0 percent and restart the device: the download waited without yielding, so a slow start tripped the task watchdog. It now copies the image in small blocks and gives up cleanly after 15 seconds without data (#689, reported by Hixsten on a T-Deck Plus).
Backups get one name, meshcore-backup-<date>, and a device without a set clock never overwrites an earlier backup: it numbers them instead (#688 by oumike, for #686 reported by zomgugoff). On the Tanmatsu the free name is found by opening the file, since its storage reports existing files as missing.
T-Display P4: when the Wi-Fi chip stops answering (units running LilyGo's factory ESP-AT image lost Wi-Fi after about an hour, with empty scans and Connect doing nothing), it is now reset and rejoins the network on its own, no reboot needed (#685, reported by william-stearns). Not yet checked on a unit that shows the problem, so please report.
Companion sync: a node keeps a sync position for up to 8 apps. When all 8 were taken, a new app was never synced at all; the slot of the app that synced longest ago is now reused.
# --- Boards ---
SenseCAP Indicator D1L is a new board in the web flasher (#682 by Confituurke): the ST7701S screen, FT6336 touch and the SX1262 radio behind the TCA9535 expander. Power off is hidden, as nothing on the board can wake it again.
CrowPanel Advanced 10.1: touch works. The SD card driver claimed pin 45, the touch controller's data line, and shut the touch bus down after the first card check. Map tiles are kept on the board's own storage, and the boot is quieter. Still experimental, so please report what works.
T-Display P4: Radio settings has "Always use the external antenna (MMCX)", which asks first with a warning, and the control panel has an Antenna tile.
Loaded 100 of 184 files, more files were not shown because too many files have changed in this diff. Show more