diff --git a/firmware/code/configuration_manager.c b/firmware/code/configuration_manager.c index 0a3e7e1..d591168 100644 --- a/firmware/code/configuration_manager.c +++ b/firmware/code/configuration_manager.c @@ -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 \ No newline at end of file diff --git a/firmware/code/configuration_manager.h b/firmware/code/configuration_manager.h index 70e32d5..2ff115c 100644 --- a/firmware/code/configuration_manager.h +++ b/firmware/code/configuration_manager.h @@ -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; \ }