snickerdoodle Platform Controller
firmware for STM32F0 platform controller
Button Functions

Functions

enum sd_button_err sd_button_init (struct sd_button *butt, GPIO_TypeDef *port, uint16_t pin, uint32_t up_to, void(*up_cb)(void), uint32_t down_to, void(*down_cb)(void))
 Initialize Button Port/Pin and State Machine. More...
 
enum sd_button_err sd_button_run (struct sd_button *butt)
 Run Button State Machine. More...
 

Detailed Description

Function Documentation

◆ sd_button_init()

enum sd_button_err sd_button_init ( struct sd_button butt,
GPIO_TypeDef *  port,
uint16_t  pin,
uint32_t  up_to,
void(*)(void)  up_cb,
uint32_t  down_to,
void(*)(void)  down_cb 
)

#include <Src/sd_button.c>

Initialize Button Port/Pin and State Machine.

Parameters
buttButton to initialize
portGPIO port of button
pinGPIO pin of button
up_toButton up debounce timeout
up_cbButton up callback function
down_toButton down debounce timeout
down_cbButton down callback function
Return values
SD_BUTTON_SUCCESSon success, error code otherwise
98 {
99  butt->port = port;
100  butt->pin = pin;
101  butt->state = SD_BUTTON_IDLE;
102 
103  butt->up_to = up_to;
104  butt->up_cb = up_cb;
105 
106  butt->down_to = down_to;
107  butt->down_cb = down_cb;
108 
109  return SD_BUTTON_SUCCESS;
110 }
uint16_t pin
Definition: sd_button.h:96
Definition: sd_button.h:84
Definition: sd_button.h:75
GPIO_TypeDef * port
Definition: sd_button.h:95
uint32_t up_to
Definition: sd_button.h:99
uint32_t down_to
Definition: sd_button.h:100
void(* down_cb)(void)
Definition: sd_button.h:101
void(* up_cb)(void)
Definition: sd_button.h:102
enum sd_button_state state
Definition: sd_button.h:97

◆ sd_button_run()

enum sd_button_err sd_button_run ( struct sd_button butt)

#include <Src/sd_button.c>

Run Button State Machine.

Parameters
buttButton to run state machine
Return values
SD_BUTTON_SUCCESSon success, error code otherwise
120 {
121  switch (butt->state) {
122  case SD_BUTTON_IDLE:
123  if (butt->port->IDR & butt->pin) {
124  /* The button is not pressed */
125  } else {
126  /* Record the timer value before transitioning */
127  butt->tick = HAL_GetTick();
128  butt->state = SD_BUTTON_DOWN_WAIT;
129  }
130  break;
131 
132  case SD_BUTTON_DOWN_WAIT:
133  if (butt->port->IDR & butt->pin) {
134  /* Debounce was unsuccessful. Return to idle */
135  butt->state = SD_BUTTON_IDLE;
136  } else {
137  /* Check if the timer has expired */
138  if (HAL_GetTick() > (butt->tick + butt->down_to)) {
139  butt->down_cb();
140  butt->state = SD_BUTTON_DOWN_DEB;
141  }
142  }
143 
144  break;
145 
146  case SD_BUTTON_DOWN_DEB:
147  if (butt->port->IDR & butt->pin) {
148  /* The button has been released */
149  butt->tick = HAL_GetTick();
150  butt->state = SD_BUTTON_UP_WAIT;
151  } else {
152  /* The button is still pressed */
153  }
154  break;
155 
156  case SD_BUTTON_UP_WAIT:
157  if (butt->port->IDR & butt->pin) {
158  /* The button detected as released */
159  if (HAL_GetTick() > (butt->tick + butt->up_to)) {
160  /* Button debounce successful */
161  butt->up_cb();
162  butt->state = SD_BUTTON_IDLE;
163  }
164  } else {
165  /* The button was detected as pressed */
166  butt->state = SD_BUTTON_DOWN_DEB;
167  }
168  break;
169  }
170  return SD_BUTTON_SUCCESS;
171 }
uint16_t pin
Definition: sd_button.h:96
Definition: sd_button.h:86
Definition: sd_button.h:84
Definition: sd_button.h:75
GPIO_TypeDef * port
Definition: sd_button.h:95
Definition: sd_button.h:85
uint32_t up_to
Definition: sd_button.h:99
uint32_t down_to
Definition: sd_button.h:100
Definition: sd_button.h:87
void(* down_cb)(void)
Definition: sd_button.h:101
void(* up_cb)(void)
Definition: sd_button.h:102
uint32_t tick
Definition: sd_button.h:98
enum sd_button_state state
Definition: sd_button.h:97