?? 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 + -