📄 jbserver.c
字号:
/*****************************************************************************
*
* 文件名: jbServer.c
*
* 说 明: JJF24-1B 维护程序源文件
*
*****************************************************************************/
//#pragma src
#include <jbServer.h>
/*****************************************************************************
*
* 函数名: Server
*
* 说 明: 维护模块主调度程序,并菜单显示和选择
*
*****************************************************************************/
void Server(void) // OK !
{
bool fLastEnd=1;
bMenuLevel=1;
bMenuSelect=CHANGE;
if(!CheckPassword()){ // 密码检查
fLockRequest=1;
bErrorCode=ERR_06;
DispErrorCode();
bStatusWord=S_HARDWAREINIT;
return;
}
fLockRequest=1;
fFDToneRequest=0;
AutoReadPara(36);
if(bParaByte<10)
bParaByte=10;
cbDelaySecond=bParaByte;
fDelaySecond=0;
while(TRUE){
IDLE;
if(bMenuLevel==0){
bStatusWord=S_HARDWAREINIT;
bEnterFlag=0x69;
return;
}
if(bMenuLevel==2){
fLastEnd=0;
switch(bMenuSelect){
case CHANGE:
ChangeWorkMode();
break;
case ALLCLEAR:
ClrTotal(); // 清内部统计纪录
DispOK(3);
bMenuLevel=1;
break;
case PARAQUERY:
QueryPara(); // 参数查询
break;
case PARASETUP:
UpdatePara(); // 参数修改设置
break;
case MENUEXIT:
bMenuLevel=0; // 退出维护
break;
default:
bMenuSelect=CHANGE; // 退回主菜单
break;
}
bMenuLevel=1;
}
memset(aLargeBuf,0x00,20); // 菜单显示
memcpy(aLargeBuf,pStr[bMenuSelect],7);
ConvertCode();
FD_Lock(HOOKNO);
DispOut(); // 防盗过程
if(bKeyBuf!=K1)
fLastEnd=1;
if(!fKey)
continue;
fKey=0;
if(cbKey>=200)
cbKey=170;
switch(bKeyBuf){ // 菜单选择
case K1:
if(!fLastEnd)
break;
if(bMenuSelect==MENUEXIT) // 按K1键退出
bMenuLevel=0;
else
bMenuSelect=MENUEXIT;
break;
case K2:
if(bMenuSelect==CHANGE)
bMenuSelect=MENUEXIT;
else
bMenuSelect--; // 按K2键前翻
break;
case K3:
if(bMenuSelect==MENUEXIT)
bMenuSelect=CHANGE;
else
bMenuSelect++; // 按K3键后翻
break;
case K4:
bMenuLevel=2;
break;
// 按K4键进入操作
default:
Speaker(5); // 其他按键方式不接受
break;
}
}
} // End of Server() OK !
/*****************************************************************************
*
* 函数名: QueryPara
*
* 说 明: 参数查询
*
*****************************************************************************/
void QueryPara() // OK !
{
bool fModify=0; // 修改标志
bool fLastEnd=0;
byte bParaNo=01;
AutoReadPara(36);
if(bParaByte<10)
bParaByte=10;
cbDelaySecond=bParaByte;
fDelaySecond=0;
fFDToneRequest=1;
pReadNumber=0;
pWriteNumber=0;
fKey=0;
while(bMenuLevel==2)
{
IDLE;
if(!fModify)
DispPara(bParaNo);
FD_Lock(HOOKDISP);
DispOut();
if(bKeyBuf!=K4) fLastEnd=1;
if(!fLastEnd) continue;
if((pWriteNumber==0)&&(!fKey)) // 等待选择参数显示
continue;
fModify=0;
if(SelectPara(bParaNo,ENQUERY))
bParaNo=aServer[0];
else
fModify=1;
}
} // End of QueryPara() OK !
/*****************************************************************************
*
* 函数名: UpdatePara
*
* 说 明: 参数设置
*
*****************************************************************************/
void UpdatePara()
{
bool fLastEnd=0;
bool fModify=0; // 修改标志
bool fAidSelect=0; // 0: 选择参数 1: 修改参数
byte bWork,bFirst_Flash=0x10;
byte bLength,bParaNo=01;
AutoReadPara(36);
if(bParaByte<10)
bParaByte=10;
fFDToneRequest=1;
cbDelaySecond=bParaByte;
fDelaySecond=0;
pReadNumber=0;
pWriteNumber=0;
fKey=0;
while(bMenuLevel==2)
{
IDLE;
if(!fModify)
{
DispPara(bParaNo); // 显示参数内容
GetParaAttr(bParaNo);
bLength=GetParaContent(bParaNo);
fModify=1;
}
bFirst_Flash=DispFlash(bLength,fAidSelect,bFirst_Flash);
FD_Lock(HOOKDISP);
DispOut();
if(bKeyBuf!=K4) fLastEnd=1;
if(!fLastEnd) continue;
if((pWriteNumber==0)&&(!fKey)) // 等待选择参数
continue;
// 选择参数或修改参数
bFirst_Flash=bFirst_Flash|0x10;
if(!fAidSelect){
bWork=0;
if((pReadNumber==0)&&((fKey&&(bKeyBuf==K4))
||((pWriteNumber!=0)&&(aNumBuf[0]==12))))
bWork=1;
if(SelectPara(bParaNo,ENMODIFY)){
bParaNo=aServer[0];
fModify=0;
if(bWork!=0)
fAidSelect=1;
}
else
fModify=1; // bAidSelect=0;
continue;
}
if(fKey){
bWork=bKeyBuf;
fKey=0;
switch(bWork){
case K1 :
case K4 :
if(bWork==K1) Cancel(bParaNo);
else{
if(Confirm(bParaNo)){
fLockRequest=1;
cbDelaySecond=20;
fDelaySecond=0;
DispOK(1);
}
}
fModify=0;
fAidSelect=0;
break;
case K2 :
case K3 :
fModify=1;
if(bWork==K2)
{
if(pReadNumber==0)
Speaker(5);
else pReadNumber--;
fAidSelect=1;
}
else
{
if(++pReadNumber>=bLength)
{
pReadNumber=bLength;
Speaker(5);
}
}
break;
default : Speaker(5);
}
continue;
}
// 电话机按键输入
bWork=aNumBuf[0];
pWriteNumber=0;
if(bWork<10)
{
fModify=1;
if(pReadNumber<=bLength)
{
if((aParaBuf[2]&0x0F)==0x05)
{
if(bWork>0) bWork=1;
}
aServer[pReadNumber++]=bWork;
}
}
else
{
if(bWork==11)
Cancel(bParaNo);
else if(bWork==12)
{
if(Confirm(bParaNo)){
fLockRequest=1;
fDelaySecond=0;
cbDelaySecond=20;
DispOK(1);
}
else
Speaker(20);
}
else
continue;
fModify=0;
fAidSelect=0;
}
continue;
} // End of while{}
} // End of UpdatePara()
/*****************************************************************************
*
* 函数名: CheckPassWord
*
* 说 明: 进入维护操作前的密码检查
*
*****************************************************************************/
bool CheckPassWord()
{
byte code SuperPassword[]={7,1,6,8};
byte xdata aBuf[4];
byte i,cbTime=0;
byte bWork;
AutoReadPara(36);
if(bParaByte<10)
bParaByte=10;
fFDToneRequest=1;
cbDelaySecond=bParaByte;
fDelaySecond=0;
pReadNumber=0;
pWriteNumber=0;
ciDelaySecond=20;
fiDelaySecond=0;
AutoReadPara(23);
for(i=0;i<2;i++)
{
aServer[2*i]=aParaBuf[i]>>4;
aServer[2*i+1]=aParaBuf[i]&0x0F;
}
memset(&aLargeBuf,0x20,4);
while(TRUE)
{
IDLE;
if(fiDelaySecond) return FALSE;
if(OnHook()&&pReadNumber>0)
{
pReadNumber=0;
memset(&aLargeBuf,0x20,4);
}
FD_Lock(HOOKDISP); // 防盗过程
DispOut();
if(pWriteNumber==0)
continue;
bWork=aNumBuf[0];
pWriteNumber=0;
if(bWork>10)
continue;
aBuf[pReadNumber]=bWork;
aLargeBuf[pReadNumber++]=0xE4;
if(pReadNumber<4)
continue;
cbDelay5MS=50;
fDelay5MS=0;
while(!fDelay5MS)
{
IDLE;
FD_Lock(HOOKDISP);
DispOut();
}
Speaker(20);
if((memcmp(&aServer,&aBuf,4)==0)||(memcmp(&SuperPassword,&aBuf,4)==0))
return TRUE;
if(++cbTime>=3) return FALSE;
memset(&aLargeBuf,0x20,4);
pReadNumber=0;
ciDelaySecond=20;
fiDelaySecond=0;
}
} // End of CheckPassword()
/*****************************************************************************
*
* 函数名: DispPara
*
* 说 明: 显示参数内容
*
*****************************************************************************/
void DispPara(byte bParaNo)
{
byte i,j;
byte bLength,bWork;
memset(aLargeBuf,0x00,20);
aServer[0]=bParaNo;
BINConvBCD(1);
aLargeBuf[14]=0x73; // 显示参数代码号
if(aServer[0])
ToDisplay(0,13);
ToDisplay(1,12);
ToDisplay(2,11);
GetParaAttr(bParaNo);
bLength=GetParaContent(bParaNo);
switch(bParaNo)
{
case 21 : // 显示备用费率起始或终止时间
case 22 :
for(i=0,j=0;i<12;i++)
{
if(i<8) bWork=j;
else bWork=29-j;
ToDisplay(i,bWork);
j++;
if((i==3)||(i==5))
aLargeBuf[j++]=0x20;
else if(i==9)
{
aLargeBuf[29-j]=0x20;
j++;
}
}
break;
case 50 :
/*
for(i=0;i<10;i++)
ToDisplay(i,i);
*/
break;
case 213 : // 显示备用费率起始终止时间(old)
for(i=0;i<16;i++)
{
if(i<11)
bWork=i;
else bWork=30-i;
ToDisplay(i,bWork);
}
break;
case 214 : // 显示日常折扣时间
for(j=0,i=0;i<8;i++)
{
ToDisplay(i,j);
j++;
if((i==1)||(i==5)) aLargeBuf[j++]=0x20;
if(i==3) j++;
}
break;
case 215 : // 显示特定折扣时间
case 216 :
case 217 :
case 218 :
case 219 :
case 220 :
for(i=0,j=0;i<10;i++)
{
if(i<6) bWork=j;
else bWork=27-j;
ToDisplay(i,bWork);
j++;
if((i==1)||(i==3)) aLargeBuf[j++]=0x20;
if(i==7) aLargeBuf[27-j++]=0x20;
}
break;
case 221 : // 显示折扣率(老格式)
for(i=0,j=0;i<12;i++)
{
if(i<8) bWork=j;
else bWork=31-j;
ToDisplay(i,bWork);
j++;
if(i%2) j++;
}
break;
case 232 : // 区号表起始地址
case 233 :
for(i=0,j=0;i<6;i++)
{
ToDisplay(i,j);
j++;
if(i==3) j++;
}
break;
default :
for(i=0;i<bLength;i++)
{
if(i<11) bWork=i;
else bWork=30-i;
ToDisplay(i,bWork);
}
}
} // End of DispPara();
/*****************************************************************************
*
* 函数名: DispFlash
*
* 说 明: 闪烁显示参数内容
*
*****************************************************************************/
byte DispFlash(byte bLength,bool fAidSelect,byte bFirst_Flash)
{
byte i,bWork;
if(!fAidSelect) // 不闪烁
return bFirst_Flash;
if((bFirst_Flash&0xF0)!=0)
{
bFirst_Flash=0x00;
cbDelay5MS=120;
fDelay5MS=0;
}
else if(fDelay5MS)
{
if((bFirst_Flash&0x0F)==0)
bFirst_Flash=bFirst_Flash|0x01;
else bFirst_Flash=bFirst_Flash&0xFE;
cbDelay5MS=100;
fDelay5MS=0;
}
if((bFirst_Flash&0x0F)!=0)
{
if(pReadNumber<bLength) // 单个字符闪烁
{
bWork=pReadNumber;
if(pReadNumber>10)
bWork=30-pReadNumber;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -