汽车仪表屏幕平均车速功能代码详解及优化

组名:菲菲公组 姓名: 房雨婷

以下是在仪表屏幕上显示平均车速功能的部分代码,仪表屏幕分为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 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录