汽车仪表屏幕平均车速功能代码详解及优化
汽车仪表屏幕平均车速功能代码详解及优化
组名:菲菲公组 姓名: 房雨婷
以下是在仪表屏幕上显示平均车速功能的部分代码,仪表屏幕分为A、B两个界面,两者的逻辑相同,显示内容相互独立。请在括号内补充合适的语句,并修改标有在/**/记号的错误语句以实现该功能。
平均车速的计算公式为
平均车速 = 总路程 / 总时间
平均车速的单位有km/h和mph,两者通过一个系数KFact相互转换,即:
1 mph = KFact * 1 km/h
所有的计算结果经过四舍五入保留整数,当车速数值超过最大值时,屏幕只显示最大值
当PulseCnt和TimeCnt任意一个达到最大值,两者便执行同时除以2的操作
以下是部分全局变量声明
//PulseCnt STATIC uint32 AVS__u32PulseCounterA; STATIC uint32 AVS__u32PulseCounterB; //TimeCnt STATIC uint32 AVS__u32TimeCounterA; STATIC uint32 AVS__u32TimeCounterB; //当前选择界面 STATIC bool AVS__boFirstCalculatedA; STATIC bool AVS__boFirstCalculatedB;
STATIC uint16 AVS__u16TickA; STATIC uint16 AVS__u16TickB;
以下是A界面计算平均车速的函数 STATIC uint16 AVS__u16CalcAvgVelocityA(void) { //VelAvg uint32 u32AvgVelA = 0; //f_ML uint32 u32AVSFactA = 0;
bool boDistInMilesA;
if (boDistInMilesA == True)
{
u32AVSFactA = AVS__nu32ConstantFactMile;
}
else
{
u32AVSFactA = AVS__nu32ConstantFactKm;
}
/* MATH_dwCalc32Mul32Div32为定义过的API库函数,其返回值为第一个参数和第二个参数相乘后除以第三个参数的结果,三个参数均为uint32类型 */ u32AvgVelA = MATH_dwCalc32Mul32Div32(AVS__u32PulseCounterA, (1) u32AVSFactA, AVS__u32TimeCounterA);
u32AvgVelA = u32AvgVelA / AVS__u32KFact + (((u32AvgVelA % AVS__u32KFact)/100) > 4 ? 1 : -1); /(2) AVS__u32KFact = (boDistInMilesA == True) ? AVS__nu32KFactMile : AVS__nu32KFactKm;/
if ((3) boDistInMilesA == True)
{
if (u32AvgVelA > AVS__nu16MaxVelocityMile)
{
u32AvgVelA = AVS__nu16MaxVelocityMile;
}
}
else
{
if (u32AvgVelA > AVS__nu16MaxVelocityKm)
{
u32AvgVelA = AVS__nu16MaxVelocityKm;
}
}
return (uint16) (4) u32AvgVelA > 0 ? (u32AvgVelA / AVS__u32KFact + (((u32AvgVelA % AVS__u32KFact)/100) > 4 ? 1 : 0)) : 0;
}
以下是主程序的部分代码 void AVS_vMain(void) { uint16 u16VelocityA;
bool boValidA;
bool boTickUpdateCountA = False;
AVS__tstVELType AVS__stVEL;
AVS__tstREVType AVS__stREV;
if (AVS__boEnable == True)
{
( void )AVS__enGetREVDPOOL( &AVS__stREV );
( void )AVS__enGetVELDPOOL( &AVS__stVEL );
if (AVS__u16TickA >= AVS__nu16UpdateCount)
/(5) AVS__u16TickA % AVS__nu16UpdateCount == 0/
{
boTickUpdateCountA = True;
AVS__u16TickA = 0;
}
if ((AVS__boEngineRun(AVS__stREV) == True) && (AVS__boVelMove(AVS__stVEL)) && (AVS__boVelValid(AVS__stVEL) == True))
{
if ((AVS__u32PulseCounterA >= AVS__nu32MaxPulseCnt) &&
(AVS__u32TimeCounterA >= AVS__nu32MaxTimeCnt))
/(6) AVS__u32PulseCounterA >= AVS__nu32MaxPulseCnt || AVS__u32TimeCounterA >= AVS__nu32MaxTimeCnt/
{
(7) AVS__u32PulseCounterA /= 2; AVS__u32TimeCounterA /= 2;
(8) AVS__u32PulseCounterA = AVS__u32PulseCounterA > 0 ? AVS__u32PulseCounterA : 0; AVS__u32TimeCounterA = AVS__u32TimeCounterA > 0 ? AVS__u32TimeCounterA : 0; }
AVS__u32PulseCounterA += AVS__u8Pulses(AVS__stVEL);
AVS__u32TimeCounterA++;
}
if ((9) boTickUpdateCountA == True)
{
if (AVS__u32PulseCounterA > AVS__nu16MinDistanceInPulses)
{
u16VelocityA = (10) (uint16)AVS__u16CalcAvgVelocityA();
(void)AVS__enGetAVSDPOOLA(&AVS__stAVSDPOOLA);
if (AVS__boFirstCalculatedA == False)
{
ALGA_vHysterese(u16VelocityA,
&AVS__u16AvgSpeedA(AVS__stAVSDPOOLA),
AVS__nu8ParamHyst,
AVS__nu8ParamHyst);
}
else
{
AVS__boFirstCalculatedA = False;
}
boValidA = AVS__boCheckValid();
AVS__vWriteDpoolData(u16VelocityA, boValidA, True);
}
}
}
}
else
{
AVS__u16TickA = 0
}
原文地址: https://www.cveoy.top/t/topic/oRjc 著作权归作者所有。请勿转载和采集!