input: add some sanity checks

This commit is contained in:
Megamouse 2021-02-28 04:32:08 +01:00
parent 10a55f16cc
commit 22b8cfd0ba
4 changed files with 14 additions and 10 deletions

View file

@ -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) 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<DS4Device> device = get_hid_device(padId); std::shared_ptr<DS4Device> device = get_hid_device(padId);
if (device == nullptr || device->hidDevice == nullptr) if (!device || !device->hidDevice || !device->config)
return; return;
// Set the device's motor speeds to our requested values 0-255 // 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 // Set new LED color
if (battery_led) 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; const int battery_offset = offset + DS4_INPUT_REPORT_BATTERY_OFFSET;
device->cable_state = (buf[battery_offset] >> 4) & 0x01; 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) if (device->has_calib_data)
{ {
@ -871,22 +873,22 @@ void ds4_pad_handler::apply_pad_data(const std::shared_ptr<PadDevice>& device, c
const int speed_large = config->enable_vibration_motor_large ? pad->m_vibrateMotors[idx_l].m_value : vibration_min; 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 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 wireless = ds4_dev->cable_state == 0;
const bool lowBattery = ds4_dev->battery_level < 2; const bool low_battery = ds4_dev->battery_level < 2;
const bool isBlinking = ds4_dev->led_delay_on > 0 || ds4_dev->led_delay_off > 0; const bool is_blinking = ds4_dev->led_delay_on > 0 || ds4_dev->led_delay_off > 0;
// Blink LED when battery is low // Blink LED when battery is low
if (config->led_low_battery_blink) if (config->led_low_battery_blink)
{ {
// we are now wired or have okay battery level -> stop blinking // 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_on = 0;
ds4_dev->led_delay_off = 0; ds4_dev->led_delay_off = 0;
ds4_dev->new_output_data = true; ds4_dev->new_output_data = true;
} }
// we are now wireless and low on battery -> blink // 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_on = 100;
ds4_dev->led_delay_off = 100; ds4_dev->led_delay_off = 100;

View file

@ -11,9 +11,6 @@ public:
bool bt_controller{false}; bool bt_controller{false};
bool has_calib_data{false}; bool has_calib_data{false};
std::array<CalibData, CalibIndex::COUNT> calib_data{}; std::array<CalibData, CalibIndex::COUNT> calib_data{};
u8 battery_level{0};
u8 last_battery_level{0};
u8 cable_state{0};
}; };
class ds4_pad_handler final : public hid_pad_handler<DS4Device> class ds4_pad_handler final : public hid_pad_handler<DS4Device>

View file

@ -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) // Set new LED color (see ds4_pad_handler)
if (r >= 0 && g >= 0 && b >= 0 && r <= 255 && g <= 255 && b <= 255) if (r >= 0 && g >= 0 && b >= 0 && r <= 255 && g <= 255 && b <= 255)
{ {

View file

@ -39,6 +39,9 @@ public:
u8 small_motor{0}; u8 small_motor{0};
u8 led_delay_on{0}; u8 led_delay_on{0};
u8 led_delay_off{0}; u8 led_delay_off{0};
u8 battery_level{0};
u8 last_battery_level{0};
u8 cable_state{0};
}; };
template <class Device> template <class Device>