From 65791881b638fcf7f058d8e23df4f671392d160c Mon Sep 17 00:00:00 2001 From: Mark Haslinghuis Date: Sun, 28 Sep 2025 22:51:34 +0200 Subject: [PATCH 1/4] Add gyro_enabled_bitmask to header dialog --- index.html | 6 +++++- src/flightlog_parser.js | 2 ++ src/header_dialog.js | 28 ++++++++++++++++++++++++++++ 3 files changed, 35 insertions(+), 1 deletion(-) diff --git a/index.html b/index.html index 33ccd07e..686265f1 100644 --- a/index.html +++ b/index.html @@ -1516,7 +1516,11 @@ - + + + + + @@ -788,7 +788,7 @@ `; pidTbody.innerHTML += row; - }); + } diff --git a/src/flightlog_parser.js b/src/flightlog_parser.js index 5dbcbec4..44433629 100644 --- a/src/flightlog_parser.js +++ b/src/flightlog_parser.js @@ -533,7 +533,7 @@ export function FlightLogParser(logData) { */ function translateFieldName(fieldName) { let translation = translationValues[fieldName]; - if (typeof translation !== "undefined") { + if (translation !== undefined) { return translation; } else { return fieldName; @@ -823,7 +823,7 @@ export function FlightLogParser(logData) { ) { that.sysConfig[fieldName] = parseInt(fieldValue, 10); } else { - that.sysConfig[fieldName] = parseInt(fieldValue, 10) / 100.0; + that.sysConfig[fieldName] = parseInt(fieldValue, 10) / 100; } break; @@ -837,13 +837,13 @@ export function FlightLogParser(logData) { ) { that.sysConfig[fieldName] = parseCommaSeparatedString(fieldValue); } else { - that.sysConfig[fieldName] = parseInt(fieldValue, 10) / 100.0; + that.sysConfig[fieldName] = parseInt(fieldValue, 10) / 100; } break; case "motor_idle": case "digitalIdleOffset": - that.sysConfig[fieldName] = parseInt(fieldValue, 10) / 100.0; + that.sysConfig[fieldName] = parseInt(fieldValue, 10) / 100; /** Cleanflight Only log headers **/ case "dterm_cut_hz": @@ -984,7 +984,7 @@ export function FlightLogParser(logData) { } else { // Cleanflight 1.x and others that.sysConfig.firmwareVersion = "0.0.0"; - that.sysConfig.firmware = 0.0; + that.sysConfig.firmware = 0; that.sysConfig.firmwarePatch = 0; } } @@ -1085,10 +1085,8 @@ export function FlightLogParser(logData) { min: frame[i], }; } else { - fieldStats[i].max = - frame[i] > fieldStats[i].max ? frame[i] : fieldStats[i].max; - fieldStats[i].min = - frame[i] < fieldStats[i].min ? frame[i] : fieldStats[i].min; + fieldStats[i].max = Math.max(frame[i], fieldStats[i].max); + fieldStats[i].min = Math.min(frame[i], fieldStats[i].min); } } } @@ -1446,7 +1444,7 @@ export function FlightLogParser(logData) { * save space for positive values). So we need to convert those very large unsigned values into their * corresponding 32-bit signed values. */ - value = (value | 0) + that.sysConfig.minthrottle; + value = Math.trunc(value) + that.sysConfig.minthrottle; break; case FLIGHT_LOG_FIELD_PREDICTOR_MINMOTOR: /* @@ -1455,7 +1453,7 @@ export function FlightLogParser(logData) { * save space for positive values). So we need to convert those very large unsigned values into their * corresponding 32-bit signed values. */ - value = (value | 0) + (that.sysConfig.motorOutput[0] | 0); // motorOutput[0] is the min motor output + value = Math.trunc(value) + Math.trunc(that.sysConfig.motorOutput[0]); // motorOutput[0] is the min motor output break; case FLIGHT_LOG_FIELD_PREDICTOR_1500: value += 1500; @@ -1675,13 +1673,13 @@ export function FlightLogParser(logData) { break; case FlightLogEvent.AUTOTUNE_TARGETS: //Convert the angles from decidegrees back to plain old degrees for ease of use - lastEvent.data.currentAngle = stream.readS16() / 10.0; + lastEvent.data.currentAngle = stream.readS16() / 10; lastEvent.data.targetAngle = stream.readS8(); lastEvent.data.targetAngleAtPeak = stream.readS8(); - lastEvent.data.firstPeakAngle = stream.readS16() / 10.0; - lastEvent.data.secondPeakAngle = stream.readS16() / 10.0; + lastEvent.data.firstPeakAngle = stream.readS16() / 10; + lastEvent.data.secondPeakAngle = stream.readS16() / 10; break; case FlightLogEvent.GTUNE_CYCLE_RESULT: lastEvent.data.axis = stream.readU8(); diff --git a/src/header_dialog.js b/src/header_dialog.js index dbcfc170..d43bf9e9 100644 --- a/src/header_dialog.js +++ b/src/header_dialog.js @@ -875,14 +875,21 @@ export function HeaderDialog(dialog, onSave) { } parameterElem.css( "display", - isParameterValid(name) ? "table-cell" : "none" + isParameterValid(name) ? "table-cell" : "none", ); } function setBitmaskParameter(name, data, totalBits = 8) { let parameterElem = $(`.parameter td[name="${name}"]`); let nameElem = $("input", parameterElem); - if (data != null) { + if (data == null) { + // Clear all bitmask state when data is null + nameElem.val(""); // Clear the input value + nameElem.removeData("raw-value"); // Remove stored raw value + nameElem.prop("readonly", false); // Make input editable again + parameterElem.removeAttr("title"); // Clear tooltip + parameterElem.addClass("missing"); + } else { // Convert number to binary string with leading zeros const binaryString = data.toString(2).padStart(totalBits, '0'); // Display as "3 (00000011)" format @@ -893,13 +900,6 @@ export function HeaderDialog(dialog, onSave) { nameElem.attr("readonly", true); // Make it readonly since it shows formatted bitmask parameterElem.attr("title", `Bitmask value: ${data} (binary: ${binaryString})`); parameterElem.removeClass("missing"); - } else { - // Clear all bitmask state when data is null - nameElem.val(""); // Clear the input value - nameElem.removeData("raw-value"); // Remove stored raw value - nameElem.prop("readonly", false); // Make input editable again - parameterElem.removeAttr("title"); // Clear tooltip - parameterElem.addClass("missing"); } parameterElem.css( "display", @@ -1397,9 +1397,9 @@ export function HeaderDialog(dialog, onSave) { let PID_CONTROLLER_TYPE = []; if ( - (sysConfig.firmware >= 3.0 && + (sysConfig.firmware >= 3 && sysConfig.firmwareType == FIRMWARE_TYPE_BETAFLIGHT) || - (sysConfig.firmware >= 2.0 && + (sysConfig.firmware >= 2 && sysConfig.firmwareType == FIRMWARE_TYPE_CLEANFLIGHT) ) { PID_CONTROLLER_TYPE = ["LEGACY", "BETAFLIGHT"]; @@ -1747,8 +1747,7 @@ export function HeaderDialog(dialog, onSave) { if (semver.lt(activeSysConfig.firmwareVersion, "2025.12.0")) { const derivativeColumn = document.getElementById("derivativeColumn"); const dMaxColumn = document.getElementById("dMaxColumn"); - const parent = derivativeColumn.parentNode; - parent.insertBefore(dMaxColumn, derivativeColumn); // Меняем местами + derivativeColumn.before(dMaxColumn); // Меняем местами } } else { $("#d_max").hide();