publicvoidsendCommandImmediately(GcodeCommandcommand) throwsException {
isReadyToSendCommandsEvent();
if (!isCommOpen()) {
thrownewException("Cannot send command(s), comm port is not open.");
}
this.dispatchStateChange(ControlState.COMM_SENDING);
+++ this.activeCommands.add(command);
this.sendStringToComm(command.getCommandString());
this.comm.streamCommands();
}
这是一个很少使用的功能的问题,我只是在测试一些表面探测功能时才注意到它,这些功能会导致 UGS 出现新的计时行为。
为了允许使用内部 GUI 命令进行临时状态更改,UGS 可以配置 a
Gcode command
以如下方式发送:此处的目的是将状态设置为
G21 G90
,然后立即恢复为初始值。有一个由两部分组成的竞争条件可能会导致失败。首先,
initial values
当命令完成GUIBackend.java
并且对带有临时标志的初始值的引用GcodeCommand
不可用时,它们会被更新——所以状态最终会被更新为不正确的值。这是由第二个问题引起的,即该sendCommandImmediatly
方法没有将 gcode 命令保存到activeCommands
数组中,因此setTemporaryParserModalChange
在处理完成的命令时丢失了。此功能直到现在才有效,因为它仅用于慢跑,并且慢跑命令 + 恢复命令始终适合 GRBL 发送缓冲区。因此,即使初始状态被短暂地设置错误,
restoreParserModalState()
命令也会在错误设置之前被调用。添加这个解决了眼前的问题,但导致一些单元测试失败,因为
activeCommands
数组的大小用于一些内部验证。我不确定是要删除这个很少使用的功能还是通过修复它来冒回归的风险。因此,在我有机会进一步调查之前,我只是在创建这张票。