?? jbmcomm.c
字號(hào):
if((bPaBuf!=OLD_IDD_CLASS_PA)||(bNeBuf!=OLD_IDD_CLASS_NE)){
bErrorCode=ERR_05;
return;
}
if(!RxData())
return;
GeneralWriteData(OLD_IDD_CLASS_ADDR);
bParaByte=CalcCSSubA(OLD_IDD_CLASS_ADDR,iPaNeNum);
AutoWritePara(226);
TxCmd(OK);
}
// End function: OldIDDClass()
/************************************************************
*
* 函 數(shù):OldDDDClass()
* 說 明:OLD模式接收國內(nèi)級(jí)數(shù)表
*
***********************************************************/
void OldDDDClass(void)
{
TxCmd(OK);
if(!RxPaNe())
return;
if((bPaBuf!=OLD_DDD_CLASS_PA)||(bNeBuf!=OLD_DDD_CLASS_NE)){
bErrorCode=ERR_05;
return;
}
if(!RxData())
return;
GeneralWriteData(OLD_DDD_CLASS_ADDR);
bParaByte=CalcCSSubA(OLD_DDD_CLASS_ADDR,iPaNeNum);
AutoWritePara(227);
TxCmd(OK);
}
// End function: OldDDDClass()
/************************************************************
*
* 函 數(shù):OldLocalClass()
* 說 明:OLD模式接收本地級(jí)數(shù)表
*
***********************************************************/
void OldLocalClass(void)
{
TxCmd(OK);
if(!RxPaNe())
return;
if((bPaBuf!=OLD_LOCAL_CLASS_PA)||(bNeBuf!=OLD_LOCAL_CLASS_NE)){
bErrorCode=ERR_05;
return;
}
if(!RxData())
return;
GeneralWriteData(OLD_LOCAL_CLASS_ADDR);
bParaByte=CalcCSSubA(OLD_LOCAL_CLASS_ADDR,iPaNeNum);
AutoWritePara(228);
TxCmd(OK);
}
// End function: OldLocalClass()
/************************************************************
*
* 函 數(shù):OldIDDTariff()
* 說 明:OLD模式接收國際區(qū)號(hào)表
*
***********************************************************/
void OldIDDTariff(void)
{
TxCmd(OK);
if(!RxPaNe())
return;
if(!RxData())
return;
if((OLD_IDD_TARIFF_ADDR+iPaNeNum)<0xe000){
bErrorCode=ERR_16;
return;
}
GeneralWriteData(OLD_IDD_TARIFF_ADDR);
bParaByte=CalcCSSubB(OLD_IDD_TARIFF_ADDR);
AutoWritePara(229);
TxCmd(OK);
}
// End function: OldIDDTariff()
/************************************************************
*
* 函 數(shù):OldDDDTariff()
* 說 明:OLD模式接收國內(nèi)區(qū)號(hào)表
*
***********************************************************/
void OldDDDTariff(void)
{
byte bTemp;
uint iAddr;
TxCmd(OK);
if(!RxPaNe())
return;
if(!RxData())
return;
iAddr=OLD_IDD_TARIFF_ADDR;
while(TRUE){ // 計(jì)算國際區(qū)號(hào)表的結(jié)束地址
Page(1);
bTemp=XBYTE[iAddr];
Page(5);
if(++iAddr==0xffff){
bErrorCode=ERR_16;
return;
}
if(bTemp==0xff)
break;
}
iAddr+=0x20;
if((iAddr+iPaNeNum)<0xe000){
bErrorCode=ERR_17;
return;
}
GeneralWriteData(iAddr);
aDataBuf[0]=((byte)(iAddr>>8))&0x3f;
aDataBuf[1]=(byte)(iAddr&0x00ff);
aDataBuf[2]=aDataBuf[0]+aDataBuf[1];
WriteData(1,PARA_232,3,&aDataBuf);
bParaByte=CalcCSSubB(iAddr);
AutoWritePara(230);
TxCmd(OK);
}
// End function: OldDDDTatiff()
/************************************************************
*
* 函 數(shù):OldLocalTariff()
* 說 明:OLD模式本地區(qū)號(hào)表
*
***********************************************************/
void OldLocalTariff(void)
{
uint iAddr;
TxCmd(OK);
if(!RxPaNe())
return;
if(!RxData())
return;
iAddr=0x10000-iPaNeNum;
if(iAddr<0xf310){
bErrorCode=ERR_18;
return;
}
GeneralWriteData(iAddr);
aDataBuf[0]=((byte)(iAddr>>8))&0x3f;
aDataBuf[1]=(byte)(iAddr&0x00ff);
aDataBuf[2]=aDataBuf[0]+aDataBuf[1];
WriteData(1,PARA_233,3,&aDataBuf);
bParaByte=CalcCSSubB(iAddr);
AutoWritePara(231);
TxCmd(OK);
}
// End function: OldLocalTariff()
/************************************************************
*
* 函 數(shù):OldQueryBills()
* 說 明:OLD模式下傳指定話單數(shù)據(jù)
*
***********************************************************/
void OldQueryBills(void)
{
TxCmd(OK);
if(!RxPaNe())
return;
if((bPaBuf!=OLD_QUERYBILL_PA)||(bNeBuf!=OLD_QUERYBILL_NE)){
bErrorCode=ERR_05;
return;
}
if(!RxData())
return;
memcpy(&aNumBuf,&aDataBuf,7); // 緩存匹配號(hào)碼數(shù)組
TxCmd(OK);
}
// End function: OldQueryBills()
/************************************************************
*
* 函 數(shù):OldReportQueryBills()
* 說 明:OLD模式回報(bào)指定話單
*
***********************************************************/
void OldReportQueryBills(void)
{
byte i,j,bTemp;
uint iAddr;
uint ciBills;
TxCmd(OLD_REPORT_QUERYBILLS);
if(!RxCmd())
return;
if(bRecSBUF!=OK){
bErrorCode=ERR_05;
return;
}
ciBills=0;
iAddr=OLD_BILLS_ADDR;
for(i=0;i<200;i++,iAddr+=OLD_BILL_LEN){
if(!SelectBill(iAddr))
continue;
for(j=0;j<OLD_BILL_LEN;j++){ // 存儲(chǔ)找到的話單入aDataBuf
Page(1);
bTemp=XBYTE[iAddr+j];
Page(5);
if(j==0){
if(bTemp==0x0c); // 被叫號(hào)碼
else if((bTemp==0x0d)||(bTemp>0x29)) // 異常號(hào)碼
break;
}
aDataBuf[ciBills++]=bTemp;
}
}
if(ciBills==0){
bPaBuf=0;
bNeBuf=0;
}
else{
bPaBuf=(byte)(ciBills/128);
bNeBuf=(byte)(ciBills%128);
if(bNeBuf==0){
bNeBuf=128;
--bPaBuf;
}
}
if(!TxPaNe())
return;
if(ciBills!=0){
if(!TxData())
return;
}
TxCmd(EQ);
}
// End function: OldReportQueryBills()
/************************************************************
*
* 函 數(shù):SelectBill()
* 說 明:OLD/NEW模式從話單存儲(chǔ)區(qū)中選定一張指定話單,
* 找到一張,返回TRUE,否則返回FALSE,
* 查找的起始地址為入口參數(shù)iAddr.
*
***********************************************************/
bool SelectBill(uint iAddr)
{
byte i,j;
byte bTemp0,bTemp1;
byte data aTemp[16];
if(aNumBuf[0]==0xcc)
return TRUE;
iAddress=iAddr;
if(fWorkMode){
ReadBytes(1,8);
for(i=0;i<8;i++){
aTemp[2*i]=aParaBuf[i]>>4;
aTemp[2*i+1]=aParaBuf[i]&0x0f;
}
memset(aParaBuf,0xcc,8);
if(aTemp[0]!=0){
i=1;
aParaBuf[0]=aTemp[0];
}
else if(aTemp[1]!=0){
i=2;
aParaBuf[0]=aTemp[1]|0x10;
}
else{
i=3;
aParaBuf[0]=aTemp[2]|0x20;
}
for(j=1;j<8;j++){
aParaBuf[j]=aTemp[i++]<<4;
if(i==16){
aParaBuf[j]+=0x0c;
break;
}
aParaBuf[j]+=aTemp[i++];
if(i==16)
break;
}
j=8;
}
else{
ReadBytes(1,7);
j=7;
}
for(i=0;i<j;i++){
bTemp0=aNumBuf[i];
bTemp1=aParaBuf[i];
if(bTemp0==0xcc)
return TRUE;
else if((bTemp0&0x0f)==0x0c){
if((bTemp1&0xf0)==(bTemp0&0xf0))
return TRUE;
else
return FALSE;
}
else if(bTemp1!=bTemp0){
return FALSE;
}
}
return TRUE;
}
// End function: SelectBill()
/************************************************************
*
* 函 數(shù):OldClock()
* 說 明:OLD/NEW模式接收實(shí)時(shí)時(shí)鐘
*
***********************************************************/
void OldClock(void)
{
byte i,bTemp;
byte xdata *Point;
TxCmd(OK);
if(!RxPaNe())
return;
if((bPaBuf!=OLD_CLOCK_PA)||(bNeBuf!=OLD_CLOCK_NE)){
bErrorCode=ERR_05;
return;
}
if(!RxData())
return;
Page(6); // 暫停12887走時(shí)
XBYTE[RTC_CONTROLB]=0x92;
Page(5);
// 存儲(chǔ)實(shí)時(shí)時(shí)鐘
for(i=0,Point=0xc000;i<10;i++,Point++){
bTemp=aDataBuf[i];
Page(6);
*Point=bTemp;
Page(5);
}
Page(6); // 啟動(dòng)12887繼續(xù)走時(shí)
XBYTE[RTC_CONTROLB]=0x12;
Page(5);
TxCmd(OK);
}
// End function: OldClock()
void OldScallTotal(byte bType)
{
byte i,bTemp;
uint iAddr;
if(bType==OLD_SCALL_TOTAL)
TxCmd(OLD_SCALL_TOTAL);
else
TxCmd(NEW_SCALL_TOTAL);
if(!RxCmd())
return;
bPaBuf=OLD_SCALLTOTAL_PA;
bNeBuf=OLD_SCALLTOTAL_NE;
if(!TxPaNe())
return;
for(i=0,iAddr=PARA_65;i<bNeBuf;i++){ // 準(zhǔn)備被叫數(shù)據(jù)
Page(6);
bTemp=XBYTE[iAddr++];
Page(5);
aDataBuf[i]=bTemp;
}
if(!TxData())
return;
Page(6); // 清除被叫記錄
for(i=0,iAddr=PARA_65;i<bNeBuf;i++)
XBYTE[iAddr++]=0;
Page(5);
TxCmd(EQ);
}
// End function: OldScallTotal()
/************************************************************
*
* 函 數(shù):NewComm()
* 說 明:NEW模式下傳數(shù)據(jù)交換過程
* bStatusWord=S_NEWUPCALL和S_NEWDOWNCALL時(shí)調(diào)用.
*
***********************************************************/
void NewComm(void)
{
byte bTemp;
byte bRecord=0;
uint iCommFail;
bDlpReason=0;
bErrorCode=ERR_NO;
// NEW模式上呼通信準(zhǔn)備
if(bStatusWord==S_NEWUPCOMM){
SendTelNum(0);
while(1){
if(RxCmd())
break;
if(bRecSBUF==OK)
break;
else
bErrorCode=ERR_04;
ExitPro();
return;
}
if((bCallReason==OLD_TEST)||(bCallReason==OLD_REPORT_BILLS))
bCallReason=NEW_TEST;
if(bCallReason==NEW_TEST)
bRecord=1;
}
else{ // NEW模式下傳通信準(zhǔn)備
TxCmd(OK);
bCallReason=DYNAMIC_PASSWORD; // 接收動(dòng)態(tài)密碼
}
fWorkMode=1;
while(TRUE)
{
iCommFail=0;
if(bCallReason==DYNAMIC_PASSWORD)
bTemp=bCallReason;
else{
bTemp=SearchCmd(bCallReason);
DispCmd(bTemp); // 顯示通信代碼
}
if(bTemp==0xff)
break;
switch(bCallReason){
case NEW_MANAGEMENT_PARA:
ManageNumber();
break;
case DYNAMIC_PASSWORD: // 0x09
DynamicPassword();
break;
case NEW_SYSTEM: // 0x60
NewSystem();
break;
case NEW_DISCOUNT: // 0x61
iCommFail=PARA_91;
NewDiscount();
break;
case NEW_CALLSTATION: // 0x62
NewCallStation();
break;
case NEW_IDD_CLASS: // 0x63
iCommFail=PARA_93;
NewIDDClass();
break;
case NEW_DDD_CLASS: // 0x64
iCommFail=PARA_94;
NewDDDClass();
break;
case NEW_LOCAL_CLASS: // 0x65
iCommFail=PARA_95;
NewLocalClass();
break;
case NEW_IDD_TARIFF: // 0x66
iCommFail=PARA_96;
NewIDDTariff();
break;
case NEW_DDD_TARIFF: // 0x67
iCommFail=PARA_97;
NewDDDTariff();
break;
case NEW_LOCAL_TARIFF: // 0x68
iCommFail=PARA_98;
NewLocalTariff();
break;
case NEW_CLOCK: // 0x69
OldClock();
break;
case NEW_QUERY_PARA: // 0x6a
NewQueryPara();
break;
case NEW_QUERY_BILLS: // 0x6c
NewQueryBills();
break;
case NEW_REPORT_BILLS: // 0x70
NewReportBills();
break;
case NEW_REPORT_QUERYBILLS: // 0x71
NewReportQueryBills();
break;
case NEW_TEST: // 0x73
NewTest();
break;
case NEW_DAYTOTAL: // 0x74
NewDayTotal();
break;
case NEW_POWERONOFF: // 0x75
NewPowerOnOff();
break;
case NEW_SCALL_TOTAL: // 0x76
OldScallTotal(bCallReason);
break;
case NEW_EXPAND_PARA: // 0x77
NewExpandPara();
break;
case QUERY_VERSION: // 0x81
QueryVersion();
break;
default: // 收到異常命令
bErrorCode=ERR_33;
break;
} // End switch(bCallReason)
// 接收下一條命令或進(jìn)行出錯(cuò)處理:
if(bDlpReason!=0)
return;
if((bErrorCode!=ERR_NO)||(!RxCmd())){
// 2001-03-15 15:30 add 避免通訊不成功時(shí),寫入不完整的數(shù)據(jù) yxw,更改校驗(yàn)和
if((iCommFail>=PARA_91)&&(iCommFail<PARA_99)){
Page(6);
XBYTE[PARA_76]=1;
Page(5);
}
break;
}
if(bRecSBUF==END){
AutoReadPara(47);
if(bParaByte!=0x99){
bParaByte=0x99;
AutoWritePara(47);
ClrRam();
}
if(bRecord==2)
bCallReason=NEW_TEST;
break;
}
bCallReason=bRecSBUF;
if(bCallReason==NEW_CLOCK)
bRecord++;
else
bRecord=0;
} // End while(TRUE);
ExitPro();
}
// End function: NewComm()
void ManageNumber(void)
{
TxCmd(OK);
if(!RxPaNe())
return;
if(iPaNeNum>NEW_MANAGEMENT_LIMIT){
bErrorCode=ERR_05; // 參數(shù)越限
return;
}
if(!RxData())
return;
GeneralWriteData(NEW_MANAGEMENT_ADDR);
bParaByte=CalcCSSubA(NEW_MANAGEMENT_ADDR,iPaNeNum);
TxCmd(OK);
}
/***************************************************************
*
*
* 函 數(shù): QueryVersion()
* 說 明: NEW模式上傳測試參數(shù)(0x81)
*
*
**************************************************************/
void QueryVersion()
{
TxCmd(QUERY_VERSION);
if(!RxCmd())
return;
if(bRecSBUF!=OK){
bErrorCode=ERR_05;
return;
}
bPaBuf=VERSION_PA; // 0x00
bNeBuf=VERSION_NE; // 0x0a
if(!TxPaNe())
return;
AutoReadPara(50);
memcpy(&aDataBuf,&aParaBuf,10);
if(!TxData())
return;
TxCmd(EQ); // 尋問管理機(jī)下一命令
if(!RxCmd())
return;
if(bRecSBUF==END){
bErrorCode=ERR_34;
return;
}
if(bRecSBUF!=DOWNLOAD_PROGRAM){
bErrorCode=ERR_05;
return;
}
bDlpReason=5;
EA=0;
}
// End function: QueryVersion()
/***************************************************************
*
* 函 數(shù): NewTest()
* 說 明: NEW模式上傳測試參數(shù)
*
**************************************************************/
void NewTest(void)
{
byte i;
TxCmd(NEW_TEST);
if(!RxCmd())
return;
if(bRecSBUF!=OK){
if(bRecSBUF==END)
bErrorCode=ERR_21;
else
bErrorCode=ERR_05;
return;
}
bPaBuf=NEW_TEST_PA; // 0x00
bNeBuf=NEW_TEST_NE; // 0x0a
if(!TxPaNe())
return;
i=0;
memcpy(&aDataBuf,&aTestPara,9); //
//aDataBuf[9]=0x99;
/*
#ifdef MODEM_TEST
for(i=0;i<9;i++)
aDataBuf[i]=~aDataBuf[i];
#endif
*/
if(!TxData())
return;
TxCmd(EQ); // 尋問管理機(jī)下一命令
}
// End function: NewTest()
/***************************************************************
*
* 函 數(shù): NewReportBills()
* 說 明: NEW模式自動(dòng)回報(bào)話單
* 命令代碼:NEW_REPORT_BILLS=0x70.
*
**************************************************************/
void NewReportBills(void)
{
byte j,bTemp;
uint i,cNoReport; // 處理500張?jiān)拞巫詣?dòng)回報(bào)
uint ciBills;
TxCmd(NEW_REPORT_BILLS);
if(!RxCmd())
return;
if(bRecSBUF!=OK){
bErrorCode=ERR_05;
return;
}
// 計(jì)算需回報(bào)話單的Pa,Ne:
AutoReadPara(69);
cNoReport=iParaWord; //要匯報(bào)話單數(shù)量
ciBills=iParaWord*NEW_BILL_LEN; //要匯報(bào)話單長度
bPaBuf=(byte)(ciBills/128);
bNeBuf=(byte)(ciBills%128);
if(bNeBuf==0){
bNeBuf=128;
--bPaBuf;
}
if(!TxPaNe())
return;
// 從話單存儲(chǔ)區(qū)取內(nèi)容到aDataBuf[]緩沖區(qū):
AutoReadPara(68); //匯報(bào)話單指針
ciBills=NEW_BILLS_ADDR+iParaWord*NEW_BILL_LEN;
iParaWord=0;
for(i=0;i<cNoReport;i++){
for(j=0;j<NEW_BILL_LEN;j++){
Page(1);
bTemp=XBYTE[ciBills++];
Page(5);
aDataBuf[iParaWord++]=bTemp;
}
if(ciBills>=(NEW_BILLS_ADDR+500*NEW_BILL_LEN))
ciBills=NEW_BILLS_ADDR;
}
if(!TxData())
return;
iParaWord=0;
AutoWritePara(69);
AutoReadPara(67);
AutoWritePara(68);
TxCmd(EQ);
}
// End function: NewReportBills()
/***************************************************************
*
* 函 數(shù): NewDayTotal()
* 說 明: NEW模式上傳日分項(xiàng)合計(jì)值
* 命令代碼:NEW_DAYTOTAL=0x74.
*
**************************************************************/
void NewDayTotal(void)
{
TxCmd(NEW_DAYTOTAL);
if(!RxCmd())
return;
if(bRecSBUF!=OK){
bErrorCode=ERR_05;
return;
}
bPaBuf=NEW_DAYTOTAL_PA; // 0x05;
bNeBuf=NEW_DAYTOTAL_NE; // 0x20;
if(!TxPaNe())
return;
GeneralReadData(1,NEW_DAYTOTAL_ADDR,iPaNeNum,&aDataBuf);
if(!TxData())
return;
?? 快捷鍵說明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號(hào)
Ctrl + =
減小字號(hào)
Ctrl + -