-
Notifications
You must be signed in to change notification settings - Fork 1
/
TTP229_SPI.cpp
88 lines (74 loc) · 1.59 KB
/
TTP229_SPI.cpp
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
85
86
87
88
//
// Created by bratoff on 27.06.21
// based on TTP229 by kiryanenko on 14.09.19.
//
#include "TTP229_SPI.h"
int findKey(uint16_t bits) {
if(bits) {
int i = 0;
for (uint16_t mask = 0x0001; mask; mask <<= 1) {
if (mask & bits) {
return i;
}
++i;
}
} else {
return -1;
}
}
void TTP229_SPI::begin(void) {
if(_sckPin < 0) {
SPI.begin();
SPI.beginTransaction(SPISettings(14000000, LSBFIRST, SPI_MODE3));
} else {
pinMode(_sckPin, OUTPUT);
digitalWrite(_sckPin, HIGH);
pinMode(_misoPin, INPUT);
}
}
uint16_t TTP229_SPI::readSPI(void) {
if(_sckPin < 0 || _misoPin < 0) {
return(SPI.transfer16(0));
} else {
uint16_t bits = 0;
for(int i=0; i<16; i++) {
bits >>= 1;
digitalWrite(_sckPin, LOW);
if(digitalRead(_misoPin))
bits |= 0x8000;
digitalWrite(_sckPin, HIGH);
}
return(bits);
}
}
uint16_t TTP229_SPI::readKeys(void) {
_prev_state = _keys;
_keys = readSPI();
if(_invert)
_keys ^= 0xffff;
uint16_t changed = _prev_state ^ _keys;
if(changed) {
if(_cb_change != NULL)
_cb_change(_keys);
if(_keys & changed) {
if(_cb_down != NULL)
_cb_down(findKey(changed));
} else {
if(_cb_up != NULL)
_cb_up(findKey(changed));
}
}
return _keys;
}
int TTP229_SPI::getKey(void) {
return findKey(_keys);
}
bool TTP229_SPI::isKeyPress(byte key) {
return bitRead(_keys, key);
}
bool TTP229_SPI::isKeyDown(byte key) {
return !bitRead(_prev_state, key) && bitRead(_keys, key);
}
bool TTP229_SPI::isKeyUp(byte key) {
return bitRead(_prev_state, key) && !bitRead(_keys, key);
}