diff --git a/src/buttons.c b/src/buttons.c new file mode 100644 --- /dev/null +++ b/src/buttons.c @@ -0,0 +1,76 @@ +/* + * buttons.c + * + * Created on: Oct 22, 2016 + * Author: Nicholas Orlando + */ + +#include "stm32f3xx_hal.h" +#include "stm32f3xx.h" +#include "gpio.h" +#include "ssd1306.h" +#include "buttons.h" +#include + + +uint32_t last_button_debounce_time = 0; // the system time at which the button values were last checked +uint32_t debounce_resolution = 5; // period in which to check pin state in milliseconds +float filter_fraction = 0.2; // a number between 0 and 1, which adjusts the heaviness of the filter. + // 0 = never changes and 1 = no filter at all. +uint8_t l_thresh = 20; //lower threshold for when then button is considered pressed vs not pressed. +uint8_t u_thresh = 80; //upper threshold for when then button is considered pressed vs not pressed. + +uint8_t temp_counter = 0; // temporary counter for testing purposes + +float sw_btn_avg = 0; // some sort of running average +uint8_t sw_btn_state = NOT_PRESSED; // the state of the pin after filtering +uint8_t sw_btn_old_state = NOT_PRESSED; // the state of the pin after filtering + +void freaking_debounce(void) +{ + if(HAL_GetTick() - last_button_debounce_time > debounce_resolution) + { + char buffer[256]; // needed for writing stuff to screen + + //averaging to filter button presses + if(HAL_GPIO_ReadPin(SW_BTN) == GPIO_PIN_RESET) + { + sw_btn_avg = sw_btn_avg + filter_fraction * (100 - sw_btn_avg); + } + else + { + sw_btn_avg = sw_btn_avg + filter_fraction * (0 - sw_btn_avg); + } + + // check to see if the btn average value has crossed a threshold + if(sw_btn_avg < l_thresh) + { + sw_btn_state = NOT_PRESSED; +// snprintf(buffer, 256, "NOT_PRESSED"); +// ssd1306_drawstring(buffer, 1, 0); + } + if(sw_btn_avg > u_thresh) + { + sw_btn_state = PRESSED; +// snprintf(buffer, 256, "PRESSED "); +// ssd1306_drawstring(buffer, 1, 0); + } + + // do something when state has changed + if((sw_btn_state == PRESSED) && (sw_btn_old_state == NOT_PRESSED)) + { + temp_counter++; + snprintf(buffer, 256, "%i", temp_counter); + ssd1306_drawstring(buffer, 1, 0); + } + + +// snprintf(buffer, 256, "sw-btn-avg: %.1f", sw_btn_avg); +// ssd1306_drawstring(buffer, 2, 0); + + // save previous button states + sw_btn_old_state = sw_btn_state; + + last_button_debounce_time = HAL_GetTick(); + } +}