Merge pull request #5118 from thinkyhead/rc_expanded_M43
Enhancements to M43 pins debugging
This commit is contained in:
		| @@ -148,6 +148,7 @@ | |||||||
|  *        The '#' is necessary when calling from within sd files, as it stops buffer prereading |  *        The '#' is necessary when calling from within sd files, as it stops buffer prereading | ||||||
|  * M33  - Get the longname version of a path. (Requires LONG_FILENAME_HOST_SUPPORT) |  * M33  - Get the longname version of a path. (Requires LONG_FILENAME_HOST_SUPPORT) | ||||||
|  * M42  - Change pin status via gcode: M42 P<pin> S<value>. LED pin assumed if P is omitted. |  * M42  - Change pin status via gcode: M42 P<pin> S<value>. LED pin assumed if P is omitted. | ||||||
|  |  * M43  - Monitor pins & report changes - report active pins | ||||||
|  * M48  - Measure Z Probe repeatability: M48 P<points> X<pos> Y<pos> V<level> E<engage> L<legs>. (Requires Z_MIN_PROBE_REPEATABILITY_TEST) |  * M48  - Measure Z Probe repeatability: M48 P<points> X<pos> Y<pos> V<level> E<engage> L<legs>. (Requires Z_MIN_PROBE_REPEATABILITY_TEST) | ||||||
|  * M75  - Start the print job timer. |  * M75  - Start the print job timer. | ||||||
|  * M76  - Pause the print job timer. |  * M76  - Pause the print job timer. | ||||||
| @@ -4675,20 +4676,43 @@ inline void gcode_M42() { | |||||||
|   /** |   /** | ||||||
|    * M43: Pin report and debug |    * M43: Pin report and debug | ||||||
|    * |    * | ||||||
|    *      P<pin> Will read/watch a single pin |    *      E<bool> Enable / disable background endstop monitoring | ||||||
|    *      W      Watch pins for changes until reboot |    *               - Machine continues to operate | ||||||
|  |    *               - Reports changes to endstops | ||||||
|  |    *               - Toggles LED when an endstop changes | ||||||
|  |    * | ||||||
|  |    *   or | ||||||
|  |    * | ||||||
|  |    *      P<pin>  Pin to read or watch. If omitted, read/watch all pins. | ||||||
|  |    *      W<bool> Watch pins -reporting changes- until reset, click, or M108. | ||||||
|  |    *      I<bool> Flag to ignore Marlin's pin protection. | ||||||
|  |    * | ||||||
|    */ |    */ | ||||||
|   inline void gcode_M43() { |   inline void gcode_M43() { | ||||||
|     int first_pin = 0, last_pin = DIO_COUNT - 1; |  | ||||||
|     if (code_seen('P')) { |     // Enable or disable endstop monitoring | ||||||
|       first_pin = last_pin = code_value_byte(); |     if (code_seen('E')) { | ||||||
|       if (first_pin > DIO_COUNT - 1) return; |       endstop_monitor_flag = code_value_bool(); | ||||||
|  |       SERIAL_PROTOCOLPGM("endstop monitor "); | ||||||
|  |       SERIAL_PROTOCOL(endstop_monitor_flag ? "en" : "dis"); | ||||||
|  |       SERIAL_PROTOCOLLNPGM("abled"); | ||||||
|  |       return; | ||||||
|     } |     } | ||||||
|  |  | ||||||
|  |     // Get the range of pins to test or watch | ||||||
|  |     int first_pin = 0, last_pin = NUM_DIGITAL_PINS - 1; | ||||||
|  |     if (code_seen('P')) { | ||||||
|  |       first_pin = last_pin = code_value_byte(); | ||||||
|  |       if (first_pin > NUM_DIGITAL_PINS - 1) return; | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     bool ignore_protection = code_seen('I') ? code_value_bool() : false; | ||||||
|  |  | ||||||
|  |     // Watch until click, M108, or reset | ||||||
|     if (code_seen('W') && code_value_bool()) { // watch digital pins |     if (code_seen('W') && code_value_bool()) { // watch digital pins | ||||||
|       byte pin_state[last_pin - first_pin + 1]; |       byte pin_state[last_pin - first_pin + 1]; | ||||||
|       for (int8_t pin = first_pin; pin <= last_pin; pin++) { |       for (int8_t pin = first_pin; pin <= last_pin; pin++) { | ||||||
|         if (pin_is_protected(pin)) continue; |         if (pin_is_protected(pin) && !ignore_protection) continue; | ||||||
|         pinMode(pin, INPUT_PULLUP); |         pinMode(pin, INPUT_PULLUP); | ||||||
|         // if (IS_ANALOG(pin)) |         // if (IS_ANALOG(pin)) | ||||||
|         //   pin_state[pin - first_pin] = analogRead(pin - analogInputToDigitalPin(0)); // int16_t pin_state[...] |         //   pin_state[pin - first_pin] = analogRead(pin - analogInputToDigitalPin(0)); // int16_t pin_state[...] | ||||||
| @@ -4720,10 +4744,12 @@ inline void gcode_M42() { | |||||||
|  |  | ||||||
|         safe_delay(500); |         safe_delay(500); | ||||||
|       } |       } | ||||||
|  |       return; | ||||||
|     } |     } | ||||||
|     else // single pins report |  | ||||||
|       for (int8_t pin = first_pin; pin <= last_pin; pin++) |     // Report current state of selected pin(s) | ||||||
|         report_pin_state(pin); |     for (uint8_t pin = first_pin; pin <= last_pin; pin++) | ||||||
|  |       report_pin_state_extended(pin, ignore_protection); | ||||||
|   } |   } | ||||||
|  |  | ||||||
| #endif // PINS_DEBUGGING | #endif // PINS_DEBUGGING | ||||||
|   | |||||||
							
								
								
									
										1125
									
								
								Marlin/pinsDebug.h
									
									
									
									
									
								
							
							
						
						
									
										1125
									
								
								Marlin/pinsDebug.h
									
									
									
									
									
								
							
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							| @@ -115,8 +115,8 @@ | |||||||
| #define HEATER_BED_PIN       3 | #define HEATER_BED_PIN       3 | ||||||
|  |  | ||||||
| #define FAN_PIN              8 | #define FAN_PIN              8 | ||||||
| #define FAN0_PIN             6 | #define FAN1_PIN             6 | ||||||
| #define FAN1_PIN             2 | #define FAN2_PIN             2 | ||||||
|  |  | ||||||
| // | // | ||||||
| // Misc. Functions | // Misc. Functions | ||||||
|   | |||||||
| @@ -462,12 +462,12 @@ int Temperature::getHeaterPower(int heater) { | |||||||
|       AUTO_3_IS_0 ? 0 : AUTO_3_IS_1 ? 1 : AUTO_3_IS_2 ? 2 : 3 |       AUTO_3_IS_0 ? 0 : AUTO_3_IS_1 ? 1 : AUTO_3_IS_2 ? 2 : 3 | ||||||
|     }; |     }; | ||||||
|     uint8_t fanState = 0; |     uint8_t fanState = 0; | ||||||
|   |  | ||||||
|     HOTEND_LOOP() { |     HOTEND_LOOP() { | ||||||
|       if (current_temperature[e] > EXTRUDER_AUTO_FAN_TEMPERATURE) |       if (current_temperature[e] > EXTRUDER_AUTO_FAN_TEMPERATURE) | ||||||
|         SBI(fanState, fanBit[e]); |         SBI(fanState, fanBit[e]); | ||||||
|     } |     } | ||||||
|   |  | ||||||
|     uint8_t fanDone = 0; |     uint8_t fanDone = 0; | ||||||
|     for (uint8_t f = 0; f < COUNT(fanPin); f++) { |     for (uint8_t f = 0; f < COUNT(fanPin); f++) { | ||||||
|       int8_t pin = fanPin[f]; |       int8_t pin = fanPin[f]; | ||||||
| @@ -1393,6 +1393,87 @@ void Temperature::set_current_temp_raw() { | |||||||
|   temp_meas_ready = true; |   temp_meas_ready = true; | ||||||
| } | } | ||||||
|  |  | ||||||
|  | #if ENABLED(PINS_DEBUGGING) | ||||||
|  |   /** | ||||||
|  |    * monitors endstops & Z probe for changes | ||||||
|  |    * | ||||||
|  |    * If a change is detected then the LED is toggled and | ||||||
|  |    * a message is sent out the serial port | ||||||
|  |    * | ||||||
|  |    * Yes, we could miss a rapid back & forth change but | ||||||
|  |    * that won't matter because this is all manual. | ||||||
|  |    * | ||||||
|  |    */ | ||||||
|  |   void endstop_monitor() { | ||||||
|  |     static uint16_t old_endstop_bits_local = 0; | ||||||
|  |     static uint8_t local_LED_status = 0; | ||||||
|  |     uint16_t current_endstop_bits_local = 0; | ||||||
|  |     #if HAS_X_MIN | ||||||
|  |       if (READ(X_MIN_PIN)) SBI(current_endstop_bits_local, X_MIN); | ||||||
|  |     #endif | ||||||
|  |     #if HAS_X_MAX | ||||||
|  |       if (READ(X_MAX_PIN)) SBI(current_endstop_bits_local, X_MAX); | ||||||
|  |     #endif | ||||||
|  |     #if HAS_Y_MIN | ||||||
|  |       if (READ(Y_MIN_PIN)) SBI(current_endstop_bits_local, Y_MIN); | ||||||
|  |     #endif | ||||||
|  |     #if HAS_Y_MAX | ||||||
|  |       if (READ(Y_MAX_PIN)) SBI(current_endstop_bits_local, Y_MAX); | ||||||
|  |     #endif | ||||||
|  |     #if HAS_Z_MIN | ||||||
|  |       if (READ(Z_MIN_PIN)) SBI(current_endstop_bits_local, Z_MIN); | ||||||
|  |     #endif | ||||||
|  |     #if HAS_Z_MAX | ||||||
|  |       if (READ(Z_MAX_PIN)) SBI(current_endstop_bits_local, Z_MAX); | ||||||
|  |     #endif | ||||||
|  |     #if HAS_Z_MIN_PROBE_PIN | ||||||
|  |       if (READ(Z_MIN_PROBE_PIN)) SBI(current_endstop_bits_local, Z_MIN_PROBE); | ||||||
|  |     #endif | ||||||
|  |     #if HAS_Z2_MIN | ||||||
|  |       if (READ(Z2_MIN_PIN)) SBI(current_endstop_bits_local, Z2_MIN); | ||||||
|  |     #endif | ||||||
|  |     #if HAS_Z2_MAX | ||||||
|  |       if (READ(Z2_MAX_PIN)) SBI(current_endstop_bits_local, Z2_MAX); | ||||||
|  |     #endif | ||||||
|  |  | ||||||
|  |     uint16_t endstop_change = current_endstop_bits_local ^ old_endstop_bits_local; | ||||||
|  |  | ||||||
|  |     if (endstop_change) { | ||||||
|  |       #if HAS_X_MIN | ||||||
|  |         if (TEST(endstop_change, X_MIN)) SERIAL_PROTOCOLPAIR("X_MIN:", !!TEST(current_endstop_bits_local, X_MIN)); | ||||||
|  |       #endif | ||||||
|  |       #if HAS_X_MAX | ||||||
|  |         if (TEST(endstop_change, X_MAX)) SERIAL_PROTOCOLPAIR("  X_MAX:", !!TEST(current_endstop_bits_local, X_MAX)); | ||||||
|  |       #endif | ||||||
|  |       #if HAS_Y_MIN | ||||||
|  |         if (TEST(endstop_change, Y_MIN)) SERIAL_PROTOCOLPAIR("  Y_MIN:", !!TEST(current_endstop_bits_local, Y_MIN)); | ||||||
|  |       #endif | ||||||
|  |       #if HAS_Y_MAX | ||||||
|  |         if (TEST(endstop_change, Y_MAX)) SERIAL_PROTOCOLPAIR("  Y_MAX:", !!TEST(current_endstop_bits_local, Y_MAX)); | ||||||
|  |       #endif | ||||||
|  |       #if HAS_Z_MIN | ||||||
|  |         if (TEST(endstop_change, Z_MIN)) SERIAL_PROTOCOLPAIR("  Z_MIN:", !!TEST(current_endstop_bits_local, Z_MIN)); | ||||||
|  |       #endif | ||||||
|  |       #if HAS_Z_MAX | ||||||
|  |         if (TEST(endstop_change, Z_MAX)) SERIAL_PROTOCOLPAIR("  Z_MAX:", !!TEST(current_endstop_bits_local, Z_MAX)); | ||||||
|  |       #endif | ||||||
|  |       #if HAS_Z_MIN_PROBE_PIN | ||||||
|  |         if (TEST(endstop_change, Z_MIN_PROBE)) SERIAL_PROTOCOLPAIR("  PROBE:", !!TEST(current_endstop_bits_local, Z_MIN_PROBE)); | ||||||
|  |       #endif | ||||||
|  |       #if HAS_Z2_MIN | ||||||
|  |         if (TEST(endstop_change, Z2_MIN)) SERIAL_PROTOCOLPAIR("  Z2_MIN:", !!TEST(current_endstop_bits_local, Z2_MIN)); | ||||||
|  |       #endif | ||||||
|  |       #if HAS_Z2_MAX | ||||||
|  |         if (TEST(endstop_change, Z2_MAX)) SERIAL_PROTOCOLPAIR("  Z2_MAX:", !!TEST(current_endstop_bits_local, Z2_MAX)); | ||||||
|  |       #endif | ||||||
|  |       SERIAL_PROTOCOLPGM("\n\n"); | ||||||
|  |       analogWrite(LED_PIN, local_LED_status); | ||||||
|  |       local_LED_status ^= 255; | ||||||
|  |       old_endstop_bits_local = current_endstop_bits_local; | ||||||
|  |     } | ||||||
|  |   } | ||||||
|  | #endif // PINS_DEBUGGING | ||||||
|  |  | ||||||
| /** | /** | ||||||
|  * Timer 0 is shared with millies so don't change the prescaler. |  * Timer 0 is shared with millies so don't change the prescaler. | ||||||
|  * |  * | ||||||
| @@ -1848,4 +1929,15 @@ void Temperature::isr() { | |||||||
|       } |       } | ||||||
|     } |     } | ||||||
|   #endif //BABYSTEPPING |   #endif //BABYSTEPPING | ||||||
|  |  | ||||||
|  |   #if ENABLED(PINS_DEBUGGING) | ||||||
|  |     extern bool endstop_monitor_flag; | ||||||
|  |     // run the endstop monitor at 15Hz | ||||||
|  |     static uint8_t endstop_monitor_count = 16;  // offset this check from the others | ||||||
|  |     if (endstop_monitor_flag) { | ||||||
|  |       endstop_monitor_count += _BV(1);  //  15 Hz | ||||||
|  |       endstop_monitor_count &= 0x7F; | ||||||
|  |       if (!endstop_monitor_count) endstop_monitor();  // report changes in endstop status | ||||||
|  |     } | ||||||
|  |   #endif | ||||||
| } | } | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user