?? jbmcall.c
字號:
ReadBytes(1,1);
return(bParaByte);
}
//以下判斷日常折扣情況
iAddress=0xebd8; // Get Out Usuall Day Discount
ReadBytes(1,4);
if(CheckTabSpecial())
fDayDiscount=1;
WaitRTC();
Page(6);
bTemp=(XBYTE[0xc006]&0x0f)-1;
Page(5);
iAddress=0xec00;
ReadBytes(1,1); //讀周六、周日折扣控制
if((((bParaByte&0x01)!=0)&&(bTemp==0x06))
||(((bParaByte&0x02)!=0)&&(bTemp==0x00)))
fDayDiscount=1;
bParaByte=100;
if(fDayDiscount){
switch(bIDL){
case 0:
iAddress=0xebfe;
break;
case 1:
iAddress=0xebfc;
break;
case 2:
iAddress=0xebfa;
break;
}
ReadBytes(1,1);
}
return bParaByte;
}
/*******************************************************************
*
*
* 功 能:檢查當前時間是否到了使用第二費率率表的時間
* 返回1 :使用第二費率表
* 返回0 :使用第一費率表
*
*
********************************************************************/
void NewNo2Tariff(void)
{
/*
fNo2Tariff=0;
iAddress=PARA_21;
ReadBytes(1,1); //讀年高位
ReadBytes(1,5);
aParaBuf[5]=bParaByte;
if(CheckTable(6)){
ReadBytes(1,1); //讀年高位
ReadBytes(1,6);
aParaBuf[5]=bParaByte;
if(!CheckTable(6))
fNo2Tariff=1;
}
*/
fNo2Tariff=0;
iAddress=PARA_21+1;
ReadBytes(1,5);
if(JudgeCC(5)){ // 起始年月日為CC
iAddress++;
ReadBytes(1,5);
if(JudgeCC(5)){ // 終止年月日也為CC
aParaBuf[0]=ReadByte(PARA_21+4,1); // 只比較分
aParaBuf[1]=ReadByte(PARA_21+5,1);
aParaBuf[2]=ReadByte(PARA_22+4,1);
aParaBuf[3]=ReadByte(PARA_22+5,1);
if(CheckTabSpecial())
fNo2Tariff=1;
return;
}
}
iAddress=PARA_21;
ReadBytes(1,1); // 讀年高位
ReadBytes(1,5);
aParaBuf[5]=bParaByte;
if(CheckTable(6)){
ReadBytes(1,1); // 讀年高位
ReadBytes(1,6);
aParaBuf[5]=bParaByte;
if(!CheckTable(6))
fNo2Tariff=1;
}
}
void OldNo2Tariff(void)
{
fNo2Tariff=0;
iAddress=PARA_213;
ReadBytes(1,4);
if(JudgeCC(4)){ //起始年月日為CC
ReadBytes(1,4);
if(JudgeCC(4)){ //終止年月日也為CC
aParaBuf[0]=ReadByte(iAddress-5,1); //只比較分
aParaBuf[2]=ReadByte(iAddress-1,1);
aParaBuf[3]=aParaBuf[1]=0;
if(CheckTabSpecial())
fNo2Tariff=1;
return;
}
iAddress=PARA_213;
ReadBytes(1,4);
}
aParaBuf[4]=0;
if(CheckTable(4)){
ReadBytes(1,4);
aParaBuf[4]=0;
if(!CheckTable(4))
fNo2Tariff=1;
}
}
bool JudgeCC(byte bLength)
{
byte p2[5];
memset(p2,0xcc,5);
if(memcmp(p2,aParaBuf,bLength)==0x00)
return FALSE;
if(memcmp(p2,aParaBuf,3)==0x00)
return TRUE;
return FALSE;
}
/*************************************************************
*
* Function Name: CheckTabSpecial()
* Function: 比較當前時刻是否在折扣時間之中
* InPut: 折扣時間(*p)
* aParaBuf[0]:時(起始)
* aParaBuf[1]:分(起始)
* aParaBuf[2]:時(結束)
* aParaBuf[3]:分(結束)
* OutPut: 若當前時刻為扣時間(*aParaBuf),則返回 1
* 若當前時刻不為折扣時間(*aParaBuf),則返回 0
*
**************************************************************/
bool CheckTabSpecial(void)
{
byte bHour,bMinute;
WaitRTC();
Page(6);
bHour=XBYTE[0xc004];
bMinute=XBYTE[0xc002]; // p[4] p[0] p[1] p[2] p[3]
Page(5);
if((aParaBuf[0]==0xcc)&&(aParaBuf[2]==0xcc)){ // StartTime: cc ** EndTime: cc **
if(aParaBuf[1]<=aParaBuf[3]){
if((bMinute>=aParaBuf[1])&&(bMinute<aParaBuf[3]))
return 1;
}
else{
if((bMinute>=aParaBuf[1])||(bMinute<aParaBuf[3]))
return 1;
}
return 0;
} // p[4] p[0] p[1] p[2] p[3]
if((aParaBuf[0]==0xcc)&&(aParaBuf[3]==0xcc)){ // StartTime: cc ** EndTime: ** cc
if((bMinute>=aParaBuf[1])&&(bHour<aParaBuf[2]))
return 1;
return 0;
}
if((aParaBuf[1]==0xcc)&&(aParaBuf[2]==0xcc)){ // StartTime: ** cc EndTime: cc **
if((bHour>=aParaBuf[0])&&(bMinute<aParaBuf[3]))
return 1;
return 0;
}
if((aParaBuf[1]==0xcc)&&(aParaBuf[3]==0xcc)){ // StartTime: ** cc EndTime: ** cc
if(aParaBuf[0]<=aParaBuf[2]){
if((bHour>=aParaBuf[0])&&(bHour<aParaBuf[2]))
return 1;
}
else {
if((bHour>=aParaBuf[0])||(bHour<aParaBuf[2]))
return 1;
}
return 0;
}
if((aParaBuf[0]<aParaBuf[2])||
((aParaBuf[0]==aParaBuf[2])&&
(aParaBuf[1]<=aParaBuf[3]))){
if(((bHour>aParaBuf[0])||((bHour==aParaBuf[0])&&(bMinute>=aParaBuf[1])))&&
((bHour<aParaBuf[2])||((bHour==aParaBuf[2])&&(bMinute<aParaBuf[3]))))
return 1;
}
else{
if((bHour>aParaBuf[0])
||((bHour==aParaBuf[0])&&(bMinute>=aParaBuf[1]))
||(bHour<aParaBuf[2])
||((bHour==aParaBuf[2])&&(bMinute<aParaBuf[3])))
return 1;
}
return 0;
}
/*************************************************************
*
* Function Name: CheckTable()
* Function: 比較當前時刻是否在折扣時間之后
* InPut: 折扣時間(*p1)、要比較時間的長度(Length)
*
*
* OutPut: 若當前時刻大于或等于折扣時間(*p1),則返回 1
* 若當前時刻小于折扣時間(*p1),則返回 0
*
**************************************************************/
bool CheckTable(byte bLength)
{
byte i;
byte aRTC[6];
memset(aRTC,0xcc,6);
if(memcmp(aRTC,aParaBuf,bLength)==0x00) //是否全為CC
return 1;
WaitRTC();
Page(6);
aRTC[0]=XBYTE[0xc009];
aRTC[1]=XBYTE[0xc008];
aRTC[2]=XBYTE[0xc007];
aRTC[3]=XBYTE[0xc004];
aRTC[4]=XBYTE[0xc002];
aRTC[5]=aUserRTCBuf[YEARH]; //由于要比較年高位的地方只有一處,
Page(5); //故將其單獨進行比較
if((bLength==6)&&(aParaBuf[5]<0x99)){ //bLength等于6時,要比較年高位
if(aRTC[5]<aParaBuf[5])
return FALSE;
else if(aRTC[5]>aParaBuf[5])
return TRUE;
}
if(aParaBuf[0]!=0xcc){
if((aRTC[0]>0x90)&&(aParaBuf[0]<0x80))
return FALSE;
if((aParaBuf[0]>0x90)&&(aRTC[0]<0x80))
return TRUE;
}
for(i=0;i<5;i++){
if(aParaBuf[i]==0xcc)
continue;
if(aRTC[i]==aParaBuf[i])
continue;
else if(aRTC[i]<aParaBuf[i])
return FALSE;
else
return TRUE;
}
return TRUE;
}
/*****************************************************************
*
*
* Function Name: FeeCalc();
* Function: 計算折扣后的費率
*
*
******************************************************************/
uint FeeCalc(uint bFee,byte bFactor)
{
uint iTemp;
ulint lTemp;
if(bFactor>100)
bFactor=100;
lTemp=((ulint)bFee)*((ulint)bFactor);
iTemp=(uint)(lTemp/100);
lTemp=lTemp%100;
if(lTemp!=0)
iTemp++;
return iTemp;
}
/************************************************************
*
* Function Name: SaveRecord(void)
* Function: 存儲當前話單記錄
*
*
*
************************************************************/
void SaveRecord(void)
{
byte i,j;
byte aTemp[4];
uint xdata iTemp;
memset(&aNumBuf[pReadNumber],0x0c,(16-pReadNumber)); //
AutoReadPara(67);
if(fWorkMode){
if(!fSaveFreeTalk&&(bClass==1))
return;
if(iParaWord>=500)
iParaWord=0;
iAddress=NEW_BILLS_ADDR+(iParaWord*NEW_BILL_LEN);
if((++iParaWord)==500)
iParaWord=0;
}
else{
if(iParaWord>=200)
iParaWord=0;
iAddress=OLD_BILLS_ADDR+(iParaWord*15);
if((++iParaWord)==200)
iParaWord=0;
}
AutoWritePara(67);
if(fWorkMode){
i=0;
for(j=0;j<8;j++){
aDataBuf[j]=aNumBuf[i++]<<4;
aDataBuf[j]+=aNumBuf[i++];
}
aDataBuf[8]=(byte)(iTotalTime/3600);
iTemp=iTotalTime%3600;
i=(byte)(iTemp/60);
aDataBuf[9]=((i/10)<<4)+(i%10);
i=(byte)(iTemp%60);
aDataBuf[10]=((i/10)<<4)+(i%10);
SaveFee(11,4);
SaveFee(14,0);
SaveFee(17,1);
SaveFee(20,2);
for(i=23,j=1;j<7;i++,j++)
aDataBuf[i]=aCallTime[j];
aDataBuf[29]=bStartMode;
i=NEW_BILL_LEN;
}
else{
i=bIDL;
switch(bIDL){
case 0:
aDataBuf[0]=aNumBuf[i];
break;
case 1:
aDataBuf[0]=aNumBuf[i]|0x10;
break;
case 2:
aDataBuf[0]=aNumBuf[i]|0x20;
break;
}
i++;
for(j=1;j<7;j++){
aDataBuf[j]=aNumBuf[i++]<<4;
aDataBuf[j]+=aNumBuf[i++];
}
aTemp[0]=(byte)(iTotalTime&0xff);
aTemp[1]=(byte)((iTotalTime>>8)&0xff);
aTemp[2]=(byte)((lTotalTariff>>16)&0xff);
aDataBuf[7]=(aTemp[0]>>6)&0x03;
aDataBuf[7]+=(aTemp[1]<<2)&0xfc;
aDataBuf[8]=aTemp[2]&0x03;
aDataBuf[8]+=(aTemp[0]<<2)&0xfc;
aDataBuf[9]=(byte)((lTotalTariff>>8)&0xff);
aDataBuf[10]=(byte)(lTotalTariff&0xff);
aDataBuf[11]=aCallTime[MONTH];
aDataBuf[12]=aCallTime[DAY];
aDataBuf[13]=aCallTime[HOUR];
aDataBuf[14]=aCallTime[MINUTE];
i=15;
}
//
iPaNeNum=i;
GeneralWriteData(iAddress);
//以下判斷話單是否正確被寫到FLASH中
Delay5MS(20);
ReadData(1,iAddress,i,&aDataBuf[30]);
if(memcmp(&aDataBuf,&aDataBuf[30],i)==0x00){ //話單寫入正確
if((bReportWord==1)||(bReportWord==3)){
iAddress=PARA_69;
WriteTwoBytes(1); //未匯報話單數加一
// 判斷是否越界
AutoReadPara(69);
if(fWorkMode)
iTemp=500;
else
iTemp=200;
if(iParaWord>iTemp){
iParaWord=iTemp;
AutoWritePara(69);
}
}
else{ //不匯報話單
iParaWord=0;
AutoWritePara(69); //回報話單的數量
AutoReadPara(67); //更新回報話單指針
AutoWritePara(68);
}
}
else{
bErrorCode=ERR_22; //FLASH被寫壞報警
DispErrorCode();
}
lSubTariff+=lTotalTariff; //兩次鎖機之間的話費及通話次數統計
iSubTimes++;
}
void SaveFee(byte bNo,byte bWhich)
{
ulint lTemp;
switch(bWhich){
case 0:
lTemp=lTotalF0;
break;
case 1:
lTemp=lTotalF1;
break;
case 2:
lTemp=lTotalF2;
break;
case 4:
lTemp=lTotalTariff;
break;
default:
return;
}
aDataBuf[bNo]=(byte)((lTemp>>16)&0xff);
aDataBuf[bNo+1]=(byte)((lTemp>>8)&0xff);
aDataBuf[bNo+2]=(byte)(lTemp&0xff);
}
/**************************************************************
*
* FuncName: SaveCurrentTime()
* Input: none
*
*************************************************************/
void SaveCurrentTime(void)
{
WaitRTC();
Page(6);
aCallTime[YEARH]=aUserRTCBuf[YEARH];
aCallTime[YEARL]=aUserRTCBuf[YEARL];
aCallTime[MONTH]=aUserRTCBuf[MONTH];
aCallTime[DAY]=aUserRTCBuf[DAY];
aCallTime[HOUR]=aUserRTCBuf[HOUR];
aCallTime[MINUTE]=aUserRTCBuf[MINUTE];
aCallTime[SECOND]=aUserRTCBuf[SECOND];
Page(5);
}
// End Function: SaveCurrentTime()
void Speaker(byte bTime)
{
cbDelay5MS=bTime;
fDelay5MS=0;
Page(6);
if(bTime>200)
XBYTE[RTC_CONTROLA]=0x25;
else
XBYTE[RTC_CONTROLA]=0x27;
XBYTE[RTC_CONTROLB]=0x1a;
Page(5);
return;
}
/***************************************************************
*
*
* Function Name: Falsh()
* Function: 閃爍通話標記或秒標記
* fType=1 閃爍通話標記
* fType=0 閃爍秒標記
*
*
*****************************************************************/
void Flash(bool fType)
{
if(cbDelay5MS==0){
cbDelay5MS=200;
fFlashOff=1;
}
if(cbDelay5MS==200){
if(fType)
DispSymbol(LARGE_FLASH);
else{
if((cbRingTimes!=0)||(cbRingPulseNum>=5));
else{
aSmallBuf[2]=0x20;
aLargeBuf[8]=0x20;
}
DispOut();
}
}
else if(fFlashOff&&(cbDelay5MS<100)){
fFlashOff=0;
if(fType)
DispSymbol(LARGE_UNFLASH);
else{
aLargeBuf[8]=0;
aSmallBuf[2]=0;
DispOut();
}
}
}
void SaveBaoBiao(void) //lmt add 2001.3.13
{
//byte i;
Page(5);
if(bIDL==2){
iAddress=ClassIDDAddress;
WriteTwoBytes(1);
iAddress+=2;
WriteTriBytes(lTotalTariff);
iAddress=TodayIDDAddress;
WriteTwoBytes(1);
iAddress+=2;
WriteTriBytes(lTotalTariff);
iAddress=MonthIDDAddress;
WriteTwoBytes(1);
iAddress+=2;
WriteTriBytes(lTotalTariff);
}
if(bIDL==1){
iAddress=ClassDDDAddress;
WriteTwoBytes(1);
iAddress+=2;
WriteTriBytes(lTotalTariff);
iAddress=TodayDDDAddress;
WriteTwoBytes(1);
iAddress+=2;
WriteTriBytes(lTotalTariff);
iAddress=MonthDDDAddress;
WriteTwoBytes(1);
iAddress+=2;
WriteTriBytes(lTotalTariff);
}
if(bIDL==0){
iAddress=ClassLOCALAddress;
WriteTwoBytes(1);
iAddress+=2;
WriteTriBytes(lTotalTariff);
iAddress=TodayLOCALAddress;
WriteTwoBytes(1);
iAddress+=2;
WriteTriBytes(lTotalTariff);
iAddress=MonthLOCALAddress;
WriteTwoBytes(1);
iAddress+=2;
WriteTriBytes(lTotalTariff);
}
Page(5);
}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -