Skip to content

Commit

Permalink
Connect to DreamConn only once registered (#1828)
Browse files Browse the repository at this point in the history
  • Loading branch information
Tails86 authored Feb 3, 2025
1 parent 7cb0fe5 commit 77ed9c2
Show file tree
Hide file tree
Showing 4 changed files with 55 additions and 23 deletions.
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;
};

0 comments on commit 77ed9c2

Please sign in to comment.