G-code Digital Buttons (#18389)
Co-Authored-By: android444 <24375898+android444@users.noreply.github.com> Co-authored-by: Scott Lahteine <thinkyhead@users.noreply.github.com>
This commit is contained in:
		
				
					committed by
					
						 Scott Lahteine
						Scott Lahteine
					
				
			
			
				
	
			
			
			
						parent
						
							7eace53eb7
						
					
				
				
					commit
					f3db2551a6
				
			| @@ -3369,6 +3369,37 @@ | ||||
|   #define GCODE_MACROS_SLOT_SIZE  50  // Maximum length of a single macro | ||||
| #endif | ||||
|  | ||||
| /** | ||||
|  * User-defined buttons to run custom G-code. | ||||
|  * Up to 25 may be defined. | ||||
|  */ | ||||
| //#define CUSTOM_USER_BUTTONS | ||||
| #if ENABLED(CUSTOM_USER_BUTTONS) | ||||
|   //#define BUTTON1_PIN -1 | ||||
|   #if PIN_EXISTS(BUTTON1_PIN) | ||||
|     #define BUTTON1_HIT_STATE     LOW       // State of the triggered button. NC=LOW. NO=HIGH. | ||||
|     #define BUTTON1_WHEN_PRINTING false     // Button allowed to trigger during printing? | ||||
|     #define BUTTON1_GCODE         "G28" | ||||
|     #define BUTTON1_DESC          "Homing"  // Optional string to set the LCD status | ||||
|   #endif | ||||
|  | ||||
|   //#define BUTTON2_PIN -1 | ||||
|   #if PIN_EXISTS(BUTTON2_PIN) | ||||
|     #define BUTTON2_HIT_STATE     LOW | ||||
|     #define BUTTON2_WHEN_PRINTING false | ||||
|     #define BUTTON2_GCODE         "M140 S" STRINGIFY(PREHEAT_1_TEMP_BED) "\nM104 S" STRINGIFY(PREHEAT_1_TEMP_HOTEND) | ||||
|     #define BUTTON2_DESC          "Preheat for " PREHEAT_1_LABEL | ||||
|   #endif | ||||
|  | ||||
|   //#define BUTTON3_PIN -1 | ||||
|   #if PIN_EXISTS(BUTTON3_PIN) | ||||
|     #define BUTTON3_HIT_STATE     LOW | ||||
|     #define BUTTON3_WHEN_PRINTING false | ||||
|     #define BUTTON3_GCODE         "M140 S" STRINGIFY(PREHEAT_2_TEMP_BED) "\nM104 S" STRINGIFY(PREHEAT_2_TEMP_HOTEND) | ||||
|     #define BUTTON3_DESC          "Preheat for " PREHEAT_2_LABEL | ||||
|   #endif | ||||
| #endif | ||||
|  | ||||
| /** | ||||
|  * User-defined menu items to run custom G-code. | ||||
|  * Up to 25 may be defined, but the actual number is LCD-dependent. | ||||
|   | ||||
| @@ -406,6 +406,7 @@ void startOrResumeJob() { | ||||
|  *  - Check if CHDK_PIN needs to go LOW | ||||
|  *  - Check for KILL button held down | ||||
|  *  - Check for HOME button held down | ||||
|  *  - Check for CUSTOM USER button held down | ||||
|  *  - Check if cooling fan needs to be switched on | ||||
|  *  - Check if an idle but hot extruder needs filament extruded (EXTRUDER_RUNOUT_PREVENT) | ||||
|  *  - Pulse FET_SAFETY_PIN if it exists | ||||
| @@ -498,6 +499,102 @@ inline void manage_inactivity(const bool ignore_stepper_queue=false) { | ||||
|     } | ||||
|   #endif | ||||
|  | ||||
|   #if ENABLED(CUSTOM_USER_BUTTONS) | ||||
|     // Handle a custom user button if defined | ||||
|     const bool printer_not_busy = !printingIsActive(); | ||||
|     #define HAS_CUSTOM_USER_BUTTON(N) (PIN_EXISTS(BUTTON##N) && defined(BUTTON##N##_HIT_STATE) && defined(BUTTON##N##_GCODE) && defined(BUTTON##N##_DESC)) | ||||
|     #define CHECK_CUSTOM_USER_BUTTON(N) do{                            \ | ||||
|       constexpr millis_t CUB_DEBOUNCE_DELAY_##N = 250UL;               \ | ||||
|       static millis_t next_cub_ms_##N;                                 \ | ||||
|       if (BUTTON##N##_HIT_STATE == READ(BUTTON##N##_PIN)               \ | ||||
|         && (ENABLED(BUTTON##N##_WHEN_PRINTING) || printer_not_busy)) { \ | ||||
|         const millis_t ms = millis();                                  \ | ||||
|         if (ELAPSED(ms, next_cub_ms_##N)) {                            \ | ||||
|           next_cub_ms_##N = ms + CUB_DEBOUNCE_DELAY_##N;               \ | ||||
|           if (strlen(BUTTON##N##_DESC))                                \ | ||||
|             LCD_MESSAGEPGM_P(PSTR(BUTTON##N##_DESC));                  \ | ||||
|           queue.inject_P(PSTR(BUTTON##N##_GCODE));                     \ | ||||
|         }                                                              \ | ||||
|       }                                                                \ | ||||
|     }while(0) | ||||
|  | ||||
|     #if HAS_CUSTOM_USER_BUTTON(1) | ||||
|       CHECK_CUSTOM_USER_BUTTON(1); | ||||
|     #endif | ||||
|     #if HAS_CUSTOM_USER_BUTTON(2) | ||||
|       CHECK_CUSTOM_USER_BUTTON(2); | ||||
|     #endif | ||||
|     #if HAS_CUSTOM_USER_BUTTON(3) | ||||
|       CHECK_CUSTOM_USER_BUTTON(3); | ||||
|     #endif | ||||
|     #if HAS_CUSTOM_USER_BUTTON(4) | ||||
|       CHECK_CUSTOM_USER_BUTTON(4); | ||||
|     #endif | ||||
|     #if HAS_CUSTOM_USER_BUTTON(5) | ||||
|       CHECK_CUSTOM_USER_BUTTON(5); | ||||
|     #endif | ||||
|     #if HAS_CUSTOM_USER_BUTTON(6) | ||||
|       CHECK_CUSTOM_USER_BUTTON(6); | ||||
|     #endif | ||||
|     #if HAS_CUSTOM_USER_BUTTON(7) | ||||
|       CHECK_CUSTOM_USER_BUTTON(7); | ||||
|     #endif | ||||
|     #if HAS_CUSTOM_USER_BUTTON(8) | ||||
|       CHECK_CUSTOM_USER_BUTTON(8); | ||||
|     #endif | ||||
|     #if HAS_CUSTOM_USER_BUTTON(9) | ||||
|       CHECK_CUSTOM_USER_BUTTON(9); | ||||
|     #endif | ||||
|     #if HAS_CUSTOM_USER_BUTTON(10) | ||||
|       CHECK_CUSTOM_USER_BUTTON(10); | ||||
|     #endif | ||||
|     #if HAS_CUSTOM_USER_BUTTON(11) | ||||
|       CHECK_CUSTOM_USER_BUTTON(11); | ||||
|     #endif | ||||
|     #if HAS_CUSTOM_USER_BUTTON(12) | ||||
|       CHECK_CUSTOM_USER_BUTTON(12); | ||||
|     #endif | ||||
|     #if HAS_CUSTOM_USER_BUTTON(13) | ||||
|       CHECK_CUSTOM_USER_BUTTON(13); | ||||
|     #endif | ||||
|     #if HAS_CUSTOM_USER_BUTTON(14) | ||||
|       CHECK_CUSTOM_USER_BUTTON(14); | ||||
|     #endif | ||||
|     #if HAS_CUSTOM_USER_BUTTON(15) | ||||
|       CHECK_CUSTOM_USER_BUTTON(15); | ||||
|     #endif | ||||
|     #if HAS_CUSTOM_USER_BUTTON(16) | ||||
|       CHECK_CUSTOM_USER_BUTTON(16); | ||||
|     #endif | ||||
|     #if HAS_CUSTOM_USER_BUTTON(17) | ||||
|       CHECK_CUSTOM_USER_BUTTON(17); | ||||
|     #endif | ||||
|     #if HAS_CUSTOM_USER_BUTTON(18) | ||||
|       CHECK_CUSTOM_USER_BUTTON(18); | ||||
|     #endif | ||||
|     #if HAS_CUSTOM_USER_BUTTON(19) | ||||
|       CHECK_CUSTOM_USER_BUTTON(19); | ||||
|     #endif | ||||
|     #if HAS_CUSTOM_USER_BUTTON(20) | ||||
|       CHECK_CUSTOM_USER_BUTTON(20); | ||||
|     #endif | ||||
|     #if HAS_CUSTOM_USER_BUTTON(21) | ||||
|       CHECK_CUSTOM_USER_BUTTON(21); | ||||
|     #endif | ||||
|     #if HAS_CUSTOM_USER_BUTTON(22) | ||||
|       CHECK_CUSTOM_USER_BUTTON(22); | ||||
|     #endif | ||||
|     #if HAS_CUSTOM_USER_BUTTON(23) | ||||
|       CHECK_CUSTOM_USER_BUTTON(23); | ||||
|     #endif | ||||
|     #if HAS_CUSTOM_USER_BUTTON(24) | ||||
|       CHECK_CUSTOM_USER_BUTTON(24); | ||||
|     #endif | ||||
|     #if HAS_CUSTOM_USER_BUTTON(25) | ||||
|       CHECK_CUSTOM_USER_BUTTON(25); | ||||
|     #endif | ||||
|   #endif | ||||
|  | ||||
|   TERN_(USE_CONTROLLER_FAN, controllerFan.update()); // Check if fan should be turned on to cool stepper drivers down | ||||
|  | ||||
|   TERN_(AUTO_POWER_CONTROL, powerManager.check()); | ||||
| @@ -857,7 +954,7 @@ inline void tmc_standby_setup() { | ||||
|  | ||||
| /** | ||||
|  * Marlin entry-point: Set up before the program loop | ||||
|  *  - Set up the kill pin, filament runout, power hold | ||||
|  *  - Set up the kill pin, filament runout, power hold, custom user buttons | ||||
|  *  - Start the serial port | ||||
|  *  - Print startup messages and diagnostics | ||||
|  *  - Get EEPROM or default settings | ||||
| @@ -1131,6 +1228,86 @@ void setup() { | ||||
|     SET_INPUT_PULLUP(HOME_PIN); | ||||
|   #endif | ||||
|  | ||||
|   #if ENABLED(CUSTOM_USER_BUTTONS) | ||||
|     #define INIT_CUSTOM_USER_BUTTON_PIN(N) do{ SET_INPUT(BUTTON##N##_PIN); WRITE(BUTTON##N##_PIN, !BUTTON##N##_HIT_STATE); }while(0) | ||||
|  | ||||
|     #if HAS_CUSTOM_USER_BUTTON(1) | ||||
|       INIT_CUSTOM_USER_BUTTON_PIN(1); | ||||
|     #endif | ||||
|     #if HAS_CUSTOM_USER_BUTTON(2) | ||||
|       INIT_CUSTOM_USER_BUTTON_PIN(2); | ||||
|     #endif | ||||
|     #if HAS_CUSTOM_USER_BUTTON(3) | ||||
|       INIT_CUSTOM_USER_BUTTON_PIN(3); | ||||
|     #endif | ||||
|     #if HAS_CUSTOM_USER_BUTTON(4) | ||||
|       INIT_CUSTOM_USER_BUTTON_PIN(4); | ||||
|     #endif | ||||
|     #if HAS_CUSTOM_USER_BUTTON(5) | ||||
|       INIT_CUSTOM_USER_BUTTON_PIN(5); | ||||
|     #endif | ||||
|     #if HAS_CUSTOM_USER_BUTTON(6) | ||||
|       INIT_CUSTOM_USER_BUTTON_PIN(6); | ||||
|     #endif | ||||
|     #if HAS_CUSTOM_USER_BUTTON(7) | ||||
|       INIT_CUSTOM_USER_BUTTON_PIN(7); | ||||
|     #endif | ||||
|     #if HAS_CUSTOM_USER_BUTTON(8) | ||||
|       INIT_CUSTOM_USER_BUTTON_PIN(8); | ||||
|     #endif | ||||
|     #if HAS_CUSTOM_USER_BUTTON(9) | ||||
|       INIT_CUSTOM_USER_BUTTON_PIN(9); | ||||
|     #endif | ||||
|     #if HAS_CUSTOM_USER_BUTTON(10) | ||||
|       INIT_CUSTOM_USER_BUTTON_PIN(10); | ||||
|     #endif | ||||
|     #if HAS_CUSTOM_USER_BUTTON(11) | ||||
|       INIT_CUSTOM_USER_BUTTON_PIN(11); | ||||
|     #endif | ||||
|     #if HAS_CUSTOM_USER_BUTTON(12) | ||||
|       INIT_CUSTOM_USER_BUTTON_PIN(12); | ||||
|     #endif | ||||
|     #if HAS_CUSTOM_USER_BUTTON(13) | ||||
|       INIT_CUSTOM_USER_BUTTON_PIN(13); | ||||
|     #endif | ||||
|     #if HAS_CUSTOM_USER_BUTTON(14) | ||||
|       INIT_CUSTOM_USER_BUTTON_PIN(14); | ||||
|     #endif | ||||
|     #if HAS_CUSTOM_USER_BUTTON(15) | ||||
|       INIT_CUSTOM_USER_BUTTON_PIN(15); | ||||
|     #endif | ||||
|     #if HAS_CUSTOM_USER_BUTTON(16) | ||||
|       INIT_CUSTOM_USER_BUTTON_PIN(16); | ||||
|     #endif | ||||
|     #if HAS_CUSTOM_USER_BUTTON(17) | ||||
|       INIT_CUSTOM_USER_BUTTON_PIN(17); | ||||
|     #endif | ||||
|     #if HAS_CUSTOM_USER_BUTTON(18) | ||||
|       INIT_CUSTOM_USER_BUTTON_PIN(18); | ||||
|     #endif | ||||
|     #if HAS_CUSTOM_USER_BUTTON(19) | ||||
|       INIT_CUSTOM_USER_BUTTON_PIN(19); | ||||
|     #endif | ||||
|     #if HAS_CUSTOM_USER_BUTTON(20) | ||||
|       INIT_CUSTOM_USER_BUTTON_PIN(20); | ||||
|     #endif | ||||
|     #if HAS_CUSTOM_USER_BUTTON(21) | ||||
|       INIT_CUSTOM_USER_BUTTON_PIN(21); | ||||
|     #endif | ||||
|     #if HAS_CUSTOM_USER_BUTTON(22) | ||||
|       INIT_CUSTOM_USER_BUTTON_PIN(22); | ||||
|     #endif | ||||
|     #if HAS_CUSTOM_USER_BUTTON(23) | ||||
|       INIT_CUSTOM_USER_BUTTON_PIN(23); | ||||
|     #endif | ||||
|     #if HAS_CUSTOM_USER_BUTTON(24) | ||||
|       INIT_CUSTOM_USER_BUTTON_PIN(24); | ||||
|     #endif | ||||
|     #if HAS_CUSTOM_USER_BUTTON(25) | ||||
|       INIT_CUSTOM_USER_BUTTON_PIN(25); | ||||
|     #endif | ||||
|   #endif | ||||
|  | ||||
|   #if PIN_EXISTS(STAT_LED_RED) | ||||
|     OUT_WRITE(STAT_LED_RED_PIN, LOW); // OFF | ||||
|   #endif | ||||
|   | ||||
| @@ -183,6 +183,81 @@ | ||||
| #if PIN_EXISTS(JOY_EN) | ||||
|   REPORT_NAME_DIGITAL(__LINE__, JOY_EN_PIN) | ||||
| #endif | ||||
| #if PIN_EXISTS(BUTTON1) | ||||
|   REPORT_NAME_DIGITAL(__LINE__, BUTTON1_PIN) | ||||
| #endif | ||||
| #if PIN_EXISTS(BUTTON2) | ||||
|   REPORT_NAME_DIGITAL(__LINE__, BUTTON2_PIN) | ||||
| #endif | ||||
| #if PIN_EXISTS(BUTTON3) | ||||
|   REPORT_NAME_DIGITAL(__LINE__, BUTTON3_PIN) | ||||
| #endif | ||||
| #if PIN_EXISTS(BUTTON4) | ||||
|   REPORT_NAME_DIGITAL(__LINE__, BUTTON4_PIN) | ||||
| #endif | ||||
| #if PIN_EXISTS(BUTTON5) | ||||
|   REPORT_NAME_DIGITAL(__LINE__, BUTTON5_PIN) | ||||
| #endif | ||||
| #if PIN_EXISTS(BUTTON6) | ||||
|   REPORT_NAME_DIGITAL(__LINE__, BUTTON6_PIN) | ||||
| #endif | ||||
| #if PIN_EXISTS(BUTTON7) | ||||
|   REPORT_NAME_DIGITAL(__LINE__, BUTTON7_PIN) | ||||
| #endif | ||||
| #if PIN_EXISTS(BUTTON8) | ||||
|   REPORT_NAME_DIGITAL(__LINE__, BUTTON8_PIN) | ||||
| #endif | ||||
| #if PIN_EXISTS(BUTTON9) | ||||
|   REPORT_NAME_DIGITAL(__LINE__, BUTTON9_PIN) | ||||
| #endif | ||||
| #if PIN_EXISTS(BUTTON10) | ||||
|   REPORT_NAME_DIGITAL(__LINE__, BUTTON10_PIN) | ||||
| #endif | ||||
| #if PIN_EXISTS(BUTTON11) | ||||
|   REPORT_NAME_DIGITAL(__LINE__, BUTTON11_PIN) | ||||
| #endif | ||||
| #if PIN_EXISTS(BUTTON12) | ||||
|   REPORT_NAME_DIGITAL(__LINE__, BUTTON12_PIN) | ||||
| #endif | ||||
| #if PIN_EXISTS(BUTTON13) | ||||
|   REPORT_NAME_DIGITAL(__LINE__, BUTTON13_PIN) | ||||
| #endif | ||||
| #if PIN_EXISTS(BUTTON14) | ||||
|   REPORT_NAME_DIGITAL(__LINE__, BUTTON14_PIN) | ||||
| #endif | ||||
| #if PIN_EXISTS(BUTTON15) | ||||
|   REPORT_NAME_DIGITAL(__LINE__, BUTTON15_PIN) | ||||
| #endif | ||||
| #if PIN_EXISTS(BUTTON16) | ||||
|   REPORT_NAME_DIGITAL(__LINE__, BUTTON16_PIN) | ||||
| #endif | ||||
| #if PIN_EXISTS(BUTTON17) | ||||
|   REPORT_NAME_DIGITAL(__LINE__, BUTTON17_PIN) | ||||
| #endif | ||||
| #if PIN_EXISTS(BUTTON18) | ||||
|   REPORT_NAME_DIGITAL(__LINE__, BUTTON18_PIN) | ||||
| #endif | ||||
| #if PIN_EXISTS(BUTTON19) | ||||
|   REPORT_NAME_DIGITAL(__LINE__, BUTTON19_PIN) | ||||
| #endif | ||||
| #if PIN_EXISTS(BUTTON20) | ||||
|   REPORT_NAME_DIGITAL(__LINE__, BUTTON20_PIN) | ||||
| #endif | ||||
| #if PIN_EXISTS(BUTTON21) | ||||
|   REPORT_NAME_DIGITAL(__LINE__, BUTTON21_PIN) | ||||
| #endif | ||||
| #if PIN_EXISTS(BUTTON22) | ||||
|   REPORT_NAME_DIGITAL(__LINE__, BUTTON22_PIN) | ||||
| #endif | ||||
| #if PIN_EXISTS(BUTTON23) | ||||
|   REPORT_NAME_DIGITAL(__LINE__, BUTTON23_PIN) | ||||
| #endif | ||||
| #if PIN_EXISTS(BUTTON24) | ||||
|   REPORT_NAME_DIGITAL(__LINE__, BUTTON24_PIN) | ||||
| #endif | ||||
| #if PIN_EXISTS(BUTTON25) | ||||
|   REPORT_NAME_DIGITAL(__LINE__, BUTTON25_PIN) | ||||
| #endif | ||||
| #if PIN_EXISTS(CASE_LIGHT) | ||||
|   REPORT_NAME_DIGITAL(__LINE__, CASE_LIGHT_PIN) | ||||
| #endif | ||||
|   | ||||
		Reference in New Issue
	
	Block a user