Only update a filter if something has changed.

This commit is contained in:
George Norton 2023-06-19 23:52:40 +01:00
parent 04fa7fc89b
commit d4db7d278b
2 changed files with 16 additions and 18 deletions

View File

@ -148,6 +148,7 @@ void apply_filter_configuration(filter_configuration_tlv *filters) {
// so try to preserve our remembered values.
// If a filter type changes, we do a memory reset.
static uint8_t bqf_filter_types[MAX_FILTER_STAGES] = { };
static uint32_t bqf_filter_checksum[MAX_FILTER_STAGES] = { };
if (type != bqf_filter_types[filter_stages]) {
bqf_filter_types[filter_stages] = type;
type_changed = true;
@ -502,19 +503,8 @@ void config_in_packet(struct usb_endpoint *ep) {
usb_packet_done(ep);
}
void configuration_ep_on_stall_change(struct usb_endpoint *ep) {
printf("Config EP stall change: %d\n", usb_is_endpoint_stalled(ep));
if (!usb_is_endpoint_stalled(ep)) {
write_offset = 0;
tlv_header* request = ((tlv_header*) working_configuration[inactive_working_configuration]);
request->type = NOK;
request->length = 0;
}
}
void configuration_ep_on_cancel(struct usb_endpoint *ep) {
printf("Config EP on cancel\n");
printf("Cancel request on config EP\n");
write_offset = 0;
tlv_header* request = ((tlv_header*) working_configuration[inactive_working_configuration]);
request->type = NOK;
@ -523,11 +513,9 @@ void configuration_ep_on_cancel(struct usb_endpoint *ep) {
void apply_config_changes() {
if (reload_config) {
//uint32_t ints = save_and_disable_interrupts();
reload_config = false;
const uint8_t active_configuration = inactive_working_configuration ? 0 : 1;
apply_configuration((tlv_header*) working_configuration[active_configuration]);
//restore_interrupts(ints);
}
}
#endif

View File

@ -24,16 +24,26 @@ struct usb_endpoint;
#define INIT_FILTER2(T) { \
filter2 *args = (filter2 *)ptr; \
bqf_##T##_config(SAMPLING_FREQ, args->f0, args->Q, &bqf_filters_left[filter_stages]); \
memcpy(&bqf_filters_right[filter_stages], &bqf_filters_left[filter_stages], sizeof(bqf_coeff_t)); \
uint32_t checksum = 0; \
for (int i = 0; i < sizeof(filter2) / 4; i++) checksum ^= ((uint32_t*) args)[i]; \
if (checksum != bqf_filter_checksum[filter_stages]) { \
bqf_##T##_config(SAMPLING_FREQ, args->f0, args->Q, &bqf_filters_left[filter_stages]); \
memcpy(&bqf_filters_right[filter_stages], &bqf_filters_left[filter_stages], sizeof(bqf_coeff_t)); \
bqf_filter_checksum[filter_stages] = checksum; \
} \
ptr += sizeof(filter2); \
break; \
}
#define INIT_FILTER3(T) { \
filter3 *args = (filter3 *)ptr; \
bqf_##T##_config(SAMPLING_FREQ, args->f0, args->db_gain, args->Q, &bqf_filters_left[filter_stages]); \
memcpy(&bqf_filters_right[filter_stages], &bqf_filters_left[filter_stages], sizeof(bqf_coeff_t)); \
uint32_t checksum = 0; \
for (int i = 0; i < sizeof(filter3) / 4; i++) checksum ^= ((uint32_t*) args)[i]; \
if (checksum != bqf_filter_checksum[filter_stages]) { \
bqf_##T##_config(SAMPLING_FREQ, args->f0, args->db_gain, args->Q, &bqf_filters_left[filter_stages]); \
memcpy(&bqf_filters_right[filter_stages], &bqf_filters_left[filter_stages], sizeof(bqf_coeff_t)); \
bqf_filter_checksum[filter_stages] = checksum; \
} \
ptr += sizeof(filter3); \
break; \
}