[feat] add filter setting by user bitmap

This commit is contained in:
zhji 2024-12-29 20:42:49 +08:00
parent 2163ed9417
commit 2da2f32136
3 changed files with 48 additions and 42 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

@ -6,36 +6,45 @@
#include "cli.h" #include "cli.h"
#include "user_misc.h" #include "user_misc.h"
static struct list_s median_gas1[FILTER_MEDIAN_LEN_GAS1] __attribute__((section(".bss_ccm"))); static uint8_t filter_pool[32 * 1024] __attribute__((section(".bss_ccm"))) __attribute__((aligned(4)));
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")));
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)
{ {
/* data_filter parameter init */ uint32_t length;
data_filter[0].median_len = FILTER_MEDIAN_LEN_GAS1;
data_filter[0].median_buff = median_gas1; /* get data_filter length init parameters */
data_filter[0].window_len = FILTER_WINDOW_LEN_GAS1; for (uint8_t i = 0; i < 4; i++) {
data_filter[0].window_buff = window_gas1; data_filter[i].median_len = bitmap_main->filter_median[i];
data_filter[1].median_len = FILTER_MEDIAN_LEN_GAS2; data_filter[i].window_len = bitmap_main->filter_window[i];
data_filter[1].median_buff = median_gas2; }
data_filter[1].window_len = FILTER_WINDOW_LEN_GAS2; /* check whether pool is enough */
data_filter[1].window_buff = window_gas2; length = 0;
data_filter[2].median_len = FILTER_MEDIAN_LEN_GAS3; for (uint8_t i = 0; i < 4; i++) {
data_filter[2].median_buff = median_gas3; if (data_gas_info.id[i] == GAS_ID_INVALID) {
data_filter[2].window_len = FILTER_WINDOW_LEN_GAS3; continue;
data_filter[2].window_buff = window_gas3; } else {
data_filter[3].median_len = FILTER_MEDIAN_LEN_GAS4; data_filter[i].median_buff = (struct list_s *)(filter_pool + length);
data_filter[3].median_buff = median_gas4; length += (data_filter[i].median_len * sizeof(struct list_s));
data_filter[3].window_len = FILTER_WINDOW_LEN_GAS4; data_filter[i].window_buff = (uint32_t *)(filter_pool + length);
data_filter[3].window_buff = window_gas4; 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;
@ -70,7 +79,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_quadratic_process(void) void filter_quadratic_process(void)
@ -83,6 +92,9 @@ void filter_quadratic_process(void)
position = (data_ltc1867.sample_total - CALC_POINTS) / 2; position = (data_ltc1867.sample_total - CALC_POINTS) / 2;
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;
}
calc_quadratic_fit(data_ltc1867.p_calc[i] + position, &coeff, CALC_POINTS); calc_quadratic_fit(data_ltc1867.p_calc[i] + position, &coeff, CALC_POINTS);
result_fit = coeff.c - coeff.b * coeff.b / (4.0f * coeff.a); result_fit = coeff.c - coeff.b * coeff.b / (4.0f * coeff.a);
if (result_fit > 32768.0f && result_fit < 65536.0f) { if (result_fit > 32768.0f && result_fit < 65536.0f) {
@ -114,6 +126,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 */
@ -159,6 +174,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;

View File

@ -7,16 +7,6 @@
#include "stm32f4xx.h" #include "stm32f4xx.h"
#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;