blob: ec97e3d72b0e081e1a89bcbfca7dc8697a06bff2 (
plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
|
# SPDX-License-Identifier: LGPL-3.0-or-later
# Copyright (C) 2020 Daniel Thompson
"""Basic touch sensor driver
~~~~~~~~~~~~~~~~~~~~~~~~~~~~
"""
import array
import time
from machine import Pin
from watch import rtc
class TouchButton:
"""Simple touch controller driver.
.. automethod:: __init__
"""
def __init__(self, intr, rst, schedule=None):
"""Specify the bus used by the touch controller.
:param machine.I2C bus: I2C bus for the CST816S.
"""
self.tp_int = intr
self.tp_rst = rst
self.schedule = schedule
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)
self.event[0] = 0
self._wake_at = rtc.get_uptime_ms() + 300
def get_touch_data(self, pin_obj):
"""Synthesize a right swipe during interrupt.
"""
self.event[0] = 253 # NEXT
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 rtc.get_uptime_ms() < self._wake_at:
self.event[0] = 0
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.
"""
self.tp_rst.off()
# Ensure get_event() cannot return anything
self.event[0] = 0
|