diff --git a/src/lvgl_win_sim/lv_port_win_codeblocks/main.c b/src/lvgl_win_sim/lv_port_win_codeblocks/main.c index 558d030..c732ce1 100644 --- a/src/lvgl_win_sim/lv_port_win_codeblocks/main.c +++ b/src/lvgl_win_sim/lv_port_win_codeblocks/main.c @@ -118,9 +118,10 @@ int APIENTRY WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR szCmdLi music_player_screen_init(&musicPlayerScreen); music_player_screen_register_music_playback_control_cb(&musicPlayerScreen, &(musicPlaybackCtrlCb)); music_player_screen_set_playing_music_title_and_artist(&musicPlayerScreen, "Sun Is Up Hoho Haha", "Inna"); - music_player_screen_set_music_duration(&musicPlayerScreen, 5896); - music_player_screen_set_music_position(&musicPlayerScreen, 122); - music_player_screen_set_music_playing_state(&musicPlayerScreen, MUSIC_CONTROL_PLAY); + music_player_screen_notify_BLE_connection_state(&musicPlayerScreen, true); + music_player_screen_set_music_duration(&musicPlayerScreen, 3*60+42); + music_player_screen_set_music_position(&musicPlayerScreen, 24); + //music_player_screen_set_music_playing_state(&musicPlayerScreen, MUSIC_CONTROL_PLAY); altimeter_screen_register_measurement_cb(&altimeterScreen, &(alti_meas_cb)); diff --git a/src/lvgl_win_sim/lv_port_win_codeblocks/music_player_screen.c b/src/lvgl_win_sim/lv_port_win_codeblocks/music_player_screen.c index 491be3a..51d794b 100644 --- a/src/lvgl_win_sim/lv_port_win_codeblocks/music_player_screen.c +++ b/src/lvgl_win_sim/lv_port_win_codeblocks/music_player_screen.c @@ -1,7 +1,9 @@ -#include "music_player_screen.h" -#include "menu_screen.h" #include #include +#include "music_player_screen.h" +#include "menu_screen.h" + +void _set_UI_no_ble_connection(MusicPlayerScreen_t * const musicPlayerScreen, bool connected); static void gesture_event_cb(lv_event_t *e) { @@ -67,6 +69,13 @@ static void music_player_button_click_event_cb(lv_event_t *e) } } +static void track_position_update_cb(lv_timer_t *timer) +{ + MusicPlayerScreen_t *musicPlayerScreen = timer->user_data; + + music_player_screen_set_music_position(musicPlayerScreen, ++musicPlayerScreen->currentMusicPosition); +} + void music_player_screen_init(MusicPlayerScreen_t * const musicPlayerScreen) { if(!musicPlayerScreen) @@ -90,6 +99,22 @@ void music_player_screen_register_music_playback_control_cb(MusicPlayerScreen_t musicPlayerScreen->musicPlaybackCtrlCb = musicPlaybackCtrlCb; } +void music_player_screen_notify_BLE_connection_state(MusicPlayerScreen_t * const musicPlayerScreen, bool connected) +{ + if(!musicPlayerScreen) + { + LV_LOG_ERROR("NULL pointer given !"); + return; + } + + if(musicPlayerScreen->ble_connection_state != connected) + { + musicPlayerScreen->ble_connection_state = connected; + if(musicPlayerScreen->display != NULL) + _set_UI_no_ble_connection(musicPlayerScreen, musicPlayerScreen->ble_connection_state); + } +} + void music_player_screen_set_playing_music_title_and_artist(MusicPlayerScreen_t * const musicPlayerScreen, const char *title, const char *artist) { if(!musicPlayerScreen) @@ -176,6 +201,10 @@ void music_player_screen_set_music_playing_state(MusicPlayerScreen_t * const mus if(playingState != MUSIC_CONTROL_PAUSE && playingState != MUSIC_CONTROL_PLAY) return; musicPlayerScreen->currentPlayState = playingState; + if(musicPlayerScreen->currentPlayState == MUSIC_CONTROL_PLAY) + lv_timer_resume(musicPlayerScreen->timePositionTimer); + else + lv_timer_pause(musicPlayerScreen->timePositionTimer); if(!musicPlayerScreen->playPauseBtn.label) return; @@ -209,7 +238,18 @@ void music_player_screen_create(MusicPlayerScreen_t * const musicPlayerScreen) musicPlayerScreen->display = NULL; } musicPlayerScreen->display = lv_obj_create(NULL); - lv_obj_set_style_bg_color(musicPlayerScreen->display, lv_color_black(), LV_PART_MAIN); + lv_obj_set_style_bg_color(musicPlayerScreen->display, lv_color_white(), LV_PART_MAIN); + lv_obj_clear_flag(musicPlayerScreen->display, LV_OBJ_FLAG_SCROLLABLE); + + //Black circled background + lv_obj_t *blackCircle = lv_obj_create(musicPlayerScreen->display); + lv_obj_set_style_bg_color(blackCircle, lv_color_black(), LV_PART_MAIN); + lv_obj_set_style_border_width(blackCircle, 0, LV_PART_MAIN); + lv_obj_set_style_pad_all(blackCircle, 0, LV_PART_MAIN); + lv_obj_set_style_radius(blackCircle, LV_RADIUS_CIRCLE, LV_PART_MAIN); + //The +1 to the hor and ver res is used to get rid of graphical issue... (1px white background bleeding on the black one) + lv_obj_set_size(blackCircle, lv_disp_get_ver_res(NULL)+1, lv_disp_get_hor_res(NULL)+1); + lv_obj_center(blackCircle); //Let's create the UI for this amazing music player ... //Play/Pause button @@ -234,62 +274,62 @@ void music_player_screen_create(MusicPlayerScreen_t * const musicPlayerScreen) lv_obj_add_event_cb(musicPlayerScreen->playPauseBtn.button, &(music_player_button_click_event_cb), LV_EVENT_CLICKED, musicPlayerScreen); //Previous track button - lv_obj_t *previousBtn = lv_btn_create(musicPlayerScreen->display); - lv_obj_set_size(previousBtn, 47, 47); - lv_obj_set_style_radius(previousBtn, LV_RADIUS_CIRCLE, LV_PART_MAIN); - lv_obj_align_to(previousBtn, musicPlayerScreen->playPauseBtn.label, LV_ALIGN_OUT_LEFT_MID, -25, 0); + musicPlayerScreen->previousBtn = lv_btn_create(musicPlayerScreen->display); + lv_obj_set_size(musicPlayerScreen->previousBtn, 47, 47); + lv_obj_set_style_radius(musicPlayerScreen->previousBtn, LV_RADIUS_CIRCLE, LV_PART_MAIN); + lv_obj_align_to(musicPlayerScreen->previousBtn, musicPlayerScreen->playPauseBtn.label, LV_ALIGN_OUT_LEFT_MID, -25, 0); - lv_obj_t *previousBtnLabel = lv_label_create(previousBtn); + lv_obj_t *previousBtnLabel = lv_label_create(musicPlayerScreen->previousBtn); lv_label_set_text_static(previousBtnLabel, LV_SYMBOL_LEFT LV_SYMBOL_LEFT); lv_obj_set_style_text_font(previousBtnLabel, &lv_font_montserrat_24, LV_PART_MAIN); lv_obj_center(previousBtnLabel); - lv_obj_set_user_data(previousBtn, (void *)MUSIC_CONTROL_PREVIOUS); - lv_obj_add_event_cb(previousBtn, &(music_player_button_click_event_cb), LV_EVENT_SHORT_CLICKED, musicPlayerScreen); - lv_obj_add_event_cb(previousBtn, &(music_player_button_click_event_cb), LV_EVENT_LONG_PRESSED, musicPlayerScreen); + lv_obj_set_user_data(musicPlayerScreen->previousBtn, (void *)MUSIC_CONTROL_PREVIOUS); + lv_obj_add_event_cb(musicPlayerScreen->previousBtn, &(music_player_button_click_event_cb), LV_EVENT_SHORT_CLICKED, musicPlayerScreen); + lv_obj_add_event_cb(musicPlayerScreen->previousBtn, &(music_player_button_click_event_cb), LV_EVENT_LONG_PRESSED, musicPlayerScreen); //Next track button - lv_obj_t *nextBtn = lv_btn_create(musicPlayerScreen->display); - lv_obj_set_size(nextBtn, 47, 47); - lv_obj_set_style_radius(nextBtn, LV_RADIUS_CIRCLE, LV_PART_MAIN); - lv_obj_align_to(nextBtn, musicPlayerScreen->playPauseBtn.label, LV_ALIGN_OUT_RIGHT_MID, 25, 0); + musicPlayerScreen->nextBtn = lv_btn_create(musicPlayerScreen->display); + lv_obj_set_size(musicPlayerScreen->nextBtn, 47, 47); + lv_obj_set_style_radius(musicPlayerScreen->nextBtn, LV_RADIUS_CIRCLE, LV_PART_MAIN); + lv_obj_align_to(musicPlayerScreen->nextBtn, musicPlayerScreen->playPauseBtn.label, LV_ALIGN_OUT_RIGHT_MID, 25, 0); - lv_obj_t *nextBtnLabel = lv_label_create(nextBtn); + lv_obj_t *nextBtnLabel = lv_label_create(musicPlayerScreen->nextBtn); lv_label_set_text_static(nextBtnLabel, LV_SYMBOL_RIGHT LV_SYMBOL_RIGHT); lv_obj_set_style_text_font(nextBtnLabel, &lv_font_montserrat_24, LV_PART_MAIN); lv_obj_center(nextBtnLabel); - lv_obj_set_user_data(nextBtn, (void *)MUSIC_CONTROL_NEXT); - lv_obj_add_event_cb(nextBtn, &(music_player_button_click_event_cb), LV_EVENT_SHORT_CLICKED, musicPlayerScreen); - lv_obj_add_event_cb(nextBtn, &(music_player_button_click_event_cb), LV_EVENT_LONG_PRESSED, musicPlayerScreen); + lv_obj_set_user_data(musicPlayerScreen->nextBtn, (void *)MUSIC_CONTROL_NEXT); + lv_obj_add_event_cb(musicPlayerScreen->nextBtn, &(music_player_button_click_event_cb), LV_EVENT_SHORT_CLICKED, musicPlayerScreen); + lv_obj_add_event_cb(musicPlayerScreen->nextBtn, &(music_player_button_click_event_cb), LV_EVENT_LONG_PRESSED, musicPlayerScreen); //Volume down button - lv_obj_t *volumeDownBtn = lv_btn_create(musicPlayerScreen->display); - lv_obj_set_size(volumeDownBtn, 47, 47); - lv_obj_set_style_radius(volumeDownBtn, LV_RADIUS_CIRCLE, LV_PART_MAIN); - lv_obj_align_to(volumeDownBtn, previousBtn, LV_ALIGN_BOTTOM_MID, 25, 50); + musicPlayerScreen->volumeDownBtn = lv_btn_create(musicPlayerScreen->display); + lv_obj_set_size(musicPlayerScreen->volumeDownBtn, 47, 47); + lv_obj_set_style_radius(musicPlayerScreen->volumeDownBtn, LV_RADIUS_CIRCLE, LV_PART_MAIN); + lv_obj_align_to(musicPlayerScreen->volumeDownBtn, musicPlayerScreen->previousBtn, LV_ALIGN_BOTTOM_MID, 25, 50); - lv_obj_t *volumeDownBtnLabel = lv_label_create(volumeDownBtn); + lv_obj_t *volumeDownBtnLabel = lv_label_create(musicPlayerScreen->volumeDownBtn); lv_label_set_text_static(volumeDownBtnLabel, LV_SYMBOL_VOLUME_MID); lv_obj_set_style_text_font(volumeDownBtnLabel, &lv_font_montserrat_24, LV_PART_MAIN); lv_obj_center(volumeDownBtnLabel); - lv_obj_set_user_data(volumeDownBtn, (void *)MUSIC_CONTROL_VOLUMEDOWN); - lv_obj_add_event_cb(volumeDownBtn, &(music_player_button_click_event_cb), LV_EVENT_CLICKED, musicPlayerScreen); + lv_obj_set_user_data(musicPlayerScreen->volumeDownBtn, (void *)MUSIC_CONTROL_VOLUMEDOWN); + lv_obj_add_event_cb(musicPlayerScreen->volumeDownBtn, &(music_player_button_click_event_cb), LV_EVENT_CLICKED, musicPlayerScreen); //Volume up button - lv_obj_t *volumeUpBtn = lv_btn_create(musicPlayerScreen->display); - lv_obj_set_size(volumeUpBtn, 47, 47); - lv_obj_set_style_radius(volumeUpBtn, LV_RADIUS_CIRCLE, LV_PART_MAIN); - lv_obj_align_to(volumeUpBtn, nextBtn, LV_ALIGN_BOTTOM_MID, -25, 50); + musicPlayerScreen->volumeUpBtn = lv_btn_create(musicPlayerScreen->display); + lv_obj_set_size(musicPlayerScreen->volumeUpBtn, 47, 47); + lv_obj_set_style_radius(musicPlayerScreen->volumeUpBtn, LV_RADIUS_CIRCLE, LV_PART_MAIN); + lv_obj_align_to(musicPlayerScreen->volumeUpBtn, musicPlayerScreen->nextBtn, LV_ALIGN_BOTTOM_MID, -25, 50); - lv_obj_t *volumeUpBtnLabel = lv_label_create(volumeUpBtn); + lv_obj_t *volumeUpBtnLabel = lv_label_create(musicPlayerScreen->volumeUpBtn); lv_label_set_text_static(volumeUpBtnLabel, LV_SYMBOL_VOLUME_MAX); lv_obj_set_style_text_font(volumeUpBtnLabel, &lv_font_montserrat_24, LV_PART_MAIN); lv_obj_center(volumeUpBtnLabel); - lv_obj_set_user_data(volumeUpBtn, (void *)MUSIC_CONTROL_VOLUMEUP); - lv_obj_add_event_cb(volumeUpBtn, &(music_player_button_click_event_cb), LV_EVENT_CLICKED, musicPlayerScreen); + lv_obj_set_user_data(musicPlayerScreen->volumeUpBtn, (void *)MUSIC_CONTROL_VOLUMEUP); + lv_obj_add_event_cb(musicPlayerScreen->volumeUpBtn, &(music_player_button_click_event_cb), LV_EVENT_CLICKED, musicPlayerScreen); //Track title if(musicPlayerScreen->titleLabel) @@ -360,6 +400,16 @@ void music_player_screen_create(MusicPlayerScreen_t * const musicPlayerScreen) music_player_screen_set_music_duration(musicPlayerScreen, musicPlayerScreen->currentMusicDuration); music_player_screen_set_music_position(musicPlayerScreen, musicPlayerScreen->currentMusicPosition); + _set_UI_no_ble_connection(musicPlayerScreen, musicPlayerScreen->ble_connection_state); + + if(musicPlayerScreen->timePositionTimer) + { + LV_LOG_ERROR("timePositionTimer should be NULL here !"); + lv_timer_del(musicPlayerScreen->timePositionTimer); + musicPlayerScreen->timePositionTimer = NULL; + } + musicPlayerScreen->timePositionTimer = lv_timer_create(&(track_position_update_cb), 1000, musicPlayerScreen); + lv_timer_pause(musicPlayerScreen->timePositionTimer); //We register the event callback to handle gestures lv_obj_add_event_cb(musicPlayerScreen->display, &(gesture_event_cb), LV_EVENT_GESTURE, musicPlayerScreen); @@ -374,6 +424,31 @@ void music_player_screen_destroy(MusicPlayerScreen_t * const musicPlayerScreen) LV_LOG_ERROR("NULL pointer given !"); return; } - + lv_timer_del(musicPlayerScreen->timePositionTimer); memset(musicPlayerScreen, 0, offsetof(MusicPlayerScreen_t, musicPlaybackCtrlCb)); } + +void _set_UI_no_ble_connection(MusicPlayerScreen_t * const musicPlayerScreen, bool connected) +{ + if(connected) + { + lv_obj_clear_state(musicPlayerScreen->playPauseBtn.button, LV_STATE_DISABLED); + lv_obj_clear_state(musicPlayerScreen->previousBtn, LV_STATE_DISABLED); + lv_obj_clear_state(musicPlayerScreen->nextBtn, LV_STATE_DISABLED); + lv_obj_clear_state(musicPlayerScreen->volumeDownBtn, LV_STATE_DISABLED); + lv_obj_clear_state(musicPlayerScreen->volumeUpBtn, LV_STATE_DISABLED); + lv_label_set_text_static(musicPlayerScreen->titleLabel, musicPlayerScreen->titleText); + lv_obj_clear_flag(musicPlayerScreen->artistLabel, LV_OBJ_FLAG_HIDDEN); + } + else + { + lv_obj_add_state(musicPlayerScreen->playPauseBtn.button, LV_STATE_DISABLED); + lv_obj_add_state(musicPlayerScreen->previousBtn, LV_STATE_DISABLED); + lv_obj_add_state(musicPlayerScreen->nextBtn, LV_STATE_DISABLED); + lv_obj_add_state(musicPlayerScreen->volumeDownBtn, LV_STATE_DISABLED); + lv_obj_add_state(musicPlayerScreen->volumeUpBtn, LV_STATE_DISABLED); + lv_label_set_text_static(musicPlayerScreen->titleLabel,"\t\t\t\t\t\tPhone not connected !"); + lv_obj_set_style_bg_color(musicPlayerScreen->titleLabel, lv_color_black(), LV_PART_MAIN); + lv_obj_add_flag(musicPlayerScreen->artistLabel, LV_OBJ_FLAG_HIDDEN); + } +} diff --git a/src/lvgl_win_sim/lv_port_win_codeblocks/music_player_screen.h b/src/lvgl_win_sim/lv_port_win_codeblocks/music_player_screen.h index d524e39..436c695 100644 --- a/src/lvgl_win_sim/lv_port_win_codeblocks/music_player_screen.h +++ b/src/lvgl_win_sim/lv_port_win_codeblocks/music_player_screen.h @@ -36,10 +36,15 @@ typedef struct MusicPlayerScreen //Can be erased attributes lv_obj_t *display; PlayerButton_t playPauseBtn; + lv_obj_t *previousBtn; + lv_obj_t *nextBtn; + lv_obj_t *volumeDownBtn; + lv_obj_t *volumeUpBtn; lv_obj_t *playbackArc; lv_obj_t *titleLabel; lv_obj_t *artistLabel; TimeLabel_t positionTimeLabel, durationTimeLabel; + lv_timer_t *timePositionTimer; //Should not be erased attributes MusicPlaybackCtrlCb_t musicPlaybackCtrlCb; MusicPlaybackCtrlAction_e currentPlayState; @@ -47,12 +52,15 @@ typedef struct MusicPlayerScreen char artistText[30]; uint16_t currentMusicDuration; //The currently playing music's total duration in seconds. uint16_t currentMusicPosition; //The currently playing music's cursor position in seconds. + bool ble_connection_state; } MusicPlayerScreen_t; void music_player_screen_init(MusicPlayerScreen_t * const musicPlayerScreen); void music_player_screen_register_music_playback_control_cb(MusicPlayerScreen_t * const musicPlayerScreen, MusicPlaybackCtrlCb_t musicPlaybackCtrlCb); +void music_player_screen_notify_BLE_connection_state(MusicPlayerScreen_t * const musicPlayerScreen, bool connected); + void music_player_screen_set_playing_music_title_and_artist(MusicPlayerScreen_t * const musicPlayerScreen, const char *title, const char *artist); void music_player_screen_set_music_duration(MusicPlayerScreen_t * const musicPlayerScreen, uint16_t durationInSeconds);