59 namespace multisense {
67 m_serverSocketPort(0),
69 m_sensorMtu(MAX_MTU_SIZE),
70 m_incomingBuffer(MAX_MTU_SIZE),
73 m_unWrappedRxSeqId(0),
74 m_udpTrackerCache(UDP_TRACKER_CACHE_DEPTH),
75 m_rxLargeBufferPool(),
76 m_rxSmallBufferPool(),
77 m_imageMetaCache(IMAGE_META_CACHE_DEPTH),
81 m_threadsRunning(false),
84 m_statusThreadP(NULL),
89 m_compressedImageListeners(),
94 m_timeOffsetInit(false),
96 m_networkTimeSyncEnabled(true),
97 m_ptpTimeSyncEnabled(false),
103 int result = WSAStartup (MAKEWORD (0x02, 0x02), &wsaData);
109 struct addrinfo hints, *res;
110 memset(&hints, 0,
sizeof(hints));
111 hints.ai_family = AF_INET;
112 hints.ai_socktype = 0;
114 const int addrstatus = getaddrinfo(address.c_str(), NULL, &hints, &res);
115 if (addrstatus != 0 || res == NULL)
116 CRL_EXCEPTION(
"unable to resolve \"%s\": %s", address.c_str(), strerror(errno));
119 memcpy(&addr, &(((
struct sockaddr_in *)(res->ai_addr))->sin_addr),
sizeof(in_addr));
132 uint32_t largeBufferRetry = 0;
138 largeBufferRetry = 0;
140 catch (
const std::exception &e) {
141 CRL_DEBUG(
"Failed to allocate memory (will sleep and try again): %s", e.what());
142 usleep(static_cast<unsigned int> (10000));
150 uint32_t smallBufferRetry = 0;
156 smallBufferRetry = 0;
158 catch (
const std::exception &e) {
159 CRL_DEBUG(
"Failed to allocate memory (will sleep and try again): %s", e.what());
160 usleep(static_cast<unsigned int> (10000));
173 }
catch (
const std::exception& e) {
198 CRL_EXCEPTION(
"failed to establish comms with the sensor at \"%s\", with remote head enum %d",
199 address.c_str(), cameraId);
214 CRL_EXCEPTION(
"failed to request version info from sensor at \"%s\"",
236 std::list<ImageListener*>::const_iterator iti;
241 std::list<LidarListener*>::const_iterator itl;
246 std::list<PpsListener*>::const_iterator itp;
251 std::list<ImuListener*>::const_iterator itm;
256 std::list<CompressedImageListener*>::const_iterator itc;
262 BufferPool::const_iterator it;
313 if (!ifName.empty()){
314 if (0 != setsockopt(
m_serverSocket, SOL_SOCKET, SO_BINDTODEVICE, ifName.c_str(), ifName.size())){
315 CRL_EXCEPTION(
"Failed to bind to device %s. Error: %s", ifName.c_str(),
321 CRL_DEBUG(
"User specified binding to adapter %s, but this feature is only supported under linux. Ignoring bind to specific adapter", ifName.c_str());
327 u_long ioctl_arg = 1;
329 CRL_EXCEPTION(
"failed to make a socket non-blocking: %d",WSAGetLastError ());
343 if (0 != setsockopt(
m_serverSocket, SOL_SOCKET, SO_REUSEADDR, (
char*) &reuseSocket,
344 sizeof(reuseSocket)))
353 int bufferSize = 4 * 1024 * 1024;
355 int bufferSize = 48 * 1024 * 1024;
358 if (0 != setsockopt(
m_serverSocket, SOL_SOCKET, SO_RCVBUF, (
char*) &bufferSize,
359 sizeof(bufferSize)) ||
360 0 != setsockopt(
m_serverSocket, SOL_SOCKET, SO_SNDBUF, (
char*) &bufferSize,
362 CRL_EXCEPTION(
"failed to adjust socket buffer sizes (%d bytes): %s",
363 bufferSize, strerror(errno));
368 struct sockaddr_in address;
370 address.sin_family = AF_INET;
371 address.sin_port = htons(0);
372 address.sin_addr.s_addr = htonl(INADDR_ANY);
375 CRL_EXCEPTION(
"failed to bind the server socket to system-assigned port: %s",
381 int len =
sizeof(address);
383 socklen_t len =
sizeof(address);
385 if (0 != getsockname(
m_serverSocket, (
struct sockaddr*) &address, &len))
406 header.sequenceIdentifier = InterlockedIncrement16((
short*)&
m_txSeqId);
409 header.sequenceIdentifier = __sync_fetch_and_add(&m_txSeqId, 1);
411 header.messageLength =
static_cast<uint32_t
> (stream.
tell() -
sizeof(
wire::Header));
412 header.byteOffset = 0;
419 #pragma warning (push) 420 #pragma warning (disable : 4267) 426 #pragma warning (pop) 429 if (static_cast<size_t>(ret) != stream.
tell())
430 CRL_EXCEPTION(
"error sending data to sensor, %d/%d bytes written: %s",
431 ret, stream.
tell(), strerror(errno));
536 CRL_DEBUG(
"unknown API hardware type \"%d\"\n", a);
560 CRL_DEBUG(
"unknown WIRE hardware type \"%d\"\n", w);
576 CRL_DEBUG(
"unknown API imager type \"%d\"\n", a);
592 CRL_DEBUG(
"unknown WIRE imager type \"%d\"\n", w);
628 const int32_t newOffsetSeconds =
static_cast<int32_t
>(newOffset);
629 const int32_t newOffsetMicroSeconds =
static_cast<int32_t
>((newOffset - newOffsetSeconds) * 1e6);
648 uint32_t& microseconds)
664 impl *selfP =
reinterpret_cast<impl*
>(userDataP);
688 if (ack.
wait(status, 0.010)) {
723 }
catch (
const std::exception& e) {
735 usleep(static_cast<unsigned int> (1e6));
749 }
catch (
const std::exception& e) {
762 }
catch (
const std::exception& e) {
773 }
catch (
const std::exception& e) {
783 }
catch (
const std::exception& e) {
796 }
catch (
const std::exception& e) {
814 return "Unknown Error";
static CRL_CONSTEXPR uint32_t HARDWARE_REV_MULTISENSE_KS21
static CRL_CONSTEXPR DataSource Source_Disparity_Cost
std::list< ImageListener * > m_imageListeners
static CRL_CONSTEXPR SourceType SOURCE_LUMA_RECT_AUX
static uint32_t imagerWireToApi(uint32_t h)
static CRL_CONSTEXPR uint32_t HARDWARE_REV_MULTISENSE_REMOTE_HEAD_VPB
static CRL_CONSTEXPR DataSource Source_Luma_Aux
static CRL_CONSTEXPR SourceType SOURCE_LUMA_AUX
#define CRL_EXCEPTION(fmt,...)
static uint32_t hardwareWireToApi(uint32_t h)
#define CRL_DEBUG_RAW(fmt)
static CRL_CONSTEXPR SourceType SOURCE_DISPARITY
BufferPool m_rxLargeBufferPool
static CRL_CONSTEXPR SourceType SOURCE_RAW_AUX
static CRL_CONSTEXPR DataSource Source_Disparity_Right
static CRL_CONSTEXPR DataSource Source_Compressed_Rectified_Right
static CRL_CONSTEXPR RemoteHeadChannel Remote_Head_VPB
static CRL_CONSTEXPR uint32_t HARDWARE_REV_MULTISENSE_SL
static CRL_CONSTEXPR SourceType SOURCE_DISPARITY_AUX
static CRL_CONSTEXPR DataSource Source_Jpeg_Left
static CRL_CONSTEXPR SourceType SOURCE_GROUND_SURFACE_SPLINE_DATA
static CRL_CONSTEXPR uint32_t IMAGER_TYPE_CMV4000_COLOR
static const char * statusString(Status status)
static CRL_CONSTEXPR DataSource Source_Disparity
static CRL_CONSTEXPR SourceType SOURCE_CHROMA_RECT_AUX
static CRL_CONSTEXPR uint32_t HARDWARE_REV_MULTISENSE_KS21
struct sockaddr_in m_sensorAddress
static CRL_CONSTEXPR uint32_t IMAGER_TYPE_CMV2000_GREY
static CRL_CONSTEXPR SourceType SOURCE_DISPARITY_RIGHT
void applySensorTimeOffset(const utility::TimeStamp &offset)
static CRL_CONSTEXPR DataSource Source_Chroma_Left
static CRL_CONSTEXPR uint32_t HARDWARE_REV_MULTISENSE_S21
static CRL_CONSTEXPR DataSource Source_Compressed_Aux
UdpAssemblerMap m_udpAssemblerMap
static CRL_CONSTEXPR SourceType SOURCE_GROUND_SURFACE_CLASS_IMAGE
static CRL_CONSTEXPR uint32_t HARDWARE_REV_MULTISENSE_ST21
static Channel * Create(const std::string &sensorAddress)
static CRL_CONSTEXPR Status Status_Unsupported
static CRL_CONSTEXPR DataSource Source_Ground_Surface_Class_Image
static CRL_CONSTEXPR DataSource Source_AprilTag_Detections
int64_t getNanoSeconds() const
wire::StatusResponse m_statusResponseMessage
static wire::SourceType sourceApiToWire(DataSource mask)
static CRL_CONSTEXPR DataSource Source_Luma_Left
std::list< PpsListener * > m_ppsListeners
static CRL_CONSTEXPR SourceType SOURCE_APRILTAG_DETECTIONS
static CRL_CONSTEXPR uint32_t IMAGER_TYPE_AR0234_GREY
std_msgs::Header * header(M &m)
impl(const std::string &address, const RemoteHeadChannel &cameraId, const std::string &ifName)
static CRL_CONSTEXPR Status Status_Failed
static CRL_CONSTEXPR SourceType SOURCE_LUMA_LEFT
static CRL_CONSTEXPR uint32_t HARDWARE_REV_MULTISENSE_REMOTE_HEAD_MONOCAM
utility::Thread * m_rxThreadP
static CRL_CONSTEXPR uint16_t HEADER_VERSION
static CRL_CONSTEXPR uint32_t HARDWARE_REV_MULTISENSE_MONOCAM
static CRL_CONSTEXPR uint32_t HARDWARE_REV_MULTISENSE_S7
static CRL_CONSTEXPR SourceType SOURCE_CHROMA_RIGHT
static CRL_CONSTEXPR uint32_t RX_POOL_SMALL_BUFFER_COUNT
static CRL_CONSTEXPR uint32_t HARDWARE_REV_MULTISENSE_C6S2_S27
static CRL_CONSTEXPR DataSource Source_Luma_Rectified_Aux
static CRL_CONSTEXPR uint32_t RX_POOL_SMALL_BUFFER_SIZE
int16_t RemoteHeadChannel
static CRL_CONSTEXPR uint32_t HARDWARE_REV_MULTISENSE_SL
static CRL_CONSTEXPR uint32_t IMAGER_TYPE_FLIR_TAU2
static CRL_CONSTEXPR SourceType SOURCE_LUMA_RECT_RIGHT
static CRL_CONSTEXPR DataSource Source_Lidar_Scan
static CRL_CONSTEXPR uint32_t HARDWARE_REV_MULTISENSE_M
static CRL_CONSTEXPR uint32_t HARDWARE_REV_MULTISENSE_REMOTE_HEAD_STEREO
static CRL_CONSTEXPR DataSource Source_Luma_Right
static TimeStamp getCurrentTime()
int32_t getMicroSeconds() const
static CRL_CONSTEXPR SourceType SOURCE_COMPRESSED_RIGHT
static CRL_CONSTEXPR uint32_t HARDWARE_REV_MONO
static CRL_CONSTEXPR uint32_t IMAGER_TYPE_AR0234_GREY
static CRL_CONSTEXPR uint32_t HARDWARE_REV_MULTISENSE_REMOTE_HEAD_STEREO
static CRL_CONSTEXPR DataSource Source_Imu
static CRL_CONSTEXPR uint32_t HARDWARE_REV_MULTISENSE_S30
static CRL_CONSTEXPR uint32_t IMAGER_TYPE_CMV4000_GREY
static CRL_CONSTEXPR uint32_t HARDWARE_REV_MULTISENSE_S7S
static CRL_CONSTEXPR uint32_t HARDWARE_REV_MULTISENSE_ST21
static CRL_CONSTEXPR uint16_t DEFAULT_SENSOR_TX_PORT
static CRL_CONSTEXPR uint32_t IMAGER_TYPE_IMX104_COLOR
static CRL_CONSTEXPR uint32_t HARDWARE_REV_MULTISENSE_S21
static CRL_CONSTEXPR DataSource Source_Ground_Surface_Spline_Data
static CRL_CONSTEXPR uint32_t MAX_BUFFER_ALLOCATION_RETRIES
static CRL_CONSTEXPR uint32_t HARDWARE_REV_MULTISENSE_MONOCAM
static CRL_CONSTEXPR SourceType SOURCE_CHROMA_LEFT
static CRL_CONSTEXPR Status Status_TimedOut
uint16_t m_serverSocketPort
static CRL_CONSTEXPR uint32_t RX_POOL_LARGE_BUFFER_COUNT
static CRL_CONSTEXPR Status Status_Ok
void bind(const std::string &ifName)
static CRL_CONSTEXPR DataSource Source_Chroma_Aux
static CRL_CONSTEXPR uint32_t IMAGER_TYPE_FLIR_TAU2
static CRL_CONSTEXPR SourceType SOURCE_RAW_RIGHT
static CRL_CONSTEXPR uint32_t HARDWARE_REV_MULTISENSE_REMOTE_HEAD_MONOCAM
static CRL_CONSTEXPR DataSource Source_Pps
static CRL_CONSTEXPR DataSource Source_Rgb_Left
wire::VersionResponse m_sensorVersion
std::list< CompressedImageListener * > m_compressedImageListeners
static CRL_CONSTEXPR uint32_t IMAGER_TYPE_AR0239_COLOR
static CRL_CONSTEXPR SourceType SOURCE_COMPRESSED_AUX
static CRL_CONSTEXPR uint32_t IMAGER_TYPE_CMV4000_GREY
static CRL_CONSTEXPR uint32_t HARDWARE_REV_MULTISENSE_S7S
static CRL_CONSTEXPR DataSource Source_Compressed_Rectified_Left
static CRL_CONSTEXPR SourceType SOURCE_IMU
static uint32_t imagerApiToWire(uint32_t h)
static CRL_CONSTEXPR uint32_t HARDWARE_REV_MONO
utility::TimeStamp uptime
static CRL_CONSTEXPR uint32_t HARDWARE_REV_MULTISENSE_S30
static CRL_CONSTEXPR uint32_t HARDWARE_REV_BCAM
utility::TimeStamp m_timeOffset
int32_t getSeconds() const
static CRL_CONSTEXPR SourceType SOURCE_LUMA_RECT_LEFT
static CRL_CONSTEXPR IdType ID
static CRL_CONSTEXPR uint16_t HEADER_MAGIC
static CRL_CONSTEXPR SourceType SOURCE_DISPARITY_COST
static CRL_CONSTEXPR uint32_t IMAGER_TYPE_AR0239_COLOR
static CRL_CONSTEXPR DataSource Source_Chroma_Rectified_Aux
static CRL_CONSTEXPR DataSource Source_Raw_Right
#define CRL_DEBUG(fmt,...)
static CRL_CONSTEXPR uint32_t HARDWARE_REV_MULTISENSE_S7AR
utility::Mutex m_timeLock
static CRL_CONSTEXPR SourceType SOURCE_RGB_LEFT
static CRL_CONSTEXPR uint32_t RX_POOL_LARGE_BUFFER_SIZE
BufferPool m_rxSmallBufferPool
std::list< LidarListener * > m_lidarListeners
utility::TimeStamp sensorToLocalTime(const utility::TimeStamp &sensorTime)
static CRL_CONSTEXPR DataSource Source_Raw_Left
static CRL_CONSTEXPR uint32_t HARDWARE_REV_MULTISENSE_C6S2_S27
static CRL_CONSTEXPR SourceType SOURCE_COMPRESSED_RECTIFIED_LEFT
bool wait(Status &status, const double &timeout)
static uint32_t hardwareApiToWire(uint32_t h)
static void Destroy(Channel *instanceP)
static CRL_CONSTEXPR SourceType SOURCE_COMPRESSED_LEFT
static CRL_CONSTEXPR uint32_t HARDWARE_REV_MULTISENSE_S7AR
static CRL_CONSTEXPR uint32_t HARDWARE_REV_MULTISENSE_M
static CRL_CONSTEXPR uint16_t HEADER_GROUP
static void assembler(utility::BufferStreamWriter &stream, const uint8_t *dataP, uint32_t offset, uint32_t length)
static CRL_CONSTEXPR DataSource Source_Luma_Rectified_Right
Status m_getStatusReturnStatus
void publish(const T &message)
static CRL_CONSTEXPR SourceType SOURCE_RAW_LEFT
static CRL_CONSTEXPR uint32_t IMAGER_TYPE_CMV2000_GREY
static CRL_CONSTEXPR uint32_t IMAGER_TYPE_CMV4000_COLOR
static CRL_CONSTEXPR SourceType SOURCE_LIDAR_SCAN
static CRL_CONSTEXPR SourceType SOURCE_PPS
static void * rxThread(void *userDataP)
static CRL_CONSTEXPR DataSource Source_Compressed_Rectified_Aux
static CRL_CONSTEXPR SourceType SOURCE_LUMA_RIGHT
static CRL_CONSTEXPR DataSource Source_Compressed_Right
std::list< ImuListener * > m_imuListeners
static CRL_CONSTEXPR Status Status_Exception
Type decayedAverage(Type const &previous, Type const &samples, Type const &newest)
static CRL_CONSTEXPR uint32_t IMAGER_TYPE_CMV2000_COLOR
static CRL_CONSTEXPR uint32_t TIME_SYNC_OFFSET_DECAY
static CRL_CONSTEXPR DataSource Source_Raw_Aux
static CRL_CONSTEXPR uint32_t IMAGER_TYPE_CMV2000_COLOR
static CRL_CONSTEXPR DataSource Source_Disparity_Aux
Status waitData(const T &command, U &data, const double &timeout=DEFAULT_ACK_TIMEOUT(), int32_t attempts=DEFAULT_ACK_ATTEMPTS)
static void * statusThread(void *userDataP)
static CRL_CONSTEXPR Status Status_Error
static CRL_CONSTEXPR uint32_t IMAGER_TYPE_IMX104_COLOR
static CRL_CONSTEXPR SourceType SOURCE_COMPRESSED_RECTIFIED_RIGHT
static CRL_CONSTEXPR uint32_t HARDWARE_REV_BCAM
static CRL_CONSTEXPR SourceType SOURCE_JPEG_LEFT
static CRL_CONSTEXPR SourceType SOURCE_COMPRESSED_RECTIFIED_AUX
static CRL_CONSTEXPR uint32_t HARDWARE_REV_MULTISENSE_REMOTE_HEAD_VPB
utility::Thread * m_statusThreadP
static DataSource sourceWireToApi(wire::SourceType mask)
static CRL_CONSTEXPR DataSource Source_Chroma_Right
static CRL_CONSTEXPR Status Status_Unknown
static CRL_CONSTEXPR SourceType SOURCE_CHROMA_AUX
static CRL_CONSTEXPR uint32_t HARDWARE_REV_MULTISENSE_S7
static CRL_CONSTEXPR DataSource Source_Compressed_Left
static CRL_CONSTEXPR DataSource Source_Luma_Rectified_Left