mirror of
https://github.com/felis/USB_Host_Shield_2.0.git
synced 2024-03-22 11:31:26 +01:00
Now works properly with hubs
This commit is contained in:
parent
b967d610c0
commit
136d854cef
6 changed files with 57 additions and 103 deletions
|
@ -24,7 +24,7 @@ const uint8_t PS3BT::BTD_EVENT_PIPE = 1;
|
||||||
const uint8_t PS3BT::BTD_DATAIN_PIPE = 2;
|
const uint8_t PS3BT::BTD_DATAIN_PIPE = 2;
|
||||||
const uint8_t PS3BT::BTD_DATAOUT_PIPE = 3;
|
const uint8_t PS3BT::BTD_DATAOUT_PIPE = 3;
|
||||||
|
|
||||||
uint8_t OUTPUT_REPORT_BUFFER[] PROGMEM = {
|
const uint8_t OUTPUT_REPORT_BUFFER[] PROGMEM = {
|
||||||
0x00, 0x00, 0x00, 0x00, 0x00,
|
0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
0x00, 0x00, 0x00, 0x00, 0x00,
|
0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
0xff, 0x27, 0x10, 0x00, 0x32,
|
0xff, 0x27, 0x10, 0x00, 0x32,
|
||||||
|
@ -306,6 +306,7 @@ FailUnknownDevice:
|
||||||
Notify(PSTR(" PID: "));
|
Notify(PSTR(" PID: "));
|
||||||
PrintHex<uint16_t>(PID);
|
PrintHex<uint16_t>(PID);
|
||||||
#endif
|
#endif
|
||||||
|
rcode = -1;
|
||||||
goto Fail;
|
goto Fail;
|
||||||
Fail:
|
Fail:
|
||||||
#ifdef DEBUG
|
#ifdef DEBUG
|
||||||
|
|
107
PS3USB.cpp
107
PS3USB.cpp
|
@ -20,7 +20,7 @@
|
||||||
//#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 PS3 Controllers
|
//#define PRINTREPORT // Uncomment to print the report send by the PS3 Controllers
|
||||||
|
|
||||||
prog_char PS3_REPORT_BUFFER[] PROGMEM = {
|
const uint8_t PS3_REPORT_BUFFER[] PROGMEM = {
|
||||||
0x00, 0x00, 0x00, 0x00, 0x00,
|
0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
0x00, 0x00, 0x00, 0x00, 0x00,
|
0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
0xff, 0x27, 0x10, 0x00, 0x32,
|
0xff, 0x27, 0x10, 0x00, 0x32,
|
||||||
|
@ -31,7 +31,7 @@ prog_char PS3_REPORT_BUFFER[] PROGMEM = {
|
||||||
0x00, 0x00, 0x00, 0x00, 0x00,
|
0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
|
||||||
};
|
};
|
||||||
prog_char MOVE_REPORT_BUFFER[] PROGMEM = {
|
const uint8_t MOVE_REPORT_BUFFER[] PROGMEM = {
|
||||||
0x02, 0x00, // Always 0x02, 0x00,
|
0x02, 0x00, // Always 0x02, 0x00,
|
||||||
0x00, 0x00, 0x00, // r, g, b,
|
0x00, 0x00, 0x00, // r, g, b,
|
||||||
0x00, // Always 0x00,
|
0x00, // Always 0x00,
|
||||||
|
@ -43,8 +43,7 @@ pUsb(p), // pointer to USB class instance - mandatory
|
||||||
bAddress(0), // device address - mandatory
|
bAddress(0), // device address - mandatory
|
||||||
bPollEnable(false) // don't start polling before dongle is connected
|
bPollEnable(false) // don't start polling before dongle is connected
|
||||||
{
|
{
|
||||||
for(uint8_t i=0; i<PS3_MAX_ENDPOINTS; i++)
|
for(uint8_t i=0; i<PS3_MAX_ENDPOINTS; i++) {
|
||||||
{
|
|
||||||
epInfo[i].epAddr = 0;
|
epInfo[i].epAddr = 0;
|
||||||
epInfo[i].maxPktSize = (i) ? 0 : 8;
|
epInfo[i].maxPktSize = (i) ? 0 : 8;
|
||||||
epInfo[i].epAttribs = 0;
|
epInfo[i].epAttribs = 0;
|
||||||
|
@ -62,8 +61,7 @@ bPollEnable(false) // don't start polling before dongle is connected
|
||||||
my_bdaddr[0] = btadr0;
|
my_bdaddr[0] = btadr0;
|
||||||
}
|
}
|
||||||
|
|
||||||
uint8_t PS3USB::Init(uint8_t parent, uint8_t port, bool lowspeed)
|
uint8_t PS3USB::Init(uint8_t parent, uint8_t port, bool lowspeed) {
|
||||||
{
|
|
||||||
uint8_t buf[sizeof(USB_DEVICE_DESCRIPTOR)];
|
uint8_t buf[sizeof(USB_DEVICE_DESCRIPTOR)];
|
||||||
uint8_t rcode;
|
uint8_t rcode;
|
||||||
UsbDevice *p = NULL;
|
UsbDevice *p = NULL;
|
||||||
|
@ -77,8 +75,7 @@ uint8_t PS3USB::Init(uint8_t parent, uint8_t port, bool lowspeed)
|
||||||
Notify(PSTR("\r\nPS3USB Init"));
|
Notify(PSTR("\r\nPS3USB Init"));
|
||||||
#endif
|
#endif
|
||||||
// check if address has already been assigned to an instance
|
// check if address has already been assigned to an instance
|
||||||
if (bAddress)
|
if (bAddress) {
|
||||||
{
|
|
||||||
#ifdef DEBUG
|
#ifdef DEBUG
|
||||||
Notify(PSTR("\r\nAddress in use"));
|
Notify(PSTR("\r\nAddress in use"));
|
||||||
#endif
|
#endif
|
||||||
|
@ -88,16 +85,14 @@ uint8_t PS3USB::Init(uint8_t parent, uint8_t port, bool lowspeed)
|
||||||
// Get pointer to pseudo device with address 0 assigned
|
// Get pointer to pseudo device with address 0 assigned
|
||||||
p = addrPool.GetUsbDevicePtr(0);
|
p = addrPool.GetUsbDevicePtr(0);
|
||||||
|
|
||||||
if (!p)
|
if (!p) {
|
||||||
{
|
|
||||||
#ifdef DEBUG
|
#ifdef DEBUG
|
||||||
Notify(PSTR("\r\nAddress not found"));
|
Notify(PSTR("\r\nAddress not found"));
|
||||||
#endif
|
#endif
|
||||||
return USB_ERROR_ADDRESS_NOT_FOUND_IN_POOL;
|
return USB_ERROR_ADDRESS_NOT_FOUND_IN_POOL;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!p->epinfo)
|
if (!p->epinfo) {
|
||||||
{
|
|
||||||
#ifdef DEBUG
|
#ifdef DEBUG
|
||||||
Notify(PSTR("\r\nepinfo is null"));
|
Notify(PSTR("\r\nepinfo is null"));
|
||||||
#endif
|
#endif
|
||||||
|
@ -132,8 +127,7 @@ uint8_t PS3USB::Init(uint8_t parent, uint8_t port, bool lowspeed)
|
||||||
|
|
||||||
// Assign new address to the device
|
// Assign new address to the device
|
||||||
rcode = pUsb->setAddr( 0, 0, bAddress );
|
rcode = pUsb->setAddr( 0, 0, bAddress );
|
||||||
if (rcode)
|
if (rcode) {
|
||||||
{
|
|
||||||
p->lowspeed = false;
|
p->lowspeed = false;
|
||||||
addrPool.FreeAddress(bAddress);
|
addrPool.FreeAddress(bAddress);
|
||||||
bAddress = 0;
|
bAddress = 0;
|
||||||
|
@ -193,8 +187,7 @@ uint8_t PS3USB::Init(uint8_t parent, uint8_t port, bool lowspeed)
|
||||||
if( rcode )
|
if( rcode )
|
||||||
goto FailSetConf;
|
goto FailSetConf;
|
||||||
|
|
||||||
if(PID == PS3_PID || PID == PS3NAVIGATION_PID)
|
if(PID == PS3_PID || PID == PS3NAVIGATION_PID) {
|
||||||
{
|
|
||||||
if(PID == PS3_PID) {
|
if(PID == PS3_PID) {
|
||||||
#ifdef DEBUG
|
#ifdef DEBUG
|
||||||
Notify(PSTR("\r\nDualshock 3 Controller Connected"));
|
Notify(PSTR("\r\nDualshock 3 Controller Connected"));
|
||||||
|
@ -218,8 +211,7 @@ uint8_t PS3USB::Init(uint8_t parent, uint8_t port, bool lowspeed)
|
||||||
for (uint8_t i = 6; i < 10; i++)
|
for (uint8_t i = 6; i < 10; i++)
|
||||||
readBuf[i] = 0x7F; // Set the analog joystick values to center position
|
readBuf[i] = 0x7F; // Set the analog joystick values to center position
|
||||||
}
|
}
|
||||||
else // must be a Motion controller
|
else { // must be a Motion controller
|
||||||
{
|
|
||||||
#ifdef DEBUG
|
#ifdef DEBUG
|
||||||
Notify(PSTR("\r\nMotion Controller Connected"));
|
Notify(PSTR("\r\nMotion Controller Connected"));
|
||||||
#endif
|
#endif
|
||||||
|
@ -263,6 +255,7 @@ FailUnknownDevice:
|
||||||
Notify(PSTR(" PID: "));
|
Notify(PSTR(" PID: "));
|
||||||
PrintHex<uint16_t>(PID);
|
PrintHex<uint16_t>(PID);
|
||||||
#endif
|
#endif
|
||||||
|
rcode = -1;
|
||||||
goto Fail;
|
goto Fail;
|
||||||
Fail:
|
Fail:
|
||||||
#ifdef DEBUG
|
#ifdef DEBUG
|
||||||
|
@ -274,8 +267,7 @@ Fail:
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Performs a cleanup after failed Init() attempt */
|
/* Performs a cleanup after failed Init() attempt */
|
||||||
uint8_t PS3USB::Release()
|
uint8_t PS3USB::Release() {
|
||||||
{
|
|
||||||
PS3Connected = false;
|
PS3Connected = false;
|
||||||
PS3MoveConnected = false;
|
PS3MoveConnected = false;
|
||||||
PS3NavigationConnected = false;
|
PS3NavigationConnected = false;
|
||||||
|
@ -284,8 +276,7 @@ uint8_t PS3USB::Release()
|
||||||
bPollEnable = false;
|
bPollEnable = false;
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
uint8_t PS3USB::Poll()
|
uint8_t PS3USB::Poll() {
|
||||||
{
|
|
||||||
if (!bPollEnable)
|
if (!bPollEnable)
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
|
@ -309,8 +300,7 @@ uint8_t PS3USB::Poll()
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
void PS3USB::readReport()
|
void PS3USB::readReport() {
|
||||||
{
|
|
||||||
if (readBuf == NULL)
|
if (readBuf == NULL)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
|
@ -319,8 +309,7 @@ void PS3USB::readReport()
|
||||||
//Notify(PSTR("\r\nButtonState");
|
//Notify(PSTR("\r\nButtonState");
|
||||||
//PrintHex<uint32_t>(ButtonState);
|
//PrintHex<uint32_t>(ButtonState);
|
||||||
|
|
||||||
if(ButtonState != OldButtonState)
|
if(ButtonState != OldButtonState) {
|
||||||
{
|
|
||||||
buttonChanged = true;
|
buttonChanged = true;
|
||||||
if(ButtonState != 0x00) {
|
if(ButtonState != 0x00) {
|
||||||
buttonPressed = true;
|
buttonPressed = true;
|
||||||
|
@ -330,8 +319,7 @@ void PS3USB::readReport()
|
||||||
buttonReleased = true;
|
buttonReleased = true;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else
|
else {
|
||||||
{
|
|
||||||
buttonChanged = false;
|
buttonChanged = false;
|
||||||
buttonPressed = false;
|
buttonPressed = false;
|
||||||
buttonReleased = false;
|
buttonReleased = false;
|
||||||
|
@ -340,8 +328,7 @@ void PS3USB::readReport()
|
||||||
OldButtonState = ButtonState;
|
OldButtonState = ButtonState;
|
||||||
}
|
}
|
||||||
|
|
||||||
void PS3USB::printReport() //Uncomment "#define PRINTREPORT" to print the report send by the PS3 Controllers
|
void PS3USB::printReport() { //Uncomment "#define PRINTREPORT" to print the report send by the PS3 Controllers
|
||||||
{
|
|
||||||
if (readBuf == NULL)
|
if (readBuf == NULL)
|
||||||
return;
|
return;
|
||||||
for(uint8_t i = 0; i < PS3_REPORT_BUFFER_SIZE;i++)
|
for(uint8_t i = 0; i < PS3_REPORT_BUFFER_SIZE;i++)
|
||||||
|
@ -352,8 +339,7 @@ void PS3USB::printReport() //Uncomment "#define PRINTREPORT" to print the report
|
||||||
Serial.println("");
|
Serial.println("");
|
||||||
}
|
}
|
||||||
|
|
||||||
bool PS3USB::getButton(Button b)
|
bool PS3USB::getButton(Button b) {
|
||||||
{
|
|
||||||
if (readBuf == NULL)
|
if (readBuf == NULL)
|
||||||
return false;
|
return false;
|
||||||
if ((readBuf[(uint16_t)b >> 8] & ((uint8_t)b & 0xff)) > 0)
|
if ((readBuf[(uint16_t)b >> 8] & ((uint8_t)b & 0xff)) > 0)
|
||||||
|
@ -361,20 +347,17 @@ bool PS3USB::getButton(Button b)
|
||||||
else
|
else
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
uint8_t PS3USB::getAnalogButton(AnalogButton a)
|
uint8_t PS3USB::getAnalogButton(AnalogButton a) {
|
||||||
{
|
|
||||||
if (readBuf == NULL)
|
if (readBuf == NULL)
|
||||||
return 0;
|
return 0;
|
||||||
return (uint8_t)(readBuf[(uint16_t)a]);
|
return (uint8_t)(readBuf[(uint16_t)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]);
|
return (uint8_t)(readBuf[(uint16_t)a]);
|
||||||
}
|
}
|
||||||
uint16_t PS3USB::getSensor(Sensor a)
|
uint16_t PS3USB::getSensor(Sensor a) {
|
||||||
{
|
|
||||||
if (readBuf == NULL)
|
if (readBuf == NULL)
|
||||||
return 0;
|
return 0;
|
||||||
return ((readBuf[(uint16_t)a] << 8) | readBuf[(uint16_t)a + 1]);
|
return ((readBuf[(uint16_t)a] << 8) | readBuf[(uint16_t)a + 1]);
|
||||||
|
@ -405,16 +388,14 @@ double PS3USB::getAngle(Angle a) {
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
}
|
}
|
||||||
bool PS3USB::getStatus(Status c)
|
bool PS3USB::getStatus(Status c) {
|
||||||
{
|
|
||||||
if (readBuf == NULL)
|
if (readBuf == NULL)
|
||||||
return false;
|
return false;
|
||||||
if (readBuf[(uint16_t)c >> 8] == ((uint8_t)c & 0xff))
|
if (readBuf[(uint16_t)c >> 8] == ((uint8_t)c & 0xff))
|
||||||
return true;
|
return true;
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
String PS3USB::getStatusString()
|
String PS3USB::getStatusString() {
|
||||||
{
|
|
||||||
if (PS3Connected || PS3NavigationConnected)
|
if (PS3Connected || PS3NavigationConnected)
|
||||||
{
|
{
|
||||||
char statusOutput[100];
|
char statusOutput[100];
|
||||||
|
@ -450,20 +431,17 @@ String PS3USB::getStatusString()
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Playstation Sixaxis Dualshock and Navigation Controller commands */
|
/* Playstation Sixaxis Dualshock and Navigation Controller commands */
|
||||||
void PS3USB::PS3_Command(uint8_t* data, uint16_t nbytes)
|
void PS3USB::PS3_Command(uint8_t* data, uint16_t nbytes) {
|
||||||
{
|
|
||||||
//bmRequest = Host to device (0x00) | Class (0x20) | Interface (0x01) = 0x21, bRequest = Set Report (0x09), Report ID (0x01), Report Type (Output 0x02), interface (0x00), datalength, datalength, data)
|
//bmRequest = Host to device (0x00) | Class (0x20) | Interface (0x01) = 0x21, bRequest = Set Report (0x09), Report ID (0x01), Report Type (Output 0x02), interface (0x00), datalength, datalength, data)
|
||||||
pUsb->ctrlReq(bAddress,epInfo[PS3_CONTROL_PIPE].epAddr, bmREQ_HID_OUT, HID_REQUEST_SET_REPORT, 0x01, 0x02, 0x00, nbytes, nbytes, data, NULL);
|
pUsb->ctrlReq(bAddress,epInfo[PS3_CONTROL_PIPE].epAddr, bmREQ_HID_OUT, HID_REQUEST_SET_REPORT, 0x01, 0x02, 0x00, nbytes, nbytes, data, NULL);
|
||||||
}
|
}
|
||||||
void PS3USB::setAllOff()
|
void PS3USB::setAllOff() {
|
||||||
{
|
|
||||||
for (uint8_t i = 0; i < PS3_REPORT_BUFFER_SIZE; i++)
|
for (uint8_t i = 0; i < PS3_REPORT_BUFFER_SIZE; i++)
|
||||||
writeBuf[i] = pgm_read_byte(&PS3_REPORT_BUFFER[i]); // Reset buffer
|
writeBuf[i] = pgm_read_byte(&PS3_REPORT_BUFFER[i]); // Reset buffer
|
||||||
|
|
||||||
PS3_Command(writeBuf, PS3_REPORT_BUFFER_SIZE);
|
PS3_Command(writeBuf, PS3_REPORT_BUFFER_SIZE);
|
||||||
}
|
}
|
||||||
void PS3USB::setRumbleOff()
|
void PS3USB::setRumbleOff() {
|
||||||
{
|
|
||||||
writeBuf[1] = 0x00;
|
writeBuf[1] = 0x00;
|
||||||
writeBuf[2] = 0x00;//low mode off
|
writeBuf[2] = 0x00;//low mode off
|
||||||
writeBuf[3] = 0x00;
|
writeBuf[3] = 0x00;
|
||||||
|
@ -471,8 +449,7 @@ void PS3USB::setRumbleOff()
|
||||||
|
|
||||||
PS3_Command(writeBuf, PS3_REPORT_BUFFER_SIZE);
|
PS3_Command(writeBuf, PS3_REPORT_BUFFER_SIZE);
|
||||||
}
|
}
|
||||||
void PS3USB::setRumbleOn(Rumble mode)
|
void PS3USB::setRumbleOn(Rumble mode) {
|
||||||
{
|
|
||||||
/* Still not totally sure how it works, maybe something like this instead?
|
/* Still not totally sure how it works, maybe something like this instead?
|
||||||
* 3 - duration_right
|
* 3 - duration_right
|
||||||
* 4 - power_right
|
* 4 - power_right
|
||||||
|
@ -498,23 +475,19 @@ void PS3USB::setRumbleOn(Rumble mode)
|
||||||
PS3_Command(writeBuf, PS3_REPORT_BUFFER_SIZE);
|
PS3_Command(writeBuf, PS3_REPORT_BUFFER_SIZE);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
void PS3USB::setLedOff(LED a)
|
void PS3USB::setLedOff(LED a) {
|
||||||
{
|
|
||||||
writeBuf[9] &= ~((uint8_t)(((uint16_t)a & 0x0f) << 1));
|
writeBuf[9] &= ~((uint8_t)(((uint16_t)a & 0x0f) << 1));
|
||||||
PS3_Command(writeBuf, PS3_REPORT_BUFFER_SIZE);
|
PS3_Command(writeBuf, PS3_REPORT_BUFFER_SIZE);
|
||||||
}
|
}
|
||||||
void PS3USB::setLedOn(LED a)
|
void PS3USB::setLedOn(LED a) {
|
||||||
{
|
|
||||||
writeBuf[9] |= (uint8_t)(((uint16_t)a & 0x0f) << 1);
|
writeBuf[9] |= (uint8_t)(((uint16_t)a & 0x0f) << 1);
|
||||||
PS3_Command(writeBuf, PS3_REPORT_BUFFER_SIZE);
|
PS3_Command(writeBuf, PS3_REPORT_BUFFER_SIZE);
|
||||||
}
|
}
|
||||||
void PS3USB::setLedToggle(LED a)
|
void PS3USB::setLedToggle(LED a) {
|
||||||
{
|
|
||||||
writeBuf[9] ^= (uint8_t)(((uint16_t)a & 0x0f) << 1);
|
writeBuf[9] ^= (uint8_t)(((uint16_t)a & 0x0f) << 1);
|
||||||
PS3_Command(writeBuf, PS3_REPORT_BUFFER_SIZE);
|
PS3_Command(writeBuf, PS3_REPORT_BUFFER_SIZE);
|
||||||
}
|
}
|
||||||
void PS3USB::setBdaddr(uint8_t* BDADDR)
|
void PS3USB::setBdaddr(uint8_t* BDADDR) {
|
||||||
{
|
|
||||||
/* Set the internal bluetooth address */
|
/* Set the internal bluetooth address */
|
||||||
uint8_t buf[8];
|
uint8_t buf[8];
|
||||||
buf[0] = 0x01;
|
buf[0] = 0x01;
|
||||||
|
@ -535,8 +508,7 @@ void PS3USB::setBdaddr(uint8_t* BDADDR)
|
||||||
#endif
|
#endif
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
void PS3USB::enable_sixaxis()//Command used to enable the Dualshock 3 and Navigation controller to send data via USB
|
void PS3USB::enable_sixaxis() { //Command used to enable the Dualshock 3 and Navigation controller to send data via USB
|
||||||
{
|
|
||||||
uint8_t cmd_buf[4];
|
uint8_t cmd_buf[4];
|
||||||
cmd_buf[0] = 0x42;// Special PS3 Controller enable commands
|
cmd_buf[0] = 0x42;// Special PS3 Controller enable commands
|
||||||
cmd_buf[1] = 0x0c;
|
cmd_buf[1] = 0x0c;
|
||||||
|
@ -548,13 +520,11 @@ void PS3USB::enable_sixaxis()//Command used to enable the Dualshock 3 and Naviga
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Playstation Move Controller commands */
|
/* Playstation Move Controller commands */
|
||||||
void PS3USB::Move_Command(uint8_t* data, uint16_t nbytes)
|
void PS3USB::Move_Command(uint8_t* data, uint16_t nbytes) {
|
||||||
{
|
|
||||||
pUsb->outTransfer(bAddress, epInfo[ PS3_OUTPUT_PIPE ].epAddr, nbytes, data);
|
pUsb->outTransfer(bAddress, epInfo[ PS3_OUTPUT_PIPE ].epAddr, nbytes, data);
|
||||||
}
|
}
|
||||||
|
|
||||||
void PS3USB::moveSetBulb(uint8_t r, uint8_t g, uint8_t b)//Use this to set the Color using RGB values
|
void PS3USB::moveSetBulb(uint8_t r, uint8_t g, uint8_t b) { //Use this to set the Color using RGB values
|
||||||
{
|
|
||||||
// set the Bulb's values into the write buffer
|
// set the Bulb's values into the write buffer
|
||||||
writeBuf[2] = r;
|
writeBuf[2] = r;
|
||||||
writeBuf[3] = g;
|
writeBuf[3] = g;
|
||||||
|
@ -562,12 +532,10 @@ void PS3USB::moveSetBulb(uint8_t r, uint8_t g, uint8_t b)//Use this to set the C
|
||||||
|
|
||||||
Move_Command(writeBuf, MOVE_REPORT_BUFFER_SIZE);
|
Move_Command(writeBuf, MOVE_REPORT_BUFFER_SIZE);
|
||||||
}
|
}
|
||||||
void PS3USB::moveSetBulb(Colors color)//Use this to set the Color using the predefined colors in "enums.h"
|
void PS3USB::moveSetBulb(Colors color) { //Use this to set the Color using the predefined colors in "enums.h"
|
||||||
{
|
|
||||||
moveSetBulb((uint8_t)(color >> 16),(uint8_t)(color >> 8),(uint8_t)(color));
|
moveSetBulb((uint8_t)(color >> 16),(uint8_t)(color >> 8),(uint8_t)(color));
|
||||||
}
|
}
|
||||||
void PS3USB::moveSetRumble(uint8_t rumble)
|
void PS3USB::moveSetRumble(uint8_t rumble) {
|
||||||
{
|
|
||||||
#ifdef DEBUG
|
#ifdef DEBUG
|
||||||
if(rumble < 64 && rumble != 0) // The rumble value has to at least 64, or approximately 25% (64/255*100)
|
if(rumble < 64 && rumble != 0) // The rumble value has to at least 64, or approximately 25% (64/255*100)
|
||||||
Notify(PSTR("\r\nThe rumble value has to at least 64, or approximately 25%"));
|
Notify(PSTR("\r\nThe rumble value has to at least 64, or approximately 25%"));
|
||||||
|
@ -577,8 +545,7 @@ void PS3USB::moveSetRumble(uint8_t rumble)
|
||||||
|
|
||||||
Move_Command(writeBuf, MOVE_REPORT_BUFFER_SIZE);
|
Move_Command(writeBuf, MOVE_REPORT_BUFFER_SIZE);
|
||||||
}
|
}
|
||||||
void PS3USB::setMoveBdaddr(uint8_t* BDADDR)
|
void PS3USB::setMoveBdaddr(uint8_t* BDADDR) {
|
||||||
{
|
|
||||||
/* Set the internal bluetooth address */
|
/* Set the internal bluetooth address */
|
||||||
uint8_t buf[11];
|
uint8_t buf[11];
|
||||||
buf[0] = 0x05;
|
buf[0] = 0x05;
|
||||||
|
|
30
PS3USB.h
30
PS3USB.h
|
@ -52,8 +52,7 @@
|
||||||
|
|
||||||
#define PS3_MAX_ENDPOINTS 3
|
#define PS3_MAX_ENDPOINTS 3
|
||||||
|
|
||||||
enum LED
|
enum LED {
|
||||||
{
|
|
||||||
LED1 = 0x01,
|
LED1 = 0x01,
|
||||||
LED2 = 0x02,
|
LED2 = 0x02,
|
||||||
LED3 = 0x04,
|
LED3 = 0x04,
|
||||||
|
@ -66,8 +65,7 @@ enum LED
|
||||||
LED9 = 0x0E,
|
LED9 = 0x0E,
|
||||||
LED10 = 0x0F,
|
LED10 = 0x0F,
|
||||||
};
|
};
|
||||||
enum Colors
|
enum Colors {
|
||||||
{
|
|
||||||
// Used to set the colors of the move controller
|
// Used to set the colors of the move controller
|
||||||
Red = 0xFF0000, // r = 255, g = 0, b = 0
|
Red = 0xFF0000, // r = 255, g = 0, b = 0
|
||||||
Green = 0xFF00, // r = 0, g = 255, b = 0
|
Green = 0xFF00, // r = 0, g = 255, b = 0
|
||||||
|
@ -81,8 +79,7 @@ enum Colors
|
||||||
Off = 0x00, // r = 0, g = 0, b = 0
|
Off = 0x00, // r = 0, g = 0, b = 0
|
||||||
};
|
};
|
||||||
|
|
||||||
enum Button
|
enum Button {
|
||||||
{
|
|
||||||
// byte location | bit location
|
// byte location | bit location
|
||||||
|
|
||||||
// Sixaxis Dualshcock 3 & Navigation controller
|
// Sixaxis Dualshcock 3 & Navigation controller
|
||||||
|
@ -106,8 +103,7 @@ enum Button
|
||||||
|
|
||||||
PS = (4 << 8) | 0x01,
|
PS = (4 << 8) | 0x01,
|
||||||
};
|
};
|
||||||
enum AnalogButton
|
enum AnalogButton {
|
||||||
{
|
|
||||||
// Sixaxis Dualshcock 3 & Navigation controller
|
// Sixaxis Dualshcock 3 & Navigation controller
|
||||||
UP_ANALOG = 14,
|
UP_ANALOG = 14,
|
||||||
RIGHT_ANALOG = 15,
|
RIGHT_ANALOG = 15,
|
||||||
|
@ -123,28 +119,24 @@ enum AnalogButton
|
||||||
CROSS_ANALOG = 24,
|
CROSS_ANALOG = 24,
|
||||||
SQUARE_ANALOG = 25,
|
SQUARE_ANALOG = 25,
|
||||||
};
|
};
|
||||||
enum AnalogHat
|
enum AnalogHat {
|
||||||
{
|
|
||||||
LeftHatX = 6,
|
LeftHatX = 6,
|
||||||
LeftHatY = 7,
|
LeftHatY = 7,
|
||||||
RightHatX = 8,
|
RightHatX = 8,
|
||||||
RightHatY = 9,
|
RightHatY = 9,
|
||||||
};
|
};
|
||||||
enum Sensor
|
enum Sensor {
|
||||||
{
|
|
||||||
// Sensors inside the Sixaxis Dualshock 3 controller
|
// Sensors inside the Sixaxis Dualshock 3 controller
|
||||||
aX = 41,
|
aX = 41,
|
||||||
aY = 43,
|
aY = 43,
|
||||||
aZ = 45,
|
aZ = 45,
|
||||||
gZ = 47,
|
gZ = 47,
|
||||||
};
|
};
|
||||||
enum Angle
|
enum Angle {
|
||||||
{
|
|
||||||
Pitch = 0x01,
|
Pitch = 0x01,
|
||||||
Roll = 0x02,
|
Roll = 0x02,
|
||||||
};
|
};
|
||||||
enum Status
|
enum Status {
|
||||||
{
|
|
||||||
// byte location | bit location
|
// byte location | bit location
|
||||||
Plugged = (29 << 8) | 0x02,
|
Plugged = (29 << 8) | 0x02,
|
||||||
Unplugged = (29 << 8) | 0x03,
|
Unplugged = (29 << 8) | 0x03,
|
||||||
|
@ -162,14 +154,12 @@ enum Status
|
||||||
BluetoothRumble = (31 << 8) | 0x14, // Opperating by bluetooth and rumble is turned on
|
BluetoothRumble = (31 << 8) | 0x14, // Opperating by bluetooth and rumble is turned on
|
||||||
Bluetooth = (31 << 8) | 0x16, // Opperating by bluetooth and rumble is turned off
|
Bluetooth = (31 << 8) | 0x16, // Opperating by bluetooth and rumble is turned off
|
||||||
};
|
};
|
||||||
enum Rumble
|
enum Rumble {
|
||||||
{
|
|
||||||
RumbleHigh = 0x10,
|
RumbleHigh = 0x10,
|
||||||
RumbleLow = 0x20,
|
RumbleLow = 0x20,
|
||||||
};
|
};
|
||||||
|
|
||||||
class PS3USB : public USBDeviceConfig
|
class PS3USB : public USBDeviceConfig {
|
||||||
{
|
|
||||||
public:
|
public:
|
||||||
PS3USB(USB *pUsb, uint8_t btadr5=0, uint8_t btadr4=0, uint8_t btadr3=0, uint8_t btadr2=0, uint8_t btadr1=0, uint8_t btadr0=0);
|
PS3USB(USB *pUsb, uint8_t btadr5=0, uint8_t btadr4=0, uint8_t btadr3=0, uint8_t btadr2=0, uint8_t btadr1=0, uint8_t btadr0=0);
|
||||||
|
|
||||||
|
|
|
@ -242,6 +242,7 @@ FailUnknownDevice:
|
||||||
#ifdef DEBUG
|
#ifdef DEBUG
|
||||||
Notify(PSTR("\r\nUnknown Device Connected:"));
|
Notify(PSTR("\r\nUnknown Device Connected:"));
|
||||||
#endif
|
#endif
|
||||||
|
rcode = -1;
|
||||||
goto Fail;
|
goto Fail;
|
||||||
Fail:
|
Fail:
|
||||||
#ifdef DEBUG
|
#ifdef DEBUG
|
||||||
|
|
13
XBOXUSB.cpp
13
XBOXUSB.cpp
|
@ -49,8 +49,7 @@ uint8_t XBOXUSB::Init(uint8_t parent, uint8_t port, bool lowspeed) {
|
||||||
Notify(PSTR("\r\nXBOXUSB Init"));
|
Notify(PSTR("\r\nXBOXUSB Init"));
|
||||||
#endif
|
#endif
|
||||||
// check if address has already been assigned to an instance
|
// check if address has already been assigned to an instance
|
||||||
if (bAddress)
|
if (bAddress) {
|
||||||
{
|
|
||||||
#ifdef DEBUG
|
#ifdef DEBUG
|
||||||
Notify(PSTR("\r\nAddress in use"));
|
Notify(PSTR("\r\nAddress in use"));
|
||||||
#endif
|
#endif
|
||||||
|
@ -60,16 +59,14 @@ uint8_t XBOXUSB::Init(uint8_t parent, uint8_t port, bool lowspeed) {
|
||||||
// Get pointer to pseudo device with address 0 assigned
|
// Get pointer to pseudo device with address 0 assigned
|
||||||
p = addrPool.GetUsbDevicePtr(0);
|
p = addrPool.GetUsbDevicePtr(0);
|
||||||
|
|
||||||
if (!p)
|
if (!p) {
|
||||||
{
|
|
||||||
#ifdef DEBUG
|
#ifdef DEBUG
|
||||||
Notify(PSTR("\r\nAddress not found"));
|
Notify(PSTR("\r\nAddress not found"));
|
||||||
#endif
|
#endif
|
||||||
return USB_ERROR_ADDRESS_NOT_FOUND_IN_POOL;
|
return USB_ERROR_ADDRESS_NOT_FOUND_IN_POOL;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!p->epinfo)
|
if (!p->epinfo) {
|
||||||
{
|
|
||||||
#ifdef DEBUG
|
#ifdef DEBUG
|
||||||
Notify(PSTR("\r\nepinfo is null"));
|
Notify(PSTR("\r\nepinfo is null"));
|
||||||
#endif
|
#endif
|
||||||
|
@ -104,8 +101,7 @@ uint8_t XBOXUSB::Init(uint8_t parent, uint8_t port, bool lowspeed) {
|
||||||
|
|
||||||
// Assign new address to the device
|
// Assign new address to the device
|
||||||
rcode = pUsb->setAddr( 0, 0, bAddress );
|
rcode = pUsb->setAddr( 0, 0, bAddress );
|
||||||
if (rcode)
|
if (rcode) {
|
||||||
{
|
|
||||||
p->lowspeed = false;
|
p->lowspeed = false;
|
||||||
addrPool.FreeAddress(bAddress);
|
addrPool.FreeAddress(bAddress);
|
||||||
bAddress = 0;
|
bAddress = 0;
|
||||||
|
@ -216,6 +212,7 @@ FailUnknownDevice:
|
||||||
Notify(PSTR(" PID: "));
|
Notify(PSTR(" PID: "));
|
||||||
PrintHex<uint16_t>(PID);
|
PrintHex<uint16_t>(PID);
|
||||||
#endif
|
#endif
|
||||||
|
rcode = -1;
|
||||||
goto Fail;
|
goto Fail;
|
||||||
Fail:
|
Fail:
|
||||||
#ifdef DEBUG
|
#ifdef DEBUG
|
||||||
|
|
|
@ -90,16 +90,14 @@ enum Button {
|
||||||
L2 = 4,
|
L2 = 4,
|
||||||
R2 = 5,
|
R2 = 5,
|
||||||
};
|
};
|
||||||
enum AnalogHat
|
enum AnalogHat {
|
||||||
{
|
|
||||||
LeftHatX = 6,
|
LeftHatX = 6,
|
||||||
LeftHatY = 8,
|
LeftHatY = 8,
|
||||||
RightHatX = 10,
|
RightHatX = 10,
|
||||||
RightHatY = 12,
|
RightHatY = 12,
|
||||||
};
|
};
|
||||||
|
|
||||||
class XBOXUSB : public USBDeviceConfig
|
class XBOXUSB : public USBDeviceConfig {
|
||||||
{
|
|
||||||
public:
|
public:
|
||||||
XBOXUSB(USB *pUsb);
|
XBOXUSB(USB *pUsb);
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue