diff --git a/lark1fq/src/device.h b/lark1fq/src/device.h index 4646211..2764bc2 100755 --- a/lark1fq/src/device.h +++ b/lark1fq/src/device.h @@ -39,12 +39,10 @@ struct bitmap_main_s { uint32_t gas4_unit_code; uint8_t gas4_unit_name[8]; - uint32_t ch1_filter_length; - uint32_t ch2_filter_length; - uint32_t ch3_filter_length; - uint32_t ch4_filter_length; + uint32_t filter_median[4]; + uint32_t filter_window[4]; - uint8_t res[204]; + uint8_t res[188]; uint32_t checksum; uint32_t gasn_avail_bitmap; }; diff --git a/lark1fq/src/filter.c b/lark1fq/src/filter.c index 292146d..822c7eb 100755 --- a/lark1fq/src/filter.c +++ b/lark1fq/src/filter.c @@ -8,44 +8,56 @@ static uint32_t sum_gas1[FILTER_SUM_LEN_GAS1] __attribute__((section(".bss_ccm") static uint32_t sum_gas2[FILTER_SUM_LEN_GAS2] __attribute__((section(".bss_ccm"))); static uint32_t sum_gas3[FILTER_SUM_LEN_GAS3] __attribute__((section(".bss_ccm"))); static uint32_t sum_gas4[FILTER_SUM_LEN_GAS4] __attribute__((section(".bss_ccm"))); -static struct list_s median_gas1[FILTER_MEDIAN_LEN_GAS1] __attribute__((section(".bss_ccm"))); -static struct list_s median_gas2[FILTER_MEDIAN_LEN_GAS2] __attribute__((section(".bss_ccm"))); -static struct list_s median_gas3[FILTER_MEDIAN_LEN_GAS3] __attribute__((section(".bss_ccm"))); -static struct list_s median_gas4[FILTER_MEDIAN_LEN_GAS4] __attribute__((section(".bss_ccm"))); -static uint32_t window_gas1[FILTER_WINDOW_LEN_GAS1] __attribute__((section(".bss_ccm"))); -static uint32_t window_gas2[FILTER_WINDOW_LEN_GAS2] __attribute__((section(".bss_ccm"))); -static uint32_t window_gas3[FILTER_WINDOW_LEN_GAS3] __attribute__((section(".bss_ccm"))); -static uint32_t window_gas4[FILTER_WINDOW_LEN_GAS4] __attribute__((section(".bss_ccm"))); +static uint8_t filter_pool[32 * 1024] __attribute__((section(".bss_ccm"))) __attribute__((aligned(4))); struct data_filter_s data_filter[4] __attribute__((section(".bss_ccm"))); +const uint16_t median_length[4] = {1024, 128, 128, 128}; +const uint16_t window_length[4] = {256, 64, 64, 64}; + void filter_init(void) { + uint32_t length; + /* data_filter parameter init */ data_filter[0].sum_len = FILTER_SUM_LEN_GAS1; data_filter[0].sum_buff = sum_gas1; - data_filter[0].median_len = FILTER_MEDIAN_LEN_GAS1; - data_filter[0].median_buff = median_gas1; - data_filter[0].window_len = FILTER_WINDOW_LEN_GAS1; - data_filter[0].window_buff = window_gas1; data_filter[1].sum_len = FILTER_SUM_LEN_GAS2; data_filter[1].sum_buff = sum_gas2; - data_filter[1].median_len = FILTER_MEDIAN_LEN_GAS2; - data_filter[1].median_buff = median_gas2; - data_filter[1].window_len = FILTER_WINDOW_LEN_GAS2; - data_filter[1].window_buff = window_gas2; data_filter[2].sum_len = FILTER_SUM_LEN_GAS3; data_filter[2].sum_buff = sum_gas3; - data_filter[2].median_len = FILTER_MEDIAN_LEN_GAS3; - data_filter[2].median_buff = median_gas3; - data_filter[2].window_len = FILTER_WINDOW_LEN_GAS3; - data_filter[2].window_buff = window_gas3; data_filter[3].sum_len = FILTER_SUM_LEN_GAS4; data_filter[3].sum_buff = sum_gas4; - data_filter[3].median_len = FILTER_MEDIAN_LEN_GAS4; - data_filter[3].median_buff = median_gas4; - data_filter[3].window_len = FILTER_WINDOW_LEN_GAS4; - data_filter[3].window_buff = window_gas4; + + /* get data_filter length init parameters */ + for (uint8_t i = 0; i < 4; i++) { + data_filter[i].median_len = bitmap_main->filter_median[i]; + data_filter[i].window_len = bitmap_main->filter_window[i]; + } + /* check whether pool is enough */ + length = 0; + for (uint8_t i = 0; i < 4; i++) { + if (data_gas_info.id[i] == GAS_ID_INVALID) { + continue; + } else { + data_filter[i].median_buff = (struct list_s *)(filter_pool + length); + length += (data_filter[i].median_len * sizeof(struct list_s)); + data_filter[i].window_buff = (uint32_t *)(filter_pool + length); + length += (data_filter[i].window_len * sizeof(uint32_t)); + } + } + /* use default length para when para is too big */ + if (length > sizeof(filter_pool)) { + length = 0; + for (uint8_t i = 0; i < 4; i++) { + data_filter[i].median_buff = (struct list_s *)(filter_pool + length); + data_filter[i].median_len = median_length[i]; + length += (data_filter[i].median_len * sizeof(struct list_s)); + data_filter[i].window_buff = (uint32_t *)(filter_pool + length); + data_filter[i].window_len = window_length[i]; + length += (data_filter[i].window_len * sizeof(uint32_t)); + } + } for (uint8_t i = 0; i < 4; i++) { uint16_t len; @@ -88,7 +100,7 @@ void filter_init(void) data_filter[i].window_sum = 0; data_filter[i].window_idx = 0; } - flag.filter_climb = FILTER_WINDOW_LEN_GAS1 + FILTER_MEDIAN_LEN_GAS1; + flag.filter_climb = data_filter[0].median_len + data_filter[0].window_len; } void filter_input_data(uint8_t channel, uint32_t data) @@ -125,6 +137,9 @@ void filter_median_process(void) uint16_t idx, len; for (uint8_t i = 0; i < 4; i++) { + if (data_gas_info.id[i] == GAS_ID_INVALID) { + continue; + } idx = data_filter[i].median_idx; list = &(data_filter[i].median_buff[idx]); /* delete old node */ @@ -170,6 +185,9 @@ void filter_window_process(void) uint16_t idx; for (uint8_t i = 0; i < 4; i++) { + if (data_gas_info.id[i] == GAS_ID_INVALID) { + continue; + } idx = data_filter[i].window_idx; sum = data_filter[i].window_sum; val = data_filter[i].median_output; @@ -258,7 +276,7 @@ void filter_output_process(void) filter_sum_process(); filter_median_process(); filter_window_process(); - filter_output_process(); + flag.filter_climb--; } } if (flag.filter_climb == 0) { diff --git a/lark1fq/src/filter.h b/lark1fq/src/filter.h index 73dad17..3ef3541 100755 --- a/lark1fq/src/filter.h +++ b/lark1fq/src/filter.h @@ -12,16 +12,6 @@ #define FILTER_SUM_LEN_GAS3 (8 * 2) #define FILTER_SUM_LEN_GAS4 (8 * 2) -#define FILTER_MEDIAN_LEN_GAS1 (128) -#define FILTER_MEDIAN_LEN_GAS2 (64) -#define FILTER_MEDIAN_LEN_GAS3 (64) -#define FILTER_MEDIAN_LEN_GAS4 (64) - -#define FILTER_WINDOW_LEN_GAS1 (256) -#define FILTER_WINDOW_LEN_GAS2 (32) -#define FILTER_WINDOW_LEN_GAS3 (32) -#define FILTER_WINDOW_LEN_GAS4 (32) - struct list_s { struct list_s *prev; struct list_s *next;