for helge just for testing
Dependencies: Freetronics_16x2_LCD mbed-rtos mbed
Fork of Freetronics_16x2_LCD by
keys.cpp@4:c0b34f33643f, 2016-08-14 (annotated)
- Committer:
- juergen0001
- Date:
- Sun Aug 14 09:53:28 2016 +0000
- Revision:
- 4:c0b34f33643f
test for helge
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
juergen0001 | 4:c0b34f33643f | 1 | |
juergen0001 | 4:c0b34f33643f | 2 | #include "keys.h" |
juergen0001 | 4:c0b34f33643f | 3 | |
juergen0001 | 4:c0b34f33643f | 4 | |
juergen0001 | 4:c0b34f33643f | 5 | typedef struct { |
juergen0001 | 4:c0b34f33643f | 6 | Thread *thread; |
juergen0001 | 4:c0b34f33643f | 7 | int16_t interval_ms; |
juergen0001 | 4:c0b34f33643f | 8 | PinName aPinName; |
juergen0001 | 4:c0b34f33643f | 9 | AnalogIn *aPin; |
juergen0001 | 4:c0b34f33643f | 10 | } keys_data_t; |
juergen0001 | 4:c0b34f33643f | 11 | |
juergen0001 | 4:c0b34f33643f | 12 | static keys_data_t data, *dat = &data; |
juergen0001 | 4:c0b34f33643f | 13 | |
juergen0001 | 4:c0b34f33643f | 14 | key_t keys[5] = { |
juergen0001 | 4:c0b34f33643f | 15 | { |
juergen0001 | 4:c0b34f33643f | 16 | .id = 0, |
juergen0001 | 4:c0b34f33643f | 17 | .name = "right", |
juergen0001 | 4:c0b34f33643f | 18 | }, |
juergen0001 | 4:c0b34f33643f | 19 | { |
juergen0001 | 4:c0b34f33643f | 20 | .id = 1, |
juergen0001 | 4:c0b34f33643f | 21 | .name = "up", |
juergen0001 | 4:c0b34f33643f | 22 | }, |
juergen0001 | 4:c0b34f33643f | 23 | { |
juergen0001 | 4:c0b34f33643f | 24 | .id = 2, |
juergen0001 | 4:c0b34f33643f | 25 | .name = "down", |
juergen0001 | 4:c0b34f33643f | 26 | }, |
juergen0001 | 4:c0b34f33643f | 27 | { |
juergen0001 | 4:c0b34f33643f | 28 | .id = 3, |
juergen0001 | 4:c0b34f33643f | 29 | .name = "left", |
juergen0001 | 4:c0b34f33643f | 30 | }, |
juergen0001 | 4:c0b34f33643f | 31 | { |
juergen0001 | 4:c0b34f33643f | 32 | .id = 4, |
juergen0001 | 4:c0b34f33643f | 33 | .name = "sel", |
juergen0001 | 4:c0b34f33643f | 34 | } |
juergen0001 | 4:c0b34f33643f | 35 | }; |
juergen0001 | 4:c0b34f33643f | 36 | /* |
juergen0001 | 4:c0b34f33643f | 37 | * registrieren eines externen callbacks |
juergen0001 | 4:c0b34f33643f | 38 | */ |
juergen0001 | 4:c0b34f33643f | 39 | ssize_t register_key_callback (uint8_t keynum, keycb_num_t cb, key_cb_ft cb_fn) |
juergen0001 | 4:c0b34f33643f | 40 | { |
juergen0001 | 4:c0b34f33643f | 41 | if (keynum >= 5) |
juergen0001 | 4:c0b34f33643f | 42 | return -1; |
juergen0001 | 4:c0b34f33643f | 43 | if (cb >= KEYCB_CNT) |
juergen0001 | 4:c0b34f33643f | 44 | return -2; |
juergen0001 | 4:c0b34f33643f | 45 | if (NULL == cb_fn) |
juergen0001 | 4:c0b34f33643f | 46 | return -3; |
juergen0001 | 4:c0b34f33643f | 47 | switch (cb) { |
juergen0001 | 4:c0b34f33643f | 48 | case KEYCB_PRESS: |
juergen0001 | 4:c0b34f33643f | 49 | keys[keynum].pressed = cb_fn; break; |
juergen0001 | 4:c0b34f33643f | 50 | case KEYCB_LONGPRESS: |
juergen0001 | 4:c0b34f33643f | 51 | keys[keynum].longpressed = cb_fn; break; |
juergen0001 | 4:c0b34f33643f | 52 | case KEYCB_RELEASE: |
juergen0001 | 4:c0b34f33643f | 53 | keys[keynum].released = cb_fn; break; |
juergen0001 | 4:c0b34f33643f | 54 | default: return -4; |
juergen0001 | 4:c0b34f33643f | 55 | } |
juergen0001 | 4:c0b34f33643f | 56 | return 0; |
juergen0001 | 4:c0b34f33643f | 57 | } |
juergen0001 | 4:c0b34f33643f | 58 | |
juergen0001 | 4:c0b34f33643f | 59 | |
juergen0001 | 4:c0b34f33643f | 60 | static uint64_t clock_ms() { return us_ticker_read() / 1000; } |
juergen0001 | 4:c0b34f33643f | 61 | static void key_pressed (key_t *k) |
juergen0001 | 4:c0b34f33643f | 62 | { |
juergen0001 | 4:c0b34f33643f | 63 | if (NULL == k) |
juergen0001 | 4:c0b34f33643f | 64 | return; |
juergen0001 | 4:c0b34f33643f | 65 | pc.printf ("%s pressed\n", k->name); |
juergen0001 | 4:c0b34f33643f | 66 | } |
juergen0001 | 4:c0b34f33643f | 67 | static void key_released (key_t *k) |
juergen0001 | 4:c0b34f33643f | 68 | { |
juergen0001 | 4:c0b34f33643f | 69 | if (NULL == k) |
juergen0001 | 4:c0b34f33643f | 70 | return; |
juergen0001 | 4:c0b34f33643f | 71 | pc.printf ("%s released\n", k->name); |
juergen0001 | 4:c0b34f33643f | 72 | } |
juergen0001 | 4:c0b34f33643f | 73 | |
juergen0001 | 4:c0b34f33643f | 74 | static void key_longpressed (key_t *k) |
juergen0001 | 4:c0b34f33643f | 75 | { |
juergen0001 | 4:c0b34f33643f | 76 | if (NULL == k) |
juergen0001 | 4:c0b34f33643f | 77 | return; |
juergen0001 | 4:c0b34f33643f | 78 | pc.printf ("%s longpressed\n", k->name); |
juergen0001 | 4:c0b34f33643f | 79 | } |
juergen0001 | 4:c0b34f33643f | 80 | |
juergen0001 | 4:c0b34f33643f | 81 | |
juergen0001 | 4:c0b34f33643f | 82 | |
juergen0001 | 4:c0b34f33643f | 83 | |
juergen0001 | 4:c0b34f33643f | 84 | static void keyThread (void const *arg) |
juergen0001 | 4:c0b34f33643f | 85 | { |
juergen0001 | 4:c0b34f33643f | 86 | //keys_data_t *dat = (keys_data_t *)arg; |
juergen0001 | 4:c0b34f33643f | 87 | uint8_t k,i; |
juergen0001 | 4:c0b34f33643f | 88 | float volt; |
juergen0001 | 4:c0b34f33643f | 89 | while (true) { |
juergen0001 | 4:c0b34f33643f | 90 | Thread::wait(dat->interval_ms); |
juergen0001 | 4:c0b34f33643f | 91 | volt = dat->aPin->read(); |
juergen0001 | 4:c0b34f33643f | 92 | //pc.printf("keys_handler %f\n", volt); |
juergen0001 | 4:c0b34f33643f | 93 | for (k = 0; k < 5; k++) { |
juergen0001 | 4:c0b34f33643f | 94 | if (volt <= keys[k].threshold) break; |
juergen0001 | 4:c0b34f33643f | 95 | } |
juergen0001 | 4:c0b34f33643f | 96 | for (i = 0; i < 5; i++) { |
juergen0001 | 4:c0b34f33643f | 97 | keys[i].state[2] = keys[i].state[1]; keys[i].state[1] = keys[i].state[0]; |
juergen0001 | 4:c0b34f33643f | 98 | keys[i].state[0] = (i == k); |
juergen0001 | 4:c0b34f33643f | 99 | uint8_t dn = (3 == (keys[i].state[0] + keys[i].state[1] +keys[i].state[2])); |
juergen0001 | 4:c0b34f33643f | 100 | if (dn) { |
juergen0001 | 4:c0b34f33643f | 101 | if (!keys[i].dn) { |
juergen0001 | 4:c0b34f33643f | 102 | keys[i].dn = dn; |
juergen0001 | 4:c0b34f33643f | 103 | keys[i].dn_ts = clock_ms(); |
juergen0001 | 4:c0b34f33643f | 104 | keys[i].pressed(&keys[i]); |
juergen0001 | 4:c0b34f33643f | 105 | } else {//war schon gedrueckt |
juergen0001 | 4:c0b34f33643f | 106 | } |
juergen0001 | 4:c0b34f33643f | 107 | } else {//nicht gedrueckt |
juergen0001 | 4:c0b34f33643f | 108 | if (keys[i].dn) {//war aber |
juergen0001 | 4:c0b34f33643f | 109 | keys[i].dn = 0; |
juergen0001 | 4:c0b34f33643f | 110 | keys[i].dn_ts = 0; |
juergen0001 | 4:c0b34f33643f | 111 | keys[i].released (&keys[i]); |
juergen0001 | 4:c0b34f33643f | 112 | } |
juergen0001 | 4:c0b34f33643f | 113 | } |
juergen0001 | 4:c0b34f33643f | 114 | } |
juergen0001 | 4:c0b34f33643f | 115 | } |
juergen0001 | 4:c0b34f33643f | 116 | } |
juergen0001 | 4:c0b34f33643f | 117 | |
juergen0001 | 4:c0b34f33643f | 118 | |
juergen0001 | 4:c0b34f33643f | 119 | void keys_init (PinName analog, uint16_t interval, float *volts6) |
juergen0001 | 4:c0b34f33643f | 120 | { |
juergen0001 | 4:c0b34f33643f | 121 | uint8_t i; |
juergen0001 | 4:c0b34f33643f | 122 | for (i = 0; i < 5; i++){ |
juergen0001 | 4:c0b34f33643f | 123 | keys[i].voltage = volts6[i]; |
juergen0001 | 4:c0b34f33643f | 124 | keys[i].threshold = (volts6[i] + volts6[i+1]) / 2.0f; |
juergen0001 | 4:c0b34f33643f | 125 | //default handlers |
juergen0001 | 4:c0b34f33643f | 126 | keys[i].pressed = key_pressed; |
juergen0001 | 4:c0b34f33643f | 127 | keys[i].longpressed = key_longpressed; |
juergen0001 | 4:c0b34f33643f | 128 | keys[i].released = key_released; |
juergen0001 | 4:c0b34f33643f | 129 | } |
juergen0001 | 4:c0b34f33643f | 130 | for (i = 0; i < 5; i++) |
juergen0001 | 4:c0b34f33643f | 131 | pc.printf("%u %s threshold %f\n", i, keys[i].name, keys[i].threshold); |
juergen0001 | 4:c0b34f33643f | 132 | |
juergen0001 | 4:c0b34f33643f | 133 | data.interval_ms = interval; |
juergen0001 | 4:c0b34f33643f | 134 | data.aPinName = analog; |
juergen0001 | 4:c0b34f33643f | 135 | data.aPin = new AnalogIn(data.aPinName); |
juergen0001 | 4:c0b34f33643f | 136 | data.thread = new Thread(keyThread, &data); |
juergen0001 | 4:c0b34f33643f | 137 | // data.thread = new Thread(); |
juergen0001 | 4:c0b34f33643f | 138 | // data.thread->start(keyThread); |
juergen0001 | 4:c0b34f33643f | 139 | } |