diff --git a/g2core/canonical_machine.cpp b/g2core/canonical_machine.cpp index bda76410..1d6a2e38 100644 --- a/g2core/canonical_machine.cpp +++ b/g2core/canonical_machine.cpp @@ -116,6 +116,91 @@ cmSingleton_t cm; // canonical machine controller singleton +/* + * _hold_input_handler - a gpioDigitalInputHandler to capture pin change events + * Will be registered at init + */ +gpioDigitalInputHandler _hold_input_handler { + [&](const bool state, const inputEdgeFlag edge, const uint8_t triggering_pin_number) { + if (edge != INPUT_EDGE_LEADING) { return false; } + + cm_start_hold(); + + return false; // allow others to see this notice + }, + 5, // priority + nullptr // next - nullptr to start with +}; + +/* + * _halt_input_handler - a gpioDigitalInputHandler to capture pin change events + * Will be registered at init + */ +gpioDigitalInputHandler _halt_input_handler { + [&](const bool state, const inputEdgeFlag edge, const uint8_t triggering_pin_number) { + if (edge != INPUT_EDGE_LEADING) { return false; } + + cm_halt_all(); + + return false; // allow others to see this notice + }, + 5, // priority + nullptr // next - nullptr to start with +}; + + +/* + * _alarm_input_handler - a gpioDigitalInputHandler to capture pin change events + * Will be registered at init + */ +gpioDigitalInputHandler _alarm_input_handler { + [&](const bool state, const inputEdgeFlag edge, const uint8_t triggering_pin_number) { + if (edge != INPUT_EDGE_LEADING) { return false; } + + char msg[10]; + sprintf(msg, "input %d", triggering_pin_number); + cm_alarm(STAT_ALARM, msg); + + return false; // allow others to see this notice + }, + 5, // priority + nullptr // next - nullptr to start with +}; + +/* + * _panic_input_handler - a gpioDigitalInputHandler to capture pin change events + * Will be registered at init + */ +gpioDigitalInputHandler _panic_input_handler { + [&](const bool state, const inputEdgeFlag edge, const uint8_t triggering_pin_number) { + if (edge != INPUT_EDGE_LEADING) { return false; } + + char msg[10]; + sprintf(msg, "input %d", triggering_pin_number); + cm_panic(STAT_PANIC, msg); + + return false; // allow others to see this notice + }, + 5, // priority + nullptr // next - nullptr to start with +}; + +/* + * _reset_input_handler - a gpioDigitalInputHandler to capture pin change events + * Will be registered at init + */ +gpioDigitalInputHandler _reset_input_handler { + [&](const bool state, const inputEdgeFlag edge, const uint8_t triggering_pin_number) { + if (edge != INPUT_EDGE_LEADING) { return false; } + + hw_hard_reset(); + + return false; // this likely won't be seen, but just in case... + }, + 5, // priority + nullptr // next - nullptr to start with +}; + /*********************************************************************************** **** GENERIC STATIC FUNCTIONS AND VARIABLES *************************************** ***********************************************************************************/ @@ -748,7 +833,7 @@ stat_t cm_test_soft_limits(const float target[]) * canonical_machine_init() - initialize cm struct * canonical_machine_reset() - apply startup settings or reset to startup * run profile initialization beforehand - */ +*/ void canonical_machine_init() { @@ -761,12 +846,12 @@ void canonical_machine_init() ACTIVE_MODEL = MODEL; // setup initial Gcode model pointer cm_arc_init(); // Note: spindle and coolant inits are independent - din_handlers[INPUT_ACTION_STOP].registerHandler(&_hold_handler); - din_handlers[INPUT_ACTION_FAST_STOP].registerHandler(&_hold_handler); - din_handlers[INPUT_ACTION_HALT].registerHandler(&_halt_handler); - din_handlers[INPUT_ACTION_ALARM].registerHandler(&_alarm_handler); - din_handlers[INPUT_ACTION_PANIC].registerHandler(&_panic_handler); - din_handlers[INPUT_ACTION_RESET].registerHandler(&_reset_handler); + din_handlers[INPUT_ACTION_STOP].registerHandler(&_hold_input_handler); + din_handlers[INPUT_ACTION_FAST_STOP].registerHandler(&_hold_input_handler); + din_handlers[INPUT_ACTION_HALT].registerHandler(&_halt_input_handler); + din_handlers[INPUT_ACTION_ALARM].registerHandler(&_alarm_input_handler); + din_handlers[INPUT_ACTION_PANIC].registerHandler(&_panic_input_handler); + din_handlers[INPUT_ACTION_RESET].registerHandler(&_reset_input_handler); } void canonical_machine_reset_rotation() { @@ -879,24 +964,6 @@ stat_t cm_clr(nvObj_t *nv) // clear alarm or shutdown from comman return (STAT_OK); } -/* - * _alarm_handler - a gpioDigitalInputHandler to capture pin change events - * Will be registered at init - */ -gpioDigitalInputHandler _alarm_handler { - [&](const bool state, const inputEdgeFlag edge, const uint8_t triggering_pin_number) { - if (edge != INPUT_EDGE_LEADING) { return false; } - - char msg[10]; - sprintf(msg, "input %d", triggering_pin_number); - cm_alarm(STAT_ALARM, msg); - - return false; // allow others to see this notice - }, - 5, // priority - nullptr // next - nullptr to start with -}; - /* * cm_clear() - clear ALARM and SHUTDOWN states * cm_parse_clear() - parse incoming gcode for M30 or M2 clears if in ALARM state @@ -963,21 +1030,6 @@ void cm_halt_motion(void) cm.hold_state = FEEDHOLD_OFF; } -/* - * _hold_handler - a gpioDigitalInputHandler to capture pin change events - * Will be registered at init - */ -gpioDigitalInputHandler _halt_handler { - [&](const bool state, const inputEdgeFlag edge, const uint8_t triggering_pin_number) { - if (edge != INPUT_EDGE_LEADING) { return false; } - - cm_halt_all(); - - return false; // allow others to see this notice - }, - 5, // priority - nullptr // next - nullptr to start with -}; /* * cm_alarm() - enter ALARM state @@ -1089,40 +1141,6 @@ stat_t cm_panic(const stat_t status, const char *msg) return (status); } -/* - * _panic_handler - a gpioDigitalInputHandler to capture pin change events - * Will be registered at init - */ -gpioDigitalInputHandler _panic_handler { - [&](const bool state, const inputEdgeFlag edge, const uint8_t triggering_pin_number) { - if (edge != INPUT_EDGE_LEADING) { return false; } - - char msg[10]; - sprintf(msg, "input %d", triggering_pin_number); - cm_panic(STAT_PANIC, msg); - - return false; // allow others to see this notice - }, - 5, // priority - nullptr // next - nullptr to start with -}; - -/* - * _reset_handler - a gpioDigitalInputHandler to capture pin change events - * Will be registered at init - */ -gpioDigitalInputHandler _reset_handler { - [&](const bool state, const inputEdgeFlag edge, const uint8_t triggering_pin_number) { - if (edge != INPUT_EDGE_LEADING) { return false; } - - hw_hard_reset(); - - return false; // this likely won't be seen, but just in case... - }, - 5, // priority - nullptr // next - nullptr to start with -}; - /************************** * Representation (4.3.3) * **************************/ @@ -2004,6 +2022,7 @@ void cm_end_hold() } } } + void cm_queue_flush() { if (mp_runtime_is_idle()) { // can't flush planner during movement @@ -2020,23 +2039,6 @@ void cm_queue_flush() } } -/* - * _hold_handler - a gpioDigitalInputHandler to capture pin change events - * Will be registered at init - */ -gpioDigitalInputHandler _hold_handler { - [&](const bool state, const inputEdgeFlag edge, const uint8_t triggering_pin_number) { - if (edge != INPUT_EDGE_LEADING) { return false; } - - cm_start_hold(); - - return false; // allow others to see this notice - }, - 5, // priority - nullptr // next - nullptr to start with -}; - - /****************************** * Program Functions (4.3.10) * ******************************/ diff --git a/g2core/controller.cpp b/g2core/controller.cpp index 63b778a0..14ab7149 100644 --- a/g2core/controller.cpp +++ b/g2core/controller.cpp @@ -81,6 +81,44 @@ static stat_t _controller_state(void); // manage controller state trans static Motate::OutputPin safe_pin; +gpioDigitalInputHandler _shutdown_input_handler { + [&](const bool state, const inputEdgeFlag edge, const uint8_t triggering_pin_number) { + if (edge != INPUT_EDGE_LEADING) { return false; } + + cm.shutdown_requested = triggering_pin_number; + + return false; // allow others to see this notice + }, + 5, // priority + nullptr // next - nullptr to start with +}; + +gpioDigitalInputHandler _limit_input_handler { + [&](const bool state, const inputEdgeFlag edge, const uint8_t triggering_pin_number) { + if (edge != INPUT_EDGE_LEADING) { return false; } + + cm.limit_requested = triggering_pin_number; + + return false; // allow others to see this notice + }, + 5, // priority + nullptr // next - nullptr to start with +}; + +gpioDigitalInputHandler _interlock_input_handler { + [&](const bool state, const inputEdgeFlag edge, const uint8_t triggering_pin_number) { + if (edge == INPUT_EDGE_LEADING) { + cm.safety_interlock_disengaged = triggering_pin_number; + } else { // edge == INPUT_EDGE_TRAILING + cm.safety_interlock_reengaged = triggering_pin_number; + } + + return false; // allow others to see this notice + }, + 5, // priority + nullptr // next - nullptr to start with +}; + /*********************************************************************************** **** CODE ************************************************************************* ***********************************************************************************/ @@ -106,9 +144,9 @@ void controller_init() } // IndicatorLed.setFrequency(100000); - din_handlers[INPUT_ACTION_SHUTDOWN].registerHandler(&_shutdown_handler); - din_handlers[INPUT_ACTION_LIMIT].registerHandler(&_limit_handler); - din_handlers[INPUT_ACTION_INTERLOCK].registerHandler(&_interlock_handler); + din_handlers[INPUT_ACTION_SHUTDOWN].registerHandler(&_shutdown_input_handler); + din_handlers[INPUT_ACTION_LIMIT].registerHandler(&_limit_input_handler); + din_handlers[INPUT_ACTION_INTERLOCK].registerHandler(&_interlock_input_handler); } void controller_request_enquiry() @@ -466,10 +504,10 @@ static stat_t _sync_to_planner() /* ALARM STATE HANDLERS * * _shutdown_handler() - put system into shutdown state - * _shutdown_handler - a gpioDigitalInputHandler to capture pin change events + * _shutdown_input_handler - a gpioDigitalInputHandler to capture pin change events * _limit_switch_handler() - shut down system if limit switch fired - * _limit_handler - a gpioDigitalInputHandler to capture pin change events - * _interlock_handler() - feedhold and resume depending on edge + * _limit_input_handler - a gpioDigitalInputHandler to capture pin change events + * _interlock_input_handler() - feedhold and resume depending on edge * _interlock_handler - a gpioDigitalInputHandler to capture pin change events * * Some handlers return EAGAIN causing the control loop to never advance beyond that point. @@ -480,18 +518,6 @@ static stat_t _sync_to_planner() * - safety_interlock_requested == INPUT_EDGE_TRAILING is interlock offset */ -gpioDigitalInputHandler _shutdown_handler { - [&](const bool state, const inputEdgeFlag edge, const uint8_t triggering_pin_number) { - if (edge != INPUT_EDGE_LEADING) { return false; } - - cm.shutdown_requested = triggering_pin_number; - - return false; // allow others to see this notice - }, - 5, // priority - nullptr // next - nullptr to start with -}; - static stat_t _shutdown_handler(void) { if (cm.shutdown_requested != 0) { // request may contain the (non-zero) input number @@ -503,18 +529,6 @@ static stat_t _shutdown_handler(void) return(STAT_OK); } -gpioDigitalInputHandler _limit_handler { - [&](const bool state, const inputEdgeFlag edge, const uint8_t triggering_pin_number) { - if (edge != INPUT_EDGE_LEADING) { return false; } - - cm.limit_requested = triggering_pin_number; - - return false; // allow others to see this notice - }, - 5, // priority - nullptr // next - nullptr to start with -}; - static stat_t _limit_switch_handler(void) { auto machine_state = cm_get_machine_state(); @@ -533,20 +547,6 @@ static stat_t _limit_switch_handler(void) return (STAT_OK); } -gpioDigitalInputHandler _interlock_handler { - [&](const bool state, const inputEdgeFlag edge, const uint8_t triggering_pin_number) { - if (edge == INPUT_EDGE_LEADING) { - cm.safety_interlock_disengaged = triggering_pin_number; - } else { // edge == INPUT_EDGE_TRAILING - cm.safety_interlock_reengaged = triggering_pin_number; - } - - return false; // allow others to see this notice - }, - 5, // priority - nullptr // next - nullptr to start with -}; - static stat_t _interlock_handler(void) { if (cm.safety_interlock_enable) {