steelseries: sonic: Rewrite connect using fu_device_retry_full()

This commit is contained in:
Gaël PORTAY 2022-05-24 11:05:18 +02:00 committed by Gaël PORTAY
parent 7bcae04650
commit c5defa89e9

View File

@ -539,19 +539,41 @@ fu_steelseries_sonic_restart(FuDevice *device,
} }
static gboolean static gboolean
fu_steelseries_sonic_wait_for_device(FuDevice *device, GError **error) fu_steelseries_sonic_wait_for_connect_cb(FuDevice *device, gpointer user_data, GError **error)
{
SteelseriesSonicWirelessStatus *wl_status = (SteelseriesSonicWirelessStatus *)user_data;
if (!fu_steelseries_sonic_wireless_status(device, wl_status, error)) {
g_prefix_error(error, "failed to get wireless status: ");
return FALSE;
}
g_debug("WirelessStatus: %u", *wl_status);
if (*wl_status != STEELSERIES_SONIC_WIRELESS_STATE_CONNECTED) {
g_set_error(error, FWUPD_ERROR, FWUPD_ERROR_NOT_FOUND, "device is unreachable");
return FALSE;
}
/* success */
return TRUE;
}
static gboolean
fu_steelseries_sonic_wait_for_connect(FuDevice *device, guint delay, GError **error)
{ {
SteelseriesSonicWirelessStatus wl_status; SteelseriesSonicWirelessStatus wl_status;
g_autoptr(FwupdRequest) request = NULL;
g_autoptr(GError) error_local = NULL;
g_autofree gchar *msg = NULL;
if (!fu_steelseries_sonic_wireless_status(device, &wl_status, error)) { if (!fu_steelseries_sonic_wireless_status(device, &wl_status, error)) {
g_prefix_error(error, "failed to get wireless status: "); g_prefix_error(error, "failed to get wireless status: ");
return FALSE; return FALSE;
} }
g_debug("WirelessStatus: %u", wl_status); g_debug("WirelessStatus: %u", wl_status);
if (wl_status != STEELSERIES_SONIC_WIRELESS_STATE_CONNECTED) { if (wl_status == STEELSERIES_SONIC_WIRELESS_STATE_CONNECTED) {
g_autoptr(FwupdRequest) request = NULL; /* success */
g_autoptr(GTimer) timer = NULL; return TRUE;
g_autofree gchar *msg = NULL; }
/* the user has to do something */ /* the user has to do something */
msg = g_strdup_printf("%s needs to be connected to start the update. " msg = g_strdup_printf("%s needs to be connected to start the update. "
@ -564,23 +586,17 @@ fu_steelseries_sonic_wait_for_device(FuDevice *device, GError **error)
fwupd_request_set_message(request, msg); fwupd_request_set_message(request, msg);
fu_device_emit_request(device, request); fu_device_emit_request(device, request);
/* poll for the wireless status */ if (!fu_device_retry_full(device,
timer = g_timer_new(); fu_steelseries_sonic_wait_for_connect_cb,
do { delay / 1000,
g_usleep(G_USEC_PER_SEC); 1000,
if (!fu_steelseries_sonic_wireless_status(device, &wl_status, error)) { &wl_status,
g_prefix_error(error, "failed to get wireless status: "); &error_local))
return FALSE; g_debug("%s", error_local->message);
}
g_debug("WirelessStatus: %u", wl_status);
} while (wl_status != STEELSERIES_SONIC_WIRELESS_STATE_CONNECTED &&
g_timer_elapsed(timer, NULL) * 1000.f <
FU_DEVICE_REMOVE_DELAY_USER_REPLUG);
if (wl_status != STEELSERIES_SONIC_WIRELESS_STATE_CONNECTED) { if (wl_status != STEELSERIES_SONIC_WIRELESS_STATE_CONNECTED) {
g_set_error_literal(error, FWUPD_ERROR, FWUPD_ERROR_NEEDS_USER_ACTION, msg); g_set_error_literal(error, FWUPD_ERROR, FWUPD_ERROR_NEEDS_USER_ACTION, msg);
return FALSE; return FALSE;
} }
}
/* success */ /* success */
return TRUE; return TRUE;
@ -637,7 +653,9 @@ fu_steelseries_sonic_prepare(FuDevice *device,
{ {
guint16 bat_state; guint16 bat_state;
if (!fu_steelseries_sonic_wait_for_device(device, error)) if (!fu_steelseries_sonic_wait_for_connect(device,
fu_device_get_remove_delay(device),
error))
return FALSE; return FALSE;
if (!fu_steelseries_sonic_battery_state(device, &bat_state, error)) { if (!fu_steelseries_sonic_battery_state(device, &bat_state, error)) {
@ -789,7 +807,9 @@ fu_steelseries_sonic_read_firmware(FuDevice *device, FuProgress *progress, GErro
g_autoptr(FuFirmware) firmware_holtek = NULL; g_autoptr(FuFirmware) firmware_holtek = NULL;
g_autoptr(FuFirmware) firmware_mouse = NULL; g_autoptr(FuFirmware) firmware_mouse = NULL;
if (!fu_steelseries_sonic_wait_for_device(device, error)) if (!fu_steelseries_sonic_wait_for_connect(device,
fu_device_get_remove_delay(device),
error))
return NULL; return NULL;
fu_progress_set_id(progress, G_STRLOC); fu_progress_set_id(progress, G_STRLOC);