Go to the documentation of this file.
70 m_serverSocketPort(0),
72 m_sensorMtu(MAX_MTU_SIZE),
73 m_incomingBuffer(MAX_MTU_SIZE),
76 m_unWrappedRxSeqId(0),
77 m_lastUnexpectedSequenceId(-1),
78 m_udpTrackerCache(UDP_TRACKER_CACHE_DEPTH),
79 m_rxLargeBufferPool(),
80 m_rxSmallBufferPool(),
81 m_imageMetaCache(IMAGE_META_CACHE_DEPTH),
82 m_secondaryAppMetaCache(SECONDARY_APP_META_CACHE_DEPTH),
86 m_threadsRunning(false),
89 m_statusThreadP(NULL),
94 m_compressedImageListeners(),
95 m_secondaryAppListeners(),
100 m_timeOffsetInit(false),
102 m_networkTimeSyncEnabled(true),
103 m_ptpTimeSyncEnabled(false),
109 int result = WSAStartup (MAKEWORD (0x02, 0x02), &wsaData);
115 struct addrinfo hints, *res;
116 memset(&hints, 0,
sizeof(hints));
117 hints.ai_family = AF_INET;
118 hints.ai_socktype = 0;
120 const int addrstatus = getaddrinfo(address.c_str(), NULL, &hints, &res);
121 if (addrstatus != 0 || res == NULL)
122 CRL_EXCEPTION(
"unable to resolve \"%s\": %s", address.c_str(), strerror(errno));
125 memcpy(&addr, &(((
struct sockaddr_in *)(res->ai_addr))->sin_addr),
sizeof(in_addr));
138 uint32_t largeBufferRetry = 0;
144 largeBufferRetry = 0;
146 catch (
const std::exception &e) {
147 CRL_DEBUG(
"Failed to allocate memory (will sleep and try again): %s", e.what());
148 usleep(
static_cast<unsigned int> (10000));
156 uint32_t smallBufferRetry = 0;
162 smallBufferRetry = 0;
164 catch (
const std::exception &e) {
165 CRL_DEBUG(
"Failed to allocate memory (will sleep and try again): %s", e.what());
166 usleep(
static_cast<unsigned int> (10000));
179 }
catch (
const std::exception& e) {
204 CRL_EXCEPTION(
"failed to establish comms with the sensor at \"%s\", with remote head enum %d",
205 address.c_str(), cameraId);
220 CRL_EXCEPTION(
"failed to request version info from sensor at \"%s\"",
242 std::list<ImageListener*>::const_iterator iti;
247 std::list<LidarListener*>::const_iterator itl;
252 std::list<PpsListener*>::const_iterator itp;
257 std::list<ImuListener*>::const_iterator itm;
262 std::list<CompressedImageListener*>::const_iterator itc;
267 std::list<SecondaryAppListener*>::const_iterator its;
272 BufferPool::const_iterator it;
317 #if defined(__MINGW64__)
328 if (!ifName.empty()){
329 if (0 != setsockopt(
m_serverSocket, SOL_SOCKET, SO_BINDTODEVICE, ifName.c_str(), ifName.size())){
330 CRL_EXCEPTION(
"Failed to bind to device %s. Error: %s", ifName.c_str(),
336 CRL_DEBUG(
"User specified binding to adapter %s, but this feature is only supported under linux. Ignoring bind to specific adapter", ifName.c_str());
342 u_long ioctl_arg = 1;
344 CRL_EXCEPTION(
"failed to make a socket non-blocking: %d",WSAGetLastError ());
358 if (0 != setsockopt(
m_serverSocket, SOL_SOCKET, SO_REUSEADDR, (
char*) &reuseSocket,
359 sizeof(reuseSocket)))
368 int bufferSize = 4 * 1024 * 1024;
370 int bufferSize = 48 * 1024 * 1024;
373 if (0 != setsockopt(
m_serverSocket, SOL_SOCKET, SO_RCVBUF, (
char*) &bufferSize,
374 sizeof(bufferSize)) ||
375 0 != setsockopt(
m_serverSocket, SOL_SOCKET, SO_SNDBUF, (
char*) &bufferSize,
377 CRL_EXCEPTION(
"failed to adjust socket buffer sizes (%d bytes): %s",
378 bufferSize, strerror(errno));
383 struct sockaddr_in address;
385 address.sin_family = AF_INET;
386 address.sin_port = htons(0);
387 address.sin_addr.s_addr = htonl(INADDR_ANY);
390 CRL_EXCEPTION(
"failed to bind the server socket to system-assigned port: %s",
396 int len =
sizeof(address);
398 socklen_t len =
sizeof(address);
400 if (0 != getsockname(
m_serverSocket, (
struct sockaddr*) &address, &len))
421 header.sequenceIdentifier = InterlockedIncrement16((
short*)&
m_txSeqId);
433 #if defined(WIN32) && !defined(__MINGW64__)
434 #pragma warning (push)
435 #pragma warning (disable : 4267)
440 #if defined(WIN32) && !defined(__MINGW64__)
441 #pragma warning (pop)
444 if (
static_cast<size_t>(ret) != stream.
tell())
445 CRL_EXCEPTION(
"error sending data to sensor, %d/%d bytes written: %s",
446 ret, stream.
tell(), strerror(errno));
566 CRL_DEBUG(
"unknown API hardware type \"%d\"\n", a);
593 CRL_DEBUG(
"unknown WIRE hardware type \"%d\"\n", w);
609 CRL_DEBUG(
"unknown API imager type \"%d\"\n", a);
625 CRL_DEBUG(
"unknown WIRE imager type \"%d\"\n", w);
678 uint32_t& microseconds)
694 impl *selfP =
reinterpret_cast<impl*
>(userDataP);
720 if (ack.
wait(status, DEFAULT_ACK_TIMEOUT())) {
761 }
catch (
const std::exception& e) {
793 }
catch (
const std::exception& e) {
805 usleep(
static_cast<unsigned int> (1e6));
808 #if defined(__MINGW64__)
823 }
catch (
const std::exception& e) {
836 }
catch (
const std::exception& e) {
847 }
catch (
const std::exception& e) {
857 }
catch (
const std::exception& e) {
870 }
catch (
const std::exception& e) {
888 return "Unknown Error";
void publish(const T &message)
static CRL_CONSTEXPR uint32_t HARDWARE_REV_BCAM
static CRL_CONSTEXPR Status Status_Failed
static void assembler(utility::BufferStreamWriter &stream, const uint8_t *dataP, uint32_t offset, uint32_t length)
std::list< CompressedImageListener * > m_compressedImageListeners
static CRL_CONSTEXPR uint32_t HARDWARE_REV_MULTISENSE_S7
static CRL_CONSTEXPR Status Status_Ok
static wire::SourceType sourceApiToWire(DataSource mask)
static CRL_CONSTEXPR DataSource Source_Compressed_Aux
static CRL_CONSTEXPR uint32_t HARDWARE_REV_MULTISENSE_SL
static CRL_CONSTEXPR DataSource Source_Compressed_Rectified_Aux
wire::VersionResponse m_sensorVersion
static CRL_CONSTEXPR Status Status_Error
static CRL_CONSTEXPR SourceType SOURCE_SECONDARY_APP_DATA_3
impl(const std::string &address, const RemoteHeadChannel &cameraId, const std::string &ifName)
static CRL_CONSTEXPR DataSource Source_Luma_Rectified_Right
static CRL_CONSTEXPR DataSource Source_AprilTag_Detections
static CRL_CONSTEXPR DataSource Source_Disparity_Aux
static CRL_CONSTEXPR uint32_t IMAGER_TYPE_CMV2000_GREY
static TimeStamp getCurrentTime()
static CRL_CONSTEXPR DataSource Source_Secondary_App_Data_0
#define CRL_DEBUG(fmt,...)
std::list< PpsListener * > m_ppsListeners
VersionType firmwareVersion
static CRL_CONSTEXPR SourceType SOURCE_JPEG_LEFT
static CRL_CONSTEXPR DataSource Source_Raw_Aux
static CRL_CONSTEXPR SourceType SOURCE_CHROMA_AUX
utility::Thread * m_rxThreadP
static CRL_CONSTEXPR DataSource Source_Compressed_Left
static CRL_CONSTEXPR uint16_t HEADER_MAGIC
static void Destroy(Channel *instanceP)
static CRL_CONSTEXPR SourceType SOURCE_LUMA_AUX
static CRL_CONSTEXPR DataSource Source_Compressed_Rectified_Right
static CRL_CONSTEXPR DataSource Source_Luma_Left
static CRL_CONSTEXPR SourceType SOURCE_GROUND_SURFACE_CLASS_IMAGE
static CRL_CONSTEXPR SourceType SOURCE_RGB_LEFT
static CRL_CONSTEXPR uint32_t HARDWARE_REV_MULTISENSE_KS21
static CRL_CONSTEXPR DataSource Source_Imu
static CRL_CONSTEXPR uint32_t RX_POOL_SMALL_BUFFER_COUNT
static CRL_CONSTEXPR uint32_t HARDWARE_REV_MULTISENSE_KS21i
static CRL_CONSTEXPR DataSource Source_Disparity
static CRL_CONSTEXPR RemoteHeadChannel Remote_Head_VPB
static CRL_CONSTEXPR DataSource Source_Secondary_App_Data_3
static CRL_CONSTEXPR uint16_t HEADER_VERSION
static CRL_CONSTEXPR uint32_t HARDWARE_REV_MULTISENSE_ST21
static DataSource sourceWireToApi(wire::SourceType mask)
Type decayedAverage(Type const &previous, Type const &samples, Type const &newest)
static CRL_CONSTEXPR uint32_t HARDWARE_REV_MULTISENSE_REMOTE_HEAD_MONOCAM
static CRL_CONSTEXPR SourceType SOURCE_SECONDARY_APP_DATA_2
#define CRL_DEBUG_RAW(fmt)
static CRL_CONSTEXPR uint32_t HARDWARE_REV_MULTISENSE_REMOTE_HEAD_STEREO
static CRL_CONSTEXPR DataSource Source_Ground_Surface_Spline_Data
struct sockaddr_in m_sensorAddress
std::list< SecondaryAppListener * > m_secondaryAppListeners
BufferPool m_rxLargeBufferPool
static CRL_CONSTEXPR SourceType SOURCE_COMPRESSED_RECTIFIED_AUX
static CRL_CONSTEXPR uint32_t HARDWARE_REV_MULTISENSE_ST25
static CRL_CONSTEXPR SourceType SOURCE_CHROMA_LEFT
int32_t getSeconds() const
static CRL_CONSTEXPR DataSource Source_Chroma_Aux
static CRL_CONSTEXPR uint32_t HARDWARE_REV_MULTISENSE_S21
static CRL_CONSTEXPR SourceType SOURCE_COMPRESSED_RIGHT
static CRL_CONSTEXPR uint32_t HARDWARE_REV_MULTISENSE_KS21_SILVER
static CRL_CONSTEXPR uint32_t HARDWARE_REV_MULTISENSE_MONOCAM
static CRL_CONSTEXPR uint32_t MAX_BUFFER_ALLOCATION_RETRIES
static void * statusThread(void *userDataP)
static CRL_CONSTEXPR Status Status_Unsupported
static CRL_CONSTEXPR DataSource Source_Disparity_Right
static CRL_CONSTEXPR DataSource Source_Chroma_Left
static CRL_CONSTEXPR uint32_t HARDWARE_REV_MULTISENSE_C6S2_S27
static uint32_t hardwareApiToWire(uint32_t h)
#define CRL_EXCEPTION(fmt,...)
static CRL_CONSTEXPR SourceType SOURCE_LUMA_RECT_AUX
static CRL_CONSTEXPR DataSource Source_Compressed_Right
static CRL_CONSTEXPR DataSource Source_Compressed_Rectified_Left
static CRL_CONSTEXPR Status Status_Unknown
static CRL_CONSTEXPR SourceType SOURCE_DISPARITY
static CRL_CONSTEXPR uint32_t HARDWARE_REV_MULTISENSE_KS21_SILVER
static CRL_CONSTEXPR SourceType SOURCE_RAW_LEFT
static CRL_CONSTEXPR SourceType SOURCE_SECONDARY_APP_DATA_1
static CRL_CONSTEXPR uint32_t HARDWARE_REV_MULTISENSE_REMOTE_HEAD_MONOCAM
static CRL_CONSTEXPR uint32_t IMAGER_TYPE_AR0234_GREY
static CRL_CONSTEXPR DataSource Source_Pps
static CRL_CONSTEXPR uint32_t HARDWARE_REV_MULTISENSE_S30
static CRL_CONSTEXPR uint32_t HARDWARE_REV_MULTISENSE_S7
wire::StatusResponse m_statusResponseMessage
static CRL_CONSTEXPR uint32_t HARDWARE_REV_MULTISENSE_S7S
static const char * statusString(Status status)
static CRL_CONSTEXPR uint32_t HARDWARE_REV_MULTISENSE_SL
static CRL_CONSTEXPR SourceType SOURCE_LUMA_RECT_LEFT
static CRL_CONSTEXPR uint32_t IMAGER_TYPE_IMX104_COLOR
static CRL_CONSTEXPR uint32_t HARDWARE_REV_MULTISENSE_S21
static CRL_CONSTEXPR DataSource Source_Secondary_App_Data_5
static CRL_CONSTEXPR uint32_t HARDWARE_REV_MULTISENSE_M
static CRL_CONSTEXPR DataSource Source_Raw_Right
static CRL_CONSTEXPR SourceType SOURCE_LIDAR_SCAN
static CRL_CONSTEXPR uint32_t HARDWARE_REV_MULTISENSE_MONOCAM
utility::TimeStamp uptime
static CRL_CONSTEXPR SourceType SOURCE_DISPARITY_RIGHT
static CRL_CONSTEXPR DataSource Source_Ground_Surface_Class_Image
static CRL_CONSTEXPR SourceType SOURCE_SECONDARY_APP_DATA_0
static CRL_CONSTEXPR uint32_t IMAGER_TYPE_FLIR_TAU2
static CRL_CONSTEXPR DataSource Source_Lidar_Scan
static CRL_CONSTEXPR uint32_t HARDWARE_REV_MULTISENSE_REMOTE_HEAD_STEREO
static CRL_CONSTEXPR uint32_t IMAGER_TYPE_AR0234_GREY
static CRL_CONSTEXPR DataSource Source_Luma_Right
utility::Thread * m_statusThreadP
static CRL_CONSTEXPR uint32_t RX_POOL_SMALL_BUFFER_SIZE
static CRL_CONSTEXPR DataSource Source_Secondary_App_Data_2
static CRL_CONSTEXPR DataSource Source_Luma_Aux
static CRL_CONSTEXPR DataSource Source_Raw_Left
static CRL_CONSTEXPR SourceType SOURCE_RAW_RIGHT
static CRL_CONSTEXPR SourceType SOURCE_SECONDARY_APP_DATA_4
static CRL_CONSTEXPR uint32_t IMAGER_TYPE_CMV4000_GREY
static CRL_CONSTEXPR uint32_t HARDWARE_REV_MULTISENSE_S7S
static Channel * Create(const std::string &sensorAddress)
static CRL_CONSTEXPR uint32_t IMAGER_TYPE_FLIR_TAU2
static CRL_CONSTEXPR SourceType SOURCE_COMPRESSED_LEFT
static CRL_CONSTEXPR uint16_t HEADER_GROUP
static CRL_CONSTEXPR DataSource Source_Secondary_App_Data_4
static CRL_CONSTEXPR DataSource Source_Disparity_Cost
static CRL_CONSTEXPR uint16_t DEFAULT_SENSOR_TX_PORT
static CRL_CONSTEXPR SourceType SOURCE_LUMA_RIGHT
static CRL_CONSTEXPR uint32_t HARDWARE_REV_MONO
static CRL_CONSTEXPR SourceType SOURCE_LUMA_RECT_RIGHT
Status waitData(const T &command, U &data, const double &timeout=DEFAULT_ACK_TIMEOUT(), int32_t attempts=DEFAULT_ACK_ATTEMPTS)
uint16_t m_serverSocketPort
std::list< LidarListener * > m_lidarListeners
static CRL_CONSTEXPR uint32_t HARDWARE_REV_MONO
void bind(const std::string &ifName)
static CRL_CONSTEXPR uint32_t HARDWARE_REV_MULTISENSE_C6S2_S27
void applySensorTimeOffset(const utility::TimeStamp &offset)
static CRL_CONSTEXPR uint32_t RX_POOL_LARGE_BUFFER_SIZE
static void * rxThread(void *userDataP)
static CRL_CONSTEXPR uint32_t HARDWARE_REV_MULTISENSE_KS21i
static CRL_CONSTEXPR uint32_t IMAGER_TYPE_CMV4000_GREY
std::list< ImuListener * > m_imuListeners
std_msgs::Header const * header(const M &m)
static CRL_CONSTEXPR uint32_t HARDWARE_REV_MULTISENSE_ST21
int32_t getMicroSeconds() const
static CRL_CONSTEXPR Status Status_Exception
static CRL_CONSTEXPR DataSource Source_Jpeg_Left
static CRL_CONSTEXPR uint32_t HARDWARE_REV_MULTISENSE_S7AR
static CRL_CONSTEXPR SourceType SOURCE_COMPRESSED_AUX
Status m_getStatusReturnStatus
static CRL_CONSTEXPR uint32_t HARDWARE_REV_BCAM
static CRL_CONSTEXPR SourceType SOURCE_IMU
static CRL_CONSTEXPR uint32_t HARDWARE_REV_MULTISENSE_ST25
static CRL_CONSTEXPR DataSource Source_Chroma_Right
static uint32_t hardwareWireToApi(uint32_t h)
static CRL_CONSTEXPR SourceType SOURCE_APRILTAG_DETECTIONS
static CRL_CONSTEXPR SourceType SOURCE_LUMA_LEFT
static CRL_CONSTEXPR uint32_t IMAGER_TYPE_AR0239_COLOR
bool wait(Status &status, const double &timeout)
static CRL_CONSTEXPR SourceType SOURCE_CHROMA_RIGHT
static CRL_CONSTEXPR DataSource Source_Rgb_Left
static CRL_CONSTEXPR uint32_t RX_POOL_LARGE_BUFFER_COUNT
std::list< ImageListener * > m_imageListeners
static CRL_CONSTEXPR uint32_t IMAGER_TYPE_AR0239_COLOR
static CRL_CONSTEXPR SourceType SOURCE_COMPRESSED_RECTIFIED_LEFT
static CRL_CONSTEXPR Status Status_TimedOut
wire::PtpStatusResponse m_ptpStatusResponseMessage
static CRL_CONSTEXPR uint32_t IMAGER_TYPE_CMV4000_COLOR
static CRL_CONSTEXPR uint32_t TIME_SYNC_OFFSET_DECAY
static CRL_CONSTEXPR uint32_t HARDWARE_REV_MULTISENSE_REMOTE_HEAD_VPB
static CRL_CONSTEXPR uint32_t HARDWARE_REV_MULTISENSE_S30
static CRL_CONSTEXPR SourceType SOURCE_SECONDARY_APP_DATA_5
static CRL_CONSTEXPR uint32_t IMAGER_TYPE_CMV2000_COLOR
utility::TimeStamp m_timeOffset
static uint32_t imagerApiToWire(uint32_t h)
static CRL_CONSTEXPR SourceType SOURCE_DISPARITY_AUX
static CRL_CONSTEXPR SourceType SOURCE_DISPARITY_COST
static CRL_CONSTEXPR uint32_t HARDWARE_REV_MULTISENSE_S7AR
utility::Mutex m_timeLock
static CRL_CONSTEXPR SourceType SOURCE_PPS
static CRL_CONSTEXPR DataSource Source_Chroma_Rectified_Aux
static CRL_CONSTEXPR uint32_t HARDWARE_REV_MULTISENSE_M
int64_t getNanoSeconds() const
utility::TimeStamp sensorToLocalTime(const utility::TimeStamp &sensorTime)
static CRL_CONSTEXPR uint32_t IMAGER_TYPE_CMV2000_GREY
static CRL_CONSTEXPR IdType ID
static CRL_CONSTEXPR SourceType SOURCE_RAW_AUX
BufferPool m_rxSmallBufferPool
static CRL_CONSTEXPR SourceType SOURCE_COMPRESSED_RECTIFIED_RIGHT
int16_t RemoteHeadChannel
Status m_getPtpStatusReturnStatus
static CRL_CONSTEXPR SourceType SOURCE_GROUND_SURFACE_SPLINE_DATA
static CRL_CONSTEXPR uint32_t IMAGER_TYPE_CMV2000_COLOR
static CRL_CONSTEXPR DataSource Source_Secondary_App_Data_1
static CRL_CONSTEXPR uint32_t HARDWARE_REV_MULTISENSE_KS21
static uint32_t imagerWireToApi(uint32_t h)
static CRL_CONSTEXPR uint32_t IMAGER_TYPE_CMV4000_COLOR
static CRL_CONSTEXPR uint32_t HARDWARE_REV_MULTISENSE_REMOTE_HEAD_VPB
static CRL_CONSTEXPR uint32_t IMAGER_TYPE_IMX104_COLOR
static CRL_CONSTEXPR DataSource Source_Luma_Rectified_Left
UdpAssemblerMap m_udpAssemblerMap
static CRL_CONSTEXPR SourceType SOURCE_CHROMA_RECT_AUX
static CRL_CONSTEXPR DataSource Source_Luma_Rectified_Aux