Add support for (my) joystick
This commit is contained in:
parent
12e681392d
commit
f246587a9d
@ -13,8 +13,12 @@ include_directories(${CMAKE_SOURCE_DIR}/src/debugger)
|
|||||||
include_directories(${CMAKE_SOURCE_DIR}/third-party/linenoise)
|
include_directories(${CMAKE_SOURCE_DIR}/third-party/linenoise)
|
||||||
|
|
||||||
find_package(SDL 1.2 REQUIRED)
|
find_package(SDL 1.2 REQUIRED)
|
||||||
|
file(GLOB SDL_SRC ${CMAKE_SOURCE_DIR}/src/sdl/sdl-*.c)
|
||||||
|
include_directories(${CMAKE_SOURCE_DIR}/src/sdl)
|
||||||
|
|
||||||
find_package(OpenGL REQUIRED)
|
find_package(OpenGL REQUIRED)
|
||||||
|
|
||||||
include_directories(${SDL_INCLUDE_DIR} ${OPENGL_INCLUDE_DIR})
|
include_directories(${SDL_INCLUDE_DIR} ${OPENGL_INCLUDE_DIR})
|
||||||
|
|
||||||
add_executable(gbac ${ARM_SRC} ${GBA_SRC} ${DEBUGGER_SRC} ${RENDERER_SRC} ${THIRD_PARTY} ${CMAKE_SOURCE_DIR}/src/main.c)
|
add_executable(gbac ${ARM_SRC} ${GBA_SRC} ${DEBUGGER_SRC} ${RENDERER_SRC} ${THIRD_PARTY} ${SDL_SRC} ${CMAKE_SOURCE_DIR}/src/main.c)
|
||||||
target_link_libraries(gbac m pthread ${SDL_LIBRARY} ${OPENGL_LIBRARY})
|
target_link_libraries(gbac m pthread ${SDL_LIBRARY} ${OPENGL_LIBRARY})
|
||||||
|
64
src/main.c
64
src/main.c
@ -2,6 +2,7 @@
|
|||||||
#include "gba-thread.h"
|
#include "gba-thread.h"
|
||||||
#include "gba.h"
|
#include "gba.h"
|
||||||
#include "renderers/video-glsl.h"
|
#include "renderers/video-glsl.h"
|
||||||
|
#include "sdl-events.h"
|
||||||
|
|
||||||
#include <SDL.h>
|
#include <SDL.h>
|
||||||
#ifdef __APPLE__
|
#ifdef __APPLE__
|
||||||
@ -19,8 +20,6 @@
|
|||||||
static int _GBASDLInit(void);
|
static int _GBASDLInit(void);
|
||||||
static void _GBASDLDeinit(void);
|
static void _GBASDLDeinit(void);
|
||||||
static void _GBASDLRunloop(struct GBAThread* context, struct GBAVideoGLSLRenderer* renderer);
|
static void _GBASDLRunloop(struct GBAThread* context, struct GBAVideoGLSLRenderer* renderer);
|
||||||
static void _GBASDLHandleKeypress(struct GBAThread* context, const struct SDL_KeyboardEvent* event);
|
|
||||||
|
|
||||||
|
|
||||||
int main(int argc, char** argv) {
|
int main(int argc, char** argv) {
|
||||||
const char* fname = "test.rom";
|
const char* fname = "test.rom";
|
||||||
@ -59,6 +58,8 @@ static int _GBASDLInit() {
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
GBASDLInitEvents();
|
||||||
|
|
||||||
SDL_GL_SetAttribute(SDL_GL_SWAP_CONTROL, 1);
|
SDL_GL_SetAttribute(SDL_GL_SWAP_CONTROL, 1);
|
||||||
SDL_GL_SetAttribute(SDL_GL_RED_SIZE, 8);
|
SDL_GL_SetAttribute(SDL_GL_RED_SIZE, 8);
|
||||||
SDL_GL_SetAttribute(SDL_GL_GREEN_SIZE, 8);
|
SDL_GL_SetAttribute(SDL_GL_GREEN_SIZE, 8);
|
||||||
@ -85,16 +86,7 @@ static void _GBASDLRunloop(struct GBAThread* context, struct GBAVideoGLSLRendere
|
|||||||
SDL_GL_SwapBuffers();
|
SDL_GL_SwapBuffers();
|
||||||
|
|
||||||
while (SDL_PollEvent(&event)) {
|
while (SDL_PollEvent(&event)) {
|
||||||
switch (event.type) {
|
GBASDLHandleEvent(context, &event);
|
||||||
case SDL_QUIT:
|
|
||||||
// FIXME: this isn't thread-safe
|
|
||||||
context->debugger->state = DEBUGGER_EXITING;
|
|
||||||
break;
|
|
||||||
case SDL_KEYDOWN:
|
|
||||||
case SDL_KEYUP:
|
|
||||||
_GBASDLHandleKeypress(context, &event.key);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
pthread_mutex_lock(&renderer->mutex);
|
pthread_mutex_lock(&renderer->mutex);
|
||||||
pthread_cond_broadcast(&renderer->downCond);
|
pthread_cond_broadcast(&renderer->downCond);
|
||||||
@ -107,52 +99,6 @@ static void _GBASDLRunloop(struct GBAThread* context, struct GBAVideoGLSLRendere
|
|||||||
}
|
}
|
||||||
|
|
||||||
static void _GBASDLDeinit() {
|
static void _GBASDLDeinit() {
|
||||||
|
GBASDLDeinitEvents();
|
||||||
SDL_Quit();
|
SDL_Quit();
|
||||||
}
|
}
|
||||||
|
|
||||||
static void _GBASDLHandleKeypress(struct GBAThread* context, const struct SDL_KeyboardEvent* event) {
|
|
||||||
enum GBAKey key = 0;
|
|
||||||
switch (event->keysym.sym) {
|
|
||||||
case SDLK_z:
|
|
||||||
key = GBA_KEY_A;
|
|
||||||
break;
|
|
||||||
case SDLK_x:
|
|
||||||
key = GBA_KEY_B;
|
|
||||||
break;
|
|
||||||
case SDLK_a:
|
|
||||||
key = GBA_KEY_L;
|
|
||||||
break;
|
|
||||||
case SDLK_s:
|
|
||||||
key = GBA_KEY_R;
|
|
||||||
break;
|
|
||||||
case SDLK_RETURN:
|
|
||||||
key = GBA_KEY_START;
|
|
||||||
break;
|
|
||||||
case SDLK_BACKSPACE:
|
|
||||||
key = GBA_KEY_SELECT;
|
|
||||||
break;
|
|
||||||
case SDLK_UP:
|
|
||||||
key = GBA_KEY_UP;
|
|
||||||
break;
|
|
||||||
case SDLK_DOWN:
|
|
||||||
key = GBA_KEY_DOWN;
|
|
||||||
break;
|
|
||||||
case SDLK_LEFT:
|
|
||||||
key = GBA_KEY_LEFT;
|
|
||||||
break;
|
|
||||||
case SDLK_RIGHT:
|
|
||||||
key = GBA_KEY_RIGHT;
|
|
||||||
break;
|
|
||||||
case SDLK_TAB:
|
|
||||||
context->renderer->turbo = !context->renderer->turbo;
|
|
||||||
return;
|
|
||||||
default:
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (event->type == SDL_KEYDOWN) {
|
|
||||||
context->activeKeys |= 1 << key;
|
|
||||||
} else {
|
|
||||||
context->activeKeys &= ~(1 << key);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
@ -1,6 +1,7 @@
|
|||||||
#include "debugger.h"
|
#include "debugger.h"
|
||||||
#include "gba-thread.h"
|
#include "gba-thread.h"
|
||||||
#include "gba.h"
|
#include "gba.h"
|
||||||
|
#include "sdl-events.h"
|
||||||
#include "renderers/video-software.h"
|
#include "renderers/video-software.h"
|
||||||
|
|
||||||
#include <SDL.h>
|
#include <SDL.h>
|
||||||
@ -25,7 +26,6 @@ struct GLSoftwareRenderer {
|
|||||||
static int _GBASDLInit(struct GLSoftwareRenderer* renderer);
|
static int _GBASDLInit(struct GLSoftwareRenderer* renderer);
|
||||||
static void _GBASDLDeinit(struct GLSoftwareRenderer* renderer);
|
static void _GBASDLDeinit(struct GLSoftwareRenderer* renderer);
|
||||||
static void _GBASDLRunloop(struct GBAThread* context, struct GLSoftwareRenderer* renderer);
|
static void _GBASDLRunloop(struct GBAThread* context, struct GLSoftwareRenderer* renderer);
|
||||||
static void _GBASDLHandleKeypress(struct GBAThread* context, const struct SDL_KeyboardEvent* event);
|
|
||||||
|
|
||||||
static const GLint _glVertices[] = {
|
static const GLint _glVertices[] = {
|
||||||
0, 0,
|
0, 0,
|
||||||
@ -83,6 +83,8 @@ static int _GBASDLInit(struct GLSoftwareRenderer* renderer) {
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
GBASDLInitEvents();
|
||||||
|
|
||||||
SDL_GL_SetAttribute(SDL_GL_SWAP_CONTROL, 1);
|
SDL_GL_SetAttribute(SDL_GL_SWAP_CONTROL, 1);
|
||||||
SDL_GL_SetAttribute(SDL_GL_RED_SIZE, 8);
|
SDL_GL_SetAttribute(SDL_GL_RED_SIZE, 8);
|
||||||
SDL_GL_SetAttribute(SDL_GL_GREEN_SIZE, 8);
|
SDL_GL_SetAttribute(SDL_GL_GREEN_SIZE, 8);
|
||||||
@ -129,16 +131,7 @@ static void _GBASDLRunloop(struct GBAThread* context, struct GLSoftwareRenderer*
|
|||||||
SDL_GL_SwapBuffers();
|
SDL_GL_SwapBuffers();
|
||||||
|
|
||||||
while (SDL_PollEvent(&event)) {
|
while (SDL_PollEvent(&event)) {
|
||||||
switch (event.type) {
|
GBASDLHandleEvent(context, &event);
|
||||||
case SDL_QUIT:
|
|
||||||
// FIXME: this isn't thread-safe
|
|
||||||
context->debugger->state = DEBUGGER_EXITING;
|
|
||||||
break;
|
|
||||||
case SDL_KEYDOWN:
|
|
||||||
case SDL_KEYUP:
|
|
||||||
_GBASDLHandleKeypress(context, &event.key);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
pthread_mutex_lock(&renderer->d.mutex);
|
pthread_mutex_lock(&renderer->d.mutex);
|
||||||
pthread_cond_broadcast(&renderer->d.downCond);
|
pthread_cond_broadcast(&renderer->d.downCond);
|
||||||
@ -163,52 +156,6 @@ static void _GBASDLRunloop(struct GBAThread* context, struct GLSoftwareRenderer*
|
|||||||
static void _GBASDLDeinit(struct GLSoftwareRenderer* renderer) {
|
static void _GBASDLDeinit(struct GLSoftwareRenderer* renderer) {
|
||||||
free(renderer->d.outputBuffer);
|
free(renderer->d.outputBuffer);
|
||||||
|
|
||||||
|
GBASDLDeinitEvents();
|
||||||
SDL_Quit();
|
SDL_Quit();
|
||||||
}
|
}
|
||||||
|
|
||||||
static void _GBASDLHandleKeypress(struct GBAThread* context, const struct SDL_KeyboardEvent* event) {
|
|
||||||
enum GBAKey key = 0;
|
|
||||||
switch (event->keysym.sym) {
|
|
||||||
case SDLK_z:
|
|
||||||
key = GBA_KEY_A;
|
|
||||||
break;
|
|
||||||
case SDLK_x:
|
|
||||||
key = GBA_KEY_B;
|
|
||||||
break;
|
|
||||||
case SDLK_a:
|
|
||||||
key = GBA_KEY_L;
|
|
||||||
break;
|
|
||||||
case SDLK_s:
|
|
||||||
key = GBA_KEY_R;
|
|
||||||
break;
|
|
||||||
case SDLK_RETURN:
|
|
||||||
key = GBA_KEY_START;
|
|
||||||
break;
|
|
||||||
case SDLK_BACKSPACE:
|
|
||||||
key = GBA_KEY_SELECT;
|
|
||||||
break;
|
|
||||||
case SDLK_UP:
|
|
||||||
key = GBA_KEY_UP;
|
|
||||||
break;
|
|
||||||
case SDLK_DOWN:
|
|
||||||
key = GBA_KEY_DOWN;
|
|
||||||
break;
|
|
||||||
case SDLK_LEFT:
|
|
||||||
key = GBA_KEY_LEFT;
|
|
||||||
break;
|
|
||||||
case SDLK_RIGHT:
|
|
||||||
key = GBA_KEY_RIGHT;
|
|
||||||
break;
|
|
||||||
case SDLK_TAB:
|
|
||||||
context->renderer->turbo = !context->renderer->turbo;
|
|
||||||
return;
|
|
||||||
default:
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (event->type == SDL_KEYDOWN) {
|
|
||||||
context->activeKeys |= 1 << key;
|
|
||||||
} else {
|
|
||||||
context->activeKeys &= ~(1 << key);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
137
src/sdl/sdl-events.c
Normal file
137
src/sdl/sdl-events.c
Normal file
@ -0,0 +1,137 @@
|
|||||||
|
#include "sdl-events.h"
|
||||||
|
|
||||||
|
#include "debugger.h"
|
||||||
|
#include "gba-io.h"
|
||||||
|
#include "gba-video.h"
|
||||||
|
|
||||||
|
int GBASDLInitEvents() {
|
||||||
|
if (SDL_InitSubSystem(SDL_INIT_JOYSTICK) < 0) {
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
SDL_JoystickEventState(SDL_ENABLE);
|
||||||
|
SDL_JoystickOpen(0);
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
void GBASDLDeinitEvents() {
|
||||||
|
SDL_QuitSubSystem(SDL_INIT_JOYSTICK);
|
||||||
|
}
|
||||||
|
|
||||||
|
static void _GBASDLHandleKeypress(struct GBAThread* context, const struct SDL_KeyboardEvent* event) {
|
||||||
|
enum GBAKey key = 0;
|
||||||
|
switch (event->keysym.sym) {
|
||||||
|
case SDLK_z:
|
||||||
|
key = GBA_KEY_A;
|
||||||
|
break;
|
||||||
|
case SDLK_x:
|
||||||
|
key = GBA_KEY_B;
|
||||||
|
break;
|
||||||
|
case SDLK_a:
|
||||||
|
key = GBA_KEY_L;
|
||||||
|
break;
|
||||||
|
case SDLK_s:
|
||||||
|
key = GBA_KEY_R;
|
||||||
|
break;
|
||||||
|
case SDLK_RETURN:
|
||||||
|
key = GBA_KEY_START;
|
||||||
|
break;
|
||||||
|
case SDLK_BACKSPACE:
|
||||||
|
key = GBA_KEY_SELECT;
|
||||||
|
break;
|
||||||
|
case SDLK_UP:
|
||||||
|
key = GBA_KEY_UP;
|
||||||
|
break;
|
||||||
|
case SDLK_DOWN:
|
||||||
|
key = GBA_KEY_DOWN;
|
||||||
|
break;
|
||||||
|
case SDLK_LEFT:
|
||||||
|
key = GBA_KEY_LEFT;
|
||||||
|
break;
|
||||||
|
case SDLK_RIGHT:
|
||||||
|
key = GBA_KEY_RIGHT;
|
||||||
|
break;
|
||||||
|
case SDLK_TAB:
|
||||||
|
context->renderer->turbo = !context->renderer->turbo;
|
||||||
|
return;
|
||||||
|
default:
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (event->type == SDL_KEYDOWN) {
|
||||||
|
context->activeKeys |= 1 << key;
|
||||||
|
} else {
|
||||||
|
context->activeKeys &= ~(1 << key);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
static void _GBASDLHandleJoyButton(struct GBAThread* context, const struct SDL_JoyButtonEvent* event) {
|
||||||
|
enum GBAKey key = 0;
|
||||||
|
// Sorry, hardcoded to my gamepad for now
|
||||||
|
switch (event->button) {
|
||||||
|
case 2:
|
||||||
|
key = GBA_KEY_A;
|
||||||
|
break;
|
||||||
|
case 1:
|
||||||
|
key = GBA_KEY_B;
|
||||||
|
break;
|
||||||
|
case 6:
|
||||||
|
key = GBA_KEY_L;
|
||||||
|
break;
|
||||||
|
case 7:
|
||||||
|
key = GBA_KEY_R;
|
||||||
|
break;
|
||||||
|
case 8:
|
||||||
|
key = GBA_KEY_START;
|
||||||
|
break;
|
||||||
|
case 9:
|
||||||
|
key = GBA_KEY_SELECT;
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (event->type == SDL_JOYBUTTONDOWN) {
|
||||||
|
context->activeKeys |= 1 << key;
|
||||||
|
} else {
|
||||||
|
context->activeKeys &= ~(1 << key);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
static void _GBASDLHandleJoyHat(struct GBAThread* context, const struct SDL_JoyHatEvent* event) {
|
||||||
|
enum GBAKey key = 0;
|
||||||
|
|
||||||
|
if (event->value & SDL_HAT_UP) {
|
||||||
|
key |= 1 << GBA_KEY_UP;
|
||||||
|
}
|
||||||
|
if (event->value & SDL_HAT_LEFT) {
|
||||||
|
key |= 1 << GBA_KEY_LEFT;
|
||||||
|
}
|
||||||
|
if (event->value & SDL_HAT_DOWN) {
|
||||||
|
key |= 1 << GBA_KEY_DOWN;
|
||||||
|
}
|
||||||
|
if (event->value & SDL_HAT_RIGHT) {
|
||||||
|
key |= 1 << GBA_KEY_RIGHT;
|
||||||
|
}
|
||||||
|
|
||||||
|
context->activeKeys &= ~((1 << GBA_KEY_UP) | (1 << GBA_KEY_LEFT) | (1 << GBA_KEY_DOWN) | (1 << GBA_KEY_RIGHT));
|
||||||
|
context->activeKeys |= key;
|
||||||
|
}
|
||||||
|
|
||||||
|
void GBASDLHandleEvent(struct GBAThread* context, const union SDL_Event* event) {
|
||||||
|
switch (event->type) {
|
||||||
|
case SDL_QUIT:
|
||||||
|
// FIXME: this isn't thread-safe
|
||||||
|
context->debugger->state = DEBUGGER_EXITING;
|
||||||
|
break;
|
||||||
|
case SDL_KEYDOWN:
|
||||||
|
case SDL_KEYUP:
|
||||||
|
_GBASDLHandleKeypress(context, &event->key);
|
||||||
|
break;
|
||||||
|
case SDL_JOYBUTTONDOWN:
|
||||||
|
case SDL_JOYBUTTONUP:
|
||||||
|
_GBASDLHandleJoyButton(context, &event->jbutton);
|
||||||
|
break;
|
||||||
|
case SDL_JOYHATMOTION:
|
||||||
|
_GBASDLHandleJoyHat(context, &event->jhat);
|
||||||
|
}
|
||||||
|
}
|
13
src/sdl/sdl-events.h
Normal file
13
src/sdl/sdl-events.h
Normal file
@ -0,0 +1,13 @@
|
|||||||
|
#ifndef SDL_EVENTS_H
|
||||||
|
#define SDL_EVENTS_H
|
||||||
|
|
||||||
|
#include "gba-thread.h"
|
||||||
|
|
||||||
|
#include <SDL.h>
|
||||||
|
|
||||||
|
int GBASDLInitEvents(void);
|
||||||
|
void GBASDLDeinitEvents(void);
|
||||||
|
|
||||||
|
void GBASDLHandleEvent(struct GBAThread* context, const union SDL_Event* event);
|
||||||
|
|
||||||
|
#endif
|
Loading…
x
Reference in New Issue
Block a user