⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 odometer1.c

📁 在ARM7和UC/OSII的平台上实现了GPS自动报站的功能,涉及GPS模块LEA_4S的驱动,位置速寻算法,语音芯片ISD4004的录放音驱动,LED页面管理等等.从启动代码到操作系统的移植以及到业
💻 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 + -