diff --git a/js/flightlog.js b/js/flightlog.js index d435be8d..8cba5c81 100644 --- a/js/flightlog.js +++ b/js/flightlog.js @@ -1336,5 +1336,6 @@ FlightLog.prototype.isFieldDisabled = function() { DEBUG : (disabledFields & (1 << 9))!==0, MOTORS : (disabledFields & (1 << 10))!==0, GPS : (disabledFields & (1 << 11))!==0, + RPM : (disabledFields & (1 << 12))!==0, }; }; diff --git a/js/flightlog_fields_presenter.js b/js/flightlog_fields_presenter.js index 8b567435..31e816d7 100644 --- a/js/flightlog_fields_presenter.js +++ b/js/flightlog_fields_presenter.js @@ -68,6 +68,16 @@ function FlightLogFieldPresenter() { 'motor[6]': 'Motor [7]', 'motor[7]': 'Motor [8]', + 'eRPM(/100)[all]': 'RPM', + 'eRPM(/100)[0]': 'RPM [1]', + 'eRPM(/100)[1]': 'RPM [2]', + 'eRPM(/100)[2]': 'RPM [3]', + 'eRPM(/100)[3]': 'RPM [4]', + 'eRPM(/100)[4]': 'RPM [5]', + 'eRPM(/100)[5]': 'RPM [6]', + 'eRPM(/100)[6]': 'RPM [7]', + 'eRPM(/100)[7]': 'RPM [8]', + 'servo[all]': 'Servos', 'servo[5]': 'Servo Tail', @@ -1290,6 +1300,17 @@ function FlightLogFieldPresenter() { case 'motor[7]': return `${flightLog.rcMotorRawToPctPhysical(value).toFixed(2)} %`; + case 'eRPM(/100)[0]': + case 'eRPM(/100)[1]': + case 'eRPM(/100)[2]': + case 'eRPM(/100)[3]': + case 'eRPM(/100)[4]': + case 'eRPM(/100)[5]': + case 'eRPM(/100)[6]': + case 'eRPM(/100)[7]': + let motor_poles = flightLog.getSysConfig()['motor_poles']; + return (value * 200 / motor_poles).toFixed(0) + " rpm / " + (value * 3.333 / motor_poles).toFixed(1) + ' hz'; + case 'rcCommands[0]': case 'rcCommands[1]': case 'rcCommands[2]': diff --git a/js/graph_config.js b/js/graph_config.js index 00040d33..55dc3f31 100644 --- a/js/graph_config.js +++ b/js/graph_config.js @@ -101,7 +101,7 @@ function GraphConfig(graphConfig) { if ((matches = field.name.match(/^(.+)\[all\]$/))) { var nameRoot = matches[1], - nameRegex = new RegExp("^" + nameRoot + "\[[0-9]+\]$"), + nameRegex = new RegExp("^" + escapeRegExp(nameRoot) + "\[[0-9]+\]$"), colorIndexOffset = 0; for (var k = 0; k < logFieldNames.length; k++) { @@ -267,6 +267,8 @@ GraphConfig.load = function(config) { DSHOT_RANGE / 2 : (sysConfig.maxthrottle - sysConfig.minthrottle) / 2, outputRange: 1.0, }; + } else if (fieldName.match(/^eRPM\(\/100\)\[/)) { + return getCurveForMinMaxFields('eRPM(/100)[0]', 'eRPM(/100)[1]', 'eRPM(/100)[2]', 'eRPM(/100)[3]', 'eRPM(/100)[4]', 'eRPM(/100)[5]', 'eRPM(/100)[6]', 'eRPM(/100)[7]'); } else if (fieldName.match(/^servo\[/)) { return { offset: -1500, @@ -955,6 +957,9 @@ GraphConfig.load = function(config) { EXAMPLE_GRAPHS.push({label: "Motors",fields: ["motor[all]", "servo[5]"]}); EXAMPLE_GRAPHS.push({label: "Motors (Legacy)",fields: ["motorLegacy[all]", "servo[5]"]}); } + if (!flightLog.isFieldDisabled().RPM) { + EXAMPLE_GRAPHS.push({label: "RPM",fields: ["eRPM(/100)[all]"]}); + } if (!flightLog.isFieldDisabled().GYRO) { EXAMPLE_GRAPHS.push({label: "Gyros",fields: ["gyroADC[all]"]}); } diff --git a/js/header_dialog.js b/js/header_dialog.js index d4ebdfbe..e9c465ef 100644 --- a/js/header_dialog.js +++ b/js/header_dialog.js @@ -459,6 +459,7 @@ function HeaderDialog(dialog, onSave) { {name: 'Debug', description: 'Debug values'}, {name: 'Motors', description: 'Motors and tricopter servo values'}, {name: 'GPS', description: 'All GPS-related values'}, + {name: 'RPM', description: 'Angular velocity for all motors'}, ]; const fieldsList_e = $('.fields_list'); diff --git a/js/tools.js b/js/tools.js index 47d19ea0..e75aa6ec 100644 --- a/js/tools.js +++ b/js/tools.js @@ -467,3 +467,7 @@ function getManifestVersion(manifest) { return "-" } } + +function escapeRegExp(string) { + return string.replace(/[.*+?^${}()|[\]\\]/g, '\\$&'); +}