USB Host Shield 2.0
Loading...
Searching...
No Matches
PSBuzz.cpp
Go to the documentation of this file.
1
/* Copyright (C) 2014 Kristian Lauszus, TKJ Electronics. All rights reserved.
2
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
8
the GPL2 ("Copyleft").
9
10
Contact information
11
-------------------
12
13
Kristian Lauszus, TKJ Electronics
14
Web : http://www.tkjelectronics.com
15
e-mail : kristianl@tkjelectronics.com
16
*/
17
18
#include "
PSBuzz.h
"
19
20
// To enable serial debugging see "settings.h"
21
//#define PRINTREPORT // Uncomment to print the report send by the PS Buzz Controllers
22
23
void
PSBuzz::ParseHIDData
(
USBHID
*
hid
__attribute__
((unused)),
bool
is_rpt_id
__attribute__
((unused)),
uint8_t
len
,
uint8_t
*
buf
) {
24
if
(
HIDUniversal::VID
==
PSBUZZ_VID
&&
HIDUniversal::PID
==
PSBUZZ_PID
&&
len
> 2 &&
buf
) {
25
#ifdef PRINTREPORT
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);
30
}
31
#endif
32
memcpy
(&psbuzzButtons,
buf
+ 2,
min
((
uint8_t
)(
len
- 2),
MFK_CASTUINT8T
sizeof
(psbuzzButtons)));
33
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
;
37
}
38
}
39
};
40
41
uint8_t
PSBuzz::OnInitSuccessful
() {
42
if
(
HIDUniversal::VID
==
PSBUZZ_VID
&&
HIDUniversal::PID
==
PSBUZZ_PID
) {
43
Reset
();
44
if
(pFuncOnInit)
45
pFuncOnInit();
// Call the user function
46
else
47
setLedOnAll
();
// Turn the LED on, on all four controllers
48
};
49
return
0;
50
};
51
52
int8_t
PSBuzz::getButtonIndexBuzz(
ButtonEnum
b) {
53
const
int8_t
index =
ButtonIndex
(b);
54
if
(index > 4)
return
-1;
// 5 buttons, 0-4 inclusive
55
return
index;
56
}
57
58
bool
PSBuzz::getButtonPress
(
ButtonEnum
b,
uint8_t
controller
) {
59
const
int8_t
index = getButtonIndexBuzz(b);
if
(index < 0)
return
0;
60
return
psbuzzButtons.
val
& (1UL << (index + 5 *
controller
));
// Each controller uses 5 bits, so the value is shifted 5 for each controller
61
};
62
63
bool
PSBuzz::getButtonClick
(
ButtonEnum
b,
uint8_t
controller
) {
64
const
int8_t
index = getButtonIndexBuzz(b);
if
(index < 0)
return
0;
65
uint32_t
mask
= (1UL << (index + 5 *
controller
));
// Each controller uses 5 bits, so the value is shifted 5 for each controller
66
bool
click
= buttonClickState.
val
&
mask
;
67
buttonClickState.
val
&=
~mask
;
// Clear "click" event
68
return
click
;
69
};
70
71
// Source: http://www.developerfusion.com/article/84338/making-usb-c-friendly/ and https://github.com/torvalds/linux/blob/master/drivers/hid/hid-sony.c
72
void
PSBuzz::setLedRaw
(
bool
value
,
uint8_t
controller
) {
73
ledState[
controller
] =
value
;
// Save value for next time it is called
74
75
uint8_t
buf
[7];
76
buf
[0] = 0x00;
77
buf
[1] = ledState[0] ? 0xFF : 0x00;
78
buf
[2] = ledState[1] ? 0xFF : 0x00;
79
buf
[3] = ledState[2] ? 0xFF : 0x00;
80
buf
[4] = ledState[3] ? 0xFF : 0x00;
81
buf
[5] = 0x00;
82
buf
[6] = 0x00;
83
84
PSBuzz_Command(
buf
,
sizeof
(
buf
));
85
};
86
87
void
PSBuzz::PSBuzz_Command(
uint8_t
*data,
uint16_t
nbytes
) {
88
// 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)
89
pUsb
->
ctrlReq
(
bAddress
,
epInfo
[0].epAddr,
bmREQ_HID_OUT
,
HID_REQUEST_SET_REPORT
, 0x00, 0x02, 0x00,
nbytes
,
nbytes
, data,
NULL
);
90
};
PSBuzz.h
PSBUZZ_PID
#define PSBUZZ_PID
Definition
PSBuzz.h:25
PSBUZZ_VID
#define PSBUZZ_VID
Definition
PSBuzz.h:24
ConfigDescParser
Definition
confdescparser.h:47
HIDComposite::PID
uint16_t PID
Definition
hidcomposite.h:71
HIDComposite::epInfo
EpInfo epInfo[totalEndpoints]
Definition
hidcomposite.h:63
HIDComposite::VID
uint16_t VID
Definition
hidcomposite.h:71
PSBuzz::getButtonPress
bool getButtonPress(ButtonEnum b, uint8_t controller=0)
Definition
PSBuzz.cpp:58
PSBuzz::Reset
void Reset()
Definition
PSBuzz.h:157
PSBuzz::ParseHIDData
void ParseHIDData(USBHID *hid, bool is_rpt_id, uint8_t len, uint8_t *buf)
Definition
PSBuzz.cpp:23
PSBuzz::setLedOnAll
void setLedOnAll()
Definition
PSBuzz.h:114
PSBuzz::getButtonClick
bool getButtonClick(ButtonEnum b, uint8_t controller=0)
Definition
PSBuzz.cpp:63
PSBuzz::OnInitSuccessful
uint8_t OnInitSuccessful()
Definition
PSBuzz.cpp:41
PSBuzz::setLedRaw
void setLedRaw(bool value, uint8_t controller=0)
Definition
PSBuzz.cpp:72
USBHID
Definition
usbhid.h:143
USBHID::bAddress
uint8_t bAddress
Definition
usbhid.h:146
USBHID::pUsb
USB * pUsb
Definition
usbhid.h:145
USB::ctrlReq
uint8_t ctrlReq(uint8_t addr, uint8_t ep, uint8_t bmReqType, uint8_t bRequest, uint8_t wValLo, uint8_t wValHi, uint16_t wInd, uint16_t total, uint16_t nbytes, uint8_t *dataptr, USBReadParser *p)
Definition
Usb.cpp:126
ButtonIndex
constexpr int8_t ButtonIndex(ButtonEnum key)
Definition
controllerEnums.h:191
ButtonEnum
ButtonEnum
Definition
controllerEnums.h:78
Notify
#define Notify(...)
Definition
message.h:51
MFK_CASTUINT8T
#define MFK_CASTUINT8T
Definition
settings.h:200
PSBUZZButtons::val
uint32_t val
Definition
PSBuzz.h:36
bmREQ_HID_OUT
#define bmREQ_HID_OUT
Definition
usbhid.h:63
HID_REQUEST_SET_REPORT
#define HID_REQUEST_SET_REPORT
Definition
usbhid.h:72
PSTR
#define PSTR(str)
Definition
version_helper.h:54
Generated by
1.9.8