Страница 1 из 11

Garmin USB напрямую

СообщениеДобавлено: 07 окт 2011, 15:42
vasketsov
Регулярно подрубаю навигатор к сасу. Задолбалось юзать всякие костыли и прокладки.
Предлагаю сделать прямую поддержку. Бесплатно. Быстро.
Кодил сам лично своими руками, на основе Garmin SDK и мануалов к 18-му ресиверу.
Правда пришлось и с отладчиком посидеть и поглядеть, чего всякие ozi делают.
В общем вот тестовая софтина в аттаче.
Желающие потестить - запускайте её при подключенном навигаторе Garmin через USB.
Она выдаст на экран некоторую инфу по девайсу + данные по координатам и спутникам, которые в "боевой" ситуации будут юзаться уже по-боевому.
Так что на размер внимания не обращайте, там много лишнего пока что.
Выданную инфу кидайте сюда (что лучше) или мне в личку или почту (что хуже), лучше не принтскринами, а в текстовом виде (здесь - в тэг SPOILER).
Главное что надо - это модель девайса, версия прошивки и список поддерживаемых протоколов.
Остальное - если там не будет ошибок и неизвестных данных - можно в принципе и не кидать. См. ниже мою версию данных.
Если будут ошибки или вообще не заработает - тем более отпишитесь.

PS. От греха подальше в строке с координатами замените координаты на любые другие понравившиеся, достаточно просто изменить целое число градусов.
Других данных о местоположении, которые бы позволяли его идентифицировать, программа не выводит.
Если будете запускать из консоли в виде "vsagarminusb.exe > a.txt" - там в конце "Press ENTER to close" - не забываем жать Enter.

Список протестированных приборов:
Gpsmap 76csx - благодарности уходят vasketsov.
Oregon 550 - благодарости уходят garl.

Re: Garmin USB напрямую

СообщениеДобавлено: 07 окт 2011, 15:45
vasketsov
CREATED
CONNECTED
SESSION STARTED
DEV_INFO: Product_ID=292, Software_version=400
GPSMap76CSX Software Version 4.00
VERBMAP Rec Routable Hwy Basemap, ATL v2 2.00
VERSMAP XXXXXXXX 0.00
VERGPROM International Marine POI 1.00
SIRFGPS GSC3f Software Version 3.00

PROTOCOLS:
скрытый текст: показать
A010
A100
A1010
A1011
A201
A301
A400
A500
A600
A601
A700
A800
A801
A900
A902
A903
A904
A905
A907
A908
A914
A916
A917
A918
D110
D202
D210
D302
D312
D501
D600
D601
D700
D800
D801
D900
D907
D908
D909
D910
D911
D917
D918
L001
P000
T001

Unit_ID=XXXXXXXX
API_Version=1
USB_Packet_Size=64
COORD: signal
svid=25, snr=2440, elev=27, azmth=166, status=5
svid=13, snr=2540, elev=6, azmth=346, status=21
svid=31, snr=2830, elev=19, azmth=248, status=21
svid=21, snr=3340, elev=43, azmth=220, status=21
svid=29, snr=2770, elev=75, azmth=106, status=21
svid=10, snr=3200, elev=3, azmth=23, status=17
svid=2, snr=2570, elev=10, azmth=58, status=5
svid=30, snr=2630, elev=54, azmth=211, status=21
svid=6, snr=2380, elev=2, azmth=283, status=1
svid=5, snr=2970, elev=38, azmth=68, status=21
svid=12, snr=65436, elev=1, azmth=152, status=0
svid=16, snr=65436, elev=13, azmth=317, status=0
(D800_Pvt Data_Size = 64)
(fix=3, h_err=10.3, v_err=4.5, alt=198)
(lon=XX.6359053, lat=XX.8525966, heading=-137)
(full_speed=0.2 km/h, v_speed=0 m/s)
COORD: Abort_Transfer
COORD: signal
svid=25, snr=2420, elev=27, azmth=166, status=5
svid=13, snr=2540, elev=6, azmth=346, status=21
svid=31, snr=2820, elev=19, azmth=248, status=21
svid=21, snr=3340, elev=43, azmth=220, status=21
svid=29, snr=2790, elev=75, azmth=106, status=21
svid=10, snr=3200, elev=3, azmth=23, status=17
svid=2, snr=2560, elev=10, azmth=58, status=5
svid=30, snr=2640, elev=54, azmth=211, status=21
svid=6, snr=2370, elev=2, azmth=283, status=1
svid=5, snr=2970, elev=38, azmth=68, status=21
svid=12, snr=65436, elev=1, azmth=152, status=0
svid=16, snr=65436, elev=13, azmth=317, status=0
(D800_Pvt Data_Size = 64)
(fix=3, h_err=10.3, v_err=4.5, alt=197.1)
(lon=XX.635911, lat=XX.8525943, heading=-29)
(full_speed=0.5 km/h, v_speed=-0.1 m/s)
svid=25, snr=2440, elev=27, azmth=166, status=5
svid=13, snr=2540, elev=6, azmth=346, status=21
svid=31, snr=2830, elev=19, azmth=248, status=21
svid=21, snr=3340, elev=43, azmth=220, status=21
svid=29, snr=2770, elev=75, azmth=106, status=21
svid=10, snr=3200, elev=3, azmth=23, status=17
svid=2, snr=2570, elev=10, azmth=58, status=5
svid=30, snr=2630, elev=54, azmth=211, status=21
svid=6, snr=2380, elev=2, azmth=283, status=1
svid=5, snr=2970, elev=38, azmth=68, status=21
svid=12, snr=65436, elev=1, azmth=152, status=0
svid=16, snr=65436, elev=13, azmth=317, status=0
COORD: signal
svid=25, snr=2400, elev=27, azmth=166, status=5
svid=13, snr=2540, elev=6, azmth=346, status=21
svid=31, snr=2810, elev=19, azmth=248, status=21
svid=21, snr=3340, elev=43, azmth=220, status=21
svid=29, snr=2800, elev=75, azmth=106, status=21
svid=10, snr=3190, elev=3, azmth=23, status=17
svid=2, snr=2570, elev=10, azmth=58, status=5
svid=30, snr=2660, elev=54, azmth=211, status=21
svid=6, snr=2370, elev=2, azmth=283, status=1
svid=5, snr=2980, elev=38, azmth=68, status=21
svid=12, snr=65436, elev=1, azmth=152, status=0
svid=16, snr=65436, elev=13, azmth=317, status=0
(D800_Pvt Data_Size = 64)
(fix=3, h_err=10.4, v_err=4.5, alt=196.4)
(lon=XX.6359153, lat=XX.8525937, heading=107)
(full_speed=0.4 km/h, v_speed=-0.1 m/s)
svid=25, snr=2440, elev=27, azmth=166, status=5
svid=13, snr=2540, elev=6, azmth=346, status=21
svid=31, snr=2830, elev=19, azmth=248, status=21
svid=21, snr=3340, elev=43, azmth=220, status=21
svid=29, snr=2770, elev=75, azmth=106, status=21
svid=10, snr=3200, elev=3, azmth=23, status=17
svid=2, snr=2570, elev=10, azmth=58, status=5
svid=30, snr=2630, elev=54, azmth=211, status=21
svid=6, snr=2380, elev=2, azmth=283, status=1
svid=5, snr=2970, elev=38, azmth=68, status=21
svid=12, snr=65436, elev=1, azmth=152, status=0
svid=16, snr=65436, elev=13, azmth=317, status=0
COORD: signal
svid=25, snr=2390, elev=27, azmth=166, status=5
svid=13, snr=2550, elev=6, azmth=346, status=21
svid=31, snr=2800, elev=19, azmth=248, status=21
svid=21, snr=3350, elev=43, azmth=220, status=21
svid=29, snr=2800, elev=75, azmth=106, status=21
svid=10, snr=3190, elev=3, azmth=23, status=17
svid=2, snr=2590, elev=10, azmth=58, status=5
svid=30, snr=2670, elev=54, azmth=211, status=21
svid=6, snr=2370, elev=2, azmth=283, status=1
svid=5, snr=2970, elev=38, azmth=68, status=21
svid=12, snr=65436, elev=1, azmth=152, status=0
svid=16, snr=65436, elev=13, azmth=317, status=0
(D800_Pvt Data_Size = 64)
(fix=3, h_err=10.5, v_err=4.5, alt=195.8)
(lon=XX.6359176, lat=XX.8525938, heading=93)
(full_speed=0.4 km/h, v_speed=-0.1 m/s)
svid=25, snr=2440, elev=27, azmth=166, status=5
svid=13, snr=2540, elev=6, azmth=346, status=21
svid=31, snr=2830, elev=19, azmth=248, status=21
svid=21, snr=3340, elev=43, azmth=220, status=21
svid=29, snr=2770, elev=75, azmth=106, status=21
svid=10, snr=3200, elev=3, azmth=23, status=17
svid=2, snr=2570, elev=10, azmth=58, status=5
svid=30, snr=2630, elev=54, azmth=211, status=21
svid=6, snr=2380, elev=2, azmth=283, status=1
svid=5, snr=2970, elev=38, azmth=68, status=21
svid=12, snr=65436, elev=1, azmth=152, status=0
svid=16, snr=65436, elev=13, azmth=317, status=0
COORD: signal
svid=25, snr=2370, elev=26, azmth=166, status=5
svid=13, snr=2540, elev=5, azmth=346, status=21
svid=31, snr=2790, elev=19, azmth=248, status=21
svid=21, snr=3350, elev=43, azmth=220, status=21
svid=29, snr=2800, elev=75, azmth=106, status=21
svid=10, snr=3190, elev=3, azmth=23, status=17
svid=2, snr=2580, elev=10, azmth=58, status=21
svid=30, snr=2680, elev=54, azmth=211, status=21
svid=6, snr=2370, elev=2, azmth=283, status=1
svid=5, snr=2990, elev=38, azmth=68, status=21
svid=12, snr=65436, elev=1, azmth=152, status=0
svid=16, snr=65436, elev=13, azmth=317, status=0
(D800_Pvt Data_Size = 64)
(fix=3, h_err=10.6, v_err=4.5, alt=195.3)
(lon=XX.6359194, lat=XX.8525945, heading=112)
(full_speed=0.5 km/h, v_speed=-0.1 m/s)
svid=25, snr=2440, elev=27, azmth=166, status=5
svid=13, snr=2540, elev=6, azmth=346, status=21
svid=31, snr=2830, elev=19, azmth=248, status=21
svid=21, snr=3340, elev=43, azmth=220, status=21
svid=29, snr=2770, elev=75, azmth=106, status=21
svid=10, snr=3200, elev=3, azmth=23, status=17
svid=2, snr=2570, elev=10, azmth=58, status=5
svid=30, snr=2630, elev=54, azmth=211, status=21
svid=6, snr=2380, elev=2, azmth=283, status=1
svid=5, snr=2970, elev=38, azmth=68, status=21
svid=12, snr=65436, elev=1, azmth=152, status=0
svid=16, snr=65436, elev=13, azmth=317, status=0

DISCONNECTED

Re: Garmin USB напрямую

СообщениеДобавлено: 07 окт 2011, 21:47
zed
Это касается только гарминов или протокол стандартный?

Re: Garmin USB напрямую

СообщениеДобавлено: 07 окт 2011, 22:07
garl
в понедельник попробую на Oregon 550. патченом.

Re: Garmin USB напрямую

СообщениеДобавлено: 08 окт 2011, 00:35
vasketsov
zed писал(а):Это касается только гарминов или протокол стандартный?

Только гарминов.
Протокол стандартный гарминовский. Краеугольный анус гармина в том, что по разным оценкам от "многие" до "подавляющее большинство" их не умеет по USB кидаться данными NMEA.

Garmin Device Interface Specification
May 19, 2006
Это я к тому, что протокол старый и не менялся, только новые вызовы добавляются.

По идее должно работать на всех, с некоторыми оговорками.
Оговорки вида "на некоторых планшетных авиационных навигаторах работает не протокол А, а протокол Б, там такие-то ограничения, нет таких-то полей,...".
Но в принципе должно работать. На обычных пользовательских уж точно. Если нет - список поддерживаемых протоколов поможет понять, почему не работает и как сделать чтоб работало.

Re: Garmin USB напрямую

СообщениеДобавлено: 10 окт 2011, 08:37
garl
Garmin OREGON 550 Patched Version 4.50
Версия ПО GPS 5.00
патчился для поддержки jnx
Код: Выделить всё
C:\>vsagarminusb.exe
CREATED
EGarminUSB_Fatal_Exception: SetupDiEnumDeviceInterfaces (error_code=259)
Press ENTER to close

неясно одно: при подключении он детектится как 2 съёмных диска.

Re: Garmin USB напрямую

СообщениеДобавлено: 10 окт 2011, 11:58
vasketsov
garl писал(а):SetupDiEnumDeviceInterfaces (error_code=259)

Это значит, что программа просто вообще не видит гармин.
По идее подключенных к компу приёмников может быть несколько - у них будут разные "имена".
Так вот на определении этого списка "имён" прога и обламывается.
В общем-то рецепт один - поиграться с настройками, чтобы приёмник подключался НЕ как внешний диск (есть правда ещё вариант, но это скорее шаманство, чтобы девайс думал, что подключен к зарядке, а не к компу, вроде в инете что-то было на эту тему). Когда подключено как внешний диск - работать не будет точно, там же в частности прямой доступ к треку открывается (хотя возможно там как раз можно мониторить лог именно таким образм, в общем почитаю про OREGON 550 что найду).

Например, на GPSMAP 76CSX в настройках интерфейса есть выбор:
Garmin
NMEA In/NMEA Out
Text Out
Выкл.

Ну и собственно Mass Storage.
На первых двух у меня прога работает, на вторых двух даже не пробовал и не собираюсь.

Re: Garmin USB напрямую

СообщениеДобавлено: 10 окт 2011, 12:18
garl
vasketsov писал(а):Например, на GPSMAP 76CSX в настройках интерфейса есть выбор:
Garmin
NMEA In/NMEA Out
Text Out
Выкл.

Ну и собственно Mass Storage.
На первых двух у меня прога работает, на вторых двух даже не пробовал и не собираюсь.

ну опция такая есть, но от неё ничего не зависит. всёравно подключается как влэш диски (сам прибор + карточка)
может есть какая команда перключения из режима флэшки в режим приёмника?

Re: Garmin USB напрямую

СообщениеДобавлено: 10 окт 2011, 12:28
vasketsov
А например Google Earth может к нему подключиться? Как PVT или как NMEA?
Или GPSMapEdit?
Не зря ж у девайса в характеристиках написано
Подключение USB
Поддержка стандарта NMEA 0183 есть


Вообще согласно оригинальному мануалу, в режиме Garmin Spanner создаётся виртуальный ком-порт и через него льётся NMEA (то есть по идее и сейчас должно работать в сасе), а в режиме Garmin Serial должно валиться через USB в формате PVT.

Re: Garmin USB напрямую

СообщениеДобавлено: 10 окт 2011, 12:44
garl
ура заработало

скрытый текст: показать
C:\>vsagarminusb.exe
CREATED
CONNECTED
SESSION STARTED
DEV_INFO: Product_ID=896, Software_version=450
Oregon 550 Patched Version 4.50
VERBMAP Worldwide Autoroute DEM Basemap, NR 4.00
VERSMAP Дороги России. РФ. Топо. Версия 6.07. 0.00
VERTZMAP Time Zone Map 7.00

PROTOCOLS:

Unit_ID=<Мой_Код_прибора>
API_Version=1
USB_Packet_Size=512
COORD: signal
ANOTHER SIZED: (Packet_Type=20, Packet_ID=248, Data_Size=109)
ANOTHER SIZED: (Packet_Type=20, Packet_ID=253, Data_Size=108)
COORD: Abort_Transfer
COORD: signal
svid=2, snr=65436, elev=62, azmth=113, status=20
svid=4, snr=65436, elev=29, azmth=50, status=20
svid=5, snr=65436, elev=4, azmth=134, status=20
svid=9, snr=65436, elev=29, azmth=184, status=20
svid=10, snr=65436, elev=13, azmth=83, status=20
svid=12, snr=65436, elev=82, azmth=48, status=20
svid=14, snr=65436, elev=11, azmth=278, status=20
svid=25, snr=65436, elev=55, azmth=307, status=20
svid=27, snr=65436, elev=19, azmth=177, status=20
svid=29, snr=65436, elev=30, azmth=253, status=20
svid=30, snr=65436, elev=10, azmth=303, status=20
svid=31, snr=65436, elev=9, azmth=326, status=20
(D800_Pvt Data_Size = 64)
EInvalidOp: Invalid floating point operation
Press ENTER to close