@@ -377,51 +377,75 @@ TABS.pid_tuning.initialize = function (callback) {
377377 }
378378
379379 if ( semver . gte ( FC . CONFIG . apiVersion , API_VERSION_1_42 ) ) {
380- const dynamicNotchWidthPercent_e = $ ( '.pid_filter input[name="dynamicNotchWidthPercent"]' ) ;
381- const dynamicNotchQ_e = $ ( '.pid_filter input[name="dynamicNotchQ"]' ) ;
382- const dynamicNotchCount_e = $ ( '.pid_filter input[name="dynamicNotchCount"]' ) ;
383380
384381 $ ( '.smartfeedforward' ) . hide ( ) ;
385382
386- if ( FC . FEATURE_CONFIG . features . isEnabled ( 'DYNAMIC_FILTER' ) ) {
387- $ ( '.dynamicNotch' ) . show ( ) ;
388- } else {
389- $ ( '.dynamicNotch' ) . hide ( ) ;
383+ // Dynamic Notch Filter
384+ if ( semver . lt ( FC . CONFIG . apiVersion , API_VERSION_1_44 ) ) {
385+ $ ( '.dynamicNotch span.inputSwitch' ) . hide ( ) ;
386+ if ( ! FC . FEATURE_CONFIG . features . isEnabled ( 'DYNAMIC_FILTER' ) ) {
387+ $ ( '.dynamicNotch' ) . hide ( ) ;
388+ }
390389 }
391- $ ( '.dynamicNotchRange' ) . toggle ( semver . lt ( FC . CONFIG . apiVersion , API_VERSION_1_43 ) ) ;
392- $ ( '.pid_filter select[name="dynamicNotchRange"]' ) . val ( FC . FILTER_CONFIG . dyn_notch_range ) ;
390+
391+ const dynamicNotchRange_e = $ ( '.pid_filter select[name="dynamicNotchRange"]' ) ;
392+ const dynamicNotchWidthPercent_e = $ ( '.pid_filter input[name="dynamicNotchWidthPercent"]' ) ;
393+ const dynamicNotchQ_e = $ ( '.pid_filter input[name="dynamicNotchQ"]' ) ;
394+ const dynamicNotchCount_e = $ ( '.pid_filter input[name="dynamicNotchCount"]' ) ;
395+ const dynamicNotchMinHz_e = $ ( '.pid_filter input[name="dynamicNotchMinHz"]' ) ;
396+ const dynamicNotchMaxHz_e = $ ( '.pid_filter input[name="dynamicNotchMaxHz"]' ) ;
397+
398+ dynamicNotchRange_e . val ( FC . FILTER_CONFIG . dyn_notch_range ) ;
393399 dynamicNotchWidthPercent_e . val ( FC . FILTER_CONFIG . dyn_notch_width_percent ) ;
394400 dynamicNotchQ_e . val ( FC . FILTER_CONFIG . dyn_notch_q ) ;
395401 dynamicNotchCount_e . val ( FC . FILTER_CONFIG . dyn_notch_count ) ;
396- $ ( '.pid_filter input[name="dynamicNotchMinHz"]' ) . val ( FC . FILTER_CONFIG . dyn_notch_min_hz ) ;
402+ dynamicNotchMinHz_e . val ( FC . FILTER_CONFIG . dyn_notch_min_hz ) ;
403+
397404 if ( semver . gte ( FC . CONFIG . apiVersion , API_VERSION_1_43 ) ) {
398- $ ( '.pid_filter input[name="dynamicNotchMinHz"]' ) . attr ( "max" , "250" ) ;
399- $ ( '.pid_filter input[name="dynamicNotchMaxHz"]' ) . val ( FC . FILTER_CONFIG . dyn_notch_max_hz ) ;
405+ dynamicNotchMinHz_e . attr ( "max" , "250" ) ;
406+ dynamicNotchMaxHz_e . val ( FC . FILTER_CONFIG . dyn_notch_max_hz ) ;
400407 } else {
401408 $ ( '.dynamicNotchMaxHz' ) . hide ( ) ;
402409 }
403- if ( semver . gte ( FC . CONFIG . apiVersion , API_VERSION_1_44 ) ) {
404- $ ( '.dynamicNotchHelp' ) . attr ( 'title' , i18n . getMessage ( 'pidTuningMultiDynamicNotchFilterHelp' ) ) ;
405- $ ( '.dynamicNotchWidthPercent' ) . hide ( ) ;
406- } else {
407- $ ( '.dynamicNotchCount' ) . hide ( ) ;
408- }
409410
411+ const dynamicNotchSwitch_e = $ ( '.pid_filter input[id="dynamicNotchEnabled"]' ) ;
412+
413+ dynamicNotchSwitch_e . on ( 'change' , function ( ) {
414+
415+ const checked = $ ( this ) . is ( ':checked' ) ;
416+ const count = parseInt ( dynamicNotchCount_e . val ( ) ) ;
417+
418+ if ( checked && ! count ) {
419+ dynamicNotchCount_e . val ( FILTER_DEFAULT . dyn_notch_count ) ;
420+ }
421+
422+ $ ( '.dynamicNotch span.suboption' ) . toggle ( checked ) ;
423+ $ ( '.dynamicNotchRange' ) . toggle ( semver . lt ( FC . CONFIG . apiVersion , API_VERSION_1_43 ) && checked ) ;
424+ $ ( '.dynamicNotchMaxHz' ) . toggle ( semver . gte ( FC . CONFIG . apiVersion , API_VERSION_1_43 ) && checked ) ;
425+ $ ( '.dynamicNotchWidthPercent' ) . toggle ( semver . lt ( FC . CONFIG . apiVersion , API_VERSION_1_44 ) && checked ) ;
426+ $ ( '.dynamicNotchCount' ) . toggle ( semver . gte ( FC . CONFIG . apiVersion , API_VERSION_1_44 ) && checked ) ;
427+
428+ } ) . prop ( 'checked' , FC . FILTER_CONFIG . dyn_notch_count !== 0 || FC . FEATURE_CONFIG . features . isEnabled ( 'DYNAMIC_FILTER' ) ) . trigger ( 'change' ) ;
429+
430+ // RPM Filter
410431 $ ( '.rpmFilter' ) . toggle ( FC . MOTOR_CONFIG . use_dshot_telemetry ) ;
411432
412- $ ( '.pid_filter input[name="rpmFilterHarmonics"]' ) . val ( FC . FILTER_CONFIG . gyro_rpm_notch_harmonics ) ;
413- $ ( '.pid_filter input[name="rpmFilterMinHz"]' ) . val ( FC . FILTER_CONFIG . gyro_rpm_notch_min_hz ) ;
433+ const rpmFilterHarmonics_e = $ ( '.pid_filter input[name="rpmFilterHarmonics"]' ) ;
434+ const rpmFilterMinHz_e = $ ( '.pid_filter input[name="rpmFilterMinHz"]' ) ;
435+
436+ rpmFilterHarmonics_e . val ( FC . FILTER_CONFIG . gyro_rpm_notch_harmonics ) ;
437+ rpmFilterMinHz_e . val ( FC . FILTER_CONFIG . gyro_rpm_notch_min_hz ) ;
414438
415439 $ ( '.pid_filter #rpmFilterEnabled' ) . change ( function ( ) {
416440
417- let harmonics = $ ( '.pid_filter input[name="rpmFilterHarmonics"]' ) . val ( ) ;
441+ let harmonics = rpmFilterHarmonics_e . val ( ) ;
418442 let checked = $ ( this ) . is ( ':checked' ) && harmonics != 0 ;
419443
420- $ ( '.pid_filter input[name="rpmFilterHarmonics"]' ) . attr ( 'disabled' , ! checked ) ;
421- $ ( '.pid_filter input[name="rpmFilterMinHz"]' ) . attr ( 'disabled' , ! checked ) ;
444+ rpmFilterHarmonics_e . attr ( 'disabled' , ! checked ) ;
445+ rpmFilterMinHz_e . attr ( 'disabled' , ! checked ) ;
422446
423447 if ( harmonics == 0 ) {
424- $ ( '.pid_filter input[name="rpmFilterHarmonics"]' ) . val ( FILTER_DEFAULT . gyro_rpm_notch_harmonics ) ;
448+ rpmFilterHarmonics_e . val ( FILTER_DEFAULT . gyro_rpm_notch_harmonics ) ;
425449 }
426450
427451 if ( checked !== ( FC . FILTER_CONFIG . gyro_rpm_notch_harmonics !== 0 ) ) { // if rpmFilterEnabled is not the same value as saved in the fc
@@ -1350,7 +1374,9 @@ TABS.pid_tuning.initialize = function (callback) {
13501374 FC . ADVANCED_TUNING . vbat_sag_compensation = $ ( 'input[id="vbatSagCompensation"]' ) . is ( ':checked' ) ? parseInt ( $ ( 'input[name="vbatSagValue"]' ) . val ( ) ) : 0 ;
13511375 FC . ADVANCED_TUNING . thrustLinearization = $ ( 'input[id="thrustLinearization"]' ) . is ( ':checked' ) ? parseInt ( $ ( 'input[name="thrustLinearValue"]' ) . val ( ) ) : 0 ;
13521376 FC . FILTER_CONFIG . dyn_lpf_curve_expo = parseInt ( $ ( '.pid_filter input[name="dtermLowpassExpo"]' ) . val ( ) ) ;
1353- FC . FILTER_CONFIG . dyn_notch_count = parseInt ( $ ( '.pid_filter input[name="dynamicNotchCount"]' ) . val ( ) ) ;
1377+
1378+ let dynamicNotchEnabled = $ ( '.pid_filter input[id="dynamicNotchEnabled"]' ) . is ( ':checked' ) ;
1379+ FC . FILTER_CONFIG . dyn_notch_count = dynamicNotchEnabled ? parseInt ( $ ( '.pid_filter input[name="dynamicNotchCount"]' ) . val ( ) ) : 0 ;
13541380
13551381 FC . TUNING_SLIDERS . slider_pids_mode = TuningSliders . sliderPidsMode ;
13561382 //round slider values to nearest multiple of 5 and passes to the FW. Avoid dividing calc by (* x 100)/5 = 20
@@ -3066,7 +3092,7 @@ TABS.pid_tuning.updateFilterWarning = function() {
30663092 } else {
30673093 warningE . hide ( ) ;
30683094 }
3069- if ( semver . gte ( FC . CONFIG . apiVersion , API_VERSION_1_42 ) ) {
3095+ if ( semver . gte ( FC . CONFIG . apiVersion , API_VERSION_1_42 ) && semver . lt ( FC . CONFIG . apiVersion , API_VERSION_1_44 ) ) {
30703096 if ( FC . FEATURE_CONFIG . features . isEnabled ( 'DYNAMIC_FILTER' ) ) {
30713097 warningDynamicNotchE . hide ( ) ;
30723098 } else {
@@ -3331,7 +3357,6 @@ TABS.pid_tuning.changeRatesTypeLogo = function() {
33313357 }
33323358} ;
33333359
3334-
33353360TABS . pid_tuning . expertModeChanged = function ( expertModeEnabled ) {
33363361 TuningSliders . setExpertMode ( expertModeEnabled ) ;
33373362} ;
0 commit comments