Skip to content

Instantly share code, notes, and snippets.

@yuki-inaho
Created January 12, 2021 02:52
Show Gist options
  • Select an option

  • Save yuki-inaho/25a8e45b90a369d1dbe3a5bde031ed6a to your computer and use it in GitHub Desktop.

Select an option

Save yuki-inaho/25a8e45b90a369d1dbe3a5bde031ed6a to your computer and use it in GitHub Desktop.
Auto Exposure setting test for See3CAM CU20
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)
@yuki-inaho

yuki-inaho commented Jan 13, 2021

Copy link
Copy Markdown
Author

By rewriting line 89-112 like as below, it is seems to work.

# Try to set autoexposure setting
input_buffer = bytearray([0] * BUFFER_LENGTH)
input_buffer[1] = CAMERA_CONTROL_CU20
input_buffer[2] = SET_AE_ROI_MODE_CU20
input_buffer[3] = AutoExpCentered
hid_write(hid_handle, input_buffer)
output_buffer = hid_read(hid_handle, BUFFER_LENGTH=BUFFER_LENGTH)
if output_buffer[6] == 0x00:
    print("\nSet AE Failed")
elif output_buffer[0] == CAMERA_CONTROL_CU20 and output_buffer[1] == SET_AE_ROI_MODE_CU20 and output_buffer[6] == SUCCESS:
    print("\nSet AE ROI Success")


input_buffer = bytearray([0] * BUFFER_LENGTH)
input_buffer[1] = CAMERA_CONTROL_CU20
input_buffer[2] = GET_AE_ROI_MODE_CU20
hid_write(hid_handle, input_buffer)
output_buffer = hid_read(hid_handle, BUFFER_LENGTH=BUFFER_LENGTH)
if output_buffer[6] == 0x00:
    print("\nGet AE ROI Failed")
elif output_buffer[0] == CAMERA_CONTROL_CU20 and output_buffer[1] == GET_AE_ROI_MODE_CU20 and output_buffer[6] == SUCCESS:
    print("\nGet AE ROI Success")
    print("RoI Mode (1-Auto/2-Manual): {}".format(output_buffer[2]))
    print("Window Size Setting (valid only in manual mode): {}".format(output_buffer[5]))
Firmware Version is 1.10.131.1692

Set AE ROI Success

Get AE ROI Success
RoI Mode (1-Auto/2-Manual): 1
Window Size Setting (valid only in manual mode): 0

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment