Skip to content

Commit a7e578d

Browse files
committed
Add FP LED v1 support
1 parent d323332 commit a7e578d

2 files changed

Lines changed: 75 additions & 15 deletions

File tree

cros_ec_python/commands/framework_laptop.py

Lines changed: 74 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,8 @@
66
from enum import Enum
77
import struct
88
from datetime import timedelta
9+
10+
from .. import exceptions as ec_exceptions
911
from ..baseclass import CrosEcClass
1012
from ..constants.COMMON import *
1113

@@ -128,6 +130,11 @@ class FpLedBrightnessLevel(Enum):
128130
FP_LED_BRIGHTNESS_LEVEL_HIGH = 0
129131
FP_LED_BRIGHTNESS_LEVEL_MEDIUM = 1
130132
FP_LED_BRIGHTNESS_LEVEL_LOW = 2
133+
"Not supported on some models"
134+
FP_LED_BRIGHTNESS_LEVEL_ULTRALOW = 3
135+
"Not allowed to set to enum custom value"
136+
FP_LED_BRIGHTNESS_LEVEL_CUSTOM = 0xFE
137+
FP_LED_BRIGHTNESS_LEVEL_AUTO = 0xFF
131138

132139

133140
def set_fp_led_level(ec: CrosEcClass, level: FpLedBrightnessLevel | int) -> None:
@@ -142,32 +149,85 @@ def set_fp_led_level(ec: CrosEcClass, level: FpLedBrightnessLevel | int) -> None
142149
ec.command(0, EC_CMD_FP_LED_LEVEL_CONTROL, 2, 0, data)
143150

144151

145-
def get_fp_led_level_int(ec: CrosEcClass) -> UInt8:
152+
def set_fp_led_percent(ec: CrosEcClass, percentage: int) -> None:
146153
"""
147-
Get the raw fingerprint LED level.
154+
Set the fingerprint LED brightness percentage.
155+
This requires EC_CMD_FP_LED_LEVEL_CONTROL version 1 support.
148156
:param ec: The CrOS_EC object.
149-
:return: The current fingerprint LED level.
157+
:param percentage: The percentage to set the fingerprint LED to (0-100).
158+
"""
159+
data = struct.pack("<Bx", percentage)
160+
ec.command(1, EC_CMD_FP_LED_LEVEL_CONTROL, 2, 0, data)
161+
162+
163+
def get_fp_led_percent(ec: CrosEcClass, version: Literal[0, 1] = 0) -> UInt8:
164+
"""
165+
Get the fingerprint LED brightness percentage.
166+
:param ec: The CrOS_EC object.
167+
:return: The current fingerprint LED brightness percentage (0-100).
150168
"""
151169
data = struct.pack("<xB", 1)
152-
resp = ec.command(0, EC_CMD_FP_LED_LEVEL_CONTROL, 2, 1, data)
153-
return struct.unpack("<B", resp)[0]
170+
match version:
171+
case 0:
172+
resp = ec.command(version, EC_CMD_FP_LED_LEVEL_CONTROL, 2, 1, data)
173+
return struct.unpack("<B", resp)[0]
174+
case 1:
175+
resp = ec.command(version, EC_CMD_FP_LED_LEVEL_CONTROL, 2, 2, data)
176+
return struct.unpack("<BB", resp)[0]
177+
case _:
178+
raise ValueError("Invalid version, must be 0 or 1")
179+
180+
181+
def get_fp_led_levels_v1(ec: CrosEcClass) -> dict[str, int]:
182+
"""
183+
Get the fingerprint LED level and brightness percentage.
184+
This requires EC_CMD_FP_LED_LEVEL_CONTROL version 1 support.
185+
:param ec: The CrOS_EC object.
186+
:return: A dictionary with the current fingerprint LED level and brightness percentage.
187+
"""
188+
data = struct.pack("<xB", 1)
189+
resp = ec.command(1, EC_CMD_FP_LED_LEVEL_CONTROL, 2, 2, data)
190+
levels = struct.unpack("<BB", resp)[0]
191+
return {
192+
"level": levels[0],
193+
"percentage": levels[1],
194+
}
154195

155196

156-
def get_fp_led_level(ec: CrosEcClass) -> FpLedBrightnessLevel:
197+
def get_fp_led_level(ec: CrosEcClass, version: Literal[0, 1] | None = None) -> FpLedBrightnessLevel:
157198
"""
158199
Get the fingerprint LED level.
159200
:param ec: The CrOS_EC object.
160201
:return: The current fingerprint LED level.
161202
"""
162-
match level := get_fp_led_level_int(ec):
163-
case 55:
164-
return FpLedBrightnessLevel.FP_LED_BRIGHTNESS_LEVEL_HIGH
165-
case 40:
166-
return FpLedBrightnessLevel.FP_LED_BRIGHTNESS_LEVEL_MEDIUM
167-
case 15:
168-
return FpLedBrightnessLevel.FP_LED_BRIGHTNESS_LEVEL_LOW
203+
match version:
204+
case 0:
205+
match level := get_fp_led_percent(ec, 0):
206+
case 55:
207+
return FpLedBrightnessLevel.FP_LED_BRIGHTNESS_LEVEL_HIGH
208+
case 40:
209+
return FpLedBrightnessLevel.FP_LED_BRIGHTNESS_LEVEL_MEDIUM
210+
# case 28:
211+
# return FpLedBrightnessLevel.FP_LED_BRIGHTNESS_LEVEL_MEDIUMLOW
212+
case 15:
213+
return FpLedBrightnessLevel.FP_LED_BRIGHTNESS_LEVEL_LOW
214+
case 8:
215+
return FpLedBrightnessLevel.FP_LED_BRIGHTNESS_LEVEL_ULTRALOW
216+
case _:
217+
return FpLedBrightnessLevel.FP_LED_BRIGHTNESS_LEVEL_CUSTOM
218+
case 1:
219+
level = get_fp_led_percent(ec, 1)
220+
return FpLedBrightnessLevel(level)
221+
case None:
222+
try:
223+
return get_fp_led_level(ec, 1)
224+
except ec_exceptions.ECError as e:
225+
if e.ec_status == ec_exceptions.EcStatus.EC_RES_INVALID_VERSION:
226+
return get_fp_led_level(ec, 0)
227+
else:
228+
raise e
169229
case _:
170-
raise ValueError(f"Invalid fingerprint LED level ({level})")
230+
raise ValueError("Invalid version, must be 0 or 1")
171231

172232

173233
EC_CMD_CHASSIS_OPEN_CHECK: Final = 0x3E0F

tests/framework_laptop.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -66,7 +66,7 @@ def test(self):
6666

6767
class TestGetFpLedLevel(unittest.TestCase):
6868
def test_int(self):
69-
resp = ec_fw.get_fp_led_level_int(ec)
69+
resp = ec_fw.get_fp_led_percent(ec)
7070
print(type(self).__name__, "-", "Resp:", resp)
7171
self.assertIsInstance(resp, int)
7272

0 commit comments

Comments
 (0)