📄 vtcalculate.c
字号:
/*
=========================================================================
Description: Vector Cauculate and Vehicle Run Statut
FileName: Vtcalculate.c
Author: Cyb
Date: 2007-07-01
Ver: YAXON DEV I
=========================================================================
*/
#include "includes.h"
#include "hardware.h"
#include "Structs.h"
#include "Public.h"
#include "TimeTask.h"
#include "Flash.h"
#include "Tools.h"
#include "Systime.h"
#include "ErrTask.h"
#include "Winstack.h"
#include "GpsRecer.h"
#include "Sensor.h"
#include "VtCalculate.h"
#include "SimuSteer.h"
static TMR_TSK* VtSecondTmr;
static INT16U AtomicVTSum;
static INT8U TimesCount;
#define ATMOIC_PERIOD_ 1
#define CALCULATE_PERIOD SECOND,1
#define RUN_MINTIME 5
#define STOP_MINTIME 10
#define MAX_VECTOR_SIZE 60
#define VT_LOW_RUN 0x02
typedef struct{
INT8U CurPos;
INT8U FirstPos;
BOOLEAN FullFlag;
INT8U Vectorbuf[MAX_VECTOR_SIZE];
}VECTOR_BUF;
static VECTOR_BUF VectorStore;
static INT8U VehicleMovStatut,CarStatutCount;
__inline void InitVectorStore(void)
{
VectorStore.CurPos = 0;
VectorStore.FirstPos = 0;
VectorStore.FullFlag = 0;
memset(&VectorStore.Vectorbuf[0],0x00,MAX_VECTOR_SIZE);
}
static void StoreVectorToBuf(INT8U Vector)
{
if(VectorStore.CurPos >= MAX_VECTOR_SIZE)
{
VectorStore.CurPos = 0;
VectorStore.FullFlag = TRUE;
}
VectorStore.Vectorbuf[VectorStore.CurPos] = Vector;
VectorStore.CurPos ++;
if(VectorStore.FullFlag) VectorStore.FirstPos++;
}
INT8U GetAverageVector(INT16U Second)
{
INT8U CountPeriod,CurDot,i;
INT16U TotalSum = 0;
CountPeriod = Second / ATMOIC_PERIOD_;
if(CountPeriod > MAX_VECTOR_SIZE) return ERR_VT;
if(CountPeriod <= 1) return VectorStore.Vectorbuf[VectorStore.CurPos-1];
if(VectorStore.FullFlag)
{
CurDot = VectorStore.CurPos - 1;
}
else
{
if(CountPeriod > (VectorStore.CurPos - VectorStore.FirstPos)) return ERR_VT;
CurDot = VectorStore.CurPos - 1;
}
for(i=0;i<CountPeriod;i++){
TotalSum += VectorStore.Vectorbuf[CurDot];
if(CurDot == 0) CurDot = MAX_VECTOR_SIZE - 1;
else CurDot--;
}
return TotalSum / CountPeriod;
}
static void CheckCarStatut(INT8U Vector)
{
if(VEHICLE_STOP == VehicleMovStatut)
{
if(VT_LOW_RUN >= Vector)
{
CarStatutCount = 0;
}
else CarStatutCount++;
if(CarStatutCount > RUN_MINTIME)
{
VehicleMovStatut = VEHICLE_RUNNING;
CarStatutCount = 0;
}
}
else if(VEHICLE_RUNNING == VehicleMovStatut)
{
if(VT_LOW_RUN >= Vector)
{
CarStatutCount++;
}
else
{
CarStatutCount=0;
}
if(CarStatutCount > STOP_MINTIME)
{
VehicleMovStatut = VEHICLE_STOP;
CarStatutCount = 0;
}
}else{
//ErrExit(CARSTATUT_ERR);
}
}
BOOLEAN VechicleIsRunningNow(void)
{
if(VEHICLE_RUNNING == VehicleMovStatut) return TRUE;
else return FALSE;
}
BOOLEAN VechicleIsStopNow(void)
{
if(VEHICLE_STOP == VehicleMovStatut) return TRUE;
else return FALSE;
}
static void VtSecondTmrProc(void)
{
INT8U Vector;
if(GetSimuStatus() ==SIMU_OPEN_)
{
Vector = GetSimuVector();
}
else
{
Vector = GetVector();
}
AtomicVTSum += Vector;
if(++TimesCount >= ATMOIC_PERIOD_)
{
StoreVectorToBuf(AtomicVTSum / ATMOIC_PERIOD_);
AtomicVTSum = 0;
TimesCount = 0;
}
CheckCarStatut(Vector);
}
void InitVtCalculate(void)
{
TimesCount = 0;
AtomicVTSum = 0;
VehicleMovStatut = VEHICLE_STOP;
CarStatutCount = 0;
InitVectorStore();
VtSecondTmr = CreateTimer(VtSecondTmrProc,0);
StartTmr(VtSecondTmr,CALCULATE_PERIOD);
}
#if 0
#define SEAMILE_FACTOR 1852
static INT8U Buf[3];
static INT8U VoHexToDecAscii(INT8U DesData,INT8U *Sptr)
{
INT8U Tmp,Len = 0;
if((Tmp = DesData / 100)){
Len ++;
*Sptr++ = Tmp + '0';
}
DesData = DesData % 100;
if((Tmp = DesData / 10)){
Len ++;
*Sptr++ = Tmp + '0';
}
*Sptr = DesData % 10 + '0';
Len ++;
return Len;
}
void VoReadPerMinuteVt(void)
{
INT32U Vector;
INT8U TempLen;
Vector = GetAverageVector(60);
#if VT_DEBUG
Printu("Vector:%x\r\n",Vector);
#endif
Vector = (Vector * SEAMILE_FACTOR) / 1000;
OSQPost(QXF,MSG_TEXTTOVOICE,(INT32U)"当前时速",8);
if(Vector > 200) OSQPost(QXF,MSG_TEXTTOVOICE,(INT32U)"未明",12);
else{
TempLen = VoHexToDecAscii(Vector,Buf);
OSQPost(QXF,MSG_TEXTTOVOICE,(INT32U)Buf,TempLen);
OSQPost(QXF,MSG_TEXTTOVOICE,(INT32U)"公里",4);
}
ActivateLowestWinStack();
}
#endif
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -