Показать сообщение отдельно
Старый 26.02.2015, 17:08   #656
SanchSanch
Новый Пользователь
 
Регистрация: 15.05.2014
Город: Москва
Регион: 77, 97, 99, 177
Машина: Opel Astra H
Сообщений: 12
SanchSanch is a glorious beacon of lightSanchSanch is a glorious beacon of lightSanchSanch is a glorious beacon of lightSanchSanch is a glorious beacon of lightSanchSanch is a glorious beacon of lightSanchSanch is a glorious beacon of light
По умолчанию

Итак, представляю свое обещанное временное решение проблемы моргания спутников.
Вдохновила меня на это программа pl2303drv автора с 4pda и доработанная уже на данном форуме. Оттуда взял саму идею и пример реализации виртуального "устройства" tty.

Моя программа читает NMEA поток от приемника, парсит его и формирует новый "исправленный" (хотя на самом деле наоборот) поток - такой, чтобы либа его правильно переваривала и предоставляла андроиду на выходе по возможности правильные данные. Программа создает виртуальное "устройство" tty и выдает туда сгенерированный поток. Для либы в качестве GPS-приемника нужно указывать уже данное созданное устройство. Название (путь) к входному (настоящему) и выходному (которое она создаст) устройствам программа принимает в качестве аргументов командной строки.

Программу условно назовем nmeafix (хотя на самом деле она не fix-ит, а "ломает" NMEA-поток )

Соответственно нужно модифицировать скрипт автозапуска GPS, добавив после загрузки модуля ядра виртуального порта (или запуска pl2303drv) и после настройки прав доступа ис корости, но ПЕРЕД командой "setprop ro.kernel.android.gps ttyUSB0" запуск nmeafix, а уже после него сделать setprop ro.kernel.android.gps с другим новым именем устройства (которое задается программе в качестве второго аргумента). На первом этапе целесообразно просто убрать из скрипта setprop, а заупск nmeafix и последующий setprop делать в консоли вручную (в разных окнах). nmeafix можно при необходимости остановить нажатием Ctrl-C. В случае запуска из скрипта нужно в конце команды добавить символ &, чтобы скрипт выполнялся дальше.

При запуске без параметров nmeafix выдает краткую справку по использовниаю, при запуске с неверными параметрами - сообщение об ошибке и ту же справку.
Запускать так:
Код:
nmeafix /dev/ttyUSB0 /dev/ttyNMEA [опции]
где
    /dev/ttyUSB0 - физическое устройство
    /dev/ttyNMEA (виртуальное "устройство", создается программой)
Допустимые опции такие:
    --gps-only                          обрабатывать только GSV и GSA сообщения со спутниками GPS (нельзя испольсовать совместно с --glonass-only)
    --glonass-only                      обрабатывать только GSV и GSA сообщения со спутниками GLONASS (нельзя испольсовать совместно с --gps-only)
    --nonzero-snr-only                  убрать спутники с нулевым сигналом (SNR) из сообщений GSV
    --filter TXT1 [TXT2] ... [TXT10]    убрать из NMEA-потока сообщения, в которых встречаются вхождения любого текста из TXT1 ... TXT10 (фильтр)
Наиболее корректный результат достигается с опциями --gps-only или --glonass-only. В этом случае в навигационых программах показывается правильный набор видимых спутников GPS или GLONASS (но только либо то, либо то) и правильно отмечаются спользованные для рассчета позиции спутники (это не обязательно все видимые, лишь некоторая их часть).
Без указания данных опций в наивгационных программах будут корректно отображаться видимые спутники GPS+GLONASS, но с отображением активных (использованных для рассчета позиции) спутников будут глюки - могут ложно отмечаться как активные спутники (как GPS, так и GLONASS), которые на самом деле не использованы для расчета. И наоборот - использованные для расчета спутники (особенно Глонасс) могут не отмечаться как активные, из-за ограничения в либе (или используемом либой API андроида) на 12 активных спутников (на самом деле навигационные проги могут показывать и несколько большее число активных спутников из-за вышеописанного глюка с ложной отметкой активных спутников).
Причина ложной отметки в том, что для передачи инфы об активных спутниках андроиду используется битовая маска в 32 бита (unsigned int), где каждый бит соответствует спутнику (от 1 до 32). Спутники GPS имеют нумерацию от 1 до 32, Глонасс - от 65 до 96. Спутники Гонасс могут быть помечены активными, только если сместить их нумерацию на 64. Но в таком случает пометится и спутник GPS с таким номером, если он есть в списке видимых. И наоборот.
Короче, если в списке видимых спутников, который шлет приемник, пристутсвуют 2 спутника - GPS (с номером N) и Глонасс (с номером N+64), и один из них помечается приемником, как активный, в навигационных прогах оба эти спутника отобразятся как активные.
И ничего с этим сделать нельзя, не пересобирая либу (и то я не знаю, что там править надо).

Опция --nonzero-snr-only влияет на отображение видимых спутников с нулевым сигналом (столбики с нулевой высотой). Мне показалось, что это слишком громоздко, и я добавил такой фильтр. Неоктрые навигационные проги и так не отображают такие спутники. Использовать или нет - дело вкуса. Может использоваться совместо с опциями --gps-only или --glonass-only.

Опция --filter нужна для исключения из NMEA-потока от приемника некоторых сообщений, в которых содержатся вхождения последовательностей символов из спика (от 1 до 10), указанного после --filter. Такие сообщения не обрабатываются и не передаются дальше в созданое виртуальное "устройство".
Опция --filter может быть указана только последней в списке опций, после нее может быть только список последовательностей символов для фильтрации (от 1 до 10).
Добавил эту опцию для исключения сообщений GLL и RMC. С ними у меня либа глючила - в нави-прогах "моргало" отображение высоты и курса (азимута) - показывались то правильные цифры, то 0.
Поскольку данная информация содержится не только в этих сообщениях - их отключение достаточно безвредно и помогает вылечить глюк либы. Единственное что - теряем инофрмацию о текущем времени, поэтому надо спец-коммандой включить в чипе вывод сообщений ZDA (в моем приемнике на базе MTK3333 вывод этого сообщения изначально отключен). Сообщения GLL и RMC тоже можно отключить этой спец-коммандой, я так и сделал, дополнительно для надежности использую опцию --filter в nmeafix.
Возможно глюк либы c GLL и RMC будет не у всех, а зависит от приемника и чипа, на базе которого он сделан.

Для удобства nmeafix поддерживает также передачу конфигурацонных спец-комманд в GPS-чип, т.е. все символы, отправленные в /dev/ttyNMEA передаются в физическое устройство (например, /dev/ttyUSB0).

Прикладываю скомпилированный бинарник вместе с исходниками.
Возможно, бинарник у всех не заработает, я не гуру компиляции.
Сорри за может быть неидельный стиль кодинга и отстутсвие комментов.
Вложения
Тип файла: zip nmeafix.zip (11.6 Кб, 514 просмотров)
SanchSanch вне форума   Ответить с цитированием