diff options
author | Ryan <fauxpark@gmail.com> | 2021-08-18 18:20:25 +1000 |
---|---|---|
committer | GitHub <noreply@github.com> | 2021-08-18 18:20:25 +1000 |
commit | b16091659cc9a724a8800f77e631643b4ab089ad (patch) | |
tree | e44933472c6d100bd4fc5d8a693d9d21e3c32f6f /lib/usbhost/USB_Host_Shield_2.0/PSBuzz.cpp | |
parent | cf5e40c25139ff64ff246f1c6280e983ef75551c (diff) | |
download | qmk_firmware-b16091659cc9a724a8800f77e631643b4ab089ad.tar.gz qmk_firmware-b16091659cc9a724a8800f77e631643b4ab089ad.zip |
Move USB Host Shield and Arduino core to `lib/` (#13973)
Diffstat (limited to 'lib/usbhost/USB_Host_Shield_2.0/PSBuzz.cpp')
-rw-r--r-- | lib/usbhost/USB_Host_Shield_2.0/PSBuzz.cpp | 82 |
1 files changed, 82 insertions, 0 deletions
diff --git a/lib/usbhost/USB_Host_Shield_2.0/PSBuzz.cpp b/lib/usbhost/USB_Host_Shield_2.0/PSBuzz.cpp new file mode 100644 index 000000000..498164d5a --- /dev/null +++ b/lib/usbhost/USB_Host_Shield_2.0/PSBuzz.cpp | |||
@@ -0,0 +1,82 @@ | |||
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(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) { | ||
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), 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 | 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 | ||
54 | }; | ||
55 | |||
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 | ||
60 | return click; | ||
61 | }; | ||
62 | |||
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 | ||
66 | |||
67 | uint8_t buf[7]; | ||
68 | buf[0] = 0x00; | ||
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; | ||
73 | buf[5] = 0x00; | ||
74 | buf[6] = 0x00; | ||
75 | |||
76 | PSBuzz_Command(buf, sizeof(buf)); | ||
77 | }; | ||
78 | |||
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); | ||
82 | }; | ||