menu: implement savestates and scaling cfg
authornotaz <notasas@gmail.com>
Sat, 11 Dec 2010 23:40:19 +0000 (01:40 +0200)
committernotaz <notasas@gmail.com>
Tue, 14 Dec 2010 13:25:05 +0000 (15:25 +0200)
.gitignore
Makefile
frontend/common/menu.c
frontend/main.c
frontend/menu.c
frontend/menu.h [new file with mode: 0644]
frontend/plat_dummy.c
frontend/plugin_lib.c

index 694e02c..489387f 100644 (file)
@@ -1,4 +1,5 @@
 *.o
+frontend/revision.h
 frontend/linux
 frontend/common
 frontend/X11
index 7f4d21b..69c4f5e 100644 (file)
--- a/Makefile
+++ b/Makefile
@@ -69,6 +69,14 @@ ifdef PCNT
 CFLAGS += -DPCNT
 endif
 frontend/%.o: CFLAGS += -Wall -DIN_EVDEV
+frontend/menu.o: frontend/revision.h
+
+frontend/revision.h: FORCE
+       @(git describe || echo) | sed -e 's/.*/#define REV "\0"/' > $@_
+       @diff -q $@_ $@ > /dev/null 2>&1 || cp $@_ $@
+       @rm $@_
+.PHONY: FORCE
+
 
 $(TARGET): $(OBJS)
        $(CC) -o $@ $^ $(LDFLAGS) -Wl,-Map=$@.map
index 1cb41c5..5f97730 100644 (file)
@@ -652,7 +652,7 @@ static void me_loop(menu_entry *menu, int *menu_sel, void (*draw_more)(void))
 \r
 /* ***************************************** */\r
 \r
-static void draw_menu_credits(void)\r
+static void draw_menu_credits(void (*draw_more)(void))\r
 {\r
        const char *creds, *p;\r
        int x, y, h, w, wt;\r
@@ -686,6 +686,9 @@ static void draw_menu_credits(void)
                        p++;\r
        }\r
 \r
+       if (draw_more != NULL)\r
+               draw_more();\r
+\r
        menu_draw_end();\r
 }\r
 \r
index bbcd7e4..b05893c 100644 (file)
@@ -15,9 +15,9 @@
 
 #include "plugin.h"
 #include "pcnt.h"
+#include "menu.h"
 #include "../gui/Linux.h"
 #include "../libpcsxcore/misc.h"
-#include "common/menu.h"
 #include "common/plat.h"
 #include "common/input.h"
 
@@ -234,7 +234,9 @@ int main(int argc, char *argv[])
                free(state_filename);
        }
 
-       if (!ready_to_go)
+       if (ready_to_go)
+               menu_prepare_emu();
+       else
                menu_loop();
 
        while (1)
index 4291ac5..cae99a3 100644 (file)
 
 #include <stdio.h>
 #include <string.h>
+#include <errno.h>
 
+#include "menu.h"
 #include "config.h"
 #include "plugin_lib.h"
 #include "omap.h"
 #include "common/plat.h"
+#include "../gui/Linux.h"
 #include "../libpcsxcore/misc.h"
 #include "../libpcsxcore/new_dynarec/new_dynarec.h"
+#include "revision.h"
 
 #define MENU_X2 1
 #define array_size(x) (sizeof(x) / sizeof(x[0]))
@@ -41,10 +45,19 @@ typedef enum
        MA_OPT_SAVECFG,
        MA_OPT_SAVECFG_GAME,
        MA_OPT_CPU_CLOCKS,
+       MA_OPT_FILTERING,
 } menu_id;
 
-extern int ready_to_go;
+enum {
+       SCALE_1_1,
+       SCALE_4_3,
+       SCALE_FULLSCREEN,
+       SCALE_CUSTOM,
+};
 
+extern int ready_to_go;
+static int game_config_loaded, last_psx_w, last_psx_h;
+static int scaling, filter, state_slot, cpu_clock;
 static int dummy, state_slot;
 static char rom_fname_reload[MAXPATHLEN];
 static char last_selected_fname[MAXPATHLEN];
@@ -63,27 +76,167 @@ void emu_make_path(char *buff, const char *end, int size)
 
 static int emu_check_save_file(int slot)
 {
-       return 0;
+       char *fname;
+       int ret;
+
+       fname = get_state_filename(slot);
+       if (fname == NULL)
+               return 0;
+
+       ret = CheckState(fname);
+       free(fname);
+       return ret == 0 ? 1 : 0;
 }
 
 static int emu_save_load_game(int load, int sram)
 {
-       return 0;
+       char *fname;
+       int ret;
+
+       fname = get_state_filename(state_slot);
+       if (fname == NULL)
+               return 0;
+
+       if (load)
+               ret = LoadState(fname);
+       else
+               ret = SaveState(fname);
+       free(fname);
+
+       return ret;
 }
 
-static int emu_write_config(int is_game)
+static void draw_savestate_bg(int slot)
 {
-       return 0;
 }
 
-static void emu_set_defconfig(void)
+static void menu_set_defconfig(void)
+{
+       scaling = SCALE_4_3;
+}
+
+static int menu_write_config(int is_game)
+{
+       return -1;
+}
+
+static int menu_load_config(int is_game)
 {
+       return 0;
 }
 
+#define menu_init menu_init_common
 #include "common/menu.c"
+#undef menu_init
 
-static void draw_savestate_bg(int slot)
+// ---------- pandora specific -----------
+
+static const char pnd_script_base[] = "sudo -n /usr/pandora/scripts";
+static char **pnd_filter_list;
+
+static int get_cpu_clock(void)
 {
+       FILE *f;
+       int ret = 0;
+       f = fopen("/proc/pandora/cpu_mhz_max", "r");
+       if (f) {
+               fscanf(f, "%d", &ret);
+               fclose(f);
+       }
+       return ret;
+}
+
+static void apply_cpu_clock(void)
+{
+       char buf[128];
+
+       if (cpu_clock != 0 && cpu_clock != get_cpu_clock()) {
+               snprintf(buf, sizeof(buf), "unset DISPLAY; echo y | %s/op_cpuspeed.sh %d",
+                        pnd_script_base, cpu_clock);
+               system(buf);
+       }
+}
+
+static void apply_filter(int which)
+{
+       char buf[128];
+       int i;
+
+       if (pnd_filter_list == NULL)
+               return;
+
+       for (i = 0; i < which; i++)
+               if (pnd_filter_list[i] == NULL)
+                       return;
+
+       if (pnd_filter_list[i] == NULL)
+               return;
+
+       snprintf(buf, sizeof(buf), "%s/op_videofir.sh %s", pnd_script_base, pnd_filter_list[i]);
+       system(buf);
+}
+
+static menu_entry e_menu_gfx_options[];
+
+static void pnd_menu_init(void)
+{
+       struct dirent *ent;
+       int i, count = 0;
+       char **mfilters;
+       char buff[64], *p;
+       DIR *dir;
+
+       cpu_clock = get_cpu_clock();
+
+       dir = opendir("/etc/pandora/conf/dss_fir");
+       if (dir == NULL) {
+               perror("filter opendir");
+               return;
+       }
+
+       while (1) {
+               errno = 0;
+               ent = readdir(dir);
+               if (ent == NULL) {
+                       if (errno != 0)
+                               perror("readdir");
+                       break;
+               }
+               p = strstr(ent->d_name, "_up");
+               if (p != NULL && (p[3] == 0 || !strcmp(p + 3, "_h")))
+                       count++;
+       }
+
+       if (count == 0)
+               return;
+
+       mfilters = calloc(count + 1, sizeof(mfilters[0]));
+       if (mfilters == NULL)
+               return;
+
+       rewinddir(dir);
+       for (i = 0; (ent = readdir(dir)); ) {
+               size_t len;
+
+               p = strstr(ent->d_name, "_up");
+               if (p == NULL || (p[3] != 0 && strcmp(p + 3, "_h")))
+                       continue;
+
+               len = p - ent->d_name;
+               if (len > sizeof(buff) - 1)
+                       continue;
+
+               strncpy(buff, ent->d_name, len);
+               buff[len] = 0;
+               mfilters[i] = strdup(buff);
+               if (mfilters[i] != NULL)
+                       i++;
+       }
+       closedir(dir);
+
+       i = me_id2offset(e_menu_gfx_options, MA_OPT_FILTERING);
+       e_menu_gfx_options[i].data = (void *)mfilters;
+       pnd_filter_list = mfilters;
 }
 
 // -------------- key config --------------
@@ -163,7 +316,7 @@ static int mh_saveloadcfg(int id, int keys)
        switch (id) {
        case MA_OPT_SAVECFG:
        case MA_OPT_SAVECFG_GAME:
-               if (emu_write_config(id == MA_OPT_SAVECFG_GAME ? 1 : 0))
+               if (menu_write_config(id == MA_OPT_SAVECFG_GAME ? 1 : 0) == 0)
                        me_update_msg("config saved");
                else
                        me_update_msg("failed to write config");
@@ -220,8 +373,67 @@ static int menu_loop_adv_options(int id, int keys)
 
 // ------------ gfx options menu ------------
 
+static const char *men_scaler[] = { "1x1", "scaled 4:3", "fullscreen", "custom", NULL };
+static const char h_cscaler[]   = "Displays the scaler layer, you can resize it\n"
+                                 "using d-pad or move it using R+d-pad";
+static const char *men_dummy[] = { NULL };
+
+static int menu_loop_cscaler(int id, int keys)
+{
+       unsigned int inp;
+
+       scaling = SCALE_CUSTOM;
+
+       omap_enable_layer(1);
+       //pnd_restore_layer_data();
+
+       for (;;)
+       {
+               menu_draw_begin(0);
+               memset(g_menuscreen_ptr, 0, g_menuscreen_w * g_menuscreen_h * 2);
+               text_out16(2, 480 - 18, "%dx%d | d-pad to resize, R+d-pad to move", g_layer_w, g_layer_h);
+               menu_draw_end();
+
+               inp = in_menu_wait(PBTN_UP|PBTN_DOWN|PBTN_LEFT|PBTN_RIGHT|PBTN_R|PBTN_MOK|PBTN_MBACK, 40);
+               if (inp & PBTN_UP)    g_layer_y--;
+               if (inp & PBTN_DOWN)  g_layer_y++;
+               if (inp & PBTN_LEFT)  g_layer_x--;
+               if (inp & PBTN_RIGHT) g_layer_x++;
+               if (!(inp & PBTN_R)) {
+                       if (inp & PBTN_UP)    g_layer_h += 2;
+                       if (inp & PBTN_DOWN)  g_layer_h -= 2;
+                       if (inp & PBTN_LEFT)  g_layer_w += 2;
+                       if (inp & PBTN_RIGHT) g_layer_w -= 2;
+               }
+               if (inp & (PBTN_MOK|PBTN_MBACK))
+                       break;
+
+               if (inp & (PBTN_UP|PBTN_DOWN|PBTN_LEFT|PBTN_RIGHT)) {
+                       if (g_layer_x < 0)   g_layer_x = 0;
+                       if (g_layer_x > 640) g_layer_x = 640;
+                       if (g_layer_y < 0)   g_layer_y = 0;
+                       if (g_layer_y > 420) g_layer_y = 420;
+                       if (g_layer_w < 160) g_layer_w = 160;
+                       if (g_layer_h < 60)  g_layer_h = 60;
+                       if (g_layer_x + g_layer_w > 800)
+                               g_layer_w = 800 - g_layer_x;
+                       if (g_layer_y + g_layer_h > 480)
+                               g_layer_h = 480 - g_layer_y;
+                       omap_enable_layer(1);
+               }
+       }
+
+       omap_enable_layer(0);
+
+       return 0;
+}
+
 static menu_entry e_menu_gfx_options[] =
 {
+       mee_enum      ("Scaler",                   0, scaling, men_scaler),
+       mee_enum      ("Filter",                   MA_OPT_FILTERING, filter, men_dummy),
+//     mee_onoff     ("Vsync",                    0, vsync, 1),
+       mee_cust_h    ("Setup custom scaler",      0, menu_loop_cscaler, NULL, h_cscaler),
        mee_end,
 };
 
@@ -236,11 +448,9 @@ static int menu_loop_gfx_options(int id, int keys)
 
 // ------------ options menu ------------
 
-static menu_entry e_menu_options[];
-
 static int mh_restore_defaults(int id, int keys)
 {
-       emu_set_defconfig();
+       menu_set_defconfig();
        me_update_msg("defaults restored");
        return 1;
 }
@@ -253,7 +463,7 @@ static menu_entry e_menu_options[] =
 {
        mee_range     ("Save slot",                0, state_slot, 0, 9),
        mee_enum_h    ("Confirm savestate",        0, dummy, men_confirm_save, h_confirm_save),
-       mee_range     ("",                         MA_OPT_CPU_CLOCKS, dummy, 20, 5000),
+       mee_range     ("CPU clock",                MA_OPT_CPU_CLOCKS, cpu_clock, 20, 5000),
        mee_handler   ("[Display]",                menu_loop_gfx_options),
        mee_handler   ("[Advanced]",               menu_loop_adv_options),
        mee_cust_nosave("Save global config",      MA_OPT_SAVECFG,      mh_saveloadcfg, mgn_saveloadcfg),
@@ -268,7 +478,7 @@ static int menu_loop_options(int id, int keys)
        int i;
 
        i = me_id2offset(e_menu_options, MA_OPT_CPU_CLOCKS);
-       e_menu_options[i].enabled = e_menu_options[i].name[0] ? 1 : 0;
+       e_menu_options[i].enabled = cpu_clock != 0 ? 1 : 0;
        me_enable(e_menu_options, MA_OPT_SAVECFG_GAME, ready_to_go);
 
        me_loop(e_menu_options, &sel, NULL);
@@ -278,15 +488,9 @@ static int menu_loop_options(int id, int keys)
 
 // ------------ debug menu ------------
 
-#ifdef __GNUC__
-#define COMPILER "gcc " __VERSION__
-#else
-#define COMPILER
-#endif
-
 static void draw_frame_debug(void)
 {
-       smalltext_out16(4, 1, "build: "__DATE__ " " __TIME__ " " COMPILER, 0xffff);
+       smalltext_out16(4, 1, "build: "__DATE__ " " __TIME__ " " REV, 0xe7fc);
 }
 
 static void debug_menu_loop(void)
@@ -355,6 +559,7 @@ static char *romsel_run(void)
                return NULL;
        }
 
+       game_config_loaded = 0;
        ready_to_go = 1;
        return ret;
 }
@@ -366,6 +571,8 @@ static int main_menu_handler(int id, int keys)
        switch (id)
        {
        case MA_MAIN_RESUME_GAME:
+               if (ready_to_go)
+                       return 1;
                break;
        case MA_MAIN_SAVE_STATE:
                if (ready_to_go)
@@ -376,6 +583,14 @@ static int main_menu_handler(int id, int keys)
                        return menu_loop_savestate(1);
                break;
        case MA_MAIN_RESET_GAME:
+               if (ready_to_go) {
+                       OpenPlugins();
+                       SysReset();
+                       if (CheckCdrom() != -1) {
+                               LoadCdrom();
+                       }
+                       return 1;
+               }
                break;
        case MA_MAIN_LOAD_ROM:
                ret_name = romsel_run();
@@ -383,7 +598,7 @@ static int main_menu_handler(int id, int keys)
                        return 1;
                break;
        case MA_MAIN_CREDITS:
-               draw_menu_credits();
+               draw_menu_credits(draw_frame_debug);
                in_menu_wait(PBTN_MOK|PBTN_MBACK, 70);
                break;
        case MA_MAIN_EXIT:
@@ -412,6 +627,8 @@ static menu_entry e_menu_main[] =
        mee_end,
 };
 
+// ----------------------------
+
 void menu_loop(void)
 {
        static int sel = 0;
@@ -428,7 +645,7 @@ strcpy(last_selected_fname, "/mnt/ntz/stuff/psx");
        in_set_config_int(0, IN_CFG_BLOCKING, 1);
 
        do {
-               me_loop(e_menu_main, &sel, NULL);
+               me_loop(e_menu_main, &sel, draw_frame_debug);
        } while (!ready_to_go);
 
        /* wait until menu, ok, back is released */
@@ -439,7 +656,56 @@ strcpy(last_selected_fname, "/mnt/ntz/stuff/psx");
 
        memset(g_menuscreen_ptr, 0, g_menuscreen_w * g_menuscreen_h * 2);
        menu_draw_end();
+       menu_prepare_emu();
+}
+
+void menu_init(void)
+{
+       menu_set_defconfig();
+       menu_load_config(0);
+       menu_init_common();
+       pnd_menu_init();
+       last_psx_w = 320;
+       last_psx_h = 240;
+}
+
+void menu_notify_mode_change(int w, int h)
+{
+       last_psx_w = w;
+       last_psx_h = h;
+
+       if (scaling == SCALE_1_1) {
+               g_layer_x = 800/2 - w/2;  g_layer_y = 480/2 - h/2;
+               g_layer_w = w; g_layer_h = h;
+               omap_enable_layer(1);
+       }
+}
+
+void menu_prepare_emu(void)
+{
+       if (!game_config_loaded) {
+               menu_load_config(1);
+               game_config_loaded = 1;
+       }
+
+       switch (scaling) {
+       case SCALE_1_1:
+               menu_notify_mode_change(last_psx_w, last_psx_h);
+               break;
+       case SCALE_4_3:
+               g_layer_x = 80;  g_layer_y = 0;
+               g_layer_w = 640; g_layer_h = 480;
+               break;
+       case SCALE_FULLSCREEN:
+               g_layer_x = 0;   g_layer_y = 0;
+               g_layer_w = 800; g_layer_h = 480;
+               break;
+       case SCALE_CUSTOM:
+               break;
+       }
        omap_enable_layer(1);
+       apply_filter(filter);
+       apply_cpu_clock();
        stop = 0;
 }
 
diff --git a/frontend/menu.h b/frontend/menu.h
new file mode 100644 (file)
index 0000000..67beef2
--- /dev/null
@@ -0,0 +1,5 @@
+void menu_init(void);
+void menu_prepare_emu(void);
+void menu_loop(void);
+
+void menu_notify_mode_change(int w, int h);
index b209f4f..c6af46b 100644 (file)
@@ -9,6 +9,7 @@
 #include "linux/fbdev.h"
 
 struct vout_fbdev *layer_fb;
+int g_layer_x, g_layer_y, g_layer_w, g_layer_h;
 struct in_default_bind in_evdev_defbinds[] = {
        { 0, 0, 0 },
 };
index 26d5218..7110b35 100644 (file)
@@ -20,6 +20,7 @@
 #include "common/fonts.h"
 #include "common/input.h"
 #include "omap.h"
+#include "menu.h"
 #include "pcnt.h"
 #include "../libpcsxcore/new_dynarec/new_dynarec.h"
 
@@ -85,6 +86,8 @@ int pl_fbdev_set_mode(int w, int h, int bpp)
        else
                pl_fbdev_buf = ret;
 
+       menu_notify_mode_change(w, h);
+
        return (ret != NULL) ? 0 : -1;
 }