From e0ee24edfbdd8066681f98f78098384bd062fca6 Mon Sep 17 00:00:00 2001 From: Michael Moon Date: Wed, 15 Jan 2014 12:39:44 +1100 Subject: [PATCH] provide one method to add gcode to blocks, reduce code duplication --- src/libs/SlowTicker.cpp | 7 +------ src/modules/robot/Conveyor.cpp | 9 +++++++++ src/modules/robot/Conveyor.h | 5 +++++ src/modules/robot/Robot.cpp | 8 +------- src/modules/robot/Stepper.cpp | 8 +------- src/modules/tools/extruder/Extruder.cpp | 18 +++--------------- src/modules/tools/switch/Switch.cpp | 13 ++++--------- .../temperaturecontrol/TemperatureControl.cpp | 9 +-------- 8 files changed, 25 insertions(+), 52 deletions(-) diff --git a/src/libs/SlowTicker.cpp b/src/libs/SlowTicker.cpp index 9365a2d0..69614727 100644 --- a/src/libs/SlowTicker.cpp +++ b/src/libs/SlowTicker.cpp @@ -147,12 +147,7 @@ void SlowTicker::on_gcode_received(void* argument){ Gcode* gcode = static_cast(argument); // Add the gcode to the queue ourselves if we need it if( gcode->has_g && gcode->g == 4 ){ - if( THEKERNEL->conveyor->queue.size() == 0 ){ - THEKERNEL->call_event(ON_GCODE_EXECUTE, gcode ); - }else{ - Block* block = THEKERNEL->conveyor->queue.get_ref( THEKERNEL->conveyor->queue.size() - 1 ); - block->append_gcode(gcode); - } + THEKERNEL->conveyor->append_gcode(gcode); } } diff --git a/src/modules/robot/Conveyor.cpp b/src/modules/robot/Conveyor.cpp index ec7cbcd0..f91709fd 100644 --- a/src/modules/robot/Conveyor.cpp +++ b/src/modules/robot/Conveyor.cpp @@ -43,6 +43,15 @@ void Conveyor::on_idle(void* argument){ } } +void Conveyor::append_gcode(Gcode* gcode) +{ + gcode->mark_as_taken(); + if (queue.size() == 0) + THEKERNEL->call_event(ON_GCODE_EXECUTE, gcode); + else + queue.get_ref(queue.size() - 1)->append_gcode(gcode); +} + // Append a block to the list Block* Conveyor::new_block(){ diff --git a/src/modules/robot/Conveyor.h b/src/modules/robot/Conveyor.h index f4ef6f44..0ef79ce2 100644 --- a/src/modules/robot/Conveyor.h +++ b/src/modules/robot/Conveyor.h @@ -10,10 +10,13 @@ #include "libs/Module.h" #include "libs/Kernel.h" + using namespace std; #include #include +class Gcode; + class Conveyor : public Module { public: @@ -29,6 +32,8 @@ public: void wait_for_empty_queue(); bool is_queue_empty(); + void append_gcode(Gcode*); + // right now block queue size can only be changed at compile time by changing the value below typedef RingBuffer BlockQueue_t; BlockQueue_t queue; // Queue of Blocks diff --git a/src/modules/robot/Robot.cpp b/src/modules/robot/Robot.cpp index 885252bb..ca0bbf5d 100644 --- a/src/modules/robot/Robot.cpp +++ b/src/modules/robot/Robot.cpp @@ -360,13 +360,7 @@ void Robot::on_gcode_received(void * argument){ void Robot::distance_in_gcode_is_known(Gcode* gcode){ //If the queue is empty, execute immediatly, otherwise attach to the last added block - if( THEKERNEL->conveyor->queue.size() == 0 ){ - THEKERNEL->call_event(ON_GCODE_EXECUTE, gcode ); - }else{ - Block* block = THEKERNEL->conveyor->queue.get_ref( THEKERNEL->conveyor->queue.size() - 1 ); - block->append_gcode(gcode); - } - + THEKERNEL->conveyor->append_gcode(gcode); } // Reset the position for all axes ( used in homing and G92 stuff ) diff --git a/src/modules/robot/Stepper.cpp b/src/modules/robot/Stepper.cpp index 41c6373f..9b60b88b 100644 --- a/src/modules/robot/Stepper.cpp +++ b/src/modules/robot/Stepper.cpp @@ -87,13 +87,7 @@ void Stepper::on_gcode_received(void* argument){ Gcode* gcode = static_cast(argument); // Attach gcodes to the last block for on_gcode_execute if( gcode->has_m && (gcode->m == 84 || gcode->m == 17 || gcode->m == 18 )) { - gcode->mark_as_taken(); - if( THEKERNEL->conveyor->queue.size() == 0 ){ - THEKERNEL->call_event(ON_GCODE_EXECUTE, gcode ); - }else{ - Block* block = THEKERNEL->conveyor->queue.get_ref( THEKERNEL->conveyor->queue.size() - 1 ); - block->append_gcode(gcode); - } + THEKERNEL->conveyor->append_gcode(gcode); } } diff --git a/src/modules/tools/extruder/Extruder.cpp b/src/modules/tools/extruder/Extruder.cpp index a8bb7f75..96212659 100644 --- a/src/modules/tools/extruder/Extruder.cpp +++ b/src/modules/tools/extruder/Extruder.cpp @@ -154,13 +154,7 @@ void Extruder::on_gcode_received(void *argument){ // Gcodes to pass along to on_gcode_execute if( ( gcode->has_m && (gcode->m == 17 || gcode->m == 18 || gcode->m == 82 || gcode->m == 83 || gcode->m == 84 || gcode->m == 92 ) ) || ( gcode->has_g && gcode->g == 92 && gcode->has_letter('E') ) || ( gcode->has_g && ( gcode->g == 90 || gcode->g == 91 ) ) ){ - gcode->mark_as_taken(); - if( THEKERNEL->conveyor->queue.size() == 0 ){ - THEKERNEL->call_event(ON_GCODE_EXECUTE, gcode ); - }else{ - Block* block = THEKERNEL->conveyor->queue.get_ref( THEKERNEL->conveyor->queue.size() - 1 ); - block->append_gcode(gcode); - } + THEKERNEL->conveyor->append_gcode(gcode); } // Add to the queue for on_gcode_execute to process @@ -168,14 +162,8 @@ void Extruder::on_gcode_received(void *argument){ if( !gcode->has_letter('X') && !gcode->has_letter('Y') && !gcode->has_letter('Z') ){ // This is a solo move, we add an empty block to the queue //If the queue is empty, execute immediatly, otherwise attach to the last added block - if( THEKERNEL->conveyor->queue.size() == 0 ){ - THEKERNEL->call_event(ON_GCODE_EXECUTE, gcode ); - this->append_empty_block(); - }else{ - Block* block = THEKERNEL->conveyor->queue.get_ref( THEKERNEL->conveyor->queue.size() - 1 ); - block->append_gcode(gcode); - this->append_empty_block(); - } + THEKERNEL->conveyor->append_gcode(gcode); + this->append_empty_block(); } }else{ // This is for follow move diff --git a/src/modules/tools/switch/Switch.cpp b/src/modules/tools/switch/Switch.cpp index a6f15075..199c9526 100644 --- a/src/modules/tools/switch/Switch.cpp +++ b/src/modules/tools/switch/Switch.cpp @@ -66,15 +66,10 @@ void Switch::on_config_reload(void* argument){ void Switch::on_gcode_received(void* argument){ Gcode* gcode = static_cast(argument); // Add the gcode to the queue ourselves if we need it - if( ( input_on_command.length() > 0 && ! gcode->command.compare(0, input_on_command.length(), input_on_command) ) - || ( input_off_command.length() > 0 && ! gcode->command.compare(0, input_off_command.length(), input_off_command) ) ){ - gcode->mark_as_taken(); - if( THEKERNEL->conveyor->queue.size() == 0 ){ - THEKERNEL->call_event(ON_GCODE_EXECUTE, gcode ); - }else{ - Block* block = THEKERNEL->conveyor->queue.get_ref( THEKERNEL->conveyor->queue.size() - 1 ); - block->append_gcode(gcode); - } + if (( input_on_command.length() > 0 && ! gcode->command.compare(0, input_on_command.length(), input_on_command) ) || + ( input_off_command.length() > 0 && ! gcode->command.compare(0, input_off_command.length(), input_off_command) ) ) + { + THEKERNEL->conveyor->append_gcode(gcode); } } diff --git a/src/modules/tools/temperaturecontrol/TemperatureControl.cpp b/src/modules/tools/temperaturecontrol/TemperatureControl.cpp index 3f678cbd..f11ec6cf 100644 --- a/src/modules/tools/temperaturecontrol/TemperatureControl.cpp +++ b/src/modules/tools/temperaturecontrol/TemperatureControl.cpp @@ -170,15 +170,8 @@ void TemperatureControl::on_gcode_received(void* argument){ gcode->mark_as_taken(); } else if( ( gcode->m == this->set_m_code || gcode->m == this->set_and_wait_m_code ) && gcode->has_letter('S') ) { - gcode->mark_as_taken(); - // Attach gcodes to the last block for on_gcode_execute - if( THEKERNEL->conveyor->queue.size() == 0 ){ - THEKERNEL->call_event(ON_GCODE_EXECUTE, gcode ); - }else{ - Block* block = THEKERNEL->conveyor->queue.get_ref( THEKERNEL->conveyor->queue.size() - 1 ); - block->append_gcode(gcode); - } + THEKERNEL->conveyor->append_gcode(gcode); } } } -- 2.20.1