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

102 lines
2.7 KiB
Python
Raw Normal View History

# SPDX-License-Identifier: LGPL-3.0-or-later
# Copyright (C) 2020 Daniel Thompson
2020-05-14 22:36:09 +02:00
"""Hynitron CST816S touch contoller driver
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
"""
import array
import time
from machine import Pin
2020-03-06 22:09:43 +01:00
class CST816S:
2020-05-14 22:36:09 +02:00
"""Hynitron CST816S I2C touch controller driver.
.. automethod:: __init__
"""
def __init__(self, bus, intr, rst, schedule=None):
2020-05-14 22:36:09 +02:00
"""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
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
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.
2020-03-06 22:09:43 +01:00
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
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
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
2020-03-06 22:09:43 +01:00
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()
self.event[0] = 0
def sleep(self):
"""Put touch controller chip on sleep mode to save power.
"""
# Before we can send the sleep command we have to reset the
# panel to get the I2C hardware running again...
self._reset()
try:
self.i2c.writeto_mem(21, 0xa5, b'\x03')
except:
# If we can't power down then let's just put it in reset instead
self.tp_rst.off()
# Ensure get_event() cannot return anything
self.event[0] = 0