reader_time.c
上传用户:holyzs
上传日期:2022-06-29
资源大小:2335k
文件大小:4k
源码类别:

编辑器/阅读器

开发平台:

C/C++

  1. #include <reader_core.h>
  2. static unsigned char timer_id;
  3. static reader_time_t rtm;
  4. static unsigned int this_reading_time, total_reading_time;
  5. enum {
  6.   LONG_TIME_THRESHOLD = 3600 //1 hour
  7. };
  8. void reader_time_init(void) {
  9.   StartTime(true);
  10.   timer_id = NewTimer(true);
  11.   total_reading_time = reader_load_time();
  12. }
  13. void reader_set_time_info(reader_time_t *tm) {
  14.   rtm = *tm;
  15. }
  16. void reader_time_inc(int seconds) {
  17.   this_reading_time += seconds;
  18.   total_reading_time += seconds;
  19.   if (total_reading_time % 60 == 0) {
  20.     //save total reading time every minute
  21.     reader_save_time(total_reading_time);
  22.   }
  23. }
  24. void reader_time_get(reader_time_t *tm) {
  25. #ifdef WIN32
  26.   SYSTEMTIME st;
  27.   GetSystemTime(&st);
  28.   tm->year = st.wYear;
  29.   tm->month = st.wMonth;
  30.   tm->day = st.wDay;
  31.   tm->hour = st.wHour;
  32.   tm->minute = st.wMinute;
  33.   tm->second = st.wSecond;
  34. #else
  35.   //refer to PALIB WIKI RTC part
  36.   tm->year = PA_RTC.Year + 2000;
  37.   tm->month = PA_RTC.Month;
  38.   tm->day = PA_RTC.Day;
  39.   tm->hour = PA_RTC.Hour;
  40.   tm->minute = PA_RTC.Minutes;
  41.   tm->second = PA_RTC.Seconds;
  42. #endif
  43. }
  44. unsigned int reader_time_elapse(void) {
  45.   return Tick(timer_id);
  46. }
  47. void reader_time_reset(void) {
  48.   ResetTimer(timer_id);
  49. }
  50. static void format_integer(unsigned short *buf, int i) {
  51.   assert(i >= 0 && i < 100);
  52.   buf[0] = i / 10 + '0';
  53.   buf[1] = i % 10 + '0';
  54. }
  55. static void format_time(unsigned short *buf, int hour, int minute, int second) {
  56.   int i = 0;
  57.   //hour may be greater than 100 (rarely)
  58.   if (hour < 100) {    
  59.     format_integer(buf, hour);
  60.     i = 2;
  61.   } else {
  62.     i = reader_itoa(hour, buf);
  63.   }
  64.   buf[i++] = ':';
  65.   format_integer(buf + i, minute);
  66.   i += 2;
  67.   buf[i++] = ':';
  68.   format_integer(buf + i, second);
  69.   i += 2;
  70.   buf[i] = 0;
  71. }
  72. static void translate_time_counter(unsigned int t, int *hour, int *minute, int *second) {
  73.   int left_seconds;
  74.   *hour = t / 3600;
  75.   left_seconds = t % 3600;
  76.   *minute = left_seconds / 60;
  77.   *second = left_seconds % 60;
  78. }
  79. void reader_show_time_info(screen_t screen) {
  80.   int text_pos_y[] = {30, 100, 170, 230};
  81.   unsigned char *strs[] = {current_time_str, this_time_str, total_time_str, return_prompt};
  82.   int i;
  83.   unsigned short buf[32];
  84.   unsigned short *p;
  85.   int hour, minute, second;
  86.   reader_mmi_fill_screen(screen, READER_COLOR_BLACK);
  87.   reader_caption(screen, READER_STR(time_info_str));
  88.   //draw static text first
  89.   for (i = 0; i < _dim(text_pos_y); i++) {
  90.     p = READER_STR(strs[i]);
  91.     reader_textout_ex(screen, 0, text_pos_y[i], p, reader_wcslen(p), DEFAULT_FONT_SIZE, READER_COLOR_WHITE, 0);
  92.   }
  93.   //show current time
  94.   READER_TRACE(("time=%d:%d:%dn", rtm.hour, rtm.minute, rtm.second));
  95.   format_time(buf, rtm.hour, rtm.minute, rtm.second);
  96.   reader_textout_ex(screen, 40, 50, buf, reader_wcslen(buf), DEFAULT_FONT_SIZE, READER_COLOR_THIN_BLUE, 0);
  97.   //show this reading time
  98.   translate_time_counter(this_reading_time, &hour, &minute, &second);
  99.   format_time(buf, hour, minute, second);
  100.   reader_textout_ex(screen, 40, 120, buf, reader_wcslen(buf), DEFAULT_FONT_SIZE, READER_COLOR_THIN_BLUE, 0);
  101.   if (this_reading_time > LONG_TIME_THRESHOLD) {
  102.     p = READER_STR(long_time_msg);
  103.     reader_textout_ex(screen, 20, 140, p, reader_wcslen(p), 14, READER_COLOR_THIN_BLUE, 0);
  104.   }
  105.   //show total reading time
  106.   translate_time_counter(total_reading_time, &hour, &minute, &second);
  107.   format_time(buf, hour, minute, second);
  108.   reader_textout_ex(screen, 40, 190, buf, reader_wcslen(buf), DEFAULT_FONT_SIZE, READER_COLOR_THIN_BLUE, 0);
  109.   //show date
  110.   READER_TRACE(("date=%d/%d/%dn", rtm.month, rtm.day, rtm.year));
  111.   format_integer(buf, rtm.month);
  112.   buf[2] = '/';
  113.   format_integer(buf + 3, rtm.day);
  114.   buf[5] = '/';
  115.   i = reader_itoa(rtm.year, buf + 6);
  116.   assert(i == 4);
  117.   buf[10] = 0;
  118.   reader_textout_ex(screen, 100, 50, buf, reader_wcslen(buf), DEFAULT_FONT_SIZE, READER_COLOR_WHITE, 0);
  119.   reader_mmi_trigger_screen_update(screen);
  120. }