Deutsches Tastaturlayout für DigiSparkCustomKeyboard

vorhergehende Artikel in: Hardware
04.12.2021

Nachdem ich neulich über die Hardware und die Motivation dahinter berichtete wollte ich den Prototypen für ernsthafte Aufgaben umrüsten. Das erwies sich nicht als so einfach, wie ich gehofft hatte...

Der Grund dafür war, dass ich ein Stück Bash-Shell-Code auf eine der Makrotasten legen wollte - ich habe aber in meinem Ubuntu ein deutsches Tastaturlayout eingestellt. Die von mir benutzte Bibliothek geht aber von einem englischen Tastaturlayout aus - und da viele Sonderzeichen in meinem Einzeiler enthalten waren funktionierte zunächst nichts.

Grummelnd ging ich also an die Arbeit und erstellte eine Version der Bibliothek mit deutscher Tastaturbelegung Sie ist noch nicht ganz fertig - zum Beispiel das Euro-Zeichen fehlt noch.

Dabei wurde ich von einem unerwarteten Problem aufgehalten - in einem Ausmaß, dass ich nach über einer Stunde verzweifelten Probierens kurz davor stand, aufzugeben: Ich konnte nicht herausfinden, welcher Tastencode für das Pipe-Zeichen verantwortlich ist - die Taste, die dieses Zeichen produziert, befindet sich auf deutschen Tastaturen ja zwischen SHIFT und Y - auf vielen englischen Layouts ist aber die linke Taste für SHIFT breiter und es existiert keine weitere Taste zwischen dieser und Z. Endlich fand ich eine Ressource, die mir sagte, dass der korrekte Keycode dieser Taste 0x64 ist.

Nachdem ich dieses Problem ausgeräumt hatte wurde ich übermütig und versuchte, auch Umlaute korrekt zu behandeln. Hier wurde ich wieder überrascht: Die Umlaute sorgten für gar keine Tastendrücke - es kamen dieses Mal nicht die falschen Keycodes, sondern gar keine!

Auch um dieses Problem zu adressieren benötigte ich wieder sehr lange - letztlich fand ich aber die Lösung: Die ASCII-Codes dieser Zeichen liegen sämtlich über 127 - im Quelltext der Bibliothek wurde das Mapping von ASCII auf KeyCodes über ein großes Switch-Statement abgewickelt, dessen Signatur und Baginn wie folgt aussehen:

void ASCII_to_keycode(uint8_t ascii, uint8_t ledState, uint8_t* modifier, uint8_t* keycode)
{
	*keycode = 0x00;
	*modifier = 0x00;

// see scancode.doc appendix C

if (ascii >= 'A' && ascii <= 'Z') { // some code omitted for brevity's sake... } else { //https://gist.github.com/MightyPork/6da26e382a7ad91b5496ee55fdc73db2 switch (ascii) // convert ascii to keycode according to documentation { case '!': *modifier = _BV(1); // hold shift *keycode = 30; break;

Wichtig ist hier der Vergleich mit Zeichen-Literalen - Zeichen-Literale sind vom Typ char während das übergebene Zeichen im Parameter ascii vom Typ uint8_t ist, was ein typedef ist, der auf unsigned char abbildet. Da bei ASCII-Zeichen mit Codes größer als 127 aber das leftmost Bit - und damit das Vorzeichen-Bit gesetzt ist, kann dieser Vergleich bei solchen Zeichen nie true liefern. Gefixt habe ich das mit einer entsprechenden Anpassung des Vergleichs, wie hier exemplarisch illustriert:

			case (uint8_t)'Ü':
				*keycode = 0x2F;
				break;

Der Grund dafür ist die Unzulänglichkeit der Arduino (in diesem Fall) gewesen: Die Quelltexte werden als ASCII gespeichert und die IDE bzw. der Compiler wirft keine entsprechende Warnung aus - probiert man das zum Beispiel mit GCC mit folgendem Quelltext (als ISO-8859-15 gespeichert - als UTF-8 würde GCC hier ganz andere Probleme melden...):

 <stdio.h>
 <stdint.h>

void method(uint8_t ascii) { switch(ascii) { case 'a': { printf("It's an a!\n"); break; } case 'ü': { printf("It's an ü!\n"); break; } default: { printf("did not recognize char!\n"); } } }

int main(int argc, char** argv) { printf("huhu\n"); method('a'); method('ü'); }

wird man bereits bei der Kompilierung mittels folgender Fehlermeldung auf das Problem hingewiesen:

uint8_test.c:13:3: warning: case label value is less than minimum value for type

Artikel, die hierher verlinken

Elektronik Linkdump 2021 III

29.01.2022

Nachdem ich neulich über die erste Version der Schaltung für mein Custom Keyboard berichtete will ich hier noch ein paar Links nachreichen, die mir dabei geholfen haben

Schaltung DigiSparkCustomKeyboard

12.12.2021

Nachdem ich neulich über den Prototypen und einige Probleme bei der Umsetzung des deutschen Tastatur-Mappings berichtete habe ich nun damit begonnen, die Schaltung dafür zu entwerfen.

Alle Artikel rss Wochenübersicht Monatsübersicht Github Repositories Gitlab Repositories Mastodon Über mich home xmpp


Vor 5 Jahren hier im Blog

  • Fährnisse des Buildprozesses unter Windows

    17.07.2019

    Nachdem ich begonnen hatte, mich mit der Beschleunigung der Berechnung des Mandelbrot-Fraktals unter Zuhilfenahme der Shadereinheiten in Graphikkarten zu beschäftigen und erste Erfolge feiern konnte, wollte ich das mal auf einer richtigen Graphikkarte ausprobieren...

    Weiterlesen...

Neueste Artikel

  • Datenvalidierung UTF8 mit BiDi-Steuerzeichen (TrojanSource 2.0)

    Ich bin heute nochmal inspiriert worden, weiter über die Trojan Source Vulnerability nachzudenken. Meiner Meinung nach bestehen hier noch Probleme - speziell bei Nutzereingaben oder Daten, die über externe Schnittstellen ampfangen werden.

    Weiterlesen...
  • OpenStreetMap Navi als Docker-Container

    Ich habe die auf OpenStreetMap basierende OpenSource Navigationslösung Graphhopper in einen Docker-Container gepackt und als neuestes Mitglied in meinem Docker-Zoo willkommen geheißen.

    Weiterlesen...
  • SQL-Aggregatfunktionen in SQLite als BeanShell-Scripts

    Ich habe neulich über eine Möglichkeit berichtet, SQLite mittels der sQLshell und Beanshell-Skripten um SQL-Funktionen zu erweitern. In diesem Artikel versprach ich auch, über eine solche Möglichkeit für Aggregatfunktionen zu berichten.

    Weiterlesen...

Manche nennen es Blog, manche Web-Seite - ich schreibe hier hin und wieder über meine Erlebnisse, Rückschläge und Erleuchtungen bei meinen Hobbies.

Wer daran teilhaben und eventuell sogar davon profitieren möchte, muß damit leben, daß ich hin und wieder kleine Ausflüge in Bereiche mache, die nichts mit IT, Administration oder Softwareentwicklung zu tun haben.

Ich wünsche allen Lesern viel Spaß und hin und wieder einen kleinen AHA!-Effekt...

PS: Meine öffentlichen GitHub-Repositories findet man hier - meine öffentlichen GitLab-Repositories finden sich dagegen hier.