PGO6_VoteController (Astrid Vanneste)

Dependencies:   MQTT

Fork of PGO6_VoteController_template by Jens de hoog

debounce_button.cpp

Committer:
AstridVanneste
Date:
2018-10-08
Revision:
3:376ac6744373
Parent:
2:5b7d055dbc91
Child:
4:08da93eb6014

File content as of revision 3:376ac6744373:

#include "debounce_button.h"

volatile bool button1_pressed;           // Used in the main loop
volatile bool button1_enabled;           // Used for debouncing
volatile int multiclick_state;           // Counts how many clicks occured in the time slot, used in main loop
volatile bool button1_busy;              // Informs the mainloop that the user is clicking the button => busy multiclick
volatile int internal_click_count;       // Counts how many clicks occured in the time slot

/**
    Some tips and tricks:
    -   To use the built-in LED:
            DigitalOut led1(LED1);
            ...
            led1 = 1;
    -   To delay the call of a function:
            Timeout someTimeout;
            ...
            someTimeout.attach(callback(&someFunction), 0.5) with 0.5 as 500 milliseconds
    -   The variables that are used in interrupt callbacks have to be volatile, 
        because these variables can change at any time. Therefore, the compiler is not 
        going to make optimisations.
*/

/**
    TODO
    ----
    This function:
        -   stores the amount of clicks in a variable which is read by the main loop.
        -   resets the click counter which is used inside this file.
        -   lowers a flag which tells the main loop that the user stopped pressing the button
            such that it can proceed its program.
        -   turns the built-in LED off. Therefore, the user gets informed that the program stopped counting the clicks.
*/
void button1_multiclick_reset_cb(void) 
{
    button1_busy = false;
    multiclick_state = internal_click_count;
    internal_click_count = 0;
}

/**
    TODO
    ----
    This function enables the button again, such that unwanted clicks of the bouncing button get ignored.
*/
void button1_enabled_cb(void)
{
    
}

/**
    TODO
    ----
    This function:
        -   turns the built-in LED on, so the user gets informed that the program has started with counting clicks
        -   disables the button such that the debouncer is active
        -   enables the button again after a certain amount of time 
            (use interrupts with "button1_enabled_cb()" as callback.
        -   counts the amount of clicks within a period of 1 second
        -   informs the main loop that the button has been pressed
        -   informs the main loop that the user is clicking the button.
            Therefore, this main loop cannot continue its procedure until the clicks within 1 second have been counted.
*/
void button1_onpressed_cb(void)
{
    DigitalOut led1(LED1);
    led1 = 1;
    
    if(button1_enabled)
    {
        button1_enabled = false;        // button is not enabled => debouncing
        
        Timeout debounce_time;
        debounce_time.attach(callback(button1_enabled_cb), 0.5);
        
        internal_click_count++;
        
        if(!button1_busy)
        {
            button1_pressed = true;
            button1_busy = true;
            
            Timeout multiclick_time;
            multiclick_time.attach(callback(button1_multiclick_reset_cb), 1);
        }
    }
}

void init_debouncer()
{
    button1_pressed = false;
    button1_enabled = true;
    button1_busy = false;
    multiclick_state = 0;
    internal_click_count = 0;
    
}