Fix M600 insertion by the filament sensor
Remove incorrect usage of stop_and_save_print combined with the fsensor_recovert internal instruction which would result in a broken sequence of events and/or broken stack. Re-use the now safe stop/recover functions in the same spot (fsensor_checkpoint_stream) to effectively cut a hole in the current gcode stream to insert an M600 instruction, which removes all recursive behavior without the need of extra state variables.
This commit is contained in:
parent
4268c2fdae
commit
6ecff003b7
|
|
@ -3657,7 +3657,7 @@ void process_commands()
|
||||||
|
|
||||||
Set of internal PRUSA commands
|
Set of internal PRUSA commands
|
||||||
|
|
||||||
PRUSA [ Ping | PRN | FAN | fn | thx | uvlo | fsensor_recover | MMURES | RESET | fv | M28 | SN | Fir | Rev | Lang | Lz | Beat | FR ]
|
PRUSA [ Ping | PRN | FAN | fn | thx | uvlo | MMURES | RESET | fv | M28 | SN | Fir | Rev | Lang | Lz | Beat | FR ]
|
||||||
|
|
||||||
- `Ping`
|
- `Ping`
|
||||||
- `PRN` - Prints revision of the printer
|
- `PRN` - Prints revision of the printer
|
||||||
|
|
@ -3665,7 +3665,6 @@ void process_commands()
|
||||||
- `fn` - Prints farm no.
|
- `fn` - Prints farm no.
|
||||||
- `thx`
|
- `thx`
|
||||||
- `uvlo`
|
- `uvlo`
|
||||||
- `fsensor_recover` - Filament sensor recover - restore print and continue
|
|
||||||
- `MMURES` - Reset MMU
|
- `MMURES` - Reset MMU
|
||||||
- `RESET` - (Careful!)
|
- `RESET` - (Careful!)
|
||||||
- `fv` - ?
|
- `fv` - ?
|
||||||
|
|
@ -3715,12 +3714,6 @@ void process_commands()
|
||||||
eeprom_update_byte((uint8_t*)EEPROM_UVLO,0);
|
eeprom_update_byte((uint8_t*)EEPROM_UVLO,0);
|
||||||
enquecommand_P(PSTR("M24"));
|
enquecommand_P(PSTR("M24"));
|
||||||
}
|
}
|
||||||
#ifdef FILAMENT_SENSOR
|
|
||||||
else if (code_seen("fsensor_recover")) // PRUSA fsensor_recover
|
|
||||||
{
|
|
||||||
fsensor_restore_print_and_continue();
|
|
||||||
}
|
|
||||||
#endif //FILAMENT_SENSOR
|
|
||||||
else if (code_seen("MMURES")) // PRUSA MMURES
|
else if (code_seen("MMURES")) // PRUSA MMURES
|
||||||
{
|
{
|
||||||
mmu_reset();
|
mmu_reset();
|
||||||
|
|
|
||||||
|
|
@ -57,15 +57,8 @@ bool fsensor_enabled = true;
|
||||||
bool fsensor_watch_runout = true;
|
bool fsensor_watch_runout = true;
|
||||||
//! not responding - is set if any communication error occurred during initialization or readout
|
//! not responding - is set if any communication error occurred during initialization or readout
|
||||||
bool fsensor_not_responding = false;
|
bool fsensor_not_responding = false;
|
||||||
//! printing saved
|
|
||||||
bool fsensor_printing_saved = false;
|
|
||||||
//! enable/disable quality meassurement
|
//! enable/disable quality meassurement
|
||||||
bool fsensor_oq_meassure_enabled = false;
|
bool fsensor_oq_meassure_enabled = false;
|
||||||
//! as explained in the CHECK_FSENSOR macro: this flag is set to true when fsensor posts
|
|
||||||
//! the M600 into the command queue, which elliminates the hazard of having posted multiple M600's
|
|
||||||
//! before the first one gets read and started processing.
|
|
||||||
//! Btw., the IR fsensor could do up to 6 posts before the command queue managed to start processing the first M600 ;)
|
|
||||||
static bool fsensor_m600_enqueued = false;
|
|
||||||
|
|
||||||
//! number of errors, updated in ISR
|
//! number of errors, updated in ISR
|
||||||
uint8_t fsensor_err_cnt = 0;
|
uint8_t fsensor_err_cnt = 0;
|
||||||
|
|
@ -137,12 +130,19 @@ void fsensor_stop_and_save_print(void)
|
||||||
void fsensor_restore_print_and_continue(void)
|
void fsensor_restore_print_and_continue(void)
|
||||||
{
|
{
|
||||||
printf_P(PSTR("fsensor_restore_print_and_continue\n"));
|
printf_P(PSTR("fsensor_restore_print_and_continue\n"));
|
||||||
fsensor_watch_runout = true;
|
|
||||||
fsensor_err_cnt = 0;
|
fsensor_err_cnt = 0;
|
||||||
fsensor_m600_enqueued = false;
|
|
||||||
restore_print_from_ram_and_continue(0); //XYZ = orig, E - no change
|
restore_print_from_ram_and_continue(0); //XYZ = orig, E - no change
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// fsensor_checkpoint_print cuts the current print job at the current position,
|
||||||
|
// allowing new instructions to be inserted in the middle
|
||||||
|
void fsensor_checkpoint_print(void)
|
||||||
|
{
|
||||||
|
printf_P(PSTR("fsensor_checkpoint_print\n"));
|
||||||
|
stop_and_save_print_to_ram(0, 0);
|
||||||
|
restore_print_from_ram_and_continue(0);
|
||||||
|
}
|
||||||
|
|
||||||
void fsensor_init(void)
|
void fsensor_init(void)
|
||||||
{
|
{
|
||||||
#ifdef PAT9125
|
#ifdef PAT9125
|
||||||
|
|
@ -565,8 +565,6 @@ void fsensor_enque_M600(){
|
||||||
printf_P(PSTR("fsensor_update - M600\n"));
|
printf_P(PSTR("fsensor_update - M600\n"));
|
||||||
eeprom_update_byte((uint8_t*)EEPROM_FERROR_COUNT, eeprom_read_byte((uint8_t*)EEPROM_FERROR_COUNT) + 1);
|
eeprom_update_byte((uint8_t*)EEPROM_FERROR_COUNT, eeprom_read_byte((uint8_t*)EEPROM_FERROR_COUNT) + 1);
|
||||||
eeprom_update_word((uint16_t*)EEPROM_FERROR_COUNT_TOT, eeprom_read_word((uint16_t*)EEPROM_FERROR_COUNT_TOT) + 1);
|
eeprom_update_word((uint16_t*)EEPROM_FERROR_COUNT_TOT, eeprom_read_word((uint16_t*)EEPROM_FERROR_COUNT_TOT) + 1);
|
||||||
enquecommand_front_P(PSTR("PRUSA fsensor_recover"));
|
|
||||||
fsensor_m600_enqueued = true;
|
|
||||||
enquecommand_front_P((PSTR("M600")));
|
enquecommand_front_P((PSTR("M600")));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -578,7 +576,7 @@ void fsensor_enque_M600(){
|
||||||
void fsensor_update(void)
|
void fsensor_update(void)
|
||||||
{
|
{
|
||||||
#ifdef PAT9125
|
#ifdef PAT9125
|
||||||
if (fsensor_enabled && fsensor_watch_runout && (fsensor_err_cnt > FSENSOR_ERR_MAX) && ( ! fsensor_m600_enqueued) )
|
if (fsensor_enabled && fsensor_watch_runout && (fsensor_err_cnt > FSENSOR_ERR_MAX))
|
||||||
{
|
{
|
||||||
bool autoload_enabled_tmp = fsensor_autoload_enabled;
|
bool autoload_enabled_tmp = fsensor_autoload_enabled;
|
||||||
fsensor_autoload_enabled = false;
|
fsensor_autoload_enabled = false;
|
||||||
|
|
@ -611,22 +609,18 @@ void fsensor_update(void)
|
||||||
err |= (fsensor_oq_er_sum > 2);
|
err |= (fsensor_oq_er_sum > 2);
|
||||||
err |= (fsensor_oq_yd_sum < (4 * FSENSOR_OQ_MIN_YD));
|
err |= (fsensor_oq_yd_sum < (4 * FSENSOR_OQ_MIN_YD));
|
||||||
|
|
||||||
if (!err)
|
fsensor_restore_print_and_continue();
|
||||||
{
|
|
||||||
printf_P(PSTR("fsensor_err_cnt = 0\n"));
|
|
||||||
fsensor_restore_print_and_continue();
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
fsensor_enque_M600();
|
|
||||||
fsensor_watch_runout = false;
|
|
||||||
}
|
|
||||||
fsensor_autoload_enabled = autoload_enabled_tmp;
|
fsensor_autoload_enabled = autoload_enabled_tmp;
|
||||||
fsensor_oq_meassure_enabled = oq_meassure_enabled_tmp;
|
fsensor_oq_meassure_enabled = oq_meassure_enabled_tmp;
|
||||||
|
|
||||||
|
if (!err)
|
||||||
|
printf_P(PSTR("fsensor_err_cnt = 0\n"));
|
||||||
|
else
|
||||||
|
fsensor_enque_M600();
|
||||||
}
|
}
|
||||||
#else //PAT9125
|
#else //PAT9125
|
||||||
if (CHECK_FSENSOR && fsensor_enabled && ir_sensor_detected && ( ! fsensor_m600_enqueued) )
|
if (CHECK_FSENSOR && fsensor_enabled && ir_sensor_detected)
|
||||||
{
|
{
|
||||||
if(digitalRead(IR_SENSOR_PIN))
|
if(digitalRead(IR_SENSOR_PIN))
|
||||||
{ // IR_SENSOR_PIN ~ H
|
{ // IR_SENSOR_PIN ~ H
|
||||||
#if IR_SENSOR_ANALOG
|
#if IR_SENSOR_ANALOG
|
||||||
|
|
@ -670,8 +664,8 @@ void fsensor_update(void)
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
#endif //IR_SENSOR_ANALOG
|
#endif //IR_SENSOR_ANALOG
|
||||||
fsensor_stop_and_save_print();
|
fsensor_checkpoint_print();
|
||||||
fsensor_enque_M600();
|
fsensor_enque_M600();
|
||||||
#if IR_SENSOR_ANALOG
|
#if IR_SENSOR_ANALOG
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -21,6 +21,8 @@ extern bool fsensor_oq_meassure_enabled;
|
||||||
extern void fsensor_stop_and_save_print(void);
|
extern void fsensor_stop_and_save_print(void);
|
||||||
//! restore print - restore position and heatup to original temperature
|
//! restore print - restore position and heatup to original temperature
|
||||||
extern void fsensor_restore_print_and_continue(void);
|
extern void fsensor_restore_print_and_continue(void);
|
||||||
|
//! split the current gcode stream to insert new instructions
|
||||||
|
extern void fsensor_checkpoint_print(void);
|
||||||
//! @}
|
//! @}
|
||||||
|
|
||||||
//! initialize
|
//! initialize
|
||||||
|
|
|
||||||
|
|
@ -382,8 +382,7 @@ void mmu_loop(void)
|
||||||
FDEBUG_PRINTF_P(PSTR("MMU => '%dok'\n"), mmu_finda);
|
FDEBUG_PRINTF_P(PSTR("MMU => '%dok'\n"), mmu_finda);
|
||||||
//printf_P(PSTR("Eact: %d\n"), int(e_active()));
|
//printf_P(PSTR("Eact: %d\n"), int(e_active()));
|
||||||
if (!mmu_finda && CHECK_FSENSOR && fsensor_enabled) {
|
if (!mmu_finda && CHECK_FSENSOR && fsensor_enabled) {
|
||||||
fsensor_stop_and_save_print();
|
fsensor_checkpoint_print();
|
||||||
enquecommand_front_P(PSTR("PRUSA fsensor_recover")); //then recover
|
|
||||||
ad_markDepleted(mmu_extruder);
|
ad_markDepleted(mmu_extruder);
|
||||||
if (lcd_autoDepleteEnabled() && !ad_allDepleted())
|
if (lcd_autoDepleteEnabled() && !ad_allDepleted())
|
||||||
{
|
{
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue