Minh Nguyen / Pushbutton
Committer:
khaiminhvn
Date:
Thu Mar 11 23:22:16 2021 +0000
Revision:
2:6ade0fbab4e1
Parent:
1:e47e80a32fb5
Child:
3:03c78d8b7dfc
Added additional modes

Who changed what in which revision?

UserRevisionLine numberNew contents of line
khaiminhvn 0:4482075b8b95 1 //INCLUDES
khaiminhvn 0:4482075b8b95 2 #include "Pushbutton.h"
khaiminhvn 0:4482075b8b95 3
khaiminhvn 0:4482075b8b95 4 #define timer_read_s(x) chrono::duration_cast<chrono::seconds>((x).elapsed_time()).count()
khaiminhvn 0:4482075b8b95 5
khaiminhvn 0:4482075b8b95 6 DigitalIn Pushbutton::lastPressed(PIN_ACCEL_PANEL);
khaiminhvn 0:4482075b8b95 7
khaiminhvn 0:4482075b8b95 8 //Constructor
khaiminhvn 0:4482075b8b95 9 Pushbutton::Pushbutton(PinName bt) : button(bt),buttonInt(bt){
khaiminhvn 0:4482075b8b95 10 busy = 0;
khaiminhvn 0:4482075b8b95 11 }
khaiminhvn 0:4482075b8b95 12 Pushbutton::Pushbutton(PinName bt, int* state) : buttonInt(bt),button(bt){
khaiminhvn 0:4482075b8b95 13 busy = 0;
khaiminhvn 0:4482075b8b95 14 mode = state;
khaiminhvn 0:4482075b8b95 15 if(INPUT_LOGIC == 0)
khaiminhvn 0:4482075b8b95 16 {
khaiminhvn 0:4482075b8b95 17 buttonInt.fall(callback(this,&Pushbutton::updateMode));
khaiminhvn 0:4482075b8b95 18 }
khaiminhvn 0:4482075b8b95 19 else
khaiminhvn 0:4482075b8b95 20 {
khaiminhvn 0:4482075b8b95 21 buttonInt.rise(callback(this,&Pushbutton::updateMode));
khaiminhvn 0:4482075b8b95 22 }
khaiminhvn 0:4482075b8b95 23 }
khaiminhvn 0:4482075b8b95 24
khaiminhvn 0:4482075b8b95 25 //Methods
khaiminhvn 0:4482075b8b95 26 //read()
khaiminhvn 0:4482075b8b95 27 int Pushbutton::read(){
khaiminhvn 0:4482075b8b95 28 if(Pushbutton::lastPressed == INPUT_LOGIC && Pushbutton::lastPressed != button)
khaiminhvn 0:4482075b8b95 29 return 0;
khaiminhvn 0:4482075b8b95 30 else if(Pushbutton::lastPressed == INPUT_LOGIC && Pushbutton::lastPressed == button)
khaiminhvn 0:4482075b8b95 31 return 1;
khaiminhvn 0:4482075b8b95 32
khaiminhvn 0:4482075b8b95 33 wait_us(DEBOUNCE_TIME);
khaiminhvn 0:4482075b8b95 34
khaiminhvn 0:4482075b8b95 35 Pushbutton::lastPressed = (button == INPUT_LOGIC) ? button : Pushbutton::lastPressed;
khaiminhvn 0:4482075b8b95 36 busy == (button == INPUT_LOGIC) ? 1 : 0;
khaiminhvn 0:4482075b8b95 37 return (button == INPUT_LOGIC) ? 1 : 0;
khaiminhvn 0:4482075b8b95 38 }
khaiminhvn 0:4482075b8b95 39
khaiminhvn 0:4482075b8b95 40 //updateMode()
khaiminhvn 0:4482075b8b95 41 void Pushbutton::updateMode()
khaiminhvn 0:4482075b8b95 42 {
khaiminhvn 0:4482075b8b95 43 Timer t;
khaiminhvn 0:4482075b8b95 44 t.start();
khaiminhvn 0:4482075b8b95 45
khaiminhvn 0:4482075b8b95 46 wait_us(DEBOUNCE_TIME);
khaiminhvn 0:4482075b8b95 47 if(read()) //If received input
khaiminhvn 0:4482075b8b95 48 {
khaiminhvn 0:4482075b8b95 49 while((int)timer_read_s(t) <= TIME_WSETTING) //check if button is held to the threshold
khaiminhvn 0:4482075b8b95 50 {
khaiminhvn 0:4482075b8b95 51 if(buttonInt.read() != INPUT_LOGIC) //check if button is released
khaiminhvn 0:4482075b8b95 52 {
khaiminhvn 0:4482075b8b95 53 if(*mode == OP_NORMAL || *mode == OP_WIND)
khaiminhvn 0:4482075b8b95 54 {
khaiminhvn 0:4482075b8b95 55 *mode = OP_MANUAL1;
khaiminhvn 0:4482075b8b95 56 return;
khaiminhvn 0:4482075b8b95 57 }
khaiminhvn 0:4482075b8b95 58 else if(*mode == OP_MANUAL1)
khaiminhvn 0:4482075b8b95 59 {
khaiminhvn 0:4482075b8b95 60 *mode = OP_MANUAL2;
khaiminhvn 0:4482075b8b95 61 return;
khaiminhvn 0:4482075b8b95 62 }
khaiminhvn 2:6ade0fbab4e1 63 else if(*mode == OP_MANUAL2 || *mode == OP_WSETTING ||| *mode == OP_PLACEMENT)
khaiminhvn 0:4482075b8b95 64 {
khaiminhvn 0:4482075b8b95 65 *mode = OP_NORMAL;
khaiminhvn 0:4482075b8b95 66 return;
khaiminhvn 0:4482075b8b95 67 }
khaiminhvn 2:6ade0fbab4e1 68 else{
khaiminhvn 2:6ade0fbab4e1 69 *mode = OP_PLACEMENT;
khaiminhvn 2:6ade0fbab4e1 70 return;
khaiminhvn 2:6ade0fbab4e1 71 }
khaiminhvn 0:4482075b8b95 72 t.stop();
khaiminhvn 0:4482075b8b95 73 return;
khaiminhvn 0:4482075b8b95 74 }
khaiminhvn 0:4482075b8b95 75 }
khaiminhvn 0:4482075b8b95 76 *mode = OP_WSETTING;
khaiminhvn 0:4482075b8b95 77 return;
khaiminhvn 0:4482075b8b95 78 }
khaiminhvn 0:4482075b8b95 79 }