Generating Keyboard Events using MilliKey USB Serial Commands

First posted February 27, 2019.

LabHackers’ MilliKey and USB2TTL8 devices can generate a USB Keyboard event after receiving a USB serial command from the software it is connected to.

This post explains the LabHackers’ KGEN command and illustrates how to use it in a simple Python script.

KGEN Serial Command

Both the MilliKey and USB2TTL8 support the KGEN serial command. The KGEN command tells the device to generate a key press event for the specified key and duration. The USB keyboard event is identical an event generated from an actual MilliKey button press – release.

Format

KGEN key duration [offset]\n

where:

  • key: The key to use for the event. A, B, C, …
  • duration: Number milliseconds between when device sends key press and release events.
  • offset: Optional number of microseconds device will wait before sending the key press event. 0 = send as soon as KGEN command is received / processed. Default is 0 usec.

For example, send the following serial message to your LabHackers’ device to have it generate a ‘z’ key press for 123 milliseconds:

KGEN Z 123\n

or, to press the Up arrow key for 300 milliseconds, 2.5 milliseconds after receiving the command:

KGEN UP 300 2500\n

Python Example

To keep this example as short as possible, it uses KGEN to generate keyboard events but does /not/ have code to collect them.

To ‘see’ the keyboard events generated from this example, start the example and immediately switch focus to a text editor window so that you can see the keyboard events in action.

#!/usr/bin/env python
# -*- coding: utf-8 -*-
from __future__ import division, print_function

import serial
import time

# Serial Port of LabHackers' Device.
serial_address = 'COM138'
#serial_address = '/dev/cu.usbmodem3775821'

# press duration
press_duration = 250

# seconds to sleep between key press
iti = 0.5

# List of characters to use in KGEN.
key_list = "these key events are KGEN generated."

# Open USB Serial connection to LabHackers' device
try:
    s = serial.Serial(serial_address, baudrate=128000, timeout=0.1)
except serial.SerialException as e:
    print("Check SERIAL_PORT variable is correct for device being tested.")
    raise e

# Give user 5 seconds to switch to a text editor program.
time.sleep(5.0)

for key in key_list:
    # KGEN uses 'SPACE' to indicate ' ' key.
    if key == ' ':
        key = 'SPACE'

    # for each character in key_list, tell the LabHackers device to immediately
    # generate a press event for that key lasting press_duration msec.
    s.write("KGEN {} {} {}\n".format(key, press_duration, 0).encode())

    # wait iti seconds before issuing next KGEN command
    time.sleep(iti)

# close serial connection
s.close()

In an upcoming post we will use the KGEN command to test keyboard event latency and event time stamping accuracy using PsychoPy.

Happy Hacking!