input_common: joycon: Replace ReadSPI vector with span

master
Narr the Reg 2023-01-27 17:47:47 +07:00
parent 8647c72778
commit 4e29afefc4
3 changed files with 26 additions and 20 deletions

@ -22,8 +22,8 @@ void JoyconCommonProtocol::SetNonBlocking() {
} }
DriverResult JoyconCommonProtocol::GetDeviceType(ControllerType& controller_type) { DriverResult JoyconCommonProtocol::GetDeviceType(ControllerType& controller_type) {
std::vector<u8> buffer; std::array<u8, 1> buffer{};
const auto result = ReadSPI(SpiAddress::DEVICE_TYPE, 1, buffer); const auto result = ReadRawSPI(SpiAddress::DEVICE_TYPE, buffer);
controller_type = ControllerType::None; controller_type = ControllerType::None;
if (result == DriverResult::Success) { if (result == DriverResult::Success) {
@ -148,11 +148,13 @@ DriverResult JoyconCommonProtocol::SendVibrationReport(std::span<const u8> buffe
return SendData(local_buffer); return SendData(local_buffer);
} }
DriverResult JoyconCommonProtocol::ReadSPI(SpiAddress addr, u8 size, std::vector<u8>& output) { DriverResult JoyconCommonProtocol::ReadRawSPI(SpiAddress addr, std::span<u8> output) {
constexpr std::size_t HeaderSize = 20;
constexpr std::size_t MaxTries = 10; constexpr std::size_t MaxTries = 10;
const auto size = output.size();
std::size_t tries = 0; std::size_t tries = 0;
std::array<u8, 5> buffer = {0x00, 0x00, 0x00, 0x00, size}; std::array<u8, 5> buffer = {0x00, 0x00, 0x00, 0x00, static_cast<u8>(size)};
std::vector<u8> local_buffer(size + 20); std::vector<u8> local_buffer{};
buffer[0] = static_cast<u8>(static_cast<u16>(addr) & 0x00FF); buffer[0] = static_cast<u8>(static_cast<u16>(addr) & 0x00FF);
buffer[1] = static_cast<u8>((static_cast<u16>(addr) & 0xFF00) >> 8); buffer[1] = static_cast<u8>((static_cast<u16>(addr) & 0xFF00) >> 8);
@ -167,8 +169,12 @@ DriverResult JoyconCommonProtocol::ReadSPI(SpiAddress addr, u8 size, std::vector
} }
} while (local_buffer[15] != buffer[0] || local_buffer[16] != buffer[1]); } while (local_buffer[15] != buffer[0] || local_buffer[16] != buffer[1]);
if (local_buffer.size() < size + HeaderSize) {
return DriverResult::WrongReply;
}
// Remove header from output // Remove header from output
output = std::vector<u8>(local_buffer.begin() + 20, local_buffer.begin() + 20 + size); memcpy(output.data(), local_buffer.data() + HeaderSize, size);
return DriverResult::Success; return DriverResult::Success;
} }

@ -97,26 +97,26 @@ public:
/** /**
* Reads the SPI memory stored on the joycon * Reads the SPI memory stored on the joycon
* @param Initial address location * @param Initial address location
* @param size in bytes to be read
* @returns output buffer containing the responce * @returns output buffer containing the responce
*/ */
DriverResult ReadSPI(SpiAddress addr, u8 size, std::vector<u8>& output); DriverResult ReadRawSPI(SpiAddress addr, std::span<u8> output);
/**
* Reads the SPI memory stored on the joycon
* @param Initial address location
* @returns output object containing the responce
*/
template <typename Output> template <typename Output>
requires(std::is_trivially_copyable_v<Output>) requires std::is_trivially_copyable_v<Output> DriverResult ReadSPI(SpiAddress addr,
DriverResult ReadSPI(SpiAddress addr, Output& output) { Output& output) {
std::vector<u8> buffer; std::array<u8, sizeof(Output)> buffer;
output = {}; output = {};
const auto result = ReadSPI(addr, sizeof(Output), buffer); const auto result = ReadRawSPI(addr, buffer);
if (result != DriverResult::Success) { if (result != DriverResult::Success) {
return result; return result;
} }
if (buffer.size() != sizeof(Output)) {
return DriverResult::WrongReply;
}
std::memcpy(&output, buffer.data(), sizeof(Output)); std::memcpy(&output, buffer.data(), sizeof(Output));
return DriverResult::Success; return DriverResult::Success;
} }

@ -71,8 +71,8 @@ DriverResult GenericProtocol::GetBattery(u32& battery_level) {
DriverResult GenericProtocol::GetColor(Color& color) { DriverResult GenericProtocol::GetColor(Color& color) {
ScopedSetBlocking sb(this); ScopedSetBlocking sb(this);
std::vector<u8> buffer; std::array<u8, 12> buffer{};
const auto result = ReadSPI(SpiAddress::COLOR_DATA, 12, buffer); const auto result = ReadRawSPI(SpiAddress::COLOR_DATA, buffer);
color = {}; color = {};
if (result == DriverResult::Success) { if (result == DriverResult::Success) {
@ -87,8 +87,8 @@ DriverResult GenericProtocol::GetColor(Color& color) {
DriverResult GenericProtocol::GetSerialNumber(SerialNumber& serial_number) { DriverResult GenericProtocol::GetSerialNumber(SerialNumber& serial_number) {
ScopedSetBlocking sb(this); ScopedSetBlocking sb(this);
std::vector<u8> buffer; std::array<u8, 16> buffer{};
const auto result = ReadSPI(SpiAddress::SERIAL_NUMBER, 16, buffer); const auto result = ReadRawSPI(SpiAddress::SERIAL_NUMBER, buffer);
serial_number = {}; serial_number = {};
if (result == DriverResult::Success) { if (result == DriverResult::Success) {