Merge remote-tracking branch 'GurliGebis/HostKeepAlive' into HostKeepAlive
This commit is contained in:
commit
2b657ba786
|
|
@ -463,7 +463,13 @@ const bool Z_MAX_ENDSTOP_INVERTING = true; // set to true to invert the logic of
|
||||||
// please keep turned on if you can.
|
// please keep turned on if you can.
|
||||||
//#define EEPROM_CHITCHAT
|
//#define EEPROM_CHITCHAT
|
||||||
|
|
||||||
|
// Host Keepalive
|
||||||
|
//
|
||||||
|
// When enabled Marlin will send a busy status message to the host
|
||||||
|
// every couple of seconds when it can't accept commands.
|
||||||
|
//
|
||||||
|
#define HOST_KEEPALIVE_FEATURE // Disable this if your host doesn't like keepalive messages
|
||||||
|
#define HOST_KEEPALIVE_INTERVAL 2 // Number of seconds between "busy" messages. Set with M113.
|
||||||
|
|
||||||
//LCD and SD support
|
//LCD and SD support
|
||||||
#define ULTRA_LCD //general LCD support, also 16x2
|
#define ULTRA_LCD //general LCD support, also 16x2
|
||||||
|
|
|
||||||
|
|
@ -109,6 +109,8 @@ FORCE_INLINE void serialprintPGM(const char *str)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#define NOMORE(v,n) do{ if (v > n) v = n; }while(0)
|
||||||
|
|
||||||
bool is_buffer_empty();
|
bool is_buffer_empty();
|
||||||
void get_command();
|
void get_command();
|
||||||
void process_commands();
|
void process_commands();
|
||||||
|
|
@ -281,6 +283,10 @@ extern float retract_length, retract_length_swap, retract_feedrate, retract_zlif
|
||||||
extern float retract_recover_length, retract_recover_length_swap, retract_recover_feedrate;
|
extern float retract_recover_length, retract_recover_length_swap, retract_recover_feedrate;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#ifdef HOST_KEEPALIVE_FEATURE
|
||||||
|
extern uint8_t host_keepalive_interval;
|
||||||
|
#endif
|
||||||
|
|
||||||
extern unsigned long starttime;
|
extern unsigned long starttime;
|
||||||
extern unsigned long stoptime;
|
extern unsigned long stoptime;
|
||||||
extern int bowden_length[4];
|
extern int bowden_length[4];
|
||||||
|
|
|
||||||
|
|
@ -150,6 +150,7 @@
|
||||||
// Rxxx Wait for extruder current temp to reach target temp. Waits when heating and cooling
|
// Rxxx Wait for extruder current temp to reach target temp. Waits when heating and cooling
|
||||||
// IF AUTOTEMP is enabled, S<mintemp> B<maxtemp> F<factor>. Exit autotemp by any M109 without F
|
// IF AUTOTEMP is enabled, S<mintemp> B<maxtemp> F<factor>. Exit autotemp by any M109 without F
|
||||||
// M112 - Emergency stop
|
// M112 - Emergency stop
|
||||||
|
// M113 - Get or set the timeout interval for Host Keepalive "busy" messages
|
||||||
// M114 - Output current position to serial port
|
// M114 - Output current position to serial port
|
||||||
// M115 - Capabilities string
|
// M115 - Capabilities string
|
||||||
// M117 - display message
|
// M117 - display message
|
||||||
|
|
@ -370,6 +371,26 @@ int fanSpeed=0;
|
||||||
|
|
||||||
bool cancel_heatup = false ;
|
bool cancel_heatup = false ;
|
||||||
|
|
||||||
|
#ifdef HOST_KEEPALIVE_FEATURE
|
||||||
|
// States for managing Marlin and host communication
|
||||||
|
// Marlin sends messages if blocked or busy
|
||||||
|
enum MarlinBusyState {
|
||||||
|
NOT_BUSY, // Not in a handler
|
||||||
|
IN_HANDLER, // Processing a GCode
|
||||||
|
IN_PROCESS, // Known to be blocking command input (as in G29)
|
||||||
|
PAUSED_FOR_USER, // Blocking pending any input
|
||||||
|
PAUSED_FOR_INPUT // Blocking pending text input (concept)
|
||||||
|
};
|
||||||
|
|
||||||
|
static MarlinBusyState busy_state = NOT_BUSY;
|
||||||
|
static long prev_busy_signal_ms = -1;
|
||||||
|
uint8_t host_keepalive_interval = HOST_KEEPALIVE_INTERVAL;
|
||||||
|
#define KEEPALIVE_STATE(n) do { busy_state = n; } while (0)
|
||||||
|
#else
|
||||||
|
#define host_keepalive();
|
||||||
|
#define KEEPALIVE_STATE(n);
|
||||||
|
#endif
|
||||||
|
|
||||||
#ifdef FILAMENT_SENSOR
|
#ifdef FILAMENT_SENSOR
|
||||||
//Variables for Filament Sensor input
|
//Variables for Filament Sensor input
|
||||||
float filament_width_nominal=DEFAULT_NOMINAL_FILAMENT_DIA; //Set nominal filament width, can be changed with M404
|
float filament_width_nominal=DEFAULT_NOMINAL_FILAMENT_DIA; //Set nominal filament width, can be changed with M404
|
||||||
|
|
@ -1321,6 +1342,35 @@ int serial_read_stream() {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#ifdef HOST_KEEPALIVE_FEATURE
|
||||||
|
/**
|
||||||
|
* Output a "busy" message at regular intervals
|
||||||
|
* while the machine is not accepting commands.
|
||||||
|
*/
|
||||||
|
void host_keepalive() {
|
||||||
|
long ms = millis();
|
||||||
|
if (host_keepalive_interval && busy_state != NOT_BUSY) {
|
||||||
|
if (ms - prev_busy_signal_ms < 1000UL * host_keepalive_interval) return;
|
||||||
|
switch (busy_state) {
|
||||||
|
case IN_HANDLER:
|
||||||
|
case IN_PROCESS:
|
||||||
|
SERIAL_ECHO_START;
|
||||||
|
SERIAL_ECHOLNPGM("busy: processing");
|
||||||
|
break;
|
||||||
|
case PAUSED_FOR_USER:
|
||||||
|
SERIAL_ECHO_START;
|
||||||
|
SERIAL_ECHOLNPGM("busy: paused for user");
|
||||||
|
break;
|
||||||
|
case PAUSED_FOR_INPUT:
|
||||||
|
SERIAL_ECHO_START;
|
||||||
|
SERIAL_ECHOLNPGM("busy: paused for input");
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
prev_busy_signal_ms = ms;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
// The loop() function is called in an endless loop by the Arduino framework from the default main() routine.
|
// The loop() function is called in an endless loop by the Arduino framework from the default main() routine.
|
||||||
// Before loop(), the setup() function is called by the main() routine.
|
// Before loop(), the setup() function is called by the main() routine.
|
||||||
void loop()
|
void loop()
|
||||||
|
|
@ -1382,6 +1432,7 @@ void loop()
|
||||||
manage_heater();
|
manage_heater();
|
||||||
isPrintPaused ? manage_inactivity(true) : manage_inactivity(false);
|
isPrintPaused ? manage_inactivity(true) : manage_inactivity(false);
|
||||||
checkHitEndstops();
|
checkHitEndstops();
|
||||||
|
host_keepalive();
|
||||||
lcd_update();
|
lcd_update();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -2084,6 +2135,8 @@ void process_commands()
|
||||||
float tmp_motor_loud[3] = DEFAULT_PWM_MOTOR_CURRENT_LOUD;
|
float tmp_motor_loud[3] = DEFAULT_PWM_MOTOR_CURRENT_LOUD;
|
||||||
int8_t SilentMode;
|
int8_t SilentMode;
|
||||||
#endif
|
#endif
|
||||||
|
KEEPALIVE_STATE(IN_HANDLER);
|
||||||
|
|
||||||
if (code_seen("M117")) { //moved to highest priority place to be able to to print strings which includes "G", "PRUSA" and "^"
|
if (code_seen("M117")) { //moved to highest priority place to be able to to print strings which includes "G", "PRUSA" and "^"
|
||||||
starpos = (strchr(strchr_pointer + 5, '*'));
|
starpos = (strchr(strchr_pointer + 5, '*'));
|
||||||
if (starpos != NULL)
|
if (starpos != NULL)
|
||||||
|
|
@ -2441,6 +2494,8 @@ void process_commands()
|
||||||
case 28: //G28 Home all Axis one at a time
|
case 28: //G28 Home all Axis one at a time
|
||||||
homing_flag = true;
|
homing_flag = true;
|
||||||
|
|
||||||
|
KEEPALIVE_STATE(IN_HANDLER);
|
||||||
|
|
||||||
#ifdef ENABLE_AUTO_BED_LEVELING
|
#ifdef ENABLE_AUTO_BED_LEVELING
|
||||||
plan_bed_level_matrix.set_to_identity(); //Reset the plane ("erase" all leveling data)
|
plan_bed_level_matrix.set_to_identity(); //Reset the plane ("erase" all leveling data)
|
||||||
#endif //ENABLE_AUTO_BED_LEVELING
|
#endif //ENABLE_AUTO_BED_LEVELING
|
||||||
|
|
@ -3494,20 +3549,24 @@ void process_commands()
|
||||||
previous_millis_cmd = millis();
|
previous_millis_cmd = millis();
|
||||||
if (codenum > 0){
|
if (codenum > 0){
|
||||||
codenum += millis(); // keep track of when we started waiting
|
codenum += millis(); // keep track of when we started waiting
|
||||||
|
KEEPALIVE_STATE(PAUSED_FOR_USER);
|
||||||
while(millis() < codenum && !lcd_clicked()){
|
while(millis() < codenum && !lcd_clicked()){
|
||||||
manage_heater();
|
manage_heater();
|
||||||
manage_inactivity(true);
|
manage_inactivity(true);
|
||||||
lcd_update();
|
lcd_update();
|
||||||
}
|
}
|
||||||
|
KEEPALIVE_STATE(IN_HANDLER);
|
||||||
lcd_ignore_click(false);
|
lcd_ignore_click(false);
|
||||||
}else{
|
}else{
|
||||||
if (!lcd_detected())
|
if (!lcd_detected())
|
||||||
break;
|
break;
|
||||||
|
KEEPALIVE_STATE(PAUSED_FOR_USER);
|
||||||
while(!lcd_clicked()){
|
while(!lcd_clicked()){
|
||||||
manage_heater();
|
manage_heater();
|
||||||
manage_inactivity(true);
|
manage_inactivity(true);
|
||||||
lcd_update();
|
lcd_update();
|
||||||
}
|
}
|
||||||
|
KEEPALIVE_STATE(IN_HANDLER);
|
||||||
}
|
}
|
||||||
if (IS_SD_PRINTING)
|
if (IS_SD_PRINTING)
|
||||||
LCD_MESSAGERPGM(MSG_RESUMING);
|
LCD_MESSAGERPGM(MSG_RESUMING);
|
||||||
|
|
@ -4212,6 +4271,7 @@ Sigma_Exit:
|
||||||
}}
|
}}
|
||||||
#endif
|
#endif
|
||||||
SERIAL_PROTOCOLLN("");
|
SERIAL_PROTOCOLLN("");
|
||||||
|
KEEPALIVE_STATE(NOT_BUSY);
|
||||||
return;
|
return;
|
||||||
break;
|
break;
|
||||||
case 109:
|
case 109:
|
||||||
|
|
@ -4249,11 +4309,14 @@ Sigma_Exit:
|
||||||
/* See if we are heating up or cooling down */
|
/* See if we are heating up or cooling down */
|
||||||
target_direction = isHeatingHotend(tmp_extruder); // true if heating, false if cooling
|
target_direction = isHeatingHotend(tmp_extruder); // true if heating, false if cooling
|
||||||
|
|
||||||
|
KEEPALIVE_STATE(NOT_BUSY);
|
||||||
|
|
||||||
cancel_heatup = false;
|
cancel_heatup = false;
|
||||||
|
|
||||||
wait_for_heater(codenum); //loops until target temperature is reached
|
wait_for_heater(codenum); //loops until target temperature is reached
|
||||||
|
|
||||||
LCD_MESSAGERPGM(MSG_HEATING_COMPLETE);
|
LCD_MESSAGERPGM(MSG_HEATING_COMPLETE);
|
||||||
|
KEEPALIVE_STATE(IN_HANDLER);
|
||||||
heating_status = 2;
|
heating_status = 2;
|
||||||
if (farm_mode) { prusa_statistics(2); };
|
if (farm_mode) { prusa_statistics(2); };
|
||||||
|
|
||||||
|
|
@ -4281,6 +4344,7 @@ Sigma_Exit:
|
||||||
cancel_heatup = false;
|
cancel_heatup = false;
|
||||||
target_direction = isHeatingBed(); // true if heating, false if cooling
|
target_direction = isHeatingBed(); // true if heating, false if cooling
|
||||||
|
|
||||||
|
KEEPALIVE_STATE(NOT_BUSY);
|
||||||
while ( (target_direction)&&(!cancel_heatup) ? (isHeatingBed()) : (isCoolingBed()&&(CooldownNoWait==false)) )
|
while ( (target_direction)&&(!cancel_heatup) ? (isHeatingBed()) : (isCoolingBed()&&(CooldownNoWait==false)) )
|
||||||
{
|
{
|
||||||
if(( millis() - codenum) > 1000 ) //Print Temp Reading every 1 second while heating up.
|
if(( millis() - codenum) > 1000 ) //Print Temp Reading every 1 second while heating up.
|
||||||
|
|
@ -4303,6 +4367,7 @@ Sigma_Exit:
|
||||||
lcd_update();
|
lcd_update();
|
||||||
}
|
}
|
||||||
LCD_MESSAGERPGM(MSG_BED_DONE);
|
LCD_MESSAGERPGM(MSG_BED_DONE);
|
||||||
|
KEEPALIVE_STATE(IN_HANDLER);
|
||||||
heating_status = 4;
|
heating_status = 4;
|
||||||
|
|
||||||
previous_millis_cmd = millis();
|
previous_millis_cmd = millis();
|
||||||
|
|
@ -4446,6 +4511,17 @@ Sigma_Exit:
|
||||||
else
|
else
|
||||||
gcode_LastN = 0;
|
gcode_LastN = 0;
|
||||||
break;
|
break;
|
||||||
|
#ifdef HOST_KEEPALIVE_FEATURE
|
||||||
|
case 113: // M113 - Get or set Host Keepalive interval
|
||||||
|
if (code_seen('S')) {
|
||||||
|
host_keepalive_interval = (uint8_t)code_value_short();
|
||||||
|
NOMORE(host_keepalive_interval, 60);
|
||||||
|
} else {
|
||||||
|
SERIAL_ECHO_START;
|
||||||
|
SERIAL_ECHOPAIR("M113 S", (unsigned long)host_keepalive_interval);
|
||||||
|
SERIAL_PROTOCOLLN("");
|
||||||
|
}
|
||||||
|
#endif
|
||||||
case 115: // M115
|
case 115: // M115
|
||||||
if (code_seen('V')) {
|
if (code_seen('V')) {
|
||||||
// Report the Prusa version number.
|
// Report the Prusa version number.
|
||||||
|
|
@ -4993,6 +5069,8 @@ Sigma_Exit:
|
||||||
temp=70;
|
temp=70;
|
||||||
if (code_seen('S')) temp=code_value();
|
if (code_seen('S')) temp=code_value();
|
||||||
if (code_seen('C')) c=code_value();
|
if (code_seen('C')) c=code_value();
|
||||||
|
|
||||||
|
KEEPALIVE_STATE(NOT_BUSY);
|
||||||
PID_autotune(temp, e, c);
|
PID_autotune(temp, e, c);
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
|
@ -5270,6 +5348,7 @@ case 404: //M404 Enter the nominal filament width (3mm, 1.75mm ) N<3.0> or disp
|
||||||
int counterBeep = 0;
|
int counterBeep = 0;
|
||||||
lcd_wait_interact();
|
lcd_wait_interact();
|
||||||
load_filament_time = millis();
|
load_filament_time = millis();
|
||||||
|
KEEPALIVE_STATE(PAUSED_FOR_USER);
|
||||||
while(!lcd_clicked()){
|
while(!lcd_clicked()){
|
||||||
|
|
||||||
cnt++;
|
cnt++;
|
||||||
|
|
@ -5306,6 +5385,7 @@ case 404: //M404 Enter the nominal filament width (3mm, 1.75mm ) N<3.0> or disp
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
KEEPALIVE_STATE(IN_HANDLER);
|
||||||
WRITE(BEEPER, LOW);
|
WRITE(BEEPER, LOW);
|
||||||
#ifdef SNMM
|
#ifdef SNMM
|
||||||
display_loading();
|
display_loading();
|
||||||
|
|
@ -5770,6 +5850,8 @@ case 404: //M404 Enter the nominal filament width (3mm, 1.75mm ) N<3.0> or disp
|
||||||
SERIAL_ECHOLNPGM("\"");
|
SERIAL_ECHOLNPGM("\"");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
KEEPALIVE_STATE(NOT_BUSY);
|
||||||
|
|
||||||
ClearToSend();
|
ClearToSend();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue