Skip to content

Commit

Permalink
Rumble fixes
Browse files Browse the repository at this point in the history
Notable Changes:
- Turn off rumble on handhelds like the Steam Deck if a controller is attached
- Fix instances where DualSense could fail to produce haptics and rumble
  • Loading branch information
streetpea committed Feb 23, 2025
1 parent c9a233f commit 19e38d7
Show file tree
Hide file tree
Showing 4 changed files with 18 additions and 22 deletions.
4 changes: 3 additions & 1 deletion gui/include/controllermanager.h
Original file line number Diff line number Diff line change
Expand Up @@ -36,6 +36,7 @@ class ControllerManager : public QObject
bool joystick_allow_background_events;
bool is_app_active;
bool moved;
uint8_t dualsense_intensity;

void ControllerClosed(Controller *controller);
void CheckMoved();
Expand All @@ -55,6 +56,8 @@ class ControllerManager : public QObject
void SetButtonsByPos();
void SetAllowJoystickBackgroundEvents(bool enabled);
void SetIsAppActive(bool active);
void SetDualSenseIntensity(uint8_t intensity) { dualsense_intensity = intensity; };
uint8_t GetDualSenseIntensity() { return dualsense_intensity; };
void creatingControllerMapping(bool creating_controller_mapping);
QSet<int> GetAvailableControllers();
Controller *OpenController(int device_id);
Expand Down Expand Up @@ -126,7 +129,6 @@ class Controller : public QObject
QString GetGUIDString();
ChiakiControllerState GetState();
void SetRumble(uint8_t left, uint8_t right);
void SetDualSenseIntensity(uint8_t trigger_intensity, uint8_t rumble_intensity);
void SetTriggerEffects(uint8_t type_left, const uint8_t *data_left, uint8_t type_right, const uint8_t *data_right);
void SetDualsenseMic(bool on);
void SetHapticRumble(uint16_t left, uint16_t right);
Expand Down
1 change: 1 addition & 0 deletions gui/include/streamsession.h
Original file line number Diff line number Diff line change
Expand Up @@ -328,6 +328,7 @@ class StreamSession : public QObject
#if CHIAKI_GUI_ENABLE_STEAMDECK_NATIVE
void SdeckHapticPushed(haptic_packet_t packetl, haptic_packet_t packetr);
#endif
void DualSenseIntensityChanged(uint8_t intensity);
void SessionQuit(ChiakiQuitReason reason, const QString &reason_str);
void LoginPINRequested(bool incorrect);
void DataHolepunchProgress(bool finished);
Expand Down
17 changes: 5 additions & 12 deletions gui/src/controllermanager.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -140,7 +140,7 @@ ControllerManager *ControllerManager::GetInstance()

ControllerManager::ControllerManager(QObject *parent)
: QObject(parent), creating_controller_mapping(false),
joystick_allow_background_events(true), is_app_active(true)
joystick_allow_background_events(true), dualsense_intensity(0x00), is_app_active(true)
{
#ifdef CHIAKI_GUI_ENABLE_SDL_GAMECONTROLLER
SDL_SetMainReady();
Expand Down Expand Up @@ -798,6 +798,8 @@ void Controller::SetDualSenseRumble(uint8_t left, uint8_t right)
state.ucRumbleLeft = left;
state.ucRumbleRight = right;
}
state.rgucUnknown1[4] = manager->GetDualSenseIntensity();
state.ucEnableBits2 |= 0x40;
state.ucEnableBits1 |= 0x02;
SDL_GameControllerSendEffect(controller, &state, sizeof(state));
#endif
Expand All @@ -815,17 +817,6 @@ void Controller::SetRumble(uint8_t left, uint8_t right)
#endif
}

void Controller::SetDualSenseIntensity(uint8_t trigger_intensity, uint8_t rumble_intensity)
{
if((!is_dualsense && !is_dualsense_edge) || !controller)
return;
DS5EffectsState_t state;
SDL_zero(state);
state.rgucUnknown1[4] = trigger_intensity | rumble_intensity;
state.ucEnableBits2 |= 0x40;
SDL_GameControllerSendEffect(controller, &state, sizeof(state));
}

void Controller::ChangeLEDColor(const uint8_t *led_color)
{
#ifdef CHIAKI_GUI_ENABLE_SDL_GAMECONTROLLER
Expand All @@ -842,6 +833,8 @@ void Controller::SetTriggerEffects(uint8_t type_left, const uint8_t *data_left,
return;
DS5EffectsState_t state;
SDL_zero(state);
state.rgucUnknown1[4] = manager->GetDualSenseIntensity();
state.ucEnableBits2 |= 0x40;
state.ucEnableBits1 |= (0x04 /* left trigger */ | 0x08 /* right trigger */);
state.rgucLeftTriggerEffect[0] = type_left;
SDL_memcpy(state.rgucLeftTriggerEffect + 1, data_left, 10);
Expand Down
18 changes: 9 additions & 9 deletions gui/src/streamsession.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -385,6 +385,7 @@ StreamSession::StreamSession(const StreamSessionConnectInfo &connect_info, QObje

#if CHIAKI_GUI_ENABLE_SDL_GAMECONTROLLER
connect(ControllerManager::GetInstance(), &ControllerManager::AvailableControllersUpdated, this, &StreamSession::UpdateGamepads);
connect(this, &StreamSession::DualSenseIntensityChanged, ControllerManager::GetInstance(), &ControllerManager::SetDualSenseIntensity);
if(connect_info.buttons_by_pos)
ControllerManager::GetInstance()->SetButtonsByPos();
#endif
Expand Down Expand Up @@ -955,7 +956,6 @@ void StreamSession::UpdateGamepads()
{
uint8_t trigger_intensity = (ps5_trigger_intensity < 0) ? 0xF0 : ps5_trigger_intensity;
uint8_t rumble_intensity = (ps5_rumble_intensity < 0) ? 0x0F : ps5_rumble_intensity;
controller->SetDualSenseIntensity(trigger_intensity, rumble_intensity);
controller->SetDualsenseMic(muted);
if(this->haptics_output > 0)
continue;
Expand Down Expand Up @@ -1833,6 +1833,12 @@ void StreamSession::Event(ChiakiEvent *event)
QMetaObject::invokeMethod(this, [this, left, right, left_adj, right_adj]() {
for(auto controller : controllers)
{
#if CHIAKI_GUI_ENABLE_STEAMDECK_NATIVE
if(haptics_handheld < 1 && (controller->IsHandheld() || (sdeck && controller->IsSteamVirtualUnmasked())))
#else
if(haptics_handheld < 1 && controller->IsHandheld())
#endif
continue;
if(controller->IsDualSense() || controller->IsDualSenseEdge())
controller->SetRumble(left, right);
else
Expand Down Expand Up @@ -1903,10 +1909,7 @@ void StreamSession::Event(ChiakiEvent *event)
}
uint8_t trigger_intensity = (ps5_trigger_intensity < 0) ? 0xF0 : ps5_trigger_intensity;
uint8_t rumble_intensity = (ps5_rumble_intensity < 0) ? 0x0F : ps5_rumble_intensity;
QMetaObject::invokeMethod(this, [this, trigger_intensity, rumble_intensity]() {
for(auto controller : controllers)
controller->SetDualSenseIntensity(trigger_intensity, rumble_intensity);
});
emit DualSenseIntensityChanged(trigger_intensity | rumble_intensity);
break;
}
case CHIAKI_EVENT_TRIGGER_INTENSITY: {
Expand All @@ -1931,10 +1934,7 @@ void StreamSession::Event(ChiakiEvent *event)
}
uint8_t trigger_intensity = (ps5_trigger_intensity < 0) ? 0xF0 : ps5_trigger_intensity;
uint8_t rumble_intensity = (ps5_rumble_intensity < 0) ? 0x0F : ps5_rumble_intensity;
QMetaObject::invokeMethod(this, [this, trigger_intensity, rumble_intensity]() {
for(auto controller : controllers)
controller->SetDualSenseIntensity(trigger_intensity, rumble_intensity);
});
emit DualSenseIntensityChanged(trigger_intensity | rumble_intensity);
break;
}
case CHIAKI_EVENT_TRIGGER_EFFECTS: {
Expand Down

0 comments on commit 19e38d7

Please sign in to comment.