77from MLC .Log .log import get_gui_logger
88from MLC .Simulation import Simulation
99from sql_statements import *
10+ from sql_statements_board_configuration import *
11+ from MLC .arduino .protocol import ProtocolConfig
12+ from MLC .arduino .boards import types
1013
1114logger = get_gui_logger ()
1215
@@ -43,8 +46,18 @@ def __init__(self, database, init_db=False):
4346
4447 def __initialize_db (self ):
4548 cursor = self ._conn .cursor ()
49+
50+ # MLC Population tables
4651 cursor .execute (stmt_create_table_individuals ())
4752 cursor .execute (stmt_create_table_population ())
53+
54+ # Board configuration tables
55+ cursor .execute (stmt_create_table_board ())
56+ cursor .execute (stmt_create_table_serial_connection ())
57+ cursor .execute (stmt_create_table_digital_pin ())
58+ cursor .execute (stmt_create_table_analog_pin ())
59+ cursor .execute (stmt_create_table_pwm_pin ())
60+
4861 cursor .close ()
4962 self ._conn .commit ()
5063
@@ -239,6 +252,7 @@ def update_individual_cost(self, individual_id, cost, evaluation_time, generatio
239252 self .__execute (stmt_to_update_cost )
240253
241254 def __execute (self , statement ):
255+ # print ">>> %s" % statement
242256 conn = self .__get_db_connection ()
243257 cursor = conn .cursor ()
244258 cursor .execute (statement )
@@ -289,3 +303,113 @@ def __load_individuals(self):
289303 cursor .close ()
290304 conn .commit ()
291305 return individuals
306+
307+ # board configuration
308+ def save_board_configuration (self , board_config , board_id = None ):
309+
310+ conn = self .__get_db_connection ()
311+ cursor = conn .cursor ()
312+
313+ try :
314+ # save/update board configuration
315+ if board_id is None :
316+ cursor .execute (stmt_insert_board (board_config .board_type ["SHORT_NAME" ],
317+ 0 , # serial connection hardcoded
318+ board_config .read_count ,
319+ board_config .read_delay ,
320+ board_config .report_mode ,
321+ board_config .analog_resolution ))
322+ board_id = cursor .lastrowid
323+ else :
324+ cursor .execute (stmt_update_board (board_id ,
325+ board_config .board_type ["SHORT_NAME" ],
326+ 0 ,
327+ board_config .read_count ,
328+ board_config .read_delay ,
329+ board_config .report_mode ,
330+ board_config .analog_resolution ))
331+ if cursor .rowcount < 1 :
332+ raise KeyError ("Board %s does not exist" % board_id )
333+
334+ # if board update is successful, update board pins
335+ # delete board pin configuration
336+ cursor .execute (stmt_delete_digital_pin (board_id ))
337+ cursor .execute (stmt_delete_analog_pin (board_id ))
338+ cursor .execute (stmt_delete_pwm_pin (board_id ))
339+
340+ # update digital pins
341+ self .__insert_pins (board_config .digital_input_pins , cursor , stmt_insert_digital_pin , board_id , 0 )
342+ self .__insert_pins (board_config .digital_output_pins , cursor , stmt_insert_digital_pin , board_id , 1 )
343+
344+ # update analog pins
345+ self .__insert_pins (board_config .analog_input_pins , cursor , stmt_insert_analog_pin , board_id , 0 )
346+ self .__insert_pins (board_config .analog_output_pins , cursor , stmt_insert_analog_pin , board_id , 1 )
347+
348+ # update pwm pins
349+ for pin_id in board_config .pwm_pins :
350+ cursor .execute (stmt_insert_pwm_pin (board_id , pin_id ))
351+
352+ except Exception :
353+ raise
354+ finally :
355+ cursor .close ()
356+ conn .commit ()
357+
358+ return board_id
359+
360+ def __insert_pins (self , pin_list , cursor , stmt_insert_pin , board_id , pin_type ):
361+ for pin_id in pin_list :
362+ cursor .execute (stmt_insert_pin (board_id , pin_id , pin_type ))
363+
364+ def __get_pins (self , cursor , stmt_get_pins , board_id ):
365+ input_pins = []
366+ output_pins = []
367+
368+ for row in cursor .execute (stmt_get_pins (board_id )):
369+ pin_id , pin_type = row [0 ], row [1 ]
370+ if pin_type == 0 :
371+ input_pins .append (pin_id )
372+ else :
373+ output_pins .append (pin_id )
374+ return input_pins , output_pins
375+
376+ def load_board_configuration (self , board_id ):
377+ protocol = None
378+ conn = self .__get_db_connection ()
379+ cursor = conn .execute (stmt_get_board (board_id ))
380+
381+ for row in cursor :
382+ board_type = filter (lambda x : x ["SHORT_NAME" ] == row [0 ], types )
383+
384+ protocol = ProtocolConfig (connection = None ,
385+ board_type = board_type [0 ],
386+ report_mode = row [1 ],
387+ read_count = row [2 ],
388+ read_delay = row [3 ],
389+ analog_resolution = row [4 ])
390+ break
391+
392+ if protocol is None :
393+ raise KeyError ("Board %s dows not exists" % board_id )
394+
395+ # load pins
396+ input_pins , output_pins = self .__get_pins (cursor , stmt_get_analog_pins , board_id )
397+ protocol .analog_input_pins .extend (input_pins )
398+ protocol .analog_output_pins .extend (output_pins )
399+
400+ input_pins , output_pins = self .__get_pins (cursor , stmt_get_digital_pins , board_id )
401+ protocol .digital_input_pins .extend (input_pins )
402+ protocol .digital_output_pins .extend (output_pins )
403+
404+ for row in cursor .execute (stmt_get_pwm_pins (board_id )):
405+ protocol .pwm_pins .append (row [0 ])
406+
407+ cursor .close ()
408+
409+ return protocol
410+
411+ def save_connection (self , serial_connection , board_id , connection_id = None ):
412+ raise NotImplementedError ("This method must be implemented" )
413+
414+ def load_connection (self , connection_id ):
415+ raise NotImplementedError ("This method must be implemented" )
0 commit comments