mirror of
https://github.com/felis/USB_Host_Shield_2.0.git
synced 2024-03-22 11:31:26 +01:00
Merge branch 'master' into xxxajk
This commit is contained in:
commit
5b9fb51db0
34 changed files with 1072 additions and 925 deletions
45
BTD.cpp
45
BTD.cpp
|
@ -16,7 +16,7 @@
|
|||
*/
|
||||
|
||||
#include "BTD.h"
|
||||
// To enable serial debugging uncomment "#define DEBUG_USB_HOST" in message.h
|
||||
// To enable serial debugging see "settings.h"
|
||||
//#define EXTRADEBUG // Uncomment to get even more debugging data
|
||||
|
||||
const uint8_t BTD::BTD_CONTROL_PIPE = 0;
|
||||
|
@ -402,14 +402,10 @@ void BTD::HCI_event_task() {
|
|||
break;
|
||||
|
||||
case EV_COMMAND_STATUS:
|
||||
if (hcibuf[2]) { // show status on serial if not OK
|
||||
if (hcibuf[2]) { // Show status on serial if not OK
|
||||
#ifdef DEBUG_USB_HOST
|
||||
Notify(PSTR("\r\nHCI Command Failed: "), 0x80);
|
||||
D_PrintHex<uint8_t > (hcibuf[2], 0x80);
|
||||
Notify(PSTR(" "), 0x80);
|
||||
D_PrintHex<uint8_t > (hcibuf[4], 0x80);
|
||||
Notify(PSTR(" "), 0x80);
|
||||
D_PrintHex<uint8_t > (hcibuf[5], 0x80);
|
||||
#endif
|
||||
}
|
||||
break;
|
||||
|
@ -465,15 +461,18 @@ void BTD::HCI_event_task() {
|
|||
case EV_CONNECT_COMPLETE:
|
||||
hci_event_flag |= HCI_FLAG_CONNECT_EVENT;
|
||||
if (!hcibuf[2]) { // check if connected OK
|
||||
#ifdef EXTRADEBUG
|
||||
Notify(PSTR("\r\nConnection established"), 0x80);
|
||||
#endif
|
||||
hci_handle = hcibuf[3] | ((hcibuf[4] & 0x0F) << 8); // store the handle for the ACL connection
|
||||
hci_event_flag |= HCI_FLAG_CONN_COMPLETE; // set connection complete flag
|
||||
}
|
||||
#ifdef DEBUG_USB_HOST
|
||||
else {
|
||||
Notify(PSTR("\r\nConnection Failed"), 0x80);
|
||||
} else {
|
||||
hci_state = HCI_CHECK_WII_SERVICE;
|
||||
}
|
||||
#ifdef DEBUG_USB_HOST
|
||||
Notify(PSTR("\r\nConnection Failed: "), 0x80);
|
||||
D_PrintHex<uint8_t > (hcibuf[2], 0x80);
|
||||
#endif
|
||||
}
|
||||
break;
|
||||
|
||||
case EV_DISCONNECT_COMPLETE:
|
||||
|
@ -970,16 +969,20 @@ void BTD::hci_inquiry_cancel() {
|
|||
}
|
||||
|
||||
void BTD::hci_connect() {
|
||||
hci_connect(disc_bdaddr); // Use last discovered device
|
||||
}
|
||||
|
||||
void BTD::hci_connect(uint8_t *bdaddr) {
|
||||
hci_event_flag &= ~(HCI_FLAG_CONN_COMPLETE | HCI_FLAG_CONNECT_EVENT);
|
||||
hcibuf[0] = 0x05;
|
||||
hcibuf[1] = 0x01 << 2; // HCI OGF = 1
|
||||
hcibuf[2] = 0x0D; // parameter Total Length = 13
|
||||
hcibuf[3] = disc_bdaddr[0]; // 6 octet bdaddr
|
||||
hcibuf[4] = disc_bdaddr[1];
|
||||
hcibuf[5] = disc_bdaddr[2];
|
||||
hcibuf[6] = disc_bdaddr[3];
|
||||
hcibuf[7] = disc_bdaddr[4];
|
||||
hcibuf[8] = disc_bdaddr[5];
|
||||
hcibuf[3] = bdaddr[0]; // 6 octet bdaddr (LSB)
|
||||
hcibuf[4] = bdaddr[1];
|
||||
hcibuf[5] = bdaddr[2];
|
||||
hcibuf[6] = bdaddr[3];
|
||||
hcibuf[7] = bdaddr[4];
|
||||
hcibuf[8] = bdaddr[5];
|
||||
hcibuf[9] = 0x18; // DM1 or DH1 may be used
|
||||
hcibuf[10] = 0xCC; // DM3, DH3, DM5, DH5 may be used
|
||||
hcibuf[11] = 0x01; // Page repetition mode R1
|
||||
|
@ -1078,7 +1081,7 @@ void BTD::hci_disconnect(uint16_t handle) { // This is called by the different s
|
|||
}
|
||||
|
||||
void BTD::hci_write_class_of_device() { // See http://bluetooth-pentest.narod.ru/software/bluetooth_class_of_device-service_generator.html
|
||||
hcibuf[0] = 0x24; // HCI OCF = 3
|
||||
hcibuf[0] = 0x24; // HCI OCF = 24
|
||||
hcibuf[1] = 0x03 << 2; // HCI OGF = 3
|
||||
hcibuf[2] = 0x03; // parameter length = 3
|
||||
hcibuf[3] = 0x04; // Robot
|
||||
|
@ -1258,9 +1261,9 @@ void BTD::setBdaddr(uint8_t* bdaddr) {
|
|||
buf[1] = 0x00;
|
||||
|
||||
for (uint8_t i = 0; i < 6; i++)
|
||||
buf[i + 2] = bdaddr[5 - i]; // Copy into buffer, has to be written reversed
|
||||
buf[i + 2] = bdaddr[5 - i]; // Copy into buffer, has to be written reversed, so it is MSB first
|
||||
|
||||
// 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[BTD_CONTROL_PIPE].epAddr, bmREQ_HID_OUT, HID_REQUEST_SET_REPORT, 0xF5, 0x03, 0x00, 8, 8, buf, NULL);
|
||||
}
|
||||
|
||||
|
@ -1276,6 +1279,6 @@ void BTD::setMoveBdaddr(uint8_t* bdaddr) {
|
|||
for (uint8_t i = 0; i < 6; i++)
|
||||
buf[i + 1] = bdaddr[i];
|
||||
|
||||
// bmRequest = Host to device (0x00) | Class (0x20) | Interface (0x01) = 0x21, bRequest = Set Report (0x09), Report ID (0x05), 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 (0x05), Report Type (Feature 0x03), interface (0x00), datalength, datalength, data
|
||||
pUsb->ctrlReq(bAddress, epInfo[BTD_CONTROL_PIPE].epAddr, bmREQ_HID_OUT, HID_REQUEST_SET_REPORT, 0x05, 0x03, 0x00, 11, 11, buf, NULL);
|
||||
}
|
||||
|
|
15
BTD.h
15
BTD.h
|
@ -219,7 +219,13 @@ public:
|
|||
* @return Returns true if the device's VID and PID matches this driver.
|
||||
*/
|
||||
virtual boolean VIDPIDOK(uint16_t vid, uint16_t pid) {
|
||||
return ((vid == PS3_VID || vid == IOGEAR_GBU521_VID) && (pid == PS3_PID || pid == PS3NAVIGATION_PID || pid == PS3MOVE_PID || pid == IOGEAR_GBU521_PID));
|
||||
if (vid == IOGEAR_GBU521_VID && pid == IOGEAR_GBU521_PID)
|
||||
return true;
|
||||
if (my_bdaddr[0] != 0x00 || my_bdaddr[1] != 0x00 || my_bdaddr[2] != 0x00 || my_bdaddr[3] != 0x00 || my_bdaddr[4] != 0x00 || my_bdaddr[5] != 0x00) { // Check if Bluetooth address is set
|
||||
if (vid == PS3_VID && (pid == PS3_PID || pid == PS3NAVIGATION_PID || pid == PS3MOVE_PID))
|
||||
return true;
|
||||
}
|
||||
return false;
|
||||
};
|
||||
/**@}*/
|
||||
|
||||
|
@ -307,8 +313,13 @@ public:
|
|||
void hci_inquiry();
|
||||
/** Cancel a HCI inquiry. */
|
||||
void hci_inquiry_cancel();
|
||||
/** Connect to a device. */
|
||||
/** Connect to last device communicated with. */
|
||||
void hci_connect();
|
||||
/**
|
||||
* Connect to device.
|
||||
* @param bdaddr Bluetooth address of the device.
|
||||
*/
|
||||
void hci_connect(uint8_t *bdaddr);
|
||||
/** Used to a set the class of the device. */
|
||||
void hci_write_class_of_device();
|
||||
/**@}*/
|
||||
|
|
77
PS3BT.cpp
77
PS3BT.cpp
|
@ -16,7 +16,7 @@
|
|||
*/
|
||||
|
||||
#include "PS3BT.h"
|
||||
// To enable serial debugging uncomment "#define DEBUG_USB_HOST" in message.h
|
||||
// To enable serial debugging see "settings.h"
|
||||
//#define EXTRADEBUG // Uncomment to get even more debugging data
|
||||
//#define PRINTREPORT // Uncomment to print the report send by the PS3 Controllers
|
||||
|
||||
|
@ -36,14 +36,14 @@ pBtd(p) // pointer to USB class instance - mandatory
|
|||
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
|
||||
// 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[0] = 0x40; // 0x0040
|
||||
control_dcid[1] = 0x00;
|
||||
interrupt_dcid[0] = 0x41; //0x0041
|
||||
interrupt_dcid[0] = 0x41; // 0x0041
|
||||
interrupt_dcid[1] = 0x00;
|
||||
|
||||
Reset();
|
||||
|
@ -56,25 +56,19 @@ bool PS3BT::getButtonPress(Button b) {
|
|||
bool PS3BT::getButtonClick(Button b) {
|
||||
uint32_t button = pgm_read_dword(&BUTTONS[(uint8_t)b]);
|
||||
bool click = (ButtonClickState & button);
|
||||
ButtonClickState &= ~button; // clear "click" event
|
||||
ButtonClickState &= ~button; // Clear "click" event
|
||||
return click;
|
||||
}
|
||||
|
||||
uint8_t PS3BT::getAnalogButton(Button a) {
|
||||
if (l2capinbuf == NULL)
|
||||
return 0;
|
||||
return (uint8_t)(l2capinbuf[pgm_read_byte(&ANALOGBUTTONS[(uint8_t)a])]);
|
||||
}
|
||||
|
||||
uint8_t PS3BT::getAnalogHat(AnalogHat a) {
|
||||
if (l2capinbuf == NULL)
|
||||
return 0;
|
||||
return (uint8_t)(l2capinbuf[(uint8_t)a + 15]);
|
||||
}
|
||||
|
||||
int16_t PS3BT::getSensor(Sensor a) {
|
||||
if (l2capinbuf == NULL)
|
||||
return 0;
|
||||
if (PS3Connected) {
|
||||
if (a == aX || a == aY || a == aZ || a == gZ)
|
||||
return ((l2capinbuf[(uint16_t)a] << 8) | l2capinbuf[(uint16_t)a + 1]);
|
||||
|
@ -92,13 +86,11 @@ int16_t PS3BT::getSensor(Sensor a) {
|
|||
}
|
||||
|
||||
double PS3BT::getAngle(Angle a) {
|
||||
double accXval;
|
||||
double accYval;
|
||||
double accZval;
|
||||
double accXval, accYval, accZval;
|
||||
|
||||
if (PS3Connected) {
|
||||
// Data for the Kionix KXPC4 used in the DualShock 3
|
||||
const double zeroG = 511.5; // 1.65/3.3*1023 (1,65V)
|
||||
const double zeroG = 511.5; // 1.65/3.3*1023 (1.65V)
|
||||
accXval = -((double)getSensor(aX) - zeroG);
|
||||
accYval = -((double)getSensor(aY) - zeroG);
|
||||
accZval = -((double)getSensor(aZ) - zeroG);
|
||||
|
@ -114,13 +106,10 @@ double PS3BT::getAngle(Angle a) {
|
|||
// Convert to 360 degrees resolution
|
||||
// atan2 outputs the value of -π to π (radians)
|
||||
// We are then converting it to 0 to 2π and then to degrees
|
||||
if (a == Pitch) {
|
||||
double angle = (atan2(accYval, accZval) + PI) * RAD_TO_DEG;
|
||||
return angle;
|
||||
} else {
|
||||
double angle = (atan2(accXval, accZval) + PI) * RAD_TO_DEG;
|
||||
return angle;
|
||||
}
|
||||
if (a == Pitch)
|
||||
return (atan2(accYval, accZval) + PI) * RAD_TO_DEG;
|
||||
else
|
||||
return (atan2(accXval, accZval) + PI) * RAD_TO_DEG;
|
||||
}
|
||||
|
||||
double PS3BT::get9DOFValues(Sensor a) { // Thanks to Manfred Piendl
|
||||
|
@ -168,11 +157,7 @@ String PS3BT::getTemperature() {
|
|||
}
|
||||
|
||||
bool PS3BT::getStatus(Status c) {
|
||||
if (l2capinbuf == NULL)
|
||||
return false;
|
||||
if (l2capinbuf[(uint16_t)c >> 8] == ((uint8_t)c & 0xff))
|
||||
return true;
|
||||
return false;
|
||||
return (l2capinbuf[(uint16_t)c >> 8] == ((uint8_t)c & 0xff));
|
||||
}
|
||||
|
||||
String PS3BT::getStatusString() {
|
||||
|
@ -266,8 +251,7 @@ void PS3BT::ACLData(uint8_t* ACLData) {
|
|||
}
|
||||
}
|
||||
if (((ACLData[0] | (ACLData[1] << 8)) == (hci_handle | 0x2000))) { //acl_handle_ok
|
||||
for (uint8_t i = 0; i < BULK_MAXPKTSIZE; i++)
|
||||
l2capinbuf[i] = ACLData[i];
|
||||
memcpy(l2capinbuf, ACLData, BULK_MAXPKTSIZE);
|
||||
if ((l2capinbuf[6] | (l2capinbuf[7] << 8)) == 0x0001) { //l2cap_control - Channel ID for ACL-U
|
||||
if (l2capinbuf[8] == L2CAP_CMD_COMMAND_REJECT) {
|
||||
#ifdef DEBUG_USB_HOST
|
||||
|
@ -457,8 +441,7 @@ void PS3BT::L2CAP_task() {
|
|||
Notify(PSTR("\r\nHID Interrupt Successfully Configured"), 0x80);
|
||||
#endif
|
||||
if (remote_name[0] == 'M') { // First letter in Motion Controller ('M')
|
||||
for (uint8_t i = 0; i < BULK_MAXPKTSIZE; i++) // Reset l2cap in buffer as it sometimes read it as a button has been pressed
|
||||
l2capinbuf[i] = 0;
|
||||
memset(l2capinbuf, 0, BULK_MAXPKTSIZE); // Reset l2cap in buffer as it sometimes read it as a button has been pressed
|
||||
l2cap_state = L2CAP_HID_PS3_LED;
|
||||
} else
|
||||
l2cap_state = L2CAP_HID_ENABLE_SIXAXIS;
|
||||
|
@ -497,8 +480,7 @@ void PS3BT::Run() {
|
|||
switch (l2cap_state) {
|
||||
case L2CAP_HID_ENABLE_SIXAXIS:
|
||||
if (millis() - timer > 1000) { // loop 1 second before sending the command
|
||||
for (uint8_t i = 0; i < BULK_MAXPKTSIZE; i++) // Reset l2cap in buffer as it sometimes read it as a button has been pressed
|
||||
l2capinbuf[i] = 0;
|
||||
memset(l2capinbuf, 0, BULK_MAXPKTSIZE); // Reset l2cap in buffer as it sometimes read it as a button has been pressed
|
||||
for (uint8_t i = 15; i < 19; i++)
|
||||
l2capinbuf[i] = 0x7F; // Set the analog joystick values to center position
|
||||
enable_sixaxis();
|
||||
|
@ -536,9 +518,9 @@ void PS3BT::Run() {
|
|||
break;
|
||||
|
||||
case L2CAP_DONE:
|
||||
if (PS3MoveConnected) { //The Bulb and rumble values, has to be send at aproximatly every 5th second for it to stay on
|
||||
if (millis() - timerBulbRumble > 4000) { //Send at least every 4th second
|
||||
HIDMove_Command(HIDMoveBuffer, HID_BUFFERSIZE); //The Bulb and rumble values, has to be written again and again, for it to stay turned on
|
||||
if (PS3MoveConnected) { // The Bulb and rumble values, has to be send at aproximatly every 5th second for it to stay on
|
||||
if (millis() - timerBulbRumble > 4000) { // Send at least every 4th second
|
||||
HIDMove_Command(HIDMoveBuffer, HID_BUFFERSIZE); // The Bulb and rumble values, has to be written again and again, for it to stay turned on
|
||||
timerBulbRumble = millis();
|
||||
}
|
||||
}
|
||||
|
@ -550,18 +532,22 @@ void PS3BT::Run() {
|
|||
/* HID Commands */
|
||||
/************************************************************/
|
||||
|
||||
//Playstation Sixaxis Dualshock and Navigation Controller commands
|
||||
// Playstation Sixaxis Dualshock and Navigation Controller commands
|
||||
|
||||
void PS3BT::HID_Command(uint8_t* data, uint8_t nbytes) {
|
||||
if (millis() - timerHID <= 250)// Check if is has been more than 250ms since last command
|
||||
delay((uint32_t)(250 - (millis() - timerHID))); //There have to be a delay between commands
|
||||
if (millis() - timerHID <= 250) // Check if is has been more than 250ms since last command
|
||||
delay((uint32_t)(250 - (millis() - timerHID))); // There have to be a delay between commands
|
||||
pBtd->L2CAP_Command(hci_handle, data, nbytes, control_scid[0], control_scid[1]); // Both the Navigation and Dualshock controller sends data via the control channel
|
||||
timerHID = millis();
|
||||
}
|
||||
|
||||
void PS3BT::setAllOff() {
|
||||
for (uint8_t i = 0; i < PS3_REPORT_BUFFER_SIZE; i++)
|
||||
HIDBuffer[i + 2] = pgm_read_byte(&PS3_REPORT_BUFFER[i]); // First two bytes reserved for report type and ID
|
||||
HIDBuffer[3] = 0x00; // Rumble bytes
|
||||
HIDBuffer[4] = 0x00;
|
||||
HIDBuffer[5] = 0x00;
|
||||
HIDBuffer[6] = 0x00;
|
||||
|
||||
HIDBuffer[11] = 0x00; // LED byte
|
||||
|
||||
HID_Command(HIDBuffer, HID_BUFFERSIZE);
|
||||
}
|
||||
|
@ -596,6 +582,7 @@ void PS3BT::setLedRaw(uint8_t value) {
|
|||
HIDBuffer[11] = value << 1;
|
||||
HID_Command(HIDBuffer, HID_BUFFERSIZE);
|
||||
}
|
||||
|
||||
void PS3BT::setLedOff(LED a) {
|
||||
HIDBuffer[11] &= ~((uint8_t)((pgm_read_byte(&LEDS[(uint8_t)a]) & 0x0f) << 1));
|
||||
HID_Command(HIDBuffer, HID_BUFFERSIZE);
|
||||
|
@ -611,7 +598,7 @@ void PS3BT::setLedToggle(LED a) {
|
|||
HID_Command(HIDBuffer, HID_BUFFERSIZE);
|
||||
}
|
||||
|
||||
void PS3BT::enable_sixaxis() { //Command used to enable the Dualshock 3 and Navigation controller to send data via USB
|
||||
void PS3BT::enable_sixaxis() { // Command used to enable the Dualshock 3 and Navigation controller to send data via Bluetooth
|
||||
uint8_t cmd_buf[6];
|
||||
cmd_buf[0] = 0x53; // HID BT Set_report (0x50) | Report Type (Feature 0x03)
|
||||
cmd_buf[1] = 0xF4; // Report ID
|
||||
|
@ -623,7 +610,7 @@ void PS3BT::enable_sixaxis() { //Command used to enable the Dualshock 3 and Navi
|
|||
HID_Command(cmd_buf, 6);
|
||||
}
|
||||
|
||||
//Playstation Move Controller commands
|
||||
// Playstation Move Controller commands
|
||||
|
||||
void PS3BT::HIDMove_Command(uint8_t* data, uint8_t nbytes) {
|
||||
if (millis() - timerHID <= 250)// Check if is has been less than 200ms since last command
|
||||
|
@ -633,7 +620,7 @@ void PS3BT::HIDMove_Command(uint8_t* data, uint8_t nbytes) {
|
|||
}
|
||||
|
||||
void PS3BT::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
|
||||
HIDMoveBuffer[3] = r;
|
||||
HIDMoveBuffer[4] = g;
|
||||
HIDMoveBuffer[5] = b;
|
||||
|
@ -650,7 +637,7 @@ void PS3BT::moveSetRumble(uint8_t rumble) {
|
|||
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%"), 0x80);
|
||||
#endif
|
||||
//set the rumble value into the write buffer
|
||||
// Set the rumble value into the write buffer
|
||||
HIDMoveBuffer[7] = rumble;
|
||||
|
||||
HIDMove_Command(HIDMoveBuffer, HID_BUFFERSIZE);
|
||||
|
|
4
PS3BT.h
4
PS3BT.h
|
@ -176,6 +176,10 @@ public:
|
|||
* @param value See: ::LED enum.
|
||||
*/
|
||||
void setLedRaw(uint8_t value);
|
||||
/** Turn all LEDs off. */
|
||||
void setLedOff() {
|
||||
setLedRaw(0);
|
||||
}
|
||||
/**
|
||||
* Turn the specific ::LED off.
|
||||
* @param a The ::LED to turn off.
|
||||
|
|
111
PS3USB.cpp
111
PS3USB.cpp
|
@ -16,7 +16,7 @@
|
|||
*/
|
||||
|
||||
#include "PS3USB.h"
|
||||
// To enable serial debugging uncomment "#define DEBUG_USB_HOST" in message.h
|
||||
// To enable serial debugging see "settings.h"
|
||||
//#define EXTRADEBUG // Uncomment to get even more debugging data
|
||||
//#define PRINTREPORT // Uncomment to print the report send by the PS3 Controllers
|
||||
|
||||
|
@ -279,8 +279,7 @@ uint8_t PS3USB::Poll() {
|
|||
#endif
|
||||
}
|
||||
} else if (PS3MoveConnected) { // One can only set the color of the bulb, set the rumble, set and get the bluetooth address and calibrate the magnetometer via USB
|
||||
if (millis() - timer > 4000) // Send at least every 4th second
|
||||
{
|
||||
if (millis() - timer > 4000) { // Send at least every 4th second
|
||||
Move_Command(writeBuf, MOVE_REPORT_BUFFER_SIZE); // The Bulb and rumble values, has to be written again and again, for it to stay turned on
|
||||
timer = millis();
|
||||
}
|
||||
|
@ -289,9 +288,6 @@ uint8_t PS3USB::Poll() {
|
|||
}
|
||||
|
||||
void PS3USB::readReport() {
|
||||
if (readBuf == NULL)
|
||||
return;
|
||||
|
||||
ButtonState = (uint32_t)(readBuf[2] | ((uint16_t)readBuf[3] << 8) | ((uint32_t)readBuf[4] << 16));
|
||||
|
||||
//Notify(PSTR("\r\nButtonState", 0x80);
|
||||
|
@ -303,10 +299,8 @@ void PS3USB::readReport() {
|
|||
}
|
||||
}
|
||||
|
||||
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
|
||||
#ifdef PRINTREPORT
|
||||
if (readBuf == NULL)
|
||||
return;
|
||||
for (uint8_t i = 0; i < PS3_REPORT_BUFFER_SIZE; i++) {
|
||||
D_PrintHex<uint8_t > (readBuf[i], 0x80);
|
||||
Notify(PSTR(" "), 0x80);
|
||||
|
@ -322,25 +316,19 @@ bool PS3USB::getButtonPress(Button b) {
|
|||
bool PS3USB::getButtonClick(Button b) {
|
||||
uint32_t button = pgm_read_dword(&BUTTONS[(uint8_t)b]);
|
||||
bool click = (ButtonClickState & button);
|
||||
ButtonClickState &= ~button; // clear "click" event
|
||||
ButtonClickState &= ~button; // Clear "click" event
|
||||
return click;
|
||||
}
|
||||
|
||||
uint8_t PS3USB::getAnalogButton(Button a) {
|
||||
if (readBuf == NULL)
|
||||
return 0;
|
||||
return (uint8_t)(readBuf[(pgm_read_byte(&ANALOGBUTTONS[(uint8_t)a])) - 9]);
|
||||
}
|
||||
|
||||
uint8_t PS3USB::getAnalogHat(AnalogHat a) {
|
||||
if (readBuf == NULL)
|
||||
return 0;
|
||||
return (uint8_t)(readBuf[((uint8_t)a + 6)]);
|
||||
}
|
||||
|
||||
uint16_t PS3USB::getSensor(Sensor a) {
|
||||
if (readBuf == NULL)
|
||||
return 0;
|
||||
return ((readBuf[((uint16_t)a) - 9] << 8) | readBuf[((uint16_t)a + 1) - 9]);
|
||||
}
|
||||
|
||||
|
@ -359,23 +347,16 @@ double PS3USB::getAngle(Angle a) {
|
|||
// Convert to 360 degrees resolution
|
||||
// atan2 outputs the value of -π to π (radians)
|
||||
// We are then converting it to 0 to 2π and then to degrees
|
||||
if (a == Pitch) {
|
||||
double angle = (atan2(accYval, accZval) + PI) * RAD_TO_DEG;
|
||||
return angle;
|
||||
} else {
|
||||
double angle = (atan2(accXval, accZval) + PI) * RAD_TO_DEG;
|
||||
return angle;
|
||||
}
|
||||
if (a == Pitch)
|
||||
return (atan2(accYval, accZval) + PI) * RAD_TO_DEG;
|
||||
else
|
||||
return (atan2(accXval, accZval) + PI) * RAD_TO_DEG;
|
||||
} else
|
||||
return 0;
|
||||
}
|
||||
|
||||
bool PS3USB::getStatus(Status c) {
|
||||
if (readBuf == NULL)
|
||||
return false;
|
||||
if (readBuf[((uint16_t)c >> 8) - 9] == ((uint8_t)c & 0xff))
|
||||
return true;
|
||||
return false;
|
||||
return (readBuf[((uint16_t)c >> 8) - 9] == ((uint8_t)c & 0xff));
|
||||
}
|
||||
|
||||
String PS3USB::getStatusString() {
|
||||
|
@ -414,8 +395,8 @@ String PS3USB::getStatusString() {
|
|||
}
|
||||
|
||||
/* Playstation Sixaxis Dualshock and Navigation Controller commands */
|
||||
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)
|
||||
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)
|
||||
pUsb->ctrlReq(bAddress, epInfo[PS3_CONTROL_PIPE].epAddr, bmREQ_HID_OUT, HID_REQUEST_SET_REPORT, 0x01, 0x02, 0x00, nbytes, nbytes, data, NULL);
|
||||
}
|
||||
|
||||
|
@ -428,9 +409,9 @@ void PS3USB::setAllOff() {
|
|||
|
||||
void PS3USB::setRumbleOff() {
|
||||
writeBuf[1] = 0x00;
|
||||
writeBuf[2] = 0x00; //low mode off
|
||||
writeBuf[2] = 0x00; // Low mode off
|
||||
writeBuf[3] = 0x00;
|
||||
writeBuf[4] = 0x00; //high mode off
|
||||
writeBuf[4] = 0x00; // High mode off
|
||||
|
||||
PS3_Command(writeBuf, PS3_REPORT_BUFFER_SIZE);
|
||||
}
|
||||
|
@ -474,36 +455,47 @@ void PS3USB::setLedToggle(LED a) {
|
|||
PS3_Command(writeBuf, PS3_REPORT_BUFFER_SIZE);
|
||||
}
|
||||
|
||||
void PS3USB::setBdaddr(uint8_t* BDADDR) {
|
||||
/* Set the internal bluetooth address */
|
||||
void PS3USB::setBdaddr(uint8_t *bdaddr) {
|
||||
/* Set the internal Bluetooth address */
|
||||
uint8_t buf[8];
|
||||
buf[0] = 0x01;
|
||||
buf[1] = 0x00;
|
||||
for (uint8_t i = 0; i < 6; i++)
|
||||
buf[i + 2] = 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)
|
||||
for (uint8_t i = 0; i < 6; i++)
|
||||
buf[i + 2] = bdaddr[5 - i]; // Copy into buffer, has to be written reversed, so it is MSB first
|
||||
|
||||
// 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);
|
||||
}
|
||||
|
||||
void PS3USB::enable_sixaxis() { //Command used to enable the Dualshock 3 and Navigation controller to send data via USB
|
||||
void PS3USB::getBdaddr(uint8_t *bdaddr) {
|
||||
uint8_t buf[8];
|
||||
|
||||
// bmRequest = Device to host (0x80) | Class (0x20) | Interface (0x01) = 0xA1, bRequest = Get Report (0x01), Report ID (0xF5), Report Type (Feature 0x03), interface (0x00), datalength, datalength, data
|
||||
pUsb->ctrlReq(bAddress, epInfo[PS3_CONTROL_PIPE].epAddr, bmREQ_HID_IN, HID_REQUEST_GET_REPORT, 0xF5, 0x03, 0x00, 8, 8, buf, NULL);
|
||||
|
||||
for (uint8_t i = 0; i < 6; i++)
|
||||
bdaddr[5 - i] = buf[i + 2]; // Copy into buffer reversed, so it is LSB first
|
||||
}
|
||||
|
||||
void PS3USB::enable_sixaxis() { // Command used to enable the Dualshock 3 and Navigation controller to send data via USB
|
||||
uint8_t cmd_buf[4];
|
||||
cmd_buf[0] = 0x42; // Special PS3 Controller enable commands
|
||||
cmd_buf[1] = 0x0c;
|
||||
cmd_buf[2] = 0x00;
|
||||
cmd_buf[3] = 0x00;
|
||||
|
||||
//bmRequest = Host to device (0x00) | Class (0x20) | Interface (0x01) = 0x21, bRequest = Set Report (0x09), Report ID (0xF4), 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 (0xF4), Report Type (Feature 0x03), interface (0x00), datalength, datalength, data)
|
||||
pUsb->ctrlReq(bAddress, epInfo[PS3_CONTROL_PIPE].epAddr, bmREQ_HID_OUT, HID_REQUEST_SET_REPORT, 0xF4, 0x03, 0x00, 4, 4, cmd_buf, NULL);
|
||||
}
|
||||
|
||||
/* 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);
|
||||
}
|
||||
|
||||
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
|
||||
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
|
||||
writeBuf[2] = r;
|
||||
writeBuf[3] = g;
|
||||
writeBuf[4] = b;
|
||||
|
@ -511,7 +503,7 @@ void PS3USB::moveSetBulb(uint8_t r, uint8_t g, uint8_t b) { //Use this to set th
|
|||
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));
|
||||
}
|
||||
|
||||
|
@ -520,14 +512,13 @@ void PS3USB::moveSetRumble(uint8_t rumble) {
|
|||
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%"), 0x80);
|
||||
#endif
|
||||
//set the rumble value into the write buffer
|
||||
writeBuf[6] = rumble;
|
||||
writeBuf[6] = rumble; // Set the rumble value into the write buffer
|
||||
|
||||
Move_Command(writeBuf, MOVE_REPORT_BUFFER_SIZE);
|
||||
}
|
||||
|
||||
void PS3USB::setMoveBdaddr(uint8_t* BDADDR) {
|
||||
/* Set the internal bluetooth address */
|
||||
void PS3USB::setMoveBdaddr(uint8_t *bdaddr) {
|
||||
/* Set the internal Bluetooth address */
|
||||
uint8_t buf[11];
|
||||
buf[0] = 0x05;
|
||||
buf[7] = 0x10;
|
||||
|
@ -536,12 +527,34 @@ void PS3USB::setMoveBdaddr(uint8_t* BDADDR) {
|
|||
buf[10] = 0x12;
|
||||
|
||||
for (uint8_t i = 0; i < 6; i++)
|
||||
buf[i + 1] = BDADDR[i];
|
||||
buf[i + 1] = bdaddr[i];
|
||||
|
||||
//bmRequest = Host to device (0x00) | Class (0x20) | Interface (0x01) = 0x21, bRequest = Set Report (0x09), Report ID (0x05), 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 (0x05), Report Type (Feature 0x03), interface (0x00), datalength, datalength, data
|
||||
pUsb->ctrlReq(bAddress, epInfo[PS3_CONTROL_PIPE].epAddr, bmREQ_HID_OUT, HID_REQUEST_SET_REPORT, 0x05, 0x03, 0x00, 11, 11, buf, NULL);
|
||||
}
|
||||
|
||||
void PS3USB::getMoveBdaddr(uint8_t *bdaddr) {
|
||||
uint8_t buf[16];
|
||||
|
||||
// bmRequest = Device to host (0x80) | Class (0x20) | Interface (0x01) = 0xA1, bRequest = Get Report (0x01), Report ID (0x04), Report Type (Feature 0x03), interface (0x00), datalength, datalength, data
|
||||
pUsb->ctrlReq(bAddress, epInfo[PS3_CONTROL_PIPE].epAddr, bmREQ_HID_IN, HID_REQUEST_GET_REPORT, 0x04, 0x03, 0x00, 16, 16, buf, NULL);
|
||||
|
||||
for (uint8_t i = 0; i < 6; i++)
|
||||
bdaddr[i] = buf[10 + i];
|
||||
}
|
||||
|
||||
void PS3USB::getMoveCalibration(uint8_t *data) {
|
||||
uint8_t buf[49];
|
||||
|
||||
for (uint8_t i = 0; i < 3; i++) {
|
||||
// bmRequest = Device to host (0x80) | Class (0x20) | Interface (0x01) = 0xA1, bRequest = Get Report (0x01), Report ID (0x10), Report Type (Feature 0x03), interface (0x00), datalength, datalength, data
|
||||
pUsb->ctrlReq(bAddress, epInfo[PS3_CONTROL_PIPE].epAddr, bmREQ_HID_IN, HID_REQUEST_GET_REPORT, 0x10, 0x03, 0x00, 49, 49, buf, NULL);
|
||||
|
||||
for (byte j = 0; j < 49; j++)
|
||||
data[49 * i + j] = buf[j];
|
||||
}
|
||||
}
|
||||
|
||||
void PS3USB::onInit() {
|
||||
if (pFuncOnInit)
|
||||
pFuncOnInit(); // Call the user function
|
||||
|
|
41
PS3USB.h
41
PS3USB.h
|
@ -38,8 +38,11 @@
|
|||
#define PS3NAVIGATION_PID 0x042F // Navigation controller
|
||||
#define PS3MOVE_PID 0x03D5 // Motion controller
|
||||
|
||||
// used in control endpoint header for HID Commands
|
||||
// Used in control endpoint header for HID Commands
|
||||
#define bmREQ_HID_OUT USB_SETUP_HOST_TO_DEVICE|USB_SETUP_TYPE_CLASS|USB_SETUP_RECIPIENT_INTERFACE
|
||||
#define bmREQ_HID_IN USB_SETUP_DEVICE_TO_HOST|USB_SETUP_TYPE_CLASS|USB_SETUP_RECIPIENT_INTERFACE
|
||||
|
||||
#define HID_REQUEST_GET_REPORT 0x01
|
||||
#define HID_REQUEST_SET_REPORT 0x09
|
||||
|
||||
#define PS3_MAX_ENDPOINTS 3
|
||||
|
@ -112,14 +115,34 @@ public:
|
|||
|
||||
/**
|
||||
* Used to set the Bluetooth address inside the Dualshock 3 and Navigation controller.
|
||||
* @param BDADDR Your dongles Bluetooth address.
|
||||
* Set using LSB first.
|
||||
* @param bdaddr Your dongles Bluetooth address.
|
||||
*/
|
||||
void setBdaddr(uint8_t* BDADDR);
|
||||
void setBdaddr(uint8_t *bdaddr);
|
||||
/**
|
||||
* Used to get the Bluetooth address inside the Dualshock 3 and Navigation controller.
|
||||
* Will return LSB first.
|
||||
* @param bdaddr Your dongles Bluetooth address.
|
||||
*/
|
||||
void getBdaddr(uint8_t *bdaddr);
|
||||
|
||||
/**
|
||||
* Used to set the Bluetooth address inside the Move controller.
|
||||
* @param BDADDR Your dongles Bluetooth address.
|
||||
* Set using LSB first.
|
||||
* @param bdaddr Your dongles Bluetooth address.
|
||||
*/
|
||||
void setMoveBdaddr(uint8_t* BDADDR);
|
||||
void setMoveBdaddr(uint8_t *bdaddr);
|
||||
/**
|
||||
* Used to get the Bluetooth address inside the Move controller.
|
||||
* Will return LSB first.
|
||||
* @param bdaddr Your dongles Bluetooth address.
|
||||
*/
|
||||
void getMoveBdaddr(uint8_t *bdaddr);
|
||||
/**
|
||||
* Used to get the calibration data inside the Move controller.
|
||||
* @param bdaddr Buffer to store data in. Must be at least 147 bytes
|
||||
*/
|
||||
void getMoveCalibration(uint8_t *data);
|
||||
|
||||
/** @name PS3 Controller functions */
|
||||
/**
|
||||
|
@ -197,6 +220,10 @@ public:
|
|||
* @param value See: ::LED enum.
|
||||
*/
|
||||
void setLedRaw(uint8_t value);
|
||||
/** Turn all LEDs off. */
|
||||
void setLedOff() {
|
||||
setLedRaw(0);
|
||||
}
|
||||
/**
|
||||
* Turn the specific ::LED off.
|
||||
* @param a The ::LED to turn off.
|
||||
|
@ -278,8 +305,8 @@ private:
|
|||
void printReport(); // print incoming date - Uncomment for debugging
|
||||
|
||||
/* Private commands */
|
||||
void PS3_Command(uint8_t* data, uint16_t nbytes);
|
||||
void PS3_Command(uint8_t *data, uint16_t nbytes);
|
||||
void enable_sixaxis(); // Command used to enable the Dualshock 3 and Navigation controller to send data via USB
|
||||
void Move_Command(uint8_t* data, uint16_t nbytes);
|
||||
void Move_Command(uint8_t *data, uint16_t nbytes);
|
||||
};
|
||||
#endif
|
||||
|
|
|
@ -107,7 +107,7 @@ These libraries consist of the [PS3BT](PS3BT.cpp) and [PS3USB](PS3USB.cpp). Thes
|
|||
|
||||
In order to use your Playstation controller via Bluetooth you have to set the Bluetooth address of the dongle internally to your PS3 Controller. This can be achieved by plugging the controller in via USB and letting the library set it automatically.
|
||||
|
||||
__Note:__ To obtain the address you have to plug in the Bluetooth dongle before connecting the controller, or alternatively you could set it in code like so: <https://github.com/felis/USB_Host_Shield_2.0/blob/master/examples/Bluetooth/PS3BT/PS3BT.ino#L12>.
|
||||
__Note:__ To obtain the address you have to plug in the Bluetooth dongle before connecting the controller, or alternatively you could set it in code like so: <https://github.com/felis/USB_Host_Shield_2.0/blob/master/examples/Bluetooth/PS3BT/PS3BT.ino#L15>.
|
||||
|
||||
For more information about the PS3 protocol see the official wiki: <https://github.com/felis/USB_Host_Shield_2.0/wiki/PS3-Information>.
|
||||
|
||||
|
@ -184,7 +184,7 @@ After that you can simply create the instance like so:
|
|||
WII Wii(&Btd);
|
||||
```
|
||||
|
||||
Then just press any button any button on the Wiimote and it will connect to the dongle.
|
||||
Then just press any button on the Wiimote and it will then connect to the dongle.
|
||||
|
||||
Take a look at the example for more information: <https://github.com/felis/USB_Host_Shield_2.0/blob/master/examples/Bluetooth/Wii/Wii.ino>.
|
||||
|
||||
|
|
44
SPP.cpp
44
SPP.cpp
|
@ -16,7 +16,7 @@
|
|||
*/
|
||||
|
||||
#include "SPP.h"
|
||||
// To enable serial debugging uncomment "#define DEBUG_USB_HOST" in message.h
|
||||
// To enable serial debugging see "settings.h"
|
||||
//#define EXTRADEBUG // Uncomment to get even more debugging data
|
||||
//#define PRINTREPORT // Uncomment to print the report sent to the Arduino
|
||||
|
||||
|
@ -270,12 +270,19 @@ void SPP::ACLData(uint8_t* l2capinbuf) {
|
|||
/* Read the incoming message */
|
||||
if (rfcommChannelType == RFCOMM_UIH && rfcommChannel == rfcommChannelConnection) {
|
||||
uint8_t length = l2capinbuf[10] >> 1; // Get length
|
||||
uint8_t offset = l2capinbuf[4] - length - 4; // See if there is credit
|
||||
if (rfcommAvailable + length <= sizeof (rfcommDataBuffer)) { // Don't add data to buffer if it would be full
|
||||
for (uint8_t i = 0; i < length; i++)
|
||||
rfcommDataBuffer[rfcommAvailable + i] = l2capinbuf[11 + i + offset];
|
||||
rfcommAvailable += length;
|
||||
uint8_t offset = l2capinbuf[4] - length - 4; // Check if there is credit
|
||||
if (checkFcs(&l2capinbuf[8], l2capinbuf[11 + length + offset])) {
|
||||
uint8_t i = 0;
|
||||
for (; i < length; i++) {
|
||||
if (rfcommAvailable + i >= sizeof (rfcommDataBuffer)) {
|
||||
#ifdef DEBUG_USB_HOST
|
||||
Notify(PSTR("\r\nWarning: Buffer is full!"), 0x80);
|
||||
#endif
|
||||
break;
|
||||
}
|
||||
rfcommDataBuffer[rfcommAvailable + i] = l2capinbuf[11 + i + offset];
|
||||
}
|
||||
rfcommAvailable += i;
|
||||
#ifdef EXTRADEBUG
|
||||
Notify(PSTR("\r\nRFCOMM Data Available: "), 0x80);
|
||||
Notify(rfcommAvailable, 0x80);
|
||||
|
@ -283,6 +290,11 @@ void SPP::ACLData(uint8_t* l2capinbuf) {
|
|||
Notify(PSTR(" - Credit: 0x"), 0x80);
|
||||
D_PrintHex<uint8_t > (l2capinbuf[11], 0x80);
|
||||
}
|
||||
#endif
|
||||
}
|
||||
#ifdef DEBUG_USB_HOST
|
||||
else
|
||||
Notify(PSTR("\r\nError in FCS checksum!"), 0x80);
|
||||
#endif
|
||||
#ifdef PRINTREPORT // Uncomment "#define PRINTREPORT" to print the report send to the Arduino via Bluetooth
|
||||
for (uint8_t i = 0; i < length; i++)
|
||||
|
@ -723,16 +735,24 @@ void SPP::sendRfcommCredit(uint8_t channel, uint8_t direction, uint8_t CR, uint8
|
|||
}
|
||||
|
||||
/* CRC on 2 bytes */
|
||||
uint8_t SPP::__crc(uint8_t* data) {
|
||||
return (pgm_read_byte(&rfcomm_crc_table[pgm_read_byte(&rfcomm_crc_table[0xff ^ data[0]]) ^ data[1]]));
|
||||
uint8_t SPP::crc(uint8_t *data) {
|
||||
return (pgm_read_byte(&rfcomm_crc_table[pgm_read_byte(&rfcomm_crc_table[0xFF ^ data[0]]) ^ data[1]]));
|
||||
}
|
||||
|
||||
/* Calculate FCS - we never actually check if the host sends correct FCS to the Arduino */
|
||||
/* Calculate FCS */
|
||||
uint8_t SPP::calcFcs(uint8_t *data) {
|
||||
if ((data[1] & 0xEF) == RFCOMM_UIH)
|
||||
return (0xff - __crc(data)); // FCS on 2 bytes
|
||||
return (0xFF - crc(data)); // FCS on 2 bytes
|
||||
else
|
||||
return (0xff - pgm_read_byte(&rfcomm_crc_table[__crc(data) ^ data[2]])); // FCS on 3 bytes
|
||||
return (0xFF - pgm_read_byte(&rfcomm_crc_table[crc(data) ^ data[2]])); // FCS on 3 bytes
|
||||
}
|
||||
|
||||
/* Check FCS */
|
||||
bool SPP::checkFcs(uint8_t *data, uint8_t fcs) {
|
||||
uint8_t temp = crc(data);
|
||||
if ((data[1] & 0xEF) != RFCOMM_UIH)
|
||||
temp = pgm_read_byte(&rfcomm_crc_table[temp ^ data[2]]); // FCS on 3 bytes
|
||||
return (pgm_read_byte(&rfcomm_crc_table[temp ^ fcs]) == 0xCF);
|
||||
}
|
||||
|
||||
/* Serial commands */
|
||||
|
@ -740,7 +760,7 @@ size_t SPP::write(uint8_t data) {
|
|||
return write(&data,1);
|
||||
}
|
||||
|
||||
size_t SPP::write(const uint8_t* data, size_t size) {
|
||||
size_t SPP::write(const uint8_t *data, size_t size) {
|
||||
for(uint8_t i = 0; i < size; i++) {
|
||||
if(sppIndex >= sizeof(sppOutputBuffer)/sizeof(sppOutputBuffer[0]))
|
||||
send(); // Send the current data in the buffer
|
||||
|
|
9
SPP.h
9
SPP.h
|
@ -215,7 +215,7 @@ private:
|
|||
void RFCOMM_task(); // RFCOMM state machine
|
||||
|
||||
/* SDP Commands */
|
||||
void SDP_Command(uint8_t* data, uint8_t nbytes);
|
||||
void SDP_Command(uint8_t *data, uint8_t nbytes);
|
||||
void serviceNotSupported(uint8_t transactionIDHigh, uint8_t transactionIDLow);
|
||||
void serialPortResponse1(uint8_t transactionIDHigh, uint8_t transactionIDLow);
|
||||
void serialPortResponse2(uint8_t transactionIDHigh, uint8_t transactionIDLow);
|
||||
|
@ -223,10 +223,11 @@ private:
|
|||
void l2capResponse2(uint8_t transactionIDHigh, uint8_t transactionIDLow);
|
||||
|
||||
/* RFCOMM Commands */
|
||||
void RFCOMM_Command(uint8_t* data, uint8_t nbytes);
|
||||
void sendRfcomm(uint8_t channel, uint8_t direction, uint8_t CR, uint8_t channelType, uint8_t pfBit, uint8_t* data, uint8_t length);
|
||||
void RFCOMM_Command(uint8_t *data, uint8_t nbytes);
|
||||
void sendRfcomm(uint8_t channel, uint8_t direction, uint8_t CR, uint8_t channelType, uint8_t pfBit, uint8_t *data, uint8_t length);
|
||||
void sendRfcommCredit(uint8_t channel, uint8_t direction, uint8_t CR, uint8_t channelType, uint8_t pfBit, uint8_t credit);
|
||||
uint8_t calcFcs(uint8_t *data);
|
||||
uint8_t __crc(uint8_t* data);
|
||||
bool checkFcs(uint8_t *data, uint8_t fcs);
|
||||
uint8_t crc(uint8_t *data);
|
||||
};
|
||||
#endif
|
7
Usb.cpp
7
Usb.cpp
|
@ -567,6 +567,7 @@ uint8_t USB::DefaultAddressing(uint8_t parent, uint8_t port, bool lowspeed) {
|
|||
|
||||
uint8_t USB::AttemptConfig(uint8_t driver, uint8_t parent, uint8_t port, bool lowspeed) {
|
||||
//printf("AttemptConfig: parent = %i, port = %i\r\n", parent, port);
|
||||
uint8_t retries = 0;
|
||||
|
||||
again:
|
||||
uint8_t rcode = devConfig[driver]->ConfigureDevice(parent, port, lowspeed);
|
||||
|
@ -579,15 +580,17 @@ again:
|
|||
// reset parent port
|
||||
devConfig[parent]->ResetHubPort(port);
|
||||
}
|
||||
} else if (rcode == hrJERR) { // Some devices returns this when plugged in - trying to initialize the device again usually works
|
||||
} else if (rcode == hrJERR && retries < 3) { // Some devices returns this when plugged in - trying to initialize the device again usually works
|
||||
delay(100);
|
||||
retries++;
|
||||
goto again;
|
||||
} else if (rcode)
|
||||
return rcode;
|
||||
|
||||
rcode = devConfig[driver]->Init(parent, port, lowspeed);
|
||||
if (rcode == hrJERR) { // Some devices returns this when plugged in - trying to initialize the device again usually works
|
||||
if (rcode == hrJERR && retries < 3) { // Some devices returns this when plugged in - trying to initialize the device again usually works
|
||||
delay(100);
|
||||
retries++;
|
||||
goto again;
|
||||
}
|
||||
if (rcode) {
|
||||
|
|
8
Wii.cpp
8
Wii.cpp
|
@ -18,7 +18,7 @@
|
|||
*/
|
||||
|
||||
#include "Wii.h"
|
||||
// To enable serial debugging uncomment "#define DEBUG_USB_HOST" in message.h
|
||||
// To enable serial debugging see "settings.h"
|
||||
//#define EXTRADEBUG // Uncomment to get even more debugging data
|
||||
//#define PRINTREPORT // Uncomment to print the report send by the Wii controllers
|
||||
|
||||
|
@ -473,11 +473,11 @@ void WII::ACLData(uint8_t* l2capinbuf) {
|
|||
pitchGyroSpeed = (double)gyroPitchRaw / ((double)gyroPitchZero / pitchGyroScale);
|
||||
|
||||
/* The onboard gyro has two ranges for slow and fast mode */
|
||||
if (!(l2capinbuf[18] & 0x02)) // Check if fast more is used
|
||||
if (!(l2capinbuf[18] & 0x02)) // Check if fast mode is used
|
||||
yawGyroSpeed *= 4.545;
|
||||
if (!(l2capinbuf[18] & 0x01)) // Check if fast more is used
|
||||
if (!(l2capinbuf[18] & 0x01)) // Check if fast mode is used
|
||||
pitchGyroSpeed *= 4.545;
|
||||
if (!(l2capinbuf[19] & 0x02)) // Check if fast more is used
|
||||
if (!(l2capinbuf[19] & 0x02)) // Check if fast mode is used
|
||||
rollGyroSpeed *= 4.545;
|
||||
|
||||
compPitch = (0.93 * (compPitch + (pitchGyroSpeed * (double)(micros() - timer) / 1000000)))+(0.07 * getWiimotePitch()); // Use a complimentary filter to calculate the angle
|
||||
|
|
6
Wii.h
6
Wii.h
|
@ -191,6 +191,10 @@ public:
|
|||
* @param value See: ::LED enum.
|
||||
*/
|
||||
void setLedRaw(uint8_t value);
|
||||
/** Turn all LEDs off. */
|
||||
void setLedOff() {
|
||||
setLedRaw(0);
|
||||
}
|
||||
/**
|
||||
* Turn the specific ::LED off.
|
||||
* @param a The ::LED to turn off.
|
||||
|
@ -210,9 +214,7 @@ public:
|
|||
* This will set the LEDs, so the user can see which connections are active.
|
||||
*
|
||||
* The first ::LED indicate that the Wiimote is connected,
|
||||
*
|
||||
* the second ::LED indicate indicate that a Motion Plus is also connected
|
||||
*
|
||||
* the third ::LED will indicate that a Nunchuck controller is also connected.
|
||||
*/
|
||||
void setLedStatus();
|
||||
|
|
|
@ -1,8 +1,6 @@
|
|||
Please see <http://wiibrew.org/wiki/Wiimote#IR_Camera> for the complete capabilities of the Wii camera. The IR camera code was written based on the above website and with support from Kristian Lauszus.
|
||||
|
||||
Must omit the "." in the name of the USB\_Host\_Shiled\_2.0 library folder when inserting into the Arudino library folder.
|
||||
|
||||
This library is large, if you run into memory problems when uploading to the Arduino, comment out the \#define DEBUG in the BTD.cpp and Wii.cpp files.
|
||||
This library is large, if you run into memory problems when uploading to the Arduino, disable serial debugging.
|
||||
|
||||
To enable the IR camera code, uncomment \#define WIICAMERA in Wii.h.
|
||||
|
||||
|
|
11
XBOXOLD.cpp
11
XBOXOLD.cpp
|
@ -16,7 +16,7 @@
|
|||
*/
|
||||
|
||||
#include "XBOXOLD.h"
|
||||
// To enable serial debugging uncomment "#define DEBUG_USB_HOST" in message.h
|
||||
// To enable serial debugging see "settings.h"
|
||||
//#define EXTRADEBUG // Uncomment to get even more debugging data
|
||||
//#define PRINTREPORT // Uncomment to print the report send by the Xbox controller
|
||||
|
||||
|
@ -290,15 +290,15 @@ void XBOXOLD::printReport(uint16_t length) { //Uncomment "#define PRINTREPORT" t
|
|||
}
|
||||
|
||||
uint8_t XBOXOLD::getButtonPress(Button b) {
|
||||
uint8_t button = pgm_read_byte(&XBOXOLDBUTTONS[(uint8_t)b]);
|
||||
if (b == A || b == B || b == X || b == Y || b == BLACK || b == WHITE || b == L1 || b == R1) // A, B, X, Y, BLACK, WHITE, L1, and R1 are analog buttons
|
||||
return buttonValues[pgm_read_byte(&XBOXOLDBUTTONS[(uint8_t)b])]; // Analog buttons
|
||||
return (ButtonState & pgm_read_byte(&XBOXOLDBUTTONS[(uint8_t)b])); // Digital buttons
|
||||
return buttonValues[button]; // Analog buttons
|
||||
return (ButtonState & button); // Digital buttons
|
||||
}
|
||||
|
||||
bool XBOXOLD::getButtonClick(Button b) {
|
||||
uint8_t button;
|
||||
uint8_t button = pgm_read_byte(&XBOXOLDBUTTONS[(uint8_t)b]);
|
||||
if (b == A || b == B || b == X || b == Y || b == BLACK || b == WHITE || b == L1 || b == R1) { // A, B, X, Y, BLACK, WHITE, L1, and R1 are analog buttons
|
||||
button = pgm_read_byte(&XBOXOLDBUTTONS[(uint8_t)b]);
|
||||
if (buttonClicked[button]) {
|
||||
buttonClicked[button] = false;
|
||||
return true;
|
||||
|
@ -306,7 +306,6 @@ bool XBOXOLD::getButtonClick(Button b) {
|
|||
return false;
|
||||
}
|
||||
|
||||
button = pgm_read_byte(&XBOXOLDBUTTONS[(uint8_t)b]); // Digital buttons
|
||||
bool click = (ButtonClickState & button);
|
||||
ButtonClickState &= ~button; // clear "click" event
|
||||
return click;
|
||||
|
|
220
XBOXRECV.cpp
220
XBOXRECV.cpp
|
@ -18,7 +18,7 @@
|
|||
*/
|
||||
|
||||
#include "XBOXRECV.h"
|
||||
// To enable serial debugging uncomment "#define DEBUG_USB_HOST" in message.h
|
||||
// To enable serial debugging see "settings.h"
|
||||
//#define EXTRADEBUG // Uncomment to get even more debugging data
|
||||
//#define PRINTREPORT // Uncomment to print the report send by the Xbox 360 Controller
|
||||
|
||||
|
@ -37,29 +37,27 @@ bPollEnable(false) { // don't start polling before dongle is connected
|
|||
pUsb->RegisterDeviceClass(this); //set devConfig[] entry
|
||||
}
|
||||
|
||||
uint8_t XBOXRECV::Init(uint8_t parent, uint8_t port, bool lowspeed) {
|
||||
uint8_t buf[sizeof (USB_DEVICE_DESCRIPTOR)];
|
||||
uint8_t XBOXRECV::ConfigureDevice(uint8_t parent, uint8_t port, bool lowspeed) {
|
||||
const uint8_t constBufSize = sizeof (USB_DEVICE_DESCRIPTOR);
|
||||
uint8_t buf[constBufSize];
|
||||
uint8_t rcode;
|
||||
UsbDevice *p = NULL;
|
||||
EpInfo *oldep_ptr = NULL;
|
||||
uint16_t PID;
|
||||
uint16_t VID;
|
||||
uint16_t PID, VID;
|
||||
|
||||
// get memory address of USB device address pool
|
||||
AddressPool &addrPool = pUsb->GetAddressPool();
|
||||
AddressPool &addrPool = pUsb->GetAddressPool(); // Get memory address of USB device address pool
|
||||
#ifdef EXTRADEBUG
|
||||
Notify(PSTR("\r\nXBOXRECV Init"), 0x80);
|
||||
#endif
|
||||
// check if address has already been assigned to an instance
|
||||
if (bAddress) {
|
||||
|
||||
if (bAddress) { // Check if address has already been assigned to an instance
|
||||
#ifdef DEBUG_USB_HOST
|
||||
Notify(PSTR("\r\nAddress in use"), 0x80);
|
||||
#endif
|
||||
return USB_ERROR_CLASS_INSTANCE_ALREADY_IN_USE;
|
||||
}
|
||||
|
||||
// Get pointer to pseudo device with address 0 assigned
|
||||
p = addrPool.GetUsbDevicePtr(0);
|
||||
p = addrPool.GetUsbDevicePtr(0); // Get pointer to pseudo device with address 0 assigned
|
||||
|
||||
if (!p) {
|
||||
#ifdef DEBUG_USB_HOST
|
||||
|
@ -75,18 +73,13 @@ uint8_t XBOXRECV::Init(uint8_t parent, uint8_t port, bool lowspeed) {
|
|||
return USB_ERROR_EPINFO_IS_NULL;
|
||||
}
|
||||
|
||||
// Save old pointer to EP_RECORD of address 0
|
||||
oldep_ptr = p->epinfo;
|
||||
|
||||
// Temporary assign new pointer to epInfo to p->epinfo in order to avoid toggle inconsistence
|
||||
p->epinfo = epInfo;
|
||||
|
||||
oldep_ptr = p->epinfo; // Save old pointer to EP_RECORD of address 0
|
||||
p->epinfo = epInfo; // Temporary assign new pointer to epInfo to p->epinfo in order to avoid toggle inconsistence
|
||||
p->lowspeed = lowspeed;
|
||||
|
||||
// Get device descriptor
|
||||
rcode = pUsb->getDevDescr(0, 0, sizeof (USB_DEVICE_DESCRIPTOR), (uint8_t*)buf); // Get device descriptor - addr, ep, nbytes, data
|
||||
// Restore p->epinfo
|
||||
p->epinfo = oldep_ptr;
|
||||
rcode = pUsb->getDevDescr(0, 0, constBufSize, (uint8_t*)buf); // Get device descriptor - addr, ep, nbytes, data
|
||||
|
||||
p->epinfo = oldep_ptr; // Restore p->epinfo
|
||||
|
||||
if (rcode)
|
||||
goto FailGetDevDescr;
|
||||
|
@ -94,53 +87,100 @@ uint8_t XBOXRECV::Init(uint8_t parent, uint8_t port, bool lowspeed) {
|
|||
VID = ((USB_DEVICE_DESCRIPTOR*)buf)->idVendor;
|
||||
PID = ((USB_DEVICE_DESCRIPTOR*)buf)->idProduct;
|
||||
|
||||
if (VID != XBOX_VID && VID != MADCATZ_VID) // We just check if it's a Xbox receiver using the Vendor ID
|
||||
goto FailUnknownDevice;
|
||||
else if (PID != XBOX_WIRELESS_RECEIVER_PID && PID != XBOX_WIRELESS_RECEIVER_THIRD_PARTY_PID) { // Check the PID as well
|
||||
if ((VID != XBOX_VID && VID != MADCATZ_VID) || (PID != XBOX_WIRELESS_RECEIVER_PID && PID != XBOX_WIRELESS_RECEIVER_THIRD_PARTY_PID)) { // Check if it's a Xbox receiver using the Vendor ID and Product ID
|
||||
#ifdef DEBUG_USB_HOST
|
||||
Notify(PSTR("\r\nYou'll need a wireless receiver for this libary to work"), 0x80);
|
||||
#endif
|
||||
goto FailUnknownDevice;
|
||||
}
|
||||
|
||||
// Allocate new address according to device class
|
||||
bAddress = addrPool.AllocAddress(parent, false, port);
|
||||
bAddress = addrPool.AllocAddress(parent, false, port); // Allocate new address according to device class
|
||||
|
||||
if (!bAddress)
|
||||
if (!bAddress) {
|
||||
#ifdef DEBUG_USB_HOST
|
||||
Notify(PSTR("\r\nOut of address space"), 0x80);
|
||||
#endif
|
||||
return USB_ERROR_OUT_OF_ADDRESS_SPACE_IN_POOL;
|
||||
}
|
||||
|
||||
// Extract Max Packet Size from device descriptor
|
||||
epInfo[0].maxPktSize = (uint8_t)((USB_DEVICE_DESCRIPTOR*)buf)->bMaxPacketSize0;
|
||||
epInfo[0].maxPktSize = (uint8_t)((USB_DEVICE_DESCRIPTOR*)buf)->bMaxPacketSize0; // Extract Max Packet Size from device descriptor
|
||||
epInfo[1].epAddr = ((USB_DEVICE_DESCRIPTOR*)buf)->bNumConfigurations; // Steal and abuse from epInfo structure to save memory
|
||||
|
||||
// Assign new address to the device
|
||||
rcode = pUsb->setAddr(0, 0, bAddress);
|
||||
delay(20); // Wait a little before resetting device
|
||||
|
||||
return USB_ERROR_CONFIG_REQUIRES_ADDITIONAL_RESET;
|
||||
|
||||
/* Diagnostic messages */
|
||||
FailGetDevDescr:
|
||||
#ifdef DEBUG_USB_HOST
|
||||
NotifyFailGetDevDescr(rcode);
|
||||
#endif
|
||||
if (rcode != hrJERR)
|
||||
rcode = USB_ERROR_FailGetDevDescr;
|
||||
goto Fail;
|
||||
|
||||
FailUnknownDevice:
|
||||
#ifdef DEBUG_USB_HOST
|
||||
NotifyFailUnknownDevice(VID,PID);
|
||||
#endif
|
||||
rcode = USB_DEV_CONFIG_ERROR_DEVICE_NOT_SUPPORTED;
|
||||
|
||||
Fail:
|
||||
#ifdef DEBUG_USB_HOST
|
||||
Notify(PSTR("\r\nXbox 360 Init Failed, error code: "), 0x80);
|
||||
NotifyFail(rcode);
|
||||
#endif
|
||||
Release();
|
||||
return rcode;
|
||||
};
|
||||
|
||||
uint8_t XBOXRECV::Init(uint8_t parent, uint8_t port, bool lowspeed) {
|
||||
uint8_t rcode;
|
||||
uint8_t num_of_conf = epInfo[1].epAddr; // Number of configurations
|
||||
epInfo[1].epAddr = 0;
|
||||
|
||||
AddressPool &addrPool = pUsb->GetAddressPool();
|
||||
#ifdef EXTRADEBUG
|
||||
Notify(PSTR("\r\nBTD Init"), 0x80);
|
||||
#endif
|
||||
UsbDevice *p = addrPool.GetUsbDevicePtr(bAddress); // Get pointer to assigned address record
|
||||
|
||||
if (!p) {
|
||||
#ifdef DEBUG_USB_HOST
|
||||
Notify(PSTR("\r\nAddress not found"), 0x80);
|
||||
#endif
|
||||
return USB_ERROR_ADDRESS_NOT_FOUND_IN_POOL;
|
||||
}
|
||||
|
||||
delay(300); // Assign new address to the device
|
||||
|
||||
rcode = pUsb->setAddr(0, 0, bAddress); // Assign new address to the device
|
||||
if (rcode) {
|
||||
p->lowspeed = false;
|
||||
addrPool.FreeAddress(bAddress);
|
||||
bAddress = 0;
|
||||
#ifdef DEBUG_USB_HOST
|
||||
Notify(PSTR("\r\nsetAddr: "), 0x80);
|
||||
D_PrintHex<uint8_t > (rcode, 0x80);
|
||||
#endif
|
||||
return rcode;
|
||||
p->lowspeed = false;
|
||||
goto Fail;
|
||||
}
|
||||
#ifdef EXTRADEBUG
|
||||
Notify(PSTR("\r\nAddr: "), 0x80);
|
||||
D_PrintHex<uint8_t > (bAddress, 0x80);
|
||||
#endif
|
||||
delay(300); // Spec says you should wait at least 200ms
|
||||
|
||||
p->lowspeed = false;
|
||||
|
||||
//get pointer to assigned address record
|
||||
p = addrPool.GetUsbDevicePtr(bAddress);
|
||||
if (!p)
|
||||
p = addrPool.GetUsbDevicePtr(bAddress); // Get pointer to assigned address record
|
||||
if (!p) {
|
||||
#ifdef DEBUG_USB_HOST
|
||||
Notify(PSTR("\r\nAddress not found"), 0x80);
|
||||
#endif
|
||||
return USB_ERROR_ADDRESS_NOT_FOUND_IN_POOL;
|
||||
}
|
||||
|
||||
p->lowspeed = lowspeed;
|
||||
|
||||
// Assign epInfo to epinfo pointer - only EP0 is known
|
||||
rcode = pUsb->setEpInfoEntry(bAddress, 1, epInfo);
|
||||
rcode = pUsb->setEpInfoEntry(bAddress, 1, epInfo); // Assign epInfo to epinfo pointer - only EP0 is known
|
||||
if (rcode)
|
||||
goto FailSetDevTblEntry;
|
||||
|
||||
|
@ -216,9 +256,10 @@ uint8_t XBOXRECV::Init(uint8_t parent, uint8_t port, bool lowspeed) {
|
|||
#endif
|
||||
XboxReceiverConnected = true;
|
||||
bPollEnable = true;
|
||||
return 0; // successful configuration
|
||||
checkStatusTimer = 0; // Reset timer
|
||||
return 0; // Successful configuration
|
||||
|
||||
/* diagnostic messages */
|
||||
/* Diagnostic messages */
|
||||
FailGetDevDescr:
|
||||
#ifdef DEBUG_USB_HOST
|
||||
NotifyFailGetDevDescr();
|
||||
|
@ -237,12 +278,6 @@ FailSetConfDescr:
|
|||
#endif
|
||||
goto Fail;
|
||||
|
||||
FailUnknownDevice:
|
||||
#ifdef DEBUG_USB_HOST
|
||||
NotifyFailUnknownDevice(VID,PID);
|
||||
#endif
|
||||
rcode = USB_DEV_CONFIG_ERROR_DEVICE_NOT_SUPPORTED;
|
||||
|
||||
Fail:
|
||||
#ifdef DEBUG_USB_HOST
|
||||
Notify(PSTR("\r\nXbox 360 Init Failed, error code: "), 0x80);
|
||||
|
@ -266,23 +301,23 @@ uint8_t XBOXRECV::Release() {
|
|||
uint8_t XBOXRECV::Poll() {
|
||||
if (!bPollEnable)
|
||||
return 0;
|
||||
if (!timer || ((millis() - timer) > 3000)) { // Run checkStatus every 3 seconds
|
||||
timer = millis();
|
||||
if (!checkStatusTimer || ((millis() - checkStatusTimer) > 3000)) { // Run checkStatus every 3 seconds
|
||||
checkStatusTimer = millis();
|
||||
checkStatus();
|
||||
}
|
||||
|
||||
uint8_t inputPipe;
|
||||
uint16_t bufferSize;
|
||||
for (uint8_t i = 0; i < 4; i++) {
|
||||
switch (i) {
|
||||
case 0: inputPipe = XBOX_INPUT_PIPE_1;
|
||||
break;
|
||||
case 1: inputPipe = XBOX_INPUT_PIPE_2;
|
||||
break;
|
||||
case 2: inputPipe = XBOX_INPUT_PIPE_3;
|
||||
break;
|
||||
case 3: inputPipe = XBOX_INPUT_PIPE_4;
|
||||
break;
|
||||
}
|
||||
if (i == 0)
|
||||
inputPipe = XBOX_INPUT_PIPE_1;
|
||||
else if (i == 1)
|
||||
inputPipe = XBOX_INPUT_PIPE_2;
|
||||
else if (i == 2)
|
||||
inputPipe = XBOX_INPUT_PIPE_3;
|
||||
else
|
||||
inputPipe = XBOX_INPUT_PIPE_4;
|
||||
|
||||
bufferSize = EP_MAXPKTSIZE; // This is the maximum number of bytes we want to receive
|
||||
pUsb->inTransfer(bAddress, epInfo[ inputPipe ].epAddr, &bufferSize, readBuf);
|
||||
if (bufferSize > 0) { // The number of received bytes
|
||||
|
@ -420,47 +455,54 @@ bool XBOXRECV::buttonChanged(uint8_t controller) {
|
|||
|
||||
/*
|
||||
ControllerStatus Breakdown
|
||||
ControllerStatus[controller] & 0x0001 // 0
|
||||
ControllerStatus[controller] & 0x0002 // normal batteries, no rechargeable battery pack
|
||||
ControllerStatus[controller] & 0x0004 // controller starting up / settling
|
||||
ControllerStatus[controller] & 0x0008 // headset adapter plugged in, but no headphones connected (mute?)
|
||||
ControllerStatus[controller] & 0x0010 // 0
|
||||
ControllerStatus[controller] & 0x0020 // 1
|
||||
ControllerStatus[controller] & 0x0040 // battery level (high bit)
|
||||
ControllerStatus[controller] & 0x0080 // battery level (low bit)
|
||||
ControllerStatus[controller] & 0x0100 // 1
|
||||
ControllerStatus[controller] & 0x0200 // 1
|
||||
ControllerStatus[controller] & 0x0400 // headset adapter plugged in
|
||||
ControllerStatus[controller] & 0x0800 // 0
|
||||
ControllerStatus[controller] & 0x1000 // 1
|
||||
ControllerStatus[controller] & 0x2000 // 0
|
||||
ControllerStatus[controller] & 0x4000 // 0
|
||||
ControllerStatus[controller] & 0x8000 // 0
|
||||
ControllerStatus[controller] & 0x0001 // 0
|
||||
ControllerStatus[controller] & 0x0002 // normal batteries, no rechargeable battery pack
|
||||
ControllerStatus[controller] & 0x0004 // controller starting up / settling
|
||||
ControllerStatus[controller] & 0x0008 // headset adapter plugged in, but no headphones connected (mute?)
|
||||
ControllerStatus[controller] & 0x0010 // 0
|
||||
ControllerStatus[controller] & 0x0020 // 1
|
||||
ControllerStatus[controller] & 0x0040 // battery level (high bit)
|
||||
ControllerStatus[controller] & 0x0080 // battery level (low bit)
|
||||
ControllerStatus[controller] & 0x0100 // 1
|
||||
ControllerStatus[controller] & 0x0200 // 1
|
||||
ControllerStatus[controller] & 0x0400 // headset adapter plugged in
|
||||
ControllerStatus[controller] & 0x0800 // 0
|
||||
ControllerStatus[controller] & 0x1000 // 1
|
||||
ControllerStatus[controller] & 0x2000 // 0
|
||||
ControllerStatus[controller] & 0x4000 // 0
|
||||
ControllerStatus[controller] & 0x8000 // 0
|
||||
*/
|
||||
uint8_t XBOXRECV::getBatteryLevel(uint8_t controller) {
|
||||
return ((controllerStatus[controller] & 0x00C0) >> 6);
|
||||
}
|
||||
|
||||
void XBOXRECV::XboxCommand(uint8_t controller, uint8_t* data, uint16_t nbytes) {
|
||||
uint8_t rcode;
|
||||
uint8_t outputPipe;
|
||||
switch (controller) {
|
||||
case 0: outputPipe = XBOX_OUTPUT_PIPE_1;
|
||||
break;
|
||||
case 1: outputPipe = XBOX_OUTPUT_PIPE_2;
|
||||
break;
|
||||
case 2: outputPipe = XBOX_OUTPUT_PIPE_3;
|
||||
break;
|
||||
case 3: outputPipe = XBOX_OUTPUT_PIPE_4;
|
||||
break;
|
||||
}
|
||||
rcode = pUsb->outTransfer(bAddress, epInfo[ outputPipe ].epAddr, nbytes, data);
|
||||
if (controller == 0)
|
||||
outputPipe = XBOX_OUTPUT_PIPE_1;
|
||||
else if (controller == 1)
|
||||
outputPipe = XBOX_OUTPUT_PIPE_2;
|
||||
else if (controller == 2)
|
||||
outputPipe = XBOX_OUTPUT_PIPE_3;
|
||||
else
|
||||
outputPipe = XBOX_OUTPUT_PIPE_4;
|
||||
|
||||
uint8_t rcode = pUsb->outTransfer(bAddress, epInfo[ outputPipe ].epAddr, nbytes, data);
|
||||
#ifdef EXTRADEBUG
|
||||
if (rcode)
|
||||
Notify(PSTR("Error sending Xbox message\r\n"), 0x80);
|
||||
#endif
|
||||
}
|
||||
|
||||
void XBOXRECV::disconnect(uint8_t controller) {
|
||||
writeBuf[0] = 0x00;
|
||||
writeBuf[1] = 0x00;
|
||||
writeBuf[2] = 0x08;
|
||||
writeBuf[3] = 0xC0;
|
||||
|
||||
XboxCommand(controller, writeBuf, 4);
|
||||
}
|
||||
|
||||
void XBOXRECV::setLedRaw(uint8_t value, uint8_t controller) {
|
||||
writeBuf[0] = 0x00;
|
||||
writeBuf[1] = 0x00;
|
||||
|
|
16
XBOXRECV.h
16
XBOXRECV.h
|
@ -64,6 +64,14 @@ public:
|
|||
XBOXRECV(USB *pUsb);
|
||||
|
||||
/** @name USBDeviceConfig implementation */
|
||||
/**
|
||||
* Address assignment and basic initilization is done here.
|
||||
* @param parent Hub number.
|
||||
* @param port Port number on the hub.
|
||||
* @param lowspeed Speed of the device.
|
||||
* @return 0 on success.
|
||||
*/
|
||||
virtual uint8_t ConfigureDevice(uint8_t parent, uint8_t port, bool lowspeed);
|
||||
/**
|
||||
* Initialize the Xbox wireless receiver.
|
||||
* @param parent Hub number.
|
||||
|
@ -136,6 +144,12 @@ public:
|
|||
*/
|
||||
int16_t getAnalogHat(AnalogHat a, uint8_t controller = 0);
|
||||
|
||||
/**
|
||||
* Used to disconnect any of the controllers.
|
||||
* @param controller The controller to disconnect. Default to 0.
|
||||
*/
|
||||
void disconnect(uint8_t controller = 0);
|
||||
|
||||
/**
|
||||
* Turn rumble off and all the LEDs on the specific controller.
|
||||
* @param controller The controller to write to. Default to 0.
|
||||
|
@ -251,7 +265,7 @@ private:
|
|||
bool L2Clicked[4]; // These buttons are analog, so we use we use these bools to check if they where clicked or not
|
||||
bool R2Clicked[4];
|
||||
|
||||
unsigned long timer; // Timing for checkStatus() signals
|
||||
uint32_t checkStatusTimer; // Timing for checkStatus() signals
|
||||
|
||||
uint8_t readBuf[EP_MAXPKTSIZE]; // General purpose buffer for input data
|
||||
uint8_t writeBuf[7]; // General purpose buffer for output data
|
||||
|
|
|
@ -16,7 +16,7 @@
|
|||
*/
|
||||
|
||||
#include "XBOXUSB.h"
|
||||
// To enable serial debugging uncomment "#define DEBUG_USB_HOST" in message.h
|
||||
// To enable serial debugging see "settings.h"
|
||||
//#define EXTRADEBUG // Uncomment to get even more debugging data
|
||||
//#define PRINTREPORT // Uncomment to print the report send by the Xbox 360 Controller
|
||||
|
||||
|
@ -282,7 +282,7 @@ uint8_t XBOXUSB::getButtonPress(Button b) {
|
|||
return (uint8_t)(ButtonState >> 8);
|
||||
else if (b == R2)
|
||||
return (uint8_t)ButtonState;
|
||||
return (ButtonState & ((uint32_t)pgm_read_word(&XBOXBUTTONS[(uint8_t)b]) << 16));
|
||||
return (bool)(ButtonState & ((uint32_t)pgm_read_word(&XBOXBUTTONS[(uint8_t)b]) << 16));
|
||||
}
|
||||
|
||||
bool XBOXUSB::getButtonClick(Button b) {
|
||||
|
|
78
adk.cpp
78
adk.cpp
|
@ -13,7 +13,7 @@ Contact information
|
|||
Circuits At Home, LTD
|
||||
Web : http://www.circuitsathome.com
|
||||
e-mail : support@circuitsathome.com
|
||||
*/
|
||||
*/
|
||||
|
||||
/* Google ADK interface */
|
||||
|
||||
|
@ -30,7 +30,6 @@ ADK::ADK(USB *p, const char* manufacturer,
|
|||
const char* serial) :
|
||||
|
||||
/* ADK ID Strings */
|
||||
|
||||
manufacturer(manufacturer),
|
||||
model(model),
|
||||
description(description),
|
||||
|
@ -46,12 +45,10 @@ ready(false) {
|
|||
for (uint8_t i = 0; i < ADK_MAX_ENDPOINTS; i++) {
|
||||
epInfo[i].epAddr = 0;
|
||||
epInfo[i].maxPktSize = (i) ? 0 : 8;
|
||||
epInfo[i].epAttribs = (0xfc & (USB_NAK_MAX_POWER << 2));
|
||||
epInfo[i].epAttribs = 0;
|
||||
epInfo[i].bmNakPower = (i) ? USB_NAK_NOWAIT : USB_NAK_MAX_POWER;
|
||||
}//for(uint8_t i=0; i<ADK_MAX_ENDPOINTS; i++...
|
||||
|
||||
//set bulk-IN EP naklimit to 1
|
||||
epInfo[epDataInIndex].epAttribs = (0xfc & (USB_NAK_NOWAIT << 2));
|
||||
|
||||
// register in USB subsystem
|
||||
if (pUsb) {
|
||||
pUsb->RegisterDeviceClass(this); //set devConfig[] entry
|
||||
|
@ -64,7 +61,6 @@ uint8_t ADK::ConfigureDevice(uint8_t parent, uint8_t port, bool lowspeed) {
|
|||
|
||||
/* Connection initialization of an Android phone */
|
||||
uint8_t ADK::Init(uint8_t parent, uint8_t port, bool lowspeed) {
|
||||
|
||||
uint8_t buf[sizeof (USB_DEVICE_DESCRIPTOR)];
|
||||
uint8_t rcode;
|
||||
uint8_t num_of_conf; // number of configurations
|
||||
|
@ -118,6 +114,7 @@ uint8_t ADK::Init(uint8_t parent, uint8_t port, bool lowspeed) {
|
|||
|
||||
// Extract Max Packet Size from device descriptor
|
||||
epInfo[0].maxPktSize = (uint8_t)((USB_DEVICE_DESCRIPTOR*)buf)->bMaxPacketSize0;
|
||||
|
||||
// Assign new address to the device
|
||||
rcode = pUsb->setAddr(0, 0, bAddress);
|
||||
if (rcode) {
|
||||
|
@ -156,10 +153,18 @@ uint8_t ADK::Init(uint8_t parent, uint8_t port, bool lowspeed) {
|
|||
num_of_conf = ((USB_DEVICE_DESCRIPTOR*)buf)->bNumConfigurations;
|
||||
|
||||
//USBTRACE2("\r\nNC:",num_of_conf);
|
||||
|
||||
for (uint8_t i = 0; i < num_of_conf; i++) {
|
||||
ConfigDescParser < 0, 0, 0, 0 > confDescrParser(this);
|
||||
delay(1);
|
||||
rcode = pUsb->getConfDescr(bAddress, 0, i, &confDescrParser);
|
||||
#if defined(XOOM)
|
||||
//added by Jaylen Scott Vanorden
|
||||
if (rcode) {
|
||||
USBTRACE2("\r\nGot 1st bad code for config: ", rcode);
|
||||
// Try once more
|
||||
rcode = pUsb->getConfDescr(bAddress, 0, i, &confDescrParser);
|
||||
}
|
||||
#endif
|
||||
if (rcode) {
|
||||
goto FailGetConfDescr;
|
||||
}
|
||||
|
@ -176,27 +181,27 @@ uint8_t ADK::Init(uint8_t parent, uint8_t port, bool lowspeed) {
|
|||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
// Set Configuration Value
|
||||
rcode = pUsb->setConf(bAddress, 0, bConfNum);
|
||||
if (rcode) {
|
||||
goto FailSetConfDescr;
|
||||
}
|
||||
/* print endpoint structure */
|
||||
// USBTRACE("\r\nEndpoint Structure:");
|
||||
// USBTRACE("\r\nEP0:");
|
||||
// USBTRACE2("\r\nAddr: ", epInfo[0].epAddr );
|
||||
// USBTRACE2("\r\nMax.pkt.size: ", epInfo[0].maxPktSize );
|
||||
// USBTRACE2("\r\nAttr: ", epInfo[0].epAttribs );
|
||||
// USBTRACE("\r\nEpout:");
|
||||
// USBTRACE2("\r\nAddr: ", epInfo[epDataOutIndex].epAddr );
|
||||
// USBTRACE2("\r\nMax.pkt.size: ", epInfo[epDataOutIndex].maxPktSize );
|
||||
// USBTRACE2("\r\nAttr: ", epInfo[epDataOutIndex].epAttribs );
|
||||
// USBTRACE("\r\nEpin:");
|
||||
// USBTRACE2("\r\nAddr: ", epInfo[epDataInIndex].epAddr );
|
||||
// USBTRACE2("\r\nMax.pkt.size: ", epInfo[epDataInIndex].maxPktSize );
|
||||
// USBTRACE2("\r\nAttr: ", epInfo[epDataInIndex].epAttribs );
|
||||
/*
|
||||
USBTRACE("\r\nEndpoint Structure:");
|
||||
USBTRACE("\r\nEP0:");
|
||||
USBTRACE2("\r\nAddr: ", epInfo[0].epAddr);
|
||||
USBTRACE2("\r\nMax.pkt.size: ", epInfo[0].maxPktSize);
|
||||
USBTRACE2("\r\nAttr: ", epInfo[0].epAttribs);
|
||||
USBTRACE("\r\nEpout:");
|
||||
USBTRACE2("\r\nAddr: ", epInfo[epDataOutIndex].epAddr);
|
||||
USBTRACE2("\r\nMax.pkt.size: ", epInfo[epDataOutIndex].maxPktSize);
|
||||
USBTRACE2("\r\nAttr: ", epInfo[epDataOutIndex].epAttribs);
|
||||
USBTRACE("\r\nEpin:");
|
||||
USBTRACE2("\r\nAddr: ", epInfo[epDataInIndex].epAddr);
|
||||
USBTRACE2("\r\nMax.pkt.size: ", epInfo[epDataInIndex].maxPktSize);
|
||||
USBTRACE2("\r\nAttr: ", epInfo[epDataInIndex].epAttribs);
|
||||
*/
|
||||
|
||||
USBTRACE("\r\nConfiguration successful");
|
||||
ready = true;
|
||||
|
@ -206,7 +211,16 @@ uint8_t ADK::Init(uint8_t parent, uint8_t port, bool lowspeed) {
|
|||
//probe device - get accessory protocol revision
|
||||
{
|
||||
uint16_t adkproto = -1;
|
||||
delay(1);
|
||||
rcode = getProto((uint8_t*) & adkproto);
|
||||
#if defined(XOOM)
|
||||
//added by Jaylen Scott Vanorden
|
||||
if (rcode) {
|
||||
USBTRACE2("\r\nGot 1st bad code for proto: ", rcode);
|
||||
// Try once more
|
||||
rcode = getProto((uint8_t*) & adkproto);
|
||||
}
|
||||
#endif
|
||||
if (rcode) {
|
||||
goto FailGetProto; //init fails
|
||||
}
|
||||
|
@ -272,10 +286,9 @@ SwAttempt:
|
|||
#ifdef DEBUG_USB_HOST
|
||||
USBTRACE("\r\nAccessory mode switch attempt");
|
||||
#endif
|
||||
//FailOnInit:
|
||||
// USBTRACE("OnInit:");
|
||||
// goto Fail;
|
||||
//
|
||||
//FailOnInit:
|
||||
// USBTRACE("OnInit:");
|
||||
// goto Fail;
|
||||
Fail:
|
||||
//USBTRACE2("\r\nADK Init Failed, error code: ", rcode);
|
||||
//NotifyFail(rcode);
|
||||
|
@ -286,7 +299,7 @@ Fail:
|
|||
/* Extracts bulk-IN and bulk-OUT endpoint information from config descriptor */
|
||||
void ADK::EndpointXtract(uint8_t conf, uint8_t iface, uint8_t alt, uint8_t proto, const USB_ENDPOINT_DESCRIPTOR *pep) {
|
||||
//ErrorMessage<uint8_t>(PSTR("Conf.Val"), conf);
|
||||
//ErrorMessage<uint8_t>(PSTR("Iface Num"),iface);
|
||||
//ErrorMessage<uint8_t>(PSTR("Iface Num"), iface);
|
||||
//ErrorMessage<uint8_t>(PSTR("Alt.Set"), alt);
|
||||
|
||||
//added by Yuuichi Akagawa
|
||||
|
@ -296,12 +309,8 @@ void ADK::EndpointXtract(uint8_t conf, uint8_t iface, uint8_t alt, uint8_t proto
|
|||
|
||||
bConfNum = conf;
|
||||
|
||||
uint8_t index;
|
||||
|
||||
// if ((pep->bmAttributes & 0x02) == 2) {
|
||||
index = ((pep->bEndpointAddress & 0x80) == 0x80) ? epDataInIndex : epDataOutIndex;
|
||||
// }
|
||||
|
||||
if ((pep->bmAttributes & 0x02) == 2) {
|
||||
uint8_t index = ((pep->bEndpointAddress & 0x80) == 0x80) ? epDataInIndex : epDataOutIndex;
|
||||
// Fill in the endpoint info structure
|
||||
epInfo[index].epAddr = (pep->bEndpointAddress & 0x0F);
|
||||
epInfo[index].maxPktSize = (uint8_t)pep->wMaxPacketSize;
|
||||
|
@ -309,6 +318,7 @@ void ADK::EndpointXtract(uint8_t conf, uint8_t iface, uint8_t alt, uint8_t proto
|
|||
bNumEP++;
|
||||
|
||||
//PrintEndpointDescriptor(pep);
|
||||
}
|
||||
}
|
||||
|
||||
/* Performs a cleanup after failed Init() attempt */
|
||||
|
|
6
adk.h
6
adk.h
|
@ -13,7 +13,7 @@ Contact information
|
|||
Circuits At Home, LTD
|
||||
Web : http://www.circuitsathome.com
|
||||
e-mail : support@circuitsathome.com
|
||||
*/
|
||||
*/
|
||||
|
||||
/* Google ADK interface support header */
|
||||
|
||||
|
@ -26,6 +26,10 @@ e-mail : support@circuitsathome.com
|
|||
#define ADK_PID 0x2D00
|
||||
#define ADB_PID 0x2D01
|
||||
|
||||
#define XOOM //enables repeating getProto() and getConf() attempts
|
||||
//necessary for slow devices such as Motorola XOOM
|
||||
//defined by default, can be commented out to save memory
|
||||
|
||||
/* requests */
|
||||
|
||||
#define ADK_GETPROTO 51 //check USB accessory protocol version
|
||||
|
|
|
@ -8,7 +8,8 @@
|
|||
#include <usbhub.h>
|
||||
|
||||
USB Usb;
|
||||
USBHub Hub1(&Usb); // Some dongles have a hub inside
|
||||
//USBHub Hub1(&Usb); // Some dongles have a hub inside
|
||||
|
||||
BTD Btd(&Usb); // You have to create the Bluetooth Dongle instance like so
|
||||
/* You can create the instance of the class in two ways */
|
||||
PS3BT PS3(&Btd); // This will just create the instance
|
||||
|
@ -22,20 +23,20 @@ void setup() {
|
|||
while (!Serial); // Wait for serial port to connect - used on Leonardo, Teensy and other boards with built-in USB CDC serial connection
|
||||
if (Usb.Init() == -1) {
|
||||
Serial.print(F("\r\nOSC did not start"));
|
||||
while(1); //halt
|
||||
while (1); //halt
|
||||
}
|
||||
Serial.print(F("\r\nPS3 Bluetooth Library Started"));
|
||||
}
|
||||
void loop() {
|
||||
Usb.Task();
|
||||
|
||||
if(PS3.PS3Connected || PS3.PS3NavigationConnected) {
|
||||
if(PS3.getAnalogHat(LeftHatX) > 137 || PS3.getAnalogHat(LeftHatX) < 117 || PS3.getAnalogHat(LeftHatY) > 137 || PS3.getAnalogHat(LeftHatY) < 117 || PS3.getAnalogHat(RightHatX) > 137 || PS3.getAnalogHat(RightHatX) < 117 || PS3.getAnalogHat(RightHatY) > 137 || PS3.getAnalogHat(RightHatY) < 117) {
|
||||
if (PS3.PS3Connected || PS3.PS3NavigationConnected) {
|
||||
if (PS3.getAnalogHat(LeftHatX) > 137 || PS3.getAnalogHat(LeftHatX) < 117 || PS3.getAnalogHat(LeftHatY) > 137 || PS3.getAnalogHat(LeftHatY) < 117 || PS3.getAnalogHat(RightHatX) > 137 || PS3.getAnalogHat(RightHatX) < 117 || PS3.getAnalogHat(RightHatY) > 137 || PS3.getAnalogHat(RightHatY) < 117) {
|
||||
Serial.print(F("\r\nLeftHatX: "));
|
||||
Serial.print(PS3.getAnalogHat(LeftHatX));
|
||||
Serial.print(F("\tLeftHatY: "));
|
||||
Serial.print(PS3.getAnalogHat(LeftHatY));
|
||||
if(!PS3.PS3NavigationConnected) {
|
||||
if (PS3.PS3Connected) { // The Navigation controller only have one joystick
|
||||
Serial.print(F("\tRightHatX: "));
|
||||
Serial.print(PS3.getAnalogHat(RightHatX));
|
||||
Serial.print(F("\tRightHatY: "));
|
||||
|
@ -43,131 +44,131 @@ void loop() {
|
|||
}
|
||||
}
|
||||
|
||||
//Analog button values can be read from almost all buttons
|
||||
if(PS3.getAnalogButton(L2) || PS3.getAnalogButton(R2)) {
|
||||
// Analog button values can be read from almost all buttons
|
||||
if (PS3.getAnalogButton(L2) || PS3.getAnalogButton(R2)) {
|
||||
Serial.print(F("\r\nL2: "));
|
||||
Serial.print(PS3.getAnalogButton(L2));
|
||||
if(!PS3.PS3NavigationConnected) {
|
||||
if (!PS3.PS3NavigationConnected) {
|
||||
Serial.print(F("\tR2: "));
|
||||
Serial.print(PS3.getAnalogButton(R2));
|
||||
}
|
||||
}
|
||||
if(PS3.getButtonClick(PS)) {
|
||||
if (PS3.getButtonClick(PS)) {
|
||||
Serial.print(F("\r\nPS"));
|
||||
PS3.disconnect();
|
||||
}
|
||||
else {
|
||||
if(PS3.getButtonClick(TRIANGLE))
|
||||
if (PS3.getButtonClick(TRIANGLE))
|
||||
Serial.print(F("\r\nTraingle"));
|
||||
if(PS3.getButtonClick(CIRCLE))
|
||||
if (PS3.getButtonClick(CIRCLE))
|
||||
Serial.print(F("\r\nCircle"));
|
||||
if(PS3.getButtonClick(CROSS))
|
||||
if (PS3.getButtonClick(CROSS))
|
||||
Serial.print(F("\r\nCross"));
|
||||
if(PS3.getButtonClick(SQUARE))
|
||||
if (PS3.getButtonClick(SQUARE))
|
||||
Serial.print(F("\r\nSquare"));
|
||||
|
||||
if(PS3.getButtonClick(UP)) {
|
||||
if (PS3.getButtonClick(UP)) {
|
||||
Serial.print(F("\r\nUp"));
|
||||
if(PS3.PS3Connected) {
|
||||
PS3.setAllOff();
|
||||
if (PS3.PS3Connected) {
|
||||
PS3.setLedOff();
|
||||
PS3.setLedOn(LED4);
|
||||
}
|
||||
}
|
||||
if(PS3.getButtonClick(RIGHT)) {
|
||||
if (PS3.getButtonClick(RIGHT)) {
|
||||
Serial.print(F("\r\nRight"));
|
||||
if(PS3.PS3Connected) {
|
||||
PS3.setAllOff();
|
||||
if (PS3.PS3Connected) {
|
||||
PS3.setLedOff();
|
||||
PS3.setLedOn(LED1);
|
||||
}
|
||||
}
|
||||
if(PS3.getButtonClick(DOWN)) {
|
||||
if (PS3.getButtonClick(DOWN)) {
|
||||
Serial.print(F("\r\nDown"));
|
||||
if(PS3.PS3Connected) {
|
||||
PS3.setAllOff();
|
||||
if (PS3.PS3Connected) {
|
||||
PS3.setLedOff();
|
||||
PS3.setLedOn(LED2);
|
||||
}
|
||||
}
|
||||
if(PS3.getButtonClick(LEFT)) {
|
||||
if (PS3.getButtonClick(LEFT)) {
|
||||
Serial.print(F("\r\nLeft"));
|
||||
if(PS3.PS3Connected) {
|
||||
PS3.setAllOff();
|
||||
if (PS3.PS3Connected) {
|
||||
PS3.setLedOff();
|
||||
PS3.setLedOn(LED3);
|
||||
}
|
||||
}
|
||||
|
||||
if(PS3.getButtonClick(L1))
|
||||
if (PS3.getButtonClick(L1))
|
||||
Serial.print(F("\r\nL1"));
|
||||
if(PS3.getButtonClick(L3))
|
||||
if (PS3.getButtonClick(L3))
|
||||
Serial.print(F("\r\nL3"));
|
||||
if(PS3.getButtonClick(R1))
|
||||
if (PS3.getButtonClick(R1))
|
||||
Serial.print(F("\r\nR1"));
|
||||
if(PS3.getButtonClick(R3))
|
||||
if (PS3.getButtonClick(R3))
|
||||
Serial.print(F("\r\nR3"));
|
||||
|
||||
if(PS3.getButtonClick(SELECT)) {
|
||||
if (PS3.getButtonClick(SELECT)) {
|
||||
Serial.print(F("\r\nSelect - "));
|
||||
Serial.print(PS3.getStatusString());
|
||||
}
|
||||
if(PS3.getButtonClick(START)) {
|
||||
if (PS3.getButtonClick(START)) {
|
||||
Serial.print(F("\r\nStart"));
|
||||
printAngle = !printAngle;
|
||||
}
|
||||
}
|
||||
if(printAngle) {
|
||||
if (printAngle) {
|
||||
Serial.print(F("\r\nPitch: "));
|
||||
Serial.print(PS3.getAngle(Pitch));
|
||||
Serial.print(F("\tRoll: "));
|
||||
Serial.print(PS3.getAngle(Roll));
|
||||
}
|
||||
}
|
||||
else if(PS3.PS3MoveConnected) {
|
||||
if(PS3.getAnalogButton(T)) {
|
||||
else if (PS3.PS3MoveConnected) {
|
||||
if (PS3.getAnalogButton(T)) {
|
||||
Serial.print(F("\r\nT: "));
|
||||
Serial.print(PS3.getAnalogButton(T));
|
||||
}
|
||||
if(PS3.getButtonClick(PS)) {
|
||||
if (PS3.getButtonClick(PS)) {
|
||||
Serial.print(F("\r\nPS"));
|
||||
PS3.disconnect();
|
||||
}
|
||||
else {
|
||||
if(PS3.getButtonClick(SELECT)) {
|
||||
if (PS3.getButtonClick(SELECT)) {
|
||||
Serial.print(F("\r\nSelect"));
|
||||
printTemperature = !printTemperature;
|
||||
}
|
||||
if(PS3.getButtonClick(START)) {
|
||||
if (PS3.getButtonClick(START)) {
|
||||
Serial.print(F("\r\nStart"));
|
||||
printAngle = !printAngle;
|
||||
}
|
||||
if(PS3.getButtonClick(TRIANGLE)) {
|
||||
if (PS3.getButtonClick(TRIANGLE)) {
|
||||
Serial.print(F("\r\nTriangle"));
|
||||
PS3.moveSetBulb(Red);
|
||||
}
|
||||
if(PS3.getButtonClick(CIRCLE)) {
|
||||
if (PS3.getButtonClick(CIRCLE)) {
|
||||
Serial.print(F("\r\nCircle"));
|
||||
PS3.moveSetBulb(Green);
|
||||
}
|
||||
if(PS3.getButtonClick(SQUARE)) {
|
||||
if (PS3.getButtonClick(SQUARE)) {
|
||||
Serial.print(F("\r\nSquare"));
|
||||
PS3.moveSetBulb(Blue);
|
||||
}
|
||||
if(PS3.getButtonClick(CROSS)) {
|
||||
if (PS3.getButtonClick(CROSS)) {
|
||||
Serial.print(F("\r\nCross"));
|
||||
PS3.moveSetBulb(Yellow);
|
||||
}
|
||||
if(PS3.getButtonClick(MOVE)) {
|
||||
if (PS3.getButtonClick(MOVE)) {
|
||||
PS3.moveSetBulb(Off);
|
||||
Serial.print(F("\r\nMove"));
|
||||
Serial.print(F(" - "));
|
||||
Serial.print(PS3.getStatusString());
|
||||
}
|
||||
}
|
||||
if(printAngle) {
|
||||
if (printAngle) {
|
||||
Serial.print(F("\r\nPitch: "));
|
||||
Serial.print(PS3.getAngle(Pitch));
|
||||
Serial.print(F("\tRoll: "));
|
||||
Serial.print(PS3.getAngle(Roll));
|
||||
}
|
||||
else if(printTemperature) {
|
||||
else if (printTemperature) {
|
||||
Serial.print(F("\r\nTemperature: "));
|
||||
Serial.print(PS3.getTemperature());
|
||||
}
|
||||
|
|
|
@ -9,15 +9,16 @@
|
|||
#include <usbhub.h>
|
||||
|
||||
USB Usb;
|
||||
USBHub Hub1(&Usb); // Some dongles have a hub inside
|
||||
//USBHub Hub1(&Usb); // Some dongles have a hub inside
|
||||
|
||||
BTD Btd(&Usb); // You have to create the Bluetooth Dongle instance like so
|
||||
PS3BT *PS3[2]; // We will use this pointer to store the two instance, you can easily make it larger if you like, but it will use a lot of RAM!
|
||||
const uint8_t length = sizeof(PS3)/sizeof(PS3[0]); // Get the lenght of the array
|
||||
const uint8_t length = sizeof(PS3) / sizeof(PS3[0]); // Get the lenght of the array
|
||||
boolean printAngle[length];
|
||||
boolean oldControllerState[length];
|
||||
|
||||
void setup() {
|
||||
for (uint8_t i=0;i<length;i++) {
|
||||
for (uint8_t i = 0; i < length; i++) {
|
||||
PS3[i] = new PS3BT(&Btd); // Create the instances
|
||||
PS3[i]->attachOnInit(onInit); // onInit() is called upon a new connection - you can call the function whatever you like
|
||||
}
|
||||
|
@ -26,21 +27,21 @@ void setup() {
|
|||
while (!Serial); // Wait for serial port to connect - used on Leonardo, Teensy and other boards with built-in USB CDC serial connection
|
||||
if (Usb.Init() == -1) {
|
||||
Serial.print(F("\r\nOSC did not start"));
|
||||
while(1); //halt
|
||||
while (1); //halt
|
||||
}
|
||||
Serial.print(F("\r\nPS3 Bluetooth Library Started"));
|
||||
}
|
||||
void loop() {
|
||||
Usb.Task();
|
||||
|
||||
for(uint8_t i=0;i<length;i++) {
|
||||
if(PS3[i]->PS3Connected || PS3[i]->PS3NavigationConnected) {
|
||||
if(PS3[i]->getAnalogHat(LeftHatX) > 137 || PS3[i]->getAnalogHat(LeftHatX) < 117 || PS3[i]->getAnalogHat(LeftHatY) > 137 || PS3[i]->getAnalogHat(LeftHatY) < 117 || PS3[i]->getAnalogHat(RightHatX) > 137 || PS3[i]->getAnalogHat(RightHatX) < 117 || PS3[i]->getAnalogHat(RightHatY) > 137 || PS3[i]->getAnalogHat(RightHatY) < 117) {
|
||||
for (uint8_t i = 0; i < length; i++) {
|
||||
if (PS3[i]->PS3Connected || PS3[i]->PS3NavigationConnected) {
|
||||
if (PS3[i]->getAnalogHat(LeftHatX) > 137 || PS3[i]->getAnalogHat(LeftHatX) < 117 || PS3[i]->getAnalogHat(LeftHatY) > 137 || PS3[i]->getAnalogHat(LeftHatY) < 117 || PS3[i]->getAnalogHat(RightHatX) > 137 || PS3[i]->getAnalogHat(RightHatX) < 117 || PS3[i]->getAnalogHat(RightHatY) > 137 || PS3[i]->getAnalogHat(RightHatY) < 117) {
|
||||
Serial.print(F("\r\nLeftHatX: "));
|
||||
Serial.print(PS3[i]->getAnalogHat(LeftHatX));
|
||||
Serial.print(F("\tLeftHatY: "));
|
||||
Serial.print(PS3[i]->getAnalogHat(LeftHatY));
|
||||
if(!PS3[i]->PS3NavigationConnected) { // The Navigation controller only have one joystick
|
||||
if (PS3[i]->PS3Connected) { // The Navigation controller only have one joystick
|
||||
Serial.print(F("\tRightHatX: "));
|
||||
Serial.print(PS3[i]->getAnalogHat(RightHatX));
|
||||
Serial.print(F("\tRightHatY: "));
|
||||
|
@ -48,77 +49,77 @@ void loop() {
|
|||
}
|
||||
}
|
||||
//Analog button values can be read from almost all buttons
|
||||
if(PS3[i]->getAnalogButton(L2) || PS3[i]->getAnalogButton(R2)) {
|
||||
if (PS3[i]->getAnalogButton(L2) || PS3[i]->getAnalogButton(R2)) {
|
||||
Serial.print(F("\r\nL2: "));
|
||||
Serial.print(PS3[i]->getAnalogButton(L2));
|
||||
if(!PS3[i]->PS3NavigationConnected) {
|
||||
if (!PS3[i]->PS3NavigationConnected) {
|
||||
Serial.print(F("\tR2: "));
|
||||
Serial.print(PS3[i]->getAnalogButton(R2));
|
||||
}
|
||||
}
|
||||
if(PS3[i]->getButtonClick(PS)) {
|
||||
if (PS3[i]->getButtonClick(PS)) {
|
||||
Serial.print(F("\r\nPS"));
|
||||
PS3[i]->disconnect();
|
||||
oldControllerState[i] = false; // Reset value
|
||||
}
|
||||
else {
|
||||
if(PS3[i]->getButtonClick(TRIANGLE))
|
||||
if (PS3[i]->getButtonClick(TRIANGLE))
|
||||
Serial.print(F("\r\nTraingle"));
|
||||
if(PS3[i]->getButtonClick(CIRCLE))
|
||||
if (PS3[i]->getButtonClick(CIRCLE))
|
||||
Serial.print(F("\r\nCircle"));
|
||||
if(PS3[i]->getButtonClick(CROSS))
|
||||
if (PS3[i]->getButtonClick(CROSS))
|
||||
Serial.print(F("\r\nCross"));
|
||||
if(PS3[i]->getButtonClick(SQUARE))
|
||||
if (PS3[i]->getButtonClick(SQUARE))
|
||||
Serial.print(F("\r\nSquare"));
|
||||
|
||||
if(PS3[i]->getButtonClick(UP)) {
|
||||
if (PS3[i]->getButtonClick(UP)) {
|
||||
Serial.print(F("\r\nUp"));
|
||||
if(PS3[i]->PS3Connected) {
|
||||
PS3[i]->setAllOff();
|
||||
if (PS3[i]->PS3Connected) {
|
||||
PS3[i]->setLedOff();
|
||||
PS3[i]->setLedOn(LED4);
|
||||
}
|
||||
}
|
||||
if(PS3[i]->getButtonClick(RIGHT)) {
|
||||
if (PS3[i]->getButtonClick(RIGHT)) {
|
||||
Serial.print(F("\r\nRight"));
|
||||
if(PS3[i]->PS3Connected) {
|
||||
PS3[i]->setAllOff();
|
||||
if (PS3[i]->PS3Connected) {
|
||||
PS3[i]->setLedOff();
|
||||
PS3[i]->setLedOn(LED1);
|
||||
}
|
||||
}
|
||||
if(PS3[i]->getButtonClick(DOWN)) {
|
||||
if (PS3[i]->getButtonClick(DOWN)) {
|
||||
Serial.print(F("\r\nDown"));
|
||||
if(PS3[i]->PS3Connected) {
|
||||
PS3[i]->setAllOff();
|
||||
if (PS3[i]->PS3Connected) {
|
||||
PS3[i]->setLedOff();
|
||||
PS3[i]->setLedOn(LED2);
|
||||
}
|
||||
}
|
||||
if(PS3[i]->getButtonClick(LEFT)) {
|
||||
if (PS3[i]->getButtonClick(LEFT)) {
|
||||
Serial.print(F("\r\nLeft"));
|
||||
if(PS3[i]->PS3Connected) {
|
||||
PS3[i]->setAllOff();
|
||||
if (PS3[i]->PS3Connected) {
|
||||
PS3[i]->setLedOff();
|
||||
PS3[i]->setLedOn(LED3);
|
||||
}
|
||||
}
|
||||
|
||||
if(PS3[i]->getButtonClick(L1))
|
||||
if (PS3[i]->getButtonClick(L1))
|
||||
Serial.print(F("\r\nL1"));
|
||||
if(PS3[i]->getButtonClick(L3))
|
||||
if (PS3[i]->getButtonClick(L3))
|
||||
Serial.print(F("\r\nL3"));
|
||||
if(PS3[i]->getButtonClick(R1))
|
||||
if (PS3[i]->getButtonClick(R1))
|
||||
Serial.print(F("\r\nR1"));
|
||||
if(PS3[i]->getButtonClick(R3))
|
||||
if (PS3[i]->getButtonClick(R3))
|
||||
Serial.print(F("\r\nR3"));
|
||||
|
||||
if(PS3[i]->getButtonClick(SELECT)) {
|
||||
if (PS3[i]->getButtonClick(SELECT)) {
|
||||
Serial.print(F("\r\nSelect - "));
|
||||
Serial.print(PS3[i]->getStatusString());
|
||||
}
|
||||
if(PS3[i]->getButtonClick(START)) {
|
||||
if (PS3[i]->getButtonClick(START)) {
|
||||
Serial.print(F("\r\nStart"));
|
||||
printAngle[i] = !printAngle[i];
|
||||
}
|
||||
}
|
||||
if(printAngle[i]) {
|
||||
if (printAngle[i]) {
|
||||
Serial.print(F("\r\nPitch: "));
|
||||
Serial.print(PS3[i]->getAngle(Pitch));
|
||||
Serial.print(F("\tRoll: "));
|
||||
|
@ -131,7 +132,7 @@ void loop() {
|
|||
}
|
||||
|
||||
void onInit() {
|
||||
for (uint8_t i=0;i<length;i++) {
|
||||
for (uint8_t i = 0; i < length; i++) {
|
||||
if ((PS3[i]->PS3Connected || PS3[i]->PS3NavigationConnected) && !oldControllerState[i]) {
|
||||
oldControllerState[i] = true; // Used to check which is the new controller
|
||||
PS3[i]->setLedOn((LED)i); // Cast directly to LED enum - see: "controllerEnums.h"
|
||||
|
|
|
@ -14,7 +14,8 @@
|
|||
#include <usbhub.h>
|
||||
|
||||
USB Usb;
|
||||
USBHub Hub1(&Usb); // Some dongles have a hub inside
|
||||
//USBHub Hub1(&Usb); // Some dongles have a hub inside
|
||||
|
||||
BTD Btd(&Usb); // You have to create the Bluetooth Dongle instance like so
|
||||
|
||||
/* You can create the instances of the bluetooth services in two ways */
|
||||
|
@ -31,7 +32,7 @@ void setup() {
|
|||
while (!Serial); // Wait for serial port to connect - used on Leonardo, Teensy and other boards with built-in USB CDC serial connection
|
||||
if (Usb.Init() == -1) {
|
||||
Serial.print(F("\r\nOSC did not start"));
|
||||
while(1); //halt
|
||||
while (1); //halt
|
||||
}
|
||||
Serial.print(F("\r\nBluetooth Library Started"));
|
||||
output.reserve(200); // Reserve 200 bytes for the output string
|
||||
|
@ -39,27 +40,27 @@ void setup() {
|
|||
void loop() {
|
||||
Usb.Task(); // The SPP data is actually not send until this is called, one could call SerialBT.send() directly as well
|
||||
|
||||
if(SerialBT.connected) {
|
||||
if(firstMessage) {
|
||||
if (SerialBT.connected) {
|
||||
if (firstMessage) {
|
||||
firstMessage = false;
|
||||
SerialBT.println(F("Hello from Arduino")); // Send welcome message
|
||||
}
|
||||
if(Serial.available())
|
||||
if (Serial.available())
|
||||
SerialBT.write(Serial.read());
|
||||
if(SerialBT.available())
|
||||
if (SerialBT.available())
|
||||
Serial.write(SerialBT.read());
|
||||
}
|
||||
else
|
||||
firstMessage = true;
|
||||
|
||||
if(PS3.PS3Connected || PS3.PS3NavigationConnected) {
|
||||
if (PS3.PS3Connected || PS3.PS3NavigationConnected) {
|
||||
output = ""; // Reset output string
|
||||
if(PS3.getAnalogHat(LeftHatX) > 137 || PS3.getAnalogHat(LeftHatX) < 117 || PS3.getAnalogHat(LeftHatY) > 137 || PS3.getAnalogHat(LeftHatY) < 117 || PS3.getAnalogHat(RightHatX) > 137 || PS3.getAnalogHat(RightHatX) < 117 || PS3.getAnalogHat(RightHatY) > 137 || PS3.getAnalogHat(RightHatY) < 117) {
|
||||
if (PS3.getAnalogHat(LeftHatX) > 137 || PS3.getAnalogHat(LeftHatX) < 117 || PS3.getAnalogHat(LeftHatY) > 137 || PS3.getAnalogHat(LeftHatY) < 117 || PS3.getAnalogHat(RightHatX) > 137 || PS3.getAnalogHat(RightHatX) < 117 || PS3.getAnalogHat(RightHatY) > 137 || PS3.getAnalogHat(RightHatY) < 117) {
|
||||
output += "LeftHatX: ";
|
||||
output += PS3.getAnalogHat(LeftHatX);
|
||||
output += "\tLeftHatY: ";
|
||||
output += PS3.getAnalogHat(LeftHatY);
|
||||
if(!PS3.PS3NavigationConnected) {
|
||||
if (PS3.PS3Connected) { // The Navigation controller only have one joystick
|
||||
output += "\tRightHatX: ";
|
||||
output += PS3.getAnalogHat(RightHatX);
|
||||
output += "\tRightHatY: ";
|
||||
|
@ -67,85 +68,85 @@ void loop() {
|
|||
}
|
||||
}
|
||||
//Analog button values can be read from almost all buttons
|
||||
if(PS3.getAnalogButton(L2) || PS3.getAnalogButton(R2)) {
|
||||
if(output != "")
|
||||
if (PS3.getAnalogButton(L2) || PS3.getAnalogButton(R2)) {
|
||||
if (output != "")
|
||||
output += "\r\n";
|
||||
output += "L2: ";
|
||||
output += PS3.getAnalogButton(L2);
|
||||
if(!PS3.PS3NavigationConnected) {
|
||||
if (!PS3.PS3NavigationConnected) {
|
||||
output += "\tR2: ";
|
||||
output += PS3.getAnalogButton(R2);
|
||||
}
|
||||
}
|
||||
if(output != "") {
|
||||
if (output != "") {
|
||||
Serial.println(output);
|
||||
if(SerialBT.connected)
|
||||
if (SerialBT.connected)
|
||||
SerialBT.println(output);
|
||||
output = ""; // Reset output string
|
||||
}
|
||||
if(PS3.getButtonClick(PS)) {
|
||||
if (PS3.getButtonClick(PS)) {
|
||||
output += " - PS";
|
||||
PS3.disconnect();
|
||||
}
|
||||
else {
|
||||
if(PS3.getButtonClick(TRIANGLE))
|
||||
if (PS3.getButtonClick(TRIANGLE))
|
||||
output += " - Traingle";
|
||||
if(PS3.getButtonClick(CIRCLE))
|
||||
if (PS3.getButtonClick(CIRCLE))
|
||||
output += " - Circle";
|
||||
if(PS3.getButtonClick(CROSS))
|
||||
if (PS3.getButtonClick(CROSS))
|
||||
output += " - Cross";
|
||||
if(PS3.getButtonClick(SQUARE))
|
||||
if (PS3.getButtonClick(SQUARE))
|
||||
output += " - Square";
|
||||
|
||||
if(PS3.getButtonClick(UP)) {
|
||||
if (PS3.getButtonClick(UP)) {
|
||||
output += " - Up";
|
||||
if(PS3.PS3Connected) {
|
||||
PS3.setAllOff();
|
||||
if (PS3.PS3Connected) {
|
||||
PS3.setLedOff();
|
||||
PS3.setLedOn(LED4);
|
||||
}
|
||||
}
|
||||
if(PS3.getButtonClick(RIGHT)) {
|
||||
if (PS3.getButtonClick(RIGHT)) {
|
||||
output += " - Right";
|
||||
if(PS3.PS3Connected) {
|
||||
PS3.setAllOff();
|
||||
if (PS3.PS3Connected) {
|
||||
PS3.setLedOff();
|
||||
PS3.setLedOn(LED1);
|
||||
}
|
||||
}
|
||||
if(PS3.getButtonClick(DOWN)) {
|
||||
if (PS3.getButtonClick(DOWN)) {
|
||||
output += " - Down";
|
||||
if(PS3.PS3Connected) {
|
||||
PS3.setAllOff();
|
||||
if (PS3.PS3Connected) {
|
||||
PS3.setLedOff();
|
||||
PS3.setLedOn(LED2);
|
||||
}
|
||||
}
|
||||
if(PS3.getButtonClick(LEFT)) {
|
||||
if (PS3.getButtonClick(LEFT)) {
|
||||
output += " - Left";
|
||||
if(PS3.PS3Connected) {
|
||||
PS3.setAllOff();
|
||||
if (PS3.PS3Connected) {
|
||||
PS3.setLedOff();
|
||||
PS3.setLedOn(LED3);
|
||||
}
|
||||
}
|
||||
|
||||
if(PS3.getButtonClick(L1))
|
||||
if (PS3.getButtonClick(L1))
|
||||
output += " - L1";
|
||||
if(PS3.getButtonClick(L3))
|
||||
if (PS3.getButtonClick(L3))
|
||||
output += " - L3";
|
||||
if(PS3.getButtonClick(R1))
|
||||
if (PS3.getButtonClick(R1))
|
||||
output += " - R1";
|
||||
if(PS3.getButtonClick(R3))
|
||||
if (PS3.getButtonClick(R3))
|
||||
output += " - R3";
|
||||
|
||||
if(PS3.getButtonClick(SELECT)) {
|
||||
if (PS3.getButtonClick(SELECT)) {
|
||||
output += " - Select - ";
|
||||
output += PS3.getStatusString();
|
||||
}
|
||||
if(PS3.getButtonClick(START))
|
||||
if (PS3.getButtonClick(START))
|
||||
output += " - Start";
|
||||
|
||||
if(output != "") {
|
||||
if (output != "") {
|
||||
String string = "PS3 Controller" + output;
|
||||
Serial.println(string);
|
||||
if(SerialBT.connected)
|
||||
if (SerialBT.connected)
|
||||
SerialBT.println(string);
|
||||
}
|
||||
}
|
||||
|
|
|
@ -8,7 +8,8 @@
|
|||
#include <usbhub.h>
|
||||
|
||||
USB Usb;
|
||||
USBHub Hub1(&Usb); // Some dongles have a hub inside
|
||||
//USBHub Hub1(&Usb); // Some dongles have a hub inside
|
||||
|
||||
BTD Btd(&Usb); // You have to create the Bluetooth Dongle instance like so
|
||||
/* You can create the instance of the class in two ways */
|
||||
SPP SerialBT(&Btd); // This will set the name to the defaults: "Arduino" and the pin to "1234"
|
||||
|
@ -21,21 +22,21 @@ void setup() {
|
|||
while (!Serial); // Wait for serial port to connect - used on Leonardo, Teensy and other boards with built-in USB CDC serial connection
|
||||
if (Usb.Init() == -1) {
|
||||
Serial.print(F("\r\nOSC did not start"));
|
||||
while(1); //halt
|
||||
while (1); //halt
|
||||
}
|
||||
Serial.print(F("\r\nSPP Bluetooth Library Started"));
|
||||
}
|
||||
void loop() {
|
||||
Usb.Task(); // The SPP data is actually not send until this is called, one could call SerialBT.send() directly as well
|
||||
|
||||
if(SerialBT.connected) {
|
||||
if(firstMessage) {
|
||||
if (SerialBT.connected) {
|
||||
if (firstMessage) {
|
||||
firstMessage = false;
|
||||
SerialBT.println(F("Hello from Arduino")); // Send welcome message
|
||||
}
|
||||
if(Serial.available())
|
||||
if (Serial.available())
|
||||
SerialBT.write(Serial.read());
|
||||
if(SerialBT.available())
|
||||
if (SerialBT.available())
|
||||
Serial.write(SerialBT.read());
|
||||
}
|
||||
else
|
||||
|
|
|
@ -8,55 +8,56 @@
|
|||
#include <usbhub.h>
|
||||
|
||||
USB Usb;
|
||||
USBHub Hub1(&Usb); // Some dongles have a hub inside
|
||||
//USBHub Hub1(&Usb); // Some dongles have a hub inside
|
||||
|
||||
BTD Btd(&Usb); // You have to create the Bluetooth Dongle instance like so
|
||||
SPP* SerialBT[2]; // We will use this pointer to store the two instance, you can easily make it larger if you like, but it will use a lot of RAM!
|
||||
const uint8_t length = sizeof(SerialBT)/sizeof(SerialBT[0]); // Get the lenght of the array
|
||||
SPP *SerialBT[2]; // We will use this pointer to store the two instance, you can easily make it larger if you like, but it will use a lot of RAM!
|
||||
const uint8_t length = sizeof(SerialBT) / sizeof(SerialBT[0]); // Get the lenght of the array
|
||||
boolean firstMessage[length] = { true }; // Set all to true
|
||||
uint8_t buffer[50];
|
||||
|
||||
void setup() {
|
||||
for(uint8_t i=0;i<length;i++)
|
||||
for (uint8_t i = 0; i < length; i++)
|
||||
SerialBT[i] = new SPP(&Btd); // This will set the name to the default: "Arduino" and the pin to "1234" for all connections
|
||||
|
||||
Serial.begin(115200);
|
||||
while (!Serial); // Wait for serial port to connect - used on Leonardo, Teensy and other boards with built-in USB CDC serial connection
|
||||
if (Usb.Init() == -1) {
|
||||
Serial.print(F("\r\nOSC did not start"));
|
||||
while(1); //halt
|
||||
while (1); //halt
|
||||
}
|
||||
Serial.print(F("\r\nSPP Bluetooth Library Started"));
|
||||
}
|
||||
void loop() {
|
||||
Usb.Task(); // The SPP data is actually not send until this is called, one could call SerialBT.send() directly as well
|
||||
|
||||
for(uint8_t i=0;i<length;i++) {
|
||||
if(SerialBT[i]->connected) {
|
||||
if(firstMessage[i]) {
|
||||
for (uint8_t i = 0; i < length; i++) {
|
||||
if (SerialBT[i]->connected) {
|
||||
if (firstMessage[i]) {
|
||||
firstMessage[i] = false;
|
||||
SerialBT[i]->println(F("Hello from Arduino")); // Send welcome message
|
||||
}
|
||||
if(SerialBT[i]->available())
|
||||
if (SerialBT[i]->available())
|
||||
Serial.write(SerialBT[i]->read());
|
||||
}
|
||||
else
|
||||
firstMessage[i] = true;
|
||||
}
|
||||
if(Serial.available()) {
|
||||
if (Serial.available()) {
|
||||
delay(10); // Wait for the rest of the data to arrive
|
||||
uint8_t i = 0;
|
||||
while(Serial.available() && i < sizeof(buffer)) // Read the data
|
||||
while (Serial.available() && i < sizeof(buffer)) // Read the data
|
||||
buffer[i++] = Serial.read();
|
||||
/*
|
||||
Set the connection you want to send to using the first character
|
||||
For instace "0Hello World" would send "Hello World" to connection 0
|
||||
*/
|
||||
uint8_t id = buffer[0]-'0'; // Convert from ASCII
|
||||
if(id < length && i > 1) { // And then compare to length and make sure there is any text
|
||||
if(SerialBT[id]->connected) { // Check if a device is actually connected
|
||||
for(uint8_t i2 = 0; i2 < i-1; i2++) // Don't include the first character
|
||||
buffer[i2] = buffer[i2+1];
|
||||
SerialBT[id]->write(buffer,i-1); // Send the data
|
||||
uint8_t id = buffer[0] - '0'; // Convert from ASCII
|
||||
if (id < length && i > 1) { // And then compare to length and make sure there is any text
|
||||
if (SerialBT[id]->connected) { // Check if a device is actually connected
|
||||
for (uint8_t i2 = 0; i2 < i - 1; i2++) // Don't include the first character
|
||||
buffer[i2] = buffer[i2 + 1];
|
||||
SerialBT[id]->write(buffer, i - 1); // Send the data
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -8,10 +8,11 @@
|
|||
#include <usbhub.h>
|
||||
|
||||
USB Usb;
|
||||
USBHub Hub1(&Usb); // Some dongles have a hub inside
|
||||
//USBHub Hub1(&Usb); // Some dongles have a hub inside
|
||||
|
||||
BTD Btd(&Usb); // You have to create the Bluetooth Dongle instance like so
|
||||
/* You can create the instance of the class in two ways */
|
||||
WII Wii(&Btd,PAIR); // This will start an inquiry and then pair with your Wiimote - you only have to do this once
|
||||
WII Wii(&Btd, PAIR); // This will start an inquiry and then pair with your Wiimote - you only have to do this once
|
||||
//WII Wii(&Btd); // After that you can simply create the instance like so and then press any button on the Wiimote
|
||||
|
||||
bool printAngle;
|
||||
|
@ -21,68 +22,68 @@ void setup() {
|
|||
while (!Serial); // Wait for serial port to connect - used on Leonardo, Teensy and other boards with built-in USB CDC serial connection
|
||||
if (Usb.Init() == -1) {
|
||||
Serial.print(F("\r\nOSC did not start"));
|
||||
while(1); //halt
|
||||
while (1); //halt
|
||||
}
|
||||
Serial.print(F("\r\nWiimote Bluetooth Library Started"));
|
||||
}
|
||||
void loop() {
|
||||
Usb.Task();
|
||||
if(Wii.wiimoteConnected) {
|
||||
if(Wii.getButtonClick(HOME)) { // You can use getButtonPress to see if the button is held down
|
||||
if (Wii.wiimoteConnected) {
|
||||
if (Wii.getButtonClick(HOME)) { // You can use getButtonPress to see if the button is held down
|
||||
Serial.print(F("\r\nHOME"));
|
||||
Wii.disconnect();
|
||||
}
|
||||
else {
|
||||
if(Wii.getButtonClick(LEFT)) {
|
||||
Wii.setAllOff();
|
||||
if (Wii.getButtonClick(LEFT)) {
|
||||
Wii.setLedOff();
|
||||
Wii.setLedOn(LED1);
|
||||
Serial.print(F("\r\nLeft"));
|
||||
}
|
||||
if(Wii.getButtonClick(RIGHT)) {
|
||||
Wii.setAllOff();
|
||||
if (Wii.getButtonClick(RIGHT)) {
|
||||
Wii.setLedOff();
|
||||
Wii.setLedOn(LED3);
|
||||
Serial.print(F("\r\nRight"));
|
||||
}
|
||||
if(Wii.getButtonClick(DOWN)) {
|
||||
Wii.setAllOff();
|
||||
if (Wii.getButtonClick(DOWN)) {
|
||||
Wii.setLedOff();
|
||||
Wii.setLedOn(LED4);
|
||||
Serial.print(F("\r\nDown"));
|
||||
}
|
||||
if(Wii.getButtonClick(UP)) {
|
||||
Wii.setAllOff();
|
||||
if (Wii.getButtonClick(UP)) {
|
||||
Wii.setLedOff();
|
||||
Wii.setLedOn(LED2);
|
||||
Serial.print(F("\r\nUp"));
|
||||
}
|
||||
|
||||
if(Wii.getButtonClick(PLUS))
|
||||
if (Wii.getButtonClick(PLUS))
|
||||
Serial.print(F("\r\nPlus"));
|
||||
if(Wii.getButtonClick(MINUS))
|
||||
if (Wii.getButtonClick(MINUS))
|
||||
Serial.print(F("\r\nMinus"));
|
||||
|
||||
if(Wii.getButtonClick(ONE))
|
||||
if (Wii.getButtonClick(ONE))
|
||||
Serial.print(F("\r\nOne"));
|
||||
if(Wii.getButtonClick(TWO))
|
||||
if (Wii.getButtonClick(TWO))
|
||||
Serial.print(F("\r\nTwo"));
|
||||
|
||||
if(Wii.getButtonClick(A)) {
|
||||
if (Wii.getButtonClick(A)) {
|
||||
printAngle = !printAngle;
|
||||
Serial.print(F("\r\nA"));
|
||||
}
|
||||
if(Wii.getButtonClick(B)) {
|
||||
if (Wii.getButtonClick(B)) {
|
||||
Wii.setRumbleToggle();
|
||||
Serial.print(F("\r\nB"));
|
||||
}
|
||||
}
|
||||
if(printAngle) {
|
||||
if (printAngle) {
|
||||
Serial.print(F("\r\nPitch: "));
|
||||
Serial.print(Wii.getPitch());
|
||||
Serial.print(F("\tRoll: "));
|
||||
Serial.print(Wii.getRoll());
|
||||
if(Wii.motionPlusConnected) {
|
||||
if (Wii.motionPlusConnected) {
|
||||
Serial.print(F("\tYaw: "));
|
||||
Serial.print(Wii.getYaw());
|
||||
}
|
||||
if(Wii.nunchuckConnected) {
|
||||
if (Wii.nunchuckConnected) {
|
||||
Serial.print(F("\tNunchuck Pitch: "));
|
||||
Serial.print(Wii.getNunchuckPitch());
|
||||
Serial.print(F("\tNunchuck Roll: "));
|
||||
|
@ -90,12 +91,12 @@ void loop() {
|
|||
}
|
||||
}
|
||||
}
|
||||
if(Wii.nunchuckConnected) {
|
||||
if(Wii.getButtonClick(Z))
|
||||
if (Wii.nunchuckConnected) {
|
||||
if (Wii.getButtonClick(Z))
|
||||
Serial.print(F("\r\nZ"));
|
||||
if(Wii.getButtonClick(C))
|
||||
if (Wii.getButtonClick(C))
|
||||
Serial.print(F("\r\nC"));
|
||||
if(Wii.getAnalogHat(HatX) > 137 || Wii.getAnalogHat(HatX) < 117 || Wii.getAnalogHat(HatY) > 137 || Wii.getAnalogHat(HatY) < 117) {
|
||||
if (Wii.getAnalogHat(HatX) > 137 || Wii.getAnalogHat(HatX) < 117 || Wii.getAnalogHat(HatY) > 137 || Wii.getAnalogHat(HatY) < 117) {
|
||||
Serial.print(F("\r\nHatX: "));
|
||||
Serial.print(Wii.getAnalogHat(HatX));
|
||||
Serial.print(F("\tHatY: "));
|
||||
|
|
|
@ -19,10 +19,11 @@ Otherwise, wire up a IR LED yourself.
|
|||
#endif
|
||||
|
||||
USB Usb;
|
||||
USBHub Hub1(&Usb); // Some dongles have a hub inside
|
||||
//USBHub Hub1(&Usb); // Some dongles have a hub inside
|
||||
|
||||
BTD Btd(&Usb); // You have to create the Bluetooth Dongle instance like so
|
||||
/* You can create the instance of the class in two ways */
|
||||
WII Wii(&Btd,PAIR); // This will start an inquiry and then pair with your Wiimote - you only have to do this once
|
||||
WII Wii(&Btd, PAIR); // This will start an inquiry and then pair with your Wiimote - you only have to do this once
|
||||
//WII Wii(&Btd); // After the Wiimote pairs once with the line of code above, you can simply create the instance like so and re upload and then press any button on the Wiimote
|
||||
|
||||
bool printAngle;
|
||||
|
@ -33,31 +34,31 @@ void setup() {
|
|||
while (!Serial); // Wait for serial port to connect - used on Leonardo, Teensy and other boards with built-in USB CDC serial connection
|
||||
if (Usb.Init() == -1) {
|
||||
Serial.print(F("\r\nOSC did not start"));
|
||||
while(1); //halt
|
||||
while (1); //halt
|
||||
}
|
||||
Serial.print(F("\r\nWiimote Bluetooth Library Started"));
|
||||
}
|
||||
|
||||
void loop() {
|
||||
Usb.Task();
|
||||
if(Wii.wiimoteConnected) {
|
||||
if(Wii.getButtonClick(HOME)) { // You can use getButtonPress to see if the button is held down
|
||||
if (Wii.wiimoteConnected) {
|
||||
if (Wii.getButtonClick(HOME)) { // You can use getButtonPress to see if the button is held down
|
||||
Serial.print(F("\r\nHOME"));
|
||||
Wii.disconnect();
|
||||
}
|
||||
else {
|
||||
if(Wii.getButtonClick(ONE))
|
||||
if (Wii.getButtonClick(ONE))
|
||||
Wii.IRinitialize(); // Run the initialisation sequence
|
||||
if(Wii.getButtonClick(MINUS) || Wii.getButtonClick(PLUS)) {
|
||||
if(!Wii.isIRCameraEnabled())
|
||||
if (Wii.getButtonClick(MINUS) || Wii.getButtonClick(PLUS)) {
|
||||
if (!Wii.isIRCameraEnabled())
|
||||
Serial.print(F("\r\nEnable IR camera first"));
|
||||
else {
|
||||
if(Wii.getButtonPress(MINUS)) { // getButtonClick will only return true once
|
||||
if(printObjects > 0)
|
||||
if (Wii.getButtonPress(MINUS)) { // getButtonClick will only return true once
|
||||
if (printObjects > 0)
|
||||
printObjects--;
|
||||
}
|
||||
else {
|
||||
if(printObjects < 4)
|
||||
if (printObjects < 4)
|
||||
printObjects++;
|
||||
}
|
||||
Serial.print(F("\r\nTracking "));
|
||||
|
@ -65,17 +66,17 @@ void loop() {
|
|||
Serial.print(F(" objects"));
|
||||
}
|
||||
}
|
||||
if(Wii.getButtonClick(A)) {
|
||||
if (Wii.getButtonClick(A)) {
|
||||
printAngle = !printAngle;
|
||||
Serial.print(F("\r\nA"));
|
||||
}
|
||||
if(Wii.getButtonClick(B)) {
|
||||
if (Wii.getButtonClick(B)) {
|
||||
Serial.print(F("\r\nBattery level: "));
|
||||
Serial.print(Wii.getBatteryLevel()); // You can get the battery level as well
|
||||
}
|
||||
}
|
||||
if(printObjects > 0) {
|
||||
if(Wii.getIRx1() != 0x3FF || Wii.getIRy1() != 0x3FF || Wii.getIRs1() != 0) { // Only print if the IR camera is actually seeing something
|
||||
if (printObjects > 0) {
|
||||
if (Wii.getIRx1() != 0x3FF || Wii.getIRy1() != 0x3FF || Wii.getIRs1() != 0) { // Only print if the IR camera is actually seeing something
|
||||
Serial.print(F("\r\nx1: "));
|
||||
Serial.print(Wii.getIRx1());
|
||||
Serial.print(F("\ty1: "));
|
||||
|
@ -83,8 +84,8 @@ void loop() {
|
|||
Serial.print(F("\ts1:"));
|
||||
Serial.print(Wii.getIRs1());
|
||||
}
|
||||
if(printObjects > 1) {
|
||||
if(Wii.getIRx2() != 0x3FF || Wii.getIRy2() != 0x3FF || Wii.getIRs2() != 0) {
|
||||
if (printObjects > 1) {
|
||||
if (Wii.getIRx2() != 0x3FF || Wii.getIRy2() != 0x3FF || Wii.getIRs2() != 0) {
|
||||
Serial.print(F("\r\nx2: "));
|
||||
Serial.print(Wii.getIRx2());
|
||||
Serial.print(F("\ty2: "));
|
||||
|
@ -92,8 +93,8 @@ void loop() {
|
|||
Serial.print(F("\ts2:"));
|
||||
Serial.print(Wii.getIRs2());
|
||||
}
|
||||
if(printObjects > 2) {
|
||||
if(Wii.getIRx3() != 0x3FF || Wii.getIRy3() != 0x3FF || Wii.getIRs3() != 0) {
|
||||
if (printObjects > 2) {
|
||||
if (Wii.getIRx3() != 0x3FF || Wii.getIRy3() != 0x3FF || Wii.getIRs3() != 0) {
|
||||
Serial.print(F("\r\nx3: "));
|
||||
Serial.print(Wii.getIRx3());
|
||||
Serial.print(F("\ty3: "));
|
||||
|
@ -101,8 +102,8 @@ void loop() {
|
|||
Serial.print(F("\ts3:"));
|
||||
Serial.print(Wii.getIRs3());
|
||||
}
|
||||
if(printObjects > 3) {
|
||||
if(Wii.getIRx4() != 0x3FF || Wii.getIRy4() != 0x3FF || Wii.getIRs4() != 0) {
|
||||
if (printObjects > 3) {
|
||||
if (Wii.getIRx4() != 0x3FF || Wii.getIRy4() != 0x3FF || Wii.getIRs4() != 0) {
|
||||
Serial.print(F("\r\nx4: "));
|
||||
Serial.print(Wii.getIRx4());
|
||||
Serial.print(F("\ty4: "));
|
||||
|
@ -114,7 +115,7 @@ void loop() {
|
|||
}
|
||||
}
|
||||
}
|
||||
if(printAngle) { // There is no extension bytes available, so the MotionPlus or Nunchuck can't be read
|
||||
if (printAngle) { // There is no extension bytes available, so the MotionPlus or Nunchuck can't be read
|
||||
Serial.print(F("\r\nPitch: "));
|
||||
Serial.print(Wii.getPitch());
|
||||
Serial.print(F("\tRoll: "));
|
||||
|
|
|
@ -9,15 +9,16 @@
|
|||
#include <usbhub.h>
|
||||
|
||||
USB Usb;
|
||||
USBHub Hub1(&Usb); // Some dongles have a hub inside
|
||||
//USBHub Hub1(&Usb); // Some dongles have a hub inside
|
||||
|
||||
BTD Btd(&Usb); // You have to create the Bluetooth Dongle instance like so
|
||||
WII *Wii[2]; // We will use this pointer to store the two instance, you can easily make it larger if you like, but it will use a lot of RAM!
|
||||
const uint8_t length = sizeof(Wii)/sizeof(Wii[0]); // Get the lenght of the array
|
||||
const uint8_t length = sizeof(Wii) / sizeof(Wii[0]); // Get the lenght of the array
|
||||
boolean printAngle[length];
|
||||
boolean oldControllerState[length];
|
||||
|
||||
void setup() {
|
||||
for (uint8_t i=0;i<length;i++) {
|
||||
for (uint8_t i = 0; i < length; i++) {
|
||||
Wii[i] = new WII(&Btd); // You will have to pair each controller with the dongle before you can define the instances like so, just add PAIR as the second argument
|
||||
Wii[i]->attachOnInit(onInit); // onInit() is called upon a new connection - you can call the function whatever you like
|
||||
}
|
||||
|
@ -26,71 +27,71 @@ void setup() {
|
|||
while (!Serial); // Wait for serial port to connect - used on Leonardo, Teensy and other boards with built-in USB CDC serial connection
|
||||
if (Usb.Init() == -1) {
|
||||
Serial.print(F("\r\nOSC did not start"));
|
||||
while(1); //halt
|
||||
while (1); //halt
|
||||
}
|
||||
Serial.print(F("\r\nWiimote Bluetooth Library Started"));
|
||||
}
|
||||
void loop() {
|
||||
Usb.Task();
|
||||
|
||||
for(uint8_t i=0;i<length;i++) {
|
||||
if(Wii[i]->wiimoteConnected) {
|
||||
if(Wii[i]->getButtonClick(HOME)) { // You can use getButtonPress to see if the button is held down
|
||||
for (uint8_t i = 0; i < length; i++) {
|
||||
if (Wii[i]->wiimoteConnected) {
|
||||
if (Wii[i]->getButtonClick(HOME)) { // You can use getButtonPress to see if the button is held down
|
||||
Serial.print(F("\r\nHOME"));
|
||||
Wii[i]->disconnect();
|
||||
oldControllerState[i] = false; // Reset value
|
||||
}
|
||||
else {
|
||||
if(Wii[i]->getButtonClick(LEFT)) {
|
||||
Wii[i]->setAllOff();
|
||||
if (Wii[i]->getButtonClick(LEFT)) {
|
||||
Wii[i]->setLedOff();
|
||||
Wii[i]->setLedOn(LED1);
|
||||
Serial.print(F("\r\nLeft"));
|
||||
}
|
||||
if(Wii[i]->getButtonClick(RIGHT)) {
|
||||
Wii[i]->setAllOff();
|
||||
if (Wii[i]->getButtonClick(RIGHT)) {
|
||||
Wii[i]->setLedOff();
|
||||
Wii[i]->setLedOn(LED3);
|
||||
Serial.print(F("\r\nRight"));
|
||||
}
|
||||
if(Wii[i]->getButtonClick(DOWN)) {
|
||||
Wii[i]->setAllOff();
|
||||
if (Wii[i]->getButtonClick(DOWN)) {
|
||||
Wii[i]->setLedOff();
|
||||
Wii[i]->setLedOn(LED4);
|
||||
Serial.print(F("\r\nDown"));
|
||||
}
|
||||
if(Wii[i]->getButtonClick(UP)) {
|
||||
Wii[i]->setAllOff();
|
||||
if (Wii[i]->getButtonClick(UP)) {
|
||||
Wii[i]->setLedOff();
|
||||
Wii[i]->setLedOn(LED2);
|
||||
Serial.print(F("\r\nUp"));
|
||||
}
|
||||
|
||||
if(Wii[i]->getButtonClick(PLUS))
|
||||
if (Wii[i]->getButtonClick(PLUS))
|
||||
Serial.print(F("\r\nPlus"));
|
||||
if(Wii[i]->getButtonClick(MINUS))
|
||||
if (Wii[i]->getButtonClick(MINUS))
|
||||
Serial.print(F("\r\nMinus"));
|
||||
|
||||
if(Wii[i]->getButtonClick(ONE))
|
||||
if (Wii[i]->getButtonClick(ONE))
|
||||
Serial.print(F("\r\nOne"));
|
||||
if(Wii[i]->getButtonClick(TWO))
|
||||
if (Wii[i]->getButtonClick(TWO))
|
||||
Serial.print(F("\r\nTwo"));
|
||||
|
||||
if(Wii[i]->getButtonClick(A)) {
|
||||
if (Wii[i]->getButtonClick(A)) {
|
||||
printAngle[i] = !printAngle[i];
|
||||
Serial.print(F("\r\nA"));
|
||||
}
|
||||
if(Wii[i]->getButtonClick(B)) {
|
||||
if (Wii[i]->getButtonClick(B)) {
|
||||
Wii[i]->setRumbleToggle();
|
||||
Serial.print(F("\r\nB"));
|
||||
}
|
||||
}
|
||||
if(printAngle[i]) {
|
||||
if (printAngle[i]) {
|
||||
Serial.print(F("\r\nPitch: "));
|
||||
Serial.print(Wii[i]->getPitch());
|
||||
Serial.print(F("\tRoll: "));
|
||||
Serial.print(Wii[i]->getRoll());
|
||||
if(Wii[i]->motionPlusConnected) {
|
||||
if (Wii[i]->motionPlusConnected) {
|
||||
Serial.print(F("\tYaw: "));
|
||||
Serial.print(Wii[i]->getYaw());
|
||||
}
|
||||
if(Wii[i]->nunchuckConnected) {
|
||||
if (Wii[i]->nunchuckConnected) {
|
||||
Serial.print(F("\tNunchuck Pitch: "));
|
||||
Serial.print(Wii[i]->getNunchuckPitch());
|
||||
Serial.print(F("\tNunchuck Roll: "));
|
||||
|
@ -98,12 +99,12 @@ void loop() {
|
|||
}
|
||||
}
|
||||
}
|
||||
if(Wii[i]->nunchuckConnected) {
|
||||
if(Wii[i]->getButtonClick(Z))
|
||||
if (Wii[i]->nunchuckConnected) {
|
||||
if (Wii[i]->getButtonClick(Z))
|
||||
Serial.print(F("\r\nZ"));
|
||||
if(Wii[i]->getButtonClick(C))
|
||||
if (Wii[i]->getButtonClick(C))
|
||||
Serial.print(F("\r\nC"));
|
||||
if(Wii[i]->getAnalogHat(HatX) > 137 || Wii[i]->getAnalogHat(HatX) < 117 || Wii[i]->getAnalogHat(HatY) > 137 || Wii[i]->getAnalogHat(HatY) < 117) {
|
||||
if (Wii[i]->getAnalogHat(HatX) > 137 || Wii[i]->getAnalogHat(HatX) < 117 || Wii[i]->getAnalogHat(HatY) > 137 || Wii[i]->getAnalogHat(HatY) < 117) {
|
||||
Serial.print(F("\r\nHatX: "));
|
||||
Serial.print(Wii[i]->getAnalogHat(HatX));
|
||||
Serial.print(F("\tHatY: "));
|
||||
|
@ -114,7 +115,7 @@ void loop() {
|
|||
}
|
||||
|
||||
void onInit() {
|
||||
for (uint8_t i=0;i<length;i++) {
|
||||
for (uint8_t i = 0; i < length; i++) {
|
||||
if (Wii[i]->wiimoteConnected && !oldControllerState[i]) {
|
||||
oldControllerState[i] = true; // Used to check which is the new controller
|
||||
Wii[i]->setLedOn((LED)i); // Cast directly to LED enum - see: "controllerEnums.h"
|
||||
|
|
|
@ -8,10 +8,11 @@
|
|||
#include <usbhub.h>
|
||||
|
||||
USB Usb;
|
||||
USBHub Hub1(&Usb); // Some dongles have a hub inside
|
||||
//USBHub Hub1(&Usb); // Some dongles have a hub inside
|
||||
|
||||
BTD Btd(&Usb); // You have to create the Bluetooth Dongle instance like so
|
||||
/* You can create the instance of the class in two ways */
|
||||
WII Wii(&Btd,PAIR); // This will start an inquiry and then pair with your Wiimote - you only have to do this once
|
||||
WII Wii(&Btd, PAIR); // This will start an inquiry and then pair with your Wiimote - you only have to do this once
|
||||
//WII Wii(&Btd); // After that you can simply create the instance like so and then press any button on the Wiimote
|
||||
|
||||
void setup() {
|
||||
|
@ -19,69 +20,69 @@ void setup() {
|
|||
while (!Serial); // Wait for serial port to connect - used on Leonardo, Teensy and other boards with built-in USB CDC serial connection
|
||||
if (Usb.Init() == -1) {
|
||||
Serial.print(F("\r\nOSC did not start"));
|
||||
while(1); //halt
|
||||
while (1); //halt
|
||||
}
|
||||
Serial.print(F("\r\nWiimote Bluetooth Library Started"));
|
||||
}
|
||||
void loop() {
|
||||
Usb.Task();
|
||||
if(Wii.wiiUProControllerConnected) {
|
||||
if(Wii.getButtonClick(HOME)) { // You can use getButtonPress to see if the button is held down
|
||||
if (Wii.wiiUProControllerConnected) {
|
||||
if (Wii.getButtonClick(HOME)) { // You can use getButtonPress to see if the button is held down
|
||||
Serial.print(F("\r\nHome"));
|
||||
Wii.disconnect();
|
||||
}
|
||||
else {
|
||||
if(Wii.getButtonClick(LEFT)) {
|
||||
Wii.setAllOff();
|
||||
if (Wii.getButtonClick(LEFT)) {
|
||||
Wii.setLedOff();
|
||||
Wii.setLedOn(LED1);
|
||||
Serial.print(F("\r\nLeft"));
|
||||
}
|
||||
if(Wii.getButtonClick(RIGHT)) {
|
||||
Wii.setAllOff();
|
||||
if (Wii.getButtonClick(RIGHT)) {
|
||||
Wii.setLedOff();
|
||||
Wii.setLedOn(LED3);
|
||||
Serial.print(F("\r\nRight"));
|
||||
}
|
||||
if(Wii.getButtonClick(DOWN)) {
|
||||
Wii.setAllOff();
|
||||
if (Wii.getButtonClick(DOWN)) {
|
||||
Wii.setLedOff();
|
||||
Wii.setLedOn(LED4);
|
||||
Serial.print(F("\r\nDown"));
|
||||
}
|
||||
if(Wii.getButtonClick(UP)) {
|
||||
Wii.setAllOff();
|
||||
if (Wii.getButtonClick(UP)) {
|
||||
Wii.setLedOff();
|
||||
Wii.setLedOn(LED2);
|
||||
Serial.print(F("\r\nUp"));
|
||||
}
|
||||
|
||||
if(Wii.getButtonClick(PLUS))
|
||||
if (Wii.getButtonClick(PLUS))
|
||||
Serial.print(F("\r\nPlus"));
|
||||
if(Wii.getButtonClick(MINUS))
|
||||
if (Wii.getButtonClick(MINUS))
|
||||
Serial.print(F("\r\nMinus"));
|
||||
|
||||
if(Wii.getButtonClick(A))
|
||||
if (Wii.getButtonClick(A))
|
||||
Serial.print(F("\r\nA"));
|
||||
if(Wii.getButtonClick(B)) {
|
||||
if (Wii.getButtonClick(B)) {
|
||||
Wii.setRumbleToggle();
|
||||
Serial.print(F("\r\nB"));
|
||||
}
|
||||
if(Wii.getButtonClick(X))
|
||||
if (Wii.getButtonClick(X))
|
||||
Serial.print(F("\r\nX"));
|
||||
if(Wii.getButtonClick(Y))
|
||||
if (Wii.getButtonClick(Y))
|
||||
Serial.print(F("\r\nY"));
|
||||
|
||||
if(Wii.getButtonClick(L))
|
||||
if (Wii.getButtonClick(L))
|
||||
Serial.print(F("\r\nL"));
|
||||
if(Wii.getButtonClick(R))
|
||||
if (Wii.getButtonClick(R))
|
||||
Serial.print(F("\r\nR"));
|
||||
if(Wii.getButtonClick(ZL))
|
||||
if (Wii.getButtonClick(ZL))
|
||||
Serial.print(F("\r\nZL"));
|
||||
if(Wii.getButtonClick(ZR))
|
||||
if (Wii.getButtonClick(ZR))
|
||||
Serial.print(F("\r\nZR"));
|
||||
if(Wii.getButtonClick(L3))
|
||||
if (Wii.getButtonClick(L3))
|
||||
Serial.print(F("\r\nL3"));
|
||||
if(Wii.getButtonClick(R3))
|
||||
if (Wii.getButtonClick(R3))
|
||||
Serial.print(F("\r\nR3"));
|
||||
}
|
||||
if(Wii.getAnalogHat(LeftHatX) > 2200 || Wii.getAnalogHat(LeftHatX) < 1800 || Wii.getAnalogHat(LeftHatY) > 2200 || Wii.getAnalogHat(LeftHatY) < 1800 || Wii.getAnalogHat(RightHatX) > 2200 || Wii.getAnalogHat(RightHatX) < 1800 || Wii.getAnalogHat(RightHatY) > 2200 || Wii.getAnalogHat(RightHatY) < 1800) {
|
||||
if (Wii.getAnalogHat(LeftHatX) > 2200 || Wii.getAnalogHat(LeftHatX) < 1800 || Wii.getAnalogHat(LeftHatY) > 2200 || Wii.getAnalogHat(LeftHatY) < 1800 || Wii.getAnalogHat(RightHatX) > 2200 || Wii.getAnalogHat(RightHatX) < 1800 || Wii.getAnalogHat(RightHatY) > 2200 || Wii.getAnalogHat(RightHatY) < 1800) {
|
||||
Serial.print(F("\r\nLeftHatX: "));
|
||||
Serial.print(Wii.getAnalogHat(LeftHatX));
|
||||
Serial.print(F("\tLeftHatY: "));
|
||||
|
|
|
@ -19,20 +19,20 @@ void setup() {
|
|||
while (!Serial); // Wait for serial port to connect - used on Leonardo, Teensy and other boards with built-in USB CDC serial connection
|
||||
if (Usb.Init() == -1) {
|
||||
Serial.print(F("\r\nOSC did not start"));
|
||||
while(1); //halt
|
||||
while (1); //halt
|
||||
}
|
||||
Serial.print(F("\r\nPS3 USB Library Started"));
|
||||
}
|
||||
void loop() {
|
||||
Usb.Task();
|
||||
|
||||
if(PS3.PS3Connected || PS3.PS3NavigationConnected) {
|
||||
if(PS3.getAnalogHat(LeftHatX) > 137 || PS3.getAnalogHat(LeftHatX) < 117 || PS3.getAnalogHat(LeftHatY) > 137 || PS3.getAnalogHat(LeftHatY) < 117 || PS3.getAnalogHat(RightHatX) > 137 || PS3.getAnalogHat(RightHatX) < 117 || PS3.getAnalogHat(RightHatY) > 137 || PS3.getAnalogHat(RightHatY) < 117) {
|
||||
if (PS3.PS3Connected || PS3.PS3NavigationConnected) {
|
||||
if (PS3.getAnalogHat(LeftHatX) > 137 || PS3.getAnalogHat(LeftHatX) < 117 || PS3.getAnalogHat(LeftHatY) > 137 || PS3.getAnalogHat(LeftHatY) < 117 || PS3.getAnalogHat(RightHatX) > 137 || PS3.getAnalogHat(RightHatX) < 117 || PS3.getAnalogHat(RightHatY) > 137 || PS3.getAnalogHat(RightHatY) < 117) {
|
||||
Serial.print(F("\r\nLeftHatX: "));
|
||||
Serial.print(PS3.getAnalogHat(LeftHatX));
|
||||
Serial.print(F("\tLeftHatY: "));
|
||||
Serial.print(PS3.getAnalogHat(LeftHatY));
|
||||
if(!PS3.PS3NavigationConnected) {
|
||||
if (PS3.PS3Connected) { // The Navigation controller only have one joystick
|
||||
Serial.print(F("\tRightHatX: "));
|
||||
Serial.print(PS3.getAnalogHat(RightHatX));
|
||||
Serial.print(F("\tRightHatY: "));
|
||||
|
@ -40,121 +40,101 @@ void loop() {
|
|||
}
|
||||
}
|
||||
// Analog button values can be read from almost all buttons
|
||||
if(PS3.getAnalogButton(L2) || PS3.getAnalogButton(R2)) {
|
||||
if (PS3.getAnalogButton(L2) || PS3.getAnalogButton(R2)) {
|
||||
Serial.print(F("\r\nL2: "));
|
||||
Serial.print(PS3.getAnalogButton(L2));
|
||||
if(!PS3.PS3NavigationConnected) {
|
||||
if (!PS3.PS3NavigationConnected) {
|
||||
Serial.print(F("\tR2: "));
|
||||
Serial.print(PS3.getAnalogButton(R2));
|
||||
}
|
||||
}
|
||||
if(PS3.getButtonClick(PS))
|
||||
if (PS3.getButtonClick(PS))
|
||||
Serial.print(F("\r\nPS"));
|
||||
|
||||
if(PS3.getButtonClick(TRIANGLE))
|
||||
if (PS3.getButtonClick(TRIANGLE))
|
||||
Serial.print(F("\r\nTraingle"));
|
||||
if(PS3.getButtonClick(CIRCLE))
|
||||
if (PS3.getButtonClick(CIRCLE))
|
||||
Serial.print(F("\r\nCircle"));
|
||||
if(PS3.getButtonClick(CROSS))
|
||||
if (PS3.getButtonClick(CROSS))
|
||||
Serial.print(F("\r\nCross"));
|
||||
if(PS3.getButtonClick(SQUARE))
|
||||
if (PS3.getButtonClick(SQUARE))
|
||||
Serial.print(F("\r\nSquare"));
|
||||
|
||||
if(PS3.getButtonClick(UP)) {
|
||||
if (PS3.getButtonClick(UP)) {
|
||||
Serial.print(F("\r\nUp"));
|
||||
PS3.setAllOff();
|
||||
PS3.setLedOff();
|
||||
PS3.setLedOn(LED4);
|
||||
}
|
||||
if(PS3.getButtonClick(RIGHT)) {
|
||||
if (PS3.getButtonClick(RIGHT)) {
|
||||
Serial.print(F("\r\nRight"));
|
||||
PS3.setAllOff();
|
||||
PS3.setLedOff();
|
||||
PS3.setLedOn(LED1);
|
||||
}
|
||||
if(PS3.getButtonClick(DOWN)) {
|
||||
if (PS3.getButtonClick(DOWN)) {
|
||||
Serial.print(F("\r\nDown"));
|
||||
PS3.setAllOff();
|
||||
PS3.setLedOff();
|
||||
PS3.setLedOn(LED2);
|
||||
}
|
||||
if(PS3.getButtonClick(LEFT)) {
|
||||
if (PS3.getButtonClick(LEFT)) {
|
||||
Serial.print(F("\r\nLeft"));
|
||||
PS3.setAllOff();
|
||||
PS3.setLedOff();
|
||||
PS3.setLedOn(LED3);
|
||||
}
|
||||
|
||||
if(PS3.getButtonClick(L1))
|
||||
if (PS3.getButtonClick(L1))
|
||||
Serial.print(F("\r\nL1"));
|
||||
if(PS3.getButtonClick(L3))
|
||||
if (PS3.getButtonClick(L3))
|
||||
Serial.print(F("\r\nL3"));
|
||||
if(PS3.getButtonClick(R1))
|
||||
if (PS3.getButtonClick(R1))
|
||||
Serial.print(F("\r\nR1"));
|
||||
if(PS3.getButtonClick(R3))
|
||||
if (PS3.getButtonClick(R3))
|
||||
Serial.print(F("\r\nR3"));
|
||||
|
||||
if(PS3.getButtonClick(SELECT)) {
|
||||
if (PS3.getButtonClick(SELECT)) {
|
||||
Serial.print(F("\r\nSelect - "));
|
||||
Serial.print(PS3.getStatusString());
|
||||
}
|
||||
if(PS3.getButtonClick(START)) {
|
||||
if (PS3.getButtonClick(START)) {
|
||||
Serial.print(F("\r\nStart"));
|
||||
printAngle = !printAngle;
|
||||
}
|
||||
}
|
||||
if(printAngle) {
|
||||
if (printAngle) {
|
||||
Serial.print(F("\r\nPitch: "));
|
||||
Serial.print(PS3.getAngle(Pitch));
|
||||
Serial.print(F("\tRoll: "));
|
||||
Serial.print(PS3.getAngle(Roll));
|
||||
}
|
||||
else if(PS3.PS3MoveConnected) { // One can only set the color of the bulb, set the rumble, set and get the bluetooth address and calibrate the magnetometer via USB
|
||||
switch(state) {
|
||||
case 0:
|
||||
}
|
||||
else if (PS3.PS3MoveConnected) { // One can only set the color of the bulb, set the rumble, set and get the bluetooth address and calibrate the magnetometer via USB
|
||||
if (state == 0) {
|
||||
PS3.moveSetRumble(0);
|
||||
PS3.moveSetBulb(Off);
|
||||
state = 1;
|
||||
break;
|
||||
|
||||
case 1:
|
||||
} else if (state == 1) {
|
||||
PS3.moveSetRumble(75);
|
||||
PS3.moveSetBulb(Red);
|
||||
state = 2;
|
||||
break;
|
||||
|
||||
case 2:
|
||||
} else if (state == 2) {
|
||||
PS3.moveSetRumble(125);
|
||||
PS3.moveSetBulb(Green);
|
||||
state = 3;
|
||||
break;
|
||||
|
||||
case 3:
|
||||
} else if (state == 3) {
|
||||
PS3.moveSetRumble(150);
|
||||
PS3.moveSetBulb(Blue);
|
||||
state = 4;
|
||||
break;
|
||||
|
||||
case 4:
|
||||
} else if (state == 4) {
|
||||
PS3.moveSetRumble(175);
|
||||
PS3.moveSetBulb(Yellow);
|
||||
state = 5;
|
||||
break;
|
||||
|
||||
case 5:
|
||||
} else if (state == 5) {
|
||||
PS3.moveSetRumble(200);
|
||||
PS3.moveSetBulb(Lightblue);
|
||||
state = 6;
|
||||
break;
|
||||
|
||||
case 6:
|
||||
} else if (state == 6) {
|
||||
PS3.moveSetRumble(225);
|
||||
PS3.moveSetBulb(Purble);
|
||||
state = 7;
|
||||
break;
|
||||
|
||||
case 7:
|
||||
} else if (state == 7) {
|
||||
PS3.moveSetRumble(250);
|
||||
PS3.moveSetBulb(White);
|
||||
state = 0;
|
||||
break;
|
||||
}
|
||||
|
||||
state++;
|
||||
if (state > 7)
|
||||
state = 0;
|
||||
delay(1000);
|
||||
}
|
||||
}
|
||||
|
|
|
@ -16,83 +16,84 @@ void setup() {
|
|||
while (!Serial); // Wait for serial port to connect - used on Leonardo, Teensy and other boards with built-in USB CDC serial connection
|
||||
if (Usb.Init() == -1) {
|
||||
Serial.print(F("\r\nOSC did not start"));
|
||||
while(1); // halt
|
||||
while (1); // halt
|
||||
}
|
||||
Serial.print(F("\r\nXBOX Library Started"));
|
||||
}
|
||||
void loop() {
|
||||
Usb.Task();
|
||||
if(Xbox.XboxConnected) {
|
||||
if(Xbox.getButtonPress(BLACK) || Xbox.getButtonPress(WHITE)) {
|
||||
if (Xbox.XboxConnected) {
|
||||
if (Xbox.getButtonPress(BLACK) || Xbox.getButtonPress(WHITE)) {
|
||||
Serial.print("BLACK: ");
|
||||
Serial.print(Xbox.getButtonPress(BLACK));
|
||||
Serial.print("\tWHITE: ");
|
||||
Serial.println(Xbox.getButtonPress(WHITE));
|
||||
Xbox.setRumbleOn(Xbox.getButtonPress(BLACK),Xbox.getButtonPress(WHITE));
|
||||
Xbox.setRumbleOn(Xbox.getButtonPress(BLACK), Xbox.getButtonPress(WHITE));
|
||||
} else
|
||||
Xbox.setRumbleOn(0,0);
|
||||
if(Xbox.getAnalogHat(LeftHatX) > 7500 || Xbox.getAnalogHat(LeftHatX) < -7500 || Xbox.getAnalogHat(LeftHatY) > 7500 || Xbox.getAnalogHat(LeftHatY) < -7500 || Xbox.getAnalogHat(RightHatX) > 7500 || Xbox.getAnalogHat(RightHatX) < -7500 || Xbox.getAnalogHat(RightHatY) > 7500 || Xbox.getAnalogHat(RightHatY) < -7500) {
|
||||
if(Xbox.getAnalogHat(LeftHatX) > 7500 || Xbox.getAnalogHat(LeftHatX) < -7500) {
|
||||
Xbox.setRumbleOn(0, 0);
|
||||
|
||||
if (Xbox.getAnalogHat(LeftHatX) > 7500 || Xbox.getAnalogHat(LeftHatX) < -7500 || Xbox.getAnalogHat(LeftHatY) > 7500 || Xbox.getAnalogHat(LeftHatY) < -7500 || Xbox.getAnalogHat(RightHatX) > 7500 || Xbox.getAnalogHat(RightHatX) < -7500 || Xbox.getAnalogHat(RightHatY) > 7500 || Xbox.getAnalogHat(RightHatY) < -7500) {
|
||||
if (Xbox.getAnalogHat(LeftHatX) > 7500 || Xbox.getAnalogHat(LeftHatX) < -7500) {
|
||||
Serial.print(F("LeftHatX: "));
|
||||
Serial.print(Xbox.getAnalogHat(LeftHatX));
|
||||
Serial.print("\t");
|
||||
}
|
||||
if(Xbox.getAnalogHat(LeftHatY) > 7500 || Xbox.getAnalogHat(LeftHatY) < -7500) {
|
||||
if (Xbox.getAnalogHat(LeftHatY) > 7500 || Xbox.getAnalogHat(LeftHatY) < -7500) {
|
||||
Serial.print(F("LeftHatY: "));
|
||||
Serial.print(Xbox.getAnalogHat(LeftHatY));
|
||||
Serial.print("\t");
|
||||
}
|
||||
if(Xbox.getAnalogHat(RightHatX) > 7500 || Xbox.getAnalogHat(RightHatX) < -7500) {
|
||||
if (Xbox.getAnalogHat(RightHatX) > 7500 || Xbox.getAnalogHat(RightHatX) < -7500) {
|
||||
Serial.print(F("RightHatX: "));
|
||||
Serial.print(Xbox.getAnalogHat(RightHatX));
|
||||
Serial.print("\t");
|
||||
}
|
||||
if(Xbox.getAnalogHat(RightHatY) > 7500 || Xbox.getAnalogHat(RightHatY) < -7500) {
|
||||
if (Xbox.getAnalogHat(RightHatY) > 7500 || Xbox.getAnalogHat(RightHatY) < -7500) {
|
||||
Serial.print(F("RightHatY: "));
|
||||
Serial.print(Xbox.getAnalogHat(RightHatY));
|
||||
}
|
||||
Serial.println();
|
||||
}
|
||||
|
||||
if(Xbox.getButtonClick(UP))
|
||||
if (Xbox.getButtonClick(UP))
|
||||
Serial.println(F("Up"));
|
||||
if(Xbox.getButtonClick(DOWN))
|
||||
if (Xbox.getButtonClick(DOWN))
|
||||
Serial.println(F("Down"));
|
||||
if(Xbox.getButtonClick(LEFT))
|
||||
if (Xbox.getButtonClick(LEFT))
|
||||
Serial.println(F("Left"));
|
||||
if(Xbox.getButtonClick(RIGHT))
|
||||
if (Xbox.getButtonClick(RIGHT))
|
||||
Serial.println(F("Right"));
|
||||
|
||||
if(Xbox.getButtonClick(START))
|
||||
if (Xbox.getButtonClick(START))
|
||||
Serial.println(F("Start"));
|
||||
if(Xbox.getButtonClick(BACK))
|
||||
if (Xbox.getButtonClick(BACK))
|
||||
Serial.println(F("Back"));
|
||||
if(Xbox.getButtonClick(L3))
|
||||
if (Xbox.getButtonClick(L3))
|
||||
Serial.println(F("L3"));
|
||||
if(Xbox.getButtonClick(R3))
|
||||
if (Xbox.getButtonClick(R3))
|
||||
Serial.println(F("R3"));
|
||||
|
||||
if(Xbox.getButtonPress(A)) {
|
||||
if (Xbox.getButtonPress(A)) {
|
||||
Serial.print(F("A: "));
|
||||
Serial.println(Xbox.getButtonPress(A));
|
||||
}
|
||||
if(Xbox.getButtonPress(B)) {
|
||||
if (Xbox.getButtonPress(B)) {
|
||||
Serial.print(F("B: "));
|
||||
Serial.println(Xbox.getButtonPress(B));
|
||||
}
|
||||
if(Xbox.getButtonPress(X)) {
|
||||
if (Xbox.getButtonPress(X)) {
|
||||
Serial.print(F("X: "));
|
||||
Serial.println(Xbox.getButtonPress(X));
|
||||
}
|
||||
if(Xbox.getButtonPress(Y)) {
|
||||
if (Xbox.getButtonPress(Y)) {
|
||||
Serial.print(F("Y: "));
|
||||
Serial.println(Xbox.getButtonPress(Y));
|
||||
}
|
||||
if(Xbox.getButtonPress(L1)) {
|
||||
if (Xbox.getButtonPress(L1)) {
|
||||
Serial.print(F("L1: "));
|
||||
Serial.println(Xbox.getButtonPress(L1));
|
||||
}
|
||||
if(Xbox.getButtonPress(R1)) {
|
||||
if (Xbox.getButtonPress(R1)) {
|
||||
Serial.print(F("R1: "));
|
||||
Serial.println(Xbox.getButtonPress(R1));
|
||||
}
|
||||
|
|
|
@ -15,98 +15,100 @@ void setup() {
|
|||
while (!Serial); // Wait for serial port to connect - used on Leonardo, Teensy and other boards with built-in USB CDC serial connection
|
||||
if (Usb.Init() == -1) {
|
||||
Serial.print(F("\r\nOSC did not start"));
|
||||
while(1); //halt
|
||||
while (1); //halt
|
||||
}
|
||||
Serial.print(F("\r\nXbox Wireless Receiver Library Started"));
|
||||
}
|
||||
void loop() {
|
||||
Usb.Task();
|
||||
if(Xbox.XboxReceiverConnected) {
|
||||
for(uint8_t i=0;i<4;i++) {
|
||||
if(Xbox.Xbox360Connected[i]) {
|
||||
if(Xbox.getButtonPress(L2,i) || Xbox.getButtonPress(R2,i)) {
|
||||
if (Xbox.XboxReceiverConnected) {
|
||||
for (uint8_t i = 0; i < 4; i++) {
|
||||
if (Xbox.Xbox360Connected[i]) {
|
||||
if (Xbox.getButtonPress(L2, i) || Xbox.getButtonPress(R2, i)) {
|
||||
Serial.print("L2: ");
|
||||
Serial.print(Xbox.getButtonPress(L2,i));
|
||||
Serial.print(Xbox.getButtonPress(L2, i));
|
||||
Serial.print("\tR2: ");
|
||||
Serial.println(Xbox.getButtonPress(R2,i));
|
||||
Xbox.setRumbleOn(Xbox.getButtonPress(L2,i),Xbox.getButtonPress(R2,i),i);
|
||||
Serial.println(Xbox.getButtonPress(R2, i));
|
||||
Xbox.setRumbleOn(Xbox.getButtonPress(L2, i), Xbox.getButtonPress(R2, i), i);
|
||||
}
|
||||
if(Xbox.getAnalogHat(LeftHatX,i) > 7500 || Xbox.getAnalogHat(LeftHatX,i) < -7500 || Xbox.getAnalogHat(LeftHatY,i) > 7500 || Xbox.getAnalogHat(LeftHatY,i) < -7500 || Xbox.getAnalogHat(RightHatX,i) > 7500 || Xbox.getAnalogHat(RightHatX,i) < -7500 || Xbox.getAnalogHat(RightHatY,i) > 7500 || Xbox.getAnalogHat(RightHatY,i) < -7500) {
|
||||
if(Xbox.getAnalogHat(LeftHatX,i) > 7500 || Xbox.getAnalogHat(LeftHatX,i) < -7500) {
|
||||
|
||||
if (Xbox.getAnalogHat(LeftHatX, i) > 7500 || Xbox.getAnalogHat(LeftHatX, i) < -7500 || Xbox.getAnalogHat(LeftHatY, i) > 7500 || Xbox.getAnalogHat(LeftHatY, i) < -7500 || Xbox.getAnalogHat(RightHatX, i) > 7500 || Xbox.getAnalogHat(RightHatX, i) < -7500 || Xbox.getAnalogHat(RightHatY, i) > 7500 || Xbox.getAnalogHat(RightHatY, i) < -7500) {
|
||||
if (Xbox.getAnalogHat(LeftHatX, i) > 7500 || Xbox.getAnalogHat(LeftHatX, i) < -7500) {
|
||||
Serial.print(F("LeftHatX: "));
|
||||
Serial.print(Xbox.getAnalogHat(LeftHatX,i));
|
||||
Serial.print(Xbox.getAnalogHat(LeftHatX, i));
|
||||
Serial.print("\t");
|
||||
}
|
||||
if(Xbox.getAnalogHat(LeftHatY,i) > 7500 || Xbox.getAnalogHat(LeftHatY,i) < -7500) {
|
||||
if (Xbox.getAnalogHat(LeftHatY, i) > 7500 || Xbox.getAnalogHat(LeftHatY, i) < -7500) {
|
||||
Serial.print(F("LeftHatY: "));
|
||||
Serial.print(Xbox.getAnalogHat(LeftHatY,i));
|
||||
Serial.print(Xbox.getAnalogHat(LeftHatY, i));
|
||||
Serial.print("\t");
|
||||
}
|
||||
if(Xbox.getAnalogHat(RightHatX,i) > 7500 || Xbox.getAnalogHat(RightHatX,i) < -7500) {
|
||||
if (Xbox.getAnalogHat(RightHatX, i) > 7500 || Xbox.getAnalogHat(RightHatX, i) < -7500) {
|
||||
Serial.print(F("RightHatX: "));
|
||||
Serial.print(Xbox.getAnalogHat(RightHatX,i));
|
||||
Serial.print(Xbox.getAnalogHat(RightHatX, i));
|
||||
Serial.print("\t");
|
||||
}
|
||||
if(Xbox.getAnalogHat(RightHatY,i) > 7500 || Xbox.getAnalogHat(RightHatY,i) < -7500) {
|
||||
if (Xbox.getAnalogHat(RightHatY, i) > 7500 || Xbox.getAnalogHat(RightHatY, i) < -7500) {
|
||||
Serial.print(F("RightHatY: "));
|
||||
Serial.print(Xbox.getAnalogHat(RightHatY,i));
|
||||
Serial.print(Xbox.getAnalogHat(RightHatY, i));
|
||||
}
|
||||
Serial.println();
|
||||
}
|
||||
|
||||
if(Xbox.getButtonClick(UP,i)) {
|
||||
Xbox.setLedOn(LED1,i);
|
||||
if (Xbox.getButtonClick(UP, i)) {
|
||||
Xbox.setLedOn(LED1, i);
|
||||
Serial.println(F("Up"));
|
||||
}
|
||||
if(Xbox.getButtonClick(DOWN,i)) {
|
||||
Xbox.setLedOn(LED4,i);
|
||||
if (Xbox.getButtonClick(DOWN, i)) {
|
||||
Xbox.setLedOn(LED4, i);
|
||||
Serial.println(F("Down"));
|
||||
}
|
||||
if(Xbox.getButtonClick(LEFT,i)) {
|
||||
Xbox.setLedOn(LED3,i);
|
||||
if (Xbox.getButtonClick(LEFT, i)) {
|
||||
Xbox.setLedOn(LED3, i);
|
||||
Serial.println(F("Left"));
|
||||
}
|
||||
if(Xbox.getButtonClick(RIGHT,i)) {
|
||||
Xbox.setLedOn(LED2,i);
|
||||
if (Xbox.getButtonClick(RIGHT, i)) {
|
||||
Xbox.setLedOn(LED2, i);
|
||||
Serial.println(F("Right"));
|
||||
}
|
||||
|
||||
if(Xbox.getButtonClick(START,i)) {
|
||||
Xbox.setLedMode(ALTERNATING,i);
|
||||
if (Xbox.getButtonClick(START, i)) {
|
||||
Xbox.setLedMode(ALTERNATING, i);
|
||||
Serial.println(F("Start"));
|
||||
}
|
||||
if(Xbox.getButtonClick(BACK,i)) {
|
||||
Xbox.setLedBlink(ALL,i);
|
||||
if (Xbox.getButtonClick(BACK, i)) {
|
||||
Xbox.setLedBlink(ALL, i);
|
||||
Serial.println(F("Back"));
|
||||
}
|
||||
if(Xbox.getButtonClick(L3,i))
|
||||
if (Xbox.getButtonClick(L3, i))
|
||||
Serial.println(F("L3"));
|
||||
if(Xbox.getButtonClick(R3,i))
|
||||
if (Xbox.getButtonClick(R3, i))
|
||||
Serial.println(F("R3"));
|
||||
|
||||
if(Xbox.getButtonClick(L1,i))
|
||||
if (Xbox.getButtonClick(L1, i))
|
||||
Serial.println(F("L1"));
|
||||
if(Xbox.getButtonClick(R1,i))
|
||||
if (Xbox.getButtonClick(R1, i))
|
||||
Serial.println(F("R1"));
|
||||
if(Xbox.getButtonClick(XBOX,i)) {
|
||||
Xbox.setLedMode(ROTATING,i);
|
||||
if (Xbox.getButtonClick(XBOX, i)) {
|
||||
Xbox.setLedMode(ROTATING, i);
|
||||
Serial.print(F("Xbox (Battery: "));
|
||||
Serial.print(Xbox.getBatteryLevel(i)); // The battery level in the range 0-3
|
||||
Serial.println(F(")"));
|
||||
}
|
||||
if(Xbox.getButtonClick(SYNC,i))
|
||||
if (Xbox.getButtonClick(SYNC, i)) {
|
||||
Serial.println(F("Sync"));
|
||||
Xbox.disconnect(i);
|
||||
}
|
||||
|
||||
if(Xbox.getButtonClick(A,i))
|
||||
if (Xbox.getButtonClick(A, i))
|
||||
Serial.println(F("A"));
|
||||
if(Xbox.getButtonClick(B,i))
|
||||
if (Xbox.getButtonClick(B, i))
|
||||
Serial.println(F("B"));
|
||||
if(Xbox.getButtonClick(X,i))
|
||||
if (Xbox.getButtonClick(X, i))
|
||||
Serial.println(F("X"));
|
||||
if(Xbox.getButtonClick(Y,i))
|
||||
if (Xbox.getButtonClick(Y, i))
|
||||
Serial.println(F("Y"));
|
||||
}
|
||||
}
|
||||
}
|
||||
delay(1);
|
||||
}
|
||||
|
|
|
@ -14,90 +14,91 @@ void setup() {
|
|||
while (!Serial); // Wait for serial port to connect - used on Leonardo, Teensy and other boards with built-in USB CDC serial connection
|
||||
if (Usb.Init() == -1) {
|
||||
Serial.print(F("\r\nOSC did not start"));
|
||||
while(1); //halt
|
||||
while (1); //halt
|
||||
}
|
||||
Serial.print(F("\r\nXBOX USB Library Started"));
|
||||
}
|
||||
void loop() {
|
||||
Usb.Task();
|
||||
if(Xbox.Xbox360Connected) {
|
||||
if(Xbox.getButtonPress(L2) || Xbox.getButtonPress(R2)) {
|
||||
if (Xbox.Xbox360Connected) {
|
||||
if (Xbox.getButtonPress(L2) || Xbox.getButtonPress(R2)) {
|
||||
Serial.print("L2: ");
|
||||
Serial.print(Xbox.getButtonPress(L2));
|
||||
Serial.print("\tR2: ");
|
||||
Serial.println(Xbox.getButtonPress(R2));
|
||||
Xbox.setRumbleOn(Xbox.getButtonPress(L2),Xbox.getButtonPress(R2));
|
||||
Xbox.setRumbleOn(Xbox.getButtonPress(L2), Xbox.getButtonPress(R2));
|
||||
} else
|
||||
Xbox.setRumbleOn(0,0);
|
||||
if(Xbox.getAnalogHat(LeftHatX) > 7500 || Xbox.getAnalogHat(LeftHatX) < -7500 || Xbox.getAnalogHat(LeftHatY) > 7500 || Xbox.getAnalogHat(LeftHatY) < -7500 || Xbox.getAnalogHat(RightHatX) > 7500 || Xbox.getAnalogHat(RightHatX) < -7500 || Xbox.getAnalogHat(RightHatY) > 7500 || Xbox.getAnalogHat(RightHatY) < -7500) {
|
||||
if(Xbox.getAnalogHat(LeftHatX) > 7500 || Xbox.getAnalogHat(LeftHatX) < -7500) {
|
||||
Xbox.setRumbleOn(0, 0);
|
||||
|
||||
if (Xbox.getAnalogHat(LeftHatX) > 7500 || Xbox.getAnalogHat(LeftHatX) < -7500 || Xbox.getAnalogHat(LeftHatY) > 7500 || Xbox.getAnalogHat(LeftHatY) < -7500 || Xbox.getAnalogHat(RightHatX) > 7500 || Xbox.getAnalogHat(RightHatX) < -7500 || Xbox.getAnalogHat(RightHatY) > 7500 || Xbox.getAnalogHat(RightHatY) < -7500) {
|
||||
if (Xbox.getAnalogHat(LeftHatX) > 7500 || Xbox.getAnalogHat(LeftHatX) < -7500) {
|
||||
Serial.print(F("LeftHatX: "));
|
||||
Serial.print(Xbox.getAnalogHat(LeftHatX));
|
||||
Serial.print("\t");
|
||||
}
|
||||
if(Xbox.getAnalogHat(LeftHatY) > 7500 || Xbox.getAnalogHat(LeftHatY) < -7500) {
|
||||
if (Xbox.getAnalogHat(LeftHatY) > 7500 || Xbox.getAnalogHat(LeftHatY) < -7500) {
|
||||
Serial.print(F("LeftHatY: "));
|
||||
Serial.print(Xbox.getAnalogHat(LeftHatY));
|
||||
Serial.print("\t");
|
||||
}
|
||||
if(Xbox.getAnalogHat(RightHatX) > 7500 || Xbox.getAnalogHat(RightHatX) < -7500) {
|
||||
if (Xbox.getAnalogHat(RightHatX) > 7500 || Xbox.getAnalogHat(RightHatX) < -7500) {
|
||||
Serial.print(F("RightHatX: "));
|
||||
Serial.print(Xbox.getAnalogHat(RightHatX));
|
||||
Serial.print("\t");
|
||||
}
|
||||
if(Xbox.getAnalogHat(RightHatY) > 7500 || Xbox.getAnalogHat(RightHatY) < -7500) {
|
||||
if (Xbox.getAnalogHat(RightHatY) > 7500 || Xbox.getAnalogHat(RightHatY) < -7500) {
|
||||
Serial.print(F("RightHatY: "));
|
||||
Serial.print(Xbox.getAnalogHat(RightHatY));
|
||||
}
|
||||
Serial.println();
|
||||
}
|
||||
|
||||
if(Xbox.getButtonClick(UP)) {
|
||||
if (Xbox.getButtonClick(UP)) {
|
||||
Xbox.setLedOn(LED1);
|
||||
Serial.println(F("Up"));
|
||||
}
|
||||
if(Xbox.getButtonClick(DOWN)) {
|
||||
if (Xbox.getButtonClick(DOWN)) {
|
||||
Xbox.setLedOn(LED4);
|
||||
Serial.println(F("Down"));
|
||||
}
|
||||
if(Xbox.getButtonClick(LEFT)) {
|
||||
if (Xbox.getButtonClick(LEFT)) {
|
||||
Xbox.setLedOn(LED3);
|
||||
Serial.println(F("Left"));
|
||||
}
|
||||
if(Xbox.getButtonClick(RIGHT)) {
|
||||
if (Xbox.getButtonClick(RIGHT)) {
|
||||
Xbox.setLedOn(LED2);
|
||||
Serial.println(F("Right"));
|
||||
}
|
||||
|
||||
if(Xbox.getButtonClick(START)) {
|
||||
if (Xbox.getButtonClick(START)) {
|
||||
Xbox.setLedMode(ALTERNATING);
|
||||
Serial.println(F("Start"));
|
||||
}
|
||||
if(Xbox.getButtonClick(BACK)) {
|
||||
if (Xbox.getButtonClick(BACK)) {
|
||||
Xbox.setLedBlink(ALL);
|
||||
Serial.println(F("Back"));
|
||||
}
|
||||
if(Xbox.getButtonClick(L3))
|
||||
if (Xbox.getButtonClick(L3))
|
||||
Serial.println(F("L3"));
|
||||
if(Xbox.getButtonClick(R3))
|
||||
if (Xbox.getButtonClick(R3))
|
||||
Serial.println(F("R3"));
|
||||
|
||||
if(Xbox.getButtonClick(L1))
|
||||
if (Xbox.getButtonClick(L1))
|
||||
Serial.println(F("L1"));
|
||||
if(Xbox.getButtonClick(R1))
|
||||
if (Xbox.getButtonClick(R1))
|
||||
Serial.println(F("R1"));
|
||||
if(Xbox.getButtonClick(XBOX)) {
|
||||
if (Xbox.getButtonClick(XBOX)) {
|
||||
Xbox.setLedMode(ROTATING);
|
||||
Serial.println(F("Xbox"));
|
||||
}
|
||||
|
||||
if(Xbox.getButtonClick(A))
|
||||
if (Xbox.getButtonClick(A))
|
||||
Serial.println(F("A"));
|
||||
if(Xbox.getButtonClick(B))
|
||||
if (Xbox.getButtonClick(B))
|
||||
Serial.println(F("B"));
|
||||
if(Xbox.getButtonClick(X))
|
||||
if (Xbox.getButtonClick(X))
|
||||
Serial.println(F("X"));
|
||||
if(Xbox.getButtonClick(Y))
|
||||
if (Xbox.getButtonClick(Y))
|
||||
Serial.println(F("Y"));
|
||||
}
|
||||
delay(1);
|
||||
|
|
|
@ -3,40 +3,53 @@
|
|||
#include <adk.h>
|
||||
|
||||
USB Usb;
|
||||
ADK adk(&Usb,"TKJElectronics", // Manufacturer Name
|
||||
ADK adk(&Usb, "TKJElectronics", // Manufacturer Name
|
||||
"ArduinoBlinkLED", // Model Name
|
||||
"Example sketch for the USB Host Shield", // Description (user-visible string)
|
||||
"1.0", // Version
|
||||
"http://www.tkjelectronics.dk/uploads/ArduinoBlinkLED.apk", // URL (web page to visit if no installed apps support the accessory)
|
||||
"123456789"); // Serial Number (optional)
|
||||
|
||||
#define LED 13 // Pin 13 is occupied by the SCK pin on a normal Arduino (Uno, Duemilanove etc.), so use a different pin
|
||||
#define LED LED_BUILTIN // Use built in LED - note that pin 13 is occupied by the SCK pin on a normal Arduino (Uno, Duemilanove etc.), so use a different pin
|
||||
|
||||
void setup()
|
||||
{
|
||||
uint32_t timer;
|
||||
|
||||
void setup() {
|
||||
Serial.begin(115200);
|
||||
while (!Serial); // Wait for serial port to connect - used on Leonardo, Teensy and other boards with built-in USB CDC serial connection
|
||||
if (Usb.Init() == -1) {
|
||||
Serial.print("\r\nOSCOKIRQ failed to assert");
|
||||
while(1); //halt
|
||||
while (1); // halt
|
||||
}
|
||||
pinMode(LED, OUTPUT);
|
||||
Serial.print("\r\nArduino Blink LED Started");
|
||||
}
|
||||
|
||||
void loop()
|
||||
{
|
||||
void loop() {
|
||||
Usb.Task();
|
||||
if(adk.isReady()) {
|
||||
if (adk.isReady()) {
|
||||
uint8_t msg[1];
|
||||
uint16_t len = sizeof(msg);
|
||||
uint8_t rcode = adk.RcvData(&len, msg);
|
||||
if(rcode && rcode != hrNAK)
|
||||
USBTRACE2("Data rcv. :", rcode);
|
||||
if(len > 0) {
|
||||
if (rcode && rcode != hrNAK) {
|
||||
Serial.print(F("\r\nData rcv: "));
|
||||
Serial.print(rcode, HEX);
|
||||
} else if (len > 0) {
|
||||
Serial.print(F("\r\nData Packet: "));
|
||||
Serial.print(msg[0]);
|
||||
digitalWrite(LED,msg[0] ? HIGH : LOW);
|
||||
digitalWrite(LED, msg[0] ? HIGH : LOW);
|
||||
}
|
||||
|
||||
if (millis() - timer >= 1000) { // Send data every 1s
|
||||
timer = millis();
|
||||
rcode = adk.SndData(sizeof(timer), (uint8_t*)&timer);
|
||||
if (rcode && rcode != hrNAK) {
|
||||
Serial.print(F("\r\nData send: "));
|
||||
Serial.print(rcode, HEX);
|
||||
} else if (rcode != hrNAK) {
|
||||
Serial.print(F("\r\nTimer: "));
|
||||
Serial.print(timer);
|
||||
}
|
||||
}
|
||||
}
|
||||
else
|
||||
|
|
|
@ -34,7 +34,10 @@ PS3USB KEYWORD1
|
|||
# Methods and Functions (KEYWORD2)
|
||||
####################################################
|
||||
setBdaddr KEYWORD2
|
||||
getBdaddr KEYWORD2
|
||||
setMoveBdaddr KEYWORD2
|
||||
getMoveBdaddr KEYWORD2
|
||||
getMoveCalibration KEYWORD2
|
||||
|
||||
getButtonPress KEYWORD2
|
||||
getButtonClick KEYWORD2
|
||||
|
|
Loading…
Reference in a new issue