31 #include <gtest/gtest.h> 48 std::string host =
"127.0.0.1";
49 TCPSocket::setup(host, port);
53 TCPSocket::setReceiveTimeout(tv);
56 void send(
const int32_t& result)
58 uint8_t buffer[
sizeof(int32_t)];
59 int32_t val = htobe32(result);
60 std::memcpy(buffer, &val,
sizeof(int32_t));
62 TCPSocket::write(buffer,
sizeof(buffer), written);
65 void readMessage(int32_t& command, std::vector<int32_t>& message)
68 uint8_t buf[
sizeof(int32_t) * 26];
71 size_t remainder =
sizeof(int32_t) * 26;
74 if (!TCPSocket::read(b_pos, remainder, read))
76 std::cout <<
"Failed to read from socket, this should not happen during a test!" << std::endl;
85 uint8_t* b_end = b_pos + read;
89 std::memcpy(&val, b_pos,
sizeof(int32_t));
90 command = be32toh(val);
91 b_pos +=
sizeof(int32_t);
96 std::memcpy(&val, b_pos,
sizeof(int32_t));
97 message.push_back(be32toh(val));
98 b_pos +=
sizeof(int32_t);
103 virtual bool open(
int socket_fd,
struct sockaddr* address,
size_t address_len)
105 return ::connect(socket_fd, address, address_len) == 0;
112 client_.reset(
new Client(50004));
117 if (script_command_interface_->clientConnected() ==
true)
120 waitForClientConnection(
false);
125 std::chrono::duration<double> timeout = std::chrono::milliseconds(1000))
127 const std::chrono::duration<double> wait_period = std::chrono::milliseconds(50);
128 std::chrono::duration<double> time_done(0);
129 while (time_done < timeout)
131 if (script_command_interface_->clientConnected() == client_connected)
135 std::this_thread::sleep_for(wait_period);
136 time_done += wait_period;
143 std::unique_lock<std::mutex> lk(tool_contact_result_mutex_);
144 if (tool_contact_result_.wait_for(lk, std::chrono::milliseconds(milliseconds)) == std::cv_status::no_timeout ||
145 received_result_ == result)
147 if (received_result_ == result)
162 std::lock_guard<std::mutex> lk(tool_contact_result_mutex_);
163 tool_contact_result_.notify_one();
164 received_result_ = result;
175 waitForClientConnection();
177 script_command_interface_->zeroFTSensor();
179 std::vector<int32_t> message;
180 client_->readMessage(command, message);
183 int32_t expected_command = 0;
184 EXPECT_EQ(command, expected_command);
187 int32_t message_sum = std::accumulate(std::begin(message), std::end(message), 0);
188 int32_t expected_message_sum = 0;
189 EXPECT_EQ(message_sum, expected_message_sum);
195 waitForClientConnection();
199 script_command_interface_->setPayload(mass, &cog);
201 std::vector<int32_t> message;
202 client_->readMessage(command, message);
205 int32_t expected_command = 1;
206 EXPECT_EQ(command, expected_command);
209 double received_mass = (double)message[0] / script_command_interface_->MULT_JOINTSTATE;
210 EXPECT_EQ(received_mass, mass);
214 for (
unsigned int i = 0; i < cog.size(); ++i)
216 received_cog[i] = (double)message[i + 1] / script_command_interface_->MULT_JOINTSTATE;
217 EXPECT_EQ(received_cog[i], cog[i]);
221 int32_t message_sum = std::accumulate(std::begin(message) + 4, std::end(message), 0);
222 int32_t expected_message_sum = 0;
223 EXPECT_EQ(message_sum, expected_message_sum);
229 waitForClientConnection();
232 script_command_interface_->setToolVoltage(tool_voltage);
234 std::vector<int32_t> message;
235 client_->readMessage(command, message);
238 int32_t expected_command = 2;
239 EXPECT_EQ(command, expected_command);
242 int received_tool_voltage = message[0] / script_command_interface_->MULT_JOINTSTATE;
243 EXPECT_EQ(received_tool_voltage,
toUnderlying(tool_voltage));
246 int32_t message_sum = std::accumulate(std::begin(message) + 1, std::end(message), 0);
247 int32_t expected_message_sum = 0;
248 EXPECT_EQ(message_sum, expected_message_sum);
254 waitForClientConnection();
259 int32_t force_mode_type = 2;
261 script_command_interface_->startForceMode(&task_frame, &selection_vector, &wrench, force_mode_type, &limits);
264 std::vector<int32_t> message;
265 client_->readMessage(command, message);
268 int32_t expected_command = 3;
269 EXPECT_EQ(command, expected_command);
273 for (
unsigned int i = 0; i < task_frame.size(); ++i)
275 received_task_frame[i] = (double)message[i] / script_command_interface_->MULT_JOINTSTATE;
276 EXPECT_EQ(received_task_frame[i], task_frame[i]);
281 for (
unsigned int i = 0; i < selection_vector.size(); ++i)
283 received_selection_vector[i] = message[i + 6] / script_command_interface_->MULT_JOINTSTATE;
284 EXPECT_EQ(received_selection_vector[i], selection_vector[i]);
289 for (
unsigned int i = 0; i < wrench.size(); ++i)
291 received_wrench[i] = (double)message[i + 12] / script_command_interface_->MULT_JOINTSTATE;
292 EXPECT_EQ(received_wrench[i], wrench[i]);
296 int32_t received_force_mode_type = message[18] / script_command_interface_->MULT_JOINTSTATE;
297 EXPECT_EQ(received_force_mode_type, force_mode_type);
301 for (
unsigned int i = 0; i < wrench.size(); ++i)
303 received_limits[i] = (double)message[i + 19] / script_command_interface_->MULT_JOINTSTATE;
304 EXPECT_EQ(received_limits[i], limits[i]);
308 int32_t message_sum = std::accumulate(std::begin(message) + 25, std::end(message), 0);
309 int32_t expected_message_sum = 0;
310 EXPECT_EQ(message_sum, expected_message_sum);
313 script_command_interface_->endForceMode();
315 client_->readMessage(command, message);
318 expected_command = 4;
319 EXPECT_EQ(command, expected_command);
322 message_sum = std::accumulate(std::begin(message), std::end(message), 0);
323 EXPECT_EQ(message_sum, expected_message_sum);
329 waitForClientConnection();
331 script_command_interface_->startToolContact();
334 std::vector<int32_t> message;
335 client_->readMessage(command, message);
338 int32_t expected_command = 5;
339 EXPECT_EQ(command, expected_command);
342 int32_t message_sum = std::accumulate(std::begin(message) + 25, std::end(message), 0);
343 int32_t expected_message_sum = 0;
344 EXPECT_EQ(message_sum, expected_message_sum);
347 script_command_interface_->endToolContact();
350 client_->readMessage(command, message);
352 expected_command = 6;
353 EXPECT_EQ(command, expected_command);
356 message_sum = std::accumulate(std::begin(message) + 25, std::end(message), 0);
357 EXPECT_EQ(message_sum, expected_message_sum);
363 waitForClientConnection();
364 script_command_interface_->setToolContactResultCallback(
369 waitToolContactResult(send_result);
375 waitToolContactResult(send_result);
380 int main(
int argc,
char* argv[])
382 ::testing::InitGoogleTest(&argc, argv);
384 return RUN_ALL_TESTS();
ToolVoltage
Possible values for the tool voltage.
The ScriptCommandInterface class starts a TCPServer for a robot to connect to and this connection is ...
std::condition_variable tool_contact_result_
bool waitForClientConnection(bool client_connected=true, std::chrono::duration< double > timeout=std::chrono::milliseconds(1000))
std::unique_ptr< Client > client_
std::array< double, 3 > vector3d_t
TEST_F(ScriptCommandInterfaceTest, test_zero_ft_sensor)
std::unique_ptr< control::ScriptCommandInterface > script_command_interface_
control::ToolContactResult received_result_
std::mutex tool_contact_result_mutex_
void readMessage(int32_t &command, std::vector< int32_t > &message)
void send(const int32_t &result)
bool waitToolContactResult(control::ToolContactResult result, int milliseconds=1000)
Class for TCP socket abstraction.
constexpr std::underlying_type< E >::type toUnderlying(const E e) noexcept
Converts an enum type to its underlying type.
virtual bool open(int socket_fd, struct sockaddr *address, size_t address_len)
ToolContactResult
Types for encoding until tool contact execution result.
std::array< uint32_t, 6 > vector6uint32_t
int main(int argc, char *argv[])
std::array< double, 6 > vector6d_t
void handleToolContactResult(control::ToolContactResult result)