Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion .github/workflows/bundle.yml
Original file line number Diff line number Diff line change
Expand Up @@ -43,7 +43,7 @@ jobs:
- name: Setup python
uses: actions/setup-python@v5
with:
python-version: '3.8'
python-version: '3.12'
cache: 'pip'

- name: Download external resources (Ubuntu & macOS)
Expand Down
2 changes: 1 addition & 1 deletion inlinino/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,7 @@

# Setup Logger
logging.basicConfig(level=logging.DEBUG)
logging.getLogger('PyQt5').setLevel(logging.WARNING)
logging.getLogger('PyQt6').setLevel(logging.WARNING)
root_logger = logging.getLogger() # Get root logger


Expand Down
170 changes: 84 additions & 86 deletions inlinino/gui.py

Large diffs are not rendered by default.

6 changes: 3 additions & 3 deletions inlinino/widgets/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -49,11 +49,11 @@ def __snake_name__(cls) -> str:
def __init__(self, parent=None, *args, **kwargs):
super().__init__(parent, *args, **kwargs)
if parent is not None and parent.isActiveWindow():
self.setWindowModality(QtCore.Qt.WindowModal)
self.setWindowModality(QtCore.Qt.WindowModality.WindowModal)
uic.loadUi(os.path.join(PATH_TO_RESOURCES, f'dialog_{self.__snake_name__[:-7]}.ui'), self)
self.run_button = self.button_box.addButton("Run", QtGui.QDialogButtonBox.ActionRole)
self.run_button = self.button_box.addButton("Run", QtWidgets.QDialogButtonBox.ButtonRole.ActionRole)
self.run_button.clicked.connect(self.start)
self.button_box.button(QtGui.QDialogButtonBox.Close).clicked.connect(self.accept)
self.button_box.button(QtWidgets.QDialogButtonBox.StandardButton.Close).clicked.connect(self.accept)

def disable_run_button(self, text='Processing ...'):
self.run_button.setText(text)
Expand Down
6 changes: 3 additions & 3 deletions inlinino/widgets/aux_data.py
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
from pyqtgraph.Qt import QtCore, QtGui
from pyqtgraph.Qt import QtCore, QtGui, QtWidgets

from inlinino.widgets import GenericWidget

Expand All @@ -19,8 +19,8 @@ def setup(self):
self.group_box_aux_data_layout.itemAt(i).widget().setParent(None)
# Set aux variable names
for v in self.instrument.widget_aux_data_variable_names:
self.variable_names.append(QtGui.QLabel(v))
self.variable_values.append(QtGui.QLabel('?'))
self.variable_names.append(QtWidgets.QLabel(v))
self.variable_values.append(QtWidgets.QLabel('?'))
self.group_box_aux_data_layout.addRow(self.variable_names[-1],
self.variable_values[-1])

Expand Down
56 changes: 28 additions & 28 deletions inlinino/widgets/file_explorer.py
Original file line number Diff line number Diff line change
Expand Up @@ -69,20 +69,19 @@ def handle_selection(self, selected, deselected):
def download(self):
items = [i.internalPointer() for i in self.tree_view.selectedIndexes() if i.column() == 0]
if len(items) < 1:
msg = QtGui.QMessageBox(QtWidgets.QMessageBox.Warning, "Download File(s)",
f"Nothing to download, please select files to download first.",
QtGui.QMessageBox.Close, self)
msg.setWindowModality(QtCore.Qt.WindowModal)
msg.exec_()
msg = QtWidgets.QMessageBox(QtWidgets.QMessageBox.Icon.Warning, "Download File(s)",
f"Nothing to download, please select files to download first.",
QtWidgets.QMessageBox.StandardButton.Close, self)
msg.setWindowModality(QtCore.Qt.WindowModality.WindowModal)
msg.exec()
return
msg = QtGui.QMessageBox(QtWidgets.QMessageBox.Question, "Download File(s)",
f"Are you sure you want to download the {len(items)} file(s) selected?",
QtGui.QMessageBox.Yes | QtGui.QMessageBox.No, self)
msg.setWindowModality(QtCore.Qt.WindowModal)
if msg.exec_() == QtGui.QMessageBox.Yes:
msg = QtWidgets.QMessageBox(QtWidgets.QMessageBox.Icon.Question, "Download File(s)",
f"Are you sure you want to download the {len(items)} file(s) selected?",
QtWidgets.QMessageBox.StandardButton.Yes | QtWidgets.QMessageBox.StandardButton.No, self)
msg.setWindowModality(QtCore.Qt.WindowModality.WindowModal)
if msg.exec() == QtWidgets.QMessageBox.StandardButton.Yes:
dialog = DialogDownloadFiles(self, items)
status = dialog.exec_()
if not dialog.exec_(): # 0: reject | 1: accept
if not dialog.exec(): # 0: reject | 1: accept
# User cancelled
self.instrument.signal.warning.emit(
'Data download cancelled. HyperNav is still transmitting data, '
Expand All @@ -94,26 +93,27 @@ def download(self):
# raise NotImplementedError('Not Implemented.')


class DialogDownloadFiles(QtGui.QDialog):
class DialogDownloadFiles(QtWidgets.QDialog):
def __init__(self, parent, items):
# p = parent
# while not isinstance(p, QtGui.QMainWindow):
# while not isinstance(p, QtWidgets.QMainWindow):
# p = p.parent()
super().__init__(parent)
uic.loadUi(os.path.join(PATH_TO_RESOURCES, 'dialog_download_files.ui'), self)
self.instrument = parent.instrument
self.items = items
self.idx = 0

self.button_box.button(QtGui.QDialogButtonBox.Close).clicked.connect(self.accept)
self.button_box.button(QtGui.QDialogButtonBox.Cancel).clicked.connect(self.reject)
self.button_box.button(QtWidgets.QDialogButtonBox.StandardButton.Close).clicked.connect(self.accept)
self.button_box.button(QtWidgets.QDialogButtonBox.StandardButton.Cancel).clicked.connect(self.reject)
self.instrument.signal.cmd_list.connect(self.expand_folder)
self.instrument.signal.cmd_dump.connect(self.next)

self.button_box.button(QtGui.QDialogButtonBox.Close).setEnabled(False)
self.button_box.button(QtWidgets.QDialogButtonBox.StandardButton.Close).setEnabled(False)

# Prevent computer to sleep
wakepy.set_keepawake(keep_screen_awake=False)
self._wakepy_mode = wakepy.keep.running()
self._wakepy_mode.__enter__()
# Start downloading files
self.next()

Expand All @@ -124,7 +124,7 @@ def __init__(self, parent, items):

@QtCore.pyqtSlot(int)
def next(self, status: int = None):
self.view.moveCursor(QtGui.QTextCursor.End)
self.view.moveCursor(QtGui.QTextCursor.MoveOperation.End)
if status == -1: # Folder expanded
self.view.insertPlainText(' Done\n')
elif status == -2: # Error while downloading file
Expand All @@ -142,14 +142,14 @@ def next(self, status: int = None):
self.instrument.send_cmd(f'dump * {path}', check_timing=False)
self.view.insertPlainText(f'Downloading {path} ... ')
self.idx += 1
self.view.moveCursor(QtGui.QTextCursor.StartOfLine)
self.view.moveCursor(QtGui.QTextCursor.MoveOperation.StartOfLine)
else:
if self.idx != 0:
self.view.insertPlainText('All files downloaded.\n')
else:
self.view.insertPlainText('Nothing to download.\n')
self.button_box.button(QtGui.QDialogButtonBox.Close).setEnabled(True)
wakepy.unset_keepawake()
self.button_box.button(QtWidgets.QDialogButtonBox.StandardButton.Close).setEnabled(True)
self._wakepy_mode.__exit__(None, None, None)

@QtCore.pyqtSlot()
def expand_folder(self):
Expand Down Expand Up @@ -198,25 +198,25 @@ def data(self, index: QtCore.QModelIndex, role: int):
if not index.isValid():
return None
item = index.internalPointer()
if role == QtCore.Qt.DisplayRole:
if role == QtCore.Qt.ItemDataRole.DisplayRole:
return item.data(index.column())
return None


class QRemoteFileSystemModel(QItemModel):

def headerData(self, section: int, orientation: QtCore.Qt.Orientation, role: int):
if orientation == QtCore.Qt.Horizontal and role == QtCore.Qt.DisplayRole and section < len(QFileItem.HEADER):
if orientation == QtCore.Qt.Orientation.Horizontal and role == QtCore.Qt.ItemDataRole.DisplayRole and section < len(QFileItem.HEADER):
return QFileItem.HEADER[section]
return super().headerData(section, orientation, role)

def flags(self, index: QtCore.QModelIndex) -> QtCore.Qt.ItemFlags:
def flags(self, index: QtCore.QModelIndex) -> QtCore.Qt.ItemFlag:
# if index.column() == 0:
# return QtCore.Qt.ItemIsEnabled | QtCore.Qt.ItemIsSelectable | QtCore.Qt.ItemIsUserCheckable
# return QtCore.Qt.ItemFlag.ItemIsEnabled | QtCore.Qt.ItemFlag.ItemIsSelectable | QtCore.Qt.ItemFlag.ItemIsUserCheckable
if index.internalPointer().is_dir and index.internalPointer().childCount() != 0:
return QtCore.Qt.ItemIsEnabled
return QtCore.Qt.ItemFlag.ItemIsEnabled
else:
return QtCore.Qt.ItemIsEnabled | QtCore.Qt.ItemIsSelectable
return QtCore.Qt.ItemFlag.ItemIsEnabled | QtCore.Qt.ItemFlag.ItemIsSelectable

# Methods from QtWidgets.QFileSystemModel
# def fileInfo(self):
Expand Down
18 changes: 9 additions & 9 deletions inlinino/widgets/hypernav/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -90,18 +90,18 @@ def counter_reset(self):
@QtCore.pyqtSlot(str, str, str)
def warning_message_box(self, message, informative_text='', icon='warning'):
if icon in ('error', 'critical'):
icon = QtWidgets.QMessageBox.Critical
icon = QtWidgets.QMessageBox.Icon.Critical
elif icon in ('info', 'information'):
icon = QtWidgets.QMessageBox.Information
icon = QtWidgets.QMessageBox.Icon.Information
else:
icon = QtWidgets.QMessageBox.Warning
msg = QtGui.QMessageBox(icon, "Inlinino: HyperNav",
message, QtGui.QMessageBox.Ok, parent=self)
icon = QtWidgets.QMessageBox.Icon.Warning
msg = QtWidgets.QMessageBox(icon, "Inlinino: HyperNav",
message, QtWidgets.QMessageBox.StandardButton.Ok, parent=self)
if informative_text:
msg.setInformativeText(informative_text)
if self.isActiveWindow():
msg.setWindowModality(QtCore.Qt.WindowModal)
msg.exec_()
msg.setWindowModality(QtCore.Qt.WindowModality.WindowModal)
msg.exec()

"""
Control
Expand Down Expand Up @@ -196,9 +196,9 @@ def cal(self):
@QtCore.pyqtSlot(bytes)
def update_serial_console(self, data: bytes):
data.replace(b'\r', b'') # Use only \n otherwise create extra line
self.serial_monitor_console.moveCursor(QtGui.QTextCursor.End)
self.serial_monitor_console.moveCursor(QtGui.QTextCursor.MoveOperation.End)
self.serial_monitor_console.insertPlainText(data.decode('utf8', errors='replace'))
self.serial_monitor_console.moveCursor(QtGui.QTextCursor.StartOfLine)
self.serial_monitor_console.moveCursor(QtGui.QTextCursor.MoveOperation.StartOfLine)

def send_command(self):
cmd = self.serial_monitor_command.text()
Expand Down
10 changes: 5 additions & 5 deletions inlinino/widgets/hypernav/analyze.py
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
import os

from pyqtgraph.Qt import QtCore, QtGui, uic
from pyqtgraph.Qt import QtCore, QtGui, QtWidgets, uic

from inlinino.shared.worker import Worker
from inlinino.instruments.hypernav import HyperNav
Expand Down Expand Up @@ -71,7 +71,7 @@ def __init__(self, parent, instrument: HyperNav, join_target=None):

@QtCore.pyqtSlot()
def browse_datafile(self):
file_name, _ = QtGui.QFileDialog.getOpenFileName(self,
file_name, _ = QtWidgets.QFileDialog.getOpenFileName(self,
caption='Choose HyperNav data file',
filter='Device File (*.raw *.txt)')
self.le_datafile.setText(file_name)
Expand Down Expand Up @@ -130,14 +130,14 @@ def __init__(self, parent, instrument: HyperNav):

@QtCore.pyqtSlot()
def browse_datafile(self):
file_name, _ = QtGui.QFileDialog.getOpenFileName(self,
file_name, _ = QtWidgets.QFileDialog.getOpenFileName(self,
caption='Choose HyperNav data file',
filter='Device File (*.raw *.txt)')
self.le_raw_filename.setText(file_name)

@QtCore.pyqtSlot()
def browse_wavelength_file(self):
file_name, _ = QtGui.QFileDialog.getOpenFileName(self,
file_name, _ = QtWidgets.QFileDialog.getOpenFileName(self,
caption='Choose wavelength registration file',
filter='Device File (*.cgs)')
self.le_wavelength_path.setText(file_name)
Expand Down Expand Up @@ -192,7 +192,7 @@ def __init__(self, parent, instrument: HyperNav):

@QtCore.pyqtSlot()
def browse_history_path(self):
path = QtGui.QFileDialog.getExistingDirectory(self, caption='Choose history directory')
path = QtWidgets.QFileDialog.getExistingDirectory(self, caption='Choose history directory')
self.le_history_path.setText(path)

def start(self):
Expand Down
10 changes: 5 additions & 5 deletions inlinino/widgets/hypernav/calibrate_dialog.py
Original file line number Diff line number Diff line change
Expand Up @@ -36,26 +36,26 @@ def __init__(self, parent, instrument: HyperNav):

@QtCore.pyqtSlot()
def browse_datafile(self):
file_name, _ = QtGui.QFileDialog.getOpenFileName(self,
file_name, _ = QtWidgets.QFileDialog.getOpenFileName(self,
caption='Choose HyperNav data file',
filter='Device File (*.raw *.txt)')
self.le_log_file.setText(file_name)

@QtCore.pyqtSlot()
def browse_lamp_file(self):
file_name, _ = QtGui.QFileDialog.getOpenFileName(self,
file_name, _ = QtWidgets.QFileDialog.getOpenFileName(self,
caption='Choose FEL lamp file', filter='Device File (*.dat *.FIT)')
self.le_lamp_path.setText(file_name)

@QtCore.pyqtSlot()
def browse_plaque_file(self):
file_name, _ = QtGui.QFileDialog.getOpenFileName(self,
file_name, _ = QtWidgets.QFileDialog.getOpenFileName(self,
caption='Choose reflectance plaque file', filter='Device File (*.dat *.FIT)')
self.le_plaque_path.setText(file_name)

@QtCore.pyqtSlot()
def browse_wavelength_file(self):
file_name, _ = QtGui.QFileDialog.getOpenFileName(self,
file_name, _ = QtWidgets.QFileDialog.getOpenFileName(self,
caption='Choose wavelength registration file', filter='Device File (*.cgs *.txt)')
self.le_wavelength_path.setText(file_name)
try:
Expand All @@ -70,7 +70,7 @@ def browse_wavelength_file(self):

@QtCore.pyqtSlot()
def browse_history_cal_dir(self):
self.le_history_cal_path.setText(QtGui.QFileDialog.getExistingDirectory(
self.le_history_cal_path.setText(QtWidgets.QFileDialog.getExistingDirectory(
caption='Choose historical calibration directory'))

@QtCore.pyqtSlot(str)
Expand Down
4 changes: 2 additions & 2 deletions inlinino/widgets/monitor.py
Original file line number Diff line number Diff line change
Expand Up @@ -24,9 +24,9 @@ def clear(self):
@QtCore.pyqtSlot(bytes)
def update_monitor(self, data: bytes):
data.replace(b'\r', b'') # Use only \n otherwise create extra line
self.monitor_view.moveCursor(QtGui.QTextCursor.End)
self.monitor_view.moveCursor(QtGui.QTextCursor.MoveOperation.End)
self.monitor_view.insertPlainText(data.decode('utf8', errors='replace'))
self.monitor_view.moveCursor(QtGui.QTextCursor.StartOfLine)
self.monitor_view.moveCursor(QtGui.QTextCursor.MoveOperation.StartOfLine)

def send_command(self):
cmd = self.command_field.text()
Expand Down
10 changes: 5 additions & 5 deletions inlinino/widgets/select_channel.py
Original file line number Diff line number Diff line change
Expand Up @@ -11,11 +11,11 @@ def __init__(self, instrument):
self.variables_model = QtGui.QStandardItemModel()
self.variables_filter_proxy_model = QtCore.QSortFilterProxyModel()
self.variables_filter_proxy_model.setSourceModel(self.variables_model)
self.variables_filter_proxy_model.setFilterCaseSensitivity(QtCore.Qt.CaseInsensitive)
self.variables_filter_proxy_model.setFilterCaseSensitivity(QtCore.Qt.CaseSensitivity.CaseInsensitive)
# Setup
super().__init__(instrument)
# Connect Search Field to Filter Proxy Model
self.variables_search.textChanged.connect(self.variables_filter_proxy_model.setFilterRegExp)
self.variables_search.textChanged.connect(self.variables_filter_proxy_model.setFilterRegularExpression)
# Add Data Filter Proxy Model to List View
self.list_variables.setModel(self.variables_filter_proxy_model)
self.list_variables.clicked.connect(self.update)
Expand All @@ -26,11 +26,11 @@ def setup(self):
# Set Current Variables
for v in self.instrument.widget_active_timeseries_variables_names:
item = QtGui.QStandardItem(v)
item.setFlags(QtCore.Qt.ItemIsUserCheckable | QtCore.Qt.ItemIsEnabled)
item.setFlags(QtCore.Qt.ItemFlag.ItemIsUserCheckable | QtCore.Qt.ItemFlag.ItemIsEnabled)
if v in self.instrument.widget_active_timeseries_variables_selected:
item.setData(QtCore.QVariant(QtCore.Qt.Checked), QtCore.Qt.CheckStateRole)
item.setData(QtCore.Qt.CheckState.Checked, QtCore.Qt.ItemDataRole.CheckStateRole)
else:
item.setData(QtCore.QVariant(QtCore.Qt.Unchecked), QtCore.Qt.CheckStateRole)
item.setData(QtCore.Qt.CheckState.Unchecked, QtCore.Qt.ItemDataRole.CheckStateRole)
self.variables_model.appendRow(item)
# Clear Search field
self.variables_search.setText('')
Expand Down
6 changes: 3 additions & 3 deletions make.py
Original file line number Diff line number Diff line change
Expand Up @@ -64,9 +64,9 @@
# Include hidden imports
hidden_imports = []
for i in [
'pyqtgraph.graphicsItems.ViewBox.axisCtrlTemplate_pyqt5',
'pyqtgraph.graphicsItems.PlotItem.plotConfigTemplate_pyqt5',
'pyqtgraph.imageview.ImageViewTemplate_pyqt5',
'pyqtgraph.graphicsItems.ViewBox.axisCtrlTemplate_generic',
'pyqtgraph.graphicsItems.PlotItem.plotConfigTemplate_generic',
'pyqtgraph.imageview.ImageViewTemplate_generic',
]:
hidden_imports.append(f'--hidden-import={i}')

Expand Down
20 changes: 10 additions & 10 deletions requirements.txt
Original file line number Diff line number Diff line change
@@ -1,14 +1,14 @@
pyserial==3.5
pyqt5==5.15.*
pyqtgraph==0.12.1
pyqt6==6.7.*
pyqtgraph==0.13.7
colorama==0.4.4
numpy==1.22.*
scipy==1.9.*
numpy==2.2.*
scipy==1.15.*
pyacs
pysatlantic
pynmea2==1.18.*
pyusb==1.2.1
hidapi==0.11.2
plotly==5.13.*
kaleido==0.2.1
wakepy==0.7.1
pynmea2==1.19.*
pyusb==1.3.*
hidapi==0.15.*
plotly==6.*
kaleido==1.*
wakepy==1.0.*
4 changes: 2 additions & 2 deletions setup.py
Original file line number Diff line number Diff line change
Expand Up @@ -24,8 +24,8 @@
long_description_content_type="text/markdown",
url="https://github.com/OceanOptics/Inlinino",
packages=setuptools.find_packages(),
install_requires=['pyserial>=3.4', 'numpy', 'scipy', 'PyQt5>=5.15', 'pyqtgraph>=0.12.1', 'pyACS', 'pySatlantic', 'pynmea2'],
python_requires='==3.8.*',
install_requires=['pyserial>=3.4', 'numpy>=2.0', 'scipy>=1.14', 'PyQt6>=6.7', 'pyqtgraph>=0.13.7', 'pyACS', 'pySatlantic', 'pynmea2'],
python_requires='>=3.12,<4',
license='GPLv3',
classifiers=[
"Programming Language :: Python :: 3",
Expand Down