Commit 439d8696 authored by Gallacchi Mattia's avatar Gallacchi Mattia
Browse files

Add frontend

parent f4217fe0
Loading
Loading
Loading
Loading

app/__init__.py

0 → 100644
+0 −0

Empty file added.

app/ms210.ui

0 → 100644
+162 −0
Original line number Diff line number Diff line
<?xml version="1.0" encoding="UTF-8"?>
<ui version="4.0">
 <class>MainWindow</class>
 <widget class="QMainWindow" name="MainWindow">
  <property name="geometry">
   <rect>
    <x>0</x>
    <y>0</y>
    <width>425</width>
    <height>436</height>
   </rect>
  </property>
  <property name="windowTitle">
   <string>MS210 Controller</string>
  </property>
  <widget class="QWidget" name="centralwidget">
   <widget class="QWidget" name="gridLayoutWidget">
    <property name="geometry">
     <rect>
      <x>20</x>
      <y>70</y>
      <width>391</width>
      <height>311</height>
     </rect>
    </property>
    <layout class="QGridLayout" name="gridLayout">
     <item row="0" column="2">
      <widget class="QLabel" name="label_3">
       <property name="text">
        <string>GREEN</string>
       </property>
      </widget>
     </item>
     <item row="0" column="1">
      <widget class="QLabel" name="label_2">
       <property name="text">
        <string>RED</string>
       </property>
      </widget>
     </item>
     <item row="1" column="1">
      <widget class="QSlider" name="red_slider">
       <property name="maximum">
        <number>1000</number>
       </property>
       <property name="orientation">
        <enum>Qt::Vertical</enum>
       </property>
      </widget>
     </item>
     <item row="0" column="0">
      <widget class="QLabel" name="label">
       <property name="text">
        <string>IR</string>
       </property>
      </widget>
     </item>
     <item row="1" column="3">
      <widget class="QSlider" name="blue_slider">
       <property name="maximum">
        <number>1000</number>
       </property>
       <property name="orientation">
        <enum>Qt::Vertical</enum>
       </property>
      </widget>
     </item>
     <item row="0" column="3">
      <widget class="QLabel" name="label_4">
       <property name="text">
        <string>BLUE</string>
       </property>
      </widget>
     </item>
     <item row="1" column="0">
      <widget class="QSlider" name="ir_slider">
       <property name="maximum">
        <number>1000</number>
       </property>
       <property name="orientation">
        <enum>Qt::Vertical</enum>
       </property>
      </widget>
     </item>
     <item row="1" column="2">
      <widget class="QSlider" name="green_slider">
       <property name="maximum">
        <number>1000</number>
       </property>
       <property name="orientation">
        <enum>Qt::Vertical</enum>
       </property>
      </widget>
     </item>
     <item row="2" column="0">
      <widget class="QSpinBox" name="ir_sb">
       <property name="maximum">
        <number>1000</number>
       </property>
      </widget>
     </item>
     <item row="2" column="1">
      <widget class="QSpinBox" name="red_sb">
       <property name="maximum">
        <number>1000</number>
       </property>
      </widget>
     </item>
     <item row="2" column="2">
      <widget class="QSpinBox" name="green_sb">
       <property name="maximum">
        <number>1000</number>
       </property>
      </widget>
     </item>
     <item row="2" column="3">
      <widget class="QSpinBox" name="blue_sb">
       <property name="maximum">
        <number>1000</number>
       </property>
      </widget>
     </item>
    </layout>
   </widget>
   <widget class="QWidget" name="horizontalLayoutWidget">
    <property name="geometry">
     <rect>
      <x>20</x>
      <y>20</y>
      <width>161</width>
      <height>41</height>
     </rect>
    </property>
    <layout class="QHBoxLayout" name="horizontalLayout">
     <item>
      <widget class="QLabel" name="label_5">
       <property name="text">
        <string>COM port</string>
       </property>
      </widget>
     </item>
     <item>
      <widget class="QComboBox" name="port_cb"/>
     </item>
    </layout>
   </widget>
  </widget>
  <widget class="QMenuBar" name="menubar">
   <property name="geometry">
    <rect>
     <x>0</x>
     <y>0</y>
     <width>425</width>
     <height>22</height>
    </rect>
   </property>
  </widget>
  <widget class="QStatusBar" name="statusbar"/>
 </widget>
 <resources/>
 <connections/>
</ui>
+149 −0
Original line number Diff line number Diff line
import sys
from typing import Literal

from PyQt6.QtWidgets import QApplication, QMainWindow, QMessageBox
from ms210_ui import Ui_MainWindow

from ms210.driver import MS210, MS210InitFailed
import serial.tools.list_ports

class Window(QMainWindow, Ui_MainWindow):

    def __init__(self, parent=None) -> None:
        super().__init__(parent)
        self.setupUi(self)
        self._ms210 = None
        self.__get_ports()
        self.__setup_signals()

    def __get_ports(self):
 
        self.port_cb.addItem("None")
        ports = serial.tools.list_ports.comports()

        for port in ports:
            if "USB" in port.name:
                self.port_cb.addItem(port.name)

    def __setup_signals(self):
        self.port_cb.currentIndexChanged.connect(self.port_select_cb)
        
        # IR
        self.ir_slider.sliderReleased.connect(self.ir_slider_cb)
        self.ir_sb.valueChanged.connect(self.ir_sb_cb)

        # Red 
        self.red_slider.sliderReleased.connect(self.red_slider_cb)
        self.red_sb.valueChanged.connect(self.red_sb_cb)

        # Green
        self.green_slider.sliderReleased.connect(self.green_slider_cb)
        self.green_sb.valueChanged.connect(self.green_sb_cb)

        # Blue
        self.blue_slider.sliderReleased.connect(self.blue_slider_cb)
        self.blue_sb.valueChanged.connect(self.blue_sb_cb)

    def __set_value(self, channel : Literal["IR", "R", "B", "G"], value: int = 0) -> bool:

        if self._ms210 is not None:
            success, msg = self._ms210.set_value(channel, value)
            if not success:
                self.error_msg(f"Failed to set {channel}: {msg}")
                return False
        else:
            self.error_msg("Please select a serial port")
            return False
        
        return True

    def __init_values(self):
        
        ir = self._ms210.get_value("IR")
        self.ir_sb.setValue(ir)
        self.ir_slider.setValue(ir)
        
        red = self._ms210.get_value("R")
        self.red_sb.setValue(red)
        self.red_slider.setValue(red)
        
        green = self._ms210.get_value("G")
        self.green_sb.setValue(green)
        self.green_slider.setValue(green)
        
        blue = self._ms210.get_value("B")
        self.blue_sb.setValue(blue)
        self.blue_slider.setValue(blue)

    def port_select_cb(self):

        if self.port_cb.currentText() == "None":
            self._ms210 = None
            return

        try:
            self._ms210 = MS210(f"/dev/{self.port_cb.currentText()}")
        except MS210InitFailed as ex:
            self.error_msg(f"Failed to connect to MS210: {ex}")
            self._ms210 = None
            return

        self.__init_values()

    def ir_slider_cb(self):
        if not self.__set_value("IR", self.ir_slider.value()):
            self.ir_slider.setValue(self.ir_sb.value())
        else:
            self.ir_sb.value(self.ir_slider.value())
        
    def ir_sb_cb(self):
        if not self.__set_value("IR", self.ir_sb.value()):
            self.ir_slider.setValue(self.ir_slider.value())
        else:
            self.ir_sb.setValue(self.ir_sb.value())
    
    def red_slider_cb(self):
        if not self.__set_value("R", self.red_slider.value()):
            self.red_slider.setValue(self.red_sb.value())
        else:
            self.red_sb.setValue(self.red_slider.value())

    def red_sb_cb(self):
        if not self.__set_value("R", self.red_sb.value()):
            self.red_sb.setValue(self.red_slider.value())
        else:
            self.red_slider.setValue(self.red_sb.value())

    def green_slider_cb(self):
        if not self.__set_value("G", self.green_slider.value()):
            self.green_slider.setValue(self.green_sb.value())
        else:
            self.green_sb.setValue(self.green_slider.value())

    def green_sb_cb(self):
        if not self.__set_value("G", self.green_sb.value()):
            self.green_sb.setValue(self.green_slider.value())
        else:
            self.green_slider.setValue(self.green_sb.value())

    def blue_slider_cb(self):
        if not self.__set_value("B", self.blue_slider.value()):
            self.blue_slider.setValue(self.blue_sb.value())
        else:
            self.blue_sb.setValue(self.blue_slider.value())

    def blue_sb_cb(self):
        if not self.__set_value("B", self.blue_sb.value()):
            self.blue_sb.setValue(self.blue_slider.value())
        else:
            self.blue_slider.setValue(self.blue_sb.value())

    def error_msg(self, msg : str):
        QMessageBox.critical(None, "Error", msg)      

if "__main__" == __name__:

    app = QApplication(sys.argv)
    win = Window()
    win.show()
    sys.exit(app.exec())
 No newline at end of file

app/ms210_ui.py

0 → 100644
+103 −0
Original line number Diff line number Diff line
# Form implementation generated from reading ui file 'ms210.ui'
#
# Created by: PyQt6 UI code generator 6.4.2
#
# WARNING: Any manual changes made to this file will be lost when pyuic6 is
# run again.  Do not edit this file unless you know what you are doing.


from PyQt6 import QtCore, QtGui, QtWidgets


class Ui_MainWindow(object):
    def setupUi(self, MainWindow):
        MainWindow.setObjectName("MainWindow")
        MainWindow.resize(425, 436)
        self.centralwidget = QtWidgets.QWidget(parent=MainWindow)
        self.centralwidget.setObjectName("centralwidget")
        self.gridLayoutWidget = QtWidgets.QWidget(parent=self.centralwidget)
        self.gridLayoutWidget.setGeometry(QtCore.QRect(20, 70, 391, 311))
        self.gridLayoutWidget.setObjectName("gridLayoutWidget")
        self.gridLayout = QtWidgets.QGridLayout(self.gridLayoutWidget)
        self.gridLayout.setContentsMargins(0, 0, 0, 0)
        self.gridLayout.setObjectName("gridLayout")
        self.label_3 = QtWidgets.QLabel(parent=self.gridLayoutWidget)
        self.label_3.setObjectName("label_3")
        self.gridLayout.addWidget(self.label_3, 0, 2, 1, 1)
        self.label_2 = QtWidgets.QLabel(parent=self.gridLayoutWidget)
        self.label_2.setObjectName("label_2")
        self.gridLayout.addWidget(self.label_2, 0, 1, 1, 1)
        self.red_slider = QtWidgets.QSlider(parent=self.gridLayoutWidget)
        self.red_slider.setMaximum(1000)
        self.red_slider.setOrientation(QtCore.Qt.Orientation.Vertical)
        self.red_slider.setObjectName("red_slider")
        self.gridLayout.addWidget(self.red_slider, 1, 1, 1, 1)
        self.label = QtWidgets.QLabel(parent=self.gridLayoutWidget)
        self.label.setObjectName("label")
        self.gridLayout.addWidget(self.label, 0, 0, 1, 1)
        self.blue_slider = QtWidgets.QSlider(parent=self.gridLayoutWidget)
        self.blue_slider.setMaximum(1000)
        self.blue_slider.setOrientation(QtCore.Qt.Orientation.Vertical)
        self.blue_slider.setObjectName("blue_slider")
        self.gridLayout.addWidget(self.blue_slider, 1, 3, 1, 1)
        self.label_4 = QtWidgets.QLabel(parent=self.gridLayoutWidget)
        self.label_4.setObjectName("label_4")
        self.gridLayout.addWidget(self.label_4, 0, 3, 1, 1)
        self.ir_slider = QtWidgets.QSlider(parent=self.gridLayoutWidget)
        self.ir_slider.setMaximum(1000)
        self.ir_slider.setOrientation(QtCore.Qt.Orientation.Vertical)
        self.ir_slider.setObjectName("ir_slider")
        self.gridLayout.addWidget(self.ir_slider, 1, 0, 1, 1)
        self.green_slider = QtWidgets.QSlider(parent=self.gridLayoutWidget)
        self.green_slider.setMaximum(1000)
        self.green_slider.setOrientation(QtCore.Qt.Orientation.Vertical)
        self.green_slider.setObjectName("green_slider")
        self.gridLayout.addWidget(self.green_slider, 1, 2, 1, 1)
        self.ir_sb = QtWidgets.QSpinBox(parent=self.gridLayoutWidget)
        self.ir_sb.setMaximum(1000)
        self.ir_sb.setObjectName("ir_sb")
        self.gridLayout.addWidget(self.ir_sb, 2, 0, 1, 1)
        self.red_sb = QtWidgets.QSpinBox(parent=self.gridLayoutWidget)
        self.red_sb.setMaximum(1000)
        self.red_sb.setObjectName("red_sb")
        self.gridLayout.addWidget(self.red_sb, 2, 1, 1, 1)
        self.green_sb = QtWidgets.QSpinBox(parent=self.gridLayoutWidget)
        self.green_sb.setMaximum(1000)
        self.green_sb.setObjectName("green_sb")
        self.gridLayout.addWidget(self.green_sb, 2, 2, 1, 1)
        self.blue_sb = QtWidgets.QSpinBox(parent=self.gridLayoutWidget)
        self.blue_sb.setMaximum(1000)
        self.blue_sb.setObjectName("blue_sb")
        self.gridLayout.addWidget(self.blue_sb, 2, 3, 1, 1)
        self.horizontalLayoutWidget = QtWidgets.QWidget(parent=self.centralwidget)
        self.horizontalLayoutWidget.setGeometry(QtCore.QRect(20, 20, 161, 41))
        self.horizontalLayoutWidget.setObjectName("horizontalLayoutWidget")
        self.horizontalLayout = QtWidgets.QHBoxLayout(self.horizontalLayoutWidget)
        self.horizontalLayout.setContentsMargins(0, 0, 0, 0)
        self.horizontalLayout.setObjectName("horizontalLayout")
        self.label_5 = QtWidgets.QLabel(parent=self.horizontalLayoutWidget)
        self.label_5.setObjectName("label_5")
        self.horizontalLayout.addWidget(self.label_5)
        self.port_cb = QtWidgets.QComboBox(parent=self.horizontalLayoutWidget)
        self.port_cb.setObjectName("port_cb")
        self.horizontalLayout.addWidget(self.port_cb)
        MainWindow.setCentralWidget(self.centralwidget)
        self.menubar = QtWidgets.QMenuBar(parent=MainWindow)
        self.menubar.setGeometry(QtCore.QRect(0, 0, 425, 22))
        self.menubar.setObjectName("menubar")
        MainWindow.setMenuBar(self.menubar)
        self.statusbar = QtWidgets.QStatusBar(parent=MainWindow)
        self.statusbar.setObjectName("statusbar")
        MainWindow.setStatusBar(self.statusbar)

        self.retranslateUi(MainWindow)
        QtCore.QMetaObject.connectSlotsByName(MainWindow)

    def retranslateUi(self, MainWindow):
        _translate = QtCore.QCoreApplication.translate
        MainWindow.setWindowTitle(_translate("MainWindow", "MS210 Controller"))
        self.label_3.setText(_translate("MainWindow", "GREEN"))
        self.label_2.setText(_translate("MainWindow", "RED"))
        self.label.setText(_translate("MainWindow", "IR"))
        self.label_4.setText(_translate("MainWindow", "BLUE"))
        self.label_5.setText(_translate("MainWindow", "COM port"))

main.py

deleted100644 → 0
+0 −28
Original line number Diff line number Diff line
from ms210.driver import MS210

channels = ["IR", "R", "B", "G"]

if "__main__" == __name__:

    dev = MS210()
    value = 0
    index = 1
    current_channel = channels[index]

    try:
        while True:
            
            dev.set_value(current_channel, value)
            value += 50

            if value > 1000:
                value = 0
                dev.set_value(current_channel, value)
                index = index + 1 if index < 3 else 1
                current_channel = channels[index]
                

    except KeyboardInterrupt:
        pass

    print("Exit")
 No newline at end of file
Loading