summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDaniel Friesel <derf@finalrewind.org>2011-12-15 20:30:08 +0100
committerDaniel Friesel <derf@finalrewind.org>2011-12-15 20:30:08 +0100
commit025449e1b9d7084aa934cffe81dcc3e74cbb875c (patch)
tree3db615adced8a340a1cb24fd4f3a575f78258c3d
parentdfde95d0fc545ae938ae311c073334ade0707ecb (diff)
Add neverball tilt_wii patch
-rw-r--r--neverball/tilt_wii.patch177
1 files changed, 177 insertions, 0 deletions
diff --git a/neverball/tilt_wii.patch b/neverball/tilt_wii.patch
new file mode 100644
index 0000000..93630f1
--- /dev/null
+++ b/neverball/tilt_wii.patch
@@ -0,0 +1,177 @@
+Index: share/tilt_wii.c
+===================================================================
+--- share/tilt_wii.c (revision 3711)
++++ share/tilt_wii.c (working copy)
+@@ -1,5 +1,6 @@
+ /*
+ * Copyright (C) 2003 Robert Kooima
++ * Copyright (C) 2011 Daniel Friesel
+ *
+ * NEVERBALL is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published
+@@ -22,9 +23,11 @@
+ /*---------------------------------------------------------------------------*/
+
+ #define _ENABLE_TILT
+-#include <libcwiimote/wiimote.h>
+-#include <libcwiimote/wiimote_api.h>
++#include <bluetooth/bluetooth.h>
++#include <cwiid.h>
+
++struct balance_cal balance_cal;
++
+ /*
+ * This data structure tracks button changes, counting transitions so that
+ * none are missed if the event handling thread falls significantly behind
+@@ -43,6 +46,23 @@
+ unsigned char dnc;
+ };
+
++
++/* not having and setting a callback causes problems with SDL's mutex
++ * ("Mesg pipe is full")
++ */
++static void cwiid_callback(cwiid_wiimote_t *wiimote, int mesg_count,
++ union cwiid_mesg mesg[], struct timespec *ts)
++{
++}
++
++static double weight(unsigned short reading, unsigned short cal[3])
++{
++ if (reading < cal[1])
++ return ((double)reading - cal[0]) / (cal[1] - cal[0]) * 17.0;
++
++ return (((double)reading - cal[1]) / (cal[2] - cal[1]) * 17.0) + 17.0;
++}
++
+ static void set_button(struct button_state *B, int s)
+ {
+ if ((B->curr == 0) != (s == 0))
+@@ -106,59 +126,80 @@
+
+ static int tilt_func(void *data)
+ {
+- wiimote_t wiimote = WIIMOTE_INIT;
+- const char *address = config_get_s(CONFIG_WIIMOTE_ADDR);
++ cwiid_wiimote_t *wiimote = NULL;
+
+- if (strlen(address) > 0)
+- {
+- if (wiimote_connect(&wiimote, address) < 0)
+- fprintf(stderr, "%s\n", wiimote_get_error());
+- else
+- {
+- int running = 1;
++ struct cwiid_state wiistate;
+
+- wiimote.mode.bits = WIIMOTE_MODE_ACC;
+- wiimote.led.one = 1;
++ double wlt, wrt, wlb, wrb, bal_x, bal_y;
+
++ if ((wiimote = cwiid_open(BDADDR_ANY, 0)) == NULL)
++ fprintf(stderr, "Unable to connect to bboard\n");
++ else
++ {
++ int running = 1;
++
++ cwiid_set_led(wiimote, 1);
++ cwiid_get_balance_cal(wiimote, &balance_cal);
++ cwiid_set_mesg_callback(wiimote, cwiid_callback);
++ cwiid_enable(wiimote, CWIID_FLAG_MESG_IFC);
++ cwiid_set_rpt_mode(wiimote, CWIID_RPT_STATUS | CWIID_RPT_EXT);
++
+ SDL_mutexP(mutex);
+ state.status = running;
+ SDL_mutexV(mutex);
+
+- while (mutex && running && wiimote_is_open(&wiimote))
++ while (mutex && running)
+ {
+- if (wiimote_update(&wiimote) < 0)
+- break;
+
+ SDL_mutexP(mutex);
+ {
+ running = state.status;
+
+- set_button(&state.A, wiimote.keys.a);
+- set_button(&state.B, wiimote.keys.b);
+- set_button(&state.plus, wiimote.keys.plus);
+- set_button(&state.minus, wiimote.keys.minus);
+- set_button(&state.home, wiimote.keys.home);
+- set_button(&state.L, wiimote.keys.left);
+- set_button(&state.R, wiimote.keys.right);
+- set_button(&state.U, wiimote.keys.up);
+- set_button(&state.D, wiimote.keys.down);
++ set_button(&state.A, 0);
++ set_button(&state.B, 0);
++ set_button(&state.plus, 0);
++ set_button(&state.minus, 0);
++ set_button(&state.home, 0);
++ set_button(&state.L, 0);
++ set_button(&state.R, 0);
++ set_button(&state.U, 0);
++ set_button(&state.D, 0);
+
+- if (isnormal(wiimote.tilt.y))
++ cwiid_get_state(wiimote, &wiistate);
++
++ wlt = weight(wiistate.ext.balance.left_top, balance_cal.left_top);
++ wrt = weight(wiistate.ext.balance.right_top, balance_cal.right_top);
++ wlb = weight(wiistate.ext.balance.left_bottom, balance_cal.left_bottom);
++ wrb = weight(wiistate.ext.balance.right_bottom, balance_cal.right_bottom);
++
++ bal_x = (wrt + wrb) / (wlt + wlb);
++ if (bal_x > 1)
++ bal_x = ((wlt + wlb) / (wrt + wrb) * (-1.0)) + 1.0;
++ else
++ bal_x -= 1;
++
++ bal_y = (wlt + wrt) / (wlb + wrb);
++ if (bal_y > 1)
++ bal_y = ((wlb + wrb) / (wlt + wrt) * (-1.0)) + 1.0;
++ else
++ bal_y -= 1;
++
++ if ((bal_y >= -1) && (bal_y <= 1))
+ {
++ bal_y *= 12;
+ state.x = (state.x * (FILTER - 1) +
+- wiimote.tilt.y) / FILTER;
++ bal_y) / FILTER;
+ }
+- if (isnormal(wiimote.tilt.x))
++ if ((bal_x >= -1) && (bal_x <= 1))
+ {
++ bal_x *= 12;
+ state.z = (state.z * (FILTER - 1) +
+- wiimote.tilt.x) / FILTER;
++ bal_x) / FILTER;
+ }
+ }
+ SDL_mutexV(mutex);
+ }
+
+- wiimote_disconnect(&wiimote);
+- }
+ }
+ return 0;
+ }
+@@ -295,3 +336,4 @@
+ }
+
+ /*---------------------------------------------------------------------------*/
++
+Index: Makefile
+===================================================================
+--- Makefile (revision 3711)
++++ Makefile (working copy)
+@@ -105,7 +105,7 @@
+ INTL_LIBS :=
+
+ ifeq ($(ENABLE_TILT),wii)
+- TILT_LIBS := -lcwiimote -lbluetooth
++ TILT_LIBS := -lcwiid -lbluetooth
+ else
+ ifeq ($(ENABLE_TILT),loop)
+ TILT_LIBS := -lusb-1.0 -lfreespace