125 lines
2.5 KiB
C
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
|
|
}
|