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

📄 storage.c

📁 小区巡检系统,MSPF437,里面主要参考的内容为TI单片机的低功耗处理,仅供参考,不能用于商业.
💻 C
字号:
#include "storage.h"
#include "string.h"
#include "sys_time.h"
#include "data_flash.h"
#include "sys_card.h"
#include "pub_func.h"

unsigned long _record_cnt[3];
unsigned char _person_id[5]={0xFF,0xFF,0xFF,0xFF,0xFC};
unsigned short _line_num[2]={0xFFFF,0xFFFF};
_chk_record _NewRecord;

unsigned char load_record_count(unsigned long *count)
{
    unsigned long cnt[2],addr;
    unsigned char ii,jj=0;

LOAD_RECORD_CNT:
    addr=ADDR_RECORD_CNT;
    for(ii=0;ii<2;ii++)
    {
        if(_load_data(addr,(unsigned char *)&cnt[ii],LEN_RECORD_CNT)==OK)
        {
            addr+=(LEN_RECORD_CNT+OFFSET_CHKSUM)*2;
        }
        else
        {
            if(jj<3)
            {
                jj++;
                goto LOAD_RECORD_CNT;
            }
            else
            {
                return ERROR;
            }
        }
    }

    count[0]=cnt[0];
    count[1]=cnt[1];
    count[2]=cnt[0]+cnt[1];
    return OK;
}

unsigned char save_record_count(unsigned char flag)
{
    unsigned char jj=0;

SAVE_RECORD_CNT:

    if(flag&SAVE_RECORD_COUNT)
    {
        if(_save_data(ADDR_RECORD_CNT,(unsigned char *)&_record_cnt[0],LEN_RECORD_CNT)!=OK)
        {
            if(jj<3)
            {
                jj++;
                goto SAVE_RECORD_CNT;
            }
            else
            {
                return ERROR;
            }
        }
    }
    if(flag&SAVE_NEW_RECORD_COUNT)
    {
        if(_save_data(ADDR_NEW_RECORD_CNT,(unsigned char *)&_record_cnt[1],LEN_NEW_RECORD_CNT)!=OK)
        {
            if(jj<3)
            {
                jj++;
                goto SAVE_RECORD_CNT;
            }
            else
            {
                return ERROR;
            }
        }
    }

    return OK;
}

/* save the latest record to data flash
*/
unsigned char save_record(void)
{
    _chk_record _record;
    unsigned long chksum,addr;
    unsigned char *ptr_card=(unsigned char *)&_tmp_sys_card_buf;

    if(is_data(_person_id,0xFF,LEN_PATROL_ID)==OK)
    {
        return ERROR;
    }
    if(_line_num[0]==0xFFFF)
    {
        return ERROR;
    }
    chksum=_record_cnt[0]+_record_cnt[1];

    if(_record_cnt[2]!=chksum)
    {
        if(load_record_count(_record_cnt)!=OK)
        {
            return ERROR;
        }
    }

    if(_person_id[4]!=sys_do_checksum(_person_id,LEN_PERSON_ID))
    {
        if(_load_data(ADDR_PERSON_ID,_person_id,LEN_PERSON_ID)!=OK)
        {
            return ERROR;
        }
        _person_id[4]=sys_do_checksum(_person_id,LEN_PERSON_ID);
    }

    if(_line_num[0]!=_line_num[1])
    {
        if(_load_data(ADDR_LINE_NUM,(unsigned char *)&_line_num[0],LEN_LINE_NUM)!=OK)
        {
            return ERROR;
        }
        _line_num[1]=_line_num[0];
    }

    // person id
    memcpy((unsigned char *)&_record.person_id[0],(unsigned char *)&_person_id[0],LEN_PERSON_ID);

    // line id
    _record.line_num=_line_num[0];

    // card type
    _record.type=(ptr_card[0]>>4)&0x0F;

    // station id
    _record.station_id[0]=(ptr_card[0]&0x0F)|(ptr_card[1]&0xF0);
    _record.station_id[1]=(ptr_card[1]&0x0F)|(ptr_card[2]&0xF0);
    _record.station_id[2]=(ptr_card[2]>>4)&0x0F;
    _record.station_id[3]=0;

    // date time
    _get_sys_time_bcd((unsigned char *)&_record.chk_time[0]);

    // station state
    _record.station_state=0;
    
    chksum=_record_cnt[0];
    chksum%=MAX_RECORD_COUNT;
    addr=ADDR_RECORD+chksum*(LEN_RECORD+OFFSET_CHKSUM);
    if(_save_data(addr,(unsigned char *)&_record.person_id[0],LEN_RECORD)!=OK)
    {
        return ERROR;
    }
    memcpy((unsigned char *)&_NewRecord.person_id[0],(unsigned char *)&_record.person_id[0],LEN_RECORD);

    _record_cnt[0]++;
    _record_cnt[1]++;
    _record_cnt[2]+=2;
    if(save_record_count(SAVE_RECORD_COUNT|SAVE_NEW_RECORD_COUNT)!=OK)
    {
        _record_cnt[0]--;
        _record_cnt[1]--;
        _record_cnt[2]-=2;
        return ERROR;
    }
    return OK;
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -