diff --git a/locales/en/messages.json b/locales/en/messages.json index 80ae745340..e63b02b935 100755 --- a/locales/en/messages.json +++ b/locales/en/messages.json @@ -138,6 +138,10 @@ "rememberLastTab": { "message": "Reopen last tab on connect" }, + "meteredConnection": { + "message": "Disable internet access (for metered or slow connections)", + "description": "Text for the option to disable internet access for metered connection or to disable data over slow connections" + }, "analyticsOptOut": { "message": "Opt out of the anonymised collection of statistics data" }, @@ -1198,6 +1202,34 @@ "initialSetupEepromSaved": { "message": "EEPROM saved" }, + "initialSetupNetworkInfo": { + "message": "Network info" + }, + "initialSetupNetworkInfoHelp": { + "message": "Shows network connection status", + "description": "Message that pops up to describe the Network Connection section" + }, + "initialSetupNetworkInfoStatus": { + "message": "Status:" + }, + "initialSetupNetworkInfoStatusOnline": { + "message": "Online" + }, + "initialSetupNetworkInfoStatusOffline": { + "message": "Offline" + }, + "initialSetupNetworkInfoStatusSlow": { + "message": "Slow" + }, + "initialSetupNetworkType": { + "message": "Type:" + }, + "initialSetupNetworkRtt": { + "message": "RTT:" + }, + "initialSetupNetworkDownlink": { + "message": "Downlink:" + }, "featureNone": { "message": "<Select One>" }, diff --git a/src/js/Sponsor.js b/src/js/Sponsor.js index 99b2e5ef36..8f8cc0a34e 100644 --- a/src/js/Sponsor.js +++ b/src/js/Sponsor.js @@ -1,15 +1,16 @@ import BuildApi from './BuildApi'; import DarkTheme from './DarkTheme'; +import { ispConnected } from './utils/connection'; export default class Sponsor { constructor () { this._api = new BuildApi(); - this._timer = setInterval(() => { this.Refresh(); }, 30000); + this._timer = ispConnected() ? setInterval(() => { this.Refresh(); }, 30000) : null; } Refresh() { - if (!navigator.onLine) { + if (!ispConnected()) { return; } diff --git a/src/js/serial_backend.js b/src/js/serial_backend.js index ca672ec6db..bc95ca4ffc 100644 --- a/src/js/serial_backend.js +++ b/src/js/serial_backend.js @@ -25,6 +25,7 @@ import BuildApi from "./BuildApi"; import { serialShim } from "./serial_shim.js"; import { EventBus } from "../components/eventBus"; +import { ispConnected } from "./utils/connection"; let serial = serialShim(); @@ -463,7 +464,7 @@ function checkReportProblems() { if (needsProblemReportingDialog) { - problems.map((problem) => { + problems.forEach((problem) => { problemItemTemplate.clone().html(problem.description).appendTo(problemDialogList); }); @@ -491,7 +492,7 @@ async function processBuildOptions() { // firmware 1_45 or higher is required to support cloud build options // firmware 1_46 or higher retrieves build options from the flight controller - if (supported && FC.CONFIG.buildKey.length === 32 && navigator.onLine) { + if (supported && FC.CONFIG.buildKey.length === 32 && ispConnected()) { const buildApi = new BuildApi(); function onLoadCloudBuild(options) { diff --git a/src/js/tabs/cli.js b/src/js/tabs/cli.js index 205c38e2fa..a161c5e5e9 100644 --- a/src/js/tabs/cli.js +++ b/src/js/tabs/cli.js @@ -12,6 +12,7 @@ import jBox from "jbox"; import $ from 'jquery'; import { serialShim } from "../serial_shim"; import FileSystem from "../FileSystem"; +import { ispConnected } from "../utils/connection"; const serial = serialShim(); @@ -229,7 +230,7 @@ cli.initialize = function (callback) { }); $('a.support') - .toggle(navigator.onLine) + .toggle(ispConnected()) .on('click', function() { function submitSupportData(data) { diff --git a/src/js/tabs/firmware_flasher.js b/src/js/tabs/firmware_flasher.js index 16b2815bb1..a7366374c8 100644 --- a/src/js/tabs/firmware_flasher.js +++ b/src/js/tabs/firmware_flasher.js @@ -18,6 +18,7 @@ import DFU from '../protocols/webusbdfu'; import AutoBackup from '../utils/AutoBackup.js'; import AutoDetect from '../utils/AutoDetect.js'; import { EventBus } from "../../components/eventBus"; +import { ispConnected } from '../utils/connection.js'; const firmware_flasher = { targets: null, @@ -147,7 +148,7 @@ firmware_flasher.initialize = function (callback) { } function loadTargetList(targets) { - if (!targets || !navigator.onLine) { + if (!targets || !ispConnected()) { $('select[name="board"]').empty().append(''); $('select[name="firmware_version"]').empty().append(''); @@ -214,7 +215,7 @@ firmware_flasher.initialize = function (callback) { } function buildOptions(data) { - if (!navigator.onLine) { + if (!ispConnected()) { return; } @@ -1133,7 +1134,7 @@ firmware_flasher.initialize = function (callback) { } self.buildApi.loadTargets(() => { - $('#content').load("./tabs/firmware_flasher.html", onDocumentLoad); + $('#content').load("./tabs/firmware_flasher.html", onDocumentLoad); }); }; @@ -1142,7 +1143,7 @@ firmware_flasher.initialize = function (callback) { firmware_flasher.validateBuildKey = function() { - return this.cloudBuildKey?.length === 32 && navigator.onLine; + return this.cloudBuildKey?.length === 32 && ispConnected(); }; firmware_flasher.cleanup = function (callback) { diff --git a/src/js/tabs/gps.js b/src/js/tabs/gps.js index 3ab9cfbdc4..3a56c6b677 100644 --- a/src/js/tabs/gps.js +++ b/src/js/tabs/gps.js @@ -11,6 +11,7 @@ import { mspHelper } from '../msp/MSPHelper'; import { updateTabList } from '../utils/updateTabList'; import { initMap } from './map'; import { fromLonLat } from "ol/proj"; +import { ispConnected } from "../utils/connection"; const gps = {}; @@ -352,7 +353,7 @@ gps.initialize = async function (callback) { let gpsFoundPosition = false; - if (navigator.onLine) { + if (ispConnected()) { $('#connect').hide(); gpsFoundPosition = !!(lon && lat); @@ -382,7 +383,7 @@ gps.initialize = async function (callback) { }, 75, true); //check for internet connection on load - if (navigator.onLine) { + if (ispConnected()) { console.log('Online'); set_online(); } else { @@ -391,7 +392,7 @@ gps.initialize = async function (callback) { } $("#check").on('click',function(){ - if (navigator.onLine) { + if (ispConnected()) { console.log('Online'); set_online(); } else { diff --git a/src/js/tabs/options.js b/src/js/tabs/options.js index dedde3c0df..4a02a92148 100644 --- a/src/js/tabs/options.js +++ b/src/js/tabs/options.js @@ -8,6 +8,7 @@ import { checkForConfiguratorUpdates } from '../utils/checkForConfiguratorUpdate import { checkSetupAnalytics } from '../Analytics'; import $ from 'jquery'; import NotificationManager from '../utils/notifications'; +import { ispConnected } from '../utils/connection'; const options = {}; options.initialize = function (callback) { @@ -30,6 +31,7 @@ options.initialize = function (callback) { TABS.options.initShowDevToolsOnStartup(); TABS.options.initShowNotifications(); TABS.options.initShowWarnings(); + TABS.options.initMeteredConnection(); GUI.content_ready(callback); }); @@ -228,6 +230,18 @@ options.initShowNotifications = function () { .change(); }; +options.initMeteredConnection = function () { + const result = getConfig("meteredConnection"); + $("div.meteredConnection input") + .prop("checked", !!result.meteredConnection) + .on('change', function () { + setConfig({ meteredConnection: $(this).is(":checked") }); + // update network status + ispConnected(); + }) + .trigger('change'); +}; + // TODO: remove when modules are in place TABS.options = options; export { options }; diff --git a/src/js/tabs/setup.js b/src/js/tabs/setup.js index b0fd9c4faa..595992a839 100644 --- a/src/js/tabs/setup.js +++ b/src/js/tabs/setup.js @@ -11,6 +11,7 @@ import MSPCodes from '../msp/MSPCodes'; import { API_VERSION_1_45, API_VERSION_1_46 } from '../data_storage'; import { gui_log } from '../gui_log'; import $ from 'jquery'; +import { ispConnected } from '../utils/connection'; const setup = { yaw_fix: 0.0, @@ -411,7 +412,7 @@ setup.initialize = function (callback) { const showBuildInfo = function() { const supported = FC.CONFIG.buildKey.length === 32; - if (supported && navigator.onLine) { + if (supported && ispConnected()) { const buildRoot = `https://build.betaflight.com/api/builds/${FC.CONFIG.buildKey}`; const buildConfig = ` ${i18n.getMessage('initialSetupInfoBuildConfig')}`; @@ -426,7 +427,7 @@ setup.initialize = function (callback) { }; const showBuildOptions = function() { - const supported = (semver.eq(FC.CONFIG.apiVersion, API_VERSION_1_45) && navigator.onLine || semver.gte(FC.CONFIG.apiVersion, API_VERSION_1_46)) && FC.CONFIG.buildOptions.length; + const supported = (semver.eq(FC.CONFIG.apiVersion, API_VERSION_1_45) && ispConnected() || semver.gte(FC.CONFIG.apiVersion, API_VERSION_1_46)) && FC.CONFIG.buildOptions.length; if (supported) { let buildOptionList = `
`; @@ -464,9 +465,33 @@ setup.initialize = function (callback) { } } + function showNetworkStatus() { + const networkStatus = ispConnected(); + + let statusText = ''; + + const type = navigator.connection.effectiveType; + const downlink = navigator.connection.downlink; + const rtt = navigator.connection.rtt; + + if (!networkStatus || !navigator.onLine || type === 'none') { + statusText = i18n.getMessage('initialSetupNetworkInfoStatusOffline'); + } else if (type === 'slow-2g' || type === '2g' || downlink < 0.115 || rtt > 1000) { + statusText = i18n.getMessage('initialSetupNetworkInfoStatusSlow'); + } else { + statusText = i18n.getMessage('initialSetupNetworkInfoStatusOnline'); + } + + $('.network-status').text(statusText); + $('.network-type').text(navigator.connection.effectiveType); + $('.network-downlink').text(`${navigator.connection.downlink} Mbps`); + $('.network-rtt').text(navigator.connection.rtt); + } + prepareDisarmFlags(); showSensorInfo(); showFirmwareInfo(); + showNetworkStatus(); // Show Sonar info box if sensor exist if (!have_sensor(FC.CONFIG.activeSensors, 'sonar')) { diff --git a/src/js/utils/connection.js b/src/js/utils/connection.js new file mode 100644 index 0000000000..26d4653812 --- /dev/null +++ b/src/js/utils/connection.js @@ -0,0 +1,9 @@ +import { get as getConfig } from "../ConfigStorage"; + +export function ispConnected() { + const connected = navigator.onLine; + const isMetered = getConfig('meteredConnection').meteredConnection; + + return connected && !isMetered; +} + diff --git a/src/tabs/options.html b/src/tabs/options.html index fc967ef8fa..3dfa502cee 100644 --- a/src/tabs/options.html +++ b/src/tabs/options.html @@ -17,6 +17,12 @@
+
+
+ +
+ +
diff --git a/src/tabs/setup.html b/src/tabs/setup.html index 62bc898b30..a86d502daf 100644 --- a/src/tabs/setup.html +++ b/src/tabs/setup.html @@ -235,6 +235,34 @@
+
+
+
+
+
+
+ + + + + + + + + + + + + + + + + + + + +
+