[feat] add filter setting by user bitmap
This commit is contained in:
parent
2163ed9417
commit
2da2f32136
@ -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;
|
||||
};
|
||||
|
||||
@ -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;
|
||||
|
||||
@ -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;
|
||||
|
||||
Loading…
Reference in New Issue
Block a user