This is an automated email from the git hooks/post-receive script.
git pushed a commit to branch master
in repository minilauncher-for-slippi.
View the commit online.
commit ebcdccd9a7b3806a93935a7067e6c35bd9d4ed66
Author: Nekobit <m...@ow.nekobit.net>
AuthorDate: Sun Sep 10 23:12:45 2023 -0400
partial gamecube support
---
Makefile | 4 +-
input.c | 160 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++----
input.h | 10 +++-
main.c | 5 +-
4 files changed, 163 insertions(+), 16 deletions(-)
diff --git a/Makefile b/Makefile
index e054a13..88c4de3 100644
--- a/Makefile
+++ b/Makefile
@@ -1,6 +1,6 @@
CC=cc
-CFLAGS=-g `pkg-config --cflags efl ecore elementary` `sdl2-config --cflags` `curl-config --cflags`
-LDFLAGS=`pkg-config --libs efl ecore elementary` `sdl2-config --libs` `curl-config --libs` -lcjson
+CFLAGS=-g `pkg-config --cflags efl ecore elementary libusb-1.0` `sdl2-config --cflags` `curl-config --cflags`
+LDFLAGS=`pkg-config --libs efl ecore elementary libusb-1.0` `sdl2-config --libs` `curl-config --libs` -lcjson
OBJS=main.o replay.o home.o input.o
minilauncher4slippi: $(OBJS)
diff --git a/input.c b/input.c
index 6e1037f..1cd3688 100644
--- a/input.c
+++ b/input.c
@@ -1,13 +1,20 @@
#include <Ecore.h>
#include <Elementary.h>
+#include <libusb.h>
#include "input.h"
Ecore_Event_Key* ev = NULL;
int event_ready = 0;
static SDL_GameController* gamepad;
-extern Evas_Object* win, *mainer, *_tab_curr, *tab_scroller;
+extern Evas_Object* win, *mainer, *_tab_curr;
void _launch_slippi_cb(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED);
float y_mod = 0.0f;
+//static libusb_device* gcadapter;
+
+
+static libusb_device_handle* gcadapter = NULL;
+int gc_endpoint_in;
+int gc_endpoint_out;
void
free_ev(void* that, void* who_even_cares EINA_UNUSED)
@@ -20,17 +27,18 @@ Eina_Bool
_scroll_loop_cb(void* data)
{
int x, y, w, h;
- elm_scroller_region_get(tab_scroller, &x, &y, &w, &h);
+ elm_scroller_region_get(mainer, &x, &y, &w, &h);
y += y_mod;
- elm_scroller_region_show(tab_scroller, x, y, w, h);
+ elm_scroller_region_show(mainer, x, y, w, h);
return EINA_TRUE;
}
void
-input_sdl_init_thread()
+input_init_threads()
{
- ecore_timer_add(.005, _scroll_loop_cb, NULL);
- Ecore_Thread* thread = ecore_thread_run(_input_sdl_setup_thread, NULL, NULL, NULL);
+ //ecore_timer_add(.005, _scroll_loop_cb, NULL);
+ ecore_thread_run(_input_sdl_setup_thread, NULL, NULL, NULL);
+ ecore_thread_run(_input_gcadapter_setup_thread, NULL, NULL, NULL);
}
static void
@@ -61,7 +69,7 @@ input_sdl_eventloop(Ecore_Thread *thread)
int deadzone = 3000;
float r_y = SDL_GameControllerGetAxis(gamepad, SDL_CONTROLLER_AXIS_RIGHTY);
- if (abs(r_y) > deadzone)
+ if (fabsf(r_y) > deadzone)
{
y_mod = r_y / 4000;
}
@@ -144,9 +152,143 @@ input_sdl_setup()
}
}
+// https://github.com/nekobbbbbbit/Ishiiruka/blob/slippi/Source/Core/InputCommon/GCAdapter.cpp
+static void
+input_gcadapter_eventloop(Ecore_Thread *thread)
+{
+}
+
+void
+input_gcadapter_setup()
+{
+ libusb_device** devs;
+ size_t len;
+ int ret;
+ libusb_init(NULL);
+ len = libusb_get_device_list(NULL, &devs);
+
+ if (len < 0) {
+ libusb_exit(NULL);
+ return;
+ }
+
+
+ for (int i = 0; devs[i]; i++)
+ {
+ libusb_device* dev = devs[i];
+ struct libusb_device_descriptor desc;
+ libusb_get_device_descriptor(dev, &desc);
+ if (desc.idVendor == 0x057e && desc.idProduct == 0x0337)
+ {
+ printf("Found gamecube controller with vendor 0x0%X and product 0x0%X!\n",
+ desc.idVendor, desc.idProduct);
+ //gcadapter = dev;
+ libusb_open(dev, &gcadapter);
+ if ((ret = libusb_kernel_driver_active(gcadapter, 0)) == 1)
+ {
+ // Slippi Ishiiruka temp patch: A fix is underway for Dolphin-emu, but this is workaround
+ // on said systems. Only on FreeBSD systems, not the other BSD's I think
+#ifndef __FreeBSD__
+ if ((ret = libusb_detach_kernel_driver(gcadapter, 0)) && ret != LIBUSB_ERROR_NOT_SUPPORTED)
+ {
+ ERROR_LOG(SERIALINTERFACE, "libusb_detach_kernel_driver failed with error: %d", ret);
+ }
+#endif
+ ret = 0; // Need to work around.
+ }
+
+ // This call makes Nyko-brand (and perhaps other) adapters work.
+ // However it returns LIBUSB_ERROR_PIPE with Mayflash adapters.
+
+ const int transfer = libusb_control_transfer(gcadapter, 0x21, 11, 0x0001, 0, NULL, 0, 1000);
+ if (transfer < 0)
+ ;
+
+ if (ret != 0 && ret != LIBUSB_ERROR_NOT_SUPPORTED)
+ {
+ puts("Porbably bad.");
+ return;
+ }
+ else if ((ret = libusb_claim_interface(gcadapter, 0))) {
+ puts("Something happened. Check GCAdapter permissions.");
+ }
+ else {
+ puts("And we're hooked!");
+
+ // Now do more shit. We're way too nested :^)
+ libusb_config_descriptor *config = NULL;
+ libusb_get_config_descriptor(dev, 0, &config);
+ for (int ic = 0; ic < config->bNumInterfaces; ic++)
+ {
+ const libusb_interface *interfaceContainer = &config->interface[ic];
+ for (int i = 0; i < interfaceContainer->num_altsetting; i++)
+ {
+ const libusb_interface_descriptor *interface = &interfaceContainer->altsetting[i];
+ for (int e = 0; e < interface->bNumEndpoints; e++)
+ {
+ const libusb_endpoint_descriptor *endpoint = &interface->endpoint[e];
+ if (endpoint->bEndpointAddress & LIBUSB_ENDPOINT_IN)
+ gc_endpoint_in = endpoint->bEndpointAddress;
+ else
+ gc_endpoint_out = endpoint->bEndpointAddress;
+ }
+ }
+ }
+
+ printf("in:0x%X out:0x%X\n", gc_endpoint_in, gc_endpoint_out);
+
+ int tmp;
+ unsigned char payload = 0x13;
+ ret = libusb_interrupt_transfer(gcadapter, gc_endpoint_out, &payload,
+ sizeof(payload), &tmp, 32);
+
+ sleep(1);
+
+ float z = 120;
+ while (1)
+ {
+ ret = libusb_interrupt_transfer(gcadapter, gc_endpoint_out, &payload,
+ sizeof(payload), &tmp, 32);
+ z += 0.001;
+ unsigned char rumble[] = {0x11,z,z,z,z};
+
+ ret = libusb_interrupt_transfer(gcadapter, gc_endpoint_out, rumble, sizeof(rumble), &tmp, 32);
+ printf("%d byte\n", tmp);
+ if (ret)
+ {
+ printf("Error\n");
+ }
+ //sleep(1);
+ unsigned char rumbles[] = {0x11,0,0,0,0};
+
+ ret = libusb_interrupt_transfer(gcadapter, gc_endpoint_out, rumbles, sizeof(rumbles), &tmp, 32);
+ printf("%d byte\n", tmp);
+ if (ret)
+ {
+ printf("Error\n");
+ }
+ //sleep(1);
+ }
+
+ // END...
+ }
+ }
+ }
+
+ //libusb_free_device_list(devs, 1);
+}
+
+
void
_input_sdl_setup_thread(void *data, Ecore_Thread *thread)
{
- input_sdl_setup();
- input_sdl_eventloop(thread);
+ //input_sdl_setup();
+ //input_sdl_eventloop(thread);
+}
+
+void
+_input_gcadapter_setup_thread(void *data, Ecore_Thread *thread)
+{
+ //input_gcadapter_setup();
+ //input_gcadapter_eventloop(thread);
}
diff --git a/input.h b/input.h
index 848f280..33d1562 100644
--- a/input.h
+++ b/input.h
@@ -3,12 +3,18 @@
#include <SDL2/SDL.h>
void
-input_sdl_setup();
+input_init_threads();
void
-input_sdl_init_thread();
+input_sdl_setup();
void
_input_sdl_setup_thread();
+void
+input_gcadapter_setup();
+
+void
+_input_gcadapter_setup_thread(void *data, Ecore_Thread *thread);
+
#endif /* INPUT_H */
diff --git a/main.c b/main.c
index b535564..9e5c03c 100644
--- a/main.c
+++ b/main.c
@@ -3,6 +3,7 @@
#include <Ecore.h>
#include <Efl_Ui.h>
#include <Elementary.h>
+#include <libusb.h>
#include "replay.h"
#include "home.h"
#ifndef NO_SDL_INPUT
@@ -317,9 +318,7 @@ elm_main(int argc, char **argv)
printf("[Current config] %s, %s, %s\n", game_path, dolphin_emu_file, dolphin_replay_file);
// Setup input
-#ifndef NO_SDL_INPUT
- input_sdl_init_thread();
-#endif
+ input_init_threads();
elm_run();
--
To stop receiving notification emails like this one, please contact
the administrator of this repository.