Added support for user control codes TOP_MENU, DVD_MENU, SELECT_BROADCAST_TYPE, SELEC...
[deb_libcec.git] / src / lib / CECTypeUtils.h
1 #pragma once
2 /*
3 * This file is part of the libCEC(R) library.
4 *
5 * libCEC(R) is Copyright (C) 2011-2013 Pulse-Eight Limited. All rights reserved.
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
34 #include "lib/platform/util/StdString.h"
35
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:
496 case CEC_VENDOR_TOSHIBA2:
497 return "Toshiba";
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";
514 case CEC_VENDOR_BROADCOM:
515 return "Broadcom";
516 case CEC_VENDOR_LOEWE:
517 return "Loewe";
518 case CEC_VENDOR_DENON:
519 return "Denon";
520 case CEC_VENDOR_MARANTZ:
521 return "Marantz";
522 case CEC_VENDOR_HARMAN_KARDON:
523 return "Harman/Kardon";
524 case CEC_VENDOR_PULSE_EIGHT:
525 return "Pulse Eight";
526 default:
527 return "Unknown";
528 }
529 }
530
531 static const char *ToString(const cec_client_version version)
532 {
533 switch (version)
534 {
535 case CEC_CLIENT_VERSION_PRE_1_5:
536 return "pre-1.5";
537 case CEC_CLIENT_VERSION_1_5_0:
538 return "1.5.0";
539 case CEC_CLIENT_VERSION_1_5_1:
540 return "1.5.1";
541 case CEC_CLIENT_VERSION_1_5_2:
542 return "1.5.2";
543 case CEC_CLIENT_VERSION_1_5_3:
544 return "1.5.3";
545 case CEC_CLIENT_VERSION_1_6_0:
546 return "1.6.0";
547 case CEC_CLIENT_VERSION_1_6_1:
548 return "1.6.1";
549 case CEC_CLIENT_VERSION_1_6_2:
550 return "1.6.2";
551 case CEC_CLIENT_VERSION_1_6_3:
552 return "1.6.3";
553 case CEC_CLIENT_VERSION_1_7_0:
554 return "1.7.0";
555 case CEC_CLIENT_VERSION_1_7_1:
556 return "1.7.1";
557 case CEC_CLIENT_VERSION_1_7_2:
558 return "1.7.2";
559 case CEC_CLIENT_VERSION_1_8_0:
560 return "1.8.0";
561 case CEC_CLIENT_VERSION_1_8_1:
562 return "1.8.1";
563 case CEC_CLIENT_VERSION_1_8_2:
564 return "1.8.2";
565 case CEC_CLIENT_VERSION_1_9_0:
566 return "1.9.0";
567 case CEC_CLIENT_VERSION_1_99_0:
568 return "2.0.0-pre";
569 case CEC_CLIENT_VERSION_2_0_0:
570 return "2.0.0";
571 case CEC_CLIENT_VERSION_2_0_1:
572 return "2.0.1";
573 case CEC_CLIENT_VERSION_2_0_2:
574 return "2.0.2";
575 case CEC_CLIENT_VERSION_2_0_3:
576 return "2.0.3";
577 case CEC_CLIENT_VERSION_2_0_4:
578 return "2.0.4";
579 case CEC_CLIENT_VERSION_2_0_5:
580 return "2.0.5";
581 case CEC_CLIENT_VERSION_2_1_0:
582 return "2.1.0";
583 case CEC_CLIENT_VERSION_2_1_1:
584 return "2.1.1";
585 case CEC_CLIENT_VERSION_2_1_2:
586 return "2.1.2";
587 case CEC_CLIENT_VERSION_2_1_3:
588 return "2.1.3";
589 case CEC_CLIENT_VERSION_2_1_4:
590 return "2.1.4";
591 default:
592 return "Unknown";
593 }
594 }
595
596 static const char *ToString(const cec_server_version version)
597 {
598 switch (version)
599 {
600 case CEC_SERVER_VERSION_PRE_1_5:
601 return "pre-1.5";
602 case CEC_SERVER_VERSION_1_5_0:
603 return "1.5.0";
604 case CEC_SERVER_VERSION_1_5_1:
605 return "1.5.1";
606 case CEC_SERVER_VERSION_1_5_2:
607 return "1.5.2";
608 case CEC_SERVER_VERSION_1_5_3:
609 return "1.5.3";
610 case CEC_SERVER_VERSION_1_6_0:
611 return "1.6.0";
612 case CEC_SERVER_VERSION_1_6_1:
613 return "1.6.1";
614 case CEC_SERVER_VERSION_1_6_2:
615 return "1.6.2";
616 case CEC_SERVER_VERSION_1_6_3:
617 return "1.6.3";
618 case CEC_SERVER_VERSION_1_7_0:
619 return "1.7.0";
620 case CEC_SERVER_VERSION_1_7_1:
621 return "1.7.1";
622 case CEC_SERVER_VERSION_1_7_2:
623 return "1.7.2";
624 case CEC_SERVER_VERSION_1_8_0:
625 return "1.8.0";
626 case CEC_SERVER_VERSION_1_8_1:
627 return "1.8.1";
628 case CEC_SERVER_VERSION_1_8_2:
629 return "1.8.2";
630 case CEC_SERVER_VERSION_1_9_0:
631 return "1.9.0";
632 case CEC_SERVER_VERSION_1_99_0:
633 return "2.0.0-pre";
634 case CEC_SERVER_VERSION_2_0_0:
635 return "2.0.0";
636 case CEC_SERVER_VERSION_2_0_1:
637 return "2.0.1";
638 case CEC_SERVER_VERSION_2_0_2:
639 return "2.0.2";
640 case CEC_SERVER_VERSION_2_0_3:
641 return "2.0.3";
642 case CEC_SERVER_VERSION_2_0_4:
643 return "2.0.4";
644 case CEC_SERVER_VERSION_2_0_5:
645 return "2.0.5";
646 case CEC_SERVER_VERSION_2_1_0:
647 return "2.1.0";
648 case CEC_SERVER_VERSION_2_1_1:
649 return "2.1.1";
650 case CEC_SERVER_VERSION_2_1_2:
651 return "2.1.2";
652 case CEC_SERVER_VERSION_2_1_3:
653 return "2.1.3";
654 case CEC_SERVER_VERSION_2_1_4:
655 return "2.1.4";
656 default:
657 return "Unknown";
658 }
659 }
660
661 static const char *ToString(const cec_abort_reason reason)
662 {
663 switch(reason)
664 {
665 case CEC_ABORT_REASON_UNRECOGNIZED_OPCODE:
666 return "unrecognised opcode";
667 case CEC_ABORT_REASON_NOT_IN_CORRECT_MODE_TO_RESPOND:
668 return "not in correct mode to respond";
669 case CEC_ABORT_REASON_CANNOT_PROVIDE_SOURCE:
670 return "cannot provide source";
671 case CEC_ABORT_REASON_INVALID_OPERAND:
672 return "invalid operand";
673 case CEC_ABORT_REASON_REFUSED:
674 return "refused";
675 default:
676 return "unknown";
677 }
678 }
679
680 static const char *ToString(const cec_user_control_code key)
681 {
682 switch (key)
683 {
684 case CEC_USER_CONTROL_CODE_SELECT:
685 return "select";
686 case CEC_USER_CONTROL_CODE_UP:
687 return "up";
688 case CEC_USER_CONTROL_CODE_DOWN:
689 return "down";
690 case CEC_USER_CONTROL_CODE_LEFT:
691 return "left";
692 case CEC_USER_CONTROL_CODE_RIGHT:
693 return "right";
694 case CEC_USER_CONTROL_CODE_RIGHT_UP:
695 return "right+up";
696 case CEC_USER_CONTROL_CODE_RIGHT_DOWN:
697 return "right+down";
698 case CEC_USER_CONTROL_CODE_LEFT_UP:
699 return "left+up";
700 case CEC_USER_CONTROL_CODE_LEFT_DOWN:
701 return "left+down";
702 case CEC_USER_CONTROL_CODE_ROOT_MENU:
703 return "root menu";
704 case CEC_USER_CONTROL_CODE_SETUP_MENU:
705 return "setup menu";
706 case CEC_USER_CONTROL_CODE_CONTENTS_MENU:
707 return "contents menu";
708 case CEC_USER_CONTROL_CODE_FAVORITE_MENU:
709 return "favourite menu";
710 case CEC_USER_CONTROL_CODE_EXIT:
711 return "exit";
712 case CEC_USER_CONTROL_CODE_TOP_MENU:
713 return "top menu";
714 case CEC_USER_CONTROL_CODE_DVD_MENU:
715 return "dvd menu";
716 case CEC_USER_CONTROL_CODE_NUMBER_ENTRY_MODE:
717 return "number entry mode";
718 case CEC_USER_CONTROL_CODE_NUMBER11:
719 return "11";
720 case CEC_USER_CONTROL_CODE_NUMBER12:
721 return "12";
722 case CEC_USER_CONTROL_CODE_NUMBER0:
723 return "0";
724 case CEC_USER_CONTROL_CODE_NUMBER1:
725 return "1";
726 case CEC_USER_CONTROL_CODE_NUMBER2:
727 return "2";
728 case CEC_USER_CONTROL_CODE_NUMBER3:
729 return "3";
730 case CEC_USER_CONTROL_CODE_NUMBER4:
731 return "4";
732 case CEC_USER_CONTROL_CODE_NUMBER5:
733 return "5";
734 case CEC_USER_CONTROL_CODE_NUMBER6:
735 return "6";
736 case CEC_USER_CONTROL_CODE_NUMBER7:
737 return "7";
738 case CEC_USER_CONTROL_CODE_NUMBER8:
739 return "8";
740 case CEC_USER_CONTROL_CODE_NUMBER9:
741 return "9";
742 case CEC_USER_CONTROL_CODE_DOT:
743 return ".";
744 case CEC_USER_CONTROL_CODE_ENTER:
745 return "enter";
746 case CEC_USER_CONTROL_CODE_CLEAR:
747 return "clear";
748 case CEC_USER_CONTROL_CODE_NEXT_FAVORITE:
749 return "next favourite";
750 case CEC_USER_CONTROL_CODE_CHANNEL_UP:
751 return "channel up";
752 case CEC_USER_CONTROL_CODE_CHANNEL_DOWN:
753 return "channel down";
754 case CEC_USER_CONTROL_CODE_PREVIOUS_CHANNEL:
755 return "previous channel";
756 case CEC_USER_CONTROL_CODE_SOUND_SELECT:
757 return "sound select";
758 case CEC_USER_CONTROL_CODE_INPUT_SELECT:
759 return "input select";
760 case CEC_USER_CONTROL_CODE_DISPLAY_INFORMATION:
761 return "display information";
762 case CEC_USER_CONTROL_CODE_HELP:
763 return "help";
764 case CEC_USER_CONTROL_CODE_PAGE_UP:
765 return "page up";
766 case CEC_USER_CONTROL_CODE_PAGE_DOWN:
767 return "page down";
768 case CEC_USER_CONTROL_CODE_POWER:
769 return "power";
770 case CEC_USER_CONTROL_CODE_VOLUME_UP:
771 return "volume up";
772 case CEC_USER_CONTROL_CODE_VOLUME_DOWN:
773 return "volume down";
774 case CEC_USER_CONTROL_CODE_MUTE:
775 return "mute";
776 case CEC_USER_CONTROL_CODE_PLAY:
777 return "play";
778 case CEC_USER_CONTROL_CODE_STOP:
779 return "stop";
780 case CEC_USER_CONTROL_CODE_PAUSE:
781 return "pause";
782 case CEC_USER_CONTROL_CODE_RECORD:
783 return "record";
784 case CEC_USER_CONTROL_CODE_REWIND:
785 return "rewind";
786 case CEC_USER_CONTROL_CODE_FAST_FORWARD:
787 return "Fast forward";
788 case CEC_USER_CONTROL_CODE_EJECT:
789 return "eject";
790 case CEC_USER_CONTROL_CODE_FORWARD:
791 return "forward";
792 case CEC_USER_CONTROL_CODE_BACKWARD:
793 return "backward";
794 case CEC_USER_CONTROL_CODE_STOP_RECORD:
795 return "stop record";
796 case CEC_USER_CONTROL_CODE_PAUSE_RECORD:
797 return "pause record";
798 case CEC_USER_CONTROL_CODE_ANGLE:
799 return "angle";
800 case CEC_USER_CONTROL_CODE_SUB_PICTURE:
801 return "sub picture";
802 case CEC_USER_CONTROL_CODE_VIDEO_ON_DEMAND:
803 return "video on demand";
804 case CEC_USER_CONTROL_CODE_ELECTRONIC_PROGRAM_GUIDE:
805 return "electronic program guide";
806 case CEC_USER_CONTROL_CODE_TIMER_PROGRAMMING:
807 return "timer programming";
808 case CEC_USER_CONTROL_CODE_INITIAL_CONFIGURATION:
809 return "initial configuration";
810 case CEC_USER_CONTROL_CODE_SELECT_BROADCAST_TYPE:
811 return "select broadcast type";
812 case CEC_USER_CONTROL_CODE_SELECT_SOUND_PRESENTATION:
813 return "select sound presentation";
814 case CEC_USER_CONTROL_CODE_PLAY_FUNCTION:
815 return "play (function)";
816 case CEC_USER_CONTROL_CODE_PAUSE_PLAY_FUNCTION:
817 return "pause play (function)";
818 case CEC_USER_CONTROL_CODE_RECORD_FUNCTION:
819 return "record (function)";
820 case CEC_USER_CONTROL_CODE_PAUSE_RECORD_FUNCTION:
821 return "pause record (function)";
822 case CEC_USER_CONTROL_CODE_STOP_FUNCTION:
823 return "stop (function)";
824 case CEC_USER_CONTROL_CODE_MUTE_FUNCTION:
825 return "mute (function)";
826 case CEC_USER_CONTROL_CODE_RESTORE_VOLUME_FUNCTION:
827 return "restore volume";
828 case CEC_USER_CONTROL_CODE_TUNE_FUNCTION:
829 return "tune";
830 case CEC_USER_CONTROL_CODE_SELECT_MEDIA_FUNCTION:
831 return "select media";
832 case CEC_USER_CONTROL_CODE_SELECT_AV_INPUT_FUNCTION:
833 return "select AV input";
834 case CEC_USER_CONTROL_CODE_SELECT_AUDIO_INPUT_FUNCTION:
835 return "select audio input";
836 case CEC_USER_CONTROL_CODE_POWER_TOGGLE_FUNCTION:
837 return "power toggle";
838 case CEC_USER_CONTROL_CODE_POWER_OFF_FUNCTION:
839 return "power off";
840 case CEC_USER_CONTROL_CODE_POWER_ON_FUNCTION:
841 return "power on";
842 case CEC_USER_CONTROL_CODE_F1_BLUE:
843 return "F1 (blue)";
844 case CEC_USER_CONTROL_CODE_F2_RED:
845 return "F2 (red)";
846 case CEC_USER_CONTROL_CODE_F3_GREEN:
847 return "F3 (green)";
848 case CEC_USER_CONTROL_CODE_F4_YELLOW:
849 return "F4 (yellow)";
850 case CEC_USER_CONTROL_CODE_F5:
851 return "F5";
852 case CEC_USER_CONTROL_CODE_DATA:
853 return "data";
854 case CEC_USER_CONTROL_CODE_AN_RETURN:
855 return "return (Samsung)";
856 case CEC_USER_CONTROL_CODE_AN_CHANNELS_LIST:
857 return "channels list (Samsung)";
858 default:
859 return "unknown";
860 }
861 }
862
863 static const char *ToString(const cec_adapter_type type)
864 {
865 switch (type)
866 {
867 case ADAPTERTYPE_P8_EXTERNAL:
868 return "Pulse-Eight USB-CEC Adapter";
869 case ADAPTERTYPE_P8_DAUGHTERBOARD:
870 return "Pulse-Eight USB-CEC Daughterboard";
871 case ADAPTERTYPE_RPI:
872 return "Raspberry Pi";
873 case ADAPTERTYPE_TDA995x:
874 return "TDA995x";
875 default:
876 return "unknown";
877 }
878 }
879
880 static bool PhysicalAddressIsIncluded(uint16_t iParent, uint16_t iChild)
881 {
882 for (int iPtr = 3; iPtr >= 0; iPtr--)
883 {
884 if (((iParent >> 4*iPtr) & 0xF) > 0 &&
885 ((iParent >> 4*iPtr) & 0xF) != ((iChild >> 4*iPtr) & 0xF))
886 return false;
887 }
888 return true;
889 }
890
891 static CStdString ToString(const cec_command& command)
892 {
893 CStdString dataStr;
894 dataStr.Format(">> %1x%1x", command.initiator, command.destination);
895 if (command.opcode_set == 1)
896 dataStr.AppendFormat(":%02x", command.opcode);
897 for (uint8_t iPtr = 0; iPtr < command.parameters.size; iPtr++)
898 dataStr.AppendFormat(":%02x", (unsigned int)command.parameters[iPtr]);
899 return dataStr;
900 }
901 };
902 }