mirror of
https://github.com/felis/USB_Host_Shield_2.0.git
synced 2024-03-22 11:31:26 +01:00
Minor revision
This commit is contained in:
parent
a90c2ab4da
commit
da6eb99a2f
3 changed files with 217 additions and 183 deletions
348
PS3BT.cpp
348
PS3BT.cpp
|
@ -37,12 +37,38 @@ prog_char OUTPUT_REPORT_BUFFER[] PROGMEM =
|
||||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
|
||||||
};
|
};
|
||||||
|
|
||||||
PS3BT::PS3BT(USB *p):
|
PS3BT::PS3BT(USB *p, uint8_t btadr5 = 0, uint8_t btadr4 = 0, uint8_t btadr3 = 0, uint8_t btadr2 = 0, uint8_t btadr1 = 0, uint8_t btadr0 = 0):
|
||||||
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
|
||||||
bNumEP(1), // if config descriptor needs to be parsed
|
bNumEP(1), // if config descriptor needs to be parsed
|
||||||
qNextPollTime(0),
|
qNextPollTime(0),
|
||||||
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++)
|
||||||
|
{
|
||||||
|
epInfo[i].epAddr = 0;
|
||||||
|
epInfo[i].maxPktSize = (i) ? 0 : 8;
|
||||||
|
epInfo[i].epAttribs = 0;
|
||||||
|
epInfo[i].bmNakPower = (i) ? USB_NAK_NOWAIT : USB_NAK_MAX_POWER;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (pUsb) // register in USB subsystem
|
||||||
|
pUsb->RegisterDeviceClass(this); //set devConfig[] entry
|
||||||
|
|
||||||
|
my_bdaddr[5] = btadr5; // Change to your dongle's Bluetooth address instead
|
||||||
|
my_bdaddr[4] = btadr4;
|
||||||
|
my_bdaddr[3] = btadr3;
|
||||||
|
my_bdaddr[2] = btadr2;
|
||||||
|
my_bdaddr[1] = btadr1;
|
||||||
|
my_bdaddr[0] = btadr0;
|
||||||
|
}
|
||||||
|
|
||||||
|
PS3BT::PS3BT(USB *p):
|
||||||
|
pUsb(p), // pointer to USB class instance - mandatory
|
||||||
|
bAddress(0), // device address - mandatory
|
||||||
|
bNumEP(1), // if config descriptor needs to be parsed
|
||||||
|
qNextPollTime(0),
|
||||||
|
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++)
|
||||||
{
|
{
|
||||||
|
@ -54,13 +80,6 @@ PS3BT::PS3BT(USB *p):
|
||||||
|
|
||||||
if (pUsb) // register in USB subsystem
|
if (pUsb) // register in USB subsystem
|
||||||
pUsb->RegisterDeviceClass(this); //set devConfig[] entry
|
pUsb->RegisterDeviceClass(this); //set devConfig[] entry
|
||||||
|
|
||||||
my_bdaddr[5] = 0x00; // Change to your dongle's Bluetooth address instead
|
|
||||||
my_bdaddr[4] = 0x1F;
|
|
||||||
my_bdaddr[3] = 0x81;
|
|
||||||
my_bdaddr[2] = 0x00;
|
|
||||||
my_bdaddr[1] = 0x08;
|
|
||||||
my_bdaddr[0] = 0x30;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
uint8_t PS3BT::Init(uint8_t parent, uint8_t port, bool lowspeed)
|
uint8_t PS3BT::Init(uint8_t parent, uint8_t port, bool lowspeed)
|
||||||
|
@ -162,79 +181,13 @@ uint8_t PS3BT::Init(uint8_t parent, uint8_t port, bool lowspeed)
|
||||||
rcode = pUsb->setEpInfoEntry(bAddress, 1, epInfo);
|
rcode = pUsb->setEpInfoEntry(bAddress, 1, epInfo);
|
||||||
if (rcode)
|
if (rcode)
|
||||||
goto FailSetDevTblEntry;
|
goto FailSetDevTblEntry;
|
||||||
|
|
||||||
num_of_conf = ((USB_DEVICE_DESCRIPTOR*)buf)->bNumConfigurations;
|
num_of_conf = ((USB_DEVICE_DESCRIPTOR*)buf)->bNumConfigurations;
|
||||||
VID = ((USB_DEVICE_DESCRIPTOR*)buf)->idVendor;
|
VID = ((USB_DEVICE_DESCRIPTOR*)buf)->idVendor;
|
||||||
PID = ((USB_DEVICE_DESCRIPTOR*)buf)->idProduct;
|
PID = ((USB_DEVICE_DESCRIPTOR*)buf)->idProduct;
|
||||||
|
|
||||||
if((VID == CSR_VID || VID == ISSC_VID) && (PID == CSR_PID || PID == ISSC_PID))
|
if(VID == PS3_VID && (PID == PS3_PID || PID == PS3NAVIGATION_PID || PID == PS3MOVE_PID)) {
|
||||||
{
|
/* The application will work in reduced host mode, so we can save program and data
|
||||||
#ifdef DEBUG
|
|
||||||
Notify(PSTR("\r\nBluetooth Dongle Connected"));
|
|
||||||
#endif
|
|
||||||
|
|
||||||
//Needed for PS3 Dualshock Controller commands to work via bluetooth
|
|
||||||
for (uint8_t i = 0; i < OUTPUT_REPORT_BUFFER_SIZE; i++)
|
|
||||||
HIDBuffer[i + 2] = pgm_read_byte(&OUTPUT_REPORT_BUFFER[i]);//First two bytes reserved for report type and ID
|
|
||||||
|
|
||||||
HIDBuffer[0] = 0x52;// HID BT Set_report (0x50) | Report Type (Output 0x02)
|
|
||||||
HIDBuffer[1] = 0x01;// Report ID
|
|
||||||
|
|
||||||
//Needed for PS3 Move Controller commands to work via bluetooth
|
|
||||||
HIDMoveBuffer[0] = 0xA2;// HID BT DATA_request (0xA0) | Report Type (Output 0x02)
|
|
||||||
HIDMoveBuffer[1] = 0x02;// Report ID
|
|
||||||
|
|
||||||
/* Set device cid for the control and intterrupt channelse - LSB */
|
|
||||||
control_dcid[0] = 0x40;//0x0040
|
|
||||||
control_dcid[1] = 0x00;
|
|
||||||
interrupt_dcid[0] = 0x41;//0x0041
|
|
||||||
interrupt_dcid[1] = 0x00;
|
|
||||||
|
|
||||||
//check if attached device is a Bluetooth dongle and fill endpoint data structure
|
|
||||||
//first interface in the configuration must have Bluetooth assigned Class/Subclass/Protocol
|
|
||||||
//and 3 endpoints - interrupt-IN, bulk-IN, bulk-OUT,
|
|
||||||
//not necessarily in this order
|
|
||||||
for (uint8_t i=0; i<num_of_conf; i++) {
|
|
||||||
ConfigDescParser<USB_CLASS_WIRELESS_CTRL, WI_SUBCLASS_RF, WI_PROTOCOL_BT, CP_MASK_COMPARE_ALL> confDescrParser(this);
|
|
||||||
rcode = pUsb->getConfDescr(bAddress, 0, i, &confDescrParser);
|
|
||||||
if(rcode)
|
|
||||||
goto FailGetConfDescr;
|
|
||||||
if( bNumEP > 3 ) //all endpoints extracted
|
|
||||||
break;
|
|
||||||
} // for (uint8_t i=0; i<num_of_conf; i++...
|
|
||||||
|
|
||||||
if (bNumEP < PS3_MAX_ENDPOINTS) {
|
|
||||||
#ifdef DEBUG
|
|
||||||
Notify(PSTR("\r\nBluetooth dongle is not supported"));
|
|
||||||
#endif
|
|
||||||
goto Fail;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Assign epInfo to epinfo pointer - this time all 3 endpoins
|
|
||||||
rcode = pUsb->setEpInfoEntry(bAddress, bNumEP, epInfo);
|
|
||||||
if( rcode )
|
|
||||||
goto FailSetDevTblEntry;
|
|
||||||
|
|
||||||
delay(200); // Give time for address change
|
|
||||||
|
|
||||||
// Set Configuration Value
|
|
||||||
rcode = pUsb->setConf(bAddress, epInfo[ BTD_CONTROL_PIPE ].epAddr, bConfNum);
|
|
||||||
if( rcode )
|
|
||||||
goto FailSetConf;
|
|
||||||
|
|
||||||
hci_state = HCI_INIT_STATE;
|
|
||||||
hci_counter = 0;
|
|
||||||
l2cap_state = L2CAP_EV_WAIT;
|
|
||||||
#ifdef DEBUG
|
|
||||||
Notify(PSTR("\r\nCSR Initialized"));
|
|
||||||
#endif
|
|
||||||
|
|
||||||
watingForConnection = false;
|
|
||||||
bPollEnable = true;
|
|
||||||
}
|
|
||||||
else if((VID == PS3_VID || VID == PS3NAVIGATION_VID || VID == PS3MOVE_VID) && (PID == PS3_PID || PID == PS3NAVIGATION_PID || PID == PS3MOVE_PID))
|
|
||||||
{
|
|
||||||
/*The application will work in reduced host mode, so we can save program and data
|
|
||||||
memory space. After verifying the PID and VID we will use known values for the
|
memory space. After verifying the PID and VID we will use known values for the
|
||||||
configuration values for device, interface, endpoints and HID for the PS3 Controllers */
|
configuration values for device, interface, endpoints and HID for the PS3 Controllers */
|
||||||
|
|
||||||
|
@ -251,20 +204,20 @@ uint8_t PS3BT::Init(uint8_t parent, uint8_t port, bool lowspeed)
|
||||||
epInfo[ PS3_INPUT_PIPE ].maxPktSize = EP_MAXPKTSIZE;
|
epInfo[ PS3_INPUT_PIPE ].maxPktSize = EP_MAXPKTSIZE;
|
||||||
epInfo[ PS3_INPUT_PIPE ].bmSndToggle = bmSNDTOG0;
|
epInfo[ PS3_INPUT_PIPE ].bmSndToggle = bmSNDTOG0;
|
||||||
epInfo[ PS3_INPUT_PIPE ].bmRcvToggle = bmRCVTOG0;
|
epInfo[ PS3_INPUT_PIPE ].bmRcvToggle = bmRCVTOG0;
|
||||||
|
|
||||||
rcode = pUsb->setEpInfoEntry(bAddress, 3, epInfo);
|
rcode = pUsb->setEpInfoEntry(bAddress, 3, epInfo);
|
||||||
if( rcode )
|
if( rcode )
|
||||||
goto FailSetDevTblEntry;
|
goto FailSetDevTblEntry;
|
||||||
|
|
||||||
delay(200);//Give time for address change
|
delay(200);//Give time for address change
|
||||||
|
|
||||||
rcode = pUsb->setConf(bAddress, epInfo[ PS3_CONTROL_PIPE ].epAddr, 1);
|
rcode = pUsb->setConf(bAddress, epInfo[ PS3_CONTROL_PIPE ].epAddr, 1);
|
||||||
if( rcode )
|
if( rcode )
|
||||||
goto FailSetConf;
|
goto FailSetConf;
|
||||||
|
|
||||||
if((VID == PS3_VID || VID == PS3NAVIGATION_VID) && (PID == PS3_PID || PID == PS3NAVIGATION_PID))
|
if(PID == PS3_PID || PID == PS3NAVIGATION_PID)
|
||||||
{
|
{
|
||||||
if(VID == PS3_VID && 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"));
|
||||||
#endif
|
#endif
|
||||||
|
@ -285,46 +238,112 @@ uint8_t PS3BT::Init(uint8_t parent, uint8_t port, bool lowspeed)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
goto FailUnknownDevice;
|
{
|
||||||
|
//check if attached device is a Bluetooth dongle and fill endpoint data structure
|
||||||
|
//first interface in the configuration must have Bluetooth assigned Class/Subclass/Protocol
|
||||||
|
//and 3 endpoints - interrupt-IN, bulk-IN, bulk-OUT,
|
||||||
|
//not necessarily in this order
|
||||||
|
for (uint8_t i=0; i<num_of_conf; i++) {
|
||||||
|
ConfigDescParser<USB_CLASS_WIRELESS_CTRL, WI_SUBCLASS_RF, WI_PROTOCOL_BT, CP_MASK_COMPARE_ALL> confDescrParser(this);
|
||||||
|
rcode = pUsb->getConfDescr(bAddress, 0, i, &confDescrParser);
|
||||||
|
if(rcode)
|
||||||
|
goto FailGetConfDescr;
|
||||||
|
if(bNumEP > 3) //all endpoints extracted
|
||||||
|
break;
|
||||||
|
} // for (uint8_t i=0; i<num_of_conf; i++...
|
||||||
|
|
||||||
|
if (bNumEP < PS3_MAX_ENDPOINTS)
|
||||||
|
goto FailUnknownDevice;
|
||||||
|
|
||||||
|
// Assign epInfo to epinfo pointer - this time all 3 endpoins
|
||||||
|
rcode = pUsb->setEpInfoEntry(bAddress, bNumEP, epInfo);
|
||||||
|
if(rcode)
|
||||||
|
goto FailSetDevTblEntry;
|
||||||
|
|
||||||
|
delay(200); // Give time for address change
|
||||||
|
|
||||||
|
// Set Configuration Value
|
||||||
|
rcode = pUsb->setConf(bAddress, epInfo[ BTD_CONTROL_PIPE ].epAddr, bConfNum);
|
||||||
|
if(rcode)
|
||||||
|
goto FailSetConf;
|
||||||
|
|
||||||
|
if(VID == CSR_VID && PID == CSR_PID) {
|
||||||
|
if((uint16_t)((USB_DEVICE_DESCRIPTOR*)buf)->bcdDevice < 0x1915) { // I don't know the exact number, plese let me know if you do
|
||||||
|
#ifdef DEBUG
|
||||||
|
Notify(PSTR("\r\nYour dongle may not support reading the analog buttons, sensors and status\r\nYour Revision ID is: 0x"));
|
||||||
|
PrintHex<uint16_t>((uint16_t)((USB_DEVICE_DESCRIPTOR*)buf)->bcdDevice);
|
||||||
|
Notify(PSTR("\r\nBut should be at least 0x1915\r\nThis usually means that it doesn't support Bluetooth Version 2.0+EDR"));
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
//Needed for PS3 Dualshock Controller commands to work via bluetooth
|
||||||
|
for (uint8_t i = 0; i < OUTPUT_REPORT_BUFFER_SIZE; i++)
|
||||||
|
HIDBuffer[i + 2] = pgm_read_byte(&OUTPUT_REPORT_BUFFER[i]);//First two bytes reserved for report type and ID
|
||||||
|
|
||||||
|
HIDBuffer[0] = 0x52;// HID BT Set_report (0x50) | Report Type (Output 0x02)
|
||||||
|
HIDBuffer[1] = 0x01;// Report ID
|
||||||
|
|
||||||
|
//Needed for PS3 Move Controller commands to work via bluetooth
|
||||||
|
HIDMoveBuffer[0] = 0xA2;// HID BT DATA_request (0xA0) | Report Type (Output 0x02)
|
||||||
|
HIDMoveBuffer[1] = 0x02;// Report ID
|
||||||
|
|
||||||
|
/* Set device cid for the control and intterrupt channelse - LSB */
|
||||||
|
control_dcid[0] = 0x40;//0x0040
|
||||||
|
control_dcid[1] = 0x00;
|
||||||
|
interrupt_dcid[0] = 0x41;//0x0041
|
||||||
|
interrupt_dcid[1] = 0x00;
|
||||||
|
|
||||||
|
hci_num_reset_loops = 10; // only loop 10 times before trying to send the hci reset command
|
||||||
|
|
||||||
|
hci_state = HCI_INIT_STATE;
|
||||||
|
hci_counter = 0;
|
||||||
|
l2cap_state = L2CAP_EV_WAIT;
|
||||||
|
#ifdef DEBUG
|
||||||
|
Notify(PSTR("\r\nBluetooth Dongle Initialized"));
|
||||||
|
#endif
|
||||||
|
|
||||||
|
watingForConnection = false;
|
||||||
|
bPollEnable = true;
|
||||||
|
}
|
||||||
return 0; //successful configuration
|
return 0; //successful configuration
|
||||||
|
|
||||||
/* diagnostic messages */
|
/* diagnostic messages */
|
||||||
FailGetDevDescr:
|
FailGetDevDescr:
|
||||||
#ifdef DEBUG
|
#ifdef DEBUG
|
||||||
Notify(PSTR("\r\ngetDevDescr:"));
|
Notify(PSTR("\r\ngetDevDescr:"));
|
||||||
#endif
|
#endif
|
||||||
goto Fail;
|
goto Fail;
|
||||||
FailSetDevTblEntry:
|
FailSetDevTblEntry:
|
||||||
#ifdef DEBUG
|
#ifdef DEBUG
|
||||||
Notify(PSTR("\r\nsetDevTblEn:"));
|
Notify(PSTR("\r\nsetDevTblEn:"));
|
||||||
#endif
|
#endif
|
||||||
goto Fail;
|
goto Fail;
|
||||||
FailGetConfDescr:
|
FailGetConfDescr:
|
||||||
#ifdef DEBUG
|
#ifdef DEBUG
|
||||||
Notify(PSTR("\r\ngetConf:"));
|
Notify(PSTR("\r\ngetConf:"));
|
||||||
#endif
|
#endif
|
||||||
goto Fail;
|
goto Fail;
|
||||||
FailSetConf:
|
FailSetConf:
|
||||||
#ifdef DEBUG
|
#ifdef DEBUG
|
||||||
Notify(PSTR("\r\nsetConf:"));
|
Notify(PSTR("\r\nsetConf:"));
|
||||||
#endif
|
#endif
|
||||||
goto Fail;
|
goto Fail;
|
||||||
FailUnknownDevice:
|
FailUnknownDevice:
|
||||||
#ifdef DEBUG
|
#ifdef DEBUG
|
||||||
Notify(PSTR("\r\nUnknown Device Connected - VID: "));
|
Notify(PSTR("\r\nUnknown Device Connected - VID: "));
|
||||||
PrintHex<uint16_t>(VID);
|
PrintHex<uint16_t>(VID);
|
||||||
Notify(PSTR(" PID: "));
|
Notify(PSTR(" PID: "));
|
||||||
PrintHex<uint16_t>(PID);
|
PrintHex<uint16_t>(PID);
|
||||||
#endif
|
#endif
|
||||||
goto Fail;
|
goto Fail;
|
||||||
Fail:
|
Fail:
|
||||||
#ifdef DEBUG
|
#ifdef DEBUG
|
||||||
Notify(PSTR("\r\nPS3 Init Failed, error code: "));
|
Notify(PSTR("\r\nPS3 Init Failed, error code: "));
|
||||||
Serial.print(rcode);
|
Serial.print(rcode);
|
||||||
#endif
|
#endif
|
||||||
Release();
|
Release();
|
||||||
return rcode;
|
return rcode;
|
||||||
}
|
}
|
||||||
/* Extracts interrupt-IN, bulk-IN, bulk-OUT endpoint information from config descriptor */
|
/* Extracts interrupt-IN, bulk-IN, bulk-OUT endpoint information from config descriptor */
|
||||||
void PS3BT::EndpointXtract(uint8_t conf, uint8_t iface, uint8_t alt, uint8_t proto, const USB_ENDPOINT_DESCRIPTOR *pep)
|
void PS3BT::EndpointXtract(uint8_t conf, uint8_t iface, uint8_t alt, uint8_t proto, const USB_ENDPOINT_DESCRIPTOR *pep)
|
||||||
|
@ -341,7 +360,7 @@ void PS3BT::EndpointXtract(uint8_t conf, uint8_t iface, uint8_t alt, uint8_t pro
|
||||||
|
|
||||||
if ((pep->bmAttributes & 0x03) == 3 && (pep->bEndpointAddress & 0x80) == 0x80) //Interrupt In endpoint found
|
if ((pep->bmAttributes & 0x03) == 3 && (pep->bEndpointAddress & 0x80) == 0x80) //Interrupt In endpoint found
|
||||||
index = BTD_EVENT_PIPE;
|
index = BTD_EVENT_PIPE;
|
||||||
|
|
||||||
else {
|
else {
|
||||||
if ((pep->bmAttributes & 0x02) == 2) //bulk endpoint found
|
if ((pep->bmAttributes & 0x02) == 2) //bulk endpoint found
|
||||||
index = ((pep->bEndpointAddress & 0x80) == 0x80) ? BTD_DATAIN_PIPE : BTD_DATAOUT_PIPE;
|
index = ((pep->bEndpointAddress & 0x80) == 0x80) ? BTD_DATAIN_PIPE : BTD_DATAOUT_PIPE;
|
||||||
|
@ -352,7 +371,7 @@ void PS3BT::EndpointXtract(uint8_t conf, uint8_t iface, uint8_t alt, uint8_t pro
|
||||||
//Fill the rest of endpoint data structure
|
//Fill the rest of endpoint data structure
|
||||||
epInfo[index].epAddr = (pep->bEndpointAddress & 0x0F);
|
epInfo[index].epAddr = (pep->bEndpointAddress & 0x0F);
|
||||||
epInfo[index].maxPktSize = (uint8_t)pep->wMaxPacketSize;
|
epInfo[index].maxPktSize = (uint8_t)pep->wMaxPacketSize;
|
||||||
#ifdef EXTRADEBUG
|
#ifdef EXTRADEBUG
|
||||||
PrintEndpointDescriptor(pep);
|
PrintEndpointDescriptor(pep);
|
||||||
#endif
|
#endif
|
||||||
if(pollInterval < pep->bInterval) // Set the polling interval as the largest polling interval obtained from endpoints
|
if(pollInterval < pep->bInterval) // Set the polling interval as the largest polling interval obtained from endpoints
|
||||||
|
@ -402,14 +421,14 @@ void PS3BT::setBdaddr(uint8_t* BDADDR)
|
||||||
/* Store the bluetooth address */
|
/* Store the bluetooth address */
|
||||||
for(uint8_t i = 0; i <6;i++)
|
for(uint8_t i = 0; i <6;i++)
|
||||||
my_bdaddr[i] = BDADDR[i];
|
my_bdaddr[i] = BDADDR[i];
|
||||||
|
|
||||||
/* Set the internal bluetooth address */
|
/* Set the internal bluetooth address */
|
||||||
uint8_t buf[8];
|
uint8_t buf[8];
|
||||||
buf[0] = 0x01;
|
buf[0] = 0x01;
|
||||||
buf[1] = 0x00;
|
buf[1] = 0x00;
|
||||||
for (uint8_t i = 0; i < 6; i++)
|
for (uint8_t i = 0; i < 6; i++)
|
||||||
buf[i+2] = my_bdaddr[5 - i];//Copy into buffer, has to be written reversed
|
buf[i+2] = my_bdaddr[5 - i];//Copy into buffer, has to be written reversed
|
||||||
|
|
||||||
//bmRequest = Host to device (0x00) | Class (0x20) | Interface (0x01) = 0x21, bRequest = Set Report (0x09), Report ID (0xF5), Report Type (Feature 0x03), interface (0x00), datalength, datalength, data)
|
//bmRequest = Host to device (0x00) | Class (0x20) | Interface (0x01) = 0x21, bRequest = Set Report (0x09), Report ID (0xF5), Report Type (Feature 0x03), interface (0x00), datalength, datalength, data)
|
||||||
pUsb->ctrlReq(bAddress,epInfo[PS3_CONTROL_PIPE].epAddr, bmREQ_HID_OUT, HID_REQUEST_SET_REPORT, 0xF5, 0x03, 0x00, 8, 8, buf, NULL);
|
pUsb->ctrlReq(bAddress,epInfo[PS3_CONTROL_PIPE].epAddr, bmREQ_HID_OUT, HID_REQUEST_SET_REPORT, 0xF5, 0x03, 0x00, 8, 8, buf, NULL);
|
||||||
#ifdef DEBUG
|
#ifdef DEBUG
|
||||||
|
@ -511,11 +530,11 @@ double PS3BT::getAngle(Angle a, boolean resolution) // Boolean indicate if 360-d
|
||||||
{
|
{
|
||||||
double accXin;
|
double accXin;
|
||||||
double accXval;
|
double accXval;
|
||||||
double Pitch;
|
double angleX;
|
||||||
|
|
||||||
double accYin;
|
double accYin;
|
||||||
double accYval;
|
double accYval;
|
||||||
double Roll;
|
double angleY;
|
||||||
|
|
||||||
double accZin;
|
double accZin;
|
||||||
double accZval;
|
double accZval;
|
||||||
|
@ -543,36 +562,36 @@ double PS3BT::getAngle(Angle a, boolean resolution) // Boolean indicate if 360-d
|
||||||
{
|
{
|
||||||
//the result will come out as radians, so it is multiplied by 180/pi, to convert to degrees
|
//the result will come out as radians, so it is multiplied by 180/pi, to convert to degrees
|
||||||
//In the end it is minus by 90, so its 0 degrees when in horizontal postion
|
//In the end it is minus by 90, so its 0 degrees when in horizontal postion
|
||||||
Pitch = acos(accXval / R) * 180 / PI - 90;
|
angleX = acos(accXval / R) * 180 / PI - 90;
|
||||||
if(resolution)
|
if(resolution)
|
||||||
{
|
{
|
||||||
if (accZval < 0)//Convert to 360 degrees resolution - set resolution false if you need both pitch and roll
|
if (accZval < 0)//Convert to 360 degrees resolution - set resolution false if you need both pitch and roll
|
||||||
{
|
{
|
||||||
if (Pitch < 0)
|
if (angleX < 0)
|
||||||
Pitch = -180 - Pitch;
|
angleX = -180 - angleX;
|
||||||
else
|
else
|
||||||
Pitch = 180 - Pitch;
|
angleX = 180 - angleX;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return Pitch;
|
return angleX;
|
||||||
|
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
//the result will come out as radians, so it is multiplied by 180/pi, to convert to degrees
|
//the result will come out as radians, so it is multiplied by 180/pi, to convert to degrees
|
||||||
//In the end it is minus by 90, so its 0 degrees when in horizontal postion
|
//In the end it is minus by 90, so its 0 degrees when in horizontal postion
|
||||||
Roll = acos(accYval / R) * 180 / PI - 90;
|
angleY = acos(accYval / R) * 180 / PI - 90;
|
||||||
if(resolution)
|
if(resolution)
|
||||||
{
|
{
|
||||||
if (accZval < 0)//Convert to 360 degrees resolution - set resolution false if you need both pitch and roll
|
if (accZval < 0)//Convert to 360 degrees resolution - set resolution false if you need both pitch and roll
|
||||||
{
|
{
|
||||||
if (Roll < 0)
|
if (angleY < 0)
|
||||||
Roll = -180 - Roll;
|
angleY = -180 - angleY;
|
||||||
else
|
else
|
||||||
Roll = 180 - Roll;
|
angleY = 180 - angleY;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return Roll;
|
return angleY;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
bool PS3BT::getStatus(Status c)
|
bool PS3BT::getStatus(Status c)
|
||||||
|
@ -666,7 +685,7 @@ void PS3BT::HCI_event_task()
|
||||||
my_bdaddr[i] = hcibuf[6 + i];
|
my_bdaddr[i] = hcibuf[6 + i];
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case EV_COMMAND_STATUS:
|
case EV_COMMAND_STATUS:
|
||||||
if(hcibuf[2]) // show status on serial if not OK
|
if(hcibuf[2]) // show status on serial if not OK
|
||||||
{
|
{
|
||||||
|
@ -680,7 +699,7 @@ void PS3BT::HCI_event_task()
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case EV_CONNECT_COMPLETE:
|
case EV_CONNECT_COMPLETE:
|
||||||
if (!hcibuf[2]) // check if connected OK
|
if (!hcibuf[2]) // check if connected OK
|
||||||
{
|
{
|
||||||
|
@ -696,7 +715,7 @@ void PS3BT::HCI_event_task()
|
||||||
hci_event_flag &= ~HCI_FLAG_CONN_COMPLETE; // clear connection complete flag
|
hci_event_flag &= ~HCI_FLAG_CONN_COMPLETE; // clear connection complete flag
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case EV_NUM_COMPLETE_PKT:
|
case EV_NUM_COMPLETE_PKT:
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
@ -725,29 +744,29 @@ void PS3BT::HCI_event_task()
|
||||||
|
|
||||||
case EV_PAGE_SCAN_REP_MODE:
|
case EV_PAGE_SCAN_REP_MODE:
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case EV_LOOPBACK_COMMAND:
|
case EV_LOOPBACK_COMMAND:
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case EV_DATA_BUFFER_OVERFLOW:
|
case EV_DATA_BUFFER_OVERFLOW:
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case EV_CHANGE_CONNECTION_LINK:
|
case EV_CHANGE_CONNECTION_LINK:
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case EV_AUTHENTICATION_COMPLETE:
|
case EV_AUTHENTICATION_COMPLETE:
|
||||||
break;
|
break;
|
||||||
|
|
||||||
default:
|
default:
|
||||||
#ifdef EXTRADEBUG
|
#ifdef EXTRADEBUG
|
||||||
if(hcibuf[0] != 0x00)
|
if(hcibuf[0] != 0x00)
|
||||||
{
|
{
|
||||||
Notify(PSTR("\r\nUnmanaged Event: "));
|
Notify(PSTR("\r\nUnmanaged Event: "));
|
||||||
PrintHex<uint8_t>(hcibuf[0]);
|
PrintHex<uint8_t>(hcibuf[0]);
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
break;
|
break;
|
||||||
} // switch
|
} // switch
|
||||||
HCI_task();
|
HCI_task();
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
|
@ -764,7 +783,7 @@ void PS3BT::HCI_task()
|
||||||
switch (hci_state){
|
switch (hci_state){
|
||||||
case HCI_INIT_STATE:
|
case HCI_INIT_STATE:
|
||||||
hci_counter++;
|
hci_counter++;
|
||||||
if (hci_counter > 1000) // wait until we have looped 1000 times to clear any old events
|
if (hci_counter > hci_num_reset_loops) // wait until we have looped x times to clear any old events
|
||||||
{
|
{
|
||||||
hci_reset();
|
hci_reset();
|
||||||
hci_state = HCI_RESET_STATE;
|
hci_state = HCI_RESET_STATE;
|
||||||
|
@ -782,8 +801,11 @@ void PS3BT::HCI_task()
|
||||||
hci_state = HCI_BDADDR_STATE;
|
hci_state = HCI_BDADDR_STATE;
|
||||||
hci_read_bdaddr();
|
hci_read_bdaddr();
|
||||||
}
|
}
|
||||||
else if (hci_counter > 1000)
|
else if (hci_counter > hci_num_reset_loops)
|
||||||
{
|
{
|
||||||
|
hci_num_reset_loops *= 10;
|
||||||
|
if(hci_num_reset_loops > 2000)
|
||||||
|
hci_num_reset_loops = 2000;
|
||||||
#ifdef DEBUG
|
#ifdef DEBUG
|
||||||
Notify(PSTR("\r\nNo response to HCI Reset"));
|
Notify(PSTR("\r\nNo response to HCI Reset"));
|
||||||
#endif
|
#endif
|
||||||
|
@ -924,13 +946,13 @@ void PS3BT::ACL_event_task()
|
||||||
if (((l2capinbuf[0] | (l2capinbuf[1] << 8)) == (hci_handle | 0x2000)))//acl_handle_ok
|
if (((l2capinbuf[0] | (l2capinbuf[1] << 8)) == (hci_handle | 0x2000)))//acl_handle_ok
|
||||||
{
|
{
|
||||||
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] != 0x00)
|
if (l2capinbuf[8] != 0x00)
|
||||||
{
|
{
|
||||||
Serial.print("\r\nL2CAP Signaling Command - 0x");
|
Serial.print("\r\nL2CAP Signaling Command - 0x");
|
||||||
PrintHex<uint8_t>(l2capoutbuf[8]);
|
PrintHex<uint8_t>(l2capoutbuf[8]);
|
||||||
}
|
}
|
||||||
*/
|
*/
|
||||||
if (l2capinbuf[8] == L2CAP_CMD_COMMAND_REJECT)
|
if (l2capinbuf[8] == L2CAP_CMD_COMMAND_REJECT)
|
||||||
{
|
{
|
||||||
|
@ -950,19 +972,19 @@ void PS3BT::ACL_event_task()
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
else if (l2capinbuf[8] == L2CAP_CMD_CONNECTION_REQUEST)
|
else if (l2capinbuf[8] == L2CAP_CMD_CONNECTION_REQUEST)
|
||||||
{
|
{
|
||||||
/*
|
/*
|
||||||
Notify(PSTR("\r\nL2CAP Connection Request - PSM: "));
|
Notify(PSTR("\r\nL2CAP Connection Request - PSM: "));
|
||||||
PrintHex<uint8_t>(l2capinbuf[13]);
|
PrintHex<uint8_t>(l2capinbuf[13]);
|
||||||
Serial.print(" ");
|
Serial.print(" ");
|
||||||
PrintHex<uint8_t>(l2capinbuf[12]);
|
PrintHex<uint8_t>(l2capinbuf[12]);
|
||||||
Serial.print(" ");
|
Serial.print(" ");
|
||||||
|
|
||||||
Notify(PSTR(" SCID: "));
|
Notify(PSTR(" SCID: "));
|
||||||
PrintHex<uint8_t>(l2capinbuf[15]);
|
PrintHex<uint8_t>(l2capinbuf[15]);
|
||||||
Serial.print(" ");
|
Serial.print(" ");
|
||||||
PrintHex<uint8_t>(l2capinbuf[14]);
|
PrintHex<uint8_t>(l2capinbuf[14]);
|
||||||
|
|
||||||
Notify(PSTR(" Identifier: "));
|
Notify(PSTR(" Identifier: "));
|
||||||
PrintHex<uint8_t>(l2capinbuf[9]);
|
PrintHex<uint8_t>(l2capinbuf[9]);
|
||||||
*/
|
*/
|
||||||
|
@ -1058,7 +1080,7 @@ void PS3BT::ACL_event_task()
|
||||||
readReport();
|
readReport();
|
||||||
#ifdef PRINTREPORT
|
#ifdef PRINTREPORT
|
||||||
printReport(); //Uncomment "#define PRINTREPORT" to print the report send by the PS3 Controllers
|
printReport(); //Uncomment "#define PRINTREPORT" to print the report send by the PS3 Controllers
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
L2CAP_task();
|
L2CAP_task();
|
||||||
|
@ -1261,14 +1283,14 @@ void PS3BT::readReport()
|
||||||
buttonReleased = true;
|
buttonReleased = true;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
buttonChanged = false;
|
buttonChanged = false;
|
||||||
buttonPressed = false;
|
buttonPressed = false;
|
||||||
buttonReleased = false;
|
buttonReleased = false;
|
||||||
}
|
}
|
||||||
|
|
||||||
OldButtonState = ButtonState;
|
OldButtonState = ButtonState;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -1392,7 +1414,7 @@ void PS3BT::L2CAP_Command(uint8_t* data, uint16_t nbytes)
|
||||||
|
|
||||||
for (uint16_t i = 0; i < nbytes; i++)//L2CAP C-frame
|
for (uint16_t i = 0; i < nbytes; i++)//L2CAP C-frame
|
||||||
buf[8 + i] = data[i];
|
buf[8 + i] = data[i];
|
||||||
|
|
||||||
uint8_t rcode = pUsb->outTransfer(bAddress, epInfo[ BTD_DATAOUT_PIPE ].epAddr, (8 + nbytes), buf);
|
uint8_t rcode = pUsb->outTransfer(bAddress, epInfo[ BTD_DATAOUT_PIPE ].epAddr, (8 + nbytes), buf);
|
||||||
if(rcode)
|
if(rcode)
|
||||||
{
|
{
|
||||||
|
|
14
PS3BT.h
14
PS3BT.h
|
@ -44,14 +44,10 @@
|
||||||
|
|
||||||
//PID and VID of the different devices
|
//PID and VID of the different devices
|
||||||
#define CSR_VID 0x0A12 // Cambridge Silicon Radio Ltd.
|
#define CSR_VID 0x0A12 // Cambridge Silicon Radio Ltd.
|
||||||
#define CSR_PID 0x0001 // Bluetooth HCI Device
|
#define CSR_PID 0x0001 // Bluetooth HCI Device
|
||||||
#define ISSC_VID 0x1131 // Integrated System Solution Corp.
|
|
||||||
#define ISSC_PID 0x1004 // Bluetooth Device
|
|
||||||
#define PS3_VID 0x054C // Sony Corporation
|
#define PS3_VID 0x054C // Sony Corporation
|
||||||
#define PS3_PID 0x0268 // PS3 Controller DualShock 3
|
#define PS3_PID 0x0268 // PS3 Controller DualShock 3
|
||||||
#define PS3NAVIGATION_VID 0x054C // Sony Corporation
|
|
||||||
#define PS3NAVIGATION_PID 0x042F // Navigation controller
|
#define PS3NAVIGATION_PID 0x042F // Navigation controller
|
||||||
#define PS3MOVE_VID 0x054C // Sony Corporation
|
|
||||||
#define PS3MOVE_PID 0x03D5 // Motion controller
|
#define PS3MOVE_PID 0x03D5 // Motion controller
|
||||||
|
|
||||||
#define HID_BUFFERSIZE 50 // size of the buffer for the Playstation Motion Controller
|
#define HID_BUFFERSIZE 50 // size of the buffer for the Playstation Motion Controller
|
||||||
|
@ -157,10 +153,12 @@
|
||||||
#define PENDING 0x01
|
#define PENDING 0x01
|
||||||
#define SUCCESSFUL 0x00
|
#define SUCCESSFUL 0x00
|
||||||
|
|
||||||
#define PS3_MAX_ENDPOINTS 4
|
// Used to determine if it is a Bluetooth dongle
|
||||||
#define WI_SUBCLASS_RF 0x01
|
#define WI_SUBCLASS_RF 0x01
|
||||||
#define WI_PROTOCOL_BT 0x01
|
#define WI_PROTOCOL_BT 0x01
|
||||||
|
|
||||||
|
#define PS3_MAX_ENDPOINTS 4
|
||||||
|
|
||||||
enum LED
|
enum LED
|
||||||
{
|
{
|
||||||
LED1 = 0x01,
|
LED1 = 0x01,
|
||||||
|
@ -319,6 +317,7 @@ enum Rumble
|
||||||
class PS3BT : public USBDeviceConfig, public UsbConfigXtracter
|
class PS3BT : public USBDeviceConfig, public UsbConfigXtracter
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
|
PS3BT(USB *pUsb, uint8_t btadr5, uint8_t btadr4, uint8_t btadr3, uint8_t btadr2, uint8_t btadr1, uint8_t btadr0);
|
||||||
PS3BT(USB *pUsb);
|
PS3BT(USB *pUsb);
|
||||||
|
|
||||||
// USBDeviceConfig implementation
|
// USBDeviceConfig implementation
|
||||||
|
@ -332,7 +331,7 @@ public:
|
||||||
virtual void EndpointXtract(uint8_t conf, uint8_t iface, uint8_t alt, uint8_t proto, const USB_ENDPOINT_DESCRIPTOR *ep);
|
virtual void EndpointXtract(uint8_t conf, uint8_t iface, uint8_t alt, uint8_t proto, const USB_ENDPOINT_DESCRIPTOR *ep);
|
||||||
|
|
||||||
bool isWatingForConnection() { return watingForConnection; }; // Use this to indicate when it is ready for a incoming connection
|
bool isWatingForConnection() { return watingForConnection; }; // Use this to indicate when it is ready for a incoming connection
|
||||||
|
|
||||||
void setBdaddr(uint8_t* BDADDR);
|
void setBdaddr(uint8_t* BDADDR);
|
||||||
void setMoveBdaddr(uint8_t* BDADDR);
|
void setMoveBdaddr(uint8_t* BDADDR);
|
||||||
|
|
||||||
|
@ -395,6 +394,7 @@ private:
|
||||||
/* variables used by high level HCI task */
|
/* variables used by high level HCI task */
|
||||||
uint8_t hci_state; //current state of bluetooth hci connection
|
uint8_t hci_state; //current state of bluetooth hci connection
|
||||||
uint16_t hci_counter; // counter used for bluetooth hci reset loops
|
uint16_t hci_counter; // counter used for bluetooth hci reset loops
|
||||||
|
uint8_t hci_num_reset_loops; // this value indicate how many times it should read before trying to reset
|
||||||
uint16_t hci_event_flag;// hci flags of received bluetooth events
|
uint16_t hci_event_flag;// hci flags of received bluetooth events
|
||||||
|
|
||||||
/* variables used by high level L2CAP task */
|
/* variables used by high level L2CAP task */
|
||||||
|
|
|
@ -6,9 +6,12 @@
|
||||||
|
|
||||||
#include <PS3BT.h>
|
#include <PS3BT.h>
|
||||||
USB Usb;
|
USB Usb;
|
||||||
PS3BT BT(&Usb);
|
/* You can create the instance of the class in two ways */
|
||||||
|
PS3BT BT(&Usb); // This will just create the instance
|
||||||
|
//PS3BT BT(&Usb,0x00,0x15,0x83,0x3D,0x0A,0x57); // This will also store the bluetooth address - this can be obtained from the dongle when running the sketch
|
||||||
|
|
||||||
boolean printTemperature;
|
boolean printTemperature;
|
||||||
|
boolean printAngle;
|
||||||
|
|
||||||
void setup()
|
void setup()
|
||||||
{
|
{
|
||||||
|
@ -28,19 +31,19 @@ void loop()
|
||||||
if(BT.getAnalogHat(LeftHatX) > 137 || BT.getAnalogHat(LeftHatX) < 117 || BT.getAnalogHat(LeftHatY) > 137 || BT.getAnalogHat(LeftHatY) < 117 || BT.getAnalogHat(RightHatX) > 137 || BT.getAnalogHat(RightHatX) < 117 || BT.getAnalogHat(RightHatY) > 137 || BT.getAnalogHat(RightHatY) < 117) {
|
if(BT.getAnalogHat(LeftHatX) > 137 || BT.getAnalogHat(LeftHatX) < 117 || BT.getAnalogHat(LeftHatY) > 137 || BT.getAnalogHat(LeftHatY) < 117 || BT.getAnalogHat(RightHatX) > 137 || BT.getAnalogHat(RightHatX) < 117 || BT.getAnalogHat(RightHatY) > 137 || BT.getAnalogHat(RightHatY) < 117) {
|
||||||
if(BT.getAnalogHat(LeftHatX) > 137 || BT.getAnalogHat(LeftHatX) < 117) {
|
if(BT.getAnalogHat(LeftHatX) > 137 || BT.getAnalogHat(LeftHatX) < 117) {
|
||||||
Serial.print(F("LeftHatX: "));
|
Serial.print(F("LeftHatX: "));
|
||||||
Serial.print(BT.getAnalogHat(LeftHatX), DEC);
|
Serial.print(BT.getAnalogHat(LeftHatX));
|
||||||
Serial.print("\t");
|
Serial.print("\t");
|
||||||
} if(BT.getAnalogHat(LeftHatY) > 137 || BT.getAnalogHat(LeftHatY) < 117) {
|
} if(BT.getAnalogHat(LeftHatY) > 137 || BT.getAnalogHat(LeftHatY) < 117) {
|
||||||
Serial.print(F("LeftHatY: "));
|
Serial.print(F("LeftHatY: "));
|
||||||
Serial.print(BT.getAnalogHat(LeftHatY), DEC);
|
Serial.print(BT.getAnalogHat(LeftHatY));
|
||||||
Serial.print("\t");
|
Serial.print("\t");
|
||||||
} if(BT.getAnalogHat(RightHatX) > 137 || BT.getAnalogHat(RightHatX) < 117) {
|
} if(BT.getAnalogHat(RightHatX) > 137 || BT.getAnalogHat(RightHatX) < 117) {
|
||||||
Serial.print(F("RightHatX: "));
|
Serial.print(F("RightHatX: "));
|
||||||
Serial.print(BT.getAnalogHat(RightHatX), DEC);
|
Serial.print(BT.getAnalogHat(RightHatX));
|
||||||
Serial.print("\t");
|
Serial.print("\t");
|
||||||
} if(BT.getAnalogHat(RightHatY) > 137 || BT.getAnalogHat(RightHatY) < 117) {
|
} if(BT.getAnalogHat(RightHatY) > 137 || BT.getAnalogHat(RightHatY) < 117) {
|
||||||
Serial.print(F("RightHatY: "));
|
Serial.print(F("RightHatY: "));
|
||||||
Serial.print(BT.getAnalogHat(RightHatY), DEC);
|
Serial.print(BT.getAnalogHat(RightHatY));
|
||||||
}
|
}
|
||||||
Serial.println("");
|
Serial.println("");
|
||||||
}
|
}
|
||||||
|
@ -49,11 +52,11 @@ void loop()
|
||||||
if(BT.getAnalogButton(L2_ANALOG) > 0 || BT.getAnalogButton(R2_ANALOG) > 0) {
|
if(BT.getAnalogButton(L2_ANALOG) > 0 || BT.getAnalogButton(R2_ANALOG) > 0) {
|
||||||
if(BT.getAnalogButton(L2_ANALOG) > 0) {
|
if(BT.getAnalogButton(L2_ANALOG) > 0) {
|
||||||
Serial.print(F("L2: "));
|
Serial.print(F("L2: "));
|
||||||
Serial.print(BT.getAnalogButton(L2_ANALOG), DEC);
|
Serial.print(BT.getAnalogButton(L2_ANALOG));
|
||||||
Serial.print("\t");
|
Serial.print("\t");
|
||||||
} if(BT.getAnalogButton(R2_ANALOG) > 0) {
|
} if(BT.getAnalogButton(R2_ANALOG) > 0) {
|
||||||
Serial.print(F("R2: "));
|
Serial.print(F("R2: "));
|
||||||
Serial.print(BT.getAnalogButton(R2_ANALOG), DEC);
|
Serial.print(BT.getAnalogButton(R2_ANALOG));
|
||||||
}
|
}
|
||||||
Serial.println("");
|
Serial.println("");
|
||||||
}
|
}
|
||||||
|
@ -109,18 +112,27 @@ void loop()
|
||||||
if(BT.getButton(SELECT)) {
|
if(BT.getButton(SELECT)) {
|
||||||
Serial.print(F(" - Select - "));
|
Serial.print(F(" - Select - "));
|
||||||
Serial.print(BT.getStatusString());
|
Serial.print(BT.getStatusString());
|
||||||
} if(BT.getButton(START))
|
} if(BT.getButton(START)) {
|
||||||
Serial.print(F(" - Start"));
|
Serial.print(F(" - Start"));
|
||||||
|
printAngle = !printAngle;
|
||||||
|
while(BT.getButton(START))
|
||||||
|
Usb.Task();
|
||||||
|
}
|
||||||
Serial.println("");
|
Serial.println("");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
if(printAngle) {
|
||||||
|
Serial.print(F("Pitch: "));
|
||||||
|
Serial.print(BT.getAngle(Pitch,false));
|
||||||
|
Serial.print(F("\tRoll: "));
|
||||||
|
Serial.println(BT.getAngle(Roll,false));
|
||||||
|
}
|
||||||
}
|
}
|
||||||
else if(BT.PS3MoveBTConnected)
|
else if(BT.PS3MoveBTConnected)
|
||||||
{
|
{
|
||||||
if(BT.getAnalogButton(T_MOVE_ANALOG) > 0) {
|
if(BT.getAnalogButton(T_MOVE_ANALOG) > 0) {
|
||||||
Serial.print(F("T: "));
|
Serial.print(F("T: "));
|
||||||
Serial.println(BT.getAnalogButton(T_MOVE_ANALOG), DEC);
|
Serial.println(BT.getAnalogButton(T_MOVE_ANALOG));
|
||||||
} if(BT.buttonPressed) {
|
} if(BT.buttonPressed) {
|
||||||
Serial.print(F("PS3 Move Controller"));
|
Serial.print(F("PS3 Move Controller"));
|
||||||
|
|
||||||
|
@ -161,7 +173,7 @@ void loop()
|
||||||
if(printTemperature) {
|
if(printTemperature) {
|
||||||
String templow;
|
String templow;
|
||||||
String temphigh;
|
String temphigh;
|
||||||
String input = String(BT.getSensor(tempMove), DEC);
|
String input = String(BT.getSensor(tempMove));
|
||||||
|
|
||||||
if (input.length() > 3) {
|
if (input.length() > 3) {
|
||||||
temphigh = input.substring(0, 2);
|
temphigh = input.substring(0, 2);
|
||||||
|
|
Loading…
Reference in a new issue