]> git.basschouten.com Git - openhab-addons.git/blob
5d603b97c7ba030cb266183e37230537c62fadfd
[openhab-addons.git] /
1 /**
2  * Copyright (c) 2010-2021 Contributors to the openHAB project
3  *
4  * See the NOTICE file(s) distributed with this work for additional
5  * information.
6  *
7  * This program and the accompanying materials are made available under the
8  * terms of the Eclipse Public License 2.0 which is available at
9  * http://www.eclipse.org/legal/epl-2.0
10  *
11  * SPDX-License-Identifier: EPL-2.0
12  */
13 package org.openhab.binding.rotel.internal.communication;
14
15 import java.util.ArrayList;
16 import java.util.List;
17
18 import org.eclipse.jdt.annotation.NonNullByDefault;
19 import org.eclipse.jdt.annotation.Nullable;
20 import org.openhab.binding.rotel.internal.RotelException;
21
22 /**
23  * Represents the different sources available for the Rotel device
24  *
25  * @author Laurent Garnier - Initial contribution
26  */
27 @NonNullByDefault
28 public enum RotelSource {
29
30     CAT0_CD(0, "CD", "CD", RotelCommand.SOURCE_CD),
31
32     CAT1_CD(1, "CD", "CD", RotelCommand.SOURCE_CD, RotelCommand.RECORD_SOURCE_CD, RotelCommand.MAIN_ZONE_SOURCE_CD,
33             RotelCommand.ZONE2_SOURCE_CD, RotelCommand.ZONE3_SOURCE_CD, RotelCommand.ZONE4_SOURCE_CD),
34     CAT1_TUNER(1, "TUNER", "TUNER", RotelCommand.SOURCE_TUNER, RotelCommand.RECORD_SOURCE_TUNER,
35             RotelCommand.MAIN_ZONE_SOURCE_TUNER, RotelCommand.ZONE2_SOURCE_TUNER, RotelCommand.ZONE3_SOURCE_TUNER,
36             RotelCommand.ZONE4_SOURCE_TUNER),
37     CAT1_TAPE(1, "TAPE", "TAPE", RotelCommand.SOURCE_TAPE, RotelCommand.RECORD_SOURCE_TAPE,
38             RotelCommand.MAIN_ZONE_SOURCE_TAPE, RotelCommand.ZONE2_SOURCE_TAPE, RotelCommand.ZONE3_SOURCE_TAPE,
39             RotelCommand.ZONE4_SOURCE_TAPE),
40     CAT1_VIDEO1(1, "VIDEO1", "VIDEO 1", RotelCommand.SOURCE_VIDEO1, RotelCommand.RECORD_SOURCE_VIDEO1,
41             RotelCommand.MAIN_ZONE_SOURCE_VIDEO1, RotelCommand.ZONE2_SOURCE_VIDEO1, RotelCommand.ZONE3_SOURCE_VIDEO1,
42             RotelCommand.ZONE4_SOURCE_VIDEO1),
43     CAT1_VIDEO2(1, "VIDEO2", "VIDEO 2", RotelCommand.SOURCE_VIDEO2, RotelCommand.RECORD_SOURCE_VIDEO2,
44             RotelCommand.MAIN_ZONE_SOURCE_VIDEO2, RotelCommand.ZONE2_SOURCE_VIDEO2, RotelCommand.ZONE3_SOURCE_VIDEO2,
45             RotelCommand.ZONE4_SOURCE_VIDEO2),
46     CAT1_VIDEO3(1, "VIDEO3", "VIDEO 3", RotelCommand.SOURCE_VIDEO3, RotelCommand.RECORD_SOURCE_VIDEO3,
47             RotelCommand.MAIN_ZONE_SOURCE_VIDEO3, RotelCommand.ZONE2_SOURCE_VIDEO3, RotelCommand.ZONE3_SOURCE_VIDEO3,
48             RotelCommand.ZONE4_SOURCE_VIDEO3),
49     CAT1_VIDEO4(1, "VIDEO4", "VIDEO 4", RotelCommand.SOURCE_VIDEO4, RotelCommand.RECORD_SOURCE_VIDEO4,
50             RotelCommand.MAIN_ZONE_SOURCE_VIDEO4, RotelCommand.ZONE2_SOURCE_VIDEO4, RotelCommand.ZONE3_SOURCE_VIDEO4,
51             RotelCommand.ZONE4_SOURCE_VIDEO4),
52     CAT1_VIDEO5(1, "VIDEO5", "VIDEO 5", RotelCommand.SOURCE_VIDEO5, RotelCommand.RECORD_SOURCE_VIDEO5,
53             RotelCommand.MAIN_ZONE_SOURCE_VIDEO5, RotelCommand.ZONE2_SOURCE_VIDEO5, RotelCommand.ZONE3_SOURCE_VIDEO5,
54             RotelCommand.ZONE4_SOURCE_VIDEO5),
55     CAT1_MULTI(1, "MULTI", "MULTI", RotelCommand.SOURCE_MULTI_INPUT, null, RotelCommand.MAIN_ZONE_SOURCE_MULTI_INPUT,
56             null, null, null),
57     CAT1_FOLLOW_MAIN(1, "MAIN", "Follow Main Zone Source", null, RotelCommand.RECORD_SOURCE_MAIN, null,
58             RotelCommand.ZONE2_SOURCE_MAIN, RotelCommand.ZONE3_SOURCE_MAIN, RotelCommand.ZONE4_SOURCE_MAIN),
59
60     CAT2_CD(2, "CD", "CD", RotelCommand.SOURCE_CD, RotelCommand.RECORD_SOURCE_CD, RotelCommand.MAIN_ZONE_SOURCE_CD,
61             RotelCommand.ZONE2_SOURCE_CD, RotelCommand.ZONE3_SOURCE_CD, RotelCommand.ZONE4_SOURCE_CD),
62     CAT2_TUNER(2, "TUNER", "TUNER", RotelCommand.SOURCE_TUNER, RotelCommand.RECORD_SOURCE_TUNER,
63             RotelCommand.MAIN_ZONE_SOURCE_TUNER, RotelCommand.ZONE2_SOURCE_TUNER, RotelCommand.ZONE3_SOURCE_TUNER,
64             RotelCommand.ZONE4_SOURCE_TUNER),
65     CAT2_VIDEO1(2, "VIDEO1", "VIDEO 1", RotelCommand.SOURCE_VIDEO1, RotelCommand.RECORD_SOURCE_VIDEO1,
66             RotelCommand.MAIN_ZONE_SOURCE_VIDEO1, RotelCommand.ZONE2_SOURCE_VIDEO1, RotelCommand.ZONE3_SOURCE_VIDEO1,
67             RotelCommand.ZONE4_SOURCE_VIDEO1),
68     CAT2_VIDEO2(2, "VIDEO2", "VIDEO 2", RotelCommand.SOURCE_VIDEO2, RotelCommand.RECORD_SOURCE_VIDEO2,
69             RotelCommand.MAIN_ZONE_SOURCE_VIDEO2, RotelCommand.ZONE2_SOURCE_VIDEO2, RotelCommand.ZONE3_SOURCE_VIDEO2,
70             RotelCommand.ZONE4_SOURCE_VIDEO2),
71     CAT2_VIDEO3(2, "VIDEO3", "VIDEO 3", RotelCommand.SOURCE_VIDEO3, RotelCommand.RECORD_SOURCE_VIDEO3,
72             RotelCommand.MAIN_ZONE_SOURCE_VIDEO3, RotelCommand.ZONE2_SOURCE_VIDEO3, RotelCommand.ZONE3_SOURCE_VIDEO3,
73             RotelCommand.ZONE4_SOURCE_VIDEO3),
74     CAT2_VIDEO4(2, "VIDEO4", "VIDEO 4", RotelCommand.SOURCE_VIDEO4, RotelCommand.RECORD_SOURCE_VIDEO4,
75             RotelCommand.MAIN_ZONE_SOURCE_VIDEO4, RotelCommand.ZONE2_SOURCE_VIDEO4, RotelCommand.ZONE3_SOURCE_VIDEO4,
76             RotelCommand.ZONE4_SOURCE_VIDEO4),
77     CAT2_VIDEO5(2, "VIDEO5", "VIDEO 5", RotelCommand.SOURCE_VIDEO5, RotelCommand.RECORD_SOURCE_VIDEO5,
78             RotelCommand.MAIN_ZONE_SOURCE_VIDEO5, RotelCommand.ZONE2_SOURCE_VIDEO5, RotelCommand.ZONE3_SOURCE_VIDEO5,
79             RotelCommand.ZONE4_SOURCE_VIDEO5),
80     CAT2_VIDEO6(2, "VIDEO6", "VIDEO 6", RotelCommand.SOURCE_VIDEO6, RotelCommand.RECORD_SOURCE_VIDEO6,
81             RotelCommand.MAIN_ZONE_SOURCE_VIDEO6, RotelCommand.ZONE2_SOURCE_VIDEO6, RotelCommand.ZONE3_SOURCE_VIDEO6,
82             RotelCommand.ZONE4_SOURCE_VIDEO6),
83     CAT2_USB(2, "USB", "USB", RotelCommand.SOURCE_USB, RotelCommand.RECORD_SOURCE_USB,
84             RotelCommand.MAIN_ZONE_SOURCE_USB, RotelCommand.ZONE2_SOURCE_USB, RotelCommand.ZONE3_SOURCE_USB,
85             RotelCommand.ZONE4_SOURCE_USB),
86     CAT2_MULTI(2, "MULTI", "MULTI", RotelCommand.SOURCE_MULTI_INPUT, null, RotelCommand.MAIN_ZONE_SOURCE_MULTI_INPUT,
87             null, null, null),
88     CAT2_FOLLOW_MAIN(2, "MAIN", "Follow Main Zone Source", null, RotelCommand.RECORD_SOURCE_MAIN, null,
89             RotelCommand.ZONE2_SOURCE_MAIN, RotelCommand.ZONE3_SOURCE_MAIN, RotelCommand.ZONE4_SOURCE_MAIN),
90
91     CAT3_CD(3, "CD", "CD", RotelCommand.SOURCE_CD, RotelCommand.RECORD_SOURCE_CD, RotelCommand.MAIN_ZONE_SOURCE_CD,
92             RotelCommand.ZONE2_SOURCE_CD, RotelCommand.ZONE3_SOURCE_CD, RotelCommand.ZONE4_SOURCE_CD),
93     CAT3_TUNER(3, "TUNER", "TUNER", RotelCommand.SOURCE_TUNER, RotelCommand.RECORD_SOURCE_TUNER,
94             RotelCommand.MAIN_ZONE_SOURCE_TUNER, RotelCommand.ZONE2_SOURCE_TUNER, RotelCommand.ZONE3_SOURCE_TUNER,
95             RotelCommand.ZONE4_SOURCE_TUNER),
96     CAT3_TAPE(3, "TAPE", "TAPE", RotelCommand.SOURCE_TAPE, RotelCommand.RECORD_SOURCE_TAPE,
97             RotelCommand.MAIN_ZONE_SOURCE_TAPE, RotelCommand.ZONE2_SOURCE_TAPE, RotelCommand.ZONE3_SOURCE_TAPE,
98             RotelCommand.ZONE4_SOURCE_TAPE),
99     CAT3_VIDEO1(3, "VIDEO1", "VIDEO 1", RotelCommand.SOURCE_VIDEO1, RotelCommand.RECORD_SOURCE_VIDEO1,
100             RotelCommand.MAIN_ZONE_SOURCE_VIDEO1, RotelCommand.ZONE2_SOURCE_VIDEO1, RotelCommand.ZONE3_SOURCE_VIDEO1,
101             RotelCommand.ZONE4_SOURCE_VIDEO1),
102     CAT3_VIDEO2(3, "VIDEO2", "VIDEO 2", RotelCommand.SOURCE_VIDEO2, RotelCommand.RECORD_SOURCE_VIDEO2,
103             RotelCommand.MAIN_ZONE_SOURCE_VIDEO2, RotelCommand.ZONE2_SOURCE_VIDEO2, RotelCommand.ZONE3_SOURCE_VIDEO2,
104             RotelCommand.ZONE4_SOURCE_VIDEO2),
105     CAT3_VIDEO3(3, "VIDEO3", "VIDEO 3", RotelCommand.SOURCE_VIDEO3, RotelCommand.RECORD_SOURCE_VIDEO3,
106             RotelCommand.MAIN_ZONE_SOURCE_VIDEO3, RotelCommand.ZONE2_SOURCE_VIDEO3, RotelCommand.ZONE3_SOURCE_VIDEO3,
107             RotelCommand.ZONE4_SOURCE_VIDEO3),
108     CAT3_VIDEO4(3, "VIDEO4", "VIDEO 4", RotelCommand.SOURCE_VIDEO4, RotelCommand.RECORD_SOURCE_VIDEO4,
109             RotelCommand.MAIN_ZONE_SOURCE_VIDEO4, RotelCommand.ZONE2_SOURCE_VIDEO4, RotelCommand.ZONE3_SOURCE_VIDEO4,
110             RotelCommand.ZONE4_SOURCE_VIDEO4),
111     CAT3_VIDEO5(3, "VIDEO5", "VIDEO 5", RotelCommand.SOURCE_VIDEO5, RotelCommand.RECORD_SOURCE_VIDEO5,
112             RotelCommand.MAIN_ZONE_SOURCE_VIDEO5, RotelCommand.ZONE2_SOURCE_VIDEO5, RotelCommand.ZONE3_SOURCE_VIDEO5,
113             RotelCommand.ZONE4_SOURCE_VIDEO5),
114     CAT3_MULTI(3, "MULTI", "MULTI", RotelCommand.SOURCE_MULTI_INPUT, null, RotelCommand.MAIN_ZONE_SOURCE_MULTI_INPUT,
115             null, null, null),
116
117     CAT4_CD(4, "CD", "CD", RotelCommand.SOURCE_CD),
118     CAT4_AUX1(4, "AUX1", "Aux 1", RotelCommand.SOURCE_AUX1),
119     CAT4_TUNER(4, "TUNER", "Tuner", RotelCommand.SOURCE_TUNER),
120     CAT4_PHONO(4, "PHONO", "Phono", RotelCommand.SOURCE_PHONO),
121     CAT4_BLUETOOTH(4, "BLUETOOTH", "Bluetooth", RotelCommand.SOURCE_BLUETOOTH),
122
123     CAT5_CD(5, "CD", "CD", RotelCommand.SOURCE_CD),
124     CAT5_COAX1(5, "COAX1", "Coax 1", RotelCommand.SOURCE_COAX1),
125     CAT5_COAX2(5, "COAX2", "Coax 2", RotelCommand.SOURCE_COAX2),
126     CAT5_OPTICAL1(5, "OPTICAL1", "Optical 1", RotelCommand.SOURCE_OPT1),
127     CAT5_OPTICAL2(5, "OPTICAL2", "Optical 2", RotelCommand.SOURCE_OPT2),
128     CAT5_AUX1(5, "AUX1", "Aux 1", RotelCommand.SOURCE_AUX1),
129     CAT5_AUX2(5, "AUX2", "Aux 2", RotelCommand.SOURCE_AUX2),
130     CAT5_TUNER(5, "TUNER", "Tuner", RotelCommand.SOURCE_TUNER),
131     CAT5_PHONO(5, "PHONO", "Phono", RotelCommand.SOURCE_PHONO),
132     CAT5_USB(5, "USB", "Front USB", RotelCommand.SOURCE_USB),
133     CAT5_PCUSB(5, "PCUSB", "PC USB", RotelCommand.SOURCE_PCUSB),
134     CAT5_BLUETOOTH(5, "BLUETOOTH", "Bluetooth", RotelCommand.SOURCE_BLUETOOTH),
135
136     CAT6_RCD(6, "RCD", "Rotel CD", RotelCommand.SOURCE_ROTEL_CD),
137     CAT6_CD(6, "CD", "CD", RotelCommand.SOURCE_CD),
138     CAT6_COAX1(6, "COAX1", "Coax 1", RotelCommand.SOURCE_COAX1),
139     CAT6_COAX2(6, "COAX2", "Coax 2", RotelCommand.SOURCE_COAX2),
140     CAT6_OPTICAL1(6, "OPTICAL1", "Optical 1", RotelCommand.SOURCE_OPT1),
141     CAT6_OPTICAL2(6, "OPTICAL2", "Optical 2", RotelCommand.SOURCE_OPT2),
142     CAT6_AUX1(6, "AUX1", "Aux 1", RotelCommand.SOURCE_AUX1),
143     CAT6_AUX2(6, "AUX2", "Aux 2", RotelCommand.SOURCE_AUX2),
144     CAT6_TUNER(6, "TUNER", "Tuner", RotelCommand.SOURCE_TUNER),
145     CAT6_PHONO(6, "PHONO", "Phono", RotelCommand.SOURCE_PHONO),
146     CAT6_USB(6, "USB", "Front USB", RotelCommand.SOURCE_USB),
147
148     CAT7_RCD(7, "RCD", "Rotel CD", RotelCommand.SOURCE_ROTEL_CD),
149     CAT7_CD(7, "CD", "CD", RotelCommand.SOURCE_CD),
150     CAT7_COAX1(7, "COAX1", "Coax 1", RotelCommand.SOURCE_COAX1),
151     CAT7_COAX2(7, "COAX2", "Coax 2", RotelCommand.SOURCE_COAX2),
152     CAT7_OPTICAL1(7, "OPTICAL1", "Optical 1", RotelCommand.SOURCE_OPT1),
153     CAT7_OPTICAL2(7, "OPTICAL2", "Optical 2", RotelCommand.SOURCE_OPT2),
154     CAT7_AUX1(7, "AUX1", "Aux 1", RotelCommand.SOURCE_AUX1),
155     CAT7_AUX2(7, "AUX2", "Aux 2", RotelCommand.SOURCE_AUX2),
156     CAT7_TUNER(7, "TUNER", "Tuner", RotelCommand.SOURCE_TUNER),
157     CAT7_PHONO(7, "PHONO", "Phono", RotelCommand.SOURCE_PHONO),
158     CAT7_USB(7, "USB", "Front USB", RotelCommand.SOURCE_USB),
159     CAT7_PCUSB(7, "PCUSB", "PC USB", RotelCommand.SOURCE_PCUSB),
160     CAT7_XLR(7, "XLR", "XLR", RotelCommand.SOURCE_XLR),
161
162     CAT8_CD(8, "CD", "CD", RotelCommand.SOURCE_CD),
163     CAT8_COAX1(8, "COAX1", "Coax 1", RotelCommand.SOURCE_COAX1),
164     CAT8_COAX2(8, "COAX2", "Coax 2", RotelCommand.SOURCE_COAX2),
165     CAT8_OPTICAL1(8, "OPTICAL1", "Optical 1", RotelCommand.SOURCE_OPT1),
166     CAT8_OPTICAL2(8, "OPTICAL2", "Optical 2", RotelCommand.SOURCE_OPT2),
167     CAT8_AUX(8, "AUX", "Aux", RotelCommand.SOURCE_AUX),
168     CAT8_TUNER(8, "TUNER", "Tuner", RotelCommand.SOURCE_TUNER),
169     CAT8_PHONO(8, "PHONO", "Phono", RotelCommand.SOURCE_PHONO),
170     CAT8_USB(8, "USB", "Front USB", RotelCommand.SOURCE_USB),
171     CAT8_PCUSB(8, "PCUSB", "PC USB", RotelCommand.SOURCE_PCUSB),
172     CAT8_BLUETOOTH(8, "BLUETOOTH", "Bluetooth", RotelCommand.SOURCE_BLUETOOTH),
173     CAT8_XLR(8, "XLR", "XLR", RotelCommand.SOURCE_XLR),
174
175     CAT9_RCD(9, "RCD", "Rotel CD", RotelCommand.SOURCE_ROTEL_CD),
176     CAT9_CD(9, "CD", "CD", RotelCommand.SOURCE_CD),
177     CAT9_COAX1(9, "COAX1", "Coax 1", RotelCommand.SOURCE_COAX1),
178     CAT9_COAX2(9, "COAX2", "Coax 2", RotelCommand.SOURCE_COAX2),
179     CAT9_COAX3(9, "COAX3", "Coax 3", RotelCommand.SOURCE_COAX3),
180     CAT9_OPTICAL1(9, "OPTICAL1", "Optical 1", RotelCommand.SOURCE_OPT1),
181     CAT9_OPTICAL2(9, "OPTICAL2", "Optical 2", RotelCommand.SOURCE_OPT2),
182     CAT9_OPTICAL3(9, "OPTICAL3", "Optical 3", RotelCommand.SOURCE_OPT3),
183     CAT9_AUX(9, "AUX", "Aux", RotelCommand.SOURCE_AUX),
184     CAT9_TUNER(9, "TUNER", "Tuner", RotelCommand.SOURCE_TUNER),
185     CAT9_PHONO(9, "PHONO", "Phono", RotelCommand.SOURCE_PHONO),
186     CAT9_USB(9, "USB", "Front USB", RotelCommand.SOURCE_USB),
187     CAT9_PCUSB(9, "PCUSB", "PC USB", RotelCommand.SOURCE_PCUSB),
188     CAT9_BLUETOOTH(9, "BLUETOOTH", "Bluetooth", RotelCommand.SOURCE_BLUETOOTH),
189     CAT9_XLR(9, "XLR", "XLR", RotelCommand.SOURCE_XLR),
190
191     CAT10_CD(10, "CD", "CD", RotelCommand.SOURCE_CD),
192     CAT10_TUNER(10, "TUNER", "Tuner", RotelCommand.SOURCE_TUNER),
193     CAT10_PHONO(10, "PHONO", "Phono", RotelCommand.SOURCE_PHONO),
194     CAT10_VIDEO1(10, "VIDEO1", "VIDEO 1", RotelCommand.SOURCE_VIDEO1),
195     CAT10_VIDEO2(10, "VIDEO2", "VIDEO 2", RotelCommand.SOURCE_VIDEO2),
196     CAT10_VIDEO3(10, "VIDEO3", "VIDEO 3", RotelCommand.SOURCE_VIDEO3),
197     CAT10_VIDEO4(10, "VIDEO4", "VIDEO 4", RotelCommand.SOURCE_VIDEO4),
198     CAT10_VIDEO5(10, "VIDEO5", "VIDEO 5", RotelCommand.SOURCE_VIDEO5),
199     CAT10_VIDEO6(10, "VIDEO6", "VIDEO 6", RotelCommand.SOURCE_VIDEO6),
200     CAT10_VIDEO7(10, "VIDEO7", "VIDEO 7", RotelCommand.SOURCE_VIDEO7),
201     CAT10_USB(10, "USB", "Front USB", RotelCommand.SOURCE_USB),
202     CAT10_PCUSB(10, "PCUSB", "PC USB", RotelCommand.SOURCE_PCUSB),
203     CAT10_BLUETOOTH(10, "BLUETOOTH", "Bluetooth", RotelCommand.SOURCE_BLUETOOTH),
204     CAT10_XLR(10, "XLR", "XLR", RotelCommand.SOURCE_XLR),
205     CAT10_MULTI(10, "MULTI", "MULTI", RotelCommand.SOURCE_MULTI_INPUT),
206
207     CAT11_CD(11, "CD", "CD", RotelCommand.SOURCE_CD),
208     CAT11_TUNER(11, "TUNER", "Tuner", RotelCommand.SOURCE_TUNER),
209     CAT11_PHONO(11, "PHONO", "Phono", RotelCommand.SOURCE_PHONO),
210     CAT11_VIDEO1(11, "VIDEO1", "VIDEO 1", RotelCommand.SOURCE_VIDEO1),
211     CAT11_VIDEO2(11, "VIDEO2", "VIDEO 2", RotelCommand.SOURCE_VIDEO2),
212     CAT11_VIDEO3(11, "VIDEO3", "VIDEO 3", RotelCommand.SOURCE_VIDEO3),
213     CAT11_VIDEO4(11, "VIDEO4", "VIDEO 4", RotelCommand.SOURCE_VIDEO4),
214     CAT11_VIDEO5(11, "VIDEO5", "VIDEO 5", RotelCommand.SOURCE_VIDEO5),
215     CAT11_VIDEO6(11, "VIDEO6", "VIDEO 6", RotelCommand.SOURCE_VIDEO6),
216     CAT11_VIDEO7(11, "VIDEO7", "VIDEO 7", RotelCommand.SOURCE_VIDEO7),
217     CAT11_VIDEO8(11, "VIDEO8", "VIDEO 8", RotelCommand.SOURCE_VIDEO8),
218     CAT11_USB(11, "USB", "Front USB", RotelCommand.SOURCE_USB),
219     CAT11_PCUSB(11, "PCUSB", "PC USB", RotelCommand.SOURCE_PCUSB),
220     CAT11_BLUETOOTH(11, "BLUETOOTH", "Bluetooth", RotelCommand.SOURCE_BLUETOOTH),
221     CAT11_XLR(11, "XLR", "XLR", RotelCommand.SOURCE_XLR),
222     CAT11_MULTI(11, "MULTI", "MULTI", RotelCommand.SOURCE_MULTI_INPUT),
223
224     CAT12_FM(12, "FM", "FM", RotelCommand.SOURCE_FM),
225     CAT12_DAB(12, "DAB", "DAB", RotelCommand.SOURCE_DAB),
226
227     CAT13_FM(13, "FM", "FM", RotelCommand.SOURCE_FM),
228     CAT13_DAB(13, "DAB", "DAB", RotelCommand.SOURCE_DAB),
229     CAT13_PLAYFI(13, "PLAYFI", "PlayFi", RotelCommand.SOURCE_PLAYFI),
230
231     CAT14_FM(14, "FM", "FM", RotelCommand.SOURCE_FM),
232     CAT14_DAB(14, "DAB", "DAB", RotelCommand.SOURCE_DAB),
233     CAT14_IRADIO(14, "IRADIO", "iRadio", RotelCommand.SOURCE_IRADIO),
234     CAT14_NETWORK(14, "NETWORK", "Network", RotelCommand.SOURCE_NETWORK),
235
236     CAT15_COAX1(15, "COAX1", "Coax 1", RotelCommand.SOURCE_COAX1),
237     CAT15_COAX2(15, "COAX2", "Coax 2", RotelCommand.SOURCE_COAX2),
238     CAT15_OPTICAL1(15, "OPTICAL1", "Optical 1", RotelCommand.SOURCE_OPT1),
239     CAT15_OPTICAL2(15, "OPTICAL2", "Optical 2", RotelCommand.SOURCE_OPT2),
240     CAT15_USB(15, "USB", "Front USB", RotelCommand.SOURCE_USB),
241     CAT15_PCUSB(15, "PCUSB", "PC USB", RotelCommand.SOURCE_PCUSB),
242
243     CAT16_IRADIO(16, "IRADIO", "iRadio", RotelCommand.SOURCE_IRADIO),
244     CAT16_NETWORK(16, "NETWORK", "Network", RotelCommand.SOURCE_NETWORK),
245     CAT16_AUX1_COAX(16, "AUX1_COAX", "Aux 1 Coax", RotelCommand.SOURCE_AUX1_COAX),
246     CAT16_AUX1_OPTICAL(16, "AUX1_OPTICAL", "Aux 1 Optical", RotelCommand.SOURCE_AUX1_OPT),
247     CAT16_FM(16, "FM", "FM", RotelCommand.SOURCE_FM),
248     CAT16_DAB(16, "DAB", "DAB", RotelCommand.SOURCE_DAB),
249     CAT16_USB(16, "USB", "USB", RotelCommand.SOURCE_USB),
250
251     CAT17_CD(17, "CD", "CD", RotelCommand.SOURCE_CD),
252     CAT17_IRADIO(17, "IRADIO", "iRadio", RotelCommand.SOURCE_IRADIO),
253     CAT17_NETWORK(17, "NETWORK", "Network", RotelCommand.SOURCE_NETWORK),
254     CAT17_AUX1_COAX(17, "AUX1_COAX", "Aux 1 Coax", RotelCommand.SOURCE_AUX1_COAX),
255     CAT17_AUX1_OPTICAL(17, "AUX1_OPTICAL", "Aux 1 Optical", RotelCommand.SOURCE_AUX1_OPT),
256     CAT17_AUX2(17, "AUX2", "Aux 2", RotelCommand.SOURCE_AUX2),
257     CAT17_FM(17, "FM", "FM", RotelCommand.SOURCE_FM),
258     CAT17_DAB(17, "DAB", "DAB", RotelCommand.SOURCE_DAB),
259     CAT17_USB(17, "USB", "USB", RotelCommand.SOURCE_USB);
260
261     private int category;
262     private String name;
263     private String label;
264     private @Nullable RotelCommand command;
265     private @Nullable RotelCommand recordCommand;
266     private @Nullable RotelCommand mainZoneCommand;
267     private @Nullable RotelCommand zone2Command;
268     private @Nullable RotelCommand zone3Command;
269     private @Nullable RotelCommand zone4Command;
270
271     /**
272      * Constructor
273      *
274      * @param category a category of models for which the source is available
275      * @param name the name of the source
276      * @param label the label of the source
277      * @param command the command to select the source
278      */
279     private RotelSource(int category, String name, String label, @Nullable RotelCommand command) {
280         this(category, name, label, command, null, null, null, null, null);
281     }
282
283     /**
284      * Constructor
285      *
286      * @param category a category of models for which the source is available
287      * @param name the name of the source
288      * @param label the label of the source
289      * @param command the command to select the source
290      * @param recordCommand the command to select the source as source to be recorded
291      * @param mainZoneCommand the command to select the source in the main zone
292      * @param zone2Command the command to select the source in the zone 2
293      * @param zone3Command the command to select the source in the zone 3
294      * @param zone4Command the command to select the source in the zone 4
295      */
296     private RotelSource(int category, String name, String label, @Nullable RotelCommand command,
297             @Nullable RotelCommand recordCommand, @Nullable RotelCommand mainZoneCommand,
298             @Nullable RotelCommand zone2Command, @Nullable RotelCommand zone3Command,
299             @Nullable RotelCommand zone4Command) {
300         this.category = category;
301         this.name = name;
302         this.label = label;
303         this.command = command;
304         this.recordCommand = recordCommand;
305         this.mainZoneCommand = mainZoneCommand;
306         this.zone2Command = zone2Command;
307         this.zone3Command = zone3Command;
308         this.zone4Command = zone4Command;
309     }
310
311     /**
312      * Get the category of models for the source
313      *
314      * @return the category of models
315      */
316     public int getCategory() {
317         return category;
318     }
319
320     /**
321      * Get the name of the source
322      *
323      * @return the name
324      */
325     public String getName() {
326         return name;
327     }
328
329     /**
330      * Get the label of the source
331      *
332      * @return the label
333      */
334     public String getLabel() {
335         return label;
336     }
337
338     /**
339      * Get the command to select the source
340      *
341      * @return the command
342      */
343     public @Nullable RotelCommand getCommand() {
344         return command;
345     }
346
347     /**
348      * Get the command to select the source as source to be recorded
349      *
350      * @return the command
351      */
352     public @Nullable RotelCommand getRecordCommand() {
353         return recordCommand;
354     }
355
356     /**
357      * Get the command to select the source in the main zone
358      *
359      * @return the command
360      */
361     public @Nullable RotelCommand getMainZoneCommand() {
362         return mainZoneCommand;
363     }
364
365     /**
366      * Get the command to select the source in the zone 2
367      *
368      * @return the command
369      */
370     public @Nullable RotelCommand getZone2Command() {
371         return zone2Command;
372     }
373
374     /**
375      * Get the command to select the source in the zone 3
376      *
377      * @return the command
378      */
379     public @Nullable RotelCommand getZone3Command() {
380         return zone3Command;
381     }
382
383     /**
384      * Get the command to select the source in the zone 4
385      *
386      * @return the command
387      */
388     public @Nullable RotelCommand getZone4Command() {
389         return zone4Command;
390     }
391
392     /**
393      * Get the list of {@link RotelSource} available for a particular category of models
394      *
395      * @param category a category of models
396      * @param type a source type (0 for global source, 1 for main zone, 2 for zone 2, 3 for zone 3, 4 for zone 4 and 5
397      *            for record source)
398      *
399      * @return the list of {@link RotelSource} available in a zone for a provided category of models
400      */
401     public static List<RotelSource> getSources(int category, int type) {
402         List<RotelSource> sources = new ArrayList<>();
403         for (RotelSource value : RotelSource.values()) {
404             if (value.getCategory() == category && ((type == 0 && value.getCommand() != null)
405                     || (type == 1 && value.getMainZoneCommand() != null)
406                     || (type == 2 && value.getZone2Command() != null) || (type == 3 && value.getZone3Command() != null)
407                     || (type == 4 && value.getZone4Command() != null)
408                     || (type == 5 && value.getRecordCommand() != null))) {
409                 sources.add(value);
410             }
411         }
412         return sources;
413     }
414
415     /**
416      * Get the source associated to a name for a particular category of models
417      *
418      * @param category a category of models
419      * @param name the name used to identify the source
420      *
421      * @return the source associated to the searched name for the provided category of models
422      *
423      * @throws RotelException - If no source is associated to the searched name for the provided category
424      */
425     public static RotelSource getFromName(int category, String name) throws RotelException {
426         for (RotelSource value : RotelSource.values()) {
427             if (value.getCategory() == category && value.getName().equals(name)) {
428                 return value;
429             }
430         }
431         throw new RotelException("Invalid name for a source: " + name);
432     }
433
434     /**
435      * Get the source associated to a command for a particular category of models
436      *
437      * @param category a category of models
438      * @param command the command used to identify the source
439      * @param type a source type (0 for global source, 1 for main zone, 2 for zone 2, 3 for zone 3, 4 for zone 4 and 5
440      *            for record source)
441      *
442      * @return the source associated to the searched command for the provided category of models
443      *
444      * @throws RotelException - If no source is associated to the searched command for the provided category
445      */
446     public static RotelSource getFromCommand(int category, RotelCommand command, int type) throws RotelException {
447         for (RotelSource value : RotelSource.values()) {
448             if (value.getCategory() == category && ((type == 0 && value.getCommand() == command)
449                     || (type == 1 && value.getMainZoneCommand() == command)
450                     || (type == 2 && value.getZone2Command() == command)
451                     || (type == 3 && value.getZone3Command() == command)
452                     || (type == 4 && value.getZone4Command() == command)
453                     || (type == 5 && value.getRecordCommand() == command))) {
454                 return value;
455             }
456         }
457         throw new RotelException("Invalid command for a source: " + command.getName());
458     }
459 }