Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Connect to DreamConn only once registered #1828

Merged
merged 4 commits into from
Feb 3, 2025
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
5 changes: 4 additions & 1 deletion core/input/gamepad_device.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -329,7 +329,7 @@ bool GamepadDevice::gamepad_axis_input(u32 code, int value)
int threshold = 16384;
if (code == leftTrigger || code == rightTrigger )
threshold = 100;

if (std::abs(v) < threshold)
kcode[port] |= key; // button released
else
Expand Down Expand Up @@ -554,6 +554,9 @@ void GamepadDevice::Register(const std::shared_ptr<GamepadDevice>& gamepad)
Lock _(_gamepads_mutex);
_gamepads.push_back(gamepad);
MapleConfigMap::UpdateVibration = updateVibration;

gamepad->_is_registered = true;
gamepad->registered();
}

void GamepadDevice::Unregister(const std::shared_ptr<GamepadDevice>& gamepad)
Expand Down
5 changes: 4 additions & 1 deletion core/input/gamepad_device.h
Original file line number Diff line number Diff line change
Expand Up @@ -40,7 +40,7 @@ class GamepadDevice
virtual bool gamepad_btn_input(u32 code, bool pressed);
virtual bool gamepad_axis_input(u32 code, int value);
virtual ~GamepadDevice() = default;

void detect_btn_input(input_detected_cb button_pressed);
void detect_axis_input(input_detected_cb axis_moved);
void detectButtonOrAxisInput(input_detected_cb input_changed);
Expand Down Expand Up @@ -91,6 +91,7 @@ class GamepadDevice
save_mapping();
}
}
bool is_registered() const { return _is_registered; }

static void Register(const std::shared_ptr<GamepadDevice>& gamepad);
static void Unregister(const std::shared_ptr<GamepadDevice>& gamepad);
Expand Down Expand Up @@ -145,6 +146,7 @@ class GamepadDevice
u32 rightTrigger = ~0;

private:
virtual void registered() {}
bool handleButtonInput(int port, DreamcastKey key, bool pressed);
std::string make_mapping_filename(bool instance, int system, bool perGame = false);

Expand Down Expand Up @@ -189,6 +191,7 @@ class GamepadDevice
u64 _detection_start_time = 0;
input_detected_cb _input_detected;
bool _remappable;
bool _is_registered = false;
u32 digitalToAnalogState[4];
std::map<DreamcastKey, int> lastAxisValue[4];
bool perGameMapping = false;
Expand Down
56 changes: 40 additions & 16 deletions core/sdl/dreamconn.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -566,7 +566,19 @@ class DreamcastControllerUsbPicoConnection : public DreamcastControllerConnectio
}
};

DreamConn::DreamConn(int bus, int dreamcastControllerType) : bus(bus), dreamcastControllerType(dreamcastControllerType) {
DreamConn::DreamConn(int bus, int dreamcastControllerType, const std::string& name) :
bus(bus), dreamcastControllerType(dreamcastControllerType), name(name)
{
change_bus(bus);
}

DreamConn::~DreamConn() {
disconnect();
}

void DreamConn::change_bus(int bus) {
disconnect();
dcConnection.reset();
switch (dreamcastControllerType)
{
case TYPE_DREAMCONN:
Expand All @@ -577,16 +589,14 @@ DreamConn::DreamConn(int bus, int dreamcastControllerType) : bus(bus), dreamcast
dcConnection = std::make_unique<DreamcastControllerUsbPicoConnection>(bus);
break;
}

connect();
}

DreamConn::~DreamConn() {
disconnect();
}

void DreamConn::connect()
{
if (maple_io_connected) {
disconnect();
}

maple_io_connected = false;
expansionDevs = 0;

Expand All @@ -607,7 +617,7 @@ void DreamConn::connect()

if (hasVmu() || hasRumble())
{
NOTICE_LOG(INPUT, "Connected to DreamcastController[%d]: Type:%s, VMU:%d, Rumble Pack:%d", bus, dreamcastControllerType == 1 ? "DreamConn+ / DreamcConn S Controller" : "Dreamcast Controller USB", hasVmu(), hasRumble());
NOTICE_LOG(INPUT, "Connected to DreamcastController[%d]: Type:%s, VMU:%d, Rumble Pack:%d", bus, name.c_str(), hasVmu(), hasRumble());
maple_io_connected = true;
}
else
Expand Down Expand Up @@ -682,13 +692,13 @@ DreamConnGamepad::DreamConnGamepad(int maple_port, int joystick_idx, SDL_Joystic
// Dreamcast Controller USB VID:1209 PID:2f07
if (memcmp(DreamConnConnection::VID_PID_GUID, guid_str + 8, 16) == 0)
{
dreamcastControllerType = TYPE_DREAMCONN;
_name = "DreamConn+ / DreamConn S Controller";
dreamconn = std::make_shared<DreamConn>(maple_port, TYPE_DREAMCONN, _name);
}
else if (memcmp(DreamcastControllerUsbPicoConnection::VID_PID_GUID, guid_str + 8, 16) == 0)
{
dreamcastControllerType = TYPE_DREAMCASTCONTROLLERUSB;
_name = "Dreamcast Controller USB";
dreamconn = std::make_shared<DreamConn>(maple_port, TYPE_DREAMCASTCONTROLLERUSB, _name);
}

EventManager::listen(Event::Start, handleEvent, this);
Expand All @@ -702,16 +712,28 @@ DreamConnGamepad::~DreamConnGamepad() {

void DreamConnGamepad::set_maple_port(int port)
{
if (port < 0 || port >= 4) {
dreamconn.reset();
}
else if (dreamconn == nullptr || dreamconn->getBus() != port) {
dreamconn.reset();
dreamconn = std::make_shared<DreamConn>(port, dreamcastControllerType);
if (dreamconn) {
if (port < 0 || port >= 4) {
dreamconn->disconnect();
}
else if (dreamconn->getBus() != port) {
dreamconn->change_bus(port);
if (is_registered()) {
dreamconn->connect();
}
}
}
SDLGamepad::set_maple_port(port);
}

void DreamConnGamepad::registered()
{
if (dreamconn)
{
dreamconn->connect();
}
}

void DreamConnGamepad::handleEvent(Event event, void *arg)
{
DreamConnGamepad *gamepad = static_cast<DreamConnGamepad*>(arg);
Expand Down Expand Up @@ -778,6 +800,8 @@ DreamConnGamepad::~DreamConnGamepad() {
void DreamConnGamepad::set_maple_port(int port) {
SDLGamepad::set_maple_port(port);
}
void DreamConnGamepad::registered() {
}
bool DreamConnGamepad::gamepad_btn_input(u32 code, bool pressed) {
return SDLGamepad::gamepad_btn_input(code, pressed);
}
Expand Down
12 changes: 7 additions & 5 deletions core/sdl/dreamconn.h
Original file line number Diff line number Diff line change
Expand Up @@ -50,16 +50,17 @@ static_assert(sizeof(MapleMsg) == 1028);

class DreamConn
{
const int bus;
int bus = -1;
const int dreamcastControllerType;
const std::string name;
#ifdef USE_DREAMCASTCONTROLLER
std::unique_ptr<class DreamcastControllerConnection> dcConnection;
#endif
bool maple_io_connected;
bool maple_io_connected = false;
u8 expansionDevs = 0;

public:
DreamConn(int bus, int dreamcastControllerType);
DreamConn(int bus, int dreamcastControllerType, const std::string& name);

~DreamConn();

Expand All @@ -75,7 +76,8 @@ class DreamConn
return expansionDevs & 2;
}

private:
void change_bus(int bus);

void connect();
void disconnect();
};
Expand All @@ -87,6 +89,7 @@ class DreamConnGamepad : public SDLGamepad
~DreamConnGamepad();

void set_maple_port(int port) override;
void registered() override;
bool gamepad_btn_input(u32 code, bool pressed) override;
bool gamepad_axis_input(u32 code, int value) override;
static bool isDreamcastController(int deviceIndex);
Expand All @@ -99,5 +102,4 @@ class DreamConnGamepad : public SDLGamepad
bool ltrigPressed = false;
bool rtrigPressed = false;
bool startPressed = false;
int dreamcastControllerType;
};
Loading