tag:blogger.com,1999:blog-68273632805925329572024-02-08T08:24:51.703+02:00cat **/* | grep яAkshaalhttp://www.blogger.com/profile/05677582369584740657noreply@blogger.comBlogger5125tag:blogger.com,1999:blog-6827363280592532957.post-277740139868048232008-08-12T00:22:00.001+03:002009-02-22T16:35:07.602+02:00N560Звук и кнопки на КПК после дождя плохо себя ведут. Сегодня решил с этой проблемой что-то сделать.<br /><ad2></ad2><br />Открывать КПК как-то стремно стало. Боюсь, что обратно я его соберу с еще большими повреждениями. Решил забить на встроенный динамик. При желании можно и наушники для громкой связи использовать задрав громкость до предела. Не выход конечно... А вот с клавиатурой все печальнее. Сначало я думал, что на каждое нажатие кнопки приходит два скан кода один за другим. И думал, что смогу отрезать второй, который приходит слишком рано. Благо перехват скан кодов уже реализован в LooxLight'е. А тут оказалось все куда печальнее. Там не два скан кода приходит. А один "одновременный". Как бы это описать. Ну вот PC клавиатуре там настоящие скан коды. А в клавиатуре КПК, там просто значение у которого каждый бит занчит нажатую кнопку. Значение состоит из двух слов, старшее для стрелочек, а младьшее для всех остальных кнопок. И вот я по логам LooxLight'а наблюдаю следующую картину:<br />2003.01.02 17:33:38.0000: 6f7dacca: 8f7ddf4c: Char <b>00040004</b>, cur=00000004, next=00000005, 8f7ddf4c, 8f7ddc64<br />И так на каждое нажатие. На любое нажатие левое слово = правое. В результате нажимаем стрелочку влево, а получаем и влево и еще какое-то нажатие. И наоборот. Короче хрен обьяснишь. Думаю это как-то завязано на то, что такие клавиатуры обычно реализуются через "матрицу" контактов или хз как и какие-то две ветки там замыкает. А может я и не прав. Сейчас сделаю временное решение, чтобы дисплей хоть разблокировать можно было, а потом буду думать...<br /><br /><b>Временное решение</b>:<br />Сравнивать коды клавиш таким образом, что fix(нажатой кнопки) == fix (образца):<pre><br />UINT fix (UINT x) {<br /> UINT y = (x & 0xFFFF) | (x >> 16);<br /> return y | (y << 16);<br />}<br /></pre><ad2></ad2>Akshaalhttp://www.blogger.com/profile/05677582369584740657noreply@blogger.com0tag:blogger.com,1999:blog-6827363280592532957.post-65277390892137034662007-11-19T17:24:00.004+02:002009-03-01T12:30:38.365+02:00LooxLight 2007-11-19Подробнее о Looxlight (утилита для Fujitsu-Siemens Loox N560/C550) смотрите <a href="http://rus.akshaal.info/search/label/looxlight">здесь</a>.<br /><br />Обновление!<br /><br /><a href="http://downloads.akshaal.info/looxlight-1/LooxLight-2007-11-19.zip?attredirects=0">Вот cab.</a><br /><a href="http://downloads.akshaal.info/looxlight-1/LooxLight-2007-11-19.src.zip?attredirects=0">Вот исходники.</a><ad></ad><br /><br />Добавил возможность блокрировать экран и клавиатуру. Раньше у меня стояло что-то-там-guard (screen guard или типа того). Но оно было глючное: иногда при разблокриовке весило кпк, при нажатии на кнопку suspend разблокировала экран, но при нажатии любой клавиши блокировало его обратно - выглядело это страшно, при нажатии на кнопки разблокировало экран и тутже блокировало обратно. Терпел. А вот недавно перепрошил КПК на новую версию WM5 (кстати стало побыстрее все рисоваться, а в каталог /windows так вообще мгновенно заходит (раньше 10сек)). После перепрошивки обнаружил, что жить без блокировки тяжело - батарея садится быстрее, кнопки нажимаются случайно, когда в кармане КПК лежит... И позавчера вечером не выдержал и решил написать сам. Ну как сказать, получилось вобщем-то. Отличается от прочих (<a href="http://4pda.ru/forum/index.php?showtopic=20758">пукнт 1.42</a>) тем, что заточено чисто под Fujitsu-Siemens Loox N560/C550 (может конечно и на 720 заработает, дрова у них похожие), поэтому выключает и экран и клавиатуру в том числе и кнопку suspend(!!). Кстати, выключенный экран (при прослушивании музыки или аудиокниги) экономит более 50мА. С выключенным экраном заряжаться с USB должно быстрее.<br /><br /><b>Как установить:</b><br />Если КПК не Fujitsu-Siemens Loox N560/C550, то очень рекоменудю сделать backup! Если это Fujitsu-Siemens Loox N560/C550, то все равно рекомендую, хотя у меня и жены вроде ничего страшного не произошло пока. В любом случае, я ответственности никакой не несу. :) (<b>Добполнение: У меня работает уже больше чем 2 года без проблем</b>)<br /><br />Скачать cab. Закинуть на кпк. Запустить установку. Установить. Подождать минуту для верности. Перезагрузить КПК (софтресет). Запустить LooxLight Control и поставить галочку напротив "Permit blocking". Ниже, напротив "Unblock by" два выпадающих списка. В них задается какими кнопками будет происходить РАЗБЛОКИРОВКА. Когда КПК будет заблокирована, эти две кнопки надо будет последовательно нажать. У меня это 2 и 3 кнопки. А по умолчанию почему-то стоит 2 и 4, ну и фик с ним. Теперь идем в Settings/Buttons и там вешаем LooxLight Control на ту кнопку, которой КПК будет БЛОКИРОВАТЬСЯ. У меня это долгое нажатие на кнопку 2. Готово. Можно тестировать.<br /><br />При нажатии на первую из кнопок разблокировки, следующую нужно зажать в течении одной секунды. Во время ожидания клавиатура КПК будет подмигивать.<ad2></ad2><br /><br /><b>Как реализовано (в общих чертах):</b><br />С выключением экрана все просто. А вот с его блокировкой посложнее. LooxLight аттачит себя к gwes.exe. Находит в памяти keybddr.dll и правит в ней таблицу импортированных функций, а именно WaitForSingleObject. Эта функция вызывается нитями keybddr.dll для ожидания прерывания клавиатуры (0x10 и 0x2a), а также для ожидания срабатывания события suspend. Т.е. в таблице импорта keybddr.dll, LooxLight подменяет адрес WaitForSingleObject с адреса функции из библиотеки coredll.dll на собственную функцию. Получается, что в момент, когда keybddr инициирует ожидание нажатия, вызывается функция LooxLight'а, которая в свою очередь дергает оригинальную функцию. Если блокировка не включена, то результат сразу же возвращается в keybddr.dll. Иначе в результате проверяется пара адресов памяти на код нажатой клавиши. По нему решается, разблокировать ли экран или нет (грубо очень). Если нажатие нужно проигнорировать, то сообщаем OS о том, что мы обработали прерывание (InterruptDone) и вызываем оригинальный WaitForSingleObject - тоесть управление обратно в keybddr не передается, пока клавиатуру не разблокируется. Таким образом ни одной нажатие мимо нас в принципе не проходит. Ибо обработчик LooxLight находится первым в цепочке обработки прерывания клавиатуры.<br /><br />Пока заметил, что если воткнуть КПК в крэдл, когда КПК заблокирована, то экран включается. Правда при этому клавиатура попрежнему заблокирована. Я думаю activesync что-то делает такое не хорошее, например вызывает ExtEscape - функция используемая для выключения/включения питания экрана. Или еще хуже. он дергает какое-то более общее API (варианты: вывести окно на передний план, послать уведомление, включить подсветку), которое как раз и и дергает ExtEscape. Вариантов лечения я вижу два:<br />1. Простой. Эпизодически запрашивать состояния питания на экран и если блокировка включена, а экран выключен - то выключать экран. Но я так не люблю по таймеру что-то делать. Да и мерцание будет, хоть и очень редко.<br />2. Сложный. Я уже попробовал пойти по этому пути - убил 3 часа и пока решил отложить. Смысл в том, что можно вклинится в какое-нибудь API какой-нибудь dll. Например можно было бы перехватить ExtEscape, но для этого нужно пробежаться по всем dll'кам в системе и каждую из них происнструментировать так же как и keybddr. Так я еще не пробовал, но есть подозрение, что может не сработать. Ибо у нас есть gwes.exe который и рулит GDI'ем. И если кто-то вызывает API у coredll, тот направляет его еще куда.. короче я к тому, что вызов ExtEscape из coredll может быть проскипан кодом, который напрямую работает с DeviceDriver'ом - а с ним напрямую, я так подозреваю, работает gwes. Было бы просто идиально вклинится в Display Driver. Когда кто-то дергает ExtEscape, тот в свою очередь вызывает DrvEscape callback у драйвера дисплея. Как это вообще работает. Когда gwes.exe грузит драйвер дисплея, он вызывает у него метод DrvDeviceEnable (или типа того). Передавая ему в качестве параметра структуру, которую драйвер должен заполнить. В этой структуре указатели на методы связаные с работой с дисплеем, в том числе и DrvEscape. После того, как драйвер заполнил эту структуру, далее gwes уже работает только с методами прописанными в этой структуре. Было бы клево, найти в памяти адрес этой структура и прописать свой DrvEscape туда. Но полазив по header'ам от wince я пока не нашел цепочку, чтобы добраться до туда. Может имея HDC можно по нему добраться? Но HDC - это указатель на C++ структуру и я этот путь пока не осилил. Другой вариант, изучать gwes.exe и посмотреть куда он копирует адрес заполненной структуры и плясать отсюда. Но блин, gwes.exe как-то криво разобрался IDA (или криво задампился). Все локальные переменные имеют совсем не те адреса, на какие ссылается код. Еще можно было бы посмотреть coredll.dll и как там работает ExtEscape и потыкаться оттуда, но coredll.dll у меня задамлпнного нет (это вообще вроде kernel сам). А дамп всей ОЗУ неплохо так разобранный во времена когда искал как управлять диодами я где-то посеял..<br /><br />Вобщем я решил пока этот вопрос отложить. Посмотрим как оно будет анноить или нет.<br /><br />--------<br />Будущие версии программы можно будет найти <a href="http://rus.akshaal.info/search/label/looxlight">здесь</a>.<br />Другая программа для уменьшения расхода заряда батареи описана <a href="http://rus.akshaal.info/search/label/goodwavpower">здесь</a>.Akshaalhttp://www.blogger.com/profile/05677582369584740657noreply@blogger.com3tag:blogger.com,1999:blog-6827363280592532957.post-24242127970163179422007-03-04T22:38:00.004+02:002009-03-01T12:39:54.179+02:00LooxLight 2007-03-04Подробнее о Looxlight (утилита для Fujitsu-Siemens Loox N560/C550) смотрите <a href="http://rus.akshaal.info/search/label/looxlight">здесь</a>.<br /><br />Сделал новую версию LooxLight. Изменения:<br /><ll><li> Полная поддержка GPS светодиода.<br /></li><li> Поддержка bluetooth стека от Broadcom.<br /></li><li> Полная поддержка индиктора питания.<br /></li><li> Лучше реализована поддержка индикатора клавиатуры (теперь переживает изменение яркости).<br /></li><li> LooxLight теперь не EXE, а DLL. Это лучше тем, что в wince есть ограничение в 32 процесса.<br /></li><li> В два раза меньшее потребление памяти, чем раньше</li></ll><br />CAB архив в ZIP'е: <a href="http://downloads.akshaal.info/looxlight-1/LooxLight-2007-03-04.zip?attredirects=0">тут</a>.<br />Исходные коды (GPL): <a href="http://downloads.akshaal.info/looxlight-1/LooxLight-2007-03-04.tar.gz?attredirects=0">тут</a>.<br /><br />Будущие версии программы можно будет найти <a href="http://rus.akshaal.info/search/label/looxlight">здесь</a>.<br />Другая программа для уменьшения расхода заряда батареи описана <a href="http://rus.akshaal.info/search/label/goodwavpower">здесь</a>.<ad2></ad2>Akshaalhttp://www.blogger.com/profile/05677582369584740657noreply@blogger.com0tag:blogger.com,1999:blog-6827363280592532957.post-86382566777323718772007-02-04T03:12:00.002+02:002009-03-01T12:42:33.619+02:00LooxLight-2007-02-03Подробнее о Looxlight (утилита для Fujitsu-Siemens Loox N560/C550) смотрите <a href="http://rus.akshaal.info/search/label/looxlight">здесь</a>.<br /><br />Обновление. Надеюсь исправил проблему из-за которой владельцы локализованных версий WM5 не могли поставить программу. Сообщение об ошибке сделал более детальным - если проблема все-таки не исчезла можно будет хоть понять причину более точно.<br /><br /><a href="http://downloads.akshaal.info/looxlight-1/LooxLight-2007-02-03.zip?attredirects=0">Зазипованный каб файл (2007-02-03)</a>,<br /><ad></ad><br />Будущие версии программы можно будет найти <a href="http://rus.akshaal.info/search/label/looxlight">здесь</a>.<br />Другая программа для уменьшения расхода заряда батареи описана <a href="http://rus.akshaal.info/search/label/goodwavpower">здесь</a>.Akshaalhttp://www.blogger.com/profile/05677582369584740657noreply@blogger.com0tag:blogger.com,1999:blog-6827363280592532957.post-22776280666268622192007-02-01T07:46:00.002+02:002009-03-01T12:44:57.750+02:00LooxLight<p> <img ljaddtriggersobjectstatus="mouseout" src="http://toril.ru/lj/LooxLight-0.png" align="left" /><br />Я сделал это! Я написал свое второе приложение для PPC. LooxLight - это крошечное приложение, которое позволяет контролировать встроенные светодиоды на вашем FSC Pocket PC.<br /><ad></ad><br />Фичи:<br /><ll></ll></p><div style="margin-left: 30px;"><li> LooxLight позволяет управлять светодиодами: клавиатуры, wifi, bluetooth, gps, питания. Каждый светодиод может быть установлен в свое состояние. LooxLight может поддерживать любой светодиод в заданном состоянии или просто временно переключать из одного состояния в другое.<br /></li><li> Сервис LooxLight занимает всего 3.5k памяти, когда загружен (можно и не загружать). LooxLight не грузит процессор: сервис делает только то, что требуется в те моменты, когда оно требуется и не более того (реагирует на изменение состояний светодиодов). LooxLight не разряжает батарею.<br /></li><li> Работа из командной строки. Вы можете контролировать светодиоды из скриптов. Резидентная часть для этого не нужна. Например, "LooxLightCtrl +keyb sleep100 -keyb sleep100 +keyb" подмигнет вам подсветкой клавиатуры.<br /></li><li> Протестировано на Fujitsu-Siemens Loox N560 и Fujitsu-Siemens Loox C550. Но ЕМНИП должно работать и на Loox 720 / Loox 718 .<br /></li><li> Выложу исходники под GPL как только реализую все что хотел..<br /><br /><a class="snap_shots" href="http://downloads.akshaal.info/looxlight-1/LooxLight-2007-01-31.zip?attredirects=0">ZIP архив с CAB'ом (17k).<img id="snap_com_shot_link_icon" class="snap_preview_icon" style="border: 0pt none ; margin: 0pt ! important; padding: 1px 0pt 0pt; max-height: 2000px; max-width: 2000px; min-width: 0px; min-height: 0px; font-style: normal; font-weight: normal; font-family: "trebuchet ms",arial,helvetica,sans-serif; float: none; position: static; left: auto; top: auto; line-height: normal; background-image: url(http://i.ixnp.com/images/v3.67/theme/silver/palette.gif); background-color: transparent; visibility: visible; width: 14px; height: 12px; background-position: -1128px 0pt; background-repeat: no-repeat; text-decoration: none; vertical-align: top; display: inline;" src="http://i.ixnp.com/images/v3.67/t.gif" /></a><br /><br /><b>Что к чему в диалоге настройки.</b><br />KBD озанчает KEYBOARD т.е. клавиатура, BTH сокращение от BLUETOOTH, PWR это POWER т.е. питание как вы догадались уже. Каждая строка с элементами управления озаглавлена названием светодиода.<br />"On" кнопка просто включает светодиод, а "off" выключает. Blink означает мигать.<br />"KEEP ON"/"KEEP OFF" подразумевает, что LooxLight будет восстанавливать состояние светодиода после того как какая либо другая программа установит его в ненужное состояние.<br /><br />Некоторые элементы управления отключены сейчас, потому, что еще не реализованы.<br /><br /><b>Опции командной строки:</b><br />LooxLightCtrl.exe <op1> <op2> <op3> ... <opx>, где opN:<br /><ll></ll></opx></op3></op2></op1></li><li><i>stop</i> - выключает резидентную часть<br /></li><li><i>setup</i> - говорит резидентной части прочитать настройки из registry<br /></li><li><i>sleep123</i> - спать 123 миллисекунд (где 123 это любое положительное число)<br /></li><li><i>flashlight</i> - включает все светодиоды<br /></li><li><i>+wifi</i> - включает светодиод wifi<br /></li><li><i>-wifi</i> - выключает светодиод wifi<br /></li><li><i>+bluetooth</i> - включает светодиод bluetooth<br /></li><li><i>-bluetooth</i> - выключает светодиод bluetooth<br /></li><li><i>+gps</i> - включает светодиод gps<br /></li><li><i>-gps</i> - выключает светодиод gps<br /></li><li><i>+keyboard</i> - включает светодиод клавиатуры<br /></li><li><i>-keyboard</i> - выключает светодиод клавиатуры<br /></li><li><i>+power</i> - включает светодиод питания<br /></li><li><i>-power</i> - выключает светодиод питания<br /></li><li><i>=power</i> - включает светодиод питания в режим мерцания<br /><br /><b>История создания:</b><br />Однажды я нашел <a class="snap_shots" href="http://www.textzombie.com/keylightc/">KeyLightC<img id="snap_com_shot_link_icon" class="snap_preview_icon" style="border: 0pt none ; margin: 0pt ! important; padding: 1px 0pt 0pt; max-height: 2000px; max-width: 2000px; min-width: 0px; min-height: 0px; font-style: normal; font-weight: normal; font-family: "trebuchet ms",arial,helvetica,sans-serif; float: none; position: static; left: auto; top: auto; line-height: normal; background-image: url(http://i.ixnp.com/images/v3.67/theme/silver/palette.gif); background-color: transparent; visibility: visible; width: 14px; height: 12px; background-position: -1128px 0pt; background-repeat: no-repeat; text-decoration: none; vertical-align: top; display: inline;" src="http://i.ixnp.com/images/v3.67/t.gif" /></a>. Это была полезная программа, но в ней нельзя было включать-выключать отдельные светодиоды (а только все вместе и только выключать). Также там нужно было заново запускать KeyLightC как только какая-то программа поменяла состояние светодиода или просто после включения КПК. Я написал письмо Phill McManus. Я попросил его добавить опции +keyboard или -keyboard. Также я попросил его открыть исходники KeyLightC, чтобы я сам мог добавить эти фичи, если у него нет времени или желания. Но он не ответил. Тогда я начал мои собственные исследования прошивки. Прошло порядка 20 вечеров, прежде чем я нашел как управлять светодиодами правильным образом. Потом ушло порядка 10 вечеров, чтобы разобраться как писать под КПК и как пользоваться WinCE API. Потом ушло 3 дня, чтобы избавится от ужасного MS Visual Studio и мигрировать на mingw32ce под линух. И вообще, я ненавижу Win32 API за тонну подводных камней и неожиданностей.<br /><br /><b>Планы:</b><br /><ll></ll></li><li>Реализовать режим фонарик (не всегда темнота друг молодежи).<br /></li><li>Доделать контроль светодиодов питания и GPS..<br /></li><li>Реализовать контроль уровня подсветки.<br /><br /><b>О прошивке Loox N560/C550.</b><br />Я уже устал от этого поста. Опишу в другом попозже.<br /><ad></ad><br /><b>Обратная связь:</b><br />Было б прикольно увидеть комменты с пожеланиями, замечаниями и информацией у кого заработало (и на чем), а у кого нет (и на чем).</li></div><br />Новые версии программы <a href="http://rus.akshaal.info/search/label/looxlight">здесь</a>.<br />Другая программа для уменьшения расхода заряда батареи описана <a href="http://rus.akshaal.info/search/label/goodwavpower">здесь</a>.Akshaalhttp://www.blogger.com/profile/05677582369584740657noreply@blogger.com2