Gamepad

Published on 2019-03-03 in PewPew Standalone.

Since the new firmware is considerably smaller, it has more modules enabled by default. One of those is the usb_hid module, which lets PewPew act as a Human Interface Device over USB. That means we can pretend to be a keyboard, a mouse or a gamepad. To test this, I wrote a simple program that turns PewPew into a gamepad:

import board
import struct
import usb_hid
import pew


pew.init()
screen = pew.Pix()
for gamepad in usb_hid.devices:
    if gamepad.usage_page == 0x01 and gamepad.usage == 0x05:
        break
else:
    raise RuntimeError("Gamepad HID device not found")
report = bytearray(6)

while True:
    buttons = pew.keys()
    report_buttons = 0

    if buttons & pew.K_O:
        screen.pixel(6, 3, 3)
        report_buttons |= 0x01
    else:
        screen.pixel(6, 3, 1)

    if buttons & pew.K_X:
        screen.pixel(6, 5, 3)
        report_buttons |= 0x02
    else:
        screen.pixel(6, 5, 1)

    if buttons & pew.K_UP:
        y = -127
        screen.pixel(2, 3, 3)
        screen.pixel(2, 5, 1)
    elif buttons & pew.K_DOWN:
        y = 127
        screen.pixel(2, 3, 1)
        screen.pixel(2, 5, 3)
    else:
        y = 0
        screen.pixel(2, 3, 1)
        screen.pixel(2, 5, 1)

    if buttons & pew.K_LEFT:
        x = -127
        screen.pixel(1, 4, 3)
        screen.pixel(3, 4, 1)
    elif buttons & pew.K_RIGHT:
        x = 127
        screen.pixel(1, 4, 1)
        screen.pixel(3, 4, 3)
    else:
        x = 0
        screen.pixel(1, 4, 1)
        screen.pixel(3, 4, 1)

    struct.pack_into('<Hbbbb', report, 0, report_buttons, x, y, 0, 0)
    gamepad.send_report(report)
    pew.show(screen)
    pew.tick(1/12)

That’s it. And it seems to be working!