[feat] add filter setting by user bitmap

This commit is contained in:
zhji 2024-12-29 20:42:49 +08:00
parent 6b3dd86de5
commit bfbbf28024
3 changed files with 47 additions and 41 deletions

View File

@ -39,12 +39,10 @@ struct bitmap_main_s {
uint32_t gas4_unit_code; uint32_t gas4_unit_code;
uint8_t gas4_unit_name[8]; uint8_t gas4_unit_name[8];
uint32_t ch1_filter_length; uint32_t filter_median[4];
uint32_t ch2_filter_length; uint32_t filter_window[4];
uint32_t ch3_filter_length;
uint32_t ch4_filter_length;
uint8_t res[204]; uint8_t res[188];
uint32_t checksum; uint32_t checksum;
uint32_t gasn_avail_bitmap; uint32_t gasn_avail_bitmap;
}; };

View File

@ -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_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_gas3[FILTER_SUM_LEN_GAS3] __attribute__((section(".bss_ccm")));
static uint32_t sum_gas4[FILTER_SUM_LEN_GAS4] __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"))); 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) void filter_init(void)
{ {
uint32_t length;
/* data_filter parameter init */ /* data_filter parameter init */
data_filter[0].sum_len = FILTER_SUM_LEN_GAS1; data_filter[0].sum_len = FILTER_SUM_LEN_GAS1;
data_filter[0].sum_buff = sum_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_len = FILTER_SUM_LEN_GAS2;
data_filter[1].sum_buff = sum_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_len = FILTER_SUM_LEN_GAS3;
data_filter[2].sum_buff = sum_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_len = FILTER_SUM_LEN_GAS4;
data_filter[3].sum_buff = sum_gas4; data_filter[3].sum_buff = sum_gas4;
data_filter[3].median_len = FILTER_MEDIAN_LEN_GAS4;
data_filter[3].median_buff = median_gas4; /* get data_filter length init parameters */
data_filter[3].window_len = FILTER_WINDOW_LEN_GAS4; for (uint8_t i = 0; i < 4; i++) {
data_filter[3].window_buff = window_gas4; 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++) { for (uint8_t i = 0; i < 4; i++) {
uint16_t len; uint16_t len;
@ -88,7 +100,7 @@ void filter_init(void)
data_filter[i].window_sum = 0; data_filter[i].window_sum = 0;
data_filter[i].window_idx = 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) void filter_input_data(uint8_t channel, uint32_t data)
@ -125,6 +137,9 @@ void filter_median_process(void)
uint16_t idx, len; uint16_t idx, len;
for (uint8_t i = 0; i < 4; i++) { for (uint8_t i = 0; i < 4; i++) {
if (data_gas_info.id[i] == GAS_ID_INVALID) {
continue;
}
idx = data_filter[i].median_idx; idx = data_filter[i].median_idx;
list = &(data_filter[i].median_buff[idx]); list = &(data_filter[i].median_buff[idx]);
/* delete old node */ /* delete old node */
@ -170,6 +185,9 @@ void filter_window_process(void)
uint16_t idx; uint16_t idx;
for (uint8_t i = 0; i < 4; i++) { for (uint8_t i = 0; i < 4; i++) {
if (data_gas_info.id[i] == GAS_ID_INVALID) {
continue;
}
idx = data_filter[i].window_idx; idx = data_filter[i].window_idx;
sum = data_filter[i].window_sum; sum = data_filter[i].window_sum;
val = data_filter[i].median_output; val = data_filter[i].median_output;
@ -258,7 +276,7 @@ void filter_output_process(void)
filter_sum_process(); filter_sum_process();
filter_median_process(); filter_median_process();
filter_window_process(); filter_window_process();
filter_output_process(); flag.filter_climb--;
} }
} }
if (flag.filter_climb == 0) { if (flag.filter_climb == 0) {

View File

@ -12,16 +12,6 @@
#define FILTER_SUM_LEN_GAS3 (8 * 2) #define FILTER_SUM_LEN_GAS3 (8 * 2)
#define FILTER_SUM_LEN_GAS4 (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 {
struct list_s *prev; struct list_s *prev;
struct list_s *next; struct list_s *next;