- [NEW] Soport per a joystick tipo Sinclair
This commit is contained in:
156
gamepad.cpp
Normal file
156
gamepad.cpp
Normal file
@@ -0,0 +1,156 @@
|
|||||||
|
#include "gamepad.h"
|
||||||
|
#include <SDL2/SDL.h>
|
||||||
|
#include "zx_ula.h"
|
||||||
|
#include <vector>
|
||||||
|
|
||||||
|
#define GAMEPAD_BUTTON_LEFT 0
|
||||||
|
#define GAMEPAD_BUTTON_RIGHT 1
|
||||||
|
#define GAMEPAD_BUTTON_UP 2
|
||||||
|
#define GAMEPAD_BUTTON_DOWN 3
|
||||||
|
#define GAMEPAD_BUTTON_FIRE 4
|
||||||
|
|
||||||
|
namespace gamepad
|
||||||
|
{
|
||||||
|
struct gamepad_t
|
||||||
|
{
|
||||||
|
SDL_GameController *gamepad;
|
||||||
|
int32_t index;
|
||||||
|
uint8_t type;
|
||||||
|
bool buttons[5] { false, false, false, false, false };
|
||||||
|
};
|
||||||
|
|
||||||
|
std::vector<gamepad_t> gamepads;
|
||||||
|
|
||||||
|
uint8_t getNextType()
|
||||||
|
{
|
||||||
|
uint8_t next_type = GAMEPAD_TYPE_SINCLAIR_1;
|
||||||
|
bool found = false;
|
||||||
|
while (!found)
|
||||||
|
{
|
||||||
|
found = true;
|
||||||
|
for (auto gamepad : gamepads)
|
||||||
|
{
|
||||||
|
if (gamepad.type == next_type)
|
||||||
|
{
|
||||||
|
found = false;
|
||||||
|
next_type++;
|
||||||
|
if (next_type > GAMEPAD_TYPE_FULLER) return GAMEPAD_TYPE_SINCLAIR_1;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return next_type;
|
||||||
|
}
|
||||||
|
|
||||||
|
void add(int32_t index, uint8_t type)
|
||||||
|
{
|
||||||
|
if (SDL_IsGameController(index)) {
|
||||||
|
gamepad_t gamepad;
|
||||||
|
gamepad.gamepad = SDL_GameControllerOpen(index);
|
||||||
|
if (SDL_GameControllerGetAttached(gamepad.gamepad) == SDL_TRUE) SDL_GameControllerEventState(SDL_ENABLE);
|
||||||
|
gamepad.index = index;
|
||||||
|
gamepad.type = ( (type == GAMEPAD_TYPE_ANY) ? getNextType() : type );
|
||||||
|
gamepads.push_back(gamepad);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void remove(int32_t index)
|
||||||
|
{
|
||||||
|
SDL_GameController *game_controller = SDL_GameControllerFromInstanceID(index);
|
||||||
|
for (int i=0; i<gamepads.size(); ++i)
|
||||||
|
{
|
||||||
|
if (gamepads[i].gamepad == game_controller) gamepads.erase(gamepads.begin()+i);
|
||||||
|
}
|
||||||
|
SDL_GameControllerClose(game_controller);
|
||||||
|
}
|
||||||
|
|
||||||
|
void buttonDown(int32_t index, uint8_t button)
|
||||||
|
{
|
||||||
|
SDL_GameController *game_controller = SDL_GameControllerFromInstanceID(index);
|
||||||
|
for (auto gamepad : gamepads)
|
||||||
|
{
|
||||||
|
if (gamepad.gamepad == game_controller)
|
||||||
|
{
|
||||||
|
switch(button)
|
||||||
|
{
|
||||||
|
case SDL_CONTROLLER_BUTTON_DPAD_LEFT: gamepad.buttons[GAMEPAD_BUTTON_LEFT]=true; break;
|
||||||
|
case SDL_CONTROLLER_BUTTON_DPAD_RIGHT: gamepad.buttons[GAMEPAD_BUTTON_RIGHT]=true; break;
|
||||||
|
case SDL_CONTROLLER_BUTTON_DPAD_DOWN: gamepad.buttons[GAMEPAD_BUTTON_DOWN]=true; break;
|
||||||
|
case SDL_CONTROLLER_BUTTON_DPAD_UP: gamepad.buttons[GAMEPAD_BUTTON_UP]=true; break;
|
||||||
|
case SDL_CONTROLLER_BUTTON_A: gamepad.buttons[GAMEPAD_BUTTON_FIRE]=true; break;
|
||||||
|
}
|
||||||
|
|
||||||
|
switch(gamepad.type)
|
||||||
|
{
|
||||||
|
case GAMEPAD_TYPE_SINCLAIR_1:
|
||||||
|
switch(button)
|
||||||
|
{
|
||||||
|
case SDL_CONTROLLER_BUTTON_DPAD_LEFT: zx_ula::keydown('1'); break;
|
||||||
|
case SDL_CONTROLLER_BUTTON_DPAD_RIGHT: zx_ula::keydown('2'); break;
|
||||||
|
case SDL_CONTROLLER_BUTTON_DPAD_DOWN: zx_ula::keydown('3'); break;
|
||||||
|
case SDL_CONTROLLER_BUTTON_DPAD_UP: zx_ula::keydown('4'); break;
|
||||||
|
case SDL_CONTROLLER_BUTTON_A: zx_ula::keydown('5'); break;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case GAMEPAD_TYPE_SINCLAIR_2:
|
||||||
|
switch(button)
|
||||||
|
{
|
||||||
|
case SDL_CONTROLLER_BUTTON_DPAD_LEFT: zx_ula::keydown('6'); break;
|
||||||
|
case SDL_CONTROLLER_BUTTON_DPAD_RIGHT: zx_ula::keydown('7'); break;
|
||||||
|
case SDL_CONTROLLER_BUTTON_DPAD_DOWN: zx_ula::keydown('8'); break;
|
||||||
|
case SDL_CONTROLLER_BUTTON_DPAD_UP: zx_ula::keydown('9'); break;
|
||||||
|
case SDL_CONTROLLER_BUTTON_A: zx_ula::keydown('0'); break;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void buttonUp(int32_t index, uint8_t button)
|
||||||
|
{
|
||||||
|
SDL_GameController *game_controller = SDL_GameControllerFromInstanceID(index);
|
||||||
|
for (auto gamepad : gamepads)
|
||||||
|
{
|
||||||
|
if (gamepad.gamepad == game_controller)
|
||||||
|
{
|
||||||
|
switch(button)
|
||||||
|
{
|
||||||
|
case SDL_CONTROLLER_BUTTON_DPAD_LEFT: gamepad.buttons[GAMEPAD_BUTTON_LEFT]=false; break;
|
||||||
|
case SDL_CONTROLLER_BUTTON_DPAD_RIGHT: gamepad.buttons[GAMEPAD_BUTTON_RIGHT]=false; break;
|
||||||
|
case SDL_CONTROLLER_BUTTON_DPAD_DOWN: gamepad.buttons[GAMEPAD_BUTTON_DOWN]=false; break;
|
||||||
|
case SDL_CONTROLLER_BUTTON_DPAD_UP: gamepad.buttons[GAMEPAD_BUTTON_UP]=false; break;
|
||||||
|
case SDL_CONTROLLER_BUTTON_A: gamepad.buttons[GAMEPAD_BUTTON_FIRE]=false; break;
|
||||||
|
}
|
||||||
|
|
||||||
|
switch(gamepad.type)
|
||||||
|
{
|
||||||
|
case GAMEPAD_TYPE_SINCLAIR_1:
|
||||||
|
switch(button)
|
||||||
|
{
|
||||||
|
case SDL_CONTROLLER_BUTTON_DPAD_LEFT: zx_ula::keyup('1'); break;
|
||||||
|
case SDL_CONTROLLER_BUTTON_DPAD_RIGHT: zx_ula::keyup('2'); break;
|
||||||
|
case SDL_CONTROLLER_BUTTON_DPAD_DOWN: zx_ula::keyup('3'); break;
|
||||||
|
case SDL_CONTROLLER_BUTTON_DPAD_UP: zx_ula::keyup('4'); break;
|
||||||
|
case SDL_CONTROLLER_BUTTON_A: zx_ula::keyup('5'); break;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case GAMEPAD_TYPE_SINCLAIR_2:
|
||||||
|
switch(button)
|
||||||
|
{
|
||||||
|
case SDL_CONTROLLER_BUTTON_DPAD_LEFT: zx_ula::keyup('6'); break;
|
||||||
|
case SDL_CONTROLLER_BUTTON_DPAD_RIGHT: zx_ula::keyup('7'); break;
|
||||||
|
case SDL_CONTROLLER_BUTTON_DPAD_DOWN: zx_ula::keyup('8'); break;
|
||||||
|
case SDL_CONTROLLER_BUTTON_DPAD_UP: zx_ula::keyup('9'); break;
|
||||||
|
case SDL_CONTROLLER_BUTTON_A: zx_ula::keyup('0'); break;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
16
gamepad.h
Normal file
16
gamepad.h
Normal file
@@ -0,0 +1,16 @@
|
|||||||
|
#pragma once
|
||||||
|
#include <stdint.h>
|
||||||
|
|
||||||
|
#define GAMEPAD_TYPE_ANY 0
|
||||||
|
#define GAMEPAD_TYPE_SINCLAIR_1 1
|
||||||
|
#define GAMEPAD_TYPE_SINCLAIR_2 2
|
||||||
|
#define GAMEPAD_TYPE_KEMPSTON 3
|
||||||
|
#define GAMEPAD_TYPE_FULLER 4
|
||||||
|
|
||||||
|
namespace gamepad
|
||||||
|
{
|
||||||
|
void add(int32_t index, uint8_t type);
|
||||||
|
void remove(int32_t index);
|
||||||
|
void buttonDown(int32_t index, uint8_t button);
|
||||||
|
void buttonUp(int32_t index, uint8_t button);
|
||||||
|
}
|
||||||
10
main.cpp
10
main.cpp
@@ -21,6 +21,7 @@
|
|||||||
#include "ay-3-8912.h"
|
#include "ay-3-8912.h"
|
||||||
#include "ay_viewer.h"
|
#include "ay_viewer.h"
|
||||||
#include "file.h"
|
#include "file.h"
|
||||||
|
#include "gamepad.h"
|
||||||
|
|
||||||
uint32_t time = 0;
|
uint32_t time = 0;
|
||||||
uint32_t t_states = 0;
|
uint32_t t_states = 0;
|
||||||
@@ -173,11 +174,20 @@ int main(int argc, char *argv[])
|
|||||||
|
|
||||||
if (e.type == SDL_QUIT) { zx_system::shutdown(); break; }
|
if (e.type == SDL_QUIT) { zx_system::shutdown(); break; }
|
||||||
if (e.type == SDL_JOYDEVICEADDED) {
|
if (e.type == SDL_JOYDEVICEADDED) {
|
||||||
|
gamepad::add(e.jdevice.which, GAMEPAD_TYPE_ANY);
|
||||||
printf("JOYSTICK CONECTAT: %i\n", e.jdevice.which);
|
printf("JOYSTICK CONECTAT: %i\n", e.jdevice.which);
|
||||||
|
// [TODO] Mostrar dialeg de triar tipus de joystick
|
||||||
}
|
}
|
||||||
if (e.type == SDL_JOYDEVICEREMOVED) {
|
if (e.type == SDL_JOYDEVICEREMOVED) {
|
||||||
|
gamepad::remove(e.jdevice.which);
|
||||||
printf("JOYSTICK DESCONECTAT: %i\n", e.jdevice.which);
|
printf("JOYSTICK DESCONECTAT: %i\n", e.jdevice.which);
|
||||||
}
|
}
|
||||||
|
if (e.type == SDL_CONTROLLERBUTTONDOWN) {
|
||||||
|
gamepad::buttonDown(e.jbutton.which, e.jbutton.button);
|
||||||
|
}
|
||||||
|
if (e.type == SDL_CONTROLLERBUTTONUP) {
|
||||||
|
gamepad::buttonUp(e.jbutton.which, e.jbutton.button);
|
||||||
|
}
|
||||||
if (e.type == SDL_MOUSEBUTTONDOWN) result = ui::window::sendEvent(e.button.windowID, &e);
|
if (e.type == SDL_MOUSEBUTTONDOWN) result = ui::window::sendEvent(e.button.windowID, &e);
|
||||||
if (e.type == SDL_MOUSEBUTTONUP) result = ui::window::sendEvent(e.button.windowID, &e);
|
if (e.type == SDL_MOUSEBUTTONUP) result = ui::window::sendEvent(e.button.windowID, &e);
|
||||||
if (e.type == SDL_MOUSEMOTION) result = ui::window::sendEvent(e.motion.windowID, &e);
|
if (e.type == SDL_MOUSEMOTION) result = ui::window::sendEvent(e.motion.windowID, &e);
|
||||||
|
|||||||
Reference in New Issue
Block a user