diff options
author | David Crocker <dcrocker@eschertech.com> | 2021-06-01 15:04:19 +0300 |
---|---|---|
committer | David Crocker <dcrocker@eschertech.com> | 2021-06-01 15:04:19 +0300 |
commit | 5a578f2a63d6e3b4526893f9beb6713f1224ef26 (patch) | |
tree | 83ff7b773e2307d0b65889eced39b31043e1cb4b | |
parent | 5c414694d3a4891e8296891709c3dac62d37d439 (diff) |
Don't allow DueX pins to be used for laser control
-rw-r--r-- | src/DuetNG/DueXn.cpp | 38 | ||||
-rw-r--r-- | src/Platform/Platform.cpp | 19 | ||||
-rw-r--r-- | src/Version.h | 2 |
3 files changed, 38 insertions, 21 deletions
diff --git a/src/DuetNG/DueXn.cpp b/src/DuetNG/DueXn.cpp index 4706f7ba..7b59b49e 100644 --- a/src/DuetNG/DueXn.cpp +++ b/src/DuetNG/DueXn.cpp @@ -275,18 +275,21 @@ bool DuetExpansion::DigitalRead(Pin pin) noexcept // Write a pin void DuetExpansion::DigitalWrite(Pin pin, bool high) noexcept { - if (pin >= DueXnExpansionStart && pin < DueXnExpansionStart + 16) + if (!inInterrupt() && __get_BASEPRI() == 0) // we must not call expander.digitalWrite() from within an ISR { - if (dueXnBoardType != ExpansionBoardType::none) + if (pin >= DueXnExpansionStart && pin < DueXnExpansionStart + 16) { - dueXnExpander.digitalWrite(pin - DueXnExpansionStart, high); + if (dueXnBoardType != ExpansionBoardType::none) + { + dueXnExpander.digitalWrite(pin - DueXnExpansionStart, high); + } } - } - else if (pin >= AdditionalIoExpansionStart && pin < AdditionalIoExpansionStart + 16) - { - if (additionalIoExpanderPresent) + else if (pin >= AdditionalIoExpansionStart && pin < AdditionalIoExpansionStart + 16) { - additionalIoExpander.digitalWrite(pin - AdditionalIoExpansionStart, high); + if (additionalIoExpanderPresent) + { + additionalIoExpander.digitalWrite(pin - AdditionalIoExpansionStart, high); + } } } } @@ -294,18 +297,21 @@ void DuetExpansion::DigitalWrite(Pin pin, bool high) noexcept // Set the PWM value on this pin void DuetExpansion::AnalogOut(Pin pin, float pwm) noexcept { - if (pin >= DueXnExpansionStart && pin < DueXnExpansionStart + 16) + if (!inInterrupt() && __get_BASEPRI() == 0) // we must not call expander.analogWrite() from within an ISR { - if (dueXnBoardType != ExpansionBoardType::none) + if (pin >= DueXnExpansionStart && pin < DueXnExpansionStart + 16) { - dueXnExpander.analogWrite(pin - DueXnExpansionStart, (uint8_t)(constrain<float>(pwm, 0.0, 1.0) * 255)); + if (dueXnBoardType != ExpansionBoardType::none) + { + dueXnExpander.analogWrite(pin - DueXnExpansionStart, (uint8_t)(constrain<float>(pwm, 0.0, 1.0) * 255)); + } } - } - else if (pin >= AdditionalIoExpansionStart && pin < AdditionalIoExpansionStart + 16) - { - if (additionalIoExpanderPresent) + else if (pin >= AdditionalIoExpansionStart && pin < AdditionalIoExpansionStart + 16) { - additionalIoExpander.analogWrite(pin - AdditionalIoExpansionStart, (uint8_t)(constrain<float>(pwm, 0.0, 1.0) * 255)); + if (additionalIoExpanderPresent) + { + additionalIoExpander.analogWrite(pin - AdditionalIoExpansionStart, (uint8_t)(constrain<float>(pwm, 0.0, 1.0) * 255)); + } } } } diff --git a/src/Platform/Platform.cpp b/src/Platform/Platform.cpp index a92df70d..e12dd579 100644 --- a/src/Platform/Platform.cpp +++ b/src/Platform/Platform.cpp @@ -4191,12 +4191,23 @@ float Platform::GetLaserPwm() const noexcept bool Platform::AssignLaserPin(GCodeBuffer& gb, const StringRef& reply) { - const bool ok = laserPort.AssignPort(gb, reply, PinUsedBy::laser, PinAccess::pwm); - if (ok) + if (!laserPort.AssignPort(gb, reply, PinUsedBy::laser, PinAccess::pwm)) { - SetLaserPwm(0); + return false; } - return ok; + +#ifdef DUET_NG + // We can't use DueX fan pins because we need to set the PWM from within the tick ISR + if (laserPort.GetPin() >= DueXnExpansionStart) + { + reply.copy("DueX fan or GPIO pins may not be used to control lasers"); + laserPort.Release(); + return false; + } +#endif + + SetLaserPwm(0); + return true; } void Platform::SetLaserPwmFrequency(PwmFrequency freq) noexcept diff --git a/src/Version.h b/src/Version.h index bf4d0eee..eaaafbb0 100644 --- a/src/Version.h +++ b/src/Version.h @@ -9,7 +9,7 @@ #define SRC_VERSION_H_ #ifndef VERSION -# define MAIN_VERSION "3.3RC3" +# define MAIN_VERSION "3.3RC3+1" # ifdef USE_CAN0 # define VERSION_SUFFIX " (CAN0)" # else |