M5CardComputer Keyboard: Unterschied zwischen den Versionen
Zur Navigation springen
Zur Suche springen
Peter (Diskussion | Beiträge) |
Peter (Diskussion | Beiträge) |
||
Zeile 62: | Zeile 62: | ||
# Vom GUI-Editor erstellt | |||
title0 = None | title0 = None | ||
line1 = None | line1 = None |
Version vom 13. April 2024, 19:29 Uhr
Die Keyboardabfrage ist interrupt gesteuert.
Keyboard initialisieren
- Eine Instanz erzeugen
- die ISR schreiben
- die ISR dem Keyboardinterrupt zuweisen.
kb = MatrixKeyboard() def kb_pressed_event(kb_0): pass kb.set_callback(kb_pressed_event) ... kb.tick() # steht in der MainLoop -> Grund?
Methoden von MatrixKeyboard
- kb.tick()
- ist in der Mainloop erforderlich damit die Keyboard Abfrage funktioniert. Es scheint so, als ob diese Methode die Abfrage durchführt. Wenn sleep() in der Schleife vorkommt, wird nur entsprechend selten oder gar nicht abgefragt.
- Hiermit lässt sich die Keyboard Abfrage auch ein- und ausschalten:
if key_active: kb.tick()
- key_active ist eine Variable die True oder False enthält.
- True: Keyboard wird abgefragt.
- False: Keyboard wird nicht abgefragt.
- kb.get_string()
- gibt des Wert der gedrückten Taste als String zurück
- kb.get_key()
- gibt des Wert der gedrückten Taste als Integer zurück
- kb.is_pressed()
- gibt True zurück, wenn eine Taste gedrückt wurde/ist oder False wenn nicht.
- KeyCode.KEYCODE_BACKSPACE
- KeyCode.KEYCODE_TAB
- KeyCode.KEYCODE_ENTER
- KeyCode.KEYCODE_ESC
- KeyCode.KEYCODE_SPACE
- KeyCode.KEYCODE_DEL
- KeyCode.KEYCODE_LEFT
- KeyCode.KEYCODE_RIGHT
- KeyCode.KEYCODE_UP
- KeyCode.KEYCODE_DOWN
- Konstanten für die Sondertasten
Die Keyboard ISR schreiben
Ich habe keinen Weg gefunden die ISR im laufenden Betrieb zu ändern. Deshalb sind bei der Entwicklung der ISR alle in Frage kommenden Fälle zu beachten!
Keyboard Puffer einsetzen
dissy hat ein Blockly-Programm (UIFlow2) geschrieben, das Zeichen von der Tastatur holt, in einen Puffer schreibt und dann auf dem Display ausgibt. Bei der nächsten Ausgabe wird die alte Zeile nach oben geschoben und die neue Zeile darunter gesetzt. Die Eingabe ist mit BS editierbar. Ich habe den Micropython mit seiner Zustimmung hier eingefügt:
import os, sys, io import M5 from M5 import * from hardware import * # Vom GUI-Editor erstellt title0 = None line1 = None line2 = None line3 = None line0 = None buffer = None kb = None _keyBuffer = None L = None _screenLine1 = None _screenLine2 = None x = None _screenLine3 = None _keyBufMaxLen = None keyCode = None keyChar = None # Describe this function... def updateScreen(): global _keyBuffer, L, _screenLine1, _screenLine2, x, _screenLine3, _keyBufMaxLen, keyCode, keyChar, title0, line1, line2, line3, line0, buffer, kb buffer.setText(str(_keyBuffer)) line1.setText(str(_screenLine1)) line2.setText(str(_screenLine2)) line3.setText(str(_screenLine3)) # Describe this function... def key_Delete(): global _keyBuffer, L, _screenLine1, _screenLine2, x, _screenLine3, _keyBufMaxLen, keyCode, keyChar, title0, line1, line2, line3, line0, buffer, kb # We are a bit limited in block options here. # First get the length of the buffer and make sure # there is a character to delete. # Next get a substring of the buffer, excluding the last char. # and store that back into the buffer. L = len(_keyBuffer) if L < 1: return x = L - 1 _keyBuffer = _keyBuffer[:x] buffer.setText(str(_keyBuffer)) Speaker.tone(1000, 50) # Describe this function... def key_Enter(): global _keyBuffer, L, _screenLine1, _screenLine2, x, _screenLine3, _keyBufMaxLen, keyCode, keyChar, title0, line1, line2, line3, line0, buffer, kb # First, scroll the history lines up for visual effect # Then put the buffer into the last line # Finally clear the buffer, play a happy sound _screenLine1 = _screenLine2 _screenLine2 = _screenLine3 _screenLine3 = _keyBuffer _keyBuffer = '' updateScreen() Speaker.tone(2000, 100) def kb_pressed_event(kb_0): global title0, line1, line2, line3, line0, buffer, kb, _keyBuffer, L, _screenLine1, _screenLine2, x, _screenLine3, _keyBufMaxLen, keyCode, keyChar # Check if buffer is full # If so, empty it and play an error sound L = len(_keyBuffer) if L > _keyBufMaxLen: _keyBuffer = '' buffer.setText(str(' ')) Speaker.tone(1000, 750) # We can not get both the key value and key string # (Either get clears the last key pressed) # Start with the special cases by value keyCode = kb.get_key() if keyCode==8: # 8 is the Delete key key_Delete() elif keyCode==9: # 9 is the Tab key, which we will just ignore Speaker.tone(3000, 50) elif keyCode==13: # 13 is the Enter key key_Enter() else: # All other keys end up here, so lets convert the keycode to ascii, # append to the buffer, and play a click. keyChar = '' keyChar = chr(keyCode) _keyBuffer = (str(_keyBuffer) + str(keyChar)) buffer.setText(str(_keyBuffer)) Speaker.tone(3000, 50) updateScreen() def setup(): global title0, line1, line2, line3, line0, buffer, kb, _keyBuffer, L, _screenLine1, _screenLine2, x, _screenLine3, _keyBufMaxLen, keyCode, keyChar M5.begin() title0 = Widgets.Title("Key Buffer Test", 3, 0xffffff, 0x0000FF, Widgets.FONTS.DejaVu18) line1 = Widgets.Label("line1", 10, 25, 1.0, 0xffffff, 0x000000, Widgets.FONTS.DejaVu18) line2 = Widgets.Label("line2", 10, 45, 1.0, 0xffffff, 0x000000, Widgets.FONTS.DejaVu18) line3 = Widgets.Label("line3", 10, 65, 1.0, 0xffffff, 0x000000, Widgets.FONTS.DejaVu18) line0 = Widgets.Line(5, 91, 235, 91, 0xffffff) buffer = Widgets.Label("Hello line buffer world!", 12, 101, 1.0, 0x00caff, 0x000000, Widgets.FONTS.DejaVu18) Widgets.fillScreen(0x000000) kb = MatrixKeyboard() kb.set_callback(kb_pressed_event) _keyBufMaxLen = 20 _keyBuffer = '' title0.setVisible(True) line0.setVisible(True) _screenLine1 = '' _screenLine2 = '' _screenLine3 = '' updateScreen() def loop(): global title0, line1, line2, line3, line0, buffer, kb, _keyBuffer, L, _screenLine1, _screenLine2, x, _screenLine3, _keyBufMaxLen, keyCode, keyChar M5.update() kb.tick() if __name__ == '__main__': try: setup() while True: loop() except (Exception, KeyboardInterrupt) as e: try: from utility import print_error_msg print_error_msg(e) except ImportError: print("please update to latest firmware")
Die Einrückung beträgt hier nur 2 Leerzeichen! Das macht M5Stack so.