for helge just for testing

Dependencies:   Freetronics_16x2_LCD mbed-rtos mbed

Fork of Freetronics_16x2_LCD by Shields

Committer:
juergen0001
Date:
Sun Aug 14 09:53:28 2016 +0000
Revision:
4:c0b34f33643f
test for helge

Who changed what in which revision?

UserRevisionLine numberNew 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 }