Для индикации многих событий посредством светодиода система пользуется настройками в реестре в ветке
HKLM\Driver\BuiltIn\NLed\Config. Это не секрет. Если в ней
MddPowerManaged равен 1, то диод управляется драйвером, если 0 - то нет, и дальше можно не читать :)
Для каждого светодиода - своя ветка (эти значения для Philips v816):
Led0 - Виброзвонок (вибрирует только непрерывно)
Led1 - Белый светодиод
Led2 - Красный светодиод
Led3 - Голубой светодиод
Led4 - Тусклая подсветка клавиш и трэкбола
Led5 - Опять белый светодиод :) Не знаю, чем отличаются, первый мигает редко - как при пропущенном звонке или новой СМС, пятый - часто, как при входящем звонке, хотя в реестре параметры мигания одинаковые. У пятого какие-то события прописаны.
В каждой ветке есть параметры. На английском можно почитать в оригинальной статье на
MSDN. Вольный перевод с комментариями пишу тут:
(DWORD)
LedNum - номер диода, для которого применяются настройки этой ветки.
(DWORD)
LedGroup - группа, в которую входит диод. Не обязательный, при 0 и отсутствии значения игнорируется. В группе диоды могут гореть только по одному, приоритет определяет, какой из них горит в данное время. У нас везде равен номеру диода, т.е. группы не используются.
(DWORD)
LedType - Тип диода: 1 - диод, 2 - виброзвонок. 0 - неизвестный.
(DWORD)
Blinkable - Поддерживается ли мигание на уровне железа. (0 - нет, 1 - да).
(DWORD)
SWBlinkCtrl - Поддерживается ли мигание программным способом. (0 - нет, 1 - да).
Последние 2 параметра взаимосвязаны. Поясню: мигание бывает двух типов - на уровне железа и устройства (т.е. драйвер посылает диоду команду "мигай так-то", и диод мигает сам по себе) и на уровне программного контроля (драйвер периодически посылает диоду сигналы "дышите-не дышите", этакое мигание вручную). Если диод физически не поддерживает мигание на уровне железа, то, естественно, никакими параметрами реестра это не поправить. В реестре лишь описано указание на правильный метод работы драйвера с определённым диодом.
Если Blinkable=1, то SWBlinkCtrl игнорируется (т.е. железо в приоритете). Какая разница? Программный контроль работает только при активном режиме (т.е. телефон не спит). Программный контроль позволяет установить практически любую последовательность импульсов любой продолжительности, на уровне железа - только так, как умеет железо (об этом далее). Не знаю наверняка, но следуя простой логике, при программном контроле драйвер использует больше процессорного времени и батарейки, хоть и на мизер. Но это лишь догадки. Красный диод, например, контролируется программно (не умеет он мигать, на заводе не научили).
(DWORD)
AdjustType - поддерживаемый метод настройки мигания на уровне железа.
Только для режима Blinkable=1. (0 - управление не поддерживается - мигает, как умеет; 1 - можно настраивать только
TotalCycleTime; 2 - можно настраивать только
OnTime OffTime).
(DWORD)
CycleAdjust - минимальное время, на которое можно менять время включения/выключения (в микросекундах: 1 с = 1 000 000 мкс). Цена деления, так сказать.
(DWORD)
D4State - состояние диода при переходе в спящий режим. (0 - выкл.; 1 - вкл.; 2 - не зименяется, т.е. если горел - продолжает гореть, если мигал - продолжает мигать). Для работы в спящем режиме должна быть поддержка железа, иначе диод будет не мигать, а гореть при засыпании устройства.
(DWORD)
MetaCycle - показывает, можно ли управлять миганием настройками
MetaCycleOn and
MetaCycleOff. (0 - нельзя, 1 - можно).
Только для режима Blinkable=1Это касаемо общих настроек диодов. Как видно, тут встречаются параметры настройки мигания диодов на уровне железа и программным способом. Для разных типов мигания действуют свои значения. Сведём их в небольшую схемку:
Для всех:
- D4State
- LedNum
- LedGroup
- CycleAdjust
Blinkable=1:
- AdjustType=1
- - TotalCycleTime
- AdjustType=2
- - OnTime
- - OffTime
- MetaCycle=1
- - MetaCycleOn
- - MetaCycleOff
Blinkable=0:
- SWBlinkCtrl=1
- - OnTime
- - OffTime
- - MetaCycleOn
- - MetaCycleOff
Я намеренно не указал нулевые значения Blinkable и SWBlinkCtrl, т.к. при этих значениях контроля мигания какими-либо параметрами нет.
Теперь к событиям.
В разделе каждого диода можно создать подраздел с названием Event
X, где
X - цифра. Каждый такой подраздел отвечает за управление этим диодом при одном определённом событии. Рассмотрим содержимое.
Начну в логическом порядке, а не в алфавитном:
(DWORD)
Root - корневая ветка реестра (HKEY_CLASSES_ROOT - 0x80000000, HKEY_CURRENT_USER - 0x80000001, HKEY_LOCAL_MACHINE - 0x80000002, HKEY_USERS - 0x80000004).
(String)
Path - путь к ветке реестра, где хранится управляющее значение (то, по которому система определит возникновение события). Не включает название корневой ветки (например,
State\Something).
(String)
ValueName - имя управляющего параметра.
В итоге, из трёх первых значений мы получаем путь к параметру, на который реагирует диод. И небольшое ограничение от MS - максимальная длина пути к параметру не может быть больше 255 символов.
(DWORD)
Mask - битовая маска
И, которая применяется к управляющему параметру, чтобы получить управляющее значение (об этом далее). "Фильтр" такой.
(DWORD)
TriggerValue - значение управляющего параметра, при котором срабатывает событие. С ним сравнивается значение в управляющем параметре ValueName после применения маски.
(DWORD)
Operator - оператор сравнения значений (0 =, 1 >, 2 >=, 3 <, 4 <=). Т.е. если Operator=1, то управляющее значение должно стать больше TriggerValue, чтобы возникло событие.
(DWORD)
State - тип свечения: 0 - выключен, 1 - постоянное свечение, 2 - мигание.
(DWORD)
Prio - приоритет события. Чем меньше - тем выше приоритет. События для одного диода или группы диодов должны иметь разные приоритеты.
Теперь самое интересное - тонкая настройка мигания:
(DWORD)
TotalCycleTime - полное время одного цикла мигания (период, если по-научному). Как видно их схемки выше, применяется только при
Blinkable=1 и
AdjustType=1.
(DWORD)
OnTime - время непрерывного горения при мигании.
(DWORD)
OffTime - время выключения между непрерывными горениями при мигании.
(DWORD)
MetaCycleOn - количество включений в серии при мигании.
(DWORD)
MetaCycleOff - количество циклов в перерывах между сериями (подробно далее).
Какие параметры влияют на работу, смотрите схемку выше. Можно только добавить, что комбинация
Blinkable=0 и
SWBlinkCtrl=1 дают наибольшую свободу творчеству.