CStickBindGroup(Bitu _stick) : CBindGroup (){
		stick=_stick;
		sprintf(configname,"stick_%d",stick);
		sdl_joystick=SDL_JoystickOpen(stick);
		assert(sdl_joystick);
		axes=SDL_JoystickNumAxes(sdl_joystick);
		buttons=SDL_JoystickNumButtons(sdl_joystick);
		hats=SDL_JoystickNumHats(sdl_joystick);
		pos_axis_lists=new CBindList[axes];
		neg_axis_lists=new CBindList[axes];
		button_lists=new CBindList[buttons];
		hat_lists=new CBindList[hats];
#if OLD_JOYSTICK
		LOG_MSG("Using joystick %s with %d axes and %d buttons",SDL_JoystickName(stick),axes,buttons);
		//if the first stick is set, we must be the second
		emustick=JOYSTICK_IsEnabled(0);
		JOYSTICK_Enable(emustick,true);
#endif	   
	}
	C4AxisBindGroup(Bitu _stick) : CStickBindGroup (_stick){
#if OLD_JOYSTICK
		JOYSTICK_Enable(1,true);
#endif	   
	}
Ejemplo n.º 3
0
void MAPPER_Init()
{

    struct retro_keyboard_callback callback = { keyboard_event };
    environ_cb(RETRO_ENVIRONMENT_SET_KEYBOARD_CALLBACK, &callback);

    inputList.clear();

    inputList.push_back(new MouseButton(RDID(MOUSE_LEFT), 0));
    inputList.push_back(new MouseButton(RDID(MOUSE_RIGHT), 1));

    struct retro_input_descriptor desc[64];
    joytype=JOY_AUTO;
    if(connected[0] && connected[1])
    {
        joytype = JOY_2AXIS;
        joystick_type[0] = JOY_2AXIS;
        joystick_type[1] = JOY_2AXIS;
    }
    else
    {
        if(connected[0])
        {
            joytype = joystick_type[0];
            joystick_type[1] = JOY_NONE;
        }
        else
           joystick_type[0] = JOY_NONE;

        if(connected[1])
        {
            joytype = joystick_type[1];
            joystick_type[0] = JOY_NONE;
        }
        else
           joystick_type[1] = JOY_NONE;

    }

    struct retro_input_descriptor desc_dpad[] = {
        { 0, RETRO_DEVICE_JOYPAD, 0, RETRO_DEVICE_ID_JOYPAD_LEFT, "D-Pad Left" },
        { 0, RETRO_DEVICE_JOYPAD, 0, RETRO_DEVICE_ID_JOYPAD_UP, "D-Pad Up" },
        { 0, RETRO_DEVICE_JOYPAD, 0, RETRO_DEVICE_ID_JOYPAD_DOWN, "D-Pad Down" },
        { 0, RETRO_DEVICE_JOYPAD, 0, RETRO_DEVICE_ID_JOYPAD_RIGHT, "D-Pad Right" },
        { 1, RETRO_DEVICE_JOYPAD, 0, RETRO_DEVICE_ID_JOYPAD_LEFT, "D-Pad Left" },
        { 1, RETRO_DEVICE_JOYPAD, 0, RETRO_DEVICE_ID_JOYPAD_UP, "D-Pad Up" },
        { 1, RETRO_DEVICE_JOYPAD, 0, RETRO_DEVICE_ID_JOYPAD_DOWN, "D-Pad Down" },
        { 1, RETRO_DEVICE_JOYPAD, 0, RETRO_DEVICE_ID_JOYPAD_RIGHT, "D-Pad Right" },
        { 255, 255, 255, 255, "" },
    };

    struct retro_input_descriptor desc_2axis[] = {
        { 0, RETRO_DEVICE_ANALOG, RETRO_DEVICE_INDEX_ANALOG_LEFT, RETRO_DEVICE_ID_ANALOG_X, "Analog X" },
        { 0, RETRO_DEVICE_ANALOG, RETRO_DEVICE_INDEX_ANALOG_LEFT, RETRO_DEVICE_ID_ANALOG_Y, "Analog Y" },
        { 1, RETRO_DEVICE_ANALOG, RETRO_DEVICE_INDEX_ANALOG_LEFT, RETRO_DEVICE_ID_ANALOG_X, "Analog X" },
        { 1, RETRO_DEVICE_ANALOG, RETRO_DEVICE_INDEX_ANALOG_LEFT, RETRO_DEVICE_ID_ANALOG_Y, "Analog Y" },
        { 255, 255, 255, 255, "" },

    };

    struct retro_input_descriptor desc_4axis[] = {
        { 0, RETRO_DEVICE_ANALOG, RETRO_DEVICE_INDEX_ANALOG_LEFT, RETRO_DEVICE_ID_ANALOG_X, "Left Analog X" },
        { 0, RETRO_DEVICE_ANALOG, RETRO_DEVICE_INDEX_ANALOG_LEFT, RETRO_DEVICE_ID_ANALOG_Y, "Left Analog Y" },
        { 0, RETRO_DEVICE_ANALOG, RETRO_DEVICE_INDEX_ANALOG_RIGHT, RETRO_DEVICE_ID_ANALOG_X, "Right Analog X" },
        { 0, RETRO_DEVICE_ANALOG, RETRO_DEVICE_INDEX_ANALOG_RIGHT, RETRO_DEVICE_ID_ANALOG_Y, "Right Analog Y" },
        { 1, RETRO_DEVICE_ANALOG, RETRO_DEVICE_INDEX_ANALOG_LEFT, RETRO_DEVICE_ID_ANALOG_X, "Left Analog X" },
        { 1, RETRO_DEVICE_ANALOG, RETRO_DEVICE_INDEX_ANALOG_LEFT, RETRO_DEVICE_ID_ANALOG_Y, "Left Analog Y" },
        { 1, RETRO_DEVICE_ANALOG, RETRO_DEVICE_INDEX_ANALOG_RIGHT, RETRO_DEVICE_ID_ANALOG_X, "Right Analog X" },
        { 1, RETRO_DEVICE_ANALOG, RETRO_DEVICE_INDEX_ANALOG_RIGHT, RETRO_DEVICE_ID_ANALOG_Y, "Right Analog Y" },
        { 255, 255, 255, 255, "" },

    };

    struct retro_input_descriptor desc_kbd[] = {
        { 0, RETRO_DEVICE_JOYPAD, 0, RETRO_DEVICE_ID_JOYPAD_LEFT, "Kbd Left" },
        { 0, RETRO_DEVICE_JOYPAD, 0, RETRO_DEVICE_ID_JOYPAD_UP, "Kbd Up" },
        { 0, RETRO_DEVICE_JOYPAD, 0, RETRO_DEVICE_ID_JOYPAD_DOWN, "Kbd Down" },
        { 0, RETRO_DEVICE_JOYPAD, 0, RETRO_DEVICE_ID_JOYPAD_RIGHT, "Kbd Right" },
        { 0, RETRO_DEVICE_JOYPAD, 0, RETRO_DEVICE_ID_JOYPAD_START, "Enter" },
        { 0, RETRO_DEVICE_JOYPAD, 0, RETRO_DEVICE_ID_JOYPAD_SELECT, "Esc" },
        { 255, 255, 255, 255, "" },
    };

    struct retro_input_descriptor desc_2button[] = {
        { 0, RETRO_DEVICE_JOYPAD, 0, RETRO_DEVICE_ID_JOYPAD_B, "Button 2" },
        { 0, RETRO_DEVICE_JOYPAD, 0, RETRO_DEVICE_ID_JOYPAD_Y, "Button 1" },
        { 0, RETRO_DEVICE_JOYPAD, 0, RETRO_DEVICE_ID_JOYPAD_START, "Enter" },
        { 0, RETRO_DEVICE_JOYPAD, 0, RETRO_DEVICE_ID_JOYPAD_SELECT, "Esc" },
        { 1, RETRO_DEVICE_JOYPAD, 0, RETRO_DEVICE_ID_JOYPAD_B, "Button 2" },
        { 1, RETRO_DEVICE_JOYPAD, 0, RETRO_DEVICE_ID_JOYPAD_Y, "Button 1" },
        { 1, RETRO_DEVICE_JOYPAD, 0, RETRO_DEVICE_ID_JOYPAD_START, "Enter" },
        { 1, RETRO_DEVICE_JOYPAD, 0, RETRO_DEVICE_ID_JOYPAD_SELECT, "Esc" },
        { 255, 255, 255, 255, "" },
    };

    struct retro_input_descriptor desc_4button[] = {
        { 0, RETRO_DEVICE_JOYPAD, 0, RETRO_DEVICE_ID_JOYPAD_Y, "Button 1" },
        { 0, RETRO_DEVICE_JOYPAD, 0, RETRO_DEVICE_ID_JOYPAD_X, "Button 2" },
        { 0, RETRO_DEVICE_JOYPAD, 0, RETRO_DEVICE_ID_JOYPAD_B, "Button 3" },
        { 0, RETRO_DEVICE_JOYPAD, 0, RETRO_DEVICE_ID_JOYPAD_A, "Button 4" },
        { 0, RETRO_DEVICE_JOYPAD, 0, RETRO_DEVICE_ID_JOYPAD_START, "Esc" },
        { 0, RETRO_DEVICE_JOYPAD, 0, RETRO_DEVICE_ID_JOYPAD_SELECT, "Enter" },
        { 1, RETRO_DEVICE_JOYPAD, 0, RETRO_DEVICE_ID_JOYPAD_Y, "Button 1" },
        { 1, RETRO_DEVICE_JOYPAD, 0, RETRO_DEVICE_ID_JOYPAD_X, "Button 2" },
        { 1, RETRO_DEVICE_JOYPAD, 0, RETRO_DEVICE_ID_JOYPAD_B, "Button 3" },
        { 1, RETRO_DEVICE_JOYPAD, 0, RETRO_DEVICE_ID_JOYPAD_A, "Button 4" },
        { 1, RETRO_DEVICE_JOYPAD, 0, RETRO_DEVICE_ID_JOYPAD_START, "Enter" },
        { 1, RETRO_DEVICE_JOYPAD, 0, RETRO_DEVICE_ID_JOYPAD_SELECT, "Esc" },
        { 255, 255, 255, 255, "" },
    };

    struct retro_input_descriptor empty = { 255, 255, 255, 255, "" };

    int i = 0;
    int j = 0;
    int k = 0;

    for(i=0;i<64;i++)
        desc[i] = empty;

    i=0;

    for(int port=0;port<2;port++)
    {
        log_cb(RETRO_LOG_INFO, "Configuring port: %d\n",port);
        switch(joystick_type[port])
        {
            case JOY_2AXIS:
                //buttons
                inputList.push_back(new JoystickButton(port, RDID(JOYPAD_Y), port, 0));
                inputList.push_back(new JoystickButton(port, RDID(JOYPAD_B), port, 1));
                inputList.push_back(new EmulatedKeyPress(0, RDID(JOYPAD_START),51));
                inputList.push_back(new EmulatedKeyPress(0, RDID(JOYPAD_SELECT),48));

                for(j=0;desc_2button[j].port!=port;j++);
                for(;desc_2button[j].port == port;j++)
                {
                    desc[i] = desc_2button[j];
                    i++;
                }

                //axes
                if(dpad[port])
                {
                    inputList.push_back(new JoystickHat(port, RDID(JOYPAD_LEFT), port, 0));
                    inputList.push_back(new JoystickHat(port, RDID(JOYPAD_RIGHT), port, 0));
                    inputList.push_back(new JoystickHat(port, RDID(JOYPAD_UP), port, 1));
                    inputList.push_back(new JoystickHat(port, RDID(JOYPAD_DOWN), port, 1));

                    for(j=0;desc_dpad[j].port!=port;j++);
                    for(;desc_dpad[j].port == port;j++)
                    {
                        desc[i] = desc_dpad[j];
                        i++;
                    }
                }
                else
                {
                    inputList.push_back(new JoystickAxis(port, RDIX(ANALOG_LEFT), RDID(ANALOG_X), port, 0));
                    inputList.push_back(new JoystickAxis(port, RDIX(ANALOG_LEFT), RDID(ANALOG_Y), port, 1));

                    for(j=0;desc_2axis[j].port!=port;j++);
                    for(;desc_2axis[j].port == port;j++)
                    {
                        desc[i] = desc_2axis[j];
                        i++;
                    }
                }

                if(emulated_kbd[port] && port == 0)
                {
                    inputList.push_back(new EmulatedKeyPress(0, RDID(JOYPAD_LEFT),80));
                    inputList.push_back(new EmulatedKeyPress(0, RDID(JOYPAD_RIGHT),83));
                    inputList.push_back(new EmulatedKeyPress(0, RDID(JOYPAD_UP),81));
                    inputList.push_back(new EmulatedKeyPress(0, RDID(JOYPAD_DOWN),82));
                    inputList.push_back(new EmulatedKeyPress(0, RDID(JOYPAD_START),51));
                    inputList.push_back(new EmulatedKeyPress(0, RDID(JOYPAD_SELECT),48));

                    for(j=0;desc_kbd[j].port!=port;j++);
                    for(;desc_kbd[j].port == port;j++)
                    {
                        desc[i] = desc_kbd[j];
                        i++;
                    }
                }

                JOYSTICK_Enable(port, true);
                break;
            case JOY_4AXIS:
                //buttons
                inputList.push_back(new JoystickButton(port, RDID(JOYPAD_Y), 0, 0));
                inputList.push_back(new JoystickButton(port, RDID(JOYPAD_X), 0, 1));
                inputList.push_back(new JoystickButton(port, RDID(JOYPAD_B), 1, 0));
                inputList.push_back(new JoystickButton(port, RDID(JOYPAD_A), 1, 1));
                inputList.push_back(new EmulatedKeyPress(0, RDID(JOYPAD_START),51));
                inputList.push_back(new EmulatedKeyPress(0, RDID(JOYPAD_SELECT),48));

                for(j=0;desc_4button[j].port!=port;j++);
                for(;desc_4button[j].port == port;j++)
                {
                    desc[i] = desc_4button[j];
                    i++;
                }

                //axes
                if(dpad[port])
                {
                    inputList.push_back(new JoystickHat(port, RDID(JOYPAD_LEFT), port, 0));
                    inputList.push_back(new JoystickHat(port, RDID(JOYPAD_RIGHT), port, 0));
                    inputList.push_back(new JoystickHat(port, RDID(JOYPAD_UP), port, 1));
                    inputList.push_back(new JoystickHat(port, RDID(JOYPAD_DOWN), port, 1));

                    for(j=0;desc_dpad[j].port!=port;j++);
                    for(;desc_dpad[j].port == port;j++)
                    {
                        desc[i] = desc_dpad[j];
                        i++;
                    }
                }
                else
                {
                    inputList.push_back(new JoystickAxis(port, RDIX(ANALOG_LEFT), RDID(ANALOG_X), 0, 0));
                    inputList.push_back(new JoystickAxis(port, RDIX(ANALOG_LEFT), RDID(ANALOG_Y), 0, 1));
                    inputList.push_back(new JoystickAxis(port, RDIX(ANALOG_RIGHT), RDID(ANALOG_X), 1, 0));
                    inputList.push_back(new JoystickAxis(port, RDIX(ANALOG_RIGHT), RDID(ANALOG_Y), 1, 1));
                    for(j=0;desc_2axis[j].port!=port;j++);
                    for(;desc_2axis[j].port == port;j++)
                    {
                        desc[i] = desc_2axis[j];
                        i++;
                    }
                }

                if(emulated_kbd[port] && port == 0)
                {
                    inputList.push_back(new EmulatedKeyPress(0, RDID(JOYPAD_LEFT),80));
                    inputList.push_back(new EmulatedKeyPress(0, RDID(JOYPAD_RIGHT),83));
                    inputList.push_back(new EmulatedKeyPress(0, RDID(JOYPAD_UP),81));
                    inputList.push_back(new EmulatedKeyPress(0, RDID(JOYPAD_DOWN),82));
                    inputList.push_back(new EmulatedKeyPress(0, RDID(JOYPAD_START),51));
                    inputList.push_back(new EmulatedKeyPress(0, RDID(JOYPAD_SELECT),48));

                    for(j=0;desc_kbd[j].port!=port;j++);
                    for(;desc_kbd[j].port == port;j++)
                    {
                        desc[i] = desc_kbd[j];
                        i++;
                    }
                }

                JOYSTICK_Enable(0, true);
                JOYSTICK_Enable(1, true);
                break;

        }

    }

    /*for(i=0;i<64;i++)
        log_cb(RETRO_LOG_DEBUG,"%d\n",desc[i].port);*/

    environ_cb(RETRO_ENVIRONMENT_SET_INPUT_DESCRIPTORS, desc);


}