Yihui Xiong
/
multifunction_for_reset_button
For Arch or Xadow M0, use on-board button to provide multifunction.
main.cpp@0:0d08d0b3c7ed, 2015-01-13 (annotated)
- Committer:
- yihui
- Date:
- Tue Jan 13 12:46:12 2015 +0000
- Revision:
- 0:0d08d0b3c7ed
initial
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
yihui | 0:0d08d0b3c7ed | 1 | // For Arch and Xadow M0, use on-board button for normal input function rather than reset function |
yihui | 0:0d08d0b3c7ed | 2 | // single click - LED1 on |
yihui | 0:0d08d0b3c7ed | 3 | // double click - LED2 on |
yihui | 0:0d08d0b3c7ed | 4 | // long click - LED1 and LED2 on, and then the board will restart |
yihui | 0:0d08d0b3c7ed | 5 | // |
yihui | 0:0d08d0b3c7ed | 6 | // Note: To enter ISP mode, press the button and then power on (power-on reset) |
yihui | 0:0d08d0b3c7ed | 7 | |
yihui | 0:0d08d0b3c7ed | 8 | #include "mbed.h" |
yihui | 0:0d08d0b3c7ed | 9 | #include "pinmap.h" |
yihui | 0:0d08d0b3c7ed | 10 | |
yihui | 0:0d08d0b3c7ed | 11 | #define BUTTON_DOWN 0 |
yihui | 0:0d08d0b3c7ed | 12 | |
yihui | 0:0d08d0b3c7ed | 13 | InterruptIn button(P0_1); // on-board button of Arch or Xadow M0 |
yihui | 0:0d08d0b3c7ed | 14 | BusOut leds(LED1, LED2); |
yihui | 0:0d08d0b3c7ed | 15 | |
yihui | 0:0d08d0b3c7ed | 16 | uint8_t button_down_event = 0; |
yihui | 0:0d08d0b3c7ed | 17 | |
yihui | 0:0d08d0b3c7ed | 18 | void button_callback() |
yihui | 0:0d08d0b3c7ed | 19 | { |
yihui | 0:0d08d0b3c7ed | 20 | button_down_event = 1; // set button down event flag |
yihui | 0:0d08d0b3c7ed | 21 | } |
yihui | 0:0d08d0b3c7ed | 22 | |
yihui | 0:0d08d0b3c7ed | 23 | int button_detect() |
yihui | 0:0d08d0b3c7ed | 24 | { |
yihui | 0:0d08d0b3c7ed | 25 | int t = 0; |
yihui | 0:0d08d0b3c7ed | 26 | |
yihui | 0:0d08d0b3c7ed | 27 | while (1) { |
yihui | 0:0d08d0b3c7ed | 28 | if (button.read() != BUTTON_DOWN) { |
yihui | 0:0d08d0b3c7ed | 29 | if (t < 30) { |
yihui | 0:0d08d0b3c7ed | 30 | return 0; // for anti shake |
yihui | 0:0d08d0b3c7ed | 31 | } else { |
yihui | 0:0d08d0b3c7ed | 32 | break; |
yihui | 0:0d08d0b3c7ed | 33 | } |
yihui | 0:0d08d0b3c7ed | 34 | } |
yihui | 0:0d08d0b3c7ed | 35 | |
yihui | 0:0d08d0b3c7ed | 36 | if (t > 3000) { // More than 3 seconds |
yihui | 0:0d08d0b3c7ed | 37 | return -1; // long click |
yihui | 0:0d08d0b3c7ed | 38 | } |
yihui | 0:0d08d0b3c7ed | 39 | |
yihui | 0:0d08d0b3c7ed | 40 | t++; |
yihui | 0:0d08d0b3c7ed | 41 | wait_ms(1); |
yihui | 0:0d08d0b3c7ed | 42 | } |
yihui | 0:0d08d0b3c7ed | 43 | |
yihui | 0:0d08d0b3c7ed | 44 | if (t > 4000) { // More than 0.4 seconds |
yihui | 0:0d08d0b3c7ed | 45 | return 1; // single click |
yihui | 0:0d08d0b3c7ed | 46 | } |
yihui | 0:0d08d0b3c7ed | 47 | |
yihui | 0:0d08d0b3c7ed | 48 | while (true) { |
yihui | 0:0d08d0b3c7ed | 49 | if (button.read() == BUTTON_DOWN) { |
yihui | 0:0d08d0b3c7ed | 50 | wait_ms(1); |
yihui | 0:0d08d0b3c7ed | 51 | if (button.read() == BUTTON_DOWN) { |
yihui | 0:0d08d0b3c7ed | 52 | return 2; // double click |
yihui | 0:0d08d0b3c7ed | 53 | } |
yihui | 0:0d08d0b3c7ed | 54 | |
yihui | 0:0d08d0b3c7ed | 55 | t += 10; |
yihui | 0:0d08d0b3c7ed | 56 | } |
yihui | 0:0d08d0b3c7ed | 57 | |
yihui | 0:0d08d0b3c7ed | 58 | if (t > 400) { |
yihui | 0:0d08d0b3c7ed | 59 | return 1; // The interval of double click supposes to be less than 0.4 seconds, so it's single click |
yihui | 0:0d08d0b3c7ed | 60 | } |
yihui | 0:0d08d0b3c7ed | 61 | |
yihui | 0:0d08d0b3c7ed | 62 | t++; |
yihui | 0:0d08d0b3c7ed | 63 | wait_ms(1); |
yihui | 0:0d08d0b3c7ed | 64 | } |
yihui | 0:0d08d0b3c7ed | 65 | } |
yihui | 0:0d08d0b3c7ed | 66 | |
yihui | 0:0d08d0b3c7ed | 67 | |
yihui | 0:0d08d0b3c7ed | 68 | int main() { |
yihui | 0:0d08d0b3c7ed | 69 | // start |
yihui | 0:0d08d0b3c7ed | 70 | leds = 1; |
yihui | 0:0d08d0b3c7ed | 71 | wait(0.2); |
yihui | 0:0d08d0b3c7ed | 72 | leds = 3; |
yihui | 0:0d08d0b3c7ed | 73 | wait(0.2); |
yihui | 0:0d08d0b3c7ed | 74 | leds = 2; |
yihui | 0:0d08d0b3c7ed | 75 | wait(0.2); |
yihui | 0:0d08d0b3c7ed | 76 | leds = 0; |
yihui | 0:0d08d0b3c7ed | 77 | |
yihui | 0:0d08d0b3c7ed | 78 | pin_function(P0_0, 1); // use RESET pin as |
yihui | 0:0d08d0b3c7ed | 79 | button.fall(button_callback); |
yihui | 0:0d08d0b3c7ed | 80 | |
yihui | 0:0d08d0b3c7ed | 81 | while(1) { |
yihui | 0:0d08d0b3c7ed | 82 | if (button_down_event != 0) { |
yihui | 0:0d08d0b3c7ed | 83 | int clicks = button_detect(); |
yihui | 0:0d08d0b3c7ed | 84 | if (clicks == 1) { |
yihui | 0:0d08d0b3c7ed | 85 | leds = 0x01; |
yihui | 0:0d08d0b3c7ed | 86 | } else if (clicks == 2) { |
yihui | 0:0d08d0b3c7ed | 87 | leds = 0x02; |
yihui | 0:0d08d0b3c7ed | 88 | } else if (clicks == -1) { // long press |
yihui | 0:0d08d0b3c7ed | 89 | leds = 0x03; |
yihui | 0:0d08d0b3c7ed | 90 | while (button.read() == BUTTON_DOWN) { } // wait until button is released. note: remove this line to boot into ISP mode after reset |
yihui | 0:0d08d0b3c7ed | 91 | NVIC_SystemReset(); // reset |
yihui | 0:0d08d0b3c7ed | 92 | } |
yihui | 0:0d08d0b3c7ed | 93 | |
yihui | 0:0d08d0b3c7ed | 94 | wait(1); |
yihui | 0:0d08d0b3c7ed | 95 | leds = 0; |
yihui | 0:0d08d0b3c7ed | 96 | |
yihui | 0:0d08d0b3c7ed | 97 | button_down_event = 0; // clear button down event flag |
yihui | 0:0d08d0b3c7ed | 98 | } |
yihui | 0:0d08d0b3c7ed | 99 | |
yihui | 0:0d08d0b3c7ed | 100 | // sleep(); |
yihui | 0:0d08d0b3c7ed | 101 | // or do something else |
yihui | 0:0d08d0b3c7ed | 102 | } |
yihui | 0:0d08d0b3c7ed | 103 | } |