31 #include <gtest/gtest.h> 45 std::string host =
"127.0.0.1";
46 TCPSocket::setup(host, port);
50 TCPSocket::setReceiveTimeout(tv);
56 uint8_t buf[
sizeof(int32_t) * 8];
59 size_t remainder =
sizeof(int32_t) * 8;
62 if (!TCPSocket::read(b_pos, remainder, read))
64 std::cout <<
"Failed to read from socket, this should not happen during a test!" << std::endl;
74 std::memcpy(&val, b_pos,
sizeof(int32_t));
75 keep_alive_signal = be32toh(val);
76 b_pos +=
sizeof(int32_t);
79 for (
unsigned int i = 0; i < pos.size(); ++i)
81 std::memcpy(&val, b_pos,
sizeof(int32_t));
82 pos[i] = be32toh(val);
83 b_pos +=
sizeof(int32_t);
87 std::memcpy(&val, b_pos,
sizeof(int32_t));
88 control_mode = be32toh(val);
94 int32_t keep_alive_signal;
97 readMessage(keep_alive_signal, pos, control_mode);
103 int32_t keep_alive_signal;
104 int32_t control_mode;
106 readMessage(keep_alive_signal, pos, control_mode);
107 return keep_alive_signal;
112 int32_t keep_alive_signal;
113 int32_t control_mode;
115 readMessage(keep_alive_signal, pos, control_mode);
122 int32_t keep_alive_signal;
123 int32_t control_mode;
125 readMessage(keep_alive_signal, pos, control_mode);
132 int32_t keep_alive_signal;
133 int32_t control_mode;
135 readMessage(keep_alive_signal, pos, control_mode);
142 int32_t keep_alive_signal;
143 int32_t control_mode;
145 readMessage(keep_alive_signal, pos, control_mode);
150 virtual bool open(
int socket_fd,
struct sockaddr* address,
size_t address_len)
152 return ::connect(socket_fd, address, address_len) == 0;
160 client_.reset(
new Client(50001));
168 waitForProgramState(1000,
false);
174 std::lock_guard<std::mutex> lk(program_running_mutex_);
175 program_running_.notify_one();
176 program_state_ = program_state;
181 std::unique_lock<std::mutex> lk(program_running_mutex_);
182 if (program_running_.wait_for(lk, std::chrono::milliseconds(milliseconds)) == std::cv_status::no_timeout ||
183 program_state_ == program_state)
185 if (program_state_ == program_state)
197 std::atomic<bool> program_state_ = ATOMIC_VAR_INIT(
false);
205 EXPECT_TRUE(waitForProgramState(1000,
true));
209 EXPECT_TRUE(waitForProgramState(1000,
false));
215 EXPECT_TRUE(waitForProgramState(1000,
true));
218 reverse_interface_->write(&written_positions);
221 EXPECT_EQ(written_positions[0], ((
double)received_positions[0]) / reverse_interface_->MULT_JOINTSTATE);
222 EXPECT_EQ(written_positions[1], ((
double)received_positions[1]) / reverse_interface_->MULT_JOINTSTATE);
223 EXPECT_EQ(written_positions[2], ((
double)received_positions[2]) / reverse_interface_->MULT_JOINTSTATE);
224 EXPECT_EQ(written_positions[3], ((
double)received_positions[3]) / reverse_interface_->MULT_JOINTSTATE);
225 EXPECT_EQ(written_positions[4], ((
double)received_positions[4]) / reverse_interface_->MULT_JOINTSTATE);
226 EXPECT_EQ(written_positions[5], ((
double)received_positions[5]) / reverse_interface_->MULT_JOINTSTATE);
232 EXPECT_TRUE(waitForProgramState(1000,
true));
235 reverse_interface_->writeTrajectoryControlMessage(written_control_message, 1);
236 int32_t received_control_message = client_->getTrajectoryControlMode();
238 EXPECT_EQ(
toUnderlying(written_control_message), received_control_message);
241 reverse_interface_->writeTrajectoryControlMessage(written_control_message, 1);
242 received_control_message = client_->getTrajectoryControlMode();
244 EXPECT_EQ(
toUnderlying(written_control_message), received_control_message);
247 reverse_interface_->writeTrajectoryControlMessage(written_control_message, 1);
248 received_control_message = client_->getTrajectoryControlMode();
250 EXPECT_EQ(
toUnderlying(written_control_message), received_control_message);
256 EXPECT_TRUE(waitForProgramState(1000,
true));
258 int32_t written_point_number = 2;
260 written_point_number);
261 int32_t received_point_number = client_->getTrajectoryPointNumber();
263 EXPECT_EQ(written_point_number, received_point_number);
269 EXPECT_TRUE(waitForProgramState(1000,
true));
274 int32_t received_control_mode = client_->getControlMode();
276 EXPECT_EQ(
toUnderlying(expected_control_mode), received_control_mode);
282 EXPECT_TRUE(waitForProgramState(1000,
true));
290 EXPECT_EQ(0, received_pos[2]);
291 EXPECT_EQ(0, received_pos[3]);
292 EXPECT_EQ(0, received_pos[4]);
293 EXPECT_EQ(0, received_pos[5]);
299 EXPECT_TRUE(waitForProgramState(1000,
true));
301 int expected_keep_alive_count = 5;
302 reverse_interface_->setKeepaliveCount(expected_keep_alive_count);
305 reverse_interface_->write(&pos);
306 int32_t received_keep_alive_count = client_->getKeepAliveCount();
308 EXPECT_EQ(expected_keep_alive_count, received_keep_alive_count);
312 received_keep_alive_count = client_->getKeepAliveCount();
314 EXPECT_EQ(expected_keep_alive_count, received_keep_alive_count);
320 EXPECT_TRUE(waitForProgramState(1000,
true));
325 reverse_interface_->write(&pos, expected_control_mode);
326 int32_t received_control_mode = client_->getControlMode();
328 EXPECT_EQ(
toUnderlying(expected_control_mode), received_control_mode);
331 reverse_interface_->write(&pos, expected_control_mode);
332 received_control_mode = client_->getControlMode();
334 EXPECT_EQ(
toUnderlying(expected_control_mode), received_control_mode);
337 reverse_interface_->write(&pos, expected_control_mode);
338 received_control_mode = client_->getControlMode();
340 EXPECT_EQ(
toUnderlying(expected_control_mode), received_control_mode);
343 reverse_interface_->write(&pos, expected_control_mode);
344 received_control_mode = client_->getControlMode();
346 EXPECT_EQ(
toUnderlying(expected_control_mode), received_control_mode);
349 reverse_interface_->write(&pos, expected_control_mode);
350 received_control_mode = client_->getControlMode();
352 EXPECT_EQ(
toUnderlying(expected_control_mode), received_control_mode);
355 reverse_interface_->write(&pos, expected_control_mode);
356 received_control_mode = client_->getControlMode();
358 EXPECT_EQ(
toUnderlying(expected_control_mode), received_control_mode);
361 reverse_interface_->write(&pos, expected_control_mode);
362 received_control_mode = client_->getControlMode();
364 EXPECT_EQ(
toUnderlying(expected_control_mode), received_control_mode);
367 reverse_interface_->write(&pos, expected_control_mode);
368 received_control_mode = client_->getControlMode();
370 EXPECT_EQ(
toUnderlying(expected_control_mode), received_control_mode);
376 EXPECT_TRUE(waitForProgramState(1000,
true));
379 reverse_interface_->writeFreedriveControlMessage(written_freedrive_message);
380 int32_t received_freedrive_message = client_->getFreedriveControlMode();
382 EXPECT_EQ(
toUnderlying(written_freedrive_message), received_freedrive_message);
385 reverse_interface_->writeFreedriveControlMessage(written_freedrive_message);
386 received_freedrive_message = client_->getFreedriveControlMode();
388 EXPECT_EQ(
toUnderlying(written_freedrive_message), received_freedrive_message);
391 reverse_interface_->writeFreedriveControlMessage(written_freedrive_message);
392 received_freedrive_message = client_->getFreedriveControlMode();
394 EXPECT_EQ(
toUnderlying(written_freedrive_message), received_freedrive_message);
397 int main(
int argc,
char* argv[])
399 ::testing::InitGoogleTest(&argc, argv);
401 return RUN_ALL_TESTS();
virtual bool open(int socket_fd, struct sockaddr *address, size_t address_len)
bool waitForProgramState(int milliseconds=100, bool program_state=true)
std::unique_ptr< Client > client_
Set when speedj control is active.
Represents command to start a new trajectory.
Set when trajectory forwarding is active.
Represents command to cancel currently active trajectory.
FreedriveControlMessage
Control messages for starting and stopping freedrive mode.
void handleProgramState(bool program_state)
void readMessage(int32_t &keep_alive_signal, vector6int32_t &pos, int32_t &control_mode)
Set when no controller is currently active controlling the robot.
int32_t getTrajectoryPointNumber()
int32_t getFreedriveControlMode()
Set when servoj control is active.
TEST_F(ReverseIntefaceTest, handle_program_state)
int main(int argc, char *argv[])
std::mutex program_running_mutex_
std::condition_variable program_running_
ControlMode
Control modes as interpreted from the script runnning on the robot.
When this is set, the program is expected to stop and exit.
Startup default until another mode is sent to the script.
Represents command to start freedrive mode.
std::array< int32_t, 6 > vector6int32_t
Class for TCP socket abstraction.
constexpr std::underlying_type< E >::type toUnderlying(const E e) noexcept
Converts an enum type to its underlying type.
TrajectoryControlMessage
Control messages for forwarding and aborting trajectories.
Socket is connected and ready to use.
vector6int32_t getPositions()
int32_t getTrajectoryControlMode()
std::unique_ptr< control::ReverseInterface > reverse_interface_
std::array< double, 6 > vector6d_t
int32_t getKeepAliveCount()
Set when cartesian velocity control is active.
Represents no new control command.
Set when cartesian pose control is active.
Represents keep running in freedrive mode.
The ReverseInterface class handles communication to the robot. It starts a server and waits for the r...
Represents command to stop freedrive mode.