• Home
  • Features
  • Pricing
  • Docs
  • Announcements
  • Sign In

int-brain-lab / iblrig / 9032957364

10 May 2024 01:25PM UTC coverage: 48.538% (+1.7%) from 46.79%
9032957364

Pull #643

github

74d2ec
web-flow
Merge aebf2c9af into ec2d8e4fe
Pull Request #643: 8.19.0

377 of 1074 new or added lines in 38 files covered. (35.1%)

977 existing lines in 19 files now uncovered.

3253 of 6702 relevant lines covered (48.54%)

0.97 hits per line

Source File
Press 'n' to go to next uncovered line, 'b' for previous

22.47
/iblrig/gui/frame2ttl.py
1
import logging
2✔
2
from datetime import date
2✔
3

4
from PyQt5 import QtCore, QtGui, QtTest, QtWidgets
2✔
5

6
from iblrig.frame2ttl import Frame2TTL
2✔
7
from iblrig.gui.tools import Worker
2✔
8
from iblrig.gui.ui_frame2ttl import Ui_frame2ttl
2✔
9
from iblrig.path_helper import save_pydantic_yaml
2✔
10
from iblrig.pydantic_definitions import HardwareSettings
2✔
11

12
log = logging.getLogger(__name__)
2✔
13

14

15
class Frame2TTLCalibrationDialog(QtWidgets.QDialog, Ui_frame2ttl):
2✔
16
    def __init__(self, *args, hardware_settings: HardwareSettings, **kwargs) -> None:
2✔
17
        super().__init__(*args, **kwargs)
×
18
        self.setupUi(self)
×
19
        self.setAttribute(QtCore.Qt.WA_DeleteOnClose, True)
×
20
        self.setWindowFlags(self.windowFlags() & ~QtCore.Qt.WindowContextHelpButtonHint)
×
21
        self.setWindowModality(QtCore.Qt.WindowModality.ApplicationModal)
×
22

23
        self.hardware_settings = hardware_settings
×
24
        self.frame2ttl = Frame2TTL(port=hardware_settings.device_frame2ttl.COM_F2TTL)
×
25
        self.target = Frame2TTLCalibrationTarget(self, color=QtGui.QColorConstants.White)
×
26
        self.light = None
×
27
        self.dark = None
×
28
        self._success = True
×
29

30
        self.uiLabelPortValue.setText(self.frame2ttl.portstr)
×
31
        self.uiLabelHardwareValue.setText(str(self.frame2ttl.hw_version))
×
32
        self.uiLabelFirmwareValue.setText(str(self.frame2ttl.fw_version))
×
33
        self.buttonBox.buttons()[0].setEnabled(False)
×
34
        self.show()
×
35

36
        # start worker for first calibration step: light condition
37
        worker = Worker(self.frame2ttl.calibrate, condition='light')
×
38
        worker.signals.result.connect(self._on_calibrate_light_result)
×
39
        QtCore.QThreadPool.globalInstance().tryStart(worker)
×
40
        self.uiLabelLightValue.setText('calibrating ...')
×
41

42
    def _on_calibrate_light_result(self, result: tuple[int, bool]):
2✔
43
        (self.light, self._success) = result
×
44
        self.uiLabelLightValue.setText(f'{self.light} {self.frame2ttl.unit_str}')
×
45

46
        # start worker for second calibration step: dark condition
47
        self.target.color = QtGui.QColorConstants.Black
×
48
        worker = Worker(self.frame2ttl.calibrate, condition='dark')
×
49
        worker.signals.result.connect(self._on_calibrate_dark_result)
×
50
        QtCore.QThreadPool.globalInstance().tryStart(worker)
×
51
        self.uiLabelDarkValue.setText('calibrating ...')
×
52

53
    def _on_calibrate_dark_result(self, result: tuple[int, bool]):
2✔
54
        (self.dark, self._success) = result
×
55
        self.uiLabelDarkValue.setText(f'{self.dark} {self.frame2ttl.unit_str}')
×
56

57
        if self._success:
×
58
            self.frame2ttl.set_thresholds(light=self.light, dark=self.dark)
×
59
            self.hardware_settings.device_frame2ttl.F2TTL_DARK_THRESH = self.dark
×
60
            self.hardware_settings.device_frame2ttl.F2TTL_LIGHT_THRESH = self.light
×
61
            self.hardware_settings.device_frame2ttl.F2TTL_CALIBRATION_DATE = date.today()
×
62
            save_pydantic_yaml(self.hardware_settings)
×
63
            self.uiLabelResult.setText('Calibration successful.\nSettings have been updated.')
×
64
        else:
65
            self.uiLabelResult.setText('Calibration failed.\nVerify that sensor is placed correctly.')
×
66
        self.buttonBox.buttons()[0].setEnabled(True)
×
67
        self.frame2ttl.close()
×
68

69

70
class Frame2TTLCalibrationTarget(QtWidgets.QDialog):
2✔
71
    def __init__(
2✔
72
        self,
73
        parent,
74
        color: QtGui.QColor = QtGui.QColorConstants.White,
75
        screen_index: int | None = None,
76
        width: int | None = None,
77
        height: int | None = None,
78
        rel_pos_x: float = 1.33,
79
        rel_pos_y: float = -1.03,
80
        rel_extent_x: float = 0.2,
81
        rel_extent_y: float = 0.2,
82
        **kwargs,
83
    ):
84
        # try to detect screen_index, get screen dimensions
85
        if screen_index is None:
×
NEW
86
            for idx, screen in enumerate(QtWidgets.QApplication.screens()):
×
NEW
87
                screen_index = idx
×
88
                if screen.size().width() == 2048 and screen.size().height() == 1536:
×
89
                    break
×
90
            else:
91
                log.warning('Defaulting to screen index 0.')
×
92
                screen_index = 0
×
93
                screen = QtWidgets.QApplication.screens()[0]
×
94

95
        # convert relative parameters (used in bonsai scripts) to width and height
96
        if width is None and height is None:
×
97
            screen_width = screen.geometry().width()
×
98
            screen_height = screen.geometry().height()
×
99
            width = round(screen_width - (screen_width + (rel_pos_x - rel_extent_x / 2) * screen_height) / 2)
×
100
            height = round(screen_height - (1 - rel_pos_y - rel_extent_y / 2) * screen_height / 2)
×
101

102
        # display frameless QDialog with given color
103
        super().__init__(parent, **kwargs)
×
104
        self.setWindowModality(QtCore.Qt.WindowModality.NonModal)
×
105
        self.setWindowFlags(QtCore.Qt.FramelessWindowHint | QtCore.Qt.WindowStaysOnTopHint | QtCore.Qt.Dialog)
×
106
        self.setAutoFillBackground(True)
×
107
        self._set_color(color)
×
108
        self.setFixedSize(width, height)
×
109
        screen_geometry = QtWidgets.QApplication.desktop().screenGeometry(screen_index)
×
110
        self.move(
×
111
            QtCore.QPoint(
112
                screen_geometry.x() + screen_geometry.width() - width, screen_geometry.y() + screen_geometry.height() - height
113
            )
114
        )
115
        self.show()
×
116
        QtTest.QTest.qWait(500)
×
117

118
    def _set_color(self, color: QtGui.QColor):
2✔
119
        palette = QtGui.QPalette()
×
120
        palette.setColor(QtGui.QPalette.Window, color)
×
121
        self.setPalette(palette)
×
122

123
    @property
2✔
124
    def color(self) -> QtGui.QColor:
2✔
125
        return self.palette().color(QtGui.QPalette.Window)
×
126

127
    @color.setter
2✔
128
    def color(self, color: QtGui.QColor):
2✔
129
        self._set_color(color)
×
130
        self.update()
×
131
        QtTest.QTest.qWait(500)
×
STATUS · Troubleshooting · Open an Issue · Sales · Support · CAREERS · ENTERPRISE · START FREE · SCHEDULE DEMO
ANNOUNCEMENTS · TWITTER · TOS & SLA · Supported CI Services · What's a CI service? · Automated Testing

© 2025 Coveralls, Inc