ae5743529f
This has two useful properties. Firstly it means the watch will be maintained in the background, allowing the REPL to be used for notifications and other updates. Secondly it will save a little bit of power by reducing the work needed to handle spurious wake ups. Signed-off-by: Daniel Thompson <daniel@redfelineninja.org.uk>
96 lines
2.5 KiB
Python
96 lines
2.5 KiB
Python
# SPDX-License-Identifier: LGPL-3.0-or-later
|
|
# Copyright (C) 2020 Daniel Thompson
|
|
|
|
"""Hynitron CST816S touch contoller driver
|
|
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
|
"""
|
|
|
|
import array
|
|
import time
|
|
from machine import Pin
|
|
|
|
class CST816S:
|
|
"""Hynitron CST816S I2C touch controller driver.
|
|
|
|
.. automethod:: __init__
|
|
"""
|
|
|
|
def __init__(self, bus, intr, rst, schedule=None):
|
|
"""Specify the bus used by the touch controller.
|
|
|
|
:param machine.I2C bus: I2C bus for the CST816S.
|
|
"""
|
|
self.i2c = bus
|
|
self.tp_int = intr
|
|
self.tp_rst = rst
|
|
self.schedule = schedule
|
|
self.dbuf = bytearray(6)
|
|
self.event = array.array('H', (0, 0, 0))
|
|
|
|
self._reset()
|
|
self.tp_int.irq(trigger=Pin.IRQ_FALLING, handler=self.get_touch_data)
|
|
|
|
def _reset(self):
|
|
self.tp_rst.off()
|
|
time.sleep_ms(5)
|
|
self.tp_rst.on()
|
|
time.sleep_ms(50)
|
|
|
|
def get_touch_data(self, pin_obj):
|
|
"""Receive a touch event by interrupt.
|
|
|
|
Check for a pending touch event and, if an event is pending,
|
|
prepare it ready to go in the event queue.
|
|
"""
|
|
dbuf = self.dbuf
|
|
event = self.event
|
|
|
|
try:
|
|
self.i2c.readfrom_mem_into(21, 1, dbuf)
|
|
except OSError:
|
|
return None
|
|
|
|
event[0] = dbuf[0] # event
|
|
event[1] = ((dbuf[2] & 0xf) << 8) + dbuf[3] # x coord
|
|
event[2] = ((dbuf[4] & 0xf) << 8) + dbuf[5] # y coord
|
|
|
|
if self.schedule:
|
|
self.schedule(self)
|
|
|
|
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.
|
|
"""
|
|
if self.event[0] == 0:
|
|
return None
|
|
|
|
return self.event
|
|
|
|
def reset_touch_data(self):
|
|
"""Reset touch data.
|
|
|
|
Reset touch data, call this function after processing an event.
|
|
"""
|
|
self.event[0] = 0
|
|
|
|
def wake(self):
|
|
"""Wake up touch controller chip.
|
|
|
|
Just reset the chip in order to wake it up
|
|
"""
|
|
self._reset()
|
|
|
|
def sleep(self):
|
|
"""Put touch controller chip on sleep mode to save power.
|
|
"""
|
|
# Before we can sent the sleep command we have to reset the
|
|
# panel to get the I2C hardware running again...
|
|
self._reset()
|
|
self.i2c.writeto_mem(21, 0xa5, b'\x03')
|
|
|
|
# Ensure get_event() cannot return anything
|
|
self.event[0] = 0
|