182 lines
5.5 KiB
C
182 lines
5.5 KiB
C
/* 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;
|
||
} |