wiimote for osx WIP
git-svn-id: https://dolphin-emu.googlecode.com/svn/trunk@3109 8ced0084-cf51-0410-be5f-012b33b47a6e
This commit is contained in:
parent
63f84a491a
commit
3917941ae1
|
@ -24,10 +24,16 @@ if env['HAVE_BLUEZ']:
|
|||
if sys.platform == 'darwin':
|
||||
files += [ "io_osx.c", ]
|
||||
|
||||
env_wiiuse = env.Clone(
|
||||
CCFLAGS = env.filterWarnings(env['CCFLAGS']) + ' -fvisibility=default',
|
||||
CXXFLAGS = env.filterWarnings(env['CXXFLAGS']),
|
||||
)
|
||||
if sys.platform == 'darwin':
|
||||
env_wiiuse = env.Clone(
|
||||
CCFLAGS = env.filterWarnings(env['CCFLAGS']) + ' -fvisibility=default -x objective-c++',
|
||||
CXXFLAGS = env.filterWarnings(env['CXXFLAGS']) + ' -x objective-c++',
|
||||
)
|
||||
else:
|
||||
env_wiiuse = env.Clone(
|
||||
CCFLAGS = env.filterWarnings(env['CCFLAGS']) + ' -fvisibility=default',
|
||||
CXXFLAGS = env.filterWarnings(env['CXXFLAGS']),
|
||||
)
|
||||
|
||||
libs = [
|
||||
'm',
|
||||
|
|
|
@ -83,7 +83,7 @@ int classic_ctrl_handshake(struct wiimote_t* wm, struct classic_ctrl_t* cc, byte
|
|||
*/
|
||||
if (data[offset + 16] == 0xFF) {
|
||||
/* get the calibration data */
|
||||
byte* handshake_buf = malloc(EXP_HANDSHAKE_LEN * sizeof(byte));
|
||||
byte* handshake_buf = (byte *)malloc(EXP_HANDSHAKE_LEN * sizeof(byte));
|
||||
|
||||
WIIUSE_DEBUG("Classic controller handshake appears invalid, trying again.");
|
||||
wiiuse_read_data_cb(wm, handshake_expansion, handshake_buf, WM_EXP_MEM_CALIBR, EXP_HANDSHAKE_LEN);
|
||||
|
|
|
@ -631,7 +631,7 @@ static void handle_expansion(struct wiimote_t* wm, byte* msg) {
|
|||
* a handshake with the expansion.
|
||||
*/
|
||||
void handshake_expansion(struct wiimote_t* wm, byte* data, unsigned short len) {
|
||||
int id;
|
||||
int wid;
|
||||
|
||||
if (!data) {
|
||||
byte* handshake_buf;
|
||||
|
@ -649,7 +649,7 @@ void handshake_expansion(struct wiimote_t* wm, byte* data, unsigned short len) {
|
|||
wiiuse_write_data(wm, WM_EXP_MEM_ENABLE, &buf, 1);
|
||||
|
||||
/* get the calibration data */
|
||||
handshake_buf = malloc(EXP_HANDSHAKE_LEN * sizeof(byte));
|
||||
handshake_buf = (byte *)malloc(EXP_HANDSHAKE_LEN * sizeof(byte));
|
||||
wiiuse_read_data_cb(wm, handshake_expansion, handshake_buf, WM_EXP_MEM_CALIBR, EXP_HANDSHAKE_LEN);
|
||||
|
||||
/* tell the wiimote to send expansion data */
|
||||
|
@ -658,10 +658,10 @@ void handshake_expansion(struct wiimote_t* wm, byte* data, unsigned short len) {
|
|||
return;
|
||||
}
|
||||
|
||||
id = BIG_ENDIAN_LONG(*(int*)(data + 220));
|
||||
wid = BIG_ENDIAN_LONG(*(int*)(data + 220));
|
||||
|
||||
/* call the corresponding handshake function for this expansion */
|
||||
switch (id) {
|
||||
switch (wid) {
|
||||
case EXP_ID_CODE_NUNCHUK:
|
||||
{
|
||||
if (nunchuk_handshake(wm, &wm->exp.nunchuk, data, len))
|
||||
|
@ -682,7 +682,7 @@ void handshake_expansion(struct wiimote_t* wm, byte* data, unsigned short len) {
|
|||
}
|
||||
default:
|
||||
{
|
||||
WIIUSE_WARNING("Unknown expansion type. Code: 0x%x", id);
|
||||
WIIUSE_WARNING("Unknown expansion type. Code: 0x%x", wid);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
|
|
@ -88,7 +88,7 @@ int guitar_hero_3_handshake(struct wiimote_t* wm, struct guitar_hero_3_t* gh3, b
|
|||
*/
|
||||
if (data[offset + 16] == 0xFF) {
|
||||
/* get the calibration data */
|
||||
byte* handshake_buf = malloc(EXP_HANDSHAKE_LEN * sizeof(byte));
|
||||
byte* handshake_buf = (byte *)malloc(EXP_HANDSHAKE_LEN * sizeof(byte));
|
||||
|
||||
WIIUSE_DEBUG("Guitar Hero 3 handshake appears invalid, trying again.");
|
||||
wiiuse_read_data_cb(wm, handshake_expansion, handshake_buf, WM_EXP_MEM_CALIBR, EXP_HANDSHAKE_LEN);
|
||||
|
|
|
@ -37,12 +37,155 @@
|
|||
#include <stdlib.h>
|
||||
#include <unistd.h>
|
||||
|
||||
//osx inlcude
|
||||
#import <Foundation/NSObject.h>
|
||||
#import <IOBluetooth/objc/IOBluetoothDevice.h>
|
||||
#import <IOBluetooth/objc/IOBluetoothDeviceInquiry.h>
|
||||
#import <IOBluetooth/objc/IOBluetoothL2CAPChannel.h>
|
||||
|
||||
IOBluetoothDeviceInquiry *bti;
|
||||
IOBluetoothDevice * btd;
|
||||
IOBluetoothL2CAPChannel * _ichan;
|
||||
IOBluetoothL2CAPChannel * _cchan;
|
||||
|
||||
#include "definitions.h"
|
||||
#include "wiiuse_internal.h"
|
||||
#include "io.h"
|
||||
|
||||
static int wiiuse_connect_single(struct wiimote_t* wm, char* address);
|
||||
|
||||
@interface SearchBT: NSObject {}
|
||||
-(void) deviceInquiryComplete: (IOBluetoothDeviceInquiry*) sender
|
||||
error: (IOReturn) error
|
||||
aborted: (BOOL) aborted;
|
||||
-(void) deviceInquiryDeviceFound: (IOBluetoothDeviceInquiry*) sender
|
||||
device: (IOBluetoothDevice*) device;
|
||||
|
||||
@end
|
||||
|
||||
@interface ConnectBT: NSObject {}
|
||||
|
||||
-(void) connectToWiimotes;
|
||||
|
||||
- (IOBluetoothL2CAPChannel *) openL2CAPChannelWithPSM:(BluetoothL2CAPPSM) psm delegate:(id) delegate;
|
||||
@end
|
||||
|
||||
@implementation ConnectBT
|
||||
|
||||
#pragma mark -
|
||||
#pragma mark Bluetooth
|
||||
|
||||
- (void) l2capChannelOpenComplete:(IOBluetoothL2CAPChannel*) l2capChannel status:(IOReturn) error
|
||||
{
|
||||
//channel opened
|
||||
//something to do here ?
|
||||
}
|
||||
|
||||
|
||||
- (void)l2capChannelData:(IOBluetoothL2CAPChannel *) l2capChannel data:(unsigned char *)buffer length:(NSUInteger)length {
|
||||
//data ?
|
||||
//here we got data from wiimote
|
||||
printf("data %d\n",length);
|
||||
}
|
||||
|
||||
|
||||
|
||||
- (void) l2capChannelClosed:(IOBluetoothL2CAPChannel*) l2capChannel
|
||||
{
|
||||
//channel closed
|
||||
}
|
||||
|
||||
#pragma mark -
|
||||
- (IOBluetoothL2CAPChannel *) openL2CAPChannelWithPSM:(BluetoothL2CAPPSM) psm delegate:(id) delegate
|
||||
{
|
||||
IOBluetoothL2CAPChannel * channel = nil;
|
||||
IOReturn ret = kIOReturnSuccess;
|
||||
|
||||
printf("Open channel (PSM:%i) ...", psm);
|
||||
if ((ret = (IOReturn)[btd openL2CAPChannelSync:&channel withPSM:psm delegate:delegate]) != kIOReturnSuccess) {
|
||||
printf("Could not open L2CAP channel (psm:%i)", psm);
|
||||
channel = nil;
|
||||
//TODO : close the connection
|
||||
}
|
||||
|
||||
return channel;
|
||||
}
|
||||
|
||||
|
||||
-(void) connectToWiimotes
|
||||
{
|
||||
|
||||
NSEnumerator * en = [[bti foundDevices] objectEnumerator];
|
||||
|
||||
id device = nil;
|
||||
while ((device = [en nextObject]) != nil) {
|
||||
btd = device;
|
||||
|
||||
[btd openL2CAPChannelSync:&_cchan withPSM:kBluetoothL2CAPPSMHIDControl delegate:self];
|
||||
|
||||
if (!_cchan)
|
||||
printf("error when initialised cchan\n");
|
||||
|
||||
usleep (20000);
|
||||
|
||||
[btd openL2CAPChannelSync:&_ichan withPSM:kBluetoothL2CAPPSMHIDInterrupt delegate:self];
|
||||
|
||||
if (!_ichan)
|
||||
printf("error when initialised ichan\n");
|
||||
|
||||
usleep (20000);
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@end
|
||||
|
||||
@implementation SearchBT
|
||||
-(void) deviceInquiryComplete: (IOBluetoothDeviceInquiry*) sender
|
||||
error: (IOReturn) error
|
||||
aborted: (BOOL) aborted
|
||||
{
|
||||
int founded = [[bti foundDevices] count];
|
||||
CFRunLoopStop( CFRunLoopGetCurrent() );
|
||||
}
|
||||
-(void) deviceInquiryDeviceFound: (IOBluetoothDeviceInquiry*) sender
|
||||
device: (IOBluetoothDevice*) device
|
||||
{
|
||||
printf("discovered one wiimote%s\n", [[device getAddressString] UTF8String]);
|
||||
[bti stop];
|
||||
}
|
||||
|
||||
|
||||
|
||||
@end
|
||||
|
||||
SearchBT *sbt;
|
||||
ConnectBT *cbt;
|
||||
|
||||
void detectWiimote()
|
||||
{
|
||||
|
||||
[bti setDelegate: sbt];
|
||||
[bti setInquiryLength:20];
|
||||
[bti setSearchCriteria:kBluetoothServiceClassMajorAny majorDeviceClass:0x05 minorDeviceClass:0x01];
|
||||
[bti setUpdateNewDeviceNames:NO];
|
||||
|
||||
IOReturn ret = [bti start];
|
||||
if (ret == kIOReturnSuccess)
|
||||
{
|
||||
[bti retain];
|
||||
}
|
||||
else
|
||||
{
|
||||
printf("error when detecting wiimote\n");
|
||||
[bti setDelegate: nil];
|
||||
bti= nil;
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief Find a wiimote or wiimotes.
|
||||
*
|
||||
|
@ -60,20 +203,27 @@ static int wiiuse_connect_single(struct wiimote_t* wm, char* address);
|
|||
* devices.
|
||||
*/
|
||||
int wiiuse_find(struct wiimote_t** wm, int max_wiimotes, int timeout) {
|
||||
int found_devices;
|
||||
int found_wiimotes;
|
||||
|
||||
/* reset all wiimote bluetooth device addresses */
|
||||
/*for (found_wiimotes = 0; found_wiimotes < max_wiimotes; ++found_wiimotes)
|
||||
wm[found_wiimotes]->bdaddr = *BDADDR_ANY;
|
||||
*/
|
||||
found_wiimotes = 0;
|
||||
NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
|
||||
|
||||
WIIUSE_INFO("Found %i bluetooth device(s).", found_devices);
|
||||
sbt = [[SearchBT alloc] init];
|
||||
cbt = [[ConnectBT alloc] init];
|
||||
bti = [[IOBluetoothDeviceInquiry alloc] init];
|
||||
|
||||
detectWiimote();
|
||||
|
||||
CFRunLoopRun();
|
||||
|
||||
|
||||
[bti release];
|
||||
[sbt release];
|
||||
|
||||
[pool release];
|
||||
|
||||
|
||||
return 1;
|
||||
|
||||
WIIMOTE_ENABLE_STATE(wm[found_wiimotes], WIIMOTE_STATE_DEV_FOUND);
|
||||
|
||||
return found_wiimotes;
|
||||
}
|
||||
|
||||
|
||||
|
@ -94,19 +244,20 @@ int wiiuse_find(struct wiimote_t** wm, int max_wiimotes, int timeout) {
|
|||
* by the wiiuse_find() function, but can also be set manually.
|
||||
*/
|
||||
int wiiuse_connect(struct wiimote_t** wm, int wiimotes) {
|
||||
int connected = 0;
|
||||
int i = 0;
|
||||
|
||||
for (; i < wiimotes; ++i) {
|
||||
/*for (; i < wiimotes; ++i) {
|
||||
if (!WIIMOTE_IS_SET(wm[i], WIIMOTE_STATE_DEV_FOUND))
|
||||
/* if the device address is not set, skip it */
|
||||
// if the device address is not set, skip it
|
||||
continue;
|
||||
|
||||
if (wiiuse_connect_single(wm[i], NULL))
|
||||
++connected;
|
||||
}
|
||||
}*/
|
||||
wiiuse_connect_single(wm[i], NULL);
|
||||
|
||||
return connected;
|
||||
//return connected;
|
||||
return 1;
|
||||
}
|
||||
|
||||
|
||||
|
@ -124,14 +275,22 @@ static int wiiuse_connect_single(struct wiimote_t* wm, char* address) {
|
|||
if (!wm || WIIMOTE_IS_CONNECTED(wm))
|
||||
return 0;
|
||||
|
||||
//connect to the wiimote
|
||||
NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
|
||||
|
||||
WIIUSE_INFO("Connected to wiimote [id %i].", wm->unid);
|
||||
cbt = [[ConnectBT alloc] init];
|
||||
//start to connect to the wiimotes
|
||||
[cbt connectToWiimotes];
|
||||
|
||||
/* do the handshake */
|
||||
WIIMOTE_ENABLE_STATE(wm, WIIMOTE_STATE_CONNECTED);
|
||||
wiiuse_handshake(wm, NULL, 0);
|
||||
//run the main loop to get bt data
|
||||
CFRunLoopRun();
|
||||
/* do the handshake */
|
||||
WIIMOTE_ENABLE_STATE(wm, WIIMOTE_STATE_CONNECTED);
|
||||
wiiuse_handshake(wm, NULL, 0);
|
||||
|
||||
wiiuse_set_report_type(wm);
|
||||
wiiuse_set_report_type(wm);
|
||||
|
||||
[pool release];
|
||||
|
||||
return 1;
|
||||
}
|
||||
|
@ -150,18 +309,27 @@ void wiiuse_disconnect(struct wiimote_t* wm) {
|
|||
if (!wm || WIIMOTE_IS_CONNECTED(wm))
|
||||
return;
|
||||
|
||||
//TODO
|
||||
|
||||
WIIMOTE_DISABLE_STATE(wm, WIIMOTE_STATE_CONNECTED);
|
||||
WIIMOTE_DISABLE_STATE(wm, WIIMOTE_STATE_HANDSHAKE);
|
||||
}
|
||||
|
||||
|
||||
int wiiuse_io_read(struct wiimote_t* wm) {
|
||||
/* not used */
|
||||
return 0;
|
||||
|
||||
//TODO
|
||||
return 1;
|
||||
}
|
||||
|
||||
|
||||
int wiiuse_io_write(struct wiimote_t* wm, byte* buf, int len) {
|
||||
|
||||
NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
|
||||
[_cchan writeSync:buf length:len];
|
||||
|
||||
usleep (10000);
|
||||
[pool release];
|
||||
return 1;
|
||||
}
|
||||
|
||||
|
|
|
@ -81,7 +81,7 @@ int nunchuk_handshake(struct wiimote_t* wm, struct nunchuk_t* nc, byte* data, un
|
|||
*/
|
||||
if (data[offset + 16] == 0xFF) {
|
||||
/* get the calibration data */
|
||||
byte* handshake_buf = malloc(EXP_HANDSHAKE_LEN * sizeof(byte));
|
||||
byte* handshake_buf = (byte *)malloc(EXP_HANDSHAKE_LEN * sizeof(byte));
|
||||
|
||||
WIIUSE_DEBUG("Nunchuk handshake appears invalid, trying again.");
|
||||
wiiuse_read_data_cb(wm, handshake_expansion, handshake_buf, WM_EXP_MEM_CALIBR, EXP_HANDSHAKE_LEN);
|
||||
|
|
|
@ -115,10 +115,10 @@ struct wiimote_t** wiiuse_init(int wiimotes) {
|
|||
if (!wiimotes)
|
||||
return NULL;
|
||||
|
||||
wm = malloc(sizeof(struct wiimote_t*) * wiimotes);
|
||||
wm = (wiimote_t **)malloc(sizeof(struct wiimote_t*) * wiimotes);
|
||||
|
||||
for (i = 0; i < wiimotes; ++i) {
|
||||
wm[i] = malloc(sizeof(struct wiimote_t));
|
||||
wm[i] = (wiimote_t *)malloc(sizeof(struct wiimote_t));
|
||||
memset(wm[i], 0, sizeof(struct wiimote_t));
|
||||
|
||||
wm[i]->unid = i+1;
|
||||
|
|
|
@ -37,9 +37,17 @@ if wmenv['HAVE_WIIUSE']:
|
|||
files += [ "ReadWiimote.cpp" ]
|
||||
cxxflags += ['-DHAVE_WIIUSE']
|
||||
|
||||
wmenv.Append(
|
||||
CXXFLAGS = cxxflags,
|
||||
LIBS = libs,
|
||||
)
|
||||
if sys.platform == 'darwin':
|
||||
wmenv.Append(
|
||||
CXXFLAGS = cxxflags,
|
||||
LINKFLAGS = ['-framework' ,'IOBluetooth'],
|
||||
LIBS = libs,
|
||||
)
|
||||
else:
|
||||
wmenv.Append(
|
||||
CXXFLAGS = cxxflags,
|
||||
LIBS = libs,
|
||||
)
|
||||
|
||||
|
||||
wmenv.SharedLibrary(env['plugin_dir']+name, files)
|
||||
|
|
Loading…
Reference in New Issue