mirror of
https://github.com/alexandrebobkov/ESP-Nodes.git
synced 2024-10-05 20:47:50 -04:00
128 lines
3.8 KiB
C
128 lines
3.8 KiB
C
/* Switch demo implementation using button and RGB LED
|
|
|
|
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 <iot_button.h>
|
|
#include <esp_rmaker_core.h>
|
|
#include <esp_rmaker_standard_params.h>
|
|
|
|
#include <app_reset.h>
|
|
#include <ws2812_led.h>
|
|
#include "app_priv.h"
|
|
|
|
/* 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 CONFIG_EXAMPLE_OUTPUT_GPIO
|
|
|
|
#define SYS_LED_1 CONFIG_SWITCH_LED_1
|
|
#define SYS_LED_2 CONFIG_SWITCH_LED_2
|
|
|
|
static bool g_power_state = DEFAULT_POWER;
|
|
|
|
/* These values correspoind to H,S,V = 120,100,10 */
|
|
#define DEFAULT_RED 0
|
|
#define DEFAULT_GREEN 25
|
|
#define DEFAULT_BLUE 0
|
|
|
|
#define WIFI_RESET_BUTTON_TIMEOUT 3
|
|
#define FACTORY_RESET_BUTTON_TIMEOUT 10
|
|
|
|
static void light_sensor_init(void) {}
|
|
|
|
void app_bme280_init() {}
|
|
|
|
static void app_indicator_set(bool state)
|
|
{
|
|
if (state) {
|
|
ws2812_led_set_rgb(DEFAULT_RED, DEFAULT_GREEN, DEFAULT_BLUE);
|
|
} else {
|
|
ws2812_led_clear();
|
|
}
|
|
}
|
|
|
|
static void app_indicator_init(void)
|
|
{
|
|
ws2812_led_init();
|
|
app_indicator_set(g_power_state);
|
|
}
|
|
static void push_btn_cb(void *arg)
|
|
{
|
|
bool new_state = !g_power_state;
|
|
app_driver_set_state(new_state);
|
|
#ifdef CONFIG_EXAMPLE_ENABLE_TEST_NOTIFICATIONS
|
|
/* This snippet has been added just to demonstrate how the APIs esp_rmaker_param_update_and_notify()
|
|
* and esp_rmaker_raise_alert() can be used to trigger push notifications on the phone apps.
|
|
* Normally, there should not be a need to use these APIs for such simple operations. Please check
|
|
* API documentation for details.
|
|
*/
|
|
if (new_state) {
|
|
esp_rmaker_param_update_and_notify(
|
|
esp_rmaker_device_get_param_by_name(switch_device, ESP_RMAKER_DEF_POWER_NAME),
|
|
esp_rmaker_bool(new_state));
|
|
} else {
|
|
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));
|
|
esp_rmaker_raise_alert("Switch was turned off");
|
|
}
|
|
#else
|
|
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));
|
|
#endif
|
|
}
|
|
|
|
static void set_power_state(bool target)
|
|
{
|
|
//gpio_set_level(OUTPUT_GPIO, target);
|
|
gpio_set_level(SYS_LED_1, target);
|
|
gpio_set_level(SYS_LED_2, !target);
|
|
app_indicator_set(target);
|
|
}
|
|
|
|
void app_driver_init()
|
|
{
|
|
button_handle_t btn_handle = iot_button_create(BUTTON_GPIO, BUTTON_ACTIVE_LEVEL);
|
|
if (btn_handle) {
|
|
/* Register a callback for a button tap (short press) event */
|
|
iot_button_set_evt_cb(btn_handle, BUTTON_CB_TAP, push_btn_cb, NULL);
|
|
/* Register Wi-Fi reset and factory reset functionality on 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,
|
|
};
|
|
//io_conf.pin_bit_mask = ((uint64_t)1 << SYS_LED_1);//OUTPUT_GPIO);
|
|
io_conf.pin_bit_mask = (((uint64_t)1 << SYS_LED_1) | ((uint64_t)1 << SYS_LED_2));
|
|
/* Configure the GPIO */
|
|
gpio_config(&io_conf);
|
|
app_indicator_init();
|
|
}
|
|
|
|
int IRAM_ATTR app_driver_set_state(bool state)
|
|
{
|
|
if(g_power_state != state) {
|
|
g_power_state = state;
|
|
set_power_state(g_power_state);
|
|
}
|
|
return ESP_OK;
|
|
}
|
|
|
|
bool app_driver_get_state(void)
|
|
{
|
|
return g_power_state;
|
|
}
|