picoco/buzzer/gpio.c
2025-03-03 15:36:32 +01:00

125 lines
2.5 KiB
C

//#define PICO
#ifdef PICO
#include <pico/printf.h>
#include <pico/stdlib.h>
#include <hardware/pwm.h>
#define DEFAULT_WRAP_LEVEL 20
#else
#include <stdio.h>
#include <stdlib.h>
#include <stdint.h>
#include <unistd.h>
#define GPIO_OUT 1
#define GPIO_IN 0
static size_t GPIO_INPUT_MOCK_COUNTER = 0;
#endif
#include "gpio.h"
#include "log.h"
void _sleep_ms(size_t value) {
#ifdef PICO
sleep_ms(value);
#else
usleep(value * 1000);
#endif
}
void _sleep_us(size_t value) {
#ifdef PICO
sleep_us(value);
#else
usleep(value);
#endif
}
void gpio_set_level(gpio *g, uint16_t level) {
if (g->has_pwm && g->direction == GPIO_OUT) {
g->level = level;
g->state = level > 0;
#ifdef PICO
pwm_set_gpio_level(g->pin, level);
#else
debug("<GPIO.set_level (pin=%ld) (level=%d)>", g->pin, level);
#endif
}
}
void gpio_set_state(gpio *g, bool state) {
if (!g->has_pwm && g->direction == GPIO_OUT) {
#ifdef PICO
gpio_put(g->pin, state);
#else
// must be trace instead
// debug("<GPIO.set_state (pin=%ld) (level=%d)>", g->pin, state);
#endif
}
}
bool gpio_get_input(gpio* g) {
if (g->direction == GPIO_IN) {
#ifdef PICO
g->state = gpio_get(g->pin);
#else
int value = rand() % (10 + 1);
if (value == 0) {
g->state = false;
return false;
}
g->state = GPIO_INPUT_MOCK_COUNTER++ % value == 0;
debug("gpio get input (state: %d)", g->state);
#endif
return g->state;
}
return false;
}
void blink_failed(size_t pin, uint32_t delay_ms) {
#ifdef PICO
for (;;) {
gpio_put(pin, false);
_sleep_ms(delay_ms);
gpio_put(pin, true);
_sleep_ms(delay_ms);
}
#else
for(;;) {
debug("fatal error occurred, please restart the application");
_sleep_ms(delay_ms);
}
#endif
}
void blink_passed(size_t pin, uint32_t delay_ms, char* msg) {
#ifdef PICO
gpio_put(pin, true);
_sleep_ms(delay_ms);
gpio_put(pin, false);
_sleep_ms(delay_ms);
#else
debug(msg);
#endif
}
void init_gpio(void) {
#ifdef PICO
stdio_init_all();
for (size_t i = 0; i < NB_GPIO; i++) {
gpio_init(GPIOS[i]->pin);
gpio_set_dir(GPIOS[i]->pin, GPIOS[i]->direction);
if (GPIOS[i]->has_pwm) {
uint slice_num = pwm_gpio_to_slice_num(GPIOS[i]->pin);
pwm_set_enabled(slice_num, true);
pwm_set_wrap(slice_num, DEFAULT_WRAP_LEVEL);
}
}
blink_passed(GPIOS[0]->pin, 200, "gpios init with success");
#endif
}