mirror of
https://github.com/betaflight/betaflight-configurator.git
synced 2025-07-17 13:25:24 +03:00
Merge pull request #1287 from dthubereng/add_mode_logic_to_msp
Add modeLogic and mode link UI support
This commit is contained in:
commit
5de1b703aa
21 changed files with 445 additions and 32 deletions
|
@ -1370,6 +1370,9 @@
|
|||
"auxiliaryAddRange": {
|
||||
"message": "Afegeix Rang"
|
||||
},
|
||||
"auxiliaryAddLink": {
|
||||
"message": "Enllaç"
|
||||
},
|
||||
"auxiliaryButtonSave": {
|
||||
"message": "Desa"
|
||||
},
|
||||
|
@ -1379,6 +1382,12 @@
|
|||
"auxiliaryAutoChannelSelect": {
|
||||
"message": "AUTO"
|
||||
},
|
||||
"auxiliaryModeLogicOR": {
|
||||
"message": "OR"
|
||||
},
|
||||
"auxiliaryModeLogicAND": {
|
||||
"message": "AND"
|
||||
},
|
||||
"adjustmentsHelp": {
|
||||
"message": "Configureu els interruptors d'ajust. Consulteu la secció \"Ajustaments de vol\" del manual per obtenir-ne més detalls. Els canvis que realitzen les funcions d'ajust no es guarden automàticament. Hi ha 4 ranures (slots). Cada interruptor utilitzat per fer ajustaments simultanis requereix l'ús exclusiu d'una ranura."
|
||||
},
|
||||
|
|
|
@ -1544,6 +1544,9 @@
|
|||
"auxiliaryAddRange": {
|
||||
"message": "Bereich hinzufügen"
|
||||
},
|
||||
"auxiliaryAddLink": {
|
||||
"message": "Link"
|
||||
},
|
||||
"auxiliaryButtonSave": {
|
||||
"message": "Speichern"
|
||||
},
|
||||
|
@ -1553,6 +1556,12 @@
|
|||
"auxiliaryAutoChannelSelect": {
|
||||
"message": "AUTO"
|
||||
},
|
||||
"auxiliaryModeLogicOR": {
|
||||
"message": "OR"
|
||||
},
|
||||
"auxiliaryModeLogicAND": {
|
||||
"message": "AND"
|
||||
},
|
||||
"adjustmentsHelp": {
|
||||
"message": "Konfiguriere Schalter Anpassungen. Siehe im 'in-flight adjustments' Abschnitt des Handbuchs für Details nach. Die Änderungen an Anpassungsfunktionen werden nicht automatisch gespeichert. Es gibt 4 (Speicher-) Slots. Jeder Schalter der für gleichzeitige Anpassungen genutzt wird, muss jeweils einem eindeutigen Slot zugeordnet sein."
|
||||
},
|
||||
|
|
|
@ -1717,7 +1717,7 @@
|
|||
},
|
||||
|
||||
"auxiliaryHelp": {
|
||||
"message": "Use ranges to define the switches on your transmitter and corresponding mode assignments. A receiver channel that gives a reading between a range min/max will activate the mode. Remember to save your settings using the Save button."
|
||||
"message": "Configure modes here using a combination of ranges and/or links to other modes (links supported on BF 4.0 and later). Use <strong>ranges</strong> to define the switches on your transmitter and corresponding mode assignments. A receiver channel that gives a reading between a range min/max will activate the mode. Use a <strong>link</strong> to activate a mode when another mode is activated. <strong>Exceptions:</strong> ARM cannot be linked to or from another mode, modes cannot be linked to other modes that are configured with a link (chained links). Multiple ranges/links can be used to activate any mode. If there is more than one range/link defined for a mode, each of them can be set to <strong>AND</strong> or <strong>OR</strong>. A mode will be activated when:<br />- ALL <strong>AND</strong> ranges/links are active; OR<br />- at least one <strong>OR</strong> range/link is active.<br /><br />Remember to save your settings using the Save button."
|
||||
},
|
||||
"auxiliaryToggleUnused": {
|
||||
"message": "Hide unused modes"
|
||||
|
@ -1731,6 +1731,9 @@
|
|||
"auxiliaryAddRange": {
|
||||
"message": "Add Range"
|
||||
},
|
||||
"auxiliaryAddLink": {
|
||||
"message": "Add Link"
|
||||
},
|
||||
"auxiliaryButtonSave": {
|
||||
"message": "Save"
|
||||
},
|
||||
|
@ -1740,6 +1743,12 @@
|
|||
"auxiliaryAutoChannelSelect": {
|
||||
"message": "AUTO"
|
||||
},
|
||||
"auxiliaryModeLogicOR": {
|
||||
"message": "OR"
|
||||
},
|
||||
"auxiliaryModeLogicAND": {
|
||||
"message": "AND"
|
||||
},
|
||||
"adjustmentsHelp": {
|
||||
"message": "Configure adjustment switches. See the 'in-flight adjustments' section of the manual for details. The changes that adjustment functions make are not saved automatically. There are 4 slots. Each switch used to concurrently make adjustments requires exclusive use of a slot."
|
||||
},
|
||||
|
|
|
@ -1543,6 +1543,9 @@
|
|||
"auxiliaryAddRange": {
|
||||
"message": "Añadir Rango"
|
||||
},
|
||||
"auxiliaryAddLink": {
|
||||
"message": "Enlace"
|
||||
},
|
||||
"auxiliaryButtonSave": {
|
||||
"message": "Guardar"
|
||||
},
|
||||
|
@ -1552,6 +1555,12 @@
|
|||
"auxiliaryAutoChannelSelect": {
|
||||
"message": "AUTO"
|
||||
},
|
||||
"auxiliaryModeLogicOR": {
|
||||
"message": "OR"
|
||||
},
|
||||
"auxiliaryModeLogicAND": {
|
||||
"message": "AND"
|
||||
},
|
||||
"adjustmentsHelp": {
|
||||
"message": "Configura interruptores para correcciones. Mira el apartado 'in-flight adjustments' del manual para detalles. Las correcciones realizadas no se guardan automáticamente. Hay 4 ranuras. Cada interruptor usado para hacer correcciones concurrentemente requiere el uso exclusivo de una ranura."
|
||||
},
|
||||
|
|
|
@ -1540,6 +1540,9 @@
|
|||
"auxiliaryAddRange": {
|
||||
"message": "Ajouter une plage"
|
||||
},
|
||||
"auxiliaryAddLink": {
|
||||
"message": "Lier"
|
||||
},
|
||||
"auxiliaryButtonSave": {
|
||||
"message": "Enregistrer"
|
||||
},
|
||||
|
@ -1549,6 +1552,12 @@
|
|||
"auxiliaryAutoChannelSelect": {
|
||||
"message": "AUTOMATIQUE"
|
||||
},
|
||||
"auxiliaryModeLogicOR": {
|
||||
"message": "OR"
|
||||
},
|
||||
"auxiliaryModeLogicAND": {
|
||||
"message": "AND"
|
||||
},
|
||||
"adjustmentsHelp": {
|
||||
"message": "Configurez les commutateurs d'ajustement. Voir la section «Ajustements en vol» du manuel pour plus de détails. Les modifications apportées par les fonctions de réglage ne sont pas enregistrées automatiquement. Il y a 4 emplacements. Chaque commutateur utilisé pour effectuer simultanément des ajustements nécessite l'utilisation exclusive d'un emplacement."
|
||||
},
|
||||
|
|
|
@ -1546,6 +1546,9 @@
|
|||
"auxiliaryAddRange": {
|
||||
"message": "Tambahkan Rentang"
|
||||
},
|
||||
"auxiliaryAddLink": {
|
||||
"message": "Tautkan"
|
||||
},
|
||||
"auxiliaryButtonSave": {
|
||||
"message": "Simpan"
|
||||
},
|
||||
|
@ -1555,6 +1558,12 @@
|
|||
"auxiliaryAutoChannelSelect": {
|
||||
"message": "AUTO"
|
||||
},
|
||||
"auxiliaryModeLogicOR": {
|
||||
"message": "OR"
|
||||
},
|
||||
"auxiliaryModeLogicAND": {
|
||||
"message": "AND"
|
||||
},
|
||||
"adjustmentsHelp": {
|
||||
"message": "Mengkonfigurasi switch penyesuaian. Lihat manual bagian 'in-flight adjustments' untuk detilnya. Perubahan yang dilakukan fungsi penyesuaian tidak disimpan secara otomatis. Ada 4 slot. Setiap switch yang digunakan untuk secara bersamaan melakukan penyesuaian menggunakan sebuah slot."
|
||||
},
|
||||
|
|
|
@ -1418,6 +1418,9 @@
|
|||
"auxiliaryAddRange": {
|
||||
"message": "Attiva"
|
||||
},
|
||||
"auxiliaryAddLink": {
|
||||
"message": "Link"
|
||||
},
|
||||
"auxiliaryButtonSave": {
|
||||
"message": "Salva"
|
||||
},
|
||||
|
@ -1427,6 +1430,12 @@
|
|||
"auxiliaryAutoChannelSelect": {
|
||||
"message": "AUTO"
|
||||
},
|
||||
"auxiliaryModeLogicOR": {
|
||||
"message": "OR"
|
||||
},
|
||||
"auxiliaryModeLogicAND": {
|
||||
"message": "AND"
|
||||
},
|
||||
"adjustmentsHelp": {
|
||||
"message": "Configurare gli interruttori di regolazione. Vedi la sezione 'aggiustamenti in volo' del manuale per i dettagli. Le modifiche apportate dalle funzioni di regolazione non vengono salvate automaticamente. Ci sono 4 slot. Ogni interruttore utilizzato per apportare modifiche simultanee richiede l'uso esclusivo di uno slot."
|
||||
},
|
||||
|
|
|
@ -1543,6 +1543,9 @@
|
|||
"auxiliaryAddRange": {
|
||||
"message": "範囲追加"
|
||||
},
|
||||
"auxiliaryAddLink": {
|
||||
"message": "結ぶ"
|
||||
},
|
||||
"auxiliaryButtonSave": {
|
||||
"message": "保存"
|
||||
},
|
||||
|
@ -1552,6 +1555,12 @@
|
|||
"auxiliaryAutoChannelSelect": {
|
||||
"message": "自動"
|
||||
},
|
||||
"auxiliaryModeLogicOR": {
|
||||
"message": "OR"
|
||||
},
|
||||
"auxiliaryModeLogicAND": {
|
||||
"message": "AND"
|
||||
},
|
||||
"adjustmentsHelp": {
|
||||
"message": "調整スイッチを構成します。詳細については、マニュアルの [In-flight Adjustment] を参照して下さい。調整の変更は自動的には保存されません。 4つのスロットがありますが、調整を同時に行うために使用される各スイッチは、スロットを排他的に使用する必要があります。"
|
||||
},
|
||||
|
|
|
@ -1543,6 +1543,9 @@
|
|||
"auxiliaryAddRange": {
|
||||
"message": "범위 추가"
|
||||
},
|
||||
"auxiliaryAddLink": {
|
||||
"message": "연접하다"
|
||||
},
|
||||
"auxiliaryButtonSave": {
|
||||
"message": "저장"
|
||||
},
|
||||
|
@ -1552,6 +1555,12 @@
|
|||
"auxiliaryAutoChannelSelect": {
|
||||
"message": "자동"
|
||||
},
|
||||
"auxiliaryModeLogicOR": {
|
||||
"message": "OR"
|
||||
},
|
||||
"auxiliaryModeLogicAND": {
|
||||
"message": "AND"
|
||||
},
|
||||
"adjustmentsHelp": {
|
||||
"message": "조정 스위치를 설정하십시오. 자세한 내용은 매뉴얼의 '비행-중 조정' 섹션을 참조하십시오. 조정 기능의 변경사항은 자동으로 저장되지 않습니다. 4개의 슬롯이 있습니다. 조정을 동시에 수행하는 데 사용되는 각 스위치는 슬롯을 독점적으로 사용해야합니다."
|
||||
},
|
||||
|
|
|
@ -1543,6 +1543,9 @@
|
|||
"auxiliaryAddRange": {
|
||||
"message": "Pievienot"
|
||||
},
|
||||
"auxiliaryAddLink": {
|
||||
"message": "Saistīt"
|
||||
},
|
||||
"auxiliaryButtonSave": {
|
||||
"message": "Saglabāt"
|
||||
},
|
||||
|
@ -1552,6 +1555,12 @@
|
|||
"auxiliaryAutoChannelSelect": {
|
||||
"message": "AUTO"
|
||||
},
|
||||
"auxiliaryModeLogicOR": {
|
||||
"message": "OR"
|
||||
},
|
||||
"auxiliaryModeLogicAND": {
|
||||
"message": "AND"
|
||||
},
|
||||
"adjustmentsHelp": {
|
||||
"message": "Konfigurēt pieregulēšanas slēdžus. Detaļas ir atrodamas manuāla sadaļā 'in-flight adjustments'. Šīs izmaiņas ko pieregulēšanas funkcija izpilda netiek automātiski saglabātas. Tur ir 4 sloti. Katrs slēdzis tiek lietots, lai vienlaikus veiktu nepieciešamās izmaiņas atbilstošam slotam."
|
||||
},
|
||||
|
|
|
@ -1468,6 +1468,9 @@
|
|||
"auxiliaryAddRange": {
|
||||
"message": "Adicionar Faixa"
|
||||
},
|
||||
"auxiliaryAddLink": {
|
||||
"message": "Vincule"
|
||||
},
|
||||
"auxiliaryButtonSave": {
|
||||
"message": "Salvar"
|
||||
},
|
||||
|
@ -1477,6 +1480,12 @@
|
|||
"auxiliaryAutoChannelSelect": {
|
||||
"message": "AUTO"
|
||||
},
|
||||
"auxiliaryModeLogicOR": {
|
||||
"message": "OR"
|
||||
},
|
||||
"auxiliaryModeLogicAND": {
|
||||
"message": "AND"
|
||||
},
|
||||
"adjustmentsHelp": {
|
||||
"message": "Configure os 'switches' de ajuste. Leia a seção do manual sobre 'in-flight adjustments' para detalhes. Os ajustes feitos por essas funções não serão salvos automaticamente. Existem 4 slots. Cada switch utilizado ao mesmo tempo para o ajuste exige o uso exclusivo de um slot."
|
||||
},
|
||||
|
|
|
@ -1543,6 +1543,9 @@
|
|||
"auxiliaryAddRange": {
|
||||
"message": "Доб. диапазон"
|
||||
},
|
||||
"auxiliaryAddLink": {
|
||||
"message": "Cвязывай"
|
||||
},
|
||||
"auxiliaryButtonSave": {
|
||||
"message": "Сохранить"
|
||||
},
|
||||
|
@ -1552,6 +1555,12 @@
|
|||
"auxiliaryAutoChannelSelect": {
|
||||
"message": "АВТО"
|
||||
},
|
||||
"auxiliaryModeLogicOR": {
|
||||
"message": "OR"
|
||||
},
|
||||
"auxiliaryModeLogicAND": {
|
||||
"message": "AND"
|
||||
},
|
||||
"adjustmentsHelp": {
|
||||
"message": "Установка нас троечных переключателей. Смотри 'in-flight adjustments' секцию руководства. Изменение этих настроек автоматически не сохраняется. Там 4 слота. Каждый переключатель используемый одновременно требует исключительного использования слота."
|
||||
},
|
||||
|
|
|
@ -1547,6 +1547,9 @@
|
|||
"auxiliaryAddRange": {
|
||||
"message": "Lägg till intervall"
|
||||
},
|
||||
"auxiliaryAddLink": {
|
||||
"message": "Länka"
|
||||
},
|
||||
"auxiliaryButtonSave": {
|
||||
"message": "Spara"
|
||||
},
|
||||
|
@ -1556,6 +1559,12 @@
|
|||
"auxiliaryAutoChannelSelect": {
|
||||
"message": "AUTO"
|
||||
},
|
||||
"auxiliaryModeLogicOR": {
|
||||
"message": "OR"
|
||||
},
|
||||
"auxiliaryModeLogicAND": {
|
||||
"message": "AND"
|
||||
},
|
||||
"adjustmentsHelp": {
|
||||
"message": "Konfigurera justerings-switchar. Se avsnittet 'In-flight adjustments' i manualen för detaljer. Ändringarna som justeringsfunktionerna utför sparas inte automatiskt. Det finns 4 platser. Varje switch som används för att göra samtidiga justeringar kräver exklusiv användning av en plats."
|
||||
},
|
||||
|
|
|
@ -1474,6 +1474,9 @@
|
|||
"auxiliaryAddRange": {
|
||||
"message": "添加范围"
|
||||
},
|
||||
"auxiliaryAddLink": {
|
||||
"message": "鏈接"
|
||||
},
|
||||
"auxiliaryButtonSave": {
|
||||
"message": "保存"
|
||||
},
|
||||
|
@ -1483,6 +1486,12 @@
|
|||
"auxiliaryAutoChannelSelect": {
|
||||
"message": "自动"
|
||||
},
|
||||
"auxiliaryModeLogicOR": {
|
||||
"message": "OR"
|
||||
},
|
||||
"auxiliaryModeLogicAND": {
|
||||
"message": "AND"
|
||||
},
|
||||
"adjustmentsHelp": {
|
||||
"message": "配置调整开关。参阅手册的 'in-flight adjustments' 章解获取具体信息。通过该功能所做的调校修改不会被自动保存。总共有4个槽位。每一个开关需要独占一个槽位。"
|
||||
},
|
||||
|
|
|
@ -56,8 +56,8 @@
|
|||
}
|
||||
|
||||
.tab-auxiliary .mode .name {
|
||||
min-height: 50px;
|
||||
padding: 13px 0px;
|
||||
min-height: 80px;
|
||||
padding: 5px 0px;
|
||||
}
|
||||
|
||||
.tab-auxiliary .mode .info {
|
||||
|
@ -77,13 +77,20 @@
|
|||
|
||||
.tab-auxiliary .mode .info .buttons {
|
||||
position: absolute;
|
||||
bottom: 14px;
|
||||
bottom: 0px;
|
||||
width: 100%;
|
||||
}
|
||||
|
||||
.tab-auxiliary .mode .info .buttons a {
|
||||
padding: 2px 5px;
|
||||
border-radius: 4px;
|
||||
cursor: pointer;
|
||||
margin: 3px;
|
||||
display: block;
|
||||
}
|
||||
|
||||
.tab-auxiliary .mode .info .buttons a:hover {
|
||||
background-color: darkgrey;
|
||||
}
|
||||
|
||||
.tab-auxiliary .ranges {
|
||||
|
@ -103,6 +110,17 @@
|
|||
padding-bottom: 5px;
|
||||
}
|
||||
|
||||
.tab-auxiliary .link {
|
||||
position: relative;
|
||||
height: 70px;
|
||||
padding-top: 15px;
|
||||
padding-left: 15px;
|
||||
border-top: 1px solid #fff;
|
||||
border-bottom: 1px solid #cccccc;
|
||||
background-color: #ececec;
|
||||
padding-bottom: 5px;
|
||||
}
|
||||
|
||||
.tab-auxiliary .range:first-child {
|
||||
border-top: 0px;
|
||||
}
|
||||
|
@ -111,6 +129,14 @@
|
|||
border-bottom: 0px;
|
||||
}
|
||||
|
||||
.tab-auxiliary .link:first-child {
|
||||
border-top: 0px;
|
||||
}
|
||||
|
||||
.tab-auxiliary .link:last-child {
|
||||
border-bottom: 0px;
|
||||
}
|
||||
|
||||
.tab-auxiliary .range>.buttons {
|
||||
position: absolute;
|
||||
top: 0px;
|
||||
|
@ -125,15 +151,18 @@
|
|||
float: left;
|
||||
min-width: 90px;
|
||||
text-align: center;
|
||||
}
|
||||
|
||||
.tab-auxiliary .mode .range .channelInfo .limits {
|
||||
padding: 10px 0px;
|
||||
margin-top: -4px;
|
||||
}
|
||||
|
||||
.tab-auxiliary .range .channel {
|
||||
border: 1px solid silver;
|
||||
border-radius: 3px;
|
||||
margin-bottom: 3px;
|
||||
}
|
||||
|
||||
.tab-auxiliary .logic {
|
||||
border: 1px solid silver;
|
||||
border-radius: 3px;
|
||||
}
|
||||
|
||||
.tab-auxiliary .range .marker {
|
||||
|
@ -152,6 +181,16 @@
|
|||
margin-top: 1px;
|
||||
}
|
||||
|
||||
.tab-auxiliary .mode .link .modeInfo {
|
||||
float: left;
|
||||
}
|
||||
|
||||
.tab-auxiliary .link .linkedTo {
|
||||
border: 1px solid silver;
|
||||
border-radius: 3px;
|
||||
margin-bottom: 3px;
|
||||
}
|
||||
|
||||
.tab-auxiliary>.buttons {
|
||||
margin-top: 10px;
|
||||
}
|
||||
|
|
|
@ -123,6 +123,9 @@ function configuration_backup(callback) {
|
|||
uniqueData.push(MSPCodes.MSP_COMPASS_CONFIG);
|
||||
uniqueData.push(MSPCodes.MSP_FEATURE_CONFIG);
|
||||
}
|
||||
if (semver.gte(CONFIG.apiVersion, "1.41.0")) {
|
||||
uniqueData.push(MSPCodes.MSP_MODE_RANGES_EXTRA);
|
||||
}
|
||||
}
|
||||
|
||||
update_unique_data_list();
|
||||
|
@ -174,6 +177,9 @@ function configuration_backup(callback) {
|
|||
if (semver.gte(CONFIG.apiVersion, "1.36.0")) {
|
||||
configuration.BEEPER_CONFIG = jQuery.extend(true, {}, BEEPER_CONFIG);
|
||||
}
|
||||
if (semver.gte(CONFIG.apiVersion, "1.41.0")) {
|
||||
configuration.MODE_RANGES_EXTRA = jQuery.extend(true, [], MODE_RANGES_EXTRA);
|
||||
}
|
||||
|
||||
save();
|
||||
}
|
||||
|
@ -765,6 +771,23 @@ function configuration_restore(callback) {
|
|||
}
|
||||
|
||||
function upload_mode_ranges() {
|
||||
if (semver.gte(CONFIG.apiVersion, "1.41.0")) {
|
||||
if (configuration.MODE_RANGES_EXTRA == undefined) {
|
||||
MODE_RANGES_EXTRA = [];
|
||||
|
||||
for (var modeIndex = 0; modeIndex < MODE_RANGES.length; modeIndex++) {
|
||||
var defaultModeRangeExtra = {
|
||||
modeId: MODE_RANGES[modeIndex].modeId,
|
||||
modeLogic: 0,
|
||||
linkedTo: 0
|
||||
};
|
||||
MODE_RANGES_EXTRA.push(defaultModeRangeExtra);
|
||||
}
|
||||
} else {
|
||||
MODE_RANGES_EXTRA = configuration.MODE_RANGES_EXTRA;
|
||||
}
|
||||
}
|
||||
|
||||
mspHelper.sendModeRanges(upload_adjustment_ranges);
|
||||
}
|
||||
|
||||
|
|
|
@ -19,6 +19,7 @@ var RC_tuning;
|
|||
var AUX_CONFIG;
|
||||
var AUX_CONFIG_IDS;
|
||||
var MODE_RANGES;
|
||||
var MODE_RANGES_EXTRA;
|
||||
var ADJUSTMENT_RANGES;
|
||||
var SERVO_CONFIG;
|
||||
var SERVO_RULES;
|
||||
|
@ -174,6 +175,7 @@ var FC = {
|
|||
AUX_CONFIG_IDS = [];
|
||||
|
||||
MODE_RANGES = [];
|
||||
MODE_RANGES_EXTRA = [];
|
||||
ADJUSTMENT_RANGES = [];
|
||||
|
||||
SERVO_CONFIG = [];
|
||||
|
|
|
@ -148,6 +148,7 @@ var MSPCodes = {
|
|||
MSP_SET_COMPASS_CONFIG: 224,
|
||||
MSP_SET_GPS_RESCUE: 225,
|
||||
|
||||
MSP_MODE_RANGES_EXTRA: 238,
|
||||
MSP_SET_ACC_TRIM: 239,
|
||||
MSP_ACC_TRIM: 240,
|
||||
MSP_SERVO_MIX_RULES: 241,
|
||||
|
|
|
@ -825,6 +825,21 @@ MspHelper.prototype.process_data = function(dataHandler) {
|
|||
}
|
||||
break;
|
||||
|
||||
case MSPCodes.MSP_MODE_RANGES_EXTRA:
|
||||
MODE_RANGES_EXTRA = []; // empty the array as new data is coming in
|
||||
|
||||
var modeRangeExtraCount = data.readU8();
|
||||
|
||||
for (var i = 0; i < modeRangeExtraCount; i++) {
|
||||
var modeRangeExtra = {
|
||||
id: data.readU8(),
|
||||
modeLogic: data.readU8(),
|
||||
linkedTo: data.readU8()
|
||||
};
|
||||
MODE_RANGES_EXTRA.push(modeRangeExtra);
|
||||
}
|
||||
break;
|
||||
|
||||
case MSPCodes.MSP_ADJUSTMENT_RANGES:
|
||||
ADJUSTMENT_RANGES = []; // empty the array as new data is coming in
|
||||
|
||||
|
@ -1975,11 +1990,17 @@ MspHelper.prototype.sendModeRanges = function(onCompleteCallback) {
|
|||
.push8((modeRange.range.start - 900) / 25)
|
||||
.push8((modeRange.range.end - 900) / 25);
|
||||
|
||||
if (semver.gte(CONFIG.apiVersion, "1.41.0")) {
|
||||
var modeRangeExtra = MODE_RANGES_EXTRA[modeRangeIndex];
|
||||
|
||||
buffer.push8(modeRangeExtra.modeLogic)
|
||||
.push8(modeRangeExtra.linkedTo);
|
||||
}
|
||||
|
||||
// prepare for next iteration
|
||||
modeRangeIndex++;
|
||||
if (modeRangeIndex == MODE_RANGES.length) {
|
||||
nextFunction = onCompleteCallback;
|
||||
|
||||
}
|
||||
MSP.send_message(MSPCodes.MSP_SET_MODE_RANGE, buffer, false, nextFunction);
|
||||
}
|
||||
|
|
|
@ -8,7 +8,12 @@ TABS.auxiliary.initialize = function (callback) {
|
|||
var prevChannelsValues = null;
|
||||
|
||||
function get_mode_ranges() {
|
||||
MSP.send_message(MSPCodes.MSP_MODE_RANGES, false, false, get_box_ids);
|
||||
MSP.send_message(MSPCodes.MSP_MODE_RANGES, false, false,
|
||||
semver.gte(CONFIG.apiVersion, "1.41.0") ? get_mode_ranges_extra : get_box_ids);
|
||||
}
|
||||
|
||||
function get_mode_ranges_extra() {
|
||||
MSP.send_message(MSPCodes.MSP_MODE_RANGES_EXTRA, false, false, get_box_ids);
|
||||
}
|
||||
|
||||
function get_box_ids() {
|
||||
|
@ -45,10 +50,36 @@ TABS.auxiliary.initialize = function (callback) {
|
|||
|
||||
$(newMode).find('.name').data('modeElement', newMode);
|
||||
$(newMode).find('a.addRange').data('modeElement', newMode);
|
||||
$(newMode).find('a.addLink').data('modeElement', newMode);
|
||||
|
||||
// hide link button for ARM
|
||||
if (modeId == 0 || semver.lt(CONFIG.apiVersion, "1.41.0")) {
|
||||
$(newMode).find('.addLink').hide();
|
||||
}
|
||||
|
||||
return newMode;
|
||||
}
|
||||
|
||||
function configureLogicList(template) {
|
||||
var logicList = $(template).find('.logic');
|
||||
var logicOptionTemplate = $(logicList).find('option');
|
||||
logicOptionTemplate.remove();
|
||||
|
||||
//add logic option(s)
|
||||
var logicOption = logicOptionTemplate.clone();
|
||||
logicOption.text(i18n.getMessage('auxiliaryModeLogicOR'));
|
||||
logicOption.val(0);
|
||||
logicList.append(logicOption);
|
||||
|
||||
if(semver.gte(CONFIG.apiVersion, "1.41.0")){
|
||||
var logicOption = logicOptionTemplate.clone();
|
||||
logicOption.text(i18n.getMessage('auxiliaryModeLogicAND'));
|
||||
logicOption.val(1);
|
||||
logicList.append(logicOption);
|
||||
}
|
||||
logicOptionTemplate.val(0);
|
||||
}
|
||||
|
||||
function configureRangeTemplate(auxChannelCount) {
|
||||
var rangeTemplate = $('#tab-auxiliary-templates .range');
|
||||
|
||||
|
@ -70,10 +101,38 @@ TABS.auxiliary.initialize = function (callback) {
|
|||
}
|
||||
|
||||
channelOptionTemplate.val(-1);
|
||||
|
||||
configureLogicList(rangeTemplate);
|
||||
}
|
||||
|
||||
function addRangeToMode(modeElement, auxChannelIndex, range) {
|
||||
function configureLinkTemplate() {
|
||||
var linkTemplate = $('#tab-auxiliary-templates .link');
|
||||
|
||||
var linkList = $(linkTemplate).find('.linkedTo');
|
||||
var linkOptionTemplate = $(linkList).find('option');
|
||||
linkOptionTemplate.remove();
|
||||
|
||||
// set up a blank option in place of ARM
|
||||
var linkOption = linkOptionTemplate.clone();
|
||||
linkOption.text("");
|
||||
linkOption.val(0);
|
||||
linkList.append(linkOption);
|
||||
|
||||
for (var index = 1; index < AUX_CONFIG.length; index++) {
|
||||
var linkOption = linkOptionTemplate.clone();
|
||||
linkOption.text(AUX_CONFIG[index]);
|
||||
linkOption.val(AUX_CONFIG_IDS[index]); // set value to mode id
|
||||
linkList.append(linkOption);
|
||||
}
|
||||
|
||||
linkOptionTemplate.val(0);
|
||||
|
||||
configureLogicList(linkTemplate);
|
||||
}
|
||||
|
||||
function addRangeToMode(modeElement, auxChannelIndex, modeLogic, range) {
|
||||
var modeIndex = $(modeElement).data('index');
|
||||
var modeRanges = $(modeElement).find('.ranges');
|
||||
|
||||
var channel_range = {
|
||||
'min': [ 900 ],
|
||||
|
@ -85,11 +144,17 @@ TABS.auxiliary.initialize = function (callback) {
|
|||
rangeValues = [range.start, range.end];
|
||||
}
|
||||
|
||||
var rangeIndex = $(modeElement).find('.range').length;
|
||||
var rangeIndex = modeRanges.children().length;
|
||||
|
||||
var rangeElement = $('#tab-auxiliary-templates .range').clone();
|
||||
rangeElement.attr('id', 'mode-' + modeIndex + '-range-' + rangeIndex);
|
||||
modeElement.find('.ranges').append(rangeElement);
|
||||
modeRanges.append(rangeElement);
|
||||
|
||||
if (rangeIndex == 0) {
|
||||
$(rangeElement).find('.logic').hide();
|
||||
} else if (rangeIndex == 1) {
|
||||
modeRanges.children().eq(0).find('.logic').show();
|
||||
}
|
||||
|
||||
$(rangeElement).find('.channel-slider').noUiSlider({
|
||||
start: rangeValues,
|
||||
|
@ -115,19 +180,71 @@ TABS.auxiliary.initialize = function (callback) {
|
|||
});
|
||||
|
||||
$(rangeElement).find('.deleteRange').data('rangeElement', rangeElement);
|
||||
$(rangeElement).find('.deleteRange').data('modeElement', modeElement);
|
||||
|
||||
$(rangeElement).find('a.deleteRange').click(function () {
|
||||
var modeElement = $(this).data('modeElement');
|
||||
var rangeElement = $(this).data('rangeElement');
|
||||
|
||||
rangeElement.remove();
|
||||
|
||||
var siblings = $(modeElement).find('.ranges').children();
|
||||
|
||||
if (siblings.length == 1) {
|
||||
siblings.eq(0).find('.logic').hide();
|
||||
}
|
||||
});
|
||||
|
||||
$(rangeElement).find('.channel').val(auxChannelIndex);
|
||||
$(rangeElement).find('.logic').val(modeLogic);
|
||||
}
|
||||
|
||||
function addLinkedToMode(modeElement, modeLogic, linkedTo) {
|
||||
var modeId = $(modeElement).data('id');
|
||||
var modeIndex = $(modeElement).data('index');
|
||||
var modeRanges = $(modeElement).find('.ranges');
|
||||
|
||||
var linkIndex = modeRanges.children().length;
|
||||
|
||||
var linkElement = $('#tab-auxiliary-templates .link').clone();
|
||||
linkElement.attr('id', 'mode-' + modeIndex + '-link-' + linkIndex);
|
||||
modeRanges.append(linkElement);
|
||||
|
||||
if (linkIndex == 0) {
|
||||
$(linkElement).find('.logic').hide();
|
||||
} else if (linkIndex == 1) {
|
||||
modeRanges.children().eq(0).find('.logic').show();
|
||||
}
|
||||
|
||||
// disable the option associated with this mode
|
||||
var linkSelect = $(linkElement).find('.linkedTo');
|
||||
$(linkSelect).find('option[value="' + modeId + '"]').prop('disabled',true);
|
||||
|
||||
$(linkElement).find('.deleteLink').data('linkElement', linkElement);
|
||||
$(linkElement).find('.deleteLink').data('modeElement', modeElement);
|
||||
|
||||
$(linkElement).find('a.deleteLink').click(function () {
|
||||
var modeElement = $(this).data('modeElement');
|
||||
var linkElement = $(this).data('linkElement');
|
||||
|
||||
linkElement.remove();
|
||||
|
||||
var siblings = $(modeElement).find('.ranges').children();
|
||||
|
||||
if (siblings.length == 1) {
|
||||
siblings.eq(0).find('.logic').hide();
|
||||
}
|
||||
});
|
||||
|
||||
$(linkElement).find('.linkedTo').val(linkedTo);
|
||||
$(linkElement).find('.logic').val(modeLogic);
|
||||
}
|
||||
|
||||
function process_html() {
|
||||
var auxChannelCount = RC.active_channels - 4;
|
||||
|
||||
configureRangeTemplate(auxChannelCount);
|
||||
configureLinkTemplate();
|
||||
|
||||
var modeTableBodyElement = $('.tab-auxiliary .modes tbody')
|
||||
for (var modeIndex = 0; modeIndex < AUX_CONFIG.length; modeIndex++) {
|
||||
|
@ -136,28 +253,48 @@ TABS.auxiliary.initialize = function (callback) {
|
|||
var newMode = createMode(modeIndex, modeId);
|
||||
modeTableBodyElement.append(newMode);
|
||||
|
||||
// generate ranges from the supplied AUX names and MODE_RANGE data
|
||||
// generate ranges from the supplied AUX names and MODE_RANGES[_EXTRA] data
|
||||
// skip linked modes for now
|
||||
for (var modeRangeIndex = 0; modeRangeIndex < MODE_RANGES.length; modeRangeIndex++) {
|
||||
var modeRange = MODE_RANGES[modeRangeIndex];
|
||||
|
||||
if (modeRange.id != modeId) {
|
||||
var modeRangeExtra = {
|
||||
id: modeRange.id,
|
||||
modeLogic: 0,
|
||||
linkedTo: 0
|
||||
};
|
||||
if (semver.gte(CONFIG.apiVersion, "1.41.0")) {
|
||||
modeRangeExtra = MODE_RANGES_EXTRA[modeRangeIndex];
|
||||
}
|
||||
|
||||
if (modeRange.id != modeId || modeRangeExtra.id != modeId) {
|
||||
continue;
|
||||
}
|
||||
|
||||
var range = modeRange.range;
|
||||
if (!(range.start < range.end)) {
|
||||
continue; // invalid!
|
||||
if (modeId == 0 || modeRangeExtra.linkedTo == 0) {
|
||||
var range = modeRange.range;
|
||||
if (!(range.start < range.end)) {
|
||||
continue; // invalid!
|
||||
}
|
||||
|
||||
addRangeToMode(newMode, modeRange.auxChannelIndex, modeRangeExtra.modeLogic, range)
|
||||
|
||||
} else {
|
||||
addLinkedToMode(newMode, modeRangeExtra.modeLogic, modeRangeExtra.linkedTo);
|
||||
}
|
||||
|
||||
addRangeToMode(newMode, modeRange.auxChannelIndex, range)
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
$('a.addRange').click(function () {
|
||||
var modeElement = $(this).data('modeElement');
|
||||
//auto select AUTO option
|
||||
addRangeToMode(modeElement, -1);
|
||||
// auto select AUTO option; default to 'OR' logic
|
||||
addRangeToMode(modeElement, -1, 0);
|
||||
});
|
||||
|
||||
$('a.addLink').click(function () {
|
||||
var modeElement = $(this).data('modeElement');
|
||||
// default to 'OR' logic and no link selected
|
||||
addLinkedToMode(modeElement, 0, 0);
|
||||
});
|
||||
|
||||
// translate to user-selected language
|
||||
|
@ -172,13 +309,13 @@ TABS.auxiliary.initialize = function (callback) {
|
|||
var requiredModesRangeCount = MODE_RANGES.length;
|
||||
|
||||
MODE_RANGES = [];
|
||||
MODE_RANGES_EXTRA = [];
|
||||
|
||||
$('.tab-auxiliary .modes .mode').each(function () {
|
||||
var modeElement = $(this);
|
||||
var modeId = modeElement.data('id');
|
||||
|
||||
$(modeElement).find('.range').each(function() {
|
||||
|
||||
var rangeValues = $(this).find('.channel-slider').val();
|
||||
var modeRange = {
|
||||
id: modeId,
|
||||
|
@ -189,6 +326,38 @@ TABS.auxiliary.initialize = function (callback) {
|
|||
}
|
||||
};
|
||||
MODE_RANGES.push(modeRange);
|
||||
|
||||
var modeRangeExtra = {
|
||||
id: modeId,
|
||||
modeLogic: parseInt($(this).find('.logic').val()),
|
||||
linkedTo: 0
|
||||
};
|
||||
MODE_RANGES_EXTRA.push(modeRangeExtra);
|
||||
});
|
||||
|
||||
$(modeElement).find('.link').each(function() {
|
||||
var linkedToSelection = parseInt($(this).find('.linkedTo').val());
|
||||
|
||||
if (linkedToSelection == 0) {
|
||||
$(this).remove();
|
||||
} else {
|
||||
var modeRange = {
|
||||
id: modeId,
|
||||
auxChannelIndex: 0,
|
||||
range: {
|
||||
start: 900,
|
||||
end: 900
|
||||
}
|
||||
};
|
||||
MODE_RANGES.push(modeRange);
|
||||
|
||||
var modeRangeExtra = {
|
||||
id: modeId,
|
||||
modeLogic: parseInt($(this).find('.logic').val()),
|
||||
linkedTo: linkedToSelection
|
||||
};
|
||||
MODE_RANGES_EXTRA.push(modeRangeExtra);
|
||||
}
|
||||
});
|
||||
});
|
||||
|
||||
|
@ -202,6 +371,13 @@ TABS.auxiliary.initialize = function (callback) {
|
|||
}
|
||||
};
|
||||
MODE_RANGES.push(defaultModeRange);
|
||||
|
||||
var defaultModeRangeExtra = {
|
||||
id: 0,
|
||||
modeLogic: 0,
|
||||
linkedTo: 0
|
||||
};
|
||||
MODE_RANGES_EXTRA.push(defaultModeRangeExtra);
|
||||
}
|
||||
|
||||
//
|
||||
|
@ -247,7 +423,7 @@ TABS.auxiliary.initialize = function (callback) {
|
|||
let hasUsedMode = false;
|
||||
for (let i = 0; i < AUX_CONFIG.length; i++) {
|
||||
let modeElement = $('#mode-' + i);
|
||||
if (modeElement.find(' .range').length == 0) {
|
||||
if (modeElement.find(' .range').length == 0 && modeElement.find(' .link').length == 0) {
|
||||
// if the mode is unused, skip it
|
||||
modeElement.removeClass('off').removeClass('on');
|
||||
continue;
|
||||
|
@ -264,7 +440,7 @@ TABS.auxiliary.initialize = function (callback) {
|
|||
let hideUnused = hideUnusedModes && hasUsedMode;
|
||||
for (let i = 0; i < AUX_CONFIG.length; i++) {
|
||||
let modeElement = $('#mode-' + i);
|
||||
if (modeElement.find(' .range').length == 0) {
|
||||
if (modeElement.find(' .range').length == 0 && modeElement.find(' .link').length == 0) {
|
||||
modeElement.toggle(!hideUnused);
|
||||
}
|
||||
}
|
||||
|
|
|
@ -35,6 +35,7 @@
|
|||
<td class="info">
|
||||
<p class="name"></p>
|
||||
<div class="buttons">
|
||||
<a class="addLink" href="#" i18n="auxiliaryAddLink"></a>
|
||||
<a class="addRange" href="#" i18n="auxiliaryAddRange"></a>
|
||||
</div>
|
||||
</td>
|
||||
|
@ -44,9 +45,16 @@
|
|||
</table>
|
||||
<div class="range">
|
||||
<div class="channelInfo">
|
||||
<select class="channel">
|
||||
<option value=""></option>
|
||||
</select>
|
||||
<div class="channelName">
|
||||
<select class="channel">
|
||||
<option value=""></option>
|
||||
</select>
|
||||
</div>
|
||||
<div class="rangeLogic">
|
||||
<select class="logic">
|
||||
<option value=""></option>
|
||||
</select>
|
||||
</div>
|
||||
<div class="limits">
|
||||
<p class="lowerLimit">
|
||||
<span i18n="auxiliaryMin"></span>: <span class="lowerLimitValue"></span>
|
||||
|
@ -63,4 +71,21 @@
|
|||
<a class="deleteRange" href="#"> </a>
|
||||
</div>
|
||||
</div>
|
||||
<div class="link">
|
||||
<div class=modeInfo>
|
||||
<div class="modeLink">
|
||||
<select class="linkedTo">
|
||||
<option value=""></option>
|
||||
</select>
|
||||
</div>
|
||||
<div class="linkLogic">
|
||||
<select class="logic">
|
||||
<option value=""></option>
|
||||
</select>
|
||||
</div>
|
||||
</div>
|
||||
<div class="delete">
|
||||
<a class="deleteLink" href="#"> </a>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue