@@ -539,6 +539,12 @@ export function HeaderDialog(dialog, onSave) {
539539 name : "gyro_to_use" ,
540540 type : FIRMWARE_TYPE_BETAFLIGHT ,
541541 min : "4.3.0" ,
542+ max : "4.5.9" ,
543+ } ,
544+ {
545+ name : "gyro_enabled_bitmask" ,
546+ type : FIRMWARE_TYPE_BETAFLIGHT ,
547+ min : "2025.12.0" ,
542548 max : "9999.9.9" ,
543549 } ,
544550 {
@@ -867,6 +873,34 @@ export function HeaderDialog(dialog, onSave) {
867873 } else {
868874 parameterElem . addClass ( "missing" ) ;
869875 }
876+ parameterElem . css (
877+ "display" ,
878+ isParameterValid ( name ) ? "table-cell" : "none" ,
879+ ) ;
880+ }
881+
882+ function setBitmaskParameter ( name , data , totalBits = 8 ) {
883+ let parameterElem = $ ( `.parameter td[name="${ name } "]` ) ;
884+ let nameElem = $ ( "input" , parameterElem ) ;
885+ if ( data == null ) {
886+ // Clear all bitmask state when data is null
887+ nameElem . val ( "" ) ; // Clear the input value
888+ nameElem . removeData ( "raw-value" ) ; // Remove stored raw value
889+ nameElem . prop ( "readonly" , false ) ; // Make input editable again
890+ parameterElem . removeAttr ( "title" ) ; // Clear tooltip
891+ parameterElem . addClass ( "missing" ) ;
892+ } else {
893+ // Convert number to binary string with leading zeros
894+ const binaryString = data . toString ( 2 ) . padStart ( totalBits , '0' ) ;
895+ // Display as "3 (00000011)" format
896+ const displayValue = `${ data } (${ binaryString } )` ;
897+ nameElem . val ( displayValue ) ;
898+ // Store the raw integer value for round-trip saving
899+ nameElem . data ( "raw-value" , data ) ;
900+ nameElem . attr ( "readonly" , true ) ; // Make it readonly since it shows formatted bitmask
901+ parameterElem . attr ( "title" , `Bitmask value: ${ data } (binary: ${ binaryString } )` ) ;
902+ parameterElem . removeClass ( "missing" ) ;
903+ }
870904 parameterElem . css (
871905 "display" ,
872906 isParameterValid ( name ) ? "table-cell" : "none"
@@ -1363,9 +1397,9 @@ export function HeaderDialog(dialog, onSave) {
13631397
13641398 let PID_CONTROLLER_TYPE = [ ] ;
13651399 if (
1366- ( sysConfig . firmware >= 3.0 &&
1400+ ( sysConfig . firmware >= 3 &&
13671401 sysConfig . firmwareType == FIRMWARE_TYPE_BETAFLIGHT ) ||
1368- ( sysConfig . firmware >= 2.0 &&
1402+ ( sysConfig . firmware >= 2 &&
13691403 sysConfig . firmwareType == FIRMWARE_TYPE_CLEANFLIGHT )
13701404 ) {
13711405 PID_CONTROLLER_TYPE = [ "LEGACY" , "BETAFLIGHT" ] ;
@@ -1713,8 +1747,7 @@ export function HeaderDialog(dialog, onSave) {
17131747 if ( semver . lt ( activeSysConfig . firmwareVersion , "2025.12.0" ) ) {
17141748 const derivativeColumn = document . getElementById ( "derivativeColumn" ) ;
17151749 const dMaxColumn = document . getElementById ( "dMaxColumn" ) ;
1716- const parent = derivativeColumn . parentNode ;
1717- parent . insertBefore ( dMaxColumn , derivativeColumn ) ; // Меняем местами
1750+ derivativeColumn . before ( dMaxColumn ) ; // Меняем местами
17181751 }
17191752 } else {
17201753 $ ( "#d_max" ) . hide ( ) ;
@@ -1938,6 +1971,7 @@ export function HeaderDialog(dialog, onSave) {
19381971 renderSelect ( "baro_hardware" , sysConfig . baro_hardware , BARO_HARDWARE ) ;
19391972 renderSelect ( "mag_hardware" , sysConfig . mag_hardware , MAG_HARDWARE ) ;
19401973 renderSelect ( "gyro_to_use" , sysConfig . gyro_to_use , GYRO_TO_USE ) ;
1974+ setBitmaskParameter ( "gyro_enabled_bitmask" , sysConfig . gyro_enabled_bitmask , 8 ) ;
19411975 setParameter ( "motor_poles" , sysConfig . motor_poles , 0 ) ;
19421976
19431977 /* Booleans */
@@ -1998,6 +2032,9 @@ export function HeaderDialog(dialog, onSave) {
19982032 if ( $ ( this ) . attr ( "decPl" ) != null ) {
19992033 newArray [ matches [ 2 ] ] =
20002034 parseFloat ( $ ( this ) . val ( ) ) * Math . pow ( 10 , $ ( this ) . attr ( "decPl" ) ) ;
2035+ } else if ( $ ( this ) . data ( "raw-value" ) != null ) {
2036+ // Use raw value for bitmask parameters
2037+ newArray [ matches [ 2 ] ] = $ ( this ) . data ( "raw-value" ) ;
20012038 } else {
20022039 newArray [ matches [ 2 ] ] = $ ( this ) . val ( ) == "on" ? 1 : 0 ;
20032040 }
@@ -2006,6 +2043,9 @@ export function HeaderDialog(dialog, onSave) {
20062043 if ( $ ( this ) . attr ( "decPl" ) != null ) {
20072044 newSysConfig [ $ ( this ) . attr ( "name" ) ] =
20082045 parseFloat ( $ ( this ) . val ( ) ) * Math . pow ( 10 , $ ( this ) . attr ( "decPl" ) ) ;
2046+ } else if ( $ ( this ) . data ( "raw-value" ) != null ) {
2047+ // Use raw value for bitmask parameters
2048+ newSysConfig [ $ ( this ) . attr ( "name" ) ] = $ ( this ) . data ( "raw-value" ) ;
20092049 } else {
20102050 newSysConfig [ $ ( this ) . attr ( "name" ) ] = $ ( this ) . val ( ) == "on" ? 1 : 0 ;
20112051 }
0 commit comments