This commit is contained in:
Andrew J. Kroll 2013-12-04 18:51:06 -05:00
commit 95d133b919
40 changed files with 1214 additions and 945 deletions

45
BTD.cpp
View file

@ -16,7 +16,7 @@
*/ */
#include "BTD.h" #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 //#define EXTRADEBUG // Uncomment to get even more debugging data
const uint8_t BTD::BTD_CONTROL_PIPE = 0; const uint8_t BTD::BTD_CONTROL_PIPE = 0;
@ -403,14 +403,10 @@ void BTD::HCI_event_task() {
break; break;
case EV_COMMAND_STATUS: case EV_COMMAND_STATUS:
if (hcibuf[2]) { // show status on serial if not OK if (hcibuf[2]) { // Show status on serial if not OK
#ifdef DEBUG_USB_HOST #ifdef DEBUG_USB_HOST
Notify(PSTR("\r\nHCI Command Failed: "), 0x80); Notify(PSTR("\r\nHCI Command Failed: "), 0x80);
D_PrintHex<uint8_t > (hcibuf[2], 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 #endif
} }
break; break;
@ -466,15 +462,18 @@ void BTD::HCI_event_task() {
case EV_CONNECT_COMPLETE: case EV_CONNECT_COMPLETE:
hci_event_flag |= HCI_FLAG_CONNECT_EVENT; hci_event_flag |= HCI_FLAG_CONNECT_EVENT;
if (!hcibuf[2]) { // check if connected OK 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_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 hci_event_flag |= HCI_FLAG_CONN_COMPLETE; // set connection complete flag
} } else {
#ifdef DEBUG_USB_HOST
else {
Notify(PSTR("\r\nConnection Failed"), 0x80);
hci_state = HCI_CHECK_WII_SERVICE; hci_state = HCI_CHECK_WII_SERVICE;
} #ifdef DEBUG_USB_HOST
Notify(PSTR("\r\nConnection Failed: "), 0x80);
D_PrintHex<uint8_t > (hcibuf[2], 0x80);
#endif #endif
}
break; break;
case EV_DISCONNECT_COMPLETE: case EV_DISCONNECT_COMPLETE:
@ -971,16 +970,20 @@ void BTD::hci_inquiry_cancel() {
} }
void BTD::hci_connect() { 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); hci_event_flag &= ~(HCI_FLAG_CONN_COMPLETE | HCI_FLAG_CONNECT_EVENT);
hcibuf[0] = 0x05; hcibuf[0] = 0x05;
hcibuf[1] = 0x01 << 2; // HCI OGF = 1 hcibuf[1] = 0x01 << 2; // HCI OGF = 1
hcibuf[2] = 0x0D; // parameter Total Length = 13 hcibuf[2] = 0x0D; // parameter Total Length = 13
hcibuf[3] = disc_bdaddr[0]; // 6 octet bdaddr hcibuf[3] = bdaddr[0]; // 6 octet bdaddr (LSB)
hcibuf[4] = disc_bdaddr[1]; hcibuf[4] = bdaddr[1];
hcibuf[5] = disc_bdaddr[2]; hcibuf[5] = bdaddr[2];
hcibuf[6] = disc_bdaddr[3]; hcibuf[6] = bdaddr[3];
hcibuf[7] = disc_bdaddr[4]; hcibuf[7] = bdaddr[4];
hcibuf[8] = disc_bdaddr[5]; hcibuf[8] = bdaddr[5];
hcibuf[9] = 0x18; // DM1 or DH1 may be used hcibuf[9] = 0x18; // DM1 or DH1 may be used
hcibuf[10] = 0xCC; // DM3, DH3, DM5, DH5 may be used hcibuf[10] = 0xCC; // DM3, DH3, DM5, DH5 may be used
hcibuf[11] = 0x01; // Page repetition mode R1 hcibuf[11] = 0x01; // Page repetition mode R1
@ -1079,7 +1082,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 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[1] = 0x03 << 2; // HCI OGF = 3
hcibuf[2] = 0x03; // parameter length = 3 hcibuf[2] = 0x03; // parameter length = 3
hcibuf[3] = 0x04; // Robot hcibuf[3] = 0x04; // Robot
@ -1259,9 +1262,9 @@ void BTD::setBdaddr(uint8_t* bdaddr) {
buf[1] = 0x00; buf[1] = 0x00;
for (uint8_t i = 0; i < 6; i++) for (uint8_t i = 0; i < 6; i++)
buf[i + 2] = 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); pUsb->ctrlReq(bAddress, epInfo[BTD_CONTROL_PIPE].epAddr, bmREQ_HID_OUT, HID_REQUEST_SET_REPORT, 0xF5, 0x03, 0x00, 8, 8, buf, NULL);
} }
@ -1277,6 +1280,6 @@ void BTD::setMoveBdaddr(uint8_t* bdaddr) {
for (uint8_t i = 0; i < 6; i++) 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[BTD_CONTROL_PIPE].epAddr, bmREQ_HID_OUT, HID_REQUEST_SET_REPORT, 0x05, 0x03, 0x00, 11, 11, buf, NULL); 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
View file

@ -219,7 +219,13 @@ public:
* @return Returns true if the device's VID and PID matches this driver. * @return Returns true if the device's VID and PID matches this driver.
*/ */
virtual boolean VIDPIDOK(uint16_t vid, uint16_t pid) { 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(); void hci_inquiry();
/** Cancel a HCI inquiry. */ /** Cancel a HCI inquiry. */
void hci_inquiry_cancel(); void hci_inquiry_cancel();
/** Connect to a device. */ /** Connect to last device communicated with. */
void hci_connect(); 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. */ /** Used to a set the class of the device. */
void hci_write_class_of_device(); void hci_write_class_of_device();
/**@}*/ /**@}*/

View file

@ -16,7 +16,7 @@
*/ */
#include "PS3BT.h" #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 EXTRADEBUG // Uncomment to get even more debugging data
//#define PRINTREPORT // Uncomment to print the report send by the PS3 Controllers //#define PRINTREPORT // Uncomment to print the report send by the PS3 Controllers
@ -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[0] = 0x52; // HID BT Set_report (0x50) | Report Type (Output 0x02)
HIDBuffer[1] = 0x01; // Report ID 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[0] = 0xA2; // HID BT DATA_request (0xA0) | Report Type (Output 0x02)
HIDMoveBuffer[1] = 0x02; // Report ID HIDMoveBuffer[1] = 0x02; // Report ID
/* Set device cid for the control and intterrupt channelse - LSB */ /* Set device cid for the control and intterrupt channelse - LSB */
control_dcid[0] = 0x40; //0x0040 control_dcid[0] = 0x40; // 0x0040
control_dcid[1] = 0x00; control_dcid[1] = 0x00;
interrupt_dcid[0] = 0x41; //0x0041 interrupt_dcid[0] = 0x41; // 0x0041
interrupt_dcid[1] = 0x00; interrupt_dcid[1] = 0x00;
Reset(); Reset();
@ -56,25 +56,19 @@ bool PS3BT::getButtonPress(Button b) {
bool PS3BT::getButtonClick(Button b) { bool PS3BT::getButtonClick(Button b) {
uint32_t button = pgm_read_dword(&BUTTONS[(uint8_t)b]); uint32_t button = pgm_read_dword(&BUTTONS[(uint8_t)b]);
bool click = (ButtonClickState & button); bool click = (ButtonClickState & button);
ButtonClickState &= ~button; // clear "click" event ButtonClickState &= ~button; // Clear "click" event
return click; return click;
} }
uint8_t PS3BT::getAnalogButton(Button a) { uint8_t PS3BT::getAnalogButton(Button a) {
if (l2capinbuf == NULL)
return 0;
return (uint8_t)(l2capinbuf[pgm_read_byte(&ANALOGBUTTONS[(uint8_t)a])]); return (uint8_t)(l2capinbuf[pgm_read_byte(&ANALOGBUTTONS[(uint8_t)a])]);
} }
uint8_t PS3BT::getAnalogHat(AnalogHat a) { uint8_t PS3BT::getAnalogHat(AnalogHat a) {
if (l2capinbuf == NULL)
return 0;
return (uint8_t)(l2capinbuf[(uint8_t)a + 15]); return (uint8_t)(l2capinbuf[(uint8_t)a + 15]);
} }
int16_t PS3BT::getSensor(Sensor a) { int16_t PS3BT::getSensor(Sensor a) {
if (l2capinbuf == NULL)
return 0;
if (PS3Connected) { if (PS3Connected) {
if (a == aX || a == aY || a == aZ || a == gZ) if (a == aX || a == aY || a == aZ || a == gZ)
return ((l2capinbuf[(uint16_t)a] << 8) | l2capinbuf[(uint16_t)a + 1]); 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 PS3BT::getAngle(Angle a) {
double accXval; double accXval, accYval, accZval;
double accYval;
double accZval;
if (PS3Connected) { if (PS3Connected) {
// Data for the Kionix KXPC4 used in the DualShock 3 // 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); accXval = -((double)getSensor(aX) - zeroG);
accYval = -((double)getSensor(aY) - zeroG); accYval = -((double)getSensor(aY) - zeroG);
accZval = -((double)getSensor(aZ) - zeroG); accZval = -((double)getSensor(aZ) - zeroG);
@ -114,13 +106,10 @@ double PS3BT::getAngle(Angle a) {
// Convert to 360 degrees resolution // Convert to 360 degrees resolution
// atan2 outputs the value of -π to π (radians) // atan2 outputs the value of -π to π (radians)
// We are then converting it to 0 to 2π and then to degrees // We are then converting it to 0 to 2π and then to degrees
if (a == Pitch) { if (a == Pitch)
double angle = (atan2(accYval, accZval) + PI) * RAD_TO_DEG; return (atan2(accYval, accZval) + PI) * RAD_TO_DEG;
return angle; else
} else { return (atan2(accXval, accZval) + PI) * RAD_TO_DEG;
double angle = (atan2(accXval, accZval) + PI) * RAD_TO_DEG;
return angle;
}
} }
double PS3BT::get9DOFValues(Sensor a) { // Thanks to Manfred Piendl double PS3BT::get9DOFValues(Sensor a) { // Thanks to Manfred Piendl
@ -168,11 +157,7 @@ String PS3BT::getTemperature() {
} }
bool PS3BT::getStatus(Status c) { bool PS3BT::getStatus(Status c) {
if (l2capinbuf == NULL) return (l2capinbuf[(uint16_t)c >> 8] == ((uint8_t)c & 0xff));
return false;
if (l2capinbuf[(uint16_t)c >> 8] == ((uint8_t)c & 0xff))
return true;
return false;
} }
String PS3BT::getStatusString() { 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 if (((ACLData[0] | (ACLData[1] << 8)) == (hci_handle | 0x2000))) { //acl_handle_ok
for (uint8_t i = 0; i < BULK_MAXPKTSIZE; i++) memcpy(l2capinbuf, ACLData, BULK_MAXPKTSIZE);
l2capinbuf[i] = ACLData[i];
if ((l2capinbuf[6] | (l2capinbuf[7] << 8)) == 0x0001) { //l2cap_control - Channel ID for ACL-U if ((l2capinbuf[6] | (l2capinbuf[7] << 8)) == 0x0001) { //l2cap_control - Channel ID for ACL-U
if (l2capinbuf[8] == L2CAP_CMD_COMMAND_REJECT) { if (l2capinbuf[8] == L2CAP_CMD_COMMAND_REJECT) {
#ifdef DEBUG_USB_HOST #ifdef DEBUG_USB_HOST
@ -457,8 +441,7 @@ void PS3BT::L2CAP_task() {
Notify(PSTR("\r\nHID Interrupt Successfully Configured"), 0x80); Notify(PSTR("\r\nHID Interrupt Successfully Configured"), 0x80);
#endif #endif
if (remote_name[0] == 'M') { // First letter in Motion Controller ('M') 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 memset(l2capinbuf, 0, BULK_MAXPKTSIZE); // Reset l2cap in buffer as it sometimes read it as a button has been pressed
l2capinbuf[i] = 0;
l2cap_state = L2CAP_HID_PS3_LED; l2cap_state = L2CAP_HID_PS3_LED;
} else } else
l2cap_state = L2CAP_HID_ENABLE_SIXAXIS; l2cap_state = L2CAP_HID_ENABLE_SIXAXIS;
@ -497,8 +480,7 @@ void PS3BT::Run() {
switch (l2cap_state) { switch (l2cap_state) {
case L2CAP_HID_ENABLE_SIXAXIS: case L2CAP_HID_ENABLE_SIXAXIS:
if (millis() - timer > 1000) { // loop 1 second before sending the command 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 memset(l2capinbuf, 0, BULK_MAXPKTSIZE); // Reset l2cap in buffer as it sometimes read it as a button has been pressed
l2capinbuf[i] = 0;
for (uint8_t i = 15; i < 19; i++) for (uint8_t i = 15; i < 19; i++)
l2capinbuf[i] = 0x7F; // Set the analog joystick values to center position l2capinbuf[i] = 0x7F; // Set the analog joystick values to center position
enable_sixaxis(); enable_sixaxis();
@ -529,16 +511,16 @@ void PS3BT::Run() {
ButtonState = 0; // Clear all values ButtonState = 0; // Clear all values
OldButtonState = 0; OldButtonState = 0;
ButtonClickState = 0; ButtonClickState = 0;
onInit(); // Turn on the LED on the controller onInit(); // Turn on the LED on the controller
l2cap_state = L2CAP_DONE; l2cap_state = L2CAP_DONE;
} }
break; break;
case L2CAP_DONE: 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 (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 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 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(); timerBulbRumble = millis();
} }
} }
@ -550,18 +532,22 @@ void PS3BT::Run() {
/* HID Commands */ /* 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) { 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 if (millis() - timerHID <= 150) // Check if is has been more than 150ms since last command
delay((uint32_t)(250 - (millis() - timerHID))); //There have to be a delay between commands delay((uint32_t)(150 - (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 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(); timerHID = millis();
} }
void PS3BT::setAllOff() { void PS3BT::setAllOff() {
for (uint8_t i = 0; i < PS3_REPORT_BUFFER_SIZE; i++) HIDBuffer[3] = 0x00; // Rumble bytes
HIDBuffer[i + 2] = pgm_read_byte(&PS3_REPORT_BUFFER[i]); // First two bytes reserved for report type and ID HIDBuffer[4] = 0x00;
HIDBuffer[5] = 0x00;
HIDBuffer[6] = 0x00;
HIDBuffer[11] = 0x00; // LED byte
HID_Command(HIDBuffer, HID_BUFFERSIZE); HID_Command(HIDBuffer, HID_BUFFERSIZE);
} }
@ -596,6 +582,7 @@ void PS3BT::setLedRaw(uint8_t value) {
HIDBuffer[11] = value << 1; HIDBuffer[11] = value << 1;
HID_Command(HIDBuffer, HID_BUFFERSIZE); HID_Command(HIDBuffer, HID_BUFFERSIZE);
} }
void PS3BT::setLedOff(LED a) { void PS3BT::setLedOff(LED a) {
HIDBuffer[11] &= ~((uint8_t)((pgm_read_byte(&LEDS[(uint8_t)a]) & 0x0f) << 1)); HIDBuffer[11] &= ~((uint8_t)((pgm_read_byte(&LEDS[(uint8_t)a]) & 0x0f) << 1));
HID_Command(HIDBuffer, HID_BUFFERSIZE); HID_Command(HIDBuffer, HID_BUFFERSIZE);
@ -611,7 +598,7 @@ void PS3BT::setLedToggle(LED a) {
HID_Command(HIDBuffer, HID_BUFFERSIZE); 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]; uint8_t cmd_buf[6];
cmd_buf[0] = 0x53; // HID BT Set_report (0x50) | Report Type (Feature 0x03) cmd_buf[0] = 0x53; // HID BT Set_report (0x50) | Report Type (Feature 0x03)
cmd_buf[1] = 0xF4; // Report ID cmd_buf[1] = 0xF4; // Report ID
@ -623,17 +610,17 @@ void PS3BT::enable_sixaxis() { //Command used to enable the Dualshock 3 and Navi
HID_Command(cmd_buf, 6); HID_Command(cmd_buf, 6);
} }
//Playstation Move Controller commands // Playstation Move Controller commands
void PS3BT::HIDMove_Command(uint8_t* data, uint8_t nbytes) { 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 if (millis() - timerHID <= 150)// Check if is has been less than 150ms since last command
delay((uint32_t)(250 - (millis() - timerHID))); //There have to be a delay between commands delay((uint32_t)(150 - (millis() - timerHID))); // There have to be a delay between commands
pBtd->L2CAP_Command(hci_handle, data, nbytes, interrupt_scid[0], interrupt_scid[1]); // The Move controller sends it's data via the intterrupt channel pBtd->L2CAP_Command(hci_handle, data, nbytes, interrupt_scid[0], interrupt_scid[1]); // The Move controller sends it's data via the intterrupt channel
timerHID = millis(); timerHID = millis();
} }
void PS3BT::moveSetBulb(uint8_t r, uint8_t g, uint8_t b) { //Use this to set the Color using RGB values 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[3] = r;
HIDMoveBuffer[4] = g; HIDMoveBuffer[4] = g;
HIDMoveBuffer[5] = b; 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) 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); Notify(PSTR("\r\nThe rumble value has to at least 64, or approximately 25%"), 0x80);
#endif #endif
//set the rumble value into the write buffer // Set the rumble value into the write buffer
HIDMoveBuffer[7] = rumble; HIDMoveBuffer[7] = rumble;
HIDMove_Command(HIDMoveBuffer, HID_BUFFERSIZE); HIDMove_Command(HIDMoveBuffer, HID_BUFFERSIZE);

View file

@ -176,6 +176,10 @@ public:
* @param value See: ::LED enum. * @param value See: ::LED enum.
*/ */
void setLedRaw(uint8_t value); void setLedRaw(uint8_t value);
/** Turn all LEDs off. */
void setLedOff() {
setLedRaw(0);
}
/** /**
* Turn the specific ::LED off. * Turn the specific ::LED off.
* @param a The ::LED to turn off. * @param a The ::LED to turn off.

View file

@ -16,7 +16,7 @@
*/ */
#include "PS3USB.h" #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 EXTRADEBUG // Uncomment to get even more debugging data
//#define PRINTREPORT // Uncomment to print the report send by the PS3 Controllers //#define PRINTREPORT // Uncomment to print the report send by the PS3 Controllers
@ -281,8 +281,7 @@ uint8_t PS3USB::Poll() {
#endif #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 } 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 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(); timer = millis();
} }
@ -291,9 +290,6 @@ uint8_t PS3USB::Poll() {
} }
void PS3USB::readReport() { void PS3USB::readReport() {
if (readBuf == NULL)
return;
ButtonState = (uint32_t)(readBuf[2] | ((uint16_t)readBuf[3] << 8) | ((uint32_t)readBuf[4] << 16)); ButtonState = (uint32_t)(readBuf[2] | ((uint16_t)readBuf[3] << 8) | ((uint32_t)readBuf[4] << 16));
//Notify(PSTR("\r\nButtonState", 0x80); //Notify(PSTR("\r\nButtonState", 0x80);
@ -305,10 +301,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 #ifdef PRINTREPORT
if (readBuf == NULL)
return;
for (uint8_t i = 0; i < PS3_REPORT_BUFFER_SIZE; i++) { for (uint8_t i = 0; i < PS3_REPORT_BUFFER_SIZE; i++) {
D_PrintHex<uint8_t > (readBuf[i], 0x80); D_PrintHex<uint8_t > (readBuf[i], 0x80);
Notify(PSTR(" "), 0x80); Notify(PSTR(" "), 0x80);
@ -324,25 +318,19 @@ bool PS3USB::getButtonPress(Button b) {
bool PS3USB::getButtonClick(Button b) { bool PS3USB::getButtonClick(Button b) {
uint32_t button = pgm_read_dword(&BUTTONS[(uint8_t)b]); uint32_t button = pgm_read_dword(&BUTTONS[(uint8_t)b]);
bool click = (ButtonClickState & button); bool click = (ButtonClickState & button);
ButtonClickState &= ~button; // clear "click" event ButtonClickState &= ~button; // Clear "click" event
return click; return click;
} }
uint8_t PS3USB::getAnalogButton(Button a) { uint8_t PS3USB::getAnalogButton(Button a) {
if (readBuf == NULL)
return 0;
return (uint8_t)(readBuf[(pgm_read_byte(&ANALOGBUTTONS[(uint8_t)a])) - 9]); return (uint8_t)(readBuf[(pgm_read_byte(&ANALOGBUTTONS[(uint8_t)a])) - 9]);
} }
uint8_t PS3USB::getAnalogHat(AnalogHat a) { uint8_t PS3USB::getAnalogHat(AnalogHat a) {
if (readBuf == NULL)
return 0;
return (uint8_t)(readBuf[((uint8_t)a + 6)]); return (uint8_t)(readBuf[((uint8_t)a + 6)]);
} }
uint16_t PS3USB::getSensor(Sensor a) { uint16_t PS3USB::getSensor(Sensor a) {
if (readBuf == NULL)
return 0;
return ((readBuf[((uint16_t)a) - 9] << 8) | readBuf[((uint16_t)a + 1) - 9]); return ((readBuf[((uint16_t)a) - 9] << 8) | readBuf[((uint16_t)a + 1) - 9]);
} }
@ -361,23 +349,16 @@ double PS3USB::getAngle(Angle a) {
// Convert to 360 degrees resolution // Convert to 360 degrees resolution
// atan2 outputs the value of -π to π (radians) // atan2 outputs the value of -π to π (radians)
// We are then converting it to 0 to 2π and then to degrees // We are then converting it to 0 to 2π and then to degrees
if (a == Pitch) { if (a == Pitch)
double angle = (atan2(accYval, accZval) + PI) * RAD_TO_DEG; return (atan2(accYval, accZval) + PI) * RAD_TO_DEG;
return angle; else
} else { return (atan2(accXval, accZval) + PI) * RAD_TO_DEG;
double angle = (atan2(accXval, accZval) + PI) * RAD_TO_DEG;
return angle;
}
} else } else
return 0; return 0;
} }
bool PS3USB::getStatus(Status c) { bool PS3USB::getStatus(Status c) {
if (readBuf == NULL) return (readBuf[((uint16_t)c >> 8) - 9] == ((uint8_t)c & 0xff));
return false;
if (readBuf[((uint16_t)c >> 8) - 9] == ((uint8_t)c & 0xff))
return true;
return false;
} }
String PS3USB::getStatusString() { String PS3USB::getStatusString() {
@ -416,8 +397,8 @@ String PS3USB::getStatusString() {
} }
/* Playstation Sixaxis Dualshock and Navigation Controller commands */ /* Playstation Sixaxis Dualshock and Navigation Controller commands */
void PS3USB::PS3_Command(uint8_t* data, uint16_t nbytes) { void PS3USB::PS3_Command(uint8_t *data, uint16_t nbytes) {
//bmRequest = Host to device (0x00) | Class (0x20) | Interface (0x01) = 0x21, bRequest = Set Report (0x09), Report ID (0x01), Report Type (Output 0x02), interface (0x00), datalength, datalength, data) // bmRequest = Host to device (0x00) | Class (0x20) | Interface (0x01) = 0x21, bRequest = Set Report (0x09), Report ID (0x01), Report Type (Output 0x02), interface (0x00), datalength, datalength, data)
pUsb->ctrlReq(bAddress, epInfo[PS3_CONTROL_PIPE].epAddr, bmREQ_HID_OUT, HID_REQUEST_SET_REPORT, 0x01, 0x02, 0x00, nbytes, nbytes, data, NULL); pUsb->ctrlReq(bAddress, epInfo[PS3_CONTROL_PIPE].epAddr, bmREQ_HID_OUT, HID_REQUEST_SET_REPORT, 0x01, 0x02, 0x00, nbytes, nbytes, data, NULL);
} }
@ -430,9 +411,9 @@ void PS3USB::setAllOff() {
void PS3USB::setRumbleOff() { void PS3USB::setRumbleOff() {
writeBuf[1] = 0x00; writeBuf[1] = 0x00;
writeBuf[2] = 0x00; //low mode off writeBuf[2] = 0x00; // Low mode off
writeBuf[3] = 0x00; writeBuf[3] = 0x00;
writeBuf[4] = 0x00; //high mode off writeBuf[4] = 0x00; // High mode off
PS3_Command(writeBuf, PS3_REPORT_BUFFER_SIZE); PS3_Command(writeBuf, PS3_REPORT_BUFFER_SIZE);
} }
@ -476,36 +457,47 @@ void PS3USB::setLedToggle(LED a) {
PS3_Command(writeBuf, PS3_REPORT_BUFFER_SIZE); PS3_Command(writeBuf, PS3_REPORT_BUFFER_SIZE);
} }
void PS3USB::setBdaddr(uint8_t* BDADDR) { void PS3USB::setBdaddr(uint8_t *bdaddr) {
/* Set the internal bluetooth address */ /* Set the internal Bluetooth address */
uint8_t buf[8]; uint8_t buf[8];
buf[0] = 0x01; buf[0] = 0x01;
buf[1] = 0x00; 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); 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]; uint8_t cmd_buf[4];
cmd_buf[0] = 0x42; // Special PS3 Controller enable commands cmd_buf[0] = 0x42; // Special PS3 Controller enable commands
cmd_buf[1] = 0x0c; cmd_buf[1] = 0x0c;
cmd_buf[2] = 0x00; cmd_buf[2] = 0x00;
cmd_buf[3] = 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); 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 */ /* Playstation Move Controller commands */
void PS3USB::Move_Command(uint8_t* data, uint16_t nbytes) { void PS3USB::Move_Command(uint8_t *data, uint16_t nbytes) {
pUsb->outTransfer(bAddress, epInfo[ PS3_OUTPUT_PIPE ].epAddr, nbytes, data); pUsb->outTransfer(bAddress, epInfo[ PS3_OUTPUT_PIPE ].epAddr, nbytes, data);
} }
void PS3USB::moveSetBulb(uint8_t r, uint8_t g, uint8_t b) { //Use this to set the Color using RGB values void PS3USB::moveSetBulb(uint8_t r, uint8_t g, uint8_t b) { // Use this to set the Color using RGB values
// set the Bulb's values into the write buffer // Set the Bulb's values into the write buffer
writeBuf[2] = r; writeBuf[2] = r;
writeBuf[3] = g; writeBuf[3] = g;
writeBuf[4] = b; writeBuf[4] = b;
@ -513,7 +505,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); Move_Command(writeBuf, MOVE_REPORT_BUFFER_SIZE);
} }
void PS3USB::moveSetBulb(Colors color) { //Use this to set the Color using the predefined colors in "enums.h" void PS3USB::moveSetBulb(Colors color) { // Use this to set the Color using the predefined colors in "enums.h"
moveSetBulb((uint8_t)(color >> 16), (uint8_t)(color >> 8), (uint8_t)(color)); moveSetBulb((uint8_t)(color >> 16), (uint8_t)(color >> 8), (uint8_t)(color));
} }
@ -522,14 +514,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) 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); Notify(PSTR("\r\nThe rumble value has to at least 64, or approximately 25%"), 0x80);
#endif #endif
//set the rumble value into the write buffer writeBuf[6] = rumble; // Set the rumble value into the write buffer
writeBuf[6] = rumble;
Move_Command(writeBuf, MOVE_REPORT_BUFFER_SIZE); Move_Command(writeBuf, MOVE_REPORT_BUFFER_SIZE);
} }
void PS3USB::setMoveBdaddr(uint8_t* BDADDR) { void PS3USB::setMoveBdaddr(uint8_t *bdaddr) {
/* Set the internal bluetooth address */ /* Set the internal Bluetooth address */
uint8_t buf[11]; uint8_t buf[11];
buf[0] = 0x05; buf[0] = 0x05;
buf[7] = 0x10; buf[7] = 0x10;
@ -538,12 +529,34 @@ void PS3USB::setMoveBdaddr(uint8_t* BDADDR) {
buf[10] = 0x12; buf[10] = 0x12;
for (uint8_t i = 0; i < 6; i++) 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); 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() { void PS3USB::onInit() {
if (pFuncOnInit) if (pFuncOnInit)
pFuncOnInit(); // Call the user function pFuncOnInit(); // Call the user function

View file

@ -22,27 +22,30 @@
#include "PS3Enums.h" #include "PS3Enums.h"
/* PS3 data taken from descriptors */ /* PS3 data taken from descriptors */
#define EP_MAXPKTSIZE 64 // max size for data via USB #define EP_MAXPKTSIZE 64 // max size for data via USB
/* Endpoint types */ /* Endpoint types */
#define EP_INTERRUPT 0x03 #define EP_INTERRUPT 0x03
/* Names we give to the 3 ps3 pipes - this is only used for setting the bluetooth address into the ps3 controllers */ /* Names we give to the 3 ps3 pipes - this is only used for setting the bluetooth address into the ps3 controllers */
#define PS3_CONTROL_PIPE 0 #define PS3_CONTROL_PIPE 0
#define PS3_OUTPUT_PIPE 1 #define PS3_OUTPUT_PIPE 1
#define PS3_INPUT_PIPE 2 #define PS3_INPUT_PIPE 2
//PID and VID of the different devices //PID and VID of the different devices
#define PS3_VID 0x054C // Sony Corporation #define PS3_VID 0x054C // Sony Corporation
#define PS3_PID 0x0268 // PS3 Controller DualShock 3 #define PS3_PID 0x0268 // PS3 Controller DualShock 3
#define PS3NAVIGATION_PID 0x042F // Navigation controller #define PS3NAVIGATION_PID 0x042F // Navigation controller
#define PS3MOVE_PID 0x03D5 // Motion 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_OUT USB_SETUP_HOST_TO_DEVICE|USB_SETUP_TYPE_CLASS|USB_SETUP_RECIPIENT_INTERFACE
#define HID_REQUEST_SET_REPORT 0x09 #define bmREQ_HID_IN USB_SETUP_DEVICE_TO_HOST|USB_SETUP_TYPE_CLASS|USB_SETUP_RECIPIENT_INTERFACE
#define PS3_MAX_ENDPOINTS 3 #define HID_REQUEST_GET_REPORT 0x01
#define HID_REQUEST_SET_REPORT 0x09
#define PS3_MAX_ENDPOINTS 3
/** /**
* This class implements support for all the official PS3 Controllers: * This class implements support for all the official PS3 Controllers:
@ -112,14 +115,34 @@ public:
/** /**
* Used to set the Bluetooth address inside the Dualshock 3 and Navigation controller. * 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. * 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 */ /** @name PS3 Controller functions */
/** /**
@ -197,6 +220,10 @@ public:
* @param value See: ::LED enum. * @param value See: ::LED enum.
*/ */
void setLedRaw(uint8_t value); void setLedRaw(uint8_t value);
/** Turn all LEDs off. */
void setLedOff() {
setLedRaw(0);
}
/** /**
* Turn the specific ::LED off. * Turn the specific ::LED off.
* @param a The ::LED to turn off. * @param a The ::LED to turn off.
@ -278,8 +305,8 @@ private:
void printReport(); // print incoming date - Uncomment for debugging void printReport(); // print incoming date - Uncomment for debugging
/* Private commands */ /* 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 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 #endif

View file

@ -98,7 +98,7 @@ More information can be found at these blog posts:
* <http://www.circuitsathome.com/mcu/bluetooth-rfcommspp-service-support-for-usb-host-2-0-library-released> * <http://www.circuitsathome.com/mcu/bluetooth-rfcommspp-service-support-for-usb-host-2-0-library-released>
* <http://blog.tkjelectronics.dk/2012/07/rfcommspp-library-for-arduino/> * <http://blog.tkjelectronics.dk/2012/07/rfcommspp-library-for-arduino/>
To implement the SPP protocol I used a Bluetooth sniffing tool called [PacketLogger](http://www.tkjelectronics.com/uploads/PacketLogger.zip) developed by Apple. To implement the SPP protocol I used a Bluetooth sniffing tool called [PacketLogger](http://www.tkjelectronics.com/uploads/PacketLogger.zip) developed by Apple.
It enables me to see the Bluetooth communication between my Mac and any device. It enables me to see the Bluetooth communication between my Mac and any device.
### PS3 Library ### PS3 Library
@ -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. 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>. 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); 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>. 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>.

54
SPP.cpp
View file

@ -16,7 +16,7 @@
*/ */
#include "SPP.h" #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 EXTRADEBUG // Uncomment to get even more debugging data
//#define PRINTREPORT // Uncomment to print the report sent to the Arduino //#define PRINTREPORT // Uncomment to print the report sent to the Arduino
@ -270,19 +270,31 @@ void SPP::ACLData(uint8_t* l2capinbuf) {
/* Read the incoming message */ /* Read the incoming message */
if (rfcommChannelType == RFCOMM_UIH && rfcommChannel == rfcommChannelConnection) { if (rfcommChannelType == RFCOMM_UIH && rfcommChannel == rfcommChannelConnection) {
uint8_t length = l2capinbuf[10] >> 1; // Get length uint8_t length = l2capinbuf[10] >> 1; // Get length
uint8_t offset = l2capinbuf[4] - length - 4; // See if there is credit uint8_t offset = l2capinbuf[4] - length - 4; // Check if there is credit
if (rfcommAvailable + length <= sizeof (rfcommDataBuffer)) { // Don't add data to buffer if it would be full if (checkFcs(&l2capinbuf[8], l2capinbuf[11 + length + offset])) {
for (uint8_t i = 0; i < length; i++) 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]; rfcommDataBuffer[rfcommAvailable + i] = l2capinbuf[11 + i + offset];
rfcommAvailable += length; }
} rfcommAvailable += i;
#ifdef EXTRADEBUG #ifdef EXTRADEBUG
Notify(PSTR("\r\nRFCOMM Data Available: "), 0x80); Notify(PSTR("\r\nRFCOMM Data Available: "), 0x80);
Notify(rfcommAvailable, 0x80); Notify(rfcommAvailable, 0x80);
if (offset) { if (offset) {
Notify(PSTR(" - Credit: 0x"), 0x80); Notify(PSTR(" - Credit: 0x"), 0x80);
D_PrintHex<uint8_t > (l2capinbuf[11], 0x80); D_PrintHex<uint8_t > (l2capinbuf[11], 0x80);
}
#endif
} }
#ifdef DEBUG_USB_HOST
else
Notify(PSTR("\r\nError in FCS checksum!"), 0x80);
#endif #endif
#ifdef PRINTREPORT // Uncomment "#define PRINTREPORT" to print the report send to the Arduino via Bluetooth #ifdef PRINTREPORT // Uncomment "#define PRINTREPORT" to print the report send to the Arduino via Bluetooth
for (uint8_t i = 0; i < length; i++) 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 */ /* CRC on 2 bytes */
uint8_t SPP::__crc(uint8_t* data) { 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]])); 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) { uint8_t SPP::calcFcs(uint8_t *data) {
if ((data[1] & 0xEF) == RFCOMM_UIH) if ((data[1] & 0xEF) == RFCOMM_UIH)
return (0xff - __crc(data)); // FCS on 2 bytes return (0xFF - crc(data)); // FCS on 2 bytes
else 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 */ /* Serial commands */
@ -740,7 +760,7 @@ size_t SPP::write(uint8_t data) {
return write(&data,1); 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++) { for(uint8_t i = 0; i < size; i++) {
if(sppIndex >= sizeof(sppOutputBuffer)/sizeof(sppOutputBuffer[0])) if(sppIndex >= sizeof(sppOutputBuffer)/sizeof(sppOutputBuffer[0]))
send(); // Send the current data in the buffer send(); // Send the current data in the buffer

9
SPP.h
View file

@ -215,7 +215,7 @@ private:
void RFCOMM_task(); // RFCOMM state machine void RFCOMM_task(); // RFCOMM state machine
/* SDP Commands */ /* 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 serviceNotSupported(uint8_t transactionIDHigh, uint8_t transactionIDLow);
void serialPortResponse1(uint8_t transactionIDHigh, uint8_t transactionIDLow); void serialPortResponse1(uint8_t transactionIDHigh, uint8_t transactionIDLow);
void serialPortResponse2(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); void l2capResponse2(uint8_t transactionIDHigh, uint8_t transactionIDLow);
/* RFCOMM Commands */ /* RFCOMM Commands */
void RFCOMM_Command(uint8_t* data, uint8_t nbytes); 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 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); 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 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 #endif

View file

@ -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) { 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); //printf("AttemptConfig: parent = %i, port = %i\r\n", parent, port);
uint8_t retries = 0;
again: again:
uint8_t rcode = devConfig[driver]->ConfigureDevice(parent, port, lowspeed); uint8_t rcode = devConfig[driver]->ConfigureDevice(parent, port, lowspeed);
@ -579,15 +580,17 @@ again:
// reset parent port // reset parent port
devConfig[parent]->ResetHubPort(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); delay(100);
retries++;
goto again; goto again;
} else if (rcode) } else if (rcode)
return rcode; return rcode;
rcode = devConfig[driver]->Init(parent, port, lowspeed); 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); delay(100);
retries++;
goto again; goto again;
} }
if (rcode) { if (rcode) {

View file

@ -18,7 +18,7 @@
*/ */
#include "Wii.h" #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 EXTRADEBUG // Uncomment to get even more debugging data
//#define PRINTREPORT // Uncomment to print the report send by the Wii controllers //#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); pitchGyroSpeed = (double)gyroPitchRaw / ((double)gyroPitchZero / pitchGyroScale);
/* The onboard gyro has two ranges for slow and fast mode */ /* 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; 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; 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; rollGyroSpeed *= 4.545;
compPitch = (0.93 * (compPitch + (pitchGyroSpeed * (double)(micros() - timer) / 1000000)))+(0.07 * getWiimotePitch()); // Use a complimentary filter to calculate the angle compPitch = (0.93 * (compPitch + (pitchGyroSpeed * (double)(micros() - timer) / 1000000)))+(0.07 * getWiimotePitch()); // Use a complimentary filter to calculate the angle

6
Wii.h
View file

@ -191,6 +191,10 @@ public:
* @param value See: ::LED enum. * @param value See: ::LED enum.
*/ */
void setLedRaw(uint8_t value); void setLedRaw(uint8_t value);
/** Turn all LEDs off. */
void setLedOff() {
setLedRaw(0);
}
/** /**
* Turn the specific ::LED off. * Turn the specific ::LED off.
* @param a The ::LED to turn 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. * This will set the LEDs, so the user can see which connections are active.
* *
* The first ::LED indicate that the Wiimote is connected, * The first ::LED indicate that the Wiimote is connected,
*
* the second ::LED indicate indicate that a Motion Plus is also 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. * the third ::LED will indicate that a Nunchuck controller is also connected.
*/ */
void setLedStatus(); void setLedStatus();

View file

@ -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. 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, disable serial debugging.
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.
To enable the IR camera code, uncomment \#define WIICAMERA in Wii.h. To enable the IR camera code, uncomment \#define WIICAMERA in Wii.h.

View file

@ -16,7 +16,7 @@
*/ */
#include "XBOXOLD.h" #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 EXTRADEBUG // Uncomment to get even more debugging data
//#define PRINTREPORT // Uncomment to print the report send by the Xbox controller //#define PRINTREPORT // Uncomment to print the report send by the Xbox controller
@ -291,15 +291,15 @@ void XBOXOLD::printReport(uint16_t length) { //Uncomment "#define PRINTREPORT" t
} }
uint8_t XBOXOLD::getButtonPress(Button b) { 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 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 buttonValues[button]; // Analog buttons
return (ButtonState & pgm_read_byte(&XBOXOLDBUTTONS[(uint8_t)b])); // Digital buttons return (ButtonState & button); // Digital buttons
} }
bool XBOXOLD::getButtonClick(Button b) { 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 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]) { if (buttonClicked[button]) {
buttonClicked[button] = false; buttonClicked[button] = false;
return true; return true;
@ -307,7 +307,6 @@ bool XBOXOLD::getButtonClick(Button b) {
return false; return false;
} }
button = pgm_read_byte(&XBOXOLDBUTTONS[(uint8_t)b]); // Digital buttons
bool click = (ButtonClickState & button); bool click = (ButtonClickState & button);
ButtonClickState &= ~button; // clear "click" event ButtonClickState &= ~button; // clear "click" event
return click; return click;

View file

@ -18,7 +18,7 @@
*/ */
#include "XBOXRECV.h" #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 EXTRADEBUG // Uncomment to get even more debugging data
//#define PRINTREPORT // Uncomment to print the report send by the Xbox 360 Controller //#define PRINTREPORT // Uncomment to print the report send by the Xbox 360 Controller
@ -37,30 +37,28 @@ bPollEnable(false) { // don't start polling before dongle is connected
pUsb->RegisterDeviceClass(this); //set devConfig[] entry pUsb->RegisterDeviceClass(this); //set devConfig[] entry
} }
uint8_t XBOXRECV::Init(uint8_t parent, uint8_t port, bool lowspeed) { uint8_t XBOXRECV::ConfigureDevice(uint8_t parent, uint8_t port, bool lowspeed) {
uint8_t buf[sizeof (USB_DEVICE_DESCRIPTOR)]; const uint8_t constBufSize = sizeof (USB_DEVICE_DESCRIPTOR);
uint8_t buf[constBufSize];
USB_DEVICE_DESCRIPTOR * udd = reinterpret_cast<USB_DEVICE_DESCRIPTOR*>(buf); USB_DEVICE_DESCRIPTOR * udd = reinterpret_cast<USB_DEVICE_DESCRIPTOR*>(buf);
uint8_t rcode; uint8_t rcode;
UsbDevice *p = NULL; UsbDevice *p = NULL;
EpInfo *oldep_ptr = NULL; EpInfo *oldep_ptr = NULL;
uint16_t PID; uint16_t PID, VID;
uint16_t VID;
// get memory address of USB device address pool AddressPool &addrPool = pUsb->GetAddressPool(); // Get memory address of USB device address pool
AddressPool &addrPool = pUsb->GetAddressPool();
#ifdef EXTRADEBUG #ifdef EXTRADEBUG
Notify(PSTR("\r\nXBOXRECV Init"), 0x80); Notify(PSTR("\r\nXBOXRECV Init"), 0x80);
#endif #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 #ifdef DEBUG_USB_HOST
Notify(PSTR("\r\nAddress in use"), 0x80); Notify(PSTR("\r\nAddress in use"), 0x80);
#endif #endif
return USB_ERROR_CLASS_INSTANCE_ALREADY_IN_USE; return USB_ERROR_CLASS_INSTANCE_ALREADY_IN_USE;
} }
// Get pointer to pseudo device with address 0 assigned p = addrPool.GetUsbDevicePtr(0); // Get pointer to pseudo device with address 0 assigned
p = addrPool.GetUsbDevicePtr(0);
if (!p) { if (!p) {
#ifdef DEBUG_USB_HOST #ifdef DEBUG_USB_HOST
@ -76,18 +74,13 @@ uint8_t XBOXRECV::Init(uint8_t parent, uint8_t port, bool lowspeed) {
return USB_ERROR_EPINFO_IS_NULL; return USB_ERROR_EPINFO_IS_NULL;
} }
// Save old pointer to EP_RECORD of address 0 oldep_ptr = p->epinfo; // Save old pointer to EP_RECORD of address 0
oldep_ptr = p->epinfo; p->epinfo = epInfo; // Temporary assign new pointer to epInfo to p->epinfo in order to avoid toggle inconsistence
// Temporary assign new pointer to epInfo to p->epinfo in order to avoid toggle inconsistence
p->epinfo = epInfo;
p->lowspeed = lowspeed; p->lowspeed = lowspeed;
// Get device descriptor rcode = pUsb->getDevDescr(0, 0, constBufSize, (uint8_t*)buf); // Get device descriptor - addr, ep, nbytes, data
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; // Restore p->epinfo
p->epinfo = oldep_ptr;
if (rcode) if (rcode)
goto FailGetDevDescr; goto FailGetDevDescr;
@ -95,53 +88,101 @@ uint8_t XBOXRECV::Init(uint8_t parent, uint8_t port, bool lowspeed) {
VID = udd->idVendor; VID = udd->idVendor;
PID = udd->idProduct; PID = udd->idProduct;
if (VID != XBOX_VID && VID != MADCATZ_VID) // We just check if it's a Xbox receiver using the Vendor ID 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
goto FailUnknownDevice;
else if (PID != XBOX_WIRELESS_RECEIVER_PID && PID != XBOX_WIRELESS_RECEIVER_THIRD_PARTY_PID) { // Check the PID as well
#ifdef DEBUG_USB_HOST #ifdef DEBUG_USB_HOST
Notify(PSTR("\r\nYou'll need a wireless receiver for this libary to work"), 0x80); Notify(PSTR("\r\nYou'll need a wireless receiver for this libary to work"), 0x80);
#endif #endif
goto FailUnknownDevice; goto FailUnknownDevice;
} }
// Allocate new address according to device class bAddress = addrPool.AllocAddress(parent, false, port); // Allocate new address according to device class
bAddress = addrPool.AllocAddress(parent, false, port);
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; return USB_ERROR_OUT_OF_ADDRESS_SPACE_IN_POOL;
}
// Extract Max Packet Size from device descriptor // Extract Max Packet Size from device descriptor
epInfo[0].maxPktSize = udd->bMaxPacketSize0; epInfo[0].maxPktSize = udd->bMaxPacketSize0;
epInfo[1].epAddr = udd->bNumConfigurations; // Steal and abuse from epInfo structure to save memory
// Assign new address to the device delay(20); // Wait a little before resetting device
rcode = pUsb->setAddr(0, 0, bAddress);
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) { if (rcode) {
p->lowspeed = false;
addrPool.FreeAddress(bAddress);
bAddress = 0;
#ifdef DEBUG_USB_HOST #ifdef DEBUG_USB_HOST
Notify(PSTR("\r\nsetAddr: "), 0x80); Notify(PSTR("\r\nsetAddr: "), 0x80);
D_PrintHex<uint8_t > (rcode, 0x80); D_PrintHex<uint8_t > (rcode, 0x80);
#endif #endif
return rcode; p->lowspeed = false;
goto Fail;
} }
#ifdef EXTRADEBUG #ifdef EXTRADEBUG
Notify(PSTR("\r\nAddr: "), 0x80); Notify(PSTR("\r\nAddr: "), 0x80);
D_PrintHex<uint8_t > (bAddress, 0x80); D_PrintHex<uint8_t > (bAddress, 0x80);
#endif #endif
delay(300); // Spec says you should wait at least 200ms
p->lowspeed = false; p->lowspeed = false;
//get pointer to assigned address record p = addrPool.GetUsbDevicePtr(bAddress); // Get pointer to assigned address record
p = addrPool.GetUsbDevicePtr(bAddress); if (!p) {
if (!p) #ifdef DEBUG_USB_HOST
Notify(PSTR("\r\nAddress not found"), 0x80);
#endif
return USB_ERROR_ADDRESS_NOT_FOUND_IN_POOL; return USB_ERROR_ADDRESS_NOT_FOUND_IN_POOL;
}
p->lowspeed = lowspeed; p->lowspeed = lowspeed;
// Assign epInfo to epinfo pointer - only EP0 is known rcode = pUsb->setEpInfoEntry(bAddress, 1, epInfo); // Assign epInfo to epinfo pointer - only EP0 is known
rcode = pUsb->setEpInfoEntry(bAddress, 1, epInfo);
if (rcode) if (rcode)
goto FailSetDevTblEntry; goto FailSetDevTblEntry;
@ -217,9 +258,10 @@ uint8_t XBOXRECV::Init(uint8_t parent, uint8_t port, bool lowspeed) {
#endif #endif
XboxReceiverConnected = true; XboxReceiverConnected = true;
bPollEnable = true; bPollEnable = true;
return 0; // successful configuration checkStatusTimer = 0; // Reset timer
return 0; // Successful configuration
/* diagnostic messages */ /* Diagnostic messages */
FailGetDevDescr: FailGetDevDescr:
#ifdef DEBUG_USB_HOST #ifdef DEBUG_USB_HOST
NotifyFailGetDevDescr(); NotifyFailGetDevDescr();
@ -243,8 +285,8 @@ FailUnknownDevice:
#endif #endif
rcode = USB_DEV_CONFIG_ERROR_DEVICE_NOT_SUPPORTED; rcode = USB_DEV_CONFIG_ERROR_DEVICE_NOT_SUPPORTED;
#ifdef DEBUG_USB_HOST
Fail: Fail:
#ifdef DEBUG_USB_HOST
Notify(PSTR("\r\nXbox 360 Init Failed, error code: "), 0x80); Notify(PSTR("\r\nXbox 360 Init Failed, error code: "), 0x80);
NotifyFail(rcode); NotifyFail(rcode);
#endif #endif
@ -266,23 +308,23 @@ uint8_t XBOXRECV::Release() {
uint8_t XBOXRECV::Poll() { uint8_t XBOXRECV::Poll() {
if (!bPollEnable) if (!bPollEnable)
return 0; return 0;
if (!timer || ((millis() - timer) > 3000)) { // Run checkStatus every 3 seconds if (!checkStatusTimer || ((millis() - checkStatusTimer) > 3000)) { // Run checkStatus every 3 seconds
timer = millis(); checkStatusTimer = millis();
checkStatus(); checkStatus();
} }
uint8_t inputPipe; uint8_t inputPipe;
uint16_t bufferSize; uint16_t bufferSize;
for (uint8_t i = 0; i < 4; i++) { for (uint8_t i = 0; i < 4; i++) {
switch (i) { if (i == 0)
case 0: inputPipe = XBOX_INPUT_PIPE_1; inputPipe = XBOX_INPUT_PIPE_1;
break; else if (i == 1)
case 1: inputPipe = XBOX_INPUT_PIPE_2; inputPipe = XBOX_INPUT_PIPE_2;
break; else if (i == 2)
case 2: inputPipe = XBOX_INPUT_PIPE_3; inputPipe = XBOX_INPUT_PIPE_3;
break; else
case 3: inputPipe = XBOX_INPUT_PIPE_4; inputPipe = XBOX_INPUT_PIPE_4;
break;
}
bufferSize = EP_MAXPKTSIZE; // This is the maximum number of bytes we want to receive bufferSize = EP_MAXPKTSIZE; // This is the maximum number of bytes we want to receive
pUsb->inTransfer(bAddress, epInfo[ inputPipe ].epAddr, &bufferSize, readBuf); pUsb->inTransfer(bAddress, epInfo[ inputPipe ].epAddr, &bufferSize, readBuf);
if (bufferSize > 0) { // The number of received bytes if (bufferSize > 0) { // The number of received bytes
@ -420,22 +462,22 @@ bool XBOXRECV::buttonChanged(uint8_t controller) {
/* /*
ControllerStatus Breakdown ControllerStatus Breakdown
ControllerStatus[controller] & 0x0001 // 0 ControllerStatus[controller] & 0x0001 // 0
ControllerStatus[controller] & 0x0002 // normal batteries, no rechargeable battery pack ControllerStatus[controller] & 0x0002 // normal batteries, no rechargeable battery pack
ControllerStatus[controller] & 0x0004 // controller starting up / settling ControllerStatus[controller] & 0x0004 // controller starting up / settling
ControllerStatus[controller] & 0x0008 // headset adapter plugged in, but no headphones connected (mute?) ControllerStatus[controller] & 0x0008 // headset adapter plugged in, but no headphones connected (mute?)
ControllerStatus[controller] & 0x0010 // 0 ControllerStatus[controller] & 0x0010 // 0
ControllerStatus[controller] & 0x0020 // 1 ControllerStatus[controller] & 0x0020 // 1
ControllerStatus[controller] & 0x0040 // battery level (high bit) ControllerStatus[controller] & 0x0040 // battery level (high bit)
ControllerStatus[controller] & 0x0080 // battery level (low bit) ControllerStatus[controller] & 0x0080 // battery level (low bit)
ControllerStatus[controller] & 0x0100 // 1 ControllerStatus[controller] & 0x0100 // 1
ControllerStatus[controller] & 0x0200 // 1 ControllerStatus[controller] & 0x0200 // 1
ControllerStatus[controller] & 0x0400 // headset adapter plugged in ControllerStatus[controller] & 0x0400 // headset adapter plugged in
ControllerStatus[controller] & 0x0800 // 0 ControllerStatus[controller] & 0x0800 // 0
ControllerStatus[controller] & 0x1000 // 1 ControllerStatus[controller] & 0x1000 // 1
ControllerStatus[controller] & 0x2000 // 0 ControllerStatus[controller] & 0x2000 // 0
ControllerStatus[controller] & 0x4000 // 0 ControllerStatus[controller] & 0x4000 // 0
ControllerStatus[controller] & 0x8000 // 0 ControllerStatus[controller] & 0x8000 // 0
*/ */
uint8_t XBOXRECV::getBatteryLevel(uint8_t controller) { uint8_t XBOXRECV::getBatteryLevel(uint8_t controller) {
return ((controllerStatus[controller] & 0x00C0) >> 6); return ((controllerStatus[controller] & 0x00C0) >> 6);
@ -468,6 +510,15 @@ void XBOXRECV::XboxCommand(uint8_t controller, uint8_t* data, uint16_t nbytes) {
#endif #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) { void XBOXRECV::setLedRaw(uint8_t value, uint8_t controller) {
writeBuf[0] = 0x00; writeBuf[0] = 0x00;
writeBuf[1] = 0x00; writeBuf[1] = 0x00;

View file

@ -64,6 +64,14 @@ public:
XBOXRECV(USB *pUsb); XBOXRECV(USB *pUsb);
/** @name USBDeviceConfig implementation */ /** @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. * Initialize the Xbox wireless receiver.
* @param parent Hub number. * @param parent Hub number.
@ -136,6 +144,12 @@ public:
*/ */
int16_t getAnalogHat(AnalogHat a, uint8_t controller = 0); 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. * Turn rumble off and all the LEDs on the specific controller.
* @param controller The controller to write to. Default to 0. * @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 L2Clicked[4]; // These buttons are analog, so we use we use these bools to check if they where clicked or not
bool R2Clicked[4]; 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 readBuf[EP_MAXPKTSIZE]; // General purpose buffer for input data
uint8_t writeBuf[7]; // General purpose buffer for output data uint8_t writeBuf[7]; // General purpose buffer for output data

View file

@ -16,7 +16,7 @@
*/ */
#include "XBOXUSB.h" #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 EXTRADEBUG // Uncomment to get even more debugging data
//#define PRINTREPORT // Uncomment to print the report send by the Xbox 360 Controller //#define PRINTREPORT // Uncomment to print the report send by the Xbox 360 Controller
@ -283,7 +283,7 @@ uint8_t XBOXUSB::getButtonPress(Button b) {
return (uint8_t)(ButtonState >> 8); return (uint8_t)(ButtonState >> 8);
else if (b == R2) else if (b == R2)
return (uint8_t)ButtonState; 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) { bool XBOXUSB::getButtonClick(Button b) {

87
adk.cpp
View file

@ -13,7 +13,7 @@ Contact information
Circuits At Home, LTD Circuits At Home, LTD
Web : http://www.circuitsathome.com Web : http://www.circuitsathome.com
e-mail : support@circuitsathome.com e-mail : support@circuitsathome.com
*/ */
/* Google ADK interface */ /* Google ADK interface */
@ -30,7 +30,6 @@ ADK::ADK(USB *p, const char* manufacturer,
const char* serial) : const char* serial) :
/* ADK ID Strings */ /* ADK ID Strings */
manufacturer(manufacturer), manufacturer(manufacturer),
model(model), model(model),
description(description), description(description),
@ -46,12 +45,10 @@ ready(false) {
for (uint8_t i = 0; i < ADK_MAX_ENDPOINTS; i++) { for (uint8_t i = 0; i < ADK_MAX_ENDPOINTS; i++) {
epInfo[i].epAddr = 0; epInfo[i].epAddr = 0;
epInfo[i].maxPktSize = (i) ? 0 : 8; epInfo[i].maxPktSize = (i) ? 0 : 8;
epInfo[i].epAttribs = (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++... }//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 // register in USB subsystem
if (pUsb) { if (pUsb) {
pUsb->RegisterDeviceClass(this); //set devConfig[] entry 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 */ /* Connection initialization of an Android phone */
uint8_t ADK::Init(uint8_t parent, uint8_t port, bool lowspeed) { uint8_t ADK::Init(uint8_t parent, uint8_t port, bool lowspeed) {
uint8_t buf[sizeof (USB_DEVICE_DESCRIPTOR)]; uint8_t buf[sizeof (USB_DEVICE_DESCRIPTOR)];
USB_DEVICE_DESCRIPTOR * udd = reinterpret_cast<USB_DEVICE_DESCRIPTOR*>(buf); USB_DEVICE_DESCRIPTOR * udd = reinterpret_cast<USB_DEVICE_DESCRIPTOR*>(buf);
uint8_t rcode; uint8_t rcode;
@ -119,6 +115,7 @@ uint8_t ADK::Init(uint8_t parent, uint8_t port, bool lowspeed) {
// Extract Max Packet Size from device descriptor // Extract Max Packet Size from device descriptor
epInfo[0].maxPktSize = udd->bMaxPacketSize0; epInfo[0].maxPktSize = udd->bMaxPacketSize0;
// Assign new address to the device // Assign new address to the device
rcode = pUsb->setAddr(0, 0, bAddress); rcode = pUsb->setAddr(0, 0, bAddress);
if (rcode) { if (rcode) {
@ -157,10 +154,18 @@ uint8_t ADK::Init(uint8_t parent, uint8_t port, bool lowspeed) {
num_of_conf = udd->bNumConfigurations; num_of_conf = udd->bNumConfigurations;
//USBTRACE2("\r\nNC:",num_of_conf); //USBTRACE2("\r\nNC:",num_of_conf);
for (uint8_t i = 0; i < num_of_conf; i++) { for (uint8_t i = 0; i < num_of_conf; i++) {
ConfigDescParser < 0, 0, 0, 0 > confDescrParser(this); ConfigDescParser < 0, 0, 0, 0 > confDescrParser(this);
delay(1);
rcode = pUsb->getConfDescr(bAddress, 0, i, &confDescrParser); 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) { if (rcode) {
goto FailGetConfDescr; goto FailGetConfDescr;
} }
@ -177,27 +182,27 @@ uint8_t ADK::Init(uint8_t parent, uint8_t port, bool lowspeed) {
} }
} }
// Set Configuration Value // Set Configuration Value
rcode = pUsb->setConf(bAddress, 0, bConfNum); rcode = pUsb->setConf(bAddress, 0, bConfNum);
if (rcode) { if (rcode) {
goto FailSetConfDescr; goto FailSetConfDescr;
} }
/* print endpoint structure */ /* print endpoint structure */
// USBTRACE("\r\nEndpoint Structure:"); /*
// USBTRACE("\r\nEP0:"); USBTRACE("\r\nEndpoint Structure:");
// USBTRACE2("\r\nAddr: ", epInfo[0].epAddr ); USBTRACE("\r\nEP0:");
// USBTRACE2("\r\nMax.pkt.size: ", epInfo[0].maxPktSize ); USBTRACE2("\r\nAddr: ", epInfo[0].epAddr);
// USBTRACE2("\r\nAttr: ", epInfo[0].epAttribs ); USBTRACE2("\r\nMax.pkt.size: ", epInfo[0].maxPktSize);
// USBTRACE("\r\nEpout:"); USBTRACE2("\r\nAttr: ", epInfo[0].epAttribs);
// USBTRACE2("\r\nAddr: ", epInfo[epDataOutIndex].epAddr ); USBTRACE("\r\nEpout:");
// USBTRACE2("\r\nMax.pkt.size: ", epInfo[epDataOutIndex].maxPktSize ); USBTRACE2("\r\nAddr: ", epInfo[epDataOutIndex].epAddr);
// USBTRACE2("\r\nAttr: ", epInfo[epDataOutIndex].epAttribs ); USBTRACE2("\r\nMax.pkt.size: ", epInfo[epDataOutIndex].maxPktSize);
// USBTRACE("\r\nEpin:"); USBTRACE2("\r\nAttr: ", epInfo[epDataOutIndex].epAttribs);
// USBTRACE2("\r\nAddr: ", epInfo[epDataInIndex].epAddr ); USBTRACE("\r\nEpin:");
// USBTRACE2("\r\nMax.pkt.size: ", epInfo[epDataInIndex].maxPktSize ); USBTRACE2("\r\nAddr: ", epInfo[epDataInIndex].epAddr);
// USBTRACE2("\r\nAttr: ", epInfo[epDataInIndex].epAttribs ); USBTRACE2("\r\nMax.pkt.size: ", epInfo[epDataInIndex].maxPktSize);
USBTRACE2("\r\nAttr: ", epInfo[epDataInIndex].epAttribs);
*/
USBTRACE("\r\nConfiguration successful"); USBTRACE("\r\nConfiguration successful");
ready = true; ready = true;
@ -207,7 +212,16 @@ uint8_t ADK::Init(uint8_t parent, uint8_t port, bool lowspeed) {
//probe device - get accessory protocol revision //probe device - get accessory protocol revision
{ {
uint16_t adkproto = -1; uint16_t adkproto = -1;
delay(1);
rcode = getProto((uint8_t*) & adkproto); 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) { if (rcode) {
goto FailGetProto; //init fails goto FailGetProto; //init fails
} }
@ -269,7 +283,7 @@ FailSwAcc:
goto Fail; goto Fail;
#endif #endif
//FailOnInit: //FailOnInit:
// USBTRACE("OnInit:"); // USBTRACE("OnInit:");
// goto Fail; // goto Fail;
// //
@ -286,9 +300,9 @@ Fail:
/* Extracts bulk-IN and bulk-OUT endpoint information from config descriptor */ /* 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) { 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("Conf.Val"), conf);
//ErrorMessage<uint8_t>(PSTR("Iface Num"),iface); //ErrorMessage<uint8_t>(PSTR("Iface Num"), iface);
//ErrorMessage<uint8_t>(PSTR("Alt.Set"), alt); //ErrorMessage<uint8_t>(PSTR("Alt.Set"), alt);
//added by Yuuichi Akagawa //added by Yuuichi Akagawa
if (bNumEP == 3) { if (bNumEP == 3) {
@ -297,19 +311,16 @@ void ADK::EndpointXtract(uint8_t conf, uint8_t iface, uint8_t alt, uint8_t proto
bConfNum = conf; bConfNum = conf;
uint8_t index; 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;
// if ((pep->bmAttributes & 0x02) == 2) { bNumEP++;
index = ((pep->bEndpointAddress & 0x80) == 0x80) ? epDataInIndex : epDataOutIndex;
// }
// Fill in the endpoint info structure //PrintEndpointDescriptor(pep);
epInfo[index].epAddr = (pep->bEndpointAddress & 0x0F); }
epInfo[index].maxPktSize = (uint8_t)pep->wMaxPacketSize;
bNumEP++;
//PrintEndpointDescriptor(pep);
} }
/* Performs a cleanup after failed Init() attempt */ /* Performs a cleanup after failed Init() attempt */

6
adk.h
View file

@ -13,7 +13,7 @@ Contact information
Circuits At Home, LTD Circuits At Home, LTD
Web : http://www.circuitsathome.com Web : http://www.circuitsathome.com
e-mail : support@circuitsathome.com e-mail : support@circuitsathome.com
*/ */
/* Google ADK interface support header */ /* Google ADK interface support header */
@ -26,6 +26,10 @@ e-mail : support@circuitsathome.com
#define ADK_PID 0x2D00 #define ADK_PID 0x2D00
#define ADB_PID 0x2D01 #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 */ /* requests */
#define ADK_GETPROTO 51 //check USB accessory protocol version #define ADK_GETPROTO 51 //check USB accessory protocol version

View file

@ -1,6 +1,6 @@
/* /*
Example sketch for the PS3 Bluetooth library - developed by Kristian Lauszus Example sketch for the PS3 Bluetooth library - developed by Kristian Lauszus
For more information visit my blog: http://blog.tkjelectronics.dk/ or For more information visit my blog: http://blog.tkjelectronics.dk/ or
send me an e-mail: kristianl@tkjelectronics.com send me an e-mail: kristianl@tkjelectronics.com
*/ */
@ -8,7 +8,8 @@
#include <usbhub.h> #include <usbhub.h>
USB Usb; 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 BTD Btd(&Usb); // You have to create the Bluetooth Dongle instance like so
/* You can create the instance of the class in two ways */ /* You can create the instance of the class in two ways */
PS3BT PS3(&Btd); // This will just create the instance PS3BT PS3(&Btd); // This will just create the instance
@ -22,152 +23,152 @@ void setup() {
while (!Serial); // Wait for serial port to connect - used on Leonardo, Teensy and other boards with built-in USB CDC serial connection 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) { if (Usb.Init() == -1) {
Serial.print(F("\r\nOSC did not start")); Serial.print(F("\r\nOSC did not start"));
while(1); //halt while (1); //halt
} }
Serial.print(F("\r\nPS3 Bluetooth Library Started")); Serial.print(F("\r\nPS3 Bluetooth Library Started"));
} }
void loop() { void loop() {
Usb.Task(); Usb.Task();
if(PS3.PS3Connected || PS3.PS3NavigationConnected) { 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.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(F("\r\nLeftHatX: "));
Serial.print(PS3.getAnalogHat(LeftHatX)); Serial.print(PS3.getAnalogHat(LeftHatX));
Serial.print(F("\tLeftHatY: ")); Serial.print(F("\tLeftHatY: "));
Serial.print(PS3.getAnalogHat(LeftHatY)); Serial.print(PS3.getAnalogHat(LeftHatY));
if(!PS3.PS3NavigationConnected) { if (PS3.PS3Connected) { // The Navigation controller only have one joystick
Serial.print(F("\tRightHatX: ")); Serial.print(F("\tRightHatX: "));
Serial.print(PS3.getAnalogHat(RightHatX)); Serial.print(PS3.getAnalogHat(RightHatX));
Serial.print(F("\tRightHatY: ")); Serial.print(F("\tRightHatY: "));
Serial.print(PS3.getAnalogHat(RightHatY)); Serial.print(PS3.getAnalogHat(RightHatY));
} }
} }
//Analog button values can be read from almost all buttons // 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(F("\r\nL2: "));
Serial.print(PS3.getAnalogButton(L2)); Serial.print(PS3.getAnalogButton(L2));
if(!PS3.PS3NavigationConnected) { if (!PS3.PS3NavigationConnected) {
Serial.print(F("\tR2: ")); Serial.print(F("\tR2: "));
Serial.print(PS3.getAnalogButton(R2)); Serial.print(PS3.getAnalogButton(R2));
} }
} }
if(PS3.getButtonClick(PS)) { if (PS3.getButtonClick(PS)) {
Serial.print(F("\r\nPS")); Serial.print(F("\r\nPS"));
PS3.disconnect(); PS3.disconnect();
} }
else { else {
if(PS3.getButtonClick(TRIANGLE)) if (PS3.getButtonClick(TRIANGLE))
Serial.print(F("\r\nTraingle")); Serial.print(F("\r\nTraingle"));
if(PS3.getButtonClick(CIRCLE)) if (PS3.getButtonClick(CIRCLE))
Serial.print(F("\r\nCircle")); Serial.print(F("\r\nCircle"));
if(PS3.getButtonClick(CROSS)) if (PS3.getButtonClick(CROSS))
Serial.print(F("\r\nCross")); Serial.print(F("\r\nCross"));
if(PS3.getButtonClick(SQUARE)) if (PS3.getButtonClick(SQUARE))
Serial.print(F("\r\nSquare")); Serial.print(F("\r\nSquare"));
if(PS3.getButtonClick(UP)) { if (PS3.getButtonClick(UP)) {
Serial.print(F("\r\nUp")); Serial.print(F("\r\nUp"));
if(PS3.PS3Connected) { if (PS3.PS3Connected) {
PS3.setAllOff(); PS3.setLedOff();
PS3.setLedOn(LED4); PS3.setLedOn(LED4);
} }
} }
if(PS3.getButtonClick(RIGHT)) { if (PS3.getButtonClick(RIGHT)) {
Serial.print(F("\r\nRight")); Serial.print(F("\r\nRight"));
if(PS3.PS3Connected) { if (PS3.PS3Connected) {
PS3.setAllOff(); PS3.setLedOff();
PS3.setLedOn(LED1); PS3.setLedOn(LED1);
}
}
if(PS3.getButtonClick(DOWN)) {
Serial.print(F("\r\nDown"));
if(PS3.PS3Connected) {
PS3.setAllOff();
PS3.setLedOn(LED2);
} }
} }
if(PS3.getButtonClick(LEFT)) { if (PS3.getButtonClick(DOWN)) {
Serial.print(F("\r\nLeft")); Serial.print(F("\r\nDown"));
if(PS3.PS3Connected) { if (PS3.PS3Connected) {
PS3.setAllOff(); PS3.setLedOff();
PS3.setLedOn(LED3); PS3.setLedOn(LED2);
} }
} }
if (PS3.getButtonClick(LEFT)) {
Serial.print(F("\r\nLeft"));
if (PS3.PS3Connected) {
PS3.setLedOff();
PS3.setLedOn(LED3);
}
}
if(PS3.getButtonClick(L1)) if (PS3.getButtonClick(L1))
Serial.print(F("\r\nL1")); Serial.print(F("\r\nL1"));
if(PS3.getButtonClick(L3)) if (PS3.getButtonClick(L3))
Serial.print(F("\r\nL3")); Serial.print(F("\r\nL3"));
if(PS3.getButtonClick(R1)) if (PS3.getButtonClick(R1))
Serial.print(F("\r\nR1")); Serial.print(F("\r\nR1"));
if(PS3.getButtonClick(R3)) if (PS3.getButtonClick(R3))
Serial.print(F("\r\nR3")); Serial.print(F("\r\nR3"));
if(PS3.getButtonClick(SELECT)) { if (PS3.getButtonClick(SELECT)) {
Serial.print(F("\r\nSelect - ")); Serial.print(F("\r\nSelect - "));
Serial.print(PS3.getStatusString()); Serial.print(PS3.getStatusString());
} }
if(PS3.getButtonClick(START)) { if (PS3.getButtonClick(START)) {
Serial.print(F("\r\nStart")); Serial.print(F("\r\nStart"));
printAngle = !printAngle; printAngle = !printAngle;
} }
} }
if(printAngle) { if (printAngle) {
Serial.print(F("\r\nPitch: ")); Serial.print(F("\r\nPitch: "));
Serial.print(PS3.getAngle(Pitch)); Serial.print(PS3.getAngle(Pitch));
Serial.print(F("\tRoll: ")); Serial.print(F("\tRoll: "));
Serial.print(PS3.getAngle(Roll)); Serial.print(PS3.getAngle(Roll));
} }
} }
else if(PS3.PS3MoveConnected) { else if (PS3.PS3MoveConnected) {
if(PS3.getAnalogButton(T)) { if (PS3.getAnalogButton(T)) {
Serial.print(F("\r\nT: ")); Serial.print(F("\r\nT: "));
Serial.print(PS3.getAnalogButton(T)); Serial.print(PS3.getAnalogButton(T));
} }
if(PS3.getButtonClick(PS)) { if (PS3.getButtonClick(PS)) {
Serial.print(F("\r\nPS")); Serial.print(F("\r\nPS"));
PS3.disconnect(); PS3.disconnect();
} }
else { else {
if(PS3.getButtonClick(SELECT)) { if (PS3.getButtonClick(SELECT)) {
Serial.print(F("\r\nSelect")); Serial.print(F("\r\nSelect"));
printTemperature = !printTemperature; printTemperature = !printTemperature;
} }
if(PS3.getButtonClick(START)) { if (PS3.getButtonClick(START)) {
Serial.print(F("\r\nStart")); Serial.print(F("\r\nStart"));
printAngle = !printAngle; printAngle = !printAngle;
} }
if(PS3.getButtonClick(TRIANGLE)) { if (PS3.getButtonClick(TRIANGLE)) {
Serial.print(F("\r\nTriangle")); Serial.print(F("\r\nTriangle"));
PS3.moveSetBulb(Red); PS3.moveSetBulb(Red);
} }
if(PS3.getButtonClick(CIRCLE)) { if (PS3.getButtonClick(CIRCLE)) {
Serial.print(F("\r\nCircle")); Serial.print(F("\r\nCircle"));
PS3.moveSetBulb(Green); PS3.moveSetBulb(Green);
} }
if(PS3.getButtonClick(SQUARE)) { if (PS3.getButtonClick(SQUARE)) {
Serial.print(F("\r\nSquare")); Serial.print(F("\r\nSquare"));
PS3.moveSetBulb(Blue); PS3.moveSetBulb(Blue);
} }
if(PS3.getButtonClick(CROSS)) { if (PS3.getButtonClick(CROSS)) {
Serial.print(F("\r\nCross")); Serial.print(F("\r\nCross"));
PS3.moveSetBulb(Yellow); PS3.moveSetBulb(Yellow);
} }
if(PS3.getButtonClick(MOVE)) { if (PS3.getButtonClick(MOVE)) {
PS3.moveSetBulb(Off); PS3.moveSetBulb(Off);
Serial.print(F("\r\nMove")); Serial.print(F("\r\nMove"));
Serial.print(F(" - ")); Serial.print(F(" - "));
Serial.print(PS3.getStatusString()); Serial.print(PS3.getStatusString());
} }
} }
if(printAngle) { if (printAngle) {
Serial.print(F("\r\nPitch: ")); Serial.print(F("\r\nPitch: "));
Serial.print(PS3.getAngle(Pitch)); Serial.print(PS3.getAngle(Pitch));
Serial.print(F("\tRoll: ")); Serial.print(F("\tRoll: "));
Serial.print(PS3.getAngle(Roll)); Serial.print(PS3.getAngle(Roll));
} }
else if(printTemperature) { else if (printTemperature) {
Serial.print(F("\r\nTemperature: ")); Serial.print(F("\r\nTemperature: "));
Serial.print(PS3.getTemperature()); Serial.print(PS3.getTemperature());
} }

View file

@ -1,7 +1,7 @@
/* /*
Example sketch for the PS3 Bluetooth library - developed by Kristian Lauszus Example sketch for the PS3 Bluetooth library - developed by Kristian Lauszus
This example show how one can use multiple controllers with the library This example show how one can use multiple controllers with the library
For more information visit my blog: http://blog.tkjelectronics.dk/ or For more information visit my blog: http://blog.tkjelectronics.dk/ or
send me an e-mail: kristianl@tkjelectronics.com send me an e-mail: kristianl@tkjelectronics.com
*/ */
@ -9,15 +9,16 @@
#include <usbhub.h> #include <usbhub.h>
USB Usb; 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 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! 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 printAngle[length];
boolean oldControllerState[length]; boolean oldControllerState[length];
void setup() { 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] = 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 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 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) { if (Usb.Init() == -1) {
Serial.print(F("\r\nOSC did not start")); Serial.print(F("\r\nOSC did not start"));
while(1); //halt while (1); //halt
} }
Serial.print(F("\r\nPS3 Bluetooth Library Started")); Serial.print(F("\r\nPS3 Bluetooth Library Started"));
} }
void loop() { void loop() {
Usb.Task(); Usb.Task();
for(uint8_t i=0;i<length;i++) { for (uint8_t i = 0; i < length; i++) {
if(PS3[i]->PS3Connected || PS3[i]->PS3NavigationConnected) { 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) { 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(F("\r\nLeftHatX: "));
Serial.print(PS3[i]->getAnalogHat(LeftHatX)); Serial.print(PS3[i]->getAnalogHat(LeftHatX));
Serial.print(F("\tLeftHatY: ")); Serial.print(F("\tLeftHatY: "));
Serial.print(PS3[i]->getAnalogHat(LeftHatY)); 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(F("\tRightHatX: "));
Serial.print(PS3[i]->getAnalogHat(RightHatX)); Serial.print(PS3[i]->getAnalogHat(RightHatX));
Serial.print(F("\tRightHatY: ")); Serial.print(F("\tRightHatY: "));
@ -48,77 +49,77 @@ void loop() {
} }
} }
//Analog button values can be read from almost all buttons //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(F("\r\nL2: "));
Serial.print(PS3[i]->getAnalogButton(L2)); Serial.print(PS3[i]->getAnalogButton(L2));
if(!PS3[i]->PS3NavigationConnected) { if (!PS3[i]->PS3NavigationConnected) {
Serial.print(F("\tR2: ")); Serial.print(F("\tR2: "));
Serial.print(PS3[i]->getAnalogButton(R2)); Serial.print(PS3[i]->getAnalogButton(R2));
} }
} }
if(PS3[i]->getButtonClick(PS)) { if (PS3[i]->getButtonClick(PS)) {
Serial.print(F("\r\nPS")); Serial.print(F("\r\nPS"));
PS3[i]->disconnect(); PS3[i]->disconnect();
oldControllerState[i] = false; // Reset value oldControllerState[i] = false; // Reset value
} }
else { else {
if(PS3[i]->getButtonClick(TRIANGLE)) if (PS3[i]->getButtonClick(TRIANGLE))
Serial.print(F("\r\nTraingle")); Serial.print(F("\r\nTraingle"));
if(PS3[i]->getButtonClick(CIRCLE)) if (PS3[i]->getButtonClick(CIRCLE))
Serial.print(F("\r\nCircle")); Serial.print(F("\r\nCircle"));
if(PS3[i]->getButtonClick(CROSS)) if (PS3[i]->getButtonClick(CROSS))
Serial.print(F("\r\nCross")); Serial.print(F("\r\nCross"));
if(PS3[i]->getButtonClick(SQUARE)) if (PS3[i]->getButtonClick(SQUARE))
Serial.print(F("\r\nSquare")); Serial.print(F("\r\nSquare"));
if(PS3[i]->getButtonClick(UP)) { if (PS3[i]->getButtonClick(UP)) {
Serial.print(F("\r\nUp")); Serial.print(F("\r\nUp"));
if(PS3[i]->PS3Connected) { if (PS3[i]->PS3Connected) {
PS3[i]->setAllOff(); PS3[i]->setLedOff();
PS3[i]->setLedOn(LED4); PS3[i]->setLedOn(LED4);
} }
} }
if(PS3[i]->getButtonClick(RIGHT)) { if (PS3[i]->getButtonClick(RIGHT)) {
Serial.print(F("\r\nRight")); Serial.print(F("\r\nRight"));
if(PS3[i]->PS3Connected) { if (PS3[i]->PS3Connected) {
PS3[i]->setAllOff(); PS3[i]->setLedOff();
PS3[i]->setLedOn(LED1); PS3[i]->setLedOn(LED1);
} }
} }
if(PS3[i]->getButtonClick(DOWN)) { if (PS3[i]->getButtonClick(DOWN)) {
Serial.print(F("\r\nDown")); Serial.print(F("\r\nDown"));
if(PS3[i]->PS3Connected) { if (PS3[i]->PS3Connected) {
PS3[i]->setAllOff(); PS3[i]->setLedOff();
PS3[i]->setLedOn(LED2); PS3[i]->setLedOn(LED2);
} }
} }
if(PS3[i]->getButtonClick(LEFT)) { if (PS3[i]->getButtonClick(LEFT)) {
Serial.print(F("\r\nLeft")); Serial.print(F("\r\nLeft"));
if(PS3[i]->PS3Connected) { if (PS3[i]->PS3Connected) {
PS3[i]->setAllOff(); PS3[i]->setLedOff();
PS3[i]->setLedOn(LED3); PS3[i]->setLedOn(LED3);
} }
} }
if(PS3[i]->getButtonClick(L1)) if (PS3[i]->getButtonClick(L1))
Serial.print(F("\r\nL1")); Serial.print(F("\r\nL1"));
if(PS3[i]->getButtonClick(L3)) if (PS3[i]->getButtonClick(L3))
Serial.print(F("\r\nL3")); Serial.print(F("\r\nL3"));
if(PS3[i]->getButtonClick(R1)) if (PS3[i]->getButtonClick(R1))
Serial.print(F("\r\nR1")); Serial.print(F("\r\nR1"));
if(PS3[i]->getButtonClick(R3)) if (PS3[i]->getButtonClick(R3))
Serial.print(F("\r\nR3")); Serial.print(F("\r\nR3"));
if(PS3[i]->getButtonClick(SELECT)) { if (PS3[i]->getButtonClick(SELECT)) {
Serial.print(F("\r\nSelect - ")); Serial.print(F("\r\nSelect - "));
Serial.print(PS3[i]->getStatusString()); Serial.print(PS3[i]->getStatusString());
} }
if(PS3[i]->getButtonClick(START)) { if (PS3[i]->getButtonClick(START)) {
Serial.print(F("\r\nStart")); Serial.print(F("\r\nStart"));
printAngle[i] = !printAngle[i]; printAngle[i] = !printAngle[i];
} }
} }
if(printAngle[i]) { if (printAngle[i]) {
Serial.print(F("\r\nPitch: ")); Serial.print(F("\r\nPitch: "));
Serial.print(PS3[i]->getAngle(Pitch)); Serial.print(PS3[i]->getAngle(Pitch));
Serial.print(F("\tRoll: ")); Serial.print(F("\tRoll: "));
@ -126,12 +127,12 @@ void loop() {
} }
} }
/* I have removed the PS3 Move code as an Uno will run out of RAM if it's included */ /* I have removed the PS3 Move code as an Uno will run out of RAM if it's included */
//else if(PS3[i]->PS3MoveConnected) { //else if(PS3[i]->PS3MoveConnected) {
} }
} }
void onInit() { 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]) { if ((PS3[i]->PS3Connected || PS3[i]->PS3NavigationConnected) && !oldControllerState[i]) {
oldControllerState[i] = true; // Used to check which is the new controller oldControllerState[i] = true; // Used to check which is the new controller
PS3[i]->setLedOn((LED)i); // Cast directly to LED enum - see: "controllerEnums.h" PS3[i]->setLedOn((LED)i); // Cast directly to LED enum - see: "controllerEnums.h"

View file

@ -1,6 +1,6 @@
/* /*
Example sketch for the Bluetooth library - developed by Kristian Lauszus Example sketch for the Bluetooth library - developed by Kristian Lauszus
For more information visit my blog: http://blog.tkjelectronics.dk/ or For more information visit my blog: http://blog.tkjelectronics.dk/ or
send me an e-mail: kristianl@tkjelectronics.com send me an e-mail: kristianl@tkjelectronics.com
This example show how one can combine all the difference Bluetooth services in one single code. This example show how one can combine all the difference Bluetooth services in one single code.
@ -14,7 +14,8 @@
#include <usbhub.h> #include <usbhub.h>
USB Usb; 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 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 */ /* 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 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) { if (Usb.Init() == -1) {
Serial.print(F("\r\nOSC did not start")); Serial.print(F("\r\nOSC did not start"));
while(1); //halt while (1); //halt
} }
Serial.print(F("\r\nBluetooth Library Started")); Serial.print(F("\r\nBluetooth Library Started"));
output.reserve(200); // Reserve 200 bytes for the output string output.reserve(200); // Reserve 200 bytes for the output string
@ -39,27 +40,27 @@ void setup() {
void loop() { void loop() {
Usb.Task(); // The SPP data is actually not send until this is called, one could call SerialBT.send() directly as well 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 (SerialBT.connected) {
if(firstMessage) { if (firstMessage) {
firstMessage = false; firstMessage = false;
SerialBT.println(F("Hello from Arduino")); // Send welcome message SerialBT.println(F("Hello from Arduino")); // Send welcome message
} }
if(Serial.available()) if (Serial.available())
SerialBT.write(Serial.read()); SerialBT.write(Serial.read());
if(SerialBT.available()) if (SerialBT.available())
Serial.write(SerialBT.read()); Serial.write(SerialBT.read());
} }
else else
firstMessage = true; firstMessage = true;
if(PS3.PS3Connected || PS3.PS3NavigationConnected) { if (PS3.PS3Connected || PS3.PS3NavigationConnected) {
output = ""; // Reset output string 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 += "LeftHatX: ";
output += PS3.getAnalogHat(LeftHatX); output += PS3.getAnalogHat(LeftHatX);
output += "\tLeftHatY: "; output += "\tLeftHatY: ";
output += PS3.getAnalogHat(LeftHatY); output += PS3.getAnalogHat(LeftHatY);
if(!PS3.PS3NavigationConnected) { if (PS3.PS3Connected) { // The Navigation controller only have one joystick
output += "\tRightHatX: "; output += "\tRightHatX: ";
output += PS3.getAnalogHat(RightHatX); output += PS3.getAnalogHat(RightHatX);
output += "\tRightHatY: "; output += "\tRightHatY: ";
@ -67,85 +68,85 @@ void loop() {
} }
} }
//Analog button values can be read from almost all buttons //Analog button values can be read from almost all buttons
if(PS3.getAnalogButton(L2) || PS3.getAnalogButton(R2)) { if (PS3.getAnalogButton(L2) || PS3.getAnalogButton(R2)) {
if(output != "") if (output != "")
output += "\r\n"; output += "\r\n";
output += "L2: "; output += "L2: ";
output += PS3.getAnalogButton(L2); output += PS3.getAnalogButton(L2);
if(!PS3.PS3NavigationConnected) { if (!PS3.PS3NavigationConnected) {
output += "\tR2: "; output += "\tR2: ";
output += PS3.getAnalogButton(R2); output += PS3.getAnalogButton(R2);
} }
} }
if(output != "") { if (output != "") {
Serial.println(output); Serial.println(output);
if(SerialBT.connected) if (SerialBT.connected)
SerialBT.println(output); SerialBT.println(output);
output = ""; // Reset output string output = ""; // Reset output string
} }
if(PS3.getButtonClick(PS)) { if (PS3.getButtonClick(PS)) {
output += " - PS"; output += " - PS";
PS3.disconnect(); PS3.disconnect();
} }
else { else {
if(PS3.getButtonClick(TRIANGLE)) if (PS3.getButtonClick(TRIANGLE))
output += " - Traingle"; output += " - Traingle";
if(PS3.getButtonClick(CIRCLE)) if (PS3.getButtonClick(CIRCLE))
output += " - Circle"; output += " - Circle";
if(PS3.getButtonClick(CROSS)) if (PS3.getButtonClick(CROSS))
output += " - Cross"; output += " - Cross";
if(PS3.getButtonClick(SQUARE)) if (PS3.getButtonClick(SQUARE))
output += " - Square"; output += " - Square";
if(PS3.getButtonClick(UP)) { if (PS3.getButtonClick(UP)) {
output += " - Up"; output += " - Up";
if(PS3.PS3Connected) { if (PS3.PS3Connected) {
PS3.setAllOff(); PS3.setLedOff();
PS3.setLedOn(LED4); PS3.setLedOn(LED4);
} }
} }
if(PS3.getButtonClick(RIGHT)) { if (PS3.getButtonClick(RIGHT)) {
output += " - Right"; output += " - Right";
if(PS3.PS3Connected) { if (PS3.PS3Connected) {
PS3.setAllOff(); PS3.setLedOff();
PS3.setLedOn(LED1); PS3.setLedOn(LED1);
}
}
if(PS3.getButtonClick(DOWN)) {
output += " - Down";
if(PS3.PS3Connected) {
PS3.setAllOff();
PS3.setLedOn(LED2);
} }
} }
if(PS3.getButtonClick(LEFT)) { if (PS3.getButtonClick(DOWN)) {
output += " - Left"; output += " - Down";
if(PS3.PS3Connected) { if (PS3.PS3Connected) {
PS3.setAllOff(); PS3.setLedOff();
PS3.setLedOn(LED3); PS3.setLedOn(LED2);
} }
} }
if (PS3.getButtonClick(LEFT)) {
output += " - Left";
if (PS3.PS3Connected) {
PS3.setLedOff();
PS3.setLedOn(LED3);
}
}
if(PS3.getButtonClick(L1)) if (PS3.getButtonClick(L1))
output += " - L1"; output += " - L1";
if(PS3.getButtonClick(L3)) if (PS3.getButtonClick(L3))
output += " - L3"; output += " - L3";
if(PS3.getButtonClick(R1)) if (PS3.getButtonClick(R1))
output += " - R1"; output += " - R1";
if(PS3.getButtonClick(R3)) if (PS3.getButtonClick(R3))
output += " - R3"; output += " - R3";
if(PS3.getButtonClick(SELECT)) { if (PS3.getButtonClick(SELECT)) {
output += " - Select - "; output += " - Select - ";
output += PS3.getStatusString(); output += PS3.getStatusString();
} }
if(PS3.getButtonClick(START)) if (PS3.getButtonClick(START))
output += " - Start"; output += " - Start";
if(output != "") { if (output != "") {
String string = "PS3 Controller" + output; String string = "PS3 Controller" + output;
Serial.println(string); Serial.println(string);
if(SerialBT.connected) if (SerialBT.connected)
SerialBT.println(string); SerialBT.println(string);
} }
} }

View file

@ -1,6 +1,6 @@
/* /*
Example sketch for the RFCOMM/SPP Bluetooth library - developed by Kristian Lauszus Example sketch for the RFCOMM/SPP Bluetooth library - developed by Kristian Lauszus
For more information visit my blog: http://blog.tkjelectronics.dk/ or For more information visit my blog: http://blog.tkjelectronics.dk/ or
send me an e-mail: kristianl@tkjelectronics.com send me an e-mail: kristianl@tkjelectronics.com
*/ */
@ -8,7 +8,8 @@
#include <usbhub.h> #include <usbhub.h>
USB Usb; 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 BTD Btd(&Usb); // You have to create the Bluetooth Dongle instance like so
/* You can create the instance of the class in two ways */ /* 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" SPP SerialBT(&Btd); // This will set the name to the defaults: "Arduino" and the pin to "1234"
@ -21,23 +22,23 @@ void setup() {
while (!Serial); // Wait for serial port to connect - used on Leonardo, Teensy and other boards with built-in USB CDC serial connection 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) { if (Usb.Init() == -1) {
Serial.print(F("\r\nOSC did not start")); Serial.print(F("\r\nOSC did not start"));
while(1); //halt while (1); //halt
} }
Serial.print(F("\r\nSPP Bluetooth Library Started")); Serial.print(F("\r\nSPP Bluetooth Library Started"));
} }
void loop() { void loop() {
Usb.Task(); // The SPP data is actually not send until this is called, one could call SerialBT.send() directly as well 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 (SerialBT.connected) {
if(firstMessage) { if (firstMessage) {
firstMessage = false; firstMessage = false;
SerialBT.println(F("Hello from Arduino")); // Send welcome message SerialBT.println(F("Hello from Arduino")); // Send welcome message
} }
if(Serial.available()) if (Serial.available())
SerialBT.write(Serial.read()); SerialBT.write(Serial.read());
if(SerialBT.available()) if (SerialBT.available())
Serial.write(SerialBT.read()); Serial.write(SerialBT.read());
} }
else else
firstMessage = true; firstMessage = true;
} }

View file

@ -1,6 +1,6 @@
/* /*
Example sketch for the RFCOMM/SPP Bluetooth library - developed by Kristian Lauszus Example sketch for the RFCOMM/SPP Bluetooth library - developed by Kristian Lauszus
For more information visit my blog: http://blog.tkjelectronics.dk/ or For more information visit my blog: http://blog.tkjelectronics.dk/ or
send me an e-mail: kristianl@tkjelectronics.com send me an e-mail: kristianl@tkjelectronics.com
*/ */
@ -8,56 +8,57 @@
#include <usbhub.h> #include <usbhub.h>
USB Usb; 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 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! 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 const uint8_t length = sizeof(SerialBT) / sizeof(SerialBT[0]); // Get the lenght of the array
boolean firstMessage[length] = { true }; // Set all to true boolean firstMessage[length] = { true }; // Set all to true
uint8_t buffer[50]; uint8_t buffer[50];
void setup() { 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 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); 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 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) { if (Usb.Init() == -1) {
Serial.print(F("\r\nOSC did not start")); Serial.print(F("\r\nOSC did not start"));
while(1); //halt while (1); //halt
} }
Serial.print(F("\r\nSPP Bluetooth Library Started")); Serial.print(F("\r\nSPP Bluetooth Library Started"));
} }
void loop() { void loop() {
Usb.Task(); // The SPP data is actually not send until this is called, one could call SerialBT.send() directly as well 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++) { for (uint8_t i = 0; i < length; i++) {
if(SerialBT[i]->connected) { if (SerialBT[i]->connected) {
if(firstMessage[i]) { if (firstMessage[i]) {
firstMessage[i] = false; firstMessage[i] = false;
SerialBT[i]->println(F("Hello from Arduino")); // Send welcome message SerialBT[i]->println(F("Hello from Arduino")); // Send welcome message
} }
if(SerialBT[i]->available()) if (SerialBT[i]->available())
Serial.write(SerialBT[i]->read()); Serial.write(SerialBT[i]->read());
} }
else else
firstMessage[i] = true; firstMessage[i] = true;
} }
if(Serial.available()) { if (Serial.available()) {
delay(10); // Wait for the rest of the data to arrive delay(10); // Wait for the rest of the data to arrive
uint8_t i = 0; 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(); buffer[i++] = Serial.read();
/* /*
Set the connection you want to send to using the first character Set the connection you want to send to using the first character
For instace "0Hello World" would send "Hello World" to connection 0 For instace "0Hello World" would send "Hello World" to connection 0
*/ */
uint8_t id = buffer[0]-'0'; // Convert from ASCII 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 (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 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 for (uint8_t i2 = 0; i2 < i - 1; i2++) // Don't include the first character
buffer[i2] = buffer[i2+1]; buffer[i2] = buffer[i2 + 1];
SerialBT[id]->write(buffer,i-1); // Send the data SerialBT[id]->write(buffer, i - 1); // Send the data
} }
} }
} }
} }

View file

@ -1,6 +1,6 @@
/* /*
Example sketch for the Wiimote Bluetooth library - developed by Kristian Lauszus Example sketch for the Wiimote Bluetooth library - developed by Kristian Lauszus
For more information visit my blog: http://blog.tkjelectronics.dk/ or For more information visit my blog: http://blog.tkjelectronics.dk/ or
send me an e-mail: kristianl@tkjelectronics.com send me an e-mail: kristianl@tkjelectronics.com
*/ */
@ -8,10 +8,11 @@
#include <usbhub.h> #include <usbhub.h>
USB Usb; 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 BTD Btd(&Usb); // You have to create the Bluetooth Dongle instance like so
/* You can create the instance of the class in two ways */ /* 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 //WII Wii(&Btd); // After that you can simply create the instance like so and then press any button on the Wiimote
bool printAngle; 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 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) { if (Usb.Init() == -1) {
Serial.print(F("\r\nOSC did not start")); Serial.print(F("\r\nOSC did not start"));
while(1); //halt while (1); //halt
} }
Serial.print(F("\r\nWiimote Bluetooth Library Started")); Serial.print(F("\r\nWiimote Bluetooth Library Started"));
} }
void loop() { void loop() {
Usb.Task(); Usb.Task();
if(Wii.wiimoteConnected) { if (Wii.wiimoteConnected) {
if(Wii.getButtonClick(HOME)) { // You can use getButtonPress to see if the button is held down if (Wii.getButtonClick(HOME)) { // You can use getButtonPress to see if the button is held down
Serial.print(F("\r\nHOME")); Serial.print(F("\r\nHOME"));
Wii.disconnect(); Wii.disconnect();
} }
else { else {
if(Wii.getButtonClick(LEFT)) { if (Wii.getButtonClick(LEFT)) {
Wii.setAllOff(); Wii.setLedOff();
Wii.setLedOn(LED1); Wii.setLedOn(LED1);
Serial.print(F("\r\nLeft")); Serial.print(F("\r\nLeft"));
} }
if(Wii.getButtonClick(RIGHT)) { if (Wii.getButtonClick(RIGHT)) {
Wii.setAllOff(); Wii.setLedOff();
Wii.setLedOn(LED3); Wii.setLedOn(LED3);
Serial.print(F("\r\nRight")); Serial.print(F("\r\nRight"));
} }
if(Wii.getButtonClick(DOWN)) { if (Wii.getButtonClick(DOWN)) {
Wii.setAllOff(); Wii.setLedOff();
Wii.setLedOn(LED4); Wii.setLedOn(LED4);
Serial.print(F("\r\nDown")); Serial.print(F("\r\nDown"));
} }
if(Wii.getButtonClick(UP)) { if (Wii.getButtonClick(UP)) {
Wii.setAllOff(); Wii.setLedOff();
Wii.setLedOn(LED2); Wii.setLedOn(LED2);
Serial.print(F("\r\nUp")); Serial.print(F("\r\nUp"));
} }
if(Wii.getButtonClick(PLUS)) if (Wii.getButtonClick(PLUS))
Serial.print(F("\r\nPlus")); Serial.print(F("\r\nPlus"));
if(Wii.getButtonClick(MINUS)) if (Wii.getButtonClick(MINUS))
Serial.print(F("\r\nMinus")); Serial.print(F("\r\nMinus"));
if(Wii.getButtonClick(ONE)) if (Wii.getButtonClick(ONE))
Serial.print(F("\r\nOne")); Serial.print(F("\r\nOne"));
if(Wii.getButtonClick(TWO)) if (Wii.getButtonClick(TWO))
Serial.print(F("\r\nTwo")); Serial.print(F("\r\nTwo"));
if(Wii.getButtonClick(A)) { if (Wii.getButtonClick(A)) {
printAngle = !printAngle; printAngle = !printAngle;
Serial.print(F("\r\nA")); Serial.print(F("\r\nA"));
} }
if(Wii.getButtonClick(B)) { if (Wii.getButtonClick(B)) {
Wii.setRumbleToggle(); Wii.setRumbleToggle();
Serial.print(F("\r\nB")); Serial.print(F("\r\nB"));
} }
} }
if(printAngle) { if (printAngle) {
Serial.print(F("\r\nPitch: ")); Serial.print(F("\r\nPitch: "));
Serial.print(Wii.getPitch()); Serial.print(Wii.getPitch());
Serial.print(F("\tRoll: ")); Serial.print(F("\tRoll: "));
Serial.print(Wii.getRoll()); Serial.print(Wii.getRoll());
if(Wii.motionPlusConnected) { if (Wii.motionPlusConnected) {
Serial.print(F("\tYaw: ")); Serial.print(F("\tYaw: "));
Serial.print(Wii.getYaw()); Serial.print(Wii.getYaw());
} }
if(Wii.nunchuckConnected) { if (Wii.nunchuckConnected) {
Serial.print(F("\tNunchuck Pitch: ")); Serial.print(F("\tNunchuck Pitch: "));
Serial.print(Wii.getNunchuckPitch()); Serial.print(Wii.getNunchuckPitch());
Serial.print(F("\tNunchuck Roll: ")); Serial.print(F("\tNunchuck Roll: "));
@ -90,12 +91,12 @@ void loop() {
} }
} }
} }
if(Wii.nunchuckConnected) { if (Wii.nunchuckConnected) {
if(Wii.getButtonClick(Z)) if (Wii.getButtonClick(Z))
Serial.print(F("\r\nZ")); Serial.print(F("\r\nZ"));
if(Wii.getButtonClick(C)) if (Wii.getButtonClick(C))
Serial.print(F("\r\nC")); 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(F("\r\nHatX: "));
Serial.print(Wii.getAnalogHat(HatX)); Serial.print(Wii.getAnalogHat(HatX));
Serial.print(F("\tHatY: ")); Serial.print(F("\tHatY: "));

View file

@ -1,12 +1,12 @@
/* /*
Example sketch for the Wii libary showing the IR camera functionality. This example Example sketch for the Wii libary showing the IR camera functionality. This example
is for the Bluetooth Wii library developed for the USB shield from Circuits@Home is for the Bluetooth Wii library developed for the USB shield from Circuits@Home
Created by Allan Glover and Kristian Lauszus. Created by Allan Glover and Kristian Lauszus.
Contact Kristian: http://blog.tkjelectronics.dk/ or send an email at kristianl@tkjelectronics.com. Contact Kristian: http://blog.tkjelectronics.dk/ or send an email at kristianl@tkjelectronics.com.
Contact Allan at adglover9.81@gmail.com Contact Allan at adglover9.81@gmail.com
To test the Wiimote IR camera, you will need access to an IR source. Sunlight will work but is not ideal. To test the Wiimote IR camera, you will need access to an IR source. Sunlight will work but is not ideal.
The simpleist solution is to use the Wii sensor bar, i.e. emitter bar, supplied by the Wii system. The simpleist solution is to use the Wii sensor bar, i.e. emitter bar, supplied by the Wii system.
Otherwise, wire up a IR LED yourself. Otherwise, wire up a IR LED yourself.
*/ */
@ -19,10 +19,11 @@ Otherwise, wire up a IR LED yourself.
#endif #endif
USB Usb; 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 BTD Btd(&Usb); // You have to create the Bluetooth Dongle instance like so
/* You can create the instance of the class in two ways */ /* 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 //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; 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 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) { if (Usb.Init() == -1) {
Serial.print(F("\r\nOSC did not start")); Serial.print(F("\r\nOSC did not start"));
while(1); //halt while (1); //halt
} }
Serial.print(F("\r\nWiimote Bluetooth Library Started")); Serial.print(F("\r\nWiimote Bluetooth Library Started"));
} }
void loop() { void loop() {
Usb.Task(); Usb.Task();
if(Wii.wiimoteConnected) { if (Wii.wiimoteConnected) {
if(Wii.getButtonClick(HOME)) { // You can use getButtonPress to see if the button is held down if (Wii.getButtonClick(HOME)) { // You can use getButtonPress to see if the button is held down
Serial.print(F("\r\nHOME")); Serial.print(F("\r\nHOME"));
Wii.disconnect(); Wii.disconnect();
} }
else { else {
if(Wii.getButtonClick(ONE)) if (Wii.getButtonClick(ONE))
Wii.IRinitialize(); // Run the initialisation sequence Wii.IRinitialize(); // Run the initialisation sequence
if(Wii.getButtonClick(MINUS) || Wii.getButtonClick(PLUS)) { if (Wii.getButtonClick(MINUS) || Wii.getButtonClick(PLUS)) {
if(!Wii.isIRCameraEnabled()) if (!Wii.isIRCameraEnabled())
Serial.print(F("\r\nEnable IR camera first")); Serial.print(F("\r\nEnable IR camera first"));
else { else {
if(Wii.getButtonPress(MINUS)) { // getButtonClick will only return true once if (Wii.getButtonPress(MINUS)) { // getButtonClick will only return true once
if(printObjects > 0) if (printObjects > 0)
printObjects--; printObjects--;
} }
else { else {
if(printObjects < 4) if (printObjects < 4)
printObjects++; printObjects++;
} }
Serial.print(F("\r\nTracking ")); Serial.print(F("\r\nTracking "));
@ -65,56 +66,56 @@ void loop() {
Serial.print(F(" objects")); Serial.print(F(" objects"));
} }
} }
if(Wii.getButtonClick(A)) { if (Wii.getButtonClick(A)) {
printAngle = !printAngle; printAngle = !printAngle;
Serial.print(F("\r\nA")); Serial.print(F("\r\nA"));
} }
if(Wii.getButtonClick(B)) { if (Wii.getButtonClick(B)) {
Serial.print(F("\r\nBattery level: ")); Serial.print(F("\r\nBattery level: "));
Serial.print(Wii.getBatteryLevel()); // You can get the battery level as well Serial.print(Wii.getBatteryLevel()); // You can get the battery level as well
} }
} }
if(printObjects > 0) { if (printObjects > 0) {
if(Wii.getIRx1() != 0x3FF || Wii.getIRy1() != 0x3FF || Wii.getIRs1() != 0) { // Only print if the IR camera is actually seeing something 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(F("\r\nx1: "));
Serial.print(Wii.getIRx1()); Serial.print(Wii.getIRx1());
Serial.print(F("\ty1: ")); Serial.print(F("\ty1: "));
Serial.print(Wii.getIRy1()); Serial.print(Wii.getIRy1());
Serial.print(F("\ts1:")); Serial.print(F("\ts1:"));
Serial.print(Wii.getIRs1()); Serial.print(Wii.getIRs1());
} }
if(printObjects > 1) { if (printObjects > 1) {
if(Wii.getIRx2() != 0x3FF || Wii.getIRy2() != 0x3FF || Wii.getIRs2() != 0) { if (Wii.getIRx2() != 0x3FF || Wii.getIRy2() != 0x3FF || Wii.getIRs2() != 0) {
Serial.print(F("\r\nx2: ")); Serial.print(F("\r\nx2: "));
Serial.print(Wii.getIRx2()); Serial.print(Wii.getIRx2());
Serial.print(F("\ty2: ")); Serial.print(F("\ty2: "));
Serial.print(Wii.getIRy2()); Serial.print(Wii.getIRy2());
Serial.print(F("\ts2:")); Serial.print(F("\ts2:"));
Serial.print(Wii.getIRs2()); Serial.print(Wii.getIRs2());
} }
if(printObjects > 2) { if (printObjects > 2) {
if(Wii.getIRx3() != 0x3FF || Wii.getIRy3() != 0x3FF || Wii.getIRs3() != 0) { if (Wii.getIRx3() != 0x3FF || Wii.getIRy3() != 0x3FF || Wii.getIRs3() != 0) {
Serial.print(F("\r\nx3: ")); Serial.print(F("\r\nx3: "));
Serial.print(Wii.getIRx3()); Serial.print(Wii.getIRx3());
Serial.print(F("\ty3: ")); Serial.print(F("\ty3: "));
Serial.print(Wii.getIRy3()); Serial.print(Wii.getIRy3());
Serial.print(F("\ts3:")); Serial.print(F("\ts3:"));
Serial.print(Wii.getIRs3()); Serial.print(Wii.getIRs3());
} }
if(printObjects > 3) { if (printObjects > 3) {
if(Wii.getIRx4() != 0x3FF || Wii.getIRy4() != 0x3FF || Wii.getIRs4() != 0) { if (Wii.getIRx4() != 0x3FF || Wii.getIRy4() != 0x3FF || Wii.getIRs4() != 0) {
Serial.print(F("\r\nx4: ")); Serial.print(F("\r\nx4: "));
Serial.print(Wii.getIRx4()); Serial.print(Wii.getIRx4());
Serial.print(F("\ty4: ")); Serial.print(F("\ty4: "));
Serial.print(Wii.getIRy4()); Serial.print(Wii.getIRy4());
Serial.print(F("\ts4:")); Serial.print(F("\ts4:"));
Serial.print(Wii.getIRs4()); Serial.print(Wii.getIRs4());
} }
} }
} }
} }
} }
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(F("\r\nPitch: "));
Serial.print(Wii.getPitch()); Serial.print(Wii.getPitch());
Serial.print(F("\tRoll: ")); Serial.print(F("\tRoll: "));

View file

@ -1,7 +1,7 @@
/* /*
Example sketch for the Wiimote Bluetooth library - developed by Kristian Lauszus Example sketch for the Wiimote Bluetooth library - developed by Kristian Lauszus
This example show how one can use multiple controllers with the library This example show how one can use multiple controllers with the library
For more information visit my blog: http://blog.tkjelectronics.dk/ or For more information visit my blog: http://blog.tkjelectronics.dk/ or
send me an e-mail: kristianl@tkjelectronics.com send me an e-mail: kristianl@tkjelectronics.com
*/ */
@ -9,88 +9,89 @@
#include <usbhub.h> #include <usbhub.h>
USB Usb; 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 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! 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 printAngle[length];
boolean oldControllerState[length]; boolean oldControllerState[length];
void setup() { 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] = 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 Wii[i]->attachOnInit(onInit); // onInit() is called upon a new connection - you can call the function whatever you like
} }
Serial.begin(115200); 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 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) { if (Usb.Init() == -1) {
Serial.print(F("\r\nOSC did not start")); Serial.print(F("\r\nOSC did not start"));
while(1); //halt while (1); //halt
} }
Serial.print(F("\r\nWiimote Bluetooth Library Started")); Serial.print(F("\r\nWiimote Bluetooth Library Started"));
} }
void loop() { void loop() {
Usb.Task(); Usb.Task();
for(uint8_t i=0;i<length;i++) { for (uint8_t i = 0; i < length; i++) {
if(Wii[i]->wiimoteConnected) { if (Wii[i]->wiimoteConnected) {
if(Wii[i]->getButtonClick(HOME)) { // You can use getButtonPress to see if the button is held down if (Wii[i]->getButtonClick(HOME)) { // You can use getButtonPress to see if the button is held down
Serial.print(F("\r\nHOME")); Serial.print(F("\r\nHOME"));
Wii[i]->disconnect(); Wii[i]->disconnect();
oldControllerState[i] = false; // Reset value oldControllerState[i] = false; // Reset value
} }
else { else {
if(Wii[i]->getButtonClick(LEFT)) { if (Wii[i]->getButtonClick(LEFT)) {
Wii[i]->setAllOff(); Wii[i]->setLedOff();
Wii[i]->setLedOn(LED1); Wii[i]->setLedOn(LED1);
Serial.print(F("\r\nLeft")); Serial.print(F("\r\nLeft"));
} }
if(Wii[i]->getButtonClick(RIGHT)) { if (Wii[i]->getButtonClick(RIGHT)) {
Wii[i]->setAllOff(); Wii[i]->setLedOff();
Wii[i]->setLedOn(LED3); Wii[i]->setLedOn(LED3);
Serial.print(F("\r\nRight")); Serial.print(F("\r\nRight"));
} }
if(Wii[i]->getButtonClick(DOWN)) { if (Wii[i]->getButtonClick(DOWN)) {
Wii[i]->setAllOff(); Wii[i]->setLedOff();
Wii[i]->setLedOn(LED4); Wii[i]->setLedOn(LED4);
Serial.print(F("\r\nDown")); Serial.print(F("\r\nDown"));
} }
if(Wii[i]->getButtonClick(UP)) { if (Wii[i]->getButtonClick(UP)) {
Wii[i]->setAllOff(); Wii[i]->setLedOff();
Wii[i]->setLedOn(LED2); Wii[i]->setLedOn(LED2);
Serial.print(F("\r\nUp")); Serial.print(F("\r\nUp"));
} }
if(Wii[i]->getButtonClick(PLUS)) if (Wii[i]->getButtonClick(PLUS))
Serial.print(F("\r\nPlus")); Serial.print(F("\r\nPlus"));
if(Wii[i]->getButtonClick(MINUS)) if (Wii[i]->getButtonClick(MINUS))
Serial.print(F("\r\nMinus")); Serial.print(F("\r\nMinus"));
if(Wii[i]->getButtonClick(ONE)) if (Wii[i]->getButtonClick(ONE))
Serial.print(F("\r\nOne")); Serial.print(F("\r\nOne"));
if(Wii[i]->getButtonClick(TWO)) if (Wii[i]->getButtonClick(TWO))
Serial.print(F("\r\nTwo")); Serial.print(F("\r\nTwo"));
if(Wii[i]->getButtonClick(A)) { if (Wii[i]->getButtonClick(A)) {
printAngle[i] = !printAngle[i]; printAngle[i] = !printAngle[i];
Serial.print(F("\r\nA")); Serial.print(F("\r\nA"));
} }
if(Wii[i]->getButtonClick(B)) { if (Wii[i]->getButtonClick(B)) {
Wii[i]->setRumbleToggle(); Wii[i]->setRumbleToggle();
Serial.print(F("\r\nB")); Serial.print(F("\r\nB"));
} }
} }
if(printAngle[i]) { if (printAngle[i]) {
Serial.print(F("\r\nPitch: ")); Serial.print(F("\r\nPitch: "));
Serial.print(Wii[i]->getPitch()); Serial.print(Wii[i]->getPitch());
Serial.print(F("\tRoll: ")); Serial.print(F("\tRoll: "));
Serial.print(Wii[i]->getRoll()); Serial.print(Wii[i]->getRoll());
if(Wii[i]->motionPlusConnected) { if (Wii[i]->motionPlusConnected) {
Serial.print(F("\tYaw: ")); Serial.print(F("\tYaw: "));
Serial.print(Wii[i]->getYaw()); Serial.print(Wii[i]->getYaw());
} }
if(Wii[i]->nunchuckConnected) { if (Wii[i]->nunchuckConnected) {
Serial.print(F("\tNunchuck Pitch: ")); Serial.print(F("\tNunchuck Pitch: "));
Serial.print(Wii[i]->getNunchuckPitch()); Serial.print(Wii[i]->getNunchuckPitch());
Serial.print(F("\tNunchuck Roll: ")); Serial.print(F("\tNunchuck Roll: "));
@ -98,12 +99,12 @@ void loop() {
} }
} }
} }
if(Wii[i]->nunchuckConnected) { if (Wii[i]->nunchuckConnected) {
if(Wii[i]->getButtonClick(Z)) if (Wii[i]->getButtonClick(Z))
Serial.print(F("\r\nZ")); Serial.print(F("\r\nZ"));
if(Wii[i]->getButtonClick(C)) if (Wii[i]->getButtonClick(C))
Serial.print(F("\r\nC")); 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(F("\r\nHatX: "));
Serial.print(Wii[i]->getAnalogHat(HatX)); Serial.print(Wii[i]->getAnalogHat(HatX));
Serial.print(F("\tHatY: ")); Serial.print(F("\tHatY: "));
@ -114,7 +115,7 @@ void loop() {
} }
void onInit() { void onInit() {
for (uint8_t i=0;i<length;i++) { for (uint8_t i = 0; i < length; i++) {
if (Wii[i]->wiimoteConnected && !oldControllerState[i]) { if (Wii[i]->wiimoteConnected && !oldControllerState[i]) {
oldControllerState[i] = true; // Used to check which is the new controller oldControllerState[i] = true; // Used to check which is the new controller
Wii[i]->setLedOn((LED)i); // Cast directly to LED enum - see: "controllerEnums.h" Wii[i]->setLedOn((LED)i); // Cast directly to LED enum - see: "controllerEnums.h"

View file

@ -1,6 +1,6 @@
/* /*
Example sketch for the Wiimote Bluetooth library - developed by Kristian Lauszus Example sketch for the Wiimote Bluetooth library - developed by Kristian Lauszus
For more information visit my blog: http://blog.tkjelectronics.dk/ or For more information visit my blog: http://blog.tkjelectronics.dk/ or
send me an e-mail: kristianl@tkjelectronics.com send me an e-mail: kristianl@tkjelectronics.com
*/ */
@ -8,10 +8,11 @@
#include <usbhub.h> #include <usbhub.h>
USB Usb; 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 BTD Btd(&Usb); // You have to create the Bluetooth Dongle instance like so
/* You can create the instance of the class in two ways */ /* 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 //WII Wii(&Btd); // After that you can simply create the instance like so and then press any button on the Wiimote
void setup() { 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 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) { if (Usb.Init() == -1) {
Serial.print(F("\r\nOSC did not start")); Serial.print(F("\r\nOSC did not start"));
while(1); //halt while (1); //halt
} }
Serial.print(F("\r\nWiimote Bluetooth Library Started")); Serial.print(F("\r\nWiimote Bluetooth Library Started"));
} }
void loop() { void loop() {
Usb.Task(); Usb.Task();
if(Wii.wiiUProControllerConnected) { if (Wii.wiiUProControllerConnected) {
if(Wii.getButtonClick(HOME)) { // You can use getButtonPress to see if the button is held down if (Wii.getButtonClick(HOME)) { // You can use getButtonPress to see if the button is held down
Serial.print(F("\r\nHome")); Serial.print(F("\r\nHome"));
Wii.disconnect(); Wii.disconnect();
} }
else { else {
if(Wii.getButtonClick(LEFT)) { if (Wii.getButtonClick(LEFT)) {
Wii.setAllOff(); Wii.setLedOff();
Wii.setLedOn(LED1); Wii.setLedOn(LED1);
Serial.print(F("\r\nLeft")); Serial.print(F("\r\nLeft"));
} }
if(Wii.getButtonClick(RIGHT)) { if (Wii.getButtonClick(RIGHT)) {
Wii.setAllOff(); Wii.setLedOff();
Wii.setLedOn(LED3); Wii.setLedOn(LED3);
Serial.print(F("\r\nRight")); Serial.print(F("\r\nRight"));
} }
if(Wii.getButtonClick(DOWN)) { if (Wii.getButtonClick(DOWN)) {
Wii.setAllOff(); Wii.setLedOff();
Wii.setLedOn(LED4); Wii.setLedOn(LED4);
Serial.print(F("\r\nDown")); Serial.print(F("\r\nDown"));
} }
if(Wii.getButtonClick(UP)) { if (Wii.getButtonClick(UP)) {
Wii.setAllOff(); Wii.setLedOff();
Wii.setLedOn(LED2); Wii.setLedOn(LED2);
Serial.print(F("\r\nUp")); Serial.print(F("\r\nUp"));
} }
if(Wii.getButtonClick(PLUS)) if (Wii.getButtonClick(PLUS))
Serial.print(F("\r\nPlus")); Serial.print(F("\r\nPlus"));
if(Wii.getButtonClick(MINUS)) if (Wii.getButtonClick(MINUS))
Serial.print(F("\r\nMinus")); Serial.print(F("\r\nMinus"));
if(Wii.getButtonClick(A)) if (Wii.getButtonClick(A))
Serial.print(F("\r\nA")); Serial.print(F("\r\nA"));
if(Wii.getButtonClick(B)) { if (Wii.getButtonClick(B)) {
Wii.setRumbleToggle(); Wii.setRumbleToggle();
Serial.print(F("\r\nB")); Serial.print(F("\r\nB"));
} }
if(Wii.getButtonClick(X)) if (Wii.getButtonClick(X))
Serial.print(F("\r\nX")); Serial.print(F("\r\nX"));
if(Wii.getButtonClick(Y)) if (Wii.getButtonClick(Y))
Serial.print(F("\r\nY")); Serial.print(F("\r\nY"));
if(Wii.getButtonClick(L)) if (Wii.getButtonClick(L))
Serial.print(F("\r\nL")); Serial.print(F("\r\nL"));
if(Wii.getButtonClick(R)) if (Wii.getButtonClick(R))
Serial.print(F("\r\nR")); Serial.print(F("\r\nR"));
if(Wii.getButtonClick(ZL)) if (Wii.getButtonClick(ZL))
Serial.print(F("\r\nZL")); Serial.print(F("\r\nZL"));
if(Wii.getButtonClick(ZR)) if (Wii.getButtonClick(ZR))
Serial.print(F("\r\nZR")); Serial.print(F("\r\nZR"));
if(Wii.getButtonClick(L3)) if (Wii.getButtonClick(L3))
Serial.print(F("\r\nL3")); Serial.print(F("\r\nL3"));
if(Wii.getButtonClick(R3)) if (Wii.getButtonClick(R3))
Serial.print(F("\r\nR3")); 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(F("\r\nLeftHatX: "));
Serial.print(Wii.getAnalogHat(LeftHatX)); Serial.print(Wii.getAnalogHat(LeftHatX));
Serial.print(F("\tLeftHatY: ")); Serial.print(F("\tLeftHatY: "));

View file

@ -1,6 +1,6 @@
/* /*
Example sketch for the PS3 USB library - developed by Kristian Lauszus Example sketch for the PS3 USB library - developed by Kristian Lauszus
For more information visit my blog: http://blog.tkjelectronics.dk/ or For more information visit my blog: http://blog.tkjelectronics.dk/ or
send me an e-mail: kristianl@tkjelectronics.com send me an e-mail: kristianl@tkjelectronics.com
*/ */
@ -19,142 +19,122 @@ void setup() {
while (!Serial); // Wait for serial port to connect - used on Leonardo, Teensy and other boards with built-in USB CDC serial connection 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) { if (Usb.Init() == -1) {
Serial.print(F("\r\nOSC did not start")); Serial.print(F("\r\nOSC did not start"));
while(1); //halt while (1); //halt
} }
Serial.print(F("\r\nPS3 USB Library Started")); Serial.print(F("\r\nPS3 USB Library Started"));
} }
void loop() { void loop() {
Usb.Task(); Usb.Task();
if(PS3.PS3Connected || PS3.PS3NavigationConnected) { 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.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(F("\r\nLeftHatX: "));
Serial.print(PS3.getAnalogHat(LeftHatX)); Serial.print(PS3.getAnalogHat(LeftHatX));
Serial.print(F("\tLeftHatY: ")); Serial.print(F("\tLeftHatY: "));
Serial.print(PS3.getAnalogHat(LeftHatY)); Serial.print(PS3.getAnalogHat(LeftHatY));
if(!PS3.PS3NavigationConnected) { if (PS3.PS3Connected) { // The Navigation controller only have one joystick
Serial.print(F("\tRightHatX: ")); Serial.print(F("\tRightHatX: "));
Serial.print(PS3.getAnalogHat(RightHatX)); Serial.print(PS3.getAnalogHat(RightHatX));
Serial.print(F("\tRightHatY: ")); Serial.print(F("\tRightHatY: "));
Serial.print(PS3.getAnalogHat(RightHatY)); Serial.print(PS3.getAnalogHat(RightHatY));
} }
} }
// Analog button values can be read from almost all buttons // 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(F("\r\nL2: "));
Serial.print(PS3.getAnalogButton(L2)); Serial.print(PS3.getAnalogButton(L2));
if(!PS3.PS3NavigationConnected) { if (!PS3.PS3NavigationConnected) {
Serial.print(F("\tR2: ")); Serial.print(F("\tR2: "));
Serial.print(PS3.getAnalogButton(R2)); Serial.print(PS3.getAnalogButton(R2));
} }
} }
if(PS3.getButtonClick(PS)) if (PS3.getButtonClick(PS))
Serial.print(F("\r\nPS")); Serial.print(F("\r\nPS"));
if(PS3.getButtonClick(TRIANGLE)) if (PS3.getButtonClick(TRIANGLE))
Serial.print(F("\r\nTraingle")); Serial.print(F("\r\nTraingle"));
if(PS3.getButtonClick(CIRCLE)) if (PS3.getButtonClick(CIRCLE))
Serial.print(F("\r\nCircle")); Serial.print(F("\r\nCircle"));
if(PS3.getButtonClick(CROSS)) if (PS3.getButtonClick(CROSS))
Serial.print(F("\r\nCross")); Serial.print(F("\r\nCross"));
if(PS3.getButtonClick(SQUARE)) if (PS3.getButtonClick(SQUARE))
Serial.print(F("\r\nSquare")); Serial.print(F("\r\nSquare"));
if(PS3.getButtonClick(UP)) { if (PS3.getButtonClick(UP)) {
Serial.print(F("\r\nUp")); Serial.print(F("\r\nUp"));
PS3.setAllOff(); PS3.setLedOff();
PS3.setLedOn(LED4); PS3.setLedOn(LED4);
} }
if(PS3.getButtonClick(RIGHT)) { if (PS3.getButtonClick(RIGHT)) {
Serial.print(F("\r\nRight")); Serial.print(F("\r\nRight"));
PS3.setAllOff(); PS3.setLedOff();
PS3.setLedOn(LED1); PS3.setLedOn(LED1);
} }
if(PS3.getButtonClick(DOWN)) { if (PS3.getButtonClick(DOWN)) {
Serial.print(F("\r\nDown")); Serial.print(F("\r\nDown"));
PS3.setAllOff(); PS3.setLedOff();
PS3.setLedOn(LED2); PS3.setLedOn(LED2);
} }
if(PS3.getButtonClick(LEFT)) { if (PS3.getButtonClick(LEFT)) {
Serial.print(F("\r\nLeft")); Serial.print(F("\r\nLeft"));
PS3.setAllOff(); PS3.setLedOff();
PS3.setLedOn(LED3); PS3.setLedOn(LED3);
} }
if(PS3.getButtonClick(L1)) if (PS3.getButtonClick(L1))
Serial.print(F("\r\nL1")); Serial.print(F("\r\nL1"));
if(PS3.getButtonClick(L3)) if (PS3.getButtonClick(L3))
Serial.print(F("\r\nL3")); Serial.print(F("\r\nL3"));
if(PS3.getButtonClick(R1)) if (PS3.getButtonClick(R1))
Serial.print(F("\r\nR1")); Serial.print(F("\r\nR1"));
if(PS3.getButtonClick(R3)) if (PS3.getButtonClick(R3))
Serial.print(F("\r\nR3")); Serial.print(F("\r\nR3"));
if(PS3.getButtonClick(SELECT)) { if (PS3.getButtonClick(SELECT)) {
Serial.print(F("\r\nSelect - ")); Serial.print(F("\r\nSelect - "));
Serial.print(PS3.getStatusString()); Serial.print(PS3.getStatusString());
}
if(PS3.getButtonClick(START)) {
Serial.print(F("\r\nStart"));
printAngle = !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:
PS3.moveSetRumble(0);
PS3.moveSetBulb(Off);
state = 1;
break;
case 1:
PS3.moveSetRumble(75);
PS3.moveSetBulb(Red);
state = 2;
break;
case 2:
PS3.moveSetRumble(125);
PS3.moveSetBulb(Green);
state = 3;
break;
case 3:
PS3.moveSetRumble(150);
PS3.moveSetBulb(Blue);
state = 4;
break;
case 4:
PS3.moveSetRumble(175);
PS3.moveSetBulb(Yellow);
state = 5;
break;
case 5:
PS3.moveSetRumble(200);
PS3.moveSetBulb(Lightblue);
state = 6;
break;
case 6:
PS3.moveSetRumble(225);
PS3.moveSetBulb(Purble);
state = 7;
break;
case 7:
PS3.moveSetRumble(250);
PS3.moveSetBulb(White);
state = 0;
break;
} }
if (PS3.getButtonClick(START)) {
Serial.print(F("\r\nStart"));
printAngle = !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
if (state == 0) {
PS3.moveSetRumble(0);
PS3.moveSetBulb(Off);
} else if (state == 1) {
PS3.moveSetRumble(75);
PS3.moveSetBulb(Red);
} else if (state == 2) {
PS3.moveSetRumble(125);
PS3.moveSetBulb(Green);
} else if (state == 3) {
PS3.moveSetRumble(150);
PS3.moveSetBulb(Blue);
} else if (state == 4) {
PS3.moveSetRumble(175);
PS3.moveSetBulb(Yellow);
} else if (state == 5) {
PS3.moveSetRumble(200);
PS3.moveSetBulb(Lightblue);
} else if (state == 6) {
PS3.moveSetRumble(225);
PS3.moveSetBulb(Purble);
} else if (state == 7) {
PS3.moveSetRumble(250);
PS3.moveSetBulb(White);
}
state++;
if (state > 7)
state = 0;
delay(1000); delay(1000);
} }
} }

View file

@ -1,6 +1,6 @@
/* /*
Example sketch for the original Xbox library - developed by Kristian Lauszus Example sketch for the original Xbox library - developed by Kristian Lauszus
For more information visit my blog: http://blog.tkjelectronics.dk/ or For more information visit my blog: http://blog.tkjelectronics.dk/ or
send me an e-mail: kristianl@tkjelectronics.com send me an e-mail: kristianl@tkjelectronics.com
*/ */
@ -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 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) { if (Usb.Init() == -1) {
Serial.print(F("\r\nOSC did not start")); Serial.print(F("\r\nOSC did not start"));
while(1); // halt while (1); // halt
} }
Serial.print(F("\r\nXBOX Library Started")); Serial.print(F("\r\nXBOX Library Started"));
} }
void loop() { void loop() {
Usb.Task(); Usb.Task();
if(Xbox.XboxConnected) { if (Xbox.XboxConnected) {
if(Xbox.getButtonPress(BLACK) || Xbox.getButtonPress(WHITE)) { if (Xbox.getButtonPress(BLACK) || Xbox.getButtonPress(WHITE)) {
Serial.print("BLACK: "); Serial.print("BLACK: ");
Serial.print(Xbox.getButtonPress(BLACK)); Serial.print(Xbox.getButtonPress(BLACK));
Serial.print("\tWHITE: "); Serial.print("\tWHITE: ");
Serial.println(Xbox.getButtonPress(WHITE)); Serial.println(Xbox.getButtonPress(WHITE));
Xbox.setRumbleOn(Xbox.getButtonPress(BLACK),Xbox.getButtonPress(WHITE)); Xbox.setRumbleOn(Xbox.getButtonPress(BLACK), Xbox.getButtonPress(WHITE));
} else } else
Xbox.setRumbleOn(0,0); 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) { 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) {
Serial.print(F("LeftHatX: ")); if (Xbox.getAnalogHat(LeftHatX) > 7500 || Xbox.getAnalogHat(LeftHatX) < -7500) {
Serial.print(F("LeftHatX: "));
Serial.print(Xbox.getAnalogHat(LeftHatX)); Serial.print(Xbox.getAnalogHat(LeftHatX));
Serial.print("\t"); 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(F("LeftHatY: "));
Serial.print(Xbox.getAnalogHat(LeftHatY)); Serial.print(Xbox.getAnalogHat(LeftHatY));
Serial.print("\t"); 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(F("RightHatX: "));
Serial.print(Xbox.getAnalogHat(RightHatX)); Serial.print(Xbox.getAnalogHat(RightHatX));
Serial.print("\t"); 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(F("RightHatY: "));
Serial.print(Xbox.getAnalogHat(RightHatY)); Serial.print(Xbox.getAnalogHat(RightHatY));
} }
Serial.println(); Serial.println();
} }
if(Xbox.getButtonClick(UP)) if (Xbox.getButtonClick(UP))
Serial.println(F("Up")); Serial.println(F("Up"));
if(Xbox.getButtonClick(DOWN)) if (Xbox.getButtonClick(DOWN))
Serial.println(F("Down")); Serial.println(F("Down"));
if(Xbox.getButtonClick(LEFT)) if (Xbox.getButtonClick(LEFT))
Serial.println(F("Left")); Serial.println(F("Left"));
if(Xbox.getButtonClick(RIGHT)) if (Xbox.getButtonClick(RIGHT))
Serial.println(F("Right")); Serial.println(F("Right"));
if(Xbox.getButtonClick(START)) if (Xbox.getButtonClick(START))
Serial.println(F("Start")); Serial.println(F("Start"));
if(Xbox.getButtonClick(BACK)) if (Xbox.getButtonClick(BACK))
Serial.println(F("Back")); Serial.println(F("Back"));
if(Xbox.getButtonClick(L3)) if (Xbox.getButtonClick(L3))
Serial.println(F("L3")); Serial.println(F("L3"));
if(Xbox.getButtonClick(R3)) if (Xbox.getButtonClick(R3))
Serial.println(F("R3")); Serial.println(F("R3"));
if(Xbox.getButtonPress(A)) { if (Xbox.getButtonPress(A)) {
Serial.print(F("A: ")); Serial.print(F("A: "));
Serial.println(Xbox.getButtonPress(A)); Serial.println(Xbox.getButtonPress(A));
} }
if(Xbox.getButtonPress(B)) { if (Xbox.getButtonPress(B)) {
Serial.print(F("B: ")); Serial.print(F("B: "));
Serial.println(Xbox.getButtonPress(B)); Serial.println(Xbox.getButtonPress(B));
} }
if(Xbox.getButtonPress(X)) { if (Xbox.getButtonPress(X)) {
Serial.print(F("X: ")); Serial.print(F("X: "));
Serial.println(Xbox.getButtonPress(X)); Serial.println(Xbox.getButtonPress(X));
} }
if(Xbox.getButtonPress(Y)) { if (Xbox.getButtonPress(Y)) {
Serial.print(F("Y: ")); Serial.print(F("Y: "));
Serial.println(Xbox.getButtonPress(Y)); Serial.println(Xbox.getButtonPress(Y));
} }
if(Xbox.getButtonPress(L1)) { if (Xbox.getButtonPress(L1)) {
Serial.print(F("L1: ")); Serial.print(F("L1: "));
Serial.println(Xbox.getButtonPress(L1)); Serial.println(Xbox.getButtonPress(L1));
} }
if(Xbox.getButtonPress(R1)) { if (Xbox.getButtonPress(R1)) {
Serial.print(F("R1: ")); Serial.print(F("R1: "));
Serial.println(Xbox.getButtonPress(R1)); Serial.println(Xbox.getButtonPress(R1));
} }

View file

@ -1,7 +1,7 @@
/* /*
Example sketch for the Xbox Wireless Reciver library - developed by Kristian Lauszus Example sketch for the Xbox Wireless Reciver library - developed by Kristian Lauszus
It supports up to four controllers wirelessly It supports up to four controllers wirelessly
For more information see the blog post: http://blog.tkjelectronics.dk/2012/12/xbox-360-receiver-added-to-the-usb-host-library/ or For more information see the blog post: http://blog.tkjelectronics.dk/2012/12/xbox-360-receiver-added-to-the-usb-host-library/ or
send me an e-mail: kristianl@tkjelectronics.com send me an e-mail: kristianl@tkjelectronics.com
*/ */
@ -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 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) { if (Usb.Init() == -1) {
Serial.print(F("\r\nOSC did not start")); Serial.print(F("\r\nOSC did not start"));
while(1); //halt while (1); //halt
} }
Serial.print(F("\r\nXbox Wireless Receiver Library Started")); Serial.print(F("\r\nXbox Wireless Receiver Library Started"));
} }
void loop() { void loop() {
Usb.Task(); Usb.Task();
if(Xbox.XboxReceiverConnected) { if (Xbox.XboxReceiverConnected) {
for(uint8_t i=0;i<4;i++) { for (uint8_t i = 0; i < 4; i++) {
if(Xbox.Xbox360Connected[i]) { if (Xbox.Xbox360Connected[i]) {
if(Xbox.getButtonPress(L2,i) || Xbox.getButtonPress(R2,i)) { if (Xbox.getButtonPress(L2, i) || Xbox.getButtonPress(R2, i)) {
Serial.print("L2: "); Serial.print("L2: ");
Serial.print(Xbox.getButtonPress(L2,i)); Serial.print(Xbox.getButtonPress(L2, i));
Serial.print("\tR2: "); Serial.print("\tR2: ");
Serial.println(Xbox.getButtonPress(R2,i)); Serial.println(Xbox.getButtonPress(R2, i));
Xbox.setRumbleOn(Xbox.getButtonPress(L2,i),Xbox.getButtonPress(R2,i),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) {
Serial.print(F("LeftHatX: ")); if (Xbox.getAnalogHat(LeftHatX, i) > 7500 || Xbox.getAnalogHat(LeftHatX, i) < -7500) {
Serial.print(Xbox.getAnalogHat(LeftHatX,i)); Serial.print(F("LeftHatX: "));
Serial.print(Xbox.getAnalogHat(LeftHatX, i));
Serial.print("\t"); 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(F("LeftHatY: "));
Serial.print(Xbox.getAnalogHat(LeftHatY,i)); Serial.print(Xbox.getAnalogHat(LeftHatY, i));
Serial.print("\t"); 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(F("RightHatX: "));
Serial.print(Xbox.getAnalogHat(RightHatX,i)); Serial.print(Xbox.getAnalogHat(RightHatX, i));
Serial.print("\t"); 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(F("RightHatY: "));
Serial.print(Xbox.getAnalogHat(RightHatY,i)); Serial.print(Xbox.getAnalogHat(RightHatY, i));
} }
Serial.println(); Serial.println();
} }
if(Xbox.getButtonClick(UP,i)) { if (Xbox.getButtonClick(UP, i)) {
Xbox.setLedOn(LED1,i); Xbox.setLedOn(LED1, i);
Serial.println(F("Up")); Serial.println(F("Up"));
} }
if(Xbox.getButtonClick(DOWN,i)) { if (Xbox.getButtonClick(DOWN, i)) {
Xbox.setLedOn(LED4,i); Xbox.setLedOn(LED4, i);
Serial.println(F("Down")); Serial.println(F("Down"));
} }
if(Xbox.getButtonClick(LEFT,i)) { if (Xbox.getButtonClick(LEFT, i)) {
Xbox.setLedOn(LED3,i); Xbox.setLedOn(LED3, i);
Serial.println(F("Left")); Serial.println(F("Left"));
} }
if(Xbox.getButtonClick(RIGHT,i)) { if (Xbox.getButtonClick(RIGHT, i)) {
Xbox.setLedOn(LED2,i); Xbox.setLedOn(LED2, i);
Serial.println(F("Right")); Serial.println(F("Right"));
} }
if(Xbox.getButtonClick(START,i)) { if (Xbox.getButtonClick(START, i)) {
Xbox.setLedMode(ALTERNATING,i); Xbox.setLedMode(ALTERNATING, i);
Serial.println(F("Start")); Serial.println(F("Start"));
} }
if(Xbox.getButtonClick(BACK,i)) { if (Xbox.getButtonClick(BACK, i)) {
Xbox.setLedBlink(ALL,i); Xbox.setLedBlink(ALL, i);
Serial.println(F("Back")); Serial.println(F("Back"));
} }
if(Xbox.getButtonClick(L3,i)) if (Xbox.getButtonClick(L3, i))
Serial.println(F("L3")); Serial.println(F("L3"));
if(Xbox.getButtonClick(R3,i)) if (Xbox.getButtonClick(R3, i))
Serial.println(F("R3")); Serial.println(F("R3"));
if(Xbox.getButtonClick(L1,i)) if (Xbox.getButtonClick(L1, i))
Serial.println(F("L1")); Serial.println(F("L1"));
if(Xbox.getButtonClick(R1,i)) if (Xbox.getButtonClick(R1, i))
Serial.println(F("R1")); Serial.println(F("R1"));
if(Xbox.getButtonClick(XBOX,i)) { if (Xbox.getButtonClick(XBOX, i)) {
Xbox.setLedMode(ROTATING,i); Xbox.setLedMode(ROTATING, i);
Serial.print(F("Xbox (Battery: ")); Serial.print(F("Xbox (Battery: "));
Serial.print(Xbox.getBatteryLevel(i)); // The battery level in the range 0-3 Serial.print(Xbox.getBatteryLevel(i)); // The battery level in the range 0-3
Serial.println(F(")")); Serial.println(F(")"));
} }
if(Xbox.getButtonClick(SYNC,i)) if (Xbox.getButtonClick(SYNC, i)) {
Serial.println(F("Sync")); Serial.println(F("Sync"));
Xbox.disconnect(i);
}
if(Xbox.getButtonClick(A,i)) if (Xbox.getButtonClick(A, i))
Serial.println(F("A")); Serial.println(F("A"));
if(Xbox.getButtonClick(B,i)) if (Xbox.getButtonClick(B, i))
Serial.println(F("B")); Serial.println(F("B"));
if(Xbox.getButtonClick(X,i)) if (Xbox.getButtonClick(X, i))
Serial.println(F("X")); Serial.println(F("X"));
if(Xbox.getButtonClick(Y,i)) if (Xbox.getButtonClick(Y, i))
Serial.println(F("Y")); Serial.println(F("Y"));
} }
} }
} }
delay(1);
} }

View file

@ -1,6 +1,6 @@
/* /*
Example sketch for the Xbox 360 USB library - developed by Kristian Lauszus Example sketch for the Xbox 360 USB library - developed by Kristian Lauszus
For more information visit my blog: http://blog.tkjelectronics.dk/ or For more information visit my blog: http://blog.tkjelectronics.dk/ or
send me an e-mail: kristianl@tkjelectronics.com send me an e-mail: kristianl@tkjelectronics.com
*/ */
@ -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 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) { if (Usb.Init() == -1) {
Serial.print(F("\r\nOSC did not start")); Serial.print(F("\r\nOSC did not start"));
while(1); //halt while (1); //halt
} }
Serial.print(F("\r\nXBOX USB Library Started")); Serial.print(F("\r\nXBOX USB Library Started"));
} }
void loop() { void loop() {
Usb.Task(); Usb.Task();
if(Xbox.Xbox360Connected) { if (Xbox.Xbox360Connected) {
if(Xbox.getButtonPress(L2) || Xbox.getButtonPress(R2)) { if (Xbox.getButtonPress(L2) || Xbox.getButtonPress(R2)) {
Serial.print("L2: "); Serial.print("L2: ");
Serial.print(Xbox.getButtonPress(L2)); Serial.print(Xbox.getButtonPress(L2));
Serial.print("\tR2: "); Serial.print("\tR2: ");
Serial.println(Xbox.getButtonPress(R2)); Serial.println(Xbox.getButtonPress(R2));
Xbox.setRumbleOn(Xbox.getButtonPress(L2),Xbox.getButtonPress(R2)); Xbox.setRumbleOn(Xbox.getButtonPress(L2), Xbox.getButtonPress(R2));
} else } else
Xbox.setRumbleOn(0,0); 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) { 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) {
Serial.print(F("LeftHatX: ")); if (Xbox.getAnalogHat(LeftHatX) > 7500 || Xbox.getAnalogHat(LeftHatX) < -7500) {
Serial.print(F("LeftHatX: "));
Serial.print(Xbox.getAnalogHat(LeftHatX)); Serial.print(Xbox.getAnalogHat(LeftHatX));
Serial.print("\t"); 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(F("LeftHatY: "));
Serial.print(Xbox.getAnalogHat(LeftHatY)); Serial.print(Xbox.getAnalogHat(LeftHatY));
Serial.print("\t"); 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(F("RightHatX: "));
Serial.print(Xbox.getAnalogHat(RightHatX)); Serial.print(Xbox.getAnalogHat(RightHatX));
Serial.print("\t"); 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(F("RightHatY: "));
Serial.print(Xbox.getAnalogHat(RightHatY)); Serial.print(Xbox.getAnalogHat(RightHatY));
} }
Serial.println(); Serial.println();
} }
if(Xbox.getButtonClick(UP)) { if (Xbox.getButtonClick(UP)) {
Xbox.setLedOn(LED1); Xbox.setLedOn(LED1);
Serial.println(F("Up")); Serial.println(F("Up"));
} }
if(Xbox.getButtonClick(DOWN)) { if (Xbox.getButtonClick(DOWN)) {
Xbox.setLedOn(LED4); Xbox.setLedOn(LED4);
Serial.println(F("Down")); Serial.println(F("Down"));
} }
if(Xbox.getButtonClick(LEFT)) { if (Xbox.getButtonClick(LEFT)) {
Xbox.setLedOn(LED3); Xbox.setLedOn(LED3);
Serial.println(F("Left")); Serial.println(F("Left"));
} }
if(Xbox.getButtonClick(RIGHT)) { if (Xbox.getButtonClick(RIGHT)) {
Xbox.setLedOn(LED2); Xbox.setLedOn(LED2);
Serial.println(F("Right")); Serial.println(F("Right"));
} }
if(Xbox.getButtonClick(START)) { if (Xbox.getButtonClick(START)) {
Xbox.setLedMode(ALTERNATING); Xbox.setLedMode(ALTERNATING);
Serial.println(F("Start")); Serial.println(F("Start"));
} }
if(Xbox.getButtonClick(BACK)) { if (Xbox.getButtonClick(BACK)) {
Xbox.setLedBlink(ALL); Xbox.setLedBlink(ALL);
Serial.println(F("Back")); Serial.println(F("Back"));
} }
if(Xbox.getButtonClick(L3)) if (Xbox.getButtonClick(L3))
Serial.println(F("L3")); Serial.println(F("L3"));
if(Xbox.getButtonClick(R3)) if (Xbox.getButtonClick(R3))
Serial.println(F("R3")); Serial.println(F("R3"));
if(Xbox.getButtonClick(L1)) if (Xbox.getButtonClick(L1))
Serial.println(F("L1")); Serial.println(F("L1"));
if(Xbox.getButtonClick(R1)) if (Xbox.getButtonClick(R1))
Serial.println(F("R1")); Serial.println(F("R1"));
if(Xbox.getButtonClick(XBOX)) { if (Xbox.getButtonClick(XBOX)) {
Xbox.setLedMode(ROTATING); Xbox.setLedMode(ROTATING);
Serial.println(F("Xbox")); Serial.println(F("Xbox"));
} }
if(Xbox.getButtonClick(A)) if (Xbox.getButtonClick(A))
Serial.println(F("A")); Serial.println(F("A"));
if(Xbox.getButtonClick(B)) if (Xbox.getButtonClick(B))
Serial.println(F("B")); Serial.println(F("B"));
if(Xbox.getButtonClick(X)) if (Xbox.getButtonClick(X))
Serial.println(F("X")); Serial.println(F("X"));
if(Xbox.getButtonClick(Y)) if (Xbox.getButtonClick(Y))
Serial.println(F("Y")); Serial.println(F("Y"));
} }
delay(1); delay(1);

View file

@ -3,42 +3,55 @@
#include <adk.h> #include <adk.h>
USB Usb; USB Usb;
ADK adk(&Usb,"TKJElectronics", // Manufacturer Name ADK adk(&Usb, "TKJElectronics", // Manufacturer Name
"ArduinoBlinkLED", // Model Name "ArduinoBlinkLED", // Model Name
"Example sketch for the USB Host Shield", // Description (user-visible string) "Example sketch for the USB Host Shield", // Description (user-visible string)
"1.0", // Version "1.0", // Version
"http://www.tkjelectronics.dk/uploads/ArduinoBlinkLED.apk", // URL (web page to visit if no installed apps support the accessory) "http://www.tkjelectronics.dk/uploads/ArduinoBlinkLED.apk", // URL (web page to visit if no installed apps support the accessory)
"123456789"); // Serial Number (optional) "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); 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 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) { if (Usb.Init() == -1) {
Serial.print("\r\nOSCOKIRQ failed to assert"); Serial.print("\r\nOSCOKIRQ failed to assert");
while(1); //halt while (1); // halt
} }
pinMode(LED, OUTPUT); pinMode(LED, OUTPUT);
Serial.print("\r\nArduino Blink LED Started"); Serial.print("\r\nArduino Blink LED Started");
} }
void loop() void loop() {
{
Usb.Task(); Usb.Task();
if(adk.isReady()) { if (adk.isReady()) {
uint8_t msg[1]; uint8_t msg[1];
uint16_t len = sizeof(msg); uint16_t len = sizeof(msg);
uint8_t rcode = adk.RcvData(&len, msg); uint8_t rcode = adk.RcvData(&len, msg);
if(rcode && rcode != hrNAK) if (rcode && rcode != hrNAK) {
USBTRACE2("Data rcv. :", rcode); Serial.print(F("\r\nData rcv: "));
if(len > 0) { Serial.print(rcode, HEX);
} else if (len > 0) {
Serial.print(F("\r\nData Packet: ")); Serial.print(F("\r\nData Packet: "));
Serial.print(msg[0]); 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 else
digitalWrite(LED, LOW); digitalWrite(LED, LOW);
} }

@ -1 +1 @@
Subproject commit 7f1fe2f8ec3db4d1bd0a5c516dd379e2539d1303 Subproject commit 139b9c8be59a62e8fb1e8f983ac9bac2b9b9d582

View file

@ -43,12 +43,12 @@ EXTRA_FLAGS += -D USB_HOST_SERIAL=Serial3
#EXTRA_FLAGS += -D DEBUG_USB_HOST #EXTRA_FLAGS += -D DEBUG_USB_HOST
# The following are the libraries used. # The following are the libraries used.
LIB_DIRS = LIB_DIRS += ../../
LIB_DIRS += ../libraries/xmem LIB_DIRS += ../testusbhostFAT/xmem2
LIB_DIRS += ../libraries/USB_Host_Shield_2_0 LIB_DIRS += ../testusbhostFAT/generic_storage
LIB_DIRS += ../libraries/generic_storage LIB_DIRS += ../testusbhostFAT/RTClib
LIB_DIRS += ../libraries/RTClib
LIB_DIRS += $(ARD_HOME)/libraries/Wire LIB_DIRS += $(ARD_HOME)/libraries/Wire
LIB_DIRS += $(ARD_HOME)/libraries/Wire/utility LIB_DIRS += $(ARD_HOME)/libraries/Wire/utility
# And finally, the part that brings everything together for you. # And finally, the part that brings everything together for you.
include ../Arduino_Makefile_master/_Makefile.master include Arduino_Makefile_master/_Makefile.master

@ -1 +1 @@
Subproject commit cb8b5690c7d683e0c24e6894ff05552f83240714 Subproject commit a4bd6f500f70599847de60973371ee973d094a34

@ -1 +1 @@
Subproject commit db5de2fe3c2e0d2d96de98864b1b6e00e172f727 Subproject commit 1d481775b5096a172edf607062278a86e9618a15

View file

@ -47,8 +47,11 @@
///////////////////////////////////////////////////////////// /////////////////////////////////////////////////////////////
// End of Arduino IDE specific hacks // // End of Arduino IDE specific hacks //
///////////////////////////////////////////////////////////// /////////////////////////////////////////////////////////////
#if defined(AVR)
#include <xmem.h> #include <xmem.h>
#else
#include <spi4teensy3.h>
#endif
#if WANT_HUB_TEST #if WANT_HUB_TEST
#include <usbhub.h> #include <usbhub.h>
#endif #endif
@ -59,22 +62,23 @@
#include <FAT/FAT.h> #include <FAT/FAT.h>
#include <Wire.h> #include <Wire.h>
#include <RTClib.h> #include <RTClib.h>
#include <stdio.h>
#if defined(AVR)
static FILE tty_stdio; static FILE tty_stdio;
static FILE tty_stderr; static FILE tty_stderr;
USB Usb; volatile uint32_t LEDnext_time; // fade timeout
volatile uint32_t HEAPnext_time; // when to print out next heap report
#define LED 13 // the pin that the LED is attached to
volatile int brightness = 0; // how bright the LED is volatile int brightness = 0; // how bright the LED is
volatile int fadeAmount = 80; // how many points to fade the LED by volatile int fadeAmount = 80; // how many points to fade the LED by
#endif
USB Usb;
volatile uint8_t current_state = 1; volatile uint8_t current_state = 1;
volatile uint32_t LEDnext_time; // fade timeout
volatile uint8_t last_state = 0; volatile uint8_t last_state = 0;
volatile boolean fatready = false; volatile boolean fatready = false;
volatile boolean partsready = false; volatile boolean partsready = false;
volatile boolean notified = false; volatile boolean notified = false;
volatile uint32_t HEAPnext_time; // when to print out next heap report
volatile boolean runtest = false; volatile boolean runtest = false;
volatile boolean usbon = false; volatile boolean usbon = false;
volatile uint32_t usbon_time; volatile uint32_t usbon_time;
@ -96,6 +100,7 @@ static storage_t sto[_VOLUMES];
#define mbxs 128 #define mbxs 128
static uint8_t My_Buff_x[mbxs]; /* File read buffer */ static uint8_t My_Buff_x[mbxs]; /* File read buffer */
#if defined(AVR)
#define prescale1 ((1 << WGM12) | (1 << CS10)) #define prescale1 ((1 << WGM12) | (1 << CS10))
#define prescale8 ((1 << WGM12) | (1 << CS11)) #define prescale8 ((1 << WGM12) | (1 << CS11))
@ -110,6 +115,11 @@ static int tty_stderr_putc(char c, FILE *t) {
return 0; return 0;
} }
static int tty_stderr_flush(FILE *t) {
USB_HOST_SERIAL.flush();
return 0;
}
static int tty_std_putc(char c, FILE *t) { static int tty_std_putc(char c, FILE *t) {
Serial.write(c); Serial.write(c);
return 0; return 0;
@ -120,6 +130,49 @@ static int tty_std_getc(FILE *t) {
return Serial.read(); return Serial.read();
} }
static int tty_std_flush(FILE *t) {
Serial.flush();
return 0;
}
#else
extern "C" {
int _write(int fd, const char *ptr, int len) {
int j;
for (j = 0; j < len; j++) {
if (fd == 1)
Serial.write(*ptr++);
else if (fd == 2)
USB_HOST_SERIAL.write(*ptr++);
}
return len;
}
int _read(int fd, char *ptr, int len) {
if (len > 0 && fd == 0) {
while (!Serial.available());
*ptr = Serial.read();
return 1;
}
return 0;
}
#include <sys/stat.h>
int _fstat(int fd, struct stat *st) {
memset(st, 0, sizeof (*st));
st->st_mode = S_IFCHR;
st->st_blksize = 1024;
return 0;
}
int _isatty(int fd) {
return (fd < 3) ? 1 : 0;
}
}
#endif
void setup() { void setup() {
boolean serr = false; boolean serr = false;
for (int i = 0; i < _VOLUMES; i++) { for (int i = 0; i < _VOLUMES; i++) {
@ -130,8 +183,10 @@ void setup() {
// Set this to higher values to enable more debug information // Set this to higher values to enable more debug information
// minimum 0x00, maximum 0xff // minimum 0x00, maximum 0xff
UsbDEBUGlvl = 0x51; UsbDEBUGlvl = 0x51;
#if defined(AVR)
// make LED pin as an output: // make LED pin as an output:
pinMode(LED, OUTPUT); pinMode(LED_BUILTIN, OUTPUT);
pinMode(2, OUTPUT); pinMode(2, OUTPUT);
// Ensure TX is off // Ensure TX is off
_SFR_BYTE(UCSR0B) &= ~_BV(TXEN0); _SFR_BYTE(UCSR0B) &= ~_BV(TXEN0);
@ -148,21 +203,26 @@ void setup() {
tty_stdio.get = tty_std_getc; tty_stdio.get = tty_std_getc;
tty_stdio.flags = _FDEV_SETUP_RW; tty_stdio.flags = _FDEV_SETUP_RW;
tty_stdio.udata = 0; tty_stdio.udata = 0;
stdout = &tty_stdio;
stdin = &tty_stdio;
tty_stderr.put = tty_stderr_putc; tty_stderr.put = tty_stderr_putc;
tty_stderr.get = NULL; tty_stderr.get = NULL;
tty_stderr.flags = _FDEV_SETUP_WRITE; tty_stderr.flags = _FDEV_SETUP_WRITE;
tty_stderr.udata = 0; tty_stderr.udata = 0;
stdout = &tty_stdio;
stdin = &tty_stdio;
stderr = &tty_stderr; stderr = &tty_stderr;
// Blink LED // Blink LED
delay(500); delay(500);
analogWrite(LED, 255); analogWrite(LED_BUILTIN, 255);
delay(500); delay(500);
analogWrite(LED, 0); analogWrite(LED_BUILTIN, 0);
delay(500); delay(500);
#else
while (!Serial);
#endif
printf_P(PSTR("\r\n\n\n\n\n\n\n\n\n\n\n\n\n\n\nStart\r\n")); printf_P(PSTR("\r\n\n\n\n\n\n\n\n\n\n\n\n\n\n\nStart\r\n"));
printf_P(PSTR("Current UsbDEBUGlvl %02x\r\n"), UsbDEBUGlvl); printf_P(PSTR("Current UsbDEBUGlvl %02x\r\n"), UsbDEBUGlvl);
printf_P(PSTR("'+' and '-' increase/decrease by 0x01\r\n")); printf_P(PSTR("'+' and '-' increase/decrease by 0x01\r\n"));
@ -187,17 +247,19 @@ void setup() {
#endif #endif
"\r\n")); "\r\n"));
} }
analogWrite(LED, 255); #if defined(AVR)
analogWrite(LED_BUILTIN, 255);
delay(500); delay(500);
analogWrite(LED, 0); analogWrite(LED_BUILTIN, 0);
delay(500); delay(500);
analogWrite(LED, 255); analogWrite(LED_BUILTIN, 255);
delay(500); delay(500);
analogWrite(LED, 0); analogWrite(LED_BUILTIN, 0);
delay(500); delay(500);
analogWrite(LED, 255); analogWrite(LED_BUILTIN, 255);
delay(500); delay(500);
analogWrite(LED, 0); analogWrite(LED_BUILTIN, 0);
delay(500); delay(500);
LEDnext_time = millis() + 1; LEDnext_time = millis() + 1;
@ -206,6 +268,7 @@ void setup() {
#endif #endif
printf_P(PSTR("Available heap: %u Bytes\r\n"), freeHeap()); printf_P(PSTR("Available heap: %u Bytes\r\n"), freeHeap());
printf_P(PSTR("SP %x\r\n"), (uint8_t *)(SP)); printf_P(PSTR("SP %x\r\n"), (uint8_t *)(SP));
#endif
// Even though I'm not going to actually be deleting, // Even though I'm not going to actually be deleting,
// I want to be able to have slightly more control. // I want to be able to have slightly more control.
@ -213,7 +276,9 @@ void setup() {
#if WANT_HUB_TEST #if WANT_HUB_TEST
for (int i = 0; i < MAX_HUBS; i++) { for (int i = 0; i < MAX_HUBS; i++) {
Hubs[i] = new USBHub(&Usb); Hubs[i] = new USBHub(&Usb);
#if defined(AVR)
printf_P(PSTR("Available heap: %u Bytes\r\n"), freeHeap()); printf_P(PSTR("Available heap: %u Bytes\r\n"), freeHeap());
#endif
} }
#endif #endif
// Initialize generic storage. This must be done before USB starts. // Initialize generic storage. This must be done before USB starts.
@ -223,10 +288,8 @@ void setup() {
printf_P(PSTR("No USB HOST Shield?\r\n")); printf_P(PSTR("No USB HOST Shield?\r\n"));
Notify(PSTR("OSC did not start."), 0x40); Notify(PSTR("OSC did not start."), 0x40);
} }
// usb VBUS _OFF_
//Usb.gpioWr(0x00); #if defined(AVR)
//digitalWrite(2, 0);
//usbon_time = millis() + 2000;
cli(); cli();
TCCR3A = 0; TCCR3A = 0;
TCCR3B = 0; TCCR3B = 0;
@ -237,6 +300,32 @@ void setup() {
sei(); sei();
HEAPnext_time = millis() + 10000; HEAPnext_time = millis() + 10000;
#else
#if 0
//
// On the teensy 3 we can raise the speed of SPI here.
//
// Default seen is 0xB8011001.
//
uint32_t ctar = SPI0_CTAR0;
//printf("SPI_CTAR0 = %8.8X\r\n", ctar);
ctar &= 0x7FFCFFF0; // 1/4 fSYS, 12.5Mhz
//printf("SPI_CTAR0 = %8.8X\r\n", ctar);
ctar |= 0x80000000; // 1/2 fSYS 25Mhz
//printf("SPI_CTAR0 = %8.8X\r\n", ctar);
uint32_t mcr = SPI0_MCR;
if (mcr & SPI_MCR_MDIS) {
SPI0_CTAR0 = ctar;
} else {
SPI0_MCR = mcr | SPI_MCR_MDIS | SPI_MCR_HALT;
SPI0_CTAR0 = ctar;
SPI0_MCR = mcr;
}
#endif
#endif
} }
void serialEvent() { void serialEvent() {
@ -278,12 +367,14 @@ void serialEvent() {
} }
} }
#if defined(AVR)
ISR(TIMER3_COMPA_vect) { ISR(TIMER3_COMPA_vect) {
if (millis() >= LEDnext_time) { if (millis() >= LEDnext_time) {
LEDnext_time = millis() + 30; LEDnext_time = millis() + 30;
// set the brightness of LED // set the brightness of LED
analogWrite(LED, brightness); analogWrite(LED_BUILTIN, brightness);
// change the brightness for next time through the loop: // change the brightness for next time through the loop:
brightness = brightness + fadeAmount; brightness = brightness + fadeAmount;
@ -299,6 +390,7 @@ ISR(TIMER3_COMPA_vect) {
} }
} }
} }
#endif
bool isfat(uint8_t t) { bool isfat(uint8_t t) {
return (t == 0x01 || t == 0x04 || t == 0x06 || t == 0x0b || t == 0x0c || t == 0x0e || t == 0x1); return (t == 0x01 || t == 0x04 || t == 0x06 || t == 0x0b || t == 0x0c || t == 0x0e || t == 0x1);
@ -312,6 +404,7 @@ void die(FRESULT rc) {
void loop() { void loop() {
FIL My_File_Object_x; /* File object */ FIL My_File_Object_x; /* File object */
#if defined(AVR)
// Print a heap status report about every 10 seconds. // Print a heap status report about every 10 seconds.
if (millis() >= HEAPnext_time) { if (millis() >= HEAPnext_time) {
if (UsbDEBUGlvl > 0x50) { if (UsbDEBUGlvl > 0x50) {
@ -319,7 +412,11 @@ void loop() {
} }
HEAPnext_time = millis() + 10000; HEAPnext_time = millis() + 10000;
} }
TCCR3B = 0;
#else
// Arm suffers here, oh well...
serialEvent();
#endif
// Horrid! This sort of thing really belongs in an ISR, not here! // Horrid! This sort of thing really belongs in an ISR, not here!
// We also will be needing to test each hub port, we don't do this yet! // We also will be needing to test each hub port, we don't do this yet!
if (!change && !usbon && millis() >= usbon_time) { if (!change && !usbon && millis() >= usbon_time) {
@ -342,11 +439,15 @@ void loop() {
if (current_state != last_state) { if (current_state != last_state) {
if (UsbDEBUGlvl > 0x50) if (UsbDEBUGlvl > 0x50)
printf_P(PSTR("USB state = %x\r\n"), current_state); printf_P(PSTR("USB state = %x\r\n"), current_state);
#if defined(AVR)
if (current_state == USB_STATE_RUNNING) { if (current_state == USB_STATE_RUNNING) {
fadeAmount = 30; fadeAmount = 30;
} }
#endif
if (current_state == USB_DETACHED_SUBSTATE_WAIT_FOR_DEVICE) { if (current_state == USB_DETACHED_SUBSTATE_WAIT_FOR_DEVICE) {
#if defined(AVR)
fadeAmount = 80; fadeAmount = 80;
#endif
partsready = false; partsready = false;
for (int i = 0; i < cpart; i++) { for (int i = 0; i < cpart; i++) {
if (Fats[i] != NULL) if (Fats[i] != NULL)
@ -365,10 +466,10 @@ void loop() {
if (partsready && !fatready) { if (partsready && !fatready) {
if (cpart > 0) fatready = true; if (cpart > 0) fatready = true;
} }
// This is horrible, and needs to be moved elsewhere! // This is horrible, and needs to be moved elsewhere!
for (int B = 0; B < MAX_USB_MS_DRIVERS; B++) { for (int B = 0; B < MAX_USB_MS_DRIVERS; B++) {
if (!partsready && Bulk[B]->GetAddress() != NULL) { if (!partsready && (Bulk[B]->GetAddress() != NULL)) {
// Build a list. // Build a list.
int ML = Bulk[B]->GetbMaxLUN(); int ML = Bulk[B]->GetbMaxLUN();
//printf("MAXLUN = %i\r\n", ML); //printf("MAXLUN = %i\r\n", ML);
@ -376,8 +477,8 @@ void loop() {
for (int i = 0; i < ML; i++) { for (int i = 0; i < ML; i++) {
if (Bulk[B]->LUNIsGood(i)) { if (Bulk[B]->LUNIsGood(i)) {
partsready = true; partsready = true;
((pvt_t *)sto[i].private_data)->lun = i; ((pvt_t *)(sto[i].private_data))->lun = i;
((pvt_t *)sto[i].private_data)->B = B; ((pvt_t *)(sto[i].private_data))->B = B;
sto[i].Read = *PRead; sto[i].Read = *PRead;
sto[i].Write = *PWrite; sto[i].Write = *PWrite;
sto[i].Reads = *PReads; sto[i].Reads = *PReads;
@ -440,7 +541,9 @@ void loop() {
p = ((struct Pvt *)(Fats[0]->storage->private_data)); p = ((struct Pvt *)(Fats[0]->storage->private_data));
if (!Bulk[p->B]->LUNIsGood(p->lun)) { if (!Bulk[p->B]->LUNIsGood(p->lun)) {
// media change // media change
#if defined(AVR)
fadeAmount = 80; fadeAmount = 80;
#endif
partsready = false; partsready = false;
for (int i = 0; i < cpart; i++) { for (int i = 0; i < cpart; i++) {
if (Fats[i] != NULL) if (Fats[i] != NULL)
@ -459,11 +562,13 @@ void loop() {
UINT bw, br, i; UINT bw, br, i;
if (!notified) { if (!notified) {
#if defined(AVR)
fadeAmount = 5; fadeAmount = 5;
#endif
notified = true; notified = true;
printf_P(PSTR("\r\nOpen an existing file (message.txt).\r\n")); printf_P(PSTR("\r\nOpen an existing file (message.txt).\r\n"));
rc = f_open(&My_File_Object_x, "0:/MESSAGE.TXT", FA_READ); rc = f_open(&My_File_Object_x, "0:/MESSAGE.TXT", FA_READ);
if (rc) printf_P(PSTR("Error %i, message.txt not found.\r\n")); if (rc) printf_P(PSTR("Error %i, message.txt not found.\r\n"), rc);
else { else {
printf_P(PSTR("\r\nType the file content.\r\n")); printf_P(PSTR("\r\nType the file content.\r\n"));
for (;;) { for (;;) {
@ -522,7 +627,9 @@ outdir:
} }
printf_P(PSTR("\r\nDirectory listing...\r\n")); printf_P(PSTR("\r\nDirectory listing...\r\n"));
#if defined(AVR)
printf_P(PSTR("Available heap: %u Bytes\r\n"), freeHeap()); printf_P(PSTR("Available heap: %u Bytes\r\n"), freeHeap());
#endif
for (;;) { for (;;) {
#if _USE_LFN #if _USE_LFN
My_File_Info_Object_x.lfsize = _MAX_LFN; My_File_Info_Object_x.lfsize = _MAX_LFN;
@ -583,7 +690,9 @@ out:
rc = f_open(&My_File_Object_x, "0:/10MB.bin", FA_WRITE | FA_CREATE_ALWAYS); rc = f_open(&My_File_Object_x, "0:/10MB.bin", FA_WRITE | FA_CREATE_ALWAYS);
if (rc) goto failed; if (rc) goto failed;
for (bw = 0; bw < mbxs; bw++) My_Buff_x[bw] = bw & 0xff; for (bw = 0; bw < mbxs; bw++) My_Buff_x[bw] = bw & 0xff;
fflush(stdout);
start = millis(); start = millis();
while (start == millis());
for (ii = 10485760LU / mbxs; ii > 0LU; ii--) { for (ii = 10485760LU / mbxs; ii > 0LU; ii--) {
rc = f_write(&My_File_Object_x, My_Buff_x, mbxs, &bw); rc = f_write(&My_File_Object_x, My_Buff_x, mbxs, &bw);
if (rc || !bw) goto failed; if (rc || !bw) goto failed;
@ -591,10 +700,12 @@ out:
rc = f_close(&My_File_Object_x); rc = f_close(&My_File_Object_x);
if (rc) goto failed; if (rc) goto failed;
end = millis(); end = millis();
wt = end - start; wt = (end - start) - 1;
printf_P(PSTR("Time to write 10485760 bytes: %lu ms (%lu sec) \r\n"), wt, (500 + wt) / 1000UL); printf_P(PSTR("Time to write 10485760 bytes: %lu ms (%lu sec) \r\n"), wt, (500 + wt) / 1000UL);
rc = f_open(&My_File_Object_x, "0:/10MB.bin", FA_READ); rc = f_open(&My_File_Object_x, "0:/10MB.bin", FA_READ);
fflush(stdout);
start = millis(); start = millis();
while (start == millis());
if (rc) goto failed; if (rc) goto failed;
for (;;) { for (;;) {
rc = f_read(&My_File_Object_x, My_Buff_x, mbxs, &bw); /* Read a chunk of file */ rc = f_read(&My_File_Object_x, My_Buff_x, mbxs, &bw); /* Read a chunk of file */
@ -604,7 +715,7 @@ out:
if (rc) goto failed; if (rc) goto failed;
rc = f_close(&My_File_Object_x); rc = f_close(&My_File_Object_x);
if (rc) goto failed; if (rc) goto failed;
rt = end - start; rt = (end - start) - 1;
printf_P(PSTR("Time to read 10485760 bytes: %lu ms (%lu sec)\r\nDelete test file\r\n"), rt, (500 + rt) / 1000UL); printf_P(PSTR("Time to read 10485760 bytes: %lu ms (%lu sec)\r\nDelete test file\r\n"), rt, (500 + rt) / 1000UL);
failed: failed:
if (rc) die(rc); if (rc) die(rc);
@ -613,3 +724,4 @@ failed:
} }
} }
} }

@ -1 +1 @@
Subproject commit 16374f681b31d411661b7bd9ff5e578b2dff6843 Subproject commit 9fe733d35304dec1ebe750f5f13f868def2fcfe4

View file

@ -34,7 +34,10 @@ PS3USB KEYWORD1
# Methods and Functions (KEYWORD2) # Methods and Functions (KEYWORD2)
#################################################### ####################################################
setBdaddr KEYWORD2 setBdaddr KEYWORD2
getBdaddr KEYWORD2
setMoveBdaddr KEYWORD2 setMoveBdaddr KEYWORD2
getMoveBdaddr KEYWORD2
getMoveCalibration KEYWORD2
getButtonPress KEYWORD2 getButtonPress KEYWORD2
getButtonClick KEYWORD2 getButtonClick KEYWORD2