Hopefully did not break other things... Find that the PS4 requires you to ask to connect versus some/most other devices will do the request... Also found issue without printing, where adding a delay(1) in a couple of places appears to help when Serial1 printing is not onmain
| @@ -555,8 +555,9 @@ private: | |||
| BTHIDInput *next = NULL; | |||
| friend class BluetoothController; | |||
| protected: | |||
| strbuf_t *btstrbuf; | |||
| uint8_t needs_connect_to_device = false; | |||
| Device_t *btdevice = NULL; | |||
| }; | |||
| @@ -1637,10 +1638,9 @@ public: | |||
| // BUGBUG version to allow some of the controlled objects to call? | |||
| void sendL2CapCommand(uint8_t* data, uint8_t nbytes, uint8_t channelLow = 0x01, uint8_t channelHigh = 0x00) { | |||
| //sendL2CapCommand(device_connection_handle_, data, nbytes, control_scid_ & 0xff, control_scid_ >> 8); | |||
| USBHDBGSerial.printf("sendL2CapCommand: %x %d %x %x : control: %x\n", (uint32_t)data, nbytes, channelLow, channelHigh, control_scid_); | |||
| sendL2CapCommand (device_connection_handle_, data, nbytes, channelLow, channelHigh); | |||
| } | |||
| } | |||
| protected: | |||
| virtual bool claim(Device_t *device, int type, const uint8_t *descriptors, uint32_t len); | |||
| @@ -29,8 +29,9 @@ | |||
| #define print USBHost::print_ | |||
| #define println USBHost::println_//#define DEBUG_BT | |||
| //#define DEBUG_BT | |||
| #define DEBUG_BT_VERBOSE | |||
| //#define DEBUG_BT_VERBOSE | |||
| #ifndef DEBUG_BT | |||
| #undef DEBUG_BT_VERBOSE | |||
| @@ -701,6 +702,11 @@ void BluetoothController::handle_hci_connection_complete() { | |||
| if (do_pair_device_) { | |||
| sendHCIAuthenticationRequested(); | |||
| pending_control_ = PC_AUTHENTICATION_REQUESTED; | |||
| } else if (device_driver_ && device_driver_->needs_connect_to_device) { | |||
| DBGPrintf(" Needs connect to device(PS4?)\n"); | |||
| // The PS4 requires a connection request to it. | |||
| delay(1); | |||
| sendl2cap_ConnectionRequest(device_connection_handle_, connection_rxid_, control_dcid_, HID_CTRL_PSM); | |||
| } | |||
| } | |||
| @@ -1128,6 +1134,7 @@ void BluetoothController::tx_data(const Transfer_t *transfer) | |||
| #endif | |||
| switch (pending_control_tx_) { | |||
| case STATE_TX_SEND_CONNECT_INT: | |||
| delay(1); | |||
| connection_rxid_++; | |||
| sendl2cap_ConnectionRequest(device_connection_handle_, connection_rxid_, interrupt_dcid_, HID_INTR_PSM); | |||
| pending_control_tx_ = 0; | |||
| @@ -1263,10 +1270,15 @@ void BluetoothController::process_l2cap_config_response(uint8_t *data) { | |||
| // Set HID Boot mode | |||
| setHIDProtocol(HID_BOOT_PROTOCOL); // | |||
| //setHIDProtocol(HID_RPT_PROTOCOL); //HID_RPT_PROTOCOL | |||
| if (do_pair_device_) | |||
| if (do_pair_device_) { | |||
| pending_control_tx_ = STATE_TX_SEND_CONNECT_INT; | |||
| else | |||
| } else if (device_driver_ && device_driver_->needs_connect_to_device) { | |||
| DBGPrintf(" Needs connect to device INT(PS4?)\n"); | |||
| // The PS4 requires a connection request to it. | |||
| pending_control_tx_ = STATE_TX_SEND_CONNECT_INT; | |||
| } else { | |||
| pending_control_ = 0; | |||
| } | |||
| } else if (scid == interrupt_dcid_) { | |||
| // Enable SCan to page mode | |||
| sendHCIWriteScanEnable(2); | |||
| @@ -235,7 +235,7 @@ bool JoystickController::transmitPS4UserFeedbackMsg() { | |||
| // 9, 10 flash ON, OFF times in 100ths of sedond? 2.5 seconds = 255 | |||
| USBHDBGSerial.printf("Joystick update Rumble/LEDs\n"); | |||
| btdriver_->sendL2CapCommand(packet, sizeof(packet), 0x42, 0x00); | |||
| btdriver_->sendL2CapCommand(packet, sizeof(packet), 0x41, 0x00); | |||
| return true; | |||
| } | |||
| @@ -702,7 +702,7 @@ bool JoystickController::process_bluetooth_HID_data(const uint8_t *data, uint16_ | |||
| axis[i] = data[i]; | |||
| } | |||
| mask <<= 1; // shift down the mask. | |||
| //USBHDBGSerial.printf("%02x ", axisPS4[i]); | |||
| //USBHDBGSerial.printf("%02x ", axis[i]); | |||
| } | |||
| //USBHDBGSerial.printf("\n"); | |||
| joystickEvent = true; | |||
| @@ -717,6 +717,7 @@ void JoystickController::remoteNameComplete(const uint8_t *remoteName) | |||
| if (strncmp((const char *)remoteName, "Wireless Controller", 19) == 0) { | |||
| USBHDBGSerial.printf(" JoystickController::remoteNameComplete %s - set to PS4\n", remoteName); | |||
| needs_connect_to_device = true; // We need to force this. | |||
| joystickType = PS4; | |||
| } | |||
| @@ -727,6 +728,7 @@ void JoystickController::release_bluetooth() | |||
| btdevice = nullptr; // remember this way | |||
| btdriver_ = nullptr; | |||
| connected_ = false; | |||
| needs_connect_to_device = false; | |||
| } | |||