亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關于我們
? 蟲蟲下載站

?? garmin.c

?? gpsd, a popular GPS daemon.
?? C
?? 第 1 頁 / 共 3 頁
字號:
/* $Id: garmin.c 4661 2008-01-19 22:54:23Z garyemiller $ *//* * Handle the Garmin binary packet format supported by the USB Garmins * tested with the Garmin 18 and other models.  This driver is NOT for * serial port connected Garmins, they provide adequate NMEA support. * * This code is partly from the Garmin IOSDK and partly from the * sample code in the Linux garmin_gps driver. * * This code supports both Garmin on a serial port and USB Garmins. * * USB Garmins need the Linux garmin_gps driver and will not function * without it.  This code has been tested and at least at one time is * known to work on big- and little-endian CPUs and 32 and 64 bit cpu * modes. * * Protocol info from: *	 425_TechnicalSpecification.pdf *	 ( formerly GPS18_TechnicalSpecification.pdf ) *	 iop_spec.pdf * http://www.garmin.com/support/commProtocol.html * * bad code by: Gary E. Miller <gem@rellim.com> * all rights abandoned, a thank would be nice if you use this code. * * -D 3 = packet trace * -D 4 = packet details * -D 5 = more packet details * -D 6 = very excessive details * * limitations: * * do not have from garmin: *      pdop *      hdop *      vdop *	magnetic variation * * known bugs: *      hangs in the fread loop instead of keeping state and returning. *      may or may not work on a little-endian machine */#define __USE_POSIX199309 1#include <sys/types.h>#include <time.h> // for nanosleep()#include <stdio.h>#include <stdlib.h>#include <math.h>#include <string.h>#include <unistd.h>#include <errno.h>#include <inttypes.h>#include "gpsd_config.h"#if defined (HAVE_SYS_SELECT_H)#include <sys/select.h>#endif#if defined(HAVE_STRINGS_H)#include <strings.h>#endif#include "gpsd.h"#include "gps.h"#ifdef GARMIN_ENABLE#define USE_RMD 0#define ETX 0x03#define ACK 0x06#define DLE 0x10#define NAK 0x15#define GARMIN_LAYERID_TRANSPORT (uint8_t)  0#define GARMIN_LAYERID_APPL      (uint32_t) 20// Linux Garmin USB driver layer-id to use for some control mechanisms#define GARMIN_LAYERID_PRIVATE  0x01106E4B// packet ids used in private layer#define PRIV_PKTID_SET_DEBUG    1#define PRIV_PKTID_SET_MODE     2#define PRIV_PKTID_INFO_REQ     3#define PRIV_PKTID_INFO_RESP    4#define PRIV_PKTID_RESET_REQ    5#define PRIV_PKTID_SET_DEF_MODE 6#define MODE_NATIVE          0#define MODE_GARMIN_SERIAL   1#define GARMIN_PKTID_TRANSPORT_START_SESSION_REQ 5#define GARMIN_PKTID_TRANSPORT_START_SESSION_RESP 6#define GARMIN_PKTID_PROTOCOL_ARRAY     253#define GARMIN_PKTID_PRODUCT_RQST       254#define GARMIN_PKTID_PRODUCT_DATA       255/* 0x29 ')' */#define GARMIN_PKTID_RMD41_DATA         41/* 0x33 '3' */#define GARMIN_PKTID_PVT_DATA           51/* 0x33 '4' */#define GARMIN_PKTID_RMD_DATA           52/* 0x72 'r' */#define GARMIN_PKTID_SAT_DATA           114#define GARMIN_PKTID_L001_XFER_CMPLT     12#define GARMIN_PKTID_L001_COMMAND_DATA   10#define GARMIN_PKTID_L001_DATE_TIME_DATA 14#define GARMIN_PKTID_L001_RECORDS        27#define GARMIN_PKTID_L001_WPT_DATA       35#define	CMND_ABORT			 0#define	CMND_START_PVT_DATA		 49#define	CMND_STOP_PVT_DATA		 50#define	CMND_START_RM_DATA		 110#define MAX_BUFFER_SIZE 4096#define GARMIN_CHANNELS	12// something magic about 64, garmin driver will not return more than// 64 at a time.  If you read less than 64 bytes the next read will// just get the last of the 64 byte buffer.#define ASYNC_DATA_SIZE 64#pragma pack(1)// This is the data format of the satellite data from the garmin USBtypedef struct {	uint8_t  svid;	int16_t snr; // 0 - 0xffff	uint8_t  elev;	uint16_t azmth;	uint8_t  status; // bit 0, has ephemeris, 1, has diff correction                               // bit 2 used in solution			       // bit 3??} cpo_sat_data;/* Garmin D800_Pvt_Datetype_Type *//* packet type:  GARMIN_PKTID_PVT_DATA   52 *//* This is the data format of the position data from the garmin USB */typedef struct {	float alt;  /* altitude above WGS 84 (meters) */	float epe;  /* estimated position error, 2 sigma (meters)  */	float eph;  /* epe, but horizontal only (meters) */	float epv;  /* epe but vertical only (meters ) */	int16_t	fix; /* 0 - failed integrity check                      * 1 - invalid or unavailable fix                      * 2 - 2D                      * 3 - 3D		      * 4 - 2D Diff                      * 5 - 3D Diff                      */	double	gps_tow; /* gps time  os week (seconds) */	double	lat;     /* ->latitude (radians) */	double	lon;     /* ->longitude (radians) */	float	lon_vel; /* velocity east (meters/second) */	float	lat_vel; /* velocity north (meters/second) */	float	alt_vel; /* velocity up (meters/sec) */        // Garmin GPS25 uses pkt_id 0x28 and does not output the         // next 3 items	float	msl_hght; /* height of WGS 84 above MSL (meters) */	int16_t	leap_sec; /* diff between GPS and UTC (seconds) */	int32_t	grmn_days;} cpo_pvt_data;typedef struct {	uint32_t cycles;	double	 pr;	uint16_t phase;	int8_t slp_dtct;	uint8_t snr_dbhz;	uint8_t  svid;	int8_t valid;} cpo_rcv_sv_data;/* packet type:  GARMIN_PKTID_RMD_DATA   53 *//* seems identical to the packet id 0x29 from the Garmin GPS 25 */typedef struct {	double rcvr_tow;	int16_t	rcvr_wn;	cpo_rcv_sv_data sv[GARMIN_CHANNELS];} cpo_rcv_data;// This is the packet format to/from the Garmin USBtypedef struct {    uint8_t  mPacketType;    uint8_t  mReserved1;    uint16_t mReserved2;    uint16_t mPacketId;    uint16_t mReserved3;    uint32_t  mDataSize;    union {	    int8_t chars[MAX_BUFFER_SIZE];	    uint8_t uchars[MAX_BUFFER_SIZE];            cpo_pvt_data pvt;            cpo_sat_data sats;    } mData;} Packet_t;// useful funcs to read/write ints//  floats and doubles are Intel order only...static inline void set_int16(uint8_t *buf, uint32_t value){        buf[0] = (uint8_t)(0x0FF & value);        buf[1] = (uint8_t)(0x0FF & (value >> 8));}static inline void set_int32(uint8_t *buf, uint32_t value){        buf[0] = (uint8_t)(0x0FF & value);        buf[1] = (uint8_t)(0x0FF & (value >> 8));        buf[2] = (uint8_t)(0x0FF & (value >> 16));        buf[3] = (uint8_t)(0x0FF & (value >> 24));}static inline uint16_t get_uint16(const uint8_t *buf){        return  (uint16_t)(0xFF & buf[0]) 		| ((uint16_t)(0xFF & buf[1]) << 8);}static inline uint32_t get_int32(const uint8_t *buf){        return  (uint32_t)(0xFF & buf[0]) 		| ((uint32_t)(0xFF & buf[1]) << 8) 		| ((uint32_t)(0xFF & buf[2]) << 16) 		| ((uint32_t)(0xFF & buf[3]) << 24);}// convert radians to degreesstatic inline double  radtodeg( double rad) {	return (double)(rad * RAD_2_DEG );}static gps_mask_t PrintSERPacket(struct gps_device_t *session, unsigned char pkt_id, int pkt_len, unsigned char *buf );static gps_mask_t PrintUSBPacket(struct gps_device_t *session, Packet_t *pkt );gps_mask_t PrintSERPacket(struct gps_device_t *session, unsigned char pkt_id	, int pkt_len, unsigned char *buf ) {    gps_mask_t mask = 0;    int i = 0, j = 0;    uint16_t prod_id = 0;    uint16_t ver = 0;    int maj_ver;    int min_ver;    time_t time_l = 0;    double track;    char msg_buf[512] = "";    char *msg = NULL;    cpo_sat_data *sats = NULL;    cpo_pvt_data *pvt = NULL;    cpo_rcv_data *rmd = NULL;    gpsd_report(LOG_IO, "PrintSERPacket(, %#02x, %#02x, )\n", pkt_id, pkt_len);    switch( pkt_id ) {    case ACK:	gpsd_report(LOG_PROG, "ACK\n");	break;    case NAK:	gpsd_report(LOG_PROG, "NAK\n");	break;    case GARMIN_PKTID_L001_COMMAND_DATA:	prod_id = get_uint16((uint8_t *)buf);	/*@ -branchstate @*/	switch ( prod_id ) {	case CMND_ABORT:	    msg = "Abort current xfer";	    break;	case CMND_START_PVT_DATA:	    msg = "Start Xmit PVT data";	    break;	case CMND_STOP_PVT_DATA:	    msg = "Stop Xmit PVT data";	    break;	case CMND_START_RM_DATA:	    msg = "Start RMD data";	    break;	default:	    (void)snprintf(msg_buf, sizeof(msg_buf), "Unknown: %u", 			(unsigned int)prod_id);	    msg = msg_buf;	    break;	}	/*@ +branchstate @*/	gpsd_report(LOG_PROG, "Appl, Command Data: %s\n", msg);	break;    case GARMIN_PKTID_PRODUCT_RQST:	gpsd_report(LOG_PROG, "Appl, Product Data req\n");	break;    case GARMIN_PKTID_PRODUCT_DATA:	prod_id = get_uint16((uint8_t *)buf);	ver = get_uint16((uint8_t *)&buf[2]);	maj_ver = (int)(ver / 100);	min_ver = (int)(ver - (maj_ver * 100));	gpsd_report(LOG_PROG, "Appl, Product Data, sz: %d\n", pkt_len);	(void)snprintf(session->subtype, sizeof(session->subtype),		       "%d: %d.%02d"		       , (int)prod_id, maj_ver, min_ver);	gpsd_report(LOG_INF, "Garmin Product ID: %d, SoftVer: %d.%02d\n"		, prod_id, maj_ver, min_ver);	gpsd_report(LOG_INF, "Garmin Product Desc: %s\n"		, &buf[4]);	mask |= DEVICEID_SET;	break;    case GARMIN_PKTID_PVT_DATA:	gpsd_report(LOG_PROG, "Appl, PVT Data Sz: %d\n", pkt_len);	pvt = (cpo_pvt_data*) buf;	// 631065600, unix seconds for 31 Dec 1989 Zulu 	time_l = (time_t)(631065600 + (pvt->grmn_days * 86400));	time_l -= pvt->leap_sec;	session->context->leap_seconds = pvt->leap_sec;	session->context->valid = LEAP_SECOND_VALID;	// gps_tow is always like x.999 or x.998 so just round it	time_l += (time_t) round(pvt->gps_tow);	session->gpsdata.fix.time 	  = session->gpsdata.sentence_time 	  = (double)time_l;	gpsd_report(LOG_PROG, "time_l: %ld\n", (long int)time_l);	session->gpsdata.fix.latitude = radtodeg(pvt->lat);	/* sanity check the lat */	if ( 90.0 < session->gpsdata.fix.latitude ) {		session->gpsdata.fix.latitude = 90.0;		gpsd_report(LOG_INF, "ERROR: Latitude overrange\n");	} else if ( -90.0 > session->gpsdata.fix.latitude ) {		session->gpsdata.fix.latitude = -90.0;		gpsd_report(LOG_INF, "ERROR: Latitude negative overrange\n");	}	session->gpsdata.fix.longitude = radtodeg(pvt->lon);	/* sanity check the lon */	if ( 180.0 < session->gpsdata.fix.longitude ) {		session->gpsdata.fix.longitude = 180.0;		gpsd_report(LOG_INF, "ERROR: Longitude overrange\n");	} else if ( -180.0 > session->gpsdata.fix.longitude ) {		session->gpsdata.fix.longitude = -180.0;		gpsd_report(LOG_INF, "ERROR: Longitude negative overrange\n");	}	// altitude over WGS84 converted to MSL	session->gpsdata.fix.altitude = pvt->alt + pvt->msl_hght;	// geoid separation from WGS 84	// gpsd sign is opposite of garmin sign	session->gpsdata.separation = -pvt->msl_hght;	// Estimated position error in meters.	// We follow the advice at <http://gpsinformation.net/main/errors.htm>.	// If this assumption changes here, it should also change in 	// nmea_parse.c where we analyze PGRME.	session->gpsdata.epe = pvt->epe * (GPSD_CONFIDENCE/CEP50_SIGMA);	session->gpsdata.fix.eph = pvt->eph * (GPSD_CONFIDENCE/CEP50_SIGMA);	session->gpsdata.fix.epv = pvt->epv * (GPSD_CONFIDENCE/CEP50_SIGMA);	// convert lat/lon to directionless speed	session->gpsdata.fix.speed = hypot(pvt->lon_vel, pvt->lat_vel);	// keep climb in meters/sec	session->gpsdata.fix.climb = pvt->alt_vel;	track = atan2(pvt->lon_vel, pvt->lat_vel);	if (track < 0) {	    track += 2 * PI;	}	session->gpsdata.fix.track = radtodeg(track);	switch ( pvt->fix) {	case 0:	case 1:	default:	    // no fix	    session->gpsdata.status = STATUS_NO_FIX;	    session->gpsdata.fix.mode = MODE_NO_FIX;	    break;	case 2:	    // 2D fix	    session->gpsdata.status = STATUS_FIX;	    session->gpsdata.fix.mode = MODE_2D;	    break;	case 3:	    // 3D fix	    session->gpsdata.status = STATUS_FIX;	    session->gpsdata.fix.mode = MODE_3D;	    break;	case 4:	    // 2D Differential fix	    session->gpsdata.status = STATUS_DGPS_FIX;	    session->gpsdata.fix.mode = MODE_2D;	    break;	case 5:	    // 3D differential fix	    session->gpsdata.status = STATUS_DGPS_FIX;	    session->gpsdata.fix.mode = MODE_3D;	    break;	}#ifdef NTPSHM_ENABLE	if (session->context->enable_ntpshm && session->gpsdata.fix.mode > MODE_NO_FIX)	    (void) ntpshm_put(session, session->gpsdata.fix.time);

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
亚洲免费色视频| 亚洲精品一区二区三区99| 麻豆极品一区二区三区| 亚洲成a人v欧美综合天堂下载| 中文字幕日韩欧美一区二区三区| 久久久久久综合| 国产精品视频一二三区| 精品国产制服丝袜高跟| 精品少妇一区二区| 久久久精品中文字幕麻豆发布| 日韩三级视频在线观看| 日韩精品一区二区三区蜜臀| 精品剧情v国产在线观看在线| 日韩精品一区二区三区老鸭窝| 日韩欧美在线不卡| 久久夜色精品国产噜噜av| 26uuu亚洲综合色欧美| 日本一区二区三区四区在线视频| 国产拍欧美日韩视频二区| 国产精品久久久久久久久久免费看 | 91蝌蚪porny| 日本久久精品电影| 欧美挠脚心视频网站| 日韩欧美一区二区不卡| 久久久久久久久97黄色工厂| 国产精品欧美精品| 一区二区欧美精品| 麻豆91小视频| 成人午夜视频网站| 欧美综合一区二区| 日韩美女视频在线| 成人欧美一区二区三区1314| 亚洲超碰精品一区二区| 韩国av一区二区三区| 91丨九色丨国产丨porny| 欧美日韩午夜精品| 国产婷婷一区二区| 亚洲一区二区三区国产| 国内外成人在线视频| 91免费国产在线| 日韩限制级电影在线观看| 国产精品久久久久久户外露出 | 丝瓜av网站精品一区二区| 国产一区二区三区在线观看免费视频 | 日本va欧美va欧美va精品| 国产丶欧美丶日本不卡视频| 在线观看欧美精品| 亚洲高清免费视频| 国产99久久久久| 欧美老人xxxx18| 国产精品高清亚洲| 美洲天堂一区二卡三卡四卡视频| 成人av电影在线播放| 日韩一级免费一区| 亚洲色图欧洲色图| 国产精品一级二级三级| 9191国产精品| 亚洲综合另类小说| 不卡电影一区二区三区| 精品毛片乱码1区2区3区| 亚洲夂夂婷婷色拍ww47| 成人一级片网址| 欧美成人一区二区三区在线观看| 亚洲精品亚洲人成人网在线播放| 国产乱码一区二区三区| 欧美一级欧美三级在线观看 | 亚洲va欧美va国产va天堂影院| 国产成人av网站| 欧美成人一区二区三区片免费 | 亚洲黄色尤物视频| www.色精品| 欧美国产日韩亚洲一区| 国产福利一区二区三区视频 | 懂色av一区二区三区免费看| 337p粉嫩大胆色噜噜噜噜亚洲 | 一区二区三区在线不卡| av不卡免费电影| 国产精品黄色在线观看| 不卡在线视频中文字幕| 亚洲国产精品传媒在线观看| 国产suv精品一区二区6| 国产精品拍天天在线| 夫妻av一区二区| 国产女同互慰高潮91漫画| 国产高清成人在线| 欧美国产一区二区在线观看 | 欧美一a一片一级一片| 亚洲国产综合91精品麻豆| 欧美专区日韩专区| 天天综合网 天天综合色| 7777精品伊人久久久大香线蕉最新版| 亚洲国产欧美一区二区三区丁香婷| 欧美三级欧美一级| 日韩电影在线观看电影| 久久综合成人精品亚洲另类欧美 | 成人在线视频首页| 亚洲欧洲性图库| 在线一区二区三区四区五区| 图片区小说区国产精品视频| 日韩欧美国产电影| 国产成人综合网站| 亚洲另类色综合网站| 欧美日韩大陆一区二区| 另类小说图片综合网| 国产日韩欧美精品在线| 91国模大尺度私拍在线视频| 肉色丝袜一区二区| 国产精品三级电影| 欧美性大战久久久久久久| 久久成人麻豆午夜电影| 亚洲人精品午夜| 555www色欧美视频| 成人一级片在线观看| 日韩国产成人精品| 中文字幕中文字幕一区二区| 91精品国产综合久久精品app| 国产成人免费视频网站| 香蕉久久夜色精品国产使用方法 | 中文字幕一区在线| 欧美一区二区黄| 91免费看`日韩一区二区| 久久精品国产一区二区三| 一区二区三区在线影院| 精品国产sm最大网站免费看| 色av一区二区| 国产在线国偷精品产拍免费yy| 夜夜精品视频一区二区| 国产农村妇女精品| 日韩欧美一二区| 欧美在线你懂的| 99久久久久久99| 国产大陆a不卡| 黄一区二区三区| 视频一区二区欧美| 亚洲美女免费在线| 中文字幕av一区二区三区| 日韩精品中文字幕一区| 欧美日韩国产成人在线免费| hitomi一区二区三区精品| 九一久久久久久| 日本成人在线视频网站| 一区二区三区日韩精品视频| 国产精品伦理一区二区| 国产欧美日韩亚州综合| 日韩你懂的电影在线观看| 欧美日韩久久久| 91国模大尺度私拍在线视频| eeuss鲁片一区二区三区在线观看 eeuss鲁片一区二区三区在线看 | 亚洲第一会所有码转帖| 亚洲人成小说网站色在线| 国产精品免费丝袜| 国产日韩欧美在线一区| 国产三级精品在线| 精品国产一区久久| 欧美精品一区二区三区很污很色的 | 自拍偷在线精品自拍偷无码专区 | 一区二区三区四区乱视频| 国产精品第一页第二页第三页| 国产精品久久久久影院亚瑟| 国产精品久久午夜| 亚洲日本在线视频观看| 亚洲美女淫视频| 一区二区三区自拍| 亚洲一区二区三区美女| 偷拍亚洲欧洲综合| 毛片av中文字幕一区二区| 激情五月婷婷综合网| 国产98色在线|日韩| 91亚洲大成网污www| 欧美在线观看视频在线| 欧美喷潮久久久xxxxx| 精品日产卡一卡二卡麻豆| 国产亚洲欧美激情| 亚洲欧洲av在线| 亚洲一区二区成人在线观看| 日韩国产一二三区| 高清不卡一二三区| 色呦呦国产精品| 制服丝袜国产精品| 国产亚洲欧美日韩在线一区| 亚洲人成伊人成综合网小说| 日本少妇一区二区| 高清免费成人av| 欧美日韩在线综合| 久久蜜桃香蕉精品一区二区三区| 自拍av一区二区三区| 日韩成人午夜精品| 成人午夜精品在线| 欧美蜜桃一区二区三区| 久久久国际精品| 亚洲一区在线电影| 国产精品18久久久久| 欧美亚洲综合在线| 中文字幕精品三区| 日韩电影网1区2区| 99精品偷自拍| 久久伊人中文字幕| 天天爽夜夜爽夜夜爽精品视频| 国产成人免费9x9x人网站视频| 在线视频国产一区|