#include "type.h" #include "UWater_uart_driver.h" #include "UWater_DebugPrint.h" #include "UWater_frame_app.h" #include "UWater_eeprom_driver.h" #include "UWater_rtcc_app.h" #include "SOE.h" void SaveNewSoe(u16 soe_type,u8 soe_data); SOE soe_event; //SOE_TIME SOE_START_TIME = {0x00,0x01,0x01,0x00,0x00,0x00}; //2000-01-01 00:00:00 //SOE_TIME SOE_END_TIME = {0x38,0x01,0x19,0x03,0x14,0x07}; //2038-01-19 03:14:07 //SOE_TIME SOE_END_TIME = {0x99,0x12,0x31,0x23,0x59,0x59}; //2038-01-19 03:14:07 u8 save_soe_state; DateTime rtcc_time_soe; u8 soe_tmp_buf[20]; u8 soe_ee_msg; /************************************************************************************* * @fun_name: SaveNewSoe -- 记录一条新的SOE * @param[in] : soe_type--类型 soe_data--数据(默认为0) *************************************************************************************/ void SaveNewSoe(u16 soe_type,u8 soe_data) { if(soe_event.soe_cnt > SOE_NUM) { soe_event.soe_cnt = 0; } soe_event.soe_cnt++; soe_event.soe_cnt %= SOE_NUM; RtccGetDateTime(&rtcc_time_soe); soe_event.soe_type[soe_event.soe_cnt] = soe_type; soe_event.soe_time[soe_event.soe_cnt].s.year = rtcc_time_soe.s.year; soe_event.soe_time[soe_event.soe_cnt].s.month = rtcc_time_soe.s.month; soe_event.soe_time[soe_event.soe_cnt].s.day = rtcc_time_soe.s.day; soe_event.soe_time[soe_event.soe_cnt].s.hour = rtcc_time_soe.s.hour; soe_event.soe_time[soe_event.soe_cnt].s.minute = rtcc_time_soe.s.minute; soe_event.soe_time[soe_event.soe_cnt].s.second = rtcc_time_soe.s.second; soe_event.soe_data[soe_event.soe_cnt] = soe_data; } // u8 SaveSoeToEEIfIdle(void) { if(SAVE_SOE_S0 == save_soe_state) { return TASK_IDLE; } else { return TASK_BUSY; } } //存SOE内容到EE void SaveSoeToEE(void) { switch(save_soe_state) { case SAVE_SOE_S0: { if(soe_event.soe_cnt != soe_event.soe_record_cnt) { soe_event.soe_record_cnt++; soe_event.soe_record_cnt %= SOE_NUM; save_soe_state = SAVE_SOE_S1; } } break; case SAVE_SOE_S1: { if(TASK_IDLE == EepIfIdle()) { soe_tmp_buf[0] = soe_event.soe_type[soe_event.soe_record_cnt]; soe_tmp_buf[1] = soe_event.soe_type[soe_event.soe_record_cnt]>>8; soe_tmp_buf[2] = soe_event.soe_time[soe_event.soe_record_cnt].s.year; soe_tmp_buf[3] = soe_event.soe_time[soe_event.soe_record_cnt].s.month; soe_tmp_buf[4] = soe_event.soe_time[soe_event.soe_record_cnt].s.day; soe_tmp_buf[5] = soe_event.soe_time[soe_event.soe_record_cnt].s.hour; soe_tmp_buf[6] = soe_event.soe_time[soe_event.soe_record_cnt].s.minute; soe_tmp_buf[7] = soe_event.soe_time[soe_event.soe_record_cnt].s.second; soe_tmp_buf[8] = soe_event.soe_data[soe_event.soe_record_cnt]; if(Sys_data_object.P4.Point_SOE_write >= TOTAL_NUM_SOE) { Sys_data_object.P4.Point_SOE_write = 0; } EepWrite(soe_tmp_buf, EEP_ADDR_SOE_BASE + (u16)Sys_data_object.P4.Point_SOE_write*LENGTH_ONE_SOE, LENGTH_ONE_SOE, &soe_ee_msg); save_soe_state = SAVE_SOE_S2; } } break; case SAVE_SOE_S2: { if(TASK_IDLE == EepIfIdle()) { Sys_data_object.P4.Point_SOE_write++; Sys_data_object.P4.Point_SOE_write %= TOTAL_NUM_SOE; EepWrite((u8*)(&Sys_data_object.P4.Point_SOE_write), EEP_ADDR_SOE_WR_POINT,sizeof(Sys_data_object.P4.Point_SOE_write),&soe_ee_msg); save_soe_state = SAVE_SOE_S0; } } break; default: { save_soe_state = SAVE_SOE_S0; } break; } } // void SoeInit(void) { soe_event.soe_cnt = 0; soe_event.soe_record_cnt = 0; } void SoeDealApp(void) { SaveSoeToEE(); } /************************************************************************************* * @fun_name: Search_Soe -- 按照筛选条件 检索SOE * @brief : * @param[in] : soe_type--SOE类型 (0xFFFF表示不限定类型) start_time--起始时间(BCD前些 00年01月01日 00:00:00 表示读取最新SOE) end_time--结束时间(BCD填写当前时间,表示读取最新SOE) num--要检索几条 (0XFF-不限定条数) soe_read--检索到后存放指针 检索顺序为最新发生的事件在前 * @param[out] : u8 检索到有效的SOE条数 * @retval : None * @other : None *************************************************************************************/ u8 Check_One_Soe (u16 soe_type,DateTime_noweek *start_time,DateTime_noweek *end_time,ONE_SOE *soe_read) { time_t start_time_Greene,end_time_Greene,soe_time_Greene;//格林威治时间:从1970年1月1日开始到现在的秒数 start_time_Greene = get_mktime_noweek(start_time); end_time_Greene = get_mktime_noweek(end_time); if(((soe_read->soe_type > SOE_START_ID0)&&(soe_read->soe_type < SOE_END_ID0))\ ||((soe_read->soe_type > SOE_START_ID1)&&(soe_read->soe_type < SOE_END_ID1))) { //确保是有效的SOE事件 if((soe_read->soe_type == soe_type) || (soe_type == SOE_ALL_TYPE))//是需要读取的类型 { soe_time_Greene = get_mktime_noweek(&soe_read->soe_time); if((soe_time_Greene >= start_time_Greene) && (soe_time_Greene <= end_time_Greene)) //是发生在读取时间段内 { //又检索到一条有效的SOE return TRUE; } } } return FALSE; }