diff --git a/Firmware/Marlin_main.cpp b/Firmware/Marlin_main.cpp index 1525403dc..60d40107b 100644 --- a/Firmware/Marlin_main.cpp +++ b/Firmware/Marlin_main.cpp @@ -235,7 +235,8 @@ byte b[2]; int value; }; -int babystepLoad[3]; +// Number of baby steps applied +int babystepLoadZ = 0; float homing_feedrate[] = HOMING_FEEDRATE; // Currently only the extruder axis may be switched to a relative mode. @@ -738,7 +739,7 @@ void enquecommand(const char *cmd, bool from_progmem) cmdqueue_dump_to_serial(); #endif /* CMDBUFFER_DEBUG */ } else { - SERIAL_ECHO_START; + SERIAL_ERROR_START; SERIAL_ECHORPGM(MSG_Enqueing); if (from_progmem) SERIAL_PROTOCOLRPGM(cmd); @@ -770,7 +771,7 @@ void enquecommand_front(const char *cmd, bool from_progmem) cmdqueue_dump_to_serial(); #endif /* CMDBUFFER_DEBUG */ } else { - SERIAL_ECHO_START; + SERIAL_ERROR_START; SERIAL_ECHOPGM("Enqueing to the front: \""); if (from_progmem) SERIAL_PROTOCOLRPGM(cmd); @@ -1907,6 +1908,11 @@ void process_commands() // Wait for the motors to stop and update the current position with the absolute values. world2machine_revert_to_uncorrected(); + // Reset baby stepping to zero, if the babystepping has already been loaded before. The babystepsTodo value will be + // consumed during the first movements following this statement. + babystepsTodoZsubtract(babystepLoadZ); + babystepLoadZ = 0; + saved_feedrate = feedrate; saved_feedmultiply = feedmultiply; feedmultiply = 100; @@ -2114,11 +2120,12 @@ void process_commands() previous_millis_cmd = millis(); endstops_hit_on_purpose(); #ifndef MESH_BED_LEVELING + // If MESH_BED_LEVELING is not active, then it is the original Prusa i3. + // Offer the user to load the baby step value, which has been adjusted at the previous print session. if(card.sdprinting) { - EEPROM_read_B(EEPROM_BABYSTEP_Z,&babystepLoad[2]); - if(babystepLoad[2] != 0){ + EEPROM_read_B(EEPROM_BABYSTEP_Z,&babystepLoadZ); + if(babystepLoadZ != 0) lcd_adjust_z(); - } } #endif @@ -2139,7 +2146,8 @@ void process_commands() st_synchronize(); // Push the commands to the front of the message queue in the reverse order! // There shall be always enough space reserved for these commands. - enquecommand_front_P((PSTR("G80"))); + // enquecommand_front_P((PSTR("G80"))); + goto case_G80; } #endif @@ -2334,6 +2342,7 @@ void process_commands() * */ case 80: + case_G80: { if (!IS_SD_PRINTING) { @@ -2354,9 +2363,14 @@ void process_commands() } mbl.reset(); - + + // Reset baby stepping to zero, if the babystepping has already been loaded before. The babystepsTodo value will be + // consumed during the first movements following this statement. + babystepsTodoZsubtract(babystepLoadZ); + babystepLoadZ = 0; + // Cycle through all points and probe them - // First move up. + // First move up. During this first movement, the babystepping will be reverted. current_position[Z_AXIS] = MESH_HOME_Z_SEARCH; plan_buffer_line(current_position[X_AXIS], current_position[Y_AXIS], current_position[Z_AXIS], current_position[E_AXIS], homing_feedrate[Z_AXIS]/60, active_extruder); // The move to the first calibration point. @@ -2450,8 +2464,9 @@ void process_commands() { if(eeprom_read_byte((unsigned char*)EEPROM_BABYSTEP_Z_SET) == 0x01) { - EEPROM_read_B(EEPROM_BABYSTEP_Z,&babystepLoad[2]); - babystepsTodo[Z_AXIS] = babystepLoad[2]; + // End of G80: Apply the baby stepping value. + EEPROM_read_B(EEPROM_BABYSTEP_Z,&babystepLoadZ); + babystepsTodoZadd(babystepLoadZ); } } } @@ -2497,7 +2512,7 @@ void process_commands() break; /** - * G83: Babystep in Z and store to EEPROM + * G83: Prusa3D specific: Babystep in Z and store to EEPROM */ case 83: { @@ -2505,15 +2520,16 @@ void process_commands() int BabyPosition = code_seen('P') ? code_value() : 0; if (babystepz != 0) { - + //FIXME Vojtech: What shall be the index of the axis Z: 3 or 4? + // Is the axis indexed starting with zero or one? if (BabyPosition > 4) { SERIAL_PROTOCOLLNPGM("Index out of bounds"); }else{ // Save it to the eeprom - babystepLoad[2] = babystepz; - EEPROM_save_B(EEPROM_BABYSTEP_Z0+(BabyPosition*2),&babystepLoad[2]); - // adjist the Z - babystepsTodo[Z_AXIS] = babystepLoad[2]; + babystepLoadZ = babystepz; + EEPROM_save_B(EEPROM_BABYSTEP_Z0+(BabyPosition*2),&babystepLoadZ); + // adjust the Z + babystepsTodoZadd(babystepLoadZ); } } @@ -2521,27 +2537,30 @@ void process_commands() } break; /** - * G84: UNDO Babystep Z (move Z axis back) + * G84: Prusa3D specific: UNDO Babystep Z (move Z axis back) */ case 84: - babystepsTodo[Z_AXIS] = -babystepLoad[2]; + babystepsTodoZsubtract(babystepLoadZ); + // babystepLoadZ = 0; break; /** - * G85: Pick best babystep + * G85: Prusa3D specific: Pick best babystep */ case 85: lcd_pick_babystep(); break; /** - * G86: Disable babystep correction after home + * G86: Prusa3D specific: Disable babystep correction after home. + * This G-code will be performed at the start of a calibration script. */ case 86: eeprom_write_byte((unsigned char*)EEPROM_BABYSTEP_Z_SET, 0xFF); break; /** - * G87: Enable babystep correction after home + * G87: Prusa3D specific: Enable babystep correction after home + * This G-code will be performed at the end of a calibration script. */ case 87: eeprom_write_byte((unsigned char*)EEPROM_BABYSTEP_Z_SET, 0x01); diff --git a/Firmware/Sd2Card.cpp b/Firmware/Sd2Card.cpp index 69ae77735..9563656c1 100644 --- a/Firmware/Sd2Card.cpp +++ b/Firmware/Sd2Card.cpp @@ -500,10 +500,14 @@ bool Sd2Card::readData(uint8_t* dst, uint16_t count) { spiRec(); #endif chipSelectHigh(); + // Toshiba FlashAir Patch. Purge pending status byte. + spiSend(0XFF); return true; fail: chipSelectHigh(); + // Toshiba FlashAir Patch. Purge pending status byte. + spiSend(0XFF); return false; } //------------------------------------------------------------------------------ diff --git a/Firmware/mesh_bed_calibration.cpp b/Firmware/mesh_bed_calibration.cpp index 3a86b4fac..12dbdddbb 100644 --- a/Firmware/mesh_bed_calibration.cpp +++ b/Firmware/mesh_bed_calibration.cpp @@ -580,7 +580,7 @@ static inline bool vec_undef(const float v[2]) void world2machine_initialize() { - SERIAL_ECHOLNPGM("world2machine_initialize()"); +// SERIAL_ECHOLNPGM("world2machine_initialize()"); float cntr[2] = { eeprom_read_float((float*)(EEPROM_BED_CALIBRATION_CENTER+0)), eeprom_read_float((float*)(EEPROM_BED_CALIBRATION_CENTER+4)) @@ -596,7 +596,7 @@ void world2machine_initialize() bool reset = false; if (vec_undef(cntr) || vec_undef(vec_x) || vec_undef(vec_y)) { - SERIAL_ECHOLNPGM("Undefined bed correction matrix."); + // SERIAL_ECHOLNPGM("Undefined bed correction matrix."); reset = true; } else { @@ -632,6 +632,7 @@ void world2machine_initialize() world2machine_reset(); } else { world2machine_update(vec_x, vec_y, cntr); + /* SERIAL_ECHOPGM("world2machine_initialize() loaded: "); MYSERIAL.print(world2machine_rotation_and_skew[0][0], 5); SERIAL_ECHOPGM(", "); @@ -645,6 +646,7 @@ void world2machine_initialize() SERIAL_ECHOPGM(", "); MYSERIAL.print(world2machine_shift[1], 5); SERIAL_ECHOLNPGM(""); + */ } } @@ -695,7 +697,7 @@ static inline void update_current_position_z() // At the current position, find the Z stop. inline bool find_bed_induction_sensor_point_z(float minimum_z, uint8_t n_iter) { - SERIAL_ECHOLNPGM("find_bed_induction_sensor_point_z 1"); +// SERIAL_ECHOLNPGM("find_bed_induction_sensor_point_z 1"); bool endstops_enabled = enable_endstops(true); bool endstop_z_enabled = enable_z_endstop(false); float z = 0.f; @@ -720,9 +722,9 @@ inline bool find_bed_induction_sensor_point_z(float minimum_z, uint8_t n_iter) update_current_position_z(); if (! endstop_z_hit_on_purpose()) goto error; - SERIAL_ECHOPGM("Bed find_bed_induction_sensor_point_z low, height: "); - MYSERIAL.print(current_position[Z_AXIS], 5); - SERIAL_ECHOLNPGM(""); +// SERIAL_ECHOPGM("Bed find_bed_induction_sensor_point_z low, height: "); +// MYSERIAL.print(current_position[Z_AXIS], 5); +// SERIAL_ECHOLNPGM(""); z += current_position[Z_AXIS]; } current_position[Z_AXIS] = z; @@ -731,11 +733,11 @@ inline bool find_bed_induction_sensor_point_z(float minimum_z, uint8_t n_iter) enable_endstops(endstops_enabled); enable_z_endstop(endstop_z_enabled); - SERIAL_ECHOLNPGM("find_bed_induction_sensor_point_z 3"); +// SERIAL_ECHOLNPGM("find_bed_induction_sensor_point_z 3"); return true; error: - SERIAL_ECHOLNPGM("find_bed_induction_sensor_point_z 4"); +// SERIAL_ECHOLNPGM("find_bed_induction_sensor_point_z 4"); enable_endstops(endstops_enabled); enable_z_endstop(endstop_z_enabled); return false; diff --git a/Firmware/temperature.h b/Firmware/temperature.h index 6ca102319..c133d9dd4 100644 --- a/Firmware/temperature.h +++ b/Firmware/temperature.h @@ -73,7 +73,25 @@ extern float current_temperature_bed; #ifdef BABYSTEPPING extern volatile int babystepsTodo[3]; #endif - + +inline void babystepsTodoZadd(int n) +{ + if (n != 0) { + CRITICAL_SECTION_START + babystepsTodo[Z_AXIS] += n; + CRITICAL_SECTION_END + } +} + +inline void babystepsTodoZsubtract(int n) +{ + if (n != 0) { + CRITICAL_SECTION_START + babystepsTodo[Z_AXIS] -= n; + CRITICAL_SECTION_END + } +} + //high level conversion routines, for use outside of temperature.cpp //inline so that there is no performance decrease. //deg=degreeCelsius diff --git a/Firmware/ultralcd.cpp b/Firmware/ultralcd.cpp index 1a84ddb17..dbb7a5550 100644 --- a/Firmware/ultralcd.cpp +++ b/Firmware/ultralcd.cpp @@ -1093,7 +1093,9 @@ static void lcd_move_z() { static void _lcd_babystep(int axis, const char *msg) { if (encoderPosition != 0) { + CRITICAL_SECTION_START babystepsTodo[axis] += (int)encoderPosition; + CRITICAL_SECTION_END babystepMem[axis] += (int)encoderPosition; babystepMemMM[axis] = babystepMem[axis]/axis_steps_per_unit[Z_AXIS]; delay(50); @@ -1188,7 +1190,9 @@ void lcd_adjust_z() { EEPROM_read_B(EEPROM_BABYSTEP_X, &babystepMem[0]); EEPROM_read_B(EEPROM_BABYSTEP_Y, &babystepMem[1]); EEPROM_read_B(EEPROM_BABYSTEP_Z, &babystepMem[2]); + CRITICAL_SECTION_START babystepsTodo[Z_AXIS] = babystepMem[2]; + CRITICAL_SECTION_END } else { babystepMem[0] = 0; babystepMem[1] = 0;