Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Add assign PIN to G-CODE macro feature #18389

Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
31 changes: 31 additions & 0 deletions Marlin/Configuration_adv.h
Original file line number Diff line number Diff line change
Expand Up @@ -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.
Expand Down
179 changes: 178 additions & 1 deletion Marlin/src/MarlinCore.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down Expand Up @@ -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());
Expand Down Expand Up @@ -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
Expand Down Expand Up @@ -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
Expand Down
75 changes: 75 additions & 0 deletions Marlin/src/pins/pinsDebug_list.h
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down