2023-04-27 14:31:06 +03:00
|
|
|
#include <gtest/gtest.h>
|
|
|
|
|
|
2023-04-28 14:50:58 +03:00
|
|
|
#include "grbl.h"
|
2023-04-28 18:42:18 +03:00
|
|
|
#include "grbl_machine.h"
|
2023-05-16 09:18:06 +03:00
|
|
|
#include "gcode_parser.h"
|
|
|
|
|
#include "glm/gtx/string_cast.hpp"
|
2023-04-28 14:50:58 +03:00
|
|
|
|
2023-04-27 14:31:06 +03:00
|
|
|
TEST(grbl_program, default_state) {
|
|
|
|
|
grbl::program pgm;
|
|
|
|
|
|
|
|
|
|
EXPECT_EQ("", pgm.filename);
|
|
|
|
|
EXPECT_EQ(0, pgm.number_of_instructions());
|
|
|
|
|
EXPECT_EQ(false, pgm.is_loaded);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
TEST(grbl_program, load_from_string) {
|
|
|
|
|
grbl::program pgm;
|
|
|
|
|
|
|
|
|
|
std::string content = R"(( pcb2gcode 1.2.2 )
|
|
|
|
|
( Software-independent Gcode )
|
|
|
|
|
|
|
|
|
|
G94 ( Millimeters per minute feed rate. )
|
|
|
|
|
G21 ( Units == Millimeters. )
|
2023-05-05 11:18:30 +03:00
|
|
|
F600.00000 ; another type of comment
|
2023-04-27 14:31:06 +03:00
|
|
|
X3.87739 Y78.52820
|
|
|
|
|
)";
|
|
|
|
|
pgm.load_from_string(content);
|
|
|
|
|
|
|
|
|
|
EXPECT_EQ("", pgm.filename);
|
|
|
|
|
EXPECT_EQ(6, pgm.number_of_instructions());
|
|
|
|
|
EXPECT_EQ(true, pgm.is_loaded);
|
2023-04-28 14:50:58 +03:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
TEST(grbl_status_report, parse) {
|
|
|
|
|
auto content = "<Idle|MPos:0.000,1.000,2.000|Bf:35,1022|FS:0,0|Pn:Z|Ov:100,100,100>";
|
|
|
|
|
grbl::realtime_status_report r;
|
|
|
|
|
grbl::parse_status_report(content, r);
|
|
|
|
|
|
|
|
|
|
EXPECT_EQ(grbl::machine_status::idle, r.status);
|
|
|
|
|
EXPECT_EQ("", r.sub_status);
|
|
|
|
|
|
|
|
|
|
EXPECT_EQ(0, r.machine_pos[0]);
|
|
|
|
|
EXPECT_EQ(1, r.machine_pos[1]);
|
|
|
|
|
EXPECT_EQ(2, r.machine_pos[2]);
|
|
|
|
|
|
|
|
|
|
EXPECT_EQ(35, r.buffers_free);
|
|
|
|
|
|
|
|
|
|
//
|
2023-05-06 00:19:57 +03:00
|
|
|
grbl::parse_status_report("<Home|MPos:0.000,0.000,0.000|Bf:35,1022|FS:0,0|Pn:PZ|Ov:100,100,100>", r);
|
2023-04-28 14:50:58 +03:00
|
|
|
EXPECT_EQ(grbl::machine_status::home, r.status);
|
|
|
|
|
EXPECT_EQ(1022, r.rx_chars_free);
|
2023-05-06 00:19:57 +03:00
|
|
|
|
|
|
|
|
EXPECT_EQ(true, r.signals.bit.probe);
|
|
|
|
|
|
|
|
|
|
EXPECT_EQ(false, r.signals.bit.x_limit);
|
|
|
|
|
EXPECT_EQ(false, r.signals.bit.y_limit);
|
|
|
|
|
EXPECT_EQ(true, r.signals.bit.z_limit);
|
2023-05-16 09:18:06 +03:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
TEST(grbl_parser, parse) {
|
|
|
|
|
std::string content = R"(G17 G21 G90 G94 G54
|
|
|
|
|
G0 Z0.25
|
|
|
|
|
X-0.5 Y0.
|
|
|
|
|
Z0.1
|
|
|
|
|
G01 Z0. F5.
|
|
|
|
|
G02 X0. Y0.5 I0.5 J0. F2.5
|
|
|
|
|
X0.5 Y0. I0. J-0.5
|
|
|
|
|
X0. Y-0.5 I-0.5 J0.
|
|
|
|
|
X-0.5 Y0. I0. J0.5
|
|
|
|
|
G01 Z0.1 F5.
|
|
|
|
|
G00 X0. Y0. Z0.25
|
|
|
|
|
)";
|
|
|
|
|
std::stringstream ss;
|
|
|
|
|
ss << content;
|
|
|
|
|
|
|
|
|
|
grbl::grbl_parser parser;
|
|
|
|
|
try {
|
|
|
|
|
parser.parse(ss);
|
|
|
|
|
} catch (std::exception &e) {
|
|
|
|
|
std::cerr << e.what();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
for (auto &c: parser.commands) {
|
2023-05-18 07:24:05 +03:00
|
|
|
auto line = dynamic_cast<grbl::line_motion_cmd *>(c);
|
2023-05-16 09:18:06 +03:00
|
|
|
if (line != nullptr) {
|
|
|
|
|
std::cout << "Line from " << glm::to_string(line->start) << " to " << glm::to_string(line->end)
|
|
|
|
|
<< std::endl;
|
|
|
|
|
continue;
|
|
|
|
|
}
|
|
|
|
|
|
2023-05-18 07:24:05 +03:00
|
|
|
auto arc = dynamic_cast<grbl::arc_motion_cmd *>(c);
|
2023-05-16 09:18:06 +03:00
|
|
|
if (arc != nullptr) {
|
|
|
|
|
std::cout << "Arc from " << glm::to_string(arc->start) << " to " << glm::to_string(arc->end) << std::endl;
|
|
|
|
|
continue;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// EXPECT_EQ(true, false);
|
|
|
|
|
}
|