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

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

?? odometer.c

?? Open DMT Client C Source code
?? C
字號:
// ----------------------------------------------------------------------------// Copyright 2006-2007, Martin D. Flynn// All rights reserved// ----------------------------------------------------------------------------//// Licensed under the Apache License, Version 2.0 (the "License");// you may not use this file except in compliance with the License.// You may obtain a copy of the License at// // http://www.apache.org/licenses/LICENSE-2.0// // Unless required by applicable law or agreed to in writing, software// distributed under the License is distributed on an "AS IS" BASIS,// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.// See the License for the specific language governing permissions and// limitations under the License.//// ----------------------------------------------------------------------------// Description://  GPS fix checking for odometer events.//  Examines changes in GPS fix data and generates odometer events accordingly.// ---// Change History://  2006/01/04  Martin D. Flynn//     -Initial release//  2007/01/28  Martin D. Flynn//     -WindowsCE port//     -This module has been updated to accomodate the odometer resolution change//      from 0.1 meter unit to 1 meter units.// ----------------------------------------------------------------------------#include "stdafx.h" // TARGET_WINCE#include "custom/defaults.h"#include <stdio.h>#include <stdlib.h>#include <string.h>#include <ctype.h>#include "custom/log.h"#include "custom/gps.h"#include "tools/stdtypes.h"#include "tools/gpstools.h"#include "tools/utctools.h"#include "base/propman.h"#include "base/statcode.h"#include "base/event.h"#include "modules/odometer.h"// ----------------------------------------------------------------------------#define ODOMETER_PRIORITY   PRIORITY_HIGHstatic Int32 _round(double D) { return (D>=0.0)?(Int32)(D+0.5):(Int32)(D-0.5); }#define ROUND(D) _round(D)   // ((UInt32)((D) + 0.5))// ----------------------------------------------------------------------------static eventAddFtn_t  ftnQueueEvent = 0;static struct {    Key_t           value;    Key_t           limit;    Key_t           state;    StatusCode_t    code;} odomTable[] = {   // Meters                 Alarm Limit            Odom State/GPS       Status Code    { PROP_ODOMETER_0_VALUE, PROP_ODOMETER_0_LIMIT, PROP_ODOMETER_0_GPS, STATUS_ODOM_LIMIT_0 },    { PROP_ODOMETER_1_VALUE, PROP_ODOMETER_1_LIMIT, PROP_ODOMETER_1_GPS, STATUS_ODOM_LIMIT_1 },    { PROP_ODOMETER_2_VALUE, PROP_ODOMETER_2_LIMIT, PROP_ODOMETER_2_GPS, STATUS_ODOM_LIMIT_2 },    { PROP_ODOMETER_3_VALUE, PROP_ODOMETER_3_LIMIT, PROP_ODOMETER_3_GPS, STATUS_ODOM_LIMIT_3 },    { PROP_ODOMETER_4_VALUE, PROP_ODOMETER_4_LIMIT, PROP_ODOMETER_4_GPS, STATUS_ODOM_LIMIT_4 },    { PROP_ODOMETER_5_VALUE, PROP_ODOMETER_5_LIMIT, PROP_ODOMETER_5_GPS, STATUS_ODOM_LIMIT_5 },    { PROP_ODOMETER_6_VALUE, PROP_ODOMETER_6_LIMIT, PROP_ODOMETER_6_GPS, STATUS_ODOM_LIMIT_6 },    { PROP_ODOMETER_7_VALUE, PROP_ODOMETER_7_LIMIT, PROP_ODOMETER_7_GPS, STATUS_ODOM_LIMIT_7 }};#define ODOMETER_COUNT          (sizeof(odomTable)/sizeof(odomTable[0]))// ----------------------------------------------------------------------------static UInt8 odomFirstInit[ODOMETER_COUNT];#define ODOM_IsFirst(X)         (odomFirstInit[(X)])#define ODOM_SetFirst(X,V)      {odomFirstInit[(X)] = (V);}/* get odometer state for specified index */static GPSOdometer_t *_odomGetState(UInt16 ndx){    GPSOdometer_t *gps = (GPSOdometer_t*)0;    if (ndx < ODOMETER_COUNT) {        gps = (GPSOdometer_t*)propGetGPS(odomTable[ndx].state, (GPSOdometer_t*)0);    }    if (!gps) {        logCRITICAL(LOGSRC,"Internal odometer error");    }    return gps;}// ----------------------------------------------------------------------------/* initialize odometer */void odomInitialize(eventAddFtn_t queueEvent){    ftnQueueEvent = queueEvent;    memset(odomFirstInit, 0, sizeof(odomFirstInit));}// ----------------------------------------------------------------------------/* return actual odometer value for the vehicle to which the device is attached */// will return '0' if the actual odometer is not availabledouble odomGetActualOdometerMeters(){    // implement 'actual' odometer value retrieval here (via OBC, etc).    return 0.0;}/* return meters value at specified index */double odomGetDistanceMetersAtIndex(int ndx){    if (ndx == 0) {        // vehicle distance (may need special handling)        return (double)propGetUInt32(odomTable[0].value, 0L);    } else    if ((ndx > 0) && (ndx < ODOMETER_COUNT)) {        // driver, etc        return (double)propGetUInt32(odomTable[ndx].value, 0L);    } else {        // invalid index        return 0.0;    }}/* return total meters for device */double odomGetDeviceDistanceMeters(){    // vehicle distance (may need special handling)    return odomGetDistanceMetersAtIndex(0);}/* return meters value at specified index */utBool odomResetDistanceMetersAtIndex(int ndx){    if ((ndx >= 0) && (ndx < ODOMETER_COUNT)) {        propSetUInt32(odomTable[ndx].value, 0L);        return utTrue;    } else {        return utFalse;    }}// ----------------------------------------------------------------------------/* queue new event */static void _queueOdometerEvent(PacketPriority_t priority, StatusCode_t code, const GPS_t *gps, UInt32 odomMeters){        /* make sure we have a GPS fix */    GPS_t gpsFix;    if (!gps) {        // all odometers events should have a GPS fix, so this should never occur        gps = gpsGetLastGPS(&gpsFix, 0);    }    /* queue event */    if (gps && ftnQueueEvent) {        Event_t evRcd;        evSetEventDefaults(&evRcd, code, 0L, gps);        evRcd.distanceKM = (double)odomMeters / 1000.0;        (*ftnQueueEvent)(priority, DEFAULT_EVENT_FORMAT, &evRcd);    }    }// ----------------------------------------------------------------------------/* periodic check new GPS fix */void odomCheckGPS(const GPS_t *oldFix, const GPS_t *newFix){    // 'newFix' may be NULL    /* get actual odometer, if available */    UInt32 actualOdomMeters = ROUND(odomGetActualOdometerMeters());    /* loop through odometers */    UInt32 minDeltaMeters = propGetUInt32(PROP_GPS_DISTANCE_DELTA, 500L);        if (minDeltaMeters < 10L) { minDeltaMeters = 10L; }    int i;    for (i = 0; i < ODOMETER_COUNT; i++) {        GPSOdometer_t *gps = _odomGetState(i);        if (!gps) { continue; } // error (invalid index)                /* update odometer value */        UInt32 oldOdomMeters = propGetUInt32(odomTable[i].value, 0L);        UInt32 newOdomMeters = 0L;        if ((!oldOdomMeters && !ODOM_IsFirst(i)) || // <-- I've reset the value            (!gps->fixtime || !gpsPointIsValid(&(gps->point)))) {            // First tripometer check (after a reset)            if (i == 0) {                // vehicle odometer                newOdomMeters = (actualOdomMeters > 0L)? actualOdomMeters : oldOdomMeters;                gps->meters = 0L; // vehicle odometer base is '0'            } else {                // tripometer                newOdomMeters = 0L;                gps->meters = ROUND(odomGetDeviceDistanceMeters());            }            propSetUInt32(odomTable[i].value, newOdomMeters);            if (newFix) {                memcpy((GPSShort_t*)gps, (GPSShort_t*)newFix, sizeof(GPSShort_t));            }            propSetGPS(odomTable[i].state, gps);            ODOM_SetFirst(i,1); // this will be the first fix        } else        if (newFix) {            // GPS based odometer            UInt32 deltaMeters = ROUND(gpsMetersToPoint(&(newFix->point), &(gps->point)));            if (deltaMeters >= minDeltaMeters) {                // I've moved at least the minimum required distance to set a new steak in the ground                newOdomMeters = ODOM_IsFirst(i)? deltaMeters : (deltaMeters + oldOdomMeters);                propSetUInt32(odomTable[i].value, newOdomMeters);                memcpy((GPSShort_t*)gps, (GPSShort_t*)newFix, sizeof(GPSShort_t));                propSetGPS(odomTable[i].state, gps);                ODOM_SetFirst(i,0); // no longer the first fix            }        }                /* check odometer limits */        // only sends an event at the crossing of the limit        if (newOdomMeters > 0L) {            UInt32 limitOdomMeters = propGetUInt32(odomTable[i].limit, 0L);            if ((limitOdomMeters > oldOdomMeters) && (limitOdomMeters <= newOdomMeters)) {                StatusCode_t code = (StatusCode_t)odomTable[i].code;                _queueOdometerEvent(ODOMETER_PRIORITY, code, newFix, newOdomMeters);            }        }            }    }// ----------------------------------------------------------------------------

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
国产精品久久精品日日| 奇米一区二区三区| 亚洲精品美腿丝袜| 极品瑜伽女神91| 欧美最新大片在线看| 欧美国产一区视频在线观看| 日韩电影在线免费| 91高清在线观看| ㊣最新国产の精品bt伙计久久| 日本不卡视频在线观看| 在线区一区二视频| 亚洲欧美中日韩| 成人国产免费视频| 久久婷婷久久一区二区三区| 日韩福利视频导航| 欧美午夜一区二区三区| 亚洲色图欧洲色图婷婷| 成人免费视频播放| 国产欧美日韩卡一| 国产在线精品不卡| 久久影院午夜片一区| 蜜臂av日日欢夜夜爽一区| 欧美日韩国产小视频| 亚洲蜜臀av乱码久久精品| 成人av网站免费| 中文字幕乱码日本亚洲一区二区| 国产在线视频一区二区| 精品捆绑美女sm三区| 久久av资源站| xfplay精品久久| 国产乱理伦片在线观看夜一区| 欧美一级久久久| 美腿丝袜亚洲一区| 精品久久久久久久人人人人传媒| 免费不卡在线视频| 日韩西西人体444www| 日本亚洲视频在线| 欧美电影免费观看高清完整版| 美女视频黄频大全不卡视频在线播放| 欧美一级日韩免费不卡| 美女高潮久久久| 久久亚洲精品小早川怜子| 国产成人8x视频一区二区| 国产欧美精品在线观看| heyzo一本久久综合| 一区二区三区中文免费| 欧美日韩不卡视频| 韩国欧美国产1区| 国产精品青草久久| 日本精品一区二区三区高清| 亚洲大片在线观看| 精品国产乱码久久| 成人精品小蝌蚪| 一区二区成人在线观看| 日韩一区二区在线看| 国产成人在线色| 亚洲女性喷水在线观看一区| 欧美日韩你懂得| 国精品**一区二区三区在线蜜桃| 国产精品毛片无遮挡高清| 色综合久久综合网欧美综合网| 婷婷国产在线综合| 欧美精品一区二区三| 色综合天天综合网天天狠天天| 天天综合网天天综合色| 久久九九久久九九| 欧美三级电影在线观看| 久久综合综合久久综合| 中文字幕中文字幕一区| 欧美精品日韩综合在线| 国产91精品在线观看| 亚洲综合一区二区三区| 久久久久久久久久久久久久久99 | 一区二区三区日韩精品| 欧美一级国产精品| 91视频国产观看| 激情成人午夜视频| 亚洲妇女屁股眼交7| 2019国产精品| 欧美日韩亚洲另类| 成人高清在线视频| 男人操女人的视频在线观看欧美| 国产精品萝li| 精品成人私密视频| 欧美精品三级日韩久久| 91丝袜美腿高跟国产极品老师 | 中文字幕亚洲在| 日韩欧美精品三级| 在线观看国产精品网站| 国产成人综合自拍| 精品一区二区成人精品| 亚洲18色成人| 中文字幕一区二区三区蜜月| 日韩精品一区二区三区视频| 欧美日韩亚洲综合| 日本黄色一区二区| 91色九色蝌蚪| 丁香激情综合五月| 国产精品乡下勾搭老头1| 日韩精品福利网| 亚洲成人免费视频| 亚洲一区免费在线观看| 136国产福利精品导航| 国产亚洲精品bt天堂精选| 日韩精品一区二区三区中文不卡 | 亚洲国产成人av| 中文字幕一区二区三区在线不卡| 久久综合99re88久久爱| 精品捆绑美女sm三区| 欧美大片在线观看一区二区| 欧美高清视频www夜色资源网| 色婷婷av一区二区| 日本道色综合久久| 日本久久一区二区| 欧美亚洲国产bt| 欧美日韩视频在线观看一区二区三区| 色婷婷av一区二区三区gif| 色婷婷av一区二区三区之一色屋| 99综合电影在线视频| 色综合夜色一区| 欧美亚洲愉拍一区二区| 欧美日韩在线直播| 欧美一区二区三级| 精品国产伦一区二区三区观看体验 | 精品一区二区三区久久| 精品一区在线看| 国产成人免费在线观看| 99久久精品99国产精品| 色综合久久综合网| 欧美三级日韩三级国产三级| 欧美一区二区三区思思人| 欧美电视剧免费观看| 欧美激情一区二区| 亚洲精品久久嫩草网站秘色| 夜夜嗨av一区二区三区| 日韩高清电影一区| 国产一区二区精品久久99| 成人av网站在线观看免费| 色欧美日韩亚洲| 欧美一区二区三区不卡| 国产午夜精品理论片a级大结局 | 成人精品国产一区二区4080| 色综合中文字幕国产 | 91美女视频网站| 欧美日韩一区在线观看| 日韩你懂的在线播放| 国产精品网站导航| 亚洲一线二线三线视频| 久久成人免费电影| 91免费视频观看| 欧美一级二级三级蜜桃| 国产精品国产三级国产aⅴ原创| 亚洲一区中文在线| 国产麻豆精品在线观看| 91成人在线精品| 久久婷婷久久一区二区三区| 亚洲激情网站免费观看| 九九热在线视频观看这里只有精品 | 国产黄色成人av| 欧美色图天堂网| 久久精品亚洲国产奇米99| 亚洲高清免费一级二级三级| 激情六月婷婷综合| 欧美性大战久久久久久久| 精品处破学生在线二十三| 亚洲欧美激情在线| 久久国产视频网| 欧美日韩色综合| 亚洲欧美一区二区视频| 精品一区二区三区免费视频| 欧美亚洲国产一区二区三区va| 久久久一区二区三区捆绑**| 三级成人在线视频| 一本到不卡免费一区二区| 国产欧美精品一区二区色综合朱莉| 午夜精品久久久久久久蜜桃app| 不卡在线观看av| 久久久久久99精品| 青青草一区二区三区| 精品视频在线免费| 一区二区三区免费观看| 成人av小说网| 中文字幕高清不卡| 国产一区二区导航在线播放| 日韩网站在线看片你懂的| 亚洲bdsm女犯bdsm网站| 日本道免费精品一区二区三区| 欧洲国产伦久久久久久久| 成人h精品动漫一区二区三区| 欧美亚洲日本国产| 综合av第一页| 国产露脸91国语对白| 日韩你懂的在线播放| 日韩一区精品视频| 欧美精品第1页| 看电视剧不卡顿的网站| 欧美精品少妇一区二区三区 | 成人高清视频在线观看| 亚洲日本丝袜连裤袜办公室| 欧美日韩一区精品|