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

编辑器/阅读器

开发平台:

C/C++

  1. #include <reader_core.h>
  2. #include <stdio.h>
  3. #include <stdlib.h>
  4. enum {
  5.   //individual data
  6.   PAGE_ADDR = 4,
  7.   //8KB save file
  8.   SAVER_SIZE = 8 *1024,
  9.   //global data
  10.   TAG_ADDR = 0, //8 bytes
  11.   COLOR_ADDR = 8, //16 bytes
  12.   TIME_ADDR = 32, //8 bytes
  13.   OPTION_ADDR = 40, //1024 bytes
  14.   SCENARIO_ADDR_V00 = 64,
  15.   SCENARIO_ADDR = 1064 //2048 bytes
  16. };
  17. #define SAVER_MAGIC 0xceeccffc
  18. #define SAV_FILE (reader_path_save)
  19. static unsigned short save_filename_v00[] = {'/','D','o','l','R','e','a','d','.','s','a','v',0};
  20. //tag for DR saver file
  21. #define SAVER_TAG "DRSAV01"
  22. //--page
  23. void reader_save_page(unsigned short *filename, int page_number) {
  24.   reader_file_saver_t saver;
  25.   fsal_file_handle_t fd = fsal_open(filename, "rb+");
  26.   if (fd == 0) {
  27.     return;
  28.   }
  29.   fsal_seek(fd, PAGE_ADDR, SEEK_SET);
  30.   fsal_read(&saver, sizeof(saver), 1, fd);
  31.   saver.parts.page_number = page_number;
  32.   fsal_seek(fd, PAGE_ADDR, SEEK_SET);
  33.   fsal_write(&saver, sizeof(saver), 1, fd);
  34.   fsal_close(fd);
  35. }
  36. //return page number saved by reader_save_page()
  37. int reader_load_page(unsigned short *filename) {
  38.   reader_file_saver_t saver;
  39.   fsal_file_handle_t fd = fsal_open(filename, "rb");
  40.   if (fd == 0) {
  41.     return 0;
  42.   }
  43.   fsal_seek(fd, PAGE_ADDR, SEEK_SET);
  44.   fsal_read(&saver, sizeof(saver), 1, fd);
  45.   fsal_close(fd);
  46.   return saver.parts.page_number;
  47. }
  48. //--layout
  49. int reader_load_layout(unsigned short *filename) {
  50.   reader_file_saver_t saver;
  51.   fsal_file_handle_t fd = fsal_open(filename, "rb");
  52.   if (fd == 0) {
  53.     return 0;
  54.   }
  55.   fsal_seek(fd, PAGE_ADDR, SEEK_SET);
  56.   fsal_read(&saver, sizeof(saver), 1, fd);
  57.   fsal_close(fd);
  58.   return saver.parts.layout;
  59. }
  60. void reader_save_layout(unsigned short *filename, int layout) {
  61.   reader_file_saver_t saver;
  62.   fsal_file_handle_t fd = fsal_open(filename, "rb+");
  63.   if (fd == 0) {
  64.     return;
  65.   }
  66.   fsal_seek(fd, PAGE_ADDR, SEEK_SET);
  67.   fsal_read(&saver, sizeof(saver), 1, fd);
  68.   saver.parts.layout = layout;
  69.   fsal_seek(fd, PAGE_ADDR, SEEK_SET);
  70.   fsal_write(&saver, sizeof(saver), 1, fd);
  71.   fsal_close(fd);
  72. }
  73. //--color
  74. void reader_save_color(void) {
  75.   unsigned int i = SAVER_MAGIC;
  76.   fsal_file_handle_t fd = fsal_open(SAV_FILE, "rb+");
  77.   if (fd == 0) {
  78.     return;
  79.   }
  80.   fsal_seek(fd, COLOR_ADDR, SEEK_SET);
  81.   fsal_write(&i, 4, 1, fd);
  82.   fsal_write(reader_color_context, sizeof(reader_color_context), 1, fd);
  83.   fsal_close(fd);
  84. }
  85. void reader_load_color(void) {
  86.   unsigned int i;
  87.   fsal_file_handle_t fd = fsal_open(SAV_FILE, "rb");
  88.   if (fd == 0) {
  89.     memcpy(reader_color_context, reader_color_context_def, sizeof(reader_color_context));
  90.     return;
  91.   }
  92.   fsal_seek(fd, COLOR_ADDR, SEEK_SET);
  93.   fsal_read(&i, 4, 1, fd);
  94.   if (i != SAVER_MAGIC) {
  95.     fsal_close(fd);
  96.     memcpy(reader_color_context, reader_color_context_def, sizeof(reader_color_context));
  97.     return;
  98.   }
  99.   fsal_read(reader_color_context, sizeof(reader_color_context), 1, fd);
  100.   fsal_close(fd);
  101. }
  102. //--option
  103. void reader_save_option() {
  104.   unsigned int i = SAVER_MAGIC;
  105.   fsal_file_handle_t fd = fsal_open(SAV_FILE, "rb+");
  106.   if (fd == 0) {
  107.     return;
  108.   }
  109.   fsal_seek(fd, OPTION_ADDR, SEEK_SET);
  110.   fsal_write(&i, 4, 1, fd);
  111.   fsal_write(&reader_option, sizeof(reader_option), 1, fd);
  112.   fsal_close(fd);
  113. }
  114. void reader_load_option() {
  115.   unsigned int i;
  116.   fsal_file_handle_t fd = fsal_open(SAV_FILE, "rb");
  117.   if (fd == 0) {
  118.     memcpy(&reader_option, &reader_option_def, sizeof(reader_option));
  119.     return;
  120.   }
  121.   fsal_seek(fd, OPTION_ADDR, SEEK_SET);
  122.   fsal_read(&i, 4, 1, fd);
  123.   if (i != SAVER_MAGIC) {
  124.     fsal_close(fd);
  125.     memcpy(&reader_option, &reader_option_def, sizeof(reader_option));
  126.     return;
  127.   }
  128.   fsal_read(&reader_option, sizeof(reader_option), 1, fd);
  129.   fsal_close(fd);
  130.   if (reader_option_timer_enabled()) {
  131.     reader_option_turn_timer_reset();
  132.   }
  133.   
  134.   //verify brightness range
  135.   if (reader_option.brightness > 3) {
  136.     reader_option.brightness = 1;
  137.   }
  138.   reader_dev_dsl_set_brightness(reader_option.brightness);
  139. }
  140. //--scenario
  141. void reader_save_scenario(reader_scenario_saver_t *data) {
  142.   unsigned int i = SAVER_MAGIC;
  143.   fsal_file_handle_t fd = fsal_open(SAV_FILE, "rb+");
  144.   if (fd == 0) {
  145.     return;
  146.   }
  147.   fsal_seek(fd, SCENARIO_ADDR, SEEK_SET);
  148.   fsal_write(&i, 4, 1, fd);
  149.   fsal_write(data, sizeof(*data), 1, fd);
  150.   fsal_close(fd);
  151. }
  152. //return 0 means load successfully, -1 means no record saved yet
  153. int reader_load_scenario(reader_scenario_saver_t *data) {
  154.   unsigned int i;
  155.   fsal_file_handle_t fd = fsal_open(SAV_FILE, "rb");
  156.   if (fd == 0) {
  157.     return -1;
  158.   }
  159.   fsal_seek(fd, SCENARIO_ADDR, SEEK_SET);
  160.   fsal_read(&i, 4, 1, fd);
  161.   if (i != SAVER_MAGIC) {
  162.     fsal_close(fd);
  163.     return -1;
  164.   }
  165.   fsal_read(data, sizeof(*data), 1, fd);
  166.   fsal_close(fd);
  167.   return 0;
  168. }
  169. //--time
  170. void reader_save_time(unsigned int t) {
  171.   unsigned int i = SAVER_MAGIC;
  172.   fsal_file_handle_t fd = fsal_open(SAV_FILE, "rb+");
  173.   if (fd == 0) {
  174.     return;
  175.   }
  176.   fsal_seek(fd, TIME_ADDR, SEEK_SET);
  177.   fsal_write(&i, 4, 1, fd);
  178.   fsal_write(&t, 4, 1, fd);
  179.   fsal_close(fd);
  180. }
  181. unsigned int reader_load_time(void) {
  182.   unsigned int i;
  183.   fsal_file_handle_t fd = fsal_open(SAV_FILE, "rb");
  184.   if (fd == 0) {
  185.     return -1;
  186.   }
  187.   fsal_seek(fd, TIME_ADDR, SEEK_SET);
  188.   fsal_read(&i, 4, 1, fd);
  189.   if (i != SAVER_MAGIC) {
  190.     fsal_close(fd);
  191.     return 0;
  192.   }
  193.   fsal_read(&i, 4, 1, fd);
  194.   fsal_close(fd);
  195.   return i;
  196. }
  197. static int move_data(fsal_file_handle_t fd_old, fsal_file_handle_t fd_new, 
  198.                      int pos_old, int pos_new, 
  199.                      char *buf, int size) {
  200.   fsal_seek(fd_old, pos_old, SEEK_SET);
  201.   fsal_read(buf, size, 1, fd_old);
  202.   fsal_seek(fd_new, pos_new, SEEK_SET);
  203.   fsal_write(buf, size, 1, fd_new);
  204.   return 0;
  205. }
  206. int reader_save_init(void) {
  207.   fsal_file_handle_t fd = fsal_open(SAV_FILE, "rb"), fd_v00 = 0;
  208.   char buf[SAVER_SIZE] = SAVER_TAG;
  209.   int n;
  210.   if (fd == 0) {
  211.     fd = fsal_open(SAV_FILE, "wb");
  212.     if (fd == 0) {
  213.       return -1;
  214.     }
  215.     n = fsal_write(buf, sizeof(buf), 1, fd);
  216.     if (n != 1) {
  217.       fsal_close(fd);
  218.       return -1;
  219.     }
  220.     //try converting the existing saver
  221.     fd_v00 = fsal_open(save_filename_v00, "rb");
  222.     if (fd_v00 != 0) {
  223.       //time
  224.       move_data(fd_v00, fd, TIME_ADDR, TIME_ADDR, buf, 8);
  225.       //scenario
  226.       move_data(fd_v00, fd, SCENARIO_ADDR_V00, SCENARIO_ADDR, buf, 2048);
  227.       fsal_close(fd_v00);
  228.     }
  229.     fsal_close(fd);
  230.     return 0;
  231.   }
  232.   fsal_close(fd);
  233.   return 0;
  234. }