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