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 @@