@@ -91,12 +91,18 @@ int16_t get_fan_speed(const std::string &line, GCodeFlavor flavor) {
91
91
92
92
}
93
93
94
- void FanMover::_put_in_middle_G1 (std::list<BufferData>::iterator item_to_split, float nb_sec_since_itemtosplit_start, BufferData &&line_to_write) {
94
+ void FanMover::_put_in_middle_G1 (std::list<BufferData>::iterator item_to_split, float nb_sec_since_itemtosplit_start, BufferData &&line_to_write, float max_time ) {
95
95
assert (item_to_split != m_buffer.end ());
96
- if (nb_sec_since_itemtosplit_start > item_to_split->time * 0.9 ) {
96
+ // if the fan is at the end of the g1 and the diff is less than 10% of the delay, then don't bother
97
+ if (nb_sec_since_itemtosplit_start > item_to_split->time * 0.9 && (item_to_split->time - nb_sec_since_itemtosplit_start) < max_time * 0.1 ) {
97
98
// doesn't really need to be split, print it after
98
99
m_buffer.insert (next (item_to_split), line_to_write);
99
- } else if (nb_sec_since_itemtosplit_start < item_to_split->time * 0.1 ) {
100
+ } else
101
+ // does it need to be split?
102
+ // if it's almost at the start of the g1, and the time "lost" is less than 10%
103
+ if (nb_sec_since_itemtosplit_start < item_to_split->time * 0.1 && nb_sec_since_itemtosplit_start < max_time * 0.1 &&
104
+ // and the previous isn't a fan value
105
+ (item_to_split == m_buffer.begin () || std::prev (item_to_split)->fan_speed < 0 )) {
100
106
// doesn't really need to be split, print it before
101
107
// will also print before if line_to_split.time == 0
102
108
m_buffer.insert (item_to_split, line_to_write);
@@ -340,11 +346,18 @@ void FanMover::_process_gcode_line(GCodeReader& reader, const GCodeReader::GCode
340
346
if (fan_speed >= 0 ) {
341
347
const auto fan_baseline = (m_writer.config .fan_percentage .value ? 100.0 : 255.0 );
342
348
fan_speed = 100 * fan_speed / fan_baseline;
343
- // speed change: stop kickstart reverting if any
344
- m_current_kickstart.time = -1 ;
345
349
if (!m_is_custom_gcode) {
346
350
// if slow down => put in the queue. if not =>
347
- if (m_back_buffer_fan_speed < fan_speed) {
351
+ if (m_current_kickstart.time > 0 ) {
352
+ assert (m_back_buffer_fan_speed == m_current_kickstart.fan_speed );
353
+ }
354
+ if (m_back_buffer_fan_speed >= fan_speed) {
355
+ if (m_current_kickstart.time > 0 ) {
356
+ // stop kiskstart, and slow down
357
+ m_current_kickstart.time = -1 ;
358
+ // this fan speed will be printed, to make and end to the kickstart
359
+ }
360
+ } else {
348
361
if (nb_seconds_delay > 0 && (!only_overhangs || current_role == ExtrusionRole::erOverhangPerimeter)) {
349
362
// don't put this command in the queue
350
363
time = -1 ;
@@ -376,7 +389,7 @@ void FanMover::_process_gcode_line(GCodeReader& reader, const GCodeReader::GCode
376
389
time_count -= it->time ;
377
390
if (time_count< 0 ) {
378
391
// found something that is lower than us
379
- _put_in_middle_G1 (it, it->time + time_count, BufferData (std::string (line.raw ()), 0 , fan_speed, true ));
392
+ _put_in_middle_G1 (it, it->time + time_count, BufferData (std::string (line.raw ()), 0 , fan_speed, true ), nb_seconds_delay );
380
393
// found, stop
381
394
break ;
382
395
}
@@ -502,7 +515,7 @@ void FanMover::_process_gcode_line(GCodeReader& reader, const GCodeReader::GCode
502
515
m_current_kickstart.time -= time ;
503
516
if (m_current_kickstart.time < 0 ) {
504
517
// prev is possible because we just do a emplace_back.
505
- _put_in_middle_G1 (prev (m_buffer.end ()), time + m_current_kickstart.time , BufferData{ m_current_kickstart.raw , 0 , m_current_kickstart.fan_speed , true });
518
+ _put_in_middle_G1 (prev (m_buffer.end ()), time + m_current_kickstart.time , BufferData{ m_current_kickstart.raw , 0 , m_current_kickstart.fan_speed , true }, kickstart );
506
519
}
507
520
}
508
521
}/* else {
@@ -547,17 +560,14 @@ void FanMover::write_buffer_data()
547
560
if (frontdata.fan_speed < 0 || frontdata.fan_speed != m_front_buffer_fan_speed || frontdata.is_kickstart ) {
548
561
if (frontdata.is_kickstart && frontdata.fan_speed < m_front_buffer_fan_speed) {
549
562
// you have to slow down! not kickstart! rewrite the fan speed.
550
- m_process_output += _set_fan (
551
- frontdata.fan_speed ); // m_writer.set_fan(frontdata.fan_speed,true); //FIXME extruder id (or use the
552
- // gcode writer, but then you have to disable the multi-thread thing
553
-
563
+ m_process_output += _set_fan (frontdata.fan_speed ) + " \n " ;
554
564
m_front_buffer_fan_speed = frontdata.fan_speed ;
555
565
} else {
556
566
m_process_output += frontdata.raw + " \n " ;
557
- if (frontdata.fan_speed >= 0 ) {
567
+ if (frontdata.fan_speed >= 0 || frontdata. is_kickstart ) {
558
568
// note that this is the only place where the fan_speed is set and we print from the buffer, as if the
559
569
// fan_speed >= 0 => time == 0 and as this flush all time == 0 lines from the back of the queue...
560
- m_front_buffer_fan_speed = frontdata.fan_speed ;
570
+ m_front_buffer_fan_speed = frontdata.is_kickstart ? 100 : frontdata. fan_speed ;
561
571
}
562
572
}
563
573
}
0 commit comments