diff --git a/rpcs3/Input/ds4_pad_handler.cpp b/rpcs3/Input/ds4_pad_handler.cpp index 3ca1ecd036..e121b9a5a6 100644 --- a/rpcs3/Input/ds4_pad_handler.cpp +++ b/rpcs3/Input/ds4_pad_handler.cpp @@ -196,7 +196,7 @@ u32 ds4_pad_handler::get_battery_level(const std::string& padId) void ds4_pad_handler::SetPadData(const std::string& padId, u32 largeMotor, u32 smallMotor, s32 r, s32 g, s32 b, bool battery_led, u32 battery_led_brightness) { std::shared_ptr device = get_hid_device(padId); - if (device == nullptr || device->hidDevice == nullptr) + if (!device || !device->hidDevice || !device->config) return; // Set the device's motor speeds to our requested values 0-255 @@ -218,6 +218,8 @@ void ds4_pad_handler::SetPadData(const std::string& padId, u32 largeMotor, u32 s } } + ensure(device->config); + // Set new LED color if (battery_led) { @@ -709,7 +711,7 @@ ds4_pad_handler::DataStatus ds4_pad_handler::get_data(DS4Device* device) const int battery_offset = offset + DS4_INPUT_REPORT_BATTERY_OFFSET; device->cable_state = (buf[battery_offset] >> 4) & 0x01; - device->battery_level = buf[battery_offset] & 0x0F; + device->battery_level = buf[battery_offset] & 0x0F; // 0 - 9 while unplugged, 0 - 10 while plugged in, 11 charge complete if (device->has_calib_data) { @@ -871,22 +873,22 @@ void ds4_pad_handler::apply_pad_data(const std::shared_ptr& device, c const int speed_large = config->enable_vibration_motor_large ? pad->m_vibrateMotors[idx_l].m_value : vibration_min; const int speed_small = config->enable_vibration_motor_small ? pad->m_vibrateMotors[idx_s].m_value : vibration_min; - const bool wireless = ds4_dev->cable_state < 1; - const bool lowBattery = ds4_dev->battery_level < 2; - const bool isBlinking = ds4_dev->led_delay_on > 0 || ds4_dev->led_delay_off > 0; + const bool wireless = ds4_dev->cable_state == 0; + const bool low_battery = ds4_dev->battery_level < 2; + const bool is_blinking = ds4_dev->led_delay_on > 0 || ds4_dev->led_delay_off > 0; // Blink LED when battery is low if (config->led_low_battery_blink) { // we are now wired or have okay battery level -> stop blinking - if (isBlinking && !(wireless && lowBattery)) + if (is_blinking && !(wireless && low_battery)) { ds4_dev->led_delay_on = 0; ds4_dev->led_delay_off = 0; ds4_dev->new_output_data = true; } // we are now wireless and low on battery -> blink - else if (!isBlinking && wireless && lowBattery) + else if (!is_blinking && wireless && low_battery) { ds4_dev->led_delay_on = 100; ds4_dev->led_delay_off = 100; diff --git a/rpcs3/Input/ds4_pad_handler.h b/rpcs3/Input/ds4_pad_handler.h index 633a9438a8..94dad42d16 100644 --- a/rpcs3/Input/ds4_pad_handler.h +++ b/rpcs3/Input/ds4_pad_handler.h @@ -11,9 +11,6 @@ public: bool bt_controller{false}; bool has_calib_data{false}; std::array calib_data{}; - u8 battery_level{0}; - u8 last_battery_level{0}; - u8 cable_state{0}; }; class ds4_pad_handler final : public hid_pad_handler diff --git a/rpcs3/Input/dualsense_pad_handler.cpp b/rpcs3/Input/dualsense_pad_handler.cpp index db4dcda401..e2439e22b3 100644 --- a/rpcs3/Input/dualsense_pad_handler.cpp +++ b/rpcs3/Input/dualsense_pad_handler.cpp @@ -990,6 +990,8 @@ void dualsense_pad_handler::SetPadData(const std::string& padId, u32 largeMotor, } } + ensure(device->config); + // Set new LED color (see ds4_pad_handler) if (r >= 0 && g >= 0 && b >= 0 && r <= 255 && g <= 255 && b <= 255) { diff --git a/rpcs3/Input/hid_pad_handler.h b/rpcs3/Input/hid_pad_handler.h index 2e849f3fa5..5de58a95f9 100644 --- a/rpcs3/Input/hid_pad_handler.h +++ b/rpcs3/Input/hid_pad_handler.h @@ -39,6 +39,9 @@ public: u8 small_motor{0}; u8 led_delay_on{0}; u8 led_delay_off{0}; + u8 battery_level{0}; + u8 last_battery_level{0}; + u8 cable_state{0}; }; template