Added modules for buttons and buzzer
This commit is contained in:
parent
75d3582ac7
commit
3e9526a916
|
@ -13,6 +13,10 @@ add_executable(${CMAKE_PROJECT_NAME}
|
||||||
src/main.c
|
src/main.c
|
||||||
src/sseg.c
|
src/sseg.c
|
||||||
src/sseg.h
|
src/sseg.h
|
||||||
|
src/buzzer.c
|
||||||
|
src/buzzer.h
|
||||||
|
src/buttons.c
|
||||||
|
src/buttons.h
|
||||||
src/pinout.h
|
src/pinout.h
|
||||||
src/sseg.pio
|
src/sseg.pio
|
||||||
)
|
)
|
||||||
|
|
64
src/buttons.c
Normal file
64
src/buttons.c
Normal file
|
@ -0,0 +1,64 @@
|
||||||
|
#include <string.h>
|
||||||
|
|
||||||
|
#include "hardware/gpio.h"
|
||||||
|
|
||||||
|
#include "pinout.h"
|
||||||
|
|
||||||
|
#include "buttons.h"
|
||||||
|
|
||||||
|
static const uint8_t m_pins[NUM_BUTTONS] = {
|
||||||
|
BTN_ON_PIN,
|
||||||
|
BTN_OFF_PIN
|
||||||
|
};
|
||||||
|
|
||||||
|
static uint8_t m_events[NUM_BUTTONS];
|
||||||
|
static uint32_t m_last_change_time[NUM_BUTTONS];
|
||||||
|
static uint32_t m_states;
|
||||||
|
|
||||||
|
void buttons_init(void)
|
||||||
|
{
|
||||||
|
for(int i = 0; i < NUM_BUTTONS; i++) {
|
||||||
|
gpio_init(m_pins[i]);
|
||||||
|
gpio_set_dir(m_pins[i], false); // true = output
|
||||||
|
gpio_set_pulls(m_pins[i], true, false); // enable pullup
|
||||||
|
}
|
||||||
|
|
||||||
|
memset(m_events, 0, sizeof(m_events));
|
||||||
|
memset(m_last_change_time, 0, sizeof(m_last_change_time));
|
||||||
|
|
||||||
|
m_states = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
void buttons_update_state(uint32_t time_ms)
|
||||||
|
{
|
||||||
|
for(int i = 0; i < NUM_BUTTONS; i++) {
|
||||||
|
bool is_pressed = gpio_get(m_pins[i]);
|
||||||
|
bool was_pressed = (m_states >> i) != 0;
|
||||||
|
|
||||||
|
m_events[i] = 0;
|
||||||
|
if(is_pressed && !was_pressed) {
|
||||||
|
m_events[i] |= BTN_EVENT_PRESSED;
|
||||||
|
m_states |= (1 << i);
|
||||||
|
m_last_change_time[i] = time_ms;
|
||||||
|
} else if(!is_pressed && was_pressed) {
|
||||||
|
m_events[i] |= BTN_EVENT_RELEASED;
|
||||||
|
m_states &= ~(1 << i);
|
||||||
|
m_last_change_time[i] = time_ms;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
uint8_t buttons_get_events(button_id_t button)
|
||||||
|
{
|
||||||
|
return m_events[button];
|
||||||
|
}
|
||||||
|
|
||||||
|
bool buttons_is_pressed(button_id_t button)
|
||||||
|
{
|
||||||
|
return (m_states & (1 << button)) != 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
uint32_t buttons_get_last_change_time(button_id_t button)
|
||||||
|
{
|
||||||
|
return m_last_change_time[button];
|
||||||
|
}
|
24
src/buttons.h
Normal file
24
src/buttons.h
Normal file
|
@ -0,0 +1,24 @@
|
||||||
|
#ifndef BUTTONS_H
|
||||||
|
#define BUTTONS_H
|
||||||
|
|
||||||
|
#include <stdint.h>
|
||||||
|
#include <stdbool.h>
|
||||||
|
|
||||||
|
#define BTN_EVENT_PRESSED (1 << 0)
|
||||||
|
#define BTN_EVENT_RELEASED (1 << 1)
|
||||||
|
|
||||||
|
typedef enum {
|
||||||
|
BTN_ON,
|
||||||
|
BTN_OFF,
|
||||||
|
|
||||||
|
NUM_BUTTONS
|
||||||
|
} button_id_t;
|
||||||
|
|
||||||
|
void buttons_init(void);
|
||||||
|
void buttons_update_state(uint32_t time_ms);
|
||||||
|
|
||||||
|
uint8_t buttons_get_events(button_id_t button);
|
||||||
|
bool buttons_is_pressed(button_id_t button);
|
||||||
|
uint32_t buttons_get_last_change_time(button_id_t button);
|
||||||
|
|
||||||
|
#endif // BUTTONS_H
|
41
src/buzzer.c
Normal file
41
src/buzzer.c
Normal file
|
@ -0,0 +1,41 @@
|
||||||
|
#include "hardware/gpio.h"
|
||||||
|
#include "hardware/pwm.h"
|
||||||
|
|
||||||
|
#include <stdint.h>
|
||||||
|
#include <stdbool.h>
|
||||||
|
|
||||||
|
#include "pinout.h"
|
||||||
|
|
||||||
|
#include "buzzer.h"
|
||||||
|
|
||||||
|
#define FREQ_BASE 24414063 // round(125 MHz [CPU frequency] * 100 [scaling] / 512 [PWM steps])
|
||||||
|
|
||||||
|
uint m_slice_num;
|
||||||
|
|
||||||
|
void buzzer_init(void)
|
||||||
|
{
|
||||||
|
gpio_init(BUZZER_PIN);
|
||||||
|
gpio_put(BUZZER_PIN, false);
|
||||||
|
gpio_set_dir(BUZZER_PIN, true);
|
||||||
|
|
||||||
|
m_slice_num = pwm_gpio_to_slice_num(BUZZER_PIN);
|
||||||
|
|
||||||
|
pwm_set_clkdiv_int_frac(m_slice_num, 244, (14 << 4) / 100); // 125 MHz / 244.14 / 512 = 1 kHz
|
||||||
|
gpio_set_function(BUZZER_PIN, GPIO_FUNC_PWM);
|
||||||
|
pwm_set_wrap(m_slice_num, 512);
|
||||||
|
pwm_set_chan_level(m_slice_num, PWM_CHAN_B, 1 * 512 / 100);
|
||||||
|
}
|
||||||
|
|
||||||
|
void buzzer_on(uint16_t freq_hz)
|
||||||
|
{
|
||||||
|
uint32_t divider_x100 = FREQ_BASE / freq_hz; // = 100 * 125e6 / 512 / freq_hz
|
||||||
|
|
||||||
|
pwm_set_clkdiv_int_frac(m_slice_num, divider_x100 / 100, divider_x100 % 100);
|
||||||
|
pwm_set_enabled(m_slice_num, true);
|
||||||
|
}
|
||||||
|
|
||||||
|
void buzzer_off(void)
|
||||||
|
{
|
||||||
|
pwm_set_enabled(m_slice_num, false);
|
||||||
|
gpio_set_function(BUZZER_PIN, GPIO_FUNC_NULL);
|
||||||
|
}
|
11
src/buzzer.h
Normal file
11
src/buzzer.h
Normal file
|
@ -0,0 +1,11 @@
|
||||||
|
#ifndef BUZZER_H
|
||||||
|
#define BUZZER_H
|
||||||
|
|
||||||
|
#include <stdint.h>
|
||||||
|
|
||||||
|
void buzzer_init(void);
|
||||||
|
|
||||||
|
void buzzer_on(uint16_t freq_hz);
|
||||||
|
void buzzer_off(void);
|
||||||
|
|
||||||
|
#endif // BUZZER_H
|
Loading…
Reference in a new issue