107 lines
3.1 KiB
C
107 lines
3.1 KiB
C
#include <stdbool.h>
|
|
|
|
#include "driver/gpio.h"
|
|
#include "esp_check.h"
|
|
#include "esp_log.h"
|
|
#include "io_device_control.h"
|
|
|
|
static const char *TAG = "io_device_control";
|
|
|
|
#define IO_DEVICE_FAN_GPIO GPIO_NUM_1
|
|
#define IO_DEVICE_LIGHT_GPIO GPIO_NUM_0
|
|
#define IO_DEVICE_HOT_GPIO GPIO_NUM_12
|
|
#define IO_DEVICE_COOL_GPIO GPIO_NUM_13
|
|
|
|
static bool s_inited = false;
|
|
|
|
static esp_err_t io_device_control_set_level(gpio_num_t pin, bool on)
|
|
{
|
|
ESP_RETURN_ON_FALSE(s_inited, ESP_ERR_INVALID_STATE, TAG, "not initialized");
|
|
return gpio_set_level(pin, on ? 1 : 0);
|
|
}
|
|
|
|
esp_err_t io_device_control_init(void)
|
|
{
|
|
if (s_inited) {
|
|
return ESP_OK;
|
|
}
|
|
|
|
const gpio_config_t out_cfg = {
|
|
.pin_bit_mask = (1ULL << IO_DEVICE_FAN_GPIO) |
|
|
(1ULL << IO_DEVICE_LIGHT_GPIO) |
|
|
(1ULL << IO_DEVICE_HOT_GPIO) |
|
|
(1ULL << IO_DEVICE_COOL_GPIO),
|
|
.mode = GPIO_MODE_OUTPUT,
|
|
.pull_up_en = GPIO_PULLUP_DISABLE,
|
|
.pull_down_en = GPIO_PULLDOWN_DISABLE,
|
|
.intr_type = GPIO_INTR_DISABLE,
|
|
};
|
|
|
|
ESP_RETURN_ON_ERROR(gpio_config(&out_cfg), TAG, "gpio_config failed");
|
|
|
|
// Active-high outputs; default low keeps devices off at boot.
|
|
ESP_RETURN_ON_ERROR(gpio_set_level(IO_DEVICE_FAN_GPIO, 0), TAG, "set fan default failed");
|
|
ESP_RETURN_ON_ERROR(gpio_set_level(IO_DEVICE_LIGHT_GPIO, 0), TAG, "set light default failed");
|
|
ESP_RETURN_ON_ERROR(gpio_set_level(IO_DEVICE_HOT_GPIO, 0), TAG, "set hot default failed");
|
|
ESP_RETURN_ON_ERROR(gpio_set_level(IO_DEVICE_COOL_GPIO, 0), TAG, "set cool default failed");
|
|
|
|
s_inited = true;
|
|
ESP_LOGI(TAG,
|
|
"initialized: fan=GPIO%d light=GPIO%d hot=GPIO%d cool=GPIO%d active_high=1",
|
|
IO_DEVICE_FAN_GPIO,
|
|
IO_DEVICE_LIGHT_GPIO,
|
|
IO_DEVICE_HOT_GPIO,
|
|
IO_DEVICE_COOL_GPIO);
|
|
return ESP_OK;
|
|
}
|
|
|
|
esp_err_t io_device_control_set_fan(bool on)
|
|
{
|
|
ESP_RETURN_ON_ERROR(io_device_control_set_level(IO_DEVICE_FAN_GPIO, on),
|
|
TAG,
|
|
"set fan failed");
|
|
return ESP_OK;
|
|
}
|
|
|
|
esp_err_t io_device_control_set_light(bool on)
|
|
{
|
|
ESP_RETURN_ON_ERROR(io_device_control_set_level(IO_DEVICE_LIGHT_GPIO, on),
|
|
TAG,
|
|
"set light failed");
|
|
return ESP_OK;
|
|
}
|
|
|
|
esp_err_t io_device_control_set_hot(bool on)
|
|
{
|
|
ESP_RETURN_ON_ERROR(io_device_control_set_level(IO_DEVICE_HOT_GPIO, on),
|
|
TAG,
|
|
"set hot failed");
|
|
return ESP_OK;
|
|
}
|
|
|
|
esp_err_t io_device_control_set_cool(bool on)
|
|
{
|
|
ESP_RETURN_ON_ERROR(io_device_control_set_level(IO_DEVICE_COOL_GPIO, on),
|
|
TAG,
|
|
"set cool failed");
|
|
return ESP_OK;
|
|
}
|
|
|
|
esp_err_t io_device_control_get_states(bool *fan_on,
|
|
bool *light_on,
|
|
bool *hot_on,
|
|
bool *cool_on)
|
|
{
|
|
ESP_RETURN_ON_FALSE(fan_on != NULL && light_on != NULL && hot_on != NULL && cool_on != NULL,
|
|
ESP_ERR_INVALID_ARG,
|
|
TAG,
|
|
"null state pointer");
|
|
ESP_RETURN_ON_FALSE(s_inited, ESP_ERR_INVALID_STATE, TAG, "not initialized");
|
|
|
|
*fan_on = (gpio_get_level(IO_DEVICE_FAN_GPIO) != 0);
|
|
*light_on = (gpio_get_level(IO_DEVICE_LIGHT_GPIO) != 0);
|
|
*hot_on = (gpio_get_level(IO_DEVICE_HOT_GPIO) != 0);
|
|
*cool_on = (gpio_get_level(IO_DEVICE_COOL_GPIO) != 0);
|
|
return ESP_OK;
|
|
}
|