From 18d649a3a5b5cbae133e78fd70de2d8d723b9166 Mon Sep 17 00:00:00 2001 From: Frank Date: Sun, 18 Dec 2022 23:12:38 +0100 Subject: [PATCH] usermods: delay I2C pin allocation delay i2C allocation / startup if global I2C pins = -1 --- usermods/BH1750_v2/usermod_bh1750.h | 7 ++++--- usermods/RTC/usermod_rtc.h | 6 +++--- usermods/mpu6050_imu/usermod_mpu6050_imu.h | 10 ++++++++-- 3 files changed, 15 insertions(+), 8 deletions(-) diff --git a/usermods/BH1750_v2/usermod_bh1750.h b/usermods/BH1750_v2/usermod_bh1750.h index fc9097e8..81d2e92a 100644 --- a/usermods/BH1750_v2/usermod_bh1750.h +++ b/usermods/BH1750_v2/usermod_bh1750.h @@ -66,7 +66,8 @@ private: #define HW_PIN_SCL 5 #define HW_PIN_SDA 4 #endif - int8_t ioPin[2] = {HW_PIN_SCL, HW_PIN_SDA}; // I2C pins: SCL, SDA...defaults to Arch hardware pins but overridden at setup() + //int8_t ioPin[2] = {HW_PIN_SCL, HW_PIN_SDA}; // I2C pins: SCL, SDA...defaults to Arch hardware pins but overridden at setup() + int8_t ioPin[2] = {-1, -1}; // WLEDMM - I2C pins: wait until hw pins get allocated bool initDone = false; bool sensorFound = false; @@ -137,7 +138,7 @@ public: if (!pinManager.allocateMultiplePins(pins, 2, po)) return; #if defined(ARDUINO_ARCH_ESP32) - if (pins[1].pin < 0 || pins[0].pin < 0) { sensorFound=false; return; } //WLEDMM bugfix - ensure that "final" GPIO are valid and no "-1" sneaks trough + if (pins[1].pin < 0 || pins[0].pin < 0) { sensorFound=false; enabled=false; return; } //WLEDMM bugfix - ensure that "final" GPIO are valid and no "-1" sneaks trough Wire.begin(pins[1].pin, pins[0].pin); // WLEDMM this might silently fail, which is OK as it just means that I2C bus is already running. #else Wire.begin(); // WLEDMM - i2c pins on 8266 are fixed. @@ -181,7 +182,7 @@ public: mqttInitialized = true; } mqtt->publish(mqttLuminanceTopic.c_str(), 0, true, String(lux).c_str()); - DEBUG_PRINTLN(F("Brightness: ") + String(lux) + F("lx")); + DEBUG_PRINTLN(String("Brightness: ") + String(lux) + String("lx")); // WLEDMM fix compilation warning } else { diff --git a/usermods/RTC/usermod_rtc.h b/usermods/RTC/usermod_rtc.h index 4de535db..50a269d9 100644 --- a/usermods/RTC/usermod_rtc.h +++ b/usermods/RTC/usermod_rtc.h @@ -17,12 +17,12 @@ class RTCUsermod : public Usermod { void setup() { PinManagerPinType pins[2] = { { i2c_scl, true }, { i2c_sda, true } }; #if defined(ARDUINO_ARCH_ESP32) && defined(HW_PIN_SDA) && defined(HW_PIN_SCL) - if (pins[0].pin < 0) pins[0].pin = HW_PIN_SCL; //WLEDMM - if (pins[1].pin < 0) pins[1].pin = HW_PIN_SDA; //WLEDMM + //if (pins[0].pin < 0) pins[0].pin = HW_PIN_SCL; //WLEDMM + //if (pins[1].pin < 0) pins[1].pin = HW_PIN_SDA; //WLEDMM #endif + if (pins[1].pin < 0 || pins[0].pin < 0) { disabled=true; return; } //WLEDMM bugfix - ensure that "final" GPIO are valid and no "-1" sneaks trough if (!pinManager.allocateMultiplePins(pins, 2, PinOwner::HW_I2C)) { disabled = true; return; } #if defined(ARDUINO_ARCH_ESP32) - if (pins[1].pin < 0 || pins[0].pin < 0) { disabled=true; return; } //WLEDMM bugfix - ensure that "final" GPIO are valid and no "-1" sneaks trough Wire.begin(pins[1].pin, pins[0].pin); // WLEDMM this might silently fail, which is OK as it just means that I2C bus is already running. #else Wire.begin(); // WLEDMM - i2c pins on 8266 are fixed. diff --git a/usermods/mpu6050_imu/usermod_mpu6050_imu.h b/usermods/mpu6050_imu/usermod_mpu6050_imu.h index c8e6b96f..bba4a805 100644 --- a/usermods/mpu6050_imu/usermod_mpu6050_imu.h +++ b/usermods/mpu6050_imu/usermod_mpu6050_imu.h @@ -117,10 +117,15 @@ class MPU6050Driver : public Usermod { #endif void setup() { - DEBUG_PRINT_IMULN("mpu setup"); // WLEDMM begin + USER_PRINTLN(F("mpu setup")); +#if 0 // WLEDMM: delay I2C pin alloc int8_t hw_scl = i2c_scl<0 ? HW_PIN_SCL : i2c_scl; int8_t hw_sda = i2c_sda<0 ? HW_PIN_SDA : i2c_sda; +#else + int8_t hw_scl = i2c_scl; + int8_t hw_sda = i2c_sda; +#endif PinManagerPinType pins[2] = { { hw_scl, true }, { hw_sda, true } }; if ((hw_scl < 0) || (hw_sda < 0)) { @@ -129,6 +134,8 @@ class MPU6050Driver : public Usermod { //return; } + if (pins[1].pin < 0 || pins[0].pin < 0) { enabled=false; dmpReady = false; return; } //WLEDMM bugfix - ensure that "final" GPIO are valid and no "-1" sneaks trough + if (!pinManager.allocateMultiplePins(pins, 2, PinOwner::HW_I2C)) { enabled = false; USER_PRINTF("mpu6050: failed to allocate I2C sda=%d scl=%d\n", hw_sda, hw_scl); @@ -139,7 +146,6 @@ class MPU6050Driver : public Usermod { // join I2C bus (I2Cdev library doesn't do this automatically) #if I2CDEV_IMPLEMENTATION == I2CDEV_ARDUINO_WIRE #if defined(ARDUINO_ARCH_ESP32) - if (pins[1].pin < 0 || pins[0].pin < 0) { enabled=false; dmpReady = false; return; } //WLEDMM bugfix - ensure that "final" GPIO are valid and no "-1" sneaks trough Wire.begin(pins[1].pin, pins[0].pin); // WLEDMM fix - need to use proper pins, in case that Wire was not started yet. Call will silently fail if Wire is initialized already. #else Wire.begin(); // WLEDMM - i2c pins on 8266 are fixed.