clang format pass

This commit is contained in:
Katharine Chui 2025-05-01 10:18:21 +02:00
parent dc25f9e08e
commit 0729f7d078
10 changed files with 1225 additions and 1214 deletions

View file

@ -211,11 +211,11 @@ private:
// GT5 Wheels&co // GT5 Wheels&co
#ifdef HAVE_SDL3 #ifdef HAVE_SDL3
{0x046D, 0xC283, 0xC29B, "lgFF_c283_c29b", &usb_device_logitech_g27::get_num_emu_devices, &usb_device_logitech_g27::make_instance}, {0x046D, 0xC283, 0xC29B, "lgFF_c283_c29b", &usb_device_logitech_g27::get_num_emu_devices, &usb_device_logitech_g27::make_instance},
#else #else
{0x046D, 0xC283, 0xC29B, "lgFF_c283_c29b", nullptr, nullptr}, {0x046D, 0xC283, 0xC29B, "lgFF_c283_c29b", nullptr, nullptr},
#endif #endif
{0x044F, 0xB653, 0xB653, "Thrustmaster RGT FFB Pro", nullptr, nullptr}, {0x044F, 0xB653, 0xB653, "Thrustmaster RGT FFB Pro", nullptr, nullptr},
{0x044F, 0xB65A, 0xB65A, "Thrustmaster F430", nullptr, nullptr}, {0x044F, 0xB65A, 0xB65A, "Thrustmaster F430", nullptr, nullptr},
{0x044F, 0xB65D, 0xB65D, "Thrustmaster FFB", nullptr, nullptr}, {0x044F, 0xB65D, 0xB65D, "Thrustmaster FFB", nullptr, nullptr},

View file

@ -7,7 +7,6 @@
// shifter input ref // shifter input ref
// https://github.com/sonik-br/lgff_wheel_adapter/blob/d97f7823154818e1b3edff6d51498a122c302728/pico_lgff_wheel_adapter/reports.h#L265-L310 // https://github.com/sonik-br/lgff_wheel_adapter/blob/d97f7823154818e1b3edff6d51498a122c302728/pico_lgff_wheel_adapter/reports.h#L265-L310
#include "stdafx.h" #include "stdafx.h"
#ifdef HAVE_SDL3 #ifdef HAVE_SDL3
@ -23,11 +22,11 @@
LOG_CHANNEL(logitech_g27_log, "LOGIG27"); LOG_CHANNEL(logitech_g27_log, "LOGIG27");
static int SDLCALL refresh_thread(void *arg) static int SDLCALL refresh_thread(void* arg)
{ {
auto ctx = reinterpret_cast<usb_device_logitech_g27 *>(arg); auto ctx = reinterpret_cast<usb_device_logitech_g27*>(arg);
while(true) while (true)
{ {
ctx->thread_control_mutex.lock(); ctx->thread_control_mutex.lock();
if (ctx->stop_thread) if (ctx->stop_thread)
@ -50,15 +49,15 @@ usb_device_logitech_g27::usb_device_logitech_g27(u32 controller_index, const std
// parse the raw response like with passthrough device // parse the raw response like with passthrough device
static const uint8_t raw_config[] = {0x9, 0x2, 0x29, 0x0, 0x1, 0x1, 0x4, 0x80, 0x31, 0x9, 0x4, 0x0, 0x0, 0x2, 0x3, 0x0, 0x0, 0x0, 0x9, 0x21, 0x11, 0x1, 0x21, 0x1, 0x22, 0x85, 0x0, 0x7, 0x5, 0x81, 0x3, 0x10, 0x0, 0x2, 0x7, 0x5, 0x1, 0x3, 0x10, 0x0, 0x2}; static const uint8_t raw_config[] = {0x9, 0x2, 0x29, 0x0, 0x1, 0x1, 0x4, 0x80, 0x31, 0x9, 0x4, 0x0, 0x0, 0x2, 0x3, 0x0, 0x0, 0x0, 0x9, 0x21, 0x11, 0x1, 0x21, 0x1, 0x22, 0x85, 0x0, 0x7, 0x5, 0x81, 0x3, 0x10, 0x0, 0x2, 0x7, 0x5, 0x1, 0x3, 0x10, 0x0, 0x2};
auto &conf = device.add_node(UsbDescriptorNode(raw_config[0], raw_config[1], &raw_config[2])); auto& conf = device.add_node(UsbDescriptorNode(raw_config[0], raw_config[1], &raw_config[2]));
for (unsigned int index = raw_config[0];index < sizeof(raw_config);) for (unsigned int index = raw_config[0]; index < sizeof(raw_config);)
{ {
conf.add_node(UsbDescriptorNode(raw_config[index], raw_config[index + 1], &raw_config[index + 2])); conf.add_node(UsbDescriptorNode(raw_config[index], raw_config[index + 1], &raw_config[index + 2]));
index += raw_config[index]; index += raw_config[index];
} }
// Initialize effect slots // Initialize effect slots
for (int i = 0;i < 4;i++) for (int i = 0; i < 4; i++)
{ {
effect_slots[i].state = G27_FFB_INACTIVE; effect_slots[i].state = G27_FFB_INACTIVE;
effect_slots[i].effect_id = -1; effect_slots[i].effect_id = -1;
@ -66,13 +65,12 @@ usb_device_logitech_g27::usb_device_logitech_g27(u32 controller_index, const std
SDL_HapticDirection direction = { SDL_HapticDirection direction = {
.type = SDL_HAPTIC_POLAR, .type = SDL_HAPTIC_POLAR,
.dir = {27000, 0} .dir = {27000, 0}};
};
default_spring_effect.type = SDL_HAPTIC_SPRING; default_spring_effect.type = SDL_HAPTIC_SPRING;
default_spring_effect.condition.direction = direction; default_spring_effect.condition.direction = direction;
default_spring_effect.condition.length = SDL_HAPTIC_INFINITY; default_spring_effect.condition.length = SDL_HAPTIC_INFINITY;
//for (int i = 0;i < 3;i++) // for (int i = 0;i < 3;i++)
for (int i = 0;i < 1;i++) for (int i = 0; i < 1; i++)
{ {
default_spring_effect.condition.right_sat[i] = 0x7FFF; default_spring_effect.condition.right_sat[i] = 0x7FFF;
default_spring_effect.condition.left_sat[i] = 0x7FFF; default_spring_effect.condition.left_sat[i] = 0x7FFF;
@ -101,15 +99,16 @@ usb_device_logitech_g27::usb_device_logitech_g27(u32 controller_index, const std
} }
} }
bool usb_device_logitech_g27::open_device(){ bool usb_device_logitech_g27::open_device()
{
return enabled; return enabled;
} }
static void clear_sdl_joysticks(std::map<uint32_t, std::vector<SDL_Joystick *>> &joysticks) static void clear_sdl_joysticks(std::map<uint32_t, std::vector<SDL_Joystick*>>& joysticks)
{ {
for (auto joystick_type = joysticks.begin();joystick_type != joysticks.end();joystick_type++) for (auto joystick_type = joysticks.begin(); joystick_type != joysticks.end(); joystick_type++)
{ {
for (auto joystick = joystick_type->second.begin(); joystick != joystick_type->second.end();joystick++) for (auto joystick = joystick_type->second.begin(); joystick != joystick_type->second.end(); joystick++)
{ {
SDL_CloseJoystick(*joystick); SDL_CloseJoystick(*joystick);
} }
@ -159,13 +158,13 @@ void usb_device_logitech_g27::control_transfer(u8 bmRequestType, u8 bRequest, u1
usb_device_emulated::control_transfer(bmRequestType, bRequest, wValue, wIndex, wLength, buf_size, buf, transfer); usb_device_emulated::control_transfer(bmRequestType, bRequest, wValue, wIndex, wLength, buf_size, buf, transfer);
} }
static bool sdl_joysticks_equal(std::map<uint32_t, std::vector<SDL_Joystick *>> &left, std::map<uint32_t, std::vector<SDL_Joystick *>> &right) static bool sdl_joysticks_equal(std::map<uint32_t, std::vector<SDL_Joystick*>>& left, std::map<uint32_t, std::vector<SDL_Joystick*>>& right)
{ {
if (left.size() != right.size()) if (left.size() != right.size())
{ {
return false; return false;
} }
for (auto left_joysticks_of_type = left.begin();left_joysticks_of_type != left.end();left_joysticks_of_type++) for (auto left_joysticks_of_type = left.begin(); left_joysticks_of_type != left.end(); left_joysticks_of_type++)
{ {
auto right_joysticks_of_type = right.find(left_joysticks_of_type->first); auto right_joysticks_of_type = right.find(left_joysticks_of_type->first);
if (right_joysticks_of_type == right.end()) if (right_joysticks_of_type == right.end())
@ -176,10 +175,10 @@ static bool sdl_joysticks_equal(std::map<uint32_t, std::vector<SDL_Joystick *>>
{ {
return false; return false;
} }
for (auto left_joystick = left_joysticks_of_type->second.begin();left_joystick != left_joysticks_of_type->second.end(); left_joystick++) for (auto left_joystick = left_joysticks_of_type->second.begin(); left_joystick != left_joysticks_of_type->second.end(); left_joystick++)
{ {
bool found = false; bool found = false;
for (auto right_joystick = right_joysticks_of_type->second.begin();right_joystick != right_joysticks_of_type->second.end();right_joystick++) for (auto right_joystick = right_joysticks_of_type->second.begin(); right_joystick != right_joysticks_of_type->second.end(); right_joystick++)
{ {
if (*left_joystick == *right_joystick) if (*left_joystick == *right_joystick)
{ {
@ -200,7 +199,7 @@ static inline logitech_g27_sdl_mapping get_runtime_mapping()
{ {
logitech_g27_sdl_mapping mapping; logitech_g27_sdl_mapping mapping;
#define CONVERT_MAPPING(name) \ #define CONVERT_MAPPING(name) \
{ \ { \
mapping.name.device_type_id = g_cfg_logitech_g27.name##_device_type_id.get(); \ mapping.name.device_type_id = g_cfg_logitech_g27.name##_device_type_id.get(); \
mapping.name.type = static_cast<sdl_mapping_type>(g_cfg_logitech_g27.name##_type.get()); \ mapping.name.type = static_cast<sdl_mapping_type>(g_cfg_logitech_g27.name##_type.get()); \
@ -249,7 +248,7 @@ static inline logitech_g27_sdl_mapping get_runtime_mapping()
CONVERT_MAPPING(shifter_6); CONVERT_MAPPING(shifter_6);
CONVERT_MAPPING(shifter_r); CONVERT_MAPPING(shifter_r);
#undef CONVERT_MAPPING #undef CONVERT_MAPPING
return mapping; return mapping;
} }
@ -268,18 +267,17 @@ void usb_device_logitech_g27::sdl_refresh()
uint32_t led_product_id = g_cfg_logitech_g27.led_device_type_id.get() & 0xFFFF; uint32_t led_product_id = g_cfg_logitech_g27.led_device_type_id.get() & 0xFFFF;
g_cfg_logitech_g27.m_mutex.unlock(); g_cfg_logitech_g27.m_mutex.unlock();
SDL_Joystick* new_led_joystick_handle = nullptr;
SDL_Joystick *new_led_joystick_handle = nullptr; SDL_Haptic* new_haptic_handle = nullptr;
SDL_Haptic *new_haptic_handle = nullptr; std::map<uint32_t, std::vector<SDL_Joystick*>> new_joysticks;
std::map<uint32_t, std::vector<SDL_Joystick *>> new_joysticks;
int joystick_count; int joystick_count;
SDL_JoystickID *joystick_ids = SDL_GetJoysticks(&joystick_count); SDL_JoystickID* joystick_ids = SDL_GetJoysticks(&joystick_count);
if (joystick_ids != nullptr) if (joystick_ids != nullptr)
{ {
for (int i = 0;i < joystick_count;i++) for (int i = 0; i < joystick_count; i++)
{ {
SDL_Joystick *cur_joystick = SDL_OpenJoystick(joystick_ids[i]); SDL_Joystick* cur_joystick = SDL_OpenJoystick(joystick_ids[i]);
if (cur_joystick == nullptr) if (cur_joystick == nullptr)
{ {
logitech_g27_log.error("Failed opening joystick %d, %s", joystick_ids[i], SDL_GetError()); logitech_g27_log.error("Failed opening joystick %d, %s", joystick_ids[i], SDL_GetError());
@ -301,7 +299,7 @@ void usb_device_logitech_g27::sdl_refresh()
if (cur_vendor_id == ffb_vendor_id && cur_product_id == ffb_product_id && new_haptic_handle == nullptr) if (cur_vendor_id == ffb_vendor_id && cur_product_id == ffb_product_id && new_haptic_handle == nullptr)
{ {
SDL_Haptic *cur_haptic = SDL_OpenHapticFromJoystick(cur_joystick); SDL_Haptic* cur_haptic = SDL_OpenHapticFromJoystick(cur_joystick);
if (cur_haptic == nullptr) if (cur_haptic == nullptr)
{ {
logitech_g27_log.error("Failed opening haptic device from selected ffb device %04x:%04x", cur_vendor_id, cur_product_id); logitech_g27_log.error("Failed opening haptic device from selected ffb device %04x:%04x", cur_vendor_id, cur_product_id);
@ -341,7 +339,7 @@ void usb_device_logitech_g27::sdl_refresh()
if (haptic_changed) if (haptic_changed)
{ {
SDL_CloseHaptic(haptic_handle); SDL_CloseHaptic(haptic_handle);
for (int i = 0;i < 4;i++) for (int i = 0; i < 4; i++)
{ {
effect_slots[i].effect_id = -1; effect_slots[i].effect_id = -1;
} }
@ -464,7 +462,7 @@ extern bool is_input_allowed();
static uint8_t sdl_hat_to_logitech_g27_hat(uint8_t sdl_hat) static uint8_t sdl_hat_to_logitech_g27_hat(uint8_t sdl_hat)
{ {
switch(sdl_hat) switch (sdl_hat)
{ {
case SDL_HAT_CENTERED: case SDL_HAT_CENTERED:
return 8; return 8;
@ -502,9 +500,9 @@ static uint8_t hat_components_to_logitech_g27_hat(bool up, bool down, bool left,
return sdl_hat_to_logitech_g27_hat(sdl_hat); return sdl_hat_to_logitech_g27_hat(sdl_hat);
} }
static bool fetch_sdl_as_button(SDL_Joystick *joystick, const sdl_mapping &mapping) static bool fetch_sdl_as_button(SDL_Joystick* joystick, const sdl_mapping& mapping)
{ {
switch(mapping.type) switch (mapping.type)
{ {
case MAPPING_BUTTON: case MAPPING_BUTTON:
{ {
@ -552,13 +550,13 @@ static bool fetch_sdl_as_button(SDL_Joystick *joystick, const sdl_mapping &mappi
return false; return false;
} }
static int16_t fetch_sdl_as_axis(SDL_Joystick *joystick, const sdl_mapping &mapping) static int16_t fetch_sdl_as_axis(SDL_Joystick* joystick, const sdl_mapping& mapping)
{ {
const static int16_t MAX = 0x7FFF; const static int16_t MAX = 0x7FFF;
const static int16_t MIN = -0x8000; const static int16_t MIN = -0x8000;
const static int16_t MID = 0; const static int16_t MID = 0;
switch(mapping.type) switch (mapping.type)
{ {
case MAPPING_BUTTON: case MAPPING_BUTTON:
{ {
@ -615,7 +613,7 @@ static int16_t fetch_sdl_as_axis(SDL_Joystick *joystick, const sdl_mapping &mapp
return 0; return 0;
} }
static int16_t fetch_sdl_axis_avg(std::map<uint32_t, std::vector<SDL_Joystick *>> &joysticks, const sdl_mapping &mapping) static int16_t fetch_sdl_axis_avg(std::map<uint32_t, std::vector<SDL_Joystick*>>& joysticks, const sdl_mapping& mapping)
{ {
const static int16_t MAX = 0x7FFF; const static int16_t MAX = 0x7FFF;
const static int16_t MIN = -0x8000; const static int16_t MIN = -0x8000;
@ -633,7 +631,7 @@ static int16_t fetch_sdl_axis_avg(std::map<uint32_t, std::vector<SDL_Joystick *>
// TODO account for deadzone and only pick up active devices // TODO account for deadzone and only pick up active devices
int32_t sdl_joysticks_total_value = 0; int32_t sdl_joysticks_total_value = 0;
for (auto joystick = joysticks_of_type->second.begin();joystick != joysticks_of_type->second.end();joystick++) for (auto joystick = joysticks_of_type->second.begin(); joystick != joysticks_of_type->second.end(); joystick++)
{ {
sdl_joysticks_total_value += fetch_sdl_as_axis(*joystick, mapping); sdl_joysticks_total_value += fetch_sdl_as_axis(*joystick, mapping);
} }
@ -641,7 +639,7 @@ static int16_t fetch_sdl_axis_avg(std::map<uint32_t, std::vector<SDL_Joystick *>
return sdl_joysticks_total_value / joysticks_of_type->second.size(); return sdl_joysticks_total_value / joysticks_of_type->second.size();
} }
static bool sdl_to_logitech_g27_button(std::map<uint32_t, std::vector<SDL_Joystick *>> &joysticks, const sdl_mapping &mapping) static bool sdl_to_logitech_g27_button(std::map<uint32_t, std::vector<SDL_Joystick*>>& joysticks, const sdl_mapping& mapping)
{ {
auto joysticks_of_type = joysticks.find(mapping.device_type_id); auto joysticks_of_type = joysticks.find(mapping.device_type_id);
if (joysticks_of_type == joysticks.end()) if (joysticks_of_type == joysticks.end())
@ -655,28 +653,28 @@ static bool sdl_to_logitech_g27_button(std::map<uint32_t, std::vector<SDL_Joysti
} }
bool pressed = false; bool pressed = false;
for (auto joystick = joysticks_of_type->second.begin();joystick != joysticks_of_type->second.end();joystick++) for (auto joystick = joysticks_of_type->second.begin(); joystick != joysticks_of_type->second.end(); joystick++)
{ {
pressed = pressed || fetch_sdl_as_button(*joystick, mapping); pressed = pressed || fetch_sdl_as_button(*joystick, mapping);
} }
return pressed; return pressed;
} }
static uint16_t sdl_to_logitech_g27_steering(std::map<uint32_t, std::vector<SDL_Joystick *>> &joysticks, const sdl_mapping &mapping) static uint16_t sdl_to_logitech_g27_steering(std::map<uint32_t, std::vector<SDL_Joystick*>>& joysticks, const sdl_mapping& mapping)
{ {
int16_t avg = fetch_sdl_axis_avg(joysticks, mapping); int16_t avg = fetch_sdl_axis_avg(joysticks, mapping);
uint16_t unsigned_avg = avg + 0x8000; uint16_t unsigned_avg = avg + 0x8000;
return unsigned_avg * (0xFFFF >> 2) / 0xFFFF; return unsigned_avg * (0xFFFF >> 2) / 0xFFFF;
} }
static uint8_t sdl_to_logitech_g27_pedal(std::map<uint32_t, std::vector<SDL_Joystick *>> &joysticks, const sdl_mapping &mapping) static uint8_t sdl_to_logitech_g27_pedal(std::map<uint32_t, std::vector<SDL_Joystick*>>& joysticks, const sdl_mapping& mapping)
{ {
int16_t avg = fetch_sdl_axis_avg(joysticks, mapping); int16_t avg = fetch_sdl_axis_avg(joysticks, mapping);
uint16_t unsigned_avg = avg + 0x8000; uint16_t unsigned_avg = avg + 0x8000;
return unsigned_avg * 0xFF / 0xFFFF; return unsigned_avg * 0xFF / 0xFFFF;
} }
static inline void set_bit(uint8_t *buf, int bit_num, bool set) static inline void set_bit(uint8_t* buf, int bit_num, bool set)
{ {
int byte_num = bit_num / 8; int byte_num = bit_num / 8;
bit_num = bit_num % 8; bit_num = bit_num % 8;
@ -799,7 +797,7 @@ void usb_device_logitech_g27::interrupt_transfer(u32 buf_size, u8* buf, u32 endp
buf[9] = 0x80; // shifter y buf[9] = 0x80; // shifter y
buf[10] = buf[10] | (wheel_range > 360 ? 0x90 : 0x10); buf[10] = buf[10] | (wheel_range > 360 ? 0x90 : 0x10);
//logitech_g27_log.error("%02x %02x %02x %02x %02x %02x %02x %02x %02x %02x %02x", buf[0], buf[1], buf[2], buf[3], buf[4], buf[5], buf[6], buf[7], buf[8], buf[9], buf[10]); // logitech_g27_log.error("%02x %02x %02x %02x %02x %02x %02x %02x %02x %02x %02x", buf[0], buf[1], buf[2], buf[3], buf[4], buf[5], buf[6], buf[7], buf[8], buf[9], buf[10]);
return; return;
} }
@ -808,14 +806,14 @@ void usb_device_logitech_g27::interrupt_transfer(u32 buf_size, u8* buf, u32 endp
// Sending data to wheel // Sending data to wheel
if (buf_size < 7) if (buf_size < 7)
{ {
char *hex_buf = reinterpret_cast<char *>(malloc(buf_size * 3 + 1)); char* hex_buf = reinterpret_cast<char*>(malloc(buf_size * 3 + 1));
if (hex_buf == nullptr) if (hex_buf == nullptr)
{ {
logitech_g27_log.error("Unhandled wheel command with size %u != 16", buf_size); logitech_g27_log.error("Unhandled wheel command with size %u != 16", buf_size);
return; return;
} }
int offset = 0; int offset = 0;
for (uint32_t i = 0;i < buf_size;i++) for (uint32_t i = 0; i < buf_size; i++)
{ {
offset += sprintf(&hex_buf[offset], "%02x ", buf[i]); offset += sprintf(&hex_buf[offset], "%02x ", buf[i]);
} }
@ -833,8 +831,7 @@ void usb_device_logitech_g27::interrupt_transfer(u32 buf_size, u8* buf, u32 endp
SDL_HapticDirection direction = { SDL_HapticDirection direction = {
.type = SDL_HAPTIC_POLAR, .type = SDL_HAPTIC_POLAR,
.dir = {27000, 0} .dir = {27000, 0}};
};
if (reverse_effects) if (reverse_effects)
{ {
direction.dir[0] = 9000; direction.dir[0] = 9000;
@ -845,7 +842,7 @@ void usb_device_logitech_g27::interrupt_transfer(u32 buf_size, u8* buf, u32 endp
// Process effects // Process effects
if (buf[0] == 0xf8) if (buf[0] == 0xf8)
{ {
switch(buf[1]) switch (buf[1])
{ {
case 0x01: case 0x01:
{ {
@ -900,7 +897,7 @@ void usb_device_logitech_g27::interrupt_transfer(u32 buf_size, u8* buf, u32 endp
} }
// Mux into total amount of bulbs on, since sdl only takes intensity // Mux into total amount of bulbs on, since sdl only takes intensity
uint8_t new_led_level = 0; uint8_t new_led_level = 0;
for (int i = 0;i < 5;i++) for (int i = 0; i < 5; i++)
{ {
new_led_level += (buf[2] & (1 << i)) ? 1 : 0; new_led_level += (buf[2] & (1 << i)) ? 1 : 0;
} }
@ -934,7 +931,8 @@ void usb_device_logitech_g27::interrupt_transfer(u32 buf_size, u8* buf, u32 endp
case 0x0c: case 0x0c:
{ {
// Download/Download play/Refresh // Download/Download play/Refresh
for (int i = 0;i < 4;i++){ for (int i = 0; i < 4; i++)
{
SDL_HapticEffect new_effect = {0}; SDL_HapticEffect new_effect = {0};
// hack: need to reduce Download play spams for some drivers // hack: need to reduce Download play spams for some drivers
bool update_hack = false; bool update_hack = false;
@ -997,8 +995,8 @@ void usb_device_logitech_g27::interrupt_transfer(u32 buf_size, u8* buf, u32 endp
right_coeff = left_coeff; right_coeff = left_coeff;
left_coeff = coeff; left_coeff = coeff;
} }
//for(int j = 0;j < 3;j++) // for(int j = 0;j < 3;j++)
for(int j = 0;j < 1;j++) for (int j = 0; j < 1; j++)
{ {
new_effect.condition.right_sat[j] = saturation; new_effect.condition.right_sat[j] = saturation;
new_effect.condition.left_sat[j] = saturation; new_effect.condition.left_sat[j] = saturation;
@ -1043,8 +1041,8 @@ void usb_device_logitech_g27::interrupt_transfer(u32 buf_size, u8* buf, u32 endp
right_coeff = left_coeff; right_coeff = left_coeff;
left_coeff = coeff; left_coeff = coeff;
} }
//for(int j = 0;j < 3;j++) // for(int j = 0;j < 3;j++)
for(int j = 0;j < 1;j++) for (int j = 0; j < 1; j++)
{ {
new_effect.condition.right_sat[j] = saturation; new_effect.condition.right_sat[j] = saturation;
new_effect.condition.left_sat[j] = saturation; new_effect.condition.left_sat[j] = saturation;
@ -1073,8 +1071,8 @@ void usb_device_logitech_g27::interrupt_transfer(u32 buf_size, u8* buf, u32 endp
right_coeff = left_coeff; right_coeff = left_coeff;
left_coeff = coeff; left_coeff = coeff;
} }
//for(int j = 0;j < 3;j++) // for(int j = 0;j < 3;j++)
for(int j = 0;j < 1;j++) for (int j = 0; j < 1; j++)
{ {
new_effect.condition.right_sat[j] = saturation; new_effect.condition.right_sat[j] = saturation;
new_effect.condition.left_sat[j] = saturation; new_effect.condition.left_sat[j] = saturation;
@ -1116,8 +1114,8 @@ void usb_device_logitech_g27::interrupt_transfer(u32 buf_size, u8* buf, u32 endp
right_coeff = left_coeff; right_coeff = left_coeff;
left_coeff = coeff; left_coeff = coeff;
} }
//for(int j = 0;j < 3;j++) // for(int j = 0;j < 3;j++)
for(int j = 0;j < 1;j++) for (int j = 0; j < 1; j++)
{ {
new_effect.condition.right_sat[j] = saturation; new_effect.condition.right_sat[j] = saturation;
new_effect.condition.left_sat[j] = saturation; new_effect.condition.left_sat[j] = saturation;
@ -1256,7 +1254,7 @@ void usb_device_logitech_g27::interrupt_transfer(u32 buf_size, u8* buf, u32 endp
} }
else else
{ {
new_effect.constant.length = (l1 - l2) * logitech_g27_loops_to_ms(t2, !fixed_loop) / s2 ; new_effect.constant.length = (l1 - l2) * logitech_g27_loops_to_ms(t2, !fixed_loop) / s2;
new_effect.constant.attack_length = new_effect.constant.length; new_effect.constant.attack_length = new_effect.constant.length;
new_effect.constant.attack_level = d1 ? logitech_g27_force_to_level(l1) : logitech_g27_force_to_level(l2); new_effect.constant.attack_level = d1 ? logitech_g27_force_to_level(l1) : logitech_g27_force_to_level(l2);
} }
@ -1356,7 +1354,7 @@ void usb_device_logitech_g27::interrupt_transfer(u32 buf_size, u8* buf, u32 endp
case 0x02: case 0x02:
case 0x03: case 0x03:
{ {
for (int i = 0;i < 4;i++) for (int i = 0; i < 4; i++)
{ {
// Play/Stop // Play/Stop
if (!(slot_mask & (1 << i))) if (!(slot_mask & (1 << i)))
@ -1432,8 +1430,9 @@ void usb_device_logitech_g27::interrupt_transfer(u32 buf_size, u8* buf, u32 endp
right_coeff = left_coeff; right_coeff = left_coeff;
left_coeff = coeff; left_coeff = coeff;
} }
//for (int i = 0;i < 3;i++){ // for (int i = 0;i < 3;i++){
for (int i = 0;i < 1;i++){ for (int i = 0; i < 1; i++)
{
// TODO direction cfg // TODO direction cfg
default_spring_effect.condition.right_sat[i] = saturation; default_spring_effect.condition.right_sat[i] = saturation;
default_spring_effect.condition.left_sat[i] = saturation; default_spring_effect.condition.left_sat[i] = saturation;
@ -1516,7 +1515,7 @@ void usb_device_logitech_g27::interrupt_transfer(u32 buf_size, u8* buf, u32 endp
} }
uint8_t new_led_level = 0; uint8_t new_led_level = 0;
for (int i = 0;i < 8;i++) for (int i = 0; i < 8; i++)
{ {
new_led_level += (buf[1] & (1 << i)) ? 1 : 0; new_led_level += (buf[1] & (1 << i)) ? 1 : 0;
} }

View file

@ -116,8 +116,9 @@ public:
std::mutex thread_control_mutex; std::mutex thread_control_mutex;
bool stop_thread; bool stop_thread;
char thread_name[64]; char thread_name[64];
SDL_Thread *thread = nullptr; SDL_Thread* thread = nullptr;
void sdl_refresh(); void sdl_refresh();
private: private:
u32 m_controller_index; u32 m_controller_index;
@ -125,9 +126,9 @@ private:
bool reverse_effects; bool reverse_effects;
std::mutex sdl_handles_mutex; std::mutex sdl_handles_mutex;
SDL_Joystick *led_joystick_handle = nullptr; SDL_Joystick* led_joystick_handle = nullptr;
SDL_Haptic *haptic_handle = nullptr; SDL_Haptic* haptic_handle = nullptr;
std::map<uint32_t, std::vector<SDL_Joystick *>> joysticks; std::map<uint32_t, std::vector<SDL_Joystick*>> joysticks;
bool fixed_loop = false; bool fixed_loop = false;
uint16_t wheel_range = 200; uint16_t wheel_range = 200;
logitech_g27_ffb_slot effect_slots[4]; logitech_g27_ffb_slot effect_slots[4];

View file

@ -10,11 +10,12 @@ emulated_logitech_g27_config g_cfg_logitech_g27;
LOG_CHANNEL(cfg_log, "CFG"); LOG_CHANNEL(cfg_log, "CFG");
void emulated_logitech_g27_config::fill_defaults(){ void emulated_logitech_g27_config::fill_defaults()
{
// a shifter-less g29 with a xbox 360 controller shifter place holder... // a shifter-less g29 with a xbox 360 controller shifter place holder...
m_mutex.lock(); m_mutex.lock();
#define INIT_AXIS_MAPPING(name, device_type_id, id, reverse) \ #define INIT_AXIS_MAPPING(name, device_type_id, id, reverse) \
{ \ { \
name##_device_type_id.set(device_type_id); \ name##_device_type_id.set(device_type_id); \
name##_type.set(MAPPING_AXIS); \ name##_type.set(MAPPING_AXIS); \
@ -28,9 +29,9 @@ void emulated_logitech_g27_config::fill_defaults(){
INIT_AXIS_MAPPING(brake, 0x046dc24f, 3, false); INIT_AXIS_MAPPING(brake, 0x046dc24f, 3, false);
INIT_AXIS_MAPPING(clutch, 0x046dc24f, 1, false); INIT_AXIS_MAPPING(clutch, 0x046dc24f, 1, false);
#undef INIT_AXIS_MAPPING #undef INIT_AXIS_MAPPING
#define INIT_BUTTON_MAPPING(name, device_type_id, id, reverse) \ #define INIT_BUTTON_MAPPING(name, device_type_id, id, reverse) \
{ \ { \
name##_device_type_id.set(device_type_id); \ name##_device_type_id.set(device_type_id); \
name##_type.set(MAPPING_BUTTON); \ name##_type.set(MAPPING_BUTTON); \
@ -66,9 +67,9 @@ void emulated_logitech_g27_config::fill_defaults(){
INIT_BUTTON_MAPPING(shifter_3, 0x045e028e, 2, false); INIT_BUTTON_MAPPING(shifter_3, 0x045e028e, 2, false);
INIT_BUTTON_MAPPING(shifter_4, 0x045e028e, 1, false); INIT_BUTTON_MAPPING(shifter_4, 0x045e028e, 1, false);
#undef INIT_BUTTON_MAPPING #undef INIT_BUTTON_MAPPING
#define INIT_HAT_MAPPING(name, device_type_id, id, hat, reverse) \ #define INIT_HAT_MAPPING(name, device_type_id, id, hat, reverse) \
{ \ { \
name##_device_type_id.set(device_type_id); \ name##_device_type_id.set(device_type_id); \
name##_type.set(MAPPING_HAT); \ name##_type.set(MAPPING_HAT); \
@ -86,7 +87,7 @@ void emulated_logitech_g27_config::fill_defaults(){
INIT_HAT_MAPPING(shifter_6, 0x045e028e, 0, HAT_DOWN, false); INIT_HAT_MAPPING(shifter_6, 0x045e028e, 0, HAT_DOWN, false);
INIT_HAT_MAPPING(shifter_r, 0x045e028e, 0, HAT_LEFT, false); INIT_HAT_MAPPING(shifter_r, 0x045e028e, 0, HAT_LEFT, false);
#undef INIT_HAT_MAPPING #undef INIT_HAT_MAPPING
reverse_effects.set(true); reverse_effects.set(true);
ffb_device_type_id.set(0x046dc24f); ffb_device_type_id.set(0x046dc24f);
@ -97,7 +98,8 @@ void emulated_logitech_g27_config::fill_defaults(){
m_mutex.unlock(); m_mutex.unlock();
} }
void emulated_logitech_g27_config::save(){ void emulated_logitech_g27_config::save()
{
m_mutex.lock(); m_mutex.lock();
const std::string cfg_name = fmt::format("%s%s.yml", fs::get_config_dir(true), "LogitechG27"); const std::string cfg_name = fmt::format("%s%s.yml", fs::get_config_dir(true), "LogitechG27");
cfg_log.notice("Saving LogitechG27 config: %s", cfg_name); cfg_log.notice("Saving LogitechG27 config: %s", cfg_name);
@ -112,7 +114,6 @@ void emulated_logitech_g27_config::save(){
cfg_log.error("Failed to save LogitechG27 config to '%s' (error=%s)", cfg_name, fs::g_tls_error); cfg_log.error("Failed to save LogitechG27 config to '%s' (error=%s)", cfg_name, fs::g_tls_error);
} }
m_mutex.unlock(); m_mutex.unlock();
} }
bool emulated_logitech_g27_config::load() bool emulated_logitech_g27_config::load()
@ -125,7 +126,7 @@ bool emulated_logitech_g27_config::load()
m_mutex.lock(); m_mutex.lock();
if (fs::file cfg_file{ cfg_name, fs::read }) if (fs::file cfg_file{cfg_name, fs::read})
{ {
if (const std::string content = cfg_file.to_string(); !content.empty()) if (const std::string content = cfg_file.to_string(); !content.empty())
{ {

View file

@ -4,14 +4,15 @@
#include <mutex> #include <mutex>
struct emulated_logitech_g27_config : cfg::node { struct emulated_logitech_g27_config : cfg::node
{
std::mutex m_mutex; std::mutex m_mutex;
bool load(); bool load();
void save(); void save();
void fill_defaults(); void fill_defaults();
#define STR(s) #s #define STR(s) #s
#define MAPPING_ENTRY(name) \ #define MAPPING_ENTRY(name) \
cfg::uint<0, 0xFFFFFFFF> name##_device_type_id{this, STR(name##_device_type_id)}; \ cfg::uint<0, 0xFFFFFFFF> name##_device_type_id{this, STR(name##_device_type_id)}; \
cfg::uint<0, 0xFFFFFFFF> name##_type{this, STR(name##_type)}; \ cfg::uint<0, 0xFFFFFFFF> name##_type{this, STR(name##_type)}; \
cfg::uint<0, 0xFFFFFFFFFFFFFFFF> name##_id{this, STR(name##_id)}; \ cfg::uint<0, 0xFFFFFFFFFFFFFFFF> name##_id{this, STR(name##_id)}; \
@ -57,8 +58,8 @@ struct emulated_logitech_g27_config : cfg::node {
MAPPING_ENTRY(shifter_6); MAPPING_ENTRY(shifter_6);
MAPPING_ENTRY(shifter_r); MAPPING_ENTRY(shifter_r);
#undef MAPPING_ENTRY #undef MAPPING_ENTRY
#undef STR #undef STR
cfg::_bool reverse_effects{this, "reverse_effects"}; cfg::_bool reverse_effects{this, "reverse_effects"};
cfg::uint<0, 0xFFFFFFFF> ffb_device_type_id{this, "ffb_device_type_id"}; cfg::uint<0, 0xFFFFFFFF> ffb_device_type_id{this, "ffb_device_type_id"};

View file

@ -22,7 +22,7 @@ sdl_instance::~sdl_instance()
sdl_instance& sdl_instance::get_instance() sdl_instance& sdl_instance::get_instance()
{ {
static sdl_instance instance {}; static sdl_instance instance{};
return instance; return instance;
} }
@ -118,7 +118,8 @@ bool sdl_instance::initialize()
default: default:
break; break;
} }
}, nullptr); },
nullptr);
m_initialized = true; m_initialized = true;
instance_mutex.unlock(); instance_mutex.unlock();

View file

@ -12,6 +12,7 @@ public:
bool initialize(); bool initialize();
void pump_events(); void pump_events();
private: private:
bool m_initialized = false; bool m_initialized = false;
std::mutex instance_mutex; std::mutex instance_mutex;

View file

@ -20,7 +20,8 @@ LOG_CHANNEL(logitech_g27_cfg_log, "LOGIG27");
#define DEFAULT_STATUS " " #define DEFAULT_STATUS " "
struct joystick_state { struct joystick_state
{
std::vector<int16_t> axes; std::vector<int16_t> axes;
std::vector<bool> buttons; std::vector<bool> buttons;
std::vector<hat_component> hats; std::vector<hat_component> hats;
@ -30,14 +31,14 @@ class DeviceChoice : public QWidget
{ {
public: public:
DeviceChoice(QWidget *parent, uint32_t device_type_id, const char *name) DeviceChoice(QWidget* parent, uint32_t device_type_id, const char* name)
: QWidget(parent) : QWidget(parent)
{ {
this->device_type_id = device_type_id; this->device_type_id = device_type_id;
auto layout = new QHBoxLayout(this); auto layout = new QHBoxLayout(this);
QLabel *label = new QLabel(this); QLabel* label = new QLabel(this);
label->setText(QString(name)); label->setText(QString(name));
layout->addWidget(label); layout->addWidget(label);
@ -64,8 +65,9 @@ public:
private: private:
uint32_t device_type_id; uint32_t device_type_id;
QLabel *display_box; QLabel* display_box;
void update_display(){ void update_display()
{
char text_buf[32]; char text_buf[32];
sprintf(text_buf, "%04x:%04x", device_type_id >> 16, device_type_id & 0xFFFF); sprintf(text_buf, "%04x:%04x", device_type_id >> 16, device_type_id & 0xFFFF);
display_box->setText(QString(text_buf)); display_box->setText(QString(text_buf));
@ -76,7 +78,7 @@ class Mapping : public QGroupBox
{ {
public: public:
Mapping(QWidget *parent, emulated_logitech_g27_settings_dialog *dialog, DeviceChoice *ffb_device, DeviceChoice *led_device, sdl_mapping mapping, bool is_axis, const char *name, bool flip_axis_display) Mapping(QWidget* parent, emulated_logitech_g27_settings_dialog* dialog, DeviceChoice* ffb_device, DeviceChoice* led_device, sdl_mapping mapping, bool is_axis, const char* name, bool flip_axis_display)
: QGroupBox(parent) : QGroupBox(parent)
{ {
this->setting_dialog = dialog; this->setting_dialog = dialog;
@ -88,16 +90,16 @@ public:
this->mapping_in_progress = false; this->mapping_in_progress = false;
this->flip_axis_display = flip_axis_display; this->flip_axis_display = flip_axis_display;
QVBoxLayout *layout = new QVBoxLayout(this); QVBoxLayout* layout = new QVBoxLayout(this);
setLayout(layout); setLayout(layout);
QWidget *horizontal_container = new QWidget(this); QWidget* horizontal_container = new QWidget(this);
QHBoxLayout *horizontal_layout = new QHBoxLayout(horizontal_container); QHBoxLayout* horizontal_layout = new QHBoxLayout(horizontal_container);
horizontal_container->setLayout(horizontal_layout); horizontal_container->setLayout(horizontal_layout);
layout->addWidget(horizontal_container); layout->addWidget(horizontal_container);
QLabel *label = new QLabel(horizontal_container); QLabel* label = new QLabel(horizontal_container);
label->setText(QString(name)); label->setText(QString(name));
display_box = new QLabel(horizontal_container); display_box = new QLabel(horizontal_container);
@ -153,19 +155,22 @@ public:
this->led_device->set_device_type_id(this->mapping.device_type_id); this->led_device->set_device_type_id(this->mapping.device_type_id);
}); });
connect(map_button, &QPushButton::clicked, this, [this](){ connect(map_button, &QPushButton::clicked, this, [this]()
{
this->mapping_in_progress = true; this->mapping_in_progress = true;
this->timeout_msec = 5500; this->timeout_msec = 5500;
this->setting_dialog->disable(); this->setting_dialog->disable();
this->last_joystick_states = this->setting_dialog->get_joystick_states(); this->last_joystick_states = this->setting_dialog->get_joystick_states();
}); });
connect(unmap_button, &QPushButton::clicked, this, [this](){ connect(unmap_button, &QPushButton::clicked, this, [this]()
{
this->mapping.device_type_id = 0; this->mapping.device_type_id = 0;
update_display(); update_display();
}); });
connect(reverse_checkbox, &QCheckBox::clicked, this, [this](){ connect(reverse_checkbox, &QCheckBox::clicked, this, [this]()
{
this->mapping.reverse = this->reverse_checkbox->isChecked(); this->mapping.reverse = this->reverse_checkbox->isChecked();
}); });
@ -178,12 +183,12 @@ public:
int timeout_sec = this->timeout_msec / 1000; int timeout_sec = this->timeout_msec / 1000;
const std::map<uint32_t, joystick_state> &new_joystick_states = this->setting_dialog->get_joystick_states(); const std::map<uint32_t, joystick_state>& new_joystick_states = this->setting_dialog->get_joystick_states();
sprintf(text_buf, "Input %s for %s, timeout in %d %s", this->is_axis ? "axis" : "button/hat", this->name.c_str(), timeout_sec, timeout_sec >= 2 ? "seconds" : "second"); sprintf(text_buf, "Input %s for %s, timeout in %d %s", this->is_axis ? "axis" : "button/hat", this->name.c_str(), timeout_sec, timeout_sec >= 2 ? "seconds" : "second");
this->setting_dialog->set_state_text(text_buf); this->setting_dialog->set_state_text(text_buf);
for (auto new_joystick_state = new_joystick_states.begin();new_joystick_state != new_joystick_states.end();new_joystick_state++) for (auto new_joystick_state = new_joystick_states.begin(); new_joystick_state != new_joystick_states.end(); new_joystick_state++)
{ {
auto last_joystick_state = this->last_joystick_states.find(new_joystick_state->first); auto last_joystick_state = this->last_joystick_states.find(new_joystick_state->first);
if (last_joystick_state == this->last_joystick_states.end()) if (last_joystick_state == this->last_joystick_states.end())
@ -199,7 +204,7 @@ public:
logitech_g27_cfg_log.error("during input state change diff, number of axes on %04x:%04x changed", new_joystick_state->first >> 16, new_joystick_state->first & 0xFFFF); logitech_g27_cfg_log.error("during input state change diff, number of axes on %04x:%04x changed", new_joystick_state->first >> 16, new_joystick_state->first & 0xFFFF);
continue; continue;
} }
for (std::vector<int16_t>::size_type i = 0;i < new_joystick_state->second.axes.size();i++) for (std::vector<int16_t>::size_type i = 0; i < new_joystick_state->second.axes.size(); i++)
{ {
int32_t diff = std::abs(last_joystick_state->second.axes[i] - new_joystick_state->second.axes[i]); int32_t diff = std::abs(last_joystick_state->second.axes[i] - new_joystick_state->second.axes[i]);
if (diff > axis_change_threshold) if (diff > axis_change_threshold)
@ -227,7 +232,7 @@ public:
logitech_g27_cfg_log.error("during input state change diff, number of hats on %04x:%04x changed", new_joystick_state->first >> 16, new_joystick_state->first & 0xFFFF); logitech_g27_cfg_log.error("during input state change diff, number of hats on %04x:%04x changed", new_joystick_state->first >> 16, new_joystick_state->first & 0xFFFF);
continue; continue;
} }
for (std::vector<int16_t>::size_type i = 0;i < new_joystick_state->second.buttons.size();i++) for (std::vector<int16_t>::size_type i = 0; i < new_joystick_state->second.buttons.size(); i++)
{ {
if (last_joystick_state->second.buttons[i] != new_joystick_state->second.buttons[i]) if (last_joystick_state->second.buttons[i] != new_joystick_state->second.buttons[i])
{ {
@ -241,7 +246,7 @@ public:
break; break;
} }
} }
for (std::vector<int16_t>::size_type i = 0;i < new_joystick_state->second.hats.size();i++) for (std::vector<int16_t>::size_type i = 0; i < new_joystick_state->second.hats.size(); i++)
{ {
if (last_joystick_state->second.hats[i] != new_joystick_state->second.hats[i] && new_joystick_state->second.hats[i] != HAT_NONE) if (last_joystick_state->second.hats[i] != new_joystick_state->second.hats[i] && new_joystick_state->second.hats[i] != HAT_NONE)
{ {
@ -290,13 +295,13 @@ public:
reverse_checkbox->setEnabled(true); reverse_checkbox->setEnabled(true);
} }
void set_mapping(const sdl_mapping &mapping) void set_mapping(const sdl_mapping& mapping)
{ {
this->mapping = mapping; this->mapping = mapping;
update_display(); update_display();
} }
const sdl_mapping &get_mapping() const sdl_mapping& get_mapping()
{ {
return mapping; return mapping;
} }
@ -306,30 +311,31 @@ private:
bool is_axis; bool is_axis;
std::string name; std::string name;
DeviceChoice *ffb_device; DeviceChoice* ffb_device;
DeviceChoice *led_device; DeviceChoice* led_device;
QLabel *display_box; QLabel* display_box;
QPushButton *ffb_set_button; QPushButton* ffb_set_button;
QPushButton *led_set_button; QPushButton* led_set_button;
QPushButton *map_button; QPushButton* map_button;
QPushButton *unmap_button; QPushButton* unmap_button;
QCheckBox *reverse_checkbox; QCheckBox* reverse_checkbox;
bool mapping_in_progress; bool mapping_in_progress;
int timeout_msec = 5000; int timeout_msec = 5000;
QTimer *tick_timer; QTimer* tick_timer;
std::map<uint32_t, joystick_state> last_joystick_states; std::map<uint32_t, joystick_state> last_joystick_states;
QCheckBox *button_status; QCheckBox* button_status;
QSlider *axis_status; QSlider* axis_status;
bool flip_axis_display; bool flip_axis_display;
emulated_logitech_g27_settings_dialog *setting_dialog; emulated_logitech_g27_settings_dialog* setting_dialog;
void update_display(){ void update_display()
{
char text_buf[64]; char text_buf[64];
const char *type_string = nullptr; const char* type_string = nullptr;
switch(mapping.type) switch (mapping.type)
{ {
case MAPPING_BUTTON: case MAPPING_BUTTON:
type_string = "button"; type_string = "button";
@ -341,8 +347,8 @@ private:
type_string = "axis"; type_string = "axis";
break; break;
} }
const char *hat_string = nullptr; const char* hat_string = nullptr;
switch(mapping.hat) switch (mapping.hat)
{ {
case HAT_UP: case HAT_UP:
hat_string = "up"; hat_string = "up";
@ -382,12 +388,12 @@ private:
axis_status->setValue(axis_value); axis_status->setValue(axis_value);
} }
const std::map<uint32_t, joystick_state> &joystick_states = setting_dialog->get_joystick_states(); const std::map<uint32_t, joystick_state>& joystick_states = setting_dialog->get_joystick_states();
auto joystick_state = joystick_states.find(mapping.device_type_id); auto joystick_state = joystick_states.find(mapping.device_type_id);
if (joystick_state != joystick_states.end()) if (joystick_state != joystick_states.end())
{ {
switch(mapping.type) switch (mapping.type)
{ {
case MAPPING_BUTTON: case MAPPING_BUTTON:
{ {
@ -432,9 +438,9 @@ private:
void emulated_logitech_g27_settings_dialog::save_ui_state_to_config() void emulated_logitech_g27_settings_dialog::save_ui_state_to_config()
{ {
#define SAVE_MAPPING(name) \ #define SAVE_MAPPING(name) \
{ \ { \
const sdl_mapping &m = name->get_mapping(); \ const sdl_mapping& m = name->get_mapping(); \
g_cfg_logitech_g27.name##_device_type_id.set(m.device_type_id); \ g_cfg_logitech_g27.name##_device_type_id.set(m.device_type_id); \
g_cfg_logitech_g27.name##_type.set(m.type); \ g_cfg_logitech_g27.name##_type.set(m.type); \
g_cfg_logitech_g27.name##_id.set(m.id); \ g_cfg_logitech_g27.name##_id.set(m.id); \
@ -481,7 +487,7 @@ void emulated_logitech_g27_settings_dialog::save_ui_state_to_config()
SAVE_MAPPING(shifter_6); SAVE_MAPPING(shifter_6);
SAVE_MAPPING(shifter_r); SAVE_MAPPING(shifter_r);
#undef SAVE_MAPPING #undef SAVE_MAPPING
g_cfg_logitech_g27.ffb_device_type_id.set(ffb_device->get_device_type_id()); g_cfg_logitech_g27.ffb_device_type_id.set(ffb_device->get_device_type_id());
g_cfg_logitech_g27.led_device_type_id.set(led_device->get_device_type_id()); g_cfg_logitech_g27.led_device_type_id.set(led_device->get_device_type_id());
@ -492,7 +498,7 @@ void emulated_logitech_g27_settings_dialog::save_ui_state_to_config()
void emulated_logitech_g27_settings_dialog::load_ui_state_from_config() void emulated_logitech_g27_settings_dialog::load_ui_state_from_config()
{ {
#define LOAD_MAPPING(name) \ #define LOAD_MAPPING(name) \
{ \ { \
sdl_mapping m = { \ sdl_mapping m = { \
.device_type_id = static_cast<uint32_t>(g_cfg_logitech_g27.name##_device_type_id.get()), \ .device_type_id = static_cast<uint32_t>(g_cfg_logitech_g27.name##_device_type_id.get()), \
@ -500,8 +506,7 @@ void emulated_logitech_g27_settings_dialog::load_ui_state_from_config()
.id = static_cast<uint8_t>(g_cfg_logitech_g27.name##_id.get()), \ .id = static_cast<uint8_t>(g_cfg_logitech_g27.name##_id.get()), \
.hat = static_cast<hat_component>(g_cfg_logitech_g27.name##_hat.get()), \ .hat = static_cast<hat_component>(g_cfg_logitech_g27.name##_hat.get()), \
.reverse = g_cfg_logitech_g27.name##_reverse.get(), \ .reverse = g_cfg_logitech_g27.name##_reverse.get(), \
.positive_axis = false \ .positive_axis = false}; \
}; \
name->set_mapping(m); \ name->set_mapping(m); \
} }
@ -544,7 +549,7 @@ void emulated_logitech_g27_settings_dialog::load_ui_state_from_config()
LOAD_MAPPING(shifter_6); LOAD_MAPPING(shifter_6);
LOAD_MAPPING(shifter_r); LOAD_MAPPING(shifter_r);
#undef LOAD_MAPPING #undef LOAD_MAPPING
ffb_device->set_device_type_id(static_cast<uint32_t>(g_cfg_logitech_g27.ffb_device_type_id.get())); ffb_device->set_device_type_id(static_cast<uint32_t>(g_cfg_logitech_g27.ffb_device_type_id.get()));
led_device->set_device_type_id(static_cast<uint32_t>(g_cfg_logitech_g27.led_device_type_id.get())); led_device->set_device_type_id(static_cast<uint32_t>(g_cfg_logitech_g27.led_device_type_id.get()));
@ -597,7 +602,7 @@ emulated_logitech_g27_settings_dialog::emulated_logitech_g27_settings_dialog(QWi
} }
}); });
QLabel *warning = new QLabel(QString("Warning: Force feedback output were meant for Logitech G27, on stronger wheels please adjust force strength accordingly in your wheel software."), this); QLabel* warning = new QLabel(QString("Warning: Force feedback output were meant for Logitech G27, on stronger wheels please adjust force strength accordingly in your wheel software."), this);
warning->setStyleSheet("color: red;"); warning->setStyleSheet("color: red;");
v_layout->addWidget(warning); v_layout->addWidget(warning);
@ -616,7 +621,7 @@ emulated_logitech_g27_settings_dialog::emulated_logitech_g27_settings_dialog(QWi
led_device = new DeviceChoice(this, g_cfg_logitech_g27.led_device_type_id.get(), "LED Device"); led_device = new DeviceChoice(this, g_cfg_logitech_g27.led_device_type_id.get(), "LED Device");
mapping_scroll_area = new QScrollArea(this); mapping_scroll_area = new QScrollArea(this);
QWidget *mapping_widget = new QWidget(mapping_scroll_area); QWidget* mapping_widget = new QWidget(mapping_scroll_area);
QVBoxLayout* mapping_layout = new QVBoxLayout(mapping_widget); QVBoxLayout* mapping_layout = new QVBoxLayout(mapping_widget);
mapping_widget->setLayout(mapping_layout); mapping_widget->setLayout(mapping_layout);
mapping_scroll_area->setWidget(mapping_widget); mapping_scroll_area->setWidget(mapping_widget);
@ -627,7 +632,7 @@ emulated_logitech_g27_settings_dialog::emulated_logitech_g27_settings_dialog(QWi
v_layout->addWidget(mapping_scroll_area); v_layout->addWidget(mapping_scroll_area);
#define ADD_MAPPING_SETTING(name, is_axis, display_name, flip_axis_display) \ #define ADD_MAPPING_SETTING(name, is_axis, display_name, flip_axis_display) \
{ \ { \
sdl_mapping m = { \ sdl_mapping m = { \
.device_type_id = static_cast<uint32_t>(g_cfg_logitech_g27.name##_device_type_id.get()), \ .device_type_id = static_cast<uint32_t>(g_cfg_logitech_g27.name##_device_type_id.get()), \
@ -635,13 +640,12 @@ emulated_logitech_g27_settings_dialog::emulated_logitech_g27_settings_dialog(QWi
.id = static_cast<uint8_t>(g_cfg_logitech_g27.name##_id.get()), \ .id = static_cast<uint8_t>(g_cfg_logitech_g27.name##_id.get()), \
.hat = static_cast<hat_component>(g_cfg_logitech_g27.name##_hat.get()), \ .hat = static_cast<hat_component>(g_cfg_logitech_g27.name##_hat.get()), \
.reverse = g_cfg_logitech_g27.name##_reverse.get(), \ .reverse = g_cfg_logitech_g27.name##_reverse.get(), \
.positive_axis = false \ .positive_axis = false}; \
}; \
name = new Mapping(mapping_widget, this, ffb_device, led_device, m, is_axis, display_name, flip_axis_display); \ name = new Mapping(mapping_widget, this, ffb_device, led_device, m, is_axis, display_name, flip_axis_display); \
mapping_layout->addWidget(name); \ mapping_layout->addWidget(name); \
} }
QLabel *axis_label = new QLabel(QString("Axes:"), mapping_widget); QLabel* axis_label = new QLabel(QString("Axes:"), mapping_widget);
mapping_layout->addWidget(axis_label); mapping_layout->addWidget(axis_label);
ADD_MAPPING_SETTING(steering, true, "Steering", false); ADD_MAPPING_SETTING(steering, true, "Steering", false);
@ -649,7 +653,7 @@ emulated_logitech_g27_settings_dialog::emulated_logitech_g27_settings_dialog(QWi
ADD_MAPPING_SETTING(brake, true, "Brake", true); ADD_MAPPING_SETTING(brake, true, "Brake", true);
ADD_MAPPING_SETTING(clutch, true, "Clutch", true); ADD_MAPPING_SETTING(clutch, true, "Clutch", true);
QLabel *button_label = new QLabel(QString("Buttons:"), mapping_widget); QLabel* button_label = new QLabel(QString("Buttons:"), mapping_widget);
mapping_layout->addWidget(button_label); mapping_layout->addWidget(button_label);
ADD_MAPPING_SETTING(shift_up, false, "Shift up", false); ADD_MAPPING_SETTING(shift_up, false, "Shift up", false);
@ -687,7 +691,7 @@ emulated_logitech_g27_settings_dialog::emulated_logitech_g27_settings_dialog(QWi
ADD_MAPPING_SETTING(shifter_6, false, "Gear 6", false); ADD_MAPPING_SETTING(shifter_6, false, "Gear 6", false);
ADD_MAPPING_SETTING(shifter_r, false, "Gear R", false); ADD_MAPPING_SETTING(shifter_r, false, "Gear R", false);
#undef ADD_MAPPING_SETTING #undef ADD_MAPPING_SETTING
v_layout->addWidget(ffb_device); v_layout->addWidget(ffb_device);
v_layout->addWidget(led_device); v_layout->addWidget(led_device);
@ -703,7 +707,7 @@ emulated_logitech_g27_settings_dialog::emulated_logitech_g27_settings_dialog(QWi
emulated_logitech_g27_settings_dialog::~emulated_logitech_g27_settings_dialog() emulated_logitech_g27_settings_dialog::~emulated_logitech_g27_settings_dialog()
{ {
for (auto joystick_handle = joystick_handles.begin();joystick_handle != joystick_handles.end();joystick_handle++) for (auto joystick_handle = joystick_handles.begin(); joystick_handle != joystick_handles.end(); joystick_handle++)
{ {
SDL_CloseJoystick(*joystick_handle); SDL_CloseJoystick(*joystick_handle);
} }
@ -734,7 +738,7 @@ static inline hat_component get_sdl_hat_component(uint8_t sdl_hat)
return HAT_NONE; return HAT_NONE;
} }
const std::map<uint32_t, joystick_state> &emulated_logitech_g27_settings_dialog::get_joystick_states() const std::map<uint32_t, joystick_state>& emulated_logitech_g27_settings_dialog::get_joystick_states()
{ {
if (!sdl_initialized) if (!sdl_initialized)
{ {
@ -755,15 +759,15 @@ const std::map<uint32_t, joystick_state> &emulated_logitech_g27_settings_dialog:
sdl_instance::get_instance().pump_events(); sdl_instance::get_instance().pump_events();
int joystick_count; int joystick_count;
SDL_JoystickID *joystick_ids = SDL_GetJoysticks(&joystick_count); SDL_JoystickID* joystick_ids = SDL_GetJoysticks(&joystick_count);
std::vector<SDL_Joystick *> new_joystick_handles; std::vector<SDL_Joystick*> new_joystick_handles;
if (joystick_ids != nullptr) if (joystick_ids != nullptr)
{ {
for (int i = 0;i < joystick_count;i++) for (int i = 0; i < joystick_count; i++)
{ {
SDL_Joystick *cur_joystick = SDL_OpenJoystick(joystick_ids[i]); SDL_Joystick* cur_joystick = SDL_OpenJoystick(joystick_ids[i]);
if (cur_joystick == nullptr) if (cur_joystick == nullptr)
{ {
continue; continue;
@ -779,15 +783,15 @@ const std::map<uint32_t, joystick_state> &emulated_logitech_g27_settings_dialog:
int num_axes = SDL_GetNumJoystickAxes(cur_joystick); int num_axes = SDL_GetNumJoystickAxes(cur_joystick);
int num_buttons = SDL_GetNumJoystickButtons(cur_joystick); int num_buttons = SDL_GetNumJoystickButtons(cur_joystick);
int num_hats = SDL_GetNumJoystickHats(cur_joystick); int num_hats = SDL_GetNumJoystickHats(cur_joystick);
for (int j = 0;j < num_axes;j++) for (int j = 0; j < num_axes; j++)
{ {
s.axes.push_back(SDL_GetJoystickAxis(cur_joystick, j)); s.axes.push_back(SDL_GetJoystickAxis(cur_joystick, j));
} }
for (int j = 0;j < num_buttons;j++) for (int j = 0; j < num_buttons; j++)
{ {
s.buttons.push_back(SDL_GetJoystickButton(cur_joystick, j)); s.buttons.push_back(SDL_GetJoystickButton(cur_joystick, j));
} }
for (int j = 0;j < num_hats;j++) for (int j = 0; j < num_hats; j++)
{ {
uint8_t sdl_hat = SDL_GetJoystickHat(cur_joystick, j); uint8_t sdl_hat = SDL_GetJoystickHat(cur_joystick, j);
s.hats.push_back(get_sdl_hat_component(sdl_hat)); s.hats.push_back(get_sdl_hat_component(sdl_hat));
@ -796,15 +800,15 @@ const std::map<uint32_t, joystick_state> &emulated_logitech_g27_settings_dialog:
} }
else else
{ {
for (std::vector<int16_t>::size_type j = 0;j < cur_state->second.axes.size();j++) for (std::vector<int16_t>::size_type j = 0; j < cur_state->second.axes.size(); j++)
{ {
cur_state->second.axes[j] = (cur_state->second.axes[j] + SDL_GetJoystickAxis(cur_joystick, j)) / 2; cur_state->second.axes[j] = (cur_state->second.axes[j] + SDL_GetJoystickAxis(cur_joystick, j)) / 2;
} }
for (std::vector<bool>::size_type j = 0;j < cur_state->second.buttons.size();j++) for (std::vector<bool>::size_type j = 0; j < cur_state->second.buttons.size(); j++)
{ {
cur_state->second.buttons[j] = cur_state->second.buttons[j] || SDL_GetJoystickButton(cur_joystick, j); cur_state->second.buttons[j] = cur_state->second.buttons[j] || SDL_GetJoystickButton(cur_joystick, j);
} }
for (std::vector<hat_component>::size_type j = 0;j < cur_state->second.hats.size();j++) for (std::vector<hat_component>::size_type j = 0; j < cur_state->second.hats.size(); j++)
{ {
if (cur_state->second.hats[j] != HAT_NONE) if (cur_state->second.hats[j] != HAT_NONE)
continue; continue;
@ -815,7 +819,7 @@ const std::map<uint32_t, joystick_state> &emulated_logitech_g27_settings_dialog:
} }
} }
for (auto joystick_handle = joystick_handles.begin(); joystick_handle != joystick_handles.end();joystick_handle++) for (auto joystick_handle = joystick_handles.begin(); joystick_handle != joystick_handles.end(); joystick_handle++)
{ {
SDL_CloseJoystick(*joystick_handle); SDL_CloseJoystick(*joystick_handle);
} }
@ -826,7 +830,7 @@ const std::map<uint32_t, joystick_state> &emulated_logitech_g27_settings_dialog:
return last_joystick_states; return last_joystick_states;
} }
void emulated_logitech_g27_settings_dialog::set_state_text(const char *text) void emulated_logitech_g27_settings_dialog::set_state_text(const char* text)
{ {
state_text->setText(QString(text)); state_text->setText(QString(text));
} }
@ -836,7 +840,7 @@ void emulated_logitech_g27_settings_dialog::toggle_state(bool enable)
int slider_position = mapping_scroll_area->verticalScrollBar()->sliderPosition(); int slider_position = mapping_scroll_area->verticalScrollBar()->sliderPosition();
#define TOGGLE_STATE(name) \ #define TOGGLE_STATE(name) \
{ \ { \
if (enable) \ if (enable) \
name->enable(); \ name->enable(); \
@ -882,7 +886,7 @@ void emulated_logitech_g27_settings_dialog::toggle_state(bool enable)
TOGGLE_STATE(shifter_6); TOGGLE_STATE(shifter_6);
TOGGLE_STATE(shifter_r); TOGGLE_STATE(shifter_r);
#undef TOGGLE_STATE #undef TOGGLE_STATE
enabled->setEnabled(enable); enabled->setEnabled(enable);
reverse_effects->setEnabled(enable); reverse_effects->setEnabled(enable);
@ -891,11 +895,13 @@ void emulated_logitech_g27_settings_dialog::toggle_state(bool enable)
mapping_scroll_area->verticalScrollBar()->setSliderPosition(slider_position); mapping_scroll_area->verticalScrollBar()->setSliderPosition(slider_position);
} }
void emulated_logitech_g27_settings_dialog::enable(){ void emulated_logitech_g27_settings_dialog::enable()
{
toggle_state(true); toggle_state(true);
} }
void emulated_logitech_g27_settings_dialog::disable(){ void emulated_logitech_g27_settings_dialog::disable()
{
toggle_state(false); toggle_state(false);
} }

View file

@ -30,65 +30,66 @@ public:
~emulated_logitech_g27_settings_dialog(); ~emulated_logitech_g27_settings_dialog();
void disable(); void disable();
void enable(); void enable();
void set_state_text(const char *); void set_state_text(const char*);
const std::map<uint32_t, joystick_state> &get_joystick_states(); const std::map<uint32_t, joystick_state>& get_joystick_states();
private: private:
void toggle_state(bool enable); void toggle_state(bool enable);
void load_ui_state_from_config(); void load_ui_state_from_config();
void save_ui_state_to_config(); void save_ui_state_to_config();
std::map<uint32_t, joystick_state> last_joystick_states; std::map<uint32_t, joystick_state> last_joystick_states;
std::vector<SDL_Joystick *> joystick_handles; std::vector<SDL_Joystick*> joystick_handles;
uint64_t last_joystick_states_update = 0; uint64_t last_joystick_states_update = 0;
bool sdl_initialized = false; bool sdl_initialized = false;
// ui elements // ui elements
QLabel *state_text; QLabel* state_text;
QCheckBox *enabled; QCheckBox* enabled;
QCheckBox *reverse_effects; QCheckBox* reverse_effects;
Mapping *steering; Mapping* steering;
Mapping *throttle; Mapping* throttle;
Mapping *brake; Mapping* brake;
Mapping *clutch; Mapping* clutch;
Mapping *shift_up; Mapping* shift_up;
Mapping *shift_down; Mapping* shift_down;
Mapping *up; Mapping* up;
Mapping *down; Mapping* down;
Mapping *left; Mapping* left;
Mapping *right; Mapping* right;
Mapping *triangle; Mapping* triangle;
Mapping *cross; Mapping* cross;
Mapping *square; Mapping* square;
Mapping *circle; Mapping* circle;
Mapping *l2; Mapping* l2;
Mapping *l3; Mapping* l3;
Mapping *r2; Mapping* r2;
Mapping *r3; Mapping* r3;
Mapping *plus; Mapping* plus;
Mapping *minus; Mapping* minus;
Mapping *dial_clockwise; Mapping* dial_clockwise;
Mapping *dial_anticlockwise; Mapping* dial_anticlockwise;
Mapping *select; Mapping* select;
Mapping *pause; Mapping* pause;
Mapping *shifter_1; Mapping* shifter_1;
Mapping *shifter_2; Mapping* shifter_2;
Mapping *shifter_3; Mapping* shifter_3;
Mapping *shifter_4; Mapping* shifter_4;
Mapping *shifter_5; Mapping* shifter_5;
Mapping *shifter_6; Mapping* shifter_6;
Mapping *shifter_r; Mapping* shifter_r;
DeviceChoice *ffb_device; DeviceChoice* ffb_device;
DeviceChoice *led_device; DeviceChoice* led_device;
QScrollArea *mapping_scroll_area; QScrollArea* mapping_scroll_area;
}; };