From 5b8e38c216b7993ff15ca686720b2f13a5f272c5 Mon Sep 17 00:00:00 2001 From: Dave Huber Date: Thu, 7 Feb 2019 11:22:59 -0600 Subject: [PATCH 01/12] Add MSP_MODE_RANGES_EXTRA Add MSP_MODE_RANGES_EXTRA to msp codes. Add MODE_RANGES_EXTRA function call. Add modeRangeExtra when reading mode settings. Add UI for modeLogic. Position and populate Logic selector. Some fixes for msp apiVersion checking. Add 'save' modeLogic. Add link button and translations. Add code to show/hide Link button. Adjust position of link and range buttons. Add structure code for Link button. Add linkedTo code. Add link div with delete button to html and css. Add code to hide/show buttons when link is pressed. Add code to add link select to range area. Add save code for linked modes. Add formatting to link. Don't allow linking to/from ARM or self. Remove unnecessary styling. Update reading MODE_RANGES_EXTRA array length. Set defaults for '_EXTRA' to aux tab. --- locales/ca/messages.json | 9 ++ locales/de/messages.json | 9 ++ locales/en/messages.json | 9 ++ locales/es/messages.json | 9 ++ locales/fr/messages.json | 9 ++ locales/id/messages.json | 9 ++ locales/it/messages.json | 9 ++ locales/ja/messages.json | 9 ++ locales/ko/messages.json | 9 ++ locales/lv/messages.json | 9 ++ locales/pt/messages.json | 9 ++ locales/ru/messages.json | 9 ++ locales/sv/messages.json | 9 ++ locales/zh_CN/messages.json | 9 ++ src/css/tabs/auxiliary.css | 40 ++++++-- src/js/fc.js | 2 + src/js/msp/MSPCodes.js | 1 + src/js/msp/MSPHelper.js | 21 +++- src/js/tabs/auxiliary.js | 190 ++++++++++++++++++++++++++++++++---- src/tabs/auxiliary.html | 24 ++++- 20 files changed, 376 insertions(+), 28 deletions(-) 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 57debdfa..0ef8880e 100644 --- a/locales/en/messages.json +++ b/locales/en/messages.json @@ -1728,6 +1728,9 @@ "auxiliaryAddRange": { "message": "Add Range" }, + "auxiliaryAddLink": { + "message": "Link" + }, "auxiliaryButtonSave": { "message": "Save" }, @@ -1737,6 +1740,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..151a690b 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: 0px; + border-bottom: 0px; + background-color: #ececec; + padding-bottom: 5px; +} + .tab-auxiliary .range:first-child { border-top: 0px; } @@ -127,11 +145,12 @@ text-align: center; } -.tab-auxiliary .mode .range .channelInfo .limits { - padding: 10px 0px; +.tab-auxiliary .range .channel { + border: 1px solid silver; + border-radius: 3px; } -.tab-auxiliary .range .channel { +.tab-auxiliary .range .logic { border: 1px solid silver; border-radius: 3px; } @@ -152,6 +171,15 @@ margin-top: 1px; } +.tab-auxiliary .mode .link .channelLink { + float: left; +} + +.tab-auxiliary .link .linkedTo { + border: 1px solid silver; + border-radius: 3px; +} + .tab-auxiliary>.buttons { margin-top: 10px; } diff --git a/src/js/fc.js b/src/js/fc.js index 41599b62..67ca4fed 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; @@ -166,6 +167,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 b90b5470..cbc50510 100644 --- a/src/js/msp/MSPHelper.js +++ b/src/js/msp/MSPHelper.js @@ -787,6 +787,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 @@ -1913,19 +1928,21 @@ MspHelper.prototype.sendModeRanges = function(onCompleteCallback) { function send_next_mode_range() { var modeRange = MODE_RANGES[modeRangeIndex]; + var modeRangeExtra = MODE_RANGES_EXTRA[modeRangeIndex]; var buffer = []; buffer.push8(modeRangeIndex) .push8(modeRange.id) .push8(modeRange.auxChannelIndex) .push8((modeRange.range.start - 900) / 25) - .push8((modeRange.range.end - 900) / 25); + .push8((modeRange.range.end - 900) / 25) + .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..6584ba7e 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,6 +50,12 @@ 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) { + $(newMode).find('.addLink').hide(); + } return newMode; } @@ -70,9 +81,50 @@ TABS.auxiliary.initialize = function (callback) { } channelOptionTemplate.val(-1); + + var logicList = $(rangeTemplate).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 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); + } + + function addRangeToMode(modeElement, auxChannelIndex, modeLogic, range) { var modeIndex = $(modeElement).data('index'); var channel_range = { @@ -86,6 +138,10 @@ TABS.auxiliary.initialize = function (callback) { } var rangeIndex = $(modeElement).find('.range').length; + + if (rangeIndex == 0) { + $(modeElement).find('.addLink').hide(); + } var rangeElement = $('#tab-auxiliary-templates .range').clone(); rangeElement.attr('id', 'mode-' + modeIndex + '-range-' + rangeIndex); @@ -115,19 +171,67 @@ TABS.auxiliary.initialize = function (callback) { }); $(rangeElement).find('.deleteRange').data('rangeElement', rangeElement); + $(rangeElement).find('.deleteRange').data('modeElement', modeElement); $(rangeElement).find('a.deleteRange').click(function () { var rangeElement = $(this).data('rangeElement'); + var numSiblings = $(rangeElement).parent().children().length - 1; + + if (numSiblings == 0) { + var modeElement = $(this).data('modeElement'); + var modeId = $(modeElement).data('id'); + if (modeId != 0){ // don't show Link for ARM + $(modeElement).find('.addLink').show(); + } + } + rangeElement.remove(); }); $(rangeElement).find('.channel').val(auxChannelIndex); + $(rangeElement).find('.logic').val(modeLogic); + } + + function addLinkedToMode(modeElement, linkedTo) { + var modeId = $(modeElement).data('id'); + var modeIndex = $(modeElement).data('index'); + + $(modeElement).find('.addRange').hide(); + $(modeElement).find('.addLink').hide(); + + var linkElement = $('#tab-auxiliary-templates .link').clone(); + linkElement.attr('id', 'mode-' + modeIndex + '-link'); + modeElement.find('.ranges').append(linkElement); + + // 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 linkElement = $(this).data('linkElement'); + var modeElement = $(this).data('modeElement'); + + $(modeElement).find('.addRange').show(); + + var modeId = $(modeElement).data('id'); + if (modeId != 0){ // don't show Link for ARM + $(modeElement).find('.addLink').show(); + } + + linkElement.remove(); + }); + + $(linkElement).find('.linkedTo').val(linkedTo); } 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 +240,47 @@ 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(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.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'); + addLinkedToMode(modeElement, 0); }); // translate to user-selected language @@ -172,13 +295,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 +312,32 @@ 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 modeRange = { + id: modeId, + auxChannelIndex: 0, + range: { + start: 900, + end: 900 + } + }; + MODE_RANGES.push(modeRange); + + var modeRangeExtra = { + id: modeId, + modeLogic: 0, + linkedTo: parseInt($(this).find('.linkedTo').val()) + }; + MODE_RANGES_EXTRA.push(modeRangeExtra); }); }); @@ -202,6 +351,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 +403,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 +420,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..f459601d 100644 --- a/src/tabs/auxiliary.html +++ b/src/tabs/auxiliary.html @@ -35,6 +35,7 @@

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

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

+
From 75351722adc995e6ef0fb328bc857efee81b9f25 Mon Sep 17 00:00:00 2001 From: Dave Huber Date: Fri, 8 Feb 2019 00:06:18 -0600 Subject: [PATCH 02/12] Don't save link if nothing selected Initially hide logic list in range template Add show/hide for logic list --- src/css/tabs/auxiliary.css | 2 ++ src/js/tabs/auxiliary.js | 60 +++++++++++++++++++++++++------------- 2 files changed, 42 insertions(+), 20 deletions(-) diff --git a/src/css/tabs/auxiliary.css b/src/css/tabs/auxiliary.css index 151a690b..a608a98b 100644 --- a/src/css/tabs/auxiliary.css +++ b/src/css/tabs/auxiliary.css @@ -143,11 +143,13 @@ float: left; min-width: 90px; text-align: center; + margin-top: -4px; } .tab-auxiliary .range .channel { border: 1px solid silver; border-radius: 3px; + margin-bottom: 3px; } .tab-auxiliary .range .logic { diff --git a/src/js/tabs/auxiliary.js b/src/js/tabs/auxiliary.js index 6584ba7e..626fff7b 100644 --- a/src/js/tabs/auxiliary.js +++ b/src/js/tabs/auxiliary.js @@ -99,6 +99,8 @@ TABS.auxiliary.initialize = function (callback) { logicList.append(logicOption); } logicOptionTemplate.val(0); + + logicList.hide(); } function configureLinkTemplate() { @@ -138,14 +140,17 @@ TABS.auxiliary.initialize = function (callback) { } var rangeIndex = $(modeElement).find('.range').length; - - if (rangeIndex == 0) { - $(modeElement).find('.addLink').hide(); - } var rangeElement = $('#tab-auxiliary-templates .range').clone(); rangeElement.attr('id', 'mode-' + modeIndex + '-range-' + rangeIndex); modeElement.find('.ranges').append(rangeElement); + + if (rangeIndex == 0) { + $(modeElement).find('.addLink').hide(); + } else { + var prevRangeElement = $(modeElement).find('.ranges').children().eq(rangeIndex - 1); + $(prevRangeElement).find('.logic').show(); + } $(rangeElement).find('.channel-slider').noUiSlider({ start: rangeValues, @@ -183,6 +188,9 @@ TABS.auxiliary.initialize = function (callback) { if (modeId != 0){ // don't show Link for ARM $(modeElement).find('.addLink').show(); } + } else { + var lastRangeElement = $(modeElement).find('.ranges').children().eq(numSiblings - 1); + $(lastRangeElement).find('.logic').hide(); } rangeElement.remove(); @@ -250,7 +258,7 @@ TABS.auxiliary.initialize = function (callback) { modeLogic: 0, linkedTo: 0 }; - if (semver.gte(apiVersion, "1.41.0")) { + if (semver.gte(CONFIG.apiVersion, "1.41.0")) { modeRangeExtra = MODE_RANGES_EXTRA[modeRangeIndex]; } @@ -322,22 +330,34 @@ TABS.auxiliary.initialize = function (callback) { }); $(modeElement).find('.link').each(function() { - var modeRange = { - id: modeId, - auxChannelIndex: 0, - range: { - start: 900, - end: 900 - } - }; - MODE_RANGES.push(modeRange); + var linkedToSelection = parseInt($(this).find('.linkedTo').val()); - var modeRangeExtra = { - id: modeId, - modeLogic: 0, - linkedTo: parseInt($(this).find('.linkedTo').val()) - }; - MODE_RANGES_EXTRA.push(modeRangeExtra); + if (linkedToSelection == 0) { + $(modeElement).find('.addRange').show(); + + if (modeId != 0){ // don't show Link for ARM + $(modeElement).find('.addLink').show(); + } + + $(this).remove(); + } else { + var modeRange = { + id: modeId, + auxChannelIndex: 0, + range: { + start: 900, + end: 900 + } + }; + MODE_RANGES.push(modeRange); + + var modeRangeExtra = { + id: modeId, + modeLogic: 0, + linkedTo: linkedToSelection + }; + MODE_RANGES_EXTRA.push(modeRangeExtra); + } }); }); From 5718f4db3c8da96e793155da64ee695a0fdfb75d Mon Sep 17 00:00:00 2001 From: Dave Huber Date: Fri, 8 Feb 2019 16:38:32 -0600 Subject: [PATCH 03/12] Add MODE_RANGES_EXTRA to backup restore --- src/js/backup_restore.js | 23 ++++++++++++++++++++++- 1 file changed, 22 insertions(+), 1 deletion(-) diff --git a/src/js/backup_restore.js b/src/js/backup_restore.js index 559c03ee..04b3b14f 100644 --- a/src/js/backup_restore.js +++ b/src/js/backup_restore.js @@ -34,6 +34,9 @@ function configuration_backup(callback) { if (semver.gte(CONFIG.apiVersion, "1.15.0")) { profileSpecificData.push(MSPCodes.MSP_RC_DEADBAND); } + if (semver.gte(CONFIG.apiVersion, "1.41.0")) { + profileSpecificData.push(MSPCodes.MSP_MODE_RANGES_EXTRA); + } } update_profile_specific_data_list(); @@ -77,6 +80,9 @@ function configuration_backup(callback) { if (semver.gte(CONFIG.apiVersion, "1.15.0")) { configuration.profiles[fetchingProfile].RCdeadband = jQuery.extend(true, {}, RC_DEADBAND_CONFIG); } + if (semver.gte(CONFIG.apiVersion, "1.41.0")) { + configuration.profiles[fetchingProfile].ModeRangesExtra = jQuery.extend(true, [], MODE_RANGES_EXTRA); + } codeKey = 0; fetchingProfile++; @@ -680,7 +686,7 @@ function configuration_restore(callback) { GUI.log(i18n.getMessage('configMigratedTo', [migratedVersion])); appliedMigrationsCount++; } - + if (appliedMigrationsCount > 0) { GUI.log(i18n.getMessage('configMigrationSuccessful', [appliedMigrationsCount])); } @@ -733,6 +739,21 @@ function configuration_restore(callback) { MODE_RANGES = configuration.profiles[profile].ModeRanges; ADJUSTMENT_RANGES = configuration.profiles[profile].AdjustmentRanges; RC_DEADBAND_CONFIG = configuration.profiles[profile].RCdeadband; + + if (configuration.profiles[profile].ModeRangesExtra == 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.profiles[profile].ModeRangesExtra; + } } function upload_using_specific_commands() { From fc8618828f40b1f020d85684787b0697c4da3a35 Mon Sep 17 00:00:00 2001 From: Dave Huber Date: Sat, 9 Feb 2019 20:49:17 -0600 Subject: [PATCH 04/12] Add version check to set_mode_ranges --- src/js/msp/MSPHelper.js | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/src/js/msp/MSPHelper.js b/src/js/msp/MSPHelper.js index cbc50510..bde71e95 100644 --- a/src/js/msp/MSPHelper.js +++ b/src/js/msp/MSPHelper.js @@ -1935,9 +1935,12 @@ MspHelper.prototype.sendModeRanges = function(onCompleteCallback) { .push8(modeRange.id) .push8(modeRange.auxChannelIndex) .push8((modeRange.range.start - 900) / 25) - .push8((modeRange.range.end - 900) / 25) - .push8(modeRangeExtra.modeLogic) - .push8(modeRangeExtra.linkedTo); + .push8((modeRange.range.end - 900) / 25); + + if (semver.gte(CONFIG.apiVersion, "1.41.0")) { + buffer.push8(modeRangeExtra.modeLogic) + .push8(modeRangeExtra.linkedTo); + } // prepare for next iteration modeRangeIndex++; From 97435b35ab5e4a5af8d08f870a7401a78ea846ab Mon Sep 17 00:00:00 2001 From: Dave Huber Date: Sun, 10 Feb 2019 10:19:31 -0600 Subject: [PATCH 05/12] Move MODE_RANGES_EXTRA code --- src/js/backup_restore.js | 44 +++++++++++++++++++++------------------- 1 file changed, 23 insertions(+), 21 deletions(-) diff --git a/src/js/backup_restore.js b/src/js/backup_restore.js index 04b3b14f..8c0518ea 100644 --- a/src/js/backup_restore.js +++ b/src/js/backup_restore.js @@ -34,9 +34,6 @@ function configuration_backup(callback) { if (semver.gte(CONFIG.apiVersion, "1.15.0")) { profileSpecificData.push(MSPCodes.MSP_RC_DEADBAND); } - if (semver.gte(CONFIG.apiVersion, "1.41.0")) { - profileSpecificData.push(MSPCodes.MSP_MODE_RANGES_EXTRA); - } } update_profile_specific_data_list(); @@ -80,9 +77,6 @@ function configuration_backup(callback) { if (semver.gte(CONFIG.apiVersion, "1.15.0")) { configuration.profiles[fetchingProfile].RCdeadband = jQuery.extend(true, {}, RC_DEADBAND_CONFIG); } - if (semver.gte(CONFIG.apiVersion, "1.41.0")) { - configuration.profiles[fetchingProfile].ModeRangesExtra = jQuery.extend(true, [], MODE_RANGES_EXTRA); - } codeKey = 0; fetchingProfile++; @@ -129,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(); @@ -180,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(); } @@ -739,21 +739,6 @@ function configuration_restore(callback) { MODE_RANGES = configuration.profiles[profile].ModeRanges; ADJUSTMENT_RANGES = configuration.profiles[profile].AdjustmentRanges; RC_DEADBAND_CONFIG = configuration.profiles[profile].RCdeadband; - - if (configuration.profiles[profile].ModeRangesExtra == 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.profiles[profile].ModeRangesExtra; - } } function upload_using_specific_commands() { @@ -786,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); } From e54cd65493d2db3471c0be81cc621cd9e7dab1a0 Mon Sep 17 00:00:00 2001 From: Dave Huber Date: Sun, 10 Feb 2019 10:23:53 -0600 Subject: [PATCH 06/12] Move initial var to version checked code --- src/js/msp/MSPHelper.js | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/js/msp/MSPHelper.js b/src/js/msp/MSPHelper.js index bde71e95..bd0d853f 100644 --- a/src/js/msp/MSPHelper.js +++ b/src/js/msp/MSPHelper.js @@ -1928,7 +1928,6 @@ MspHelper.prototype.sendModeRanges = function(onCompleteCallback) { function send_next_mode_range() { var modeRange = MODE_RANGES[modeRangeIndex]; - var modeRangeExtra = MODE_RANGES_EXTRA[modeRangeIndex]; var buffer = []; buffer.push8(modeRangeIndex) @@ -1938,6 +1937,8 @@ MspHelper.prototype.sendModeRanges = function(onCompleteCallback) { .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); } From 7037329f734a9899ed8dc395f27eee29673bdc7d Mon Sep 17 00:00:00 2001 From: Dave Huber Date: Sun, 17 Feb 2019 01:24:41 -0600 Subject: [PATCH 07/12] Add mixing links and ranges within a mode --- locales/en/messages.json | 2 +- src/css/tabs/auxiliary.css | 17 +++-- src/js/tabs/auxiliary.js | 124 ++++++++++++++++++------------------- src/tabs/auxiliary.html | 17 +++-- 4 files changed, 88 insertions(+), 72 deletions(-) diff --git a/locales/en/messages.json b/locales/en/messages.json index 0ef8880e..0e470196 100644 --- a/locales/en/messages.json +++ b/locales/en/messages.json @@ -1729,7 +1729,7 @@ "message": "Add Range" }, "auxiliaryAddLink": { - "message": "Link" + "message": "Add Link" }, "auxiliaryButtonSave": { "message": "Save" diff --git a/src/css/tabs/auxiliary.css b/src/css/tabs/auxiliary.css index a608a98b..7cb29efd 100644 --- a/src/css/tabs/auxiliary.css +++ b/src/css/tabs/auxiliary.css @@ -115,8 +115,8 @@ height: 70px; padding-top: 15px; padding-left: 15px; - border-top: 0px; - border-bottom: 0px; + border-top: 1px solid #fff; + border-bottom: 1px solid #cccccc; background-color: #ececec; padding-bottom: 5px; } @@ -129,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; @@ -152,7 +160,7 @@ margin-bottom: 3px; } -.tab-auxiliary .range .logic { +.tab-auxiliary .logic { border: 1px solid silver; border-radius: 3px; } @@ -173,13 +181,14 @@ margin-top: 1px; } -.tab-auxiliary .mode .link .channelLink { +.tab-auxiliary .mode .link .modeInfo { float: left; } .tab-auxiliary .link .linkedTo { border: 1px solid silver; border-radius: 3px; + margin-bottom: 3px; } .tab-auxiliary>.buttons { diff --git a/src/js/tabs/auxiliary.js b/src/js/tabs/auxiliary.js index 626fff7b..bbced95c 100644 --- a/src/js/tabs/auxiliary.js +++ b/src/js/tabs/auxiliary.js @@ -59,6 +59,28 @@ TABS.auxiliary.initialize = function (callback) { 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); + + logicList.hide(); + } function configureRangeTemplate(auxChannelCount) { var rangeTemplate = $('#tab-auxiliary-templates .range'); @@ -81,26 +103,8 @@ TABS.auxiliary.initialize = function (callback) { } channelOptionTemplate.val(-1); - - var logicList = $(rangeTemplate).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); - - logicList.hide(); + configureLogicList(rangeTemplate); } function configureLinkTemplate() { @@ -124,10 +128,27 @@ TABS.auxiliary.initialize = function (callback) { } linkOptionTemplate.val(0); + + configureLogicList(linkTemplate); + } + + function hideSiblingLogic(modeElement, element) { + var numSiblings = $(element).parent().children().length - 1; + + if (numSiblings != 0 && $(element).find('.logic').is(':hidden')) { + $(modeElement).find('.ranges').children().eq(numSiblings - 1).find('.logic').hide(); + } + } + + function showSiblingLogic(modeElement, index) { + if (index != 0) { + $(modeElement).find('.ranges').children().eq(index - 1).find('.logic').show(); + } } function addRangeToMode(modeElement, auxChannelIndex, modeLogic, range) { var modeIndex = $(modeElement).data('index'); + var modeRanges = $(modeElement).find('.ranges'); var channel_range = { 'min': [ 900 ], @@ -139,18 +160,13 @@ 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) { - $(modeElement).find('.addLink').hide(); - } else { - var prevRangeElement = $(modeElement).find('.ranges').children().eq(rangeIndex - 1); - $(prevRangeElement).find('.logic').show(); - } + showSiblingLogic(modeElement, rangeIndex); $(rangeElement).find('.channel-slider').noUiSlider({ start: rangeValues, @@ -179,19 +195,10 @@ TABS.auxiliary.initialize = function (callback) { $(rangeElement).find('.deleteRange').data('modeElement', modeElement); $(rangeElement).find('a.deleteRange').click(function () { + var modeElement = $(this).data('modeElement'); var rangeElement = $(this).data('rangeElement'); - var numSiblings = $(rangeElement).parent().children().length - 1; - - if (numSiblings == 0) { - var modeElement = $(this).data('modeElement'); - var modeId = $(modeElement).data('id'); - if (modeId != 0){ // don't show Link for ARM - $(modeElement).find('.addLink').show(); - } - } else { - var lastRangeElement = $(modeElement).find('.ranges').children().eq(numSiblings - 1); - $(lastRangeElement).find('.logic').hide(); - } + + hideSiblingLogic(modeElement, rangeElement); rangeElement.remove(); }); @@ -200,16 +207,18 @@ TABS.auxiliary.initialize = function (callback) { $(rangeElement).find('.logic').val(modeLogic); } - function addLinkedToMode(modeElement, linkedTo) { + function addLinkedToMode(modeElement, modeLogic, linkedTo) { var modeId = $(modeElement).data('id'); var modeIndex = $(modeElement).data('index'); + var modeRanges = $(modeElement).find('.ranges'); - $(modeElement).find('.addRange').hide(); - $(modeElement).find('.addLink').hide(); + var linkIndex = modeRanges.children().length; var linkElement = $('#tab-auxiliary-templates .link').clone(); - linkElement.attr('id', 'mode-' + modeIndex + '-link'); - modeElement.find('.ranges').append(linkElement); + linkElement.attr('id', 'mode-' + modeIndex + '-link-' + linkIndex); + modeRanges.append(linkElement); + + showSiblingLogic(modeElement, linkIndex); // disable the option associated with this mode var linkSelect = $(linkElement).find('.linkedTo'); @@ -219,20 +228,16 @@ TABS.auxiliary.initialize = function (callback) { $(linkElement).find('.deleteLink').data('modeElement', modeElement); $(linkElement).find('a.deleteLink').click(function () { - var linkElement = $(this).data('linkElement'); var modeElement = $(this).data('modeElement'); - - $(modeElement).find('.addRange').show(); - - var modeId = $(modeElement).data('id'); - if (modeId != 0){ // don't show Link for ARM - $(modeElement).find('.addLink').show(); - } + var linkElement = $(this).data('linkElement'); + + hideSiblingLogic(modeElement, linkElement); linkElement.remove(); }); $(linkElement).find('.linkedTo').val(linkedTo); + $(linkElement).find('.logic').val(modeLogic); } function process_html() { @@ -275,20 +280,21 @@ TABS.auxiliary.initialize = function (callback) { addRangeToMode(newMode, modeRange.auxChannelIndex, modeRangeExtra.modeLogic, range) } else { - addLinkedToMode(newMode, modeRangeExtra.linkedTo); + addLinkedToMode(newMode, modeRangeExtra.modeLogic, modeRangeExtra.linkedTo); } } } $('a.addRange').click(function () { var modeElement = $(this).data('modeElement'); - //auto select AUTO option; default to 'OR' logic + // auto select AUTO option; default to 'OR' logic addRangeToMode(modeElement, -1, 0); }); $('a.addLink').click(function () { var modeElement = $(this).data('modeElement'); - addLinkedToMode(modeElement, 0); + // default to 'OR' logic and no link selected + addLinkedToMode(modeElement, 0, 0); }); // translate to user-selected language @@ -333,12 +339,6 @@ TABS.auxiliary.initialize = function (callback) { var linkedToSelection = parseInt($(this).find('.linkedTo').val()); if (linkedToSelection == 0) { - $(modeElement).find('.addRange').show(); - - if (modeId != 0){ // don't show Link for ARM - $(modeElement).find('.addLink').show(); - } - $(this).remove(); } else { var modeRange = { @@ -353,7 +353,7 @@ TABS.auxiliary.initialize = function (callback) { var modeRangeExtra = { id: modeId, - modeLogic: 0, + modeLogic: parseInt($(this).find('.logic').val()), linkedTo: linkedToSelection }; MODE_RANGES_EXTRA.push(modeRangeExtra); diff --git a/src/tabs/auxiliary.html b/src/tabs/auxiliary.html index f459601d..ca9dfeb0 100644 --- a/src/tabs/auxiliary.html +++ b/src/tabs/auxiliary.html @@ -50,7 +50,7 @@ -
+
@@ -72,10 +72,17 @@