コード例 #1
0
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
コード例 #2
0
ファイル: u_run_zephyr.py プロジェクト: mfkiwl/ubxlib
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
コード例 #3
0
ファイル: u_run_zephyr.py プロジェクト: yxw027/ubxlib
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
コード例 #4
0
ファイル: u_run_nrf5sdk.py プロジェクト: mfkiwl/ubxlib
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