for helge just for testing

Dependencies:   Freetronics_16x2_LCD mbed-rtos mbed

Fork of Freetronics_16x2_LCD by Shields

Files at this revision

API Documentation at this revision

Comitter:
juergen0001
Date:
Sun Aug 14 09:53:28 2016 +0000
Parent:
3:392d0238a7dc
Commit message:
test for helge

Changed in this revision

keys.cpp Show annotated file Show diff for this revision Revisions of this file
keys.h Show annotated file Show diff for this revision Revisions of this file
main.cpp Show annotated file Show diff for this revision Revisions of this file
mbed-rtos.lib Show annotated file Show diff for this revision Revisions of this file
mbed.bld Show annotated file Show diff for this revision Revisions of this file
diff -r 392d0238a7dc -r c0b34f33643f keys.cpp
--- /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
diff -r 392d0238a7dc -r c0b34f33643f keys.h
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/keys.h	Sun Aug 14 09:53:28 2016 +0000
@@ -0,0 +1,36 @@
+#ifndef __KEYS_H_ 
+#define __KEYS_H_
+#include "mbed.h"
+#include "freetronicsLCDShield.h"
+#include "rtos.h"
+
+
+typedef struct key_t key_t;
+
+typedef void(*key_cb_ft) (key_t*);
+struct key_t {
+    uint8_t id;
+    char *name;
+    key_cb_ft pressed, longpressed, released;
+    float voltage;
+    float threshold;
+    uint8_t state[3];//zum entprellen
+    uint8_t dn; //down status
+    uint32_t dn_ts;//zeitstempel der Flanke
+    uint32_t dn_lpts;//zeitstempel der letzen lonpress funktion
+};
+
+extern freetronicsLCDShield lcd;
+extern Serial pc;
+void write_lcd (uint8_t x, uint8_t y, char *txt);
+typedef enum {
+    KEYCB_PRESS,
+    KEYCB_LONGPRESS,
+    KEYCB_RELEASE,
+    KEYCB_CNT
+} keycb_num_t;
+ssize_t register_key_callback (uint8_t keynum, keycb_num_t cb, key_cb_ft cb_fn);
+void keys_handler (float volt);
+//void keys_init (void);
+void keys_init (PinName analog, uint16_t interval, float *volts6);
+#endif
\ No newline at end of file
diff -r 392d0238a7dc -r c0b34f33643f main.cpp
--- a/main.cpp	Fri Feb 13 09:48:28 2015 +0000
+++ b/main.cpp	Sun Aug 14 09:53:28 2016 +0000
@@ -18,25 +18,117 @@
 
 #include "mbed.h"
 #include "freetronicsLCDShield.h"
+#include "rtos.h"
 
-freetronicsLCDShield lcd(D8, D9, D4, D5, D6, D7, D3, A0);
+#include "keys.h"
+
+float clock_s() { return us_ticker_read() / 1000000.0f; }
+uint64_t clock_ms() { return us_ticker_read() / 1000; }
+uint64_t clock_us() { return us_ticker_read(); }
 
-int main() {
+//freetronicsLCDShield::freetronicsLCDShield (PinName rs, PinName e, PinName d0, PinName d1, PinName d2, PinName d3, PinName bl, PinName a0) 
+//freetronicsLCDShield lcd(D12, D11, D5, D4, D3, D2, D9, A0);
+freetronicsLCDShield lcd(D8, D9, D4, D5, D6, D7, D10, A0);
+
+DigitalOut led2(LED2);
+Serial pc(SERIAL_TX, SERIAL_RX);
+
+void lcdThread (void const *arg)
+{
+    char text[16];
     // turn on the back light (it's off by default)
     lcd.setBackLight(true);
-    
     // print the first line and wait 3 sec
-    lcd.printf("mbed application");
+    write_lcd(0,0,"schorschs");
     wait(3);
     
     // print the counter prefix; the number will be printed in the while loop
-    lcd.setCursorPosition(1, 0);
-    lcd.printf("counter");
-    
+    write_lcd(1, 0,"cnt:");
     int i=1;
     while (i++) {
-        lcd.setCursorPosition(1, 8);
-        lcd.printf("%d", i);
-        wait(0.001);
+        sprintf (text, "%4d", (i/100) % 10000);
+        write_lcd (1, 4, text);
+        Thread::wait(1);
+    }
+}
+/*
+ * thread safe positioning and writing
+ */
+Mutex lcdMtx;
+void write_lcd (uint8_t x, uint8_t y, char *txt)
+{
+    lcdMtx.lock(0);
+    lcd.setCursorPosition(x, y);
+    lcd.printf("%s", txt);
+    lcdMtx.unlock();
+}
+    
+/*
+ * LED blinkt zufaellig
+ */
+void ledThread (void const *arg)
+{
+    uint8_t ison = 0;
+    while (1) {
+        
+        Thread::wait(1);
+        if ((clock_ms() % 100) == 1)
+            ison ^= 1;
+        led2 = ison;
+        //pc.printf("LED%d\n",  cnt++);
     }
 }
+
+#define VOLTAGE_KEY_0 0.0f       //right
+#define VOLTAGE_KEY_1 0.125f     //up
+#define VOLTAGE_KEY_2 0.277f     //dn
+#define VOLTAGE_KEY_3 0.411f     //left
+#define VOLTAGE_KEY_4 0.578f     //select
+#define VOLTAGE_KEY_IDLE 0.760f
+static void keypressed_callback (key_t *k)
+{
+    if (NULL == k)
+        return;
+    pc.printf ("%s pressed\n", k->name);
+    write_lcd (1, 10, k->name);
+}
+static void keyreleased_callback (key_t *k)
+{
+    if (NULL == k)
+        return;
+    pc.printf ("%s released\n", k->name);
+    write_lcd (1, 10, "      ");
+}
+
+static void init_keys (void)
+{
+    keys_init(
+        A0, 20, (float [6]){
+        VOLTAGE_KEY_0,
+        VOLTAGE_KEY_1,
+        VOLTAGE_KEY_2,
+        VOLTAGE_KEY_3,
+        VOLTAGE_KEY_4,
+        VOLTAGE_KEY_IDLE
+        } 
+    );
+    register_key_callback (0, KEYCB_PRESS, keypressed_callback);
+    register_key_callback (1, KEYCB_PRESS, keypressed_callback);
+    register_key_callback (2, KEYCB_PRESS, keypressed_callback);
+    register_key_callback (3, KEYCB_PRESS, keypressed_callback);
+    register_key_callback (4, KEYCB_PRESS, keypressed_callback);
+    register_key_callback (0, KEYCB_RELEASE, keyreleased_callback);
+    register_key_callback (1, KEYCB_RELEASE, keyreleased_callback);
+    register_key_callback (2, KEYCB_RELEASE, keyreleased_callback);
+    register_key_callback (3, KEYCB_RELEASE, keyreleased_callback);
+    register_key_callback (4, KEYCB_RELEASE, keyreleased_callback);
+}
+int main() {
+    init_keys();
+
+    Thread lcdT(lcdThread);
+    Thread ledT(ledThread);
+
+    lcdT.join();
+    ledT.join();
+}
diff -r 392d0238a7dc -r c0b34f33643f mbed-rtos.lib
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/mbed-rtos.lib	Sun Aug 14 09:53:28 2016 +0000
@@ -0,0 +1,1 @@
+http://mbed.org/users/mbed_official/code/mbed-rtos/#6635230e06ba
diff -r 392d0238a7dc -r c0b34f33643f mbed.bld
--- a/mbed.bld	Fri Feb 13 09:48:28 2015 +0000
+++ b/mbed.bld	Sun Aug 14 09:53:28 2016 +0000
@@ -1,1 +1,1 @@
-http://mbed.org/users/mbed_official/code/mbed/builds/e188a91d3eaa
\ No newline at end of file
+http://mbed.org/users/mbed_official/code/mbed/builds/f9eeca106725
\ No newline at end of file