31 #include <gtest/gtest.h> 32 #include <condition_variable> 43 using input_types = std::variant<uint8_t, bool, uint32_t, int32_t, double>;
50 std::placeholders::_2, std::placeholders::_3));
70 std::lock_guard<std::mutex> lk(message_mutex_);
71 uint8_t* buf =
reinterpret_cast<uint8_t*
>(buffer);
75 uint8_t type, recipe_id;
80 message_cv_.notify_one();
81 message_callback_ =
true;
86 std::unique_lock<std::mutex> lk(message_mutex_);
87 if (message_cv_.wait_for(lk, std::chrono::milliseconds(milliseconds)) == std::cv_status::no_timeout ||
88 message_callback_ ==
true)
90 message_callback_ =
false;
102 if (parsed_data_.find(name) != parsed_data_.end())
106 std::cout <<
"Failed to find data field " << name <<
" this should not happen! Have a look at the test case" 111 std::vector<std::string> input_recipe_ = {
113 "speed_slider_fraction",
114 "standard_digital_output_mask",
115 "standard_digital_output",
116 "configurable_digital_output_mask",
117 "configurable_digital_output",
118 "tool_digital_output_mask",
119 "tool_digital_output",
120 "standard_analog_output_mask",
121 "standard_analog_output_type",
122 "standard_analog_output_0",
123 "standard_analog_output_1",
124 "input_bit_register_65",
125 "input_int_register_25",
126 "input_double_register_25",
128 std::unique_ptr<rtde_interface::RTDEWriter>
writer_;
130 std::unique_ptr<comm::URStream<rtde_interface::RTDEPackage>>
stream_;
136 for (
auto& item : input_recipe_)
138 if (input_map_types_.find(item) != input_map_types_.end())
141 std::visit([&bp](
auto&& arg) { bp.
parse(arg); }, entry);
142 parsed_data_[item] = entry;
149 bool message_callback_ =
false;
151 std::unordered_map<std::string, input_types> input_map_types_ = {
152 {
"speed_slider_mask", uint32_t() },
153 {
"speed_slider_fraction", double() },
154 {
"standard_digital_output_mask", uint8_t() },
155 {
"standard_digital_output", uint8_t() },
156 {
"configurable_digital_output_mask", uint8_t() },
157 {
"configurable_digital_output", uint8_t() },
158 {
"tool_digital_output_mask", uint8_t() },
159 {
"tool_digital_output", uint8_t() },
160 {
"standard_analog_output_mask", uint8_t() },
161 {
"standard_analog_output_type", uint8_t() },
162 {
"standard_analog_output_0", double() },
163 {
"standard_analog_output_1", double() },
164 {
"input_bit_register_65", bool() },
165 {
"input_int_register_25", int32_t() },
166 {
"input_double_register_25", double() },
173 uint32_t expected_speed_slider_mask = 1;
174 double send_speed_slider_fraction = 0.5;
176 EXPECT_TRUE(writer_->sendSpeedSlider(send_speed_slider_fraction));
178 waitForMessageCallback(1000);
180 ASSERT_TRUE(dataFieldExist(
"speed_slider_fraction"));
181 ASSERT_TRUE(dataFieldExist(
"speed_slider_mask"));
183 double received_speed_slider_fraction = std::get<double>(parsed_data_[
"speed_slider_fraction"]);
184 uint32_t received_speed_slider_mask = std::get<uint32_t>(parsed_data_[
"speed_slider_mask"]);
186 EXPECT_EQ(send_speed_slider_fraction, received_speed_slider_fraction);
187 EXPECT_EQ(expected_speed_slider_mask, received_speed_slider_mask);
190 EXPECT_FALSE(writer_->sendSpeedSlider(-1));
191 EXPECT_FALSE(writer_->sendSpeedSlider(2));
196 uint8_t expected_standard_digital_output_mask = 4;
198 bool send_pin_value =
true;
199 EXPECT_TRUE(writer_->sendStandardDigitalOutput(pin, send_pin_value));
201 waitForMessageCallback(1000);
203 ASSERT_TRUE(dataFieldExist(
"standard_digital_output"));
204 ASSERT_TRUE(dataFieldExist(
"standard_digital_output_mask"));
206 bool received_pin_value = std::get<uint8_t>(parsed_data_[
"standard_digital_output"]) != 0;
207 uint8_t received_standard_digital_output_mask = std::get<uint8_t>(parsed_data_[
"standard_digital_output_mask"]);
209 EXPECT_EQ(send_pin_value, received_pin_value);
210 EXPECT_EQ(expected_standard_digital_output_mask, received_standard_digital_output_mask);
214 EXPECT_FALSE(writer_->sendStandardDigitalOutput(pin, send_pin_value));
219 uint8_t expected_configurable_digital_output_mask = 8;
221 bool send_pin_value =
true;
222 EXPECT_TRUE(writer_->sendConfigurableDigitalOutput(pin, send_pin_value));
224 waitForMessageCallback(1000);
226 ASSERT_TRUE(dataFieldExist(
"configurable_digital_output"));
227 ASSERT_TRUE(dataFieldExist(
"configurable_digital_output_mask"));
229 bool received_pin_value = std::get<uint8_t>(parsed_data_[
"configurable_digital_output"]) != 0;
230 uint8_t received_standard_digital_output_mask = std::get<uint8_t>(parsed_data_[
"configurable_digital_output_mask"]);
232 EXPECT_EQ(send_pin_value, received_pin_value);
233 EXPECT_EQ(expected_configurable_digital_output_mask, received_standard_digital_output_mask);
237 EXPECT_FALSE(writer_->sendStandardDigitalOutput(pin, send_pin_value));
242 uint8_t expected_tool_digital_output_mask = 1;
244 bool send_pin_value =
true;
245 EXPECT_TRUE(writer_->sendToolDigitalOutput(pin, send_pin_value));
247 waitForMessageCallback(1000);
249 ASSERT_TRUE(dataFieldExist(
"tool_digital_output"));
250 ASSERT_TRUE(dataFieldExist(
"tool_digital_output_mask"));
252 bool received_pin_value = std::get<uint8_t>(parsed_data_[
"tool_digital_output"]) != 0;
253 uint8_t received_tool_digital_output_mask = std::get<uint8_t>(parsed_data_[
"tool_digital_output_mask"]);
255 EXPECT_EQ(send_pin_value, received_pin_value);
256 EXPECT_EQ(expected_tool_digital_output_mask, received_tool_digital_output_mask);
260 EXPECT_FALSE(writer_->sendToolDigitalOutput(pin, send_pin_value));
265 uint8_t expected_standard_analog_output_mask = 1;
267 double send_analog_output = 1;
268 EXPECT_TRUE(writer_->sendStandardAnalogOutput(pin, send_analog_output));
270 waitForMessageCallback(1000);
272 ASSERT_TRUE(dataFieldExist(
"standard_analog_output_0"));
273 ASSERT_TRUE(dataFieldExist(
"standard_analog_output_1"));
274 ASSERT_TRUE(dataFieldExist(
"standard_analog_output_mask"));
276 double received_analog_output = std::get<double>(parsed_data_[
"standard_analog_output_0"]);
277 uint8_t received_standard_analog_output_mask = std::get<uint8_t>(parsed_data_[
"standard_analog_output_mask"]);
279 EXPECT_EQ(send_analog_output, received_analog_output);
280 EXPECT_EQ(expected_standard_analog_output_mask, received_standard_analog_output_mask);
283 expected_standard_analog_output_mask = 2;
284 EXPECT_TRUE(writer_->sendStandardAnalogOutput(pin, send_analog_output));
286 waitForMessageCallback(1000);
288 received_analog_output = std::get<double>(parsed_data_[
"standard_analog_output_1"]);
289 received_standard_analog_output_mask = std::get<uint8_t>(parsed_data_[
"standard_analog_output_mask"]);
291 EXPECT_EQ(send_analog_output, received_analog_output);
292 EXPECT_EQ(expected_standard_analog_output_mask, received_standard_analog_output_mask);
296 EXPECT_FALSE(writer_->sendStandardAnalogOutput(pin, send_analog_output));
300 EXPECT_FALSE(writer_->sendStandardAnalogOutput(pin, 1.1));
301 EXPECT_FALSE(writer_->sendStandardAnalogOutput(pin, -0.1));
306 uint32_t register_id = 65;
307 bool send_register_value =
true;
308 EXPECT_TRUE(writer_->sendInputBitRegister(register_id, send_register_value));
310 waitForMessageCallback(1000);
312 ASSERT_TRUE(dataFieldExist(
"input_bit_register_65"));
314 bool received_register_value = std::get<bool>(parsed_data_[
"input_bit_register_65"]);
316 EXPECT_EQ(send_register_value, received_register_value);
320 EXPECT_FALSE(writer_->sendInputBitRegister(register_id, send_register_value));
322 EXPECT_FALSE(writer_->sendInputBitRegister(register_id, send_register_value));
327 uint32_t register_id = 25;
328 int32_t send_register_value = 21;
329 EXPECT_TRUE(writer_->sendInputIntRegister(register_id, send_register_value));
331 waitForMessageCallback(1000);
333 ASSERT_TRUE(dataFieldExist(
"input_int_register_25"));
335 int32_t received_register_value = std::get<int32_t>(parsed_data_[
"input_int_register_25"]);
337 EXPECT_EQ(send_register_value, received_register_value);
341 EXPECT_FALSE(writer_->sendInputIntRegister(register_id, send_register_value));
343 EXPECT_FALSE(writer_->sendInputIntRegister(register_id, send_register_value));
348 uint32_t register_id = 25;
349 double send_register_value = 2.1;
350 EXPECT_TRUE(writer_->sendInputDoubleRegister(register_id, send_register_value));
352 waitForMessageCallback(1000);
354 ASSERT_TRUE(dataFieldExist(
"input_double_register_25"));
356 double received_register_value = std::get<double>(parsed_data_[
"input_double_register_25"]);
358 EXPECT_EQ(send_register_value, received_register_value);
362 EXPECT_FALSE(writer_->sendInputDoubleRegister(register_id, send_register_value));
364 EXPECT_FALSE(writer_->sendInputDoubleRegister(register_id, send_register_value));
367 int main(
int argc,
char* argv[])
369 ::testing::InitGoogleTest(&argc, argv);
371 return RUN_ALL_TESTS();
void parse(T &val)
Parses the next bytes as given type.
void messageCallback(const int filedescriptor, char *buffer, int nbytesrecv)
The BinParser class handles a byte buffer and functionality to iteratively parse the content...
bool waitForMessageCallback(int milliseconds=100)
The stream is an abstraction of the TCPSocket that offers reading a full UR data package out of the s...
std::unordered_map< std::string, input_types > parsed_data_
Wrapper class for a TCP socket server.
bool dataFieldExist(std::string name)
The RTDEWriter class offers an abstraction layer to send data to the robot via the RTDE interface...
void parseMessage(comm::BinParser bp)
std::mutex message_mutex_
std::condition_variable message_cv_
int main(int argc, char *argv[])
std::unique_ptr< comm::URStream< rtde_interface::RTDEPackage > > stream_
TEST_F(RTDEWriterTest, send_speed_slider)
std::unique_ptr< comm::TCPServer > server_
std::unique_ptr< rtde_interface::RTDEWriter > writer_
std::variant< uint8_t, bool, uint32_t, int32_t, double > input_types