-
Notifications
You must be signed in to change notification settings - Fork 3
/
Copy pathcommand.cpp
137 lines (119 loc) · 2.71 KB
/
command.cpp
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
127
128
129
130
131
132
133
134
135
136
137
#include "command.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");
}
void printStatus(String& s) {
Serial.print("ok ");
Serial.println(s);
}
void printStatus(char* c) {
Serial.print("ok ");
Serial.println(c);
}