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