1#[cfg(test)]
4mod tests {
5 use super::*;
6
7 #[test]
8 fn it_works() {
9 assert_eq!(2 + 2, 4);
10 }
11
12 #[test]
13 fn test_move_xy() {
14 let p = Point2d { x: 10.0, y: 5.0 };
15 let gcode = move_xy(p, false, None, None);
16 assert_eq!("G0 X10 Y5", gcode);
17 }
18
19 #[test]
20 fn test_arc_ij() {
21 let p = Point2d { x: 125.0, y: 0.0 };
22 let gcode = move_xy_arc_ij(Some(p), Some(62.5), None, None, false);
23 assert_eq!("G2 X125 Y0 I62.5", gcode);
24 }
25
26 #[test]
27 fn test_set_pos_2d() {
28 let p = Point2d { x: 125.0, y: 125.0 };
29 let gcode = set_pos_2d(p, None);
30 assert_eq!("G92 X125 Y125", gcode);
31 }
32
33 #[test]
34 fn test_set_pos_2d_with_e() {
35 let p = Point2d { x: 125.0, y: 125.0 };
36 let gcode = set_pos_2d(p, Some(90));
37 assert_eq!("G92 X125 Y125 E90", gcode);
38 }
39
40 #[test]
41 fn test_set_pos_3d() {
42 let p = Point3d { x: 125.0, y: 125.0, z: 25.0};
43 let gcode = set_pos_3d(p, None);
44 assert_eq!("G92 X125 Y125 Z25", gcode);
45 }
46
47 #[test]
48 fn test_set_pos_3d_with_e() {
49 let p = Point3d { x: 125.0, y: 125.0, z: 25.0 };
50 let gcode = set_pos_3d(p, Some(90));
51 assert_eq!("G92 X125 Y125 Z25 E90", gcode);
52 }
53}
54
55
56#[derive(Debug, Copy, Clone)]
70pub struct Point2d {
71 pub x: f32,
72 pub y: f32,
73}
74
75#[derive(Debug, Copy, Clone)]
93pub struct Point3d {
94 pub x: f32,
95 pub y: f32,
96 pub z: f32,
97}
98
99pub fn move_xy(dest:Point2d, extrude: bool, feed_rate: Option<u32>, flow_rate: Option<f32>) -> String {
123 let f_str: String;
124 let e_str: String;
125 if let Some(maybe_feed_rate) = feed_rate {
126 f_str = format!(" F{}", maybe_feed_rate);
127 } else {
128 f_str = format!("");
129 }
130
131 if extrude {
132 if let Some(maybe_flow_rate) = flow_rate {
133 e_str = format!(" E{}", maybe_flow_rate);
134 } else {
135 e_str = format!("");
136 }
137 return format!("G1 X{x} Y{y}{e}{f}\n", x=dest.x, y=dest.y, e=e_str, f=f_str)
138 } else {
139 return format!("G0 X{x} Y{y}{f}\n", x=dest.x, y=dest.y, f=f_str)
140 }
141
142}
143
144pub fn move_xyz(dest:Point3d, extrude: bool, feed_rate: Option<u32>, flow_rate: Option<f32>) -> String {
145 let f_str: String;
146 let e_str: String;
147 if let Some(maybe_feed_rate) = feed_rate {
148 f_str = format!(" F{}", maybe_feed_rate);
149 } else {
150 f_str = format!("");
151 }
152
153 if extrude {
154 if let Some(maybe_flow_rate) = flow_rate {
155 e_str = format!(" E{}", maybe_flow_rate);
156 } else {
157 e_str = format!("");
158 }
159 return format!("G1 X{x} Y{y} Z{z}{e}{f}\n", x=dest.x, y=dest.y, z=dest.z, e=e_str, f=f_str)
160 } else {
161 return format!("G0 X{x} Y{y} Z{z}{f}\n", x=dest.x, y=dest.y, z=dest.z, f=f_str)
162 }
163
164}
165
166pub fn move_z(z: f32) -> String {
167 return format!("G0 Z{}", z)
168}
169
170pub fn move_xy_arc_ij(dest: Option<Point2d>, x_offset: Option<f32>, y_offset: Option<f32>, flow_rate: Option<f32>, ccw: bool) -> String {
183 let x_str: String;
184 let y_str: String;
185 let i_str: String;
186 let j_str: String;
187 let e_str: String;
188 if let Some(maybe_dest) = dest {
189 x_str = format!(" X{}", maybe_dest.x);
190 y_str = format!(" Y{}", maybe_dest.y);
191 } else {
192 x_str = format!("");
193 y_str = format!("");
194 }
195 if let Some(maybe_x_offset) = x_offset {
196 i_str = format!(" I{}", maybe_x_offset);
197 } else {
198 i_str = format!("");
199 }
200 if let Some(maybe_y_offset) = y_offset {
201 j_str = format!(" J{}", maybe_y_offset);
202 } else {
203 j_str = format!("");
204 }
205 if let Some(maybe_flow_rate) = flow_rate {
206 e_str = format!(" E{}", maybe_flow_rate);
207 } else {
208 e_str = format!("");
209 }
210 if ccw {
211 return format!("G3{x}{y}{i}{j}{e}\n", i=i_str, j=j_str, x=x_str, y=y_str, e=e_str);
212 } else {
213 return format!("G2{x}{y}{i}{j}{e}\n", i=i_str, j=j_str, x=x_str, y=y_str, e=e_str);
214 }
215}
216
217pub fn use_millimeters() -> String {
221 return format!("G21 ; set units to millimeters\n")
222}
223
224pub fn use_inches() -> String {
228 return format!("G20 ; set units to inches\n")
229}
230
231pub fn absolute_positioning() -> String {
235 return format!("G90 ; Set all axes to absolute\n")
236}
237
238pub fn relative_positioning() -> String {
242 return format!("G91 ; Set all axes to relative\n")
243}
244
245pub fn set_pos_2d(pos: Point2d, extrude_pos: Option<f32>) -> String {
257 let e_str: String;
258 if let Some(maybe_extrude_pos) = extrude_pos {
259 e_str = format!(" E{}", maybe_extrude_pos);
260 } else {
261 e_str = format!("");
262 }
263 return format!("G92 X{x} Y{y}{e}\n", x=pos.x, y=pos.y, e=e_str)
264}
265
266pub fn set_pos_3d(pos: Point3d, extrude_pos: Option<f32>) -> String {
278 let e_str: String;
279 if let Some(maybe_extrude_pos) = extrude_pos {
280 e_str = format!(" E{}", maybe_extrude_pos);
281 } else {
282 e_str = format!("");
283 }
284 return format!("G92 X{x} Y{y} Z{z}{e}\n", x=pos.x, y=pos.y, z=pos.z, e=e_str)
285}
286
287pub fn reset_extruder(extrude_pos: f32) -> String {
288 return format!("G92 E{}\n", extrude_pos)
289}
290
291pub fn reset_pos() -> String {
293 return format!("G92.1\n")
294}
295
296pub fn set_hotend_temp(temp: u16, hotend: Option<u8>) -> String {
297 let t_str: String;
298 if let Some(maybe_hotend) = hotend {
299 t_str = format!(" T{}", maybe_hotend);
300 } else {
301 t_str = format!("");
302 }
303 return format!("M104 S{s}{t}\n", s=temp, t=t_str)
304}
305
306pub fn wait_hotend_temp(temp: u16, hotend: Option<u8>) -> String {
307 let t_str: String;
308 if let Some(maybe_hotend) = hotend {
309 t_str = format!(" T{}", maybe_hotend);
310 } else {
311 t_str = format!("");
312 }
313 return format!("M109 S{s}{t}\n", s=temp, t=t_str)
314}
315
316pub fn set_fan_speed(speed: u8, fan: Option<u8>) -> String {
317 let p_str: String;
318 if let Some(maybe_fan) = fan {
319 p_str = format!(" P{}", maybe_fan);
320 } else {
321 p_str = format!("");
322 }
323 return format!("M106 S{s}{p}\n", s=speed, p=p_str)
324}
325
326pub fn fan_off(fan: Option<u8>) -> String {
327 let p_str: String;
328 if let Some(maybe_fan) = fan {
329 p_str = format!(" P{}", maybe_fan);
330 } else {
331 p_str = format!("");
332 }
333 return format!("M107{p}\n", p=p_str)
334}
335
336pub fn set_bed_temp(temp: u8) -> String {
337 return format!("M140 S{}\n", temp)
338}
339
340pub fn wait_bed_temp(temp: u8) -> String {
341 return format!("M190 S{}\n", temp)
342}
343
344pub fn set_chamber_temp(temp: u8) -> String {
345 return format!("M141 S{}\n", temp)
346}
347
348pub fn wait_chamber_temp(temp: u8) -> String {
349 return format!("M191 S{}\n", temp)
350}
351
352pub fn auto_home() -> String {
353 return format!("G28\n")
354}
355
356pub fn absolute_extrution() -> String {
357 return format!("M82")
358}
359
360pub fn relative_extrution() -> String {
361 return format!("M83")
362}