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

编辑器/阅读器

开发平台:

C/C++

  1. #include <reader_core.h>
  2. unsigned short *reader_text;
  3. int reader_text_size;
  4. user_state_t user_state;
  5. static reader_scenario_saver_t saver;
  6. enum {
  7.   Start_TIME_SLOW = 50,
  8.   Start_TIME_FAST = 25
  9. };
  10. static int already_draw_left;
  11. static void on_paint(void);
  12. //return a bool value which means need refresh or not
  13. static int on_timer(void);
  14. //help function to handle file errors
  15. static unsigned short *get_reader_text(unsigned short *dirname, unsigned short *filename);
  16. int main(void)
  17. {
  18.   static int magic_state;
  19.   static unsigned short name[READER_FILENAME_MAX+1]; //less stack overhead
  20.   // PAlib Inits
  21.   PA_Init();
  22.   PA_InitVBL();
  23.   // initialize background
  24.   PA_Init16bitBg(0, 3);
  25.   PA_Init16bitBg(1, 3);
  26.   //FAT and saving system initialization
  27.   fsal_init();
  28.   reader_save_init();
  29.   //initialize the timer used by the reader
  30.   reader_time_init();
  31.   //load color configuration
  32.   reader_load_color();
  33.   reader_color_set();
  34.   //load user options
  35.   reader_option_init();
  36.   reader_load_option();
  37.   //set font size to default value in case no saved value
  38.   reader_set_font_size(DEFAULT_FONT_SIZE, 0);
  39.   if (reader_load_scenario(&saver) < 0) {
  40.     user_state = SELECT_TEXT;
  41.     reader_set_info_visible(1); //status info is visible by default
  42.     reader_file_init();
  43.   } else {
  44.     //load global states
  45.     user_state = (user_state_t) saver.state;
  46.     reader_set_info_visible(saver.info_visible);
  47.     reader_set_font_size(saver.font_size, 0);
  48.     switch (user_state) {
  49.     case READ_TEXT:{
  50.         //directories information is also initialized in reader_init()
  51.         if (0 != reader_init(saver.uni_dir, saver.uni_file)) {
  52.           //something wrong in the saved data, ignore it
  53.           user_state = SELECT_TEXT;
  54.           reader_file_init();
  55.           break;
  56.         }
  57.         reader_text = reader_get_current_content(NULL);
  58.         user_state = READ_TEXT;
  59.       }
  60.       break;
  61.     case SELECT_TEXT:{
  62.         if (reader_file_set_dir(saver.uni_dir)
  63.             || reader_file_menu_set_cursor(saver.cursor)) {
  64.           //something wrong in the saved data, ignore it
  65.           user_state = SELECT_TEXT;
  66.           reader_file_init();
  67.           break;
  68.         }
  69.       }
  70.       break;
  71.     default:
  72.       break;
  73.     }
  74.   }                             //end load scenario data
  75.   on_paint();
  76.   while (1) {                   // Inifinite loop
  77.     int need_refresh = 0;
  78.     int need_save = 0;
  79.     static unsigned int down_cnt, up_cnt, left_cnt, right_cnt;
  80.     //background light management, turn off the light no matter what the user state is
  81.     PA_CheckLid();
  82.     switch (user_state) {
  83.     case READ_TEXT:
  84.       if (Pad.Newpress.Up) {    //left after turned
  85.         if (0 == reader_turn_prev_page()) {
  86.           need_refresh = 1;
  87.         }
  88.       } else if (Pad.Newpress.Down) {   //right after turned
  89.         if (0 == reader_turn_next_page()) {
  90.           need_refresh = 1;
  91.         }
  92.       } else if (Pad.Newpress.Right) {  //up after turned
  93.         if (0 == reader_turn_prev_page10()) {
  94.           need_refresh = 1;
  95.         } else {
  96.           //switch to the previous file
  97.           if (0 == reader_file_menu_up()) {
  98.             if (0 == reader_file_current_item(name)) {
  99.               reader_text = get_reader_text(NULL, name);
  100.               need_save = 1;
  101.               need_refresh = 1;
  102.             } else {
  103.               //the previous item is not a file, move back cursor 
  104.               reader_file_menu_down();
  105.             }
  106.           }
  107.         }
  108.       } else if (Pad.Newpress.Left) {   //down after turned
  109.         if (0 == reader_turn_next_page10()) {
  110.           need_refresh = 1;
  111.         } else {
  112.           //switch to the next file
  113.           if (0 == reader_file_menu_down()) {
  114.             if (0 == reader_file_current_item(name)) {
  115.               reader_text = get_reader_text(NULL, name);
  116.               need_save = 1;
  117.               need_refresh = 1;
  118.             } else {
  119.               //the next item is not a file, move back cursor 
  120.               reader_file_menu_up();
  121.             }
  122.           }
  123.         }
  124.       } else if (Pad.Newpress.A) {
  125.         user_state = CONFIG_OPTION;
  126.         reader_option_select_ready();
  127.         need_refresh = 1;
  128.       } else if (Pad.Newpress.B
  129.                  || ((!reader_option_lkey_locked()) && Pad.Newpress.L)) {
  130.         user_state = SELECT_TEXT;
  131.         need_refresh = 1;
  132.         need_save = 1;
  133.       } else if (Pad.Newpress.Y) {
  134.         user_state = SELECT_COLOR;
  135.         reader_color_select_ready();
  136.         need_refresh = 1;
  137.       } else if (Pad.Newpress.X) {
  138.         int layout = (!reader_get_layout());
  139.         reader_set_layout(layout, 1);
  140.         reader_save_layout(reader_get_current_file(), layout);
  141.         need_refresh = 1;
  142.       } else if (Pad.Newpress.R) {
  143.         if (reader_info_visible()) {
  144.           reader_set_info_visible(0);
  145.         } else {
  146.           reader_set_info_visible(1);
  147.         }
  148.         need_refresh = 1;
  149.         need_save = 1;
  150.       } else if (Pad.Newpress.Select) {
  151.         reader_switch_font_size();
  152.         need_refresh = 1;
  153.         need_save = 1;
  154.       } else if (Pad.Newpress.Start) {
  155.         //set timer info to current time
  156.         reader_time_t tm;
  157.         user_state = SHOW_TIME;
  158.         reader_time_get(&tm);
  159.         reader_set_time_info(&tm);
  160.         need_refresh = 1;
  161.       }
  162.       //for stylus control
  163.       //one touch in full screen mode
  164.       else if (Stylus.Newpress) {
  165.         int y = READER_SCREEN_HEIGHT - 1 - Stylus.X;
  166.         int x = Stylus.Y;
  167.         if (!reader_info_visible()) {   //full screen
  168.           if (y < 32) {
  169.             //touch top 2 lines, back to file menu
  170.             user_state = SELECT_TEXT;
  171.             need_refresh = 1;
  172.             need_save = 1;
  173.           } else if (x < 32) {
  174.             //touch leftmost 2 columns, turn to the previous page
  175.             if (0 == reader_turn_prev_page()) {
  176.               need_refresh = 1;
  177.             }
  178.           } else if ((x > 50) && (y > 50)) {
  179.             //touch right-bottom part, turn to the next page
  180.             if (0 == reader_turn_next_page()) {
  181.               need_refresh = 1;
  182.               need_save = 1;
  183.             }
  184.           }
  185.         }
  186.       }
  187.       //drag the sliding bar
  188.       else if (Stylus.Held) {
  189.         if (reader_info_visible() && Stylus.X > 0 && Stylus.X < 25) {
  190.           int old_pg = reader_get_current_page();
  191.           int x_cur = Stylus.Y;
  192.           int page_number =
  193.               x_cur * reader_total_pages / READER_SCREEN_WIDTH;
  194.           if (page_number > reader_total_pages - 1) {
  195.             page_number = reader_total_pages - 1;
  196.           }
  197.           if (page_number != old_pg) {
  198.             reader_set_current_page(page_number);
  199.             need_refresh = 1;
  200.           }
  201.         }
  202.       }
  203.       //for fast turnning pages
  204.       else if (Pad.Held.Up) {
  205.         up_cnt++;
  206.         //held for a while to begin fast turnning
  207.         if (up_cnt > Start_TIME_SLOW) {
  208.           if (0 == reader_turn_prev_page()) {
  209.             need_refresh = 1;
  210.           }
  211.         }
  212.       } else if (Pad.Held.Down) {
  213.         down_cnt++;
  214.         //held for a while to begin fast turnning
  215.         if (down_cnt > Start_TIME_SLOW) {
  216.           if (0 == reader_turn_next_page()) {
  217.             need_refresh = 1;
  218.           }
  219.         }
  220.       } else if (Pad.Held.Left) {
  221.         left_cnt++;
  222.         //held for a while to begin fast turnning
  223.         if (left_cnt > Start_TIME_SLOW) {
  224.           if (0 == reader_turn_next_page10()) {
  225.             need_refresh = 1;
  226.           }
  227.         }
  228.       } else if (Pad.Held.Right) {
  229.         right_cnt++;
  230.         //held for a while to begin fast turnning
  231.         if (right_cnt > Start_TIME_SLOW) {
  232.           if (0 == reader_turn_prev_page10()) {
  233.             need_refresh = 1;
  234.           }
  235.         }
  236.       }
  237.       if (!Pad.Held.Up) {
  238.         up_cnt = 0;
  239.       }
  240.       if (!Pad.Held.Down) {
  241.         down_cnt = 0;
  242.       }
  243.       if (!Pad.Held.Left) {
  244.         left_cnt = 0;
  245.       }
  246.       if (!Pad.Held.Right) {
  247.         right_cnt = 0;
  248.       }
  249.       break;
  250.     case SELECT_TEXT:
  251.       if (Pad.Newpress.Up) {
  252.         if (0 == reader_file_menu_prev_page()) {
  253.           need_refresh = 1;
  254.           need_save = 1;
  255.         }
  256.       } else if (Pad.Newpress.Down) {
  257.         if (0 == reader_file_menu_next_page()) {
  258.           need_refresh = 1;
  259.           need_save = 1;
  260.         }
  261.       } else if (Pad.Newpress.Left) {
  262.         if (0 == reader_file_menu_down()) {
  263.           need_refresh = 1;
  264.           need_save = 1;
  265.         }
  266.       } else if (Pad.Newpress.Right) {
  267.         if (0 == reader_file_menu_up()) {
  268.           need_refresh = 1;
  269.           need_save = 1;
  270.         }
  271.       } else if (Pad.Newpress.A || Pad.Newpress.L) {
  272.         //read the file or go into the dir
  273.         if (0 == reader_file_current_item(name)) {
  274.           reader_text = get_reader_text(NULL, name);
  275.           user_state = READ_TEXT;
  276.           already_draw_left = 0;
  277.         } else {
  278.           reader_file_into_dir(name);
  279.         }
  280.         need_refresh = 1;
  281.         need_save = 1;
  282.       } else if (Pad.Newpress.B) {
  283.         if (0 == reader_file_upper_dir()) {
  284.           need_refresh = 1;
  285.           need_save = 1;
  286.         }
  287.       } else if (Pad.Newpress.Start) {
  288.         user_state = ABOUT_INFO;
  289.         magic_state = 0;
  290.         reader_about_hide_magic();
  291.         need_refresh = 1;
  292.       }
  293.       //the stylus in palib070615 works well!
  294.       else if (Stylus.Newpress) {       //touch screen to select file
  295.         int y = READER_SCREEN_HEIGHT - 1 - Stylus.X;
  296.         int top_lim = DEFAULT_FONT_SIZE + LINE_INTERVAL;
  297.         int bottom_lim = READER_SCREEN_HEIGHT - top_lim;
  298.         if (y < top_lim) {
  299.           //turn to perv page
  300.           if (0 == reader_file_menu_prev_page()) {
  301.             need_refresh = 1;
  302.             need_save = 1;
  303.           }
  304.         } else if (y >= top_lim && y < bottom_lim) {
  305.           int cur = reader_file_menu_map_cursor(y);
  306.           if (cur < 0) {
  307.             break;
  308.           }
  309.           if (cur != reader_file_menu_get_cursor()) {
  310.             reader_file_menu_set_cursor(cur);
  311.           } else {
  312.             //read the file or go into the dir
  313.             if (0 == reader_file_current_item(name)) {
  314.               reader_text = get_reader_text(NULL, name);
  315.               user_state = READ_TEXT;
  316.               already_draw_left = 0;
  317.             } else {
  318.               reader_file_into_dir(name);
  319.             }
  320.           }
  321.           need_refresh = 1;
  322.           need_save = 1;
  323.         } else {
  324.           //turn to next page
  325.           if (0 == reader_file_menu_next_page()) {
  326.             need_refresh = 1;
  327.             need_save = 1;
  328.           }
  329.         }
  330.       }
  331.       break;
  332.     case SELECT_COLOR:
  333.       if (Pad.Newpress.Up) {
  334.         if (0 == reader_color_dec()) {
  335.           need_refresh = 1;
  336.         }
  337.       } else if (Pad.Newpress.Down) {
  338.         if (0 == reader_color_inc()) {
  339.           need_refresh = 1;
  340.         }
  341.       } else if (Pad.Newpress.Left) {
  342.         if (0 == reader_color_cursor_down()) {
  343.           need_refresh = 1;
  344.         }
  345.       } else if (Pad.Newpress.Right) {
  346.         if (0 == reader_color_cursor_up()) {
  347.           need_refresh = 1;
  348.         }
  349.       } else if (Pad.Newpress.A) {
  350.         reader_color_set();
  351.         reader_save_color();
  352.         user_state = READ_TEXT;
  353.         already_draw_left = 0;
  354.         need_refresh = 1;
  355.       } else if (Pad.Newpress.B) {
  356.         reader_color_select_cancel();
  357.         user_state = READ_TEXT;
  358.         already_draw_left = 0;
  359.         need_refresh = 1;
  360.       } else if (Pad.Newpress.X) {
  361.         if (0 == reader_color_set_default()) {
  362.           need_refresh = 1;
  363.         }
  364.       }
  365.       //fast move when holding
  366.       else if (Pad.Held.Up) {
  367.         up_cnt++;
  368.         if (up_cnt > Start_TIME_FAST) {
  369.           if (0 == reader_color_dec()) {
  370.             need_refresh = 1;
  371.           }
  372.         }
  373.       } else if (Pad.Held.Down) {
  374.         down_cnt++;
  375.         if (down_cnt > Start_TIME_FAST) {
  376.           if (0 == reader_color_inc()) {
  377.             need_refresh = 1;
  378.           }
  379.         }
  380.       }
  381.       if (!Pad.Held.Up) {
  382.         up_cnt = 0;
  383.       }
  384.       if (!Pad.Held.Down) {
  385.         down_cnt = 0;
  386.       }
  387.       break;
  388.     case ABOUT_INFO:
  389.       if (Pad.Newpress.Start) {
  390.         user_state = SELECT_TEXT;
  391.         need_refresh = 1;
  392.       } else if (Pad.Newpress.X) {
  393.         //XXXY
  394.         if (magic_state < 3) {
  395.           magic_state++;
  396.         } else {
  397.           magic_state = 0;
  398.         }
  399.       } else if (Pad.Newpress.Y) {
  400.         if (magic_state == 3) {
  401.           reader_about_show_magic();
  402.           need_refresh = 1;
  403.         } else {
  404.           magic_state = 0;
  405.         }
  406.       } else if (Pad.Newpress.Anykey) {
  407.         magic_state = 0;
  408.       }
  409.       break;
  410.     case SHOW_TIME:
  411.       if (Pad.Newpress.Start) {
  412.         user_state = READ_TEXT;
  413.         already_draw_left = 0;
  414.         need_refresh = 1;
  415.       }
  416.       break;
  417.     case CONFIG_OPTION:
  418.       if (Pad.Newpress.Up) {
  419.         if (0 == reader_option_cursor_left()) {
  420.           need_refresh = 1;
  421.         }
  422.       } else if (Pad.Newpress.Down) {
  423.         if (0 == reader_option_cursor_right()) {
  424.           need_refresh = 1;
  425.         }
  426.       } else if (Pad.Newpress.Left) {
  427.         if (0 == reader_option_cursor_down()) {
  428.           need_refresh = 1;
  429.         }
  430.       } else if (Pad.Newpress.Right) {
  431.         if (0 == reader_option_cursor_up()) {
  432.           need_refresh = 1;
  433.         }
  434.       } else if (Pad.Newpress.A) {
  435.         reader_save_option();
  436.         user_state = READ_TEXT;
  437.         already_draw_left = 0;
  438.         need_refresh = 1;
  439.       } else if (Pad.Newpress.B) {
  440.         reader_option_select_cancel();
  441.         user_state = READ_TEXT;
  442.         already_draw_left = 0;
  443.         need_refresh = 1;
  444.       }
  445.       break;
  446.     case NO_TEXT:              //ignore all input
  447.       break;
  448.     }                           //switch (user_state)
  449.     //check status reset that triggered by user input
  450.     //check turn page timer defined in option
  451.     if (need_refresh && user_state == READ_TEXT
  452.         && reader_option_timer_enabled()) {
  453.       reader_option_turn_timer_reset();
  454.     } else if (need_refresh && user_state == SELECT_TEXT) {
  455.       //control rolling file name
  456.       reader_file_reset_name_cursor();
  457.     }
  458.     //check timer periodically
  459.     if (on_timer()) {
  460.       need_refresh = 1;
  461.     }
  462.     if (need_refresh) {
  463.       on_paint();
  464.     }
  465.     if (need_save) {
  466.       reader_wcsncpy(saver.uni_dir, reader_file_get_dir(), READER_PATH_MAX);
  467.       reader_wcsncpy(saver.uni_file, reader_get_current_file(), READER_FILENAME_MAX);
  468.       saver.state = user_state;
  469.       saver.info_visible = reader_info_visible();
  470.       saver.font_size = reader_get_font_size();
  471.       reader_save_scenario(&saver);
  472.     }
  473.     PA_WaitForVBL();
  474.   }                             //end while (1)
  475.   return 0;
  476. }
  477. static void show_reader_theme_pic(screen_t screen)
  478. {
  479.   unsigned short *bmpbuf = NULL;
  480.   if ((bmpbuf = reader_load_bmp(reader_path_theme_pic)) != NULL) {
  481.     fill_screen_bitmap(screen, bmpbuf);
  482.     trigger_screen_update(screen);
  483.   }
  484. }
  485. static void on_paint(void)
  486. {
  487.   switch (user_state) {
  488.   case READ_TEXT:
  489.     reader_save_page(reader_get_current_file(), reader_get_current_page());
  490.     reader_mmi_update_screen(TOP, reader_text, reader_get_current_page());
  491.     reader_mmi_update_screen(BOTTOM, reader_text,
  492.                              reader_get_current_page() + 1);
  493.     break;
  494.   case SELECT_TEXT:
  495.     if (!already_draw_left) {
  496.       show_reader_theme_pic(TOP);
  497.       already_draw_left = 1;
  498.     }
  499.     reader_file_draw_menu(BOTTOM);
  500.     break;
  501.   case SELECT_COLOR:
  502.     if (!already_draw_left) {
  503.       show_reader_theme_pic(TOP);
  504.       already_draw_left = 1;
  505.     }
  506.     reader_color_show_window(BOTTOM);
  507.     break;
  508.   case ABOUT_INFO:
  509.     reader_about_info(BOTTOM);
  510.     break;
  511.   case SHOW_TIME:
  512.     if (!already_draw_left) {
  513.       show_reader_theme_pic(TOP);
  514.       already_draw_left = 1;
  515.     }
  516.     reader_show_time_info(BOTTOM);
  517.     break;
  518.   case CONFIG_OPTION: {
  519.     unsigned short pic_name[READER_FILENAME_MAX];
  520.     unsigned short *bmpbuf;
  521.     if (reader_option_bg_pic_enabled()) {
  522.       reader_full_pic_name(pic_name, reader_option_bg_pic());
  523.       if ((bmpbuf = reader_load_bmp(pic_name)) != NULL) {
  524.         fill_screen_bitmap(TOP, bmpbuf);
  525.         trigger_screen_update(TOP);
  526.       } else {
  527.         show_reader_theme_pic(TOP);
  528.       }
  529.     } else {
  530.       show_reader_theme_pic(TOP);
  531.     }
  532.     reader_option_draw_menu(BOTTOM);
  533.                       }
  534.     break;
  535.   case NO_TEXT:
  536.     break;
  537.   }
  538. }
  539. static int on_timer(void)
  540. {
  541.   static reader_time_t old_tm;
  542.   reader_time_t tm = { 0 };
  543.   unsigned int e;
  544.   int show_time = (user_state == SHOW_TIME);
  545.   int ret = 0;
  546.   if ((e = reader_time_elapse()) > (unsigned int) (show_time ? 100 : 500)) {
  547.     //use a shorter interval to make it look precise,
  548.     //however, a rough timer is OK if no one looks at it
  549.     reader_time_reset();
  550.     if (user_state == READ_TEXT && reader_option_timer_enabled()) {
  551.       if (reader_option_turn_timer_check(e)) {
  552.         reader_option_turn_timer_reset();
  553.         if (0 == reader_turn_next_page()) {
  554.           ret = 1;
  555.         }
  556.       }
  557.     } else if (user_state == SELECT_TEXT && reader_file_rolling_name()) {
  558.       reader_file_move_name(1);
  559.       ret = 1;
  560.     }
  561.     //refresh time stat.
  562.     reader_time_get(&tm);
  563.     if (memcmp(&old_tm, &tm, sizeof(tm)) != 0) {
  564.       old_tm = tm;
  565.       reader_time_inc(1);
  566.       if (show_time) {
  567.         //time changed, refresh time info
  568.         reader_set_time_info(&tm);
  569.         ret = 1;
  570.       }
  571.     }
  572.   }
  573.   return ret;
  574. }
  575. static unsigned short *get_reader_text(unsigned short *dirname, unsigned short *filename)
  576. {
  577.   int ret = reader_init(dirname, filename);
  578.   unsigned short *p;
  579.   static unsigned short buf[32];
  580.   int n;
  581.   switch (ret) {
  582.   case 0:
  583.     return reader_get_current_content(NULL);
  584.   case ERR_OPEN_FILE:
  585.     p = READER_STR(err_msg_file_cant_open);
  586.     n = reader_wcslen(p);
  587.     reader_wcsncpy(buf, p, n);
  588.     buf[n] = 'n';
  589.     reader_itoa((errno<0 ? -errno : errno), &buf[n+1]);
  590.     reader_init_content(buf, reader_wcslen(buf));
  591.     return buf;
  592.   case ERR_FILE_FORMAT:
  593.     p = READER_STR(err_msg_file_format);
  594.     reader_init_content(p, reader_wcslen(p));
  595.     return p;
  596.   }
  597.   //should not reach here
  598.   assert(0);
  599.   return NULL;
  600. }