1
0
Fork 0
wasp-os/wasp/drivers/cst816s.py

64 lines
1.7 KiB
Python
Raw Normal View History

"""Hynitron CST816S touch contoller driver for MicroPython.
After modifying this file we can replace the frozen driver with the
test driver with the following command::
./tools/wasptool \
--exec wasp/drivers/cst816s.py \
--eval "watch.touch = CST816S(watch.i2c)"`
"""
import array
2020-03-06 22:09:43 +01:00
class CST816S:
"""Hynitron CST816S I2C touch controller driver."""
def __init__(self, bus):
self.i2c = bus
2020-03-06 22:09:43 +01:00
self.dbuf = bytearray(6)
self.event = array.array('H', (0, 0, 0))
2020-03-06 22:09:43 +01:00
def get_event(self):
2020-03-06 22:09:43 +01:00
"""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.
2020-03-06 22:09:43 +01:00
"""
dbuf = self.dbuf
event = self.event
# TODO: check the interrupt pin
2020-03-06 22:09:43 +01:00
try:
self.i2c.readfrom_mem_into(21, 1, dbuf)
2020-03-06 22:09:43 +01:00
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
2020-03-06 22:09:43 +01:00
return event