add $J for instant jog of one axis.
[clinton/Smoothieware.git] / src / modules / robot / Conveyor.h
index 421acde..1418188 100644 (file)
@@ -5,34 +5,54 @@
       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;
+    };
+
+};