//#define PICO #ifdef PICO #include #include #include #define DEFAULT_WRAP_LEVEL 20 #else #include #include #include #include #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("", 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("", 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 }