steelseries: fizz-tunnel: Get battery level

This commit is contained in:
Gaël PORTAY 2022-05-24 08:40:52 +02:00 committed by Gaël PORTAY
parent 8992698381
commit 0b8ff7196a
3 changed files with 60 additions and 0 deletions

View File

@ -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);
}

View File

@ -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)
{

View File

@ -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);