From 154250cfc4db066a3b3b51a075c15d861d3c06b0 Mon Sep 17 00:00:00 2001 From: astoria-d Date: Mon, 8 Apr 2013 18:51:09 +0900 Subject: [PATCH] joypad lib done --- emulator/joypad/Makefile | 13 +-- emulator/joypad/joypad.c | 258 +++++++++++++++++++++++++++++++++++++++++++- emulator/joypad/jp-driver | Bin 0 -> 32699 bytes emulator/joypad/jp-driver.c | 17 +++ 4 files changed, 280 insertions(+), 8 deletions(-) create mode 100755 emulator/joypad/jp-driver create mode 100644 emulator/joypad/jp-driver.c diff --git a/emulator/joypad/Makefile b/emulator/joypad/Makefile index b6b197a..dbf0db3 100644 --- a/emulator/joypad/Makefile +++ b/emulator/joypad/Makefile @@ -2,19 +2,20 @@ BIN=libjoypad.a TEST_BIN=jp-driver -DUMMY_OBJS=jp-driver.o - OBJS=joypad.o + +DUMMY_OBJS=jp-driver.o -LIBS=-L../../libs -L./ -lmotones -lppucore +LIBS=-L../../libs -L./ -ljoypad -lmotones -pthread +#LIBS=-L./ -lmotones -ljoypad INCLUDE=-I../../include -I../ -CFLAGS=-g $(INCLUDE) -Wall +CFLAGS=-g $(INCLUDE) -Wall `pkg-config gtk+-2.0 --cflags` -LFLAGS=-g $(LIBS) -Wall +LFLAGS=-g $(LIBS) `pkg-config gtk+-2.0 gthread-2.0 --libs` -all: $(BIN) +all: $(BIN) test test: $(TEST_BIN) $(TEST_BIN): $(BIN) $(DUMMY_OBJS) ../../libs diff --git a/emulator/joypad/joypad.c b/emulator/joypad/joypad.c index 7fb681b..adec720 100644 --- a/emulator/joypad/joypad.c +++ b/emulator/joypad/joypad.c @@ -1,10 +1,264 @@ +#include +#include +#include + #include "tools.h" +#define JOYPAD_IMG_PATH "./famicon-controller.jpg" -int init_jp(void) { +static int button_up; +static int button_down; +static int button_left; +static int button_right; +static int button_A; +static int button_B; +static int button_select; +static int button_start; + +int get_button(unsigned int code) { + code &= 0x07; + switch (code) { + case 0: + return button_A; + case 1: + return button_B; + case 2: + return button_select; + case 3: + return button_start; + case 4: + return button_up; + case 5: + return button_down; + case 6: + return button_left; + case 7: + default: + return button_right; + } + return FALSE; +} + +static gboolean expose_event(GtkWidget *widget, GdkEventExpose *event, gpointer data){ + GdkPixbuf *pixbuf = (GdkPixbuf *)data; + + gdk_pixbuf_render_to_drawable (pixbuf, widget->window, + widget->style->fg_gc[GTK_STATE_NORMAL], + 0, 0, 0, 0, + gdk_pixbuf_get_width(pixbuf), + gdk_pixbuf_get_height(pixbuf), + GDK_RGB_DITHER_NORMAL, 0, 0); return TRUE; } -void clean_jp(void) { +static void key_press(GtkWidget *widget, + GdkEventKey *event, + gpointer data){ + + int valid_key = FALSE; + const char *key; + + switch (event->keyval) { + case 'q': + case 'w': + case 'e': + case 'r': + button_up = TRUE; + valid_key = TRUE; + key = "up"; + break; + case 'z': + case 'x': + case 'c': + case 'v': + case 'b': + button_down = TRUE; + valid_key = TRUE; + key = "down"; + break; + case 'a': + case 's': + button_left = TRUE; + valid_key = TRUE; + key = "left"; + break; + case 'd': + case 'f': + button_right = TRUE; + valid_key = TRUE; + key = "right"; + break; + case 'l': + case ';': + button_B = TRUE; + valid_key = TRUE; + key = "B"; + break; + case ':': + case ']': + button_A = TRUE; + valid_key = TRUE; + key = "A"; + break; + case 65289: //tab key + button_select = TRUE; + valid_key = TRUE; + key = "select"; + break; + case 65293: //enter key + button_start = TRUE; + valid_key = TRUE; + key = "start"; + break; + } + if (valid_key) + dprint("%s key pressed\n", key); + //dprint("press, key code: %d key: %s\n", event->keyval, event->string); +} + +static void key_release(GtkWidget *widget, + GdkEventKey *event, + gpointer data){ + + int valid_key = FALSE; + const char *key; + + switch (event->keyval) { + case 'q': + case 'w': + case 'e': + case 'r': + button_up = FALSE; + valid_key = TRUE; + key = "up"; + break; + case 'z': + case 'x': + case 'c': + case 'v': + case 'b': + button_down = FALSE; + valid_key = TRUE; + key = "down"; + break; + case 'a': + case 's': + button_left = FALSE; + valid_key = TRUE; + key = "left"; + break; + case 'd': + case 'f': + button_right = FALSE; + valid_key = TRUE; + key = "right"; + break; + case 'l': + case ';': + button_B = FALSE; + valid_key = TRUE; + key = "B"; + break; + case ':': + case ']': + button_A = FALSE; + valid_key = TRUE; + key = "A"; + break; + case 65289: //tab key + button_select = FALSE; + valid_key = TRUE; + key = "select"; + break; + case 65293: //enter key + button_start = FALSE; + valid_key = TRUE; + key = "start"; + break; + } + if (valid_key) + dprint("%s key released\n", key); + //dprint("release, key code: %d key: %s\n", event->keyval, event->string); +} + +int window_start(int argc, char** argv) +{ + GtkWidget *window; + GtkWidget *drawing_area; + GdkPixbuf *pixbuf; + GError *err = NULL; + int width, height; + + //get thread lock + gdk_threads_enter(); + + //init. + gtk_init(&argc, &argv); + + pixbuf = gdk_pixbuf_new_from_file(JOYPAD_IMG_PATH, &err); + if (pixbuf == NULL) { + fprintf(stderr, "error reading image file[%s].\n", JOYPAD_IMG_PATH); + g_error_free (err); + return -1; + } + width = gdk_pixbuf_get_width (pixbuf); + height = gdk_pixbuf_get_height (pixbuf); + //dprint("w:%d, h:%d\n", width, height); + // + + window = gtk_window_new(GTK_WINDOW_TOPLEVEL); + gtk_signal_connect (GTK_OBJECT (window), "destroy", + GTK_SIGNAL_FUNC (gtk_main_quit), NULL); + + drawing_area = gtk_drawing_area_new(); + gtk_drawing_area_size(GTK_DRAWING_AREA(drawing_area), width, height); + gtk_window_set_position (GTK_WINDOW(window), GTK_WIN_POS_CENTER); + gtk_container_add (GTK_CONTAINER (window), drawing_area); + + //draw event + gtk_signal_connect (GTK_OBJECT (drawing_area), "expose_event", + GTK_SIGNAL_FUNC(expose_event), pixbuf); + //key board event + gtk_signal_connect(GTK_OBJECT(window), "key_press_event", + GTK_SIGNAL_FUNC(key_press), NULL); + gtk_signal_connect(GTK_OBJECT(window), "key_release_event", + GTK_SIGNAL_FUNC(key_release), NULL); +/* + gtk_signal_connect (GTK_OBJECT (drawing_area), "configure_event", + GTK_SIGNAL_FUNC(configure_event), NULL); +*/ + + gtk_widget_show_all(window); + gtk_main(); + gdk_threads_leave(); + + return 0; +} + +int init_jp(void) { + //init thread + g_thread_init (NULL); + gdk_threads_init (); + + printf("joypad key entry:\n"); + printf(" select button: \n"); + printf(" start button: \n"); + printf(" up key: Q, W, E, R\n"); + printf(" down key: Z, X, C, V, B\n"); + printf(" left key: A, S\n"); + printf(" right key: D, F\n"); + printf(" A button: <:>, <]>\n"); + printf(" B button: L, <;>\n"); + + button_up = FALSE; + button_down = FALSE; + button_left = FALSE; + button_right = FALSE; + button_A = FALSE; + button_B = FALSE; + button_select = FALSE; + button_start = FALSE; + + return TRUE; } diff --git a/emulator/joypad/jp-driver b/emulator/joypad/jp-driver new file mode 100755 index 0000000000000000000000000000000000000000..46c4a8b4803ac87e08a79c33bdc04ec962c89c94 GIT binary patch literal 32699 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%0D+In&Lv7BcR(*HDMt)`v{1 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 + +#include "tools.h" + +int init_jp(void); +int window_start(int argc, char** argv); + +int main(int argc, char** argv) { + printf("jp-driver...\n"); + + init_jp(); + window_start(argc, argv); + + return 0; +} + + -- 2.11.0