66from enum import Enum
77import struct
88from datetime import timedelta
9+
10+ from .. import exceptions as ec_exceptions
911from ..baseclass import CrosEcClass
1012from ..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
133140def 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
173233EC_CMD_CHASSIS_OPEN_CHECK : Final = 0x3E0F
0 commit comments