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

📄 cost.c

📁 此程序为出租车计价器
💻 C
字号:
//======================================================
// 文件名称:	Cost.c
// 功能描述:	计费管理程序
// 维护记录:	2006-10-12	v1.0	by lijian
//======================================================
#include "Cost.h"
#include "Cal.h"
#include "Speed.h"
#include "Distance.h"
#include "ConstValues.h"

//	以下各变量读取自Flash
float c_fStartPrice;								//	起步价
float c_fNightStartPrice;							//	夜行起步价
float c_fStartMilege;								//	起步里程数
float c_fPricePerKM;								//	白天的单价
float c_fNightPricePerKM;							//	夜晚的单价
float c_fWaitSpeed1, c_fWaitSpeed2;					//	等待之后的启动速度
float c_fFirstWaitTimeLimit;						//	第一次等待时间(以分钟为单位)
float c_fWaitTimeLimit;								//	每公里相当于等待时间长度(以分钟为单位)
float c_fWaitPrice;									//	低速运行的加价
float c_fLongWayLimit;								//	空返加价距离
float c_fLongWayPrice;								//	空返加价幅度
unsigned int c_uiNightTime1, c_uiNightTime2;		//	夜行分界点

//	以下各变量用于计价
float fCurPrice;
float fCost;										//	费用
float fDayMilege;									//	白天行驶的里程
float fNightMilege;									//	夜晚行驶的里程
float fRevMilegePoint;								//	白天黑夜交叉点的里程数
unsigned long int ulWaitTime;						//	等待时间

//	以下各变量用于记录当前运行状态
unsigned int uiWaiting;								//	等待状态
unsigned int uiNightRun;							//	夜行状态
unsigned int uiLongWay;								//	远距行驶状态

//=============================================================
// 语法格式:	void Cost_Init(void)
// 实现功能:	计费管理初始化
// 参数:		无
// 返回值:		无
//=============================================================
void Cost_Init(void)
{
	c_fStartPrice = C_StartPrice;					//	读取Flash中保存的各个计价控制参量
	c_fNightStartPrice = C_NightStartPrice;
	c_fStartMilege = C_StartMilege;
	c_fPricePerKM = C_PricePerKM;
	c_fNightPricePerKM = C_NightPricePerKM;
	c_fWaitSpeed1 = C_WaitSpeed1;
	c_fWaitSpeed2 = C_WaitSpeed2;
	c_fFirstWaitTimeLimit = C_FirstWaitTimeLimit;
	c_fWaitTimeLimit = C_WaitTimeLimit;
	c_fWaitPrice = C_WaitPrice;
	c_fLongWayLimit = C_LongWayLimit;
	c_fLongWayPrice = C_LongWayPrice;
	c_uiNightTime1 = C_NightTime1;
	c_uiNightTime2 = C_NightTime2;
	if(c_uiNightTime1 < c_uiNightTime2)
	{
		c_uiNightTime1 = C_NightTime2;
		c_uiNightTime2 = C_NightTime1;
	}
//	fCost = 0.0;
//	fCurPrice = 0;
//	fDayMilege = 0.0;
//	fNightMilege = 0.0;
//	fRevMilegePoint = 0.0;
//	ulWaitTime = 0;
//	uiWaiting = 0;
}

//=============================================================
// 语法格式:	void Cost_StartRunning(void)
// 实现功能:	启动计费
// 参数:		无
// 返回值:		无
//=============================================================
void Cost_StartRunning(void)
{
	fCost = 0.0;
	fRevMilegePoint = 0.0;
	ulWaitTime = 0;
	uiWaiting = 0;
	uiLongWay = 0;
	Speed_Start();
	Dis_StartMessure();
	if((Cal_GetHour() >= c_uiNightTime1) || (Cal_GetHour() <= c_uiNightTime2))
	{												//	如果处于夜行时间
		uiNightRun = 1;								//	夜行标志
		fCurPrice = c_fNightPricePerKM;				//	执行夜行单价
		fCost = c_fNightStartPrice;					//	夜行起步价
		fDayMilege = 0.0;							//	白天行驶里程清零
		fNightMilege = c_fStartMilege * (-1);		//	夜行里程置起步里程
	}
	else
	{
		uiNightRun = 0;								//	夜行标志
		fCurPrice = c_fPricePerKM;					//	执行昼行单价
		fCost = c_fStartPrice;						//	昼行起步价
		fDayMilege = c_fStartMilege * (-1);			//	白天行驶里程置起步里程
		fNightMilege = 0.0;							//	夜行里程清零
	}
}

//=============================================================
// 语法格式:	void Cost_StopRunning(void)
// 实现功能:	停止计费
// 参数:		无
// 返回值:		无
//=============================================================
void Cost_StopRunning(void)
{
	if(uiWaiting)
	{
		ulWaitTime += (Cal_ReadTimer(1) / 2);		//	计算低速等待时间
	}
	Dis_StopMessure();								//	停止里程测量
	Speed_Stop();									//	停止速度模拟
	uiWaiting = 0;
//	uiLongWay = 0;
}

//=============================================================
// 语法格式:	void Cost_ClearCost(void)
// 实现功能:	清除计费记录
// 参数:		无
// 返回值:		无
//=============================================================
void Cost_ClearCost(void)
{
	fCost = 0.0;
	fDayMilege = 0.0;
	fNightMilege = 0.0;
	fRevMilegePoint = 0.0;
	ulWaitTime = 0;
	uiWaiting = 0;
	uiLongWay = 0;
	fCurPrice = 0;
	Dis_ClearDistance();
}

//=============================================================
// 语法格式:	unsigned int Cost_WTimeToMilege(void)
// 实现功能:	将等待时间换算成公里数
// 参数:		无
// 返回值:		公里数(单位:公里)
//=============================================================
unsigned int Cost_WTimeToMilege(void)
{
	unsigned int uiRet;
	unsigned long int ulTemp;
	uiRet = 0;
	ulTemp = ulWaitTime / 60;
	if(uiWaiting)
		ulTemp += Cal_ReadTimer(1) / 120;
	if(ulTemp >= c_fFirstWaitTimeLimit)
	{
		ulTemp -= c_fFirstWaitTimeLimit;
		uiRet = 1;
		while(ulTemp >= c_fWaitTimeLimit)
		{
			uiRet++;
			ulTemp -= c_fWaitTimeLimit;
		}
	}
	return uiRet;
}

//=============================================================
// 语法格式:	float Cost_GetCost(void)
// 实现功能:	得到当前费用
// 参数:		无
// 返回值:		费用(单位:元)
//=============================================================
float Cost_GetCost(void)
{
	if(uiLongWay)									//	远距行驶
		return (fCost + (fDayMilege * c_fPricePerKM + fNightMilege * c_fNightPricePerKM) * c_fLongWayPrice + Cost_WTimeToMilege() * c_fWaitPrice);
	else
	{
		if((fDayMilege + fNightMilege) > 0)			//	超过起步里程
			return (fCost + fDayMilege * c_fPricePerKM + fNightMilege * c_fNightPricePerKM + Cost_WTimeToMilege() * c_fWaitPrice);
		else										//	没有超过起步里程
			return (fCost + Cost_WTimeToMilege() * c_fWaitPrice);
	}
}

//=============================================================
// 语法格式:	float Cost_GetPrice(void)
// 实现功能:	得到当前单价
// 参数:		无
// 返回值:		单价(单位:元)
//=============================================================
float Cost_GetPrice(void)
{
	return fCurPrice;
}

//=============================================================
// 语法格式:	unsigned long int Cost_GetWaitTime(void)
// 实现功能:	得到低速等待时间
// 参数:		无
// 返回值:		等待时间(单位:秒)
//=============================================================
unsigned long int Cost_GetWaitTime(void)
{
	if(uiWaiting)
		return (ulWaitTime + Cal_ReadTimer(1) / 2);
	else
		return ulWaitTime;
}

//=============================================================
// 语法格式:	unsigned int Cost_WaitOrNot(void)
// 实现功能:	是否处于等待状态
// 参数:		无
// 返回值:		0 :	否
//				1 :	是
//=============================================================
unsigned int Cost_WaitOrNot(void)
{
	return uiWaiting;
}

//=============================================================
// 语法格式:	void Cost_ServiceLoop(void)
// 实现功能:	计费服务程序,用来检测行驶速度,计算等待时间,
//				昼夜行驶判断,远距判断
// 参数:		无
// 返回值:		无
//=============================================================
void Cost_ServiceLoop(void)
{
	float fTemp;
	unsigned int Hour;
	//	低速判断
	if(uiWaiting == 1)
	{
		if(Dis_GetSpeed() >= c_fWaitSpeed2)
		{											//	低速等待时,检测到速度上升
			ulWaitTime += (Cal_ReadTimer(1) / 2);
			Cal_ClearTimer(1);
			uiWaiting = 0;							//	退出低速等待状态
		}
	}
	else if(Dis_GetSpeed() <= c_fWaitSpeed1)
	{												//	正常行驶时,检测到速度下降
		Cal_StartTimer(1);
		uiWaiting = 1;								//	进入低速等待状态
	}
	//	夜行判断
	fTemp = Dis_GetDistance();
	Hour = Cal_GetHour();
	if(uiNightRun)
	{												//	当前为夜行状态
		fNightMilege += (fTemp - fRevMilegePoint);	//	累加夜行里程
		if((Hour < c_uiNightTime1) && (Hour >= c_uiNightTime2))
		{											//	夜行转到昼行
			if(fNightMilege < 0)
			{
				fDayMilege = fNightMilege;
				fNightMilege = 0;
			}
			fCurPrice = c_fPricePerKM;
			uiNightRun = 0;
			if(uiLongWay)
				fCurPrice *= c_fLongWayPrice;
		}
	}
	else
	{												//	当前为昼行
		fDayMilege += (fTemp - fRevMilegePoint);	//	累加昼行里程
		if((Cal_GetHour() >= c_uiNightTime1) || (Cal_GetHour() < c_uiNightTime2))
		{											//	昼行转到夜行
			if(fDayMilege < 0)
			{
				fNightMilege = fDayMilege;
				fDayMilege = 0;
			}
			uiNightRun = 1;
			fCurPrice = c_fNightPricePerKM;
			if(uiLongWay)
				fCurPrice *= c_fLongWayPrice;
		}
	}
	fRevMilegePoint = fTemp;						//	更新昼行转换点的里程数
	//	远距判断
	if(0 == uiLongWay)
	{
		if(fTemp > c_fLongWayLimit)					//	如果当前行驶里程大于规定的远距里程数
		{
			uiLongWay = 1;
			fCost += (Cost_WTimeToMilege() + fDayMilege * c_fPricePerKM + fNightMilege * c_fNightPricePerKM);
													//	记录下此时的费用
													//	此后的费用按照远距单价计算
			fDayMilege = 0;
			fNightMilege = 0;
			fCurPrice *= c_fLongWayPrice;			//	单价更新为远距离单价
		}
	}
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -