Finished the UI of the music player, still need to properly increment the current track play position

This commit is contained in:
Th3maz1ng 2023-05-14 22:08:12 +02:00
parent 66fa33cde1
commit 890e461b90
3 changed files with 121 additions and 37 deletions

View File

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

View File

@ -1,7 +1,9 @@
#include "music_player_screen.h"
#include "menu_screen.h"
#include <stdio.h>
#include <string.h>
#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);
}
}

View File

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