?? jbdata.c
字號:
/*******************************************************
*
* 文 件: jbdata.c
* 功 能: 存放通信過程中的子函數
*
******************************************************/
#include <jbData.h>
//#pragma SRC
//#pragma DEBUG
/************************************************************
*
* 函 數:Dial()
* 功 能:Modem撥號
* 出 口:聯絡成功,返回TRUE;出錯或聯絡失敗,返回FALSE。
*
***********************************************************/
bool Dial(void)
{
byte i,j,bTemp;
byte bRecallTimes;
CheckSumTest(); // 計算所有可檢驗參數檢驗和
memcpy(&aTestPara,&aNumBuf,9); // test
if(!fWorkMode){
AutoReadPara(211); // 初始化各種控制標志位
fbBuf1=bParaByte;
AutoReadPara(202);
AutoReadPara(204);
}
else{
AutoReadPara(13);
if(bParaByte!=0)
fDialForm=1;
AutoReadPara(01);
AutoReadPara(04);
}
for(i=0;i<8;i++){
aNumBuf[2*i]=aParaBuf[i]>>4;
aNumBuf[2*i+1]=aParaBuf[i]&0x0f;
}
if(!fWorkMode)
memset(&aNumBuf[8],0x0c,8); // OLD模式,只使用8個號碼
bRecallTimes=bParaByte&0x0f;
DispClr();
DispSymbol(LARGE_PHONE);
Delay5MS(255);
Close(RLY);
do{
Close(POWER_ON);
DispClr();
DispSymbol(LARGE_PHONE);
Close(MLD);
DelaySecond(3); // 掛機3秒
Open(MLD);
DispSymbol(LARGE_HOOK);
DispSymbol(LARGE_COMM);
MD_CLK=0;
DelaySecond(2);
// Open(POWER_ON);
if(fDialForm){
WriteModem(CR1,0x00);
WriteModem(CR0,0x1a);
}
for(i=0;i<16;i++) // 撥號
{
bTemp=aNumBuf[i];
if(bTemp==0x0c)
break;
if(i<11)
aLargeBuf[i]=aLCDSegment[bTemp];
DispSymbol(LARGE_HOOK);
bTemp=aNumBuf[i];
if(bTemp>9)
break;
else if(bTemp==0)
bTemp=0x0a;
if(fDialForm){
WriteModem(TR,bTemp);
WriteModem(CR0,0x1a);
bTemp=ReadModem(TR);
WriteModem(TR,(bTemp|0x10));
Delay5MS(21);
bTemp=ReadModem(TR);
WriteModem(TR,(bTemp&0xef));
WriteModem(CR0,0x00);
Delay5MS(20);
}
else{ // 脈沖撥號方式
for(j=0;j<bTemp;j++){
Close(MLD);
Delay5MS(13);
Open(MLD);
Delay5MS(7);
}
Delay5MS(80);
}
cbDelay5MS=5; // 發模擬撥號音
fDelay5MS=FALSE;
Page(6);
XBYTE[0xc00b]=0x1a;
Page(5);
while(!fDelay5MS)
IDLE;
}
MD_CLK=1;
WriteModem(CR1,0x04);
if(DetectConnectTone(0)) // 檢測通信聯絡音'D'
return TRUE;
}while(--bRecallTimes!=0);
bFailTimes=8;
return FALSE;
}
// End function: Dial()
/*********************************************************************
*
* 函 數: DetectConnectTone()
* 功 能: 接收通信聯絡音“D”;
* 入 口: bWhich=0:計費器主動上呼時調用,檢測到“D”,
* 返回TRUE,否則返回FALSE;等待時間為20秒;
* bWhich=1:管理機呼叫,計費器手動摘機時調用,檢測到“D”,
* 返回TRUE,否則返回假;等待時間由參數31決定;
* bWhich=2:管理機呼叫,計費器自動摘機時調用,檢測到“D”,
* 返回TRUE,否則發出三聲催摘音后,返回假。等待時間由參數31決定;
*
********************************************************************/
bool DetectConnectTone(byte bWhich)
{
byte bTemp,i;
byte bWaitTime; //單位:100ms
ResetModem();
if(bWhich==0)
bWaitTime=200;
else{
Open(MLD);
DispClr();
DispSymbol(LARGE_HOOK);
if(fWorkMode){
AutoReadPara(31);
bWaitTime=(byte)(iParaWord/20);
if(bWaitTime<16) //測‘D’音時長不能小于1600毫秒。
bWaitTime=16;
}
else{
AutoReadPara(51);
if((bParaByte&0x40)!=0)
bWaitTime=20;
else
bWaitTime=16;
}
Delay5MS(1);
Close(RLY);
}
while(TRUE){
cbDelay5MS=20;
fDelay5MS=0;
while(!fDelay5MS){
IDLE;
bTemp=ReadByte(IN_CE,6)&0x04;
if(bTemp!=0){
bTemp=ReadByte(DTMF_ENB,7)&0x0f;
if(bTemp==0){ //測到‘D’音
DispSymbol(LARGE_FLASH);
DispSymbol(LARGE_COMM);
// Open(POWER_ON);
return TRUE;
}
DispSymbol(LARGE_FLASH);
DispSymbol(LARGE_COMM);
// Open(POWER_ON);
return TRUE;
}
}
if(--bWaitTime==0) //超時退出
break;
}
DispSymbol(LARGE_FLASH);
DispSymbol(LARGE_COMM);
// Open(POWER_ON);
return TRUE;
//沒有測到‘D’音,提醒用戶摘機
if(bWhich==2){
Open(RLY); //自動摘機后,接話機
DispClr();
DispSymbol(LARGE_PHONE);
bTemp=3;
while(bTemp!=0){
--bTemp;
for(i=0;i<3;i++){
Speaker(18);
while(!fDelay5MS){
if(OffHook()){
i=100;
break;
}
IDLE;
}
Delay5MS(18);
}
if(i==100)
break;
bWaitTime=16; // 在1.6秒內等待摘機
i=0;
while(TRUE){
cbDelay5MS=20;
fDelay5MS=0;
while(!fDelay5MS){
IDLE;
if(OffHook()){
i=1;
break;
}
}
if(i!=0)
break;
if(--bWaitTime==0)
break;
}
} // End outside for(;;)
if(OffHook());
else{
Close(MLD);
fDelaySecond=1;
return FALSE;
}
}
if(bWhich==1) //手動摘機的情況
Open(RLY);
if(bWhich!=0){ //不是系統的呼叫
if(fWorkMode)
bStatusWord=S_NEWSLAVECALL;
else
bStatusWord=S_OLDSLAVECALL;
AutoReadPara(55);
if(bParaByte==1) //模擬負載延時斷開
ciiDelaySecond=4;
else{
Delay5MS(30);
Close(MLD);
ciiDelaySecond=3; //不并模擬負載
}
fiiDelaySecond=0;
}
return FALSE;
}
// End function: DetectConnectTone()
/*******************************************************************
*
* 函數名:ConnectModem()
* 功 能:計費器MODEM與管理系統MODEM卡的聯絡過程
* 用 途:管理機下傳和計費器上呼時
* 注 意:計費器 MODEM 處于應答模式,管理系統MODEM處于發起模式
*
******************************************************************/
bool ConnectModem(void)
{
byte bTemp;
bool fSelect=0;
EX0=1;
MD_CLK=0;
Delay5MS(4);
AutoReadPara(57);
if(bParaByte==1){ //300 bps
bParaByte=0;
AutoWritePara(77);
WriteModem(CR1,0x04);
WriteModem(CR0,0xb2);
WriteModem(TR,0x00);
WriteModem(CR1,0x10);
cbDelaySecond=8;
fDelaySecond=0;
while(1){
if(fDelaySecond)
return 0;
bTemp=ReadModem(DR);
if((bTemp&0x08)!=0){
Delay5MS(96);
TH1=L300;
TL1=L300;
break;
}
}
}
else{ //1200 bps
WriteModem(CR1,0x04);
DelaySecond(2);
Delay5MS(32);
WriteModem(CR1,0x04);
WriteModem(TR,0xa1);
WriteModem(CR0,0x1a);
WriteModem(CR1,0x90);
DelaySecond(3);
Delay5MS(120);
WriteModem(CR0,0x18);
Delay5MS(16);
WriteModem(TR,0xc0);
WriteModem(CR1,0x90);
WriteModem(CR0,0x1a);
Delay5MS(128);
cbDelaySecond=3;
fDelaySecond=0;
while(1){
if(fDelaySecond)
return FALSE;
bTemp=ReadModem(DR);
if((bTemp&0x08)!=0){
WriteModem(CR1,0x80);
Delay5MS(136);
WriteModem(TR,0x40);
WriteModem(CR1,0x00);
TH1=L1200;
TL1=L1200;
break;
}
}
}
EX1=0;
TI=0;
RI=0;
TR1=1;
REN=1;
ES=1;
bLastCmd=0xff;
fRxDataReady=0;
fTxDataReady=0;
return TRUE;
}
// End function: ConnectModem()
/***********************************************************
*
* 函數名:ResetModem()
* 功 能:初始化CML644A芯片
*
**********************************************************/
void ResetModem(void)
{
Page(7);
XBYTE[0x8001]=0x04;
Page(5);
MD_CLK=1;
}
// End function: ResetModem()
/*******************************************************************
*
* 函數名:ReadModem()
* 功 能:從CML644A中由bAddr指定的寄存器中讀出字節返回
*
*******************************************************************/
byte ReadModem(byte bAddr)
{
byte i;
Page(7);
i=XBYTE[0x8000+bAddr];
Page(5);
return i;
}
// End function: ReadModem()
/**********************************************************
*
*
* 函數名:WriteModem()
* 功 能:將bData寫入CML644A芯片bAddr寄存器
*
*
**********************************************************/
void WriteModem(byte bAddr,byte bTemp)
{
Page(7);
XBYTE[0x8000+bAddr]=bTemp;
Page(5);
}
// End function: WriteModem()
/******************************************************************
*
* 函數名:TxByte()
* 功 能:發送一個字節
*
******************************************************************/
bool TxByte(byte bByte)
{
SBUF=bByte;
while(!fTxDataReady) {;}
bLastCmd=0xff;
fTxDataReady=0;
return TRUE;
}
// End function: TxByte()
/******************************************************************
*
* 函數名:TxCmd()
* 功 能:往CBUS口發送一條命令
*
******************************************************************/
void TxCmd(byte bCmd)
{
FlashComm();
TxByte(bCmd);
TxByte(~bCmd);
bLastCmd=bCmd; //Add for Resend command
}
// End function: TxCmd()
/******************************************************************
*
* 函數名:RxByte()
* 功 能:接收一個字節
*
******************************************************************/
bool RxByte(void)
{
cbDelaySecond=SLAVE_TIME_OUT;
fDelaySecond=FALSE;
while(TRUE){
if(fRxDataReady){
fRxDataReady=FALSE;
return TRUE;
}
if(fWaitExit){
if(fKey){
fKey=0;
if(bKeyBuf==K1)
return TRUE;
}
continue;
}
if(fDelaySecond){
if(bErrorCode!=0x24)
bErrorCode=ERR_02;
return FALSE;
}
}
}
// End function: RxByte()
/******************************************************************
*
* 函數名:RxCmd()
* 功 能:從CBUS口接收一條命令
*
******************************************************************/
bool RxCmd(void)
{
bool fErrOneTime=FALSE;
byte i;
byte aTemp[2];
byte bSendTimes;
if(bStatusWord==S_SERVICE) // 在老模式的操作方式中,取消鍵無效
fWaitExit=0;
for(bSendTimes=0;bSendTimes<3;bSendTimes++){
for(i=0;i<2;i++){ // 用于重發命令,重發的命令存于bLastCmd
if(!RxByte()){
if(fErrOneTime)
return FALSE;
fErrOneTime=TRUE;
i=0xff;
continue;
}
if(fWaitExit){
if(bKeyBuf==K1){
bErrorCode=KEY_EXIT;
return TRUE;
}
}
if(fFirstCmd&&(i==0)&&
((bRecSBUF<0x30)||(bRecSBUF>0x90))){ //消除干擾
i=0xff;
continue;
}
aTemp[i]=bRecSBUF;
}
if(aTemp[0]==~aTemp[1]){
bRecSBUF=aTemp[0];
if((bLastCmd<0x99)&&(bRecSBUF==ERR_CS)){
TxByte(bLastCmd); //對方接收命令校驗出錯,重發上一個命令
TxByte(~bLastCmd);
continue;
}
bLastCmd=0xff;
return TRUE;
}
TxCmd(ERR_CS);
}
bLastCmd=0xff;
bErrorCode=ERR_08;
return FALSE;
}
// End function: RxCmd()
/******************************************************************
*
* 函數名: RxFirstOK()
* 功 能: 上呼時接收第一個OK
*
******************************************************************/
bool RxFirstOK(void)
{
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -