Contact me: hankecnc@gmail.com

关闭一个 UI 将关闭所有 #534

推推 grbl 3年前 (2023-02-03) 304次浏览
打开
MitchBradley 打开了这个问题 2019 年 11 月 23 日 · 6条评论
打开

关闭一个 UI 将关闭所有#534

MitchBradley 打开了这个问题 2019 年 11 月 23 日 · 6条评论

评论

关闭一个 UI 将关闭所有 #534

CNCjs 1.9.20 安装在 Raspberry Pi,Node v8.5.0 上,使用“npm install”(旧版本也存在该问题)。

在浏览器中启动 CNCjs UI 的两个实例。浏览器可以在一台机器上,也可以在不同的机器上;没关系。

在浏览器 1 上打开与控制器的连接,然后在浏览器 2 上打开与同一控制器的连接。两个浏览器都可以控制机器并按预期查看其状态。

现在关闭一个浏览器上的连接。连接在该浏览器以及连接到该控制器的所有其他浏览器上关闭。

我认为这是错误的行为。如果您在笔记本电脑上运行 CNCjs,然后在您的手机上打开一个连接以从其他地方监控它,您不希望在您关闭手机连接时笔记本电脑连接也关闭。

我愿意为此尝试修复,但我对修复的位置有点困惑,因为有太多地方处理串行端口打开和关闭事件。如果你能给我指出正确的方向,我就能完成这项工作。

关闭一个 UI 将关闭所有 #534
合作者

关闭连接按钮一开始的设计理念,就是无论你操作什么设备,都强制关闭串口连接。如果要关闭套接字连接,只需关闭浏览器窗口即可。

我确实注意到这可能是一个用户体验缺陷,可能会给用户带来意想不到的结果,因为它没有显示警告消息来通知串行连接将被终止。我目前正在feature/redux 分支上进行新的 UX 增强。现在点击[关闭]按钮将弹出一个模态窗口。为了解决用户体验问题,我会在弹出模式的页脚上给出两个按钮,一个是“终止串行连接”,另一个是“关闭套接字连接”,这样用户会得到一个明确的消息要执行的操作。

关闭一个 UI 将关闭所有 #534
贡献者作者

现有行为令人困惑,因为打开和关闭的工作方式不同,因此 UI 行为不一致。对于Open,两个浏览器的UI视图是独立的,而对于Close,它们是同步的。我想不出同时关闭的好用例。
我认为有两种可能的一致行为:

  1. 打开和关闭都是独立的。在此模型中,UI 的工作方式类似于多线办公电话。一部电话可以发起呼叫,另一部可以加入呼叫。当其中一个挂断电话或切换到另一条线路时,另一个仍在“通话中”。直到两个分机都挂断或另一端挂断后,呼叫才会断开。这种行为是我期望它工作的方式,因为它很熟悉而且很有用——办公电话以这种方式工作,因为它显然是正确的呼叫行为。使用此模型,您可以在 UI A 上启动一项与控制器 A 通信的作业,然后 UI B 可以连接并监视该作业,然后 UI B 可以断开与控制器 A 的连接并重新连接到控制器 B,而不会影响 A 上正在进行的工作。
  2. 或者,连接到同一服务器的所有 UI 都可以始终查看同一连接。在该模型中,打开一个连接会打开所有连接,关闭连接也是如此。该模型使得很难或不可能使用连接到同一服务器的两个不同控制器,但它是一致的且易于解释。

也许混合独立打开、耦合关闭模型的目的是将控制器重置为关闭的副作用,但最好通过显式控制器重置来完成。关闭串行连接恰好在某些控制器上起到重置作用,但并非在所有情况下都有效。
我认为提议的模态对话框是一个更糟的变化。当用户界面需要额外的确认步骤来进行简单的操作时,我总是觉得很烦人。对我来说,这是糟糕的 UI 设计,除非在操作会产生严重后果的特殊情况下。
此外,我认为所提议的“关闭串行连接”或“关闭套接字连接”选项只会让用户感到困惑而不是帮助他们,因为很少有用户对什么是“套接字”一无所知。

关闭一个 UI 将关闭所有 #534
合作者
奇顿 评论了 2019 年 11 月 23 日  

我喜欢你的第一个想法,使“打开”和“关闭”独立,我将尝试重构代码以实现你提到的预期行为。但是如果最后一个端点试图终止连接,则弹出警告消息是非常必要的,尤其是当此操作可能终止数据传输时。以下是处理这种情况的一些建议:

建议 1:如果它是最后一个端点,则显示一条警告消息。

if (is_last_endpoint) {
    show_warning_message();
}

建议 2:如果它是最后一个端点并且加载了 G 代码程序,则显示一条警告消息。这是一种不那么烦人的方式。我不选择工作流状态的原因是它与机器运动不太同步。

if (is_last_endpoint && is_gcode_loaded) {
    show_warning_message();
}

你对提案有什么建议?

关闭一个 UI 将关闭所有 #534

将 cncjs 作为第一个启动的应用程序作为主应用程序,将其他启动的应用程序作为仅具有监控功能的从属应用程序,这不是更简单吗?

关闭一个 UI 将关闭所有 #534
贡献者作者

将 cncjs 作为第一个启动的应用程序作为主应用程序,将其他启动的应用程序作为仅具有监控功能的从属应用程序,这不是更简单吗?

那将是非常有限制的。我经常同时使用主 UI 和 cncjs-shopfloor-tablet UI 来控制同一台机器。前者具有后者所缺乏的一些功能,而后者由于其大按钮而用于简单的作业控制要安全得多。制作仅监视器之一会破坏该用例。

关闭一个 UI 将关闭所有 #534
贡献者作者
米奇布拉德利 评论了 2019 年 11 月 24 日  

回覆@cheton的建议,我更喜欢第二个版本。

我真的需要回去处理代码以与机器状态同步,以便可以使用工作流状态。

几个月前我被打扰时的工作状态如下。

  1. 我将发送器、馈送器和工作流状态机组合成一个“sendflow”机器,以正确的顺序处理错误停止、因 M1 暂停和因用户输入暂停等情况,报告当前的正确消息情况。它还通过使用数据源堆栈处理暂停发送时的馈送。
  2. sendflow 机器发出一组新的状态报告事件,UI 可以非常轻松地处理这些事件,而无需关心正在使用的控制器类型。为了向后兼容,仍然支持旧的事件集。
  3. 许多在不同控制器文件之间重复的逻辑,以及在发送者和馈线案例之间重复的逻辑,都包含在发送流机器中,差异被推入 …Runner 模块。GrblController.js、TinygController.js 等文件就消失了。

同步操作在 TinyG 上运行良好,几乎可以在 GRBL 上运行。GRBL 的问题集中在 GCode 错误上,这可能不会停止机器。由于其糟糕的串行协议,Marlin 是一个更大的问题。可能有必要采用“尽力而为”策略。

免费注册 在 GitHub 上加入此对话。已有帐户? 登录评论
项目
状态:无状态
发展

没有分支机构或拉取请求

4人参加
关闭一个 UI 将关闭所有 #534关闭一个 UI 将关闭所有 #534关闭一个 UI 将关闭所有 #534关闭一个 UI 将关闭所有 #534

喜欢 (0)