From e33b5c06ab5454a84e39093c619c8c470ba99919 Mon Sep 17 00:00:00 2001 From: cathery Date: Fri, 22 Nov 2019 01:49:51 +0300 Subject: [PATCH] Make some variables constexpr where possible --- .../Controllers/Dualshock3Controller.h | 2 +- ControllerUSB/include/IUSBInterface.h | 1 + .../Controllers/Dualshock3Controller.cpp | 6 +++--- .../Controllers/Xbox360WirelessController.cpp | 8 ++++---- .../source/Controllers/XboxOneAdapter.cpp | 2 +- .../source/Controllers/XboxOneController.cpp | 20 +++++++++---------- SwitchUSB/include/SwitchUSBInterface.h | 1 + SwitchUSB/source/SwitchUSBInterface.cpp | 18 +++++++++++++++++ 8 files changed, 39 insertions(+), 19 deletions(-) diff --git a/ControllerUSB/include/Controllers/Dualshock3Controller.h b/ControllerUSB/include/Controllers/Dualshock3Controller.h index 4315b50..b1aadee 100644 --- a/ControllerUSB/include/Controllers/Dualshock3Controller.h +++ b/ControllerUSB/include/Controllers/Dualshock3Controller.h @@ -152,7 +152,7 @@ public: Result SendInitBytes(); Result SetRumble(uint8_t strong_magnitude, uint8_t weak_magnitude); - static Result SendCommand(IUSBInterface *interface, Dualshock3FeatureValue feature, void *buffer, uint16_t size); + static Result SendCommand(IUSBInterface *interface, Dualshock3FeatureValue feature, const void *buffer, uint16_t size); Result SetLED(Dualshock3LEDValue value); diff --git a/ControllerUSB/include/IUSBInterface.h b/ControllerUSB/include/IUSBInterface.h index e14d8ac..851455b 100644 --- a/ControllerUSB/include/IUSBInterface.h +++ b/ControllerUSB/include/IUSBInterface.h @@ -25,6 +25,7 @@ public: virtual void Close() = 0; virtual Result ControlTransfer(uint8_t bmRequestType, uint8_t bmRequest, uint16_t wValue, uint16_t wIndex, uint16_t wLength, void *buffer) = 0; + virtual Result ControlTransfer(uint8_t bmRequestType, uint8_t bmRequest, uint16_t wValue, uint16_t wIndex, uint16_t wLength, const void *buffer) = 0; virtual IUSBEndpoint *GetEndpoint(IUSBEndpoint::Direction direction, uint8_t index) = 0; virtual InterfaceDescriptor *GetDescriptor() = 0; diff --git a/ControllerUSB/source/Controllers/Dualshock3Controller.cpp b/ControllerUSB/source/Controllers/Dualshock3Controller.cpp index 8084acc..8422619 100644 --- a/ControllerUSB/source/Controllers/Dualshock3Controller.cpp +++ b/ControllerUSB/source/Controllers/Dualshock3Controller.cpp @@ -48,7 +48,7 @@ Result Dualshock3Controller::OpenInterfaces() continue; //Send an initial control packet - uint8_t initBytes[] = {0x42, 0x0C, 0x00, 0x00}; + constexpr uint8_t initBytes[] = {0x42, 0x0C, 0x00, 0x00}; rc = SendCommand(interface.get(), Ds3FeatureStartDevice, initBytes, sizeof(initBytes)); if (R_FAILED(rc)) return 60; @@ -209,14 +209,14 @@ Result Dualshock3Controller::SetRumble(uint8_t strong_magnitude, uint8_t weak_ma return 9; } -Result Dualshock3Controller::SendCommand(IUSBInterface *interface, Dualshock3FeatureValue feature, void *buffer, uint16_t size) +Result Dualshock3Controller::SendCommand(IUSBInterface *interface, Dualshock3FeatureValue feature, const void *buffer, uint16_t size) { return interface->ControlTransfer(0x21, 0x09, static_cast(feature), 0, size, buffer); } Result Dualshock3Controller::SetLED(Dualshock3LEDValue value) { - uint8_t ledPacket[]{ + const uint8_t ledPacket[]{ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, static_cast(value << 1), LED_PERMANENT, diff --git a/ControllerUSB/source/Controllers/Xbox360WirelessController.cpp b/ControllerUSB/source/Controllers/Xbox360WirelessController.cpp index f32dcfd..6c03822 100644 --- a/ControllerUSB/source/Controllers/Xbox360WirelessController.cpp +++ b/ControllerUSB/source/Controllers/Xbox360WirelessController.cpp @@ -2,10 +2,10 @@ #include static ControllerConfig _xbox360WControllerConfig{}; -static const uint8_t reconnectPacket[]{0x08, 0x00, 0x0F, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}; -static const uint8_t poweroffPacket[]{0x00, 0x00, 0x08, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}; -static const uint8_t initDriverPacket[]{0x00, 0x00, 0x02, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}; -static const uint8_t ledPacketOn[]{0x00, 0x00, 0x08, 0x40 | XBOX360LED_TOPLEFT, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}; +static constexpr uint8_t reconnectPacket[]{0x08, 0x00, 0x0F, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}; +static constexpr uint8_t poweroffPacket[]{0x00, 0x00, 0x08, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}; +static constexpr uint8_t initDriverPacket[]{0x00, 0x00, 0x02, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}; +static constexpr uint8_t ledPacketOn[]{0x00, 0x00, 0x08, 0x40 | XBOX360LED_TOPLEFT, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}; Xbox360WirelessController::Xbox360WirelessController(std::unique_ptr &&interface) : IController(std::move(interface)) diff --git a/ControllerUSB/source/Controllers/XboxOneAdapter.cpp b/ControllerUSB/source/Controllers/XboxOneAdapter.cpp index d6405cb..3ce38e7 100644 --- a/ControllerUSB/source/Controllers/XboxOneAdapter.cpp +++ b/ControllerUSB/source/Controllers/XboxOneAdapter.cpp @@ -206,7 +206,7 @@ Result XboxOneAdapter::ControlWrite(IUSBInterface *interface, uint16_t address, Result rc; if (request == MT_VEND_DEV_MODE) { - rc = interface->ControlTransfer(0x40, request, address, 0, 0, nullptr); + rc = interface->ControlTransfer(0x40, request, address, 0, 0, static_cast(nullptr)); } else { diff --git a/ControllerUSB/source/Controllers/XboxOneController.cpp b/ControllerUSB/source/Controllers/XboxOneController.cpp index 5299e8b..b83dfdb 100644 --- a/ControllerUSB/source/Controllers/XboxOneController.cpp +++ b/ControllerUSB/source/Controllers/XboxOneController.cpp @@ -10,33 +10,33 @@ static ControllerConfig _xboxoneControllerConfig{}; // and https://github.com/360Controller/360Controller/blob/master/360Controller/_60Controller.cpp //Enables LED on the PowerA controller but disables input? -static const uint8_t xboxone_powerA_ledOn[] = { +static constexpr uint8_t xboxone_powerA_ledOn[] = { 0x04, 0x20, 0x01, 0x00}; //does something maybe -static const uint8_t xboxone_test_init1[] = { +static constexpr uint8_t xboxone_test_init1[] = { 0x01, 0x20, 0x01, 0x09, 0x00, 0x04, 0x20, 0x3a, 0x00, 0x00, 0x00, 0x98, 0x00}; //required for all xbox one controllers -static const uint8_t xboxone_fw2015_init[] = { +static constexpr uint8_t xboxone_fw2015_init[] = { 0x05, 0x20, 0x00, 0x01, 0x00}; -static const uint8_t xboxone_hori_init[] = { +static constexpr uint8_t xboxone_hori_init[] = { 0x01, 0x20, 0x00, 0x09, 0x00, 0x04, 0x20, 0x3a, 0x00, 0x00, 0x00, 0x80, 0x00}; -static const uint8_t xboxone_pdp_init1[] = { +static constexpr uint8_t xboxone_pdp_init1[] = { 0x0a, 0x20, 0x00, 0x03, 0x00, 0x01, 0x14}; -static const uint8_t xboxone_pdp_init2[] = { +static constexpr uint8_t xboxone_pdp_init2[] = { 0x06, 0x20, 0x00, 0x02, 0x01, 0x00}; -static const uint8_t xboxone_rumblebegin_init[] = { +static constexpr uint8_t xboxone_rumblebegin_init[] = { 0x09, 0x00, 0x00, 0x09, 0x00, 0x0F, 0x00, 0x00, 0x1D, 0x1D, 0xFF, 0x00, 0x00}; -static const uint8_t xboxone_rumbleend_init[] = { +static constexpr uint8_t xboxone_rumbleend_init[] = { 0x09, 0x00, 0x00, 0x09, 0x00, 0x0F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}; @@ -48,7 +48,7 @@ struct VendorProductPacket uint8_t Length; }; -static VendorProductPacket init_packets[]{ +static constexpr VendorProductPacket init_packets[]{ {0x0e6f, 0x0165, xboxone_hori_init, sizeof(xboxone_hori_init)}, {0x0f0d, 0x0067, xboxone_hori_init, sizeof(xboxone_hori_init)}, @@ -309,7 +309,7 @@ Result XboxOneController::WriteAckGuideReport(uint8_t sequence) Result XboxOneController::SetRumble(uint8_t strong_magnitude, uint8_t weak_magnitude) { - uint8_t rumble_data[]{ + const uint8_t rumble_data[]{ 0x09, 0x00, 0x00, 0x09, 0x00, 0x0f, 0x00, 0x00, strong_magnitude, diff --git a/SwitchUSB/include/SwitchUSBInterface.h b/SwitchUSB/include/SwitchUSBInterface.h index d88395f..7180e44 100644 --- a/SwitchUSB/include/SwitchUSBInterface.h +++ b/SwitchUSB/include/SwitchUSBInterface.h @@ -23,6 +23,7 @@ public: virtual void Close() override; virtual Result ControlTransfer(u8 bmRequestType, u8 bmRequest, u16 wValue, u16 wIndex, u16 wLength, void *buffer) override; + virtual Result ControlTransfer(u8 bmRequestType, u8 bmRequest, u16 wValue, u16 wIndex, u16 wLength, const void *buffer) override; // There are a total of 15 endpoints on a switch interface for each direction, get them by passing the desired parameters virtual IUSBEndpoint *GetEndpoint(IUSBEndpoint::Direction direction, uint8_t index) override; diff --git a/SwitchUSB/source/SwitchUSBInterface.cpp b/SwitchUSB/source/SwitchUSBInterface.cpp index af5cdb2..088c1fa 100644 --- a/SwitchUSB/source/SwitchUSBInterface.cpp +++ b/SwitchUSB/source/SwitchUSBInterface.cpp @@ -91,6 +91,24 @@ Result SwitchUSBInterface::ControlTransfer(u8 bmRequestType, u8 bmRequest, u16 w return rc; } +Result SwitchUSBInterface::ControlTransfer(u8 bmRequestType, u8 bmRequest, u16 wValue, u16 wIndex, u16 wLength, const void *buffer) +{ + void *temp_buffer = memalign(0x1000, wLength); + if (temp_buffer == nullptr) + return -1; + + u32 transferredSize; + + for (u16 byte = 0; byte != wLength; ++byte) + { + static_cast(temp_buffer)[byte] = static_cast(buffer)[byte]; + } + + Result rc = usbHsIfCtrlXfer(&m_session, bmRequestType, bmRequest, wValue, wIndex, wLength, temp_buffer, &transferredSize); + free(temp_buffer); + return rc; +} + IUSBEndpoint *SwitchUSBInterface::GetEndpoint(IUSBEndpoint::Direction direction, uint8_t index) { if (direction == IUSBEndpoint::USB_ENDPOINT_IN)