Skip to content

Commit 4f60b5e

Browse files
authored
Replace gyro_to_use with gyro_enabled_bitmask in header dialog (#862)
* Add gyro_enabled_bitmask to header dialog * CR review * CR review II * Review sonar
1 parent 334ae08 commit 4f60b5e

File tree

3 files changed

+65
-21
lines changed

3 files changed

+65
-21
lines changed

index.html

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -778,7 +778,7 @@ <h5 class="modal-title-revision"></h5>
778778
const axes = ['Roll', 'Pitch', 'Yaw'];
779779
const pidTbody = document.getElementById('pid_tbody');
780780

781-
axes.forEach(axis => {
781+
for (const axis of axes) {
782782
const row = `<tr class="${axis.toLowerCase()}PID">
783783
<td>${axis}</td>
784784
<td><input type="text" name="p" step="1" min="0" max="255" /></td>
@@ -788,7 +788,7 @@ <h5 class="modal-title-revision"></h5>
788788
<td><input type="text" name="f" step="1" min="0" max="255" /></td>
789789
</tr>`;
790790
pidTbody.innerHTML += row;
791-
});
791+
}
792792
</script>
793793

794794
<table id="pid_baro_header" class="parameter cf">
@@ -1516,7 +1516,11 @@ <h5 class="modal-title-revision"></h5>
15161516
<!-- list generated here -->
15171517
</select>
15181518
</td>
1519-
<td name='gyro_hardware_lpf'>
1519+
<td name='gyro_enabled_bitmask'>
1520+
<label>Gyro enable mask</label>
1521+
<input type="text" step="1" min="1" max="255" />
1522+
</td>
1523+
<td name='gyro_hardware_lpf'>
15201524
<label>Hardware gyro LPF</label>
15211525
<select>
15221526
<!-- list generated here -->

src/flightlog_parser.js

Lines changed: 14 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -299,6 +299,7 @@ export function FlightLogParser(logData) {
299299
fields_disabled_mask: null,
300300
vbat_sag_compensation: null,
301301
gyro_to_use: null,
302+
gyro_enabled_bitmask: null,
302303
dynamic_idle_min_rpm: null,
303304
motor_poles: 1,
304305
ff_transition: null,
@@ -532,7 +533,7 @@ export function FlightLogParser(logData) {
532533
*/
533534
function translateFieldName(fieldName) {
534535
let translation = translationValues[fieldName];
535-
if (typeof translation !== "undefined") {
536+
if (translation !== undefined) {
536537
return translation;
537538
} else {
538539
return fieldName;
@@ -743,6 +744,7 @@ export function FlightLogParser(logData) {
743744
case "fields_disabled_mask":
744745
case "motor_pwm_protocol":
745746
case "gyro_to_use":
747+
case "gyro_enabled_bitmask":
746748
case "dynamic_idle_min_rpm":
747749
case "dyn_idle_p_gain":
748750
case "dyn_idle_i_gain":
@@ -821,7 +823,7 @@ export function FlightLogParser(logData) {
821823
) {
822824
that.sysConfig[fieldName] = parseInt(fieldValue, 10);
823825
} else {
824-
that.sysConfig[fieldName] = parseInt(fieldValue, 10) / 100.0;
826+
that.sysConfig[fieldName] = parseInt(fieldValue, 10) / 100;
825827
}
826828
break;
827829

@@ -835,13 +837,13 @@ export function FlightLogParser(logData) {
835837
) {
836838
that.sysConfig[fieldName] = parseCommaSeparatedString(fieldValue);
837839
} else {
838-
that.sysConfig[fieldName] = parseInt(fieldValue, 10) / 100.0;
840+
that.sysConfig[fieldName] = parseInt(fieldValue, 10) / 100;
839841
}
840842
break;
841843

842844
case "motor_idle":
843845
case "digitalIdleOffset":
844-
that.sysConfig[fieldName] = parseInt(fieldValue, 10) / 100.0;
846+
that.sysConfig[fieldName] = parseInt(fieldValue, 10) / 100;
845847

846848
/** Cleanflight Only log headers **/
847849
case "dterm_cut_hz":
@@ -982,7 +984,7 @@ export function FlightLogParser(logData) {
982984
} else {
983985
// Cleanflight 1.x and others
984986
that.sysConfig.firmwareVersion = "0.0.0";
985-
that.sysConfig.firmware = 0.0;
987+
that.sysConfig.firmware = 0;
986988
that.sysConfig.firmwarePatch = 0;
987989
}
988990
}
@@ -1083,10 +1085,8 @@ export function FlightLogParser(logData) {
10831085
min: frame[i],
10841086
};
10851087
} else {
1086-
fieldStats[i].max =
1087-
frame[i] > fieldStats[i].max ? frame[i] : fieldStats[i].max;
1088-
fieldStats[i].min =
1089-
frame[i] < fieldStats[i].min ? frame[i] : fieldStats[i].min;
1088+
fieldStats[i].max = Math.max(frame[i], fieldStats[i].max);
1089+
fieldStats[i].min = Math.min(frame[i], fieldStats[i].min);
10901090
}
10911091
}
10921092
}
@@ -1444,7 +1444,7 @@ export function FlightLogParser(logData) {
14441444
* save space for positive values). So we need to convert those very large unsigned values into their
14451445
* corresponding 32-bit signed values.
14461446
*/
1447-
value = (value | 0) + that.sysConfig.minthrottle;
1447+
value = Math.trunc(value) + that.sysConfig.minthrottle;
14481448
break;
14491449
case FLIGHT_LOG_FIELD_PREDICTOR_MINMOTOR:
14501450
/*
@@ -1453,7 +1453,7 @@ export function FlightLogParser(logData) {
14531453
* save space for positive values). So we need to convert those very large unsigned values into their
14541454
* corresponding 32-bit signed values.
14551455
*/
1456-
value = (value | 0) + (that.sysConfig.motorOutput[0] | 0); // motorOutput[0] is the min motor output
1456+
value = Math.trunc(value) + Math.trunc(that.sysConfig.motorOutput[0]); // motorOutput[0] is the min motor output
14571457
break;
14581458
case FLIGHT_LOG_FIELD_PREDICTOR_1500:
14591459
value += 1500;
@@ -1673,13 +1673,13 @@ export function FlightLogParser(logData) {
16731673
break;
16741674
case FlightLogEvent.AUTOTUNE_TARGETS:
16751675
//Convert the angles from decidegrees back to plain old degrees for ease of use
1676-
lastEvent.data.currentAngle = stream.readS16() / 10.0;
1676+
lastEvent.data.currentAngle = stream.readS16() / 10;
16771677

16781678
lastEvent.data.targetAngle = stream.readS8();
16791679
lastEvent.data.targetAngleAtPeak = stream.readS8();
16801680

1681-
lastEvent.data.firstPeakAngle = stream.readS16() / 10.0;
1682-
lastEvent.data.secondPeakAngle = stream.readS16() / 10.0;
1681+
lastEvent.data.firstPeakAngle = stream.readS16() / 10;
1682+
lastEvent.data.secondPeakAngle = stream.readS16() / 10;
16831683
break;
16841684
case FlightLogEvent.GTUNE_CYCLE_RESULT:
16851685
lastEvent.data.axis = stream.readU8();

src/header_dialog.js

Lines changed: 44 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -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

Comments
 (0)