forked from migarma/turbo-grua
-
Notifications
You must be signed in to change notification settings - Fork 2
Expand file tree
/
Copy pathcommand.cpp
More file actions
126 lines (113 loc) · 2.6 KB
/
command.cpp
File metadata and controls
126 lines (113 loc) · 2.6 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
#include "command.h"
#include "ArduinoJson.h"
#include <i2c_t3.h>
Command::Command() {
//initialize Command to a zero-move value;
command.valueX = NAN;
command.valueY = NAN;
command.valueZ = NAN;
command.valueF = 0;
command.valueE = 0;
command.valueT = 0;
message = "";
}
bool Command::handleGcode() {
if (Serial.available()) {
char c = Serial.read();
if (c == '\n') {
return false;
}
if (c == '\r') {
bool b = processMessage(message);
message = "";
return b;
} else {
message += c;
}
}
return false;
}
bool Command::processMessage(String& msg) {
msg += ' '; //helps parsing
command.id = msg[0];
//exit if not GCode
if ((command.id != 'G') && (command.id != 'M')) {
printErr();
return false;
}
//parse number
int first = 1;
int last = pos(msg, ' ', 1);
if (last < 0) {
printErr();
return false;
}
String s = msg.substring(first, last);
command.num = s.toInt();
// Serial.println(cmd.num);
//parse up to 5 Values
command.valueX = NAN;
command.valueY = NAN;
command.valueZ = NAN;
command.valueE = NAN;
command.valueF = 0;
command.valueT = 0;
int parsePosition = last + 1;
int i = 0;
while (i < 5) {
char id = msg[parsePosition++];
if (id != ' ') { //test if a command here
int first = parsePosition;
int last = pos(msg, ' ', parsePosition);
if (last < first) { //test if String is valid
i = 5; //exit;
} else {
String floatString = msg.substring(first, last); //should contain a Numeric value
float value = floatString.toFloat();
switch (id) {
case 'X': command.valueX = value; break;
case 'Y': command.valueY = value; break;
case 'Z': command.valueZ = value; break;
case 'E': command.valueZ = value; break;
case 'F': command.valueF = value; break;
case 'T': command.valueT = value; break;
default: i = 5;
}
parsePosition = last + 1;
}
} else {
i = 5; //exit;
}
i++;
}
return true;
}
Cmd Command::getCmd() const {
return command;
}
int Command::pos(String& s, char c, int start) {
int len = s.length();
for (int i = start; i < len; i++) {
if (c == s[i]) {
return i;
}
}
return -1;
}
void printErr() {
Serial.println("rs"); //'resend'
}
void printFault() {
Serial.println("!!");
}
void printComment(char* c) {
Serial.print("// ");
Serial.println(c);
}
void printComment(String& s) {
Serial.print("// ");
Serial.println(s);
}
void printOk() {
Serial.println("ok");
}