Initial project setup
This commit is contained in:
106
main/dcdc_controller.c
Normal file
106
main/dcdc_controller.c
Normal file
@@ -0,0 +1,106 @@
|
||||
#include "dcdc_controller.h"
|
||||
|
||||
#include "driver/gpio.h"
|
||||
#include "esp_log.h"
|
||||
|
||||
static const char *TAG = "dcdc";
|
||||
|
||||
static const gpio_num_t s_dcdc_gpio_map[DCDC_CHANNEL_COUNT] = {
|
||||
GPIO_NUM_2,
|
||||
GPIO_NUM_4,
|
||||
GPIO_NUM_5,
|
||||
GPIO_NUM_18,
|
||||
GPIO_NUM_19,
|
||||
};
|
||||
|
||||
static bool s_initialized;
|
||||
static bool s_channel_state[DCDC_CHANNEL_COUNT];
|
||||
|
||||
static bool dcdc_is_channel_valid(dcdc_channel_t channel)
|
||||
{
|
||||
return channel >= DCDC_CHANNEL_0 && channel < DCDC_CHANNEL_COUNT;
|
||||
}
|
||||
|
||||
esp_err_t dcdc_init(void)
|
||||
{
|
||||
if (s_initialized) {
|
||||
return ESP_OK;
|
||||
}
|
||||
|
||||
gpio_config_t cfg = {
|
||||
.intr_type = GPIO_INTR_DISABLE,
|
||||
.mode = GPIO_MODE_OUTPUT,
|
||||
.pull_down_en = GPIO_PULLDOWN_DISABLE,
|
||||
.pull_up_en = GPIO_PULLUP_DISABLE,
|
||||
.pin_bit_mask = 0,
|
||||
};
|
||||
|
||||
for (int i = 0; i < DCDC_CHANNEL_COUNT; ++i) {
|
||||
cfg.pin_bit_mask = 1ULL << s_dcdc_gpio_map[i];
|
||||
esp_err_t err = gpio_config(&cfg);
|
||||
if (err != ESP_OK) {
|
||||
ESP_LOGE(TAG, "Не вдалося налаштувати GPIO %d (канал %d): %s",
|
||||
(int)s_dcdc_gpio_map[i], i, esp_err_to_name(err));
|
||||
return err;
|
||||
}
|
||||
ESP_ERROR_CHECK_WITHOUT_ABORT(gpio_set_level(s_dcdc_gpio_map[i], 0));
|
||||
s_channel_state[i] = false;
|
||||
}
|
||||
|
||||
s_initialized = true;
|
||||
ESP_LOGI(TAG, "DCDC контролер ініціалізовано, каналів: %d", DCDC_CHANNEL_COUNT);
|
||||
return ESP_OK;
|
||||
}
|
||||
|
||||
esp_err_t dcdc_set_state(dcdc_channel_t channel, bool enabled)
|
||||
{
|
||||
if (!dcdc_is_channel_valid(channel)) {
|
||||
return ESP_ERR_INVALID_ARG;
|
||||
}
|
||||
|
||||
esp_err_t err = gpio_set_level(s_dcdc_gpio_map[channel], enabled ? 1 : 0);
|
||||
if (err == ESP_OK) {
|
||||
s_channel_state[channel] = enabled;
|
||||
ESP_LOGI(TAG, "Канал %d -> %s", channel, enabled ? "ON" : "OFF");
|
||||
}
|
||||
return err;
|
||||
}
|
||||
|
||||
esp_err_t dcdc_enable(dcdc_channel_t channel)
|
||||
{
|
||||
return dcdc_set_state(channel, true);
|
||||
}
|
||||
|
||||
esp_err_t dcdc_disable(dcdc_channel_t channel)
|
||||
{
|
||||
return dcdc_set_state(channel, false);
|
||||
}
|
||||
|
||||
esp_err_t dcdc_toggle(dcdc_channel_t channel)
|
||||
{
|
||||
if (!dcdc_is_channel_valid(channel)) {
|
||||
return ESP_ERR_INVALID_ARG;
|
||||
}
|
||||
return dcdc_set_state(channel, !s_channel_state[channel]);
|
||||
}
|
||||
|
||||
bool dcdc_get_state(dcdc_channel_t channel)
|
||||
{
|
||||
if (!dcdc_is_channel_valid(channel)) {
|
||||
return false;
|
||||
}
|
||||
return s_channel_state[channel];
|
||||
}
|
||||
|
||||
size_t dcdc_channel_count(void)
|
||||
{
|
||||
return DCDC_CHANNEL_COUNT;
|
||||
}
|
||||
|
||||
gpio_num_t dcdc_get_gpio(dcdc_channel_t channel)
|
||||
{
|
||||
if (!dcdc_is_channel_valid(channel)) {
|
||||
return GPIO_NUM_NC;
|
||||
}
|
||||
return s_dcdc_gpio_map[channel];
|
||||
}
|
||||
Reference in New Issue
Block a user