diff --git a/.travis.yml b/.travis.yml index 857c8f6c..1cb253a4 100644 --- a/.travis.yml +++ b/.travis.yml @@ -43,7 +43,6 @@ before_install: script: - yarn test - yarn gulp release - - if [[ "$TRAVIS_OS_NAME" == "linux" ]]; then yarn gulp release --chromeos; fi cache: directories: diff --git a/README.md b/README.md index c53f8d21..07307c8a 100644 --- a/README.md +++ b/README.md @@ -6,9 +6,7 @@ Betaflight Configurator is a crossplatform configuration tool for the Betaflight flight control system. -It runs as an app within Google Chrome and allows you to configure the Betaflight software running on any [supported Betaflight target](https://github.com/betaflight/betaflight/tree/master/src/main/target). - -There is also now a standalone version available, since Google Chrome Apps are getting deprecated on platforms that aren't Chrome OS. [Downloads are available in Releases.](https://github.com/betaflight/betaflight-configurator/releases) +It runs as an application under different operating systems and allows you to configure the Betaflight software running on any supported Betaflight target. [Downloads are available in Releases.](https://github.com/betaflight/betaflight-configurator/releases) Various types of aircraft are supported by the tool and by Betaflight, e.g. quadcopters, hexacopters, octocopters and fixed-wing aircraft. @@ -17,6 +15,7 @@ Various types of aircraft are supported by the tool and by Betaflight, e.g. quad Betaflight Configurator is a [fork](#credits) of the Cleanflight Configurator with support for Betaflight instead of Cleanflight. This configurator is the only configurator with support for Betaflight specific features. It will likely require that you run the latest firmware on the flight controller. + If you are experiencing any problems please make sure you are running the [latest firmware version](https://github.com/betaflight/betaflight/releases/). ## Installation @@ -31,17 +30,6 @@ Download the installer from [Releases.](https://github.com/betaflight/betaflight Changes to the security model used in the latest versions of MacOS X 10.14 (Mojave) and 10.15 (Catalina) mean that the operating system will show an error message ('"Betaflight Configurator.app" is damaged and can’t be opened. You should move it to the Trash.') when trying to install the application. To work around this, run the following command in a terminal after installing: `sudo xattr -rd com.apple.quarantine /Applications/Betaflight\ Configurator.app`. - -### Via Chrome Web Store (for ChromeOS) - -[![available in the Chrome web store for Chromeos](https://developer.chrome.com/webstore/images/ChromeWebStore_Badge_v2_206x58.png)](https://chrome.google.com/webstore/detail/dlgclabibdhkfnbkajgkplmkpndajfom) - -1. Visit the [Betaflight Configurator product page in the Chrome web store](https://chrome.google.com/webstore/detail/dlgclabibdhkfnbkajgkplmkpndajfom) -2. Click **+ Add to Chrome** - -Please note - the application will automatically update itself when new versions are released. Please ensure you maintain configuration backups as described in the Betaflight documentation. - - ### Unstable Testing Versions Unstable testing versions of the lates builds of the configurator for most platforms can be downloaded from [here](https://github.com/betaflight/betaflight-configurator-nightlies/releases/). @@ -84,12 +72,12 @@ To build or release only for one specific platform you can append the plaform af If no platform is provided, all the platforms will be done in sequence. * **MacOS X** use `yarn gulp --osx64` -* **Linux** use `yarn gulp --linux64` -* **Windows** use `yarn gulp --win32` -* **ChromeOS** use `yarn gulp --chromeos` +* **Linux** use `yarn gulp --linux64` +* **Windows** use `yarn gulp --win32` * **Android** use `yarn gulp --android` -You can also use multiple platforms e.g. `yarn gulp --osx64 --linux64`. + +You can also use multiple platforms e.g. `yarn gulp --osx64 --linux64`. Other platforms like `--win64`, `--linux32` and `--armv7` can be used too, but they are not officially supported, so use them at your own risk. ## Languages @@ -101,7 +89,7 @@ If you prefer to have the application in English or any other language, you can ### Graphics Issues -If you experience graphics display problems or smudged/dithered fonts display issues in Betaflight Configurator, try invoking the betaflight-configurator executable file with the --disable-gpu command line switch. This will switch off hardware graphics acceleration. Likewise, setting your graphics card antialiasing option to OFF (e.g. FXAA parameter on NVidia graphics cards) might be a remedy as well. +If you experience graphics display problems or smudged/dithered fonts display issues in Betaflight Configurator, try invoking the `betaflight-configurator` executable file with the `--disable-gpu` command line switch. This will switch off hardware graphics acceleration. Likewise, setting your graphics card antialiasing option to OFF (e.g. FXAA parameter on NVidia graphics cards) might be a remedy as well. ### Linux users @@ -111,10 +99,6 @@ In most Linux distributions your user won't have access to serial interfaces by sudo usermod -aG dialout ${USER} ``` -### Linux / MacOS X users - -If you have 3D model animation problems, enable "Override software rendering list" in Chrome flags chrome://flags/#ignore-gpu-blacklist - ## Support If you need help please reach out on the [betaflightgroup](https://betaflightgroup.slack.com) slack channel before raising issues on github. Register and [request slack access here](https://slack.betaflight.com). @@ -142,4 +126,3 @@ We accept clean and reasonable patches, submit them! ctn - primary author and maintainer of Baseflight Configurator from which Cleanflight Configurator project was forked. Hydra - author and maintainer of Cleanflight Configurator from which this project was forked. - diff --git a/gulpfile.js b/gulpfile.js index dda812f1..d3f71454 100644 --- a/gulpfile.js +++ b/gulpfile.js @@ -112,10 +112,10 @@ gulp.task('default', debugBuild); // Get platform from commandline args // # -// # gulp []+ Run only for platform(s) (with one of --linux64, --linux32, --armv7, --osx64, --win32, --win64, --chromeos or --android) +// # gulp []+ Run only for platform(s) (with one of --linux64, --linux32, --armv7, --osx64, --win32, --win64, or --android) // # function getInputPlatforms() { - const supportedPlatforms = ['linux64', 'linux32', 'armv7', 'osx64', 'win32','win64', 'chromeos', 'android']; + const supportedPlatforms = ['linux64', 'linux32', 'armv7', 'osx64', 'win32', 'win64', 'android']; var platforms = []; var regEx = /--(\w+)/; console.log(process.argv); @@ -193,30 +193,36 @@ function removeItem(platforms, item) { } function getRunDebugAppCommand(arch) { + + let command; + switch (arch) { case 'osx64': - return 'open ' + path.join(DEBUG_DIR, pkg.name, arch, pkg.name + '.app'); + const pkgName = `${pkg.name}.app`; + command = `open ${path.join(DEBUG_DIR, pkg.name, arch, pkgName)}`; break; case 'linux64': case 'linux32': case 'armv7': - return path.join(DEBUG_DIR, pkg.name, arch, pkg.name); + command = path.join(DEBUG_DIR, pkg.name, arch, pkg.name); break; case 'win32': case 'win64': - return path.join(DEBUG_DIR, pkg.name, arch, pkg.name + '.exe'); + command = path.join(DEBUG_DIR, pkg.name, arch, `${pkg.name}.exe`); break; default: - return ''; + command = ''; break; } + + return command; } function getReleaseFilename(platform, ext) { @@ -258,7 +264,6 @@ function dist_src() { return packageJson .pipe(source('package.json')) .pipe(gulp.src(distSources, { base: 'src' })) - .pipe(gulp.src('manifest.json', { passthrougth: true })) .pipe(gulp.src('yarn.lock', { passthrougth: true })) .pipe(gulp.dest(DIST_DIR)); } @@ -295,7 +300,6 @@ function dist_resources() { // Create runable app directories in ./apps function apps(done) { var platforms = getPlatforms(); - removeItem(platforms, 'chromeos'); removeItem(platforms, 'android'); buildNWAppsWrapper(platforms, 'normal', APPS_DIR, done); @@ -355,7 +359,6 @@ function post_build(arch, folder, done) { // Create debug app directories in ./debug function debug(done) { var platforms = getPlatforms(); - removeItem(platforms, 'chromeos'); removeItem(platforms, 'android'); buildNWAppsWrapper(platforms, 'sdk', DEBUG_DIR, done); @@ -567,15 +570,6 @@ function release_zip(arch, appDirectory) { return compressFiles(src, base, output, 'Betaflight Configurator'); } -// Create distribution package for chromeos platform -function release_chromeos() { - var src = path.join(DIST_DIR, '**'); - var output = getReleaseFilename('chromeos', 'zip'); - var base = DIST_DIR; - - return compressFiles(src, base, output, '.'); -} - // Compress files from srcPath, using basePath, to outputFile in the RELEASE_DIR function compressFiles(srcPath, basePath, outputFile, zipFolder) { return gulp.src(srcPath, { base: basePath }) @@ -729,10 +723,6 @@ function listReleaseTasks(appDirectory) { var releaseTasks = []; - if (platforms.indexOf('chromeos') !== -1) { - releaseTasks.push(release_chromeos); - } - if (platforms.indexOf('linux64') !== -1) { releaseTasks.push(function release_linux64_zip() { return release_zip('linux64', appDirectory); diff --git a/manifest.json b/manifest.json deleted file mode 100644 index b76ff4f5..00000000 --- a/manifest.json +++ /dev/null @@ -1,65 +0,0 @@ -{ - "manifest_version": 2, - "minimum_chrome_version": "49", - "version": "10.8.0", - "author": "Betaflight Squad", - "name": "Betaflight - Configurator", - "short_name": "Betaflight", - "description": "Crossplatform configuration tool for Betaflight flight control system", - - "offline_enabled": true, - - "default_locale": "en", - - "app": { - "background": { - "scripts": ["js/chromeAppEventPage.js"], - "persistent": false - } - }, - "permissions": [ - "https://api.openstreetmap.org/", - "https://*.github.com/", - "https://*.githubusercontent.com/", - "http://*.baseflight.net/", - "https://*.amazonaws.com/", - "https://*.betaflight.tech/", - "https://www.google-analytics.com/", - "serial", - "usb", - "storage", - "clipboardRead", - "fileSystem", - "fileSystem.write", - "fileSystem.retainEntries", - "notifications", - "alwaysOnTopWindows", - {"usbDevices": [ - {"vendorId": 1155, "productId": 57105}, - {"vendorId": 10473, "productId": 393} - ]}, - "webview", - "unlimitedStorage" - ], - "sockets": { - "tcp": { - "connect": "*:*" - } - }, - "webview": { - "partitions": [ - { - "name": "map", - "accessible_resources" : ["tabs/map.html", - "js/tabs/map.js", - "/js/libraries/openlayers/ol.css", - "/js/libraries/openlayers/ol.js", - "/images/icons/cf_icon_position.png", - "/images/icons/cf_icon_position_nofix.png"] - } - ] - }, - "icons": { - "128": "images/bf_icon_128.png" - } -} diff --git a/src/js/Clipboard.js b/src/js/Clipboard.js index 91dd6d4b..75c045fe 100644 --- a/src/js/Clipboard.js +++ b/src/js/Clipboard.js @@ -57,28 +57,6 @@ Clipboard._configureClipboardAsNwJs = function(nwGui) { }; }; -Clipboard._configureClipboardAsChrome = function() { - - console.log('Chrome Clipboard available'); - - this.available = true; - this.readAvailable = false; // FIXME: for some reason the read is not working - this.writeAvailable = true; - - this.writeText = function(text, onSuccess, onError) { - navigator.clipboard.writeText(text) - .then(onSuccess) - .catch(onError); - }; - - this.readText = function(onSuccess, onError) { - navigator.clipboard.readText() - .then(onSuccess) - .catch(onError); - }; - -}; - Clipboard._configureClipboardAsCordova = function() { console.log('Cordova Clipboard available'); @@ -116,8 +94,6 @@ Clipboard._configureClipboardAsOther = function() { if (GUI.isNWJS()){ Clipboard._configureClipboardAsNwJs(GUI.nwGui); -} else if (GUI.isChromeApp()) { - Clipboard._configureClipboardAsChrome(); } else if (GUI.isCordova()) { Clipboard._configureClipboardAsCordova(); } else { diff --git a/src/js/ConfigStorage.js b/src/js/ConfigStorage.js index 4f59caac..49567e07 100644 --- a/src/js/ConfigStorage.js +++ b/src/js/ConfigStorage.js @@ -5,10 +5,6 @@ var ConfigStorage = { // key can be one string, or array of strings get: function(key, callback) { - if (GUI.isChromeApp()) { - chrome.storage.local.get(key,callback); - } else { - //console.log('Abstraction.get',key); if (Array.isArray(key)) { var obj = {}; key.forEach(function (element) { @@ -33,19 +29,13 @@ var ConfigStorage = { callback({}); } } - } }, // set takes an object like {'userLanguageSelect':'DEFAULT'} set: function(input) { - if (GUI.isChromeApp()) { - chrome.storage.local.set(input); - } else { - //console.log('Abstraction.set',input); Object.keys(input).forEach(function (element) { var tmpObj = {}; tmpObj[element] = input[element]; window.localStorage.setItem(element, JSON.stringify(tmpObj)); }); - } } } diff --git a/src/js/chromeAppEventPage.js b/src/js/chromeAppEventPage.js deleted file mode 100644 index 43624c77..00000000 --- a/src/js/chromeAppEventPage.js +++ /dev/null @@ -1,27 +0,0 @@ -/* - If an id is also specified and a window with a matching id has been shown before, the remembered bounds of the window will be used instead. -*/ -'use strict'; - -function startApplication() { - chrome.app.window.create('main.html', { - id: 'main-window', - frame: 'chrome', - innerBounds: { - minWidth: 1024, - minHeight: 550, - }, - }, function (createdWindow) { - if (getChromeVersion() >= 54) { - createdWindow.icon = 'images/bf_icon_128.png'; - } - }); -} - -chrome.app.runtime.onLaunched.addListener(startApplication); - -function getChromeVersion () { - const raw = navigator.userAgent.match(/Chrom(e|ium)\/([0-9]+)\./); - - return raw ? parseInt(raw[2], 10) : false; -} diff --git a/src/js/gui.js b/src/js/gui.js index 177b176c..377391b9 100644 --- a/src/js/gui.js +++ b/src/js/gui.js @@ -5,7 +5,6 @@ window.TABS = {}; // filled by individual tab js file const GUI_MODES = { NWJS: "NW.js", - ChromeApp: "Chrome", Cordova: "Cordova", Other: "Other", }; @@ -67,11 +66,7 @@ const GuiControl = function () { if (typeof cordovaApp !== 'undefined') { this.Mode = GUI_MODES.Cordova; } else { - if (window.chrome && chrome.storage && chrome.storage.local) { - this.Mode = GUI_MODES.ChromeApp; - } else { - this.Mode = GUI_MODES.Other; - } + this.Mode = GUI_MODES.Other; } } }; @@ -81,8 +76,6 @@ function GUI_checkOperatingSystem() { return "Windows"; } else if (navigator.appVersion.indexOf("Mac") !== -1) { return "MacOS"; - } else if (navigator.appVersion.indexOf("CrOS") !== -1) { - return "ChromeOS"; } else if (navigator.appVersion.indexOf("Android") !== -1) { return "Android"; } else if (navigator.appVersion.indexOf("Linux") !== -1) { @@ -395,12 +388,10 @@ GuiControl.prototype.selectDefaultTabWhenConnected = function() { }); }; -GuiControl.prototype.isChromeApp = function () { - return this.Mode === GUI_MODES.ChromeApp; -}; GuiControl.prototype.isNWJS = function () { return this.Mode === GUI_MODES.NWJS; }; + GuiControl.prototype.isCordova = function () { return this.Mode === GUI_MODES.Cordova; }; diff --git a/src/js/main.js b/src/js/main.js index c11f2155..6f468f50 100644 --- a/src/js/main.js +++ b/src/js/main.js @@ -14,17 +14,6 @@ function appReady() { CONFIGURATOR.version = data.version; CONFIGURATOR.gitChangesetId = data.gitChangesetId; - // Version in the ChromeApp's manifest takes precedence. - if(chrome.runtime && chrome.runtime.getManifest && !GUI.isCordova()) { - const manifest = chrome.runtime.getManifest(); - CONFIGURATOR.version = manifest.version; - // manifest.json for ChromeApp can't have a version - // with a prerelease tag eg 10.0.0-RC4 - // Work around is to specify the prerelease version in version_name - if (manifest.version_name) { - CONFIGURATOR.version = manifest.version_name; - } - } i18n.init(function() { startProcess(); @@ -181,10 +170,6 @@ function startProcess() { GUI.nwGui.Shell.openExternal(url); }); nwWindow.on('close', closeHandler); - } else if (GUI.isChromeApp()) { - chrome.app.window.onClosed.addListener(closeHandler); - // This event does not actually get fired: - chrome.runtime.onSuspend.addListener(closeHandler); } else if (GUI.isCordova()) { window.addEventListener('beforeunload', closeHandler); document.addEventListener('backbutton', function(e) { diff --git a/src/js/tabs/vtx.js b/src/js/tabs/vtx.js index f6e420ca..67b944c8 100644 --- a/src/js/tabs/vtx.js +++ b/src/js/tabs/vtx.js @@ -116,9 +116,8 @@ TABS.vtx.initialize = function (callback) { // Load schema const urlVtxSchema = chrome.runtime.getURL(`resources/jsonschema/vtxconfig_schema-${vtxConfig.version}.json`); - if (GUI.isChromeApp() || GUI.isCordova()) { - // FIXME the ChromeOs don't let us use a Schema Validator because almost all of them use eval, and/or use require - // On android : Fetch API cannot load : URL scheme "file" is not supported + if (GUI.isCordova()) { + // FIXME On android : Fetch API cannot load : URL scheme "file" is not supported callback_valid(); } else { fetch(urlVtxSchema)