diff --git a/locales/ca/messages.json b/locales/ca/messages.json index 47287d2c..aab26344 100644 --- a/locales/ca/messages.json +++ b/locales/ca/messages.json @@ -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." }, diff --git a/locales/de/messages.json b/locales/de/messages.json index c95bbf29..671371c9 100644 --- a/locales/de/messages.json +++ b/locales/de/messages.json @@ -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." }, diff --git a/locales/en/messages.json b/locales/en/messages.json index 41243e72..96060cfb 100644 --- a/locales/en/messages.json +++ b/locales/en/messages.json @@ -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 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. Use a link to activate a mode when another mode is activated. Exceptions: 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 AND or OR. A mode will be activated when:
- ALL AND ranges/links are active; OR
- at least one OR range/link is active.

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." }, diff --git a/locales/es/messages.json b/locales/es/messages.json index d1e734fb..a5bc5e8d 100644 --- a/locales/es/messages.json +++ b/locales/es/messages.json @@ -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." }, diff --git a/locales/fr/messages.json b/locales/fr/messages.json index 763e6ce3..b21e8436 100644 --- a/locales/fr/messages.json +++ b/locales/fr/messages.json @@ -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." }, diff --git a/locales/id/messages.json b/locales/id/messages.json index 71847526..1b4a4eb7 100644 --- a/locales/id/messages.json +++ b/locales/id/messages.json @@ -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." }, diff --git a/locales/it/messages.json b/locales/it/messages.json index f5f02352..e8c59a63 100644 --- a/locales/it/messages.json +++ b/locales/it/messages.json @@ -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." }, diff --git a/locales/ja/messages.json b/locales/ja/messages.json index a24b37ca..96061c51 100644 --- a/locales/ja/messages.json +++ b/locales/ja/messages.json @@ -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つのスロットがありますが、調整を同時に行うために使用される各スイッチは、スロットを排他的に使用する必要があります。" }, diff --git a/locales/ko/messages.json b/locales/ko/messages.json index 513ccf70..a955a9e6 100644 --- a/locales/ko/messages.json +++ b/locales/ko/messages.json @@ -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개의 슬롯이 있습니다. 조정을 동시에 수행하는 데 사용되는 각 스위치는 슬롯을 독점적으로 사용해야합니다." }, diff --git a/locales/lv/messages.json b/locales/lv/messages.json index 6b422297..57a0af89 100644 --- a/locales/lv/messages.json +++ b/locales/lv/messages.json @@ -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." }, diff --git a/locales/pt/messages.json b/locales/pt/messages.json index e3d69c82..0f95d072 100644 --- a/locales/pt/messages.json +++ b/locales/pt/messages.json @@ -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." }, diff --git a/locales/ru/messages.json b/locales/ru/messages.json index e0e84974..ff1c6fac 100644 --- a/locales/ru/messages.json +++ b/locales/ru/messages.json @@ -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 слота. Каждый переключатель используемый одновременно требует исключительного использования слота." }, diff --git a/locales/sv/messages.json b/locales/sv/messages.json index c76f3892..713cb282 100644 --- a/locales/sv/messages.json +++ b/locales/sv/messages.json @@ -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." }, diff --git a/locales/zh_CN/messages.json b/locales/zh_CN/messages.json index dd5b12ab..961278ec 100644 --- a/locales/zh_CN/messages.json +++ b/locales/zh_CN/messages.json @@ -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个槽位。每一个开关需要独占一个槽位。" }, diff --git a/src/css/tabs/auxiliary.css b/src/css/tabs/auxiliary.css index d95dfa74..7cb29efd 100644 --- a/src/css/tabs/auxiliary.css +++ b/src/css/tabs/auxiliary.css @@ -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; } diff --git a/src/js/backup_restore.js b/src/js/backup_restore.js index 559c03ee..8c0518ea 100644 --- a/src/js/backup_restore.js +++ b/src/js/backup_restore.js @@ -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(); } @@ -680,7 +686,7 @@ function configuration_restore(callback) { GUI.log(i18n.getMessage('configMigratedTo', [migratedVersion])); appliedMigrationsCount++; } - + if (appliedMigrationsCount > 0) { GUI.log(i18n.getMessage('configMigrationSuccessful', [appliedMigrationsCount])); } @@ -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); } diff --git a/src/js/fc.js b/src/js/fc.js index c26f322d..265ee2e1 100644 --- a/src/js/fc.js +++ b/src/js/fc.js @@ -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 = []; diff --git a/src/js/msp/MSPCodes.js b/src/js/msp/MSPCodes.js index 99d43def..4152a171 100644 --- a/src/js/msp/MSPCodes.js +++ b/src/js/msp/MSPCodes.js @@ -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, diff --git a/src/js/msp/MSPHelper.js b/src/js/msp/MSPHelper.js index e66f2fd8..94550529 100644 --- a/src/js/msp/MSPHelper.js +++ b/src/js/msp/MSPHelper.js @@ -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); } diff --git a/src/js/tabs/auxiliary.js b/src/js/tabs/auxiliary.js index c5dbeed5..dbc8e4e7 100644 --- a/src/js/tabs/auxiliary.js +++ b/src/js/tabs/auxiliary.js @@ -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,9 +50,35 @@ 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]; + + 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) { + if (modeRange.id != modeId || modeRangeExtra.id != modeId) { continue; } - - var range = modeRange.range; - if (!(range.start < range.end)) { - continue; // invalid! - } - - addRangeToMode(newMode, modeRange.auxChannelIndex, range) - } + 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); + } + } } $('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); } } diff --git a/src/tabs/auxiliary.html b/src/tabs/auxiliary.html index a4f0ca51..ca9dfeb0 100644 --- a/src/tabs/auxiliary.html +++ b/src/tabs/auxiliary.html @@ -35,6 +35,7 @@

+
@@ -44,9 +45,16 @@
- +
+ +
+
+ +

: @@ -63,4 +71,21 @@  

+