|
1 /* |
|
2 planner.h - buffers movement commands and manages the acceleration profile plan |
|
3 Part of Grbl |
|
4 |
|
5 Copyright (c) 2009-2011 Simen Svale Skogsrud |
|
6 |
|
7 Grbl is free software: you can redistribute it and/or modify |
|
8 it under the terms of the GNU General Public License as published by |
|
9 the Free Software Foundation, either version 3 of the License, or |
|
10 (at your option) any later version. |
|
11 |
|
12 Grbl is distributed in the hope that it will be useful, |
|
13 but WITHOUT ANY WARRANTY; without even the implied warranty of |
|
14 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
|
15 GNU General Public License for more details. |
|
16 |
|
17 You should have received a copy of the GNU General Public License |
|
18 along with Grbl. If not, see <http://www.gnu.org/licenses/>. |
|
19 */ |
|
20 |
|
21 // This module is to be considered a sub-module of stepper.c. Please don't include |
|
22 // this file from any other module. |
|
23 |
|
24 #ifndef planner_h |
|
25 #define planner_h |
|
26 |
|
27 #include "Marlin.h" |
|
28 |
|
29 // This struct is used when buffering the setup for each linear movement "nominal" values are as specified in |
|
30 // the source g-code and may never actually be reached if acceleration management is active. |
|
31 typedef struct { |
|
32 // Fields used by the bresenham algorithm for tracing the line |
|
33 long steps_x, steps_y, steps_z, steps_e; // Step count along each axis |
|
34 unsigned long step_event_count; // The number of step events required to complete this block |
|
35 long accelerate_until; // The index of the step event on which to stop acceleration |
|
36 long decelerate_after; // The index of the step event on which to start decelerating |
|
37 long acceleration_rate; // The acceleration rate used for acceleration calculation |
|
38 unsigned char direction_bits; // The direction bit set for this block (refers to *_DIRECTION_BIT in config.h) |
|
39 unsigned char active_extruder; // Selects the active extruder |
|
40 #ifdef ADVANCE |
|
41 long advance_rate; |
|
42 volatile long initial_advance; |
|
43 volatile long final_advance; |
|
44 float advance; |
|
45 #endif |
|
46 |
|
47 // Fields used by the motion planner to manage acceleration |
|
48 // float speed_x, speed_y, speed_z, speed_e; // Nominal mm/sec for each axis |
|
49 float nominal_speed; // The nominal speed for this block in mm/sec |
|
50 float entry_speed; // Entry speed at previous-current junction in mm/sec |
|
51 float max_entry_speed; // Maximum allowable junction entry speed in mm/sec |
|
52 float millimeters; // The total travel of this block in mm |
|
53 float acceleration; // acceleration mm/sec^2 |
|
54 unsigned char recalculate_flag; // Planner flag to recalculate trapezoids on entry junction |
|
55 unsigned char nominal_length_flag; // Planner flag for nominal speed always reached |
|
56 |
|
57 // Settings for the trapezoid generator |
|
58 unsigned long nominal_rate; // The nominal step rate for this block in step_events/sec |
|
59 unsigned long initial_rate; // The jerk-adjusted step rate at start of block |
|
60 unsigned long final_rate; // The minimal rate at exit |
|
61 unsigned long acceleration_st; // acceleration steps/sec^2 |
|
62 unsigned long fan_speed; |
|
63 volatile char busy; |
|
64 } block_t; |
|
65 |
|
66 // Initialize the motion plan subsystem |
|
67 void plan_init(); |
|
68 |
|
69 // Add a new linear movement to the buffer. x, y and z is the signed, absolute target position in |
|
70 // millimaters. Feed rate specifies the speed of the motion. |
|
71 void plan_buffer_line(const float &x, const float &y, const float &z, const float &e, float feed_rate, const uint8_t &extruder); |
|
72 |
|
73 // Set position. Used for G92 instructions. |
|
74 void plan_set_position(const float &x, const float &y, const float &z, const float &e); |
|
75 void plan_set_e_position(const float &e); |
|
76 |
|
77 |
|
78 |
|
79 void check_axes_activity(); |
|
80 uint8_t movesplanned(); //return the nr of buffered moves |
|
81 |
|
82 extern unsigned long minsegmenttime; |
|
83 extern float max_feedrate[4]; // set the max speeds |
|
84 extern float axis_steps_per_unit[4]; |
|
85 extern unsigned long max_acceleration_units_per_sq_second[4]; // Use M201 to override by software |
|
86 extern float minimumfeedrate; |
|
87 extern float acceleration; // Normal acceleration mm/s^2 THIS IS THE DEFAULT ACCELERATION for all moves. M204 SXXXX |
|
88 extern float retract_acceleration; // mm/s^2 filament pull-pack and push-forward while standing still in the other axis M204 TXXXX |
|
89 extern float max_xy_jerk; //speed than can be stopped at once, if i understand correctly. |
|
90 extern float max_z_jerk; |
|
91 extern float max_e_jerk; |
|
92 extern float mintravelfeedrate; |
|
93 extern unsigned long axis_steps_per_sqr_second[NUM_AXIS]; |
|
94 |
|
95 #ifdef AUTOTEMP |
|
96 extern bool autotemp_enabled; |
|
97 extern float autotemp_max; |
|
98 extern float autotemp_min; |
|
99 extern float autotemp_factor; |
|
100 #endif |
|
101 |
|
102 |
|
103 |
|
104 |
|
105 extern block_t block_buffer[BLOCK_BUFFER_SIZE]; // A ring buffer for motion instfructions |
|
106 extern volatile unsigned char block_buffer_head; // Index of the next block to be pushed |
|
107 extern volatile unsigned char block_buffer_tail; |
|
108 // Called when the current block is no longer needed. Discards the block and makes the memory |
|
109 // availible for new blocks. |
|
110 FORCE_INLINE void plan_discard_current_block() |
|
111 { |
|
112 if (block_buffer_head != block_buffer_tail) { |
|
113 block_buffer_tail = (block_buffer_tail + 1) & (BLOCK_BUFFER_SIZE - 1); |
|
114 } |
|
115 } |
|
116 |
|
117 // Gets the current block. Returns NULL if buffer empty |
|
118 FORCE_INLINE block_t *plan_get_current_block() |
|
119 { |
|
120 if (block_buffer_head == block_buffer_tail) { |
|
121 return(NULL); |
|
122 } |
|
123 block_t *block = &block_buffer[block_buffer_tail]; |
|
124 block->busy = true; |
|
125 return(block); |
|
126 } |
|
127 |
|
128 // Gets the current block. Returns NULL if buffer empty |
|
129 FORCE_INLINE bool blocks_queued() |
|
130 { |
|
131 if (block_buffer_head == block_buffer_tail) { |
|
132 return false; |
|
133 } |
|
134 else |
|
135 return true; |
|
136 } |
|
137 |
|
138 void allow_cold_extrudes(bool allow); |
|
139 #endif |