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

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關(guān)于我們
? 蟲蟲下載站

?? gps_qemu.c

?? Android平臺上Midware層源代碼合集
?? C
?? 第 1 頁 / 共 2 頁
字號:
#include <errno.h>#include <pthread.h>#include <termios.h>#include <fcntl.h>#include <sys/epoll.h>#include <math.h>#include <time.h>#define  LOG_TAG  "gps_qemu"#include <cutils/log.h>#include <cutils/sockets.h>#include <cutils/properties.h>#include <hardware/gps.h>/* the name of the qemud-controlled socket */#define  QEMUD_SOCKET_NAME  "qemud_gps"#define  GPS_DEBUG  0#if GPS_DEBUG#  define  D(...)   LOGD(__VA_ARGS__)#else#  define  D(...)   ((void)0)#endif/*****************************************************************//*****************************************************************//*****                                                       *****//*****       N M E A   T O K E N I Z E R                     *****//*****                                                       *****//*****************************************************************//*****************************************************************/typedef struct {    const char*  p;    const char*  end;} Token;#define  MAX_NMEA_TOKENS  16typedef struct {    int     count;    Token   tokens[ MAX_NMEA_TOKENS ];} NmeaTokenizer;static intnmea_tokenizer_init( NmeaTokenizer*  t, const char*  p, const char*  end ){    int    count = 0;    char*  q;    // the initial '$' is optional    if (p < end && p[0] == '$')        p += 1;    // remove trailing newline    if (end > p && end[-1] == '\n') {        end -= 1;        if (end > p && end[-1] == '\r')            end -= 1;    }    // get rid of checksum at the end of the sentecne    if (end >= p+3 && end[-3] == '*') {        end -= 3;    }    while (p < end) {        const char*  q = p;        q = memchr(p, ',', end-p);        if (q == NULL)            q = end;        if (q > p) {            if (count < MAX_NMEA_TOKENS) {                t->tokens[count].p   = p;                t->tokens[count].end = q;                count += 1;            }        }        if (q < end)            q += 1;        p = q;    }    t->count = count;    return count;}static Tokennmea_tokenizer_get( NmeaTokenizer*  t, int  index ){    Token  tok;    static const char*  dummy = "";    if (index < 0 || index >= t->count) {        tok.p = tok.end = dummy;    } else        tok = t->tokens[index];    return tok;}static intstr2int( const char*  p, const char*  end ){    int   result = 0;    int   len    = end - p;    for ( ; len > 0; len--, p++ )    {        int  c;        if (p >= end)            goto Fail;        c = *p - '0';        if ((unsigned)c >= 10)            goto Fail;        result = result*10 + c;    }    return  result;Fail:    return -1;}static doublestr2float( const char*  p, const char*  end ){    int   result = 0;    int   len    = end - p;    char  temp[16];    if (len >= (int)sizeof(temp))        return 0.;    memcpy( temp, p, len );    temp[len] = 0;    return strtod( temp, NULL );}/*****************************************************************//*****************************************************************//*****                                                       *****//*****       N M E A   P A R S E R                           *****//*****                                                       *****//*****************************************************************//*****************************************************************/#define  NMEA_MAX_SIZE  83typedef struct {    int     pos;    int     overflow;    int     utc_year;    int     utc_mon;    int     utc_day;    int     utc_diff;    GpsLocation  fix;    gps_location_callback  callback;    char    in[ NMEA_MAX_SIZE+1 ];} NmeaReader;static voidnmea_reader_update_utc_diff( NmeaReader*  r ){    time_t         now = time(NULL);    struct tm      tm_local;    struct tm      tm_utc;    long           time_local, time_utc;    gmtime_r( &now, &tm_utc );    localtime_r( &now, &tm_local );    time_local = tm_local.tm_sec +                 60*(tm_local.tm_min +                 60*(tm_local.tm_hour +                 24*(tm_local.tm_yday +                 365*tm_local.tm_year)));    time_utc = tm_utc.tm_sec +               60*(tm_utc.tm_min +               60*(tm_utc.tm_hour +               24*(tm_utc.tm_yday +               365*tm_utc.tm_year)));    r->utc_diff = time_utc - time_local;}static voidnmea_reader_init( NmeaReader*  r ){    memset( r, 0, sizeof(*r) );    r->pos      = 0;    r->overflow = 0;    r->utc_year = -1;    r->utc_mon  = -1;    r->utc_day  = -1;    r->callback = NULL;    nmea_reader_update_utc_diff( r );}static voidnmea_reader_set_callback( NmeaReader*  r, gps_location_callback  cb ){    r->callback = cb;    if (cb != NULL && r->fix.flags != 0) {        D("%s: sending latest fix to new callback", __FUNCTION__);        r->callback( &r->fix );        r->fix.flags = 0;    }}static intnmea_reader_update_time( NmeaReader*  r, Token  tok ){    int        hour, minute;    double     seconds;    struct tm  tm;    time_t     fix_time;    if (tok.p + 6 > tok.end)        return -1;    if (r->utc_year < 0) {        // no date yet, get current one        time_t  now = time(NULL);        gmtime_r( &now, &tm );        r->utc_year = tm.tm_year + 1900;        r->utc_mon  = tm.tm_mon + 1;        r->utc_day  = tm.tm_mday;    }    hour    = str2int(tok.p,   tok.p+2);    minute  = str2int(tok.p+2, tok.p+4);    seconds = str2float(tok.p+4, tok.end);    tm.tm_hour = hour;    tm.tm_min  = minute;    tm.tm_sec  = (int) seconds;    tm.tm_year = r->utc_year - 1900;    tm.tm_mon  = r->utc_mon - 1;    tm.tm_mday = r->utc_day;    fix_time = mktime( &tm ) + r->utc_diff;    r->fix.timestamp = (long long)fix_time * 1000;    return 0;}static intnmea_reader_update_date( NmeaReader*  r, Token  date, Token  time ){    Token  tok = date;    int    day, mon, year;    if (tok.p + 6 != tok.end) {        D("date not properly formatted: '%.*s'", tok.end-tok.p, tok.p);        return -1;    }    day  = str2int(tok.p, tok.p+2);    mon  = str2int(tok.p+2, tok.p+4);    year = str2int(tok.p+4, tok.p+6) + 2000;    if ((day|mon|year) < 0) {        D("date not properly formatted: '%.*s'", tok.end-tok.p, tok.p);        return -1;    }    r->utc_year  = year;    r->utc_mon   = mon;    r->utc_day   = day;    return nmea_reader_update_time( r, time );}static doubleconvert_from_hhmm( Token  tok ){    double  val     = str2float(tok.p, tok.end);    int     degrees = (int)(floor(val) / 100);    double  minutes = val - degrees*100.;    double  dcoord  = degrees + minutes / 60.0;    return dcoord;}static intnmea_reader_update_latlong( NmeaReader*  r,                            Token        latitude,                            char         latitudeHemi,                            Token        longitude,                            char         longitudeHemi ){    double   lat, lon;    Token    tok;    tok = latitude;    if (tok.p + 6 > tok.end) {        D("latitude is too short: '%.*s'", tok.end-tok.p, tok.p);        return -1;    }    lat = convert_from_hhmm(tok);    if (latitudeHemi == 'S')        lat = -lat;    tok = longitude;    if (tok.p + 6 > tok.end) {        D("longitude is too short: '%.*s'", tok.end-tok.p, tok.p);        return -1;    }    lon = convert_from_hhmm(tok);    if (longitudeHemi == 'W')        lon = -lon;    r->fix.flags    |= GPS_LOCATION_HAS_LAT_LONG;    r->fix.latitude  = lat;    r->fix.longitude = lon;    return 0;}static intnmea_reader_update_altitude( NmeaReader*  r,                             Token        altitude,                             Token        units ){    double  alt;    Token   tok = altitude;    if (tok.p >= tok.end)        return -1;    r->fix.flags   |= GPS_LOCATION_HAS_ALTITUDE;    r->fix.altitude = str2float(tok.p, tok.end);    return 0;}static intnmea_reader_update_bearing( NmeaReader*  r,                            Token        bearing ){    double  alt;    Token   tok = bearing;    if (tok.p >= tok.end)        return -1;    r->fix.flags   |= GPS_LOCATION_HAS_BEARING;    r->fix.bearing  = str2float(tok.p, tok.end);    return 0;}static intnmea_reader_update_speed( NmeaReader*  r,                          Token        speed ){    double  alt;    Token   tok = speed;    if (tok.p >= tok.end)        return -1;    r->fix.flags   |= GPS_LOCATION_HAS_SPEED;    r->fix.speed    = str2float(tok.p, tok.end);    return 0;}static voidnmea_reader_parse( NmeaReader*  r ){   /* we received a complete sentence, now parse it to generate    * a new GPS fix...    */    NmeaTokenizer  tzer[1];    Token          tok;    D("Received: '%.*s'", r->pos, r->in);    if (r->pos < 9) {        D("Too short. discarded.");        return;    }    nmea_tokenizer_init(tzer, r->in, r->in + r->pos);#if GPS_DEBUG    {        int  n;        D("Found %d tokens", tzer->count);        for (n = 0; n < tzer->count; n++) {            Token  tok = nmea_tokenizer_get(tzer,n);            D("%2d: '%.*s'", n, tok.end-tok.p, tok.p);        }    }#endif    tok = nmea_tokenizer_get(tzer, 0);    if (tok.p + 5 > tok.end) {        D("sentence id '%.*s' too short, ignored.", tok.end-tok.p, tok.p);        return;    }    // ignore first two characters.    tok.p += 2;    if ( !memcmp(tok.p, "GGA", 3) ) {        // GPS fix        Token  tok_time          = nmea_tokenizer_get(tzer,1);        Token  tok_latitude      = nmea_tokenizer_get(tzer,2);        Token  tok_latitudeHemi  = nmea_tokenizer_get(tzer,3);        Token  tok_longitude     = nmea_tokenizer_get(tzer,4);        Token  tok_longitudeHemi = nmea_tokenizer_get(tzer,5);        Token  tok_altitude      = nmea_tokenizer_get(tzer,9);        Token  tok_altitudeUnits = nmea_tokenizer_get(tzer,10);        nmea_reader_update_time(r, tok_time);        nmea_reader_update_latlong(r, tok_latitude,                                      tok_latitudeHemi.p[0],                                      tok_longitude,                                      tok_longitudeHemi.p[0]);        nmea_reader_update_altitude(r, tok_altitude, tok_altitudeUnits);    } else if ( !memcmp(tok.p, "GSA", 3) ) {        // do something ?    } else if ( !memcmp(tok.p, "RMC", 3) ) {        Token  tok_time          = nmea_tokenizer_get(tzer,1);        Token  tok_fixStatus     = nmea_tokenizer_get(tzer,2);        Token  tok_latitude      = nmea_tokenizer_get(tzer,3);        Token  tok_latitudeHemi  = nmea_tokenizer_get(tzer,4);        Token  tok_longitude     = nmea_tokenizer_get(tzer,5);        Token  tok_longitudeHemi = nmea_tokenizer_get(tzer,6);        Token  tok_speed         = nmea_tokenizer_get(tzer,7);        Token  tok_bearing       = nmea_tokenizer_get(tzer,8);        Token  tok_date          = nmea_tokenizer_get(tzer,9);        D("in RMC, fixStatus=%c", tok_fixStatus.p[0]);        if (tok_fixStatus.p[0] == 'A')        {            nmea_reader_update_date( r, tok_date, tok_time );            nmea_reader_update_latlong( r, tok_latitude,                                           tok_latitudeHemi.p[0],                                           tok_longitude,                                           tok_longitudeHemi.p[0] );            nmea_reader_update_bearing( r, tok_bearing );            nmea_reader_update_speed  ( r, tok_speed );        }    } else {        tok.p -= 2;        D("unknown sentence '%.*s", tok.end-tok.p, tok.p);    }    if (r->fix.flags != 0) {#if GPS_DEBUG        char   temp[256];        char*  p   = temp;        char*  end = p + sizeof(temp);        struct tm   utc;

?? 快捷鍵說明

復(fù)制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
91在线小视频| 色婷婷久久久久swag精品| 亚洲欧美电影一区二区| 日韩亚洲欧美综合| 91亚洲精品久久久蜜桃网站 | 91精品国产91久久综合桃花| 国产乱国产乱300精品| 一区二区三区四区精品在线视频 | 日韩欧美美女一区二区三区| eeuss国产一区二区三区| 日本视频在线一区| 亚洲色图欧美偷拍| 久久综合色婷婷| 91精品国产综合久久精品性色| 成人午夜在线免费| 国产综合成人久久大片91| 视频一区二区三区在线| 亚洲欧美视频一区| 国产精品久久久久久久久久久免费看 | 色偷偷久久人人79超碰人人澡 | 成人一级黄色片| 欧美a级一区二区| 亚洲国产欧美日韩另类综合| 欧美国产日韩在线观看| 欧美v亚洲v综合ⅴ国产v| 1024成人网| 国产偷国产偷精品高清尤物| 精品美女一区二区| 欧美成人伊人久久综合网| 欧美精品tushy高清| 欧美体内she精视频| 91久久免费观看| 日本道在线观看一区二区| 91香蕉视频mp4| 色婷婷国产精品久久包臀| 一道本成人在线| 色一区在线观看| 欧洲在线/亚洲| 欧美日韩高清一区二区三区| 欧美视频在线一区二区三区 | 欧美亚洲丝袜传媒另类| 色婷婷综合视频在线观看| 99精品视频一区| 91小宝寻花一区二区三区| 91香蕉视频在线| 欧美自拍偷拍一区| 欧美肥胖老妇做爰| 日韩欧美激情在线| 久久久久久久免费视频了| 国产日韩欧美一区二区三区乱码 | 一区二区免费看| 亚洲永久免费av| 亚洲午夜电影网| 欧美视频精品在线| 欧美日韩三级一区| 制服丝袜亚洲精品中文字幕| 日韩一区二区三区在线| 精品国产露脸精彩对白| 国产午夜一区二区三区| 中文av一区二区| 一区二区三区四区在线免费观看| 亚洲午夜av在线| 美女视频黄 久久| 国产伦精品一区二区三区免费| 国产凹凸在线观看一区二区| 成人ar影院免费观看视频| 在线免费亚洲电影| 欧美一区二区三区思思人| 久久午夜电影网| 亚洲免费观看高清完整版在线观看熊 | 丁香婷婷综合网| 91麻豆.com| 日韩欧美三级在线| 国产精品久久久久久久久动漫 | 欧美探花视频资源| 91精品国产色综合久久不卡蜜臀 | 国产成人免费视频网站高清观看视频| 春色校园综合激情亚洲| 91久久免费观看| 欧美精品一区二区三区在线播放| 日本一区二区三区久久久久久久久不| 亚洲免费在线视频一区 二区| 日韩av电影免费观看高清完整版 | 日韩久久久精品| 中文字幕 久热精品 视频在线 | 欧美精品99久久久**| 国产午夜精品一区二区| 樱桃视频在线观看一区| 狠狠色狠狠色综合系列| 91电影在线观看| 久久久久久99精品| 亚洲成人在线免费| www.一区二区| 精品国产91洋老外米糕| 洋洋av久久久久久久一区| 久久91精品国产91久久小草| 在线视频国内一区二区| 久久久电影一区二区三区| 亚洲一区在线观看视频| 成人午夜视频在线| 日韩一区二区免费在线电影 | 麻豆国产欧美日韩综合精品二区| av电影在线观看完整版一区二区| 欧美一级生活片| 一区二区三区在线视频播放| 国产99久久久久| 日韩欧美一区二区久久婷婷| 亚洲最新在线观看| av福利精品导航| 国产人久久人人人人爽| 老司机免费视频一区二区| 欧美性色黄大片手机版| 国产精品久久久久久久久久免费看 | 91精品一区二区三区久久久久久| 最新不卡av在线| 国产精品一区在线观看乱码 | 欧美日韩成人在线一区| 亚洲视频一区在线观看| 成人性视频免费网站| 精品国产免费久久| 免费观看日韩av| 4hu四虎永久在线影院成人| 亚洲自拍与偷拍| 一本到不卡精品视频在线观看| 国产欧美一区二区在线观看| 精品一区二区三区在线观看国产| 欧美精品三级日韩久久| 亚洲成av人影院| 欧美在线免费观看视频| 亚洲黄色小说网站| 一本色道久久综合狠狠躁的推荐| 国产精品女同互慰在线看| 国产成人免费网站| 久久精品欧美日韩| 国产精品99久久久久久宅男| 久久天堂av综合合色蜜桃网| 国产在线国偷精品产拍免费yy| 精品免费国产二区三区| 久久国产人妖系列| 精品国精品自拍自在线| 国产在线精品一区二区夜色| 精品美女一区二区| 国产成人在线观看免费网站| 久久久蜜桃精品| 成人免费不卡视频| 中文字幕日韩一区| 91成人在线免费观看| 午夜精品久久久久久久99水蜜桃| 欧美区视频在线观看| 日本视频一区二区三区| 久久夜色精品一区| 成人综合在线网站| 日韩伦理av电影| 欧美色精品天天在线观看视频| 丝袜诱惑制服诱惑色一区在线观看| 7777精品伊人久久久大香线蕉经典版下载 | 国产成人精品综合在线观看| 中文字幕精品一区二区三区精品| jlzzjlzz亚洲日本少妇| 洋洋av久久久久久久一区| 6080日韩午夜伦伦午夜伦| 精品系列免费在线观看| 亚洲国产精品精华液2区45| 色婷婷综合五月| 日本成人超碰在线观看| 久久久777精品电影网影网| 成人a级免费电影| 亚洲亚洲精品在线观看| 日韩免费一区二区三区在线播放| 国产传媒一区在线| 一区二区在线观看av| 欧美一三区三区四区免费在线看 | 在线不卡的av| 国产乱码字幕精品高清av| 亚洲欧美一区二区三区孕妇| 欧美一区二区三区在线视频| 国产福利一区在线| 亚洲一区二区三区四区五区中文| 日韩视频中午一区| 99久久国产综合精品色伊| 日韩高清在线观看| 国产精品久久久久影视| 制服.丝袜.亚洲.另类.中文| 国产精品白丝jk白祙喷水网站| 亚洲一区二区精品3399| 精品久久久久久久久久久久久久久| 99精品视频在线观看免费| 喷白浆一区二区| 一区二区三区日韩精品| 久久久午夜精品理论片中文字幕| 日本道精品一区二区三区| 国产精品一区二区x88av| 亚洲国产欧美在线人成| 国产精品亲子伦对白| 欧美一区二区三区思思人| 91女人视频在线观看| 国产精品小仙女| 日本最新不卡在线| 伊人开心综合网| 国产精品丝袜久久久久久app|