75 : m_server_address(server_address), m_tcp_port(
tcp_port),
76 m_receive_timeout(default_receive_timeout), m_receiver_thread_running(false), m_receiver_thread(0)
86 m_receiver_thread_running =
false;
97 return m_tcp_socket.connect(m_server_address, m_tcp_port);
108 m_tcp_socket.close();
111 catch(std::exception & exc)
113 ROS_WARN_STREAM(
"ColaTransmitter::closeTcpConnections(): exception " << exc.what() <<
" on closing connection.");
144 size_t bytes_written = ::send(socket, (
char*)
data.data(),
data.size(), 0);
145 if (bytes_written ==
data.size())
147 ROS_WARN_STREAM(
"## ERROR ColaTransmitter::send: tcp socket write error, " << bytes_written <<
" of " <<
data.size() <<
" bytes written");
150 catch(std::exception & exc)
152 ROS_WARN_STREAM(
"## ERROR ColaTransmitter::send(): exception " << exc.what());
166 return receive(m_tcp_socket.socket(), telegram,
timeout, receive_timestamp);
180 telegram.reserve(1024);
188 uint8_t byte_received = 0;
192 u_long recv_mode = 1;
193 ioctlsocket(socket, FIONBIO, &recv_mode);
195 recv_flags |= MSG_DONTWAIT;
199 if (::recv(socket, (
char*)&byte_received, 1, recv_flags) == 1)
201 if (telegram.empty())
203 telegram.push_back(byte_received);
210 if(telegram_length > 0 && telegram.size() >= telegram_length)
216 if (dataEndWithETX(telegram, binETX))
230 catch(std::exception & exc)
232 ROS_WARN_STREAM(
"## ERROR ColaTransmitter::receive(): exception " << exc.what());
245 if(
data.size() < etx.size())
247 for(
size_t n =
data.size() - etx.size(), m = 0; m < etx.size(); n++, m++)
249 if(
data[n] != etx[m])
262 stopReceiverThread();
263 m_receiver_thread_running =
true;
274 m_receiver_thread_running =
false;
275 if(m_receiver_thread)
277 m_receiver_thread->join();
278 delete(m_receiver_thread);
279 m_receiver_thread = 0;
297 while(
ROS::ok() && m_receiver_thread_running && m_response_fifo.empty())
300 m_response_fifo.waitOnceForElement();
304 if(!m_response_fifo.empty())
308 receive_timestamp =
response.receive_timestamp;
319 while(
ROS::ok() && m_receiver_thread_running)
325 m_response_fifo.notify();