📄 protocol.c
字号:
#include "protocol.h"
#include "pub_func.h"
#include "sys_time.h"
#include "storage.h"
#include "data_flash.h"
#include "sys_event.h"
#include "string.h"
#include "i2c.h"
unsigned char DI0_H;
unsigned char DI0_L;
/*************************************************
* 查找控制码
*************************************************/
unsigned char FindCmdItem(const unsigned char *cmd,unsigned char ctlw)
{
unsigned char i=0;
while(*(cmd+i)!=ERROR)
{
if(*(cmd+i)==ctlw)
{
return i;
}
i++;
}
return ERROR;
}
/*************************************************
* 编程键检测
*************************************************/
unsigned char ProgramEnableDetect(void)
{
unsigned char ii;
for(ii=0;ii<0xFF;ii++)
{
//if(PROG_EN_IN&PROG_EN)
{
return ERROR;
}
//Delay(10);
}
return OK;
}
/*************************************************
* 读数据
*************************************************/
static unsigned char SlvsProcReadData(void)
{
#if 0
unsigned char idx;
idx=FindCmdItem(_slvs_rd_di1_,FrameBuffer[DI1]);
if(idx!=ERROR)
{
idx=_slvs_rd_proc_di1_[idx]();
if(idx&RET_READ_E2PROM_A)
{
AptoticDataRead(DI1DI0,&FrameBuffer[FRM_DATA+2],FrameBuffer[FRM_DATALEN]);
}
else if(idx&RET_READ_E2PROM_V)
{
VariationalDataRead(DI1DI0,&FrameBuffer[FRM_DATA+2],FrameBuffer[FRM_DATALEN]);
}
FrameBuffer[FRM_DATALEN]+=2;
return(idx);
}
#endif
return RET_NO_RESPONSION;
}
/*************************************************
* 写数据
*************************************************/
static unsigned char SlvsProcWriteData(void)
{
#if 0
unsigned char idx;
if(CheckSlvsPwd(&FrameBuffer[FRM_DATA+3])==OK)
{
idx=FindCmdItem(_slvs_wr_di1_,FrameBuffer[DI1]);
if(idx!=ERROR)
{
idx=_slvs_wr_proc_di1_[idx]();
if(idx&RET_WRITE_E2PROM_A)
{
AptoticDataWrite(DI1DI0, &FrameBuffer[16], FrameBuffer[FRM_DATALEN]);
// 如果重新设置了时区等信息,则重新确定当前时段
if((FrameBuffer[DI1]==0xC3)||(FrameBuffer[DI1]==0xC4)||(FrameBuffer[DI1]==0xC1))
{
EnsurePeriodOfTime();
}
}
else if(idx&RET_WRITE_E2PROM_V)
{
VariationalDataWrite(DI1DI0, &FrameBuffer[16], FrameBuffer[FRM_DATALEN]);
}
FrameBuffer[FRM_DATALEN]=0;
SavePgmInfo(BASE_PROGT_IDX);
return(idx);
}
}
#endif
return RET_NO_RESPONSION;
}
/*************************************************
* 写密码
*************************************************/
static unsigned char SlvsProcWritePassword(void)
{
#if 0
if(CheckSlvsPwd(&FrameBuffer[FRM_DATA+1])==OK)
{
memcpy(&FrameBuffer[FRM_DATA],&FrameBuffer[FRM_DATA+4], 4);
AptoticDataWrite(ADDR_OF_METER_PASSWORD1,&FrameBuffer[FRM_DATA],4);
FrameBuffer[FRM_DATALEN]=4;
return RET_SEND_RIGHT_RESPONSION;
}
#endif
return RET_NO_RESPONSION;
}
/*************************************************
* 电量清零
*************************************************/
static unsigned char SlvsProcClrPwrData(void)
{
#if 0
unsigned char i;
if(SlvsClrStatus&STA_CLR_PWRDATA)
{
if(CheckSlvsPwd(&FrameBuffer[FRM_DATA+1])==OK)
{
LCD_LIGHT_OUT&=~(LCD_LIGHT);
// 清本月数据
ClearCurrentMonthData(BASE_CUR);
// 清当前总数据
ClearCurrentMonthData(BASE_CURS);
for(i=0;i<120;i++)
{
// 清10年历史电量数据
ClearCurrentMonthData(YEAR_BASE+BASE_MON_OFFSET*i);
// 清10年时区数据
ClearZoneData(YEAR_ZT_BASE+BASE_ZON_OFFSET*i);
}
for(i=0;i<31;i++)
{
// 清每日电量数据
ClearTodayData(i);
}
ClearPowerDataInRam();
// 清清零状态
SlvsClrStatus=0;
LCD_LIGHT_OUT|=(LCD_LIGHT);
}
}
else
{
if(CheckSlvsPwd(&FrameBuffer[FRM_DATA+1])==OK)
{
SlvsClrStatus=STA_CLR_PWRDATA;
TimerCounter[TIMER_PROC_CLR]=10;
TimerProc[TIMER_PROC_CLR]=ResetClearStatusWord;
}
}
#endif
return RET_NO_RESPONSION;
}
/*************************************************
* 清密码
*************************************************/
static unsigned char SlvsProcClrPassword(void)
{
#if 0
if(SlvsClrStatus&STA_CLR_PWD)
{
//if(CheckSlvsPwd(&FrameBuffer[FRM_DATA+1])==OK)
{
// 清零密码数据
MemSetTo0(&FrameBuffer[20],12);
AptoticDataWrite(ADDR_OF_METER_PASSWORD1,&FrameBuffer[20],12);
// 清清零状态
SlvsClrStatus=0;
}
}
else
{
//if(CheckSlvsPwd(&FrameBuffer[FRM_DATA+1])==OK)
{
SlvsClrStatus=STA_CLR_PWD;
TimerCounter[TIMER_PROC_CLR]=10;
TimerProc[TIMER_PROC_CLR]=ResetClearStatusWord;
}
}
#endif
return RET_NO_RESPONSION;
}
/*************************************************
* 清电表常数
*************************************************/
static unsigned char SlvsProcClrConstant(void)
{
#if 0
if(SlvsClrStatus&STA_CLR_METER_CONSTRANT)
{
if(CheckSlvsPwd(&FrameBuffer[FRM_DATA+1])==OK)
{
MemSetTo0(&FrameBuffer[20],6);
AptoticDataWrite(ADDR_OF_METER_CONSTANT_A,&FrameBuffer[20],6);
// 清清零状态
SlvsClrStatus=0;
FrameBuffer[FRM_DATALEN]=0;
return RET_SEND_RIGHT_RESPONSION;
}
}
else
{
if(CheckSlvsPwd(&FrameBuffer[FRM_DATA+1])==OK)
{
SlvsClrStatus=STA_CLR_METER_CONSTRANT;
TimerCounter[TIMER_PROC_CLR]=10;
TimerProc[TIMER_PROC_CLR]=ResetClearStatusWord;
FrameBuffer[FRM_DATALEN]=0;
return RET_SEND_RIGHT_RESPONSION;
}
}
#endif
return RET_NO_RESPONSION;
}
/*************************************************
* 清存储固定数据的E2prom
*************************************************/
static unsigned char SlvsProcClrFram(void)
{
#if 0
unsigned short addr=0;
unsigned char i;
if(SlvsClrStatus&STA_CLR_E2PROM_A)
{
if(CheckSlvsPwd(&FrameBuffer[FRM_DATA+1])==OK)
{
MemSetTo0(&FrameBuffer[20],32);
for(i=0;i<64;i++)
{
//AptoticDataWrite(addr,&FrameBuffer[20],32);
addr+=32;
}
// 清清零状态
SlvsClrStatus=0;
}
}
else
{
if(CheckSlvsPwd(&FrameBuffer[FRM_DATA+1])==OK)
{
SlvsClrStatus=STA_CLR_E2PROM_A;
TimerCounter[TIMER_PROC_CLR]=10;
TimerProc[TIMER_PROC_CLR]=ResetClearStatusWord;
}
}
#endif
return RET_NO_RESPONSION;
}
/*************************************************
* 清存储可变数据的E2prom
*************************************************/
static unsigned char SlvsProcClrDataflash(void)
{
#if 0
unsigned long addr=0;
unsigned char temp[128];
if(SlvsClrStatus&STA_CLR_E2PROM_V)
{
if(CheckSlvsPwd(&FrameBuffer[FRM_DATA+1])==OK)
{
LCD_LIGHT_OUT&=~(LCD_LIGHT);
MemSetTo0(&temp[0],128);
for(addr=0;addr<0x100000;addr+=128)
{
VariationalDataWrite(addr,temp,128);
}
ClearPowerDataInRam();
// 清清零状态
SlvsClrStatus=0;
LCD_LIGHT_OUT|=LCD_LIGHT;
}
}
else
{
if(CheckSlvsPwd(&FrameBuffer[FRM_DATA+1])==OK)
{
SlvsClrStatus=STA_CLR_E2PROM_V;
TimerCounter[TIMER_PROC_CLR]=10;
TimerProc[TIMER_PROC_CLR]=ResetClearStatusWord;
}
}
#endif
return RET_NO_RESPONSION;
}
/*************************************************
* 遥控器控制LCD显示
*------------------------------------------------
* 数据桢格式:0x68+表号+0x68+控制码(0x60)+数据长度(0x02)+数据(2字节)+校验+0x16
* 正确应答:0x68+表号+0x68+控制码(0xE0)+数据长度(0x0)+数据(0字节)+校验+0x16
* 说明:
* 1.支持广播方式,正确或错误均无应答
* 2.单机通信时,正确有应答,错误无应答
* 3.数据桢中的数据域内容为要显示的东东的显示号
*************************************************/
static unsigned char SlvsProcDispInfo(void)
{
return OK;
}
/*************************************************
* 广播校时
*************************************************/
static unsigned char SlvsProcReviseTime(void)
{
#if 0
unsigned short min1,min2;
unsigned char flg;
if(ProgramEnableDetect()==OK)
{
goto SET_SYS_TIME;
}
// 读对时标记
AptoticDataRead(ADDR_OF_SUCCESSSETTIME_FLAG,&flg,1);
if(flg!=1)
{
// 如果年,月,日与当前时间不一样,则不进行对时
if(!IsEqual(&SystemTime[SPACE_OF_DAY],&FrameBuffer[FRM_DATA+3], 3))
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -