Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Add support for using MSP build options #3780

Merged
merged 2 commits into from
Apr 19, 2024
Merged
Show file tree
Hide file tree
Changes from 1 commit
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions src/js/data_storage.js
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@ export const API_VERSION_1_43 = '1.43.0';
export const API_VERSION_1_44 = '1.44.0';
export const API_VERSION_1_45 = '1.45.0';
export const API_VERSION_1_46 = '1.46.0';
export const API_VERSION_1_47 = '1.47.0';

const CONFIGURATOR = {
// all versions are specified and compared using semantic versioning http://semver.org/
Expand Down
69 changes: 69 additions & 0 deletions src/js/fc.js
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,7 @@ const INITIAL_CONFIG = {
buildInfo: '',
buildKey: '',
buildOptions: [],
gitRevision: '',
multiType: 0,
msp_version: 0, // not specified using semantic versioning
capability: 0,
Expand Down Expand Up @@ -67,6 +68,59 @@ const INITIAL_BATTERY_CONFIG = {
currentMeterSource: 0,
};

const FIRMWARE_BUILD_OPTIONS = {
// Radio Protocols
USE_SERIALRX_CRSF: 4097,
USE_SERIALRX_FPORT: 4098,
USE_SERIALRX_GHST: 4099,
USE_SERIALRX_IBUS: 4100,
USE_SERIALRX_JETIEXBUS: 4101,
USE_RX_PPM: 4102,
USE_SERIALRX_SBUS: 4103,
USE_SERIALRX_SPEKTRUM: 4104,
USE_SERIALRX_SRXL2: 4105,
USE_SERIALRX_SUMD: 4106,
USE_SERIALRX_SUMH: 4107,
USE_SERIALRX_XBUS: 4108,

// Motor Protocols
USE_BRUSHED: 8230,
USE_DSHOT: 8231,
USE_MULTISHOT: 8232,
USE_ONESHOT: 8233,
USE_PROSHOT: 8234,
USE_PWM_OUTPUT: 8235,

// Telemetry Protocols
USE_TELEMETRY_FRSKY_HUB: 12301,
USE_TELEMETRY_HOTT: 12302,
USE_TELEMETRY_IBUS_EXTENDED:12303,
USE_TELEMETRY_LTM: 12304,
USE_TELEMETRY_MAVLINK: 12305,
USE_TELEMETRY_SMARTPORT: 12306,
USE_TELEMETRY_SRXL: 12307,

// General Options
USE_ACRO_TRAINER: 16404,
USE_AKK_SMARTAUDIO: 16405,
USE_BATTERY_CONTINUE: 16406,
USE_CAMERA_CONTROL: 16407,
USE_DASHBOARD: 16408,
USE_EMFAT_TOOLS: 16409,
USE_ESCSERIAL_SIMONK: 16410,
USE_FRSKYOSD: 16411,
USE_GPS: 16412,
USE_LED_STRIP: 16413,
USE_LED_STRIP_64: 16414,
USE_MAG: 16415,
USE_OSD_SD: 16416,
USE_OSD_HD: 16417,
USE_PINIO: 16418,
USE_RACE_PRO: 16419,
USE_SERVOS: 16420,
USE_VTX: 16421,
};

const FC = {

// define all the global variables that are uses to hold FC state
Expand Down Expand Up @@ -832,6 +886,21 @@ const FC = {
MOTOR_PROTOCOL_DISABLED: 1,
},

processBuildOptions() {
const buildOptions = [];

for (const [key, value] of Object.entries(FIRMWARE_BUILD_OPTIONS)) {
for (const option of this.CONFIG.buildOptions) {
if (option === value) {
buildOptions.push(key);
break;
}
}
}

this.CONFIG.buildOptions = buildOptions;
},

boardHasVcp() {
return bit_check(this.CONFIG.targetCapabilities, this.TARGET_CAPABILITIES_FLAGS.HAS_VCP);
},
Expand Down
21 changes: 20 additions & 1 deletion src/js/msp/MSPHelper.js
Original file line number Diff line number Diff line change
Expand Up @@ -771,7 +771,7 @@ MspHelper.prototype.process_data = function(dataHandler) {
FC.CONFIG.flightControllerVersion = `${data.readU8()}.${data.readU8()}.${data.readU8()}`;
break;

case MSPCodes.MSP_BUILD_INFO:
case MSPCodes.MSP_BUILD_INFO: {
const dateLength = 11;
buff = [];

Expand All @@ -785,7 +785,26 @@ MspHelper.prototype.process_data = function(dataHandler) {
buff.push(data.readU8());
}
FC.CONFIG.buildInfo = String.fromCharCode.apply(null, buff);

const gitRevisionLength = 7;
buff = [];
for (let i = 0; i < gitRevisionLength; i++) {
buff.push(data.readU8());
}

FC.CONFIG.gitRevision = String.fromCharCode.apply(null, buff);
console.log("Fw git rev:", FC.CONFIG.gitRevision);

if (semver.gte(FC.CONFIG.apiVersion, API_VERSION_1_46)) {
let option = data.readU16();
while (option) {
FC.CONFIG.buildOptions.push(option);
option = data.readU16();
}
}

break;
}

case MSPCodes.MSP_BOARD_INFO:
FC.CONFIG.boardIdentifier = '';
Expand Down
44 changes: 29 additions & 15 deletions src/js/serial_backend.js
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,7 @@ import MSP from "./msp";
import MSPCodes from "./msp/MSPCodes";
import PortUsage from "./port_usage";
import PortHandler from "./port_handler";
import CONFIGURATOR, { API_VERSION_1_45, API_VERSION_1_46 } from "./data_storage";
import CONFIGURATOR, { API_VERSION_1_45, API_VERSION_1_46, API_VERSION_1_47 } from "./data_storage";
import UI_PHONES from "./phones_ui";
import { bit_check } from './bit.js';
import { sensor_status, have_sensor } from "./sensor_helpers";
Expand Down Expand Up @@ -352,6 +352,11 @@ function onOpen(openInfo) {

gui_log(i18n.getMessage('buildInfoReceived', [FC.CONFIG.buildInfo]));

// retrieve build options from the flight controller
if (semver.gte(FC.CONFIG.apiVersion, API_VERSION_1_46)) {
FC.processBuildOptions();
}

MSP.send_message(MSPCodes.MSP_BOARD_INFO, false, false, processBoardInfo);
});
});
Expand Down Expand Up @@ -534,36 +539,45 @@ function checkReportProblems() {
});
}

async function processBuildConfiguration() {
const buildApi = new BuildApi();
async function processBuildOptions() {
const supported = semver.satisfies(FC.CONFIG.apiVersion, `${API_VERSION_1_45} - ${API_VERSION_1_46}`);

function onLoadCloudBuild(options) {
FC.CONFIG.buildOptions = options.Request.Options;
processCraftName();
}
// 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) {
const buildApi = new BuildApi();

await MSP.promise(MSPCodes.MSP2_GET_TEXT, mspHelper.crunch(MSPCodes.MSP2_GET_TEXT, MSPCodes.BUILD_KEY));
function onLoadCloudBuild(options) {
FC.CONFIG.buildOptions = options.Request.Options;
processCraftName();
}

if (FC.CONFIG.buildKey.length === 32 && navigator.onLine) {
gui_log(i18n.getMessage('buildKey', FC.CONFIG.buildKey));
buildApi.requestBuildOptions(FC.CONFIG.buildKey, onLoadCloudBuild, processCraftName);
} else {
processCraftName();
}
}

async function processBuildConfiguration() {
const supported = semver.gte(FC.CONFIG.apiVersion, API_VERSION_1_45);

if (supported) {
// get build key from firmware
await MSP.promise(MSPCodes.MSP2_GET_TEXT, mspHelper.crunch(MSPCodes.MSP2_GET_TEXT, MSPCodes.BUILD_KEY));
gui_log(i18n.getMessage('buildKey', FC.CONFIG.buildKey));
}

processBuildOptions();
}

async function processUid() {
await MSP.promise(MSPCodes.MSP_UID);

connectionTimestamp = Date.now();

gui_log(i18n.getMessage('uniqueDeviceIdReceived', FC.CONFIG.deviceIdentifier));

if (semver.gte(FC.CONFIG.apiVersion, API_VERSION_1_45)) {
processBuildConfiguration();
} else {
processCraftName();
}
processBuildConfiguration();

tracking.sendEvent(tracking.EVENT_CATEGORIES.FLIGHT_CONTROLLER, 'Connected', {
deviceIdentifier: CryptoES.SHA1(FC.CONFIG.deviceIdentifier),
Expand Down
12 changes: 9 additions & 3 deletions src/js/tabs/firmware_flasher.js
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,7 @@ import FC from '../fc';
import MSP from '../msp';
import MSPCodes from '../msp/MSPCodes';
import PortHandler, { usbDevices } from '../port_handler';
import { API_VERSION_1_39, API_VERSION_1_45 } from '../data_storage';
import { API_VERSION_1_39, API_VERSION_1_45, API_VERSION_1_46, API_VERSION_1_47 } from '../data_storage';
import serial from '../serial';
import STM32DFU from '../protocols/stm32usbdfu';
import { gui_log } from '../gui_log';
Expand Down Expand Up @@ -1302,7 +1302,13 @@ firmware_flasher.verifyBoard = function() {
}

function getBoardInfo() {
MSP.send_message(MSPCodes.MSP_BOARD_INFO, false, false, onFinish);
MSP.send_message(MSPCodes.MSP_BOARD_INFO, false, false, function() {
if (semver.gte(FC.CONFIG.apiVersion, API_VERSION_1_47)) {
FC.processBuildOptions();
self.cloudBuildOptions = FC.CONFIG.buildOptions;
}
onFinish();
});
}

function getCloudBuildOptions(options) {
Expand All @@ -1319,7 +1325,7 @@ firmware_flasher.verifyBoard = function() {
// store FC.CONFIG.buildKey as the object gets destroyed after disconnect
self.cloudBuildKey = FC.CONFIG.buildKey;

if (self.validateBuildKey()) {
if (self.validateBuildKey() && semver.lt(FC.CONFIG.apiVersion, API_VERSION_1_47)) {
self.buildApi.requestBuildOptions(self.cloudBuildKey, getCloudBuildOptions, getBoardInfo);
} else {
getBoardInfo();
Expand Down