Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Bluetooth Connection issue #64

Open
shubshub opened this issue Feb 16, 2017 · 11 comments
Open

Bluetooth Connection issue #64

shubshub opened this issue Feb 16, 2017 · 11 comments

Comments

@shubshub
Copy link

shubshub commented Feb 16, 2017

So I've been looking at a few different places on sending data to the Dualshock 4 over Bluetooth, I've done the CRC-32 Hash I've got the report ID and everything according to the program there are no errors, However nothing was happening when I did device.write(buff) atleast not from what I could see

I don't know if I was sending the data wrong if I was missing just the tiniest thing, but reading more into it according to what this is saying here
http://www.spinics.net/lists/linux-input/msg29517.html

image

The last bit (The comments at the bottom) state that the USB stuff is output reports (Which I assume is the basic device.write since that worked perfectly over USB) and I'm guessing by SET_REPORT is a send Feature Report? as said here https://github.com/torvalds/linux/blob/7ae123edd37a47e178eb9a6631fe4a7108262c10/include/linux/hid.h#L738

Here is an image of the data I am trying to send to the Feature Report and also it failing
image

  • For sendFeatureReport native code see Line 343 in HID.cc
  • For hid_send_feature_report native code see line 749 in hidapi\windows\hid.c

I've also been reading over http://www.psdevwiki.com/ps4/DS4-BT However it has only been minimal help to me and hasn't actually helped me figure out what I am doing incorrectly.

If anyone or even you have any suggestions that would be excellent :)

Basically I am trying to set the LED lights on the Controller and also the rumble motors

17,128,0,255,4,0,45,47,18,18,18,255,255,0,0,0,0,0,0,0,0,0,67,67,0,77,133,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,233,3,16,74
rumbleLeft: 45, // 0-255 (Rumble left intensity)
rumbleRight: 47, // 0-255 (Rumble right intensity)
red: 18, // 0-255 (Red intensity)
green: 18, // 0-255 (Blue intensity)
blue: 18, // 0-255 (Green intensity)
flashOn: 255, // 0-255 (Flash on time)
flashOff: 255 // 0-255 (Flash off time)

@todbot
Copy link

todbot commented Feb 19, 2017

Hi,

This repo: https://github.com/todbot/node-hid-ds4-test
is an example of being able to set the rumble and LED on a DS4 over Bluetooth.

However, upon sending the output report to update the rumble & LED, the controller stops streaming data on reportId 1. It's unclear to me why this happens or how to restart it. Other drivers seem to switch to getting input data from reportId 11, but I've not seen exactly how to enable that either.

If anyone has further insight into what's going on, please help. Thanks!

@shubshub
Copy link
Author

shubshub commented Feb 19, 2017

So I replicated what you did there however I seem to be getting a negative number on the last crc32 byte, Why is this happening? @todbot

Also I already know about the reportId 11 input thing I've solved that on my end you just read the controller data but ignore the first 2-3 bytes

@todbot
Copy link

todbot commented Feb 19, 2017

it's not negative. These are bytes, not numbers. Javascript console output just represents them incorrectly.

Please post working code about how you solved it, when taking into account updating the rumble & LED.

@shubshub
Copy link
Author

shubshub commented Feb 19, 2017

Idk what I'm doing wrong but your code doesn't do anything to my controller :/ Did it work for you?

Also for the ReportID 11 thing just do data.slice(2) and feed that into the button check

image
This is my output and the controller stuff doesn't change at all

For what its worth it must be something else because it works flawlessly with DS4Windows but obviously I'm trying to make a game with this LED thing so I cant just use DS4Windows

Here is the code I used by the way,

CRC Code
http://pastebin.com/KiazwqCu

this.setExtras = function(data) {
		device.getFeatureReport(0x02, 78); //Set the Report ID to 0x11 for the Input thingy
        let buff = Array(78-4).fill(0);
		//alert(JSON.stringify(data));
        /*Object.keys(data).forEach(k => {
            buff[indexes[k]] = data[k];
        });*/
		buff[0] = 0x11;
		buff[1] = 0x80;
		buff[3] = 0x0f;
		buff[6] = data["rumbleRight"];
		buff[7] = data["rumbleLeft"];
		buff[8] = data["red"];
		buff[9] = data["green"];
		buff[10] = data["blue"];
		buff[11] = data["flashOn"];
		buff[12] = data["flashOff"];
		//buff[4] = 0x04;
		//buff[22] = 0x43;
		//buff[23] = 0x43;
		//buff[25] = 0x4d;
		//buff[26] = 0x85;
		
		//alert(buff[0]);
		//alert(buff.length);
		var tempBuff = buff.slice(0);
		tempBuff.unshift(0xA2);
		var crc32 = calcAndDisplayCrc( tempBuff );
		console.log(crc32);
		//crc32 = new Uint8Array((new Int32Array([crc32])).buffer)
		buff[74] = crc32[3];//(crc32 & 0x000000ff) >> 0;
		buff[75] = crc32[2];//(crc32 & 0x0000ff00) >> 8;
		buff[76] = crc32[1];//(crc32 & 0x00ff0000) >> 16;
		buff[77] = crc32[0];//(crc32 & 0xff000000) >> 24;
		console.log(crc32);
		console.log("outbuf:","len:",buff.length, "vals:",buff.join(','));
		globalTempBuff = buff;
		//device.read(function(data){console.log(data)});
		//b4b57cf9
		//294A3A3323
		//let temp = buff;
		//temp.unshift(0x02)

image

At this rate I'm probably going to end up writing my own dualshock library :P with credit to @rdepena for any borrowed code

@shubshub
Copy link
Author

I'm gonna have another crack at trying to figure this out when I get home tonight (roughly 6-12 hours) I know its not because of the bluetooth adapter because it works perfectly fine with DS4Windows but I cant figure out why, even after doing some debugging of the DS4Windows source didnt help that much (Except with the reportid 11 controller data stuff) If you wanna try and get it before me then please do share :D

@shubshub
Copy link
Author

shubshub commented Feb 20, 2017

Did you have any luck? (Assuming it didn't already work with your own personal controller)

@shubshub
Copy link
Author

I've updated my comment above with a code that you can just copy paste to test it if you want @todbot @rdepena

@connorc0405
Copy link

@todbot Have you figured out how to receive input reports after setting rumble & LEDs?

@Pecacheu
Copy link

Pecacheu commented Jan 11, 2018

Moved comment to: node-hid/node-hid#184 (comment)

@todbot
Copy link

todbot commented Jan 11, 2018

This sounds like an issue for hidapi then? I'd ask about it there https://github.com/signal11/hidapi
(because node-hid is just a simple wrapper around hidapi)

@Pecacheu
Copy link

Okay, I'll move it to node-hid #184...

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

4 participants