#ifdef CHLCD_ON_ESP #include #include #include #include #include #include #ifndef CHLCD_LED_PWM_TIMER #define CHLCD_LED_PWM_TIMER LEDC_TIMER_MAX #endif #ifndef CHLCD_LED_PWM_CHANNEL #define CHLCD_LED_PWM_CHANNEL LEDC_CHANNEL_MAX #endif #ifndef CHLCD_LED_PWM_FREQUENCY #define CHLCD_LED_PWM_FREQUENCY 20000 #endif chlcd_error_t chlcd_pin_set_output(chlcd_pin_t target) { gpio_config_t config[1] = {0}; config->pin_bit_mask = 1UL << target; config->mode = GPIO_MODE_OUTPUT; config->pull_up_en = GPIO_PULLUP_DISABLE; config->pull_down_en = GPIO_PULLDOWN_DISABLE; config->intr_type = GPIO_INTR_DISABLE if (gpio_config(config) == ESP_OK) { return CHLCD_SUCCESS; } return CHLCD_BAD_ARGUMENT; } chlcd_error_t chlcd_pin_write(chlcd_pin_t target, bool state) { if (gpio_set_level(target, state ? 1 : 0) == ESP_OK) { return CHLCD_SUCCESS; } return CHLCD_BAD_ARGUMENT; } chlcd_error_t chlcd_pin_set_pwm(chlcd_pin_t target) { ledc_timer_config_t timer_config[1] = {0}; timer_config->speed_mode = LEDC_LOW_SPEED_MODE; timer_config->duty_resolution = LEDC_TIMER_12_BIT; timer_config->clk_cfg = LEDC_AUTO_CLK; timer_config->freq_hz = CHLCD_LED_PWM_FREQUENCY; timer_config->timer_num = CHLCD_LED_PWM_CHANNEL; if (ledc_timer_config(timer_config) != ESP_OK) { return CHLCD_BAD_ARGUMENT; } ledc_channel_config_t channel_config[1] = {0}; channel_config->speed_mode = LEDC_LOW_SPEED_MODE; channel_config->channel = CHLCD_LED_PWM_CHANNEL; channel_config->timer_sel = CHLCD_LED_PWM_TIMER; channel_config->gpio_num = target; channel_config->duty = 0; channel_config->hpoint = 0; channel_config->sleep_mode = LEDC_SLEEP_MODE_KEEP_ALIVE; if (ledc_channel_config(channel_config) != ESP_OK) { return CHLCD_BAD_ARGUMENT; } return CHLCD_SUCCESS; } chlcd_error_t chlcd_pin_write_pwm( chlcd_pin_t target, uint16_t pwm ) { return CHLCD_SUCCESS; } chlcd_error_t chlcd_sleep_us(uint32_t time) { if (time < 1000) { ets_delay_us(time); return CHLCD_SUCCESS; } vTaskDelay(time / 1000 / portTICK_PERIOD_MS); return CHLCD_SUCCESS; } #endif