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

编辑器/阅读器

开发平台:

C/C++

  1. #include <reader_core.h>
  2. enum {
  3.   MAX_INTERVAL = 100,
  4.   MIN_INTERVAL = 10,
  5.   INTERVAL = 5,
  6.   FILENAME_BUF_SIZE = 1024,
  7.   MAX_FILES = 32,
  8.   BMP_ID = 0x4d42 //'BM'
  9. };
  10. typedef enum _tag_cursor_pos_t {
  11.   BRIGHTNESS_DR = 0,
  12.   ENABLE_BG_PIC,
  13.   BG_PIC_SETTING,
  14.   ENABLE_TIMER,
  15.   TIMER_SETTING,
  16.   LOCK_L
  17. } cursor_pos_t;
  18. reader_option_saver_t reader_option, reader_option_bak;
  19. reader_option_saver_t reader_option_def;
  20. static cursor_pos_t cursor;
  21. static void draw_cursor(screen_t screen);
  22. /***************************************************************
  23. The number N of displayed file names is limited by
  24. the MAX_FILES(N <= MAX_FILES) and 
  25. the FILENAME_BUF_SIZE (the total length of N files <= FILENAME_BUF_SIZE)
  26. ****************************************************************/
  27. static int collect_bitmap_filenames(unsigned short *buf, unsigned short **pointers, int max_size);
  28. static unsigned short *ptr_bitmap_filesnames[MAX_FILES];
  29. static unsigned short bitmap_filenames[FILENAME_BUF_SIZE];
  30. static int bg_pic_index;
  31. static void dec_bg_pic_index(void);
  32. static void inc_bg_pic_index(void);
  33. static int bg_pic_num;
  34. static int dec_brightness(void);
  35. static int inc_brightness(void);
  36. static int has_bg() {
  37.   return (bg_pic_num > 0);
  38. };
  39. void reader_option_draw_menu(screen_t screen) {
  40.   int text_pos_y[] = {30, 60, 110, 160, 230};
  41.   unsigned char *strs[] = {lcd_brightness_str, enable_bg_pic_str, timer_turn, lock_l_str, ab_prompt};
  42.   int i, ti;
  43.   unsigned short *p, *p2;
  44.   color_t time_color = READER_COLOR_WHITE, tc;
  45.   unsigned short buf[4] = {0};
  46.   reader_mmi_fill_screen(screen, READER_COLOR_BLACK);
  47.   reader_caption(screen, READER_STR(option_str));
  48.   //static text
  49.   for (i = 0; i < _dim(text_pos_y); i++) {
  50.     p = READER_STR(strs[i]);
  51.     tc = READER_COLOR_WHITE;
  52.     if ((unsigned char *)p == lcd_brightness_str) {
  53.       //show brightness value
  54.       ti = reader_option.brightness;
  55.       assert(ti <= 3);
  56.       reader_itoa(ti+1, buf);
  57.       reader_textout_ex(screen, 164, text_pos_y[i], buf, 1, DEFAULT_FONT_SIZE, READER_COLOR_WHITE, 0);
  58.     } else if ((unsigned char *)p == lock_l_str) {
  59.       if (reader_option.lock_l) {
  60.         p2 = READER_STR(yes_str);
  61.       } else {
  62.         p2 = READER_STR(no_str);
  63.       }
  64.       reader_textout_ex(screen, 160, text_pos_y[i], p2, reader_wcslen(p2), DEFAULT_FONT_SIZE, READER_COLOR_WHITE, 0);
  65.     } else if ((unsigned char *)p == timer_turn) {
  66.       if (reader_option.enable_timer) {
  67.         p2 = READER_STR(yes_str);
  68.       } else {
  69.         p2 = READER_STR(no_str);
  70.         time_color = READER_COLOR_GREY;
  71.       }
  72.       reader_textout_ex(screen, 160, text_pos_y[i], p2, reader_wcslen(p2), DEFAULT_FONT_SIZE, READER_COLOR_WHITE, 0);
  73.     } else if ((unsigned char *)p == enable_bg_pic_str) {
  74.       if (! has_bg()) {
  75.         reader_option.enable_bg_pic = 0;
  76.         tc = READER_COLOR_GREY;
  77.       }
  78.       if (reader_option.enable_bg_pic) {
  79.         p2 = READER_STR(yes_str);
  80.       } else {
  81.         p2 = READER_STR(no_str);
  82.       }
  83.       reader_textout_ex(screen, 160, text_pos_y[i], p2, reader_wcslen(p2), DEFAULT_FONT_SIZE, 
  84.         tc, 0);
  85.     }
  86.     reader_textout_ex(screen, 0, text_pos_y[i], p, reader_wcslen(p), DEFAULT_FONT_SIZE, tc, 0);
  87.   }
  88.   //show time option in grey if timer is disabled
  89.   //else in white
  90.   p = READER_STR(time_str);
  91.   reader_textout_ex(screen, 0, 130, p, reader_wcslen(p), DEFAULT_FONT_SIZE, time_color, 0);
  92.   p = READER_STR(second_str);
  93.   reader_textout_ex(screen, 160, 130, p, reader_wcslen(p), DEFAULT_FONT_SIZE, time_color, 0);
  94.   ti = reader_option.timer_interval;
  95.   assert(ti >= MIN_INTERVAL && ti <= MAX_INTERVAL);
  96.   i = reader_itoa(ti, buf);
  97.   reader_textout_ex(screen, 140, 130, buf, i, DEFAULT_FONT_SIZE, time_color, TEXT_OUT_ALIGN_RIGHT);
  98.   //show pic name or no_pic message
  99.   if (! has_bg()) {
  100.     p = READER_STR(no_bg_pic_msg);
  101.     reader_textout_ex(screen, 0, 80, p, reader_wcslen(p), DEFAULT_FONT_SIZE, READER_COLOR_GREY, 0);
  102.   } else {
  103.     p = READER_STR(bg_pic_str);
  104.     reader_textout_ex(screen, 0, 80, p, reader_wcslen(p), DEFAULT_FONT_SIZE, READER_COLOR_WHITE, 0);
  105.     //use the first file if the bg pic is not set yet
  106.     p = (*(reader_option.pic_name) ? reader_option.pic_name : ptr_bitmap_filesnames[bg_pic_index]);
  107.     reader_textout_ex(screen, 60, 80, p, reader_wcslen(p), DEFAULT_FONT_SIZE, 
  108.       (color_t)(reader_option.enable_bg_pic ? READER_COLOR_WHITE : READER_COLOR_GREY), 0);
  109.   }
  110.   draw_cursor(screen);
  111.   reader_mmi_trigger_screen_update(screen);
  112. }
  113. void reader_option_init(void) {
  114.   memset(&reader_option_def, 0, sizeof(reader_option_def));
  115.   reader_option_def.timer_interval = 20;
  116.   bg_pic_num = collect_bitmap_filenames(bitmap_filenames, ptr_bitmap_filesnames, MAX_FILES);
  117.   if (bg_pic_num > 0) {
  118.     reader_option_def.enable_bg_pic = 1;
  119.     reader_wcscpy(reader_option_def.pic_name, ptr_bitmap_filesnames[0]);
  120.   }
  121. }
  122. static void draw_cursor(screen_t screen) {
  123.   point_t cursor_pos[] = {
  124.     {150, 40}, {186, 40},
  125.     {150, 70}, {186, 70},
  126.     {50, 90}, {186, 90},
  127.     {150, 120}, {186, 120},
  128.     {110, 140}, {150, 140},
  129.     {150, 170}, {186, 170},
  130.   };
  131.   point_t *p = cursor_pos + cursor*2;
  132.   reader_arrow(screen, p[0].x, p[0].y, 5, LEFT_POINTER, READER_COLOR_YELLOW);
  133.   reader_arrow(screen, p[1].x, p[1].y, 5, RIGHT_POINTER, READER_COLOR_YELLOW);
  134. }
  135. int reader_option_cursor_up(void) {
  136.   switch (cursor) {
  137.   case BRIGHTNESS_DR:
  138.     return 1;
  139.   case LOCK_L:
  140.     if (reader_option.enable_timer) {
  141.       cursor = TIMER_SETTING;
  142.     } else {
  143.       cursor = ENABLE_TIMER;
  144.     }
  145.     return 0;
  146.   case ENABLE_TIMER:
  147.     if (! has_bg()) {
  148.       cursor = BRIGHTNESS_DR;
  149.       return 0;
  150.     }
  151.     if (reader_option.enable_bg_pic) {
  152.       cursor = BG_PIC_SETTING;
  153.     } else {
  154.       cursor = ENABLE_BG_PIC;
  155.     }
  156.     return 0;
  157.   case TIMER_SETTING:
  158.   case BG_PIC_SETTING:
  159.   case ENABLE_BG_PIC:
  160.     cursor --;
  161.     return 0;
  162.   default:
  163.     assert(0);
  164.   }
  165.   return 0;
  166. }
  167. int reader_option_cursor_down(void) {
  168.   switch (cursor) {
  169.   case BRIGHTNESS_DR:
  170.     if (has_bg()) {
  171.       cursor = ENABLE_BG_PIC;
  172.     } else {
  173.       cursor = ENABLE_TIMER;
  174.     }
  175.     return 0;
  176.   case BG_PIC_SETTING:
  177.   case TIMER_SETTING:
  178.     cursor ++;
  179.     return 0;
  180.   case ENABLE_TIMER:
  181.     if (reader_option.enable_timer) {
  182.       cursor = TIMER_SETTING;
  183.     }
  184.     else {
  185.       cursor = LOCK_L;
  186.     }
  187.     return 0;
  188.   case ENABLE_BG_PIC:
  189.     if (reader_option.enable_bg_pic) {
  190.       cursor = BG_PIC_SETTING;
  191.     } else {
  192.       cursor = ENABLE_TIMER;
  193.     }
  194.     return 0;
  195.   case LOCK_L:
  196.     return 1;
  197.   default:
  198.     assert(0);
  199.   }
  200.   return 0;
  201. }
  202. int reader_option_cursor_left(void) {
  203.   switch (cursor) {
  204.   case BRIGHTNESS_DR:
  205.     return dec_brightness();
  206.   case LOCK_L:
  207.     if (reader_option.lock_l) {
  208.       reader_option.lock_l = 0;
  209.     } else {
  210.       reader_option.lock_l = 1;
  211.     }
  212.     return 0;
  213.   case ENABLE_TIMER:
  214.     if (reader_option.enable_timer) {
  215.       reader_option.enable_timer = 0;
  216.     } else {
  217.       reader_option.enable_timer = 1;
  218.     }
  219.     return 0;
  220.   case TIMER_SETTING: {
  221.     int t = reader_option.timer_interval;
  222.     assert(t >= MIN_INTERVAL);
  223.     if (t == MIN_INTERVAL) {
  224.       return 1;
  225.     }
  226.     t -= INTERVAL;
  227.     reader_option.timer_interval = t;
  228.     return 0;
  229.           }
  230.   case ENABLE_BG_PIC:
  231.     if (reader_option.enable_bg_pic) {
  232.       reader_option.enable_bg_pic = 0;
  233.     } else {
  234.       reader_option.enable_bg_pic = 1;
  235.       if (reader_option.pic_name[0] == 0) { //not initialized
  236.         reader_wcscpy(reader_option.pic_name, ptr_bitmap_filesnames[bg_pic_index]);
  237.       }
  238.     }
  239.     return 0;
  240.   case BG_PIC_SETTING:
  241.     dec_bg_pic_index();
  242.     return 0;
  243.   default:
  244.     assert(0);
  245.     break;
  246.   }
  247.   return 1;
  248. }
  249. int reader_option_cursor_right(void) {
  250.   switch (cursor) {
  251.   case BRIGHTNESS_DR:
  252.     return inc_brightness();
  253.   case LOCK_L:
  254.   case ENABLE_TIMER:
  255.   case ENABLE_BG_PIC:
  256.     //the inverse logic is the same with cursor_left()
  257.     return reader_option_cursor_left();
  258.   case TIMER_SETTING: {
  259.     int t = reader_option.timer_interval;
  260.     assert(t <= MAX_INTERVAL);
  261.     if (t == MAX_INTERVAL) {
  262.       return 1;
  263.     }
  264.     t += INTERVAL;
  265.     reader_option.timer_interval = t;
  266.     return 0;
  267.           }
  268.   case BG_PIC_SETTING:
  269.     inc_bg_pic_index();
  270.     return 0;
  271.   default:
  272.     assert(0);
  273.     break;
  274.   }
  275.   return 1;
  276. }
  277. static void check_cursor(void) {
  278.   if (cursor == TIMER_SETTING && (! reader_option.enable_timer)) {
  279.     cursor = ENABLE_TIMER;
  280.   }
  281.   if (cursor == BG_PIC_SETTING && (! reader_option.enable_bg_pic)) {
  282.     cursor = ENABLE_BG_PIC;
  283.   }
  284. }
  285. void reader_option_select_ready(void) {
  286.   check_cursor();
  287.   memcpy(&reader_option_bak, &reader_option, sizeof(reader_option));
  288. }
  289. void reader_option_select_cancel(void) {
  290.   memcpy(&reader_option, &reader_option_bak, sizeof(reader_option));
  291.   //restore brightness
  292.   reader_dev_dsl_set_brightness(reader_option.brightness);
  293. }
  294. int reader_option_lkey_locked(void) {
  295.   return reader_option.lock_l;
  296. }
  297. int reader_option_timer_enabled(void) {
  298.   return reader_option.enable_timer;
  299. }
  300. int reader_option_timer_interval(void) {
  301.   return reader_option.timer_interval;
  302. }
  303. int reader_option_bg_pic_enabled(void) {
  304.   return reader_option.enable_bg_pic;
  305. }
  306. void reader_option_disable_bg_pic(void) {
  307.   reader_option.enable_bg_pic = 0;
  308. }
  309. unsigned short *reader_option_bg_pic(void) {
  310.   return reader_option.pic_name;
  311. }
  312. //-- turn timer control
  313. static unsigned int turn_timer_v;
  314. int reader_option_turn_timer_check(unsigned int e) {
  315.   if (turn_timer_v < e) {
  316.     return 1;
  317.   }
  318.   turn_timer_v -= e;
  319.   return 0;
  320. }
  321. void reader_option_turn_timer_reset(void) {
  322.   turn_timer_v = reader_option_timer_interval() * 1000; //in ms
  323. }
  324. //-- fs access helper
  325. //return 0 means OK, 1 means invalid
  326. static int check_pic_content(unsigned short *bmpfile) {
  327.   fsal_file_handle_t fd = fsal_open(bmpfile, "rb");
  328.   char buf[sizeof(BMPHeader0)+sizeof(BMP_Headers)];
  329.   int nr;
  330.   BMPHeader0 *pheader0;
  331.   BMP_Headers *pheader;
  332.   if (fd == 0) {
  333.     goto err;
  334.   }
  335.   nr = fsal_read(buf, sizeof(buf), 1, fd);
  336.   if (nr != 1) {
  337.     goto err;
  338.   }
  339.   fsal_close(fd);
  340.   pheader0 = (BMPHeader0 *)buf;
  341.   READER_TRACEW((L"bmpfile=%s ", bmpfile));
  342.   READER_TRACE(("id=%xn", pheader0->Id));
  343.   if (pheader0->Id != BMP_ID) {
  344.     goto err;
  345.   }
  346.   pheader = (BMP_Headers *)(buf+sizeof(BMPHeader0));
  347.   READER_TRACE(("colors=%dn", pheader->NColors));
  348.   if ((pheader->Width != READER_SCREEN_HEIGHT)
  349.     ||(pheader->Height != READER_SCREEN_WIDTH)
  350.     ||(pheader->Compression != 0 )) {
  351.     goto err;
  352.   }
  353.   return 0;
  354. err:
  355.   if (fd != 0) {
  356.     fsal_close(fd);
  357.   }
  358.   return 1;
  359. }
  360. //return 1 means the input file should be filtered
  361. //return 0 means the input file is qualified
  362. static int bg_pic_filter(unsigned short *filename, struct stat *st) {
  363.   unsigned short ext1[5] = {'.', 'b', 'm', 'p', 0};
  364.   unsigned short ext2[5] = {'.', 'B', 'M', 'P', 0};
  365.   unsigned short *p;
  366.   static unsigned short pic_name[READER_FILENAME_MAX];
  367.   if (st->st_mode & S_IFDIR) {
  368.     return 1;
  369.   }
  370.   p = reader_wcsrchr(filename, '.');
  371.   if (p == NULL) {
  372.     return 1;
  373.   }
  374.   if ((memcmp(p, ext1, 10) != 0)
  375.     && (memcmp(p, ext2, 10) != 0)) {
  376.     return 1;
  377.   }
  378.   reader_full_pic_name(pic_name, filename);
  379.   return check_pic_content(pic_name);
  380. }
  381. static int collect_bitmap_filenames(unsigned short *buf, unsigned short **pointers, int max_size) {
  382.   fsal_dir_handle_t dir_handle;
  383.   int i, len;
  384.   struct stat st;
  385.   int cursor = 0;
  386.   unsigned short *p;
  387.   static unsigned short filename[READER_PATH_MAX]; //no stack overhead
  388.   dir_handle = fsal_diropen(reader_path_bg);
  389.   if (0 == dir_handle) {
  390.     return 0;
  391.   }
  392.   i = 0;
  393.   while ((i < MAX_FILES)
  394.     && (fsal_dirnext(dir_handle, filename, &st) == 0)) {
  395.     if (*filename == 0) {
  396.       //no lfn is found
  397.       continue;
  398.     }
  399.     if (0 == bg_pic_filter(filename, &st)) {
  400.       len = reader_wcslen(filename);
  401.       if (cursor+len+1 > FILENAME_BUF_SIZE) {
  402.         break;
  403.       }
  404.       p = buf+cursor;
  405.       reader_wcsncpy(p, filename, len);
  406.       p[len] = 0;
  407.       cursor += len+1; //move over last ''
  408.       pointers[i ++] = p;
  409.     }
  410.   }
  411.   return i;
  412. }
  413. //-- bg pic index operators
  414. static void dec_bg_pic_index(void) {
  415.   bg_pic_index --;
  416.   if (bg_pic_index < 0) {
  417.     bg_pic_index = bg_pic_num - 1;
  418.   }
  419.   reader_wcscpy(reader_option.pic_name, ptr_bitmap_filesnames[bg_pic_index]);
  420. }
  421. static void inc_bg_pic_index(void) {
  422.   bg_pic_index ++;
  423.   if (bg_pic_index >= bg_pic_num) {
  424.     bg_pic_index = 0;
  425.   }
  426.   reader_wcscpy(reader_option.pic_name, ptr_bitmap_filesnames[bg_pic_index]);
  427. }
  428. //-- dsl brightness operators
  429. static int dec_brightness(void) {
  430.   if (reader_option.brightness > 0) {
  431.     reader_option.brightness --;
  432.     reader_dev_dsl_set_brightness(reader_option.brightness);
  433.     return 0;
  434.   }
  435.   return 1;
  436. }
  437. static int inc_brightness(void) {
  438.   if (reader_option.brightness < 3) {
  439.     reader_option.brightness ++;
  440.     reader_dev_dsl_set_brightness(reader_option.brightness);
  441.     return 0;
  442.   }
  443.   return 1;
  444. }