]> git.basschouten.com Git - openhab-addons.git/blob
dab2a9fd2055d529157d39ded54838abd3d7f5b0
[openhab-addons.git] /
1 /**
2  * Copyright (c) 2010-2024 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     CAT18_CD(18, "CD", "CD", RotelCommand.SOURCE_CD),
262     CAT18_COAX1(18, "COAX1", "Coax 1", RotelCommand.SOURCE_COAX1),
263     CAT18_COAX2(18, "COAX2", "Coax 2", RotelCommand.SOURCE_COAX2),
264     CAT18_COAX3(18, "COAX3", "Coax 3", RotelCommand.SOURCE_COAX3),
265     CAT18_OPTICAL1(18, "OPTICAL1", "Optical 1", RotelCommand.SOURCE_OPT1),
266     CAT18_OPTICAL2(18, "OPTICAL2", "Optical 2", RotelCommand.SOURCE_OPT2),
267     CAT18_OPTICAL3(18, "OPTICAL3", "Optical 3", RotelCommand.SOURCE_OPT3),
268     CAT18_AUX(18, "AUX", "Aux", RotelCommand.SOURCE_AUX),
269     CAT18_TUNER(18, "TUNER", "Tuner", RotelCommand.SOURCE_TUNER),
270     CAT18_PHONO(18, "PHONO", "Phono", RotelCommand.SOURCE_PHONO),
271     CAT18_BLUETOOTH(18, "BLUETOOTH", "Bluetooth", RotelCommand.SOURCE_BLUETOOTH),
272     CAT18_XLR(18, "XLR", "XLR", RotelCommand.SOURCE_XLR),
273     CAT18_PCUSB(18, "PCUSB", "PC USB", RotelCommand.SOURCE_PCUSB),
274
275     CAT19_CD(19, "CD", "CD", RotelCommand.SOURCE_CD),
276     CAT19_COAX1(19, "COAX1", "Coax 1", RotelCommand.SOURCE_COAX1),
277     CAT19_COAX2(19, "COAX2", "Coax 2", RotelCommand.SOURCE_COAX2),
278     CAT19_COAX3(19, "COAX3", "Coax 3", RotelCommand.SOURCE_COAX3),
279     CAT19_OPTICAL1(19, "OPTICAL1", "Optical 1", RotelCommand.SOURCE_OPT1),
280     CAT19_OPTICAL2(19, "OPTICAL2", "Optical 2", RotelCommand.SOURCE_OPT2),
281     CAT19_OPTICAL3(19, "OPTICAL3", "Optical 3", RotelCommand.SOURCE_OPT3),
282     CAT19_AUX1(19, "AUX1", "Aux 1", RotelCommand.SOURCE_AUX1),
283     CAT19_AUX2(19, "AUX2", "Aux 2", RotelCommand.SOURCE_AUX2),
284     CAT19_TUNER(19, "TUNER", "Tuner", RotelCommand.SOURCE_TUNER),
285     CAT19_PHONO(19, "PHONO", "Phono", RotelCommand.SOURCE_PHONO),
286     CAT19_BLUETOOTH(19, "BLUETOOTH", "Bluetooth", RotelCommand.SOURCE_BLUETOOTH),
287     CAT19_XLR(19, "XLR", "XLR", RotelCommand.SOURCE_XLR),
288     CAT19_PCUSB(19, "PCUSB", "PC USB", RotelCommand.SOURCE_PCUSB),
289
290     CAT20_CD(20, "CD", "CD", RotelCommand.SOURCE_CD),
291     CAT20_COAX1(20, "COAX1", "Coax 1", RotelCommand.SOURCE_COAX1),
292     CAT20_COAX2(20, "COAX2", "Coax 2", RotelCommand.SOURCE_COAX2),
293     CAT20_COAX3(20, "COAX3", "Coax 3", RotelCommand.SOURCE_COAX3),
294     CAT20_OPTICAL1(20, "OPTICAL1", "Optical 1", RotelCommand.SOURCE_OPT1),
295     CAT20_OPTICAL2(20, "OPTICAL2", "Optical 2", RotelCommand.SOURCE_OPT2),
296     CAT20_OPTICAL3(20, "OPTICAL3", "Optical 3", RotelCommand.SOURCE_OPT3),
297     CAT20_AUX1(20, "AUX1", "Aux 1", RotelCommand.SOURCE_AUX1),
298     CAT20_AUX2(20, "AUX2", "Aux 2", RotelCommand.SOURCE_AUX2),
299     CAT20_TUNER(20, "TUNER", "Tuner", RotelCommand.SOURCE_TUNER),
300     CAT20_PHONO(20, "PHONO", "Phono", RotelCommand.SOURCE_PHONO),
301     CAT20_BLUETOOTH(20, "BLUETOOTH", "Bluetooth", RotelCommand.SOURCE_BLUETOOTH),
302     CAT20_XLR1(20, "XLR1", "XLR 1", RotelCommand.SOURCE_XLR1),
303     CAT20_XLR2(20, "XLR2", "XLR 2", RotelCommand.SOURCE_XLR1),
304     CAT20_PCUSB(20, "PCUSB", "PC USB", RotelCommand.SOURCE_PCUSB),
305
306     CAT21_INPUTA(21, "INPUTA", "Input A", RotelCommand.SOURCE_INPUT_A, null, RotelCommand.ZONE1_SOURCE_INPUT_A,
307             RotelCommand.ZONE2_SOURCE_INPUT_A, RotelCommand.ZONE3_SOURCE_INPUT_A, RotelCommand.ZONE4_SOURCE_INPUT_A),
308     CAT21_INPUTB(21, "INPUTB", "Input B", RotelCommand.SOURCE_INPUT_B, null, RotelCommand.ZONE1_SOURCE_INPUT_B,
309             RotelCommand.ZONE2_SOURCE_INPUT_B, RotelCommand.ZONE3_SOURCE_INPUT_B, RotelCommand.ZONE4_SOURCE_INPUT_B),
310     CAT21_INPUTC(21, "INPUTC", "Input C", RotelCommand.SOURCE_INPUT_C, null, RotelCommand.ZONE1_SOURCE_INPUT_C,
311             RotelCommand.ZONE2_SOURCE_INPUT_C, RotelCommand.ZONE3_SOURCE_INPUT_C, RotelCommand.ZONE4_SOURCE_INPUT_C),
312     CAT21_INPUTD(21, "INPUTD", "Input D", RotelCommand.SOURCE_INPUT_D, null, RotelCommand.ZONE1_SOURCE_INPUT_D,
313             RotelCommand.ZONE2_SOURCE_INPUT_D, RotelCommand.ZONE3_SOURCE_INPUT_D, RotelCommand.ZONE4_SOURCE_INPUT_D);
314
315     private int category;
316     private String name;
317     private String label;
318     private @Nullable RotelCommand command;
319     private @Nullable RotelCommand recordCommand;
320     private @Nullable RotelCommand zone1Command;
321     private @Nullable RotelCommand zone2Command;
322     private @Nullable RotelCommand zone3Command;
323     private @Nullable RotelCommand zone4Command;
324
325     /**
326      * Constructor
327      *
328      * @param category a category of models for which the source is available
329      * @param name the name of the source
330      * @param label the label of the source
331      * @param command the command to select the source
332      */
333     private RotelSource(int category, String name, String label, @Nullable RotelCommand command) {
334         this(category, name, label, command, null, null, null, null, null);
335     }
336
337     /**
338      * Constructor
339      *
340      * @param category a category of models for which the source is available
341      * @param name the name of the source
342      * @param label the label of the source
343      * @param command the command to select the source
344      * @param recordCommand the command to select the source as source to be recorded
345      * @param zone1Command the command to select the source in the zone 1 or main zone
346      * @param zone2Command the command to select the source in the zone 2
347      * @param zone3Command the command to select the source in the zone 3
348      * @param zone4Command the command to select the source in the zone 4
349      */
350     private RotelSource(int category, String name, String label, @Nullable RotelCommand command,
351             @Nullable RotelCommand recordCommand, @Nullable RotelCommand zone1Command,
352             @Nullable RotelCommand zone2Command, @Nullable RotelCommand zone3Command,
353             @Nullable RotelCommand zone4Command) {
354         this.category = category;
355         this.name = name;
356         this.label = label;
357         this.command = command;
358         this.recordCommand = recordCommand;
359         this.zone1Command = zone1Command;
360         this.zone2Command = zone2Command;
361         this.zone3Command = zone3Command;
362         this.zone4Command = zone4Command;
363     }
364
365     /**
366      * Get the category of models for the source
367      *
368      * @return the category of models
369      */
370     public int getCategory() {
371         return category;
372     }
373
374     /**
375      * Get the name of the source
376      *
377      * @return the name
378      */
379     public String getName() {
380         return name;
381     }
382
383     /**
384      * Get the label of the source
385      *
386      * @return the label
387      */
388     public String getLabel() {
389         return label;
390     }
391
392     /**
393      * Get the command to select the source
394      *
395      * @return the command
396      */
397     public @Nullable RotelCommand getCommand() {
398         return command;
399     }
400
401     /**
402      * Get the command to select the source as source to be recorded
403      *
404      * @return the command
405      */
406     public @Nullable RotelCommand getRecordCommand() {
407         return recordCommand;
408     }
409
410     /**
411      * Get the command to select the source in a zone
412      *
413      * @param numZone the zone number, 1 for main zone or zone 1, 2 for zone 2, 3 for zone 3, 4 for zone 4
414      *
415      * @return the command
416      */
417     public @Nullable RotelCommand getZoneCommand(int numZone) {
418         switch (numZone) {
419             case 1:
420                 return zone1Command;
421             case 2:
422                 return zone2Command;
423             case 3:
424                 return zone3Command;
425             case 4:
426                 return zone4Command;
427             default:
428                 throw new IllegalArgumentException("numZone must be a value between 1 and 4");
429         }
430     }
431
432     /**
433      * Get the list of {@link RotelSource} available for a particular category of models
434      *
435      * @param category a category of models
436      * @param type a source type (0 for global source, 1 for main zone or zone 1, 2 for zone 2, 3 for zone 3, 4 for zone
437      *            4 and 5 for record source)
438      *
439      * @return the list of {@link RotelSource} available in a zone for a provided category of models
440      */
441     public static List<RotelSource> getSources(int category, int type) {
442         List<RotelSource> sources = new ArrayList<>();
443         for (RotelSource value : RotelSource.values()) {
444             if (value.getCategory() == category && ((type == 0 && value.getCommand() != null)
445                     || (type == 1 && value.getZoneCommand(1) != null) || (type == 2 && value.getZoneCommand(2) != null)
446                     || (type == 3 && value.getZoneCommand(3) != null) || (type == 4 && value.getZoneCommand(4) != null)
447                     || (type == 5 && value.getRecordCommand() != null))) {
448                 sources.add(value);
449             }
450         }
451         return sources;
452     }
453
454     /**
455      * Get the source associated to a name for a particular category of models
456      *
457      * @param category a category of models
458      * @param name the name used to identify the source
459      *
460      * @return the source associated to the searched name for the provided category of models
461      *
462      * @throws RotelException - If no source is associated to the searched name for the provided category
463      */
464     public static RotelSource getFromName(int category, String name) throws RotelException {
465         for (RotelSource value : RotelSource.values()) {
466             if (value.getCategory() == category && value.getName().equals(name)) {
467                 return value;
468             }
469         }
470         throw new RotelException("Invalid name for a source: " + name);
471     }
472
473     /**
474      * Get the source associated to a command for a particular category of models
475      *
476      * @param category a category of models
477      * @param command the command used to identify the source
478      * @param type a source type (0 for global source, 1 for main zone or zone 1, 2 for zone 2, 3 for zone 3,
479      *            4 for zone 4 and 5 for record source)
480      *
481      * @return the source associated to the searched command for the provided category of models
482      *
483      * @throws RotelException - If no source is associated to the searched command for the provided category
484      */
485     public static RotelSource getFromCommand(int category, RotelCommand command, int type) throws RotelException {
486         for (RotelSource value : RotelSource.values()) {
487             if (value.getCategory() == category && ((type == 0 && value.getCommand() == command)
488                     || (type == 1 && value.getZoneCommand(1) == command)
489                     || (type == 2 && value.getZoneCommand(2) == command)
490                     || (type == 3 && value.getZoneCommand(3) == command)
491                     || (type == 4 && value.getZoneCommand(4) == command)
492                     || (type == 5 && value.getRecordCommand() == command))) {
493                 return value;
494             }
495         }
496         throw new RotelException("Invalid command for a source: " + command.getLabel());
497     }
498 }