其中endstops.event_handler()函数部分代码如下对其进行解释说明void Endstops::event_handler() { static endstop_mask_t prev_hit_state; // = 0 if (hit_state == prev_hit_state) return; prev_hit_state = hit_state; if (hit_state) { #if HAS_STATUS_MESSAGE char NUM_AXIS_LIST(chrX = ' ', chrY = ' ', chrZ = ' ', chrI = ' ', chrJ = ' ', chrK = ' ', chrU = ' ', chrV = ' ', chrW = ' '), chrP = ' '; #define _SET_STOP_CHAR(A,C) (chr## A = C) #else #define _SET_STOP_CHAR(A,C) NOOP #endif #define _ENDSTOP_HIT_ECHO(A,C) do{ \ SERIAL_ECHOPGM(" " STRINGIFY(A) ":", planner.triggered_position_mm(_AXIS(A))); _SET_STOP_CHAR(A,C); }while(0) #define _ENDSTOP_HIT_TEST(A,C) \ if (TERN0(HAS_##A##_MIN, TEST(hit_state, A##_MIN)) || TERN0(HAS_##A##_MAX, TEST(hit_state, A##_MAX))) \ _ENDSTOP_HIT_ECHO(A,C)
时间: 2024-04-24 08:22:10 浏览: 174
这段代码是 Marlin 2.1.1 中 Endstops 类的 event_handler() 函数的一部分。该函数的作用是处理机械开关的事件,即检测是否有机械开关触发。
以下是对该函数的具体解释:
1. static endstop_mask_t prev_hit_state; // = 0:声明一个静态变量 prev_hit_state,用来记录上一次机械开关的状态,初值为 0。
2. if (hit_state == prev_hit_state) return;:如果当前机械开关状态与上一次相同,直接返回,不做处理。
3. prev_hit_state = hit_state;:将当前机械开关状态记录到 prev_hit_state 变量中,以备下次调用时使用。
4. #if HAS_STATUS_MESSAGE ... #endif:如果启用了状态消息功能,就定义一些字符变量。
5. #define _SET_STOP_CHAR(A,C) (chr## A = C):定义一个宏,用来设置机械开关触发时对应字符的值。
6. #define _ENDSTOP_HIT_ECHO(A,C) do{ ... }while(0):定义一个宏,用来输出机械开关触发的信息。
7. #define _ENDSTOP_HIT_TEST(A,C) ...:定义一个宏,用来测试机械开关是否触发。
8. _ENDSTOP_HIT_TEST(A,C):如果机械开关触发,就调用 _ENDSTOP_HIT_ECHO 宏输出信息,并设置对应字符的值。
这段代码的主要作用是检测机械开关是否触发,并输出相关信息。如果启用了状态消息功能,还会在 LCD 显示器上显示对应字符。这样可以让用户及时了解 3D 打印机的运行状态,从而进行调试和故障排除。
阅读全文