Skip to content

Commit 2a9ae02

Browse files
committed
Added beginEnd, NoWords(), exposed...
1 parent 3cf8e66 commit 2a9ae02

5 files changed

Lines changed: 347 additions & 16 deletions

File tree

GCodeParserVs/GCodeParserUnitTests/GCodeParserUnitTests.cpp

Lines changed: 291 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -18,13 +18,17 @@ namespace GCodeParserUnitTests
1818
// ...Blank Line...
1919
// M300 S125
2020
// (Comment Here)
21+
// ...Garbage no words... ;Comment
22+
// %
2123
char lines[] = { 'G', '0', '1' , '\t', '(', 'C', 'o', 'm', 'm', 'e', 'n', 't', ' ', 'H', 'e', 'r', 'e', ')', 'Z' , '0' , '.' , '0' , '\r', '\n',
2224
'M', '3', '0', '0', ' ', 'S', '1', '2', '5', ' ', ';', 'C', 'o', 'm', 'm', 'e', 't', ' ', 't', 'o', ' ', 'e', 'n', 'd', ' ', 'o', 'f', ' ', 'l', 'i', 'n', 'e', '.','\r', '\n',
2325
'G', '0', '1',' ','X','3','.','2',' ','Y','1','.','5',' ', '(', 'C', 'o', 'm', 'm', 'e', 'n', 't', ')', ' ', 'H', 'e', 'r', 'e', ')', ' ', 'Z', '5', '.', '0', '\r', '\n',
2426
'/', 'G', '2', '1', ' ', '(', 'B', 'l', 'o', 'c', 'k', ' ', ';', 'D', 'e', 'l', 'e', 't', 'e', ')', ' ', 'G', '9', '0', ' ', ';', 'M', 'S', 'G', ',', '1', '2', '3', '(', '?', ')', '\n',
2527
'\n',
2628
'M', '3', '0', '0', ' ', 'S', '1', '2', '5', '\n',
27-
'(', 'C', 'o', 'm', 'm', 'e', 'n', 't', ' ', 'H', 'e', 'r', 'e', ')', '\0'
29+
'(', 'C', 'o', 'm', 'm', 'e', 'n', 't', ' ', 'H', 'e', 'r', 'e', ')', '\n',
30+
's', '3', '7', '3', '%', '^', '@', '/', ';', 'C', 'o', 'm', 'm', 'e', 'n', 't', '\n',
31+
'%', '\0'
2832
};
2933

3034
bool completeLineIsAvailableToInterpret;
@@ -120,6 +124,26 @@ namespace GCodeParserUnitTests
120124
pointer++;
121125
Assert::AreEqual(GCode.line[pointer], resultLine5[pointer]);
122126
} while (GCode.line[pointer] != '\0');
127+
128+
startAt = AddLine(&GCode, startAt);
129+
130+
char resultLine9[] = { 's', '3', '7', '3', '%', '^', '@', '/', ';', 'C', 'o', 'm', 'm', 'e', 'n', 't', '\0' };
131+
132+
pointer = -1;
133+
do {
134+
pointer++;
135+
Assert::AreEqual(GCode.line[pointer], resultLine9[pointer]);
136+
} while (GCode.line[pointer] != '\0');
137+
138+
startAt = AddLine(&GCode, startAt);
139+
140+
char resultLine8[] = { '%', '\0' };
141+
142+
pointer = -1;
143+
do {
144+
pointer++;
145+
Assert::AreEqual(GCode.line[pointer], resultLine8[pointer]);
146+
} while (GCode.line[pointer] != '\0');
123147
}
124148

125149
TEST_METHOD(ParseLine_ConfirmCodeBlock)
@@ -210,6 +234,30 @@ namespace GCodeParserUnitTests
210234
pointer++;
211235
Assert::AreEqual(GCode.line[pointer], resultCode7[pointer]);
212236
} while (GCode.line[pointer] != '\0');
237+
238+
startAt = AddLine(&GCode, startAt);
239+
240+
GCode.ParseLine();
241+
242+
char resultCode9[] = { 's', '3', '7', '3', '%', '^', '@', '/', '\0' };
243+
244+
pointer = -1;
245+
do {
246+
pointer++;
247+
Assert::AreEqual(GCode.line[pointer], resultCode9[pointer]);
248+
} while (GCode.line[pointer] != '\0');
249+
250+
startAt = AddLine(&GCode, startAt);
251+
252+
GCode.ParseLine();
253+
254+
char resultCode8[] = { '%', '\0' };
255+
256+
pointer = -1;
257+
do {
258+
pointer++;
259+
Assert::AreEqual(GCode.line[pointer], resultCode8[pointer]);
260+
} while (GCode.line[pointer] != '\0');
213261
}
214262

215263
TEST_METHOD(ParseLine_ConfirmComments)
@@ -301,6 +349,30 @@ namespace GCodeParserUnitTests
301349
pointer++;
302350
Assert::AreEqual(GCode.comments[pointer], resultComments5[pointer]);
303351
} while (GCode.comments[pointer] != '\0');
352+
353+
startAt = AddLine(&GCode, startAt);
354+
355+
GCode.ParseLine();
356+
357+
char resultComments9[] = { ';', 'C', 'o', 'm', 'm', 'e', 'n', 't', '\0' };
358+
359+
pointer = -1;
360+
do {
361+
pointer++;
362+
Assert::AreEqual(GCode.comments[pointer], resultComments9[pointer]);
363+
} while (GCode.comments[pointer] != '\0');
364+
365+
startAt = AddLine(&GCode, startAt);
366+
367+
GCode.ParseLine();
368+
369+
char resultComments8[] = { '\0' };
370+
371+
pointer = -1;
372+
do {
373+
pointer++;
374+
Assert::AreEqual(GCode.comments[pointer], resultComments8[pointer]);
375+
} while (GCode.comments[pointer] != '\0');
304376
}
305377

306378
TEST_METHOD(ParseLine_ConfirmLastComment)
@@ -391,6 +463,30 @@ namespace GCodeParserUnitTests
391463
pointer++;
392464
Assert::AreEqual(GCode.lastComment[pointer], resultLastComment5[pointer]);
393465
} while (GCode.lastComment[pointer] != '\0');
466+
467+
startAt = AddLine(&GCode, startAt);
468+
469+
GCode.ParseLine();
470+
471+
char resultLastComment9[] = { ';', 'C', 'o', 'm', 'm', 'e', 'n', 't', '\0' };
472+
473+
pointer = -1;
474+
do {
475+
pointer++;
476+
Assert::AreEqual(GCode.lastComment[pointer], resultLastComment9[pointer]);
477+
} while (GCode.lastComment[pointer] != '\0');
478+
479+
startAt = AddLine(&GCode, startAt);
480+
481+
GCode.ParseLine();
482+
483+
char resultLastComment8[] = { '\0' };
484+
485+
pointer = -1;
486+
do {
487+
pointer++;
488+
Assert::AreEqual(GCode.lastComment[pointer], resultLastComment8[pointer]);
489+
} while (GCode.lastComment[pointer] != '\0');
394490
}
395491

396492
TEST_METHOD(ParseLine_ConfirmBlockDelete)
@@ -415,11 +511,152 @@ namespace GCodeParserUnitTests
415511

416512
Assert::AreEqual(GCode.blockDelete, false);
417513

418-
AddLine(&GCode, startAt);
514+
startAt = AddLine(&GCode, startAt);
419515

420516
GCode.ParseLine();
421517

422518
Assert::AreEqual(GCode.blockDelete, true);
519+
520+
startAt = AddLine(&GCode, startAt);
521+
522+
GCode.ParseLine();
523+
524+
Assert::AreEqual(GCode.blockDelete, false);
525+
526+
startAt = AddLine(&GCode, startAt);
527+
528+
GCode.ParseLine();
529+
530+
Assert::AreEqual(GCode.blockDelete, false);
531+
532+
startAt = AddLine(&GCode, startAt);
533+
534+
GCode.ParseLine();
535+
536+
Assert::AreEqual(GCode.blockDelete, false);
537+
startAt = AddLine(&GCode, startAt);
538+
539+
GCode.ParseLine();
540+
541+
Assert::AreEqual(GCode.blockDelete, false);
542+
}
543+
544+
TEST_METHOD(ParseLine_ConfirmBeginEnd)
545+
{
546+
GCodeParser GCode = GCodeParser();
547+
548+
int startAt = AddLine(&GCode, 0);
549+
550+
GCode.ParseLine();
551+
552+
Assert::AreEqual(GCode.beginEnd, false);
553+
554+
startAt = AddLine(&GCode, startAt);
555+
556+
GCode.ParseLine();
557+
558+
Assert::AreEqual(GCode.beginEnd, false);
559+
560+
startAt = AddLine(&GCode, startAt);
561+
562+
GCode.ParseLine();
563+
564+
Assert::AreEqual(GCode.beginEnd, false);
565+
566+
startAt = AddLine(&GCode, startAt);
567+
568+
GCode.ParseLine();
569+
570+
Assert::AreEqual(GCode.beginEnd, false);
571+
572+
startAt = AddLine(&GCode, startAt);
573+
574+
GCode.ParseLine();
575+
576+
Assert::AreEqual(GCode.beginEnd, false);
577+
578+
startAt = AddLine(&GCode, startAt);
579+
580+
GCode.ParseLine();
581+
582+
Assert::AreEqual(GCode.beginEnd, false);
583+
584+
startAt = AddLine(&GCode, startAt);
585+
586+
GCode.ParseLine();
587+
588+
Assert::AreEqual(GCode.beginEnd, false);
589+
590+
startAt = AddLine(&GCode, startAt);
591+
592+
GCode.ParseLine();
593+
594+
Assert::AreEqual(GCode.beginEnd, false);
595+
596+
startAt = AddLine(&GCode, startAt);
597+
598+
GCode.ParseLine();
599+
600+
Assert::AreEqual(GCode.beginEnd, true);
601+
}
602+
603+
TEST_METHOD(ParseLine_ConfirmNoWords)
604+
{
605+
GCodeParser GCode = GCodeParser();
606+
607+
int startAt = AddLine(&GCode, 0);
608+
609+
GCode.ParseLine();
610+
611+
Assert::AreEqual(GCode.NoWords(), false);
612+
613+
startAt = AddLine(&GCode, startAt);
614+
615+
GCode.ParseLine();
616+
617+
Assert::AreEqual(GCode.NoWords(), false);
618+
619+
startAt = AddLine(&GCode, startAt);
620+
621+
GCode.ParseLine();
622+
623+
Assert::AreEqual(GCode.NoWords(), false);
624+
625+
startAt = AddLine(&GCode, startAt);
626+
627+
GCode.ParseLine();
628+
629+
Assert::AreEqual(GCode.NoWords(), true);
630+
631+
startAt = AddLine(&GCode, startAt);
632+
633+
GCode.ParseLine();
634+
635+
Assert::AreEqual(GCode.NoWords(), true);
636+
637+
startAt = AddLine(&GCode, startAt);
638+
639+
GCode.ParseLine();
640+
641+
Assert::AreEqual(GCode.NoWords(), false);
642+
643+
startAt = AddLine(&GCode, startAt);
644+
645+
GCode.ParseLine();
646+
647+
Assert::AreEqual(GCode.NoWords(), true);
648+
649+
startAt = AddLine(&GCode, startAt);
650+
651+
GCode.ParseLine();
652+
653+
Assert::AreEqual(GCode.NoWords(), true);
654+
655+
startAt = AddLine(&GCode, startAt);
656+
657+
GCode.ParseLine();
658+
659+
Assert::AreEqual(GCode.NoWords(), true);
423660
}
424661

425662
TEST_METHOD(RemoveCommentSeparators_ConfirmComments)
@@ -518,6 +755,32 @@ namespace GCodeParserUnitTests
518755
pointer++;
519756
Assert::AreEqual(GCode.comments[pointer], resultComments5[pointer]);
520757
} while (GCode.comments[pointer] != '\0');
758+
759+
startAt = AddLine(&GCode, startAt);
760+
761+
GCode.ParseLine();
762+
GCode.RemoveCommentSeparators();
763+
764+
char resultComments9[] = { 'C', 'o', 'm', 'm', 'e', 'n', 't','\0' };
765+
766+
pointer = -1;
767+
do {
768+
pointer++;
769+
Assert::AreEqual(GCode.comments[pointer], resultComments9[pointer]);
770+
} while (GCode.comments[pointer] != '\0');
771+
772+
startAt = AddLine(&GCode, startAt);
773+
774+
GCode.ParseLine();
775+
GCode.RemoveCommentSeparators();
776+
777+
char resultComments8[] = { '\0' };
778+
779+
pointer = -1;
780+
do {
781+
pointer++;
782+
Assert::AreEqual(GCode.comments[pointer], resultComments8[pointer]);
783+
} while (GCode.comments[pointer] != '\0');
521784
}
522785

523786
TEST_METHOD(RemoveCommentSeparators_ConfirmLastComments)
@@ -615,6 +878,32 @@ namespace GCodeParserUnitTests
615878
pointer++;
616879
Assert::AreEqual(GCode.lastComment[pointer], resultLastComment5[pointer]);
617880
} while (GCode.lastComment[pointer] != '\0');
881+
882+
startAt = AddLine(&GCode, startAt);
883+
884+
GCode.ParseLine();
885+
GCode.RemoveCommentSeparators();
886+
887+
char resultLastComment9[] = { 'C', 'o', 'm', 'm', 'e', 'n', 't', '\0' };
888+
889+
pointer = -1;
890+
do {
891+
pointer++;
892+
Assert::AreEqual(GCode.lastComment[pointer], resultLastComment9[pointer]);
893+
} while (GCode.lastComment[pointer] != '\0');
894+
895+
startAt = AddLine(&GCode, startAt);
896+
897+
GCode.ParseLine();
898+
GCode.RemoveCommentSeparators();
899+
900+
char resultLastComment8[] = { '\0' };
901+
902+
pointer = -1;
903+
do {
904+
pointer++;
905+
Assert::AreEqual(GCode.lastComment[pointer], resultLastComment8[pointer]);
906+
} while (GCode.lastComment[pointer] != '\0');
618907
}
619908

620909
TEST_METHOD(IsWord_ValidWord_ReturnsTrue)

README.md

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -37,13 +37,18 @@ Once the line is parsed you can use the HasWord method to determine if a G-Code
3737
A working example of the parser can be found the following GitHub repository.
3838
https://github.com/tgolla/SphereBot
3939

40+
### `beginEnd`
41+
The beginEnd attribute is a Boolean which returns true if the first character of the line it the percent character (%) which is used to denote the first and last line of the program.
4042

4143
### `blockDelete`
4244
The blockDelete attribute is a Boolean which returns true when the line begins with a slash '/'.
4345

4446
### `comments`
4547
The comments attribute points to the comment(s) separated from the G-Code command line after executing the ParseLine method. Initially comment(s) contain the comment separators (parenthesis or semicolon). Executing the RemoveCommentSeparators method will remove the comment separators from all of the comments.
4648

49+
### `completeLineIsAvailableToParse`
50+
The completeLineIsAvailableToParse attribute is a Boolean which returns true when there is a line available to parse. The value of the attribute is also returned by `AddCharToLine(char c)`.
51+
4752
### `lastComment`
4853
The lastComment attribute points to the last comment on the command line. This is important as the last command will always be interpreted for active comment syntax.
4954

@@ -65,6 +70,9 @@ The HasWord method returns a Boolean true if the word (letter followed by value)
6570
### `IsWord(char letter)`
6671
The IsWord method returns a Boolean true if the character provided represents a valid G-Code word.
6772

73+
### `NoWords()`
74+
The NoWords method returns a Boolean the if the line is blank and/or has no G-Code words.
75+
6876
### `ParseLine()`
6977
The ParseLine method parses the command line removing whitespace and comments. The method should be used after the AddCharToLine method returns true.
7078

library.properties

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
name=GCodeParser
2-
version=1.1.0
2+
version=1.2.0
33
author=Terence F. Golla tfg@terencegolla.com
44
maintainer=Terence F. Golla tfg@terencegolla.com
55
sentence=The GCodeParser library is a lightweight G-Code parser for the Arduino using only a single character buffer to first collect a line of code (also called a 'block') from a serial or file input and then parse that line into a code block and comments.

0 commit comments

Comments
 (0)