📄 cost.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 + -