📄 jbmcomm.c
字号:
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()
/************************************************************
*
* 函 数:OldDDDClass()
* 说 明:OLD模式接收国内级数表
*
***********************************************************/
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()
/************************************************************
*
* 函 数:OldLocalClass()
* 说 明:OLD模式接收本地级数表
*
***********************************************************/
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()
/************************************************************
*
* 函 数:OldIDDTariff()
* 说 明:OLD模式接收国际区号表
*
***********************************************************/
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()
/************************************************************
*
* 函 数:OldDDDTariff()
* 说 明:OLD模式接收国内区号表
*
***********************************************************/
void OldDDDTariff(void)
{
byte bTemp;
uint iAddr;
TxCmd(OK);
if(!RxPaNe())
return;
if(!RxData())
return;
iAddr=OLD_IDD_TARIFF_ADDR;
while(TRUE){ // 计算国际区号表的结束地址
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()
/************************************************************
*
* 函 数:OldLocalTariff()
* 说 明:OLD模式本地区号表
*
***********************************************************/
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()
/************************************************************
*
* 函 数:OldQueryBills()
* 说 明:OLD模式下传指定话单数据
*
***********************************************************/
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); // 缓存匹配号码数组
TxCmd(OK);
}
// End function: OldQueryBills()
/************************************************************
*
* 函 数:OldReportQueryBills()
* 说 明:OLD模式回报指定话单
*
***********************************************************/
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++){ // 存储找到的话单入aDataBuf
Page(1);
bTemp=XBYTE[iAddr+j];
Page(5);
if(j==0){
if(bTemp==0x0c); // 被叫号码
else if((bTemp==0x0d)||(bTemp>0x29)) // 异常号码
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()
/************************************************************
*
* 函 数:SelectBill()
* 说 明:OLD/NEW模式从话单存储区中选定一张指定话单,
* 找到一张,返回TRUE,否则返回FALSE,
* 查找的起始地址为入口参数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()
/************************************************************
*
* 函 数:OldClock()
* 说 明:OLD/NEW模式接收实时时钟
*
***********************************************************/
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走时
XBYTE[RTC_CONTROLB]=0x92;
Page(5);
// 存储实时时钟
for(i=0,Point=0xc000;i<10;i++,Point++){
bTemp=aDataBuf[i];
Page(6);
*Point=bTemp;
Page(5);
}
Page(6); // 启动12887继续走时
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++){ // 准备被叫数据
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()
/************************************************************
*
* 函 数:NewComm()
* 说 明:NEW模式下传数据交换过程
* bStatusWord=S_NEWUPCALL和S_NEWDOWNCALL时调用.
*
***********************************************************/
void NewComm(void)
{
byte bTemp;
byte bRecord=0;
uint iCommFail;
bDlpReason=0;
bErrorCode=ERR_NO;
// NEW模式上呼通信准备
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模式下传通信准备
TxCmd(OK);
bCallReason=DYNAMIC_PASSWORD; // 接收动态密码
}
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)
// 接收下一条命令或进行出错处理:
if(bDlpReason!=0)
return;
if((bErrorCode!=ERR_NO)||(!RxCmd())){
// 2001-03-15 15:30 add 避免通讯不成功时,写入不完整的数据 yxw,更改校验和
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; // 参数越限
return;
}
if(!RxData())
return;
GeneralWriteData(NEW_MANAGEMENT_ADDR);
bParaByte=CalcCSSubA(NEW_MANAGEMENT_ADDR,iPaNeNum);
TxCmd(OK);
}
/***************************************************************
*
*
* 函 数: QueryVersion()
* 说 明: NEW模式上传测试参数(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); // 寻问管理机下一命令
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()
/***************************************************************
*
* 函 数: NewTest()
* 说 明: NEW模式上传测试参数
*
**************************************************************/
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); // 寻问管理机下一命令
}
// End function: NewTest()
/***************************************************************
*
* 函 数: NewReportBills()
* 说 明: NEW模式自动回报话单
* 命令代码:NEW_REPORT_BILLS=0x70.
*
**************************************************************/
void NewReportBills(void)
{
byte j,bTemp;
uint i,cNoReport; // 处理500张话单自动回报
uint ciBills;
TxCmd(NEW_REPORT_BILLS);
if(!RxCmd())
return;
if(bRecSBUF!=OK){
bErrorCode=ERR_05;
return;
}
// 计算需回报话单的Pa,Ne:
AutoReadPara(69);
cNoReport=iParaWord; //要汇报话单数量
ciBills=iParaWord*NEW_BILL_LEN; //要汇报话单长度
bPaBuf=(byte)(ciBills/128);
bNeBuf=(byte)(ciBills%128);
if(bNeBuf==0){
bNeBuf=128;
--bPaBuf;
}
if(!TxPaNe())
return;
// 从话单存储区取内容到aDataBuf[]缓冲区:
AutoReadPara(68); //汇报话单指针
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()
/***************************************************************
*
* 函 数: NewDayTotal()
* 说 明: NEW模式上传日分项合计值
* 命令代码: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;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -