Compare commits
No commits in common. "36285739acd7d16613269c6db630ce6af5dfe890" and "25b0e6432865daffb1dbfe4e31095d7f953472dc" have entirely different histories.
36285739ac
...
25b0e64328
@ -15,7 +15,6 @@
|
||||
|
||||
#include <windows.h>
|
||||
#include <time.h>
|
||||
#include <sys/time.h>
|
||||
#include "watch_face.h"
|
||||
#include "settings_screen.h"
|
||||
#include "menu_screen.h"
|
||||
@ -80,16 +79,6 @@ static void musicPlaybackCtrlCb(MusicPlaybackCtrlAction_e musicPlaybackCtrlActio
|
||||
LV_LOG_USER("Action to perform : %u", musicPlaybackCtrlAction);
|
||||
}
|
||||
|
||||
static uint32_t musicPlayerTimeRefmsCb(void)
|
||||
{
|
||||
struct timeval ref;
|
||||
gettimeofday(&ref, NULL);
|
||||
|
||||
uint32_t ms_time = ref.tv_sec*1000 + ref.tv_usec/1000;
|
||||
|
||||
return ms_time;
|
||||
}
|
||||
|
||||
WatchFace_t watchFace;
|
||||
MenuScreen_t menuScreen;
|
||||
CompassScreen_t compassScreen;
|
||||
@ -128,12 +117,11 @@ int APIENTRY WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR szCmdLi
|
||||
find_my_phone_screen_notify_BLE_connection_state(&findMyPhoneScreen, true);
|
||||
music_player_screen_init(&musicPlayerScreen);
|
||||
music_player_screen_register_music_playback_control_cb(&musicPlayerScreen, &(musicPlaybackCtrlCb));
|
||||
music_player_screen_register_music_player_time_ref_ms_cb(&musicPlayerScreen, &(musicPlayerTimeRefmsCb));
|
||||
music_player_screen_set_playing_music_title_and_artist(&musicPlayerScreen, "Sun Is Up Hoho Haha", "Inna");
|
||||
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, 2*60+12);
|
||||
music_player_screen_set_music_playing_state(&musicPlayerScreen, MUSIC_CONTROL_PLAY);
|
||||
music_player_screen_set_music_position(&musicPlayerScreen, 3*60+12);
|
||||
//music_player_screen_set_music_playing_state(&musicPlayerScreen, MUSIC_CONTROL_PLAY);
|
||||
|
||||
altimeter_screen_register_measurement_cb(&altimeterScreen, &(alti_meas_cb));
|
||||
|
||||
|
@ -3,10 +3,7 @@
|
||||
#include "music_player_screen.h"
|
||||
#include "menu_screen.h"
|
||||
|
||||
static void _set_UI_no_ble_connection(MusicPlayerScreen_t * const musicPlayerScreen, bool connected);
|
||||
static void _update_playing_track_visuals(MusicPlayerScreen_t * const musicPlayerScreen);
|
||||
static void _update_playing_track_ref_time(MusicPlayerScreen_t * const musicPlayerScreen);
|
||||
static uint16_t _time_difference_in_ms(uint32_t referenceTimeMs, uint32_t currentTimeMs);
|
||||
void _set_UI_no_ble_connection(MusicPlayerScreen_t * const musicPlayerScreen, bool connected);
|
||||
|
||||
static void gesture_event_cb(lv_event_t *e)
|
||||
{
|
||||
@ -59,37 +56,11 @@ static void music_player_button_click_event_cb(lv_event_t *e)
|
||||
}
|
||||
else if(action == MUSIC_CONTROL_NEXT)
|
||||
{
|
||||
if(e->code == LV_EVENT_SHORT_CLICKED)
|
||||
{
|
||||
musicPlayerScreen->musicPlaybackCtrlCb(MUSIC_CONTROL_NEXT);
|
||||
}
|
||||
else
|
||||
{
|
||||
musicPlayerScreen->musicPlaybackCtrlCb(MUSIC_CONTROL_FORWARD);
|
||||
//Don't forget to add 10 seconds to the current song position
|
||||
//10 seconds is the step used by the android AIMP player, this may vary
|
||||
musicPlayerScreen->currentMusicPosition = musicPlayerScreen->currentMusicPosition/1000 + FAST_FORWARD_BACKWARD_STEP > musicPlayerScreen->currentMusicDuration ?
|
||||
musicPlayerScreen->currentMusicDuration * 1000 : musicPlayerScreen->currentMusicPosition + FAST_FORWARD_BACKWARD_STEP * 1000;
|
||||
_update_playing_track_visuals(musicPlayerScreen);
|
||||
if(musicPlayerScreen->musicPlayerTimeRefmsCb)musicPlayerScreen->playerStartTimeRef = musicPlayerScreen->musicPlayerTimeRefmsCb();
|
||||
}
|
||||
musicPlayerScreen->musicPlaybackCtrlCb(e->code == LV_EVENT_SHORT_CLICKED ? MUSIC_CONTROL_FORWARD : MUSIC_CONTROL_NEXT);
|
||||
}
|
||||
else if(action == MUSIC_CONTROL_PREVIOUS)
|
||||
{
|
||||
if(e->code == LV_EVENT_SHORT_CLICKED)
|
||||
{
|
||||
musicPlayerScreen->musicPlaybackCtrlCb(MUSIC_CONTROL_PREVIOUS);
|
||||
}
|
||||
else
|
||||
{
|
||||
musicPlayerScreen->musicPlaybackCtrlCb(MUSIC_CONTROL_REWIND);
|
||||
//Don't forget to remove 10 seconds to the current song position
|
||||
//10 seconds is the step used by the android AIMP player, this may vary
|
||||
musicPlayerScreen->currentMusicPosition = musicPlayerScreen->currentMusicPosition >= FAST_FORWARD_BACKWARD_STEP * 1000 ?
|
||||
musicPlayerScreen->currentMusicPosition - FAST_FORWARD_BACKWARD_STEP * 1000 : 0;
|
||||
_update_playing_track_visuals(musicPlayerScreen);
|
||||
if(musicPlayerScreen->musicPlayerTimeRefmsCb)musicPlayerScreen->playerStartTimeRef = musicPlayerScreen->musicPlayerTimeRefmsCb();
|
||||
}
|
||||
musicPlayerScreen->musicPlaybackCtrlCb(e->code == LV_EVENT_SHORT_CLICKED ? MUSIC_CONTROL_REWIND : MUSIC_CONTROL_PREVIOUS);
|
||||
}
|
||||
else
|
||||
{
|
||||
@ -102,11 +73,7 @@ static void track_position_update_cb(lv_timer_t *timer)
|
||||
{
|
||||
MusicPlayerScreen_t *musicPlayerScreen = timer->user_data;
|
||||
|
||||
if(musicPlayerScreen->currentMusicPosition == musicPlayerScreen->currentMusicDuration * 1000) return;
|
||||
|
||||
//If the callback get's called, this means we are in the music play state
|
||||
_update_playing_track_ref_time(musicPlayerScreen);
|
||||
_update_playing_track_visuals(musicPlayerScreen);
|
||||
music_player_screen_set_music_position(musicPlayerScreen, ++musicPlayerScreen->currentMusicPosition);
|
||||
}
|
||||
|
||||
void music_player_screen_init(MusicPlayerScreen_t * const musicPlayerScreen)
|
||||
@ -132,17 +99,6 @@ void music_player_screen_register_music_playback_control_cb(MusicPlayerScreen_t
|
||||
musicPlayerScreen->musicPlaybackCtrlCb = musicPlaybackCtrlCb;
|
||||
}
|
||||
|
||||
void music_player_screen_register_music_player_time_ref_ms_cb(MusicPlayerScreen_t * const musicPlayerScreen, MusicPlayerTimeRefmsCb_t musicPlayerTimeRefmsCb)
|
||||
{
|
||||
if(!musicPlayerScreen)
|
||||
{
|
||||
LV_LOG_ERROR("NULL pointer given !");
|
||||
return;
|
||||
}
|
||||
|
||||
musicPlayerScreen->musicPlayerTimeRefmsCb = musicPlayerTimeRefmsCb;
|
||||
}
|
||||
|
||||
void music_player_screen_notify_BLE_connection_state(MusicPlayerScreen_t * const musicPlayerScreen, bool connected)
|
||||
{
|
||||
if(!musicPlayerScreen)
|
||||
@ -169,7 +125,9 @@ void music_player_screen_set_playing_music_title_and_artist(MusicPlayerScreen_t
|
||||
|
||||
if(title)
|
||||
{
|
||||
strncpy(musicPlayerScreen->titleText, title, sizeof(musicPlayerScreen->titleText)-1);
|
||||
strncpy(musicPlayerScreen->titleText, title, sizeof musicPlayerScreen->titleText);
|
||||
musicPlayerScreen->titleText[sizeof(musicPlayerScreen->titleText) - 1] = '\0';
|
||||
|
||||
if(musicPlayerScreen->titleLabel)
|
||||
{
|
||||
lv_label_set_text_static(musicPlayerScreen->titleLabel, musicPlayerScreen->titleText);
|
||||
@ -178,7 +136,9 @@ void music_player_screen_set_playing_music_title_and_artist(MusicPlayerScreen_t
|
||||
|
||||
if(artist)
|
||||
{
|
||||
strncpy(musicPlayerScreen->artistText, artist, sizeof(musicPlayerScreen->artistText)-1);
|
||||
strncpy(musicPlayerScreen->artistText, artist, sizeof musicPlayerScreen->artistText);
|
||||
musicPlayerScreen->artistText[sizeof(musicPlayerScreen->artistText) - 1] = '\0';
|
||||
|
||||
if(musicPlayerScreen->artistLabel)
|
||||
{
|
||||
lv_label_set_text_static(musicPlayerScreen->artistLabel, musicPlayerScreen->artistText);
|
||||
@ -216,13 +176,18 @@ void music_player_screen_set_music_position(MusicPlayerScreen_t * const musicPla
|
||||
}
|
||||
|
||||
positionInSeconds = positionInSeconds > musicPlayerScreen->currentMusicDuration ? musicPlayerScreen->currentMusicDuration : positionInSeconds;
|
||||
musicPlayerScreen->currentMusicPosition = positionInSeconds * 1000;
|
||||
musicPlayerScreen->currentMusicPosition = positionInSeconds;
|
||||
|
||||
//Let's update the current music position visually
|
||||
if(music_player_screen_is_in_use(musicPlayerScreen))
|
||||
{
|
||||
_update_playing_track_visuals(musicPlayerScreen);
|
||||
}
|
||||
//If the widget is currently displayed, we update it as well !
|
||||
if(!musicPlayerScreen->playbackArc) return;
|
||||
|
||||
lv_arc_set_value(musicPlayerScreen->playbackArc, musicPlayerScreen->currentMusicPosition);
|
||||
|
||||
if(positionInSeconds < 3600)sprintf(musicPlayerScreen->positionTimeLabel.text, "%s%u:%s%u", positionInSeconds / 60 < 10 ? "0":"", positionInSeconds / 60, positionInSeconds % 60 < 10 ? "0":"", positionInSeconds % 60);
|
||||
else sprintf(musicPlayerScreen->positionTimeLabel.text, "%s%u:%s%u:%s%u", positionInSeconds / 3600 < 10 ? "0":"", positionInSeconds / 3600,
|
||||
(positionInSeconds % 3600) / 60 < 10 ? "0":"", (positionInSeconds % 3600) / 60,
|
||||
(positionInSeconds % 3600) % 60 < 10 ? "0":"", (positionInSeconds % 3600) % 60);
|
||||
lv_label_set_text_static(musicPlayerScreen->positionTimeLabel.label, musicPlayerScreen->positionTimeLabel.text);
|
||||
}
|
||||
|
||||
void music_player_screen_set_music_playing_state(MusicPlayerScreen_t * const musicPlayerScreen, MusicPlaybackCtrlAction_e playingState)
|
||||
@ -237,15 +202,12 @@ void music_player_screen_set_music_playing_state(MusicPlayerScreen_t * const mus
|
||||
|
||||
musicPlayerScreen->currentPlayState = playingState;
|
||||
|
||||
if(musicPlayerScreen->musicPlayerTimeRefmsCb)
|
||||
musicPlayerScreen->playerStartTimeRef = musicPlayerScreen->musicPlayerTimeRefmsCb();
|
||||
|
||||
if(!music_player_screen_is_in_use(musicPlayerScreen)) return;
|
||||
|
||||
if(musicPlayerScreen->currentPlayState == MUSIC_CONTROL_PLAY)
|
||||
lv_timer_resume(musicPlayerScreen->trackPlayCursorUpdateTimer);
|
||||
lv_timer_resume(musicPlayerScreen->timePositionTimer);
|
||||
else
|
||||
lv_timer_pause(musicPlayerScreen->trackPlayCursorUpdateTimer);
|
||||
lv_timer_pause(musicPlayerScreen->timePositionTimer);
|
||||
|
||||
if(!musicPlayerScreen->playPauseBtn.label) return;
|
||||
|
||||
strcpy(musicPlayerScreen->playPauseBtn.icon, musicPlayerScreen->currentPlayState == MUSIC_CONTROL_PLAY ? LV_SYMBOL_PAUSE : LV_SYMBOL_PLAY);
|
||||
lv_label_set_text_static(musicPlayerScreen->playPauseBtn.label, musicPlayerScreen->playPauseBtn.icon);
|
||||
@ -438,20 +400,18 @@ void music_player_screen_create(MusicPlayerScreen_t * const musicPlayerScreen)
|
||||
lv_obj_set_style_arc_color(musicPlayerScreen->playbackArc, lv_palette_main(LV_PALETTE_LIME), LV_PART_INDICATOR);
|
||||
lv_obj_set_style_arc_color(musicPlayerScreen->playbackArc, lv_color_make(100,100,100), LV_PART_MAIN);
|
||||
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->trackPlayCursorUpdateTimer)
|
||||
if(musicPlayerScreen->timePositionTimer)
|
||||
{
|
||||
LV_LOG_ERROR("trackPlayCursorUpdateTimer should be NULL here !");
|
||||
lv_timer_del(musicPlayerScreen->trackPlayCursorUpdateTimer);
|
||||
musicPlayerScreen->trackPlayCursorUpdateTimer = NULL;
|
||||
LV_LOG_ERROR("timePositionTimer should be NULL here !");
|
||||
lv_timer_del(musicPlayerScreen->timePositionTimer);
|
||||
musicPlayerScreen->timePositionTimer = NULL;
|
||||
}
|
||||
musicPlayerScreen->trackPlayCursorUpdateTimer = lv_timer_create(&(track_position_update_cb), 333, musicPlayerScreen);
|
||||
if(musicPlayerScreen->currentPlayState != MUSIC_CONTROL_PLAY) lv_timer_pause(musicPlayerScreen->trackPlayCursorUpdateTimer);
|
||||
if(musicPlayerScreen->currentPlayState == MUSIC_CONTROL_PLAY) _update_playing_track_ref_time(musicPlayerScreen);
|
||||
|
||||
_update_playing_track_visuals(musicPlayerScreen);
|
||||
musicPlayerScreen->timePositionTimer = lv_timer_create(&(track_position_update_cb), 1000, musicPlayerScreen);
|
||||
if(musicPlayerScreen->currentPlayState != MUSIC_CONTROL_PLAY) 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);
|
||||
@ -466,11 +426,11 @@ void music_player_screen_destroy(MusicPlayerScreen_t * const musicPlayerScreen)
|
||||
LV_LOG_ERROR("NULL pointer given !");
|
||||
return;
|
||||
}
|
||||
lv_timer_del(musicPlayerScreen->trackPlayCursorUpdateTimer);
|
||||
lv_timer_del(musicPlayerScreen->timePositionTimer);
|
||||
memset(musicPlayerScreen, 0, offsetof(MusicPlayerScreen_t, musicPlaybackCtrlCb));
|
||||
}
|
||||
|
||||
static void _set_UI_no_ble_connection(MusicPlayerScreen_t * const musicPlayerScreen, bool connected)
|
||||
void _set_UI_no_ble_connection(MusicPlayerScreen_t * const musicPlayerScreen, bool connected)
|
||||
{
|
||||
if(connected)
|
||||
{
|
||||
@ -494,32 +454,3 @@ static void _set_UI_no_ble_connection(MusicPlayerScreen_t * const musicPlayerScr
|
||||
lv_obj_add_flag(musicPlayerScreen->artistLabel, LV_OBJ_FLAG_HIDDEN);
|
||||
}
|
||||
}
|
||||
|
||||
static void _update_playing_track_visuals(MusicPlayerScreen_t * const musicPlayerScreen)
|
||||
{
|
||||
//Do not forget to put the current music position back in seconds
|
||||
uint16_t positionInSeconds = musicPlayerScreen->currentMusicPosition/1000;
|
||||
lv_arc_set_value(musicPlayerScreen->playbackArc, positionInSeconds);
|
||||
|
||||
if(positionInSeconds < 3600)sprintf(musicPlayerScreen->positionTimeLabel.text, "%s%u:%s%u", positionInSeconds / 60 < 10 ? "0":"", positionInSeconds / 60, positionInSeconds % 60 < 10 ? "0":"", positionInSeconds % 60);
|
||||
else sprintf(musicPlayerScreen->positionTimeLabel.text, "%s%u:%s%u:%s%u", positionInSeconds / 3600 < 10 ? "0":"", positionInSeconds / 3600,
|
||||
(positionInSeconds % 3600) / 60 < 10 ? "0":"", (positionInSeconds % 3600) / 60,
|
||||
(positionInSeconds % 3600) % 60 < 10 ? "0":"", (positionInSeconds % 3600) % 60);
|
||||
lv_label_set_text_static(musicPlayerScreen->positionTimeLabel.label, musicPlayerScreen->positionTimeLabel.text);
|
||||
}
|
||||
|
||||
static void _update_playing_track_ref_time(MusicPlayerScreen_t * const musicPlayerScreen)
|
||||
{
|
||||
//Let's compute the time that has passed and update the current song position
|
||||
uint32_t currentTimeMs = musicPlayerScreen->musicPlayerTimeRefmsCb ? musicPlayerScreen->musicPlayerTimeRefmsCb() : 0;
|
||||
uint16_t timeDifferenceMs = _time_difference_in_ms(musicPlayerScreen->playerStartTimeRef, currentTimeMs);
|
||||
musicPlayerScreen->playerStartTimeRef = currentTimeMs;
|
||||
|
||||
musicPlayerScreen->currentMusicPosition = musicPlayerScreen->currentMusicPosition + timeDifferenceMs > musicPlayerScreen->currentMusicDuration * 1000 ?
|
||||
musicPlayerScreen->currentMusicDuration * 1000 : musicPlayerScreen->currentMusicPosition + timeDifferenceMs;
|
||||
}
|
||||
|
||||
static uint16_t _time_difference_in_ms(uint32_t referenceTimeMs, uint32_t currentTimeMs)
|
||||
{
|
||||
return currentTimeMs - referenceTimeMs;
|
||||
}
|
||||
|
@ -3,8 +3,6 @@
|
||||
|
||||
#include "lvgl.h"
|
||||
|
||||
#define FAST_FORWARD_BACKWARD_STEP (10)
|
||||
|
||||
typedef enum MusicPlaybackCtrlAction
|
||||
{
|
||||
MUSIC_CONTROL_PLAY = 0,
|
||||
@ -19,7 +17,6 @@ typedef enum MusicPlaybackCtrlAction
|
||||
} MusicPlaybackCtrlAction_e;
|
||||
|
||||
typedef void (*MusicPlaybackCtrlCb_t)(MusicPlaybackCtrlAction_e musicPlaybackCtrlAction);
|
||||
typedef uint32_t (*MusicPlayerTimeRefmsCb_t)(void);
|
||||
|
||||
typedef struct PlayerButton
|
||||
{
|
||||
@ -47,31 +44,21 @@ typedef struct MusicPlayerScreen
|
||||
lv_obj_t *titleLabel;
|
||||
lv_obj_t *artistLabel;
|
||||
TimeLabel_t positionTimeLabel, durationTimeLabel;
|
||||
lv_timer_t *trackPlayCursorUpdateTimer;
|
||||
lv_timer_t *timePositionTimer;
|
||||
//Should not be erased attributes
|
||||
MusicPlaybackCtrlCb_t musicPlaybackCtrlCb;
|
||||
MusicPlayerTimeRefmsCb_t musicPlayerTimeRefmsCb;
|
||||
MusicPlaybackCtrlAction_e currentPlayState;
|
||||
char titleText[60];
|
||||
char artistText[30];
|
||||
uint16_t currentMusicDuration; //The currently playing music's total duration in seconds.
|
||||
uint32_t currentMusicPosition; //The currently playing music's cursor position in milliseconds.
|
||||
uint32_t playerStartTimeRef;
|
||||
uint16_t currentMusicPosition; //The currently playing music's cursor position in seconds.
|
||||
bool ble_connection_state;
|
||||
} MusicPlayerScreen_t;
|
||||
|
||||
/**
|
||||
* @brief Initializes the music player screen's context object
|
||||
* @note This function has to be called first before any others
|
||||
*
|
||||
* @param musicPlayerScreen a pointer to the music player screen's context structure to initialize.
|
||||
*/
|
||||
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_register_music_player_time_ref_ms_cb(MusicPlayerScreen_t * const musicPlayerScreen, MusicPlayerTimeRefmsCb_t musicPlayerTimeRefmsCb);
|
||||
|
||||
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);
|
||||
@ -84,18 +71,8 @@ void music_player_screen_set_music_playing_state(MusicPlayerScreen_t * const mus
|
||||
|
||||
bool music_player_screen_is_in_use(MusicPlayerScreen_t * const musicPlayerScreen);
|
||||
|
||||
/**
|
||||
* @brief Graphically builds the music player screen.
|
||||
*
|
||||
* @param musicPlayerScreen a pointer to the music player screen's context structure to initialize.
|
||||
*/
|
||||
void music_player_screen_create(MusicPlayerScreen_t * const musicPlayerScreen);
|
||||
|
||||
/**
|
||||
* @brief Frees all resources used by the MusicPlayerScreen object.
|
||||
*
|
||||
* @param musicPlayerScreen a pointer to the music player screen's context structure to initialize.
|
||||
*/
|
||||
void music_player_screen_destroy(MusicPlayerScreen_t * const musicPlayerScreen);
|
||||
|
||||
#endif // MUSIC_PLAYER_SCREEN_H
|
||||
|
Loading…
Reference in New Issue
Block a user