Skip to content

Commit 3b35225

Browse files
committed
Arduino board autodetect feature
* Implemented the board autodetect feature using usb vid & pid
1 parent 0797ff1 commit 3b35225

File tree

5 files changed

+73
-10
lines changed

5 files changed

+73
-10
lines changed

MLC/GUI/Autogenerated/autogenerated.py

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -76,6 +76,9 @@ def setupUi(self, BoardConfigurationWindow):
7676
self.showPinout = QtWidgets.QPushButton(self.frame_10)
7777
self.showPinout.setObjectName("showPinout")
7878
self.horizontalLayout_9.addWidget(self.showPinout)
79+
self.autoDetect = QtWidgets.QPushButton(self.frame_10)
80+
self.autoDetect.setObjectName("autoDetect")
81+
self.horizontalLayout_9.addWidget(self.autoDetect)
7982
self.verticalLayout_7.addWidget(self.frame_10)
8083
self.groupBox_11 = QtWidgets.QGroupBox(self.boardTypeSelectorFrame)
8184
self.groupBox_11.setObjectName("groupBox_11")
@@ -575,6 +578,7 @@ def setupUi(self, BoardConfigurationWindow):
575578
self.removeAnalogPin.clicked.connect(BoardConfigurationWindow.on_analog_pin_remove)
576579
self.analog_resolution_spin.valueChanged['int'].connect(BoardConfigurationWindow.on_analog_resolution_change)
577580
self.permissions_button.clicked.connect(BoardConfigurationWindow.on_permission_button_clicked)
581+
self.autoDetect.clicked.connect(BoardConfigurationWindow.on_autodetect_clicked)
578582
# QtCore.QMetaObject.connectSlotsByName(BoardConfigurationWindow)
579583
BoardConfigurationWindow.setTabOrder(self.arduinoBoard, self.showPinout)
580584
BoardConfigurationWindow.setTabOrder(self.showPinout, self.serial_radio)
@@ -612,6 +616,7 @@ def retranslateUi(self, BoardConfigurationWindow):
612616
self.arduinoBoard.setItemText(1, _translate("BoardConfigurationWindow", "Arduino Uno"))
613617
self.arduinoBoard.setItemText(2, _translate("BoardConfigurationWindow", "Arduino Mega"))
614618
self.showPinout.setText(_translate("BoardConfigurationWindow", "Show board Pinout"))
619+
self.autoDetect.setText(_translate("BoardConfigurationWindow", "Autodetect"))
615620
self.groupBox_11.setTitle(_translate("BoardConfigurationWindow", "Connection Type"))
616621
self.serial_radio.setText(_translate("BoardConfigurationWindow", "Serial"))
617622
self.ethernet_radio.setText(_translate("BoardConfigurationWindow", "Ethernet"))

MLC/GUI/Autogenerated/mlc_qtcreator/board_config_design.ui

Lines changed: 26 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -183,6 +183,13 @@
183183
</property>
184184
</widget>
185185
</item>
186+
<item>
187+
<widget class="QPushButton" name="autoDetect">
188+
<property name="text">
189+
<string>Autodetect</string>
190+
</property>
191+
</widget>
192+
</item>
186193
</layout>
187194
</widget>
188195
</item>
@@ -1493,15 +1500,31 @@
14931500
<slot>on_permission_button_clicked()</slot>
14941501
<hints>
14951502
<hint type="sourcelabel">
1496-
<x>934</x>
1497-
<y>116</y>
1503+
<x>989</x>
1504+
<y>143</y>
14981505
</hint>
14991506
<hint type="destinationlabel">
15001507
<x>511</x>
15011508
<y>337</y>
15021509
</hint>
15031510
</hints>
15041511
</connection>
1512+
<connection>
1513+
<sender>autoDetect</sender>
1514+
<signal>clicked()</signal>
1515+
<receiver>BoardConfigurationWindow</receiver>
1516+
<slot>on_autodetect_clicked()</slot>
1517+
<hints>
1518+
<hint type="sourcelabel">
1519+
<x>918</x>
1520+
<y>61</y>
1521+
</hint>
1522+
<hint type="destinationlabel">
1523+
<x>1018</x>
1524+
<y>76</y>
1525+
</hint>
1526+
</hints>
1527+
</connection>
15051528
</connections>
15061529
<slots>
15071530
<slot>on_digital_pin_insert()</slot>
@@ -1514,6 +1537,7 @@
15141537
<slot>on_connection_type_toggle()</slot>
15151538
<slot>on_analog_resolution_change()</slot>
15161539
<slot>on_permission_button_clicked()</slot>
1540+
<slot>on_autodetect_clicked()</slot>
15171541
</slots>
15181542
<buttongroups>
15191543
<buttongroup name="connection_type_group"/>

MLC/GUI/Experiment/ArduinoConfigManager/ArduinoBoardManager.py

Lines changed: 15 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -19,18 +19,15 @@
1919
# You should have received a copy of the GNU General Public License
2020
# along with this program. If not, see <http://www.gnu.org/licenses/>
2121

22-
from ArduinoBoardDialog import ArduinoBoardDialog
2322
from ArduinoBench import ArduinoBench
2423

25-
from MLC.GUI.Autogenerated.autogenerated import Ui_BoardConfigurationWindow
2624
from MLC.GUI.Experiment.ArduinoConfigManager.BoardConfigurationWindow import BoardConfigurationWindow
2725
from MLC.arduino import boards
2826
from MLC.arduino.connection.serialconnection import SerialConnection, SerialConnectionConfig
2927
from MLC.arduino.protocol import ProtocolConfig, init_interface
3028
from MLC.arduino.connection.base import ConnectionException, ConnectionTimeoutException
3129

3230
from PyQt5.QtWidgets import QMessageBox
33-
from PyQt5.QtCore import QTimer
3431

3532
import serial
3633
import threading
@@ -161,7 +158,7 @@ def board_changed(self, new_idx, old_idx):
161158
"Warning", "Configuration reset", "Changing the board will reset all I/O pins configuration! Continue?",
162159
QMessageBox.Critical, QMessageBox.Yes | QMessageBox.No)
163160

164-
if (ret == QMessageBox.Yes):
161+
if ret == QMessageBox.Yes:
165162
del self.__setup.digital_input_pins[:]
166163
del self.__setup.digital_output_pins[:]
167164
del self.__setup.analog_input_pins[:]
@@ -171,15 +168,19 @@ def board_changed(self, new_idx, old_idx):
171168
analog_resolution=boards.types[new_idx]["ANALOG_DEFAULT_RESOLUTION"])
172169
self.__main_window.set_board(new_idx)
173170
self.__main_window.update(self.__setup)
171+
return new_idx
174172
else:
175173
self.__main_window.set_board(old_idx)
174+
return old_idx
176175

177176
def start_bench(self):
178177
try:
179-
self.__setup = self.__setup._replace(connection=self.start_connection(), **self.__main_window.checkout_board_setup())
178+
self.__setup = self.__setup._replace(connection=self.start_connection(),
179+
**self.__main_window.checkout_board_setup())
180180
except SerialConnectionException:
181181
self.show_error(
182-
"Error", "Connection failure", "Could not start connection to board", QMessageBox.Critical, QMessageBox.Ok)
182+
"Error", "Connection failure", "Could not start connection to board",
183+
QMessageBox.Critical, QMessageBox.Ok)
183184
return
184185

185186
bench = ArduinoBench()
@@ -190,6 +191,14 @@ def start_bench(self):
190191
stats.exec_()
191192
bench.stop()
192193

194+
def autodetect_board(self):
195+
board_id = boards.detect_board()
196+
197+
if board_id and board_id != self.__main_window.current_board_idx():
198+
self.board_changed(board_id, self.__main_window.current_board_idx())
199+
200+
return board_id
201+
193202
def update_analog_resolution(self, value):
194203
self.__setup = self.__setup._replace(analog_resolution=value)
195204

MLC/GUI/Experiment/ArduinoConfigManager/BoardConfigurationWindow.py

Lines changed: 14 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -226,7 +226,10 @@ def insertPin(self, pin, pinText, pinType, pinsList):
226226
pinsList.verticalHeader().setVisible(False)
227227

228228
def index_change(self, new_idx):
229-
self.__controller.board_changed(new_idx, self.__board_idx)
229+
self.__board_idx = self.__controller.board_changed(new_idx, self.__board_idx)
230+
231+
def current_board_idx(self):
232+
return self.__board_idx
230233

231234
def set_board(self, idx):
232235
self.ui.arduinoBoard.blockSignals(True)
@@ -237,7 +240,8 @@ def on_bench_test_click(self):
237240
self.__controller.start_bench()
238241

239242
def on_connection_type_toggle(self):
240-
print "Type toggled!"
243+
#TBD
244+
pass
241245

242246
def on_permission_button_clicked(self):
243247
response = QInputDialog.getText(self,
@@ -260,6 +264,14 @@ def on_permission_button_clicked(self):
260264
"Check the password inserted to be correct"
261265
.format(interface_name))
262266

267+
def on_autodetect_clicked(self):
268+
idx = self.__controller.autodetect_board()
269+
if idx is None:
270+
QMessageBox.information(self, "No device detected", "Couldn't find a supported Arduino board. "
271+
"Please, check your connections.")
272+
else:
273+
self.__board_idx = idx
274+
263275
def _update_interfaces(self):
264276
# Search for all the files which starts with tty and end with ACM in the /dev directory
265277
# FIXME: This is not portable. I don't know where the Arduino is mounted in

MLC/arduino/boards.py

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,8 @@
1919
# You should have received a copy of the GNU General Public License
2020
# along with this program. If not, see <http://www.gnu.org/licenses/>
2121

22+
import usb.core
23+
import usb.util
2224

2325
Due = {"NAME": "Arduino Due",
2426
"SHORT_NAME": "due",
@@ -49,3 +51,14 @@
4951
"ANALOG_DEFAULT_RESOLUTION": 10}
5052

5153
types = [Due, Uno, Mega, Leonardo]
54+
boards_ids = [(0x2341, 0x0043, 1),
55+
(0x2341, 0x0042, 2),
56+
(0x2341, 0x8036, 3),
57+
(0x2341, 0x003e, 0),
58+
(0x03EB, 0x6124, 0)]
59+
60+
def detect_board():
61+
for id in boards_ids:
62+
usbdevs = usb.core.find(find_all=True, idVendor=id[0], idProduct=id[1])
63+
for dev in usbdevs:
64+
return id[2]

0 commit comments

Comments
 (0)