Arduino core 3.2.1
This commit is contained in:
@@ -3,100 +3,40 @@ menu "Light Matter Accessory"
|
||||
config BUTTON_PIN
|
||||
int
|
||||
prompt "Button 1 GPIO"
|
||||
default ENV_GPIO_BOOT_BUTTON
|
||||
default 9 if IDF_TARGET_ESP32C3 || IDF_TARGET_ESP32C6
|
||||
default 0
|
||||
range -1 ENV_GPIO_IN_RANGE_MAX
|
||||
help
|
||||
The GPIO pin for button that will be used to turn on/off the Matter Light. It shall be connected to a push button. It can use the BOOT button of the development board.
|
||||
endmenu
|
||||
|
||||
|
||||
menu "LEDs"
|
||||
config WS2812_PIN
|
||||
int
|
||||
prompt "WS2812 RGB LED GPIO"
|
||||
default ENV_GPIO_RGB_LED
|
||||
default 8 if IDF_TARGET_ESP32C3 || IDF_TARGET_ESP32C6
|
||||
default 48
|
||||
range -1 ENV_GPIO_OUT_RANGE_MAX
|
||||
help
|
||||
The GPIO pin for the Matter Light that will be driven by RMT. It shall be connected to one single WS2812 RGB LED.
|
||||
endmenu
|
||||
|
||||
# TARGET CONFIGURATION
|
||||
if IDF_TARGET_ESP32C3
|
||||
config ENV_GPIO_RANGE_MIN
|
||||
int
|
||||
default 0
|
||||
config ENV_GPIO_RANGE_MIN
|
||||
int
|
||||
default 0
|
||||
|
||||
config ENV_GPIO_RANGE_MAX
|
||||
int
|
||||
default 19
|
||||
# GPIOs 20/21 are always used by UART in examples
|
||||
config ENV_GPIO_RANGE_MAX
|
||||
int
|
||||
default 19 if IDF_TARGET_ESP32C3
|
||||
default 30 if IDF_TARGET_ESP32C6
|
||||
default 48
|
||||
|
||||
config ENV_GPIO_IN_RANGE_MAX
|
||||
int
|
||||
default ENV_GPIO_RANGE_MAX
|
||||
config ENV_GPIO_IN_RANGE_MAX
|
||||
int
|
||||
default ENV_GPIO_RANGE_MAX
|
||||
|
||||
config ENV_GPIO_OUT_RANGE_MAX
|
||||
int
|
||||
default ENV_GPIO_RANGE_MAX
|
||||
|
||||
config ENV_GPIO_BOOT_BUTTON
|
||||
int
|
||||
default 9
|
||||
|
||||
config ENV_GPIO_RGB_LED
|
||||
int
|
||||
default 8
|
||||
endif
|
||||
if IDF_TARGET_ESP32C6
|
||||
config ENV_GPIO_RANGE_MIN
|
||||
int
|
||||
default 0
|
||||
|
||||
config ENV_GPIO_RANGE_MAX
|
||||
int
|
||||
default 30
|
||||
# GPIOs 16/17 are always used by UART in examples
|
||||
|
||||
config ENV_GPIO_IN_RANGE_MAX
|
||||
int
|
||||
default ENV_GPIO_RANGE_MAX
|
||||
|
||||
config ENV_GPIO_OUT_RANGE_MAX
|
||||
int
|
||||
default ENV_GPIO_RANGE_MAX
|
||||
|
||||
config ENV_GPIO_BOOT_BUTTON
|
||||
int
|
||||
default 9
|
||||
|
||||
config ENV_GPIO_RGB_LED
|
||||
int
|
||||
default 8
|
||||
endif
|
||||
if IDF_TARGET_ESP32S3
|
||||
config ENV_GPIO_RANGE_MIN
|
||||
int
|
||||
default 0
|
||||
|
||||
config ENV_GPIO_RANGE_MAX
|
||||
int
|
||||
default 48
|
||||
|
||||
config ENV_GPIO_IN_RANGE_MAX
|
||||
int
|
||||
default ENV_GPIO_RANGE_MAX
|
||||
|
||||
config ENV_GPIO_OUT_RANGE_MAX
|
||||
int
|
||||
default ENV_GPIO_RANGE_MAX
|
||||
|
||||
config ENV_GPIO_BOOT_BUTTON
|
||||
int
|
||||
default 0
|
||||
|
||||
config ENV_GPIO_RGB_LED
|
||||
int
|
||||
default 48
|
||||
endif
|
||||
config ENV_GPIO_OUT_RANGE_MAX
|
||||
int
|
||||
default ENV_GPIO_RANGE_MAX
|
||||
|
||||
endmenu
|
||||
|
||||
@@ -13,235 +13,225 @@
|
||||
#include "builtinLED.h"
|
||||
|
||||
typedef struct {
|
||||
uint16_t hue;
|
||||
uint8_t saturation;
|
||||
uint16_t hue;
|
||||
uint8_t saturation;
|
||||
} HS_color_t;
|
||||
|
||||
static const HS_color_t temperatureTable[] = {
|
||||
{4, 100}, {8, 100}, {11, 100}, {14, 100}, {16, 100}, {18, 100}, {20, 100}, {22, 100}, {24, 100}, {25, 100},
|
||||
{27, 100}, {28, 100}, {30, 100}, {31, 100}, {31, 95}, {30, 89}, {30, 85}, {29, 80}, {29, 76}, {29, 73},
|
||||
{29, 69}, {28, 66}, {28, 63}, {28, 60}, {28, 57}, {28, 54}, {28, 52}, {27, 49}, {27, 47}, {27, 45},
|
||||
{27, 43}, {27, 41}, {27, 39}, {27, 37}, {27, 35}, {27, 33}, {27, 31}, {27, 30}, {27, 28}, {27, 26},
|
||||
{27, 25}, {27, 23}, {27, 22}, {27, 21}, {27, 19}, {27, 18}, {27, 17}, {27, 15}, {28, 14}, {28, 13},
|
||||
{28, 12}, {29, 10}, {29, 9}, {30, 8}, {31, 7}, {32, 6}, {34, 5}, {36, 4}, {41, 3}, {49, 2},
|
||||
{0, 0}, {294, 2}, {265, 3}, {251, 4}, {242, 5}, {237, 6}, {233, 7}, {231, 8}, {229, 9}, {228, 10},
|
||||
{227, 11}, {226, 11}, {226, 12}, {225, 13}, {225, 13}, {224, 14}, {224, 14}, {224, 15}, {224, 15}, {223, 16},
|
||||
{223, 16}, {223, 17}, {223, 17}, {223, 17}, {222, 18}, {222, 18}, {222, 19}, {222, 19}, {222, 19}, {222, 19},
|
||||
{222, 20}, {222, 20}, {222, 20}, {222, 21}, {222, 21}
|
||||
{4, 100}, {8, 100}, {11, 100}, {14, 100}, {16, 100}, {18, 100}, {20, 100}, {22, 100}, {24, 100}, {25, 100}, {27, 100}, {28, 100}, {30, 100}, {31, 100},
|
||||
{31, 95}, {30, 89}, {30, 85}, {29, 80}, {29, 76}, {29, 73}, {29, 69}, {28, 66}, {28, 63}, {28, 60}, {28, 57}, {28, 54}, {28, 52}, {27, 49},
|
||||
{27, 47}, {27, 45}, {27, 43}, {27, 41}, {27, 39}, {27, 37}, {27, 35}, {27, 33}, {27, 31}, {27, 30}, {27, 28}, {27, 26}, {27, 25}, {27, 23},
|
||||
{27, 22}, {27, 21}, {27, 19}, {27, 18}, {27, 17}, {27, 15}, {28, 14}, {28, 13}, {28, 12}, {29, 10}, {29, 9}, {30, 8}, {31, 7}, {32, 6},
|
||||
{34, 5}, {36, 4}, {41, 3}, {49, 2}, {0, 0}, {294, 2}, {265, 3}, {251, 4}, {242, 5}, {237, 6}, {233, 7}, {231, 8}, {229, 9}, {228, 10},
|
||||
{227, 11}, {226, 11}, {226, 12}, {225, 13}, {225, 13}, {224, 14}, {224, 14}, {224, 15}, {224, 15}, {223, 16}, {223, 16}, {223, 17}, {223, 17}, {223, 17},
|
||||
{222, 18}, {222, 18}, {222, 19}, {222, 19}, {222, 19}, {222, 19}, {222, 20}, {222, 20}, {222, 20}, {222, 21}, {222, 21}
|
||||
};
|
||||
|
||||
/* step brightness table: gamma = 2.3 */
|
||||
static const uint8_t gamma_table[MAX_PROGRESS] = {
|
||||
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
||||
0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 2,
|
||||
2, 2, 2, 2, 2, 3, 3, 3, 3, 3, 4, 4, 4, 4, 4, 5,
|
||||
5, 5, 6, 6, 6, 6, 7, 7, 7, 8, 8, 8, 9, 9, 9, 10,
|
||||
10, 10, 11, 11, 12, 12, 13, 13, 13, 14, 14, 15, 15, 16, 16, 17,
|
||||
17, 18, 18, 19, 19, 20, 20, 21, 22, 22, 23, 23, 24, 25, 25, 26,
|
||||
26, 27, 28, 28, 29, 30, 30, 31, 32, 33, 33, 34, 35, 36, 36, 37,
|
||||
38, 39, 40, 40, 41, 42, 43, 44, 45, 45, 46, 47, 48, 49, 50, 51,
|
||||
52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67,
|
||||
68, 69, 70, 71, 72, 74, 75, 76, 77, 78, 79, 81, 82, 83, 84, 86,
|
||||
87, 88, 89, 91, 92, 93, 95, 96, 97, 99, 100, 101, 103, 104, 105, 107,
|
||||
108, 110, 111, 112, 114, 115, 117, 118, 120, 121, 123, 124, 126, 128, 129, 131,
|
||||
132, 134, 135, 137, 139, 140, 142, 144, 145, 147, 149, 150, 152, 154, 156, 157,
|
||||
159, 161, 163, 164, 166, 168, 170, 172, 174, 175, 177, 179, 181, 183, 185, 187,
|
||||
189, 191, 193, 195, 197, 199, 201, 203, 205, 207, 209, 211, 213, 215, 217, 219,
|
||||
221, 223, 226, 228, 230, 232, 234, 236, 239, 241, 243, 245, 248, 250, 252, 255,
|
||||
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1,
|
||||
1, 1, 2, 2, 2, 2, 2, 2, 3, 3, 3, 3, 3, 4, 4, 4, 4, 4, 5, 5, 5, 6, 6, 6, 6, 7, 7, 7, 8,
|
||||
8, 8, 9, 9, 9, 10, 10, 10, 11, 11, 12, 12, 13, 13, 13, 14, 14, 15, 15, 16, 16, 17, 17, 18, 18, 19, 19, 20, 20,
|
||||
21, 22, 22, 23, 23, 24, 25, 25, 26, 26, 27, 28, 28, 29, 30, 30, 31, 32, 33, 33, 34, 35, 36, 36, 37, 38, 39, 40, 40,
|
||||
41, 42, 43, 44, 45, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68,
|
||||
69, 70, 71, 72, 74, 75, 76, 77, 78, 79, 81, 82, 83, 84, 86, 87, 88, 89, 91, 92, 93, 95, 96, 97, 99, 100, 101, 103, 104,
|
||||
105, 107, 108, 110, 111, 112, 114, 115, 117, 118, 120, 121, 123, 124, 126, 128, 129, 131, 132, 134, 135, 137, 139, 140, 142, 144, 145, 147, 149,
|
||||
150, 152, 154, 156, 157, 159, 161, 163, 164, 166, 168, 170, 172, 174, 175, 177, 179, 181, 183, 185, 187, 189, 191, 193, 195, 197, 199, 201, 203,
|
||||
205, 207, 209, 211, 213, 215, 217, 219, 221, 223, 226, 228, 230, 232, 234, 236, 239, 241, 243, 245, 248, 250, 252, 255,
|
||||
};
|
||||
|
||||
BuiltInLED::BuiltInLED() {
|
||||
pin_number = (uint8_t) -1; // no pin number
|
||||
state = false; // LED is off
|
||||
hsv_color.value = 0; // black color
|
||||
pin_number = (uint8_t)-1; // no pin number
|
||||
state = false; // LED is off
|
||||
hsv_color.value = 0; // black color
|
||||
}
|
||||
|
||||
BuiltInLED::~BuiltInLED(){
|
||||
end();
|
||||
BuiltInLED::~BuiltInLED() {
|
||||
end();
|
||||
}
|
||||
|
||||
led_indicator_color_hsv_t BuiltInLED::rgb2hsv(led_indicator_color_rgb_t rgb) {
|
||||
led_indicator_color_hsv_t hsv;
|
||||
uint8_t minRGB, maxRGB;
|
||||
uint8_t delta;
|
||||
led_indicator_color_hsv_t hsv;
|
||||
uint8_t minRGB, maxRGB;
|
||||
uint8_t delta;
|
||||
|
||||
minRGB = rgb.r < rgb.g ? (rgb.r < rgb.b ? rgb.r : rgb.b) : (rgb.g < rgb.b ? rgb.g : rgb.b);
|
||||
maxRGB = rgb.r > rgb.g ? (rgb.r > rgb.b ? rgb.r : rgb.b) : (rgb.g > rgb.b ? rgb.g : rgb.b);
|
||||
hsv.value = 0;
|
||||
hsv.v = maxRGB;
|
||||
delta = maxRGB - minRGB;
|
||||
minRGB = rgb.r < rgb.g ? (rgb.r < rgb.b ? rgb.r : rgb.b) : (rgb.g < rgb.b ? rgb.g : rgb.b);
|
||||
maxRGB = rgb.r > rgb.g ? (rgb.r > rgb.b ? rgb.r : rgb.b) : (rgb.g > rgb.b ? rgb.g : rgb.b);
|
||||
hsv.value = 0;
|
||||
hsv.v = maxRGB;
|
||||
delta = maxRGB - minRGB;
|
||||
|
||||
if (delta == 0) {
|
||||
hsv.h = 0;
|
||||
hsv.s = 0;
|
||||
if (delta == 0) {
|
||||
hsv.h = 0;
|
||||
hsv.s = 0;
|
||||
} else {
|
||||
hsv.s = delta * 255 / maxRGB;
|
||||
|
||||
if (rgb.r == maxRGB) {
|
||||
hsv.h = (60 * (rgb.g - rgb.b) / delta + 360) % 360;
|
||||
} else if (rgb.g == maxRGB) {
|
||||
hsv.h = (60 * (rgb.b - rgb.r) / delta + 120);
|
||||
} else {
|
||||
hsv.s = delta * 255 / maxRGB;
|
||||
|
||||
if (rgb.r == maxRGB) {
|
||||
hsv.h = (60 * (rgb.g - rgb.b) / delta + 360) % 360;
|
||||
} else if (rgb.g == maxRGB) {
|
||||
hsv.h = (60 * (rgb.b - rgb.r) / delta + 120);
|
||||
} else {
|
||||
hsv.h = (60 * (rgb.r - rgb.g) / delta + 240);
|
||||
}
|
||||
hsv.h = (60 * (rgb.r - rgb.g) / delta + 240);
|
||||
}
|
||||
return hsv;
|
||||
}
|
||||
return hsv;
|
||||
}
|
||||
|
||||
led_indicator_color_rgb_t BuiltInLED::hsv2rgb(led_indicator_color_hsv_t hsv) {
|
||||
led_indicator_color_rgb_t rgb;
|
||||
uint8_t rgb_max = hsv.v;
|
||||
uint8_t rgb_min = rgb_max * (255 - hsv.s) / 255.0f;
|
||||
led_indicator_color_rgb_t rgb;
|
||||
uint8_t rgb_max = hsv.v;
|
||||
uint8_t rgb_min = rgb_max * (255 - hsv.s) / 255.0f;
|
||||
|
||||
uint8_t i = hsv.h / 60;
|
||||
uint8_t diff = hsv.h % 60;
|
||||
uint8_t i = hsv.h / 60;
|
||||
uint8_t diff = hsv.h % 60;
|
||||
|
||||
// RGB adjustment amount by hue
|
||||
uint8_t rgb_adj = (rgb_max - rgb_min) * diff / 60;
|
||||
rgb.value = 0;
|
||||
switch (i) {
|
||||
// RGB adjustment amount by hue
|
||||
uint8_t rgb_adj = (rgb_max - rgb_min) * diff / 60;
|
||||
rgb.value = 0;
|
||||
switch (i) {
|
||||
case 0:
|
||||
rgb.r = rgb_max;
|
||||
rgb.g = rgb_min + rgb_adj;
|
||||
rgb.b = rgb_min;
|
||||
break;
|
||||
rgb.r = rgb_max;
|
||||
rgb.g = rgb_min + rgb_adj;
|
||||
rgb.b = rgb_min;
|
||||
break;
|
||||
case 1:
|
||||
rgb.r = rgb_max - rgb_adj;
|
||||
rgb.g = rgb_max;
|
||||
rgb.b = rgb_min;
|
||||
break;
|
||||
rgb.r = rgb_max - rgb_adj;
|
||||
rgb.g = rgb_max;
|
||||
rgb.b = rgb_min;
|
||||
break;
|
||||
case 2:
|
||||
rgb.r = rgb_min;
|
||||
rgb.g = rgb_max;
|
||||
rgb.b = rgb_min + rgb_adj;
|
||||
break;
|
||||
rgb.r = rgb_min;
|
||||
rgb.g = rgb_max;
|
||||
rgb.b = rgb_min + rgb_adj;
|
||||
break;
|
||||
case 3:
|
||||
rgb.r = rgb_min;
|
||||
rgb.g = rgb_max - rgb_adj;
|
||||
rgb.b = rgb_max;
|
||||
break;
|
||||
rgb.r = rgb_min;
|
||||
rgb.g = rgb_max - rgb_adj;
|
||||
rgb.b = rgb_max;
|
||||
break;
|
||||
case 4:
|
||||
rgb.r = rgb_min + rgb_adj;
|
||||
rgb.g = rgb_min;
|
||||
rgb.b = rgb_max;
|
||||
break;
|
||||
rgb.r = rgb_min + rgb_adj;
|
||||
rgb.g = rgb_min;
|
||||
rgb.b = rgb_max;
|
||||
break;
|
||||
default:
|
||||
rgb.r = rgb_max;
|
||||
rgb.g = rgb_min;
|
||||
rgb.b = rgb_max - rgb_adj;
|
||||
break;
|
||||
}
|
||||
rgb.r = rgb_max;
|
||||
rgb.g = rgb_min;
|
||||
rgb.b = rgb_max - rgb_adj;
|
||||
break;
|
||||
}
|
||||
|
||||
// gamma correction
|
||||
rgb.r = gamma_table[rgb.r];
|
||||
rgb.g = gamma_table[rgb.g];
|
||||
rgb.b = gamma_table[rgb.b];
|
||||
return rgb;
|
||||
// gamma correction
|
||||
rgb.r = gamma_table[rgb.r];
|
||||
rgb.g = gamma_table[rgb.g];
|
||||
rgb.b = gamma_table[rgb.b];
|
||||
return rgb;
|
||||
}
|
||||
|
||||
void BuiltInLED::begin(uint8_t pin){
|
||||
if (pin < NUM_DIGITAL_PINS) {
|
||||
pin_number = pin;
|
||||
log_i("Initializing pin %d", pin);
|
||||
void BuiltInLED::begin(uint8_t pin) {
|
||||
if (pin < NUM_DIGITAL_PINS) {
|
||||
pin_number = pin;
|
||||
log_i("Initializing pin %d", pin);
|
||||
} else {
|
||||
log_e("Invalid pin (%d) number", pin);
|
||||
}
|
||||
}
|
||||
void BuiltInLED::end() {
|
||||
state = false;
|
||||
write(); // turn off the LED
|
||||
if (pin_number < NUM_DIGITAL_PINS) {
|
||||
if (!rmtDeinit(pin_number)) {
|
||||
log_e("Failed to deinitialize RMT");
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void BuiltInLED::on() {
|
||||
state = true;
|
||||
}
|
||||
|
||||
void BuiltInLED::off() {
|
||||
state = false;
|
||||
}
|
||||
|
||||
void BuiltInLED::toggle() {
|
||||
state = !state;
|
||||
}
|
||||
|
||||
bool BuiltInLED::getState() {
|
||||
return state;
|
||||
}
|
||||
|
||||
bool BuiltInLED::write() {
|
||||
led_indicator_color_rgb_t rgb_color = getRGB();
|
||||
log_d("Writing to pin %d with state = %s", pin_number, state ? "ON" : "OFF");
|
||||
log_d("HSV: %d, %d, %d", hsv_color.h, hsv_color.s, hsv_color.v);
|
||||
log_d("RGB: %d, %d, %d", rgb_color.r, rgb_color.g, rgb_color.b);
|
||||
if (pin_number < NUM_DIGITAL_PINS) {
|
||||
if (state) {
|
||||
rgbLedWrite(pin_number, rgb_color.r, rgb_color.g, rgb_color.b);
|
||||
} else {
|
||||
log_e("Invalid pin (%d) number", pin);
|
||||
}
|
||||
}
|
||||
void BuiltInLED::end(){
|
||||
state = false;
|
||||
write(); // turn off the LED
|
||||
if (pin_number < NUM_DIGITAL_PINS) {
|
||||
if (!rmtDeinit(pin_number)) {
|
||||
log_e("Failed to deinitialize RMT");
|
||||
}
|
||||
rgbLedWrite(pin_number, 0, 0, 0);
|
||||
}
|
||||
return true;
|
||||
} else {
|
||||
log_e("Invalid pin (%d) number", pin_number);
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
void BuiltInLED::on(){
|
||||
state = true;
|
||||
void BuiltInLED::setBrightness(uint8_t brightness) {
|
||||
hsv_color.v = brightness;
|
||||
}
|
||||
|
||||
void BuiltInLED::off(){
|
||||
state = false;
|
||||
uint8_t BuiltInLED::getBrightness() {
|
||||
return hsv_color.v;
|
||||
}
|
||||
|
||||
void BuiltInLED::toggle(){
|
||||
state = !state;
|
||||
void BuiltInLED::setHSV(led_indicator_color_hsv_t hsv) {
|
||||
if (hsv.h > MAX_HUE) {
|
||||
hsv.h = MAX_HUE;
|
||||
}
|
||||
hsv_color.value = hsv.value;
|
||||
}
|
||||
|
||||
bool BuiltInLED::getState(){
|
||||
return state;
|
||||
led_indicator_color_hsv_t BuiltInLED::getHSV() {
|
||||
return hsv_color;
|
||||
}
|
||||
|
||||
bool BuiltInLED::write(){
|
||||
led_indicator_color_rgb_t rgb_color = getRGB();
|
||||
log_d("Writing to pin %d with state = %s", pin_number, state ? "ON" : "OFF");
|
||||
log_d("HSV: %d, %d, %d", hsv_color.h, hsv_color.s, hsv_color.v);
|
||||
log_d("RGB: %d, %d, %d", rgb_color.r, rgb_color.g, rgb_color.b);
|
||||
if(pin_number < NUM_DIGITAL_PINS){
|
||||
if (state) {
|
||||
rgbLedWrite(pin_number, rgb_color.r, rgb_color.g, rgb_color.b);
|
||||
} else {
|
||||
rgbLedWrite(pin_number, 0, 0, 0);
|
||||
}
|
||||
return true;
|
||||
void BuiltInLED::setRGB(led_indicator_color_rgb_t rgb_color) {
|
||||
hsv_color = rgb2hsv(rgb_color);
|
||||
}
|
||||
|
||||
led_indicator_color_rgb_t BuiltInLED::getRGB() {
|
||||
return hsv2rgb(hsv_color);
|
||||
}
|
||||
|
||||
void BuiltInLED::setTemperature(uint32_t temperature) {
|
||||
uint16_t hue;
|
||||
uint8_t saturation;
|
||||
|
||||
log_d("Requested Temperature: %ld", temperature);
|
||||
//hsv_color.v = gamma_table[((temperature >> 25) & 0x7F)];
|
||||
temperature &= 0xFFFFFF;
|
||||
if (temperature < 600) {
|
||||
hue = 0;
|
||||
saturation = 100;
|
||||
} else {
|
||||
if (temperature > 10000) {
|
||||
hue = 222;
|
||||
saturation = 21 + (temperature - 10000) * 41 / 990000;
|
||||
} else {
|
||||
log_e("Invalid pin (%d) number", pin_number);
|
||||
return false;
|
||||
temperature -= 600;
|
||||
temperature /= 100;
|
||||
hue = temperatureTable[temperature].hue;
|
||||
saturation = temperatureTable[temperature].saturation;
|
||||
}
|
||||
}
|
||||
saturation = (saturation * 255) / 100;
|
||||
// brightness is not changed
|
||||
hsv_color.h = hue;
|
||||
hsv_color.s = saturation;
|
||||
log_d("Calculated Temperature: %ld, Hue: %d, Saturation: %d, Brightness: %d", temperature, hue, saturation, hsv_color.v);
|
||||
}
|
||||
|
||||
void BuiltInLED::setBrightness(uint8_t brightness){
|
||||
hsv_color.v = brightness;
|
||||
}
|
||||
|
||||
uint8_t BuiltInLED::getBrightness(){
|
||||
return hsv_color.v;
|
||||
}
|
||||
|
||||
void BuiltInLED::setHSV(led_indicator_color_hsv_t hsv){
|
||||
if (hsv.h > MAX_HUE) {
|
||||
hsv.h = MAX_HUE;
|
||||
}
|
||||
hsv_color.value = hsv.value;
|
||||
}
|
||||
|
||||
led_indicator_color_hsv_t BuiltInLED::getHSV(){
|
||||
return hsv_color;
|
||||
}
|
||||
|
||||
void BuiltInLED::setRGB(led_indicator_color_rgb_t rgb_color){
|
||||
hsv_color = rgb2hsv(rgb_color);
|
||||
}
|
||||
|
||||
led_indicator_color_rgb_t BuiltInLED::getRGB(){
|
||||
return hsv2rgb(hsv_color);
|
||||
}
|
||||
|
||||
void BuiltInLED::setTemperature(uint32_t temperature){
|
||||
uint16_t hue;
|
||||
uint8_t saturation;
|
||||
|
||||
log_d("Requested Temperature: %ld", temperature);
|
||||
//hsv_color.v = gamma_table[((temperature >> 25) & 0x7F)];
|
||||
temperature &= 0xFFFFFF;
|
||||
if (temperature < 600) {
|
||||
hue = 0;
|
||||
saturation = 100;
|
||||
} else {
|
||||
if (temperature > 10000) {
|
||||
hue = 222;
|
||||
saturation = 21 + (temperature - 10000) * 41 / 990000;
|
||||
} else {
|
||||
temperature -= 600;
|
||||
temperature /= 100;
|
||||
hue = temperatureTable[temperature].hue;
|
||||
saturation = temperatureTable[temperature].saturation;
|
||||
}
|
||||
}
|
||||
saturation = (saturation * 255) / 100;
|
||||
// brightness is not changed
|
||||
hsv_color.h = hue;
|
||||
hsv_color.s = saturation;
|
||||
log_d("Calculated Temperature: %ld, Hue: %d, Saturation: %d, Brightness: %d", temperature, hue, saturation, hsv_color.v);
|
||||
}
|
||||
@@ -14,61 +14,61 @@
|
||||
|
||||
#include <Arduino.h>
|
||||
|
||||
#define MAX_HUE 360
|
||||
#define MAX_HUE 360
|
||||
#define MAX_SATURATION 255
|
||||
#define MAX_BRIGHTNESS 255
|
||||
#define MAX_PROGRESS 256
|
||||
#define MAX_PROGRESS 256
|
||||
|
||||
typedef struct {
|
||||
union {
|
||||
struct {
|
||||
uint32_t v: 8; /*!< Brightness/Value of the LED. 0-255 */
|
||||
uint32_t s: 8; /*!< Saturation of the LED. 0-255 */
|
||||
uint32_t h: 9; /*!< Hue of the LED. 0-360 */
|
||||
};
|
||||
uint32_t value; /*!< IHSV value of the LED. */
|
||||
union {
|
||||
struct {
|
||||
uint32_t v : 8; /*!< Brightness/Value of the LED. 0-255 */
|
||||
uint32_t s : 8; /*!< Saturation of the LED. 0-255 */
|
||||
uint32_t h : 9; /*!< Hue of the LED. 0-360 */
|
||||
};
|
||||
uint32_t value; /*!< IHSV value of the LED. */
|
||||
};
|
||||
} led_indicator_color_hsv_t;
|
||||
|
||||
typedef struct {
|
||||
union {
|
||||
struct {
|
||||
uint32_t r: 8; /*!< Red component of the LED color. Range: 0-255. */
|
||||
uint32_t g: 8; /*!< Green component of the LED color. Range: 0-255. */
|
||||
uint32_t b: 8; /*!< Blue component of the LED color. Range: 0-255. */
|
||||
};
|
||||
uint32_t value; /*!< Combined RGB value of the LED color. */
|
||||
union {
|
||||
struct {
|
||||
uint32_t r : 8; /*!< Red component of the LED color. Range: 0-255. */
|
||||
uint32_t g : 8; /*!< Green component of the LED color. Range: 0-255. */
|
||||
uint32_t b : 8; /*!< Blue component of the LED color. Range: 0-255. */
|
||||
};
|
||||
uint32_t value; /*!< Combined RGB value of the LED color. */
|
||||
};
|
||||
} led_indicator_color_rgb_t;
|
||||
|
||||
class BuiltInLED {
|
||||
private:
|
||||
uint8_t pin_number;
|
||||
bool state;
|
||||
led_indicator_color_hsv_t hsv_color;
|
||||
uint8_t pin_number;
|
||||
bool state;
|
||||
led_indicator_color_hsv_t hsv_color;
|
||||
|
||||
public:
|
||||
BuiltInLED();
|
||||
~BuiltInLED();
|
||||
BuiltInLED();
|
||||
~BuiltInLED();
|
||||
|
||||
static led_indicator_color_hsv_t rgb2hsv(led_indicator_color_rgb_t rgb_value);
|
||||
static led_indicator_color_rgb_t hsv2rgb(led_indicator_color_hsv_t hsv);
|
||||
static led_indicator_color_hsv_t rgb2hsv(led_indicator_color_rgb_t rgb_value);
|
||||
static led_indicator_color_rgb_t hsv2rgb(led_indicator_color_hsv_t hsv);
|
||||
|
||||
void begin(uint8_t pin);
|
||||
void end();
|
||||
void begin(uint8_t pin);
|
||||
void end();
|
||||
|
||||
void on();
|
||||
void off();
|
||||
void toggle();
|
||||
bool getState();
|
||||
void on();
|
||||
void off();
|
||||
void toggle();
|
||||
bool getState();
|
||||
|
||||
bool write();
|
||||
bool write();
|
||||
|
||||
void setBrightness(uint8_t brightness);
|
||||
uint8_t getBrightness();
|
||||
void setHSV(led_indicator_color_hsv_t hsv);
|
||||
led_indicator_color_hsv_t getHSV();
|
||||
void setRGB(led_indicator_color_rgb_t color);
|
||||
led_indicator_color_rgb_t getRGB();
|
||||
void setTemperature(uint32_t temperature);
|
||||
};
|
||||
void setBrightness(uint8_t brightness);
|
||||
uint8_t getBrightness();
|
||||
void setHSV(led_indicator_color_hsv_t hsv);
|
||||
led_indicator_color_hsv_t getHSV();
|
||||
void setRGB(led_indicator_color_rgb_t color);
|
||||
led_indicator_color_rgb_t getRGB();
|
||||
void setTemperature(uint32_t temperature);
|
||||
};
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
dependencies:
|
||||
espressif/esp_matter:
|
||||
version: "^1.3.0"
|
||||
version: ">=1.4.0"
|
||||
espressif/cmake_utilities:
|
||||
version: "0.*"
|
||||
rules:
|
||||
|
||||
@@ -11,85 +11,79 @@
|
||||
#include "matter_accessory_driver.h"
|
||||
|
||||
/* Do any conversions/remapping for the actual value here */
|
||||
esp_err_t light_accessory_set_power(void *led, uint8_t val)
|
||||
{
|
||||
BuiltInLED *builtinLED = (BuiltInLED *) led;
|
||||
esp_err_t err = ESP_OK;
|
||||
if (val) {
|
||||
builtinLED->on();
|
||||
} else {
|
||||
builtinLED->off();
|
||||
}
|
||||
if (!builtinLED->write()) {
|
||||
err = ESP_FAIL;
|
||||
}
|
||||
log_i("LED set power: %d", val);
|
||||
return err;
|
||||
esp_err_t light_accessory_set_power(void *led, uint8_t val) {
|
||||
BuiltInLED *builtinLED = (BuiltInLED *)led;
|
||||
esp_err_t err = ESP_OK;
|
||||
if (val) {
|
||||
builtinLED->on();
|
||||
} else {
|
||||
builtinLED->off();
|
||||
}
|
||||
if (!builtinLED->write()) {
|
||||
err = ESP_FAIL;
|
||||
}
|
||||
log_i("LED set power: %d", val);
|
||||
return err;
|
||||
}
|
||||
|
||||
esp_err_t light_accessory_set_brightness(void *led, uint8_t val)
|
||||
{
|
||||
esp_err_t err = ESP_OK;
|
||||
BuiltInLED *builtinLED = (BuiltInLED *) led;
|
||||
int value = REMAP_TO_RANGE(val, MATTER_BRIGHTNESS, STANDARD_BRIGHTNESS);
|
||||
esp_err_t light_accessory_set_brightness(void *led, uint8_t val) {
|
||||
esp_err_t err = ESP_OK;
|
||||
BuiltInLED *builtinLED = (BuiltInLED *)led;
|
||||
int value = REMAP_TO_RANGE(val, MATTER_BRIGHTNESS, STANDARD_BRIGHTNESS);
|
||||
|
||||
builtinLED->setBrightness(value);
|
||||
if (!builtinLED->write()) {
|
||||
err = ESP_FAIL;
|
||||
}
|
||||
log_i("LED set brightness: %d", value);
|
||||
return err;
|
||||
builtinLED->setBrightness(value);
|
||||
if (!builtinLED->write()) {
|
||||
err = ESP_FAIL;
|
||||
}
|
||||
log_i("LED set brightness: %d", value);
|
||||
return err;
|
||||
}
|
||||
|
||||
esp_err_t light_accessory_set_hue(void *led, uint8_t val)
|
||||
{
|
||||
esp_err_t err = ESP_OK;
|
||||
BuiltInLED *builtinLED = (BuiltInLED *) led;
|
||||
int value = REMAP_TO_RANGE(val, MATTER_HUE, STANDARD_HUE);
|
||||
led_indicator_color_hsv_t hsv = builtinLED->getHSV();
|
||||
hsv.h = value;
|
||||
builtinLED->setHSV(hsv);
|
||||
if (!builtinLED->write()) {
|
||||
err = ESP_FAIL;
|
||||
}
|
||||
log_i("LED set hue: %d", value);
|
||||
return err;
|
||||
esp_err_t light_accessory_set_hue(void *led, uint8_t val) {
|
||||
esp_err_t err = ESP_OK;
|
||||
BuiltInLED *builtinLED = (BuiltInLED *)led;
|
||||
int value = REMAP_TO_RANGE(val, MATTER_HUE, STANDARD_HUE);
|
||||
led_indicator_color_hsv_t hsv = builtinLED->getHSV();
|
||||
hsv.h = value;
|
||||
builtinLED->setHSV(hsv);
|
||||
if (!builtinLED->write()) {
|
||||
err = ESP_FAIL;
|
||||
}
|
||||
log_i("LED set hue: %d", value);
|
||||
return err;
|
||||
}
|
||||
|
||||
esp_err_t light_accessory_set_saturation(void *led, uint8_t val)
|
||||
{
|
||||
esp_err_t err = ESP_OK;
|
||||
BuiltInLED *builtinLED = (BuiltInLED *) led;
|
||||
int value = REMAP_TO_RANGE(val, MATTER_SATURATION, STANDARD_SATURATION);
|
||||
led_indicator_color_hsv_t hsv = builtinLED->getHSV();
|
||||
hsv.s = value;
|
||||
builtinLED->setHSV(hsv);
|
||||
if (!builtinLED->write()) {
|
||||
err = ESP_FAIL;
|
||||
}
|
||||
log_i("LED set saturation: %d", value);
|
||||
return err;
|
||||
esp_err_t light_accessory_set_saturation(void *led, uint8_t val) {
|
||||
esp_err_t err = ESP_OK;
|
||||
BuiltInLED *builtinLED = (BuiltInLED *)led;
|
||||
int value = REMAP_TO_RANGE(val, MATTER_SATURATION, STANDARD_SATURATION);
|
||||
led_indicator_color_hsv_t hsv = builtinLED->getHSV();
|
||||
hsv.s = value;
|
||||
builtinLED->setHSV(hsv);
|
||||
if (!builtinLED->write()) {
|
||||
err = ESP_FAIL;
|
||||
}
|
||||
log_i("LED set saturation: %d", value);
|
||||
return err;
|
||||
}
|
||||
|
||||
esp_err_t light_accessory_set_temperature(void *led, uint16_t val)
|
||||
{
|
||||
esp_err_t err = ESP_OK;
|
||||
BuiltInLED *builtinLED = (BuiltInLED *) led;
|
||||
uint32_t value = REMAP_TO_RANGE_INVERSE(val, STANDARD_TEMPERATURE_FACTOR);
|
||||
builtinLED->setTemperature(value);
|
||||
if (!builtinLED->write()) {
|
||||
err = ESP_FAIL;
|
||||
}
|
||||
log_i("LED set temperature: %ld", value);
|
||||
return err;
|
||||
esp_err_t light_accessory_set_temperature(void *led, uint16_t val) {
|
||||
esp_err_t err = ESP_OK;
|
||||
BuiltInLED *builtinLED = (BuiltInLED *)led;
|
||||
uint32_t value = REMAP_TO_RANGE_INVERSE(val, STANDARD_TEMPERATURE_FACTOR);
|
||||
builtinLED->setTemperature(value);
|
||||
if (!builtinLED->write()) {
|
||||
err = ESP_FAIL;
|
||||
}
|
||||
log_i("LED set temperature: %ld", value);
|
||||
return err;
|
||||
}
|
||||
|
||||
app_driver_handle_t light_accessory_init()
|
||||
{
|
||||
/* Initialize led */
|
||||
static BuiltInLED builtinLED;
|
||||
app_driver_handle_t light_accessory_init() {
|
||||
/* Initialize led */
|
||||
static BuiltInLED builtinLED;
|
||||
|
||||
const uint8_t pin = WS2812_PIN; // set your board WS2812b pin here
|
||||
builtinLED.begin(pin);
|
||||
return (app_driver_handle_t) &builtinLED;
|
||||
const uint8_t pin = WS2812_PIN; // set your board WS2812b pin here
|
||||
builtinLED.begin(pin);
|
||||
return (app_driver_handle_t)&builtinLED;
|
||||
}
|
||||
|
||||
@@ -3,9 +3,9 @@
|
||||
|
||||
// set your board WS2812b pin here (e.g. 48 is the default pin for the ESP32-S3 devkit)
|
||||
#ifndef CONFIG_WS2812_PIN
|
||||
#define WS2812_PIN 48 // ESP32-S3 DevKitC built-in LED
|
||||
#define WS2812_PIN 48 // ESP32-S3 DevKitC built-in LED
|
||||
#else
|
||||
#define WS2812_PIN CONFIG_WS2812_PIN // From sdkconfig.defaults.<soc>
|
||||
#define WS2812_PIN CONFIG_WS2812_PIN // From sdkconfig.defaults.<soc>
|
||||
#endif
|
||||
|
||||
#ifndef RGB_BUILTIN
|
||||
@@ -14,34 +14,34 @@
|
||||
|
||||
// Set your board button pin here (e.g. 0 is the default pin for the ESP32-S3 devkit)
|
||||
#ifndef CONFIG_BUTTON_PIN
|
||||
#define BUTTON_PIN 0 // ESP32-S3 DevKitC built-in button
|
||||
#define BUTTON_PIN 0 // ESP32-S3 DevKitC built-in button
|
||||
#else
|
||||
#define BUTTON_PIN CONFIG_BUTTON_PIN // From sdkconfig.defaults.<soc>
|
||||
#define BUTTON_PIN CONFIG_BUTTON_PIN // From sdkconfig.defaults.<soc>
|
||||
#endif
|
||||
|
||||
/** Standard max values (used for remapping attributes) */
|
||||
#define STANDARD_BRIGHTNESS 255
|
||||
#define STANDARD_HUE 360
|
||||
#define STANDARD_SATURATION 255
|
||||
#define STANDARD_BRIGHTNESS 255
|
||||
#define STANDARD_HUE 360
|
||||
#define STANDARD_SATURATION 255
|
||||
#define STANDARD_TEMPERATURE_FACTOR 1000000
|
||||
|
||||
/** Matter max values (used for remapping attributes) */
|
||||
#define MATTER_BRIGHTNESS 254
|
||||
#define MATTER_HUE 254
|
||||
#define MATTER_SATURATION 254
|
||||
#define MATTER_BRIGHTNESS 254
|
||||
#define MATTER_HUE 254
|
||||
#define MATTER_SATURATION 254
|
||||
#define MATTER_TEMPERATURE_FACTOR 1000000
|
||||
|
||||
/** Default attribute values used during initialization */
|
||||
#define DEFAULT_POWER true
|
||||
#define DEFAULT_POWER true
|
||||
#define DEFAULT_BRIGHTNESS 64
|
||||
#define DEFAULT_HUE 128
|
||||
#define DEFAULT_HUE 128
|
||||
#define DEFAULT_SATURATION 254
|
||||
|
||||
typedef void *app_driver_handle_t;
|
||||
|
||||
esp_err_t light_accessory_set_power(void *led, uint8_t val);
|
||||
esp_err_t light_accessory_set_power(void *led, uint8_t val);
|
||||
esp_err_t light_accessory_set_brightness(void *led, uint8_t val);
|
||||
esp_err_t light_accessory_set_hue(void *led, uint8_t val);
|
||||
esp_err_t light_accessory_set_saturation(void *led, uint8_t val);
|
||||
esp_err_t light_accessory_set_temperature(void *led, uint16_t val);
|
||||
app_driver_handle_t light_accessory_init();
|
||||
app_driver_handle_t light_accessory_init();
|
||||
|
||||
@@ -20,24 +20,18 @@
|
||||
#include <platform/ESP32/OpenthreadLauncher.h>
|
||||
#include "esp_openthread_types.h"
|
||||
|
||||
#define ESP_OPENTHREAD_DEFAULT_RADIO_CONFIG() \
|
||||
{ \
|
||||
.radio_mode = RADIO_MODE_NATIVE, \
|
||||
}
|
||||
#define ESP_OPENTHREAD_DEFAULT_RADIO_CONFIG() \
|
||||
{ .radio_mode = RADIO_MODE_NATIVE, }
|
||||
|
||||
#define ESP_OPENTHREAD_DEFAULT_HOST_CONFIG() \
|
||||
{ \
|
||||
.host_connection_mode = HOST_CONNECTION_MODE_NONE, \
|
||||
}
|
||||
#define ESP_OPENTHREAD_DEFAULT_HOST_CONFIG() \
|
||||
{ .host_connection_mode = HOST_CONNECTION_MODE_NONE, }
|
||||
|
||||
#define ESP_OPENTHREAD_DEFAULT_PORT_CONFIG() \
|
||||
{ \
|
||||
.storage_partition_name = "nvs", .netif_queue_size = 10, .task_queue_size = 10, \
|
||||
}
|
||||
#define ESP_OPENTHREAD_DEFAULT_PORT_CONFIG() \
|
||||
{ .storage_partition_name = "nvs", .netif_queue_size = 10, .task_queue_size = 10, }
|
||||
#endif
|
||||
|
||||
// set your board button pin here
|
||||
const uint8_t button_gpio = BUTTON_PIN; // GPIO BOOT Button
|
||||
const uint8_t button_gpio = BUTTON_PIN; // GPIO BOOT Button
|
||||
|
||||
uint16_t light_endpoint_id = 0;
|
||||
|
||||
@@ -54,290 +48,259 @@ extern const char decryption_key_end[] asm("_binary_esp_image_encryption_key_pem
|
||||
|
||||
static const char *s_decryption_key = decryption_key_start;
|
||||
static const uint16_t s_decryption_key_len = decryption_key_end - decryption_key_start;
|
||||
#endif // CONFIG_ENABLE_ENCRYPTED_OTA
|
||||
#endif // CONFIG_ENABLE_ENCRYPTED_OTA
|
||||
|
||||
bool isAccessoryCommissioned() {
|
||||
return chip::Server::GetInstance().GetFabricTable().FabricCount() > 0;
|
||||
return chip::Server::GetInstance().GetFabricTable().FabricCount() > 0;
|
||||
}
|
||||
|
||||
#if CHIP_DEVICE_CONFIG_ENABLE_WIFI_STATION
|
||||
bool isWifiConnected() {
|
||||
return chip::DeviceLayer::ConnectivityMgr().IsWiFiStationConnected();
|
||||
return chip::DeviceLayer::ConnectivityMgr().IsWiFiStationConnected();
|
||||
}
|
||||
#endif
|
||||
|
||||
#if CHIP_DEVICE_CONFIG_ENABLE_THREAD
|
||||
bool isThreadConnected() {
|
||||
return chip::DeviceLayer::ConnectivityMgr().IsThreadAttached();
|
||||
return chip::DeviceLayer::ConnectivityMgr().IsThreadAttached();
|
||||
}
|
||||
#endif
|
||||
|
||||
static void app_event_cb(const ChipDeviceEvent *event, intptr_t arg)
|
||||
{
|
||||
switch (event->Type) {
|
||||
static void app_event_cb(const ChipDeviceEvent *event, intptr_t arg) {
|
||||
switch (event->Type) {
|
||||
case chip::DeviceLayer::DeviceEventType::kInterfaceIpAddressChanged:
|
||||
log_i("Interface %s Address changed",
|
||||
event->InterfaceIpAddressChanged.Type == chip::DeviceLayer::InterfaceIpChangeType::kIpV4_Assigned ?
|
||||
"IPv4" : "IPV6" );
|
||||
break;
|
||||
log_i(
|
||||
"Interface %s Address changed", event->InterfaceIpAddressChanged.Type == chip::DeviceLayer::InterfaceIpChangeType::kIpV4_Assigned ? "IPv4" : "IPV6"
|
||||
);
|
||||
break;
|
||||
|
||||
case chip::DeviceLayer::DeviceEventType::kCommissioningComplete:
|
||||
log_i("Commissioning complete");
|
||||
break;
|
||||
case chip::DeviceLayer::DeviceEventType::kCommissioningComplete: log_i("Commissioning complete"); break;
|
||||
|
||||
case chip::DeviceLayer::DeviceEventType::kFailSafeTimerExpired:
|
||||
log_i("Commissioning failed, fail safe timer expired");
|
||||
break;
|
||||
case chip::DeviceLayer::DeviceEventType::kFailSafeTimerExpired: log_i("Commissioning failed, fail safe timer expired"); break;
|
||||
|
||||
case chip::DeviceLayer::DeviceEventType::kCommissioningSessionStarted:
|
||||
log_i("Commissioning session started");
|
||||
break;
|
||||
case chip::DeviceLayer::DeviceEventType::kCommissioningSessionStarted: log_i("Commissioning session started"); break;
|
||||
|
||||
case chip::DeviceLayer::DeviceEventType::kCommissioningSessionStopped:
|
||||
log_i("Commissioning session stopped");
|
||||
break;
|
||||
case chip::DeviceLayer::DeviceEventType::kCommissioningSessionStopped: log_i("Commissioning session stopped"); break;
|
||||
|
||||
case chip::DeviceLayer::DeviceEventType::kCommissioningWindowOpened:
|
||||
log_i("Commissioning window opened");
|
||||
break;
|
||||
case chip::DeviceLayer::DeviceEventType::kCommissioningWindowOpened: log_i("Commissioning window opened"); break;
|
||||
|
||||
case chip::DeviceLayer::DeviceEventType::kCommissioningWindowClosed:
|
||||
log_i("Commissioning window closed");
|
||||
break;
|
||||
case chip::DeviceLayer::DeviceEventType::kCommissioningWindowClosed: log_i("Commissioning window closed"); break;
|
||||
|
||||
case chip::DeviceLayer::DeviceEventType::kFabricRemoved:
|
||||
{
|
||||
log_i("Fabric removed successfully");
|
||||
if (chip::Server::GetInstance().GetFabricTable().FabricCount() == 0)
|
||||
{
|
||||
chip::CommissioningWindowManager & commissionMgr = chip::Server::GetInstance().GetCommissioningWindowManager();
|
||||
constexpr auto kTimeoutSeconds = chip::System::Clock::Seconds16(k_timeout_seconds);
|
||||
if (!commissionMgr.IsCommissioningWindowOpen())
|
||||
{
|
||||
/* After removing last fabric, this example does not remove the Wi-Fi credentials
|
||||
{
|
||||
log_i("Fabric removed successfully");
|
||||
if (chip::Server::GetInstance().GetFabricTable().FabricCount() == 0) {
|
||||
chip::CommissioningWindowManager &commissionMgr = chip::Server::GetInstance().GetCommissioningWindowManager();
|
||||
constexpr auto kTimeoutSeconds = chip::System::Clock::Seconds16(k_timeout_seconds);
|
||||
if (!commissionMgr.IsCommissioningWindowOpen()) {
|
||||
/* After removing last fabric, this example does not remove the Wi-Fi credentials
|
||||
* and still has IP connectivity so, only advertising on DNS-SD.
|
||||
*/
|
||||
CHIP_ERROR err = commissionMgr.OpenBasicCommissioningWindow(kTimeoutSeconds,
|
||||
chip::CommissioningWindowAdvertisement::kDnssdOnly);
|
||||
if (err != CHIP_NO_ERROR)
|
||||
{
|
||||
log_e("Failed to open commissioning window, err:%" CHIP_ERROR_FORMAT, err.Format());
|
||||
}
|
||||
}
|
||||
}
|
||||
break;
|
||||
CHIP_ERROR err = commissionMgr.OpenBasicCommissioningWindow(kTimeoutSeconds, chip::CommissioningWindowAdvertisement::kDnssdOnly);
|
||||
if (err != CHIP_NO_ERROR) {
|
||||
log_e("Failed to open commissioning window, err:%" CHIP_ERROR_FORMAT, err.Format());
|
||||
}
|
||||
}
|
||||
|
||||
case chip::DeviceLayer::DeviceEventType::kFabricWillBeRemoved:
|
||||
log_i("Fabric will be removed");
|
||||
break;
|
||||
|
||||
case chip::DeviceLayer::DeviceEventType::kFabricUpdated:
|
||||
log_i("Fabric is updated");
|
||||
break;
|
||||
|
||||
case chip::DeviceLayer::DeviceEventType::kFabricCommitted:
|
||||
log_i("Fabric is committed");
|
||||
break;
|
||||
|
||||
case chip::DeviceLayer::DeviceEventType::kBLEDeinitialized:
|
||||
log_i("BLE deinitialized and memory reclaimed");
|
||||
break;
|
||||
|
||||
default:
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
esp_err_t matter_light_attribute_update(app_driver_handle_t driver_handle, uint16_t endpoint_id, uint32_t cluster_id,
|
||||
uint32_t attribute_id, esp_matter_attr_val_t *val)
|
||||
{
|
||||
esp_err_t err = ESP_OK;
|
||||
if (endpoint_id == light_endpoint_id) {
|
||||
void *led = (void *)driver_handle;
|
||||
if (cluster_id == OnOff::Id) {
|
||||
if (attribute_id == OnOff::Attributes::OnOff::Id) {
|
||||
err = light_accessory_set_power(led, val->val.b);
|
||||
}
|
||||
} else if (cluster_id == LevelControl::Id) {
|
||||
if (attribute_id == LevelControl::Attributes::CurrentLevel::Id) {
|
||||
err = light_accessory_set_brightness(led, val->val.u8);
|
||||
}
|
||||
} else if (cluster_id == ColorControl::Id) {
|
||||
if (attribute_id == ColorControl::Attributes::CurrentHue::Id) {
|
||||
err = light_accessory_set_hue(led, val->val.u8);
|
||||
} else if (attribute_id == ColorControl::Attributes::CurrentSaturation::Id) {
|
||||
err = light_accessory_set_saturation(led, val->val.u8);
|
||||
} else if (attribute_id == ColorControl::Attributes::ColorTemperatureMireds::Id) {
|
||||
err = light_accessory_set_temperature(led, val->val.u16);
|
||||
}
|
||||
}
|
||||
}
|
||||
return err;
|
||||
}
|
||||
|
||||
esp_err_t matter_light_set_defaults(uint16_t endpoint_id)
|
||||
{
|
||||
esp_err_t err = ESP_OK;
|
||||
|
||||
void *led = endpoint::get_priv_data(endpoint_id);
|
||||
node_t *node = node::get();
|
||||
endpoint_t *endpoint = endpoint::get(node, endpoint_id);
|
||||
cluster_t *cluster = NULL;
|
||||
attribute_t *attribute = NULL;
|
||||
esp_matter_attr_val_t val = esp_matter_invalid(NULL);
|
||||
|
||||
/* Setting brightness */
|
||||
cluster = cluster::get(endpoint, LevelControl::Id);
|
||||
attribute = attribute::get(cluster, LevelControl::Attributes::CurrentLevel::Id);
|
||||
attribute::get_val(attribute, &val);
|
||||
err |= light_accessory_set_brightness(led, val.val.u8);
|
||||
|
||||
/* Setting color */
|
||||
cluster = cluster::get(endpoint, ColorControl::Id);
|
||||
attribute = attribute::get(cluster, ColorControl::Attributes::ColorMode::Id);
|
||||
attribute::get_val(attribute, &val);
|
||||
if (val.val.u8 == (uint8_t)ColorControl::ColorMode::kCurrentHueAndCurrentSaturation) {
|
||||
/* Setting hue */
|
||||
attribute = attribute::get(cluster, ColorControl::Attributes::CurrentHue::Id);
|
||||
attribute::get_val(attribute, &val);
|
||||
err |= light_accessory_set_hue(led, val.val.u8);
|
||||
/* Setting saturation */
|
||||
attribute = attribute::get(cluster, ColorControl::Attributes::CurrentSaturation::Id);
|
||||
attribute::get_val(attribute, &val);
|
||||
err |= light_accessory_set_saturation(led, val.val.u8);
|
||||
} else if (val.val.u8 == (uint8_t)ColorControl::ColorMode::kColorTemperature) {
|
||||
/* Setting temperature */
|
||||
attribute = attribute::get(cluster, ColorControl::Attributes::ColorTemperatureMireds::Id);
|
||||
attribute::get_val(attribute, &val);
|
||||
err |= light_accessory_set_temperature(led, val.val.u16);
|
||||
} else {
|
||||
log_e("Color mode not supported");
|
||||
}
|
||||
break;
|
||||
}
|
||||
|
||||
/* Setting power */
|
||||
cluster = cluster::get(endpoint, OnOff::Id);
|
||||
attribute = attribute::get(cluster, OnOff::Attributes::OnOff::Id);
|
||||
attribute::get_val(attribute, &val);
|
||||
err |= light_accessory_set_power(led, val.val.b);
|
||||
case chip::DeviceLayer::DeviceEventType::kFabricWillBeRemoved: log_i("Fabric will be removed"); break;
|
||||
|
||||
return err;
|
||||
case chip::DeviceLayer::DeviceEventType::kFabricUpdated: log_i("Fabric is updated"); break;
|
||||
|
||||
case chip::DeviceLayer::DeviceEventType::kFabricCommitted: log_i("Fabric is committed"); break;
|
||||
|
||||
case chip::DeviceLayer::DeviceEventType::kBLEDeinitialized: log_i("BLE deinitialized and memory reclaimed"); break;
|
||||
|
||||
default: break;
|
||||
}
|
||||
}
|
||||
|
||||
void button_driver_init()
|
||||
{
|
||||
/* Initialize button */
|
||||
pinMode(button_gpio, INPUT_PULLUP);
|
||||
esp_err_t matter_light_attribute_update(
|
||||
app_driver_handle_t driver_handle, uint16_t endpoint_id, uint32_t cluster_id, uint32_t attribute_id, esp_matter_attr_val_t *val
|
||||
) {
|
||||
esp_err_t err = ESP_OK;
|
||||
if (endpoint_id == light_endpoint_id) {
|
||||
void *led = (void *)driver_handle;
|
||||
if (cluster_id == OnOff::Id) {
|
||||
if (attribute_id == OnOff::Attributes::OnOff::Id) {
|
||||
err = light_accessory_set_power(led, val->val.b);
|
||||
}
|
||||
} else if (cluster_id == LevelControl::Id) {
|
||||
if (attribute_id == LevelControl::Attributes::CurrentLevel::Id) {
|
||||
err = light_accessory_set_brightness(led, val->val.u8);
|
||||
}
|
||||
} else if (cluster_id == ColorControl::Id) {
|
||||
if (attribute_id == ColorControl::Attributes::CurrentHue::Id) {
|
||||
err = light_accessory_set_hue(led, val->val.u8);
|
||||
} else if (attribute_id == ColorControl::Attributes::CurrentSaturation::Id) {
|
||||
err = light_accessory_set_saturation(led, val->val.u8);
|
||||
} else if (attribute_id == ColorControl::Attributes::ColorTemperatureMireds::Id) {
|
||||
err = light_accessory_set_temperature(led, val->val.u16);
|
||||
}
|
||||
}
|
||||
}
|
||||
return err;
|
||||
}
|
||||
|
||||
esp_err_t matter_light_set_defaults(uint16_t endpoint_id) {
|
||||
esp_err_t err = ESP_OK;
|
||||
|
||||
void *led = endpoint::get_priv_data(endpoint_id);
|
||||
node_t *node = node::get();
|
||||
endpoint_t *endpoint = endpoint::get(node, endpoint_id);
|
||||
cluster_t *cluster = NULL;
|
||||
attribute_t *attribute = NULL;
|
||||
esp_matter_attr_val_t val = esp_matter_invalid(NULL);
|
||||
|
||||
/* Setting brightness */
|
||||
cluster = cluster::get(endpoint, LevelControl::Id);
|
||||
attribute = attribute::get(cluster, LevelControl::Attributes::CurrentLevel::Id);
|
||||
attribute::get_val(attribute, &val);
|
||||
err |= light_accessory_set_brightness(led, val.val.u8);
|
||||
|
||||
/* Setting color */
|
||||
cluster = cluster::get(endpoint, ColorControl::Id);
|
||||
attribute = attribute::get(cluster, ColorControl::Attributes::ColorMode::Id);
|
||||
attribute::get_val(attribute, &val);
|
||||
if (val.val.u8 == (uint8_t)ColorControl::ColorMode::kCurrentHueAndCurrentSaturation) {
|
||||
/* Setting hue */
|
||||
attribute = attribute::get(cluster, ColorControl::Attributes::CurrentHue::Id);
|
||||
attribute::get_val(attribute, &val);
|
||||
err |= light_accessory_set_hue(led, val.val.u8);
|
||||
/* Setting saturation */
|
||||
attribute = attribute::get(cluster, ColorControl::Attributes::CurrentSaturation::Id);
|
||||
attribute::get_val(attribute, &val);
|
||||
err |= light_accessory_set_saturation(led, val.val.u8);
|
||||
} else if (val.val.u8 == (uint8_t)ColorControl::ColorMode::kColorTemperature) {
|
||||
/* Setting temperature */
|
||||
attribute = attribute::get(cluster, ColorControl::Attributes::ColorTemperatureMireds::Id);
|
||||
attribute::get_val(attribute, &val);
|
||||
err |= light_accessory_set_temperature(led, val.val.u16);
|
||||
} else {
|
||||
log_e("Color mode not supported");
|
||||
}
|
||||
|
||||
/* Setting power */
|
||||
cluster = cluster::get(endpoint, OnOff::Id);
|
||||
attribute = attribute::get(cluster, OnOff::Attributes::OnOff::Id);
|
||||
attribute::get_val(attribute, &val);
|
||||
err |= light_accessory_set_power(led, val.val.b);
|
||||
|
||||
return err;
|
||||
}
|
||||
|
||||
void button_driver_init() {
|
||||
/* Initialize button */
|
||||
pinMode(button_gpio, INPUT_PULLUP);
|
||||
}
|
||||
|
||||
// This callback is called for every attribute update. The callback implementation shall
|
||||
// handle the desired attributes and return an appropriate error code. If the attribute
|
||||
// is not of your interest, please do not return an error code and strictly return ESP_OK.
|
||||
static esp_err_t app_attribute_update_cb(attribute::callback_type_t type, uint16_t endpoint_id, uint32_t cluster_id,
|
||||
uint32_t attribute_id, esp_matter_attr_val_t *val, void *priv_data)
|
||||
{
|
||||
esp_err_t err = ESP_OK;
|
||||
static esp_err_t app_attribute_update_cb(
|
||||
attribute::callback_type_t type, uint16_t endpoint_id, uint32_t cluster_id, uint32_t attribute_id, esp_matter_attr_val_t *val, void *priv_data
|
||||
) {
|
||||
esp_err_t err = ESP_OK;
|
||||
|
||||
if (type == PRE_UPDATE) {
|
||||
/* Driver update */
|
||||
app_driver_handle_t driver_handle = (app_driver_handle_t)priv_data;
|
||||
err = matter_light_attribute_update(driver_handle, endpoint_id, cluster_id, attribute_id, val);
|
||||
}
|
||||
if (type == PRE_UPDATE) {
|
||||
/* Driver update */
|
||||
app_driver_handle_t driver_handle = (app_driver_handle_t)priv_data;
|
||||
err = matter_light_attribute_update(driver_handle, endpoint_id, cluster_id, attribute_id, val);
|
||||
}
|
||||
|
||||
return err;
|
||||
return err;
|
||||
}
|
||||
|
||||
// This callback is invoked when clients interact with the Identify Cluster.
|
||||
// In the callback implementation, an endpoint can identify itself. (e.g., by flashing an LED or light).
|
||||
static esp_err_t app_identification_cb(identification::callback_type_t type, uint16_t endpoint_id, uint8_t effect_id,
|
||||
uint8_t effect_variant, void *priv_data)
|
||||
{
|
||||
log_i("Identification callback: type: %u, effect: %u, variant: %u", type, effect_id, effect_variant);
|
||||
return ESP_OK;
|
||||
static esp_err_t app_identification_cb(identification::callback_type_t type, uint16_t endpoint_id, uint8_t effect_id, uint8_t effect_variant, void *priv_data) {
|
||||
log_i("Identification callback: type: %u, effect: %u, variant: %u", type, effect_id, effect_variant);
|
||||
return ESP_OK;
|
||||
}
|
||||
|
||||
void setup()
|
||||
{
|
||||
esp_err_t err = ESP_OK;
|
||||
void setup() {
|
||||
esp_err_t err = ESP_OK;
|
||||
|
||||
/* Initialize driver */
|
||||
app_driver_handle_t light_handle = light_accessory_init();
|
||||
button_driver_init();
|
||||
/* Initialize driver */
|
||||
app_driver_handle_t light_handle = light_accessory_init();
|
||||
button_driver_init();
|
||||
|
||||
/* Create a Matter node and add the mandatory Root Node device type on endpoint 0 */
|
||||
node::config_t node_config;
|
||||
/* Create a Matter node and add the mandatory Root Node device type on endpoint 0 */
|
||||
node::config_t node_config;
|
||||
|
||||
// node handle can be used to add/modify other endpoints.
|
||||
node_t *node = node::create(&node_config, app_attribute_update_cb, app_identification_cb);
|
||||
if (node == nullptr) {
|
||||
log_e("Failed to create Matter node");
|
||||
abort();
|
||||
}
|
||||
// node handle can be used to add/modify other endpoints.
|
||||
node_t *node = node::create(&node_config, app_attribute_update_cb, app_identification_cb);
|
||||
if (node == nullptr) {
|
||||
log_e("Failed to create Matter node");
|
||||
abort();
|
||||
}
|
||||
|
||||
extended_color_light::config_t light_config;
|
||||
light_config.on_off.on_off = DEFAULT_POWER;
|
||||
light_config.on_off.lighting.start_up_on_off = nullptr;
|
||||
light_config.level_control.current_level = DEFAULT_BRIGHTNESS;
|
||||
light_config.level_control.lighting.start_up_current_level = DEFAULT_BRIGHTNESS;
|
||||
light_config.color_control.color_mode = (uint8_t)ColorControl::ColorMode::kColorTemperature;
|
||||
light_config.color_control.enhanced_color_mode = (uint8_t)ColorControl::ColorMode::kColorTemperature;
|
||||
light_config.color_control.color_temperature.startup_color_temperature_mireds = nullptr;
|
||||
extended_color_light::config_t light_config;
|
||||
light_config.on_off.on_off = DEFAULT_POWER;
|
||||
light_config.on_off.lighting.start_up_on_off = nullptr;
|
||||
light_config.level_control.current_level = DEFAULT_BRIGHTNESS;
|
||||
light_config.level_control.lighting.start_up_current_level = DEFAULT_BRIGHTNESS;
|
||||
light_config.color_control.color_mode = (uint8_t)ColorControl::ColorMode::kColorTemperature;
|
||||
light_config.color_control.enhanced_color_mode = (uint8_t)ColorControl::ColorMode::kColorTemperature;
|
||||
light_config.color_control.color_temperature.startup_color_temperature_mireds = nullptr;
|
||||
|
||||
// endpoint handles can be used to add/modify clusters.
|
||||
endpoint_t *endpoint = extended_color_light::create(node, &light_config, ENDPOINT_FLAG_NONE, light_handle);
|
||||
if (endpoint == nullptr) {
|
||||
log_e("Failed to create extended color light endpoint");
|
||||
abort();
|
||||
}
|
||||
// endpoint handles can be used to add/modify clusters.
|
||||
endpoint_t *endpoint = extended_color_light::create(node, &light_config, ENDPOINT_FLAG_NONE, light_handle);
|
||||
if (endpoint == nullptr) {
|
||||
log_e("Failed to create extended color light endpoint");
|
||||
abort();
|
||||
}
|
||||
|
||||
light_endpoint_id = endpoint::get_id(endpoint);
|
||||
log_i("Light created with endpoint_id %d", light_endpoint_id);
|
||||
light_endpoint_id = endpoint::get_id(endpoint);
|
||||
log_i("Light created with endpoint_id %d", light_endpoint_id);
|
||||
|
||||
/* Mark deferred persistence for some attributes that might be changed rapidly */
|
||||
cluster_t *level_control_cluster = cluster::get(endpoint, LevelControl::Id);
|
||||
attribute_t *current_level_attribute = attribute::get(level_control_cluster, LevelControl::Attributes::CurrentLevel::Id);
|
||||
attribute::set_deferred_persistence(current_level_attribute);
|
||||
/* Mark deferred persistence for some attributes that might be changed rapidly */
|
||||
cluster_t *level_control_cluster = cluster::get(endpoint, LevelControl::Id);
|
||||
attribute_t *current_level_attribute = attribute::get(level_control_cluster, LevelControl::Attributes::CurrentLevel::Id);
|
||||
attribute::set_deferred_persistence(current_level_attribute);
|
||||
|
||||
cluster_t *color_control_cluster = cluster::get(endpoint, ColorControl::Id);
|
||||
attribute_t *current_x_attribute = attribute::get(color_control_cluster, ColorControl::Attributes::CurrentX::Id);
|
||||
attribute::set_deferred_persistence(current_x_attribute);
|
||||
attribute_t *current_y_attribute = attribute::get(color_control_cluster, ColorControl::Attributes::CurrentY::Id);
|
||||
attribute::set_deferred_persistence(current_y_attribute);
|
||||
attribute_t *color_temp_attribute = attribute::get(color_control_cluster, ColorControl::Attributes::ColorTemperatureMireds::Id);
|
||||
attribute::set_deferred_persistence(color_temp_attribute);
|
||||
cluster_t *color_control_cluster = cluster::get(endpoint, ColorControl::Id);
|
||||
attribute_t *current_x_attribute = attribute::get(color_control_cluster, ColorControl::Attributes::CurrentX::Id);
|
||||
attribute::set_deferred_persistence(current_x_attribute);
|
||||
attribute_t *current_y_attribute = attribute::get(color_control_cluster, ColorControl::Attributes::CurrentY::Id); // codespell:ignore
|
||||
attribute::set_deferred_persistence(current_y_attribute);
|
||||
attribute_t *color_temp_attribute = attribute::get(color_control_cluster, ColorControl::Attributes::ColorTemperatureMireds::Id);
|
||||
attribute::set_deferred_persistence(color_temp_attribute);
|
||||
|
||||
#if CHIP_DEVICE_CONFIG_ENABLE_THREAD
|
||||
/* Set OpenThread platform config */
|
||||
esp_openthread_platform_config_t config = {
|
||||
.radio_config = ESP_OPENTHREAD_DEFAULT_RADIO_CONFIG(),
|
||||
.host_config = ESP_OPENTHREAD_DEFAULT_HOST_CONFIG(),
|
||||
.port_config = ESP_OPENTHREAD_DEFAULT_PORT_CONFIG(),
|
||||
};
|
||||
set_openthread_platform_config(&config);
|
||||
/* Set OpenThread platform config */
|
||||
esp_openthread_platform_config_t config = {
|
||||
.radio_config = ESP_OPENTHREAD_DEFAULT_RADIO_CONFIG(),
|
||||
.host_config = ESP_OPENTHREAD_DEFAULT_HOST_CONFIG(),
|
||||
.port_config = ESP_OPENTHREAD_DEFAULT_PORT_CONFIG(),
|
||||
};
|
||||
set_openthread_platform_config(&config);
|
||||
#endif
|
||||
|
||||
/* Matter start */
|
||||
err = esp_matter::start(app_event_cb);
|
||||
if (err != ESP_OK) {
|
||||
log_e("Failed to start Matter, err:%d", err);
|
||||
abort();
|
||||
}
|
||||
/* Matter start */
|
||||
err = esp_matter::start(app_event_cb);
|
||||
if (err != ESP_OK) {
|
||||
log_e("Failed to start Matter, err:%d", err);
|
||||
abort();
|
||||
}
|
||||
|
||||
#if CONFIG_ENABLE_ENCRYPTED_OTA
|
||||
err = esp_matter_ota_requestor_encrypted_init(s_decryption_key, s_decryption_key_len);
|
||||
if (err != ESP_OK) {
|
||||
log_e("Failed to initialized the encrypted OTA, err: %d", err);
|
||||
abort();
|
||||
}
|
||||
#endif // CONFIG_ENABLE_ENCRYPTED_OTA
|
||||
err = esp_matter_ota_requestor_encrypted_init(s_decryption_key, s_decryption_key_len);
|
||||
if (err != ESP_OK) {
|
||||
log_e("Failed to initialized the encrypted OTA, err: %d", err);
|
||||
abort();
|
||||
}
|
||||
#endif // CONFIG_ENABLE_ENCRYPTED_OTA
|
||||
|
||||
#if CONFIG_ENABLE_CHIP_SHELL
|
||||
esp_matter::console::diagnostics_register_commands();
|
||||
esp_matter::console::wifi_register_commands();
|
||||
esp_matter::console::diagnostics_register_commands();
|
||||
esp_matter::console::wifi_register_commands();
|
||||
#if CONFIG_OPENTHREAD_CLI
|
||||
esp_matter::console::otcli_register_commands();
|
||||
esp_matter::console::otcli_register_commands();
|
||||
#endif
|
||||
esp_matter::console::init();
|
||||
esp_matter::console::init();
|
||||
#endif
|
||||
}
|
||||
|
||||
@@ -346,10 +309,10 @@ void loop() {
|
||||
static bool button_state = false;
|
||||
static bool started = false;
|
||||
|
||||
if(!isAccessoryCommissioned()) {
|
||||
if (!isAccessoryCommissioned()) {
|
||||
log_w("Accessory not commissioned yet. Waiting for commissioning.");
|
||||
#ifdef RGB_BUILTIN
|
||||
rgbLedWrite(RGB_BUILTIN, 48, 0, 20); // Purple indicates accessory not commissioned
|
||||
rgbLedWrite(RGB_BUILTIN, 48, 0, 20); // Purple indicates accessory not commissioned
|
||||
#endif
|
||||
delay(5000);
|
||||
return;
|
||||
@@ -359,7 +322,7 @@ void loop() {
|
||||
if (!isWifiConnected()) {
|
||||
log_w("Wi-Fi not connected yet. Waiting for connection.");
|
||||
#ifdef RGB_BUILTIN
|
||||
rgbLedWrite(RGB_BUILTIN, 48, 20, 0); // Orange indicates accessory not connected to Wi-Fi
|
||||
rgbLedWrite(RGB_BUILTIN, 48, 20, 0); // Orange indicates accessory not connected to Wi-Fi
|
||||
#endif
|
||||
delay(5000);
|
||||
return;
|
||||
@@ -370,7 +333,7 @@ void loop() {
|
||||
if (!isThreadConnected()) {
|
||||
log_w("Thread not connected yet. Waiting for connection.");
|
||||
#ifdef RGB_BUILTIN
|
||||
rgbLedWrite(RGB_BUILTIN, 0, 20, 48); // Blue indicates accessory not connected to Trhead
|
||||
rgbLedWrite(RGB_BUILTIN, 0, 20, 48); // Blue indicates accessory not connected to Trhead
|
||||
#endif
|
||||
delay(5000);
|
||||
return;
|
||||
@@ -389,10 +352,10 @@ void loop() {
|
||||
// Check if the button is pressed and toggle the light right away
|
||||
if (digitalRead(button_gpio) == LOW && !button_state) {
|
||||
// deals with button debounce
|
||||
button_time_stamp = millis(); // record the time while the button is pressed.
|
||||
button_state = true; // pressed.
|
||||
button_time_stamp = millis(); // record the time while the button is pressed.
|
||||
button_state = true; // pressed.
|
||||
|
||||
// Toggle button is pressed - toggle the light
|
||||
// Toggle button is pressed - toggle the light
|
||||
log_i("Toggle button pressed");
|
||||
|
||||
endpoint_t *endpoint = endpoint::get(node::get(), light_endpoint_id);
|
||||
@@ -408,14 +371,14 @@ void loop() {
|
||||
// Check if the button is released and handle the factory reset
|
||||
uint32_t time_diff = millis() - button_time_stamp;
|
||||
if (button_state && time_diff > 100 && digitalRead(button_gpio) == HIGH) {
|
||||
button_state = false; // released. It can be pressed again after 100ms debounce.
|
||||
button_state = false; // released. It can be pressed again after 100ms debounce.
|
||||
|
||||
// Factory reset is triggered if the button is pressed for more than 10 seconds
|
||||
if (time_diff > 10000) {
|
||||
log_i("Factory reset triggered. Light will retored to factory settings.");
|
||||
esp_matter::factory_reset();
|
||||
log_i("Factory reset triggered. Light will restored to factory settings.");
|
||||
esp_matter::factory_reset();
|
||||
}
|
||||
}
|
||||
|
||||
delay(50); // WDT is happier with a delay
|
||||
delay(50); // WDT is happier with a delay
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user