diff --git a/plugins/steelseries/fu-steelseries-fizz-tunnel.c b/plugins/steelseries/fu-steelseries-fizz-tunnel.c index 26ce54c17..82ba2fcdf 100644 --- a/plugins/steelseries/fu-steelseries-fizz-tunnel.c +++ b/plugins/steelseries/fu-steelseries-fizz-tunnel.c @@ -180,6 +180,7 @@ fu_steelseries_fizz_tunnel_prepare(FuDevice *device, { FuDevice *parent = fu_device_get_parent(device); guint8 status; + guint8 level; if (!fu_steelseries_fizz_connection_status(parent, &status, error)) { g_prefix_error(error, "failed to get connection status: "); @@ -190,6 +191,21 @@ fu_steelseries_fizz_tunnel_prepare(FuDevice *device, g_set_error(error, FWUPD_ERROR, FWUPD_ERROR_NOT_FOUND, "device is unreachable"); return FALSE; } + if (!fu_steelseries_fizz_battery_level(parent, TRUE, &level, error)) { + g_prefix_error(error, "failed to get battery level: "); + return FALSE; + } + g_debug("BatteryLevel: 0x%02x", level); + /* + * CHARGING: Most significant bit. When bit is set to 1 it means battery is currently + * charging/plugged in + * + * LEVEL: 7 least significant bit value of the battery. Values are between 2-21, to get % + * you can do (LEVEL - 1) * 5 + */ + fu_device_set_battery_level(device, + ((level & STEELSERIES_FIZZ_BATTERY_LEVEL_STATUS_BITS) - 1U) * + 5U); /* success */ return TRUE; @@ -285,6 +301,8 @@ fu_steelseries_fizz_tunnel_init(FuSteelseriesFizzTunnel *self) fu_device_set_logical_id(FU_DEVICE(self), "tunnel"); fu_device_set_install_duration(FU_DEVICE(self), 38); /* 38 s */ fu_device_set_remove_delay(FU_DEVICE(self), FU_DEVICE_REMOVE_DELAY_RE_ENUMERATE); /* 10 s */ + fu_device_set_poll_interval(FU_DEVICE(self), 60000); /* 1 min */ + fu_device_set_battery_threshold(FU_DEVICE(self), 20); fu_device_set_firmware_gtype(FU_DEVICE(self), FU_TYPE_STEELSERIES_FIRMWARE); } diff --git a/plugins/steelseries/fu-steelseries-fizz.c b/plugins/steelseries/fu-steelseries-fizz.c index 757a60d24..be8868afa 100644 --- a/plugins/steelseries/fu-steelseries-fizz.c +++ b/plugins/steelseries/fu-steelseries-fizz.c @@ -28,6 +28,9 @@ #define STEELSERIES_FIZZ_VERSION_COMMAND_OFFSET 0x00U #define STEELSERIES_FIZZ_VERSION_MODE_OFFSET 0x01U +#define STEELSERIES_FIZZ_BATTERY_LEVEL_COMMAND_OFFSET 0x00U +#define STEELSERIES_FIZZ_BATTERY_LEVEL_LEVEL_OFFSET 0x01U + #define STEELSERIES_FIZZ_PAIRED_STATUS_COMMAND_OFFSET 0x00U #define STEELSERIES_FIZZ_PAIRED_STATUS_STATUS_OFFSET 0x01U @@ -508,6 +511,40 @@ fu_steelseries_fizz_read_access_file(FuDevice *device, return TRUE; } +gboolean +fu_steelseries_fizz_battery_level(FuDevice *device, gboolean tunnel, guint8 *level, GError **error) +{ + guint8 data[STEELSERIES_BUFFER_CONTROL_SIZE] = {0}; + guint16 cmd = 0x92U; + + if (tunnel) + cmd |= STEELSERIES_FIZZ_COMMAND_TUNNEL_BIT; + + if (!fu_common_write_uint8_safe(data, + sizeof(data), + STEELSERIES_FIZZ_BATTERY_LEVEL_COMMAND_OFFSET, + cmd, + error)) + return FALSE; + + if (g_getenv("FWUPD_STEELSERIES_FIZZ_VERBOSE") != NULL) + fu_common_dump_raw(G_LOG_DOMAIN, "BatteryLevel", data, sizeof(data)); + if (!fu_steelseries_device_cmd(FU_STEELSERIES_DEVICE(device), data, TRUE, error)) + return FALSE; + if (g_getenv("FWUPD_STEELSERIES_FIZZ_VERBOSE") != NULL) + fu_common_dump_raw(G_LOG_DOMAIN, "BatteryLevel", data, sizeof(data)); + + if (!fu_common_read_uint8_safe(data, + sizeof(data), + STEELSERIES_FIZZ_BATTERY_LEVEL_LEVEL_OFFSET, + level, + error)) + return FALSE; + + /* success */ + return TRUE; +} + gboolean fu_steelseries_fizz_paired_status(FuDevice *device, guint8 *status, GError **error) { diff --git a/plugins/steelseries/fu-steelseries-fizz.h b/plugins/steelseries/fu-steelseries-fizz.h index 93dc79079..6f7908dbd 100644 --- a/plugins/steelseries/fu-steelseries-fizz.h +++ b/plugins/steelseries/fu-steelseries-fizz.h @@ -28,6 +28,9 @@ fu_steelseries_fizz_new(FuDevice *self); #define STEELSERIES_FIZZ_RESET_MODE_NORMAL 0x00U #define STEELSERIES_FIZZ_RESET_MODE_BOOTLOADER 0x01U +#define STEELSERIES_FIZZ_BATTERY_LEVEL_CHARGING_BIT 0x80U +#define STEELSERIES_FIZZ_BATTERY_LEVEL_STATUS_BITS 0x7fU + #define STEELSERIES_FIZZ_RECEIVER_FILESYSTEM_MAIN_BOOT_ID 0x01U #define STEELSERIES_FIZZ_RECEIVER_FILESYSTEM_FSDATA_FILE_ID 0x02U #define STEELSERIES_FIZZ_RECEIVER_FILESYSTEM_FACTORY_SETTINGS_ID 0x03U @@ -109,6 +112,8 @@ fu_steelseries_fizz_write_file(FuDevice *device, FwupdInstallFlags flags, GError **error); gboolean +fu_steelseries_fizz_battery_level(FuDevice *device, gboolean tunnel, guint8 *level, GError **error); +gboolean fu_steelseries_fizz_paired_status(FuDevice *device, guint8 *status, GError **error); gboolean fu_steelseries_fizz_connection_status(FuDevice *device, guint8 *status, GError **error);