mirror of
https://github.com/arendst/Tasmota.git
synced 2025-07-25 19:56:30 +00:00
Merge branch 'development' into pre-release-9.5.0
This commit is contained in:
commit
cbc74ab873
@ -165,6 +165,7 @@ static binstance* newobjself(bvm *vm, bclass *c)
|
|||||||
while (v < end) { var_setnil(v); ++v; }
|
while (v < end) { var_setnil(v); ++v; }
|
||||||
obj->_class = c;
|
obj->_class = c;
|
||||||
obj->super = NULL;
|
obj->super = NULL;
|
||||||
|
obj->sub = NULL;
|
||||||
}
|
}
|
||||||
return obj;
|
return obj;
|
||||||
}
|
}
|
||||||
@ -178,6 +179,7 @@ static binstance* newobject(bvm *vm, bclass *c)
|
|||||||
be_incrtop(vm); /* protect new objects from GC */
|
be_incrtop(vm); /* protect new objects from GC */
|
||||||
for (c = c->super; c; c = c->super) {
|
for (c = c->super; c; c = c->super) {
|
||||||
prev->super = newobjself(vm, c);
|
prev->super = newobjself(vm, c);
|
||||||
|
prev->super->sub = prev;
|
||||||
prev = prev->super;
|
prev = prev->super;
|
||||||
}
|
}
|
||||||
be_stackpop(vm, 1);
|
be_stackpop(vm, 1);
|
||||||
|
@ -18,11 +18,13 @@
|
|||||||
#define be_class_members(cl) ((cl)->members)
|
#define be_class_members(cl) ((cl)->members)
|
||||||
#define be_class_super(cl) ((cl)->super)
|
#define be_class_super(cl) ((cl)->super)
|
||||||
#define be_class_setsuper(self, sup) ((self)->super = (sup))
|
#define be_class_setsuper(self, sup) ((self)->super = (sup))
|
||||||
|
#define be_class_setsub(self, sub) ((self)->sub = (sub))
|
||||||
#define be_instance_name(obj) ((obj)->_class->name)
|
#define be_instance_name(obj) ((obj)->_class->name)
|
||||||
#define be_instance_class(obj) ((obj)->_class)
|
#define be_instance_class(obj) ((obj)->_class)
|
||||||
#define be_instance_members(obj) ((obj)->members)
|
#define be_instance_members(obj) ((obj)->members)
|
||||||
#define be_instance_member_count(obj) ((obj)->_class->nvar)
|
#define be_instance_member_count(obj) ((obj)->_class->nvar)
|
||||||
#define be_instance_super(obj) ((obj)->super)
|
#define be_instance_super(obj) ((obj)->super)
|
||||||
|
#define be_instance_sub(obj) ((obj)->sub)
|
||||||
|
|
||||||
struct bclass {
|
struct bclass {
|
||||||
bcommon_header;
|
bcommon_header;
|
||||||
@ -41,6 +43,7 @@ struct bclass {
|
|||||||
struct binstance {
|
struct binstance {
|
||||||
bcommon_header;
|
bcommon_header;
|
||||||
struct binstance *super;
|
struct binstance *super;
|
||||||
|
struct binstance *sub;
|
||||||
bclass *_class;
|
bclass *_class;
|
||||||
bgcobject *gray; /* for gc gray list */
|
bgcobject *gray; /* for gc gray list */
|
||||||
bvalue members[1]; /* members variable data field */
|
bvalue members[1]; /* members variable data field */
|
||||||
|
@ -54,17 +54,22 @@ void be_initupvals(bvm *vm, bclosure *cl)
|
|||||||
void be_upvals_close(bvm *vm, bvalue *level)
|
void be_upvals_close(bvm *vm, bvalue *level)
|
||||||
{
|
{
|
||||||
bupval *node = vm->upvalist, *next;
|
bupval *node = vm->upvalist, *next;
|
||||||
while (node && node->value >= level) {
|
bupval **prev = &vm->upvalist;
|
||||||
|
while (node) {
|
||||||
next = node->u.next;
|
next = node->u.next;
|
||||||
if (!node->refcnt) {
|
if (node->value >= level) {
|
||||||
be_free(vm, node, sizeof(bupval));
|
if (!node->refcnt) {
|
||||||
|
be_free(vm, node, sizeof(bupval));
|
||||||
|
} else {
|
||||||
|
node->u.value = *node->value; /* move value to upvalue slot */
|
||||||
|
node->value = &node->u.value;
|
||||||
|
}
|
||||||
|
*prev = next; /* remove from linked list */
|
||||||
} else {
|
} else {
|
||||||
node->u.value = *node->value; /* move value to upvalue slot */
|
prev = &node->u.next;
|
||||||
node->value = &node->u.value;
|
|
||||||
}
|
}
|
||||||
node = next;
|
node = next;
|
||||||
}
|
}
|
||||||
vm->upvalist = node;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void be_release_upvalues(bvm *vm, bclosure *cl)
|
void be_release_upvalues(bvm *vm, bclosure *cl)
|
||||||
|
@ -779,6 +779,11 @@ newframe: /* a new call frame */
|
|||||||
int type = obj_attribute(vm, b, c, a);
|
int type = obj_attribute(vm, b, c, a);
|
||||||
reg = vm->reg;
|
reg = vm->reg;
|
||||||
if (basetype(type) == BE_FUNCTION) {
|
if (basetype(type) == BE_FUNCTION) {
|
||||||
|
/* check if the object is a superinstance, if so get the lowest possible subclass */
|
||||||
|
while (obj->sub) {
|
||||||
|
obj = obj->sub;
|
||||||
|
}
|
||||||
|
var_setobj(&self, var_type(&self), obj); /* replace superinstance by lowest subinstance */
|
||||||
a[1] = self;
|
a[1] = self;
|
||||||
} else {
|
} else {
|
||||||
vm_error(vm, "attribute_error",
|
vm_error(vm, "attribute_error",
|
||||||
|
13
lib/libesp32/Berry/tests/closure.be
Normal file
13
lib/libesp32/Berry/tests/closure.be
Normal file
@ -0,0 +1,13 @@
|
|||||||
|
#- test for issue #105 -#
|
||||||
|
|
||||||
|
l=[]
|
||||||
|
def tick()
|
||||||
|
var start=100
|
||||||
|
for i : 1..3
|
||||||
|
l.push(def () return [i, start] end)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
tick()
|
||||||
|
assert(l[0]() == [1, 100])
|
||||||
|
assert(l[1]() == [2, 100])
|
||||||
|
assert(l[2]() == [3, 100])
|
@ -1017,7 +1017,9 @@ void WebSliderColdWarm(void)
|
|||||||
|
|
||||||
void HandleRoot(void)
|
void HandleRoot(void)
|
||||||
{
|
{
|
||||||
|
#ifndef NO_CAPTIVE_PORTAL
|
||||||
if (CaptivePortal()) { return; } // If captive portal redirect instead of displaying the page.
|
if (CaptivePortal()) { return; } // If captive portal redirect instead of displaying the page.
|
||||||
|
#endif // NO_CAPTIVE_PORTAL
|
||||||
|
|
||||||
if (Webserver->hasArg(F("rst"))) {
|
if (Webserver->hasArg(F("rst"))) {
|
||||||
WebRestart(0);
|
WebRestart(0);
|
||||||
@ -2941,8 +2943,9 @@ void HandleConsoleRefresh(void)
|
|||||||
void HandleNotFound(void)
|
void HandleNotFound(void)
|
||||||
{
|
{
|
||||||
// AddLog(LOG_LEVEL_DEBUG, PSTR(D_LOG_HTTP "Not found (%s)"), Webserver->uri().c_str());
|
// AddLog(LOG_LEVEL_DEBUG, PSTR(D_LOG_HTTP "Not found (%s)"), Webserver->uri().c_str());
|
||||||
|
#ifndef NO_CAPTIVE_PORTAL
|
||||||
if (CaptivePortal()) { return; } // If captive portal redirect instead of displaying the error page.
|
if (CaptivePortal()) { return; } // If captive portal redirect instead of displaying the error page.
|
||||||
|
#endif // NO_CAPTIVE_PORTAL
|
||||||
|
|
||||||
#ifdef USE_EMULATION
|
#ifdef USE_EMULATION
|
||||||
#ifdef USE_EMULATION_HUE
|
#ifdef USE_EMULATION_HUE
|
||||||
@ -2962,6 +2965,7 @@ void HandleNotFound(void)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#ifndef NO_CAPTIVE_PORTAL
|
||||||
/* Redirect to captive portal if we got a request for another domain. Return true in that case so the page handler do not try to handle the request again. */
|
/* Redirect to captive portal if we got a request for another domain. Return true in that case so the page handler do not try to handle the request again. */
|
||||||
bool CaptivePortal(void)
|
bool CaptivePortal(void)
|
||||||
{
|
{
|
||||||
@ -2976,6 +2980,7 @@ bool CaptivePortal(void)
|
|||||||
}
|
}
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
#endif // NO_CAPTIVE_PORTAL
|
||||||
|
|
||||||
/*********************************************************************************************/
|
/*********************************************************************************************/
|
||||||
|
|
||||||
|
@ -2497,11 +2497,18 @@ void CmndSupportColor(void)
|
|||||||
else {
|
else {
|
||||||
#endif // USE_LIGHT_PALETTE
|
#endif // USE_LIGHT_PALETTE
|
||||||
uint32_t old_bri = light_state.getBri();
|
uint32_t old_bri = light_state.getBri();
|
||||||
|
uint32_t old_bri_rgb = light_state.getBriRGB();
|
||||||
// change all channels to specified values
|
// change all channels to specified values
|
||||||
light_controller.changeChannels(Light.entry_color);
|
light_controller.changeChannels(Light.entry_color);
|
||||||
if (2 == XdrvMailbox.index) {
|
if (2 == XdrvMailbox.index) {
|
||||||
// If Color2, set back old brightness
|
// If Color2, set back old brightness
|
||||||
LightSetBriScaled(old_bri);
|
if (light_controller.isCTRGBLinked()) {
|
||||||
|
// RGB and white are linked, adjust brightness of all channels
|
||||||
|
LightSetBriScaled(old_bri);
|
||||||
|
} else {
|
||||||
|
// RGB and white are unlinked, adjust brightness only of RGB channels
|
||||||
|
LightSetBri(Light.device, old_bri_rgb);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
#ifdef USE_LIGHT_PALETTE
|
#ifdef USE_LIGHT_PALETTE
|
||||||
}
|
}
|
||||||
|
@ -593,7 +593,7 @@ const char HTTP_BERRY_FORM_CMND[] PROGMEM =
|
|||||||
"<br>"
|
"<br>"
|
||||||
"<div contenteditable='false' class='br0 bro' readonly id='t1' cols='340' wrap='off'>"
|
"<div contenteditable='false' class='br0 bro' readonly id='t1' cols='340' wrap='off'>"
|
||||||
"<div class='br1'>Welcome to the Berry Scripting console. "
|
"<div class='br1'>Welcome to the Berry Scripting console. "
|
||||||
"Check the <a href='https://tasmota.github.io/docs/Berry-Scripting/' target='_blank'>documentation</a>."
|
"Check the <a href='https://tasmota.github.io/docs/Berry/' target='_blank'>documentation</a>."
|
||||||
"</div>"
|
"</div>"
|
||||||
"</div>"
|
"</div>"
|
||||||
// "<textarea readonly id='t1' cols='340' wrap='off'></textarea>"
|
// "<textarea readonly id='t1' cols='340' wrap='off'></textarea>"
|
||||||
|
@ -1408,22 +1408,16 @@ class BLEAdvCallbacks: public NimBLEAdvertisedDeviceCallbacks {
|
|||||||
|
|
||||||
// call anyone who asked about advertisements
|
// call anyone who asked about advertisements
|
||||||
for (int i = 0; i < advertismentCallbacks.size(); i++) {
|
for (int i = 0; i < advertismentCallbacks.size(); i++) {
|
||||||
try {
|
ADVERTISMENT_CALLBACK* pFN;
|
||||||
ADVERTISMENT_CALLBACK* pFN;
|
pFN = advertismentCallbacks[i];
|
||||||
pFN = advertismentCallbacks[i];
|
int res = pFN(&BLEAdvertisment);
|
||||||
int res = pFN(&BLEAdvertisment);
|
|
||||||
|
|
||||||
// if this callback wants to stop here, then do so.
|
// if this callback wants to stop here, then do so.
|
||||||
if (1 == res) break;
|
if (1 == res) break;
|
||||||
|
|
||||||
// if this callback wants to kill this device
|
// if this callback wants to kill this device
|
||||||
if (2 == res) {
|
if (2 == res) {
|
||||||
//BLEScan->erase(address);
|
//BLEScan->erase(address);
|
||||||
}
|
|
||||||
} catch(const std::exception& e){
|
|
||||||
#ifdef BLE_ESP32_DEBUG
|
|
||||||
AddLog(LOG_LEVEL_ERROR,PSTR("BLE: exception in advertismentCallbacks"));
|
|
||||||
#endif
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1444,17 +1438,11 @@ static void BLEscanEndedCB(NimBLEScanResults results){
|
|||||||
if (BLEDebugMode > 0) AddLog(LOG_LEVEL_DEBUG,PSTR("BLE: Scan ended"));
|
if (BLEDebugMode > 0) AddLog(LOG_LEVEL_DEBUG,PSTR("BLE: Scan ended"));
|
||||||
#endif
|
#endif
|
||||||
for (int i = 0; i < scancompleteCallbacks.size(); i++){
|
for (int i = 0; i < scancompleteCallbacks.size(); i++){
|
||||||
try {
|
SCANCOMPLETE_CALLBACK *pFn = scancompleteCallbacks[i];
|
||||||
SCANCOMPLETE_CALLBACK *pFn = scancompleteCallbacks[i];
|
int callbackres = pFn(results);
|
||||||
int callbackres = pFn(results);
|
|
||||||
#ifdef BLE_ESP32_DEBUG
|
#ifdef BLE_ESP32_DEBUG
|
||||||
if (BLEDebugMode > 0) AddLog(LOG_LEVEL_DEBUG,PSTR("BLE: scancompleteCallbacks %d %d"), i, callbackres);
|
if (BLEDebugMode > 0) AddLog(LOG_LEVEL_DEBUG,PSTR("BLE: scancompleteCallbacks %d %d"), i, callbackres);
|
||||||
#endif
|
#endif
|
||||||
} catch(const std::exception& e){
|
|
||||||
#ifdef BLE_ESP32_DEBUG
|
|
||||||
AddLog(LOG_LEVEL_ERROR,PSTR("BLE: exception in operationsCallbacks"));
|
|
||||||
#endif
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
BLERunningScan = 2;
|
BLERunningScan = 2;
|
||||||
@ -1659,23 +1647,17 @@ static void BLETaskStopStartNimBLE(NimBLEClient **ppClient, bool start = true){
|
|||||||
|
|
||||||
(*ppClient)->setClientCallbacks(nullptr, false);
|
(*ppClient)->setClientCallbacks(nullptr, false);
|
||||||
|
|
||||||
try {
|
if ((*ppClient)->isConnected()){
|
||||||
if ((*ppClient)->isConnected()){
|
|
||||||
#ifdef BLE_ESP32_DEBUG
|
#ifdef BLE_ESP32_DEBUG
|
||||||
AddLog(LOG_LEVEL_INFO,PSTR("BLE: disconnecting connected client"));
|
AddLog(LOG_LEVEL_INFO,PSTR("BLE: disconnecting connected client"));
|
||||||
#endif
|
|
||||||
(*ppClient)->disconnect();
|
|
||||||
}
|
|
||||||
NimBLEDevice::deleteClient((*ppClient));
|
|
||||||
(*ppClient) = nullptr;
|
|
||||||
#ifdef BLE_ESP32_DEBUG
|
|
||||||
AddLog(LOG_LEVEL_INFO,PSTR("BLE: deleted client"));
|
|
||||||
#endif
|
|
||||||
} catch(const std::exception& e){
|
|
||||||
#ifdef BLE_ESP32_DEBUG
|
|
||||||
AddLog(LOG_LEVEL_ERROR,PSTR("BLE: Stopping NimBLE:exception in delete client"));
|
|
||||||
#endif
|
#endif
|
||||||
|
(*ppClient)->disconnect();
|
||||||
}
|
}
|
||||||
|
NimBLEDevice::deleteClient((*ppClient));
|
||||||
|
(*ppClient) = nullptr;
|
||||||
|
#ifdef BLE_ESP32_DEBUG
|
||||||
|
AddLog(LOG_LEVEL_INFO,PSTR("BLE: deleted client"));
|
||||||
|
#endif
|
||||||
|
|
||||||
if (ble32Scan){
|
if (ble32Scan){
|
||||||
ble32Scan->setAdvertisedDeviceCallbacks(nullptr,true);
|
ble32Scan->setAdvertisedDeviceCallbacks(nullptr,true);
|
||||||
@ -2089,47 +2071,41 @@ static void BLETaskRunCurrentOperation(BLE_ESP32::generic_sensor_t** pCurrentOpe
|
|||||||
|
|
||||||
// for safety's sake, only call from the run task
|
// for safety's sake, only call from the run task
|
||||||
static void BLETaskRunTaskDoneOperation(BLE_ESP32::generic_sensor_t** op, NimBLEClient **ppClient){
|
static void BLETaskRunTaskDoneOperation(BLE_ESP32::generic_sensor_t** op, NimBLEClient **ppClient){
|
||||||
try {
|
if ((*ppClient)->isConnected()){
|
||||||
if ((*ppClient)->isConnected()){
|
|
||||||
#ifdef BLE_ESP32_DEBUG
|
#ifdef BLE_ESP32_DEBUG
|
||||||
if (BLEDebugMode > 0) AddLog(LOG_LEVEL_DEBUG,PSTR("BLE: runTaskDoneOperation: disconnecting connected client"));
|
if (BLEDebugMode > 0) AddLog(LOG_LEVEL_DEBUG,PSTR("BLE: runTaskDoneOperation: disconnecting connected client"));
|
||||||
|
#endif
|
||||||
|
(*ppClient)->disconnect();
|
||||||
|
// wait for 1/2 second after disconnect
|
||||||
|
int waits = 0;
|
||||||
|
do {
|
||||||
|
vTaskDelay(500/ portTICK_PERIOD_MS);
|
||||||
|
if (waits) {
|
||||||
|
//(*ppClient)->disconnect();
|
||||||
|
// we will stall here forever!!! - as testing
|
||||||
|
#ifdef BLE_ESP32_DEBUG
|
||||||
|
AddLog(LOG_LEVEL_ERROR,PSTR("BLE: wait discon%d"), waits);
|
||||||
#endif
|
#endif
|
||||||
(*ppClient)->disconnect();
|
|
||||||
// wait for 1/2 second after disconnect
|
|
||||||
int waits = 0;
|
|
||||||
do {
|
|
||||||
vTaskDelay(500/ portTICK_PERIOD_MS);
|
vTaskDelay(500/ portTICK_PERIOD_MS);
|
||||||
if (waits) {
|
}
|
||||||
//(*ppClient)->disconnect();
|
waits++;
|
||||||
// we will stall here forever!!! - as testing
|
if (waits == 5){
|
||||||
|
int conn_id = (*ppClient)->getConnId();
|
||||||
|
ble_gap_conn_broken(conn_id, -1);
|
||||||
#ifdef BLE_ESP32_DEBUG
|
#ifdef BLE_ESP32_DEBUG
|
||||||
AddLog(LOG_LEVEL_ERROR,PSTR("BLE: wait discon%d"), waits);
|
AddLog(LOG_LEVEL_ERROR,PSTR("BLE: wait discon%d - kill connection"), waits);
|
||||||
#endif
|
#endif
|
||||||
vTaskDelay(500/ portTICK_PERIOD_MS);
|
}
|
||||||
}
|
if (waits == 60){
|
||||||
waits++;
|
AddLog(LOG_LEVEL_ERROR,PSTR("BLE: >60s waiting -> BLE Failed, restart Tasmota %d"), waits);
|
||||||
if (waits == 5){
|
BLEStop = 1;
|
||||||
int conn_id = (*ppClient)->getConnId();
|
BLEStopAt = esp_timer_get_time();
|
||||||
ble_gap_conn_broken(conn_id, -1);
|
|
||||||
#ifdef BLE_ESP32_DEBUG
|
|
||||||
AddLog(LOG_LEVEL_ERROR,PSTR("BLE: wait discon%d - kill connection"), waits);
|
|
||||||
#endif
|
|
||||||
}
|
|
||||||
if (waits == 60){
|
|
||||||
AddLog(LOG_LEVEL_ERROR,PSTR("BLE: >60s waiting -> BLE Failed, restart Tasmota %d"), waits);
|
|
||||||
BLEStop = 1;
|
|
||||||
BLEStopAt = esp_timer_get_time();
|
|
||||||
|
|
||||||
BLERestartTasmota = 10;
|
BLERestartTasmota = 10;
|
||||||
BLERestartTasmotaReason = BLE_RESTART_TEAMOTA_REASON_BLE_DISCONNECT_FAIL;
|
BLERestartTasmotaReason = BLE_RESTART_TEAMOTA_REASON_BLE_DISCONNECT_FAIL;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
} while ((*ppClient)->isConnected());
|
} while ((*ppClient)->isConnected());
|
||||||
}
|
|
||||||
} catch(const std::exception& e){
|
|
||||||
#ifdef BLE_ESP32_DEBUG
|
|
||||||
AddLog(LOG_LEVEL_ERROR,PSTR("BLE: runTaskDoneOperation: exception in disconnect"));
|
|
||||||
#endif
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@ -3322,35 +3298,23 @@ static void mainThreadOpCallbacks() {
|
|||||||
|
|
||||||
if (BLEDebugMode > 0) AddLog(LOG_LEVEL_DEBUG,PSTR("BLE: op->completecallback is %u opid %d"), op->completecallback, op->opid);
|
if (BLEDebugMode > 0) AddLog(LOG_LEVEL_DEBUG,PSTR("BLE: op->completecallback is %u opid %d"), op->completecallback, op->opid);
|
||||||
if (op->completecallback){
|
if (op->completecallback){
|
||||||
try {
|
OPCOMPLETE_CALLBACK *pFn = (OPCOMPLETE_CALLBACK *)(op->completecallback);
|
||||||
OPCOMPLETE_CALLBACK *pFn = (OPCOMPLETE_CALLBACK *)(op->completecallback);
|
callbackres = pFn(op);
|
||||||
callbackres = pFn(op);
|
|
||||||
#ifdef BLE_ESP32_DEBUG
|
#ifdef BLE_ESP32_DEBUG
|
||||||
if (BLEDebugMode > 0) AddLog(LOG_LEVEL_DEBUG,PSTR("BLE: op->completecallback %d opid %d"), callbackres, op->opid);
|
if (BLEDebugMode > 0) AddLog(LOG_LEVEL_DEBUG,PSTR("BLE: op->completecallback %d opid %d"), callbackres, op->opid);
|
||||||
#endif
|
#endif
|
||||||
} catch(const std::exception& e){
|
|
||||||
#ifdef BLE_ESP32_DEBUG
|
|
||||||
AddLog(LOG_LEVEL_ERROR,PSTR("BLE: exception in op->completecallback"));
|
|
||||||
#endif
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!callbackres){
|
if (!callbackres){
|
||||||
for (int i = 0; i < operationsCallbacks.size(); i++){
|
for (int i = 0; i < operationsCallbacks.size(); i++){
|
||||||
try {
|
if (BLEDebugMode > 0) AddLog(LOG_LEVEL_DEBUG,PSTR("BLE: operationsCallbacks %d is %u"), i, operationsCallbacks[i]);
|
||||||
if (BLEDebugMode > 0) AddLog(LOG_LEVEL_DEBUG,PSTR("BLE: operationsCallbacks %d is %u"), i, operationsCallbacks[i]);
|
OPCOMPLETE_CALLBACK *pFn = operationsCallbacks[i];
|
||||||
OPCOMPLETE_CALLBACK *pFn = operationsCallbacks[i];
|
callbackres = pFn(op);
|
||||||
callbackres = pFn(op);
|
|
||||||
#ifdef BLE_ESP32_DEBUG
|
#ifdef BLE_ESP32_DEBUG
|
||||||
if (BLEDebugMode > 0) AddLog(LOG_LEVEL_DEBUG,PSTR("BLE: operationsCallbacks %d %d"), i, callbackres);
|
if (BLEDebugMode > 0) AddLog(LOG_LEVEL_DEBUG,PSTR("BLE: operationsCallbacks %d %d"), i, callbackres);
|
||||||
#endif
|
|
||||||
if (callbackres){
|
|
||||||
break; // this callback ate the op.
|
|
||||||
}
|
|
||||||
} catch(const std::exception& e){
|
|
||||||
#ifdef BLE_ESP32_DEBUG
|
|
||||||
AddLog(LOG_LEVEL_ERROR,PSTR("BLE: exception in operationsCallbacks"));
|
|
||||||
#endif
|
#endif
|
||||||
|
if (callbackres){
|
||||||
|
break; // this callback ate the op.
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -69,7 +69,7 @@ void (* const Ws2812Command[])(void) PROGMEM = {
|
|||||||
#elif (USE_WS2812_CTYPE == NEO_RBG)
|
#elif (USE_WS2812_CTYPE == NEO_RBG)
|
||||||
#define NEO_FEATURE_TYPE Rbg
|
#define NEO_FEATURE_TYPE Rbg
|
||||||
#elif (USE_WS2812_CTYPE == NEO_RGBW)
|
#elif (USE_WS2812_CTYPE == NEO_RGBW)
|
||||||
#define NEO_FEATURE_TYPE Rbgw
|
#define NEO_FEATURE_TYPE Rgbw
|
||||||
#elif (USE_WS2812_CTYPE == NEO_GRBW)
|
#elif (USE_WS2812_CTYPE == NEO_GRBW)
|
||||||
#define NEO_FEATURE_TYPE Grbw
|
#define NEO_FEATURE_TYPE Grbw
|
||||||
#else
|
#else
|
||||||
|
Loading…
x
Reference in New Issue
Block a user