Hi,
I want to store scene when long press one button and recall scene when short press. I have done some changes but not able to achieve it, i am not sure if i should use " bsp_event_to_button_action_assign" or "bsp_button_event_handler" for detecting long press and short press and then perform the scene store and scene recall operation.
I am attaching the implementation, correct me where i am wrong to achieve desired result. Can anyone help me in solving this issue on high priority?
in main.c
#include "bsp.h" // added for long and short press
#ifndef BSP_SIMPLE
static bsp_event_callback_t m_registered_callback = NULL;
static bsp_button_event_cfg_t m_events_list[BUTTONS_NUMBER] = {{BSP_EVENT_NOTHING, BSP_EVENT_NOTHING}};
APP_TIMER_DEF(m_bsp_button_tmr);
#endif // BSP_SIMPLE
#define BSP_LONG_PUSH_TIMEOUT_MS 1000
/ added for button long and short press
/**@brief Function for handling button events.
*
* @param[in] pin_no The pin number of the button pressed.
* @param[in] button_action Action button.
*/
static void bsp_button_event_handler(uint8_t pin_no, uint8_t button_action)
{
bsp_event_t event = BSP_EVENT_NOTHING;
uint32_t button = 0;
uint32_t err_code;
static uint8_t current_long_push_pin_no; /**< Pin number of a currently pushed button, that could become a long push if held long enough. */
static bsp_event_t release_event_at_push[BUTTONS_NUMBER]; /**< Array of what the release event of each button was last time it was pushed, so that no release event is sent if the event was bound after the push of the button. */
// added for scene
uint32_t status = NRF_SUCCESS;
static scene_store_params_t store_params = {.scene_number = 1 };
static scene_recall_params_t recall_params = {0};
static scene_delete_params_t delete_params = {0};
model_transition_t transition_params_scene =
{
.delay_ms = APP_SCENE_DELAY_MS,
.transition_time_ms = APP_SCENE_TRANSITION_TIME_MS
};
// recall_params.scene_number = store_params.scene_number;
delete_params.scene_number = store_params.scene_number;
// button = bsp_board_pin_to_button_idx(pin_no);
// if (button < BUTTONS_NUMBER)
// {
switch (button_action)
{
case APP_BUTTON_PUSH:
__LOG(LOG_SRC_APP, LOG_LEVEL_INFO,"in bsp short press event handler button 4 pressed \n");
event = m_events_list[button].push_event;
if (m_events_list[button].long_push_event != BSP_EVENT_NOTHING)
{
// short press will recall the scene
//added for scene
// scene 1
/*
static scene_store_params_t store_params = {.scene_number = 1 };
static scene_recall_params_t recall_params = {0};
recall_params.scene_number = store_params.scene_number;
*/
__LOG(LOG_SRC_APP, LOG_LEVEL_INFO,
"Sending msg: Scene Recall: Scene number: %d Tid: %d Trans time: %d ms Delay: %d ms\n",
recall_params.scene_number, recall_params.tid, transition_params_scene.transition_time_ms,
transition_params_scene.delay_ms);
status = scene_client_recall(&m_clients_scene[client], &recall_params, &transition_params_scene);
recall_params.tid++;
err_code = app_timer_start(m_bsp_button_tmr, APP_TIMER_TICKS(BSP_LONG_PUSH_TIMEOUT_MS), (void*)¤t_long_push_pin_no);
if (err_code == NRF_SUCCESS)
{
current_long_push_pin_no = pin_no;
}
}
release_event_at_push[button] = m_events_list[button].release_event;
break;
case APP_BUTTON_RELEASE:
(void)app_timer_stop(m_bsp_button_tmr);
if (release_event_at_push[button] == m_events_list[button].release_event)
{
event = m_events_list[button].release_event;
}
break;
case BSP_BUTTON_ACTION_LONG_PUSH:
{
event = m_events_list[button].long_push_event;
// added for storing scene when long press
/*
__LOG(LOG_SRC_APP, LOG_LEVEL_INFO,
"Sending msg: Scene Store: Scene number: %d\n", store_params.scene_number);
status = scene_client_store(&m_clients_scene[client], &store_params);
*/
}
}
//}
/*
if ((event != BSP_EVENT_NOTHING) && (m_registered_callback != NULL))
{
m_registered_callback(event);
}
*/
}
static void button_handler(uint_32 button_number)
{
case 4:
bsp_button_event_handler(15,2);
}
Thanks & Regards,
Ekta