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

📄 protocol.c

📁 单相多功能代码,计量芯片采用ADE7737做为计量,SPI通讯,仅供参考,不得用于商业
💻 C
📖 第 1 页 / 共 2 页
字号:
#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 + -