Merge pull request #3110 from thinkyhead/rc_manual_moves
Alternative impl. of LCD-based manual movement
This commit is contained in:
		
						commit
						4b3d5aec7a
					
				| @ -213,7 +213,7 @@ void manage_inactivity(bool ignore_stepper_queue = false); | ||||
|  * A_AXIS and B_AXIS are used by COREXY printers | ||||
|  * X_HEAD and Y_HEAD is used for systems that don't have a 1:1 relationship between X_AXIS and X Head movement, like CoreXY bots. | ||||
|  */ | ||||
| enum AxisEnum {X_AXIS = 0, A_AXIS = 0, Y_AXIS = 1, B_AXIS = 1, Z_AXIS = 2, C_AXIS = 2, E_AXIS = 3, X_HEAD = 4, Y_HEAD = 5, Z_HEAD = 5}; | ||||
| enum AxisEnum {NO_AXIS = -1, X_AXIS = 0, A_AXIS = 0, Y_AXIS = 1, B_AXIS = 1, Z_AXIS = 2, C_AXIS = 2, E_AXIS = 3, X_HEAD = 4, Y_HEAD = 5, Z_HEAD = 5}; | ||||
| 
 | ||||
| #define _AXIS(AXIS) AXIS ##_AXIS | ||||
| 
 | ||||
|  | ||||
| @ -189,6 +189,8 @@ class Planner { | ||||
|      */ | ||||
|     static uint8_t movesplanned() { return BLOCK_MOD(block_buffer_head - block_buffer_tail + BLOCK_BUFFER_SIZE); } | ||||
| 
 | ||||
|     static bool is_full() { return (block_buffer_tail == BLOCK_MOD(block_buffer_head + 1)); } | ||||
| 
 | ||||
|     #if ENABLED(AUTO_BED_LEVELING_FEATURE) || ENABLED(MESH_BED_LEVELING) | ||||
| 
 | ||||
|       #if ENABLED(AUTO_BED_LEVELING_FEATURE) | ||||
|  | ||||
| @ -50,6 +50,9 @@ | ||||
| 
 | ||||
| int8_t encoderDiff; // updated from interrupt context and added to encoderPosition every LCD update
 | ||||
| 
 | ||||
| int8_t manual_move_axis = (int8_t)NO_AXIS; | ||||
| millis_t manual_move_start_time = 0; | ||||
| 
 | ||||
| bool encoderRateMultiplierEnabled; | ||||
| int32_t lastEncoderMovementMillis; | ||||
| 
 | ||||
| @ -938,7 +941,7 @@ void lcd_cooldown() { | ||||
|     ENCODER_DIRECTION_NORMAL(); | ||||
| 
 | ||||
|     // Encoder wheel adjusts the Z position
 | ||||
|     if (encoderPosition && planner.movesplanned() <= 3) { | ||||
|     if (encoderPosition) { | ||||
|       refresh_cmd_timeout(); | ||||
|       current_position[Z_AXIS] += float((int32_t)encoderPosition) * (MBL_Z_STEP); | ||||
|       NOLESS(current_position[Z_AXIS], 0); | ||||
| @ -951,8 +954,8 @@ void lcd_cooldown() { | ||||
|           LCDVIEW_REDRAW_NOW | ||||
|         #endif | ||||
|       ; | ||||
|       encoderPosition = 0; | ||||
|     } | ||||
|     encoderPosition = 0; | ||||
| 
 | ||||
|     static bool debounce_click = false; | ||||
|     if (LCD_CLICKED) { | ||||
| @ -1190,6 +1193,31 @@ static void lcd_prepare_menu() { | ||||
| 
 | ||||
| #endif // DELTA_CALIBRATION_MENU
 | ||||
| 
 | ||||
| /**
 | ||||
|  * If the most recent manual move hasn't been fed to the planner yet, | ||||
|  * and the planner can accept one, send immediately | ||||
|  */ | ||||
| inline void manage_manual_move() { | ||||
|   if (manual_move_axis != (int8_t)NO_AXIS && millis() >= manual_move_start_time && !planner.is_full()) { | ||||
|     #if ENABLED(DELTA) | ||||
|       calculate_delta(current_position); | ||||
|       planner.buffer_line(delta[X_AXIS], delta[Y_AXIS], delta[Z_AXIS], current_position[E_AXIS], manual_feedrate[manual_move_axis]/60, active_extruder); | ||||
|     #else | ||||
|       planner.buffer_line(current_position[X_AXIS], current_position[Y_AXIS], current_position[Z_AXIS], current_position[E_AXIS], manual_feedrate[manual_move_axis]/60, active_extruder); | ||||
|     #endif | ||||
|     manual_move_axis = (int8_t)NO_AXIS; | ||||
|   } | ||||
| } | ||||
| 
 | ||||
| /**
 | ||||
|  * Set a flag that lcd_update() should start a move | ||||
|  * to "current_position" after a short delay. | ||||
|  */ | ||||
| inline void manual_move_to_current(AxisEnum axis) { | ||||
|   manual_move_start_time = millis() + 500UL; // 1/2 second delay
 | ||||
|   manual_move_axis = (int8_t)axis; | ||||
| } | ||||
| 
 | ||||
| /**
 | ||||
|  * | ||||
|  * "Prepare" > "Move Axis" submenu | ||||
| @ -1200,15 +1228,15 @@ float move_menu_scale; | ||||
| 
 | ||||
| static void _lcd_move(const char* name, AxisEnum axis, float min, float max) { | ||||
|   ENCODER_DIRECTION_NORMAL(); | ||||
|   if (encoderPosition && planner.movesplanned() <= 3) { | ||||
|   if (encoderPosition) { | ||||
|     refresh_cmd_timeout(); | ||||
|     current_position[axis] += float((int32_t)encoderPosition) * move_menu_scale; | ||||
|     if (min_software_endstops) NOLESS(current_position[axis], min); | ||||
|     if (max_software_endstops) NOMORE(current_position[axis], max); | ||||
|     line_to_current(axis); | ||||
|     encoderPosition = 0; | ||||
|     manual_move_to_current(axis); | ||||
|     lcdDrawUpdate = LCDVIEW_REDRAW_NOW; | ||||
|   } | ||||
|   encoderPosition = 0; | ||||
|   if (lcdDrawUpdate) lcd_implementation_drawedit(name, ftostr31(current_position[axis])); | ||||
|   if (LCD_CLICKED) lcd_goto_previous_menu(true); | ||||
| } | ||||
| @ -1232,12 +1260,12 @@ static void lcd_move_e( | ||||
|     unsigned short original_active_extruder = active_extruder; | ||||
|     active_extruder = e; | ||||
|   #endif | ||||
|   if (encoderPosition && planner.movesplanned() <= 3) { | ||||
|   if (encoderPosition) { | ||||
|     current_position[E_AXIS] += float((int32_t)encoderPosition) * move_menu_scale; | ||||
|     line_to_current(E_AXIS); | ||||
|     encoderPosition = 0; | ||||
|     manual_move_to_current(E_AXIS); | ||||
|     lcdDrawUpdate = LCDVIEW_REDRAW_NOW; | ||||
|   } | ||||
|   encoderPosition = 0; | ||||
|   if (lcdDrawUpdate) { | ||||
|     PGM_P pos_label; | ||||
|     #if EXTRUDERS == 1 | ||||
| @ -2149,6 +2177,8 @@ void lcd_update() { | ||||
|     static millis_t return_to_status_ms = 0; | ||||
|   #endif | ||||
| 
 | ||||
|   manage_manual_move(); | ||||
| 
 | ||||
|   lcd_buttons_update(); | ||||
| 
 | ||||
|   #if ENABLED(SDSUPPORT) && PIN_EXISTS(SD_DETECT) | ||||
|  | ||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user