mirror of
https://github.com/wled/WLED.git
synced 2025-07-17 15:56:31 +00:00
Merge pull request #3798 from DedeHai/ESP32_S3_TouchFix
Esp32 s3 touch fix
This commit is contained in:
commit
bd60fe5a13
@ -96,9 +96,13 @@ bool isButtonPressed(uint8_t i)
|
|||||||
case BTN_TYPE_TOUCH:
|
case BTN_TYPE_TOUCH:
|
||||||
case BTN_TYPE_TOUCH_SWITCH:
|
case BTN_TYPE_TOUCH_SWITCH:
|
||||||
#if defined(ARDUINO_ARCH_ESP32) && !defined(CONFIG_IDF_TARGET_ESP32C3)
|
#if defined(ARDUINO_ARCH_ESP32) && !defined(CONFIG_IDF_TARGET_ESP32C3)
|
||||||
if (digitalPinToTouchChannel(btnPin[i]) >= 0 && touchRead(pin) <= touchThreshold) return true;
|
#ifdef SOC_TOUCH_VERSION_2 //ESP32 S2 and S3 provide a function to check touch state (state is updated in interrupt)
|
||||||
|
if (touchInterruptGetLastStatus(pin)) return true;
|
||||||
|
#else
|
||||||
|
if (digitalPinToTouchChannel(btnPin[i]) >= 0 && touchRead(pin) <= touchThreshold) return true;
|
||||||
|
#endif
|
||||||
#endif
|
#endif
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
@ -403,3 +407,8 @@ void handleIO()
|
|||||||
offMode = true;
|
offMode = true;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void IRAM_ATTR touchButtonISR()
|
||||||
|
{
|
||||||
|
// used for ESP32 S2 and S3: nothing to do, ISR is just used to update registers of HAL driver
|
||||||
|
}
|
||||||
|
@ -229,6 +229,7 @@ bool deserializeConfig(JsonObject doc, bool fromFS) {
|
|||||||
|
|
||||||
// read multiple button configuration
|
// read multiple button configuration
|
||||||
JsonObject btn_obj = hw["btn"];
|
JsonObject btn_obj = hw["btn"];
|
||||||
|
CJSON(touchThreshold, btn_obj[F("tt")]);
|
||||||
bool pull = btn_obj[F("pull")] | (!disablePullUp); // if true, pullup is enabled
|
bool pull = btn_obj[F("pull")] | (!disablePullUp); // if true, pullup is enabled
|
||||||
disablePullUp = !pull;
|
disablePullUp = !pull;
|
||||||
JsonArray hw_btn_ins = btn_obj["ins"];
|
JsonArray hw_btn_ins = btn_obj["ins"];
|
||||||
@ -253,6 +254,13 @@ bool deserializeConfig(JsonObject doc, bool fromFS) {
|
|||||||
btnPin[s] = -1;
|
btnPin[s] = -1;
|
||||||
pinManager.deallocatePin(pin,PinOwner::Button);
|
pinManager.deallocatePin(pin,PinOwner::Button);
|
||||||
}
|
}
|
||||||
|
//if touch pin, enable the touch interrupt on ESP32 S2 & S3
|
||||||
|
#ifdef SOC_TOUCH_VERSION_2 // ESP32 S2 and S3 have a fucntion to check touch state but need to attach an interrupt to do so
|
||||||
|
if ((buttonType[s] == BTN_TYPE_TOUCH || buttonType[s] == BTN_TYPE_TOUCH_SWITCH))
|
||||||
|
{
|
||||||
|
touchAttachInterrupt(btnPin[s], touchButtonISR, 256 + (touchThreshold << 4)); // threshold on Touch V2 is much higher (1500 is a value given by Espressif example, I measured changes of over 5000)
|
||||||
|
}
|
||||||
|
#endif
|
||||||
else
|
else
|
||||||
#endif
|
#endif
|
||||||
{
|
{
|
||||||
@ -309,7 +317,7 @@ bool deserializeConfig(JsonObject doc, bool fromFS) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
CJSON(touchThreshold,btn_obj[F("tt")]);
|
|
||||||
CJSON(buttonPublishMqtt,btn_obj["mqtt"]);
|
CJSON(buttonPublishMqtt,btn_obj["mqtt"]);
|
||||||
|
|
||||||
#ifndef WLED_DISABLE_INFRARED
|
#ifndef WLED_DISABLE_INFRARED
|
||||||
|
@ -20,6 +20,7 @@ void doublePressAction(uint8_t b=0);
|
|||||||
bool isButtonPressed(uint8_t b=0);
|
bool isButtonPressed(uint8_t b=0);
|
||||||
void handleButton();
|
void handleButton();
|
||||||
void handleIO();
|
void handleIO();
|
||||||
|
void IRAM_ATTR touchButtonISR();
|
||||||
|
|
||||||
//cfg.cpp
|
//cfg.cpp
|
||||||
bool deserializeConfig(JsonObject doc, bool fromFS = false);
|
bool deserializeConfig(JsonObject doc, bool fromFS = false);
|
||||||
|
@ -110,6 +110,10 @@ void handleSettingsSet(AsyncWebServerRequest *request, byte subPage)
|
|||||||
for (uint8_t s=0; s<WLED_MAX_BUTTONS; s++) {
|
for (uint8_t s=0; s<WLED_MAX_BUTTONS; s++) {
|
||||||
if (btnPin[s]>=0 && pinManager.isPinAllocated(btnPin[s], PinOwner::Button)) {
|
if (btnPin[s]>=0 && pinManager.isPinAllocated(btnPin[s], PinOwner::Button)) {
|
||||||
pinManager.deallocatePin(btnPin[s], PinOwner::Button);
|
pinManager.deallocatePin(btnPin[s], PinOwner::Button);
|
||||||
|
#ifdef SOC_TOUCH_VERSION_2 // ESP32 S2 and S3 have a function to check touch state, detach interrupt
|
||||||
|
if (digitalPinToTouchChannel(btnPin[s]) >= 0) // if touch capable pin
|
||||||
|
touchDetachInterrupt(btnPin[s]); // if not assigned previously, this will do nothing
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -241,6 +245,7 @@ void handleSettingsSet(AsyncWebServerRequest *request, byte subPage)
|
|||||||
rlyMde = (bool)request->hasArg(F("RM"));
|
rlyMde = (bool)request->hasArg(F("RM"));
|
||||||
|
|
||||||
disablePullUp = (bool)request->hasArg(F("IP"));
|
disablePullUp = (bool)request->hasArg(F("IP"));
|
||||||
|
touchThreshold = request->arg(F("TT")).toInt();
|
||||||
for (uint8_t i=0; i<WLED_MAX_BUTTONS; i++) {
|
for (uint8_t i=0; i<WLED_MAX_BUTTONS; i++) {
|
||||||
char bt[4] = "BT"; bt[2] = (i<10?48:55)+i; bt[3] = 0; // button pin (use A,B,C,... if WLED_MAX_BUTTONS>10)
|
char bt[4] = "BT"; bt[2] = (i<10?48:55)+i; bt[3] = 0; // button pin (use A,B,C,... if WLED_MAX_BUTTONS>10)
|
||||||
char be[4] = "BE"; be[2] = (i<10?48:55)+i; be[3] = 0; // button type (use A,B,C,... if WLED_MAX_BUTTONS>10)
|
char be[4] = "BE"; be[2] = (i<10?48:55)+i; be[3] = 0; // button type (use A,B,C,... if WLED_MAX_BUTTONS>10)
|
||||||
@ -257,12 +262,21 @@ void handleSettingsSet(AsyncWebServerRequest *request, byte subPage)
|
|||||||
btnPin[i] = -1;
|
btnPin[i] = -1;
|
||||||
pinManager.deallocatePin(hw_btn_pin,PinOwner::Button);
|
pinManager.deallocatePin(hw_btn_pin,PinOwner::Button);
|
||||||
}
|
}
|
||||||
else if ((buttonType[i] == BTN_TYPE_TOUCH || buttonType[i] == BTN_TYPE_TOUCH_SWITCH) && digitalPinToTouchChannel(btnPin[i]) < 0)
|
else if ((buttonType[i] == BTN_TYPE_TOUCH || buttonType[i] == BTN_TYPE_TOUCH_SWITCH))
|
||||||
{
|
{
|
||||||
// not a touch pin
|
if (digitalPinToTouchChannel(btnPin[i]) < 0)
|
||||||
DEBUG_PRINTF_P(PSTR("PIN ALLOC error: GPIO%d for touch button #%d is not an touch pin!\n"), btnPin[i], i);
|
{
|
||||||
btnPin[i] = -1;
|
// not a touch pin
|
||||||
pinManager.deallocatePin(hw_btn_pin,PinOwner::Button);
|
DEBUG_PRINTF_P(PSTR("PIN ALLOC error: GPIO%d for touch button #%d is not an touch pin!\n"), btnPin[i], i);
|
||||||
|
btnPin[i] = -1;
|
||||||
|
pinManager.deallocatePin(hw_btn_pin,PinOwner::Button);
|
||||||
|
}
|
||||||
|
#ifdef SOC_TOUCH_VERSION_2 // ESP32 S2 and S3 have a fucntion to check touch state but need to attach an interrupt to do so
|
||||||
|
else
|
||||||
|
{
|
||||||
|
touchAttachInterrupt(btnPin[i], touchButtonISR, 256 + (touchThreshold << 4)); // threshold on Touch V2 is much higher (1500 is a value given by Espressif example, I measured changes of over 5000)
|
||||||
|
}
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
#endif
|
#endif
|
||||||
@ -282,7 +296,6 @@ void handleSettingsSet(AsyncWebServerRequest *request, byte subPage)
|
|||||||
buttonType[i] = BTN_TYPE_NONE;
|
buttonType[i] = BTN_TYPE_NONE;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
touchThreshold = request->arg(F("TT")).toInt();
|
|
||||||
|
|
||||||
briS = request->arg(F("CA")).toInt();
|
briS = request->arg(F("CA")).toInt();
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user