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

Merge pull request #1569 from McGiverGim/add_vtx_tab

Add an VTX tab
This commit is contained in:
Michael Keller 2019-08-20 23:37:09 +12:00 committed by GitHub
commit bb67dbbd72
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
12 changed files with 1441 additions and 42 deletions

View file

@ -58,6 +58,9 @@ var FILTER_CONFIG;
var ADVANCED_TUNING;
var SENSOR_CONFIG;
var COPY_PROFILE;
var VTX_CONFIG;
var VTXTABLE_BAND;
var VTXTABLE_POWERLEVEL;
var DEFAULT;
var FC = {
@ -483,6 +486,37 @@ var FC = {
RXFAIL_CONFIG = [];
VTX_CONFIG = {
vtx_type: 0,
vtx_band: 0,
vtx_channel: 0,
vtx_power: 0,
vtx_pit_mode: false,
vtx_frequency: 0,
vtx_device_ready: false,
vtx_low_power_disarm: 0,
vtx_pit_mode_frequency: 0,
vtx_table_available: false,
vtx_table_bands: 0,
vtx_table_channels: 0,
vtx_table_powerlevels: 0,
vtx_table_clear: false,
};
VTXTABLE_BAND = {
vtxtable_band_number: 0,
vtxtable_band_name: '',
vtxtable_band_letter: '',
vtxtable_band_is_factory_band: false,
vtxtable_band_frequencies: [],
};
VTXTABLE_POWERLEVEL = {
vtxtable_powerlevel_number: 0,
vtxtable_powerlevel_value: 0,
vtxtable_powerlevel_label: 0,
};
DEFAULT = {
gyro_lowpass_hz: 100,
gyro_lowpass_dyn_min_hz: 150,

View file

@ -42,6 +42,7 @@ var GUI_control = function () {
'receiver',
'sensors',
'servos',
'vtx',
];
this.defaultAllowedOSDTabsWhenConnected = [
'setup_osd',

View file

@ -248,6 +248,9 @@ function startProcess() {
case 'osd':
TABS.osd.initialize(content_ready);
break;
case 'vtx':
TABS.vtx.initialize(content_ready);
break;
case 'power':
TABS.power.initialize(content_ready);
break;
@ -632,48 +635,33 @@ function isExpertModeEnabled() {
}
function updateTabList(features) {
if (isExpertModeEnabled()) {
$('#tabs ul.mode-connected li.tab_failsafe').show();
$('#tabs ul.mode-connected li.tab_adjustments').show();
$('#tabs ul.mode-connected li.tab_servos').show();
$('#tabs ul.mode-connected li.tab_sensors').show();
$('#tabs ul.mode-connected li.tab_logging').show();
} else {
$('#tabs ul.mode-connected li.tab_failsafe').hide();
$('#tabs ul.mode-connected li.tab_adjustments').hide();
$('#tabs ul.mode-connected li.tab_servos').hide();
$('#tabs ul.mode-connected li.tab_sensors').hide();
$('#tabs ul.mode-connected li.tab_logging').hide();
}
if (features.isEnabled('GPS') && isExpertModeEnabled()) {
$('#tabs ul.mode-connected li.tab_gps').show();
} else {
$('#tabs ul.mode-connected li.tab_gps').hide();
}
if (isExpertModeEnabled()) {
$('#tabs ul.mode-connected li.tab_failsafe').show();
} else {
$('#tabs ul.mode-connected li.tab_failsafe').hide();
}
if (isExpertModeEnabled()) {
$('#tabs ul.mode-connected li.tab_adjustments').show();
} else {
$('#tabs ul.mode-connected li.tab_adjustments').hide();
}
if (isExpertModeEnabled()) {
$('#tabs ul.mode-connected li.tab_servos').show();
} else {
$('#tabs ul.mode-connected li.tab_servos').hide();
}
if (features.isEnabled('LED_STRIP')) {
$('#tabs ul.mode-connected li.tab_led_strip').show();
} else {
$('#tabs ul.mode-connected li.tab_led_strip').hide();
}
if (isExpertModeEnabled()) {
$('#tabs ul.mode-connected li.tab_sensors').show();
} else {
$('#tabs ul.mode-connected li.tab_sensors').hide();
}
if (isExpertModeEnabled()) {
$('#tabs ul.mode-connected li.tab_logging').show();
} else {
$('#tabs ul.mode-connected li.tab_logging').hide();
}
if (features.isEnabled('TRANSPONDER')) {
$('#tabs ul.mode-connected li.tab_transponder').show();
} else {
@ -691,6 +679,13 @@ function updateTabList(features) {
} else {
$('#tabs ul.mode-connected li.tab_power').hide();
}
if (semver.gte(CONFIG.apiVersion, "1.42.0")) {
$('#tabs ul.mode-connected li.tab_vtx').show();
} else {
$('#tabs ul.mode-connected li.tab_vtx').hide();
}
}
function zeroPad(value, width) {

View file

@ -112,6 +112,9 @@ var MSPCodes = {
MSP_COMPASS_CONFIG: 133,
MSP_GPS_RESCUE: 135,
MSP_VTXTABLE_BAND: 137,
MSP_VTXTABLE_POWERLEVEL: 138,
MSP_STATUS_EX: 150,
MSP_UID: 160,
@ -148,6 +151,9 @@ var MSPCodes = {
MSP_SET_COMPASS_CONFIG: 224,
MSP_SET_GPS_RESCUE: 225,
MSP_SET_VTXTABLE_BAND: 227,
MSP_SET_VTXTABLE_POWERLEVEL: 228,
MSP_MODE_RANGES_EXTRA: 238,
MSP_SET_ACC_TRIM: 239,
MSP_ACC_TRIM: 240,

View file

@ -1300,9 +1300,78 @@ MspHelper.prototype.process_data = function(dataHandler) {
TRANSPONDER.data.push(data.readU8());
}
break;
case MSPCodes.MSP_SET_TRANSPONDER_CONFIG:
console.log("Transponder config saved");
break;
case MSPCodes.MSP_VTX_CONFIG:
VTX_CONFIG.vtx_type = data.readU8();
VTX_CONFIG.vtx_band = data.readU8();
VTX_CONFIG.vtx_channel = data.readU8();
VTX_CONFIG.vtx_power = data.readU8();
VTX_CONFIG.vtx_pit_mode = data.readU8() != 0;
VTX_CONFIG.vtx_frequency = data.readU16();
VTX_CONFIG.vtx_device_ready = data.readU8() != 0;
VTX_CONFIG.vtx_low_power_disarm = data.readU8();
if (semver.gte(CONFIG.apiVersion, "1.42.0")) {
VTX_CONFIG.vtx_pit_mode_frequency = data.readU16();
VTX_CONFIG.vtx_table_available = data.readU8() != 0;
VTX_CONFIG.vtx_table_bands = data.readU8();
VTX_CONFIG.vtx_table_channels = data.readU8();
VTX_CONFIG.vtx_table_powerlevels = data.readU8();
VTX_CONFIG.vtx_table_clear = false;
}
break;
case MSPCodes.MSP_SET_VTX_CONFIG:
console.log("VTX config sent");
break;
case MSPCodes.MSP_VTXTABLE_BAND:
VTXTABLE_BAND.vtxtable_band_number = data.readU8();
let bandNameLength = data.readU8();
VTXTABLE_BAND.vtxtable_band_name = '';
for (let i = 0; i < bandNameLength; i++) {
VTXTABLE_BAND.vtxtable_band_name += String.fromCharCode(data.readU8());
}
VTXTABLE_BAND.vtxtable_band_letter = String.fromCharCode(data.readU8());
VTXTABLE_BAND.vtxtable_band_is_factory_band = data.readU8() != 0;
let bandFrequenciesLength = data.readU8();
VTXTABLE_BAND.vtxtable_band_frequencies = [];
for (let i = 0; i < bandFrequenciesLength; i++) {
VTXTABLE_BAND.vtxtable_band_frequencies.push(data.readU16());
}
break;
case MSPCodes.MSP_SET_VTXTABLE_BAND:
console.log("VTX band sent");
break;
case MSPCodes.MSP_VTXTABLE_POWERLEVEL:
VTXTABLE_POWERLEVEL.vtxtable_powerlevel_number = data.readU8();
VTXTABLE_POWERLEVEL.vtxtable_powerlevel_value = data.readU16();
let powerLabelLength = data.readU8();
VTXTABLE_POWERLEVEL.vtxtable_powerlevel_label = '';
for (let i = 0; i < powerLabelLength; i++) {
VTXTABLE_POWERLEVEL.vtxtable_powerlevel_label += String.fromCharCode(data.readU8());
}
break;
case MSPCodes.MSP_SET_VTXTABLE_POWERLEVEL:
console.log("VTX powerlevel sent");
break;
case MSPCodes.MSP_SET_MODE_RANGE:
console.log('Mode range saved');
break;
@ -1358,10 +1427,6 @@ MspHelper.prototype.process_data = function(dataHandler) {
case MSPCodes.MSP_OSD_CHAR_WRITE:
console.log('OSD char uploaded');
break;
case MSPCodes.MSP_VTX_CONFIG:
break;
case MSPCodes.MSP_SET_VTX_CONFIG:
break;
case MSPCodes.MSP_SET_NAME:
console.log('Name set');
break;
@ -1919,6 +1984,58 @@ MspHelper.prototype.crunch = function(code) {
}
break;
case MSPCodes.MSP_SET_VTX_CONFIG:
buffer.push16(VTX_CONFIG.vtx_frequency)
.push8(VTX_CONFIG.vtx_power)
.push8(VTX_CONFIG.vtx_pit_mode ? 1 : 0)
.push8(VTX_CONFIG.vtx_low_power_disarm);
if (semver.gte(CONFIG.apiVersion, "1.42.0")) {
buffer.push16(VTX_CONFIG.vtx_pit_mode_frequency)
.push8(VTX_CONFIG.vtx_band)
.push8(VTX_CONFIG.vtx_channel)
.push16(VTX_CONFIG.vtx_frequency)
.push8(VTX_CONFIG.vtx_table_bands)
.push8(VTX_CONFIG.vtx_table_channels)
.push8(VTX_CONFIG.vtx_table_powerlevels)
.push8(VTX_CONFIG.vtx_table_clear ? 1 : 0);
}
break;
case MSPCodes.MSP_SET_VTXTABLE_POWERLEVEL:
buffer.push8(VTXTABLE_POWERLEVEL.vtxtable_powerlevel_number)
.push16(VTXTABLE_POWERLEVEL.vtxtable_powerlevel_value);
buffer.push8(VTXTABLE_POWERLEVEL.vtxtable_powerlevel_label.length);
for (let i = 0; i < VTXTABLE_POWERLEVEL.vtxtable_powerlevel_label.length; i++) {
buffer.push8(VTXTABLE_POWERLEVEL.vtxtable_powerlevel_label.charCodeAt(i));
}
break;
case MSPCodes.MSP_SET_VTXTABLE_BAND:
buffer.push8(VTXTABLE_BAND.vtxtable_band_number);
buffer.push8(VTXTABLE_BAND.vtxtable_band_name.length);
for (let i = 0; i < VTXTABLE_BAND.vtxtable_band_name.length; i++) {
buffer.push8(VTXTABLE_BAND.vtxtable_band_name.charCodeAt(i));
}
buffer.push8(VTXTABLE_BAND.vtxtable_band_letter.charCodeAt(0))
.push8(VTXTABLE_BAND.vtxtable_band_is_factory_band ? 1 : 0);
buffer.push8(VTXTABLE_BAND.vtxtable_band_frequencies.length);
for (let i = 0; i < VTXTABLE_BAND.vtxtable_band_frequencies.length; i++) {
buffer.push16(VTXTABLE_BAND.vtxtable_band_frequencies[i]);
}
break;
default:
return false;
}

View file

@ -55,7 +55,7 @@ TABS.setup_osd.initialize = function (callback) {
element.text(osdVideoMode);
element = $('.camera-connected');
element.text(OSD_VIDEO_STATE.camera_connected ? i18n.getMessage('osdSetupCameraConnectedValueYes') : i18n.getMessage('osdSetupCameraConnectedValueNo'));
element.text(OSD_VIDEO_STATE.camera_connected ? i18n.getMessage('yes') : i18n.getMessage('No'));
});
*/
}

563
src/js/tabs/vtx.js Normal file
View file

@ -0,0 +1,563 @@
'use strict';
TABS.vtx = {
supported: false,
MAX_POWERLEVEL_VALUES: 8,
MAX_BAND_VALUES: 8,
MAX_BAND_CHANNELS_VALUES: 8,
VTXTABLE_BAND_LIST: [],
VTXTABLE_POWERLEVEL_LIST: [],
};
TABS.vtx.initialize = function (callback) {
if (GUI.active_tab != 'vtx') {
GUI.active_tab = 'vtx';
}
this.supported = semver.gte(CONFIG.apiVersion, "1.42.0");
if (!this.supported) {
load_html();
} else {
read_vtx_config(load_html);
}
function load_html() {
$('#content').load("./tabs/vtx.html", process_html);
}
function process_html() {
initDisplay();
// translate to user-selected language
i18n.localizePage();
GUI.content_ready(callback);
}
// Read all the MSP data needed by the tab
function read_vtx_config(callback_after_msp) {
vtx_config();
function vtx_config() {
MSP.send_message(MSPCodes.MSP_VTX_CONFIG, false, false, vtxtable_bands);
}
function vtxtable_bands() {
// Simulation of static variable
if (typeof vtxtable_bands.counter === 'undefined') {
TABS.vtx.VTXTABLE_BAND_LIST = [];
vtxtable_bands.counter = 1;
} else {
TABS.vtx.VTXTABLE_BAND_LIST.push(Object.assign({}, VTXTABLE_BAND));
vtxtable_bands.counter++;
}
let buffer = [];
buffer.push8(vtxtable_bands.counter);
if (vtxtable_bands.counter <= VTX_CONFIG.vtx_table_bands) {
MSP.send_message(MSPCodes.MSP_VTXTABLE_BAND, buffer, false, vtxtable_bands);
} else {
vtxtable_bands.counter = undefined;
vtxtable_powerlevels();
}
}
function vtxtable_powerlevels() {
// Simulation of static variable
if (typeof vtxtable_powerlevels.counter === 'undefined') {
TABS.vtx.VTXTABLE_POWERLEVEL_LIST = [];
vtxtable_powerlevels.counter = 1;
} else {
TABS.vtx.VTXTABLE_POWERLEVEL_LIST.push(Object.assign({}, VTXTABLE_POWERLEVEL));
vtxtable_powerlevels.counter++;
}
let buffer = [];
buffer.push8(vtxtable_powerlevels.counter);
if (vtxtable_powerlevels.counter <= VTX_CONFIG.vtx_table_powerlevels) {
MSP.send_message(MSPCodes.MSP_VTXTABLE_POWERLEVEL, buffer, false, vtxtable_powerlevels);
} else {
vtxtable_powerlevels.counter = undefined;
callback_after_msp();
}
}
}
// Prepares all the UI elements, the MSP command has been executed before
function initDisplay() {
if (!TABS.vtx.supported) {
$(".tab-vtx").removeClass("supported");
return;
}
$(".tab-vtx").addClass("supported");
// Load all the dynamic elements
loadPowerLevelsTemplate();
loadBandsChannelsTemplate();
populateBandSelect();
populatePowerSelect();
$(".uppercase").keyup(function(){
this.value = this.value.toUpperCase().trim();
});
// Supported?
let vtxSupported = VTX_CONFIG.vtx_type != 0 && VTX_CONFIG.vtx_type != 255;
let vtxTableNotConfigured = vtxSupported && VTX_CONFIG.vtx_table_available && (VTX_CONFIG.vtx_table_bands == 0 ||
VTX_CONFIG.vtx_table_channels == 0 ||
VTX_CONFIG.vtx_table_powerlevels == 0);
$(".vtx_supported").toggle(vtxSupported);
$(".vtx_not_supported").toggle(!vtxSupported);
$(".vtx_table_available").toggle(vtxSupported && VTX_CONFIG.vtx_table_available);
$(".vtx_table_not_configured").toggle(vtxTableNotConfigured);
// Insert actual values in the fields
// Values of the selected mode
$("#vtx_frequency").val(VTX_CONFIG.vtx_frequency);
$("#vtx_band").val(VTX_CONFIG.vtx_band);
$("#vtx_band").change(populateChannelSelect).change();
$("#vtx_channel").val(VTX_CONFIG.vtx_channel);
if (VTX_CONFIG.vtx_table_available) {
$("#vtx_channel").attr("max", VTX_CONFIG.vtx_table_channels);
}
$("#vtx_power").val(VTX_CONFIG.vtx_power);
$("#vtx_pit_mode").prop('checked', VTX_CONFIG.vtx_pit_mode);
$("#vtx_pit_mode_frequency").val(VTX_CONFIG.vtx_pit_mode_frequency);
$("#vtx_low_power_disarm").val(VTX_CONFIG.vtx_low_power_disarm);
// Values of the current values
let yesMessage = i18n.getMessage("yes");
let noMessage = i18n.getMessage("no");
$("#vtx_device_ready_description").text(VTX_CONFIG.vtx_device_ready ? yesMessage : noMessage);
$("#vtx_type_description").text(i18n.getMessage("vtxType_" + VTX_CONFIG.vtx_type));
$("#vtx_channel_description").text(VTX_CONFIG.vtx_channel);
$("#vtx_frequency_description").text(VTX_CONFIG.vtx_frequency);
$("#vtx_pit_mode_description").text(VTX_CONFIG.vtx_pit_mode ? yesMessage : noMessage);
$("#vtx_pit_mode_frequency_description").text(VTX_CONFIG.vtx_pit_mode_frequency);
$("#vtx_low_power_disarm_description").text(i18n.getMessage("vtxLowPowerDisarmOption_" + VTX_CONFIG.vtx_low_power_disarm));
if (VTX_CONFIG.vtx_band == 0) {
$("#vtx_band_description").text(i18n.getMessage("vtxBand_0"));
} else {
if (VTX_CONFIG.vtx_table_available && TABS.vtx.VTXTABLE_BAND_LIST[VTX_CONFIG.vtx_band - 1]) {
let bandName = TABS.vtx.VTXTABLE_BAND_LIST[VTX_CONFIG.vtx_band - 1].vtxtable_band_name;
if (bandName.trim() === '') {
bandName = VTX_CONFIG.vtx_band;
}
$("#vtx_band_description").text(bandName);
} else {
$("#vtx_band_description").text(VTX_CONFIG.vtx_band);
}
}
if (VTX_CONFIG.vtx_power == 0) {
$("#vtx_power_description").text(i18n.getMessage("vtxPower_0"));
} else {
if (VTX_CONFIG.vtx_table_available) {
let powerLevel = TABS.vtx.VTXTABLE_POWERLEVEL_LIST[VTX_CONFIG.vtx_power - 1].vtxtable_powerlevel_label;
if (powerLevel.trim() === '') {
powerLevel = i;
}
$("#vtx_power_description").text(powerLevel);
} else {
let levelText = i18n.getMessage('vtxPower_X', {powerLevel: VTX_CONFIG.vtx_power});
$("#vtx_power_description").text(levelText);
}
}
$("#vtx_table_powerlevels").val(VTX_CONFIG.vtx_table_powerlevels);
// Populate power levels
for (let i = 1; i <= TABS.vtx.VTXTABLE_POWERLEVEL_LIST.length; i++) {
$("#vtx_table_powerlevels_" + i).val(TABS.vtx.VTXTABLE_POWERLEVEL_LIST[i - 1].vtxtable_powerlevel_value);
$("#vtx_table_powerlabels_" + i).val(TABS.vtx.VTXTABLE_POWERLEVEL_LIST[i - 1].vtxtable_powerlevel_label);
}
$("#vtx_table_bands").val(VTX_CONFIG.vtx_table_bands);
$("#vtx_table_channels").val(VTX_CONFIG.vtx_table_channels);
// Populate VTX Table
for (let i = 1; i <= TABS.vtx.VTXTABLE_BAND_LIST.length; i++) {
$("#vtx_table_band_name_" + i).val(TABS.vtx.VTXTABLE_BAND_LIST[i - 1].vtxtable_band_name);
$("#vtx_table_band_letter_" + i).val(TABS.vtx.VTXTABLE_BAND_LIST[i - 1].vtxtable_band_letter);
$("#vtx_table_band_factory_" + i).prop("checked",TABS.vtx.VTXTABLE_BAND_LIST[i - 1].vtxtable_band_is_factory_band);
for (let j = 1; j <= TABS.vtx.VTXTABLE_BAND_LIST[i - 1].vtxtable_band_frequencies.length; j++) {
$("#vtx_table_band_channel_" + i + "_" + j).val(TABS.vtx.VTXTABLE_BAND_LIST[i - 1].vtxtable_band_frequencies[j - 1]);
}
}
// Actions and other
function frequencyOrBandChannel() {
let frequencyEnabled = $(this).prop('checked');
if (frequencyEnabled) {
$(".field.vtx_channel").slideUp(100, function() {
$(".field.vtx_band").slideUp(100, function() {
$(".field.vtx_frequency").slideDown(100);
});
});
} else {
$(".field.vtx_frequency").slideUp(100, function() {
$(".field.vtx_band").slideDown(100,function() {
$(".field.vtx_channel").slideDown(100);
});
});
}
}
$("#vtx_frequency_channel").prop('checked', VTX_CONFIG.vtx_band == 0 && VTX_CONFIG.vtx_frequency > 0)
.change(frequencyOrBandChannel)
.change();
function showHidePowerlevels() {
let powerlevelsValue = $(this).val();
for (let i = 1; i <= TABS.vtx.MAX_POWERLEVEL_VALUES; i++) {
$(".vtx_table_powerlevels_table td:nth-child(" + i +")").toggle(i <= powerlevelsValue);
}
}
$("#vtx_table_powerlevels").change(showHidePowerlevels).change();
function showHideBands() {
let bandsValue = $(this).val();
for (let i = 1; i <= TABS.vtx.MAX_BAND_VALUES; i++) {
$(".vtx_table_bands_table tr:nth-child(" + (i + 1) +")").toggle(i <= bandsValue);
}
}
$("#vtx_table_bands").change(showHideBands).change();
function showHideBandChannels() {
let channelsValue = $(this).val();
for (let i = 1; i <= TABS.vtx.MAX_BAND_CHANNELS_VALUES; i++) {
$(".vtx_table_bands_table td:nth-child(" + (i + 3) +")").toggle(i <= channelsValue);
}
}
$("#vtx_table_channels").change(showHideBandChannels).change();
/*** Helper functions */
function loadPowerLevelsTemplate() {
// Power levels title
let powerlevelstitle_e = $(".vtx_table_powerlevels_table .vtx_table_powerlevels_title");
for (let i = 1; i <= TABS.vtx.MAX_POWERLEVEL_VALUES; i++) {
powerlevelstitle_e.append("<td><span>" + i + "</span></td>");
}
// Power levels
let powerlevelsrow_e = $(".vtx_table_powerlevels_table .vtx_table_powerlevels_values");
let powervalues_e = $("#tab-vtx-templates #tab-vtx-powerlevel-values td");
for (let i = 1; i <= TABS.vtx.MAX_POWERLEVEL_VALUES; i++) {
let newPowerValues_e = powervalues_e.clone();
$(newPowerValues_e).find('input').attr('id', 'vtx_table_powerlevels_' + i);
powerlevelsrow_e.append(newPowerValues_e);
}
powerlevelsrow_e.append("<td><span>" + i18n.getMessage('vtxTablePowerLevelsValue') + "</span></td>");
// Power labels
let powerlabelsrow_e = $(".vtx_table_powerlevels_table .vtx_table_powerlevels_labels");
let powerlabels_e = $("#tab-vtx-templates #tab-vtx-powerlevel-labels td");
for (let i = 1; i <= TABS.vtx.MAX_POWERLEVEL_VALUES; i++) {
let newPowerLabels_e = powerlabels_e.clone();
$(newPowerLabels_e).find('input').attr('id', 'vtx_table_powerlabels_' + i);
powerlabelsrow_e.append(newPowerLabels_e);
}
powerlabelsrow_e.append("<td><span>" + i18n.getMessage('vtxTablePowerLevelsLabel') + "</span></td>");
}
function loadBandsChannelsTemplate() {
let bandstable_e = $(".vtx_table_bands_table tbody");
// Title
let title_e = $("#tab-vtx-templates #tab-vtx-bands-title tr");
for (let i = 1; i <= TABS.vtx.MAX_BAND_VALUES; i++) {
title_e.append("<td><span>" + i + "</span></td>");
}
bandstable_e.append(title_e);
// Bands
let band_e = $("#tab-vtx-templates #tab-vtx-bands tr");
let channel_e = $("#tab-vtx-templates #tab-vtx-channels td");
for (let i = 1; i <= TABS.vtx.MAX_BAND_VALUES; i++) {
let newBand_e = band_e.clone();
$(newBand_e).find('#vtx_table_band_name').attr('id', 'vtx_table_band_name_' + i);
$(newBand_e).find('#vtx_table_band_letter').attr('id', 'vtx_table_band_letter_' + i);
$(newBand_e).find('#vtx_table_band_factory').attr('id', 'vtx_table_band_factory_' + i);
// Channels
let newChannel_e;
for (let j = 1; j <= TABS.vtx.MAX_BAND_CHANNELS_VALUES; j++) {
newChannel_e = channel_e.clone();
$(newChannel_e).find('input').attr('id', 'vtx_table_band_channel_' + i + '_' + j);
newBand_e.append(newChannel_e);
}
// Append to the end an index of the band
newBand_e.append("<td><span>" + i18n.getMessage("vtxBand_X", {bandName: i}) + "</span></td>")
bandstable_e.append(newBand_e);
}
}
function populateBandSelect() {
let selectBand = $(".field #vtx_band");
selectBand.append(new Option(i18n.getMessage('vtxBand_0'), 0))
if (VTX_CONFIG.vtx_table_available) {
for (let i = 1; i <= VTX_CONFIG.vtx_table_bands; i++) {
let bandName = TABS.vtx.VTXTABLE_BAND_LIST[i - 1].vtxtable_band_name;
if (bandName.trim() === '') {
bandName = i18n.getMessage('vtxBand_X', {bandName: i});
}
selectBand.append(new Option(bandName, i));
}
} else {
for (let i = 1; i <= TABS.vtx.MAX_BAND_VALUES; i++) {
selectBand.append(new Option(i18n.getMessage('vtxBand_X', {bandName: i}), i));
}
}
}
function populateChannelSelect() {
let selectChannel = $(".field #vtx_channel");
let selectedBand = $("#vtx_band").val();
selectChannel.empty();
selectChannel.append(new Option(i18n.getMessage('vtxChannel_0'), 0))
if (VTX_CONFIG.vtx_table_available) {
if (TABS.vtx.VTXTABLE_BAND_LIST[selectedBand - 1]) {
for (let i = 1; i <= TABS.vtx.VTXTABLE_BAND_LIST[selectedBand - 1].vtxtable_band_frequencies.length; i++) {
let channelName = TABS.vtx.VTXTABLE_BAND_LIST[selectedBand - 1].vtxtable_band_frequencies[i - 1];
if (channelName > 0) {
selectChannel.append(new Option(i18n.getMessage('vtxChannel_X', {channelName: i}), i));
}
}
}
} else {
for (let i = 1; i <= TABS.vtx.MAX_BAND_CHANNELS_VALUES; i++) {
selectBand.append(new Option(i18n.getMessage('vtxChannel_X', {channelName: i}), i));
}
}
}
function populatePowerSelect() {
let selectPower = $(".field #vtx_power");
if (VTX_CONFIG.vtx_table_available) {
selectPower.append(new Option(i18n.getMessage('vtxPower_0'), 0))
for (let i = 1; i <= VTX_CONFIG.vtx_table_powerlevels; i++) {
let powerLevel = TABS.vtx.VTXTABLE_POWERLEVEL_LIST[i - 1].vtxtable_powerlevel_label;
if (powerLevel.trim() === '') {
powerLevel = i18n.getMessage('vtxPower_X', {powerLevel: i});
}
selectPower.append(new Option(powerLevel, i));
}
} else {
let powerMaxMinValues = getPowerValues(VTX_CONFIG.vtx_type);
for (let i = powerMaxMinValues.min; i <= powerMaxMinValues.max; i++) {
if (i == 0) {
selectPower.append(new Option(i18n.getMessage('vtxPower_0'), 0))
} else {
selectPower.append(new Option(i18n.getMessage('vtxPower_X', {bandName: i}), i));
}
}
}
}
// Returns the power values min and max depending on the VTX Type
function getPowerValues(vtxType) {
let powerMinMax = {};
if (VTX_CONFIG.vtx_table_available) {
powerMinMax = {min: 1, max: VTX_CONFIG.vtx_table_powerlevels}
} else {
switch (vtxType) {
case 0: // Unsupported
powerMinMax = {};
break;
case 1: // RTC6705
powerMinMax = {min: 1, max: 3};
break;
case 3: // SmartAudio
powerMinMax = {min: 1, max: 4};
break;
case 4: // Tramp
powerMinMax = {min: 1, max: 5};
break;
case 255: // Unknown
default:
powerMinMax = {min: 0, max: 7};
}
}
return powerMinMax;
}
// Save function
$('a.save').click(function () {
save_vtx();
});
}
// Save all the values from the tab to MSP
function save_vtx() {
// General config
let frequencyEnabled = $("#vtx_frequency_channel").prop('checked');
if (frequencyEnabled) {
VTX_CONFIG.vtx_frequency = parseInt($("#vtx_frequency").val());
VTX_CONFIG.vtx_band = 0;
VTX_CONFIG.vtx_channel = 0;
} else {
VTX_CONFIG.vtx_band = parseInt($("#vtx_band").val());
VTX_CONFIG.vtx_channel = parseInt($("#vtx_channel").val());
VTX_CONFIG.vtx_frequency = 0;
if (semver.lt(CONFIG.apiVersion, "1.42.0")) {
if (VTX_CONFIG.vtx_band > 0 || VTX_CONFIG.vtx_channel > 0) {
VTX_CONFIG.vtx_frequency = (band - 1) * 8 + (channel - 1);
}
}
}
VTX_CONFIG.vtx_power = parseInt($("#vtx_power").val());
VTX_CONFIG.vtx_pit_mode = $("#vtx_pit_mode").prop('checked');
VTX_CONFIG.vtx_low_power_disarm = parseInt($("#vtx_low_power_disarm").val());
VTX_CONFIG.vtx_table_clear = true;
// Power levels
VTX_CONFIG.vtx_table_powerlevels = parseInt($("#vtx_table_powerlevels").val());
TABS.vtx.VTXTABLE_POWERLEVEL_LIST = [];
for (let i = 1; i <= VTX_CONFIG.vtx_table_powerlevels; i++) {
TABS.vtx.VTXTABLE_POWERLEVEL_LIST[i - 1] = {};
TABS.vtx.VTXTABLE_POWERLEVEL_LIST[i - 1].vtxtable_powerlevel_number = i;
TABS.vtx.VTXTABLE_POWERLEVEL_LIST[i - 1].vtxtable_powerlevel_value = parseInt($("#vtx_table_powerlevels_" + i).val());
TABS.vtx.VTXTABLE_POWERLEVEL_LIST[i - 1].vtxtable_powerlevel_label = $("#vtx_table_powerlabels_" + i).val();
}
// Bands and channels
VTX_CONFIG.vtx_table_bands = parseInt($("#vtx_table_bands").val());
VTX_CONFIG.vtx_table_channels = parseInt($("#vtx_table_channels").val());
TABS.vtx.VTXTABLE_BAND_LIST = [];
for (let i = 1; i <= VTX_CONFIG.vtx_table_bands; i++) {
TABS.vtx.VTXTABLE_BAND_LIST[i - 1] = {};
TABS.vtx.VTXTABLE_BAND_LIST[i - 1].vtxtable_band_number = i;
TABS.vtx.VTXTABLE_BAND_LIST[i - 1].vtxtable_band_name = $("#vtx_table_band_name_" + i).val();
TABS.vtx.VTXTABLE_BAND_LIST[i - 1].vtxtable_band_letter = $("#vtx_table_band_letter_" + i).val();
TABS.vtx.VTXTABLE_BAND_LIST[i - 1].vtxtable_band_is_factory_band = $("#vtx_table_band_factory_" + i).prop('checked');
TABS.vtx.VTXTABLE_BAND_LIST[i - 1].vtxtable_band_frequencies = [];
for (let j = 1; j <= VTX_CONFIG.vtx_table_channels; j++) {
TABS.vtx.VTXTABLE_BAND_LIST[i - 1].vtxtable_band_frequencies.push(parseInt($("#vtx_table_band_channel_" + i + "_" + j).val()));
}
}
// Start MSP saving
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);
}
function save_vtx_powerlevels() {
// Simulation of static variable
if (typeof save_vtx_powerlevels.counter === 'undefined') {
save_vtx_powerlevels.counter = 0;
} else {
save_vtx_powerlevels.counter++;
}
if (save_vtx_powerlevels.counter < VTX_CONFIG.vtx_table_powerlevels) {
VTXTABLE_POWERLEVEL = Object.assign({}, TABS.vtx.VTXTABLE_POWERLEVEL_LIST[save_vtx_powerlevels.counter]);
MSP.send_message(MSPCodes.MSP_SET_VTXTABLE_POWERLEVEL, mspHelper.crunch(MSPCodes.MSP_SET_VTXTABLE_POWERLEVEL), false, save_vtx_powerlevels);
} else {
save_vtx_powerlevels.counter = undefined;
save_vtx_bands();
}
}
function save_vtx_bands() {
// Simulation of static variable
if (typeof save_vtx_bands.counter === 'undefined') {
save_vtx_bands.counter = 0;
} else {
save_vtx_bands.counter++;
}
if (save_vtx_bands.counter < VTX_CONFIG.vtx_table_bands) {
VTXTABLE_BAND = Object.assign({}, TABS.vtx.VTXTABLE_BAND_LIST[save_vtx_bands.counter]);
MSP.send_message(MSPCodes.MSP_SET_VTXTABLE_BAND, mspHelper.crunch(MSPCodes.MSP_SET_VTXTABLE_BAND), false, save_vtx_bands);
} else {
save_vtx_bands.counter = undefined;
save_to_eeprom();
}
}
function save_to_eeprom() {
MSP.send_message(MSPCodes.MSP_EEPROM_WRITE, false, false, save_completed);
}
function save_completed() {
GUI.log(i18n.getMessage('configurationEepromSaved'));
var oldText = $("#save_button").text();
$("#save_button").html(i18n.getMessage('vtxButtonSaved'));
setTimeout(function () {
$("#save_button").html(oldText);
}, 2000);
TABS.vtx.initialize();
}
}
};
TABS.vtx.cleanup = function (callback) {
// Add here things that need to be cleaned or closed before leaving the tab
this.VTXTABLE_BAND_LIST = [];
this.VTXTABLE_POWERLEVEL_LIST = [];
if (callback) {
callback();
}
};