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 LOK |
522 | case CEC_VENDOR_HARMAN_KARDON: |
523 | return "Harman/Kardon"; | |
8fb02873 LOK |
524 | case CEC_VENDOR_PULSE_EIGHT: |
525 | return "Pulse Eight"; | |
0d800fe5 LOK |
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"; | |
0a61dc24 LOK |
553 | case CEC_CLIENT_VERSION_1_7_0: |
554 | return "1.7.0"; | |
92eea1e7 LOK |
555 | case CEC_CLIENT_VERSION_1_7_1: |
556 | return "1.7.1"; | |
2b44051c LOK |
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"; | |
7e316a2f LOK |
561 | case CEC_CLIENT_VERSION_1_8_1: |
562 | return "1.8.1"; | |
2d418322 LOK |
563 | case CEC_CLIENT_VERSION_1_8_2: |
564 | return "1.8.2"; | |
1664420d LOK |
565 | case CEC_CLIENT_VERSION_1_9_0: |
566 | return "1.9.0"; | |
f81c0652 LOK |
567 | case CEC_CLIENT_VERSION_1_99_0: |
568 | return "2.0.0-pre"; | |
999665e3 LOK |
569 | case CEC_CLIENT_VERSION_2_0_0: |
570 | return "2.0.0"; | |
20fd14a9 LOK |
571 | case CEC_CLIENT_VERSION_2_0_1: |
572 | return "2.0.1"; | |
784a6a79 LOK |
573 | case CEC_CLIENT_VERSION_2_0_2: |
574 | return "2.0.2"; | |
83715833 LOK |
575 | case CEC_CLIENT_VERSION_2_0_3: |
576 | return "2.0.3"; | |
0c271bd0 LOK |
577 | case CEC_CLIENT_VERSION_2_0_4: |
578 | return "2.0.4"; | |
ac3f9901 LOK |
579 | case CEC_CLIENT_VERSION_2_0_5: |
580 | return "2.0.5"; | |
9b56a19a LOK |
581 | case CEC_CLIENT_VERSION_2_1_0: |
582 | return "2.1.0"; | |
331d659e LOK |
583 | case CEC_CLIENT_VERSION_2_1_1: |
584 | return "2.1.1"; | |
b53bfc2d LOK |
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"; | |
0d800fe5 LOK |
589 | default: |
590 | return "Unknown"; | |
591 | } | |
592 | } | |
593 | ||
594 | static const char *ToString(const cec_server_version version) | |
595 | { | |
596 | switch (version) | |
597 | { | |
598 | case CEC_SERVER_VERSION_PRE_1_5: | |
599 | return "pre-1.5"; | |
600 | case CEC_SERVER_VERSION_1_5_0: | |
601 | return "1.5.0"; | |
602 | case CEC_SERVER_VERSION_1_5_1: | |
603 | return "1.5.1"; | |
604 | case CEC_SERVER_VERSION_1_5_2: | |
605 | return "1.5.2"; | |
606 | case CEC_SERVER_VERSION_1_5_3: | |
607 | return "1.5.3"; | |
608 | case CEC_SERVER_VERSION_1_6_0: | |
609 | return "1.6.0"; | |
610 | case CEC_SERVER_VERSION_1_6_1: | |
611 | return "1.6.1"; | |
612 | case CEC_SERVER_VERSION_1_6_2: | |
613 | return "1.6.2"; | |
614 | case CEC_SERVER_VERSION_1_6_3: | |
615 | return "1.6.3"; | |
0a61dc24 LOK |
616 | case CEC_SERVER_VERSION_1_7_0: |
617 | return "1.7.0"; | |
92eea1e7 LOK |
618 | case CEC_SERVER_VERSION_1_7_1: |
619 | return "1.7.1"; | |
2b44051c LOK |
620 | case CEC_SERVER_VERSION_1_7_2: |
621 | return "1.7.2"; | |
622 | case CEC_SERVER_VERSION_1_8_0: | |
623 | return "1.8.0"; | |
7e316a2f LOK |
624 | case CEC_SERVER_VERSION_1_8_1: |
625 | return "1.8.1"; | |
2d418322 LOK |
626 | case CEC_SERVER_VERSION_1_8_2: |
627 | return "1.8.2"; | |
1664420d LOK |
628 | case CEC_SERVER_VERSION_1_9_0: |
629 | return "1.9.0"; | |
f81c0652 LOK |
630 | case CEC_SERVER_VERSION_1_99_0: |
631 | return "2.0.0-pre"; | |
784a6a79 | 632 | case CEC_SERVER_VERSION_2_0_0: |
999665e3 | 633 | return "2.0.0"; |
784a6a79 | 634 | case CEC_SERVER_VERSION_2_0_1: |
20fd14a9 | 635 | return "2.0.1"; |
784a6a79 LOK |
636 | case CEC_SERVER_VERSION_2_0_2: |
637 | return "2.0.2"; | |
83715833 LOK |
638 | case CEC_SERVER_VERSION_2_0_3: |
639 | return "2.0.3"; | |
0c271bd0 LOK |
640 | case CEC_SERVER_VERSION_2_0_4: |
641 | return "2.0.4"; | |
ac3f9901 LOK |
642 | case CEC_SERVER_VERSION_2_0_5: |
643 | return "2.0.5"; | |
9b56a19a LOK |
644 | case CEC_SERVER_VERSION_2_1_0: |
645 | return "2.1.0"; | |
331d659e LOK |
646 | case CEC_SERVER_VERSION_2_1_1: |
647 | return "2.1.1"; | |
b53bfc2d LOK |
648 | case CEC_SERVER_VERSION_2_1_2: |
649 | return "2.1.2"; | |
650 | case CEC_SERVER_VERSION_2_1_3: | |
651 | return "2.1.3"; | |
0d800fe5 LOK |
652 | default: |
653 | return "Unknown"; | |
654 | } | |
655 | } | |
9a54dc82 LOK |
656 | |
657 | static const char *ToString(const cec_abort_reason reason) | |
658 | { | |
659 | switch(reason) | |
660 | { | |
661 | case CEC_ABORT_REASON_UNRECOGNIZED_OPCODE: | |
662 | return "unrecognised opcode"; | |
663 | case CEC_ABORT_REASON_NOT_IN_CORRECT_MODE_TO_RESPOND: | |
664 | return "not in correct mode to respond"; | |
665 | case CEC_ABORT_REASON_CANNOT_PROVIDE_SOURCE: | |
666 | return "cannot provide source"; | |
667 | case CEC_ABORT_REASON_INVALID_OPERAND: | |
668 | return "invalid operand"; | |
669 | case CEC_ABORT_REASON_REFUSED: | |
670 | return "refused"; | |
671 | default: | |
672 | return "unknown"; | |
673 | } | |
674 | } | |
2b44051c LOK |
675 | |
676 | static const char *ToString(const cec_user_control_code key) | |
677 | { | |
678 | switch (key) | |
679 | { | |
680 | case CEC_USER_CONTROL_CODE_SELECT: | |
681 | return "select"; | |
682 | case CEC_USER_CONTROL_CODE_UP: | |
683 | return "up"; | |
684 | case CEC_USER_CONTROL_CODE_DOWN: | |
685 | return "down"; | |
686 | case CEC_USER_CONTROL_CODE_LEFT: | |
687 | return "left"; | |
688 | case CEC_USER_CONTROL_CODE_RIGHT: | |
689 | return "right"; | |
690 | case CEC_USER_CONTROL_CODE_RIGHT_UP: | |
691 | return "right+up"; | |
692 | case CEC_USER_CONTROL_CODE_RIGHT_DOWN: | |
693 | return "right+down"; | |
694 | case CEC_USER_CONTROL_CODE_LEFT_UP: | |
695 | return "left+up"; | |
696 | case CEC_USER_CONTROL_CODE_LEFT_DOWN: | |
697 | return "left+down"; | |
698 | case CEC_USER_CONTROL_CODE_ROOT_MENU: | |
699 | return "root menu"; | |
700 | case CEC_USER_CONTROL_CODE_SETUP_MENU: | |
701 | return "setup menu"; | |
702 | case CEC_USER_CONTROL_CODE_CONTENTS_MENU: | |
703 | return "contents menu"; | |
704 | case CEC_USER_CONTROL_CODE_FAVORITE_MENU: | |
705 | return "favourite menu"; | |
706 | case CEC_USER_CONTROL_CODE_EXIT: | |
707 | return "exit"; | |
708 | case CEC_USER_CONTROL_CODE_NUMBER0: | |
709 | return "0"; | |
710 | case CEC_USER_CONTROL_CODE_NUMBER1: | |
711 | return "1"; | |
712 | case CEC_USER_CONTROL_CODE_NUMBER2: | |
713 | return "2"; | |
714 | case CEC_USER_CONTROL_CODE_NUMBER3: | |
715 | return "3"; | |
716 | case CEC_USER_CONTROL_CODE_NUMBER4: | |
717 | return "4"; | |
718 | case CEC_USER_CONTROL_CODE_NUMBER5: | |
719 | return "5"; | |
720 | case CEC_USER_CONTROL_CODE_NUMBER6: | |
721 | return "6"; | |
722 | case CEC_USER_CONTROL_CODE_NUMBER7: | |
723 | return "7"; | |
724 | case CEC_USER_CONTROL_CODE_NUMBER8: | |
725 | return "8"; | |
726 | case CEC_USER_CONTROL_CODE_NUMBER9: | |
727 | return "9"; | |
728 | case CEC_USER_CONTROL_CODE_DOT: | |
729 | return "."; | |
730 | case CEC_USER_CONTROL_CODE_ENTER: | |
731 | return "enter"; | |
732 | case CEC_USER_CONTROL_CODE_CLEAR: | |
733 | return "clear"; | |
734 | case CEC_USER_CONTROL_CODE_NEXT_FAVORITE: | |
735 | return "next favourite"; | |
736 | case CEC_USER_CONTROL_CODE_CHANNEL_UP: | |
737 | return "channel up"; | |
738 | case CEC_USER_CONTROL_CODE_CHANNEL_DOWN: | |
739 | return "channel down"; | |
740 | case CEC_USER_CONTROL_CODE_PREVIOUS_CHANNEL: | |
741 | return "previous channel"; | |
742 | case CEC_USER_CONTROL_CODE_SOUND_SELECT: | |
743 | return "sound select"; | |
744 | case CEC_USER_CONTROL_CODE_INPUT_SELECT: | |
745 | return "input select"; | |
746 | case CEC_USER_CONTROL_CODE_DISPLAY_INFORMATION: | |
747 | return "display information"; | |
748 | case CEC_USER_CONTROL_CODE_HELP: | |
749 | return "help"; | |
750 | case CEC_USER_CONTROL_CODE_PAGE_UP: | |
751 | return "page up"; | |
752 | case CEC_USER_CONTROL_CODE_PAGE_DOWN: | |
753 | return "page down"; | |
754 | case CEC_USER_CONTROL_CODE_POWER: | |
755 | return "power"; | |
756 | case CEC_USER_CONTROL_CODE_VOLUME_UP: | |
757 | return "volume up"; | |
758 | case CEC_USER_CONTROL_CODE_VOLUME_DOWN: | |
759 | return "volume down"; | |
760 | case CEC_USER_CONTROL_CODE_MUTE: | |
761 | return "mute"; | |
762 | case CEC_USER_CONTROL_CODE_PLAY: | |
763 | return "play"; | |
764 | case CEC_USER_CONTROL_CODE_STOP: | |
765 | return "stop"; | |
766 | case CEC_USER_CONTROL_CODE_PAUSE: | |
767 | return "pause"; | |
768 | case CEC_USER_CONTROL_CODE_RECORD: | |
769 | return "record"; | |
770 | case CEC_USER_CONTROL_CODE_REWIND: | |
771 | return "rewind"; | |
772 | case CEC_USER_CONTROL_CODE_FAST_FORWARD: | |
773 | return "Fast forward"; | |
774 | case CEC_USER_CONTROL_CODE_EJECT: | |
775 | return "eject"; | |
776 | case CEC_USER_CONTROL_CODE_FORWARD: | |
777 | return "forward"; | |
778 | case CEC_USER_CONTROL_CODE_BACKWARD: | |
779 | return "backward"; | |
780 | case CEC_USER_CONTROL_CODE_STOP_RECORD: | |
781 | return "stop record"; | |
782 | case CEC_USER_CONTROL_CODE_PAUSE_RECORD: | |
783 | return "pause record"; | |
784 | case CEC_USER_CONTROL_CODE_ANGLE: | |
785 | return "angle"; | |
786 | case CEC_USER_CONTROL_CODE_SUB_PICTURE: | |
787 | return "sub picture"; | |
788 | case CEC_USER_CONTROL_CODE_VIDEO_ON_DEMAND: | |
789 | return "video on demand"; | |
790 | case CEC_USER_CONTROL_CODE_ELECTRONIC_PROGRAM_GUIDE: | |
791 | return "electronic program guide"; | |
792 | case CEC_USER_CONTROL_CODE_TIMER_PROGRAMMING: | |
793 | return "timer programming"; | |
794 | case CEC_USER_CONTROL_CODE_INITIAL_CONFIGURATION: | |
795 | return "initial configuration"; | |
796 | case CEC_USER_CONTROL_CODE_PLAY_FUNCTION: | |
797 | return "play (function)"; | |
798 | case CEC_USER_CONTROL_CODE_PAUSE_PLAY_FUNCTION: | |
799 | return "pause play (function)"; | |
800 | case CEC_USER_CONTROL_CODE_RECORD_FUNCTION: | |
801 | return "record (function)"; | |
802 | case CEC_USER_CONTROL_CODE_PAUSE_RECORD_FUNCTION: | |
803 | return "pause record (function)"; | |
804 | case CEC_USER_CONTROL_CODE_STOP_FUNCTION: | |
805 | return "stop (function)"; | |
806 | case CEC_USER_CONTROL_CODE_MUTE_FUNCTION: | |
807 | return "mute (function)"; | |
808 | case CEC_USER_CONTROL_CODE_RESTORE_VOLUME_FUNCTION: | |
809 | return "restore volume"; | |
810 | case CEC_USER_CONTROL_CODE_TUNE_FUNCTION: | |
811 | return "tune"; | |
812 | case CEC_USER_CONTROL_CODE_SELECT_MEDIA_FUNCTION: | |
813 | return "select media"; | |
814 | case CEC_USER_CONTROL_CODE_SELECT_AV_INPUT_FUNCTION: | |
815 | return "select AV input"; | |
816 | case CEC_USER_CONTROL_CODE_SELECT_AUDIO_INPUT_FUNCTION: | |
817 | return "select audio input"; | |
818 | case CEC_USER_CONTROL_CODE_POWER_TOGGLE_FUNCTION: | |
819 | return "power toggle"; | |
820 | case CEC_USER_CONTROL_CODE_POWER_OFF_FUNCTION: | |
821 | return "power off"; | |
822 | case CEC_USER_CONTROL_CODE_POWER_ON_FUNCTION: | |
823 | return "power on"; | |
824 | case CEC_USER_CONTROL_CODE_F1_BLUE: | |
825 | return "F1 (blue)"; | |
826 | case CEC_USER_CONTROL_CODE_F2_RED: | |
827 | return "F2 (red)"; | |
828 | case CEC_USER_CONTROL_CODE_F3_GREEN: | |
829 | return "F3 (green)"; | |
830 | case CEC_USER_CONTROL_CODE_F4_YELLOW: | |
831 | return "F4 (yellow)"; | |
832 | case CEC_USER_CONTROL_CODE_F5: | |
833 | return "F5"; | |
834 | case CEC_USER_CONTROL_CODE_DATA: | |
835 | return "data"; | |
836 | case CEC_USER_CONTROL_CODE_AN_RETURN: | |
837 | return "return (Samsung)"; | |
838 | case CEC_USER_CONTROL_CODE_AN_CHANNELS_LIST: | |
839 | return "channels list (Samsung)"; | |
840 | default: | |
841 | return "unknown"; | |
842 | } | |
843 | } | |
2d418322 LOK |
844 | |
845 | static const char *ToString(const cec_adapter_type type) | |
846 | { | |
847 | switch (type) | |
848 | { | |
849 | case ADAPTERTYPE_P8_EXTERNAL: | |
850 | return "Pulse-Eight USB-CEC Adapter"; | |
851 | case ADAPTERTYPE_P8_DAUGHTERBOARD: | |
852 | return "Pulse-Eight USB-CEC Daughterboard"; | |
853 | case ADAPTERTYPE_RPI: | |
854 | return "Raspberry Pi"; | |
51b611bc | 855 | case ADAPTERTYPE_TDA995x: |
856 | return "TDA995x"; | |
2d418322 LOK |
857 | default: |
858 | return "unknown"; | |
859 | } | |
860 | } | |
6acb9c0b LOK |
861 | |
862 | static bool PhysicalAddressIsIncluded(uint16_t iParent, uint16_t iChild) | |
863 | { | |
864 | for (int iPtr = 3; iPtr >= 0; iPtr--) | |
865 | { | |
866 | if (((iParent >> 4*iPtr) & 0xF) > 0 && | |
867 | ((iParent >> 4*iPtr) & 0xF) != ((iChild >> 4*iPtr) & 0xF)) | |
868 | return false; | |
869 | } | |
870 | return true; | |
871 | } | |
8187ac5f LOK |
872 | |
873 | static CStdString ToString(const cec_command& command) | |
874 | { | |
875 | CStdString dataStr; | |
876 | dataStr.Format(">> %1x%1x", command.initiator, command.destination); | |
877 | if (command.opcode_set == 1) | |
878 | dataStr.AppendFormat(":%02x", command.opcode); | |
879 | for (uint8_t iPtr = 0; iPtr < command.parameters.size; iPtr++) | |
880 | dataStr.AppendFormat(":%02x", (unsigned int)command.parameters[iPtr]); | |
881 | return dataStr; | |
882 | } | |
0d800fe5 LOK |
883 | }; |
884 | } |