开源改变世界!!

temporaryParserModalChange 无法正常工作 #647

推推 grbl 2年前 (2023-01-26) 120次浏览
关闭
绕线器 打开了这个问题 2017 年 5 月 3 日 · 0 条评论
关闭

temporaryParserModalChange 无法正常工作#647

绕线器 打开了这个问题 2017 年 5 月 3 日 · 0 条评论

注释

temporaryParserModalChange 无法正常工作 #647
所有者

这是一个很少使用的功能的问题,我只是在测试一些表面探测功能时才注意到它,这些功能会导致 UGS 出现新的计时行为。

为了允许使用内部 GUI 命令进行临时状态更改,UGS 可以配置 aGcode command以如下方式发送:

        GcodeCommand state = createCommand("G21 G90 G0 X0 Y0 Z0");
        state.setTemporaryParserModalChange(true);
        controller.sendCommandImmediately(state);
        restoreParserModalState();

此处的目的是将状态设置为G21 G90,然后立即恢复为初始值。

有一个由两部分组成的竞争条件可能会导致失败。首先,initial values当命令完成GUIBackend.java并且对带有临时标志的初始值的引用GcodeCommand不可用时,它们会被更新——所以状态最终会被更新为不正确的值。这是由第二个问题引起的,即该sendCommandImmediatly方法没有将 gcode 命令保存到activeCommands数组中,因此setTemporaryParserModalChange在处理完成的命令时丢失了。

此功能直到现在才有效,因为它仅用于慢跑,并且慢跑命令 + 恢复命令始终适合 GRBL 发送缓冲区。因此,即使初始状态被短暂地设置错误,restoreParserModalState()命令也会在错误设置之前被调用。

添加这个解决了眼前的问题,但导致一些单元测试失败,因为activeCommands数组的大小用于一些内部验证。

    public void sendCommandImmediately(GcodeCommand command) throws Exception {
        isReadyToSendCommandsEvent();
        
        if (!isCommOpen()) {
            throw new Exception("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();
    }

我不确定是要删除这个很少使用的功能还是通过修复它来冒回归的风险。因此,在我有机会进一步调查之前,我只是在创建这张票。

temporaryParserModalChange 无法正常工作 #647 绕线器 添加了 漏洞 标签 2017 年 5 月 3 日
temporaryParserModalChange 无法正常工作 #647 收卷  关闭此作为完成 0455974 2017 年 5 月 6 日
喜欢 (0)