Skip to content

Commit

Permalink
Refinement and cleanup
Browse files Browse the repository at this point in the history
  • Loading branch information
zoltanvb committed Jun 2, 2024
1 parent fc4fe54 commit d1d2dad
Show file tree
Hide file tree
Showing 2 changed files with 63 additions and 39 deletions.
4 changes: 2 additions & 2 deletions input/drivers_joypad/test_joypad.c
Original file line number Diff line number Diff line change
Expand Up @@ -72,8 +72,8 @@ typedef struct

static input_test_step_t input_test_steps[MAX_TEST_STEPS];

static unsigned current_frame = 0;
static unsigned next_teststep_frame = 0;
static uint32_t current_frame = 0;
static uint32_t next_teststep_frame = 0;
static unsigned current_test_step = 0;
static unsigned last_test_step = MAX_TEST_STEPS + 1;
static uint32_t input_state_validated = 0;
Expand Down
98 changes: 61 additions & 37 deletions tasks/task_autodetect.c
Original file line number Diff line number Diff line change
Expand Up @@ -354,12 +354,18 @@ static bool input_autoconfigure_scan_config_files_internal(
return false;
}

/* Reallocate the automatically assigned player <-> port mapping if needed.
/* Reallocate the automatically assigned player <-> port mapping if needed.
* Objectives:
* - if there is no reservation, do not change anything
* - if detected port is reserved for something else (reserved mode), change it to first free player
* - if there is reservation for the device, assign it to the reserved player
*/
* - when assigning a new device to a reserved port, move the previous entry
* to first free slot if it was occupied
* - use first free player port by default for new entries (overriding saved
* input_joypad_index, as it can
* get quite messy if reservations are done, due to the swaps above)
* - do not consider "reserved" ports free
* - if there is no reservation, do not change anything
* (not even the assignment to first free player port)
*/
static void reallocate_port_if_needed(unsigned detected_port, int vendor_id,
int product_id, const char *device_name)
{
Expand All @@ -369,6 +375,7 @@ static void reallocate_port_if_needed(unsigned detected_port, int vendor_id,
unsigned first_free_player_slot = MAX_USERS + 1;
unsigned prev_assigned_player_slots[MAX_USERS];
bool device_has_reserved_slot = false;
bool no_reservation_at_all = true;
char settings_value[256] = {0};
int settings_value_vendor_id;
int settings_value_product_id;
Expand All @@ -377,41 +384,56 @@ static void reallocate_port_if_needed(unsigned detected_port, int vendor_id,
for (player = 0; player < MAX_USERS; player++)
{
if (first_free_player_slot > settings->uints.input_max_users &&
(detected_port == settings->uints.input_joypad_index[player] || !input_config_get_device_name(settings->uints.input_joypad_index[player])) &&
( detected_port == settings->uints.input_joypad_index[player] ||
!input_config_get_device_name(settings->uints.input_joypad_index[player])) &&
settings->uints.input_device_reservation_type[player] != INPUT_DEVICE_RESERVATION_RESERVED )
{
first_free_player_slot = player;
RARCH_DBG("[Autoconf]: First unconfigured / unreserved player is %d\n", player+1);
RARCH_DBG("[Autoconf]: First unconfigured / unreserved player is %d\n",
player+1);
}
prev_assigned_player_slots[settings->uints.input_joypad_index[player]] = player;
if (settings->uints.input_device_reservation_type[player] != INPUT_DEVICE_RESERVATION_NONE)
no_reservation_at_all = false;
}
if (first_free_player_slot > settings->uints.input_max_users) {
RARCH_ERR( "[Autoconf]: No free and unreserved player slots found for adding new device \"%s\"! Detected port %d, max_users: %d, first free slot %d\n",
device_name, detected_port, settings->uints.input_max_users, first_free_player_slot+1);
RARCH_WARN("[Autoconf]: Leaving detected player slot in place: %d\n", prev_assigned_player_slots[detected_port]);
RARCH_ERR( "[Autoconf]: No free and unreserved player slots found for adding new device"
" \"%s\"! Detected port %d, max_users: %d, first free slot %d\n",
device_name, detected_port,
settings->uints.input_max_users,
first_free_player_slot+1);
RARCH_WARN("[Autoconf]: Leaving detected player slot in place: %d\n",
prev_assigned_player_slots[detected_port]);
return;
}

for (player = 0; player < MAX_USERS; player++)
{
if (settings->uints.input_device_reservation_type[player] != INPUT_DEVICE_RESERVATION_NONE)
strlcpy(settings_value, settings->arrays.input_reserved_devices[player], sizeof(settings_value));
strlcpy(settings_value, settings->arrays.input_reserved_devices[player],
sizeof(settings_value));
else
settings_value[0] = '\0';

if (!string_is_empty(settings_value))
{
RARCH_DBG("[Autoconf]: Examining reserved device for player %d type %d: %s against %04x:%04x\n",
player+1, settings->uints.input_device_reservation_type[player],
settings_value, vendor_id, product_id);
RARCH_DBG("[Autoconf]: Examining reserved device for player %d "
"type %d: %s against %04x:%04x\n",
player+1,
settings->uints.input_device_reservation_type[player],
settings_value, vendor_id, product_id);

if (sscanf(settings_value, "%04x:%04x ", &settings_value_vendor_id, &settings_value_product_id) != 2)
if (sscanf(settings_value, "%04x:%04x ",
&settings_value_vendor_id,
&settings_value_product_id) != 2)
{
strlcpy(settings_value_device_name, settings_value, sizeof(settings_value_device_name));
strlcpy(settings_value_device_name, settings_value,
sizeof(settings_value_device_name));
device_has_reserved_slot = string_is_equal(device_name, settings_value_device_name);
}
else
device_has_reserved_slot = (vendor_id == settings_value_vendor_id && product_id == settings_value_product_id);
device_has_reserved_slot = (vendor_id == settings_value_vendor_id &&
product_id == settings_value_product_id);

if (device_has_reserved_slot)
{
Expand All @@ -426,44 +448,45 @@ static void reallocate_port_if_needed(unsigned detected_port, int vendor_id,
unsigned prev_assigned_port = settings->uints.input_joypad_index[player];
if(detected_port != prev_assigned_port)
{
RARCH_LOG("[Autoconf]: Device \"%s\" (%x:%x) is reserved for player %d, updating.\n",
RARCH_LOG("[Autoconf]: Device \"%s\" (%x:%x) is reserved "
"for player %d, updating.\n",
device_name, vendor_id, product_id, player+1);

// todo: fix the pushed info message
settings->uints.input_joypad_index[player] = detected_port;

/*if ((settings->uints.input_device_reservation_type[player] == INPUT_DEVICE_RESERVATION_PREFERRED) &&
input_config_get_device_name(prev_assigned_port))*/
RARCH_LOG("[Autoconf]: Preferred slot was taken earlier by "
"\"%s\", reassigning that to %d\n",
input_config_get_device_name(prev_assigned_port),
prev_assigned_player_slots[detected_port]+1);
settings->uints.input_joypad_index[prev_assigned_player_slots[detected_port]] = prev_assigned_port;
if (input_config_get_device_name(prev_assigned_port))
{
RARCH_LOG("[Autoconf]: Preferred slot was taken earlier by \"%s\", reassigning that to %d\n",
input_config_get_device_name(prev_assigned_port), prev_assigned_player_slots[detected_port]+1);
settings->uints.input_joypad_index[prev_assigned_player_slots[detected_port]] = prev_assigned_port;
if (input_config_get_device_name(prev_assigned_port))
{
unsigned prev_assigned_port_l2 = settings->uints.input_joypad_index[first_free_player_slot];

RARCH_LOG("[Autoconf]: 2nd level reassignment, moving previously assigned port %d to first free player %d\n",
prev_assigned_port_l2, first_free_player_slot+1);
settings->uints.input_joypad_index[prev_assigned_player_slots[detected_port]] = prev_assigned_port_l2;
settings->uints.input_joypad_index[first_free_player_slot] = prev_assigned_port;

}
unsigned prev_assigned_port_l2 = settings->uints.input_joypad_index[first_free_player_slot];

RARCH_LOG("[Autoconf]: 2nd level reassignment, moving "
"previously assigned port %d to first free player %d\n",
prev_assigned_port_l2, first_free_player_slot+1);
settings->uints.input_joypad_index[prev_assigned_player_slots[detected_port]] = prev_assigned_port_l2;
settings->uints.input_joypad_index[first_free_player_slot] = prev_assigned_port;
}

}
else
{
RARCH_DBG("[Autoconf]: Device \"%s\" (%x:%x) is reserved for player %d, same as default assignment.\n",
RARCH_DBG("[Autoconf]: Device \"%s\" (%x:%x) is reserved for "
"player %d, same as default assignment.\n",
device_name, vendor_id, product_id, player+1);
}
return;
}
else
{
RARCH_DBG("[Autoconf]: Device \"%s\" (%d:%d) is not reserved for any player slot.\n",
RARCH_DBG("[Autoconf]: Device \"%s\" (%d:%d) is not reserved for "
"any player slot.\n",
device_name, vendor_id, product_id);
if (prev_assigned_player_slots[detected_port] == first_free_player_slot)
/* Fallback in case no reservation is set up at all - to preserve any previous setup where input_joypad_index may have been customized. */
if (no_reservation_at_all ||
prev_assigned_player_slots[detected_port] == first_free_player_slot)
{
return;
}
Expand All @@ -472,7 +495,8 @@ static void reallocate_port_if_needed(unsigned detected_port, int vendor_id,
unsigned prev_assigned_port = settings->uints.input_joypad_index[first_free_player_slot];
settings->uints.input_joypad_index[first_free_player_slot] = detected_port;
settings->uints.input_joypad_index[prev_assigned_player_slots[detected_port]] = prev_assigned_port;
RARCH_DBG("[Autoconf]: Earlier free player slot found, reassigning to player %d.\n",
RARCH_DBG("[Autoconf]: Earlier free player slot found, "
"reassigning to player %d.\n",
first_free_player_slot+1);
}
}
Expand Down

0 comments on commit d1d2dad

Please sign in to comment.