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

How to make an RTT CLI Work ?

Hi

I need a CLI over RTT on an existing project. I believe that I have extracted all the required bits from the CLI example. I dont need history, UART, USB or anything else, I dont need built in commands, at the moment I have just one single custom command. I don't need NRF log. I want the simplest solution here. Before I pull all my hair out, I was hoping someone could take a look at my code and tell me what is going on!

static void test(nrf_cli_t const * p_cli, size_t argc, char **argv)
{
	
		SEGGER_RTT_WriteString(0, "test\n");
}

NRF_CLI_CMD_REGISTER(test, NULL, "TestCmd", test);
NRF_CLI_RTT_DEF(m_cli_rtt_transport);
NRF_CLI_DEF(m_cli_rtt, "rtt_cli:~$ ", &m_cli_rtt_transport.transport, '\n', 4);

void main(void)
{
    ret_code_t err_code;
    err_code = app_timer_init();
    APP_ERROR_CHECK(err_code);
    
    err_code = nrf_cli_init(&m_cli_rtt, NULL, true, true, NRF_LOG_SEVERITY_INFO);
    APP_ERROR_CHECK(err_code);
    ret_code_t ret = nrf_cli_start(&m_cli_rtt);
    APP_ERROR_CHECK(ret);
    
    SEGGER_RTT_WriteString(0, "App Started\n");
    
    while(1)
    {
        nrf_cli_process(&m_cli_rtt);
    }
}


}

You'll note my very simple project. In the PUTTY RTT window, I can see the text 'App Started', but there is no prompt, and if I type 'test' nothing happens.

Any ideas??

Thanks, Nigel

My sdkconfig.h has a load of copy/paste thus:

#ifndef NRF_CLI_ENABLED
#define NRF_CLI_ENABLED 1
#endif

#ifndef NRF_CLI_ECHO_STATUS
#define NRF_CLI_ECHO_STATUS 1
#endif

// <o> NRF_CLI_PRINTF_BUFF_SIZE - Maximum print buffer size. 
#ifndef NRF_CLI_PRINTF_BUFF_SIZE
#define NRF_CLI_PRINTF_BUFF_SIZE 23
#endif

// <e> NRFX_CLOCK_ENABLED - nrfx_clock - CLOCK peripheral driver
//==========================================================
#ifndef NRFX_CLOCK_ENABLED
#define NRFX_CLOCK_ENABLED 1
#endif
// <o> NRFX_CLOCK_CONFIG_LF_SRC - LF Clock Source

// <0=> RC 
// <1=> XTAL 
// <2=> Synth 
// <131073=> External Low Swing 
// <196609=> External Full Swing

#ifndef NRFX_CLOCK_CONFIG_LF_SRC
#define NRFX_CLOCK_CONFIG_LF_SRC 1
#endif

// <o> NRFX_CLOCK_CONFIG_IRQ_PRIORITY - Interrupt priority

// <0=> 0 (highest) 
// <1=> 1 
// <2=> 2 
// <3=> 3 
// <4=> 4 
// <5=> 5 
// <6=> 6 
// <7=> 7

#ifndef NRFX_CLOCK_CONFIG_IRQ_PRIORITY
#define NRFX_CLOCK_CONFIG_IRQ_PRIORITY 6
#endif

// <o> NRF_CLI_CMD_BUFF_SIZE - Maximum buffer size for a single command. 
#ifndef NRF_CLI_CMD_BUFF_SIZE
#define NRF_CLI_CMD_BUFF_SIZE 128
#endif

// <o> NRF_CLI_ARGC_MAX - Maximum number of parameters passed to the command handler. 
#ifndef NRF_CLI_ARGC_MAX
#define NRF_CLI_ARGC_MAX 12
#endif

#define NRF_CLI_RTT_ENABLED 1

#define NRF_CLOCK_ENABLED 1

#define NRF_CLI_HISTORY_ENABLED 1

// <o> NRF_CLI_HISTORY_ELEMENT_SIZE - Size of one memory object reserved for CLI history. 
#ifndef NRF_CLI_HISTORY_ELEMENT_SIZE
#define NRF_CLI_HISTORY_ELEMENT_SIZE 32
#endif

// <o> NRF_CLI_HISTORY_ELEMENT_COUNT - Number of history memory objects. 
#ifndef NRF_CLI_HISTORY_ELEMENT_COUNT
#define NRF_CLI_HISTORY_ELEMENT_COUNT 8
#endif

#define NRF_CLI_RTT_TERMINAL_ID 0

#define NRF_CLI_RTT_TX_RETRY_CNT 1

#define NRF_CLI_RTT_TX_RETRY_DELAY_MS 1

#define NRF_LOG_BACKEND_SERIAL_USES_RTT 1


// <o> NRFX_CLOCK_CONFIG_IRQ_PRIORITY - Interrupt priority

// <0=> 0 (highest) 
// <1=> 1 
// <2=> 2 
// <3=> 3 
// <4=> 4 
// <5=> 5 
// <6=> 6 
// <7=> 7

#ifndef NRFX_CLOCK_CONFIG_IRQ_PRIORITY
#define NRFX_CLOCK_CONFIG_IRQ_PRIORITY 6
#endif

Parents
  • I gave up on the above in the end, stripped out the CLI stuff, and used the code below to respond to a character-press this will do for now for my test purposes. I am using one nordic 52832 board as a test board - SPI master firing commands via my protocol into my production 52832 board.

    One thing to note re the RTT is that it putty wont connect until you run up Jlink.exe with the following:

    JLink -device NRF52832_XXAA -if SWD -speed 12000 -autoconnect 1

    After that, you can connect the RTT PUTTY session

    int main(void)
    {
    		ret_code_t err_code;
    	    SEGGER_RTT_WriteString(0, "App Started\r\n");
    
            nrf_drv_spi_config_t spi_config = NRF_DRV_SPI_DEFAULT_CONFIG;
    		spi_config.ss_pin   =   29;//SPI_SS_PIN;
            spi_config.miso_pin =    2;//SPI_MISO_PIN;
            spi_config.mosi_pin =    4;//SPI_MOSI_PIN;
            spi_config.sck_pin  =    3;//SPI_SCK_PIN;
            APP_ERROR_CHECK(nrf_drv_spi_init(&spi, &spi_config, spi_event_handler, NULL));
    
    		char c = 0;
    		while (1)
            {
    			spi_xfer_done = false;
    			c = SEGGER_RTT_WaitKey();
    			
    			switch (c)
    			{
    				case 'h':
    					
    						SEGGER_RTT_WriteString(0, "Command List\r\n");
    						SEGGER_RTT_WriteString(0, "1 - eBleMcuCommand_BleOnPatientApp\r\n");
    						SEGGER_RTT_WriteString(0, "2 - eBleMcuCommand_BleOff\r\n");
    						SEGGER_RTT_WriteString(0, "3 - eBleMcuCommand_BleOnPatientTechApp\r\n");
    						SEGGER_RTT_WriteString(0, "4 - eBleMcuCommand_BleOnAllApps\r\n");
    						SEGGER_RTT_WriteString(0, "5 - eBleMcuCommand_BleOnTechApp\r\n");
    						SEGGER_RTT_WriteString(0, "6 - eBleMcuCommand_ForgetPairing\r\n");
    						break;
    				
    				
    				case '1':
    				
    						SEGGER_RTT_WriteString(0, "eBleMcuCommand_BleOnPatientApp\r\n");
    						BuildProteusMessage(&sOutgoingProteusMessage.sProteusMsg,eSrcDstEndpoint_AcquisitionMcu_1,eSrcDstEndpoint_BleMcu_1,false,false,false,eBleMcuCommand_BleOnPatientApp,0,0);
    						APP_ERROR_CHECK(nrf_drv_spi_transfer(&spi,ByteArrayFromProteusMessage(&sOutgoingProteusMessage.sProteusMsg,true), ProteusMsgLen, NULL, 0));
    						while(spi_xfer_done == false) {}
    						SEGGER_RTT_WriteString(0, "eBleMcuCommand_BleOnPatientApp --> Complete\r\n");
    						break;
    				
    				case '2':
    
    						SEGGER_RTT_WriteString(0, "eBleMcuCommand_BleOff\r\n");
    						break;
    				
    				case '3':
    
    						SEGGER_RTT_WriteString(0, "eBleMcuCommand_BleOnPatientTechApp\r\n");
    						break;
    				
    				case '4':
    
    						SEGGER_RTT_WriteString(0, "eBleMcuCommand_BleOnAllApps\r\n");
    						break;
    				
    				case '5':
    
    						SEGGER_RTT_WriteString(0, "eBleMcuCommand_BleOnTechApp\r\n");
    						break;
    				
    				case '6':
    
    						SEGGER_RTT_WriteString(0, "eBleMcuCommand_ForgetPairing\r\n");
    						break;
    				
    				case 'r':   //read the ACK/NAK
    					
    						SEGGER_RTT_WriteString(0, "Wait For ACK\r\n");
    						uint8_t AckNak;
    						spi_xfer_done = false;
    						APP_ERROR_CHECK(nrf_drv_spi_transfer(&spi, NULL, 0,&AckNak,1));
    						while(spi_xfer_done == false) {}
    						SEGGER_RTT_printf(0, "AckNak Recieved: %X\r\n",AckNak);
    						
    				
    				default:
    					
    					//donothing
    			}
    		}
    }

Reply
  • I gave up on the above in the end, stripped out the CLI stuff, and used the code below to respond to a character-press this will do for now for my test purposes. I am using one nordic 52832 board as a test board - SPI master firing commands via my protocol into my production 52832 board.

    One thing to note re the RTT is that it putty wont connect until you run up Jlink.exe with the following:

    JLink -device NRF52832_XXAA -if SWD -speed 12000 -autoconnect 1

    After that, you can connect the RTT PUTTY session

    int main(void)
    {
    		ret_code_t err_code;
    	    SEGGER_RTT_WriteString(0, "App Started\r\n");
    
            nrf_drv_spi_config_t spi_config = NRF_DRV_SPI_DEFAULT_CONFIG;
    		spi_config.ss_pin   =   29;//SPI_SS_PIN;
            spi_config.miso_pin =    2;//SPI_MISO_PIN;
            spi_config.mosi_pin =    4;//SPI_MOSI_PIN;
            spi_config.sck_pin  =    3;//SPI_SCK_PIN;
            APP_ERROR_CHECK(nrf_drv_spi_init(&spi, &spi_config, spi_event_handler, NULL));
    
    		char c = 0;
    		while (1)
            {
    			spi_xfer_done = false;
    			c = SEGGER_RTT_WaitKey();
    			
    			switch (c)
    			{
    				case 'h':
    					
    						SEGGER_RTT_WriteString(0, "Command List\r\n");
    						SEGGER_RTT_WriteString(0, "1 - eBleMcuCommand_BleOnPatientApp\r\n");
    						SEGGER_RTT_WriteString(0, "2 - eBleMcuCommand_BleOff\r\n");
    						SEGGER_RTT_WriteString(0, "3 - eBleMcuCommand_BleOnPatientTechApp\r\n");
    						SEGGER_RTT_WriteString(0, "4 - eBleMcuCommand_BleOnAllApps\r\n");
    						SEGGER_RTT_WriteString(0, "5 - eBleMcuCommand_BleOnTechApp\r\n");
    						SEGGER_RTT_WriteString(0, "6 - eBleMcuCommand_ForgetPairing\r\n");
    						break;
    				
    				
    				case '1':
    				
    						SEGGER_RTT_WriteString(0, "eBleMcuCommand_BleOnPatientApp\r\n");
    						BuildProteusMessage(&sOutgoingProteusMessage.sProteusMsg,eSrcDstEndpoint_AcquisitionMcu_1,eSrcDstEndpoint_BleMcu_1,false,false,false,eBleMcuCommand_BleOnPatientApp,0,0);
    						APP_ERROR_CHECK(nrf_drv_spi_transfer(&spi,ByteArrayFromProteusMessage(&sOutgoingProteusMessage.sProteusMsg,true), ProteusMsgLen, NULL, 0));
    						while(spi_xfer_done == false) {}
    						SEGGER_RTT_WriteString(0, "eBleMcuCommand_BleOnPatientApp --> Complete\r\n");
    						break;
    				
    				case '2':
    
    						SEGGER_RTT_WriteString(0, "eBleMcuCommand_BleOff\r\n");
    						break;
    				
    				case '3':
    
    						SEGGER_RTT_WriteString(0, "eBleMcuCommand_BleOnPatientTechApp\r\n");
    						break;
    				
    				case '4':
    
    						SEGGER_RTT_WriteString(0, "eBleMcuCommand_BleOnAllApps\r\n");
    						break;
    				
    				case '5':
    
    						SEGGER_RTT_WriteString(0, "eBleMcuCommand_BleOnTechApp\r\n");
    						break;
    				
    				case '6':
    
    						SEGGER_RTT_WriteString(0, "eBleMcuCommand_ForgetPairing\r\n");
    						break;
    				
    				case 'r':   //read the ACK/NAK
    					
    						SEGGER_RTT_WriteString(0, "Wait For ACK\r\n");
    						uint8_t AckNak;
    						spi_xfer_done = false;
    						APP_ERROR_CHECK(nrf_drv_spi_transfer(&spi, NULL, 0,&AckNak,1));
    						while(spi_xfer_done == false) {}
    						SEGGER_RTT_printf(0, "AckNak Recieved: %X\r\n",AckNak);
    						
    				
    				default:
    					
    					//donothing
    			}
    		}
    }

Children
No Data
Related