Показаны сообщения с ярлыком looxlight. Показать все сообщения
Показаны сообщения с ярлыком looxlight. Показать все сообщения

вторник, 12 августа 2008 г.

N560

Звук и кнопки на КПК после дождя плохо себя ведут. Сегодня решил с этой проблемой что-то сделать.

Открывать КПК как-то стремно стало. Боюсь, что обратно я его соберу с еще большими повреждениями. Решил забить на встроенный динамик. При желании можно и наушники для громкой связи использовать задрав громкость до предела. Не выход конечно... А вот с клавиатурой все печальнее. Сначало я думал, что на каждое нажатие кнопки приходит два скан кода один за другим. И думал, что смогу отрезать второй, который приходит слишком рано. Благо перехват скан кодов уже реализован в LooxLight'е. А тут оказалось все куда печальнее. Там не два скан кода приходит. А один "одновременный". Как бы это описать. Ну вот PC клавиатуре там настоящие скан коды. А в клавиатуре КПК, там просто значение у которого каждый бит занчит нажатую кнопку. Значение состоит из двух слов, старшее для стрелочек, а младьшее для всех остальных кнопок. И вот я по логам LooxLight'а наблюдаю следующую картину:
2003.01.02 17:33:38.0000: 6f7dacca: 8f7ddf4c: Char 00040004, cur=00000004, next=00000005, 8f7ddf4c, 8f7ddc64
И так на каждое нажатие. На любое нажатие левое слово = правое. В результате нажимаем стрелочку влево, а получаем и влево и еще какое-то нажатие. И наоборот. Короче хрен обьяснишь. Думаю это как-то завязано на то, что такие клавиатуры обычно реализуются через "матрицу" контактов или хз как и какие-то две ветки там замыкает. А может я и не прав. Сейчас сделаю временное решение, чтобы дисплей хоть разблокировать можно было, а потом буду думать...

Временное решение:
Сравнивать коды клавиш таким образом, что fix(нажатой кнопки) == fix (образца):

UINT fix (UINT x) {
UINT y = (x & 0xFFFF) | (x >> 16);
return y | (y << 16);
}

понедельник, 19 ноября 2007 г.

LooxLight 2007-11-19

Подробнее о Looxlight (утилита для Fujitsu-Siemens Loox N560/C550) смотрите здесь.

Обновление!

Вот cab.
Вот исходники.

Добавил возможность блокрировать экран и клавиатуру. Раньше у меня стояло что-то-там-guard (screen guard или типа того). Но оно было глючное: иногда при разблокриовке весило кпк, при нажатии на кнопку suspend разблокировала экран, но при нажатии любой клавиши блокировало его обратно - выглядело это страшно, при нажатии на кнопки разблокировало экран и тутже блокировало обратно. Терпел. А вот недавно перепрошил КПК на новую версию WM5 (кстати стало побыстрее все рисоваться, а в каталог /windows так вообще мгновенно заходит (раньше 10сек)). После перепрошивки обнаружил, что жить без блокировки тяжело - батарея садится быстрее, кнопки нажимаются случайно, когда в кармане КПК лежит... И позавчера вечером не выдержал и решил написать сам. Ну как сказать, получилось вобщем-то. Отличается от прочих (пукнт 1.42) тем, что заточено чисто под Fujitsu-Siemens Loox N560/C550 (может конечно и на 720 заработает, дрова у них похожие), поэтому выключает и экран и клавиатуру в том числе и кнопку suspend(!!). Кстати, выключенный экран (при прослушивании музыки или аудиокниги) экономит более 50мА. С выключенным экраном заряжаться с USB должно быстрее.

Как установить:
Если КПК не Fujitsu-Siemens Loox N560/C550, то очень рекоменудю сделать backup! Если это Fujitsu-Siemens Loox N560/C550, то все равно рекомендую, хотя у меня и жены вроде ничего страшного не произошло пока. В любом случае, я ответственности никакой не несу. :) (Добполнение: У меня работает уже больше чем 2 года без проблем)

Скачать cab. Закинуть на кпк. Запустить установку. Установить. Подождать минуту для верности. Перезагрузить КПК (софтресет). Запустить LooxLight Control и поставить галочку напротив "Permit blocking". Ниже, напротив "Unblock by" два выпадающих списка. В них задается какими кнопками будет происходить РАЗБЛОКИРОВКА. Когда КПК будет заблокирована, эти две кнопки надо будет последовательно нажать. У меня это 2 и 3 кнопки. А по умолчанию почему-то стоит 2 и 4, ну и фик с ним. Теперь идем в Settings/Buttons и там вешаем LooxLight Control на ту кнопку, которой КПК будет БЛОКИРОВАТЬСЯ. У меня это долгое нажатие на кнопку 2. Готово. Можно тестировать.

При нажатии на первую из кнопок разблокировки, следующую нужно зажать в течении одной секунды. Во время ожидания клавиатура КПК будет подмигивать.

Как реализовано (в общих чертах):
С выключением экрана все просто. А вот с его блокировкой посложнее. 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 находится первым в цепочке обработки прерывания клавиатуры.

Пока заметил, что если воткнуть КПК в крэдл, когда КПК заблокирована, то экран включается. Правда при этому клавиатура попрежнему заблокирована. Я думаю activesync что-то делает такое не хорошее, например вызывает ExtEscape - функция используемая для выключения/включения питания экрана. Или еще хуже. он дергает какое-то более общее API (варианты: вывести окно на передний план, послать уведомление, включить подсветку), которое как раз и и дергает ExtEscape. Вариантов лечения я вижу два:
1. Простой. Эпизодически запрашивать состояния питания на экран и если блокировка включена, а экран выключен - то выключать экран. Но я так не люблю по таймеру что-то делать. Да и мерцание будет, хоть и очень редко.
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 сам). А дамп всей ОЗУ неплохо так разобранный во времена когда искал как управлять диодами я где-то посеял..

Вобщем я решил пока этот вопрос отложить. Посмотрим как оно будет анноить или нет.

--------
Будущие версии программы можно будет найти здесь.
Другая программа для уменьшения расхода заряда батареи описана здесь.

воскресенье, 4 марта 2007 г.

LooxLight 2007-03-04

Подробнее о Looxlight (утилита для Fujitsu-Siemens Loox N560/C550) смотрите здесь.

Сделал новую версию LooxLight. Изменения:
  • Полная поддержка GPS светодиода.
  • Поддержка bluetooth стека от Broadcom.
  • Полная поддержка индиктора питания.
  • Лучше реализована поддержка индикатора клавиатуры (теперь переживает изменение яркости).
  • LooxLight теперь не EXE, а DLL. Это лучше тем, что в wince есть ограничение в 32 процесса.
  • В два раза меньшее потребление памяти, чем раньше

  • CAB архив в ZIP'е: тут.
    Исходные коды (GPL): тут.

    Будущие версии программы можно будет найти здесь.
    Другая программа для уменьшения расхода заряда батареи описана здесь.

    воскресенье, 4 февраля 2007 г.

    LooxLight-2007-02-03

    Подробнее о Looxlight (утилита для Fujitsu-Siemens Loox N560/C550) смотрите здесь.

    Обновление. Надеюсь исправил проблему из-за которой владельцы локализованных версий WM5 не могли поставить программу. Сообщение об ошибке сделал более детальным - если проблема все-таки не исчезла можно будет хоть понять причину более точно.

    Зазипованный каб файл (2007-02-03),

    Будущие версии программы можно будет найти здесь.
    Другая программа для уменьшения расхода заряда батареи описана здесь.

    четверг, 1 февраля 2007 г.

    LooxLight


    Я сделал это! Я написал свое второе приложение для PPC. LooxLight - это крошечное приложение, которое позволяет контролировать встроенные светодиоды на вашем FSC Pocket PC.

    Фичи:

  • LooxLight позволяет управлять светодиодами: клавиатуры, wifi, bluetooth, gps, питания. Каждый светодиод может быть установлен в свое состояние. LooxLight может поддерживать любой светодиод в заданном состоянии или просто временно переключать из одного состояния в другое.
  • Сервис LooxLight занимает всего 3.5k памяти, когда загружен (можно и не загружать). LooxLight не грузит процессор: сервис делает только то, что требуется в те моменты, когда оно требуется и не более того (реагирует на изменение состояний светодиодов). LooxLight не разряжает батарею.
  • Работа из командной строки. Вы можете контролировать светодиоды из скриптов. Резидентная часть для этого не нужна. Например, "LooxLightCtrl +keyb sleep100 -keyb sleep100 +keyb" подмигнет вам подсветкой клавиатуры.
  • Протестировано на Fujitsu-Siemens Loox N560 и Fujitsu-Siemens Loox C550. Но ЕМНИП должно работать и на Loox 720 / Loox 718 .
  • Выложу исходники под GPL как только реализую все что хотел..

    ZIP архив с CAB'ом (17k).

    Что к чему в диалоге настройки.
    KBD озанчает KEYBOARD т.е. клавиатура, BTH сокращение от BLUETOOTH, PWR это POWER т.е. питание как вы догадались уже. Каждая строка с элементами управления озаглавлена названием светодиода.
    "On" кнопка просто включает светодиод, а "off" выключает. Blink означает мигать.
    "KEEP ON"/"KEEP OFF" подразумевает, что LooxLight будет восстанавливать состояние светодиода после того как какая либо другая программа установит его в ненужное состояние.

    Некоторые элементы управления отключены сейчас, потому, что еще не реализованы.

    Опции командной строки:
    LooxLightCtrl.exe ... , где opN:
  • stop - выключает резидентную часть
  • setup - говорит резидентной части прочитать настройки из registry
  • sleep123 - спать 123 миллисекунд (где 123 это любое положительное число)
  • flashlight - включает все светодиоды
  • +wifi - включает светодиод wifi
  • -wifi - выключает светодиод wifi
  • +bluetooth - включает светодиод bluetooth
  • -bluetooth - выключает светодиод bluetooth
  • +gps - включает светодиод gps
  • -gps - выключает светодиод gps
  • +keyboard - включает светодиод клавиатуры
  • -keyboard - выключает светодиод клавиатуры
  • +power - включает светодиод питания
  • -power - выключает светодиод питания
  • =power - включает светодиод питания в режим мерцания

    История создания:
    Однажды я нашел KeyLightC. Это была полезная программа, но в ней нельзя было включать-выключать отдельные светодиоды (а только все вместе и только выключать). Также там нужно было заново запускать KeyLightC как только какая-то программа поменяла состояние светодиода или просто после включения КПК. Я написал письмо Phill McManus. Я попросил его добавить опции +keyboard или -keyboard. Также я попросил его открыть исходники KeyLightC, чтобы я сам мог добавить эти фичи, если у него нет времени или желания. Но он не ответил. Тогда я начал мои собственные исследования прошивки. Прошло порядка 20 вечеров, прежде чем я нашел как управлять светодиодами правильным образом. Потом ушло порядка 10 вечеров, чтобы разобраться как писать под КПК и как пользоваться WinCE API. Потом ушло 3 дня, чтобы избавится от ужасного MS Visual Studio и мигрировать на mingw32ce под линух. И вообще, я ненавижу Win32 API за тонну подводных камней и неожиданностей.

    Планы:
  • Реализовать режим фонарик (не всегда темнота друг молодежи).
  • Доделать контроль светодиодов питания и GPS..
  • Реализовать контроль уровня подсветки.

    О прошивке Loox N560/C550.
    Я уже устал от этого поста. Опишу в другом попозже.

    Обратная связь:
    Было б прикольно увидеть комменты с пожеланиями, замечаниями и информацией у кого заработало (и на чем), а у кого нет (и на чем).

  • Новые версии программы здесь.
    Другая программа для уменьшения расхода заряда батареи описана здесь.