M5CardComputer Keyboard: Unterschied zwischen den Versionen

Aus Micropython Referenz
Zur Navigation springen Zur Suche springen
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

  1. Eine Instanz erzeugen
  2. die ISR schreiben
  3. 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.

Lager

Navigation

Zurück zur M5CardComputer Startseite