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.
PSBuzz.cpp
00001 /* Copyright (C) 2014 Kristian Lauszus, TKJ Electronics. All rights reserved. 00002 00003 This software may be distributed and modified under the terms of the GNU 00004 General Public License version 2 (GPL2) as published by the Free Software 00005 Foundation and appearing in the file GPL2.TXT included in the packaging of 00006 this file. Please note that GPL2 Section 2[b] requires that all works based 00007 on this software must also be made publicly available under the terms of 00008 the GPL2 ("Copyleft"). 00009 00010 Contact information 00011 ------------------- 00012 00013 Kristian Lauszus, TKJ Electronics 00014 Web : http://www.tkjelectronics.com 00015 e-mail : kristianl@tkjelectronics.com 00016 */ 00017 00018 #include "PSBuzz.h" 00019 00020 // To enable serial debugging see "settings.h" 00021 //#define PRINTREPORT // Uncomment to print the report send by the PS Buzz Controllers 00022 00023 void PSBuzz::ParseHIDData(USBHID *hid __attribute__((unused)), bool is_rpt_id __attribute__((unused)), uint8_t len, uint8_t *buf) { 00024 if (HIDUniversal::VID == PSBUZZ_VID && HIDUniversal::PID == PSBUZZ_PID && len > 2 && buf) { 00025 #ifdef PRINTREPORT 00026 Notify(PSTR("\r\n"), 0x80); 00027 for (uint8_t i = 0; i < len; i++) { 00028 D_PrintHex<uint8_t > (buf[i], 0x80); 00029 Notify(PSTR(" "), 0x80); 00030 } 00031 #endif 00032 memcpy(&psbuzzButtons, buf + 2, min((uint8_t)(len - 2), MFK_CASTUINT8T sizeof(psbuzzButtons))); 00033 00034 if (psbuzzButtons.val != oldButtonState.val) { // Check if anything has changed 00035 buttonClickState.val = psbuzzButtons.val & ~oldButtonState.val; // Update click state variable 00036 oldButtonState.val = psbuzzButtons.val; 00037 } 00038 } 00039 }; 00040 00041 uint8_t PSBuzz::OnInitSuccessful() { 00042 if (HIDUniversal::VID == PSBUZZ_VID && HIDUniversal::PID == PSBUZZ_PID) { 00043 Reset(); 00044 if (pFuncOnInit) 00045 pFuncOnInit(); // Call the user function 00046 else 00047 setLedOnAll(); // Turn the LED on, on all four controllers 00048 }; 00049 return 0; 00050 }; 00051 00052 bool PSBuzz::getButtonPress(ButtonEnum b, uint8_t controller) { 00053 return psbuzzButtons.val & (1UL << (b + 5 * controller)); // Each controller uses 5 bits, so the value is shifted 5 for each controller 00054 }; 00055 00056 bool PSBuzz::getButtonClick(ButtonEnum b, uint8_t controller) { 00057 uint32_t mask = (1UL << (b + 5 * controller)); // Each controller uses 5 bits, so the value is shifted 5 for each controller 00058 bool click = buttonClickState.val & mask; 00059 buttonClickState.val &= ~mask; // Clear "click" event 00060 return click; 00061 }; 00062 00063 // Source: http://www.developerfusion.com/article/84338/making-usb-c-friendly/ and https://github.com/torvalds/linux/blob/master/drivers/hid/hid-sony.c 00064 void PSBuzz::setLedRaw(bool value, uint8_t controller) { 00065 ledState[controller] = value; // Save value for next time it is called 00066 00067 uint8_t buf[7]; 00068 buf[0] = 0x00; 00069 buf[1] = ledState[0] ? 0xFF : 0x00; 00070 buf[2] = ledState[1] ? 0xFF : 0x00; 00071 buf[3] = ledState[2] ? 0xFF : 0x00; 00072 buf[4] = ledState[3] ? 0xFF : 0x00; 00073 buf[5] = 0x00; 00074 buf[6] = 0x00; 00075 00076 PSBuzz_Command(buf, sizeof(buf)); 00077 }; 00078 00079 void PSBuzz::PSBuzz_Command(uint8_t *data, uint16_t nbytes) { 00080 // 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) 00081 pUsb->ctrlReq(bAddress, epInfo[0].epAddr, bmREQ_HID_OUT, HID_REQUEST_SET_REPORT, 0x00, 0x02, 0x00, nbytes, nbytes, data, NULL); 00082 }; 00083
Generated on Thu Jul 14 2022 08:33:41 by
1.7.2