⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 cmdproc.cpp

📁 湖北水文黄石试点集中器代码
💻 CPP
📖 第 1 页 / 共 5 页
字号:
#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 + -