#include "alarm.h" #include "prj_com.h" #include "rtc_run.h" #include "eeprom.h" #include "bill.h" uint32_t alarm_bits; static uint8_t alarm_flag = 0; static uint8_t alarm_array[ERR_END * 2]; // 当å‰�的实时报警状æ€?å�‘生å�Žå€?, 写入报è?¦å�Žæ¸…é?? static uint32_t alarm_args[ERR_END * 2]; // 报è?¦æ—¶äº§ç”Ÿçš„å�‚æ•? static uint8_t alarm_write_ptr = 0; ALARM_INFO_DEF alarm_info; // 123 // 123456789 // ¶¥¶¥¶¥¶¥ // 666 /// ·¿¶«·½ ///////sfsdfgsdfsdfgsdfgsdfsdfgsdfg void alarm_init(void) { alarm_bits = 0; alarm_flag = 0; memset(alarm_array, 0, sizeof(alarm_array)); memset(alarm_args, 0, sizeof(alarm_args)); get_alarm_info(&alarm_info); } void get_alarm_info(ALARM_INFO_DEF *info) { uint32_t addr = ALARM_INFO_ADDR; uint8_t need_reset = 0; // 1. ³¢ÊÔ¶ÁÈ¡£¬²¢¼ì²é·µ»ØÖµ£¨¼ÙÉè read_eeprom_para ·µ»Ø 0 ±íʾ³É¹¦£© if (read_eeprom_para(addr, (uint8_t *)info, sizeof(ALARM_INFO_DEF)) != 0) { need_reset = 1; // ¶Áȡʧ°Ü£¬Ç¿ÖÆÖØÖà } else { // 2. »ù±¾ºÏ·¨ÐÔУÑé // ×¢Ò⣺num ¿ÉÒÔµÈÓÚ MAX_ALARM_NUM (Âú)£¬ËùÒÔÓà > ¶ø²»ÊÇ >= if (info->start >= MAX_ALARM_NUM || info->end >= MAX_ALARM_NUM || info->num > MAX_ALARM_NUM || info->flag != 0xaa) { need_reset = 1; } else { // 3. ¡¾ÖØÒª¡¿Ò»ÖÂÐÔУÑé // ¸ù¾Ý start ºÍ end ÖØÐ¼ÆËãÀíÂÛÉ쵀 num uint8_t calculated_num; if (info->end >= info->start) { calculated_num = info->end - info->start; } else { calculated_num = MAX_ALARM_NUM - info->start + info->end; } // Èç¹û´æ´¢µÄ num Óë¼ÆËã³öµÄ num ²»Ò»Ö£¬ËµÃ÷Êý¾ÝË𻵠// ×¢Ò⣺ÕâÀïÓÐÒ»¸öÌØÀý£¬Èç¹û»º³åÇøÂú£¬num Ó¦¸ÃµÈÓÚ MAX_ALARM_NUM // µ«ÔÚ»·ÐζÓÁÐÖУ¬½öƾ start/end ÎÞ·¨Çø·Ö¡°¿Õ¡±ºÍ¡°Âú¡±£¨Èç¹û¶¼²»´æ num£© // ¼ÈÈ»ÎÒÃÇ´æÁË num£¬¾ÍÒÔ num Ϊ׼£¬µ«ÒªÈ·±£ num ²»³¬¹ý MAX // ¸üÑϸñµÄУÑéÊÇ£ºÈç¹û num < MAX£¬Ôò calculated_num ±ØÐëµÈÓÚ num if (info->num < MAX_ALARM_NUM && calculated_num != info->num) { need_reset = 1; } // Èç¹û num == MAX_ALARM_NUM£¬ÎÒÃÇÐÅÈÎËüÊÇÂúµÄ£¬²»×ö¶îÍâУÑé } } if (need_reset) { info->start = 0; info->end = 0; info->flag = 0xaa; info->num = 0; write_eeprom_para(addr, (uint8_t *)info, sizeof(ALARM_INFO_DEF)); } } uint8_t get_alarm_num(void) { return alarm_info.num; } void all_alarm_status(uint32_t **bits) { *bits = &alarm_bits; } uint8_t alarm_status(uint8_t err_no) { return BIT_VAL(alarm_bits, err_no); } void write_alarm(uint8_t err_no, uint8_t type, uint32_t arg) { alarm_t alarm; rtc_run_t *rr; // 1. »ñÈ¡µ±Ç°Ê±¼ä get_rtc_run(&rr); // 2. ¹¹½¨±¨¾¯¼Ç¼ alarm.flag = 1; alarm.err_no = err_no; alarm.type = type; alarm.arg[0] = (uint8_t)arg; alarm.arg[1] = (uint8_t)(arg >> 8); alarm.arg[2] = (uint8_t)(arg >> 16); alarm.arg[3] = (uint8_t)(arg >> 24); alarm.time[0] = 0x14; alarm.time[1] = rr->year; alarm.time[2] = rr->month; alarm.time[3] = rr->day; alarm.time[4] = rr->hour; alarm.time[5] = rr->minute; alarm.time[6] = rr->second; // 3. дÈë EEPROM uint32_t addr = ALARM_START_ADDR + alarm_info.end * ALARM_DATA_SIZE; write_eeprom(addr, (uint8_t *)&alarm, sizeof(alarm_t)); // 4. ¸üÐÂÖ¸Õë uint8_t next_end = alarm_info.end + 1; if (next_end >= MAX_ALARM_NUM) { next_end = 0; } // ÅжÏÊÇ·ñ¸²¸Ç£¨»º³åÇøÂú£© // Èç¹ûÏÂÒ»¸öдÈëλÖÃ×·ÉÏÁË start£¬ËµÃ÷»º³åÇøÂúÁË if (next_end == alarm_info.start) { // ÒÆ¶¯ start Ö¸Õ룬¶ªÆú×î¾ÉµÄÒ»ÌõÊý¾Ý alarm_info.start++; if (alarm_info.start >= MAX_ALARM_NUM) { alarm_info.start = 0; } // ¹Ø¼üµã£ºÂú״̬Ï£¬ÊýÁ¿ºã¶¨Îª×î´óÖµ alarm_info.num = MAX_ALARM_NUM; } else { // »º³åÇøÎ´Âú£¬ÊýÁ¿¼Ó 1 alarm_info.num++; } alarm_info.end = next_end; // 5. ±£´æÔªÊý¾Ý write_eeprom_para(ALARM_INFO_ADDR, (uint8_t *)&alarm_info, sizeof(ALARM_INFO_DEF)); } uint8_t read_alarm(uint8_t num, alarm_t *alarm) { memset((uint8_t *)alarm, 0, sizeof(alarm_t)); uint8_t ser = get_alarm_num(); // »ñÈ¡µ±Ç°ÓÐЧÊýÁ¿ // Èç¹ûÇëÇóµÄË÷Òý³¬³ö·¶Î§£¬·µ»ØÊ§°Ü if (num >= ser) return 0; // ¼ÆËãÎïÀíË÷Òý£º´Ó end-1 ¿ªÊ¼ÏòǰÊý num ¸ö // ¼ÓÉÏ MAX_ALARM_NUM ÔÙȡģÊÇΪÁË´¦Àí¸ºÊýÏÂÒç ser = (alarm_info.end - 1 - num + MAX_ALARM_NUM) % MAX_ALARM_NUM; uint32_t addr = ALARM_START_ADDR + ALARM_DATA_SIZE * ser; uint8_t ret = read_eeprom(addr, (uint8_t *)alarm, sizeof(alarm_t)); return (ret == 0); } void set_alarm_info(uint8_t err_no, uint8_t type, uint32_t arg) { uint8_t idx; idx = ALARM_INDEX(err_no, type); alarm_array[idx] = 1; alarm_args[idx] = arg; alarm_flag = 1; } // type 1-alarm 0-alarm recovery void Alarm(uint8_t err_no, uint8_t type, uint32_t arg) { if (type) { if (!BIT_VAL(alarm_bits, err_no)) { SET_BIT_WARN(alarm_bits, err_no); set_alarm_info(err_no, type, arg); } } else { if (BIT_VAL(alarm_bits, err_no)) { RESET_BIT_WARN(alarm_bits, err_no); set_alarm_info(err_no, type, arg); } } } void AlarmHandle(void) { uint16_t i; uint8_t err_no; uint8_t type; if(StartUp < 10)return;//wxl2026-5-18 if (alarm_flag == 0) { return; } for (i = 0; i < ERR_END * 2; i++) { if (alarm_array[i] == 1) { err_no = i >> 1; type = i % 2; write_alarm(err_no, type, alarm_args[i]); alarm_array[i] = 0; } } alarm_flag = 0; }