for helge just for testing
Dependencies: Freetronics_16x2_LCD mbed-rtos mbed
Fork of Freetronics_16x2_LCD by
Revision 4:c0b34f33643f, committed 2016-08-14
- Comitter:
- juergen0001
- Date:
- Sun Aug 14 09:53:28 2016 +0000
- Parent:
- 3:392d0238a7dc
- Commit message:
- test for helge
Changed in this revision
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