You should have received a copy of the GNU General Public License along with Smoothie. If not, see <http://www.gnu.org/licenses/>.
*/
-#ifndef CONVEYOR_H
-#define CONVEYOR_H
+#pragma once
#include "libs/Module.h"
-#include "libs/Kernel.h"
-using namespace std;
-#include <string>
-#include <vector>
-
-class Conveyor : public Module {
- public:
- Conveyor();
-
- void on_module_loaded(void);
- void on_idle(void*);
-
- Block* new_block();
- void new_block_added();
- void pop_and_process_new_block(int debug);
- void wait_for_queue(int free_blocks);
- void wait_for_empty_queue();
- bool is_queue_empty();
-
- RingBuffer<Block,16> queue; // Queue of Blocks
- Block* current_block;
- bool looking_for_new_block;
-
- volatile int flush_blocks;
-};
+#include "BlockQueue.h"
+
+class Block;
+
+class Conveyor : public Module
+{
+public:
+ Conveyor();
+ void start(uint8_t n_actuators);
+
+ void on_module_loaded(void);
+ void on_idle(void *);
+ void on_halt(void *);
+
+ void wait_for_idle(bool wait_for_motors=true);
+ bool is_queue_empty() { return queue.is_empty(); };
+ bool is_queue_full() { return queue.is_full(); };
+ bool is_idle() const;
+
+ // returns next available block writes it to block and returns true
+ bool get_next_block(Block **block);
+ void block_finished();
+
+ void dump_queue(void);
+ void flush_queue(void);
+ float get_current_feedrate() const { return current_feedrate; }
+ void force_queue() { check_queue(true); }
-#endif // CONVEYOR_H
+ friend class Planner; // for queue
+
+private:
+ void check_queue(bool force= false);
+ void queue_head_block(void);
+
+ using Queue_t= BlockQueue;
+ Queue_t queue; // Queue of Blocks
+
+ uint32_t queue_delay_time_ms;
+ size_t queue_size;
+ float current_feedrate{0}; // actual nominal feedrate that current block is running at in mm/sec
+
+ struct {
+ volatile bool running:1;
+ volatile bool allow_fetch:1;
+ bool flush:1;
+ };
+
+};