Adding state ?

Dear Members,

I can use a simple timer in :

https://infocenter.nordicsemi.com/index.jsp?topic=%2Fcom.nordic.infocenter.sdk5.v15.0.0%2Fnrf_dev_simple_timer_example.html

I want to add another state

in timeout handler I added :

void timeout_handler(void * p_context)

    case APP_STATE_SINGLE_SHOT_ANT_HRM:
                                             if (--m_state_transit_counter != 0)
                                 {
                                        if (--m_toggle_led_counter == 0)
                                        {
                                                m_toggle_led_counter = TOGGLE_LED_COUNTER;
                                                bsp_board_led_invert(BSP_BOARD_LED_0);
                                        }

                                        err_code = app_simple_timer_start(APP_SIMPLE_TIMER_MODE_SINGLE_SHOT,
                                                                                     timeout_handler,
                                                                                     TIMEOUT_VALUE,
                                                                                     NULL);
                                        APP_ERROR_CHECK(err_code);
                                }
                                else
                                {
                                        state_machine_state_change(APP_STATE_REPEATED_ANT_HRM);
                                }                
            break;

but the code doesn't go to this state...

Any clues ? thanks

Parents
  • Hello, 

    Thanks for your query.

    I would like to know few more information about function for executing the state entry action. Which state it is when you say adding a new state - 

    state_machine_state_change (APP_STATE_REPEATED_ANT_HRM) or the case APP_STATE_SINGLE_SHOT_ANT_HRM? I

    Best Regards,

    Kazi Afroza Sultana

  • Hi Kazi,

    Thanks for the reply,

    I'm talking about both states,

    Here's the case :

    /**@brief Function for executing the state entry action.
     */
    static __INLINE void state_entry_action_execute(void) //originally 20Jan22 Rixtronix LAB
    //void state_entry_action_execute(void)	
    {
        switch (m_state)
        {
            case APP_STATE_SINGLE_SHOT:
                led_and_timer_control(BSP_BOARD_LED_0, APP_SIMPLE_TIMER_MODE_SINGLE_SHOT);
    				    //start GPS from state machine, Rixtronix LAB 17 Jan 2022
    				   	//ANT_HRM_flag_timer =0;
    						
    				    GPS_flag_timer=1;
    				   
    				    
    					 
                break;
    
            case APP_STATE_REPEATED:
                //led_and_timer_control(BSP_BOARD_LED_1, APP_SIMPLE_TIMER_MODE_REPEATED); //originally 14Jan22 Rixtronix LAB
    				    led_and_timer_control(BSP_BOARD_LED_2, APP_SIMPLE_TIMER_MODE_REPEATED);
    				    //led_and_timer_control(BSP_BOARD_LED_2, APP_SIMPLE_TIMER_MODE_SINGLE_SHOT);
    				   //NRF_LOG_INFO("APP_STATE_REPEATED");
    				     GPS_flag_timer=0;
    					   
    				    
    				    
    					 
    				    //led_and_timer_control(BSP_BOARD_LED_2, APP_SIMPLE_TIMER_MODE_SINGLE_SHOT);
                break;
    				
    				case APP_STATE_SINGLE_SHOT_ANT_HRM: 
    					   led_and_timer_control(BSP_BOARD_LED_2, APP_SIMPLE_TIMER_MODE_SINGLE_SHOT); 
    				     //NRF_LOG_INFO("APP_STATE_SINGLE_SHOT_ANT_HRM");
    				     	
                 ANT_HRM_flag_timer =1;					
                break;
    				case APP_STATE_REPEATED_ANT_HRM:
    					    led_and_timer_control(BSP_BOARD_LED_0, APP_SIMPLE_TIMER_MODE_REPEATED); 
    					    ANT_HRM_flag_timer =0;					
    					   break;
            default:
                APP_ERROR_HANDLER(m_state);
                break;
        }
    }
    
    
    void timeout_handler(void * p_context)
    {
        switch (m_state)
        {
            uint32_t err_code;
    
            case APP_STATE_SINGLE_SHOT:
                if (--m_state_transit_counter != 0)
                {
                    if (--m_toggle_led_counter == 0)
                    {
                        m_toggle_led_counter = TOGGLE_LED_COUNTER;
                        bsp_board_led_invert(BSP_BOARD_LED_0);
                    }
    
                    err_code = app_simple_timer_start(APP_SIMPLE_TIMER_MODE_SINGLE_SHOT,
                                           timeout_handler,
                                           TIMEOUT_VALUE,
                                           NULL);
                    APP_ERROR_CHECK(err_code);
                }
                else
                {
                    state_machine_state_change(APP_STATE_REPEATED);
                }
                break;
    
            case APP_STATE_REPEATED:
                if (--m_state_transit_counter != 0)
                {
                    if (--m_toggle_led_counter == 0)
                    {
                        m_toggle_led_counter = TOGGLE_LED_COUNTER;
                       // bsp_board_led_invert(BSP_BOARD_LED_1);//originally 14Jan22 Rixtronix LAB
    									  bsp_board_led_invert(BSP_BOARD_LED_2);
                    }
                }
                else
                {
                    bsp_board_led_on(BSP_BOARD_LED_0);
                    //bsp_board_led_on(BSP_BOARD_LED_1);//originally 14Jan22 Rixtronix LAB
    							  bsp_board_led_on(BSP_BOARD_LED_2);
    							  
    
                    //err_code = app_simple_timer_stop();
                   // APP_ERROR_CHECK(err_code);
    
                    nrf_delay_ms(GENERIC_DELAY_TIME);
    
                    //state_machine_state_change(APP_STATE_SINGLE_SHOT); //originally 20Jan22
    							  state_machine_state_change(APP_STATE_SINGLE_SHOT_ANT_HRM);
                }
                break;
    						
    			case APP_STATE_SINGLE_SHOT_ANT_HRM: 
    											 if (--m_state_transit_counter != 0)
    								 {
    										if (--m_toggle_led_counter == 0)
    										{
    												m_toggle_led_counter = TOGGLE_LED_COUNTER;
    												bsp_board_led_invert(BSP_BOARD_LED_0);
    										}
    
    										err_code = app_simple_timer_start(APP_SIMPLE_TIMER_MODE_SINGLE_SHOT,
    																					 timeout_handler,
    																					 TIMEOUT_VALUE,
    																					 NULL);
    										APP_ERROR_CHECK(err_code);
    								}
    								else
    								{
    										state_machine_state_change(APP_STATE_REPEATED_ANT_HRM);
    								}				
                break;
    								
    			 case APP_STATE_REPEATED_ANT_HRM:			
    								 if (--m_state_transit_counter != 0)
    							{
    									if (--m_toggle_led_counter == 0)
    									{
    											m_toggle_led_counter = TOGGLE_LED_COUNTER;
    										 // bsp_board_led_invert(BSP_BOARD_LED_1);//originally 14Jan22 Rixtronix LAB
    											bsp_board_led_invert(BSP_BOARD_LED_2);
    									}
    							}
    							else
    							{
    									bsp_board_led_on(BSP_BOARD_LED_0);
    									//bsp_board_led_on(BSP_BOARD_LED_1);//originally 14Jan22 Rixtronix LAB
    									bsp_board_led_on(BSP_BOARD_LED_2);
    									
    
    									err_code = app_simple_timer_stop();
    									APP_ERROR_CHECK(err_code);
    
    									nrf_delay_ms(GENERIC_DELAY_TIME);
    
    									//state_machine_state_change(APP_STATE_SINGLE_SHOT); //originally 20Jan22
    									state_machine_state_change(APP_STATE_SINGLE_SHOT);//return to turn on GPS 20Jan22 Rixtronix LAB
    							}   				 
    				    break;
    
            default:
                APP_ERROR_HANDLER(m_state);
                break;
        }
    }
    
    

    It never goes to state 3 and 4, what do I miss here ?

    Any clues ?

    Thanks

  • Hello, 

    I have tested this (adding your extra state state_machine_state_change (APP_STATE_SINGLE_SHOT_ANT_HRM) and state_machine_state_change(APP_STATE_REPEATED_ANT_HRM) ) with the attached code and all states (LED1, LED2, LED3 and LED4)  are reached. Could you please check whether all LEDs blink?

     

    Please check and let us know the output.

    Have a nice weekend.

    Best Regards,

    Kazi Afroza Sultana

Reply
  • Hello, 

    I have tested this (adding your extra state state_machine_state_change (APP_STATE_SINGLE_SHOT_ANT_HRM) and state_machine_state_change(APP_STATE_REPEATED_ANT_HRM) ) with the attached code and all states (LED1, LED2, LED3 and LED4)  are reached. Could you please check whether all LEDs blink?

     

    Please check and let us know the output.

    Have a nice weekend.

    Best Regards,

    Kazi Afroza Sultana

Children
  • Hi Kazi,

    Thanks for the reply,

    It works ok without softdevice , but when I use softdevice,

    It works one round LED1->2->3-> then error, all LEDs blinking.

    How can I debug it ?

    DEBUG -DEBUG_NRF on preprocessor and other ways ?

    Thanks

  • on ANT HRM event :

    void ant_hrm_disp_evt_handler(ant_evt_t * p_ant_evt, void * p_context)
    {
        ant_hrm_profile_t * p_profile = ( ant_hrm_profile_t *)p_context;
        if (p_ant_evt->channel == p_profile->channel_number)
        {
            switch (p_ant_evt->event)
            {
                case EVENT_RX:
    							
                    if (p_ant_evt->message.ANT_MESSAGE_ucMesgID == MESG_BROADCAST_DATA_ID
                     || p_ant_evt->message.ANT_MESSAGE_ucMesgID == MESG_ACKNOWLEDGED_DATA_ID
                     || p_ant_evt->message.ANT_MESSAGE_ucMesgID == MESG_BURST_DATA_ID)
                    {  //originally
    													//use timer for displaying message 24 December 2021 Rixtronix LAB, stop GPS,BSC,BSP activity.
    												//GPS_flag_timer =0;	//stop GPS Activity avoid crash 30Dec21
    										//if ((ANT_HRM_flag_timer==1)&&(GPS_flag_timer==0))
    										
    											 
    											 //GPS_flag_timer =0;
    									if (ANT_HRM_flag_timer ==1)
    											{
    													//nrf_gpio_pin_set(16);
    													disp_message_decode(p_profile, p_ant_evt->message.ANT_MESSAGE_aucPayload);
    												//	ANT_HRM_flag_timer =0;
    												  //GPS_flag_timer=1;
    													//nrf_gpio_pin_clear(16);
    														// GPS_flag_timer =1;
    															 //set flag for UART READ 15 December 2021 Rixtronix LAB		
    														//GPS_UART1_Flag=1;
    												//set flag for ANT HRM SENSOR 24 December 2021 Rixtronix LAB		
    								
    											}		
    										
                    }//originally

    Any clues ?

  • on main() :

    if (GPS_flag_timer ==1)
    			{//turn on LED
    					//nrf_gpio_pin_set(15);
    				 
    			 GPSNeo_Process();
    				 //GPS_flag_timer =0;	
    					//set HRM Flag=1;
    				 //GPS_flag_timer=0;	//<--still rebooting 30Dec21 Rixtronix LAB
    				// ANT_HRM_flag_timer = 1;		
    					// app_timer_start(m_single_shot_timer_ANT_HRM_Start, APP_TIMER_TICKS(500), NULL);  // single shot ANT HRM sample29 Dec 21 Rixtronix LAB
    					//NRF_LOG_INFO("GPS FLAG =1 and ANT_HRM_FLAG=0\r\n");
    					//wait for timer for HRM
    					//turn off LED
    					//nrf_gpio_pin_clear(15);
    					//nrf_gpio_pin_set(16);
    			}

    with this :

    #define TIMEOUT_VALUE                    200

    it has a better response, can go to GPSNeo_Process() on main, but can not go to ANT HRM event....??

    Simple timer freq = 250KHz

    Simple timer Timer instance used = 2

  • Is my libuarte setting correct ?

    NRF_LIBUARTE_ASYNC_DEFINE(libuarte1, 1, 3, 2, NRF_LIBUARTE_PERIPHERAL_NOT_USED, 255, 3);

    or it's conflicting with simple timer ?

    Thanks

Related