[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;
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;
};

View File

@ -6,36 +6,45 @@
#include "cli.h"
#include "user_misc.h"
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)
{
/* data_filter parameter init */
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].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].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].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;
uint32_t length;
/* 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;
@ -70,7 +79,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_quadratic_process(void)
@ -83,6 +92,9 @@ void filter_quadratic_process(void)
position = (data_ltc1867.sample_total - CALC_POINTS) / 2;
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);
result_fit = coeff.c - coeff.b * coeff.b / (4.0f * coeff.a);
if (result_fit > 32768.0f && result_fit < 65536.0f) {
@ -114,6 +126,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 */
@ -159,6 +174,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;

View File

@ -7,16 +7,6 @@
#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 *prev;
struct list_s *next;