implement button press/release with double check using coroutine

Dependencies:   mbed-dev

Committer:
mintisan
Date:
Sun Aug 28 12:50:45 2016 +0000
Revision:
0:54509830df20
implement button press/release with double check using coroutine

Who changed what in which revision?

UserRevisionLine numberNew contents of line
mintisan 0:54509830df20 1 #include "mbed.h"
mintisan 0:54509830df20 2 #include "coroutine.h"
mintisan 0:54509830df20 3 //------------------------------------
mintisan 0:54509830df20 4 // USER_KEY-PB_3 / USER_BUTTON-PC_13
mintisan 0:54509830df20 5 //------------------------------------
mintisan 0:54509830df20 6 DigitalIn mybutton(PB_3);
mintisan 0:54509830df20 7 //------------------------------------
mintisan 0:54509830df20 8 // LED1-PA5
mintisan 0:54509830df20 9 //------------------------------------
mintisan 0:54509830df20 10 DigitalOut myled(PA_5);
mintisan 0:54509830df20 11 //------------------------------------
mintisan 0:54509830df20 12 // Hyperterminal configuration
mintisan 0:54509830df20 13 // 9600 bauds, 8-bit data, no parity
mintisan 0:54509830df20 14 // SERIAL_TX-PA2, SERIAL_RX-PA3
mintisan 0:54509830df20 15 //------------------------------------
mintisan 0:54509830df20 16 Serial pc(PA_2, PA_3);
mintisan 0:54509830df20 17
mintisan 0:54509830df20 18 Ticker jitter;
mintisan 0:54509830df20 19
mintisan 0:54509830df20 20 #define entry() pc.printf("func:%s\n", __FUNCTION__)
mintisan 0:54509830df20 21
mintisan 0:54509830df20 22 #define error() pc.printf("Error! func:%s, line: %d\n", __FUNCTION__, __LINE__)
mintisan 0:54509830df20 23
mintisan 0:54509830df20 24 enum{OFF=0,ON=1};
mintisan 0:54509830df20 25 enum{PRESS= 0, RELEASE = 1, UNKNOWN};
mintisan 0:54509830df20 26 #define PRESS_JITTER_TIME 0.01 // 10ms
mintisan 0:54509830df20 27 #define RELEASE_JITTER_TIME 0.02 // 20ms
mintisan 0:54509830df20 28 uint8_t cur_flag_status = UNKNOWN;
mintisan 0:54509830df20 29 uint8_t pre_flag_status = UNKNOWN;
mintisan 0:54509830df20 30
mintisan 0:54509830df20 31 volatile uint16_t cr_time_down;
mintisan 0:54509830df20 32 volatile uint16_t cr_time_up;
mintisan 0:54509830df20 33
mintisan 0:54509830df20 34 void isr_ticker() {
mintisan 0:54509830df20 35 cr_time_down++;
mintisan 0:54509830df20 36 cr_time_up++;
mintisan 0:54509830df20 37 }
mintisan 0:54509830df20 38
mintisan 0:54509830df20 39
mintisan 0:54509830df20 40 void update_key_status(void)
mintisan 0:54509830df20 41 {
mintisan 0:54509830df20 42 pre_flag_status = cur_flag_status;
mintisan 0:54509830df20 43 cur_flag_status = mybutton.read();
mintisan 0:54509830df20 44 }
mintisan 0:54509830df20 45
mintisan 0:54509830df20 46 void key_down_status(void)
mintisan 0:54509830df20 47 {
mintisan 0:54509830df20 48 update_key_status();
mintisan 0:54509830df20 49 if(cur_flag_status == PRESS){
mintisan 0:54509830df20 50 if(myled.read()!=ON){
mintisan 0:54509830df20 51 if(pre_flag_status == PRESS){
mintisan 0:54509830df20 52 myled = ON;
mintisan 0:54509830df20 53 pc.printf("Pressed\n");
mintisan 0:54509830df20 54 }
mintisan 0:54509830df20 55 }
mintisan 0:54509830df20 56 }
mintisan 0:54509830df20 57 }
mintisan 0:54509830df20 58
mintisan 0:54509830df20 59 void key_up_status(void)
mintisan 0:54509830df20 60 {
mintisan 0:54509830df20 61 update_key_status();
mintisan 0:54509830df20 62 if(cur_flag_status == RELEASE){
mintisan 0:54509830df20 63 if(myled.read()!=OFF){
mintisan 0:54509830df20 64 if(pre_flag_status == RELEASE){
mintisan 0:54509830df20 65 myled = OFF;
mintisan 0:54509830df20 66 pc.printf("Released\n");
mintisan 0:54509830df20 67 }
mintisan 0:54509830df20 68 }
mintisan 0:54509830df20 69 }
mintisan 0:54509830df20 70 }
mintisan 0:54509830df20 71
mintisan 0:54509830df20 72 void user_thread_down(void)
mintisan 0:54509830df20 73 {
mintisan 0:54509830df20 74 cr_start();
mintisan 0:54509830df20 75
mintisan 0:54509830df20 76 // inital once each loop
mintisan 0:54509830df20 77 cr_time_down = 0;
mintisan 0:54509830df20 78 // waiting for condition is satisfied, or will be yield
mintisan 0:54509830df20 79 cr_yield(cr_time_down != 1);
mintisan 0:54509830df20 80 key_down_status();
mintisan 0:54509830df20 81
mintisan 0:54509830df20 82 cr_end();
mintisan 0:54509830df20 83 }
mintisan 0:54509830df20 84
mintisan 0:54509830df20 85 void user_thread_up(void)
mintisan 0:54509830df20 86 {
mintisan 0:54509830df20 87 cr_start();
mintisan 0:54509830df20 88
mintisan 0:54509830df20 89 // inital once each loop
mintisan 0:54509830df20 90 cr_time_up = 0;
mintisan 0:54509830df20 91 // waiting for condition is satisfied, or will be yield
mintisan 0:54509830df20 92 cr_yield(cr_time_up != 2);
mintisan 0:54509830df20 93 key_up_status();
mintisan 0:54509830df20 94
mintisan 0:54509830df20 95 cr_end();
mintisan 0:54509830df20 96 }
mintisan 0:54509830df20 97
mintisan 0:54509830df20 98 /*
mintisan 0:54509830df20 99 * one coroutine for down check;
mintisan 0:54509830df20 100 * another coroutine for up check.
mintisan 0:54509830df20 101 */
mintisan 0:54509830df20 102 int main(void)
mintisan 0:54509830df20 103 {
mintisan 0:54509830df20 104 myled = OFF;
mintisan 0:54509830df20 105 jitter.attach(&isr_ticker, PRESS_JITTER_TIME);
mintisan 0:54509830df20 106 while(1) {
mintisan 0:54509830df20 107 user_thread_down();
mintisan 0:54509830df20 108 user_thread_up();
mintisan 0:54509830df20 109 // extend more task here
mintisan 0:54509830df20 110 }
mintisan 0:54509830df20 111 }