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

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

?? 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;

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
日韩精品一区二区三区四区视频| 色欧美片视频在线观看在线视频| 亚洲成人av中文| 亚洲综合丁香婷婷六月香| 亚洲色图欧洲色图婷婷| 17c精品麻豆一区二区免费| 亚洲欧洲无码一区二区三区| 亚洲日本丝袜连裤袜办公室| 亚洲男人的天堂在线观看| 中文字幕在线一区免费| 亚洲视频一区在线| 亚洲国产精品嫩草影院| 天天影视色香欲综合网老头| 日韩国产一区二| 日本欧美一区二区三区乱码| 久久99精品久久久久| 国产一区二三区好的| 粉嫩av一区二区三区| 色综合色狠狠天天综合色| 欧美在线不卡视频| 精品久久久久一区二区国产| 中文字幕成人网| 亚洲无人区一区| 精品在线观看视频| 91在线观看地址| 91精品欧美福利在线观看| 26uuu精品一区二区三区四区在线| 国产调教视频一区| 亚洲精品成a人| 韩日欧美一区二区三区| 91麻豆免费视频| 欧美zozo另类异族| 亚洲黄色尤物视频| 国产一区视频导航| 欧美三电影在线| 中文字幕一区在线观看| 亚洲成人黄色小说| 不卡在线视频中文字幕| 日韩欧美在线网站| 一区二区三区四区五区视频在线观看 | 欧美精品在欧美一区二区少妇| 欧美成人猛片aaaaaaa| 亚洲天堂网中文字| 久久99精品国产.久久久久| 91麻豆国产在线观看| 欧美成人女星排行榜| 亚洲国产精品自拍| 99久久精品免费| 久久久精品免费免费| 丝袜美腿高跟呻吟高潮一区| 99久久久久久| 欧美激情一区在线观看| 狠狠v欧美v日韩v亚洲ⅴ| 欧美高清视频一二三区| 亚洲视频一区二区在线观看| 国产不卡视频在线观看| 精品免费视频一区二区| 日韩精品欧美精品| 欧美三级电影一区| 一区二区三区国产| 91美女在线视频| 17c精品麻豆一区二区免费| 丁香网亚洲国际| 国产日产欧美一区二区视频| 精品一区二区三区在线观看 | 欧美一区二区三区免费| 性久久久久久久| 欧美亚洲国产一区二区三区va| 国产精品久久久久久久裸模| 国产精品一二三四| 久久久青草青青国产亚洲免观| 麻豆一区二区99久久久久| 欧美一区二区女人| 日本麻豆一区二区三区视频| 6080日韩午夜伦伦午夜伦| 亚洲超碰精品一区二区| 欧美日韩国产电影| 青青草国产成人99久久| 日韩精品最新网址| 精品亚洲成av人在线观看| 精品美女一区二区| 国产suv精品一区二区883| 国产欧美日韩亚州综合| 成人白浆超碰人人人人| 国产精品国产三级国产普通话三级| 成人午夜短视频| 亚洲人亚洲人成电影网站色| 欧美中文一区二区三区| 日韩精品一区第一页| 精品国产凹凸成av人导航| 国产乱国产乱300精品| 国产精品久久久久久久岛一牛影视 | 亚洲欧洲av色图| 99re这里都是精品| 视频一区欧美日韩| 26uuu精品一区二区在线观看| 懂色av一区二区三区免费观看| 国产精品国产自产拍在线| 91免费观看在线| 亚洲成人先锋电影| 久久精品欧美日韩| 在线一区二区三区| 伦理电影国产精品| 亚洲欧洲综合另类| 欧美一卡2卡三卡4卡5免费| 国产传媒久久文化传媒| 亚洲一区影音先锋| 国产喷白浆一区二区三区| 日本高清不卡在线观看| 精品伊人久久久久7777人| 国产精品免费观看视频| 在线不卡中文字幕播放| 成人午夜大片免费观看| 日韩成人一区二区| 亚洲欧美一区二区久久| 久久久夜色精品亚洲| 欧美日韩精品一区二区三区四区| 国产精品综合网| 亚洲已满18点击进入久久| 久久人人97超碰com| 欧美丝袜丝交足nylons| 国产91高潮流白浆在线麻豆| 日本在线不卡视频一二三区| 1024成人网| 久久久精品人体av艺术| 91麻豆精品久久久久蜜臀| 99久久久久免费精品国产 | 亚洲成人手机在线| 国产精品毛片久久久久久| 欧美va亚洲va在线观看蝴蝶网| 一本色道久久综合亚洲aⅴ蜜桃| 韩国成人在线视频| 日韩av不卡一区二区| 亚洲妇女屁股眼交7| 亚洲欧美日韩久久| 一色屋精品亚洲香蕉网站| 欧美经典一区二区| 国产日韩欧美亚洲| 日韩免费看网站| 日韩视频一区二区三区在线播放| 欧美在线啊v一区| 97精品超碰一区二区三区| 福利视频网站一区二区三区| 精品一区二区三区在线观看| 麻豆国产91在线播放| 美女国产一区二区| 狠狠网亚洲精品| 激情综合网激情| 国产一区二区三区精品欧美日韩一区二区三区 | 91精品福利在线| 91免费国产在线观看| 91在线porny国产在线看| 94色蜜桃网一区二区三区| 97久久精品人人做人人爽| 91麻豆自制传媒国产之光| 在线视频一区二区三区| 欧美色综合网站| 制服丝袜一区二区三区| 欧美一区二区精品在线| 精品久久久久久综合日本欧美| 欧美mv日韩mv亚洲| 国产亚洲福利社区一区| ...av二区三区久久精品| 亚洲欧美色一区| 视频精品一区二区| 久久99精品国产.久久久久久| 国产精品一二一区| bt欧美亚洲午夜电影天堂| 91国偷自产一区二区三区成为亚洲经典| 97精品国产露脸对白| 欧美日韩mp4| 26uuu另类欧美亚洲曰本| 国产精品污www在线观看| 一区二区在线观看不卡| 午夜私人影院久久久久| 久久丁香综合五月国产三级网站| 国产suv精品一区二区883| 一本大道久久a久久综合婷婷 | 精品综合免费视频观看| 高清不卡在线观看| 欧美在线视频你懂得| 亚洲精品在线电影| 亚洲欧美一区二区不卡| 久久精品国产亚洲5555| 5566中文字幕一区二区电影 | 日本道免费精品一区二区三区| 欧美日韩久久久一区| 久久久国产精华| 亚洲一区视频在线观看视频| 激情丁香综合五月| 欧美亚洲综合网| 国产欧美日韩三级| 亚洲大片在线观看| 成人的网站免费观看| 日韩一区二区精品在线观看| 亚洲婷婷在线视频| 国产精品夜夜嗨| 欧美一区二区三区思思人| 国产精品家庭影院| 国产一区二区三区蝌蚪|