#include "cyclic_storage_cfg_api.h" #include "cyclic_storage_data_created_api.h" #include "gpio.h" #include "string.h" #include "bootloader_iap.h" #include "off_chip_flash.h" // »·Ð´´¢´æµÄ¿éÊýÁ¿ #define CYCLIC_STORAGE_BLOCK_CNT (128) // »·Ð´´¢´æµÄ´óС #define CYCLIC_STORAGE_SIZE (CYCLIC_STORAGE_BLOCK_CNT * OUT_FLASH_SECTOR_SIZE) // 512KB // »·Ð´´¢´æÆðʼµØÖ·£¨Ä¬ÈÏÖµ£© #define CYCLIC_STORAGE_START_ADDR (BOOTLOAD_DIFF_PROG_START_ADDRESS + BOOTLOAD_DIFF_PROG_LEN_MAX) //416K // »·Ð´´¢´æ½áÊøµØÖ·£¨Ä¬ÈÏÖµ£© #define CYCLIC_STORAGE_END_ADDR (CYCLIC_STORAGE_START_ADDR + CYCLIC_STORAGE_SIZE) SYSLOG_CYCLIC_DATA_T sys_log_cyclic_data_g = {0}; /*ÀúÊ·¼Ç¼ÈÕÖ¾±í£¨»·Ð´£©*/ const SYSLOG_CYCLIC_TABLE_T sys_log_cyclic_table[] = { {&sys_log_cyclic_data_g.send_flow_data_log, SEND_FLOW_DATA_LOG_FORMAT_SIZE, 6 * 24 * 3}, //°´10·ÖÖÓ´¢´æÒ»´Î£¬´¢´æÈýÌìµÄ×î´óÌõÊý¼ÆËã {&sys_log_cyclic_data_g.sys_hour_flow_data_log, HISTORY_FLOW_DATA_LOG_FORMAT_SIZE, 2 * 24 * 31}, // 2¸öÔ {&sys_log_cyclic_data_g.sys_day_flow_data_log, HISTORY_FLOW_DATA_LOG_FORMAT_SIZE, 365}, // 1Äê {&sys_log_cyclic_data_g.sys_month_flow_data_log, HISTORY_FLOW_DATA_LOG_FORMAT_SIZE, 10 * 12}, // 10Äê {&sys_log_cyclic_data_g.measure_alarm_log, MEASURE_ALARM_DATA_LOG_FORMAT_SIZE, 200}, // ÌõÊý {&sys_log_cyclic_data_g.other_alarm_log, OTHER_ALARM_DATA_LOG_FORMAT_SIZE, 400}, {&sys_log_cyclic_data_g.valve_log, VALVE_LOG_FORMAT_SIZE, 100}, {&sys_log_cyclic_data_g.pay_log, PAY_LOG_FORMAT_SIZE, 100}, {&sys_log_cyclic_data_g.restore_default_log, RESTORE_DEFAULT_LOG_FORMAT_SIZE, 5}, {&sys_log_cyclic_data_g.timing_log,TIMING_LOG_FORMAT_SIZE,50}, {&sys_log_cyclic_data_g.gas_cumulate_amend_log, GAS_CUMULATE_AMEND_LOG_FORMAT_SIZE, 20}, {&sys_log_cyclic_data_g.balance_amend_log, BALANCE_AMEND_LOG_FORMAT_SIZE, 20}, {&sys_log_cyclic_data_g.temp_cfg_amend_log, TEMP_CFG_AMEND_LOG_FORMAT_SIZE, 20}, {&sys_log_cyclic_data_g.press_cfg_amend_log, PRESS_CFG_AMEND_LOG_FORMAT_SIZE, 20}, {&sys_log_cyclic_data_g.billing_price_amend_log, BILLING_PRICE_AMEND_LOG_FORMAT_SIZE, 20}, {&sys_log_cyclic_data_g.flow_cfg_amend_log, FLOW_CFG_AMEND_LOG_FORMAT_SIZE, 20}, {&sys_log_cyclic_data_g.cal_pulse_amend_log, CAL_PULSE_AMEND_LOG_FORMAT_SIZE, 20}, {&sys_log_cyclic_data_g.sys_func_cfg_amend_log, SYS_FUNC_CFG_AMEND_LOG_FORMAT_SIZE, 20}, {&sys_log_cyclic_data_g.alarm_ctl_send_bytes_amend_log,ALARM_CTL_SEND_BYTES_AMEND_LOG_FORMAT_SIZE,20}, {&sys_log_cyclic_data_g.valve_ctl_bytes_amend_log,VALVE_CTL_BYTES_AMEND_LOG_FORMAT_SIZE,20}, {&sys_log_cyclic_data_g.billing_alarm_cfg_amend_log,BILLING_ALARM_CFG_AMEND_LOG_FORMAT_SIZE,20}, {&sys_log_cyclic_data_g.sec_corr_para_amend_log,SEC_CORR_PARA_AMEND_LOG_FORMAT_SIZE,20}, }; /*ÓÃÓÚÅжÏÊÇÄĸö²ÎÊýÐ޸IJ¢¼Ç¼*/ const PARA_AMEND_TABLE_T para_amend_table[12] = { {GAS_CUMULATE_PARA_AMEND, &sys_log_cyclic_table[CYCL_GAS_CUMULATE_AMEND]}, {BALANCE_PARA_AMEND, &sys_log_cyclic_table[CYCL_BALANCE_AMEND]}, {TEMP_CFG_PARA_AMEND, &sys_log_cyclic_table[CYCL_TEMP_CFG_AMEND]}, {PRESS_CFG_PARA_AMEND, &sys_log_cyclic_table[CYCL_PRESS_CFG_AMEND]}, {BILLING_PARA_AMEND, &sys_log_cyclic_table[CYCL_BILLING_PRICE_AMEND]}, {GAS_CFG_PARA_AMEND, &sys_log_cyclic_table[CYCL_FLOW_CFG_AMEND]}, {PLUSE_CAL_PARA_AMEND, &sys_log_cyclic_table[CYCL_CAL_PULSE_AMEND]}, {SYS_FUNC_CFG_BYTES_AMEND,&sys_log_cyclic_table[CYCL_SYS_FUNC_CFG_AMEND]}, {ALARM_CTL_SEND_BYTES_AMEND,&sys_log_cyclic_table[CYCL_ALARM_CTL_SEND_BYTES_AMEND]}, {VALVE_CTL_BYTES_AMEND,&sys_log_cyclic_table[CYCL_VALVE_CTL_BYTES_AMEND]}, {BILLING_ALARM_CFG_AMEND,&sys_log_cyclic_table[CYCL_BILLING_ALARM_CFG_AMEND]}, {SEC_ORDER_CORR_PARA_AMEND,&sys_log_cyclic_table[CYCL_SEC_CORR_PARA_AMEND]}, }; /*Åжϴ˿̻·Ð´ÊÇ·ñµ½´ïµØÖ·Î²£¨×î´ónum£© µ½´ï·µ»Ø1 δµ½´ï·µ»Ø0*/ uint8_t Sys_Log_E2pCyclicFull(const SYSLOG_CYCLIC_TABLE_T *log_table_p) { if ((log_table_p->table_id->log_index - 1) >= log_table_p->data_num) // Åжϴ˿ÌÊÇ·ñµ½´ïµØÖ·Î²£¨×î´ónum£© { log_table_p->table_id->log_index = 1; // ·¶Î§ 1 ~ (data_num + 1) log_table_p->table_id->log_cyclic_full_cnt++; if (log_table_p->table_id->log_cyclic_full_cnt == 0) // cnt++Ô½½çÁ˺ó²»ÄܵÈÓÚ0 log_table_p->table_id->log_cyclic_full_cnt = 1; FM25V02_data_write(log_table_p->table_id->log_cyclic_full_cnt,log_table_p->table_id->log_full_cnt_addr); FM25V02_data_write_uint16(log_table_p->table_id->log_index_addr,log_table_p->table_id->log_index); return 1; } return 0; } /* ÈÕÖ¾E2p»·Ð´µ¥´Î log_table_p £ºÈÕÖ¾±íÖ¸Õë pBuffer £º¾ßÌåµÄдÈëÊý¾ÝÄÚÈÝ ÊÇ·ñÕý³££ºÕý³££¬²âÊÔʱ¼ä230407 */ void Sys_Log_E2pCyclicWrite_1_Data(const SYSLOG_CYCLIC_TABLE_T *log_table_p, uint8_t *pBuffer) { uint32_t now_addr = log_table_p->table_id->log_start_addr + (log_table_p->table_id->log_index - 1) * log_table_p->data_size; log_table_p->table_id->log_index++; /*´¢´æÊý¾Ý*/ Out_Flash_MultipleWrite(pBuffer, now_addr, log_table_p->data_size); if (Sys_Log_E2pCyclicFull(log_table_p) == 0) FM25V02_data_write_uint16(log_table_p->table_id->log_index_addr,log_table_p->table_id->log_index); } /* ÈÕÖ¾E2p»·Ð´¶à´Î log_table_p £ºÈÕÖ¾±íÖ¸Õë pBuffer £º¾ßÌåµÄдÈëÊý¾ÝÄÚÈÝ write_cnt:д´ÎÊý ÊÇ·ñÕý³££ºÕý³££¬²âÊÔʱ¼ä230407 */ void Sys_Log_E2pCyclicMultipleWrite(const SYSLOG_CYCLIC_TABLE_T *log_table_p, uint8_t *pBuffer,uint8_t write_cnt) { E2P_PWR_ON; // ¿ªÆôE2pµçÔ´ for(uint8_t i = 0;i < write_cnt;i++) Sys_Log_E2pCyclicWrite_1_Data(log_table_p,&pBuffer[i * log_table_p->data_size]); E2P_PWR_OFF; // ¹Ø±ÕE2pµçÔ´ } /* ÓÃÓÚÔ¶´«Á÷Á¿Êý¾ÝµÄÌØÊâд pBuffer £º¾ßÌåµÄдÈëÊý¾ÝÄÚÈÝ write_cnt:д´ÎÊý ÊÇ·ñÕý³££ºÕý³££¬²âÊÔʱ¼ä230407 */ ErrorStatus_STM32 SendFlowData_SpecialWrite(uint8_t *pBuffer,uint8_t write_cnt) { E2P_PWR_ON; // ¿ªÆôE2pµçÔ´ ErrorStatus_STM32 result = ERROR_1; uint32_t now_addr = 0; const SYSLOG_CYCLIC_TABLE_T *log_table_p = &sys_log_cyclic_table[CYCL_SEND_FLOW_DATA]; for(uint8_t i = 0;i < write_cnt;i++) { now_addr = log_table_p->table_id->log_start_addr + (log_table_p->table_id->log_index - 1) * log_table_p->data_size; log_table_p->table_id->log_index++; if (Sys_Log_E2pCyclicFull(log_table_p) == 0) FM25V02_data_write_uint16(log_table_p->table_id->log_index_addr,log_table_p->table_id->log_index); /*¶à´ÎÑéÖ¤±£Ö¤Êý¾ÝµÄÕýÈ·ÐÔºÍÍêÕûÐÔ*/ for(uint8_t j = 0;j < 3;j++) { uint8_t read_sum = 0,save_sum = 0,calc_sum = 0,temp_buffer[log_table_p->data_size]; /*´¢´æÊý¾Ý*/ Out_Flash_MultipleWrite(pBuffer, now_addr, log_table_p->data_size); /*¶ÁÈ¡Êý¾Ý*/ Out_Flash_MultipleRead(temp_buffer, now_addr, log_table_p->data_size); save_sum = pBuffer[0]; read_sum = temp_buffer[0]; calc_sum = CalcCheckSum(&temp_buffer[1], log_table_p->data_size); if((calc_sum == save_sum) && (read_sum == save_sum)) //дÈëÕýÈ· { result = SUCCESS_0; break; } } } E2P_PWR_OFF; // ¹Ø±ÕE2pµçÔ´ return result; } /* ÓÃÓÚÔ¶´«Á÷Á¿Êý¾ÝµÄÌØÊâ¶Á pOutput £º¾ßÌåµÄÊä³öÊý¾ÝÄÚÈÝ read_cnt£º¶Á´ÎÊý back_or_forward£ºµ¹Ðò¶Áor˳Ðò¶Á ÊÇ·ñÕý³££ºÕý³££¬²âÊÔʱ¼ä230407 */ ErrorStatus_STM32 SendFlowData_SpecialRead(uint8_t *pOutput,uint8_t read_cnt,uint8_t back_or_forward) { E2P_PWR_ON; // ¿ªÆôE2pµçÔ´ ErrorStatus_STM32 result = ERROR_1; const SYSLOG_CYCLIC_TABLE_T *log_table_p = &sys_log_cyclic_table[CYCL_SEND_FLOW_DATA]; uint32_t addr_now; for(uint8_t j = 0;j < read_cnt;j++) { /*¼ÆËãµØÖ·*/ if(back_or_forward == REVERSE_READ) addr_now = Sys_Log_E2pCyclic_ReverseGetStartAddr(log_table_p,j + 1); else if(back_or_forward == POSITIVE_READ) addr_now = Sys_Log_E2pCyclic_ReverseGetStartAddr(log_table_p,read_cnt - j); /*¶à´ÎÑéÖ¤±£Ö¤Êý¾ÝµÄÕýÈ·ÐÔºÍÍêÕûÐÔ*/ for(uint8_t i = 0;i < 3;i++) { uint8_t read_sum, calc_sum; /*¼ÆËãºÍ*/ Out_Flash_MultipleRead(&pOutput[j * log_table_p->data_size] , addr_now, log_table_p->data_size); calc_sum = CalcCheckSum(&pOutput[1], log_table_p->data_size); /*´¢´æºÍ*/ read_sum = pOutput[0]; //Ö»ÓÐÔÚ¸ÕÉϵçʱ²Å»áµ÷Óô˺¯Êý£¬ËùÒÔ´¢´æÖеÄУÑéºÍÓëÌáÈ¡Êý¾ÝºóµÄ¼ÆËãºÍ²»Ò»ÖÂʱ //1.¿ÉÄÜ´ú±íE2PË𻵠2.Öжϴò¶Ï¶ÁÈ¡º¯Êý if (read_sum == calc_sum) { result = SUCCESS_0; break; } } } E2P_PWR_OFF; // ¿ªÆôE2pµçÔ´ return result; } /* ÓÃÓÚÔ¶´«Á÷Á¿Êý¾Ý¶ÁÒ»ÌõÊý¾Ý pOutput £º¾ßÌåµÄÊä³öÊý¾ÝÄÚÈÝ pRead_addr£ºÔ¶´«·¢ËÍÊý¾ÝµÄ¶ÁµØÖ· ÊÇ·ñÕý³££º */ uint32_t SendFlowData_Read_1_Data(uint8_t *pOutput,uint32_t read_addr) { ErrorStatus_STM32 success_flag = ERROR_1; uint32_t next_addr = read_addr; const SYSLOG_CYCLIC_TABLE_T *log_table_p = &sys_log_cyclic_table[CYCL_SEND_FLOW_DATA]; /*¶à´ÎÑéÖ¤±£Ö¤Êý¾ÝµÄÕýÈ·ÐÔºÍÍêÕûÐÔ*/ for(uint8_t i = 0;i < 3;i++) { uint8_t read_sum, calc_sum; /*¼ÆËãºÍ*/ next_addr = Sys_Log_E2pCyclicRead_1_Data(log_table_p, pOutput, read_addr); calc_sum = CalcCheckSum(&pOutput[1], log_table_p->data_size); /*´¢´æºÍ*/ read_sum = pOutput[0]; //Ö»ÓÐÔÚ¸ÕÉϵçʱ²Å»áµ÷Óô˺¯Êý£¬ËùÒÔ´¢´æÖеÄУÑéºÍÓëÌáÈ¡Êý¾ÝºóµÄ¼ÆËãºÍ²»Ò»ÖÂʱ //1.¿ÉÄÜ´ú±íE2PË𻵠2.Öжϴò¶Ï¶ÁÈ¡º¯Êý if (read_sum == calc_sum) { success_flag = SUCCESS_0; return next_addr; } } return next_addr; } /******************************************************************** * name : Sys_Log_E2pCyclic_ReverseGetStartAddr * description : ÒÔµ¹ÐòµÄ·½Ê½»ñµÃÊý¾Ý¿ªÊ¼µØÖ· * Input : *log_table_p£ºÈÕÖ¾±íÖ¸Õë back_cnt£ºÒÔµ±Ç°ÎªÆðʼ£¬»ØÍƵÄÊý¾ÝÌõÊý * Output : none * Return : start_addr:Êý¾ÝµÄÆðʼµØÖ· ÊÇ·ñÕý³££ºÕý³££¬²âÊÔʱ¼ä230407 ********************************************************************/ uint32_t Sys_Log_E2pCyclic_ReverseGetStartAddr(const SYSLOG_CYCLIC_TABLE_T *log_table_p, uint16_t back_cnt) { uint32_t get_start_addr = 0; uint16_t real_log_index = log_table_p->table_id->log_index - 1; uint16_t data_full_index_cnt = 0, calc_index = 0; if (log_table_p->table_id->log_cyclic_full_cnt) // ÄÚ´æ»·Âú { if (back_cnt > log_table_p->data_num) // Åж϶ÁÈ¡ÌõÊýÊÇ·ñÔ½½ç back_cnt = log_table_p->data_num; if (back_cnt > real_log_index) //»ØÍÆÌõÊý´óÓÚµ±Ç°ÌõÊý { data_full_index_cnt = back_cnt - real_log_index; // ¼ÆËã³ýÈ¥Ë÷Òý³¤¶Èµ½×î´ó³¤¶È»¹Óж೤ calc_index = log_table_p->data_num - data_full_index_cnt; // ¼ÆËãË÷Òý get_start_addr = log_table_p->table_id->log_start_addr + calc_index * log_table_p->data_size; } else get_start_addr = (real_log_index - back_cnt) * log_table_p->data_size + log_table_p->table_id->log_start_addr; } else // Äڴ滷δÂú { if (back_cnt > real_log_index) back_cnt = real_log_index; get_start_addr = (real_log_index - back_cnt) * log_table_p->data_size + log_table_p->table_id->log_start_addr; } return get_start_addr; } /******************************************************************** * name : Sys_Log_E2pCyclic_PositiveGetStartAddr£¨ÔÝÎÞÔËÓó¡¾°£© * description : ÒÔÕýÐòµÄ·½Ê½»ñµÃÊý¾Ý¿ªÊ¼µØÖ· * Input : *log_table_p£ºÈÕÖ¾±íÖ¸Õë forward_cnt£ºÒÔ×îÀϵÄÊý¾ÝΪÆðʼ£¬ÕýÍÆµÄÊý¾ÝÌõÊý * Output : none * Return : start_addr:Êý¾ÝµÄÆðʼµØÖ· ********************************************************************/ uint32_t Sys_Log_E2pCyclic_PositiveGetStartAddr(const SYSLOG_CYCLIC_TABLE_T *log_table_p, uint16_t forward_cnt) { uint32_t get_start_addr = 0; if(log_table_p->table_id->log_cyclic_full_cnt) // ÄÚ´æ»·Âú { } else { } return get_start_addr; } /******************************************************************** * name : Sys_Log_E2pCyclic_TimeInterval_GetStartAddr * description : °´Ê±¼äÇø¼ä»ñµÃÊý¾Ý¿ªÊ¼µØÖ·ºÍÌõÊý£¨ÊÊÓÃÓÚ´æ´¢ÌõÊý¶àÇÒÓйæÂÉÓÐÖÜÆÚ´æ´¢µÄÊý¾Ý£© * Input : *log_table_p£ºÈÕÖ¾±íÖ¸Õë start_time_bcd[6]£º¿ªÊ¼Ê±¼ä end_time_bcd[6]£º½áÊøÊ±¼ä para_flag£º0£ºÆäËû 1£ºÐ¡Ê±¼Ç¼ 2£ºÌì¼Ç¼ 3£ºÔ¼Ç¼ * Output : *pSend_data_num : ÐèÒªÌáÈ¡Êý¾ÝµÄÌõÊý * Return : start_addr:Êý¾ÝµÄÆðʼµØÖ· ÊÇ·ñÕý³££ºÕý³££¬²âÊÔʱ¼ä230627 ********************************************************************/ uint32_t Sys_Log_E2pCyclic_TimeGetStartAddr(const SYSLOG_CYCLIC_TABLE_T *log_table_p, uint16_t *pSend_data_num, uint8_t start_time_bcd[6],uint8_t end_time_bcd[6],uint8_t para_flag) { uint32_t get_start_addr = 0; uint8_t old_e2p_time_bcd[6] = {0};//E2P×îÀϵÄʱ¼äÊý¾Ý /*µ±Ç°Ê±¼äÒ²ÊÇE2P×îд洢Êý¾ÝµÄʱ¼ä*/ uint8_t new_e2p_time_bcd[] = {calendar_g.Year, calendar_g.Month, calendar_g.Date, calendar_g.Hour, calendar_g.Minute, calendar_g.Second}; uint32_t old_log_start_addr; E2P_PWR_ON; // ¿ªÆôE2pµçÔ´ /*·½·¨1*/ int start_2_e2p_old_time_diff,end_2_e2p_old_time_diff, e2p_new_2_start_time_diff,e2p_new_2_end_time_diff; /*ÌáÈ¡³ö×îÀϵÄÒ»ÌõÊý¾ÝµÄʱ¼ä*/ old_log_start_addr = Sys_Log_E2pCyclic_ReverseGetStartAddr(log_table_p, log_table_p->data_num); switch(para_flag) { case 0: Out_Flash_MultipleRead(old_e2p_time_bcd,old_log_start_addr + SIZEOF_OF(VALVE_SYSLOG_FORMAT_T,record_num),6); break; case 1: case 2: case 3: Out_Flash_MultipleRead(old_e2p_time_bcd,old_log_start_addr,6); break; default:break; } start_2_e2p_old_time_diff = Datecmp(start_time_bcd,old_e2p_time_bcd);// ¿ªÊ¼Ê±¼ä ºÍ ´æ´¢µÄ×îÀÏʱ¼äµÄ ʱ¼ä²î end_2_e2p_old_time_diff = Datecmp(end_time_bcd,old_e2p_time_bcd);//½áÊøÊ±¼ä ºÍ ´æ´¢×îÀϵÄʱ¼äµÄ ʱ¼ä²î e2p_new_2_start_time_diff = Datecmp(new_e2p_time_bcd,start_time_bcd);// ´æ´¢×îÐÂʱ¼ä ºÍ ¿ªÊ¼Ê±¼äµÄ ʱ¼ä²î e2p_new_2_end_time_diff = Datecmp(new_e2p_time_bcd,end_time_bcd);//´¢´æ×îÐÂʱ¼ä ºÍ ½áÊøÊ±¼äµÄ ʱ¼ä²î if(end_2_e2p_old_time_diff <= 0 || e2p_new_2_start_time_diff <= 0) //²»ÔÚ´¢´æÊ±¼ä·¶Î§ { /*½oÒ»¸ö¶ÁÈ¡µÄ×î´óÌõÊý*/ if(log_table_p->table_id->log_index >= 20 || log_table_p->table_id->log_cyclic_full_cnt) *pSend_data_num = 20; else *pSend_data_num = log_table_p->table_id->log_index - 1; /*¼ÆËãÆðʼʱ¼äµÄµØÖ·*/ get_start_addr = Sys_Log_E2pCyclic_ReverseGetStartAddr(log_table_p, *pSend_data_num); }else { if(start_2_e2p_old_time_diff <= 0) // Æðʼʱ¼ä <= E2p´¢´æµÄ×îÔçʱ¼ä { get_start_addr = old_log_start_addr; if(e2p_new_2_end_time_diff <= 0) //E2p´¢´æµÄ×îÐÂʱ¼ä <= ½áÊøÊ±¼ä { if(log_table_p->table_id->log_cyclic_full_cnt) //»·Ð´Âú *pSend_data_num = log_table_p->data_num; else *pSend_data_num = log_table_p->table_id->log_index - 1; } else //E2p´¢´æµÄ×îÐÂʱ¼ä > ½áÊøÊ±¼ä { uint16_t e2p_old_2_end_days_diff = Date_DaysDifference(old_e2p_time_bcd[0],old_e2p_time_bcd[1],old_e2p_time_bcd[2],end_time_bcd[0],end_time_bcd[1],end_time_bcd[2]); switch(para_flag) { case 1: *pSend_data_num = e2p_old_2_end_days_diff * 24 - BCD_2_HEX_U8(old_e2p_time_bcd[3]) + BCD_2_HEX_U8(end_time_bcd[3]); break; case 2: *pSend_data_num = e2p_old_2_end_days_diff; break; case 3: *pSend_data_num = Data_MonthsDifference(old_e2p_time_bcd[0],old_e2p_time_bcd[1],end_time_bcd[0],end_time_bcd[1]); break; default:break; } } } else { uint16_t days_diff; // Æðʼµ½ÊµÊ±Ê±¼äµÄÌìÊý²î days_diff = Date_DaysDifference(start_time_bcd[0], start_time_bcd[1], start_time_bcd[2], new_e2p_time_bcd[0], new_e2p_time_bcd[1], new_e2p_time_bcd[2]); /*¼ÆËãÆðʼʱ¼äÖÁµ±Ç°Ê±¼ä¹²ÓжàÉÙÌõÊý¾Ý*/ switch(para_flag) { case 1: *pSend_data_num = days_diff * 24 - BCD_2_HEX_U8(start_time_bcd[3]) + BCD_2_HEX_U8(new_e2p_time_bcd[3]); break; case 2: *pSend_data_num = days_diff + 1; break; case 3: *pSend_data_num = Data_MonthsDifference(start_time_bcd[0],start_time_bcd[1],new_e2p_time_bcd[0],new_e2p_time_bcd[1]) + 1; break; default:break; } /*¼ÆËãÆðʼʱ¼äµÄµØÖ·*/ get_start_addr = Sys_Log_E2pCyclic_ReverseGetStartAddr(log_table_p, *pSend_data_num); if(e2p_new_2_end_time_diff > 0) //E2p´¢´æµÄ×îÐÂʱ¼ä > ½áÊøÊ±¼ä { days_diff = Date_DaysDifference(start_time_bcd[0], start_time_bcd[1], start_time_bcd[2], end_time_bcd[0], end_time_bcd[1], end_time_bcd[2]); switch(para_flag) { case 1: *pSend_data_num = days_diff * 24 - BCD_2_HEX_U8(start_time_bcd[3]) + BCD_2_HEX_U8(end_time_bcd[3]); break; case 2: *pSend_data_num = days_diff; break; case 3: *pSend_data_num = Data_MonthsDifference(start_time_bcd[0],start_time_bcd[1],end_time_bcd[0],end_time_bcd[1]); break; default:break; } } } if(log_table_p->table_id->log_cyclic_full_cnt && *pSend_data_num > log_table_p->data_num) *pSend_data_num = log_table_p->data_num; else if(log_table_p->table_id->log_cyclic_full_cnt == 0 && (*pSend_data_num > (log_table_p->table_id->log_index - 1))) *pSend_data_num = log_table_p->table_id->log_index - 1; } /*·½·¨2*/ // if (Datecmp(start_time_bcd, new_e2p_time_bcd) <= 0) // Æðʼʱ¼ä <= ʵʱʱ¼ä // { // /*ÌáÈ¡³ö×îÀϵÄÒ»ÌõÊý¾ÝµÄʱ¼ä*/ // old_log_start_addr = Sys_Log_E2pCyclic_ReverseGetStartAddr(log_table_p, log_table_p->data_num); // switch(para_flag) // { // case 0: // EEPROM_MultipleRead(old_e2p_time_bcd,old_log_start_addr + SIZEOF_OF(VALVE_SYSLOG_FORMAT_T,record_num),6); // break; // case 1: // case 2: // case 3: // EEPROM_MultipleRead(old_e2p_time_bcd,old_log_start_addr,6); // break; // default:break; // } // if (Datecmp(start_time_bcd, old_e2p_time_bcd) <= 0) // Æðʼʱ¼ä <= E2p´¢´æµÄ×îÔçʱ¼ä // get_start_addr = old_log_start_addr; // else // { // uint16_t data_num_start_2_real,start_to_real_days_diff; // // Æðʼµ½ÊµÊ±Ê±¼äµÄÌìÊý²î // start_to_real_days_diff = Date_DaysDifference(start_time_bcd[0], start_time_bcd[1], start_time_bcd[2], new_e2p_time_bcd[0], new_e2p_time_bcd[1], new_e2p_time_bcd[2]); // /*¼ÆËãÆðʼʱ¼äÖÁµ±Ç°Ê±¼ä¹²ÓжàÉÙÌõÊý¾Ý*/ // switch(para_flag) // { // case 1: // data_num_start_2_real = start_to_real_days_diff * 24 - BCD_2_HEX_U8(start_time_bcd[3]) + BCD_2_HEX_U8(new_e2p_time_bcd[3]); // break; // case 2: // data_num_start_2_real = start_to_real_days_diff; // break; // case 3: // data_num_start_2_real = Data_MonthsDifference(start_time_bcd[0],start_time_bcd[1],new_e2p_time_bcd[0],new_e2p_time_bcd[1]); // break; // default:break; // } // /*¼ÆËãÆðʼʱ¼äµÄµØÖ·*/ // get_start_addr = Sys_Log_E2pCyclic_ReverseGetStartAddr(log_table_p, data_num_start_2_real); // } // } E2P_PWR_OFF; // ¹Ø±ÕE2pµçÔ´ return get_start_addr; } /******************************************************************** * name : Sys_Log_E2pCyclic_StartTime_GetStartAddr * description : °´¿ªÊ¼Ê±¼ä»ñµÃÊý¾Ý¿ªÊ¼µØÖ·£¨ÊÊÓÃÓÚ´¢´æÌõÊýÉÙÇÒ²»¹æÂÉ´æ´¢µÄÊý¾Ý£© * Input : *log_table_p£ºÈÕÖ¾±íÖ¸Õë start_time_bcd[6]£º¿ªÊ¼Ê±¼ä end_time_bcd[6]£º½áÊøÊ±¼ä offset_addr£º¸ù¾Ý²»Í¬´¢´æ²ÎÊýµÄ¸ñʽÖС°Ê±¼ä¡±Êý¾ÝµÄÆ«ÒÆµØÖ· * Output : *pSend_data_num : ÐèÒªÌáÈ¡Êý¾ÝµÄÌõÊý * Return : start_addr:Êý¾ÝµÄÆðʼµØÖ· ÊÇ·ñÕý³££ºÕý³££¬²âÊÔʱ¼ä230629 ********************************************************************/ uint32_t Sys_Log_E2pCyclic_StartTime_GetStartAddr(const SYSLOG_CYCLIC_TABLE_T *log_table_p, uint16_t *pSend_data_num, uint8_t start_time_bcd[6],uint8_t end_time_bcd[6],uint8_t offset_addr) { uint8_t e2p_time_1[6] = {0}; uint32_t get_start_addr = 0,old_log_start_addr,new_log_start_addr; int32_t addr_temp; //ÓÉÓÚÓÐ--µÄÇé¿ö»áµ¼Ö¸ºÊý£¬ËùÒÔÓÃÓзûºÅ uint16_t search_num = 0;//ÐèÒª±È½ÏµÄÊý¾Ý×ÜºÍ uint16_t real_num = 0; //ÕæÊµÐèÒªÌáÈ¡Êý¾ÝµÄÌõÊý uint16_t i; int data_cmp = 0; E2P_PWR_ON; // ¿ªÆôE2pµçÔ´ /*·½·¨1*/ old_log_start_addr = Sys_Log_E2pCyclic_ReverseGetStartAddr(log_table_p,log_table_p->data_num); new_log_start_addr = Sys_Log_E2pCyclic_ReverseGetStartAddr(log_table_p,1); if(old_log_start_addr == new_log_start_addr)//ÎÞÊý¾Ý or Ö»ÓÐÒ»ÌõÊý¾Ý { if(log_table_p->table_id->log_index == 2) //ÓÐÒ»ÌõÊý¾Ý *pSend_data_num = 1; else *pSend_data_num = 0; return new_log_start_addr; } uint8_t old_e2p_time_bcd[6] = {0},new_e2p_time_bcd[6];//E2P×îÀϺÍ×îеÄʱ¼äÊý¾Ý /*ÓÉÓÚÊý¾Ý¸ñʽǰÁ½¸ö×Ö½ÚΪ¡°ÐòºÅ¡±ËùÒÔÒª½øÐÐÆ«ÒÆ*/ Out_Flash_MultipleRead(old_e2p_time_bcd, old_log_start_addr + offset_addr/*SIZEOF_OF(VALVE_SYSLOG_FORMAT_T,record_num)*/, 6); Out_Flash_MultipleRead(new_e2p_time_bcd, new_log_start_addr + offset_addr/*SIZEOF_OF(VALVE_SYSLOG_FORMAT_T,record_num)*/, 6); int start_2_e2p_old_time_diff,end_2_e2p_old_time_diff, e2p_new_2_start_time_diff,e2p_new_2_end_time_diff; start_2_e2p_old_time_diff = Datecmp(start_time_bcd,old_e2p_time_bcd);// ¿ªÊ¼Ê±¼ä ºÍ ´æ´¢µÄ×îÀÏʱ¼äµÄ ʱ¼ä²î end_2_e2p_old_time_diff = Datecmp(end_time_bcd,old_e2p_time_bcd);//½áÊøÊ±¼ä ºÍ ´æ´¢×îÀϵÄʱ¼äµÄ ʱ¼ä²î e2p_new_2_start_time_diff = Datecmp(new_e2p_time_bcd,start_time_bcd);// ´æ´¢×îÐÂʱ¼ä ºÍ ¿ªÊ¼Ê±¼äµÄ ʱ¼ä²î e2p_new_2_end_time_diff = Datecmp(new_e2p_time_bcd,end_time_bcd);//´¢´æ×îÐÂʱ¼ä ºÍ ½áÊøÊ±¼äµÄ ʱ¼ä²î if(end_2_e2p_old_time_diff <= 0 || e2p_new_2_start_time_diff <= 0)//²»ÔÚ´¢´æÊ±¼ä·¶Î§ { /*½oÒ»¸ö¶ÁÈ¡µÄ×î´óÌõÊý*/ if(log_table_p->table_id->log_index >= 20 || log_table_p->table_id->log_cyclic_full_cnt) *pSend_data_num = 20; else *pSend_data_num = log_table_p->table_id->log_index - 1; /*¼ÆËãÆðʼʱ¼äµÄµØÖ·*/ get_start_addr = Sys_Log_E2pCyclic_ReverseGetStartAddr(log_table_p, *pSend_data_num); }else { if(log_table_p->table_id->log_cyclic_full_cnt) search_num = log_table_p->data_num; else search_num = log_table_p->table_id->log_index - 1; if(start_2_e2p_old_time_diff <= 0) // Æðʼʱ¼ä <= E2p´¢´æµÄ×îÔçʱ¼ä { get_start_addr = old_log_start_addr; if(e2p_new_2_end_time_diff <= 0) //E2p´¢´æµÄ×îÐÂʱ¼ä <= ½áÊøÊ±¼ä { if(log_table_p->table_id->log_cyclic_full_cnt) //»·Ð´Âú *pSend_data_num = log_table_p->data_num; else *pSend_data_num = log_table_p->table_id->log_index - 1; } else //E2p´¢´æµÄ×îÐÂʱ¼ä > ½áÊøÊ±¼ä { addr_temp = get_start_addr; for(i = 0;i < search_num;i++) { Out_Flash_MultipleRead(e2p_time_1,addr_temp + offset_addr,6); data_cmp = Datecmp(e2p_time_1,end_time_bcd); if(data_cmp <= 0) //e2pµÄʱ¼ä <= ½áÊøÊ±¼ä real_num++; else { *pSend_data_num = real_num; break; } addr_temp += log_table_p->data_size; if(addr_temp >= log_table_p->table_id->log_end_addr) addr_temp = log_table_p->table_id->log_start_addr; } } }else { addr_temp = new_log_start_addr; for(i = 0;i < search_num;i++) { Out_Flash_MultipleRead(e2p_time_1,addr_temp + offset_addr,6); data_cmp = Datecmp(e2p_time_1,start_time_bcd); if(data_cmp >= 0) //e2pµÄʱ¼ä >= ¿ªÊ¼Ê±¼ä real_num++; else { *pSend_data_num = real_num; addr_temp += log_table_p->data_size; if(addr_temp >= log_table_p->table_id->log_end_addr) addr_temp = log_table_p->table_id->log_start_addr; get_start_addr = addr_temp; break; } addr_temp -= log_table_p->data_size; if(addr_temp <= log_table_p->table_id->log_start_addr) addr_temp = log_table_p->table_id->log_end_addr - log_table_p->data_size; } if(e2p_new_2_end_time_diff > 0) //E2p´¢´æµÄ×îÐÂʱ¼ä > ½áÊøÊ±¼ä { real_num = 0; for(i = 0;i < search_num;i++) { Out_Flash_MultipleRead(e2p_time_1,addr_temp + offset_addr,6); data_cmp = Datecmp(e2p_time_1,end_time_bcd); if(data_cmp <= 0) //e2pµÄʱ¼ä <= ½áÊøÊ±¼ä real_num++; else { *pSend_data_num = real_num; break; } addr_temp += log_table_p->data_size; if(addr_temp >= log_table_p->table_id->log_end_addr) addr_temp = log_table_p->table_id->log_start_addr; } } } } /*·½·¨2*/ // if(log_table_p->table_id->log_cyclic_full_cnt) //ÅжÏÊÇ·ñдÂúÒ»ÂÖ // search_num = log_table_p->data_num; // else // search_num = log_table_p->table_id->log_index; // old_log_start_addr = Sys_Log_E2pCyclic_ReverseGetStartAddr(log_table_p,log_table_p->data_num); // last_log_start_addr = Sys_Log_E2pCyclic_ReverseGetStartAddr(log_table_p,1); // /*ÓÉÓÚÊý¾Ý¸ñʽǰÁ½¸ö×Ö½ÚΪ¡°ÐòºÅ¡±ËùÒÔÒª½øÐÐÆ«ÒÆ*/ // EEPROM_MultipleRead(e2p_time_1, old_log_start_addr + offset_addr/*SIZEOF_OF(VALVE_SYSLOG_FORMAT_T,record_num)*/, 6); // EEPROM_MultipleRead(e2p_time_2, last_log_start_addr + offset_addr/*SIZEOF_OF(VALVE_SYSLOG_FORMAT_T,record_num)*/, 6); // data_cmp1 = Datecmp(start_time_bcd,e2p_time_1); // data_cmp2 = Datecmp(start_time_bcd,e2p_time_2); // if(data_cmp1 <= 0) //ѰÕÒµÄʱ¼ä±È¼Ç¼µÄµÚÒ»¸öʱ¼äÔç // get_start_addr = old_log_start_addr; // else if(data_cmp2 > 0) //ѰÕÒµÄʱ¼ä±È×îºó¼Ç¼µÄʱ¼äÍí // {} // else // { // uint32_t addr_a,addr_b; // for(uint8_t i = 0; i < (search_num - 1);i++) // { // if((old_log_start_addr + log_table_p->data_size) >= log_table_p->table_id->log_end_addr) // { // addr_a = log_table_p->table_id->log_end_addr - log_table_p->data_size; // addr_b = log_table_p->table_id->log_start_addr; // } // else // { // addr_a = old_log_start_addr + (i * log_table_p->data_size); // addr_b = addr_a + log_table_p->data_size; // } // // EEPROM_MultipleRead(e2p_time_1,addr_a + SIZEOF_OF(VALVE_SYSLOG_FORMAT_T,record_num),6); // EEPROM_MultipleRead(e2p_time_2,addr_b + SIZEOF_OF(VALVE_SYSLOG_FORMAT_T,record_num),6); // data_cmp1 = Datecmp(e2p_time_1,start_time_bcd); // data_cmp2 = Datecmp(e2p_time_2,start_time_bcd); // if((data_cmp1 <= 0) && (data_cmp2 >= 0)) //µÚÒ»¸öʱ¼ä±ÈѰÕÒµÄʱ¼äÔ磬µÚ¶þ¸öʱ¼ä±ÈѰÕÒµÄʱ¼äÍí // get_start_addr = addr_b; // } // } E2P_PWR_OFF; // ¹Ø±ÕE2pµçÔ´ return get_start_addr; } /******************************************************************** * name : Sys_Log_E2pCyclicRead_1_Data * description : ¶ÁÊý¾Ýµ¥´Î * Input : *log_table_p£ºÈÕÖ¾±íÖ¸Õë read_addr: ¶ÁÊý¾ÝµÄµØÖ· * Output : pOutput £º¾ßÌåµÄÊä³öÊý¾ÝÄÚÈÝ * Return : next_read_addr£ºÏÂÒ»×éÊý¾ÝµÄ¶ÁÈ¡µØÖ· ÊÇ·ñÕý³££ºÕý³££¬²âÊÔʱ¼ä230407 ********************************************************************/ uint32_t Sys_Log_E2pCyclicRead_1_Data(const SYSLOG_CYCLIC_TABLE_T *log_table_p, uint8_t *pOutput,uint32_t read_addr) { uint32_t next_read_addr = 0; E2P_PWR_ON; // ¿ªÆôE2pµçÔ´ Out_Flash_MultipleRead(pOutput,read_addr,log_table_p->data_size); next_read_addr = read_addr + log_table_p->data_size; if(next_read_addr >= log_table_p->table_id->log_end_addr) next_read_addr = log_table_p->table_id->log_start_addr; E2P_PWR_OFF; // ¹Ø±ÕE2pµçÔ´ return next_read_addr; } /******************************************************************** * name : Sys_Log_E2pCyclicMultipleReverseRead * description : ÒÔ×îд洢Êý¾ÝΪ¿ªÊ¼£¬µ¹Ðò¶ÁÊý¾Ý¶à´Î * Input : *log_table_p£ºÈÕÖ¾±íÖ¸Õë back_read_cnt: ÐèÒª¶ÁÈ¡µÄÌõÊý * Output : pOutput £º¾ßÌåµÄÊä³öÊý¾ÝÄÚÈÝ * Return : ÊÇ·ñÕý³££ºÕý³££¬²âÊÔʱ¼ä230407 ********************************************************************/ void Sys_Log_E2pCyclicMultipleReverseRead(const SYSLOG_CYCLIC_TABLE_T *log_table_p, uint8_t *pOutput, uint16_t back_read_cnt) { uint32_t read_start_addr = 0; for (uint16_t i = 0; i < back_read_cnt; i++) { read_start_addr = Sys_Log_E2pCyclic_ReverseGetStartAddr(log_table_p, i + 1); Sys_Log_E2pCyclicRead_1_Data(log_table_p,&pOutput[i * log_table_p->data_size],read_start_addr); } } /******************************************************************** * name : Sys_Log_E2pCyclicMultiplePositiveRead * description : ÒÔ×îд洢Êý¾ÝΪ»ùµã£¬ÍË»Øforward_read_cntÌõÊý¾Ý£¬ÕýÐò¶ÁÊý¾Ýdata_cnt´Î * Input : *log_table_p£ºÈÕÖ¾±íÖ¸Õë forward_read_cnt: ÐèÒªÏòǰÍ˻صÄÌõÊý data_cnt: ÐèÒª¶ÁÈ¡µÄÌõÊý * Output : pOutput £º¾ßÌåµÄÊä³öÊý¾ÝÄÚÈÝ * Return : ÊÇ·ñÕý³££ºÕý³££¬²âÊÔʱ¼ä230407 ********************************************************************/ void Sys_Log_E2pCyclicMultiplePositiveRead(const SYSLOG_CYCLIC_TABLE_T *log_table_p, uint8_t *pOutput, uint16_t forward_read_cnt,uint16_t data_cnt) { uint32_t read_start_addr = 0; read_start_addr = Sys_Log_E2pCyclic_ReverseGetStartAddr(log_table_p, forward_read_cnt); for (uint16_t i = 0; i < data_cnt; i++) read_start_addr = Sys_Log_E2pCyclicRead_1_Data(log_table_p,&pOutput[i * log_table_p->data_size],read_start_addr); } /******************************************************************** * name : Sys_Log_E2pCyclicMultiplePositiveRead_2 * description : ÕýÐò¶ÁÊý¾Ýcnt´Î * Input : *log_table_p£ºÈÕÖ¾±íÖ¸Õë addr £ºÊý¾ÝµØÖ· cnt £ºÕýÐò¶ÁµÄÌõÊý * Output : pOutput £º¾ßÌåµÄÊä³öÊý¾ÝÄÚÈÝ * Return : ÊÇ·ñÕý³££º ********************************************************************/ void Sys_Log_E2pCyclicMultiplePositiveRead_2(const SYSLOG_CYCLIC_TABLE_T *log_table_p, uint8_t *pOutput, uint32_t addr,uint16_t cnt) { for (uint16_t i = 0; i < cnt; i++) addr = Sys_Log_E2pCyclicRead_1_Data(log_table_p,&pOutput[i * log_table_p->data_size],addr); } /*°´Ê±¼äÇø¼äµ¹Ðð¶Á*/ /*°´Ê±¼äÇø¼äÕýÐò¶Á*/ /*»·Ð´ÈÕÖ¾µØÖ·³õʼ»¯£¨ÓÉÓÚFlashµÄ¶Áд´ÎÊýÏÞÖÆ£¬²ÎÊý´æ´¢ÔÚE2PÖУ© * | <¡ª¡ª¡ª¡ª¡ª¡ª¡ª¡ª¡ª¡ªÀúÊ·¼Ç¼A¡ª¡ª¡ª¡ª¡ª-¡ª¡ª¡ª¡ª> | <¡ª¡ª¡ª¡ª¡ª¡ª¡ª¡ª¡ª¡ªÀúÊ·¼Ç¼B¡ª¡ª¡ª¡ª¡ª¡ª¡ª¡ª¡ª¡ª> | * | | | | | * | <¡ª¡ª¡ªÊý¾ÝË÷Òý¡ª¡ª¡ª> | <¡ª¡ª¡ª»·Ð´ÂúCNT¡ª¡ª¡ª> | <¡ª¡ª¡ªÊý¾ÝË÷Òý¡ª¡ª¡ª> | <¡ª¡ª¡ª»·Ð´ÂúCNT¡ª¡ª¡ª> | * | | | | | * | <¡ª¡ª¡ª¡ª¡ª¡ª¡ª¡ª¡ª¡ª¡ª¡ª¡ª¡ª¡ª¡ª¡ª¡ª¡ª¡ªÀúÊ·¼Ç¼´æ´¢ÏßÐÔ¸ñʽ¡ª¡ª¡ª¡ª¡ª¡ª¡ª¡ª-¡ª¡ª¡ª¡ª¡ª¡ª¡ª¡ª¡ª¡ª¡ª¡ª¡ª> | * Flash»·Ð´ÈÕÖ¾Êý¾Ý¸ñʽ * | <¡ª¡ª¡ª¡ª¡ª¡ª¡ª¡ª¡ª¡ªÀúÊ·¼Ç¼A¡ª¡ª¡ª¡ª¡ª-¡ª¡ª¡ª¡ª¡ª> | <¡ª¡ª¡ª¡ª¡ª¡ª¡ª¡ª¡ª¡ªÀúÊ·¼Ç¼B¡ª¡ª¡ª¡ª¡ª¡ª¡ª¡ª¡ª¡ª¡ª> | * | | | | | | | * | <¡ªÊý¾ÝÄÚÈÝ1¡ª> | <¡ªÊý¾ÝÄÚÈÝ2¡ª> | <¡ªÊý¾ÝÄÚÈÝ3¡ª> | <¡ªÊý¾ÝÄÚÈÝ1¡ª> | <¡ªÊý¾ÝÄÚÈÝ2¡ª> | <¡ªÊý¾ÝÄÚÈÝ3¡ª> | * | | | | | | | * | <¡ª¡ª¡ª¡ª¡ª¡ª¡ª¡ª¡ª¡ªÊý¾ÝÑ­»·¡ª¡ª¡ª¡ª¡ª-¡ª¡ª¡ª¡ª¡ª¡ª> | <¡ª¡ª¡ª¡ª¡ª¡ª¡ª¡ª¡ª¡ªÊý¾ÝÑ­»·¡ª¡ª¡ª¡ª¡ª-¡ª¡ª¡ª¡ª¡ª¡ª> | * | <¡ª¡ª¡ª¡ª¡ª¡ª¡ª¡ª¡ª¡ª¡ª¡ª¡ª¡ª¡ª¡ª¡ª¡ª¡ª¡ª¡ªÀúÊ·¼Ç¼´æ´¢ÏßÐÔ¸ñʽ¡ª¡ª¡ª¡ª¡ª¡ª¡ª¡ª¡ª-¡ª¡ª¡ª¡ª¡ª¡ª¡ª¡ª¡ª¡ª¡ª¡ª¡ª> | */ void Sys_Log_E2pCyclicAddrInit(void) { uint32_t log_cyclic_para_addr = CYCLIC_PARA_STORAGE_START_ADDR; uint32_t log_flash_start_addr = CYCLIC_STORAGE_START_ADDR; /*Ë÷Òý »·Ð´Âú±ê־λ µØÖ·³õʼ»¯*/ sys_log_cyclic_table[0].table_id->log_index_addr = log_cyclic_para_addr; sys_log_cyclic_table[0].table_id->log_full_cnt_addr = sys_log_cyclic_table[0].table_id->log_index_addr + CYCLIC_INDEX_OFFSET; sys_log_cyclic_table[0].table_id->log_start_addr = log_flash_start_addr; sys_log_cyclic_table[0].table_id->log_end_addr = sys_log_cyclic_table[0].table_id->log_start_addr + sys_log_cyclic_table[0].data_size * sys_log_cyclic_table[0].data_num; for (uint8_t i = 1; i < SYS_LOG_CYCLIC_TABLE_NUM; i++) { sys_log_cyclic_table[i].table_id->log_index_addr = sys_log_cyclic_table[i - 1].table_id->log_full_cnt_addr + 1; sys_log_cyclic_table[i].table_id->log_full_cnt_addr = sys_log_cyclic_table[i].table_id->log_index_addr + CYCLIC_INDEX_OFFSET; //½áÊøµØÖ·¾ÍÊÇÏÂÒ»¸ö²ÎÊýµÄ¿ªÊ¼µØÖ· sys_log_cyclic_table[i].table_id->log_start_addr = sys_log_cyclic_table[i - 1].table_id->log_end_addr; sys_log_cyclic_table[i].table_id->log_end_addr = sys_log_cyclic_table[i].table_id->log_start_addr + sys_log_cyclic_table[i].data_size * sys_log_cyclic_table[i].data_num; } } void Sys_Log_E2pCyclic_FirstPower_FlagInit(void) { E2P_PWR_ON; for(uint8_t i = 0;i < SYS_LOG_CYCLIC_TABLE_NUM;i++) { sys_log_cyclic_table[i].table_id->log_index = 1; // »Ö¸´Ä¬ÈÏÖµ sys_log_cyclic_table[i].table_id->log_cyclic_full_cnt = 0; FM25V02_data_write_uint16(sys_log_cyclic_table[i].table_id->log_index_addr,sys_log_cyclic_table[i].table_id->log_index); FM25V02_data_write(sys_log_cyclic_table[i].table_id->log_cyclic_full_cnt,sys_log_cyclic_table[i].table_id->log_full_cnt_addr); } } void Sys_Log_E2pCyclic_NoFirstPower_FlagInit(void) { E2P_PWR_ON; for(uint8_t i = 0;i < SYS_LOG_CYCLIC_TABLE_NUM;i++) { sys_log_cyclic_table[i].table_id->log_index = FM25V02_data_read_uint16(sys_log_cyclic_table[i].table_id->log_index_addr); sys_log_cyclic_table[i].table_id->log_cyclic_full_cnt = FM25V02_data_read(sys_log_cyclic_table[i].table_id->log_full_cnt_addr); if(sys_log_cyclic_table[i].table_id->log_index >= (sys_log_cyclic_table[i].data_num + 1)) { sys_log_cyclic_table[i].table_id->log_index = 1; FM25V02_data_write_uint16(sys_log_cyclic_table[i].table_id->log_index_addr,sys_log_cyclic_table[i].table_id->log_index); } } }