From 5eb18a6173207990d0b74f4a9b4aa092886c617d Mon Sep 17 00:00:00 2001 From: Frank <91616163+softhack007@users.noreply.github.com> Date: Fri, 20 Jan 2023 22:13:30 +0100 Subject: [PATCH] Pin Info update * Additional functions: isPinPWM, isPinINT * aliases: PM_ADC1 instead of PinManagerClass::ADC1 * make getADCPin work on "classic ESP32" --> Tested and works on 8266, ESP32 (default platform), ESP32 (V4 Platform). ESP32-S3, ESP32-S2, ESP32-C3 --- wled00/pin_manager.cpp | 3 ++- wled00/pin_manager.h | 14 ++++++++++---- wled00/wled.cpp | 18 +++++++++++++----- wled00/wled.h | 2 +- 4 files changed, 26 insertions(+), 11 deletions(-) diff --git a/wled00/pin_manager.cpp b/wled00/pin_manager.cpp index aa3f9912..f0925dfa 100644 --- a/wled00/pin_manager.cpp +++ b/wled00/pin_manager.cpp @@ -662,7 +662,8 @@ bool PinManagerClass::joinWire(int8_t pinSDA, int8_t pinSCL) { if (adcPort >= SOC_ADC_MAX_CHANNEL_NUM) analogChannel = 255; #else // for classic ESP32 int8_t analogChannel = (adcUnit == ADC1) ? adcPort : (10 + adcPort); - if (adcPort >= 10) analogChannel = 255; + if ((adcUnit == ADC1) && (adcPort >= 8)) analogChannel = 127; + if (adcPort >= 10) analogChannel = 127; #endif //int analogPin = analogChannelToDigitalPin(analogChannel); diff --git a/wled00/pin_manager.h b/wled00/pin_manager.h index 21029320..f9e52ab6 100644 --- a/wled00/pin_manager.h +++ b/wled00/pin_manager.h @@ -131,13 +131,19 @@ class PinManagerClass { String getPinSpecialText(int gpio); // WLEDMM - return PIN special comments (if any) String getPinConflicts(int gpio); // WLEDMM - return PIN alloc conflicts (if any) - bool isPinTouch(int gpio); // true if gpio supports touch functions + bool isPinPWM(int gpio) {return(digitalPinHasPWM(gpio));} // true if gpio supports PWM + bool isPinINT(int gpio) {return(digitalPinToInterrupt(gpio) >= 0);} // true if gpio supports PWM + bool isPinTouch(int gpio); // true if gpio supports touch functions + bool isPinAnalog(int gpio); // true if gpio supports analogRead bool isPinADC1(int gpio); // true if gpio supports analogRead, and it belongs to ADC unit 1 - bool isPinADC2(int gpio); // true if gpio supports analogRead, and it belongs to ADC unit 2 - #define PM_NO_PIN 255 + bool isPinADC2(int gpio); // true if gpio supports analogRead, and it belongs to ADC unit 2 + typedef enum { ADC_none = 0, ADC1 = 1, ADC2 = 2 } AdcIdentifier; - uint8_t getADCPin(AdcIdentifier adcUnit, uint8_t adcPort); // get GPIO number for ADC unit x, channel y. 255 = no such pin + #define PM_ADC1 PinManagerClass::ADC1 // Alias for ADC1 + #define PM_ADC2 PinManagerClass::ADC2 // Alias for ADC2 + #define PM_NO_PIN 255 + uint8_t getADCPin(AdcIdentifier adcUnit, uint8_t adcPort); // get GPIO number for ADC unit x, channel y. 255 = no such pin // WLEDMM end #ifdef ARDUINO_ARCH_ESP32 diff --git a/wled00/wled.cpp b/wled00/wled.cpp index 8eef3ba2..4fe74aac 100644 --- a/wled00/wled.cpp +++ b/wled00/wled.cpp @@ -565,6 +565,14 @@ void WLED::setup() if(pinManager.isPinOk(pinNr, false)) { //if ((!pinManager.isPinAllocated(pinNr)) && (pinManager.getPinSpecialText(pinNr).length() == 0)) continue; // un-comment to hide no-name,unused GPIO pins bool is_inOut = pinManager.isPinOk(pinNr, true); +#if 0 // for testing + USER_PRINT(pinManager.isPinAnalog(pinNr) ? "A": " "); + USER_PRINT(pinManager.isPinADC1(pinNr) ? "1": " "); + USER_PRINT(pinManager.isPinADC2(pinNr) ? "2": " "); + USER_PRINT(pinManager.isPinTouch(pinNr) ? "T": " "); + USER_PRINT(pinManager.isPinPWM(pinNr) ? " P": " "); + USER_PRINT(pinManager.isPinINT(pinNr) ? "I ": " "); +#endif USER_PRINTF("%s %2d\t %-17s %s\t %s\n", (is_inOut?"i/o":"in "), pinNr, @@ -579,17 +587,17 @@ void WLED::setup() #if 0 // for testing USER_PRINTLN(F("\n")); USER_PRINTF("ADC1-0 = %d, ADC1-3 = %d, ADC1-7 = %d, ADC2-0 = %d, ADC2-1 = %d, ADC2-8 = %d, ADC2-10 = %d\n", - pinManager.getADCPin(PinManagerClass::ADC1, 0), pinManager.getADCPin(PinManagerClass::ADC1, 3), pinManager.getADCPin(PinManagerClass::ADC1, 7), - pinManager.getADCPin(PinManagerClass::ADC2, 0), pinManager.getADCPin(PinManagerClass::ADC2, 1), pinManager.getADCPin(PinManagerClass::ADC2, 8), - pinManager.getADCPin(PinManagerClass::ADC2, 10) + pinManager.getADCPin(PM_ADC1, 0), pinManager.getADCPin(PM_ADC1, 3), pinManager.getADCPin(PM_ADC1, 7), + pinManager.getADCPin(PM_ADC2, 0), pinManager.getADCPin(PM_ADC2, 1), pinManager.getADCPin(PM_ADC2, 8), + pinManager.getADCPin(PM_ADC2, 10) ); USER_PRINTLN(); - for(int p=0; p<12; p++) { + for(int p=0; p<11; p++) { if(pinManager.getADCPin(PinManagerClass::ADC1, p) < 255) USER_PRINTF("ADC1-%d = %d, ", p, pinManager.getADCPin(PinManagerClass::ADC1, p)); } USER_PRINTLN(); - for(int p=0; p<12; p++) { + for(int p=0; p<11; p++) { if(pinManager.getADCPin(PinManagerClass::ADC2, p) < 255) USER_PRINTF("ADC2-%d = %d, ", p, pinManager.getADCPin(PinManagerClass::ADC2, p)); } diff --git a/wled00/wled.h b/wled00/wled.h index 34e41c65..ad50360b 100644 --- a/wled00/wled.h +++ b/wled00/wled.h @@ -8,7 +8,7 @@ */ // version code in format yymmddb (b = daily build) -#define VERSION 2301202 +#define VERSION 2301203 //uncomment this if you have a "my_config.h" file you'd like to use //#define WLED_USE_MY_CONFIG