#include "para_storage_cfg_api.h" #include "e2p.h" #include "system_parameter.h" #include "billing.h" #include "sundry.h" #include "gpio.h" #include "gprs.h" #include "system_log.h" #include "master_slave_inter.h" // ²ÎÊý´¢´æµÄ¿éÊýÁ¿ #define PARA_STORAGE_BLOCK_CNT (2) // ²ÎÊý´¢´æµÄ´óС #define PARA_STORAGE_SIZE (PARA_STORAGE_BLOCK_CNT * EEPROM_CFG_BLOCK_SIZE) // 8KB // ²ÎÊý´¢´æÆðʼµØÖ·£¨Ä¬ÈÏÖµ£©£¨·Ç»·Ð´£© #define PARA_STORAGE_START_ADDR CYCLIC_PARA_STORAGE_END_ADDR SYSLOG_PARA_DATA_T sys_log_para_data_g; #define FIRST_POWER_DEFAULT_VALUE 0x8765 TYPE_CHECK_SIZE(FIRST_POWER_PARA_T,4);//ºË²é½á¹¹Ìå´óС FIRST_POWER_PARA_T __attribute__ ((aligned (2))) sys_log_para_first_power_flag_g = { .first_power_flag = 0}; /*²ÎÊý¼Ç¼ÈÕÖ¾±í£¨·Ç»·Ð´£© *×¢Ò⣺ÿһÀà²ÎÊý¶¼ÐèÒªÔ¤Áô¿Õ¼ä£¬·ÀÖ¹ÒÔºóÔö¼ÓвÎÊý *ĬÈϵÄÈ«¾Ö±äÁ¿²ÎÊý±ØÐë½o³õʼ»¯Ä¬ÈÏÖµ£¬ÕâÑù·½±ãºóÐø³õʼ»¯¸³Öµ */ const SYSLOG_PARA_TABLE_T sys_store_para_table[20] = { {&sys_log_para_data_g.first_power_flag_store, &sys_log_para_first_power_flag_g, FIRST_POWER_PARA_FORMAT_SIZE + LOG_CHECKSUM_OFFSET, 3}, {&sys_log_para_data_g.save_realtime_data_log, &save_realtime_data_g,REALTIME_DATA_LOG_FORMAT_SIZE + LOG_CHECKSUM_OFFSET, 12}, {&sys_log_para_data_g.master_soft_hard_para_store, &master_soft_hard_para_g, MASTER_SOFT_HARD_FORMAT_SIZE + LOG_CHECKSUM_OFFSET, 1}, {&sys_log_para_data_g.sys_flow_alarm_cfg_store, &sys_flow_alarm_cfg_g, SYS_FLOW_ALARM_CFG_FORMAT_SIZE + LOG_CHECKSUM_OFFSET, 1}, {&sys_log_para_data_g.sys_press_alarm_cfg_store, &sys_press_alarm_cfg_g, SYS_PRESS_ALARM_CFG_FORMAT_SIZE + LOG_CHECKSUM_OFFSET, 1}, {&sys_log_para_data_g.sys_temp_alarm_cfg_store, &sys_temp_alarm_cfg_g, SYS_TEMP_ALARM_CFG_FORMAT_SIZE + LOG_CHECKSUM_OFFSET, 1}, {&sys_log_para_data_g.sys_billing_alarm_cfg_store, &billing_alarm_cfg_g, SYS_BILLING_ALARM_CFG_FORMAT_SIZE + LOG_CHECKSUM_OFFSET, 1}, {&sys_log_para_data_g.cal_pulse_para_cfg_store, &cal_pulse_para_g, SYS_CAL_PULSE_PARA_FORMAT_SIZE + LOG_CHECKSUM_OFFSET, 1}, {&sys_log_para_data_g.ladder_price_cfg_true_store, &ladder_price_cfg_para_true_g, SYS_LADDER_PRICE_CFG_FORMAT_SIZE + LOG_CHECKSUM_OFFSET, 1}, {&sys_log_para_data_g.ladder_price_cfg_new_store, &ladder_price_cfg_para_new_g, SYS_LADDER_PRICE_CFG_FORMAT_SIZE + LOG_CHECKSUM_OFFSET, 1}, {&sys_log_para_data_g.gprs_network_cfg_store, &gprs_network_cfg_para_g, SYS_GPRS_NETWORK_CFG_FORMAT_SIZE + LOG_CHECKSUM_OFFSET, 1}, {&sys_log_para_data_g.save_data_start_time_store, &save_day_month_timing_g, SAVE_DATA_START_PARA_FORMAT_SIZE + LOG_CHECKSUM_OFFSET, 1}, {&sys_log_para_data_g.sys_func_cfg_bytes_store, &sys_func_cfg_bytes_g, SYS_FUNC_CTL_BYTES_TYPE_LENGTH + LOG_CHECKSUM_OFFSET, 1}, {&sys_log_para_data_g.sys_alarm_ctl_bytes_store, &sys_alarm_ctl_bytes_g, SYS_ALARM_CTL_BYTES_TYPE_LENGTH + LOG_CHECKSUM_OFFSET, 1}, {&sys_log_para_data_g.sys_alarm_send_bytes_store, &sys_alarm_send_bytes_g, SYS_ALARM_SEND_BYTES_TYPE_LENGTH + LOG_CHECKSUM_OFFSET, 1}, {&sys_log_para_data_g.valve_ctl_bytes_store, &valve_ctl_bytes_g, VALVE_CTL_LEN + LOG_CHECKSUM_OFFSET, 1}, {&sys_log_para_data_g.master_basic_para_store, &master_basic_papa_g, MASTER_BASIC_FORMAT_SIZE + LOG_CHECKSUM_OFFSET, 1}, {&sys_log_para_data_g.micro_constant_flow_para_store,µ_constant_flow_para_g,MICRO_CONSTANT_FLOW_FORMAT_SIZE + LOG_CHECKSUM_OFFSET,1}, {&sys_log_para_data_g.sec_order_corr_set_para_store,&sec_order_corr_set_g,SEC_ORDER_CORR_PARA_FORMAT_SIZE + LOG_CHECKSUM_OFFSET,1}, {&sys_log_para_data_g.zero_drift_corr_cfg_store,&zero_drift_cfg_g,ZERO_DRIFT_CFG_SIZE + LOG_CHECKSUM_OFFSET,1}, }; /*Åжϴ˿̻·Ð´ÊÇ·ñµ½´ïµØÖ·Î²£¨×î´ónum£© µ½´ï·µ»Ø1 δµ½´ï·µ»Ø0*/ uint8_t Sys_Log_E2pParaFull(const SYSLOG_PARA_TABLE_T *para_data_p) { if ((para_data_p->table_id->store_index - 1) >= para_data_p->data_num) // Åжϴ˿ÌÊÇ·ñµ½´ïµØÖ·Î²£¨×î´ónum£© { para_data_p->table_id->store_index = 1; // ·¶Î§ 1 ~ (data_num + 1) FM25V02_data_write(para_data_p->table_id->store_index,para_data_p->table_id->store_index_addr); return 1; } return 0; } /*ÈÕÖ¾²ÎÊýдµ¥´Î ÊÇ·ñÕý³££ºÕý³££¬²âÊÔʱ¼ä230407 */ ErrorStatus_STM32 Sys_Log_E2pParaWrite_1_Data(const SYSLOG_PARA_TABLE_T *para_data_p) { uint16_t data_len = para_data_p->data_size - LOG_CHECKSUM_OFFSET; uint8_t calc_sum = CalcCheckSum(para_data_p->data_buffer, data_len); uint8_t read_sum = 0; uint32_t check_addr_now = 0,data_addr_now = 0; ErrorStatus_STM32 result = ERROR_1; /*¼ÆËãµØÖ·*/ if(para_data_p->data_num == 1) { check_addr_now = para_data_p->table_id->store_checksum_addr; data_addr_now = para_data_p->table_id->store_start_addr; } else { check_addr_now = para_data_p->table_id->store_checksum_addr + (para_data_p->data_size * (para_data_p->table_id->store_index - 1)); data_addr_now = check_addr_now + LOG_CHECKSUM_OFFSET; } read_sum = FM25V02_data_read(check_addr_now); // if (read_sum != calc_sum) // ÉÏÒ»´Î²ÎÊýµÄУÑéºÍ²»µÈÓÚ±¾´ÎµÄУÑéºÍʱ²ÅдÈë // { if(para_data_p->data_num != 1) //¸Ä±äË÷Òý { para_data_p->table_id->store_index++; if(Sys_Log_E2pParaFull(para_data_p) == 0) FM25V02_data_write(para_data_p->table_id->store_index,para_data_p->table_id->store_index_addr); } /*¶à´ÎÑéÖ¤±£Ö¤Êý¾ÝµÄÕýÈ·ÐÔºÍÍêÕûÐÔ*/ for(uint8_t i = 0;i < 3;i++) { /*´¢´æÐ£ÑéºÍ*/ FM25V02_data_write(calc_sum,check_addr_now); /*´¢´æÊý¾Ý*/ EEPROM_MultipleWrite(para_data_p->data_buffer, data_addr_now, data_len); uint8_t temp_calc_sum,temp_read_sum,temp_buffer[data_len]; /*¶ÁȡУÑéºÍ*/ temp_read_sum = FM25V02_data_read(check_addr_now); /*¶ÁÈ¡Êý¾Ý*/ EEPROM_MultipleRead(temp_buffer, data_addr_now, data_len); temp_calc_sum = CalcCheckSum(temp_buffer,data_len); if((temp_calc_sum == calc_sum) && (temp_read_sum == calc_sum)) //дÈëÕýÈ· { result = SUCCESS_0; break; } } // } return result; } /*ÈÕÖ¾²ÎÊýÊý¾Ýд¶à´Î write_cnt£ºÐ´´ÎÊý ÊÇ·ñÕý³££ºÕý³££¬²âÊÔʱ¼ä230407 */ ErrorStatus_STM32 Sys_Log_E2pParaMultipleWrite(const SYSLOG_PARA_TABLE_T *para_data_p,uint8_t write_cnt) { ErrorStatus_STM32 res = ERROR_1; E2P_PWR_ON; // ¿ªÆôE2pµçÔ´ for(uint8_t i = 0; i < write_cnt;i++) res = Sys_Log_E2pParaWrite_1_Data(para_data_p); E2P_PWR_OFF; // ¹Ø±ÕE2pµçÔ´ return res; } /*ÈÕÖ¾²ÎÊýÊý¾Ý¶Áµ¥´Î£¨Ö»ÐèÔÚÉϵçʱ¶Á£© ÊÇ·ñÕý³££ºÕý³££¬²âÊÔʱ¼ä230407 */ ErrorStatus_STM32 Sys_Log_E2pParaRead_1_Data(const SYSLOG_PARA_TABLE_T *para_data_p) { uint8_t temp_index = 0; uint8_t read_sum, calc_sum,err_cnt = 0; uint16_t data_len = para_data_p->data_size - LOG_CHECKSUM_OFFSET; uint32_t check_addr_now, data_addr_now; /*¼ÆËãµØÖ·*/ if(para_data_p->data_num == 1) { check_addr_now = para_data_p->table_id->store_checksum_addr; data_addr_now = para_data_p->table_id->store_start_addr; } else { if(para_data_p->table_id->store_index == 1) //Âú temp_index = para_data_p->data_num; else temp_index = para_data_p->table_id->store_index - 1; check_addr_now = para_data_p->table_id->store_checksum_addr + (para_data_p->data_size * (temp_index - 1)); data_addr_now = check_addr_now + LOG_CHECKSUM_OFFSET; } /*¶à´ÎÑéÖ¤±£Ö¤Êý¾ÝµÄÕýÈ·ÐÔºÍÍêÕûÐÔ*/ for(uint8_t i = 0;i < 3;i++) { /*¼ÆËãºÍ*/ EEPROM_MultipleRead(para_data_p->data_buffer, data_addr_now, data_len); calc_sum = CalcCheckSum(para_data_p->data_buffer, data_len); /*´¢´æºÍ*/ read_sum = FM25V02_data_read(check_addr_now); //Ö»ÓÐÔÚ¸ÕÉϵçʱ²Å»áµ÷Óô˺¯Êý£¬ËùÒÔ´¢´æÖеÄУÑéºÍÓëÌáÈ¡Êý¾ÝºóµÄ¼ÆËãºÍ²»Ò»ÖÂʱ //1.¿ÉÄÜ´ú±íE2PË𻵠2.Öжϴò¶Ï¶ÁÈ¡º¯Êý 3.Ϊ×îвÎÊý£¬ÉÏÒ»¸ö°æ±¾Ã»ÓÐ if (read_sum == calc_sum) return SUCCESS_0; else err_cnt++; } if (err_cnt >= 3) { // ÖÃλE2p¶ÁÒ쳣״̬/±¨¾¯×Ö // ÖØÐ¸³ÓèĬÈÏÖµ } return ERROR_1; } /*E2p²ÎÊýÊý¾ÝÊ״γõʼ»¯£¬ÏµÍ³È«ÐÂÉϵ磬ȫ²¿¹¦ÄܲÎÊýÉèΪĬÈÏÖµ SET:Ê×´ÎÉϵç RESET:·ÇÊ×´ÎÉϵç ÊÇ·ñÕý³££ºÕý³££¬²âÊÔʱ¼ä230407 */ FlagStatus Sys_Log_E2pParaDataFirstInit(void) { uint8_t cnt = 0; FlagStatus first_flag = RESET; uint16_t temp_data = FIRST_POWER_DEFAULT_VALUE; const SYSLOG_PARA_TABLE_T *ptr = &sys_store_para_table[PARA_FIRST_POWER_FLAG]; E2P_PWR_ON; for (uint8_t i = 0; i < ptr->data_num; i++) { uint16_t data_len = ptr->data_size - LOG_CHECKSUM_OFFSET; EEPROM_MultipleRead(ptr->data_buffer, ptr->table_id->store_start_addr + ptr->data_size * i, data_len); // uint8_t read_sum = FM25V02_data_read(ptr->table_id->store_checksum_addr + ptr->data_size * i), // calc_sum = CalcCheckSum(ptr->data_buffer, FIRST_POWER_PARA_FORMAT_SIZE); // if (*((uint16_t *)ptr->data_buffer) != temp_data) // ϵͳȫÐÂÉϵç // cnt++; if (sys_log_para_first_power_flag_g.first_power_flag != temp_data) // ϵͳȫÐÂÉϵç cnt++; } if (cnt >= 2) { /*Ê×´ÎÉϵçʱ£¬ÉèÖÃĬÈÏʱ¼ä£¬Á÷Á¿ºÍ¼Û¸ñµÈÐÅÏ¢*/ save_realtime_data_g.record_time_bcd[0] = HEX_2_BCD_U8((OS_YEAR - 2000)); save_realtime_data_g.record_time_bcd[1] = HEX_2_BCD_U8(OS_MONTH); save_realtime_data_g.record_time_bcd[2] = HEX_2_BCD_U8(OS_DAY); save_realtime_data_g.record_time_bcd[3] = HEX_2_BCD_U8(OS_HOUR); save_realtime_data_g.record_time_bcd[4] = HEX_2_BCD_U8(OS_MINUTE); save_realtime_data_g.record_time_bcd[5] = HEX_2_BCD_U8(OS_SENCOND); memcpy(&save_realtime_data_g.realtime_billing_data_s,&billing_real_para_g,sizeof(save_realtime_data_g.realtime_billing_data_s)); /*Ë÷Òý±ê־λ³õʼ»¯*//*ÓÉÓÚ²ÎÊýд£¬ÐèÒªÓõ½Ë÷Òý£¬ËùÒÔË÷ÒýµÄ³õʼ»¯±ØÐëÔÚдÈë֮ǰ*/ Sys_Log_E2pPara_FirstPower_FlagInit(); /*Ë÷ÒýºÍÂúд±ê־λ³õʼ»¯*/ Sys_Log_E2pCyclic_FirstPower_FlagInit(); /*²¿·Ö²ÎÊýÉèΪĬÈÏÖµ*/ Sys_Log_E2pParaMultipleWrite(&sys_store_para_table[PARA_SAVE_REALTIME_DATA],1); Sys_Log_E2pCyclicMultipleWrite(&sys_log_cyclic_table[CYCL_VALVE],(uint8_t *)&valve_log_g,1); Sys_Log_E2pCyclicMultipleWrite(&sys_log_cyclic_table[CYCL_PAY], (uint8_t *)&pay_para_g,1); /*дÈëÊ×´ÎÉϵçĬÈÏÖµ*/ for (uint8_t j = 1; j < SYS_LOG_PARA_TABLE_NUM; j++) { ptr = &sys_store_para_table[j]; Sys_Log_E2pParaMultipleWrite(ptr,1); // ËùÓвÎÊý¸øÄ¬ÈÏÖµ } /*¸Ã±ê־λҪ·ÅÔÚ×îºóдÈë*/ ptr = &sys_store_para_table[PARA_FIRST_POWER_FLAG]; *(uint16_t *)ptr->data_buffer = FIRST_POWER_DEFAULT_VALUE; Sys_Log_E2pParaMultipleWrite(ptr,ptr->data_num); first_flag = SET; } return first_flag; } /*E2p²ÎÊýÊý¾ÝÈÕÖ¾µØÖ·³õʼ»¯ * | <¡ª¡ª¡ª¡ª¡ª¡ª¡ª¡ª¡ª¡ª²ÎÊýA¡ª¡ª¡ª¡ª¡ª¡ª¡ª¡ª¡ª¡ª>| <¡ª¡ª¡ª¡ª¡ª¡ª¡ª¡ª¡ª¡ª²ÎÊýB¡ª¡ª¡ª¡ª¡ª¡ª¡ª¡ª¡ª> | * | | | | | | | * | <¡ªÊý¾ÝË÷Òý¡ª> | <¡ªÐ£ÑéºÍ¡ª> | <¡ªÊý¾ÝÄÚÈÝ¡ª> | <¡ªÊý¾ÝË÷Òý¡ª> | <¡ªÐ£ÑéºÍ¡ª> | <¡ªÊý¾ÝÄÚÈÝ¡ª> | * | | | | | | | * | |<¡ª¡ª¡ª¡ª¡ªÊý¾ÝÑ­»·¡ª¡ª¡ª¡ª¡ª> | |<¡ª¡ª¡ª¡ª¡ªÊý¾ÝÑ­»·¡ª¡ª¡ª¡ª¡ª> | * | <¡ª¡ª¡ª¡ª¡ª¡ª¡ª¡ª¡ª¡ª¡ª¡ª¡ª¡ª¡ª¡ª¡ª¡ª¡ª²ÎÊý´æ´¢ÏßÐÔ¸ñʽ¡ª¡ª¡ª¡ª¡ª¡ª¡ª¡ª¡ª¡ª¡ª¡ª¡ª¡ª¡ª¡ª¡ª¡ª¡ª> | */ void Sys_Log_E2pParaAddrInit(void) { // /*µØÖ·³õʼ»¯*/ sys_store_para_table[0].table_id->store_index_addr = PARA_STORAGE_START_ADDR; sys_store_para_table[0].table_id->store_checksum_addr = sys_store_para_table[0].table_id->store_index_addr + PARA_INDEX_OFFSET; sys_store_para_table[0].table_id->store_start_addr = sys_store_para_table[0].table_id->store_checksum_addr + LOG_CHECKSUM_OFFSET; sys_store_para_table[0].table_id->store_end_addr = sys_store_para_table[0].table_id->store_checksum_addr + sys_store_para_table[0].data_size * sys_store_para_table[0].data_num; for (uint8_t i = 1; i < SYS_LOG_PARA_TABLE_NUM; i++) { sys_store_para_table[i].table_id->store_index_addr = sys_store_para_table[i - 1].table_id->store_end_addr; sys_store_para_table[i].table_id->store_checksum_addr = sys_store_para_table[i].table_id->store_index_addr + PARA_INDEX_OFFSET; sys_store_para_table[i].table_id->store_start_addr = sys_store_para_table[i].table_id->store_checksum_addr + LOG_CHECKSUM_OFFSET; //½áÊøµØÖ·¾ÍÊÇÏÂÒ»¸ö²ÎÊýµÄ¿ªÊ¼µØÖ· sys_store_para_table[i].table_id->store_end_addr = sys_store_para_table[i].table_id->store_checksum_addr + sys_store_para_table[i].data_size * sys_store_para_table[i].data_num; } } void Sys_Log_E2pPara_FirstPower_FlagInit(void) { E2P_PWR_ON; for (uint8_t i = 0; i < SYS_LOG_PARA_TABLE_NUM; i++) { sys_store_para_table[i].table_id->store_index = 1; // »Ö¸´Ä¬ÈÏÖµ FM25V02_data_write(sys_store_para_table[i].table_id->store_index,sys_store_para_table[i].table_id->store_index_addr); } } void Sys_Log_E2pPara_NoFirstPower_FlagInit(void) { E2P_PWR_ON; for (uint8_t i = 0; i < SYS_LOG_PARA_TABLE_NUM; i++) sys_store_para_table[i].table_id->store_index = FM25V02_data_read(sys_store_para_table[i].table_id->store_index_addr); }