From fd0f44e88860c8b474109ab3d3b3461eea8c34eb Mon Sep 17 00:00:00 2001 From: anschrammh Date: Mon, 27 Nov 2023 08:40:25 +0100 Subject: [PATCH] Reworked and added the user feedback callback function to make the API consistent, implemented it on some screens/app already --- .../app/gfx/music_player_screen.c | 19 +++++++++++++++++-- .../app/gfx/music_player_screen.h | 13 +++++++++++++ .../app/gfx/settings_screen.c | 16 ++++++++++++++++ .../app/gfx/settings_screen.h | 16 ++++++++++++++-- 4 files changed, 60 insertions(+), 4 deletions(-) diff --git a/src/W800_SDK_v1.00.10/app/gfx/music_player_screen.c b/src/W800_SDK_v1.00.10/app/gfx/music_player_screen.c index 0e803ed..955e191 100644 --- a/src/W800_SDK_v1.00.10/app/gfx/music_player_screen.c +++ b/src/W800_SDK_v1.00.10/app/gfx/music_player_screen.c @@ -46,12 +46,16 @@ static void cleanup_event_cb(lv_event_t *e) static void music_player_button_click_event_cb(lv_event_t *e) { - MusicPlayerScreen_t *musicPlayerScreen = e->user_data; - MusicPlaybackCtrlAction_e action = (MusicPlaybackCtrlAction_e)lv_obj_get_user_data(e->target); + MusicPlayerScreen_t *musicPlayerScreen = lv_event_get_user_data(e); + MusicPlaybackCtrlAction_e action = (MusicPlaybackCtrlAction_e)lv_obj_get_user_data(lv_event_get_target(e)); LV_LOG_USER("Action is : %u, code is : %u", action, e->code); if(musicPlayerScreen->musicPlaybackCtrlCb) { + // Let's give the user some feedback by calling the callback if one is registered + if(musicPlayerScreen->musicPlayerUserFeedbackCb) + musicPlayerScreen->musicPlayerUserFeedbackCb(); + if(action == MUSIC_CONTROL_PLAY) { MusicPlaybackCtrlAction_e stateToApply = musicPlayerScreen->currentPlayState == MUSIC_CONTROL_PLAY ? MUSIC_CONTROL_PAUSE : MUSIC_CONTROL_PLAY; @@ -144,6 +148,17 @@ void music_player_screen_register_music_player_time_ref_ms_cb(MusicPlayerScreen_ musicPlayerScreen->musicPlayerTimeRefmsCb = musicPlayerTimeRefmsCb; } +void music_player_screen_register_user_feedback_cb(MusicPlayerScreen_t * const musicPlayerScreen, MusicPlayerUserFeedbackCb_t musicPlayerUserFeedbackCb) +{ + if(!musicPlayerScreen) + { + LV_LOG_ERROR("NULL pointer given !"); + return; + } + + musicPlayerScreen->musicPlayerUserFeedbackCb = musicPlayerUserFeedbackCb; +} + void music_player_screen_notify_BLE_connection_state(MusicPlayerScreen_t * const musicPlayerScreen, bool connected) { if(!musicPlayerScreen) diff --git a/src/W800_SDK_v1.00.10/app/gfx/music_player_screen.h b/src/W800_SDK_v1.00.10/app/gfx/music_player_screen.h index 050285d..0269480 100644 --- a/src/W800_SDK_v1.00.10/app/gfx/music_player_screen.h +++ b/src/W800_SDK_v1.00.10/app/gfx/music_player_screen.h @@ -20,6 +20,7 @@ typedef enum MusicPlaybackCtrlAction typedef void (*MusicPlaybackCtrlCb_t)(MusicPlaybackCtrlAction_e musicPlaybackCtrlAction); typedef uint32_t (*MusicPlayerTimeRefmsCb_t)(void); +typedef void (*MusicPlayerUserFeedbackCb_t)(void); typedef struct PlayerButton { @@ -51,6 +52,7 @@ typedef struct MusicPlayerScreen //Should not be erased attributes MusicPlaybackCtrlCb_t musicPlaybackCtrlCb; MusicPlayerTimeRefmsCb_t musicPlayerTimeRefmsCb; + MusicPlayerUserFeedbackCb_t musicPlayerUserFeedbackCb; MusicPlaybackCtrlAction_e currentPlayState; char titleText[60]; char artistText[30]; @@ -97,6 +99,17 @@ void music_player_screen_register_music_playback_control_cb(MusicPlayerScreen_t */ void music_player_screen_register_music_player_time_ref_ms_cb(MusicPlayerScreen_t * const musicPlayerScreen, MusicPlayerTimeRefmsCb_t musicPlayerTimeRefmsCb); +/** + * @brief Registers a callback functions which will be called every time a user feedback should + * be made. In this case, every time a player's button is clicked, the callback will be called. + * This enables the app to react to user interaction. + * + * @param musicPlayerScreen a pointer to the music player screen's context structure. + * @param musicPlayerUserFeedbackCb the callback of type @ref MusicPlayerUserFeedbackCb_t to register having + * the following signature : void(void). + */ +void music_player_screen_register_user_feedback_cb(MusicPlayerScreen_t * const musicPlayerScreen, MusicPlayerUserFeedbackCb_t musicPlayerUserFeedbackCb); + /** * @brief Tells the music player whether the watch is connected to a smartphone through a BLE connection or not. * It, for example, enables the music player to grey the music controls (buttons) out if there is no established BLE connection. diff --git a/src/W800_SDK_v1.00.10/app/gfx/settings_screen.c b/src/W800_SDK_v1.00.10/app/gfx/settings_screen.c index 80701f9..55672c4 100644 --- a/src/W800_SDK_v1.00.10/app/gfx/settings_screen.c +++ b/src/W800_SDK_v1.00.10/app/gfx/settings_screen.c @@ -856,6 +856,17 @@ void settings_screen_register_on_state_change_cb(SettingsScreen_t * const settin settingsScreen->settingsScreenOnStateChangeCb = settingsScreenOnStateChangeCb; } +void settings_screen_register_user_feedback_cb(SettingsScreen_t * const settingsScreen, SettingsScreenUserFeedbackCb_t settingsScreenUserFeedbackCb) +{ + if(!settingsScreen) + { + LV_LOG_ERROR("NULL pointer given !"); + return; + } + + settingsScreen->settingsScreenUserFeedbackCb = settingsScreenUserFeedbackCb; +} + void settings_screen_register_API_interface(SettingsScreen_t * const settingsScreen, SettingsScreenAPIInterface_t * const settingsScreenAPIInterface) { if(!settingsScreen) @@ -980,6 +991,11 @@ static void _simulate_side_screen_item_click(SettingsScreen_t * const settingsSc settingsScreen->last_selected_item = item; + // Let's give some user feedback that a category was selected by calling the + // callback if one is registered + if(settingsScreen->settingsScreenUserFeedbackCb) + settingsScreen->settingsScreenUserFeedbackCb(); + lv_obj_clean(settingsScreen->side_screen); if(item == settingsScreen->time_and_date_item) diff --git a/src/W800_SDK_v1.00.10/app/gfx/settings_screen.h b/src/W800_SDK_v1.00.10/app/gfx/settings_screen.h index dd24016..1dcc4bb 100644 --- a/src/W800_SDK_v1.00.10/app/gfx/settings_screen.h +++ b/src/W800_SDK_v1.00.10/app/gfx/settings_screen.h @@ -56,6 +56,7 @@ typedef enum SettingsScreenCategory } SettingsScreenCategory_e; typedef void (*SettingsScreenOnStateChangeCb_t)(SettingsScreenState_e settingsScreenState, SettingsScreenCategory_e settingsScreenCategory); +typedef void (*SettingsScreenUserFeedbackCb_t)(void); typedef struct SettingsScreen { @@ -132,6 +133,7 @@ typedef struct SettingsScreen /* Other */ lv_timer_t *about_refresh_timer; SettingsScreenOnStateChangeCb_t settingsScreenOnStateChangeCb; + SettingsScreenUserFeedbackCb_t settingsScreenUserFeedbackCb; } SettingsScreen_t; void settings_screen_init(SettingsScreen_t * const settingsScreen); @@ -139,13 +141,23 @@ void settings_screen_init(SettingsScreen_t * const settingsScreen); /** * @brief Registers a callback function which will be called every time the state of the application changes ie : is opened or closed. * This callback should be used to initialize and deinitialize needed devices drivers like the magnetometer or the temperature sensor. - * @note The state of the application is passed as a parameter or the callback function. + * @note The state of the application is passed as a parameter of the callback function. * - * @param settingsScreen a pointer to the settings screen object structure. + * @param settingsScreen a pointer to the previously initialized settings screen object structure. * @param SettingsScreenOnStateChangeCb the callback of type @ref SettingsScreenOnStateChangeCb_t to register. */ void settings_screen_register_on_state_change_cb(SettingsScreen_t * const settingsScreen, SettingsScreenOnStateChangeCb_t SettingsScreenOnStateChangeCb); +/** + * @brief Registers a callback functions which will be called every time a user feedback should + * be made. In this case, every time a UI element is clicked, the callback will be called. + * This enables the app to react to user interaction. + * + * @param settingsScreen a pointer to the previously initialized settings screen object structure. + * @param settingsScreenUserFeedbackCb the callback of type @ref SettingsScreenUserFeedbackCb_t to register. + */ +void settings_screen_register_user_feedback_cb(SettingsScreen_t * const settingsScreen, SettingsScreenUserFeedbackCb_t settingsScreenUserFeedbackCb); + void settings_screen_register_API_interface(SettingsScreen_t * const settingsScreen, SettingsScreenAPIInterface_t * const settingsScreenAPIInterface); void settings_screen_create(SettingsScreen_t * const settingsScreen);