Now the XBOXRECV doesn't conflict as well

Also hci_handle is reset when you disconnect
This commit is contained in:
Kristian Sloth Lauszus 2013-01-28 00:55:01 +01:00
parent d2bb7b8338
commit a96c3c4633
8 changed files with 85 additions and 76 deletions

View file

@ -77,7 +77,7 @@ uint8_t PS3BT::getAnalogButton(Button a) {
uint8_t PS3BT::getAnalogHat(AnalogHat a) { uint8_t PS3BT::getAnalogHat(AnalogHat a) {
if (l2capinbuf == NULL) if (l2capinbuf == NULL)
return 0; return 0;
return (uint8_t)(l2capinbuf[(uint16_t)a]); return (uint8_t)(l2capinbuf[(uint8_t)a+15]);
} }
int16_t PS3BT::getSensor(Sensor a) { int16_t PS3BT::getSensor(Sensor a) {
if (l2capinbuf == NULL) if (l2capinbuf == NULL)
@ -496,6 +496,7 @@ void PS3BT::L2CAP_task() {
Notify(PSTR("\r\nDisconnected Control Channel")); Notify(PSTR("\r\nDisconnected Control Channel"));
#endif #endif
pBtd->hci_disconnect(hci_handle); pBtd->hci_disconnect(hci_handle);
hci_handle = -1; // Reset handle
l2cap_event_flag = 0; // Reset flags l2cap_event_flag = 0; // Reset flags
l2cap_state = L2CAP_WAIT; l2cap_state = L2CAP_WAIT;
} }

View file

@ -48,13 +48,13 @@ const uint32_t BUTTONS[] PROGMEM = {
0x0200, // R2 0x0200, // R2
0x0400, // L1 0x0400, // L1
0x0800, // R1 0x0800, // R1
0x1000, // TRIANGLE 0x1000, // TRIANGLE
0x2000, // CIRCLE 0x2000, // CIRCLE
0x4000, // CROSS 0x4000, // CROSS
0x8000, // SQUARE 0x8000, // SQUARE
0x010000, // PS 0x010000, // PS
0x080000, // MOVE - covers 12 bits - we only need to read the top 8 0x080000, // MOVE - covers 12 bits - we only need to read the top 8
0x100000 // T - covers 12 bits - we only need to read the top 8 0x100000 // T - covers 12 bits - we only need to read the top 8
}; };
@ -78,7 +78,7 @@ const uint8_t ANALOGBUTTONS[] PROGMEM = {
34, // SQUARE_ANALOG 34, // SQUARE_ANALOG
0,0, // Skip PS and MOVE 0,0, // Skip PS and MOVE
//Playstation Move Controller // Playstation Move Controller
15 // T_ANALOG - Both at byte 14 (last reading) and byte 15 (current reading) 15 // T_ANALOG - Both at byte 14 (last reading) and byte 15 (current reading)
}; };
@ -95,13 +95,6 @@ enum Colors {
White = 0xFFFFFF, // r = 255, g = 255, b = 255 White = 0xFFFFFF, // r = 255, g = 255, b = 255
Off = 0x00, // r = 0, g = 0, b = 0 Off = 0x00, // r = 0, g = 0, b = 0
}; };
enum AnalogHat {
// Note that the location is shiftet 9 when it's connected via USB
LeftHatX = 15,
LeftHatY = 16,
RightHatX = 17,
RightHatY = 18,
};
enum Sensor { enum Sensor {
// Note that the location is shiftet 9 when it's connected via USB // Note that the location is shiftet 9 when it's connected via USB
// Sensors inside the Sixaxis Dualshock 3 controller // Sensors inside the Sixaxis Dualshock 3 controller

View file

@ -343,7 +343,7 @@ uint8_t PS3USB::getAnalogButton(Button a) {
uint8_t PS3USB::getAnalogHat(AnalogHat a) { uint8_t PS3USB::getAnalogHat(AnalogHat a) {
if (readBuf == NULL) if (readBuf == NULL)
return 0; return 0;
return (uint8_t)(readBuf[((uint16_t)a)-9]); return (uint8_t)(readBuf[((uint8_t)a+6)]);
} }
uint16_t PS3USB::getSensor(Sensor a) { uint16_t PS3USB::getSensor(Sensor a) {
if (readBuf == NULL) if (readBuf == NULL)

View file

@ -432,6 +432,7 @@ void SPP::SDP_task() {
RFCOMMConnected = false; RFCOMMConnected = false;
SDPConnected = false; SDPConnected = false;
pBtd->hci_disconnect(hci_handle); pBtd->hci_disconnect(hci_handle);
hci_handle = -1; // Reset handle
l2cap_event_flag = 0; // Reset flags l2cap_event_flag = 0; // Reset flags
l2cap_sdp_state = L2CAP_SDP_WAIT; l2cap_sdp_state = L2CAP_SDP_WAIT;
l2cap_rfcomm_state = L2CAP_RFCOMM_WAIT; l2cap_rfcomm_state = L2CAP_RFCOMM_WAIT;

17
Wii.cpp
View file

@ -44,17 +44,18 @@ const uint32_t BUTTONS[] PROGMEM = {
0x00004, // DOWN 0x00004, // DOWN
0x00001, // LEFT 0x00001, // LEFT
0, // Skip
0x00010, // PLUS 0x00010, // PLUS
0x00100, // TWO 0x00100, // TWO
0x00200, // ONE 0x00200, // ONE
0x00400, // B
0x00800, // A
0x01000, // MINUS 0x01000, // MINUS
0x08000, // HOME 0x08000, // HOME
0x10000, // Z 0x10000, // Z
0x20000 // C 0x20000, // C
0x00400, // B
0x00800 // A
}; };
WII::WII(BTD *p, bool pair): WII::WII(BTD *p, bool pair):
@ -82,6 +83,7 @@ void WII::Reset() {
activateNunchuck = false; activateNunchuck = false;
motionValuesReset = false; motionValuesReset = false;
activeConnection = false; activeConnection = false;
pBtd->motionPlusInside = false;
l2cap_event_flag = 0; // Reset flags l2cap_event_flag = 0; // Reset flags
l2cap_state = L2CAP_WAIT; l2cap_state = L2CAP_WAIT;
} }
@ -91,13 +93,10 @@ void WII::disconnect() { // Use this void to disconnect any of the controllers
pBtd->l2cap_disconnection_request(hci_handle,0x0A, interrupt_scid, interrupt_dcid); pBtd->l2cap_disconnection_request(hci_handle,0x0A, interrupt_scid, interrupt_dcid);
Reset(); Reset();
l2cap_state = L2CAP_INTERRUPT_DISCONNECT; l2cap_state = L2CAP_INTERRUPT_DISCONNECT;
pBtd->motionPlusInside = false;
} }
void WII::ACLData(uint8_t* l2capinbuf) { void WII::ACLData(uint8_t* l2capinbuf) {
if (((l2capinbuf[0] | (l2capinbuf[1] << 8)) == (hci_handle | 0x2000)) || (pBtd->incomingWii && !wiimoteConnected && !activeConnection)) { // acl_handle_ok or it's a new connection if (((l2capinbuf[0] | (l2capinbuf[1] << 8)) == (hci_handle | 0x2000)) || (pBtd->incomingWii && !wiimoteConnected && !activeConnection)) { // acl_handle_ok or it's a new connection
pBtd->incomingWii = false;
activeConnection = true;
if ((l2capinbuf[6] | (l2capinbuf[7] << 8)) == 0x0001) { //l2cap_control - Channel ID for ACL-U if ((l2capinbuf[6] | (l2capinbuf[7] << 8)) == 0x0001) { //l2cap_control - Channel ID for ACL-U
if (l2capinbuf[8] == L2CAP_CMD_COMMAND_REJECT) { if (l2capinbuf[8] == L2CAP_CMD_COMMAND_REJECT) {
#ifdef DEBUG #ifdef DEBUG
@ -626,6 +625,7 @@ void WII::L2CAP_task() {
Notify(PSTR("\r\nDisconnected Control Channel")); Notify(PSTR("\r\nDisconnected Control Channel"));
#endif #endif
pBtd->hci_disconnect(hci_handle); pBtd->hci_disconnect(hci_handle);
hci_handle = -1; // Reset handle
l2cap_event_flag = 0; // Reset flags l2cap_event_flag = 0; // Reset flags
l2cap_state = L2CAP_WAIT; l2cap_state = L2CAP_WAIT;
} }
@ -649,6 +649,7 @@ void WII::Run() {
} else if (l2cap_connection_request_control_flag) { } else if (l2cap_connection_request_control_flag) {
hci_handle = pBtd->hci_handle; hci_handle = pBtd->hci_handle;
pBtd->incomingWii = false; pBtd->incomingWii = false;
activeConnection = true;
#ifdef DEBUG #ifdef DEBUG
Notify(PSTR("\r\nHID Control Incoming Connection Request")); Notify(PSTR("\r\nHID Control Incoming Connection Request"));
#endif #endif

View file

@ -22,6 +22,37 @@
//#define EXTRADEBUG // Uncomment to get even more debugging data //#define EXTRADEBUG // Uncomment to get even more debugging data
//#define PRINTREPORT // Uncomment to print the report send by the Xbox 360 Controller //#define PRINTREPORT // Uncomment to print the report send by the Xbox 360 Controller
const uint8_t LEDS[] PROGMEM = {
0x02, // LED1
0x03, // LED2
0x04, // LED3
0x05, // LED4
0x01 // ALL - Used to blink all LEDs
};
const uint16_t BUTTONS[] PROGMEM = {
0x0100, // UP
0x0800, // RIGHT
0x0200, // DOWN
0x0400, // LEFT
0x2000, // BACK
0x4000, // L3
0x8000, // R3
0x1000, // START
0,0, // Skip L2 and R2 as these are analog buttons
0x0001, // L1
0x0002, // R1
0x0020, // B
0x0010, // A
0x0040, // X
0x0080, // Y
0x0004, // XBOX
0x0008 // SYNC
};
XBOXRECV::XBOXRECV(USB *p): XBOXRECV::XBOXRECV(USB *p):
pUsb(p), // pointer to USB class instance - mandatory pUsb(p), // pointer to USB class instance - mandatory
bAddress(0), // device address - mandatory bAddress(0), // device address - mandatory
@ -381,7 +412,7 @@ uint8_t XBOXRECV::getButtonPress(uint8_t controller, Button b) {
return (uint8_t)(ButtonState[controller] >> 8); return (uint8_t)(ButtonState[controller] >> 8);
else if(b == R2) else if(b == R2)
return (uint8_t)ButtonState[controller]; return (uint8_t)ButtonState[controller];
return (ButtonState[controller] & ((uint32_t)b << 16)); return (ButtonState[controller] & ((uint32_t)pgm_read_word(&BUTTONS[(uint8_t)b]) << 16));
} }
bool XBOXRECV::getButtonClick(uint8_t controller, Button b) { bool XBOXRECV::getButtonClick(uint8_t controller, Button b) {
if(b == L2) { if(b == L2) {
@ -391,15 +422,16 @@ bool XBOXRECV::getButtonClick(uint8_t controller, Button b) {
} }
return false; return false;
} }
else if(b== R2) { else if(b == R2) {
if(R2Clicked[controller]) { if(R2Clicked[controller]) {
R2Clicked[controller] = false; R2Clicked[controller] = false;
return true; return true;
} }
return false; return false;
} }
bool click = (ButtonClickState[controller] & (uint16_t)b); uint16_t button = pgm_read_word(&BUTTONS[(uint8_t)b]);
ButtonClickState[controller] &= ~((uint16_t)b); // clear "click" event bool click = (ButtonClickState[controller] & button);
ButtonClickState[controller] &= ~button; // clear "click" event
return click; return click;
} }
int16_t XBOXRECV::getAnalogHat(uint8_t controller, AnalogHat a) { int16_t XBOXRECV::getAnalogHat(uint8_t controller, AnalogHat a) {
@ -461,10 +493,10 @@ void XBOXRECV::setLedRaw(uint8_t controller, uint8_t value) {
} }
void XBOXRECV::setLedOn(uint8_t controller, LED led) { void XBOXRECV::setLedOn(uint8_t controller, LED led) {
if(led != ALL) // All LEDs can't be on a the same time if(led != ALL) // All LEDs can't be on a the same time
setLedRaw(controller,((uint8_t)led)+4); setLedRaw(controller,(pgm_read_byte(&LEDS[(uint8_t)led]))+4);
} }
void XBOXRECV::setLedBlink(uint8_t controller, LED led) { void XBOXRECV::setLedBlink(uint8_t controller, LED led) {
setLedRaw(controller,(uint8_t)led); setLedRaw(controller,pgm_read_byte(&LEDS[(uint8_t)led]));
} }
void XBOXRECV::setLedMode(uint8_t controller, LEDMode ledMode) { // This function is used to do some speciel LED stuff the controller supports void XBOXRECV::setLedMode(uint8_t controller, LEDMode ledMode) { // This function is used to do some speciel LED stuff the controller supports
setLedRaw(controller,(uint8_t)ledMode); setLedRaw(controller,(uint8_t)ledMode);

View file

@ -27,6 +27,7 @@
#endif #endif
#include "Usb.h" #include "Usb.h"
#include "controllerEnums.h"
/* Data Xbox 360 taken from descriptors */ /* Data Xbox 360 taken from descriptors */
#define EP_MAXPKTSIZE 32 // max size for data via USB #define EP_MAXPKTSIZE 32 // max size for data via USB
@ -54,13 +55,6 @@
#define XBOX_MAX_ENDPOINTS 9 #define XBOX_MAX_ENDPOINTS 9
enum LED {
ALL = 0x01, // Used to blink all LEDs
LED1 = 0x02,
LED2 = 0x03,
LED3 = 0x04,
LED4 = 0x05,
};
enum LEDMode { enum LEDMode {
ROTATING = 0x0A, ROTATING = 0x0A,
FASTBLINK = 0x0B, FASTBLINK = 0x0B,
@ -68,38 +62,6 @@ enum LEDMode {
ALTERNATING = 0x0D, ALTERNATING = 0x0D,
}; };
enum Button {
L1 = 0x0001,
R1 = 0x0002,
XBOX = 0x0004,
SYNC = 0x0008,
A = 0x0010,
B = 0x0020,
X = 0x0040,
Y = 0x0080,
UP = 0x0100,
DOWN = 0x0200,
LEFT = 0x0400,
RIGHT = 0x0800,
START = 0x1000,
BACK = 0x2000,
L3 = 0x4000,
R3 = 0x8000,
// These buttons are analog buttons
L2,
R2,
};
enum AnalogHat {
LeftHatX = 0,
LeftHatY = 1,
RightHatX = 2,
RightHatY = 3,
};
class XBOXRECV : public USBDeviceConfig { class XBOXRECV : public USBDeviceConfig {
public: public:
XBOXRECV(USB *pUsb); XBOXRECV(USB *pUsb);

View file

@ -18,6 +18,10 @@
#ifndef _controllerenums_h #ifndef _controllerenums_h
#define _controllerenums_h #define _controllerenums_h
/*
This header file is used to store different enums for the controllers,
This is necessary so all the different libraries can be used at once
*/
enum LED { enum LED {
/* Enum used to turn on the LEDs on the different controllers */ /* Enum used to turn on the LEDs on the different controllers */
@ -32,6 +36,7 @@ enum LED {
LED8 = 7, LED8 = 7,
LED9 = 8, LED9 = 8,
LED10 = 9, LED10 = 9,
ALL = 4, // Used to blink all LEDs on the Xbox controller
}; };
enum Button { enum Button {
UP = 0, UP = 0,
@ -40,15 +45,15 @@ enum Button {
LEFT = 3, LEFT = 3,
/* Wii buttons */ /* Wii buttons */
PLUS = 4, PLUS = 5,
TWO = 5, TWO = 6,
ONE = 6, ONE = 7,
B = 7, MINUS = 8,
A = 8, HOME = 9,
MINUS = 9, Z = 10,
HOME = 10, C = 11,
Z = 11, B = 12,
C = 12, A = 13,
/* PS3 controllers buttons */ /* PS3 controllers buttons */
SELECT = 4, SELECT = 4,
@ -69,6 +74,20 @@ enum Button {
MOVE = 17, // covers 12 bits - we only need to read the top 8 MOVE = 17, // covers 12 bits - we only need to read the top 8
T = 18, // covers 12 bits - we only need to read the top 8 T = 18, // covers 12 bits - we only need to read the top 8
/* Xbox buttons */
BACK = 4,
X = 14,
Y = 15,
XBOX = 16,
SYNC = 17,
};
enum AnalogHat {
/* Joysticks on the PS3 and Xbox controllers */
LeftHatX = 0,
LeftHatY = 1,
RightHatX = 2,
RightHatY = 3,
}; };
#endif #endif