frontend: nub-as-btn option + gamepad fix
[pcsx_rearmed.git] / frontend / menu.c
index a7aa8b2..546125f 100644 (file)
 #include "plugin.h"
 #include "plugin_lib.h"
 #include "omap.h"
+#include "pandora.h"
 #include "pcnt.h"
+#include "arm_utils.h"
 #include "common/plat.h"
+#include "common/input.h"
+#include "linux/in_evdev.h"
 #include "../libpcsxcore/misc.h"
 #include "../libpcsxcore/cdrom.h"
 #include "../libpcsxcore/psemu_plugin_defs.h"
+#include "../libpcsxcore/new_dynarec/new_dynarec.h"
 #include "../plugins/dfinput/pad.h"
 #include "revision.h"
 
@@ -134,12 +139,18 @@ static int emu_save_load_game(int load, int unused)
 // propagate menu settings to the emu vars
 static void menu_sync_config(void)
 {
+       static int allow_abs_only_old;
+
        Config.PsxAuto = 1;
        if (region > 0) {
                Config.PsxAuto = 0;
                Config.PsxType = region - 1;
        }
        in_type = in_type_sel ? PSE_PAD_TYPE_ANALOGPAD : PSE_PAD_TYPE_STANDARD;
+       if (in_evdev_allow_abs_only != allow_abs_only_old) {
+               pandora_rescan_inputs();
+               allow_abs_only_old = in_evdev_allow_abs_only;
+       }
 
        pl_frame_interval = Config.PsxType ? 20000 : 16667;
        // used by P.E.Op.S. frameskip code
@@ -154,6 +165,7 @@ static void menu_set_defconfig(void)
 
        region = 0;
        in_type_sel = 0;
+       in_evdev_allow_abs_only = 0;
        Config.Xa = Config.Cdda = Config.Sio =
        Config.SpuIrq = Config.RCntFix = Config.VSyncWA = 0;
 
@@ -225,6 +237,7 @@ static const struct {
        CE_INTVAL_V(iSPUIRQWait, 2),
        CE_INTVAL(iUseTimer),
        CE_INTVAL(warned_about_bios),
+       CE_INTVAL(in_evdev_allow_abs_only),
 };
 
 static char *get_cd_label(void)
@@ -442,7 +455,6 @@ static void draw_savestate_bg(int slot);
 // a bit of black magic here
 static void draw_savestate_bg(int slot)
 {
-       extern void bgr555_to_rgb565(void *dst, void *src, int bytes);
        static const int psx_widths[8]  = { 256, 368, 320, 384, 512, 512, 640, 640 };
        int x, y, w, h;
        char fname[MAXPATHLEN];
@@ -666,6 +678,7 @@ me_bind_action emuctrl_actions[] =
        { "Prev Save Slot   ", 1 << SACTION_PREV_SSLOT },
        { "Next Save Slot   ", 1 << SACTION_NEXT_SSLOT },
        { "Toggle Frameskip ", 1 << SACTION_TOGGLE_FSKIP },
+       { "Take Screenshot  ", 1 << SACTION_SCREENSHOT },
        { "Enter Menu       ", 1 << SACTION_ENTER_MENU },
        { NULL,                0 }
 };
@@ -839,6 +852,7 @@ static void keys_load_all(const char *cfg)
                                lprintf("config: unhandled action \"%s\"\n", act);
                }
        }
+       in_clean_binds();
 }
 
 static int key_config_loop_wrap(int id, int keys)
@@ -892,7 +906,17 @@ static int mh_savecfg(int id, int keys)
        return 1;
 }
 
+static int mh_input_rescan(int id, int keys)
+{
+       //menu_sync_config();
+       pandora_rescan_inputs();
+       me_update_msg("rescan complete.");
+
+       return 0;
+}
+
 static const char *men_in_type_sel[] = { "Standard (SCPH-1080)", "Analog (SCPH-1150)", NULL };
+static const char h_nub_btns[] = "Experimental, keep this OFF if unsure. Select rescan after change.";
 
 static menu_entry e_menu_keyconfig[] =
 {
@@ -901,8 +925,10 @@ static menu_entry e_menu_keyconfig[] =
        mee_handler_id("Emulator controls", MA_CTRL_EMU,        key_config_loop_wrap),
        mee_label     (""),
        mee_enum      ("Controller",        0, in_type_sel,     men_in_type_sel),
+       mee_onoff_h   ("Nubs as buttons",   0, in_evdev_allow_abs_only, 1, h_nub_btns),
        mee_cust_nosave("Save global config",       MA_OPT_SAVECFG,      mh_savecfg, mgn_saveloadcfg),
        mee_cust_nosave("Save cfg for loaded game", MA_OPT_SAVECFG_GAME, mh_savecfg, mgn_saveloadcfg),
+       mee_handler   ("Rescan devices",  mh_input_rescan),
        mee_label     (""),
        mee_label     ("Input devices:"),
        mee_label_mk  (MA_CTRL_DEV_FIRST, mgn_dev_name),
@@ -1142,12 +1168,13 @@ static const char h_confirm_save[]    = "Ask for confirmation when overwriting s
 */
 static const char h_restore_def[]     = "Switches back to default / recommended\n"
                                        "configuration";
+static const char h_frameskip[]       = "Warning: frameskip sometimes causes glitches\n";
 
 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_onoff     ("Frameskip",                0, UseFrameSkip, 1),
+       mee_onoff_h   ("Frameskip",                0, UseFrameSkip, 1, h_frameskip),
        mee_onoff     ("Show FPS",                 0, g_opts, OPT_SHOWFPS),
        mee_enum      ("Region",                   0, region, men_region),
        mee_range     ("CPU clock",                MA_OPT_CPU_CLOCKS, cpu_clock, 20, 5000),
@@ -1176,26 +1203,51 @@ static int menu_loop_options(int id, int keys)
 
 // ------------ debug menu ------------
 
-static void draw_frame_debug(void)
+static void draw_frame_debug(GPUFreeze_t *gpuf)
 {
+       int w = min(g_menuscreen_w, 1024);
+       int h = min(g_menuscreen_h, 512);
+       u16 *d = g_menuscreen_ptr;
+       u16 *s = (u16 *)gpuf->psxVRam;
+       char buff[64];
+       int ty = 1;
+
+       gpuf->ulFreezeVersion = 1;
+       if (GPU_freeze != NULL)
+               GPU_freeze(1, gpuf);
+
+       for (; h > 0; h--, d += g_menuscreen_w, s += 1024)
+               bgr555_to_rgb565(d, s, w * 2);
+
        smalltext_out16(4, 1, "build: "__DATE__ " " __TIME__ " " REV, 0xe7fc);
+       snprintf(buff, sizeof(buff), "GPU sr: %08x", gpuf->ulStatus);
+       smalltext_out16(4, (ty += me_sfont_h), buff, 0xe7fc);
+       snprintf(buff, sizeof(buff), "PC/SP: %08x %08x", psxRegs.pc, psxRegs.GPR.n.sp);
+       smalltext_out16(4, (ty += me_sfont_h), buff, 0xe7fc);
 }
 
 static void debug_menu_loop(void)
 {
+       GPUFreeze_t *gpuf;
        int inp;
 
+       gpuf = malloc(sizeof(*gpuf));
+       if (gpuf == NULL)
+               return;
+
        while (1)
        {
-               menu_draw_begin(1);
-               draw_frame_debug();
+               menu_draw_begin(0);
+               draw_frame_debug(gpuf);
                menu_draw_end();
 
                inp = in_menu_wait(PBTN_MOK|PBTN_MBACK|PBTN_MA2|PBTN_MA3|PBTN_L|PBTN_R |
                                        PBTN_UP|PBTN_DOWN|PBTN_LEFT|PBTN_RIGHT, 70);
                if (inp & PBTN_MBACK)
-                       return;
+                       break;
        }
+
+       free(gpuf);
 }
 
 // ------------ main menu ------------
@@ -1216,9 +1268,7 @@ static void menu_bios_warn(void)
 
        while (1)
        {
-               menu_draw_begin(1);
                draw_menu_message(msg, NULL);
-               menu_draw_end();
 
                inp = in_menu_wait(PBTN_MOK|PBTN_MBACK, 70);
                if (inp & (PBTN_MBACK|PBTN_MOK))
@@ -1349,6 +1399,8 @@ static int romsel_run(void)
 
        printf("selected file: %s\n", fname);
 
+       new_dynarec_clear_full();
+
        if (run_cd_image(fname) != 0)
                return -1;