Skip to content

Commit cf94cd9

Browse files
committed
Merge branch 'arduino_manager'
2 parents a94e615 + 15df37e commit cf94cd9

File tree

6 files changed

+109
-30
lines changed

6 files changed

+109
-30
lines changed

MLC/GUI/Experiment/ArduinoConfigManager/ArduinoBoardManager.py

Lines changed: 18 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -17,31 +17,37 @@
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, close_handler, 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]
3229
self.STOP_BITS = [
3330
serial.STOPBITS_ONE, serial.STOPBITS_ONE_POINT_FIVE, serial.STOPBITS_TWO]
3431
self.BYTE_SIZE = [
3532
serial.EIGHTBITS, serial.FIVEBITS, serial.SIXBITS, serial.SEVENBITS]
33+
#FIXME the connection with the handler shold be made by a method of the window
34+
self.__main_window.on_close_signal.connect(close_handler)
35+
36+
def get_protocol_config(self):
37+
return self.__setup
38+
39+
def get_connection_config(self):
40+
current_setup = self.__main_window.checkout_connection_config()
41+
config = SerialConnectionConfig(port=current_setup["port"],
42+
baudrate=current_setup["baudrate"],
43+
parity=self.PARITY_BITS[current_setup["parity"]],
44+
stopbits=self.STOP_BITS[current_setup["stopbits"]],
45+
bytesize=self.BYTE_SIZE[current_setup["bytesize"]])
46+
return config
3647

3748
def start_connection(self):
3849
# 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"]])
50+
self.__connection_config = self.get_connection_config()
4551

4652
return SerialConnection(**self.__connection_config._asdict())
4753

@@ -166,17 +172,6 @@ def start_bench(self):
166172
bench.stop()
167173

168174

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-
180175
class EventScheduler:
181176

182177
def __init__(self):

MLC/GUI/Experiment/ArduinoConfigManager/BoardConfigurationWindow.py

Lines changed: 22 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -8,11 +8,15 @@
88
from MLC.GUI.Autogenerated.autogenerated import Ui_BoardConfigurationWindow
99
from MLC.GUI.Experiment.ArduinoConfigManager.ArduinoBoardDialog import ArduinoBoardDialog
1010
from MLC.GUI.Experiment.ArduinoConfigManager.ArduinoConnectionDialog import ArduinoConnectionDialog
11+
from PyQt5.QtCore import pyqtSignal
1112

1213
from MLC.GUI.Experiment.ArduinoConfigManager.Common import create_local_full_path
1314

1415

1516
class BoardConfigurationWindow(QMainWindow):
17+
# * The setup (all the things configured)
18+
# * The serial connection setup
19+
on_close_signal = pyqtSignal([list, list])
1620

1721
def __init__(self, controller, boards, setup, parent=None):
1822
super(BoardConfigurationWindow, self).__init__(parent)
@@ -35,6 +39,13 @@ def __init__(self, controller, boards, setup, parent=None):
3539
self.update()
3640
self.ui.arduinoBoard.currentIndexChanged.connect(self.index_change)
3741

42+
def closeEvent(self, event):
43+
board_setup = [self.__controller.get_protocol_config()]
44+
connection_cfg = [self.__controller.get_connection_config()]
45+
self.on_close_signal.emit(board_setup, connection_cfg)
46+
event.accept()
47+
#super(BoardConfigurationWindow, self).closeEvent(event)
48+
3849
def update(self):
3950
aux_idx = 0
4051
self.ui.digitalPins.clear()
@@ -62,10 +73,19 @@ def update(self):
6273
self.ui.analogPinList.removeRow(i)
6374

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

6778
for pin in self.__setup.digital_output_pins:
68-
self.insertPin(pin, "Pin A" + str(pin - digital_pin_count), 0, self.ui.digitalPinsList)
79+
self.insertPin(pin, "Pin " + str(pin), self.ui.analogPinType.itemText(1), self.ui.digitalPinsList)
80+
81+
for pin in self.__setup.analog_input_pins:
82+
self.insertPin(pin, "Pin A" + str(pin - digital_pin_count), self.ui.analogPinType.itemText(0), self.ui.analogPinList)
83+
84+
for pin in self.__setup.analog_output_pins:
85+
self.insertPin(pin, "Pin A" + str(pin - digital_pin_count), self.ui.analogPinType.itemText(1), self.ui.analogPinList)
86+
87+
for pin in self.__setup.pwm_pins:
88+
self.insertPin(pin, "Pin " + str(pin), self.ui.digitalPinType.itemText(2), self.ui.digitalPinsList)
6989

7090
def setup_board(self, index, board_name, image_name):
7191
_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: 41 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -34,11 +34,16 @@
3434
from PyQt5.QtWidgets import QMessageBox
3535
from PyQt5.QtWidgets import QInputDialog
3636

37+
from MLC.arduino.protocol import ProtocolConfig
38+
from MLC.arduino.connection.serialconnection import SerialConnectionConfig, SerialConnection
39+
from MLC.arduino.connection.base import BaseConnection
40+
3741
logger = get_gui_logger()
3842

3943

4044
class ExperimentWindow(QMainWindow):
4145
experiment_finished = pyqtSignal([bool])
46+
4247
MAX_GENERATIONS = 30
4348

4449
def __init__(self, mlc_local,
@@ -102,6 +107,11 @@ def __init__(self, mlc_local,
102107
autogenerated_object=self._autogenerated_object,
103108
mlc_local=self._mlc_local)
104109

110+
# Arduino board configurations
111+
# FIXME Board configuration must come from the experiment DB
112+
self._board_config = ProtocolConfig(None)
113+
self._serial_conn = SerialConnectionConfig('/dev/ttyACM0')
114+
105115
def closeEvent(self, event):
106116
logger.debug('[EXPERIMENT {0}] [CLOSE_DIALOG] - Executing overriden closeEvent function'.format(self._experiment_name))
107117
self._ask_if_experiment_config_must_be_saved()
@@ -382,7 +392,9 @@ def on_board_config_button_clicked(self):
382392
logger.debug('[EXPERIMENT {0}] [BOARD_CONFIG_BUTTON] - '
383393
'Executing on_board_config_button_clicked function'
384394
.format(self._experiment_name))
385-
board_config_window = ArduinoBoardManager(parent_win=self)
395+
valid_connection = False
396+
board_config_window = ArduinoBoardManager(protocol_config=self._board_config, serial_config=self._serial_conn,
397+
close_handler=self._store_board_configuration, parent_win=self)
386398
board_config_window.start()
387399

388400
def on_edit_config_button_clicked(self):
@@ -723,3 +735,31 @@ def _update_experiment(self, cancelled):
723735
self._update_experiment_info()
724736
self._update_individuals_figure()
725737
self._update_scatter_chart()
738+
739+
def _store_board_configuration(self, board_config, serial_conn):
740+
# Pass the parameter as a list to mock PyQt fixed data types
741+
logger.debug('[EXPERIMENT {0}] [BOARD_CONFIG] - '
742+
'Board has been configured'
743+
.format(self._experiment_name))
744+
745+
self._board_config = board_config[0]
746+
self._serial_conn = serial_conn[0]
747+
748+
# Init the arduino singleton
749+
try:
750+
ArduinoInterfaceSingleton.get_instance(protocol_setup=self._board_config,
751+
conn_setup=self._serial_conn)
752+
except Exception, err:
753+
logger.debug('[EXPERIMENT {0}] [BOARD_CONFIG] - '
754+
'Serial port could not be initialized. Error Msg: {1}'
755+
.format(self._experiment_name, err))
756+
selection = QMessageBox.critical(self, "Connection failure",
757+
"The current connection setup failed during initialization. "
758+
"Do you want to change this configuration?. "
759+
"Choosing \"no\" means that the board will not be usable in the experiment)",
760+
QMessageBox.Yes | QMessageBox.No,
761+
QMessageBox.Yes)
762+
if selection == QMessageBox.Yes:
763+
self.on_board_config_button_clicked()
764+
else:
765+
self._board_config = self._board_config._replace(connection=BaseConnection())

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

MLC/arduino/protocol.py

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,21 @@
2020
PIN_MODES = collections.namedtuple(
2121
'PIN_MODES', ['INPUT', 'OUTPUT'], verbose=False)(INPUT=0, OUTPUT=1)
2222

23+
class ArduinoInterfaceSingleton():
24+
_instance = None
25+
26+
def get_instance(cls, protocol_config=None, conn_setup=None):
27+
from MLC.arduino.connection.serialconnection import SerialConnection
28+
if protocol_setup and conn_setup:
29+
serial_conn = SerialConnection(**conn_setup)
30+
protocol_config._replace(connection, serial_conn)
31+
ArduinoInterfaceSingleton._instance = BuildSerial(protocol_config)
32+
33+
if ArduinoInterfaceSingleton._instance is None:
34+
raise Exception("ArduinoInterface was not configured.")
35+
36+
return ArduinoInterfaceSingleton._instance
37+
2338

2439
class ArduinoInterface:
2540
# 0=input 1=output -- wiring_constants.h

0 commit comments

Comments
 (0)