Thanks JL, this reminded me that we had seen something like this before. I went back and did some research and there are a few things we can try.
First, try setting status reports to include the stat keyword:
tinyg> {sr:{line:t,posx:t,posy:t,posz:t,vel:t,unit:t,stat:t}}
And turn on unfiltered automatic status reports:
tinyg> $sv=2
Then let's change your MOVE_TO_COMPLETE_REGEX to ".*stat:3.*" (minus the quotes).
Let me know if that changes things for you.
The core issue seems to be that TinyG is failing to send good status reports for very small moves unless the moves are done very slowly. I think the issue is really that it's only sending status reports every 250ms and if the move takes less than that it won't send one.
LitePlacer actually uses a bit of a hack to handle this. It hardcodes F200 for small moves so that they move slow enough to allow some status reports. Unfortunately the generic nature of the GcodeDriver makes this type of hack difficult.
My hope is that we can convince TinyG to send a final status report in all cases, in which case monitoring for stat:3 (stopped) should work in all cases.
If we can't make that happen, it's probably time to take this issue to the TinyG folks and ask what the best way to handle this would be.
Finally, I just noticed that we can request a status report by sending {"sr":null}, so it could be that the solution is to have the driver send this during the wait for moves to finish. This would be a relatively easy change to make, so if it comes down to it this can be fixed in OpenPnP pretty easily.
Reference Material: