1
0
Fork 0
mirror of https://github.com/betaflight/betaflight-configurator.git synced 2025-07-15 20:35:23 +03:00

RF: Moved Analytics to class (#3222)

* RF: Moved Analytics to class

* Modularisation of Google analytics.

* Removing the code smells

* Fix the unit tests

* Simplified

* Removed comment
This commit is contained in:
J Blackman 2023-01-08 05:56:26 +11:00 committed by GitHub
parent 00075939ac
commit fd99e77335
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
21 changed files with 251 additions and 233 deletions

View file

@ -1,180 +1,186 @@
'use strict';
const Analytics = function (trackingId, userId, appName, appVersion, gitRevision, os, checkForDebugVersions, optOut, debugMode, buildType) { let tracking = null;
this._trackingId = trackingId; export { tracking };
this.setOptOut(optOut); export function createAnalytics(ga, settings) {
tracking = new Analytics(ga, settings);
}
this._googleAnalytics = googleAnalytics; class Analytics {
this._googleAnalytics.initialize(this._trackingId, { constructor (ga, settings) {
storage: 'none', // trackingId, userId, appName, appVersion, gitRevision, os, checkForDebugVersions, optOut, debugMode, buildType
clientId: userId, this._trackingId = settings.trackingId;
debug: !!debugMode,
});
// Make it work for the Chrome App: this.setOptOut(settings.optOut);
this._googleAnalytics.set('forceSSL', true);
this._googleAnalytics.set('transport', 'xhr');
// Make it work for NW.js: this._googleAnalytics = ga;
this._googleAnalytics.set('checkProtocolTask', null);
this._googleAnalytics.set('appName', appName); this._googleAnalytics.initialize(this._trackingId, {
this._googleAnalytics.set('appVersion', debugMode ? `${appVersion}-debug` : appVersion); storage: 'none',
clientId: settings.userId,
debug: !!settings.debugMode,
});
this.EVENT_CATEGORIES = { // Make it work for the Chrome App:
APPLICATION: 'Application', this._googleAnalytics.set('forceSSL', true);
FLIGHT_CONTROLLER: 'FlightController', this._googleAnalytics.set('transport', 'xhr');
FLASHING: 'Flashing',
};
this.DATA = { // Make it work for NW.js:
BOARD_TYPE: 'boardType', this._googleAnalytics.set('checkProtocolTask', null);
API_VERSION: 'apiVersion',
FIRMWARE_TYPE: 'firmwareType',
FIRMWARE_VERSION: 'firmwareVersion',
FIRMWARE_NAME: 'firmwareName',
FIRMWARE_SOURCE: 'firmwareSource',
FIRMWARE_CHANNEL: 'firmwareChannel',
FIRMWARE_ERASE_ALL: 'firmwareEraseAll',
FIRMWARE_SIZE: 'firmwareSize',
MCU_ID: 'mcuId',
LOGGING_STATUS: 'loggingStatus',
LOG_SIZE: 'logSize',
TARGET_NAME: 'targetName',
BOARD_NAME: 'boardName',
MANUFACTURER_ID: 'manufacturerId',
MCU_TYPE: 'mcuType',
};
this.DIMENSIONS = { this._googleAnalytics.set('appName', settings.appName);
CONFIGURATOR_OS: 1, this._googleAnalytics.set('appVersion', settings.debugMode ? `${settings.appVersion}-debug` : settings.appVersion);
BOARD_TYPE: 2,
FIRMWARE_TYPE: 3,
FIRMWARE_VERSION: 4,
API_VERSION: 5,
FIRMWARE_NAME: 6,
FIRMWARE_SOURCE: 7,
FIRMWARE_ERASE_ALL: 8,
CONFIGURATOR_EXPERT_MODE: 9,
FIRMWARE_CHANNEL: 10,
LOGGING_STATUS: 11,
MCU_ID: 12,
CONFIGURATOR_CHANGESET_ID: 13,
CONFIGURATOR_USE_DEBUG_VERSIONS: 14,
TARGET_NAME: 15,
BOARD_NAME: 16,
MANUFACTURER_ID: 17,
MCU_TYPE: 18,
CONFIGURATOR_BUILD_TYPE: 19,
};
this.METRICS = { this.EVENT_CATEGORIES = {
FIRMWARE_SIZE: 1, APPLICATION: 'Application',
LOG_SIZE: 2, FLIGHT_CONTROLLER: 'FlightController',
}; FLASHING: 'Flashing',
};
this.setDimension(this.DIMENSIONS.CONFIGURATOR_OS, os); this.DATA = {
this.setDimension(this.DIMENSIONS.CONFIGURATOR_CHANGESET_ID, gitRevision); BOARD_TYPE: 'boardType',
this.setDimension(this.DIMENSIONS.CONFIGURATOR_USE_DEBUG_VERSIONS, checkForDebugVersions); API_VERSION: 'apiVersion',
this.setDimension(this.DIMENSIONS.CONFIGURATOR_BUILD_TYPE, buildType); FIRMWARE_TYPE: 'firmwareType',
FIRMWARE_VERSION: 'firmwareVersion',
FIRMWARE_NAME: 'firmwareName',
FIRMWARE_SOURCE: 'firmwareSource',
FIRMWARE_CHANNEL: 'firmwareChannel',
FIRMWARE_ERASE_ALL: 'firmwareEraseAll',
FIRMWARE_SIZE: 'firmwareSize',
MCU_ID: 'mcuId',
LOGGING_STATUS: 'loggingStatus',
LOG_SIZE: 'logSize',
TARGET_NAME: 'targetName',
BOARD_NAME: 'boardName',
MANUFACTURER_ID: 'manufacturerId',
MCU_TYPE: 'mcuType',
};
this.resetFlightControllerData(); this.DIMENSIONS = {
this.resetFirmwareData(); CONFIGURATOR_OS: 1,
}; BOARD_TYPE: 2,
FIRMWARE_TYPE: 3,
FIRMWARE_VERSION: 4,
API_VERSION: 5,
FIRMWARE_NAME: 6,
FIRMWARE_SOURCE: 7,
FIRMWARE_ERASE_ALL: 8,
CONFIGURATOR_EXPERT_MODE: 9,
FIRMWARE_CHANNEL: 10,
LOGGING_STATUS: 11,
MCU_ID: 12,
CONFIGURATOR_CHANGESET_ID: 13,
CONFIGURATOR_USE_DEBUG_VERSIONS: 14,
TARGET_NAME: 15,
BOARD_NAME: 16,
MANUFACTURER_ID: 17,
MCU_TYPE: 18,
CONFIGURATOR_BUILD_TYPE: 19,
};
Analytics.prototype.setDimension = function (dimension, value) { this.METRICS = {
const dimensionName = `dimension${dimension}`; FIRMWARE_SIZE: 1,
this._googleAnalytics.custom(dimensionName, value); LOG_SIZE: 2,
}; };
Analytics.prototype.setMetric = function (metric, value) { this.setDimension(this.DIMENSIONS.CONFIGURATOR_OS, settings.os);
const metricName = `metric${metric}`; this.setDimension(this.DIMENSIONS.CONFIGURATOR_CHANGESET_ID, settings.gitRevision);
this._googleAnalytics.custom(metricName, value); this.setDimension(this.DIMENSIONS.CONFIGURATOR_USE_DEBUG_VERSIONS, settings.checkForDebugVersions);
}; this.setDimension(this.DIMENSIONS.CONFIGURATOR_BUILD_TYPE, settings.buildType);
Analytics.prototype.sendEvent = function (category, action, options) { this.resetFlightControllerData();
this._googleAnalytics.event(category, action, options); this.resetFirmwareData();
}; }
Analytics.prototype.sendChangeEvents = function (category, changeList) { setDimension(dimension, value) {
for (const actionName in changeList) { const dimensionName = `dimension${dimension}`;
if (changeList.hasOwnProperty(actionName)) { this._googleAnalytics.custom(dimensionName, value);
const actionValue = changeList[actionName]; }
if (actionValue !== undefined) {
this.sendEvent(category, actionName, { eventLabel: actionValue }); setMetric(metric, value) {
const metricName = `metric${metric}`;
this._googleAnalytics.custom(metricName, value);
}
sendEvent(category, action, options) {
this._googleAnalytics.event(category, action, options);
}
sendChangeEvents(category, changeList) {
for (const actionName in changeList) {
if (changeList.hasOwnProperty(actionName)) {
const actionValue = changeList[actionName];
if (actionValue !== undefined) {
this.sendEvent(category, actionName, { eventLabel: actionValue });
}
} }
} }
} }
};
Analytics.prototype.sendSaveAndChangeEvents = function (category, changeList, tabName) { sendSaveAndChangeEvents(category, changeList, tabName) {
this.sendEvent(category, 'Save', { this.sendEvent(category, 'Save', {
eventLabel: tabName, eventLabel: tabName,
eventValue: Object.keys(changeList).length, eventValue: Object.keys(changeList).length,
}); });
this.sendChangeEvents(category, changeList); this.sendChangeEvents(category, changeList);
}; }
Analytics.prototype.sendAppView = function (viewName) { sendAppView(viewName) {
this._googleAnalytics.screenview(viewName); this._googleAnalytics.screenview(viewName);
}; }
Analytics.prototype.sendTiming = function (category, timing, value) { sendTiming(category, timing, value) {
this._googleAnalytics.timing(category, timing, value); this._googleAnalytics.timing(category, timing, value);
}; }
Analytics.prototype.sendException = function (message) { sendException(message) {
this._googleAnalytics.exception(message); this._googleAnalytics.exception(message);
}; }
Analytics.prototype.setOptOut = function (optOut) { setOptOut(optOut) {
window[`ga-disable-${this._trackingId}`] = !!optOut; window[`ga-disable-${this._trackingId}`] = !!optOut;
}; }
Analytics.prototype._rebuildFlightControllerEvent = function () { _rebuildFlightControllerEvent() {
this.setDimension(this.DIMENSIONS.BOARD_TYPE, this._flightControllerData[this.DATA.BOARD_TYPE]); this.setDimension(this.DIMENSIONS.BOARD_TYPE, this._flightControllerData[this.DATA.BOARD_TYPE]);
this.setDimension(this.DIMENSIONS.FIRMWARE_TYPE, this._flightControllerData[this.DATA.FIRMWARE_TYPE]); this.setDimension(this.DIMENSIONS.FIRMWARE_TYPE, this._flightControllerData[this.DATA.FIRMWARE_TYPE]);
this.setDimension(this.DIMENSIONS.FIRMWARE_VERSION, this._flightControllerData[this.DATA.FIRMWARE_VERSION]); this.setDimension(this.DIMENSIONS.FIRMWARE_VERSION, this._flightControllerData[this.DATA.FIRMWARE_VERSION]);
this.setDimension(this.DIMENSIONS.API_VERSION, this._flightControllerData[this.DATA.API_VERSION]); this.setDimension(this.DIMENSIONS.API_VERSION, this._flightControllerData[this.DATA.API_VERSION]);
this.setDimension(this.DIMENSIONS.LOGGING_STATUS, this._flightControllerData[this.DATA.LOGGING_STATUS]); this.setDimension(this.DIMENSIONS.LOGGING_STATUS, this._flightControllerData[this.DATA.LOGGING_STATUS]);
this.setDimension(this.DIMENSIONS.MCU_ID, this._flightControllerData[this.DATA.MCU_ID]); this.setDimension(this.DIMENSIONS.MCU_ID, this._flightControllerData[this.DATA.MCU_ID]);
this.setMetric(this.METRICS.LOG_SIZE, this._flightControllerData[this.DATA.LOG_SIZE]); this.setMetric(this.METRICS.LOG_SIZE, this._flightControllerData[this.DATA.LOG_SIZE]);
this.setDimension(this.DIMENSIONS.TARGET_NAME, this._flightControllerData[this.DATA.TARGET_NAME]); this.setDimension(this.DIMENSIONS.TARGET_NAME, this._flightControllerData[this.DATA.TARGET_NAME]);
this.setDimension(this.DIMENSIONS.BOARD_NAME, this._flightControllerData[this.DATA.BOARD_NAME]); this.setDimension(this.DIMENSIONS.BOARD_NAME, this._flightControllerData[this.DATA.BOARD_NAME]);
this.setDimension(this.DIMENSIONS.MANUFACTURER_ID, this._flightControllerData[this.DATA.MANUFACTURER_ID]); this.setDimension(this.DIMENSIONS.MANUFACTURER_ID, this._flightControllerData[this.DATA.MANUFACTURER_ID]);
this.setDimension(this.DIMENSIONS.MCU_TYPE, this._flightControllerData[this.DATA.MCU_TYPE]); this.setDimension(this.DIMENSIONS.MCU_TYPE, this._flightControllerData[this.DATA.MCU_TYPE]);
}; }
Analytics.prototype.setFlightControllerData = function (property, value) { setFlightControllerData(property, value) {
this._flightControllerData[property] = value; this._flightControllerData[property] = value;
this._rebuildFlightControllerEvent();
}
this._rebuildFlightControllerEvent(); resetFlightControllerData() {
}; this._flightControllerData = {};
this._rebuildFlightControllerEvent();
}
Analytics.prototype.resetFlightControllerData = function () { _rebuildFirmwareEvent() {
this._flightControllerData = {}; this.setDimension(this.DIMENSIONS.FIRMWARE_NAME, this._firmwareData[this.DATA.FIRMWARE_NAME]);
this.setDimension(this.DIMENSIONS.FIRMWARE_SOURCE, this._firmwareData[this.DATA.FIRMWARE_SOURCE]);
this.setDimension(this.DIMENSIONS.FIRMWARE_ERASE_ALL, this._firmwareData[this.DATA.FIRMWARE_ERASE_ALL]);
this.setDimension(this.DIMENSIONS.FIRMWARE_CHANNEL, this._firmwareData[this.DATA.FIRMWARE_CHANNEL]);
this.setMetric(this.METRICS.FIRMWARE_SIZE, this._firmwareData[this.DATA.FIRMWARE_SIZE]);
}
this._rebuildFlightControllerEvent(); setFirmwareData(property, value) {
}; this._firmwareData[property] = value;
this._rebuildFirmwareEvent();
}
Analytics.prototype._rebuildFirmwareEvent = function () { resetFirmwareData() {
this.setDimension(this.DIMENSIONS.FIRMWARE_NAME, this._firmwareData[this.DATA.FIRMWARE_NAME]); this._firmwareData = {};
this.setDimension(this.DIMENSIONS.FIRMWARE_SOURCE, this._firmwareData[this.DATA.FIRMWARE_SOURCE]); this._rebuildFirmwareEvent();
this.setDimension(this.DIMENSIONS.FIRMWARE_ERASE_ALL, this._firmwareData[this.DATA.FIRMWARE_ERASE_ALL]); }
this.setDimension(this.DIMENSIONS.FIRMWARE_CHANNEL, this._firmwareData[this.DATA.FIRMWARE_CHANNEL]); }
this.setMetric(this.METRICS.FIRMWARE_SIZE, this._firmwareData[this.DATA.FIRMWARE_SIZE]);
};
Analytics.prototype.setFirmwareData = function (property, value) {
this._firmwareData[property] = value;
this._rebuildFirmwareEvent();
};
Analytics.prototype.resetFirmwareData = function () {
this._firmwareData = {};
this._rebuildFirmwareEvent();
};

View file

@ -51,7 +51,7 @@ CliAutoComplete.setEnabled = function(enable) {
}; };
CliAutoComplete.initialize = function($textarea, sendLine, writeToOutput) { CliAutoComplete.initialize = function($textarea, sendLine, writeToOutput) {
analytics.sendEvent(analytics.EVENT_CATEGORIES.APPLICATION, 'CliAutoComplete', this.configEnabled); tracking.sendEvent(tracking.EVENT_CATEGORIES.APPLICATION, 'CliAutoComplete', this.configEnabled);
this.$textarea = $textarea; this.$textarea = $textarea;
this.forceOpen = false; this.forceOpen = false;

View file

@ -46,7 +46,7 @@ const Features = function (config) {
Features.prototype.getMask = function () { Features.prototype.getMask = function () {
const self = this; const self = this;
analytics.sendChangeEvents(analytics.EVENT_CATEGORIES.FLIGHT_CONTROLLER, self._analyticsChanges); tracking.sendChangeEvents(tracking.EVENT_CATEGORIES.FLIGHT_CONTROLLER, self._analyticsChanges);
self._analyticsChanges = {}; self._analyticsChanges = {};
return self._featureMask; return self._featureMask;

View file

@ -225,7 +225,7 @@ function configuration_backup(callback) {
return; return;
} }
analytics.sendEvent(analytics.EVENT_CATEGORIES.FLIGHT_CONTROLLER, 'Backup'); tracking.sendEvent(tracking.EVENT_CATEGORIES.FLIGHT_CONTROLLER, 'Backup');
console.log('Write SUCCESSFUL'); console.log('Write SUCCESSFUL');
if (callback) callback(); if (callback) callback();
}; };
@ -308,7 +308,7 @@ function configuration_restore(callback) {
configuration.FEATURE_CONFIG.features = features; configuration.FEATURE_CONFIG.features = features;
} }
analytics.sendEvent(analytics.EVENT_CATEGORIES.FLIGHT_CONTROLLER, 'Restore'); tracking.sendEvent(tracking.EVENT_CATEGORIES.FLIGHT_CONTROLLER, 'Restore');
configuration_upload(configuration, callback); configuration_upload(configuration, callback);
} else { } else {

View file

@ -3,6 +3,7 @@ import { i18n } from './localization.js';
import GUI from './gui.js'; import GUI from './gui.js';
import { get as getConfig, set as setConfig } from './ConfigStorage.js'; import { get as getConfig, set as setConfig } from './ConfigStorage.js';
import ReleaseChecker from './release_checker.js'; import ReleaseChecker from './release_checker.js';
import { tracking, createAnalytics } from './Analytics.js';
$(document).ready(function () { $(document).ready(function () {
@ -76,17 +77,13 @@ function appReady() {
} }
function checkSetupAnalytics(callback) { function checkSetupAnalytics(callback) {
if (!analytics) { if (!tracking) {
setTimeout(function () { const result = getConfig(['userId', 'analyticsOptOut', 'checkForConfiguratorUnstableVersions' ]);
const result = ConfigStorage.get(['userId', 'analyticsOptOut', 'checkForConfiguratorUnstableVersions' ]); setupAnalytics(result);
if (!analytics) { }
setupAnalytics(result);
}
callback(analytics); if (callback) {
}); callback(tracking);
} else if (callback) {
callback(analytics);
} }
} }
@ -102,7 +99,7 @@ function setupAnalytics(result) {
const uid = new ShortUniqueId(); const uid = new ShortUniqueId();
userId = uid.randomUUID(13); userId = uid.randomUUID(13);
ConfigStorage.set({ 'userId': userId }); setConfig({ 'userId': userId });
} }
const optOut = !!result.analyticsOptOut; const optOut = !!result.analyticsOptOut;
@ -110,18 +107,30 @@ function setupAnalytics(result) {
const debugMode = typeof process === "object" && process.versions['nw-flavor'] === 'sdk'; const debugMode = typeof process === "object" && process.versions['nw-flavor'] === 'sdk';
window.analytics = new Analytics('UA-123002063-1', userId, CONFIGURATOR.productName, CONFIGURATOR.version, CONFIGURATOR.gitRevision, GUI.operating_system, const settings = {
checkForDebugVersions, optOut, debugMode, getBuildType()); trackingId: 'UA-123002063-1',
userId: userId,
appName: CONFIGURATOR.productName,
appVersion: CONFIGURATOR.version,
gitRevision: CONFIGURATOR.gitRevision,
os: GUI.operating_system,
checkForDebugVersions: checkForDebugVersions,
optOut: optOut,
debugMode: debugMode,
buildType: getBuildType(),
};
createAnalytics(googleAnalytics, settings);
window.tracking = tracking;
function logException(exception) { function logException(exception) {
analytics.sendException(exception.stack); tracking.sendException(exception.stack);
} }
if (typeof process === "object") { if (typeof process === "object") {
process.on('uncaughtException', logException); process.on('uncaughtException', logException);
} }
analytics.sendEvent(analytics.EVENT_CATEGORIES.APPLICATION, 'AppStart', { sessionControl: 'start' }); tracking.sendEvent(tracking.EVENT_CATEGORIES.APPLICATION, 'AppStart', { sessionControl: 'start' });
$('.connect_b a.connect').removeClass('disabled'); $('.connect_b a.connect').removeClass('disabled');
$('.firmware_b a.flash').removeClass('disabled'); $('.firmware_b a.flash').removeClass('disabled');
@ -187,7 +196,7 @@ function closeHandler() {
this.hide(); this.hide();
} }
analytics.sendEvent(analytics.EVENT_CATEGORIES.APPLICATION, 'AppClose', { sessionControl: 'end' }); tracking.sendEvent(tracking.EVENT_CATEGORIES.APPLICATION, 'AppClose', { sessionControl: 'end' });
closeSerial(); closeSerial();
@ -799,7 +808,7 @@ function showErrorDialog(message) {
// TODO: all of these are used as globals in other parts. // TODO: all of these are used as globals in other parts.
// once moved to modules extract to own module. // once moved to modules extract to own module.
window.googleAnalytics = analytics; window.googleAnalytics = analytics;
window.analytics = null; window.tracking = null;
window.showErrorDialog = showErrorDialog; window.showErrorDialog = showErrorDialog;
window.generateFilename = generateFilename; window.generateFilename = generateFilename;
window.updateTabList = updateTabList; window.updateTabList = updateTabList;

View file

@ -157,15 +157,15 @@ function finishClose(finishedCallback) {
const wasConnected = CONFIGURATOR.connectionValid; const wasConnected = CONFIGURATOR.connectionValid;
analytics.sendEvent(analytics.EVENT_CATEGORIES.FLIGHT_CONTROLLER, 'Disconnected'); tracking.sendEvent(tracking.EVENT_CATEGORIES.FLIGHT_CONTROLLER, 'Disconnected');
if (connectionTimestamp) { if (connectionTimestamp) {
const connectedTime = Date.now() - connectionTimestamp; const connectedTime = Date.now() - connectionTimestamp;
analytics.sendTiming(analytics.EVENT_CATEGORIES.FLIGHT_CONTROLLER, 'Connected', connectedTime); tracking.sendTiming(tracking.EVENT_CATEGORIES.FLIGHT_CONTROLLER, 'Connected', connectedTime);
} }
// close reset to custom defaults dialog // close reset to custom defaults dialog
$('#dialogResetToCustomDefaults')[0].close(); $('#dialogResetToCustomDefaults')[0].close();
analytics.resetFlightControllerData(); tracking.resetFlightControllerData();
serial.disconnect(onClosed); serial.disconnect(onClosed);
@ -249,17 +249,17 @@ function onOpen(openInfo) {
console.log(`Requesting configuration data`); console.log(`Requesting configuration data`);
MSP.send_message(MSPCodes.MSP_API_VERSION, false, false, function () { MSP.send_message(MSPCodes.MSP_API_VERSION, false, false, function () {
analytics.setFlightControllerData(analytics.DATA.API_VERSION, FC.CONFIG.apiVersion); tracking.setFlightControllerData(tracking.DATA.API_VERSION, FC.CONFIG.apiVersion);
GUI.log(i18n.getMessage('apiVersionReceived', [FC.CONFIG.apiVersion])); GUI.log(i18n.getMessage('apiVersionReceived', [FC.CONFIG.apiVersion]));
if (semver.gte(FC.CONFIG.apiVersion, CONFIGURATOR.API_VERSION_ACCEPTED)) { if (semver.gte(FC.CONFIG.apiVersion, CONFIGURATOR.API_VERSION_ACCEPTED)) {
MSP.send_message(MSPCodes.MSP_FC_VARIANT, false, false, function () { MSP.send_message(MSPCodes.MSP_FC_VARIANT, false, false, function () {
analytics.setFlightControllerData(analytics.DATA.FIRMWARE_TYPE, FC.CONFIG.flightControllerIdentifier); tracking.setFlightControllerData(tracking.DATA.FIRMWARE_TYPE, FC.CONFIG.flightControllerIdentifier);
if (FC.CONFIG.flightControllerIdentifier === 'BTFL') { if (FC.CONFIG.flightControllerIdentifier === 'BTFL') {
MSP.send_message(MSPCodes.MSP_FC_VERSION, false, false, function () { MSP.send_message(MSPCodes.MSP_FC_VERSION, false, false, function () {
analytics.setFlightControllerData(analytics.DATA.FIRMWARE_VERSION, FC.CONFIG.flightControllerVersion); tracking.setFlightControllerData(tracking.DATA.FIRMWARE_VERSION, FC.CONFIG.flightControllerVersion);
GUI.log(i18n.getMessage('fcInfoReceived', [FC.CONFIG.flightControllerIdentifier, FC.CONFIG.flightControllerVersion])); GUI.log(i18n.getMessage('fcInfoReceived', [FC.CONFIG.flightControllerIdentifier, FC.CONFIG.flightControllerVersion]));
@ -271,7 +271,7 @@ function onOpen(openInfo) {
}); });
}); });
} else { } else {
analytics.sendEvent(analytics.EVENT_CATEGORIES.FLIGHT_CONTROLLER, 'ConnectionRefusedFirmwareType', FC.CONFIG.flightControllerIdentifier); tracking.sendEvent(tracking.EVENT_CATEGORIES.FLIGHT_CONTROLLER, 'ConnectionRefusedFirmwareType', FC.CONFIG.flightControllerIdentifier);
const dialog = $('.dialogConnectWarning')[0]; const dialog = $('.dialogConnectWarning')[0];
@ -287,7 +287,7 @@ function onOpen(openInfo) {
} }
}); });
} else { } else {
analytics.sendEvent(analytics.EVENT_CATEGORIES.FLIGHT_CONTROLLER, 'ConnectionRefusedFirmwareVersion', FC.CONFIG.apiVersion); tracking.sendEvent(tracking.EVENT_CATEGORIES.FLIGHT_CONTROLLER, 'ConnectionRefusedFirmwareVersion', FC.CONFIG.apiVersion);
const dialog = $('.dialogConnectWarning')[0]; const dialog = $('.dialogConnectWarning')[0];
@ -303,7 +303,7 @@ function onOpen(openInfo) {
} }
}); });
} else { } else {
analytics.sendEvent(analytics.EVENT_CATEGORIES.FLIGHT_CONTROLLER, 'SerialPortFailed'); tracking.sendEvent(tracking.EVENT_CATEGORIES.FLIGHT_CONTROLLER, 'SerialPortFailed');
console.log('Failed to open serial port'); console.log('Failed to open serial port');
GUI.log(i18n.getMessage('serialPortOpenFail')); GUI.log(i18n.getMessage('serialPortOpenFail'));
@ -341,11 +341,11 @@ function abortConnect() {
} }
function processBoardInfo() { function processBoardInfo() {
analytics.setFlightControllerData(analytics.DATA.BOARD_TYPE, FC.CONFIG.boardIdentifier); tracking.setFlightControllerData(tracking.DATA.BOARD_TYPE, FC.CONFIG.boardIdentifier);
analytics.setFlightControllerData(analytics.DATA.TARGET_NAME, FC.CONFIG.targetName); tracking.setFlightControllerData(tracking.DATA.TARGET_NAME, FC.CONFIG.targetName);
analytics.setFlightControllerData(analytics.DATA.BOARD_NAME, FC.CONFIG.boardName); tracking.setFlightControllerData(tracking.DATA.BOARD_NAME, FC.CONFIG.boardName);
analytics.setFlightControllerData(analytics.DATA.MANUFACTURER_ID, FC.CONFIG.manufacturerId); tracking.setFlightControllerData(tracking.DATA.MANUFACTURER_ID, FC.CONFIG.manufacturerId);
analytics.setFlightControllerData(analytics.DATA.MCU_TYPE, FC.getMcuType()); tracking.setFlightControllerData(tracking.DATA.MCU_TYPE, FC.getMcuType());
GUI.log(i18n.getMessage('boardInfoReceived', [FC.getHardwareName(), FC.CONFIG.boardVersion])); GUI.log(i18n.getMessage('boardInfoReceived', [FC.getHardwareName(), FC.CONFIG.boardVersion]));
@ -353,7 +353,7 @@ function processBoardInfo() {
const dialog = $('#dialogResetToCustomDefaults')[0]; const dialog = $('#dialogResetToCustomDefaults')[0];
$('#dialogResetToCustomDefaults-acceptbtn').click(function() { $('#dialogResetToCustomDefaults-acceptbtn').click(function() {
analytics.sendEvent(analytics.EVENT_CATEGORIES.FLIGHT_CONTROLLER, 'AcceptResetToCustomDefaults'); tracking.sendEvent(tracking.EVENT_CATEGORIES.FLIGHT_CONTROLLER, 'AcceptResetToCustomDefaults');
const buffer = []; const buffer = [];
buffer.push(mspHelper.RESET_TYPES.CUSTOM_DEFAULTS); buffer.push(mspHelper.RESET_TYPES.CUSTOM_DEFAULTS);
@ -367,7 +367,7 @@ function processBoardInfo() {
}); });
$('#dialogResetToCustomDefaults-cancelbtn').click(function() { $('#dialogResetToCustomDefaults-cancelbtn').click(function() {
analytics.sendEvent(analytics.EVENT_CATEGORIES.FLIGHT_CONTROLLER, 'CancelResetToCustomDefaults'); tracking.sendEvent(tracking.EVENT_CATEGORIES.FLIGHT_CONTROLLER, 'CancelResetToCustomDefaults');
dialog.close(); dialog.close();
@ -392,7 +392,7 @@ function checkReportProblems() {
if (bit_check(FC.CONFIG.configurationProblems, FC.CONFIGURATION_PROBLEM_FLAGS[problemName])) { if (bit_check(FC.CONFIG.configurationProblems, FC.CONFIGURATION_PROBLEM_FLAGS[problemName])) {
problemItemTemplate.clone().html(i18n.getMessage(`reportProblemsDialog${problemName}`)).appendTo(problemDialogList); problemItemTemplate.clone().html(i18n.getMessage(`reportProblemsDialog${problemName}`)).appendTo(problemDialogList);
analytics.sendEvent(analytics.EVENT_CATEGORIES.FLIGHT_CONTROLLER, PROBLEM_ANALYTICS_EVENT, problemName); tracking.sendEvent(tracking.EVENT_CATEGORIES.FLIGHT_CONTROLLER, PROBLEM_ANALYTICS_EVENT, problemName);
return true; return true;
} }
@ -411,7 +411,7 @@ function checkReportProblems() {
[CONFIGURATOR.latestVersion, CONFIGURATOR.latestVersionReleaseUrl, CONFIGURATOR.getDisplayVersion(), FC.CONFIG.flightControllerVersion])).appendTo(problemDialogList); [CONFIGURATOR.latestVersion, CONFIGURATOR.latestVersionReleaseUrl, CONFIGURATOR.getDisplayVersion(), FC.CONFIG.flightControllerVersion])).appendTo(problemDialogList);
needsProblemReportingDialog = true; needsProblemReportingDialog = true;
analytics.sendEvent(analytics.EVENT_CATEGORIES.FLIGHT_CONTROLLER, PROBLEM_ANALYTICS_EVENT, tracking.sendEvent(tracking.EVENT_CATEGORIES.FLIGHT_CONTROLLER, PROBLEM_ANALYTICS_EVENT,
`${problemName};${CONFIGURATOR.API_VERSION_MAX_SUPPORTED};${FC.CONFIG.apiVersion}`); `${problemName};${CONFIGURATOR.API_VERSION_MAX_SUPPORTED};${FC.CONFIG.apiVersion}`);
} }
@ -440,8 +440,8 @@ function processUid() {
MSP.send_message(MSPCodes.MSP_UID, false, false, function () { MSP.send_message(MSPCodes.MSP_UID, false, false, function () {
const deviceIdentifier = FC.CONFIG.deviceIdentifier; const deviceIdentifier = FC.CONFIG.deviceIdentifier;
analytics.setFlightControllerData(analytics.DATA.MCU_ID, objectHash.sha1(deviceIdentifier)); tracking.setFlightControllerData(tracking.DATA.MCU_ID, objectHash.sha1(deviceIdentifier));
analytics.sendEvent(analytics.EVENT_CATEGORIES.FLIGHT_CONTROLLER, 'Connected'); tracking.sendEvent(tracking.EVENT_CATEGORIES.FLIGHT_CONTROLLER, 'Connected');
connectionTimestamp = Date.now(); connectionTimestamp = Date.now();
GUI.log(i18n.getMessage('uniqueDeviceIdReceived', [deviceIdentifier])); GUI.log(i18n.getMessage('uniqueDeviceIdReceived', [deviceIdentifier]));

View file

@ -2,6 +2,7 @@ import { i18n } from "../localization";
import Clipboard from "../Clipboard"; import Clipboard from "../Clipboard";
import GUI from '../gui'; import GUI from '../gui';
import BuildApi from '../BuildApi'; import BuildApi from '../BuildApi';
import { tracking } from '../Analytics';
const cli = { const cli = {
lineDelayMs: 15, lineDelayMs: 15,
@ -54,7 +55,7 @@ function getCliCommand(command, cliBuffer) {
function copyToClipboard(text) { function copyToClipboard(text) {
function onCopySuccessful() { function onCopySuccessful() {
analytics.sendEvent(analytics.EVENT_CATEGORIES.FLIGHT_CONTROLLER, 'CliCopyToClipboard', text.length); tracking.sendEvent(tracking.EVENT_CATEGORIES.FLIGHT_CONTROLLER, 'CliCopyToClipboard', text.length);
const button = TABS.cli.GUI.copyButton; const button = TABS.cli.GUI.copyButton;
const origText = button.text(); const origText = button.text();
const origWidth = button.css("width"); const origWidth = button.css("width");
@ -177,7 +178,7 @@ cli.initialize = function (callback) {
if (self.outputHistory.length > 0 && writer.length === 0) { if (self.outputHistory.length > 0 && writer.length === 0) {
writer.write(new Blob([self.outputHistory], {type: 'text/plain'})); writer.write(new Blob([self.outputHistory], {type: 'text/plain'}));
} else { } else {
analytics.sendEvent(analytics.EVENT_CATEGORIES.FLIGHT_CONTROLLER, 'CliSave', self.outputHistory.length); tracking.sendEvent(tracking.EVENT_CATEGORIES.FLIGHT_CONTROLLER, 'CliSave', self.outputHistory.length);
console.log('write complete'); console.log('write complete');
} }
@ -222,7 +223,7 @@ cli.initialize = function (callback) {
function executeSnippet(fileName) { function executeSnippet(fileName) {
const commands = previewArea.val(); const commands = previewArea.val();
analytics.sendEvent(analytics.EVENT_CATEGORIES.FLIGHT_CONTROLLER, 'CliExecuteFromFile', fileName); tracking.sendEvent(tracking.EVENT_CATEGORIES.FLIGHT_CONTROLLER, 'CliExecuteFromFile', fileName);
executeCommands(commands); executeCommands(commands);
self.GUI.snippetPreviewWindow.close(); self.GUI.snippetPreviewWindow.close();

View file

@ -1,6 +1,7 @@
import semver from 'semver'; import semver from 'semver';
import { i18n } from '../localization'; import { i18n } from '../localization';
import GUI from '../gui'; import GUI from '../gui';
import { tracking } from "../Analytics";
const configuration = { const configuration = {
analyticsChanges: {}, analyticsChanges: {},
@ -501,7 +502,7 @@ configuration.initialize = function (callback) {
FC.RX_CONFIG.fpvCamAngleDegrees = parseInt($('input[name="fpvCamAngleDegrees"]').val()); FC.RX_CONFIG.fpvCamAngleDegrees = parseInt($('input[name="fpvCamAngleDegrees"]').val());
analytics.sendSaveAndChangeEvents(analytics.EVENT_CATEGORIES.FLIGHT_CONTROLLER, self.analyticsChanges, 'configuration'); tracking.sendSaveAndChangeEvents(tracking.EVENT_CATEGORIES.FLIGHT_CONTROLLER, self.analyticsChanges, 'configuration');
self.analyticsChanges = {}; self.analyticsChanges = {};
// fill some data // fill some data

View file

@ -4,6 +4,7 @@ import { get as getConfig, set as setConfig } from '../ConfigStorage';
import { get as getStorage, set as setStorage } from '../SessionStorage'; import { get as getStorage, set as setStorage } from '../SessionStorage';
import BuildApi from '../BuildApi'; import BuildApi from '../BuildApi';
import ConfigInserter from "../ConfigInserter.js"; import ConfigInserter from "../ConfigInserter.js";
import { tracking } from "../Analytics";
const firmware_flasher = { const firmware_flasher = {
targets: null, targets: null,
@ -113,7 +114,7 @@ firmware_flasher.initialize = function (callback) {
self.parsed_hex = data; self.parsed_hex = data;
if (self.parsed_hex) { if (self.parsed_hex) {
analytics.setFirmwareData(analytics.DATA.FIRMWARE_SIZE, self.parsed_hex.bytes_total); tracking.setFirmwareData(tracking.DATA.FIRMWARE_SIZE, self.parsed_hex.bytes_total);
showLoadedHex(key); showLoadedHex(key);
} else { } else {
self.flashingMessage(i18n.getMessage('firmwareFlasherHexCorrupted'), self.FLASH_MESSAGE_TYPES.INVALID); self.flashingMessage(i18n.getMessage('firmwareFlasherHexCorrupted'), self.FLASH_MESSAGE_TYPES.INVALID);
@ -246,7 +247,7 @@ firmware_flasher.initialize = function (callback) {
i18n.localizePage(); i18n.localizePage();
buildType_e.change(function() { buildType_e.change(function() {
analytics.setFirmwareData(analytics.DATA.FIRMWARE_CHANNEL, $('option:selected', this).text()); tracking.setFirmwareData(tracking.DATA.FIRMWARE_CHANNEL, $('option:selected', this).text());
$("a.load_remote_file").addClass('disabled'); $("a.load_remote_file").addClass('disabled');
const build_type = $(this).val(); const build_type = $(this).val();
@ -472,7 +473,7 @@ firmware_flasher.initialize = function (callback) {
eraseAll = true; eraseAll = true;
} }
analytics.setFirmwareData(analytics.DATA.FIRMWARE_ERASE_ALL, eraseAll.toString()); tracking.setFirmwareData(tracking.DATA.FIRMWARE_ERASE_ALL, eraseAll.toString());
if (!$('option:selected', portPickerElement).data().isDFU) { if (!$('option:selected', portPickerElement).data().isDFU) {
if (String(portPickerElement.val()) !== '0') { if (String(portPickerElement.val()) !== '0') {
@ -489,7 +490,7 @@ firmware_flasher.initialize = function (callback) {
baud = parseInt($('#flash_manual_baud_rate').val()); baud = parseInt($('#flash_manual_baud_rate').val());
} }
analytics.sendEvent(analytics.EVENT_CATEGORIES.FLASHING, 'Flashing', self.fileName || null); tracking.sendEvent(tracking.EVENT_CATEGORIES.FLASHING, 'Flashing', self.fileName || null);
STM32.connect(port, baud, firmware, options); STM32.connect(port, baud, firmware, options);
} else { } else {
@ -497,7 +498,7 @@ firmware_flasher.initialize = function (callback) {
GUI.log(i18n.getMessage('firmwareFlasherNoValidPort')); GUI.log(i18n.getMessage('firmwareFlasherNoValidPort'));
} }
} else { } else {
analytics.sendEvent(analytics.EVENT_CATEGORIES.FLASHING, 'Flashing', self.fileName || null); tracking.sendEvent(tracking.EVENT_CATEGORIES.FLASHING, 'Flashing', self.fileName || null);
STM32DFU.connect(usbDevices, firmware, options); STM32DFU.connect(usbDevices, firmware, options);
} }
@ -701,8 +702,8 @@ firmware_flasher.initialize = function (callback) {
self.enableFlashing(false); self.enableFlashing(false);
self.developmentFirmwareLoaded = false; self.developmentFirmwareLoaded = false;
analytics.setFirmwareData(analytics.DATA.FIRMWARE_CHANNEL, undefined); tracking.setFirmwareData(tracking.DATA.FIRMWARE_CHANNEL, undefined);
analytics.setFirmwareData(analytics.DATA.FIRMWARE_SOURCE, 'file'); tracking.setFirmwareData(tracking.DATA.FIRMWARE_SOURCE, 'file');
chrome.fileSystem.chooseEntry({ chrome.fileSystem.chooseEntry({
type: 'openFile', type: 'openFile',
@ -725,7 +726,7 @@ firmware_flasher.initialize = function (callback) {
console.log('Loading file from:', path); console.log('Loading file from:', path);
fileEntry.file(function (file) { fileEntry.file(function (file) {
analytics.setFirmwareData(analytics.DATA.FIRMWARE_NAME, file.name); tracking.setFirmwareData(tracking.DATA.FIRMWARE_NAME, file.name);
const reader = new FileReader(); const reader = new FileReader();
reader.onloadend = function(e) { reader.onloadend = function(e) {
@ -739,7 +740,7 @@ firmware_flasher.initialize = function (callback) {
self.parsed_hex = data; self.parsed_hex = data;
if (self.parsed_hex) { if (self.parsed_hex) {
analytics.setFirmwareData(analytics.DATA.FIRMWARE_SIZE, self.parsed_hex.bytes_total); tracking.setFirmwareData(tracking.DATA.FIRMWARE_SIZE, self.parsed_hex.bytes_total);
self.localFirmwareLoaded = true; self.localFirmwareLoaded = true;
showLoadedHex(file.name); showLoadedHex(file.name);
@ -786,7 +787,7 @@ firmware_flasher.initialize = function (callback) {
self.localFirmwareLoaded = false; self.localFirmwareLoaded = false;
self.developmentFirmwareLoaded = buildTypesToShow[$('select[name="build_type"]').val()].tag === 'firmwareFlasherOptionLabelBuildTypeDevelopment'; self.developmentFirmwareLoaded = buildTypesToShow[$('select[name="build_type"]').val()].tag === 'firmwareFlasherOptionLabelBuildTypeDevelopment';
analytics.setFirmwareData(analytics.DATA.FIRMWARE_SOURCE, 'http'); tracking.setFirmwareData(tracking.DATA.FIRMWARE_SOURCE, 'http');
if ($('select[name="firmware_version"]').val() === "0") { if ($('select[name="firmware_version"]').val() === "0") {
GUI.log(i18n.getMessage('firmwareFlasherNoFirmwareSelected')); GUI.log(i18n.getMessage('firmwareFlasherNoFirmwareSelected'));
@ -874,7 +875,7 @@ firmware_flasher.initialize = function (callback) {
return; return;
} }
analytics.setFirmwareData(analytics.DATA.FIRMWARE_NAME, response.file); tracking.setFirmwareData(tracking.DATA.FIRMWARE_NAME, response.file);
updateStatus('Pending', response.key, 0, false); updateStatus('Pending', response.key, 0, false);
@ -921,7 +922,7 @@ firmware_flasher.initialize = function (callback) {
if (!exitDfuElement.hasClass('disabled')) { if (!exitDfuElement.hasClass('disabled')) {
exitDfuElement.addClass("disabled"); exitDfuElement.addClass("disabled");
if (!GUI.connect_lock) { // button disabled while flashing is in progress if (!GUI.connect_lock) { // button disabled while flashing is in progress
analytics.sendEvent(analytics.EVENT_CATEGORIES.FLASHING, 'ExitDfu', null); tracking.sendEvent(tracking.EVENT_CATEGORIES.FLASHING, 'ExitDfu', null);
try { try {
console.log('Closing DFU'); console.log('Closing DFU');
STM32DFU.connect(usbDevices, self.parsed_hex, { exitDfu: true }); STM32DFU.connect(usbDevices, self.parsed_hex, { exitDfu: true });
@ -1079,7 +1080,7 @@ firmware_flasher.initialize = function (callback) {
return; return;
} }
analytics.sendEvent(analytics.EVENT_CATEGORIES.FLASHING, 'SaveFirmware', path); tracking.sendEvent(tracking.EVENT_CATEGORIES.FLASHING, 'SaveFirmware', path);
}; };
writer.write(blob); writer.write(blob);
@ -1157,7 +1158,7 @@ firmware_flasher.cleanup = function (callback) {
$('div#flashbutton a.flash_state').removeClass('active'); $('div#flashbutton a.flash_state').removeClass('active');
$('div#flashbutton a.flash').removeClass('active'); $('div#flashbutton a.flash').removeClass('active');
analytics.resetFirmwareData(); tracking.resetFirmwareData();
if (callback) callback(); if (callback) callback();
}; };

View file

@ -4,6 +4,7 @@ import { get as getConfig, set as setConfig } from '../ConfigStorage';
import MotorOutputReorderConfig from "../../components/MotorOutputReordering/MotorOutputReorderingConfig"; import MotorOutputReorderConfig from "../../components/MotorOutputReordering/MotorOutputReorderingConfig";
import MotorOutputReorderComponent from "../../components/MotorOutputReordering/MotorOutputReorderingComponent"; import MotorOutputReorderComponent from "../../components/MotorOutputReordering/MotorOutputReorderingComponent";
import EscDshotDirectionComponent from "../../components/EscDshotDirection/EscDshotDirectionComponent"; import EscDshotDirectionComponent from "../../components/EscDshotDirection/EscDshotDirectionComponent";
import { tracking } from "../Analytics";
const motors = { const motors = {
previousDshotBidir: null, previousDshotBidir: null,
@ -1142,7 +1143,7 @@ motors.initialize = async function (callback) {
} }
await MSP.promise(MSPCodes.MSP_EEPROM_WRITE); await MSP.promise(MSPCodes.MSP_EEPROM_WRITE);
analytics.sendSaveAndChangeEvents(analytics.EVENT_CATEGORIES.FLIGHT_CONTROLLER, self.analyticsChanges, 'motors'); tracking.sendSaveAndChangeEvents(tracking.EVENT_CATEGORIES.FLIGHT_CONTROLLER, self.analyticsChanges, 'motors');
self.analyticsChanges = {}; self.analyticsChanges = {};
self.configHasChanged = false; self.configHasChanged = false;

View file

@ -1,5 +1,6 @@
import { i18n } from "../localization"; import { i18n } from "../localization";
import GUI from '../gui'; import GUI from '../gui';
import { tracking } from "../Analytics";
let sdcardTimer; let sdcardTimer;
@ -137,7 +138,7 @@ onboard_logging.initialize = function (callback) {
.toggleClass("msc-supported", true); .toggleClass("msc-supported", true);
$('a.onboardLoggingRebootMsc').click(function () { $('a.onboardLoggingRebootMsc').click(function () {
analytics.sendEvent(analytics.EVENT_CATEGORIES.FLIGHT_CONTROLLER, 'RebootMsc'); tracking.sendEvent(tracking.EVENT_CATEGORIES.FLIGHT_CONTROLLER, 'RebootMsc');
const buffer = []; const buffer = [];
if (GUI.operating_system === "Linux") { if (GUI.operating_system === "Linux") {
@ -434,9 +435,9 @@ onboard_logging.initialize = function (callback) {
if (dataflashPresent && FC.SDCARD.state === MSP.SDCARD_STATE_NOT_PRESENT) { if (dataflashPresent && FC.SDCARD.state === MSP.SDCARD_STATE_NOT_PRESENT) {
loggingStatus = 'Dataflash'; loggingStatus = 'Dataflash';
analytics.setFlightControllerData(analytics.DATA.LOG_SIZE, FC.DATAFLASH.usedSize); tracking.setFlightControllerData(tracking.DATA.LOG_SIZE, FC.DATAFLASH.usedSize);
} }
analytics.setFlightControllerData(analytics.DATA.LOGGING_STATUS, loggingStatus); tracking.setFlightControllerData(tracking.DATA.LOGGING_STATUS, loggingStatus);
if (FC.SDCARD.supported && !sdcardTimer) { if (FC.SDCARD.supported && !sdcardTimer) {
// Poll for changes in SD card status // Poll for changes in SD card status
@ -469,7 +470,7 @@ onboard_logging.initialize = function (callback) {
} }
function mark_saving_dialog_done(startTime, totalBytes, totalBytesCompressed) { function mark_saving_dialog_done(startTime, totalBytes, totalBytesCompressed) {
analytics.sendEvent(analytics.EVENT_CATEGORIES.FLIGHT_CONTROLLER, 'SaveDataflash'); tracking.sendEvent(tracking.EVENT_CATEGORIES.FLIGHT_CONTROLLER, 'SaveDataflash');
const totalTime = (new Date().getTime() - startTime) / 1000; const totalTime = (new Date().getTime() - startTime) / 1000;
console.log(`Received ${totalBytes} bytes in ${totalTime.toFixed(2)}s (${ console.log(`Received ${totalBytes} bytes in ${totalTime.toFixed(2)}s (${
@ -631,8 +632,8 @@ onboard_logging.initialize = function (callback) {
}; };
onboard_logging.cleanup = function (callback) { onboard_logging.cleanup = function (callback) {
analytics.setFlightControllerData(analytics.DATA.LOGGING_STATUS, undefined); tracking.setFlightControllerData(tracking.DATA.LOGGING_STATUS, undefined);
analytics.setFlightControllerData(analytics.DATA.LOG_SIZE, undefined); tracking.setFlightControllerData(tracking.DATA.LOG_SIZE, undefined);
if (sdcardTimer) { if (sdcardTimer) {
clearTimeout(sdcardTimer); clearTimeout(sdcardTimer);

View file

@ -1,5 +1,6 @@
import { i18n } from "../localization"; import { i18n } from "../localization";
import GUI from '../gui'; import GUI from '../gui';
import { tracking } from "../Analytics";
const FONT = {}; const FONT = {};
const SYM = {}; const SYM = {};
@ -3259,7 +3260,7 @@ osd.initialize = function(callback) {
} }
}); });
analytics.sendSaveAndChangeEvents(analytics.EVENT_CATEGORIES.FLIGHT_CONTROLLER, self.analyticsChanges, 'osd'); tracking.sendSaveAndChangeEvents(tracking.EVENT_CATEGORIES.FLIGHT_CONTROLLER, self.analyticsChanges, 'osd');
self.analyticsChanges = {}; self.analyticsChanges = {};
}); });

View file

@ -1,6 +1,7 @@
import { i18n } from "../localization"; import { i18n } from "../localization";
import { colorTables, getColorForPercentage } from '../utils/css.js'; import { colorTables, getColorForPercentage } from '../utils/css.js';
import GUI from '../gui'; import GUI from '../gui';
import { tracking } from "../Analytics";
const pid_tuning = { const pid_tuning = {
RATE_PROFILE_MASK: 128, RATE_PROFILE_MASK: 128,
@ -2263,7 +2264,7 @@ pid_tuning.initialize = function (callback) {
self.refresh(); self.refresh();
}); });
analytics.sendSaveAndChangeEvents(analytics.EVENT_CATEGORIES.FLIGHT_CONTROLLER, self.analyticsChanges, 'pid_tuning'); tracking.sendSaveAndChangeEvents(tracking.EVENT_CATEGORIES.FLIGHT_CONTROLLER, self.analyticsChanges, 'pid_tuning');
self.analyticsChanges = {}; self.analyticsChanges = {};
}); });

View file

@ -1,6 +1,7 @@
import semver from 'semver'; import semver from 'semver';
import { i18n } from "../localization"; import { i18n } from "../localization";
import GUI from '../gui'; import GUI from '../gui';
import { tracking } from "../Analytics";
const ports = { const ports = {
analyticsChanges: {}, analyticsChanges: {},
@ -358,7 +359,7 @@ ports.initialize = function (callback) {
} }
function on_save_handler() { function on_save_handler() {
analytics.sendSaveAndChangeEvents(analytics.EVENT_CATEGORIES.FLIGHT_CONTROLLER, self.analyticsChanges, 'ports'); tracking.sendSaveAndChangeEvents(tracking.EVENT_CATEGORIES.FLIGHT_CONTROLLER, self.analyticsChanges, 'ports');
self.analyticsChanges = {}; self.analyticsChanges = {};
// update configuration based on current ui state // update configuration based on current ui state

View file

@ -1,5 +1,6 @@
import { i18n } from '../localization'; import { i18n } from '../localization';
import GUI from '../gui'; import GUI from '../gui';
import { tracking } from "../Analytics";
const power = { const power = {
supported: false, supported: false,
@ -11,8 +12,6 @@ power.initialize = function (callback) {
if (GUI.active_tab != 'power') { if (GUI.active_tab != 'power') {
GUI.active_tab = 'power'; GUI.active_tab = 'power';
// Disabled on merge into betaflight-configurator
//googleAnalytics.sendAppView('Power');
} }
if (GUI.calibrationManager) { if (GUI.calibrationManager) {
@ -473,7 +472,7 @@ power.initialize = function (callback) {
FC.BATTERY_CONFIG.vbatwarningcellvoltage = parseFloat($('input[name="warningcellvoltage"]').val()); FC.BATTERY_CONFIG.vbatwarningcellvoltage = parseFloat($('input[name="warningcellvoltage"]').val());
FC.BATTERY_CONFIG.capacity = parseInt($('input[name="capacity"]').val()); FC.BATTERY_CONFIG.capacity = parseInt($('input[name="capacity"]').val());
analytics.sendSaveAndChangeEvents(analytics.EVENT_CATEGORIES.FLIGHT_CONTROLLER, self.analyticsChanges, 'power'); tracking.sendSaveAndChangeEvents(tracking.EVENT_CATEGORIES.FLIGHT_CONTROLLER, self.analyticsChanges, 'power');
save_power_config(); save_power_config();
}); });

View file

@ -1,7 +1,7 @@
import { i18n } from "../localization"; import { i18n } from "../localization";
import GUI from '../gui'; import GUI from '../gui';
import { get as getConfig, set as setConfig } from '../ConfigStorage'; import { get as getConfig, set as setConfig } from '../ConfigStorage';
import { tracking } from "../Analytics";
import CryptoES from 'crypto-es'; import CryptoES from 'crypto-es';
const receiver = { const receiver = {
@ -493,7 +493,7 @@ receiver.initialize = function (callback) {
} }
} }
analytics.sendSaveAndChangeEvents(analytics.EVENT_CATEGORIES.FLIGHT_CONTROLLER, tab.analyticsChanges, 'receiver'); tracking.sendSaveAndChangeEvents(tracking.EVENT_CATEGORIES.FLIGHT_CONTROLLER, tab.analyticsChanges, 'receiver');
tab.analyticsChanges = {}; tab.analyticsChanges = {};
MSP.send_message(MSPCodes.MSP_SET_RX_MAP, mspHelper.crunch(MSPCodes.MSP_SET_RX_MAP), false, save_rssi_config); MSP.send_message(MSPCodes.MSP_SET_RX_MAP, mspHelper.crunch(MSPCodes.MSP_SET_RX_MAP), false, save_rssi_config);

View file

@ -8,8 +8,6 @@ setup_osd.initialize = function (callback) {
if (GUI.active_tab != 'setup_osd') { if (GUI.active_tab != 'setup_osd') {
GUI.active_tab = 'setup_osd'; GUI.active_tab = 'setup_osd';
// Disabled on merge into betaflight-configurator
//googleAnalytics.sendAppView('Setup OSD');
} }
function load_status() { function load_status() {

View file

@ -110,8 +110,6 @@ transponder.initialize = function(callback) {
///////////////////////////////////////////// /////////////////////////////////////////////
GUI.active_tab = 'transponder'; GUI.active_tab = 'transponder';
// Disabled on merge into betaflight-configurator
//googleAnalytics.sendAppView('Transponder');
// transponder supported added in MSP API Version 1.16.0 // transponder supported added in MSP API Version 1.16.0
if (FC.CONFIG) { if (FC.CONFIG) {

View file

@ -1,6 +1,7 @@
import { i18n } from "../localization"; import { i18n } from "../localization";
import Clipboard from "../Clipboard"; import Clipboard from "../Clipboard";
import GUI from '../gui'; import GUI from '../gui';
import { tracking } from "../Analytics";
const vtx = { const vtx = {
supported: false, supported: false,
@ -646,7 +647,7 @@ vtx.initialize = function (callback) {
// we get here at the end of the truncate method, change to the new end // we get here at the end of the truncate method, change to the new end
writer.onwriteend = function() { writer.onwriteend = function() {
analytics.sendEvent(analytics.EVENT_CATEGORIES.FLIGHT_CONTROLLER, 'VtxTableLuaSave', text.length); tracking.sendEvent(tracking.EVENT_CATEGORIES.FLIGHT_CONTROLLER, 'VtxTableLuaSave', text.length);
console.log('Write VTX table lua file end'); console.log('Write VTX table lua file end');
GUI.log(i18n.getMessage('vtxSavedLuaFileOk')); GUI.log(i18n.getMessage('vtxSavedLuaFileOk'));
}; };
@ -697,7 +698,7 @@ vtx.initialize = function (callback) {
// we get here at the end of the truncate method, change to the new end // we get here at the end of the truncate method, change to the new end
writer.onwriteend = function() { writer.onwriteend = function() {
analytics.sendEvent(analytics.EVENT_CATEGORIES.FLIGHT_CONTROLLER, 'VtxTableSave', text.length); tracking.sendEvent(tracking.EVENT_CATEGORIES.FLIGHT_CONTROLLER, 'VtxTableSave', text.length);
console.log(vtxConfig); console.log(vtxConfig);
console.log('Write VTX file end'); console.log('Write VTX file end');
GUI.log(i18n.getMessage('vtxSavedFileOk')); GUI.log(i18n.getMessage('vtxSavedFileOk'));
@ -834,7 +835,7 @@ vtx.initialize = function (callback) {
// Start MSP saving // Start MSP saving
save_vtx_config(); save_vtx_config();
analytics.sendSaveAndChangeEvents(analytics.EVENT_CATEGORIES.FLIGHT_CONTROLLER, self.analyticsChanges, 'vtx'); tracking.sendSaveAndChangeEvents(tracking.EVENT_CATEGORIES.FLIGHT_CONTROLLER, self.analyticsChanges, 'vtx');
function save_vtx_config() { function save_vtx_config() {
MSP.send_message(MSPCodes.MSP_SET_VTX_CONFIG, mspHelper.crunch(MSPCodes.MSP_SET_VTX_CONFIG), false, save_vtx_powerlevels); MSP.send_message(MSPCodes.MSP_SET_VTX_CONFIG, mspHelper.crunch(MSPCodes.MSP_SET_VTX_CONFIG), false, save_vtx_powerlevels);

View file

@ -108,7 +108,6 @@
<script type="text/javascript" src="./js/RateCurve.js"></script> <script type="text/javascript" src="./js/RateCurve.js"></script>
<script type="text/javascript" src="./js/Features.js"></script> <script type="text/javascript" src="./js/Features.js"></script>
<script type="text/javascript" src="./js/Beepers.js"></script> <script type="text/javascript" src="./js/Beepers.js"></script>
<script type="text/javascript" src="./js/Analytics.js"></script>
<script type="text/javascript" src="./js/GitHubApi.js"></script> <script type="text/javascript" src="./js/GitHubApi.js"></script>
<script type="module" src="./js/main.js"></script> <script type="module" src="./js/main.js"></script>
<script type="text/javascript" src="./js/LogoManager.js"></script> <script type="text/javascript" src="./js/LogoManager.js"></script>

View file

@ -6,7 +6,7 @@ class MockAnalytics {
} }
} }
let analytics; let tracking;
describe('TABS.cli', () => { describe('TABS.cli', () => {
@ -33,7 +33,7 @@ describe('TABS.cli', () => {
CliAutoComplete.setEnabled(false); // not testing the client-side autocomplete CliAutoComplete.setEnabled(false); // not testing the client-side autocomplete
before(() => { before(() => {
analytics = new MockAnalytics(); tracking = new MockAnalytics();
$('body').append(cliTab); $('body').append(cliTab);