Zoltan Hudak / UsbHostMAX3421E

Dependents:   UsbHostMAX3421E_Hello

Embed: (wiki syntax)

« Back to documentation index

Show/hide line numbers PSBuzz.cpp Source File

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, std::min((unsigned int)(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 };