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

📄 vtcalculate.c

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