@@ -16,129 +16,124 @@ static void app_leakage_init(void);
/*<2A> <> ʷ<EFBFBD> <CAB7> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> */
uint8_t sector_buf [ 2 ] [ W25Q32_SECTOR_SIZE ] ;
app_leakage_t leakage =
{
. region _num = 0 ,
. sub_device_num = 0 ,
. init = app_leakage_init ,
. task = app_leakage_task ,
. class_update = app_leakage_region_classify ,
app_leakage_t leakage =
{
. region_num = 0 ,
. sub_device _num = 0 ,
. init = app_leakage_init ,
. task = app_leakage_task ,
. class_update = app_leakage_region_classify ,
} ;
app_leakage_t * p_leakage = & leakage ;
app_hitory_t history =
{
. read_history = history_read_record ,
. clean_history = history_clear_all ,
. init_history = history_init
} ;
{
. read_history = history_read_record ,
. clean_history = history_clear_all ,
. init_history = history_init } ;
static void app_leakage_init ( void )
{
// for(int i = 0; i < APP_LEAKAGE_SUB_DEVICE_NUM; i++)
// {
// memset(leakage.sub_device_data[i].ch_data, 0,
// sizeof(leakage.sub_device_data[i].ch_data));
// }
app_leakage_region_classify ( ) ;
// for(int i = 0; i < APP_LEAKAGE_SUB_DEVICE_NUM; i++)
// {
// memset(leakage.sub_device_data[i].ch_data, 0,
// sizeof(leakage.sub_device_data[i].ch_data));
// }
app_leakage_region_classify ( ) ;
}
/*<2A> <> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> ࣬<EFBFBD> <E0A3AC> ͬһ <CDAC> <D2BB> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> 豸<EFBFBD> <E8B1B8> <EFBFBD> ֵ<EFBFBD> һ <EFBFBD> <D2BB> */
void app_leakage_region_classify ( void )
{
u16 i , j ;
u16 i , j ;
u8 add_region_flag ;
/*<2A> <> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> */
p_leakage - > region_num = 0 ;
p_leakage - > sub_device_num = 0 ;
memset ( p_leakage - > region_data , 0 , sizeof ( p_leakage - > region_data ) ) ;
memset ( p_leakage - > region_data , 0 , sizeof ( p_leakage - > region_data ) ) ;
/*<2A> <> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> ϵͳ*/
for ( i = 0 ; i < APP_LEAKAGE_SUB_DEVICE_NUM ; i + + )
for ( i = 0 ; i < APP_LEAKAGE_SUB_DEVICE_NUM ; i + + )
{
add_region_flag = 1 ; /*<2A> <> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> */
add_region_flag = 1 ; /*<2A> <> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> */
/*<2A> 豸ʹ <E8B1B8> <CAB9> */
if ( ENABLE = = p_leakage - > sub_device_data [ i ] . flash_data . state )
if ( ENABLE = = p_leakage - > sub_device_data [ i ] . flash_data . state )
{
p_leakage - > sub_device_num + + ; /*<2A> <> ϵͳ<CFB5> <CDB3> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> ++*/
p_leakage - > sub_device_num + + ; /*<2A> <> ϵͳ<CFB5> <CDB3> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> ++*/
/********************************************<2A> <> <EFBFBD> <EFBFBD> ******************************************************/
/*<2A> <> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> */
for ( j = 0 ; j < APP_LEAKAGE_SUB_DEVICE_NUM ; j + + )
/*<2A> <> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> */
for ( j = 0 ; j < APP_LEAKAGE_SUB_DEVICE_NUM ; j + + )
{
if ( 0 = = memcmp ( p_leakage - > region_data [ j ] . name , p_leakage - > sub_device_data [ i ] . flash_data . region_name , APP_LEAKAGE_STRING_NANE_LEN ) ) /*<2A> <> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> ͬ*/
if ( 0 = = memcmp ( p_leakage - > region_data [ j ] . name , p_leakage - > sub_device_data [ i ] . flash_data . region_name , APP_LEAKAGE_STRING_NANE_LEN ) ) /*<2A> <> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> ͬ*/
{
/*<2A> <> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> 豸*/
p_leakage - > region_data [ j ] . sub_device_index [ p_leakage - > region_data [ j ] . sub_device_num ] = i ; /*<2A> <> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> 豸<EFBFBD> <E8B1B8> <EFBFBD> <EFBFBD> */
p_leakage - > region_data [ j ] . sub_device_num + + ; /*<2A> <> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> ϵͳ<CFB5> <CDB3> <EFBFBD> <EFBFBD> ++*/
add_region_flag = 0 ; /*<2A> <> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> */
p_leakage - > region_data [ j ] . sub_device_index [ p_leakage - > region_data [ j ] . sub_device_num ] = i ; /*<2A> <> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> 豸<EFBFBD> <E8B1B8> <EFBFBD> <EFBFBD> */
p_leakage - > region_data [ j ] . sub_device_num + + ; /*<2A> <> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> ϵͳ<CFB5> <CDB3> <EFBFBD> <EFBFBD> ++*/
add_region_flag = 0 ; /*<2A> <> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> */
break ;
}
}
/*û<> <C3BB> <EFBFBD> ҵ<EFBFBD> <D2B5> <EFBFBD> ͬ<EFBFBD> <CDAC> <EFBFBD> <EFBFBD> */
if ( add_region_flag ) /*<2A> <> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> */
if ( add_region_flag ) /*<2A> <> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> */
{
/*<2A> <> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> */
memcpy ( p_leakage - > region_data [ p_leakage - > region_num ] . name ,
memcpy ( p_leakage - > region_data [ p_leakage - > region_num ] . name ,
p_leakage - > sub_device_data [ i ] . flash_data . region_name ,
APP_LEAKAGE_STRING_NANE_LEN ) ;
// <20> <> һ <EFBFBD> <D2BB> <EFBFBD> 豸<EFBFBD> <E8B1B8> <EFBFBD> <EFBFBD> Ϊ0
p_leakage - > region_data [ p_leakage - > region_num ] . sub_device_index [ 0 ] = i ;
p_leakage - > region_data [ p_leakage - > region_num ] . sub_device_num = 1 ;
p_leakage - > region_num + + ;
}
}
}
}
}
/*<2A> <> <EFBFBD> <EFBFBD> <20> <> <20> <> <20> ̵<EFBFBD> <CCB5> <EFBFBD> <20> <> <EFBFBD> <EFBFBD> */
static void app_leakage_alarm_contorl ( void )
{
if ( 0 ! = p_leakage - > alarm_state )
if ( 0 ! = p_leakage - > alarm_state )
{
buzzer . set . on ( ) ;
relay . set ( BSP_RELAY_CH_ERROR_STATE , USR_ON ) ;
relay . set ( BSP_RELAY_CH_ERROR_STATE , USR_ON ) ;
}
else
{
buzzer . set . off ( ) ;
relay . set ( BSP_RELAY_CH_ERROR_STATE , USR_OFF ) ;
relay . set ( BSP_RELAY_CH_ERROR_STATE , USR_OFF ) ;
}
/*©Һ״̬*/
if ( p_leakage - > alarm_state & APP_LEAKAGE_SUB_DEVICE_STATE_LEAKAGE )
if ( p_leakage - > alarm_state & APP_LEAKAGE_SUB_DEVICE_STATE_LEAKAGE )
{
relay . set ( BSP_RELAY_CH_LEAKAGE , USR_ON ) ;
relay . set ( BSP_RELAY_CH_LEAKAGE , USR_ON ) ;
}
else
{
relay . set ( BSP_RELAY_CH_LEAKAGE , USR_OFF ) ;
relay . set ( BSP_RELAY_CH_LEAKAGE , USR_OFF ) ;
}
/*<2A> ϴ<EFBFBD> ״̬*/
if ( p_leakage - > alarm_state & APP_LEAKAGE_SUB_DEVICE_STATE_OPEN )
if ( p_leakage - > alarm_state & APP_LEAKAGE_SUB_DEVICE_STATE_OPEN )
{
relay . set ( BSP_RELAY_CH_OPEN , USR_ON ) ;
relay . set ( BSP_RELAY_CH_OPEN , USR_ON ) ;
}
else
{
relay . set ( BSP_RELAY_CH_OPEN , USR_OFF ) ;
relay . set ( BSP_RELAY_CH_OPEN , USR_OFF ) ;
}
/*ͨѶ<CDA8> <D1B6> ʱ*/
if ( p_leakage - > alarm_state & APP_LEAKAGE_SUB_DEVICE_STATE_TIME_OUT )
if ( p_leakage - > alarm_state & APP_LEAKAGE_SUB_DEVICE_STATE_TIME_OUT )
{
relay . set ( BSP_RELAY_CH_COMMINCAION , USR_ON ) ;
}
relay . set ( BSP_RELAY_CH_COMMINCAION , USR_ON ) ;
}
else
{
relay . set ( BSP_RELAY_CH_COMMINCAION , USR_OFF ) ;
relay . set ( BSP_RELAY_CH_COMMINCAION , USR_OFF ) ;
}
}
/*<2A> 쳣״̬<D7B4> 豸<EFBFBD> <E8B1B8> <EFBFBD> <EFBFBD> ͳ<EFBFBD> <CDB3> */
void app_leakage_task ( void )
{
@@ -146,7 +141,7 @@ void app_leakage_task(void)
u16 i , j , k , sub_device_index ;
/* <20> <> ʼ <EFBFBD> <CABC> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> 쳣ͳ<ECB3A3> <CDB3> */
for ( i = 0 ; i < p_leakage - > region_num ; i + + )
for ( i = 0 ; i < p_leakage - > region_num ; i + + )
{
p_leakage - > region_data [ i ] . leakage_num = 0 ;
p_leakage - > region_data [ i ] . open_num = 0 ;
@@ -154,52 +149,50 @@ void app_leakage_task(void)
}
p_leakage - > alarm_state = 0 ;
/* <20> <> <EFBFBD> <EFBFBD> ״̬<D7B4> 仯<EFBFBD> <E4BBAF> ͳ<EFBFBD> <CDB3> <EFBFBD> 쳣<EFBFBD> <ECB3A3> <EFBFBD> <EFBFBD> */
for ( i = 0 ; i < p_leakage - > region_num ; i + + )
for ( i = 0 ; i < p_leakage - > region_num ; i + + )
{
for ( j = 0 ; j < p_leakage - > region_data [ i ] . sub_device_num ; j + + )
for ( j = 0 ; j < p_leakage - > region_data [ i ] . sub_device_num ; j + + )
{
sub_device_index = p_leakage - > region_data [ i ] . sub_device_index [ j ] ;
/* <20> <> <EFBFBD> <EFBFBD> <EFBFBD> 豸<EFBFBD> Ƿ<EFBFBD> <C7B7> <EFBFBD> <EFBFBD> <EFBFBD> */
if ( p_leakage - > sub_device_data [ sub_device_index ] . flash_data . state ! = ENABLE )
if ( p_leakage - > sub_device_data [ sub_device_index ] . flash_data . state ! = ENABLE )
{
continue ;
}
/* <20> <> <EFBFBD> <EFBFBD> <EFBFBD> 豸<EFBFBD> Ƿ<EFBFBD> <C7B7> <EFBFBD> <EFBFBD> <EFBFBD> */
if ( p_leakage - > sub_device_data [ sub_device_index ] . shield ! = UNBLOCKED )
if ( p_leakage - > sub_device_data [ sub_device_index ] . shield ! = UNBLOCKED )
{
continue ;
}
/*<2A> <> ʷ<EFBFBD> <CAB7> <EFBFBD> <EFBFBD> <EFBFBD> 洢*/
for ( k = 0 ; k < APP_LEAKAGE_SUB_DEVICE_USE_CH_NUM ; k + + )
for ( k = 0 ; k < APP_LEAKAGE_SUB_DEVICE_USE_CH_NUM ; k + + )
{
u16 current_state = p_leakage - > sub_device_data [ sub_device_index ] . ch_data [ k ] . state ;
u16 prev_state = prev_ch_state [ sub_device_index ] [ k ] ;
u16 leak_distance = p_leakage - > sub_device_data [ sub_device_index ] . ch_data [ k ] . distance ;
/* <20> <> <EFBFBD> <EFBFBD> ״̬<D7B4> 仯<EFBFBD> <E4BBAF> <EFBFBD> <EFBFBD> ¼<EFBFBD> <C2BC> ʷ<EFBFBD> <CAB7> <EFBFBD> <EFBFBD> */
if ( ( current_state & APP_LEAKAGE_SUB_DEVICE_STATE_LEAKAGE ) & &
! ( prev_state & APP_LEAKAGE_SUB_DEVICE_STATE_LEAKAGE ) )
if ( ( current_state & APP_LEAKAGE_SUB_DEVICE_STATE_LEAKAGE ) & &
! ( prev_state & APP_LEAKAGE_SUB_DEVICE_STATE_LEAKAGE ) )
{
/* ©Һ<C2A9> <D2BA> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> ʼ - <20> <> ¼<EFBFBD> <C2BC> ʷ<EFBFBD> <CAB7> <EFBFBD> <EFBFBD> */
history_add_alarm_record ( i , sub_device_index , k , APP_LEAKAGE_SUB_DEVICE_STATE_LEAKAGE , leak_distance ) ;
}
if ( ( current_state & APP_LEAKAGE_SUB_DEVICE_STATE_OPEN ) & &
! ( prev_state & APP_LEAKAGE_SUB_DEVICE_STATE_OPEN ) )
if ( ( current_state & APP_LEAKAGE_SUB_DEVICE_STATE_OPEN ) & &
! ( prev_state & APP_LEAKAGE_SUB_DEVICE_STATE_OPEN ) )
{
/* <20> ϴ<EFBFBD> <CFB4> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> ʼ - <20> <> ¼<EFBFBD> <C2BC> ʷ<EFBFBD> <CAB7> <EFBFBD> <EFBFBD> */
history_add_alarm_record ( i , sub_device_index , k , APP_LEAKAGE_SUB_DEVICE_STATE_OPEN , 0 ) ;
}
if ( ( current_state & APP_LEAKAGE_SUB_DEVICE_STATE_TIME_OUT ) & &
! ( prev_state & APP_LEAKAGE_SUB_DEVICE_STATE_TIME_OUT ) )
if ( ( current_state & APP_LEAKAGE_SUB_DEVICE_STATE_TIME_OUT ) & &
! ( prev_state & APP_LEAKAGE_SUB_DEVICE_STATE_TIME_OUT ) )
{
if ( k > 0 & & ( p_leakage - > sub_device_data [ sub_device_index ] . ch_data [ 0 ] . state & APP_LEAKAGE_SUB_DEVICE_STATE_TIME_OUT ) )
if ( k > 0 & & ( p_leakage - > sub_device_data [ sub_device_index ] . ch_data [ 0 ] . state & APP_LEAKAGE_SUB_DEVICE_STATE_TIME_OUT ) )
{
/*<2A> <> һ <EFBFBD> <D2BB> ͨ<EFBFBD> <CDA8> <EFBFBD> <EFBFBD> ʱ<EFBFBD> <CAB1> ʣ<EFBFBD> <CAA3> ͨ<EFBFBD> <CDA8> <EFBFBD> <EFBFBD> <EFBFBD> 洢<EFBFBD> <E6B4A2> ʱ<EFBFBD> <CAB1> <EFBFBD> <EFBFBD> */
}
@@ -209,34 +202,33 @@ void app_leakage_task(void)
history_add_alarm_record ( i , sub_device_index , k , APP_LEAKAGE_SUB_DEVICE_STATE_TIME_OUT , 0 ) ;
}
}
/* <20> <> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> ʷ״̬ */
prev_ch_state [ sub_device_index ] [ k ] = current_state ;
}
/* ͳ<> <CDB3> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> 쳣<EFBFBD> 豸<EFBFBD> <E8B1B8> <EFBFBD> <EFBFBD> - <20> <> <EFBFBD> 豸ͳ<E8B1B8> <CDB3> */
for ( k = 0 ; k < APP_LEAKAGE_SUB_DEVICE_USE_CH_NUM ; k + + )
for ( k = 0 ; k < APP_LEAKAGE_SUB_DEVICE_USE_CH_NUM ; k + + )
{
u16 current_state = p_leakage - > sub_device_data [ sub_device_index ] . ch_data [ k ] . state ;
if ( current_state & APP_LEAKAGE_SUB_DEVICE_STATE_TIME_OUT )
if ( current_state & APP_LEAKAGE_SUB_DEVICE_STATE_TIME_OUT )
{
p_leakage - > region_data [ i ] . time_out_num + + ;
p_leakage - > alarm_state | = APP_LEAKAGE_SUB_DEVICE_STATE_TIME_OUT ;
break ;
}
else if ( current_state & APP_LEAKAGE_SUB_DEVICE_STATE_OPEN )
else if ( current_state & APP_LEAKAGE_SUB_DEVICE_STATE_OPEN )
{
p_leakage - > region_data [ i ] . open_num + + ;
p_leakage - > alarm_state | = APP_LEAKAGE_SUB_DEVICE_STATE_OPEN ;
p_leakage - > region_data [ i ] . open_num + + ;
p_leakage - > alarm_state | = APP_LEAKAGE_SUB_DEVICE_STATE_OPEN ;
}
else if ( current_state & APP_LEAKAGE_SUB_DEVICE_STATE_LEAKAGE )
else if ( current_state & APP_LEAKAGE_SUB_DEVICE_STATE_LEAKAGE )
{
p_leakage - > region_data [ i ] . leakage_num + + ;
p_leakage - > alarm_state | = APP_LEAKAGE_SUB_DEVICE_STATE_LEAKAGE ;
}
}
}
}
/*<2A> <> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <20> <> <EFBFBD> ⱨ<EFBFBD> <E2B1A8> */
@@ -246,29 +238,28 @@ void app_leakage_task(void)
/* <20> <> ȡ<EFBFBD> <C8A1> ǰʱ<C7B0> <CAB1> */
static void get_current_time ( u8 * time_buffer )
{
/* <20> <> : 2<> ֽ<EFBFBD> (<28> <> <EFBFBD> <EFBFBD> : 2024 -> 0x07 0xE8) */
uint16_t year = 2000 + DS1302 . Time . Year ; /* RTC<54> <43> <EFBFBD> <EFBFBD> ͨ<EFBFBD> <CDA8> <EFBFBD> <EFBFBD> 2000<30> <30> ʼ */
time_buffer [ 0 ] = ( year > > 8 ) & 0xFF ; /* <20> <> <EFBFBD> ֽ<EFBFBD> */
time_buffer [ 1 ] = year & 0xFF ; /* <20> <> <EFBFBD> ֽ<EFBFBD> */
time_buffer [ 2 ] = DS1302 . Time . Month ; /* <20> <> */
time_buffer [ 3 ] = DS1302 . Time . Day ; /* <20> <> */
time_buffer [ 4 ] = DS1302 . Time . Hour ; /* ʱ */
time_buffer [ 5 ] = DS1302 . Time . Minute ; /* <20> <> */
time_buffer [ 6 ] = DS1302 . Time . Second ; /* <20> <> */
/* <20> <> : 2<> ֽ<EFBFBD> (<28> <> <EFBFBD> <EFBFBD> : 2024 -> 0x07 0xE8) */
uint16_t year = 2000 + DS1302 . Time . Year ; /* RTC<54> <43> <EFBFBD> <EFBFBD> ͨ<EFBFBD> <CDA8> <EFBFBD> <EFBFBD> 2000<30> <30> ʼ */
time_buffer [ 0 ] = ( year > > 8 ) & 0xFF ; /* <20> <> <EFBFBD> ֽ<EFBFBD> */
time_buffer [ 1 ] = year & 0xFF ; /* <20> <> <EFBFBD> ֽ<EFBFBD> */
time_buffer [ 2 ] = DS1302 . Time . Month ; /* <20> <> */
time_buffer [ 3 ] = DS1302 . Time . Day ; /* <20> <> */
time_buffer [ 4 ] = DS1302 . Time . Hour ; /* ʱ */
time_buffer [ 5 ] = DS1302 . Time . Minute ; /* <20> <> */
time_buffer [ 6 ] = DS1302 . Time . Second ; /* <20> <> */
}
/* <20> <> Flash<73> <68> ȡ<EFBFBD> <C8A1> ʷ<EFBFBD> <CAB7> <EFBFBD> <EFBFBD> Ԫ<EFBFBD> <D4AA> <EFBFBD> <EFBFBD> */
static void history_read_metadata ( void )
{
app_leakage_history_metadata_t temp_metadata ;
w25q32 . read ( W25Q32_HISTORY_ALARM_METADATA_ADDR ,
( uint8_t * ) & temp_metadata ,
w25q32 . read ( W25Q32_HISTORY_ALARM_METADATA_ADDR ,
( uint8_t * ) & temp_metadata ,
sizeof ( app_leakage_history_metadata_t ) ) ;
if ( temp_metadata . total_records < = temp_metadata . max_records & &
temp_metadata . write_index < temp_metadata . max_records )
if ( temp_metadata . total_records < = temp_metadata . max_records & &
temp_metadata . write_index < temp_metadata . max_records )
{
/* <20> <> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> Ч<EFBFBD> <D0A7> <EFBFBD> <EFBFBD> <EFBFBD> Ƶ<EFBFBD> ȫ<EFBFBD> ֱ<EFBFBD> <D6B1> <EFBFBD> */
memcpy ( & leakage . history_metadata , & temp_metadata , sizeof ( app_leakage_history_metadata_t ) ) ;
@@ -278,9 +269,9 @@ static void history_read_metadata(void)
/* <20> <> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> Ч<EFBFBD> <D0A7> <EFBFBD> <EFBFBD> ʼ <EFBFBD> <CABC> */
memset ( & leakage . history_metadata , 0 , sizeof ( app_leakage_history_metadata_t ) ) ;
leakage . history_metadata . max_records = MAX_HISTORY_ALARM_RECORDS ;
/* <20> <> <EFBFBD> 浽Flash */
history_save_metadata ( ) ;
history_save_metadata ( ) ;
}
}
@@ -289,17 +280,17 @@ static void history_save_metadata(void)
{
/* <20> <> <EFBFBD> <EFBFBD> Ԫ<EFBFBD> <D4AA> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> */
w25q32_sector_erase ( W25Q32_HISTORY_ALARM_METADATA_ADDR ) ;
/* д<> <D0B4> Ԫ<EFBFBD> <D4AA> <EFBFBD> <EFBFBD> */
w25q32 . write ( W25Q32_HISTORY_ALARM_METADATA_ADDR ,
( uint8_t * ) & leakage . history_metadata ,
sizeof ( app_leakage_history_metadata_t ) ) ;
w25q32 . write ( W25Q32_HISTORY_ALARM_METADATA_ADDR ,
( uint8_t * ) & leakage . history_metadata ,
sizeof ( app_leakage_history_metadata_t ) ) ;
}
/* <20> <> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> ¼<EFBFBD> <C2BC> Flash<73> е ĵ<D0B5> ַ */
static uint32_t history_calc_record_addr ( u32 record_index )
{
return W25Q32_HISTORY_ALARM_DATA_ADDR +
return W25Q32_HISTORY_ALARM_DATA_ADDR +
( record_index * HISTORY_ALARM_RECORD_SIZE ) ;
}
@@ -307,7 +298,7 @@ static uint32_t history_calc_record_addr(u32 record_index)
static uint32_t history_calc_sector_addr ( u32 record_index )
{
uint32_t record_addr = history_calc_record_addr ( record_index ) ;
return record_addr & ~ ( W25Q32_SECTOR_SIZE - 1 ) ; /* 4K<34> <4B> <EFBFBD> <EFBFBD> */
return record_addr & ~ ( W25Q32_SECTOR_SIZE - 1 ) ; /* 4K<34> <4B> <EFBFBD> <EFBFBD> */
}
/* <20> <> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> ʷ<EFBFBD> <CAB7> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> ¼ */
@@ -315,76 +306,84 @@ void history_add_alarm_record(u8 region_idx, u8 device_idx, u8 channel, u16 alar
{
app_leakage_history_alarm_t new_alarm ;
uint32_t write_addr ;
/* <20> <> <EFBFBD> 䱨<EFBFBD> <E4B1A8> <EFBFBD> <EFBFBD> ¼ */
memset ( & new_alarm , 0 , sizeof ( app_leakage_history_alarm_t ) ) ;
/* <20> <> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> */
if ( region_idx < leakage . region_num ) {
memcpy ( new_alarm . region_name , leakage . region_data [ region_idx ] . name ,
if ( region_idx < leakage . region_num )
{
memcpy ( new_alarm . region_name , leakage . region_data [ region_idx ] . name ,
APP_LEAKAGE_STRING_NANE_LEN ) ;
}
/* <20> 豸ID<49> <44> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> */
if ( device_idx < APP_LEAKAGE_SUB_DEVICE_NUM ) {
if ( device_idx < APP_LEAKAGE_SUB_DEVICE_NUM )
{
new_alarm . device_id = leakage . sub_device_data [ device_idx ] . flash_data . modbus_id ;
memcpy ( new_alarm . device_name , leakage . sub_device_data [ device_idx ] . flash_data . device_name ,
APP_LEAKAGE_STRING_NANE_LEN ) ;
}
/* <20> <> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> ͡<EFBFBD> ͨ<EFBFBD> <CDA8> <EFBFBD> <EFBFBD> ©Һ<C2A9> <D2BA> <EFBFBD> <EFBFBD> */
new_alarm . alarm_type = alarm_type ;
new_alarm . channel = channel ;
new_alarm . leak_distance = leak_distance ;
/* <20> <> ʼ ʱ<CABC> <CAB1> */
get_current_time ( new_alarm . start_time ) ;
/* <20> <> <EFBFBD> <EFBFBD> д<EFBFBD> <D0B4> <EFBFBD> <EFBFBD> ַ */
write_addr = history_calc_record_addr ( leakage . history_metadata . write_index ) ;
/* <20> <> <EFBFBD> <EFBFBD> <EFBFBD> ü<EFBFBD> ¼<EFBFBD> <C2BC> <EFBFBD> ܿ<EFBFBD> Խ<EFBFBD> <D4BD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> Χ <EFBFBD> <CEA7> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> 2<EFBFBD> <32> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> */
uint32_t start_sector = write_addr & ~ ( W25Q32_SECTOR_SIZE - 1 ) ;
uint32_t end_addr = write_addr + HISTORY_ALARM_RECORD_SIZE - 1 ;
uint32_t end_sector = end_addr & ~ ( W25Q32_SECTOR_SIZE - 1 ) ;
uint32_t num_sectors = ( end_sector - start_sector ) / W25Q32_SECTOR_SIZE + 1 ;
/* <20> <> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> ÿ<EFBFBD> <C3BF> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> 4KB */
uint32_t sectors [ 2 ] = { start_sector , ( num_sectors > 1 ) ? end_sector : 0 } ;
/* 1. <20> <> ȡ<EFBFBD> <C8A1> <EFBFBD> <EFBFBD> <EFBFBD> 漰<EFBFBD> <E6BCB0> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> RAM */
for ( uint32_t i = 0 ; i < num_sectors ; i + + ) {
for ( uint32_t i = 0 ; i < num_sectors ; i + + )
{
w25q32 . read ( sectors [ i ] , sector_buf [ i ] , W25Q32_SECTOR_SIZE ) ;
}
/* 2. <20> <> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> Щ<EFBFBD> <D0A9> <EFBFBD> <EFBFBD> */
for ( uint32_t i = 0 ; i < num_sectors ; i + + ) {
for ( uint32_t i = 0 ; i < num_sectors ; i + + )
{
w25q32_sector_erase ( sectors [ i ] ) ;
}
/* 3. <20> <> RAM<41> и<EFBFBD> <D0B8> <EFBFBD> <EFBFBD> ¼<EFBFBD> ¼<EFBFBD> <C2BC> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> */
uint32_t offset_in_start = write_addr - start_sector ;
uint32_t first_part_len = ( num_sectors = = 1 ) ? HISTORY_ALARM_RECORD_SIZE : ( W25Q32_SECTOR_SIZE - offset_in_start ) ;
memcpy ( sector_buf [ 0 ] + offset_in_start , & new_alarm , first_part_len ) ;
if ( num_sectors > 1 ) {
if ( num_sectors > 1 )
{
uint32_t second_part_len = HISTORY_ALARM_RECORD_SIZE - first_part_len ;
memcpy ( sector_buf [ 1 ] , ( uint8_t * ) & new_alarm + first_part_len , second_part_len ) ;
memcpy ( sector_buf [ 1 ] , ( uint8_t * ) & new_alarm + first_part_len , second_part_len ) ;
}
/* 4. <20> <> <EFBFBD> ĺ<DEB8> <C4BA> Ļ<EFBFBD> <C4BB> <EFBFBD> <EFBFBD> <EFBFBD> д<EFBFBD> <D0B4> Flash */
for ( uint32_t i = 0 ; i < num_sectors ; i + + ) {
for ( uint32_t i = 0 ; i < num_sectors ; i + + )
{
w25q32 . write ( sectors [ i ] , sector_buf [ i ] , W25Q32_SECTOR_SIZE ) ;
}
/* 5. <20> <> <EFBFBD> <EFBFBD> Ԫ<EFBFBD> <D4AA> <EFBFBD> ݣ<EFBFBD> <DDA3> <EFBFBD> <EFBFBD> ζ<EFBFBD> <CEB6> У <EFBFBD> */
leakage . history_metadata . write_index + + ;
if ( leakage . history_metadata . write_index > = leakage . history_metadata . max_records ) {
if ( leakage . history_metadata . write_index > = leakage . history_metadata . max_records )
{
leakage . history_metadata . write_index = 0 ;
}
if ( leakage . history_metadata . total_records < leakage . history_metadata . max_records ) {
if ( leakage . history_metadata . total_records < leakage . history_metadata . max_records )
{
leakage . history_metadata . total_records + + ;
}
/* <20> <> <EFBFBD> <EFBFBD> Ԫ<EFBFBD> <D4AA> <EFBFBD> ݵ<EFBFBD> Flash */
history_save_metadata ( ) ;
}
@@ -392,31 +391,28 @@ void history_add_alarm_record(u8 region_idx, u8 device_idx, u8 channel, u16 alar
/* <20> <> ȡ<EFBFBD> <C8A1> ʷ<EFBFBD> <CAB7> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> ¼ */
static u8 history_read_record ( u32 record_index , app_leakage_history_alarm_t * record )
{
if ( record_index > = leakage . history_metadata . total_records )
if ( record_index > = leakage . history_metadata . total_records )
{
return 0 ; /* <20> <> ¼<EFBFBD> <C2BC> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> Ч */
return 0 ; /* <20> <> ¼<EFBFBD> <C2BC> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> Ч */
}
/* <20> <> <EFBFBD> <EFBFBD> ʵ<EFBFBD> ʴ洢<CAB4> <E6B4A2> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> ѭ<EFBFBD> <D1AD> <EFBFBD> <EFBFBD> <EFBFBD> У <EFBFBD> */
uint32_t actual_index ;
if ( leakage . history_metadata . total_records = = leakage . history_metadata . max_records ) {
// <20> <> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> write_index ָ<> <D6B8> <EFBFBD> <EFBFBD> <EFBFBD> ɼ<EFBFBD> ¼
actual_index = ( leakage . history_metadata . write_index - 1 - record_index
+ leakage . history_metadata . max_records ) % leakage . history_metadata . max_records ;
} else {
// δ<> <CEB4> <EFBFBD> <EFBFBD> ˳<EFBFBD> <CBB3> <EFBFBD> 洢<EFBFBD> <E6B4A2> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> 0 <20> <> <EFBFBD> 磬<EFBFBD> <E7A3AC> <EFBFBD> <EFBFBD> total_records-1 <20> <> <EFBFBD> <EFBFBD>
actual_index = leakage . history_metadata . total_records - 1 - record_index ;
}
if ( actual_index = = 125 )
if ( leakage . history_metadata . total_records = = leakage . history_metadata . max_records )
{
actual_index = 125 ;
/* <20> <> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> */
actual_index = ( leakage . history_metadata . write_index + record_index ) %
leakage . history_metadata . max_records ;
}
else
{
/* <20> <> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> δ<EFBFBD> <CEB4> <EFBFBD> <EFBFBD> ֱ<EFBFBD> Ӷ<EFBFBD> ȡ */
actual_index = record_index ;
}
uint32_t read_addr = history_calc_record_addr ( actual_index ) ;
w25q32 . read ( read_addr , ( uint8_t * ) record , HISTORY_ALARM_RECORD_SIZE ) ;
uint32_t read_addr = history_calc_record_addr ( actual_index ) ;
w25q32 . read ( read_addr , ( uint8_t * ) record , HISTORY_ALARM_RECORD_SIZE ) ;
return 1 ;
}
@@ -426,19 +422,18 @@ static void history_clear_all(void)
/* <20> <> <EFBFBD> <EFBFBD> Ԫ<EFBFBD> <D4AA> <EFBFBD> <EFBFBD> */
memset ( & leakage . history_metadata , 0 , sizeof ( app_leakage_history_metadata_t ) ) ;
leakage . history_metadata . max_records = MAX_HISTORY_ALARM_RECORDS ;
/* <20> <> <EFBFBD> <EFBFBD> Ԫ<EFBFBD> <D4AA> <EFBFBD> <EFBFBD> */
history_save_metadata ( ) ;
/* <20> <> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> ѡ <EFBFBD> <D1A1> */
for ( uint32_t i = 0 ; i < HISTORY_ALARM_SECTORS_NEEDED ; i + + )
for ( uint32_t i = 0 ; i < HISTORY_ALARM_SECTORS_NEEDED ; i + + )
{
uint32_t sector_addr = W25Q32_HISTORY_ALARM_DATA_ADDR + i * W25Q32_SECTOR_SIZE ;
w25q32_sector_erase ( sector_addr ) ;
}
}
/* <20> <> ʼ <EFBFBD> <CABC> <EFBFBD> <EFBFBD> ʷ<EFBFBD> <CAB7> <EFBFBD> <EFBFBD> ģ<EFBFBD> <C4A3> */
static void history_init ( void )
{