[feat] add filter setting by user bitmap
This commit is contained in:
parent
6b3dd86de5
commit
bfbbf28024
@ -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;
|
||||||
};
|
};
|
||||||
|
|||||||
@ -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) {
|
||||||
|
|||||||
@ -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;
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user