Support MultiTap and read ports every other frame

This commit is contained in:
Jaby 2024-01-02 22:59:33 -06:00
parent 8b5ded2685
commit 572de89186
3 changed files with 38 additions and 37 deletions

View File

@ -4,8 +4,8 @@
namespace JabyEngine { namespace JabyEngine {
namespace Periphery { namespace Periphery {
static constexpr uint32_t PortCount = Configuration::Periphery::UsePortB ? 2 : 1; static constexpr uint32_t PortCount = Configuration::Periphery::IncludePortB ? 2 : 1;
static constexpr uint32_t DeviceCount = Configuration::Periphery::UseMultiTap ? 4 : 1; static constexpr uint32_t DeviceCount = Configuration::Periphery::UseMultiTap ? 4 : 1;
extern RawController controller[PortCount][DeviceCount]; extern RawController controller[PortCount][DeviceCount];

View File

@ -9,8 +9,8 @@ namespace JabyEngine {
}; };
struct Periphery { struct Periphery {
static constexpr bool UsePortB = false; static constexpr bool IncludePortB = false;
static constexpr bool UseMultiTap = false; static constexpr bool UseMultiTap = false;
}; };
}; };
} }

View File

@ -4,7 +4,9 @@
namespace JabyEngine { namespace JabyEngine {
namespace Periphery { namespace Periphery {
RawController controller[PortCount][DeviceCount]; // Controllers are checked every alternating frame
static uint8_t cur_controller_port = 0;
RawController controller[PortCount][DeviceCount];
struct ControllerHelper { struct ControllerHelper {
static bool is_config(const RawController &cont) { static bool is_config(const RawController &cont) {
@ -86,48 +88,47 @@ namespace JabyEngine {
void query_controller() { void query_controller() {
static constexpr auto TypeIDX = 1; static constexpr auto TypeIDX = 1;
for(uint32_t port = 0; port < Periphery::PortCount; port++) { Periphery::connect_to(cur_controller_port);
Periphery::connect_to(port); for(uint32_t id = 0; id < Periphery::DeviceCount; id++) {
for(uint32_t id = 0; id < Periphery::DeviceCount; id++) { auto &cur_controller = controller[cur_controller_port][id];
auto &cur_controller = controller[port][id];
uint8_t header[] = {static_cast<uint8_t>((id + 1)), 0x42, 0x0}; uint8_t header[] = {static_cast<uint8_t>((id + 1)), 0x42, 0x0};
uint8_t data[] = {cur_controller.header.rumble0, cur_controller.header.rumble1, 0x0, 0x0, 0x0, 0x0}; uint8_t data[] = {cur_controller.header.rumble0, cur_controller.header.rumble1, 0x0, 0x0, 0x0, 0x0};
// Can this move to the if?? // Can this move to the if??
set_config_command(cur_controller.header.state, header, data); set_config_command(cur_controller.header.state, header, data);
if(ControllerHelper::is_config(cur_controller)) { if(ControllerHelper::is_config(cur_controller)) {
send_data(header, header, data, data); send_data(header, header, data, data);
ControllerHelper::advance_config(cur_controller); ControllerHelper::advance_config(cur_controller);
} }
else { else {
cur_controller.button.exchange_state(); cur_controller.button.exchange_state();
send_data(header, header, data, ControllerHelper::raw_device_data(cur_controller)); send_data(header, header, data, ControllerHelper::raw_device_data(cur_controller));
const bool isValidController = (header[TypeIDX] != 0xFF); const bool isValidController = (header[TypeIDX] != 0xFF);
if(header[TypeIDX] != cur_controller.header.type) { if(header[TypeIDX] != cur_controller.header.type) {
cur_controller.header.type = header[TypeIDX]; cur_controller.header.type = header[TypeIDX];
cur_controller.header.state = isValidController ? RawController::State::EnterConfigMode : RawController::State::Disconnected; cur_controller.header.state = isValidController ? RawController::State::EnterConfigMode : RawController::State::Disconnected;
/*if(!isValidController) /*if(!isValidController)
{ {
printf("Disconnected!\n"); printf("Disconnected!\n");
}
else
{
printf("ID: 0x%02X 0x%04X\n", header[TypeIDX], contData.button);
}*/
} }
else
{
printf("ID: 0x%02X 0x%04X\n", header[TypeIDX], contData.button);
}*/
} }
} }
Periphery::close_connection(); }
Periphery::close_connection();
if(Configuration::Periphery::IncludePortB) {
cur_controller_port ^= 0x1;
} }
} }
static_assert(!Configuration::Periphery::UsePortB, "Port B not supported yet");
static_assert(!Configuration::Periphery::UseMultiTap, "MultiTap not supported yet");
} }
} }