From 8014ccc1356eec141042c8fe367f9d78d5ff76d2 Mon Sep 17 00:00:00 2001 From: "Dirk O. Kaar" Date: Mon, 12 Apr 2021 20:41:34 +0200 Subject: [PATCH 1/3] Library was overlooked in "PWM-locked" / "phase-locked" waveform mode merge. --- libraries/Servo/src/Servo.cpp | 14 +------------- 1 file changed, 1 insertion(+), 13 deletions(-) diff --git a/libraries/Servo/src/Servo.cpp b/libraries/Servo/src/Servo.cpp index d24ea33799..d2594eee1c 100644 --- a/libraries/Servo/src/Servo.cpp +++ b/libraries/Servo/src/Servo.cpp @@ -69,13 +69,8 @@ uint8_t Servo::attach(int pin, uint16_t minUs, uint16_t maxUs) uint8_t Servo::attach(int pin, uint16_t minUs, uint16_t maxUs, int value) { if (!_attached) { -#ifdef WAVEFORM_LOCKED_PHASE pinMode(pin, OUTPUT); digitalWrite(pin, LOW); -#else - digitalWrite(pin, LOW); - pinMode(pin, OUTPUT); -#endif _pin = pin; _attached = true; } @@ -95,11 +90,8 @@ void Servo::detach() { if (_attached) { _servoMap &= ~(1 << _pin); -#ifdef WAVEFORM_LOCKED_PHASE + // TODO - timeHigh == 0 is illegal in _PWM code branch. And now what? startWaveform(_pin, 0, REFRESH_INTERVAL, 1); -#else - // TODO - timeHigh == 0 is illegal in _PWM code branch. Do nothing for now. -#endif delay(REFRESH_INTERVAL / 1000); // long enough to complete active period under all circumstances. stopWaveform(_pin); _attached = false; @@ -124,13 +116,9 @@ void Servo::writeMicroseconds(int value) _valueUs = value; if (_attached) { _servoMap &= ~(1 << _pin); -#ifdef WAVEFORM_LOCKED_PHASE // Find the first GPIO being generated by checking GCC's find-first-set (returns 1 + the bit of the first 1 in an int32_t) int phaseReference = __builtin_ffs(_servoMap) - 1; if (startWaveform(_pin, _valueUs, REFRESH_INTERVAL - _valueUs, 0, phaseReference)) -#else - if (startWaveform(_pin, _valueUs, REFRESH_INTERVAL - _valueUs, 0)) -#endif { _servoMap |= (1 << _pin); } From 21fc5fbd9b2e4369abea45ec6508d61f680759ff Mon Sep 17 00:00:00 2001 From: "Dirk O. Kaar" Date: Fri, 16 Apr 2021 09:38:48 +0200 Subject: [PATCH 2/3] Per review. --- cores/esp8266/core_esp8266_waveform_pwm.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cores/esp8266/core_esp8266_waveform_pwm.cpp b/cores/esp8266/core_esp8266_waveform_pwm.cpp index b33a657ba1..2107ef726c 100644 --- a/cores/esp8266/core_esp8266_waveform_pwm.cpp +++ b/cores/esp8266/core_esp8266_waveform_pwm.cpp @@ -356,7 +356,7 @@ int startWaveformClockCycles_weak(uint8_t pin, uint32_t timeHighCycles, uint32_t (void) phaseOffsetUS; (void) autoPwm; - if ((pin > 16) || isFlashInterfacePin(pin)) { + if ((pin > 16) || isFlashInterfacePin(pin) || (timeHighCycles == 0)) { return false; } Waveform *wave = &wvfState.waveform[pin]; From e772aba090eae6ca535a94db3cc650af32a5c07e Mon Sep 17 00:00:00 2001 From: "Dirk O. Kaar" Date: Fri, 16 Apr 2021 21:11:07 +0200 Subject: [PATCH 3/3] Drop resolved TODO --- libraries/Servo/src/Servo.cpp | 1 - 1 file changed, 1 deletion(-) diff --git a/libraries/Servo/src/Servo.cpp b/libraries/Servo/src/Servo.cpp index d2594eee1c..2c21524822 100644 --- a/libraries/Servo/src/Servo.cpp +++ b/libraries/Servo/src/Servo.cpp @@ -90,7 +90,6 @@ void Servo::detach() { if (_attached) { _servoMap &= ~(1 << _pin); - // TODO - timeHigh == 0 is illegal in _PWM code branch. And now what? startWaveform(_pin, 0, REFRESH_INTERVAL, 1); delay(REFRESH_INTERVAL / 1000); // long enough to complete active period under all circumstances. stopWaveform(_pin);