If OctoPrint sends an M112, does Marlin ignore what's still in the queue?
I know that I've been bitten at least once when some rogue code drilled a hotend into my plastic bed and I'm begging the printer to... just... stop... already.
Then I went to terminal command window, and typed "M112" and hit enter, and I didn't see an M112 command float dutifully up my screen as was my intention
So I typed "M112" again, only this time, I hit the "send" button, thinking that it might pay more attention that way
I still failed to notice an M112 float up my screen
Then, when it got to .5 degrees of the set temp, this happened
Recv: T:21.11 /0 B:84.50 /85 B@:255 @:0
Recv: ok 5
Send: M112
Send: N6 M11239
Send: N7 M104 T0 S038
Send: N8 M140 S0*109
Closing serial port due to emergency stop M112.
Changing monitoring state from "Cancelling" to "Offline (Error: Closing serial port due to emergency stop M112.)"
Connection closed, closing down monitor
It was like watching a movie where the hero is trying to defuse the bomb, then finally getting it at the last half second
I didn't try disconnecting the Raspi from the printer (which I didn't think would work, but I should have tried anyway), nor did I try unplugging the printer itself (which I knew would work, but, that wasn't part of the experiment)
Well, "blocking commands are blocking", as they say.
But most of the time during the print job, it's not under the fiat of an M109, for example.
If an M112 shuts down the connection then that's problematic; the GCODE Cancel script then can't do the other things it needs to do like lift the hotend, X/Y home it and anything else it might do to take care of business.
All I had up til now was a little cheat sheet of M commands, and M108 wasn't in it
This gives me an idea... If all we want to do is cancel the heater, since the print itself has already been cancelled, how about if a command gets issued that sets the new target temp as the current temp, thereby fooling the thing into thinking that it's achieved its goal, and can now move on to its next command, which is to shut down the heater ?
Most 3d printer boards are based on Arduino's and will reset on serial connection. Just cycle the printer's connection (press the disconnect button, then reconnect) and that should reset your printer's controller board. I used that trick a few times.
That or in my early days, I just had a physical button that cuts power to the printer and I'd smash that when stuff went wrong, much faster and more reliable than a software solution (assuming you're right next to said button)
Marlin supports the M108 and M112 commands.
The problem is that Octoprint will not send the commands because it is waiting for the buffer to become empty. Even when "Send emergency GCODES M108 and M410 without waiting for acknowledgement, if detected as supported by the firmware" is activated.
Can this be changed?
Yep. If it reports it like that and emergency commands are not forced through immediately (which last I checked they were) then please open a full bug report and I'll take a look (after my vacation).