📄 stipulparse.c
字号:
/****************************************Copyright (c)**************************************************
** 江苏广一科技有限公司
** 研 发 部
** 浙江配变
**
**
**
**--------------文件信息--------------------------------------------------------------------------------
**文 件 名: stipulparse.c
**创 建 人:
**最后修改日期: 2007年09月05日
**描 述:
**
**--------------历史版本信息----------------------------------------------------------------------------
** 创建人:
** 版 本:
** 日 期:
** 描 述:
**
**--------------当前版本修订------------------------------------------------------------------------------
** 修改人:
** 日 期:
** 描 述:
**
**------------------------------------------------------------------------------------------------------
********************************************************************************************************/
#define STIPULP_GLOBALS
#include "stipulparse.h"
#include "powerram.h"
#include "parameter.h"
#include "Clock.h"
#include "curdata.h"
#include "extremdata.h"
#include "main.h"
#include "commup.h"
extern PARAM_STR ParamInSram;
const uint8 DefaulAddr[4] = {0xAA,0xAA,0xAA,0xAA}; // 终端默认地址
const uint8 OverCode[3] = {0x22,0x84,0x33}; // 超级权限密码
//const uint8 OverCode[3] = {0x66,0x77,0x42};
/*********************************************************************************************************
** 函数名称: StipParsDel()
** 功能描述: 规约解析
**
** 输 入: 无
**
** 输 出: 无
**
** 全局变量:
** 调用模块:
**
** 作 者:
** 日 期:
**-------------------------------------------------------------------------------------------------------
** 修改人:
** 日 期:
**------------------------------------------------------------------------------------------------------
********************************************************************************************************/
/*
typedef struct { // 接收队列数据结构
uint8 state; // 0:为空 1:有数据待处理
//uint8 *read;
//uint8 *write;
uint8 chtype; // 01:短信 02:GPRS 05:红外 06:RS232
uint8 addr[6]; // 主站通讯地址
uint8 concode; // 控制码
uint8 datalen[2]; // 数据长度
//uint16 bufsize; // 缓冲区尺寸
uint8 buf[1024]; // 数据区
//uint8 chkcode[2]; // 校验码
} RCV_QUE; // 说明:在POWERRAM.C中定义一个16的结构数组
typedef struct {
uint8 state;
uint8 count;
uint8 ch;
uint8 len;
uint8 buf[1024];
} SEND_QUE;
*/
uint8 StipParsDel(void)
{
TASK_CALL_STR TaskCallData;
uint16 len,len1;
uint16 i;
uint16 year,mon,day,hour,min,week,sec;
uint8 year0,mon0,day0,hour0,min0;
uint32 times0,times1;
static uint8 uc_rqnum;
for (uc_rqnum=0;uc_rqnum<16;uc_rqnum++)
{//*
if (uc_rqnum==16)
return(1);
if (Rcv_Q[uc_rqnum].state!=0)
{//**
Rcv_Q[uc_rqnum].state = 0;
if (Rcv_Q[uc_rqnum].addr[0]==DefaulAddr[0] && // 判断终端公共地址
Rcv_Q[uc_rqnum].addr[1]==DefaulAddr[1] &&
Rcv_Q[uc_rqnum].addr[2]==DefaulAddr[2] &&
Rcv_Q[uc_rqnum].addr[3]==DefaulAddr[3]);
else if (Rcv_Q[uc_rqnum].addr[0]==TermAddr[0] && // 判断终端地址
Rcv_Q[uc_rqnum].addr[1]==TermAddr[1] &&
Rcv_Q[uc_rqnum].addr[2]==TermAddr[2] &&
Rcv_Q[uc_rqnum].addr[3]==TermAddr[3]);
else
{
Rcv_Q[uc_rqnum].state = 0;
continue;
}
switch (Rcv_Q[uc_rqnum].concode) // 控制码
{//***
case 0x00: // 中继
ReadRelay(&uc_rqnum);
break;
case 0x01: // 读当前数据
ReadCurData(&uc_rqnum);
break;
case 0x02: // 读任务数据
TaskCallData.ch = Rcv_Q[uc_rqnum].chtype;
for (i=0;i<6;i++)
{
TaskCallData.addr[i] = Rcv_Q[uc_rqnum].addr[i];
}
TaskCallData.concode = Rcv_Q[uc_rqnum].concode;
TaskCallData.datalen[0] = Rcv_Q[uc_rqnum].datalen[0];
TaskCallData.datalen[1] = Rcv_Q[uc_rqnum].datalen[1];
len = Rcv_Q[uc_rqnum].datalen[1];
len = (len<<8)|Rcv_Q[uc_rqnum].datalen[0];
for (i=0;i<len;i++)
{
TaskCallData.buf[i] = Rcv_Q[uc_rqnum].buf[i];
}
OSMboxPost(Task_Call_Box,(void *)&TaskCallData);
break;
case 0x04: // 读编程日志
ReadProgrmLog(&uc_rqnum);
break;
case 0x07: // 实时写对象参数
DateTimeRead(&year, &mon, &day, &week, // 读时钟
&hour, &min, &sec);
year = year%100;
year0 = (uint8)year;mon0 = (uint8)mon;
day0 = (uint8)day;hour0 = (uint8)hour;
min0 = (uint8)min;
times0 = CalculateTime(&year0, &mon0, &day0, //
&hour0, &min0);
year0 = BCD2HEX(Rcv_Q[uc_rqnum].buf[10]);
mon0 = BCD2HEX(Rcv_Q[uc_rqnum].buf[9]);
day0 = BCD2HEX(Rcv_Q[uc_rqnum].buf[8]);
hour0 = BCD2HEX(Rcv_Q[uc_rqnum].buf[7]);
min0 = BCD2HEX(Rcv_Q[uc_rqnum].buf[6]);
times1 = CalculateTime(&year0, &mon0, &day0, //
&hour0, &min0);
times1 = times1 + BCD2HEX(Rcv_Q[uc_rqnum].buf[5]);
if (times0>times1) // 如果过时
{
SetParamOVT(&uc_rqnum);
}
else // 未过时,与写对象参数相同
{
len = Rcv_Q[uc_rqnum].datalen[1]; // 先将接收队列整理成与写对象参数相同
len = len<<8;
len = len + Rcv_Q[uc_rqnum].datalen[0]; // 计算数据项及内容长度
len = len - 6;
len1 = len;
Rcv_Q[uc_rqnum].datalen[0] = (uint8)len1;
len1 = len;
len1 = len1>>8;
Rcv_Q[uc_rqnum].datalen[1] = (uint8)len1;
for (i=0;i<len;i++)
{
Rcv_Q[uc_rqnum].buf[5+i] = Rcv_Q[uc_rqnum].buf[11+i];
}
SetParam(&uc_rqnum);
}
break;
case 0x08: // 写对象参数
SetParam(&uc_rqnum);
break;
case 0x09: // 异常告警
break;
case 0x0A: // 告警确认
break;
case 0x0F: // 用户自定义数据
break;
case 0x21: // 登录应答
GprsManagPar.on = 1;
GprsManagPar.heartsp = 0;
GprsManagPar.logsp = 0;
break;
case 0xA2: // 登录退出
GprsManagPar.on = 0;
GprsManagPar.heartsp = 0;
GprsManagPar.logsp = 0;
break;
case 0xA4: // 心跳应答
GprsManagPar.heartt = 0;
break;
case 0x28: // 请求发送短信
break;
case 0x29: // 收到短信上报
break;
default:
break;
}//***
}//**
else continue;
}//*
return(0);
}
/*********************************************************************************************************
** 函数名称: ReturnErr()
** 功能描述: 参数设置返回错误
**
** 输 入: num 当前处理的接收队列号
**
** 输 出: 无
**
** 全局变量:
** 调用模块:
**
** 作 者:
** 日 期:
**-------------------------------------------------------------------------------------------------------
** 修改人:
** 日 期:
**------------------------------------------------------------------------------------------------------
********************************************************************************************************/
/*********************************************************************************************************
** 函数名称: RetCodeErr()
** 功能描述: 参数设置返回错误
**
** 输 入: num 当前处理的接收队列号
**
** 输 出: 无
**
** 全局变量:
** 调用模块:
**
** 作 者:
** 日 期:
**-------------------------------------------------------------------------------------------------------
** 修改人:
** 日 期:
**------------------------------------------------------------------------------------------------------
********************************************************************************************************/
void RetCodeErr(uint8 *pnum)
{
uint32 i;
uint32 offset; // 保存该数据项在数据结构中的偏移地址
uint8 attr; // 保存该数据项的属性
uint8 bnum; // 保存该数据项块序号
uint32 len; // 保存该数据项的长度
uint32 len1; // 保存队列中为处理数据项及内容的长度
uint8 *pt; // 记录当前处理接收队列中位置指针
uint8 par[2]; // 用来保存临时参数
//uint8 uc_data;
uint8 buf[256];
uint8 sendbuf[256],sendlen; // 保存返回的数据内容及长度
static uint8 num;
num = *pnum;
sendlen = 0;
len1 = Rcv_Q[num].datalen[1];
len1 = len1<<8;
len1 = len1 + Rcv_Q[num].datalen[0]; // 计算数据项及内容长度
len1 = len1 - 5;
pt = &Rcv_Q[num].buf[5];
while ((len1>2)&&(len1<1030))
{//*
par[1] = *pt;
pt ++;
par[0] = *pt;
pt ++;
len = ParamIndex(Rcv_Q[num].buf[0], par,
&offset, &attr, &bnum); // 读出该数据项的长度
if (len>0) // 有该数据项
{//**
if (ParamLock<3)
{
len1 = len1 - len - 2;
pt = pt + len;
sendbuf[sendlen] = par[1];
sendlen ++;
sendbuf[sendlen] = par[0];
sendlen ++;
sendbuf[sendlen] = 0x03;
sendlen ++;
}
else
{
len1 = len1 - len - 2;
pt = pt + len;
sendbuf[sendlen] = par[1];
sendlen ++;
sendbuf[sendlen] = par[0];
sendlen ++;
sendbuf[sendlen] = 0x02;
sendlen ++;
}
continue;
}//**
else // 无该数据项,不再继续处理剩余的数据
{
sendbuf[sendlen] = par[1];
sendlen ++;
sendbuf[sendlen] = par[0];
sendlen ++;
sendbuf[sendlen] = 0x04;
sendlen ++;
break;
}
}//*
buf[0] = 0x68; // 填写发送缓冲区
for (i=0;i<6;i++)
{
buf[i+1] = Rcv_Q[num].addr[i];
}
buf[7] = 0x68;
buf[8] = Rcv_Q[num].concode | 0x80;
//sendlen = sendlen + 1;
buf[9] = sendlen+1;
buf[10] = 0x00;
buf[11]= Rcv_Q[num].buf[0];
for (i=0;i<sendlen;i++)
{
buf[12+i] = sendbuf[i];
}
buf[12+sendlen]= AddData(buf, sendlen+12);
buf[13+sendlen]= 0x16;
PushSendQue(buf,sendlen+14, Rcv_Q[num].chtype);
}
/*********************************************************************************************************
** 函数名称: SetParam()
** 功能描述: 参数设置
**
** 输 入: num 当前处理的接收队列号
**
** 输 出: 无
**
** 全局变量:
** 调用模块:
**
** 作 者:
** 日 期:
**-------------------------------------------------------------------------------------------------------
** 修改人:
** 日 期:
**------------------------------------------------------------------------------------------------------
********************************************************************************************************/
uint8 SetParam(uint8 *pnum)
{
static uint8 num;
uint16 year,mon,day,hour,min,week,sec;
uint8 year0,mon0,day0,hour0,min0;
uint32 times0,times1;
num = *pnum;
if (Rcv_Q[num].buf[1]==0x11) // 密码部分处理
{
if ((Rcv_Q[num].buf[2]==OverCode[0]) &&
(Rcv_Q[num].buf[3]==OverCode[1]) &&
(Rcv_Q[num].buf[4]==OverCode[2]))
{
ParamLock = 0x00; // 超级权限密码,解冻
DealSetParam(&num);
return(0);
}
if ((Rcv_Q[num].buf[2]==AdminCode[0]) && // 管理员密码
(Rcv_Q[num].buf[3]==AdminCode[1]) &&
(Rcv_Q[num].buf[4]==AdminCode[2]))
{
if (ParamLock<3)
{
ParamLock = 0x00;
DealSetParam(&num);
return(0);
}
else
{
DateTimeRead(&year, &mon, &day, &week, // 读时钟
&hour, &min, &sec);
year = year%100;
year0 = (uint8)year;mon0 = (uint8)mon;day0 = (uint8)day;
hour0 = (uint8)hour;min0 = (uint8)min;
times0 = CalculateTime(&year0, &mon0, &day0, //
&hour0, &min0);
times1 = CalculateTime(&Param_Lock_time[0], &Param_Lock_time[1],
&Param_Lock_time[2], &Param_Lock_time[3],
&Param_Lock_time[4]);
times0 = times0 - times1;
if (times0>=(24*60))
{
ParamLock = 0x00;
DealSetParam(&num);
return(0);
}
else
{
RetCodeErr(&num);
return(1);
}
}
}
else
{
ParamLock += 1;
}
}
else if (Rcv_Q[num].buf[1]==0x00) // 低级权限密码
{
if ((Rcv_Q[num].buf[2]==UserCode[0]) &&
(Rcv_Q[num].buf[3]==UserCode[1]) &&
(Rcv_Q[num].buf[4]==UserCode[2]))
{
if (ParamLock<3)
{
ParamLock = 0x00;
DealSetParam(&num);
return(0);
}
else
{
DateTimeRead(&year, &mon, &day, &week, // 读时钟
&hour, &min, &sec);
year = year%100;
year0 = (uint8)year;mon0 = (uint8)mon;day0 = (uint8)day;
hour0 = (uint8)hour;min0 = (uint8)min;
times0 = CalculateTime(&year0, &mon0, &day0, // 读时钟
&hour0, &min0);
times1 = CalculateTime(&Param_Lock_time[0], &Param_Lock_time[1],
&Param_Lock_time[2], &Param_Lock_time[3],
&Param_Lock_time[4]);
times0 = times0 - times1;
if (times0>=(24*60))
{
ParamLock = 0x00;
DealSetParam(&num);
return(0);
}
else
{
RetCodeErr(&num);
return(1);
}
//return(1);
}
}
else
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -