Commit | Line | Data |
---|---|---|
0d800fe5 LOK |
1 | #pragma once |
2 | /* | |
3 | * This file is part of the libCEC(R) library. | |
4 | * | |
16f47961 | 5 | * libCEC(R) is Copyright (C) 2011-2013 Pulse-Eight Limited. All rights reserved. |
0d800fe5 LOK |
6 | * libCEC(R) is an original work, containing original code. |
7 | * | |
8 | * libCEC(R) is a trademark of Pulse-Eight Limited. | |
9 | * | |
10 | * This program is dual-licensed; you can redistribute it and/or modify | |
11 | * it under the terms of the GNU General Public License as published by | |
12 | * the Free Software Foundation; either version 2 of the License, or | |
13 | * (at your option) any later version. | |
14 | * | |
15 | * This program is distributed in the hope that it will be useful, | |
16 | * but WITHOUT ANY WARRANTY; without even the implied warranty of | |
17 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |
18 | * GNU General Public License for more details. | |
19 | * | |
20 | * You should have received a copy of the GNU General Public License | |
21 | * along with this program; if not, write to the Free Software | |
22 | * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. | |
23 | * | |
24 | * | |
25 | * Alternatively, you can license this library under a commercial license, | |
26 | * please contact Pulse-Eight Licensing for more information. | |
27 | * | |
28 | * For more information contact: | |
29 | * Pulse-Eight Licensing <license@pulse-eight.com> | |
30 | * http://www.pulse-eight.com/ | |
31 | * http://www.pulse-eight.net/ | |
32 | */ | |
33 | ||
8187ac5f LOK |
34 | #include "lib/platform/util/StdString.h" |
35 | ||
0d800fe5 LOK |
36 | namespace CEC |
37 | { | |
38 | class CCECTypeUtils | |
39 | { | |
40 | public: | |
41 | /*! | |
42 | * @brief Get the device type for the given logical address. | |
43 | * @param address The address to get the type for. | |
44 | * @return The type, or CEC_DEVICE_TYPE_RESERVED if unknown. | |
45 | */ | |
46 | static cec_device_type GetType(const cec_logical_address address) | |
47 | { | |
48 | switch (address) | |
49 | { | |
50 | case CECDEVICE_AUDIOSYSTEM: | |
51 | return CEC_DEVICE_TYPE_AUDIO_SYSTEM; | |
52 | case CECDEVICE_PLAYBACKDEVICE1: | |
53 | case CECDEVICE_PLAYBACKDEVICE2: | |
54 | case CECDEVICE_PLAYBACKDEVICE3: | |
55 | return CEC_DEVICE_TYPE_PLAYBACK_DEVICE; | |
56 | case CECDEVICE_RECORDINGDEVICE1: | |
57 | case CECDEVICE_RECORDINGDEVICE2: | |
58 | case CECDEVICE_RECORDINGDEVICE3: | |
59 | return CEC_DEVICE_TYPE_RECORDING_DEVICE; | |
60 | case CECDEVICE_TUNER1: | |
61 | case CECDEVICE_TUNER2: | |
62 | case CECDEVICE_TUNER3: | |
63 | case CECDEVICE_TUNER4: | |
64 | return CEC_DEVICE_TYPE_TUNER; | |
65 | case CECDEVICE_TV: | |
66 | return CEC_DEVICE_TYPE_TV; | |
67 | default: | |
68 | return CEC_DEVICE_TYPE_RESERVED; | |
69 | } | |
70 | } | |
71 | ||
72 | /*! | |
73 | * @brief Get the ackmask for all devices of the same type as the given logical address. | |
74 | * @param address The address to get the ackmask for. | |
75 | * @return The ackmask for this type. | |
76 | */ | |
77 | static uint16_t GetMaskForType(cec_logical_address address) | |
78 | { | |
79 | return GetMaskForType(GetType(address)); | |
80 | } | |
81 | ||
82 | /*! | |
83 | * @brief Get the ackmask for all devices of the given type. | |
84 | * @param type The type to get the ackmask for. | |
85 | * @return The ackmask for this type, or 0 of no types match. | |
86 | */ | |
87 | static uint16_t GetMaskForType(const cec_device_type type) | |
88 | { | |
89 | switch (type) | |
90 | { | |
91 | case CEC_DEVICE_TYPE_AUDIO_SYSTEM: | |
92 | { | |
93 | cec_logical_addresses addr; | |
94 | addr.Clear(); | |
95 | addr.Set(CECDEVICE_AUDIOSYSTEM); | |
96 | return addr.AckMask(); | |
97 | } | |
98 | case CEC_DEVICE_TYPE_PLAYBACK_DEVICE: | |
99 | { | |
100 | cec_logical_addresses addr; | |
101 | addr.Clear(); | |
102 | addr.Set(CECDEVICE_PLAYBACKDEVICE1); | |
103 | addr.Set(CECDEVICE_PLAYBACKDEVICE2); | |
104 | addr.Set(CECDEVICE_PLAYBACKDEVICE3); | |
105 | return addr.AckMask(); | |
106 | } | |
107 | case CEC_DEVICE_TYPE_RECORDING_DEVICE: | |
108 | { | |
109 | cec_logical_addresses addr; | |
110 | addr.Clear(); | |
111 | addr.Set(CECDEVICE_RECORDINGDEVICE1); | |
112 | addr.Set(CECDEVICE_RECORDINGDEVICE2); | |
113 | addr.Set(CECDEVICE_RECORDINGDEVICE3); | |
114 | return addr.AckMask(); | |
115 | } | |
116 | case CEC_DEVICE_TYPE_TUNER: | |
117 | { | |
118 | cec_logical_addresses addr; | |
119 | addr.Clear(); | |
120 | addr.Set(CECDEVICE_TUNER1); | |
121 | addr.Set(CECDEVICE_TUNER2); | |
122 | addr.Set(CECDEVICE_TUNER3); | |
123 | addr.Set(CECDEVICE_TUNER4); | |
124 | return addr.AckMask(); | |
125 | } | |
126 | case CEC_DEVICE_TYPE_TV: | |
127 | { | |
128 | cec_logical_addresses addr; | |
129 | addr.Clear(); | |
130 | addr.Set(CECDEVICE_TV); | |
131 | return addr.AckMask(); | |
132 | } | |
133 | default: | |
134 | return 0; | |
135 | } | |
136 | } | |
137 | ||
138 | static const char *ToString(const cec_device_type type) | |
139 | { | |
140 | switch (type) | |
141 | { | |
142 | case CEC_DEVICE_TYPE_AUDIO_SYSTEM: | |
143 | return "audio system"; | |
144 | case CEC_DEVICE_TYPE_PLAYBACK_DEVICE: | |
145 | return "playback device"; | |
146 | case CEC_DEVICE_TYPE_RECORDING_DEVICE: | |
147 | return "recording device"; | |
148 | case CEC_DEVICE_TYPE_RESERVED: | |
149 | return "reserved"; | |
150 | case CEC_DEVICE_TYPE_TUNER: | |
151 | return "tuner"; | |
152 | case CEC_DEVICE_TYPE_TV: | |
153 | return "TV"; | |
154 | default: | |
155 | return "unknown"; | |
156 | } | |
157 | } | |
158 | ||
159 | static const char *ToString(const cec_menu_state state) | |
160 | { | |
161 | switch (state) | |
162 | { | |
163 | case CEC_MENU_STATE_ACTIVATED: | |
164 | return "activated"; | |
165 | case CEC_MENU_STATE_DEACTIVATED: | |
166 | return "deactivated"; | |
167 | default: | |
168 | return "unknown"; | |
169 | } | |
170 | } | |
171 | ||
172 | static const char *ToString(const cec_version version) | |
173 | { | |
174 | switch (version) | |
175 | { | |
176 | case CEC_VERSION_1_2: | |
177 | return "1.2"; | |
178 | case CEC_VERSION_1_2A: | |
179 | return "1.2a"; | |
180 | case CEC_VERSION_1_3: | |
181 | return "1.3"; | |
182 | case CEC_VERSION_1_3A: | |
183 | return "1.3a"; | |
184 | case CEC_VERSION_1_4: | |
185 | return "1.4"; | |
186 | default: | |
187 | return "unknown"; | |
188 | } | |
189 | } | |
190 | ||
191 | static const char *ToString(const cec_power_status status) | |
192 | { | |
193 | switch (status) | |
194 | { | |
195 | case CEC_POWER_STATUS_ON: | |
196 | return "on"; | |
197 | case CEC_POWER_STATUS_STANDBY: | |
198 | return "standby"; | |
199 | case CEC_POWER_STATUS_IN_TRANSITION_ON_TO_STANDBY: | |
200 | return "in transition from on to standby"; | |
201 | case CEC_POWER_STATUS_IN_TRANSITION_STANDBY_TO_ON: | |
202 | return "in transition from standby to on"; | |
203 | default: | |
204 | return "unknown"; | |
205 | } | |
206 | } | |
207 | ||
208 | static const char *ToString(const cec_logical_address address) | |
209 | { | |
210 | switch(address) | |
211 | { | |
212 | case CECDEVICE_AUDIOSYSTEM: | |
213 | return "Audio"; | |
214 | case CECDEVICE_BROADCAST: | |
215 | return "Broadcast"; | |
216 | case CECDEVICE_FREEUSE: | |
217 | return "Free use"; | |
218 | case CECDEVICE_PLAYBACKDEVICE1: | |
219 | return "Playback 1"; | |
220 | case CECDEVICE_PLAYBACKDEVICE2: | |
221 | return "Playback 2"; | |
222 | case CECDEVICE_PLAYBACKDEVICE3: | |
223 | return "Playback 3"; | |
224 | case CECDEVICE_RECORDINGDEVICE1: | |
225 | return "Recorder 1"; | |
226 | case CECDEVICE_RECORDINGDEVICE2: | |
227 | return "Recorder 2"; | |
228 | case CECDEVICE_RECORDINGDEVICE3: | |
229 | return "Recorder 3"; | |
230 | case CECDEVICE_RESERVED1: | |
231 | return "Reserved 1"; | |
232 | case CECDEVICE_RESERVED2: | |
233 | return "Reserved 2"; | |
234 | case CECDEVICE_TUNER1: | |
235 | return "Tuner 1"; | |
236 | case CECDEVICE_TUNER2: | |
237 | return "Tuner 2"; | |
238 | case CECDEVICE_TUNER3: | |
239 | return "Tuner 3"; | |
240 | case CECDEVICE_TUNER4: | |
241 | return "Tuner 4"; | |
242 | case CECDEVICE_TV: | |
243 | return "TV"; | |
244 | default: | |
245 | return "unknown"; | |
246 | } | |
247 | } | |
248 | ||
249 | static const char *ToString(const cec_deck_control_mode mode) | |
250 | { | |
251 | switch (mode) | |
252 | { | |
253 | case CEC_DECK_CONTROL_MODE_SKIP_FORWARD_WIND: | |
254 | return "skip forward wind"; | |
255 | case CEC_DECK_CONTROL_MODE_EJECT: | |
256 | return "eject"; | |
257 | case CEC_DECK_CONTROL_MODE_SKIP_REVERSE_REWIND: | |
258 | return "reverse rewind"; | |
259 | case CEC_DECK_CONTROL_MODE_STOP: | |
260 | return "stop"; | |
261 | default: | |
262 | return "unknown"; | |
263 | } | |
264 | } | |
265 | ||
266 | static const char *ToString(const cec_deck_info status) | |
267 | { | |
268 | switch (status) | |
269 | { | |
270 | case CEC_DECK_INFO_PLAY: | |
271 | return "play"; | |
272 | case CEC_DECK_INFO_RECORD: | |
273 | return "record"; | |
274 | case CEC_DECK_INFO_PLAY_REVERSE: | |
275 | return "play reverse"; | |
276 | case CEC_DECK_INFO_STILL: | |
277 | return "still"; | |
278 | case CEC_DECK_INFO_SLOW: | |
279 | return "slow"; | |
280 | case CEC_DECK_INFO_SLOW_REVERSE: | |
281 | return "slow reverse"; | |
282 | case CEC_DECK_INFO_FAST_FORWARD: | |
283 | return "fast forward"; | |
284 | case CEC_DECK_INFO_FAST_REVERSE: | |
285 | return "fast reverse"; | |
286 | case CEC_DECK_INFO_NO_MEDIA: | |
287 | return "no media"; | |
288 | case CEC_DECK_INFO_STOP: | |
289 | return "stop"; | |
290 | case CEC_DECK_INFO_SKIP_FORWARD_WIND: | |
291 | return "info skip forward wind"; | |
292 | case CEC_DECK_INFO_SKIP_REVERSE_REWIND: | |
293 | return "info skip reverse rewind"; | |
294 | case CEC_DECK_INFO_INDEX_SEARCH_FORWARD: | |
295 | return "info index search forward"; | |
296 | case CEC_DECK_INFO_INDEX_SEARCH_REVERSE: | |
297 | return "info index search reverse"; | |
298 | case CEC_DECK_INFO_OTHER_STATUS: | |
299 | return "other"; | |
300 | case CEC_DECK_INFO_OTHER_STATUS_LG: | |
301 | return "LG other"; | |
302 | default: | |
303 | return "unknown"; | |
304 | } | |
305 | } | |
306 | ||
307 | static const char *ToString(const cec_opcode opcode) | |
308 | { | |
309 | switch (opcode) | |
310 | { | |
311 | case CEC_OPCODE_ACTIVE_SOURCE: | |
312 | return "active source"; | |
313 | case CEC_OPCODE_IMAGE_VIEW_ON: | |
314 | return "image view on"; | |
315 | case CEC_OPCODE_TEXT_VIEW_ON: | |
316 | return "text view on"; | |
317 | case CEC_OPCODE_INACTIVE_SOURCE: | |
318 | return "inactive source"; | |
319 | case CEC_OPCODE_REQUEST_ACTIVE_SOURCE: | |
320 | return "request active source"; | |
321 | case CEC_OPCODE_ROUTING_CHANGE: | |
322 | return "routing change"; | |
323 | case CEC_OPCODE_ROUTING_INFORMATION: | |
324 | return "routing information"; | |
325 | case CEC_OPCODE_SET_STREAM_PATH: | |
326 | return "set stream path"; | |
327 | case CEC_OPCODE_STANDBY: | |
328 | return "standby"; | |
329 | case CEC_OPCODE_RECORD_OFF: | |
330 | return "record off"; | |
331 | case CEC_OPCODE_RECORD_ON: | |
332 | return "record on"; | |
333 | case CEC_OPCODE_RECORD_STATUS: | |
334 | return "record status"; | |
335 | case CEC_OPCODE_RECORD_TV_SCREEN: | |
336 | return "record tv screen"; | |
337 | case CEC_OPCODE_CLEAR_ANALOGUE_TIMER: | |
338 | return "clear analogue timer"; | |
339 | case CEC_OPCODE_CLEAR_DIGITAL_TIMER: | |
340 | return "clear digital timer"; | |
341 | case CEC_OPCODE_CLEAR_EXTERNAL_TIMER: | |
342 | return "clear external timer"; | |
343 | case CEC_OPCODE_SET_ANALOGUE_TIMER: | |
344 | return "set analogue timer"; | |
345 | case CEC_OPCODE_SET_DIGITAL_TIMER: | |
346 | return "set digital timer"; | |
347 | case CEC_OPCODE_SET_EXTERNAL_TIMER: | |
348 | return "set external timer"; | |
349 | case CEC_OPCODE_SET_TIMER_PROGRAM_TITLE: | |
350 | return "set timer program title"; | |
351 | case CEC_OPCODE_TIMER_CLEARED_STATUS: | |
352 | return "timer cleared status"; | |
353 | case CEC_OPCODE_TIMER_STATUS: | |
354 | return "timer status"; | |
355 | case CEC_OPCODE_CEC_VERSION: | |
356 | return "cec version"; | |
357 | case CEC_OPCODE_GET_CEC_VERSION: | |
358 | return "get cec version"; | |
359 | case CEC_OPCODE_GIVE_PHYSICAL_ADDRESS: | |
360 | return "give physical address"; | |
361 | case CEC_OPCODE_GET_MENU_LANGUAGE: | |
362 | return "get menu language"; | |
363 | case CEC_OPCODE_REPORT_PHYSICAL_ADDRESS: | |
364 | return "report physical address"; | |
365 | case CEC_OPCODE_SET_MENU_LANGUAGE: | |
366 | return "set menu language"; | |
367 | case CEC_OPCODE_DECK_CONTROL: | |
368 | return "deck control"; | |
369 | case CEC_OPCODE_DECK_STATUS: | |
370 | return "deck status"; | |
371 | case CEC_OPCODE_GIVE_DECK_STATUS: | |
372 | return "give deck status"; | |
373 | case CEC_OPCODE_PLAY: | |
374 | return "play"; | |
375 | case CEC_OPCODE_GIVE_TUNER_DEVICE_STATUS: | |
376 | return "give tuner status"; | |
377 | case CEC_OPCODE_SELECT_ANALOGUE_SERVICE: | |
378 | return "select analogue service"; | |
379 | case CEC_OPCODE_SELECT_DIGITAL_SERVICE: | |
380 | return "set digital service"; | |
381 | case CEC_OPCODE_TUNER_DEVICE_STATUS: | |
382 | return "tuner device status"; | |
383 | case CEC_OPCODE_TUNER_STEP_DECREMENT: | |
384 | return "tuner step decrement"; | |
385 | case CEC_OPCODE_TUNER_STEP_INCREMENT: | |
386 | return "tuner step increment"; | |
387 | case CEC_OPCODE_DEVICE_VENDOR_ID: | |
388 | return "device vendor id"; | |
389 | case CEC_OPCODE_GIVE_DEVICE_VENDOR_ID: | |
390 | return "give device vendor id"; | |
391 | case CEC_OPCODE_VENDOR_COMMAND: | |
392 | return "vendor command"; | |
393 | case CEC_OPCODE_VENDOR_COMMAND_WITH_ID: | |
394 | return "vendor command with id"; | |
395 | case CEC_OPCODE_VENDOR_REMOTE_BUTTON_DOWN: | |
396 | return "vendor remote button down"; | |
397 | case CEC_OPCODE_VENDOR_REMOTE_BUTTON_UP: | |
398 | return "vendor remote button up"; | |
399 | case CEC_OPCODE_SET_OSD_STRING: | |
400 | return "set osd string"; | |
401 | case CEC_OPCODE_GIVE_OSD_NAME: | |
402 | return "give osd name"; | |
403 | case CEC_OPCODE_SET_OSD_NAME: | |
404 | return "set osd name"; | |
405 | case CEC_OPCODE_MENU_REQUEST: | |
406 | return "menu request"; | |
407 | case CEC_OPCODE_MENU_STATUS: | |
408 | return "menu status"; | |
409 | case CEC_OPCODE_USER_CONTROL_PRESSED: | |
410 | return "user control pressed"; | |
411 | case CEC_OPCODE_USER_CONTROL_RELEASE: | |
412 | return "user control release"; | |
413 | case CEC_OPCODE_GIVE_DEVICE_POWER_STATUS: | |
414 | return "give device power status"; | |
415 | case CEC_OPCODE_REPORT_POWER_STATUS: | |
416 | return "report power status"; | |
417 | case CEC_OPCODE_FEATURE_ABORT: | |
418 | return "feature abort"; | |
419 | case CEC_OPCODE_ABORT: | |
420 | return "abort"; | |
421 | case CEC_OPCODE_GIVE_AUDIO_STATUS: | |
422 | return "give audio status"; | |
423 | case CEC_OPCODE_GIVE_SYSTEM_AUDIO_MODE_STATUS: | |
424 | return "give audio mode status"; | |
425 | case CEC_OPCODE_REPORT_AUDIO_STATUS: | |
426 | return "report audio status"; | |
427 | case CEC_OPCODE_SET_SYSTEM_AUDIO_MODE: | |
428 | return "set system audio mode"; | |
429 | case CEC_OPCODE_SYSTEM_AUDIO_MODE_REQUEST: | |
430 | return "system audio mode request"; | |
431 | case CEC_OPCODE_SYSTEM_AUDIO_MODE_STATUS: | |
432 | return "system audio mode status"; | |
433 | case CEC_OPCODE_SET_AUDIO_RATE: | |
434 | return "set audio rate"; | |
435 | case CEC_OPCODE_START_ARC: | |
436 | return "start ARC"; | |
437 | case CEC_OPCODE_REPORT_ARC_STARTED: | |
438 | return "report ARC started"; | |
439 | case CEC_OPCODE_REPORT_ARC_ENDED: | |
440 | return "report ARC ended"; | |
441 | case CEC_OPCODE_REQUEST_ARC_START: | |
442 | return "request ARC start"; | |
443 | case CEC_OPCODE_REQUEST_ARC_END: | |
444 | return "request ARC end"; | |
445 | case CEC_OPCODE_END_ARC: | |
446 | return "end ARC"; | |
447 | case CEC_OPCODE_CDC: | |
448 | return "CDC"; | |
449 | case CEC_OPCODE_NONE: | |
450 | return "poll"; | |
451 | default: | |
452 | return "UNKNOWN"; | |
453 | } | |
454 | } | |
455 | ||
456 | static const char *ToString(const cec_system_audio_status mode) | |
457 | { | |
458 | switch(mode) | |
459 | { | |
460 | case CEC_SYSTEM_AUDIO_STATUS_ON: | |
461 | return "on"; | |
462 | case CEC_SYSTEM_AUDIO_STATUS_OFF: | |
463 | return "off"; | |
464 | default: | |
465 | return "unknown"; | |
466 | } | |
467 | } | |
468 | ||
469 | static const char *ToString(const cec_audio_status UNUSED(status)) | |
470 | { | |
471 | // TODO this is a mask | |
472 | return "TODO"; | |
473 | } | |
474 | ||
475 | static const char *ToString(const cec_vendor_id vendor) | |
476 | { | |
477 | switch (vendor) | |
478 | { | |
479 | case CEC_VENDOR_SAMSUNG: | |
480 | return "Samsung"; | |
481 | case CEC_VENDOR_LG: | |
482 | return "LG"; | |
483 | case CEC_VENDOR_PANASONIC: | |
484 | return "Panasonic"; | |
485 | case CEC_VENDOR_PIONEER: | |
486 | return "Pioneer"; | |
487 | case CEC_VENDOR_ONKYO: | |
488 | return "Onkyo"; | |
489 | case CEC_VENDOR_YAMAHA: | |
490 | return "Yamaha"; | |
491 | case CEC_VENDOR_PHILIPS: | |
492 | return "Philips"; | |
493 | case CEC_VENDOR_SONY: | |
494 | return "Sony"; | |
495 | case CEC_VENDOR_TOSHIBA: | |
a6aecece | 496 | case CEC_VENDOR_TOSHIBA2: |
0d800fe5 | 497 | return "Toshiba"; |
23d38eec LOK |
498 | case CEC_VENDOR_AKAI: |
499 | return "Akai"; | |
500 | case CEC_VENDOR_AOC: | |
501 | return "AOC"; | |
502 | case CEC_VENDOR_BENQ: | |
503 | return "Benq"; | |
504 | case CEC_VENDOR_DAEWOO: | |
505 | return "Daewoo"; | |
506 | case CEC_VENDOR_GRUNDIG: | |
507 | return "Grundig"; | |
508 | case CEC_VENDOR_MEDION: | |
509 | return "Medion"; | |
510 | case CEC_VENDOR_SHARP: | |
511 | return "Sharp"; | |
512 | case CEC_VENDOR_VIZIO: | |
513 | return "Vizio"; | |
2b44051c LOK |
514 | case CEC_VENDOR_BROADCOM: |
515 | return "Broadcom"; | |
9cd871e3 | 516 | case CEC_VENDOR_LOEWE: |
517 | return "Loewe"; | |
a5a5f6f5 LOK |
518 | case CEC_VENDOR_DENON: |
519 | return "Denon"; | |
461f1270 LOK |
520 | case CEC_VENDOR_MARANTZ: |
521 | return "Marantz"; | |
ac03cf27 | 522 | case CEC_VENDOR_HARMAN_KARDON: |
4f504673 | 523 | case CEC_VENDOR_HARMAN_KARDON2: |
ac03cf27 | 524 | return "Harman/Kardon"; |
8fb02873 LOK |
525 | case CEC_VENDOR_PULSE_EIGHT: |
526 | return "Pulse Eight"; | |
0d800fe5 LOK |
527 | default: |
528 | return "Unknown"; | |
529 | } | |
530 | } | |
531 | ||
532 | static const char *ToString(const cec_client_version version) | |
533 | { | |
534 | switch (version) | |
535 | { | |
536 | case CEC_CLIENT_VERSION_PRE_1_5: | |
537 | return "pre-1.5"; | |
538 | case CEC_CLIENT_VERSION_1_5_0: | |
539 | return "1.5.0"; | |
540 | case CEC_CLIENT_VERSION_1_5_1: | |
541 | return "1.5.1"; | |
542 | case CEC_CLIENT_VERSION_1_5_2: | |
543 | return "1.5.2"; | |
544 | case CEC_CLIENT_VERSION_1_5_3: | |
545 | return "1.5.3"; | |
546 | case CEC_CLIENT_VERSION_1_6_0: | |
547 | return "1.6.0"; | |
548 | case CEC_CLIENT_VERSION_1_6_1: | |
549 | return "1.6.1"; | |
550 | case CEC_CLIENT_VERSION_1_6_2: | |
551 | return "1.6.2"; | |
552 | case CEC_CLIENT_VERSION_1_6_3: | |
553 | return "1.6.3"; | |
0a61dc24 LOK |
554 | case CEC_CLIENT_VERSION_1_7_0: |
555 | return "1.7.0"; | |
92eea1e7 LOK |
556 | case CEC_CLIENT_VERSION_1_7_1: |
557 | return "1.7.1"; | |
2b44051c LOK |
558 | case CEC_CLIENT_VERSION_1_7_2: |
559 | return "1.7.2"; | |
560 | case CEC_CLIENT_VERSION_1_8_0: | |
561 | return "1.8.0"; | |
7e316a2f LOK |
562 | case CEC_CLIENT_VERSION_1_8_1: |
563 | return "1.8.1"; | |
2d418322 LOK |
564 | case CEC_CLIENT_VERSION_1_8_2: |
565 | return "1.8.2"; | |
1664420d LOK |
566 | case CEC_CLIENT_VERSION_1_9_0: |
567 | return "1.9.0"; | |
f81c0652 LOK |
568 | case CEC_CLIENT_VERSION_1_99_0: |
569 | return "2.0.0-pre"; | |
999665e3 LOK |
570 | case CEC_CLIENT_VERSION_2_0_0: |
571 | return "2.0.0"; | |
20fd14a9 LOK |
572 | case CEC_CLIENT_VERSION_2_0_1: |
573 | return "2.0.1"; | |
784a6a79 LOK |
574 | case CEC_CLIENT_VERSION_2_0_2: |
575 | return "2.0.2"; | |
83715833 LOK |
576 | case CEC_CLIENT_VERSION_2_0_3: |
577 | return "2.0.3"; | |
0c271bd0 LOK |
578 | case CEC_CLIENT_VERSION_2_0_4: |
579 | return "2.0.4"; | |
ac3f9901 LOK |
580 | case CEC_CLIENT_VERSION_2_0_5: |
581 | return "2.0.5"; | |
9b56a19a LOK |
582 | case CEC_CLIENT_VERSION_2_1_0: |
583 | return "2.1.0"; | |
331d659e LOK |
584 | case CEC_CLIENT_VERSION_2_1_1: |
585 | return "2.1.1"; | |
b53bfc2d LOK |
586 | case CEC_CLIENT_VERSION_2_1_2: |
587 | return "2.1.2"; | |
588 | case CEC_CLIENT_VERSION_2_1_3: | |
589 | return "2.1.3"; | |
7cb1f563 LOK |
590 | case CEC_CLIENT_VERSION_2_1_4: |
591 | return "2.1.4"; | |
b5d801b8 LOK |
592 | case CEC_CLIENT_VERSION_2_2_0: |
593 | return "2.2.0"; | |
0d800fe5 LOK |
594 | default: |
595 | return "Unknown"; | |
596 | } | |
597 | } | |
598 | ||
599 | static const char *ToString(const cec_server_version version) | |
600 | { | |
601 | switch (version) | |
602 | { | |
603 | case CEC_SERVER_VERSION_PRE_1_5: | |
604 | return "pre-1.5"; | |
605 | case CEC_SERVER_VERSION_1_5_0: | |
606 | return "1.5.0"; | |
607 | case CEC_SERVER_VERSION_1_5_1: | |
608 | return "1.5.1"; | |
609 | case CEC_SERVER_VERSION_1_5_2: | |
610 | return "1.5.2"; | |
611 | case CEC_SERVER_VERSION_1_5_3: | |
612 | return "1.5.3"; | |
613 | case CEC_SERVER_VERSION_1_6_0: | |
614 | return "1.6.0"; | |
615 | case CEC_SERVER_VERSION_1_6_1: | |
616 | return "1.6.1"; | |
617 | case CEC_SERVER_VERSION_1_6_2: | |
618 | return "1.6.2"; | |
619 | case CEC_SERVER_VERSION_1_6_3: | |
620 | return "1.6.3"; | |
0a61dc24 LOK |
621 | case CEC_SERVER_VERSION_1_7_0: |
622 | return "1.7.0"; | |
92eea1e7 LOK |
623 | case CEC_SERVER_VERSION_1_7_1: |
624 | return "1.7.1"; | |
2b44051c LOK |
625 | case CEC_SERVER_VERSION_1_7_2: |
626 | return "1.7.2"; | |
627 | case CEC_SERVER_VERSION_1_8_0: | |
628 | return "1.8.0"; | |
7e316a2f LOK |
629 | case CEC_SERVER_VERSION_1_8_1: |
630 | return "1.8.1"; | |
2d418322 LOK |
631 | case CEC_SERVER_VERSION_1_8_2: |
632 | return "1.8.2"; | |
1664420d LOK |
633 | case CEC_SERVER_VERSION_1_9_0: |
634 | return "1.9.0"; | |
f81c0652 LOK |
635 | case CEC_SERVER_VERSION_1_99_0: |
636 | return "2.0.0-pre"; | |
784a6a79 | 637 | case CEC_SERVER_VERSION_2_0_0: |
999665e3 | 638 | return "2.0.0"; |
784a6a79 | 639 | case CEC_SERVER_VERSION_2_0_1: |
20fd14a9 | 640 | return "2.0.1"; |
784a6a79 LOK |
641 | case CEC_SERVER_VERSION_2_0_2: |
642 | return "2.0.2"; | |
83715833 LOK |
643 | case CEC_SERVER_VERSION_2_0_3: |
644 | return "2.0.3"; | |
0c271bd0 LOK |
645 | case CEC_SERVER_VERSION_2_0_4: |
646 | return "2.0.4"; | |
ac3f9901 LOK |
647 | case CEC_SERVER_VERSION_2_0_5: |
648 | return "2.0.5"; | |
9b56a19a LOK |
649 | case CEC_SERVER_VERSION_2_1_0: |
650 | return "2.1.0"; | |
331d659e LOK |
651 | case CEC_SERVER_VERSION_2_1_1: |
652 | return "2.1.1"; | |
b53bfc2d LOK |
653 | case CEC_SERVER_VERSION_2_1_2: |
654 | return "2.1.2"; | |
655 | case CEC_SERVER_VERSION_2_1_3: | |
656 | return "2.1.3"; | |
7cb1f563 LOK |
657 | case CEC_SERVER_VERSION_2_1_4: |
658 | return "2.1.4"; | |
b5d801b8 LOK |
659 | case CEC_SERVER_VERSION_2_2_0: |
660 | return "2.2.0"; | |
0d800fe5 LOK |
661 | default: |
662 | return "Unknown"; | |
663 | } | |
664 | } | |
9a54dc82 LOK |
665 | |
666 | static const char *ToString(const cec_abort_reason reason) | |
667 | { | |
668 | switch(reason) | |
669 | { | |
670 | case CEC_ABORT_REASON_UNRECOGNIZED_OPCODE: | |
671 | return "unrecognised opcode"; | |
672 | case CEC_ABORT_REASON_NOT_IN_CORRECT_MODE_TO_RESPOND: | |
673 | return "not in correct mode to respond"; | |
674 | case CEC_ABORT_REASON_CANNOT_PROVIDE_SOURCE: | |
675 | return "cannot provide source"; | |
676 | case CEC_ABORT_REASON_INVALID_OPERAND: | |
677 | return "invalid operand"; | |
678 | case CEC_ABORT_REASON_REFUSED: | |
679 | return "refused"; | |
680 | default: | |
681 | return "unknown"; | |
682 | } | |
683 | } | |
2b44051c LOK |
684 | |
685 | static const char *ToString(const cec_user_control_code key) | |
686 | { | |
687 | switch (key) | |
688 | { | |
689 | case CEC_USER_CONTROL_CODE_SELECT: | |
690 | return "select"; | |
691 | case CEC_USER_CONTROL_CODE_UP: | |
692 | return "up"; | |
693 | case CEC_USER_CONTROL_CODE_DOWN: | |
694 | return "down"; | |
695 | case CEC_USER_CONTROL_CODE_LEFT: | |
696 | return "left"; | |
697 | case CEC_USER_CONTROL_CODE_RIGHT: | |
698 | return "right"; | |
699 | case CEC_USER_CONTROL_CODE_RIGHT_UP: | |
700 | return "right+up"; | |
701 | case CEC_USER_CONTROL_CODE_RIGHT_DOWN: | |
702 | return "right+down"; | |
703 | case CEC_USER_CONTROL_CODE_LEFT_UP: | |
704 | return "left+up"; | |
705 | case CEC_USER_CONTROL_CODE_LEFT_DOWN: | |
706 | return "left+down"; | |
707 | case CEC_USER_CONTROL_CODE_ROOT_MENU: | |
708 | return "root menu"; | |
709 | case CEC_USER_CONTROL_CODE_SETUP_MENU: | |
710 | return "setup menu"; | |
711 | case CEC_USER_CONTROL_CODE_CONTENTS_MENU: | |
712 | return "contents menu"; | |
713 | case CEC_USER_CONTROL_CODE_FAVORITE_MENU: | |
714 | return "favourite menu"; | |
715 | case CEC_USER_CONTROL_CODE_EXIT: | |
716 | return "exit"; | |
bc258169 KS |
717 | case CEC_USER_CONTROL_CODE_TOP_MENU: |
718 | return "top menu"; | |
719 | case CEC_USER_CONTROL_CODE_DVD_MENU: | |
720 | return "dvd menu"; | |
721 | case CEC_USER_CONTROL_CODE_NUMBER_ENTRY_MODE: | |
722 | return "number entry mode"; | |
723 | case CEC_USER_CONTROL_CODE_NUMBER11: | |
724 | return "11"; | |
725 | case CEC_USER_CONTROL_CODE_NUMBER12: | |
726 | return "12"; | |
2b44051c LOK |
727 | case CEC_USER_CONTROL_CODE_NUMBER0: |
728 | return "0"; | |
729 | case CEC_USER_CONTROL_CODE_NUMBER1: | |
730 | return "1"; | |
731 | case CEC_USER_CONTROL_CODE_NUMBER2: | |
732 | return "2"; | |
733 | case CEC_USER_CONTROL_CODE_NUMBER3: | |
734 | return "3"; | |
735 | case CEC_USER_CONTROL_CODE_NUMBER4: | |
736 | return "4"; | |
737 | case CEC_USER_CONTROL_CODE_NUMBER5: | |
738 | return "5"; | |
739 | case CEC_USER_CONTROL_CODE_NUMBER6: | |
740 | return "6"; | |
741 | case CEC_USER_CONTROL_CODE_NUMBER7: | |
742 | return "7"; | |
743 | case CEC_USER_CONTROL_CODE_NUMBER8: | |
744 | return "8"; | |
745 | case CEC_USER_CONTROL_CODE_NUMBER9: | |
746 | return "9"; | |
747 | case CEC_USER_CONTROL_CODE_DOT: | |
748 | return "."; | |
749 | case CEC_USER_CONTROL_CODE_ENTER: | |
750 | return "enter"; | |
751 | case CEC_USER_CONTROL_CODE_CLEAR: | |
752 | return "clear"; | |
753 | case CEC_USER_CONTROL_CODE_NEXT_FAVORITE: | |
754 | return "next favourite"; | |
755 | case CEC_USER_CONTROL_CODE_CHANNEL_UP: | |
756 | return "channel up"; | |
757 | case CEC_USER_CONTROL_CODE_CHANNEL_DOWN: | |
758 | return "channel down"; | |
759 | case CEC_USER_CONTROL_CODE_PREVIOUS_CHANNEL: | |
760 | return "previous channel"; | |
761 | case CEC_USER_CONTROL_CODE_SOUND_SELECT: | |
762 | return "sound select"; | |
763 | case CEC_USER_CONTROL_CODE_INPUT_SELECT: | |
764 | return "input select"; | |
765 | case CEC_USER_CONTROL_CODE_DISPLAY_INFORMATION: | |
766 | return "display information"; | |
767 | case CEC_USER_CONTROL_CODE_HELP: | |
768 | return "help"; | |
769 | case CEC_USER_CONTROL_CODE_PAGE_UP: | |
770 | return "page up"; | |
771 | case CEC_USER_CONTROL_CODE_PAGE_DOWN: | |
772 | return "page down"; | |
773 | case CEC_USER_CONTROL_CODE_POWER: | |
774 | return "power"; | |
775 | case CEC_USER_CONTROL_CODE_VOLUME_UP: | |
776 | return "volume up"; | |
777 | case CEC_USER_CONTROL_CODE_VOLUME_DOWN: | |
778 | return "volume down"; | |
779 | case CEC_USER_CONTROL_CODE_MUTE: | |
780 | return "mute"; | |
781 | case CEC_USER_CONTROL_CODE_PLAY: | |
782 | return "play"; | |
783 | case CEC_USER_CONTROL_CODE_STOP: | |
784 | return "stop"; | |
785 | case CEC_USER_CONTROL_CODE_PAUSE: | |
786 | return "pause"; | |
787 | case CEC_USER_CONTROL_CODE_RECORD: | |
788 | return "record"; | |
789 | case CEC_USER_CONTROL_CODE_REWIND: | |
790 | return "rewind"; | |
791 | case CEC_USER_CONTROL_CODE_FAST_FORWARD: | |
792 | return "Fast forward"; | |
793 | case CEC_USER_CONTROL_CODE_EJECT: | |
794 | return "eject"; | |
795 | case CEC_USER_CONTROL_CODE_FORWARD: | |
796 | return "forward"; | |
797 | case CEC_USER_CONTROL_CODE_BACKWARD: | |
798 | return "backward"; | |
799 | case CEC_USER_CONTROL_CODE_STOP_RECORD: | |
800 | return "stop record"; | |
801 | case CEC_USER_CONTROL_CODE_PAUSE_RECORD: | |
802 | return "pause record"; | |
803 | case CEC_USER_CONTROL_CODE_ANGLE: | |
804 | return "angle"; | |
805 | case CEC_USER_CONTROL_CODE_SUB_PICTURE: | |
806 | return "sub picture"; | |
807 | case CEC_USER_CONTROL_CODE_VIDEO_ON_DEMAND: | |
808 | return "video on demand"; | |
809 | case CEC_USER_CONTROL_CODE_ELECTRONIC_PROGRAM_GUIDE: | |
810 | return "electronic program guide"; | |
811 | case CEC_USER_CONTROL_CODE_TIMER_PROGRAMMING: | |
812 | return "timer programming"; | |
813 | case CEC_USER_CONTROL_CODE_INITIAL_CONFIGURATION: | |
814 | return "initial configuration"; | |
bc258169 KS |
815 | case CEC_USER_CONTROL_CODE_SELECT_BROADCAST_TYPE: |
816 | return "select broadcast type"; | |
817 | case CEC_USER_CONTROL_CODE_SELECT_SOUND_PRESENTATION: | |
818 | return "select sound presentation"; | |
2b44051c LOK |
819 | case CEC_USER_CONTROL_CODE_PLAY_FUNCTION: |
820 | return "play (function)"; | |
821 | case CEC_USER_CONTROL_CODE_PAUSE_PLAY_FUNCTION: | |
822 | return "pause play (function)"; | |
823 | case CEC_USER_CONTROL_CODE_RECORD_FUNCTION: | |
824 | return "record (function)"; | |
825 | case CEC_USER_CONTROL_CODE_PAUSE_RECORD_FUNCTION: | |
826 | return "pause record (function)"; | |
827 | case CEC_USER_CONTROL_CODE_STOP_FUNCTION: | |
828 | return "stop (function)"; | |
829 | case CEC_USER_CONTROL_CODE_MUTE_FUNCTION: | |
830 | return "mute (function)"; | |
831 | case CEC_USER_CONTROL_CODE_RESTORE_VOLUME_FUNCTION: | |
832 | return "restore volume"; | |
833 | case CEC_USER_CONTROL_CODE_TUNE_FUNCTION: | |
834 | return "tune"; | |
835 | case CEC_USER_CONTROL_CODE_SELECT_MEDIA_FUNCTION: | |
836 | return "select media"; | |
837 | case CEC_USER_CONTROL_CODE_SELECT_AV_INPUT_FUNCTION: | |
838 | return "select AV input"; | |
839 | case CEC_USER_CONTROL_CODE_SELECT_AUDIO_INPUT_FUNCTION: | |
840 | return "select audio input"; | |
841 | case CEC_USER_CONTROL_CODE_POWER_TOGGLE_FUNCTION: | |
842 | return "power toggle"; | |
843 | case CEC_USER_CONTROL_CODE_POWER_OFF_FUNCTION: | |
844 | return "power off"; | |
845 | case CEC_USER_CONTROL_CODE_POWER_ON_FUNCTION: | |
846 | return "power on"; | |
847 | case CEC_USER_CONTROL_CODE_F1_BLUE: | |
848 | return "F1 (blue)"; | |
849 | case CEC_USER_CONTROL_CODE_F2_RED: | |
850 | return "F2 (red)"; | |
851 | case CEC_USER_CONTROL_CODE_F3_GREEN: | |
852 | return "F3 (green)"; | |
853 | case CEC_USER_CONTROL_CODE_F4_YELLOW: | |
854 | return "F4 (yellow)"; | |
855 | case CEC_USER_CONTROL_CODE_F5: | |
856 | return "F5"; | |
857 | case CEC_USER_CONTROL_CODE_DATA: | |
858 | return "data"; | |
859 | case CEC_USER_CONTROL_CODE_AN_RETURN: | |
860 | return "return (Samsung)"; | |
861 | case CEC_USER_CONTROL_CODE_AN_CHANNELS_LIST: | |
862 | return "channels list (Samsung)"; | |
863 | default: | |
864 | return "unknown"; | |
865 | } | |
866 | } | |
2d418322 LOK |
867 | |
868 | static const char *ToString(const cec_adapter_type type) | |
869 | { | |
870 | switch (type) | |
871 | { | |
872 | case ADAPTERTYPE_P8_EXTERNAL: | |
873 | return "Pulse-Eight USB-CEC Adapter"; | |
874 | case ADAPTERTYPE_P8_DAUGHTERBOARD: | |
875 | return "Pulse-Eight USB-CEC Daughterboard"; | |
876 | case ADAPTERTYPE_RPI: | |
877 | return "Raspberry Pi"; | |
51b611bc | 878 | case ADAPTERTYPE_TDA995x: |
879 | return "TDA995x"; | |
2d418322 LOK |
880 | default: |
881 | return "unknown"; | |
882 | } | |
883 | } | |
6acb9c0b LOK |
884 | |
885 | static bool PhysicalAddressIsIncluded(uint16_t iParent, uint16_t iChild) | |
886 | { | |
887 | for (int iPtr = 3; iPtr >= 0; iPtr--) | |
888 | { | |
889 | if (((iParent >> 4*iPtr) & 0xF) > 0 && | |
890 | ((iParent >> 4*iPtr) & 0xF) != ((iChild >> 4*iPtr) & 0xF)) | |
891 | return false; | |
892 | } | |
893 | return true; | |
894 | } | |
8187ac5f LOK |
895 | |
896 | static CStdString ToString(const cec_command& command) | |
897 | { | |
898 | CStdString dataStr; | |
899 | dataStr.Format(">> %1x%1x", command.initiator, command.destination); | |
900 | if (command.opcode_set == 1) | |
901 | dataStr.AppendFormat(":%02x", command.opcode); | |
902 | for (uint8_t iPtr = 0; iPtr < command.parameters.size; iPtr++) | |
903 | dataStr.AppendFormat(":%02x", (unsigned int)command.parameters[iPtr]); | |
904 | return dataStr; | |
905 | } | |
0d800fe5 LOK |
906 | }; |
907 | } |