Compare commits

...
3 Commits
Author SHA1 Message Date
Kaj SchittecatandClaude Opus 5 708f4434f5 touch: beta_73 release notes
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-08-28 10:32:19 +02:00
Kaj SchittecatandClaude Opus 5 875ac92a48 keyboard: let raw mode admit it guessed wrong (#341)
Vybo's older T-Deck types garbage on beta_71 and beta_72: "I get some keyboard
codes when typing". His controller has the pre-backlight firmware and does not
speak the raw column protocol, but the probe concluded it did.

A legacy controller answers a five-byte read with the pressed character in byte
0 and padding after it, and every lowercase letter has its high bit clear, so
"five bytes came back and no high bit is set" passes. Read as a column bitmap,
0x61 ('a') sets bits 0, 5 and 6 of column 0 and emits "q "; 0x6d ('m') emits
"qa ". That is exactly what he sees. Worse, the retry window I added in beta_72
gave a legacy controller more chances to look plausible, which is why it did not
help him.

The probe cannot fix this alone. Idle, both controllers answer with zeros, and
requiring proof of a real matrix before committing means an idle boot never
finds any, falls back to legacy, and everyone silently loses modifier latching.
Tried that first; it cost latching on a device where raw mode was working.

So the decision stays optimistic and becomes reversible. Raw mode now tests each
frame: three or more bits in byte 0, a printable value, and every other column
empty is not something a key matrix can report, but it is precisely an ASCII
character. On that, the driver returns the controller to key mode, switches to
legacy, and delivers the character.

Checked against the real tables rather than assumed: all 26 lowercase letters
set three or more bits, so any letter demotes on the FIRST press. Only '0', ' '
and '!' do not, and space renders correctly anyway since column 0 bit 5 IS
space. Going the other way needs three or more of {q, w, a, space} held at once
and nothing else; the printable-range test drops q+w+a (0x0B), and what remains
is a fumble that costs a reboot rather than a wrong character.

Worst case for a misdetected board is now one odd keystroke instead of a
keyboard that types nonsense until it is reflashed.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-08-28 10:20:26 +02:00
Kaj SchittecatandClaude Opus 5 afecfc0224 i18n: two Hungarian strings pisti87 asked for (#340)
"Mark read" was an untranslated placeholder. "Join the public channel" had the
long form, which he wants shortened to fit the button.

His text for the second reads "nyílvános"; the file already uses "nyilvános"
everywhere else, so this follows the file rather than introducing a second
spelling. Easy to change back if the long i was deliberate.

The other line numbers in that issue are from his own build and no longer point
at what he means, so they need his source rather than mine to resolve.

Languages go to v20.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-08-28 09:38:22 +02:00
30 changed files with 232 additions and 71 deletions

No files matched your search

@@ -1,7 +1,7 @@
# wadamesh language file # wadamesh language file
# canonical source - translators: edit this file and PR it # canonical source - translators: edit this file and PR it
# code: bg # code: bg
# ver: 19 # ver: 20
# name: Български # name: Български
# base: bg # base: bg
(device behind) (устройството изостава) (device behind) (устройството изостава)
@@ -184,6 +184,7 @@ Contact added Контактът е добавен
Contact deleted Контактът е изтрит Contact deleted Контактът е изтрит
Contact gone Контактът изчезна Contact gone Контактът изчезна
Contact missing Контактът липсва Contact missing Контактът липсва
Contact shared Контактът е споделен
Contacts Контакти Contacts Контакти
Contacts are on internal flash - the SD card did not mount at boot. Re-seat the card and reboot. Контактите са във вътрешната памет - SD картата не се монтира при старт. Постави картата отново и рестартирай. Contacts are on internal flash - the SD card did not mount at boot. Re-seat the card and reboot. Контактите са във вътрешната памет - SD картата не се монтира при старт. Постави картата отново и рестартирай.
Contacts are on internal flash. Контактите са във вътрешната памет. Contacts are on internal flash. Контактите са във вътрешната памет.
@@ -778,6 +779,8 @@ Settings Настройки
Setup complete Настройката е готова Setup complete Настройката е готова
Share QR Сподели QR Share QR Сподели QR
Share channel Сподели канала Share channel Сподели канала
Share contact Сподели контакт
Share failed Споделянето неуспешно
Share location in advert Споделяй местоположението в advert Share location in advert Споделяй местоположението в advert
Share secret Сподели ключа Share secret Сподели ключа
Share the 32-char secret so others can join. Leave the secret empty to generate a random one. Споделете 32-символната тайна, за да се присъединят други. Празно = случайна. Share the 32-char secret so others can join. Leave the secret empty to generate a random one. Споделете 32-символната тайна, за да се присъединят други. Празно = случайна.
@@ -1103,3 +1106,6 @@ Glance shows message previews\nwhile the screen is locked Glance shows message p
Snake — swipe, roll, or press a direction Snake — swipe, roll, or press a direction Snake — swipe, roll, or press a direction Snake — swipe, roll, or press a direction
N/A N/A N/A N/A
This board cannot run this app. This board cannot run this app. This board cannot run this app. This board cannot run this app.
Signal Signal
Signal (stale) Signal (stale)
nothing heard yet nothing heard yet
@@ -1,7 +1,7 @@
# wadamesh language file # wadamesh language file
# canonical source - translators: edit this file and PR it # canonical source - translators: edit this file and PR it
# code: de # code: de
# ver: 19 # ver: 20
# name: Deutsch # name: Deutsch
# base: de # base: de
(device behind) (Gerät geht nach) (device behind) (Gerät geht nach)
@@ -184,6 +184,7 @@ Contact added Kontakt hinzugefügt
Contact deleted Kontakt gelöscht Contact deleted Kontakt gelöscht
Contact gone Kontakt weg Contact gone Kontakt weg
Contact missing Kontakt fehlt Contact missing Kontakt fehlt
Contact shared Kontakt geteilt
Contacts Kontakte Contacts Kontakte
Contacts are on internal flash - the SD card did not mount at boot. Re-seat the card and reboot. Kontakte liegen im internen Flash - die SD-Karte wurde beim Start nicht eingebunden. Karte neu einsetzen und neu starten. Contacts are on internal flash - the SD card did not mount at boot. Re-seat the card and reboot. Kontakte liegen im internen Flash - die SD-Karte wurde beim Start nicht eingebunden. Karte neu einsetzen und neu starten.
Contacts are on internal flash. Kontakte liegen im internen Flash. Contacts are on internal flash. Kontakte liegen im internen Flash.
@@ -777,6 +778,8 @@ Settings Einstellungen
Setup complete Einrichtung abgeschlossen Setup complete Einrichtung abgeschlossen
Share QR QR teilen Share QR QR teilen
Share channel Kanal teilen Share channel Kanal teilen
Share contact Kontakt teilen
Share failed Teilen fehlgeschlagen
Share location in advert Standort im Advert teilen Share location in advert Standort im Advert teilen
Share secret Geheimnis teilen Share secret Geheimnis teilen
Share the 32-char secret so others can join. Leave the secret empty to generate a random one. Teilen Sie das 32-Zeichen-Geheimnis, damit andere beitreten. Leer lassen für ein zufälliges. Share the 32-char secret so others can join. Leave the secret empty to generate a random one. Teilen Sie das 32-Zeichen-Geheimnis, damit andere beitreten. Leer lassen für ein zufälliges.
@@ -1099,3 +1102,6 @@ Glance shows message previews\nwhile the screen is locked Glance shows message p
Snake — swipe, roll, or press a direction Snake — swipe, roll, or press a direction Snake — swipe, roll, or press a direction Snake — swipe, roll, or press a direction
N/A N/A N/A N/A
This board cannot run this app. This board cannot run this app. This board cannot run this app. This board cannot run this app.
Signal Signal
Signal (stale) Signal (stale)
nothing heard yet nothing heard yet
@@ -1,7 +1,7 @@
# wadamesh language file # wadamesh language file
# canonical source - translators: edit this file and PR it # canonical source - translators: edit this file and PR it
# code: el # code: el
# ver: 19 # ver: 20
# name: Ελληνικά # name: Ελληνικά
# base: el # base: el
(device behind) (συσκευή πίσω) (device behind) (συσκευή πίσω)
@@ -184,6 +184,7 @@ Contact added Η επαφή προστέθηκε
Contact deleted Η επαφή διαγράφηκε Contact deleted Η επαφή διαγράφηκε
Contact gone Η επαφή χάθηκε Contact gone Η επαφή χάθηκε
Contact missing Η επαφή λείπει Contact missing Η επαφή λείπει
Contact shared Η επαφή κοινοποιήθηκε
Contacts Επαφές Contacts Επαφές
Contacts are on internal flash - the SD card did not mount at boot. Re-seat the card and reboot. Οι επαφές είναι στην εσωτερική μνήμη - η κάρτα SD δεν προσαρτήθηκε στην εκκίνηση. Επανατοποθετήστε την και επανεκκινήστε. Contacts are on internal flash - the SD card did not mount at boot. Re-seat the card and reboot. Οι επαφές είναι στην εσωτερική μνήμη - η κάρτα SD δεν προσαρτήθηκε στην εκκίνηση. Επανατοποθετήστε την και επανεκκινήστε.
Contacts are on internal flash. Οι επαφές είναι στην εσωτερική μνήμη. Contacts are on internal flash. Οι επαφές είναι στην εσωτερική μνήμη.
@@ -778,6 +779,8 @@ Settings Ρυθμίσεις
Setup complete Η ρύθμιση ολοκληρώθηκε Setup complete Η ρύθμιση ολοκληρώθηκε
Share QR Κοινοποίηση QR Share QR Κοινοποίηση QR
Share channel Κοινή χρήση καναλιού Share channel Κοινή χρήση καναλιού
Share contact Κοινοποίηση επαφής
Share failed Αποτυχία κοινοποίησης
Share location in advert Κοινή χρήση θέσης στο advert Share location in advert Κοινή χρήση θέσης στο advert
Share secret Κοινοποίηση μυστικού Share secret Κοινοποίηση μυστικού
Share the 32-char secret so others can join. Leave the secret empty to generate a random one. Μοιραστείτε το μυστικό 32 χαρακτήρων για να συμμετάσχουν άλλοι. Κενό = τυχαίο. Share the 32-char secret so others can join. Leave the secret empty to generate a random one. Μοιραστείτε το μυστικό 32 χαρακτήρων για να συμμετάσχουν άλλοι. Κενό = τυχαίο.
@@ -1103,3 +1106,6 @@ Glance shows message previews\nwhile the screen is locked Glance shows message p
Snake — swipe, roll, or press a direction Snake — swipe, roll, or press a direction Snake — swipe, roll, or press a direction Snake — swipe, roll, or press a direction
N/A N/A N/A N/A
This board cannot run this app. This board cannot run this app. This board cannot run this app. This board cannot run this app.
Signal Signal
Signal (stale) Signal (stale)
nothing heard yet nothing heard yet
@@ -1,7 +1,7 @@
# wadamesh language file # wadamesh language file
# canonical source - translators: edit this file and PR it # canonical source - translators: edit this file and PR it
# code: es # code: es
# ver: 19 # ver: 20
# name: Español # name: Español
# base: es # base: es
(device behind) (dispositivo atrasado) (device behind) (dispositivo atrasado)
@@ -184,6 +184,7 @@ Contact added Contacto añadido
Contact deleted Contacto eliminado Contact deleted Contacto eliminado
Contact gone Contacto perdido Contact gone Contacto perdido
Contact missing Falta el contacto Contact missing Falta el contacto
Contact shared Contacto compartido
Contacts Contactos Contacts Contactos
Contacts are on internal flash - the SD card did not mount at boot. Re-seat the card and reboot. Los contactos están en memoria interna - la tarjeta SD no se montó al arrancar. Reinserta la tarjeta y reinicia. Contacts are on internal flash - the SD card did not mount at boot. Re-seat the card and reboot. Los contactos están en memoria interna - la tarjeta SD no se montó al arrancar. Reinserta la tarjeta y reinicia.
Contacts are on internal flash. Los contactos están en la memoria interna. Contacts are on internal flash. Los contactos están en la memoria interna.
@@ -778,6 +779,8 @@ Settings Ajustes
Setup complete Configuración completa Setup complete Configuración completa
Share QR Compartir QR Share QR Compartir QR
Share channel Compartir canal Share channel Compartir canal
Share contact Compartir contacto
Share failed Error al compartir
Share location in advert Compartir ubicación en anuncio Share location in advert Compartir ubicación en anuncio
Share secret Compartir secreto Share secret Compartir secreto
Share the 32-char secret so others can join. Leave the secret empty to generate a random one. Comparte el secreto de 32 caracteres para que otros se unan. Déjalo vacío para uno aleatorio. Share the 32-char secret so others can join. Leave the secret empty to generate a random one. Comparte el secreto de 32 caracteres para que otros se unan. Déjalo vacío para uno aleatorio.
@@ -1103,3 +1106,6 @@ Glance shows message previews\nwhile the screen is locked Glance shows message p
Snake — swipe, roll, or press a direction Snake — swipe, roll, or press a direction Snake — swipe, roll, or press a direction Snake — swipe, roll, or press a direction
N/A N/A N/A N/A
This board cannot run this app. This board cannot run this app. This board cannot run this app. This board cannot run this app.
Signal Signal
Signal (stale) Signal (stale)
nothing heard yet nothing heard yet
@@ -1,7 +1,7 @@
# wadamesh language file # wadamesh language file
# canonical source - translators: edit this file and PR it # canonical source - translators: edit this file and PR it
# code: fr # code: fr
# ver: 19 # ver: 20
# name: Français # name: Français
# base: fr # base: fr
(device behind) (appareil en retard) (device behind) (appareil en retard)
@@ -184,6 +184,7 @@ Contact added Contact ajouté
Contact deleted Contact supprimé Contact deleted Contact supprimé
Contact gone Contact perdu Contact gone Contact perdu
Contact missing Contact manquant Contact missing Contact manquant
Contact shared Contact partagé
Contacts Contacts Contacts Contacts
Contacts are on internal flash - the SD card did not mount at boot. Re-seat the card and reboot. Les contacts sont en mémoire interne - la carte SD ne s'est pas montée au démarrage. Réinsérez la carte et redémarrez. Contacts are on internal flash - the SD card did not mount at boot. Re-seat the card and reboot. Les contacts sont en mémoire interne - la carte SD ne s'est pas montée au démarrage. Réinsérez la carte et redémarrez.
Contacts are on internal flash. Les contacts sont sur la mémoire interne. Contacts are on internal flash. Les contacts sont sur la mémoire interne.
@@ -777,6 +778,8 @@ Settings Paramètres
Setup complete Configuration terminée Setup complete Configuration terminée
Share QR Partager le QR Share QR Partager le QR
Share channel Partager le canal Share channel Partager le canal
Share contact Partager le contact
Share failed Échec du partage
Share location in advert Partager la position dans l'annonce Share location in advert Partager la position dans l'annonce
Share secret Partager le secret Share secret Partager le secret
Share the 32-char secret so others can join. Leave the secret empty to generate a random one. Partagez le secret de 32 caractères pour que d'autres rejoignent. Laissez vide pour un aléatoire. Share the 32-char secret so others can join. Leave the secret empty to generate a random one. Partagez le secret de 32 caractères pour que d'autres rejoignent. Laissez vide pour un aléatoire.
@@ -1102,3 +1105,6 @@ Glance shows message previews\nwhile the screen is locked Glance shows message p
Snake — swipe, roll, or press a direction Snake — swipe, roll, or press a direction Snake — swipe, roll, or press a direction Snake — swipe, roll, or press a direction
N/A N/A N/A N/A
This board cannot run this app. This board cannot run this app. This board cannot run this app. This board cannot run this app.
Signal Signal
Signal (stale) Signal (stale)
nothing heard yet nothing heard yet
@@ -1,7 +1,7 @@
# wadamesh language file # wadamesh language file
# canonical source - translators: edit this file and PR it # canonical source - translators: edit this file and PR it
# code: hu # code: hu
# ver: 19 # ver: 20
# name: Magyar # name: Magyar
# base: hu # base: hu
(device behind) (készülék hátulján) (device behind) (készülék hátulján)
@@ -186,6 +186,7 @@ Contact added Névjegy hozzáadva
Contact deleted Névjegy törölve Contact deleted Névjegy törölve
Contact gone Eltűnt névjegy Contact gone Eltűnt névjegy
Contact missing Hiányzó névjegy Contact missing Hiányzó névjegy
Contact shared Névjegy megosztva
Contacts Névjegyek Contacts Névjegyek
Contacts are on internal flash - the SD card did not mount at boot. Re-seat the card and reboot. A névjegyek a belső tárolón vannak - az SD-kártya nem csatolódott induláskor. Helyezd be újra a kártyát, és indítsd újra. Contacts are on internal flash - the SD card did not mount at boot. Re-seat the card and reboot. A névjegyek a belső tárolón vannak - az SD-kártya nem csatolódott induláskor. Helyezd be újra a kártyát, és indítsd újra.
Contacts are on internal flash. A névjegyek a belső tárolón vannak. Contacts are on internal flash. A névjegyek a belső tárolón vannak.
@@ -400,7 +401,7 @@ Join a private channel Belépés priváthoz
Join hashtag channel Csatlakozz # csatornához Join hashtag channel Csatlakozz # csatornához
Join network Csatlakozás a hálózathoz Join network Csatlakozás a hálózathoz
Join private channel Csatlakozz privát csatornához Join private channel Csatlakozz privát csatornához
Join the public channel Csatlakozás a nyilvános csatornához Join the public channel Belépés a nyilvánoshoz
Joined %.40s Csatlakozott %.40s alatt Joined %.40s Csatlakozott %.40s alatt
Keep per chat (messages) Megőrzés csevegésenként (üzenet) Keep per chat (messages) Megőrzés csevegésenként (üzenet)
Key already in use Kulcs már hozzárendelve Key already in use Kulcs már hozzárendelve
@@ -471,7 +472,7 @@ Map — no tile pack on SPIFFS yet.\n\nUpload a tile pack to /tiles/<z>/<x>/<y>.
Map — set your location\nin Settings → Profile to\nshow the map here. Térkép – a Beállítások → Profil menüpontban állítsd be a tartózkodási helyedet, hogy itt jelenjen meg a térkép. Map — set your location\nin Settings → Profile to\nshow the map here. Térkép – a Beállítások → Profil menüpontban állítsd be a tartózkodási helyedet, hogy itt jelenjen meg a térkép.
Mark all chats and channels as read? Az összes csevegést és csatornát megjelölöd olvasottként? Mark all chats and channels as read? Az összes csevegést és csatornát megjelölöd olvasottként?
Mark as read Olvasottnak jelöl Mark as read Olvasottnak jelöl
Mark read Mark read Mark read Olvasott
Marked read Olvasottként megjelölve Marked read Olvasottként megjelölve
Max hops (0..64) Max ugrások (0-64) Max hops (0..64) Max ugrások (0-64)
Max zoom for this pack Maximális zoom ehhez a csomaghoz Max zoom for this pack Maximális zoom ehhez a csomaghoz
@@ -791,6 +792,8 @@ Settings Beállítások
Setup complete Beállítás kész Setup complete Beállítás kész
Share QR QR megosztása Share QR QR megosztása
Share channel Csatorna megosztása Share channel Csatorna megosztása
Share contact Névjegy megosztása
Share failed Megosztás sikertelen
Share location in advert Helyszín megosztása a hirdetésben Share location in advert Helyszín megosztása a hirdetésben
Share secret Titok megosztása Share secret Titok megosztása
Share the 32-char secret so others can join. Leave the secret empty to generate a random one. Oszd meg a 32 karakteres titkot, hogy mások is csatlakozhassanak. Hagyd üresen a titkot, hogy véletlenszerű titkos kódot generálj. Share the 32-char secret so others can join. Leave the secret empty to generate a random one. Oszd meg a 32 karakteres titkot, hogy mások is csatlakozhassanak. Hagyd üresen a titkot, hogy véletlenszerű titkos kódot generálj.
@@ -1121,3 +1124,5 @@ Glance shows message previews\nwhile the screen is locked Glance shows message p
Snake — swipe, roll, or press a direction Snake — swipe, roll, or press a direction Snake — swipe, roll, or press a direction Snake — swipe, roll, or press a direction
N/A N/A N/A N/A
This board cannot run this app. This board cannot run this app. This board cannot run this app. This board cannot run this app.
Signal (stale) Jel (elavult)
nothing heard yet Még semmi hír.
@@ -1,7 +1,7 @@
# wadamesh language file # wadamesh language file
# canonical source - translators: edit this file and PR it # canonical source - translators: edit this file and PR it
# code: it # code: it
# ver: 19 # ver: 20
# name: Italiano # name: Italiano
# base: it # base: it
(device behind) (dispositivo indietro) (device behind) (dispositivo indietro)
@@ -184,6 +184,7 @@ Contact added Contatto aggiunto
Contact deleted Contatto eliminato Contact deleted Contatto eliminato
Contact gone Contatto perso Contact gone Contatto perso
Contact missing Contatto mancante Contact missing Contatto mancante
Contact shared Contatto condiviso
Contacts Contatti Contacts Contatti
Contacts are on internal flash - the SD card did not mount at boot. Re-seat the card and reboot. I contatti sono sulla memoria interna - la scheda SD non si è montata all'avvio. Reinserisci la scheda e riavvia. Contacts are on internal flash - the SD card did not mount at boot. Re-seat the card and reboot. I contatti sono sulla memoria interna - la scheda SD non si è montata all'avvio. Reinserisci la scheda e riavvia.
Contacts are on internal flash. I contatti sono sulla memoria interna. Contacts are on internal flash. I contatti sono sulla memoria interna.
@@ -777,6 +778,8 @@ Settings Impostazioni
Setup complete Configurazione completata Setup complete Configurazione completata
Share QR Condividi QR Share QR Condividi QR
Share channel Condividi canale Share channel Condividi canale
Share contact Condividi contatto
Share failed Condivisione non riuscita
Share location in advert Condividi posizione in advert Share location in advert Condividi posizione in advert
Share secret Condividi segreto Share secret Condividi segreto
Share the 32-char secret so others can join. Leave the secret empty to generate a random one. Condividi il segreto di 32 caratteri per far unire altri. Lascia vuoto per uno casuale. Share the 32-char secret so others can join. Leave the secret empty to generate a random one. Condividi il segreto di 32 caratteri per far unire altri. Lascia vuoto per uno casuale.
@@ -1102,3 +1105,6 @@ Glance shows message previews\nwhile the screen is locked Glance shows message p
Snake — swipe, roll, or press a direction Snake — swipe, roll, or press a direction Snake — swipe, roll, or press a direction Snake — swipe, roll, or press a direction
N/A N/A N/A N/A
This board cannot run this app. This board cannot run this app. This board cannot run this app. This board cannot run this app.
Signal Signal
Signal (stale) Signal (stale)
nothing heard yet nothing heard yet
@@ -1,7 +1,7 @@
# wadamesh language file # wadamesh language file
# canonical source - translators: edit this file and PR it # canonical source - translators: edit this file and PR it
# code: nl # code: nl
# ver: 19 # ver: 20
# name: Nederlands # name: Nederlands
# base: nl # base: nl
(device behind) (apparaat loopt achter) (device behind) (apparaat loopt achter)
@@ -184,6 +184,7 @@ Contact added Contact toegevoegd
Contact deleted Contact verwijderd Contact deleted Contact verwijderd
Contact gone Contact weg Contact gone Contact weg
Contact missing Contact ontbreekt Contact missing Contact ontbreekt
Contact shared Contact gedeeld
Contacts Contacten Contacts Contacten
Contacts are on internal flash - the SD card did not mount at boot. Re-seat the card and reboot. Contacten staan op intern flash - de SD-kaart is bij het opstarten niet gekoppeld. Plaats de kaart opnieuw en herstart. Contacts are on internal flash - the SD card did not mount at boot. Re-seat the card and reboot. Contacten staan op intern flash - de SD-kaart is bij het opstarten niet gekoppeld. Plaats de kaart opnieuw en herstart.
Contacts are on internal flash. Contacten staan op intern flashgeheugen. Contacts are on internal flash. Contacten staan op intern flashgeheugen.
@@ -777,6 +778,8 @@ Settings Instellingen
Setup complete Installatie voltooid Setup complete Installatie voltooid
Share QR QR delen Share QR QR delen
Share channel Kanaal delen Share channel Kanaal delen
Share contact Contact delen
Share failed Delen mislukt
Share location in advert Locatie delen in advert Share location in advert Locatie delen in advert
Share secret Geheim delen Share secret Geheim delen
Share the 32-char secret so others can join. Leave the secret empty to generate a random one. Deel het 32-teken geheim zodat anderen kunnen deelnemen. Leeg laten voor een willekeurig geheim. Share the 32-char secret so others can join. Leave the secret empty to generate a random one. Deel het 32-teken geheim zodat anderen kunnen deelnemen. Leeg laten voor een willekeurig geheim.
@@ -1100,3 +1103,6 @@ Glance shows message previews\nwhile the screen is locked Glance shows message p
Snake — swipe, roll, or press a direction Snake — swipe, roll, or press a direction Snake — swipe, roll, or press a direction Snake — swipe, roll, or press a direction
N/A N/A N/A N/A
This board cannot run this app. This board cannot run this app. This board cannot run this app. This board cannot run this app.
Signal Signal
Signal (stale) Signal (stale)
nothing heard yet nothing heard yet
@@ -1,7 +1,7 @@
# wadamesh language file # wadamesh language file
# canonical source - translators: edit this file and PR it # canonical source - translators: edit this file and PR it
# code: pt-br # code: pt-br
# ver: 19 # ver: 20
# name: Português (BR) # name: Português (BR)
# base: pt-br # base: pt-br
(device behind) (dispositivo atrasado) (device behind) (dispositivo atrasado)
@@ -184,6 +184,7 @@ Contact added Contato adicionado
Contact deleted Contato excluído Contact deleted Contato excluído
Contact gone Contato sumiu Contact gone Contato sumiu
Contact missing Contato ausente Contact missing Contato ausente
Contact shared Contato compartilhado
Contacts Contatos Contacts Contatos
Contacts are on internal flash - the SD card did not mount at boot. Re-seat the card and reboot. Os contatos estão na memória interna - o cartão SD não montou na inicialização. Recoloque o cartão e reinicie. Contacts are on internal flash - the SD card did not mount at boot. Re-seat the card and reboot. Os contatos estão na memória interna - o cartão SD não montou na inicialização. Recoloque o cartão e reinicie.
Contacts are on internal flash. Os contatos estão na memória interna. Contacts are on internal flash. Os contatos estão na memória interna.
@@ -778,6 +779,8 @@ Settings Ajustes
Setup complete Configuração concluída Setup complete Configuração concluída
Share QR Compartilhar QR Share QR Compartilhar QR
Share channel Compartilhar canal Share channel Compartilhar canal
Share contact Compartilhar contato
Share failed Falha ao compartilhar
Share location in advert Compartilhar local no advert Share location in advert Compartilhar local no advert
Share secret Compartilhar segredo Share secret Compartilhar segredo
Share the 32-char secret so others can join. Leave the secret empty to generate a random one. Compartilhe o segredo de 32 caracteres para outros entrarem. Deixe vazio para gerar um aleatório. Share the 32-char secret so others can join. Leave the secret empty to generate a random one. Compartilhe o segredo de 32 caracteres para outros entrarem. Deixe vazio para gerar um aleatório.
@@ -1102,3 +1105,6 @@ Glance shows message previews\nwhile the screen is locked Glance shows message p
Snake — swipe, roll, or press a direction Snake — swipe, roll, or press a direction Snake — swipe, roll, or press a direction Snake — swipe, roll, or press a direction
N/A N/A N/A N/A
This board cannot run this app. This board cannot run this app. This board cannot run this app. This board cannot run this app.
Signal Signal
Signal (stale) Signal (stale)
nothing heard yet nothing heard yet
@@ -1,7 +1,7 @@
# wadamesh language file # wadamesh language file
# canonical source - translators: edit this file and PR it # canonical source - translators: edit this file and PR it
# code: ro # code: ro
# ver: 19 # ver: 20
# name: Română # name: Română
# base: ro # base: ro
(device behind) (dispozitiv în urmă) (device behind) (dispozitiv în urmă)
@@ -184,6 +184,7 @@ Contact added Contact adăugat
Contact deleted Contact şters Contact deleted Contact şters
Contact gone Contact dispărut Contact gone Contact dispărut
Contact missing Contact lipsă Contact missing Contact lipsă
Contact shared Contact partajat
Contacts Contacte Contacts Contacte
Contacts are on internal flash - the SD card did not mount at boot. Re-seat the card and reboot. Contactele sunt pe memoria internă - cardul SD nu s-a montat la pornire. Reaşază cardul şi reporneşte. Contacts are on internal flash - the SD card did not mount at boot. Re-seat the card and reboot. Contactele sunt pe memoria internă - cardul SD nu s-a montat la pornire. Reaşază cardul şi reporneşte.
Contacts are on internal flash. Contactele sunt pe memoria internă. Contacts are on internal flash. Contactele sunt pe memoria internă.
@@ -778,6 +779,8 @@ Settings Setări
Setup complete Configurare finalizată Setup complete Configurare finalizată
Share QR Partajează QR Share QR Partajează QR
Share channel Partajează canalul Share channel Partajează canalul
Share contact Partajează contactul
Share failed Partajare eşuată
Share location in advert Partajează locaţia în advert Share location in advert Partajează locaţia în advert
Share secret Partajează secretul Share secret Partajează secretul
Share the 32-char secret so others can join. Leave the secret empty to generate a random one. Partajează secretul de 32 caractere ca să poată intra şi alţii. Lasă secretul gol pentru a genera unul aleatoriu. Share the 32-char secret so others can join. Leave the secret empty to generate a random one. Partajează secretul de 32 caractere ca să poată intra şi alţii. Lasă secretul gol pentru a genera unul aleatoriu.
@@ -1104,3 +1107,6 @@ Glance shows message previews\nwhile the screen is locked Glance shows message p
Snake — swipe, roll, or press a direction Snake — swipe, roll, or press a direction Snake — swipe, roll, or press a direction Snake — swipe, roll, or press a direction
N/A N/A N/A N/A
This board cannot run this app. This board cannot run this app. This board cannot run this app. This board cannot run this app.
Signal Signal
Signal (stale) Signal (stale)
nothing heard yet nothing heard yet
@@ -1,7 +1,7 @@
# wadamesh language file # wadamesh language file
# canonical source - translators: edit this file and PR it # canonical source - translators: edit this file and PR it
# code: ru # code: ru
# ver: 19 # ver: 20
# name: Русский # name: Русский
# base: ru # base: ru
(device behind) (устройство отстаёт) (device behind) (устройство отстаёт)
@@ -184,6 +184,7 @@ Contact added Контакт добавлен
Contact deleted Контакт удалён Contact deleted Контакт удалён
Contact gone Контакт пропал Contact gone Контакт пропал
Contact missing Контакт отсутствует Contact missing Контакт отсутствует
Contact shared Контакт отправлен
Contacts Контакты Contacts Контакты
Contacts are on internal flash - the SD card did not mount at boot. Re-seat the card and reboot. Контакты во внутренней памяти - SD-карта не смонтировалась при загрузке. Переустановите карту и перезагрузитесь. Contacts are on internal flash - the SD card did not mount at boot. Re-seat the card and reboot. Контакты во внутренней памяти - SD-карта не смонтировалась при загрузке. Переустановите карту и перезагрузитесь.
Contacts are on internal flash. Контакты во внутренней памяти. Contacts are on internal flash. Контакты во внутренней памяти.
@@ -778,6 +779,8 @@ Settings Настройки
Setup complete Настройка завершена Setup complete Настройка завершена
Share QR Поделиться QR Share QR Поделиться QR
Share channel Поделиться каналом Share channel Поделиться каналом
Share contact Поделиться контактом
Share failed Не удалось отправить контакт
Share location in advert Делиться местоположением в advert Share location in advert Делиться местоположением в advert
Share secret Поделиться ключом Share secret Поделиться ключом
Share the 32-char secret so others can join. Leave the secret empty to generate a random one. Поделитесь секретом из 32 символов, чтобы другие присоединились. Пусто = случайный. Share the 32-char secret so others can join. Leave the secret empty to generate a random one. Поделитесь секретом из 32 символов, чтобы другие присоединились. Пусто = случайный.
@@ -1103,3 +1106,6 @@ Glance shows message previews\nwhile the screen is locked Glance shows message p
Snake — swipe, roll, or press a direction Snake — swipe, roll, or press a direction Snake — swipe, roll, or press a direction Snake — swipe, roll, or press a direction
N/A N/A N/A N/A
This board cannot run this app. This board cannot run this app. This board cannot run this app. This board cannot run this app.
Signal Signal
Signal (stale) Signal (stale)
nothing heard yet nothing heard yet
@@ -1,7 +1,7 @@
# wadamesh language file # wadamesh language file
# canonical source - translators: edit this file and PR it # canonical source - translators: edit this file and PR it
# code: sr # code: sr
# ver: 19 # ver: 20
# name: Српски # name: Српски
# base: sr # base: sr
(device behind) (уређај касни) (device behind) (уређај касни)
@@ -184,6 +184,7 @@ Contact added Контакт додат
Contact deleted Контакт обрисан Contact deleted Контакт обрисан
Contact gone Контакт нестао Contact gone Контакт нестао
Contact missing Контакт недостаје Contact missing Контакт недостаје
Contact shared Контакт подељен
Contacts Контакти Contacts Контакти
Contacts are on internal flash - the SD card did not mount at boot. Re-seat the card and reboot. Контакти су у унутрашњој меморији - SD картица се није монтирала при покретању. Поново убаци картицу и рестартуј. Contacts are on internal flash - the SD card did not mount at boot. Re-seat the card and reboot. Контакти су у унутрашњој меморији - SD картица се није монтирала при покретању. Поново убаци картицу и рестартуј.
Contacts are on internal flash. Контакти су у унутрашњој меморији. Contacts are on internal flash. Контакти су у унутрашњој меморији.
@@ -778,6 +779,8 @@ Settings Подешавања
Setup complete Подешавање завршено Setup complete Подешавање завршено
Share QR Подели QR Share QR Подели QR
Share channel Подели канал Share channel Подели канал
Share contact Подели контакт
Share failed Дељење није успело
Share location in advert Дели локацију у advert-у Share location in advert Дели локацију у advert-у
Share secret Подели тајну Share secret Подели тајну
Share the 32-char secret so others can join. Leave the secret empty to generate a random one. Поделите тајну од 32 знака да се други придруже. Празно = насумична. Share the 32-char secret so others can join. Leave the secret empty to generate a random one. Поделите тајну од 32 знака да се други придруже. Празно = насумична.
@@ -1103,3 +1106,6 @@ Glance shows message previews\nwhile the screen is locked Glance shows message p
Snake — swipe, roll, or press a direction Snake — swipe, roll, or press a direction Snake — swipe, roll, or press a direction Snake — swipe, roll, or press a direction
N/A N/A N/A N/A
This board cannot run this app. This board cannot run this app. This board cannot run this app. This board cannot run this app.
Signal Signal
Signal (stale) Signal (stale)
nothing heard yet nothing heard yet
@@ -1,7 +1,7 @@
# wadamesh language file # wadamesh language file
# canonical source - translators: edit this file and PR it # canonical source - translators: edit this file and PR it
# code: uk # code: uk
# ver: 19 # ver: 20
# name: Українська # name: Українська
# base: uk # base: uk
(device behind) (пристрій відстає) (device behind) (пристрій відстає)
@@ -184,6 +184,7 @@ Contact added Контакт додано
Contact deleted Контакт видалено Contact deleted Контакт видалено
Contact gone Контакт зник Contact gone Контакт зник
Contact missing Контакт відсутній Contact missing Контакт відсутній
Contact shared Контакт надіслано
Contacts Контакти Contacts Контакти
Contacts are on internal flash - the SD card did not mount at boot. Re-seat the card and reboot. Контакти у внутрішній пам'яті - SD-карта не змонтувалася під час завантаження. Переставте картку і перезавантажте. Contacts are on internal flash - the SD card did not mount at boot. Re-seat the card and reboot. Контакти у внутрішній пам'яті - SD-карта не змонтувалася під час завантаження. Переставте картку і перезавантажте.
Contacts are on internal flash. Контакти у внутрішній пам'яті. Contacts are on internal flash. Контакти у внутрішній пам'яті.
@@ -778,6 +779,8 @@ Settings Налаштування
Setup complete Налаштування завершено Setup complete Налаштування завершено
Share QR Поділитися QR Share QR Поділитися QR
Share channel Поділитися каналом Share channel Поділитися каналом
Share contact Поділитися контактом
Share failed Не вдалося надіслати контакт
Share location in advert Ділитися місцезнаходженням в advert Share location in advert Ділитися місцезнаходженням в advert
Share secret Поділитися ключем Share secret Поділитися ключем
Share the 32-char secret so others can join. Leave the secret empty to generate a random one. Поділіться секретом із 32 символів, щоб інші приєдналися. Порожньо = випадковий. Share the 32-char secret so others can join. Leave the secret empty to generate a random one. Поділіться секретом із 32 символів, щоб інші приєдналися. Порожньо = випадковий.
@@ -1103,3 +1106,6 @@ Glance shows message previews\nwhile the screen is locked Glance shows message p
Snake — swipe, roll, or press a direction Snake — swipe, roll, or press a direction Snake — swipe, roll, or press a direction Snake — swipe, roll, or press a direction
N/A N/A N/A N/A
This board cannot run this app. This board cannot run this app. This board cannot run this app. This board cannot run this app.
Signal Signal
Signal (stale) Signal (stale)
nothing heard yet nothing heard yet
+1 -1
View File
@@ -1,7 +1,7 @@
# wadamesh language file # wadamesh language file
# canonical source - translators: edit this file and PR it # canonical source - translators: edit this file and PR it
# code: bg # code: bg
# ver: 19 # ver: 20
# name: Български # name: Български
# base: bg # base: bg
(device behind) (устройството изостава) (device behind) (устройството изостава)
+1 -1
View File
@@ -1,7 +1,7 @@
# wadamesh language file # wadamesh language file
# canonical source - translators: edit this file and PR it # canonical source - translators: edit this file and PR it
# code: de # code: de
# ver: 19 # ver: 20
# name: Deutsch # name: Deutsch
# base: de # base: de
(device behind) (Gerät geht nach) (device behind) (Gerät geht nach)
+1 -1
View File
@@ -1,7 +1,7 @@
# wadamesh language file # wadamesh language file
# canonical source - translators: edit this file and PR it # canonical source - translators: edit this file and PR it
# code: el # code: el
# ver: 19 # ver: 20
# name: Ελληνικά # name: Ελληνικά
# base: el # base: el
(device behind) (συσκευή πίσω) (device behind) (συσκευή πίσω)
+1 -1
View File
@@ -1,7 +1,7 @@
# wadamesh language file # wadamesh language file
# canonical source - translators: edit this file and PR it # canonical source - translators: edit this file and PR it
# code: es # code: es
# ver: 19 # ver: 20
# name: Español # name: Español
# base: es # base: es
(device behind) (dispositivo atrasado) (device behind) (dispositivo atrasado)
+1 -1
View File
@@ -1,7 +1,7 @@
# wadamesh language file # wadamesh language file
# canonical source - translators: edit this file and PR it # canonical source - translators: edit this file and PR it
# code: fr # code: fr
# ver: 19 # ver: 20
# name: Français # name: Français
# base: fr # base: fr
(device behind) (appareil en retard) (device behind) (appareil en retard)
+3 -3
View File
@@ -1,7 +1,7 @@
# wadamesh language file # wadamesh language file
# canonical source - translators: edit this file and PR it # canonical source - translators: edit this file and PR it
# code: hu # code: hu
# ver: 19 # ver: 20
# name: Magyar # name: Magyar
# base: hu # base: hu
(device behind) (készülék hátulján) (device behind) (készülék hátulján)
@@ -401,7 +401,7 @@ Join a private channel Belépés priváthoz
Join hashtag channel Csatlakozz # csatornához Join hashtag channel Csatlakozz # csatornához
Join network Csatlakozás a hálózathoz Join network Csatlakozás a hálózathoz
Join private channel Csatlakozz privát csatornához Join private channel Csatlakozz privát csatornához
Join the public channel Csatlakozás a nyilvános csatornához Join the public channel Belépés a nyilvánoshoz
Joined %.40s Csatlakozott %.40s alatt Joined %.40s Csatlakozott %.40s alatt
Keep per chat (messages) Megőrzés csevegésenként (üzenet) Keep per chat (messages) Megőrzés csevegésenként (üzenet)
Key already in use Kulcs már hozzárendelve Key already in use Kulcs már hozzárendelve
@@ -472,7 +472,7 @@ Map — no tile pack on SPIFFS yet.\n\nUpload a tile pack to /tiles/<z>/<x>/<y>.
Map — set your location\nin Settings → Profile to\nshow the map here. Térkép – a Beállítások → Profil menüpontban állítsd be a tartózkodási helyedet, hogy itt jelenjen meg a térkép. Map — set your location\nin Settings → Profile to\nshow the map here. Térkép – a Beállítások → Profil menüpontban állítsd be a tartózkodási helyedet, hogy itt jelenjen meg a térkép.
Mark all chats and channels as read? Az összes csevegést és csatornát megjelölöd olvasottként? Mark all chats and channels as read? Az összes csevegést és csatornát megjelölöd olvasottként?
Mark as read Olvasottnak jelöl Mark as read Olvasottnak jelöl
Mark read Mark read Mark read Olvasott
Marked read Olvasottként megjelölve Marked read Olvasottként megjelölve
Max hops (0..64) Max ugrások (0-64) Max hops (0..64) Max ugrások (0-64)
Max zoom for this pack Maximális zoom ehhez a csomaghoz Max zoom for this pack Maximális zoom ehhez a csomaghoz
+1 -1
View File
@@ -1,7 +1,7 @@
# wadamesh language file # wadamesh language file
# canonical source - translators: edit this file and PR it # canonical source - translators: edit this file and PR it
# code: it # code: it
# ver: 19 # ver: 20
# name: Italiano # name: Italiano
# base: it # base: it
(device behind) (dispositivo indietro) (device behind) (dispositivo indietro)
+1 -1
View File
@@ -1,7 +1,7 @@
# wadamesh language file # wadamesh language file
# canonical source - translators: edit this file and PR it # canonical source - translators: edit this file and PR it
# code: nl # code: nl
# ver: 19 # ver: 20
# name: Nederlands # name: Nederlands
# base: nl # base: nl
(device behind) (apparaat loopt achter) (device behind) (apparaat loopt achter)
+1 -1
View File
@@ -1,7 +1,7 @@
# wadamesh language file # wadamesh language file
# canonical source - translators: edit this file and PR it # canonical source - translators: edit this file and PR it
# code: pt-br # code: pt-br
# ver: 19 # ver: 20
# name: Português (BR) # name: Português (BR)
# base: pt-br # base: pt-br
(device behind) (dispositivo atrasado) (device behind) (dispositivo atrasado)
+1 -1
View File
@@ -1,7 +1,7 @@
# wadamesh language file # wadamesh language file
# canonical source - translators: edit this file and PR it # canonical source - translators: edit this file and PR it
# code: ro # code: ro
# ver: 19 # ver: 20
# name: Română # name: Română
# base: ro # base: ro
(device behind) (dispozitiv în urmă) (device behind) (dispozitiv în urmă)
+1 -1
View File
@@ -1,7 +1,7 @@
# wadamesh language file # wadamesh language file
# canonical source - translators: edit this file and PR it # canonical source - translators: edit this file and PR it
# code: ru # code: ru
# ver: 19 # ver: 20
# name: Русский # name: Русский
# base: ru # base: ru
(device behind) (устройство отстаёт) (device behind) (устройство отстаёт)
+1 -1
View File
@@ -1,7 +1,7 @@
# wadamesh language file # wadamesh language file
# canonical source - translators: edit this file and PR it # canonical source - translators: edit this file and PR it
# code: sr # code: sr
# ver: 19 # ver: 20
# name: Српски # name: Српски
# base: sr # base: sr
(device behind) (уређај касни) (device behind) (уређај касни)
+1 -1
View File
@@ -1,7 +1,7 @@
# wadamesh language file # wadamesh language file
# canonical source - translators: edit this file and PR it # canonical source - translators: edit this file and PR it
# code: uk # code: uk
# ver: 19 # ver: 20
# name: Українська # name: Українська
# base: uk # base: uk
(device behind) (пристрій відстає) (device behind) (пристрій відстає)
+13 -13
View File
@@ -3,67 +3,67 @@
{ {
"code": "bg", "code": "bg",
"name": "Български", "name": "Български",
"ver": "19" "ver": "20"
}, },
{ {
"code": "de", "code": "de",
"name": "Deutsch", "name": "Deutsch",
"ver": "19" "ver": "20"
}, },
{ {
"code": "el", "code": "el",
"name": "Ελληνικά", "name": "Ελληνικά",
"ver": "19" "ver": "20"
}, },
{ {
"code": "es", "code": "es",
"name": "Español", "name": "Español",
"ver": "19" "ver": "20"
}, },
{ {
"code": "fr", "code": "fr",
"name": "Français", "name": "Français",
"ver": "19" "ver": "20"
}, },
{ {
"code": "hu", "code": "hu",
"name": "Magyar", "name": "Magyar",
"ver": "19" "ver": "20"
}, },
{ {
"code": "it", "code": "it",
"name": "Italiano", "name": "Italiano",
"ver": "19" "ver": "20"
}, },
{ {
"code": "nl", "code": "nl",
"name": "Nederlands", "name": "Nederlands",
"ver": "19" "ver": "20"
}, },
{ {
"code": "pt-br", "code": "pt-br",
"name": "Português (BR)", "name": "Português (BR)",
"ver": "19" "ver": "20"
}, },
{ {
"code": "ro", "code": "ro",
"name": "Română", "name": "Română",
"ver": "19" "ver": "20"
}, },
{ {
"code": "ru", "code": "ru",
"name": "Русский", "name": "Русский",
"ver": "19" "ver": "20"
}, },
{ {
"code": "sr", "code": "sr",
"name": "Српски", "name": "Српски",
"ver": "19" "ver": "20"
}, },
{ {
"code": "uk", "code": "uk",
"name": "Українська", "name": "Українська",
"ver": "19" "ver": "20"
} }
] ]
} }
+17
View File
@@ -0,0 +1,17 @@
# beta_73 - test build. Stable stays beta_65.
# One user-facing note per non-blank, non-# line; # lines are section comments.
# --- Older T-Decks could not be typed on ------------------------------------------------------
If your T-Deck types the wrong letters, this release fixes it. Pressing "a" produced "q " and "m" produced "qa ", which made the keyboard unusable for writing, navigating or locking the screen.
It affects the older T-Deck keyboards, the ones without the controllable backlight, and it started in beta_70. The firmware asks the keyboard at startup whether it speaks the newer protocol that modifier latching needs, and an older keyboard's answer looked enough like a yes to be taken as one. Everything typed after that was read the wrong way round.
Nothing can tell the two keyboards apart while nobody is typing, so the firmware now simply corrects itself: the first letter you press is unmistakably a character rather than a key-position report, and it switches to the older protocol on the spot and delivers that letter. You lose modifier latching, which your keyboard cannot do anyway, and you get a working keyboard.
Newer keyboards are unaffected and keep latching.
The beta_72 change that was meant to make this detection more reliable made it worse, because it gave an older keyboard more chances to look like a newer one.
# --- Translations ---------------------------------------------------------------------------------
Two Hungarian strings: "Mark read", which had never been translated, and a shorter wording for joining the public channel so it fits its button. These are already on devices, since language files publish separately from the firmware.
# --- For testers -------------------------------------------------------------------------------
If your keyboard was typing nonsense, you should be able to install this normally rather than needing a cable.
A reminder that two settings control whether an arriving message lights a dark or locked screen, and they are separate: Message flash wakes the screen, and At a glance draws the preview text on it. Both are in Options, Display. Turning off At a glance alone will not stop the screen lighting up.
Still open and not fixed here: a map that renders nothing after beta_71, a screen that will not stay dark after a manual lock, and a web flasher that hangs at "wrapping up" on the T-Display P4.
+93 -27
View File
@@ -75,6 +75,27 @@ static void processRawFrame(const uint8_t frame[TDeckKeyboardState::COLS], uint3
portEXIT_CRITICAL(&s_keyboard_mux); portEXIT_CRITICAL(&s_keyboard_mux);
} }
// True when a five-byte answer can only be a legacy ASCII reply: the character
// in byte 0 with padding after it. A real matrix frame puts one bit per pressed
// key in that key's own column, so three or more bits in byte 0 with every other
// column empty is not something the hardware can report.
static bool looksLikeAscii(const uint8_t frame[TDeckKeyboardState::COLS]) {
for (size_t col = 1; col < TDeckKeyboardState::COLS; ++col) if (frame[col]) return false;
if (frame[0] < 0x20 || frame[0] > 0x7E) return false; // must be a printable character
int bits = 0;
for (int b = 0; b < 8; ++b) if (frame[0] & (1u << b)) ++bits;
return bits > 2;
}
// Verified against the real tables rather than assumed:
// - all 26 lowercase letters set 3 or more bits, so ANY letter demotes on the
// first press. Only '0', ' ' and '!' do not, and space happens to render
// correctly anyway (column 0 bit 5 IS space).
// - going the other way, a genuine frame reaching this needs three or more of
// {q, w, a, space} held at once and nothing else. The printable-range test
// above removes q+w+a (0x0B); what remains are combinations including space,
// which is a fumble rather than typing, and costs a reboot to undo.
static void processLegacyKey(uint8_t key) { static void processLegacyKey(uint8_t key) {
portENTER_CRITICAL(&s_keyboard_mux); portENTER_CRITICAL(&s_keyboard_mux);
const uint32_t generation = s_modifier_mode_generation; const uint32_t generation = s_modifier_mode_generation;
@@ -128,16 +149,28 @@ void tdeckKeyboardPoll() {
if (!s_inited) return; if (!s_inited) return;
tdeckKeyboardFlushBacklight(); tdeckKeyboardFlushBacklight();
if (s_mode == KeyboardMode::Probe) { if (s_mode == KeyboardMode::Probe) {
// LilyGO keyboard firmware from June 2025 onward accepts 0x03 and returns // Deciding whether this controller speaks the raw column protocol.
// five column-state bytes. Older controllers ignore it and keep returning
// one resolved ASCII byte; restore 0x04 key mode when that is what we have.
// //
// KEEP RETRYING before concluding "old firmware". This used to decide on a // The old test was "five bytes came back and no high bit is set", which a
// SINGLE read, and the first I2C read after boot is the least trustworthy // LEGACY controller passes trivially: it answers a five-byte read with the
// one there is: the C3 is still coming up, so a short or garbled frame is // pressed character followed by padding, and every lowercase letter has its
// ordinary. One such frame committed the device to legacy mode for the whole // high bit clear. Read as a column bitmap, 'a' (0x61) emits "q " and 'm'
// session, with no recovery short of a reboot -- reported as latching simply // (0x6d) emits "qa ". That is the garbage Vybo reported on an older T-Deck
// not working on a T-Deck carrying the June 2025 firmware (#332). // (#341), and the retry window added in beta_72 made it MORE likely to
// latch, not less.
//
// The positive test: a real matrix frame from a key press has ONE bit set,
// in whichever column that key lives. A legacy reply only ever has byte 0
// non-zero, and an ASCII letter sets three or four bits at once. So:
//
// any non-zero byte in columns 1..4 -> genuinely raw (padding is never
// non-zero there)
// byte 0 with >2 bits set, rest zero -> an ASCII character, so legacy
//
// An all-zero frame is idle and proves nothing either way, so keep probing.
// If the window expires having seen only column-0 activity, fall back to
// LEGACY. That is the safe default: the cost of being wrong is losing
// modifier latching, never losing the keyboard.
static uint32_t s_probe_start_ms = 0; static uint32_t s_probe_start_ms = 0;
const uint32_t now = millis(); const uint32_t now = millis();
if (!s_probe_start_ms) s_probe_start_ms = now; if (!s_probe_start_ms) s_probe_start_ms = now;
@@ -145,37 +178,70 @@ void tdeckKeyboardPoll() {
keyboardCommand(0x03); keyboardCommand(0x03);
uint8_t frame[TDeckKeyboardState::COLS] = {}; uint8_t frame[TDeckKeyboardState::COLS] = {};
const int count = keyboardRead(frame, sizeof frame); const int count = keyboardRead(frame, sizeof frame);
bool valid_raw = count == (int)sizeof frame;
size_t bad_col = 0; bool shape_ok = (count == (int)sizeof frame);
for (size_t col = 0; col < sizeof frame && valid_raw; ++col) { for (size_t col = 0; col < sizeof frame && shape_ok; ++col)
if (frame[col] & 0x80) { valid_raw = false; bad_col = col; } if (frame[col] & 0x80) shape_ok = false;
}
if (valid_raw) { if (shape_ok) {
bool cols1plus = false;
for (size_t col = 1; col < sizeof frame; ++col) if (frame[col]) cols1plus = true;
int b0bits = 0;
for (int b = 0; b < 8; ++b) if (frame[0] & (1u << b)) ++b0bits;
if (cols1plus) { // only a real matrix reaches here
s_mode = KeyboardMode::Raw;
Serial.println("[keyboard] T-Deck raw mode: modifier latching enabled");
processRawFrame(frame, now);
return;
}
if (frame[0] && b0bits > 2) { // an ASCII byte, not a column
keyboardCommand(0x04);
s_mode = KeyboardMode::Legacy;
Serial.printf("[keyboard] T-Deck legacy mode: controller answered with a character "
"(0x%02X), not a column frame\n", frame[0]);
processLegacyKey(frame[0]);
return;
}
if ((uint32_t)(now - s_probe_start_ms) < kProbeWindowMs) return; // idle: keep looking
// Window expired with a well-formed, idle frame every time. That is what a
// raw controller looks like when nobody is typing, so take it -- a legacy
// one would have shown us a character by now if it had one, and if it has
// not, looksLikeAscii() below still demotes the moment it does.
s_mode = KeyboardMode::Raw; s_mode = KeyboardMode::Raw;
Serial.println("[keyboard] T-Deck raw mode: modifier latching enabled"); Serial.println("[keyboard] T-Deck raw mode: modifier latching enabled");
processRawFrame(frame, millis());
return; return;
} else if ((uint32_t)(now - s_probe_start_ms) < kProbeWindowMs) {
if (count == 1) { keyboardCommand(0x04); processLegacyKey(frame[0]); }
return; // short/garbled read: the C3 may still be waking
} }
// A legacy controller answers with one resolved byte. Deliver it either way
// so nothing typed during the probe window is dropped.
if (count == 1) { keyboardCommand(0x04); processLegacyKey(frame[0]); }
if ((uint32_t)(now - s_probe_start_ms) < kProbeWindowMs) return; // try again next poll
keyboardCommand(0x04); keyboardCommand(0x04);
s_mode = KeyboardMode::Legacy; s_mode = KeyboardMode::Legacy;
// Say WHY, so the next report of "latching does not work" is one line to Serial.printf("[keyboard] T-Deck legacy mode: no raw column frame seen in %lu ms "
// diagnose instead of a guess about which firmware someone has. "(probe read %d bytes)\n", (unsigned long)kProbeWindowMs, count);
Serial.printf("[keyboard] T-Deck legacy mode: update keyboard C3 firmware for modifier " if (count == 1) processLegacyKey(frame[0]);
"latching (probe read %d bytes, wanted %d%s)\n",
count, (int)sizeof frame,
(count == (int)sizeof frame) ? ", high bit set in a column" : "");
(void)bad_col;
return; return;
} }
if (s_mode == KeyboardMode::Raw) { if (s_mode == KeyboardMode::Raw) {
uint8_t frame[TDeckKeyboardState::COLS] = {}; uint8_t frame[TDeckKeyboardState::COLS] = {};
if (keyboardRead(frame, sizeof frame) != (int)sizeof frame) return; if (keyboardRead(frame, sizeof frame) != (int)sizeof frame) return;
for (size_t col = 0; col < sizeof frame; ++col) if (frame[col] & 0x80) return; for (size_t col = 0; col < sizeof frame; ++col) if (frame[col] & 0x80) return;
// Raw mode has to be able to admit it guessed wrong. An idle controller of
// either kind answers with zeros, so the probe cannot tell them apart until
// someone types -- and on a legacy controller that first character arrives
// in byte 0 with three or four bits set, which no single key press can
// produce. Demote on the spot and deliver the character, so the worst case
// is one odd keystroke rather than a keyboard that types nonsense forever.
if (looksLikeAscii(frame)) {
keyboardCommand(0x04);
s_mode = KeyboardMode::Legacy;
Serial.printf("[keyboard] T-Deck legacy mode: raw guess withdrawn, controller sent a "
"character (0x%02X)\n", frame[0]);
processLegacyKey(frame[0]);
return;
}
processRawFrame(frame, millis()); processRawFrame(frame, millis());
return; return;
} }
+2 -1
View File
@@ -404,7 +404,7 @@ static const I18nPair kBuiltin_hu[] = {
{ "Join hashtag channel", "Csatlakozz # csatornához" }, { "Join hashtag channel", "Csatlakozz # csatornához" },
{ "Join network", "Csatlakozás a hálózathoz" }, { "Join network", "Csatlakozás a hálózathoz" },
{ "Join private channel", "Csatlakozz privát csatornához" }, { "Join private channel", "Csatlakozz privát csatornához" },
{ "Join the public channel", "Csatlakozás a nyilvános csatornához" }, { "Join the public channel", "Belépés a nyilvánoshoz" },
{ "Join w/ password", "Csatlakozás jelszóval" }, { "Join w/ password", "Csatlakozás jelszóval" },
{ "Joined %.40s", "Csatlakozott %.40s alatt" }, { "Joined %.40s", "Csatlakozott %.40s alatt" },
{ "Keep per chat (messages)", "Megőrzés csevegésenként (üzenet)" }, { "Keep per chat (messages)", "Megőrzés csevegésenként (üzenet)" },
@@ -482,6 +482,7 @@ static const I18nPair kBuiltin_hu[] = {
{ "Map — set your location\nin Settings → Profile to\nshow the map here.", "Térkép – a Beállítások → Profil menüpontban állítsd be a tartózkodási helyedet, hogy itt jelenjen meg a térkép." }, { "Map — set your location\nin Settings → Profile to\nshow the map here.", "Térkép – a Beállítások → Profil menüpontban állítsd be a tartózkodási helyedet, hogy itt jelenjen meg a térkép." },
{ "Mark all chats and channels as read?", "Az összes csevegést és csatornát megjelölöd olvasottként?" }, { "Mark all chats and channels as read?", "Az összes csevegést és csatornát megjelölöd olvasottként?" },
{ "Mark as read", "Olvasottnak jelöl" }, { "Mark as read", "Olvasottnak jelöl" },
{ "Mark read", "Olvasott" },
{ "Marked read", "Olvasottként megjelölve" }, { "Marked read", "Olvasottként megjelölve" },
{ "Max dots", "Max. pontok" }, { "Max dots", "Max. pontok" },
{ "Max hops (0..64)", "Max ugrások (0-64)" }, { "Max hops (0..64)", "Max ugrások (0-64)" },