Created
January 12, 2021 02:52
-
-
Save yuki-inaho/25a8e45b90a369d1dbe3a5bde031ed6a to your computer and use it in GitHub Desktop.
Auto Exposure setting test for See3CAM CU20
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| import os | |
| from pyudev import Context | |
| import errno | |
| import sys | |
| from select import select | |
| from time import sleep | |
| # Based on below code | |
| # https://github.com/econsysqtcam/qtcam/blob/6b9d31bb7fa9ecf619987cc1433c1ac2398706fe/src/see3cam_cu20.cpp | |
| BUFFER_LENGTH = 65 | |
| READ_FIRMWARE_VERSION = 0x40 | |
| CAMERA_CONTROL_CU20 = 0x86 | |
| SET_AE_ROI_MODE_CU20 = 0x06 | |
| GET_AE_ROI_MODE_CU20 = 0x05 | |
| GET_DENOISE_MODE_CU20 = 0x15 | |
| AutoExpCentered = 0x01 | |
| AutoExpManual = 0x02 | |
| AutoExpDisabled = 0x03 | |
| # Based on below code | |
| # https://github.com/econsystems/opencv/blob/master/Source/PythonScript/hid.py | |
| def hid_write(hid_handle, input_buffer): | |
| if input_buffer is not None: | |
| retry_count = 0 | |
| bytes_written = 0 | |
| while retry_count < 3: | |
| try: | |
| bytes_written = os.write(hid_handle, input_buffer) | |
| retry_count += 1 | |
| except IOError as e: | |
| if e.errno == errno.EPIPE: | |
| sleep(0.1) | |
| else: | |
| break | |
| if bytes_written != len(input_buffer): | |
| raise IOError(errno.EIO, 'Written %d bytes out of expected %d' % (bytes_written, len(input_buffer))) | |
| return True | |
| def hid_read(hid_handle, BUFFER_LENGTH): | |
| output_buffer = None | |
| timeout = 2000.0 | |
| rlist, wlist, xlist = select([hid_handle], [], [hid_handle], timeout) | |
| if xlist: | |
| if xlist == [hid_handle]: | |
| raise IOError(errno.EIO, 'exception on file descriptor %d' % hid_handle) | |
| if rlist: | |
| if rlist == [hid_handle]: | |
| output_buffer = os.read(hid_handle, BUFFER_LENGTH) | |
| if output_buffer is None: | |
| return b'' | |
| return output_buffer | |
| # Get CU20 hid_handler | |
| device_count = 0 | |
| for device in Context().list_devices(subsystem='hidraw'): | |
| usb_device = device.find_parent('usb', 'usb_device') | |
| if usb_device: | |
| vendor_id = usb_device.get('ID_VENDOR_ID') | |
| product_id = usb_device.get('ID_MODEL_ID') | |
| if vendor_id == '2560' and product_id == 'c120': | |
| hid_device_path = device.device_node | |
| hid_handle = os.open(hid_device_path, os.O_RDWR, os.O_NONBLOCK) | |
| # Get Firmware info | |
| input_buffer = bytearray([0] * BUFFER_LENGTH) | |
| input_buffer[0] = 0x00 | |
| input_buffer[1] = READ_FIRMWARE_VERSION | |
| hid_write(hid_handle, input_buffer) | |
| output_buffer = hid_read(hid_handle, BUFFER_LENGTH=BUFFER_LENGTH) | |
| if output_buffer[0] != READ_FIRMWARE_VERSION: | |
| print("Wrong Information is detected") | |
| SDK_VER = (output_buffer[3] << 8) + output_buffer[4] | |
| SVN_VER = (output_buffer[5] << 8) + output_buffer[6] | |
| pMajorVersion = output_buffer[1] | |
| pMinorVersion1 = output_buffer[2] | |
| print(f"Firmware Version is {pMajorVersion}.{pMinorVersion1}.{SDK_VER}.{SVN_VER}") | |
| # Try to set autoexposure setting | |
| input_buffer = bytearray([0] * BUFFER_LENGTH) | |
| input_buffer[0] = CAMERA_CONTROL_CU20 | |
| input_buffer[1] = SET_AE_ROI_MODE_CU20 | |
| input_buffer[2] = AutoExpCentered | |
| hid_write(hid_handle, input_buffer) | |
| output_buffer = hid_read(hid_handle, BUFFER_LENGTH=BUFFER_LENGTH) | |
| print(output_buffer) | |
| input_buffer = bytearray([0] * BUFFER_LENGTH) | |
| input_buffer[0] = CAMERA_CONTROL_CU20 | |
| input_buffer[1] = GET_AE_ROI_MODE_CU20 | |
| hid_write(hid_handle, input_buffer) | |
| output_buffer = hid_read(hid_handle, BUFFER_LENGTH=BUFFER_LENGTH) | |
| print(output_buffer) |
Author
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
By rewriting line 89-112 like as below, it is seems to work.