wasp-os/wasp/drivers/cst816s.py
2020-03-22 15:40:18 +00:00

68 lines
1.8 KiB
Python

# SPDX-License-Identifier: LGPL-3.0-or-later
# Copyright (C) 2020 Daniel Thompson
"""Hynitron CST816S touch contoller driver for MicroPython.
After modifying this file we can test the changes by replacing the
frozen driver with the modified driver. The following command will
upload the code and integrate it into the watch namespace::
./tools/wasptool\
--exec wasp/drivers/cst816s.py\
--eval "watch.touch = CST816S(watch.i2c)"`
"""
import array
class CST816S:
"""Hynitron CST816S I2C touch controller driver."""
def __init__(self, bus):
self.i2c = bus
self.dbuf = bytearray(6)
self.event = array.array('H', (0, 0, 0))
def get_event(self):
"""Receive a touch event.
Check for a pending touch event and, if an event is pending,
prepare it ready to go in the event queue.
:return: An event record if an event is received, None otherwise.
"""
dbuf = self.dbuf
event = self.event
# TODO: check the interrupt pin
try:
self.i2c.readfrom_mem_into(21, 1, dbuf)
except OSError:
return None
# Skip junk events
if dbuf[0] == 0:
return None
x = ((dbuf[2] & 0xf) << 8) + dbuf[3]
y = ((dbuf[4] & 0xf) << 8) + dbuf[5]
swipe_start = dbuf[2] & 0x80
# Skip identical events... when the I2C interface comes alive
# we can still get back stale events
if dbuf[0] == event[0] and x == event[1] and y == event[2] \
and not swipe_start:
return None
# This is a good event, lets save it
event[0] = dbuf[0]
event[1] = x
event[2] = y
# Do not forward swipe start events
if dbuf[2] & 0x80:
event[0] = 0
return None
return event