Mon, 28 Jan 2019 21:51:45 +0100
Add the (missing?) Keypad lib
24
b43536c064f6
Add the (missing?) Keypad lib
David Douard <david.douard@logilab.fr>
parents:
diff
changeset
|
1 | #include "mbed.h" |
b43536c064f6
Add the (missing?) Keypad lib
David Douard <david.douard@logilab.fr>
parents:
diff
changeset
|
2 | #include "Keypad.h" |
b43536c064f6
Add the (missing?) Keypad lib
David Douard <david.douard@logilab.fr>
parents:
diff
changeset
|
3 | |
b43536c064f6
Add the (missing?) Keypad lib
David Douard <david.douard@logilab.fr>
parents:
diff
changeset
|
4 | |
b43536c064f6
Add the (missing?) Keypad lib
David Douard <david.douard@logilab.fr>
parents:
diff
changeset
|
5 | Keypad::Keypad(uint8_t nRows, DigitalIn rows[], |
b43536c064f6
Add the (missing?) Keypad lib
David Douard <david.douard@logilab.fr>
parents:
diff
changeset
|
6 | uint8_t nColumns, DigitalOut cols[], |
b43536c064f6
Add the (missing?) Keypad lib
David Douard <david.douard@logilab.fr>
parents:
diff
changeset
|
7 | int debounce_ms): |
b43536c064f6
Add the (missing?) Keypad lib
David Douard <david.douard@logilab.fr>
parents:
diff
changeset
|
8 | _rows(), |
b43536c064f6
Add the (missing?) Keypad lib
David Douard <david.douard@logilab.fr>
parents:
diff
changeset
|
9 | _columns(), |
b43536c064f6
Add the (missing?) Keypad lib
David Douard <david.douard@logilab.fr>
parents:
diff
changeset
|
10 | _debounce(debounce_ms), |
b43536c064f6
Add the (missing?) Keypad lib
David Douard <david.douard@logilab.fr>
parents:
diff
changeset
|
11 | _started(false), |
b43536c064f6
Add the (missing?) Keypad lib
David Douard <david.douard@logilab.fr>
parents:
diff
changeset
|
12 | _nrows(nRows), |
b43536c064f6
Add the (missing?) Keypad lib
David Douard <david.douard@logilab.fr>
parents:
diff
changeset
|
13 | _ncols(nColumns) |
b43536c064f6
Add the (missing?) Keypad lib
David Douard <david.douard@logilab.fr>
parents:
diff
changeset
|
14 | { |
b43536c064f6
Add the (missing?) Keypad lib
David Douard <david.douard@logilab.fr>
parents:
diff
changeset
|
15 | printf("Setup Keypad: %dx%d\r\n", nColumns, nRows); |
b43536c064f6
Add the (missing?) Keypad lib
David Douard <david.douard@logilab.fr>
parents:
diff
changeset
|
16 | for(uint8_t c=0; c<nColumns; c++) { |
b43536c064f6
Add the (missing?) Keypad lib
David Douard <david.douard@logilab.fr>
parents:
diff
changeset
|
17 | _columns.push_back(cols[c]); |
b43536c064f6
Add the (missing?) Keypad lib
David Douard <david.douard@logilab.fr>
parents:
diff
changeset
|
18 | _columns[c].write(0); |
b43536c064f6
Add the (missing?) Keypad lib
David Douard <david.douard@logilab.fr>
parents:
diff
changeset
|
19 | } |
b43536c064f6
Add the (missing?) Keypad lib
David Douard <david.douard@logilab.fr>
parents:
diff
changeset
|
20 | |
b43536c064f6
Add the (missing?) Keypad lib
David Douard <david.douard@logilab.fr>
parents:
diff
changeset
|
21 | for(uint8_t r=0; r<nRows; r++) { |
b43536c064f6
Add the (missing?) Keypad lib
David Douard <david.douard@logilab.fr>
parents:
diff
changeset
|
22 | _rows.push_back(rows[r]); |
b43536c064f6
Add the (missing?) Keypad lib
David Douard <david.douard@logilab.fr>
parents:
diff
changeset
|
23 | _rows[r].mode(PullDown); |
b43536c064f6
Add the (missing?) Keypad lib
David Douard <david.douard@logilab.fr>
parents:
diff
changeset
|
24 | } |
b43536c064f6
Add the (missing?) Keypad lib
David Douard <david.douard@logilab.fr>
parents:
diff
changeset
|
25 | _keys = new uint8_t[_nrows*_ncols]; |
b43536c064f6
Add the (missing?) Keypad lib
David Douard <david.douard@logilab.fr>
parents:
diff
changeset
|
26 | } |
b43536c064f6
Add the (missing?) Keypad lib
David Douard <david.douard@logilab.fr>
parents:
diff
changeset
|
27 | |
b43536c064f6
Add the (missing?) Keypad lib
David Douard <david.douard@logilab.fr>
parents:
diff
changeset
|
28 | Keypad::~Keypad() |
b43536c064f6
Add the (missing?) Keypad lib
David Douard <david.douard@logilab.fr>
parents:
diff
changeset
|
29 | { |
b43536c064f6
Add the (missing?) Keypad lib
David Douard <david.douard@logilab.fr>
parents:
diff
changeset
|
30 | delete _keys; |
b43536c064f6
Add the (missing?) Keypad lib
David Douard <david.douard@logilab.fr>
parents:
diff
changeset
|
31 | } |
b43536c064f6
Add the (missing?) Keypad lib
David Douard <david.douard@logilab.fr>
parents:
diff
changeset
|
32 | |
b43536c064f6
Add the (missing?) Keypad lib
David Douard <david.douard@logilab.fr>
parents:
diff
changeset
|
33 | void Keypad::run() |
b43536c064f6
Add the (missing?) Keypad lib
David Douard <david.douard@logilab.fr>
parents:
diff
changeset
|
34 | { |
b43536c064f6
Add the (missing?) Keypad lib
David Douard <david.douard@logilab.fr>
parents:
diff
changeset
|
35 | uint8_t col=0; |
b43536c064f6
Add the (missing?) Keypad lib
David Douard <david.douard@logilab.fr>
parents:
diff
changeset
|
36 | uint8_t row; |
b43536c064f6
Add the (missing?) Keypad lib
David Douard <david.douard@logilab.fr>
parents:
diff
changeset
|
37 | |
b43536c064f6
Add the (missing?) Keypad lib
David Douard <david.douard@logilab.fr>
parents:
diff
changeset
|
38 | for (row=0; row<(_ncols*_nrows); row++) |
b43536c064f6
Add the (missing?) Keypad lib
David Douard <david.douard@logilab.fr>
parents:
diff
changeset
|
39 | _keys[row] = 0; |
b43536c064f6
Add the (missing?) Keypad lib
David Douard <david.douard@logilab.fr>
parents:
diff
changeset
|
40 | while(_started) { |
b43536c064f6
Add the (missing?) Keypad lib
David Douard <david.douard@logilab.fr>
parents:
diff
changeset
|
41 | _columns[col].write(1); |
b43536c064f6
Add the (missing?) Keypad lib
David Douard <david.douard@logilab.fr>
parents:
diff
changeset
|
42 | Thread::wait(5); |
b43536c064f6
Add the (missing?) Keypad lib
David Douard <david.douard@logilab.fr>
parents:
diff
changeset
|
43 | for(row=0; row<_nrows; row++) |
b43536c064f6
Add the (missing?) Keypad lib
David Douard <david.douard@logilab.fr>
parents:
diff
changeset
|
44 | { |
b43536c064f6
Add the (missing?) Keypad lib
David Douard <david.douard@logilab.fr>
parents:
diff
changeset
|
45 | if (_rows[row].read()) |
b43536c064f6
Add the (missing?) Keypad lib
David Douard <david.douard@logilab.fr>
parents:
diff
changeset
|
46 | { |
b43536c064f6
Add the (missing?) Keypad lib
David Douard <david.douard@logilab.fr>
parents:
diff
changeset
|
47 | if (_keys[row + _nrows*col] < 2) |
b43536c064f6
Add the (missing?) Keypad lib
David Douard <david.douard@logilab.fr>
parents:
diff
changeset
|
48 | { |
b43536c064f6
Add the (missing?) Keypad lib
David Douard <david.douard@logilab.fr>
parents:
diff
changeset
|
49 | _keys[row + _nrows*col]++; |
b43536c064f6
Add the (missing?) Keypad lib
David Douard <david.douard@logilab.fr>
parents:
diff
changeset
|
50 | if ((_keys[row + _nrows*col] == 2) && _kp_callback) |
b43536c064f6
Add the (missing?) Keypad lib
David Douard <david.douard@logilab.fr>
parents:
diff
changeset
|
51 | _kp_callback.call(row, col); |
b43536c064f6
Add the (missing?) Keypad lib
David Douard <david.douard@logilab.fr>
parents:
diff
changeset
|
52 | } |
b43536c064f6
Add the (missing?) Keypad lib
David Douard <david.douard@logilab.fr>
parents:
diff
changeset
|
53 | } |
b43536c064f6
Add the (missing?) Keypad lib
David Douard <david.douard@logilab.fr>
parents:
diff
changeset
|
54 | else |
b43536c064f6
Add the (missing?) Keypad lib
David Douard <david.douard@logilab.fr>
parents:
diff
changeset
|
55 | { |
b43536c064f6
Add the (missing?) Keypad lib
David Douard <david.douard@logilab.fr>
parents:
diff
changeset
|
56 | if (_keys[row + _nrows*col] > 0) |
b43536c064f6
Add the (missing?) Keypad lib
David Douard <david.douard@logilab.fr>
parents:
diff
changeset
|
57 | { |
b43536c064f6
Add the (missing?) Keypad lib
David Douard <david.douard@logilab.fr>
parents:
diff
changeset
|
58 | _keys[row + _nrows*col]--; |
b43536c064f6
Add the (missing?) Keypad lib
David Douard <david.douard@logilab.fr>
parents:
diff
changeset
|
59 | if ((_keys[row + _nrows*col] == 0) && _kr_callback) |
b43536c064f6
Add the (missing?) Keypad lib
David Douard <david.douard@logilab.fr>
parents:
diff
changeset
|
60 | _kr_callback.call(row, col); |
b43536c064f6
Add the (missing?) Keypad lib
David Douard <david.douard@logilab.fr>
parents:
diff
changeset
|
61 | } |
b43536c064f6
Add the (missing?) Keypad lib
David Douard <david.douard@logilab.fr>
parents:
diff
changeset
|
62 | } |
b43536c064f6
Add the (missing?) Keypad lib
David Douard <david.douard@logilab.fr>
parents:
diff
changeset
|
63 | } |
b43536c064f6
Add the (missing?) Keypad lib
David Douard <david.douard@logilab.fr>
parents:
diff
changeset
|
64 | _columns[col].write(0); |
b43536c064f6
Add the (missing?) Keypad lib
David Douard <david.douard@logilab.fr>
parents:
diff
changeset
|
65 | col = (col+1) % _ncols; |
b43536c064f6
Add the (missing?) Keypad lib
David Douard <david.douard@logilab.fr>
parents:
diff
changeset
|
66 | Thread::wait(5); |
b43536c064f6
Add the (missing?) Keypad lib
David Douard <david.douard@logilab.fr>
parents:
diff
changeset
|
67 | } |
b43536c064f6
Add the (missing?) Keypad lib
David Douard <david.douard@logilab.fr>
parents:
diff
changeset
|
68 | } |
b43536c064f6
Add the (missing?) Keypad lib
David Douard <david.douard@logilab.fr>
parents:
diff
changeset
|
69 | |
b43536c064f6
Add the (missing?) Keypad lib
David Douard <david.douard@logilab.fr>
parents:
diff
changeset
|
70 | void Keypad::attach(const keyevent_callback_t& kp_callback, |
b43536c064f6
Add the (missing?) Keypad lib
David Douard <david.douard@logilab.fr>
parents:
diff
changeset
|
71 | const keyevent_callback_t& kr_callback) |
b43536c064f6
Add the (missing?) Keypad lib
David Douard <david.douard@logilab.fr>
parents:
diff
changeset
|
72 | { |
b43536c064f6
Add the (missing?) Keypad lib
David Douard <david.douard@logilab.fr>
parents:
diff
changeset
|
73 | _kp_callback = kp_callback; |
b43536c064f6
Add the (missing?) Keypad lib
David Douard <david.douard@logilab.fr>
parents:
diff
changeset
|
74 | _kr_callback = kr_callback; |
b43536c064f6
Add the (missing?) Keypad lib
David Douard <david.douard@logilab.fr>
parents:
diff
changeset
|
75 | } |
b43536c064f6
Add the (missing?) Keypad lib
David Douard <david.douard@logilab.fr>
parents:
diff
changeset
|
76 | |
b43536c064f6
Add the (missing?) Keypad lib
David Douard <david.douard@logilab.fr>
parents:
diff
changeset
|
77 | void Keypad::start(void) |
b43536c064f6
Add the (missing?) Keypad lib
David Douard <david.douard@logilab.fr>
parents:
diff
changeset
|
78 | { |
b43536c064f6
Add the (missing?) Keypad lib
David Douard <david.douard@logilab.fr>
parents:
diff
changeset
|
79 | if (_started) |
b43536c064f6
Add the (missing?) Keypad lib
David Douard <david.douard@logilab.fr>
parents:
diff
changeset
|
80 | return; |
b43536c064f6
Add the (missing?) Keypad lib
David Douard <david.douard@logilab.fr>
parents:
diff
changeset
|
81 | _started = true; |
b43536c064f6
Add the (missing?) Keypad lib
David Douard <david.douard@logilab.fr>
parents:
diff
changeset
|
82 | _loop.start(this, &Keypad::run); |
b43536c064f6
Add the (missing?) Keypad lib
David Douard <david.douard@logilab.fr>
parents:
diff
changeset
|
83 | } |
b43536c064f6
Add the (missing?) Keypad lib
David Douard <david.douard@logilab.fr>
parents:
diff
changeset
|
84 | |
b43536c064f6
Add the (missing?) Keypad lib
David Douard <david.douard@logilab.fr>
parents:
diff
changeset
|
85 | void Keypad::stop(void) |
b43536c064f6
Add the (missing?) Keypad lib
David Douard <david.douard@logilab.fr>
parents:
diff
changeset
|
86 | { |
b43536c064f6
Add the (missing?) Keypad lib
David Douard <david.douard@logilab.fr>
parents:
diff
changeset
|
87 | _started = false; |
b43536c064f6
Add the (missing?) Keypad lib
David Douard <david.douard@logilab.fr>
parents:
diff
changeset
|
88 | } |