📄 odometer1.c
字号:
/***************************************************************
** *
** FILE : OdoMeter1.C *
** COPYRIGHT : (c) 2001 .Xiamen Yaxon NetWork CO.LTD *
** *
** *
** By : QZC 2002.1.15 *
****************************************************************/
#include "includes.h"
#include "config.h"
#include "tools.h"
#include "errcode.h"
#include "errtask.h"
#include "timetask.h"
#include "systime.h"
#include "gpsrecer.h"
#include "Hardware.h"
#include "public.h"
#include "Printer.h"
#include "UARTDRV.H"
#include "GpsTool.h"
#include "OdoMeter1.h"
#include "RamImage.h"
#if EN_ODOMETER1 > 0
#define DebugOdometer1 0
/*
********************************************************************************
* DEFINE CONFIG PARAMETERS
********************************************************************************
*/
#define PERIOD_ 1 /* PERIOD_ = 2 SECOND */
#define PERIOD_METER SECOND, PERIOD_
#define PERIOD_UPDATE MINUTE, 1 * 60 /* PERIOD_UPDATE = 4 hour */
/*
********************************************************************************
* DEFINE MODULE VARIANT
********************************************************************************
*/
static TMR_TSK *metertmr;
static TMR_TSK *updatetmr;
static INT8U latitude1[4], longitude1[4],latitude2[4], longitude2[4];
static INT32U tempspace;
static INT8U RamBuf1[11] _at(0x5400);
static INT8U RamBuf2[11] _at(0x21000);
#if DebugOdometer1
static INT8U tempdata[20],templen;
static INT8U Index=0;
typedef struct
{
INT8U Lat_C;
INT8U Long_C;
}SIMULAT_GPS;
static SIMULAT_GPS simulat_gps[4]={ 0x18,0x76,
0x18,0x77,
0x19,0x77,
0x19,0x76
};
static void GetGPSdata_(INT8U *data1,INT8U *data2)
{
data1[0]=simulat_gps[Index].Lat_C;
data1[1]=0x01;
data1[2]=0x01;
data1[3]=0x01;
data2[0]=simulat_gps[Index].Long_C;
data2[1]=0x01;
data2[2]=0x01;
data2[3]=0x01;
if(++Index>=4) Index=0;
}
#endif
void ClearOdoMeter(void)
{
InitBuf(latitude1 , 0, sizeof(latitude1) );
InitBuf(longitude1, 0, sizeof(longitude1));
InitBuf(latitude2 , 0, sizeof(latitude2) );
InitBuf(longitude2, 0, sizeof(longitude2));
odometer1.datevalid = FALSE;
odometer1.space =0;
StorePubPara(ODOMETER1_);
}
INT8U GetOdoMeterDate(INT8U *ptr)
{
memcpy(ptr, &odometer1.startdate, sizeof(odometer1.startdate));
return sizeof(odometer1.startdate);
}
INT8U GetOdoMeterData(INT8U *ptr)
{
INT8U ret;
ret = 0;
tempspace=odometer1.space*110/100;
*ptr++ = HexToChar(tempspace / 1000000000);
ret++;
tempspace %= 1000000000;
*ptr++ = HexToChar(tempspace / 100000000);
ret++;
tempspace %= 100000000;
*ptr++ = HexToChar(tempspace / 10000000);
ret++;
tempspace %= 10000000;
*ptr++ = HexToChar(tempspace / 1000000);
ret++;
tempspace %= 1000000;
*ptr++ = HexToChar(tempspace / 100000);
ret++;
tempspace %= 100000;
*ptr++ = HexToChar(tempspace / 10000);
ret++;
tempspace %= 10000;
*ptr++ = HexToChar(tempspace / 1000);
ret++;
tempspace %= 1000;
*ptr++ = HexToChar(tempspace / 100);
ret++;
tempspace %= 100;
*ptr++ = HexToChar(tempspace / 10);
ret++;
tempspace %= 10;
*ptr = HexToChar(tempspace);
ret++;
return ret;
}
static void UpdateTmrProc(void)
{
StartTmr(updatetmr, PERIOD_UPDATE);
StorePubPara(ODOMETER1_);
}
static void MeterTmrProc(void)
{
INT32U tempmeter;
StartTmr(metertmr, PERIOD_METER);
if (!odometer1.datevalid) {
if (SysTimeValid()) {
odometer1.datevalid = TRUE;
GetSysTime_Date(&odometer1.startdate);
StorePubPara(ODOMETER1_);
}
}
#if DebugOdometer1
GetGPSdata_(latitude2,longitude2);
#else
if (!GpsDataValid()) return;
if (!ReadPort_ACC()) return;
GetLatitude(latitude2);
GetLongitude(longitude2);
#endif
if(CmpString_Byte(latitude1,sizeof(latitude1),0))
{
memcpy(latitude1 ,latitude2 ,sizeof(latitude1));
memcpy(longitude1,longitude2,sizeof(longitude1));
}
tempmeter=CalculateGpsSpace(latitude1,longitude1,latitude2,longitude2);
if(tempmeter >= 150) tempmeter=0;
odometer1.space +=tempmeter;
StoreRamImage(RI_ODOMETER1_,(INT8U *)&odometer1,sizeof(ODOMETER1_STRUCT));//存到RAM里
memcpy(RamBuf1,(INT8U *)&odometer1,sizeof(ODOMETER1_STRUCT));
RamBuf1[10]=GetChkSum_N(RamBuf1, sizeof(ODOMETER1_STRUCT));
memcpy(RamBuf2,(INT8U *)&odometer1,sizeof(ODOMETER1_STRUCT));
RamBuf2[10]=GetChkSum_N(RamBuf2, sizeof(ODOMETER1_STRUCT));
#if DebugOdometer1
PrintFromUART(0x02,"\nodometer1.space:");
FormatPrintDataBlock(FORMAT_HEX,0x02,(INT8U *)&odometer1.space,4);
templen=GetOdoMeterData(tempdata);
PrintFromUART(0x02,"\ntempdata:");
FormatPrintDataBlock(FORMAT_HEX,0x02,tempdata,templen);
#endif
memcpy(latitude1 ,latitude2 ,sizeof(latitude1));
memcpy(longitude1,longitude2,sizeof(longitude1));
}
static void DiagnoseProc(void)
{
if (GetTmrSwitch(metertmr) != ON) ErrExit(ERR_ODOMETER_TMR);
if (GetTmrSwitch(updatetmr) != ON) ErrExit(ERR_ODOMETER_TMR);
}
void InitOdoMeter1(void)
{
InitBuf(latitude1 , 0, sizeof(latitude1) );
InitBuf(longitude1, 0, sizeof(longitude1));
InitBuf(latitude2 , 0, sizeof(latitude2) );
InitBuf(longitude2, 0, sizeof(longitude2));
metertmr = CreateTimer(MeterTmrProc, 0);
StartTmr(metertmr, PERIOD_METER);
if(!ResumeRamImage(RI_ODOMETER1_,(INT8U *)&odometer1,sizeof(odometer1)))
{
if( RamBuf1[10]!=GetChkSum_N(RamBuf1, sizeof(odometer1)) )
{
if( RamBuf2[10]!=GetChkSum_N(RamBuf2, sizeof(odometer1)) )
{
if(!PubParaValid(ODOMETER1_)) {
ClearOdoMeter();
}
}
else memcpy((INT8U *)&odometer1,RamBuf2,sizeof(odometer1));
}
else memcpy((INT8U *)&odometer1,RamBuf1,sizeof(odometer1));
}
updatetmr = CreateTimer(UpdateTmrProc, 0);
StartTmr(updatetmr, PERIOD_UPDATE);
InstallDiagProc(DiagnoseProc);
}
#endif
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -