Skip to content

Commit 4957bb9

Browse files
committed
#52 serial connection persistence implemented
1 parent 607dc1b commit 4957bb9

File tree

3 files changed

+148
-9
lines changed

3 files changed

+148
-9
lines changed

MLC/db/sqlite/sql_statements_board_configuration.py

Lines changed: 35 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -11,10 +11,11 @@ def stmt_create_table_board():
1111
def stmt_create_table_serial_connection():
1212
return ''' CREATE TABLE serial_connection(id INTEGER PRIMARY KEY AUTOINCREMENT,
1313
board_id INTEGER,
14-
baud_rate INTEGER,
14+
port INTEGER,
15+
baudrate INTEGER,
1516
parity INTEGER,
16-
stop_bits INTEGER,
17-
byte_size INTEGER,
17+
stopbits INTEGER,
18+
bytesize INTEGER,
1819
FOREIGN KEY(board_id) REFERENCES board(id))'''
1920

2021

@@ -112,4 +113,34 @@ def stmt_get_digital_pins(board_id):
112113

113114

114115
def stmt_get_pwm_pins(board_id):
115-
return "SELECT pin_id FROM pwm_pin WHERE board_id = %s" % (board_id)
116+
return "SELECT pin_id FROM pwm_pin WHERE board_id = %s" % (board_id)
117+
118+
119+
def stmt_insert_serial_connection(board_id, port, baudrate, parity, stopbits, bytesize):
120+
return '''INSERT INTO serial_connection (board_id, port, baudrate, parity, stopbits, bytesize)
121+
VALUES (%s, %s, %s, %s, %s, %s)''' % (board_id,
122+
port,
123+
baudrate,
124+
parity,
125+
stopbits,
126+
bytesize)
127+
128+
def stmt_update_serial_connection(connection_id, board_id, port, baudrate, parity, stopbits, bytesize):
129+
return '''UPDATE serial_connection SET
130+
board_id = "%s",
131+
port = %s,
132+
baudrate = %s,
133+
parity = %s,
134+
stopbits = %s,
135+
bytesize = %s
136+
WHERE id = %s''' % (board_id,
137+
port,
138+
baudrate,
139+
parity,
140+
stopbits,
141+
bytesize,
142+
connection_id)
143+
144+
def stmt_get_serial_connection(board_id):
145+
return '''SELECT port, baudrate, parity, stopbits, bytesize
146+
FROM serial_connection WHERE board_id = %s''' % board_id

MLC/db/sqlite/sqlite_repository.py

Lines changed: 52 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@
99
from sql_statements import *
1010
from sql_statements_board_configuration import *
1111
from MLC.arduino.protocol import ProtocolConfig
12+
from MLC.arduino.connection.serialconnection import SerialConnectionConfig
1213
from MLC.arduino.boards import types
1314

1415
logger = get_gui_logger()
@@ -408,8 +409,55 @@ def load_board_configuration(self, board_id):
408409

409410
return protocol
410411

411-
def save_connection(self, serial_connection, board_id, connection_id=None):
412-
raise NotImplementedError("This method must be implemented")
412+
def save_serial_connection(self, serial_connection, board_id, connection_id=None):
413+
conn = self.__get_db_connection()
414+
cursor = conn.cursor()
415+
416+
try:
417+
# save/update board configuration
418+
if connection_id is None:
419+
cursor.execute(stmt_insert_serial_connection(board_id,
420+
serial_connection.port,
421+
serial_connection.baudrate,
422+
serial_connection.parity,
423+
serial_connection.stopbits,
424+
serial_connection.bytesize))
425+
connection_id = cursor.lastrowid
426+
else:
427+
cursor.execute(stmt_update_serial_connection(connection_id,
428+
board_id,
429+
serial_connection.port,
430+
serial_connection.baudrate,
431+
serial_connection.parity,
432+
serial_connection.stopbits,
433+
serial_connection.bytesize))
434+
if cursor.rowcount < 1:
435+
raise KeyError("Connection %s does not exist" % board_id)
436+
except sqlite3.IntegrityError:
437+
raise KeyError("Board %s does not exist" % board_id)
438+
except Exception:
439+
raise
440+
finally:
441+
cursor.close()
442+
conn.commit()
443+
444+
return connection_id
445+
446+
def load_serial_connection(self, board_id):
447+
serial_connection = None
448+
449+
conn = self.__get_db_connection()
450+
cursor = conn.execute(stmt_get_serial_connection(board_id))
451+
452+
for row in cursor:
453+
serial_connection = SerialConnectionConfig(port=row[0],
454+
baudrate=row[1],
455+
parity=row[2],
456+
stopbits=row[3],
457+
bytesize=row[4])
458+
break
459+
460+
if serial_connection is None:
461+
raise KeyError("Serial Connectio %s doess not exists" % board_id)
413462

414-
def load_connection(self, connection_id):
415-
raise NotImplementedError("This method must be implemented")
463+
return serial_connection

tests/mlc/db/test_mlc_repository.py

Lines changed: 61 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,9 @@
1010

1111
from MLC.arduino.protocol import ProtocolConfig, REPORT_MODES
1212
from MLC.arduino.boards import Mega, Due
13+
from MLC.arduino.connection.serialconnection import SerialConnectionConfig
14+
15+
from serial import serialutil
1316

1417

1518
class MLCRepositoryTest(unittest.TestCase):
@@ -23,14 +26,21 @@ class MLCRepositoryTest(unittest.TestCase):
2326
read_delay=2000,
2427
analog_resolution=12)
2528

26-
def __create_board_config(self, digital_input_pins, digital_output_pins, analog_input_pins, analog_output_pins, pwm_pins):
29+
def __create_board_config(self, digital_input_pins=[], digital_output_pins=[], analog_input_pins=[], analog_output_pins=[], pwm_pins=[]):
2730
return ProtocolConfig(connection=None, board_type=Mega, report_mode=REPORT_MODES.BULK, read_count=1000, read_delay=2000, analog_resolution=12,
2831
digital_input_pins=digital_input_pins ,
2932
digital_output_pins=digital_output_pins,
3033
analog_input_pins=analog_input_pins,
3134
analog_output_pins=analog_output_pins,
3235
pwm_pins=pwm_pins)
3336

37+
def __create_serial_connection(self):
38+
return SerialConnectionConfig(baudrate=1,
39+
parity=2,
40+
stopbits=3,
41+
bytesize=4,
42+
port=5)
43+
3444
@classmethod
3545
def setUpClass(cls):
3646
Config._instance = Config.from_dictionary({"BEHAVIOUR": {"save": "false"},
@@ -688,3 +698,53 @@ def test_update_board_pins(self):
688698
self.assertEqual(updated_board.analog_input_pins, [27, 28, 29])
689699
self.assertEqual(updated_board.analog_output_pins, [30, 31, 32])
690700
self.assertEqual(updated_board.pwm_pins, [33, 34, 35])
701+
702+
def test_save_serial_connection(self):
703+
mlc_repo = self.__get_new_repo()
704+
board = self.__create_board_config()
705+
board_id = mlc_repo.save_board_configuration(board)
706+
707+
serial_connection = self.__create_serial_connection()
708+
serial_connection_id = mlc_repo.save_serial_connection(serial_connection, board_id)
709+
710+
loaded_serial_connection = mlc_repo.load_serial_connection(board_id)
711+
712+
self.assertEquals(serial_connection.port, loaded_serial_connection.port)
713+
self.assertEquals(serial_connection.baudrate, loaded_serial_connection.baudrate)
714+
self.assertEquals(serial_connection.parity, loaded_serial_connection.parity)
715+
self.assertEquals(serial_connection.stopbits, loaded_serial_connection.stopbits)
716+
self.assertEquals(serial_connection.bytesize, loaded_serial_connection.bytesize)
717+
718+
def test_save_serial_connection_invalid_board_id(self):
719+
mlc_repo = self.__get_new_repo()
720+
serial_connection = self.__create_serial_connection()
721+
try:
722+
serial_connection_id = mlc_repo.save_serial_connection(serial_connection, 1)
723+
self.assertTrue(False)
724+
except KeyError:
725+
self.assertTrue(True)
726+
727+
def test_update_serial_connection(self):
728+
mlc_repo = self.__get_new_repo()
729+
board = self.__create_board_config()
730+
board_id = mlc_repo.save_board_configuration(board)
731+
732+
serial_connection = self.__create_serial_connection()
733+
serial_connection_id = mlc_repo.save_serial_connection(serial_connection, board_id)
734+
735+
updated_serial_connection = SerialConnectionConfig(baudrate=100,
736+
parity=200,
737+
stopbits=300,
738+
bytesize=400,
739+
port=500)
740+
741+
updated_serial_connection_id = mlc_repo.save_serial_connection(updated_serial_connection, board_id, connection_id=serial_connection_id)
742+
743+
self.assertEqual(updated_serial_connection_id, serial_connection_id)
744+
serial_connection = mlc_repo.load_serial_connection(board_id)
745+
746+
self.assertEquals(serial_connection.port, updated_serial_connection.port)
747+
self.assertEquals(serial_connection.baudrate, updated_serial_connection.baudrate)
748+
self.assertEquals(serial_connection.parity, updated_serial_connection.parity)
749+
self.assertEquals(serial_connection.stopbits, updated_serial_connection.stopbits)
750+
self.assertEquals(serial_connection.bytesize, updated_serial_connection.bytesize)

0 commit comments

Comments
 (0)