Skip to content

Commit 591de05

Browse files
committed
Added boad configuration persistence between Experiment window and ArduinoBoard window
* The ArduinoBoard displays configurations received as parameter * Fixed bugs that were affecting the previously configured ports display
1 parent 741bff4 commit 591de05

File tree

5 files changed

+74
-31
lines changed

5 files changed

+74
-31
lines changed

MLC/GUI/Experiment/ArduinoConfigManager/ArduinoBoardManager.py

Lines changed: 16 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -17,15 +17,12 @@
1717

1818
class ArduinoBoardManager:
1919

20-
def __init__(self, parent_win=None):
21-
# self.__setup = BoardSetup()
22-
#FIXME ProtcolConfig y SerialConnectionConfig must be parameters!
23-
self.__setup = ProtocolConfig(None)
24-
self.__connection_config = SerialConnectionConfig('/dev/ttyACM0')
20+
def __init__(self, protocol_config, serial_config, parent_win=None):
21+
self.__setup = protocol_config
22+
self.__connection_config = serial_config
2523
self.__main_window = BoardConfigurationWindow(
2624
self, boards.types, self.__setup, parent=parent_win)
2725
self.__connectino_status = None
28-
# self.__sch = EventScheduler()
2926
self.__sch = QTimer()
3027
self.PARITY_BITS = [serial.PARITY_NONE, serial.PARITY_EVEN,
3128
serial.PARITY_EVEN, serial.PARITY_MARK, serial.PARITY_SPACE]
@@ -34,14 +31,21 @@ def __init__(self, parent_win=None):
3431
self.BYTE_SIZE = [
3532
serial.EIGHTBITS, serial.FIVEBITS, serial.SIXBITS, serial.SEVENBITS]
3633

34+
def get_protocol_config(self):
35+
return self.__setup
36+
37+
def get_connection_config(self):
38+
current_setup = self.__main_window.checkout_connection_config()
39+
config = SerialConnectionConfig(port=current_setup["port"],
40+
baudrate=current_setup["baudrate"],
41+
parity=self.PARITY_BITS[current_setup["parity"]],
42+
stopbits=self.STOP_BITS[current_setup["stopbits"]],
43+
bytesize=self.BYTE_SIZE[current_setup["bytesize"]])
44+
return config
45+
3746
def start_connection(self):
3847
# TODO Este metodo debe estar enlazado a la opcion de conexion serie
39-
current_setup = self.__main_window.checkout_connection_config()
40-
self.__connection_config = SerialConnectionConfig(port=current_setup["port"],
41-
baudrate=current_setup["baudrate"],
42-
parity=self.PARITY_BITS[current_setup["parity"]],
43-
stopbits=self.STOP_BITS[current_setup["stopbits"]],
44-
bytesize=self.BYTE_SIZE[current_setup["bytesize"]])
48+
self.__connection_config = self.get_connection_config()
4549

4650
return SerialConnection(**self.__connection_config._asdict())
4751

@@ -166,17 +170,6 @@ def start_bench(self):
166170
bench.stop()
167171

168172

169-
class BoardSetup:
170-
171-
def __init__(self):
172-
self.digital_input_pins = []
173-
self.digital_output_pins = []
174-
self.analog_input_pins = []
175-
self.analog_output_pins = []
176-
self.pwm_pins = []
177-
self.thread = None
178-
179-
180173
class EventScheduler:
181174

182175
def __init__(self):

MLC/GUI/Experiment/ArduinoConfigManager/BoardConfigurationWindow.py

Lines changed: 11 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -62,10 +62,19 @@ def update(self):
6262
self.ui.analogPinList.removeRow(i)
6363

6464
for pin in self.__setup.digital_input_pins:
65-
self.insertPin(pin, "Pin " + str(pin), 0, self.ui.digitalPinsList)
65+
self.insertPin(pin, "Pin " + str(pin), self.ui.analogPinType.itemText(0), self.ui.digitalPinsList)
6666

6767
for pin in self.__setup.digital_output_pins:
68-
self.insertPin(pin, "Pin A" + str(pin - digital_pin_count), 0, self.ui.digitalPinsList)
68+
self.insertPin(pin, "Pin " + str(pin), self.ui.analogPinType.itemText(1), self.ui.digitalPinsList)
69+
70+
for pin in self.__setup.analog_input_pins:
71+
self.insertPin(pin, "Pin A" + str(pin - digital_pin_count), self.ui.analogPinType.itemText(0), self.ui.analogPinList)
72+
73+
for pin in self.__setup.analog_output_pins:
74+
self.insertPin(pin, "Pin A" + str(pin - digital_pin_count), self.ui.analogPinType.itemText(1), self.ui.analogPinList)
75+
76+
for pin in self.__setup.pwm_pins:
77+
self.insertPin(pin, "Pin " + str(pin), self.ui.digitalPinType.itemText(2), self.ui.digitalPinsList)
6978

7079
def setup_board(self, index, board_name, image_name):
7180
_translate = QtCore.QCoreApplication.translate

MLC/GUI/Experiment/ArduinoConfigManager/test.py

Lines changed: 11 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,9 @@
33
from ArduinoBoardDialog import ArduinoBoardDialog
44
from MLC.GUI.Autogenerated.autogenerated import Ui_BoardConfigurationWindow
55
from MLC.GUI.Experiment.ArduinoConfigManager.BoardConfigurationWindow import BoardConfigurationWindow
6+
from MLC.arduino.protocol import ProtocolConfig
7+
from MLC.arduino.connection.serialconnection import SerialConnectionConfig
8+
69

710
from ArduinoBoardManager import ArduinoBoardManager
811

@@ -18,10 +21,16 @@ def showPinout():
1821
if __name__ == '__main__':
1922
app = QApplication(sys.argv)
2023
# window = BoardConfigurationWindow()
21-
manager = ArduinoBoardManager()
24+
protocol_cfg = ProtocolConfig(None)
25+
connection_cfg = SerialConnectionConfig('/dev/ttyACM0')
26+
manager = ArduinoBoardManager(protocol_cfg, connection_cfg)
2227
# ui = Ui_BoardConfigurationFrame()
2328
# ui.setupUi(window)
2429
# ui.showPinout.clicked.connect(showPinout)
2530

2631
manager.start()
27-
sys.exit(app.exec_())
32+
app.exec_()
33+
34+
manager = ArduinoBoardManager(protocol_cfg, connection_cfg)
35+
manager.start()
36+
app.exec_()

MLC/GUI/Experiment/ExperimentWindow.py

Lines changed: 34 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,10 @@
3131
from MLC.GUI.Experiment.ArduinoConfigManager.ArduinoBoardManager import ArduinoBoardManager
3232
Config
3333

34+
from MLC.arduino.protocol import ProtocolConfig
35+
from MLC.arduino.connection.serialconnection import SerialConnectionConfig, SerialConnection
36+
from MLC.arduino.connection.base import BaseConnection
37+
3438
logger = get_gui_logger()
3539

3640

@@ -77,6 +81,11 @@ def __init__(self, mlc_local,
7781
self._chart_conf = ChartConfiguration(self._autogenerated_object)
7882
self._chart_conf.init()
7983

84+
# Arduino board configurations
85+
# FIXME Board configuration must come from the experiment DB
86+
self._board_config = ProtocolConfig(None)
87+
self._serial_conn = SerialConnectionConfig('/dev/ttyACM0')
88+
8089
def closeEvent(self, event):
8190
logger.debug('[EXPERIMENT {0}] [CLOSE_DIALOG] - Executing overriden closeEvent function'.format(self._experiment_name))
8291
self._ask_if_experiment_config_must_be_saved()
@@ -274,8 +283,31 @@ def on_genealogy_button_clicked(self):
274283

275284
def on_board_config_button_clicked(self):
276285
logger.debug('[EXPERIMENT {0}] [BOARD_CONFIG_BUTTON] - Executing on_board_config_button_clicked function')
277-
board_config_window = ArduinoBoardManager(parent_win=self)
278-
board_config_window.start()
286+
#FIXME Connection config name should not be related with "serial"
287+
valid_connection = False
288+
while not valid_connection:
289+
board_config_window = ArduinoBoardManager(protocol_config=self._board_config, serial_config=self._serial_conn, parent_win=self)
290+
board_config_window.start()
291+
# The namedtuples are immutables, so we must replace to reference in order to keep the changes in the configuration
292+
self._board_config = board_config_window.get_protocol_config()
293+
self._serial_conn = board_config_window.get_connection_config()
294+
print self._serial_conn
295+
296+
try:
297+
self._board_config = self._board_config._replace(connection = SerialConnection(**self._serial_conn._asdict()))
298+
valid_connection = True
299+
except:
300+
selection = QMessageBox.critical(self, "Connection failure",
301+
"The current connection setup failed during initialization. Do you want to change this configuration? \
302+
(Choosing \"no\" means that the board will not be usable in the experiment)"
303+
.format(preev_path),
304+
QMessageBox.Yes | No, QMessageBox.Yes)
305+
if selection == QMessageBox.Yes:
306+
pass
307+
else:
308+
#FIXME: If the pin setups aren't empty then the protocol init will fail
309+
self._board_config = self._board_config._replace(connection = BaseConnection())
310+
valid_connection = True
279311

280312
def _config_table_edited(self, left, right):
281313
config_table = self._autogenerated_object.config_table

MLC/arduino/connection/base.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -7,8 +7,8 @@ class BaseConnection:
77
'''
88
def send(self,data):
99
""" Sends data to arduino device """
10-
raise Exception("Implement me!")
10+
raise NotImplementedError
1111

1212
def recv(self, length):
1313
""" Receive data from the arduino device """
14-
raise Exception("Implement me!")
14+
raise NotImplementedError

0 commit comments

Comments
 (0)