> Внимание

Внимание! Все вопросы по программам, отсутствующим в этом разделе, задавайте в теме Скорая помощь новичкам.

В ЭТОМ РАЗДЕЛЕ ТОЛЬКО КАТАЛОГ ПРОГРАММ! СОЗДАНИЕ ТЕМ С ВОПРОСАМИ ЗАПРЕЩЕНО! ПОИСК ПРОГРАММ.
Новые темы необходимо создавать только в корневом разделе! В дальнейшем они будут обработаны модераторами.



LED_Test | проверка параметров мигания светодиодов



Реп: (210)
LED_Test
версия: 1.00

Последнее обновление программы в шапке: 16.02.2012

Прикрепленное изображение

Описание:
Проверка параметров мигания светодиодов. Такие параметры можно найти в ветке реестра HKLM\Driver\BuiltIn\NLed\Config, которая отвечает за уведомления о различных событиях миганием/горением светодиодов.

Возможности:
  • Демонстрирует мигание выбранного светодиода при указанных значениях параметров.

Краткое описание этих параметров мигания:
Для индикации многих событий посредством светодиода система пользуется настройками в реестре в ветке 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, т.к. при этих значениях контроля мигания какими-либо параметрами нет.


Теперь к событиям.
В разделе каждого диода можно создать подраздел с названием EventX, где 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 дают наибольшую свободу творчеству.


Итак, теперь по порядку на примере моего Philips v816. Возьмём Led3 - голубой светодиод. Загорается при включении WiFi и BlueTooth по умолчанию.
[HKEY_LOCAL_MACHINE\Drivers\BuiltIn\NLed\Config\Led3]
"LedNum"=dword:00000003 - номер диода 3.
"LedGroup"=dword:00000003 - номер группы диодов 3.
"LedType"=dword:00000001 - это лампочка.
"Blinkable"=dword:00000001 - умеет мигать на уровне железа.
"SWBlinkCtrl"=dword:00000000 - параметр игнорируется, т.к. Blinkable=1.
"AdjustType"=dword:00000002 - можно настраивать время включения OnTime и время молчания OffTime.
"MetaCycle"=dword:00000000 - нельзя настраивать количество циклов включения/молчания MetaCycleOn и MetaCycleOff.
"D4State"=dword:00000000 - при засыпании смартфона диод выключается.
"CycleAdjust"=dword:00002710 - минимальное воспринимаемое изменение времени - 10000 мкс (0,01 с).

Просмотрим Event1:
[HKEY_LOCAL_MACHINE\Drivers\BuiltIn\NLed\Config\Led3\Event1]
"Root"=dword:80000002 - HKEY_LOCAL_MACHINE.
"Path"="System\\State\\Hardware" - в этой ветке система записывает состояние многих устройств. Двойные слэши получились при экспорте ветки в файл, на самом деле в самом реестре написано System\State\Hardware.
"ValueName"="Wifi" - в указанной выше ветке есть такой параметр. Если включить WiFi, его значение изменится. Причём 2 раза: первый - при включении, второй - при подключении к сети. Значение при включении будет равно 11, в двоичной системе 01011. При подключении к сети - 19 (10011). В выключенном состоянии показывает 1 (00001). Разместим все три числа друг над другом:
00001 - выкл.
01011 - вкл.
10011 - подкл.
Видим, что от выключенного состояния остальные отличаются одинаково на один бит - второй, т.е. на 00010. Вот это изменение и надо отловить. Как это сделать? С помощью фильтра - маски. Маска определяет, на какие биты целевого значения нужно обращать внимание, а на какие - нет. В данном случае нас интересует только второй бит, значит маска будет равна 00010, или в шестнадцатеричной форме - 2 (перевести можно калькулятором, даже стандартным в win7 в виде Программист).
"Mask"=dword:00000002 - 00010.
Итак, WiFi перешёл в одно из включённых состояний, после фильтрации маской мы получили значение 2 (00010). Что с ним делать? Естественно, сравнивать! Со значеним параметра TriggerValue используя оператор сравнения Operator. Нам нужно равенство:
"Operator"=dword:00000000 - оператор =.
Сравнивать будем с прошедшим фильтр-маску значением. С маской 00010 значение при включении будет таким же - 00010 или 2 в шестнадцатеричной форме.
"TriggerValue"=dword:00000002
Событие сработало. Что надо сделать? Включить светодиод, естественно (ну или выключить, кому что). Для этого выбираем значение параметра State по вкусу.
"State"=dword:00000002 - светодиод начинает мигать.
Голубой светодиод - не единственный. Если сделать несколько событий в группе (у нас такого нет, но можно сделать), то им надо раздать приоритеты. Все вместе они гореть не могут. Поэтому ставим приоритет по желанию.
"Prio"=dword:00000002

Осталось настроить мигание в силу поддержки данным светодиодом настройки этого мигания. Смотрим предыдущие параметры и на схемку выше и понимаем, что в данном случае диод поддерживает настройку параметров OnTime и OffTime. Другие параметры игнорируются:
"OnTime"=dword:000F4240 - время непрерывного горения при мигании 1000000 мкс (1 с).
"OffTime"=dword:00895440 - время выключения между непрерывными горениями при мигании 9000000 мкс (9 с).
"TotalCycleTime"=dword:00989680 - игнорируется, т.к. AdjustType=2.
"MetaCycleOff"=dword:00000000 - игнорируется, т.к. MetaCycle=0.
"MetaCycleOn"=dword:00000001 - игнорируется, т.к. MetaCycle=0.
Рисунки наглядно демонстрируют значение параметров времени.
Прикрепленное изображение

Это пример настройки двух светодиодов для попеременного мигания в одно и то же время.
Прикрепленное изображение

Эти же параметры есть в программе. Набираете нужные значения, жмёте Set - если галка Success установлена, значит процедура прошла успешно, и светодиод должен загореться по вашей "программе".
Галка Blink указывает, светить светодиоду постоянно или мигать (если установлена, то мигать).
Программа не доведена до интерфейсного совершенства, поэтому нет полной проверки правильности ввода данных и других действий пользователя. Вводите только цифры или пользуйтесь кнопками Больше/Меньше.


Проверено на: 480x800, 240x400, 240x320, 320x320, 480x480. Должна поддерживать все разрешения.
Совместимость: WM 6, WM 6.1, WM 6.5, WM 6.5.1
Для работы нужен .NET CF v2.0.


Скачать:
Версия: 1.00: Прикрепленный файлLED_Test.zip ( 10.44 КБ )


Сообщение отредактировал Kreator-2 - 23.03.12, 12:25
Причина редактирования: Поправил описание, дополнил в соответствии с оригиналом MSDN



Реп: (34)
Если не секрет- автор вы?



Реп: (210)
Не секрет - я.
QR-код для скачивания с телефона: Тут

Сообщение отредактировал Kreator-2 - 17.02.12, 09:13
Причина редактирования: Добовил QR. Можно в шапку, если ссылка на файл постоянна?



Реп: (24)
Kreator-2, Ваша программа явно не для всех аппаратов. У меня например реестр здесь заканчивается HKLM\Driver\BuiltIn\NLed



Реп: (210)
maximilliangreat @ 23.02.2012, 02:19 *
Kreator-2, Ваша программа явно не для всех аппаратов. У меня например реестр здесь заканчивается HKLM\Driver\BuiltIn\NLed

На самом деле, программа для всех, т.к. использует стандартную функцию работы с диодами Win Mobile (т.е. собственно программа будет работать). Что касается реестра - да, эти ветки и значения использует служба/драйвер, который меняется от смарта к смарту. Возможно, они есть и у Вас, но по другому адресу. А возможно, и нет. Кто знает, как производитель решил организовать оповещение о событиях. На v816, например, часть событий описана в этих ветках, а часть - нет (пропущенный вызов и новая смс, например). Ветка реестра - лишь частный случай применения значений этих параметров. Я хотел эту программу положить в маленькие полезные, но по правилам "если необходимо дополнительное описание, то лучше создать новую тему", что и сделал.
Кстати, вот тут есть описание этих параметров, значит, всу же для всех. Просто не все производители, видимо, пользуются этой системой оповещений.

Сообщение отредактировал Kreator-2 - 25.02.12, 14:50
Причина редактирования: Добавил ссылку


Полная версия   Текстовая версия

Помощь   Правила

Сейчас: 28.03.24, 21:36