]>
git.gir.st - tmk_keyboard.git/blob - tmk_core/protocol/usb_hid/USB_Host_Shield_2.0/PSBuzz.cpp
1 /* Copyright (C) 2014 Kristian Lauszus, TKJ Electronics. All rights reserved.
3 This software may be distributed and modified under the terms of the GNU
4 General Public License version 2 (GPL2) as published by the Free Software
5 Foundation and appearing in the file GPL2.TXT included in the packaging of
6 this file. Please note that GPL2 Section 2[b] requires that all works based
7 on this software must also be made publicly available under the terms of
13 Kristian Lauszus, TKJ Electronics
14 Web : http://www.tkjelectronics.com
15 e-mail : kristianl@tkjelectronics.com
20 // To enable serial debugging see "settings.h"
21 //#define PRINTREPORT // Uncomment to print the report send by the PS Buzz Controllers
23 void PSBuzz :: ParseHIDData ( HID
* hid
, bool is_rpt_id
, uint8_t len
, uint8_t * buf
) {
24 if ( HIDUniversal :: VID
== PSBUZZ_VID
&& HIDUniversal :: PID
== PSBUZZ_PID
&& len
> 2 && buf
) {
26 Notify ( PSTR ( " \r\n " ), 0x80 );
27 for ( uint8_t i
= 0 ; i
< len
; i
++) {
28 D_PrintHex
< uint8_t > ( buf
[ i
], 0x80 );
29 Notify ( PSTR ( " " ), 0x80 );
32 memcpy (& psbuzzButtons
, buf
+ 2 , min (( uint8_t )( len
- 2 ), sizeof ( psbuzzButtons
)));
34 if ( psbuzzButtons
. val
!= oldButtonState
. val
) { // Check if anything has changed
35 buttonClickState
. val
= psbuzzButtons
. val
& ~ oldButtonState
. val
; // Update click state variable
36 oldButtonState
. val
= psbuzzButtons
. val
;
41 uint8_t PSBuzz :: OnInitSuccessful () {
42 if ( HIDUniversal :: VID
== PSBUZZ_VID
&& HIDUniversal :: PID
== PSBUZZ_PID
) {
45 pFuncOnInit (); // Call the user function
47 setLedOnAll (); // Turn the LED on, on all four controllers
52 bool PSBuzz :: getButtonPress ( ButtonEnum b
, uint8_t controller
) {
53 return psbuzzButtons
. val
& ( 1UL << ( b
+ 5 * controller
)); // Each controller uses 5 bits, so the value is shifted 5 for each controller
56 bool PSBuzz :: getButtonClick ( ButtonEnum b
, uint8_t controller
) {
57 uint32_t mask
= ( 1UL << ( b
+ 5 * controller
)); // Each controller uses 5 bits, so the value is shifted 5 for each controller
58 bool click
= buttonClickState
. val
& mask
;
59 buttonClickState
. val
&= ~ mask
; // Clear "click" event
63 // Source: http://www.developerfusion.com/article/84338/making-usb-c-friendly/ and https://github.com/torvalds/linux/blob/master/drivers/hid/hid-sony.c
64 void PSBuzz :: setLedRaw ( bool value
, uint8_t controller
) {
65 ledState
[ controller
] = value
; // Save value for next time it is called
69 buf
[ 1 ] = ledState
[ 0 ] ? 0xFF : 0x00 ;
70 buf
[ 2 ] = ledState
[ 1 ] ? 0xFF : 0x00 ;
71 buf
[ 3 ] = ledState
[ 2 ] ? 0xFF : 0x00 ;
72 buf
[ 4 ] = ledState
[ 3 ] ? 0xFF : 0x00 ;
76 PSBuzz_Command ( buf
, sizeof ( buf
));
79 void PSBuzz :: PSBuzz_Command ( uint8_t * data
, uint16_t nbytes
) {
80 // bmRequest = Host to device (0x00) | Class (0x20) | Interface (0x01) = 0x21, bRequest = Set Report (0x09), Report ID (0x00), Report Type (Output 0x02), interface (0x00), datalength, datalength, data)
81 pUsb
-> ctrlReq ( bAddress
, epInfo
[ 0 ]. epAddr
, bmREQ_HID_OUT
, HID_REQUEST_SET_REPORT
, 0x00 , 0x02 , 0x00 , nbytes
, nbytes
, data
, NULL
);