mirror of
https://github.com/ravinrabbid/DonCon2040.git
synced 2024-11-20 11:47:07 +01:00
Move controller input to second core
This commit is contained in:
parent
aeb1719d16
commit
9becbf9e6a
@ -1,7 +1,7 @@
|
||||
#ifndef _GLOBALCONFIGURATION_H_
|
||||
#define _GLOBALCONFIGURATION_H_
|
||||
|
||||
#include "peripherals/Buttons.h"
|
||||
#include "peripherals/Controller.h"
|
||||
#include "peripherals/Drum.h"
|
||||
#include "peripherals/StatusLed.h"
|
||||
|
||||
|
@ -1,5 +1,5 @@
|
||||
#ifndef _PERIPHERALS_BUTTONS_H_
|
||||
#define _PERIPHERALS_BUTTONS_H_
|
||||
#ifndef _PERIPHERALS_CONTROLLER_H_
|
||||
#define _PERIPHERALS_CONTROLLER_H_
|
||||
|
||||
#include "utils/InputState.h"
|
||||
|
||||
@ -107,4 +107,4 @@ class Buttons {
|
||||
|
||||
} // namespace Doncon::Peripherals
|
||||
|
||||
#endif // _PERIPHERALS_BUTTONS_H_
|
||||
#endif // _PERIPHERALS_CONTROLLER_H_
|
@ -20,6 +20,7 @@ struct InputState {
|
||||
Pad don_left, ka_left, don_right, ka_right;
|
||||
};
|
||||
|
||||
struct Controller {
|
||||
struct DPad {
|
||||
bool up, down, left, right;
|
||||
};
|
||||
@ -30,10 +31,13 @@ struct InputState {
|
||||
bool start, select, home, share;
|
||||
};
|
||||
|
||||
public:
|
||||
Drum drum;
|
||||
DPad dpad;
|
||||
Buttons buttons;
|
||||
};
|
||||
|
||||
public:
|
||||
Drum drum;
|
||||
Controller controller;
|
||||
|
||||
private:
|
||||
xinput_report_t m_xinput_report;
|
||||
|
23
src/main.cpp
23
src/main.cpp
@ -1,4 +1,4 @@
|
||||
#include "peripherals/Buttons.h"
|
||||
#include "peripherals/Controller.h"
|
||||
#include "peripherals/Drum.h"
|
||||
#include "peripherals/StatusLed.h"
|
||||
#include "usb/usb_driver.h"
|
||||
@ -13,31 +13,37 @@
|
||||
|
||||
using namespace Doncon;
|
||||
|
||||
queue_t input_queue;
|
||||
queue_t drum_input_queue;
|
||||
queue_t controller_input_queue;
|
||||
|
||||
void core1_task() {
|
||||
multicore_lockout_victim_init();
|
||||
|
||||
Utils::InputState input_state;
|
||||
Peripherals::Buttons buttons(Config::Default::button_config);
|
||||
Peripherals::StatusLed led(Config::Default::led_config);
|
||||
|
||||
while (true) {
|
||||
if (queue_try_remove(&input_queue, &input_state)) {
|
||||
buttons.updateInputState(input_state);
|
||||
|
||||
queue_try_add(&controller_input_queue, &input_state.controller);
|
||||
|
||||
if (queue_try_remove(&drum_input_queue, &input_state.drum)) {
|
||||
led.setInputState(input_state);
|
||||
}
|
||||
|
||||
led.update();
|
||||
|
||||
sleep_ms(1);
|
||||
// sleep_ms(1);
|
||||
}
|
||||
}
|
||||
|
||||
int main() {
|
||||
queue_init(&input_queue, sizeof(Utils::InputState), 1);
|
||||
queue_init(&drum_input_queue, sizeof(Utils::InputState::Drum), 1);
|
||||
queue_init(&controller_input_queue, sizeof(Utils::InputState::Controller), 1);
|
||||
|
||||
Utils::InputState input_state;
|
||||
Peripherals::Drum drum(Config::Default::drum_config);
|
||||
Peripherals::Buttons buttons(Config::Default::button_config); // Move to core 1?
|
||||
usb_mode_t mode = USB_MODE_XBOX360;
|
||||
|
||||
usb_driver_init(mode);
|
||||
@ -48,12 +54,13 @@ int main() {
|
||||
|
||||
while (true) {
|
||||
drum.updateInputState(input_state);
|
||||
buttons.updateInputState(input_state);
|
||||
|
||||
queue_try_remove(&controller_input_queue, &input_state.controller);
|
||||
|
||||
usb_driver_send_and_receive_report(input_state.getReport(mode));
|
||||
usb_driver_task();
|
||||
|
||||
queue_try_add(&input_queue, &input_state);
|
||||
queue_try_add(&drum_input_queue, &input_state);
|
||||
}
|
||||
|
||||
return 0;
|
||||
|
@ -1,4 +1,4 @@
|
||||
#include "peripherals/Buttons.h"
|
||||
#include "peripherals/Controller.h"
|
||||
|
||||
#include "hardware/gpio.h"
|
||||
#include "pico/time.h"
|
||||
@ -23,25 +23,25 @@ void Buttons::Button::setState(bool state, uint8_t debounce_delay) {
|
||||
void Buttons::socdClean(Utils::InputState &input_state) {
|
||||
|
||||
// Last input has priority
|
||||
if (input_state.dpad.up && input_state.dpad.down) {
|
||||
if (input_state.controller.dpad.up && input_state.controller.dpad.down) {
|
||||
if (m_socd_state.lastVertical == Id::DOWN) {
|
||||
input_state.dpad.down = false;
|
||||
input_state.controller.dpad.down = false;
|
||||
} else if (m_socd_state.lastVertical == Id::UP) {
|
||||
input_state.dpad.up = false;
|
||||
input_state.controller.dpad.up = false;
|
||||
}
|
||||
} else if (input_state.dpad.up) {
|
||||
} else if (input_state.controller.dpad.up) {
|
||||
m_socd_state.lastVertical = Id::UP;
|
||||
} else {
|
||||
m_socd_state.lastVertical = Id::DOWN;
|
||||
}
|
||||
|
||||
if (input_state.dpad.left && input_state.dpad.right) {
|
||||
if (input_state.controller.dpad.left && input_state.controller.dpad.right) {
|
||||
if (m_socd_state.lastHorizontal == Id::RIGHT) {
|
||||
input_state.dpad.right = false;
|
||||
input_state.controller.dpad.right = false;
|
||||
} else if (m_socd_state.lastHorizontal == Id::LEFT) {
|
||||
input_state.dpad.left = false;
|
||||
input_state.controller.dpad.left = false;
|
||||
}
|
||||
} else if (input_state.dpad.left) {
|
||||
} else if (input_state.controller.dpad.left) {
|
||||
m_socd_state.lastHorizontal = Id::LEFT;
|
||||
} else {
|
||||
m_socd_state.lastHorizontal = Id::RIGHT;
|
||||
@ -83,20 +83,20 @@ void Buttons::updateInputState(Utils::InputState &input_state) {
|
||||
button.second.setState(gpio_state & button.second.getGpioMask(), m_config.debounce_delay_ms);
|
||||
}
|
||||
|
||||
input_state.dpad.up = m_buttons.at(Id::UP).getState();
|
||||
input_state.dpad.down = m_buttons.at(Id::DOWN).getState();
|
||||
input_state.dpad.left = m_buttons.at(Id::LEFT).getState();
|
||||
input_state.dpad.right = m_buttons.at(Id::RIGHT).getState();
|
||||
input_state.buttons.north = m_buttons.at(Id::NORTH).getState();
|
||||
input_state.buttons.east = m_buttons.at(Id::EAST).getState();
|
||||
input_state.buttons.south = m_buttons.at(Id::SOUTH).getState();
|
||||
input_state.buttons.west = m_buttons.at(Id::WEST).getState();
|
||||
input_state.buttons.l = m_buttons.at(Id::L).getState();
|
||||
input_state.buttons.r = m_buttons.at(Id::R).getState();
|
||||
input_state.buttons.start = m_buttons.at(Id::START).getState();
|
||||
input_state.buttons.select = m_buttons.at(Id::SELECT).getState();
|
||||
input_state.buttons.home = m_buttons.at(Id::HOME).getState();
|
||||
input_state.buttons.share = m_buttons.at(Id::SHARE).getState();
|
||||
input_state.controller.dpad.up = m_buttons.at(Id::UP).getState();
|
||||
input_state.controller.dpad.down = m_buttons.at(Id::DOWN).getState();
|
||||
input_state.controller.dpad.left = m_buttons.at(Id::LEFT).getState();
|
||||
input_state.controller.dpad.right = m_buttons.at(Id::RIGHT).getState();
|
||||
input_state.controller.buttons.north = m_buttons.at(Id::NORTH).getState();
|
||||
input_state.controller.buttons.east = m_buttons.at(Id::EAST).getState();
|
||||
input_state.controller.buttons.south = m_buttons.at(Id::SOUTH).getState();
|
||||
input_state.controller.buttons.west = m_buttons.at(Id::WEST).getState();
|
||||
input_state.controller.buttons.l = m_buttons.at(Id::L).getState();
|
||||
input_state.controller.buttons.r = m_buttons.at(Id::R).getState();
|
||||
input_state.controller.buttons.start = m_buttons.at(Id::START).getState();
|
||||
input_state.controller.buttons.select = m_buttons.at(Id::SELECT).getState();
|
||||
input_state.controller.buttons.home = m_buttons.at(Id::HOME).getState();
|
||||
input_state.controller.buttons.share = m_buttons.at(Id::SHARE).getState();
|
||||
|
||||
socdClean(input_state);
|
||||
}
|
@ -6,8 +6,9 @@
|
||||
namespace Doncon::Utils {
|
||||
|
||||
InputState::InputState()
|
||||
: drum({{false, 0}, {false, 0}, {false, 0}, {false, 0}}), dpad({false, false, false, false}),
|
||||
buttons({false, false, false, false, false, false, false, false, false, false}),
|
||||
: drum({{false, 0}, {false, 0}, {false, 0}, {false, 0}}),
|
||||
controller(
|
||||
{{false, false, false, false}, {false, false, false, false, false, false, false, false, false, false}}),
|
||||
m_xinput_report({0x00, sizeof(xinput_report_t), 0, 0, 0, 0, 0, 0, 0, 0, {}}) {}
|
||||
|
||||
usb_report_t InputState::getReport(usb_mode_t mode) {
|
||||
@ -30,23 +31,23 @@ usb_report_t InputState::getReport(usb_mode_t mode) {
|
||||
|
||||
usb_report_t InputState::getXinputReport() {
|
||||
m_xinput_report.buttons1 = 0 //
|
||||
| (dpad.up ? (1 << 0) : 0) // Dpad Up
|
||||
| ((dpad.down || drum.don_left.triggered) ? (1 << 1) : 0) // Dpad Down
|
||||
| ((dpad.left || drum.ka_left.triggered) ? (1 << 2) : 0) // Dpad Left
|
||||
| (dpad.right ? (1 << 3) : 0) // Dpad Right
|
||||
| (buttons.start ? (1 << 4) : 0) // Start
|
||||
| (buttons.select ? (1 << 5) : 0) // Select
|
||||
| (controller.dpad.up ? (1 << 0) : 0) // Dpad Up
|
||||
| ((controller.dpad.down || drum.don_left.triggered) ? (1 << 1) : 0) // Dpad Down
|
||||
| ((controller.dpad.left || drum.ka_left.triggered) ? (1 << 2) : 0) // Dpad Left
|
||||
| (controller.dpad.right ? (1 << 3) : 0) // Dpad Right
|
||||
| (controller.buttons.start ? (1 << 4) : 0) // Start
|
||||
| (controller.buttons.select ? (1 << 5) : 0) // Select
|
||||
| (false ? (1 << 6) : 0) // L3
|
||||
| (false ? (1 << 7) : 0); // R3
|
||||
|
||||
m_xinput_report.buttons2 = 0 //
|
||||
| (buttons.l ? (1 << 0) : 0) // L1
|
||||
| (buttons.r ? (1 << 1) : 0) // R1
|
||||
| (buttons.home ? (1 << 2) : 0) // Guide
|
||||
| ((buttons.south || drum.don_right.triggered) ? (1 << 4) : 0) // A
|
||||
| ((buttons.east || drum.ka_right.triggered) ? (1 << 5) : 0) // B
|
||||
| (buttons.west ? (1 << 6) : 0) // X
|
||||
| (buttons.north ? (1 << 7) : 0); // Y
|
||||
| (controller.buttons.l ? (1 << 0) : 0) // L1
|
||||
| (controller.buttons.r ? (1 << 1) : 0) // R1
|
||||
| (controller.buttons.home ? (1 << 2) : 0) // Guide
|
||||
| ((controller.buttons.south || drum.don_right.triggered) ? (1 << 4) : 0) // A
|
||||
| ((controller.buttons.east || drum.ka_right.triggered) ? (1 << 5) : 0) // B
|
||||
| (controller.buttons.west ? (1 << 6) : 0) // X
|
||||
| (controller.buttons.north ? (1 << 7) : 0); // Y
|
||||
|
||||
m_xinput_report.lt = 0;
|
||||
m_xinput_report.rt = 0;
|
||||
|
Loading…
Reference in New Issue
Block a user