Start stop button ?

Dear Members,

How can I make a start/stop button with 1 button ?

Here's my handler :

void bsp_event_handler(bsp_event_t event)
{
    switch (event)
    {
        case BSP_EVENT_SLEEP:
            nrf_pwr_mgmt_shutdown(NRF_PWR_MGMT_SHUTDOWN_GOTO_SYSOFF);
            break;
				
				 case BSP_EVENT_KEY_0:
					 NRF_LOG_INFO("BSP_EVENT_KEY 0 PUSH ON\n");
            if (actual_state != BSP_INDICATE_FIRST)
                actual_state--;
						    //NRF_LOG_INFO("BSP_EVENT_KEY 0 PUSH ON\n"); //2Mar22 Rixtronix LAB
            else
                actual_state = BSP_INDICATE_LAST;
						    NRF_LOG_INFO("BSP_EVENT_KEY 0 PUSH OFF\n"); //2Mar22 Rixtronix LAB
            break;
            ............

Any clues ?

Kind regards,

Rixtronix LAB

Parents
  • Hi Karl,

    How can I make power on and off in 1 button ?

    Regards,

    Rixtronix

  • Hi Karl,

    from ble_peripheral directory examples above,

    which example is using button with SYSTEM_OFF,

    and which example is using "button long push" for event ?

    Best regards,

    Rixtronix

  • Hi Karl,

    Thanks for the reply,

    #define BSP_LONG_PUSH_TIMEOUT_MS (1000) /**< The time to hold for a long push (in milliseconds). */

    Here's the complete event :

    void bsp_event_handler(bsp_event_t event)
    {
      ret_code_t err_code;
    	int32_t cnt;
        switch (event)
        {
            case BSP_EVENT_SLEEP:
                nrf_pwr_mgmt_shutdown(NRF_PWR_MGMT_SHUTDOWN_GOTO_SYSOFF);
                break;
    				
    				 case BSP_EVENT_KEY_0:
    					 /************START STOP BUTTON 3Mar22 Rixtronix LAB**************/
    					 
    									//NRF_LOG_INFO("BSP_EVENT_KEY 0 PUSH START\n");
    						
    								   if(button0_state)
    										{
    												//START_function();
    											  //NRF_LOG_INFO("BSP_EVENT_KEY 0 PUSH START\n");
    											
    											 NRF_LOG_INFO("BSP_EVENT_KEY 0 PUSH STOP\n");
    											  //beep_v9();
    											  app_timer_stop(m_repeated_timer_id);
    												button0_state = STATE_OFF;  
    											  
    										}
    										else
    										{
    												//STOP_function();
    											  NRF_LOG_INFO("BSP_EVENT_KEY 0 PUSH START\n");
    											  //NRF_LOG_INFO("BSP_EVENT_KEY 0 PUSH STOP\n");
    											  //beep_v10();
    											   app_timer_start(m_repeated_timer_id, APP_TIMER_TICKS(1000), NULL);  //3Mar22 Time of Ride Rixtronix LAB
    												button0_state = STATE_ON;
    											
    										}
    						
    				  /************START STOP BUTTON 3Mar22 Rixtronix LAB**************/
    					 
                if (actual_state != BSP_INDICATE_FIRST)
    						   
                    actual_state--;
    						   
                else
    						
                    actual_state = BSP_INDICATE_LAST;
    						
                break;
    
            case BSP_EVENT_KEY_1:
                NRF_LOG_INFO("BSP_EVENT_KEY 1 PUSH STOP\n");
    				    
                if (actual_state != BSP_INDICATE_LAST)
                    actual_state++;
                else
                    actual_state = BSP_INDICATE_FIRST;
                break;
    						
    				 case BSP_EVENT_KEY_2:
    					 NRF_LOG_INFO("BSP_EVENT_KEY 2 PUSH ON\n");
    				   if(button2_state)
    										{  
    																					cnt++;
    													 if ( cnt >= LONG_PRESS(10000))
    													 {
    															 cnt = 0;
    															 NRF_LOG_INFO("Long Button press");
    													 }		
    																				
    												//ON_function();
    											  NRF_LOG_INFO("BSP_EVENT_KEY 2 PUSH ON==> LONG PUSH >200ms\n");
    											 //beep_v11();
    											
    												button2_state = STATE_OFF;
    										}
    										else
    										{
    												//OFF_function();
    											   cnt = 0; // reset counter variable
    											  NRF_LOG_INFO("BSP_EVENT_KEY 2 PUSH OFF\n");
    											  //beep_v12();
    											 
    												button2_state = STATE_ON;
    										}
                if (actual_state != BSP_INDICATE_FIRST)
                    actual_state--;
                else
                    actual_state = BSP_INDICATE_LAST;
                break;
    
            case BSP_EVENT_KEY_3:
                //NRF_LOG_INFO("BSP_EVENT_KEY 3 PUSH OFF\n");
    						
               													 
    				     if(button3_state)
    										{  
    														
    																	
    												//ON_function();
    											  NRF_LOG_INFO("BSP_EVENT_KEY 3 PUSH ON==> LONG PUSH >200ms\n");
    											 //beep_v11();
    											
    												button3_state = STATE_OFF;
    										}
    										else
    										{
    												//OFF_function();
    											  NRF_LOG_INFO("BSP_EVENT_KEY 3 PUSH OFF\n");
    											  //beep_v12();
    											 
    												button3_state = STATE_ON;
    										}
    					 								 
                if (actual_state != BSP_INDICATE_LAST)
                    actual_state++;
                else
                    actual_state = BSP_INDICATE_FIRST;
                break;		
    
    
            default:
                break;
        }
    }
    

    I can't get 2000 mS long push, is the timer running ?

    Is it conflicting with BSP ant button ?

    static void utils_setup(void)
    {
        //ret_code_t err_code;
    	  ret_code_t err_code = app_timer_init();
        APP_ERROR_CHECK(err_code);
    
        err_code = bsp_init(BSP_INIT_LEDS | BSP_INIT_BUTTONS,
                            bsp_event_handler);
        APP_ERROR_CHECK(err_code);
    
        err_code = nrf_pwr_mgmt_init();
        APP_ERROR_CHECK(err_code);
    		
    	    
    	
        err_code = bsp_btn_ant_init(m_ant_hrm.channel_number, HRM_DISP_CHANNEL_TYPE);
        APP_ERROR_CHECK(err_code);
    
        //err_code = ant_state_indicator_init(m_ant_hrm.channel_number, HRM_DISP_CHANNEL_TYPE);
        APP_ERROR_CHECK(err_code);
    	
    	  err_code = bsp_btn_ant_init(m_ant_bsc.channel_number, BSC_DISP_CHANNEL_TYPE);
        APP_ERROR_CHECK(err_code);
    		
    		err_code = bsp_btn_ant_init(m_ant_bpwr.channel_number, BPWR_DISP_CHANNEL_TYPE);
        APP_ERROR_CHECK(err_code);
    	
    	  //err_code = ant_state_indicator_init(m_ant_bsc.channel_number, BSC_DISP_CHANNEL_TYPE);
        APP_ERROR_CHECK(err_code);
    		NRF_LOG_INFO("utils_setup\r\n");
    }

    Best regards,

    Rixtronix

  • Read button function :

    void read_button()
    {
    	ret_code_t err_code;
    	  err_code = bsp_event_to_button_action_assign(BSP_BUTTON_0,
                                                                BSP_BUTTON_ACTION_PUSH,
                                                                BSP_EVENT_KEY_0);
    	
    	  
    	
     	  err_code = bsp_event_to_button_action_assign(BSP_BUTTON_1,
                                                                BSP_BUTTON_ACTION_PUSH, 
                                                                BSP_EVENT_KEY_1);//hardware not connected
    	
    	  
    	 
      /************originally***********	
    	 err_code = bsp_event_to_button_action_assign(BSP_BUTTON_2,
                                                                BSP_BUTTON_ACTION_PUSH,
                                                                BSP_EVENT_KEY_2);
    	**************/
    	err_code = bsp_event_to_button_action_assign(BSP_BUTTON_2,
                                                                BSP_BUTTON_ACTION_LONG_PUSH, 
                                                                BSP_EVENT_KEY_2);
    
    	/*************originally button 4
    	err_code = bsp_event_to_button_action_assign(BSP_BUTTON_3,
                                                                BSP_BUTTON_ACTION_PUSH,
                                                                BSP_EVENT_KEY_3);
    																														
      *************Rixtronix LAB 17 Mar 22*/
    	err_code = bsp_event_to_button_action_assign(BSP_BUTTON_3,
                                                                BSP_BUTTON_ACTION_LONG_PUSH, 
                                                                BSP_EVENT_KEY_3);
    
    }	

  • Hi Karl,

    Looks like it's not responding to :

    case BSP_EVENT_KEY_2:
    					 //NRF_LOG_INFO("BSP_EVENT_KEY 2 PUSH ON\n");
    				   if(button2_state)
    										{  
    																					cnt++;
    													 if ( cnt >= LONG_PRESS(10000))
    													 {
    															 cnt = 0;
    															 NRF_LOG_INFO("Long Button press");
    													 }		
    																				
    												//ON_function();
    											  NRF_LOG_INFO("BSP_EVENT_KEY 2 PUSH ON==> LONG PUSH >200ms\n");
    											 //beep_v11();
    											
    												button2_state = STATE_OFF;
    										}
    										else
    										{
    												//OFF_function();
    											   cnt = 0; // reset counter variable
    											  NRF_LOG_INFO("BSP_EVENT_KEY 2 PUSH OFF\n");
    											  //beep_v12();
    											 
    												button2_state = STATE_ON;
    										}

    How can I relate this code to timer as I can see in :

    https://devzone.nordicsemi.com/f/nordic-q-a/43506/how-to-use-bsp_button_action_push-and-bsp_button_action_long_push-on-the-same-button-with-two-different-functions

    or

    https://devzone.nordicsemi.com/f/nordic-q-a/37842/how-to-use-bsp_event_to_button_action_assign-function-to-assign-long-push-action-to-an-event

    Regards,

    Rixtronix

  • Hi Karl,

    I made ,

    Callback :

    case BSP_EVENT_KEY_2:
    					 NRF_LOG_INFO("BSP_EVENT_KEY 2 PUSH ON\n");
    				   //if(button2_state)
    							//			{  
    																				
    												//ON_function();
    											   err_code = app_timer_start(m_button_action, 
                                         APP_TIMER_TICKS(BUTTON_STATE_POLL_INTERVAL_MS),
                                         NULL);
    												APP_ERROR_CHECK(err_code);
    											 // NRF_LOG_INFO("BSP_EVENT_KEY 2 PUSH ON==> LONG PUSH >200ms\n");
    											 //beep_v11();
    											
    												button2_state = STATE_OFF;
    								//		}
    									
                if (actual_state != BSP_INDICATE_FIRST)
                    actual_state--;
                else
                    actual_state = BSP_INDICATE_LAST;
                    
                    //timeout handler 
                    
                    
    void button_push_timeout_handler(void * p_context)
    { 
         uint32_t err_code;
         static uint32_t cnt;
    
         if (BUTTON_3==0)
         {
             cnt++;
             if ( cnt >= LONG_PRESS(1000))
             {
                 cnt = 0;
                 NRF_LOG_INFO("Long Button press");
             }
             else
             {
                  err_code = app_timer_start(m_button_action, 
                                             APP_TIMER_TICKS(BUTTON_STATE_POLL_INTERVAL_MS),
                                             NULL);
                  APP_ERROR_CHECK(err_code);
             }
         }
         else
         {
              cnt = 0; // reset counter variable
              NRF_LOG_INFO("Short button press");
         }
    }     
    
    err_code = app_timer_create(&m_button_action, APP_TIMER_MODE_SINGLE_SHOT, button_push_timeout_handler);
          APP_ERROR_CHECK(err_code);
    	      NRF_LOG_INFO("&m_button_action init Line2119...");
                break;

    Timer init :

    //long press button timer 16Mar22 Rixtronix LAB
    APP_TIMER_DEF(m_button_action);
    #define BUTTON_STATE_POLL_INTERVAL_MS  100UL
    #define LONG_PRESS(MS)    (uint32_t)(MS)/BUTTON_STATE_POLL_INTERVAL_MS 
    

    I got always in :

       NRF_LOG_INFO("Short button press");

    although I push long enough...

    What do we miss here ?

    Best regards,

    Rixtronix

  • Hi Karl,

    I pushed BSP_BUTTON_2, but on timeout handler I got :


    the log :
    nfo> app: BSP_BUTTON_0
                                                           

    nfo> app: BSP_BUTTON_1
                                                           

    nfo> app: BSP_BUTTON_2
                                                           

    nfo> app: BSP_BUTTON_3
                                                           

    nfo> app: BSP_BUTTON_2
                                                           

    nfo> app: BSP_BUTTON_0

    Any ideas?

    Kind regards,

    Rixtronix LAB

    Rixtronix LAB

Reply
  • Hi Karl,

    I pushed BSP_BUTTON_2, but on timeout handler I got :


    the log :
    nfo> app: BSP_BUTTON_0
                                                           

    nfo> app: BSP_BUTTON_1
                                                           

    nfo> app: BSP_BUTTON_2
                                                           

    nfo> app: BSP_BUTTON_3
                                                           

    nfo> app: BSP_BUTTON_2
                                                           

    nfo> app: BSP_BUTTON_0

    Any ideas?

    Kind regards,

    Rixtronix LAB

    Rixtronix LAB

Children
Related