def run(instance, mcu, toolchain, connection, connection_lock, platform_lock, misc_locks, clean, defines, ubxlib_dir, working_dir, printer, reporter, test_report_handle): '''Build/run on nRF5''' return_value = -1 hex_file_path = None instance_text = u_utils.get_instance_text(instance) swo_port = u_utils.JLINK_SWO_PORT downloaded = False # Don't need the platform lock del platform_lock prompt = PROMPT + instance_text + ": " # Print out what we've been told to do text = "running nRF5 for " + mcu + " under " + toolchain if connection and "debugger" in connection and connection["debugger"]: text += ", on JLink debugger serial number " + connection["debugger"] if clean: text += ", clean build" if defines: text += ", with #define(s)" for idx, define in enumerate(defines): if idx == 0: text += " \"" + define + "\"" else: text += ", \"" + define + "\"" if ubxlib_dir: text += ", ubxlib directory \"" + ubxlib_dir + "\"" if working_dir: text += ", working directory \"" + working_dir + "\"" printer.string("{}{}.".format(prompt, text)) reporter.event(u_report.EVENT_TYPE_BUILD, u_report.EVENT_START, "nRF5SDK/" + toolchain) # Switch to the working directory with u_utils.ChangeDir(working_dir): # Check that everything we need is installed if check_installation(toolchain, TOOLS_LIST, printer, prompt): # Fetch Unity if u_utils.fetch_repo(u_utils.UNITY_URL, u_utils.UNITY_SUBDIR, None, printer, prompt): # Do the build build_start_time = time() if toolchain.lower() == "gcc": build_subdir_gcc = BUILD_SUBDIR_PREFIX_GCC + instance_text.replace( ".", "_") hex_file_path = build_gcc(clean, build_subdir_gcc, ubxlib_dir, defines, printer, prompt, reporter) elif toolchain.lower() == "ses": hex_file_path = build_ses(clean, ubxlib_dir, defines, printer, prompt, reporter) if hex_file_path: # Build succeeded, need to lock a connection to do the download reporter.event( u_report.EVENT_TYPE_BUILD, u_report.EVENT_PASSED, "build took {:.0f} second(s)".format(time() - build_start_time)) # Do the download # On nRF5 doing a download or starting RTT logging # on more than one platform at a time seems to cause # problems, even though it should be tied to the # serial number of the given debugger on that board, # so lock JLink for this. jlink_lock = None if "jlink_lock" in misc_locks: jlink_lock = misc_locks["jlink_lock"] with u_utils.Lock(jlink_lock, INSTALL_LOCK_WAIT_SECONDS, "JLink", printer, prompt) as locked_jlink: if locked_jlink: with u_connection.Lock( connection, connection_lock, CONNECTION_LOCK_GUARD_TIME_SECONDS, printer, prompt) as locked_connection: if locked_connection: reporter.event( u_report.EVENT_TYPE_DOWNLOAD, u_report.EVENT_START) # I have seen the download fail on occasion # so give this two bites of the cherry retries = 2 while not downloaded and (retries > 0): downloaded = download( connection, DOWNLOAD_GUARD_TIME_SECONDS, hex_file_path, printer, prompt) retries -= 1 if not downloaded and (retries > 0): reporter.event( u_report.EVENT_TYPE_DOWNLOAD, u_report.EVENT_WARNING, "unable to download, will retry..." ) sleep(5) if downloaded: reporter.event( u_report.EVENT_TYPE_DOWNLOAD, u_report.EVENT_COMPLETE) # Now the target can be reset u_utils.reset_nrf_target( connection, printer, prompt) reporter.event( u_report.EVENT_TYPE_TEST, u_report.EVENT_START) if connection and "swo_port" in connection: swo_port = connection["swo_port"] # With JLink started RUN_JLINK.append("-RTTTelnetPort") RUN_JLINK.append(str(swo_port)) if connection and "debugger" in connection and \ connection["debugger"]: RUN_JLINK.append("-USB") RUN_JLINK.append( connection["debugger"]) with u_utils.ExeRun(RUN_JLINK, printer, prompt, with_stdin=True ) as process_jlink: # Open the Telnet port to JLink # to get the debug output telnet_handle = u_utils.open_telnet( swo_port, printer, prompt) if telnet_handle is not None: # Monitor progress return_value = u_monitor. \ main(telnet_handle, u_monitor.CONNECTION_TELNET, RUN_GUARD_TIME_SECONDS, RUN_INACTIVITY_TIME_SECONDS, instance, printer, reporter, test_report_handle) telnet_handle.close() else: reporter.event(u_report.EVENT_TYPE_INFRASTRUCTURE, u_report.EVENT_FAILED, "unable to open RTT port " + \ str(swo_port)) # JLink is VERY touchy as to how it exits, # need to send it "exit\n" over stdin # for it to exit cleanly process_jlink.stdin.write( "exit\n".encode()) sleep(5) if return_value == 0: reporter.event( u_report.EVENT_TYPE_TEST, u_report.EVENT_COMPLETE) else: reporter.event( u_report.EVENT_TYPE_TEST, u_report.EVENT_FAILED) else: reporter.event( u_report.EVENT_TYPE_DOWNLOAD, u_report.EVENT_FAILED, "check debug log for details") # Wait for a short while before giving # the connection lock away to make sure # that everything really has shut down # in the debugger sleep(5) else: reporter.event( u_report.EVENT_TYPE_INFRASTRUCTURE, u_report.EVENT_FAILED, "unable to lock a connection") else: reporter.event(u_report.EVENT_TYPE_INFRASTRUCTURE, u_report.EVENT_FAILED, "unable to lock JLink") else: return_value = 1 reporter.event(u_report.EVENT_TYPE_BUILD, u_report.EVENT_FAILED, "check debug log for details") else: reporter.event(u_report.EVENT_TYPE_INFRASTRUCTURE, u_report.EVENT_FAILED, "unable to fetch Unity") else: reporter.event( u_report.EVENT_TYPE_INFRASTRUCTURE, u_report.EVENT_FAILED, "there is a problem with the tools installation for nRF5 SDK") return return_value
def run(instance, mcu, board, toolchain, connection, connection_lock, platform_lock, misc_locks, clean, defines, ubxlib_dir, working_dir, printer, reporter, test_report_handle, keep_going_flag=None): '''Build/run on Zephyr''' return_value = -1 build_dir = None instance_text = u_utils.get_instance_text(instance) # Don't need the platform or misc locks del platform_lock del misc_locks # Only one toolchain for Zephyr del toolchain prompt = PROMPT + instance_text + ": " # Print out what we've been told to do text = "running Zephyr for " + mcu + " (on a \"" + board + "\" board)" if connection and "debugger" in connection and connection["debugger"]: text += ", on JLink debugger serial number " + connection["debugger"] if clean: text += ", clean build" if defines: text += ", with #define(s)" for idx, define in enumerate(defines): if idx == 0: text += " \"" + define + "\"" else: text += ", \"" + define + "\"" if ubxlib_dir: text += ", ubxlib directory \"" + ubxlib_dir + "\"" if working_dir: text += ", working directory \"" + working_dir + "\"" printer.string("{}{}.".format(prompt, text)) reporter.event(u_report.EVENT_TYPE_BUILD, u_report.EVENT_START, "Zephyr") # Switch to the working directory with u_utils.ChangeDir(working_dir): # Check that everything we need is installed # and configured if u_utils.keep_going(keep_going_flag, printer, prompt) and \ check_installation(TOOLS_LIST, printer, prompt): # Set up the environment variables for Zephyr returned_env = set_env(printer, prompt) if u_utils.keep_going(keep_going_flag, printer, prompt) and \ returned_env: # The west tools need to use the environment # configured above. print_env(returned_env, printer, prompt) # Note that Zephyr brings in its own # copy of Unity so there is no need to # fetch it here. if board: # Do the build build_start_time = time() build_dir = build(board, clean, ubxlib_dir, defines, returned_env, printer, prompt, reporter, keep_going_flag) if u_utils.keep_going(keep_going_flag, printer, prompt) and \ build_dir: # Build succeeded, need to lock some things to do the download reporter.event( u_report.EVENT_TYPE_BUILD, u_report.EVENT_PASSED, "build took {:.0f} second(s)".format( time() - build_start_time)) # Do the download with u_connection.Lock( connection, connection_lock, CONNECTION_LOCK_GUARD_TIME_SECONDS, printer, prompt, keep_going_flag) as locked_connection: if locked_connection: # Get the device name for JLink jlink_device_name = jlink_device(mcu) if not jlink_device_name: reporter.event( u_report.EVENT_TYPE_INFRASTRUCTURE, u_report.EVENT_WARNING, "MCU not found in JLink devices") # Do the download reporter.event(u_report.EVENT_TYPE_DOWNLOAD, u_report.EVENT_START) retries = 0 downloaded = False while u_utils.keep_going(keep_going_flag, printer, prompt) and \ not downloaded and (retries < 3): downloaded = download( connection, jlink_device_name, DOWNLOAD_GUARD_TIME_SECONDS, build_dir, returned_env, printer, prompt) if not downloaded: reporter.event( u_report.EVENT_TYPE_DOWNLOAD, u_report.EVENT_WARNING, "unable to download, will retry..." ) retries += 1 sleep(5) if downloaded: reporter.event( u_report.EVENT_TYPE_DOWNLOAD, u_report.EVENT_COMPLETE) # Now the target can be reset u_utils.reset_nrf_target( connection, printer, prompt) reporter.event(u_report.EVENT_TYPE_TEST, u_report.EVENT_START) with URttReader( jlink_device(mcu), jlink_serial=connection[ "debugger"], printer=printer, prompt=prompt) as rtt_reader: return_value = u_monitor.main( rtt_reader, u_monitor.CONNECTION_RTT, RUN_GUARD_TIME_SECONDS, RUN_INACTIVITY_TIME_SECONDS, "\n", instance, printer, reporter, test_report_handle, keep_going_flag=keep_going_flag) if return_value == 0: reporter.event( u_report.EVENT_TYPE_TEST, u_report.EVENT_COMPLETE) else: reporter.event( u_report.EVENT_TYPE_TEST, u_report.EVENT_FAILED) else: reporter.event( u_report.EVENT_TYPE_DOWNLOAD, u_report.EVENT_FAILED, "check debug log for details") else: reporter.event( u_report.EVENT_TYPE_INFRASTRUCTURE, u_report.EVENT_FAILED, "unable to lock a connection") else: return_value = 1 reporter.event(u_report.EVENT_TYPE_BUILD, u_report.EVENT_FAILED, "check debug log for details") else: return_value = 1 reporter.event(u_report.EVENT_TYPE_INFRASTRUCTURE, u_report.EVENT_FAILED, "unable to find overlay file") else: reporter.event(u_report.EVENT_TYPE_INFRASTRUCTURE, u_report.EVENT_FAILED, "environment setup failed") else: reporter.event( u_report.EVENT_TYPE_INFRASTRUCTURE, u_report.EVENT_FAILED, "there is a problem with the tools installation for Zephyr") return return_value
def run(instance, mcu, toolchain, connection, connection_lock, platform_lock, misc_locks, clean, defines, ubxlib_dir, working_dir, printer, reporter, test_report_handle): '''Build/run on Zephyr''' return_value = -1 build_dir = None instance_text = u_utils.get_instance_text(instance) # Don't need the platform lock del platform_lock # Only one toolchain for Zephyr del toolchain prompt = PROMPT + instance_text + ": " # Print out what we've been told to do text = "running Zephyr for " + mcu if connection and "debugger" in connection and connection["debugger"]: text += ", on JLink debugger serial number " + connection["debugger"] if clean: text += ", clean build" if defines: text += ", with #define(s)" for idx, define in enumerate(defines): if idx == 0: text += " \"" + define + "\"" else: text += ", \"" + define + "\"" if ubxlib_dir: text += ", ubxlib directory \"" + ubxlib_dir + "\"" if working_dir: text += ", working directory \"" + working_dir + "\"" printer.string("{}{}.".format(prompt, text)) reporter.event(u_report.EVENT_TYPE_BUILD, u_report.EVENT_START, "Zephyr") # Switch to the working directory with u_utils.ChangeDir(working_dir): # Check that everything we need is installed # and configured if check_installation(TOOLS_LIST, printer, prompt): # Set up the environment variables for Zephyr returned_env = set_env(printer, prompt) if returned_env: # The west tools need to use the environment # configured above. print_env(returned_env, printer, prompt) # Note that Zephyr brings in its own # copy of Unity so there is no need to # fetch it here. # For Zephyr we need to obtain the full board name board = find_board(ubxlib_dir, mcu) if board: # Do the build build_start_time = time() build_dir = build(board, clean, ubxlib_dir, defines, returned_env, printer, prompt, reporter) if build_dir: # Build succeeded, need to lock some things to do the download reporter.event( u_report.EVENT_TYPE_BUILD, u_report.EVENT_PASSED, "build took {:.0f} second(s)".format( time() - build_start_time)) # On NRF52 (NRF5)/Zephyr (NRF53/NRF52) doing a download # on more than one platform at a time or doing a download # while RTT logging is in progress seems to cause problems, # even though it should be tied to the serial number of the # given debugger on that board, so lock JLink for this. jlink_lock = None if "jlink_lock" in misc_locks: jlink_lock = misc_locks["jlink_lock"] with u_utils.Lock(jlink_lock, INSTALL_LOCK_WAIT_SECONDS, "JLink", printer, prompt) as locked_jlink: if locked_jlink: with u_connection.Lock( connection, connection_lock, CONNECTION_LOCK_GUARD_TIME_SECONDS, printer, prompt) as locked_connection: if locked_connection: # Get the device name for JLink jlink_device_name = jlink_device(mcu) if not jlink_device_name: reporter.event( u_report. EVENT_TYPE_INFRASTRUCTURE, u_report.EVENT_WARNING, "MCU not found in JLink devices" ) # Do the download reporter.event( u_report.EVENT_TYPE_DOWNLOAD, u_report.EVENT_START) if download( connection, jlink_device_name, DOWNLOAD_GUARD_TIME_SECONDS, build_dir, returned_env, printer, prompt): reporter.event( u_report.EVENT_TYPE_DOWNLOAD, u_report.EVENT_COMPLETE) # Now the target can be reset u_utils.reset_nrf_target( connection, printer, prompt) reporter.event( u_report.EVENT_TYPE_TEST, u_report.EVENT_START) if connection and "swo_port" in connection: swo_port = connection[ "swo_port"] # With JLink started if jlink_device_name: RUN_JLINK.append("-Device") RUN_JLINK.append( jlink_device(mcu)) RUN_JLINK.append("-RTTTelnetPort") RUN_JLINK.append(str(swo_port)) if connection and "debugger" in connection and \ connection["debugger"]: RUN_JLINK.append("-USB") RUN_JLINK.append( connection["debugger"]) with u_utils.ExeRun( RUN_JLINK, printer, prompt, with_stdin=True ) as process_jlink: # Open the Telnet port to JLink # to get the debug output telnet_handle = u_utils.open_telnet( swo_port, printer, prompt) if telnet_handle is not None: # Monitor progress return_value = u_monitor. \ main(telnet_handle, u_monitor.CONNECTION_TELNET, RUN_GUARD_TIME_SECONDS, RUN_INACTIVITY_TIME_SECONDS, instance, printer, reporter, test_report_handle) telnet_handle.close() else: reporter.event(u_report.EVENT_TYPE_INFRASTRUCTURE, u_report.EVENT_FAILED, "unable to open RTT port " + \ str(swo_port)) # JLink is VERY touchy as to how it exits, # need to send it "exit\n" over stdin # for it to exit cleanly process_jlink.stdin.write( "exit\n".encode()) sleep(5) if return_value == 0: reporter.event( u_report.EVENT_TYPE_TEST, u_report.EVENT_COMPLETE) else: reporter.event( u_report.EVENT_TYPE_TEST, u_report.EVENT_FAILED) else: reporter.event( u_report.EVENT_TYPE_DOWNLOAD, u_report.EVENT_FAILED, "check debug log for details") else: reporter.event( u_report.EVENT_TYPE_INFRASTRUCTURE, u_report.EVENT_FAILED, "unable to lock a connection") else: reporter.event( u_report.EVENT_TYPE_INFRASTRUCTURE, u_report.EVENT_FAILED, "unable to lock JLink") else: return_value = 1 reporter.event(u_report.EVENT_TYPE_BUILD, u_report.EVENT_FAILED, "check debug log for details") else: return_value = 1 reporter.event(u_report.EVENT_TYPE_INFRASTRUCTURE, u_report.EVENT_FAILED, "unable to find overlay file") else: reporter.event(u_report.EVENT_TYPE_INFRASTRUCTURE, u_report.EVENT_FAILED, "environment setup failed") else: reporter.event( u_report.EVENT_TYPE_INFRASTRUCTURE, u_report.EVENT_FAILED, "there is a problem with the tools installation for Zephyr") return return_value
def run(instance, mcu, toolchain, connection, connection_lock, platform_lock, misc_locks, clean, defines, ubxlib_dir, working_dir, printer, reporter, test_report_handle, keep_going_flag=None, unity_dir=None): '''Build/run on nRF5''' return_value = -1 hex_file_path = None instance_text = u_utils.get_instance_text(instance) downloaded = False _ = (misc_locks) # Suppress unused variable # Don't need the platform lock del platform_lock prompt = PROMPT + instance_text + ": " # Print out what we've been told to do text = "running nRF5 for " + mcu + " under " + toolchain if connection and "debugger" in connection and connection["debugger"]: text += ", on JLink debugger serial number " + connection["debugger"] if clean: text += ", clean build" if defines: text += ", with #define(s)" for idx, define in enumerate(defines): if idx == 0: text += " \"" + define + "\"" else: text += ", \"" + define + "\"" if ubxlib_dir: text += ", ubxlib directory \"" + ubxlib_dir + "\"" if working_dir: text += ", working directory \"" + working_dir + "\"" if unity_dir: text += ", using Unity from \"" + unity_dir + "\"" printer.string("{}{}.".format(prompt, text)) reporter.event(u_report.EVENT_TYPE_BUILD, u_report.EVENT_START, "nRF5SDK/" + toolchain) # Switch to the working directory with u_utils.ChangeDir(working_dir): # Check that everything we need is installed if u_utils.keep_going(keep_going_flag, printer, prompt) and \ check_installation(toolchain, TOOLS_LIST, printer, prompt): # Fetch Unity, if necessary if u_utils.keep_going(keep_going_flag, printer, prompt) and \ not unity_dir: if u_utils.fetch_repo(u_utils.UNITY_URL, u_utils.UNITY_SUBDIR, None, printer, prompt, submodule_init=False): unity_dir = os.getcwd() + os.sep + u_utils.UNITY_SUBDIR if unity_dir: # Do the build build_start_time = time() if u_utils.keep_going(keep_going_flag, printer, prompt): if toolchain.lower() == "gcc": build_subdir_gcc = BUILD_SUBDIR_PREFIX_GCC + instance_text.replace( ".", "_") hex_file_path = build_gcc(clean, build_subdir_gcc, ubxlib_dir, unity_dir, defines, printer, prompt, reporter, keep_going_flag) elif toolchain.lower() == "ses": hex_file_path = build_ses(clean, ubxlib_dir, unity_dir, defines, printer, prompt, reporter, keep_going_flag) if hex_file_path: # Build succeeded, need to lock a connection to do the download reporter.event( u_report.EVENT_TYPE_BUILD, u_report.EVENT_PASSED, "build took {:.0f} second(s)".format(time() - build_start_time)) # Do the download with u_connection.Lock( connection, connection_lock, CONNECTION_LOCK_GUARD_TIME_SECONDS, printer, prompt, keep_going_flag) as locked_connection: if locked_connection: reporter.event(u_report.EVENT_TYPE_DOWNLOAD, u_report.EVENT_START) # I have seen the download fail on occasion # so give this two bites of the cherry retries = 2 while not downloaded and (retries > 0): downloaded = download( connection, DOWNLOAD_GUARD_TIME_SECONDS, hex_file_path, printer, prompt) retries -= 1 if not downloaded and (retries > 0): reporter.event( u_report.EVENT_TYPE_DOWNLOAD, u_report.EVENT_WARNING, "unable to download, will retry...") sleep(5) if downloaded: reporter.event(u_report.EVENT_TYPE_DOWNLOAD, u_report.EVENT_COMPLETE) # Now the target can be reset u_utils.reset_nrf_target( connection, printer, prompt) reporter.event(u_report.EVENT_TYPE_TEST, u_report.EVENT_START) with URttReader( "NRF52840_XXAA", jlink_serial=connection["debugger"], printer=printer, prompt=prompt) as rtt_reader: return_value = u_monitor.main( rtt_reader, u_monitor.CONNECTION_RTT, RUN_GUARD_TIME_SECONDS, RUN_INACTIVITY_TIME_SECONDS, "\n", instance, printer, reporter, test_report_handle) if return_value == 0: reporter.event(u_report.EVENT_TYPE_TEST, u_report.EVENT_COMPLETE) else: reporter.event(u_report.EVENT_TYPE_TEST, u_report.EVENT_FAILED) else: reporter.event(u_report.EVENT_TYPE_DOWNLOAD, u_report.EVENT_FAILED, "check debug log for details") # Wait for a short while before giving # the connection lock away to make sure # that everything really has shut down # in the debugger sleep(5) else: reporter.event(u_report.EVENT_TYPE_INFRASTRUCTURE, u_report.EVENT_FAILED, "unable to lock a connection") else: return_value = 1 reporter.event(u_report.EVENT_TYPE_BUILD, u_report.EVENT_FAILED, "check debug log for details") else: reporter.event(u_report.EVENT_TYPE_INFRASTRUCTURE, u_report.EVENT_FAILED, "unable to fetch Unity") else: reporter.event( u_report.EVENT_TYPE_INFRASTRUCTURE, u_report.EVENT_FAILED, "there is a problem with the tools installation for nRF5 SDK") return return_value