for helge just for testing

Dependencies:   Freetronics_16x2_LCD mbed-rtos mbed

Fork of Freetronics_16x2_LCD by Shields

Revision:
4:c0b34f33643f
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/keys.cpp	Sun Aug 14 09:53:28 2016 +0000
@@ -0,0 +1,139 @@
+
+#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);
+}
\ No newline at end of file