Skip to content

Commit

Permalink
- Added COM port discovery and selection dropdown
Browse files Browse the repository at this point in the history
  • Loading branch information
lan-party committed Dec 29, 2023
1 parent 1d89e7b commit 249d6c8
Show file tree
Hide file tree
Showing 2 changed files with 135 additions and 8 deletions.
73 changes: 66 additions & 7 deletions NeuroShortcut.py
Original file line number Diff line number Diff line change
Expand Up @@ -2,11 +2,12 @@
import time
from datetime import datetime
import os
import glob
import serial
from PyQt5 import QtWidgets, QtSvg, QtCore, QtGui, Qt
import pyqtgraph as pg
from brainflow.board_shim import BoardShim, BrainFlowInputParams, BoardIds
from brainflow.data_filter import DataFilter, WindowOperations, DetrendOperations

import numpy as np
import pandas as pd

Expand Down Expand Up @@ -145,6 +146,7 @@
all_triggers = pd.read_csv("triggers.csv")
last_trigger_timestamp = {}
last_nontrigger_timestamp = {}
serial_port = ''

class triggerListener(QtCore.QThread):
def run(self):
Expand Down Expand Up @@ -227,6 +229,7 @@ def run(self):
global log_updated
global all_triggers
global color_count
global serial_port

BoardShim.enable_dev_board_logger()
params = BrainFlowInputParams()
Expand All @@ -238,15 +241,16 @@ def run(self):
print("STARTING STREAM")
if current_device == 0:
board = BoardShim(BoardIds.SYNTHETIC_BOARD.value, params)
elif current_device == 1:
params.serial_port = 'COM3'
elif current_device == 1 and serial_port != "":
params.serial_port = serial_port
board = BoardShim(BoardIds.CYTON_BOARD.value, params)

board.prepare_session()
board.start_stream()
time.sleep(3)
if (current_device == 1 and serial_port != "") or current_device != 1:
board.prepare_session()
board.start_stream()
time.sleep(3)
stream_running = True
start_stream = False
stream_running = True

if stop_stream:
board.stop_stream()
Expand Down Expand Up @@ -351,6 +355,13 @@ def __init__(self):
self.triggerListLayout = QtWidgets.QVBoxLayout()
self.triggerList.setLayout(self.triggerListLayout)

# COM port init
self.ports = self.serial_ports()
if len(self.ports) > 0:
self.portSelected(self.ports[0])
self.portSelect.clear()
self.portSelect.addItems(self.ports)

# Event connections
self.svgWidget.mousePressEvent = self.svgClicked
self.tabs.currentChanged.connect(self.tabChange)
Expand All @@ -366,6 +377,8 @@ def __init__(self):
self.systemCommand.textChanged.connect(self.systemCommandChanged)
self.deleteTriggerButton.clicked.connect(self.deleteTriggerButtonClicked)
self.activeCheckBox.stateChanged.connect(self.activeCheckBoxClicked)
self.portSelect.currentIndexChanged.connect(self.portSelected)
self.portRefreshButton.clicked.connect(self.portRefreshButtonClicked)

# Background tasks
self.signalHandler = signalListener()
Expand All @@ -375,6 +388,33 @@ def __init__(self):
self.triggerHandler = triggerListener()
self.triggerHandler.start()

def serial_ports(self):
""" Lists serial port names
:raises EnvironmentError:
On unsupported or unknown platforms
:returns:
A list of the serial ports available on the system
"""
if sys.platform.startswith('win'):
ports = ['COM%s' % (i + 1) for i in range(256)]
elif sys.platform.startswith('linux') or sys.platform.startswith('cygwin'):
ports = glob.glob('/dev/tty[A-Za-z]*')
elif sys.platform.startswith('darwin'):
ports = glob.glob('/dev/tty.*')
else:
raise EnvironmentError('Unsupported platform')

result = []
for port in ports:
try:
s = serial.Serial(port)
s.close()
result.append(port)
except (OSError, serial.SerialException):
pass
return result

def tabChange(self, index):
if index == 1:
self.svgWidget.setHidden(False)
Expand Down Expand Up @@ -467,8 +507,27 @@ def deviceSelected(self, device_id):

if current_device == 1: # cyton
self.pinConfigImg.setHidden(False)
self.portSelect.setEnabled(True)
self.portRefreshButton.setEnabled(True)
else:
self.pinConfigImg.setHidden(True)
self.portSelect.setEnabled(False)
self.portRefreshButton.setEnabled(False)

self.ports = self.serial_ports()
if len(self.ports) > 0:
self.portSelected(self.ports[0])
def portSelected(self, port):
global serial_port

serial_port = port

def portRefreshButtonClicked(self):
self.ports = self.serial_ports()
if len(self.ports) > 0:
self.portSelected(self.ports[0])
self.portSelect.clear()
self.portSelect.addItems(self.ports)

def startStream(self):
global start_stream
Expand Down
70 changes: 69 additions & 1 deletion interface.ui
Original file line number Diff line number Diff line change
Expand Up @@ -104,7 +104,7 @@
<property name="geometry">
<rect>
<x>20</x>
<y>70</y>
<y>110</y>
<width>241</width>
<height>41</height>
</rect>
Expand Down Expand Up @@ -148,6 +148,74 @@
<string notr="true">background-image: url(assets/cytonpins.png);</string>
</property>
</widget>
<widget class="QComboBox" name="portSelect">
<property name="enabled">
<bool>false</bool>
</property>
<property name="geometry">
<rect>
<x>100</x>
<y>70</y>
<width>91</width>
<height>22</height>
</rect>
</property>
<property name="font">
<font>
<family>Calibri</family>
<pointsize>11</pointsize>
</font>
</property>
<property name="currentText">
<string>None</string>
</property>
<property name="currentIndex">
<number>0</number>
</property>
<item>
<property name="text">
<string>None</string>
</property>
</item>
</widget>
<widget class="QLabel" name="portLabel">
<property name="geometry">
<rect>
<x>20</x>
<y>70</y>
<width>71</width>
<height>21</height>
</rect>
</property>
<property name="font">
<font>
<family>Calibri</family>
<pointsize>11</pointsize>
</font>
</property>
<property name="text">
<string>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;Port:&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</string>
</property>
<property name="alignment">
<set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
</property>
</widget>
<widget class="QPushButton" name="portRefreshButton">
<property name="enabled">
<bool>false</bool>
</property>
<property name="geometry">
<rect>
<x>200</x>
<y>70</y>
<width>61</width>
<height>23</height>
</rect>
</property>
<property name="text">
<string>Refresh</string>
</property>
</widget>
</widget>
<widget class="QWidget" name="triggersTab">
<attribute name="title">
Expand Down

0 comments on commit 249d6c8

Please sign in to comment.