Time estimate emitted to gcode at requested interval

This commit is contained in:
Enrico Turri 2018-06-27 15:35:47 +02:00
parent de28d4edeb
commit 7ff22b9413
8 changed files with 544 additions and 137 deletions

View file

@ -375,8 +375,15 @@ void GCode::do_export(Print *print, const char *path, GCodePreviewData *preview_
}
fclose(file);
//#################################################################################################################
m_normal_time_estimator.post_process_remaining_times(path_tmp, 60.0f);
//#################################################################################################################
if (m_silent_time_estimator_enabled)
GCodeTimeEstimator::post_process_elapsed_times(path_tmp, m_default_time_estimator.get_time(), m_silent_time_estimator.get_time());
//############################################################################################################3
m_silent_time_estimator.post_process_remaining_times(path_tmp, 60.0f);
// GCodeTimeEstimator::post_process_elapsed_times(path_tmp, m_default_time_estimator.get_time(), m_silent_time_estimator.get_time());
//############################################################################################################3
if (! this->m_placeholder_parser_failed_templates.empty()) {
// G-code export proceeded, but some of the PlaceholderParser substitutions failed.
@ -408,30 +415,72 @@ void GCode::_do_export(Print &print, FILE *file, GCodePreviewData *preview_data)
PROFILE_FUNC();
// resets time estimators
m_default_time_estimator.reset();
m_default_time_estimator.set_dialect(print.config.gcode_flavor);
m_default_time_estimator.set_acceleration(print.config.machine_max_acceleration_extruding.values[0]);
m_default_time_estimator.set_retract_acceleration(print.config.machine_max_acceleration_retracting.values[0]);
m_default_time_estimator.set_minimum_feedrate(print.config.machine_min_extruding_rate.values[0]);
m_default_time_estimator.set_minimum_travel_feedrate(print.config.machine_min_travel_rate.values[0]);
m_default_time_estimator.set_axis_max_acceleration(GCodeTimeEstimator::X, print.config.machine_max_acceleration_x.values[0]);
m_default_time_estimator.set_axis_max_acceleration(GCodeTimeEstimator::Y, print.config.machine_max_acceleration_y.values[0]);
m_default_time_estimator.set_axis_max_acceleration(GCodeTimeEstimator::Z, print.config.machine_max_acceleration_z.values[0]);
m_default_time_estimator.set_axis_max_acceleration(GCodeTimeEstimator::E, print.config.machine_max_acceleration_e.values[0]);
m_default_time_estimator.set_axis_max_feedrate(GCodeTimeEstimator::X, print.config.machine_max_feedrate_x.values[0]);
m_default_time_estimator.set_axis_max_feedrate(GCodeTimeEstimator::Y, print.config.machine_max_feedrate_y.values[0]);
m_default_time_estimator.set_axis_max_feedrate(GCodeTimeEstimator::Z, print.config.machine_max_feedrate_z.values[0]);
m_default_time_estimator.set_axis_max_feedrate(GCodeTimeEstimator::E, print.config.machine_max_feedrate_e.values[0]);
m_default_time_estimator.set_axis_max_jerk(GCodeTimeEstimator::X, print.config.machine_max_jerk_x.values[0]);
m_default_time_estimator.set_axis_max_jerk(GCodeTimeEstimator::Y, print.config.machine_max_jerk_y.values[0]);
m_default_time_estimator.set_axis_max_jerk(GCodeTimeEstimator::Z, print.config.machine_max_jerk_z.values[0]);
m_default_time_estimator.set_axis_max_jerk(GCodeTimeEstimator::E, print.config.machine_max_jerk_e.values[0]);
//#######################################################################################################################################################################
m_normal_time_estimator.reset();
m_normal_time_estimator.set_dialect(print.config.gcode_flavor);
m_normal_time_estimator.set_remaining_times_enabled(false);
m_normal_time_estimator.set_acceleration(print.config.machine_max_acceleration_extruding.values[0]);
m_normal_time_estimator.set_retract_acceleration(print.config.machine_max_acceleration_retracting.values[0]);
m_normal_time_estimator.set_minimum_feedrate(print.config.machine_min_extruding_rate.values[0]);
m_normal_time_estimator.set_minimum_travel_feedrate(print.config.machine_min_travel_rate.values[0]);
m_normal_time_estimator.set_axis_max_acceleration(GCodeTimeEstimator::X, print.config.machine_max_acceleration_x.values[0]);
m_normal_time_estimator.set_axis_max_acceleration(GCodeTimeEstimator::Y, print.config.machine_max_acceleration_y.values[0]);
m_normal_time_estimator.set_axis_max_acceleration(GCodeTimeEstimator::Z, print.config.machine_max_acceleration_z.values[0]);
m_normal_time_estimator.set_axis_max_acceleration(GCodeTimeEstimator::E, print.config.machine_max_acceleration_e.values[0]);
m_normal_time_estimator.set_axis_max_feedrate(GCodeTimeEstimator::X, print.config.machine_max_feedrate_x.values[0]);
m_normal_time_estimator.set_axis_max_feedrate(GCodeTimeEstimator::Y, print.config.machine_max_feedrate_y.values[0]);
m_normal_time_estimator.set_axis_max_feedrate(GCodeTimeEstimator::Z, print.config.machine_max_feedrate_z.values[0]);
m_normal_time_estimator.set_axis_max_feedrate(GCodeTimeEstimator::E, print.config.machine_max_feedrate_e.values[0]);
m_normal_time_estimator.set_axis_max_jerk(GCodeTimeEstimator::X, print.config.machine_max_jerk_x.values[0]);
m_normal_time_estimator.set_axis_max_jerk(GCodeTimeEstimator::Y, print.config.machine_max_jerk_y.values[0]);
m_normal_time_estimator.set_axis_max_jerk(GCodeTimeEstimator::Z, print.config.machine_max_jerk_z.values[0]);
m_normal_time_estimator.set_axis_max_jerk(GCodeTimeEstimator::E, print.config.machine_max_jerk_e.values[0]);
std::cout << "Normal" << std::endl;
std::cout << "set_acceleration " << print.config.machine_max_acceleration_extruding.values[0] << std::endl;
std::cout << "set_retract_acceleration " << print.config.machine_max_acceleration_retracting.values[0] << std::endl;
std::cout << "set_minimum_feedrate " << print.config.machine_min_extruding_rate.values[0] << std::endl;
std::cout << "set_minimum_travel_feedrate " << print.config.machine_min_travel_rate.values[0] << std::endl;
std::cout << "set_axis_max_acceleration X " << print.config.machine_max_acceleration_x.values[0] << std::endl;
std::cout << "set_axis_max_acceleration Y " << print.config.machine_max_acceleration_y.values[0] << std::endl;
std::cout << "set_axis_max_acceleration Z " << print.config.machine_max_acceleration_z.values[0] << std::endl;
std::cout << "set_axis_max_acceleration E " << print.config.machine_max_acceleration_e.values[0] << std::endl;
std::cout << "set_axis_max_feedrate X " << print.config.machine_max_feedrate_x.values[0] << std::endl;
std::cout << "set_axis_max_feedrate Y " << print.config.machine_max_feedrate_y.values[0] << std::endl;
std::cout << "set_axis_max_feedrate Z " << print.config.machine_max_feedrate_z.values[0] << std::endl;
std::cout << "set_axis_max_feedrate E " << print.config.machine_max_feedrate_e.values[0] << std::endl;
std::cout << "set_axis_max_jerk X " << print.config.machine_max_jerk_x.values[0] << std::endl;
std::cout << "set_axis_max_jerk Y " << print.config.machine_max_jerk_y.values[0] << std::endl;
std::cout << "set_axis_max_jerk Z " << print.config.machine_max_jerk_z.values[0] << std::endl;
std::cout << "set_axis_max_jerk E " << print.config.machine_max_jerk_e.values[0] << std::endl;
// m_default_time_estimator.reset();
// m_default_time_estimator.set_dialect(print.config.gcode_flavor);
// m_default_time_estimator.set_acceleration(print.config.machine_max_acceleration_extruding.values[0]);
// m_default_time_estimator.set_retract_acceleration(print.config.machine_max_acceleration_retracting.values[0]);
// m_default_time_estimator.set_minimum_feedrate(print.config.machine_min_extruding_rate.values[0]);
// m_default_time_estimator.set_minimum_travel_feedrate(print.config.machine_min_travel_rate.values[0]);
// m_default_time_estimator.set_axis_max_acceleration(GCodeTimeEstimator::X, print.config.machine_max_acceleration_x.values[0]);
// m_default_time_estimator.set_axis_max_acceleration(GCodeTimeEstimator::Y, print.config.machine_max_acceleration_y.values[0]);
// m_default_time_estimator.set_axis_max_acceleration(GCodeTimeEstimator::Z, print.config.machine_max_acceleration_z.values[0]);
// m_default_time_estimator.set_axis_max_acceleration(GCodeTimeEstimator::E, print.config.machine_max_acceleration_e.values[0]);
// m_default_time_estimator.set_axis_max_feedrate(GCodeTimeEstimator::X, print.config.machine_max_feedrate_x.values[0]);
// m_default_time_estimator.set_axis_max_feedrate(GCodeTimeEstimator::Y, print.config.machine_max_feedrate_y.values[0]);
// m_default_time_estimator.set_axis_max_feedrate(GCodeTimeEstimator::Z, print.config.machine_max_feedrate_z.values[0]);
// m_default_time_estimator.set_axis_max_feedrate(GCodeTimeEstimator::E, print.config.machine_max_feedrate_e.values[0]);
// m_default_time_estimator.set_axis_max_jerk(GCodeTimeEstimator::X, print.config.machine_max_jerk_x.values[0]);
// m_default_time_estimator.set_axis_max_jerk(GCodeTimeEstimator::Y, print.config.machine_max_jerk_y.values[0]);
// m_default_time_estimator.set_axis_max_jerk(GCodeTimeEstimator::Z, print.config.machine_max_jerk_z.values[0]);
// m_default_time_estimator.set_axis_max_jerk(GCodeTimeEstimator::E, print.config.machine_max_jerk_e.values[0]);
//#######################################################################################################################################################################
m_silent_time_estimator_enabled = (print.config.gcode_flavor == gcfMarlin) && print.config.silent_mode;
if (m_silent_time_estimator_enabled)
{
m_silent_time_estimator.reset();
m_silent_time_estimator.set_dialect(print.config.gcode_flavor);
m_silent_time_estimator.set_remaining_times_enabled(false);
m_silent_time_estimator.set_acceleration(print.config.machine_max_acceleration_extruding.values[1]);
m_silent_time_estimator.set_retract_acceleration(print.config.machine_max_acceleration_retracting.values[1]);
m_silent_time_estimator.set_minimum_feedrate(print.config.machine_min_extruding_rate.values[1]);
@ -638,12 +687,14 @@ void GCode::_do_export(Print &print, FILE *file, GCodePreviewData *preview_data)
_writeln(file, buf);
}
// before start gcode time estimation
if (m_silent_time_estimator_enabled)
{
_write(file, m_default_time_estimator.get_elapsed_time_string().c_str());
_write(file, m_silent_time_estimator.get_elapsed_time_string().c_str());
}
//#######################################################################################################################################################################
// // before start gcode time estimation
// if (m_silent_time_estimator_enabled)
// {
// _write(file, m_default_time_estimator.get_elapsed_time_string().c_str());
// _write(file, m_silent_time_estimator.get_elapsed_time_string().c_str());
// }
//#######################################################################################################################################################################
// Write the custom start G-code
_writeln(file, start_gcode);
@ -849,21 +900,34 @@ void GCode::_do_export(Print &print, FILE *file, GCodePreviewData *preview_data)
for (const std::string &end_gcode : print.config.end_filament_gcode.values)
_writeln(file, this->placeholder_parser_process("end_filament_gcode", end_gcode, (unsigned int)(&end_gcode - &print.config.end_filament_gcode.values.front()), &config));
}
// before end gcode time estimation
if (m_silent_time_estimator_enabled)
{
_write(file, m_default_time_estimator.get_elapsed_time_string().c_str());
_write(file, m_silent_time_estimator.get_elapsed_time_string().c_str());
}
//#######################################################################################################################################################################
// // before end gcode time estimation
// if (m_silent_time_estimator_enabled)
// {
// _write(file, m_default_time_estimator.get_elapsed_time_string().c_str());
// _write(file, m_silent_time_estimator.get_elapsed_time_string().c_str());
// }
//#######################################################################################################################################################################
_writeln(file, this->placeholder_parser_process("end_gcode", print.config.end_gcode, m_writer.extruder()->id(), &config));
}
_write(file, m_writer.update_progress(m_layer_count, m_layer_count, true)); // 100%
_write(file, m_writer.postamble());
// calculates estimated printing time
m_default_time_estimator.calculate_time();
//#######################################################################################################################################################################
m_normal_time_estimator.set_remaining_times_enabled(true);
m_normal_time_estimator.calculate_time();
// m_default_time_estimator.calculate_time();
//#######################################################################################################################################################################
if (m_silent_time_estimator_enabled)
//#######################################################################################################################################################################
{
m_silent_time_estimator.set_remaining_times_enabled(true);
//#######################################################################################################################################################################
m_silent_time_estimator.calculate_time();
//#######################################################################################################################################################################
}
//#######################################################################################################################################################################
// Get filament stats.
print.filament_stats.clear();
@ -871,7 +935,10 @@ void GCode::_do_export(Print &print, FILE *file, GCodePreviewData *preview_data)
print.total_extruded_volume = 0.;
print.total_weight = 0.;
print.total_cost = 0.;
print.estimated_default_print_time = m_default_time_estimator.get_time_dhms();
//#######################################################################################################################################################################
print.estimated_normal_print_time = m_normal_time_estimator.get_time_dhms();
// print.estimated_default_print_time = m_default_time_estimator.get_time_dhms();
//#######################################################################################################################################################################
print.estimated_silent_print_time = m_silent_time_estimator_enabled ? m_silent_time_estimator.get_time_dhms() : "N/A";
for (const Extruder &extruder : m_writer.extruders()) {
double used_filament = extruder.used_filament();
@ -892,7 +959,10 @@ void GCode::_do_export(Print &print, FILE *file, GCodePreviewData *preview_data)
print.total_extruded_volume = print.total_extruded_volume + extruded_volume;
}
_write_format(file, "; total filament cost = %.1lf\n", print.total_cost);
_write_format(file, "; estimated printing time (default mode) = %s\n", m_default_time_estimator.get_time_dhms().c_str());
//#######################################################################################################################################################################
_write_format(file, "; estimated printing time (normal mode) = %s\n", m_normal_time_estimator.get_time_dhms().c_str());
// _write_format(file, "; estimated printing time (default mode) = %s\n", m_default_time_estimator.get_time_dhms().c_str());
//#######################################################################################################################################################################
if (m_silent_time_estimator_enabled)
_write_format(file, "; estimated printing time (silent mode) = %s\n", m_silent_time_estimator.get_time_dhms().c_str());
@ -1462,12 +1532,14 @@ void GCode::process_layer(
_write(file, gcode);
// after layer time estimation
if (m_silent_time_estimator_enabled)
{
_write(file, m_default_time_estimator.get_elapsed_time_string().c_str());
_write(file, m_silent_time_estimator.get_elapsed_time_string().c_str());
}
//#######################################################################################################################################################################
// // after layer time estimation
// if (m_silent_time_estimator_enabled)
// {
// _write(file, m_default_time_estimator.get_elapsed_time_string().c_str());
// _write(file, m_silent_time_estimator.get_elapsed_time_string().c_str());
// }
//#######################################################################################################################################################################
}
void GCode::apply_print_config(const PrintConfig &print_config)
@ -2126,7 +2198,10 @@ void GCode::_write(FILE* file, const char *what)
// writes string to file
fwrite(gcode, 1, ::strlen(gcode), file);
// updates time estimator and gcode lines vector
m_default_time_estimator.add_gcode_block(gcode);
//#######################################################################################################################################################################
m_normal_time_estimator.add_gcode_block(gcode);
// m_default_time_estimator.add_gcode_block(gcode);
//#######################################################################################################################################################################
if (m_silent_time_estimator_enabled)
m_silent_time_estimator.add_gcode_block(gcode);
}