for helge just for testing
Dependencies: Freetronics_16x2_LCD mbed-rtos mbed
Fork of Freetronics_16x2_LCD by
keys.cpp
- Committer:
- juergen0001
- Date:
- 2016-08-14
- Revision:
- 4:c0b34f33643f
File content as of revision 4:c0b34f33643f:
#include "keys.h" typedef struct { Thread *thread; int16_t interval_ms; PinName aPinName; AnalogIn *aPin; } keys_data_t; static keys_data_t data, *dat = &data; key_t keys[5] = { { .id = 0, .name = "right", }, { .id = 1, .name = "up", }, { .id = 2, .name = "down", }, { .id = 3, .name = "left", }, { .id = 4, .name = "sel", } }; /* * registrieren eines externen callbacks */ ssize_t register_key_callback (uint8_t keynum, keycb_num_t cb, key_cb_ft cb_fn) { if (keynum >= 5) return -1; if (cb >= KEYCB_CNT) return -2; if (NULL == cb_fn) return -3; switch (cb) { case KEYCB_PRESS: keys[keynum].pressed = cb_fn; break; case KEYCB_LONGPRESS: keys[keynum].longpressed = cb_fn; break; case KEYCB_RELEASE: keys[keynum].released = cb_fn; break; default: return -4; } return 0; } static uint64_t clock_ms() { return us_ticker_read() / 1000; } static void key_pressed (key_t *k) { if (NULL == k) return; pc.printf ("%s pressed\n", k->name); } static void key_released (key_t *k) { if (NULL == k) return; pc.printf ("%s released\n", k->name); } static void key_longpressed (key_t *k) { if (NULL == k) return; pc.printf ("%s longpressed\n", k->name); } static void keyThread (void const *arg) { //keys_data_t *dat = (keys_data_t *)arg; uint8_t k,i; float volt; while (true) { Thread::wait(dat->interval_ms); volt = dat->aPin->read(); //pc.printf("keys_handler %f\n", volt); for (k = 0; k < 5; k++) { if (volt <= keys[k].threshold) break; } for (i = 0; i < 5; i++) { keys[i].state[2] = keys[i].state[1]; keys[i].state[1] = keys[i].state[0]; keys[i].state[0] = (i == k); uint8_t dn = (3 == (keys[i].state[0] + keys[i].state[1] +keys[i].state[2])); if (dn) { if (!keys[i].dn) { keys[i].dn = dn; keys[i].dn_ts = clock_ms(); keys[i].pressed(&keys[i]); } else {//war schon gedrueckt } } else {//nicht gedrueckt if (keys[i].dn) {//war aber keys[i].dn = 0; keys[i].dn_ts = 0; keys[i].released (&keys[i]); } } } } } void keys_init (PinName analog, uint16_t interval, float *volts6) { uint8_t i; for (i = 0; i < 5; i++){ keys[i].voltage = volts6[i]; keys[i].threshold = (volts6[i] + volts6[i+1]) / 2.0f; //default handlers keys[i].pressed = key_pressed; keys[i].longpressed = key_longpressed; keys[i].released = key_released; } for (i = 0; i < 5; i++) pc.printf("%u %s threshold %f\n", i, keys[i].name, keys[i].threshold); data.interval_ms = interval; data.aPinName = analog; data.aPin = new AnalogIn(data.aPinName); data.thread = new Thread(keyThread, &data); // data.thread = new Thread(); // data.thread->start(keyThread); }