Compare commits

..
100 Commits
Author SHA1 Message Date
Kaj SchittecatandClaude Opus 5.5 39f342c67e site: user guide for beta_90, colour and the Theme page
A Colours & theme section: the Theme page (preview, Apply and restart on the
box and in the bar under the title), MORE COLORS! in Regular, Neon and Pastel,
Taste the rainbow, chat icons and colourful bubbles, with a gallery of the
looks. A Theme card in Settings pages; the look rows left the Display card.
Chats describes the per-chat colours and the Initials option.

The main screenshots (Home, Chats, conversation, Contacts, Settings, Map) are
retaken in the new default look. The map is fully loaded this time (the beta_89
shot was taken mid-download), with its coordinates pixelated as before.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-07 11:44:21 +02:00
Kaj SchittecatandClaude Opus 5.5 f1a7775d0c touch: beta_90, colour comes back
Testers said the colour was what set wadamesh apart, and the beta_89 redesign
took most of it out. This puts it back as choices on one new page.

Settings > Theme (CAT_THEME, Device group): a live preview drawn from a copy of
the palette (themeTokensFor), Night/Day cards, High contrast, the accent swatches
inline with Custom, MORE COLORS! with Regular/Neon/Pastel, Taste the rainbow, and
the chat looks. Mode, accent and look are pending until one Apply and restart on
the preview box; scrolled past it, a slim bar under the title carries the button
with six dots in the picked look. Chat icons, bubbles and compact apply live. The
look rows left Display; the control panel's theme chip long-press opens Theme.

The colour engine: ThemeTokens + lookAdjust over the mode and accent at boot
(applyBootTheme), section hues for the launcher, Settings, tab bar and status
icons, per-name colours (FNV hue) for names, glyphs, initials balls and bubble
tints, Neon lit edges and gradient primaries, Pastel tints, and a deeper Day ink
for names and glyphs on light lists. MORE COLORS! defaults on (Regular); HC and
e-paper keep their own colours. New prefs are standalone u8 keys (chat_icons,
col_more, col_style, col_rb), no schema bump.

Taste the rainbow: per-item hues round the wheel, a 10 Hz hue drift on the tab
marker, chats count and focus ring (rests when off, locked or screensaver), press
dip, an arrival flash on new bubbles (draw-only props, the virtual list never
sees it), rainbow lock mark, boot mark and Constellation nodes (CstTheme
node_sat/node_val), and a dot burst on enabling it.

Chat icons: Glyphs or Initials through one avatarApplyLook; AVATAR_SQUARE_FLAG
moved off LV_OBJ_FLAG_USER_1, which is the nav's NAV_SKIP_FLAG.

Size: wadamesh_mark_rgb.h was a static array included by main.cpp and
UITask.cpp, so every S3 image carried the 30 KB boot mark twice. One definition
now (UITask.cpp; the P4 never compiles main.cpp). The V4 goes from overflowing to
~30 KB free with all of the above.

Capture tour: wakes and ends the screensaver before shooting, DOC_LOOK forces a
look, DOC_LOOK_AUDIT walks the looks and the Theme page, DOC_MAP_SHOT waits for
Wi-Fi and for every tile before shooting the map.

25 new strings as English placeholders in every .lang file.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-07 11:34:08 +02:00
Kaj SchittecatandClaude Opus 5.5 6fb66d6872 site: user guide for the redesigned interface (beta_89)
New sections for the lock screen and PIN, the Constellation screensaver,
new-message cards, the control panel, text size and the T-Deck trackball;
Home, Chats, Contacts and Settings rewritten for the new screens; Settings
pages regrouped as on the device; every screenshot recaptured on a T-Deck
running beta_89 (location, Wi-Fi name and pairing code masked).

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-07 00:29:59 +02:00
Kaj SchittecatandClaude Opus 5.5 9b720401f8 release: beta_89 notes
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-06 23:44:50 +02:00
Kaj SchittecatandClaude Opus 5.5 662665e6de touch: beta_89, the UI overhaul
Every screen redesigned to the Oct 2026 mockups, on one design system:
palette, type roles (generated Montserrat faces with Lucide line icons on the
LV_SYMBOL codepoints), a theme apply-cb that styles every LVGL widget, button
kinds, list rows, sheets as action lists, toasts and key-glyph avatars.

Rebuilt: status bar, Chats (filters, + and menu), conversation (route header,
hop meta, "Heard by N repeaters", delivery states, pill composer), lock screen
(mark, clock, 24 h activity, unread cards), Constellation screensaver, Home
launcher and launcher sheet, Status page, grouped Settings home, animated boot
splash, and the message glance as a notification card.

New: optional PIN lock (salted SHA-256, keyboard / touch pad / number pad per
board, backoff that survives reboot), screensaver on battery with its own
duration, T-Deck text sizes, trackball hold to switch Scroll and Cursor (Scroll
default, prefs v69/v70), hold Settings tab for the control panel. M9 bottom
notices removed. Every screen measured for the Large and Huge text sizes.

Fix: adverts over 2/3-byte path hashes never reached the recently heard table
(packed path_len compared as a byte count); ADVERT_PATH replies now carry the
whole multi-byte path.

English placeholders for the 204 untranslated keys in every .lang file.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-06 23:26:41 +02:00
Kaj SchittecatandClaude Opus 5 d6e696d580 release: beta_88 notes
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-10-05 13:44:42 +02:00
Kaj SchittecatandClaude Opus 5 a8f813c5f9 Merge PR #599 (oumike): battery saver, Condense Nav, Pager keyboard nav
Closes #591, #592, #593 and the M9 Bluetooth status-bar overlap museifu696
reported. Also the T-Pager battery saver zomgugoff asked for and the status-bar
clock fix.

Review notes, since this landed on top of a day of P4 and M9 work:

* The prefs change is done the right way. condense_nav is appended at the TAIL,
  CURRENT_VERSION goes 65 -> 68 with v66/v67/v68 each described, and the
  trailing static_assert moves to the new last field. v67 and v68 are one-time
  per-board resets with no new field, which is the pattern v63 and v65 used.
* Six conflicts, all in test_touch_prefs_schema.cpp, all the same shape: we had
  both repaired the same broken sums. His version is a superset (it adds
  condense_nav on top of the report_ping/report_done_n I added), so his wins.
  Verified afterwards that both sides survived rather than trusting the merge:
  the channel-send guard, the P4 tile-FS fix, statusPctOverflow, m9NoticeSet,
  m9DiscoveredUnseen and TDP4_C6_ID are all still present, as are his kbd_nav
  and Condense Nav work. Host suite 17 pass / 0 fail at v68.

Also here: PUBLISH the translations the PR added.

It added five strings to all fourteen language files with real translations, but
left "# ver: 22" alone and did not touch langs.json. Devices fetch lang/<ver>/,
so the version is the only thing that makes one re-download: without a bump the
work sits in the repo and reaches nobody, and every non-English device shows
those strings in English. The baked-in table was regenerated, so compiled-in
languages were fine -- it is the downloaded ones that would have silently
stayed behind. Bumped to 23, snapshotted into lang/23/, and langs.json points
at it. deploy-apps.sh validates: 14 languages and 14 apps, every referenced
file present.

That store still has to be pushed with the release; editing deploy/apps/ is not
publishing it.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-10-05 12:30:55 +02:00
Kaj 127ece5b88 Merge pull request #590 from jcyrio/fix/layout-switch-hint-physical-keyboards
touch: the Secondary keyboards hint named a key the Pager does not have
2026-10-05 12:24:25 +02:00
Kaj 02454f8142 Merge pull request #587 from jcyrio/fix/keep-cleared-dm-in-inbox
touch: "Delete history" on a DM no longer makes the chat vanish from Chats
2026-10-05 12:24:12 +02:00
Kaj SchittecatandClaude Opus 5 820bc21f46 build: verify the P4 artifacts, and make the host tests runnable
The T-Display P4 ships EIGHT images: panel (AMOLED/LCD) x radio (SX1262/LR2021)
x C6 stack (esp-hosted/ESP-AT). The C6 axis is new and it is the dangerous one,
because the two builds are identical apart from the artifact name they carry,
and flashing the wrong one at an older unit used to boot-loop the board.

scripts/build/p4-release.sh builds all eight and VERIFIES each image against the
OTA name baked into it before accepting it. That is the same string the device
builds its self-update URL from, so a disagreement with the filename is exactly
the failure that bricks people -- the T-Deck Max self-updating to Pro firmware,
and this table has been wrong three times. A mismatch aborts the release.

It earned that check immediately: building the eight by hand produced two
mislabelled images, and every mechanism meant to prevent it was itself broken.

  * build.sh fullclean has NEVER worked from a plain shell. It ran `cmake -E
    remove_directory` above the esp-idf/export.sh that puts cmake on PATH, so it
    printed that it had removed the tree, exited 0, and removed nothing. Now a
    plain rm -rf, and it verifies the directory is gone instead of assuming.
    This matters beyond tidiness: the hosted and ESP-AT builds SHARE a build dir
    (the C6 axis does not change P4_BUILD_TARGET), the backend is read from the
    environment at CMake CONFIGURE time, and CMake does not reconfigure because
    an env var changed -- so a clean that silently did nothing yields an
    incremental build of the OTHER variant, with no configure output to show for
    it. That is precisely how the two mislabelled images were produced.
  * Deleting CMakeCache.txt alone is not a clean either; it leaves CMakeFiles/
    behind and the next configure dies in CMakeDetermineCCompiler.
  * Detecting failure by grepping a log for "error:" misses a failed CMake
    configure, which prints "Configuring incomplete" and no such line -- and the
    previous application.bin is still sitting in the directory to be picked up.
    Exit codes now.

gen-flasher-meta.py gains the four ESP-AT entries, labelled "older unit, ESP-AT
C6": someone choosing in the web flasher has no serial log and needs to pick on
something they can check.

scripts/run-host-tests.sh runs test/ as one command. Nothing ever did, which is
why test_touch_prefs_schema had been failing to COMPILE since v64 appended
report_ping and report_done_n without updating its sums -- and a static_assert
that does not compile is not a guard. That one exists to catch the mid-struct
insert that broke v44 and shipped the poisoned beta_57 layout. Repaired, with a
note where the next person appending a field will read it. 17 pass, 0 fail, 2
skipped with their reasons stated rather than quietly dropped.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-10-05 11:31:36 +02:00
Kaj SchittecatandClaude Opus 5 88e36e9499 touch: a private channel send must never fall out onto public (#589)
Three fixes.

#589/#588, and this one is a disclosure rather than a glitch. TippyLion28 had a
channel go invalid (#588), then sent to it from the web UI; the messages went
out on the PUBLIC channel with nothing on screen to say so. The web path did
resolve the channel by name at TX, with a comment citing the stale-slot trap --
and then threw that away:

    if (slot < 0) slot = threadMeshChannelSlot(tidx);   // fall back to cached

A name that does not resolve means the channel is gone. The cached slot then
points at some OTHER still-valid channel, in practice slot 0, public. It now
refuses and says so, which is what the touch composer already did ("Channel not
found"); the web UI had no business being the laxer path.

termDoSend() also only checked that the slot resolved to A channel, never that
it was the RIGHT one, so a stale slot sailed through it. Every caller already
passes the channel the user chose, so it compares now -- enforced at the one
point every sender passes through, not only in the callers.

#583, T-LoRa Pager losing ~30 min/day while powered. jcyrio read the source and
called it exactly: HardwareRtcClock copies the chip into the ESP32 clock once at
boot and getCurrentTime() never touches I2C again, so the software clock
free-runs at the RC oscillator's ~2% while an accurate crystal sits unread on
the bus. Keeping I2C out of the hot path is right -- it runs on every message,
UI tick and advert -- but once an hour is not that path. tick() now re-reads the
chip hourly and pulls the software clock back. Only when a chip was adopted at
boot (a read refused at boot is not a trustworthy source and must not drag a
good clock backwards), only past a 2 s threshold, and it corrects the software
clock alone: calling setCurrentTime() would write the chip's own value back to
itself and a read-back failure would then mark a healthy retention path broken.

P4 tile cache on a board with no SD card. The fallback set s_tile_fs = &FFat,
but main.cpp mounts that partition with LittleFS -- 'storage' was converted from
FAT and this line was not updated with it. The tile cache was handed an FS
object nothing had mounted, so every tile failed with "File system is not
mounted" as the only clue. Uses the filesystem that is actually mounted.

Compile-checked on T-Deck, T-LoRa Pager and ThinkNode M9.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-10-05 11:31:16 +02:00
Kaj SchittecatandClaude Opus 5 b52c71f4a5 p4: stop retrying a C6 that is never coming back
7ce1b3f turned off CONFIG_ESP_HOSTED_TRANSPORT_RESTART_ON_FAILURE so a wrong-
firmware C6 could not reboot the board. It stopped the boot loop and I called
it fixed on a 45 s capture. That was the wrong test. Disabling the restart did
not stop esp-hosted, it only removed its exit: 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. Measured on the same board:

  731 failed register reads in 45 s, ~2.2 KB/s of log, forever

A boot loop and an unbounded retry storm are the same mistake: an unreachable
co-processor is a PERMANENT condition and the driver treats it as transient.

* The rx task now parks after the failure event is posted (build-time patch to
  the esp-hosted fork, same idempotent mechanism build.sh already uses for
  libsodium and the SD_MMC pull-ups; it fails loudly if upstream moves that
  code rather than silently not applying). No reboot, no retry: Wi-Fi and BLE
  are unavailable and everything else carries on.

* hostedInitBLE() no longer runs unconditionally. It is a full esp-hosted
  handshake and it ran on every boot even though the banner advertises lazy
  initialisation -- so on a mismatched unit it started a transport that can
  never come up, for a radio the user may have had switched off. It now
  honours the same stored intent beginBle() already checked.

* The keyboard hot-plug probe backs off from 1.5 s to 15 s once the expansion
  has been absent a few times, and returns to the fast rate the moment one
  succeeds. The probe is a real I2C transaction and on an empty bus Arduino's
  Wire layer logs two [E] lines per attempt: a permanent drip down the USB-CDC
  the companion app talks over, for an accessory most people do not own.

Measured on an ESP-AT unit running the HOSTED image, 150 s captures:

                      shipped   7ce1b3f only   this
  resets                 5           0           0
  host restarts         yes         yes          0
  failed reg reads       -        731/45s        1
  steady log rate        -        2.2 KB/s    ~14 B/s
  UI                   never      appears     stays up

The remaining ~14 B/s is the backed-off keyboard probe on a board with no
expansion attached, which is the expected floor.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-10-05 10:26:17 +02:00
Kaj SchittecatandClaude Opus 5 7ce1b3f48c p4: an unreachable C6 must not take the device down with it
beta_86 flipped the T-Display P4's default C6 backend to esp-hosted. Current
V1 units ship the C6 with esp-hosted firmware and are fine; OLDER units still
carry the factory ESP-AT firmware, and on those the SDIO stream never frames.
That turned into a board that will not boot at all, reported by three people
so far (#600 jalevdev, myshoeisonfire on Discord, and Kaj's own unit), each
with the same signature:

  H_SDIO_DRV: len[25970]>max[1524] OR offset[25697] != exp[12], Drop

Two separate things made a co-processor mismatch fatal, and both had to go.

1. The UI was behind the C6. hostedInitBLE() ran unconditionally at setup, a
   hosted handshake, with ui_task.begin() ~80 lines later. The LEGACY backend
   always started its worker AFTER the UI, which is exactly why a dead C6 used
   to cost Wi-Fi and nothing else; the hosted path was wired in ahead of it.
   Both backends now start at the end of setup, after the UI, with a note
   saying nothing C6-dependent may move above it.

2. esp-hosted resets the host. CONFIG_ESP_HOSTED_HOST_RESTART_NO_COMMUNICATION_
   WITH_SLAVE=n covers one path; the one that actually fires is
   H_TRANSPORT_RESTART_ON_FAILURE in sdio_drv.c, about 10 s after the connect
   attempt, and it is on by default. Now off. The failure still arrives as
   ESP_HOSTED_EVENT_TRANSPORT_FAILURE, which is what an application should act
   on instead of the transport rebooting the board underneath it.

Measured on an ESP-AT unit, 45 s captures, same hardware:

  as shipped       5 resets, host restarts, UI never appears
  reorder only     2 resets, host restarts, UI appears then dies
  reorder + config 0 resets, 0 restarts, UI stays up

The C6 is still unreachable on that unit, as it must be - it is the wrong
firmware for it. It now costs Wi-Fi and BLE and nothing else.

Also here, both needed before this can ship:

* The ESP-AT build gets its own artifact name (tdisplay-p4-at, and the matching
  -lcd/-lr2021 combinations). Both backends used to answer "tdisplay-p4", so an
  ESP-AT unit's self-update would have fetched the hosted bin and put itself
  straight back into the loop, recoverable only over USB. That is the T-Deck
  Max bug again (a Max self-updating to Pro firmware) and would have been the
  fourth time this table shipped wrong.

* The keyboard expansion probe prints a one-shot bus scan. "It does not work"
  has three causes that are indistinguishable from outside: not clipped on,
  clipped on but unpowered, or present and failing bring-up. An unpowered board
  does not NACK cleanly either - its pull-ups are dead, the lines sit low
  through its ESD diodes, and every transaction returns ESP_ERR_INVALID_STATE,
  which reads like a driver fault. The scan says which it is in one line.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-10-05 10:03:19 +02:00
Michael A. Cojocari 535f69c2ee Merge branch 'feat/web-transfer-backup-restore' into general-tweaks
# Conflicts:
#	src/helpers/esp32/WebFileTransferPage.h
2026-10-04 20:05:39 -04:00
Michael A. CojocariandCopilot 6c85948002 fix(boot): boot logo follows the saved orientation
The logo is painted before SPIFFS/SD mount, so it read rotation from the
legacy NVS settings copy, not the real file-backed settings. Any device
whose two copies disagreed (the Attaky after its v68 landscape reset, or
anyone who changed orientation since settings moved to files) showed the
logo in the old orientation until the UI took over.

Keep a raw-NVS boot copy of the rotation (touch/boot_rot): written by
touchPrefsSetUiRotation() and re-synced after touchPrefsReload() every
boot, so schema resets and restored backups catch up too. The logo reads
it, falling back to the old read when absent (first boot after update,
or Launcher installs without NVS). On the Attaky any landscape value is
treated as rotation 1, as UI init does.

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
2026-10-04 19:34:01 -04:00
Michael A. CojocariandCopilot 3a9b3ce055 File Transfer page: browser Backup and Restore buttons
Backup runs the same export as Settings > Backups > Export into a hidden
temp file and streams it to the browser as meshcore-<date>.json.
Restore uploads a backup .json through the existing chunked/CRC path,
then applies it via the shared backupImportAndReboot() helper (same
sections/replace flags as Import backup) and reboots. Temp files holding
key material are removed after use and on page open.

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
2026-10-04 19:25:58 -04:00
Michael A. CojocariandCopilot fe8fdd33cf fix(attaky): turn the panel back to portrait at UI init
Portrait came up as a shrunken landscape screen. The boot logo takes its
rotation from the settings copy in legacy NVS, read before main.cpp moves
settings to SPIFFS. On the Attaky that copy says landscape (the new
default, and the v68 reset), so the logo turned the panel to rotation 1.
The real setting, loaded from SPIFFS afterwards, said portrait: LVGL was
built at 240x320, but nothing turned the panel back, so the UI was drawn
upright for landscape, 240 px wide, with its bottom cut off.

UI init now turns the panel to the build portrait rotation
(DISPLAY_ROTATION, 2) when the UI is portrait, as the CrowPanel already
does for the same reason. Portrait there needs no touch transform, as on
the V4: the Attaky's landscape touch map is the V4's, so its touch frame
is too. The D-pad remap from the orientation commit follows from the
same map.

The boot logo still follows the NVS copy, so in portrait it shows in
landscape for a moment before the UI takes over.

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
2026-10-04 17:29:00 -04:00
Michael A. CojocariandClaude Opus 5.5 01346777ed feat(attaky): File Transfer on the Mesh Deck, to internal storage
File Transfer needed a removable card, and the Mesh Deck has no card
slot. Give it an internal backend (WADA_WEB_FILE_TRANSFER_INTERNAL):

- Files go to /transfer on the internal LittleFS "tiles" partition, never
  SPIFFS, which holds the settings, contacts and chats.
- The page shows "Internal storage  used / total". An upload that would
  leave less than the map tile cache's 320 KB floor is refused up front
  ("not enough free internal storage") instead of failing part-way.
- Map tile folders are refused ("map tiles need an SD card"): the map
  only reads uploaded tile libraries from a card.
- If the partition did not mount, opening the app says so instead of
  asking for an SD card.
- The browser page now says files go to "the device's storage" rather
  than "the device's SD card", which is right on every board.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_019M5VJ43X3nUULPqVcgrAH2
2026-10-04 15:47:12 -04:00
Michael A. CojocariandClaude Opus 5.5 32d6c0d56d feat(attaky): Orientation setting, so the Mesh Deck can run in portrait
The Mesh Deck UI was pinned to landscape (LV_DISP_ROT_90), and the
build without a keyboard is held upright, so it needs portrait too.

- CAP_ROTATABLE on the Attaky: Settings > Display > Orientation toggles
  landscape (ROT_90, panel rotation 1) and portrait (the panel's
  DISPLAY_ROTATION=2, no touch transform, as on the V4).
- Landscape stays the default: DEFAULT_UI_ROTATION is 1 on this board,
  and schema v68 (no new field) resets the stored value once, since the
  UI ignored it until now. The pre-LVGL boot logo already follows the
  setting, so it is upright in both.
- The front D-pad is named for landscape, so in portrait a press turns
  with the screen (right -> up, down -> right, left -> down, up -> left).
- The terminal (Console Mode) keeps the panel's build orientation,
  whatever the UI orientation is.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_019M5VJ43X3nUULPqVcgrAH2
2026-10-04 15:47:12 -04:00
Michael A. CojocariandClaude Opus 5.5 6d655b8301 feat(pager): keyboard navigation and remappable tab keys, as on the T-Deck (#591)
The wheel is the Pager's only way to move the highlight, which is slow
and imprecise. Bring the T-Deck's keyboard navigation to it:

- With no text field focused, programmable letters move the highlight
  (default I up, K down, J left, L right) and scroll (U / O). Select
  and Back default to no letter, since Enter and Backspace-hold (the
  wheel's click / long-press) already do them. On the Map the letters
  move the highlight; W/A/X/D stay the map pan.
- The tab keys are programmable like the T-Deck's, defaulting to the
  Pager's M/C/H/A/S, and the bar's labels show whatever is bound.
- Settings > Keyboard gets the same "Keyboard navigation" switch (on by
  default here) and the same tap-a-row-then-press-a-key remap rows; the
  T-Deck's rows move into settingsNavKeyRows() so both boards share them.
  The Pager's switch only turns the letters on or off; it never empties
  the focus group, which the wheel always needs.
- A remap refuses letters the Pager uses for fixed actions (Q/E slider
  nudge, W/A/X/D map pan; A stays allowed as a tab key).
- In wheel edit mode on a slider, J/L preview like a turn and the
  select key closes the edit, matching the wheel.

Settings: the Pager's kbd_nav and key bindings were never shown on that
board, so they held the T-Deck defaults. Schema v67 (no new field) puts
the Pager defaults in once on that board only. Two new strings,
translated in every deploy/apps/lang file; i18n_builtin.h regenerated.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_019M5VJ43X3nUULPqVcgrAH2
2026-10-04 15:06:40 -04:00
Michael A. Cojocari 8adea3558e Merge branch 'fix/594-statusbar-clock-overlap' into fix/touch-ui-followups-2 2026-10-04 14:56:28 -04:00
Michael A. CojocariandClaude Opus 5.5 d7c3844ef2 fix(ui): keep the status-bar clock off the Bluetooth icon (#594)
On the M9, V4-R8 and Pager the text presets grow the status-bar offset
ladder with the font (SBX), and the builder places the Bluetooth glyph
with it. The clock placement then re-aligned the clock with plain SC(),
which leaves it at its 100% spot, so at Large / Huge the Bluetooth glyph
moved left onto the time. The charging slide also used raw 100% offsets,
so plugging in or unplugging snapped the cluster back under the grown
glyphs.

- The wide-bar clock uses SBX() like the icons it sits beside.
- The charging slide uses exactly the builder's offsets (SBX plus the
  battery-% overflow); the narrow V4 portrait bar keeps its raw values.
- Safety net for every board: after placing the clock, if it overlaps a
  visible icon on its row (Bluetooth, DND, sleep, Wi-Fi, signal,
  battery), move it just left of the leftmost one. Covers the 12-hour
  clock, the Bluetooth-keyboard glyph and the centred hide-name clock.
  Re-checked only when something that moves or resizes them changes.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_019M5VJ43X3nUULPqVcgrAH2
2026-10-04 14:56:28 -04:00
Michael A. CojocariandClaude Opus 5.5 08750ab3a1 feat(ui): Condense Nav, a landscape nav rail with icon-only Home launchers (#592)
On short landscape panels (the T-Pager is 480x222) the bottom nav bar
spends a full-width strip on five icons. New Settings > Display switch
"Condense Nav", off by default, applies after a restart:

- The nav bar becomes a rail on the right edge (LV_DIR_RIGHT tabview).
  Pager cells show the key letter under the icon; the Tanmatsu keeps its
  coloured F-key shapes; the T-Deck / P4 key hints sit under the icons.
- Home's launcher column (Advert, Terminal, Files, Apps, Control) shows
  icons only; the buttons keep their height and spacing, and the status
  text, chart and info card widen into the freed space.
- The active-tab marker turns vertical beside the active cell, the
  unread and update badges move to the top-right of their cells, and the
  rail stays solid (and the marker visible) on the Map.
- Content that kept the bottom bar visible now stops at the rail
  instead: tabContentW() subtracts the rail, and the map canvas, Settings
  landing grid, chat-list rows, Mentions and the app drawer use it.
  Swipe-left on the rail opens the drawer (swipe-up on the bottom bar).

Portrait layouts and the M9 are unchanged: the mode is decided once in
buildUiTree from the pref and the orientation at boot, the switch is
greyed out in portrait and absent on the M9.

TABBAR_H becomes a runtime value (0 with the rail) next to a new
TABBAR_W. The pref is a new trailing field, condense_nav (schema v66);
the schema test's layout asserts now count the v64 fields they missed.
Strings added to every deploy/apps/lang file and i18n_builtin.h
regenerated.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_019M5VJ43X3nUULPqVcgrAH2
2026-10-04 13:47:46 -04:00
Michael A. CojocariandClaude Opus 5.5 567c6599e5 fix(pager): click the wheel on a slider to adjust it with the wheel
A plain wheel turn moves focus, and a click sends Enter, which a slider
ignores, so no slider on the Pager (Screen timeout, Brightness, the
Control Center sliders, Map zoom) could be adjusted with the wheel; only
the hidden Q/E keys moved them.

Clicking the wheel (or Enter) on a focused slider now enters an edit
mode, shown with a bigger contrasting knob. Turns move the value with a
live preview (VALUE_CHANGED) and save nothing. Clicking again saves
(RELEASED, the same commit a touch drag ends with) and returns the wheel
to focus navigation. Back (long-press or Backspace-hold) restores the
original value without saving, as does the screen timing out or focus
leaving the slider. Q/E preview instead of saving while in edit mode.

The slider step moves out of navMoveDir() into navSliderNudge() so the
wheel and Q/E share it.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_019M5VJ43X3nUULPqVcgrAH2
2026-10-04 13:35:42 -04:00
Michael A. CojocariandClaude Opus 5.5 988498b267 feat(ui): battery saver switch on every touch board (#593)
The idle power-saver (touchSleep) already ran on every touch build: the
hooks are installed in UITask::begin and main.cpp calls loopEnd() every
tick, and its gates are board-neutral. Only the Settings switch, its
callback and the amber battery tint were behind a T-Deck / V4-R8 / M9
allowlist, so on every other board (T-Pager, CrowPanel, T-Display P4,
T-Deck Pro, ...) the pref defaulted OFF with no way to turn it on --
the same bug the M9 had until 2026-09-02.

Drop the allowlist from the switch row, sleepIdleToggleCb, applyBattColor
and the status-bar re-tint. Also rejoin the lockOnScreenOffToggleCb
comment the old #if had split in two.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_019M5VJ43X3nUULPqVcgrAH2
2026-10-04 13:18:52 -04:00
Kaj SchittecatandClaude Opus 5 66e1f37d2c harness: model the filesystem, and stop apps running other apps' tests
Two things made a full harness run untrustworthy, and together they produced a
false accusation against a community app.

wada.fs was stubs. append threw the data away, remove always said true, and
read, write and list were not there at all — although the firmware registers
all five (LuaAppHost.cpp). Any app that writes a file and reads it back
therefore failed here while working perfectly on device. wardrive 1.2 is
exactly that app: it errors on a nil fs.read at its first log flush, long
before it renders anything, and the emoji scenario then reported the repeater
name as unrendered. Read as "1.2 regressed the beta_70 emoji fix", which it
did not. It passes untouched once fs is real.

wada.fs is now an in-memory filesystem following LuaAppHost's semantics: read
returns the data plus the file's TOTAL size so a caller can window a growing
log, an offset at or past the end gives an empty string rather than nil, a
missing file gives nil, and list is sorted so a hash order cannot make a test
flaky.

The second: the gpscompass scenario list was acting as the dispatch default,
so an app with no branch of its own was run against tests written for a
different app. Six store apps have no branch (2048, airtime, monitor, nearby,
sdktest, snake), so a full sweep came back with six red apps as its normal
state — and a real regression would not have stood out against that. Those
apps now say they have no scenarios and run none. They are untested, which is
worth saying out loud, but that is not the same as broken.

A sweep of every store app is now 8 apps passing their own scenarios, 6
reported untested, 0 failures.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-10-04 12:42:12 +02:00
Kaj SchittecatandClaude Opus 5 ace73911ad touch(m9): bottom notices carry a count and stop flashing
The M9 is the one board with no bottom bar (TABBAR_H == 0, tab_btns hidden
outright), so it never got the numeric badges the others have. beta_75 put
three glyph labels on layer_top across the bottom instead, OVER page content,
and blinked two of them at 1 Hz. With nothing else down there to read them
against, that came back reported as the navigation icons flashing.

They now carry a count and are shown only while they mean something:

* The person glyph was driven by discoveredCount(), a standing total that is
  non-zero on any live mesh from the first advert heard and only ever falls
  when you add or purge. It therefore blinked forever. It now counts what has
  not been looked at: watermarked at boot, because a ring restored from flash
  is not news, and again whenever the Discovered list is opened, with a clamp
  so purge, adding to Contacts and ring eviction cannot leave the next real
  arrival reading as nothing new.
* It also blinked while you were standing on Contacts with that list open.
  Suppressed there, the way the mail glyph already was on the inbox tab.
* Two style writes and a z-reorder ran on every 250 ms tick regardless of
  whether anything was pending, invalidating the strip for nothing.
  m9NoticeSet() only touches LVGL on a real change, and takes a refront flag
  so a live notice still lifts over the app drawer, which is the one overlay
  notices are allowed to sit on top of.

Also: "100%" was clipped by the signal bars. The percentage is right-anchored
at SBX(22) and grows left, the bars are pinned at SBX(54), so the text gets
SBX(32) and no more; "100%" is a whole glyph wider than "99%", and the bars
are created after the label so they paint over the leading 1. Reported by
buko84 and confirmed by jd1227, both on the M9, which is a board whose text
presets grow the font and leave the geometry at 100%, so it runs out of room
first. statusPctOverflow() measures the real width and slides the bars, the
Wi-Fi glyph and the SD dot left by the overflow, capped, and gated to those
font-only-preset boards. Zero where the text already fits, so no board moves
that did not have to, and the clock, the DND moon and the BLE glyph never
move. The round panel already solved this with statusClusterStart(); this is
the same idea for the single-row ladder.

Built for the M9, the V4-R8, the Pager and the T-Deck. The T-Deck binary is
byte-identical, which is the check that the ladder change reaches nothing
outside its gate. Not run on hardware: needs an M9 tester.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-10-04 12:36:53 +02:00
jcyrioandClaude Fable 5.1 5249901555 touch: the Secondary keyboards hint named a key the Pager does not have
Switching on a secondary layout changes nothing until you cycle to it with
double-tap SPACE, and the sentence under "Secondary keyboards" is where that
is explained. It was gated on HAS_TDECK_KEYBOARD || HAS_M9_KEYBOARD, so the
T-LoRa Pager, T-Deck Pro and T-Deck Max (HAS_PAGER_KEYBOARD) fell through to
the on-screen wording and told the user to tap an "EN" key their physical
keyboard does not show, while their keys go through the same handleHwKey()
double-space path as the T-Deck. The setting read as broken.

Gate the hint on CAP_KEYBOARD instead, which is exactly the set of boards
whose keys reach that handler (the Attaky module keyboard has its own loop
and really does type next to the on-screen EN key, so it keeps the touch
wording). And make the "on" toast say how to switch, since "Russian: on"
alone was the moment the user was left guessing; "off" keeps the short form.
The cycle itself is unchanged.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Signed-off-by: jcyrio <50239349+jcyrio@users.noreply.github.com>
2026-10-03 14:13:56 -07:00
Kaj SchittecatandClaude Opus 5 1348910415 release: beta_87 notes say what happened and what fixed it
Dropped the fault framing. The notes describe the mechanism and the change,
not whose code it was.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-10-03 19:49:22 +02:00
Kaj SchittecatandClaude Opus 5 2576b7e369 release: beta_87 notes
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-10-03 19:42:58 +02:00
Kaj SchittecatandClaude Opus 5 7e1f5af904 lua: wada.ui.emoji(cb) for apps that draw their own text entry
beta_86 put the emoji picker on the long-press menu, which covers the firmware's
own field and so covers wada.ui.input(). It does not cover an app that builds its
own buffer from key events, because there is no textarea to long-press -- and
that is exactly the case Jade asked about: their composer shows a pad-bytes
counter the firmware's field cannot, so it takes the custom path and the menu
never applies to it.

wada.ui.emoji(cb) opens the picker and hands the glyph back as UTF-8, nil if
dismissed. Same discipline as wada.ui.input's callback: one ref, one call,
released either way, refused if one is already open.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-10-03 19:41:51 +02:00
Kaj SchittecatandClaude Opus 5 defbd1d478 lua: wada.ui.clear() leaked a closure per button and per list row
Reported by Jade as "screen memory errors, worse the longer the app has been
open", with an app that rebuilds its screens on a 120 ms debounce.

Button and list-row callbacks live in one registry table keyed by the LVGL
object POINTER. clear() calls lv_obj_clean(), which frees every one of those
objects, and bumps s_ui_gen so stale handles go inert, but it never touched the
table. So each rebuild added an entry and kept the Lua closure, with its
upvalues, alive forever. Unbounded, and worst for exactly the apps that are
built properly: a list of twenty contacts redrawn on a timer leaks twenty
closures a go.

It was also a correctness bug in waiting. LVGL reuses freed addresses, so a new
button created WITHOUT a callback could land on an address a dead one left
behind and fire that stale closure on the next tap.

clear() now replaces the table. Every entry in it describes an object
lv_obj_clean just destroyed, so there is nothing there worth keeping.

Found by reading the host after Jade asked what the memory budget was; the
budget was never the problem.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-10-03 19:33:33 +02:00
Kaj SchittecatandClaude Opus 5 890a250a02 release: cumulative stable notes for beta_85 (beta_84..85)
Curated from the two beta notes. Leads with the two things a user must know
before this reaches their device: do not switch a T-Display P4 to landscape on
this build (fixed in beta_86), and a T-Deck Max on beta_84 must be updated over
USB rather than from the device.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-10-03 19:14:07 +02:00
Kaj Schittecat f4693f7c35 chore: refresh Mesh America catalog for beta_85 2026-10-03 19:01:29 +02:00
Kaj SchittecatandClaude Opus 5 607c761efa release: beta_86 notes
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-10-03 18:48:13 +02:00
Kaj SchittecatandClaude Opus 5 76a6e86896 touch: emoji in any text field, and the status bar fits the bigger type
Jade asked for three things for Lua apps. Two already existed and the answer is
documentation, not code: wada.sys.epoch() and wada.sys.datetime() have returned
the clock since #245, and wada.ui.input() is the firmware's own field, so it
already carries the long-press Cut/Copy/Paste/All/Sym menu, which is exactly the
"copy/paste from chats into a Lua text field" that was asked for.

The third is here. The long-press menu gains Emoji, so the picker reaches every
field in the firmware rather than only the chat composer: a Lua app's text entry,
a node name, a Wi-Fi password. The row is now sized to the panel instead of a
fixed 48 px per cell. It was already 268 px at five cells, wider than a 240 px
screen, so a sixth would have hung off the M9 and the V4 entirely.

Status bar: the right-hand ladder (battery, signal bars, Wi-Fi, Bluetooth, sleep,
clock) is a chain of fixed offsets tuned for 12 px text. The boards with
font-only UI-size presets grow the font and deliberately leave geometry at 100%,
so the labels widened and the ladder did not, and the battery percentage ran into
the signal bars (jd1227, M9, beta_85 -- the release that gave that board the
presets). SBX() scales those offsets by how much the text actually grew and
returns exactly SC() at Normal, so nobody who kept the default size sees any
change. Verified on the M9, V4-R8, Pager, T-Deck and V4.

SDK docs: corrected the app path. They said to copy the file to /apps/ on the SD
card; a card-backed device roots everything at /meshcomod, so it is
/meshcomod/apps/ there and a bare /apps/ only on boards that store internally.
Following the old wording cost gottlieb8849 an evening.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-10-03 18:40:58 +02:00
jcyrioandClaude Fable 5.1 3eb3fa8c71 touch: "Delete history" on a DM no longer makes the chat vanish from Chats
The confirm says "The chat itself stays", and beta_38's notes say the
contact stays, but on a DM the row disappeared: the inbox lists a DM only
while threadHasMessageHistory() is true, and refreshThreadsFromMesh() (every
4 s) reclaims any DM slot with no history, so the emptied thread was hidden
and then freed. Channels were unaffected because the inbox lists them
regardless.

The thread record had nothing to tell an emptied chat from a contact never
chatted with, so this adds keep_when_empty: set by clearThreadHistory() on
a DM, honoured by getCombinedInboxCount(), getUnreadTotal() and the reclaim
pass, cleared when the slot is reused, removed with the thread by "Delete
chat". It is appended to UiHistoryThread; thread_rec_size already lets older
records read it back as 0 and older builds skip it, so the history version
is not bumped (a bump would make a downgrade quarantine both history files).

Only threads the user explicitly emptied are pinned, so contacts without a
conversation still stay out of the inbox and clearThreadHistory() still
removes every message.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Signed-off-by: jcyrio <50239349+jcyrio@users.noreply.github.com>
2026-10-03 09:34:47 -07:00
Kaj SchittecatandClaude Opus 5 1247563110 apps: bake the new games, not the GPS ones
The five apps from #585 and #586 all defaulted to being seeded, which bakes
their source into the boards that cannot reach the Store. That is 40 KB of Lua,
and it took the Heltec V4 from 95.4% of flash to 96.7%: the tightest board in
the matrix paying for apps two of which it cannot use.

gen-lua-builtin.py states the rule: an app that is large, or that needs hardware
those boards do not have, earns its place rather than getting it by being in the
catalog. ProTreck (17 KB, altimeter/chrono/sensors) and Trip Odometer (GPS-only)
are both that, so they are seed:false, exactly like gpscompass and sdscan. They
remain in the Store for every board that can download.

Tetris, Breakout and Ping stay baked: no hardware needs, small, and the boards
that get seeded apps are precisely the ones that cannot fetch them otherwise.
V4 lands at 96.2%.

lua_builtin.h is regenerated here because it is tracked and the build rewrites
it. Leaving it out is how Wardrive and Nearby ended up missing from the seeded
boards after beta_68.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-10-03 17:27:40 +02:00
Kaj Schittecat 3171f5adea Merge PR #586 from samuelcoustet: Breakout and Trip Odometer Lua apps
Stacked on #585 and merged after it, as the PR asks. Two conflicts, both from
the stack base moving:

  apps.json: unioned by id, so all fourteen apps survive.
  harness.lua: the additive blocks came from #586. Where both sides edited the
  same code, #585's is newer and wins: its ping scenarios pass cfg.gps as a
  FUNCTION, which is what the harness calls (cfg.gps()); #586 still passed the
  table and would have failed. Taking #586 there would have broken ping.

  Then restored the two dispatch branches my first resolution dropped. The
  breakout and tripodometer scenarios existed but nothing ran them, so both
  apps silently fell through to the gpscompass scenarios and "failed".

All five new apps pass their own scenarios, and so do gpscompass and sdscan.
2026-10-03 17:24:15 +02:00
Kaj Schittecat ee20089e30 Merge PR #585 from samuelcoustet: Tetris, Ping and ProTreck Lua apps 2026-10-03 17:20:09 +02:00
Kaj Schittecat 83303fc297 Merge PR #566 from samdems: the trackball no longer pans the map while the screen is locked
Closes #132. Touch was already gated on isScreenOff() || isManualLock(); the
trackball path was not, so the map had moved by the time you unlocked.
2026-10-03 17:20:09 +02:00
Kaj Schittecat 34e6456b1a Merge PR #565 from oumike: T-Display P4, T-Deck Pro, M9 and UI follow-ups, plus the CrowPanel 3.5
Closes #562, #563, #564, #568, #569, #570, #571, #574, #576 and adds the
Elecrow CrowPanel Advance 3.5 (#561). Carries the fix for the beta_85 P4
landscape touch, which was rotated twice: once by the driver and once by LVGL.
2026-10-03 17:20:02 +02:00
Michael A. CojocariandClaude Opus 5.5 dbecef0b6f feat(crowpanel-35): add Elecrow CrowPanel 3.5" (ESP32-S3, ILI9488 + GT911) touch target
- New crowpanel_35 variant: display, SD, board and target files, plus board JSON
- Portrait mode is drawn rotated 180°; landscape stays at rotation 3
- Share the GT911 touch driver between Wio Tracker L2 and CrowPanel
  (WioTrackerL2Touch.cpp -> src/helpers/input/LgfxGt911Touch.cpp)
- platformio envs, flasher/site entries, release and merge-bin support
- Tests for the CrowPanel SD codec and merge-bin

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_0132MkJ7RUV32mV9F7o4PJMm
2026-10-02 20:16:06 -04:00
SamandClaude Sonnet 4.6 06f9c6e549 feat(apps): ProTreck 1.0 — outdoor watch Lua app (Astro/Chrono/Timer/Alti)
Sun/Moon rise+set from GPS lat/lon + date (Spencer 1971), moon phase 0-29.
Chronometer with lap times, countdown timer with alarm beep and preset
cycling, altimeter with GPS alt_m, min/max persistence and trend graph.
Swipe left/right to switch tabs. 4 tabs fit any screen size.

test(harness): add 7 ProTreck scenarios (tdeck, v4, no_gps, chrono,
timer, alti, cost). ALL OK 7/7.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-10-02 22:52:51 +02:00
rootandClaude Sonnet 4.6 7254b9cca6 feat(apps): Ping 1.0 — mesh DM ping with GNSS position and RTT
Send a DM to any contact, measure round-trip time.  Both devices
exchange their GPS coordinates; the result shows RTT, distance and
cardinal bearing when both have a fix.  The app also auto-replies to
incoming pings so two devices running Ping can time each other.

Harness additions: send_dm mock, wada.geo (haversine), deliver_dm
helper, and 6 scenarios (tdeck, v4, no_contacts, round_trip,
auto_reply, cost) — all pass.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-10-02 22:50:22 +02:00
SamandClaude Sonnet 4.6 9b7ca27747 feat(apps): Trip Odometer 1.0 — GPS trip computer as a Lua app
Tracks total distance (Haversine accumulation), elapsed time, current
speed, max speed, and altitude from live GPS fixes.  Start/Stop button
pauses accumulation; Reset clears the trip.  The current trip persists
across app restarts via wada.store.

Also adds 6 harness scenarios (no-fix, T-Deck, moving, persist, reset,
cost) and registers the app in apps.json.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-10-02 22:41:14 +02:00
SamandClaude Sonnet 4.6 ec57effffb feat(apps): Breakout 1.0 — classic brick-breaker as a Lua app
Ball + paddle + 8×5 brick grid. Swipe left/right (or arrow keys) to
move the paddle; swipe up / Enter / Space to launch. Angle on bounce
varies by paddle-hit position. Speed increases each level; high score
persists via wada.store.

Adds 6 harness scenarios (tdeck, v4, keyboard, logic, hiscore, cost).
Worst tick ~8k instructions, 8% of the 100k budget.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-10-02 22:37:57 +02:00
SamandClaude Sonnet 4.6 44f5dae4eb test(harness): add Tetris scenarios — tdeck, v4, keyboard, logic, hiscore, cost
Detects /tetris/ in the app path and routes to 6 dedicated scenarios:
- tetris_tdeck/v4: open + swipe input on touch screens
- tetris_keyboard: arrow + enter input on keyboard boards
- tetris_logic: hard-drop to game-over, verify restart resets timer to 700 ms
- tetris_hiscore: verify high score is stored as a number after game-over
- tetris_cost: 100 ticks, worst ~6000 instructions (budget 100000)

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-10-02 22:21:44 +02:00
SamandClaude Sonnet 4.6 b4d5e1ff81 feat(apps): Tetris 1.0 — classic falling-block puzzle as a Lua app
Adds Tetris to the app catalog. Full 7-tetromino implementation with:
- Correct piece rotations for all 7 tetrominos (I, O, T, S, Z, J, L)
- Wall kick on rotation (tries +/-1 col when center position collides)
- Hard-drop on swipe-down or Enter/Space
- Soft-drop on keyboard arrow-down
- Score scaling by level (100/300/500/800 x level per 1/2/3/4 lines)
- Speed increase every 10 lines cleared (700ms to 80ms floor)
- Next-piece preview and high score persistence via wada.store
- Game-over overlay with tap-to-restart
- Centered layout adapts to any screen width/height

Tested against the wada.* API contract (integer coords, canvas bounds,
store string/number restriction, instruction budget per tick).

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-10-02 22:13:07 +02:00
Michael A. CojocariandClaude Opus 5.5 f7402e628c fix(tdisplay-p4): Pick colour button no longer runs into the accent swatch
The P4's larger UI scale grew the button over the swatch, which sat at a fixed
x. On the P4 the button is narrower and the swatch sits a gap past its end, in
every orientation. Other boards are unchanged.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-01 14:32:37 -04:00
Michael A. CojocariandClaude Opus 5.5 1cad071bd0 fix(ui): opening a chat no longer pops up the on-screen keyboard
On touch boards without a built-in keyboard, opening a chat focused the
composer and that focus raised the on-screen keys, covering the conversation.
The focus now only binds the composer (cursor shown, a Bluetooth, clip-on or
CardKB keyboard types straight in); tapping the composer brings the keys up.
T-Deck, T-Deck Pro and M9 are unchanged.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-01 14:32:37 -04:00
Michael A. CojocariandClaude Opus 5.5 3378df5494 feat(tdisplay-p4): clipping the keyboard on in portrait offers a landscape restart
When the keyboard expansion arrives while the UI is portrait, a dialog counts
down 15 s and then saves landscape and restarts (the Settings orientation
switch's path); "Reboot Now" does it at once. Cancel, or taking the keyboard
off again, keeps portrait. A keyboard already attached at boot is not an
arrival, so a Cancel is not asked again on every start, and nothing is offered
under the lock screen. showConfirm() gains confirmSetMessage() to update the
open dialog's text in place.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_012GRWzzRs7oRvFRNcHUZF4c
2026-10-01 11:31:27 -04:00
Michael A. CojocariandClaude Opus 5.5 b078df52e9 feat(ui): lock screen shows the battery, laid out for every panel; P4 BOOT button locks
Lock screen (all boards, #579): the default view is now drawn from parts
instead of the old 320x240 bitmap with the padlock and wordmark baked in,
which cover-scaled into a jumble on any other panel shape. WADAMESH sits at
the top, the clock below it (clear of the status bar), a smaller padlock in
the centre with the unread count to its left and a new battery readout to its
right, each centred between the padlock and the screen edge. Short panels get
a smaller wordmark and padlock. The clock's burn-in drift now moves around its
new place instead of snapping it back to y=30 every minute. T-Deck Pro keeps
its black-on-white e-paper colours; custom wallpapers are unchanged.

T-Display P4: the BOOT button (GPIO35) now works like the Wio Tracker L2's
wake button -- a press wakes or lights the lock screen, a 2 s hold locks or
unlocks -- so the P4 gets the lock screen and the "Lock when screen off"
setting. It gets no Power-off row: GPIO35 cannot wake the P4 from deep sleep.

Also: the chat list's per-row gear clears the list scrollbar on large panels.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-09-30 20:54:15 -04:00
Michael A. CojocariandClaude Opus 5.5 ad91b1cb3f feat(tdisplay-p4): clip-on keyboard expansion, plus keyboard and layout fixes
The T-Display P4 keyboard expansion (TCA8418 + its own XL9555, ported from
camillia-mt) now works. It is looked for every 1.5 s, so it can be clipped on
or off while running, and is routed like the CardKB and Bluetooth keyboards:
it types into the focused field and keeps the on-screen keyboard down. The
external-keyboard routing was gated on Bluetooth, which the P4 lacks, so it
now follows a new CAP_EXT_KEYBOARD; the Bluetooth-only parts stay on
CAP_BLE_KEYBOARD.

- Keys: Shift/Sym/Alt one-shot, Caps Lock lights the expansion LEDs, arrows
  and Backspace repeat, Alt+Backspace backs out, F1-F5 open the tabs left to
  right, and F11 steps the keyboard light through off/low/medium/high (saved
  across reboots).
- Wire1 is shared with the ES8311 codec on other pins; P4I2c1 switches it
  under a lock, and the codec's lazy bring-up now goes through it.
- With the keyboard attached the tab bar labels F1-F5 beside each icon, and
  Enter on a chat bubble opens its action menu.

Also, on any keyboard build, Enter runs the command in the terminal and the
repeater admin console (the admin console's Enter hook sat on its Send button,
where nothing raised it). And on the P4: the status-bar name shrinks to fit the
bar, the Discover buttons are spaced out, contact names clear their icon in
landscape, and leaving an app returns the focus to its tile in the app drawer.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-09-30 20:10:12 -04:00
Michael A. CojocariandClaude Opus 5.5 d6bc169017 fix(ui): Map side buttons show which one is selected (#576)
The keyboard/trackball cursor is a 3 px accent outline, and on an accent
fill it disappears. setSelectionGlow already swaps to the contrast
outline (white, black on Day) there, but only for a fully opaque fill;
the Map's side buttons are accent at 70% over the tiles, so they kept
the accent outline and the selected one barely stood out. Any fill that
is at least half accent now takes the contrast outline.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-09-29 20:20:18 -04:00
Michael A. Cojocari 500b24e38c feat(tdisplay-p4): support LR2021 radio variants (#504) 2026-09-26 21:59:58 -04:00
Michael A. CojocariandClaude Opus 5.5 b408487dec fix(ui): tapping the accent popup after its text box closed crashed (#574)
The accent popup keeps a pointer to the text box it edits, and about 25
separate paths close the popup by hand. A path that deleted the text
box without closing it (e.g. a form closing after its send) left the
popup on screen pointing at freed memory; tapping an accent letter then
ran lv_textarea_del_char on it. That is the beta_85 T-Deck crash in
#574 (loopTask LoadProhibited at 0x3, accentBoxCellCb ->
lv_textarea_del_char), matched against the release image.

Tie the popup to its text box with an LV_EVENT_DELETE hook that clears
the pointer and hides the popup (hide only: in a layer clean the popup
may be deleted in the same pass). The cell handler also checks the text
box is still valid, and accentBoxHide no longer deletes a popup that
something else already removed.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-09-26 19:41:48 -04:00
Michael A. CojocariandClaude Opus 5.5 edf465ab19 fix(tdisplay-p4): Spectrum peak readout no longer overlaps the RBW/span line
The right-aligned peak readout shares the RBW/span line, and on the
narrow portrait panel it ran over that text. In portrait the RBW/span
line, chart and waterfall start one text line lower; the peak stays put
and the tall panel has the room. Landscape, the T-Deck Pro (peak on its
own line already) and the other boards are unchanged.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-09-25 20:57:49 -04:00
Michael A. CojocariandClaude Opus 5.5 df18b3bf56 fix(tdisplay-p4): Send advert starts under the status bar; stacked buttons in portrait
The page offset its content by a second STATUSBAR_H to clear the tall
status bar's lower row, which overlaps the page on square panels. The
round panel's bar is already its full two rows and never doubles, so on
the P4 that only left an empty band above the Home button, in both
orientations. Start 8 px below the bar there instead.

In portrait, Flood and Zero-hop stack as two full-width buttons instead
of sharing a cramped row. Landscape and the other boards are unchanged.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-09-25 20:57:49 -04:00
Michael A. CojocariandClaude Opus 5.5 f3ee043b5a fix(tdisplay-p4): contact action sheet is one column in portrait
The sheet's two-column grid of half-width buttons cut most labels off
with "..." on the narrow portrait panel. In portrait every action gets
its own full-width row; the card grows to fit and its body scrolls past
the screen height like any tall sheet. Delete stays the red bottom row.
Landscape and the other boards keep the grid.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-09-25 20:57:49 -04:00
Michael A. CojocariandClaude Opus 5.5 d902cc8153 fix(tdisplay-p4): composer buttons one size, centred on the text box
The P4 is a large-screen board, so its quick-reply/emoji chips were
56 px against a 34x30 send button, all pinned to the composer's bottom
edge, where the landscape row sat under the panel's bottom corner arcs.

All three buttons are now 45 px (the average) in both orientations and
vertically centred on the text box, re-centred as it grows. That lifts
them ~9 px off the screen edge, with a floor matching the status bar's
top-corner clearance. In landscape the quick-reply button also moves
16 px in from the bottom-left corner. Replaces the 32 px the portrait
two-row change assumed from the small boards' sizes.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-09-25 19:43:49 -04:00
Michael A. CojocariandClaude Opus 5.5 d217b33667 fix(ui): leaving an unedited Profile field no longer says it saved (#570)
Node name and advert location save on blur, and every blur saved and
showed "Name saved" / "Position saved", edited or not. On the M9 (no
touch) moving focus past a field with the d-pad is a blur, so the
alert flashed for each field crossed.

On blur, skip the save and the alert when the field still holds what
it was filled with: the name with missing glyphs replaced, the
position as "%.6f". An edit still saves and says so. This also stops a
bare blur writing the glyph-replaced display form over the real name.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-09-25 14:22:39 -04:00
Michael A. CojocariandClaude Opus 5.5 d9794dc8bf feat(terminal): add and delete channels from the terminal
chan add <name> [key], chan add #tag, chan del <slot|name> and
chan key <slot|name>, in the on-device console and remote terminal.
They reuse the Channels screen's save and delete paths, so the chats
list updates at once. No rename: chat threads are matched to channels
by name, and the Channels screen has no rename for the same reason.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-09-25 12:17:49 -04:00
Michael A. CojocariandClaude Opus 5.5 e6b89ffc61 fix(ui): at-a-glance title and message centred, with a gap between them
The channel/sender line was pinned at y=30 and the message at y=60,
so a title taller than 30 px (larger UI-size presets, bigger panels)
was drawn over the message, and the rest of a tall screen stayed empty.
Centre both horizontally and centre the pair vertically with 16 px
between them; the message box takes the height its text needs, capped
to what fits and cut at a whole line.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-09-25 12:17:49 -04:00
Michael A. CojocariandClaude Opus 5.5 594c6b12a3 fix(tdisplay-p4): contact names clear of their type icon in portrait
The name started a fixed 24 px after the icon, but the antenna and room
glyphs are wider than the person glyph and all three grow with the
UI-size preset, so some names touched their icon. Start the name 8 px
past the widest of the three, never closer than before.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-09-25 12:17:49 -04:00
Michael A. CojocariandClaude Opus 5.5 85296b07a7 fix(tdisplay-p4): composer send button clear of the corner; two rows in portrait
The send button sat at the composer's bottom-right, under the panel's
rounded corner. Pull it in by the same 16 px safe-area the tab bar
uses, and narrow the text box to match.

Portrait: the single row (QR | emoji | text | send) was crunched on the
284-px panel. Split it into two rows: quick-reply and emoji
right-aligned on top, text and send below. All three buttons are 32 px,
midway between the old 30-px chips and the 34-px send button.
Landscape keeps the single row, and chatComposerApplyRows re-lays it
out when the keyboard's rotate button flips orientation with a chat
open.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-09-25 12:17:49 -04:00
Michael A. CojocariandClaude Opus 5.5 94ac4beccf fix(lua): ui.input text box takes typing on keyboard boards (#571)
While a Lua app was open, every physical-keyboard key went to the app,
and luaAppKey always claims the key, including while the app's own
wada.ui.input prompt was open. The prompt's text box never received a
character on the T-Deck, Pager, M9 or Attaky, or from a Bluetooth
keyboard (reported with Wardrive's "Name this run").

Don't forward keys to the app while that prompt is open, in
handleHwKey and both bleKbdDispatch paths; they then type into the
bound text box like any other prompt.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-09-25 12:17:49 -04:00
Claude e1f6c75091 docs(tdisplay-p4): full-reset restarts, landscape touch and the landscape Cmdr layout
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01FbY4FsGuX2fNDpNttB6a7R
2026-09-25 01:28:50 +00:00
Claude 6c6600add1 Merge remote-tracking branch 'origin/main' into fix/touch-ui-followups
# Conflicts:
#	variants/tdisplay_p4/target.cpp
2026-09-25 01:17:45 +00:00
Claude 81f5de8ef8 T-Display P4: nav bar taps land where they are made in landscape
In landscape the P4's tab bar barely responded to taps, while swipes between
tabs still worked.

P4 landscape is LVGL software rotation, and LVGL 8 rotates pointer input for a
rotated display itself (indev_pointer_proc): it expects points in the
unrotated panel frame. The touch driver was also mapping points to landscape
(heltecV4CapTouchSetPointRotation), on the belief that LVGL does not, so every
point was rotated twice. In ROT_90, the rotation the Orientation button picks,
a tap at (X, Y) reached LVGL at (615 - Y, X): a tap on the bar at the bottom
landed in the middle of the screen or below it, and never on a tab button.
Swipes were unaffected because the driver detects them in its own mapped
coordinates.

The driver keeps its landscape mapping, which its swipe detection and the
direct readers (tab-bar guard, remote-mode hold) need. lvglTouchRead now
converts the point back to the panel frame before giving it to LVGL, keyed on
the driver's rotation, so the chat keyboard's rotate trick on a portrait UI
(LVGL rotated, driver not) passes through unchanged. Also corrects the comment
in UITask::begin that said LVGL does not rotate input.

Not built or tested on hardware.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01FbY4FsGuX2fNDpNttB6a7R
2026-09-25 01:13:46 +00:00
Claude 14e78aeaa7 T-Display P4: lay out the landscape Cmdr screen like the Wio Tracker L2
In landscape the P4 home screen mixed its portrait column-flow layout with the
landscape right-hand button column: the TX/RX chart ran full width underneath
the buttons, and the info card was placed below the portrait launcher grid,
off the bottom of the 284-px-tall screen.

Landscape now follows the Wio Tracker L2's arrangement: status lines and a
chart sized to the remaining height on the left, clear of a right-hand column
of Advert / Terminal / Apps / Control spread evenly down the content height
(6-px gaps, each 22..46 px). The info card is portrait-only; its eight rows do
not fit landscape. The height is taken from the measured tab, since the
round-corner status bar leaves less than tabContentH() reports. Portrait is
unchanged.

Not built or tested on hardware.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01FbY4FsGuX2fNDpNttB6a7R
2026-09-25 01:09:31 +00:00
Claude 1501394fe5 T-Display P4: a settings reboot no longer leaves the screen off
After a setting that reboots (theme, rotation, language, remote mode...) the
P4 came back with the panel dark, and only a second reboot brought it back.

esp_restart() on the ESP32-P4 is a CPU reset: esp_system_reset_modules_on_exit()
resets DMA, UARTs, SDMMC and crypto, but not the MIPI-DSI host or its DPI path.
The display driver then initialises over a host still half-configured from the
previous session and the panel stays dark. A full chip reset always recovers it.

So every software restart now becomes a full system reset: a shutdown handler,
installed first thing in app_main so it runs last, arms the RTC watchdog with
RESET_SYSTEM. Being a shutdown handler it covers rebootDevice(), OTA, the
console and factory reset without touching any of them. Same fix as
camillia-mt's T-Display P4 port.

Those restarts now arrive as ESP_RST_WDT, so an RTC_NOINIT marker records that
the restart was deliberate, and the crash-report prompt and Settings -> About
read the reset reason through bootResetReason(), which reports ESP_RST_SW for
them. Otherwise a lingering coredump would re-prompt "restarted after a crash"
on every settings reboot.

Not built here (no ESP-IDF toolchain in this environment); needs a P4 build and
an on-device check.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01FbY4FsGuX2fNDpNttB6a7R
2026-09-25 01:08:59 +00:00
Michael A. CojocariandClaude Opus 5.5 1c3576e1d6 fix(tdisplay-p4): GPS the camillia-mt way, 9600 start with baud probing
camillia-mt's working T-Display P4 GPS wakes the L76K through the XL9535
before opening UART1 on RX 22 / TX 23, starts at 9600 and probes other
rates until valid NMEA arrives. Wake and pins already match here; the
difference was the rate. The P4 used the core MicroNMEALocationProvider
locked to one rate (115200), so a receiver at any other rate gave an
open but silent UART.

Build the P4's provider as WadaNmeaLocationProvider with UART probing
(already on main via PR #517, used by the T-Deck Pro), starting at 9600:
it walks 9600/19200/38400/57600/115200 until a checksummed sentence
arrives and saves the working rate.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-09-24 15:28:50 -04:00
Michael A. CojocariandClaude Opus 5.5 8f97db532c feat(tdisplay-p4): cold-boot clock sync over saved Wi-Fi
The "Sync time from saved Wi-Fi after cold boot" option (#383) existed
only on the T-Deck and ThinkNode M9. The P4's PCF8563 has come back with
impossible dates too, so enable it there: the Settings > Clock switches
(CAP_BOOT_TIME_SYNC), the runtime gate in BootTimeSync.cpp, and a call
in the P4's own startup at the same point the S3 main.cpp uses, before
the TCP/WS/BLE transports start.

Esp-hosted builds only: the sync drives Arduino's real WiFi, which the
legacy ESP-AT build must never touch. As elsewhere it is opt-in, runs
only after a true power-on, and skips when the RTC already gave a
trustworthy time or Wi-Fi is on anyway.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-09-24 15:28:50 -04:00
Michael A. CojocariandClaude Opus 5.5 e469993295 fix(ui): keep the screen-timeout slider inside the settings page
The track started 4 px in at 96% width, but the knob overhangs each end
by its 6 px padding plus half the track height, so at the lowest setting
it was drawn past the left edge. Inset the track by that overhang on both
sides of the content width.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-09-24 15:28:50 -04:00
Michael A. CojocariandClaude Opus 5.5 4aafab4b1c feat(web): paste text into the device from the browser (VNC / Remote UI)
The mirror page only forwarded key presses: its key handler skips
anything with Ctrl/Cmd held, so Ctrl+V / Cmd+V did nothing, and a paste
into the hidden input phones use was discarded. Catch the document
'paste' event and type the clipboard text into the device's focused
field, and add a Paste button (a prompt box) for phones, where a
plain-HTTP page cannot read the clipboard from script.

Pasted text goes out in batches of 16 keys every 80 ms so the device's
256-entry key ring is never overrun; line breaks become spaces so a
multi-line paste cannot press Enter and send a half-typed message;
characters outside the BMP are dropped (keys are 16-bit). Same page on
every board.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-09-24 15:28:50 -04:00
Michael A. CojocariandClaude Opus 5.5 005e4ff5a6 fix(tdisplay-p4): show the real web UI port (8765) on esp-hosted builds
WEB_UI_PORT_STR was 5000 on every P4 build, from the ESP-AT days when the
single AT listener shared the companion port. The esp-hosted build serves
the web UI on WS_PORT (8765) like the other boards, so the VNC, Remote,
Files, terminal and remote-placeholder addresses pointed at the wrong
port. Keep 5000 only for WADA_P4_LEGACY_AT builds; other boards were
already correct.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-09-24 15:28:50 -04:00
Michael A. CojocariandClaude Opus 5.5 36f96e0b7c fix(ui): smaller "Enable web access" label and address on the VNC page
The switch label drops from the 14 px to the 12 px body font and the
browser address from 16 px to 14 px, so both fit comfortably.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-09-24 15:28:50 -04:00
Michael A. CojocariandClaude Opus 5.5 0bff47286c fix(ui): Join private channel form sits just above the keyboard
The form hugged the header and left most of the tall page empty, so on
on-screen-keyboard boards start it where its Join button ends just above
the keyboard's top edge (keyboard height as kbApplyLayoutForRotation sets
it: CHAT_KB_H portrait, half the screen landscape). Physical-keyboard
boards, and screens without the spare room, keep the old layout.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-09-24 15:28:50 -04:00
Michael A. CojocariandClaude Opus 5.5 7e39b7c853 fix(ui): shorter Add channel options in a smaller font
"Create a private channel" / "Join a private channel" / "Join the public
channel" / "Join a hashtag channel" become "Create private channel",
"Join private channel", "Join Public channel" and "Join # channel", in
the body font a step below the title. The first two reuse existing
translated strings; the other two fall back to English until translated.
The labels were also wrapped in TR() twice; now translated once.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-09-24 15:28:50 -04:00
Michael A. CojocariandClaude Opus 5.5 dfc44b9d11 fix(ui): fit the Power menu's Download mode label
"Download mode (wait for USB flash)" ran past its button. Use the smaller
font for that button and wrap it inside the button, centred on two lines.
The text (and its translations) is unchanged.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-09-24 15:28:50 -04:00
Michael A. CojocariandClaude Opus 5.5 164c6d05d2 fix(backup): exported settings were invalid JSON
396e818 added rx_delay_base, buzzer_quiet, client_repeat, ble_pin and
gps_fuzz_m after the "region_scope": " opening quote had already been
printed, so they landed inside that string and every backup exported
since then failed to import ("bad/unreadable JSON"). Print region_scope
last, opened and closed in one place. Backups made with the broken build
must be exported again.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-09-24 15:28:50 -04:00
Michael A. CojocariandClaude Opus 5.5 5cdbf96cff fix(ui): smaller text and more room above stacked confirm buttons
In the stacked (portrait) confirmation dialog, e.g. the backup Import
prompt, the multi-line message sat hard against the buttons. Use the
smaller body font there and widen the message-to-buttons gap; the card
height follows. Landscape dialogs are unchanged.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-09-24 15:28:50 -04:00
Michael A. CojocariandClaude Opus 5.5 1467184d79 fix(ui): tighter Cmdr info panel; round-panel breadcrumb and status row
Cmdr: the info panel's values column started at a fixed SC(100), leaving
a wide gap after short labels like "Node". Size it from the labels' real
width and draw a thin divider between the two columns.

Round-cornered status bar (T-Display P4):
- The settings/tool breadcrumb moves from row 1 to row 2 so its top is
  level with the battery readout, at row 2's text size instead of the
  tall bar's larger one, and is capped (with an ellipsis) short of the
  status icons it now shares the row with.
- The signal/SD/Wi-Fi/BLE icons start after the widest the battery
  percentage can get ("100%" in its font) instead of a fixed 64 px, so
  they no longer cover it; the charging close-up keeps its old position.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-09-24 15:28:50 -04:00
Michael A. CojocariandClaude Opus 5.5 237a33e68e feat(backup): include screen and app preferences in settings backups
The backup carried node settings but none of the touch UI's own
preferences. Add an "app_settings" block: the active Wi-Fi connection
(SSID, password, radio/BLE switches) and every touch preference key as
["key","type","value"] triples: the packed cfg blob (display, theme,
keyboard, map, UI scale, notifications, advert timers...), sound and
DND settings, tile server, lock wallpaper, notification sounds, quick
replies, channel scopes, favourites, ignore lists, channel mute and
emoji, repeater passwords, the last radio preset and saved Wi-Fi
networks.

Import restores them as section bit 0x20 (the UI's Import now applies
it). Only keys and types this build writes itself are accepted. The cfg
blob is merged field by field and keeps what belongs to the unit:
battery calibration, GPS baud, clock floor, FEM/antenna, the paired BLE
keyboard, remote/console boot modes and beta-report counters. Storage
choice, the setup flag and the discovered-nodes cache are not exported.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-09-24 15:28:50 -04:00
Michael A. CojocariandClaude Opus 5.5 b00deeffd3 fix(ui,backup): 2x2 location-privacy buttons; export the remaining settings
GPS screen: the four location-privacy accuracy buttons sat in one row and
were too narrow for their labels. Lay them out two columns by two rows.

Backup export: the wadamesh_settings block now also carries the
location-privacy radius, BLE pairing PIN, RX delay, buzzer quiet and
client repeat, and import restores them with range checks (the radius
only to the values the UI offers, the PIN to six digits). Every other
NodePrefs field was already exported; identity, radio, position,
channels and contacts are unchanged.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-09-24 15:28:50 -04:00
Michael A. CojocariandClaude Opus 5.5 b60c26ac85 feat(tdisplay-p4): esp-hosted C6 backend for Wi-Fi
Current T-Display P4 V1 units ship the C6 with esp-hosted firmware
(2.12.3), and main's P4 build only spoke ESP-AT, so Wi-Fi could not come
up on them at all. This is a one-time import of the esp-hosted backend

- TDP4_C6_HOSTED build switch (default hosted; WADA_P4_LEGACY_AT=1 keeps
  the ESP-AT path for older units), with the ESP-AT socket/WiFi facades
  and the single-listener TCP router guarded to the legacy build.
- tdisplay_p4: build.sh hosted patches and fullclean handling,
  idf_component.yml esp-hosted pin, sdkconfig, main.cpp hosted bring-up
  and SNTP, c6_at updates, and the C6 reset hook in target.cpp.
- P4 Wi-Fi scan wait in UITask.
- TDISPLAY_P4_C6_FIRMWARE_PLAN.md.

Not imported from that commit: UI-scale default, GPS log lines, UI

build-upload-monitor.sh: run build.sh's own fullclean for the P4 (idf.py
fullclean rejects the patched managed components).

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-09-24 15:28:50 -04:00
Michael A. CojocariandClaude Opus 5.5 4d86f66c39 fix(tdisplay-p4): draw the Remote UI placeholder on the physical panel
In Remote UI mode the UI renders off-screen for the browser and the
physical panel shows a status placeholder drawn through the
DisplayDriver API. On the P4 every fill/text call was an empty stub, and
writePixelsRGB565 takes half-resolution LVGL coordinates and upscales
2x, so only the logo appeared, twice as big and pushed towards the top
right, over whatever was on screen before.

Add P4PanelPainter: native-resolution fills, rectangles and text for
both P4 panels (RM69A10 AMOLED, HI8561 LCD), rasterising LVGL's
Montserrat fonts at the UI's 2x scale, written through a new
non-upscaling writeNativeRGB565. Give the placeholder a layout for the
tall portrait panel: logo, title, browser address or Wi-Fi status, and
the touch-and-hold exit hint, matching the other builds.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-09-24 15:28:04 -04:00
Michael A. CojocariandClaude Opus 5.5 b932c13e34 fix(ui): stack confirm-dialog buttons in portrait
The shared confirmation dialog placed a fixed-width Cancel and OK side by
side, and on portrait panels they overran each other (reported on the
backup Import prompt). In portrait, or whenever the card is too narrow
for both, stack them full width with OK above Cancel, and grow the card
to fit. Landscape layouts are unchanged.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-09-24 15:28:04 -04:00
Michael A. CojocariandClaude Opus 5.5 485436daa2 fix(ui): centre the onboarding welcome message and buttons
The first setup step pinned "Let's set up your device" under the title and
its Skip / Get Started buttons to the bottom edge, leaving a large empty
gap on tall panels like the T-Display P4. Lay them out as one block in the
middle of the screen with centred text, clamped so it never overlaps the
title or drops below the old bottom-edge position on short panels.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-09-24 15:28:04 -04:00
Michael A. CojocariandClaude Opus 5.5 ed9a49c506 scripts: T-Display P4 targets in build-upload-monitor and build-all
build-upload-monitor.sh gains --tdisplay-p4 (AMOLED) and
--tdisplay-p4-lcd (HI8561 LCD SKU). The P4 is an ESP-IDF app, so these
drive tdisplay_p4/build.sh (build/flash/monitor, --erase, --fullclean,
PORT= for the serial port) instead of pio; both appear in the interactive
menu and the --just-build sweep, which skips them when ESP-IDF is absent.
PlatformIO is only required when a PlatformIO board is chosen.

build-all-targets.sh also builds the LCD SKU. Both SKUs share
build/tdisplay_p4 and WADA_P4_LCD is read only at configure time, so each
P4 build reconfigures first; before this, the AMOLED entry rebuilt
whichever panel had been configured last.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-09-24 15:28:04 -04:00
Claude d2ee8cea5f fix(ui): Mentions breadcrumb on the left like every other screen
The Mentions screen drew its own header with the back chevron at the top
right, the only screen whose back breadcrumb was on the right. Use the
shared app-page chrome instead (appPageBegin/appPageEnd, as Send advert,
Spectrum and the settings pages do): "‹ @ Mentions" on the left of the
status bar, tap to go back. The list starts below the tall bar on square
panels. Keeps the existing translated "@  Mentions" key.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01UBQtHzNKA9Q55ogrULN6JJ
2026-09-24 15:28:04 -04:00
Claude fc631be52c fix(tdisplay-p4): GPS baud, nav bar, map chrome, presets, export
- GPS: the P4 listened at 9600 (the L76K power-on default), but LilyGo's
  factory firmware leaves the receiver at 115200, so the UART opened and
  never parsed a sentence. Set GPS_BAUD_RATE=115200 for the P4. A GPS baud
  saved in Settings still overrides it.
- Nav bar: the active-tab bar assumed a full-width tab row. The P4's round
  corners inset the row by SB_INSET_X on each side, leaving the bar ~13 px
  off under the outer tabs. Measure the real button row instead; move the
  unread and update badges in by the same inset.
- Map: with no tiles rendered the canvas shows the COLOR_FIELD
  placeholder, but the chrome followed only the night setting (except on
  the Wio Tracker L2). Pick the chrome colour from the placeholder's
  brightness on every board, and refresh it when tiles appear or vanish.
- Radio & mesh: picking a community preset only filled the fields and a
  dropdown never blurs a field, so nothing was saved; leaving the screen
  lost it. Apply on pick. Also remember the picked preset by label, since
  several presets share identical parameters and the first match
  (e.g. EU/UK instead of Switzerland) was shown on return.
- Export: add a wadamesh_settings block with airtime factor, region
  scope, auto-add rules, advert/telemetry policy, multi-ACKs, GPS and
  RX boosted gain, and restore it on import. The stock-app fields keep
  their exact shape.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-09-24 15:28:04 -04:00
Michael A. Cojocari 2fde038f08 fix(m9): streamline mark-all-read action
Closes #569\n\nCo-Authored-By: GitHub Copilot <noreply@github.com>
2026-09-24 15:16:09 -04:00
Michael A. Cojocari a3090aebbe fix(tdeck-pro): split v1.0 and v1.1 targets 2026-09-23 16:43:29 -04:00
sam cross 23bd6ee571 fix: ignore trackball pan on map when screen is locked or off
The trackball map-panning block in updateTrackball() ran without
checking the lock state, so rolling the trackball while the screen
was locked (or idle-off) moved the underlying map. On unlock the
map would be in a different location. Bail out early when locked,
committing any pending pan first so it doesn't jump on unlock.
Fixes #132.
2026-09-23 17:33:51 +01:00
Michael A. Cojocari 98dd4dadea fix(m9): preserve locked drawer through shortcuts
Keep the app-drawer Home root open beneath Messages, Map, Mentions, and Advert function-key navigation while still dismissing overlays and respecting blocker dialogs.

Fixes #564
2026-09-23 10:34:28 -04:00
Michael A. Cojocari a8067c921b fix(tdeck-pro): separate compact chat messages
Measure the same vertical padding that compact rows render and increase the blank gap between separate messages without changing wrapped-line spacing.

Fixes #563
2026-09-23 10:23:59 -04:00
Michael A. Cojocari 31a6a9798e fix(tdeck-pro): make console readable on e-paper
Use white paper and black ink from the first boot frame, commit sprite-backed input updates, and keep the e-paper cursor solid.

Fixes #562
2026-09-23 10:23:45 -04:00
Kaj SchittecatandClaude Opus 5 c9ecaf383f reports: say how long they ran it, not just a span
The first real report read "works, about a day, 57 min ago" and the two halves
looked like they disagreed. They answer different questions: "about a day" is
how long the tester ran the build, "57 min ago" is when they sent the report.
Now it says "ran it for about a day, reported 57 min ago".

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-09-23 15:58:23 +02:00
228 changed files with 81041 additions and 4063 deletions

No files matched your search

+46 -7
View File
@@ -14,10 +14,11 @@ USB) and the [GitHub releases](https://github.com/ALLFATHER-BV/wadamesh/releases
| Heltec V4 + TFT | ESP32-S3, SX1262 | 2.4" 240x320 touch (CHSC6x) | Web flasher | Stable | Fully supported; Expansion Kit sensors, V4.3 high-gain RX toggle |
| Tanmatsu | ESP32-P4 + ESP32-C6, SX1262 | 4" 800x480, 69-key keyboard (no touch) | Tanmatsu app store on the device (runs under the badge.team launcher, not web-flashable) | Store tracks the test channel | Fully supported; LoRa + Wi-Fi + Bluetooth simultaneously, standalone and companion in one |
| 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 |
| 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 | AMOLED or TFT-LCD, touch | Web flasher (AMOLED) or the .bin for the LCD SKU | Beta (new in beta_45) | Two screen SKUs; fuel-gauge battery reporting, full TX power |
| 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 |
| 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
@@ -33,12 +34,14 @@ USB) and the [GitHub releases](https://github.com/ALLFATHER-BV/wadamesh/releases
this needs [LilyGO keyboard-controller firmware with raw matrix mode](https://github.com/Xinyuan-LilyGO/T-Deck/tree/master/examples/Keyboard_ESP32C3)
(June 2025 or newer). Older controller firmware keeps normal typing and
reports the unavailable latch mode on Serial.
- **T-Deck Pro**: dedicated `LilyGo_TDeck_Pro_companion_radio_touch` development
target for the GDEQ031T10 e-paper model. It uses a monochrome shadow buffer,
coalesced partial refreshes, CST328/CST3530 touch detection and the Pro-specific
TCA8418 matrix. Keyboard events are drained during the panel BUSY interval so
a refresh cannot overflow the controller FIFO. Hardware validation is pending;
see [variants/lilygo_tdeck_pro/PORT.md](variants/lilygo_tdeck_pro/PORT.md).
- **T-Deck Pro**: separate `LilyGo_TDeck_Pro_v1_0_companion_radio_touch` and
`LilyGo_TDeck_Pro_v1_1_companion_radio_touch` targets for the incompatible PCB
revisions. V1.0 has no frontlight and uses GPIO45 for touch reset; V1.1 uses
GPIO45 for its frontlight and GPIO38 for touch reset. Flashing the V1.1 image
onto V1.0 holds touch in reset. Both use the GDEQ031T10 e-paper panel,
CST328/CST3530 touch detection, and the Pro-specific TCA8418 matrix. See
[variants/lilygo_tdeck_pro/PORT.md](variants/lilygo_tdeck_pro/PORT.md) before
choosing a target.
- **T-Deck Max**: `LilyGo_TDeck_Max_companion_radio_touch`. The same e-paper,
keyboard and radio as the Pro, whose display and touch drivers it reuses; the
differences are an XL9555 expander in front of the peripheral power enables and
@@ -79,12 +82,48 @@ USB) and the [GitHub releases](https://github.com/ALLFATHER-BV/wadamesh/releases
validated at boot; if it reports lost integrity, the same optional saved-Wi-Fi
cold-boot sync offered on T-Deck is available in Clock settings. New in beta_38;
report anything that feels off.
- **T-Display P4**: touch UI with the on-screen keyboard. The BOOT button wakes
the screen (or lights the lock screen) and holding it for two seconds locks or
unlocks, as the Wio Tracker L2's wake button does; "Lock when screen off" is
under Settings, Lock screen. The optional clip-on
keyboard expansion can be attached or removed while running and is picked up
within a couple of seconds; while it is on, it types into the focused field
and the on-screen keyboard stays down (tap the field again to bring it up).
Arrows move the caret or the focus highlight, Esc goes back, F1-F5 open the
tabs left to right, F11 steps the keyboard light through off, low, medium and
high (the level is kept across reboots), Caps Lock lights its LEDs,
and Shift, Sym and Alt apply to the next key. Alt+Backspace goes back.
- **RAK WisMesh Tap V2**: newest port, touch-driven. The browser-flash path is
fresh; if the flasher cannot open the serial port, put the board in download
mode manually and retry, and please report it.
- **Seeed Wio Tracker L2**: pre-release touch target under active bring-up. Builds are for
development and hardware validation only; no public release artifact is
promised until the port is verified.
- **CrowPanel Advance 3.5**: `crowpanel_35_companion_radio_touch` is a
16 MB flash / 8 MB OPI PSRAM build for the ILI9488/GT911 panel and an SX1262
in the expansion slot. It starts upright in 480x320 landscape; Display
settings can switch to 320x480 portrait, rotated 180 degrees. The selected
orientation persists across reboots; landscape is only the default when no
saved choice exists.
It uses the same compact font and control sizing as Wio Tracker L2.
Fit the radio before booting. GPIO0 is shared by BOOT and the radio's chip
select, so BOOT is not configured as a wake/unlock input on stock wiring.
Screen-off remains touch-wakeable; hard lock is disabled without a separate
unlock button. See the
[official schematic](https://github.com/Elecrow-RD/CrowPanel-Advance-HMI-ESP32-AI-Display/blob/master/3.5/schematic/ESP32%20Display%203.5%20inch%20V1.0.sch)
and [reference radio pin map](https://github.com/meshtastic/firmware/blob/master/variants/esp32s3/elecrow_panel/variant.h).
An optional external GPS can be connected to UART1 (CrowPanel RX GPIO18 /
TX GPIO17, 9600 baud). Data
can use a FAT32 microSD card for data, offline maps, File Manager and browser
Transfer. The card uses software SPI (SCLK 5, MISO 4, MOSI 6, CS 7), leaving
the display and radio SPI hosts untouched; missing or unreadable cards fall
back to SPIFFS. The dedicated LittleFS partition remains the internal tile
cache. Cards are never auto-formatted; format them on a computer. Serial
uses the board's USB-to-UART bridge. Battery voltage monitoring is not
supported. Display, touch, radio and SD still need validation on a physical
CrowPanel. Like Wio Tracker L2, it is included in the all-target builds and local beta release
scripts, not the two-board stable CI workflow. Select it in the upload
helper with `scripts/build-upload-monitor.sh --crowpanel-35`.
## Requested boards
+6
View File
@@ -91,5 +91,11 @@ driver, variants/tdisplay_p4/P4Audio.cpp)
LovyanGFX (RAK WisMesh Tap V2 display backend)
Copyright (c) lovyan03 — FreeBSD License — https://github.com/lovyan03/LovyanGFX
Camillia-MT (CrowPanel Advance 3.5 software-SPI microSD backend)
Copyright (c) 2025-2026 Michael A. Cojocari and contributors
GNU General Public License v3.0 or later
Adapted from src/sd_soft_spi.cpp; integrated with WadaMesh's filesystem
API and concurrent storage consumers.
This list is not exhaustive and is expanded as dependencies are vendored or
added.
+5 -3
View File
@@ -8,7 +8,7 @@
<p align="center"><b>A real touchscreen UI for your mesh radio.</b> &middot; open source &middot; GPL-3.0</p>
Touch-UI [MeshCore](https://github.com/meshcore-dev/MeshCore) companion-radio
firmware for the **LilyGo T-Deck / T-Deck Plus**, **Heltec V4 + TFT** and eight other boards
firmware for the **LilyGo T-Deck / T-Deck Plus**, **Heltec V4 + TFT** and other boards
(ESP32-S3).
An LVGL touch UI — map, chat, contacts, channels, settings — split out of
@@ -27,8 +27,9 @@ per-board status.
- RAK WisMesh Tap V2 (RAK3312) — env `rak_tap_v2_companion_radio_touch` (beta)
- 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 by default, `WADA_P4_LCD=1` for the TFT-LCD SKU (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)
- 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)
## Architecture
@@ -98,7 +99,8 @@ automatically:
```bash
pio run -e heltec_v4_tft_companion_radio_usb_tcp_touch # Heltec V4 TFT
pio run -e LilyGo_TDeck_companion_radio_touch # LilyGo T-Deck
# or just `pio run` to build both
pio run -e crowpanel_35_companion_radio_touch # CrowPanel Advance 3.5
# or just `pio run` to build the configured default environments
```
Flash with the NVS-preserving 4-component chain (bootloader / partitions /
+11
View File
@@ -3,6 +3,17 @@
These post-flash checks verify the setup-wizard keyboard fallback and CST3530
touch fix on a LilyGo T-Deck Pro 4G.
## Choose the hardware revision
Flash `LilyGo_TDeck_Pro_v1_0_companion_radio_touch` on V1.0 hardware and
`LilyGo_TDeck_Pro_v1_1_companion_radio_touch` on V1.1 hardware. Do not use the
V1.1 image on V1.0: GPIO45 is touch reset on V1.0 but frontlight PWM on V1.1,
so the wrong image can hold the touch controller in reset. V1.0 has no
frontlight; V1.1 identifies a DRV2605 at I2C address `0x5A`.
Run the checks below separately on each available PCB revision and include the
revision and firmware target in the report.
## Boot check
With a 115200-baud serial monitor attached, reboot the device and record this
+412
View File
@@ -0,0 +1,412 @@
# T-Display P4 C6 firmware and Bluetooth plan
## Decision
Use Espressif esp-hosted as the normal WadaMesh backend for current T-Display P4
V1 units, which ship C6 hosted firmware 2.12.3. Retain the existing ESP-AT
backend only for older units carrying LilyGo's now-deprecated AT images.
Older AT units need a guided two-stage conversion because the P4 can reset the
C6 but cannot press its documented physical BOOT control. Current hosted units
need no C6 reflash. After any legacy conversion, C6 firmware updates should be
delivered and verified by the P4 over SDIO so normal WadaMesh updates remain a
one-device operation.
## Goals
- Expose the C6 Bluetooth LE radio to WadaMesh.
- Run the existing MeshCore Bluetooth companion transport without an AT-to-BLE
protocol translation layer.
- Preserve P4 Wi-Fi scanning, station mode, TCP clients, the companion TCP
server, HTTP, SNTP, and simultaneous Wi-Fi/BLE operation.
- Make the one-time C6 conversion understandable from the WadaMesh installer.
- Make every later P4 installation or update automatically enforce a compatible
C6 firmware version.
- Provide A/B update, verification, rollback, and a wired recovery route for the
C6.
- Keep the P4 usable for LoRa and local UI if the C6 is absent or broken.
## Non-goals
- Classic Bluetooth. The ESP32-C6 supports Bluetooth LE only.
- Silently rewriting the factory C6 through undocumented raw flash commands.
- Depending on deprecated factory ESP-AT images for long-term update support.
- Removing the existing AT implementation before the hosted replacement has
equivalent Wi-Fi and socket coverage.
## Current architecture
### Processors
- ESP32-P4: runs WadaMesh, LVGL, LoRa, GPS, storage, and the companion logic.
- ESP32-C6: owns the physical 2.4 GHz Wi-Fi and Bluetooth LE radio.
The P4 itself has no Wi-Fi or Bluetooth radio.
### Current C6 connection
The C6 is connected to the P4 over SDIO slot 1:
| Signal | P4 GPIO |
|---|---:|
| CLK | 18 |
| CMD | 19 |
| D0 | 14 |
| D1 | 15 |
| D2 | 16 |
| D3 | 17 |
C6 enable/reset is `XL9535 IO14`. The P4 can pulse this line but does not have a
connection to the C6 IO9 boot strap.
### Current software generations
- Current V1 factory/release firmware uses esp-hosted MCU 2.12.3. WadaMesh uses
the matching local host fork (`2.12.3~1`) and standard remote Wi-Fi/NimBLE
paths.
- Older V1 units may carry LilyGo's deprecated ESP-AT SDIO firmware.
- `tdisplay_p4/components/c6_at/` and `C6WifiShim.h` remain as an explicit
`WADA_P4_LEGACY_AT=1` compatibility backend for those units.
- Legacy AT Wi-Fi scans, joins, sockets, server mode, and SNTP are implemented
in that worker. Its BLE commands cannot reliably expose the MeshCore service.
- `AT+CIUPDATE` and `AT+USEROTA` are unavailable on the tested legacy image.
- `C6_FLASH_HELPER=1 ./tdisplay_p4/build.sh build` creates a P4 image that does
not reset or start the C6. It is useful for development while the C6 is placed
in ROM download mode and flashed through its own USB connection.
### P4 flash layout
The current 16 MB P4 layout contains:
- 4 MB `ota_0`
- 4 MB `ota_1`
- approximately 8 MB FAT `storage`
- NVS, OTA metadata, PHY data, and coredump partitions
The P4 application currently has less than 1 MB free in each app slot. A full C6
image should therefore not be linked into the P4 application. If offline C6
updates are required, reserve a dedicated data partition by reducing the FAT
partition after measuring the final C6 image size.
## Target architecture
### C6 firmware: `wadamesh-c6`
Create a separately versioned ESP-IDF project for the ESP32-C6. Start from the
same esp-hosted slave generation already proven by the Tanmatsu target.
Required C6 features:
- esp-hosted SDIO slave transport
- Wi-Fi station and scan support
- Bluetooth LE HCI transport for NimBLE on the P4
- a small management endpoint for firmware identity and updates
- A/B application partitions with rollback
- signed-image verification
- watchdog and boot-health reporting
- a stable protocol version independent of the human firmware version
The C6 firmware should not implement the MeshCore GATT service itself. It should
transport Bluetooth HCI to the P4, allowing the existing P4-side NimBLE and
MeshCore `SerialBLEInterface` code to own advertising, pairing, GATT, and packet
routing. This keeps one MeshCore BLE implementation across boards.
### Management protocol
Add a narrow WadaMesh management channel alongside the hosted data path. It must
support at least:
- `GET_INFO`: protocol version, firmware version, build hash, active OTA slot,
rollback state, and capabilities
- `BEGIN_UPDATE`: image size, version, SHA-256, and signature metadata
- `WRITE_CHUNK`: offset, bytes, and per-chunk integrity check
- `END_UPDATE`: full hash/signature verification and boot-slot selection
- `REBOOT`: restart into the pending slot
- `CONFIRM_BOOT`: mark the new C6 image valid after host-side health checks
- `ABORT_UPDATE`: discard a partial update
Commands need sequence numbers and idempotent replies so a P4 reset or SDIO
retry cannot corrupt the inactive slot.
### P4 host changes
Introduce one explicit C6 backend boundary instead of allowing both transports
to initialize:
- `C6_BACKEND_AT`: existing factory ESP-AT support, retained for migration and
recovery builds
- `C6_BACKEND_HOSTED`: production backend after conversion
For the hosted backend:
- stop compiling or hard-stubbing the duplicate hosted implementations
- use exactly one esp-hosted component, following the Tanmatsu collision fix
- route Wi-Fi through `esp_wifi_remote` and the standard Arduino Wi-Fi facade
- route Bluetooth HCI into NimBLE
- enable the existing MeshCore BLE companion interface
- expose real Bluetooth capability to the UI
- keep C6 reset under the XL9535 callback rather than a fake host GPIO
- leave LoRa/UI startup independent from hosted initialization success
The host must query `GET_INFO` before enabling Wi-Fi or Bluetooth. An unsupported
protocol should produce a clear Settings/About diagnostic and keep the rest of
WadaMesh operational.
## First-time conversion
### Why it cannot currently be one P4 flash
The factory C6 has no working self-update command, and the P4 cannot force C6
IO9 low to enter the ROM downloader. A P4 image cannot safely replace the first
C6 firmware through the current wiring.
`AT+SYSFLASH` or other undocumented raw-partition writes must not be used for the
public migration unless a sacrificial-device test proves all of the following:
- the required C6 partitions can be written while ESP-AT is running
- bootloader, partition table, OTA metadata, and app offsets are known
- power loss cannot leave the C6 unrecoverable without opening the device
- image verification and rollback are available
Until then, use the C6 USB downloader.
### Guided web installer
Extend the WadaMesh install page with a P4-specific two-stage flow:
1. **Install C6 radio firmware**
- Explain which USB connector reaches the C6.
- Explain the required BOOT/IO9 and reset sequence with board photographs.
- Launch an ESP Web Tools manifest with `chipFamily: ESP32-C6`.
- Flash a full merged `wadamesh-c6` image containing bootloader, partition
table, OTA metadata, and app.
- Verify the chip and image before showing success.
2. **Install WadaMesh P4 firmware**
- Move the cable to the P4 USB connector.
- Launch the existing `ESP32-P4` WadaMesh manifest.
- On first boot, require the expected C6 protocol handshake and show the
detected C6 version in About/Diagnostics.
The page should remember only browser-local completion state. The device
handshake remains authoritative.
### Development flow
Use the existing helper for early testing:
```bash
C6_FLASH_HELPER=1 ./tdisplay_p4/build.sh build
./tdisplay_p4/build.sh flash -p <P4-port>
```
Then place the C6 in ROM download mode and flash `wadamesh-c6` through the C6
USB port. After the C6 image is installed, flash a normal hosted-backend P4
build.
Document a full factory-image backup and restore command before the first C6
write.
## Future seamless C6 updates
Once `wadamesh-c6` is installed, subsequent updates should not require the C6
USB connector.
### Image delivery
Preferred production path:
- publish immutable, versioned C6 OTA images beside each P4 release
- include required C6 protocol/version metadata in the P4 release manifest
- let the P4 download the C6 image over its working C6 Wi-Fi connection
- stream directly into the C6 inactive OTA slot over the management channel
Offline/full-install option:
- add a dedicated P4 `c6_fw` data partition
- place the matching C6 OTA image there in the full merged P4 artifact
- reduce the P4 FAT storage partition by the measured partition size
- do not embed the image in either 4 MB P4 application slot
The online path should remain available for P4 OTA updates where the full flash
image and data partition are not rewritten.
### Update state machine
1. P4 reads C6 identity and compatibility.
2. If compatible, continue boot without rewriting anything.
3. If an update is required, keep Wi-Fi/BLE user transports disabled.
4. Select the C6 inactive OTA slot.
5. Stream chunks with retries and a visible progress state.
6. Verify SHA-256 and signature on the C6.
7. Mark the inactive slot pending and reboot only the C6.
8. Re-establish SDIO and run health checks:
- management handshake
- Wi-Fi scan
- Wi-Fi join where credentials exist
- BLE controller initialization
- BLE advertising start
9. Confirm the C6 slot only after health checks pass.
10. If the handshake does not recover, reset the C6 and allow its bootloader
rollback. Keep the P4 UI and LoRa available with a recovery message.
Never update both P4 and C6 active slots without an independently recoverable
checkpoint between them.
## Release pipeline
Add a dedicated C6 build/release surface rather than hiding it inside the P4
build script:
```text
tdisplay_p4/c6_firmware/
CMakeLists.txt
sdkconfig.defaults
partitions.csv
main/
build.sh
```
Release artifacts:
- `wadamesh-c6-full.bin`: first-time USB conversion
- `wadamesh-c6-ota.bin`: later in-band update
- `manifest-tdisplay-p4-c6.json`: ESP Web Tools C6 manifest
- `c6-version.json`: protocol, firmware version, hash, signature, minimum P4
version, and release channel
Update these existing surfaces:
- `scripts/build-all-targets.sh`: build the C6 project in IDF sweeps
- `scripts/release.sh`: stage C6 artifacts with the P4 release
- `scripts/build/gen-flasher-meta.py`: create the ESP32-C6 manifest
- `deploy/site/index.html`: guided two-stage P4 install
- P4 About/Diagnostics: show C6 backend, protocol, firmware, active slot, and
last update result
A release gate should reject a P4 build whose required C6 protocol is not
present in the staged C6 metadata.
## Security and integrity
- Sign C6 images with a WadaMesh release key.
- Verify the signature on the C6 before selecting the pending slot.
- Pin the expected SHA-256 in release metadata and report it in diagnostics.
- Reject downgrade unless a physical recovery flow explicitly requests it.
- Do not carry Wi-Fi credentials inside C6 update images.
- Clear partial-update state after abort or rollback.
- Rate-limit and authenticate update commands so a network client cannot invoke
the management endpoint.
Secure Boot and flash encryption should be evaluated for both processors as a
separate rollout because enabling eFuses changes recovery procedures.
## Compatibility and fallback
During migration, a P4 build should detect three states:
| State | Behavior |
|---|---|
| Factory ESP-AT | Keep AT Wi-Fi available, report Bluetooth unavailable, offer C6 conversion instructions |
| Supported hosted protocol | Enable Wi-Fi and Bluetooth normally |
| Unknown/unresponsive C6 | Keep LoRa/UI running, disable wireless transports, expose diagnostics and wired recovery |
Do not infer the backend from one failed packet. Use a bounded handshake, reset
once through XL9535 IO14, then classify the C6.
## Test plan
### C6 unit/integration
- version/capability handshake
- chunk replay, duplication, and out-of-order rejection
- full hash and signature failure
- power loss at each update stage
- pending-slot rollback
- management request timeout and retry
### Wi-Fi
- scan in sparse and dense RF environments
- hidden SSIDs
- open, WPA2, WPA3, and wrong-password behavior
- reconnect after C6 reset
- TCP client and inbound companion server
- HTTP downloads, tiles, OTA, and SNTP
### Bluetooth LE
- advertising name and MeshCore service UUID
- Android and iOS discovery
- connect/disconnect/reconnect
- bidirectional MeshCore packet transport
- MTU negotiation and fragmented writes
- simultaneous Wi-Fi traffic
- BLE availability after P4 and C6 independent resets
### System
- LoRa receive/transmit while Wi-Fi and BLE are active
- SD card and C6 sharing separate SDMMC hosts
- display underrun/flicker during C6 update and heavy traffic
- screen-off and wake behavior
- low-memory operation
- C6 absent, factory, supported, outdated, and corrupt states
- P4 OTA with matching and mismatched C6 versions
- first-time web installation on macOS, Windows, Linux, Android Chrome, and
ChromeOS where supported
## Rollout phases
### Phase 0: preserve and measure
- Back up the complete factory C6 flash.
- Record chip revision, flash size, partition table, MAC addresses, and USB IDs.
- Confirm the C6 USB/BOOT procedure on at least two boards.
- Capture current AT Wi-Fi performance as a regression baseline.
### Phase 1: hosted proof of life
- Build and manually flash the smallest esp-hosted C6 slave.
- Establish the SDIO handshake from P4.
- Validate Wi-Fi scan/join and Bluetooth controller discovery.
- Keep the existing AT build selectable for recovery.
### Phase 2: transport parity
- Port every P4 Wi-Fi/socket use away from `c6_at`.
- Enable the existing MeshCore BLE companion transport.
- Pass Wi-Fi, BLE, TCP server, OTA, tile, and time-sync tests.
### Phase 3: public first-time installer
- Publish signed full C6 artifacts and an ESP32-C6 web manifest.
- Add the two-stage installer UI and connector/BOOT instructions.
- Add backend/version diagnostics to P4.
### Phase 4: in-band updates
- Implement C6 A/B management protocol and host updater.
- Add online C6 artifact delivery.
- Add an optional offline P4 `c6_fw` partition after measuring image size.
- Exercise interruption and rollback tests before enabling automatic updates.
### Phase 5: default hosted backend
- Make hosted the normal P4 release backend.
- Retain an explicit AT recovery build for at least one stable release cycle.
- Remove temporary ESP-AT GATT provisioning only after migration coverage is
acceptable.
## Acceptance criteria
The migration is complete when:
- a fresh user can follow one WadaMesh page to flash both chips without command
line tools
- normal later WadaMesh updates need only the P4 connection or on-device OTA
- About reports compatible P4 and C6 versions
- Wi-Fi feature parity is maintained
- the MeshCore phone app can discover, connect, exchange packets, and reconnect
over Bluetooth LE
- failed or interrupted C6 updates roll back without losing P4 LoRa/UI access
- a documented wired restore path returns the C6 to a known image
+45
View File
@@ -0,0 +1,45 @@
{
"build": {
"arduino": {
"ldscript": "esp32s3_out.ld",
"partitions": "default_16MB.csv",
"memory_type": "qio_opi"
},
"core": "esp32",
"extra_flags": [
"-DBOARD_HAS_PSRAM",
"-DARDUINO_USB_CDC_ON_BOOT=0",
"-DARDUINO_USB_MODE=1",
"-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", "gps"],
"debug": {
"default_tool": "esp-builtin",
"onboard_tools": ["esp-builtin"],
"openocd_target": "esp32s3.cfg"
},
"frameworks": [
"arduino",
"espidf"
],
"name": "Elecrow CrowPanel Advance 3.5 (N16R8)",
"upload": {
"flash_size": "16MB",
"maximum_ram_size": 327680,
"maximum_size": 16777216,
"use_1200bps_touch": false,
"wait_for_upload_port": false,
"require_upload_port": true,
"speed": 921600
},
"url": "https://www.elecrow.com/",
"vendor": "Elecrow"
}
+34
View File
@@ -18,6 +18,19 @@
"ver": "1.0",
"desc": "The classic, in Lua. Swipe to steer."
},
{
"id": "tetris",
"name": "Tetris",
"ver": "1.0",
"desc": "The classic falling-block puzzle. Swipe left/right to move, up to rotate, down to hard-drop. Contributed by samuelcoustet."
},
{
"id": "protreck",
"name": "ProTreck",
"ver": "1.0",
"desc": "Outdoor watch: sunrise/sunset + moon phase (ASTRO), chronometer with laps (CHRONO), countdown timer with alarm (TIMER), altimeter with trend graph (ALTI). Swipe left/right to switch modes. Contributed by samuelcoustet.",
"seed": false
},
{
"id": "sdktest",
"name": "SDK Test",
@@ -58,6 +71,27 @@
"desc": "Finds and removes Windows malware on the SD card, like the M9 worm.",
"requires": "sd",
"seed": false
},
{
"id": "tripodometer",
"name": "Trip Odometer",
"ver": "1.0",
"desc": "GPS trip computer: distance, time, speed, altitude. Start/Stop to track, Reset to clear. Saves your trip across restarts. Contributed by samuelcoustet.",
"requires": "gps",
"seed": false
},
{
"id": "breakout",
"name": "Breakout",
"ver": "1.0",
"desc": "Classic brick-breaker. Swipe left/right to move the paddle, swipe up to launch the ball. Clear all bricks to advance levels. Contributed by samuelcoustet."
},
{
"id": "ping",
"name": "Ping",
"ver": "1.0",
"desc": "Send a mesh DM ping to any contact and measure round-trip time. Includes your GPS position so both sides see distance and bearing. Auto-replies to incoming pings. Contributed by samuelcoustet.",
"requires": "sdk_ext"
}
]
}
+1
View File
@@ -0,0 +1 @@
{"id":"breakout","name":"Breakout","ver":"1.0","desc":"Classic brick-breaker. Swipe left/right to move the paddle, swipe up to launch the ball. Clear all bricks to advance levels. Contributed by samuelcoustet."}
+188
View File
@@ -0,0 +1,188 @@
-- Breakout — wadamesh Lua app
-- Swipe left/right to move paddle | Swipe up to launch
-- Keyboard: arrows to move, Enter / Space to launch
-- Contributed by samuelcoustet
local ui, sys, store, timer = wada.ui, wada.sys, wada.store, wada.timer
local C = ui.colors
local app = {}
local COLS_B, ROWS_B = 8, 5
local BRICK_H, BRICK_GAP = 10, 2
local PADDLE_H, PADDLE_W = 7, 44
local BALL_R = 5
local TOP_H = 18 -- score strip height
local PAD_OFF = 22 -- paddle distance from bottom
local COLORS = { 0xff3355, 0xff7722, 0xffdd33, 0x22cc77, 0x3399ff }
local PTS = { 7, 5, 4, 3, 1 }
local cv, W, H, brick_w
local bricks, n_alive
local bx, by, bdx, bdy, speed
local paddle_x
local score, hiscore, lives, level
local launched, over
local function bk_x(c) return BRICK_GAP + (c-1)*(brick_w + BRICK_GAP) end
local function bk_y(r) return TOP_H + 4 + (r-1)*(BRICK_H + BRICK_GAP) end
local function pad_y() return H - PAD_OFF end
local function new_bricks()
bricks = {}; n_alive = 0
for r = 1, ROWS_B do
bricks[r] = {}
for c = 1, COLS_B do bricks[r][c] = true; n_alive = n_alive + 1 end
end
end
local function reset_ball()
launched = false
bx = paddle_x
by = pad_y() - BALL_R - 1
bdx = 0; bdy = 0
end
local function launch_ball()
local a = sys.random(-40, 40) * math.pi / 180.0
bdx = speed * math.sin(a)
bdy = -speed * math.cos(a)
launched = true
end
local function draw_all()
cv:fill(0x0a0e14)
cv:text(6, 3, string.format("Score:%d Best:%d Lv:%d", score, hiscore, level), C.text, 11)
for i = 1, lives do
cv:circle(W - 6 - (i-1)*13, TOP_H // 2, 4, C.good, true)
end
for r = 1, ROWS_B do
for c = 1, COLS_B do
if bricks[r][c] then
cv:rect(bk_x(c), bk_y(r), brick_w, BRICK_H, COLORS[r], true, 2)
end
end
end
cv:rect(paddle_x - PADDLE_W // 2, pad_y(), PADDLE_W, PADDLE_H, C.accent, true, 3)
cv:circle(math.floor(bx), math.floor(by), BALL_R, 0xffffff, true)
if not launched and not over then
cv:text(W // 2 - 40, pad_y() - 20, "swipe up to launch", C.sub, 11)
end
if over then
cv:rect(W // 2 - 62, H // 2 - 22, 124, 44, 0x141a22, true, 6)
cv:text(W // 2 - 44, H // 2 - 14, "GAME OVER", C.bad, 14)
cv:text(W // 2 - 34, H // 2 + 4, "tap to restart", C.sub, 11)
end
end
local function check_bricks()
for r = 1, ROWS_B do
for c = 1, COLS_B do
if bricks[r][c] then
local x1, y1 = bk_x(c), bk_y(r)
local ox = math.min(bx + BALL_R - x1, x1 + brick_w - (bx - BALL_R))
local oy = math.min(by + BALL_R - y1, y1 + BRICK_H - (by - BALL_R))
if ox > 0 and oy > 0 then
bricks[r][c] = false; n_alive = n_alive - 1
score = score + PTS[r] * level
if ox < oy then bdx = -bdx else bdy = -bdy end
return
end
end
end
end
end
local function step()
if over or not launched then return end
bx = bx + bdx
by = by + bdy
-- walls
if bx - BALL_R < 0 then bx = BALL_R; bdx = math.abs(bdx) end
if bx + BALL_R > W then bx = W - BALL_R; bdx = -math.abs(bdx) end
if by - BALL_R < TOP_H then by = TOP_H + BALL_R; bdy = math.abs(bdy) end
-- paddle
local py = pad_y()
if bdy > 0 and by + BALL_R >= py and by + BALL_R <= py + PADDLE_H + speed + 1 then
local half = PADDLE_W * 0.5
if bx >= paddle_x - half - BALL_R and bx <= paddle_x + half + BALL_R then
local rel = math.max(-1.0, math.min(1.0, (bx - paddle_x) / half))
bdx = speed * rel * 0.8
local sq = speed * speed - bdx * bdx
bdy = -(sq > 0 and math.sqrt(sq) or speed * 0.5)
by = py - BALL_R - 1.0
end
end
-- bricks
check_bricks()
-- ball lost
if by - BALL_R > H + 10 then
lives = lives - 1
if lives <= 0 then
if score > hiscore then hiscore = score; store.set("hiscore", hiscore) end
over = true; launched = false; return
end
paddle_x = W // 2; reset_ball()
end
-- level won
if n_alive == 0 then
level = level + 1
speed = math.min(speed + 0.6, 9.0)
new_bricks(); reset_ball()
end
end
local function move_paddle(dx)
paddle_x = math.max(PADDLE_W // 2 + 2, math.min(W - PADDLE_W // 2 - 2, paddle_x + dx))
if not launched then bx = paddle_x end
draw_all()
end
function app.on_open(w, h)
W, H = w, h
hiscore = store.get("hiscore", 0)
brick_w = math.floor((W - (COLS_B + 1) * BRICK_GAP) / COLS_B)
cv = ui.canvas(W, H); cv:pos(0, 0)
score = 0; lives = 3; level = 1; speed = 3.5; over = false
paddle_x = W // 2
new_bricks(); reset_ball()
draw_all()
timer.every(33)
end
function app.on_input(ev)
if over then
if ev.type == "down" or (ev.type == "key" and ev.key == "enter") then
over = false; score = 0; lives = 3; level = 1; speed = 3.5
paddle_x = W // 2; new_bricks(); reset_ball(); draw_all()
end
return
end
if ev.type == "swipe" then
local d = ev.dir
if d == "left" then move_paddle(-32)
elseif d == "right" then move_paddle( 32)
elseif d == "up" and not launched then launch_ball(); draw_all()
end
elseif ev.type == "key" then
local k = ev.key
if k == "left" then move_paddle(-20)
elseif k == "right" then move_paddle( 20)
elseif (k == "up" or k == "enter" or k == " ") and not launched then
launch_ball(); draw_all()
end
elseif ev.type == "down" then
if ev.x < W // 3 then move_paddle(-32)
elseif ev.x > (W * 2) // 3 then move_paddle( 32)
elseif not launched then launch_ball(); draw_all()
end
end
end
function app.on_tick(dt)
step(); draw_all()
end
function app.on_close() end
return app
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
+237 -1
View File
@@ -1,7 +1,7 @@
# wadamesh language file
# canonical source - translators: edit this file and PR it
# code: bg
# ver: 22
# ver: 23
# name: Български
# base: bg
(device behind) (устройството изостава)
@@ -34,9 +34,14 @@ Accent popups: off Изскачащи акценти: изкл
Accent popups: on Изскачащи акценти: вкл
Accent colour Акцентен цвят
Appearance Изглед
Condense Nav (restart to apply) Компактна навигация (рестарт за прилагане)
Condense Nav saved — restart to apply Компактната навигация е запазена — рестарт за прилагане
Day Ден
High contrast Висок контраст
High contrast - restarting to apply it… Висок контраст - рестартиране за прилагане…
Keyboard nav: on Клавиатурна навиг.: вкл.
Landscape only Само в хоризонтална ориентация
Letters move the highlight when no text field is focused. Enter selects; hold Backspace to go back. Буквите местят маркера, когато няма активно текстово поле. Enter избира; задръжте Backspace за назад.
Night Нощ
Theme save failed Неуспешно запазване на темата
Ack Ack
@@ -1282,3 +1287,234 @@ No known Windows malware found. No known Windows malware found.
This firmware can find these but not remove them. Update wadamesh, or format the card: in Files, hold the SD card row. This firmware can find these but not remove them. Update wadamesh, or format the card: in Files, hold the SD card row.
SD Scan only removes files it recognises. If the card may be infected, the safest fix is to copy off what you need and format it completely: in Files, hold the SD card row. SD Scan only removes files it recognises. If the card may be infected, the safest fix is to copy off what you need and format it completely: in Files, hold the SD card row.
and %d more and %d more
# beta_89: new strings, English placeholders until translated (value = key)
%d nodes heard today %d nodes heard today
%lu packets heard %lu packets heard
1 node heard today 1 node heard today
1 packet heard 1 packet heard
1. Connect this device to the computer with a USB cable.\n2. Open this address in Chrome or Edge: 1. Connect this device to the computer with a USB cable.\n2. Open this address in Chrome or Edge:
3. Click Connect and choose this device. 3. Click Connect and choose this device.
4 numbers or letters 4 numbers or letters
A day A day
A week A week
Add a channel Add a channel
Add, download or delete files on this device from a computer. Add, download or delete files on this device from a computer.
Advertise Advertise
Always on when connected to power Always on when connected to power
Anything worth saying (optional) Anything worth saying (optional)
App drawer App drawer
App icons App icons
Append timestamp Append timestamp
Apr Apr
April April
Asks for 4 numbers or letters to unlock, and locks whenever the screen goes off. If you forget it, the only way back in is to reset the device, which erases everything on it. Asks for 4 numbers or letters to unlock, and locks whenever the screen goes off. If you forget it, the only way back in is to reset the device, which erases everything on it.
Aug Aug
August August
Blocked Blocked
Change PIN Change PIN
Channel Channel
Channels Channels
Chat Chat
Chat icon reset Chat icon reset
Chats Chats
Choose a PIN Choose a PIN
Clock not set Clock not set
Cmdr Cmdr
Commander Commander
Companion Companion
Connected to the computer Connected to the computer
Could not send the report. Try again later. Could not send the report. Try again later.
Count this device Count this device
Current PIN Current PIN
Cursor Cursor
Dec Dec
December December
Delete this conversation? Delete this conversation?
Device id Device id
Direct Direct
Direct message Direct message
Direct, no repeaters Direct, no repeaters
Discover Discover
Double-tap SPACE while typing to switch Double-tap SPACE while typing to switch
Emoji Emoji
Enter PIN Enter PIN
Enter it again Enter it again
Export Backup Export Backup
Feb Feb
February February
Fri Fri
Friday Friday
Has a problem Has a problem
Heard by %u repeaters Heard by %u repeaters
Heard by 1 repeater Heard by 1 repeater
Hold the trackball to switch Hold the trackball to switch
Home button opens Home button opens
I hit a problem I hit a problem
I understand I understand
If you forget your PIN, you have to reset the device If you forget your PIN, you have to reset the device
Internal Internal
It is the only way back in, and it erases everything on it: contacts, channels, messages and settings. Nobody can unlock it for you. It is the only way back in, and it erases everything on it: contacts, channels, messages and settings. Nobody can unlock it for you.
Jan Jan
January January
Join # channel Join # channel
Join Public channel Join Public channel
Jul Jul
July July
Jun Jun
June June
Keyboard and input Keyboard and input
Keyboard attached.\nRestarting in landscape in %d s. Keyboard attached.\nRestarting in landscape in %d s.
Large Large
Launcher Launcher
Launcher layout Launcher layout
Locks when screen off\n(hold the BOOT button to unlock) Locks when screen off\n(hold the BOOT button to unlock)
Map and GPS Map and GPS
Map tiles Map tiles
Mar Mar
March March
Mark all as read Mark all as read
May May
Mentions Mentions
Mentions muted Mentions muted
Mentions unmuted Mentions unmuted
Mesh · 24 h Mesh · 24 h
Message %s Message %s
Message text on lock screen Message text on lock screen
Messages muted Messages muted
Messages unmuted Messages unmuted
Minutes Minutes
Mon Mon
Monday Monday
Mute mentions Mute mentions
Mute messages Mute messages
Navigate Navigate
Never Never
New PIN New PIN
No backups available to restore. No backups available to restore.
No backups yet. Use Export Backup above to create one. No backups yet. Use Export Backup above to create one.
No channels yet No channels yet
No direct chats yet No direct chats yet
Normal\nLarge text\nHuge text Normal\nLarge text\nHuge text
Not delivered, tap to resend Not delivered, tap to resend
Nov Nov
November November
Oct Oct
October October
On On
On battery, show it for On battery, show it for
PIN changed PIN changed
PIN lock PIN lock
PIN lock off PIN lock off
PIN lock on PIN lock on
Phone-app link Phone-app link
Pick the numbers, or type the PIN Pick the numbers, or type the PIN
Preview screensaver Preview screensaver
Radio and messaging Radio and messaging
Reboot Now Reboot Now
Received %s Received %s
Receiving %s Receiving %s
Region not saved: use a-z, 0-9 and - Region not saved: use a-z, 0-9 and -
Remote Remote
Repeater Repeater
Report a bug Report a bug
Reset chat icon Reset chat icon
Room Room
Routed Routed
Running it for Running it for
Running it for: Running it for:
SD card SD card
SD unavailable - insert a FAT32 card and retry SD unavailable - insert a FAT32 card and retry
Sat Sat
Saturday Saturday
Say whether this build works on your board, so a stable release is promoted on evidence rather than on nobody having complained. A bug report opens as a QR: scan it and file it from your phone, under your own GitHub account. Say whether this build works on your board, so a stable release is promoted on evidence rather than on nobody having complained. A bug report opens as a QR: scan it and file it from your phone, under your own GitHub account.
Screen timeout Screen timeout
Screensaver Screensaver
Scroll Scroll
Scroll moves the screen; Cursor points and clicks; Navigate (experimental) moves a selection. Hold the trackball to switch between Scroll and Cursor. Scroll moves the screen; Cursor points and clicks; Navigate (experimental) moves a selection. Hold the trackball to switch between Scroll and Cursor.
Send Send
Send a test report Send a test report
Send another test report Send another test report
Sending %s Sending %s
Sending your report... Sending your report...
Sensor Sensor
Sep Sep
September September
Share my contact Share my contact
Spectrum Spectrum
Stop USB Files Stop USB Files
Storage and SD Storage and SD
Sun Sun
Sunday Sunday
Tap the EN key on the keyboard to switch Tap the EN key on the keyboard to switch
Tells the matrix how many devices run this build, so a board with no reports can be told apart from a board nobody owns. Sends the board and the version, nothing else. Tells the matrix how many devices run this build, so a board with no reports can be told apart from a board nobody owns. Sends the board and the version, nothing else.
Terminal Terminal
Test report: %s Test report: %s
Thank you. Your report is on wadamesh.com/beta Thank you. Your report is on wadamesh.com/beta
The PINs did not match The PINs did not match
The mesh around you instead of a dark screen. Every ring is a real packet. The mesh around you instead of a dark screen. Every ring is a real packet.
This is everything that leaves the device. No name, no contacts, no position. This is everything that leaves the device. No name, no contacts, no position.
Thu Thu
Thursday Thursday
Tick only what you actually used: Tick only what you actually used:
Too many chat icons Too many chat icons
Too many tries. Wait %u s Too many tries. Wait %u s
Trackball Trackball
Trackball: scroll Trackball: scroll
Transfer Transfer
Tue Tue
Tuesday Tuesday
Turn Wi-Fi on to send a report Turn Wi-Fi on to send a report
Type 4 numbers or letters Type 4 numbers or letters
USB Files USB Files
USB Files: low memory USB Files: low memory
Unmute mentions Unmute mentions
Unmute messages Unmute messages
Upload of %s stopped Upload of %s stopped
Used Used
VNC VNC
Waiting for the computer Waiting for the computer
Web Web
Wed Wed
Wednesday Wednesday
While this screen is open, the companion app cannot use USB. While this screen is open, the companion app cannot use USB.
Works Works
Wrong PIN Wrong PIN
You: You:
a week or more a week or more
about a day about a day
heard %s ago heard %s ago
hold the BOOT button to unlock hold the BOOT button to unlock
hop away hop away
hops away hops away
minutes minutes
new new
node node
nodes nodes
now now
routed routed
# Theme page and colour looks: new strings, English placeholders until translated (value = key)
A colour for every section, coloured status icons, names and glyphs in their own hue. A colour for every section, coloured status icons, names and glyphs in their own hue.
Apply and restart Apply and restart
Applying the theme, restarting… Applying the theme, restarting…
Bubbles in colour Bubbles in colour
Bubbles plain Bubbles plain
Chat icons Chat icons
Colourful bubbles Colourful bubbles
Custom Custom
Every app and page its own colour, with a little motion. Every app and page its own colour, with a little motion.
Black and white with heavy outlines, for bright sun or low vision. Black and white with heavy outlines, for bright sun or low vision.
Glyphs Glyphs
High contrast keeps its own fixed colours. High contrast keeps its own fixed colours.
Initials Initials
MORE COLORS! MORE COLORS!
Mode Mode
Names are always in colour; this colours the bubbles too. Names are always in colour; this colours the bubbles too.
Neon Neon
On my way On my way
Pastel Pastel
Preview Preview
Rainbow Rainbow
Regular Regular
Ridge at six? Ridge at six?
Taste the rainbow Taste the rainbow
Use this colour Use this colour
+231 -1
View File
@@ -1,7 +1,7 @@
# wadamesh language file
# canonical source - translators: edit this file and PR it
# code: cs
# ver: 22
# ver: 23
# name: Čeština
# base: cs
(device behind) (zařízení za)
@@ -34,7 +34,12 @@ Accent popups: off Vyskakovací okna akcentu: vypnuto
Accent popups: on Vyskakovací okna akcentu: zapnuto
Accent colour Barva akcentu
Appearance Vzhled
Condense Nav (restart to apply) Kompaktní navigace (pro použití restartujte)
Condense Nav saved — restart to apply Kompaktní navigace uložena — pro použití restartujte
Day Den
Keyboard nav: on Navigace klávesnicí: zapnuta
Landscape only Pouze na šířku
Letters move the highlight when no text field is focused. Enter selects; hold Backspace to go back. Písmena posouvají zvýraznění, když není aktivní textové pole. Enter vybírá; podržením Backspace se vrátíte zpět.
Night Noc
Theme save failed Uložení motivu selhalo
Ack Potvrzení
@@ -1304,3 +1309,228 @@ Snake Snake
held by held by
© OpenStreetMap © OpenStreetMap
© OpenTopoMap © OpenTopoMap
# beta_89: new strings, English placeholders until translated (value = key)
%d nodes heard today %d nodes heard today
%lu packets heard %lu packets heard
1 node heard today 1 node heard today
1 packet heard 1 packet heard
1. Connect this device to the computer with a USB cable.\n2. Open this address in Chrome or Edge: 1. Connect this device to the computer with a USB cable.\n2. Open this address in Chrome or Edge:
3. Click Connect and choose this device. 3. Click Connect and choose this device.
4 numbers or letters 4 numbers or letters
A day A day
A week A week
Add a channel Add a channel
Add, download or delete files on this device from a computer. Add, download or delete files on this device from a computer.
Advertise Advertise
Always on when connected to power Always on when connected to power
Anything worth saying (optional) Anything worth saying (optional)
App drawer App drawer
App icons App icons
Append timestamp Append timestamp
Apr Apr
April April
Asks for 4 numbers or letters to unlock, and locks whenever the screen goes off. If you forget it, the only way back in is to reset the device, which erases everything on it. Asks for 4 numbers or letters to unlock, and locks whenever the screen goes off. If you forget it, the only way back in is to reset the device, which erases everything on it.
Aug Aug
August August
Blocked Blocked
Change PIN Change PIN
Channel Channel
Channels Channels
Chat icon reset Chat icon reset
Chats Chats
Choose a PIN Choose a PIN
Clock not set Clock not set
Cmdr Cmdr
Commander Commander
Companion Companion
Connected to the computer Connected to the computer
Could not send the report. Try again later. Could not send the report. Try again later.
Count this device Count this device
Current PIN Current PIN
Cursor Cursor
Dec Dec
December December
Delete this conversation? Delete this conversation?
Device id Device id
Direct Direct
Direct message Direct message
Direct, no repeaters Direct, no repeaters
Double-tap SPACE while typing to switch Double-tap SPACE while typing to switch
Emoji Emoji
Enter PIN Enter PIN
Enter it again Enter it again
Export Backup Export Backup
Feb Feb
February February
Fri Fri
Friday Friday
Has a problem Has a problem
Heard by %u repeaters Heard by %u repeaters
Heard by 1 repeater Heard by 1 repeater
Hold the trackball to switch Hold the trackball to switch
Home button opens Home button opens
I hit a problem I hit a problem
I understand I understand
If you forget your PIN, you have to reset the device If you forget your PIN, you have to reset the device
Internal Internal
It is the only way back in, and it erases everything on it: contacts, channels, messages and settings. Nobody can unlock it for you. It is the only way back in, and it erases everything on it: contacts, channels, messages and settings. Nobody can unlock it for you.
Jan Jan
January January
Join # channel Join # channel
Join Public channel Join Public channel
Jul Jul
July July
Jun Jun
June June
Keyboard and input Keyboard and input
Keyboard attached.\nRestarting in landscape in %d s. Keyboard attached.\nRestarting in landscape in %d s.
Large Large
Launcher Launcher
Launcher layout Launcher layout
Locks when screen off\n(hold the BOOT button to unlock) Locks when screen off\n(hold the BOOT button to unlock)
Map and GPS Map and GPS
Map tiles Map tiles
Mar Mar
March March
Mark all as read Mark all as read
May May
Mentions muted Mentions muted
Mentions unmuted Mentions unmuted
Mesh · 24 h Mesh · 24 h
Message %s Message %s
Message text on lock screen Message text on lock screen
Messages muted Messages muted
Messages unmuted Messages unmuted
Minutes Minutes
Mon Mon
Monday Monday
Mute mentions Mute mentions
Mute messages Mute messages
Navigate Navigate
Never Never
New PIN New PIN
No backups available to restore. No backups available to restore.
No backups yet. Use Export Backup above to create one. No backups yet. Use Export Backup above to create one.
No channels yet No channels yet
No direct chats yet No direct chats yet
Not delivered, tap to resend Not delivered, tap to resend
Nov Nov
November November
Oct Oct
October October
On On
On battery, show it for On battery, show it for
PIN changed PIN changed
PIN lock PIN lock
PIN lock off PIN lock off
PIN lock on PIN lock on
Phone-app link Phone-app link
Pick the numbers, or type the PIN Pick the numbers, or type the PIN
Preview screensaver Preview screensaver
Radio and messaging Radio and messaging
Reboot Now Reboot Now
Received %s Received %s
Receiving %s Receiving %s
Region not saved: use a-z, 0-9 and - Region not saved: use a-z, 0-9 and -
Repeater Repeater
Report a bug Report a bug
Reset chat icon Reset chat icon
Room Room
Routed Routed
Running it for Running it for
Running it for: Running it for:
SD card SD card
SD unavailable - insert a FAT32 card and retry SD unavailable - insert a FAT32 card and retry
Sat Sat
Saturday Saturday
Say whether this build works on your board, so a stable release is promoted on evidence rather than on nobody having complained. A bug report opens as a QR: scan it and file it from your phone, under your own GitHub account. Say whether this build works on your board, so a stable release is promoted on evidence rather than on nobody having complained. A bug report opens as a QR: scan it and file it from your phone, under your own GitHub account.
Screen timeout Screen timeout
Screensaver Screensaver
Scroll Scroll
Scroll moves the screen; Cursor points and clicks; Navigate (experimental) moves a selection. Hold the trackball to switch between Scroll and Cursor. Scroll moves the screen; Cursor points and clicks; Navigate (experimental) moves a selection. Hold the trackball to switch between Scroll and Cursor.
Send Send
Send a test report Send a test report
Send another test report Send another test report
Sending %s Sending %s
Sending your report... Sending your report...
Sensor Sensor
Sep Sep
September September
Share my contact Share my contact
Stop USB Files Stop USB Files
Storage and SD Storage and SD
Sun Sun
Sunday Sunday
Tap the EN key on the keyboard to switch Tap the EN key on the keyboard to switch
Tells the matrix how many devices run this build, so a board with no reports can be told apart from a board nobody owns. Sends the board and the version, nothing else. Tells the matrix how many devices run this build, so a board with no reports can be told apart from a board nobody owns. Sends the board and the version, nothing else.
Terminal Terminal
Test report: %s Test report: %s
Thank you. Your report is on wadamesh.com/beta Thank you. Your report is on wadamesh.com/beta
The PINs did not match The PINs did not match
The mesh around you instead of a dark screen. Every ring is a real packet. The mesh around you instead of a dark screen. Every ring is a real packet.
This is everything that leaves the device. No name, no contacts, no position. This is everything that leaves the device. No name, no contacts, no position.
Thu Thu
Thursday Thursday
Tick only what you actually used: Tick only what you actually used:
Too many chat icons Too many chat icons
Too many tries. Wait %u s Too many tries. Wait %u s
Trackball Trackball
Trackball: scroll Trackball: scroll
Transfer Transfer
Tue Tue
Tuesday Tuesday
Turn Wi-Fi on to send a report Turn Wi-Fi on to send a report
Type 4 numbers or letters Type 4 numbers or letters
USB Files USB Files
USB Files: low memory USB Files: low memory
Unmute mentions Unmute mentions
Unmute messages Unmute messages
Upload of %s stopped Upload of %s stopped
Used Used
VNC VNC
Waiting for the computer Waiting for the computer
Web Web
Wed Wed
Wednesday Wednesday
While this screen is open, the companion app cannot use USB. While this screen is open, the companion app cannot use USB.
Works Works
Wrong PIN Wrong PIN
You: You:
a week or more a week or more
about a day about a day
heard %s ago heard %s ago
hold the BOOT button to unlock hold the BOOT button to unlock
hop away hop away
hops away hops away
minutes minutes
new new
node node
nodes nodes
now now
routed routed
# Theme page and colour looks: new strings, English placeholders until translated (value = key)
A colour for every section, coloured status icons, names and glyphs in their own hue. A colour for every section, coloured status icons, names and glyphs in their own hue.
Apply and restart Apply and restart
Applying the theme, restarting… Applying the theme, restarting…
Bubbles in colour Bubbles in colour
Bubbles plain Bubbles plain
Chat icons Chat icons
Colourful bubbles Colourful bubbles
Custom Custom
Every app and page its own colour, with a little motion. Every app and page its own colour, with a little motion.
Black and white with heavy outlines, for bright sun or low vision. Black and white with heavy outlines, for bright sun or low vision.
Glyphs Glyphs
High contrast keeps its own fixed colours. High contrast keeps its own fixed colours.
Initials Initials
MORE COLORS! MORE COLORS!
Mode Mode
Names are always in colour; this colours the bubbles too. Names are always in colour; this colours the bubbles too.
Neon Neon
On my way On my way
Pastel Pastel
Preview Preview
Rainbow Rainbow
Regular Regular
Ridge at six? Ridge at six?
Taste the rainbow Taste the rainbow
Use this colour Use this colour
+237 -1
View File
@@ -1,7 +1,7 @@
# wadamesh language file
# canonical source - translators: edit this file and PR it
# code: de
# ver: 22
# ver: 23
# name: Deutsch
# base: de
(device behind) (Gerät geht nach)
@@ -34,9 +34,14 @@ Accent popups: off Akzent-Popups: aus
Accent popups: on Akzent-Popups: ein
Accent colour Akzentfarbe
Appearance Erscheinungsbild
Condense Nav (restart to apply) Kompakte Navigation (Neustart nötig)
Condense Nav saved — restart to apply Kompakte Navigation gespeichert — Neustart zum Anwenden
Day Tag
High contrast Hoher Kontrast
High contrast - restarting to apply it… Hoher Kontrast - Neustart zum Anwenden…
Keyboard nav: on Tastaturnav.: an
Landscape only Nur im Querformat
Letters move the highlight when no text field is focused. Enter selects; hold Backspace to go back. Buchstaben bewegen die Markierung, wenn kein Textfeld aktiv ist. Enter wählt aus; Rücktaste halten geht zurück.
Night Nacht
Theme save failed Design konnte nicht gespeichert werden
Ack Ack
@@ -1278,3 +1283,234 @@ No known Windows malware found. No known Windows malware found.
This firmware can find these but not remove them. Update wadamesh, or format the card: in Files, hold the SD card row. This firmware can find these but not remove them. Update wadamesh, or format the card: in Files, hold the SD card row.
SD Scan only removes files it recognises. If the card may be infected, the safest fix is to copy off what you need and format it completely: in Files, hold the SD card row. SD Scan only removes files it recognises. If the card may be infected, the safest fix is to copy off what you need and format it completely: in Files, hold the SD card row.
and %d more and %d more
# beta_89: new strings, English placeholders until translated (value = key)
%d nodes heard today %d nodes heard today
%lu packets heard %lu packets heard
1 node heard today 1 node heard today
1 packet heard 1 packet heard
1. Connect this device to the computer with a USB cable.\n2. Open this address in Chrome or Edge: 1. Connect this device to the computer with a USB cable.\n2. Open this address in Chrome or Edge:
3. Click Connect and choose this device. 3. Click Connect and choose this device.
4 numbers or letters 4 numbers or letters
A day A day
A week A week
Add a channel Add a channel
Add, download or delete files on this device from a computer. Add, download or delete files on this device from a computer.
Advertise Advertise
Always on when connected to power Always on when connected to power
Anything worth saying (optional) Anything worth saying (optional)
App drawer App drawer
App icons App icons
Append timestamp Append timestamp
Apr Apr
April April
Asks for 4 numbers or letters to unlock, and locks whenever the screen goes off. If you forget it, the only way back in is to reset the device, which erases everything on it. Asks for 4 numbers or letters to unlock, and locks whenever the screen goes off. If you forget it, the only way back in is to reset the device, which erases everything on it.
Aug Aug
August August
Blocked Blocked
Change PIN Change PIN
Channel Channel
Channels Channels
Chat Chat
Chat icon reset Chat icon reset
Chats Chats
Choose a PIN Choose a PIN
Clock not set Clock not set
Cmdr Cmdr
Commander Commander
Companion Companion
Connected to the computer Connected to the computer
Could not send the report. Try again later. Could not send the report. Try again later.
Count this device Count this device
Current PIN Current PIN
Cursor Cursor
Dec Dec
December December
Delete this conversation? Delete this conversation?
Device id Device id
Direct Direct
Direct message Direct message
Direct, no repeaters Direct, no repeaters
Discover Discover
Double-tap SPACE while typing to switch Double-tap SPACE while typing to switch
Emoji Emoji
Enter PIN Enter PIN
Enter it again Enter it again
Export Backup Export Backup
Feb Feb
February February
Fri Fri
Friday Friday
Has a problem Has a problem
Heard by %u repeaters Heard by %u repeaters
Heard by 1 repeater Heard by 1 repeater
Hold the trackball to switch Hold the trackball to switch
Home button opens Home button opens
I hit a problem I hit a problem
I understand I understand
If you forget your PIN, you have to reset the device If you forget your PIN, you have to reset the device
Internal Internal
It is the only way back in, and it erases everything on it: contacts, channels, messages and settings. Nobody can unlock it for you. It is the only way back in, and it erases everything on it: contacts, channels, messages and settings. Nobody can unlock it for you.
Jan Jan
January January
Join # channel Join # channel
Join Public channel Join Public channel
Jul Jul
July July
Jun Jun
June June
Keyboard and input Keyboard and input
Keyboard attached.\nRestarting in landscape in %d s. Keyboard attached.\nRestarting in landscape in %d s.
Large Large
Launcher Launcher
Launcher layout Launcher layout
Locks when screen off\n(hold the BOOT button to unlock) Locks when screen off\n(hold the BOOT button to unlock)
Map and GPS Map and GPS
Map tiles Map tiles
Mar Mar
March March
Mark all as read Mark all as read
May May
Mentions Mentions
Mentions muted Mentions muted
Mentions unmuted Mentions unmuted
Mesh · 24 h Mesh · 24 h
Message %s Message %s
Message text on lock screen Message text on lock screen
Messages muted Messages muted
Messages unmuted Messages unmuted
Minutes Minutes
Mon Mon
Monday Monday
Mute mentions Mute mentions
Mute messages Mute messages
Navigate Navigate
Never Never
New PIN New PIN
No backups available to restore. No backups available to restore.
No backups yet. Use Export Backup above to create one. No backups yet. Use Export Backup above to create one.
No channels yet No channels yet
No direct chats yet No direct chats yet
Normal\nLarge text\nHuge text Normal\nLarge text\nHuge text
Not delivered, tap to resend Not delivered, tap to resend
Nov Nov
November November
Oct Oct
October October
On On
On battery, show it for On battery, show it for
PIN changed PIN changed
PIN lock PIN lock
PIN lock off PIN lock off
PIN lock on PIN lock on
Phone-app link Phone-app link
Pick the numbers, or type the PIN Pick the numbers, or type the PIN
Preview screensaver Preview screensaver
Radio and messaging Radio and messaging
Reboot Now Reboot Now
Received %s Received %s
Receiving %s Receiving %s
Region not saved: use a-z, 0-9 and - Region not saved: use a-z, 0-9 and -
Remote Remote
Repeater Repeater
Report a bug Report a bug
Reset chat icon Reset chat icon
Room Room
Routed Routed
Running it for Running it for
Running it for: Running it for:
SD card SD card
SD unavailable - insert a FAT32 card and retry SD unavailable - insert a FAT32 card and retry
Sat Sat
Saturday Saturday
Say whether this build works on your board, so a stable release is promoted on evidence rather than on nobody having complained. A bug report opens as a QR: scan it and file it from your phone, under your own GitHub account. Say whether this build works on your board, so a stable release is promoted on evidence rather than on nobody having complained. A bug report opens as a QR: scan it and file it from your phone, under your own GitHub account.
Screen timeout Screen timeout
Screensaver Screensaver
Scroll Scroll
Scroll moves the screen; Cursor points and clicks; Navigate (experimental) moves a selection. Hold the trackball to switch between Scroll and Cursor. Scroll moves the screen; Cursor points and clicks; Navigate (experimental) moves a selection. Hold the trackball to switch between Scroll and Cursor.
Send Send
Send a test report Send a test report
Send another test report Send another test report
Sending %s Sending %s
Sending your report... Sending your report...
Sensor Sensor
Sep Sep
September September
Share my contact Share my contact
Spectrum Spectrum
Stop USB Files Stop USB Files
Storage and SD Storage and SD
Sun Sun
Sunday Sunday
Tap the EN key on the keyboard to switch Tap the EN key on the keyboard to switch
Tells the matrix how many devices run this build, so a board with no reports can be told apart from a board nobody owns. Sends the board and the version, nothing else. Tells the matrix how many devices run this build, so a board with no reports can be told apart from a board nobody owns. Sends the board and the version, nothing else.
Terminal Terminal
Test report: %s Test report: %s
Thank you. Your report is on wadamesh.com/beta Thank you. Your report is on wadamesh.com/beta
The PINs did not match The PINs did not match
The mesh around you instead of a dark screen. Every ring is a real packet. The mesh around you instead of a dark screen. Every ring is a real packet.
This is everything that leaves the device. No name, no contacts, no position. This is everything that leaves the device. No name, no contacts, no position.
Thu Thu
Thursday Thursday
Tick only what you actually used: Tick only what you actually used:
Too many chat icons Too many chat icons
Too many tries. Wait %u s Too many tries. Wait %u s
Trackball Trackball
Trackball: scroll Trackball: scroll
Transfer Transfer
Tue Tue
Tuesday Tuesday
Turn Wi-Fi on to send a report Turn Wi-Fi on to send a report
Type 4 numbers or letters Type 4 numbers or letters
USB Files USB Files
USB Files: low memory USB Files: low memory
Unmute mentions Unmute mentions
Unmute messages Unmute messages
Upload of %s stopped Upload of %s stopped
Used Used
VNC VNC
Waiting for the computer Waiting for the computer
Web Web
Wed Wed
Wednesday Wednesday
While this screen is open, the companion app cannot use USB. While this screen is open, the companion app cannot use USB.
Works Works
Wrong PIN Wrong PIN
You: You:
a week or more a week or more
about a day about a day
heard %s ago heard %s ago
hold the BOOT button to unlock hold the BOOT button to unlock
hop away hop away
hops away hops away
minutes minutes
new new
node node
nodes nodes
now now
routed routed
# Theme page and colour looks: new strings, English placeholders until translated (value = key)
A colour for every section, coloured status icons, names and glyphs in their own hue. A colour for every section, coloured status icons, names and glyphs in their own hue.
Apply and restart Apply and restart
Applying the theme, restarting… Applying the theme, restarting…
Bubbles in colour Bubbles in colour
Bubbles plain Bubbles plain
Chat icons Chat icons
Colourful bubbles Colourful bubbles
Custom Custom
Every app and page its own colour, with a little motion. Every app and page its own colour, with a little motion.
Black and white with heavy outlines, for bright sun or low vision. Black and white with heavy outlines, for bright sun or low vision.
Glyphs Glyphs
High contrast keeps its own fixed colours. High contrast keeps its own fixed colours.
Initials Initials
MORE COLORS! MORE COLORS!
Mode Mode
Names are always in colour; this colours the bubbles too. Names are always in colour; this colours the bubbles too.
Neon Neon
On my way On my way
Pastel Pastel
Preview Preview
Rainbow Rainbow
Regular Regular
Ridge at six? Ridge at six?
Taste the rainbow Taste the rainbow
Use this colour Use this colour
+237 -1
View File
@@ -1,7 +1,7 @@
# wadamesh language file
# canonical source - translators: edit this file and PR it
# code: el
# ver: 22
# ver: 23
# name: Ελληνικά
# base: el
(device behind) (συσκευή πίσω)
@@ -34,9 +34,14 @@ Accent popups: off Αναδυόμενα τόνων: όχι
Accent popups: on Αναδυόμενα τόνων: ναι
Accent colour Χρώμα έμφασης
Appearance Εμφάνιση
Condense Nav (restart to apply) Συμπαγής πλοήγηση (επανεκκίνηση για εφαρμογή)
Condense Nav saved — restart to apply Η συμπαγής πλοήγηση αποθηκεύτηκε — επανεκκίνηση για εφαρμογή
Day Ημέρα
High contrast Υψηλή αντίθεση
High contrast - restarting to apply it… Υψηλή αντίθεση - επανεκκίνηση για εφαρμογή…
Keyboard nav: on Πλοήγηση πληκτρ.: ανοιχτό
Landscape only Μόνο σε οριζόντιο προσανατολισμό
Letters move the highlight when no text field is focused. Enter selects; hold Backspace to go back. Τα γράμματα μετακινούν την επισήμανση όταν δεν είναι ενεργό πεδίο κειμένου. Το Enter επιλέγει· κρατήστε το Backspace για επιστροφή.
Night Νύχτα
Theme save failed Αποτυχία αποθήκευσης θέματος
Ack Ack
@@ -1282,3 +1287,234 @@ No known Windows malware found. No known Windows malware found.
This firmware can find these but not remove them. Update wadamesh, or format the card: in Files, hold the SD card row. This firmware can find these but not remove them. Update wadamesh, or format the card: in Files, hold the SD card row.
SD Scan only removes files it recognises. If the card may be infected, the safest fix is to copy off what you need and format it completely: in Files, hold the SD card row. SD Scan only removes files it recognises. If the card may be infected, the safest fix is to copy off what you need and format it completely: in Files, hold the SD card row.
and %d more and %d more
# beta_89: new strings, English placeholders until translated (value = key)
%d nodes heard today %d nodes heard today
%lu packets heard %lu packets heard
1 node heard today 1 node heard today
1 packet heard 1 packet heard
1. Connect this device to the computer with a USB cable.\n2. Open this address in Chrome or Edge: 1. Connect this device to the computer with a USB cable.\n2. Open this address in Chrome or Edge:
3. Click Connect and choose this device. 3. Click Connect and choose this device.
4 numbers or letters 4 numbers or letters
A day A day
A week A week
Add a channel Add a channel
Add, download or delete files on this device from a computer. Add, download or delete files on this device from a computer.
Advertise Advertise
Always on when connected to power Always on when connected to power
Anything worth saying (optional) Anything worth saying (optional)
App drawer App drawer
App icons App icons
Append timestamp Append timestamp
Apr Apr
April April
Asks for 4 numbers or letters to unlock, and locks whenever the screen goes off. If you forget it, the only way back in is to reset the device, which erases everything on it. Asks for 4 numbers or letters to unlock, and locks whenever the screen goes off. If you forget it, the only way back in is to reset the device, which erases everything on it.
Aug Aug
August August
Blocked Blocked
Change PIN Change PIN
Channel Channel
Channels Channels
Chat Chat
Chat icon reset Chat icon reset
Chats Chats
Choose a PIN Choose a PIN
Clock not set Clock not set
Cmdr Cmdr
Commander Commander
Companion Companion
Connected to the computer Connected to the computer
Could not send the report. Try again later. Could not send the report. Try again later.
Count this device Count this device
Current PIN Current PIN
Cursor Cursor
Dec Dec
December December
Delete this conversation? Delete this conversation?
Device id Device id
Direct Direct
Direct message Direct message
Direct, no repeaters Direct, no repeaters
Discover Discover
Double-tap SPACE while typing to switch Double-tap SPACE while typing to switch
Emoji Emoji
Enter PIN Enter PIN
Enter it again Enter it again
Export Backup Export Backup
Feb Feb
February February
Fri Fri
Friday Friday
Has a problem Has a problem
Heard by %u repeaters Heard by %u repeaters
Heard by 1 repeater Heard by 1 repeater
Hold the trackball to switch Hold the trackball to switch
Home button opens Home button opens
I hit a problem I hit a problem
I understand I understand
If you forget your PIN, you have to reset the device If you forget your PIN, you have to reset the device
Internal Internal
It is the only way back in, and it erases everything on it: contacts, channels, messages and settings. Nobody can unlock it for you. It is the only way back in, and it erases everything on it: contacts, channels, messages and settings. Nobody can unlock it for you.
Jan Jan
January January
Join # channel Join # channel
Join Public channel Join Public channel
Jul Jul
July July
Jun Jun
June June
Keyboard and input Keyboard and input
Keyboard attached.\nRestarting in landscape in %d s. Keyboard attached.\nRestarting in landscape in %d s.
Large Large
Launcher Launcher
Launcher layout Launcher layout
Locks when screen off\n(hold the BOOT button to unlock) Locks when screen off\n(hold the BOOT button to unlock)
Map and GPS Map and GPS
Map tiles Map tiles
Mar Mar
March March
Mark all as read Mark all as read
May May
Mentions Mentions
Mentions muted Mentions muted
Mentions unmuted Mentions unmuted
Mesh · 24 h Mesh · 24 h
Message %s Message %s
Message text on lock screen Message text on lock screen
Messages muted Messages muted
Messages unmuted Messages unmuted
Minutes Minutes
Mon Mon
Monday Monday
Mute mentions Mute mentions
Mute messages Mute messages
Navigate Navigate
Never Never
New PIN New PIN
No backups available to restore. No backups available to restore.
No backups yet. Use Export Backup above to create one. No backups yet. Use Export Backup above to create one.
No channels yet No channels yet
No direct chats yet No direct chats yet
Normal\nLarge text\nHuge text Normal\nLarge text\nHuge text
Not delivered, tap to resend Not delivered, tap to resend
Nov Nov
November November
Oct Oct
October October
On On
On battery, show it for On battery, show it for
PIN changed PIN changed
PIN lock PIN lock
PIN lock off PIN lock off
PIN lock on PIN lock on
Phone-app link Phone-app link
Pick the numbers, or type the PIN Pick the numbers, or type the PIN
Preview screensaver Preview screensaver
Radio and messaging Radio and messaging
Reboot Now Reboot Now
Received %s Received %s
Receiving %s Receiving %s
Region not saved: use a-z, 0-9 and - Region not saved: use a-z, 0-9 and -
Remote Remote
Repeater Repeater
Report a bug Report a bug
Reset chat icon Reset chat icon
Room Room
Routed Routed
Running it for Running it for
Running it for: Running it for:
SD card SD card
SD unavailable - insert a FAT32 card and retry SD unavailable - insert a FAT32 card and retry
Sat Sat
Saturday Saturday
Say whether this build works on your board, so a stable release is promoted on evidence rather than on nobody having complained. A bug report opens as a QR: scan it and file it from your phone, under your own GitHub account. Say whether this build works on your board, so a stable release is promoted on evidence rather than on nobody having complained. A bug report opens as a QR: scan it and file it from your phone, under your own GitHub account.
Screen timeout Screen timeout
Screensaver Screensaver
Scroll Scroll
Scroll moves the screen; Cursor points and clicks; Navigate (experimental) moves a selection. Hold the trackball to switch between Scroll and Cursor. Scroll moves the screen; Cursor points and clicks; Navigate (experimental) moves a selection. Hold the trackball to switch between Scroll and Cursor.
Send Send
Send a test report Send a test report
Send another test report Send another test report
Sending %s Sending %s
Sending your report... Sending your report...
Sensor Sensor
Sep Sep
September September
Share my contact Share my contact
Spectrum Spectrum
Stop USB Files Stop USB Files
Storage and SD Storage and SD
Sun Sun
Sunday Sunday
Tap the EN key on the keyboard to switch Tap the EN key on the keyboard to switch
Tells the matrix how many devices run this build, so a board with no reports can be told apart from a board nobody owns. Sends the board and the version, nothing else. Tells the matrix how many devices run this build, so a board with no reports can be told apart from a board nobody owns. Sends the board and the version, nothing else.
Terminal Terminal
Test report: %s Test report: %s
Thank you. Your report is on wadamesh.com/beta Thank you. Your report is on wadamesh.com/beta
The PINs did not match The PINs did not match
The mesh around you instead of a dark screen. Every ring is a real packet. The mesh around you instead of a dark screen. Every ring is a real packet.
This is everything that leaves the device. No name, no contacts, no position. This is everything that leaves the device. No name, no contacts, no position.
Thu Thu
Thursday Thursday
Tick only what you actually used: Tick only what you actually used:
Too many chat icons Too many chat icons
Too many tries. Wait %u s Too many tries. Wait %u s
Trackball Trackball
Trackball: scroll Trackball: scroll
Transfer Transfer
Tue Tue
Tuesday Tuesday
Turn Wi-Fi on to send a report Turn Wi-Fi on to send a report
Type 4 numbers or letters Type 4 numbers or letters
USB Files USB Files
USB Files: low memory USB Files: low memory
Unmute mentions Unmute mentions
Unmute messages Unmute messages
Upload of %s stopped Upload of %s stopped
Used Used
VNC VNC
Waiting for the computer Waiting for the computer
Web Web
Wed Wed
Wednesday Wednesday
While this screen is open, the companion app cannot use USB. While this screen is open, the companion app cannot use USB.
Works Works
Wrong PIN Wrong PIN
You: You:
a week or more a week or more
about a day about a day
heard %s ago heard %s ago
hold the BOOT button to unlock hold the BOOT button to unlock
hop away hop away
hops away hops away
minutes minutes
new new
node node
nodes nodes
now now
routed routed
# Theme page and colour looks: new strings, English placeholders until translated (value = key)
A colour for every section, coloured status icons, names and glyphs in their own hue. A colour for every section, coloured status icons, names and glyphs in their own hue.
Apply and restart Apply and restart
Applying the theme, restarting… Applying the theme, restarting…
Bubbles in colour Bubbles in colour
Bubbles plain Bubbles plain
Chat icons Chat icons
Colourful bubbles Colourful bubbles
Custom Custom
Every app and page its own colour, with a little motion. Every app and page its own colour, with a little motion.
Black and white with heavy outlines, for bright sun or low vision. Black and white with heavy outlines, for bright sun or low vision.
Glyphs Glyphs
High contrast keeps its own fixed colours. High contrast keeps its own fixed colours.
Initials Initials
MORE COLORS! MORE COLORS!
Mode Mode
Names are always in colour; this colours the bubbles too. Names are always in colour; this colours the bubbles too.
Neon Neon
On my way On my way
Pastel Pastel
Preview Preview
Rainbow Rainbow
Regular Regular
Ridge at six? Ridge at six?
Taste the rainbow Taste the rainbow
Use this colour Use this colour
+237 -1
View File
@@ -1,7 +1,7 @@
# wadamesh language file
# canonical source - translators: edit this file and PR it
# code: es
# ver: 22
# ver: 23
# name: Español
# base: es
(device behind) (dispositivo atrasado)
@@ -34,9 +34,14 @@ Accent popups: off Ventanas de acentos: desactivado
Accent popups: on Ventanas de acentos: activado
Accent colour Color de acento
Appearance Apariencia
Condense Nav (restart to apply) Navegación compacta (reiniciar para aplicar)
Condense Nav saved — restart to apply Navegación compacta guardada — reinicia para aplicar
Day Día
High contrast Alto contraste
High contrast - restarting to apply it… Alto contraste - reiniciando para aplicarlo…
Keyboard nav: on Nav. teclado: activ.
Landscape only Solo en horizontal
Letters move the highlight when no text field is focused. Enter selects; hold Backspace to go back. Las letras mueven el resaltado cuando no hay un campo de texto activo. Intro selecciona; mantén Retroceso para volver.
Night Noche
Theme save failed No se pudo guardar el tema
Ack Ack
@@ -1282,3 +1287,234 @@ No known Windows malware found. No known Windows malware found.
This firmware can find these but not remove them. Update wadamesh, or format the card: in Files, hold the SD card row. This firmware can find these but not remove them. Update wadamesh, or format the card: in Files, hold the SD card row.
SD Scan only removes files it recognises. If the card may be infected, the safest fix is to copy off what you need and format it completely: in Files, hold the SD card row. SD Scan only removes files it recognises. If the card may be infected, the safest fix is to copy off what you need and format it completely: in Files, hold the SD card row.
and %d more and %d more
# beta_89: new strings, English placeholders until translated (value = key)
%d nodes heard today %d nodes heard today
%lu packets heard %lu packets heard
1 node heard today 1 node heard today
1 packet heard 1 packet heard
1. Connect this device to the computer with a USB cable.\n2. Open this address in Chrome or Edge: 1. Connect this device to the computer with a USB cable.\n2. Open this address in Chrome or Edge:
3. Click Connect and choose this device. 3. Click Connect and choose this device.
4 numbers or letters 4 numbers or letters
A day A day
A week A week
Add a channel Add a channel
Add, download or delete files on this device from a computer. Add, download or delete files on this device from a computer.
Advertise Advertise
Always on when connected to power Always on when connected to power
Anything worth saying (optional) Anything worth saying (optional)
App drawer App drawer
App icons App icons
Append timestamp Append timestamp
Apr Apr
April April
Asks for 4 numbers or letters to unlock, and locks whenever the screen goes off. If you forget it, the only way back in is to reset the device, which erases everything on it. Asks for 4 numbers or letters to unlock, and locks whenever the screen goes off. If you forget it, the only way back in is to reset the device, which erases everything on it.
Aug Aug
August August
Blocked Blocked
Change PIN Change PIN
Channel Channel
Channels Channels
Chat Chat
Chat icon reset Chat icon reset
Chats Chats
Choose a PIN Choose a PIN
Clock not set Clock not set
Cmdr Cmdr
Commander Commander
Companion Companion
Connected to the computer Connected to the computer
Could not send the report. Try again later. Could not send the report. Try again later.
Count this device Count this device
Current PIN Current PIN
Cursor Cursor
Dec Dec
December December
Delete this conversation? Delete this conversation?
Device id Device id
Direct Direct
Direct message Direct message
Direct, no repeaters Direct, no repeaters
Discover Discover
Double-tap SPACE while typing to switch Double-tap SPACE while typing to switch
Emoji Emoji
Enter PIN Enter PIN
Enter it again Enter it again
Export Backup Export Backup
Feb Feb
February February
Fri Fri
Friday Friday
Has a problem Has a problem
Heard by %u repeaters Heard by %u repeaters
Heard by 1 repeater Heard by 1 repeater
Hold the trackball to switch Hold the trackball to switch
Home button opens Home button opens
I hit a problem I hit a problem
I understand I understand
If you forget your PIN, you have to reset the device If you forget your PIN, you have to reset the device
Internal Internal
It is the only way back in, and it erases everything on it: contacts, channels, messages and settings. Nobody can unlock it for you. It is the only way back in, and it erases everything on it: contacts, channels, messages and settings. Nobody can unlock it for you.
Jan Jan
January January
Join # channel Join # channel
Join Public channel Join Public channel
Jul Jul
July July
Jun Jun
June June
Keyboard and input Keyboard and input
Keyboard attached.\nRestarting in landscape in %d s. Keyboard attached.\nRestarting in landscape in %d s.
Large Large
Launcher Launcher
Launcher layout Launcher layout
Locks when screen off\n(hold the BOOT button to unlock) Locks when screen off\n(hold the BOOT button to unlock)
Map and GPS Map and GPS
Map tiles Map tiles
Mar Mar
March March
Mark all as read Mark all as read
May May
Mentions Mentions
Mentions muted Mentions muted
Mentions unmuted Mentions unmuted
Mesh · 24 h Mesh · 24 h
Message %s Message %s
Message text on lock screen Message text on lock screen
Messages muted Messages muted
Messages unmuted Messages unmuted
Minutes Minutes
Mon Mon
Monday Monday
Mute mentions Mute mentions
Mute messages Mute messages
Navigate Navigate
Never Never
New PIN New PIN
No backups available to restore. No backups available to restore.
No backups yet. Use Export Backup above to create one. No backups yet. Use Export Backup above to create one.
No channels yet No channels yet
No direct chats yet No direct chats yet
Normal\nLarge text\nHuge text Normal\nLarge text\nHuge text
Not delivered, tap to resend Not delivered, tap to resend
Nov Nov
November November
Oct Oct
October October
On On
On battery, show it for On battery, show it for
PIN changed PIN changed
PIN lock PIN lock
PIN lock off PIN lock off
PIN lock on PIN lock on
Phone-app link Phone-app link
Pick the numbers, or type the PIN Pick the numbers, or type the PIN
Preview screensaver Preview screensaver
Radio and messaging Radio and messaging
Reboot Now Reboot Now
Received %s Received %s
Receiving %s Receiving %s
Region not saved: use a-z, 0-9 and - Region not saved: use a-z, 0-9 and -
Remote Remote
Repeater Repeater
Report a bug Report a bug
Reset chat icon Reset chat icon
Room Room
Routed Routed
Running it for Running it for
Running it for: Running it for:
SD card SD card
SD unavailable - insert a FAT32 card and retry SD unavailable - insert a FAT32 card and retry
Sat Sat
Saturday Saturday
Say whether this build works on your board, so a stable release is promoted on evidence rather than on nobody having complained. A bug report opens as a QR: scan it and file it from your phone, under your own GitHub account. Say whether this build works on your board, so a stable release is promoted on evidence rather than on nobody having complained. A bug report opens as a QR: scan it and file it from your phone, under your own GitHub account.
Screen timeout Screen timeout
Screensaver Screensaver
Scroll Scroll
Scroll moves the screen; Cursor points and clicks; Navigate (experimental) moves a selection. Hold the trackball to switch between Scroll and Cursor. Scroll moves the screen; Cursor points and clicks; Navigate (experimental) moves a selection. Hold the trackball to switch between Scroll and Cursor.
Send Send
Send a test report Send a test report
Send another test report Send another test report
Sending %s Sending %s
Sending your report... Sending your report...
Sensor Sensor
Sep Sep
September September
Share my contact Share my contact
Spectrum Spectrum
Stop USB Files Stop USB Files
Storage and SD Storage and SD
Sun Sun
Sunday Sunday
Tap the EN key on the keyboard to switch Tap the EN key on the keyboard to switch
Tells the matrix how many devices run this build, so a board with no reports can be told apart from a board nobody owns. Sends the board and the version, nothing else. Tells the matrix how many devices run this build, so a board with no reports can be told apart from a board nobody owns. Sends the board and the version, nothing else.
Terminal Terminal
Test report: %s Test report: %s
Thank you. Your report is on wadamesh.com/beta Thank you. Your report is on wadamesh.com/beta
The PINs did not match The PINs did not match
The mesh around you instead of a dark screen. Every ring is a real packet. The mesh around you instead of a dark screen. Every ring is a real packet.
This is everything that leaves the device. No name, no contacts, no position. This is everything that leaves the device. No name, no contacts, no position.
Thu Thu
Thursday Thursday
Tick only what you actually used: Tick only what you actually used:
Too many chat icons Too many chat icons
Too many tries. Wait %u s Too many tries. Wait %u s
Trackball Trackball
Trackball: scroll Trackball: scroll
Transfer Transfer
Tue Tue
Tuesday Tuesday
Turn Wi-Fi on to send a report Turn Wi-Fi on to send a report
Type 4 numbers or letters Type 4 numbers or letters
USB Files USB Files
USB Files: low memory USB Files: low memory
Unmute mentions Unmute mentions
Unmute messages Unmute messages
Upload of %s stopped Upload of %s stopped
Used Used
VNC VNC
Waiting for the computer Waiting for the computer
Web Web
Wed Wed
Wednesday Wednesday
While this screen is open, the companion app cannot use USB. While this screen is open, the companion app cannot use USB.
Works Works
Wrong PIN Wrong PIN
You: You:
a week or more a week or more
about a day about a day
heard %s ago heard %s ago
hold the BOOT button to unlock hold the BOOT button to unlock
hop away hop away
hops away hops away
minutes minutes
new new
node node
nodes nodes
now now
routed routed
# Theme page and colour looks: new strings, English placeholders until translated (value = key)
A colour for every section, coloured status icons, names and glyphs in their own hue. A colour for every section, coloured status icons, names and glyphs in their own hue.
Apply and restart Apply and restart
Applying the theme, restarting… Applying the theme, restarting…
Bubbles in colour Bubbles in colour
Bubbles plain Bubbles plain
Chat icons Chat icons
Colourful bubbles Colourful bubbles
Custom Custom
Every app and page its own colour, with a little motion. Every app and page its own colour, with a little motion.
Black and white with heavy outlines, for bright sun or low vision. Black and white with heavy outlines, for bright sun or low vision.
Glyphs Glyphs
High contrast keeps its own fixed colours. High contrast keeps its own fixed colours.
Initials Initials
MORE COLORS! MORE COLORS!
Mode Mode
Names are always in colour; this colours the bubbles too. Names are always in colour; this colours the bubbles too.
Neon Neon
On my way On my way
Pastel Pastel
Preview Preview
Rainbow Rainbow
Regular Regular
Ridge at six? Ridge at six?
Taste the rainbow Taste the rainbow
Use this colour Use this colour
+237 -1
View File
@@ -1,7 +1,7 @@
# wadamesh language file
# canonical source - translators: edit this file and PR it
# code: fr
# ver: 22
# ver: 23
# name: Français
# base: fr
(device behind) (appareil en retard)
@@ -34,9 +34,14 @@ Accent popups: off Fenêtres d'accents : désactivé
Accent popups: on Fenêtres d'accents : activé
Accent colour Couleur d'accent
Appearance Apparence
Condense Nav (restart to apply) Navigation compacte (redémarrer pour appliquer)
Condense Nav saved — restart to apply Navigation compacte enregistrée — redémarrez pour appliquer
Day Jour
High contrast Contraste élevé
High contrast - restarting to apply it… Contraste élevé - redémarrage pour l'appliquer…
Keyboard nav: on Nav. clavier : activé
Landscape only Paysage uniquement
Letters move the highlight when no text field is focused. Enter selects; hold Backspace to go back. Les lettres déplacent la sélection quand aucun champ de texte n'est actif. Entrée sélectionne ; maintenez Retour arrière pour revenir.
Night Nuit
Theme save failed Échec de l’enregistrement du thème
Ack Accusé
@@ -1281,3 +1286,234 @@ No known Windows malware found. No known Windows malware found.
This firmware can find these but not remove them. Update wadamesh, or format the card: in Files, hold the SD card row. This firmware can find these but not remove them. Update wadamesh, or format the card: in Files, hold the SD card row.
SD Scan only removes files it recognises. If the card may be infected, the safest fix is to copy off what you need and format it completely: in Files, hold the SD card row. SD Scan only removes files it recognises. If the card may be infected, the safest fix is to copy off what you need and format it completely: in Files, hold the SD card row.
and %d more and %d more
# beta_89: new strings, English placeholders until translated (value = key)
%d nodes heard today %d nodes heard today
%lu packets heard %lu packets heard
1 node heard today 1 node heard today
1 packet heard 1 packet heard
1. Connect this device to the computer with a USB cable.\n2. Open this address in Chrome or Edge: 1. Connect this device to the computer with a USB cable.\n2. Open this address in Chrome or Edge:
3. Click Connect and choose this device. 3. Click Connect and choose this device.
4 numbers or letters 4 numbers or letters
A day A day
A week A week
Add a channel Add a channel
Add, download or delete files on this device from a computer. Add, download or delete files on this device from a computer.
Advertise Advertise
Always on when connected to power Always on when connected to power
Anything worth saying (optional) Anything worth saying (optional)
App drawer App drawer
App icons App icons
Append timestamp Append timestamp
Apr Apr
April April
Asks for 4 numbers or letters to unlock, and locks whenever the screen goes off. If you forget it, the only way back in is to reset the device, which erases everything on it. Asks for 4 numbers or letters to unlock, and locks whenever the screen goes off. If you forget it, the only way back in is to reset the device, which erases everything on it.
Aug Aug
August August
Blocked Blocked
Change PIN Change PIN
Channel Channel
Channels Channels
Chat Chat
Chat icon reset Chat icon reset
Chats Chats
Choose a PIN Choose a PIN
Clock not set Clock not set
Cmdr Cmdr
Commander Commander
Companion Companion
Connected to the computer Connected to the computer
Could not send the report. Try again later. Could not send the report. Try again later.
Count this device Count this device
Current PIN Current PIN
Cursor Cursor
Dec Dec
December December
Delete this conversation? Delete this conversation?
Device id Device id
Direct Direct
Direct message Direct message
Direct, no repeaters Direct, no repeaters
Discover Discover
Double-tap SPACE while typing to switch Double-tap SPACE while typing to switch
Emoji Emoji
Enter PIN Enter PIN
Enter it again Enter it again
Export Backup Export Backup
Feb Feb
February February
Fri Fri
Friday Friday
Has a problem Has a problem
Heard by %u repeaters Heard by %u repeaters
Heard by 1 repeater Heard by 1 repeater
Hold the trackball to switch Hold the trackball to switch
Home button opens Home button opens
I hit a problem I hit a problem
I understand I understand
If you forget your PIN, you have to reset the device If you forget your PIN, you have to reset the device
Internal Internal
It is the only way back in, and it erases everything on it: contacts, channels, messages and settings. Nobody can unlock it for you. It is the only way back in, and it erases everything on it: contacts, channels, messages and settings. Nobody can unlock it for you.
Jan Jan
January January
Join # channel Join # channel
Join Public channel Join Public channel
Jul Jul
July July
Jun Jun
June June
Keyboard and input Keyboard and input
Keyboard attached.\nRestarting in landscape in %d s. Keyboard attached.\nRestarting in landscape in %d s.
Large Large
Launcher Launcher
Launcher layout Launcher layout
Locks when screen off\n(hold the BOOT button to unlock) Locks when screen off\n(hold the BOOT button to unlock)
Map and GPS Map and GPS
Map tiles Map tiles
Mar Mar
March March
Mark all as read Mark all as read
May May
Mentions Mentions
Mentions muted Mentions muted
Mentions unmuted Mentions unmuted
Mesh · 24 h Mesh · 24 h
Message %s Message %s
Message text on lock screen Message text on lock screen
Messages muted Messages muted
Messages unmuted Messages unmuted
Minutes Minutes
Mon Mon
Monday Monday
Mute mentions Mute mentions
Mute messages Mute messages
Navigate Navigate
Never Never
New PIN New PIN
No backups available to restore. No backups available to restore.
No backups yet. Use Export Backup above to create one. No backups yet. Use Export Backup above to create one.
No channels yet No channels yet
No direct chats yet No direct chats yet
Normal\nLarge text\nHuge text Normal\nLarge text\nHuge text
Not delivered, tap to resend Not delivered, tap to resend
Nov Nov
November November
Oct Oct
October October
On On
On battery, show it for On battery, show it for
PIN changed PIN changed
PIN lock PIN lock
PIN lock off PIN lock off
PIN lock on PIN lock on
Phone-app link Phone-app link
Pick the numbers, or type the PIN Pick the numbers, or type the PIN
Preview screensaver Preview screensaver
Radio and messaging Radio and messaging
Reboot Now Reboot Now
Received %s Received %s
Receiving %s Receiving %s
Region not saved: use a-z, 0-9 and - Region not saved: use a-z, 0-9 and -
Remote Remote
Repeater Repeater
Report a bug Report a bug
Reset chat icon Reset chat icon
Room Room
Routed Routed
Running it for Running it for
Running it for: Running it for:
SD card SD card
SD unavailable - insert a FAT32 card and retry SD unavailable - insert a FAT32 card and retry
Sat Sat
Saturday Saturday
Say whether this build works on your board, so a stable release is promoted on evidence rather than on nobody having complained. A bug report opens as a QR: scan it and file it from your phone, under your own GitHub account. Say whether this build works on your board, so a stable release is promoted on evidence rather than on nobody having complained. A bug report opens as a QR: scan it and file it from your phone, under your own GitHub account.
Screen timeout Screen timeout
Screensaver Screensaver
Scroll Scroll
Scroll moves the screen; Cursor points and clicks; Navigate (experimental) moves a selection. Hold the trackball to switch between Scroll and Cursor. Scroll moves the screen; Cursor points and clicks; Navigate (experimental) moves a selection. Hold the trackball to switch between Scroll and Cursor.
Send Send
Send a test report Send a test report
Send another test report Send another test report
Sending %s Sending %s
Sending your report... Sending your report...
Sensor Sensor
Sep Sep
September September
Share my contact Share my contact
Spectrum Spectrum
Stop USB Files Stop USB Files
Storage and SD Storage and SD
Sun Sun
Sunday Sunday
Tap the EN key on the keyboard to switch Tap the EN key on the keyboard to switch
Tells the matrix how many devices run this build, so a board with no reports can be told apart from a board nobody owns. Sends the board and the version, nothing else. Tells the matrix how many devices run this build, so a board with no reports can be told apart from a board nobody owns. Sends the board and the version, nothing else.
Terminal Terminal
Test report: %s Test report: %s
Thank you. Your report is on wadamesh.com/beta Thank you. Your report is on wadamesh.com/beta
The PINs did not match The PINs did not match
The mesh around you instead of a dark screen. Every ring is a real packet. The mesh around you instead of a dark screen. Every ring is a real packet.
This is everything that leaves the device. No name, no contacts, no position. This is everything that leaves the device. No name, no contacts, no position.
Thu Thu
Thursday Thursday
Tick only what you actually used: Tick only what you actually used:
Too many chat icons Too many chat icons
Too many tries. Wait %u s Too many tries. Wait %u s
Trackball Trackball
Trackball: scroll Trackball: scroll
Transfer Transfer
Tue Tue
Tuesday Tuesday
Turn Wi-Fi on to send a report Turn Wi-Fi on to send a report
Type 4 numbers or letters Type 4 numbers or letters
USB Files USB Files
USB Files: low memory USB Files: low memory
Unmute mentions Unmute mentions
Unmute messages Unmute messages
Upload of %s stopped Upload of %s stopped
Used Used
VNC VNC
Waiting for the computer Waiting for the computer
Web Web
Wed Wed
Wednesday Wednesday
While this screen is open, the companion app cannot use USB. While this screen is open, the companion app cannot use USB.
Works Works
Wrong PIN Wrong PIN
You: You:
a week or more a week or more
about a day about a day
heard %s ago heard %s ago
hold the BOOT button to unlock hold the BOOT button to unlock
hop away hop away
hops away hops away
minutes minutes
new new
node node
nodes nodes
now now
routed routed
# Theme page and colour looks: new strings, English placeholders until translated (value = key)
A colour for every section, coloured status icons, names and glyphs in their own hue. A colour for every section, coloured status icons, names and glyphs in their own hue.
Apply and restart Apply and restart
Applying the theme, restarting… Applying the theme, restarting…
Bubbles in colour Bubbles in colour
Bubbles plain Bubbles plain
Chat icons Chat icons
Colourful bubbles Colourful bubbles
Custom Custom
Every app and page its own colour, with a little motion. Every app and page its own colour, with a little motion.
Black and white with heavy outlines, for bright sun or low vision. Black and white with heavy outlines, for bright sun or low vision.
Glyphs Glyphs
High contrast keeps its own fixed colours. High contrast keeps its own fixed colours.
Initials Initials
MORE COLORS! MORE COLORS!
Mode Mode
Names are always in colour; this colours the bubbles too. Names are always in colour; this colours the bubbles too.
Neon Neon
On my way On my way
Pastel Pastel
Preview Preview
Rainbow Rainbow
Regular Regular
Ridge at six? Ridge at six?
Taste the rainbow Taste the rainbow
Use this colour Use this colour
+232 -1
View File
@@ -1,7 +1,7 @@
# wadamesh language file
# canonical source - translators: edit this file and PR it
# code: hu
# ver: 22
# ver: 23
# name: Magyar
# base: hu
(device behind) (készülék hátulján)
@@ -34,9 +34,14 @@ Accent popups: off Accent popups: kikapcsolva
Accent popups: on Accent popups: bekapcsolva
Accent colour Kiemelőszín
Appearance Megjelenés
Condense Nav (restart to apply) Tömör navigáció (újraindítás az alkalmazáshoz)
Condense Nav saved — restart to apply Tömör navigáció mentve – indítsa újra az alkalmazáshoz
Day Nappali
High contrast Nagy kontraszt
High contrast - restarting to apply it… Nagy kontraszt - újraindítás az alkalmazáshoz…
Keyboard nav: on Billentyűzetnavigáció: bekapcsolva
Landscape only Csak fekvő tájolásban
Letters move the highlight when no text field is focused. Enter selects; hold Backspace to go back. A betűk mozgatják a kijelölést, ha nincs aktív szövegmező. Az Enter kiválaszt; a Backspace nyomva tartása visszalép.
Night Éjszakai
Theme save failed Téma mentése sikertelen
Ack Ack
@@ -1298,3 +1303,229 @@ No known Windows malware found. No known Windows malware found.
This firmware can find these but not remove them. Update wadamesh, or format the card: in Files, hold the SD card row. This firmware can find these but not remove them. Update wadamesh, or format the card: in Files, hold the SD card row.
SD Scan only removes files it recognises. If the card may be infected, the safest fix is to copy off what you need and format it completely: in Files, hold the SD card row. SD Scan only removes files it recognises. If the card may be infected, the safest fix is to copy off what you need and format it completely: in Files, hold the SD card row.
and %d more and %d more
# beta_89: new strings, English placeholders until translated (value = key)
%d nodes heard today %d nodes heard today
%lu packets heard %lu packets heard
1 node heard today 1 node heard today
1 packet heard 1 packet heard
1. Connect this device to the computer with a USB cable.\n2. Open this address in Chrome or Edge: 1. Connect this device to the computer with a USB cable.\n2. Open this address in Chrome or Edge:
3. Click Connect and choose this device. 3. Click Connect and choose this device.
4 numbers or letters 4 numbers or letters
A day A day
A week A week
Add a channel Add a channel
Add, download or delete files on this device from a computer. Add, download or delete files on this device from a computer.
Advertise Advertise
Always on when connected to power Always on when connected to power
Anything worth saying (optional) Anything worth saying (optional)
App drawer App drawer
App icons App icons
Append timestamp Append timestamp
Apr Apr
April April
Asks for 4 numbers or letters to unlock, and locks whenever the screen goes off. If you forget it, the only way back in is to reset the device, which erases everything on it. Asks for 4 numbers or letters to unlock, and locks whenever the screen goes off. If you forget it, the only way back in is to reset the device, which erases everything on it.
Aug Aug
August August
Blocked Blocked
Change PIN Change PIN
Channel Channel
Channels Channels
Chat icon reset Chat icon reset
Chats Chats
Choose a PIN Choose a PIN
Clock not set Clock not set
Cmdr Cmdr
Commander Commander
Companion Companion
Connected to the computer Connected to the computer
Could not send the report. Try again later. Could not send the report. Try again later.
Count this device Count this device
Current PIN Current PIN
Cursor Cursor
Dec Dec
December December
Delete this conversation? Delete this conversation?
Device id Device id
Direct Direct
Direct message Direct message
Direct, no repeaters Direct, no repeaters
Double-tap SPACE while typing to switch Double-tap SPACE while typing to switch
Emoji Emoji
Enter PIN Enter PIN
Enter it again Enter it again
Export Backup Export Backup
Feb Feb
February February
Fri Fri
Friday Friday
Has a problem Has a problem
Heard by %u repeaters Heard by %u repeaters
Heard by 1 repeater Heard by 1 repeater
Hold the trackball to switch Hold the trackball to switch
Home button opens Home button opens
I hit a problem I hit a problem
I understand I understand
If you forget your PIN, you have to reset the device If you forget your PIN, you have to reset the device
Internal Internal
It is the only way back in, and it erases everything on it: contacts, channels, messages and settings. Nobody can unlock it for you. It is the only way back in, and it erases everything on it: contacts, channels, messages and settings. Nobody can unlock it for you.
Jan Jan
January January
Join # channel Join # channel
Join Public channel Join Public channel
Jul Jul
July July
Jun Jun
June June
Keyboard and input Keyboard and input
Keyboard attached.\nRestarting in landscape in %d s. Keyboard attached.\nRestarting in landscape in %d s.
Large Large
Launcher Launcher
Launcher layout Launcher layout
Locks when screen off\n(hold the BOOT button to unlock) Locks when screen off\n(hold the BOOT button to unlock)
Map and GPS Map and GPS
Map tiles Map tiles
Mar Mar
March March
Mark all as read Mark all as read
May May
Mentions muted Mentions muted
Mentions unmuted Mentions unmuted
Mesh · 24 h Mesh · 24 h
Message %s Message %s
Message text on lock screen Message text on lock screen
Messages muted Messages muted
Messages unmuted Messages unmuted
Minutes Minutes
Mon Mon
Monday Monday
Mute mentions Mute mentions
Mute messages Mute messages
Navigate Navigate
Never Never
New PIN New PIN
No backups available to restore. No backups available to restore.
No backups yet. Use Export Backup above to create one. No backups yet. Use Export Backup above to create one.
No channels yet No channels yet
No direct chats yet No direct chats yet
Normal\nLarge text\nHuge text Normal\nLarge text\nHuge text
Not delivered, tap to resend Not delivered, tap to resend
Nov Nov
November November
Oct Oct
October October
On On
On battery, show it for On battery, show it for
PIN changed PIN changed
PIN lock PIN lock
PIN lock off PIN lock off
PIN lock on PIN lock on
Phone-app link Phone-app link
Pick the numbers, or type the PIN Pick the numbers, or type the PIN
Preview screensaver Preview screensaver
Radio and messaging Radio and messaging
Reboot Now Reboot Now
Received %s Received %s
Receiving %s Receiving %s
Region not saved: use a-z, 0-9 and - Region not saved: use a-z, 0-9 and -
Repeater Repeater
Report a bug Report a bug
Reset chat icon Reset chat icon
Room Room
Routed Routed
Running it for Running it for
Running it for: Running it for:
SD card SD card
SD unavailable - insert a FAT32 card and retry SD unavailable - insert a FAT32 card and retry
Sat Sat
Saturday Saturday
Say whether this build works on your board, so a stable release is promoted on evidence rather than on nobody having complained. A bug report opens as a QR: scan it and file it from your phone, under your own GitHub account. Say whether this build works on your board, so a stable release is promoted on evidence rather than on nobody having complained. A bug report opens as a QR: scan it and file it from your phone, under your own GitHub account.
Screen timeout Screen timeout
Screensaver Screensaver
Scroll Scroll
Scroll moves the screen; Cursor points and clicks; Navigate (experimental) moves a selection. Hold the trackball to switch between Scroll and Cursor. Scroll moves the screen; Cursor points and clicks; Navigate (experimental) moves a selection. Hold the trackball to switch between Scroll and Cursor.
Send Send
Send a test report Send a test report
Send another test report Send another test report
Sending %s Sending %s
Sending your report... Sending your report...
Sensor Sensor
Sep Sep
September September
Share my contact Share my contact
Stop USB Files Stop USB Files
Storage and SD Storage and SD
Sun Sun
Sunday Sunday
Tap the EN key on the keyboard to switch Tap the EN key on the keyboard to switch
Tells the matrix how many devices run this build, so a board with no reports can be told apart from a board nobody owns. Sends the board and the version, nothing else. Tells the matrix how many devices run this build, so a board with no reports can be told apart from a board nobody owns. Sends the board and the version, nothing else.
Terminal Terminal
Test report: %s Test report: %s
Thank you. Your report is on wadamesh.com/beta Thank you. Your report is on wadamesh.com/beta
The PINs did not match The PINs did not match
The mesh around you instead of a dark screen. Every ring is a real packet. The mesh around you instead of a dark screen. Every ring is a real packet.
This is everything that leaves the device. No name, no contacts, no position. This is everything that leaves the device. No name, no contacts, no position.
Thu Thu
Thursday Thursday
Tick only what you actually used: Tick only what you actually used:
Too many chat icons Too many chat icons
Too many tries. Wait %u s Too many tries. Wait %u s
Trackball Trackball
Trackball: scroll Trackball: scroll
Transfer Transfer
Tue Tue
Tuesday Tuesday
Turn Wi-Fi on to send a report Turn Wi-Fi on to send a report
Type 4 numbers or letters Type 4 numbers or letters
USB Files USB Files
USB Files: low memory USB Files: low memory
Unmute mentions Unmute mentions
Unmute messages Unmute messages
Upload of %s stopped Upload of %s stopped
Used Used
VNC VNC
Waiting for the computer Waiting for the computer
Web Web
Wed Wed
Wednesday Wednesday
While this screen is open, the companion app cannot use USB. While this screen is open, the companion app cannot use USB.
Works Works
Wrong PIN Wrong PIN
You: You:
a week or more a week or more
about a day about a day
heard %s ago heard %s ago
hold the BOOT button to unlock hold the BOOT button to unlock
hop away hop away
hops away hops away
minutes minutes
new new
node node
nodes nodes
now now
routed routed
# Theme page and colour looks: new strings, English placeholders until translated (value = key)
A colour for every section, coloured status icons, names and glyphs in their own hue. A colour for every section, coloured status icons, names and glyphs in their own hue.
Apply and restart Apply and restart
Applying the theme, restarting… Applying the theme, restarting…
Bubbles in colour Bubbles in colour
Bubbles plain Bubbles plain
Chat icons Chat icons
Colourful bubbles Colourful bubbles
Custom Custom
Every app and page its own colour, with a little motion. Every app and page its own colour, with a little motion.
Black and white with heavy outlines, for bright sun or low vision. Black and white with heavy outlines, for bright sun or low vision.
Glyphs Glyphs
High contrast keeps its own fixed colours. High contrast keeps its own fixed colours.
Initials Initials
MORE COLORS! MORE COLORS!
Mode Mode
Names are always in colour; this colours the bubbles too. Names are always in colour; this colours the bubbles too.
Neon Neon
On my way On my way
Pastel Pastel
Preview Preview
Rainbow Rainbow
Regular Regular
Ridge at six? Ridge at six?
Taste the rainbow Taste the rainbow
Use this colour Use this colour
+237 -1
View File
@@ -1,7 +1,7 @@
# wadamesh language file
# canonical source - translators: edit this file and PR it
# code: it
# ver: 22
# ver: 23
# name: Italiano
# base: it
(device behind) (dispositivo indietro)
@@ -34,9 +34,14 @@ Accent popups: off Popup accenti: disattivi
Accent popups: on Popup accenti: attivi
Accent colour Colore accento
Appearance Aspetto
Condense Nav (restart to apply) Navigazione compatta (riavvia per applicare)
Condense Nav saved — restart to apply Navigazione compatta salvata — riavvia per applicare
Day Giorno
High contrast Contrasto elevato
High contrast - restarting to apply it… Contrasto elevato - riavvio per applicarlo…
Keyboard nav: on Nav. tastiera: on
Landscape only Solo in orizzontale
Letters move the highlight when no text field is focused. Enter selects; hold Backspace to go back. Le lettere spostano l'evidenziazione quando nessun campo di testo è attivo. Invio seleziona; tieni premuto Backspace per tornare indietro.
Night Notte
Theme save failed Salvataggio tema non riuscito
Ack Ack
@@ -1281,3 +1286,234 @@ No known Windows malware found. No known Windows malware found.
This firmware can find these but not remove them. Update wadamesh, or format the card: in Files, hold the SD card row. This firmware can find these but not remove them. Update wadamesh, or format the card: in Files, hold the SD card row.
SD Scan only removes files it recognises. If the card may be infected, the safest fix is to copy off what you need and format it completely: in Files, hold the SD card row. SD Scan only removes files it recognises. If the card may be infected, the safest fix is to copy off what you need and format it completely: in Files, hold the SD card row.
and %d more and %d more
# beta_89: new strings, English placeholders until translated (value = key)
%d nodes heard today %d nodes heard today
%lu packets heard %lu packets heard
1 node heard today 1 node heard today
1 packet heard 1 packet heard
1. Connect this device to the computer with a USB cable.\n2. Open this address in Chrome or Edge: 1. Connect this device to the computer with a USB cable.\n2. Open this address in Chrome or Edge:
3. Click Connect and choose this device. 3. Click Connect and choose this device.
4 numbers or letters 4 numbers or letters
A day A day
A week A week
Add a channel Add a channel
Add, download or delete files on this device from a computer. Add, download or delete files on this device from a computer.
Advertise Advertise
Always on when connected to power Always on when connected to power
Anything worth saying (optional) Anything worth saying (optional)
App drawer App drawer
App icons App icons
Append timestamp Append timestamp
Apr Apr
April April
Asks for 4 numbers or letters to unlock, and locks whenever the screen goes off. If you forget it, the only way back in is to reset the device, which erases everything on it. Asks for 4 numbers or letters to unlock, and locks whenever the screen goes off. If you forget it, the only way back in is to reset the device, which erases everything on it.
Aug Aug
August August
Blocked Blocked
Change PIN Change PIN
Channel Channel
Channels Channels
Chat Chat
Chat icon reset Chat icon reset
Chats Chats
Choose a PIN Choose a PIN
Clock not set Clock not set
Cmdr Cmdr
Commander Commander
Companion Companion
Connected to the computer Connected to the computer
Could not send the report. Try again later. Could not send the report. Try again later.
Count this device Count this device
Current PIN Current PIN
Cursor Cursor
Dec Dec
December December
Delete this conversation? Delete this conversation?
Device id Device id
Direct Direct
Direct message Direct message
Direct, no repeaters Direct, no repeaters
Discover Discover
Double-tap SPACE while typing to switch Double-tap SPACE while typing to switch
Emoji Emoji
Enter PIN Enter PIN
Enter it again Enter it again
Export Backup Export Backup
Feb Feb
February February
Fri Fri
Friday Friday
Has a problem Has a problem
Heard by %u repeaters Heard by %u repeaters
Heard by 1 repeater Heard by 1 repeater
Hold the trackball to switch Hold the trackball to switch
Home button opens Home button opens
I hit a problem I hit a problem
I understand I understand
If you forget your PIN, you have to reset the device If you forget your PIN, you have to reset the device
Internal Internal
It is the only way back in, and it erases everything on it: contacts, channels, messages and settings. Nobody can unlock it for you. It is the only way back in, and it erases everything on it: contacts, channels, messages and settings. Nobody can unlock it for you.
Jan Jan
January January
Join # channel Join # channel
Join Public channel Join Public channel
Jul Jul
July July
Jun Jun
June June
Keyboard and input Keyboard and input
Keyboard attached.\nRestarting in landscape in %d s. Keyboard attached.\nRestarting in landscape in %d s.
Large Large
Launcher Launcher
Launcher layout Launcher layout
Locks when screen off\n(hold the BOOT button to unlock) Locks when screen off\n(hold the BOOT button to unlock)
Map and GPS Map and GPS
Map tiles Map tiles
Mar Mar
March March
Mark all as read Mark all as read
May May
Mentions Mentions
Mentions muted Mentions muted
Mentions unmuted Mentions unmuted
Mesh · 24 h Mesh · 24 h
Message %s Message %s
Message text on lock screen Message text on lock screen
Messages muted Messages muted
Messages unmuted Messages unmuted
Minutes Minutes
Mon Mon
Monday Monday
Mute mentions Mute mentions
Mute messages Mute messages
Navigate Navigate
Never Never
New PIN New PIN
No backups available to restore. No backups available to restore.
No backups yet. Use Export Backup above to create one. No backups yet. Use Export Backup above to create one.
No channels yet No channels yet
No direct chats yet No direct chats yet
Normal\nLarge text\nHuge text Normal\nLarge text\nHuge text
Not delivered, tap to resend Not delivered, tap to resend
Nov Nov
November November
Oct Oct
October October
On On
On battery, show it for On battery, show it for
PIN changed PIN changed
PIN lock PIN lock
PIN lock off PIN lock off
PIN lock on PIN lock on
Phone-app link Phone-app link
Pick the numbers, or type the PIN Pick the numbers, or type the PIN
Preview screensaver Preview screensaver
Radio and messaging Radio and messaging
Reboot Now Reboot Now
Received %s Received %s
Receiving %s Receiving %s
Region not saved: use a-z, 0-9 and - Region not saved: use a-z, 0-9 and -
Remote Remote
Repeater Repeater
Report a bug Report a bug
Reset chat icon Reset chat icon
Room Room
Routed Routed
Running it for Running it for
Running it for: Running it for:
SD card SD card
SD unavailable - insert a FAT32 card and retry SD unavailable - insert a FAT32 card and retry
Sat Sat
Saturday Saturday
Say whether this build works on your board, so a stable release is promoted on evidence rather than on nobody having complained. A bug report opens as a QR: scan it and file it from your phone, under your own GitHub account. Say whether this build works on your board, so a stable release is promoted on evidence rather than on nobody having complained. A bug report opens as a QR: scan it and file it from your phone, under your own GitHub account.
Screen timeout Screen timeout
Screensaver Screensaver
Scroll Scroll
Scroll moves the screen; Cursor points and clicks; Navigate (experimental) moves a selection. Hold the trackball to switch between Scroll and Cursor. Scroll moves the screen; Cursor points and clicks; Navigate (experimental) moves a selection. Hold the trackball to switch between Scroll and Cursor.
Send Send
Send a test report Send a test report
Send another test report Send another test report
Sending %s Sending %s
Sending your report... Sending your report...
Sensor Sensor
Sep Sep
September September
Share my contact Share my contact
Spectrum Spectrum
Stop USB Files Stop USB Files
Storage and SD Storage and SD
Sun Sun
Sunday Sunday
Tap the EN key on the keyboard to switch Tap the EN key on the keyboard to switch
Tells the matrix how many devices run this build, so a board with no reports can be told apart from a board nobody owns. Sends the board and the version, nothing else. Tells the matrix how many devices run this build, so a board with no reports can be told apart from a board nobody owns. Sends the board and the version, nothing else.
Terminal Terminal
Test report: %s Test report: %s
Thank you. Your report is on wadamesh.com/beta Thank you. Your report is on wadamesh.com/beta
The PINs did not match The PINs did not match
The mesh around you instead of a dark screen. Every ring is a real packet. The mesh around you instead of a dark screen. Every ring is a real packet.
This is everything that leaves the device. No name, no contacts, no position. This is everything that leaves the device. No name, no contacts, no position.
Thu Thu
Thursday Thursday
Tick only what you actually used: Tick only what you actually used:
Too many chat icons Too many chat icons
Too many tries. Wait %u s Too many tries. Wait %u s
Trackball Trackball
Trackball: scroll Trackball: scroll
Transfer Transfer
Tue Tue
Tuesday Tuesday
Turn Wi-Fi on to send a report Turn Wi-Fi on to send a report
Type 4 numbers or letters Type 4 numbers or letters
USB Files USB Files
USB Files: low memory USB Files: low memory
Unmute mentions Unmute mentions
Unmute messages Unmute messages
Upload of %s stopped Upload of %s stopped
Used Used
VNC VNC
Waiting for the computer Waiting for the computer
Web Web
Wed Wed
Wednesday Wednesday
While this screen is open, the companion app cannot use USB. While this screen is open, the companion app cannot use USB.
Works Works
Wrong PIN Wrong PIN
You: You:
a week or more a week or more
about a day about a day
heard %s ago heard %s ago
hold the BOOT button to unlock hold the BOOT button to unlock
hop away hop away
hops away hops away
minutes minutes
new new
node node
nodes nodes
now now
routed routed
# Theme page and colour looks: new strings, English placeholders until translated (value = key)
A colour for every section, coloured status icons, names and glyphs in their own hue. A colour for every section, coloured status icons, names and glyphs in their own hue.
Apply and restart Apply and restart
Applying the theme, restarting… Applying the theme, restarting…
Bubbles in colour Bubbles in colour
Bubbles plain Bubbles plain
Chat icons Chat icons
Colourful bubbles Colourful bubbles
Custom Custom
Every app and page its own colour, with a little motion. Every app and page its own colour, with a little motion.
Black and white with heavy outlines, for bright sun or low vision. Black and white with heavy outlines, for bright sun or low vision.
Glyphs Glyphs
High contrast keeps its own fixed colours. High contrast keeps its own fixed colours.
Initials Initials
MORE COLORS! MORE COLORS!
Mode Mode
Names are always in colour; this colours the bubbles too. Names are always in colour; this colours the bubbles too.
Neon Neon
On my way On my way
Pastel Pastel
Preview Preview
Rainbow Rainbow
Regular Regular
Ridge at six? Ridge at six?
Taste the rainbow Taste the rainbow
Use this colour Use this colour
+237 -1
View File
@@ -1,7 +1,7 @@
# wadamesh language file
# canonical source - translators: edit this file and PR it
# code: nl
# ver: 22
# ver: 23
# name: Nederlands
# base: nl
(device behind) (apparaat loopt achter)
@@ -34,9 +34,14 @@ Accent popups: off Accent-popups: uit
Accent popups: on Accent-popups: aan
Accent colour Accentkleur
Appearance Weergave
Condense Nav (restart to apply) Compacte navigatie (herstart om toe te passen)
Condense Nav saved — restart to apply Compacte navigatie opgeslagen — herstart om toe te passen
Day Dag
High contrast Hoog contrast
High contrast - restarting to apply it… Hoog contrast - opnieuw opstarten om toe te passen…
Keyboard nav: on Toetsenbordnav.: aan
Landscape only Alleen liggend
Letters move the highlight when no text field is focused. Enter selects; hold Backspace to go back. Letters verplaatsen de markering als er geen tekstveld actief is. Enter selecteert; houd Backspace ingedrukt om terug te gaan.
Night Nacht
Theme save failed Thema opslaan mislukt
Ack Ack
@@ -1279,3 +1284,234 @@ No known Windows malware found. No known Windows malware found.
This firmware can find these but not remove them. Update wadamesh, or format the card: in Files, hold the SD card row. This firmware can find these but not remove them. Update wadamesh, or format the card: in Files, hold the SD card row.
SD Scan only removes files it recognises. If the card may be infected, the safest fix is to copy off what you need and format it completely: in Files, hold the SD card row. SD Scan only removes files it recognises. If the card may be infected, the safest fix is to copy off what you need and format it completely: in Files, hold the SD card row.
and %d more and %d more
# beta_89: new strings, English placeholders until translated (value = key)
%d nodes heard today %d nodes heard today
%lu packets heard %lu packets heard
1 node heard today 1 node heard today
1 packet heard 1 packet heard
1. Connect this device to the computer with a USB cable.\n2. Open this address in Chrome or Edge: 1. Connect this device to the computer with a USB cable.\n2. Open this address in Chrome or Edge:
3. Click Connect and choose this device. 3. Click Connect and choose this device.
4 numbers or letters 4 numbers or letters
A day A day
A week A week
Add a channel Add a channel
Add, download or delete files on this device from a computer. Add, download or delete files on this device from a computer.
Advertise Advertise
Always on when connected to power Always on when connected to power
Anything worth saying (optional) Anything worth saying (optional)
App drawer App drawer
App icons App icons
Append timestamp Append timestamp
Apr Apr
April April
Asks for 4 numbers or letters to unlock, and locks whenever the screen goes off. If you forget it, the only way back in is to reset the device, which erases everything on it. Asks for 4 numbers or letters to unlock, and locks whenever the screen goes off. If you forget it, the only way back in is to reset the device, which erases everything on it.
Aug Aug
August August
Blocked Blocked
Change PIN Change PIN
Channel Channel
Channels Channels
Chat Chat
Chat icon reset Chat icon reset
Chats Chats
Choose a PIN Choose a PIN
Clock not set Clock not set
Cmdr Cmdr
Commander Commander
Companion Companion
Connected to the computer Connected to the computer
Could not send the report. Try again later. Could not send the report. Try again later.
Count this device Count this device
Current PIN Current PIN
Cursor Cursor
Dec Dec
December December
Delete this conversation? Delete this conversation?
Device id Device id
Direct Direct
Direct message Direct message
Direct, no repeaters Direct, no repeaters
Discover Discover
Double-tap SPACE while typing to switch Double-tap SPACE while typing to switch
Emoji Emoji
Enter PIN Enter PIN
Enter it again Enter it again
Export Backup Export Backup
Feb Feb
February February
Fri Fri
Friday Friday
Has a problem Has a problem
Heard by %u repeaters Heard by %u repeaters
Heard by 1 repeater Heard by 1 repeater
Hold the trackball to switch Hold the trackball to switch
Home button opens Home button opens
I hit a problem I hit a problem
I understand I understand
If you forget your PIN, you have to reset the device If you forget your PIN, you have to reset the device
Internal Internal
It is the only way back in, and it erases everything on it: contacts, channels, messages and settings. Nobody can unlock it for you. It is the only way back in, and it erases everything on it: contacts, channels, messages and settings. Nobody can unlock it for you.
Jan Jan
January January
Join # channel Join # channel
Join Public channel Join Public channel
Jul Jul
July July
Jun Jun
June June
Keyboard and input Keyboard and input
Keyboard attached.\nRestarting in landscape in %d s. Keyboard attached.\nRestarting in landscape in %d s.
Large Large
Launcher Launcher
Launcher layout Launcher layout
Locks when screen off\n(hold the BOOT button to unlock) Locks when screen off\n(hold the BOOT button to unlock)
Map and GPS Map and GPS
Map tiles Map tiles
Mar Mar
March March
Mark all as read Mark all as read
May May
Mentions Mentions
Mentions muted Mentions muted
Mentions unmuted Mentions unmuted
Mesh · 24 h Mesh · 24 h
Message %s Message %s
Message text on lock screen Message text on lock screen
Messages muted Messages muted
Messages unmuted Messages unmuted
Minutes Minutes
Mon Mon
Monday Monday
Mute mentions Mute mentions
Mute messages Mute messages
Navigate Navigate
Never Never
New PIN New PIN
No backups available to restore. No backups available to restore.
No backups yet. Use Export Backup above to create one. No backups yet. Use Export Backup above to create one.
No channels yet No channels yet
No direct chats yet No direct chats yet
Normal\nLarge text\nHuge text Normal\nLarge text\nHuge text
Not delivered, tap to resend Not delivered, tap to resend
Nov Nov
November November
Oct Oct
October October
On On
On battery, show it for On battery, show it for
PIN changed PIN changed
PIN lock PIN lock
PIN lock off PIN lock off
PIN lock on PIN lock on
Phone-app link Phone-app link
Pick the numbers, or type the PIN Pick the numbers, or type the PIN
Preview screensaver Preview screensaver
Radio and messaging Radio and messaging
Reboot Now Reboot Now
Received %s Received %s
Receiving %s Receiving %s
Region not saved: use a-z, 0-9 and - Region not saved: use a-z, 0-9 and -
Remote Remote
Repeater Repeater
Report a bug Report a bug
Reset chat icon Reset chat icon
Room Room
Routed Routed
Running it for Running it for
Running it for: Running it for:
SD card SD card
SD unavailable - insert a FAT32 card and retry SD unavailable - insert a FAT32 card and retry
Sat Sat
Saturday Saturday
Say whether this build works on your board, so a stable release is promoted on evidence rather than on nobody having complained. A bug report opens as a QR: scan it and file it from your phone, under your own GitHub account. Say whether this build works on your board, so a stable release is promoted on evidence rather than on nobody having complained. A bug report opens as a QR: scan it and file it from your phone, under your own GitHub account.
Screen timeout Screen timeout
Screensaver Screensaver
Scroll Scroll
Scroll moves the screen; Cursor points and clicks; Navigate (experimental) moves a selection. Hold the trackball to switch between Scroll and Cursor. Scroll moves the screen; Cursor points and clicks; Navigate (experimental) moves a selection. Hold the trackball to switch between Scroll and Cursor.
Send Send
Send a test report Send a test report
Send another test report Send another test report
Sending %s Sending %s
Sending your report... Sending your report...
Sensor Sensor
Sep Sep
September September
Share my contact Share my contact
Spectrum Spectrum
Stop USB Files Stop USB Files
Storage and SD Storage and SD
Sun Sun
Sunday Sunday
Tap the EN key on the keyboard to switch Tap the EN key on the keyboard to switch
Tells the matrix how many devices run this build, so a board with no reports can be told apart from a board nobody owns. Sends the board and the version, nothing else. Tells the matrix how many devices run this build, so a board with no reports can be told apart from a board nobody owns. Sends the board and the version, nothing else.
Terminal Terminal
Test report: %s Test report: %s
Thank you. Your report is on wadamesh.com/beta Thank you. Your report is on wadamesh.com/beta
The PINs did not match The PINs did not match
The mesh around you instead of a dark screen. Every ring is a real packet. The mesh around you instead of a dark screen. Every ring is a real packet.
This is everything that leaves the device. No name, no contacts, no position. This is everything that leaves the device. No name, no contacts, no position.
Thu Thu
Thursday Thursday
Tick only what you actually used: Tick only what you actually used:
Too many chat icons Too many chat icons
Too many tries. Wait %u s Too many tries. Wait %u s
Trackball Trackball
Trackball: scroll Trackball: scroll
Transfer Transfer
Tue Tue
Tuesday Tuesday
Turn Wi-Fi on to send a report Turn Wi-Fi on to send a report
Type 4 numbers or letters Type 4 numbers or letters
USB Files USB Files
USB Files: low memory USB Files: low memory
Unmute mentions Unmute mentions
Unmute messages Unmute messages
Upload of %s stopped Upload of %s stopped
Used Used
VNC VNC
Waiting for the computer Waiting for the computer
Web Web
Wed Wed
Wednesday Wednesday
While this screen is open, the companion app cannot use USB. While this screen is open, the companion app cannot use USB.
Works Works
Wrong PIN Wrong PIN
You: You:
a week or more a week or more
about a day about a day
heard %s ago heard %s ago
hold the BOOT button to unlock hold the BOOT button to unlock
hop away hop away
hops away hops away
minutes minutes
new new
node node
nodes nodes
now now
routed routed
# Theme page and colour looks: new strings, English placeholders until translated (value = key)
A colour for every section, coloured status icons, names and glyphs in their own hue. A colour for every section, coloured status icons, names and glyphs in their own hue.
Apply and restart Apply and restart
Applying the theme, restarting… Applying the theme, restarting…
Bubbles in colour Bubbles in colour
Bubbles plain Bubbles plain
Chat icons Chat icons
Colourful bubbles Colourful bubbles
Custom Custom
Every app and page its own colour, with a little motion. Every app and page its own colour, with a little motion.
Black and white with heavy outlines, for bright sun or low vision. Black and white with heavy outlines, for bright sun or low vision.
Glyphs Glyphs
High contrast keeps its own fixed colours. High contrast keeps its own fixed colours.
Initials Initials
MORE COLORS! MORE COLORS!
Mode Mode
Names are always in colour; this colours the bubbles too. Names are always in colour; this colours the bubbles too.
Neon Neon
On my way On my way
Pastel Pastel
Preview Preview
Rainbow Rainbow
Regular Regular
Ridge at six? Ridge at six?
Taste the rainbow Taste the rainbow
Use this colour Use this colour
+237 -1
View File
@@ -1,7 +1,7 @@
# wadamesh language file
# canonical source - translators: edit this file and PR it
# code: pt-br
# ver: 22
# ver: 23
# name: Português (BR)
# base: pt-br
(device behind) (dispositivo atrasado)
@@ -34,9 +34,14 @@ Accent popups: off Pop-ups de acento: desligados
Accent popups: on Pop-ups de acento: ligados
Accent colour Cor de destaque
Appearance Aparência
Condense Nav (restart to apply) Navegação compacta (reinicie para aplicar)
Condense Nav saved — restart to apply Navegação compacta salva — reinicie para aplicar
Day Dia
High contrast Alto contraste
High contrast - restarting to apply it… Alto contraste - reiniciando para aplicar…
Keyboard nav: on Nav. teclado: ligado
Landscape only Somente em paisagem
Letters move the highlight when no text field is focused. Enter selects; hold Backspace to go back. As letras movem o destaque quando nenhum campo de texto está ativo. Enter seleciona; segure Backspace para voltar.
Night Noite
Theme save failed Falha ao salvar o tema
Ack Ack
@@ -1281,3 +1286,234 @@ No known Windows malware found. No known Windows malware found.
This firmware can find these but not remove them. Update wadamesh, or format the card: in Files, hold the SD card row. This firmware can find these but not remove them. Update wadamesh, or format the card: in Files, hold the SD card row.
SD Scan only removes files it recognises. If the card may be infected, the safest fix is to copy off what you need and format it completely: in Files, hold the SD card row. SD Scan only removes files it recognises. If the card may be infected, the safest fix is to copy off what you need and format it completely: in Files, hold the SD card row.
and %d more and %d more
# beta_89: new strings, English placeholders until translated (value = key)
%d nodes heard today %d nodes heard today
%lu packets heard %lu packets heard
1 node heard today 1 node heard today
1 packet heard 1 packet heard
1. Connect this device to the computer with a USB cable.\n2. Open this address in Chrome or Edge: 1. Connect this device to the computer with a USB cable.\n2. Open this address in Chrome or Edge:
3. Click Connect and choose this device. 3. Click Connect and choose this device.
4 numbers or letters 4 numbers or letters
A day A day
A week A week
Add a channel Add a channel
Add, download or delete files on this device from a computer. Add, download or delete files on this device from a computer.
Advertise Advertise
Always on when connected to power Always on when connected to power
Anything worth saying (optional) Anything worth saying (optional)
App drawer App drawer
App icons App icons
Append timestamp Append timestamp
Apr Apr
April April
Asks for 4 numbers or letters to unlock, and locks whenever the screen goes off. If you forget it, the only way back in is to reset the device, which erases everything on it. Asks for 4 numbers or letters to unlock, and locks whenever the screen goes off. If you forget it, the only way back in is to reset the device, which erases everything on it.
Aug Aug
August August
Blocked Blocked
Change PIN Change PIN
Channel Channel
Channels Channels
Chat Chat
Chat icon reset Chat icon reset
Chats Chats
Choose a PIN Choose a PIN
Clock not set Clock not set
Cmdr Cmdr
Commander Commander
Companion Companion
Connected to the computer Connected to the computer
Could not send the report. Try again later. Could not send the report. Try again later.
Count this device Count this device
Current PIN Current PIN
Cursor Cursor
Dec Dec
December December
Delete this conversation? Delete this conversation?
Device id Device id
Direct Direct
Direct message Direct message
Direct, no repeaters Direct, no repeaters
Discover Discover
Double-tap SPACE while typing to switch Double-tap SPACE while typing to switch
Emoji Emoji
Enter PIN Enter PIN
Enter it again Enter it again
Export Backup Export Backup
Feb Feb
February February
Fri Fri
Friday Friday
Has a problem Has a problem
Heard by %u repeaters Heard by %u repeaters
Heard by 1 repeater Heard by 1 repeater
Hold the trackball to switch Hold the trackball to switch
Home button opens Home button opens
I hit a problem I hit a problem
I understand I understand
If you forget your PIN, you have to reset the device If you forget your PIN, you have to reset the device
Internal Internal
It is the only way back in, and it erases everything on it: contacts, channels, messages and settings. Nobody can unlock it for you. It is the only way back in, and it erases everything on it: contacts, channels, messages and settings. Nobody can unlock it for you.
Jan Jan
January January
Join # channel Join # channel
Join Public channel Join Public channel
Jul Jul
July July
Jun Jun
June June
Keyboard and input Keyboard and input
Keyboard attached.\nRestarting in landscape in %d s. Keyboard attached.\nRestarting in landscape in %d s.
Large Large
Launcher Launcher
Launcher layout Launcher layout
Locks when screen off\n(hold the BOOT button to unlock) Locks when screen off\n(hold the BOOT button to unlock)
Map and GPS Map and GPS
Map tiles Map tiles
Mar Mar
March March
Mark all as read Mark all as read
May May
Mentions Mentions
Mentions muted Mentions muted
Mentions unmuted Mentions unmuted
Mesh · 24 h Mesh · 24 h
Message %s Message %s
Message text on lock screen Message text on lock screen
Messages muted Messages muted
Messages unmuted Messages unmuted
Minutes Minutes
Mon Mon
Monday Monday
Mute mentions Mute mentions
Mute messages Mute messages
Navigate Navigate
Never Never
New PIN New PIN
No backups available to restore. No backups available to restore.
No backups yet. Use Export Backup above to create one. No backups yet. Use Export Backup above to create one.
No channels yet No channels yet
No direct chats yet No direct chats yet
Normal\nLarge text\nHuge text Normal\nLarge text\nHuge text
Not delivered, tap to resend Not delivered, tap to resend
Nov Nov
November November
Oct Oct
October October
On On
On battery, show it for On battery, show it for
PIN changed PIN changed
PIN lock PIN lock
PIN lock off PIN lock off
PIN lock on PIN lock on
Phone-app link Phone-app link
Pick the numbers, or type the PIN Pick the numbers, or type the PIN
Preview screensaver Preview screensaver
Radio and messaging Radio and messaging
Reboot Now Reboot Now
Received %s Received %s
Receiving %s Receiving %s
Region not saved: use a-z, 0-9 and - Region not saved: use a-z, 0-9 and -
Remote Remote
Repeater Repeater
Report a bug Report a bug
Reset chat icon Reset chat icon
Room Room
Routed Routed
Running it for Running it for
Running it for: Running it for:
SD card SD card
SD unavailable - insert a FAT32 card and retry SD unavailable - insert a FAT32 card and retry
Sat Sat
Saturday Saturday
Say whether this build works on your board, so a stable release is promoted on evidence rather than on nobody having complained. A bug report opens as a QR: scan it and file it from your phone, under your own GitHub account. Say whether this build works on your board, so a stable release is promoted on evidence rather than on nobody having complained. A bug report opens as a QR: scan it and file it from your phone, under your own GitHub account.
Screen timeout Screen timeout
Screensaver Screensaver
Scroll Scroll
Scroll moves the screen; Cursor points and clicks; Navigate (experimental) moves a selection. Hold the trackball to switch between Scroll and Cursor. Scroll moves the screen; Cursor points and clicks; Navigate (experimental) moves a selection. Hold the trackball to switch between Scroll and Cursor.
Send Send
Send a test report Send a test report
Send another test report Send another test report
Sending %s Sending %s
Sending your report... Sending your report...
Sensor Sensor
Sep Sep
September September
Share my contact Share my contact
Spectrum Spectrum
Stop USB Files Stop USB Files
Storage and SD Storage and SD
Sun Sun
Sunday Sunday
Tap the EN key on the keyboard to switch Tap the EN key on the keyboard to switch
Tells the matrix how many devices run this build, so a board with no reports can be told apart from a board nobody owns. Sends the board and the version, nothing else. Tells the matrix how many devices run this build, so a board with no reports can be told apart from a board nobody owns. Sends the board and the version, nothing else.
Terminal Terminal
Test report: %s Test report: %s
Thank you. Your report is on wadamesh.com/beta Thank you. Your report is on wadamesh.com/beta
The PINs did not match The PINs did not match
The mesh around you instead of a dark screen. Every ring is a real packet. The mesh around you instead of a dark screen. Every ring is a real packet.
This is everything that leaves the device. No name, no contacts, no position. This is everything that leaves the device. No name, no contacts, no position.
Thu Thu
Thursday Thursday
Tick only what you actually used: Tick only what you actually used:
Too many chat icons Too many chat icons
Too many tries. Wait %u s Too many tries. Wait %u s
Trackball Trackball
Trackball: scroll Trackball: scroll
Transfer Transfer
Tue Tue
Tuesday Tuesday
Turn Wi-Fi on to send a report Turn Wi-Fi on to send a report
Type 4 numbers or letters Type 4 numbers or letters
USB Files USB Files
USB Files: low memory USB Files: low memory
Unmute mentions Unmute mentions
Unmute messages Unmute messages
Upload of %s stopped Upload of %s stopped
Used Used
VNC VNC
Waiting for the computer Waiting for the computer
Web Web
Wed Wed
Wednesday Wednesday
While this screen is open, the companion app cannot use USB. While this screen is open, the companion app cannot use USB.
Works Works
Wrong PIN Wrong PIN
You: You:
a week or more a week or more
about a day about a day
heard %s ago heard %s ago
hold the BOOT button to unlock hold the BOOT button to unlock
hop away hop away
hops away hops away
minutes minutes
new new
node node
nodes nodes
now now
routed routed
# Theme page and colour looks: new strings, English placeholders until translated (value = key)
A colour for every section, coloured status icons, names and glyphs in their own hue. A colour for every section, coloured status icons, names and glyphs in their own hue.
Apply and restart Apply and restart
Applying the theme, restarting… Applying the theme, restarting…
Bubbles in colour Bubbles in colour
Bubbles plain Bubbles plain
Chat icons Chat icons
Colourful bubbles Colourful bubbles
Custom Custom
Every app and page its own colour, with a little motion. Every app and page its own colour, with a little motion.
Black and white with heavy outlines, for bright sun or low vision. Black and white with heavy outlines, for bright sun or low vision.
Glyphs Glyphs
High contrast keeps its own fixed colours. High contrast keeps its own fixed colours.
Initials Initials
MORE COLORS! MORE COLORS!
Mode Mode
Names are always in colour; this colours the bubbles too. Names are always in colour; this colours the bubbles too.
Neon Neon
On my way On my way
Pastel Pastel
Preview Preview
Rainbow Rainbow
Regular Regular
Ridge at six? Ridge at six?
Taste the rainbow Taste the rainbow
Use this colour Use this colour
+237 -1
View File
@@ -1,7 +1,7 @@
# wadamesh language file
# canonical source - translators: edit this file and PR it
# code: ro
# ver: 22
# ver: 23
# name: Română
# base: ro
(device behind) (dispozitiv în urmă)
@@ -34,9 +34,14 @@ Accent popups: off Popupuri accente: oprite
Accent popups: on Popupuri accente: pornite
Accent colour Culoare de accent
Appearance Aspect
Condense Nav (restart to apply) Navigare compactă (repornire pentru aplicare)
Condense Nav saved — restart to apply Navigare compactă salvată — reporneşte pentru aplicare
Day Zi
High contrast Contrast ridicat
High contrast - restarting to apply it… Contrast ridicat - repornire pentru aplicare…
Keyboard nav: on Navigare tastatură: pornită
Landscape only Doar în modul peisaj
Letters move the highlight when no text field is focused. Enter selects; hold Backspace to go back. Literele mută selecția când niciun câmp de text nu este activ. Enter selectează; ține apăsat Backspace pentru înapoi.
Night Noapte
Theme save failed Salvarea temei a eșuat
Ack Ack
@@ -1283,3 +1288,234 @@ No known Windows malware found. No known Windows malware found.
This firmware can find these but not remove them. Update wadamesh, or format the card: in Files, hold the SD card row. This firmware can find these but not remove them. Update wadamesh, or format the card: in Files, hold the SD card row.
SD Scan only removes files it recognises. If the card may be infected, the safest fix is to copy off what you need and format it completely: in Files, hold the SD card row. SD Scan only removes files it recognises. If the card may be infected, the safest fix is to copy off what you need and format it completely: in Files, hold the SD card row.
and %d more and %d more
# beta_89: new strings, English placeholders until translated (value = key)
%d nodes heard today %d nodes heard today
%lu packets heard %lu packets heard
1 node heard today 1 node heard today
1 packet heard 1 packet heard
1. Connect this device to the computer with a USB cable.\n2. Open this address in Chrome or Edge: 1. Connect this device to the computer with a USB cable.\n2. Open this address in Chrome or Edge:
3. Click Connect and choose this device. 3. Click Connect and choose this device.
4 numbers or letters 4 numbers or letters
A day A day
A week A week
Add a channel Add a channel
Add, download or delete files on this device from a computer. Add, download or delete files on this device from a computer.
Advertise Advertise
Always on when connected to power Always on when connected to power
Anything worth saying (optional) Anything worth saying (optional)
App drawer App drawer
App icons App icons
Append timestamp Append timestamp
Apr Apr
April April
Asks for 4 numbers or letters to unlock, and locks whenever the screen goes off. If you forget it, the only way back in is to reset the device, which erases everything on it. Asks for 4 numbers or letters to unlock, and locks whenever the screen goes off. If you forget it, the only way back in is to reset the device, which erases everything on it.
Aug Aug
August August
Blocked Blocked
Change PIN Change PIN
Channel Channel
Channels Channels
Chat Chat
Chat icon reset Chat icon reset
Chats Chats
Choose a PIN Choose a PIN
Clock not set Clock not set
Cmdr Cmdr
Commander Commander
Companion Companion
Connected to the computer Connected to the computer
Could not send the report. Try again later. Could not send the report. Try again later.
Count this device Count this device
Current PIN Current PIN
Cursor Cursor
Dec Dec
December December
Delete this conversation? Delete this conversation?
Device id Device id
Direct Direct
Direct message Direct message
Direct, no repeaters Direct, no repeaters
Discover Discover
Double-tap SPACE while typing to switch Double-tap SPACE while typing to switch
Emoji Emoji
Enter PIN Enter PIN
Enter it again Enter it again
Export Backup Export Backup
Feb Feb
February February
Fri Fri
Friday Friday
Has a problem Has a problem
Heard by %u repeaters Heard by %u repeaters
Heard by 1 repeater Heard by 1 repeater
Hold the trackball to switch Hold the trackball to switch
Home button opens Home button opens
I hit a problem I hit a problem
I understand I understand
If you forget your PIN, you have to reset the device If you forget your PIN, you have to reset the device
Internal Internal
It is the only way back in, and it erases everything on it: contacts, channels, messages and settings. Nobody can unlock it for you. It is the only way back in, and it erases everything on it: contacts, channels, messages and settings. Nobody can unlock it for you.
Jan Jan
January January
Join # channel Join # channel
Join Public channel Join Public channel
Jul Jul
July July
Jun Jun
June June
Keyboard and input Keyboard and input
Keyboard attached.\nRestarting in landscape in %d s. Keyboard attached.\nRestarting in landscape in %d s.
Large Large
Launcher Launcher
Launcher layout Launcher layout
Locks when screen off\n(hold the BOOT button to unlock) Locks when screen off\n(hold the BOOT button to unlock)
Map and GPS Map and GPS
Map tiles Map tiles
Mar Mar
March March
Mark all as read Mark all as read
May May
Mentions Mentions
Mentions muted Mentions muted
Mentions unmuted Mentions unmuted
Mesh · 24 h Mesh · 24 h
Message %s Message %s
Message text on lock screen Message text on lock screen
Messages muted Messages muted
Messages unmuted Messages unmuted
Minutes Minutes
Mon Mon
Monday Monday
Mute mentions Mute mentions
Mute messages Mute messages
Navigate Navigate
Never Never
New PIN New PIN
No backups available to restore. No backups available to restore.
No backups yet. Use Export Backup above to create one. No backups yet. Use Export Backup above to create one.
No channels yet No channels yet
No direct chats yet No direct chats yet
Normal\nLarge text\nHuge text Normal\nLarge text\nHuge text
Not delivered, tap to resend Not delivered, tap to resend
Nov Nov
November November
Oct Oct
October October
On On
On battery, show it for On battery, show it for
PIN changed PIN changed
PIN lock PIN lock
PIN lock off PIN lock off
PIN lock on PIN lock on
Phone-app link Phone-app link
Pick the numbers, or type the PIN Pick the numbers, or type the PIN
Preview screensaver Preview screensaver
Radio and messaging Radio and messaging
Reboot Now Reboot Now
Received %s Received %s
Receiving %s Receiving %s
Region not saved: use a-z, 0-9 and - Region not saved: use a-z, 0-9 and -
Remote Remote
Repeater Repeater
Report a bug Report a bug
Reset chat icon Reset chat icon
Room Room
Routed Routed
Running it for Running it for
Running it for: Running it for:
SD card SD card
SD unavailable - insert a FAT32 card and retry SD unavailable - insert a FAT32 card and retry
Sat Sat
Saturday Saturday
Say whether this build works on your board, so a stable release is promoted on evidence rather than on nobody having complained. A bug report opens as a QR: scan it and file it from your phone, under your own GitHub account. Say whether this build works on your board, so a stable release is promoted on evidence rather than on nobody having complained. A bug report opens as a QR: scan it and file it from your phone, under your own GitHub account.
Screen timeout Screen timeout
Screensaver Screensaver
Scroll Scroll
Scroll moves the screen; Cursor points and clicks; Navigate (experimental) moves a selection. Hold the trackball to switch between Scroll and Cursor. Scroll moves the screen; Cursor points and clicks; Navigate (experimental) moves a selection. Hold the trackball to switch between Scroll and Cursor.
Send Send
Send a test report Send a test report
Send another test report Send another test report
Sending %s Sending %s
Sending your report... Sending your report...
Sensor Sensor
Sep Sep
September September
Share my contact Share my contact
Spectrum Spectrum
Stop USB Files Stop USB Files
Storage and SD Storage and SD
Sun Sun
Sunday Sunday
Tap the EN key on the keyboard to switch Tap the EN key on the keyboard to switch
Tells the matrix how many devices run this build, so a board with no reports can be told apart from a board nobody owns. Sends the board and the version, nothing else. Tells the matrix how many devices run this build, so a board with no reports can be told apart from a board nobody owns. Sends the board and the version, nothing else.
Terminal Terminal
Test report: %s Test report: %s
Thank you. Your report is on wadamesh.com/beta Thank you. Your report is on wadamesh.com/beta
The PINs did not match The PINs did not match
The mesh around you instead of a dark screen. Every ring is a real packet. The mesh around you instead of a dark screen. Every ring is a real packet.
This is everything that leaves the device. No name, no contacts, no position. This is everything that leaves the device. No name, no contacts, no position.
Thu Thu
Thursday Thursday
Tick only what you actually used: Tick only what you actually used:
Too many chat icons Too many chat icons
Too many tries. Wait %u s Too many tries. Wait %u s
Trackball Trackball
Trackball: scroll Trackball: scroll
Transfer Transfer
Tue Tue
Tuesday Tuesday
Turn Wi-Fi on to send a report Turn Wi-Fi on to send a report
Type 4 numbers or letters Type 4 numbers or letters
USB Files USB Files
USB Files: low memory USB Files: low memory
Unmute mentions Unmute mentions
Unmute messages Unmute messages
Upload of %s stopped Upload of %s stopped
Used Used
VNC VNC
Waiting for the computer Waiting for the computer
Web Web
Wed Wed
Wednesday Wednesday
While this screen is open, the companion app cannot use USB. While this screen is open, the companion app cannot use USB.
Works Works
Wrong PIN Wrong PIN
You: You:
a week or more a week or more
about a day about a day
heard %s ago heard %s ago
hold the BOOT button to unlock hold the BOOT button to unlock
hop away hop away
hops away hops away
minutes minutes
new new
node node
nodes nodes
now now
routed routed
# Theme page and colour looks: new strings, English placeholders until translated (value = key)
A colour for every section, coloured status icons, names and glyphs in their own hue. A colour for every section, coloured status icons, names and glyphs in their own hue.
Apply and restart Apply and restart
Applying the theme, restarting… Applying the theme, restarting…
Bubbles in colour Bubbles in colour
Bubbles plain Bubbles plain
Chat icons Chat icons
Colourful bubbles Colourful bubbles
Custom Custom
Every app and page its own colour, with a little motion. Every app and page its own colour, with a little motion.
Black and white with heavy outlines, for bright sun or low vision. Black and white with heavy outlines, for bright sun or low vision.
Glyphs Glyphs
High contrast keeps its own fixed colours. High contrast keeps its own fixed colours.
Initials Initials
MORE COLORS! MORE COLORS!
Mode Mode
Names are always in colour; this colours the bubbles too. Names are always in colour; this colours the bubbles too.
Neon Neon
On my way On my way
Pastel Pastel
Preview Preview
Rainbow Rainbow
Regular Regular
Ridge at six? Ridge at six?
Taste the rainbow Taste the rainbow
Use this colour Use this colour
+237 -1
View File
@@ -1,7 +1,7 @@
# wadamesh language file
# canonical source - translators: edit this file and PR it
# code: ru
# ver: 22
# ver: 23
# name: Русский
# base: ru
(device behind) (устройство отстаёт)
@@ -34,9 +34,14 @@ Accent popups: off Подсказки акцентов: выкл
Accent popups: on Подсказки акцентов: вкл
Accent colour Акцентный цвет
Appearance Оформление
Condense Nav (restart to apply) Компактная навигация (перезапуск для применения)
Condense Nav saved — restart to apply Компактная навигация сохранена — перезапуск для применения
Day День
High contrast Высокая контрастность
High contrast - restarting to apply it… Высокая контрастность - перезагрузка для применения…
Keyboard nav: on Навигация клавиатурой: вкл.
Landscape only Только в альбомной ориентации
Letters move the highlight when no text field is focused. Enter selects; hold Backspace to go back. Буквы перемещают выделение, когда не активно текстовое поле. Enter выбирает; удерживайте Backspace, чтобы вернуться.
Night Ночь
Theme save failed Не удалось сохранить тему
Ack Подтв.
@@ -1282,3 +1287,234 @@ No known Windows malware found. No known Windows malware found.
This firmware can find these but not remove them. Update wadamesh, or format the card: in Files, hold the SD card row. This firmware can find these but not remove them. Update wadamesh, or format the card: in Files, hold the SD card row.
SD Scan only removes files it recognises. If the card may be infected, the safest fix is to copy off what you need and format it completely: in Files, hold the SD card row. SD Scan only removes files it recognises. If the card may be infected, the safest fix is to copy off what you need and format it completely: in Files, hold the SD card row.
and %d more and %d more
# beta_89: new strings, English placeholders until translated (value = key)
%d nodes heard today %d nodes heard today
%lu packets heard %lu packets heard
1 node heard today 1 node heard today
1 packet heard 1 packet heard
1. Connect this device to the computer with a USB cable.\n2. Open this address in Chrome or Edge: 1. Connect this device to the computer with a USB cable.\n2. Open this address in Chrome or Edge:
3. Click Connect and choose this device. 3. Click Connect and choose this device.
4 numbers or letters 4 numbers or letters
A day A day
A week A week
Add a channel Add a channel
Add, download or delete files on this device from a computer. Add, download or delete files on this device from a computer.
Advertise Advertise
Always on when connected to power Always on when connected to power
Anything worth saying (optional) Anything worth saying (optional)
App drawer App drawer
App icons App icons
Append timestamp Append timestamp
Apr Apr
April April
Asks for 4 numbers or letters to unlock, and locks whenever the screen goes off. If you forget it, the only way back in is to reset the device, which erases everything on it. Asks for 4 numbers or letters to unlock, and locks whenever the screen goes off. If you forget it, the only way back in is to reset the device, which erases everything on it.
Aug Aug
August August
Blocked Blocked
Change PIN Change PIN
Channel Channel
Channels Channels
Chat Chat
Chat icon reset Chat icon reset
Chats Chats
Choose a PIN Choose a PIN
Clock not set Clock not set
Cmdr Cmdr
Commander Commander
Companion Companion
Connected to the computer Connected to the computer
Could not send the report. Try again later. Could not send the report. Try again later.
Count this device Count this device
Current PIN Current PIN
Cursor Cursor
Dec Dec
December December
Delete this conversation? Delete this conversation?
Device id Device id
Direct Direct
Direct message Direct message
Direct, no repeaters Direct, no repeaters
Discover Discover
Double-tap SPACE while typing to switch Double-tap SPACE while typing to switch
Emoji Emoji
Enter PIN Enter PIN
Enter it again Enter it again
Export Backup Export Backup
Feb Feb
February February
Fri Fri
Friday Friday
Has a problem Has a problem
Heard by %u repeaters Heard by %u repeaters
Heard by 1 repeater Heard by 1 repeater
Hold the trackball to switch Hold the trackball to switch
Home button opens Home button opens
I hit a problem I hit a problem
I understand I understand
If you forget your PIN, you have to reset the device If you forget your PIN, you have to reset the device
Internal Internal
It is the only way back in, and it erases everything on it: contacts, channels, messages and settings. Nobody can unlock it for you. It is the only way back in, and it erases everything on it: contacts, channels, messages and settings. Nobody can unlock it for you.
Jan Jan
January January
Join # channel Join # channel
Join Public channel Join Public channel
Jul Jul
July July
Jun Jun
June June
Keyboard and input Keyboard and input
Keyboard attached.\nRestarting in landscape in %d s. Keyboard attached.\nRestarting in landscape in %d s.
Large Large
Launcher Launcher
Launcher layout Launcher layout
Locks when screen off\n(hold the BOOT button to unlock) Locks when screen off\n(hold the BOOT button to unlock)
Map and GPS Map and GPS
Map tiles Map tiles
Mar Mar
March March
Mark all as read Mark all as read
May May
Mentions Mentions
Mentions muted Mentions muted
Mentions unmuted Mentions unmuted
Mesh · 24 h Mesh · 24 h
Message %s Message %s
Message text on lock screen Message text on lock screen
Messages muted Messages muted
Messages unmuted Messages unmuted
Minutes Minutes
Mon Mon
Monday Monday
Mute mentions Mute mentions
Mute messages Mute messages
Navigate Navigate
Never Never
New PIN New PIN
No backups available to restore. No backups available to restore.
No backups yet. Use Export Backup above to create one. No backups yet. Use Export Backup above to create one.
No channels yet No channels yet
No direct chats yet No direct chats yet
Normal\nLarge text\nHuge text Normal\nLarge text\nHuge text
Not delivered, tap to resend Not delivered, tap to resend
Nov Nov
November November
Oct Oct
October October
On On
On battery, show it for On battery, show it for
PIN changed PIN changed
PIN lock PIN lock
PIN lock off PIN lock off
PIN lock on PIN lock on
Phone-app link Phone-app link
Pick the numbers, or type the PIN Pick the numbers, or type the PIN
Preview screensaver Preview screensaver
Radio and messaging Radio and messaging
Reboot Now Reboot Now
Received %s Received %s
Receiving %s Receiving %s
Region not saved: use a-z, 0-9 and - Region not saved: use a-z, 0-9 and -
Remote Remote
Repeater Repeater
Report a bug Report a bug
Reset chat icon Reset chat icon
Room Room
Routed Routed
Running it for Running it for
Running it for: Running it for:
SD card SD card
SD unavailable - insert a FAT32 card and retry SD unavailable - insert a FAT32 card and retry
Sat Sat
Saturday Saturday
Say whether this build works on your board, so a stable release is promoted on evidence rather than on nobody having complained. A bug report opens as a QR: scan it and file it from your phone, under your own GitHub account. Say whether this build works on your board, so a stable release is promoted on evidence rather than on nobody having complained. A bug report opens as a QR: scan it and file it from your phone, under your own GitHub account.
Screen timeout Screen timeout
Screensaver Screensaver
Scroll Scroll
Scroll moves the screen; Cursor points and clicks; Navigate (experimental) moves a selection. Hold the trackball to switch between Scroll and Cursor. Scroll moves the screen; Cursor points and clicks; Navigate (experimental) moves a selection. Hold the trackball to switch between Scroll and Cursor.
Send Send
Send a test report Send a test report
Send another test report Send another test report
Sending %s Sending %s
Sending your report... Sending your report...
Sensor Sensor
Sep Sep
September September
Share my contact Share my contact
Spectrum Spectrum
Stop USB Files Stop USB Files
Storage and SD Storage and SD
Sun Sun
Sunday Sunday
Tap the EN key on the keyboard to switch Tap the EN key on the keyboard to switch
Tells the matrix how many devices run this build, so a board with no reports can be told apart from a board nobody owns. Sends the board and the version, nothing else. Tells the matrix how many devices run this build, so a board with no reports can be told apart from a board nobody owns. Sends the board and the version, nothing else.
Terminal Terminal
Test report: %s Test report: %s
Thank you. Your report is on wadamesh.com/beta Thank you. Your report is on wadamesh.com/beta
The PINs did not match The PINs did not match
The mesh around you instead of a dark screen. Every ring is a real packet. The mesh around you instead of a dark screen. Every ring is a real packet.
This is everything that leaves the device. No name, no contacts, no position. This is everything that leaves the device. No name, no contacts, no position.
Thu Thu
Thursday Thursday
Tick only what you actually used: Tick only what you actually used:
Too many chat icons Too many chat icons
Too many tries. Wait %u s Too many tries. Wait %u s
Trackball Trackball
Trackball: scroll Trackball: scroll
Transfer Transfer
Tue Tue
Tuesday Tuesday
Turn Wi-Fi on to send a report Turn Wi-Fi on to send a report
Type 4 numbers or letters Type 4 numbers or letters
USB Files USB Files
USB Files: low memory USB Files: low memory
Unmute mentions Unmute mentions
Unmute messages Unmute messages
Upload of %s stopped Upload of %s stopped
Used Used
VNC VNC
Waiting for the computer Waiting for the computer
Web Web
Wed Wed
Wednesday Wednesday
While this screen is open, the companion app cannot use USB. While this screen is open, the companion app cannot use USB.
Works Works
Wrong PIN Wrong PIN
You: You:
a week or more a week or more
about a day about a day
heard %s ago heard %s ago
hold the BOOT button to unlock hold the BOOT button to unlock
hop away hop away
hops away hops away
minutes minutes
new new
node node
nodes nodes
now now
routed routed
# Theme page and colour looks: new strings, English placeholders until translated (value = key)
A colour for every section, coloured status icons, names and glyphs in their own hue. A colour for every section, coloured status icons, names and glyphs in their own hue.
Apply and restart Apply and restart
Applying the theme, restarting… Applying the theme, restarting…
Bubbles in colour Bubbles in colour
Bubbles plain Bubbles plain
Chat icons Chat icons
Colourful bubbles Colourful bubbles
Custom Custom
Every app and page its own colour, with a little motion. Every app and page its own colour, with a little motion.
Black and white with heavy outlines, for bright sun or low vision. Black and white with heavy outlines, for bright sun or low vision.
Glyphs Glyphs
High contrast keeps its own fixed colours. High contrast keeps its own fixed colours.
Initials Initials
MORE COLORS! MORE COLORS!
Mode Mode
Names are always in colour; this colours the bubbles too. Names are always in colour; this colours the bubbles too.
Neon Neon
On my way On my way
Pastel Pastel
Preview Preview
Rainbow Rainbow
Regular Regular
Ridge at six? Ridge at six?
Taste the rainbow Taste the rainbow
Use this colour Use this colour
+237 -1
View File
@@ -1,7 +1,7 @@
# wadamesh language file
# canonical source - translators: edit this file and PR it
# code: sr
# ver: 22
# ver: 23
# name: Српски
# base: sr
(device behind) (уређај касни)
@@ -34,9 +34,14 @@ Accent popups: off Искачући акценти: искљ
Accent popups: on Искачући акценти: укљ
Accent colour Акцентна боја
Appearance Изглед
Condense Nav (restart to apply) Компактна навигација (рестарт за примену)
Condense Nav saved — restart to apply Компактна навигација сачувана — рестарт за примену
Day Дан
High contrast Висок контраст
High contrast - restarting to apply it… Висок контраст - рестартовање ради примене…
Keyboard nav: on Навиг. тастатуром: укљ.
Landscape only Само у хоризонталном положају
Letters move the highlight when no text field is focused. Enter selects; hold Backspace to go back. Слова померају истицање када ниједно текстуално поље није активно. Enter бира; држите Backspace за назад.
Night Ноћ
Theme save failed Чување теме није успело
Ack Ack
@@ -1282,3 +1287,234 @@ No known Windows malware found. No known Windows malware found.
This firmware can find these but not remove them. Update wadamesh, or format the card: in Files, hold the SD card row. This firmware can find these but not remove them. Update wadamesh, or format the card: in Files, hold the SD card row.
SD Scan only removes files it recognises. If the card may be infected, the safest fix is to copy off what you need and format it completely: in Files, hold the SD card row. SD Scan only removes files it recognises. If the card may be infected, the safest fix is to copy off what you need and format it completely: in Files, hold the SD card row.
and %d more and %d more
# beta_89: new strings, English placeholders until translated (value = key)
%d nodes heard today %d nodes heard today
%lu packets heard %lu packets heard
1 node heard today 1 node heard today
1 packet heard 1 packet heard
1. Connect this device to the computer with a USB cable.\n2. Open this address in Chrome or Edge: 1. Connect this device to the computer with a USB cable.\n2. Open this address in Chrome or Edge:
3. Click Connect and choose this device. 3. Click Connect and choose this device.
4 numbers or letters 4 numbers or letters
A day A day
A week A week
Add a channel Add a channel
Add, download or delete files on this device from a computer. Add, download or delete files on this device from a computer.
Advertise Advertise
Always on when connected to power Always on when connected to power
Anything worth saying (optional) Anything worth saying (optional)
App drawer App drawer
App icons App icons
Append timestamp Append timestamp
Apr Apr
April April
Asks for 4 numbers or letters to unlock, and locks whenever the screen goes off. If you forget it, the only way back in is to reset the device, which erases everything on it. Asks for 4 numbers or letters to unlock, and locks whenever the screen goes off. If you forget it, the only way back in is to reset the device, which erases everything on it.
Aug Aug
August August
Blocked Blocked
Change PIN Change PIN
Channel Channel
Channels Channels
Chat Chat
Chat icon reset Chat icon reset
Chats Chats
Choose a PIN Choose a PIN
Clock not set Clock not set
Cmdr Cmdr
Commander Commander
Companion Companion
Connected to the computer Connected to the computer
Could not send the report. Try again later. Could not send the report. Try again later.
Count this device Count this device
Current PIN Current PIN
Cursor Cursor
Dec Dec
December December
Delete this conversation? Delete this conversation?
Device id Device id
Direct Direct
Direct message Direct message
Direct, no repeaters Direct, no repeaters
Discover Discover
Double-tap SPACE while typing to switch Double-tap SPACE while typing to switch
Emoji Emoji
Enter PIN Enter PIN
Enter it again Enter it again
Export Backup Export Backup
Feb Feb
February February
Fri Fri
Friday Friday
Has a problem Has a problem
Heard by %u repeaters Heard by %u repeaters
Heard by 1 repeater Heard by 1 repeater
Hold the trackball to switch Hold the trackball to switch
Home button opens Home button opens
I hit a problem I hit a problem
I understand I understand
If you forget your PIN, you have to reset the device If you forget your PIN, you have to reset the device
Internal Internal
It is the only way back in, and it erases everything on it: contacts, channels, messages and settings. Nobody can unlock it for you. It is the only way back in, and it erases everything on it: contacts, channels, messages and settings. Nobody can unlock it for you.
Jan Jan
January January
Join # channel Join # channel
Join Public channel Join Public channel
Jul Jul
July July
Jun Jun
June June
Keyboard and input Keyboard and input
Keyboard attached.\nRestarting in landscape in %d s. Keyboard attached.\nRestarting in landscape in %d s.
Large Large
Launcher Launcher
Launcher layout Launcher layout
Locks when screen off\n(hold the BOOT button to unlock) Locks when screen off\n(hold the BOOT button to unlock)
Map and GPS Map and GPS
Map tiles Map tiles
Mar Mar
March March
Mark all as read Mark all as read
May May
Mentions Mentions
Mentions muted Mentions muted
Mentions unmuted Mentions unmuted
Mesh · 24 h Mesh · 24 h
Message %s Message %s
Message text on lock screen Message text on lock screen
Messages muted Messages muted
Messages unmuted Messages unmuted
Minutes Minutes
Mon Mon
Monday Monday
Mute mentions Mute mentions
Mute messages Mute messages
Navigate Navigate
Never Never
New PIN New PIN
No backups available to restore. No backups available to restore.
No backups yet. Use Export Backup above to create one. No backups yet. Use Export Backup above to create one.
No channels yet No channels yet
No direct chats yet No direct chats yet
Normal\nLarge text\nHuge text Normal\nLarge text\nHuge text
Not delivered, tap to resend Not delivered, tap to resend
Nov Nov
November November
Oct Oct
October October
On On
On battery, show it for On battery, show it for
PIN changed PIN changed
PIN lock PIN lock
PIN lock off PIN lock off
PIN lock on PIN lock on
Phone-app link Phone-app link
Pick the numbers, or type the PIN Pick the numbers, or type the PIN
Preview screensaver Preview screensaver
Radio and messaging Radio and messaging
Reboot Now Reboot Now
Received %s Received %s
Receiving %s Receiving %s
Region not saved: use a-z, 0-9 and - Region not saved: use a-z, 0-9 and -
Remote Remote
Repeater Repeater
Report a bug Report a bug
Reset chat icon Reset chat icon
Room Room
Routed Routed
Running it for Running it for
Running it for: Running it for:
SD card SD card
SD unavailable - insert a FAT32 card and retry SD unavailable - insert a FAT32 card and retry
Sat Sat
Saturday Saturday
Say whether this build works on your board, so a stable release is promoted on evidence rather than on nobody having complained. A bug report opens as a QR: scan it and file it from your phone, under your own GitHub account. Say whether this build works on your board, so a stable release is promoted on evidence rather than on nobody having complained. A bug report opens as a QR: scan it and file it from your phone, under your own GitHub account.
Screen timeout Screen timeout
Screensaver Screensaver
Scroll Scroll
Scroll moves the screen; Cursor points and clicks; Navigate (experimental) moves a selection. Hold the trackball to switch between Scroll and Cursor. Scroll moves the screen; Cursor points and clicks; Navigate (experimental) moves a selection. Hold the trackball to switch between Scroll and Cursor.
Send Send
Send a test report Send a test report
Send another test report Send another test report
Sending %s Sending %s
Sending your report... Sending your report...
Sensor Sensor
Sep Sep
September September
Share my contact Share my contact
Spectrum Spectrum
Stop USB Files Stop USB Files
Storage and SD Storage and SD
Sun Sun
Sunday Sunday
Tap the EN key on the keyboard to switch Tap the EN key on the keyboard to switch
Tells the matrix how many devices run this build, so a board with no reports can be told apart from a board nobody owns. Sends the board and the version, nothing else. Tells the matrix how many devices run this build, so a board with no reports can be told apart from a board nobody owns. Sends the board and the version, nothing else.
Terminal Terminal
Test report: %s Test report: %s
Thank you. Your report is on wadamesh.com/beta Thank you. Your report is on wadamesh.com/beta
The PINs did not match The PINs did not match
The mesh around you instead of a dark screen. Every ring is a real packet. The mesh around you instead of a dark screen. Every ring is a real packet.
This is everything that leaves the device. No name, no contacts, no position. This is everything that leaves the device. No name, no contacts, no position.
Thu Thu
Thursday Thursday
Tick only what you actually used: Tick only what you actually used:
Too many chat icons Too many chat icons
Too many tries. Wait %u s Too many tries. Wait %u s
Trackball Trackball
Trackball: scroll Trackball: scroll
Transfer Transfer
Tue Tue
Tuesday Tuesday
Turn Wi-Fi on to send a report Turn Wi-Fi on to send a report
Type 4 numbers or letters Type 4 numbers or letters
USB Files USB Files
USB Files: low memory USB Files: low memory
Unmute mentions Unmute mentions
Unmute messages Unmute messages
Upload of %s stopped Upload of %s stopped
Used Used
VNC VNC
Waiting for the computer Waiting for the computer
Web Web
Wed Wed
Wednesday Wednesday
While this screen is open, the companion app cannot use USB. While this screen is open, the companion app cannot use USB.
Works Works
Wrong PIN Wrong PIN
You: You:
a week or more a week or more
about a day about a day
heard %s ago heard %s ago
hold the BOOT button to unlock hold the BOOT button to unlock
hop away hop away
hops away hops away
minutes minutes
new new
node node
nodes nodes
now now
routed routed
# Theme page and colour looks: new strings, English placeholders until translated (value = key)
A colour for every section, coloured status icons, names and glyphs in their own hue. A colour for every section, coloured status icons, names and glyphs in their own hue.
Apply and restart Apply and restart
Applying the theme, restarting… Applying the theme, restarting…
Bubbles in colour Bubbles in colour
Bubbles plain Bubbles plain
Chat icons Chat icons
Colourful bubbles Colourful bubbles
Custom Custom
Every app and page its own colour, with a little motion. Every app and page its own colour, with a little motion.
Black and white with heavy outlines, for bright sun or low vision. Black and white with heavy outlines, for bright sun or low vision.
Glyphs Glyphs
High contrast keeps its own fixed colours. High contrast keeps its own fixed colours.
Initials Initials
MORE COLORS! MORE COLORS!
Mode Mode
Names are always in colour; this colours the bubbles too. Names are always in colour; this colours the bubbles too.
Neon Neon
On my way On my way
Pastel Pastel
Preview Preview
Rainbow Rainbow
Regular Regular
Ridge at six? Ridge at six?
Taste the rainbow Taste the rainbow
Use this colour Use this colour
+237 -1
View File
@@ -1,7 +1,7 @@
# wadamesh language file
# canonical source - translators: edit this file and PR it
# code: uk
# ver: 22
# ver: 23
# name: Українська
# base: uk
(device behind) (пристрій відстає)
@@ -34,9 +34,14 @@ Accent popups: off Підказки акцентів: вимк
Accent popups: on Підказки акцентів: увімк
Accent colour Акцентний колір
Appearance Вигляд
Condense Nav (restart to apply) Компактна навігація (перезапуск для застосування)
Condense Nav saved — restart to apply Компактну навігацію збережено — перезапуск для застосування
Day День
High contrast Висока контрастність
High contrast - restarting to apply it… Висока контрастність - перезавантаження для застосування…
Keyboard nav: on Навігація клавіатурою: увімк.
Landscape only Лише в альбомній орієнтації
Letters move the highlight when no text field is focused. Enter selects; hold Backspace to go back. Літери переміщують виділення, коли не активне текстове поле. Enter вибирає; утримуйте Backspace, щоб повернутися.
Night Ніч
Theme save failed Не вдалося зберегти тему
Ack Підтв.
@@ -1282,3 +1287,234 @@ No known Windows malware found. No known Windows malware found.
This firmware can find these but not remove them. Update wadamesh, or format the card: in Files, hold the SD card row. This firmware can find these but not remove them. Update wadamesh, or format the card: in Files, hold the SD card row.
SD Scan only removes files it recognises. If the card may be infected, the safest fix is to copy off what you need and format it completely: in Files, hold the SD card row. SD Scan only removes files it recognises. If the card may be infected, the safest fix is to copy off what you need and format it completely: in Files, hold the SD card row.
and %d more and %d more
# beta_89: new strings, English placeholders until translated (value = key)
%d nodes heard today %d nodes heard today
%lu packets heard %lu packets heard
1 node heard today 1 node heard today
1 packet heard 1 packet heard
1. Connect this device to the computer with a USB cable.\n2. Open this address in Chrome or Edge: 1. Connect this device to the computer with a USB cable.\n2. Open this address in Chrome or Edge:
3. Click Connect and choose this device. 3. Click Connect and choose this device.
4 numbers or letters 4 numbers or letters
A day A day
A week A week
Add a channel Add a channel
Add, download or delete files on this device from a computer. Add, download or delete files on this device from a computer.
Advertise Advertise
Always on when connected to power Always on when connected to power
Anything worth saying (optional) Anything worth saying (optional)
App drawer App drawer
App icons App icons
Append timestamp Append timestamp
Apr Apr
April April
Asks for 4 numbers or letters to unlock, and locks whenever the screen goes off. If you forget it, the only way back in is to reset the device, which erases everything on it. Asks for 4 numbers or letters to unlock, and locks whenever the screen goes off. If you forget it, the only way back in is to reset the device, which erases everything on it.
Aug Aug
August August
Blocked Blocked
Change PIN Change PIN
Channel Channel
Channels Channels
Chat Chat
Chat icon reset Chat icon reset
Chats Chats
Choose a PIN Choose a PIN
Clock not set Clock not set
Cmdr Cmdr
Commander Commander
Companion Companion
Connected to the computer Connected to the computer
Could not send the report. Try again later. Could not send the report. Try again later.
Count this device Count this device
Current PIN Current PIN
Cursor Cursor
Dec Dec
December December
Delete this conversation? Delete this conversation?
Device id Device id
Direct Direct
Direct message Direct message
Direct, no repeaters Direct, no repeaters
Discover Discover
Double-tap SPACE while typing to switch Double-tap SPACE while typing to switch
Emoji Emoji
Enter PIN Enter PIN
Enter it again Enter it again
Export Backup Export Backup
Feb Feb
February February
Fri Fri
Friday Friday
Has a problem Has a problem
Heard by %u repeaters Heard by %u repeaters
Heard by 1 repeater Heard by 1 repeater
Hold the trackball to switch Hold the trackball to switch
Home button opens Home button opens
I hit a problem I hit a problem
I understand I understand
If you forget your PIN, you have to reset the device If you forget your PIN, you have to reset the device
Internal Internal
It is the only way back in, and it erases everything on it: contacts, channels, messages and settings. Nobody can unlock it for you. It is the only way back in, and it erases everything on it: contacts, channels, messages and settings. Nobody can unlock it for you.
Jan Jan
January January
Join # channel Join # channel
Join Public channel Join Public channel
Jul Jul
July July
Jun Jun
June June
Keyboard and input Keyboard and input
Keyboard attached.\nRestarting in landscape in %d s. Keyboard attached.\nRestarting in landscape in %d s.
Large Large
Launcher Launcher
Launcher layout Launcher layout
Locks when screen off\n(hold the BOOT button to unlock) Locks when screen off\n(hold the BOOT button to unlock)
Map and GPS Map and GPS
Map tiles Map tiles
Mar Mar
March March
Mark all as read Mark all as read
May May
Mentions Mentions
Mentions muted Mentions muted
Mentions unmuted Mentions unmuted
Mesh · 24 h Mesh · 24 h
Message %s Message %s
Message text on lock screen Message text on lock screen
Messages muted Messages muted
Messages unmuted Messages unmuted
Minutes Minutes
Mon Mon
Monday Monday
Mute mentions Mute mentions
Mute messages Mute messages
Navigate Navigate
Never Never
New PIN New PIN
No backups available to restore. No backups available to restore.
No backups yet. Use Export Backup above to create one. No backups yet. Use Export Backup above to create one.
No channels yet No channels yet
No direct chats yet No direct chats yet
Normal\nLarge text\nHuge text Normal\nLarge text\nHuge text
Not delivered, tap to resend Not delivered, tap to resend
Nov Nov
November November
Oct Oct
October October
On On
On battery, show it for On battery, show it for
PIN changed PIN changed
PIN lock PIN lock
PIN lock off PIN lock off
PIN lock on PIN lock on
Phone-app link Phone-app link
Pick the numbers, or type the PIN Pick the numbers, or type the PIN
Preview screensaver Preview screensaver
Radio and messaging Radio and messaging
Reboot Now Reboot Now
Received %s Received %s
Receiving %s Receiving %s
Region not saved: use a-z, 0-9 and - Region not saved: use a-z, 0-9 and -
Remote Remote
Repeater Repeater
Report a bug Report a bug
Reset chat icon Reset chat icon
Room Room
Routed Routed
Running it for Running it for
Running it for: Running it for:
SD card SD card
SD unavailable - insert a FAT32 card and retry SD unavailable - insert a FAT32 card and retry
Sat Sat
Saturday Saturday
Say whether this build works on your board, so a stable release is promoted on evidence rather than on nobody having complained. A bug report opens as a QR: scan it and file it from your phone, under your own GitHub account. Say whether this build works on your board, so a stable release is promoted on evidence rather than on nobody having complained. A bug report opens as a QR: scan it and file it from your phone, under your own GitHub account.
Screen timeout Screen timeout
Screensaver Screensaver
Scroll Scroll
Scroll moves the screen; Cursor points and clicks; Navigate (experimental) moves a selection. Hold the trackball to switch between Scroll and Cursor. Scroll moves the screen; Cursor points and clicks; Navigate (experimental) moves a selection. Hold the trackball to switch between Scroll and Cursor.
Send Send
Send a test report Send a test report
Send another test report Send another test report
Sending %s Sending %s
Sending your report... Sending your report...
Sensor Sensor
Sep Sep
September September
Share my contact Share my contact
Spectrum Spectrum
Stop USB Files Stop USB Files
Storage and SD Storage and SD
Sun Sun
Sunday Sunday
Tap the EN key on the keyboard to switch Tap the EN key on the keyboard to switch
Tells the matrix how many devices run this build, so a board with no reports can be told apart from a board nobody owns. Sends the board and the version, nothing else. Tells the matrix how many devices run this build, so a board with no reports can be told apart from a board nobody owns. Sends the board and the version, nothing else.
Terminal Terminal
Test report: %s Test report: %s
Thank you. Your report is on wadamesh.com/beta Thank you. Your report is on wadamesh.com/beta
The PINs did not match The PINs did not match
The mesh around you instead of a dark screen. Every ring is a real packet. The mesh around you instead of a dark screen. Every ring is a real packet.
This is everything that leaves the device. No name, no contacts, no position. This is everything that leaves the device. No name, no contacts, no position.
Thu Thu
Thursday Thursday
Tick only what you actually used: Tick only what you actually used:
Too many chat icons Too many chat icons
Too many tries. Wait %u s Too many tries. Wait %u s
Trackball Trackball
Trackball: scroll Trackball: scroll
Transfer Transfer
Tue Tue
Tuesday Tuesday
Turn Wi-Fi on to send a report Turn Wi-Fi on to send a report
Type 4 numbers or letters Type 4 numbers or letters
USB Files USB Files
USB Files: low memory USB Files: low memory
Unmute mentions Unmute mentions
Unmute messages Unmute messages
Upload of %s stopped Upload of %s stopped
Used Used
VNC VNC
Waiting for the computer Waiting for the computer
Web Web
Wed Wed
Wednesday Wednesday
While this screen is open, the companion app cannot use USB. While this screen is open, the companion app cannot use USB.
Works Works
Wrong PIN Wrong PIN
You: You:
a week or more a week or more
about a day about a day
heard %s ago heard %s ago
hold the BOOT button to unlock hold the BOOT button to unlock
hop away hop away
hops away hops away
minutes minutes
new new
node node
nodes nodes
now now
routed routed
# Theme page and colour looks: new strings, English placeholders until translated (value = key)
A colour for every section, coloured status icons, names and glyphs in their own hue. A colour for every section, coloured status icons, names and glyphs in their own hue.
Apply and restart Apply and restart
Applying the theme, restarting… Applying the theme, restarting…
Bubbles in colour Bubbles in colour
Bubbles plain Bubbles plain
Chat icons Chat icons
Colourful bubbles Colourful bubbles
Custom Custom
Every app and page its own colour, with a little motion. Every app and page its own colour, with a little motion.
Black and white with heavy outlines, for bright sun or low vision. Black and white with heavy outlines, for bright sun or low vision.
Glyphs Glyphs
High contrast keeps its own fixed colours. High contrast keeps its own fixed colours.
Initials Initials
MORE COLORS! MORE COLORS!
Mode Mode
Names are always in colour; this colours the bubbles too. Names are always in colour; this colours the bubbles too.
Neon Neon
On my way On my way
Pastel Pastel
Preview Preview
Rainbow Rainbow
Regular Regular
Ridge at six? Ridge at six?
Taste the rainbow Taste the rainbow
Use this colour Use this colour
+14 -14
View File
@@ -3,72 +3,72 @@
{
"code": "bg",
"name": "Български",
"ver": "22"
"ver": "23"
},
{
"code": "de",
"name": "Deutsch",
"ver": "22"
"ver": "23"
},
{
"code": "el",
"name": "Ελληνικά",
"ver": "22"
"ver": "23"
},
{
"code": "es",
"name": "Español",
"ver": "22"
"ver": "23"
},
{
"code": "fr",
"name": "Français",
"ver": "22"
"ver": "23"
},
{
"code": "hu",
"name": "Magyar",
"ver": "22"
"ver": "23"
},
{
"code": "it",
"name": "Italiano",
"ver": "22"
"ver": "23"
},
{
"code": "nl",
"name": "Nederlands",
"ver": "22"
"ver": "23"
},
{
"code": "pt-br",
"name": "Português (BR)",
"ver": "22"
"ver": "23"
},
{
"code": "ro",
"name": "Română",
"ver": "22"
"ver": "23"
},
{
"code": "cs",
"name": "Čeština",
"ver": "22"
"ver": "23"
},
{
"code": "ru",
"name": "Русский",
"ver": "22"
"ver": "23"
},
{
"code": "sr",
"name": "Српски",
"ver": "22"
"ver": "23"
},
{
"code": "uk",
"name": "Українська",
"ver": "22"
"ver": "23"
}
]
}
+1
View File
@@ -0,0 +1 @@
{"id":"ping","name":"Ping","ver":"1.0","desc":"Send a mesh DM ping to any contact and measure round-trip time. Includes your GPS position so both sides see distance and bearing. Auto-replies to incoming pings. Contributed by samuelcoustet.","requires":"sdk_ext"}
+169
View File
@@ -0,0 +1,169 @@
-- Ping — wadamesh Lua app
-- Send a DM to any contact and measure round-trip time.
-- Both devices exchange their GPS position; the result shows RTT,
-- distance and cardinal bearing when both have a fix.
-- The app also auto-replies to incoming pings from other Ping users.
-- Requires: sdk_ext
local ui, sys, store, timer = wada.ui, wada.sys, wada.store, wada.timer
local mesh = wada.mesh
local geo = wada.geo -- great-circle helpers; nil on firmware without sdk_ext
local C = ui.colors
local app = {}
local PING_PFX = "WADAPING:"
local PONG_PFX = "WADAPONG:"
local W, H
local gps_lbl
local rows = {} -- {name, result_lbl} (parallel with contacts table)
local pending = {} -- name → {sent_ms, lat_e6, lon_e6}
-- ---- helpers ---------------------------------------------------------------
local function gps_line()
local fix = sys.gps()
if not fix then return "no GPS fix" end
local ns = fix.lat >= 0 and "N" or "S"
local ew = fix.lon >= 0 and "E" or "W"
return string.format("%.4f°%s %.4f°%s %d sats",
math.abs(fix.lat), ns, math.abs(fix.lon), ew, fix.sats or 0)
end
local function dist_str(m)
if m < 1000 then return string.format("%dm", math.floor(m + 0.5))
else return string.format("%.1fkm", m / 1000.0) end
end
local function find_row(name)
for _, r in ipairs(rows) do
if r.name == name then return r end
end
end
local function set_row_result(name, rtt_ms, dist_m, cardinal)
local r = find_row(name)
if not r then return end
if rtt_ms then
local s = tostring(rtt_ms) .. "ms"
if dist_m and dist_m > 0 then
s = s .. " " .. dist_str(dist_m)
if cardinal then s = s .. " " .. cardinal end
end
r.result_lbl:set(s)
r.result_lbl:color(C.good)
else
r.result_lbl:set("waiting…")
r.result_lbl:color(C.sub)
end
end
local function do_ping(name)
local fix = sys.gps()
local lat6 = fix and fix.lat_e6 or 0
local lon6 = fix and fix.lon_e6 or 0
local ts = sys.millis()
local msg = string.format("%s%d:%d:%d", PING_PFX, ts, lat6, lon6)
local ok, err = mesh.send_dm(name, msg)
if ok then
pending[name] = { sent_ms = ts, lat_e6 = lat6, lon_e6 = lon6 }
set_row_result(name, nil, nil, nil) -- "waiting…"
sys.toast("Ping → " .. name, 800)
else
sys.toast("Error: " .. tostring(err), 2000)
end
end
-- ---- message handler -------------------------------------------------------
function app.on_message(m)
if m.kind ~= "dm" then return end
local text = tostring(m.text or "")
-- ---- incoming PING: echo back with our position -------------------------
if text:sub(1, #PING_PFX) == PING_PFX then
local ts_s, _, _ = text:sub(#PING_PFX + 1):match("(-?%d+):(-?%d+):(-?%d+)")
if ts_s then
local fix = sys.gps()
local my6lat = fix and fix.lat_e6 or 0
local my6lon = fix and fix.lon_e6 or 0
mesh.send_dm(m.sender, string.format("%s%s:%d:%d", PONG_PFX, ts_s, my6lat, my6lon))
end
return
end
-- ---- incoming PONG: compute RTT + distance ------------------------------
if text:sub(1, #PONG_PFX) == PONG_PFX then
local ts_s, their_lat_s, their_lon_s =
text:sub(#PONG_PFX + 1):match("(-?%d+):(-?%d+):(-?%d+)")
if not ts_s then return end
local sent_ms = tonumber(ts_s)
local rtt = sys.millis() - sent_ms
local dist_m, cardinal
local p = pending[m.sender]
if p and geo and tonumber(their_lat_s) ~= 0 and p.lat_e6 ~= 0 then
local my_lat = p.lat_e6 / 1000000.0
local my_lon = p.lon_e6 / 1000000.0
local th_lat = tonumber(their_lat_s) / 1000000.0
local th_lon = tonumber(their_lon_s) / 1000000.0
dist_m = geo.distance(my_lat, my_lon, th_lat, th_lon)
local brg = geo.bearing(my_lat, my_lon, th_lat, th_lon)
cardinal = geo.cardinal(brg)
end
pending[m.sender] = nil
set_row_result(m.sender, rtt, dist_m, cardinal)
local notice = m.sender .. ": " .. rtt .. "ms"
if dist_m then notice = notice .. " " .. dist_str(dist_m) end
sys.toast(notice, 2500)
return
end
end
-- ---- lifecycle -------------------------------------------------------------
function app.on_open(w, h)
W, H = w, h
ui.scroll(true)
local cy = 6
gps_lbl = ui.label(gps_line(), 6, cy, 11, C.sub)
gps_lbl:width(w - 12)
cy = cy + 20
local contacts = mesh.contacts()
if #contacts == 0 then
ui.label("No contacts visible", 8, cy, 12, C.sub)
timer.every(5000)
return
end
for _, ct in ipairs(contacts) do
local name = ct.name
local nl = ui.label(name, 8, cy, 13, C.text)
nl:width(w - 68)
local rl = ui.label("—", 8, cy + 16, 11, C.sub)
rl:width(w - 68)
local cap = name -- capture for closure
ui.button("Ping", w - 60, cy + 4, 52, 28, function()
do_ping(cap)
end)
rows[#rows + 1] = { name = name, result_lbl = rl }
cy = cy + 44
end
timer.every(5000)
end
function app.on_tick(dt)
if gps_lbl then gps_lbl:set(gps_line()) end
end
function app.on_close() end
return app
+1
View File
@@ -0,0 +1 @@
{"id":"protreck","name":"ProTreck","ver":"1.0","desc":"Outdoor watch: sunrise/sunset + moon phase (ASTRO), chronometer with laps (CHRONO), countdown timer with alarm (TIMER), altimeter with trend graph (ALTI). Swipe left/right to switch modes. Contributed by samuelcoustet."}
+491
View File
@@ -0,0 +1,491 @@
-- ProTreck — wadamesh outdoor watch: Astro · Chrono · Timer · Altimeter
-- Swipe left/right to change tab
-- ASTRO: sunrise/sunset + moon phase from GPS fix
-- CHRONO: tap start/stop, swipe-up lap, swipe-down reset
-- TIMER: tap start/stop, swipe-up cycle preset, swipe-down reset
-- ALTI: GPS altitude with min/max and trend graph; swipe-down resets min/max
-- Contributed by samuelcoustet
local ui, sys, store, tmr = wada.ui, wada.sys, wada.store, wada.timer
local C = ui.colors
local app = {}
-- ── Constants ─────────────────────────────────────────────────────────────
local TAB = { "ASTRO", "CHRONO", "TIMER", "ALTI" }
local TAB_H = 18 -- tab bar height (px)
local HIST_N = 60 -- altimeter ring-buffer size
-- ── State ─────────────────────────────────────────────────────────────────
local tab = 1
local cv, W, H
-- Astro
local astro_t0 = 0 -- last refresh (millis)
local astro_sr, astro_ss -- sunrise / sunset (UTC fractional hours), or nil
local astro_phase = 0 -- moon phase 0-29
local astro_lat, astro_lon, astro_yday, astro_year
-- Chrono
local chr_run = false
local chr_t0 = 0 -- millis at last start
local chr_acc = 0 -- accumulated ms before last start
local chr_laps = {} -- list of "MM:SS.cs" strings
-- Timer
local TMR_PRESETS = { 30, 60, 120, 300, 600, 1800, 3600 }
local tmr_pi = 4 -- preset index (default 300 s)
local tmr_secs = 300
local tmr_end = 0 -- millis when alarm fires; 0 = not running
local tmr_done = false
-- Altimeter
local alti_min = 99999
local alti_max = -99999
local alti_hist = {}
local alti_hi = 0 -- ring-buffer write head
-- ── Time helpers ──────────────────────────────────────────────────────────
local function now_unix()
local ep = sys.epoch and sys.epoch()
if ep then return ep end
if os then return os.time and os.time() end
return nil
end
local function decompose(t)
if os and os.date then return os.date("*t", t) end
-- minimal fallback (good enough for rough yday on harness without os.date)
local s = t % 86400
local sec = s % 60; s = math.floor(s / 60)
local min2 = s % 60; local hr = math.floor(s / 60)
local days = math.floor(t / 86400)
-- Gregorian: days since epoch 1970-01-01
local y = 1970; local d = days
while true do
local ylen = ((y % 4 == 0 and y % 100 ~= 0) or y % 400 == 0) and 366 or 365
if d < ylen then break end
d = d - ylen; y = y + 1
end
return { year = y, hour = hr, min = min2, sec = sec, yday = d + 1 }
end
local function fmt_hms(ms)
local s = math.floor(ms / 1000)
local cs = math.floor((ms % 1000) / 10)
local m = math.floor(s / 60); s = s % 60
local h = math.floor(m / 60); m = m % 60
if h > 0 then
return string.format("%d:%02d:%02d", h, m, s)
else
return string.format("%02d:%02d.%02d", m, s, cs)
end
end
local function fmt_mm_ss(secs)
local h = math.floor(secs / 3600)
local m = math.floor((secs % 3600) / 60)
local s = secs % 60
if h > 0 then return string.format("%d:%02d:%02d", h, m, s) end
return string.format("%02d:%02d", m, s)
end
-- ── Sun / moon algorithms ─────────────────────────────────────────────────
local PI = math.pi
local RAD = PI / 180
local function sun_utc(lat, lon, yday)
-- Spencer 1971 simplified; returns rise_utc, set_utc (fractional hours) or nil,nil
local B = RAD * (360 / 365) * (yday - 81)
local eqt = 9.87 * math.sin(2 * B) - 7.53 * math.cos(B) - 1.5 * math.sin(B) -- minutes
local decl = RAD * 23.45 * math.sin(B)
local cha = -math.tan(lat * RAD) * math.tan(decl)
if cha < -1 or cha > 1 then return nil, nil end
local ha = math.acos(cha) / RAD -- degrees
local noon = 12 - lon / 15 - eqt / 60
return noon - ha / 15, noon + ha / 15
end
local function moon_phase_num(t)
-- days since known new moon 2000-01-06 (JD 2451549.5) → phase 0-29
local days = t / 86400 - 10957 -- 10957 = days from 1970-01-01 to 2000-01-01
local cycle = 29.53058867
return math.floor((days - 6.0) % cycle)
end
local MOON_NAMES = {
[0]="New Moon", [1]="New Moon",
[2]="Waxing Crescent",[3]="Waxing Crescent",[4]="Waxing Crescent",
[5]="Waxing Crescent",[6]="Waxing Crescent",[7]="Waxing Crescent",
[8]="First Quarter",[9]="First Quarter",
[10]="Waxing Gibbous",[11]="Waxing Gibbous",[12]="Waxing Gibbous",
[13]="Waxing Gibbous",[14]="Waxing Gibbous",
[15]="Full Moon",[16]="Full Moon",
[17]="Waning Gibbous",[18]="Waning Gibbous",[19]="Waning Gibbous",
[20]="Waning Gibbous",[21]="Waning Gibbous",
[22]="Last Quarter",[23]="Last Quarter",
[24]="Waning Crescent",[25]="Waning Crescent",[26]="Waning Crescent",
[27]="Waning Crescent",[28]="Waning Crescent",[29]="New Moon",
}
local function update_astro()
local now = sys.millis()
if now - astro_t0 < 60000 then return end
astro_t0 = now
local t = now_unix()
local gps = sys.gps()
if gps and t then
local d = decompose(t)
astro_lat = gps.lat
astro_lon = gps.lon
astro_yday = d.yday or 182
astro_year = d.year or 2024
astro_sr, astro_ss = sun_utc(gps.lat, gps.lon, astro_yday)
astro_phase = moon_phase_num(t)
end
end
-- ── Draw helpers ──────────────────────────────────────────────────────────
local function tx(x) return math.floor(x) end
local function ty(y) return math.floor(y) end
local function label(x, y, s, col, sz)
cv:text(tx(x), ty(y), tostring(s), col, sz)
end
local function head(x, y, s, col)
label(x, y, s, col or C.sub, 11)
end
local function big(x, y, s, col, sz)
label(x, y, s, col or C.text, sz or 24)
return #s * (sz and math.floor(sz * 0.6) or 14) -- rough width estimate
end
-- ── ASTRO tab ─────────────────────────────────────────────────────────────
local function draw_astro(cw, ch)
local t = now_unix()
local d = t and decompose(t) or nil
-- Date header
if d then
local ds = string.format("%04d-%02d-%02d", d.year or 0, d.month or 0, d.day or 0)
head(4, 4, ds, C.sub)
local ts2 = string.format("%02d:%02d:%02d UTC", d.hour or 0, d.min or 0, d.sec or 0)
head(cw - tx(#ts2 * 6 + 4), 4, ts2, C.sub)
end
local y = 22
-- Sun section
cv:rect(4, y, cw - 8, 1, C.sub, true, 0)
y = y + 6
head(4, y, "SUN", C.accent)
y = y + 14
if astro_sr then
local rh = math.floor(astro_sr)
local rm = math.floor((astro_sr - rh) * 60 + 0.5)
local sh = math.floor(astro_ss)
local sm = math.floor((astro_ss - sh) * 60 + 0.5)
label(8, y, string.format("Rise %02d:%02d", rh, rm), C.text, 13)
label(8, y + 16, string.format("Set %02d:%02d", sh, sm), C.text, 13)
elseif astro_lat then
label(8, y, "Polar day / night", C.sub, 12)
y = y - 16
else
label(8, y, "Need GPS fix", C.bad, 12)
y = y - 16
end
y = y + 40
-- Moon section
cv:rect(4, y, cw - 8, 1, C.sub, true, 0)
y = y + 6
head(4, y, "MOON", C.accent)
y = y + 14
if astro_lat and t then
local name = MOON_NAMES[astro_phase] or "?"
label(8, y, string.format("Phase %d / 29", astro_phase), C.text, 13)
label(8, y + 16, name, C.sub, 12)
-- draw a simple moon disc glyph (filled = new/full, half = quarters)
local mx = math.floor(cw * 3 / 4)
local my = ty(y + 8)
local r = 10
cv:circle(mx, my, r, C.sub, false, 1)
if astro_phase < 3 or astro_phase > 27 then
cv:circle(mx, my, r - 2, C.sub, true, 0) -- new moon: dark
elseif astro_phase < 15 then
cv:circle(mx, my, r - 2, C.accent, true, 0) -- waxing: right half lit
elseif astro_phase < 17 then
cv:circle(mx, my, r - 2, C.good, true, 0) -- full moon
else
cv:circle(mx, my, r - 2, C.accent, true, 0) -- waning: left half lit
end
else
label(8, y, "Need GPS + time", C.bad, 12)
end
-- GPS status row at bottom
local gps = sys.gps()
if gps then
label(4, ch - 16, string.format("GPS %d sats %.4f,%.4f", gps.sats, gps.lat, gps.lon), C.sub, 10)
else
label(4, ch - 16, "GPS: no fix", C.bad, 10)
end
end
-- ── CHRONO tab ────────────────────────────────────────────────────────────
local function chr_elapsed()
if chr_run then
return chr_acc + (sys.millis() - chr_t0)
else
return chr_acc
end
end
local function draw_chrono(cw, ch)
local ms = chr_elapsed()
local ts = fmt_hms(ms)
-- big time
local tw = tx(#ts * 14)
local tx2 = math.max(4, math.floor((cw - tw) / 2))
cv:text(tx2, 20, ts, chr_run and C.good or C.text, 22)
-- status
local stat = chr_run and "RUNNING" or (chr_acc > 0 and "STOPPED" or "READY")
head(math.floor((cw - #stat * 6) / 2), 52, stat, chr_run and C.good or C.sub)
-- hints
head(4, 66, "tap: start/stop up: lap down: reset", C.sub)
-- lap list (last 6)
local start_lap = math.max(1, #chr_laps - 5)
local ly = 84
for i = start_lap, #chr_laps do
local col = i == #chr_laps and C.text or C.sub
label(4, ly, string.format("Lap %d", i), col, 12)
label(44, ly, chr_laps[i], col, 12)
ly = ly + 14
if ly > ch - 20 then break end
end
end
-- ── TIMER tab ─────────────────────────────────────────────────────────────
local function tmr_remaining()
if tmr_end == 0 then return tmr_secs * 1000 end
local r = tmr_end - sys.millis()
return r < 0 and 0 or r
end
local function draw_timer(cw, ch)
local rem = tmr_remaining()
local secs = math.floor(rem / 1000)
local ts = fmt_mm_ss(secs)
local col = tmr_done and C.bad or (tmr_end ~= 0 and C.good or C.text)
local tw = tx(#ts * 16)
local tx2 = math.max(4, math.floor((cw - tw) / 2))
cv:text(tx2, 20, ts, col, 26)
-- progress bar
local total_ms = tmr_secs * 1000
local pct = (total_ms > 0) and math.floor((total_ms - rem) * (cw - 8) / total_ms) or 0
if pct > 0 then
cv:rect(4, 58, pct, 4, tmr_done and C.bad or C.accent, true, 0)
end
cv:rect(4, 58, cw - 8, 4, 0x1a1f26, false, 0)
-- preset
local pre_s = string.format("Preset: %s", fmt_mm_ss(tmr_secs))
head(4, 70, pre_s, C.sub)
head(4, 84, "tap: start/stop up: cycle preset down: reset", C.sub)
if tmr_done then
local ax = math.floor((cw - 60) / 2)
cv:rect(ax, 100, 60, 22, 0x1a1f26, true, 4)
label(ax + 8, 104, "ALARM!", C.bad, 16)
end
end
-- ── ALTI tab ──────────────────────────────────────────────────────────────
local function draw_alti(cw, ch)
local gps = sys.gps()
local alt = gps and gps.alt_m or nil
-- big altitude
local ats = alt and string.format("%d m", math.floor(alt)) or "--- m"
local tw = tx(#ats * 14)
cv:text(math.max(4, math.floor((cw - tw) / 2)), 10, ats,
alt and C.text or C.sub, 24)
-- min / max
local mn_s = alti_min < 99999 and string.format("%d m", math.floor(alti_min)) or "---"
local mx_s = alti_max > -99999 and string.format("%d m", math.floor(alti_max)) or "---"
head(4, 44, "MIN")
label(4, 56, mn_s, C.sub, 13)
head(math.floor(cw / 2) + 4, 44, "MAX")
label(math.floor(cw / 2) + 4, 56, mx_s, C.sub, 13)
-- GPS info
if gps then
label(4, 76, string.format("Sats %d %d km/h", gps.sats, math.floor(gps.speed_kmh or 0)),
gps.sats >= 4 and C.good or C.bad, 11)
else
label(4, 76, "No GPS fix", C.bad, 11)
end
-- trend graph
local n = #alti_hist
if n > 2 then
local gy = 92
local gh = ch - gy - 20
local gw = cw - 8
cv:rect(4, gy, gw, gh, 0x1a1f26, true, 2)
-- find range
local mn2, mx2 = alti_hist[1], alti_hist[1]
for _, v in ipairs(alti_hist) do
if v < mn2 then mn2 = v end
if v > mx2 then mx2 = v end
end
local rng = mx2 - mn2
if rng < 1 then rng = 1 end
-- draw line as series of small rects
for i = 2, n do
local x1 = math.floor(4 + (i - 2) * gw / (HIST_N - 1))
local x2 = math.floor(4 + (i - 1) * gw / (HIST_N - 1))
local y1 = math.floor(gy + gh - (alti_hist[i-1] - mn2) * gh / rng)
local y2 = math.floor(gy + gh - (alti_hist[i] - mn2) * gh / rng)
local lx = math.min(x1, x2)
local lw = math.max(1, math.abs(x2 - x1))
local ly = math.min(y1, y2)
local lh = math.max(1, math.abs(y2 - y1))
cv:rect(lx, ly, lw, lh, C.accent, true, 0)
end
-- axis labels
head(6, gy + 2, math.floor(mx2) .. "m", C.sub)
head(6, gy + gh - 12, math.floor(mn2) .. "m", C.sub)
end
head(4, ch - 14, "down: reset min/max", C.sub)
end
-- ── Tab bar ───────────────────────────────────────────────────────────────
local function draw_tab_bar()
local tw = math.floor(W / #TAB)
for i, name in ipairs(TAB) do
local tx2 = (i - 1) * tw
if i == tab then
cv:rect(tx2, H - TAB_H, tw, TAB_H, C.accent, true, 0)
cv:text(math.floor(tx2 + (tw - #name * 6) / 2), H - TAB_H + 4, name, 0x000000, 10)
else
cv:text(math.floor(tx2 + (tw - #name * 6) / 2), H - TAB_H + 4, name, C.sub, 10)
end
end
end
-- ── Full redraw ───────────────────────────────────────────────────────────
local function redraw()
if not cv then return end
local ch = H - TAB_H
cv:fill(0x0d1117)
if tab == 1 then draw_astro( W, ch)
elseif tab == 2 then draw_chrono(W, ch)
elseif tab == 3 then draw_timer( W, ch)
elseif tab == 4 then draw_alti( W, ch)
end
draw_tab_bar()
end
-- ── App lifecycle ─────────────────────────────────────────────────────────
function app.on_open(w, h)
W, H = w, h
cv = ui.canvas(w, h)
cv:pos(0, 0)
-- restore persistent state
alti_min = tonumber(store.get("alti_min", 99999)) or 99999
alti_max = tonumber(store.get("alti_max", -99999)) or -99999
tmr_pi = tonumber(store.get("tmr_pi", 4)) or 4
if tmr_pi < 1 or tmr_pi > #TMR_PRESETS then tmr_pi = 4 end
tmr_secs = TMR_PRESETS[tmr_pi]
astro_t0 = 0 -- force an immediate astro refresh
update_astro()
redraw()
tmr.every(500)
end
function app.on_tick(dt)
-- altimeter: sample GPS when on the alti tab
if tab == 4 then
local gps = sys.gps()
if gps and gps.alt_m then
local a = gps.alt_m
alti_hi = (alti_hi % HIST_N) + 1
alti_hist[alti_hi] = a
if a < alti_min then alti_min = a; store.set("alti_min", alti_min) end
if a > alti_max then alti_max = a; store.set("alti_max", alti_max) end
end
end
-- timer alarm
if tmr_end ~= 0 and not tmr_done and sys.millis() >= tmr_end then
tmr_done = true
tmr_end = 0
sys.beep()
end
-- astro refresh (throttled inside update_astro)
update_astro()
redraw()
end
function app.on_input(ev)
if ev.type == "swipe" then
local d = ev.dir
if d == "left" then
tab = (tab % #TAB) + 1
elseif d == "right" then
tab = ((tab - 2) % #TAB) + 1
elseif d == "up" then
if tab == 2 and chr_run then
chr_laps[#chr_laps + 1] = fmt_hms(chr_elapsed())
sys.toast("Lap " .. #chr_laps, 800)
elseif tab == 3 then
tmr_pi = (tmr_pi % #TMR_PRESETS) + 1
tmr_secs = TMR_PRESETS[tmr_pi]
store.set("tmr_pi", tmr_pi)
tmr_end = 0; tmr_done = false
end
elseif d == "down" then
if tab == 2 then
chr_run = false; chr_t0 = 0; chr_acc = 0; chr_laps = {}
elseif tab == 3 then
tmr_end = 0; tmr_done = false
elseif tab == 4 then
alti_min = 99999; alti_max = -99999; alti_hist = {}; alti_hi = 0
store.set("alti_min", alti_min); store.set("alti_max", alti_max)
sys.toast("Alt min/max reset", 1000)
end
end
redraw()
elseif ev.type == "down" then
if tab == 2 then
if chr_run then
chr_acc = chr_elapsed(); chr_run = false
else
chr_t0 = sys.millis(); chr_run = true
end
redraw()
elseif tab == 3 then
if tmr_end ~= 0 then
tmr_end = 0; tmr_done = false
elseif tmr_done then
tmr_done = false
else
tmr_end = sys.millis() + tmr_secs * 1000
end
redraw()
end
end
end
function app.on_close()
chr_run = false
end
return app
+1
View File
@@ -0,0 +1 @@
{"id":"tetris","name":"Tetris","ver":"1.0","desc":"The classic falling-block puzzle. Swipe left/right to move, up to rotate, down to hard-drop. Contributed by samuelcoustet."}
+259
View File
@@ -0,0 +1,259 @@
-- Tetris — wadamesh Lua app
-- Swipe left/right to move | Swipe up to rotate | Swipe down to hard-drop
-- Keyboard: arrows to move/rotate, Enter or Space to hard-drop
-- Contributed by samuelcoustet
local ui, sys, store, timer = wada.ui, wada.sys, wada.store, wada.timer
local C = ui.colors
local app = {}
local COLS, ROWS = 10, 20
local CELL = 12
local COLORS = {
0x00d4ff, -- 1 I: cyan
0xffe066, -- 2 O: yellow
0xcc44ff, -- 3 T: purple
0x00dd88, -- 4 S: green
0xff4455, -- 5 Z: red
0x3399ff, -- 6 J: blue
0xff8833, -- 7 L: orange
}
-- Piece rotations: each entry is 4 {dr, dc} offsets from bounding-box origin
-- Row and column are 0-indexed; field coords = py+dr (row), px+dc (col)
local PIECES = {
-- 1 I (4×4 bounding box)
{ {{1,0},{1,1},{1,2},{1,3}}, {{0,2},{1,2},{2,2},{3,2}},
{{1,0},{1,1},{1,2},{1,3}}, {{0,1},{1,1},{2,1},{3,1}} },
-- 2 O
{ {{0,0},{0,1},{1,0},{1,1}}, {{0,0},{0,1},{1,0},{1,1}},
{{0,0},{0,1},{1,0},{1,1}}, {{0,0},{0,1},{1,0},{1,1}} },
-- 3 T
{ {{0,1},{1,0},{1,1},{1,2}}, {{0,1},{1,1},{1,2},{2,1}},
{{1,0},{1,1},{1,2},{2,1}}, {{0,1},{1,0},{1,1},{2,1}} },
-- 4 S
{ {{0,1},{0,2},{1,0},{1,1}}, {{0,0},{1,0},{1,1},{2,1}},
{{0,1},{0,2},{1,0},{1,1}}, {{0,0},{1,0},{1,1},{2,1}} },
-- 5 Z
{ {{0,0},{0,1},{1,1},{1,2}}, {{0,1},{1,0},{1,1},{2,0}},
{{0,0},{0,1},{1,1},{1,2}}, {{0,1},{1,0},{1,1},{2,0}} },
-- 6 J
{ {{0,0},{1,0},{1,1},{1,2}}, {{0,1},{0,2},{1,1},{2,1}},
{{1,0},{1,1},{1,2},{2,2}}, {{0,1},{1,1},{2,0},{2,1}} },
-- 7 L
{ {{0,2},{1,0},{1,1},{1,2}}, {{0,1},{1,1},{2,1},{2,2}},
{{1,0},{1,1},{1,2},{2,0}}, {{0,0},{0,1},{1,1},{2,1}} },
}
local board, cv, side_cv
local px, py, rot, pid, npid
local score, hiscore, level, cleared_total
local over
local SIDE_W = 58
local function new_board()
local b = {}
for r = 1, ROWS do
b[r] = {}
for c = 1, COLS do b[r][c] = 0 end
end
return b
end
local function get_cells(p, r, bx, by)
local out = {}
for _, off in ipairs(PIECES[p][r]) do
out[#out+1] = {by + off[1], bx + off[2]}
end
return out
end
local function collides(p, r, bx, by)
for _, fc in ipairs(get_cells(p, r, bx, by)) do
local fr, fc2 = fc[1] + 1, fc[2] + 1 -- 0-indexed to 1-indexed
if fc[2] < 0 or fc[2] >= COLS or fc[1] >= ROWS then return true end
if fc[1] >= 0 and board[fr][fc2] ~= 0 then return true end
end
return false
end
local function lock_piece()
for _, fc in ipairs(get_cells(pid, rot, px, py)) do
local fr, fc2 = fc[1] + 1, fc[2] + 1
if fr >= 1 then board[fr][fc2] = pid end
end
local cleared = 0
local r = ROWS
while r >= 1 do
local full = true
for c = 1, COLS do
if board[r][c] == 0 then full = false; break end
end
if full then
table.remove(board, r)
table.insert(board, 1, {})
for c = 1, COLS do board[1][c] = 0 end
cleared = cleared + 1
else
r = r - 1
end
end
if cleared > 0 then
cleared_total = cleared_total + cleared
local pts = {100, 300, 500, 800}
score = score + (pts[cleared] or 800) * level
level = math.max(1, math.floor(cleared_total / 10) + 1)
timer.every(math.max(80, 700 - (level - 1) * 60))
end
end
local function spawn()
pid, npid = npid, sys.random(1, 7)
px = math.floor((COLS - 4) / 2) -- center the 4-wide bounding box
py = 0
rot = 1
if collides(pid, rot, px, py) then
over = true
if score > hiscore then
hiscore = score
store.set("hiscore", hiscore)
sys.toast("New high score: " .. hiscore, 2000)
end
end
end
local function draw_board()
cv:fill(0x0d1117)
for r = 1, ROWS do
for c = 1, COLS do
local v = board[r][c]
if v ~= 0 then
cv:rect((c-1)*CELL+1, (r-1)*CELL+1, CELL-2, CELL-2, COLORS[v], true, 2)
end
end
end
if not over then
for _, fc in ipairs(get_cells(pid, rot, px, py)) do
local r, c = fc[1]+1, fc[2]+1
if r >= 1 then
cv:rect((c-1)*CELL+1, (r-1)*CELL+1, CELL-2, CELL-2, COLORS[pid], true, 2)
end
end
end
if over then
local mx = math.floor(COLS * CELL / 2)
local my = math.floor(ROWS * CELL / 2)
cv:rect(mx - 44, my - 18, 88, 36, 0x1a1f26, true, 4)
cv:text(mx - 38, my - 12, "GAME OVER", C.bad, 14)
cv:text(mx - 30, my + 4, "tap to retry", C.sub, 11)
end
end
local function draw_side()
side_cv:fill(0x0d1117)
side_cv:text(6, 4, "NEXT", C.sub, 11)
local PC = 10
local ox = math.floor((SIDE_W - 4 * PC) / 2)
for _, off in ipairs(PIECES[npid][1]) do
side_cv:rect(ox + off[2]*PC+1, 20 + off[1]*PC+1, PC-2, PC-2, COLORS[npid], true, 2)
end
side_cv:text(6, 76, "SCORE", C.sub, 11)
side_cv:text(6, 90, tostring(score), C.text, 13)
side_cv:text(6, 116, "BEST", C.sub, 11)
side_cv:text(6, 130, tostring(hiscore), C.accent, 13)
side_cv:text(6, 156, "LEVEL", C.sub, 11)
side_cv:text(6, 170, tostring(level), C.good, 15)
end
local function try_rotate()
local nr = (rot % 4) + 1
if not collides(pid, nr, px, py) then rot = nr
elseif not collides(pid, nr, px-1, py) then px = px-1; rot = nr
elseif not collides(pid, nr, px+1, py) then px = px+1; rot = nr
end
draw_board()
end
local function hard_drop()
while not collides(pid, rot, px, py+1) do py = py+1 end
lock_piece()
spawn()
draw_board()
draw_side()
end
local function reset()
board = new_board()
score, cleared_total, level = 0, 0, 1
over = false
npid = sys.random(1, 7)
spawn()
draw_board()
draw_side()
timer.every(700)
end
function app.on_open(w, h)
hiscore = store.get("hiscore", 0)
local board_w = COLS * CELL
local board_h = ROWS * CELL
local total_w = board_w + 4 + SIDE_W
local ox = math.max(0, math.floor((w - total_w) / 2))
local oy = math.max(0, math.floor((h - board_h) / 2))
cv = ui.canvas(board_w, board_h)
cv:pos(ox, oy)
side_cv = ui.canvas(SIDE_W, board_h)
side_cv:pos(ox + board_w + 4, oy)
reset()
end
function app.on_input(ev)
if over then
if ev.type == "down" then reset() end
return
end
if ev.type == "swipe" then
local d = ev.dir
if d == "left" then
if not collides(pid, rot, px-1, py) then px = px-1; draw_board() end
elseif d == "right" then
if not collides(pid, rot, px+1, py) then px = px+1; draw_board() end
elseif d == "up" then
try_rotate()
elseif d == "down" then
hard_drop()
end
elseif ev.type == "key" then
local k = ev.key
if k == "left" then
if not collides(pid, rot, px-1, py) then px = px-1; draw_board() end
elseif k == "right" then
if not collides(pid, rot, px+1, py) then px = px+1; draw_board() end
elseif k == "up" then
try_rotate()
elseif k == "down" then
if not collides(pid, rot, px, py+1) then py = py+1; draw_board() end
elseif k == "enter" or k == " " then
hard_drop()
end
end
end
function app.on_tick(dt)
if over then return end
if collides(pid, rot, px, py+1) then
lock_piece()
spawn()
draw_board()
draw_side()
else
py = py + 1
draw_board()
end
end
function app.on_close() end
return app
@@ -0,0 +1 @@
{"id":"tripodometer","name":"Trip Odometer","ver":"1.0","desc":"GPS trip computer: distance, time, speed, altitude. Start/Stop to track, Reset to clear. Saves your trip across restarts. Contributed by samuelcoustet.","requires":"gps"}
@@ -0,0 +1,176 @@
-- Trip Odometer — wadamesh Lua app
-- Tracks distance, time, speed, and altitude for a trip via GPS.
-- Tap Start/Stop to track, Reset to clear. Saves your trip across app restarts.
-- Contributed by samuelcoustet
local ui, sys, store, timer = wada.ui, wada.sys, wada.store, wada.timer
local C = ui.colors
local app = {}
local MIN_SPEED_KMH = 2.0 -- below this speed, GPS drift is ignored
local POLL_MS = 2000 -- GPS poll interval
-- state
local total_km, max_kmh, elapsed_s
local last_lat, last_lon
local running, fix
-- labels updated each tick
local spd_lbl, dist_lbl, time_lbl, maxspd_lbl, alt_lbl, sats_lbl, st_lbl
local function haversine(lat1, lon1, lat2, lon2)
local R = 6371.0
local dlat = (lat2 - lat1) * math.pi / 180.0
local dlon = (lon2 - lon1) * math.pi / 180.0
local a = math.sin(dlat * 0.5) ^ 2
+ math.cos(lat1 * math.pi / 180.0)
* math.cos(lat2 * math.pi / 180.0)
* math.sin(dlon * 0.5) ^ 2
return R * 2.0 * math.atan(math.sqrt(a), math.sqrt(1.0 - a))
end
local function fmt_time(s)
local h = math.floor(s / 3600)
local m = math.floor((s % 3600) / 60)
local sec = s % 60
if h > 0 then return string.format("%d:%02d:%02d", h, m, sec) end
return string.format("%d:%02d", m, sec)
end
local function fmt_dist(km)
if km < 1.0 then return string.format("%d m", math.floor(km * 1000)) end
return string.format("%.2f km", km)
end
local function save()
store.set("trip_km_x1000", math.floor(total_km * 1000))
store.set("trip_max_x10", math.floor(max_kmh * 10))
store.set("trip_s", elapsed_s)
end
local function redraw()
local spd = (fix and fix.speed_kmh) or 0.0
spd_lbl:set(string.format("%.1f", spd))
dist_lbl:set(fmt_dist(total_km))
time_lbl:set(fmt_time(elapsed_s))
maxspd_lbl:set(string.format("%.1f km/h", max_kmh))
if fix then
alt_lbl:set(string.format("%d m", fix.alt_m or 0))
sats_lbl:set(string.format("%d sats", fix.sats or 0))
if running then
st_lbl:set("tracking"); st_lbl:color(C.good)
else
st_lbl:set("paused"); st_lbl:color(C.sub)
end
else
alt_lbl:set("-- m")
sats_lbl:set("no GPS")
st_lbl:set("no fix"); st_lbl:color(C.bad)
end
end
function app.on_open(w, h)
-- restore saved trip
total_km = store.get("trip_km_x1000", 0) / 1000.0
max_kmh = store.get("trip_max_x10", 0) / 10.0
elapsed_s = store.get("trip_s", 0)
running = false
fix = nil
last_lat = nil
last_lon = nil
local col2 = math.floor(w / 2)
-- large speed at top
ui.label("SPEED", 8, 6, 11, C.sub)
spd_lbl = ui.label("0.0", 8, 20, 36, C.accent)
ui.label("km/h", 8, 60, 12, C.sub)
-- 2×2 grid
local y2 = 84
ui.label("DISTANCE", 8, y2, 11, C.sub)
dist_lbl = ui.label("0 m", 8, y2 + 14, 20, C.text)
ui.label("TIME", col2, y2, 11, C.sub)
time_lbl = ui.label("0:00", col2, y2 + 14, 20, C.text)
local y3 = y2 + 48
ui.label("MAX SPEED", 8, y3, 11, C.sub)
maxspd_lbl = ui.label("0.0 km/h", 8, y3 + 14, 16, C.text)
ui.label("ALTITUDE", col2, y3, 11, C.sub)
alt_lbl = ui.label("-- m", col2, y3 + 14, 16, C.text)
-- GPS status row
local y4 = y3 + 42
sats_lbl = ui.label("no GPS", 8, y4, 13, C.sub)
st_lbl = ui.label("no fix", col2, y4, 13, C.sub)
-- buttons anchored to bottom
local bw = math.floor((w - 20) / 2)
local btn_y = h - 46
ui.button("Start / Stop", 8, btn_y, bw, 36, function()
running = not running
if running then
last_lat = nil; last_lon = nil -- fresh segment on resume
end
redraw()
end)
ui.button("Reset", 12 + bw, btn_y, bw, 36, function()
total_km = 0; max_kmh = 0; elapsed_s = 0
last_lat = nil; last_lon = nil
running = false
save()
redraw()
sys.toast("Trip reset", 1200)
end)
timer.every(POLL_MS)
redraw()
end
function app.on_tick()
fix = sys.gps()
if running then
elapsed_s = elapsed_s + math.floor(POLL_MS / 1000)
if fix and fix.lat and fix.lon then
local spd = fix.speed_kmh or 0.0
if spd > max_kmh then max_kmh = spd end
if spd >= MIN_SPEED_KMH then
if last_lat then
local d = haversine(last_lat, last_lon, fix.lat, fix.lon)
if d > 0.003 then -- skip < 3 m to suppress stationary jitter
total_km = total_km + d
end
end
last_lat = fix.lat; last_lon = fix.lon
end
end
if elapsed_s % 10 == 0 then save() end
end
redraw()
end
function app.on_input(ev)
-- swipe down = shortcut to reset (only when stopped, to avoid accidents)
if ev.type == "swipe" and ev.dir == "down" and not running then
total_km = 0; max_kmh = 0; elapsed_s = 0
last_lat = nil; last_lon = nil
save(); redraw()
sys.toast("Trip reset", 1200)
end
end
function app.on_close()
save()
end
return app
+7
View File
@@ -104,6 +104,13 @@
<esp-web-install-button manifest="./manifest-tlora-pager-sx1262.json"></esp-web-install-button>
<span class="unsupported">Use Chrome or Edge on desktop (Web Serial).</span>
</div>
<div class="card">
<h2>Elecrow CrowPanel Advance 3.5 <span class="beta">Beta</span></h2>
<p>3.5&quot; touch display, microSD, and an SX1262 module in the LoRa expansion slot.</p>
<p class="warn">For the <b>Advance 3.5</b> only. Hardware validation is pending; the SX1262 module must be attached.</p>
<esp-web-install-button manifest="https://firmware.wadamesh.com/latest-beta/manifest-crowpanel-35.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,
+16 -16
View File
@@ -17,19 +17,19 @@
"role": "gui",
"title": "Touch UI",
"version": {
"beta_83": {
"notes": "New on the T-Deck and the Heltec V4: USB Files. Open it from the app drawer, connect the device to a computer with a USB cable and go to files.wadamesh.com in Chrome or Edge. You can browse the SD card, internal storage and the map tiles, upload files and whole folders, and download, rename or delete them.\nThe device carries out every file operation itself, so what it relies on stays safe: identity, contacts, settings and chat history can be downloaded but not changed or deleted. On the SD card that is the meshcomod folder.\nFiles that SD Scan would flag, like Windows programs, scripts, shortcuts and autorun.inf, show in red on the page, and downloading one asks you first. The device also checks a file's first bytes, so a Windows program under a harmless name is caught too.\nYour files go straight from the device to your computer over the cable. Nothing passes through our server.\nWhile USB Files is open, the companion app cannot use USB. Bluetooth, Wi-Fi and the radio keep working.\nThe buttons on the sides of wadamesh.com now have labels, and a new folder button opens USB Files.\nUSB Files is tested on a T-Deck. Heltec V4 owners: worth reporting whether connecting, uploading and downloading work. Other boards follow once tested.",
"beta_85": {
"notes": "Settings, About has \"Send a test report\". Say whether it works on your board, tick what you actually used, say how long you have run it, and send. What comes in is at wadamesh.com/beta, and that is what the next stable release gets promoted on, instead of nobody having complained. It takes one tap and needs Wi-Fi.\nThe report carries the board, the version, your ticks and the free memory. No name, no contacts, no position, and the device lists exactly what it will send before it sends it.\n\"Report a bug\" on the same page draws a QR code. Scan it with your phone and a GitHub issue form opens with your board, version and diagnostics already filled in, so you only type what went wrong, and it is filed under your own account.\nOptional, off by default: \"Count this device\" lets the update check say which board and build it is running, so a board nobody has reported on can be told apart from a board nobody owns.\nA T-Deck Max that updated itself installed T-Deck Pro firmware. The Max reuses the Pro's display and touch drivers, and the table that picks the download file matched the Pro first, so the update check found the right release and then fetched the wrong image for it. If you have a Max on beta_84, update this one over USB from wadamesh.com rather than from the device.\nThe screen timeout is a slider with fixed stops now, from 30 seconds to an hour, plus Never, instead of a free-text field. Existing settings move to the nearest stop and the default is 30 seconds.\nThe keyboard backlight in Auto follows your screen timeout instead of switching off after about three seconds, which was too short to finish typing.\nAdvert can be left from the screen itself on every touch board, not just with a hardware key.\nExport and Import moved out of Profile into Backups, as one Export action with an optional timestamp in the filename. Import finds the backups on internal storage and the card by itself and only asks which one when there is more than one.\nThinkNode M9: pressing down at the bottom of a conversation reveals the next message instead of stopping, Back stays in the app drawer when the drawer is your home screen, and a page title no longer sits on top of the lock screen.\nT-Deck Pro and Max: the sender and the message no longer overdraw each other, first-run setup can be driven from the keyboard, and Commander has two rows of controls.\nT-Deck Pro and Max: the lock screen is drawn for the screen it is on, the e-paper keeps an unambiguous locked frame instead of the last live view, and a hard lock survives waking the front pad.\nThe M9 has text size presets: Settings, Display, UI size, with Normal, Large text and Huge text. It grows the text and leaves the layout alone, so rows, cards and controls keep their size and nothing becomes unreachable, which is how the Heltec V4-R8 does it on the same size panel. Your current setting is untouched by the update.\nThe T-Display P4 can run landscape. Settings, Display, Orientation, and it restarts to apply. The panel itself cannot rotate, so the interface is rotated in software the way the Tanmatsu already does it on the same chip.\nI did not have my P4 with me to test this, so it goes out untested on the hardware. If you have one, this is the thing to try and report: whether it is smooth, and whether taps land where you put them, particularly near the edges. Portrait is still the default and one tap puts it back.\nCoordinates in a chat message can be opened on the map. The message menu gains Map, tapping the message does the same, and the spot is marked so you can find it again or remove it. By TerryTel93.\nCompact chat messages have a small gap between them on the T-Deck Pro and Max, which have no alternating row colour to separate them.\nReporting from the device is new and has never run on real hardware. If it fails, say so the old way, on Discord or GitHub.\nThe screen timeout default changed for everyone: check Settings, Display if your screen now sleeps sooner or later than you expect.",
"files": [
{
"type": "flash-wipe",
"name": "wadamesh-heltec-v4-tft-merged.bin",
"url": "https://firmware.wadamesh.com/releases/TOUCH/beta_83/wadamesh-heltec-v4-tft-merged.bin",
"url": "https://firmware.wadamesh.com/releases/TOUCH/beta_85/wadamesh-heltec-v4-tft-merged.bin",
"title": "Full install (bootloader + firmware)"
},
{
"type": "flash-update",
"name": "wadamesh-heltec-v4-tft.bin",
"url": "https://firmware.wadamesh.com/releases/TOUCH/beta_83/wadamesh-heltec-v4-tft.bin",
"url": "https://firmware.wadamesh.com/releases/TOUCH/beta_85/wadamesh-heltec-v4-tft.bin",
"title": "Update (app only)"
}
]
@@ -49,19 +49,19 @@
"role": "gui",
"title": "Touch UI",
"version": {
"beta_83": {
"notes": "New on the T-Deck and the Heltec V4: USB Files. Open it from the app drawer, connect the device to a computer with a USB cable and go to files.wadamesh.com in Chrome or Edge. You can browse the SD card, internal storage and the map tiles, upload files and whole folders, and download, rename or delete them.\nThe device carries out every file operation itself, so what it relies on stays safe: identity, contacts, settings and chat history can be downloaded but not changed or deleted. On the SD card that is the meshcomod folder.\nFiles that SD Scan would flag, like Windows programs, scripts, shortcuts and autorun.inf, show in red on the page, and downloading one asks you first. The device also checks a file's first bytes, so a Windows program under a harmless name is caught too.\nYour files go straight from the device to your computer over the cable. Nothing passes through our server.\nWhile USB Files is open, the companion app cannot use USB. Bluetooth, Wi-Fi and the radio keep working.\nThe buttons on the sides of wadamesh.com now have labels, and a new folder button opens USB Files.\nUSB Files is tested on a T-Deck. Heltec V4 owners: worth reporting whether connecting, uploading and downloading work. Other boards follow once tested.",
"beta_85": {
"notes": "Settings, About has \"Send a test report\". Say whether it works on your board, tick what you actually used, say how long you have run it, and send. What comes in is at wadamesh.com/beta, and that is what the next stable release gets promoted on, instead of nobody having complained. It takes one tap and needs Wi-Fi.\nThe report carries the board, the version, your ticks and the free memory. No name, no contacts, no position, and the device lists exactly what it will send before it sends it.\n\"Report a bug\" on the same page draws a QR code. Scan it with your phone and a GitHub issue form opens with your board, version and diagnostics already filled in, so you only type what went wrong, and it is filed under your own account.\nOptional, off by default: \"Count this device\" lets the update check say which board and build it is running, so a board nobody has reported on can be told apart from a board nobody owns.\nA T-Deck Max that updated itself installed T-Deck Pro firmware. The Max reuses the Pro's display and touch drivers, and the table that picks the download file matched the Pro first, so the update check found the right release and then fetched the wrong image for it. If you have a Max on beta_84, update this one over USB from wadamesh.com rather than from the device.\nThe screen timeout is a slider with fixed stops now, from 30 seconds to an hour, plus Never, instead of a free-text field. Existing settings move to the nearest stop and the default is 30 seconds.\nThe keyboard backlight in Auto follows your screen timeout instead of switching off after about three seconds, which was too short to finish typing.\nAdvert can be left from the screen itself on every touch board, not just with a hardware key.\nExport and Import moved out of Profile into Backups, as one Export action with an optional timestamp in the filename. Import finds the backups on internal storage and the card by itself and only asks which one when there is more than one.\nThinkNode M9: pressing down at the bottom of a conversation reveals the next message instead of stopping, Back stays in the app drawer when the drawer is your home screen, and a page title no longer sits on top of the lock screen.\nT-Deck Pro and Max: the sender and the message no longer overdraw each other, first-run setup can be driven from the keyboard, and Commander has two rows of controls.\nT-Deck Pro and Max: the lock screen is drawn for the screen it is on, the e-paper keeps an unambiguous locked frame instead of the last live view, and a hard lock survives waking the front pad.\nThe M9 has text size presets: Settings, Display, UI size, with Normal, Large text and Huge text. It grows the text and leaves the layout alone, so rows, cards and controls keep their size and nothing becomes unreachable, which is how the Heltec V4-R8 does it on the same size panel. Your current setting is untouched by the update.\nThe T-Display P4 can run landscape. Settings, Display, Orientation, and it restarts to apply. The panel itself cannot rotate, so the interface is rotated in software the way the Tanmatsu already does it on the same chip.\nI did not have my P4 with me to test this, so it goes out untested on the hardware. If you have one, this is the thing to try and report: whether it is smooth, and whether taps land where you put them, particularly near the edges. Portrait is still the default and one tap puts it back.\nCoordinates in a chat message can be opened on the map. The message menu gains Map, tapping the message does the same, and the spot is marked so you can find it again or remove it. By TerryTel93.\nCompact chat messages have a small gap between them on the T-Deck Pro and Max, which have no alternating row colour to separate them.\nReporting from the device is new and has never run on real hardware. If it fails, say so the old way, on Discord or GitHub.\nThe screen timeout default changed for everyone: check Settings, Display if your screen now sleeps sooner or later than you expect.",
"files": [
{
"type": "flash-wipe",
"name": "wadamesh-tdeck-merged.bin",
"url": "https://firmware.wadamesh.com/releases/TOUCH/beta_83/wadamesh-tdeck-merged.bin",
"url": "https://firmware.wadamesh.com/releases/TOUCH/beta_85/wadamesh-tdeck-merged.bin",
"title": "Full install (bootloader + firmware)"
},
{
"type": "flash-update",
"name": "wadamesh-tdeck.bin",
"url": "https://firmware.wadamesh.com/releases/TOUCH/beta_83/wadamesh-tdeck.bin",
"url": "https://firmware.wadamesh.com/releases/TOUCH/beta_85/wadamesh-tdeck.bin",
"title": "Update (app only)"
}
]
@@ -81,19 +81,19 @@
"role": "gui",
"title": "[LR1121] Touch UI",
"version": {
"beta_83": {
"notes": "New on the T-Deck and the Heltec V4: USB Files. Open it from the app drawer, connect the device to a computer with a USB cable and go to files.wadamesh.com in Chrome or Edge. You can browse the SD card, internal storage and the map tiles, upload files and whole folders, and download, rename or delete them.\nThe device carries out every file operation itself, so what it relies on stays safe: identity, contacts, settings and chat history can be downloaded but not changed or deleted. On the SD card that is the meshcomod folder.\nFiles that SD Scan would flag, like Windows programs, scripts, shortcuts and autorun.inf, show in red on the page, and downloading one asks you first. The device also checks a file's first bytes, so a Windows program under a harmless name is caught too.\nYour files go straight from the device to your computer over the cable. Nothing passes through our server.\nWhile USB Files is open, the companion app cannot use USB. Bluetooth, Wi-Fi and the radio keep working.\nThe buttons on the sides of wadamesh.com now have labels, and a new folder button opens USB Files.\nUSB Files is tested on a T-Deck. Heltec V4 owners: worth reporting whether connecting, uploading and downloading work. Other boards follow once tested.",
"beta_85": {
"notes": "Settings, About has \"Send a test report\". Say whether it works on your board, tick what you actually used, say how long you have run it, and send. What comes in is at wadamesh.com/beta, and that is what the next stable release gets promoted on, instead of nobody having complained. It takes one tap and needs Wi-Fi.\nThe report carries the board, the version, your ticks and the free memory. No name, no contacts, no position, and the device lists exactly what it will send before it sends it.\n\"Report a bug\" on the same page draws a QR code. Scan it with your phone and a GitHub issue form opens with your board, version and diagnostics already filled in, so you only type what went wrong, and it is filed under your own account.\nOptional, off by default: \"Count this device\" lets the update check say which board and build it is running, so a board nobody has reported on can be told apart from a board nobody owns.\nA T-Deck Max that updated itself installed T-Deck Pro firmware. The Max reuses the Pro's display and touch drivers, and the table that picks the download file matched the Pro first, so the update check found the right release and then fetched the wrong image for it. If you have a Max on beta_84, update this one over USB from wadamesh.com rather than from the device.\nThe screen timeout is a slider with fixed stops now, from 30 seconds to an hour, plus Never, instead of a free-text field. Existing settings move to the nearest stop and the default is 30 seconds.\nThe keyboard backlight in Auto follows your screen timeout instead of switching off after about three seconds, which was too short to finish typing.\nAdvert can be left from the screen itself on every touch board, not just with a hardware key.\nExport and Import moved out of Profile into Backups, as one Export action with an optional timestamp in the filename. Import finds the backups on internal storage and the card by itself and only asks which one when there is more than one.\nThinkNode M9: pressing down at the bottom of a conversation reveals the next message instead of stopping, Back stays in the app drawer when the drawer is your home screen, and a page title no longer sits on top of the lock screen.\nT-Deck Pro and Max: the sender and the message no longer overdraw each other, first-run setup can be driven from the keyboard, and Commander has two rows of controls.\nT-Deck Pro and Max: the lock screen is drawn for the screen it is on, the e-paper keeps an unambiguous locked frame instead of the last live view, and a hard lock survives waking the front pad.\nThe M9 has text size presets: Settings, Display, UI size, with Normal, Large text and Huge text. It grows the text and leaves the layout alone, so rows, cards and controls keep their size and nothing becomes unreachable, which is how the Heltec V4-R8 does it on the same size panel. Your current setting is untouched by the update.\nThe T-Display P4 can run landscape. Settings, Display, Orientation, and it restarts to apply. The panel itself cannot rotate, so the interface is rotated in software the way the Tanmatsu already does it on the same chip.\nI did not have my P4 with me to test this, so it goes out untested on the hardware. If you have one, this is the thing to try and report: whether it is smooth, and whether taps land where you put them, particularly near the edges. Portrait is still the default and one tap puts it back.\nCoordinates in a chat message can be opened on the map. The message menu gains Map, tapping the message does the same, and the spot is marked so you can find it again or remove it. By TerryTel93.\nCompact chat messages have a small gap between them on the T-Deck Pro and Max, which have no alternating row colour to separate them.\nReporting from the device is new and has never run on real hardware. If it fails, say so the old way, on Discord or GitHub.\nThe screen timeout default changed for everyone: check Settings, Display if your screen now sleeps sooner or later than you expect.",
"files": [
{
"type": "flash-wipe",
"name": "wadamesh-tlora-pager-lr1121-merged.bin",
"url": "https://firmware.wadamesh.com/releases/TOUCH/beta_83/wadamesh-tlora-pager-lr1121-merged.bin",
"url": "https://firmware.wadamesh.com/releases/TOUCH/beta_85/wadamesh-tlora-pager-lr1121-merged.bin",
"title": "Full install (bootloader + firmware)"
},
{
"type": "flash-update",
"name": "wadamesh-tlora-pager-lr1121.bin",
"url": "https://firmware.wadamesh.com/releases/TOUCH/beta_83/wadamesh-tlora-pager-lr1121.bin",
"url": "https://firmware.wadamesh.com/releases/TOUCH/beta_85/wadamesh-tlora-pager-lr1121.bin",
"title": "Update (app only)"
}
]
@@ -104,19 +104,19 @@
"role": "gui",
"title": "[SX1262] Touch UI",
"version": {
"beta_83": {
"notes": "New on the T-Deck and the Heltec V4: USB Files. Open it from the app drawer, connect the device to a computer with a USB cable and go to files.wadamesh.com in Chrome or Edge. You can browse the SD card, internal storage and the map tiles, upload files and whole folders, and download, rename or delete them.\nThe device carries out every file operation itself, so what it relies on stays safe: identity, contacts, settings and chat history can be downloaded but not changed or deleted. On the SD card that is the meshcomod folder.\nFiles that SD Scan would flag, like Windows programs, scripts, shortcuts and autorun.inf, show in red on the page, and downloading one asks you first. The device also checks a file's first bytes, so a Windows program under a harmless name is caught too.\nYour files go straight from the device to your computer over the cable. Nothing passes through our server.\nWhile USB Files is open, the companion app cannot use USB. Bluetooth, Wi-Fi and the radio keep working.\nThe buttons on the sides of wadamesh.com now have labels, and a new folder button opens USB Files.\nUSB Files is tested on a T-Deck. Heltec V4 owners: worth reporting whether connecting, uploading and downloading work. Other boards follow once tested.",
"beta_85": {
"notes": "Settings, About has \"Send a test report\". Say whether it works on your board, tick what you actually used, say how long you have run it, and send. What comes in is at wadamesh.com/beta, and that is what the next stable release gets promoted on, instead of nobody having complained. It takes one tap and needs Wi-Fi.\nThe report carries the board, the version, your ticks and the free memory. No name, no contacts, no position, and the device lists exactly what it will send before it sends it.\n\"Report a bug\" on the same page draws a QR code. Scan it with your phone and a GitHub issue form opens with your board, version and diagnostics already filled in, so you only type what went wrong, and it is filed under your own account.\nOptional, off by default: \"Count this device\" lets the update check say which board and build it is running, so a board nobody has reported on can be told apart from a board nobody owns.\nA T-Deck Max that updated itself installed T-Deck Pro firmware. The Max reuses the Pro's display and touch drivers, and the table that picks the download file matched the Pro first, so the update check found the right release and then fetched the wrong image for it. If you have a Max on beta_84, update this one over USB from wadamesh.com rather than from the device.\nThe screen timeout is a slider with fixed stops now, from 30 seconds to an hour, plus Never, instead of a free-text field. Existing settings move to the nearest stop and the default is 30 seconds.\nThe keyboard backlight in Auto follows your screen timeout instead of switching off after about three seconds, which was too short to finish typing.\nAdvert can be left from the screen itself on every touch board, not just with a hardware key.\nExport and Import moved out of Profile into Backups, as one Export action with an optional timestamp in the filename. Import finds the backups on internal storage and the card by itself and only asks which one when there is more than one.\nThinkNode M9: pressing down at the bottom of a conversation reveals the next message instead of stopping, Back stays in the app drawer when the drawer is your home screen, and a page title no longer sits on top of the lock screen.\nT-Deck Pro and Max: the sender and the message no longer overdraw each other, first-run setup can be driven from the keyboard, and Commander has two rows of controls.\nT-Deck Pro and Max: the lock screen is drawn for the screen it is on, the e-paper keeps an unambiguous locked frame instead of the last live view, and a hard lock survives waking the front pad.\nThe M9 has text size presets: Settings, Display, UI size, with Normal, Large text and Huge text. It grows the text and leaves the layout alone, so rows, cards and controls keep their size and nothing becomes unreachable, which is how the Heltec V4-R8 does it on the same size panel. Your current setting is untouched by the update.\nThe T-Display P4 can run landscape. Settings, Display, Orientation, and it restarts to apply. The panel itself cannot rotate, so the interface is rotated in software the way the Tanmatsu already does it on the same chip.\nI did not have my P4 with me to test this, so it goes out untested on the hardware. If you have one, this is the thing to try and report: whether it is smooth, and whether taps land where you put them, particularly near the edges. Portrait is still the default and one tap puts it back.\nCoordinates in a chat message can be opened on the map. The message menu gains Map, tapping the message does the same, and the spot is marked so you can find it again or remove it. By TerryTel93.\nCompact chat messages have a small gap between them on the T-Deck Pro and Max, which have no alternating row colour to separate them.\nReporting from the device is new and has never run on real hardware. If it fails, say so the old way, on Discord or GitHub.\nThe screen timeout default changed for everyone: check Settings, Display if your screen now sleeps sooner or later than you expect.",
"files": [
{
"type": "flash-wipe",
"name": "wadamesh-tlora-pager-sx1262-merged.bin",
"url": "https://firmware.wadamesh.com/releases/TOUCH/beta_83/wadamesh-tlora-pager-sx1262-merged.bin",
"url": "https://firmware.wadamesh.com/releases/TOUCH/beta_85/wadamesh-tlora-pager-sx1262-merged.bin",
"title": "Full install (bootloader + firmware)"
},
{
"type": "flash-update",
"name": "wadamesh-tlora-pager-sx1262.bin",
"url": "https://firmware.wadamesh.com/releases/TOUCH/beta_83/wadamesh-tlora-pager-sx1262.bin",
"url": "https://firmware.wadamesh.com/releases/TOUCH/beta_85/wadamesh-tlora-pager-sx1262.bin",
"title": "Update (app only)"
}
]
+7 -2
View File
@@ -98,11 +98,16 @@ AREA_LABEL = {
"storage": "storage and SD",
}
RAN = ("boot", "day", "week")
RAN_LABEL = {"boot": "just flashed", "day": "about a day", "week": "a week or more"}
RAN_LABEL = {"boot": "ran it for minutes", "day": "ran it for about a day",
"week": "ran it for a week or more"}
# Boards with no web-flasher manifest to take a display name from.
NAME_FALLBACK = {
"tdisplay-p4-lcd": "LilyGo T-Display P4 (LCD)",
"tdeck-pro-v1-0": "LilyGo T-Deck Pro V1.0",
"tdeck-pro-v1-1": "LilyGo T-Deck Pro V1.1",
"tdisplay-p4-lr2021": "LilyGo T-Display P4 (AMOLED, LR2021)",
"tdisplay-p4-lcd": "LilyGo T-Display P4 (LCD, SX1262)",
"tdisplay-p4-lcd-lr2021": "LilyGo T-Display P4 (LCD, LR2021)",
"tanmatsu": "Tanmatsu",
}
+4 -2
View File
@@ -177,7 +177,9 @@ const API = 'https://firmware.wadamesh.com/report/matrix.json';
const LABEL = {radio:'radio and messaging', map:'map and GPS', link:'phone-app link',
input:'keyboard and input', storage:'storage and SD'};
const STATE = {green:'green', amber:'needs a second report', red:'problem reported', none:'no reports'};
const RAN = {boot:'just flashed', day:'about a day', week:'a week or more'};
// Phrased as durations, not bare spans: next to the "57 min ago" timestamp,
// "about a day" read as a contradiction rather than as how long they ran it.
const RAN = {boot:'ran it for minutes', day:'ran it for about a day', week:'ran it for a week or more'};
function ago(ts){
if(!ts) return '';
@@ -261,7 +263,7 @@ function render(d){
nb.innerHTML = notes.map(([b, n]) =>
'<div class="n"><div class="who">' + esc(b.name) + ', '
+ (n.status === 'works' ? 'works' : 'problem') + ', ' + (RAN[n.ran] || n.ran)
+ ', ' + ago(n.at) + '</div>' + esc(n.note) + '</div>').join('');
+ ', reported ' + ago(n.at) + '</div>' + esc(n.note) + '</div>').join('');
}
document.getElementById('stamp').textContent =
Binary file not shown.

Before

Width:  |  Height:  |  Size: 12 KiB

After

Width:  |  Height:  |  Size: 13 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 9.5 KiB

After

Width:  |  Height:  |  Size: 9.0 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 10 KiB

After

Width:  |  Height:  |  Size: 12 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 15 KiB

After

Width:  |  Height:  |  Size: 15 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 12 KiB

After

Width:  |  Height:  |  Size: 12 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 17 KiB

After

Width:  |  Height:  |  Size: 17 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 10 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 16 KiB

After

Width:  |  Height:  |  Size: 19 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 22 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 17 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 11 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 12 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 12 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 16 KiB

After

Width:  |  Height:  |  Size: 16 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 15 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 18 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 12 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 12 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.4 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 11 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 15 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 15 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 16 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 18 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 16 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 16 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 16 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 119 KiB

After

Width:  |  Height:  |  Size: 115 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 15 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 14 KiB

After

Width:  |  Height:  |  Size: 13 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 15 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 13 KiB

After

Width:  |  Height:  |  Size: 13 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 11 KiB

After

Width:  |  Height:  |  Size: 12 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 13 KiB

After

Width:  |  Height:  |  Size: 13 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 11 KiB

After

Width:  |  Height:  |  Size: 11 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 12 KiB

After

Width:  |  Height:  |  Size: 13 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 13 KiB

After

Width:  |  Height:  |  Size: 12 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 12 KiB

After

Width:  |  Height:  |  Size: 13 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 9.0 KiB

After

Width:  |  Height:  |  Size: 13 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 13 KiB

After

Width:  |  Height:  |  Size: 13 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 9.5 KiB

After

Width:  |  Height:  |  Size: 9.9 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 13 KiB

After

Width:  |  Height:  |  Size: 12 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 16 KiB

After

Width:  |  Height:  |  Size: 16 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 13 KiB

After

Width:  |  Height:  |  Size: 9.8 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 10 KiB

After

Width:  |  Height:  |  Size: 10 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 14 KiB

After

Width:  |  Height:  |  Size: 13 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 4.5 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 12 KiB

After

Width:  |  Height:  |  Size: 13 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 12 KiB

After

Width:  |  Height:  |  Size: 9.8 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 12 KiB

After

Width:  |  Height:  |  Size: 14 KiB

Loaded 100 of 228 files, more files were not shown because too many files have changed in this diff. Show more