diff --git a/Externals/WiiUseSrc/Src/events.c b/Externals/WiiUseSrc/Src/events.c index 87bed002d5..63269e52c5 100644 --- a/Externals/WiiUseSrc/Src/events.c +++ b/Externals/WiiUseSrc/Src/events.c @@ -56,6 +56,7 @@ #include "nunchuk.h" #include "classic.h" #include "guitar_hero_3.h" +#include "wiiboard.h" #include "events.h" static void idle_cycle(struct wiimote_t* wm); @@ -635,6 +636,9 @@ static void handle_expansion(struct wiimote_t* wm, byte* msg) { case EXP_GUITAR_HERO_3: guitar_hero_3_event(&wm->exp.gh3, msg); break; + case EXP_WII_BOARD: + wii_board_event(&wm->exp.wb, msg); + break; default: break; } @@ -704,6 +708,12 @@ void handshake_expansion(struct wiimote_t* wm, byte* data, unsigned short len) { wm->event = WIIUSE_GUITAR_HERO_3_CTRL_INSERTED; break; } + case EXP_ID_CODE_WII_BOARD: + { + if (wii_board_handshake(wm, &wm->exp.wb, data, len)) + wm->event = WIIUSE_WII_BOARD_CTRL_INSERTED; + break; + } default: { WIIUSE_WARNING("Unknown expansion type. Code: 0x%x", wid); @@ -744,6 +754,10 @@ void disable_expansion(struct wiimote_t* wm) { guitar_hero_3_disconnected(&wm->exp.gh3); wm->event = WIIUSE_GUITAR_HERO_3_CTRL_REMOVED; break; + case EXP_WII_BOARD://Fix me + wii_board_disconnected(&wm->exp.wb); + wm->event = WIIUSE_WII_BOARD_CTRL_REMOVED; + break; default: break; } @@ -794,7 +808,6 @@ static void save_state(struct wiimote_t* wm) { wm->lstate.exp_r_shoulder = wm->exp.gh3.whammy_bar; wm->lstate.exp_btns = wm->exp.gh3.btns; break; - case EXP_NONE: break; } @@ -890,6 +903,14 @@ static int state_changed(struct wiimote_t* wm) { STATE_CHANGED(wm->lstate.exp_btns, wm->exp.gh3.btns); break; } + case EXP_WII_BOARD: + { + STATE_CHANGED(wm->exp.wb.ltr,wm->exp.wb.tr); + STATE_CHANGED(wm->exp.wb.ltl,wm->exp.wb.tl); + STATE_CHANGED(wm->exp.wb.lbr,wm->exp.wb.br); + STATE_CHANGED(wm->exp.wb.lbl,wm->exp.wb.bl); + break; + } case EXP_NONE: { break; diff --git a/Externals/WiiUseSrc/Src/wiiboard.c b/Externals/WiiUseSrc/Src/wiiboard.c new file mode 100644 index 0000000000..38a540b1a8 --- /dev/null +++ b/Externals/WiiUseSrc/Src/wiiboard.c @@ -0,0 +1,187 @@ +/* + * wiiuse + * + * Written By: + * Michael Laforest < para > + * Email: < thepara (--AT--) g m a i l [--DOT--] com > + * + * Copyright 2006-2007 + * + * This file is part of wiiuse. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + * $Header$ + * + */ + +/** + * @file + * @brief Wii Fit Balance Board device. + */ + +#include +#include +#include + +#ifdef WIN32 + #include +#endif + +#include "definitions.h" +#include "wiiuse_internal.h" +#include "dynamics.h" +#include "events.h" +#include "wiiboard.h" + +static short big_to_lil(unsigned short num) +{ + short ret = num; + char *bret = (char*)&ret; + char tmp = bret[1]; + bret[1] = bret[0]; + bret[0] = tmp; + return ret; +} + +/** + * @brief Handle the handshake data from the guitar. + * + * @param cc A pointer to a classic_ctrl_t structure. + * @param data The data read in from the device. + * @param len The length of the data block, in bytes. + * + * @return Returns 1 if handshake was successful, 0 if not. + */ + +int wii_board_handshake(struct wiimote_t* wm, struct wii_board_t* wb, byte* data, unsigned short len) { + int i; + short* handshake_short; + /* decrypt data */ + printf("DECRYPTED DATA WIIBOARD\n"); + for (i = 0; i < len; i++) + { + if(i%16==0) + { + if(i!=0) + printf("\n"); + + printf("%X: ",0x4a40000+32+i); + } + printf("%02X ", data[i]); + } + printf("\n"); + + + handshake_short = (short*)data; + + wb->ctr[0] = big_to_lil(handshake_short[2]); + wb->cbr[0] = big_to_lil(handshake_short[3]); + wb->ctl[0] = big_to_lil(handshake_short[4]); + wb->cbl[0] = big_to_lil(handshake_short[5]); + + wb->ctr[1] = big_to_lil(handshake_short[6]); + wb->cbr[1] = big_to_lil(handshake_short[7]); + wb->ctl[1] = big_to_lil(handshake_short[8]); + wb->cbl[1] = big_to_lil(handshake_short[9]); + + wb->ctr[2] = big_to_lil(handshake_short[10]); + wb->cbr[2] = big_to_lil(handshake_short[11]); + wb->ctl[2] = big_to_lil(handshake_short[12]); + wb->cbl[2] = big_to_lil(handshake_short[13]); + + + /* handshake done */ + wm->exp.type = EXP_WII_BOARD; + + + #ifdef WIN32 + wm->timeout = WIIMOTE_DEFAULT_TIMEOUT; + #endif + + return 1; +} + + +/** + * @brief The wii board disconnected. + * + * @param cc A pointer to a wii_board_t structure. + */ +void wii_board_disconnected(struct wii_board_t* wb) { + memset(wb, 0, sizeof(struct wii_board_t)); +} + +/** + * @brief Handle guitar event. + * + * @param cc A pointer to a classic_ctrl_t structure. + * @param msg The message specified in the event packet. + */ +void wii_board_event(struct wii_board_t* wb, byte* msg) { + short *shmsg = (short*)(msg); + wb->rtr = big_to_lil(shmsg[0]); + if(wb->rtr<0) wb->rtr = 0; + wb->rbr = big_to_lil(shmsg[1]); + if(wb->rbr<0) wb->rbr = 0; + wb->rtl = big_to_lil(shmsg[2]); + if(wb->rtl<0) wb->rtl = 0; + wb->rbl = big_to_lil(shmsg[3]); + if(wb->rbl<0) wb->rbl = 0; + + /* + Interpolate values + Calculations borrowed from wiili.org - No names to mention sadly :( http://www.wiili.org/index.php/Wii_Balance_Board_PC_Drivers page however! + */ + + if(wb->rtrctr[1]) + { + wb->tr = 68*(wb->rtr-wb->ctr[0])/(wb->ctr[1]-wb->ctr[0]); + } + else if(wb->rtr >= wb->ctr[1]) + { + wb->tr = 68*(wb->rtr-wb->ctr[1])/(wb->ctr[2]-wb->ctr[1]) + 68; + } + + if(wb->rtlctl[1]) + { + wb->tl = 68*(wb->rtl-wb->ctl[0])/(wb->ctl[1]-wb->ctl[0]); + } + else if(wb->rtl >= wb->ctl[1]) + { + wb->tl = 68*(wb->rtl-wb->ctl[1])/(wb->ctl[2]-wb->ctl[1]) + 68; + } + + if(wb->rbrcbr[1]) + { + wb->br = 68*(wb->rbr-wb->cbr[0])/(wb->cbr[1]-wb->cbr[0]); + } + else if(wb->rbr >= wb->cbr[1]) + { + wb->br = 68*(wb->rbr-wb->cbr[1])/(wb->cbr[2]-wb->cbr[1]) + 68; + } + + if(wb->rblcbl[1]) + { + wb->bl = 68*(wb->rbl-wb->cbl[0])/(wb->cbl[1]-wb->cbl[0]); + } + else if(wb->rbl >= wb->cbl[1]) + { + wb->bl = 68*(wb->rbl-wb->cbl[1])/(wb->cbl[2]-wb->cbl[1]) + 68; + } +} + +void wiiuse_set_wii_board_calib(struct wiimote_t *wm) +{ +} diff --git a/Externals/WiiUseSrc/Src/wiiboard.h b/Externals/WiiUseSrc/Src/wiiboard.h new file mode 100644 index 0000000000..eabbcf6998 --- /dev/null +++ b/Externals/WiiUseSrc/Src/wiiboard.h @@ -0,0 +1,53 @@ +/* + * wiiuse + * + * Written By: + * Michael Laforest < para > + * Email: < thepara (--AT--) g m a i l [--DOT--] com > + * + * Copyright 2006-2007 + * + * This file is part of wiiuse. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + * $Header$ + * + */ + +/** + * @file + * @brief Guitar Hero 3 expansion device. + */ + +#ifndef WII_BOARD_H_INCLUDED +#define WII_BOARD_H_INCLUDED + +#include "wiiuse_internal.h" + +#ifdef __cplusplus +extern "C" { +#endif + +int wii_board_handshake(struct wiimote_t* wm, struct wii_board_t* wb, byte* data, unsigned short len); + +void wii_board_disconnected(struct wii_board_t* wb); + +void wii_board_event(struct wii_board_t* wb, byte* msg); + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/Externals/WiiUseSrc/Src/wiiuse.h b/Externals/WiiUseSrc/Src/wiiuse.h index 46c7da12bd..5ac1fd2202 100644 --- a/Externals/WiiUseSrc/Src/wiiuse.h +++ b/Externals/WiiUseSrc/Src/wiiuse.h @@ -130,6 +130,7 @@ #define EXP_NUNCHUK 1 #define EXP_CLASSIC 2 #define EXP_GUITAR_HERO_3 3 +#define EXP_WII_BOARD 4 /* IR correction types */ typedef enum ir_position_t { @@ -452,6 +453,27 @@ typedef struct guitar_hero_3_t { struct joystick_t js; /**< joystick calibration */ } guitar_hero_3_t; +/* + Wii board +*/ +typedef struct wii_board_t { + short tl; /* Interpolated */ + short tr; + short bl; + short br; /* End interp */ + short rtl; /* RAW */ + short rtr; + short rbl; + short rbr; /* /RAW */ + short ltl; + short ltr; + short lbl; + short lbr; + short ctl[3]; /* Calibration */ + short ctr[3]; + short cbl[3]; + short cbr[3]; /* /Calibration */ +} wii_board_t; /** * @struct expansion_t @@ -464,6 +486,7 @@ typedef struct expansion_t { struct nunchuk_t nunchuk; struct classic_ctrl_t classic; struct guitar_hero_3_t gh3; + struct wii_board_t wb; }; } expansion_t; @@ -524,7 +547,9 @@ typedef enum WIIUSE_EVENT_TYPE { WIIUSE_CLASSIC_CTRL_INSERTED, WIIUSE_CLASSIC_CTRL_REMOVED, WIIUSE_GUITAR_HERO_3_CTRL_INSERTED, - WIIUSE_GUITAR_HERO_3_CTRL_REMOVED + WIIUSE_GUITAR_HERO_3_CTRL_REMOVED, + WIIUSE_WII_BOARD_CTRL_INSERTED, + WIIUSE_WII_BOARD_CTRL_REMOVED } WIIUSE_EVENT_TYPE; /** @@ -653,6 +678,8 @@ WIIUSE_EXPORT extern void wiiuse_set_nunchuk_accel_threshold(struct wiimote_t* w WIIUSE_EXPORT extern int wiiuse_io_read(struct wiimote_t* wm); WIIUSE_EXPORT extern int wiiuse_io_write(struct wiimote_t* wm, byte* buf, int len); +/* Balance Board */ +WIIUSE_EXPORT extern void wiiuse_set_wii_board_calib(struct wiimote_t *wm); #ifdef __cplusplus } diff --git a/Externals/WiiUseSrc/Src/wiiuse_internal.h b/Externals/WiiUseSrc/Src/wiiuse_internal.h index a12d19a61c..de445f73b7 100644 --- a/Externals/WiiUseSrc/Src/wiiuse_internal.h +++ b/Externals/WiiUseSrc/Src/wiiuse_internal.h @@ -152,6 +152,7 @@ /* encrypted expansion id codes (located at 0x04A400FC) */ #define EXP_ID_CODE_NUNCHUK 0x9A1EFEFE +#define EXP_ID_CODE_WII_BOARD 0xa4200402 #define EXP_ID_CODE_CLASSIC_CONTROLLER 0x9A1EFDFD #define EXP_ID_CODE_GUITAR 0x9A1EFDFB diff --git a/Externals/WiiUseSrc/wiiuse.suo b/Externals/WiiUseSrc/wiiuse.suo index 3dfa0ede36..f36b8326aa 100644 Binary files a/Externals/WiiUseSrc/wiiuse.suo and b/Externals/WiiUseSrc/wiiuse.suo differ diff --git a/Externals/WiiUseSrc/wiiuse.vcproj b/Externals/WiiUseSrc/wiiuse.vcproj index b18604f18a..f9ce68c4b7 100644 --- a/Externals/WiiUseSrc/wiiuse.vcproj +++ b/Externals/WiiUseSrc/wiiuse.vcproj @@ -443,6 +443,10 @@ RelativePath=".\Src\nunchuk.c" > + + @@ -488,6 +492,10 @@ RelativePath=".\Src\os.h" > + +