This post is older than 2 years and might not be relevant anymore
More Info: Consider searching for newer posts

Building with cli and RTT on SDK14

I am working with the peripheral/flash_fds in SDK14.  I need to adapt it to use RTT instead of uart

I have made the obvious changes to switch from uart to RTT, eg substituting rtt/nrf_cli_rtt.c for uart/nrf_cli_uart.c 

However, when I build it (with armgcc) I get these errors:

Compiling file: cli.c

../../../cli.c:87:28: error: expected ')' before numeric constant

NRF_CLI_UART_DEF(cli_uart, 0, 64, 16);

                            ^

In file included from ../../../cli.c:45:0:

../../../cli.c:88:45: error: 'cli_uart' undeclared here (not in a function)

NRF_CLI_DEF(m_cli_uart, "fds example:~$ ", &cli_uart.transport, '\r', 4);

                                             ^

../../../../../../components/libraries/cli/nrf_cli.h:460:24: note: in definition of macro 'NRF_CLI_DEF'

             .p_iface = p_transport_iface,  

                             ^

This is surprising because there is only one version of cli.c in the SDK.  If really generic, why would it make reference to uart things.

I suspect that a version of cli.c for use with RTT has been omitted or exists somewhere else?

Any suggestions pls?

  • Like I tried to explain in my previous comment, the cli.c file is not part of the nrf_cli library. It is an example specific source file that is used to initialize the CLI library in that specific example. If you do not want to use UART CLI backend in that example, you need to remove/comment out the initialization of UART CLI backend from the example source file.

  • Hi Jørgen,

    I get that the supplied cli.c is not suited to use with RTT

    However, I think that there is a need to do more than comment out uart references because cli_init, cli_start and cli_process probably need some equivalent code.

    The code changes are probably something like this:

    #if NRF_CLI_UART_ENABLED
    NRF_CLI_UART_DEF(cli_uart, 0, 64, 16);
    NRF_CLI_DEF(m_cli_uart, "fds example:~$ ", &cli_uart.transport, '\r', 4);
    #else
    NRF_CLI_RTT_DEF(cli_rtt);
    NRF_CLI_DEF(m_cli_rtt, "fds example:~$ ", &cli_rtt.transport, '\r', 4);
    #endif
    
    /* Defined in main.c */
    extern char const * fds_err_str[];
    
    void cli_init(void)
    {
    #if NRF_CLI_UART_ENABLED
        nrf_drv_uart_config_t uart_config = NRF_DRV_UART_DEFAULT_CONFIG;
        uart_config.pseltxd               = TX_PIN_NUMBER;
        uart_config.pselrxd               = RX_PIN_NUMBER;
        uart_config.hwfc                  = NRF_UART_HWFC_DISABLED;
    
        ret_code_t rc = nrf_cli_init(&m_cli_uart, &uart_config, true, true, NRF_LOG_SEVERITY_INFO);
        APP_ERROR_CHECK(rc);
    #else
    	rtt_config = 0; // a bad guess
        ret_code_t rc = nrf_cli_init(&m_cli_rtt, &rtt_config, true, true, NRF_LOG_SEVERITY_INFO);
        APP_ERROR_CHECK(rc);
    #endif
    }
    
    
    void cli_start(void)
    {
    #if NRF_CLI_UART_ENABLED
      ret_code_t rc = nrf_cli_start(&m_cli_uart);
    #else
      ret_code_t rc = nrf_cli_start(&m_cli_rtt);
    #endif		
        APP_ERROR_CHECK(rc);
    }
    
    
    void cli_process(void)
    {
    #if NRF_CLI_UART_ENABLED
        nrf_cli_process(&m_cli_uart);
    #else
        nrf_cli_process(&m_cli_rtt);
    #endif
    }
    

    However, despite looking at nrf_cli_rtt.h I did not figure out how to set the second parameter of nrf_cli_init(), amongst other things.

    It would be really helpful if there was an example somewhere.

    BR Paul

  • Yes, you are correct. You need to initialize RTT backend as well if that is not included in the example.

    There are (at least) two examples in SDK 15.2.0 showing initialization and usage of RTT backend for CLI:

    nRF5_SDK_15.2.0_9412b96\examples\ble_central_and_peripheral\experimental\ble_app_interactive
    nRF5_SDK_15.2.0_9412b96\examples\peripheral\experimental_cli_libuarte

    I would not expect there to be any significant changes in the way this is done between SDK 14.2 and SDK 15.2.

  • Thx again Jørgen,

    That gave me what I needed and it's working via RTT so I can familiarise before writing it into my application.

    Here's the revised code:

    #define CLI_EXAMPLE_LOG_QUEUE_SIZE  (4)
    #if NRF_CLI_UART_ENABLED
    NRF_CLI_UART_DEF(cli_uart, 0, 64, 16);
    NRF_CLI_DEF(m_cli_uart, "fds example:~$ ", &cli_uart.transport, '\r', 4);
    #else
    NRF_CLI_RTT_DEF(m_cli_rtt_transport);
    NRF_CLI_DEF(m_cli_rtt, "rtt_cli:~$ ", &m_cli_rtt_transport.transport, '\n', CLI_EXAMPLE_LOG_QUEUE_SIZE);
    #endif
    
    /* Defined in main.c */
    extern char const * fds_err_str[];
    
    void cli_init(void)
    {
    	
    #if NRF_CLI_UART_ENABLED
        nrf_drv_uart_config_t uart_config = NRF_DRV_UART_DEFAULT_CONFIG;
        uart_config.pseltxd               = TX_PIN_NUMBER;
        uart_config.pselrxd               = RX_PIN_NUMBER;
        uart_config.hwfc                  = NRF_UART_HWFC_DISABLED;
        ret_code_t rc = nrf_cli_init(&m_cli_uart, &uart_config, true, true, NRF_LOG_SEVERITY_INFO);
        APP_ERROR_CHECK(rc);
    #else		
        ret_code_t rc = nrf_cli_init(&m_cli_rtt, NULL, true, true, NRF_LOG_SEVERITY_INFO);
        APP_ERROR_CHECK(rc);
    #endif
    }

    Remaining issues were that my Mac terminal got configured in a permanent way

      .. fixed by disabling NRF_CLI_VT100_COLORS_ENABLED but then overridden when fds_init() called.

    .. also that the terminal input echos twice.  This is not really a problem for my purposes but if I wanted to use cli in a real app it would be.  This seems to be something to do with VT100-style initialisation that does not make sense in an RTT context.  I can see the field in nrf_cli_flag_t but can't find who's setting it.

Related