Files
rmaker_multi_device/examples/gpio/main/app_driver.c
2025-05-27 11:44:44 +03:00

182 lines
5.5 KiB
C
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
/* Simple GPIO Demo
This example code is in the Public Domain (or CC0 licensed, at your option.)
Unless required by applicable law or agreed to in writing, this
software is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR
CONDITIONS OF ANY KIND, either express or implied.
*/
#include <sdkconfig.h>
#include <string.h>
#include <esp_log.h>
#include <app_reset.h>
#include <ws2812_led.h>
#include "esp_attr.h"
#include "esp_err.h"
#include "esp_rmaker_core.h"
#include "esp_rmaker_standard_types.h"
#include "esp_rmaker_standard_params.h"
#include "iot_button.h"
#include "app_priv.h"
#define RMT_TX_CHANNEL RMT_CHANNEL_0
/* This is the button that is used for toggling the power */
#define BUTTON_GPIO CONFIG_EXAMPLE_BOARD_BUTTON_GPIO
#define BUTTON_ACTIVE_LEVEL 0
/* This is the GPIO on which the power will be set */
#define OUTPUT_GPIO_RED CONFIG_EXAMPLE_OUTPUT_GPIO_RED
#define OUTPUT_GPIO_GREEN CONFIG_EXAMPLE_OUTPUT_GPIO_GREEN
#define OUTPUT_GPIO_BLUE CONFIG_EXAMPLE_OUTPUT_GPIO_BLUE
#define WIFI_RESET_BUTTON_TIMEOUT 3
#define FACTORY_RESET_BUTTON_TIMEOUT 10
// These values correspond to H,S,V = 120,100,10
#define RGB_DEFAULT_RED 0
#define RGB_DEFAULT_GREEN 25
#define RGB_DEFAULT_BLUE 0
static uint16_t rgb_hue = RGB_HUE_DEFAULT;
static uint16_t rgb_saturation = RGB_SATURATION_DEFAULT;
static uint16_t rgb_brightness = RGB_BRIGHTNESS_DEFAULT;
static bool rgb_power = RGB_POWER_DEFAULT;
static bool switch_state = false;
esp_err_t app_driver_set_gpio(const char *name, bool state)
{
if (strcmp(name, GPIO_DEVICE_OUT1_NAME) == 0) {
gpio_set_level(OUTPUT_GPIO_RED, state);
} else if (strcmp(name, GPIO_DEVICE_OUT2_NAME) == 0) {
gpio_set_level(OUTPUT_GPIO_GREEN, state);
} else if (strcmp(name, GPIO_DEVICE_OUT3_NAME) == 0) {
gpio_set_level(OUTPUT_GPIO_BLUE, state);
} else {
return ESP_FAIL;
}
return ESP_OK;
}
esp_err_t app_light_set_led(uint32_t hue, uint32_t saturation, uint32_t brightness)
{
// Her ne zaman bu bu işlev çağrılırsa, RGB ışığın gücü açılır
if (!rgb_power) {
rgb_power = true;
esp_rmaker_param_update_and_report(
esp_rmaker_device_get_param_by_type(light_device, ESP_RMAKER_PARAM_POWER),
esp_rmaker_bool(rgb_power));
}
return ws2812_led_set_hsv(hue, saturation, brightness);
}
esp_err_t app_light_set_power(bool power)
{
rgb_power = power;
if (power) {
ws2812_led_set_hsv(rgb_hue, rgb_saturation, rgb_brightness);
} else {
ws2812_led_clear();
}
return ESP_OK;
}
esp_err_t app_light_init(void)
{
esp_err_t ret = ws2812_led_init();
if (ret != ESP_OK) {
return ret;
}
if (rgb_power) {
ret = ws2812_led_set_hsv(rgb_hue, rgb_saturation, rgb_brightness);
} else {
ret = ws2812_led_clear();
}
return ESP_OK;
}
esp_err_t app_light_set_brightness(uint16_t brightness)
{
rgb_brightness = brightness;
return app_light_set_led(rgb_hue, rgb_saturation, brightness);
}
esp_err_t app_light_set_hue(uint16_t hue)
{
rgb_hue = hue;
return app_light_set_led(hue, rgb_saturation, rgb_brightness);
}
esp_err_t app_light_set_saturation(uint16_t saturation)
{
rgb_saturation = saturation;
return app_light_set_led(rgb_hue, saturation, rgb_brightness);
}
static void app_indicator_set(bool state)
{
if (state) {
app_driver_set_gpio(GPIO_DEVICE_OUT1_NAME, true);
app_driver_set_gpio(GPIO_DEVICE_OUT2_NAME, true);
app_driver_set_gpio(GPIO_DEVICE_OUT3_NAME, true);
} else {
app_driver_set_gpio(GPIO_DEVICE_OUT1_NAME, false);
app_driver_set_gpio(GPIO_DEVICE_OUT2_NAME, false);
app_driver_set_gpio(GPIO_DEVICE_OUT3_NAME, false);
}
esp_rmaker_param_update(esp_rmaker_device_get_param_by_name(gpio_device, GPIO_DEVICE_OUT1_NAME), esp_rmaker_bool(state));
esp_rmaker_param_update(esp_rmaker_device_get_param_by_name(gpio_device, GPIO_DEVICE_OUT2_NAME), esp_rmaker_bool(state));
esp_rmaker_param_update(esp_rmaker_device_get_param_by_name(gpio_device, GPIO_DEVICE_OUT3_NAME), esp_rmaker_bool(state));
}
static void push_button_cb(void *arg)
{
bool new_state = !switch_state;
app_switch_set_state(new_state);
esp_rmaker_param_update_and_report(
esp_rmaker_device_get_param_by_name(switch_device, ESP_RMAKER_DEF_POWER_NAME),
esp_rmaker_bool(new_state));
}
void app_driver_init()
{
button_handle_t btn_handle = iot_button_create(BUTTON_GPIO, BUTTON_ACTIVE_LEVEL);
// Register a callback for a button tap (short press) event
iot_button_set_evt_cb(btn_handle, BUTTON_CB_TAP, push_button_cb, NULL);
// Register Wi-Fi reset and factory reset functionality on the same button
app_reset_button_register(btn_handle, WIFI_RESET_BUTTON_TIMEOUT, FACTORY_RESET_BUTTON_TIMEOUT);
/* Configure power */
gpio_config_t io_conf = {
.mode = GPIO_MODE_OUTPUT,
.pull_up_en = 1,
};
uint64_t pin_mask = (((uint64_t)1 << OUTPUT_GPIO_RED ) | ((uint64_t)1 << OUTPUT_GPIO_GREEN ) | ((uint64_t)1 << OUTPUT_GPIO_BLUE ));
io_conf.pin_bit_mask = pin_mask;
/* Configure the GPIO */
gpio_config(&io_conf);
gpio_set_level(OUTPUT_GPIO_RED, false);
gpio_set_level(OUTPUT_GPIO_GREEN, false);
gpio_set_level(OUTPUT_GPIO_BLUE, false);
app_light_init();
}
int IRAM_ATTR app_switch_set_state(bool state)
{
if (switch_state != state) {
switch_state = state;
app_indicator_set(state);
}
return ESP_OK;
}
bool app_switch_get_state(void)
{
return switch_state;
}