1
0
Fork 0
mirror of https://github.com/iNavFlight/inav-configurator.git synced 2025-07-14 20:10:11 +03:00

Add support for the new VTX settings API

When a controllable VTX is configured, a new section appears in
the configuration tab which allows the user to set the band, channel
power and "low power on disarm" option.
This commit is contained in:
Alberto García Hierro 2018-06-20 15:21:40 +01:00
parent ba45e316e3
commit 6da922919f
8 changed files with 229 additions and 2 deletions

View file

@ -804,7 +804,42 @@
"configurationButtonSave": { "configurationButtonSave": {
"message": "Save and Reboot" "message": "Save and Reboot"
}, },
"configurationVTX": {
"message": "VTX"
},
"configurationVTXBand": {
"message": "Band"
},
"configurationNoBand": {
"message": "None"
},
"configurationVTXNoBandHelp": {
"message": "VTX frequency has been set manually. Selecting a band will overwrite the configured frequency."
},
"configurationVTXChannel": {
"message": "Channel"
},
"configurationVTXPower": {
"message": "Power Level"
},
"configurationVTXPowerHelp": {
"message": "VTX power level. The exact power in mw (or dBm) will depend on the specific hardware. Check your VTX manual."
},
"configurationVTXLowerPowerDisarm": {
"message": "Use low power while the craft is disarmed"
},
"configurationVTXLowerPowerDisarmHelp": {
"message": "Enabling this option will make the VTX use its lowest power while the craft is disarmed. Use 'Until first arm' to make it use the lowest power only until you arm for the first time."
},
"configurationVTXLowPowerDisarmValue_0": {
"message": "Disabled"
},
"configurationVTXLowPowerDisarmValue_1": {
"message": "Always"
},
"configurationVTXLowPowerDisarmValue_2": {
"message": "Until first arm"
},
"portsHelp": { "portsHelp": {
"message": "<strong>Note:</strong> not all combinations are valid. When the flight controller firmware detects this the serial port configuration will be reset." "message": "<strong>Note:</strong> not all combinations are valid. When the flight controller firmware detects this the serial port configuration will be reset."
}, },

View file

@ -97,6 +97,7 @@ sources.js = [
'./js/tasks.js', './js/tasks.js',
'./js/servoMixerRuleCollection.js', './js/servoMixerRuleCollection.js',
'./js/motorMixerRuleCollection.js', './js/motorMixerRuleCollection.js',
'./js/vtx.js',
'./main.js', './main.js',
'./tabs/*.js', './tabs/*.js',
'./js/eventFrequencyAnalyzer.js', './js/eventFrequencyAnalyzer.js',

View file

@ -39,6 +39,7 @@ var CONFIG,
RX_CONFIG, RX_CONFIG,
FAILSAFE_CONFIG, FAILSAFE_CONFIG,
RXFAIL_CONFIG, RXFAIL_CONFIG,
VTX_CONFIG,
ADVANCED_CONFIG, ADVANCED_CONFIG,
INAV_PID_CONFIG, INAV_PID_CONFIG,
PID_ADVANCED, PID_ADVANCED,
@ -296,6 +297,15 @@ var FC = {
capacity_unit: 0 capacity_unit: 0
}; };
VTX_CONFIG = {
device_type: VTXDEV_UNKNOWN,
band: 0,
channel: 1,
power: 0,
pitmode: 0,
low_power_disarm: 0,
};
ADVANCED_CONFIG = { ADVANCED_CONFIG = {
gyroSyncDenominator: null, gyroSyncDenominator: null,
pidProcessDenom: null, pidProcessDenom: null,

View file

@ -66,6 +66,8 @@ var MSPCodes = {
MSP_SET_OSD_CONFIG: 85, MSP_SET_OSD_CONFIG: 85,
MSP_OSD_CHAR_READ: 86, MSP_OSD_CHAR_READ: 86,
MSP_OSD_CHAR_WRITE: 87, MSP_OSD_CHAR_WRITE: 87,
MSP_VTX_CONFIG: 88,
MSP_SET_VTX_CONFIG: 89,
MSP_ADVANCED_CONFIG: 90, MSP_ADVANCED_CONFIG: 90,
MSP_SET_ADVANCED_CONFIG: 91, MSP_SET_ADVANCED_CONFIG: 91,
MSP_FILTER_CONFIG: 92, MSP_FILTER_CONFIG: 92,

View file

@ -1052,7 +1052,18 @@ var mspHelper = (function (gui) {
case MSPCodes.MSP_SET_TRANSPONDER_CONFIG: case MSPCodes.MSP_SET_TRANSPONDER_CONFIG:
console.log("Transponder config saved"); console.log("Transponder config saved");
break; break;
case MSPCodes.MSP_VTX_CONFIG:
VTX_CONFIG.device_type = data.getUint8(offset++);
if (VTX_CONFIG.device_type != VTXDEV_UNKNOWN) {
VTX_CONFIG.band = data.getUint8(offset++);
VTX_CONFIG.channel = data.getUint8(offset++);
VTX_CONFIG.power = data.getUint8(offset++);
VTX_CONFIG.pitmode = data.getUint8(offset++);
// Ignore wether the VTX is ready for now
offset++;
VTX_CONFIG.low_power_disarm = data.getUint8(offset++);
}
break;
case MSPCodes.MSP_ADVANCED_CONFIG: case MSPCodes.MSP_ADVANCED_CONFIG:
ADVANCED_CONFIG.gyroSyncDenominator = data.getUint8(offset); ADVANCED_CONFIG.gyroSyncDenominator = data.getUint8(offset);
offset++; offset++;
@ -1069,6 +1080,10 @@ var mspHelper = (function (gui) {
ADVANCED_CONFIG.gyroSync = data.getUint8(offset); ADVANCED_CONFIG.gyroSync = data.getUint8(offset);
break; break;
case MSPCodes.MSP_SET_VTX_CONFIG:
console.log("VTX config saved");
break;
case MSPCodes.MSP_SET_ADVANCED_CONFIG: case MSPCodes.MSP_SET_ADVANCED_CONFIG:
console.log("Advanced config saved"); console.log("Advanced config saved");
break; break;
@ -1393,6 +1408,18 @@ var mspHelper = (function (gui) {
buffer.push(lowByte(BF_CONFIG.currentoffset)); buffer.push(lowByte(BF_CONFIG.currentoffset));
buffer.push(highByte(BF_CONFIG.currentoffset)); buffer.push(highByte(BF_CONFIG.currentoffset));
break; break;
case MSPCodes.MSP_SET_VTX_CONFIG:
if (VTX_CONFIG.band > 0) {
buffer.push16(((VTX_CONFIG.band - 1) * 8) + (VTX_CONFIG.channel - 1));
} else {
// This tells the firmware to ignore this value.
buffer.push16(VTX_MAX_FREQUENCY_MHZ + 1);
}
buffer.push(VTX_CONFIG.power);
// Don't enable PIT mode
buffer.push(0);
buffer.push(VTX_CONFIG.low_power_disarm);
break;
case MSPCodes.MSP_SET_PID: case MSPCodes.MSP_SET_PID:
for (i = 0; i < PIDs.length; i++) { for (i = 0; i < PIDs.length; i++) {
buffer.push(parseInt(PIDs[i][0])); buffer.push(parseInt(PIDs[i][0]));
@ -2995,5 +3022,21 @@ var mspHelper = (function (gui) {
} }
}; };
self.loadVTXConfig = function (callback) {
if (semver.gte(CONFIG.flightControllerVersion, "2.0.0")) {
MSP.send_message(MSPCodes.MSP_VTX_CONFIG, false, false, callback);
} else {
callback();
}
};
self.saveVTXConfig = function(callback) {
if (semver.gte(CONFIG.flightControllerVersion, "2.0.0")) {
MSP.send_message(MSPCodes.MSP_SET_VTX_CONFIG, mspHelper.crunch(MSPCodes.MSP_SET_VTX_CONFIG), false, callback);
} else {
callback();
}
}
return self; return self;
})(GUI); })(GUI);

23
js/vtx.js Normal file
View file

@ -0,0 +1,23 @@
var VTXDEV_UNKNOWN = 0xFF;
var VTX_BANDS = [
{code: 1, name: 'Boscam A'},
{code: 2, name: 'Boscam B'},
{code: 3, name: 'Boscam E'},
{code: 4, name: 'Fatshark'},
{code: 5, name: 'Raceband'},
];
var VTX_BAND_MIN = 1;
var VTX_BAND_MAX = 5;
var VTX_CHANNEL_MIN = 1;
var VTX_CHANNEL_MAX = 8;
var VTX_POWER_MIN = 0;
var VTX_POWER_MAX = 4;
var VTX_LOW_POWER_DISARM_MIN = 0;
var VTX_LOW_POWER_DISARM_MAX = 2;
var VTX_MAX_FREQUENCY_MHZ = 5999;

View file

@ -232,6 +232,44 @@
</div> </div>
</div> </div>
<div class="config-section gui_box grey config-vtx">
<div class="gui_box_titlebar">
<div class="spacer_box_title" data-i18n="configurationVTX"></div>
</div>
<div class="spacer_box">
<div class="note" id="vtx_no_band">
<div class="note_spacer">
<p data-i18n="configurationVTXNoBandHelp"></p>
</div>
</div>
<div class="select vtx_band_wrapper">
<select id="vtx_band"></select>
<label for="vtx_band">
<span data-i18n="configurationVTXBand"></span>
</label>
</div>
<div class="select vtx_channel_wrapper">
<select id="vtx_channel"></select>
<label for="vtx_channel"> <span data-i18n="configurationVTXChannel"></span></label>
</div>
<div class="select">
<select id="vtx_power"></select>
<label for="vtx_power"><span data-i18n="configurationVTXPower"></span></label>
<div class="helpicon cf_tip" data-i18n_title="configurationVTXPowerHelp"></div>
</div>
<div class="select">
<select id="vtx_low_power_disarm"></select>
<label for="vtx_power"><span data-i18n="configurationVTXLowerPowerDisarm"></span></label>
<div class="helpicon cf_tip" data-i18n_title="configurationVTXLowerPowerDisarmHelp"></div>
</div>
</div>
</div>
</div> </div>
<!--Right column begins here--> <!--Right column begins here-->

View file

@ -34,6 +34,7 @@ TABS.configuration.initialize = function (callback, scrollPosition) {
mspHelper.loadAdvancedConfig, mspHelper.loadAdvancedConfig,
mspHelper.loadINAVPidConfig, mspHelper.loadINAVPidConfig,
mspHelper.loadSensorConfig, mspHelper.loadSensorConfig,
mspHelper.loadVTXConfig,
loadCraftName loadCraftName
]; ];
@ -60,6 +61,7 @@ TABS.configuration.initialize = function (callback, scrollPosition) {
mspHelper.saveAdvancedConfig, mspHelper.saveAdvancedConfig,
mspHelper.saveINAVPidConfig, mspHelper.saveINAVPidConfig,
mspHelper.saveSensorConfig, mspHelper.saveSensorConfig,
mspHelper.saveVTXConfig,
saveCraftName, saveCraftName,
]; ];
@ -269,6 +271,79 @@ TABS.configuration.initialize = function (callback, scrollPosition) {
gps_ubx_sbas_e.val(MISC.gps_ubx_sbas); gps_ubx_sbas_e.val(MISC.gps_ubx_sbas);
// VTX
var config_vtx = $('.config-vtx');
if (VTX_CONFIG.device_type != VTXDEV_UNKNOWN) {
var vtx_band = $('#vtx_band');
vtx_band.empty();
var vtx_no_band_note = $('#vtx_no_band');
if (VTX_CONFIG.band < VTX_BAND_MIN || VTX_CONFIG.band > VTX_BAND_MAX) {
var noBandName = chrome.i18n.getMessage("configurationNoBand");
$('<option value="0">' + noBandName + '</option>').appendTo(vtx_band);
vtx_no_band_note.show();
} else {
vtx_no_band_note.hide();
}
for (var ii = 0; ii < VTX_BANDS.length; ii++) {
var band_name = VTX_BANDS[ii].name;
var option = $('<option value="' + VTX_BANDS[ii].code + '">' + band_name + '</option>');
if (VTX_BANDS[ii].code == VTX_CONFIG.band) {
option.prop('selected', true);
}
option.appendTo(vtx_band);
}
vtx_band.change(function () {
VTX_CONFIG.band = parseInt($(this).val());
});
var vtx_channel = $('#vtx_channel');
vtx_channel.empty();
for (var ii = VTX_CHANNEL_MIN; ii <= VTX_CHANNEL_MAX; ii++) {
var option = $('<option value="' + ii + '">' + ii + '</option>');
if (ii == VTX_CONFIG.channel) {
option.prop('selected', true);
}
option.appendTo(vtx_channel);
}
vtx_channel.change(function () {
VTX_CONFIG.channel = parseInt($(this).val());
});
var vtx_power = $('#vtx_power');
vtx_power.empty();
for (var ii = VTX_POWER_MIN; ii <= VTX_POWER_MAX; ii++) {
var option = $('<option value="' + ii + '">' + ii + '</option>');
if (ii == VTX_CONFIG.power) {
option.prop('selected', true);
}
option.appendTo(vtx_power);
}
vtx_power.change(function () {
VTX_CONFIG.power = parseInt($(this).val());
});
var vtx_low_power_disarm = $('#vtx_low_power_disarm');
vtx_low_power_disarm.empty();
for (var ii = VTX_LOW_POWER_DISARM_MIN; ii <= VTX_LOW_POWER_DISARM_MAX; ii++) {
var name = chrome.i18n.getMessage("configurationVTXLowPowerDisarmValue_" + ii);
if (!name) {
name = ii;
}
var option = $('<option value="' + ii + '">' + name + '</option>');
if (ii == VTX_CONFIG.low_power_disarm) {
option.prop('selected', true);
}
option.appendTo(vtx_low_power_disarm);
}
vtx_low_power_disarm.change(function () {
VTX_CONFIG.low_power_disarm = parseInt($(this).val());
});
config_vtx.show();
} else {
config_vtx.hide();
}
// generate serial RX // generate serial RX
var serialRxTypes = FC.getSerialRxTypes(); var serialRxTypes = FC.getSerialRxTypes();