Contact me: hankecnc@gmail.com

system_control_get_state() 可能缺少输入??? #698

推推 grbl 3年前 (2023-01-23) 242次浏览

打开
bdurbrow 打开了这个问题 2019 年 7 月 31 日 · 1条评论
打开

system_control_get_state() 可能缺少输入???#698

bdurbrow 打开了这个问题 2019 年 7 月 31 日 · 1条评论

注释

system_control_get_state() 可能缺少输入??? #698
黑眉 评论了 2019 年 7 月 31 日  

我可能又在这里变得密集了……但是……如果所有输入都处于活动状态……然后跳过检查?

来自 system.c:

// Returns control pin state as a uint8 bitfield. Each bit indicates the input pin state, where
// triggered is 1 and not triggered is 0. Invert mask is applied. Bitfield organization is
// defined by the CONTROL_PIN_INDEX in the header file.
uint8_t system_control_get_state()
{
  uint8_t control_state = 0;
  uint8_t pin = (CONTROL_PIN & CONTROL_MASK);
  #ifdef INVERT_CONTROL_PIN_MASK
    pin ^= INVERT_CONTROL_PIN_MASK;
  #endif
  if (pin) {
    #ifdef ENABLE_SAFETY_DOOR_INPUT_PIN
      if (bit_isfalse(pin,(1<<CONTROL_SAFETY_DOOR_BIT))) { control_state |= CONTROL_PIN_INDEX_SAFETY_DOOR; }
    #endif
    if (bit_isfalse(pin,(1<<CONTROL_RESET_BIT))) { control_state |= CONTROL_PIN_INDEX_RESET; }
    if (bit_isfalse(pin,(1<<CONTROL_FEED_HOLD_BIT))) { control_state |= CONTROL_PIN_INDEX_FEED_HOLD; }
    if (bit_isfalse(pin,(1<<CONTROL_CYCLE_START_BIT))) { control_state |= CONTROL_PIN_INDEX_CYCLE_START; }
  }
  return(control_state);
}

假设:未定义 INVERT_CONTROL_PIN_MASK 和 ENABLE_SAFETY_DOOR_INPUT_PIN …

并且出于某种原因,同时按下了复位、循环开始和进给保持按钮(我知道……矛盾的输入)……

然后 (CONTROL_PIN & CONTROL_MASK) – 因此 pin – 将为零…

所以 if(pin) 测试是错误的……并且没有执行其他测试。

嗯…这是预期的行为吗?

它正在做的是在任何输入未断言时执行测试… ???

所以它应该这样做if(pin != CONTROL_MASK) {???

system_control_get_state() 可能缺少输入??? #698

@bdurbrow我在最新消息来源中看到该行已从

uint8_t pin = (CONTROL_PIN & CONTROL_MASK);

进入

uint8_t pin = (CONTROL_PIN & CONTROL_MASK) ^ CONTROL_MASK;

CONTRL_PIN可能为零,但CONTROL_MASK永远不会为零,因此随着新的更改,pin变量永远不会为零(因为0 ^ CONTROL_MASK给出 CONTROL_MASK)并且将执行其他测试。

如果这对你现在有意义,那么这个问题可能会被关闭。

喜欢 (0)