OSDN Git Service

joypad lib done
authorastoria-d <astoria-d@mail.goo.ne.jp>
Mon, 8 Apr 2013 09:51:09 +0000 (18:51 +0900)
committerastoria-d <astoria-d@mail.goo.ne.jp>
Mon, 8 Apr 2013 09:51:09 +0000 (18:51 +0900)
emulator/joypad/Makefile
emulator/joypad/joypad.c
emulator/joypad/jp-driver [new file with mode: 0755]
emulator/joypad/jp-driver.c [new file with mode: 0644]

index b6b197a..dbf0db3 100644 (file)
@@ -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
index 7fb681b..adec720 100644 (file)
+#include <gtk/gtk.h>
+#include <gdk-pixbuf/gdk-pixbuf.h>
+#include <libio.h>
+
 #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:  <Tab>\n");
+    printf("    start button:   <Enter>\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 (executable)
index 0000000..46c4a8b
Binary files /dev/null and b/emulator/joypad/jp-driver differ
diff --git a/emulator/joypad/jp-driver.c b/emulator/joypad/jp-driver.c
new file mode 100644 (file)
index 0000000..b893dc6
--- /dev/null
@@ -0,0 +1,17 @@
+#include <stdio.h>
+
+#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;
+}
+
+