📄 cmdproc.cpp
字号:
#include <stdio.h>
#include <ctype.h>
#include <string.h>
#include <stdlib.h>
#include <time.h>
#include <dos.h>
#include <bios.h>
#include "cmdproc.h"
#include "downcmd.h"
#include "fileio.h"
#include "macrodef.h"
#include "RS232X3.h"
#include "etr232i.h"
#include "gprsproc.h"
#include "etr_ppp.h"
#include "tcpclnt.h"
#include "readini.h"
#include "tmrisr.h"
#include "keyscan.h"
//////////////////////////for keypad
#include "keymenu.h"
unsigned char far TmpBuf[1200];
unsigned char WhoSendZcwlCMD=0;
unsigned char WhoSendPzrfscCMD=0;
unsigned char WhoSendPzwlscCMD=0;
unsigned char WhoSendPzrfivtCMD=0;
unsigned char WhoSendPzwlivtCMD=0;
extern char Pzrfscflg, Pzwlscflg;
extern char Pzrfivtflg, Pzwlivtflg;
extern Rm;
extern Cm;
extern unsigned char RecFrom ;
extern int TaskFlg;
extern struct SERVER_ID Svr_ID;
extern int ARTimeUnit;
extern char SIMNum[21];
extern char CenterName[21];
extern char StationName[21];
//数组的第一个元素对应雨量数据,第二个元素对应水位数据
int DataWakeUp[2];
int TimingWakeUp[2];
int IvtimeWakeUp[2];
int Num_of_thr[2];
int Ivtime[2]; //数据采集数据间隔时间的数组,第一个元素对应雨量数据,第二个元素对应水位数据,默认值是5分钟
int DTUAddress[3];
ThRWAKEUPSTRUCT ThrWakeUp[2][8];
extern PARAFROMCENTER ParaFromCenter1;
extern PARAFROMCENTER ParaFromCenter2;
extern unsigned char FirstRFTRflg; //定时自报降雨量标志
extern unsigned char FirstWLTRflg; //定时自报水位标志
int UpCmd_Master_Proc( unsigned char *CmdDataBuf )
{
int i;
i = UpFrame_Identify( CmdDataBuf );
if(i==1) UpCmd_Process( CmdDataBuf );
else { if(GetKPState==LOCK) printf("\nUpFrame format erro!\n");}
return 1;
}
int UpFrame_Identify(unsigned char *CmdDataBuf)
{
int i;
unsigned char checksum = 0;
unsigned char cs_bytecount;
unsigned char FrameCheck = START_CHECK;
switch(FrameCheck)
{
case START_CHECK:
if(CmdDataBuf[0]!=FRAME_START_CHAR)
return 0;
case DTUAddress_CHECK:
if(CmdDataBuf[1]!=DTUAddress[0]||CmdDataBuf[2]!=DTUAddress[1])
return 0;
case HEADER_CHECK:
if(CmdDataBuf[4]!=FRAME_START_CHAR)
return 0;
case CS_CHECK:
cs_bytecount = CmdDataBuf[6]*8 + 7;
for( i=0; i < cs_bytecount; i++ )
checksum += CmdDataBuf[i];
if(checksum != CmdDataBuf[cs_bytecount])
{
if(GetKPState==LOCK) printf("\nCs_check erro!\n");
return 0;
}
case END_CHECK:
if(CmdDataBuf[cs_bytecount+1]!=FRAME_END_CHAR) return 0;
default: break;
}
return 1;
}
//add by wuhuan 2006.5.25
unsigned char NewRfScCmdDataBuf[150];
unsigned char NewWlScCmdDataBuf[150];
unsigned char NewRfIvtCmdDataBuf[15];
unsigned char NewWlIvtCmdDataBuf[15];
char ReadHistroyDataFlg=0;
unsigned char RHDCMDTmpBuf[30];
unsigned char WhoSendRHDCMD=0;
/////////////////////////////////////////
int UpCmd_Process( unsigned char *CmdDataBuf )
{
int i, len;
int GetIvtime;
int version[3];
unsigned char FunCode;
FunCode = CmdDataBuf[5];
switch( FunCode )
{
case 0x00:
break;
case 0x01: //校时
SetTime( CmdDataBuf );
Ack_SetTime( 0x00, RecFrom ); //正常应答,无异常应答
break;
case 0x02:
break;
case 0x03: //召测数据
Send_Cmd_to_GatherMachine( CmdDataBuf[3], 0x02 ); //下发召测数据指令
if(CmdDataBuf[3]==0x02||CmdDataBuf[3]==0x42) //召测水位,前者为GPRS信道,后者为CDMA信道
{
Timer3sCnt_zcwl_flg = 1; //召测雨量数据定时器开始启动
WhoSendZcwlCMD = RecFrom; //记录发送中心
}
else Ack_Wrong_passive_transfer_data( CmdDataBuf[3], RecFrom );
break;
case 0x04: //读取历史批量数据
//ReadHistroyData( CmdDataBuf, RecFrom );
if(ReadHistroyDataFlg==0)
{
len = CmdDataBuf[6]*8 + 9;
for(i=0;i<len;i++)
RHDCMDTmpBuf[i]=CmdDataBuf[i];
RHDCMDTmpBuf[len]='\0';
ReadHistroyDataFlg=1;
WhoSendRHDCMD = RecFrom; //记录发送中心
}
break;
case 0x05: //配置发送条件
if((CmdDataBuf[3]==0x01||CmdDataBuf[3]==0x41)&&Pzrfscflg!=2) //前者为GPRS信道,后者为CDMA信道
{
Pzrfscflg = 2; //正在配置雨量发送条件
WhoSendPzrfscCMD = RecFrom; //记录发送中心
Send_Sc_to_GatherMachine( CmdDataBuf ); //下发配置加报数据发送条件的指令
Timer3sCnt_pzrfsc_flg = 1; //配置雨量发送条件定时器开始启动
len = CmdDataBuf[6]*8 + 9;
for(i=0;i<len;i++)
NewRfScCmdDataBuf[i]=CmdDataBuf[i];
NewRfScCmdDataBuf[len]='\0';
//ConfigSendCondition( CmdDataBuf ); modifyed by wuhuan 2006.5.25
}
else if((CmdDataBuf[3]==0x02||CmdDataBuf[3]==0x42)&&Pzwlscflg!=2) //前者为GPRS信道,后者为CDMA信道
{
Pzwlscflg = 2; //正在配置水位发送条件
WhoSendPzwlscCMD = RecFrom; //记录发送中心
Send_Sc_to_GatherMachine( CmdDataBuf ); //下发配置加报数据发送条件的指令
Timer3sCnt_pzwlsc_flg = 1; //配置水位发送条件定时器开始启动
len = CmdDataBuf[6]*8 + 9;
for(i=0;i<len;i++)
NewWlScCmdDataBuf[i]=CmdDataBuf[i];
NewWlScCmdDataBuf[len]='\0';
//ConfigSendCondition( CmdDataBuf ); modifyed by wuhuan 2006.5.25
}
else Ack_Wrong_ConfigSendCondition( CmdDataBuf[3], RecFrom );
break;
case 0x06: //读发送条件
Ack_Right_ReadSendCondition( CmdDataBuf[3], RecFrom ); //正常应答读发送条件
//在此加异常应答读发送条件
break;
case 0x07:
break;
case 0x08: //断开TCP连接
DisconnectTCP( ); //不需要应答
break;
case 0x09: //设置主从模式
Master_slave_mode( ); //不需要应答
break;
case 0x0A: //设置对等模式
Equal_backup_mode( ); //不需要应答
break;
case 0x0B: //设置单工模式
Simplex_mode( ); //不需要应答
break;
case 0x0C: //设置双工模式
Duplex_mode( ); //不需要应答
break;
case 0x0D: //修改服务端的地址信息
Modify_Svr_Addr( CmdDataBuf ); //不需要应答
if(RecFrom==APPSERVER1) //NewCenter1=0;
{
ParaFromCenter1.rfscpara=0;
ParaFromCenter1.wlscpara=0;
ParaFromCenter1.rfivtpara=0;
ParaFromCenter1.wlivtpara=0;
//if(GetKPState==LOCK) printf("Save_Svr_Addr---1\n");
}
else //NewCenter2=0;
{
ParaFromCenter2.rfscpara=0;
ParaFromCenter2.wlscpara=0;
ParaFromCenter2.rfivtpara=0;
ParaFromCenter2.wlivtpara=0;
//if(GetKPState==LOCK) printf("Save_Svr_Addr---2\n");
}
break;
case 0x0E: //保存服务端的地址信息
Save_Svr_Addr( ); //不需要应答
break;
case 0x0F: //应答读集中器系统的时间
Ack_Read_DTU_time( 0x00 ); //正常应答读集中器系统的时间
break; //无异常应答
case 0x10:
break;
case 0x11:
break;
case 0x12: //配置数据采集的间隔时间
if((CmdDataBuf[3]==0x01||CmdDataBuf[3]==0x41)&&Pzrfivtflg!=2) //前者为GPRS信道,后者为CDMA信道
{
Pzrfivtflg = 2; //正在配置雨量采集间隔时间
WhoSendPzrfivtCMD = RecFrom; //记录发送中心
Send_Ivtime_to_GatherMachine( CmdDataBuf );
Timer3sCnt_pzrfivt_flg=1; //配置雨量采集间隔时间定时器开始启动
len = CmdDataBuf[6]*8 + 9;
for(i=0;i<len;i++)
NewRfIvtCmdDataBuf[i]= CmdDataBuf[i];
NewRfIvtCmdDataBuf[len]='\0';
//Write_interval_time_of_gatherdata( CmdDataBuf ); modifyed by wuhuan 2006.5.25
}
else if((CmdDataBuf[3]==0x02||CmdDataBuf[3]==0x42)&&Pzwlivtflg!=2) //前者为GPRS信道,后者为CDMA信道
{
Pzwlivtflg = 2; //正在配置水位采集间隔时间
WhoSendPzwlivtCMD = RecFrom; //记录发送中心
Send_Ivtime_to_GatherMachine( CmdDataBuf );
Timer3sCnt_pzwlivt_flg=1; //配置水位采集间隔时间定时器开始启动
len = CmdDataBuf[6]*8 + 9;
for(i=0;i<len;i++)
NewWlIvtCmdDataBuf[i]= CmdDataBuf[i];
NewWlIvtCmdDataBuf[len]='\0';
//Write_interval_time_of_gatherdata( CmdDataBuf ); modifyed by wuhuan 2006.5.25
}
else Ack_Wrong_Write_interval_time_of_gatherdata( CmdDataBuf[3], RecFrom );
break;
case 0x13: //正常应答读数据采集的间隔时间
Ack_Right_Read_interval_time_of_gatherdata( CmdDataBuf[3], RecFrom );
break;
case 0x14: //中心应答加报数据
break;
case 0x15:
break;
case 0x16: //修改集中器的参数
Modify_DC_para( CmdDataBuf );
Ack_Right_Modify_DC_para( 0x00, RecFrom );
Save_DC_para( );
break;
case 0x18: //读取集中器软件版本号
version[0] = 1;
version[1] = 22;
Ack_ReadSoftVersion( version, RecFrom );
break;
case 0x19: //集中器软件远程升级
Ack_LiveUpdate( RecFrom );
break;
case 0x20:
break;
default :
if(GetKPState==LOCK) printf("No match cmdcode!");
break;
}
return 1;
}
//设置集中器的时间
/*int SetTime( unsigned char *CmdDataBuf )
{
int i, CTBuf[20];
struct time t;
struct date d;
for(i=0;i<12;i++)
CTBuf[i]=(int)CmdDataBuf[i+7];
getdate( &d );
gettime( &t );
if(GetKPState==LOCK) printf("Get: %d-%02d-%02d %02d:%02d:%02d\n",
d.da_year, d.da_mon, d.da_day,
t.ti_hour, t.ti_min, t.ti_sec );
d.da_year = (CTBuf[0]-48)*10+CTBuf[1]-48+2000;
d.da_mon = (CTBuf[2]-48)*10+CTBuf[3]-48;
d.da_day = (CTBuf[4]-48)*10+CTBuf[5]-48;
setdate(&d);
t.ti_hour = (CTBuf[6]-48)*10+CTBuf[7]-48;
t.ti_min = (CTBuf[8]-48)*10+CTBuf[9]-48;
t.ti_sec = (CTBuf[10]-48)*10+CTBuf[11]-48;
settime(&t);
if(GetKPState==LOCK) printf("Set: %d-%02d-%02d %02d:%02d:%02d\n",
d.da_year, d.da_mon, d.da_day,
t.ti_hour, t.ti_min, t.ti_sec );
getdate( &d );
gettime( &t );
if(GetKPState==LOCK) printf("Time: %d-%02d-%02d %02d:%02d:%02d\n",
d.da_year, d.da_mon, d.da_day,
t.ti_hour, t.ti_min, t.ti_sec );
return 1;
}*/
//////////////////////////////////////////////////add by wuhuan 2006.8.9
int SetTime( unsigned char *CmdDataBuf )
{
int i;
char CTBuf[20];
struct time t;
struct date d;
for(i=0;i<12;i++)
CTBuf[i]=CmdDataBuf[i+7];
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -