diff --git a/README.md b/README.md index 596d94d7..1bf8efa1 100644 --- a/README.md +++ b/README.md @@ -67,7 +67,6 @@ sudo mv inav-configurator.desktop /usr/share/applications/ ``` 10. Make the following files executable: * inav-configurator `chmod +x /opt/inav/inav-configurator/inav-configurator` - * (5.0.0+) chrome_crashpad_handler `chmod +x /opt/inav/inav-configurator/chrome_crashpad_handler` 11. Run the INAV Configurator app from the unpacked folder `/opt/inav/inav-configurator/inav-configurator` ### Mac @@ -83,7 +82,7 @@ For local development, the **node.js** build system is used. 1. Install node.js 1. From the project folder run `npm install` -1. To build the JS and CSS files and start the configurator: +1. To build the and start the configurator: - Run `npm start`. To build the App run `npm run make` to build for your platform. @@ -94,7 +93,7 @@ Options: See [Electron Forge CLI Documentation](https://www.electronforge.io/cli#options-2) for details Example (note the double -- ): -``` npm start -- --arch="ia32 ``` +``` npm run make -- --arch="x64" ``` ### Running with debug | Inspector diff --git a/gulpfile.js b/gulpfile.js deleted file mode 100644 index e2ceb25e..00000000 --- a/gulpfile.js +++ /dev/null @@ -1,756 +0,0 @@ -'use strict'; - -var child_process = require('child_process'); -var fs = require('fs'); -var path = require('path'); -var minimist = require('minimist'); - -var archiver = require('archiver'); -var del = require('del'); -var NwBuilder = require('nw-builder'); -var semver = require('semver'); - -var gulp = require('gulp'); -var concat = require('gulp-concat'); - -const commandExistsSync = require('command-exists').sync; - -// Each key in the *sources* variable must be an array of -// the source files that will be combined into a single -// file and stored in *outputDir*. Each key in *sources* -// must be also present in *output*, whose value indicates -// the filename for the output file which combines the -// contents of the source files. -// -// Keys must be camel cased and end with either 'Css' or -// 'Js' (e.g. someSourcesCss or someSourcesJs). For each -// key, a build task will be generated named by prepending -// 'build-' and converting the key to dash-separated words -// (e.g. someSourcesCss will generate build-some-sources-css). -// -// Tasks with names ending with '-js' will be executed by the -// build-all-js task, while the ones ending with '-css' will -// be done by build-all-css. There's also a build task which -// runs both build-all-css and build-all-js. -// -// The watch task will monitor any files mentioned in the *sources* -// variable and regenerate the corresponding output file when -// they change. -// -// See README.md for details on the other tasks. - -var sources = {}; - -sources.css = [ - './main.css', - './js/libraries/jquery.nouislider.min.css', - './js/libraries/jquery.nouislider.pips.min.css', - './js/libraries/flightindicators.css', - './src/css/tabs/*.css', - './src/css/opensans_webfontkit/fonts.css', - './src/css/font-awesome/css/font-awesome.css', - './src/css/dropdown-lists/css/style_lists.css', - './js/libraries/switchery/switchery.css', - './js/libraries/jbox/jBox.css', - './node_modules/openlayers/dist/ol.css', - './src/css/logic.css', - './src/css/defaults_dialog.css', - './src/css/groundstation.css', -]; - -sources.js = [ - './js/libraries/google-analytics-bundle.js', - './node_modules/jquery/dist/jquery.min.js', - './node_modules/jquery-ui-npm/jquery-ui.min.js', - './node_modules/marked/lib/marked.js', - './js/libraries/d3.min.js', - './js/libraries/jquery.nouislider.all.min.js', - './node_modules/three/build/three.min.js', - './node_modules/three/examples/js/loaders/GLTFLoader.js', - './node_modules/three/examples/js/controls/OrbitControls.js', - './js/libraries/nw-dialog.js', - './js/libraries/bundle_xml2js.js', - './js/libraries/Projector.js', - './js/libraries/CanvasRenderer.js', - './js/libraries/jquery.flightindicators.js', - './js/libraries/semver.js', - './js/libraries/jbox/jBox.min.js', - './js/libraries/switchery/switchery.js', - './js/libraries/jquery.ba-throttle-debounce.js', - './js/helpers.js', - './node_modules/inflection/inflection.min.js', - './node_modules/bluebird/js/browser/bluebird.min.js', - './js/injected_methods.js', - './js/intervals.js', - './js/timeouts.js', - './js/pid_controller.js', - './js/simple_smooth_filter.js', - './js/walking_average_filter.js', - './js/gui.js', - './js/serialPortHelper.js', - './js/msp/MSPCodes.js', - './js/msp/MSPHelper.js', - './js/msp/MSPchainer.js', - './js/port_handler.js', - './js/connection/connection.js', - './js/connection/connectionBle.js', - './js/connection/connectionSerial.js', - './js/connection/connectionTcp.js', - './js/connection/connectionUdp.js', - './js/servoMixRule.js', - './js/motorMixRule.js', - './js/logicCondition.js', - './js/settings.js', - './js/outputMapping.js', - './js/model.js', - './js/serial_backend.js', - './js/data_storage.js', - './js/fc.js', - './js/msp.js', - './js/protocols/stm32.js', - './js/protocols/stm32usbdfu.js', - './js/localization.js', - './js/boards.js', - './js/servoMixerRuleCollection.js', - './js/motorMixerRuleCollection.js', - './js/logicConditionsCollection.js', - './js/logicConditionsStatus.js', - './js/globalVariablesStatus.js', - './js/programmingPid.js', - './js/programmingPidCollection.js', - './js/programmingPidStatus.js', - './js/vtx.js', - './main.js', - './js/tabs.js', - './tabs/*.js', - './js/eventFrequencyAnalyzer.js', - './js/periodicStatusUpdater.js', - './js/serial_queue.js', - './js/msp_balanced_interval.js', - './tabs/advanced_tuning.js', - './tabs/ez_tune.js', - './js/peripherals.js', - './js/appUpdater.js', - './js/feature_framework.js', - './js/defaults_dialog.js', - './js/safehomeCollection.js', - './js/safehome.js', - './js/waypointCollection.js', - './js/waypoint.js', - './node_modules/openlayers/dist/ol.js', - './js/libraries/plotly-latest.min.js', - './js/sitl.js', - './js/CliAutoComplete.js', - './node_modules/jquery-textcomplete/dist/jquery.textcomplete.js', - './js/fwApproach.js', - './js/fwApproachCollection.js', - './js/ltmDecoder.js', - './js/groundstation.js' -]; - -sources.receiverCss = [ - './src/css/tabs/receiver_msp.css', - './src/css/opensans_webfontkit/fonts.css', - './js/libraries/jquery.nouislider.min.css', - './js/libraries/jquery.nouislider.pips.min.css', -]; - -sources.receiverJs = [ - './node_modules/jquery/dist/jquery.min.js', - './node_modules/jquery-ui-npm/jquery-ui.min.js', - './js/libraries/jquery.nouislider.all.min.js', - './tabs/receiver_msp.js' -]; - -sources.debugTraceJs = [ - './js/debug_trace.js' -]; - -sources.hexParserJs = [ - './js/workers/hex_parser.js', -]; - -var output = { - css: 'styles.css', - js: 'script.js', - receiverCss: 'receiver-msp.css', - receiverJs: 'receiver-msp.js', - debugTraceJs: 'debug-trace.js', - hexParserJs: 'hex_parser.js', -}; - - -var outputDir = './build/'; -var distDir = './dist/'; -var appsDir = './apps/'; - -function get_task_name(key) { - return 'build-' + key.replace(/([A-Z])/g, function($1){return "-"+$1.toLowerCase();}); -} - -function getArguments() { - return minimist(process.argv.slice(2)); -} - -function getPlatforms() { - const defaultPlatforms = ['win32', 'win64', 'osx64', 'linux32', 'linux64']; - const platform = getArguments().platform; - if (platform) { - if (defaultPlatforms.indexOf(platform) < 0) { - throw new Error(`Invalid platform "${platform}". Available ones are: ${defaultPlatforms}`) - } - return [platform]; - } - return defaultPlatforms; -} - -function execSync() { - const cmd = arguments[0]; - const args = Array.prototype.slice.call(arguments, 1); - const result = child_process.spawnSync(cmd, args, {stdio: 'inherit'}); - if (result.error) { - throw result.error; - } -} - -// Define build tasks dynamically based on the sources -// and output variables. -var buildCssTasks = []; -var buildJsTasks = []; -(function() { - // Convers fooBarBaz to foo-bar-baz - for (var k in output) { - (function (key) { - var name = get_task_name(key); - if (name.endsWith('-css')) { - buildCssTasks.push(name); - } else if (name.endsWith('-js')) { - buildJsTasks.push(name); - } else { - throw 'Invalid task name: "' + name + '": must end with -css or -js'; - } - gulp.task(name, function() { - return gulp.src(sources[key]) - .pipe(concat(output[key])) - .pipe(gulp.dest(outputDir)); - }); - })(k); - } -})(); - -gulp.task('build-all-js', gulp.parallel(buildJsTasks)) -gulp.task('build-all-css', gulp.parallel(buildCssTasks)); -gulp.task('build', gulp.parallel('build-all-css', 'build-all-js')); - -gulp.task('clean', function() { return del(['./build/**', './dist/**'], {force: true}); }); - -// Real work for dist task. Done in another task to call it via -// run-sequence. -gulp.task('dist-build', gulp.series('build', function() { - var distSources = [ - './package.json', // For NW.js - './manifest.json', // For Chrome app - './eventPage.js', - './*.html', - './tabs/*.html', - './images/**/*', - './_locales/**/*', - './build/*', - './src/css/font-awesome/webfonts/*', - './src/css/opensans_webfontkit/*.{eot,svg,ttf,woff,woff2}', - './resources/*.json', - './resources/models/*', - './resources/osd/analogue/*.mcm', - './resources/motor_order/*.svg', - './resources/sitl/windows/*', - './resources/sitl/linux/*' - ]; - return gulp.src(distSources, { base: '.' }) - .pipe(gulp.dest(distDir)); -})); - -gulp.task('dist', gulp.series('clean', 'dist-build')); - -// Create app directories in ./apps -gulp.task('apps', gulp.series('dist', function(done) { - var builder = new NwBuilder({ - files: './dist/**/*', - buildDir: appsDir, - platforms: getPlatforms(), - flavor: 'normal', - macIcns: './images/inav.icns', - winIco: './images/inav.ico', - version: get_nw_version(), - zip: false - }); - builder.on('log', console.log); - builder.build(function (err) { - if (err) { - console.log("Error building NW apps:" + err); - done(); - return; - } - // Package apps as .zip files - done(); - }); -})); - -function get_nw_version() { - return semver.valid(semver.coerce(require('./package.json').dependencies.nw)); -} - -function get_release_filename_base(platform) { - return 'INAV-Configurator_' + platform; -} - -function get_release_filename(platform, ext, addition = '') { - var pkg = require('./package.json'); - return get_release_filename_base(platform) + addition + '_' + pkg.version + '.' + ext; -} - -function build_win_zip(arch) { - return function build_win_zip_proc(done) { - var pkg = require('./package.json'); - - // Create ZIP - console.log(`Creating ${arch} ZIP file...`); - var src = path.join(appsDir, pkg.name, arch); - var output = fs.createWriteStream(path.join(appsDir, get_release_filename(arch, 'zip'))); - var archive = archiver('zip', { - zlib: { level: 9 } - }); - archive.on('warning', function(err) { throw err; }); - archive.on('error', function(err) { throw err; }); - archive.pipe(output); - archive.directory(src, 'INAV Configurator'); - return archive.finalize(); - } -} - -function build_win_iss(arch) { - return function build_win_iss_proc(done) { - if (!getArguments().installer) { - done(); - return null; - } - - // Create Installer - console.log(`Creating ${arch} Installer...`); - const innoSetup = require('@quanle94/innosetup'); - - const APPS_DIR = './apps/'; - const pkg = require('./package.json'); - - // Parameters passed to the installer script - const parameters = []; - - // Extra parameters to replace inside the iss file - parameters.push(`/Dversion=${pkg.version}`); - parameters.push(`/DarchName=${arch}`); - parameters.push(`/DarchAllowed=${(arch === 'win32') ? 'x86 x64' : 'x64'}`); - parameters.push(`/DarchInstallIn64bit=${(arch === 'win32') ? '' : 'x64'}`); - parameters.push(`/DsourceFolder=${APPS_DIR}`); - parameters.push(`/DtargetFolder=${APPS_DIR}`); - - // Show only errors in console - parameters.push(`/Q`); - - // Script file to execute - parameters.push("assets/windows/installer.iss"); - - innoSetup(parameters, {}, - function(error) { - if (error != null) { - console.error(`Installer for platform ${arch} finished with error ${error}`); - } else { - console.log(`Installer for platform ${arch} finished`); - } - done(); - }); - } -} - -gulp.task('release-win32', gulp.series(build_win_zip('win32'), build_win_iss('win32'))); -gulp.task('release-win64', gulp.series(build_win_zip('win64'), build_win_iss('win64'))); - -gulp.task('release-osx64', function(done) { - var pkg = require('./package.json'); - var src = path.join(appsDir, pkg.name, 'osx64', pkg.name + '.app'); - // Check if we want to sign the .app bundle - if (getArguments().codesign) { - // macapptool can be downloaded from - // https://github.com/fiam/macapptool - // - // Make sure the bundle is well formed - execSync('macapptool', '-v', '1', 'fix', src); - // Sign - const codesignArgs = ['macapptool', '-v', '1', 'sign']; - const codesignIdentity = getArguments()['codesign-identity']; - if (codesignIdentity) { - codesignArgs.push('-i', codesignIdentity); - } - codesignArgs.push('-e', 'entitlements.plist'); - codesignArgs.push(src) - execSync.apply(this, codesignArgs); - - // Check if the bundle is signed - const codesignCheckArgs = [ 'codesign', '-vvv', '--deep', '--strict', src ]; - execSync.apply(this, codesignCheckArgs); - } - - // 'old' .zip mode - if (!getArguments().installer) { - const zipFilename = path.join(appsDir, get_release_filename('macOS', 'zip')); - console.log('Creating ZIP file: ' + zipFilename); - var output = fs.createWriteStream(zipFilename); - var archive = archiver('zip', { - zlib: { level: 9 } - }); - archive.on('warning', function(err) { throw err; }); - archive.on('error', function(err) { throw err; }); - archive.pipe(output); - archive.directory(src, 'INAV Configurator.app'); - output.on('close', function() { - if (getArguments().notarize) { - console.log('Notarizing ZIP file: ' + zipFilename); - const notarizeArgs = ['xcrun', 'notarytool', 'submit']; - notarizeArgs.push(zipFilename); - const notarizationUsername = getArguments()['notarization-username']; - if (notarizationUsername) { - notarizeArgs.push('--apple-id', notarizationUsername) - } else { - throw new Error('Missing notarization username'); - } - const notarizationPassword = getArguments()['notarization-password']; - if (notarizationPassword) { - notarizeArgs.push('--password', notarizationPassword) - } else { - throw new Error('Missing notarization password'); - } - const notarizationTeamId = getArguments()['notarization-team-id']; - if (notarizationTeamId) { - notarizeArgs.push('--team-id', notarizationTeamId) - } else { - throw new Error('Missing notarization Team ID'); - } - notarizeArgs.push('--wait'); - - const notarizationWebhook = getArguments()['notarization-webhook']; - if (notarizationWebhook) { - notarizeArgs.push('--webhook', notarizationWebhook); - } - execSync.apply(this, notarizeArgs); - - console.log('Stapling ZIP file: ' + zipFilename); - const stapleArgs = ['macapptool', '-v', '1', 'staple']; - stapleArgs.push(zipFilename) - execSync.apply(this, stapleArgs); - } - done(); - }); - archive.finalize(); - } - // 'new' .dmg mode - else { - const appdmg = require('appdmg'); - - var target = path.join(appsDir, get_release_filename('macOS', 'dmg')); - console.log('Creating DMG file: ' + target); - var basepath = path.join(appsDir, pkg.name, 'osx64'); - console.log('Base path: ' + basepath); - - if (fs.existsSync(target)) { - fs.unlinkSync(target); - } - - var specs = {}; - - specs["title"] = "INAV Configurator"; - specs["contents"] = [ - { "x": 448, "y": 342, "type": "link", "path": "/Applications" }, - { "x": 192, "y": 344, "type": "file", "path": pkg.name + ".app", "name": "INAV Configurator.app" }, - ]; - specs["background"] = path.join(__dirname, 'assets/osx/dmg-background.png'); - specs["format"] = "UDZO"; - specs["window"] = { - "size": { - "width": 638, - "height": 479, - } - }; - - const codesignIdentity = getArguments()['codesign-identity']; - if (getArguments().codesign) { - specs['code-sign'] = { - 'signing-identity': codesignIdentity, - } - } - - const ee = appdmg({ - target: target, - basepath: basepath, - specification: specs, - }); - - ee.on('progress', function(info) { - //console.log(info); - }); - - ee.on('error', function(err) { - console.log(err); - }); - - ee.on('finish', function() { - if (getArguments().codesign) { - // Check if the bundle is signed - const codesignCheckArgs = [ 'codesign', '-vvv', '--deep', '--strict', target ]; - execSync.apply(this, codesignCheckArgs); - } - if (getArguments().notarize) { - console.log('Notarizing DMG file: ' + target); - const notarizeArgs = ['xcrun', 'notarytool', 'submit']; - notarizeArgs.push(target); - const notarizationUsername = getArguments()['notarization-username']; - if (notarizationUsername) { - notarizeArgs.push('--apple-id', notarizationUsername) - } else { - throw new Error('Missing notarization username'); - } - const notarizationPassword = getArguments()['notarization-password']; - if (notarizationPassword) { - notarizeArgs.push('--password', notarizationPassword) - } else { - throw new Error('Missing notarization password'); - } - const notarizationTeamId = getArguments()['notarization-team-id']; - if (notarizationTeamId) { - notarizeArgs.push('--team-id', notarizationTeamId) - } else { - throw new Error('Missing notarization Team ID'); - } - notarizeArgs.push('--wait'); - - const notarizationWebhook = getArguments()['notarization-webhook']; - if (notarizationWebhook) { - notarizeArgs.push('--webhook', notarizationWebhook); - } - execSync.apply(this, notarizeArgs); - - console.log('Stapling DMG file: ' + target); - const stapleArgs = ['xcrun', 'stapler', 'staple']; - stapleArgs.push(target); - execSync.apply(this, stapleArgs); - - console.log('Checking DMG file: ' + target); - const checkArgs = ['spctl', '-vvv', '--assess', '--type', 'install', target]; - execSync.apply(this, checkArgs); - } - done(); - }); - } -}); - -function post_build(arch, folder) { - return function post_build_linux(done) { - if ((arch === 'linux32') || (arch === 'linux64')) { - const metadata = require('./package.json'); - // Copy Ubuntu launcher scripts to destination dir - const launcherDir = path.join(folder, metadata.name, arch); - console.log(`Copy Ubuntu launcher scripts to ${launcherDir}`); - return gulp.src('assets/linux/**') - .pipe(gulp.dest(launcherDir)); - } - - return done(); - } -} - -// Create the dir directory, with write permissions -function createDirIfNotExists(dir) { - fs.mkdir(dir, '0775', function(err) { - if (err && err.code !== 'EEXIST') { - throw err; - } - }); -} - -function release_deb(arch) { - return function release_deb_proc(done) { - if (!getArguments().installer) { - done(); - return null; - } - - // Check if dpkg-deb exists - if (!commandExistsSync('dpkg-deb')) { - console.warn(`dpkg-deb command not found, not generating deb package for ${arch}`); - done(); - return null; - } - - const deb = require('gulp-debian'); - const LINUX_INSTALL_DIR = '/opt/inav'; - const metadata = require('./package.json'); - - console.log(`Generating deb package for ${arch}`); - - return gulp.src([path.join(appsDir, metadata.name, arch, '*')]) - .pipe(deb({ - package: metadata.name, - version: metadata.version, - section: 'base', - priority: 'optional', - architecture: getLinuxPackageArch('deb', arch), - maintainer: metadata.author, - description: metadata.description, - preinst: [`rm -rf ${LINUX_INSTALL_DIR}/${metadata.name}`], - postinst: [ - `chown root:root ${LINUX_INSTALL_DIR}`, - `chown -R root:root ${LINUX_INSTALL_DIR}/${metadata.name}`, - `xdg-desktop-menu install ${LINUX_INSTALL_DIR}/${metadata.name}/${metadata.name}.desktop`, - ], - prerm: [`xdg-desktop-menu uninstall ${metadata.name}.desktop`], - depends: ['libatomic1'], - changelog: [], - _target: `${LINUX_INSTALL_DIR}/${metadata.name}`, - _out: appsDir, - _copyright: 'assets/linux/copyright', - _clean: true, - })); - } -} - -function post_release_deb(arch) { - return function post_release_linux_deb(done) { - if (!getArguments().installer) { - done(); - return null; - } - if ((arch === 'linux32') || (arch === 'linux64')) { - var rename = require("gulp-rename"); - const metadata = require('./package.json'); - const renameFrom = path.join(appsDir, metadata.name + '_' + metadata.version + '_' + getLinuxPackageArch('.deb', arch) + '.deb'); - const renameTo = path.join(appsDir, get_release_filename_base(arch) + '_' + metadata.version + '.deb'); - // Rename .deb build to common naming - console.log(`Renaming .deb installer ${renameFrom} to ${renameTo}`); - return gulp.src(renameFrom) - .pipe(rename(renameTo)) - .pipe(gulp.dest(".")); - } - - return done(); - } -} - -function release_rpm(arch) { - return function release_rpm_proc(done) { - if (!getArguments().installer) { - done(); - return null; - } - - // Check if rpmbuild exists - if (!commandExistsSync('rpmbuild')) { - console.warn(`rpmbuild command not found, not generating rpm package for ${arch}`); - done(); - return; - } - - const buildRpm = require('rpm-builder'); - const NAME_REGEX = /-/g; - const LINUX_INSTALL_DIR = '/opt/inav'; - const metadata = require('./package.json'); - - console.log(`Generating rpm package for ${arch}`); - - // The buildRpm does not generate the folder correctly, manually - createDirIfNotExists(appsDir); - - const options = { - name: get_release_filename_base(arch), // metadata.name, - version: metadata.version.replace(NAME_REGEX, '_'), // RPM does not like release candidate versions - buildArch: getLinuxPackageArch('rpm', arch), - vendor: metadata.author, - summary: metadata.description, - license: 'GNU General Public License v3.0', - requires: ['libatomic1'], - prefix: '/opt', - files: [{ - cwd: path.join(appsDir, metadata.name, arch), - src: '*', - dest: `${LINUX_INSTALL_DIR}/${metadata.name}`, - }], - postInstallScript: [`xdg-desktop-menu install ${LINUX_INSTALL_DIR}/${metadata.name}/${metadata.name}.desktop`], - preUninstallScript: [`xdg-desktop-menu uninstall ${metadata.name}.desktop`], - tempDir: path.join(appsDir, `tmp-rpm-build-${arch}`), - keepTemp: false, - verbose: false, - rpmDest: appsDir, - execOpts: { maxBuffer: 1024 * 1024 * 16 }, - }; - - buildRpm(options, function(err) { - if (err) { - console.error(`Error generating rpm package: ${err}`); - } - done(); - }); - } -} - -function getLinuxPackageArch(type, arch) { - let packArch; - - switch (arch) { - case 'linux32': - packArch = 'i386'; - break; - case 'linux64': - if (type === 'rpm') { - packArch = 'x86_64'; - } else { - packArch = 'amd64'; - } - break; - default: - console.error(`Package error, arch: ${arch}`); - process.exit(1); - break; - } - - return packArch; -} - -function releaseLinux(bits) { - return function() { - console.log(`Generating zip package for linux${bits}`); - var dirname = 'linux' + bits; - var pkg = require('./package.json'); - var src = path.join(appsDir, pkg.name, dirname); - var output = fs.createWriteStream(path.join(appsDir, get_release_filename(dirname, 'tar.gz'))); - var archive = archiver('tar', { - zlib: { level: 9 }, - gzip: true - }); - archive.on('warning', function(err) { throw err; }); - archive.on('error', function(err) { throw err; }); - archive.pipe(output); - archive.directory(src, 'INAV Configurator'); - return archive.finalize(); - } -} - -gulp.task('release-linux32', gulp.series(releaseLinux(32), post_build('linux32', appsDir), release_deb('linux32'), post_release_deb('linux32'))); -gulp.task('release-linux64', gulp.series(releaseLinux(64), post_build('linux64', appsDir), release_deb('linux64'), post_release_deb('linux64'), release_rpm('linux64'))); - -// Create distributable .zip files in ./apps -gulp.task('release', gulp.series('apps', getPlatforms().map(function(v) { return 'release-' + v; }))); - -gulp.task('watch', function () { - for(var k in output) { - gulp.watch(sources[k], gulp.series(get_task_name(k))); - } -}); - -gulp.task('default', gulp.series('build')); - diff --git a/index.html b/index.html index dd754662..acab4b1f 100644 --- a/index.html +++ b/index.html @@ -5,9 +5,11 @@ + + - + INAV Configurator diff --git a/js/CliAutoComplete.js b/js/CliAutoComplete.js index cf5a3eb4..99139f2f 100644 --- a/js/CliAutoComplete.js +++ b/js/CliAutoComplete.js @@ -4,13 +4,18 @@ * Uses: https://github.com/yuku/jquery-textcomplete * Check out the docs at https://github.com/yuku/jquery-textcomplete/tree/v1/doc */ + +const FC = require('./fc') +const CONFIGURATOR = require('./data_storage'); +const timeout = require('./timeouts'); + const CliAutoComplete = { configEnabled: false, builder: { state: 'reset', numFails: 0 }, }; CliAutoComplete.isEnabled = function() { - return this.isBuilding() || (this.configEnabled && CONFIG.flightControllerIdentifier === "INAV" && this.builder.state !== 'fail'); + return this.isBuilding() || (this.configEnabled && FC.CONFIG.flightControllerIdentifier === "INAV" && this.builder.state !== 'fail'); }; CliAutoComplete.isBuilding = function() { @@ -67,7 +72,7 @@ CliAutoComplete._builderWatchdogTouch = function() { this._builderWatchdogStop(); - helper.timeout.add('autocomplete_builder_watchdog', function() { + timeout.add('autocomplete_builder_watchdog', function() { if (self.builder.numFails) { self.builder.numFails++; self.builder.state = 'fail'; @@ -82,7 +87,7 @@ CliAutoComplete._builderWatchdogTouch = function() { }; CliAutoComplete._builderWatchdogStop = function() { - helper.timeout.remove('autocomplete_builder_watchdog'); + timeout.remove('autocomplete_builder_watchdog'); }; CliAutoComplete.builderStart = function() { diff --git a/js/appUpdater.js b/js/appUpdater.js index a20ddb52..bf8a7821 100644 --- a/js/appUpdater.js +++ b/js/appUpdater.js @@ -1,5 +1,11 @@ 'use strict'; +const semver = require('semver'); + +const { GUI } = require('./gui'); +const jBox = require('./libraries/jBox/jBox.min.js'); +const i18n = require('./localization'); + var appUpdater = appUpdater || {}; appUpdater.checkRelease = function (currVersion) { @@ -34,3 +40,5 @@ appUpdater.checkRelease = function (currVersion) { modalStart.close(); }); }; + +module.exports = appUpdater; diff --git a/js/configurator_main.js b/js/configurator_main.js index 536d4c97..3d22ac06 100644 --- a/js/configurator_main.js +++ b/js/configurator_main.js @@ -1,7 +1,9 @@ window.$ = window.jQuery = require('jquery'), - require('jquery-ui-dist/jquery-ui'), + require('jquery-ui-dist/jquery-ui'), require('jquery-textcomplete'), - require('./libraries/jquery.flightindicators.js'); + require('./libraries/jquery.flightindicators.js'), + require('./libraries/jquery.nouislider.all.min.js'), + require('./libraries/jquery.ba-throttle-debounce.js'); const { app } = require('@electron/remote'); const d3 = require('./libraries/d3.min.js'); @@ -16,9 +18,13 @@ const { PLATFORM } = require('./model.js') const i18n = require('./localization'); const SerialBackend = require('./serial_backend'); const MSP = require('./msp'); +const MSPCodes = require('./../js/msp/MSPCodes'); const mspHelper = require('./msp/MSPHelper.js'); const update = require('./globalUpdates.js'); - +const appUpdater = require('./appUpdater.js'); +const CliAutoComplete = require('./CliAutoComplete.js'); +const { SITLProcess } = require('./sitl'); +; process.on('uncaughtException', function (error) { if (process.env.NODE_ENV !== 'development') { GUI.log(i18n.getMessage('unexpectedError', error)); @@ -33,7 +39,6 @@ process.on('uncaughtException', function (error) { // Set how the units render on the configurator only $(function() { - i18n.init( () => { i18n.localize(); @@ -66,6 +71,12 @@ $(function() { return useEzTune; }; + GUI.updateActivatedTab = function() { + var activeTab = $('#tabs > ul li.active'); + activeTab.removeClass('active'); + $('a', activeTab).trigger('click'); + } + globalSettings.unitType = store.get('unit_type', UnitType.none); globalSettings.mapProviderType = store.get('map_provider_type', 'osm'); globalSettings.mapApiKey = store.get('map_api_key', ''); @@ -74,10 +85,10 @@ $(function() { globalSettings.showProfileParameters = store.get('show_profile_parameters', 1); updateProfilesHighlightColours(); - if (store.get('cli_autocomplete', true)) { - globalSettings.cliAutocomplete = true; - //CliAutoComplete.setEnabled(true); - }; + var cliAutocomplete = store.get('cli_autocomplete', true); + globalSettings.cliAutocomplete = cliAutocomplete; + CliAutoComplete.setEnabled(cliAutocomplete); + // Resets the OSD units used by the unit coversion when the FC is disconnected. if (!CONFIGURATOR.connectionValid) { @@ -97,8 +108,8 @@ $(function() { $("#showlog").trigger('click'); } - if (store.get('update_notify', true)) { 34 - //appUpdater.checkRelease(app.getVersion()); + if (store.get('update_notify', true)) { + appUpdater.checkRelease(app.getVersion()); } // log library versions in console to make version tracking easier diff --git a/js/connection/connectionSerial.js b/js/connection/connectionSerial.js index 9f6711b0..e3fb4502 100644 --- a/js/connection/connectionSerial.js +++ b/js/connection/connectionSerial.js @@ -77,7 +77,7 @@ class ConnectionSerial extends Connection { if (error) { result = 1; sent = 0; - console.log("Serial wrire error: " + error) + console.log("Serial write error: " + error) } if (callback) { callback({ diff --git a/js/connection/connectionTcp.js b/js/connection/connectionTcp.js index 161d1820..f3e93336 100644 --- a/js/connection/connectionTcp.js +++ b/js/connection/connectionTcp.js @@ -66,8 +66,8 @@ class ConnectionTcp extends Connection { }); this._socket.on('error', (error) => { - GUI.log("TCP error: " + error); - console.log("TCP error: " + error); + GUI.log(error); + console.log(error); if (this._socket) { this.abort(); diff --git a/js/defaults_dialog.js b/js/defaults_dialog.js index be6df1c6..d29fe10d 100644 --- a/js/defaults_dialog.js +++ b/js/defaults_dialog.js @@ -1,9 +1,15 @@ -/*global mspHelper,$,GUI,MSP,chrome*/ 'use strict'; +const { GUI } = require('./../js/gui'); +const FC = require('./fc.js'); +const MSP = require('./msp'); +const MSPCodes = require('./../js/msp/MSPCodes'); const mspHelper = require('./msp/MSPHelper'); +const MSPChainerClass = require('./msp/MSPchainer.js'); const features = require('./feature_framework'); -const { mixer } = require('./model') +const { mixer } = require('./model'); +const jBox = require('./libraries/jBox/jBox.min.js'); +const i18n = require('./localization.js'); var savingDefaultsModal; @@ -997,18 +1003,18 @@ var defaultsDialog = (function () { if (selectedDefaultPreset.mixerToApply) { let currentMixerPreset = mixer.getById(selectedDefaultPreset.mixerToApply); - mixer.loadServoRules(currentMixerPreset); - mixer.loadMotorRules(currentMixerPreset); + mixer.loadServoRules(FC, currentMixerPreset); + mixer.loadMotorRules(FC, currentMixerPreset); - MIXER_CONFIG.platformType = currentMixerPreset.platform; - MIXER_CONFIG.appliedMixerPreset = selectedDefaultPreset.mixerToApply; - MIXER_CONFIG.motorStopOnLow = (currentMixerPreset.motorStopOnLow === true) ? true : false; - MIXER_CONFIG.hasFlaps = (currentMixerPreset.hasFlaps === true) ? true : false; + FC.MIXER_CONFIG.platformType = currentMixerPreset.platform; + FC.MIXER_CONFIG.appliedMixerPreset = selectedDefaultPreset.mixerToApply; + FC.MIXER_CONFIG.motorStopOnLow = (currentMixerPreset.motorStopOnLow === true) ? true : false; + FC.MIXER_CONFIG.hasFlaps = (currentMixerPreset.hasFlaps === true) ? true : false; - SERVO_RULES.cleanup(); - SERVO_RULES.inflate(); - MOTOR_RULES.cleanup(); - MOTOR_RULES.inflate(); + FC.SERVO_RULES.cleanup(); + FC.SERVO_RULES.inflate(); + FC.MOTOR_RULES.cleanup(); + FC.MOTOR_RULES.inflate(); chain = chain.concat([ mspHelper.saveMixerConfig, diff --git a/js/fc.js b/js/fc.js index 0d731148..791d10d8 100644 --- a/js/fc.js +++ b/js/fc.js @@ -10,10 +10,12 @@ const ProgrammingPidStatus = require('./programmingPidStatus'); const WaypointCollection = require('./waypointCollection'); const OutputMappingCollection = require('./outputMapping'); const SafehomeCollection = require('./safehomeCollection'); +const FwApproachCollection = require('./fwApproachCollection.js') const { PLATFORM } = require('./model.js') const VTX = require('./vtx'); const BitHelper = require('./bitHelper'); + var FC = { // define all the global variables that are uses to hold FC state CONFIG: null, @@ -584,9 +586,9 @@ var FC = { }; - FW_APPROACH = new FwApproachCollection(); + this.FW_APPROACH = new FwApproachCollection(); - OSD_CUSTOM_ELEMENTS = { + this.OSD_CUSTOM_ELEMENTS = { settings: {customElementsCount: 0, customElementTextSize: 0}, items: [], }; @@ -1363,7 +1365,7 @@ var FC = { 4: { name: "Logic Condition", type: "range", - range: [0, (LOGIC_CONDITIONS.getMaxLogicConditionCount()-1)], + range: [0, (this.LOGIC_CONDITIONS.getMaxLogicConditionCount()-1)], default: 0 }, 5: { diff --git a/js/feature_framework.js b/js/feature_framework.js index 87b159f5..a477060c 100644 --- a/js/feature_framework.js +++ b/js/feature_framework.js @@ -1,4 +1,3 @@ -/*global mspHelper,FEATURES,bit_clear,bit_set*/ 'use strict'; /* diff --git a/js/fwApproach.js b/js/fwApproach.js index f5dac2f1..67bbe860 100644 --- a/js/fwApproach.js +++ b/js/fwApproach.js @@ -1,4 +1,3 @@ -/*global $*/ 'use strict'; const ApproachDirection = Object.freeze({ @@ -105,3 +104,5 @@ let FwApproach = function (number, approachAltAsl = 0, landAltAsl = 0, approachD return self; }; + +module.exports = { ApproachDirection, FwApproach }; diff --git a/js/fwApproachCollection.js b/js/fwApproachCollection.js index 49da60e6..a0ac94e7 100644 --- a/js/fwApproachCollection.js +++ b/js/fwApproachCollection.js @@ -1,5 +1,7 @@ 'use strict'; +const BitHelper = require('./bitHelper'); + let FwApproachCollection = function () { let self = {}, @@ -66,19 +68,19 @@ let FwApproachCollection = function () { let fwApproach = data[fwApproachId]; if (fwApproachId < self.fwApproachCount()) { buffer.push(fwApproach.getNumber()); // sbufReadU8(src); // number - buffer.push(specificByte(fwApproach.getApproachAltAsl(), 0)); - buffer.push(specificByte(fwApproach.getApproachAltAsl(), 1)); - buffer.push(specificByte(fwApproach.getApproachAltAsl(), 2)); - buffer.push(specificByte(fwApproach.getApproachAltAsl(), 3)); - buffer.push(specificByte(fwApproach.getLandAltAsl(), 0)); - buffer.push(specificByte(fwApproach.getLandAltAsl(), 1)); - buffer.push(specificByte(fwApproach.getLandAltAsl(), 2)); - buffer.push(specificByte(fwApproach.getLandAltAsl(), 3)); + buffer.push(BitHelper.specificByte(fwApproach.getApproachAltAsl(), 0)); + buffer.push(BitHelper.specificByte(fwApproach.getApproachAltAsl(), 1)); + buffer.push(BitHelper.specificByte(fwApproach.getApproachAltAsl(), 2)); + buffer.push(BitHelper.specificByte(fwApproach.getApproachAltAsl(), 3)); + buffer.push(BitHelper.specificByte(fwApproach.getLandAltAsl(), 0)); + buffer.push(BitHelper.specificByte(fwApproach.getLandAltAsl(), 1)); + buffer.push(BitHelper.specificByte(fwApproach.getLandAltAsl(), 2)); + buffer.push(BitHelper.specificByte(fwApproach.getLandAltAsl(), 3)); buffer.push(fwApproach.getApproachDirection()); - buffer.push(specificByte(fwApproach.getLandHeading1(), 0)); - buffer.push(specificByte(fwApproach.getLandHeading1(), 1)); - buffer.push(specificByte(fwApproach.getLandHeading2(), 0)); - buffer.push(specificByte(fwApproach.getLandHeading2(), 1)); + buffer.push(BitHelper.specificByte(fwApproach.getLandHeading1(), 0)); + buffer.push(BitHelper.specificByte(fwApproach.getLandHeading1(), 1)); + buffer.push(BitHelper.specificByte(fwApproach.getLandHeading2(), 0)); + buffer.push(BitHelper.specificByte(fwApproach.getLandHeading2(), 1)); buffer.push(fwApproach.getIsSeaLevelRef()); } else { buffer = Array(15).fill(0); @@ -90,3 +92,5 @@ let FwApproachCollection = function () { return self; }; + +module.exports = FwApproachCollection; diff --git a/js/globalUpdates.js b/js/globalUpdates.js index f7394916..16fa3776 100644 --- a/js/globalUpdates.js +++ b/js/globalUpdates.js @@ -3,7 +3,6 @@ const CONFIGURATOR = require('./data_storage'); const FC = require('./fc'); const { globalSettings } = require('./globalSettings'); -const mspHelper = require('./msp/MSPHelper.js'); const i18n = require('./localization'); var update = { diff --git a/js/groundstation.js b/js/groundstation.js index 37d1af52..8787ced3 100644 --- a/js/groundstation.js +++ b/js/groundstation.js @@ -1,8 +1,14 @@ 'use strict'; -var helper = helper || {}; +const ol = require('openlayers'); -helper.groundstation = (function () { +const { GUI } = require('./gui'); +const ltmDecoder = require('./ltmDecoder'); +const interval = require('./intervals'); +const { globalSettings } = require('./globalSettings'); +const i18n = require('./localization'); + +const groundstation = (function () { let publicScope = {}, privateScope = {}; @@ -37,14 +43,15 @@ helper.groundstation = (function () { return; } - helper.interval.add('gsUpdateGui', privateScope.updateGui, 200); + interval.add('gsUpdateGui', privateScope.updateGui, 200); privateScope.$viewport = $viewport; privateScope.$viewport.find(".tab_container").hide(); privateScope.$viewport.find('#content').hide(); privateScope.$viewport.find('#status-bar').hide(); - privateScope.$viewport.find('#connectbutton a.connect_state').text(chrome.i18n.getMessage('disconnect')).addClass('active'); + privateScope.$viewport.find('#connectbutton a.connect_state').text(i18n.getMessage('disconnect')); + privateScope.$viewport.find('#connectbutton a.connect').addClass('active'); privateScope.$gsViewport = $viewport.find('#view-groundstation'); privateScope.$gsViewport.show(); @@ -53,7 +60,7 @@ helper.groundstation = (function () { setTimeout(privateScope.initMap, 100); privateScope.activated = true; - GUI.log(chrome.i18n.getMessage('gsActivated')); + GUI.log(i18n.getMessage('gsActivated')); } privateScope.initMap = function () { @@ -98,7 +105,7 @@ helper.groundstation = (function () { return; } - helper.interval.remove('gsUpdateGui'); + interval.remove('gsUpdateGui'); if (privateScope.$viewport !== null) { privateScope.$viewport.find(".tab_container").show(); @@ -111,12 +118,12 @@ helper.groundstation = (function () { } privateScope.activated = false; - GUI.log(chrome.i18n.getMessage('gsDeactivated')); + GUI.log(i18n.getMessage('gsDeactivated')); } privateScope.updateGui = function () { - let telemetry = helper.ltmDecoder.get(); + let telemetry = ltmDecoder.get(); if (telemetry.gpsFix && telemetry.gpsFix > 1) { @@ -191,4 +198,6 @@ helper.groundstation = (function () { }; return publicScope; -})(); \ No newline at end of file +})(); + +module.exports = groundstation; \ No newline at end of file diff --git a/js/gui.js b/js/gui.js index f3ed565a..6bdbe8a6 100644 --- a/js/gui.js +++ b/js/gui.js @@ -6,6 +6,7 @@ const MSP = require('./msp'); const FC = require('./fc'); const interval = require('./intervals'); const mspBalancedInterval = require('./msp_balanced_interval'); +const { scaleRangeInt } = require('./helpers'); const i18n = require('./localization'); var TABS = {}; // filled by individual tab js file @@ -275,7 +276,7 @@ GUI_control.prototype.updateProfileChange = function(refresh) { GUI.log(i18n.getMessage('loadedMixerProfile', [FC.CONFIG.mixer_profile + 1])); GUI.log(i18n.getMessage('pidTuning_LoadedProfile', [FC.CONFIG.profile + 1])); GUI.log(i18n.getMessage('loadedBatteryProfile', [FC.CONFIG.battery_profile + 1])); - updateActivatedTab(); + GUI.updateActivatedTab(); } }; diff --git a/js/helpers.js b/js/helpers.js index 90c4fdaf..661efeef 100644 --- a/js/helpers.js +++ b/js/helpers.js @@ -1,4 +1,3 @@ -/*global $*/ 'use strict'; @@ -102,3 +101,5 @@ function calculate_new_cooridatnes(coord, bearing, distance) lon: rad2Deg(lonNew), } } + +module.exports = { constrain, zeroPad, generateFilename, scaleRangeInt, distanceOnLine, wrap_360, rad2Deg, calculate_new_cooridatnes } diff --git a/js/localization.js b/js/localization.js index e39d1368..f7565acb 100644 --- a/js/localization.js +++ b/js/localization.js @@ -10,7 +10,7 @@ const i18nextXHRBackend = require('i18next-xhr-backend'); const Store = require('electron-store'); const store = new Store(); -const availableLanguages = ['en', 'de']; +const availableLanguages = ['en']; const i18n = {}; diff --git a/js/logicCondition.js b/js/logicCondition.js index 30da6037..086629c1 100644 --- a/js/logicCondition.js +++ b/js/logicCondition.js @@ -220,7 +220,7 @@ let LogicCondition = function (enabled, activatorId, operation, operandAType, op if (self.getEnabled()) { GUI.renderLogicConditionSelect( $e, - LOGIC_CONDITIONS, + FC.LOGIC_CONDITIONS, self.getActivatorId, self.onActivatorChange, true, diff --git a/js/logicConditionsCollection.js b/js/logicConditionsCollection.js index 7452bbd5..4eeef446 100644 --- a/js/logicConditionsCollection.js +++ b/js/logicConditionsCollection.js @@ -46,8 +46,6 @@ var LogicConditionsCollection = function () { self.get()[k].render(k, $table); } } - - GUI.switchery(); }; self.onSave = function () { diff --git a/js/ltmDecoder.js b/js/ltmDecoder.js index ef72c69a..da6e84cf 100644 --- a/js/ltmDecoder.js +++ b/js/ltmDecoder.js @@ -1,8 +1,6 @@ 'use strict'; -var helper = helper || {}; - -helper.ltmDecoder = (function () { +const ltmDecoder = (function () { let TELEMETRY = { //A frame @@ -257,4 +255,6 @@ helper.ltmDecoder = (function () { }; return publicScope; -})(); \ No newline at end of file +})(); + +module.exports = ltmDecoder; \ No newline at end of file diff --git a/js/main.js b/js/main.js index 00a8367b..43bd18eb 100644 --- a/js/main.js +++ b/js/main.js @@ -21,7 +21,7 @@ let bluetoothDeviceChooser = null; let btDeviceList = null; let selectBluetoothCallback = null; -// In Eletrcon the bluetooth device chooser didn't exist, so we have to build our own +// In Electron the bluetooth device chooser didn't exist, so we have to build our own function createDeviceChooser() { bluetoothDeviceChooser = new BrowserWindow({ parent: mainWindow, @@ -69,7 +69,6 @@ app.on('ready', () => { webPreferences: { nodeIntegration: true, contextIsolation: false, - webSecurity: false }, }); @@ -124,7 +123,7 @@ app.on('ready', () => { if (details.deviceType === 'usb' && details.origin === 'file://') { return true; } - }) + }); mainWindow.webContents.setWindowOpenHandler(({ url }) => { return { @@ -140,7 +139,6 @@ app.on('ready', () => { require("@electron/remote/main").enable(mainWindow.webContents); mainWindow.removeMenu(); mainWindow.setMinimumSize(800, 600); - mainWindow.loadFile('./index.html'); mainWindowState.manage(mainWindow); diff --git a/js/model.js b/js/model.js index 8a0b9f20..6bed5617 100644 --- a/js/model.js +++ b/js/model.js @@ -787,13 +787,13 @@ const platformList = [ return retVal; }; - publicScope.loadServoRules = function (mixer) { - SERVO_RULES.flush(); + publicScope.loadServoRules = function (FC, mixer) { + FC.SERVO_RULES.flush(); for (const i in mixer.servoMixer) { if (mixer.servoMixer.hasOwnProperty(i)) { const r = mixer.servoMixer[i]; - SERVO_RULES.put( + FC.SERVO_RULES.put( new ServoMixRule( r.getTarget(), r.getInput(), @@ -805,13 +805,13 @@ const platformList = [ } } - publicScope.loadMotorRules = function (mixer) { - MOTOR_RULES.flush(); + publicScope.loadMotorRules = function (FC, mixer) { + FC.MOTOR_RULES.flush(); for (const i in mixer.motorMixer) { if (mixer.motorMixer.hasOwnProperty(i)) { const r = mixer.motorMixer[i]; - MOTOR_RULES.put( + FC.MOTOR_RULES.put( new MotorMixRule( r.getThrottle(), r.getRoll(), diff --git a/js/motorMixRule.js b/js/motorMixRule.js index e5fe0fc5..728679ae 100644 --- a/js/motorMixRule.js +++ b/js/motorMixRule.js @@ -1,6 +1,6 @@ 'use strict'; -const { constrain } = require('./helpers') +const { constrain } = require('./helpers') var MotorMixRule = function (throttle, roll, pitch, yaw) { diff --git a/js/motorMixerRuleCollection.js b/js/motorMixerRuleCollection.js index 953c4fb7..0fe9cd9f 100644 --- a/js/motorMixerRuleCollection.js +++ b/js/motorMixerRuleCollection.js @@ -1,6 +1,7 @@ -/*global $, MotorMixRule*/ 'use strict'; +const MotorMixRule = require('./motorMixRule'); + var MotorMixerRuleCollection = function () { let self = {}, diff --git a/js/msp.js b/js/msp.js index bbbe2a76..d8553f0d 100644 --- a/js/msp.js +++ b/js/msp.js @@ -86,6 +86,17 @@ var MSP = { lastFrameReceivedMs: 0, + processData: null, + + init() { + mspQueue.setPutCallback(this.putCallback); + mspQueue.setremoveCallback(this.removeCallback); + }, + + setProcessData(cb) { + this.processData = cb; + }, + read: function (readInfo) { var data = new Uint8Array(readInfo.data); @@ -243,7 +254,7 @@ var MSP = { _dispatch_message(expected_checksum) { if (this.message_checksum == expected_checksum) { // message received, process - mspHelper.processData(this); + this.processData(this); this.lastFrameReceivedMs = Date.now(); } else { console.log('code: ' + this.code + ' - crc failed'); @@ -396,8 +407,4 @@ var MSP = { } }; -MSP.SDCARD_STATE_NOT_PRESENT = 0; -MSP.SDCARD_STATE_FATAL = 1; -MSP.SDCARD_STATE_CARD_INIT = 2; -MSP.SDCARD_STATE_FS_INIT = 3; -MSP.SDCARD_STATE_READY = 4; +module.exports = MSP; diff --git a/js/msp/MSPHelper.js b/js/msp/MSPHelper.js index 1ba623a5..95333cc1 100644 --- a/js/msp/MSPHelper.js +++ b/js/msp/MSPHelper.js @@ -1,4 +1,3 @@ -/*global $, SERVO_DATA, PID_names, ADJUSTMENT_RANGES, RXFAIL_CONFIG, SERVO_CONFIG,CONFIG*/ 'use strict'; const semver = require('semver'); @@ -8,11 +7,17 @@ const { GUI } = require('./../gui'); const MSP = require('./../msp'); const MSPCodes = require('./MSPCodes'); const FC = require('./../fc'); +const VTX = require('./../vtx'); const mspQueue = require('./../serial_queue'); const ServoMixRule = require('./../servoMixRule'); const MotorMixRule = require('./../motorMixRule'); const LogicCondition = require('./../logicCondition'); const BitHelper = require('../bitHelper'); +const serialPortHelper = require('./../serialPortHelper'); +const ProgrammingPid = require('./../programmingPid'); +const Safehome = require('./../safehome'); +const { FwApproach } = require('./../fwApproach'); +const Waypoint = require('./../waypoint'); var mspHelper = (function () { var self = {}; @@ -836,7 +841,7 @@ var mspHelper = (function () { var serialPort = { identifier: data.getUint8(offset), - functions: helper.serialPortHelper.maskToFunctions(data.getUint32(offset + 1, true)), + functions: serialPortHelper.maskToFunctions(data.getUint32(offset + 1, true)), msp_baudrate: BAUD_RATES[data.getUint8(offset + 5)], sensors_baudrate: BAUD_RATES[data.getUint8(offset + 6)], telemetry_baudrate: BAUD_RATES[data.getUint8(offset + 7)], @@ -1530,19 +1535,19 @@ var mspHelper = (function () { case MSPCodes.MSP2_INAV_TEMPERATURES: for (let i = 0; i < 8; ++i) { - temp_decidegrees = data.getInt16(i * 2, true); + let temp_decidegrees = data.getInt16(i * 2, true); FC.SENSOR_DATA.temperature[i] = temp_decidegrees / 10; // °C } break; case MSPCodes.MSP2_INAV_SAFEHOME: - FC.SAFEHOMES.put(new Safehome( + var safeHome = new Safehome( data.getUint8(0), data.getUint8(1), data.getInt32(2, true), data.getInt32(6, true), ); - if (safehome.getEnabled()) { - SAFEHOMES.put(safehome); + if (safeHome.getEnabled()) { + FC.SAFEHOMES.put(safeHome); } break; @@ -1551,7 +1556,7 @@ var mspHelper = (function () { break; case MSPCodes.MSP2_INAV_FW_APPROACH: - FW_APPROACH.put(new FwApproach( + FC.FW_APPROACH.put(new FwApproach( data.getUint8(0), data.getInt32(1, true), data.getInt32(5, true), @@ -1596,27 +1601,27 @@ var mspHelper = (function () { break; case MSPCodes.MSP2_INAV_CUSTOM_OSD_ELEMENTS: - OSD_CUSTOM_ELEMENTS.items = []; + FC.OSD_CUSTOM_ELEMENTS .items = []; var index = 0; if(data.byteLength == 0){ - OSD_CUSTOM_ELEMENTS.settings.customElementsCount = 0; - OSD_CUSTOM_ELEMENTS.settings.customElementTextSize = 0; + FC.OSD_CUSTOM_ELEMENTS .settings.customElementsCount = 0; + FC.OSD_CUSTOM_ELEMENTS .settings.customElementTextSize = 0; return; } - OSD_CUSTOM_ELEMENTS.settings.customElementsCount = data.getUint8(index++); - OSD_CUSTOM_ELEMENTS.settings.customElementTextSize = data.getUint8(index++); + FC.OSD_CUSTOM_ELEMENTS .settings.customElementsCount = data.getUint8(index++); + FC.OSD_CUSTOM_ELEMENTS .settings.customElementTextSize = data.getUint8(index++); - for (i = 0; i < OSD_CUSTOM_ELEMENTS.settings.customElementsCount; i++){ + for (i = 0; i < FC.OSD_CUSTOM_ELEMENTS .settings.customElementsCount; i++){ var customElement = { customElementItems: [], customElementVisibility: {type: 0, value: 0}, customElementText: [], }; - for (let ii = 0; ii < OSD_CUSTOM_ELEMENTS.settings.customElementsCount; ii++){ + for (let ii = 0; ii < FC.OSD_CUSTOM_ELEMENTS .settings.customElementsCount; ii++){ var customElementPart = {type: 0, value: 0,}; customElementPart.type = data.getUint8(index++); customElementPart.value = data.getUint16(index, true); @@ -1628,10 +1633,10 @@ var mspHelper = (function () { customElement.customElementVisibility.value = data.getUint16(index, true); index += 2; - for (let ii = 0; ii < OSD_CUSTOM_ELEMENTS.settings.customElementTextSize; ii++){ + for (let ii = 0; ii < FC.OSD_CUSTOM_ELEMENTS .settings.customElementTextSize; ii++){ var char = data.getUint8(index++); if(char === 0){ - index += (OSD_CUSTOM_ELEMENTS.settings.customElementTextSize - 1) - ii; + index += (FC.OSD_CUSTOM_ELEMENTS .settings.customElementTextSize - 1) - ii; break; } customElement.customElementText[ii] = char; @@ -1639,7 +1644,7 @@ var mspHelper = (function () { customElement.customElementText = String.fromCharCode(...customElement.customElementText); - OSD_CUSTOM_ELEMENTS.items.push(customElement) + FC.OSD_CUSTOM_ELEMENTS .items.push(customElement) } break; @@ -1687,10 +1692,10 @@ var mspHelper = (function () { switch (code) { case MSPCodes.MSP_SET_FEATURE: - buffer.push(BitHelper.specificByte(FC.FEATURESS, 0)); - buffer.push(BitHelper.specificByte(FC.FEATURESS, 1)); - buffer.push(BitHelper.specificByte(FC.FEATURESS, 2)); - buffer.push(BitHelper.specificByte(FC.FEATURESS, 3)); + buffer.push(BitHelper.specificByte(FC.FEATURES, 0)); + buffer.push(BitHelper.specificByte(FC.FEATURES, 1)); + buffer.push(BitHelper.specificByte(FC.FEATURES, 2)); + buffer.push(BitHelper.specificByte(FC.FEATURES, 3)); break; case MSPCodes.MSP_SET_BOARD_ALIGNMENT: @@ -1926,7 +1931,7 @@ var mspHelper = (function () { buffer.push(serialPort.identifier); - var functionMask = mspHelper.SERIAL_PORT_FUNCTIONSToMask(serialPort.functions); + var functionMask = serialPortHelper.functionsToMask(serialPort.functions); buffer.push(BitHelper.specificByte(functionMask, 0)); buffer.push(BitHelper.specificByte(functionMask, 1)); buffer.push(BitHelper.specificByte(functionMask, 2)); @@ -2874,7 +2879,7 @@ var mspHelper = (function () { MSP.send_message(MSPCodes.MSP2_INAV_TIMER_OUTPUT_MODE, false, false, callback); } - self.sendTimerOutputModes = function(callback) { + self.sendTimerOutputModes = function(onCompleteCallback) { var nextFunction = send_next_output_mode; var idIndex = 0; @@ -3131,13 +3136,13 @@ var mspHelper = (function () { }; self.loadFwApproach = function (callback) { - FW_APPROACH.flush(); + FC.FW_APPROACH.flush(); let id = 0; MSP.send_message(MSPCodes.MSP2_INAV_FW_APPROACH, [id], false, nextFwApproach); function nextFwApproach() { id++; - if (id < FW_APPROACH.getMaxFwApproachCount() - 1) { + if (id < FC.FW_APPROACH.getMaxFwApproachCount() - 1) { MSP.send_message(MSPCodes.MSP2_INAV_FW_APPROACH, [id], false, nextFwApproach); } else { @@ -3148,15 +3153,15 @@ var mspHelper = (function () { self.saveFwApproach = function (callback) { let id = 0; - MSP.send_message(MSPCodes.MSP2_INAV_SET_FW_APPROACH, FW_APPROACH.extractBuffer(id), false, nextFwApproach); + MSP.send_message(MSPCodes.MSP2_INAV_SET_FW_APPROACH, FC.FW_APPROACH.extractBuffer(id), false, nextFwApproach); function nextFwApproach() { id++; - if (id < FW_APPROACH.getMaxFwApproachCount() - 1) { - MSP.send_message(MSPCodes.MSP2_INAV_SET_FW_APPROACH, FW_APPROACH.extractBuffer(id), false, nextFwApproach); + if (id < FC.FW_APPROACH.getMaxFwApproachCount() - 1) { + MSP.send_message(MSPCodes.MSP2_INAV_SET_FW_APPROACH, FC.FW_APPROACH.extractBuffer(id), false, nextFwApproach); } else { - MSP.send_message(MSPCodes.MSP2_INAV_SET_FW_APPROACH, FW_APPROACH.extractBuffer(id), false, callback); + MSP.send_message(MSPCodes.MSP2_INAV_SET_FW_APPROACH, FC.FW_APPROACH.extractBuffer(id), false, callback); } }; }; @@ -3329,7 +3334,7 @@ var mspHelper = (function () { return MSP.promise(MSPCodes.MSPV2_SET_SETTING, data).then(callback); }).catch(error => { console.log("Invalid setting: " + name); - return new Promise(callback); + return Promise.resolve().then(callback); }); }; diff --git a/js/mwnp.js b/js/mwnp.js new file mode 100644 index 00000000..2a7936e6 --- /dev/null +++ b/js/mwnp.js @@ -0,0 +1,36 @@ +'use strict' + +// MultiWii NAV Protocol +const MWNP = {}; + +MWNP.WPTYPE = { + WAYPOINT: 1, + POSHOLD_UNLIM: 2, + POSHOLD_TIME: 3, + RTH: 4, + SET_POI: 5, + JUMP: 6, + SET_HEAD: 7, + LAND: 8 +}; + +MWNP.P3 = { + ALT_TYPE: 0, // Altitude (alt) : Relative (to home altitude) (0) or Absolute (AMSL) (1). + USER_ACTION_1: 1, // WP Action 1 + USER_ACTION_2: 2, // WP Action 2 + USER_ACTION_3: 3, // WP Action 3 + USER_ACTION_4: 4, // WP Action 4 +} + +MWNP.WPTYPE.REV = swap(MWNP.WPTYPE); + +// Reverse WayPoint type dictionary +function swap(dict) { + let rev_dict = {}; + for (let key in dict) { + rev_dict[dict[key]] = key; + } + return rev_dict; +} + +module.exports = MWNP; \ No newline at end of file diff --git a/js/outputMapping.js b/js/outputMapping.js index e93f617e..e8d800f7 100644 --- a/js/outputMapping.js +++ b/js/outputMapping.js @@ -1,4 +1,3 @@ -/*global bit_check*/ 'use strict'; var OutputMappingCollection = function () { diff --git a/js/peripherals.js b/js/peripherals.js index d238f0c9..01386a00 100644 --- a/js/peripherals.js +++ b/js/peripherals.js @@ -1,9 +1,11 @@ 'use strict'; +const FC = require('./fc'); + // return true if user has choose a special peripheral function isPeripheralSelected(peripheralName) { - for (var portIndex = 0; portIndex < SERIAL_CONFIG.ports.length; portIndex++) { - var serialPort = SERIAL_CONFIG.ports[portIndex]; + for (var portIndex = 0; portIndex < FC.SERIAL_CONFIG.ports.length; portIndex++) { + var serialPort = FC.SERIAL_CONFIG.ports[portIndex]; if (serialPort.functions.indexOf(peripheralName) >= 0) { return true; } @@ -36,4 +38,4 @@ function adjustBoxNameIfPeripheralWithModeID(modeId, defaultName) { return defaultName; } -module.exports = { isPeripheralSelected, adjustBoxNameIfPeripheralWithModeID }; \ No newline at end of file +module.exports = adjustBoxNameIfPeripheralWithModeID ; \ No newline at end of file diff --git a/js/programmingPid.js b/js/programmingPid.js index d61b7ea8..ca171085 100644 --- a/js/programmingPid.js +++ b/js/programmingPid.js @@ -1,6 +1,8 @@ -/*global $,FC*/ 'use strict'; +const FC = require('./fc'); +const { GUI } = require('./gui'); + let ProgrammingPid = function (enabled, setpointType, setpointValue, measurementType, measurementValue, gainP, gainI, gainD, gainFF) { let self = {}; let $row; diff --git a/js/programmingPidCollection.js b/js/programmingPidCollection.js index 11775224..c5c8a60e 100644 --- a/js/programmingPidCollection.js +++ b/js/programmingPidCollection.js @@ -40,8 +40,6 @@ var ProgrammingPidCollection = function () { self.get()[k].render(k, $table); } } - - GUI.switchery(); }; self.update = function(statuses) { diff --git a/js/safehome.js b/js/safehome.js index 325294d2..71b2c79c 100644 --- a/js/safehome.js +++ b/js/safehome.js @@ -1,4 +1,3 @@ -/*global $*/ 'use strict'; var Safehome = function (number, enabled, lat, lon) { diff --git a/js/safehomeCollection.js b/js/safehomeCollection.js index 54a9cb3b..9c6339df 100644 --- a/js/safehomeCollection.js +++ b/js/safehomeCollection.js @@ -1,5 +1,7 @@ 'use strict'; +const BitHelper = require('./bitHelper'); + var SafehomeCollection = function () { let self = {}, @@ -67,14 +69,14 @@ var SafehomeCollection = function () { if (safehomeId < self.safehomeCount()) { buffer.push(safehome.getNumber()); // sbufReadU8(src); // number buffer.push(1); - buffer.push(specificByte(safehome.getLat(), 0)); // sbufReadU32(src); // lat - buffer.push(specificByte(safehome.getLat(), 1)); - buffer.push(specificByte(safehome.getLat(), 2)); - buffer.push(specificByte(safehome.getLat(), 3)); - buffer.push(specificByte(safehome.getLon(), 0)); // sbufReadU32(src); // lon - buffer.push(specificByte(safehome.getLon(), 1)); - buffer.push(specificByte(safehome.getLon(), 2)); - buffer.push(specificByte(safehome.getLon(), 3)); + buffer.push(BitHelper.specificByte(safehome.getLat(), 0)); // sbufReadU32(src); // lat + buffer.push(BitHelper.specificByte(safehome.getLat(), 1)); + buffer.push(BitHelper.specificByte(safehome.getLat(), 2)); + buffer.push(BitHelper.specificByte(safehome.getLat(), 3)); + buffer.push(BitHelper.specificByte(safehome.getLon(), 0)); // sbufReadU32(src); // lon + buffer.push(BitHelper.specificByte(safehome.getLon(), 1)); + buffer.push(BitHelper.specificByte(safehome.getLon(), 2)); + buffer.push(BitHelper.specificByte(safehome.getLon(), 3)); } else { buffer = Array(10).fill(0); buffer[0] = safehomeId; diff --git a/js/serialPortHelper.js b/js/serialPortHelper.js index cd5315fa..d6bdbf18 100644 --- a/js/serialPortHelper.js +++ b/js/serialPortHelper.js @@ -1,8 +1,10 @@ 'use strict'; -var helper = helper || {}; +const FC = require('./fc'); +const i18n = require('./localization'); +const bitHelper = require('./bitHelper'); -helper.serialPortHelper = (function () { +const serialPortHelper = (function () { let publicScope = {}, privateScope = {}; @@ -209,7 +211,7 @@ helper.serialPortHelper = (function () { } for (var i = 0; i < privateScope.rules.length; i++) { - privateScope.rules[i].displayName = chrome.i18n.getMessage('portsFunction_' + privateScope.rules[i].name); + privateScope.rules[i].displayName = i18n.getMessage('portsFunction_' + privateScope.rules[i].name); } privateScope.namesGenerated = true; @@ -242,7 +244,7 @@ helper.serialPortHelper = (function () { let key = functions[index]; let bitIndex = privateScope.functionIDs[key]; if (bitIndex >= 0) { - mask = bit_set(mask, bitIndex); + mask = bitHelper.bit_set(mask, bitIndex); } } return mask; @@ -260,7 +262,7 @@ helper.serialPortHelper = (function () { for (let index = 0; index < keys.length; index++) { let key = keys[index]; let bit = privateScope.functionIDs[key]; - if (bit_check(mask, bit)) { + if (bitHelper.bit_check(mask, bit)) { functions.push(key); } } @@ -274,8 +276,8 @@ helper.serialPortHelper = (function () { publicScope.getPortIdentifiersForFunction = function (functionName) { let identifiers = []; - for (let index = 0; index < SERIAL_CONFIG.ports.length; index++) { - let config = SERIAL_CONFIG.ports[index]; + for (let index = 0; index < FC.SERIAL_CONFIG.ports.length; index++) { + let config = FC.SERIAL_CONFIG.ports[index]; if (config.functions.indexOf(functionName) != -1) { identifiers.push(config.identifier); } @@ -288,8 +290,8 @@ helper.serialPortHelper = (function () { let list = []; - for (let index = 0; index < SERIAL_CONFIG.ports.length; index++) { - let config = SERIAL_CONFIG.ports[index]; + for (let index = 0; index < FC.SERIAL_CONFIG.ports.length; index++) { + let config = FC.SERIAL_CONFIG.ports[index]; //exclude USB VCP port if (config.identifier == 20) { @@ -310,8 +312,8 @@ helper.serialPortHelper = (function () { }; publicScope.getPortByIdentifier = function (identifier) { - for (let index = 0; index < SERIAL_CONFIG.ports.length; index++) { - let config = SERIAL_CONFIG.ports[index]; + for (let index = 0; index < FC.SERIAL_CONFIG.ports.length; index++) { + let config = FC.SERIAL_CONFIG.ports[index]; if (config.identifier == identifier) { return config; } @@ -320,8 +322,8 @@ helper.serialPortHelper = (function () { }; publicScope.clearByFunction = function (functionName) { - for (let index = 0; index < SERIAL_CONFIG.ports.length; index++) { - let config = SERIAL_CONFIG.ports[index]; + for (let index = 0; index < FC.SERIAL_CONFIG.ports.length; index++) { + let config = FC.SERIAL_CONFIG.ports[index]; if (config.functions.indexOf(functionName) != -1) { config.functions = []; } @@ -348,4 +350,6 @@ helper.serialPortHelper = (function () { } return publicScope; -})(); \ No newline at end of file +})(); + +module.exports = serialPortHelper; \ No newline at end of file diff --git a/js/serial_backend.js b/js/serial_backend.js index 6e4f126b..e9ef6e2d 100755 --- a/js/serial_backend.js +++ b/js/serial_backend.js @@ -23,8 +23,10 @@ const defaultsDialog = require('./defaults_dialog'); const { SITLProcess } = require('./sitl'); const update = require('./globalUpdates.js'); const BitHelper = require('./bitHelper.js'); -const BOARD = require('./boards.js') -const jBox = require('./libraries/jBox/jBox.min.js') +const BOARD = require('./boards.js'); +const jBox = require('./libraries/jBox/jBox.min.js'); +const groundstation = require('./groundstation.js'); +const ltmDecoder = require('./ltmDecoder.js'); var SerialBackend = (function () { @@ -161,8 +163,8 @@ var SerialBackend = (function () { $('div.connect_controls a.connect').click(function () { - if (helper.groundstation.isActivated()) { - helper.groundstation.deactivate(); + if (groundstation.isActivated()) { + groundstation.deactivate(); } if (GUI.connect_lock != true) { // GUI control overrides the user control @@ -359,31 +361,31 @@ var SerialBackend = (function () { store.set('last_used_bps', CONFIGURATOR.connection.bitrate); store.set('wireless_mode_enabled', $('#wireless-mode').is(":checked")); - CONFIGURATOR.connection.addOnReceiveListener(read_serial); - CONFIGURATOR.connection.addOnReceiveListener(helper.ltmDecoder.read); + CONFIGURATOR.connection.addOnReceiveListener(publicScope.read_serial); + CONFIGURATOR.connection.addOnReceiveListener(ltmDecoder.read); - // disconnect after 10 seconds with error if we don't get IDENT data - helper.timeout.add('connecting', function () { + // disconnect after 10 seconds with error if we don't get IDENT data + timeout.add('connecting', function () { - //As we add LTM listener, we need to invalidate connection only when both protocols are not listening! - if (!CONFIGURATOR.connectionValid && !helper.ltmDecoder.isReceiving()) { - GUI.log(chrome.i18n.getMessage('noConfigurationReceived')); + //As we add LTM listener, we need to invalidate connection only when both protocols are not listening! + if (!CONFIGURATOR.connectionValid && !ltmDecoder.isReceiving()) { + GUI.log(i18n.getMessage('noConfigurationReceived')); - mspQueue.flush(); - mspQueue.freeHardLock(); - mspQueue.freeSoftLock(); - CONFIGURATOR.connection.emptyOutputBuffer(); + mspQueue.flush(); + mspQueue.freeHardLock(); + mspQueue.freeSoftLock(); + CONFIGURATOR.connection.emptyOutputBuffer(); - $('div.connect_controls a').click(); // disconnect - } - }, 10000); + $('div.connect_controls a').click(); // disconnect + } + }, 10000); - //Add a timer that every 1s will check if LTM stream is receiving data and display alert if so - helper.interval.add('ltm-connection-check', function () { - if (helper.ltmDecoder.isReceiving()) { - helper.groundstation.activate($('#main-wrapper')); - } - }, 1000); + //Add a timer that every 1s will check if LTM stream is receiving data and display alert if so + interval.add('ltm-connection-check', function () { + if (ltmDecoder.isReceiving()) { + groundstation.activate($('#main-wrapper')); + } + }, 1000); FC.resetState(); @@ -592,7 +594,7 @@ var SerialBackend = (function () { switch(sensor_code) { case 'acc': case 'gyro': - return BitHelper.check(sensors_detected, 0); + return BitHelper.bit_check(sensors_detected, 0); case 'baro': return BitHelper.bit_check(sensors_detected, 1); case 'mag': diff --git a/js/servoMixRule.js b/js/servoMixRule.js index c79919f7..eeeb18e6 100644 --- a/js/servoMixRule.js +++ b/js/servoMixRule.js @@ -1,4 +1,3 @@ -/*global $*/ 'use strict'; var ServoMixRule = function (target, input, rate, speed, condition) { diff --git a/js/servoMixerRuleCollection.js b/js/servoMixerRuleCollection.js index 5c1c7e78..feefbb6d 100644 --- a/js/servoMixerRuleCollection.js +++ b/js/servoMixerRuleCollection.js @@ -1,6 +1,7 @@ -/*global ServoMixRule*/ 'use strict'; +const ServoMixRule = require('./servoMixRule'); + var ServoMixerRuleCollection = function () { let self = {}, diff --git a/js/settings.js b/js/settings.js index 6a6992b4..72bf5142 100644 --- a/js/settings.js +++ b/js/settings.js @@ -6,6 +6,7 @@ const mspHelper = require('./../js/msp/MSPHelper'); const { GUI } = require('./gui'); const FC = require('./fc'); const { globalSettings, UnitType } = require('./globalSettings'); +const i18n = require('./localization'); function padZeros(val, length) { let str = val.toString(); diff --git a/js/tabs.js b/js/tabs.js index dec0803c..e7e2b98a 100644 --- a/js/tabs.js +++ b/js/tabs.js @@ -17,7 +17,7 @@ self.init = function ($dom) { $container = $dom; - $container.find(".subtab__header_label").on('click',(onHeaderClick); + $container.find(".subtab__header_label").on('click', onHeaderClick); }; return self; diff --git a/js/waypoint.js b/js/waypoint.js index baf5dd2d..729b19b9 100644 --- a/js/waypoint.js +++ b/js/waypoint.js @@ -1,4 +1,3 @@ -/*global $*/ 'use strict'; let Waypoint = function (number, action, lat, lon, alt=0, p1=0, p2=0, p3=0, endMission=0, isUsed=true, isAttached=false, attachedId="", multiMissionIdx = 0) { diff --git a/js/waypointCollection.js b/js/waypointCollection.js index d5d8d8be..58a8fa1e 100644 --- a/js/waypointCollection.js +++ b/js/waypointCollection.js @@ -1,5 +1,9 @@ 'use strict'; +const ol = require('openlayers'); + +const MWNP = require('./mwnp'); +const BitHelper = require('./bitHelper'); let WaypointCollection = function () { @@ -255,24 +259,24 @@ let WaypointCollection = function () { let waypoint = self.getWaypoint(waypointId); buffer.push(waypoint.getNumber()); // sbufReadU8(src); // number buffer.push(waypoint.getAction()); // sbufReadU8(src); // action - buffer.push(specificByte(waypoint.getLat(), 0)); // sbufReadU32(src); // lat - buffer.push(specificByte(waypoint.getLat(), 1)); - buffer.push(specificByte(waypoint.getLat(), 2)); - buffer.push(specificByte(waypoint.getLat(), 3)); - buffer.push(specificByte(waypoint.getLon(), 0)); // sbufReadU32(src); // lon - buffer.push(specificByte(waypoint.getLon(), 1)); - buffer.push(specificByte(waypoint.getLon(), 2)); - buffer.push(specificByte(waypoint.getLon(), 3)); - buffer.push(specificByte(waypoint.getAlt(), 0)); // sbufReadU32(src); // to set altitude (cm) - buffer.push(specificByte(waypoint.getAlt(), 1)); - buffer.push(specificByte(waypoint.getAlt(), 2)); - buffer.push(specificByte(waypoint.getAlt(), 3)); - buffer.push(lowByte(waypoint.getP1())); //sbufReadU16(src); // P1 speed or landing - buffer.push(highByte(waypoint.getP1())); - buffer.push(lowByte(waypoint.getP2())); //sbufReadU16(src); // P2 - buffer.push(highByte(waypoint.getP2())); - buffer.push(lowByte(waypoint.getP3())); //sbufReadU16(src); // P3 - buffer.push(highByte(waypoint.getP3())); + buffer.push(BitHelper.specificByte(waypoint.getLat(), 0)); // sbufReadU32(src); // lat + buffer.push(BitHelper.specificByte(waypoint.getLat(), 1)); + buffer.push(BitHelper.specificByte(waypoint.getLat(), 2)); + buffer.push(BitHelper.specificByte(waypoint.getLat(), 3)); + buffer.push(BitHelper.specificByte(waypoint.getLon(), 0)); // sbufReadU32(src); // lon + buffer.push(BitHelper.specificByte(waypoint.getLon(), 1)); + buffer.push(BitHelper.specificByte(waypoint.getLon(), 2)); + buffer.push(BitHelper.specificByte(waypoint.getLon(), 3)); + buffer.push(BitHelper.specificByte(waypoint.getAlt(), 0)); // sbufReadU32(src); // to set altitude (cm) + buffer.push(BitHelper.specificByte(waypoint.getAlt(), 1)); + buffer.push(BitHelper.specificByte(waypoint.getAlt(), 2)); + buffer.push(BitHelper.specificByte(waypoint.getAlt(), 3)); + buffer.push(BitHelper.lowByte(waypoint.getP1())); //sbufReadU16(src); // P1 speed or landing + buffer.push(BitHelper.highByte(waypoint.getP1())); + buffer.push(BitHelper.lowByte(waypoint.getP2())); //sbufReadU16(src); // P2 + buffer.push(BitHelper.highByte(waypoint.getP2())); + buffer.push(BitHelper.lowByte(waypoint.getP3())); //sbufReadU16(src); // P3 + buffer.push(BitHelper.highByte(waypoint.getP3())); buffer.push(waypoint.getEndMission()); //sbufReadU8(src); // future: to set nav flag return buffer; diff --git a/locale/de/messages.json b/locale/de/messages.json deleted file mode 100644 index e1eb4764..00000000 --- a/locale/de/messages.json +++ /dev/null @@ -1,5495 +0,0 @@ -{ - "translation_version": { - "message": "0" - }, - "language": { - "message": "Sprache" - }, - "language_de": { - "message": "Deutsch", - "comment": "Don't translate!" - }, - "language_en": { - "message": "English", - "comment": "Don't translate!" - }, - "options_title": { - "message": "Anwendungs Optionen" - }, - "options_receive_app_notifications": { - "message": "Empfange Desktop Benachrichtigungen bei Anwendungsupdates" - }, - "options_improve_configurator": { - "message": "Anonyme Nutzerstatisiken an die Entwickler senden" - }, - "options_showProfileParameters": { - "message": "Hervorhebung von Parametern, die sich beim Wechsel von Akku- oder Steuerprofilen ändern" - }, - "options_cliAutocomplete": { - "message": "Erweiterte CLI Autovervollständigung" - }, - "options_unit_type": { - "message": "Darstellung der Einheiten im Configurator (Hat keinen Einfluss z.B. auf das OSD)" - }, - "options_render": { - "message": "Configurator Darstellungsoptionen" - }, - "unexpectedError" : { - "message": "Unerwarteter Fehler: $1" - }, - "disconnecting": { - "message": "Trennen der Verbindung..." - }, - "connect": { - "message": "Verbinden" - }, - "connecting": { - "message": "Verbinde" - }, - "disconnect": { - "message": "Trennen" - }, - "autoConnect": { - "message": "Automatisches Verbinden" - }, - "autoConnectEnabled": { - "message": "Automatisches Verbinden: Aktiviert - Configurator versucht automatisch eine Verbindung herzustellen, wenn ein neuer Port erkannt wird" - }, - "autoConnectDisabled": { - "message": "Automatisches Verbinden: Deaktiviert - Der Benutzer muss den richtigen seriellen Anschluss auswählen und selbst auf die Schaltfläche \"Verbinden\" klicken." - }, - "deviceRebooting": { - "message": "Gerät - Startet neu" - }, - "deviceReady": { - "message": "Gerät - Bereit" - }, - "savingDefaults": { - "message": "Gerät - Speichern der Standardeinstellungen" - }, - "fcNotConnected": { - "message": "Nicht verbunden" - }, - "documentation": { - "message": "Dokumentation" - }, - "tabFirmwareFlasher": { - "message": "Firmware Flasher" - }, - "tabLanding": { - "message": "Wilkommen" - }, - "tabHelp": { - "message": "Dokumentation & Support" - }, - "tabSetup": { - "message": "Setup" - }, - "tabCalibration": { - "message": "Kalibrierung" - }, - "tabConfiguration": { - "message": "Konfiguration" - }, - "tabPorts": { - "message": "Ports" - }, - "tabPidTuning": { - "message": "PID-Abstimmung" - }, - "tabReceiver": { - "message": "Empfänger" - }, - "tabMisc": { - "message": "Sonstiges" - }, - "tabModeSelection": { - "message": "Modusauswahl" - }, - "tabServos": { - "message": "Servos" - }, - "tabFailsafe": { - "message": "Failsafe" - }, - "tabEzTune": { - "message": "Ez Tune" - }, - "tabGPS": { - "message": "GPS" - }, - "tabOutputs": { - "message": "Ausgänge" - }, - "tabLedStrip": { - "message": "LED Strip" - }, - "tabRawSensorData": { - "message": "Sensoren" - }, - "tabCLI": { - "message": "CLI" - }, - "tabLogging": { - "message": "Gebundene Protokollierung" - }, - "tabOnboardLogging": { - "message": "Blackbox" - }, - "tabAdjustments": { - "message": "Anpassungen" - }, - "tabAuxiliary": { - "message": "Modi" - }, - "tabSitl": { - "message" : "SITL" - }, - "sitlDemoMode": { - "message": "Demo-Modus" - }, - "sitlResetDemoModeData": { - "message": "Demo-Modus zurücksetzen" - }, - "sitlOSNotSupported": { - "message": "SITL wird von diesem Betriebssystem nicht unterstützt." - }, - "sitlOptions": { - "message": "SITL Optionen" - }, - "sitlEnableSim": { - "message": "Simulator aktivieren" - }, - "sitlSimulator": { - "message": "Simulator" - }, - "sitlUseImu": { - "message": "IMU nutzen" - }, - "sitlSimIP": { - "message" : "Simulator IP" - }, - "sitlPort": { - "message" : "Simulator Port" - }, - "sitlChannelMap": { - "message": "Channel Mapping" - }, - "sitlSimInput": { - "message": "Simulator Input" - }, - "sitlInavOutput": { - "message": "INAV Output" - }, - "sitlLog": { - "message": "Log" - }, - "sitlStart": { - "message": "Start" - }, - "sitlStop": { - "message": "Stop" - }, - "sitlStopped": { - "message": "SITL stopped\n" - }, - "sitlProfiles": { - "message": "SITL Profiles" - }, - "sitlNew": { - "message": "Neu" - }, - "sitlSave": { - "message": "Speichern" - }, - "sitlDelete": { - "message": "Löschen" - }, - "sitlNewProfile": { - "message": "Neues SITL Profile" - }, - "sitlEnterName": { - "message": "(Profile Name)" - }, - "sitlProfileExists": { - "message": "Ein Profil mit diesem Namen existiert bereits." - }, - "sitlStdProfileCantDeleted": { - "message": "Das SITL-Standardprofil kann nicht gelöscht werden." - }, - "sitlStdProfileCantOverwritten": { - "message": "Das SITL-Standardprofil kann nicht überschrieben werden. Bitte erstellen Sie ein neues Profil." - }, - "sitlSerialToTCP": { - "message": "Seriell zu TCP (UART)" - }, - "sitlSerialProtocoll": { - "message": "Voreinstellung für RX Protocoll" - }, - "sitlSerialStopbits": { - "message": "Stopbits" - }, - "sitlSerialPort": { - "message": "Serieller port" - }, - "sitlSerialTCPPort": { - "message": "TCP port" - }, - "sitlSerialParity": { - "message": "Parity" - }, - "sitlSerialTcpEnable": { - "message": "Aktiv" - }, - "sitlHelp": { - "message": "SITL (Software in the loop) ermöglicht es, INAV komplett in Software auf dem PC zu betreiben, ohne einen Flugcontroller zu verwenden und komplette FPV-Flüge zu simulieren. Dazu wird INAV mit einem normalen PC-Compiler kompiliert. Die Sensoren werden durch Daten aus einem Simulator ersetzt.
Derzeit werden unterstützt:
" - }, - "sitlProfilesHelp": { - "message": "Profile werden lokal gespeichert. Die Profile enthalten nicht nur alle Daten dieser Tab, sondern auch die Konfigurationsdatei \"EEPROM\" von INAV selbst.
Anmerkung:
Standardprofile können nicht überschrieben werden. Um Ihre Änderungen zu speichern, erstellen Sie ein neues Profil." - }, - "sitlEnableSimulatorHelp": { - "message": "Wenn diese Option deaktiviert ist, könen nur UARTS (MSP/Configurator) verwendet werden. Nützlich, um INAV zu konfigurieren, ohne den Simulator starten zu müssen." - }, - "sitlUseImuHelp": { - "message": "Verwenden Sie IMU-Sensordaten aus dem Simulator, anstatt direkt Lagedaten aus dem Simulator zu verwenden (experimentell, nicht empfohlen)." - }, - "sitlIpHelp": { - "message": "IP-Adresse des Computers, auf dem der Simulator läuft. Wenn der Simulator auf demselben Computer läuft, belassen Sie es bei \"127.0.0.1\"" - }, - "sitlPortHelp": { - "message": "Portnummer der Schnittstelle des Simulators. Hinweis: Der RealFlight-Port ist fest vorgegeben und kann nicht geändert werden." - }, - "sitlSer2TcpHelp": { - "message": "Geräte mit einer UART-Schnittstelle können mit SITL über einen Seriell-zu-USB-Konverter verwendet werden. Speziell für serielle Empfänger gedacht, um die volle Anzahl von Kanälen zu nutzen. " - }, - "auxiliaryAcroEnabled": { - "message": "ACRO" - }, - "serialPortOpened": { - "message": "MSP-Verbindung erfolgreich geöffnet mit ID: $1" - }, - "serialPortOpenFail": { - "message": "MSP-Verbindung konnte nicht geöffnet werden" - }, - "serialPortClosedOk": { - "message": "MSP-Verbindung erfolgreich geschlossen" - }, - "serialPortClosedFail": { - "message": "MSP-Verbindung konnte nicht geschlossen werden " - }, - "serialPortUnrecoverable": { - "message": "Unbehebbarer Fehler der seriellen Verbindung, Trenne die Verbindung..." - }, - "connectionConnected": { - "message": "Verbunden mit: $1" - }, - "connectionBleType": { - "message": "BLE-Gerätetyp: $1" - }, - "connectionBleNotSupported": { - "message": "Verbindungsfehler Die Firmware unterstützt keine BLE-Verbindungen. Abbruch." - }, - "connectionBleInterrupted": { - "message": "Die Verbindung wurde unerwartet unterbrochen." - }, - "connectionBleError": { - "message": "Fehler beim Öffnen des BLE-Geräts: $1" - }, - "connectionBleCliEnter": { - "message": "Verbindung über BLE aktiv, die Ausgabe kann langsamer sein als üblich." - }, - "connectionUdpTimeout": { - "message": "UDP-Verbindung wurde aufgrund einer Zeitüberschreitung unterbrochen." - }, - "usbDeviceOpened": { - "message": "USB-Gerät erflogreich geöffnet" - }, - "usbDeviceOpenFail": { - "message": "USB-Gerät konnte nicht geöffnet werden!" - }, - "usbDeviceClosed": { - "message": "USB-Gerät erfolgreich geschlossen." - }, - "usbDeviceCloseFail": { - "message": "USB-Gerät konnte nicht geschlossen werden." - }, - "usbDeviceUdevNotice": { - "message": "Sind die udev-Regeln korrekt installiert? Siehe Dokumentationen für Anweisungen" - }, - "stm32UsbDfuNotFound": { - "message": "USB DFU nicht gefunden" - }, - "stm32RebootingToBootloader": { - "message": "Initiiere Neustart in den Bootloader ..." - }, - "stm32RebootingToBootloaderFailed": { - "message": "Neustart des Geräts in den Bootloader: FEHLGESCHLAGEN" - }, - "stm32TimedOut": { - "message": "STM32 - Zeitüberschreitung, Programmierung: FEHLGESCHLAGEN" - }, - "stm32WrongResponse": { - "message": "STM32 Kommunikation fehlgeschlagen, falsche Antwort, erwartet: $1 (0x$2) empfangen: $3 (0x$4)" - }, - "stm32ContactingBootloader": { - "message": "Kontakt zum bootloader ..." - }, - "stm32ContactingBootloaderFailed": { - "message": "Kommunikation mit Bootloader fehlgeschlagen" - }, - "stm32ResponseBootloaderFailed": { - "message": "Keine Antwort des Bootloaders. Programmierung fehlgeschlagen" - }, - "stm32GlobalEraseExtended": { - "message": "Allgemeiner Chip-Löschvorgang (über Extended Erase) ..." - }, - "stm32LocalEraseExtended": { - "message": "Lokaler Chip-Löschvorgang (über Extended Erase) ..." - }, - "stm32GlobalErase": { - "message": "Allgemeiner Chip-Löschvorgang ..." - }, - "stm32LocalErase": { - "message": "Lokaler Chip-Löschvorgang ..." - }, - "stm32InvalidHex": { - "message": "Ungültige HEX-Datei" - }, - "stm32Erase": { - "message": "Löschen ..." - }, - "stm32Flashing": { - "message": "Flashing ..." - }, - "stm32Verifying": { - "message": "Überprüfung ..." - }, - "stm32ProgrammingSuccessful": { - "message": "Programmieren: ERFOLGREICH" - }, - "stm32ProgrammingFailed": { - "message": "Programmieren: FEHLGESCHLAGEN" - }, - "stm32AddressLoadFailed": { - "message": "Das Laden der Adresse für den Sektor mit den Optionsbytes ist fehlgeschlagen. Sehr wahrscheinlich aufgrund des Leseschutzes." - }, - "stm32AddressLoadSuccess": { - "message": "Adresse für Optionsbytes-Sektor erfolgreich geladen." - }, - "stm32AddressLoadUnknown": { - "message": "Das Laden der Adresse für den Optionsbyte-Sektor ist mit einem unbekannten Fehler fehlgeschlagen. Abbruch." - }, - "stm32NotReadProtected": { - "message": "Leseschutz nicht aktiv" - }, - "stm32ReadProtected": { - "message": "Die Platine scheint geschützt zu sein. Aufheben des Schutzes. Nicht abtrennen/ausstecken!" - }, - "stm32UnprotectSuccessful": { - "message": "Aufhebung des Schutzes erfolgreich." - }, - "stm32UnprotectUnplug": { - "message": "AKTION ERFORDERLICH: Ziehen Sie den Stecker ab und schließen Sie den Flugcontroller im DFU-Modus wieder an, um das Flashen erneut zu versuchen!" - }, - "stm32UnprotectFailed": { - "message": "Der Schutz der Karte wurde nicht aufgehoben" - }, - "stm32UnprotectInitFailed": { - "message": "Schutzaufhebungsroutine konnte nicht eingeleitet werden" - }, - - "noConfigurationReceived": { - "message": "Keine Konfiguration innerhalb von 10 Sekunden empfangen, Kommunikation fehlgeschlagen" - }, - "firmwareVersionNotSupported": { - "message": "Diese Firmware-Version wird nicht unterstützt. Diese Version von Configurator unterstützt Firmware von $1 bis $2 (ausgeschlossen)" - }, - "firmwareVariantNotSupported": { - "message": "Diese Firmware-Variante wird nicht unterstützt. Bitte aktualisieren Sie auf INAV-Firmware. Verwenden Sie CLI für die Sicherung vor dem Flashen. Das Verfahren zur Sicherung/Wiederherstellung per CLI finden Sie in der Dokumentation." - }, - - "tabSwitchConnectionRequired": { - "message": "Sie müssen eine Verbindung herstellen, bevor Sie eine der Tabs anzeigen können." - }, - "tabSwitchWaitForOperation": { - "message": "Sie können das jetzt nichtmachen, bitte warten Sie, bis der aktuelle Vorgang beendet ist ..." - }, - - "tabSwitchUpgradeRequired": { - "message": "Sie müssen Ihre Firmware aktualisieren, bevor Sie den Tab $1 verwenden können." - }, - "firmwareVersion": { - "message": "Firmware Version: $1" - }, - "apiVersionReceived": { - "message": "MultiWii API version empfangen - $1" - }, - "uniqueDeviceIdReceived": { - "message": "Eindeutige Geräte-ID empfangen - 0x$1" - }, - "boardInfoReceived": { - "message": "Board: $1, Version: $2" - }, - "buildInfoReceived": { - "message": "Laufende Firmware veröffentlicht am: $1" - }, - "fcInfoReceived": { - "message": "Flugcontroller Info, Kennung: $1, Version: $2" - }, - - "notifications_app_just_updated_to_version": { - "message": "Die Anwendung wurde soeben aktualisiert auf: $1" - }, - "notifications_click_here_to_start_app": { - "message": "Klicken Sie hier, um die Anwendung zu starten" - }, - - "statusbar_port_utilization": { - "message": "Port Nutzung:" - }, - "statusbar_usage_download": { - "message": "D: $1%" - }, - "statusbar_usage_upload": { - "message": "U: $1%" - }, - "statusbar_packet_error": { - "message": "Packet-Fehler:" - }, - "statusbar_i2c_error": { - "message": "I2C-FEhler:" - }, - "statusbar_cycle_time": { - "message": "Zykluszeit:" - }, - "statusbar_cpu_load": { - "message": "CPU-Belastung: $1%" - }, - "statusbar_arming_flags": { - "message": "Arming Flags:" - }, - - "dfu_connect_message": { - "message": "Bitte verwenden Sie den Firmware Flasher, um auf DFU-Geräte zuzugreifen" - }, - "dfu_erased_kilobytes": { - "message": "$1 kB Flash erfolgreich gelöscht" - }, - "dfu_device_flash_info": { - "message": "Erkanntes Gerät mit Gesamt-Flashgröße $1 kiB" - }, - "dfu_error_image_size": { - "message": "Fehler: Das geladene Image ist größer als der auf dem Chip verfügbare Flash-Speicher! Bild: $1 kiB, Grenze = $2 kiB" - }, - - "eeprom_saved_ok": { - "message": "EEPROM gespeichert" - }, - - "defaultWelcomeIntro": { - "message": "Willkommen bei INAV - Configurator, einem Tool, das die Aktualisierung, Konfiguration und Einstellung Ihres Flugcontrollers vereinfacht." - }, - "defaultWelcomeHead": { - "message": "Firmware & Treiber" - }, - "defaultWelcomeHead2": { - "message": "INAV Feunde" - }, - "defaultWelcomeText2": { - "message": "INAV wird von einer großen Gemeinschaft von Benutzern, Entwicklern und Unternehmen unterstützt. Hier ist eine kurze Liste: Mateksys, SpeedyBee, GEPRC. " - }, - "defaultWelcomeText": { - "message": "Der Firmware-Quellcode kann heruntergeladen werden hier.
Das neueste binäre Firmware-Image ist verfügbar hier.

Neueste STM USB VCP Treiber können heruntergeladen werden hier.
Neueste Zadig Version für das flashen über DFU in Windows hier.
" - }, - "defaultContributingHead": { - "message": "Beitragen" - }, - "defaultContributingText": { - "message": "Wenn Sie dazu beitragen möchten, INAV noch besser zu machen, können Sie auf verschiedene Arten helfen, zum Beispiel:
" - }, - "defaultChangelogHead": { - "message": "Configurator - Changelog" - }, - "defaultButtonFirmwareFlasher": { - "message": "Firmware Flasher" - }, - "defaultDonateHead": { - "message": "Open Source / Spendenhinweis" - }, - "defaultDonateText": { - "message": "Dieses Tool ist vollständig quelloffen und steht allen INAV users.
Nutzern kostenlos zur Verfügung. Wenn Sie INAV oder den INAV Configurator nützlich finden, ziehen Sie bitte in Erwägung, seine Entwicklung durch eine Spende zu unterstützen." - }, - "defaultSponsorsHead": { - "message": "INAV wird unterstützt von" - }, - "communityRCGroupsSupport": { - "message": "RC Groups Unterstützung" - }, - "communityDiscordServer": { - "message": "Discord Server" - }, - "communitySlackSupport": { - "message": "Slack Support Live Chat" - }, - "communityTelegramSupport": { - "message": "Telegram Kanal" - }, - "communityFacebookSupport": { - "message": "Facebook Gruppe" - }, - "initialSetupButtonReset": { - "message": "Einstellungen zurücksetzen" - }, - "initialSetupResetText": { - "message": "Einstellungen auf Standardwerte zurücksetzen" - }, - "initialSetupButtonResetZaxis": { - "message": "Z-Achse zurücksetzen, Offset: 0 Grad" - }, - "initialSetupButtonResetZaxisValue": { - "message": "Z-Achse zurücksetzen, Offset: $0 Grad" - }, - "initialSetupInfoHead": { - "message": "Info" - }, - "initialSetupBatteryVoltage": { - "message": "Akkuspannung:" - }, - "initialSetupBatteryDetectedCells": { - "message": "Anzahl der erkannten Akkuzellen:" - }, - "initialSetupBatteryDetectedCellsValue": { - "message": "$1" - }, - "initialSetupBatteryPercentage": { - "message": "Akku verbleibend:" - }, - "initialSetupBatteryPercentageValue": { - "message": "$1 %" - }, - "initialSetupBatteryRemainingCapacity": { - "message": "Verbleibende Akkukapazität" - }, - "initialSetupBatteryRemainingCapacityValue": { - "message": "$1 $2" - }, - "initialSetupBatteryFull": { - "message": "Akku voll, wenn eingesteckt" - }, - "initialSetupBatteryFullValue": { - "message": "$1" - }, - "initialSetupBatteryThresholds": { - "message": "Schwellenwerte für die Akkuverwendung" - }, - "initialSetupBatteryThresholdsValue": { - "message": "$1" - }, - "initialSetup_Wh_drawn": { - "message": "Verbrauchte Kapazität:" - }, - "initialSetup_Wh_drawnValue": { - "message": "$1 Wh" - }, - "initialSetupBatteryVoltageValue": { - "message": "$1 V" - }, - "initialSetupDrawn": { - "message": "Verbrauchte Kapazität:" - }, - "initialSetupCurrentDraw": { - "message": "Stromaufnahme:" - }, - "initialSetupPowerDraw": { - "message": "Leistungsaufnahme:" - }, - "initialSetupPowerDrawValue": { - "message": "$1 W" - }, - "initialSetupBatteryMahValue": { - "message": "$1 mAh" - }, - "initialSetupCurrentDrawValue": { - "message": "$1 A" - }, - "initialSetupRSSI": { - "message": "RSSI:" - }, - "initialSetupRSSIValue": { - "message": "$1 %" - }, - "initialSetupGPSHead": { - "message": "GPS" - }, - "initialSetupInstrumentsHead": { - "message": "Instrumente" - }, - "initialSetupButtonSave": { - "message": "Speichern" - }, - "initialSetupModel": { - "message": "Modell: $1" - }, - "initialSetupAttitude": { - "message": "$1 Grad" - }, - "initialSetupAccelCalibStarted": { - "message": "Beschleunigungssensor-Kalibrierung gestartet" - }, - "initialSetupAccelCalibEnded": { - "message": "Beschleunigungssensor-Kalibrierung beendet" - }, - "initialSetupMagCalibStarted": { - "message": "Magnetometerkalibrierung gestartet" - }, - "initialSetupMagCalibEnded": { - "message": "Magnetometerkalibrierung beendet" - }, - "initialSetupOpflowCalibStarted": { - "message": "Kalibrierung des optischen Flusses gestartet" - }, - "initialSetupOpflowCalibEnded": { - "message": "Kalibrierung des optischen Flusses beendet" - }, - "initialSetupSettingsRestored": { - "message": "Einstellungen auf default" - }, - "initialSetupEepromSaved": { - "message": "EEPROM Standardwerte zurückgesetzt: Setup" - }, - - "RX_SERIAL": { - "message": "Seriell basierte Empfänger (SPEKSAT, SBUS, SUMD)" - }, - "RX_MSP": { - "message": "MSP RX Eingang (Steuerung über MSP port)" - }, - "RX_SPI": { - "message": "RX SPI basierte Empfänger (NRF24L01, RFM22)" - }, - "RX_NONE": { - "message": "Kein Empfänger" - }, - - "featureVBAT": { - "message": "Überwachung der Akkuspannung" - }, - "featureTX_PROF_SEL": { - "message": "Profilauswahl mit TX-Knüppelbefehl" - }, - "featureINFLIGHT_ACC_CAL": { - "message": "Lagekalibrierung während des Fluges" - }, - "featureMOTOR_STOP": { - "message": "Motoren bei niedrigem Gas anhalten" - }, - "featureSERVO_TILT": { - "message": "Servo Gimbal" - }, - "featureBAT_PROFILE_AUTOSWITCH": { - "message": "Automatische Auswahl des Akkuprofils" - }, - "featureBAT_PROFILE_AUTOSWITCHTip": { - "message": "Automatisch das Akkuprofil anhand der Akkuspannung auswählen, wenn der Akku eingesteckt ist" - }, - "featureTHR_VBAT_COMP": { - "message": "Gas/Spannungs Kompensation" - }, - "featureTHR_VBAT_COMPTip": { - "message": "Automatische Kompensation des Spannungsabfalls beim Entladen des Akkus, um den Schub relativ zum Gas konstant zu halten" - }, - "featureSOFTSERIAL": { - "message": "CPU-basierte serielle Ports" - }, - "featureSOFTSERIALTip": { - "message": "Konfigurieren Sie nach der Aktivierung die Ports im Ports Tab." - }, - "featureGPS": { - "message": "GPS für Navigation und Telemetrie" - }, - "featureGPSTip": { - "message": "Konfigurieren Sie zuert die Ports" - }, - "featureFAILSAFE": { - "message": "Failsafe-Einstellungen bei RX-Signalverlust anwenden" - }, - "featureSONAR": { - "message": "Sonar" - }, - "featureTELEMETRY": { - "message": "Telemetrie-Ausgang" - }, - "featureCURRENT_METER": { - "message": "Überwachung des Akkustroms" - }, - "featureREVERSIBLE_MOTORS": { - "message": "Umkehrbarer Motormodus (zur Verwendung mit umkehrbaren ESCs)" - }, - "featureRSSI_ADC": { - "message": "Analoger RSSI-Eingang" - }, - "featureLED_STRIP": { - "message": "Unterstützung mehrfarbiger RGB-LED-Streifen" - }, - "featureDASHBOARD": { - "message": "OLED-Bildschirm Anzeige" - }, - "featureONESHOT125": { - "message": "ONESHOT ESC Unterstützung" - }, - "featureONESHOT125Tip": { - "message": "Trennen Sie den Flugakku und entfernen Sie die Propeller vor der Aktivierung." - }, - "featurePWM_OUTPUT_ENABLE": { - "message": "Motor- und Servoausgang aktivieren" - }, - "featurePWM_OUTPUT_ENABLETip": { - "message": "Das Aktivieren dieser Option ist erforderlich, damit INAV Signale an den Regler senden kann. Dies ist eine Sicherheitsvorkehrung, die verhindert, dass Servos direkt nach dem Flashen des Flugcontrollers beschädigt werden." - }, - "featureBLACKBOX": { - "message": "Blackbox-Flugdatenschreiber" - }, - "featureBLACKBOXTip": { - "message": "Konfigurieren Sie über den Tab BlackBox nach der Aktivierung." - }, - "onboardLoggingBlackbox": { - "message": "Blackbox-Aufzeichnungsgerät" - }, - "onboardLoggingBlackboxRate": { - "message": "Anteil der zu protokollierenden Iterationen der Loop Rate (Protokollierungsrate)" - }, - "featureCHANNEL_FORWARDING": { - "message": "Weiterleitung von Aux-Kanälen an Servoausgänge" - }, - "featureSOFTSPI": { - "message": "CPU basieter SPI" - }, - "featurePWM_SERVO_DRIVER": { - "message": "Externer PWM-Servo-Treiber" - }, - "featurePWM_SERVO_DRIVERTip": { - "message": "Verwenden Sie einen externen PCA9685 PMW-Treiber, um bis zu 16 Servos an den Flugcontroller anzuschließen. PCA9685 muss angeschlossen sein, um diese Funktion zu aktivieren." - }, - "featureRSSI_ADCTip": { - "message": "RSSI ist eine Messung der Signalstärke und ist sehr praktisch, damit Sie wissen, wann Ihr Flugzeug die Reichweite verlässt oder ob es unter HF-Störungen leidet.." - }, - "featureOSD": { - "message": "OSD" - }, - "featureAIRMODE": { - "message": "Permanent aktivierter AIRMODE" - }, - "featureFW_LAUNCH": { - "message": "Dauerhaft aktivierter Startmodus für Starrflügler" - }, - "featureFW_AUTOTRIM": { - "message": "Dauerhaft aktivierter Servotrim für Starrflügler" - }, - "featureFW_AUTOTRIMTip": { - "message": "Wenn Sie im stabilisierten Modus fliegen, stellen Sie die Servo-Mittelpunkte kontinuierlich so ein, dass das Flugzeug beim Umschalten auf den manuellen Modus gerade fliegt. Erfordert GPS." - }, - "featureDYNAMIC_FILTERS": { - "message": "Dynamische Kreiselfilter" - }, - "featureDYNAMIC_FILTERSTip": { - "message": "Verwenden Sie die automatische FFT-Kreiselanalyse, um Kerbfilter zur Dämpfung von Kreiselgeräuschen einzurichten. Sollte immer aktiviert sein!" - }, - "configurationFeatureEnabled": { - "message": "Aktiviert" - }, - "configurationFeatureName": { - "message": "Feature" - }, - "configurationFeatureDescription": { - "message": "Beschreibung" - }, - "configurationMixer": { - "message": "Mischer" - }, - "configurationFeatures": { - "message": "Sonstige Features" - }, - "configurationReceiver": { - "message": "Empfängermodus" - }, - "configurationRSSI": { - "message": "RSSI (Signalstärke)" - }, - "configurationEscFeatures": { - "message": "ESC/Motor Features" - }, - "serialrx_inverted": { - "message": "Serieller Anschluss invertiert (Passend zur Protokollvorgabe)" - }, - "serialrx_halfduplex": { - "message": "Serieller Empfänger halb-duplex" - }, - "configurationFeaturesHelp": { - "message": "Hinweis: Nicht alle Kombinationen von Funktionen sind gültig. Wenn die Flugcontroller-Firmware ungültige Kombinationen erkennt, werden betreffende Kombinationen deaktiviert.
HInweis:Konfigurieren Sie die seriellen Ports, bevor sie die Funktionen aktivieren, die die Ports verwenden sollen." - }, - "configurationSerialRXHelp": { - "message": "Hinweis: Vergessen Sie nicht, einen seriellen Anschluss (über den Tab Ports) für den seriellen Empfänger zu konfigurieren." - }, - "configurationSensorAlignmentMag": { - "message": "MAG Ausrichtung" - }, - "configurationSensorAlignmentMagRoll": { - "message": "Rollen" - }, - "configurationSensorAlignmentMagPitch": { - "message": "Neigen" - }, - "configurationSensorAlignmentMagYaw": { - "message": "Gieren" - }, - "configurationAccelTrims": { - "message": "Beschleunigungsmesser Trimmung" - }, - "configurationAccelTrimRoll": { - "message": "Beschleunigungsmesser Rolltrimmung" - }, - "configurationAccelTrimPitch": { - "message": "Beschleunigungsmesser Neigungstrimmung" - }, - "configurationMagDeclination": { - "message": "Magnetometer Neigung [Grad]" - }, - "configurationAutoDisarmDelay": { - "message": "Sekunden bis zum Disarm wegen zu geringem Gas" - }, - "configurationAutoDisarmDelayHelp": { - "message": "Wird nur für Knüppel-Arming verwendet (d.h. nicht über einen Schalter)" - }, - "configurationThrottleMinimum": { - "message": "Minimum Gas" - }, - "configurationThrottleMid": { - "message": "Mittel Gas [RC-Eingänge Mittelwert]" - }, - "configurationThrottleMaximum": { - "message": "Maximum Gas" - }, - "configurationThrottleMinimumCommand": { - "message": "Minimum Kommando" - }, - "configurationVoltageCurrentSensor": { - "message": "Spannungs- und Stromsensoren" - }, - "configurationBatteryCurrent": { - "message": "Akku-Strom" - }, - "configurationVoltageSource": { - "message": "Spannungsquelle für Alarme und Telemetrie" - }, - "configurationVoltageSourceHelp": { - "message": "Die Rohspannung ist die direkt an der Akku abgelesene Spannung. Sag-kompensierte Spannung ist die berechnete Spannung, die der Akku ohne Last haben sollte (simuliert die ideale Akku und sollte falsche Alarme durch hohe Lasten vermeiden)." - }, - "configurationBatteryCells": { - "message": "Anzahl der Zellen (0 = automatisch)" - }, - "configurationBatteryCellsHelp": { - "message": "Stellen Sie diesen Wert auf die Anzahl der Zellen Ihres Akkus ein, um die automatische Erkennung der Zellenzahl zu deaktivieren oder um das automatische Umschalten von Akkuprofilen zu ermöglichen. 7S, 9S und 11S Akkus können nicht automatisch erkannt werden." - }, - "configurationBatteryCellDetectVoltage": { - "message": "Maximale Zellenspannung für die Zellenzahlerfassung" - }, - "configurationBatteryCellDetectVoltageHelp": { - "message": "Maximale Zellenspannung, die für die automatische Erkennung der Zellenzahl verwendet wird. Sollte höher als die maximale Zellenspannung sein, um eine mögliche Drift der gemessenen Spannung zu berücksichtigen und eine genaue Erkennung der Zellenzahl zu gewährleisten." - }, - "configurationBatteryMinimum": { - "message": "Minimale Zellenspannung" - }, - "configurationBatteryMaximum": { - "message": "Maximale Zellenspannung" - }, - "configurationBatteryWarning": { - "message": "Warnung Zellspannung" - }, - "configurationBatteryScale": { - "message": "Spannungsskala" - }, - "configurationBatteryVoltage": { - "message": "Akku-Spannung" - }, - "configurationCurrentScale": { - "message": "Strommessskala" - }, - "configurationCurrentScaleHelp": { - "message": "Skalierung der Ausgangsspannung auf Milliampere [1/10 mV/A]" - }, - "configurationCurrentOffset": { - "message": "Offset in Millivolt-Schritten" - }, - "configurationBatteryMultiwiiCurrent": { - "message": "Unterstützung für den alten Multiwii MSP-Stromausgang aktivieren" - }, - "configurationBatterySettings": { - "message": "Akkueinstellungen" - }, - "configurationBatterySettingsHelp": { - "message": "Diese Einstellungen gelten für das aktuell ausgewählte Akkuprofil " - }, - "configurationBatteryCapacityValue": { - "message": "Kapazität" - }, - "configurationBatteryCapacityWarning": { - "message": "Warnkapazität (verbleibende %)" - }, - "configurationBatteryCapacityCritical": { - "message": "Kritische Kapazität (verbleibende %)" - }, - "configurationBatteryCapacityUnit": { - "message": "Akkukapazität Einheit" - }, - "configurationLaunch": { - "message": "Starrflügler-Autostart-Einstellungen" - }, - "configurationLaunchVelocity": { - "message": "Schwellenwert Geschwindigkeit" - }, - "configurationLaunchVelocityHelp": { - "message": "Schwellenwert der Vorwärtsgeschwindigkeit für die Erkennung des Wurfstartes. Voreinstellung: 300 [100-10000]" - }, - "configurationLaunchAccel": { - "message": "Schwellenwert Beschleunigung" - }, - "configurationLaunchAccelHelp": { - "message": "Schwellenwert der Vorwärtsbeschleunigung für Bungee- oder Wurfstart, 1G = 981 cm/s. Standardwert: 1863 [1000-20000]" - }, - "configurationLaunchMaxAngle": { - "message": "Maximaler Wurfwinkel" - }, - "configurationLaunchMaxAngleHelp": { - "message": "Maximaler Wurfwinkel (Pitch/Roll kombiniert), um den Start als erfolgreich zu betrachten. Auf 180 setzen, um vollständig zu deaktivieren. Voreinstellung: 45 [5-180]" - }, - "configurationLaunchDetectTime": { - "message": "Zeiterkennung" - }, - "configurationLaunchDetectTimeHelp": { - "message": "Zeit, in der die Schwellenwerte überschritten werden müssen, damit der Start als erfolgt gilt. Standard: 40 [10-1000]" - }, - "configurationLaunchThr": { - "message": "Startgas" - }, - "configurationLaunchThrHelp": { - "message": "Startgas - Gaswert, der während der Startsequenz eingestellt wird. Voreinstellung: 1700 [1000-2000]" - }, - "configurationLaunchIdleThr": { - "message": "Leerlaufgas" - }, - "configurationLaunchIdleThrHelp": { - "message": "Leerlaufgas - Gas, das vor dem Start der Sequenz eingestellt wird. Bei einer Einstellung unterhalb des Mindestgases wird der Motorstopp oder das Leerlaufgas erzwungen (je nachdem, ob MOTOR_STOP aktiviert ist). Wenn der Wert über dem Mindestgas liegt, wird die Drosselklappe auf diesen Wert gesetzt (wenn MOTOR_STOP aktiviert ist, wird das Gas entsprechend der Knüppelposition behandelt). Voreinstellung: 1000 [1000-2000]" - }, - "configurationLaunchIdleDelay": { - "message": "LLeerlaufgas Verzögerung" - }, - "configurationLaunchIdleDelayHelp": { - "message": "Legen Sie eine Zeitverzögerung zwischen dem Bewegen des Gasknüppels für den Start und dem Starten des Motors bei Leerlaufgas fest. Voreinstellung: 0 [0-60000]" - }, - "configurationLaunchMotorDelay": { - "message": "Motorverzögerung" - }, - "configurationLaunchMotorDelayHelp": { - "message": "Verzögerung zwischen dem erkannten Start und dem Beginn der Startsequenz und dem Hochdrosseln. Standardwert: 500 [0-5000]" - }, - "configurationLaunchSpinupTime": { - "message": "Motorhochlaufzeit" - }, - "configurationLaunchSpinupTimeHelp": { - "message": "Zeit, um die Leistung von minimalem Gaas auf nav_fw_launch_thr zu bringen, um eine große Belastung des ESC und ein großes Drehmoment des Propellers zu vermeiden. Voreinstellung: 100 [0-1000]" - }, - "configurationLaunchMinTime": { - "message": "Mindeststartzeit" - }, - "configurationLaunchMinTimeHelp": { - "message": "Erlaubt dem Startmodus, mindestens diese Zeit [ms] auszuführen und Knüppelbewegungen zu ignorieren. Voreinstellung: 0 [0-60000]" - }, - "configurationLaunchTimeout": { - "message": "Maximale Startdauer" - }, - "configurationLaunchTimeoutHelp": { - "message": "Maximale Zeit für die Ausführung der Startsequenz. Nach Ablauf dieser Zeit wird der LAUNCH-Modus abgeschaltet und der normale Flugmodus wird übernommen. Voreinstellung: 5000 [0-60000]" - }, - "configurationLaunchEndTime": { - "message": "Ende Übergangszeit" - }, - "configurationLaunchEndTimeHelp": { - "message": "Glatte Übergangszeit am Ende des Starts (ms). Dieser Wert wird zur Startzeitüberschreitung addiert. Voreinstellung: 2000 [0-5000]" - }, - "configurationLaunchMaxAltitude": { - "message": "Maximale Flughöhe" - }, - "configurationLaunchMaxAltitudeHelp": { - "message": "Höhe, bei der der LAUNCH-Modus ausgeschaltet wird und der normale Flugmodus übernommen wird. Voreinstellung: 0 [0-60000]" - }, - "configurationLaunchClimbAngle": { - "message": "Steigwinkel" - }, - "configurationLaunchClimbAngleHelp": { - "message": "Steigwinkel (Lage des Modells, nicht Steigneigung) für die Startsequenz (Grad), wird auch durch den globalen max_angle_inclination_pit begrenzt. Voreinstellung: 18 [5-45]" - }, - "configuration3d": { - "message": "Reversible Motoren" - }, - "configuration3dDeadbandLow": { - "message": "Reversible Motoren Totzone Niedrig" - }, - "configuration3dDeadbandHigh": { - "message": "Reversible Motoren Totzone Hoch" - }, - "configuration3dNeutral": { - "message": "Reversible Motoren Neutral" - }, - "configuration3dDeadbandThrottle": { - "message": "Reversible Motoren Deadband-Drossel" - }, - "configurationSystem": { - "message": "Systemkonfiguration" - }, - "configurationLoopTime": { - "message": "ESC Looptime" - }, - "configurationCalculatedCyclesSec": { - "message": "Zyklen/Sek (Hz)" - }, - "configurationGPS": { - "message": "Konfiguration" - }, - "configurationGPSProtocol": { - "message": "Protokoll" - }, - "configurationGPSUseGalileo": { - "message": "GPS verwendet Galileo-Satelliten (EU)" - }, - "configurationGPSUseBeidou": { - "message": "GPS verwendet BeiDou-Satelliten (CN)" - }, - "configurationGPSUseGlonass": { - "message": "GPS verwendet Glonass-Satelliten (RU)" - }, - "tzOffset": { - "message": "Zeitzonenverschiebung" - }, - "tzOffsetHelp": { - "message": "Zeitzonenverschiebung von UTC. Dieser wird auf die GPS-Zeit für die Aufzeichnung und Zeitstempelung von Blackbox-Protokollen angewendet. (Standard = 0 Minuten)" - }, - "tzAutomaticDST": { - "message": "Automatische Sommerzeit" - }, - "tzAutomaticDSTHelp": { - "message": "Fügen Sie bei Bedarf automatisch die Sommerzeit zur GPS-Zeit hinzu oder ignorieren Sie sie einfach. Enthält Voreinstellungen für die EU und die USA - wenn Sie außerhalb dieser Gebiete leben, wird empfohlen, die Sommerzeit manuell über tz_offset zu verwalten. (Voreinstellung = Aus)" - }, - "configurationGPSBaudrate": { - "message": "Baudrate" - }, - "configurationGPSubxSbas": { - "message": "Art des unterstütztem GPS:" - }, - "configurationGPSHelp": { - "message": "Hinweis: Denken Sie daran, einen seriellen Port zu konfigurieren (über die Tab \"Ports\"), wenn Sie die GPS-Funktion verwenden." - }, - "receiverType": { - "message": "Typ des Empfängers" - }, - "configurationSerialRX": { - "message": "Serielles Empfängerprotokoll" - }, - "configurationSPIProtocol": { - "message": "RX-SPI-Protokoll" - }, - "configurationEepromSaved": { - "message": "EEPROM gespeichert: Konfiguration" - }, - "configurationButtonSave": { - "message": "Speichern und neu starten" - }, - "configurationVTX": { - "message": "VTX" - }, - "configurationVTXBand": { - "message": "Band" - }, - "configurationNoBand": { - "message": "Keine" - }, - "configurationVTXNoBandHelp": { - "message": "Die VTX-Frequenz wurde manuell eingestellt. Durch die Auswahl eines Bandes wird die konfigurierte Frequenz überschrieben." - }, - "configurationVTXChannel": { - "message": "Kanal" - }, - "configurationVTXPower": { - "message": "Leistungsstufe" - }, - "configurationVTXPowerHelp": { - "message": "VTX-Leistungspegel. Die genaue Leistung in mw (oder dBm) hängt von der jeweiligen Hardware ab. Prüfen Sie Ihre VTX-Dokumentation." - }, - "configurationVTXLowerPowerDisarm": { - "message": "Verwenden Sie eine niedrige Leistung, während das entschärft ist." - }, - "configurationVTXLowerPowerDisarmHelp": { - "message": "Wenn Sie diese Option aktivieren, verwendet der VTX seine niedrigste Leistung, während das Fahrzeug nicht \"gearmt\" ist. Verwenden Sie \"Bis zur ersten Arming\", damit die niedrigste Leistung nur bis zur ersten Arming verwendet wird." - }, - "configurationVTXLowPowerDisarmValue_0": { - "message": "Abgeschaltet" - }, - "configurationVTXLowPowerDisarmValue_1": { - "message": "Immer" - }, - "configurationVTXLowPowerDisarmValue_2": { - "message": "Bis zum ersten Arm" - }, - "portsHelp": { - "message": "Hinweis: Nicht alle Kombinationen sind gültig. Wenn die Flugcontroller-Firmware dies erkennt, wird die Konfiguration der seriellen Schnittstelle zurückgesetzt." - }, - "portsMSPHelp": { - "message": "Hinweis: Deaktivieren Sie NICHT MSP an der ersten seriellen Schnittstelle, wenn Sie nicht wissen, was Sie tun. Wenn Sie dies tun, müssen Sie möglicherweise Ihre Konfiguration neu flashen und löschen." - }, - "portsFirmwareUpgradeRequired": { - "message": "Firmware-Upgrade erforderlich." - }, - "portsButtonSave": { - "message": "Speichern und neu starten" - }, - "portsTelemetryDisabled": { - "message": "Abgeschaltet" - }, - "portsFunction_MSP": { - "message": "MSP" - }, - "portsFunction_GPS": { - "message": "GPS" - }, - "portsFunction_RANGEFINDER": { - "message": "Rangefinder" - }, - "portsFunction_OPFLOW": { - "message": "Optischer Fluss" - }, - "portsFunction_ESC": { - "message": "ESC-Ausgang/Telemetrie" - }, - "portsFunction_TELEMETRY_FRSKY": { - "message": "FrSky" - }, - "portsFunction_TELEMETRY_HOTT": { - "message": "HoTT" - }, - "portsFunction_TELEMETRY_LTM": { - "message": "LTM" - }, - "portsFunction_TELEMETRY_MAVLINK": { - "message": "MAVLink" - }, - "portsFunction_TELEMETRY_IBUS": { - "message": "IBUS" - }, - "portsFunction_GSM_SMS": { - "message": "GSM-SMS" - }, - "portsFunction_TELEMETRY_MSP": { - "message": "MSP" - }, - "portsFunction_TELEMETRY_SMARTPORT": { - "message": "SmartPort" - }, - "portsFunction_SMARTPORT_MASTER": { - "message": "SmartPort-Master" - }, - "portsFunction_RX_SERIAL": { - "message": "Serieller RX" - }, - "portsFunction_BLACKBOX": { - "message": "Blackbox" - }, - "portsFunction_RUNCAM_DEVICE_CONTROL": { - "message": "RunCam-Gerät" - }, - "portsFunction_TBS_SMARTAUDIO": { - "message": "TBS SmartAudio" - }, - "portsFunction_IRC_TRAMP": { - "message": "IRC-Tramp" - }, - "portsFunction_VTX_FFPV": { - "message": "FuriousFPV Vtx" - }, - "portsFunction_FRSKY_OSD": { - "message": "FrSky OSD" - }, - "portsFunction_DJI_FPV": { - "message": "DJI FPV VTX" - }, - "portsFunction_MSP_DISPLAYPORT": { - "message": "MSP DisplayPort" - }, - "portsFunction_SBUS_OUTPUT": { - "message": "SBus-Ausgang" - }, - "pidTuning_ShowAllPIDs": { - "message": "Alle PIDs anzeigen" - }, - "pidTuning_SelectNewDefaults": { - "message": "Wählen Sie neue Standardwerte" - }, - "pidTuning_ResetPIDController": { - "message": "PID-Regler zurücksetzen" - }, - "pidTuning_PIDgains": { - "message": "PID-Verstärkungen" - }, - "pidTuning_Name": { - "message": "Name" - }, - "pidTuning_Proportional": { - "message": "Proportional" - }, - "pidTuning_Integral": { - "message": "Integral" - }, - "pidTuning_Derivative": { - "message": "Derivat" - }, - "pidTuning_FeedForward": { - "message": "FeedForward" - }, - "pidTuning_ControlDerivative": { - "message": "Control Derivative" - }, - "pidTuning_Basic": { - "message": "Basic/Acro" - }, - "pidTuning_Level": { - "message": "Angle/Horizon" - }, - "pidTuning_Altitude": { - "message": "Barometer & Sonar/Höhenmesser" - }, - "pidTuning_Mag": { - "message": "Magnometer/Richtung" - }, - "pidTuning_GPS": { - "message": "GPS Navigation" - }, - "pidTuning_LevelP": { - "message": "Stärke" - }, - "pidTuning_LevelI": { - "message": "LPF-Grenzwert (Hz)" - }, - "pidTuning_LevelD": { - "message": "Übergang (Horizon)" - }, - "pidTuning_LevelHelp": { - "message": "Die folgenden Werte ändern das Verhalten der Flugmodi ANGLE und HORIZON. Verschiedene PID-Regler behandeln die LEVEL-Werte unterschiedlich. Bitte prüfen Sie die Dokumentation." - }, - "pidTuning_RatesAndExpo": { - "message": "Raten & Expo" - }, - "pidTuning_RateDynamics": { - "message": "Ratendynamik" - }, - "pidTuning_RateDynamics_Sensitivity": { - "message": "Empfindlichkeit" - }, - "pidTuning_RateDynamics_Correction": { - "message": "Berichtigung" - }, - "pidTuning_RateDynamics_Weight": { - "message": "Gewicht" - }, - "pidTuning_RateDynamics_Center": { - "message": "Zentrum" - }, - "pidTuning_RateDynamics_End": { - "message": "Ende" - }, - "pidTuning_RollPitchRate": { - "message": "ROLL & Nick Rate" - }, - "pidTuning_RollRate": { - "message": "ROLL rate" - }, - "pidTuning_PitchRate": { - "message": "NICK-Rate" - }, - "pidTuning_YawRate": { - "message": "GIER-Rate" - }, - "pidTuning_RollAndPitchExpo": { - "message": "Roll & Nick Expo" - }, - "pidTuning_YawExpo": { - "message": "Gier Expo" - }, - "pidTuning_MaxRollAngle": { - "message": "Max. ROLL-Winkel" - }, - "pidTuning_MaxRollAngleHelp": { - "message": "Maximaler ROLL-Winkel im ANGLE-Modus. Dadurch wird auch die maximale Neigung in den Navigationsmodi eingeschränkt." - }, - "pidTuning_MaxPitchAngle": { - "message": "Max. NICK Winkel" - }, - "pidTuning_MaxPitchAngleHelp": { - "message": "Maximaler Nick-Winkel im ANGLE-Modus. Damit wird auch das maximale Steigen und Sinken im Navigationsmodus begrenzt." - }, - "pidTuning_ManualRollRate": { - "message": "Manuelle ROLL Rate" - }, - "pidTuning_ManualPitchRate": { - "message": "Manuelle Nick-Rate" - }, - "pidTuning_ManualYawRate": { - "message": "Manuelle Gier-Rate" - }, - "pidTuning_magHoldYawRate": { - "message": "Heading Hold raten Limit" - }, - "pidTuning_MagHoldYawRateHelp": { - "message": "Maximale GIER-Drehrate, die der MagHold-Controller vom UAV anfordern kann. Wird nur verwendet, wenn der MagHold-Modus aktiviert ist, während RTH und WAYPOINT-Navigation. Werte unter 30dps ergeben schöne \"filmische\" Drehungen" - }, - "pidTuning_Filters": { - "message": "Filters" - }, - "pidTuning_mainFilters": { - "message": "Kreiselfilter" - }, - "pidTuning_advancedFilters": { - "message": "Erweiterte Kreiselfilter" - }, - "pidTuning_gyro_main_lpf_hz": { - "message": "Grenzfrequenz des Hauptkreiselfilters" - }, - "pidTuning_gyro_main_lpf_hz_help": { - "message": "Höhere Werte bieten eine geringere Verzögerung, aber mehr Rauschen. Niedrigere Werte bieten weniger Rauschen, aber mehr Verzögerung bei der Kreiselverarbeitung" - }, - "pidTuning_MatrixFilterMinFrequency": { - "message": "Matrixfilter Min. Frequenz" - }, - "pidTuning_MatrixFilterMinFrequencyHelp": { - "message": "Mindestfrequenz für den Matrix-Filter. Der Wert sollte von der Propellergröße abhängen. 150Hz funktionieren gut bei 5" und kleiner. Für 7" und darüber niedriger sogar unter 100Hz." - }, - "pidTuning_MatrixFilterQFactor": { - "message": "Matrixfilter Q-Faktor" - }, - "pidTuning_MatrixFilterQFactorHelp": { - "message": "Je höher der Wert, desto höher die Selektivität des Matrixfilters. Empfohlen werden Werte zwischen 150 und 300." - }, - "pidTuning_UnicornFilterQFactor": { - "message": "Unicorn-Filter Q-Faktor" - }, - "pidTuning_dtermFilters": { - "message": "D-Term-Filter" - }, - "pidTuning_dtermLpfCutoffFrequency": { - "message": "D-Term LPF Grenzfrequenz" - }, - "pidTuning_dtermLpfCutoffFrequencyHelp": { - "message": "Tiefpass-Cutoff-Filter für Dterm für alle PID-Regler" - }, - "pidTuning_rpmFilters": { - "message": "Kreisel-Drehzahl-Filter" - }, - "pidTuning_rpm_gyro_filter_enabled": { - "message": "Kreisel-Drehzahl-Filter (erfordert ESC-Telemetrie)" - }, - "pidTuning_rpm_gyro_min_hz": { - "message": "Kreisel-Drehzahl-Filter Min. Frequenz" - }, - "pidTuning_Mechanics": { - "message": "Mechanik" - }, - "pidTuning_ITermMechanics": { - "message": "I-Term Mechanik" - }, - "pidTuning_itermRelaxCutoff": { - "message": "Iterm Relax Grenzfrequenz" - }, - "pidTuning_itermRelaxCutoffHelp": { - "message": "Niedrigere Werte eröffnen ein längeres Zeitfenster für Iterm Relax und eine stärkere Iterm-Unterdrückung. Höhere Werte verkürzen die Zeitfenster und verringern die Unterdrückung." - }, - "pidTuning_antigravityGain": { - "message": "Antigravitationsverstärkung" - }, - "pidTuning_antigravityAccelerator": { - "message": "Antigravitationsbeschleuniger" - }, - "pidTuning_antigravityCutoff": { - "message": "Antigravitations-Grenzfrequenz" - }, - "pidTuning_itermBankAngleFreeze": { - "message": "Gier Iterm Einfrieren Neigungswinkel" - }, - "pidTuning_itermBankAngleFreezeHelp": { - "message": "Gier Iterm einfrieren, wenn das Flugzeug um mehr als diese Anzahl von Grad geneigt ist. Dies hilft zu verhindern, dass das Seitenruder der Drehung entgegenwirkt. 0 schaltet diese Funktion aus. Gilt nur für Starrflügelflugzeuge." - }, - "pidTuning_dTermMechanics": { - "message": "D-Term-Mechanik" - }, - "pidTuning_d_boost_min": { - "message": "D-Boost Min. Skala" - }, - "pidTuning_d_boost_min_help": { - "message": "Definiert die maximal zulässige Dterm-Dämpfung während der Knüppelbeschleunigungsphase. Der Wert 1.0 bedeutet, dass Dterm nicht gedämpft wird. 0,5 bedeutet, dass er um die Hälfte reduziert werden darf. Niedrigere Werte führen zu einer schnelleren Reaktion bei schnellen Knüppelbewegungen." - }, - "pidTuning_d_boost_max": { - "message": "D-Boost Max. Skala" - }, - "pidTuning_d_boost_max_help": { - "message": "Legt den maximalen Dterm-Boost fest, wenn die maximale Winkelbeschleunigung erreicht ist. 1,0 bedeutet, dass D-Boost deaktiviert ist, 2,0 bedeutet, dass Dterm um 100% wachsen darf. Werte zwischen 1,5 und 1,7 sind in der Regel der Sweet Spot." - }, - "pidTuning_d_boost_max_at_acceleration": { - "message": "Top D-Boost bei Beschleunigung [dps^2]" - }, - "pidTuning_d_boost_max_at_acceleration_help": { - "message": "D-Boost ist voll aktiv, wenn die Winkelbeschleunigung (entweder durch den Kreisel oder die Zielvorgabe) eine bestimmte Beschleunigung erreicht. Zwischen 0 und diesem Wert ist der D-Boost-Faktor linear skaliert" - }, - "pidTuning_d_boost_gyro_delta_lpf_hz": { - "message": "D-Boost-Kreisel LPF" - }, - "pidTuning_d_boost_gyro_delta_lpf_hz_help": { - "message": "Sollte auf die Frequenz der Propellerschwingungen eingestellt werden. 5-Zoll-Quads funktionieren am besten bei etwa 80 Hz, 7-Zoll-Quads bei etwa 50 Hz." - }, - "pidTuning_tpaMechanics": { - "message": "Schub PID-Dämpfung" - }, - "pidTuning_TPA": { - "message": "Schub-PID-Dämpfung (TPA)" - }, - "pidTuning_TPABreakPoint": { - "message": "TPA Haltepunkt" - }, - "pidTuning_FW_TPATimeConstant": { - "message": "Starrflügel TPA Zeitkonstante" - }, - "pidTuning_FW_TPATimeConstantHelp": { - "message": "TPA-Glättung und Verzögerungszeitkonstante, um die nicht konstante Geschwindigkeits-/Gasreaktion des Flugzeugs widerzuspiegeln." - }, - "pidTuning_fwLevelTrimMechanics": { - "message": "Starrflügel Level Trim" - }, - "pidTuning_fw_level_pitch_trim": { - "message": "Level Trim [deg]" - }, - "pidTuning_fw_level_pitch_trim_help": { - "message": "Pitch-Trimmung für selbstnivellierende Flugmodi. In Grad. +5 bedeutet, dass die Nase des Flugzeugs um 5 Grad vom Niveau angehoben werden soll." - }, - "pidTuning_ButtonSave": { - "message": "Speichern" - }, - "pidTuning_ButtonRefresh": { - "message": "Aktualisieren" - }, - "pidTuning_ProfileHead": { - "message": "Profil" - }, - "pidTuning_LoadedProfile": { - "message": "Geladenes Profil: $1" - }, - "pidTuning_gyro_use_dyn_lpf": { - "message": "Dynamischer Kreisel LPF" - }, - "pidTuning_gyro_use_dyn_lpf_help": { - "message": "Wenn diese Funktion aktiviert ist, wird die LPF-Hauptfrequenz des Kreisels automatisch auf der Grundlage der aktuellen Gasposition angepasst. Wenn deaktiviert, wird die statische LPF-Abschaltfrequenz verwendet." - }, - "pidTuning_gyro_dyn_lpf_min_hz": { - "message": "Dynamischer Kreisel LPF Min. Cutoff" - }, - "pidTuning_gyro_dyn_lpf_max_hz": { - "message": "Dynamischer Kreisel LPF max. Cutoff" - }, - "pidTuning_gyro_dyn_lpf_curve_expo": { - "message": "Dynamischer Kreisel LPF-Kurvenverlauf" - }, - "pidTuning_gyro_dyn_lpf_min_hz_help": { - "message": "Legt die LPF-Cutoff-Frequenz des Kreisels bei minimaler Drosselklappe fest. Wenn Gsd erhöht wird, wird auch die LPF-Cutoff-Frequenz erhöht, bis zur maximalen Cutoff-Frequenz." - }, - "pidTuning_gyro_dyn_lpf_max_hz_help": { - "message": "Legt die LPF-Cutoff-Frequenz des Kreisels bei maximaler Drosselklappe fest. Wenn Gsd verringert wird, wird auch die LPF-Cutoff-Frequenz verringert, bis hin zur minimalen Cutoff-Frequenz." - }, - "loadedMixerProfile": { - "message": "Geladenes Mischerprofil: $1, Tab Modi prüfen: MIXER PROFILE 2, wenn Sie die Änderungen nicht sehen" - }, - "loadedBatteryProfile": { - "message": "Geladenes Akkuprofil: $1" - }, - "pidTuningDataRefreshed": { - "message": "PID-Daten aufgefrischt" - }, - "pidTuningEepromSaved": { - "message": "EEPROM gespeichert: PID-Abstimmung" - }, - "receiverHelp": { - "message": "Bitte lesen Sie das Kapitel Empfänger in der Dokumentation. Serielle Schnittstelle (falls erforderlich), Empfängermodus (seriell/ppm/pwm), Protokoll (bei seriellen Empfängern) konfigurieren, Empfänger binden, Kanalzuordnung einstellen, Kanalendpunkte/Bereich am TX so konfigurieren, dass alle Kanäle von ~1000 bis ~2000 gehen. Mittelwert einstellen (Standard 1500), Kanäle auf 1500 trimmen, Knüppel-Totzone konfigurieren, Verhalten bei ausgeschaltetem TX oder außerhalb des Bereichs überprüfen. Vergewissern Sie sich, dass die Kanalwerte alle ansteigen, wenn Sie die Knüppel nach oben und rechts drücken. Wenn nicht, kehren Sie den Kanal im TX um. Wenden Sie keine anderen Mischer im TX an.
WICHTIG: Lesen Sie vor dem Flug das Failsafe-Kapitel der Dokumentation und konfigurieren Sie Failsafe." - }, - "receiverThrottleMid": { - "message": "Gas MID" - }, - "receiverThrottleExpo": { - "message": "Gas EXPO" - }, - "receiverRcRate": { - "message": "RC-Rate" - }, - "receiverDeadband": { - "message": "RC-Totzone" - }, - "receiverHelpDeadband": { - "message": "Dies sind Werte (in us), um wie viel die RC-Eingänge abweichen können, bevor sie als gültig betrachtet werden. Bei Sendern mit Jitter an den Ausgängen kann dieser Wert erhöht werden, wenn die RC-Eingänge im Leerlauf zucken." - }, - "receiverHelpYawDeadband": { - "message": "Dies sind Werte (in us), um wie viel die RC-Eingänge abweichen können, bevor sie als gültig betrachtet werden. Bei Sendern mit Jitter an den Ausgängen kann dieser Wert erhöht werden, wenn die RC-Eingänge im Leerlauf zucken. Diese Einstellung gilt nur für Gieren." - }, - "receiverYawDeadband": { - "message": "Gier-Totzone" - }, - "receiverRcExpo": { - "message": "RC Expo" - }, - "receiverRcYawExpo": { - "message": "RC Gier-Expo" - }, - "receiverManualRcExpo": { - "message": "RC Expo Manuell" - }, - "receiverManualRcYawExpo": { - "message": "RC Yaw Expo Manuell" - }, - "receiverChannelMap": { - "message": "Kanal-Zuordnungen" - }, - "receiverChannelMapTitle": { - "message": "Sie können Ihre eigene Kanal-Zuordnungen definieren, indem Sie in die Box klicken" - }, - "receiverRssiChannel": { - "message": "RSSI-Kanal" - }, - "receiverRefreshRateTitle": { - "message": "Aktualisierungsrate der Grafik" - }, - "receiverButtonSave": { - "message": "Speichern" - }, - "receiverButtonRefresh": { - "message": "Aktualisieren" - }, - "receiverButtonSticks": { - "message": "Steuerknüppel" - }, - "receiverDataRefreshed": { - "message": "RC Tuning Daten aktualisiert" - }, - "receiverEepromSaved": { - "message": "EEPROM gespeichert: Empfänger" - }, - "auxiliaryHelp": { - "message": "Verwenden Sie Bereiche, um die Schalter an Ihrem Sender und die entsprechenden Moduszuweisungen zu definieren. Ein Empfängerkanal, der einen Messwert zwischen einem Bereich min/max liefert, aktiviert den Modus. Denken Sie daran, Ihre Einstellungen mit der Schaltfläche Speichern zu speichern." - }, - "auxiliaryToggleUnused": { - "message": "Nicht verwendete Modi ausblenden" - }, - "auxiliaryMin": { - "message": "Min" - }, - "auxiliaryMax": { - "message": "Max" - }, - "auxiliaryAddRange": { - "message": "Bereich hinzufügen" - }, - "auxiliaryAutoChannelSelect": { - "message": "AUTO" - }, - "auxiliaryButtonSave": { - "message": "Speichern" - }, - "auxiliaryEepromSaved": { - "message": "EEPROM gespeichert." - }, - "adjustmentsHelp": { - "message": "Konfigurieren Sie die Einstellschalter. Einzelheiten finden Sie im Abschnitt \"Einstellungen während des Fluges\" des Handbuchs. Die Änderungen, die die Einstellfunktionen vornehmen, werden nicht automatisch gespeichert. Es gibt 4 Speicherplätze. Jeder Schalter, mit dem gleichzeitig Einstellungen vorgenommen werden, erfordert die ausschließliche Verwendung eines Speicherplatzes." - }, - "adjustmentsExamples": { - "message": "Beispiele" - }, - "adjustmentsExample1": { - "message": "Verwenden Sie Speicherplatz 1 und einen 3POS-Schalter auf CH5, um zwischen Pitch/Roll P, I und D zu wählen, und einen weiteren 3POS-Schalter auf CH6, um den Wert zu erhöhen oder zu verringern, wenn er nach oben oder unten gehalten wird." - }, - "adjustmentsExample2": { - "message": "Verwenden Sie Speicherplatz 2 und einen 3POS-Schalter auf CH8, um die Ratenprofilauswahl über denselben 3POS-Schalter auf demselben Kanal zu aktivieren." - }, - "adjustmentsColumnEnable": { - "message": "Wenn aktiviert" - }, - "adjustmentsColumnUsingSlot": { - "message": "Speicherplatz verwenden" - }, - "adjustmentsColumnWhenChannel": { - "message": "wenn der Kanal" - }, - "adjustmentsColumnIsInRange": { - "message": "liegt im Bereich" - }, - "adjustmentsColumnThenApplyFunction": { - "message": "dann gelten" - }, - "adjustmentsColumnViaChannel": { - "message": "über den Kanal" - }, - "adjustmentsSlot0": { - "message": "Speicherplatz 1" - }, - "adjustmentsSlot1": { - "message": "Speicherplatz 2" - }, - "adjustmentsSlot2": { - "message": "Speicherplatz 3" - }, - "adjustmentsSlot3": { - "message": "Speicherplatz 4" - }, - "adjustmentsMin": { - "message": "Min" - }, - "adjustmentsMax": { - "message": "Max" - }, - "adjustmentsGroupRates": { - "message": "Raten & Expo" - }, - "adjustmentsGroupPIDTuning": { - "message": "PID-Abstimmung" - }, - "adjustmentsGroupNavigationFlight": { - "message": "Navigation und Flug" - }, - "adjustmentsGroupMisc": { - "message": "Sonstiges" - }, - "adjustmentsFunction0": { - "message": "Keine Änderungen" - }, - "adjustmentsFunction1": { - "message": "RC Ratenanpassung" - }, - "adjustmentsFunction2": { - "message": "RC Expo-Anpassung" - }, - "adjustmentsFunction3": { - "message": "Gas-Expo-Einstellung" - }, - "adjustmentsFunction4": { - "message": "Nick & Roll Rate Einstellung" - }, - "adjustmentsFunction5": { - "message": "Anpassung der Gierrate" - }, - "adjustmentsFunction6": { - "message": "Nick & Roll P-Einstellung" - }, - "adjustmentsFunction7": { - "message": "Nick & Roll I-Einstellung" - }, - "adjustmentsFunction8": { - "message": "Nick und Roll D" - }, - "adjustmentsFunction9": { - "message": "CD/FF-Einstellung für Neigung und Drehung" - }, - "adjustmentsFunction10": { - "message": "Nick P-Einstellung" - }, - "adjustmentsFunction11": { - "message": "Nick I Einstellung" - }, - "adjustmentsFunction12": { - "message": "Nick D Einstellung" - }, - "adjustmentsFunction13": { - "message": "Nick CD/FF-Einstellung" - }, - "adjustmentsFunction14": { - "message": "Roll P Einstellung" - }, - "adjustmentsFunction15": { - "message": "Roll I Anpassung" - }, - "adjustmentsFunction16": { - "message": "Roll D Einstellung" - }, - "adjustmentsFunction17": { - "message": "Roll CD/FF-Einstellung" - }, - "adjustmentsFunction18": { - "message": "Gier P Einstellung" - }, - "adjustmentsFunction19": { - "message": "Gier I Einstellung" - }, - "adjustmentsFunction20": { - "message": "Gier D Einstellung" - }, - "adjustmentsFunction21": { - "message": "Gier CD/FF-Einstellung" - }, - "adjustmentsFunction22": { - "message": "Auswahl des Ratenprofils" - }, - "adjustmentsFunction23": { - "message": "Pitch Rate" - }, - "adjustmentsFunction24": { - "message": "Rollrate" - }, - "adjustmentsFunction25": { - "message": "RC Gier-Expo-Einstellung" - }, - "adjustmentsFunction26": { - "message": "Manuelle RC-Expo-Einstellung" - }, - "adjustmentsFunction27": { - "message": "Manuelle RC Yaw Expo-Einstellung" - }, - "adjustmentsFunction28": { - "message": "Manuelle Einstellung der Nick- und Rollrate" - }, - "adjustmentsFunction29": { - "message": "Manuelle Einstellung der Rollgeschwindigkeit" - }, - "adjustmentsFunction30": { - "message": "Manuelle Pitch-Rate-Einstellung" - }, - "adjustmentsFunction31": { - "message": "Manuelle Gierratenanpassung" - }, - "adjustmentsFunction32": { - "message": "Navigation SF Cruise-Gas-Einstellung" - }, - "adjustmentsFunction33": { - "message": "Navigation FW Nick-Zu-Gas-Anpassung" - }, - "adjustmentsFunction34": { - "message": "Einstellung der Rollausrichtung des Boards" - }, - "adjustmentsFunction35": { - "message": "Einstellung der Nickausrichtung des Boards" - }, - "adjustmentsFunction36": { - "message": "Level P Einstellung" - }, - "adjustmentsFunction37": { - "message": "Level I Anpassung" - }, - "adjustmentsFunction38": { - "message": "Level D Anpassung" - }, - "adjustmentsFunction39": { - "message": "Pos XY P Einstellung" - }, - "adjustmentsFunction40": { - "message": "Pos XY I Einstellung" - }, - "adjustmentsFunction41": { - "message": "Pos XY D Einstellung" - }, - "adjustmentsFunction42": { - "message": "Pos Z P Einstellung" - }, - "adjustmentsFunction43": { - "message": "Pos Z I Einstellung" - }, - "adjustmentsFunction44": { - "message": "Pos Z D Einstellung" - }, - "adjustmentsFunction45": { - "message": "Ausrichrtung P Anpassung" - }, - "adjustmentsFunction46": { - "message": "Vel XY P-Einstellung" - }, - "adjustmentsFunction47": { - "message": "Vel XY I Einstellung" - }, - "adjustmentsFunction48": { - "message": "Vel XY D-Einstellung" - }, - "adjustmentsFunction49": { - "message": "Vel Z P Einstellung" - }, - "adjustmentsFunction50": { - "message": "Vel Z I Einstellung" - }, - "adjustmentsFunction51": { - "message": "Vel Z D Einstellung" - }, - "adjustmentsFunction52": { - "message": "SF Min. Gas zu Neigungswinkel Einstellung" - }, - "adjustmentsFunction53": { - "message": "VTX-Leistungspegel Einstellung" - }, - "adjustmentsFunction54": { - "message": "Einstellung der Schub-PID-Dämpfung (TPA)" - }, - "adjustmentsFunction55": { - "message": "TPA Haltepunktanpassung" - }, - "adjustmentsFunction56": { - "message": "Steuerung Glätteanpassung" - }, - "adjustmentsFunction57": { - "message": "Starrflügel TPA Zeitkonstante" - }, - "adjustmentsFunction58": { - "message": "Starrflügel Level Trim" - }, - "adjustmentsFunction59": { - "message": "Multi-Mission-Index-Anpassung" - }, - "adjustmentsSave": { - "message": "Speichern" - }, - "adjustmentsEepromSaved": { - "message": "EEPROM gespeichert: Anpassungen" - }, - "programmingEepromSaved": { - "message": "EEPROM gespeichert: Programmierung" - }, - "servosChangeDirection": { - "message": "Richtungswechsel in TX Anpassen" - }, - "servosName": { - "message": "Name" - }, - "servosMid": { - "message": "MID" - }, - "servosMin": { - "message": "MIN" - }, - "servosMax": { - "message": "MAX" - }, - "servosReverse": { - "message": "Umgekehrt" - }, - "servoOutput": { - "message": "Ausgabe" - }, - "servosRate": { - "message": "Rate (%)" - }, - "servosLiveMode": { - "message": "Aktivieren des Live-Modus" - }, - "servosButtonSave": { - "message": "Speichern" - }, - "servosNormal": { - "message": "Normal" - }, - "servoEmptyTableInfo": { - "message": "Keine Servos konfiguriert. Fügen Sie sie im Tab Mischer welche hinzu." - }, - "servosEepromSave": { - "message": "EEPROM gespeichert." - }, - "mixerSaved": { - "message": "Mixer gespeichert." - }, - "mixerWizard": { - "message": "Mischer-Assistent" - }, - "mixerWizardInfo": { - "message": "
  1. Propeller abmontieren
  2. LiPo anschließen und im Ausgangs Tab alle Motoren testen
  3. Position der einzelnen Motoren notieren (Motor #1 - Links oben und so weiter)
  4. Tabelle unten ausfüllen
" - }, - "gpsHead": { - "message": "Position" - }, - "gpsStatHead": { - "message": "Statistik" - }, - "gpsMapHead": { - "message": "Aktueller GPS-Standort" - }, - "gpsMapMessage1": { - "message": "Bitte überprüfen Sie Ihre Internetverbindung" - }, - "gpsMapMessage2": { - "message": "Warten auf GPS 3D-Fix..." - }, - "gpsFix": { - "message": "Art des Fix:" - }, - "gpsFix2D": { - "message": "2D" - }, - "gpsFix3D": { - "message": "3D" - }, - "gpsFixNone": { - "message": "Keine" - }, - "gpsAltitude": { - "message": "Höhe:" - }, - "gpsLat": { - "message": "Breitengrad:" - }, - "gpsLon": { - "message": "Längengrad:" - }, - "gpsSpeed": { - "message": "Geschwindigkeit:" - }, - "gpsSats": { - "message": "Sats:" - }, - "gpsDistToHome": { - "message": "Distanz zu \"Home\":" - }, - "gpsHDOP": { - "message": "HDOP:" - }, - "gpsTotalMessages": { - "message": "Nachrichten insgesamt:" - }, - "gpsMessageRate": { - "message": "Aktualisierungszeit:" - }, - "gpsErrors": { - "message": "Fehler:" - }, - "gpsTimeouts": { - "message": "Zeitüberschreitung:" - }, - "gpsEPH": { - "message": "EPH:" - }, - "gpsEPV": { - "message": "EPV:" - }, - "gpsSignalStr": { - "message": "Signalstärke" - }, - "magnetometerHead": { - "message": "Ausrichtungswerkzeug" - }, - "magnetometerHelp": { - "message": "1. Passen Sie die Ausrichtung des Flugcontrollers so an, dass sie mit der physischen Ausrichtung des Flugzeugs entsprechend dem Richtungspfeil auf dem Flugcontroller übereinstimmt.
2. Passen Sie die Ausrichtung des Magnetometers so an, dass sie mit der physischen Ausrichtung des Flugzeugs entsprechend dem Richtungspfeil oder den Achsenmarkierungen auf dem Magnetometer übereinstimmt.
Hinweis: Die voreingestellte Ausrichtung des Magnetometers (align_mag) ist relativ zum FC. Stellen Sie sicher, dass Sie den FC zuerst ausrichten (align_board_pitch, align_board_roll, align_board_yaw).
Wenn die Voreinstellung nicht verwendet wird (Ausrichtung wird mit align_mag_roll, align_mag_pitch und align_mag_yaw eingestellt), dann ist die Magnetometerausrichtung unabhängig." - }, - "magnetometerOrientationPreset": { - "message": "Voreingestellte Ausrichtung (align_mag). Relativ zur FC-Ausrichtung" - }, - "boardInfo": { - "message": "1. Ausrichtung des Flugcontrollers wählen
(align_board_roll, align_board_pitch, align_board_yaw)" - }, - "magnetometerInfo": { - "message": "2. Wählen Sie eine Voreinstellung (align_mag) oder erstellen Sie eine eigene Konfiguration mit den Schiebereglern
(align_mag_roll, align_mag_pitch, align_mag_yaw)" - }, - "magnetometerElementToShow": { - "message": "Zu zeigendes Element: Magnetometer-Modell oder Achsen" - }, - "axisTableTitleAxis": { - "message": "Achse" - }, - "axisTableTitleSlider": { - "message": "Schieberegler" - }, - "axisTableTitleValue": { - "message": "Wert [Grad]" - }, - "configurationMagnetometerHelp": { - "message": "Hinweis: Denken Sie daran, einen seriellen POrt zu konfigurieren (über die Tab \"Ports\"), wenn Sie die Magnetometerfunktion verwenden." - }, - "magnetometerStatHead": { - "message": "Mag-Statistik" - }, - "tabMAGNETOMETER": { - "message": "Ausrichtungswerkzeug" - }, - "motors": { - "message": "Motoren" - }, - "servos": { - "message": "Servos" - }, - "motorsMaster": { - "message": "Master" - }, - "motorsNotice": { - "message": "Hinweis zum Motortestmodus:
Bewegen der Schieberegler führt dazu, dass die Motoren hochdrehen.
Um Verletzungen zu vermeiden, entferne ALLE Propeller, bevor du diese Funktion benutzt.
" - }, - "motorsEnableControl": { - "message": "Ich verstehe die Risiken, die Propeller werden entfernt - Motorsteuerung ermöglichen." - }, - "sensorsInfo": { - "message": "Denken Sie daran, dass die Verwendung schneller Aktualisierungsraten und das gleichzeitige Rendern mehrerer Diagramme ressourcenintensiv ist und der Akku schneller verbraucht, wenn Sie einen Laptop verwenden.
Wir empfehlen, nur Diagramme für Sensoren zu rendern, an denen Sie interessiert sind, und angemessene Aktualisierungszeiträume zu verwenden." - }, - "sensorsRefresh": { - "message": "Aktualisieren:" - }, - "sensorsScale": { - "message": "Skala:" - }, - "cliInfo": { - "message": "Hinweis: Das Verlassen der CLI-Tab oder das Drücken von Disconnect sendet automatisch \"exit\" an das Board. Bei der neuesten Firmware führt dies dazu, dass der Controller neustartet und nicht gespeicherte Änderungen verloren gehen." - }, - "cliInputPlaceholder": { - "message": "Schreiben Sie hier Ihren Befehl" - }, - "cliEnter": { - "message": "CLI-Modus erkannt" - }, - "cliReboot": { - "message": "CLI-Neustart erkannt" - }, - "cliDocsBtn": { - "message": "CLI-Befehlsdokumente" - }, - "cliSaveToFileBtn": { - "message": "In Datei speichern" - }, - "cliSaveToFileFailed": { - "message": "CLI-Ausgabe konnte nicht in Datei gespeichert werden" - }, - "cliSaveToFileAborted": { - "message": "Das Speichern der CLI-Ausgabe in eine Datei wurde abgebrochen" - }, - "cliSaveToFileCompleted": { - "message": "CLI-Ausgabe erfolgreich in Datei gespeichert" - }, - "cliClearOutputHistoryBtn": { - "message": "Bildschirm löschen" - }, - "cliCopyToClipboardBtn": { - "message": "In die Zwischenablage kopieren" - }, - "cliExitBtn": { - "message": "Beenden" - }, - "cliSaveSettingsBtn": { - "message": "Einstellungen speichern" - }, - "cliMscBtn": { - "message": "MSC" - }, - "cliDiffAllBtn": { - "message": "Diff All" - }, - "cliCommandsHelp": { - "message": "Geben Sie Befehle in das Feld links ein oder fügen Sie sie ein. Mit den Pfeiltasten nach oben und unten können Sie zuvor eingegebene Befehle wieder aufrufen. Geben Sie \"help\" ein oder klicken Sie auf dieses Symbol, um weitere Informationen zu erhalten." - }, - "cliCopySuccessful": { - "message": "Kopiert!" - }, - "cliLoadFromFileBtn": { - "message": "Aus Datei laden" - }, - "cliConfirmSnippetDialogTitle": { - "message": "Geladene Befehle überprüfen" - }, - "cliConfirmSnippetNote": { - "message": "Hinweis: Sie können Befehle vor der Ausführung überprüfen und bearbeiten." - }, - "cliConfirmSnippetBtn": { - "message": "Ausführen" - }, - "loggingNote": { - "message": "Die Daten werden in diesem Tab nur protokolliert, beim Verlassen der Tab wird die Protokollierung abgebrochen und die Anwendung kehrt in den normalen \"Configurator\"-Zustand zurück.
Sie können die globale Aktualisierungsperiode frei wählen, die Daten werden aus Leistungsgründen jede 1 Sekunde in die Protokolldatei geschrieben." - }, - "loggingSamplesSaved": { - "message": "Gespeicherte Smpels:" - }, - "loggingLogSize": { - "message": "Log Größe:" - }, - "loggingButtonLogFile": { - "message": "Log-Datei auswählen" - }, - "loggingStart": { - "message": "Protokollierung starten" - }, - "loggingStop": { - "message": "Protokollierung beenden" - }, - "loggingBack": { - "message": "Protokollierung verlassen / Verbindung trennen" - }, - "loggingErrorNotConnected": { - "message": "Sie müssen erst eine Verbindung herstellen" - }, - "loggingErrorLogFile": { - "message": "Bitte wählen Sie eine Protokolldatei" - }, - "loggingErrorOneProperty": { - "message": "Bitte wählen Sie mindestens eine Eigenschaft aus, die Sie protokollieren möchten" - }, - "loggingAutomaticallyRetained": { - "message": "Vorherige Protokolldatei automatisch geladen: $1" - }, - "blackboxNotSupported": { - "message": "Die Firmware Ihres Flugcontrollers unterstützt keine Blackbox-Protokollierung oder die Blackbox-Funktion ist nicht aktiviert" - }, - "blackboxConfiguration": { - "message": "Blackbox-Konfiguration" - }, - "blackboxButtonSave": { - "message": "Speichern und neu starten" - }, - "serialLogging": { - "message": "Serielles Aufzeichnungsgerät an Bord" - }, - "serialLoggingSupportedNote": { - "message": "Sie können über einen seriellen Anschluss ein externes Protokollierungsgerät (z. B. OpenLog oder einen kompatiblen Klon) verwenden. Konfigurieren Sie den Anschluss auf der Tab \"Anschlüsse\"." - }, - "onboardLoggingFlashLogger": { - "message": "Onboard-Datenflash-Chip" - }, - "OnboardSDCard": { - "message": "Eingebaute SD-Karte" - }, - "sdcardNote": { - "message": "Flugprotokolle können auf dem integrierten SD-Kartensteckplatz Ihres Flugcontrollers gespeichert werden." - }, - "dataflashNote": { - "message": "Flugprotokolle können auf dem Flashspeicher Ihres Flugcontrollers aufgezeichnet werden." - }, - "dataflashNotPresentNote": { - "message": "Ihr Flugcontroller verfügt nicht über einen kompatiblen Flashspeicher." - }, - "dataflashFirmwareUpgradeRequired": { - "message": "Dataflash erfordert Firmware >= 1.8.0." - }, - "dataflashButtonSaveFile": { - "message": "Flash in Datei speichern..." - }, - "dataflashButtonErase": { - "message": "Flash löschen" - }, - "dataflashConfirmEraseTitle": { - "message": "Bestätigen Sie das Löschen des Flashspeichers" - }, - "dataflashConfirmEraseNote": { - "message": "Dadurch werden alle Blackbox-Protokolle oder andere Daten auf dem Dataflash gelöscht, was etwa 20 Sekunden dauert, sind Sie sicher?" - }, - "dataflashEraseing": { - "message": "Löschvorgang läuft, bitte warten..." - }, - "dataflashSavingTitle": { - "message": "Speichern des Flashspeichers in einer Datei" - }, - "dataflashSavingNote": { - "message": "Das Speichern kann einige Minuten dauern, bitte warten Sie." - }, - "dataflashSavingNoteAfter": { - "message": "Speichern abgeschlossen! Drücken Sie \"Ok\", um fortzufahren." - }, - "dataflashButtonSaveCancel": { - "message": "Abbrechen" - }, - "dataflashButtonSaveDismiss": { - "message": "Ok" - }, - "dataflashButtonEraseConfirm": { - "message": "Ja, Flashspeicher löschen" - }, - "dataflashButtonEraseCancel": { - "message": "Abbrechen" - }, - "dataflashFileWriteFailed": { - "message": "Es konnte nicht in die ausgewählte Datei geschrieben werden. Sind die Berechtigungen für diesen Ordner in Ordnung?" - }, - "firmwareFlasherReleaseSummaryHead": { - "message": "Infos zur Veröffentlichung" - }, - "firmwareFlasherReleaseName": { - "message": "Name/Version:" - }, - "firmwareFlasherReleaseVersionUrl": { - "message": "Besuchen Sie die Release-Seite." - }, - "firmwareFlasherReleaseNotes": { - "message": "Anmerkungen zur Veröffentlichung:" - }, - "firmwareFlasherReleaseDate": { - "message": "Datum:" - }, - "firmwareFlasherReleaseStatus": { - "message": "Status:" - }, - "firmwareFlasherReleaseTarget": { - "message": "Ziel:" - }, - "firmwareFlasherReleaseFile": { - "message": "Binär:" - }, - "firmwareFlasherReleaseStatusReleaseCandidate": { - "message": "WICHTIG: Diese Firmware-Version ist derzeit als Release Candidate gekennzeichnet. Bitte melden Sie alle Probleme sofort." - }, - "firmwareFlasherReleaseFileUrl": { - "message": "Manuelles Herunterladen." - }, - "firmwareFlasherTargetWarning": { - "message": "WICHTIG: Stellen Sie sicher, dass Sie eine für Ihr Target geeignete Datei flashen. Das Flashen einer Binärdatei für das falsche Target kann böse Folgen haben." - }, - "firmwareFlasherPath": { - "message": "Pfad:" - }, - "firmwareFlasherSize": { - "message": "Größe:" - }, - "firmwareFlasherStatus": { - "message": "Status:" - }, - "firmwareFlasherProgress": { - "message": "Fortschritt:" - }, - "firmwareFlasherLoadFirmwareFile": { - "message": "Bitte laden Sie die Firmware-Datei" - }, - "firmwareFlasherNoReboot": { - "message": "Keine Neustart-Sequenz" - }, - "firmwareFlasherOnlineSelectBoardDescription": { - "message": "Wählen Sie Ihr Board aus, um die verfügbaren Online-Firmware-Versionen zu sehen - Wählen Sie die richtige Firmware für Ihr Board aus. Bitte beachten Sie, dass Auto-select Target nur für INAV-Firmware 5.0 und neuer funktioniert." - }, - "firmwareFlasherOnlineSelectFirmwareVersionDescription": { - "message": "Wählen Sie die Firmware-Version für Ihr Board.
Hinweis: Auch wenn Sie verschiedene Versionen der Firmware mit diesem Configurator flashen können. Beim Einrichten des Flugcontrollers sollten Sie die Haupt- und Nebenversionsnummern für die Firmware und den Configurator abgleichen." - }, - "firmwareFlasherNoRebootDescription": { - "message": "Aktivieren Sie diese Funktion, wenn Sie Ihren FC mit Strom versorgt haben, während die Bootloader-Pins gebrückt waren, oder wenn Sie die BOOT-Taste Ihres FCs gedrückt haben." - }, - "firmwareFlasherFlashOnConnect": { - "message": "Flashen beim Verbinden" - }, - "firmwareFlasherFlashOnConnectDescription": { - "message": "Versuchen Sie, die Karte automatisch zu flashen (ausgelöst durch einen neu erkannten seriellen Anschluss)." - }, - "firmwareFlasherFullChipErase": { - "message": "Vollständiges Löschen des Chips" - }, - "firmwareFlasherFullChipEraseDescription": { - "message": "Löscht alle derzeit auf der Karte gespeicherten Konfigurationsdaten." - }, - "firmwareFlasherFlashDevelopmentFirmware": { - "message": "Entwicklungs-Firmware verwenden" - }, - "firmwareFlasherFlashDevelopmentFirmwareDescription": { - "message": "Flashen Sie die neueste (ungetestete) Entwicklungs-Firmware." - }, - "firmwareFlasherManualBaud": { - "message": "Manuelle Baudrate" - }, - "firmwareFlasherManualBaudDescription": { - "message": "Manuelle Auswahl der Baudrate für Boards, die die Standardgeschwindigkeit nicht unterstützen oder für das Flashen über Bluetooth.
Hinweis: Nicht verwendet beim Flashen über USB DFU" - }, - "firmwareFlasherShowDevelopmentReleases": { - "message": "Instabile Versionen anzeigen" - }, - "firmwareFlasherShowDevelopmentReleasesDescription": { - "message": "Release-Kandidaten und Entwicklungs-Releases anzeigen." - }, - "firmwareFlasherOptionLabelSelectFirmware": { - "message": "Wählen Sie eine Firmware / Board" - }, - "firmwareFlasherOptionLabelSelectBoard": { - "message": "Wählen Sie ein Board" - }, - "firmwareFlasherOptionLabelSelectFirmwareVersion": { - "message": "Wählen Sie eine Firmware-Version" - }, - "firmwareFlasherOptionLabelSelectFirmwareVersionFor": { - "message": "Wählen Sie eine Firmware-Version für" - }, - "firmwareFlasherButtonAutoSelect": { - "message": "Target automatisch auswählen" - }, - "firmwareFlasherButtonLoadLocal": { - "message": "Firmware laden [Lokal]" - }, - "firmwareFlasherButtonLoadOnline": { - "message": "Load Firmware [Online]" - }, - "firmwareFlasherButtonLoading": { - "message": "Laden..." - }, - "firmwareFlasherFlashFirmware": { - "message": "Flash-Firmware" - }, - "firmwareFlasherGithubInfoHead": { - "message": "Github Firmware-Informationen" - }, - "firmwareFlasherCommiter": { - "message": "Übermittler:" - }, - "firmwareFlasherDate": { - "message": "Datum:" - }, - "firmwareFlasherHash": { - "message": "Hash:" - }, - "firmwareFlasherUrl": { - "message": "Gehen Sie zu GitHub, um diesen Commit zu überprüfen..." - }, - "firmwareFlasherMessage": { - "message": "Meldung:" - }, - "firmwareFlasherWarningHead": { - "message": "Warnung" - }, - "firmwareFlasherWarningText": { - "message": "Bitte nicht versuchen, nicht-iNAV Hardware mit diesem Firmware Flasher zu flashen.
Schalten Sie nicht den PC aus oder trennen Sie das Bord oder den PC während des Flashen von der Stromversorgung.

Hinweis: Der STM32 Bootloader ist im ROM gespeichert, er kann nicht gebrickt werden.
Hinweis: Stellen Sie sicher, dass Sie ein Backup haben; einige Upgrades/Downgrades löschen Ihre Konfiguration.
Hinweis: Wenn Sie Probleme beim Flashen haben, versuchen Sie zuerst alle Kabel von Ihrem FC zu trennen, versuchen Sie einen Neustart, aktualisieren Sie Chrome, aktualisieren Sie Treiber.
Hinweis: Beim Flashen von Boards mit direkt angeschlossenen USB-Buchsen (Matek H743-SLIM, Holybro Kakute usw.) vergewissern Sie sich, dass Sie den Abschnitt zum USB-Flashen im INAV-Handbuch gelesen haben und die richtige Software und Treiber installiert haben." - }, - "firmwareFlasherRecoveryHead": { - "message": "Wiederherstellung / Verlorene Kommunikation" - }, - "firmwareFlasherRecoveryText": { - "message": "Wenn Sie die Kommunikation mit Ihrem Board verloren haben, befolgen Sie diese Schritte, um die Kommunikation wiederherzustellen: " - }, - "firmwareFlasherButtonLeave": { - "message": "Firmware Flasher verlassen" - }, - "firmwareFlasherFirmwareNotLoaded": { - "message": "Firmware nicht geladen" - }, - "firmwareFlasherHexCorrupted": { - "message": "HEX-Datei scheint beschädigt zu sein" - }, - "firmwareFlasherRemoteFirmwareLoaded": { - "message": "Firmware geladen, bereit zum Flashen" - }, - "firmwareFlasherFailedToLoadOnlineFirmware": { - "message": "Firmware konnte nicht geladen werden" - }, - "ledStripHelp": { - "message": "Der Flugcontroller kann Farben und Effekte einzelner LEDs auf einem Streifen steuern.
Konfigurieren Sie LEDs auf dem Raster, konfigurieren Sie die Verdrahtungsreihenfolge und bringen Sie die LEDs dann entsprechend der Rasterpositionen an Ihrem Flugzeug an. LEDs ohne Verdrahtungsnummer werden nicht gespeichert.
Doppelklicken Sie auf eine Farbe, um die HSV-Werte zu bearbeiten." - }, - "ledStripButtonSave": { - "message": "Speichern" - }, - "ledStripEepromSaved": { - "message": "EEPROM gespeichert: LED" - }, - "controlAxisRoll": { - "message": "Roll [A]" - }, - "controlAxisPitch": { - "message": "Nick [E]" - }, - "controlAxisYaw": { - "message": "Gier [R]" - }, - "controlAxisThrottle": { - "message": "Gas [T]" - }, - "controlAxisMotor": { - "message": "Motor" - }, - "radioChannelShort": { - "message": "CH" - }, - "configHelp2": { - "message": "Beliebige Boarddrehung in Grad, damit das Board seitlich / auf dem Kopf stehend / gedreht usw. montiert werden kann. Wenn Sie externe Sensoren betreiben, verwenden Sie die Sensorausrichtungen (Kreisel, Beschlunigungssensor, Magentometer), um die Sensorposition unabhängig von der Ausrichtung der Platine zu definieren." - }, - "failsafeFeaturesHelpOld": { - "message": "Die Failsafe-Konfiguration hat sich erheblich geändert. Aktuelles INAV verwenden" - }, - "failsafePaneTitleOld": { - "message": "Failsafe des Empfängers" - }, - "failsafeFeatureItemOld": { - "message": "Failsafe-Einstellungen bei RX-Signalverlust" - }, - "failsafeThrottleItemOld": { - "message": "Failsafe-Gas" - }, - "failsafeFeaturesHelpNew": { - "message": "Failsafe hat zwei Stufen. Stufe 1 wird eingeleitet, wenn ein Flugkanal eine ungültige Impulsdauer hat, der Empfänger den Failsafe-Modus meldet oder überhaupt kein Signal vom Empfänger kommt, die Kanal-Fallback-Einstellungen auf allen Kanälen angewendet werden kann und eine kurze Zeitspanne für die Wiederherstellung vorgesehen ist. Stufe 2 wird eingeleitet, wenn die Fehlerbedingung länger als die konfigurierte Schutzzeit dauert, während das Fahrzeug armed ist, alle Kanäle bleiben auf der angewendeten Kanal-Fallback-Einstellung, es sei denn, sie wird durch das gewählte Verfahren aufgehoben.
Hinweis: Vor dem Eintritt in Stufe 1 werden die Einstellungen für den Kanalrückfall auch auf einzelne Funkkanäle mit ungültigen Impulsen angewendet." - }, - "failsafePulsrangeTitle": { - "message": "Gültige Impulsbereichseinstellungen" - }, - "failsafePulsrangeHelp": { - "message": "Impulse, die kürzer als das Minimum oder länger als das Maximum sind, sind ungültig und führen bei Funkkanälen zur Anwendung der individuellen Kanal-Fallback-Einstellungen oder bei Flugkanälen zum Eintritt in Stufe 1." - }, - "failsafeRxMinUsecItem": { - "message": "Mindestdauer" - }, - "failsafeRxMaxUsecItem": { - "message": "Maximale Dauer" - }, - "failsafeChannelFallbackSettingsTitle": { - "message": "Kanal-Fallback-Einstellungen" - }, - "failsafeChannelFallbackSettingsHelp": { - "message": "Diese Einstellungen werden auf ungültige einzelne Funkkanäle oder auf alle Kanäle beim Eintritt in Stufe 1 angewendet. Hinweis: Werte werden in Schritten von 25usec gespeichert, so dass kleine Änderungen verschwinden" - }, - "failsafeChannelFallbackSettingsAuto": { - "message": "Auto bedeutet Roll, Nick und Gier in die Mitte und Throttle low. Halten bedeutet, den zuletzt erhaltenen guten Wert beibehalten" - }, - "failsafeChannelFallbackSettingsHold": { - "message": "Halten bedeutet, dass der zuletzt erhaltene gute Wert beibehalten wird. Setzen bedeutet, dass der hier angegebene Wert verwendet wird." - }, - "failsafeStageTwoSettingsTitle": { - "message": "Einstellungen" - }, - "failsafeFeatureItem": { - "message": "Aktiviert" - }, - "failsafeFeatureHelp": { - "message": "Hinweis: Wenn Stufe 2 DEAKTIVIERT ist, wird die Fallback-Einstellung Auto anstelle der Benutzereinstellungen für alle Flugkanäle (Roll, Nick, Gier und Gas) verwendet." - }, - "failsafeDelayItem": { - "message": "Schutzzeit für die Aktivierung nach Signalverlust [Bei Dezisekunden (ds): 1 = 0,1 Sek.]" - }, - "failsafeDelayHelp": { - "message": "Zeit für Stufe 1, um auf die Erholung zu warten" - }, - "failsafeThrottleItem": { - "message": "Bei der Landung verwendeter Gaswert" - }, - "failsafeOffDelayItem": { - "message": "Verzögerung für das Abschalten der Motoren bei Failsafe [Für Dezisekunden (ds):1 = 0,1 Sek.]" - }, - "failsafeOffDelayHelp": { - "message": "Zeit, um im Landemodus zu bleiben, bis die Motoren ausgeschaltet sind und das Fahrzeug disarmed ist" - }, - "failsafeSubTitle1": { - "message": "Verfahren" - }, - "failsafeProcedureItemSelect1": { - "message": "Landen" - }, - "failsafeProcedureItemSelect2": { - "message": "Fallen" - }, - "failsafeProcedureItemSelect3": { - "message": "RTH" - }, - "failsafeProcedureItemSelect4": { - "message": "Nichts tun" - }, - "failsafeKillSwitchItem": { - "message": "Failsafe Kill Schalter (sofortiges Abschalten des Flugzeugs bei Failsafe)" - }, - "failsafeKillSwitchHelp": { - "message": "Setzen Sie diese Option, damit der Failsafe-Schalter, der auf der Tab Modi konfiguriert ist, als direkter Kill-Schalter fungiert und das ausgewählte Failsafe-Verfahren umgeht. Hinweis: Die Scharfschaltung ist blockiert, wenn der Failsafe-Kill-Schalter in der Position ON steht." - }, - "failsafeUseMinimumDistanceItem": { - "message": "Alternatives Failsafe-Verfahren mit Mindestabstand in der Nähe vom Home" - }, - "failsafeUseMinimumDistanceHelp": { - "message": "Setzen Sie diese Option, wenn Sie ein alternatives Failsafe-Verhalten benötigen, wenn sich das Flugzeug in der Nähe vom Home befindet. Zum Beispiel hat der Autor dieser Funktion ein Flugzeug, das ausfällt, wenn sich die Flügel bei der Landung abtrennen, wenn das normalerweise im Flug gewünschte RTH-Failsafe-Verhalten nicht mehr gewünscht oder erforderlich ist." - }, - "failsafeMinDistanceItem": { - "message": "Failsafe-Mindestabstand in Zentimetern" - }, - "failsafeMinDistanceHelp": { - "message": "Das Fahrzeug verwendet das alternative Failsafe-Verhalten, wenn es zwischen 0 und diesem Mindestabstand in Zentimetern von Home entfernt ist. Wenn z. B. 2000 Zentimeter (20 Meter) eingestellt sind und sich das Fahrzeug in 13 Metern Entfernung befindet, wird das Failsafe-Mindestentfernungsverfahren angewendet. Wenn sich das Fahrzeug in 25 Metern Entfernung befindet, wird das normale Failsafe-Verfahren angewendet. Bei einer Einstellung von 0 wird immer das normale Failsafe-Verfahren angewandt." - }, - "failsafeMinDistanceProcedureItem": { - "message": "Failsafe-Mindestabstand-Verfahren" - }, - "failsafeMinDistanceProcedureHelp": { - "message": "Dies ist das Failsafe-Verfahren, das angewendet wird, wenn sich das Fahrzeug näher als der Failsafe-Mindestabstand zur Heimat befindet." - }, - "mainHelpArmed": { - "message": "Motor Arming" - }, - "mainHelpFailsafe": { - "message": "Failsafe-Modus" - }, - "mainHelpLink": { - "message": "Status der seriellen Verbindung" - }, - "warning": { - "message": "Warnung" - }, - "escProtocol": { - "message": "ESC-Protokoll" - }, - "escRefreshRate": { - "message": "ESC-Aktualisierungsrate" - }, - "escProtocolHelp": { - "message": "ESC muss das gewählte Protokoll unterstützen. Ändern Sie es nur, wenn Sie wissen, dass ESC es unterstützt!" - }, - "escRefreshRatelHelp": { - "message": "ESC muss die Aktualisierungsrate unterstützen. Ändern Sie nur, wenn Sie wissen, dass der ESC dies unterstützt!" - }, - "servoRefreshRate": { - "message": "Servo-Aktualisierungsrate" - }, - "servoRefreshRatelHelp": { - "message": "Das Servo muss die Aktualisierungsrate unterstützen. Ändern Sie diese nur, wenn Sie wissen, dass das Servo sie unterstützt. Eine zu hohe Aktualisierungsrate kann Servos beschädigen!" - }, - "logPwmOutputDisabled": { - "message": "Der PWM-Ausgang ist deaktiviert. Motoren und Servos werden nicht funktionieren. Benutze den Reiter Ausgänge zum Aktivieren!" - }, - "configurationGyroSyncTitle": { - "message": "Synchronisierung der looptime mit dem Gyroskop" - }, - "configurationGyroLpfTitle": { - "message": "Gyroskop LPF Grenzfrequenz" - }, - "configurationGyroSyncDenominator": { - "message": "Gyroskop denominator" - }, - "yawJumpPreventionLimit": { - "message": "Verhinderung von Giersprüngen" - }, - "yawJumpPreventionLimitHelp": { - "message": "Verhindert Giersprünge bei Gierstopps und schnellen Gier-Eingaben. Zum Deaktivieren setzen Sie den Wert auf 500. Passen Sie diesen Wert an, wenn Ihr Flugzeug \"ausrutscht\". Höhere Werte erhöhen die Gier-Autorität, können aber bei untermotorisierten Drohnen zu Roll-/Neigungsinstabilität führen. Niedrigere Werte machen Gieranpassungen sanfter, können aber dazu führen, dass die Drohne den Kurs nicht halten kann." - }, - "yawPLimit": { - "message": "Gier P-Grenze" - }, - "yawPLimitHelp": { - "message": "Begrenzer für Gier P-Term. Eine Erhöhung verbessert die Gierleistung, kann aber zu Instabilität bei Roll und Nick führen." - }, - "tabFiltering": { - "message": "Filterung" - }, - "gyroLpfCutoffFrequency": { - "message": "Kreisel LPF Grenzfrequenz" - }, - "gyroLpfCutoffFrequencyHelp": { - "message": "Softwarebasierter Filter zur Entfernung mechanischer Schwingungen aus dem Kreiselsignal. Der Wert ist die Grenzfrequenz (Hz). Für größere Frames mit größeren Propellern auf einen niedrigeren Wert einstellen. Ein zu hoher Wert kann zur Überhitzung von Motor und Regler führen." - }, - "accLpfCutoffFrequency": { - "message": "Beschleunigungsmesser LPF-Grenzfrequenz" - }, - "yawLpfCutoffFrequency": { - "message": "Gier LPF Grenzfrequenz" - }, - "yawLpfCutoffFrequencyHelp": { - "message": "Gier P-Term LPF Grenzfrequenz" - }, - "rollPitchItermIgnoreRate": { - "message": "Roll/Nick I-term ignore rate" - }, - "rollPitchItermIgnoreRateHelp": { - "message": "PID I-Term wird oberhalb dieser Drehrate ignoriert. Dies verhindert die Akkumulation von I-Term bei Manövern" - }, - "yawItermIgnoreRate": { - "message": "Gier I-Term Ignorierungsrate" - }, - "yawItermIgnoreRateHelp": { - "message": "PID I-Term wird oberhalb dieser Drehrate ignoriert. Dies verhindert die Akkumulation von I-Term bei Manövern" - }, - "axisAccelerationLimitRollPitch": { - "message": "Roll-/Nickbeschleunigungsgrenze" - }, - "axisAccelerationLimitRollPitchHelp": { - "message": "Dies ist die maximale Winkelbeschleunigung, die der Pilot vom UAV verlangen darf. Die Drohne sollte in der Lage sein, diese Beschleunigungsrate zu erfüllen. Als Faustregel gilt: Je größer die Drohne, desto geringer die Beschleunigung, die sie bewältigen kann." - }, - "axisAccelerationLimitYaw": { - "message": "Grenzwert der Gierbeschleunigung" - }, - "axisAccelerationLimitYawHelp": { - "message": "Dies ist die maximale Winkelbeschleunigung, die der Pilot vom UAV verlangen darf. Die Drohne sollte in der Lage sein, diese Beschleunigungsrate zu erfüllen. Als Faustregel gilt: Je größer die Drohne, desto geringer die Beschleunigung, die sie bewältigen kann." - }, - "pidTuningTPAHelp": { - "message": "Gas PID Dämpfungsfaktor. Die PID-Verstärkungen werden linear reduziert, beginnend bei 0 am TPA-Breakpoint (Gas) bis zum TPA-Faktor bei maximaler Drossel." - }, - "pidTuningTPABreakPointHelp": { - "message": "Die Gas-PID-Dämpfung beginnt, wenn die Gasposition diesen Wert überschreitet." - }, - "configurationAsyncMode": { - "message": "Asynchroner Modus" - }, - "configurationGyroFrequencyTitle": { - "message": "Gyroskop-Task-Frequenz" - }, - "configurationAccelerometerFrequencyTitle": { - "message": "Beschleunigungssensor-Task-Frequenz" - }, - "configurationAttitudeFrequencyTitle": { - "message": "Einstellung Attitude-Task-Frequenz" - }, - "configurationGyroLpfHelp": { - "message": "Hardware-basierte Grenzfrequenz für das Gyroskop. Im Allgemeinen ist ein höherer Wert besser, macht die Drohne aber empfindlicher gegenüber Vibrationen." - }, - "configurationAsyncModeHelp": { - "message": "Siehe Firmware-Dokumentation \"Looptime\" für Details" - }, - "configurationGyroFrequencyHelp": { - "message": "Im Allgemeinen ist ein höherer Wert besser, macht die Drohne aber empfindlicher gegenüber Vibrationen. Sollte über der 'Flight Controller Loop Time' Frequenz gehalten werden. Maximaler praktischer Wert ist hardwareabhängig. Wird er zu hoch angesetzt, läuft das Board möglicherweise nicht richtig. Beobachten Sie die CPU-Auslastung." - }, - "configurationAccelerometerFrequencyHelp": { - "message": "Für Acro-Zwecke kann dieser Wert vom Standardwert herabgesetzt werden" - }, - "configurationAttitudeFrequencyHelp": { - "message": "Für Acro-Zwecke kann dieser Wert vom Standardwert herabgesetzt werden" - }, - "configurationLoopTimeHelp": { - "message": "Im Allgemeinen ist ein höherer Wert besser. Bei einem asynchronen Gyroskop sollte der Wert unter der Aktualisierungsfrequenz des Gyros liegen. Maximaler praktischer Wert ist hardwareabhängig. Wenn der Wert zu hoch ist, könnte das Board nicht richtig laufen. Beobachten Sie die CPU-Auslastung." - }, - "tabOSD": { - "message": "OSD" - }, - "configurationSensors": { - "message": "Sensoren und Busse" - }, - "sensorAccelerometer": { - "message": "Beschleunigungsmesser" - }, - "sensorMagnetometer": { - "message": "Magnetometer" - }, - "sensorBarometer": { - "message": "Barometer" - }, - "sensorPitot": { - "message": "Pitotrohr" - }, - "sensorRangefinder": { - "message": "Rangefinder" - }, - "sensorOpflow": { - "message": "Optischer Fluss" - }, - "manualEnablingTemplate": { - "message": "Zum Aktivieren über CLI verwenden Sie den Befehl Funktion {Name}" - }, - "armingFailureReasonTitle": { - "message": "Kontrollen vor dem Arming" - }, - "BLOCKED_UAV_NOT_LEVEL": { - "message": "UAV wird nivelliert" - }, - "BLOCKED_SENSORS_CALIBRATING": { - "message": "Kalibrierung während des Betriebs" - }, - "BLOCKED_SYSTEM_OVERLOADED": { - "message": "CPU-Auslastung" - }, - "BLOCKED_NAVIGATION_SAFETY": { - "message": "Die Navigation ist sicher" - }, - "BLOCKED_COMPASS_NOT_CALIBRATED": { - "message": "Kompass kalibriert" - }, - "BLOCKED_ACCELEROMETER_NOT_CALIBRATED": { - "message": "Beschleunigungsmesser kalibriert" - }, - "BLOCKED_HARDWARE_FAILURE": { - "message": "Gesundheit der Hardware" - }, - "BLOCKED_INVALID_SETTING": { - "message": "Überprüfte Einstellungen" - }, - "armingCheckPass": { - "message": "
" - }, - "armingCheckFail": { - "message": "
" - }, - "calibrationHead1": { - "message": "Beschleunigungsmesser-Kalibrierung" - }, - "calibrationHead2": { - "message": "Beschleunigungsmesser-Wrte" - }, - "calibrationHead3": { - "message": "Level-Kalibrierung" - }, - "calibrationHead4": { - "message": "Kompass-Kalibrierung" - }, - "calibrationHead5": { - "message": "kalibrierung optischrer Fluss" - }, - "OpflowCalText": { - "message": "Nach dem Drücken der Taste haben Sie 30 Sekunden Zeit, um das Modell in der Luft zu halten und es zur Seite zu kippen, ohne es horizontal zu bewegen. Beachten Sie, dass der optische Flusssensor jederzeit die Oberfläche beobachten muss." - }, - "OpflowCalBtn": { - "message": "Optischen Flusssensor kalibrieren" - }, - "accZero": { - "message": "Acc Zero" - }, - "accGain": { - "message": "Acc Gain" - }, - "NoteCalibration": { - "message": "Hinweis: Wenn die IMU in einem anderen Winkel oder auf der Unterseite des Flugcontrollers montiert ist. Führen Sie die Kalibrierungsschritte so durch, dass die IMU wie auf den Bildern gezeigt zeigt, nicht das Quad (sonst funktioniert die Kalibrierung nicht)." - }, - "AccBtn": { - "message": "Beschleunigungssensor kalibrieren" - }, - "stepTitle1": { - "message": "Schritt 1" - }, - "stepTitle2": { - "message": "Schritt 2" - }, - "stepTitle3": { - "message": "Schritt 3" - }, - "stepTitle4": { - "message": "Schritt 4" - }, - "stepTitle5": { - "message": "Schritt 5" - }, - "stepTitle6": { - "message": "Schritt 6" - }, - "MagXText": { - "message": "Null X" - }, - "MagYText": { - "message": "Null Y" - }, - "MagZText": { - "message": "Null Z" - }, - "MagGainXText": { - "message": "Gewinn X" - }, - "MagGainYText": { - "message": "Verstärkung Y" - }, - "MagGainZText": { - "message": "Verstärkung Z" - }, - "OpflowScaleText": { - "message": "Skala" - }, - "AccResetBtn": { - "message": "Beschleunigungsmesser-Kalibrierung zurücksetzen" - }, - "MagCalText": { - "message": "Nach dem Drücken der Taste haben Sie 30 Sekunden Zeit, das Modell in die Luft zu halten und es so zu drehen, dass jede Seite (vorne, hinten, links, rechts, oben und unten) zur Erde zeigt. Achten Sie darauf, dass sich Ihr Kompass nicht in der Nähe von Magneten oder Elektromagneten befindet, wenn Sie ihn in das Fahrzeug einbauen oder die Kalibrierung durchführen." - }, - "MagBtn": { - "message": "Kompass kalibrieren" - }, - "LevCalText": { - "message": "Bitte geben Sie hier einen Text ein..." - }, - "LevBtn": { - "message": "Kalibrierung des Levels" - }, - "tabMixer": { - "message": "Mischer" - }, - "presetsApplyHeader": { - "message": "Warnung" - }, - "presetApplyDescription": { - "message": "

Stellen Sie sicher, dass der Mischer konfiguriert wurde, bevor Sie Presets anwenden!

Preset überschreibt ausgewählte Konfigurationswerte, einschließlich Mixer, Filterung, PIDs und andere. Einstellungen wie: Flugmodi, Funkeinstellungen, Failsafe und OSD werden nicht verändert. Die angewendeten Werte sollten NICHT als endgültige Werte behandelt werden, sondern als Einstiegspunkt für die endgültige Einstellung.
Überprüfen Sie die neue Konfiguration immer vor dem Fliegen!

" - }, - "OK": { - "message": "OK" - }, - "accCalibrationStartTitle": { - "message": "Beschleunigungsmesser-Kalibrierung" - }, - "accCalibrationStartBody": { - "message": "Bringen Sie den Flugcontroller in die im Bild gezeigte Position und drücken Sie dann erneut die Taste Kalibrieren. Wiederhole dies für jede der 6 Positionen. Halten Sie ihn während der Kalibrierung stabil." - }, - "accCalibrationStopTitle": { - "message": "Kalibrierung beendet" - }, - "accCalibrationStopBody": { - "message": "Beschleunigungsmesser-Kalibrierung abgeschlossen, prüfen Sie, ob die Werte gespeichert wurden." - }, - "accCalibrationProcessing": { - "message": "Verarbeitung..." - }, - "tabProgramming": { - "message": "Programmierung" - }, - "tabAdvancedTuning": { - "message": "Erweiterte Abstimmung" - }, - "advancedTuningSave": { - "message": "Speichern und neu starten" - }, - "tabAdvancedTuningTitle": { - "message": "Erweiterte Abstimmung" - }, - "tabAdvancedTuningAirplaneTuningTitle": { - "message": ": Starrflügel" - }, - "tabAdvancedTuningMultirotorTuningTitle": { - "message": ": Multirotoren" - }, - "tabAdvancedTuningGenericTitle": { - "message": "Allgemeine Einstellungen" - }, - "presetApplyHead": { - "message": "Die folgenden Einstellungen werden angewendet:" - }, - "gyroNotchHz1": { - "message": "Erste Kreisel-Sperrfilter-Freq." - }, - "gyroNotchCutoff1": { - "message": "Erste Kreisel-Sperrfilter-Grenzfrequenz." - }, - "gyroNotchHz2": { - "message": "Zweite Kreisel-Sperrfilter-Freq." - }, - "gyroNotchCutoff2": { - "message": "Zweiter Kreisel-Sperrfilter Cutoff-Freq." - }, - "gyroNotchHz1Help": { - "message": "Sollte auf die harmonische Frequenz des Propellers abgestimmt sein. Normalerweise gleich [Motorfrequenz] * [Propellerblattzahl]

Muss über der Grenzfrequenz liegen

0 deaktiviert den Filter" - }, - "gyroNotchHz2Help": { - "message": "Sollte auf die Motorfrequenz abgestimmt sein.

Muss oberhalb der Cutoff-Frequenz und unterhalb der Frequenz des ersten Kreisel-Sperrfilters liegen.

0 schaltet den Filter ab" - }, - "gyroNotchCutoff1Help": { - "message": "Legt das Band des Kerbfilters fest.

Muss unterhalb der Kerbfilterfrequenz liegen." - }, - "gyroNotchCutoff2Help": { - "message": "Legt das Band des Kerbfilters fest.

Muss unterhalb der Kerbfilterfrequenz liegen." - }, - "dtermNotchHz": { - "message": "Dterm-Sperrfilter-Freq." - }, - "dtermNotchCutoff": { - "message": "Dterm Kerbfilter Grenzfrequenz." - }, - "dtermNotchHzHelp": { - "message": "Sollte zwischen der ersten und zweiten Frequenz des Kreisel-Sperrfilters liegen

Muss über der Grenzfrequenz liegen

0 deaktiviert den Filter" - }, - "dtermNotchCutoffHelp": { - "message": "Legt das Band des Filters fest.

Muss unterhalb der Kerbfilterfrequenz liegen." - }, - "multiRotorNavigationConfiguration": { - "message": "Multirotor-Navigationseinstellungen" - }, - "userControlMode": { - "message": "Benutzerkontrollmodus" - }, - "posholdDefaultSpeed": { - "message": "Standardgeschwindigkeit der Navigation" - }, - "posholdDefaultSpeedHelp": { - "message": "Standardgeschwindigkeit während des RTH, wird auch für die WP-Navigation verwendet, wenn für die WP-Strecke keine Geschwindigkeit eingestellt ist. Begrenzt auf Max. Navigationsgeschwindigkeit" - }, - "posholdMaxSpeed": { - "message": "Max. Navigationsgeschwindigkeit" - }, - "posholdMaxManualSpeed": { - "message": "Max. CRUISE-Geschwindigkeit" - }, - "posholdMaxManualSpeedHelp": { - "message": "Maximal zulässige horizontale Geschwindigkeit für die manuelle Steuerung durch den Piloten im POSHOLD/CRUISE-Modus" - }, - "posholdMaxClimbRate": { - "message": "Max. Steiggeschwindigkeit der Navigation [cm/s]" - }, - "posholdMaxManualClimbRate": { - "message": "Max. ALTHOLD-Steigrate [cm/s]" - }, - "posholdMaxBankAngle": { - "message": "Multirotor max. Neigungswinkel" - }, - "posholdMaxBankAngleHelp": { - "message": "Maximaler Schräglagenwinkel in den Navigationsmodi. Begrenzt durch den maximalen ROLL-Winkel in der Tab PID-Einstellung." - }, - "posholdHoverThrottle": { - "message": "Schwebegas" - }, - "posholdHoverMidThrottle": { - "message": "Mittlen Gaswert für ALTHOLD verwenden" - }, - "mcWpSlowdown": { - "message": "Verlangsamen des Tempos, wenn sich das Fulgerät einem Wegpunkt nähert" - }, - "mcWpSlowdownHelp": { - "message": "Wenn diese Funktion aktiviert ist, verlangsamt sich das Fluggerät beim Wechsel zum nächsten Wegpunkt. Dies gibt dem Wenden Vorrang vor der Vorwärtsbewegung. Wenn diese Funktion deaktiviert ist, fliegt das Fluggerät zum nächsten Wegpunkt und wendet dabei." - }, - "positionEstimatorConfiguration": { - "message": "Positionsabschätzer" - }, - "w_z_baro_p": { - "message": "Vertikale Position / Barometer Gewicht" - }, - "w_z_gps_p": { - "message": "Vertikale Position / GPS-Gewicht" - }, - "w_z_gps_v": { - "message": "Vertikale Geschwindigkeit / GPS-Gewicht" - }, - "w_xy_gps_p": { - "message": "Horizontale Position / GPS-Gewicht" - }, - "w_xy_gps_v": { - "message": "Horizontale Geschwindigkeit / GPS-Gewicht" - }, - "positionEstimatorConfigurationDisclaimer": { - "message": "Diese Werte sollten nur sehr vorsichtig geändert werden. In den meisten Fällen ist es nicht nötig, sie zu ändern. Nur für fortgeschrittene Benutzer!" - }, - "gps_min_sats": { - "message": "Min. GPS-Satelliten für einen gültigen Fix" - }, - "w_z_baro_p_help": { - "message": "Wenn dieser Wert auf 0 gesetzt ist, wird das Barometer nicht für die Höhenberechnung verwendet." - }, - "w_z_gps_p_help": { - "message": "Diese Einstellung wird nur verwendet, wenn kein Barometer installiert ist und inav_use_gps_no_baro konfiguriert ist." - }, - "wirelessModeSwitch": { - "message": "Drahtloser Modus" - }, - "rthConfiguration": { - "message": "RTH-Einstellungen" - }, - "autoLandingSettings": { - "message": "Automatische Landeeinstellungen" - }, - "minRthDistance": { - "message": "Min. RTH-Abstand" - }, - "minRthDistanceHelp": { - "message": "Wenn sich die Drohne innerhalb dieser Entfernung vom Startpunkt befindet, landet sie anstelle von RTH und landet dann" - }, - "rthClimbFirst": { - "message": "Steigen vor RTH" - }, - "rthClimbFirstHelp": { - "message": "Wenn auf ON oder ON_FW_SPIRAL eingestellt, steigt das Flugzeug zuerst auf die nav_rth_altitude, bevor es abdreht, um nach Hause zu fliegen. Bei OFF wendet das Flugzeug und fliegt sofort nach Hause, indem es auf dem Weg dorthin steigt. Bei einem Starrflügler führt ON zu einem linearen Steigflug, ON_FW_SPIRAL zu einem Steigflug mit Wendemanöver, wobei die Steigrate durch nav_auto_climb_rate und die Wenderate durch nav_fw_loiter_radius festgelegt wird (ON_FW_SPIRAL ist eine Einstellung für Starrflügler und verhält sich genauso wie ON für einen Multirotor)." - }, - "rthClimbIgnoreEmergency": { - "message": "Steigen unabhängig vom Zustand der Positionssensoren" - }, - "rthAltControlOverride": { - "message": "Übersteuern der RTH-Höhen- und Steigflug-Einstellung mit Roll-/Nick-Knüppel" - }, - "rthAltControlOverrideHELP": { - "message": "Wenn diese Funktion aktiviert ist, kann der Steigflug bei RTH abgebrochen werden, indem der volle Nick für >1 Sekunde gedrückt gehalten wird, so dass das Flugzeug auf der aktuellen Höhe nach Hause fliegt. Bei Starrflüglern kann die Einstellung \"Steigen vor RTH\" durch Halten der vollen Rollbewegung nach links oder rechts für >1 Sekunde außer Kraft gesetzt werden, so dass das Flugzeug sofort in Richtung Heimat abdreht." - }, - "rthTailFirst": { - "message": "Leitwerk zuerst" - }, - "rthAllowLanding": { - "message": "Landen nach RTH" - }, - "rthAltControlMode": { - "message": "RTH-Höhenmodus" - }, - "rthAbortThreshold": { - "message": "RTH-Abbruchschwelle" - }, - "rthAbortThresholdHelp": { - "message": "Die Funktion \"RTH sanity checking\" stellt fest, ob der Abstand zum Heimatflughafen während des RTH zunimmt, und wenn er den durch diesen Parameter definierten Schwellenwert überschreitet, wird die Drohne eine Notlandung durchführen, anstatt den RTH fortzusetzen. Die Voreinstellung ist 500 m, was sowohl für Multirotoren als auch für Flugzeuge sicher genug ist." - }, - "fsMissionDelay": { - "message": "Failsafel Missionsverzögerung" - }, - "fsMissionDelayHelp": { - "message": "Definiert eine Verzögerung in Sekunden, wie lange INAV warten muss, bevor Failsafe RTH aktiviert wird, wenn sich das Flugzeug in einer Wegpunkt-Mission befindet. Auf -1 setzen, um Failsafe komplett zu deaktivieren [0-600s]." - }, - "drNavigation": { - "message": "Dead Reckoning Navigation" - }, - "drNavigationHelp": { - "message": "Ermöglicht INAV die Fortsetzung der Navigation (Wegpunkt, Rückkehr zum Heimatort, Reiseflug, Kurshaltung usw.) bei kurzen GPS-Ausfällen. Für diese Funktion müssen bei Starrflügelflugzeugen Kompass und Fluggeschwindigkeitssensor aktiviert sein." - }, - "rthAltitude": { - "message": "RTH-Höhe" - }, - "rthAltitudeHelp": { - "message": "Wird in den RTH-Höhenmodi \"Extra\", \"Fest\" und \"Mindestens\" verwendet." - }, - "rthTrackBack": { - "message": "RTH Track Back Modus" - }, - "rthTrackBackHelp": { - "message": "Wenn diese Option aktiviert ist, fliegt das Flugzeug zunächst rückwärts auf seinem letzten Weg, bevor es direkt nach Hause fliegt. Starrflügler fliegen den Weg im Steigflug zurück, aber nicht im Sinkflug. Verwendungsmodi für RTH Track Back. OFF = deaktiviert, ON = Normal und Failsafe RTH, FS = nur Failsafe RTH." - }, - "rthTrackBackDistance": { - "message": "RTH Track Back Entfernung" - }, - "rthTrackBackDistanceHelp": { - "message": "Während des Track Back geflogene Distanz. Normaler RTH wird ausgeführt, wenn diese Gesamtflugstrecke überschritten wird [m]." - }, - "rthSafeHome": { - "message": "Sicherer Home-Modus" - }, - "rthSafeHomeHelp": { - "message": "Dient zur Steuerung, wann Safehomes verwendet werden sollen. Mögliche Werte sind OFF, RTH und RTH_FS. Siehe Safehome-Dokumentation für weitere Informationen." - }, - "rthSafeHomeDistance": { - "message": "Safe Home Max Abstand" - }, - "rthSafeHomeDistanceHelp": { - "message": "Damit ein Safehome verwendet werden kann, muss es weniger als diese Entfernung [in cm] vom Arm-Punkt entfernt sein." - }, - "navMaxAltitude": { - "message": "Maximale Flughöhe für die Navigation" - }, - "navMaxAltitudeHelp": { - "message": "Maximal zulässige Höhe (über dem Home Point), die für alle NAV-Modi gilt (einschließlich Altitude Hold). 0 bedeutet, dass der Grenzwert deaktiviert ist" - }, - "rthHomeAltitudeLabel": { - "message": "RTH-Höhe" - }, - "rthHomeAltitudeHelp": { - "message": "Wird verwendet, wenn nicht am Home-Punkt gelandet wird. Bei der Ankunft amHome bleibt das Flugzeug in der Schwebe und ändert die Höhe auf die RTH Home Altitude. Standardwert ist 0, d. h. die Funktion ist deaktiviert." - }, - "rthTwoStage": { - "message": "Steigen Erste Stufe Methode" - }, - "rthTwoStageHelp": { - "message": "Stufenweise Rückkehr zu Home, wenn Steigen zuerst aktiviert ist. Setzen Sie Climb First Stage Altitude auf 0, um den klassischen Single-Stage RTH zu verwenden." - }, - "rthTwoStageAlt": { - "message": "Steigen Erste Stufe Höhe" - }, - "rthTwoStageAltHelp": { - "message": "Höheneinstellung für die erste Stufe des stufenweisen RTH. Auf 0 setzen, um zweistufiges RTH zu deaktivieren [0-65000cm]" - }, - "rthUseLinearDescent": { - "message": "Linearen Abstieg verwenden" - }, - "rthUseLinearDescentHelp": { - "message": "Wenn diese Funktion aktiviert ist, sinkt das Flugzeug auf dem Heimflugabschnitt des RTH langsam auf die RTH-Starthöhe ab." - }, - "rthLinearDescentStart": { - "message": "Linearer Abstieg Startabstand" - }, - "rthLinearDescentStartHelp": { - "message": "Dies ist die Entfernung von der Ausgangsposition, um den linearen Abstieg zu starten. Bei einem Wert von 0 wird der lineare Abstieg sofort gestartet." - }, - "landMaxAltVspd": { - "message": "Das Fluggerät beginnt mit dieser Geschwindigkeit zu sinken, sobald es die Heimat erreicht." - }, - "landMaxAltVspdHelp": { - "message": "Nach dem RTH, wenn die automatische Landung aktiviert ist, beginnt das Flugzeug mit dieser Geschwindigkeit zu sinken, bis es die Slow down altitude erreicht." - }, - "landSlowdownMaxAlt": { - "message": "Wenn das Fahrzeug auf diese Höhe gesunken ist. Es wird beginnen, für die Landung abzubremsen." - }, - "landSlowdownMaxAltHelp": { - "message": "Wenn das Flugzeug diese Höhe erreicht, beginnt es, linear zwischen der Anfangslandegeschwindigkeit und der Endlandegeschwindigkeit abzubremsen, um sie auf der Endanflughöhe zu erreichen." - }, - "landSlowdownMinAlt": { - "message": "Wenn das Flugzeug auf diese Höhe gesunken ist, hat es seine Geschwindigkeit auf die Landegeschwindigkeit reduziert." - }, - "landMinAltVspd": { - "message": "Dies ist die Aufsetzgeschwindigkeit." - }, - "landMinAltVspdHelp": { - "message": "Die vertikale Zielgeschwindigkeit des Flugzeugs ist dieser Wert, wenn das Flugzeug die Endanflughöhe erreicht, nachdem es von der Abflughöhe bei der Anfangslandegeschwindigkeit linear abgebremst hat." - }, - "emergencyDescentRate": { - "message": "Geschwindigkeit der Notlandung" - }, - "cruiseThrottle": { - "message": "Cruise Gaswert" - }, - "cruiseYawRateLabel": { - "message": "Cruise-Gierrate" - }, - "cruiseYawRateHelp": { - "message": "Dies ist die Drehrate in Cruise und 3D Cruise." - }, - "cruiseManualThrottleLabel": { - "message": "Manuelle Erhöhung des Gaswertes zulassen" - }, - "cruiseManualThrottleHelp": { - "message": "Wenn Sie diese Funktion aktivieren, können Sie die automatische Gassteuerung in allen Navigationsmodi außer Kraft setzen. Sie können den automatischen Gaswert nicht unterschreiten, es sei denn, der Motor wird bei Nullgas gestoppt." - }, - "minThrottle": { - "message": "Min. Gas" - }, - "maxThrottle": { - "message": "Max. Gas" - }, - "maxBankAngle": { - "message": "Max. Navigationsneigungswinkel" - }, - "maxBankAngleHelp": { - "message": "Maximaler Schräglagenwinkel in den Navigationsmodi. Begrenzt durch den maximalen ROLL-Winkel in der Tab PID-Einstellung." - }, - "maxClimbAngle": { - "message": "Max. Steigwinkel in Navigationsmodi" - }, - "maxClimbAngleHelp": { - "message": "Maximaler Steigwinkel in den Navigationsmodi. Begrenzt durch den maximalen PITCH-Winkel in der Tab PID-Abstimmung." - }, - "navManualClimbRate": { - "message": "Max. Steigrate bei \"Alt Hold\"" - }, - "navManualClimbRateHelp": { - "message": "Maximale Steig-/Sinkgeschwindigkeit, die die Firmware bei der Verarbeitung von Piloteneingaben für den ALTHOLD-Regelungsmodus zulässt [cm/s]." - }, - "navAutoClimbRate": { - "message": "Maximale Steigrate der Navigation" - }, - "navAutoClimbRateHelp": { - "message": "Maximale Steig-/Sinkgeschwindigkeit, die das UAV im Navigationsmodus erreichen darf. [cm/s]" - }, - "maxDiveAngle": { - "message": "Max. Navigations-Tauchwinkel" - }, - "maxDiveAngleHelp": { - "message": "Maximaler Tauchwinkel in den Navigationsmodi. Begrenzt durch den maximalen PITCH-Winkel in der Tab PID-Einstellung." - }, - "pitchToThrottle": { - "message": "Verhältnis von Nick zu Gaspedal" - }, - "pitchToThrottleHelp": { - "message": "In den Navigationsmodi wird jeder Grad Steigen um diese Anzahl von Einheiten zum Cruise-Gas addiert. Umgekehrt wird jedes Grad des Sinkens davon abgezogen." - }, - "minThrottleDownPitch": { - "message": "Min. Drossel-Abwärtsneigung" - }, - "minThrottleDownPitchHelp": { - "message": "Automatisches Absenken des Nickwinkels, wenn der Gashebel im Winkelmodus auf 0 steht. Wird schrittweise zwischen Reisegas und Null-Gas angewendet." - }, - "pitchToThrottleSmoothing": { - "message": "Gasglättung" - }, - "pitchToThrottleSmoothingHelp": { - "message": "Wie sanft der Autopilot das Gas als Reaktion auf Änderungen des Neigungswinkels anpasst [0-9]." - }, - "pitchToThrottleThreshold": { - "message": "Schwellenwert für die sofortige Gaseinstellung" - }, - "pitchToThrottleThresholdHelp": { - "message": "Der Autopilot passt das Gas sofort und ohne Glättung entsprechend dem Verhältnis von Pitch zu Gas an, wenn der Pitchwinkel um so viele Zentidegrees vom gefilterten Wert abweicht." - }, - "loiterRadius": { - "message": "Laderadius" - }, - "loiterDirectionLabel": { - "message": "Kreisflugrichtung" - }, - "loiterDirectionHelp": { - "message": "Mit dieser Einstellung können Sie die Richtung des Kreisfluges wählen. Wenn Sie YAW auswählen, können Sie die Schweberichtung mit dem Gierknüppel ändern." - }, - "controlSmoothness": { - "message": "Kontroll \"Smoothness\"" - }, - "controlSmoothnessHelp": { - "message": "Wie sanft der Autopilot das Flugzeug steuert, um den Navigationsfehler zu korrigieren [0-9]." - }, - "wpTrackingAccuracy": { - "message": "Genauigkeit der Wegpunktverfolgung" - }, - "wpTrackingAccuracyHelp": { - "message": "Wie genau das Flugzeug versucht, einem Wegpunkt zu folgen. Niedrigere Werte bedeuten höhere Präzision, können aber zu Überschwingern führen. 6 ist ein guter Startwert [0-10]." - }, - "wpTrackingAngle": { - "message": "Winkel der Wegpunktverfolgung" - }, - "wpTrackingAngleHelp": { - "message": "Der Winkel, in dem sich das Fahrzeug der Wegpunktspur nähert. Niedrigere Werte verlängern die Annäherung, während höhere Werte zu Überschwingen führen können. 60° ist ein guter Ausgangspunkt [30-80]." - }, - "powerConfiguration": { - "message": "Einstellungen für die Akkuschätzung" - }, - "idlePower": { - "message": "Leerlaufleistung" - }, - "idlePowerHelp": { - "message": "Leistungsaufnahme bei Nullgas für die Schätzung der verbleibenden Flugzeit/Entfernung in 0,01-W-Einheiten" - }, - "cruisePower": { - "message": "Cruise-Leistung" - }, - "cruisePowerHelp": { - "message": "Leistungsaufnahme bei Cruise-Geschwindigkeit für die Schätzung der verbleibenden Flugzeit/Entfernung in 0,01-W-Einheiten" - }, - "cruiseSpeed": { - "message": "Cruise-Geschwindigkeit" - }, - "cruiseSpeedHelp": { - "message": "Geschwindigkeit des Fluggerätes bei Cruise-Geschwindigkeit, die für die Schätzung der verbleibenden Flugzeit/Entfernung verwendet wird, in cm/s" - }, - "rthEnergyMargin": { - "message": "RTH-Energiespanne" - }, - "rthEnergyMarginHelp": { - "message": "Gewünschte Energiespanne nach der Heimkehr (Prozent der Akkukapazität). Wird für die Berechnung der verbleibenden Flugzeit/Entfernung verwendet." - }, - "generalNavigationSettings": { - "message": "Allgemeine Navigationseinstellungen" - }, - "waypointConfiguration": { - "message": "Einstellungen für die Wegpunktnavigation" - }, - "wpLoadBoot": { - "message": "Wegpunkte beim Booten laden" - }, - "wpLoadBootHelp": { - "message": "Wenn diese Option aktiviert ist, werden die Wegpunktmissionen im EEPROM nach dem Hochfahren automatisch geladen." - }, - "wpEnforceAlt": { - "message": "Höhe am Wegpunkt erzwingen" - }, - "wpEnforceAltHelp": { - "message": "Stellt sicher, dass die Höhe an jedem Wegpunkt erreicht wird, bevor der nächste Wegpunkt angeflogen wird. Das Flugzeug hält die Position [Kreisen für Starrflügler] und steigt, bis die Höhe innerhalb des eingestellten Bereichs [1-2000 cm] von der Höhe des Wegpunkts liegt. Zum Deaktivieren auf [0] setzen. Starrflügeler sollten nicht unter 500 cm eingestellt werden." - }, - "waypointRadius": { - "message": "Wegpunkt-Radius" - }, - "wpRestartMission": { - "message": "Wegpunkt-Mission neu starten" - }, - "wpRestartMissionHelp": { - "message": "Legt das Wiederanlaufverhalten für eine WP-Mission fest, wenn diese mitten in der Mission unterbrochen wird. START vom ersten WP, RESUME vom letzten aktiven WP oder SWITCH zwischen START und RESUME jedes Mal, wenn der WP-Modus wieder auf ON gestellt wird. SWITCH ermöglicht die einmalige Wiederaufnahme von einem früheren Wegpunkt in der Missionsmitte, wonach die Mission vom ersten Wegpunkt aus neu gestartet wird." - }, - "wpTurnSmoothing": { - "message": "Wegpunktabbiegung glätten" - }, - "wpTurnSmoothingHelp": { - "message": "Glättet Kurven während WP-Missionen durch Umschalten auf einen Kreisflug an Wegpunkten. Bei der Einstellung ON erreicht das Fahrzeug den Wegpunkt während der Wende. Bei der Einstellung ON-CUT wendet das Fahrzeug innerhalb des Wegpunkts, ohne ihn tatsächlich zu erreichen (schneidet die Ecke ab)." - }, - "navMotorStop": { - "message": "Navigation Motor Stop Überbrückung" - }, - "navMotorStopHelp": { - "message": "Bei der Einstellung OFF übernimmt das Navigationssystem nicht die Kontrolle über den Motor, wenn das Gas zu niedrig ist (der Motor wird angehalten). Bei der Einstellung OFF_ALWAYS übernimmt das Navigationssystem nicht die Steuerung des Motors, wenn das Gas zu niedrig ist, auch wenn Failsafe ausgelöst wurde. Bei der Einstellung AUTO_ONLY übernimmt das Navigationssystem die Steuerung des Gases nur in den autonomen Navigationsmodi (NAV WP und NAV RTH). Bei der Einstellung ALL_NAV (Standardeinstellung) übernimmt das Navigationssystem die Steuerung des Motors vollständig und lässt ein Anhalten des Motors nicht zu, auch wenn der Gashebel niedrig ist. Diese Einstellung wirkt sich nur auf NAV-Modi aus, die in Kombination mit MOTOR_STOP die Kontrolle über den Gashebel übernehmen, und kann zu einem Strömungsabriss führen, wenn fw_min_throttle_down_pitch nicht korrekt eingestellt ist oder die Pitch-Schätzung bei Starrflüglern falsch ist, wenn sie nicht auf ALL_NAV eingestellt ist." - }, - "soarMotorStop": { - "message": "Segelflugmodus Motorstopp" - }, - "soarMotorStopHelp": { - "message": "Stoppt den Motor, wenn der Segelflugmodus aktiviert ist." - }, - "soarPitchDeadband": { - "message": "Segelflugmodus Pitch Deadband" - }, - "soarPitchDeadbandHelp": { - "message": "Pitchwinkel-Deadband bei aktiviertem Segelflugmoduss (Grad). Der Winkelmodus ist innerhalb des Deadband inaktiv, so dass der Pitch beim Soaren frei schweben kann." - }, - "waypointRadiusHelp": { - "message": "Damit wird die Entfernung von einem Wegpunkt festgelegt, ab der der Wegpunkt als erreicht gilt." - }, - "waypointSafeDistance": { - "message": "Wegpunkt Sicherheitsabstand" - }, - "waypointSafeDistanceHelp": { - "message": "Die maximale Entfernung zwischen dem Startpunkt und dem ersten Wegpunkt." - }, - "fixedWingNavigationConfiguration": { - "message": "Navigationseinstellungen für Starrflügler" - }, - "osd_unsupported_msg1": { - "message": "Ihr Flugcontroller reagiert nicht auf OSD-Befehle. Dies bedeutet wahrscheinlich, dass er kein integriertes OSD hat." - }, - "osd_unsupported_msg2": { - "message": "Beachten Sie, dass einige Flugscontroller über ein eingebautes MinimOSD verfügen, das mit scarab-osd geflasht und konfiguriert werden kann, jedoch kann das MinimOSD nicht über diese Schnittstelle konfiguriert werden." - }, - "osd_elements": { - "message": "Elemente" - }, - "osd_preview_title": { - "message": "Vorschau (zum Ändern der Position ziehen)" - }, - "osd_preview_title_drag": { - "message": "" - }, - "osd_video_format": { - "message": "Video Format" - }, - "osd_craft_name": { - "message": "Name des Fluggeräts" - }, - "osd_pilot_name": { - "message": "Name des Piloten" - }, - "osdElement_PILOT_LOGO_HELP": { - "message": "Zeigt Ihr kleines Pilotenlogo im OSD, wo Sie es positionieren. Dies erfordert eine eigene Schriftart mit Ihrem Pilotenlogo." - }, - "osd_use_pilot_logo": { - "message": "Pilotrnlogo verwenden" - }, - "osd_use_large_pilot_logo_help": { - "message": "Verwenden Sie Ihr großes Pilotenlogo mit/anstelle des INAV-Logos. Dies erfordert eine benutzerdefinierte Schriftart mit Ihrem Pilotenlogo. Dies ist auf dem Aktivierungsbildschirm zu sehen." - }, - "osd_units": { - "message": "Einheiten" - }, - "osd_main_voltage_decimals": { - "message": "Spannung Dezimalziffern" - }, - "osd_mah_precision": { - "message": "mAh Präzision" - }, - "osd_coordinate_digits": { - "message": "Koordinatenziffern" - }, - "osd_plus_code_digits": { - "message": "Plus Code Ziffern" - }, - "osd_plus_code_short": { - "message": "Plus Code Führende Ziffern entfernen" - }, - "osd_esc_rpm_precision": { - "message": "ESC-Drehzahlgenauigkeit" - }, - "osd_esc_rpm_precision_help": { - "message": "Die Anzahl der Ziffern, die in der Drehzahlanzeige angezeigt werden. Wenn die Drehzahl höher ist als die Anzahl der Stellen, wird sie in Tausend U/min mit so vielen Nachkommastellen wie möglich angezeigt." - }, - "osd_crosshairs_style": { - "message": "Fadenkreuz-Stil" - }, - "osd_horizon_offset": { - "message": "AHI & HUD Offset" - }, - "osd_horizon_offset_help": { - "message": "Bewegen Sie das HUD und die AHI auf dem OSD nach oben oder unten, um sie mit dem tatsächlichen Horizont in Übereinstimmung zu bringen. Das AHI kann je nach Kamerawinkel im Flug hoch oder niedrig erscheinen. Hinweis: Dies funktioniert nicht mit dem Pixel OSD. Verwenden Sie dafür den Befehl `osd_ahi_vertical_offset` in der CLI." - }, - "osd_left_sidebar_scroll": { - "message": "Linke Seitenleiste scrollen" - }, - "osd_right_sidebar_scroll": { - "message": "Rechte Seitenleiste scrollen" - }, - "osd_crsf_lq_format": { - "message": "Crossfire LQ Format" - }, - "osd_sidebar_scroll_arrows": { - "message": "Pfeile zum Scrollen in der Seitenleiste" - }, - "osd_home_position_arm_screen": { - "message": "Ausgangsposition auf dem Arm-Bildschirm" - }, - "osd_hud_settings": { - "message": "Einstellungen für das Heads-up-Display" - }, - "osd_hud_settings_HELP": { - "message": "In diesem Abschnitt kann das Verhalten der HUD-Elemente angepasst werden." - }, - "osd_hud_radar_disp": { - "message": "Maximale Anzahl von Radarelementen auf dem Bildschirm." - }, - "osd_hud_radar_disp_help": { - "message": "Dies wird für INAV Radar/FormationFlight verwendet. 0 schaltet diese Funktion aus." - }, - "osd_hud_radar_range_min": { - "message": "Minimale Radarreichweite" - }, - "osd_hud_radar_range_min_help": { - "message": "Radarflugzeuge, die sich näher an diesem Punkt befinden, werden im HUD nicht angezeigt." - }, - "osd_hud_radar_range_max": { - "message": "Maximale Radarreichweite" - }, - "osd_hud_radar_range_max_help": { - "message": "Radarflugzeuge, die weiter entfernt sind, werden im HUD nicht angezeigt." - }, - "osd_hud_wp_disp": { - "message": "Maximale Anzahl von Wegpunktelementen auf dem Bildschirm." - }, - "osd_hud_wp_disp_help": { - "message": "Anzahl der Wayponts, die auf dem Bildschirm angezeigt werden. 0 schaltet diese Funktion aus." - }, - "osd_camera_uptilt": { - "message": "Kamera nach oben kippen" - }, - "osd_camera_uptilt_help": { - "message": "Legt die Kameraneigung für die FPV-Kamera in Grad fest, positiv ist oben, negativ ist unten, relativ zur Horizontalen. Wird für die korrekte Anzeige von HUD-Elementen und AHI (wenn aktiviert) verwendet." - }, - "osd_camera_fov_h": { - "message": "Kamera Horizontal FOV" - }, - "osd_camera_fov_h_help": { - "message": "Horizontales Sichtfeld der Kamera in Grad. Es wird verwendet, um die Position der Elemente in der HUD-Anzeige zu berechnen." - }, - "osd_camera_fov_v": { - "message": "Kamera Vertikal FOV" - }, - "osd_camera_fov_v_help": { - "message": "Vertikales Sichtfeld der Kamera in Grad. Es wird verwendet, um die Position der Elemente in der HUD-Anzeige zu berechnen." - }, - "osd_alarms": { - "message": "Alarme" - }, - "osdLayoutDefault": { - "message": "Standard-Layout" - }, - "osdLayoutAlternative": { - "message": "Alternatives Layout #$1" - }, - "osdUnitImperial": { - "message": "Imperial" - }, - "osdUnitMetric": { - "message": "Metrisch" - }, - "osdUnitMetricMPH": { - "message": "Metrisch + MPH" - }, - "osdUnitMetricMPHTip": { - "message": "Verwenden Sie metrische Einheiten, außer für die Geschwindigkeit, die in Meilen pro Stunde angezeigt wird." - }, - "osdUnitUK": { - "message": "UK" - }, - "osdUnitUKTip": { - "message": "Verwenden Sie imperiale Einheiten, außer für die Temperatur, die in Celsius angezeigt wird." - }, - "osdUnitGA": { - "message": "Allgemeine Luftfahrt" - }, - "osdUnitGATip": { - "message": "Verwenden Sie GA-Standardeinheiten (nicht-SI): Nautische Meilen, Fuß, Knoten, Celcius." - }, - "osd_rssi_alarm": { - "message": "CISO (%)" - }, - "osdAlarmBATT_CAP": { - "message": "Verbrauchte Akkukapazität" - }, - "osdAlarmBATT_CAP_HELP": { - "message": "Die Anzeige für die verbrauchte Akkukapazität (mah drawn) blinkt, wenn die verbrauchte Gesamtmah größer als dieser Wert ist. Erfordert einen Stromsensor. Null deaktiviert diesen Alarm." - }, - "osd_time_alarm": { - "message": "Flugzeit (Minuten)" - }, - "osd_alt_alarm": { - "message": "Höhe" - }, - "osd_dist_alarm": { - "message": "Entfernung" - }, - "osdAlarmDIST_HELP": { - "message": "Die Entfernungsanzeige blinkt, wenn die Entfernung größer als dieser Wert ist. Mit Null wird dieser Alarm deaktiviert." - }, - "osd_neg_alt_alarm": { - "message": "Negative Höhe" - }, - "osdAlarmMAX_NEG_ALTITUDE_HELP": { - "message": "Die Höhenanzeige blinkt, wenn die Höhe negativ ist und ihr absoluter Wert größer als dieser Alarm ist. Nützlich beim Start von höher gelegenen Orten. Null deaktiviert diesen Alarm." - }, - "osd_airspeed_min_alarm": { - "message": "Minimale Fluggeschwindigkeit" - }, - "osd_airspeed_min_alarm_HELP": { - "message": "Die Fluggeschwindigkeitsanzeige blinkt, wenn die Fluggeschwindigkeit unter diesem Schwellenwert liegt. Null deaktiviert diesen Alarm." - }, - "osd_airspeed_max_alarm": { - "message": "Maximale Fluggeschwindigkeit" - }, - "osd_airspeed_max_alarm_HELP": { - "message": "Die Fluggeschwindigkeitsanzeige blinkt, wenn die Fluggeschwindigkeit über diesem Schwellenwert liegt. Null deaktiviert diesen Alarm." - }, - "osd_gforce_alarm": { - "message": "g Kraft" - }, - "osdAlarmGFORCE_HELP": { - "message": "Das Element g force beginnt zu blinken, wenn es diesen Wert überschreitet" - }, - "osd_gforce_axis_alarm_min": { - "message": "g Kraftachse min" - }, - "osdAlarmGFORCE_AXIS_MIN_HELP": { - "message": "Die g-Kraftelemente der Achsen beginnen zu blinken, wenn dieser Wert unterschritten wird." - }, - "osd_gforce_axis_alarm_max": { - "message": "g Kraftachse max" - }, - "osdAlarmGFORCE_AXIS_MAX_HELP": { - "message": "Die g-Kraftelemente der Achsen beginnen zu blinken, wenn sie größer als dieser Wert sind." - }, - "osdAlarmADSB_MAX_DISTANCE_WARNING": { - "message": "Entfernung des angezeigten ADSB-Flugzeugs in Metern" - }, - "osdAlarmADSB_MAX_DISTANCE_ALERT": { - "message": "Abstand, innerhalb dessen die ADSB-Daten für die Annäherungswarnung blinken" - }, - "osd_current_alarm": { - "message": "Stromstärke (A)" - }, - "osdAlarmCURRENT_HELP": { - "message": "Das Element für die Stromaufnahme beginnt zu blinken, wenn der Verbrauch über diesem Wert liegt. Null deaktiviert diesen Alarm." - }, - "osd_imu_temp_alarm_min": { - "message": "Minimale IMU-Temperatur" - }, - "osd_imu_temp_alarm_max": { - "message": "Maximale IMU-Temperatur" - }, - "osd_baro_temp_alarm_min": { - "message": "Minimale Baro-Temperatur" - }, - "osd_baro_temp_alarm_max": { - "message": "Maximale Baro-Temperatur" - }, - "osd_esc_temp_alarm_min": { - "message": "Minimale ESC-Temperatur" - }, - "osd_esc_temp_alarm_max": { - "message": "Maximale ESC-Temperatur" - }, - "osd_snr_alarm": { - "message": "CRSF SNR Alarmstufe" - }, - "osdalarmSNR_HELP": { - "message": "Das SNR wird nur unterhalb dieses Wertes angezeigt. 0 dB (Verhältnis 1:1) bedeutet, dass das empfangene Signal gleich dem Grundrauschen ist." - }, - "osd_link_quality_alarm": { - "message": "CRSF Verbindungsqualitäts-Alarm" - }, - "osdalarmLQ_HELP": { - "message": "Für Crossfire verwenden Sie 70%. Für Tracer verwenden Sie 50%." - }, - "osd_rssi_dbm_alarm": { - "message": "CRSF RSSI dBm Alarm" - }, - "osd_adsb_distance_warning": { - "message": "ADSB-Abstandswarnung" - }, - "osd_adsb_distance_alert": { - "message": "ADSB-Abstandsalarm" - }, - "osd_rssi_dbm_alarm_HELP": { - "message": "Unterhalb dieses Wertes blinkt die RSSI-Anzeige. Bereich: [-130,0]. 0 deaktiviert diesen Alarm." - }, - "osdGroupGeneral": { - "message": "Allgemein" - }, - "osdGroupAltitude": { - "message": "Höhe" - }, - "osdGroupTimers": { - "message": "Zeitschaltuhren" - }, - "osdGroupGForce": { - "message": "G-Kraft" - }, - "osdGroupTemperature": { - "message": "Temperatur" - }, - "osdGroupAttitude": { - "message": "Einstellung" - }, - "osdGroupCurrentMeter": { - "message": "Stromzähler" - }, - "osdGroupGPS": { - "message": "GPS" - }, - "osdGroupPowerLimits": { - "message": "Leistungsgrenzen" - }, - "osdGroupPIDs": { - "message": "RC Einstellbare Werte" - }, - "osdGroupPIDOutputs": { - "message": "PID-Regler Ausgänge" - }, - "osdGroupVTX": { - "message": "VTX" - }, - "osdGroupCRSF": { - "message": "CRSF RX-Statistik" - }, - "osdGroupMapsAndRadars": { - "message": "Karten und Radare" - }, - "osdGroupMapsAndRadars_HELP": { - "message": "Karten und Radare erlauben es, zusätzliche Elemente darauf zu legen, solange sie keine der in der Vorschau sichtbaren Kartenteile überlappen." - }, - "osdElement_ONTIME_FLYTIME": { - "message": "Laufzeit/Flugzeit" - }, - "osdElement_RSSI_VALUE": { - "message": "RSSI (Signalstärke)" - }, - "osdElement_RSSI_VALUE_HELP": { - "message": "Zeigt die Qualität des vom RC-Funkgerät empfangenen Signals an (je höher, desto besser)." - }, - "osdElement_MAIN_BATT_VOLTAGE": { - "message": "Akku-Spannung" - }, - "osdElement_SAG_COMP_MAIN_BATT_VOLTAGE": { - "message": "Kompensierte Akkuspannung" - }, - "osdElement_SAG_COMP_MAIN_BATT_VOLTAGE_HELP": { - "message": "Berechnete Spannung, die der Akku ohne Last haben sollte (simuliert die ideale Akku)" - }, - "osdElement_MESSAGES": { - "message": "Systemmeldungen" - }, - "osdElement_MESSAGES_HELP": { - "message": "Zeigt verschiedene Systemmeldungen wie Warnungen, Hardware-Fehler und erweiterte Details zum aktuellen Flugmodus (z.B. AUTOTUNE- und AUTOTRIM-Modi und RTH-Stufen)." - }, - "osdElement_MAIN_BATT_CELL_VOLTAGE": { - "message": "Spannung der Akkuzelle" - }, - "osdElement_SAG_COMP_MAIN_BATT_CELL_VOLTAGE": { - "message": "Kompensierte Akkuzellenspannung" - }, - "osdElement_SAG_COMP_MAIN_BATT_CELL_VOLTAGE_HELP": { - "message": "Berechnete durchschnittliche Zellenspannung, die die Akku ohne Last haben sollte (simuliert die ideale Akku)" - }, - "osdElement_MAIN_BATT_REMAINING_PERCENTAGE": { - "message": "Verbleibender Prozentsatz des Akku" - }, - "osdElement_MAIN_BATT_REMAINING_CAPACITY": { - "message": "Verbleibende Akkukapazität" - }, - "osdElement_REMAINING_FLIGHT_TIME_HELP": { - "message": "Geschätzte verbleibende Flugzeit, bevor das Flugzeug nach Hause zurückkehren muss, basierend auf der verbleibenden Akkuleistung, der durchschnittlichen Leistung und der Entfernung zum Heimatort (nur bei Flächenflugzeugen, bitte lesen Sie die Dokumentation)" - }, - "osdElement_REMAINING_FLIGHT_DISTANCE_HELP": { - "message": "Geschätzte verbleibende Flugdistanz, bevor das Flugzeug nach Hause zurückkehren muss, basierend auf der verbleibenden Akkuleistung, der durchschnittlichen Leistung und der Entfernung zum Heimatort (nur Starrflügler, bitte lesen Sie die Dokumentation)" - }, - "osdElement_MAIN_BATT_CELL_VOLTAGE_HELP": { - "message": "Zeigt die durchschnittliche Zellenspannung der Hauptbatterie an" - }, - "osdElement_MAH_DRAWN": { - "message": "mAh verbraucht" - }, - "osdElement_EFFICIENCY_MAH": { - "message": "Wirkungsgrad mAh/Km" - }, - "osdElement_EFFICIENCY_WH": { - "message": "Wirkungsgrad Wh/Km" - }, - "osdElement_PLIMIT_REMAINING_BURST_TIME": { - "message": "Verbleibende Burst-Zeit" - }, - "osdElement_PLIMIT_ACTIVE_CURRENT_LIMIT": { - "message": "Aktive Stromgrenze" - }, - "osdElement_PLIMIT_ACTIVE_POWER_LIMIT": { - "message": "Begrenzung der Wirkleistung" - }, - "osdElement_THROTTLE_POSITION_HELP": { - "message": "Zeigt die Position des Gasknüppels in den Flugmodi an, in denen er die Gasausgabe steuert. In den Navigationsmodi zeigt es den vom INAV befohlenen Gaswert an." - }, - "osdElement_SCALED_THROTTLE_POSITION_HELP": { - "message": "Zeigt die Position des Gasknüppels in den Flugmodi an, in denen er die Gasausgabe steuert. In den Navigationsmodi zeigt es den von INAV befohlenen Gaswert an. Dieses Gas wird auf der Basis des Leerlaufs und des Maximalgases skaliert." - }, - "osdElement_GPS_SPEED": { - "message": "Geschwindigkeit über Grund" - }, - "osdElement_GPS_SPEED_HELP": { - "message": "Zeigt die GPS-Geschwindigkeit über Grund an." - }, - "osdElement_GPS_MAX_SPEED": { - "message": "GPS-Höchstgeschwindigkeit" - }, - "osdElement_GPS_MAX_SPEED_HELP": { - "message": "Zeigt die höchste GPS-Geschwindigkeit über Grund an." - }, - "osdElement_MSL_ALTITUDE": { - "message": "Höhe über dem Meer" - }, - "osdElement_MSL_ALTITUDE_HELP": { - "message": "Höhe über dem Mittleren Meeresspiegel" - }, - "osdElement_3D_SPEED": { - "message": "3D-Geschwindigkeit" - }, - "osdElement_3D_SPEED_HELP": { - "message": "Zeigt die 3D-Geschwindigkeit an, wobei sowohl die horizontale als auch die vertikale Geschwindigkeit berücksichtigt werden." - }, - "osdElement_3D_MAX_SPEED": { - "message": "3D Höchstgeschwindigkeit" - }, - "osdElement_3D_MAX_SPEED_HELP": { - "message": "Zeigt die höchste 3D-Geschwindigkeit an, die sowohl die horizontale als auch die vertikale Geschwindigkeit berücksichtigt." - }, - "osdElement_AIR_MAX_SPEED": { - "message": "Maximale Fluggeschwindigkeit" - }, - "osdElement_AIR_MAX_SPEED_HELP": { - "message": "Zeigt die höchste Fluggeschwindigkeit an." - }, - "osdElement_GPS_SATS": { - "message": "GPS-Satelliten" - }, - "osdElement_GPS_SATS_HELP": { - "message": "Zeigt die Anzahl der vom GPS-Empfänger georteten GPS-Satelliten an." - }, - "osdElement_GPS_HDOP": { - "message": "GPS HDOP" - }, - "osdElement_GPS_HDOP_HELP": { - "message": "Zeigt die horizontale Präzisionsabweichung des GPS an. Je niedriger, desto genauer ist der GPS-Fix." - }, - "osdElement_PLUS_CODE": { - "message": "Plus Code (Breitengrad + Längengrad)" - }, - "osdElement_PLUS_CODE_HELP": { - "message": "Plus-Codes kodieren sowohl Breiten- als auch Längengrad in einem einzigen Wert, der direkt in Google Maps eingegeben werden kann. Er bietet die gleiche Präzision wie Breiten- und Längengrade und benötigt weniger Platz auf dem Bildschirm." - }, - "osdElement_AZIMUTH": { - "message": "Azimut" - }, - "osdElement_AZIMUTH_HELP": { - "message": "Der Azimut ist die Richtung des Flugzeugs in Bezug auf den Startpunkt. Es ist nützlich, um das Flugzeug auf dem richtigen Kurs zu halten oder um das Flugzeug vor einer festen Richtantenne zu halten." - }, - "osdElement_TRIP_DIST": { - "message": "Flugdistanz" - }, - "osdElement_VARIO_HELP": { - "message": "Zeigt die vertikale Geschwindigkeit mit Auf- und Abwärtspfeilen an. Jeder Pfeil steht für 10 cm (~4 Zoll) pro Sekunde." - }, - "osdElement_VARIO_NUM": { - "message": "Numerisches Vario" - }, - "osdElement_VARIO_NUM_HELP": { - "message": "Zeigt die vertikale Geschwindigkeit in Form einer Zahl an" - }, - "osdElement_G_FORCE": { - "message": "g Kraft" - }, - "osdElement_G_FORCE_HELP": { - "message": "Zeigt die g-Kraft unter Berücksichtigung aller Achsen" - }, - "osdElement_G_FORCE_X": { - "message": "g-Kraft in Längsrichtung im Körperrahmen (X)" - }, - "osdElement_G_FORCE_X_HELP": { - "message": "Zeigt die g-Kraft in der X-Achse (längs)" - }, - "osdElement_G_FORCE_Y": { - "message": "Seitliche g-Kraft im Körperrahmen (Y)" - }, - "osdElement_G_FORCE_Y_HELP": { - "message": "Zeigt die g-Kraft in der Y-Achse (seitlich)" - }, - "osdElement_G_FORCE_Z": { - "message": "Vertikale g-Kraft im Körperrahmen (Z)" - }, - "osdElement_G_FORCE_Z_HELP": { - "message": "Zeigt die g-Kraft in der Z-Achse (vertikal) an." - }, - "osdElement_ROLL_PIDS": { - "message": "PIDs Roll" - }, - "osdElement_PITCH_PIDS": { - "message": "Nick PIDs" - }, - "osdElement_YAW_PIDS": { - "message": "Gier PIDs" - }, - "osdElement_ONTIME_FLYTIME_HELP": { - "message": "Zeigt \"Laufzeit\" an, wenn nicht armed, und \"Flugzeit\", wenn armed." - }, - "osdElement_RTC_TIME": { - "message": "Zeit des Tages" - }, - "osdElement_RTC_TIME_HELP": { - "message": "Zeigt die aktuelle Zeit an, wie sie vom GPS abgerufen oder über das Radio eingestellt wurde." - }, - "osdElement_RC_SOURCE": { - "message": "RC Quelle" - }, - "osdElement_RC_SOURCE_HELP": { - "message": "Zeigt die aktuelle RC-Quelle an, STD oder MSP (nützlich bei Verwendung von MSP Override)" - }, - "osdElement_VTX_POWER": { - "message": "Video-Sendeleistungspegel" - }, - "osdElement_VTX_POWER_HELP": { - "message": "Zeigt den aktuellen VTX-Leistungspegel an. Blinkt, wenn die entsprechende RC-Einstellung ausgewählt ist." - }, - "osdElement_ESC_RPM": { - "message": "Motordrehzahl aus der ESC-Telemetrie" - }, - "osdElement_GLIDESLOPE": { - "message": "Gleitpfad" - }, - "osdElement_GLIDESLOPE_HELP": { - "message": "Menge der zurückgelegten horizontalen Strecke pro verlorener Höheneinheit" - }, - "osdElement_PAN_SERVO_CENTRED": { - "message": "Schwenkservo zentriert" - }, - "osdElement_PAN_SERVO_CENTRED_HELP": { - "message": "Zeigt an, ob der Schwenkservo zentriert (0) oder versetzt (Pfeile) ist. Prüfen Sie die osd_pan_servo_ Einstellungen für die Konfiguration des Pan-Servos." - }, - "osdElement_VTX_CHANNEL": { - "message": "Video TX Band und Kanal" - }, - "osdElement_VTX_CHANNEL_HELP": { - "message": "Zeigt das aktuelle Band und den Kanal des VTX an. Erfordert entweder einen VTX mit SmartAudio oder Tramp oder einen in den Flugcontroller integrierten VTX." - }, - "osdElement_CRSF_RSSI_DBM": { - "message": "RX-RSSI in dBm" - }, - "osdElement_CRSF_LQ": { - "message": "RX Link Qualität %" - }, - "osdElement_CRSF_LQ_HELP": { - "message": "Verwenden Sie die Einstellung Crossfire LQ Format, um den Formattyp auszuwählen." - }, - "osdElement_CRSF_SNR_DB": { - "message": "RX Uplink SNR in dB" - }, - "osdElement_CRSF_SNR_DB_HELP": { - "message": "Wird nur angezeigt, wenn das SNR unter den Alarmwert fällt. Bei 0 dB ist der Pegel des empfangenen Signals gleich dem Rauschpegel." - }, - "osdElement_CRSF_TX_POWER": { - "message": "Sendeleistung in mW" - }, - "osdElement_MAP_NORTH": { - "message": "Karte (Oben ist Norden)" - }, - "osdElement_MAP_TAKEOFF": { - "message": "Karte (Aufwärts ist die Abflugrichtung)" - }, - "osdElement_RADAR": { - "message": "Radar" - }, - "osdElement_MAP_SCALE": { - "message": "Map Maßstab" - }, - "osdElement_MAP_SCALE_HELP": { - "message": "Maßstab der aktuell angezeigten Karte/Radar." - }, - "osdElement_MAP_REFERENCE": { - "message": "Karten Referenz" - }, - "osdElement_MAP_REFERENCE_HELP": { - "message": "Referenz (Richtung, die nach oben zeigt) der aktuellen Karte. N für Norden und T für die Abflugrichtung." - }, - "osdElement_WIND_SPEED_HORIZONTAL": { - "message": "Horizontale Windgeschwindigkeit" - }, - "osdElement_WIND_SPEED_HORIZONTAL_HELP": { - "message": "Zeigt die geschätzte horizontale Windgeschwindigkeit und -richtung an." - }, - "osdElement_WIND_SPEED_VERTICAL": { - "message": "Vertikale Windgeschwindigkeit" - }, - "osdElement_WIND_SPEED_VERTICAL_HELP": { - "message": "Zeigt die geschätzte vertikale Windgeschwindigkeit und -richtung (aufwärts oder abwärts)." - }, - "osdElement_ACTIVE_PROFILE": { - "message": "Das aktive Profil anzeigen" - }, - "osdElement_LEVEL_PIDS": { - "message": "Level PIDs" - }, - "osdElement_POS_XY_PIDS": { - "message": "Position XY PIDs" - }, - "osdElement_POS_Z_PIDS": { - "message": "Z-Position PIDs" - }, - "osdElement_VEL_XY_PIDS": { - "message": "Velocity XY PIDs" - }, - "osdElement_VEL_Z_PIDS": { - "message": "Velocity Z PIDs" - }, - "osdElement_FW_ALT_PID_OUTPUTS": { - "message": "FW Höhe PID-Reglerausgänge" - }, - "osdElement_FW_POS_PID_OUTPUTS": { - "message": "FW Position PID-Reglerausgänge" - }, - "osdElement_MC_VEL_X_PID_OUTPUTS": { - "message": "MC Velocity X PID-Reglerausgänge" - }, - "osdElement_MC_VEL_Y_PID_OUTPUTS": { - "message": "MC Geschwindigkeit Y PID-Reglerausgänge" - }, - "osdElement_MC_VEL_Z_PID_OUTPUTS": { - "message": "MC Velocity Z PID-Reglerausgänge" - }, - "osdElement_MC_POS_XYZ_P_OUTPUTS": { - "message": "MC Position XYZ P-Regler Ausgänge" - }, - "osdElement_IMU_TEMPERATURE": { - "message": "IMU-Temperaturen" - }, - "osdElement_IMU_TEMPERATURE_HELP": { - "message": "Temperatur der IMU" - }, - "osdElement_BARO_TEMPERATURE": { - "message": "Baro Temperatur" - }, - "osdElement_BARO_TEMPERATURE_HELP": { - "message": "Temperatur des Barometers" - }, - "osdElement_ESC_TEMPERATURE": { - "message": "ESC-Temperatur" - }, - "osdElement_ESC_TEMPERATURE_HELP": { - "message": "Temperatur des ESC aus der DSHOT-Telemetrie ausgelesen" - }, - "osdGroupSwitchIndicators": { - "message": "Schalter-Anzeigen" - }, - "osdElement_SWITCH_INDICATOR_0": { - "message": "Schalter-Anzeige 1" - }, - "osdElement_SWITCH_INDICATOR_1": { - "message": "Schalter-Anzeiger 2" - }, - "osdElement_SWITCH_INDICATOR_2": { - "message": "Schalter-Anzeige 3" - }, - "osdElement_SWITCH_INDICATOR_3": { - "message": "Schalter-Anzeige 4" - }, - "osd_pan_servo_settings": { - "message": "Schwenkservo OSD-Einstellungen" - }, - "osd_pan_servo_settings_HELP": { - "message": "Dieser Abschnitt aktiviert und konfiguriert die Schwenk-Servo-Offset-Funktion. Sie wird verwendet, um OSD-Elemente, wie den Home-Pfeil und POIs, in die richtige Richtung zu bewegen. Auch wenn Sie die Kamera herumgeschwenkt haben." - }, - "osdPanServoIndex": { - "message": "Schwenkservo-Ausgang" - }, - "osdPanServoIndex_HELP": { - "message": "Stellen Sie den is auf die Ausgangsnummer des Schwenkservos ein, wie in der Tabelle der Mischerausgänge angegeben. Zum Beispiel Ausgang S6." - }, - "osdPanServoPwm2centideg": { - "message": "Gesamtgrad der Bewegung des Schwenkservos" - }, - "osdPanServoPwm2centideg_HELP": { - "message": "Grad der Schwenkservo-Drehung. Ein Servo mit 180 Grad Drehung von 1000 bis 2000 us PWM benötigt normalerweise 180 für diese Einstellung. Machen Sie den Wert negativ, um die Richtung umzukehren." - }, - "osdPanServoIndicatorShowDegrees": { - "message": "Anzeige des Versatzes in Grad neben der Schwenkanzeige" - }, - "osdPanServoOffcentreWarning": { - "message": "Außermittige Warnung" - }, - "osdPanServoOffcentreWarning_HELP": { - "message": "Grad beiderseits der Mitte des Schwenkservos; es wird davon ausgegangen, dass die Kamera nach vorne gerichtet sein soll, aber nicht auf 0 steht. Wenn sich die Kamera in diesem Bereich befindet und länger als 10 Sekunden nicht auf 0 steht, blinkt das OSD-Element für den Schwenkservo-Offset. 0 bedeutet, dass die Warnung deaktiviert ist." - }, - "osdGroupGVars": { - "message": "Globale Variablen" - }, - "osdElement_GVAR_0": { - "message": "Globale Variable 0" - }, - "osdElement_GVAR_1": { - "message": "Globale Variable 1" - }, - "osdElement_GVAR_2": { - "message": "Globale Variable 2" - }, - "osdElement_GVAR_3": { - "message": "Globale Variable 3" - }, - "osdElement_SENSOR1_TEMPERATURE": { - "message": "Temperatursensor 1" - }, - "osdElement_SENSOR2_TEMPERATURE": { - "message": "Temperatursensor 2" - }, - "osdElement_SENSOR3_TEMPERATURE": { - "message": "Temperatursensor 3" - }, - "osdElement_SENSOR4_TEMPERATURE": { - "message": "Temperatursensor 4" - }, - "osdElement_SENSOR5_TEMPERATURE": { - "message": "Temperatursensor 5" - }, - "osdElement_SENSOR6_TEMPERATURE": { - "message": "Temperaturfühler 6" - }, - "osdElement_SENSOR7_TEMPERATURE": { - "message": "Temperatursensor 7" - }, - "osdElement_SENSOR8_TEMPERATURE": { - "message": "Temperatursensor 8" - }, - "osdSettingMainVoltageDecimals": { - "message": "Dezimale Hauptspannung" - }, - "osdElement_OSD_RANGEFINDER": { - "message": "Entfernungsmesser" - }, - "osdSettingPLUS_CODE_DIGITS_HELP": { - "message": "Genauigkeit am Äquator: 10=13,9x13,9m; 11=2,8x3,5m; 12=56x87cm; 13=11x22cm." - }, - "osdSettingPLUS_CODE_SHORT_HELP": { - "message": "Das Entfernen von 2, 4 und 6 führenden Ziffern erfordert eine Referenzposition innerhalb von ~800km, ~40km bzw. ~2km, um die ursprünglichen Koordinaten wiederherzustellen." - }, - "osdSettingCRSF_LQ_FORMAT_HELP": { - "message": "TYPE1 zeigt LQ%, wie von der TBS-Hardware verwendet. TYPE2 zeigt RF-Profil-Modi (2=150Hz, 1=50Hz, 0=4Hz Aktualisierungsrate) und LQ % [0..100%]. Tracer zeigt RFMode 1 (1=250Hz) und LQ % [0..100%]." - }, - "osd_video_show_guides": { - "message": "Vorschau-Guides anzeigen" - }, - "osd_video_HELP": { - "message": "Für HD: rote Linien zeigen 4:3-Bildschirm, HDZero: innerhalb der blauen Box für eine höhere Bildwiederholfrequenz, AUTO/PAL: grüne Linie ist NTSC-Grenze." - }, - "osd_dji_HD_FPV": { - "message": "DJI HD FPV" - }, - "osd_dji_hide_unsupported": { - "message": "Nicht unterstützte Elemente ausblenden" - }, - "osd_dji_ESC_temp": { - "message": "Quelle der ESC-Temperatur" - }, - "osd_dji_RSSI_source": { - "message": "Quelle des RSSI" - }, - "osd_dji_GPS_source": { - "message": "Quelle der GPS-Geschwindigkeit" - }, - "osd_dji_speed_source": { - "message": "Quelle der 3D-Geschwindigkeit" - }, - "osd_dji_use_craft_name_elements": { - "message": "Verwenden des Elements \"Namen des Fluggerätes\" für Nachrichten und zusätzliche Elemente.
Elemente in blau erscheinen in Handwerksname." - }, - "osd_dji_adjustments": { - "message": "Anpassungen im \"Namen des Fluggerätes\" anzeigen" - }, - "osd_dji_cn_alternating_duration": { - "message": "\"Namen des Fluggerätes\" alternierende Dauer (in 1/10 sec)" - }, - "osd_switch_indicator_settings": { - "message": "Einstellungen der Schalteranzeige" - }, - "osd_switch_indicators_align_left": { - "message": "Schalternamen links von den Schaltern ausrichten" - }, - "osdSwitchInd0": { - "message": "Schalter 1" - }, - "osdSwitchInd1": { - "message": "Schalter 2" - }, - "osdSwitchInd2": { - "message": "Schalter 3" - }, - "osdSwitchInd3": { - "message": "Schalter 4" - }, - "osd_font_default": { - "message": "Standard" - }, - "osd_font_vision": { - "message": "Vision" - }, - "osd_font_impact": { - "message": "Impact" - }, - "osd_font_impact_mini": { - "message": "Impact mini" - }, - "osd_font_clarity": { - "message": "Clarity" - }, - "osd_font_clarity_medium": { - "message": "Clarity mittel" - }, - "osd_font_bold": { - "message": "Bold" - }, - "osd_font_large": { - "message": "Groß" - }, - "osd_font_load_file": { - "message": "Schriftartdatei öffnen" - }, - "osd_font_upload": { - "message": "Schriftart hochladen" - }, - "osd_font_manager": { - "message": "Font Manager" - }, - "uploadingCharacters": { - "message": "Hochladen..." - }, - "uploadedCharacters": { - "message": "Hochgeladene $1 Zeichen" - }, - "portsIdentifier": { - "message": "Identifizieren" - }, - "portsConfiguration": { - "message": "Daten" - }, - "portsTelemetryOut": { - "message": "Telemetrie" - }, - "portsSerialRx": { - "message": "RX" - }, - "portColumnSensors": { - "message": "Sensoren" - }, - "portsPeripherals": { - "message": "Peripheriegeräte" - }, - "appUpdateNotificationHeader": { - "message": "Neue Configurator-Version verfügbar." - }, - "appUpdateNotificationDescription": { - "message": "Bitte besuchen Sie die Website, um die Release Notes zu lesen und herunterzuladen." - }, - "closeUpdateBtn": { - "message": "Schließen Sie" - }, - "downloadUpdatesBtn": { - "message": "Neue App herunterladen" - }, - "tabMissionControl": { - "message": "Missionskontrolle" - }, - "loadMissionButton": { - "message": "Mission aus FC laden" - }, - "saveMissionButton": { - "message": "Mission im FC speichern" - }, - "loadEepromMissionButton": { - "message": "Eeprom-Mission laden" - }, - "saveEepromMissionButton": { - "message": "Eeprom-Mission speichern" - }, - "loadFileMissionButton": { - "message": "Datei laden" - }, - "saveFileMissionButton": { - "message": "Datei speichern" - }, - "missionSettingsSave": { - "message": "Speichern" - }, - "missionSettingsCancel": { - "message": "Abbrechen" - }, - "editPointHead": { - "message": "Punkt editieren" - }, - "editPointButtonSave": { - "message": "Speichern" - }, - "editPointButtonRemove": { - "message": "entfernen" - }, - "removeAllPointButtonSave": { - "message": "Alle Punkte entfernen" - }, - "missionTotalInformationHead": { - "message": "Informationen insgesamt" - }, - "missionTotalInfoFilenameLoaded": { - "message": "Dateiname geladen:" - }, - "missionTotalInfoDistance": { - "message": "Entfernung (m):" - }, - "missionTotalInfoAvailablePoints": { - "message": "Verfügbare Punkte" - }, - "missionTotalInfoMissionValid": { - "message": "Mission gültig" - }, - "missionDefaultPointAlt": { - "message": "Höhe (cm):" - }, - "missionDefaultPointSpeed": { - "message": "Geschwindigkeit (cm/s):" - }, - "missionDefaultSafeRangeSH": { - "message": "Radius (m):" - }, - "missionMultiMissionsInfo": { - "message": "Missions-Infos:" - }, - "missionMultiActiveMission": { - "message": "Aktive Mission:" - }, - "missionMultiMissionNo": { - "message": "Missionsnr." - }, - "missionMultiUpdateAll": { - "message": "Alle aktualisieren" - }, - "missionMultiAddNewMission": { - "message": "Neue Mission hinzufügen" - }, - "missionEllipsoidEarthDEMModel": { - "message": "Verwenden Sie Ellipsoid anstelle von SL DEM:" - }, - "SafehomeLegend": { - "message": "Legende:" - }, - "SafehomeMaxDistance": { - "message": "Maximale Entfernung (m):" - }, - "SafehomeSafeRadius": { - "message": "Sicherer Radius (m):" - }, - "missionTitleHide": { - "message": "Verstecken" - }, - "missionTitleCancel": { - "message": "Abbrechen" - }, - "missionTitleSave": { - "message": "Speichern" - }, - "missionTitlRemove": { - "message": "Entfernen" - }, - "missionTitleLoadMissionFile": { - "message": "Missionsdatei laden" - }, - "missionTitleSaveMissionFile": { - "message": "Missionsdatei speichern" - }, - "missionTitleLoadMissionFromFC": { - "message": "Mission aus FC laden" - }, - "missionTitleSaveMissionToFC": { - "message": "Mission im FC speichern" - }, - "missionTitleLoadEepromMission": { - "message": "Eeprom-Mission laden" - }, - "missionTitleSaveEepromMission": { - "message": "Eeprom-Mission speichern" - }, - "missionTitleRemoveAll": { - "message": "Alle entfernen" - }, - "missionTitleSetActive": { - "message": "Aktiv setzen" - }, - "missionTitleUpdateAll": { - "message": "Alle aktualisieren" - }, - "missionTitleAdd": { - "message": "hinzufügen" - }, - "missionTitleMoveToCenterView": { - "message": "zur mittleren Ansicht wechseln" - }, - "missionTitleSaveEepromSafehome": { - "message": "Eeprom speichern Safehome" - }, - "missionTitleLoadEepromSafehome": { - "message": "Eeprom laden Safehome" - }, - "missionTitlEditMission": { - "message": "Edit Mission" - }, - "missionRTHsettingsTitle": { - "message": "RTH-Einstellungen" - }, - "missionDefaultSettingsHead": { - "message": "Standardeinstellungen" - }, - "missionDefaultElevationHead": { - "message": "Erhebungsprofil" - }, - "missionHomeHead": { - "message": "Abflug nach Hause" - }, - "missionSafehomeHead": { - "message": "Safe Home Manager" - }, - "missionMultiMissionHead": { - "message": "Multi-Missionen" - }, - "missionTemplateHead": { - "message": "Missionsvorlage" - }, - "missionActionMenuHead": { - "message": "Aktionen" - }, - "useOnlyStandalone": { - "message": "Bitte besuchen Sie die Website, um die Release Notes zu lesen und herunterzuladen." - }, - "eeprom_load_ok": { - "message": "EEPROM geladen." - }, - "confirm_delete_all_points": { - "message": "Wollen Sie wirklich alle Punkte löschen?" - }, - "confirm_delete_point_with_options": { - "message": "Wollen Sie diesen Wegpunkt mit den Nicht-Geo-Optionen JUMP/SET_HEAD/RTH wirklich löschen?\nWenn ja, werden die angehängten Nicht-Geo-Optionen ebenfalls entfernt!" - }, - "confirm_multimission_file_load": { - "message": "Dies ist eine Multimissionsdatei. Beim Laden wird die aktuelle Multi-Mission überschrieben.\nWeiter?" - }, - "confirm_overwrite_multimission_file_load_option": { - "message": "Damit wird die aktuelle Multi-Mission überschrieben.\nWeiter?" - }, - "multimission_active_index_saved_eeprom": { - "message": "Aktiver Missionsindex gespeichert" - }, - "no_waypoints_to_load": { - "message": "Keine Wegpunkte zu laden!" - }, - "no_waypoints_to_save": { - "message": "Keine Wegpunkte zu speichern!" - }, - "mixerThrottleWarning": { - "message": "Warnung: Wert außerhalb des normalen Betriebsbereichs." - }, - "servoMixer": { - "message": "Servo-Mischer" - }, - "servoMixerDelete": { - "message": "Löschen" - }, - "servoMixerAdd": { - "message": "Neue Mischerregel hinzufügen" - }, - "platformType": { - "message": "Typ der Plattform" - }, - "platformConfiguration": { - "message": "Konfiguration der Plattform" - }, - "output_modeTitle": { - "message": "Ausgabe-Modus" - }, - "mixerPreset": { - "message": "Mixer-Voreinstellung" - }, - "mixerNotLoaded": { - "message": "Mixer nicht geladen.
Klicke auf Laden und anwenden oder Mixer laden, um den ausgewählten Mixer zu verwenden.
Oder klicke auf Mixer aktualisieren, um deinen aktuellen Mixer zu verwenden." - }, - "mixerLoadPresetRules": { - "message": "Mischer laden" - }, - "mixerRefreshCurrentRules": { - "message": "Mixer neu laden" - }, - "mixerLoadAndApplyPresetRules": { - "message": "Laden und anwenden" - }, - "mixerApplyModalTitle": { - "message": "Bestätigen" - }, - "mixerButtonSaveAndReboot": { - "message": "Speichern und neu starten" - }, - "mixerApplyDescription": { - "message": "Diese Aktion setzt alle aktuellen Mischereinstellungen außer Kraft und ersetzt sie durch Standardwerte. Es gibt keine \"Rückgängig\"-Option!" - }, - "mixerWizardModalTitle": { - "message": "Quadcopter-Mischer-Assistent" - }, - "mixerWizardModalApply": { - "message": "BewAnwendenerbung" - }, - "motorWizard0": { - "message": "Hinten-rechts" - }, - "motorWizard1": { - "message": "Vorne-rechts" - }, - "motorWizard2": { - "message": "Hinten links" - }, - "motorWizard3": { - "message": "Front-Left" - }, - "mixerWizardMotorPosition": { - "message": "Stellung des Motors" - }, - "mixerWizardMotorIndex": { - "message": "Motor Index" - }, - "settings": { - "message": "Einstellungen" - }, - "motorMixer": { - "message": "Motormischer" - }, - "servo": { - "message": "Servo" - }, - "input": { - "message": "Eingabe" - }, - "fixedValue": { - "message": "Fester Wert (µs)" - }, - "weight": { - "message": "Gewicht (%)" - }, - "speed": { - "message": "Geschwindigkeit (10µs/s)" - }, - "mixerPresetTitle": { - "message": "Mixer-Voreinstellung" - }, - "fcFirmwareUpdateRequired": { - "message": "Um diese Funktion nutzen zu können, muss die Firmware des Flugcontrollers auf die neueste Version aktualisiert werden." - }, - "mixerNotConfigured": { - "message": "Mixer nicht konfiguriert. Verwende die Tab Mixer, um ihn einzurichten!" - }, - "confirm_reset_settings": { - "message": "Wollen Sie wirklich alle Einstellungen zurücksetzen?\nACHTUNG: Alle Einstellungen gehen verloren! Sie müssen das gesamte Flugzeug nach diesem Vorgang neu einrichten!" - }, - "confirm_select_defaults": { - "message": "Dadurch können Sie neue Standardwerte für alle Einstellungen auswählen. Vorhandene PID-Tune- und andere Einstellungen können verloren gehen!\nMöchten Sie fortfahren?" - }, - "confirm_reset_pid": { - "message": "Dadurch werden alle PID-Einstellungen auf die Standardwerte der Firmware zurückgesetzt und gespeichert.\nMöchten Sie fortfahren?" - }, - "mappingTableOutput": { - "message": "Ausgang (Timer)" - }, - "mappingTableFunction": { - "message": "Funktion" - }, - "mappingTableTitle": { - "message": "Ausgangs Zuweisung" - }, - "NONE": { - "message": "Keine" - }, - "DEFAULT": { - "message": "Standard" - }, - "AIRCRAFT": { - "message": "Luftfahrzeug" - }, - "ALTITUDE": { - "message": "Höhenlage" - }, - "GROUND_SPEED": { - "message": "Bodengeschwindigkeit" - }, - "HOME_DISTANCE": { - "message": "Entfernung zu Home" - }, - "brakingSpeedThreshold": { - "message": "Min. Geschwindigkeitsschwelle" - }, - "brakingSpeedThresholdTip": { - "message": "Die Bremse wird nur aktiviert, wenn die tatsächliche Geschwindigkeit über dem Schwellenwert liegt." - }, - "brakingDisengageSpeed": { - "message": "Geschwindigkeit der Bremsauskupplung" - }, - "brakingDisengageSpeedTip": { - "message": "Die Bremsung wird beendet, wenn die Geschwindigkeit unter diesen Wert fällt." - }, - "brakingTimeout": { - "message": "Maximale Dauer der Bremsung" - }, - "brakingTimeoutTip": { - "message": "Sicherheitsmaßnahme. Dies ist die längste Zeitspanne, in der die Bremsung aktiv sein kann." - }, - "brakingBoostFactor": { - "message": "Verstärkungsfaktor" - }, - "brakingBoostFactorTip": { - "message": "Legt fest, wie stark die Bremsverstärkung sein soll. 100% bedeutet, dass der Navigationsmotor die Geschwindigkeit und die Beschleunigung beim Anfahren verdoppeln darf." - }, - "brakingBoostTimeout": { - "message": "Max. Dauer der Bremskraftverstärkung" - }, - "brakingBoostTimeoutTip": { - "message": "Sicherheitsmaßnahme. Dies ist die längste Zeitspanne, in der die Bremskraftverstärkung aktiv sein kann." - }, - "brakingBoostSpeedThreshold": { - "message": "Schwelle für Mindestgeschwindigkeit erhöhen" - }, - "brakingBoostSpeedThresholdTip": { - "message": "Die Bremskraftverstärkung wird nur aktiviert, wenn die tatsächliche Geschwindigkeit über dem Schwellenwert liegt." - }, - "brakingBoostDisengageSpeed": { - "message": "Bremskraftverstärker Auslösegeschwindigkeit" - }, - "brakingBoostDisengageSpeedTip": { - "message": "Die Bremsunterstützung endet, wenn die Geschwindigkeit unter diesen Wert fällt." - }, - "brakingBankAngle": { - "message": "Max. Neigungswinkel" - }, - "brakingBankAngleTip": { - "message": "Maximal zulässiger Neigungswinkel während der Bremsphase" - }, - "multirotorBrakingConfiguration": { - "message": "Konfiguration des Multirotor-Bremsmodus" - }, - "mapProvider": { - "message": "Kartenanbieter" - }, - "mapApiKey": { - "message": "Karten-API-Schlüssel" - }, - "proxyURL": { - "message": "MapProxy URL" - }, - "proxyLayer": { - "message": "MapProxy-Layer" - }, - "accNotchHz": { - "message": "Acc. Kerbfilters Freq." - }, - "accNotchHzHelp": { - "message": "Ermöglicht die Einstellung eines einzelnen Kerbfilters für die Anzeige des Beschleunigungsmessers. Sollte auf die gleiche Weise konfiguriert werden wie die Kreiselkerbe, wenn der Beschleunigungsmesser eine Geräuschspitze oberhalb von acc aufzeichnet. LPF-Filter" - }, - "accNotchCutoff": { - "message": "Acc. Kerbfilters cutoff freq." - }, - "accNotchCutoffHelp": { - "message": "Sollte unter der Frequenz des Notch-Filters gehalten werden." - }, - "gyroStage2LpfCutoffFrequency": { - "message": "Kreiselstufe 2 LPF-Grenzfrequenz" - }, - "gyroStage2LpfCutoffFrequencyHelp": { - "message": "Kreisel-Tiefpassfilter der zweiten Stufe, der dem Betaflight-Nicht-Kalman-Filter der Stufe 2 entspricht. Er muss oberhalb der ersten Stufe des Kreisel-LPF eingestellt werden. Für 5 und 6-Zoll-Miniquads bedeutet dies in der Regel über 150 Hz. Bei 7-Zoll-Quads über 125 Hz." - }, - "escProtocolNotAdvised": { - "message": "Dieses ESC-Protokoll wird nicht empfohlen, seine Verwendung erfolgt auf eigene Gefahr." - }, - "escProtocolExperimental": { - "message": "Experimentelles ESC-Protokoll, Verwendung auf eigene Gefahr" - }, - "looptimeNotAdvised": { - "message": "Die PID-Schleife ist möglicherweise nicht stabil, wenn GPS verwendet wird." - }, - "gyroLpfSuggestedMessage": { - "message": "Dies ist die empfohlene Einstellung für alle Multirotoren mit einer Propellergröße unter 8 Zoll. Prüfen Sie die Motortemperatur immer nach dem ersten Flug" - }, - "gyroLpfNotAdvisedMessage": { - "message": "Es wird vorgeschlagen, eine höhere Grenzfrequenz zu wählen" - }, - "gyroLpfNotFlyableMessage": { - "message": "Diese Einstellung wird die Drohne wahrscheinlich flugunfähig machen." - }, - "gyroLpfWhyNotHigherMessage": { - "message": "Wenn die Motoren nicht überhitzen, versuchen Sie, stattdessen 256 Hz einzustellen." - }, - "gyroLpfWhyNotSlightlyHigherMessage": { - "message": "Wenn es keine Vibrationsprobleme gibt und die Motoren nicht überhitzen, versuchen Sie stattdessen, 188 Hz einzustellen." - }, - "tabLogicConditions": { - "message": "Logische Bedingungen" - }, - "logicId": { - "message": "#" - }, - "logicEnabled": { - "message": "Aktiviert" - }, - "logicOperation": { - "message": "Operation" - }, - "logicOperandA": { - "message": "Operand A" - }, - "logicOperandB": { - "message": "Operand B" - }, - "logicFlags": { - "message": "Flags" - }, - "logicStatus": { - "message": "Status" - }, - "logicSave": { - "message": "Speichern" - }, - "logicClose": { - "message": "Schließen" - }, - "logicActivator": { - "message": "Aktiv" - }, - "save": { - "message": "Speichern" - }, - "active": { - "message": "Aktiv" - }, - "itermRelax": { - "message": "Iterm Relax" - }, - "itermRelaxHelp": { - "message": "Definiert die Aktivierung des Iterm-Entspannungsalgorithmus. PR bedeutet, dass er auf den Achsen Roll und Pitch aktiv ist. PRY ist auch auf der Gierachse aktiv." - }, - "gyro_main_lpf_type": { - "message": "Kreisel LPF-Typ" - }, - "gyro_main_lpf_type_help": { - "message": "BIQUAD bietet eine bessere Rauschunterdrückung zum Preis einer höheren Verzögerung. PT1 hat eine geringere Dämpfung, bietet aber eine geringere Verzögerung." - }, - "dterm_lpf_type": { - "message": "D-Term LPF-Typ" - }, - "dterm_lpf_type_help": { - "message": "BIQUAD bietet eine bessere Rauschunterdrückung zum Preis einer höheren Verzögerung. PT1 hat eine geringere Dämpfung, bietet aber eine geringere Verzögerung." - }, - "dterm_lpf2_type": { - "message": "D-Term Stufe 2 LPF-Typ" - }, - "dterm_lpf2_type_help": { - "message": "BIQUAD bietet eine bessere Rauschunterdrückung zum Preis einer höheren Verzögerung. PT1 hat eine geringere Dämpfung, bietet aber eine geringere Verzögerung." - }, - "dterm_lpf2_hz": { - "message": "D-Term Stufe 2 LPF Grenzfrequenz" - }, - "dterm_lpf2_hz_help": { - "message": "Tiefpass-Cutoff-Filter für D-Term auf den Achsen ROLL und PITCH. 0 bedeutet, dass der Filter deaktiviert ist" - }, - "tabFilteringAdvanced": { - "message": "Andere Filter" - }, - "gps_map_center": { - "message": "Zentrum" - }, - "ouptputsConfiguration": { - "message": "Konfiguration" - }, - "vtxDisclaimer": { - "message": "Verwenden Sie nur Bänder, Kanäle und Leistungsstufen, die an dem Ort, an dem Sie fliegen, legal sind! Beachten Sie immer das VTX-Benutzerhandbuch und die örtlichen Vorschriften!" - }, - "defaultsDialogTitle": { - "message": "Standardwerte" - }, - "defaultsDialogInfo": { - "message": "Der INAV Configurator möchte wissen, welche Art von UAV Sie konfigurieren. Basierend auf diesen Informationen wird er einige Standardwerte ändern, um die beste Flugleistung zu erzielen." - }, - "defaultsDialogInfo2": { - "message": "Vermeiden Sie die blinde Wiederherstellung aller PID- und Filterkonfigurationen aus der vorherigen Version von INAV. Das beste Ergebnis erhalten Sie, wenn Sie die Standardeinstellungen wiederherstellen!" - }, - "throttleIdle": { - "message": "Leistung der Motoren im Leerlauf [%]" - }, - "throttleIdleDigitalInfo": { - "message": "Bei digitalen Protokollen kann IDLE sogar auf 5-7 % gesenkt werden, ohne dass die Motoren in der Luft stehen bleiben. Wenn die Drohne nach dem Ziehen des Gashebels wackelt, versuchen Sie, IDLE zu erhöhen, um dieses Verhalten abzustellen." - }, - "throttleIdleAnalogInfo": { - "message": "Bei analogen Protokollen kann IDLE auf unter 10 % gesenkt werden, wenn die Motoren ruhig und ohne Stottern arbeiten. Wenn die Drohne nach dem Ziehen des Gashebels wackelt, versuchen Sie, IDLE zu erhöhen, um dieses Verhalten zu korrigieren." - }, - "motor_poles": { - "message": "Anzahl der Motorpole (Anzahl der Magnete)" - }, - "motorStopWarning": { - "message": "Sollte bei Flugzeugen, Rovern und Booten aktiviert sein. Sollte bei Multirotoren nicht aktiviert werden! Bei Multirotoren stoppen die Motoren nicht, wenn der Airmode aktiviert ist." - }, - "reversibleEscWarning": { - "message": "Wenn reversible Motoren verwendet werden, setzen Sie die Leerlaufleistung der Motoren auf 0 %." - }, - "dynamic_gyro_notch_enabled_help": { - "message": "Matrix Gyro Filter ist die neue Generation von dynamischen Kreiselkerbfiltern die in INAV verfügbar sind. Es wird empfohlen, ihn bei allen Multirotor-Builds mit F4- und F7-Flugcontrollern zu aktivieren." - }, - "globalFunctions": { - "message": "Globale Funktionen" - }, - "functionId": { - "message": "#" - }, - "functionEnabled": { - "message": "Aktiviert" - }, - "functionLogicId": { - "message": "Aktivierungslogik Bedingung" - }, - "functionAction": { - "message": "Aktion" - }, - "functionOperand": { - "message": "Operand" - }, - "functionFlags": { - "message": "Flags" - }, - "configurationI2cSpeed": { - "message": "I2C Geschwindigkeit" - }, - "configurationI2cSpeedHelp": { - "message": "Die I2C-Geschwindigkeit sollte auf der höchsten Stufe gehalten werden, die es allen angeschlossenen Geräten ermöglicht, zu funktionieren. Der Standardwert von 400kHz ist ein sicherer Wert und es wird empfohlen, im Falle von Multirotoren auf 800kHz zu wechseln." - }, - "i2cSpeedSuggested800khz": { - "message": "Bitte schalten Sie auf 800kHz um, wenn die angeschlossene Hardware dies zulässt" - }, - "i2cSpeedTooLow": { - "message": "Diese I2C-Geschwindigkeit ist zu niedrig!" - }, - "configurationVoltageMeterType": { - "message": "Voltmeter Type" - }, - "configurationCurrentMeterType": { - "message": "Stromzähler Typ" - }, - "MissionPlannerJumpSettingsCheck": { - "message": "JUMP-Einstellungen nicht korrekt: Überprüfen Sie sie erneut!\nWird zu WP 1 gezwungen!" - }, - "MissionPlannerJump2SettingsCheck": { - "message": "JUMP-Einstellungen falsch: Die Wiederholungen sollten 10 nicht überschreiten!\nÜberprüfen Sie es noch einmal! Die Anzahl der Wiederholungen ist gleich 0!" - }, - "MissionPlannerJump3SettingsCheck": { - "message": "JUMP-Einstellungen falsch: kein Sprung zu einem POI möglich!\nWird zu WP 1 gezwungen!" - }, - "MissionPlannerHeadSettingsCheck": { - "message": "Der Wert der Überschrift ist falsch: Überprüfen Sie ihn noch einmal! Wird standardmäßig auf -1 gezwungen!" - }, - "MissionPlannerRTHSettingsCheck": { - "message": "RTH-Option ist falsch: Sollte 0 oder 1 sein. Prüfen Sie es noch einmal!\nWird standardmäßig auf 0 gesetzt, d.h. kein LAND nach RTH!" - }, - "MissionPlannerJumpTargetRemoval": { - "message": "Sie können einen Wegpunkt, der als JUMP-Ziel definiert ist, nicht entfernen!\nSie müssen zuerst das Ziel auf dem Wegpunkt entfernen, der den JUMP auslöst." - }, - "MissionPlannerAltitudeChangeReset": { - "message": "Höhe unter Bodenniveau. Änderung ignoriert" - }, - "SafehomeSelected": { - "message": "" - }, - "SafehomeId": { - "message": "#" - }, - "SafehomeEnabled": { - "message": "Aktiviert" - }, - "SafehomeLon": { - "message": "Lon" - }, - "SafehomeLat": { - "message": "Lat" - }, - "SafehomeAlt": { - "message": "Hähe" - }, - "WaypointOptionSelected": { - "message": "+" - }, - "WaypointOptionId": { - "message": "#" - }, - "WaypointOptionAction": { - "message": "Typ" - }, - "WaypointOptionP1": { - "message": "P1" - }, - "WaypointOptionP2": { - "message": "P2" - }, - "pidId": { - "message": "#" - }, - "pidEnabled": { - "message": "Aktiviert" - }, - "pidSetpoint": { - "message": "Sollwert" - }, - "pidMeasurement": { - "message": "Messung" - }, - "pidP": { - "message": "P-Verstärkung" - }, - "pidI": { - "message": "I-Gewinn" - }, - "pidD": { - "message": "D-Verstärkung" - }, - "pidFF": { - "message": "FF-Verstärkung" - }, - "pidOutput": { - "message": "Ausgabe" - }, - "reset": { - "message": "Reset" - }, - "illegalStateRestartRequired": { - "message": "Unzulässiger Zustand. Neustart erforderlich." - }, - "motor_direction_inverted": { - "message": "Normale Motordrehrichtung / Props In Konfiguration" - }, - "motor_direction_isInverted": { - "message": "Umgekehrte Motorrichtung / Props Out Konfiguration" - }, - "motor_direction_inverted_hint": { - "message": "Aktivieren, wenn die Motordrehrichtung umgekehrt ist und die Propeller in entgegengesetzter Richtung montiert sind." - }, - "mixer_pid_profile_linking": { - "message": "Das PID-Profil verwendet den gleichen Index wie das Mischerprofil" - }, - "mixer_pid_profile_linking_hint": { - "message": "mixer_pid_profile_linking: Aktivieren Sie diese Option für beide Mischer-Profile, wenn Sie möchten, dass die Umschaltung des PID-Profils durch die Umschaltung des Mixer-Profils erfolgt (empfohlen bei der Einrichtung des Typs vtol/mixed plaform)." - }, - "blackboxFields": { - "message": "Blackbox-Felder" - }, - "BLACKBOX_FEATURE_NAV_ACC": { - "message": "Beschleunigungsmesser für die Navigation" - }, - "BLACKBOX_FEATURE_NAV_POS": { - "message": "Navigations-Positions-Schätzer" - }, - "BLACKBOX_FEATURE_NAV_PID": { - "message": "PID-Navigation" - }, - "BLACKBOX_FEATURE_MAG": { - "message": "Magnetometer" - }, - "BLACKBOX_FEATURE_ACC": { - "message": "Beschleunigungsmesser" - }, - "BLACKBOX_FEATURE_ATTITUDE": { - "message": "Einstellung" - }, - "BLACKBOX_FEATURE_RC_DATA": { - "message": "RC-Daten" - }, - "BLACKBOX_FEATURE_RC_COMMAND": { - "message": "RC-Befehl" - }, - "BLACKBOX_FEATURE_MOTORS": { - "message": "Leistung der Motoren" - }, - "BLACKBOX_FEATURE_GYRO_RAW": { - "message": "Kreisel RAW (ohne Filterung)" - }, - "BLACKBOX_FEATURE_GYRO_PEAKS_ROLL": { - "message": "Kreisel Rauschspitzen-Freq. Rollen" - }, - "BLACKBOX_FEATURE_GYRO_PEAKS_PITCH": { - "message": "Kreisel Rauschspitzen-Freq. Nicken" - }, - "BLACKBOX_FEATURE_GYRO_PEAKS_YAW": { - "message": "Kreisel Rauschspitzen-Freqz Gieren" - }, - "axisRoll": { - "message": "Roll" - }, - "axisPitch": { - "message": "Nick" - }, - "axisYaw": { - "message": "Gier" - }, - "showAdvancedPIDs": { - "message": "Erweiterte PID-Regler anzeigen" - }, - "rc_filter_lpf_hz": { - "message": "Manuelle LPF Hz" - }, - "rc_filter_smoothing_factor": { - "message": "Automatischer Glättungsfaktor" - }, - "rc_filter_auto": { - "message": "Automatische RC-Glättung verwenden" - }, - "rcSmoothing": { - "message": "RC-Glättung" - }, - "throttle_scale": { - "message": "Gasskala" - }, - "throttle_scale_help": { - "message": "Ermöglicht die Begrenzung der den Motoren zugeführten Wirkleistung. Gasskala 1 bedeutet, dass es keine Leistungsbegrenzung gibt. Drosselskala 0,5 bedeutet, dass die Drosselposition um die Hälfte reduziert wird, bevor sie an die Motoren weitergegeben wird." - }, - "pidTuning_MatrixFilterType": { - "message": "Matrix Filter Type" - }, - "pidTuning_MatrixFilterTypeHelp": { - "message": "Bestimmt den Typ des Matrixfilters. Der standardmäßige 2D-Filter wird für die meisten Benutzer empfohlen. Für Quads mit einer Größe von 7 Zoll und mehr kann ein 3D-Filter von Vorteil sein." - }, - "softSerialWarning": { - "message": "Es ist nicht ratsam, Softserial für flugkritische Geräte wie GPS oder Empfänger oder stark frequentierte Geräte wie MSP DisplayPort zu verwenden." - }, - "ledStripColorSetupTitle": { - "message": "Farbe einrichten" - }, - "ledStripH": { - "message": "H" - }, - "ledStripS": { - "message": "S" - }, - "ledStripV": { - "message": "V" - }, - "ledStripRemainingText": { - "message": "Verbleibend" - }, - "ledStripClearSelectedButton": { - "message": "Ausgewählte löschen" - }, - "ledStripClearAllButton": { - "message": "ALLES löschen" - }, - "ledStripFunctionSection": { - "message": "LED-Funktionen" - }, - "ledStripFunctionTitle": { - "message": "Funktion" - }, - "ledStripFunctionNoneOption": { - "message": "Keine" - }, - "ledStripFunctionColorOption": { - "message": "Farbe" - }, - "ledStripFunctionModesOption": { - "message": "Modi & Orientierung" - }, - "ledStripFunctionArmOption": { - "message": "Arm Zustand" - }, - "ledStripFunctionBatteryOption": { - "message": "Akku" - }, - "ledStripFunctionRSSIOption": { - "message": "RSSI" - }, - "ledStripFunctionGPSOption": { - "message": "GPS" - }, - "ledStripFunctionRingOption": { - "message": "Ring" - }, - "ledStripFunctionChannelOption": { - "message": "Kanal" - }, - "ledStripColorModifierTitle": { - "message": "Farbmodifikator" - }, - "ledStripThrottleText": { - "message": "Drosselklappe" - }, - "ledStripLarsonscannerText": { - "message": "Larson-Scanner" - }, - "ledStripBlinkTitle": { - "message": "Blinken" - }, - "ledStripBlinkAlwaysOverlay": { - "message": "Immer blinken" - }, - "ledStripBlinkLandingOverlay": { - "message": "Blinken bei der Landung" - }, - "ledStripStrobeText": { - "message": "Stroboskop" - }, - "ledStripEnableStrobeLightEffectText": { - "message": "Stroboskoplicht-Effekt aktivieren" - }, - "ledStripOverlayTitle": { - "message": "Überlagerung" - }, - "ledStripWarningsOverlay": { - "message": "Warnungen" - }, - "ledStripIndecatorOverlay": { - "message": "Indikator" - }, - "colorBlack": { - "message": "schwarz" - }, - "colorWhite": { - "message": "weiß" - }, - "colorRed": { - "message": "rot" - }, - "colorOrange": { - "message": "orange" - }, - "colorYellow": { - "message": "gelb" - }, - "colorLimeGreen": { - "message": "lindgrün" - }, - "colorGreen": { - "message": "grün" - }, - "colorMintGreen": { - "message": "mintgrün" - }, - "colorCyan": { - "message": "cyanfarben" - }, - "colorLightBlue": { - "message": "hellblau" - }, - "colorBlue": { - "message": "blau" - }, - "colorDarkViolet": { - "message": "Dunkelviolett" - }, - "colorMagenta": { - "message": "magenta" - }, - "colorDeepPink": { - "message": "kräftiges Pink" - }, - "ledStripSelectChannelFromColorList": { - "message": "Kanal aus der Farbliste auswählen" - }, - "ledStripModeColorsTitle": { - "message": "Farbmodus" - }, - "ledStripModeColorsModeOrientation": { - "message": "Orientierung" - }, - "ledStripModeColorsModeHeadfree": { - "message": "Headfree" - }, - "ledStripModeColorsModeHorizon": { - "message": "Horizon" - }, - "ledStripModeColorsModeAngle": { - "message": "Angle" - }, - "ledStripModeColorsModeMag": { - "message": "Mag" - }, - "ledStripModeColorsModeBaro": { - "message": "Baro" - }, - "ledStripDirN": { - "message": "N" - }, - "ledStripDirE": { - "message": "E" - }, - "ledStripDirS": { - "message": "S" - }, - "ledStripDirW": { - "message": "W" - }, - "ledStripDirU": { - "message": "U" - }, - "ledStripDirD": { - "message": "D" - }, - "ledStripModesOrientationTitle": { - "message": "LED-Ausrichtung und Farbe" - }, - "ledStripModesSpecialColorsTitle": { - "message": "Besondere Farben" - }, - "ledStripModeColorsModeDisarmed": { - "message": "Disarmed" - }, - "ledStripModeColorsModeArmed": { - "message": "Bewaffnet" - }, - "ledStripModeColorsModeAnimation": { - "message": "Animation" - }, - "ledStripModeColorsModeBlinkBg": { - "message": "Blinkender Hintergrund" - }, - "ledStripModeColorsModeGPSNoSats": { - "message": "GPS: keine Sats" - }, - "ledStripModeColorsModeGPSNoLock": { - "message": "GPS: keine Sperre" - }, - "ledStripModeColorsModeGPSLocked": { - "message": "GPS: gesperrt" - }, - "ledStripWiring": { - "message": "LED-Streifen Verdrahtung" - }, - "ledStripWiringMode": { - "message": "Verdrahtungsmodus" - }, - "ledStripWiringClearControl": { - "message": "Ausgewählte löschen" - }, - "ledStripWiringClearAllControl": { - "message": "ALLE Verdrahtungen löschen" - }, - "ledStripWiringMessage": { - "message": "LEDs ohne Verdrahtungsmodusnummer werden nicht gespeichert." - }, - "mainLogoText": { - "message": "CONFIGURATOR" - }, - "mainLogoTextFirmware": { - "message": "FC FIRMWARE" - }, - "mainPortOverrideLabel": { - "message": "Port:" - }, - "mainManual": { - "message": "Anleitung" - }, - "sensorDataFlashNotFound": { - "message": "Kein Dataflash
Chip gefunden" - }, - "sensorDataFlashFreeSpace": { - "message": "Dataflash: freier Speicherplatz" - }, - "mixerProfile1": { - "message": "Mischerprofil 1" - }, - "mixerProfile2": { - "message": "Mischerprofil 2" - }, - "sensorProfile1": { - "message": "PID-Profil 1" - }, - "sensorProfile2": { - "message": "PID-Profil 2" - }, - "sensorProfile3": { - "message": "PID-Profil 3" - }, - "sensorBatteryProfile1": { - "message": "Akkuprofil 1" - }, - "sensorBatteryProfile2": { - "message": "Akkuprofil 2" - }, - "sensorBatteryProfile3": { - "message": "Akkuprofil 3" - }, - "sensorStatusGyro": { - "message": "Gyroskop" - }, - "sensorStatusGyroShort": { - "message": "Kreisel" - }, - "sensorStatusAccel": { - "message": "Beschleunigungsmesser" - }, - "sensorStatusAccelShort": { - "message": "Beschl" - }, - "sensorStatusMag": { - "message": "Magnetometer" - }, - "sensorStatusMagShort": { - "message": "Mag" - }, - "sensorStatusBaro": { - "message": "Barometer" - }, - "sensorStatusBaroShort": { - "message": "Baro" - }, - "sensorStatusGPS": { - "message": "GPS" - }, - "sensorStatusGPSShort": { - "message": "GPS" - }, - "sensorOpticalFlow": { - "message": "Optischer Fluss" - }, - "sensorOpticalFlowShort": { - "message": "O.Fluss" - }, - "sensorStatusSonar": { - "message": "Sonar / Entfernungsmesser" - }, - "sensorStatusSonarShort": { - "message": "Sonar" - }, - "sensorAirspeed": { - "message": "Fluggeschwindigkeit" - }, - "sensorAirspeedShort": { - "message": "Geschwindigkeit" - }, - "sensorBatteryVoltage": { - "message": "Spannung des Akku" - }, - "mainShowLog": { - "message": "Log anzeigen" - }, - "mainHideLog": { - "message": "Log verstecken" - }, - "waitingForData": { - "message": "Warte auf Daten ..." - }, - "outputStatsTableAcc": { - "message": "Acc. noise RMS" - }, - "outputStatsTableCurrent": { - "message": "Stromstärke [A]" - }, - "outputStatsTableVoltage": { - "message": "Voltage [V]" - }, - "LogicConditions": { - "message": "Logische Bedingungen" - }, - "PIDControllers": { - "message": "PID-Regler" - }, - "sensorsGyroSelect": { - "message": "Gyroskop" - }, - "sensorsAccelSelect": { - "message": "Beschleunigungsmesser" - }, - "sensorsMagSelect": { - "message": "Magnetometer" - }, - "sensorsAltitudeSelect": { - "message": "Barometer" - }, - "sensorsSonarSelect": { - "message": "Sonar" - }, - "sensorsAirSpeedSelect": { - "message": "Fluggeschwindigkeit" - }, - "sensorsTemperaturesSelect": { - "message": "Temperaturen" - }, - "sensorsDebugSelect": { - "message": "Debuggen" - }, - "sensorsDebugTrace": { - "message": "Open Debug Trace" - }, - "sensorsGyroscope": { - "message": "Gyroskop - deg/s" - }, - "sensorsAccelerometer": { - "message": "Beschleunigungsmesser - g" - }, - "sensorsMagnetometer": { - "message": "Magnetometer - Los" - }, - "sensorsBarometer": { - "message": "Barometer - Meter" - }, - "sensorsSonar": { - "message": "Sonar - cm" - }, - "sensorsAirspeed": { - "message": "Fluggeschwindigkeit - cm/s" - }, - "sensorsTemperature0": { - "message": "Temperaturen 0 - °C" - }, - "sensorsTemperature1": { - "message": "Temperatur 1 - °C" - }, - "sensorsTemperature2": { - "message": "Temperaturen 2 - °C" - }, - "sensorsTemperature3": { - "message": "Temperaturen 3 - °C" - }, - "sensorsTemperature4": { - "message": "Temperaturen 4 - °C" - }, - "sensorsTemperature5": { - "message": "Temperaturen 5 - °C" - }, - "sensorsTemperature6": { - "message": "Temperaturen 6 - °C" - }, - "sensorsTemperature7": { - "message": "Temperaturen 7 - °C" - }, - "sensorsTemperatureValue": { - "message": "Wert:" - }, - "getRunningOS": { - "message": "Erkanntes OS: " - }, - "getConfiguratorVersion": { - "message": "Configurator: " - }, - "loadedReleaseInfo": { - "message": "Geladene Versionsinformationen von GitHub." - }, - "newVersionAvailable": { - "message": "Neue Version verfügbar!" - }, - "ReceiveTime": { - "message": "Empfangszeit:" - }, - "SendTime": { - "message": "Sendezeit:" - }, - "ErrorWritingFile": { - "message": "Fehler beim Schreiben der Datei" - }, - "FileSaved": { - "message": "Datei gespeichert" - }, - "selectedTarget": { - "message": "ausgewähltes Target =" - }, - "toggledRCs": { - "message": "umgeschaltete RCs" - }, - "noFirmwareSelectedToLoad": { - "message": "Keine Firmware zum Laden ausgewählt" - }, - "selectValidSerialPort": { - "message": "Bitte wählen Sie einen gültigen seriellen Port'" - }, - "writePermissionsForFile": { - "message": "Sie haben keine Schreibrechte für diese Datei" - }, - "automaticTargetSelect": { - "message": "Versuche Target automatisch zu wählen" - }, - "notAWAYPOINT": { - "message": "Die vorherige Auswahl war kein WAYPOINT!" - }, - "startGettingSafehomePoints": { - "message": "Start: Empfang von Safehome-Punkten" - }, - "endGettingSafehomePoints": { - "message": "Ende: Empfang von Safehome-Punkten" - }, - "startSendingSafehomePoints": { - "message": "Beginn der Sendung von Safehome-Punkten" - }, - "endSendingSafehomePoints": { - "message": "Ende der Sendung von Safehome-Punkten" - }, - "startGetPoint": { - "message": "Start: Lade Punkte" - }, - "startSendPoint": { - "message": "Start: Sende Punkte" - }, - "errorReadingFileXml2jsNotFound": { - "message": "Fehler beim Lesen der Datei (xml2js nicht gefunden)'" - }, - "errorReadingFile": { - "message": "Fehler beim Lesen der Datei" - }, - "errorParsingFile": { - "message": "Fehler beim Parsen der Datei." - }, - "loadedSuccessfully": { - "message": " wurde erfolgreich geladen!" - }, - "errorWritingFileXml2jsNotFound": { - "message": "Fehler beim Schreiben der Datei (xml2js nicht gefunden)" - }, - "savedSuccessfully": { - "message": " wurde erfolgreich gespeichert!" - }, - "endGetPoint": { - "message": "Ende: Lade Punkte" - }, - "endSendPoint": { - "message": "Ende: Sende Punkte" - }, - "osdSettingsSaved": { - "message": "OSD-Einstellungen gespeichert" - }, - "failedToOpenSerialPort": { - "message": "Fehler beim Öffnen der seriellen Schnittstelle" - }, - "failedToFlash": { - "message": "Fehler beim Flashen" - }, - "targetPrefetchsuccessful": { - "message": "Target erfolgreich erkannt:" - }, - "targetPrefetchFail": { - "message": "Target kann nicht erkannt werden:" - }, - "targetPrefetchFailDFU": { - "message": "Target kann nicht erkannt werden: Flugsteuerung in DFU" - }, - "targetPrefetchFailOld": { - "message": "Target kann nicht erkannt werden: INAV-Firmware zu alt" - }, - "targetPrefetchFailNonINAV": { - "message": "Target kann nicht erkannt werden: Nicht-INAV-Firmware" - }, - "targetPrefetchFailNoPort": { - "message": "Target kann nicht erkannt werden: Kein Port" - }, - "timerOutputs": { - "message": "Timer-Ausgänge" - }, - "ezTuneFilterHz": { - "message": "Filter Hz" - }, - "ezTuneAxisRatio": { - "message": "Achsenverhältnis" - }, - "ezTuneResponse": { - "message": "Antwort" - }, - "ezTuneDamping": { - "message": "Dämpfung" - }, - "ezTuneStability": { - "message": "Stabilität" - }, - "ezTuneAggressiveness": { - "message": "Aggressivität" - }, - "ezTuneRate": { - "message": "Rate" - }, - "ezTuneExpo": { - "message": "Expo" - }, - "ezTuneFilterHzTips": { - "message": "Hier wird die Basis-Cutoff-Frequenz für alle INAV-Kreisel- und D-Term-Filter eingestellt. Höhere Werte führen zu einer geringeren Filterverzögerung und einer besseren Stabilisierung, aber mehr Rauschen geht durch die Filter und die Motoren werden heiß, die Drohne könnte oszillieren und unbrauchbar werden. Ihr Ziel ist es, diesen Wert so hoch wie möglich zu setzen, bevor negative Auswirkungen auftreten. Zu den negativen Effekten gehören: heiße Motoren, hörbare Oszillationen, schnelles Schütteln der Drohne, die Drohne gewinnt von selbst an Höhe. Übliche Ausgangspunkte für 'Filter Hz' sind: 3-Zoll-Props: 90, 5-Zoll-Props: 110, 7-Zoll-Props: 90, 10-Zoll-Props: 75, 12-Zoll-Props: 60. Verwenden Sie Blackbox und Ihren gesunden Menschenverstand, um einen Wert zu finden, der für Ihre Drohne am besten geeignet ist." - }, - "ezTuneAxisRatioTips": { - "message": "Beschreibt die Verteilung des Gewichts/Trägheitsmoments Ihrer Drohne. Je länger der Rahmen ist (mehr Masse auf der Vorder- und Rückachse), desto mehr Achsenverhältnis ist erforderlich. Der perfekte X-Rahmen hat ein Verhältnis von 100. Die meisten modernen Rahmen sollten irgendwo zwischen 110 und 130 liegen. Der Standardwert 110 ist ein guter Ausgangspunkt." - }, - "ezTuneResponseTips": { - "message": "Diese Einstellung legt fest, wie schnell die Drohne auf Steuerknüppelbewegungen und Kreiselsignale reagiert. Höhere Werte führen zu einer schnelleren Reaktion, aber auch zu mehr Überschwingern und Oszillationen. Wenn sich die Drohne träge anfühlt oder langsam wackelt, erhöhen Sie die Reaktion. Wenn sie heiße Motoren hat, hörbar oszilliert, überschwingt oder sich zu nervös anfühlt, verringern Sie den Response-Wert. Die meisten modernen Quads mit kräftigen Motoren fliegen am besten mit Response unter 80. Sollte zusammen mit der Dämpfung eingestellt werden. Es ist ein P-Term-Äquivalent." - }, - "ezTuneDampingTips": { - "message": "Beschreibt die Stärke einer Kraft, die einer Änderung der Drehgeschwindigkeit entgegenwirkt. Sie dämpft die Roll- und Nickbeschleunigung und bewirkt einen ruhigeren und stabileren Flug. Ihre Aufgabe beim Tuning ist es, herauszufinden, um wie viel Sie sie erhöhen können, bevor negative Symptome auftreten: heiße Motoren, hörbare Oszillationen, Überschwingen. Die meisten modernen Quads sollten eine Dämpfung von bis zu 150-180 akzeptieren. Dies ist ein D-Term-Äquivalent." - }, - "ezTuneStabilityTips": { - "message": "Definiert die langfristige Stabilisierungsstärke. Die meisten modernen Quads sollten 'Stability' sogar bis zu 120-130 tolerieren. Muss in der Regel gar nicht eingestellt werden. Wenn die Drohne während des vertikalen Sinkflugs unter starkem Propwash leidet, kann eine Senkung von 'Stability' helfen. Es ist ein I-Term-Äquivalent" - }, - "ezTuneAggressivenessTips": { - "message": "Legt fest, wie schnell Ihre Drohne auf schnelle Knüppelbewegungen reagieren soll. Eine höhere Aggressivität führt zu schnelleren Manövern. Sie hat keinen Einfluss auf die Stabilisierung, sondern nur auf das Steuergefühl. Es handelt sich um ein FF-Zeit-Äquivalent." - }, - "ezTuneRateTips": { - "message": "Legt fest, wie schnell sich Ihre Drohne um die Roll-, Nick- und Gierachse drehen soll. Je höher die 'Rate', desto schneller die Rotation. Ein Wert von 0 entspricht 300dps, 100 entspricht 600dps, 200 entspricht 900dps." - }, - "ezTuneExpoTips": { - "message": "Bestimmt den Expo-Wert des RC-Eingangs. Niedrigere Werte führen zu einem empfindlicheren Knüppel in der Mitte. Höhere Werte führen zu einer weniger empfindlichen Mitte und einer schnelleren Reaktion am Ende des Knüppels. Ein Wert von 0 entspricht 0 expo, 100 entspricht 0,7 expo, 200 entspricht 1,0 expo." - }, - "ezTunePidPreview": { - "message": "PID-Vorschau" - }, - "ezTuneRatePreview": { - "message": "Vorschau Raten" - }, - "ezTuneRatePreviewAxis": { - "message": "Achse" - }, - "ezTuneRatePreviewRate": { - "message": "Rate" - }, - "ezTuneRatePreviewExpo": { - "message": "Expo" - }, - "ezTuneEnabledTips": { - "message": "Wenn aktiviert, setzt Ez Tune mehrere INAV-Einstellungen außer Kraft, um den Abstimmungsprozess zu vereinfachen. Anstatt jede PID- und Filtereinstellung unabhängig einzustellen, müssen Sie nur mit 7 Schiebereglern arbeiten. Ez Tune passt alle anderen Einstellungen automatisch an Ihre Bedürfnisse an. Ez Tune ist ein hervorragender Ausgangspunkt für neue Benutzer und eine gute Möglichkeit, eine neue Drohne schnell zu tunen. Es wird nicht empfohlen, Ez Tune bei fortgeschrittenen Builds zu verwenden, da es alle Ihre Einstellungen überschreibt und Sie nicht in der Lage sind, Ihre Drohne fein abzustimmen. Wenn Ez Tune aktiviert ist, werden die Einstellungen auf der Tab PID Tuning von EzTune überschrieben." - }, - "ezTuneDisclaimer": { - "message": "Haftungsausschluss: Ez Tune ist eine experimentelle Funktion. Es kann nicht garantiert werden, dass sie bei allen UAVs funktioniert. Es wird nicht garantiert, dass sie mit allen Rahmentypen funktioniert. Es kann nicht garantiert werden, dass sie mit allen Propellern funktioniert. Alle Berechnungen und Abstimmungsergebnisse können sich in zukünftigen Versionen von INAV ändern. Wir ermutigen dich trotzdem, es auszuprobieren und deine Erfahrungen im INAV Discord im #ez-tune Kanal zu teilen." - }, - "ezTuneNote": { - "message": "Wichtig Ez Tune ist aktiviert. Alle Einstellungen auf dieser Tab werden von Ez Tune gesetzt und gesteuert. Um die Tab PID Tuning zu verwenden, müssen Sie Ez Tune deaktivieren. Deaktivieren Sie dazu das Kontrollkästchen Aktiviert auf der Tab Ez Tune." - } -} \ No newline at end of file diff --git a/main.css b/main.css deleted file mode 100644 index da89c707..00000000 --- a/main.css +++ /dev/null @@ -1,2294 +0,0 @@ -* { - margin: 0; - padding: 0; - border: 0; - list-style: none; - outline: none; -} - -html, body { - height: 100%; -} - -body { - font-family: 'open_sansregular', 'Segoe UI', Tahoma, sans-serif; - font-size: 12px; - color: #303030; - background-color: #3d3f3e; - margin: 0; - padding: 0; - overflow: hidden; -} - -a { - text-decoration: none; - color: #000; - font-family: 'open_sanssemibold', Arial, serif; -} - -a:hover { - text-decoration: none; -} - -a.disabled { - pointer-events: none; - cursor: default; - color: #999; -} - -/* Help-Icon */ -.gui_box_titlebar .helpicon { - margin-right: 10px; - margin-top: 5px !important; -} - -.helpicon { - float: right; - margin-top: 7px; - display: block; - height: 14px; - width: 14px; - opacity: 0.2; - background: url("../images/icons/cf_icon_info_grey.svg") center; - background-size: contain; - transition: none; -} - -.helpicon:hover { - opacity: 0.9; - background-image: url("../images/icons/cf_icon_info_green.svg"); - transition: none; -} - -.inputRequiredWarning { - border: 3px solid #d40000 !important; -} - -.cf_doc_version_bt a { - padding: 1px 9px 1px 9px; - margin-top: -45px; - background-color: #37a8db; - border-radius: 3px; - border: 1px solid #3a9dbf; - color: #fff; - float: right; - font-family: 'open_sansbold', Arial, serif; - font-size: 10px; - line-height: 17px; - text-shadow: 0 1px rgba(0, 0, 0, 0.25); - text-transform: uppercase; - letter-spacing: 0.03em; - display: block; -} - -.cf_doc_version_bt a:hover { - background-color: #37a8db; - transition: all ease 0.2s; -} - -/* documentation button end */ -input[type="number"]::-webkit-inner-spin-button { - opacity: 1; - margin-left: 5px; -} - -.clear-both { - clear: both; -} - -.left { - float: left; -} - -.right { - float: right; -} - -#main-wrapper { - padding: 0; - height: calc(100% - 7px); -} - -.mt1em { - margin-top: 1em !important; -} - -.mb1em { - margin-bottom: 1em !important; -} - -.margin-top { - margin-top: 20px; -} - -.margin-bottom { - margin-bottom: 20px; -} - -.headerbar { - height: 110px; - width: 100%; - background-image: -webkit-linear-gradient(top, transparent, rgba(0, 0, 0, 0.15)); -} - -/*noinspection CssUnknownTarget*/ -#logo { - position: absolute; - float: left; - height: 80px; - z-index: 0; - width: 450px; - background: url("../images/light-wide-2.svg") no-repeat left center; - background-size: contain; - margin-left: 15px; - margin-top: 10px; -} - -.logo_text { - position: absolute; - height: 20px; - left: 0; - top: 65px; - color: #949494; - opacity: 0.5; -} - -.logo_text .version { - float: right; - margin-left: 1em; -} - -.logo_text_firmware { - position: absolute; - height: 20px; - left: 0; - top: 80px; - color: #949494; - opacity: 0.5; -} - -.logo_text_firmware .firmware_version { - float: right; - margin-left: 2.1em; -} - -#port-picker { - position: relative; - width: 100%; -} - -#portsinput { - float: right; - margin-top: 20px; - margin-right: 20px; - width: 450px; -} - -#portsinput .dropdown { - margin-bottom: 5px; -} - -#portsinput .portsinput__top-element { - display: inline-block; - width: 125px; -} - -#portsinput .portsinput__top-element .dropdown-select { - width: 122px; -} - -.portsinput__top-element--inline { - display: inline-block; -} - -.portsinput__top-element--inline .switchery { - position: relative; - top: 1px; - margin-left: 5px; -} - -.portsinput__top-element--inline span { - color: #ddd; -} - -.portsinput__top-element--port-override { - position: relative; - overflow: hidden; - height: 20px; - width: 180px !important; - margin-bottom: 7px; - border: 1px solid; - border-radius: 3px; - background: #3e403f; - border-color: #111 #0a0a0a black; - background-image: -webkit-linear-gradient(top, transparent, rgba(0, 0, 0, 0.4)); - background-image: -moz-linear-gradient(top, transparent, rgba(0, 0, 0, 0.4)); - background-image: -o-linear-gradient(top, transparent, rgba(0, 0, 0, 0.4)); - background-image: linear-gradient(to bottom, transparent, rgba(0, 0, 0, 0.4)); - -webkit-box-shadow: inset 0 1px rgba(255, 255, 255, 0.1), 0 1px 1px rgba(0, 0, 0, 0.2); - box-shadow: inset 0 1px rgba(255, 255, 255, 0.1), 0 1px 1px rgba(0, 0, 0, 0.2); - color: #a6a6a6; - text-shadow: 0 1px rgba(0, 0, 0, 0.25); - top: 2px; -} - -.portsinput__row { - text-align: right; -} - -#port-override { - background-color: rgba(0, 0, 0, 0.1); - color: #888888; - width: 120px; - margin-left: 2px; - margin-top: 0; - padding: 1px; - border-radius: 3px; - height: 15px; - font-size: 12px; -} - -#port-override-option label { - color: #ddd; - position: relative; - top: 1px; -} - -#port-override input { - width: 136px; -} - -#header_dataflash { - display: none; -} - -#sensor-status { - margin-top: 20px; - float: right; - margin-right: 20px; - line-height: 2px; - height: 67px; - border-radius: 5px; - border: 1px solid #272727; - box-shadow: 0 2px 0 rgba(92, 92, 92, 0.5); - background: #434343 -webkit-linear-gradient(top, transparent, rgba(0, 0, 0, 0.55)); -} - -#sensor-status li { - float: left; - height: 67px; - width: 33px; - line-height: 18px; - text-align: center; - border: 1px solid #373737; - border-right-color: #222222; - border-bottom-color: #1a1a1a; - background: #434343 -webkit-linear-gradient(top, transparent, rgba(0, 0, 0, 0.45)); - padding-left: 5px; - padding-right: 5px; - text-shadow: 0 1px rgba(0, 0, 0, 1.0); -} - -.gyroicon { - background: url("../images/icons/sensor_gyro_off.png") no-repeat top; - background-size: 43px; - height: 30px; - margin-top: 3px; - width: 100%; - padding-top: 40px; - color: #4f4f4f; - text-align: center; -} - -.gyroicon.active { - background-image: url("../images/icons/sensor_gyro_on.png"); - color: #818181; -} - -.accicon { - background: url("../images/icons/sensor_acc_off.png") no-repeat -5px 2px; - background-size: 40px; - height: 30px; - margin-top: 3px; - width: 100%; - padding-top: 40px; - color: #4f4f4f; - text-align: center; -} - -.accicon.active { - background-image: url("../images/icons/sensor_acc_on.png"); - color: #818181; -} - -.accicon.error { - background-image: url("../images/icons/sensor_acc_error.png"); - color: #d40000; -} - -.magicon { - background: url("../images/icons/sensor_mag_off.png") no-repeat -5px 2px; - background-size: 42px; - height: 30px; - margin-top: 3px; - width: 100%; - padding-top: 40px; - color: #4f4f4f; - text-align: center; -} - -.magicon.active { - background-image: url("../images/icons/sensor_mag_on.png"); - color: #818181; -} - -.magicon.error { - background-image: url("../images/icons/sensor_mag_error.png"); - color: #d40000; -} - -.gpsicon { - background: url("../images/icons/sensor_sat_off.png") no-repeat -5px 2px; - background-size: 42px; - height: 30px; - margin-top: 3px; - width: 100%; - padding-top: 40px; - color: #4f4f4f; - text-align: center; -} - -.gpsicon.active { - background-image: url("../images/icons/sensor_sat_on.png"); - color: #818181; -} - -.gpsicon.error { - background-image: url("../images/icons/sensor_sat_error.png"); - color: #d40000; -} - -.opflowicon { - background: url("../images/icons/sensor_flow_off.png") no-repeat -5px 0; - background-size: 42px; - height: 30px; - margin-top: 3px; - width: 100%; - padding-top: 40px; - color: #4f4f4f; - text-align: center; -} - -.opflowicon.active { - background-image: url("../images/icons/sensor_flow_on.png"); - color: #818181; -} - -.opflowicon.error { - background-image: url("../images/icons/sensor_flow_error.png"); - color: #d40000; -} - -.baroicon { - background: url("../images/icons/sensor_baro_off.png") no-repeat -5px 2px; - background-size: 40px; - height: 30px; - margin-top: 3px; - width: 100%; - padding-top: 40px; - color: #4f4f4f; - text-align: center; -} - -.baroicon.active { - background-image: url("../images/icons/sensor_baro_on.png"); - color: #818181; -} - -.baroicon.error { - background-image: url("../images/icons/sensor_baro_error.png"); - color: #d40000; -} - -.sonaricon { - background: url("../images/icons/sensor_sonar_off.png") no-repeat -4px 1px; - background-size: 41px; - height: 30px; - margin-top: 3px; - width: 100%; - padding-top: 40px; - color: #4f4f4f; - text-align: center; -} - -.sonaricon.active { - background-image: url("../images/icons/sensor_sonar_on.png"); - color: #818181; -} - -.sonaricon.error { - background-image: url("../images/icons/sensor_sonar_error.png"); - color: #d40000; -} - -.airspeedicon { - background: url("../images/icons/sensor_airspeed_off.png") no-repeat -4px 1px; - background-size: 41px; - height: 30px; - margin-top: 3px; - width: 100%; - padding-top: 40px; - color: #4f4f4f; - text-align: center; -} - -.airspeedicon.active { - background-image: url("../images/icons/sensor_airspeed_on.png"); - color: #818181; -} - -.airspeedicon.error { - background-image: url("../images/icons/sensor_airspeed_error.png"); - color: #d40000; -} - -#sensor-status li:last-child { - border-right: 0 solid #c0c0c0; - border-top-right-radius: 5px; - border-bottom-right-radius: 5px; -} - -#sensor-status li:first-child { - border-left: 0 solid #c0c0c0; - border-top-left-radius: 5px; - border-bottom-left-radius: 5px; -} - -#sensor-status .on { - background: #434343 -webkit-linear-gradient(top, transparent, rgba(0, 0, 0, 0.45)); -} - -#options { - float: right; - width: 20px; - height: 20px; - margin-top: 10px; - margin-right: 10px; - background: url('../images/CF_settings_white.svg') no-repeat -1px -1px; - opacity: 0.4; -} - -#options:hover { - opacity: 0.65; -} - -#options.active { - opacity: 0.65; -} - -#options.active:hover { - opacity: 0.75; -} - -#options-window { - display: none; - position: fixed; - right: 35px; - top: 25px; - padding: 5px; - line-height: 20px; - border: 1px solid silver; - background-color: white; - border-radius: 5px; - z-index: 10000; -} - -/* options modified GUI BOX */ -#options-window .gui_box { - float: none; -} - -.options_container__checkbox input { - float: left; - margin-top: 3px; - margin-right: 5px; -} - -.options_container label { - margin-right: 1em; -} - -/* Log setup*/ -#log { - margin-bottom: 0; - border: 0 solid silver; - background-color: #242424; - color: #ccc; - color: rgba(255, 255, 255, 0.60); - line-height: 21px; - height: 27px; /* was 65*/ - overflow-y: hidden; /* scroll*/ -} - -#scrollicon { - position: fixed; - right: 10px; - top: 113px; - height: 27px; - width: 27px; - background: url("../images/icons/scroll.svg") no-repeat; - background-size: 100%; - opacity: 0.0; - transition: all ease 0.3s; -} - -#scrollicon.active { - height: 110px; - margin-top: 10px; - margin-right: 20px; - width: 110px; - opacity: 0.15; - background-size: 80%; - box-shadow: inset 0 0 5px #000000; - transition: all ease 0.3s; -} - -#log.active { - overflow-y: auto; - box-shadow: inset 0 0 15px #000000; -} - -#log .wrapper { - padding: 5px 5px 4px 10px; - -webkit-user-select: text; - position: relative; - bottom: 0; -} - -/* Log switch */ -.logswitch { - position: absolute; - right: 20px; - margin-top: -1px; - float: right; - padding: 2px; - z-index: 10; -} - -.logswitch a { - color: #656565 !important; - transition: all 0.3s; -} - -.logswitch a:hover { - color: #959595 !important; - text-decoration: none !important; - transition: all 0.3s; -} - -.tab_container { - float: left; - height: calc(100% - 150px); - width: 200px; - border-right: 4px solid #37a8db; - background-color: #2e2e2e; - transition: all 0.2s; - overflow-x: hidden; - overflow-y: auto; -} - -.tab_container.logopen { - height: calc(100% - 235px); - transition: all 0.5s; -} - -#tabs { - font-size: 13px; -} - -.header-wrapper .mode-connected { - display: none; -} - -#tabs ul.mode-connected { - display: none; -} - -#tabs li { - border-bottom: 1px solid rgba(0, 0, 0, 0.30); -} - -#tabs li:first-child { - border-top: 0; -} - -#tabs li:last-child { - border-bottom: 0; -} - -#tabs li a { - font-family: 'open_sansregular', Arial, serif; - padding-left: 33px; - padding-top: 5px; - padding-bottom: 3px; - background-color: transparent; - color: #999999; - height: 23px; - display: block; - text-shadow: 0 1px rgba(0, 0, 0, 0.45); - transition: none; - border-top: solid 1px rgba(255, 255, 255, 0.05); - /* following is just for a graceful degradation */ - text-overflow: ellipsis; - white-space: nowrap; - overflow: hidden; -} - -#tabs li a:hover { - text-decoration: none; - background-color: rgba(128, 128, 128, 0.50); - color: #fff; - -} - -#tabs li.active { - color: #fff; - transition: none; -} - -#tabs li.active a { - background-color: #37a8db; - color: #fff; - transition: none; -} - -#tabs li.active a:hover { - cursor: default; - background-color: #37a8db; -} - -.tabicon { - background: no-repeat 13px 7px; - background-size: 15px; -} - -/* Tab-Icons */ -.ic_setup { - background-image: url("../images/icons/cf_icon_setup_grey.svg"); -} - -.ic_setup:hover { - background-image: url("../images/icons/cf_icon_setup_white.svg"); -} - -li.active .ic_setup { - background-image: url("../images/icons/cf_icon_setup_white.svg"); -} - -.ic_ports { - background-image: url("../images/icons/cf_icon_ports_grey.svg"); -} - -.ic_ports:hover { - background-image: url("../images/icons/cf_icon_ports_white.svg"); -} - -li.active .ic_ports { - background-image: url("../images/icons/cf_icon_ports_white.svg"); -} - -.ic_config { - background-image: url("../images/icons/cf_icon_config_grey.svg"); -} - -.ic_config:hover { - background-image: url("../images/icons/cf_icon_config_white.svg"); -} - -li.active .ic_config { - background-image: url("../images/icons/cf_icon_config_white.svg"); -} - -.ic_pid { - background-image: url("../images/icons/cf_icon_pid_grey.svg"); -} - -.ic_pid:hover { - background-image: url("../images/icons/cf_icon_pid_white.svg"); -} - -li.active .ic_pid { - background-image: url("../images/icons/cf_icon_pid_white.svg"); -} - -.ic_rx { - background-image: url("../images/icons/cf_icon_rx_grey.svg"); -} - -.ic_rx:hover { - background-image: url("../images/icons/cf_icon_rx_white.svg"); -} - -li.active .ic_rx { - background-image: url("../images/icons/cf_icon_rx_white.svg"); -} - -.ic_modes { - background-image: url("../images/icons/cf_icon_modes_grey.svg"); -} - -.ic_modes:hover { - background-image: url("../images/icons/cf_icon_modes_white.svg"); -} - -li.active .ic_modes { - background-image: url("../images/icons/cf_icon_modes_white.svg"); -} - -.ic_adjust { - background-image: url("../images/icons/cf_icon_adjust_grey.svg"); -} - -.ic_adjust:hover { - background-image: url("../images/icons/cf_icon_adjust_white.svg"); -} - -li.active .ic_adjust { - background-image: url("../images/icons/cf_icon_adjust_white.svg"); -} - -.ic_servo { - background-image: url("../images/icons/cf_icon_servo_grey.svg"); -} - -.ic_servo:hover { - background-image: url("../images/icons/cf_icon_servo_white.svg"); -} - -li.active .ic_servo { - background-image: url("../images/icons/cf_icon_servo_white.svg"); -} - -.ic_gps { - background-image: url("../images/icons/cf_icon_gps_grey.svg"); -} - -.ic_gps:hover { - background-image: url("../images/icons/cf_icon_gps_white.svg"); -} - -li.active .ic_gps { - background-image: url("../images/icons/cf_icon_gps_white.svg"); -} - -.ic_led { - background-image: url("../images/icons/cf_icon_led_grey.svg"); -} - -.ic_led:hover { - background-image: url("../images/icons/cf_icon_led_white.svg"); -} - -li.active .ic_led { - background-image: url("../images/icons/cf_icon_led_white.svg"); -} - -.ic_sensors { - background-image: url("../images/icons/cf_icon_sensors_grey.svg"); -} - -.ic_sensors:hover { - background-image: url("../images/icons/cf_icon_sensors_white.svg"); -} - -li.active .ic_sensors { - background-image: url("../images/icons/cf_icon_sensors_white.svg"); -} - -.ic_log { - background-image: url("../images/icons/cf_icon_log_grey.svg"); -} - -.ic_log:hover { - background-image: url("../images/icons/cf_icon_log_white.svg"); -} - -li.active .ic_log { - background-image: url("../images/icons/cf_icon_log_white.svg"); -} - -.ic_data { - background-image: url("../images/icons/cf_icon_data_grey.svg"); -} - -.ic_data:hover { - background-image: url("../images/icons/cf_icon_data_white.svg"); -} - -li.active .ic_data { - background-image: url("../images/icons/cf_icon_data_white.svg"); -} - -.ic_cli { - background-image: url("../images/icons/cf_icon_cli_grey.svg"); -} - -.ic_cli:hover { - background-image: url("../images/icons/cf_icon_cli_white.svg"); -} - -li.active .ic_cli { - background-image: url("../images/icons/cf_icon_cli_white.svg"); -} - -.ic_motor { - background-image: url("../images/icons/cf_icon_motor_grey.svg"); -} - -.ic_motor:hover { - background-image: url("../images/icons/cf_icon_motor_white.svg"); -} - -li.active .ic_motor { - background-image: url("../images/icons/cf_icon_motor_white.svg"); -} - -.ic_welcome { - background-image: url("../images/icons/cf_icon_welcome_grey.svg"); -} - -.ic_welcome:hover { - background-image: url("../images/icons/cf_icon_welcome_white.svg"); -} - -li.active .ic_welcome { - background-image: url("../images/icons/cf_icon_welcome_white.svg"); -} - -.ic_help { - background-image: url("../images/icons/cf_icon_help_grey.svg"); -} - -.ic_help:hover { - background-image: url("../images/icons/cf_icon_help_white.svg"); -} - -li.active .ic_help { - background-image: url("../images/icons/cf_icon_help_white.svg"); -} - -.ic_flasher { - background-image: url("../images/icons/cf_icon_flasher_grey.svg"); -} - -.ic_flasher:hover { - background-image: url("../images/icons/cf_icon_flasher_white.svg"); -} - -li.active .ic_flasher { - background-image: url("../images/icons/cf_icon_flasher_white.svg"); -} - -.ic_sitl { - background-image: url("../images/icons/cf_icon_sitl_grey.svg"); -} - -.ic_sitl:hover { - background-image: url("../images/icons/cf_icon_sitl_white.svg"); -} - -li.active .ic_sitl { - background-image: url("../images/icons/cf_icon_sitl_white.svg"); -} - -.ic_calibration { - background-image: url(../images/icons/cf_icon_cal_grey.svg); -} - -.ic_calibration:hover { - background-image: url(../images/icons/cf_icon_cal_white.svg); -} - -li.active .ic_calibration { - background-image: url(../images/icons/cf_icon_cal_white.svg); -} - -/* SPARE Tab-Icons */ -.ic_failsafe { - background-image: url("../images/icons/cf_icon_failsafe_grey.svg"); -} - -.ic_failsafe:hover { - background-image: url("../images/icons/cf_icon_failsafe_white.svg"); -} - -li.active .ic_failsafe { - background-image: url("../images/icons/cf_icon_failsafe_white.svg"); -} - -.ic_backup { - background-image: url("../images/icons/cf_icon_backup_grey.svg"); -} - -.ic_backup:hover { - background-image: url("../images/icons/cf_icon_backup_white.svg"); -} - -li.active .ic_backup { - background-image: url("../images/icons/cf_icon_backup_white.svg"); -} - -.ic_wizzard { - background-image: url("../images/icons/cf_icon_wizard_grey.svg"); -} - -.ic_wizzard:hover { - background-image: url("../images/icons/cf_icon_wizard_white.svg"); -} - -li.active .ic_wizzard { - background-image: url("../images/icons/cf_icon_wizard_white.svg"); -} - -.ic_advanced { - background-image: url("../images/icons/cf_icon_advanced_grey.svg"); -} - -.ic_advanced:hover { - background-image: url("../images/icons/cf_icon_advanced_white.svg"); -} - -li.active .ic_advanced { - background-image: url("../images/icons/cf_icon_advanced_white.svg"); -} - -.ic_mission { - background-image: url("../images/icons/cf_icon_mission_grey.svg"); -} - -.ic_mission:hover { - background-image: url("../images/icons/cf_icon_mission_white.svg"); -} - -li.active .ic_mission { - background-image: url("../images/icons/cf_icon_mission_white.svg"); -} - -.ic_mixer { - background-image: url("../images/icons/cf_icon_mixer_grey.svg"); -} - -.ic_mixer:hover { - background-image: url("../images/icons/cf_icon_mixer_white.svg"); -} - -li.active .ic_mixer { - background-image: url("../images/icons/cf_icon_mixer_white.svg"); -} - -.ic_mag { - background-image: url("../images/icons/cf_icon_mag_grey.svg"); -} - -.ic_mag:hover { - background-image: url("../images/icons/cf_icon_mag_white.svg"); -} - -li.active .ic_mag { - background-image: url("../images/icons/cf_icon_mag_white.svg"); -} - -#content { - margin-top: 0; - padding: 0; - height: calc(100% - 150px); - /* (port picker 105px, log CLOSED 25px, status bar: 20px + padding) - was: calc(100% - 171px)*/ - background-color: white; - overflow-x: hidden; - overflow-y: auto; - border: 0 solid #848484; - -webkit-transform: rotateX(0deg); /* DO NOT REMOVE! this fixes the UI freezing bug on MAC OS X */ - transition: all 0.3s; -} - -#content.logopen { - margin-top: 0; - padding: 0; - height: calc(100% - 234px); /* (port picker, log OPEN, status bar: 20px + padding) - was: calc(100% - 171px)*/ - background-color: white; - overflow-x: hidden; - overflow-y: auto; - border: 0 solid #848484; - -webkit-transform: rotateX(0deg); /* DO NOT REMOVE! this fixes the UI freezing bug on MAC OS X */ - transition: all 0.5s; - /* Cause the height to shrink to contain its floated contents while log is open */ -} - -#content.loading { - overflow-y: hidden; -} - -#content.loading > * { - opacity: 0; -} - -#status-bar { - position: fixed; - bottom: 0; - width: calc(100% - 20px); - height: 20px; - line-height: 20px; - padding: 0 10px 0 10px; - border-top: 1px solid #7d7d79; - background-color: #bfbeb5; -} - -#status-bar div { - float: left; - padding-right: 10px; - margin-right: 10px; - border-right: 1px solid #7d7d79; -} - -#status-bar .version { - float: right; - margin: 0; - padding: 0; - border: 0; -} - -#cache { - display: none; -} - -.data-loading { - z-index: 10000; - position: absolute; - top: 0; - width: 100%; - height: 100%; - background: url('../../images/loading-bars.svg') no-repeat center 45%; - background-color: #FFF; -} - -#content.loading .data-loading { - opacity: 1; -} - -.data-loading p { - position: relative; - top: calc(45% + 45px); - text-align: center; - font-weight: bold; -} - -dialog { - background-color: white; - padding: 1em; - height: auto; - margin: auto auto; - position: absolute; - width: 50%; - border-radius: 3px; - border: 1px solid silver; -} - -/* Border of the Tab */ - -/* Tab Title */ -.tab_title { - border-bottom: 1px solid #37a8db; - font-size: 20px; - line-height: 24px; - height: 30px; - font-family: 'open_sanslight', Arial, serif; - margin-bottom: 15px; -} - -.tab_subtitle { - border-bottom: 1px solid #37a8db; - font-size: 1.5em; - line-height: 1.5em; - height: 25px; - font-family: 'open_sanslight', Arial, serif; - margin-bottom: 8px; -} - -.tab_subtitle--no-border { - border: none; -} - -/* Note */ -.note { - background-color: #fff7cd; - border: 1px solid #ffe55f; - margin-bottom: 7px; - margin-top: 3px; - border-radius: 3px; - font-size: 11px; - font-family: 'open_sansregular', Arial, serif; -} - -.note--big { - font-size: 1.15em; - padding: 0.6em; -} - -.note_spacer { - padding: 5px 7px 5px 7px; -} - -.tab_wrapper { - padding: 20px 15px 15px 15px; - -} - -.content_wrapper { - padding: 20px; - position: relative; -} - -.content_toolbar { - /* content toolbar panel */ - width: 100%; - height: 30px; - background-color: #EFEFEF; - box-shadow: rgba(0, 0, 0, 0.10) 0 -3px 8px; - padding: 10px 0; - overflow: hidden; - border-top: 1px solid #F9F9F9; -} - -.content_toolbar .btn a { - /* common styles for content toolbar buttons */ - margin-top: 0; - margin-bottom: 0; - margin-right: 20px; - background-color: #37a8db; - border-radius: 3px; - border: 1px solid #3394b5; - color: #fff; - float: right; - font-family: 'open_sansbold', Arial, serif; - font-size: 12px; - text-shadow: 0 1px rgba(0, 0, 0, 0.25); - display: block; - cursor: pointer; - transition: all ease 0.2s; - padding: 0 9px; - line-height: 28px; -} - -.content_toolbar .btn a:hover { - background-color: #3394b5; - transition: all ease 0.2s; -} - -.content_toolbar .btn a:active { - background-color: #37a8db; - transition: all ease 0.0s; - box-shadow: inset 0 1px 5px rgba(0, 0, 0, 0.35); -} - -.content_toolbar .btn a.disabled { - cursor: default; - color: #fff; - background-color: #AFAFAF; - border: 1px solid #AFAFAF; - pointer-events: none; - text-shadow: none; - opacity: 0.5; -} - -.content_toolbar .btn-danger a { - background-color: #db250e; - border: 1px solid #b5480e; -} - -.content_toolbar .btn-danger a:hover { - background-color: #b5480e; - transition: all ease 0.2s; -} - - -.toolbar_scroll_bottom .content_wrapper { - /* content wrapper in view with toolbar in scroll bottom - leave 50px space for the toolbar - */ - height: 100%; - margin: 0 0 -50px; -} - -.toolbar_fixed_bottom .content_wrapper { - /* content wrapper in view with toolbar fixed over bottom edge - leave 50px space for the toolbar - */ - height: calc(100% - 90px); - overflow-y: auto; -} - -.toolbar_fixed_bottom .content_toolbar { - position: absolute; - bottom: 0; - z-index: 2000; /* for fancy toggle buttons */ -} - -/* Colums START> */ -.cf_column { - min-height: 20px; - margin-bottom: 0; -} - -.full { - float: left; - width: 100%; -} - -.half { - float: left; - width: 50%; -} - -.third_left { - float: left; - width: 33%; -} - -.third_center { - display: inline-block; - width: 34%; -} - -.third_right { - float: right; - width: 33%; -} - -.fourth { - float: left; - width: 25%; -} - -.threefourth_right { - float: right; - width: 75%; -} - -.threefourth_left { - float: left; - width: 75%; -} - -.twothird { - float: left; - width: 67%; -} - -/* Columns END> */ - -/* Spacers */ -.spacer { - padding-left: 7px; - padding-right: 7px; - width: calc(100% - 14px); - float: left; -} - -.spacer_left { - padding-left: 15px; - float: left; - width: calc(100% - 15px); -} - -.spacer_right { - padding-right: 15px; - width: calc(100% - 15px); - float: left; -} - -/* Standard GUI BOX */ -.gui_box { - border: 1px solid #ccc; - border-radius: 4px; - background-color: #FFFFFF; - float: left; - width: calc(100% - 2px); - margin-bottom: 10px; - font-family: 'open_sansregular', Arial, serif; -} - -.gui_warning { - background: #ffdddd; -} - -.gui_note { - background: #ffffff; -} - -.gui_warning .gui_box_titlebar { - background: #dc0000 linear-gradient(-45deg, rgba(255, 255, 255, .3) 10%, transparent 10%, transparent 20%, - rgba(255, 255, 255, .3) 20%, rgba(255, 255, 255, .3) 30%, transparent 30%, transparent 40%, - rgba(255, 255, 255, .3) 40%, rgba(255, 255, 255, .3) 50%, transparent 50%, transparent 60%, - rgba(255, 255, 255, .3) 60%, rgba(255, 255, 255, .3) 70%, transparent 70%, transparent 80%, - rgba(255, 255, 255, .3) 80%, rgba(255, 255, 255, .3) 90%, transparent 90%, transparent 100%, - rgba(255, 255, 255, .4) 100%, transparent); -} - -/*noinspection CssNegativeValue*/ -.gui_note .gui_box_titlebar { - background-image: linear-gradient(-45deg, rgba(255, 255, 255, .3) 10%, transparent 10%, transparent 20%, - rgba(255, 255, 255, .3) 20%, rgba(255, 255, 255, .3) 30%, transparent 30%, transparent 40%, - rgba(255, 255, 255, .3) 40%, rgba(255, 255, 255, .3) 50%, transparent 50%, transparent 60%, - rgba(255, 255, 255, .3) 60%, rgba(255, 255, 255, .3) 70%, transparent 70%, transparent 80%, - rgba(255, 255, 255, .3) 80%, rgba(255, 255, 255, .3) 90%, transparent 90%, transparent 100%, - rgba(255, 255, 255, .4) 100%, transparent); -} - -.grey { - /* background-color:#f5f5f5; */ - background-color: #f9f9f9 -} - -.gui_box_titlebar { - background-color: #e4e4e4; - border-radius: 3px 3px 0 0; - font-size: 13px; - width: 100%; - height: 27px; - padding-bottom: 0; - margin-bottom: 7px; - font-family: 'open_sanssemibold', Arial, serif; -} - -.spacer_box { - padding: 10px; - margin-bottom: 3px; -} - -.spacer_box_title { - padding-left: 10px; - padding-right: 10px; - padding-top: 4px; - margin-bottom: 0; - float: left; -} - -/* Fixed area at the Bottom */ -.fixed_band { - position: relative; - height: 50px; - background-color: #e4e4e4; - width: calc(100% + 40px); - margin-left: -20px; - box-shadow: rgba(0, 0, 0, 0.00) 0 -3px 8px; - bottom: 0; - margin-bottom: 0; -} - -.fixed_band .save_btn a { - margin-top: 9px; - margin-bottom: 0; - margin-right: 20px; - background-color: #59aa29; - border-radius: 3px; - border: 1px solid #4c8829; - color: #fff; - float: right; - font-family: 'open_sansbold', Arial, serif; - font-size: 12px; - text-shadow: 0 1px rgba(0, 0, 0, 0.25); - display: block; - cursor: pointer; - transition: all ease 0.2s; - padding: 0 9px; - line-height: 28px; -} - -.fixed_band .save_btn a:hover { - background-color: #37a8db; - transition: all ease 0.2s; -} - -/* DIfferent buttons */ -.default_btn { - width: 100%; - position: relative; - margin-bottom: 10px; - margin-top: 0; - float: left; -} - -.default_btn.narrow { - width: auto; - margin-bottom: 0; -} - -.default_btn.narrow a { - padding: 5px; -} - -.default_btn a { - padding: 5px 0 5px 0; - text-align: center; - background-color: #fff; - border-radius: 4px; - border: 1px solid #37a8db; - color: #37a8db; - font-family: 'open_sanssemibold', Arial, serif; - font-size: 12px; - line-height: 13px; - display: block; - transition: all ease 0.2s; - text-decoration: none; -} - -.default_btn a.disabled { - background-color: #fff; - border: 1px solid #ccc; - color: #ccc; -} - -.default_btn a:hover { - background-color: #37a8db; - color: #fff !important; - text-shadow: 0 1px rgba(0, 0, 0, 0.25); - transition: all ease 0.2s; - text-decoration: none; - -} - -.default_btn a:active { - background-color: #37a8db; - transition: all ease 0.0s; - box-shadow: inset 0 1px 5px rgba(0, 0, 0, 0.35); -} - -.small { - width: auto; - position: relative; - margin-bottom: 7px; - margin-top: 0; - margin-right: 5px; - float: left; -} - -.small a { - padding: 3px 4px 4px 4px; - text-align: center; - text-shadow: 0 1px rgba(0, 0, 0, 0.25); - background-color: #acacac; - border-radius: 3px; - border: 1px solid #949494; - color: #fff; - font-family: 'open_sanssemibold', Arial, serif; - font-size: 11px; - line-height: 11px; - display: block; - transition: all ease 0.2s; -} - -.small a:hover { - background-color: #45bce5; - color: #fff; - text-shadow: 0 1px rgba(0, 0, 0, 0.25); - border: 1px solid #3a9dbf; - transition: all ease 0.2s; -} - -.small a:active { - background-color: #878787; - transition: all ease 0.0s; - box-shadow: inset 0 1px 5px rgba(0, 0, 0, 0.35); -} - -.green a { - background-color: #37a8db; - text-shadow: 0 1px rgba(0, 0, 0, 0.25); - color: #fff; - border: 1px solid #3a9dbf; - transition: all ease 0.2s; -} - -.green a:hover { - background-color: #45bce5; - border: 1px solid #3a9dbf; - text-shadow: 0 1px rgba(0, 0, 0, 0.25); - color: #fff; - transition: all ease 0.2s; -} - -.btn.red a, -.btn.red a:active { - background-color: #fafafa; - text-shadow: 0 1px rgba(0, 0, 0, 0.25); - color: #ff1e1e; - border: 1px solid #a00000; - transition: all ease 0.2s; -} - -.btn.red a:hover { - background-color: #f86975; - border: 1px solid #a00000; - text-shadow: 0 1px rgba(0, 0, 0, 0.25); - color: #fff; - transition: all ease 0.2s; -} - -/* Table styling */ -.cf_table { - margin-bottom: 5px; - float: left; - margin-top: -5px; - font-size: 11px; - width: 100%; -} - -.cf_table td { - padding-top: 2px; - padding-bottom: 5px; - border: 0 dotted; - border-bottom: 1px #ccc dotted; -} - -.noboarder td { - border: none; -} - -.cf_table tr:last-child td { - border-bottom: 0px #ccc dotted; -} - -.cf_table td:last-child { - text-align: right; -} - -.gps_false { - background-color: #FF0004; - padding: 1px 7px 2px 7px; - border-radius: 3px; - color: #FFFFFF; - font-size: 11px; - margin-left: 3px; -} - -.gps_true { - background-color: #59aa29; - padding: 1px 7px 2px 7px; - border-radius: 3px; - color: #FFFFFF; - font-size: 11px; - margin-left: 3px; -} - -/* connect button */ -.connect_controls { - position: relative; - float: right; - left: 0; - top: 19px; - height: 70px; - width: 60px; - margin-right: 20px; - margin-left: 20px; -} - -.connect_b { - float: left; -} - -.connect_b a { - height: 50px; - width: 50px; - border-radius: 100px; - box-shadow: 0 1px 2px rgba(0, 0, 0, 0.35); - float: left; - margin-left: 5px; - margin-bottom: 7px; - transition: none; -} - -.connect_b a.connect { - border: 1px solid #339cc1; - background-size: 44px; - background: #37a8db url('../images/icons/cf_icon_usb2_white.svg') no-repeat center 6px; - transition: none; -} - -.connect_b a.connect:hover { - background-color: #40b8e2; -} - -.connect_b a.connect.active { - border: 1px solid #fe0000; - background: #e60000 url('../images/icons/cf_icon_usb1_white.svg'); - transition: none; -} - -.connect_b a.connect.active:hover { - background-color: #f21212; -} - -.connect_state { - float: left; - height: 20px; - width: 100%; - text-align: center; - color: #fff; - font-size: 12px; - font-family: 'open_sansregular', Arial, serif; - text-shadow: 0 1px rgba(0, 0, 0, 0.25); - margin-top: -1px; -} - -/* fixing padding for all Tabs*/ -.tab-setup, .tab-landing, .tab-adjustments, .tab-auxiliary, .tab-cli, .tab-configuration, .tab-failsafe, .tab-onboard_logging, -.tab-firmware_flasher, .tab-gps, .tab-magnetometer, .tab-help, .tab-led-strip, .tab-logging, .tab-modes, .tab-motors, .tab-pid_tuning, -.tab-ports, .tab-receiver, .tab-sensors, .tab-servos, .tab-osd, .tab-calibration, .tab-ez_tune { - height: 100%; - position: relative; -} - -/* fixing logging tab*/ -.properties { - width: 800px; -} - -.properties dl { - width: 200px; -} - -.properties dd { - width: 400px; - height: auto; -} - -/* GPS Fix styling*/ -.fix3d { - background-color: #56ac1d; - padding: 2px 5px; - border-radius: 3px; - color: #fff; - font-size: 10px; -} - -.fix2d { - background-color: #bcbf10; - padding: 2px 5px; - border-radius: 3px; - color: #fff; - font-size: 10px; -} - -/* Dataflash element styling*/ - -#dataflash_wrapper_global { - color: white; - font-size: 10px; - margin-top: 20px; - width: 410px; - float: right; - margin-right: 10px; - line-height: 12px; - height: 33px; - border-radius: 5px; - border: 1px solid #272727; - box-shadow: 0 1px 0 rgba(92, 92, 92, 0.5); - background: #434343 -webkit-linear-gradient(top, transparent, rgba(0, 0, 0, 0.55)); - padding-top: 5px; - display: none; - text-shadow: 0 1px rgba(0, 0, 0, 1.0); - -} - -#mixer_profile_change { - color: white; - margin-top: 16px; - width: 130px; - float: left; - margin-right: 10px; - line-height: 12px; -} - -#profile_change { - color: white; - margin-top: 16px; - width: 130px; - float: left; - margin-right: 0; - line-height: 12px; -} - -#battery_profile_change { - color: white; - margin-top: 16px; - width: 130px; - float: right; - margin-right: 0; - line-height: 12px; -} - -.dataflash-contents_global { - margin-top: 18px; - border: 1px solid #4A4A4A; - background-color: #4A4A4A; - display: flex; - flex-direction: row; - flex-wrap: nowrap; - justify-content: flex-start; - border-radius: 3px; - margin-left: 5px; - margin-right: 5px; -} - -.dataflash-free_global { - background-color: #37a8db; - border-radius: 4px; -} - -.dataflash-contents_global .notsupported_global { - display: none; -} - -.dataflash-contents_global li { - height: 5px; - position: relative; - box-shadow: inset 0 0 5px rgba(0, 0, 0, 0.20); - border-radius: 2px; - -} - -.dataflash-contents_global li div { - position: absolute; - top: -18px; - margin-top: 0; - left: 0; - right: 0; - width: 120px; - text-align: left; - color: silver; -} - -.dataflash-contents_global progress::-webkit-progress-bar { - height: 8px; - background-color: #eee; -} - -.dataflash-contents progress::-webkit-progress-value { - background-color: #bcf; -} - -.noflash_global { - display: none; - color: #868686; - text-align: center; - text-shadow: 0 1px rgba(0, 0, 0, 1.0); - margin-top: 2px; -} - -.cf_tooltiptext { - display: none; -} - -/* Battery element styling*/ - -#quad-status_wrapper { - display: none; - color: white; - font-size: 10px; - margin-top: 20px; - width: 100px; - float: right; - margin-right: 20px; - line-height: 12px; - height: 67px; - border-radius: 5px; - border: 1px solid #272727; - box-shadow: 0 1px 0 rgba(92, 92, 92, 0.5); - background: #434343 -webkit-linear-gradient(top, transparent, rgba(0, 0, 0, 0.55)); - text-shadow: 0 1px rgba(0, 0, 0, 1.0); -} - -.quad-status-contents { - display: none; - margin-top: 10px; - margin-left: 14px; - height: 10px; - width: 30px; -} - -.battery-legend { - display: inline; - position: relative; - top: -2px; - margin-top: 0; - left: 0; - right: 0; - width: 40px; - text-align: left; - color: silver; - margin-left: -8px; -} - -.quad-status-contents progress::-webkit-progress-bar { - height: 12px; - background-color: #eee; -} - -.quad-status-contents progress::-webkit-progress-value { - background-color: #bcf; -} - -.battery-status { - height: 11px; - position: relative; - box-shadow: inset 0 0 5px rgba(0, 0, 0, 0.20); - border-radius: 0; - background-color: #59AA29; - margin-top: 0; -} - -.battery-icon { - display: inline-block; - height: 30px; - width: 60px; - transition: none; - margin-top: 4px; - background: url("../images/icons/cf_icon_bat_grey.svg") no-repeat center; - background-size: contain; -} - -.armedicon, -.failsafeicon, -.linkicon { - float: left; - margin-left: 8px; - margin-right: 2px; - margin-top: 6px; - display: block; - height: 18px; - width: 18px; - opacity: 0.8; - background-size: contain; - background-position: center; - transition: none; -} - -.armedicon { - background-image: url("../images/icons/cf_icon_armed_grey.svg"); -} - -.failsafeicon { - background-image: url("../images/icons/cf_icon_failsafe_grey.svg"); -} - -.linkicon { - background-image: url("../images/icons/cf_icon_link_grey.svg"); -} - -.bottomStatusIcons { - background-color: #272727; - height: 31px; - margin-left: 5px; - margin-top: 2px; - border-bottom-left-radius: 5px; - border-bottom-right-radius: 5px; -} - -@media only screen and (max-width: 1055px) , only screen and (max-device-width: 1055px) { - - .content_wrapper { - padding: 15px; - } - - .tab_title { - font-size: 16px; - line-height: 18px; - font-family: 'open_sanslight', Arial, serif; - margin-bottom: 10px; - height: 22px; - } - - .cf_doc_version_bt a { - padding: 1px 5px 1px 5px; - margin-top: -35px; - font-size: 9px; - line-height: 15px; - } - - #content { - height: calc(100% - 151px); - } - - .cf_table td { - padding-top: 2px; - padding-bottom: 2px; - } - - .default_btn { - margin-bottom: 10px; - } - - #tabs li a { - font-family: 'open_sansregular', Arial, serif; - font-size: 12px; - padding-left: 60px; - padding-top: 6px; - padding-bottom: 2px; - content: ""; - text-shadow: none; - transition: none; - /* following is just for a graceful degradation */ - text-overflow: clip; - white-space: nowrap; - overflow: hidden; - } - - .tab_container { - width: 60px; - } - - .gui_box_titlebar { - font-size: 12px; - height: 24px; - padding-bottom: 0; - margin-bottom: 5px; - float: left; - } - - .spacer_box_title { - padding-left: 10px; - padding-right: 10px; - padding-top: 3px; - margin-bottom: 0; - float: left; - } - - input { - font-size: 11px !important; - } - - .helpicon { - float: right; - margin-top: 5px; - height: 14px; - width: 14px; - transition: none; - } - - .gps_false { - padding: 0 3px 0 3px; - font-size: 10px; - } - - .gps_true { - padding: 0 3px 0 3px; - font-size: 10px; - } - - .content_toolbar .btn a { - margin-right: 15px; - } - - .toolbar_fixed_bottom .content_wrapper { - /* content wrapper in view with toolbar fixed over bottom edge - leave 50px space for the toolbar - */ - height: calc(100% - 81px); - overflow-y: auto; - } - -} - -@media only screen and (max-height: 700px) , only screen and (max-device-height: 700px) { - - .tab_container { - overflow-x: hidden; - overflow-y: auto; - } - -} - -select { - border: 1px solid silver; - border-radius: 3px; - padding: 1px; -} - -.lc_disabled { - color: #aaa; -} - -.ic_osd { - background-image: url("../images/icons/icon_osd.svg"); - background-position-y: 4px; -} - -.ic_osd:hover, li.active .ic_osd { - background-image: url("../images/icons/icon_osd_white.svg"); -} - -.full-width { - width: 100% !important; -} - -.is-hidden { - display: none; -} - -.modal__content { - -} - -.modal__buttons { - position: absolute; - bottom: 0; - right: 0; - margin: 1em; -} - -.modal__buttons--upbottom { - bottom: 22px; -} - -.modal__button { - padding: 1em; - text-align: center; - background-color: #fff; - border-radius: 4px; - border: 1px solid #37a8db; - color: #37a8db; - font-family: 'open_sanssemibold', Arial, serif; - font-size: 12px; - line-height: 13px; - display: block; - transition: all ease 0.2s; - text-decoration: none; - cursor: pointer; -} - -.modal__button--main { - background-color: #37a8db; - text-shadow: 0 1px rgba(0, 0, 0, 0.25); - color: #fff; - border: 1px solid #3a9dbf; - transition: all ease 0.2s; -} - -.modal__button--main:active { - background-color: #37a8db; - transition: all ease 0.0s; - box-shadow: inset 0 1px 5px rgba(0, 0, 0, 0.35); -} - -.modal__button--main:hover { - background-color: #3394b5; - transition: all ease 0.2s; -} - -.modal__button--main--inline { - display: inline; -} - -.modal__button--disabled { - cursor: default; - color: #fff; - background-color: #AFAFAF; - border: 1px solid #AFAFAF; - pointer-events: none; - text-shadow: none; - opacity: 0.5; -} - -.modal__title { - border-bottom: 1px solid #37a8db; - font-size: 20px; - line-height: 24px; - height: 30px; - font-family: 'open_sanslight', Arial, serif; - margin-bottom: 15px; -} - -.modal__title--warning { - border-bottom: none; - color: darkred; -} - -.modal__text { - line-height: 1.5em; - font-size: 1.3em; -} - -.jBox-Tooltip { - max-width: 180px; -} - -.spacebottom { - margin-bottom: 15px; -} - -.position-relative { - position: relative; -} - -.text-center { - text-align: center; -} - -.warning-box { - background-color: red; - color: white; - font-weight: bold; - margin: 0.4em 0; - padding: 1em; - clear: both; -} - -.info-box { - background-color: #37a8db; - color: white; - font-weight: bold; - margin: 0.4em 0; - padding: 1em; - clear: both; -} - -.ok-box { - background-color: green; - color: white; - font-weight: bold; - margin: 0.4em 0; - padding: 1em; - clear: both; -} - -#modal-reconnect { - /* width: 100%; */ - height: 90px; - background: url(../../images/loading-bars.svg) no-repeat center 100%; -} - -#modal-reconnect div { - text-align: center; -} - -#modal-saving-defaults { - /* width: 100%; */ - height: 90px; - background: url(../../images/loading-bars.svg) no-repeat center 100%; -} - -#modal-saving-defaults div { - text-align: center; -} - -.subtab__header { - padding: 0; - height: auto; -} - -.subtab__header_label { - display: inline-block; - padding: 0 1em; - background-color: #eee; - min-width: 7em; - height: 1.5em; - line-height: 1.5em; - cursor: pointer; - font-size: 18px; -} - -.subtab__header_label--current { - font-weight: bold; - background-color: #ccc; -} - -.subtab__header_label:hover { - background-color: #c5c5c5; -} - -.subtab__content { - display: none; -} - -.subtab__content--current { - display: block; -} - -ol li { - list-style: decimal; - padding-left: 0.5em; - margin-left: 1em; -} - -.red-background, -.red-background td, -.red-background th { - background-color: tomato !important; -} - -/* Wrapper for inputs with unit displays */ -.unit_wrapper { - display: inline-block; - position: relative; -} - -.unit_wrapper input { - margin-right: 0 !important; -} - -.unit_wrapper ~ label, select ~ label, input ~ label { - margin-left: 10px; -} - -/* Position the unit to the right of the wrapper */ -.unit_wrapper::after { - position: absolute; - /*top: 2px;*/ - bottom: -2px; - height: 100%; - right: .5em; - transition: all .05s ease-in-out; -} - -/* Move unit more to the left on hover or focus within - for arrow buttons will appear to the right of number inputs */ -.unit_wrapper:hover::after, -.unit_wrapper:focus-within::after { - right: 1.0em; -} - -/* Handle Firefox (arrows always shown) */ -@supports (-moz-appearance:none) { - .unit_wrapper::after { - right: 1.0em; - } -} - -/* Set the unit abbreviation for each unit class */ -.unit::after { - content: attr(data-unit) ; -} - -.batteryProfileHighlight { - background-color: none; -} - -.batteryProfileHighlightActive { - background-color: #fef2d5; -} - -.controlProfileHighlight { - background-color:none; -} - -.controlProfileHighlightActive { - background-color: #d5ebfe !important ; -} - -.no-border { - border: none !important; -} - -.bold { - font-weight: bold; -} \ No newline at end of file diff --git a/package-lock.json b/package-lock.json index fe06d2db..eabe4d13 100644 --- a/package-lock.json +++ b/package-lock.json @@ -30,6 +30,7 @@ "temp": "^0.8.3", "three": "0.139.0", "usb": "^2.11.0", + "wnumb": "1.2.0", "xml2js": "^0.4.19" }, "devDependencies": { @@ -42,9 +43,9 @@ } }, "node_modules/@babel/runtime": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.24.1.tgz", - "integrity": "sha512-+BIznRzyqBf+2wCTxcKE3wDjfGeCoVE61KSHGpkzqrLi8qxqFwBeUFyId2cxkTmm55fzDGnm0+yCxaxygrLUnQ==", + "version": "7.24.4", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.24.4.tgz", + "integrity": "sha512-dkxf7+hn8mFBwKjs9bvBlArzLVxVbS8usaPUDd5p2a9JCL9tB8OaOVN1isD4+Xyk4ns89/xeOmbQvgdK7IIVdA==", "dependencies": { "regenerator-runtime": "^0.14.0" }, @@ -53,9 +54,9 @@ } }, "node_modules/@electron-forge/cli": { - "version": "7.3.1", - "resolved": "https://registry.npmjs.org/@electron-forge/cli/-/cli-7.3.1.tgz", - "integrity": "sha512-qPIeLxUO5d0xqiJZn0eZ17ytkDjFCN1acgrO/4B767PHsy5MmylyK0ulnRje/aQ/K+u/bN7N0cDyWs3JAEYZrQ==", + "version": "7.4.0", + "resolved": "https://registry.npmjs.org/@electron-forge/cli/-/cli-7.4.0.tgz", + "integrity": "sha512-a+zZv3ja/IxkJzNyx4sOHSZv6DPV85S0PEVF6pcRjUpbDL5r+DxjRFsNc0Nq4UIWyFm1nw7RWoPdd9uDst4Tvg==", "dev": true, "funding": [ { @@ -68,14 +69,14 @@ } ], "dependencies": { - "@electron-forge/core": "7.3.1", - "@electron-forge/shared-types": "7.3.1", + "@electron-forge/core": "7.4.0", + "@electron-forge/shared-types": "7.4.0", "@electron/get": "^3.0.0", "chalk": "^4.0.0", "commander": "^4.1.1", "debug": "^4.3.1", "fs-extra": "^10.0.0", - "listr2": "^5.0.3", + "listr2": "^7.0.2", "semver": "^7.2.1" }, "bin": { @@ -88,9 +89,9 @@ } }, "node_modules/@electron-forge/core": { - "version": "7.3.1", - "resolved": "https://registry.npmjs.org/@electron-forge/core/-/core-7.3.1.tgz", - "integrity": "sha512-Gveci4eAIk4zH/cS+reHqccoAN/qJPde9K/5TotNyNvu8l6QxGd+qJL4bqCixUUXdQ7Nq4tEG12gB/DtUHb6Bw==", + "version": "7.4.0", + "resolved": "https://registry.npmjs.org/@electron-forge/core/-/core-7.4.0.tgz", + "integrity": "sha512-pYHKpB2CKeQgWsb+gox+FPkEvP+6Q2zGj2eZtgZRtKppoWIXrHIpOtcm6FllJ/gZ5u4AsQzVIYReAHGaBa0osw==", "dev": true, "funding": [ { @@ -103,19 +104,19 @@ } ], "dependencies": { - "@electron-forge/core-utils": "7.3.1", - "@electron-forge/maker-base": "7.3.1", - "@electron-forge/plugin-base": "7.3.1", - "@electron-forge/publisher-base": "7.3.1", - "@electron-forge/shared-types": "7.3.1", - "@electron-forge/template-base": "7.3.1", - "@electron-forge/template-vite": "7.3.1", - "@electron-forge/template-vite-typescript": "7.3.1", - "@electron-forge/template-webpack": "7.3.1", - "@electron-forge/template-webpack-typescript": "7.3.1", - "@electron-forge/tracer": "7.3.1", + "@electron-forge/core-utils": "7.4.0", + "@electron-forge/maker-base": "7.4.0", + "@electron-forge/plugin-base": "7.4.0", + "@electron-forge/publisher-base": "7.4.0", + "@electron-forge/shared-types": "7.4.0", + "@electron-forge/template-base": "7.4.0", + "@electron-forge/template-vite": "7.4.0", + "@electron-forge/template-vite-typescript": "7.4.0", + "@electron-forge/template-webpack": "7.4.0", + "@electron-forge/template-webpack-typescript": "7.4.0", + "@electron-forge/tracer": "7.4.0", "@electron/get": "^3.0.0", - "@electron/packager": "^18.1.3", + "@electron/packager": "^18.3.1", "@electron/rebuild": "^3.2.10", "@malept/cross-spawn-promise": "^2.0.0", "chalk": "^4.0.0", @@ -126,7 +127,7 @@ "fs-extra": "^10.0.0", "got": "^11.8.5", "interpret": "^3.1.1", - "listr2": "^5.0.3", + "listr2": "^7.0.2", "lodash": "^4.17.20", "log-symbols": "^4.0.0", "node-fetch": "^2.6.7", @@ -144,12 +145,12 @@ } }, "node_modules/@electron-forge/core-utils": { - "version": "7.3.1", - "resolved": "https://registry.npmjs.org/@electron-forge/core-utils/-/core-utils-7.3.1.tgz", - "integrity": "sha512-+DLk6Futxb4576vi5FKjem1v9+D8EuaLVQy9Y3om7oYkc5JC3eTVSqbryVTEfoyNIm1xdZqya4tRSQ9v7EWu7A==", + "version": "7.4.0", + "resolved": "https://registry.npmjs.org/@electron-forge/core-utils/-/core-utils-7.4.0.tgz", + "integrity": "sha512-9RLG0F9SX466TpkaTcW+V15KmnGuTpmr7NKMRlngtHXmnkBUJz4Mxp1x33WZLgL90dJrxrRgHSfVBtA4lstDPw==", "dev": true, "dependencies": { - "@electron-forge/shared-types": "7.3.1", + "@electron-forge/shared-types": "7.4.0", "@electron/rebuild": "^3.2.10", "@malept/cross-spawn-promise": "^2.0.0", "chalk": "^4.0.0", @@ -165,12 +166,12 @@ } }, "node_modules/@electron-forge/maker-base": { - "version": "7.3.1", - "resolved": "https://registry.npmjs.org/@electron-forge/maker-base/-/maker-base-7.3.1.tgz", - "integrity": "sha512-FWQg2IIBodLh6ms6UvIRdQ4WiNUrUvlzUfIyKQ/DbMk9MUCxbzqY8YI76Uv5vna/rGdXf0lPOC48tpOgTREv/g==", + "version": "7.4.0", + "resolved": "https://registry.npmjs.org/@electron-forge/maker-base/-/maker-base-7.4.0.tgz", + "integrity": "sha512-LwWS4VPdwjISl1KpLhmM1Qr1M3sRTTQ/RsX+GlFd7cQ1W/FsgxMjaTG4Od1d+a5CGVTh3s6X2g99TSUfxjOveg==", "dev": true, "dependencies": { - "@electron-forge/shared-types": "7.3.1", + "@electron-forge/shared-types": "7.4.0", "fs-extra": "^10.0.0", "which": "^2.0.2" }, @@ -179,13 +180,13 @@ } }, "node_modules/@electron-forge/maker-deb": { - "version": "7.3.1", - "resolved": "https://registry.npmjs.org/@electron-forge/maker-deb/-/maker-deb-7.3.1.tgz", - "integrity": "sha512-A+UAxIcSsUoks9hiYoYHe3GIz02OkBBY7quVfiSUrYe2HXB7/++PsxOJ6pSwAFyJ9gzRBU+rSigocXOCFyvB8Q==", + "version": "7.4.0", + "resolved": "https://registry.npmjs.org/@electron-forge/maker-deb/-/maker-deb-7.4.0.tgz", + "integrity": "sha512-npWea3IpGeu96xNqJpsCOYX6V4E+HY6u/okeTUzUOMX96UteT14MecdUefMam158glRTX84k2ryh7WcBoOa4mg==", "dev": true, "dependencies": { - "@electron-forge/maker-base": "7.3.1", - "@electron-forge/shared-types": "7.3.1" + "@electron-forge/maker-base": "7.4.0", + "@electron-forge/shared-types": "7.4.0" }, "engines": { "node": ">= 16.4.0" @@ -195,13 +196,13 @@ } }, "node_modules/@electron-forge/maker-rpm": { - "version": "7.3.1", - "resolved": "https://registry.npmjs.org/@electron-forge/maker-rpm/-/maker-rpm-7.3.1.tgz", - "integrity": "sha512-ICf9SyXoT6nNC8qROIJhuiWByDhgtf0CWVUKIC8oDvQ2N3hQCNhDwpKycAm2psX30j1M/HpKfqe0C+pBntcW+w==", + "version": "7.4.0", + "resolved": "https://registry.npmjs.org/@electron-forge/maker-rpm/-/maker-rpm-7.4.0.tgz", + "integrity": "sha512-N64Yh/K/91GzIk28T1jKsCGgYaquDuhXcEJW+TkVyP5tPZ9aTz9SjXLBxAg8WhcroArAZEsVyPOFKthmFzAUuA==", "dev": true, "dependencies": { - "@electron-forge/maker-base": "7.3.1", - "@electron-forge/shared-types": "7.3.1" + "@electron-forge/maker-base": "7.4.0", + "@electron-forge/shared-types": "7.4.0" }, "engines": { "node": ">= 16.4.0" @@ -211,13 +212,13 @@ } }, "node_modules/@electron-forge/maker-squirrel": { - "version": "7.3.1", - "resolved": "https://registry.npmjs.org/@electron-forge/maker-squirrel/-/maker-squirrel-7.3.1.tgz", - "integrity": "sha512-eUOTdt5KTt/kWl1HIQHBOvlJbrhqVeXMiPwSXffVWWWJb+h+ckFdQmu1jtQySWKcgj7ZkbP1j+0uQFm82Nb5gQ==", + "version": "7.4.0", + "resolved": "https://registry.npmjs.org/@electron-forge/maker-squirrel/-/maker-squirrel-7.4.0.tgz", + "integrity": "sha512-mCQyufnSNfjffiKho59ZqVg4W601zGOl6h01OyfDwjOU/G4iQtpnnDEOXGe26q7OVT5ORb1WDnfyGgBeJ6Ge7g==", "dev": true, "dependencies": { - "@electron-forge/maker-base": "7.3.1", - "@electron-forge/shared-types": "7.3.1", + "@electron-forge/maker-base": "7.4.0", + "@electron-forge/shared-types": "7.4.0", "fs-extra": "^10.0.0" }, "engines": { @@ -228,13 +229,13 @@ } }, "node_modules/@electron-forge/maker-zip": { - "version": "7.3.1", - "resolved": "https://registry.npmjs.org/@electron-forge/maker-zip/-/maker-zip-7.3.1.tgz", - "integrity": "sha512-kH8M5gZnzO13rZIjzEPe+xLFZ0OrxLpJCrF64km2SksVCP8GKdWuD92z/vXZsyXfzQpa8mjHvqigzAB5R6mEiQ==", + "version": "7.4.0", + "resolved": "https://registry.npmjs.org/@electron-forge/maker-zip/-/maker-zip-7.4.0.tgz", + "integrity": "sha512-UGbMdpuK/P29x1FFRWNOs3bNz+7QNFWVWyTM5hcWqib66cNuUmoaPifQyuwW2POIrIohrxlzLK87/i9Zc8g4dA==", "dev": true, "dependencies": { - "@electron-forge/maker-base": "7.3.1", - "@electron-forge/shared-types": "7.3.1", + "@electron-forge/maker-base": "7.4.0", + "@electron-forge/shared-types": "7.4.0", "cross-zip": "^4.0.0", "fs-extra": "^10.0.0", "got": "^11.8.5" @@ -244,51 +245,51 @@ } }, "node_modules/@electron-forge/plugin-base": { - "version": "7.3.1", - "resolved": "https://registry.npmjs.org/@electron-forge/plugin-base/-/plugin-base-7.3.1.tgz", - "integrity": "sha512-4mAzUqfOkRqBwFmE3yO+9dEM2nK9PN/UXFALjN42GS7hbLorluHVmzELkC48Y6M0k1Q+GN3NAdzfMiD+X2PWVA==", + "version": "7.4.0", + "resolved": "https://registry.npmjs.org/@electron-forge/plugin-base/-/plugin-base-7.4.0.tgz", + "integrity": "sha512-LcTNtEc2YaWvhhqWVIfdJ+J0/krSgc2dqYAHhOH2aLUSm9End3dKO/PZ1Y6DPsiPiJKHnSLBJ/XBN/16NY4Sjw==", "dev": true, "dependencies": { - "@electron-forge/shared-types": "7.3.1" + "@electron-forge/shared-types": "7.4.0" }, "engines": { "node": ">= 16.4.0" } }, "node_modules/@electron-forge/publisher-base": { - "version": "7.3.1", - "resolved": "https://registry.npmjs.org/@electron-forge/publisher-base/-/publisher-base-7.3.1.tgz", - "integrity": "sha512-2JMTbUfgBi11AkprTclyeGhn4dwN0rsDVzHYLwOZ08cWSMhvQ0zy/YznI4Yfl9pptirb9I9X8fLQMEK4XbeBQA==", + "version": "7.4.0", + "resolved": "https://registry.npmjs.org/@electron-forge/publisher-base/-/publisher-base-7.4.0.tgz", + "integrity": "sha512-PiJk4RfaC55SnVnteLW2ZIQNM9DpGOi6YoUn5t8i9UcVp2rFIdya7bJY/b9u1hwubm4d5+TdypMVEuJjM44CJQ==", "dev": true, "dependencies": { - "@electron-forge/shared-types": "7.3.1" + "@electron-forge/shared-types": "7.4.0" }, "engines": { "node": ">= 16.4.0" } }, "node_modules/@electron-forge/shared-types": { - "version": "7.3.1", - "resolved": "https://registry.npmjs.org/@electron-forge/shared-types/-/shared-types-7.3.1.tgz", - "integrity": "sha512-yRW3UWd+AwtK1UrZxWCtxqnD1lF6e+1GWXdgR186/UX2CMy+jVzUtL4Xk+xMKrLgiVKZglVbTdee1cEb6egtVw==", + "version": "7.4.0", + "resolved": "https://registry.npmjs.org/@electron-forge/shared-types/-/shared-types-7.4.0.tgz", + "integrity": "sha512-5Ehy6enUjBaU08odf9u9TOhmOVXlqobzMvKUixtkdAWgV1XZAUJmn+p21xhj0IkO92MQiXMGv66w9pDNjRT8uQ==", "dev": true, "dependencies": { - "@electron-forge/tracer": "7.3.1", - "@electron/packager": "^18.1.3", + "@electron-forge/tracer": "7.4.0", + "@electron/packager": "^18.3.1", "@electron/rebuild": "^3.2.10", - "listr2": "^5.0.3" + "listr2": "^7.0.2" }, "engines": { "node": ">= 16.4.0" } }, "node_modules/@electron-forge/template-base": { - "version": "7.3.1", - "resolved": "https://registry.npmjs.org/@electron-forge/template-base/-/template-base-7.3.1.tgz", - "integrity": "sha512-iGzjWeZlxoIdZMaLu4ABwG4AzI2/QEUMM9817mMVb24+7ZUTtrP8WJWkpsJjcEjXtb1oyt3CRoNqQt+iH6H1BA==", + "version": "7.4.0", + "resolved": "https://registry.npmjs.org/@electron-forge/template-base/-/template-base-7.4.0.tgz", + "integrity": "sha512-3YWdRSGzQfQPQkQxStn2wkJ/SuNGGKo9slwFJGvqMV+Pbx3/M/hYi9sMXOuaqVZgeaBp8Ap27yFPxaIIOC3vcA==", "dev": true, "dependencies": { - "@electron-forge/shared-types": "7.3.1", + "@electron-forge/shared-types": "7.4.0", "@malept/cross-spawn-promise": "^2.0.0", "debug": "^4.3.1", "fs-extra": "^10.0.0", @@ -299,13 +300,13 @@ } }, "node_modules/@electron-forge/template-vite": { - "version": "7.3.1", - "resolved": "https://registry.npmjs.org/@electron-forge/template-vite/-/template-vite-7.3.1.tgz", - "integrity": "sha512-r1PFPZ2Y7t4EDte2HckTUiXQY1L++wofolm6TRzVv/h5ZViHq8vNBWvXTyZNtZOtqIErIRbGXHL1DbiRlgOMTg==", + "version": "7.4.0", + "resolved": "https://registry.npmjs.org/@electron-forge/template-vite/-/template-vite-7.4.0.tgz", + "integrity": "sha512-YPVyCGiBKmZPCxK/Bd2louV3PBcxI2nT2+tRKP+mlEHOWrxbZIfmZSR2lIAFvK/ALKlwUKROdmlwyi7ZcdT7JQ==", "dev": true, "dependencies": { - "@electron-forge/shared-types": "7.3.1", - "@electron-forge/template-base": "7.3.1", + "@electron-forge/shared-types": "7.4.0", + "@electron-forge/template-base": "7.4.0", "fs-extra": "^10.0.0" }, "engines": { @@ -313,13 +314,13 @@ } }, "node_modules/@electron-forge/template-vite-typescript": { - "version": "7.3.1", - "resolved": "https://registry.npmjs.org/@electron-forge/template-vite-typescript/-/template-vite-typescript-7.3.1.tgz", - "integrity": "sha512-YS2arQENkpBbpFXk7SlAulK77OMLgcutjmZd0jW9Z/PUCUo9rdTW9QmlCNFz37tRHvwpClJcTcAoKpCoJUrIVA==", + "version": "7.4.0", + "resolved": "https://registry.npmjs.org/@electron-forge/template-vite-typescript/-/template-vite-typescript-7.4.0.tgz", + "integrity": "sha512-wdByG807VWcUd81E6572b/G/Ki8gb+GrCIWxO7Cl3qBa+yNaU1sHhBwB1RyTbQy1r8ubSBtsWrRD1J/yzHKWoQ==", "dev": true, "dependencies": { - "@electron-forge/shared-types": "7.3.1", - "@electron-forge/template-base": "7.3.1", + "@electron-forge/shared-types": "7.4.0", + "@electron-forge/template-base": "7.4.0", "fs-extra": "^10.0.0" }, "engines": { @@ -327,13 +328,13 @@ } }, "node_modules/@electron-forge/template-webpack": { - "version": "7.3.1", - "resolved": "https://registry.npmjs.org/@electron-forge/template-webpack/-/template-webpack-7.3.1.tgz", - "integrity": "sha512-SlzfFsOUVsx9Yk6Hhqqsw33s1/J1cx7eGkc9AVASKZnGHnFDGYUVyTr1ueR7SFQwZd5TOs7OISQ6sL2GQa4Icg==", + "version": "7.4.0", + "resolved": "https://registry.npmjs.org/@electron-forge/template-webpack/-/template-webpack-7.4.0.tgz", + "integrity": "sha512-W558AEGwQrwEtKIbIJPPs0LIsaC/1Vncj5NgqKehEMJjBb0KQq4hwBu/6dauQrfun4jRCOp7LV+OVrf5XPJ7QA==", "dev": true, "dependencies": { - "@electron-forge/shared-types": "7.3.1", - "@electron-forge/template-base": "7.3.1", + "@electron-forge/shared-types": "7.4.0", + "@electron-forge/template-base": "7.4.0", "fs-extra": "^10.0.0" }, "engines": { @@ -341,13 +342,13 @@ } }, "node_modules/@electron-forge/template-webpack-typescript": { - "version": "7.3.1", - "resolved": "https://registry.npmjs.org/@electron-forge/template-webpack-typescript/-/template-webpack-typescript-7.3.1.tgz", - "integrity": "sha512-cCFAuiKiKCNAJTXOgA3NTLAU6VQ0uYtGa6WiI8q5tK7d34Ef6zEuCKt5opI4zKXVdFrE0vYE0PBHH/M++z1g1w==", + "version": "7.4.0", + "resolved": "https://registry.npmjs.org/@electron-forge/template-webpack-typescript/-/template-webpack-typescript-7.4.0.tgz", + "integrity": "sha512-O5gwjNSGFNRdJWyiCtevcOBDPAMhgOPvLORh9qR1GcjyTutWwHWmZzycqH+MmkhpQPgrAYDEeipXcOQhSbzNZA==", "dev": true, "dependencies": { - "@electron-forge/shared-types": "7.3.1", - "@electron-forge/template-base": "7.3.1", + "@electron-forge/shared-types": "7.4.0", + "@electron-forge/template-base": "7.4.0", "fs-extra": "^10.0.0" }, "engines": { @@ -355,9 +356,9 @@ } }, "node_modules/@electron-forge/tracer": { - "version": "7.3.1", - "resolved": "https://registry.npmjs.org/@electron-forge/tracer/-/tracer-7.3.1.tgz", - "integrity": "sha512-Jz6SgnHZ2Gk4l7WRu/rLyQTe6F23dXcTNsjI5gtUEJxjjd2K9L0UoxVcGikA7SEMUufaPyskSJfrW7NSZ4s43Q==", + "version": "7.4.0", + "resolved": "https://registry.npmjs.org/@electron-forge/tracer/-/tracer-7.4.0.tgz", + "integrity": "sha512-F4jbnDn4yIZjmky1FZ6rgBKTM05AZQQfHkyJW2hdS4pDKJjdKAqWytoZKDi1/S6Cr6tN+DD0TFGD3V0i6HPHYQ==", "dev": true, "dependencies": { "chrome-trace-event": "^1.0.3" @@ -508,9 +509,9 @@ } }, "node_modules/@electron/packager": { - "version": "18.1.3", - "resolved": "https://registry.npmjs.org/@electron/packager/-/packager-18.1.3.tgz", - "integrity": "sha512-21T5MxUf7DwV07IIes3jO/571mXCjOGVPdmYJFPCVDTimFiHQSW0Oy+OIGQaKBiNIXfnP29KylsCQbmds6O6Iw==", + "version": "18.3.2", + "resolved": "https://registry.npmjs.org/@electron/packager/-/packager-18.3.2.tgz", + "integrity": "sha512-orjylavppgIh24qkNpWm2B/LQUpCS/YLOoKoU+eMK/hJgIhShLDsusPIQzgUGVwNCichu8/zPAGfdQZXHG0gtw==", "dev": true, "dependencies": { "@electron/asar": "^3.2.1", @@ -519,7 +520,6 @@ "@electron/osx-sign": "^1.0.5", "@electron/universal": "^2.0.1", "@electron/windows-sign": "^1.0.0", - "cross-spawn-windows-exe": "^1.2.0", "debug": "^4.0.1", "extract-zip": "^2.0.0", "filenamify": "^4.1.0", @@ -529,7 +529,7 @@ "junk": "^3.1.0", "parse-author": "^2.0.0", "plist": "^3.0.0", - "rcedit": "^4.0.0", + "resedit": "^2.0.0", "resolve": "^1.1.6", "semver": "^7.1.3", "yargs-parser": "^21.1.1" @@ -660,9 +660,9 @@ } }, "node_modules/@electron/universal/node_modules/minimatch": { - "version": "9.0.3", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.3.tgz", - "integrity": "sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg==", + "version": "9.0.4", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.4.tgz", + "integrity": "sha512-KqWh+VchfxcMNRAJjj2tnsSJdNbHsVgnkBhTNrW7AjVo6OvLtxw8zfT9oLw1JSohlFzJ8jCoTgaoXvJ+kHt6fw==", "dev": true, "dependencies": { "brace-expansion": "^2.0.1" @@ -1094,9 +1094,9 @@ "optional": true }, "node_modules/@types/node": { - "version": "18.19.26", - "resolved": "https://registry.npmjs.org/@types/node/-/node-18.19.26.tgz", - "integrity": "sha512-+wiMJsIwLOYCvUqSdKTrfkS8mpTp+MPINe6+Np4TAGFWWRWiBQ5kSq9nZGCSPkzx9mvT+uEukzpX4MOSCydcvw==", + "version": "18.19.31", + "resolved": "https://registry.npmjs.org/@types/node/-/node-18.19.31.tgz", + "integrity": "sha512-ArgCD39YpyyrtFKIqMDvjz79jto5fcI/SVUs2HwB+f0dAzq68yqOdyaSivLiLugSziTpNXLQrVb7RZFmdZzbhA==", "dependencies": { "undici-types": "~5.26.4" } @@ -1256,24 +1256,24 @@ } }, "node_modules/ansi-escapes": { - "version": "4.3.2", - "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.2.tgz", - "integrity": "sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==", + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-5.0.0.tgz", + "integrity": "sha512-5GFMVX8HqE/TB+FuBJGuO5XG0WrsA6ptUqoODaT/n9mmUaZFkqnBueB4leqGBCmrUHnCnC4PCZTCd0E7QQ83bA==", "dev": true, "dependencies": { - "type-fest": "^0.21.3" + "type-fest": "^1.0.2" }, "engines": { - "node": ">=8" + "node": ">=12" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/ansi-escapes/node_modules/type-fest": { - "version": "0.21.3", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.21.3.tgz", - "integrity": "sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==", + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-1.4.0.tgz", + "integrity": "sha512-yGSza74xk0UG8k+pLh5oeoYirvIiWo5t0/o3zHHAO2tRDiZcxWP7fywNlXhqb6/r6sWvwi+RsyQMWhVLe4BVuA==", "dev": true, "engines": { "node": ">=10" @@ -1283,11 +1283,15 @@ } }, "node_modules/ansi-regex": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.0.1.tgz", + "integrity": "sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==", + "dev": true, "engines": { - "node": ">=8" + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-regex?sponsor=1" } }, "node_modules/ansi-styles": { @@ -1378,15 +1382,6 @@ "node": ">=0.8" } }, - "node_modules/astral-regex": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/astral-regex/-/astral-regex-2.0.0.tgz", - "integrity": "sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ==", - "dev": true, - "engines": { - "node": ">=8" - } - }, "node_modules/async": { "version": "2.6.0", "resolved": "https://registry.npmjs.org/async/-/async-2.6.0.tgz", @@ -1469,8 +1464,6 @@ "version": "0.1.5", "resolved": "https://registry.npmjs.org/base64-arraybuffer/-/base64-arraybuffer-0.1.5.tgz", "integrity": "sha512-437oANT9tP582zZMwSvZGy2nmSeAb8DW2me3y+Uv1Wp2Rulr8Mqlyrv3E7MLxmsiaPSMMDmiDVzgE+e8zlMx9g==", - "resolved": "https://registry.npmjs.org/base64-arraybuffer/-/base64-arraybuffer-0.1.5.tgz", - "integrity": "sha512-437oANT9tP582zZMwSvZGy2nmSeAb8DW2me3y+Uv1Wp2Rulr8Mqlyrv3E7MLxmsiaPSMMDmiDVzgE+e8zlMx9g==", "engines": { "node": ">= 0.6.0" } @@ -1494,14 +1487,11 @@ "url": "https://feross.org/support" } ] - ] }, "node_modules/base64id": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/base64id/-/base64id-1.0.0.tgz", "integrity": "sha512-rz8L+d/xByiB/vLVftPkyY215fqNrmasrcJsYkVcm4TgJNz+YXKrFaFAWibSaHkiKoSgMDCb+lipOIRQNGYesw==", - "resolved": "https://registry.npmjs.org/base64id/-/base64id-1.0.0.tgz", - "integrity": "sha512-rz8L+d/xByiB/vLVftPkyY215fqNrmasrcJsYkVcm4TgJNz+YXKrFaFAWibSaHkiKoSgMDCb+lipOIRQNGYesw==", "engines": { "node": ">= 0.4.0" } @@ -1510,8 +1500,6 @@ "version": "1.0.2", "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz", "integrity": "sha512-qeFIXtP4MSoi6NLqO12WfqARWWuCKi2Rn/9hJLEmtB5yTNr9DqFWkJRCf2qShWzPeAMRnOgCrq0sg/KLv5ES9w==", - "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz", - "integrity": "sha512-qeFIXtP4MSoi6NLqO12WfqARWWuCKi2Rn/9hJLEmtB5yTNr9DqFWkJRCf2qShWzPeAMRnOgCrq0sg/KLv5ES9w==", "dependencies": { "tweetnacl": "^0.14.3" } @@ -1520,8 +1508,6 @@ "version": "1.0.2", "resolved": "https://registry.npmjs.org/better-assert/-/better-assert-1.0.2.tgz", "integrity": "sha512-bYeph2DFlpK1XmGs6fvlLRUN29QISM3GBuUwSFsMY2XRx4AvC0WNCS57j4c/xGrK2RS24C1w3YoBOsw9fT46tQ==", - "resolved": "https://registry.npmjs.org/better-assert/-/better-assert-1.0.2.tgz", - "integrity": "sha512-bYeph2DFlpK1XmGs6fvlLRUN29QISM3GBuUwSFsMY2XRx4AvC0WNCS57j4c/xGrK2RS24C1w3YoBOsw9fT46tQ==", "dependencies": { "callsite": "1.0.0" }, @@ -1533,8 +1519,6 @@ "version": "0.3.0", "resolved": "https://registry.npmjs.org/binary/-/binary-0.3.0.tgz", "integrity": "sha512-D4H1y5KYwpJgK8wk1Cue5LLPgmwHKYSChkbspQg5JtVuR5ulGckxfR62H3AE9UDkdMC8yyXlqYihuz3Aqg2XZg==", - "resolved": "https://registry.npmjs.org/binary/-/binary-0.3.0.tgz", - "integrity": "sha512-D4H1y5KYwpJgK8wk1Cue5LLPgmwHKYSChkbspQg5JtVuR5ulGckxfR62H3AE9UDkdMC8yyXlqYihuz3Aqg2XZg==", "dependencies": { "buffers": "~0.1.1", "chainsaw": "~0.1.0" @@ -1558,8 +1542,6 @@ "version": "0.0.5", "resolved": "https://registry.npmjs.org/blob/-/blob-0.0.5.tgz", "integrity": "sha512-gaqbzQPqOoamawKg0LGVd7SzLgXS+JH61oWprSLH+P+abTczqJbhTR8CmJ2u9/bUYNmHTGJx/UEmn6doAvvuig==" - "resolved": "https://registry.npmjs.org/blob/-/blob-0.0.5.tgz", - "integrity": "sha512-gaqbzQPqOoamawKg0LGVd7SzLgXS+JH61oWprSLH+P+abTczqJbhTR8CmJ2u9/bUYNmHTGJx/UEmn6doAvvuig==" }, "node_modules/bluebird": { "version": "3.7.2", @@ -1578,9 +1560,6 @@ "resolved": "https://registry.npmjs.org/boom/-/boom-2.10.1.tgz", "integrity": "sha512-KbiZEa9/vofNcVJXGwdWWn25reQ3V3dHBWbS07FTF3/TOehLnm9GEhJV4T6ZvGPkShRpmUqYwnaCrkj0mRnP6Q==", "deprecated": "This version has been deprecated in accordance with the hapi support policy (hapi.im/support). Please upgrade to the latest version to get the best features, bug fixes, and security patches. If you are unable to upgrade at this time, paid support is available for older versions (hapi.im/commercial).", - "resolved": "https://registry.npmjs.org/boom/-/boom-2.10.1.tgz", - "integrity": "sha512-KbiZEa9/vofNcVJXGwdWWn25reQ3V3dHBWbS07FTF3/TOehLnm9GEhJV4T6ZvGPkShRpmUqYwnaCrkj0mRnP6Q==", - "deprecated": "This version has been deprecated in accordance with the hapi support policy (hapi.im/support). Please upgrade to the latest version to get the best features, bug fixes, and security patches. If you are unable to upgrade at this time, paid support is available for older versions (hapi.im/commercial).", "dependencies": { "hoek": "2.x.x" }, @@ -1592,8 +1571,6 @@ "version": "1.1.11", "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", "dependencies": { "balanced-match": "^1.0.0", "concat-map": "0.0.1" @@ -1639,8 +1616,6 @@ "version": "0.2.13", "resolved": "https://registry.npmjs.org/buffer-crc32/-/buffer-crc32-0.2.13.tgz", "integrity": "sha512-VO9Ht/+p3SN7SKWqcrgEzjGbRSJYTx+Q1pTQC0wrWqHx0vpJraQ6GtHx8tvcg1rlK1byhU5gccxgOgj7B0TDkQ==", - "resolved": "https://registry.npmjs.org/buffer-crc32/-/buffer-crc32-0.2.13.tgz", - "integrity": "sha512-VO9Ht/+p3SN7SKWqcrgEzjGbRSJYTx+Q1pTQC0wrWqHx0vpJraQ6GtHx8tvcg1rlK1byhU5gccxgOgj7B0TDkQ==", "engines": { "node": "*" } @@ -1655,8 +1630,6 @@ "version": "0.1.1", "resolved": "https://registry.npmjs.org/buffers/-/buffers-0.1.1.tgz", "integrity": "sha512-9q/rDEGSb/Qsvv2qvzIzdluL5k7AaJOTrw23z9reQthrbF7is4CtlT0DXyO1oei2DCp4uojjzQ7igaSHp1kAEQ==", - "resolved": "https://registry.npmjs.org/buffers/-/buffers-0.1.1.tgz", - "integrity": "sha512-9q/rDEGSb/Qsvv2qvzIzdluL5k7AaJOTrw23z9reQthrbF7is4CtlT0DXyO1oei2DCp4uojjzQ7igaSHp1kAEQ==", "engines": { "node": ">=0.2.0" } @@ -1665,8 +1638,6 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/builtin-modules/-/builtin-modules-2.0.0.tgz", "integrity": "sha512-3U5kUA5VPsRUA3nofm/BXX7GVHKfxz0hOBAPxXrIvHzlDRkQVqEn6yi8QJegxl4LzOHLdvb7XF5dVawa/VVYBg==", - "resolved": "https://registry.npmjs.org/builtin-modules/-/builtin-modules-2.0.0.tgz", - "integrity": "sha512-3U5kUA5VPsRUA3nofm/BXX7GVHKfxz0hOBAPxXrIvHzlDRkQVqEn6yi8QJegxl4LzOHLdvb7XF5dVawa/VVYBg==", "engines": { "node": ">=4" } @@ -1799,8 +1770,6 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/callsite/-/callsite-1.0.0.tgz", "integrity": "sha512-0vdNRFXn5q+dtOqjfFtmtlI9N2eVZ7LMyEV2iKC5mEEFvSg/69Ml6b/WU2qF8W1nLRa0wiSrDT3Y5jOHZCwKPQ==", - "resolved": "https://registry.npmjs.org/callsite/-/callsite-1.0.0.tgz", - "integrity": "sha512-0vdNRFXn5q+dtOqjfFtmtlI9N2eVZ7LMyEV2iKC5mEEFvSg/69Ml6b/WU2qF8W1nLRa0wiSrDT3Y5jOHZCwKPQ==", "engines": { "node": "*" } @@ -1818,15 +1787,11 @@ "version": "0.12.0", "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz", "integrity": "sha512-4tYFyifaFfGacoiObjJegolkwSU4xQNGbVgUiNYVUxbQ2x2lUsFvY4hVgVzGiIe6WLOPqycWXA40l+PWsxthUw==" - "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz", - "integrity": "sha512-4tYFyifaFfGacoiObjJegolkwSU4xQNGbVgUiNYVUxbQ2x2lUsFvY4hVgVzGiIe6WLOPqycWXA40l+PWsxthUw==" }, "node_modules/catharsis": { "version": "0.8.11", "resolved": "https://registry.npmjs.org/catharsis/-/catharsis-0.8.11.tgz", "integrity": "sha512-a+xUyMV7hD1BrDQA/3iPV7oc+6W26BgVJO05PGEoatMyIuPScQKsde6i3YorWX1qs+AZjnJ18NqdKoCtKiNh1g==", - "resolved": "https://registry.npmjs.org/catharsis/-/catharsis-0.8.11.tgz", - "integrity": "sha512-a+xUyMV7hD1BrDQA/3iPV7oc+6W26BgVJO05PGEoatMyIuPScQKsde6i3YorWX1qs+AZjnJ18NqdKoCtKiNh1g==", "dependencies": { "lodash": "^4.17.14" }, @@ -1838,8 +1803,6 @@ "version": "0.1.3", "resolved": "https://registry.npmjs.org/center-align/-/center-align-0.1.3.tgz", "integrity": "sha512-Baz3aNe2gd2LP2qk5U+sDk/m4oSuwSDcBfayTCTBoWpfIGO5XFxPmjILQII4NGiZjD6DoDI6kf7gKaxkf7s3VQ==", - "resolved": "https://registry.npmjs.org/center-align/-/center-align-0.1.3.tgz", - "integrity": "sha512-Baz3aNe2gd2LP2qk5U+sDk/m4oSuwSDcBfayTCTBoWpfIGO5XFxPmjILQII4NGiZjD6DoDI6kf7gKaxkf7s3VQ==", "optional": true, "dependencies": { "align-text": "^0.1.3", @@ -1853,14 +1816,9 @@ "version": "0.1.0", "resolved": "https://registry.npmjs.org/chainsaw/-/chainsaw-0.1.0.tgz", "integrity": "sha512-75kWfWt6MEKNC8xYXIdRpDehRYY/tNSgwKaJq+dbbDcxORuVrrQ+SEHoWsniVn9XPYfP4gmdWIeDk/4YNp1rNQ==", - "resolved": "https://registry.npmjs.org/chainsaw/-/chainsaw-0.1.0.tgz", - "integrity": "sha512-75kWfWt6MEKNC8xYXIdRpDehRYY/tNSgwKaJq+dbbDcxORuVrrQ+SEHoWsniVn9XPYfP4gmdWIeDk/4YNp1rNQ==", "dependencies": { "traverse": ">=0.3.0 <0.4" }, - "engines": { - "node": "*" - }, "engines": { "node": "*" } @@ -1885,8 +1843,6 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/chownr/-/chownr-2.0.0.tgz", "integrity": "sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ==", - "resolved": "https://registry.npmjs.org/chownr/-/chownr-2.0.0.tgz", - "integrity": "sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ==", "dev": true, "engines": { "node": ">=10" @@ -1918,15 +1874,18 @@ } }, "node_modules/cli-cursor": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-3.1.0.tgz", - "integrity": "sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-4.0.0.tgz", + "integrity": "sha512-VGtlMu3x/4DOtIUwEkRezxUZ2lBacNJCHash0N0WeZDBS+7Ux1dm3XWAgWYxLJFMMdOeXMHXorshEFhbMSGelg==", "dev": true, "dependencies": { - "restore-cursor": "^3.1.0" + "restore-cursor": "^4.0.0" }, "engines": { - "node": ">=8" + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/cli-spinners": { @@ -1942,16 +1901,16 @@ } }, "node_modules/cli-truncate": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/cli-truncate/-/cli-truncate-2.1.0.tgz", - "integrity": "sha512-n8fOixwDD6b/ObinzTrp1ZKFzbgvKZvuz/TvejnLn1aQfC6r52XEx85FmuC+3HI+JM7coBRXUvNqEU2PHVrHpg==", + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/cli-truncate/-/cli-truncate-3.1.0.tgz", + "integrity": "sha512-wfOBkjXteqSnI59oPcJkcPl/ZmwvMMOj340qUIY1SKZCv0B9Cf4D4fAucRkIKQmsIuYK3x1rrgU7MeGRruiuiA==", "dev": true, "dependencies": { - "slice-ansi": "^3.0.0", - "string-width": "^4.2.0" + "slice-ansi": "^5.0.0", + "string-width": "^5.0.0" }, "engines": { - "node": ">=8" + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" @@ -1971,6 +1930,73 @@ "node": ">=12" } }, + "node_modules/cliui/node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/cliui/node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "dev": true + }, + "node_modules/cliui/node_modules/is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/cliui/node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dev": true, + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/cliui/node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/cliui/node_modules/wrap-ansi": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, "node_modules/clone": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/clone/-/clone-1.0.4.tgz", @@ -1995,8 +2021,6 @@ "version": "1.26.0", "resolved": "https://registry.npmjs.org/closure-util/-/closure-util-1.26.0.tgz", "integrity": "sha512-zpWABEochWrY48soiEttuqJk/OSYscS9PcvKgHvKUefM29+R8rqx5Bp8KIZHR0Nsq1JrNgxg2VTmJ/IsqN5VOA==", - "resolved": "https://registry.npmjs.org/closure-util/-/closure-util-1.26.0.tgz", - "integrity": "sha512-zpWABEochWrY48soiEttuqJk/OSYscS9PcvKgHvKUefM29+R8rqx5Bp8KIZHR0Nsq1JrNgxg2VTmJ/IsqN5VOA==", "hasInstallScript": true, "dependencies": { "acorn": "5.2.1", @@ -2047,8 +2071,6 @@ "version": "4.0.2", "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-4.0.2.tgz", "integrity": "sha512-wYid1zXctNLgas1pZ8q8ChdsnGg4DHZVqMzJ7pOE85q5BppAEXgQGSoOjVgrcw5yI7pzz49p9AfMhM7z5PRuaw==", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-4.0.2.tgz", - "integrity": "sha512-wYid1zXctNLgas1pZ8q8ChdsnGg4DHZVqMzJ7pOE85q5BppAEXgQGSoOjVgrcw5yI7pzz49p9AfMhM7z5PRuaw==", "dependencies": { "graceful-fs": "^4.1.2", "jsonfile": "^4.0.0", @@ -2074,8 +2096,6 @@ "version": "7.1.2", "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.2.tgz", "integrity": "sha512-MJTUg1kjuLeQCJ+ccE4Vpa6kKVXkPYJ2mOCQyUuKLcLQsdrMCpBPUi8qVE6+YuaJkozeA9NusTAw3hLr8Xe5EQ==", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.2.tgz", - "integrity": "sha512-MJTUg1kjuLeQCJ+ccE4Vpa6kKVXkPYJ2mOCQyUuKLcLQsdrMCpBPUi8qVE6+YuaJkozeA9NusTAw3hLr8Xe5EQ==", "dependencies": { "fs.realpath": "^1.0.0", "inflight": "^1.0.4", @@ -2092,8 +2112,6 @@ "version": "4.1.11", "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.11.tgz", "integrity": "sha512-9x6DLUuW+ROFdMTII9ec9t/FK8va6kYcC8/LggumssLM8kNv7IdFl3VrNUqgir2tJuBVxBga1QBoRziZacO5Zg==", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.11.tgz", - "integrity": "sha512-9x6DLUuW+ROFdMTII9ec9t/FK8va6kYcC8/LggumssLM8kNv7IdFl3VrNUqgir2tJuBVxBga1QBoRziZacO5Zg==", "engines": { "node": ">=0.4.0" } @@ -2118,15 +2136,11 @@ "version": "4.17.4", "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.4.tgz", "integrity": "sha512-6X37Sq9KCpLSXEh8uM12AKYlviHPNNk4RxiGBn4cmKGJinbXBneWIV7iE/nXkM928O7ytHcHb6+X6Svl0f4hXg==" - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.4.tgz", - "integrity": "sha512-6X37Sq9KCpLSXEh8uM12AKYlviHPNNk4RxiGBn4cmKGJinbXBneWIV7iE/nXkM928O7ytHcHb6+X6Svl0f4hXg==" }, "node_modules/closure-util/node_modules/minimatch": { "version": "3.0.4", "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", - "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", "dependencies": { "brace-expansion": "^1.1.7" }, @@ -2138,17 +2152,12 @@ "version": "0.0.8", "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz", "integrity": "sha512-miQKw5Hv4NS1Psg2517mV4e4dYNaO3++hjAvLOAzKqZ61rH8NS1SK+vbfBWZ5PY/Me/bEWhUwqMghEW5Fb9T7Q==" - "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz", - "integrity": "sha512-miQKw5Hv4NS1Psg2517mV4e4dYNaO3++hjAvLOAzKqZ61rH8NS1SK+vbfBWZ5PY/Me/bEWhUwqMghEW5Fb9T7Q==" }, "node_modules/closure-util/node_modules/mkdirp": { "version": "0.5.1", "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz", "integrity": "sha512-SknJC52obPfGQPnjIkXbmA6+5H15E+fR+E4iR2oQ3zzCLbd7/ONua69R/Gw7AgkTLsRG+r5fzksYwWe1AgTyWA==", "deprecated": "Legacy versions of mkdirp are no longer supported. Please update to mkdirp 1.x. (Note that the API surface has changed to use Promises in 1.x.)", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz", - "integrity": "sha512-SknJC52obPfGQPnjIkXbmA6+5H15E+fR+E4iR2oQ3zzCLbd7/ONua69R/Gw7AgkTLsRG+r5fzksYwWe1AgTyWA==", - "deprecated": "Legacy versions of mkdirp are no longer supported. Please update to mkdirp 1.x. (Note that the API surface has changed to use Promises in 1.x.)", "dependencies": { "minimist": "0.0.8" }, @@ -2185,8 +2194,6 @@ "version": "2.6.2", "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.2.tgz", "integrity": "sha512-lreewLK/BlghmxtfH36YYVg1i8IAce4TI7oao75I1g245+6BctqTVQiBP3YUJ9C6DQOXJmkYR9X9fCLtCOJc5w==", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.2.tgz", - "integrity": "sha512-lreewLK/BlghmxtfH36YYVg1i8IAce4TI7oao75I1g245+6BctqTVQiBP3YUJ9C6DQOXJmkYR9X9fCLtCOJc5w==", "dependencies": { "glob": "^7.0.5" }, @@ -2235,8 +2242,6 @@ "version": "0.8.3", "resolved": "https://registry.npmjs.org/temp/-/temp-0.8.3.tgz", "integrity": "sha512-jtnWJs6B1cZlHs9wPG7BrowKxZw/rf6+UpGAkr8AaYmiTyTO7zQlLoST8zx/8TcUPnZmeBoB+H8ARuHZaSijVw==", - "resolved": "https://registry.npmjs.org/temp/-/temp-0.8.3.tgz", - "integrity": "sha512-jtnWJs6B1cZlHs9wPG7BrowKxZw/rf6+UpGAkr8AaYmiTyTO7zQlLoST8zx/8TcUPnZmeBoB+H8ARuHZaSijVw==", "engines": [ "node >=0.8.0" ], @@ -2249,8 +2254,6 @@ "version": "2.2.8", "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.2.8.tgz", "integrity": "sha512-R5KMKHnPAQaZMqLOsyuyUmcIjSeDm+73eoqQpaXA7AZ22BL+6C+1mcUscgOsNd8WVlJuvlgAPsegcx7pjlV0Dg==", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.2.8.tgz", - "integrity": "sha512-R5KMKHnPAQaZMqLOsyuyUmcIjSeDm+73eoqQpaXA7AZ22BL+6C+1mcUscgOsNd8WVlJuvlgAPsegcx7pjlV0Dg==", "bin": { "rimraf": "bin.js" } @@ -2267,8 +2270,6 @@ "version": "4.6.0", "resolved": "https://registry.npmjs.org/co/-/co-4.6.0.tgz", "integrity": "sha512-QVb0dM5HvG+uaxitm8wONl7jltx8dqhfU33DcqtOZcLSVIKSDDLDi7+0LbAKiyI8hD9u42m2YxXSkMGWThaecQ==", - "resolved": "https://registry.npmjs.org/co/-/co-4.6.0.tgz", - "integrity": "sha512-QVb0dM5HvG+uaxitm8wONl7jltx8dqhfU33DcqtOZcLSVIKSDDLDi7+0LbAKiyI8hD9u42m2YxXSkMGWThaecQ==", "engines": { "iojs": ">= 1.0.0", "node": ">= 0.12.0" @@ -2278,8 +2279,6 @@ "version": "1.1.0", "resolved": "https://registry.npmjs.org/code-point-at/-/code-point-at-1.1.0.tgz", "integrity": "sha512-RpAVKQA5T63xEj6/giIbUEtZwJ4UFIc3ZtvEkiaUERylqe8xb5IvqcgOurZLahv93CLKfxcw5YI+DZcUBRyLXA==", - "resolved": "https://registry.npmjs.org/code-point-at/-/code-point-at-1.1.0.tgz", - "integrity": "sha512-RpAVKQA5T63xEj6/giIbUEtZwJ4UFIc3ZtvEkiaUERylqe8xb5IvqcgOurZLahv93CLKfxcw5YI+DZcUBRyLXA==", "engines": { "node": ">=0.10.0" } @@ -2301,9 +2300,6 @@ "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", "dev": true - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true }, "node_modules/color-support": { "version": "1.1.3", @@ -2324,8 +2320,6 @@ "version": "1.0.8", "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", - "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", - "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", "dependencies": { "delayed-stream": "~1.0.0" }, @@ -2355,9 +2349,6 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/component-bind/-/component-bind-1.0.0.tgz", "integrity": "sha512-WZveuKPeKAG9qY+FkYDeADzdHyTYdIboXS59ixDeRJL5ZhxpqUnxSOwop4FQjMsiYm3/Or8cegVbpAHNA7pHxw==" - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/component-bind/-/component-bind-1.0.0.tgz", - "integrity": "sha512-WZveuKPeKAG9qY+FkYDeADzdHyTYdIboXS59ixDeRJL5ZhxpqUnxSOwop4FQjMsiYm3/Or8cegVbpAHNA7pHxw==" }, "node_modules/component-emitter": { "version": "1.2.1", @@ -2373,8 +2364,6 @@ "version": "0.0.1", "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==" - "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", - "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==" }, "node_modules/conf": { "version": "10.2.0", @@ -2408,8 +2397,6 @@ "version": "0.3.1", "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.3.1.tgz", "integrity": "sha512-+IJOX0OqlHCszo2mBUq+SrEbCj6w7Kpffqx60zYbPTFaO4+yYgRjHwcZNpWvaTylDHaV7PPmBHzSecZiMhtPgw==", - "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.3.1.tgz", - "integrity": "sha512-+IJOX0OqlHCszo2mBUq+SrEbCj6w7Kpffqx60zYbPTFaO4+yYgRjHwcZNpWvaTylDHaV7PPmBHzSecZiMhtPgw==", "engines": { "node": ">= 0.6" } @@ -2439,54 +2426,6 @@ "node": ">= 8" } }, - "node_modules/cross-spawn-windows-exe": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/cross-spawn-windows-exe/-/cross-spawn-windows-exe-1.2.0.tgz", - "integrity": "sha512-mkLtJJcYbDCxEG7Js6eUnUNndWjyUZwJ3H7bErmmtOYU/Zb99DyUkpamuIZE0b3bhmJyZ7D90uS6f+CGxRRjOw==", - "resolved": "https://registry.npmjs.org/cross-spawn-windows-exe/-/cross-spawn-windows-exe-1.2.0.tgz", - "integrity": "sha512-mkLtJJcYbDCxEG7Js6eUnUNndWjyUZwJ3H7bErmmtOYU/Zb99DyUkpamuIZE0b3bhmJyZ7D90uS6f+CGxRRjOw==", - "dev": true, - "funding": [ - { - "type": "individual", - "url": "https://github.com/sponsors/malept" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/subscription/pkg/npm-cross-spawn-windows-exe?utm_medium=referral&utm_source=npm_fund" - } - ], - "dependencies": { - "@malept/cross-spawn-promise": "^1.1.0", - "is-wsl": "^2.2.0", - "which": "^2.0.2" - }, - "engines": { - "node": ">= 10" - } - }, - "node_modules/cross-spawn-windows-exe/node_modules/@malept/cross-spawn-promise": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/@malept/cross-spawn-promise/-/cross-spawn-promise-1.1.1.tgz", - "integrity": "sha512-RTBGWL5FWQcg9orDOCcp4LvItNzUPcyEU9bwaeJX0rJ1IQxzucC48Y0/sQLp/g6t99IQgAlGIaesJS+gTn7tVQ==", - "dev": true, - "funding": [ - { - "type": "individual", - "url": "https://github.com/sponsors/malept" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/subscription/pkg/npm-.malept-cross-spawn-promise?utm_medium=referral&utm_source=npm_fund" - } - ], - "dependencies": { - "cross-spawn": "^7.0.1" - }, - "engines": { - "node": ">= 10" - } - }, "node_modules/cross-zip": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/cross-zip/-/cross-zip-4.0.1.tgz", @@ -2515,9 +2454,6 @@ "resolved": "https://registry.npmjs.org/cryptiles/-/cryptiles-2.0.5.tgz", "integrity": "sha512-FFN5KwpvvQTTS5hWPxrU8/QE4kQUc6uwZcrnlMBN82t1MgAtq8mnoDwINBly9Tdr02seeIIhtdF+UH1feBYGog==", "deprecated": "This version has been deprecated in accordance with the hapi support policy (hapi.im/support). Please upgrade to the latest version to get the best features, bug fixes, and security patches. If you are unable to upgrade at this time, paid support is available for older versions (hapi.im/commercial).", - "resolved": "https://registry.npmjs.org/cryptiles/-/cryptiles-2.0.5.tgz", - "integrity": "sha512-FFN5KwpvvQTTS5hWPxrU8/QE4kQUc6uwZcrnlMBN82t1MgAtq8mnoDwINBly9Tdr02seeIIhtdF+UH1feBYGog==", - "deprecated": "This version has been deprecated in accordance with the hapi support policy (hapi.im/support). Please upgrade to the latest version to get the best features, bug fixes, and security patches. If you are unable to upgrade at this time, paid support is available for older versions (hapi.im/commercial).", "dependencies": { "boom": "2.x.x" }, @@ -2529,8 +2465,6 @@ "version": "1.14.1", "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz", "integrity": "sha512-jRFi8UDGo6j+odZiEpjazZaWqEal3w/basFjQHQEwVtZJGDpxbH1MeYluwCS8Xq5wmLJooDlMgvVarmWfGM44g==", - "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz", - "integrity": "sha512-jRFi8UDGo6j+odZiEpjazZaWqEal3w/basFjQHQEwVtZJGDpxbH1MeYluwCS8Xq5wmLJooDlMgvVarmWfGM44g==", "dependencies": { "assert-plus": "^1.0.0" }, @@ -2614,8 +2548,6 @@ "version": "0.3.0", "resolved": "https://registry.npmjs.org/decompress-zip/-/decompress-zip-0.3.0.tgz", "integrity": "sha512-xzje4HUZr/jdpqnggH6QPOXJEkq6Vx7J0ULgJa5WCtoF5s7rDf1BjAebTLDkLAKFwYiU4bCJptTuQxeNb3SAzg==", - "resolved": "https://registry.npmjs.org/decompress-zip/-/decompress-zip-0.3.0.tgz", - "integrity": "sha512-xzje4HUZr/jdpqnggH6QPOXJEkq6Vx7J0ULgJa5WCtoF5s7rDf1BjAebTLDkLAKFwYiU4bCJptTuQxeNb3SAzg==", "dependencies": { "binary": "^0.3.0", "graceful-fs": "^4.1.3", @@ -2652,8 +2584,6 @@ "version": "1.1.14", "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.1.14.tgz", "integrity": "sha512-+MeVjFf4L44XUkhM1eYbD8fyEsxcV81pqMSR5gblfcLCHfZvbrqy4/qYHE+/R5HoBUT11WV5O08Cr1n3YXkWVQ==", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.1.14.tgz", - "integrity": "sha512-+MeVjFf4L44XUkhM1eYbD8fyEsxcV81pqMSR5gblfcLCHfZvbrqy4/qYHE+/R5HoBUT11WV5O08Cr1n3YXkWVQ==", "dependencies": { "core-util-is": "~1.0.0", "inherits": "~2.0.1", @@ -2665,8 +2595,6 @@ "version": "0.10.31", "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", "integrity": "sha512-ev2QzSzWPYmy9GuqfIVildA4OdcGLeFZQrq5ys6RtiuF+RQQiZWr8TZNyAcuVXyQRYfEO+MsoB/1BuQVhOJuoQ==" - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", - "integrity": "sha512-ev2QzSzWPYmy9GuqfIVildA4OdcGLeFZQrq5ys6RtiuF+RQQiZWr8TZNyAcuVXyQRYfEO+MsoB/1BuQVhOJuoQ==" }, "node_modules/defaults": { "version": "1.0.4", @@ -2786,6 +2714,12 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/eastasianwidth": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz", + "integrity": "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==", + "dev": true + }, "node_modules/ecc-jsbn": { "version": "0.1.2", "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz", @@ -2951,6 +2885,16 @@ "node": ">= 10" } }, + "node_modules/electron-installer-debian/node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "dev": true, + "optional": true, + "engines": { + "node": ">=8" + } + }, "node_modules/electron-installer-debian/node_modules/cliui": { "version": "7.0.4", "resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz", @@ -2963,6 +2907,13 @@ "wrap-ansi": "^7.0.0" } }, + "node_modules/electron-installer-debian/node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "dev": true, + "optional": true + }, "node_modules/electron-installer-debian/node_modules/fs-extra": { "version": "9.1.0", "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-9.1.0.tgz", @@ -2979,6 +2930,16 @@ "node": ">=10" } }, + "node_modules/electron-installer-debian/node_modules/is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "dev": true, + "optional": true, + "engines": { + "node": ">=8" + } + }, "node_modules/electron-installer-debian/node_modules/jsonfile": { "version": "6.1.0", "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", @@ -2992,6 +2953,52 @@ "graceful-fs": "^4.1.6" } }, + "node_modules/electron-installer-debian/node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dev": true, + "optional": true, + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/electron-installer-debian/node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, + "optional": true, + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/electron-installer-debian/node_modules/wrap-ansi": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "dev": true, + "optional": true, + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, "node_modules/electron-installer-debian/node_modules/yargs": { "version": "16.2.0", "resolved": "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz", @@ -3070,6 +3077,16 @@ "node": ">= 10" } }, + "node_modules/electron-installer-redhat/node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "dev": true, + "optional": true, + "engines": { + "node": ">=8" + } + }, "node_modules/electron-installer-redhat/node_modules/cliui": { "version": "7.0.4", "resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz", @@ -3082,6 +3099,13 @@ "wrap-ansi": "^7.0.0" } }, + "node_modules/electron-installer-redhat/node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "dev": true, + "optional": true + }, "node_modules/electron-installer-redhat/node_modules/fs-extra": { "version": "9.1.0", "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-9.1.0.tgz", @@ -3098,6 +3122,16 @@ "node": ">=10" } }, + "node_modules/electron-installer-redhat/node_modules/is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "dev": true, + "optional": true, + "engines": { + "node": ">=8" + } + }, "node_modules/electron-installer-redhat/node_modules/jsonfile": { "version": "6.1.0", "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", @@ -3111,6 +3145,52 @@ "graceful-fs": "^4.1.6" } }, + "node_modules/electron-installer-redhat/node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dev": true, + "optional": true, + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/electron-installer-redhat/node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, + "optional": true, + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/electron-installer-redhat/node_modules/wrap-ansi": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "dev": true, + "optional": true, + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, "node_modules/electron-installer-redhat/node_modules/yargs": { "version": "16.2.0", "resolved": "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz", @@ -3308,16 +3388,15 @@ } }, "node_modules/emoji-regex": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" + "version": "9.2.2", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz", + "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==", + "dev": true }, "node_modules/encodeurl": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", "integrity": "sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==", - "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", - "integrity": "sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==", "engines": { "node": ">= 0.8" } @@ -3336,8 +3415,6 @@ "version": "1.4.4", "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz", "integrity": "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==", - "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz", - "integrity": "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==", "dependencies": { "once": "^1.4.0" } @@ -3346,8 +3423,6 @@ "version": "3.1.5", "resolved": "https://registry.npmjs.org/engine.io/-/engine.io-3.1.5.tgz", "integrity": "sha512-D06ivJkYxyRrcEe0bTpNnBQNgP9d3xog+qZlLbui8EsMr/DouQpf5o9FzJnWYHEYE0YsFHllUv2R1dkgYZXHcA==", - "resolved": "https://registry.npmjs.org/engine.io/-/engine.io-3.1.5.tgz", - "integrity": "sha512-D06ivJkYxyRrcEe0bTpNnBQNgP9d3xog+qZlLbui8EsMr/DouQpf5o9FzJnWYHEYE0YsFHllUv2R1dkgYZXHcA==", "dependencies": { "accepts": "~1.3.4", "base64id": "1.0.0", @@ -3364,8 +3439,6 @@ "version": "3.1.6", "resolved": "https://registry.npmjs.org/engine.io-client/-/engine.io-client-3.1.6.tgz", "integrity": "sha512-hnuHsFluXnsKOndS4Hv6SvUrgdYx1pk2NqfaDMW+GWdgfU3+/V25Cj7I8a0x92idSpa5PIhJRKxPvp9mnoLsfg==", - "resolved": "https://registry.npmjs.org/engine.io-client/-/engine.io-client-3.1.6.tgz", - "integrity": "sha512-hnuHsFluXnsKOndS4Hv6SvUrgdYx1pk2NqfaDMW+GWdgfU3+/V25Cj7I8a0x92idSpa5PIhJRKxPvp9mnoLsfg==", "dependencies": { "component-emitter": "1.2.1", "component-inherit": "0.0.3", @@ -3384,8 +3457,6 @@ "version": "3.1.0", "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", - "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", "dependencies": { "ms": "2.0.0" } @@ -3399,8 +3470,6 @@ "version": "2.1.3", "resolved": "https://registry.npmjs.org/engine.io-parser/-/engine.io-parser-2.1.3.tgz", "integrity": "sha512-6HXPre2O4Houl7c4g7Ic/XzPnHBvaEmN90vtRO9uLmwtRqQmTOw0QMevL1TOfL2Cpu1VzsaTmMotQgMdkzGkVA==", - "resolved": "https://registry.npmjs.org/engine.io-parser/-/engine.io-parser-2.1.3.tgz", - "integrity": "sha512-6HXPre2O4Houl7c4g7Ic/XzPnHBvaEmN90vtRO9uLmwtRqQmTOw0QMevL1TOfL2Cpu1VzsaTmMotQgMdkzGkVA==", "dependencies": { "after": "0.8.2", "arraybuffer.slice": "~0.0.7", @@ -3413,8 +3482,6 @@ "version": "3.1.0", "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", - "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", "dependencies": { "ms": "2.0.0" } @@ -3473,9 +3540,6 @@ "optional": true }, "node_modules/escalade": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.2.tgz", - "integrity": "sha512-ErCHMCae19vR8vQGe50xIsVomy19rg6gFu3+r3jkEO46suLMWBksvVyoGgQV+jOfl84ZSOSlmv6Gxa89PmTGmA==", "version": "3.1.2", "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.2.tgz", "integrity": "sha512-ErCHMCae19vR8vQGe50xIsVomy19rg6gFu3+r3jkEO46suLMWBksvVyoGgQV+jOfl84ZSOSlmv6Gxa89PmTGmA==", @@ -3488,8 +3552,6 @@ "version": "1.0.3", "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==" - "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", - "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==" }, "node_modules/escape-string-regexp": { "version": "4.0.0", @@ -3507,19 +3569,21 @@ "version": "0.5.2", "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-0.5.2.tgz", "integrity": "sha512-XpCnW/AE10ws/kDAs37cngSkvgIR8aN3G0MS85m7dUpuK2EREo9VJ00uvw6Dg/hXEpfsE1I1TvJOJr+Z+TL+ig==" - "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-0.5.2.tgz", - "integrity": "sha512-XpCnW/AE10ws/kDAs37cngSkvgIR8aN3G0MS85m7dUpuK2EREo9VJ00uvw6Dg/hXEpfsE1I1TvJOJr+Z+TL+ig==" }, "node_modules/etag": { "version": "1.8.1", "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", "integrity": "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==", - "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", - "integrity": "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==", "engines": { "node": ">= 0.6" } }, + "node_modules/eventemitter3": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-5.0.1.tgz", + "integrity": "sha512-GWkBvjiSZK87ELrYOSESUYeVIc9mvLLf/nXalMOS5dYrgZq9o5OVkbZAVM06CVxYsCwH9BDZFPlQTlPA1j4ahA==", + "dev": true + }, "node_modules/execa": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/execa/-/execa-1.0.0.tgz", @@ -3701,8 +3765,6 @@ "version": "1.1.0", "resolved": "https://registry.npmjs.org/fd-slicer/-/fd-slicer-1.1.0.tgz", "integrity": "sha512-cE1qsB/VwyQozZ+q1dGxR8LBYNZeofhEdUNGSMbQD3Gw2lAzX9Zb3uIU6Ebc/Fmyjo9AWWfnn0AUCHqtevs/8g==", - "resolved": "https://registry.npmjs.org/fd-slicer/-/fd-slicer-1.1.0.tgz", - "integrity": "sha512-cE1qsB/VwyQozZ+q1dGxR8LBYNZeofhEdUNGSMbQD3Gw2lAzX9Zb3uIU6Ebc/Fmyjo9AWWfnn0AUCHqtevs/8g==", "dependencies": { "pend": "~1.2.0" } @@ -3778,15 +3840,11 @@ "version": "3.0.0", "resolved": "https://registry.npmjs.org/foreachasync/-/foreachasync-3.0.0.tgz", "integrity": "sha512-J+ler7Ta54FwwNcx6wQRDhTIbNeyDcARMkOcguEqnEdtm0jKvN3Li3PDAb2Du3ubJYEWfYL83XMROXdsXAXycw==" - "resolved": "https://registry.npmjs.org/foreachasync/-/foreachasync-3.0.0.tgz", - "integrity": "sha512-J+ler7Ta54FwwNcx6wQRDhTIbNeyDcARMkOcguEqnEdtm0jKvN3Li3PDAb2Du3ubJYEWfYL83XMROXdsXAXycw==" }, "node_modules/forever-agent": { "version": "0.6.1", "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz", "integrity": "sha512-j0KLYPhm6zeac4lz3oJ3o65qvgQCcPubiyotZrXqEaG4hNagNYO8qdlUrX5vwqv9ohqeT/Z3j6+yW067yWWdUw==", - "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz", - "integrity": "sha512-j0KLYPhm6zeac4lz3oJ3o65qvgQCcPubiyotZrXqEaG4hNagNYO8qdlUrX5vwqv9ohqeT/Z3j6+yW067yWWdUw==", "engines": { "node": "*" } @@ -3808,8 +3866,6 @@ "version": "0.5.2", "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", "integrity": "sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==", - "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", - "integrity": "sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==", "engines": { "node": ">= 0.6" } @@ -3866,8 +3922,6 @@ "version": "1.1.2", "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", - "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", - "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", "funding": { "url": "https://github.com/sponsors/ljharb" } @@ -3913,12 +3967,60 @@ "node": "^12.13.0 || ^14.15.0 || >=16.0.0" } }, + "node_modules/gauge/node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/gauge/node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "dev": true + }, + "node_modules/gauge/node_modules/is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/gauge/node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dev": true, + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/gauge/node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/gaze": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/gaze/-/gaze-1.1.2.tgz", "integrity": "sha512-38Jtqi8EsWt2l0x6iiL1NWN3/llOwWEv0NC3HGb/gPHLJkLq0N2c/TtuLrSfRXHwV6VkYmxAJj9YBdF33Et5hg==", - "resolved": "https://registry.npmjs.org/gaze/-/gaze-1.1.2.tgz", - "integrity": "sha512-38Jtqi8EsWt2l0x6iiL1NWN3/llOwWEv0NC3HGb/gPHLJkLq0N2c/TtuLrSfRXHwV6VkYmxAJj9YBdF33Et5hg==", "dependencies": { "globule": "^1.0.0" }, @@ -3939,8 +4041,6 @@ "version": "1.2.0", "resolved": "https://registry.npmjs.org/get-down/-/get-down-1.2.0.tgz", "integrity": "sha512-SbpdXn+fNmGN6pp/vBALveh3oCbWYTR3wb5qifauPSFhAfAVQ7TMOnAkVzQm4YZD2KABzJB3sA2kmMLaOylA2A==", - "resolved": "https://registry.npmjs.org/get-down/-/get-down-1.2.0.tgz", - "integrity": "sha512-SbpdXn+fNmGN6pp/vBALveh3oCbWYTR3wb5qifauPSFhAfAVQ7TMOnAkVzQm4YZD2KABzJB3sA2kmMLaOylA2A==", "dependencies": { "decompress-zip": "0.3.0", "graceful-fs": "4.1.11", @@ -3958,8 +4058,6 @@ "version": "4.1.11", "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.11.tgz", "integrity": "sha512-9x6DLUuW+ROFdMTII9ec9t/FK8va6kYcC8/LggumssLM8kNv7IdFl3VrNUqgir2tJuBVxBga1QBoRziZacO5Zg==", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.11.tgz", - "integrity": "sha512-9x6DLUuW+ROFdMTII9ec9t/FK8va6kYcC8/LggumssLM8kNv7IdFl3VrNUqgir2tJuBVxBga1QBoRziZacO5Zg==", "engines": { "node": ">=0.4.0" } @@ -3976,8 +4074,6 @@ "version": "2.9.0", "resolved": "https://registry.npmjs.org/minipass/-/minipass-2.9.0.tgz", "integrity": "sha512-wxfUjg9WebH+CUDX/CdbRlh5SmfZiy/hpkxaRI16Y9W56Pa75sWgd/rvFilSgrauD9NyFymP/+JFV3KwzIsJeg==", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-2.9.0.tgz", - "integrity": "sha512-wxfUjg9WebH+CUDX/CdbRlh5SmfZiy/hpkxaRI16Y9W56Pa75sWgd/rvFilSgrauD9NyFymP/+JFV3KwzIsJeg==", "dependencies": { "safe-buffer": "^5.1.2", "yallist": "^3.0.0" @@ -3987,8 +4083,6 @@ "version": "1.3.3", "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-1.3.3.tgz", "integrity": "sha512-6ZYMOEnmVsdCeTJVE0W9ZD+pVnE8h9Hma/iOwwRDsdQoePpoX56/8B6z3P9VNwppJuBKNRuFDRNRqRWexT9G9Q==", - "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-1.3.3.tgz", - "integrity": "sha512-6ZYMOEnmVsdCeTJVE0W9ZD+pVnE8h9Hma/iOwwRDsdQoePpoX56/8B6z3P9VNwppJuBKNRuFDRNRqRWexT9G9Q==", "dependencies": { "minipass": "^2.9.0" } @@ -3998,9 +4092,6 @@ "resolved": "https://registry.npmjs.org/tar/-/tar-3.1.5.tgz", "integrity": "sha512-TKJKz1fqBOZBaIQ/MGRKU0EnTGmKMLy4ReTRgP10AgtfOWBbj9PBg4MgY80GFpqGbs2EzcIctW5gbwbP4woDYg==", "deprecated": "This version of tar is no longer supported, and will not receive security updates. Please upgrade asap.", - "resolved": "https://registry.npmjs.org/tar/-/tar-3.1.5.tgz", - "integrity": "sha512-TKJKz1fqBOZBaIQ/MGRKU0EnTGmKMLy4ReTRgP10AgtfOWBbj9PBg4MgY80GFpqGbs2EzcIctW5gbwbP4woDYg==", - "deprecated": "This version of tar is no longer supported, and will not receive security updates. Please upgrade asap.", "dependencies": { "minipass": "^2.0.2", "minizlib": "^1.0.3", @@ -4040,14 +4131,10 @@ } }, "node_modules/get-intrinsic": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.4.tgz", - "integrity": "sha512-5uYhsJH8VJBTv7oslg4BznJYhDoRI6waYCxMmCdnTrcCrHA/fCFKoTFz2JKKE0HdDFUF7/oQuhzumXJK7paBRQ==", "version": "1.2.4", "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.4.tgz", "integrity": "sha512-5uYhsJH8VJBTv7oslg4BznJYhDoRI6waYCxMmCdnTrcCrHA/fCFKoTFz2JKKE0HdDFUF7/oQuhzumXJK7paBRQ==", "dependencies": { - "es-errors": "^1.3.0", "es-errors": "^1.3.0", "function-bind": "^1.1.2", "has-proto": "^1.0.1", @@ -4057,9 +4144,6 @@ "engines": { "node": ">= 0.4" }, - "engines": { - "node": ">= 0.4" - }, "funding": { "url": "https://github.com/sponsors/ljharb" } @@ -4112,8 +4196,6 @@ "version": "0.1.7", "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz", "integrity": "sha512-0fzj9JxOLfJ+XGLhR8ze3unN0KZCgZwiSSDz168VERjK8Wl8kVSdcu2kspd4s4wtAa1y/qrVRiAA0WclVsu0ng==", - "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz", - "integrity": "sha512-0fzj9JxOLfJ+XGLhR8ze3unN0KZCgZwiSSDz168VERjK8Wl8kVSdcu2kspd4s4wtAa1y/qrVRiAA0WclVsu0ng==", "dependencies": { "assert-plus": "^1.0.0" } @@ -4130,8 +4212,6 @@ "version": "7.2.3", "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", - "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", "dependencies": { "fs.realpath": "^1.0.0", "inflight": "^1.0.4", @@ -4237,8 +4317,6 @@ "version": "1.3.4", "resolved": "https://registry.npmjs.org/globule/-/globule-1.3.4.tgz", "integrity": "sha512-OPTIfhMBh7JbBYDpa5b+Q5ptmMWKwcNcFSR/0c6t8V4f3ZAVBEsKNY37QdVqmLRYSMhOUGYrY0QhSoEpzGr/Eg==", - "resolved": "https://registry.npmjs.org/globule/-/globule-1.3.4.tgz", - "integrity": "sha512-OPTIfhMBh7JbBYDpa5b+Q5ptmMWKwcNcFSR/0c6t8V4f3ZAVBEsKNY37QdVqmLRYSMhOUGYrY0QhSoEpzGr/Eg==", "dependencies": { "glob": "~7.1.1", "lodash": "^4.17.21", @@ -4252,8 +4330,6 @@ "version": "7.1.7", "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.7.tgz", "integrity": "sha512-OvD9ENzPLbegENnYP5UUfJIirTg4+XwMWGaQfQTY0JenxNvvIKP3U3/tAQSPIu/lHxXYSZmpXlUHeqAIdKzBLQ==", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.7.tgz", - "integrity": "sha512-OvD9ENzPLbegENnYP5UUfJIirTg4+XwMWGaQfQTY0JenxNvvIKP3U3/tAQSPIu/lHxXYSZmpXlUHeqAIdKzBLQ==", "dependencies": { "fs.realpath": "^1.0.0", "inflight": "^1.0.4", @@ -4273,8 +4349,6 @@ "version": "3.0.8", "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.8.tgz", "integrity": "sha512-6FsRAQsxQ61mw+qP1ZzbL9Bc78x2p5OqNgNpnoAFLTrX8n5Kxph0CsnhmKKNXTWjXqU5L0pGPR7hYk+XWZr60Q==", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.8.tgz", - "integrity": "sha512-6FsRAQsxQ61mw+qP1ZzbL9Bc78x2p5OqNgNpnoAFLTrX8n5Kxph0CsnhmKKNXTWjXqU5L0pGPR7hYk+XWZr60Q==", "dependencies": { "brace-expansion": "^1.1.7" }, @@ -4286,8 +4360,6 @@ "version": "1.0.1", "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.0.1.tgz", "integrity": "sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==", - "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.0.1.tgz", - "integrity": "sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==", "dependencies": { "get-intrinsic": "^1.1.3" }, @@ -4328,8 +4400,6 @@ "version": "4.0.11", "resolved": "https://registry.npmjs.org/handlebars/-/handlebars-4.0.11.tgz", "integrity": "sha512-yrsPfXULrvTP3Aw+zLpett0LUyv2PS/k1jj2UCpYkFElPhMEhspxrCAl4hKGt+vyDjvpxleyYUPF4AMSjCdnhQ==", - "resolved": "https://registry.npmjs.org/handlebars/-/handlebars-4.0.11.tgz", - "integrity": "sha512-yrsPfXULrvTP3Aw+zLpett0LUyv2PS/k1jj2UCpYkFElPhMEhspxrCAl4hKGt+vyDjvpxleyYUPF4AMSjCdnhQ==", "dependencies": { "async": "^1.4.0", "optimist": "^0.6.1", @@ -4384,8 +4454,6 @@ "version": "1.0.3", "resolved": "https://registry.npmjs.org/has-binary2/-/has-binary2-1.0.3.tgz", "integrity": "sha512-G1LWKhDSvhGeAQ8mPVQlqNcOB2sJdwATtZKl2pDKKHfpf/rYj24lkinxf69blJbnsvtqqNU+L3SL50vzZhXOnw==", - "resolved": "https://registry.npmjs.org/has-binary2/-/has-binary2-1.0.3.tgz", - "integrity": "sha512-G1LWKhDSvhGeAQ8mPVQlqNcOB2sJdwATtZKl2pDKKHfpf/rYj24lkinxf69blJbnsvtqqNU+L3SL50vzZhXOnw==", "dependencies": { "isarray": "2.0.1" } @@ -4394,8 +4462,6 @@ "version": "0.1.7", "resolved": "https://registry.npmjs.org/has-color/-/has-color-0.1.7.tgz", "integrity": "sha512-kaNz5OTAYYmt646Hkqw50/qyxP2vFnTVu5AQ1Zmk22Kk5+4Qx6BpO8+u7IKsML5fOsFk0ZT0AcCJNYwcvaLBvw==", - "resolved": "https://registry.npmjs.org/has-color/-/has-color-0.1.7.tgz", - "integrity": "sha512-kaNz5OTAYYmt646Hkqw50/qyxP2vFnTVu5AQ1Zmk22Kk5+4Qx6BpO8+u7IKsML5fOsFk0ZT0AcCJNYwcvaLBvw==", "engines": { "node": ">=0.10.0" } @@ -4404,8 +4470,6 @@ "version": "1.1.0", "resolved": "https://registry.npmjs.org/has-cors/-/has-cors-1.1.0.tgz", "integrity": "sha512-g5VNKdkFuUuVCP9gYfDJHjK2nqdQJ7aDLTnycnc2+RvsOQbuLdF5pm7vuE5J76SEBIQjs4kQY/BWq74JUmjbXA==" - "resolved": "https://registry.npmjs.org/has-cors/-/has-cors-1.1.0.tgz", - "integrity": "sha512-g5VNKdkFuUuVCP9gYfDJHjK2nqdQJ7aDLTnycnc2+RvsOQbuLdF5pm7vuE5J76SEBIQjs4kQY/BWq74JUmjbXA==" }, "node_modules/has-flag": { "version": "4.0.0", @@ -4442,8 +4506,6 @@ "version": "1.0.3", "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==", - "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", - "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==", "engines": { "node": ">= 0.4" }, @@ -4472,9 +4534,6 @@ "resolved": "https://registry.npmjs.org/hawk/-/hawk-3.1.3.tgz", "integrity": "sha512-X8xbmTc1cbPXcQV4WkLcRMALuyoxhfpFATmyuCxJPOAvrDS4DNnsTAOmKUxMTOWU6TzrTOkxPKwIx5ZOpJVSrg==", "deprecated": "This module moved to @hapi/hawk. Please make sure to switch over as this distribution is no longer supported and may contain bugs and critical security issues.", - "resolved": "https://registry.npmjs.org/hawk/-/hawk-3.1.3.tgz", - "integrity": "sha512-X8xbmTc1cbPXcQV4WkLcRMALuyoxhfpFATmyuCxJPOAvrDS4DNnsTAOmKUxMTOWU6TzrTOkxPKwIx5ZOpJVSrg==", - "deprecated": "This module moved to @hapi/hawk. Please make sure to switch over as this distribution is no longer supported and may contain bugs and critical security issues.", "dependencies": { "boom": "2.x.x", "cryptiles": "2.x.x", @@ -4490,9 +4549,6 @@ "resolved": "https://registry.npmjs.org/hoek/-/hoek-2.16.3.tgz", "integrity": "sha512-V6Yw1rIcYV/4JsnggjBU0l4Kr+EXhpwqXRusENU1Xx6ro00IHPHYNynCuBTOZAPlr3AAmLvchH9I7N/VUdvOwQ==", "deprecated": "This version has been deprecated in accordance with the hapi support policy (hapi.im/support). Please upgrade to the latest version to get the best features, bug fixes, and security patches. If you are unable to upgrade at this time, paid support is available for older versions (hapi.im/commercial).", - "resolved": "https://registry.npmjs.org/hoek/-/hoek-2.16.3.tgz", - "integrity": "sha512-V6Yw1rIcYV/4JsnggjBU0l4Kr+EXhpwqXRusENU1Xx6ro00IHPHYNynCuBTOZAPlr3AAmLvchH9I7N/VUdvOwQ==", - "deprecated": "This version has been deprecated in accordance with the hapi support policy (hapi.im/support). Please upgrade to the latest version to get the best features, bug fixes, and security patches. If you are unable to upgrade at this time, paid support is available for older versions (hapi.im/commercial).", "engines": { "node": ">=0.10.40" } @@ -4524,8 +4580,6 @@ "version": "1.6.3", "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.6.3.tgz", "integrity": "sha512-lks+lVC8dgGyh97jxvxeYTWQFvh4uw4yC12gVl63Cg30sjPX4wuGcdkICVXDAESr6OJGjqGA8Iz5mkeN6zlD7A==", - "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.6.3.tgz", - "integrity": "sha512-lks+lVC8dgGyh97jxvxeYTWQFvh4uw4yC12gVl63Cg30sjPX4wuGcdkICVXDAESr6OJGjqGA8Iz5mkeN6zlD7A==", "dependencies": { "depd": "~1.1.2", "inherits": "2.0.3", @@ -4540,15 +4594,11 @@ "version": "2.0.3", "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", "integrity": "sha512-x00IRNXNy63jwGkJmzPigoySHbaqpNuzKbBOmzK+g2OdZpQ9w+sxCN+VSB3ja7IAge2OP2qpfxTjeNcyjmW1uw==" - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", - "integrity": "sha512-x00IRNXNy63jwGkJmzPigoySHbaqpNuzKbBOmzK+g2OdZpQ9w+sxCN+VSB3ja7IAge2OP2qpfxTjeNcyjmW1uw==" }, "node_modules/http-errors/node_modules/statuses": { "version": "1.5.0", "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz", "integrity": "sha512-OpZ3zP+jT1PI7I8nemJX4AKmAX070ZkYPVWV/AaKTJl+tXCTGyVdC1a4SL8RUQYEwk/f34ZX8UTykN68FwrqAA==", - "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz", - "integrity": "sha512-OpZ3zP+jT1PI7I8nemJX4AKmAX070ZkYPVWV/AaKTJl+tXCTGyVdC1a4SL8RUQYEwk/f34ZX8UTykN68FwrqAA==", "engines": { "node": ">= 0.6" } @@ -4616,9 +4666,9 @@ } }, "node_modules/i18next": { - "version": "23.10.1", - "resolved": "https://registry.npmjs.org/i18next/-/i18next-23.10.1.tgz", - "integrity": "sha512-NDiIzFbcs3O9PXpfhkjyf7WdqFn5Vq6mhzhtkXzj51aOcNuPNcTwuYNuXCpHsanZGHlHKL35G7huoFeVic1hng==", + "version": "23.11.2", + "resolved": "https://registry.npmjs.org/i18next/-/i18next-23.11.2.tgz", + "integrity": "sha512-qMBm7+qT8jdpmmDw/kQD16VpmkL9BdL+XNAK5MNbNFaf1iQQq35ZbPrSlqmnNPOSUY4m342+c0t0evinF5l7sA==", "funding": [ { "type": "individual", @@ -4663,8 +4713,6 @@ "version": "1.2.1", "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==", - "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", - "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==", "funding": [ { "type": "github", @@ -4679,7 +4727,6 @@ "url": "https://feross.org/support" } ] - ] }, "node_modules/imurmurhash": { "version": "0.1.4", @@ -4714,19 +4761,14 @@ "version": "1.12.0", "resolved": "https://registry.npmjs.org/inflection/-/inflection-1.12.0.tgz", "integrity": "sha512-lRy4DxuIFWXlJU7ed8UiTJOSTqStqYdEb4CEbtXfNbkdj3nH1L+reUWiE10VWcJS2yR7tge8Z74pJjtBjNwj0w==", - "resolved": "https://registry.npmjs.org/inflection/-/inflection-1.12.0.tgz", - "integrity": "sha512-lRy4DxuIFWXlJU7ed8UiTJOSTqStqYdEb4CEbtXfNbkdj3nH1L+reUWiE10VWcJS2yR7tge8Z74pJjtBjNwj0w==", "engines": [ "node >= 0.4.0" ] - ] }, "node_modules/inflight": { "version": "1.0.6", "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", - "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", - "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", "dependencies": { "once": "^1.3.0", "wrappy": "1" @@ -4736,8 +4778,6 @@ "version": "2.0.4", "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", - "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" }, "node_modules/ini": { "version": "1.3.8", @@ -4783,8 +4823,6 @@ "version": "2.13.1", "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.13.1.tgz", "integrity": "sha512-hHrIjvZsftOsvKSn2TRYl63zvxsgE0K+0mYMoH6gD4omR5IWB2KynivBQczo3+wF1cCkjzvptnI9Q0sPU66ilw==", - "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.13.1.tgz", - "integrity": "sha512-hHrIjvZsftOsvKSn2TRYl63zvxsgE0K+0mYMoH6gD4omR5IWB2KynivBQczo3+wF1cCkjzvptnI9Q0sPU66ilw==", "dependencies": { "hasown": "^2.0.0" }, @@ -4792,23 +4830,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/is-docker": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-2.2.1.tgz", - "integrity": "sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==", - "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-2.2.1.tgz", - "integrity": "sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==", - "dev": true, - "bin": { - "is-docker": "cli.js" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/is-extglob": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", @@ -4819,13 +4840,15 @@ } }, "node_modules/is-fullwidth-code-point": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", - "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", - "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-4.0.0.tgz", + "integrity": "sha512-O4L094N2/dZ7xqVdrXhh9r1KODPJpFms8B5sGdJLPy664AgvXsreZUyCQQNItZRDlYug4xStLjNp/sz3HvBowQ==", + "dev": true, "engines": { - "node": ">=8" + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/is-glob": { @@ -4890,8 +4913,6 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", "integrity": "sha512-cyA56iCMHAh5CdzjJIa4aohJyeO1YbwLi3Jc35MmRU6poroFjIGZzUzupGiRPOjgHg9TLu43xbpwXk523fMxKA==" - "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", - "integrity": "sha512-cyA56iCMHAh5CdzjJIa4aohJyeO1YbwLi3Jc35MmRU6poroFjIGZzUzupGiRPOjgHg9TLu43xbpwXk523fMxKA==" }, "node_modules/is-unicode-supported": { "version": "0.1.0", @@ -4914,20 +4935,6 @@ "node": ">=0.10.0" } }, - "node_modules/is-wsl": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-2.2.0.tgz", - "integrity": "sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==", - "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-2.2.0.tgz", - "integrity": "sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==", - "dev": true, - "dependencies": { - "is-docker": "^2.0.0" - }, - "engines": { - "node": ">=8" - } - }, "node_modules/isarray": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.1.tgz", @@ -4975,8 +4982,6 @@ "version": "3.0.0", "resolved": "https://registry.npmjs.org/js2xmlparser/-/js2xmlparser-3.0.0.tgz", "integrity": "sha512-CSOkdn0/GhRFwxnipmhXfqJ+FG6+wkWBi46kKSsPx6+j65176ZiQcrCYpg6K8x3iLbO4k3zScBnZ7I/L80dAtw==", - "resolved": "https://registry.npmjs.org/js2xmlparser/-/js2xmlparser-3.0.0.tgz", - "integrity": "sha512-CSOkdn0/GhRFwxnipmhXfqJ+FG6+wkWBi46kKSsPx6+j65176ZiQcrCYpg6K8x3iLbO4k3zScBnZ7I/L80dAtw==", "dependencies": { "xmlcreate": "^1.0.1" } @@ -4991,8 +4996,6 @@ "version": "3.5.5", "resolved": "https://registry.npmjs.org/jsdoc/-/jsdoc-3.5.5.tgz", "integrity": "sha512-6PxB65TAU4WO0Wzyr/4/YhlGovXl0EVYfpKbpSroSj0qBxT4/xod/l40Opkm38dRHRdQgdeY836M0uVnJQG7kg==", - "resolved": "https://registry.npmjs.org/jsdoc/-/jsdoc-3.5.5.tgz", - "integrity": "sha512-6PxB65TAU4WO0Wzyr/4/YhlGovXl0EVYfpKbpSroSj0qBxT4/xod/l40Opkm38dRHRdQgdeY836M0uVnJQG7kg==", "dependencies": { "babylon": "7.0.0-beta.19", "bluebird": "~3.5.0", @@ -5047,8 +5050,6 @@ "version": "0.4.0", "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.4.0.tgz", "integrity": "sha512-es94M3nTIfsEPisRafak+HDLfHXnKBhV3vU5eqPcS3flIWqcxJWgXHXiey3YrpaNsanY5ei1VoYEbOzijuq9BA==" - "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.4.0.tgz", - "integrity": "sha512-es94M3nTIfsEPisRafak+HDLfHXnKBhV3vU5eqPcS3flIWqcxJWgXHXiey3YrpaNsanY5ei1VoYEbOzijuq9BA==" }, "node_modules/json-schema-traverse": { "version": "1.0.0", @@ -5061,9 +5062,6 @@ "integrity": "sha512-7DE8mpG+/fVw+dTpjbxnx47TaMnDfOI1jwft9g1VybltZCduyRQPJPvc+zzKY9WPHxhPWczyFuYa6I8Mw4iU5A==" }, "node_modules/json-stable-stringify": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/json-stable-stringify/-/json-stable-stringify-1.1.1.tgz", - "integrity": "sha512-SU/971Kt5qVQfJpyDveVhQ/vya+5hvrjClFOcr8c0Fq5aODJjMwutrOfCU+eCnVD5gpx1Q3fEqkyom77zH1iIg==", "version": "1.1.1", "resolved": "https://registry.npmjs.org/json-stable-stringify/-/json-stable-stringify-1.1.1.tgz", "integrity": "sha512-SU/971Kt5qVQfJpyDveVhQ/vya+5hvrjClFOcr8c0Fq5aODJjMwutrOfCU+eCnVD5gpx1Q3fEqkyom77zH1iIg==", @@ -5084,22 +5082,16 @@ "version": "2.0.5", "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz", "integrity": "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==" - "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz", - "integrity": "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==" }, "node_modules/json-stringify-safe": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", "integrity": "sha512-ZClg6AaYvamvYEE82d3Iyd3vSSIjQ+odgjaTzRuO3s7toCdFKczob2i0zCh7JE8kWn17yvAWhUVxvqGwUalsRA==" - "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", - "integrity": "sha512-ZClg6AaYvamvYEE82d3Iyd3vSSIjQ+odgjaTzRuO3s7toCdFKczob2i0zCh7JE8kWn17yvAWhUVxvqGwUalsRA==" }, "node_modules/jsonfile": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz", "integrity": "sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg==", - "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz", - "integrity": "sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg==", "optionalDependencies": { "graceful-fs": "^4.1.6" } @@ -5108,8 +5100,6 @@ "version": "0.0.1", "resolved": "https://registry.npmjs.org/jsonify/-/jsonify-0.0.1.tgz", "integrity": "sha512-2/Ki0GcmuqSrgFyelQq9M05y7PS0mEwuIzrf3f1fPqkVDVRvZrPZtVSMHxdgo8Aq0sxAOb/cr2aqqA3LeWHVPg==", - "resolved": "https://registry.npmjs.org/jsonify/-/jsonify-0.0.1.tgz", - "integrity": "sha512-2/Ki0GcmuqSrgFyelQq9M05y7PS0mEwuIzrf3f1fPqkVDVRvZrPZtVSMHxdgo8Aq0sxAOb/cr2aqqA3LeWHVPg==", "funding": { "url": "https://github.com/sponsors/ljharb" } @@ -5118,8 +5108,6 @@ "version": "1.4.2", "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.2.tgz", "integrity": "sha512-P2bSOMAc/ciLz6DzgjVlGJP9+BrJWu5UDGK70C2iweC5QBIeFf0ZXRvGjEj2uYgrY2MkAAhsSWHDWlFtEroZWw==", - "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.2.tgz", - "integrity": "sha512-P2bSOMAc/ciLz6DzgjVlGJP9+BrJWu5UDGK70C2iweC5QBIeFf0ZXRvGjEj2uYgrY2MkAAhsSWHDWlFtEroZWw==", "dependencies": { "assert-plus": "1.0.0", "extsprintf": "1.3.0", @@ -5171,8 +5159,6 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/klaw/-/klaw-2.0.0.tgz", "integrity": "sha512-Hx5PvgJKTWpMkNJCYrBUNBLlxYIkxN4FVU/BnZP4CFh5BpiHOgujAPx7iFVz/phD0bP8rsqD48gtqcvNlUt0lQ==", - "resolved": "https://registry.npmjs.org/klaw/-/klaw-2.0.0.tgz", - "integrity": "sha512-Hx5PvgJKTWpMkNJCYrBUNBLlxYIkxN4FVU/BnZP4CFh5BpiHOgujAPx7iFVz/phD0bP8rsqD48gtqcvNlUt0lQ==", "dependencies": { "graceful-fs": "^4.1.9" } @@ -5181,38 +5167,26 @@ "version": "1.0.4", "resolved": "https://registry.npmjs.org/lazy-cache/-/lazy-cache-1.0.4.tgz", "integrity": "sha512-RE2g0b5VGZsOCFOCgP7omTRYFqydmZkBwl5oNnQ1lDYC57uyO9KqNnNVxT7COSHTxrRCWVcAVOcbjk+tvh/rgQ==", - "resolved": "https://registry.npmjs.org/lazy-cache/-/lazy-cache-1.0.4.tgz", - "integrity": "sha512-RE2g0b5VGZsOCFOCgP7omTRYFqydmZkBwl5oNnQ1lDYC57uyO9KqNnNVxT7COSHTxrRCWVcAVOcbjk+tvh/rgQ==", "optional": true, "engines": { "node": ">=0.10.0" } }, "node_modules/listr2": { - "version": "5.0.8", - "resolved": "https://registry.npmjs.org/listr2/-/listr2-5.0.8.tgz", - "integrity": "sha512-mC73LitKHj9w6v30nLNGPetZIlfpUniNSsxxrbaPcWOjDb92SHPzJPi/t+v1YC/lxKz/AJ9egOjww0qUuFxBpA==", + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/listr2/-/listr2-7.0.2.tgz", + "integrity": "sha512-rJysbR9GKIalhTbVL2tYbF2hVyDnrf7pFUZBwjPaMIdadYHmeT+EVi/Bu3qd7ETQPahTotg2WRCatXwRBW554g==", "dev": true, "dependencies": { - "cli-truncate": "^2.1.0", - "colorette": "^2.0.19", - "log-update": "^4.0.0", - "p-map": "^4.0.0", + "cli-truncate": "^3.1.0", + "colorette": "^2.0.20", + "eventemitter3": "^5.0.1", + "log-update": "^5.0.1", "rfdc": "^1.3.0", - "rxjs": "^7.8.0", - "through": "^2.3.8", - "wrap-ansi": "^7.0.0" + "wrap-ansi": "^8.1.0" }, "engines": { - "node": "^14.13.1 || >=16.0.0" - }, - "peerDependencies": { - "enquirer": ">= 2.3.0 < 3" - }, - "peerDependenciesMeta": { - "enquirer": { - "optional": true - } + "node": ">=16.0.0" } }, "node_modules/load-json-file": { @@ -5301,60 +5275,28 @@ } }, "node_modules/log-update": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/log-update/-/log-update-4.0.0.tgz", - "integrity": "sha512-9fkkDevMefjg0mmzWFBW8YkFP91OrizzkW3diF7CpG+S2EYdy4+TVfGwz1zeF8x7hCx1ovSPTOE9Ngib74qqUg==", + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/log-update/-/log-update-5.0.1.tgz", + "integrity": "sha512-5UtUDQ/6edw4ofyljDNcOVJQ4c7OjDro4h3y8e1GQL5iYElYclVHJ3zeWchylvMaKnDbDilC8irOVyexnA/Slw==", "dev": true, "dependencies": { - "ansi-escapes": "^4.3.0", - "cli-cursor": "^3.1.0", - "slice-ansi": "^4.0.0", - "wrap-ansi": "^6.2.0" + "ansi-escapes": "^5.0.0", + "cli-cursor": "^4.0.0", + "slice-ansi": "^5.0.0", + "strip-ansi": "^7.0.1", + "wrap-ansi": "^8.0.1" }, "engines": { - "node": ">=10" + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/log-update/node_modules/slice-ansi": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-4.0.0.tgz", - "integrity": "sha512-qMCMfhY040cVHT43K9BFygqYbUPFZKHOg7K73mtTWJRb8pyP3fzf4Ixd5SzdEJQ6MRUg/WBnOLxghZtKKurENQ==", - "dev": true, - "dependencies": { - "ansi-styles": "^4.0.0", - "astral-regex": "^2.0.0", - "is-fullwidth-code-point": "^3.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/slice-ansi?sponsor=1" - } - }, - "node_modules/log-update/node_modules/wrap-ansi": { - "version": "6.2.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-6.2.0.tgz", - "integrity": "sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==", - "dev": true, - "dependencies": { - "ansi-styles": "^4.0.0", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0" - }, - "engines": { - "node": ">=8" - } - }, "node_modules/longest": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/longest/-/longest-1.0.1.tgz", "integrity": "sha512-k+yt5n3l48JU4k8ftnKG6V7u32wyH2NfKzeMto9F/QRE0amxy/LayxwlvjjkZEIzqR+19IrtFO8p5kB9QaYUFg==", - "resolved": "https://registry.npmjs.org/longest/-/longest-1.0.1.tgz", - "integrity": "sha512-k+yt5n3l48JU4k8ftnKG6V7u32wyH2NfKzeMto9F/QRE0amxy/LayxwlvjjkZEIzqR+19IrtFO8p5kB9QaYUFg==", "optional": true, "engines": { "node": ">=0.10.0" @@ -5381,8 +5323,6 @@ "version": "0.22.5", "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.22.5.tgz", "integrity": "sha512-oreip9rJZkzvA8Qzk9HFs8fZGF/u7H/gtrE8EN6RjKJ9kh2HlC+yQ2QezifqTZfGyiuAV0dRv5a+y/8gBb1m9w==", - "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.22.5.tgz", - "integrity": "sha512-oreip9rJZkzvA8Qzk9HFs8fZGF/u7H/gtrE8EN6RjKJ9kh2HlC+yQ2QezifqTZfGyiuAV0dRv5a+y/8gBb1m9w==", "dependencies": { "vlq": "^0.2.2" } @@ -5498,8 +5438,6 @@ "version": "1.4.1", "resolved": "https://registry.npmjs.org/mime/-/mime-1.4.1.tgz", "integrity": "sha512-KI1+qOZu5DcW6wayYHSzR/tXKCDC5Om4s1z2QJjDULzLcmf3DvzS7oluY4HCTrc+9FiKmWUgeNLg7W3uIQvxtQ==", - "resolved": "https://registry.npmjs.org/mime/-/mime-1.4.1.tgz", - "integrity": "sha512-KI1+qOZu5DcW6wayYHSzR/tXKCDC5Om4s1z2QJjDULzLcmf3DvzS7oluY4HCTrc+9FiKmWUgeNLg7W3uIQvxtQ==", "bin": { "mime": "cli.js" } @@ -5508,8 +5446,6 @@ "version": "1.52.0", "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", - "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", "engines": { "node": ">= 0.6" } @@ -5518,8 +5454,6 @@ "version": "2.1.35", "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", - "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", "dependencies": { "mime-db": "1.52.0" }, @@ -5547,8 +5481,6 @@ "version": "3.1.2", "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", "dependencies": { "brace-expansion": "^1.1.7" }, @@ -5560,8 +5492,6 @@ "version": "1.2.8", "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz", "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz", - "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==", "funding": { "url": "https://github.com/sponsors/ljharb" } @@ -5570,8 +5500,6 @@ "version": "3.3.6", "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", - "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", "dev": true, "dependencies": { "yallist": "^4.0.0" @@ -5662,8 +5590,6 @@ "version": "0.5.6", "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.6.tgz", "integrity": "sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.6.tgz", - "integrity": "sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==", "dependencies": { "minimist": "^1.2.6" }, @@ -5680,8 +5606,6 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/mout/-/mout-1.0.0.tgz", "integrity": "sha512-LyMgS0sDVdY+gLXAr51LOGFOulAMq8n08V6cBP1qmKYs1KjBa/xZFuOoSPECs/fteUUO65coMANZL07iJujfWA==" - "resolved": "https://registry.npmjs.org/mout/-/mout-1.0.0.tgz", - "integrity": "sha512-LyMgS0sDVdY+gLXAr51LOGFOulAMq8n08V6cBP1qmKYs1KjBa/xZFuOoSPECs/fteUUO65coMANZL07iJujfWA==" }, "node_modules/ms": { "version": "2.1.2", @@ -5703,9 +5627,9 @@ "dev": true }, "node_modules/node-abi": { - "version": "3.56.0", - "resolved": "https://registry.npmjs.org/node-abi/-/node-abi-3.56.0.tgz", - "integrity": "sha512-fZjdhDOeRcaS+rcpve7XuwHBmktS1nS1gzgghwKUQQ8nTy2FdSDr6ZT8k6YhvlJeHmmQMYiT/IH9hfco5zeW2Q==", + "version": "3.58.0", + "resolved": "https://registry.npmjs.org/node-abi/-/node-abi-3.58.0.tgz", + "integrity": "sha512-pXY1jnGf5T7b8UNzWzIqf0EkX4bx/w8N2AvwlGnk2SYYA/kzDVPaH0Dh0UG4EwxBB5eKOIZKPr8VAHSHL1DPGg==", "dev": true, "dependencies": { "semver": "^7.3.5" @@ -5788,9 +5712,6 @@ "resolved": "https://registry.npmjs.org/nomnom/-/nomnom-1.8.1.tgz", "integrity": "sha512-5s0JxqhDx9/rksG2BTMVN1enjWSvPidpoSgViZU4ZXULyTe+7jxcCRLB6f42Z0l1xYJpleCBtSyY6Lwg3uu5CQ==", "deprecated": "Package no longer supported. Contact support@npmjs.com for more info.", - "resolved": "https://registry.npmjs.org/nomnom/-/nomnom-1.8.1.tgz", - "integrity": "sha512-5s0JxqhDx9/rksG2BTMVN1enjWSvPidpoSgViZU4ZXULyTe+7jxcCRLB6f42Z0l1xYJpleCBtSyY6Lwg3uu5CQ==", - "deprecated": "Package no longer supported. Contact support@npmjs.com for more info.", "dependencies": { "chalk": "~0.4.0", "underscore": "~1.6.0" @@ -5800,8 +5721,6 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-1.0.0.tgz", "integrity": "sha512-3iF4FIKdxaVYT3JqQuY3Wat/T2t7TRbbQ94Fu50ZUCbLy4TFbTzr90NOHQodQkNqmeEGCw8WbeP78WNi6SKYUA==", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-1.0.0.tgz", - "integrity": "sha512-3iF4FIKdxaVYT3JqQuY3Wat/T2t7TRbbQ94Fu50ZUCbLy4TFbTzr90NOHQodQkNqmeEGCw8WbeP78WNi6SKYUA==", "engines": { "node": ">=0.8.0" } @@ -5810,8 +5729,6 @@ "version": "0.4.0", "resolved": "https://registry.npmjs.org/chalk/-/chalk-0.4.0.tgz", "integrity": "sha512-sQfYDlfv2DGVtjdoQqxS0cEZDroyG8h6TamA6rvxwlrU5BaSLDx9xhatBYl2pxZ7gmpNaPFVwBtdGdu5rQ+tYQ==", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-0.4.0.tgz", - "integrity": "sha512-sQfYDlfv2DGVtjdoQqxS0cEZDroyG8h6TamA6rvxwlrU5BaSLDx9xhatBYl2pxZ7gmpNaPFVwBtdGdu5rQ+tYQ==", "dependencies": { "ansi-styles": "~1.0.0", "has-color": "~0.1.0", @@ -5825,8 +5742,6 @@ "version": "0.1.1", "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-0.1.1.tgz", "integrity": "sha512-behete+3uqxecWlDAm5lmskaSaISA+ThQ4oNNBDTBJt0x2ppR6IPqfZNuj6BLaLJ/Sji4TPZlcRyOis8wXQTLg==", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-0.1.1.tgz", - "integrity": "sha512-behete+3uqxecWlDAm5lmskaSaISA+ThQ4oNNBDTBJt0x2ppR6IPqfZNuj6BLaLJ/Sji4TPZlcRyOis8wXQTLg==", "bin": { "strip-ansi": "cli.js" }, @@ -5838,9 +5753,6 @@ "version": "1.6.0", "resolved": "https://registry.npmjs.org/underscore/-/underscore-1.6.0.tgz", "integrity": "sha512-z4o1fvKUojIWh9XuaVLUDdf86RQiq13AC1dmHbTpoyuu+bquHms76v16CjycCbec87J7z0k//SiQVk0sMdFmpQ==" - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/underscore/-/underscore-1.6.0.tgz", - "integrity": "sha512-z4o1fvKUojIWh9XuaVLUDdf86RQiq13AC1dmHbTpoyuu+bquHms76v16CjycCbec87J7z0k//SiQVk0sMdFmpQ==" }, "node_modules/nopt": { "version": "6.0.0", @@ -6101,6 +6013,52 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/ora/node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/ora/node_modules/cli-cursor": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-3.1.0.tgz", + "integrity": "sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==", + "dev": true, + "dependencies": { + "restore-cursor": "^3.1.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/ora/node_modules/restore-cursor": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-3.1.0.tgz", + "integrity": "sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA==", + "dev": true, + "dependencies": { + "onetime": "^5.1.0", + "signal-exit": "^3.0.2" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/ora/node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/os-tmpdir": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz", @@ -6301,6 +6259,16 @@ "pbf": "bin/pbf" } }, + "node_modules/pe-library": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/pe-library/-/pe-library-1.0.0.tgz", + "integrity": "sha512-yZ+4d3YHKUjO0BX03oXFfHRKLdYKDO2HmCt1RcApPxme/P5ASPbbKnuQkzFrmT482wi2kfO+sPgqasrz5QeU1w==", + "dev": true, + "engines": { + "node": ">=14", + "npm": ">=7" + } + }, "node_modules/pend": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/pend/-/pend-1.2.0.tgz", @@ -6472,8 +6440,6 @@ "version": "3.1.0", "resolved": "https://registry.npmjs.org/plist/-/plist-3.1.0.tgz", "integrity": "sha512-uysumyrvkUX0rX/dEVqt8gC3sTBzd4zoWfLeS29nb53imdaXVvLINYXTI2GNqzaMuvacNx4uJQ8+b3zXR0pkgQ==", - "resolved": "https://registry.npmjs.org/plist/-/plist-3.1.0.tgz", - "integrity": "sha512-uysumyrvkUX0rX/dEVqt8gC3sTBzd4zoWfLeS29nb53imdaXVvLINYXTI2GNqzaMuvacNx4uJQ8+b3zXR0pkgQ==", "dev": true, "dependencies": { "@xmldom/xmldom": "^0.8.8", @@ -6488,8 +6454,6 @@ "version": "1.0.6", "resolved": "https://registry.npmjs.org/plotly/-/plotly-1.0.6.tgz", "integrity": "sha512-9DoPWfLJWxqXg6omu1Oj7qkvyOce0Nv+X+2SOoI9lG9mbvA7S/qGVHypwrGMV3r53ruW1Fl1A9a7ZIPt22FrpA==", - "resolved": "https://registry.npmjs.org/plotly/-/plotly-1.0.6.tgz", - "integrity": "sha512-9DoPWfLJWxqXg6omu1Oj7qkvyOce0Nv+X+2SOoI9lG9mbvA7S/qGVHypwrGMV3r53ruW1Fl1A9a7ZIPt22FrpA==", "dependencies": { "mkdirp": "~0.5.0" } @@ -6522,15 +6486,11 @@ "version": "2.0.1", "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==" - "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", - "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==" }, "node_modules/progress": { "version": "2.0.3", "resolved": "https://registry.npmjs.org/progress/-/progress-2.0.3.tgz", "integrity": "sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==", - "resolved": "https://registry.npmjs.org/progress/-/progress-2.0.3.tgz", - "integrity": "sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==", "engines": { "node": ">=0.4.0" } @@ -6594,8 +6554,6 @@ "version": "1.5.0", "resolved": "https://registry.npmjs.org/q/-/q-1.5.0.tgz", "integrity": "sha512-VVMcd+HnuWZalHPycK7CsbVJ+sSrrrnCvHcW38YJVK9Tywnb5DUWJjONi81bLUj7aqDjIXnePxBl5t1r/F/ncg==", - "resolved": "https://registry.npmjs.org/q/-/q-1.5.0.tgz", - "integrity": "sha512-VVMcd+HnuWZalHPycK7CsbVJ+sSrrrnCvHcW38YJVK9Tywnb5DUWJjONi81bLUj7aqDjIXnePxBl5t1r/F/ncg==", "engines": { "node": ">=0.6.0", "teleport": ">=0.2.0" @@ -6649,8 +6607,6 @@ "version": "1.2.1", "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==", - "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", - "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==", "engines": { "node": ">= 0.6" } @@ -6659,24 +6615,10 @@ "version": "2.0.1", "resolved": "https://registry.npmjs.org/rbush/-/rbush-2.0.1.tgz", "integrity": "sha512-Ofc9SeEwu6dT2JKqiWTktMvy6kU/7f/jN5wYZvCyQjW+PIH/ENpbOE19QsBPho8Sjei1TNGXr9yzNPd1FKpYLg==", - "resolved": "https://registry.npmjs.org/rbush/-/rbush-2.0.1.tgz", - "integrity": "sha512-Ofc9SeEwu6dT2JKqiWTktMvy6kU/7f/jN5wYZvCyQjW+PIH/ENpbOE19QsBPho8Sjei1TNGXr9yzNPd1FKpYLg==", "dependencies": { "quickselect": "^1.0.0" } }, - "node_modules/rcedit": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/rcedit/-/rcedit-4.0.1.tgz", - "integrity": "sha512-bZdaQi34krFWhrDn+O53ccBDw0MkAT2Vhu75SqhtvhQu4OPyFM4RoVheyYiVQYdjhUi6EJMVWQ0tR6bCIYVkUg==", - "dev": true, - "dependencies": { - "cross-spawn-windows-exe": "^1.1.0" - }, - "engines": { - "node": ">= 14.0.0" - } - }, "node_modules/read-binary-file-arch": { "version": "1.0.6", "resolved": "https://registry.npmjs.org/read-binary-file-arch/-/read-binary-file-arch-1.0.6.tgz", @@ -6860,8 +6802,6 @@ "version": "3.0.0", "resolved": "https://registry.npmjs.org/request-progress/-/request-progress-3.0.0.tgz", "integrity": "sha512-MnWzEHHaxHO2iWiQuHrUPBi/1WeBf5PkxQqNyNvLl9VAYSdXkP8tQ3pBSeCPD+yw0v0Aq1zosWLz0BdeXpWwZg==", - "resolved": "https://registry.npmjs.org/request-progress/-/request-progress-3.0.0.tgz", - "integrity": "sha512-MnWzEHHaxHO2iWiQuHrUPBi/1WeBf5PkxQqNyNvLl9VAYSdXkP8tQ3pBSeCPD+yw0v0Aq1zosWLz0BdeXpWwZg==", "dependencies": { "throttleit": "^1.0.0" } @@ -6887,18 +6827,27 @@ "version": "0.2.4", "resolved": "https://registry.npmjs.org/requizzle/-/requizzle-0.2.4.tgz", "integrity": "sha512-JRrFk1D4OQ4SqovXOgdav+K8EAhSB/LJZqCz8tbX0KObcdeM15Ss59ozWMBWmmINMagCwmqn4ZNryUGpBsl6Jw==", - "resolved": "https://registry.npmjs.org/requizzle/-/requizzle-0.2.4.tgz", - "integrity": "sha512-JRrFk1D4OQ4SqovXOgdav+K8EAhSB/LJZqCz8tbX0KObcdeM15Ss59ozWMBWmmINMagCwmqn4ZNryUGpBsl6Jw==", "dependencies": { "lodash": "^4.17.21" } }, + "node_modules/resedit": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/resedit/-/resedit-2.0.0.tgz", + "integrity": "sha512-vrrJCabKxAW4MT1QivtAAb0poGp8KT2qhnSzfN9tFIxb2rQu1hRHNn1VgGSZR7nmxGaW5Yz0YeW1bjgvRfNoKA==", + "dev": true, + "dependencies": { + "pe-library": "^1.0.0" + }, + "engines": { + "node": ">=14", + "npm": ">=7" + } + }, "node_modules/resolve": { "version": "1.22.8", "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.8.tgz", "integrity": "sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw==", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.8.tgz", - "integrity": "sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw==", "dependencies": { "is-core-module": "^2.13.0", "path-parse": "^1.0.7", @@ -6946,8 +6895,6 @@ "version": "2.1.0", "resolved": "https://registry.npmjs.org/resolve-protobuf-schema/-/resolve-protobuf-schema-2.1.0.tgz", "integrity": "sha512-kI5ffTiZWmJaS/huM8wZfEMer1eRd7oJQhDuxeCLe3t7N7mX3z94CN0xPxBQxFYQTSNz9T0i+v6inKqSdK8xrQ==", - "resolved": "https://registry.npmjs.org/resolve-protobuf-schema/-/resolve-protobuf-schema-2.1.0.tgz", - "integrity": "sha512-kI5ffTiZWmJaS/huM8wZfEMer1eRd7oJQhDuxeCLe3t7N7mX3z94CN0xPxBQxFYQTSNz9T0i+v6inKqSdK8xrQ==", "dependencies": { "protocol-buffers-schema": "^3.3.1" } @@ -6964,24 +6911,25 @@ } }, "node_modules/restore-cursor": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-3.1.0.tgz", - "integrity": "sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA==", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-4.0.0.tgz", + "integrity": "sha512-I9fPXU9geO9bHOt9pHHOhOkYerIMsmVaWB0rA2AI9ERh/+x/i7MV5HKBNrg+ljO5eoPVgCcnFuRjJ9uH6I/3eg==", "dev": true, "dependencies": { "onetime": "^5.1.0", "signal-exit": "^3.0.2" }, "engines": { - "node": ">=8" + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/retry": { "version": "0.10.1", "resolved": "https://registry.npmjs.org/retry/-/retry-0.10.1.tgz", "integrity": "sha512-ZXUSQYTHdl3uS7IuCehYfMzKyIDBNoAuUblvy5oGO5UJSUTmStUUVPXbA9Qxd173Bgre53yCQczQuHgRWAdvJQ==", - "resolved": "https://registry.npmjs.org/retry/-/retry-0.10.1.tgz", - "integrity": "sha512-ZXUSQYTHdl3uS7IuCehYfMzKyIDBNoAuUblvy5oGO5UJSUTmStUUVPXbA9Qxd173Bgre53yCQczQuHgRWAdvJQ==", "engines": { "node": "*" } @@ -7006,8 +6954,6 @@ "version": "0.1.3", "resolved": "https://registry.npmjs.org/right-align/-/right-align-0.1.3.tgz", "integrity": "sha512-yqINtL/G7vs2v+dFIZmFUDbnVyFUJFKd6gK22Kgo6R4jfJGFtisKyncWDDULgjfqf4ASQuIQyjJ7XZ+3aWpsAg==", - "resolved": "https://registry.npmjs.org/right-align/-/right-align-0.1.3.tgz", - "integrity": "sha512-yqINtL/G7vs2v+dFIZmFUDbnVyFUJFKd6gK22Kgo6R4jfJGFtisKyncWDDULgjfqf4ASQuIQyjJ7XZ+3aWpsAg==", "optional": true, "dependencies": { "align-text": "^0.1.1" @@ -7052,8 +6998,6 @@ "version": "0.52.3", "resolved": "https://registry.npmjs.org/rollup/-/rollup-0.52.3.tgz", "integrity": "sha512-cw+vb9NqaTXlwJyb8G+Ve+uhhlVTcl1NKBkfANdeQqVcpZFilQgeNnAnNiu7MwfeXrqiKEGz+3R03a3zeFkmEQ==", - "resolved": "https://registry.npmjs.org/rollup/-/rollup-0.52.3.tgz", - "integrity": "sha512-cw+vb9NqaTXlwJyb8G+Ve+uhhlVTcl1NKBkfANdeQqVcpZFilQgeNnAnNiu7MwfeXrqiKEGz+3R03a3zeFkmEQ==", "bin": { "rollup": "bin/rollup" } @@ -7062,8 +7006,6 @@ "version": "2.0.1", "resolved": "https://registry.npmjs.org/rollup-plugin-cleanup/-/rollup-plugin-cleanup-2.0.1.tgz", "integrity": "sha512-Z2UpMe3l2Oo8jzoB2gAWcb3UqIyiGxlh8kKlcs/W53yTPtwdF8RGfhuTx+/kjRlkSc5TC03t3sX3Lj3B40k9Eg==", - "resolved": "https://registry.npmjs.org/rollup-plugin-cleanup/-/rollup-plugin-cleanup-2.0.1.tgz", - "integrity": "sha512-Z2UpMe3l2Oo8jzoB2gAWcb3UqIyiGxlh8kKlcs/W53yTPtwdF8RGfhuTx+/kjRlkSc5TC03t3sX3Lj3B40k9Eg==", "dependencies": { "acorn": "4.x", "magic-string": "^0.22.4", @@ -7080,8 +7022,6 @@ "version": "4.0.13", "resolved": "https://registry.npmjs.org/acorn/-/acorn-4.0.13.tgz", "integrity": "sha512-fu2ygVGuMmlzG8ZeRJ0bvR41nsAkxxhbyk8bZ1SS521Z7vmgJFTQQlfz/Mp/nJexGBz+v8sC9bM6+lNgskt4Ug==", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-4.0.13.tgz", - "integrity": "sha512-fu2ygVGuMmlzG8ZeRJ0bvR41nsAkxxhbyk8bZ1SS521Z7vmgJFTQQlfz/Mp/nJexGBz+v8sC9bM6+lNgskt4Ug==", "bin": { "acorn": "bin/acorn" }, @@ -7094,9 +7034,6 @@ "resolved": "https://registry.npmjs.org/rollup-plugin-commonjs/-/rollup-plugin-commonjs-8.4.1.tgz", "integrity": "sha512-mg+WuD+jlwoo8bJtW3Mvx7Tz6TsIdMsdhuvCnDMoyjh0oxsVgsjB/N0X984RJCWwc5IIiqNVJhXeeITcc73++A==", "deprecated": "This package has been deprecated and is no longer maintained. Please use @rollup/plugin-commonjs.", - "resolved": "https://registry.npmjs.org/rollup-plugin-commonjs/-/rollup-plugin-commonjs-8.4.1.tgz", - "integrity": "sha512-mg+WuD+jlwoo8bJtW3Mvx7Tz6TsIdMsdhuvCnDMoyjh0oxsVgsjB/N0X984RJCWwc5IIiqNVJhXeeITcc73++A==", - "deprecated": "This package has been deprecated and is no longer maintained. Please use @rollup/plugin-commonjs.", "dependencies": { "acorn": "^5.2.1", "estree-walker": "^0.5.0", @@ -7110,9 +7047,6 @@ "resolved": "https://registry.npmjs.org/rollup-plugin-node-resolve/-/rollup-plugin-node-resolve-3.4.0.tgz", "integrity": "sha512-PJcd85dxfSBWih84ozRtBkB731OjXk0KnzN0oGp7WOWcarAFkVa71cV5hTJg2qpVsV2U8EUwrzHP3tvy9vS3qg==", "deprecated": "This package has been deprecated and is no longer maintained. Please use @rollup/plugin-node-resolve.", - "resolved": "https://registry.npmjs.org/rollup-plugin-node-resolve/-/rollup-plugin-node-resolve-3.4.0.tgz", - "integrity": "sha512-PJcd85dxfSBWih84ozRtBkB731OjXk0KnzN0oGp7WOWcarAFkVa71cV5hTJg2qpVsV2U8EUwrzHP3tvy9vS3qg==", - "deprecated": "This package has been deprecated and is no longer maintained. Please use @rollup/plugin-node-resolve.", "dependencies": { "builtin-modules": "^2.0.0", "is-module": "^1.0.0", @@ -7123,8 +7057,6 @@ "version": "2.8.2", "resolved": "https://registry.npmjs.org/rollup-pluginutils/-/rollup-pluginutils-2.8.2.tgz", "integrity": "sha512-EEp9NhnUkwY8aif6bxgovPHMoMoNr2FulJziTndpt5H9RdwC47GSGuII9XxpSdzVGM0GWrNPHV6ie1LTNJPaLQ==", - "resolved": "https://registry.npmjs.org/rollup-pluginutils/-/rollup-pluginutils-2.8.2.tgz", - "integrity": "sha512-EEp9NhnUkwY8aif6bxgovPHMoMoNr2FulJziTndpt5H9RdwC47GSGuII9XxpSdzVGM0GWrNPHV6ie1LTNJPaLQ==", "dependencies": { "estree-walker": "^0.6.1" } @@ -7133,8 +7065,6 @@ "version": "0.6.1", "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-0.6.1.tgz", "integrity": "sha512-SqmZANLWS0mnatqbSfRP5g8OXZC12Fgg1IwNtLsyHDzJizORW4khDfjPqJZsemPWBB2uqykUah5YpQ6epsqC/w==" - "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-0.6.1.tgz", - "integrity": "sha512-SqmZANLWS0mnatqbSfRP5g8OXZC12Fgg1IwNtLsyHDzJizORW4khDfjPqJZsemPWBB2uqykUah5YpQ6epsqC/w==" }, "node_modules/run-parallel": { "version": "1.2.0", @@ -7159,21 +7089,10 @@ "queue-microtask": "^1.2.2" } }, - "node_modules/rxjs": { - "version": "7.8.1", - "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-7.8.1.tgz", - "integrity": "sha512-AA3TVj+0A2iuIoQkWEK/tqFjBq2j+6PO6Y0zJcvzLAFhEFIO3HL0vls9hWLncZbAAbK0mar7oZ4V079I/qPMxg==", - "dev": true, - "dependencies": { - "tslib": "^2.1.0" - } - }, "node_modules/safe-buffer": { "version": "5.2.1", "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", - "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", "funding": [ { "type": "github", @@ -7193,15 +7112,11 @@ "version": "2.1.2", "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" - "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", - "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" }, "node_modules/sax": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/sax/-/sax-1.3.0.tgz", "integrity": "sha512-0s+oAmw9zLl1V1cS9BtZN7JAd0cW5e0QH4W3LWEK6a4LaLEA2OTpGYWDY+6XasBLtz6wkm3u1xRw95mRuJ59WA==" - "resolved": "https://registry.npmjs.org/sax/-/sax-1.3.0.tgz", - "integrity": "sha512-0s+oAmw9zLl1V1cS9BtZN7JAd0cW5e0QH4W3LWEK6a4LaLEA2OTpGYWDY+6XasBLtz6wkm3u1xRw95mRuJ59WA==" }, "node_modules/semver": { "version": "7.6.0", @@ -7238,8 +7153,6 @@ "version": "0.16.1", "resolved": "https://registry.npmjs.org/send/-/send-0.16.1.tgz", "integrity": "sha512-ElCLJdJIKPk6ux/Hocwhk7NFHpI3pVm/IZOYWqUmoxcgeyM+MpxHHKhb8QmlJDX1pU6WrgaHBkVNm73Sv7uc2A==", - "resolved": "https://registry.npmjs.org/send/-/send-0.16.1.tgz", - "integrity": "sha512-ElCLJdJIKPk6ux/Hocwhk7NFHpI3pVm/IZOYWqUmoxcgeyM+MpxHHKhb8QmlJDX1pU6WrgaHBkVNm73Sv7uc2A==", "dependencies": { "debug": "2.6.9", "depd": "~1.1.1", @@ -7379,17 +7292,31 @@ "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==" }, "node_modules/slice-ansi": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-3.0.0.tgz", - "integrity": "sha512-pSyv7bSTC7ig9Dcgbw9AuRNUb5k5V6oDudjZoMBSr13qpLBG7tB+zgCkARjq7xIUgdz5P1Qe8u+rSGdouOOIyQ==", + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-5.0.0.tgz", + "integrity": "sha512-FC+lgizVPfie0kkhqUScwRu1O/lF6NOgJmlCgK+/LYxDCTk8sGelYaHDhFcDN+Sn3Cv+3VSa4Byeo+IMCzpMgQ==", "dev": true, "dependencies": { - "ansi-styles": "^4.0.0", - "astral-regex": "^2.0.0", - "is-fullwidth-code-point": "^3.0.0" + "ansi-styles": "^6.0.0", + "is-fullwidth-code-point": "^4.0.0" }, "engines": { - "node": ">=8" + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/slice-ansi?sponsor=1" + } + }, + "node_modules/slice-ansi/node_modules/ansi-styles": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz", + "integrity": "sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, "node_modules/smart-buffer": { @@ -7407,9 +7334,6 @@ "resolved": "https://registry.npmjs.org/sntp/-/sntp-1.0.9.tgz", "integrity": "sha512-7bgVOAnPj3XjrKY577S+puCKGCRlUrcrEdsMeRXlg9Ghf5df/xNi6sONUa43WrHUd3TjJBF7O04jYoiY0FVa0A==", "deprecated": "This module moved to @hapi/sntp. Please make sure to switch over as this distribution is no longer supported and may contain bugs and critical security issues.", - "resolved": "https://registry.npmjs.org/sntp/-/sntp-1.0.9.tgz", - "integrity": "sha512-7bgVOAnPj3XjrKY577S+puCKGCRlUrcrEdsMeRXlg9Ghf5df/xNi6sONUa43WrHUd3TjJBF7O04jYoiY0FVa0A==", - "deprecated": "This module moved to @hapi/sntp. Please make sure to switch over as this distribution is no longer supported and may contain bugs and critical security issues.", "dependencies": { "hoek": "2.x.x" }, @@ -7421,8 +7345,6 @@ "version": "2.0.4", "resolved": "https://registry.npmjs.org/socket.io/-/socket.io-2.0.4.tgz", "integrity": "sha512-8B/grLCFDGU1jtp6BxAjSFZAXTqnSxqelNJi8n/izlYjZaP0armkGF+BgS2ZJbm9bI5Yq7v9kNCuTbmIHVzuyA==", - "resolved": "https://registry.npmjs.org/socket.io/-/socket.io-2.0.4.tgz", - "integrity": "sha512-8B/grLCFDGU1jtp6BxAjSFZAXTqnSxqelNJi8n/izlYjZaP0armkGF+BgS2ZJbm9bI5Yq7v9kNCuTbmIHVzuyA==", "dependencies": { "debug": "~2.6.6", "engine.io": "~3.1.0", @@ -7435,15 +7357,11 @@ "version": "1.1.2", "resolved": "https://registry.npmjs.org/socket.io-adapter/-/socket.io-adapter-1.1.2.tgz", "integrity": "sha512-WzZRUj1kUjrTIrUKpZLEzFZ1OLj5FwLlAFQs9kuZJzJi5DKdU7FsWc36SNmA8iDOtwBQyT8FkrriRM8vXLYz8g==" - "resolved": "https://registry.npmjs.org/socket.io-adapter/-/socket.io-adapter-1.1.2.tgz", - "integrity": "sha512-WzZRUj1kUjrTIrUKpZLEzFZ1OLj5FwLlAFQs9kuZJzJi5DKdU7FsWc36SNmA8iDOtwBQyT8FkrriRM8vXLYz8g==" }, "node_modules/socket.io-client": { "version": "2.0.4", "resolved": "https://registry.npmjs.org/socket.io-client/-/socket.io-client-2.0.4.tgz", "integrity": "sha512-dy30gOeQu8nitka60xDG1xutwmIiW+0pPBbBBZLgBCO2Sr4BODyxzcPDqiY2ZaV4kpAZguikwvRpo136mU5r0Q==", - "resolved": "https://registry.npmjs.org/socket.io-client/-/socket.io-client-2.0.4.tgz", - "integrity": "sha512-dy30gOeQu8nitka60xDG1xutwmIiW+0pPBbBBZLgBCO2Sr4BODyxzcPDqiY2ZaV4kpAZguikwvRpo136mU5r0Q==", "dependencies": { "backo2": "1.0.2", "base64-arraybuffer": "0.1.5", @@ -7477,8 +7395,6 @@ "version": "3.1.3", "resolved": "https://registry.npmjs.org/socket.io-parser/-/socket.io-parser-3.1.3.tgz", "integrity": "sha512-g0a2HPqLguqAczs3dMECuA1RgoGFPyvDqcbaDEdCWY9g59kdUAz3YRmaJBNKXflrHNwB7Q12Gkf/0CZXfdHR7g==", - "resolved": "https://registry.npmjs.org/socket.io-parser/-/socket.io-parser-3.1.3.tgz", - "integrity": "sha512-g0a2HPqLguqAczs3dMECuA1RgoGFPyvDqcbaDEdCWY9g59kdUAz3YRmaJBNKXflrHNwB7Q12Gkf/0CZXfdHR7g==", "dependencies": { "component-emitter": "1.2.1", "debug": "~3.1.0", @@ -7490,8 +7406,6 @@ "version": "3.1.0", "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", - "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", "dependencies": { "ms": "2.0.0" } @@ -7515,9 +7429,9 @@ "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" }, "node_modules/socks": { - "version": "2.8.1", - "resolved": "https://registry.npmjs.org/socks/-/socks-2.8.1.tgz", - "integrity": "sha512-B6w7tkwNid7ToxjZ08rQMT8M9BJAf8DKx8Ft4NivzH0zBUfd6jldGcisJn/RLgxcX3FPNDdNQCUEMMT79b+oCQ==", + "version": "2.8.3", + "resolved": "https://registry.npmjs.org/socks/-/socks-2.8.3.tgz", + "integrity": "sha512-l5x7VUUWbjVFbafGLxPWkYsHIhEvmF85tbIeFZWc8ZPtoMyybuEhL7Jye/ooC4/d48FgOjSJXgsF/AJPYCW8Zw==", "dev": true, "dependencies": { "ip-address": "^9.0.5", @@ -7614,8 +7528,6 @@ "version": "1.18.0", "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.18.0.tgz", "integrity": "sha512-2p2KJZTSqQ/I3+HX42EpYOa2l3f8Erv8MWKsy2I9uf4wA7yFIkXRffYdsx86y6z4vHtV8u7g+pPlr8/4ouAxsQ==", - "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.18.0.tgz", - "integrity": "sha512-2p2KJZTSqQ/I3+HX42EpYOa2l3f8Erv8MWKsy2I9uf4wA7yFIkXRffYdsx86y6z4vHtV8u7g+pPlr8/4ouAxsQ==", "dependencies": { "asn1": "~0.2.3", "assert-plus": "^1.0.0", @@ -7665,8 +7577,6 @@ "version": "1.3.1", "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.3.1.tgz", "integrity": "sha512-wuTCPGlJONk/a1kqZ4fQM2+908lC7fa7nPYpTC1EhnvqLX/IICbeP1OZGDtA374trpSq68YubKUMo8oRhN46yg==", - "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.3.1.tgz", - "integrity": "sha512-wuTCPGlJONk/a1kqZ4fQM2+908lC7fa7nPYpTC1EhnvqLX/IICbeP1OZGDtA374trpSq68YubKUMo8oRhN46yg==", "engines": { "node": ">= 0.6" } @@ -7681,18 +7591,20 @@ } }, "node_modules/string-width": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", - "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", - "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz", + "integrity": "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==", + "dev": true, "dependencies": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" + "eastasianwidth": "^0.2.0", + "emoji-regex": "^9.2.2", + "strip-ansi": "^7.0.1" }, "engines": { - "node": ">=8" + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/stringstream": { @@ -7701,16 +7613,18 @@ "integrity": "sha512-87GEBAkegbBcweToUrdzf3eLhWNg06FJTebl4BVJz/JgWy8CvEr9dRtX5qWphiynMSQlxxi+QqN0z5T32SLlhA==" }, "node_modules/strip-ansi": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", + "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", + "dev": true, "dependencies": { - "ansi-regex": "^5.0.1" + "ansi-regex": "^6.0.1" }, "engines": { - "node": ">=8" + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/strip-ansi?sponsor=1" } }, "node_modules/strip-bom": { @@ -7735,8 +7649,6 @@ "version": "2.0.1", "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", "integrity": "sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ==", - "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", - "integrity": "sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ==", "engines": { "node": ">=0.10.0" } @@ -7795,8 +7707,6 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", - "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", - "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", "engines": { "node": ">= 0.4" }, @@ -7808,14 +7718,11 @@ "version": "2.6.2", "resolved": "https://registry.npmjs.org/taffydb/-/taffydb-2.6.2.tgz", "integrity": "sha512-y3JaeRSplks6NYQuCOj3ZFMO3j60rTwbuKCvZxsAraGYH2epusatvZ0baZYA01WsGqJBq/Dl6vOrMUJqyMj8kA==" - "version": "2.6.2", - "resolved": "https://registry.npmjs.org/taffydb/-/taffydb-2.6.2.tgz", - "integrity": "sha512-y3JaeRSplks6NYQuCOj3ZFMO3j60rTwbuKCvZxsAraGYH2epusatvZ0baZYA01WsGqJBq/Dl6vOrMUJqyMj8kA==" }, "node_modules/tar": { - "version": "6.2.0", - "resolved": "https://registry.npmjs.org/tar/-/tar-6.2.0.tgz", - "integrity": "sha512-/Wo7DcT0u5HUV486xg675HtjNd3BXZ6xDbzsCUZPt5iw8bTQ63bP0Raut3mvro9u+CUyq7YQd8Cx55fsZXxqLQ==", + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/tar/-/tar-6.2.1.tgz", + "integrity": "sha512-DZ4yORTwrbTj/7MZYq2w+/ZFdI6OZ/f9SFHR+71gIVUZhOQPHzVCLpvRnPgyaMpfWxxk/4ONva3GQSyNIKRv6A==", "dev": true, "dependencies": { "chownr": "^2.0.0", @@ -7842,8 +7749,6 @@ "version": "1.0.4", "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", - "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", "dev": true, "bin": { "mkdirp": "bin/cmd.js" @@ -7856,8 +7761,6 @@ "version": "0.8.4", "resolved": "https://registry.npmjs.org/temp/-/temp-0.8.4.tgz", "integrity": "sha512-s0ZZzd0BzYv5tLSptZooSjK8oj6C+c19p7Vqta9+6NPOf7r+fxq0cJe6/oN4LTC79sy5NY8ucOJNgwsKCSbfqg==", - "resolved": "https://registry.npmjs.org/temp/-/temp-0.8.4.tgz", - "integrity": "sha512-s0ZZzd0BzYv5tLSptZooSjK8oj6C+c19p7Vqta9+6NPOf7r+fxq0cJe6/oN4LTC79sy5NY8ucOJNgwsKCSbfqg==", "dependencies": { "rimraf": "~2.6.2" }, @@ -7869,8 +7772,6 @@ "version": "2.6.3", "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.3.tgz", "integrity": "sha512-mwqeW5XsA2qAejG46gYdENaxXjx9onRNCfn7L0duuP4hCuTIi/QO7PDK07KJfp1d+izWPrzEJDcSqBa0OZQriA==", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.3.tgz", - "integrity": "sha512-mwqeW5XsA2qAejG46gYdENaxXjx9onRNCfn7L0duuP4hCuTIi/QO7PDK07KJfp1d+izWPrzEJDcSqBa0OZQriA==", "dependencies": { "glob": "^7.1.3" }, @@ -7882,25 +7783,15 @@ "version": "0.139.0", "resolved": "https://registry.npmjs.org/three/-/three-0.139.0.tgz", "integrity": "sha512-hZ4LkCjgoEM82WLaOVptDKGpB3SkEyuJP2OHe36AFO8hS2I6CrEiNanXj7wwR3wIPT7V5wi5Y5pFnncS5SVHgQ==" - "resolved": "https://registry.npmjs.org/three/-/three-0.139.0.tgz", - "integrity": "sha512-hZ4LkCjgoEM82WLaOVptDKGpB3SkEyuJP2OHe36AFO8hS2I6CrEiNanXj7wwR3wIPT7V5wi5Y5pFnncS5SVHgQ==" }, "node_modules/throttleit": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/throttleit/-/throttleit-1.0.1.tgz", "integrity": "sha512-vDZpf9Chs9mAdfY046mcPt8fg5QSZr37hEH4TXYBnDF+izxgrbRGUAAaBvIk/fJm9aOFCGFd1EsNg5AZCbnQCQ==", - "resolved": "https://registry.npmjs.org/throttleit/-/throttleit-1.0.1.tgz", - "integrity": "sha512-vDZpf9Chs9mAdfY046mcPt8fg5QSZr37hEH4TXYBnDF+izxgrbRGUAAaBvIk/fJm9aOFCGFd1EsNg5AZCbnQCQ==", "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/through": { - "version": "2.3.8", - "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", - "integrity": "sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg==", - "dev": true - }, "node_modules/tiny-each-async": { "version": "2.0.3", "resolved": "https://registry.npmjs.org/tiny-each-async/-/tiny-each-async-2.0.3.tgz", @@ -7912,8 +7803,6 @@ "version": "0.0.31", "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.31.tgz", "integrity": "sha512-lfyEfOppKvWNeId5CArFLwgwef+iCnbEIy0JWYf1httIEXnx4ndL4Dr1adw7hPgeQfSlTbc/gqn6iaKcROpw5Q==", - "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.31.tgz", - "integrity": "sha512-lfyEfOppKvWNeId5CArFLwgwef+iCnbEIy0JWYf1httIEXnx4ndL4Dr1adw7hPgeQfSlTbc/gqn6iaKcROpw5Q==", "dependencies": { "os-tmpdir": "~1.0.1" }, @@ -7962,8 +7851,6 @@ "version": "0.0.3", "resolved": "https://registry.npmjs.org/touch/-/touch-0.0.3.tgz", "integrity": "sha512-/LQ54KM9rPf3rGXGo2UPQWx3ol242Zg6Whq27H5DEmZhCJo+pm9N5BzRGepO9vTVhYxpXJdcc1+3uaYt9NyeKg==", - "resolved": "https://registry.npmjs.org/touch/-/touch-0.0.3.tgz", - "integrity": "sha512-/LQ54KM9rPf3rGXGo2UPQWx3ol242Zg6Whq27H5DEmZhCJo+pm9N5BzRGepO9vTVhYxpXJdcc1+3uaYt9NyeKg==", "dependencies": { "nopt": "~1.0.10" }, @@ -7975,17 +7862,12 @@ "version": "1.0.10", "resolved": "https://registry.npmjs.org/nopt/-/nopt-1.0.10.tgz", "integrity": "sha512-NWmpvLSqUrgrAC9HCuxEvb+PSloHpqVu+FqcO4eeF2h5qYRhA7ev6KvelyQAKtegUbC6RypJnlEOhd8vloNKYg==", - "resolved": "https://registry.npmjs.org/nopt/-/nopt-1.0.10.tgz", - "integrity": "sha512-NWmpvLSqUrgrAC9HCuxEvb+PSloHpqVu+FqcO4eeF2h5qYRhA7ev6KvelyQAKtegUbC6RypJnlEOhd8vloNKYg==", "dependencies": { "abbrev": "1" }, "bin": { "nopt": "bin/nopt.js" }, - "engines": { - "node": "*" - }, "engines": { "node": "*" } @@ -8014,11 +7896,6 @@ "engines": { "node": "*" } - "resolved": "https://registry.npmjs.org/traverse/-/traverse-0.3.9.tgz", - "integrity": "sha512-iawgk0hLP3SxGKDfnDJf8wTz4p2qImnyihM5Hh/sGvQ3K37dPi/w8sRhdNIxYA1TwFwc5mDhIJq+O0RsvXBKdQ==", - "engines": { - "node": "*" - } }, "node_modules/trim-repeated": { "version": "1.0.0", @@ -8041,18 +7918,10 @@ "node": ">=0.8.0" } }, - "node_modules/tslib": { - "version": "2.6.2", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.2.tgz", - "integrity": "sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==", - "dev": true - }, "node_modules/tunnel-agent": { "version": "0.6.0", "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", "integrity": "sha512-McnNiV1l8RYeY8tBgEpuodCC1mLUdbSN+CYBL7kJsJNInOP8UjDDEwdk6Mw60vdLLrr5NHKZhMAOSrR2NZuQ+w==", - "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", - "integrity": "sha512-McnNiV1l8RYeY8tBgEpuodCC1mLUdbSN+CYBL7kJsJNInOP8UjDDEwdk6Mw60vdLLrr5NHKZhMAOSrR2NZuQ+w==", "dependencies": { "safe-buffer": "^5.0.1" }, @@ -8064,8 +7933,6 @@ "version": "0.14.5", "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz", "integrity": "sha512-KXXFFdAbFXY4geFIwoyNK+f5Z1b7swfXABfL7HXCmoIWMKU3dmS26672A4EeQtDzLKy7SXmfBu51JolvEKwtGA==" - "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz", - "integrity": "sha512-KXXFFdAbFXY4geFIwoyNK+f5Z1b7swfXABfL7HXCmoIWMKU3dmS26672A4EeQtDzLKy7SXmfBu51JolvEKwtGA==" }, "node_modules/type-fest": { "version": "2.19.0", @@ -8082,8 +7949,6 @@ "version": "2.8.29", "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-2.8.29.tgz", "integrity": "sha512-qLq/4y2pjcU3vhlhseXGGJ7VbFO4pBANu0kwl8VCa9KEI0V8VfZIx2Fy3w01iSTA/pGwKZSmu/+I4etLNDdt5w==", - "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-2.8.29.tgz", - "integrity": "sha512-qLq/4y2pjcU3vhlhseXGGJ7VbFO4pBANu0kwl8VCa9KEI0V8VfZIx2Fy3w01iSTA/pGwKZSmu/+I4etLNDdt5w==", "optional": true, "dependencies": { "source-map": "~0.5.1", @@ -8103,8 +7968,6 @@ "version": "2.1.0", "resolved": "https://registry.npmjs.org/cliui/-/cliui-2.1.0.tgz", "integrity": "sha512-GIOYRizG+TGoc7Wgc1LiOTLare95R3mzKgoln+Q/lE4ceiYH19gUpl0l0Ffq4lJDEf3FxujMe6IBfOCs7pfqNA==", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-2.1.0.tgz", - "integrity": "sha512-GIOYRizG+TGoc7Wgc1LiOTLare95R3mzKgoln+Q/lE4ceiYH19gUpl0l0Ffq4lJDEf3FxujMe6IBfOCs7pfqNA==", "optional": true, "dependencies": { "center-align": "^0.1.1", @@ -8116,8 +7979,6 @@ "version": "0.5.7", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", "integrity": "sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ==", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", - "integrity": "sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ==", "optional": true, "engines": { "node": ">=0.10.0" @@ -8127,8 +7988,6 @@ "version": "0.0.2", "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-0.0.2.tgz", "integrity": "sha512-xSBsCeh+g+dinoBv3GAOWM4LcVVO68wLXRanibtBSdUvkGWQRGeE9P7IwU9EmDDi4jA6L44lz15CGMwdw9N5+Q==", - "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-0.0.2.tgz", - "integrity": "sha512-xSBsCeh+g+dinoBv3GAOWM4LcVVO68wLXRanibtBSdUvkGWQRGeE9P7IwU9EmDDi4jA6L44lz15CGMwdw9N5+Q==", "optional": true, "engines": { "node": ">=0.4.0" @@ -8138,8 +7997,6 @@ "version": "3.10.0", "resolved": "https://registry.npmjs.org/yargs/-/yargs-3.10.0.tgz", "integrity": "sha512-QFzUah88GAGy9lyDKGBqZdkYApt63rCXYBGYnEP4xDJPXNqXXnBDACnbrXnViV6jRSqAePwrATi2i8mfYm4L1A==", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-3.10.0.tgz", - "integrity": "sha512-QFzUah88GAGy9lyDKGBqZdkYApt63rCXYBGYnEP4xDJPXNqXXnBDACnbrXnViV6jRSqAePwrATi2i8mfYm4L1A==", "optional": true, "dependencies": { "camelcase": "^1.0.2", @@ -8152,8 +8009,6 @@ "version": "1.0.2", "resolved": "https://registry.npmjs.org/uglify-to-browserify/-/uglify-to-browserify-1.0.2.tgz", "integrity": "sha512-vb2s1lYx2xBtUgy+ta+b2J/GLVUR+wmpINwHePmPRhOsIVCG2wDzKJ0n14GslH1BifsqVzSOwQhRaCAsZ/nI4Q==", - "resolved": "https://registry.npmjs.org/uglify-to-browserify/-/uglify-to-browserify-1.0.2.tgz", - "integrity": "sha512-vb2s1lYx2xBtUgy+ta+b2J/GLVUR+wmpINwHePmPRhOsIVCG2wDzKJ0n14GslH1BifsqVzSOwQhRaCAsZ/nI4Q==", "optional": true }, "node_modules/ultron": { @@ -8251,17 +8106,12 @@ "version": "1.0.2", "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==" - "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", - "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==" }, "node_modules/uuid": { "version": "3.4.0", "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz", "integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==", "deprecated": "Please upgrade to version 7 or higher. Older versions may use Math.random() in certain circumstances, which is known to be problematic. See https://v8.dev/blog/math-random for details.", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz", - "integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==", - "deprecated": "Please upgrade to version 7 or higher. Older versions may use Math.random() in certain circumstances, which is known to be problematic. See https://v8.dev/blog/math-random for details.", "bin": { "uuid": "bin/uuid" } @@ -8271,9 +8121,6 @@ "resolved": "https://registry.npmjs.org/uws/-/uws-9.14.0.tgz", "integrity": "sha512-HNMztPP5A1sKuVFmdZ6BPVpBQd5bUjNC8EFMFiICK+oho/OQsAJy5hnIx4btMHiOk8j04f/DbIlqnEZ9d72dqg==", "deprecated": "New code is available at github.com/uNetworking/uWebSockets.js", - "resolved": "https://registry.npmjs.org/uws/-/uws-9.14.0.tgz", - "integrity": "sha512-HNMztPP5A1sKuVFmdZ6BPVpBQd5bUjNC8EFMFiICK+oho/OQsAJy5hnIx4btMHiOk8j04f/DbIlqnEZ9d72dqg==", - "deprecated": "New code is available at github.com/uNetworking/uWebSockets.js", "hasInstallScript": true, "optional": true, "engines": { @@ -8294,8 +8141,6 @@ "version": "1.10.0", "resolved": "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz", "integrity": "sha512-ZZKSmDAEFOijERBLkmYfJ+vmk3w+7hOLYDNkRCuRuMJGEmqYNCNLyBBFwWKVMhfwaEF3WOd0Zlw86U/WC/+nYw==", - "resolved": "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz", - "integrity": "sha512-ZZKSmDAEFOijERBLkmYfJ+vmk3w+7hOLYDNkRCuRuMJGEmqYNCNLyBBFwWKVMhfwaEF3WOd0Zlw86U/WC/+nYw==", "engines": [ "node >=0.6.0" ], @@ -8370,12 +8215,55 @@ "version": "1.1.5", "resolved": "https://registry.npmjs.org/wide-align/-/wide-align-1.1.5.tgz", "integrity": "sha512-eDMORYaPNZ4sQIuuYPDHdQvf4gyCF9rEEV/yPxGfwPkRodwEgiMUUXTx/dex+Me0wxx53S+NgUHaP7y3MGlDmg==", - "resolved": "https://registry.npmjs.org/wide-align/-/wide-align-1.1.5.tgz", - "integrity": "sha512-eDMORYaPNZ4sQIuuYPDHdQvf4gyCF9rEEV/yPxGfwPkRodwEgiMUUXTx/dex+Me0wxx53S+NgUHaP7y3MGlDmg==", "dependencies": { "string-width": "^1.0.2 || 2 || 3 || 4" } }, + "node_modules/wide-align/node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "engines": { + "node": ">=8" + } + }, + "node_modules/wide-align/node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" + }, + "node_modules/wide-align/node_modules/is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "engines": { + "node": ">=8" + } + }, + "node_modules/wide-align/node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/wide-align/node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/window-size": { "version": "0.1.0", "resolved": "https://registry.npmjs.org/window-size/-/window-size-0.1.0.tgz", @@ -8385,6 +8273,11 @@ "node": ">= 0.8.0" } }, + "node_modules/wnumb": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/wnumb/-/wnumb-1.2.0.tgz", + "integrity": "sha512-eYut5K/dW7usfk/Mwm6nxBNoTPp/uP7PlXld+hhg7lDtHLdHFnNclywGYM9BRC7Ohd4JhwuHg+vmOUGfd3NhVA==" + }, "node_modules/word-wrap": { "version": "1.2.5", "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.5.tgz", @@ -8399,42 +8292,48 @@ "version": "0.0.3", "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-0.0.3.tgz", "integrity": "sha512-1tMA907+V4QmxV7dbRvb4/8MaRALK6q9Abid3ndMYnbyo8piisCmeONVqVSXqQA3KaP4SLt5b7ud6E2sqP8TFw==", - "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-0.0.3.tgz", - "integrity": "sha512-1tMA907+V4QmxV7dbRvb4/8MaRALK6q9Abid3ndMYnbyo8piisCmeONVqVSXqQA3KaP4SLt5b7ud6E2sqP8TFw==", "engines": { "node": ">=0.4.0" } }, "node_modules/wrap-ansi": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", - "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-8.1.0.tgz", + "integrity": "sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==", "dev": true, "dependencies": { - "ansi-styles": "^4.0.0", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0" + "ansi-styles": "^6.1.0", + "string-width": "^5.0.1", + "strip-ansi": "^7.0.1" }, "engines": { - "node": ">=10" + "node": ">=12" }, "funding": { "url": "https://github.com/chalk/wrap-ansi?sponsor=1" } }, + "node_modules/wrap-ansi/node_modules/ansi-styles": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz", + "integrity": "sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, "node_modules/wrappy": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==" - "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", - "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==" }, "node_modules/ws": { "version": "3.3.3", "resolved": "https://registry.npmjs.org/ws/-/ws-3.3.3.tgz", "integrity": "sha512-nnWLa/NwZSt4KQJu51MYlCcSQ5g7INpOrOMt4XV8j4dqTXdmlUmSHQ8/oLC069ckre0fRsgfvsKwbTdtKLCDkA==", - "resolved": "https://registry.npmjs.org/ws/-/ws-3.3.3.tgz", - "integrity": "sha512-nnWLa/NwZSt4KQJu51MYlCcSQ5g7INpOrOMt4XV8j4dqTXdmlUmSHQ8/oLC069ckre0fRsgfvsKwbTdtKLCDkA==", "dependencies": { "async-limiter": "~1.0.0", "safe-buffer": "~5.1.0", @@ -8445,15 +8344,11 @@ "version": "5.1.2", "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" }, "node_modules/xml2js": { "version": "0.4.23", "resolved": "https://registry.npmjs.org/xml2js/-/xml2js-0.4.23.tgz", "integrity": "sha512-ySPiMjM0+pLDftHgXY4By0uswI3SPKLDw/i3UXbnO8M/p28zqexCUoPmQFrYD+/1BzhGJSs2i1ERWKJAtiLrug==", - "resolved": "https://registry.npmjs.org/xml2js/-/xml2js-0.4.23.tgz", - "integrity": "sha512-ySPiMjM0+pLDftHgXY4By0uswI3SPKLDw/i3UXbnO8M/p28zqexCUoPmQFrYD+/1BzhGJSs2i1ERWKJAtiLrug==", "dependencies": { "sax": ">=0.6.0", "xmlbuilder": "~11.0.0" @@ -8466,8 +8361,6 @@ "version": "11.0.1", "resolved": "https://registry.npmjs.org/xmlbuilder/-/xmlbuilder-11.0.1.tgz", "integrity": "sha512-fDlsI/kFEx7gLvbecc0/ohLG50fugQp8ryHzMTuW9vSa1GJ0XYWKnhsUx7oie3G98+r56aTQIUB4kht42R3JvA==", - "resolved": "https://registry.npmjs.org/xmlbuilder/-/xmlbuilder-11.0.1.tgz", - "integrity": "sha512-fDlsI/kFEx7gLvbecc0/ohLG50fugQp8ryHzMTuW9vSa1GJ0XYWKnhsUx7oie3G98+r56aTQIUB4kht42R3JvA==", "engines": { "node": ">=4.0" } @@ -8476,8 +8369,6 @@ "version": "15.1.1", "resolved": "https://registry.npmjs.org/xmlbuilder/-/xmlbuilder-15.1.1.tgz", "integrity": "sha512-yMqGBqtXyeN1e3TGYvgNgDVZ3j84W4cwkOXQswghol6APgZWaff9lnbvN7MHYJOiXsvGPXtjTYJEiC9J2wv9Eg==", - "resolved": "https://registry.npmjs.org/xmlbuilder/-/xmlbuilder-15.1.1.tgz", - "integrity": "sha512-yMqGBqtXyeN1e3TGYvgNgDVZ3j84W4cwkOXQswghol6APgZWaff9lnbvN7MHYJOiXsvGPXtjTYJEiC9J2wv9Eg==", "dev": true, "engines": { "node": ">=8.0" @@ -8487,15 +8378,11 @@ "version": "1.0.2", "resolved": "https://registry.npmjs.org/xmlcreate/-/xmlcreate-1.0.2.tgz", "integrity": "sha512-Mbe56Dvj00onbnSo9J0qj/XlY5bfN9KidsOnpd5tRCsR3ekB3hyyNU9fGrTdqNT5ZNvv4BsA2TcQlignsZyVcw==" - "resolved": "https://registry.npmjs.org/xmlcreate/-/xmlcreate-1.0.2.tgz", - "integrity": "sha512-Mbe56Dvj00onbnSo9J0qj/XlY5bfN9KidsOnpd5tRCsR3ekB3hyyNU9fGrTdqNT5ZNvv4BsA2TcQlignsZyVcw==" }, "node_modules/xmlhttprequest-ssl": { "version": "1.5.5", "resolved": "https://registry.npmjs.org/xmlhttprequest-ssl/-/xmlhttprequest-ssl-1.5.5.tgz", "integrity": "sha512-/bFPLUgJrfGUL10AIv4Y7/CUt6so9CLtB/oFxQSHseSDNNCdC6vwwKEqwLN6wNPBg9YWXAiMu8jkf6RPRS/75Q==", - "resolved": "https://registry.npmjs.org/xmlhttprequest-ssl/-/xmlhttprequest-ssl-1.5.5.tgz", - "integrity": "sha512-/bFPLUgJrfGUL10AIv4Y7/CUt6so9CLtB/oFxQSHseSDNNCdC6vwwKEqwLN6wNPBg9YWXAiMu8jkf6RPRS/75Q==", "engines": { "node": ">=0.4.0" } @@ -8541,6 +8428,56 @@ "node": ">=12" } }, + "node_modules/yargs/node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/yargs/node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "dev": true + }, + "node_modules/yargs/node_modules/is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/yargs/node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dev": true, + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/yargs/node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/yarn-or-npm": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/yarn-or-npm/-/yarn-or-npm-3.0.1.tgz", @@ -8629,8 +8566,6 @@ "version": "2.10.0", "resolved": "https://registry.npmjs.org/yauzl/-/yauzl-2.10.0.tgz", "integrity": "sha512-p4a9I6X6nu6IhoGmBqAcbJy1mlC4j27vEPZX9F4L4/vZT3Lyq1VkFHw/V/PUcB9Buo+DG3iHkT0x3Qya58zc3g==", - "resolved": "https://registry.npmjs.org/yauzl/-/yauzl-2.10.0.tgz", - "integrity": "sha512-p4a9I6X6nu6IhoGmBqAcbJy1mlC4j27vEPZX9F4L4/vZT3Lyq1VkFHw/V/PUcB9Buo+DG3iHkT0x3Qya58zc3g==", "dependencies": { "buffer-crc32": "~0.2.3", "fd-slicer": "~1.1.0" @@ -8640,8 +8575,6 @@ "version": "0.1.2", "resolved": "https://registry.npmjs.org/yeast/-/yeast-0.1.2.tgz", "integrity": "sha512-8HFIh676uyGYP6wP13R/j6OJ/1HwJ46snpvzE7aHAN3Ryqh2yX6Xox2B4CUmTwwOIzlG3Bs7ocsP5dZH/R1Qbg==" - "resolved": "https://registry.npmjs.org/yeast/-/yeast-0.1.2.tgz", - "integrity": "sha512-8HFIh676uyGYP6wP13R/j6OJ/1HwJ46snpvzE7aHAN3Ryqh2yX6Xox2B4CUmTwwOIzlG3Bs7ocsP5dZH/R1Qbg==" }, "node_modules/yocto-queue": { "version": "0.1.0", diff --git a/package.json b/package.json index 1124c92a..57ac4dd4 100755 --- a/package.json +++ b/package.json @@ -35,11 +35,11 @@ "marked": "^11.2.0", "minimist": "^1.2.0", "openlayers": "^4.6.5", - "plotly": "^1.0.6", "temp": "^0.8.3", "xml2js": "^0.4.19", "i18next": "^23.8.3", - "i18next-xhr-backend": "^3.2.2" + "i18next-xhr-backend": "^3.2.2", + "wnumb": "^1.2.0" }, "devDependencies": { "@electron-forge/cli": "^7.2.0", diff --git a/src/css/main.css b/src/css/main.css index 5b6f2b8f..9baa8f7b 100644 --- a/src/css/main.css +++ b/src/css/main.css @@ -1001,7 +1001,7 @@ li.active .ic_mag { #content { margin-top: 0; padding: 0; - height: calc(100% - 165px); + height: calc(100% - 145px); /* (port picker 105px, log CLOSED 25px, status bar: 20px + padding) - was: calc(100% - 171px)*/ background-color: white; overflow-x: hidden; diff --git a/src/css/styles.css b/src/css/styles.css index 3038ee0d..f6d20105 100644 --- a/src/css/styles.css +++ b/src/css/styles.css @@ -38,3 +38,4 @@ @import 'tabs/sensors.css'; @import 'tabs/setup.css'; @import 'tabs/sitl.css'; +@import 'groundstation.css'; diff --git a/tabs/adjustments.js b/tabs/adjustments.js index 27542f85..164bb6ee 100644 --- a/tabs/adjustments.js +++ b/tabs/adjustments.js @@ -1,6 +1,18 @@ -/*global $*/ 'use strict'; +const path = require('path'); +const wNumb = require('wnumb/wNumb') + +const mspHelper = require('./../js/msp/MSPHelper'); +const MSPCodes = require('./../js/msp/MSPCodes'); +const MSP = require('./../js/msp'); +const mspQueue = require('./../js/serial_queue'); +const { GUI, TABS } = require('./../js/gui'); +const FC = require('./../js/fc'); +const mspBalancedInterval = require('./../js/msp_balanced_interval'); +const i18n = require('./../js/localization'); + + TABS.adjustments = {}; TABS.adjustments.initialize = function (callback) { @@ -20,7 +32,7 @@ TABS.adjustments.initialize = function (callback) { } function load_html() { - GUI.load(path.join(__dirname, "tabs/adjustments.html"), process_html); + GUI.load(path.join(__dirname, "adjustments.html"), process_html); } MSP.send_message(MSPCodes.MSP_BOXNAMES, false, false, get_adjustment_ranges); @@ -160,11 +172,11 @@ TABS.adjustments.initialize = function (callback) { function process_html() { - var auxChannelCount = RC.active_channels - 4; + var auxChannelCount = FC.RC.active_channels - 4; var modeTableBodyElement = $('.tab-adjustments .adjustments tbody') - for (var adjustmentIndex = 0; adjustmentIndex < ADJUSTMENT_RANGES.length; adjustmentIndex++) { - var newAdjustment = addAdjustment(adjustmentIndex, ADJUSTMENT_RANGES[adjustmentIndex], auxChannelCount); + for (var adjustmentIndex = 0; adjustmentIndex < FC.ADJUSTMENT_RANGES.length; adjustmentIndex++) { + var newAdjustment = addAdjustment(adjustmentIndex, FC.ADJUSTMENT_RANGES[adjustmentIndex], auxChannelCount); modeTableBodyElement.append(newAdjustment); } @@ -175,9 +187,9 @@ TABS.adjustments.initialize = function (callback) { $('a.save').on('click', function () { // update internal data structures based on current UI elements - var requiredAdjustmentRangeCount = ADJUSTMENT_RANGES.length; + var requiredAdjustmentRangeCount = FC.ADJUSTMENT_RANGES.length; - ADJUSTMENT_RANGES = []; + FC.ADJUSTMENT_RANGES = []; var defaultAdjustmentRange = { slotIndex: 0, @@ -205,14 +217,14 @@ TABS.adjustments.initialize = function (callback) { adjustmentFunction: parseInt($(this).find('.functionSelection .function').val()), auxSwitchChannelIndex: parseInt($(this).find('.functionSwitchChannel .channel').val()) }; - ADJUSTMENT_RANGES.push(adjustmentRange); + FC.ADJUSTMENT_RANGES.push(adjustmentRange); } else { - ADJUSTMENT_RANGES.push(defaultAdjustmentRange); + FC.ADJUSTMENT_RANGES.push(defaultAdjustmentRange); } }); - for (var adjustmentRangeIndex = ADJUSTMENT_RANGES.length; adjustmentRangeIndex < requiredAdjustmentRangeCount; adjustmentRangeIndex++) { - ADJUSTMENT_RANGES.push(defaultAdjustmentRange); + for (var adjustmentRangeIndex = FC.ADJUSTMENT_RANGES.length; adjustmentRangeIndex < requiredAdjustmentRangeCount; adjustmentRangeIndex++) { + FC.ADJUSTMENT_RANGES.push(defaultAdjustmentRange); } // @@ -249,7 +261,7 @@ TABS.adjustments.initialize = function (callback) { // data pulling functions used inside interval timer function get_rc_data() { - if (helper.mspQueue.shouldDrop()) { + if (mspQueue.shouldDrop()) { return; } @@ -257,10 +269,10 @@ TABS.adjustments.initialize = function (callback) { } function update_ui() { - var auxChannelCount = RC.active_channels - 4; + var auxChannelCount = FC.RC.active_channels - 4; for (var auxChannelIndex = 0; auxChannelIndex < auxChannelCount; auxChannelIndex++) { - update_marker(auxChannelIndex, RC.channels[auxChannelIndex + 4]); + update_marker(auxChannelIndex, FC.RC.channels[auxChannelIndex + 4]); } } @@ -268,7 +280,7 @@ TABS.adjustments.initialize = function (callback) { update_ui(); // enable data pulling - helper.mspBalancedInterval.add('aux_data_pull', 50, 1, get_rc_data); + mspBalancedInterval.add('aux_data_pull', 50, 1, get_rc_data); GUI.content_ready(callback); } diff --git a/tabs/advanced_tuning.js b/tabs/advanced_tuning.js index 3045cecd..17885eb6 100644 --- a/tabs/advanced_tuning.js +++ b/tabs/advanced_tuning.js @@ -1,5 +1,14 @@ 'use strict'; +const path = require('path'); + +const MSPCodes = require('./../js/msp/MSPCodes'); +const MSP = require('./../js/msp'); +const { GUI, TABS } = require('./../js/gui'); +const FC = require('./../js/fc'); +const Settings = require('./../js/settings'); +const i18n = require('./../js/localization'); + TABS.advanced_tuning = {}; TABS.advanced_tuning.initialize = function (callback) { @@ -11,7 +20,7 @@ TABS.advanced_tuning.initialize = function (callback) { loadHtml(); function loadHtml() { - GUI.load(path.join(__dirname, "tabs/advanced_tuning.html"), Settings.processHtml(function () { + GUI.load(path.join(__dirname, "advanced_tuning.html"), Settings.processHtml(function () { if (FC.isAirplane()) { $('.airplaneTuning').show(); @@ -35,18 +44,18 @@ TABS.advanced_tuning.initialize = function (callback) { GUI.simpleBind(); - i18n.localize();; + i18n.localize();; // Set up required field warnings - $('#launchIdleThr').keyup(function() { + $('#launchIdleThr').on('keyup', () => { TABS.advanced_tuning.checkRequirements_IdleThrottle(); }); - $('#launchIdleDelay').keyup(function() { + $('#launchIdleDelay').on('keyup', () => { TABS.advanced_tuning.checkRequirements_IdleThrottle(); }); - $('#rthHomeAltitude').keyup(function() { + $('#rthHomeAltitude').on('keyup', () => { TABS.advanced_tuning.checkRequirements_LinearDescent(); }); diff --git a/tabs/auxiliary.js b/tabs/auxiliary.js index fc12687d..7fd39225 100644 --- a/tabs/auxiliary.js +++ b/tabs/auxiliary.js @@ -1,5 +1,22 @@ 'use strict'; + +const path = require('path'); +const wNumb = require('wnumb/wNumb') +const Store = require('electron-store'); +const store = new Store(); + +const mspHelper = require('./../js/msp/MSPHelper'); +const MSPCodes = require('./../js/msp/MSPCodes'); +const MSP = require('./../js/msp'); +const mspQueue = require('./../js/serial_queue'); +const mspBalancedInterval = require('./../js/msp_balanced_interval'); +const { GUI, TABS } = require('./../js/gui'); +const FC = require('./../js/fc'); +const adjustBoxNameIfPeripheralWithModeID = require('./../js/peripherals'); +const i18n = require('./../js/localization'); + + var ORIG_AUX_CONFIG_IDS = []; TABS.auxiliary = {}; @@ -16,7 +33,7 @@ TABS.auxiliary.initialize = function (callback) { } function get_rc_data() { - if (SERIAL_CONFIG.ports.length == 0) { + if (FC.SERIAL_CONFIG.ports.length == 0) { MSP.send_message(MSPCodes.MSP_RC, false, false, get_ports_data); } else { MSP.send_message(MSPCodes.MSP_RC, false, false, load_html); @@ -29,7 +46,7 @@ TABS.auxiliary.initialize = function (callback) { function load_html() { sort_modes_for_display(); - GUI.load(path.join(__dirname, "tabs/auxiliary.html"), process_html); + GUI.load(path.join(__dirname, "auxiliary.html"), process_html); } MSP.send_message(MSPCodes.MSP_BOXNAMES, false, false, get_mode_ranges); @@ -53,21 +70,21 @@ TABS.auxiliary.initialize = function (callback) { var found = false; var sortedID = 0; - for (let i=0; i AUX_CONFIG.length) { + if (tmpAUX_CONFIG.length > FC.AUX_CONFIG.length) { for (let i=0; i p.then((delay) => new Promise((resolve) => { - helper.timeout.add('CLI_send_slowly', () => { + timeout.add('CLI_send_slowly', () => { let processingDelay = TABS.cli.lineDelayMs; if (line.toLowerCase().startsWith('profile')) { processingDelay = TABS.cli.profileSwitchDelayMs; @@ -121,7 +133,7 @@ TABS.cli.initialize = function (callback) { ); } - GUI.load(path.join(__dirname, "tabs/cli.html"), function () { + GUI.load(path.join(__dirname, "cli.html"), function () { // translate to user-selected language i18n.localize(); @@ -235,7 +247,7 @@ TABS.cli.initialize = function (callback) { isolateScroll: false, title: i18n.getMessage("cliConfirmSnippetDialogTitle"), content: $('#snippetpreviewcontent'), - onCreated: () => $("#snippetpreviewcontent a.confirm").on('click', function () executeSnippet()), + onCreated: () => $("#snippetpreviewcontent a.confirm").on('click', executeSnippet), }); } previewArea.val(result); @@ -260,7 +272,7 @@ TABS.cli.initialize = function (callback) { // Tab key detection must be on keydown, // `keypress`/`keyup` happens too late, as `textarea` will have already lost focus. - textarea.keydown(function (event) { + textarea.on('keydown', function (event) { const tabKeyCode = 9; if (event.which == tabKeyCode) { // prevent default tabbing behaviour @@ -281,7 +293,7 @@ TABS.cli.initialize = function (callback) { } }); - textarea.keypress(function (event) { + textarea.on('keypress', function (event) { const enterKeyCode = 13; if (event.which == enterKeyCode) { event.preventDefault(); // prevent the adding of new line @@ -304,7 +316,7 @@ TABS.cli.initialize = function (callback) { } }); - textarea.keyup(function (event) { + textarea.on('keyup', function (event) { var keyUp = {38: true}, keyDown = {40: true}; @@ -324,7 +336,7 @@ TABS.cli.initialize = function (callback) { // give input element user focus textarea.focus(); - helper.timeout.add('enter_cli', function enter_cli() { + timeout.add('enter_cli', function enter_cli() { // Enter CLI mode var bufferOut = new ArrayBuffer(1); var bufView = new Uint8Array(bufferOut); @@ -341,7 +353,7 @@ TABS.cli.initialize = function (callback) { if (CONFIGURATOR.connection.type == ConnectionType.BLE) { let delay = CONFIGURATOR.connection.deviceDescription.delay; if (delay > 0) { - helper.timeout.add('cli_delay', () => { + timeout.add('cli_delay', () => { self.send(getCliCommand("cli_delay " + delay + '\n', TABS.cli.cliBuffer)); self.send(getCliCommand('# ' + i18n.getMessage('connectionBleCliEnter') + '\n', TABS.cli.cliBuffer)); }, 400); @@ -523,7 +535,7 @@ TABS.cli.cleanup = function (callback) { // (another approach is however much more complicated): // we can setup an interval asking for data lets say every 200ms, when data arrives, callback will be triggered and tab switched // we could probably implement this someday - helper.timeout.add('waiting_for_bootup', function waiting_for_bootup() { + timeout.add('waiting_for_bootup', function waiting_for_bootup() { if (callback) callback(); }, 1000); // if we dont allow enough time to reboot, CRC of "first" command sent will fail, keep an eye for this one CONFIGURATOR.cliActive = false; diff --git a/tabs/configuration.js b/tabs/configuration.js index e32621bc..04f0bca6 100644 --- a/tabs/configuration.js +++ b/tabs/configuration.js @@ -1,6 +1,19 @@ -/*global chrome,GUI,FC_CONFIG,$,mspHelper,googleAnalytics,ADVANCED_CONFIG,VTX_CONFIG,CONFIG,MSPChainerClass,BOARD_ALIGNMENT,TABS,MISC*/ 'use strict'; +const path = require('path'); + +const MSPChainerClass = require('./../js/msp/MSPchainer'); +const mspHelper = require('./../js/msp/MSPHelper'); +const MSPCodes = require('./../js/msp/MSPCodes'); +const MSP = require('./../js/msp'); +const { GUI, TABS } = require('./../js/gui'); +const FC = require('./../js/fc'); +const interval = require('./../js/intervals'); +const VTX = require('./../js/vtx'); +const i18n = require('./../js/localization'); +const Settings = require('./../js/settings'); +const features = require('./../js/feature_framework'); + TABS.configuration = {}; TABS.configuration.initialize = function (callback, scrollPosition) { @@ -61,7 +74,7 @@ TABS.configuration.initialize = function (callback, scrollPosition) { } function load_html() { - GUI.load(path.join(__dirname, "tabs/configuration.html"), Settings.processHtml(process_html)); + GUI.load(path.join(__dirname, "configuration.html"), Settings.processHtml(process_html)); } function process_html() { @@ -69,20 +82,20 @@ TABS.configuration.initialize = function (callback, scrollPosition) { let i; // generate features - var features = FC.getFeatures(); + var fcFeatures = FC.getFeatures(); var features_e = $('.features'); - for (let i = 0; i < features.length; i++) { + for (let i = 0; i < fcFeatures.length; i++) { var row_e, tips = [], feature_tip_html = ''; - if (features[i].showNameInTip) { - tips.push(i18n.getMessage("manualEnablingTemplate").replace("{name}", features[i].name)); + if (fcFeatures[i].showNameInTip) { + tips.push(i18n.getMessage("manualEnablingTemplate").replace("{name}", fcFeatures[i].name)); } - if (features[i].haveTip) { - tips.push(i18n.getMessage("feature" + features[i].name + "Tip")); + if (fcFeatures[i].haveTip) { + tips.push(i18n.getMessage("feature" + fcFeatures[i].name + "Tip")); } if (tips.length > 0) { @@ -90,35 +103,35 @@ TABS.configuration.initialize = function (callback, scrollPosition) { } row_e = $('
' + - '' + - '
'); features_e.each(function () { - if ($(this).hasClass(features[i].group)) { + if ($(this).hasClass(fcFeatures[i].group)) { $(this).after(row_e); } }); } - helper.features.updateUI($('.tab-configuration'), FEATURES); + features.updateUI($('.tab-configuration'), FC.FEATURES); // translate to user-selected language i18n.localize();; // VTX var config_vtx = $('.config-vtx'); - if (VTX_CONFIG.device_type != VTX.DEV_UNKNOWN) { + if (FC.VTX_CONFIG.device_type != VTX.DEV_UNKNOWN) { var vtx_band = $('#vtx_band'); vtx_band.empty(); var vtx_no_band_note = $('#vtx_no_band'); - if (VTX_CONFIG.band < VTX.BAND_MIN || VTX_CONFIG.band > VTX.BAND_MAX) { + if (FC.VTX_CONFIG.band < VTX.BAND_MIN || FC.VTX_CONFIG.band > VTX.BAND_MAX) { var noBandName = i18n.getMessage("configurationNoBand"); $('').appendTo(vtx_band); vtx_no_band_note.show(); @@ -128,41 +141,41 @@ TABS.configuration.initialize = function (callback, scrollPosition) { for (var ii = 0; ii < VTX.BANDS.length; ii++) { var band_name = VTX.BANDS[ii].name; var option = $(''); - if (VTX.BANDS[ii].code == VTX_CONFIG.band) { + if (VTX.BANDS[ii].code == FC.VTX_CONFIG.band) { option.prop('selected', true); } option.appendTo(vtx_band); } vtx_band.on('change', function () { - VTX_CONFIG.band = parseInt($(this).val()); + FC.VTX_CONFIG.band = parseInt($(this).val()); }); var vtx_channel = $('#vtx_channel'); vtx_channel.empty(); for (var ii = VTX.CHANNEL_MIN; ii <= VTX.CHANNEL_MAX; ii++) { var option = $(''); - if (ii == VTX_CONFIG.channel) { + if (ii == FC.VTX_CONFIG.channel) { option.prop('selected', true); } option.appendTo(vtx_channel); } vtx_channel.on('change', function () { - VTX_CONFIG.channel = parseInt($(this).val()); + FC.VTX_CONFIG.channel = parseInt($(this).val()); }); var vtx_power = $('#vtx_power'); vtx_power.empty(); - var minPower = VTX.getMinPower(VTX_CONFIG.device_type); - var maxPower = VTX.getMaxPower(VTX_CONFIG.device_type); + var minPower = VTX.getMinPower(FC.VTX_CONFIG.device_type); + var maxPower = VTX.getMaxPower(FC.VTX_CONFIG.device_type); for (var ii = minPower; ii <= maxPower; ii++) { var option = $(''); - if (ii == VTX_CONFIG.power) { + if (ii == FC.VTX_CONFIG.power) { option.prop('selected', true); } option.appendTo(vtx_power); } vtx_power.on('change', function () { - VTX_CONFIG.power = parseInt($(this).val()); + FC.FC.VTX_CONFIG.power = parseInt($(this).val()); }); var vtx_low_power_disarm = $('#vtx_low_power_disarm'); @@ -173,13 +186,13 @@ TABS.configuration.initialize = function (callback, scrollPosition) { name = ii; } var option = $(''); - if (ii == VTX_CONFIG.low_power_disarm) { + if (ii == FC.VTX_CONFIG.low_power_disarm) { option.prop('selected', true); } option.appendTo(vtx_low_power_disarm); } vtx_low_power_disarm.on('change', function () { - VTX_CONFIG.low_power_disarm = parseInt($(this).val()); + FC.VTX_CONFIG.low_power_disarm = parseInt($(this).val()); }); config_vtx.show(); @@ -194,32 +207,32 @@ TABS.configuration.initialize = function (callback, scrollPosition) { $('#content').scrollTop((scrollPosition) ? scrollPosition : 0); // fill board alignment - $('input[name="board_align_yaw"]').val((BOARD_ALIGNMENT.yaw / 10.0).toFixed(1)); + $('input[name="board_align_yaw"]').val((FC.BOARD_ALIGNMENT.yaw / 10.0).toFixed(1)); // fill magnetometer //UPDATE: moved to GPS tab and hidden - //$('#mag_declination').val(MISC.mag_declination); + //$('#mag_declination').val(FC.MISC.mag_declination); // fill battery voltage - $('#voltagesource').val(MISC.voltage_source); - $('#cells').val(MISC.battery_cells); - $('#celldetectvoltage').val(MISC.vbatdetectcellvoltage); - $('#mincellvoltage').val(MISC.vbatmincellvoltage); - $('#maxcellvoltage').val(MISC.vbatmaxcellvoltage); - $('#warningcellvoltage').val(MISC.vbatwarningcellvoltage); - $('#voltagescale').val(MISC.vbatscale); + $('#voltagesource').val(FC.MISC.voltage_source); + $('#cells').val(FC.MISC.battery_cells); + $('#celldetectvoltage').val(FC.MISC.vbatdetectcellvoltage); + $('#mincellvoltage').val(FC.MISC.vbatmincellvoltage); + $('#maxcellvoltage').val(FC.MISC.vbatmaxcellvoltage); + $('#warningcellvoltage').val(FC.MISC.vbatwarningcellvoltage); + $('#voltagescale').val(FC.MISC.vbatscale); // fill current - $('#currentscale').val(CURRENT_METER_CONFIG.scale); - $('#currentoffset').val(CURRENT_METER_CONFIG.offset / 10); + $('#currentscale').val(FC.CURRENT_METER_CONFIG.scale); + $('#currentoffset').val(FC.CURRENT_METER_CONFIG.offset / 10); // fill battery capacity - $('#battery_capacity').val(MISC.battery_capacity); - let batCapWarn = Math.round(MISC.battery_capacity_warning * 100 / MISC.battery_capacity); + $('#battery_capacity').val(FC.MISC.battery_capacity); + let batCapWarn = Math.round(FC.MISC.battery_capacity_warning * 100 / FC.MISC.battery_capacity); $('#battery_capacity_warning').val(isNaN(batCapWarn) ? "" : batCapWarn); - let batCapWarnCrit = Math.round(MISC.battery_capacity_critical * 100 / MISC.battery_capacity); + let batCapWarnCrit = Math.round(FC.MISC.battery_capacity_critical * 100 / FC.MISC.battery_capacity); $('#battery_capacity_critical').val(isNaN(batCapWarnCrit) ? "" : batCapWarnCrit); - $('#battery_capacity_unit').val(MISC.battery_capacity_unit); + $('#battery_capacity_unit').val(FC.MISC.battery_capacity_unit); let $i2cSpeed = $('#i2c_speed'), $i2cSpeedInfo = $('#i2c_speed-info'); @@ -256,33 +269,32 @@ TABS.configuration.initialize = function (callback, scrollPosition) { $('a.save').on('click', function () { //UPDATE: moved to GPS tab and hidden - //MISC.mag_declination = parseFloat($('#mag_declination').val()); + //FC.MISC.mag_declination = parseFloat($('#mag_declination').val()); - MISC.battery_cells = parseInt($('#cells').val()); - MISC.voltage_source = parseInt($('#voltagesource').val()); - MISC.vbatdetectcellvoltage = parseFloat($('#celldetectvoltage').val()); - MISC.vbatmincellvoltage = parseFloat($('#mincellvoltage').val()); - MISC.vbatmaxcellvoltage = parseFloat($('#maxcellvoltage').val()); - MISC.vbatwarningcellvoltage = parseFloat($('#warningcellvoltage').val()); - MISC.vbatscale = parseInt($('#voltagescale').val()); + FC.MISC.battery_cells = parseInt($('#cells').val()); + FC.MISC.voltage_source = parseInt($('#voltagesource').val()); + FC.MISC.vbatdetectcellvoltage = parseFloat($('#celldetectvoltage').val()); + FC.MISC.vbatmincellvoltage = parseFloat($('#mincellvoltage').val()); + FC.MISC.vbatmaxcellvoltage = parseFloat($('#maxcellvoltage').val()); + FC.MISC.vbatwarningcellvoltage = parseFloat($('#warningcellvoltage').val()); + FC.MISC.vbatscale = parseInt($('#voltagescale').val()); - MISC.battery_capacity = parseInt($('#battery_capacity').val()); - MISC.battery_capacity_warning = parseInt($('#battery_capacity_warning').val() * MISC.battery_capacity / 100); - MISC.battery_capacity_critical = parseInt($('#battery_capacity_critical').val() * MISC.battery_capacity / 100); - MISC.battery_capacity_unit = $('#battery_capacity_unit').val(); + FC.MISC.battery_capacity = parseInt($('#battery_capacity').val()); + FC.MISC.battery_capacity_warning = parseInt($('#battery_capacity_warning').val() * FC.MISC.battery_capacity / 100); + FC.MISC.battery_capacity_critical = parseInt($('#battery_capacity_critical').val() * FC.MISC.battery_capacity / 100); + FC.MISC.battery_capacity_unit = $('#battery_capacity_unit').val(); - helper.features.reset(); - helper.features.fromUI($('.tab-configuration')); - helper.features.execute(function () { - CURRENT_METER_CONFIG.scale = parseInt($('#currentscale').val()); - CURRENT_METER_CONFIG.offset = Math.round(parseFloat($('#currentoffset').val()) * 10); + features.reset(); + features.fromUI($('.tab-configuration')); + features.execute(function () { + FC.CURRENT_METER_CONFIG.scale = parseInt($('#currentscale').val()); + FC.CURRENT_METER_CONFIG.offset = Math.round(parseFloat($('#currentoffset').val()) * 10); saveChainer.execute(); }); }); - - helper.interval.add('config_load_analog', function () { - $('#batteryvoltage').val([ANALOG.voltage.toFixed(2)]); - $('#batterycurrent').val([ANALOG.amperage.toFixed(2)]); + interval.add('config_load_analog', function () { + $('#batteryvoltage').val([FC.ANALOG.voltage.toFixed(2)]); + $('#batterycurrent').val([FC.ANALOG.amperage.toFixed(2)]); }, 100, true); // 10 fps GUI.content_ready(callback); diff --git a/tabs/ez_tune.js b/tabs/ez_tune.js index b673a4e9..6282e695 100644 --- a/tabs/ez_tune.js +++ b/tabs/ez_tune.js @@ -1,6 +1,18 @@ -/*global chrome,helper,mspHelper*/ 'use strict'; +const path = require('path'); + +const MSPChainerClass = require('./../js/msp/MSPchainer'); +const mspHelper = require('./../js/msp/MSPHelper'); +const MSPCodes = require('./../js/msp/MSPCodes'); +const MSP = require('./../js/msp'); +const { GUI, TABS } = require('./../js/gui'); +const FC = require('./../js/fc'); +const Settings = require('./../js/settings'); +const i18n = require('./../js/localization'); +const tabs = require('./../js/tabs'); +const features = require('./../js/feature_framework'); + TABS.ez_tune = { }; @@ -50,7 +62,7 @@ TABS.ez_tune.initialize = function (callback) { } function load_html() { - GUI.load(path.join(__dirname, "tabs/ez_tune.html"), Settings.processHtml(process_html)); + GUI.load(path.join(__dirname, "ez_tune.html"), Settings.processHtml(process_html)); } function getYawPidScale(input) { @@ -103,20 +115,20 @@ TABS.ez_tune.initialize = function (callback) { function process_html() { i18n.localize();; - helper.tabs.init($('.tab-ez_tune')); - helper.features.updateUI($('.tab-ez_tune'), FEATURES); + tabs.init($('.tab-ez_tune')); + features.updateUI($('.tab-ez_tune'), FC.FEATURES); - $("#ez_tune_enabled").prop('checked', EZ_TUNE.enabled); + $("#ez_tune_enabled").prop('checked', FC.EZ_TUNE.enabled); - GUI.sliderize($('#ez_tune_filter_hz'), EZ_TUNE.filterHz, 10, 300); - GUI.sliderize($('#ez_tune_axis_ratio'), EZ_TUNE.axisRatio, 25, 175); - GUI.sliderize($('#ez_tune_response'), EZ_TUNE.response, 0, 200); - GUI.sliderize($('#ez_tune_damping'), EZ_TUNE.damping, 0, 200); - GUI.sliderize($('#ez_tune_stability'), EZ_TUNE.stability, 0, 200); - GUI.sliderize($('#ez_tune_aggressiveness'), EZ_TUNE.aggressiveness, 0, 200); + GUI.sliderize($('#ez_tune_filter_hz'), FC.EZ_TUNE.filterHz, 10, 300); + GUI.sliderize($('#ez_tune_axis_ratio'), FC.EZ_TUNE.axisRatio, 25, 175); + GUI.sliderize($('#ez_tune_response'), FC.EZ_TUNE.response, 0, 200); + GUI.sliderize($('#ez_tune_damping'), FC.EZ_TUNE.damping, 0, 200); + GUI.sliderize($('#ez_tune_stability'), FC.EZ_TUNE.stability, 0, 200); + GUI.sliderize($('#ez_tune_aggressiveness'), FC.EZ_TUNE.aggressiveness, 0, 200); - GUI.sliderize($('#ez_tune_rate'), EZ_TUNE.rate, 0, 200); - GUI.sliderize($('#ez_tune_expo'), EZ_TUNE.expo, 0, 200); + GUI.sliderize($('#ez_tune_rate'), FC.EZ_TUNE.rate, 0, 200); + GUI.sliderize($('#ez_tune_expo'), FC.EZ_TUNE.expo, 0, 200); $('.ez-element').on('updated', function () { @@ -132,19 +144,19 @@ TABS.ez_tune.initialize = function (callback) { $('a.update').on('click', function () { if ($("#ez_tune_enabled").is(":checked")) { - EZ_TUNE.enabled = 1; + FC.EZ_TUNE.enabled = 1; } else { - EZ_TUNE.enabled = 0; + FC.EZ_TUNE.enabled = 0; } - EZ_TUNE.filterHz = $('#ez_tune_filter_hz').val(); - EZ_TUNE.axisRatio = $('#ez_tune_axis_ratio').val(); - EZ_TUNE.response = $('#ez_tune_response').val(); - EZ_TUNE.damping = $('#ez_tune_damping').val(); - EZ_TUNE.stability = $('#ez_tune_stability').val(); - EZ_TUNE.aggressiveness = $('#ez_tune_aggressiveness').val(); - EZ_TUNE.rate = $('#ez_tune_rate').val(); - EZ_TUNE.expo = $('#ez_tune_expo').val(); + FC.EZ_TUNE.filterHz = $('#ez_tune_filter_hz').val(); + FC.EZ_TUNE.axisRatio = $('#ez_tune_axis_ratio').val(); + FC.EZ_TUNE.response = $('#ez_tune_response').val(); + FC.EZ_TUNE.damping = $('#ez_tune_damping').val(); + FC.EZ_TUNE.stability = $('#ez_tune_stability').val(); + FC.EZ_TUNE.aggressiveness = $('#ez_tune_aggressiveness').val(); + FC.EZ_TUNE.rate = $('#ez_tune_rate').val(); + FC.EZ_TUNE.expo = $('#ez_tune_expo').val(); saveChainer.execute(); }); diff --git a/tabs/failsafe.js b/tabs/failsafe.js index a8382d80..8f6f9d19 100644 --- a/tabs/failsafe.js +++ b/tabs/failsafe.js @@ -1,5 +1,15 @@ 'use strict'; +const path = require('path'); + +const mspHelper = require('./../js/msp/MSPHelper'); +const MSPCodes = require('./../js/msp/MSPCodes'); +const MSP = require('./../js/msp'); +const { GUI, TABS } = require('./../js/gui'); +const FC = require('./../js/fc'); +const Settings = require('./../js/settings'); +const i18n = require('./../js/localization'); + TABS.failsafe = {}; TABS.failsafe.initialize = function (callback, scrollPosition) { @@ -14,7 +24,7 @@ TABS.failsafe.initialize = function (callback, scrollPosition) { } function load_html() { - GUI.load(path.join(__dirname, "tabs/failsafe.html"), Settings.processHtml(function() { + GUI.load(path.join(__dirname, "failsafe.html"), Settings.processHtml(function() { GUI.simpleBind(); // translate to user-selected language @@ -48,25 +58,25 @@ TABS.failsafe.initialize = function (callback, scrollPosition) { }); // switch (MSPHelper.getSetting('failsafe_procedure')) { // Use once #7734 is merged - switch (FAILSAFE_CONFIG.failsafe_procedure) { + switch (FC.FAILSAFE_CONFIG.failsafe_procedure) { default: case 0: - let element = $('input[id="land"]'); + var element = $('input[id="land"]'); element.prop('checked', true); element.trigger('change'); break; case 1: - element = $('input[id="drop"]'); + var element = $('input[id="drop"]'); element.prop('checked', true); element.trigger('change'); break; case 2: - element = $('input[id="rth"]'); + var element = $('input[id="rth"]'); element.prop('checked', true); element.trigger('change'); break; case 3: - element = $('input[id="nothing"]'); + var element = $('input[id="nothing"]'); element.prop('checked', true); element.trigger('change'); break; @@ -99,13 +109,13 @@ TABS.failsafe.initialize = function (callback, scrollPosition) { $('a.save').on('click', function () { if ($('input[id="land"]').is(':checked')) { - FAILSAFE_CONFIG.failsafe_procedure = 0; + FC.FAILSAFE_CONFIG.failsafe_procedure = 0; } else if ($('input[id="drop"]').is(':checked')) { - FAILSAFE_CONFIG.failsafe_procedure = 1; + FC.FAILSAFE_CONFIG.failsafe_procedure = 1; } else if ($('input[id="rth"]').is(':checked')) { - FAILSAFE_CONFIG.failsafe_procedure = 2; + FC.FAILSAFE_CONFIG.failsafe_procedure = 2; } else if ($('input[id="nothing"]').is(':checked')) { - FAILSAFE_CONFIG.failsafe_procedure = 3; + FC.FAILSAFE_CONFIG.failsafe_procedure = 3; } MSP.send_message(MSPCodes.MSP_SET_FAILSAFE_CONFIG, mspHelper.crunch(MSPCodes.MSP_SET_FAILSAFE_CONFIG), false, savePhaseTwo); @@ -122,7 +132,7 @@ TABS.failsafe.initialize = function (callback, scrollPosition) { var self = this; MSP.promise(MSPCodes.MSP_EEPROM_WRITE); setTimeout(function () { - $(self).html(oldText); + $(self).html(''); }, 2000); reboot(); }); diff --git a/tabs/gps.js b/tabs/gps.js index 8918820c..3d7ad694 100644 --- a/tabs/gps.js +++ b/tabs/gps.js @@ -1,6 +1,26 @@ -/*global $,MSPChainerClass,mspHelper,MSPCodes,GUI,chrome,MSP,TABS,Settings,helper,ol*/ 'use strict'; +const path = require('path') +const ol = require('openlayers') +const semver = require('semver'); + +const MSPChainerClass = require('./../js/msp/MSPchainer'); +const mspHelper = require('./../js/msp/MSPHelper'); +const MSPCodes = require('./../js/msp/MSPCodes'); +const MSP = require('./../js/msp'); +const mspBalancedInterval = require('./../js/msp_balanced_interval.js'); +const mspQueue = require('./../js/serial_queue.js'); +const { GUI, TABS } = require('./../js/gui'); +const FC = require('./../js/fc'); +const i18n = require('./../js/localization'); +const Settings = require('./../js/settings'); +const serialPortHelper = require('./../js/serialPortHelper'); +const features = require('./../js/feature_framework'); +const { globalSettings } = require('./../js/globalSettings'); +const jBox = require('./../js/libraries/jBox/jBox.min.js'); +const SerialBackend = require('../js/serial_backend'); + + TABS.gps = {}; TABS.gps.initialize = function (callback) { @@ -74,7 +94,7 @@ TABS.gps.initialize = function (callback) { } function load_html() { - GUI.load(path.join(__dirname, "tabs/gps.html"), Settings.processHtml(process_html)); + GUI.load(path.join(__dirname, "gps.html"), Settings.processHtml(process_html)); } let cursorInitialized = false; @@ -89,15 +109,15 @@ TABS.gps.initialize = function (callback) { function process_html() { i18n.localize();; - var features = FC.getFeatures(); + var fcFeatures = FC.getFeatures(); - helper.features.updateUI($('.tab-gps'), FEATURES); + features.updateUI($('.tab-gps'), FC.FEATURES); //Generate serial port options let $port = $('#gps_port'); let $baud = $('#gps_baud'); - let ports = helper.serialPortHelper.getPortIdentifiersForFunction('GPS'); + let ports = serialPortHelper.getPortIdentifiersForFunction('GPS'); let currentPort = null; @@ -105,7 +125,7 @@ TABS.gps.initialize = function (callback) { currentPort = ports[0]; } - let availablePorts = helper.serialPortHelper.getPortList(); + let availablePorts = serialPortHelper.getPortList(); //Generate port select $port.append(''); @@ -115,18 +135,18 @@ TABS.gps.initialize = function (callback) { } //Generate baud select - helper.serialPortHelper.getBauds('SENSOR').forEach(function (baud) { + serialPortHelper.getBauds('SENSOR').forEach(function (baud) { $baud.append(''); }); //Select defaults if (currentPort !== null) { $port.val(currentPort); - let portConfig = helper.serialPortHelper.getPortByIdentifier(currentPort); + let portConfig = serialPortHelper.getPortByIdentifier(currentPort); $baud.val(portConfig.sensors_baudrate); } else { $port.val(-1); - $baud.val(helper.serialPortHelper.getRuleByName('GPS').defaultBaud); + $baud.val(serialPortHelper.getRuleByName('GPS').defaultBaud); } // generate GPS @@ -139,10 +159,10 @@ TABS.gps.initialize = function (callback) { } gps_protocol_e.on('change', function () { - MISC.gps_type = parseInt($(this).val()); + FC.MISC.gps_type = parseInt($(this).val()); }); - gps_protocol_e.val(MISC.gps_type); + gps_protocol_e.val(FC.MISC.gps_type); gps_protocol_e.trigger('change'); var gps_ubx_sbas_e = $('#gps_ubx_sbas'); @@ -151,10 +171,10 @@ TABS.gps.initialize = function (callback) { } gps_ubx_sbas_e.on('change', function () { - MISC.gps_ubx_sbas = parseInt($(this).val()); + FC.MISC.gps_ubx_sbas = parseInt($(this).val()); }); - gps_ubx_sbas_e.val(MISC.gps_ubx_sbas); + gps_ubx_sbas_e.val(FC.MISC.gps_ubx_sbas); let mapView = new ol.View({ center: ol.proj.fromLonLat([0, 0]), @@ -179,8 +199,8 @@ TABS.gps.initialize = function (callback) { } $("#center_button").on('click', function () { - let lat = GPS_DATA.lat / 10000000; - let lon = GPS_DATA.lon / 10000000; + let lat = FC.GPS_DATA.lat / 10000000; + let lon = FC.GPS_DATA.lon / 10000000; let center = ol.proj.fromLonLat([lon, lat]); mapView.setCenter(center); }); @@ -243,39 +263,39 @@ TABS.gps.initialize = function (callback) { function update_ui() { - let lat = GPS_DATA.lat / 10000000; - let lon = GPS_DATA.lon / 10000000; + let lat = FC.GPS_DATA.lat / 10000000; + let lon = FC.GPS_DATA.lon / 10000000; let gpsFixType = i18n.getMessage('gpsFixNone'); - if (GPS_DATA.fix >= 2) { + if (FC.GPS_DATA.fix >= 2) { gpsFixType = i18n.getMessage('gpsFix3D'); - } else if (GPS_DATA.fix >= 1) { + } else if (FC.GPS_DATA.fix >= 1) { gpsFixType = i18n.getMessage('gpsFix2D'); } $('.GPS_info td.fix').html(gpsFixType); - $('.GPS_info td.alt').text(GPS_DATA.alt + ' m'); + $('.GPS_info td.alt').text(FC.GPS_DATA.alt + ' m'); $('.GPS_info td.lat').text(lat.toFixed(4) + ' deg'); $('.GPS_info td.lon').text(lon.toFixed(4) + ' deg'); - $('.GPS_info td.speed').text(GPS_DATA.speed + ' cm/s'); - $('.GPS_info td.sats').text(GPS_DATA.numSat); - $('.GPS_info td.distToHome').text(GPS_DATA.distanceToHome + ' m'); + $('.GPS_info td.speed').text(FC.GPS_DATA.speed + ' cm/s'); + $('.GPS_info td.sats').text(FC.GPS_DATA.numSat); + $('.GPS_info td.distToHome').text(FC.GPS_DATA.distanceToHome + ' m'); let gpsRate = 0; - if (GPS_DATA.messageDt > 0) { - gpsRate = 1000 / GPS_DATA.messageDt; + if (FC.GPS_DATA.messageDt > 0) { + gpsRate = 1000 / FC.GPS_DATA.messageDt; } - $('.GPS_stat td.messages').text(GPS_DATA.packetCount); + $('.GPS_stat td.messages').text(FC.GPS_DATA.packetCount); $('.GPS_stat td.rate').text(gpsRate.toFixed(1) + ' Hz'); - $('.GPS_stat td.errors').text(GPS_DATA.errors); - $('.GPS_stat td.timeouts').text(GPS_DATA.timeouts); - $('.GPS_stat td.eph').text((GPS_DATA.eph / 100).toFixed(2) + ' m'); - $('.GPS_stat td.epv').text((GPS_DATA.epv / 100).toFixed(2) + ' m'); - $('.GPS_stat td.hdop').text((GPS_DATA.hdop / 100).toFixed(2)); + $('.GPS_stat td.errors').text(FC.GPS_DATA.errors); + $('.GPS_stat td.timeouts').text(FC.GPS_DATA.timeouts); + $('.GPS_stat td.eph').text((FC.GPS_DATA.eph / 100).toFixed(2) + ' m'); + $('.GPS_stat td.epv').text((FC.GPS_DATA.epv / 100).toFixed(2) + ' m'); + $('.GPS_stat td.hdop').text((FC.GPS_DATA.hdop / 100).toFixed(2)); //Update map - if (GPS_DATA.fix >= 2) { + if (FC.GPS_DATA.fix >= 2) { let center = ol.proj.fromLonLat([lon, lat]); @@ -316,7 +336,7 @@ TABS.gps.initialize = function (callback) { } - if (semver.gte(CONFIG.flightControllerVersion, "7.1.0")) { + if (semver.gte(FC.CONFIG.flightControllerVersion, "7.1.0")) { MSP.send_message(MSPCodes.MSP2_ADSB_VEHICLE_LIST, false, false, function () { //ADSB vehicles @@ -324,8 +344,8 @@ TABS.gps.initialize = function (callback) { vehicleVectorSource.clear(); } - for (let key in ADSB_VEHICLES.vehicles) { - let vehicle = ADSB_VEHICLES.vehicles[key]; + for (let key in FC.ADSB_VEHICLES.vehicles) { + let vehicle = FC.ADSB_VEHICLES.vehicles[key]; if (!vehiclesCursorInitialized) { vehiclesCursorInitialized = true; @@ -380,14 +400,14 @@ TABS.gps.initialize = function (callback) { * enable data pulling * GPS is usually refreshed at 5Hz, there is no reason to pull it much more often, really... */ - helper.mspBalancedInterval.add('gps_pull', 200, 3, function gps_update() { + mspBalancedInterval.add('gps_pull', 200, 3, function gps_update() { // avoid usage of the GPS commands until a GPS sensor is detected for targets that are compiled without GPS support. - if (!have_sensor(CONFIG.activeSensors, 'gps')) { + if (!SerialBackend.have_sensor(FC.CONFIG.activeSensors, 'gps')) { update_ui(); return; } - if (helper.mspQueue.shouldDrop()) { + if (mspQueue.shouldDrop()) { return; } @@ -396,25 +416,10 @@ TABS.gps.initialize = function (callback) { $('a.save').on('click', function () { - if (FC.isFeatureEnabled('GPS', features)) { - googleAnalytics.sendEvent('Setting', 'GpsProtocol', gpsProtocols[MISC.gps_type]); - googleAnalytics.sendEvent('Setting', 'GpsSbas', gpsSbas[MISC.gps_ubx_sbas]); - } - - googleAnalytics.sendEvent('Setting', 'GPSEnabled', FC.isFeatureEnabled('GPS', features) ? "true" : "false"); - - for (var i = 0; i < features.length; i++) { - var featureName = features[i].name; - if (FC.isFeatureEnabled(featureName, features)) { - googleAnalytics.sendEvent('Setting', 'Feature', featureName); - } - } - - helper.serialPortHelper.set($port.val(), 'GPS', $baud.val()); - - helper.features.reset(); - helper.features.fromUI($('.tab-gps')); - helper.features.execute(function () { + serialPortHelper.set($port.val(), 'GPS', $baud.val()); + features.reset(); + features.fromUI($('.tab-gps')); + features.execute(function () { saveChainer.execute(); }); }); diff --git a/tabs/landing.js b/tabs/landing.js index a5da4b48..ee8de90d 100644 --- a/tabs/landing.js +++ b/tabs/landing.js @@ -12,13 +12,6 @@ landing.initialize = function (callback) { } GUI.load(path.join(__dirname, "landing.html"), function () { i18n.localize(); - - /* - $('.tab-landing a').on('click', function () { - googleAnalytics.sendEvent('ExternalUrls', 'Click', $(this).prop('href')); - }); - */ - GUI.content_ready(callback); }); @@ -28,5 +21,4 @@ landing.cleanup = function (callback) { if (callback) callback(); }; -TABS.landing = landing; -module.exports = landing; +TABS.landing = landing; \ No newline at end of file diff --git a/tabs/led_strip.js b/tabs/led_strip.js index 0bffb9df..b6b29e82 100644 --- a/tabs/led_strip.js +++ b/tabs/led_strip.js @@ -1,5 +1,14 @@ 'use strict'; +const path = require('path'); + +const mspHelper = require('./../js/msp/MSPHelper'); +const MSPCodes = require('./../js/msp/MSPCodes'); +const MSP = require('./../js/msp'); +const { GUI, TABS } = require('./../js/gui'); +const FC = require('./../js/fc'); +const i18n = require('./../js/localization'); + TABS.led_strip = { wireMode: false, directions: ['n', 'e', 's', 'w', 'u', 'd'], @@ -34,7 +43,7 @@ TABS.led_strip.initialize = function (callback, scrollPosition) { } function load_html() { - GUI.load(path.join(__dirname, "tabs/led_strip.html"), process_html); + GUI.load(path.join(__dirname, "led_strip.html"), process_html); } load_led_config(); @@ -132,7 +141,7 @@ TABS.led_strip.initialize = function (callback, scrollPosition) { // Mode Color Buttons $('.mode_colors').on('click', 'button', function() { var that = this; - LED_MODE_COLORS.forEach(function(mc) { + FC.LED_MODE_COLORS.forEach(function(mc) { if ($(that).is('.mode_color-' + mc.mode + '-' + mc.direction)) { if ($(that).is('.btnOn')) { $(that).removeClass('btnOn'); @@ -286,7 +295,7 @@ TABS.led_strip.initialize = function (callback, scrollPosition) { } if (TABS.led_strip.wireMode) { - if ($(this).find('.wire').html() == '' && nextWireNumber < LED_STRIP.length) { + if ($(this).find('.wire').html() == '' && nextWireNumber < FC.LED_STRIP.length) { $(this).find('.wire').html(nextWireNumber); } } @@ -562,8 +571,8 @@ TABS.led_strip.initialize = function (callback, scrollPosition) { function findLed(x, y) { - for (var ledIndex = 0; ledIndex < LED_STRIP.length; ledIndex++) { - var led = LED_STRIP[ledIndex]; + for (var ledIndex = 0; ledIndex < FC.LED_STRIP.length; ledIndex++) { + var led = FC.LED_STRIP[ledIndex]; if (led.x == x && led.y == y) { return { index: ledIndex, led: led }; } @@ -576,11 +585,11 @@ TABS.led_strip.initialize = function (callback, scrollPosition) { var counter = 0; var lines = []; - var ledStripLength = LED_STRIP.length; - var ledColorsLength = LED_COLORS.length; - var ledModeColorsLenggth = LED_MODE_COLORS.length; + var ledStripLength = FC.LED_STRIP.length; + var ledColorsLength = FC.LED_COLORS.length; + var ledModeColorsLenggth = FC.LED_MODE_COLORS.length; - LED_STRIP = []; + FC.LED_STRIP = []; $('.gPoint').each(function(){ if ($(this).is('[class*="function"]')) { @@ -626,7 +635,7 @@ TABS.led_strip.initialize = function (callback, scrollPosition) { color: colorIndex } - LED_STRIP[wireNumber] = led; + FC.LED_STRIP[wireNumber] = led; } counter++; } @@ -640,15 +649,15 @@ TABS.led_strip.initialize = function (callback, scrollPosition) { }; for (var i = 0; i < ledStripLength; i++) { - if (LED_STRIP[i]) { + if (FC.LED_STRIP[i]) { continue; } - LED_STRIP[i] = defaultLed; + FC.LED_STRIP[i] = defaultLed; } var usedWireNumbers = buildUsedWireNumbers(); - var remaining = LED_STRIP.length - usedWireNumbers.length; + var remaining = FC.LED_STRIP.length - usedWireNumbers.length; $('.wires-remaining div').html(remaining); } @@ -663,7 +672,7 @@ TABS.led_strip.initialize = function (callback, scrollPosition) { if (match) { m = Number(match[2]); d = Number(match[3]); - $(this).css('background-color', HsvToColor(LED_COLORS[getModeColor(m, d)])); + $(this).css('background-color', HsvToColor(FC.LED_COLORS[getModeColor(m, d)])); } }); } @@ -675,7 +684,7 @@ TABS.led_strip.initialize = function (callback, scrollPosition) { var match = element.attr("class").match(/(^|\s)color-([0-9]+)(\s|$)/); if (match) { colorIndex = match[2]; - element.css('background-color', HsvToColor(LED_COLORS[colorIndex])); + element.css('background-color', HsvToColor(FC.LED_COLORS[colorIndex])); } } } @@ -878,23 +887,23 @@ TABS.led_strip.initialize = function (callback, scrollPosition) { if ($(className).hasClass('btnOn')) { switch (hsvIndex) { case 0: - if (LED_COLORS[selectedColorIndex].h != value) { - LED_COLORS[selectedColorIndex].h = value; - $('.colorDefineSliderValue.Hvalue').text(LED_COLORS[selectedColorIndex].h); + if (FC.LED_COLORS[selectedColorIndex].h != value) { + FC.LED_COLORS[selectedColorIndex].h = value; + $('.colorDefineSliderValue.Hvalue').text(FC.LED_COLORS[selectedColorIndex].h); change = true } break; case 1: - if (LED_COLORS[selectedColorIndex].s != value) { - LED_COLORS[selectedColorIndex].s = value; - $('.colorDefineSliderValue.Svalue').text(LED_COLORS[selectedColorIndex].s); + if (FC.LED_COLORS[selectedColorIndex].s != value) { + FC.LED_COLORS[selectedColorIndex].s = value; + $('.colorDefineSliderValue.Svalue').text(FC.LED_COLORS[selectedColorIndex].s); change = true } break; case 2: - if (LED_COLORS[selectedColorIndex].v != value) { - LED_COLORS[selectedColorIndex].v = value; - $('.colorDefineSliderValue.Vvalue').text(LED_COLORS[selectedColorIndex].v); + if (FC.LED_COLORS[selectedColorIndex].v != value) { + FC.LED_COLORS[selectedColorIndex].v = value; + $('.colorDefineSliderValue.Vvalue').text(FC.LED_COLORS[selectedColorIndex].v); change = true } break; @@ -922,7 +931,7 @@ TABS.led_strip.initialize = function (callback, scrollPosition) { var className = 'color-' + colorIndex; if ($(this).is('.' + className)) { $(this).find('.overlay-color').addClass(className); - $(this).find('.overlay-color').css('background-color', HsvToColor(LED_COLORS[colorIndex])) + $(this).find('.overlay-color').css('background-color', HsvToColor(FC.LED_COLORS[colorIndex])) } else { if ($(this).find('.overlay-color').is('.' + className)) $(this).find('.overlay-color').removeClass(className); @@ -939,24 +948,24 @@ TABS.led_strip.initialize = function (callback, scrollPosition) { var sliders = $('div.colorDefineSliders input'); var change = false; - if (!LED_COLORS[colorIndex]) + if (!FC.LED_COLORS[colorIndex]) return; - if (LED_COLORS[colorIndex].h != Number(sliders.eq(0).val())) { - sliders.eq(0).val(LED_COLORS[colorIndex].h); - $('.colorDefineSliderValue.Hvalue').text(LED_COLORS[colorIndex].h); + if (FC.LED_COLORS[colorIndex].h != Number(sliders.eq(0).val())) { + sliders.eq(0).val(FC.LED_COLORS[colorIndex].h); + $('.colorDefineSliderValue.Hvalue').text(FC.LED_COLORS[colorIndex].h); change = true; } - if (LED_COLORS[colorIndex].s != Number(sliders.eq(1).val())) { - sliders.eq(1).val(LED_COLORS[colorIndex].s); - $('.colorDefineSliderValue.Svalue').text(LED_COLORS[colorIndex].s); + if (FC.LED_COLORS[colorIndex].s != Number(sliders.eq(1).val())) { + sliders.eq(1).val(FC.LED_COLORS[colorIndex].s); + $('.colorDefineSliderValue.Svalue').text(FC.LED_COLORS[colorIndex].s); change = true; } - if (LED_COLORS[colorIndex].v != Number(sliders.eq(2).val())) { - sliders.eq(2).val(LED_COLORS[colorIndex].v); - $('.colorDefineSliderValue.Vvalue').text(LED_COLORS[colorIndex].v); + if (FC.LED_COLORS[colorIndex].v != Number(sliders.eq(2).val())) { + sliders.eq(2).val(FC.LED_COLORS[colorIndex].v); + $('.colorDefineSliderValue.Vvalue').text(FC.LED_COLORS[colorIndex].v); change = true; } @@ -987,8 +996,8 @@ TABS.led_strip.initialize = function (callback, scrollPosition) { } function getModeColor(mode, dir) { - for (var i = 0; i < LED_MODE_COLORS.length; i++) { - var mc = LED_MODE_COLORS[i]; + for (var i = 0; i < FC.LED_MODE_COLORS.length; i++) { + var mc = FC.LED_MODE_COLORS[i]; if (mc.mode == mode && mc.direction == dir) return mc.color; } @@ -996,8 +1005,8 @@ TABS.led_strip.initialize = function (callback, scrollPosition) { } function setModeColor(mode, dir, color) { - for (var i = 0; i < LED_MODE_COLORS.length; i++) { - var mc = LED_MODE_COLORS[i]; + for (var i = 0; i < FC.LED_MODE_COLORS.length; i++) { + var mc = FC.LED_MODE_COLORS[i]; if (mc.mode == mode && mc.direction == dir) { mc.color = color; return 1; diff --git a/tabs/logging.js b/tabs/logging.js index 452a2d9f..a755827b 100644 --- a/tabs/logging.js +++ b/tabs/logging.js @@ -1,5 +1,21 @@ 'use strict'; +const path = require('path'); +const { dialog } = require("@electron/remote"); +const Store = require('electron-store'); +const store = new Store(); + +const MSPCodes = require('./../js/msp/MSPCodes'); +const MSP = require('./../js/msp'); +const mspBalancedInterval = require('./../js/msp_balanced_interval'); +const { GUI, TABS } = require('./../js/gui'); +const FC = require('./../js/fc'); +const CONFIGURATOR = require('./../js/data_storage'); +const interval = require('./../js/intervals'); +const i18n = require('./../js/localization'); +const { zeroPad } = require('./../js/helpers'); + + TABS.logging = {}; TABS.logging.initialize = function (callback) { var self = this; @@ -22,7 +38,7 @@ TABS.logging.initialize = function (callback) { } var load_html = function () { - GUI.load(path.join(__dirname, "tabs/logging.html"), process_html); + GUI.load(path.join(__dirname, "logging.html"), process_html); } MSP.send_message(MSPCodes.MSP_RC, false, false, get_motor_data); @@ -30,7 +46,7 @@ TABS.logging.initialize = function (callback) { function process_html() { // translate to user-selected language - i18n.localize();; + i18n.localize();; // UI hooks $('a.log_file').on('click', prepare_file); @@ -67,9 +83,9 @@ TABS.logging.initialize = function (callback) { } } - helper.interval.add('log_data_poll', log_data_poll, parseInt($('select.speed').val()), true); // refresh rate goes here + interval.add('log_data_poll', log_data_poll, parseInt($('select.speed').val()), true); // refresh rate goes here const fs = require('fs'); - helper.interval.add('write_data', function write_data() { + interval.add('write_data', function write_data() { if (log_buffer.length && readyToWrite) { // only execute when there is actual data to write fs.writeFileSync(loggingFileName, log_buffer.join('\n') + '\n', { @@ -89,8 +105,8 @@ TABS.logging.initialize = function (callback) { GUI.log(i18n.getMessage('loggingErrorOneProperty')); } } else { - helper.interval.killAll(['global_data_refresh', 'msp-load-update']); - helper.mspBalancedInterval.flush(); + interval.killAll(['global_data_refresh', 'msp-load-update']); + mspBalancedInterval.flush(); $('.speed').prop('disabled', false); $(this).text(i18n.getMessage('loggingStart')); @@ -149,17 +165,17 @@ TABS.logging.initialize = function (callback) { head += ',' + 'rssi'; break; case 'MSP_RC': - for (var chan = 0; chan < RC.active_channels; chan++) { + for (var chan = 0; chan < FC.RC.active_channels; chan++) { head += ',' + 'RC' + chan; } break; case 'MSP_MOTOR': - for (var motor = 0; motor < MOTOR_DATA.length; motor++) { + for (var motor = 0; motor < FC.MOTOR_DATA.length; motor++) { head += ',' + 'Motor' + motor; } break; case 'MSP_DEBUG': - for (var debug = 0; debug < SENSOR_DATA.debug.length; debug++) { + for (var debug = 0; debug < FC.SENSOR_DATA.debug.length; debug++) { head += ',' + 'Debug' + debug; } break; @@ -174,43 +190,43 @@ TABS.logging.initialize = function (callback) { for (var i = 0; i < requested_properties.length; i++) { switch (requested_properties[i]) { case 'MSP_RAW_IMU': - sample += ',' + SENSOR_DATA.gyroscope; - sample += ',' + SENSOR_DATA.accelerometer; - sample += ',' + SENSOR_DATA.magnetometer; + sample += ',' + FC.SENSOR_DATA.gyroscope; + sample += ',' + FC.SENSOR_DATA.accelerometer; + sample += ',' + FC.SENSOR_DATA.magnetometer; break; case 'MSP_ATTITUDE': - sample += ',' + SENSOR_DATA.kinematics[0]; - sample += ',' + SENSOR_DATA.kinematics[1]; - sample += ',' + SENSOR_DATA.kinematics[2]; + sample += ',' + FC.SENSOR_DATA.kinematics[0]; + sample += ',' + FC.SENSOR_DATA.kinematics[1]; + sample += ',' + FC.SENSOR_DATA.kinematics[2]; break; case 'MSP_ALTITUDE': - sample += ',' + SENSOR_DATA.altitude; + sample += ',' + FC.SENSOR_DATA.altitude; break; case 'MSP_RAW_GPS': - sample += ',' + GPS_DATA.fix; - sample += ',' + GPS_DATA.numSat; - sample += ',' + (GPS_DATA.lat / 10000000); - sample += ',' + (GPS_DATA.lon / 10000000); - sample += ',' + GPS_DATA.alt; - sample += ',' + GPS_DATA.speed; - sample += ',' + GPS_DATA.ground_course; + sample += ',' + FC.GPS_DATA.fix; + sample += ',' + FC.GPS_DATA.numSat; + sample += ',' + (FC.GPS_DATA.lat / 10000000); + sample += ',' + (FC.GPS_DATA.lon / 10000000); + sample += ',' + FC.GPS_DATA.alt; + sample += ',' + FC.GPS_DATA.speed; + sample += ',' + FC.GPS_DATA.ground_course; break; case 'MSP_ANALOG': - sample += ',' + ANALOG.voltage; - sample += ',' + ANALOG.amperage; - sample += ',' + ANALOG.mAhdrawn; - sample += ',' + ANALOG.rssi; + sample += ',' + FC.ANALOG.voltage; + sample += ',' + FC.ANALOG.amperage; + sample += ',' + FC.ANALOG.mAhdrawn; + sample += ',' + FC.ANALOG.rssi; break; case 'MSP_RC': - for (var chan = 0; chan < RC.active_channels; chan++) { - sample += ',' + RC.channels[chan]; + for (var chan = 0; chan < FC.RC.active_channels; chan++) { + sample += ',' + FC.RC.channels[chan]; } break; case 'MSP_MOTOR': - sample += ',' + MOTOR_DATA; + sample += ',' + FC.MOTOR_DATA; break; case 'MSP_DEBUG': - sample += ',' + SENSOR_DATA.debug; + sample += ',' + FC.SENSOR_DATA.debug; break; } } diff --git a/tabs/magnetometer.js b/tabs/magnetometer.js index c89255cf..8f371458 100644 --- a/tabs/magnetometer.js +++ b/tabs/magnetometer.js @@ -1,5 +1,17 @@ 'use strict'; -/*global chrome,GUI,BOARD_ALIGNMENT,TABS,helper,$*/ + +const path = require('path'); + +const MSPChainerClass = require('./../js/msp/MSPchainer'); +const MSP = require('./../js/msp'); +const MSPCodes = require('./../js/msp/MSPCodes'); +const mspHelper = require('./../js/msp/MSPHelper'); +const mspBalancedInterval = require('./../js/msp_balanced_interval'); +const mspQueue = require('./../js/serial_queue'); +const FC = require('./../js/fc'); +const { GUI, TABS } = require('./../js/gui'); +const i18n = require('./../js/localization'); +const { mixer } = require('./../js/model'); TABS.magnetometer = {}; @@ -35,9 +47,9 @@ TABS.magnetometer.initialize = function (callback) { mspHelper.loadMixerConfig, mspHelper.loadBoardAlignment, function (callback) { - self.boardAlignmentConfig.pitch = Math.round(BOARD_ALIGNMENT.pitch / 10); - self.boardAlignmentConfig.roll = Math.round(BOARD_ALIGNMENT.roll / 10); - self.boardAlignmentConfig.yaw = Math.round(BOARD_ALIGNMENT.yaw / 10); + self.boardAlignmentConfig.pitch = Math.round(FC.BOARD_ALIGNMENT.pitch / 10); + self.boardAlignmentConfig.roll = Math.round(FC.BOARD_ALIGNMENT.roll / 10); + self.boardAlignmentConfig.yaw = Math.round(FC.BOARD_ALIGNMENT.yaw / 10); callback(); }, mspHelper.loadSensorAlignment, @@ -78,16 +90,16 @@ TABS.magnetometer.initialize = function (callback) { var saveChain = [ function (callback) { - BOARD_ALIGNMENT.pitch = self.boardAlignmentConfig.pitch * 10; - BOARD_ALIGNMENT.roll = self.boardAlignmentConfig.roll * 10; - BOARD_ALIGNMENT.yaw = self.boardAlignmentConfig.yaw * 10; + FC.BOARD_ALIGNMENT.pitch = self.boardAlignmentConfig.pitch * 10; + FC.BOARD_ALIGNMENT.roll = self.boardAlignmentConfig.roll * 10; + FC.BOARD_ALIGNMENT.yaw = self.boardAlignmentConfig.yaw * 10; callback(); }, mspHelper.saveBoardAlignment, // Magnetometer alignment function (callback) { let orientation_mag_e = $('select.magalign'); - SENSOR_ALIGNMENT.align_mag = parseInt(orientation_mag_e.val()); + FC.SENSOR_ALIGNMENT.align_mag = parseInt(orientation_mag_e.val()); callback(); }, mspHelper.saveSensorAlignment, @@ -138,7 +150,7 @@ TABS.magnetometer.initialize = function (callback) { } function load_html() { - GUI.load(path.join(__dirname, "tabs/magnetometer.html"), process_html); + GUI.load(path.join(__dirname, "magnetometer.html"), process_html); } function generateRange(min, max, step) { @@ -214,7 +226,7 @@ TABS.magnetometer.initialize = function (callback) { function updateMagOrientationWithPreset() { if (self.isSavePreset) { - const degrees = getAxisDegreeWithPresetAndBoardOrientation(SENSOR_ALIGNMENT.align_mag); + const degrees = getAxisDegreeWithPresetAndBoardOrientation(FC.SENSOR_ALIGNMENT.align_mag); presetUpdated(degrees); } } @@ -320,12 +332,12 @@ TABS.magnetometer.initialize = function (callback) { for (let i = 0; i < alignments.length; i++) { self.pageElements.orientation_mag_e.append(''); } - self.pageElements.orientation_mag_e.val(SENSOR_ALIGNMENT.align_mag); + self.pageElements.orientation_mag_e.val(FC.SENSOR_ALIGNMENT.align_mag); if (areAnglesZero()) { //If using a preset, checking if custom values are equal to 0 //Update the slider, but don't save the value until they will be not modified. - const degrees = getAxisDegreeWithPresetAndBoardOrientation(SENSOR_ALIGNMENT.align_mag); + const degrees = getAxisDegreeWithPresetAndBoardOrientation(FC.SENSOR_ALIGNMENT.align_mag); presetUpdated(degrees); } else { @@ -416,13 +428,13 @@ TABS.magnetometer.initialize = function (callback) { } self.pageElements.orientation_mag_e.on('change', function () { - SENSOR_ALIGNMENT.align_mag = parseInt($(this).val()); - const degrees = getAxisDegreeWithPresetAndBoardOrientation(SENSOR_ALIGNMENT.align_mag); + FC.SENSOR_ALIGNMENT.align_mag = parseInt($(this).val()); + const degrees = getAxisDegreeWithPresetAndBoardOrientation(FC.SENSOR_ALIGNMENT.align_mag); presetUpdated(degrees); }); self.pageElements.orientation_mag_e.on('mousedown', function () { - const degrees = getAxisDegreeWithPresetAndBoardOrientation(SENSOR_ALIGNMENT.align_mag); + const degrees = getAxisDegreeWithPresetAndBoardOrientation(FC.SENSOR_ALIGNMENT.align_mag); presetUpdated(degrees); }); @@ -512,19 +524,19 @@ TABS.magnetometer.initialize = function (callback) { }); function get_fast_data() { - if (helper.mspQueue.shouldDrop()) { + if (mspQueue.shouldDrop()) { return; } MSP.send_message(MSPCodes.MSP_ATTITUDE, false, false, function () { - self.roll_e.text(i18n.getMessage('initialSetupAttitude', [SENSOR_DATA.kinematics[0]])); - self.pitch_e.text(i18n.getMessage('initialSetupAttitude', [SENSOR_DATA.kinematics[1]])); - self.heading_e.text(i18n.getMessage('initialSetupAttitude', [SENSOR_DATA.kinematics[2]])); + self.roll_e.text(i18n.getMessage('initialSetupAttitude', [FC.SENSOR_DATA.kinematics[0]])); + self.pitch_e.text(i18n.getMessage('initialSetupAttitude', [FC.SENSOR_DATA.kinematics[1]])); + self.heading_e.text(i18n.getMessage('initialSetupAttitude', [FC.SENSOR_DATA.kinematics[2]])); self.render3D(); }); } - helper.mspBalancedInterval.add('setup_data_pull_fast', 40, 1, get_fast_data); + mspBalancedInterval.add('setup_data_pull_fast', 40, 1, get_fast_data); GUI.content_ready(callback); } @@ -570,12 +582,12 @@ TABS.magnetometer.initialize3D = function () { // load the model including materials if (useWebGlRenderer) { - if (MIXER_CONFIG.appliedMixerPreset === -1) { + if (FC.MIXER_CONFIG.appliedMixerPreset === -1) { model_file = 'custom'; GUI_control.prototype.log("" + i18n.getMessage("mixerNotConfigured") + ""); } else { - model_file = helper.mixer.getById(MIXER_CONFIG.appliedMixerPreset).model; + model_file = mixer.getById(FC.MIXER_CONFIG.appliedMixerPreset).model; } } else { @@ -622,7 +634,7 @@ TABS.magnetometer.initialize3D = function () { camera.aspect = wrapper.width() / wrapper.height(); camera.updateProjectionMatrix(); - this.render3D(); + self.render3D(); }; $(window).on('resize', this.resize3D); diff --git a/tabs/mission_control.js b/tabs/mission_control.js index d1b5be71..7237ef07 100644 --- a/tabs/mission_control.js +++ b/tabs/mission_control.js @@ -1,48 +1,35 @@ 'use strict'; -//////////////////////////////////// -// -// global Parameters definition -// -//////////////////////////////////// +const path = require('path'); +const ol = require('openlayers'); +const Store = require('electron-store'); +const store = new Store(); +const { dialog } = require("@electron/remote"); - -// MultiWii NAV Protocol -var MWNP = MWNP || {}; +const MSPChainerClass = require('./../js/msp/MSPchainer'); +const mspHelper = require('./../js/msp/MSPHelper'); +const MSPCodes = require('./../js/msp/MSPCodes'); +const MSP = require('./../js/msp'); +const mspBalancedInterval = require('./../js/msp_balanced_interval.js'); +const mspQueue = require('./../js/serial_queue.js'); +const { GUI, TABS } = require('./../js/gui'); +const FC = require('./../js/fc'); +const CONFIGURATOR = require('./../js/data_storage'); +const i18n = require('./../js/localization'); +const { globalSettings } = require('./../js/globalSettings'); +const MWNP = require('./../js/mwnp'); +const Waypoint = require('./../js/waypoint') +const WaypointCollection = require('./../js/waypointCollection'); +const Safehome = require('./../js/safehome'); +const SafehomeCollection = require('./../js/safehomeCollection'); +const { ApproachDirection, FwApproach } = require('./../js/fwApproach'); +const FwApproachCollection = require('./../js/fwApproachCollection'); +const SerialBackend = require('./../js/serial_backend.js'); +const { distanceOnLine, wrap_360, calculate_new_cooridatnes } = require('./../js/helpers'); +const Plotly = require('./../js/libraries/plotly-latest.min.js'); var MAX_NEG_FW_LAND_ALT = -2000; // cm -// WayPoint type -MWNP.WPTYPE = { - WAYPOINT: 1, - POSHOLD_UNLIM: 2, - POSHOLD_TIME: 3, - RTH: 4, - SET_POI: 5, - JUMP: 6, - SET_HEAD: 7, - LAND: 8 -}; - -MWNP.P3 = { - ALT_TYPE: 0, // Altitude (alt) : Relative (to home altitude) (0) or Absolute (AMSL) (1). - USER_ACTION_1: 1, // WP Action 1 - USER_ACTION_2: 2, // WP Action 2 - USER_ACTION_3: 3, // WP Action 3 - USER_ACTION_4: 4, // WP Action 4 -} - -// Reverse WayPoint type dictionary -function swap(dict) { - let rev_dict = {}; - for (let key in dict) { - rev_dict[dict[key]] = key; - } - return rev_dict; -} - -MWNP.WPTYPE.REV = swap(MWNP.WPTYPE); - // Dictionary of Parameter 1,2,3 definition depending on type of action selected (refer to MWNP.WPTYPE) var dictOfLabelParameterPoint = { 1: {parameter1: 'Speed (cm/s)', parameter2: '', parameter3: 'Sea level Ref'}, @@ -80,7 +67,10 @@ TABS.mission_control.initialize = function (callback) { let textFeature; var textGeom; let isOffline = false; + let selectedSafehome; let rthUpdateInterval = 0; + let $safehomeContentBox; + let $waypointOptionsTableBody; let settings = {speed: 0, alt: 5000, safeRadiusSH: 50, fwApproachAlt: 60, fwLandAlt: 5, maxDistSH: 0, fwApproachLength: 0, fwLoiterRadius: 0, bingDemModel: false}; if (GUI.active_tab != 'mission_control') { @@ -116,19 +106,19 @@ TABS.mission_control.initialize = function (callback) { // FC not connected, load page anyway loadHtml(); - if (!FW_APPROACH) { - FW_APPROACH = new FwApproachCollection(); + if (!FC.FW_APPROACH) { + FC.FW_APPROACH = new FwApproachCollection(); } - if (!SAFEHOMES) { - SAFEHOMES = new SafehomeCollection(); + if (!FC.SAFEHOMES) { + FC.SAFEHOMES = new SafehomeCollection(); } - for (let i = 0; i < FW_APPROACH.getMaxFwApproachCount(); i++){ - FW_APPROACH.put(new FwApproach(i)); + for (let i = 0; i < FC.FW_APPROACH.getMaxFwApproachCount(); i++){ + FC.FW_APPROACH.put(new FwApproach(i)); } } function loadHtml() { - GUI.load("tabs/mission_control.html", process_html); + GUI.load(path.join(__dirname, "mission_control.html"), process_html); } function process_html() { @@ -145,7 +135,6 @@ TABS.mission_control.initialize = function (callback) { } $safehomeContentBox = $('#SafehomeContentBox'); - $waypointOptionsTable = $('.waypointOptionsTable'); $waypointOptionsTableBody = $('#waypointOptionsTableBody'); if (typeof require !== "undefined") { @@ -154,7 +143,7 @@ TABS.mission_control.initialize = function (callback) { setTimeout(initMap, 200); if (!isOffline) { setTimeout(() => { - if (SAFEHOMES.safehomeCount() >= 1) { + if (FC.SAFEHOMES.safehomeCount() >= 1) { updateSelectedShAndFwAp(0); } else { selectedSafehome = null; @@ -189,11 +178,11 @@ TABS.mission_control.initialize = function (callback) { function update_gpsTrack() { - let lat = GPS_DATA.lat / 10000000; - let lon = GPS_DATA.lon / 10000000; + let lat = FC.GPS_DATA.lat / 10000000; + let lon = FC.GPS_DATA.lon / 10000000; //Update map - if (GPS_DATA.fix >= 2) { + if (FC.GPS_DATA.fix >= 2) { if (!cursorInitialized) { cursorInitialized = true; @@ -205,7 +194,7 @@ TABS.mission_control.initialize = function (callback) { anchor: [0.5, 0.5], opacity: 1, scale: 0.6, - src: 'images/icons/icon_mission_airplane.png' + src: './images/icons/icon_mission_airplane.png' })) }); @@ -232,7 +221,7 @@ TABS.mission_control.initialize = function (callback) { anchor: [0.5, 1.0], opacity: 1, scale: 0.5, - src: '/images/icons/cf_icon_RTH.png' + src: './images/icons/cf_icon_RTH.png' })) }); @@ -327,23 +316,23 @@ TABS.mission_control.initialize = function (callback) { breadCrumbLS.setCoordinates(coords); } - curPosStyle.getImage().setRotation((SENSOR_DATA.kinematics[2]/360.0) * 6.28318); + curPosStyle.getImage().setRotation((FC.SENSOR_DATA.kinematics[2]/360.0) * 6.28318); //update data text textGeom.setCoordinates(map.getCoordinateFromPixel([0,0])); let tmpText = textStyle.getText(); tmpText.setText(' \n' + - 'H: ' + SENSOR_DATA.kinematics[2] + - '\nAlt: ' + SENSOR_DATA.altitude + - 'm\nSpeed: ' + GPS_DATA.speed + 'cm/s\n' + - 'Dist: ' + GPS_DATA.distanceToHome + 'm'); + 'H: ' + FC.SENSOR_DATA.kinematics[2] + + '\nAlt: ' + FC.SENSOR_DATA.altitude + + 'm\nSpeed: ' + FC.GPS_DATA.speed + 'cm/s\n' + + 'Dist: ' + FC.GPS_DATA.distanceToHome + 'm'); //update RTH every 5th GPS update since it really shouldn't change if(rthUpdateInterval >= 5) { - MISSION_PLANNER.bufferPoint.number = -1; //needed to get point 0 which id RTH + FC.MISSION_PLANNER.bufferPoint.number = -1; //needed to get point 0 which id RTH MSP.send_message(MSPCodes.MSP_WP, mspHelper.crunch(MSPCodes.MSP_WP), false, function rth_update() { - var coord = ol.proj.fromLonLat([MISSION_PLANNER.bufferPoint.lon, MISSION_PLANNER.bufferPoint.lat]); + var coord = ol.proj.fromLonLat([FC.MISSION_PLANNER.bufferPoint.lon, FC.MISSION_PLANNER.bufferPoint.lat]); rthGeo.setCoordinates(coord); }); rthUpdateInterval = 0; @@ -358,14 +347,14 @@ TABS.mission_control.initialize = function (callback) { */ if(!isOffline) { - helper.mspBalancedInterval.add('gps_pull', 200, 3, function gps_update() { + mspBalancedInterval.add('gps_pull', 200, 3, function gps_update() { // avoid usage of the GPS commands until a GPS sensor is detected for targets that are compiled without GPS support. - if (!have_sensor(CONFIG.activeSensors, 'gps')) { + if (!SerialBackend.have_sensor(FC.CONFIG.activeSensors, 'gps')) { update_gpsTrack(); return; } - if (helper.mspQueue.shouldDrop()) { + if (mspQueue.shouldDrop()) { return; } @@ -434,8 +423,8 @@ TABS.mission_control.initialize = function (callback) { ////////////////////////////////////////////////////////////////////////////////////////////// // define & init Safehome parameters ////////////////////////////////////////////////////////////////////////////////////////////// - //var SAFEHOMES = new SafehomeCollection(); // TO COMMENT FOR RELEASE : DECOMMENT FOR DEBUG - //SAFEHOMES.inflate(); // TO COMMENT FOR RELEASE : DECOMMENT FOR DEBUG + //var FC.SAFEHOMES = new SafehomeCollection(); // TO COMMENT FOR RELEASE : DECOMMENT FOR DEBUG + //FC.SAFEHOMES.inflate(); // TO COMMENT FOR RELEASE : DECOMMENT FOR DEBUG //var safehomeRangeRadius = 200; //meters //var safehomeSafeRadius = 50; //meters @@ -465,19 +454,17 @@ TABS.mission_control.initialize = function (callback) { // ///////////////////////////////////////////// function loadSettings() { - chrome.storage.local.get('missionPlannerSettings', function (result) { - if (result.missionPlannerSettings) { - if (!result.missionPlannerSettings.fwApproachLength && settings.fwApproachLength) { - result.missionPlannerSettings.fwApproachLength = settings.fwApproachLength; - result.missionPlannerSettings.maxDistSH = settings.maxDistSH; - result.missionPlannerSettings.fwLoiterRadius = settings.fwLoiterRadius; - } - saveSettings(); - settings = result.missionPlannerSettings; + var missionPlannerSettings = store.get('missionPlannerSettings', false); + if (missionPlannerSettings) { + if (!missionPlannerSettings.fwApproachLength && settings.fwApproachLength) { + missionPlannerSettings.fwApproachLength = settings.fwApproachLength; + missionPlannerSettings.maxDistSH = settings.maxDistSH; + missionPlannerSettings.fwLoiterRadius = settings.fwLoiterRadius; } - - refreshSettings(); - }); + saveSettings(); + settings = missionPlannerSettings; + } + refreshSettings(); } function saveSettings() { @@ -509,7 +496,7 @@ TABS.mission_control.initialize = function (callback) { function checkApproachAltitude(altitude, isSeaLevelRef, sealevel) { if (altitude - (isSeaLevelRef ? sealevel * 100 : 0 ) < 0) { - alert(chrome.i18n.getMessage('MissionPlannerAltitudeChangeReset')); + alert(i18n.getMessage('MissionPlannerAltitudeChangeReset')); return false; } @@ -519,7 +506,7 @@ TABS.mission_control.initialize = function (callback) { function checkLandingAltitude(altitude, isSeaLevelRef, sealevel) { if (altitude - (isSeaLevelRef ? sealevel * 100 : 0 ) < MAX_NEG_FW_LAND_ALT) { - alert(chrome.i18n.getMessage('MissionPlannerFwLAndingAltitudeChangeReset')); + alert(i18n.getMessage('MissionPlannerFwLAndingAltitudeChangeReset')); return false; } @@ -527,8 +514,8 @@ TABS.mission_control.initialize = function (callback) { } function updateSafehomeInfo(){ - let freeSamehomes = SAFEHOMES.getMaxSafehomeCount() - SAFEHOMES.safehomeCount() - $('#availableSafehomes').text(freeSamehomes + '/' + SAFEHOMES.getMaxSafehomeCount()); + let freeSamehomes = FC.SAFEHOMES.getMaxSafehomeCount() - FC.SAFEHOMES.safehomeCount() + $('#availableSafehomes').text(freeSamehomes + '/' + FC.SAFEHOMES.getMaxSafehomeCount()); } @@ -536,10 +523,10 @@ TABS.mission_control.initialize = function (callback) { /* * Process safehome on Map */ - SAFEHOMES.get().forEach(safehome => { - addFwApproach(safehome.getLonMap(), safehome.getLatMap(), FW_APPROACH.get()[safehome.getNumber()], safehomeMarkers); + FC.SAFEHOMES.get().forEach(safehome => { + addFwApproach(safehome.getLonMap(), safehome.getLatMap(), FC.FW_APPROACH.get()[safehome.getNumber()], safehomeMarkers); }); - SAFEHOMES.get().forEach(safehome => { + FC.SAFEHOMES.get().forEach(safehome => { addSafehomeCircles(safehome); addSafeHomeMarker(safehome); }); @@ -561,7 +548,7 @@ TABS.mission_control.initialize = function (callback) { anchor: [0.5, 1], opacity: 1, scale: 0.5, - src: '/images/icons/cf_icon_safehome' + (safehome.isUsed() ? '_used' : '')+ '.png' + src: './images/icons/cf_icon_safehome' + (safehome.isUsed() ? '_used' : '')+ '.png' })), text: new ol.style.Text(({ text: String(Number(safehome.getNumber())+1), @@ -870,7 +857,7 @@ TABS.mission_control.initialize = function (callback) { anchor: [0.5, 1], opacity: 1, scale: 0.5, - src: '/images/icons/cf_icon_home.png' + src: './images/icons/cf_icon_home.png' })), }); } @@ -1277,7 +1264,7 @@ TABS.mission_control.initialize = function (callback) { } } if (element.getAction() == MWNP.WPTYPE.LAND) { - addFwApproach(element.getLonMap(), element.getLatMap(), FW_APPROACH.get()[SAFEHOMES.getMaxSafehomeCount() + element.getMultiMissionIdx()], lines); + addFwApproach(element.getLonMap(), element.getLatMap(), FC.FW_APPROACH.get()[FC.SAFEHOMES.getMaxSafehomeCount() + element.getMultiMissionIdx()], lines); } }); //reset text position @@ -1329,7 +1316,7 @@ TABS.mission_control.initialize = function (callback) { featureArrow.setStyle( new ol.style.Style({ image: new ol.style.Icon({ - src: '/images/icons/cf_icon_arrow.png', + src: './images/icons/cf_icon_arrow.png', scale: 0.3, anchor: [0.5, 0.5], rotateWithView: true, @@ -1433,7 +1420,7 @@ TABS.mission_control.initialize = function (callback) { } const $safehomeBox = $safehomeContentBox.find('.missionPlannerSafehomeBox:last-child'); - $safehomeBox.find('.spacer_box_title').text(chrome.i18n.getMessage('safehomeEdit') + ' ' + (selectedSafehome.getNumber() + 1)); + $safehomeBox.find('.spacer_box_title').text(i18n.getMessage('safehomeEdit') + ' ' + (selectedSafehome.getNumber() + 1)); $('#safehomeLatitude').val(selectedSafehome.getLatMap()); $('#safehomeLongitude').val(selectedSafehome.getLonMap()); @@ -1826,7 +1813,7 @@ TABS.mission_control.initialize = function (callback) { repaintLine4Waypoints(mission); } else if (tempMarker.kind == "safehome") { - let tmpSafehome = SAFEHOMES.get()[tempMarker.number]; + let tmpSafehome = FC.SAFEHOMES.get()[tempMarker.number]; tmpSafehome.setLon(Math.round(coord[0] * 1e7)); tmpSafehome.setLat(Math.round(coord[1] * 1e7)); @@ -1882,7 +1869,7 @@ TABS.mission_control.initialize = function (callback) { mission.getWaypoint(tempMarker.number).setAlt(returnAltitude); if (mission.getWaypoint(tempMarker.number).getAction() == MWNP.WPTYPE.LAND) { - let approach = FW_APPROACH.get()[SAFEHOMES.getMaxSafehomeCount() + mission.getWaypoint(tempMarker.number).getMultiMissionIdx()]; + let approach = FC.FW_APPROACH.get()[FC.SAFEHOMES.getMaxSafehomeCount() + mission.getWaypoint(tempMarker.number).getMultiMissionIdx()]; if (approach.getIsSeaLevelRef()) { if (approach.getElevation() != 0) { approach.setApproachAltAsl(approach.getApproachAltAsl() - approach.getElevation() + elevationAtWP * 100); @@ -1910,8 +1897,8 @@ TABS.mission_control.initialize = function (callback) { } else if (tempMarker.kind == "safehome") { (async () => { - let approach = FW_APPROACH.get()[tempMarker.number]; - let safehome = SAFEHOMES.get()[tempMarker.number]; + let approach = FC.FW_APPROACH.get()[tempMarker.number]; + let safehome = FC.SAFEHOMES.get()[tempMarker.number]; const elevation = await approach.getElevationFromServer(safehome.getLonMap(), safehome.getLatMap(), globalSettings) * 100; $('#safehomeElevation').text(elevation / 100 + " m"); if (approach.getIsSeaLevelRef()) { @@ -1929,8 +1916,8 @@ TABS.mission_control.initialize = function (callback) { return false; }; - var lat = (GPS_DATA ? (GPS_DATA.lat / 10000000) : 0); - var lon = (GPS_DATA ? (GPS_DATA.lon / 10000000) : 0); + var lat = (FC.GPS_DATA ? (FC.GPS_DATA.lat / 10000000) : 0); + var lon = (FC.GPS_DATA ? (FC.GPS_DATA.lon / 10000000) : 0); let mapLayer; let control_list; @@ -2045,7 +2032,7 @@ TABS.mission_control.initialize = function (callback) { $("#editMission").hide(); selectedMarker = mission.getWaypoint(tempMarker.number); - selectedFwApproachWp = FW_APPROACH.get()[SAFEHOMES.getMaxSafehomeCount() + selectedMarker.getMultiMissionIdx()]; + selectedFwApproachWp = FC.FW_APPROACH.get()[FC.SAFEHOMES.getMaxSafehomeCount() + selectedMarker.getMultiMissionIdx()]; if (selectedFwApproachWp.getLandHeading1() == 0 && selectedFwApproachWp.getLandHeading1() == 0 && selectedFwApproachWp.getApproachAltAsl() == 0 && selectedFwApproachWp.getLandAltAsl() == 0) { selectedFwApproachWp.setApproachAltAsl(settings.fwApproachAlt * 100); @@ -2143,7 +2130,7 @@ TABS.mission_control.initialize = function (callback) { } else if (selectedFeature && tempMarker.kind == "line" && tempMarker.selection && !disableMarkerEdit) { let tempWpCoord = ol.proj.toLonLat(evt.coordinate); - let tempWp = new Waypoint(tempMarker.number, MWNP.WPTYPE.WAYPOINT, Math.round(tempWpCoord[1] * 10000000), Math.round(tempWpCoord[0] * 10000000), alt=Number(settings.alt), p1=Number(settings.speed)); + let tempWp = new Waypoint(tempMarker.number, MWNP.WPTYPE.WAYPOINT, Math.round(tempWpCoord[1] * 10000000), Math.round(tempWpCoord[0] * 10000000), Number(settings.alt), Number(settings.speed)); tempWp.setMultiMissionIdx(mission.getWaypoint(0).getMultiMissionIdx()); if (homeMarkers.length && HOME.getAlt() != "N/A") { @@ -2176,11 +2163,11 @@ TABS.mission_control.initialize = function (callback) { } else if (!disableMarkerEdit) { let tempWpCoord = ol.proj.toLonLat(evt.coordinate); - let tempWp = new Waypoint(mission.get().length, MWNP.WPTYPE.WAYPOINT, Math.round(tempWpCoord[1] * 10000000), Math.round(tempWpCoord[0] * 10000000), alt=Number(settings.alt), p1=Number(settings.speed)); + let tempWp = new Waypoint(mission.get().length, MWNP.WPTYPE.WAYPOINT, Math.round(tempWpCoord[1] * 10000000), Math.round(tempWpCoord[0] * 10000000), Number(settings.alt), Number(settings.speed)); if (mission.get().length == 0) { tempWp.setMultiMissionIdx(multimissionCount == 0 ? 0 : multimissionCount - 1); - FW_APPROACH.clean(SAFEHOMES.getMaxSafehomeCount() + tempWp.getMultiMissionIdx()); + FC.FW_APPROACH.clean(FC.SAFEHOMES.getMaxSafehomeCount() + tempWp.getMultiMissionIdx()); } else { tempWp.setMultiMissionIdx(mission.getWaypoint(mission.get().length - 1).getMultiMissionIdx()); } @@ -2237,7 +2224,7 @@ TABS.mission_control.initialize = function (callback) { ////////////////////////////////////////////////////////////////////////// // Update Alt display in meters on ALT field keypress up ////////////////////////////////////////////////////////////////////////// - $('#pointAlt').keyup(function(){ + $('#pointAlt').on('keyup', () => { let altitudeMeters = app.ConvertCentimetersToMeters($(this).val()); $('#altitudeInMeters').text(` ${altitudeMeters}m`); }); @@ -2332,7 +2319,7 @@ TABS.mission_control.initialize = function (callback) { let found = false; mission.get().forEach(wp => { if (wp.getAction() == MWNP.WPTYPE.LAND) { - alert(chrome.i18n.getMessage('MissionPlannerOnlyOneLandWp')); + alert(i18n.getMessage('MissionPlannerOnlyOneLandWp')); found = true; $(event.currentTarget).val(selectedMarker.getAction()); } @@ -2705,16 +2692,16 @@ TABS.mission_control.initialize = function (callback) { $('#addSafehome').on('click', () => { - if (SAFEHOMES.safehomeCount() + 1 > SAFEHOMES.getMaxSafehomeCount()){ - alert(chrome.i18n.getMessage('missionSafehomeMaxSafehomesReached')); + if (FC.SAFEHOMES.safehomeCount() + 1 > FC.SAFEHOMES.getMaxSafehomeCount()){ + alert(i18n.getMessage('missionSafehomeMaxSafehomesReached')); return; } let mapCenter = map.getView().getCenter(); let midLon = Math.round(ol.proj.toLonLat(mapCenter)[0] * 1e7); let midLat = Math.round(ol.proj.toLonLat(mapCenter)[1] * 1e7); - SAFEHOMES.put(new Safehome(SAFEHOMES.safehomeCount(), 1, midLat, midLon)); - updateSelectedShAndFwAp(SAFEHOMES.safehomeCount() - 1); + FC.SAFEHOMES.put(new Safehome(FC.SAFEHOMES.safehomeCount(), 1, midLat, midLon)); + updateSelectedShAndFwAp(FC.SAFEHOMES.safehomeCount() - 1); renderSafeHomeOptions(); cleanSafehomeLayers(); renderSafehomesOnMap(); @@ -2733,7 +2720,7 @@ TABS.mission_control.initialize = function (callback) { mspHelper.loadSafehomes, mspHelper.loadFwApproach, function() { - if (SAFEHOMES.safehomeCount() >= 1) { + if (FC.SAFEHOMES.safehomeCount() >= 1) { updateSelectedShAndFwAp(0); } else { selectedSafehome = null; @@ -2743,7 +2730,7 @@ TABS.mission_control.initialize = function (callback) { cleanSafehomeLayers(); renderSafehomesOnMap(); updateSafehomeInfo(); - GUI.log(chrome.i18n.getMessage('endGettingSafehomePoints')); + GUI.log(i18n.getMessage('endGettingSafehomePoints')); $('#loadEepromSafehomeButton').removeClass('disabled'); } ]); @@ -2752,7 +2739,7 @@ TABS.mission_control.initialize = function (callback) { $('#saveEepromSafehomeButton').on('click', function() { $(this).addClass('disabled'); - GUI.log(chrome.i18n.getMessage('startSendingSafehomePoints')); + GUI.log(i18n.getMessage('startSendingSafehomePoints')); var saveChainer = new MSPChainerClass(); saveChainer.setChain([ @@ -2760,7 +2747,7 @@ TABS.mission_control.initialize = function (callback) { mspHelper.saveFwApproach, function() { mspHelper.saveToEeprom(); - GUI.log(chrome.i18n.getMessage('endSendingSafehomePoints')); + GUI.log(i18n.getMessage('endSendingSafehomePoints')); $('#saveEepromSafehomeButton').removeClass('disabled'); } ]); @@ -2770,11 +2757,11 @@ TABS.mission_control.initialize = function (callback) { $('#deleteSafehome').on('click', () => { if (selectedSafehome && selectedFwApproachSh) { var shNum = selectedSafehome.getNumber(); - SAFEHOMES.drop(shNum); - FW_APPROACH.clean(shNum); + FC.SAFEHOMES.drop(shNum); + FC.FW_APPROACH.clean(shNum); - if (SAFEHOMES.safehomeCount() > 0) { - updateSelectedShAndFwAp(SAFEHOMES.safehomeCount() - 1); + if (FC.SAFEHOMES.safehomeCount() > 0) { + updateSelectedShAndFwAp(FC.SAFEHOMES.safehomeCount() - 1); } else { selectedSafehome = null; selectedFwApproachSh = null; @@ -3028,8 +3015,8 @@ TABS.mission_control.initialize = function (callback) { removeAllWaypoints(); updateMultimissionState(); } - for (let i = SAFEHOMES.getMaxSafehomeCount(); i < FW_APPROACH.getMaxFwApproachCount(); i++) { - FW_APPROACH.clean(i); + for (let i = FC.SAFEHOMES.getMaxSafehomeCount(); i < FC.FW_APPROACH.getMaxFwApproachCount(); i++) { + FC.FW_APPROACH.clean(i); } plotElevation(); } @@ -3045,7 +3032,7 @@ TABS.mission_control.initialize = function (callback) { mission.getAttachedFromWaypoint(selectedMarker).forEach(function (element) { if (element.getAction() == MWNP.WPTYPE.LAND) { - FW_APPROACH.clean(element.getNumber()); + FC.FW_APPROACH.clean(element.getNumber()); } mission.dropWaypoint(element); @@ -3062,7 +3049,7 @@ TABS.mission_control.initialize = function (callback) { else { mission.dropWaypoint(selectedMarker); if (selectedMarker.getAction() == MWNP.WPTYPE.LAND) { - FW_APPROACH.clean(selectedFwApproachWp.getNumber()); + FC.FW_APPROACH.clean(selectedFwApproachWp.getNumber()); } selectedMarker = null; mission.update(singleMissionActive()); @@ -3184,10 +3171,10 @@ TABS.mission_control.initialize = function (callback) { ///////////////////////////////////////////// function loadMissionFile(filename) { const fs = require('fs'); - if (!window.xml2js) return GUI.log(chrome.i18n.getMessage('errorReadingFileXml2jsNotFound')); + if (!window.xml2js) return GUI.log(i18n.getMessage('errorReadingFileXml2jsNotFound')); - for (let i = SAFEHOMES.getMaxSafehomeCount(); i < FW_APPROACH.getMaxFwApproachCount(); i++) { - FW_APPROACH.clean(i); + for (let i = FC.SAFEHOMES.getMaxSafehomeCount(); i < FC.FW_APPROACH.getMaxFwApproachCount(); i++) { + FC.FW_APPROACH.clean(i); } fs.readFile(filename, (err, data) => { @@ -3307,7 +3294,7 @@ TABS.mission_control.initialize = function (callback) { fwApproach.setIsSeaLevelRef(parseBooleans(node.$[attr]) ? 1 : 0); } } - FW_APPROACH.insert(fwApproach, SAFEHOMES.getMaxSafehomeCount() + idx); + FC.FW_APPROACH.insert(fwApproach, FC.SAFEHOMES.getMaxSafehomeCount() + idx); } } } @@ -3412,8 +3399,8 @@ TABS.mission_control.initialize = function (callback) { } }); let approachIdx = 0; - for (let i = SAFEHOMES.getMaxSafehomeCount(); i < FW_APPROACH.getMaxFwApproachCount(); i++){ - let approach = FW_APPROACH.get()[i]; + for (let i = FC.SAFEHOMES.getMaxSafehomeCount(); i < FC.FW_APPROACH.getMaxFwApproachCount(); i++){ + let approach = FC.FW_APPROACH.get()[i]; if (approach.getLandHeading1() != 0 || approach.getLandHeading2() != 0) { var item = { $: { 'index': approachIdx, @@ -3446,7 +3433,7 @@ TABS.mission_control.initialize = function (callback) { ///////////////////////////////////////////// // Load/Save FC mission Toolbox - // mission = configurator store, WP number indexed from 0, MISSION_PLANNER = FC NVM store, WP number indexed from 1 + // mission = configurator store, WP number indexed from 0, FC.MISSION_PLANNER = FC NVM store, WP number indexed from 1 ///////////////////////////////////////////// function getWaypointsFromFC(loadEeprom) { @@ -3459,19 +3446,19 @@ TABS.mission_control.initialize = function (callback) { } chain.push(mspHelper.loadWaypoints); chain.push(function() { - GUI.log(chrome.i18n.getMessage('endGetPoint')); + GUI.log(i18n.getMessage('endGetPoint')); if (loadEeprom) { - GUI.log(chrome.i18n.getMessage('eeprom_load_ok')); + GUI.log(i18n.getMessage('eeprom_load_ok')); $('#loadEepromMissionButton').removeClass('disabled'); } else { $('#loadMissionButton').removeClass('disabled'); } - if (!MISSION_PLANNER.getCountBusyPoints()) { - alert(chrome.i18n.getMessage('no_waypoints_to_load')); + if (!FC.MISSION_PLANNER.getCountBusyPoints()) { + alert(i18n.getMessage('no_waypoints_to_load')); return; } mission.reinit(); - mission.copy(MISSION_PLANNER); + mission.copy(FC.MISSION_PLANNER); mission.update(false, true); /* check multimissions */ @@ -3499,29 +3486,29 @@ TABS.mission_control.initialize = function (callback) { } function sendWaypointsToFC(saveEeprom) { - MISSION_PLANNER.reinit(); - MISSION_PLANNER.copy(mission); - MISSION_PLANNER.update(false, true, true); + FC.MISSION_PLANNER.reinit(); + FC.MISSION_PLANNER.copy(mission); + FC.MISSION_PLANNER.update(false, true, true); let saveChainer = new MSPChainerClass(); saveChainer.setChain([ mspHelper.saveWaypoints, mspHelper.saveFwApproach, function () { - GUI.log(chrome.i18n.getMessage('endSendPoint')); + GUI.log(i18n.getMessage('endSendPoint')); if (saveEeprom) { $('#saveEepromMissionButton').removeClass('disabled'); - GUI.log(chrome.i18n.getMessage('eeprom_saved_ok')); + GUI.log(i18n.getMessage('eeprom_saved_ok')); MSP.send_message(MSPCodes.MSP_WP_MISSION_SAVE, [0], false, setMissionIndex); } else { $('#saveMissionButton').removeClass('disabled'); } - mission.setMaxWaypoints(MISSION_PLANNER.getMaxWaypoints()); - mission.setValidMission(MISSION_PLANNER.getValidMission()); - mission.setCountBusyPoints(MISSION_PLANNER.getCountBusyPoints()); + mission.setMaxWaypoints(FC.MISSION_PLANNER.getMaxWaypoints()); + mission.setValidMission(FC.MISSION_PLANNER.getValidMission()); + mission.setCountBusyPoints(FC.MISSION_PLANNER.getCountBusyPoints()); multimission.setMaxWaypoints(mission.getMaxWaypoints()); updateTotalInfo(); mission.reinit(); - mission.copy(MISSION_PLANNER); + mission.copy(FC.MISSION_PLANNER); mission.update(false, true); refreshLayers(); $('#MPeditPoint').fadeOut(300); @@ -3562,8 +3549,8 @@ TABS.mission_control.initialize = function (callback) { } function updateSelectedShAndFwAp(index) { - selectedSafehome = SAFEHOMES.get()[index]; - selectedFwApproachSh = FW_APPROACH.get()[index]; + selectedSafehome = FC.SAFEHOMES.get()[index]; + selectedFwApproachSh = FC.FW_APPROACH.get()[index]; } /* resetAltitude = true : For selected WPs only. Changes WP Altitude value back to previous value if setting below ground level. diff --git a/tabs/mixer.js b/tabs/mixer.js index aadebc27..94da6b68 100644 --- a/tabs/mixer.js +++ b/tabs/mixer.js @@ -12,7 +12,7 @@ const i18n = require('./../js/localization'); const { mixer, platform, PLATFORM, INPUT, STABILIZED } = require('./../js/model'); const Settings = require('./../js/settings'); const mspBalancedInterval = require('./../js/msp_balanced_interval'); -const jBox = require('../js/libraries/jBox/jBox.min.js') +const jBox = require('../js/libraries/jBox/jBox.min.js'); TABS.mixer = {}; @@ -735,8 +735,8 @@ TABS.mixer.initialize = function (callback, scrollPosition) { $('#execute-button').on('click', function () { loadedMixerPresetID = currentMixerPreset.id; - mixer.loadServoRules(currentMixerPreset); - mixer.loadMotorRules(currentMixerPreset); + mixer.loadServoRules(FC, currentMixerPreset); + mixer.loadMotorRules(FC, currentMixerPreset); FC.MIXER_CONFIG.hasFlaps = (currentMixerPreset.hasFlaps === true) ? true : false; renderServoMixRules(); renderMotorMixRules(); @@ -750,8 +750,8 @@ TABS.mixer.initialize = function (callback, scrollPosition) { $("#needToUpdateMixerMessage").addClass("is-hidden"); } loadedMixerPresetID = currentMixerPreset.id; - mixer.loadServoRules(currentMixerPreset); - mixer.loadMotorRules(currentMixerPreset); + mixer.loadServoRules(FC, currentMixerPreset); + mixer.loadMotorRules(FC, currentMixerPreset); FC.MIXER_CONFIG.hasFlaps = (currentMixerPreset.hasFlaps === true) ? true : false; renderServoMixRules(); renderMotorMixRules(); @@ -826,7 +826,7 @@ TABS.mixer.initialize = function (callback, scrollPosition) { function updateRefreshButtonStatus() { if ( - (currentMixerPreset.id != loadedMixerPresetID && helper.mixer.getById(loadedMixerPresetID).platform == PLATFORM.AIRPLANE) || + (currentMixerPreset.id != loadedMixerPresetID && mixer.getById(loadedMixerPresetID).platform == PLATFORM.AIRPLANE) || (currentMixerPreset.id == loadedMixerPresetID && currentMixerPreset.platform == PLATFORM.AIRPLANE) ) { $("#refresh-mixer-button").parent().removeClass("is-hidden"); diff --git a/tabs/modes.js b/tabs/modes.js index 4a39e523..9881b8cd 100644 --- a/tabs/modes.js +++ b/tabs/modes.js @@ -2,6 +2,17 @@ 'use strict'; +const path = require('path'); + +const mspHelper = require('./../js/msp/MSPHelper'); +const MSPCodes = require('./../js/msp/MSPCodes'); +const MSP = require('./../js/msp'); +const { GUI, TABS } = require('./../js/gui'); +const FC = require('./../js/fc'); +const interval = require('./../js/intervals'); +const BitHelper = require('./../js/bitHelper'); +const i18n = require('./../js/localization'); + TABS.modes = {}; TABS.modes.initialize = function (callback) { var self = this; @@ -23,7 +34,7 @@ TABS.modes.initialize = function (callback) { } function load_html() { - GUI.load(path.join(__dirname, "tabs/modes.html"), process_html); + GUI.load(path.join(__dirname, "modes.html"), process_html); } MSP.send_message(MSPCodes.MSP_BOXNAMES, false, false, get_active_box_data); @@ -32,7 +43,7 @@ TABS.modes.initialize = function (callback) { // generate heads according to RC count var table_head = $('table.boxes .heads'); var main_head = $('table.boxes .main'); - for (var i = 0; i < (RC.active_channels - 4); i++) { + for (var i = 0; i < (FC.RC.active_channels - 4); i++) { table_head.append('AUX ' + (i + 1) + ''); // 3 columns per aux channel (this might be requested to change to 6 in the future, so watch out) @@ -47,12 +58,12 @@ TABS.modes.initialize = function (callback) { i18n.localize();; // generate table from the supplied AUX names and AUX data - for (var i = 0; i < AUX_CONFIG.length; i++) { + for (var i = 0; i < FC.AUX_CONFIG.length; i++) { var line = ''; - line += '' + AUX_CONFIG[i] + ''; + line += '' + FC.AUX_CONFIG[i] + ''; for (var j = 0; j < (RC.active_channels - 4) * 3; j++) { - if (bit_check(AUX_CONFIG_values[i], j)) { + if (BitHelper.bit_check(FC.AUX_CONFIG_values[i], j)) { line += ''; } else { line += ''; @@ -72,14 +83,14 @@ TABS.modes.initialize = function (callback) { $('.boxes input').each(function () { if ($(this).is(':checked')) { - AUX_CONFIG_values[main_needle] = bit_set(AUX_CONFIG_values[main_needle], needle); + FC.AUX_CONFIG_values[main_needle] = BitHelper.bit_set(FC.AUX_CONFIG_values[main_needle], needle); } else { - AUX_CONFIG_values[main_needle] = bit_clear(AUX_CONFIG_values[main_needle], needle); + FC.AUX_CONFIG_values[main_needle] = BitHelper.bit_clear(FC.AUX_CONFIG_values[main_needle], needle); } needle++; - if (needle >= (RC.active_channels - 4) * 3) { // 1 aux * 3 checkboxes, 4 AUX = 12 bits per line + if (needle >= (FC.RC.active_channels - 4) * 3) { // 1 aux * 3 checkboxes, 4 AUX = 12 bits per line main_needle++; needle = 0; } @@ -119,21 +130,21 @@ TABS.modes.initialize = function (callback) { } function update_ui() { - for (var i = 0; i < AUX_CONFIG.length; i++) { + for (var i = 0; i < FC.AUX_CONFIG.length; i++) { if (FC.isModeBitSet(i)) { $('td.name').eq(i).addClass('on').removeClass('off'); } else { $('td.name').eq(i).removeClass('on').removeClass('off'); - if (AUX_CONFIG_values[i] > 0) { + if (FC.AUX_CONFIG_values[i] > 0) { $('td.name').eq(i).addClass('off'); } } } - for (var i = 0; i < (RC.active_channels - 4); i++) { - box_highlight(i, RC.channels[i + 4]); + for (var i = 0; i < (FC.RC.active_channels - 4); i++) { + box_highlight(i, FC.RC.channels[i + 4]); } } @@ -141,7 +152,7 @@ TABS.modes.initialize = function (callback) { update_ui(); // enable data pulling - helper.interval.add('aux_data_pull', get_rc_data, 50); + interval.add('aux_data_pull', get_rc_data, 50); GUI.content_ready(callback); } diff --git a/tabs/onboard_logging.js b/tabs/onboard_logging.js index a03c6f9d..ebfd519f 100644 --- a/tabs/onboard_logging.js +++ b/tabs/onboard_logging.js @@ -1,8 +1,17 @@ -/*global $,MSP,MSPCodes,TABS,GUI,CONFIGURATOR,helper,mspHelper,SDCARD,chrome*/ 'use strict'; -var - sdcardTimer; +const path = require('path'); + +const MSPCodes = require('./../js/msp/MSPCodes'); +const MSP = require('./../js/msp'); +const { GUI, TABS } = require('./../js/gui'); +const FC = require('./../js/fc'); +const CONFIGURATOR = require('./../js/data_storage'); +const features = require('./../js/feature_framework'); +const i18n = require('./../js/localization'); +const BitHelper = require('./../js/bitHelper'); + +var sdcardTimer; TABS.onboard_logging = { }; @@ -67,24 +76,24 @@ TABS.onboard_logging.initialize = function (callback) { } function load_html() { - GUI.load(path.join(__dirname, "tabs/onboard_logging.html"), function() { + GUI.load(path.join(__dirname, "onboard_logging.html"), function() { // translate to user-selected language i18n.localize();; var - dataflashPresent = DATAFLASH.totalSize > 0, + dataflashPresent = FC.DATAFLASH.totalSize > 0, blackboxSupport = false; - if ((BLACKBOX.supported || DATAFLASH.supported) && bit_check(FEATURES, 19)) { + if ((FC.BLACKBOX.supported || FC.DATAFLASH.supported) && BitHelper.bit_check(FC.FEATURES, 19)) { blackboxSupport = true; } $(".tab-onboard_logging") .addClass("serial-supported") - .toggleClass("dataflash-supported", DATAFLASH.supported) + .toggleClass("dataflash-supported", FC.DATAFLASH.supported) .toggleClass("dataflash-present", dataflashPresent) - .toggleClass("sdcard-supported", SDCARD.supported) - .toggleClass("blackbox-config-supported", BLACKBOX.supported) + .toggleClass("sdcard-supported", FC.SDCARD.supported) + .toggleClass("blackbox-config-supported", FC.BLACKBOX.supported) .toggleClass("blackbox-supported", blackboxSupport) .toggleClass("blackbox-unsupported", !blackboxSupport); @@ -101,22 +110,22 @@ TABS.onboard_logging.initialize = function (callback) { } $('.save-blackbox-feature').on('click', function () { - helper.features.reset(); - helper.features.fromUI($('.require-blackbox-unsupported')); - helper.features.execute(save_to_eeprom); + features.reset(); + features.fromUI($('.require-blackbox-unsupported')); + features.execute(save_to_eeprom); }); - if (BLACKBOX.supported) { + if (FC.BLACKBOX.supported) { $(".tab-onboard_logging a.save-settings").on('click', function () { var rate = $(".blackboxRate select").val().split('/'); - BLACKBOX.blackboxRateNum = parseInt(rate[0], 10); - BLACKBOX.blackboxRateDenom = parseInt(rate[1], 10); - BLACKBOX.blackboxDevice = parseInt($(".blackboxDevice select").val(), 10); - BLACKBOX.blackboxIncludeFlags = getIncludeFlags(); - helper.features.reset(); - helper.features.fromUI($('.require-blackbox-supported')); - helper.features.execute(function () { + FC.BLACKBOX.blackboxRateNum = parseInt(rate[0], 10); + FC.BLACKBOX.blackboxRateDenom = parseInt(rate[1], 10); + FC.BLACKBOX.blackboxDevice = parseInt($(".blackboxDevice select").val(), 10); + FC.BLACKBOX.blackboxIncludeFlags = getIncludeFlags(); + features.reset(); + features.fromUI($('.require-blackbox-supported')); + features.execute(function () { mspHelper.sendBlackboxConfiguration(save_to_eeprom); }); }); @@ -126,7 +135,7 @@ TABS.onboard_logging.initialize = function (callback) { const blackboxFieldsDiv = $("#blackBoxFlagsDiv"); for (let i = 0; i < blackBoxFields.length; i++) { const FIELD_ID = blackBoxFields[i]; - const isEnabled = (BLACKBOX.blackboxIncludeFlags & 1<') input.attr("id",FIELD_ID); input.attr("checked",isEnabled); @@ -159,20 +168,20 @@ TABS.onboard_logging.initialize = function (callback) { deviceSelect = $(".blackboxDevice select").empty(); deviceSelect.append(''); - if (DATAFLASH.ready) { + if (FC.DATAFLASH.ready) { deviceSelect.append(''); } - if (SDCARD.supported) { + if (FC.SDCARD.supported) { deviceSelect.append(''); } - deviceSelect.val(BLACKBOX.blackboxDevice); + deviceSelect.val(FC.BLACKBOX.blackboxDevice); } function populateLoggingRates() { var - userRateGCD = gcd(BLACKBOX.blackboxRateNum, BLACKBOX.blackboxRateDenom), - userRate = {num: BLACKBOX.blackboxRateNum / userRateGCD, denom: BLACKBOX.blackboxRateDenom / userRateGCD}; + userRateGCD = gcd(FC.BLACKBOX.blackboxRateNum, FC.BLACKBOX.blackboxRateDenom), + userRate = {num: FC.BLACKBOX.blackboxRateNum / userRateGCD, denom: FC.BLACKBOX.blackboxRateDenom / userRateGCD}; // Offer a reasonable choice of logging rates (if people want weird steps they can use CLI) var @@ -252,20 +261,20 @@ TABS.onboard_logging.initialize = function (callback) { } function update_html() { - update_bar_width($(".tab-onboard_logging .dataflash-used"), DATAFLASH.usedSize, DATAFLASH.totalSize, "Used space", false); - update_bar_width($(".tab-onboard_logging .dataflash-free"), DATAFLASH.totalSize - DATAFLASH.usedSize, DATAFLASH.totalSize, "Free space", false); + update_bar_width($(".tab-onboard_logging .dataflash-used"), FC.DATAFLASH.usedSize, FC.DATAFLASH.totalSize, "Used space", false); + update_bar_width($(".tab-onboard_logging .dataflash-free"), FC.DATAFLASH.totalSize - FC.DATAFLASH.usedSize, FC.DATAFLASH.totalSize, "Free space", false); - update_bar_width($(".tab-onboard_logging .sdcard-other"), SDCARD.totalSizeKB - SDCARD.freeSizeKB, SDCARD.totalSizeKB, "Unavailable space", true); - update_bar_width($(".tab-onboard_logging .sdcard-free"), SDCARD.freeSizeKB, SDCARD.totalSizeKB, "Free space for logs", true); + update_bar_width($(".tab-onboard_logging .sdcard-other"), FC.SDCARD.totalSizeKB - FC.SDCARD.freeSizeKB, FC.SDCARD.totalSizeKB, "Unavailable space", true); + update_bar_width($(".tab-onboard_logging .sdcard-free"), FC.SDCARD.freeSizeKB, FC.SDCARD.totalSizeKB, "Free space for logs", true); - $(".btn a.erase-flash, .btn a.save-flash").toggleClass("disabled", DATAFLASH.usedSize == 0); + $(".btn a.erase-flash, .btn a.save-flash").toggleClass("disabled", FC.DATAFLASH.usedSize == 0); $(".tab-onboard_logging") - .toggleClass("sdcard-error", SDCARD.state == MSP.SDCARD_STATE_FATAL) - .toggleClass("sdcard-initializing", SDCARD.state == MSP.SDCARD_STATE_CARD_INIT || SDCARD.state == MSP.SDCARD_STATE_FS_INIT) - .toggleClass("sdcard-ready", SDCARD.state == MSP.SDCARD_STATE_READY); + .toggleClass("sdcard-error", FC.SDCARD.state == MSP.SDCARD_STATE_FATAL) + .toggleClass("sdcard-initializing", FC.SDCARD.state == MSP.SDCARD_STATE_CARD_INIT || FC.SDCARD.state == MSP.SDCARD_STATE_FS_INIT) + .toggleClass("sdcard-ready", FC.SDCARD.state == MSP.SDCARD_STATE_READY); - switch (SDCARD.state) { + switch (FC.SDCARD.state) { case MSP.SDCARD_STATE_NOT_PRESENT: $(".sdcard-status").text("No card inserted"); break; @@ -282,10 +291,10 @@ TABS.onboard_logging.initialize = function (callback) { $(".sdcard-status").text("Filesystem starting..."); break; default: - $(".sdcard-status").text("Unknown state " + SDCARD.state); + $(".sdcard-status").text("Unknown state " + FC.SDCARD.state); } - if (SDCARD.supported && !sdcardTimer) { + if (FC.SDCARD.supported && !sdcardTimer) { // Poll for changes in SD card status sdcardTimer = setTimeout(function() { sdcardTimer = false; @@ -343,7 +352,7 @@ TABS.onboard_logging.initialize = function (callback) { if (GUI.connected_to) { // Begin by refreshing the occupied size in case it changed while the tab was open flash_update_summary(function() { - const maxBytes = DATAFLASH.usedSize; + const maxBytes = FC.DATAFLASH.usedSize; prepare_file(function(filename) { const fs = require('fs'); @@ -415,7 +424,7 @@ TABS.onboard_logging.initialize = function (callback) { function poll_for_erase_completion() { flash_update_summary(function() { if (CONFIGURATOR.connectionValid && !eraseCancelled) { - if (DATAFLASH.ready) { + if (FC.DATAFLASH.ready) { $(".dataflash-confirm-erase")[0].close(); } else { setTimeout(poll_for_erase_completion, 500); diff --git a/tabs/osd.js b/tabs/osd.js index ae53b517..25ade1fc 100644 --- a/tabs/osd.js +++ b/tabs/osd.js @@ -1,7 +1,24 @@ -/*global $*/ 'use strict'; const inflection = require( 'inflection' ); +const path = require('path'); +const semver = require('semver'); +const mapSeries = require('promise-map-series'); +const { dialog } = require("@electron/remote"); +const Store = require('electron-store'); +const store = new Store(); + +const FC = require('./../js/fc'); +const { GUI, TABS } = require('./../js/gui'); +const MSP = require('./../js/msp'); +const MSPCodes = require('./../js/msp/MSPCodes'); +const mspHelper = require('./../js/msp/MSPHelper'); +const Settings = require('./../js/settings'); +const { globalSettings } = require('./../js/globalSettings'); +const { PortHandler } = require('./../js/port_handler'); +const i18n = require('./../js/localization'); +const jBox = require('./../js/libraries/jBox/jBox.min.js'); + var SYM = SYM || {}; SYM.LAST_CHAR = 225; // For drawing the font preview @@ -2130,7 +2147,7 @@ OSD.is_item_displayed = function(item, group) { if (typeof group.enabled === 'function' && group.enabled() === false) { return false; } - if (item.min_version && !semver.gte(CONFIG.flightControllerVersion, item.min_version)) { + if (item.min_version && !semver.gte(FC.CONFIG.flightControllerVersion, item.min_version)) { return false; } if (typeof item.enabled === 'function' && item.enabled() === false) { @@ -2157,7 +2174,7 @@ OSD.reload = function(callback) { }; MSP.promise(MSPCodes.MSP2_CF_SERIAL_CONFIG).then(function (resp) { - $.each(SERIAL_CONFIG.ports, function(index, port){ + $.each(FC.SERIAL_CONFIG.ports, function(index, port){ if(port.functions.includes('DJI_FPV')) { OSD.data.isDjiHdFpv = true; } @@ -2194,7 +2211,7 @@ OSD.reload = function(callback) { }); }); - if(semver.gte(CONFIG.flightControllerVersion, '7.1.0')) + if(semver.gte(FC.CONFIG.flightControllerVersion, '7.1.0')) { MSP.send_message(MSPCodes.MSP2_INAV_CUSTOM_OSD_ELEMENTS); } @@ -2613,7 +2630,7 @@ OSD.GUI.updateUnits = function() { for (var i = 0; i < OSD.constants.UNIT_TYPES.length; i++) { var unitType = OSD.constants.UNIT_TYPES[i]; - if (unitType.min_version && semver.lt(CONFIG.flightControllerVersion, unitType.min_version)) { + if (unitType.min_version && semver.lt(FC.CONFIG.flightControllerVersion, unitType.min_version)) { continue; } var name = i18n.getMessage(unitType.name); @@ -3180,7 +3197,7 @@ TABS.osd.initialize = function (callback) { GUI.active_tab = 'osd'; } - GUI.load(path.join(__dirname, "tabs/osd.html"), Settings.processHtml(function () { + GUI.load(path.join(__dirname, "osd.html"), Settings.processHtml(function () { // translate to user-selected language i18n.localize(); @@ -3360,14 +3377,14 @@ TABS.osd.initialize = function (callback) { // Update RX data for Crossfire detection mspHelper.loadRxConfig(function() { - useCRSFRx = (RX_CONFIG.serialrx_provider == 6); + useCRSFRx = (FC.RX_CONFIG.serialrx_provider == 6); }); // Get status of ESC Telemetry useESCTelemetry = false; MSP.send_message(MSPCodes.MSP2_CF_SERIAL_CONFIG, false, false, function() { - for (var portIndex = 0; portIndex < SERIAL_CONFIG.ports.length; portIndex++) { - var serialPort = SERIAL_CONFIG.ports[portIndex]; + for (var portIndex = 0; portIndex < FC.SERIAL_CONFIG.ports.length; portIndex++) { + var serialPort = FC.SERIAL_CONFIG.ports[portIndex]; if (serialPort.functions.indexOf("ESC") >= 0) { useESCTelemetry = true; break; @@ -3378,26 +3395,26 @@ TABS.osd.initialize = function (callback) { // Update SENSOR_CONFIG, used to detect // OSD_AIR_SPEED mspHelper.loadSensorConfig(function () { - useBaro = (SENSOR_CONFIG.barometer != 0); - usePitot = (SENSOR_CONFIG.pitot != 0); + useBaro = (FC.SENSOR_CONFIG.barometer != 0); + usePitot = (FC.SENSOR_CONFIG.pitot != 0); GUI.content_ready(callback); }); - if(semver.gte(CONFIG.flightControllerVersion, '7.1.0')) { + if(semver.gte(FC.CONFIG.flightControllerVersion, '7.1.0')) { mspHelper.loadOsdCustomElements(createCustomElements); } })); }; function createCustomElements(){ - if(OSD_CUSTOM_ELEMENTS.settings.customElementsCount == 0){ + if(FC.OSD_CUSTOM_ELEMENTS.settings.customElementsCount == 0){ $('.custom-element-container').remove(); return; } var customElementsContainer = $('#osdCustomElements'); - for(var i = 0; i < OSD_CUSTOM_ELEMENTS.settings.customElementsCount; i++){ + for(var i = 0; i < FC.OSD_CUSTOM_ELEMENTS.settings.customElementsCount; i++){ var label = $('