23 #ifdef SENSORS_MOD_AVAILABLE 
   32 #include <linux/usb/video.h>   
   33 #include <linux/uvcvideo.h>    
   34 #include <linux/videodev2.h>   
   36 #include <sys/ioctl.h>         
   49 #define cbs_xu_unit_id          0x04  
   50 #define cbs_xu_control_selector 0x02  
   52 #define ISP_CTRL_LEFT    0x80181033 
   53 #define ISP_CTRL_RIGHT   0x80181833 
   55 #define AEG_AGC_MASK_ON     0x02 
   56 #define AEG_AGC_MASK_OFF    0xFD 
   58 #define ADDR_EXP_H   0x3500 
   59 #define ADDR_EXP_M   0x3501 
   60 #define ADDR_EXP_L   0x3502 
   61 #define ADDR_GAIN_H  0x3507 
   62 #define ADDR_GAIN_M  0x3508 
   63 #define ADDR_GAIN_L  0x3509 
   65 #define XU_TASK_SET     0x50 
   66 #define XU_TASK_GET     0x51 
   67 #define XU_ISP_CTRL     0x07 
   68 #define XU_EXP_GAIN     0x25 
   70 #define UNIQUE_ID_START 0x18000 
   72 #define LINUX_CTRL_BRIGHTNESS   9963776 
   73 #define LINUX_CTRL_CONTRAST     9963777 
   74 #define LINUX_CTRL_HUE          9963779 
   75 #define LINUX_CTRL_SATURATION   9963778 
   76 #define LINUX_CTRL_GAIN         9963795 
   77 #define LINUX_CTRL_AWB          9963802 
   78 #define LINUX_CTRL_AWB_AUTO     9963788 
   79 #define LINUX_CTRL_SHARPNESS    9963803 
   80 #define LINUX_CTRL_GAMMA        9963792 
   82 #define DEFAULT_GAMMA_NOECT 1 
   83 #define DEFAULT_MIN_GAMMA   1 
   84 #define DEFAULT_MAX_GAMMA   9 
   86 #define DEFAULT_MIN_GAIN   0 
   87 #define DEFAULT_MAX_GAIN   100 
   88 #define DEFAULT_MIN_EXP    0 
   89 #define DEFAULT_MAX_EXP    100 
   92 #define GAIN_ZONE1_MIN 0 
   93 #define GAIN_ZONE1_MAX 255 
   94 #define GAIN_ZONE2_MIN 378 
   95 #define GAIN_ZONE2_MAX 511 
   96 #define GAIN_ZONE3_MIN 890 
   97 #define GAIN_ZONE3_MAX 1023 
   98 #define GAIN_ZONE4_MIN 1914 
   99 #define GAIN_ZONE4_MAX 2047 
  102 #define EXP_RAW_MAX_15FPS   1550 
  103 #define EXP_RAW_MAX_30FPS   1100 
  104 #define EXP_RAW_MAX_60FPS   880 
  105 #define EXP_RAW_MAX_100FPS  720 
  107 #define EXP_RAW_MIN         2 
  122                 "ZED Open Capture - Camera module - Version: " 
  123                 + std::to_string(mMajorVer) + 
"." 
  124                 + std::to_string(mMinorVer) + 
"." 
  125                 + std::to_string(mPatchVer);
 
  133     mGainSegMax = (GAIN_ZONE4_MAX-GAIN_ZONE4_MIN)+(GAIN_ZONE3_MAX-GAIN_ZONE3_MIN)+(GAIN_ZONE2_MAX-GAIN_ZONE2_MIN)+(GAIN_ZONE1_MAX-GAIN_ZONE1_MIN);
 
  137         mExpoureRawMax = EXP_RAW_MAX_15FPS;
 
  138     else if( mFps <= 30 )
 
  139         mExpoureRawMax = EXP_RAW_MAX_30FPS;
 
  140     else if( mFps <= 60 )
 
  141         mExpoureRawMax = EXP_RAW_MAX_60FPS;
 
  143         mExpoureRawMax = EXP_RAW_MAX_100FPS;
 
  151 void VideoCapture::reset()
 
  157     if( mGrabThread.joinable() )
 
  163     enum v4l2_buf_type type = V4L2_BUF_TYPE_VIDEO_CAPTURE;
 
  165         xioctl(mFileDesc, VIDIOC_STREAMOFF, &type);
 
  169     if( mInitialized && mBuffers)
 
  171         for (
unsigned int i = 0; i < mBufCount; ++i)
 
  172             munmap(mBuffers[i].start, mBuffers[i].length);
 
  188         delete [] mLastFrame.
data;
 
  189         mLastFrame.
data = 
nullptr;
 
  192     if( mParams.
verbose && mInitialized)
 
  194         std::string msg = 
"Device closed";
 
  195         INFO_OUT(mParams.
verbose,msg );
 
  201 void VideoCapture::checkResFps()
 
  203     mWidth = cameraResolution[
static_cast<int>(mParams.
res)].width*2;
 
  204     mHeight = cameraResolution[
static_cast<int>(mParams.
res)].height;
 
  205     mFps = 
static_cast<int>(mParams.
fps);
 
  210         WARNING_OUT(mParams.
verbose,
"RESOLUTION not supported. Using the best value");
 
  215             WARNING_OUT(mParams.
verbose,
"FPS not supported for the chosen resolution. Using the best value");
 
  221         if( mFps!=15 && mFps!=30 )
 
  223             WARNING_OUT(mParams.
verbose,
"FPS not supported for the chosen resolution. Using the best value");
 
  233         if( mFps!=15 && mFps!=30 && mFps!=60 )
 
  235             WARNING_OUT(mParams.
verbose,
"FPS not supported for the chosen resolution. Using the best value");
 
  247         if( mFps!=15 && mFps!=30 && mFps!=60 && mFps!=100)
 
  249             WARNING_OUT(mParams.
verbose,
"FPS not supported for the chosen resolution. Using the best value");
 
  264         std::string msg = std::string(
"Camera resolution: ")
 
  265                 + std::to_string(mWidth)
 
  267                 + std::to_string(mHeight)
 
  269                 + std::to_string(mFps)
 
  285         for( uint8_t 
id=0; 
id<64; 
id++ )
 
  287             opened = openCamera( 
id );
 
  293         opened = openCamera( 
static_cast<uint8_t
>(devId) );
 
  301     mInitialized = startCapture();
 
  303     if( mParams.
verbose && mInitialized)
 
  305         std::string msg = 
"Device '" + mDevName + 
"' opened";
 
  306         INFO_OUT(mParams.
verbose,msg );
 
  323 bool VideoCapture::openCamera( uint8_t devId )
 
  327     mDevName = std::string(
"/dev/video") + std::to_string(mDevId);
 
  331         std::string msg = 
"Trying to open the device '" + mDevName + 
"'";
 
  332         INFO_OUT(mParams.
verbose,msg );
 
  336     mCameraModel = getCameraModel(mDevName);
 
  342             std::string msg = 
"The device '" + mDevName + 
"' is not a Stereolabs camera";
 
  343             WARNING_OUT(mParams.
verbose,msg );
 
  353             std::string msg = 
"The FW of the device '" + mDevName + 
"' is not supported. Please update it.";
 
  354             ERROR_OUT(mParams.
verbose,msg );
 
  361     memset(&st, 0, 
sizeof (
struct stat));
 
  362     if (-1 == stat(mDevName.c_str(), &st))
 
  366             std::string msg = std::string(
"Cannot identify '") + mDevName + 
"': [" 
  367                     + std::to_string(errno) +std::string(
"] ") + std::string(strerror(errno));
 
  368             ERROR_OUT(mParams.
verbose,msg);
 
  374     if (!S_ISCHR(st.st_mode))
 
  378             std::string msg = mDevName + std::string(
" is no device");
 
  379             ERROR_OUT(mParams.
verbose,msg);
 
  387     mFileDesc = open(mDevName.c_str(), O_RDWR|O_NONBLOCK,0); 
 
  393             std::string msg = std::string(
"Cannot open '") + mDevName + 
"': [" 
  394                     + std::to_string(errno) + std::string(
"] ") + std::string(strerror(errno));
 
  395             ERROR_OUT(mParams.
verbose,msg);
 
  405         std::string msg = std::string(
"Opened camera with SN: ") + std::to_string(sn);
 
  410     struct v4l2_capability cap;
 
  411     memset(&cap, 0, 
sizeof (v4l2_capability));
 
  412     struct v4l2_cropcap cropcap;
 
  413     memset(&cropcap, 0, 
sizeof (v4l2_cropcap));
 
  414     struct v4l2_crop crop;
 
  415     memset(&crop, 0, 
sizeof (v4l2_crop));
 
  416     struct v4l2_format fmt;
 
  417     memset(&fmt, 0, 
sizeof (v4l2_format));
 
  419     if( -1==xioctl(mFileDesc, VIDIOC_QUERYCAP, &cap) )
 
  423             std::string msg = std::string(
"Cannot query capabilities of '") + mDevName + 
"': [" 
  424                     + std::to_string(errno) +std::string(
"] ") + std::string(strerror(errno));
 
  425             ERROR_OUT(mParams.
verbose,msg);
 
  431     cropcap.type = V4L2_BUF_TYPE_VIDEO_CAPTURE;
 
  434     if (0 == xioctl(mFileDesc, VIDIOC_CROPCAP, &cropcap))
 
  436         crop.type = V4L2_BUF_TYPE_VIDEO_CAPTURE;
 
  437         crop.c = cropcap.defrect; 
 
  440     fmt.type = V4L2_BUF_TYPE_VIDEO_CAPTURE;
 
  441     fmt.fmt.pix.pixelformat = V4L2_PIX_FMT_YUYV;
 
  442     fmt.fmt.pix.field = V4L2_FIELD_ANY;
 
  444     if (mWidth * mHeight != 0)
 
  446         fmt.fmt.pix.width = mWidth;
 
  447         fmt.fmt.pix.height = mHeight;
 
  450     int width_tmp = mWidth;
 
  451     int height_tmp = mHeight;
 
  454     if( -1==xioctl(mFileDesc, VIDIOC_S_FMT, &fmt) )
 
  458             std::string msg = std::string(
"Cannot set pixel format of '") + mDevName + 
"': [" 
  459                     + std::to_string(errno) +std::string(
"] ") + std::string(strerror(errno));
 
  460             ERROR_OUT(mParams.
verbose,msg);
 
  466     mWidth = fmt.fmt.pix.width;
 
  467     mHeight = fmt.fmt.pix.height;
 
  468     mChannels = fmt.fmt.pix.bytesperline / mWidth;
 
  471     if (mWidth != width_tmp || mHeight != height_tmp)
 
  473         ERROR_OUT(mParams.
verbose,
"Error setting the camera resolution");
 
  477     if( -1==input_set_framerate(mFps) )
 
  479         ERROR_OUT(mParams.
verbose,
"Error setting the camera framerate");
 
  483     mLastFrame.
width = mWidth;
 
  484     mLastFrame.
height = mHeight;
 
  487     mLastFrame.
data = 
new unsigned char[bufSize];
 
  490     struct v4l2_requestbuffers req;
 
  491     memset(&req, 0, 
sizeof (v4l2_requestbuffers));
 
  493     req.count = mBufCount;
 
  495     req.type = V4L2_BUF_TYPE_VIDEO_CAPTURE;
 
  496     req.memory = V4L2_MEMORY_MMAP;
 
  497     if( -1==xioctl(mFileDesc, VIDIOC_REQBUFS, &req) )
 
  501             std::string msg = std::string(
"Cannot request buffers for '") + mDevName + 
"': [" 
  502                     + std::to_string(errno) +std::string(
"] ") + std::string(strerror(errno));
 
  503             ERROR_OUT(mParams.
verbose,msg);
 
  510     mBuffers = (UVCBuffer*) calloc(req.count, 
sizeof(*mBuffers));
 
  512     for(mBufCount = 0; mBufCount < req.count; ++mBufCount)
 
  514         struct v4l2_buffer buf;
 
  515         memset(&buf, 0, 
sizeof (v4l2_buffer));
 
  516         buf.type = V4L2_BUF_TYPE_VIDEO_CAPTURE;
 
  517         buf.memory = V4L2_MEMORY_MMAP;
 
  518         buf.index = mBufCount;
 
  519         buf.flags = V4L2_BUF_FLAG_TIMESTAMP_MONOTONIC;
 
  520         if( -1==xioctl(mFileDesc, VIDIOC_QUERYBUF, &buf))
 
  524                 std::string msg = std::string(
"Cannot query buffer for '") + mDevName + 
"': [" 
  525                         + std::to_string(errno) +std::string(
"] ") + std::string(strerror(errno));
 
  526                 ERROR_OUT(mParams.
verbose,msg);
 
  532         mBuffers[mBufCount].
length = buf.length;
 
  534         mBuffers[mBufCount].
start =
 
  537                      PROT_READ | PROT_WRITE ,
 
  539                      mFileDesc, buf.m.offset);
 
  542     mBufCount = req.count;
 
  555     uint8_t UNIQUE_BUF[384];
 
  556     memset(UNIQUE_BUF, 0, 384);
 
  563         res = ll_SPI_FlashProgramRead(&UNIQUE_BUF[0], UNIQUE_ID_START, 64, 
true);
 
  566         if (UNIQUE_BUF[0] != 
'O') {
 
  569         if (UNIQUE_BUF[1] != 
'V') {
 
  583     if (UNIQUE_BUF[0] != 
'O') {
 
  586     if (UNIQUE_BUF[1] != 
'V') {
 
  590     ulValue = (UNIQUE_BUF[2] << 24) + (UNIQUE_BUF[3] << 16) + (UNIQUE_BUF[4] << 8) + UNIQUE_BUF[5];
 
  593     memset(buff, 0, 128);
 
  594     sprintf(buff, 
"%x", ulValue);
 
  595     return (
int) atoi(buff);
 
  598 bool VideoCapture::startCapture()
 
  601     enum v4l2_buf_type type;
 
  602     for (
unsigned int i = 0; i < mBufCount; ++i)
 
  604         struct v4l2_buffer buf = {0};
 
  605         buf.type = V4L2_BUF_TYPE_VIDEO_CAPTURE;
 
  606         buf.memory = V4L2_MEMORY_MMAP;
 
  608         if( -1==xioctl(mFileDesc, VIDIOC_QBUF, &buf) )
 
  612                 std::string msg = std::string(
"Cannot queue buffer for '") + mDevName + 
"': [" 
  613                         + std::to_string(errno) +std::string(
"] ") + std::string(strerror(errno));
 
  614                 ERROR_OUT(mParams.
verbose,msg);
 
  620     type = V4L2_BUF_TYPE_VIDEO_CAPTURE;
 
  623     int priority = V4L2_PRIORITY_RECORD;
 
  624     if( -1==xioctl(mFileDesc, VIDIOC_G_PRIORITY, &priority) )
 
  628             std::string msg = std::string(
"Cannot set priority for '") + mDevName + 
"': [" 
  629                     + std::to_string(errno) +std::string(
"] ") + std::string(strerror(errno));
 
  630             ERROR_OUT(mParams.
verbose,msg);
 
  637     if( -1==xioctl(mFileDesc, VIDIOC_STREAMON, &type) )
 
  641             std::string msg = std::string(
"Cannot start streaming for '") + mDevName + 
"': [" 
  642                     + std::to_string(errno) +std::string(
"] ") + std::string(strerror(errno));
 
  643             ERROR_OUT(mParams.
verbose,msg);
 
  650     mGrabThread = std::thread( &VideoCapture::grabThreadFunc,
this );
 
  655 int VideoCapture::input_set_framerate(
int fps)
 
  657     struct v4l2_streamparm streamparm = {0}; 
 
  659     streamparm.type = V4L2_BUF_TYPE_VIDEO_CAPTURE;
 
  660     streamparm.parm.capture.capturemode |= V4L2_CAP_TIMEPERFRAME;
 
  661     streamparm.parm.capture.timeperframe.numerator = 1;
 
  662     streamparm.parm.capture.timeperframe.denominator = fps;
 
  664     return xioctl(mFileDesc, VIDIOC_S_PARM, &streamparm);
 
  667 int VideoCapture::xioctl(
int fd, uint64_t IOCTL_X, 
void *arg)
 
  670     int tries = IOCTL_RETRY;
 
  673         ret = ioctl(fd, IOCTL_X, arg);
 
  675     } 
while (ret && tries-- &&
 
  676              ((errno == EINTR) || (errno == EAGAIN) || (errno == ETIMEDOUT)));
 
  689 SL_DEVICE VideoCapture::getCameraModel( std::string dev_name)
 
  692     int vid = 0, pid = 0;
 
  693     std::string modalias = 
"";
 
  694     std::string name = dev_name.erase(0, 5); 
 
  695     if (!(std::ifstream(
"/sys/class/video4linux/" + name + 
"/device/modalias") >> modalias))
 
  700                     std::string(
" Not a modalias : /sys/class/video4linux/")
 
  701                     + name + std::string(
"/device/modalias");
 
  702             WARNING_OUT(mParams.
verbose,msg);
 
  704         return camera_device;
 
  707     if (modalias.size() < 14 || modalias.substr(0, 5) != 
"usb:v" || modalias[9] != 
'p')
 
  711             std::string msg = std::string(
" not a modalias 2" );
 
  712             WARNING_OUT(mParams.
verbose,msg);
 
  714         return camera_device;
 
  717     if (!(std::istringstream(modalias.substr(5, 4)) >> std::hex >> vid))
 
  721             std::string msg = std::string(
"unable to read Vendor ID" );
 
  722             WARNING_OUT(mParams.
verbose,msg);
 
  726         return camera_device;
 
  729     if (!(std::istringstream(modalias.substr(10, 4)) >> std::hex >> pid))
 
  733             std::string msg = std::string(
"unable to read Product ID" );
 
  734             WARNING_OUT(mParams.
verbose,msg);
 
  737         return camera_device;
 
  741     if (pid == SL_USB_PROD_ZED_REVA && vid == SL_USB_VENDOR)
 
  743     else if (pid == SL_USB_PROD_ZED_M_REVA && vid == SL_USB_VENDOR)
 
  745     else if (pid == SL_USB_PROD_ZED_REVB && vid == SL_USB_VENDOR)
 
  747     else if (pid == SL_USB_PROD_ZED_M_REVB && vid == SL_USB_VENDOR)
 
  749     else if (pid == SL_USB_PROD_ZED_2_REVB && vid == SL_USB_VENDOR)
 
  751     else if (pid == SL_USB_PROD_ZED_2i && vid == SL_USB_VENDOR)
 
  754     return camera_device;
 
  757 void VideoCapture::grabThreadFunc()
 
  760     mStopCapture = 
false;
 
  763     struct timeval tv = {0};
 
  770     FD_SET(mFileDesc, &fds);
 
  773     select(mFileDesc + 1, &fds, 
nullptr, 
nullptr, &tv);
 
  775     struct v4l2_buffer buf;
 
  776     memset(&(buf), 0, 
sizeof (buf));
 
  777     buf.type = V4L2_BUF_TYPE_VIDEO_CAPTURE;
 
  778     buf.memory = V4L2_MEMORY_MMAP;
 
  783     int capture_frame_count = 0;
 
  787     while (!mStopCapture)
 
  792         int ret = ioctl(mFileDesc, VIDIOC_DQBUF, &buf);
 
  795         if (buf.bytesused == buf.length && ret == 0 && buf.index < mBufCount)
 
  797             mCurrentIndex = buf.index;
 
  800             uint64_t ts_uvc = ((uint64_t) buf.timestamp.tv_sec) * (1000 * 1000) + ((uint64_t) buf.timestamp.tv_usec);
 
  807 #ifdef SENSORS_MOD_AVAILABLE 
  808                 if(mSyncEnabled && mSensPtr)
 
  819             rel_ts = ts_uvc - mInitTs;
 
  824             if (mLastFrame.
data != 
nullptr && mWidth != 0 && mHeight != 0 && mBuffers[mCurrentIndex].start != 
nullptr)
 
  827                 memcpy(mLastFrame.
data, (
unsigned char*) mBuffers[mCurrentIndex].start, mBuffers[mCurrentIndex].length);
 
  828                 mLastFrame.
timestamp = mStartTs + rel_ts;
 
  836 #ifdef SENSORS_MOD_AVAILABLE 
  839                     mSensReadyToSync = 
false;
 
  844 #ifdef SENSOR_LOG_AVAILABLE 
  848                     static int frame_count =0;
 
  851                     if((++frame_count)==mLogFrameSkip)
 
  868             ioctl(mFileDesc, VIDIOC_QBUF, &buf);
 
  871             capture_frame_count++;
 
  875             if (buf.bytesused != buf.length)
 
  878                 ioctl(mFileDesc, VIDIOC_QBUF, &buf);
 
  887     mGrabRunning = 
false;
 
  893     uint64_t time_count = timeout_msec*10;
 
  906     const std::lock_guard<std::mutex> lock(mBufMutex);
 
  911 int VideoCapture::ll_VendorControl(uint8_t *buf, 
int len, 
int readMode, 
bool safe, 
bool force)
 
  916     if (!force && !mInitialized)
 
  919     unsigned char tmp[2] = {0};
 
  920     struct uvc_xu_control_query xu_query_info;
 
  921     xu_query_info.unit = cbs_xu_unit_id;
 
  922     xu_query_info.selector = cbs_xu_control_selector;
 
  923     xu_query_info.query = UVC_GET_LEN;
 
  924     xu_query_info.size = 2;
 
  925     xu_query_info.
data = tmp;
 
  927     const std::lock_guard<std::mutex> lock(mComMutex);
 
  929     int io_err = ioctl(mFileDesc, UVCIOC_CTRL_QUERY, &xu_query_info);
 
  939         len = (xu_query_info.data[1] << 8) + xu_query_info.data[0];
 
  944     struct uvc_xu_control_query xu_query_send;
 
  945     xu_query_send.unit = cbs_xu_unit_id;
 
  946     xu_query_send.selector = cbs_xu_control_selector;
 
  947     xu_query_send.query = UVC_SET_CUR;
 
  948     xu_query_send.size = 
static_cast<__u16
> (len); 
 
  949     xu_query_send.data = buf;
 
  951     io_err = ioctl(mFileDesc, UVCIOC_CTRL_QUERY, &xu_query_send);
 
  956         const char *err=
nullptr;
 
  959             err = 
"Extension unit or control not found";
 
  962             err = 
"Buffer size does not match control size";
 
  965             err = 
"Invalid request code";
 
  968             err = 
"Request not supported by control";
 
  977             std::string msg = std::string(
"CBS SET failed") +
 
  979                     std::string(
". (System code: ") +
 
  980                     std::to_string(res) +
 
  982                     std::to_string(xu_query_send.size);
 
  983             ERROR_OUT(mParams.
verbose,msg);
 
  995     if (readMode == READ_MODE) {
 
  997         struct uvc_xu_control_query xu_query;
 
  998         xu_query.unit = cbs_xu_unit_id,
 
  999                 xu_query.selector = cbs_xu_control_selector,
 
 1000                 xu_query.query = UVC_GET_CUR,
 
 1001                 xu_query.size = 
static_cast<__u16
> (len),
 
 1002                 xu_query.data = buf;
 
 1004         io_err = ioctl(mFileDesc, UVCIOC_CTRL_QUERY, &xu_query);
 
 1010             case ENOENT: err = 
"Extension unit or control not found";
 
 1012             case ENOBUFS: err = 
"Buffer size does not match control size";
 
 1014             case EINVAL: err = 
"Invalid request code";
 
 1016             case EBADRQC: err = 
"Request not supported by control";
 
 1018             default: err = strerror(res);
 
 1024                 std::string msg = std::string(
"CBS GET failed") +
 
 1026                         std::string(
". (System code: ") +
 
 1027                         std::to_string(res) +
 
 1029                         std::to_string(xu_query_send.size);
 
 1030                 ERROR_OUT(mParams.
verbose,msg);
 
 1053 int VideoCapture::ll_get_gpio_value(
int gpio_number, uint8_t *value)
 
 1055     unsigned char xu_buf[384];
 
 1056     memset(xu_buf, 0, 384);
 
 1059     xu_buf[0] = XU_TASK_GET;
 
 1061     xu_buf[2] = gpio_number;
 
 1063     int hr = ll_VendorControl(xu_buf, 384, 1);
 
 1064     *value = xu_buf[17];
 
 1074 int VideoCapture::ll_set_gpio_value(
int gpio_number, uint8_t value)
 
 1076     unsigned char xu_buf[64];
 
 1077     memset(xu_buf, 0, 64);
 
 1080     xu_buf[0] = XU_TASK_SET;
 
 1082     xu_buf[2] = gpio_number;
 
 1085     int hr = ll_VendorControl(xu_buf, 64, 0);
 
 1095 int VideoCapture::ll_set_gpio_direction(
int gpio_number, 
int direction)
 
 1097     unsigned char xu_buf[64];
 
 1098     memset(xu_buf, 0, 64);
 
 1101     xu_buf[0] = XU_TASK_SET;
 
 1103     xu_buf[2] = gpio_number;
 
 1104     xu_buf[3] = direction;
 
 1106     int hr = ll_VendorControl(xu_buf, 64, 0);
 
 1110 int VideoCapture::ll_read_system_register(uint64_t address, uint8_t *value)
 
 1112     unsigned char xu_buf[384];
 
 1113     memset(xu_buf, 0, 384);
 
 1116     xu_buf[0] = XU_TASK_GET;
 
 1122     xu_buf[5] = ((address) >> 24) & 0xff;
 
 1123     xu_buf[6] = ((address) >> 16) & 0xff;
 
 1124     xu_buf[7] = ((address) >> 8) & 0xff;
 
 1125     xu_buf[8] = (address) & 0xff;
 
 1131     int hr = ll_VendorControl(xu_buf, 384, READ_MODE);
 
 1132     *value = xu_buf[17];
 
 1136 int VideoCapture::ll_write_system_register(uint64_t address, uint8_t value)
 
 1138     unsigned char xu_buf[384];
 
 1139     memset(xu_buf, 0, 384);
 
 1142     xu_buf[0] = XU_TASK_SET;
 
 1148     xu_buf[5] = ((address) >> 24) & 0xff;
 
 1149     xu_buf[6] = ((address) >> 16) & 0xff;
 
 1150     xu_buf[7] = ((address) >> 8) & 0xff;
 
 1151     xu_buf[8] = (address) & 0xff;
 
 1158     int hr = ll_VendorControl(xu_buf, 384, 0);
 
 1162 #define ASIC_INT_NULL_I2C    0xa3 
 1163 #define ASIC_INT_I2C         0xa5 
 1165 int VideoCapture::ll_read_sensor_register(
int side, 
int sscb_id, uint64_t address, uint8_t* value)
 
 1167     unsigned char xu_buf[384];
 
 1168     memset(xu_buf, 0, 384);
 
 1172     xu_buf[0] = XU_TASK_GET;
 
 1174         xu_buf[1] = ASIC_INT_NULL_I2C;
 
 1176         xu_buf[1] = ASIC_INT_I2C;
 
 1178     xu_buf[3] = sscb_id + 1; 
 
 1181     xu_buf[5] = ((address) >> 24) & 0xff;
 
 1182     xu_buf[6] = ((address) >> 16) & 0xff;
 
 1183     xu_buf[7] = ((address) >> 8) & 0xff;
 
 1184     xu_buf[8] = (address) & 0xff;
 
 1193     xu_buf[9] = (limit >> 8) & 0xff;
 
 1194     xu_buf[10] = (limit >> 0) & 0xff;
 
 1197     xu_buf[9] = xu_buf[9] & 0x0f;
 
 1198     xu_buf[9] = xu_buf[9] | 0x10;
 
 1199     xu_buf[9] = xu_buf[9] | 0x80;
 
 1201     int hr = ll_VendorControl(xu_buf, 384, READ_MODE);
 
 1202     *value = xu_buf[17];
 
 1206 int VideoCapture::ll_write_sensor_register(
int side, 
int sscb_id, uint64_t address, uint8_t value)
 
 1209     unsigned char xu_buf[384];
 
 1210     memset(xu_buf, 0, 384);
 
 1213     xu_buf[0] = XU_TASK_SET;
 
 1215         xu_buf[1] = ASIC_INT_NULL_I2C;
 
 1217         xu_buf[1] = ASIC_INT_I2C;
 
 1219     xu_buf[3] = sscb_id + 1; 
 
 1222     xu_buf[5] = ((address) >> 24) & 0xff;
 
 1223     xu_buf[6] = ((address) >> 16) & 0xff;
 
 1224     xu_buf[7] = ((address) >> 8) & 0xff;
 
 1225     xu_buf[8] = (address) & 0xff;
 
 1239     xu_buf[9] = (limit >> 8) & 0xff;
 
 1240     xu_buf[10] = (limit >> 0) & 0xff;
 
 1243     xu_buf[9] = xu_buf[9] & 0x0f;
 
 1244     xu_buf[9] = xu_buf[9] | 0x10;
 
 1245     xu_buf[9] = xu_buf[9] | 0x80;
 
 1246     memcpy(&xu_buf[16], &value, 
sizeof (uint8_t));
 
 1247     int hr = ll_VendorControl(xu_buf, 384, 0);
 
 1252 int VideoCapture::ll_SPI_FlashProgramRead(uint8_t *pBuf, 
int Adr, 
int len, 
bool force) {
 
 1255     uint8_t xu_buf[384];
 
 1256     memset(xu_buf, 0, 384);
 
 1262     xu_buf[5] = (Adr >> 24) & 0xff;
 
 1263     xu_buf[6] = (Adr >> 16) & 0xff;
 
 1264     xu_buf[7] = (Adr >> 8) & 0xff;
 
 1265     xu_buf[8] = (Adr) & 0xff;
 
 1267     int pack_val = 36864 + len;
 
 1268     xu_buf[9] = ((pack_val) >> 8) & 0xff;
 
 1269     xu_buf[10] = ((pack_val) >> 0) & 0xff;
 
 1271     xu_buf[11] = ((len) >> 8) & 0xff;
 
 1272     xu_buf[12] = ((len) >> 0) & 0xff;
 
 1274     hr = ll_VendorControl(xu_buf, len, 1, 
true, force);
 
 1275     memcpy(pBuf, &xu_buf[17], len);
 
 1279 int VideoCapture::ll_isp_aecagc_enable(
int side, 
bool enable) {
 
 1280     uint64_t Address = 0;
 
 1284         Address = ISP_CTRL_LEFT; 
 
 1286         Address = ISP_CTRL_RIGHT; 
 
 1291     hr += ll_read_system_register(Address, &value);
 
 1295         value = value | AEG_AGC_MASK_ON;
 
 1297         value = value & AEG_AGC_MASK_OFF;
 
 1299     hr += ll_write_system_register(Address, value);
 
 1305 int VideoCapture::ll_isp_is_aecagc(
int side) {
 
 1306     uint64_t Address = 0;
 
 1311         Address = ISP_CTRL_LEFT; 
 
 1313         Address = ISP_CTRL_RIGHT; 
 
 1318     hr += ll_read_system_register(Address, &value);
 
 1322         result = ((value & AEG_AGC_MASK_ON) == AEG_AGC_MASK_ON); 
 
 1329 int VideoCapture::ll_isp_get_gain(uint8_t *val, uint8_t sensorID) {
 
 1331     uint8_t buffL, buffM, buffH;
 
 1333     hr += ll_read_sensor_register(sensorID, 1, ADDR_GAIN_H, &buffH);
 
 1334     hr += ll_read_sensor_register(sensorID, 1, ADDR_GAIN_M, &buffM);
 
 1335     hr += ll_read_sensor_register(sensorID, 1, ADDR_GAIN_L, &buffL);
 
 1344 int VideoCapture::ll_isp_set_gain(
unsigned char ucGainH, 
unsigned char ucGainM, 
unsigned char ucGainL, 
int sensorID)
 
 1347     hr += ll_write_sensor_register(sensorID, 1, ADDR_GAIN_H, ucGainH);
 
 1348     hr += ll_write_sensor_register(sensorID, 1, ADDR_GAIN_M, ucGainM);
 
 1349     hr += ll_write_sensor_register(sensorID, 1, ADDR_GAIN_L, ucGainL);
 
 1353 int VideoCapture::ll_isp_get_exposure(
unsigned char *val, 
unsigned char sensorID)
 
 1360     hr += ll_read_sensor_register(sensorID, 1, ADDR_EXP_H, (uint8_t*) & buffH);
 
 1362     hr += ll_read_sensor_register(sensorID, 1, ADDR_EXP_M, (uint8_t*) & buffM);
 
 1364     hr += ll_read_sensor_register(sensorID, 1, ADDR_EXP_L, (uint8_t*) & buffL);
 
 1373 int VideoCapture::ll_isp_set_exposure(
unsigned char ucExpH, 
unsigned char ucExpM, 
unsigned char ucExpL, 
int sensorID)
 
 1376     hr += ll_write_sensor_register(sensorID, 1, ADDR_EXP_H, ucExpH);
 
 1377     hr += ll_write_sensor_register(sensorID, 1, ADDR_EXP_M, ucExpM);
 
 1378     hr += ll_write_sensor_register(sensorID, 1, ADDR_EXP_L, ucExpL);
 
 1382 void VideoCapture::ll_activate_sync()
 
 1384     uint8_t sync_val_left = 0x0;
 
 1385     uint8_t sync_val_right = 0x0;
 
 1388     if (ll_read_sensor_register(0, 1, 0x3002, &sync_val_left) == 0)
 
 1390         sync_val_left = sync_val_left | 0x80;
 
 1392         ll_write_sensor_register(0, 1, 0x3002, sync_val_left);
 
 1395     if (ll_read_sensor_register(1, 1, 0x3002, &sync_val_right) == 0)
 
 1397         sync_val_right = sync_val_right | 0x80;
 
 1399         ll_write_sensor_register(1, 1, 0x3002, sync_val_right);
 
 1408         hr += ll_set_gpio_direction(2, 0);
 
 1409         hr += ll_set_gpio_value(2, 1);
 
 1411         hr += ll_set_gpio_direction(2, 0);
 
 1412         hr += ll_set_gpio_value(2, 0);
 
 1420     if( status==
nullptr)
 
 1426     int hr = ll_set_gpio_direction(2, 1);
 
 1427     hr += ll_get_gpio_value(2, &val);
 
 1440         bool newVal = !curVal;
 
 1443         if( ret==0 && value!=
nullptr )
 
 1452 int VideoCapture::getCameraControlSettings(
int ctrl_id)
 
 1454     struct v4l2_control control_s;
 
 1455     struct v4l2_queryctrl queryctrl;
 
 1456     memset(&queryctrl, 0, 
sizeof (queryctrl));
 
 1457     memset(&control_s, 0, 
sizeof (control_s));
 
 1461     queryctrl.id = ctrl_id;
 
 1463     if (0 != ioctl(mFileDesc, VIDIOC_QUERYCTRL, &queryctrl))
 
 1466     control_s.id = ctrl_id;
 
 1467     if (ioctl(mFileDesc, VIDIOC_G_CTRL, &control_s) == 0)
 
 1468         res = (int) control_s.value;
 
 1473 void VideoCapture::setCameraControlSettings(
int ctrl_id, 
int ctrl_val) {
 
 1474     struct v4l2_control control_s;
 
 1475     struct v4l2_queryctrl queryctrl;
 
 1476     memset(&queryctrl, 0, 
sizeof (queryctrl));
 
 1477     memset(&control_s, 0, 
sizeof (control_s));
 
 1481     queryctrl.id = ctrl_id;
 
 1485     int res = ioctl(mFileDesc, VIDIOC_QUERYCTRL, &queryctrl);
 
 1487         min = queryctrl.minimum;
 
 1488         max = queryctrl.maximum;
 
 1492         if (ctrl_id == LINUX_CTRL_GAMMA) {
 
 1493             min = DEFAULT_MIN_GAMMA;
 
 1494             max = DEFAULT_MAX_GAMMA;
 
 1504     if ((ctrl_val >= min) && (ctrl_val <= max)) {
 
 1505         control_s.id = ctrl_id;
 
 1506         control_s.value = ctrl_val;
 
 1509         if (ioctl(mFileDesc, VIDIOC_S_CTRL, &control_s) == 0)
 
 1515 void VideoCapture::resetCameraControlSettings(
int ctrl_id) {
 
 1517     struct v4l2_control control_s;
 
 1518     struct v4l2_queryctrl queryctrl;
 
 1519     memset(&queryctrl, 0, 
sizeof (queryctrl));
 
 1520     memset(&control_s, 0, 
sizeof (control_s));
 
 1523     queryctrl.id = ctrl_id;
 
 1524     ioctl(mFileDesc, VIDIOC_QUERYCTRL, &queryctrl);
 
 1525     val_def = queryctrl.default_value;
 
 1527     control_s.id = ctrl_id;
 
 1528     control_s.value = val_def;
 
 1529     ioctl(mFileDesc, VIDIOC_S_CTRL, &control_s);
 
 1533 int VideoCapture::setGammaPreset(
int side, 
int value)
 
 1538     if(value < DEFAULT_MIN_GAMMA)
 
 1539         value = DEFAULT_MIN_GAMMA;
 
 1540     if(value > DEFAULT_MAX_GAMMA)
 
 1541         value = DEFAULT_MAX_GAMMA;
 
 1543     uint64_t ulAddr = 0x80181500;
 
 1546         ulAddr = 0x80181D00;
 
 1550     for (
int i = 0; i < 15; i++) {
 
 1551         hr += ll_write_system_register(ulAddr, 
PRESET_GAMMA[value-1][i]);
 
 1553         uint8_t valRead = 0x0;
 
 1554         hr += ll_read_system_register(ulAddr, &valRead);
 
 1561     ulAddr = 0x80181510;
 
 1564         ulAddr = 0x80181D10;
 
 1565     hr += ll_write_system_register(ulAddr, 0x01);
 
 1567     uint8_t valRead = 0x0;
 
 1568     hr += ll_read_system_register(ulAddr, &valRead);
 
 1569     if (valRead != 0x01)
 
 1577     setCameraControlSettings(LINUX_CTRL_BRIGHTNESS, brightness);
 
 1582     resetCameraControlSettings(LINUX_CTRL_BRIGHTNESS);
 
 1587     return getCameraControlSettings(LINUX_CTRL_BRIGHTNESS);
 
 1592     setCameraControlSettings(LINUX_CTRL_SHARPNESS, sharpness);
 
 1597     resetCameraControlSettings(LINUX_CTRL_SHARPNESS);
 
 1602     return getCameraControlSettings(LINUX_CTRL_SHARPNESS);
 
 1607     setCameraControlSettings(LINUX_CTRL_CONTRAST, contrast);
 
 1612     resetCameraControlSettings(LINUX_CTRL_CONTRAST);
 
 1617     return getCameraControlSettings(LINUX_CTRL_CONTRAST);
 
 1622     setCameraControlSettings(LINUX_CTRL_HUE, hue);
 
 1627     resetCameraControlSettings(LINUX_CTRL_HUE);
 
 1632     return getCameraControlSettings(LINUX_CTRL_HUE);
 
 1637     setCameraControlSettings(LINUX_CTRL_SATURATION, saturation);
 
 1642     resetCameraControlSettings(LINUX_CTRL_SATURATION);
 
 1647     return getCameraControlSettings(LINUX_CTRL_SATURATION);
 
 1652     return getCameraControlSettings(LINUX_CTRL_AWB);
 
 1661     setCameraControlSettings(LINUX_CTRL_AWB, wb);
 
 1666     return (getCameraControlSettings(LINUX_CTRL_AWB_AUTO)!=0);
 
 1671     setCameraControlSettings(LINUX_CTRL_AWB_AUTO, active?1:0);
 
 1681     int current_gamma = getCameraControlSettings(LINUX_CTRL_GAMMA);
 
 1683     if (gamma!=current_gamma)
 
 1685         setGammaPreset(0,gamma);
 
 1686         setGammaPreset(1,gamma);
 
 1687         setCameraControlSettings(LINUX_CTRL_GAMMA, gamma);
 
 1693     int def_value = DEFAULT_GAMMA_NOECT;
 
 1694     setGammaPreset(0,def_value);
 
 1695     setGammaPreset(1,def_value);
 
 1696     setCameraControlSettings(LINUX_CTRL_GAMMA, def_value);
 
 1700     return getCameraControlSettings(LINUX_CTRL_GAMMA);
 
 1706     res += ll_isp_aecagc_enable(0, active);
 
 1707     res += ll_isp_aecagc_enable(1, active);
 
 1713     int resL = ll_isp_is_aecagc(0);
 
 1714     int resR = ll_isp_is_aecagc(1);
 
 1715     return (resL && resR);
 
 1733     if((x+w)>(mWidth/2) || (y+h)>mHeight)
 
 1742     int x_start_high = x / 256;
 
 1743     int x_start_low = (x - x_start_high * 256);
 
 1744     int y_start_high = y / 256;
 
 1745     int y_start_low = (y - x_start_high * 256);
 
 1746     int w_start_high = w / 256;
 
 1747     int w_start_low = (w - x_start_high * 256);
 
 1748     int h_start_high = h / 256;
 
 1749     int h_start_low = (h - x_start_high * 256);
 
 1752     uint32_t ulAddr = 0x801810C0;
 
 1753     if (
static_cast<int>(side)==1)
 
 1756     int r = ll_write_system_register(ulAddr,
static_cast<uint8_t
>(x_start_high));ulAddr++;usleep(100);
 
 1757     r += ll_write_system_register(ulAddr,
static_cast<uint8_t
>(x_start_low));ulAddr++;usleep(100);
 
 1758     r += ll_write_system_register(ulAddr,
static_cast<uint8_t
>(y_start_high));ulAddr++;usleep(100);
 
 1759     r += ll_write_system_register(ulAddr,
static_cast<uint8_t
>(y_start_low));ulAddr++;usleep(100);
 
 1760     r += ll_write_system_register(ulAddr,
static_cast<uint8_t
>(w_start_high));ulAddr++;usleep(100);
 
 1761     r += ll_write_system_register(ulAddr,
static_cast<uint8_t
>(w_start_low));ulAddr++;usleep(100);
 
 1762     r += ll_write_system_register(ulAddr,
static_cast<uint8_t
>(h_start_high));ulAddr++;usleep(100);
 
 1763     r += ll_write_system_register(ulAddr,
static_cast<uint8_t
>(h_start_low));ulAddr++;usleep(100);
 
 1775     uint8_t x_start_high = 0;
 
 1776     uint8_t x_start_low = 0;
 
 1777     uint8_t y_start_high =0;
 
 1778     uint8_t y_start_low = 0;
 
 1779     uint8_t w_start_high =0;
 
 1780     uint8_t w_start_low = 0;
 
 1781     uint8_t h_start_high = 0;
 
 1782     uint8_t h_start_low = 0;
 
 1783     uint32_t ulAddr = 0x801810C0;
 
 1784     if (
static_cast<int>(side)==1)
 
 1786     int r =  ll_read_system_register(ulAddr,&x_start_high);ulAddr++;usleep(100);
 
 1787     r +=  ll_read_system_register(ulAddr,&x_start_low);ulAddr++;usleep(100);
 
 1788     r +=   ll_read_system_register(ulAddr,&y_start_high);ulAddr++;usleep(100);
 
 1789     r +=   ll_read_system_register(ulAddr,&y_start_low);ulAddr++;usleep(100);
 
 1790     r +=   ll_read_system_register(ulAddr,&w_start_high);ulAddr++;usleep(100);
 
 1791     r +=   ll_read_system_register(ulAddr,&w_start_low);ulAddr++;usleep(100);
 
 1792     r +=   ll_read_system_register(ulAddr,&h_start_high);ulAddr++;usleep(100);
 
 1793     r +=   ll_read_system_register(ulAddr,&h_start_low);ulAddr++;usleep(100);
 
 1795     x = x_start_high*256 + x_start_low;
 
 1796     y = y_start_high*256 + y_start_low;
 
 1797     w = w_start_high*256 + w_start_low;
 
 1798     h = h_start_high*256 + h_start_low;
 
 1808     if (gain <= DEFAULT_MIN_GAIN)
 
 1809         gain = DEFAULT_MIN_GAIN;
 
 1810     else if (gain >= DEFAULT_MAX_GAIN)
 
 1811         gain = DEFAULT_MAX_GAIN;
 
 1813     uint8_t ucGainH=0, ucGainM=0, ucGainL=0;
 
 1815     int rawGain = calcRawGainValue(gain);
 
 1817     int sensorId = 
static_cast<int>(cam);
 
 1819     ucGainM = (rawGain >> 8) & 0xff;
 
 1820     ucGainL = rawGain & 0xff;
 
 1821     ll_isp_set_gain(ucGainH, ucGainM, ucGainL, sensorId);
 
 1832     int sensorId = 
static_cast<int>(cam);
 
 1833     int r = ll_isp_get_gain(val, sensorId);
 
 1837     rawGain = (int) ((val[1] << 8) + val[0]);
 
 1838     return calcGainValue(rawGain);
 
 1843     unsigned char ucExpH, ucExpM, ucExpL;
 
 1848     if(exposure < DEFAULT_MIN_EXP)
 
 1849         exposure = DEFAULT_MIN_EXP;
 
 1850     if(exposure > DEFAULT_MAX_EXP)
 
 1851         exposure = DEFAULT_MAX_EXP;
 
 1853     int rawExp = (mExpoureRawMax * ((float) exposure / 100.0));
 
 1854     if(rawExp<EXP_RAW_MIN)
 
 1855         rawExp = EXP_RAW_MIN;
 
 1859     int sensorId = 
static_cast<int>(cam);
 
 1861     ucExpH = (rawExp >> 12) & 0xff;
 
 1862     ucExpM = (rawExp >> 4) & 0xff;
 
 1863     ucExpL = (rawExp << 4) & 0xf0;
 
 1864     ll_isp_set_exposure(ucExpH, ucExpM, ucExpL, sensorId);
 
 1871     unsigned char val[3];
 
 1874     int sensorId = 
static_cast<int>(cam);
 
 1876     int r = ll_isp_get_exposure(val, sensorId);
 
 1879     rawExp = (int) ((val[2] << 12) + (val[1] << 4) + (val[0] >> 4));
 
 1883     int exposure = 
static_cast<int>(std::round((100.0*rawExp)/mExpoureRawMax));
 
 1887 int VideoCapture::calcRawGainValue(
int gain) {
 
 1890     int segmentedGain = 
static_cast<int>(std::round(mGainSegMax * (
static_cast<double>(gain) / 100.0)));
 
 1894     int gainZone1nbVal = GAIN_ZONE1_MAX - GAIN_ZONE1_MIN;
 
 1895     int gainZone2nbVal = GAIN_ZONE2_MAX - GAIN_ZONE2_MIN;
 
 1896     int gainZone3nbVal = GAIN_ZONE3_MAX - GAIN_ZONE3_MIN;
 
 1897     int gainZone4nbVal = GAIN_ZONE4_MAX - GAIN_ZONE4_MIN;
 
 1899     if (segmentedGain <= gainZone1nbVal)
 
 1900         rawGain = segmentedGain + GAIN_ZONE1_MIN;
 
 1901     else if (segmentedGain <= gainZone1nbVal + gainZone2nbVal)
 
 1902         rawGain = segmentedGain + GAIN_ZONE2_MIN - (gainZone1nbVal);
 
 1903     else if (segmentedGain <= gainZone1nbVal + gainZone2nbVal + gainZone3nbVal)
 
 1904         rawGain = segmentedGain + GAIN_ZONE3_MIN - (gainZone1nbVal + gainZone2nbVal);
 
 1905     else if (segmentedGain <= gainZone1nbVal + gainZone2nbVal + gainZone3nbVal + gainZone4nbVal)
 
 1906         rawGain = segmentedGain + GAIN_ZONE4_MIN - (gainZone1nbVal + gainZone2nbVal + gainZone3nbVal);
 
 1912 int VideoCapture::calcGainValue(
int rawGain)
 
 1917     int gainZone1nbVal = GAIN_ZONE1_MAX - GAIN_ZONE1_MIN;
 
 1918     int gainZone2nbVal = GAIN_ZONE2_MAX - GAIN_ZONE2_MIN;
 
 1919     int gainZone3nbVal = GAIN_ZONE3_MAX - GAIN_ZONE3_MIN;
 
 1920     if (rawGain >= GAIN_ZONE1_MIN && rawGain <= GAIN_ZONE1_MAX)
 
 1921         segmentedGain = rawGain - GAIN_ZONE1_MIN;
 
 1922     else if (rawGain >= GAIN_ZONE2_MIN && rawGain <= GAIN_ZONE2_MAX)
 
 1923         segmentedGain = rawGain - GAIN_ZONE2_MIN + gainZone1nbVal;
 
 1924     else if (rawGain >= GAIN_ZONE3_MIN && rawGain <= GAIN_ZONE3_MAX)
 
 1925         segmentedGain = rawGain - GAIN_ZONE3_MIN + gainZone1nbVal + gainZone2nbVal;
 
 1926     else if (rawGain >= GAIN_ZONE4_MIN && rawGain <= GAIN_ZONE4_MAX)
 
 1927         segmentedGain = rawGain - GAIN_ZONE4_MIN + gainZone1nbVal + gainZone2nbVal + gainZone3nbVal;
 
 1933     int gain = 
static_cast<int>(std::round((100.0*segmentedGain)/mGainSegMax));
 
 1938 #ifdef SENSOR_LOG_AVAILABLE 
 1944         if(mLogFileLeft.is_open())
 
 1946             mLogFileLeft.close();
 
 1948         if(mLogFileRight.is_open())
 
 1950             mLogFileRight.close();
 
 1955     mLogFrameSkip = frame_skip;
 
 1957     mLogFilenameLeft = getCurrentDateTime(DATE);
 
 1958     mLogFilenameLeft += 
"_";
 
 1959     mLogFilenameLeft += getCurrentDateTime(TIME);
 
 1960     mLogFilenameLeft += 
"_agc_aec_registers-LEFT.csv";
 
 1962     mLogFilenameRight = getCurrentDateTime(DATE);
 
 1963     mLogFilenameRight += 
"_";
 
 1964     mLogFilenameRight += getCurrentDateTime(TIME);
 
 1965     mLogFilenameRight += 
"_agc_aec_registers-RIGHT.csv";
 
 1967     mLogFileLeft.open(mLogFilenameLeft, std::ofstream::out );
 
 1968     mLogFileRight.open(mLogFilenameRight, std::ofstream::out );
 
 1970     if(mLogFileLeft.bad())
 
 1972         std::cerr << 
"Logging not started. Error creating the log file: '" << mLogFilenameLeft << 
"'" << std::endl;
 
 1977     if(mLogFileRight.bad())
 
 1979         std::cerr << 
"Logging not started. Error creating the log file: '" << mLogFilenameRight << 
"'" << std::endl;
 
 1981         mLogFileLeft.close();
 
 1985     mLogFileLeft << 
"TIMESTAMP" << LOG_SEP;
 
 1986     mLogFileLeft << 
"OV580-ISP_EN_HIGH" << LOG_SEP;
 
 1987     mLogFileLeft << 
"OV580-yavg_low" << LOG_SEP;
 
 1988     mLogFileLeft << 
"OV580-yavg_high" << LOG_SEP;
 
 1989     mLogFileLeft << 
"OV580-interrupt_ctrl1";
 
 1991     mLogFileRight << 
"TIMESTAMP" << LOG_SEP;
 
 1992     mLogFileRight << 
"OV580-ISP_EN_HIGH" << LOG_SEP;
 
 1993     mLogFileRight << 
"OV580-yavg_low" << LOG_SEP;
 
 1994     mLogFileRight << 
"OV580-yavg_high" << LOG_SEP;
 
 1995     mLogFileRight << 
"OV580-interrupt_ctrl1";
 
 1997     for (
int addr = 0x00; addr <= 0x22; ++addr)
 
 1999         mLogFileLeft << LOG_SEP << 
"OV580-YAVG[0x" << std::hex << std::setfill(
'0') << std::setw(2) << addr << 
"]";
 
 2000         mLogFileRight << LOG_SEP << 
"OV580-YAVG[0x" << std::hex << std::setfill(
'0') << std::setw(2) << addr << 
"]";
 
 2003     for (
int addr = 0x3500; addr <= 0x3515; ++addr)
 
 2005         mLogFileLeft << LOG_SEP << 
"OV4689-GAIN_EXP[0x" << std::hex << std::setfill(
'0') << std::setw(4) << addr << 
"]";
 
 2006         mLogFileRight << LOG_SEP << 
"OV4689-GAIN_EXP[0x" << std::hex << std::setfill(
'0') << std::setw(4) << addr << 
"]";
 
 2009     mLogFileLeft << std::endl;
 
 2010     mLogFileRight << std::endl;
 
 2020     unsigned long long ulAddr2 = 0x80181080;
 
 2023          ulAddr2 = 0x80181880;
 
 2025     unsigned char ulValue2 =c?128:0;
 
 2026     ll_write_system_register(ulAddr2,ulValue2);
 
 2032     std::ofstream logFile;
 
 2033     logFile.open(filename,std::ofstream::out);
 
 2035     unsigned long long ulAddrL =  0x80181000;
 
 2036     unsigned long long   ulAddrR =  0x80181800;
 
 2038     for (
int p = 0;p<0x800;p++)
 
 2041         res += ll_read_system_register( ulAddrL+p, &valL);
 
 2042         res += ll_read_system_register( ulAddrR+p, &valR);
 
 2044         logFile <<
"0x" << std::hex << std::setfill('0') << std::setw(8) << static_cast<unsigned long long>(ulAddrL+p)<<
" , "<<std::hex << std::setfill('0') << std::setw(2) << static_cast<unsigned long long>(valL)<<
" , "<<std::hex << std::setfill('0') << std::setw(2) << static_cast<unsigned long long>(valR)<<std::endl;
 
 2053     std::ofstream logFile;
 
 2054     logFile.open(filename,std::ofstream::out);
 
 2057     for (
int addr = 0x3000; addr <= 0x6000; ++addr)
 
 2060         res += ll_read_sensor_register( 0, 1, addr, &valL);
 
 2061         res += ll_read_sensor_register( 1, 1, addr, &valR);
 
 2064         logFile <<
"0x" << std::hex << std::setfill('0') << std::setw(8) << static_cast<int>(addr)<<
" , "<<std::hex << std::setfill('0') << std::setw(2) << static_cast<unsigned long long>(valL)<<
" , "<<std::hex << std::setfill('0') << std::setw(2) << static_cast<unsigned long long>(valR)<<std::endl;
 
 2070 void VideoCapture::saveLogDataLeft()
 
 2072     const int reg_count = 61;
 
 2073     uint8_t values[reg_count];
 
 2077     res += ll_read_system_register( 0x80181002, &values[idx++]);
 
 2078     res += ll_read_system_register( 0x80181031, &values[idx++]);
 
 2079     res += ll_read_system_register( 0x80181032, &values[idx++]);
 
 2080     res += ll_read_system_register( 0x80181033, &values[idx++]);
 
 2082     for(
int reg_addr = 0x00; reg_addr <= 0x22; ++reg_addr)
 
 2084         uint64_t addr = 0x801810C0+reg_addr;
 
 2085         res += ll_read_system_register( addr, &values[idx++]);
 
 2088     for (
int addr = 0x3500; addr <= 0x3515; ++addr)
 
 2090         res += ll_read_sensor_register( 0, 1, addr, &values[idx++]);
 
 2093     mLogFileLeft << std::dec << mLastFrame.
timestamp << LOG_SEP;
 
 2094     for(
int i=0; i<reg_count; i++)
 
 2096         mLogFileLeft << 
"0x" << std::hex << std::setfill('0') << std::setw(2) << static_cast<int>(values[i]);
 
 2097         if(i==(reg_count-1))
 
 2098             mLogFileLeft << std::endl;
 
 2100             mLogFileLeft << LOG_SEP;
 
 2104 void VideoCapture::saveLogDataRight()
 
 2106     const int reg_count = 61;
 
 2107     uint8_t values[reg_count];
 
 2111     res += ll_read_system_register( 0x80181802, &values[idx++]);
 
 2112     res += ll_read_system_register( 0x80181831, &values[idx++]);
 
 2113     res += ll_read_system_register( 0x80181832, &values[idx++]);
 
 2114     res += ll_read_system_register( 0x80181833, &values[idx++]);
 
 2116     for(
int reg_addr = 0x00; reg_addr <= 0x22; ++reg_addr)
 
 2118         uint64_t addr = 0x801818C0+reg_addr;
 
 2119         res += ll_read_system_register( addr, &values[idx++]);
 
 2122     for (
int addr = 0x3500; addr <= 0x3515; ++addr)
 
 2124         res += ll_read_sensor_register( 1, 1, addr, &values[idx++]);
 
 2127     mLogFileRight << std::dec << mLastFrame.
timestamp << LOG_SEP;
 
 2128     for(
int i=0; i<reg_count; i++)
 
 2130         mLogFileRight << 
"0x" << std::hex << std::setfill('0') << std::setw(2) << static_cast<int>(values[i]);
 
 2131         if(i==(reg_count-1))
 
 2132             mLogFileRight << std::endl;
 
 2134             mLogFileRight << LOG_SEP;
 
 2141     res += ll_write_sensor_register( 0, 1, 0x3503, 0x04);
 
 2142     res += ll_write_sensor_register( 1, 1, 0x3503, 0x04);
 
 2143     res += ll_write_sensor_register( 0, 1, 0x3505, 0x00);
 
 2144     res += ll_write_sensor_register( 1, 1, 0x3505, 0x00);
 
 2150 #ifdef SENSORS_MOD_AVAILABLE 
 2159     mSyncEnabled = 
true;
 
The SensorCapture class provides sensor grabbing functions for the Stereolabs ZED Mini and ZED2 camer...
 
void updateTimestampOffset(uint64_t frame_ts)
Called by VideoCapture to update timestamp offset.
 
void setVideoPtr(video::VideoCapture *videoPtr)
Called by VideoCapture to set the pointer to it.
 
void setStartTimestamp(uint64_t start_ts)
Called by VideoCapture to sync timestamps reference point.
 
void setHue(int hue)
Set the Hue value.
 
int getBrightness()
Get the Brightness value.
 
bool setROIforAECAGC(CAM_SENS_POS side, uint16_t x, uint16_t y, uint16_t w, uint16_t h)
Set Region Of Interest (ROI) for AECAGC control.
 
void resetBrightness()
Reset the Brightness value to default value.
 
const Frame & getLastFrame(uint64_t timeout_msec=100)
Get the last received camera image.
 
int getSharpness()
Get the Sharpness value.
 
int setLEDstatus(bool status)
Set the status of the camera led.
 
void resetGamma()
Reset the Gamma value to default value.
 
void resetHue()
Reset the Hue value to default value.
 
int getLEDstatus(bool *status)
Get the status of the camera led.
 
void setSaturation(int saturation)
Set the Saturation value.
 
int getGain(CAM_SENS_POS cam)
Get the current Gain value.
 
void saveAllSensorsRegisters(std::string filename)
Save all sensors ctrl register.
 
void resetAutoWhiteBalance()
Reset the automatic White Balance control value to default value.
 
void saveAllISPRegisters(std::string filename)
Save all ISP camera registers into a file.
 
int getSaturation()
Get the Saturation value.
 
int getHue()
Get the Hue value.
 
void resetSharpness()
Reset the Sharpness value to default value.
 
bool getAutoWhiteBalance()
Get the status of the automatic White Balance control.
 
int getGamma()
Get the Gamma value.
 
int getWhiteBalance()
Get the White Balance value.
 
void setSharpness(int sharpness)
Set the Sharpness value.
 
void setWhiteBalance(int wb)
Set the White Balance value (disable auto White Balance if active)
 
void setExposure(CAM_SENS_POS cam, int exposure)
Set the Exposure value (disable Exposure and Gain control if active)
 
VideoCapture(VideoParams params=VideoParams())
The default constructor.
 
bool initializeVideo(int devId=-1)
Open a ZED camera using the specified ID or searching for the first available.
 
void setContrast(int contrast)
Set the Contrast value.
 
int setAECAGC(bool active)
Enable/Disable the automatic Exposure and Gain control.
 
int getContrast()
Get the Contrast value.
 
bool enableAecAgcSensLogging(bool enable, int frame_skip=10)
Start logging to file of AEG/AGC camera registers.
 
void resetSaturation()
Reset the Saturation value to default value.
 
void resetAECAGC()
Reset the automatic Exposure and Gain control value to default value.
 
virtual ~VideoCapture()
The class destructor.
 
int getExposure(CAM_SENS_POS cam)
Get the current Exposure value.
 
bool enableSensorSync(sensors::SensorCapture *sensCap=nullptr)
Enable synchronizations between Camera frame and Sensors timestamps.
 
bool getROIforAECAGC(CAM_SENS_POS side, uint16_t &x, uint16_t &y, uint16_t &w, uint16_t &h)
Get the coordinates of the current ROI for AECAGC control.
 
bool resetAGCAECregisters()
 
void setGamma(int gamma)
Set the Gamma value.
 
void setBrightness(int brightness)
Set the Brightness value.
 
bool getAECAGC()
Get the status of the automatic Exposure and Gain control.
 
void setAutoWhiteBalance(bool active)
Enable/Disable the automatic White Balance control.
 
void setGain(CAM_SENS_POS cam, int gain)
Set the Gain value (disable Exposure and Gain control if active)
 
bool resetROIforAECAGC(CAM_SENS_POS side)
Reset the ROI for AECAGC control.
 
int getSerialNumber()
Retrieve the serial number of the connected camera.
 
void resetContrast()
Reset the Contrast value to default value.
 
void setColorBars(int side, bool c)
Utils fct to set Color Bars on Image.
 
int toggleLED(bool *value)
Toggle the status of the camera led.
 
uint64_t getWallTimestamp()
Get the current system clock as wall clock (it can have jumps if the system clock is updated by a syn...
 
CAM_SENS_POS
Position of the Camera CMOS sensors.
 
const unsigned char PRESET_GAMMA[9][16]
 
@ ZED_M_CBS
ZED Mini new FW.
 
The Frame struct containing the acquired video frames.
 
uint64_t timestamp
Timestamp in nanoseconds.
 
uint16_t height
Frame height.
 
uint64_t frame_id
Increasing index of frames.
 
uint8_t channels
Number of channels per pixel.
 
uint16_t width
Frame width.
 
uint8_t * data
Frame data in YUV 4:2:2 format.
 
size_t length
Size of the buffer.
 
void * start
Address of the first byte of the buffer.
 
The camera configuration parameters.
 
RESOLUTION res
Camera resolution.
 
FPS fps
Frames per second.
 
sl_oc::video::VideoParams params