From 8c9c7d190ed56a045aa6584bbca11bfa271379d1 Mon Sep 17 00:00:00 2001 From: Daniel Calaver Date: Thu, 30 Jun 2022 02:41:15 +0300 Subject: [PATCH 1/5] enable IMU --- test_ui.py | 59 +++++++++++++++++++++++++++++++++++------------------- 1 file changed, 38 insertions(+), 21 deletions(-) diff --git a/test_ui.py b/test_ui.py index ecc4c69e1..238e6aba4 100755 --- a/test_ui.py +++ b/test_ui.py @@ -152,15 +152,12 @@ def __init__(self): self.imu = self.pipeline.create(dai.node.IMU) self.xoutIMU = self.pipeline.create(dai.node.XLinkOut) self.xoutIMU.setStreamName("IMU") - if 'lite' in test_type: - self.imu.enableFirmwareUpdate(True) + self.imu.enableFirmwareUpdate(True) self.imu.enableIMUSensor(dai.IMUSensor.ACCELEROMETER_RAW, 500) self.imu.setBatchReportThreshold(1) self.imu.setMaxBatchReports(10) self.imu.out.link(self.xoutIMU.input) - - self.videoEnc = self.pipeline.create(dai.node.VideoEncoder) self.camRgb.video.link(self.videoEnc.input) self.xoutJpeg = self.pipeline.create(dai.node.XLinkOut) @@ -957,7 +954,7 @@ def setupUi(self): self.update_imu = True self.timer = QtCore.QTimer() self.timer.timeout.connect(self.set_result) - self.timer.start(1000//FPS) + self.timer.start(100) # self.connect_timer = QtCore.QTimer() # self.connect_timer.connect(test_connexion) @@ -965,6 +962,8 @@ def setupUi(self): self.threadpool = QThreadPool() self.scanning = False + self.last_progress_val = 0.0 + self.cycle = 0 def retranslateUi(self, UI_tests): _translate = QtCore.QCoreApplication.translate @@ -1076,11 +1075,11 @@ def connexion_slot(self, signal): self.print_logs('No camera detected, check the connexion and try again...', 'ERROR') return self.print_logs('Camera connected, starting tests...', 'GREEN') - # self.connect_but.setText("FLASHING") - # self.connect_but.adjustSize() - # self.connect_but.setChecked(False) - # self.connect_but.setCheckable(False) - # self.connect_but.setEnabled(False) + self.connect_but.setText("FLASHING") + self.connect_but.adjustSize() + self.connect_but.setChecked(False) + self.connect_but.setCheckable(False) + self.connect_but.setEnabled(False) # Update BL if PoE # if test_type == 'OAK-D-PRO-POE': eeprom_written = False @@ -1093,7 +1092,12 @@ def connexion_slot(self, signal): usbBootHeader = [77, 65, 50, 120, 176, 0, 0, 0, 128, 10, 0, 0, 0, 0, 0, 0, 0, 58, 32, 95, 6, 0, 0, 0, 0] self.print_logs('NOR flash: writing USB boot header...') - device.flashWrite(usbBootHeader) + try: + device.flashWrite(usbBootHeader) + except RuntimeError as ex: + self.print_logs(f'SPI Flash failed! - {ex}', log_level='ERROR') + self.update_imu = False + return self.print_logs('Programmed, data: '+ str(device.flashRead(len(usbBootHeader)))) if not eeprom_written: @@ -1107,18 +1111,19 @@ def connexion_slot(self, signal): except RuntimeError as ex: self.print_logs(f"Something went wrong, check connexion! - {ex}", log_level='ERROR') + self.update_imu = False return # self.update_imu = True - # if imu_upgrade: - # self.depth_camera.device.setLogLevel(dai.LogLevel.INFO) - # self.depth_camera.device.addLogCallback(self.logMonitorImuFwUpdateCallback) - # else: - self.connect_but.setChecked(False) - self.connect_but.setCheckable(True) - self.connect_but.setEnabled(True) - self.connect_but.setText('DISCONNECT AND SAVE') - self.connect_but.adjustSize() - self.update_imu = True + if imu_upgrade: + self.depth_camera.device.setLogLevel(dai.LogLevel.INFO) + self.depth_camera.device.addLogCallback(self.logMonitorImuFwUpdateCallback) + else: + self.connect_but.setChecked(False) + self.connect_but.setCheckable(True) + self.connect_but.setEnabled(True) + self.connect_but.setText('DISCONNECT AND SAVE') + self.connect_but.adjustSize() + self.update_imu = True location = WIDTH, 0 self.rgb = Camera(lambda: self.depth_camera.get_image('RGB'), colorMode, 'RGB Preview', location) self.rgb.show() @@ -1153,6 +1158,13 @@ def connexion_slot(self, signal): def set_result(self): global update_res + if not self.connect_but.isCheckable() and self.prog_bar.value() == self.last_progress_val: + self.cycle += 1 + else: + self.cycle = 0 + self.last_progress_val = self.prog_bar.value() + if self.cycle >= 100: + self.update_imu = False if not self.update_imu: self.connect_but.setChecked(False) self.connect_but.setCheckable(True) @@ -1319,6 +1331,11 @@ def logMonitorImuFwUpdateCallback(self, msg): self.update_imu = False if 'IMU firmware update failed' in msg.payload: + if "Your board likely doesn't have IMU!" in msg.payload: + self.print_logs_trigger.emit('IMU Upgrade not supported') + self.prog_label.setText('SKIP IMU') + self.update_imu = False + return self.prog_label.setText('IMU FAIL') self.update_prog_bar(0.0) self.print_logs_trigger.emit(f'FAILED updating IMU!') From eaefda70091e0109b91e0c2d93613131386f537e Mon Sep 17 00:00:00 2001 From: Daniel Calaver Date: Sat, 16 Jul 2022 03:18:06 +0300 Subject: [PATCH 2/5] WIP IMU testing --- test_ui.py | 25 ++++++++++++++++++++++--- 1 file changed, 22 insertions(+), 3 deletions(-) diff --git a/test_ui.py b/test_ui.py index 238e6aba4..ba2579318 100755 --- a/test_ui.py +++ b/test_ui.py @@ -110,7 +110,7 @@ def clear_test_results(): update_res = True imu_upgrade = True -class DepthAICamera(): +class DepthAICamera() : def __init__(self): global update_res self.pipeline = dai.Pipeline() @@ -290,8 +290,19 @@ def start_queue(self): self.qJpeg = self.device.getOutputQueue(name="jpeg", maxSize=1, blocking=False) except RuntimeError: test_result['jpeg_enc_res'] = 'FAIL' + try: + self.qImu = self.device.getOutputQueue(name='IMU', maxSize=1, blocking=False) + except RuntimeError: + test_result['imu'] = 'FAIL' update_res = True + def get_imu(self): + in_imu = self.qImu.tryGet() + imu_packet = in_imu.packets[0] + accel = imu_packet.acceleroMeter + gyro = imu_packet.gyroscope + return accel, gyro + def get_image(self, cam_type): global update_res image = None @@ -919,15 +930,18 @@ def setupUi(self): self.test_type_label.setGeometry(QtCore.QRect(10, 60, 281, 21)) self.test_type_label.setObjectName("test_type_label") self.prog_bar = QtWidgets.QProgressBar(self.logs) - self.prog_bar.setGeometry(QtCore.QRect(540, 40, 118, 23)) + self.prog_bar.setGeometry(QtCore.QRect(540, 56, 118, 23)) self.prog_bar.setProperty("value", 24) self.prog_bar.setObjectName("IMU_prog_bar") self.prog_bar.setMinimum(0) self.prog_bar.setMaximum(100) self.prog_bar.setValue(0) self.prog_label = QtWidgets.QLabel(self.logs) - self.prog_label.setGeometry(QtCore.QRect(450, 40, 81, 17)) + self.prog_label.setGeometry(QtCore.QRect(430, 60, 90, 17)) self.prog_label.setObjectName("prog_label") + self.imu_label = QtWidgets.QLabel(self.logs) + self.imu_label.setGeometry(QtCore.QRect(430, 40, 280, 20)) + # self.imu_label.setText('') self.logs_txt_browser = QtWidgets.QTextBrowser(self.logs) self.logs_txt_browser.setGeometry(QtCore.QRect(10, 90, 721, 121)) self.logs_txt_browser.setObjectName("logs_txt_browser") @@ -1156,6 +1170,7 @@ def connexion_slot(self, signal): test_result['eeprom_res'] = 'FAIL' test_result['eeprom_data'] = '' + # refresh timer def set_result(self): global update_res if not self.connect_but.isCheckable() and self.prog_bar.value() == self.last_progress_val: @@ -1188,6 +1203,10 @@ def set_result(self): self.print_logs('BOOTLOADER UPDATE FAIL!!!', log_level='ERROR') else: self.print_logs('BOOTLOADER UPDATED SUCCESSFULLY', log_level='GREEN') + if imu_upgrade: + if hasattr(self, 'depth_camera'): + imu_data = self.depth_camera.get_imu() + self.imu_label.setText(f'{imu_data}') time_string = datetime.now().strftime("%Y %m %d %H:%M:%S") From a9c11a24cb3868b2bf13d98b6efed3b220ef0359 Mon Sep 17 00:00:00 2001 From: Daniel Calaver Date: Wed, 20 Jul 2022 00:19:12 +0300 Subject: [PATCH 3/5] WIP: change labels --- test_ui.py | 213 +++++++++++++++++++++++++++++------------------------ 1 file changed, 118 insertions(+), 95 deletions(-) diff --git a/test_ui.py b/test_ui.py index ba2579318..a91465c27 100755 --- a/test_ui.py +++ b/test_ui.py @@ -30,6 +30,10 @@ test_result = { 'usb3_res': '', + 'nor_flash_res': '', + 'bootloader_flash_res': '', + 'imu_upgrade_res': '', + 'imu_test_res': '', 'eeprom_res': '', 'rgb_cam_res': '', 'jpeg_enc_res': '', @@ -61,25 +65,29 @@ 'OAK-D-PRO-POE': ['jpeg_enc', 'prew_out_rgb', 'left_strm', 'right_strm', 'ir_light'], } - -OAK_D_LABELS = '

\ - USB3
\ - EEPROM write test
\ - RGB Camera connected
\ - JPEG Encoding Stream
\ - preview-out-rgb Stream
\ - left camera connected
\ - right camera connected
\ - left Stream
\ - right Stream

' - - -OAK_ONE_LABELS = '

\ - USB3
\ - EEPROM write test
\ - RGB Camera connected
\ - JPEG Encoding Stream
\ - preview-out-rgb Stream

' +br_command = '
' +OAK_D_LABELS = f'

\ + USB3 {br_command} \ + EEPROM write test {br_command} \ + NOR Flash {br_command} \ + Bootloader Flash {br_command} \ + IMU Upgrade {br_command} \ + IMU test {br_command} \ + RGB Camera connected {br_command} \ + JPEG Encoding Stream {br_command} \ + preview-out-rgb Stream {br_command} \ + left camera connected {br_command} \ + right camera connected {br_command} \ + left Stream {br_command} \ + right Stream {br_command}

' + + +OAK_ONE_LABELS = f'

\ + USB3 {br_command} \ + EEPROM write test {br_command} \ + RGB Camera connected {br_command} \ + JPEG Encoding Stream {br_command} \ + preview-out-rgb Stream {br_command} \

' CSV_HEADER = { 'OAK-1': '"Device ID","Device Type","Timestamp","USB3","RGB camera connect","JPEG Encoding","RGB Stream","JPEG Encoding Operator","RGB Encoding Operator"', @@ -110,7 +118,7 @@ def clear_test_results(): update_res = True imu_upgrade = True -class DepthAICamera() : +class DepthAICamera: def __init__(self): global update_res self.pipeline = dai.Pipeline() @@ -153,7 +161,7 @@ def __init__(self): self.xoutIMU = self.pipeline.create(dai.node.XLinkOut) self.xoutIMU.setStreamName("IMU") self.imu.enableFirmwareUpdate(True) - self.imu.enableIMUSensor(dai.IMUSensor.ACCELEROMETER_RAW, 500) + self.imu.enableIMUSensor([dai.IMUSensor.ACCELEROMETER_RAW, dai.IMUSensor.GYROSCOPE_RAW], 500) self.imu.setBatchReportThreshold(1) self.imu.setMaxBatchReports(10) self.imu.out.link(self.xoutIMU.input) @@ -298,6 +306,9 @@ def start_queue(self): def get_imu(self): in_imu = self.qImu.tryGet() + if in_imu is None: + print('empty packet') + return None imu_packet = in_imu.packets[0] accel = imu_packet.acceleroMeter gyro = imu_packet.gyroscope @@ -522,7 +533,7 @@ def update_image(self): WIDTH = 766 -HEIGHT = 717 +HEIGHT = 980 def test_connexion(): @@ -636,92 +647,122 @@ def setupUi(self): self.centralwidget = QtWidgets.QWidget(UI_tests) self.centralwidget.setObjectName("centralwidget") self.title = QtWidgets.QLabel(self.centralwidget) - self.title.setGeometry(QtCore.QRect(10, 10, 751, 51)) + self.title.setGeometry(QtCore.QRect(10, 10, 751, 71)) font = QtGui.QFont() font.setPointSize(16) self.title.setFont(font) self.title.setObjectName("title") self.connect_but = QtWidgets.QPushButton(self.centralwidget) - self.connect_but.setGeometry(QtCore.QRect(460, 390, 86, 25)) + self.connect_but.setGeometry(QtCore.QRect(440, 410, 86, 25)) self.connect_but.setObjectName("connect_but") self.connect_but.clicked.connect(self.show_cameras) - # self.save_but = QtWidgets.QPushButton(self.centralwidget) - # self.save_but.setGeometry(QtCore.QRect(550, 390, 86, 25)) - # self.save_but.setObjectName("connect_but") - # self.save_but.clicked.connect(save_csv) self.automated_tests = QtWidgets.QGroupBox(self.centralwidget) if test_type == 'OAK-1': - self.automated_tests.setGeometry(QtCore.QRect(20, 70, 311, 241)) + self.automated_tests.setGeometry(QtCore.QRect(20, 90, 311, 590)) else: - self.automated_tests.setGeometry(QtCore.QRect(20, 70, 311, 395)) + self.automated_tests.setGeometry(QtCore.QRect(20, 90, 311, 590)) self.automated_tests.setObjectName("automated_tests") self.automated_tests_labels = QtWidgets.QLabel(self.automated_tests) - self.automated_tests_labels.setGeometry(QtCore.QRect(10, 20, 221, 351)) + self.automated_tests_labels.setGeometry(QtCore.QRect(10, 20, 225, 540)) self.automated_tests_labels.setObjectName("automated_tests_labels") self.automated_tests_labels.setContentsMargins(0,9,9,5) self.automated_tests_labels.setAlignment(QtCore.Qt.AlignRight) # self.automated_tests_labels.setGeometry(QtCore.QRect(10, 30, 221, 150)) - px, py, x, y = 240, 37, 51, 21 - dy = 39 + px, py, x, y = 240, 43, 51, 21 + dy = 41 self.usb3_res = QtWidgets.QLabel(self.automated_tests) self.usb3_res.setGeometry(QtCore.QRect(px, py, x, y)) self.usb3_res.setObjectName("usb3_res") + self.usb3_res.setText("SKIP") py += dy self.eeprom_res = QtWidgets.QLabel(self.automated_tests) self.eeprom_res.setGeometry(QtCore.QRect(px, py, x, y)) self.eeprom_res.setObjectName("eeprom_res") + self.eeprom_res.setText("SKIP") + + py += dy + self.nor_flash_res = QtWidgets.QLabel(self.automated_tests) + self.nor_flash_res.setGeometry(QtCore.QRect(px, py, x, y)) + self.nor_flash_res.setObjectName("NOR Flash") + self.nor_flash_res.setText("SKIP") + + py += dy + self.bootloader_flash_res = QtWidgets.QLabel(self.automated_tests) + self.bootloader_flash_res.setGeometry(QtCore.QRect(px, py, x, y)) + self.bootloader_flash_res.setObjectName("NOR Flash") + self.bootloader_flash_res.setText("SKIP") + + py += dy + self.imu_upgrade_res = QtWidgets.QLabel(self.automated_tests) + self.imu_upgrade_res.setGeometry(QtCore.QRect(px, py, x, y)) + self.imu_upgrade_res.setObjectName("NOR Flash") + self.imu_upgrade_res.setText("SKIP") + + py += dy + self.imu_test_res = QtWidgets.QLabel(self.automated_tests) + self.imu_test_res.setGeometry(QtCore.QRect(px, py, x, y)) + self.imu_test_res.setObjectName("NOR Flash") + self.imu_test_res.setText("SKIP") py += dy self.rgb_cam_res = QtWidgets.QLabel(self.automated_tests) self.rgb_cam_res.setGeometry(QtCore.QRect(px, py, x, y)) self.rgb_cam_res.setObjectName("rgb_cam_res") + self.rgb_cam_res.setText("SKIP") py += dy self.jpeg_enc_res = QtWidgets.QLabel(self.automated_tests) self.jpeg_enc_res.setGeometry(QtCore.QRect(px, py, x, y)) self.jpeg_enc_res.setObjectName("jpeg_enc_res") + self.jpeg_enc_res.setText("SKIP") py += dy self.prew_out_rgb_res = QtWidgets.QLabel(self.automated_tests) self.prew_out_rgb_res.setGeometry(QtCore.QRect(px, py, x, y)) self.prew_out_rgb_res.setObjectName("prew_out_rgb_res") + self.prew_out_rgb_res.setText("SKIP") py += dy self.left_cam_res = QtWidgets.QLabel(self.automated_tests) self.left_cam_res.setGeometry(QtCore.QRect(px, py, x, y)) self.left_cam_res.setObjectName("left_cam_res") + self.left_cam_res.setText("SKIP") py += dy self.right_cam_res = QtWidgets.QLabel(self.automated_tests) self.right_cam_res.setGeometry(QtCore.QRect(px, py, x, y)) self.right_cam_res.setObjectName("right_cam_res") + self.right_cam_res.setText("SKIP") py += dy self.left_strm_res = QtWidgets.QLabel(self.automated_tests) self.left_strm_res.setGeometry(QtCore.QRect(px, py, x, y)) self.left_strm_res.setObjectName("left_strm_res") + self.left_strm_res.setText("SKIP") py += dy self.right_strm_res = QtWidgets.QLabel(self.automated_tests) self.right_strm_res.setGeometry(QtCore.QRect(px, py, x, y)) self.right_strm_res.setObjectName("right_strm_res") + self.right_strm_res.setText("SKIP") - py += dy - self.ir_project_res = QtWidgets.QLabel(self.automated_tests) - self.ir_project_res.setGeometry(QtCore.QRect(px, py, x, y)) - self.ir_project_res.setObjectName("ir_project_res") + # py += dy + # self.ir_project_res = QtWidgets.QLabel(self.automated_tests) + # self.ir_project_res.setGeometry(QtCore.QRect(px, py, x, y)) + # self.ir_project_res.setObjectName("ir_project_res") + # self.ir_project_res.setText("LAST") self.operator_tests = QtWidgets.QGroupBox(self.centralwidget) # self.operator_tests.setGeometry(QtCore.QRect(360, 70, 321, 321)) # if test_type == 'OAK-D-PRO' or test_type == 'OAK-D-PRO-POE': if 'oak-d pro' in eepromDataJson['productName'].lower(): - self.operator_tests.setGeometry(QtCore.QRect(360, 70, 321, 311)) + self.operator_tests.setGeometry(QtCore.QRect(360, 90, 321, 321)) elif test_type == 'OAK-1': - self.operator_tests.setGeometry(QtCore.QRect(360, 70, 321, 190)) + self.operator_tests.setGeometry(QtCore.QRect(360, 90, 321, 200)) else: - self.operator_tests.setGeometry(QtCore.QRect(360, 70, 321, 281)) + self.operator_tests.setGeometry(QtCore.QRect(360, 90, 321, 291)) self.operator_tests.setObjectName("operator_tests") self.operator_tests_label = QtWidgets.QLabel(self.operator_tests) self.operator_tests_label.setGeometry(QtCore.QRect(10, 100, 131, 201)) @@ -917,7 +958,7 @@ def setupUi(self): self.ir_fail_but.toggled.connect(lambda: set_operator_test(self.ir_fail_but)) self.logs = QtWidgets.QGroupBox(self.centralwidget) - self.logs.setGeometry(QtCore.QRect(10, 460, 741, 221)) + self.logs.setGeometry(QtCore.QRect(10, HEIGHT-260, 741, 221)) self.logs.setObjectName("logs") self.logs_title_label = QtWidgets.QLabel(self.logs) self.logs_title_label.setGeometry(QtCore.QRect(10, 20, 281, 21)) @@ -994,6 +1035,11 @@ def retranslateUi(self, UI_tests): self.operator_tests.setTitle(_translate("UI_tests", "Operator Tests")) self.NOT_TESTED_LABEL.setText(_translate("UI_tests", "

Not
Tested

")) self.FAIL_LABEL.setText(_translate("UI_tests", "

FAIL

")) + if 'oak-d pro' in eepromDataJson['productName'].lower(): + ir_light = 'IR Light' + else: + ir_light = '' + self.operator_tests_label.setText(_translate("UI_tests", "\n" "