Merge pull request #38 from lioncash/cast

NintendoPowerA: Use std::memcpy within transferCycle()
This commit is contained in:
Phillip Stephens 2019-09-06 23:24:56 -07:00 committed by GitHub
commit a46858acec
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 17 additions and 12 deletions

View File

@ -34,7 +34,7 @@ struct INintendoPowerACallback {
}; };
class NintendoPowerA final : public TDeviceBase<INintendoPowerACallback> { class NintendoPowerA final : public TDeviceBase<INintendoPowerACallback> {
NintendoPowerAState m_last; NintendoPowerAState m_last{};
void deviceDisconnected() override; void deviceDisconnected() override;
void initialCycle() override; void initialCycle() override;
void transferCycle() override; void transferCycle() override;
@ -42,7 +42,7 @@ class NintendoPowerA final : public TDeviceBase<INintendoPowerACallback> {
void receivedHIDReport(const uint8_t* data, size_t length, HIDReportType tp, uint32_t message) override; void receivedHIDReport(const uint8_t* data, size_t length, HIDReportType tp, uint32_t message) override;
public: public:
NintendoPowerA(DeviceToken*); explicit NintendoPowerA(DeviceToken*);
~NintendoPowerA() override; ~NintendoPowerA() override;
}; };
} // namespace boo } // namespace boo

View File

@ -1,5 +1,6 @@
#include "boo/inputdev/NintendoPowerA.hpp" #include "boo/inputdev/NintendoPowerA.hpp"
#include <array>
#include <cstring> #include <cstring>
#include "boo/inputdev/DeviceSignature.hpp" #include "boo/inputdev/DeviceSignature.hpp"
@ -8,27 +9,31 @@ namespace boo {
NintendoPowerA::NintendoPowerA(DeviceToken* token) NintendoPowerA::NintendoPowerA(DeviceToken* token)
: TDeviceBase<INintendoPowerACallback>(dev_typeid(NintendoPowerA), token) {} : TDeviceBase<INintendoPowerACallback>(dev_typeid(NintendoPowerA), token) {}
NintendoPowerA::~NintendoPowerA() {} NintendoPowerA::~NintendoPowerA() = default;
void NintendoPowerA::deviceDisconnected() { void NintendoPowerA::deviceDisconnected() {
std::lock_guard<std::mutex> lk(m_callbackLock); std::lock_guard lk{m_callbackLock};
if (m_callback) if (m_callback != nullptr) {
m_callback->controllerDisconnected(); m_callback->controllerDisconnected();
}
} }
void NintendoPowerA::initialCycle() {} void NintendoPowerA::initialCycle() {}
void NintendoPowerA::transferCycle() { void NintendoPowerA::transferCycle() {
uint8_t payload[8]; std::array<uint8_t, 8> payload;
size_t recvSz = receiveUSBInterruptTransfer(payload, sizeof(payload)); const size_t recvSz = receiveUSBInterruptTransfer(payload.data(), payload.size());
if (recvSz != 8) if (recvSz != payload.size()) {
return; return;
}
NintendoPowerAState state = *reinterpret_cast<NintendoPowerAState*>(&payload); NintendoPowerAState state;
std::memcpy(&state, payload.data(), sizeof(state));
std::lock_guard<std::mutex> lk(m_callbackLock); std::lock_guard lk{m_callbackLock};
if (state != m_last && m_callback) if (state != m_last && m_callback != nullptr) {
m_callback->controllerUpdate(state); m_callback->controllerUpdate(state);
}
m_last = state; m_last = state;
} }
@ -37,7 +42,7 @@ void NintendoPowerA::finalCycle() {}
void NintendoPowerA::receivedHIDReport(const uint8_t* data, size_t length, HIDReportType tp, uint32_t message) {} void NintendoPowerA::receivedHIDReport(const uint8_t* data, size_t length, HIDReportType tp, uint32_t message) {}
bool NintendoPowerAState::operator==(const NintendoPowerAState& other) const { bool NintendoPowerAState::operator==(const NintendoPowerAState& other) const {
return memcmp(this, &other, sizeof(NintendoPowerAState)) == 0; return std::memcmp(this, &other, sizeof(NintendoPowerAState)) == 0;
} }
bool NintendoPowerAState::operator!=(const NintendoPowerAState& other) const { return !operator==(other); } bool NintendoPowerAState::operator!=(const NintendoPowerAState& other) const { return !operator==(other); }