Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
Dependents: UsbHostMAX3421E_Hello
PSBuzz.cpp@0:84353c479782, 2020-07-12 (annotated)
- Committer:
- hudakz
- Date:
- Sun Jul 12 20:39:26 2020 +0000
- Revision:
- 0:84353c479782
MAX3421E-based USB Host Shield Library
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
hudakz | 0:84353c479782 | 1 | /* Copyright (C) 2014 Kristian Lauszus, TKJ Electronics. All rights reserved. |
hudakz | 0:84353c479782 | 2 | |
hudakz | 0:84353c479782 | 3 | This software may be distributed and modified under the terms of the GNU |
hudakz | 0:84353c479782 | 4 | General Public License version 2 (GPL2) as published by the Free Software |
hudakz | 0:84353c479782 | 5 | Foundation and appearing in the file GPL2.TXT included in the packaging of |
hudakz | 0:84353c479782 | 6 | this file. Please note that GPL2 Section 2[b] requires that all works based |
hudakz | 0:84353c479782 | 7 | on this software must also be made publicly available under the terms of |
hudakz | 0:84353c479782 | 8 | the GPL2 ("Copyleft"). |
hudakz | 0:84353c479782 | 9 | |
hudakz | 0:84353c479782 | 10 | Contact information |
hudakz | 0:84353c479782 | 11 | ------------------- |
hudakz | 0:84353c479782 | 12 | |
hudakz | 0:84353c479782 | 13 | Kristian Lauszus, TKJ Electronics |
hudakz | 0:84353c479782 | 14 | Web : http://www.tkjelectronics.com |
hudakz | 0:84353c479782 | 15 | e-mail : kristianl@tkjelectronics.com |
hudakz | 0:84353c479782 | 16 | */ |
hudakz | 0:84353c479782 | 17 | |
hudakz | 0:84353c479782 | 18 | #include "PSBuzz.h" |
hudakz | 0:84353c479782 | 19 | |
hudakz | 0:84353c479782 | 20 | // To enable serial debugging see "settings.h" |
hudakz | 0:84353c479782 | 21 | //#define PRINTREPORT // Uncomment to print the report send by the PS Buzz Controllers |
hudakz | 0:84353c479782 | 22 | |
hudakz | 0:84353c479782 | 23 | void PSBuzz::ParseHIDData(USBHID *hid __attribute__((unused)), bool is_rpt_id __attribute__((unused)), uint8_t len, uint8_t *buf) { |
hudakz | 0:84353c479782 | 24 | if (HIDUniversal::VID == PSBUZZ_VID && HIDUniversal::PID == PSBUZZ_PID && len > 2 && buf) { |
hudakz | 0:84353c479782 | 25 | #ifdef PRINTREPORT |
hudakz | 0:84353c479782 | 26 | Notify(PSTR("\r\n"), 0x80); |
hudakz | 0:84353c479782 | 27 | for (uint8_t i = 0; i < len; i++) { |
hudakz | 0:84353c479782 | 28 | D_PrintHex<uint8_t > (buf[i], 0x80); |
hudakz | 0:84353c479782 | 29 | Notify(PSTR(" "), 0x80); |
hudakz | 0:84353c479782 | 30 | } |
hudakz | 0:84353c479782 | 31 | #endif |
hudakz | 0:84353c479782 | 32 | memcpy(&psbuzzButtons, buf + 2, std::min((unsigned int)(len - 2), MFK_CASTUINT8T sizeof(psbuzzButtons))); |
hudakz | 0:84353c479782 | 33 | |
hudakz | 0:84353c479782 | 34 | if (psbuzzButtons.val != oldButtonState.val) { // Check if anything has changed |
hudakz | 0:84353c479782 | 35 | buttonClickState.val = psbuzzButtons.val & ~oldButtonState.val; // Update click state variable |
hudakz | 0:84353c479782 | 36 | oldButtonState.val = psbuzzButtons.val; |
hudakz | 0:84353c479782 | 37 | } |
hudakz | 0:84353c479782 | 38 | } |
hudakz | 0:84353c479782 | 39 | }; |
hudakz | 0:84353c479782 | 40 | |
hudakz | 0:84353c479782 | 41 | uint8_t PSBuzz::OnInitSuccessful() { |
hudakz | 0:84353c479782 | 42 | if (HIDUniversal::VID == PSBUZZ_VID && HIDUniversal::PID == PSBUZZ_PID) { |
hudakz | 0:84353c479782 | 43 | Reset(); |
hudakz | 0:84353c479782 | 44 | if (pFuncOnInit) |
hudakz | 0:84353c479782 | 45 | pFuncOnInit(); // Call the user function |
hudakz | 0:84353c479782 | 46 | else |
hudakz | 0:84353c479782 | 47 | setLedOnAll(); // Turn the LED on, on all four controllers |
hudakz | 0:84353c479782 | 48 | }; |
hudakz | 0:84353c479782 | 49 | return 0; |
hudakz | 0:84353c479782 | 50 | }; |
hudakz | 0:84353c479782 | 51 | |
hudakz | 0:84353c479782 | 52 | bool PSBuzz::getButtonPress(ButtonEnum b, uint8_t controller) { |
hudakz | 0:84353c479782 | 53 | return psbuzzButtons.val & (1UL << (b + 5 * controller)); // Each controller uses 5 bits, so the value is shifted 5 for each controller |
hudakz | 0:84353c479782 | 54 | }; |
hudakz | 0:84353c479782 | 55 | |
hudakz | 0:84353c479782 | 56 | bool PSBuzz::getButtonClick(ButtonEnum b, uint8_t controller) { |
hudakz | 0:84353c479782 | 57 | uint32_t mask = (1UL << (b + 5 * controller)); // Each controller uses 5 bits, so the value is shifted 5 for each controller |
hudakz | 0:84353c479782 | 58 | bool click = buttonClickState.val & mask; |
hudakz | 0:84353c479782 | 59 | buttonClickState.val &= ~mask; // Clear "click" event |
hudakz | 0:84353c479782 | 60 | return click; |
hudakz | 0:84353c479782 | 61 | }; |
hudakz | 0:84353c479782 | 62 | |
hudakz | 0:84353c479782 | 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 |
hudakz | 0:84353c479782 | 64 | void PSBuzz::setLedRaw(bool value, uint8_t controller) { |
hudakz | 0:84353c479782 | 65 | ledState[controller] = value; // Save value for next time it is called |
hudakz | 0:84353c479782 | 66 | |
hudakz | 0:84353c479782 | 67 | uint8_t buf[7]; |
hudakz | 0:84353c479782 | 68 | buf[0] = 0x00; |
hudakz | 0:84353c479782 | 69 | buf[1] = ledState[0] ? 0xFF : 0x00; |
hudakz | 0:84353c479782 | 70 | buf[2] = ledState[1] ? 0xFF : 0x00; |
hudakz | 0:84353c479782 | 71 | buf[3] = ledState[2] ? 0xFF : 0x00; |
hudakz | 0:84353c479782 | 72 | buf[4] = ledState[3] ? 0xFF : 0x00; |
hudakz | 0:84353c479782 | 73 | buf[5] = 0x00; |
hudakz | 0:84353c479782 | 74 | buf[6] = 0x00; |
hudakz | 0:84353c479782 | 75 | |
hudakz | 0:84353c479782 | 76 | PSBuzz_Command(buf, sizeof(buf)); |
hudakz | 0:84353c479782 | 77 | }; |
hudakz | 0:84353c479782 | 78 | |
hudakz | 0:84353c479782 | 79 | void PSBuzz::PSBuzz_Command(uint8_t *data, uint16_t nbytes) { |
hudakz | 0:84353c479782 | 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) |
hudakz | 0:84353c479782 | 81 | pUsb->ctrlReq(bAddress, epInfo[0].epAddr, bmREQ_HID_OUT, HID_REQUEST_SET_REPORT, 0x00, 0x02, 0x00, nbytes, nbytes, data, NULL); |
hudakz | 0:84353c479782 | 82 | }; |