Reworked and added the user feedback callback function to make the API consistent, implemented it on some screens/app already

This commit is contained in:
anschrammh 2023-11-27 08:40:25 +01:00
parent 8b16cf98aa
commit fd0f44e888
4 changed files with 60 additions and 4 deletions

View File

@ -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)

View File

@ -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.

View File

@ -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)

View File

@ -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);