86 """! Factory producing connectors based on type and config
87 @param conn_resource Name of connection primitive (e.g. 'serial' for
88 local serial port connection or 'grm' for global resource manager)
89 @param event_queue Even queue of Key-Value protocol
90 @param config Global configuration for connection process
91 @param logger Host Test logger instance
92 @return Object of type <ConnectorPrimitive> or None if type of connection primitive unknown (conn_resource)
94 polling_timeout = int(config.get(
'polling_timeout', 60))
95 logger.prn_inf(
"notify event queue about extra %d sec timeout for serial port pooling"%polling_timeout)
96 event_queue.put((
'__timeout', polling_timeout, time()))
98 if conn_resource ==
'serial':
103 port = config.get(
'port')
104 baudrate = config.get(
'baudrate')
106 logger.prn_inf(
"initializing serial port listener... ")
112 elif conn_resource ==
'grm':
114 logger.prn_inf(
"initializing global resource mgr listener... ")
116 elif conn_resource ==
'fmc':
118 logger.prn_inf(
"initializing fast model connection")
121 logger.pn_err(
"unknown connection resource!")
122 raise NotImplementedError(
"ConnectorPrimitive factory: unknown connection resource '%s'!"% conn_resource)
129 def __notify_conn_lost():
130 error_msg = connector.error()
132 event_queue.put((
'__notify_conn_lost', error_msg, time()))
134 def __notify_sync_failed():
135 error_msg = connector.error()
137 event_queue.put((
'__notify_sync_failed', error_msg, time()))
140 logger.prn_inf(
"starting connection process...")
144 event_queue.put((
'__conn_process_start', 1, time()))
147 sync_behavior = int(config.get(
'sync_behavior', 1))
148 sync_timeout = config.get(
'sync_timeout', 1.0)
149 conn_resource = config.get(
'conn_resource',
'serial')
156 if not connector.connected():
157 logger.prn_err(
"Failed to connect to resource")
168 sync_uuid_discovered =
False
170 def __send_sync(timeout=None):
171 sync_uuid = str(uuid.uuid4())
174 logger.prn_inf(
"Reset the part and send in new preamble...")
176 logger.prn_inf(
"resending new preamble '%s' after %0.2f sec"% (sync_uuid, timeout))
178 logger.prn_inf(
"sending preamble '%s'"% sync_uuid)
180 if connector.write_kv(
'__sync', sync_uuid):
186 if not connector.write(
"mbed" * 10, log=
True):
202 if sync_behavior > 0:
204 logger.prn_inf(
"sending up to %s __sync packets (specified with --sync=%s)"% (sync_behavior, sync_behavior))
205 sync_uuid = __send_sync()
208 sync_uuid_list.append(sync_uuid)
213 elif sync_behavior == 0:
215 logger.prn_wrn(
"skipping __sync packet (specified with --sync=%s)"% sync_behavior)
218 logger.prn_inf(
"sending multiple __sync packets (specified with --sync=%s)"% sync_behavior)
220 sync_uuid = __send_sync()
222 sync_uuid_list.append(sync_uuid)
232 if not connector.connected():
238 (key, value, _) = dut_event_queue.get(block=
False)
243 if key ==
'__host_test_finished' and value ==
True:
244 logger.prn_inf(
"received special event '%s' value='%s', finishing"% (key, value))
247 elif key ==
'__reset':
248 logger.prn_inf(
"received special event '%s', resetting dut" % (key))
250 event_queue.put((
"reset_complete", 0, time()))
251 elif not connector.write_kv(key, value):
252 connector.write_kv(key, value)
257 data = connector.read(2304)
260 print_lines = kv_buffer.append(data)
261 for line
in print_lines:
263 event_queue.put((
'__rxd_line', line, time()))
264 while kv_buffer.search():
265 key, value, timestamp = kv_buffer.pop_kv()
267 if sync_uuid_discovered:
268 event_queue.put((key, value, timestamp))
269 logger.prn_inf(
"found KV pair in stream: {{%s;%s}}, queued..."% (key, value))
272 if value
in sync_uuid_list:
273 sync_uuid_discovered =
True
274 event_queue.put((key, value, time()))
275 idx = sync_uuid_list.index(value)
276 logger.prn_inf(
"found SYNC in stream: {{%s;%s}} it is #%d sent, queued..."% (key, value, idx))
278 logger.prn_err(
"found faulty SYNC in stream: {{%s;%s}}, ignored..."% (key, value))
279 logger.prn_inf(
"Resetting the part and sync timeout to clear out the buffer...")
283 logger.prn_wrn(
"found KV pair in stream: {{%s;%s}}, ignoring..."% (key, value))
285 if not sync_uuid_discovered:
292 if sync_behavior != 0:
293 time_to_sync_again = time() - loop_timer
294 if time_to_sync_again > sync_timeout:
295 sync_uuid = __send_sync(timeout=time_to_sync_again)
298 sync_uuid_list.append(sync_uuid)
303 if sync_behavior == 0:
308 elif last_sync ==
True:
310 __notify_sync_failed()