📄 cmdproc.cpp
字号:
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;
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;
setdate(&d);
settime(&t);
InitKeyPad( );
/*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;
}
//////////////////////////////////////////////////
//校时正常应答
void Ack_SetTime( unsigned char typeofdata, unsigned char center )
{
Ack_single_center_command(typeofdata, 0x81, center);
}
//正常应答召测数据
int Up_passive_transfer_data( unsigned char *GetInDataBuff, unsigned char typeofdata, unsigned char center )
{
int num,len;
unsigned char checksum = 0;
unsigned char cs_bytecount;
unsigned char i,j,k;
int type_byte_len=0;
unsigned char real_len_of_data_region;
unsigned char num_of_fill_byte;
unsigned char *PutOutTemBuff;
PutOutTemBuff = TmpBuf; //让指针变量的地址指向TmpBuf
/////////////////////////上报招测数据的固定格式
PutOutTemBuff[0]= 0x68;
PutOutTemBuff[1]= DTUAddress[0];
PutOutTemBuff[2]= DTUAddress[1];
PutOutTemBuff[3]= typeofdata;
PutOutTemBuff[4]= 0x68;
PutOutTemBuff[5]= 0x83; //自报数据的功能码
PutOutTemBuff[6] = 3; //数据域的长度3*8个字节
GetTmpTimeInfo( PutOutTemBuff, typeofdata, 0 );
PutOutTemBuff[17]= 0x20; //添加空格符
////////////////////////////////添加水情数据种类标识符
type_byte_len = Add_data_type_flag( PutOutTemBuff, typeofdata, Ivtime[0], 0 );
////////////////////////添加水情数据种类标识符结束
PutOutTemBuff[18+type_byte_len]= 0x20; //添加空格符
//////////////////////////////////
len = strlen(GetInDataBuff);
//if(GetKPState==LOCK) printf("len = %d\n", len);
for(j=0; j<len; j++)
{
//存放采集的数值,字符型数据格式
PutOutTemBuff[19+type_byte_len+j]= GetInDataBuff[j];
}
PutOutTemBuff[19+type_byte_len+len]= 0x20; //添加空格符
PutOutTemBuff[20+type_byte_len+len]= 0x4E; //添加固定格式的数据域结束字符
PutOutTemBuff[21+type_byte_len+len]= 0x4E; //添加固定格式的数据域结束字符
real_len_of_data_region = 15+type_byte_len+len; //数据域的长度,<=24个字节
num_of_fill_byte = 24-real_len_of_data_region;
for(k=0; k<num_of_fill_byte; k++)
PutOutTemBuff[7 + real_len_of_data_region + k]= 0x00;
/////////////////////////////计算校验和
cs_bytecount = PutOutTemBuff[6]*8 + 7;
for( i=0; i < cs_bytecount; i++ )
checksum += PutOutTemBuff[i];
PutOutTemBuff[cs_bytecount]= checksum; //存放校验和的数值
PutOutTemBuff[cs_bytecount+1]= FRAME_END_CHAR; //帧结束标志
//////////////////////////////招测数据打包结束
PutOutTemBuff[cs_bytecount+2]= '\0';
Send_to_Single_Svr(PutOutTemBuff, center, cs_bytecount+2); //向应用端发送数据
return 1;
}
//异常应答招测数据
void Ack_Wrong_passive_transfer_data( unsigned char typeofdata, unsigned char center )
{
Ack_single_center_command(typeofdata, 0xc3, center);
}
//自报数据
int Up_Positive_transfer_data( unsigned char *GetInDataBuff, unsigned char typeofdata, unsigned char datawktype,
unsigned char center, int rfivtime )
{
int r;
int num,len;
unsigned char checksum = 0;
unsigned char cs_bytecount;
unsigned char i,j,k;
int type_byte_len=0;
unsigned char real_len_of_data_region;
unsigned char num_of_fill_byte;
unsigned char *PutOutTemBuff;
PutOutTemBuff = TmpBuf; //让指针变量的地址指向TmpBuf
/////////////////////////上报数据的固定格式
PutOutTemBuff[0]= 0x68;
PutOutTemBuff[1]= DTUAddress[0];
PutOutTemBuff[2]= DTUAddress[1];
PutOutTemBuff[3]= typeofdata;
PutOutTemBuff[4]= 0x68;
switch(datawktype)
{
case 0x31:
case 0x32:
case 0x33:
case 0x34:
case 0x35:
PutOutTemBuff[5]= 0x82; //自报数据的功能码
PutOutTemBuff[6] = 4; //数据域的长度4*8个字节
PutOutTemBuff[7]= datawktype;
GetTmpTimeInfo( PutOutTemBuff, typeofdata, 1 ); ///生成采集时间信息
PutOutTemBuff[18]= 0x20; //添加空格符
////////////////////////////////添加水情数据种类标识符
type_byte_len = Add_data_type_flag( PutOutTemBuff, typeofdata, rfivtime, 1 ); //加时间
////////////////////////添加水情数据种类标识符结束
PutOutTemBuff[19+type_byte_len]= 0x20; //添加空格符
//////////////////////////////////
len = strlen(GetInDataBuff);
for(j=0; j<len; j++)
{
//存放采集的数值,字符型数据格式
PutOutTemBuff[20+type_byte_len+j]= GetInDataBuff[j];
}
PutOutTemBuff[20+type_byte_len+len]= 0x20; //添加空格符
PutOutTemBuff[21+type_byte_len+len]= 0x4E; //添加固定格式的数据域结束字符
PutOutTemBuff[22+type_byte_len+len]= 0x4E; //添加固定格式的数据域结束字符
real_len_of_data_region = 16+type_byte_len+len; //数据域的长度
break;
case 0x99:
PutOutTemBuff[5]= 0x94; //加报数据的功能码
PutOutTemBuff[6] = 3; //数据域的长度4*8个字节
GetTmpTimeInfo( PutOutTemBuff, typeofdata, 0 ); ///生成采集时间信息
PutOutTemBuff[17]= 0x20; //添加空格符
////////////////////////////////添加水情数据种类标识符
type_byte_len = Add_data_type_flag( PutOutTemBuff, typeofdata, rfivtime, 0); //加时间
////////////////////////添加水情数据种类标识符结束
PutOutTemBuff[18+type_byte_len]= 0x20; //添加空格符
//////////////////////////////////
len = strlen(GetInDataBuff);
for(j=0; j<len; j++)
{
//存放采集的数值,字符型数据格式
PutOutTemBuff[19+type_byte_len+j]= GetInDataBuff[j];
}
PutOutTemBuff[19+type_byte_len+len]= 0x20; //添加空格符
PutOutTemBuff[20+type_byte_len+len]= 0x4E; //添加固定格式的数据域结束字符
PutOutTemBuff[21+type_byte_len+len]= 0x4E; //添加固定格式的数据域结束字符
real_len_of_data_region = 15+type_byte_len+len; //数据域的长度,<=24个字节
break;
}
num_of_fill_byte = PutOutTemBuff[6]*8-real_len_of_data_region;
for(k=0; k<num_of_fill_byte; k++)
PutOutTemBuff[7 + real_len_of_data_region + k]= 0x00;
/////////////////////////////计算校验和
cs_bytecount = PutOutTemBuff[6]*8 + 7;
for( i=0; i < cs_bytecount; i++ )
checksum += PutOutTemBuff[i];
PutOutTemBuff[cs_bytecount]= checksum; //存放校验和的数值
PutOutTemBuff[cs_bytecount+1]= FRAME_END_CHAR; //帧结束标志
//////////////////////////////数据打包结束
PutOutTemBuff[cs_bytecount+2]= '\0';
r = Send_to_Single_Svr(PutOutTemBuff, center, cs_bytecount+2); //向应用端发送数据
return r;
}
//读取历史数据
int ReadHistroyData( unsigned char *CmdDataBuf, unsigned char center )
{
int i;
static unsigned long StartTick = 0;
unsigned long CurrentTick;
CurrentTick = clock( );
if( CurrentTick >= (StartTick + 2) )
{
if(CmdDataBuf[3]==0x01) //读历史雨量数据
{
i=ReadRainfallHistroyData( CmdDataBuf, center );
if(i!=-1) ReadHistroyDataFlg = 0;
}
else if(CmdDataBuf[3]==0x02) //读历史水位数据
{
i=ReadWaterLevelHistroyData( CmdDataBuf, center );
if(i!=-1) ReadHistroyDataFlg = 0;
}
else
{
if(GetKPState==LOCK) printf("\nUpFrame format erro!\n");
return 0;
}
StartTick = CurrentTick;
}
return 1;
}
void Ack_Wrong_ReadHistroyData( unsigned char typeofdata, unsigned char center )
{
Ack_single_center_command(typeofdata, 0xc4, center);
}
int ConfigSendCondition( unsigned char *CmdDataBuf )
{
unsigned long configvar, num1, num2, num3, num4, num5, num6;
unsigned char flag=0; //flag==0, 水位数据标志;flag==1, 雨量数据标志
unsigned char i;
////////////////////////////////////从指令中获取发送条件
//定义四个全局变量:
//1. DataWakeUp 数据触发模式;
//2. TimingWakeUp 定时触发模式;
//3. IvtimeWakeUp 间隔时间触发模式;
//4. Num_of_thr 门限条件的个数;
//5. ThrWakeUp[8] 门限触发模式;
if(CmdDataBuf[3]==0x01) flag = 0;
else if(CmdDataBuf[3]==0x02) flag = 1;
else { if(GetKPState==LOCK) printf("Upframe format erro!\n");}
configvar = CmdDataBuf[7]- 48; //把十进制字符型转换成十进制整型
if(DataWakeUp[flag]!=configvar) DataWakeUp[flag] = configvar; //D1
configvar = (CmdDataBuf[8]-48)*10 + CmdDataBuf[9]-48; //把十进制字符型转换成十进制整型
if(TimingWakeUp[flag]!= configvar)
{
if(flag==0) FirstRFTRflg = 1; //定时上报降雨量标志重新启动;
else if(flag==1) FirstWLTRflg = 1; //定时上报水位标志重新启动;
TimingWakeUp[flag] = configvar; //D2
}
configvar = (CmdDataBuf[10]-48)*1000+(CmdDataBuf[11]-48)*100+(CmdDataBuf[12]-48)*10
+(CmdDataBuf[13]-48);
if(IvtimeWakeUp[flag]!= configvar) IvtimeWakeUp[flag] = configvar; //D3
configvar = (CmdDataBuf[14]-48)*10 + CmdDataBuf[15]-48; //把十进制字符型转换成十进制整型,门限条件的个数
if( Num_of_thr[flag]!=configvar) Num_of_thr[flag] = configvar;
for(i=0; i<Num_of_thr[flag]; i++)
{
configvar = (CmdDataBuf[16+10*i]-48)*1000+(CmdDataBuf[17+10*i]-48)*100+(CmdDataBuf[18+10*i]-48)*10
+(CmdDataBuf[19+10*i]-48);
if(ThrWakeUp[flag][i].thr_unit!=configvar) ThrWakeUp[flag][i].thr_unit = configvar;
num1 = CmdDataBuf[20+10*i]-48;
num2 = CmdDataBuf[21+10*i]-48;
num3 = CmdDataBuf[22+10*i]-48;
num4 = CmdDataBuf[23+10*i]-48;
num5 = CmdDataBuf[24+10*i]-48;
num6 = CmdDataBuf[25+10*i]-48;
configvar = num1*100000 + num2*10000 + num3*1000 + num4*100 + num5*10 + num6;
if(ThrWakeUp[flag][i].thr_value!=configvar) ThrWakeUp[flag][i].thr_value = configvar;
}
return 1;
}
void Ack_Right_ConfigSendCondition( unsigned char typeofdata, unsigned char center )
{
Ack_single_center_command(typeofdata, 0x85, center);
}
void Ack_Wrong_ConfigSendCondition( unsigned char typeofdata, unsigned char center )
{
Ack_single_center_command(typeofdata, 0xc5, center);
}
//为湖北水文V1.2版本作修改
int Ack_Right_ReadSendCondition( unsigned char typeofdata, unsigned char center )
{
int r; //add by wuhuan 2006.5.24
unsigned char i, j, k, len, checksum = 0;
unsigned char flag=0; //flag==0, 水位数据标志;flag==1, 雨量数据标志
unsigned char cs_bytecount;
unsigned char sum_datalen, num_of_fill_byte;
unsigned char *PutOutTemBuff;
char string[10];
PutOutTemBuff = TmpBuf; //让指针变量的地址指向TmpBuf
PutOutTemBuff[0]= 0x68;
PutOutTemBuff[1]= DTUAddress[0];
PutOutTemBuff[2]= DTUAddress[1];
PutOutTemBuff[3]= typeofdata;
PutOutTemBuff[4]= 0x68;
PutOutTemBuff[5]= 0x86; //上报招测数据的功能码
if(typeofdata==0x01) flag = 0;
else if(typeofdata==0x02) flag = 1;
else { if(GetKPState==LOCK) printf("Upframe format erro!\n");}
PutOutTemBuff[7]= DataWakeUp[flag]+48; //D1
itoa(TimingWakeUp[flag],string,10);
if(strlen(string)<2)
{
PutOutTemBuff[8]='0';
PutOutTemBuff[9]= string[0];
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -