Optimise menu_display_timedate()

This commit is contained in:
jdgleaver 2019-05-01 10:56:56 +01:00
parent c9f98fce2f
commit 2e68a634a2
2 changed files with 79 additions and 69 deletions

View File

@ -21,7 +21,6 @@
#include <stdint.h> #include <stdint.h>
#include <string.h> #include <string.h>
#include <limits.h> #include <limits.h>
#include <time.h>
#include <string/stdstring.h> #include <string/stdstring.h>
#include <lists/file_list.h> #include <lists/file_list.h>
@ -3366,23 +3365,16 @@ static void rgui_render(void *data, bool is_idle)
/* Print clock (if required) */ /* Print clock (if required) */
if (settings->bools.menu_timedate_enable) if (settings->bools.menu_timedate_enable)
{ {
time_t current_time; menu_display_ctx_datetime_t datetime;
struct tm * time_info;
char timedate[16]; char timedate[16];
timedate[0] = '\0'; timedate[0] = '\0';
/* menu_display_timedate() is incredibly slow datetime.s = timedate;
* -> do this the old fashioned way... */ datetime.len = sizeof(timedate);
datetime.time_mode = 4;
/* Get current time */ menu_display_timedate(&datetime);
time(&current_time);
time_info = localtime(&current_time);
if (time_info)
{
snprintf(timedate, sizeof(timedate), "%02u:%02u",
(unsigned)time_info->tm_hour, (unsigned)time_info->tm_min);
blit_line( blit_line(
timedate_x, timedate_x,
@ -3391,7 +3383,6 @@ static void rgui_render(void *data, bool is_idle)
rgui->colors.hover_color, rgui->colors.shadow_color); rgui->colors.hover_color, rgui->colors.shadow_color);
} }
} }
}
if (!string_is_empty(rgui->msgbox)) if (!string_is_empty(rgui->msgbox))
{ {

View File

@ -73,6 +73,7 @@
#define PARTICLES_COUNT 100 #define PARTICLES_COUNT 100
#define POWERSTATE_CHECK_INTERVAL (30 * 1000000) #define POWERSTATE_CHECK_INTERVAL (30 * 1000000)
#define DATETIME_CHECK_INTERVAL 1000000
typedef struct menu_ctx_load_image typedef struct menu_ctx_load_image
{ {
@ -229,6 +230,11 @@ static size_t menu_driver_selection_ptr = 0;
/* Timers */ /* Timers */
static retro_time_t menu_driver_current_time_us = 0; static retro_time_t menu_driver_current_time_us = 0;
static retro_time_t menu_driver_powerstate_last_time_us = 0; static retro_time_t menu_driver_powerstate_last_time_us = 0;
static retro_time_t menu_driver_datetime_last_time_us = 0;
/* Storage container for current menu datetime
* representation string */
static char menu_datetime_cache[255] = {0};
/* Returns the OSK key at a given position */ /* Returns the OSK key at a given position */
int menu_display_osk_ptr_at_pos(void *data, int x, int y, int menu_display_osk_ptr_at_pos(void *data, int x, int y,
@ -364,61 +370,69 @@ static bool menu_display_check_compatibility(
* */ * */
void menu_display_timedate(menu_display_ctx_datetime_t *datetime) void menu_display_timedate(menu_display_ctx_datetime_t *datetime)
{ {
time_t time_;
if (!datetime) if (!datetime)
return; return;
/* Trigger an update, if required */
if (menu_driver_current_time_us - menu_driver_datetime_last_time_us >=
DATETIME_CHECK_INTERVAL)
{
time_t time_;
menu_driver_datetime_last_time_us = menu_driver_current_time_us;
/* Get current time */
time(&time_); time(&time_);
setlocale(LC_TIME, ""); setlocale(LC_TIME, "");
/* Format string representation */
switch (datetime->time_mode) switch (datetime->time_mode)
{ {
case 0: /* Date and time */ case 0: /* Date and time */
strftime(datetime->s, datetime->len, strftime(menu_datetime_cache, sizeof(menu_datetime_cache),
"%Y-%m-%d %H:%M:%S", localtime(&time_)); "%Y-%m-%d %H:%M:%S", localtime(&time_));
break; break;
case 1: /* YY-MM-DD HH:MM */ case 1: /* YY-MM-DD HH:MM */
strftime(datetime->s, datetime->len, strftime(menu_datetime_cache, sizeof(menu_datetime_cache),
"%Y-%m-%d %H:%M", localtime(&time_)); "%Y-%m-%d %H:%M", localtime(&time_));
break; break;
case 2: /* MM-DD-YYYY HH:MM */ case 2: /* MM-DD-YYYY HH:MM */
strftime(datetime->s, datetime->len, strftime(menu_datetime_cache, sizeof(menu_datetime_cache),
"%m-%d-%Y %H:%M", localtime(&time_)); "%m-%d-%Y %H:%M", localtime(&time_));
break; break;
case 3: /* Time */ case 3: /* Time */
strftime(datetime->s, datetime->len, strftime(menu_datetime_cache, sizeof(menu_datetime_cache),
"%H:%M:%S", localtime(&time_)); "%H:%M:%S", localtime(&time_));
break; break;
case 4: /* Time (hours-minutes) */ case 4: /* Time (hours-minutes) */
strftime(datetime->s, datetime->len, strftime(menu_datetime_cache, sizeof(menu_datetime_cache),
"%H:%M", localtime(&time_)); "%H:%M", localtime(&time_));
break; break;
case 5: /* Date and time, without year and seconds */ case 5: /* Date and time, without year and seconds */
strftime(datetime->s, datetime->len, strftime(menu_datetime_cache, sizeof(menu_datetime_cache),
"%d/%m %H:%M", localtime(&time_)); "%d/%m %H:%M", localtime(&time_));
break; break;
case 6: case 6:
strftime(datetime->s, datetime->len, strftime(menu_datetime_cache, sizeof(menu_datetime_cache),
"%m/%d %H:%M", localtime(&time_)); "%m/%d %H:%M", localtime(&time_));
break; break;
case 7: /* Time (hours-minutes), in 12 hour AM-PM designation */ case 7: /* Time (hours-minutes), in 12 hour AM-PM designation */
#if defined(__linux__) && !defined(ANDROID) #if defined(__linux__) && !defined(ANDROID)
strftime(datetime->s, datetime->len, strftime(menu_datetime_cache, sizeof(menu_datetime_cache),
"%I : %M : %S %p", localtime(&time_)); "%I : %M : %S %p", localtime(&time_));
#else #else
{ {
char *local; char *local;
strftime(datetime->s, datetime->len, strftime(menu_datetime_cache, sizeof(menu_datetime_cache),
"%I:%M:%S %p", localtime(&time_)); "%I:%M:%S %p", localtime(&time_));
local = local_to_utf8_string_alloc(datetime->s); local = local_to_utf8_string_alloc(menu_datetime_cache);
if (local) if (local)
{ {
strlcpy(datetime->s, local, datetime->len); strlcpy(menu_datetime_cache, local, sizeof(menu_datetime_cache));
free(local); free(local);
} }
} }
@ -426,6 +440,11 @@ void menu_display_timedate(menu_display_ctx_datetime_t *datetime)
} }
} }
/* Copy cached datetime string to input
* menu_display_ctx_datetime_t struct */
strlcpy(datetime->s, menu_datetime_cache, datetime->len);
}
/* Display current (battery) power state */ /* Display current (battery) power state */
void menu_display_powerstate(menu_display_ctx_powerstate_t *powerstate) void menu_display_powerstate(menu_display_ctx_powerstate_t *powerstate)
{ {