Merge pull request #3202 from thinkyhead/rc_menu_item_M303_redo
Add Menu Items to initiate M303
This commit is contained in:
		
						commit
						02f466e633
					
				| @ -228,6 +228,7 @@ inline bool IsRunning() { return  Running; } | |||||||
| inline bool IsStopped() { return !Running; } | inline bool IsStopped() { return !Running; } | ||||||
| 
 | 
 | ||||||
| bool enqueue_and_echo_command(const char* cmd, bool say_ok=false); //put a single ASCII command at the end of the current buffer or return false when it is full
 | bool enqueue_and_echo_command(const char* cmd, bool say_ok=false); //put a single ASCII command at the end of the current buffer or return false when it is full
 | ||||||
|  | void enqueue_and_echo_command_now(const char* cmd); // enqueue now, only return when the command has been enqueued
 | ||||||
| void enqueue_and_echo_commands_P(const char* cmd); //put one or many ASCII commands at the end of the current buffer, read from flash
 | void enqueue_and_echo_commands_P(const char* cmd); //put one or many ASCII commands at the end of the current buffer, read from flash
 | ||||||
| 
 | 
 | ||||||
| void prepare_arc_move(char isclockwise); | void prepare_arc_move(char isclockwise); | ||||||
|  | |||||||
| @ -549,6 +549,10 @@ inline bool _enqueuecommand(const char* cmd, bool say_ok=false) { | |||||||
|   return true; |   return true; | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  | void enqueue_and_echo_command_now(const char* cmd) { | ||||||
|  |   while (!enqueue_and_echo_command(cmd)) idle(); | ||||||
|  | } | ||||||
|  | 
 | ||||||
| /**
 | /**
 | ||||||
|  * Enqueue with Serial Echo |  * Enqueue with Serial Echo | ||||||
|  */ |  */ | ||||||
| @ -5135,20 +5139,27 @@ inline void gcode_M226() { | |||||||
| 
 | 
 | ||||||
| /**
 | /**
 | ||||||
|  * M303: PID relay autotune |  * M303: PID relay autotune | ||||||
|  *       S<temperature> sets the target temperature. (default target temperature = 150C) |  * | ||||||
|  *       E<extruder> (-1 for the bed) |  *       S<temperature> sets the target temperature. (default 150C) | ||||||
|  |  *       E<extruder> (-1 for the bed) (default 0) | ||||||
|  *       C<cycles> |  *       C<cycles> | ||||||
|  |  *       U<bool> with a non-zero value will apply the result to current settings | ||||||
|  */ |  */ | ||||||
| inline void gcode_M303() { | inline void gcode_M303() { | ||||||
|   int e = code_seen('E') ? code_value_short() : 0; |   int e = code_seen('E') ? code_value_short() : 0; | ||||||
|   int c = code_seen('C') ? code_value_short() : 5; |   int c = code_seen('C') ? code_value_short() : 5; | ||||||
|  |   bool u = code_seen('U') && code_value_short() != 0; | ||||||
|  |    | ||||||
|   float temp = code_seen('S') ? code_value() : (e < 0 ? 70.0 : 150.0); |   float temp = code_seen('S') ? code_value() : (e < 0 ? 70.0 : 150.0); | ||||||
| 
 | 
 | ||||||
|   if (e >=0 && e < EXTRUDERS) |   if (e >= 0 && e < EXTRUDERS) | ||||||
|     target_extruder = e; |     target_extruder = e; | ||||||
| 
 | 
 | ||||||
|   KEEPALIVE_STATE(NOT_BUSY); |   KEEPALIVE_STATE(NOT_BUSY); // don't send "busy: processing" messages during autotune output
 | ||||||
|   PID_autotune(temp, e, c); | 
 | ||||||
|  |   PID_autotune(temp, e, c, u); | ||||||
|  | 
 | ||||||
|  |   KEEPALIVE_STATE(IN_HANDLER); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| #if ENABLED(SCARA) | #if ENABLED(SCARA) | ||||||
|  | |||||||
| @ -247,7 +247,7 @@ void CardReader::openAndPrintFile(const char *name) { | |||||||
|   char cmd[4 + (FILENAME_LENGTH + 1) * MAX_DIR_DEPTH + 2]; // Room for "M23 ", names with slashes, a null, and one extra
 |   char cmd[4 + (FILENAME_LENGTH + 1) * MAX_DIR_DEPTH + 2]; // Room for "M23 ", names with slashes, a null, and one extra
 | ||||||
|   sprintf_P(cmd, PSTR("M23 %s"), name); |   sprintf_P(cmd, PSTR("M23 %s"), name); | ||||||
|   for (char *c = &cmd[4]; *c; c++) *c = tolower(*c); |   for (char *c = &cmd[4]; *c; c++) *c = tolower(*c); | ||||||
|   enqueue_and_echo_command(cmd); |   enqueue_and_echo_command_now(cmd); | ||||||
|   enqueue_and_echo_commands_P(PSTR("M24")); |   enqueue_and_echo_commands_P(PSTR("M24")); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  | |||||||
| @ -199,7 +199,7 @@ static void updateTemperaturesFromRawValues(); | |||||||
| //================================ Functions ================================
 | //================================ Functions ================================
 | ||||||
| //===========================================================================
 | //===========================================================================
 | ||||||
| 
 | 
 | ||||||
| void PID_autotune(float temp, int extruder, int ncycles) { | void PID_autotune(float temp, int extruder, int ncycles, bool set_result/*=false*/) { | ||||||
|   float input = 0.0; |   float input = 0.0; | ||||||
|   int cycles = 0; |   int cycles = 0; | ||||||
|   bool heating = true; |   bool heating = true; | ||||||
| @ -346,6 +346,24 @@ void PID_autotune(float temp, int extruder, int ncycles) { | |||||||
|       SERIAL_PROTOCOLPGM("#define  DEFAULT_"); SERIAL_PROTOCOL(estring); SERIAL_PROTOCOLPGM("Kp "); SERIAL_PROTOCOLLN(Kp); |       SERIAL_PROTOCOLPGM("#define  DEFAULT_"); SERIAL_PROTOCOL(estring); SERIAL_PROTOCOLPGM("Kp "); SERIAL_PROTOCOLLN(Kp); | ||||||
|       SERIAL_PROTOCOLPGM("#define  DEFAULT_"); SERIAL_PROTOCOL(estring); SERIAL_PROTOCOLPGM("Ki "); SERIAL_PROTOCOLLN(Ki); |       SERIAL_PROTOCOLPGM("#define  DEFAULT_"); SERIAL_PROTOCOL(estring); SERIAL_PROTOCOLPGM("Ki "); SERIAL_PROTOCOLLN(Ki); | ||||||
|       SERIAL_PROTOCOLPGM("#define  DEFAULT_"); SERIAL_PROTOCOL(estring); SERIAL_PROTOCOLPGM("Kd "); SERIAL_PROTOCOLLN(Kd); |       SERIAL_PROTOCOLPGM("#define  DEFAULT_"); SERIAL_PROTOCOL(estring); SERIAL_PROTOCOLPGM("Kd "); SERIAL_PROTOCOLLN(Kd); | ||||||
|  | 
 | ||||||
|  |       // Use the result? (As with "M303 U1")
 | ||||||
|  |       if (set_result) { | ||||||
|  |         if (extruder < 0) { | ||||||
|  |           #if ENABLED(PIDTEMPBED) | ||||||
|  |             bedKp = Kp; | ||||||
|  |             bedKi = scalePID_i(Ki); | ||||||
|  |             bedKd = scalePID_d(Kd); | ||||||
|  |             updatePID(); | ||||||
|  |           #endif | ||||||
|  |         } | ||||||
|  |         else { | ||||||
|  |           PID_PARAM(Kp, extruder) = Kp; | ||||||
|  |           PID_PARAM(Ki, e) = scalePID_i(Ki); | ||||||
|  |           PID_PARAM(Kd, e) = scalePID_d(Kd); | ||||||
|  |           updatePID(); | ||||||
|  |         } | ||||||
|  |       } | ||||||
|       return; |       return; | ||||||
|     } |     } | ||||||
|     lcd_update(); |     lcd_update(); | ||||||
|  | |||||||
| @ -141,7 +141,7 @@ int getHeaterPower(int heater); | |||||||
| void disable_all_heaters(); | void disable_all_heaters(); | ||||||
| void updatePID(); | void updatePID(); | ||||||
| 
 | 
 | ||||||
| void PID_autotune(float temp, int extruder, int ncycles); | void PID_autotune(float temp, int extruder, int ncycles, bool set_result=false); | ||||||
| 
 | 
 | ||||||
| void setExtruderAutoFanState(int pin, bool state); | void setExtruderAutoFanState(int pin, bool state); | ||||||
| void checkExtruderAutoFans(); | void checkExtruderAutoFans(); | ||||||
|  | |||||||
| @ -1067,6 +1067,33 @@ static void lcd_control_menu() { | |||||||
|  * |  * | ||||||
|  */ |  */ | ||||||
| 
 | 
 | ||||||
|  | #if ENABLED(PIDTEMP) || ENABLED(PIDTEMPBED) | ||||||
|  | 
 | ||||||
|  |   #if ENABLED(PIDTEMP) | ||||||
|  |     int autotune_temp[EXTRUDERS] = { 150 }; | ||||||
|  |     const int heater_maxtemp[EXTRUDERS] = ARRAY_BY_EXTRUDERS(HEATER_0_MAXTEMP, HEATER_1_MAXTEMP, HEATER_2_MAXTEMP, HEATER_3_MAXTEMP); | ||||||
|  |   #endif | ||||||
|  | 
 | ||||||
|  |   #if ENABLED(PIDTEMPBED) | ||||||
|  |     int autotune_temp_bed = 70; | ||||||
|  |   #endif | ||||||
|  | 
 | ||||||
|  |   static void _lcd_autotune(int e) { | ||||||
|  |     char cmd[30]; | ||||||
|  |     sprintf_P(cmd, PSTR("M303 U1 E%d S%d"), e, | ||||||
|  |       #if ENABLED(PIDTEMP) && ENABLED(PIDTEMPBED) | ||||||
|  |         e < 0 ? autotune_temp_bed : autotune_temp[e] | ||||||
|  |       #elif ENABLED(PIDTEMPBED) | ||||||
|  |         autotune_temp_bed | ||||||
|  |       #else | ||||||
|  |         autotune_temp[e] | ||||||
|  |       #endif | ||||||
|  |     ); | ||||||
|  |     enqueue_and_echo_command_now(cmd); | ||||||
|  |   } | ||||||
|  | 
 | ||||||
|  | #endif PIDTEMP || PIDTEMPBED | ||||||
|  | 
 | ||||||
| #if ENABLED(PIDTEMP) | #if ENABLED(PIDTEMP) | ||||||
| 
 | 
 | ||||||
|   // Helpers for editing PID Ki & Kd values
 |   // Helpers for editing PID Ki & Kd values
 | ||||||
| @ -1079,18 +1106,19 @@ static void lcd_control_menu() { | |||||||
|     PID_PARAM(Kd, e) = scalePID_d(raw_Kd); |     PID_PARAM(Kd, e) = scalePID_d(raw_Kd); | ||||||
|     updatePID(); |     updatePID(); | ||||||
|   } |   } | ||||||
|   #define COPY_AND_SCALE(eindex) \ |   #define _PIDTEMP_FUNCTIONS(eindex) \ | ||||||
|     void copy_and_scalePID_i_E ## eindex() { copy_and_scalePID_i(eindex); } \ |     void copy_and_scalePID_i_E ## eindex() { copy_and_scalePID_i(eindex); } \ | ||||||
|     void copy_and_scalePID_d_E ## eindex() { copy_and_scalePID_d(eindex); } |     void copy_and_scalePID_d_E ## eindex() { copy_and_scalePID_d(eindex); } \ | ||||||
|  |     void lcd_autotune_callback_E ## eindex() { _lcd_autotune(eindex); } | ||||||
| 
 | 
 | ||||||
|   COPY_AND_SCALE(0); |   _PIDTEMP_FUNCTIONS(0); | ||||||
|   #if ENABLED(PID_PARAMS_PER_EXTRUDER) |   #if ENABLED(PID_PARAMS_PER_EXTRUDER) | ||||||
|     #if EXTRUDERS > 1 |     #if EXTRUDERS > 1 | ||||||
|       COPY_AND_SCALE(1); |       _PIDTEMP_FUNCTIONS(1); | ||||||
|       #if EXTRUDERS > 2 |       #if EXTRUDERS > 2 | ||||||
|         COPY_AND_SCALE(2); |         _PIDTEMP_FUNCTIONS(2); | ||||||
|         #if EXTRUDERS > 3 |         #if EXTRUDERS > 3 | ||||||
|           COPY_AND_SCALE(3); |           _PIDTEMP_FUNCTIONS(3); | ||||||
|         #endif //EXTRUDERS > 3
 |         #endif //EXTRUDERS > 3
 | ||||||
|       #endif //EXTRUDERS > 2
 |       #endif //EXTRUDERS > 2
 | ||||||
|     #endif //EXTRUDERS > 1
 |     #endif //EXTRUDERS > 1
 | ||||||
| @ -1176,15 +1204,15 @@ static void lcd_control_temperature_menu() { | |||||||
|   #endif |   #endif | ||||||
| 
 | 
 | ||||||
|   //
 |   //
 | ||||||
|   // PID-P, PID-I, PID-D, PID-C
 |   // PID-P, PID-I, PID-D, PID-C, PID Autotune
 | ||||||
|   // PID-P E1, PID-I E1, PID-D E1, PID-C E1
 |   // PID-P E1, PID-I E1, PID-D E1, PID-C E1, PID Autotune E1
 | ||||||
|   // PID-P E2, PID-I E2, PID-D E2, PID-C E2
 |   // PID-P E2, PID-I E2, PID-D E2, PID-C E2, PID Autotune E2
 | ||||||
|   // PID-P E3, PID-I E3, PID-D E3, PID-C E3
 |   // PID-P E3, PID-I E3, PID-D E3, PID-C E3, PID Autotune E3
 | ||||||
|   // PID-P E4, PID-I E4, PID-D E4, PID-C E4
 |   // PID-P E4, PID-I E4, PID-D E4, PID-C E4, PID Autotune E4
 | ||||||
|   //
 |   //
 | ||||||
|   #if ENABLED(PIDTEMP) |   #if ENABLED(PIDTEMP) | ||||||
| 
 | 
 | ||||||
|     #define _PID_MENU_ITEMS(ELABEL, eindex) \ |     #define _PID_BASE_MENU_ITEMS(ELABEL, eindex) \ | ||||||
|       raw_Ki = unscalePID_i(PID_PARAM(Ki, eindex)); \ |       raw_Ki = unscalePID_i(PID_PARAM(Ki, eindex)); \ | ||||||
|       raw_Kd = unscalePID_d(PID_PARAM(Kd, eindex)); \ |       raw_Kd = unscalePID_d(PID_PARAM(Kd, eindex)); \ | ||||||
|       MENU_ITEM_EDIT(float52, MSG_PID_P ELABEL, &PID_PARAM(Kp, eindex), 1, 9990); \ |       MENU_ITEM_EDIT(float52, MSG_PID_P ELABEL, &PID_PARAM(Kp, eindex), 1, 9990); \ | ||||||
| @ -1192,13 +1220,17 @@ static void lcd_control_temperature_menu() { | |||||||
|       MENU_ITEM_EDIT_CALLBACK(float52, MSG_PID_D ELABEL, &raw_Kd, 1, 9990, copy_and_scalePID_d_E ## eindex) |       MENU_ITEM_EDIT_CALLBACK(float52, MSG_PID_D ELABEL, &raw_Kd, 1, 9990, copy_and_scalePID_d_E ## eindex) | ||||||
| 
 | 
 | ||||||
|     #if ENABLED(PID_ADD_EXTRUSION_RATE) |     #if ENABLED(PID_ADD_EXTRUSION_RATE) | ||||||
|       #define PID_MENU_ITEMS(ELABEL, eindex) \ |       #define _PID_MENU_ITEMS(ELABEL, eindex) \ | ||||||
|         _PID_MENU_ITEMS(ELABEL, eindex); \ |         _PID_BASE_MENU_ITEMS(ELABEL, eindex); \ | ||||||
|         MENU_ITEM_EDIT(float3, MSG_PID_C ELABEL, &PID_PARAM(Kc, eindex), 1, 9990) |         MENU_ITEM_EDIT(float3, MSG_PID_C ELABEL, &PID_PARAM(Kc, eindex), 1, 9990) | ||||||
|     #else |     #else | ||||||
|       #define PID_MENU_ITEMS(ELABEL, eindex) _PID_MENU_ITEMS(ELABEL, eindex) |       #define _PID_MENU_ITEMS(ELABEL, eindex) _PID_BASE_MENU_ITEMS(ELABEL, eindex) | ||||||
|     #endif |     #endif | ||||||
| 
 | 
 | ||||||
|  |     #define PID_MENU_ITEMS(ELABEL, eindex) \ | ||||||
|  |       _PID_MENU_ITEMS(ELABEL, eindex); \ | ||||||
|  |       MENU_MULTIPLIER_ITEM_EDIT_CALLBACK(int3, MSG_PID_AUTOTUNE ELABEL, &autotune_temp[eindex], 150, heater_maxtemp[eindex] - 15, lcd_autotune_callback_E ## eindex) | ||||||
|  | 
 | ||||||
|     #if ENABLED(PID_PARAMS_PER_EXTRUDER) && EXTRUDERS > 1 |     #if ENABLED(PID_PARAMS_PER_EXTRUDER) && EXTRUDERS > 1 | ||||||
|       PID_MENU_ITEMS(MSG_E1, 0); |       PID_MENU_ITEMS(MSG_E1, 0); | ||||||
|       PID_MENU_ITEMS(MSG_E2, 1); |       PID_MENU_ITEMS(MSG_E2, 1); | ||||||
|  | |||||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user