fix OS-X build
[deb_libcec.git] / include / cectypes.h
CommitLineData
acec5f48
LOK
1#pragma once
2/*
3 * This file is part of the libCEC(R) library.
4 *
b492c10e 5 * libCEC(R) is Copyright (C) 2011-2012 Pulse-Eight Limited. All rights reserved.
acec5f48
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
34#ifndef CECTYPES_H_
35#define CECTYPES_H_
36
37#include <stdint.h>
38#include <string.h>
acec5f48 39
761ccce0 40#if defined(_WIN32) || defined(_WIN64)
77398db9 41#define CEC_CDECL __cdecl
761ccce0 42#else
77398db9 43#define CEC_CDECL
761ccce0
LOK
44#endif
45
acec5f48
LOK
46#if !defined(DECLSPEC)
47#if defined(_WIN32) || defined(_WIN64)
48#include <windows.h>
49#if defined DLL_EXPORT
50#define DECLSPEC __declspec(dllexport)
51#else
52#define DECLSPEC __declspec(dllimport)
53#endif
54#else
55#define DECLSPEC
56#endif
57#endif
58
cb915777
LOK
59#ifdef __cplusplus
60extern "C" {
61namespace CEC {
62#endif
63
5ae8fa48
LOK
64//default physical address 1.0.0.0, HDMI port 1
65#define CEC_DEFAULT_PHYSICAL_ADDRESS 0x1000
16b1e052 66#define CEC_DEFAULT_HDMI_PORT 1
d2f1c157 67#define CEC_DEFAULT_BASE_DEVICE 0
5ae8fa48
LOK
68#define MSGSTART 0xFF
69#define MSGEND 0xFE
70#define MSGESC 0xFD
71#define ESCOFFSET 3
72#define CEC_BUTTON_TIMEOUT 500
2efa39b7 73#define CEC_POWER_STATE_REFRESH_TIME 30000
1fc16cfd 74#define CEC_FW_VERSION_UNKNOWN 0xFFFF
d2d1660c 75#define CEC_FW_BUILD_UNKNOWN 0
3b5e433a 76#define CEC_CONNECT_TRIES 3
64ec6e79 77
b32ffd87 78#define CEC_PHYSICAL_ADDRESS_TV 0
d2d1660c 79#define CEC_MIN_PHYSICAL_ADDRESS 0x1000
b32ffd87
LOK
80#define CEC_MAX_PHYSICAL_ADDRESS 0xFFFE
81#define CEC_INVALID_PHYSICAL_ADDRESS 0xFFFF
5ae8fa48 82
64ec6e79
LOK
83#define CEC_MIN_VENDORID 1
84#define CEC_MAX_VENDORID 0xFFFFFE
85#define CEC_INVALID_VENDORID 0xFFFFFF
86
87#define CEC_MIN_HDMI_PORTNUMBER 1
88#define CEC_MAX_HDMI_PORTNUMBER 15
d2d1660c 89#define CEC_HDMI_PORTNUMBER_NONE 0
64ec6e79 90
7f274e72
LOK
91#define CEC_DEFAULT_SETTING_USE_TV_MENU_LANGUAGE 1
92#define CEC_DEFAULT_SETTING_ACTIVATE_SOURCE 1
93#define CEC_DEFAULT_SETTING_POWER_OFF_SHUTDOWN 1
94#define CEC_DEFAULT_SETTING_POWER_OFF_SCREENSAVER 1
95#define CEC_DEFAULT_SETTING_POWER_OFF_ON_STANDBY 1
96#define CEC_DEFAULT_SETTING_SHUTDOWN_ON_STANDBY 0
97#define CEC_DEFAULT_SETTING_SEND_INACTIVE_SOURCE 1
b98fc43d 98#define CEC_DEFAULT_SETTING_POWER_OFF_DEVICES_STANDBY 1
7f274e72 99#define CEC_DEFAULT_DEVICE_LANGUAGE "eng"
20be20ea 100#define CEC_DEFAULT_SETTING_AUTODETECT_ADDRESS 0
64ec6e79 101#define CEC_DEFAULT_SETTING_GET_SETTINGS_FROM_ROM 0
224ea877 102
4478bc79
LOK
103#define CEC_DEFAULT_TRANSMIT_RETRY_WAIT 500
104#define CEC_DEFAULT_TRANSMIT_TIMEOUT 1000
d2d1660c 105#define CEC_DEFAULT_TRANSMIT_WAIT 1000
4478bc79 106#define CEC_DEFAULT_TRANSMIT_RETRIES 1
ae693aaa 107
b32ffd87
LOK
108#define CEC_DEFAULT_CONNECT_TIMEOUT 10000
109#define CEC_DEFAULT_CONNECT_RETRY_WAIT 1000
110#define CEC_SERIAL_DEFAULT_BAUDRATE 38400
111#define CEC_CLEAR_INPUT_DEFAULT_WAIT 1000
112
aa4c0d34 113#define CEC_ACTIVE_SOURCE_SWITCH_RETRY_TIME_MS 5000
55c18d43 114#define CEC_FORWARD_STANDBY_MIN_INTERVAL 10000
aa4c0d34 115
5ae8fa48
LOK
116#define CEC_MIN_LIB_VERSION 1
117#define CEC_LIB_VERSION_MAJOR 1
a71897f4 118#define CEC_LIB_VERSION_MAJOR_STR "1"
0a61dc24 119#define CEC_LIB_VERSION_MINOR 7
5ae8fa48 120
c727331e 121typedef enum cec_abort_reason
acec5f48 122{
5ae8fa48 123 CEC_ABORT_REASON_UNRECOGNIZED_OPCODE = 0,
acec5f48 124 CEC_ABORT_REASON_NOT_IN_CORRECT_MODE_TO_RESPOND = 1,
5ae8fa48
LOK
125 CEC_ABORT_REASON_CANNOT_PROVIDE_SOURCE = 2,
126 CEC_ABORT_REASON_INVALID_OPERAND = 3,
127 CEC_ABORT_REASON_REFUSED = 4
c727331e 128} cec_abort_reason;
acec5f48 129
c727331e 130typedef enum cec_analogue_broadcast_type
acec5f48 131{
5ae8fa48
LOK
132 CEC_ANALOGUE_BROADCAST_TYPE_CABLE = 0x00,
133 CEC_ANALOGUE_BROADCAST_TYPE_SATELLITE = 0x01,
acec5f48 134 CEC_ANALOGUE_BROADCAST_TYPE_TERRESTIAL = 0x02
c727331e 135} cec_analogue_broadcast_type;
acec5f48 136
c727331e 137typedef enum cec_audio_rate
acec5f48 138{
5ae8fa48
LOK
139 CEC_AUDIO_RATE_RATE_CONTROL_OFF = 0,
140 CEC_AUDIO_RATE_STANDARD_RATE_100 = 1,
141 CEC_AUDIO_RATE_FAST_RATE_MAX_101 = 2,
142 CEC_AUDIO_RATE_SLOW_RATE_MIN_99 = 3,
acec5f48
LOK
143 CEC_AUDIO_RATE_STANDARD_RATE_100_0 = 4,
144 CEC_AUDIO_RATE_FAST_RATE_MAX_100_1 = 5,
5ae8fa48 145 CEC_AUDIO_RATE_SLOW_RATE_MIN_99_9 = 6
c727331e 146} cec_audio_rate;
acec5f48 147
e5e86c76 148typedef enum cec_audio_status
acec5f48 149{
5ae8fa48
LOK
150 CEC_AUDIO_MUTE_STATUS_MASK = 0x80,
151 CEC_AUDIO_VOLUME_STATUS_MASK = 0x7F,
152 CEC_AUDIO_VOLUME_MIN = 0x00,
153 CEC_AUDIO_VOLUME_MAX = 0x64,
acec5f48 154 CEC_AUDIO_VOLUME_STATUS_UNKNOWN = 0x7F
e5e86c76 155} cec_audio_status;
acec5f48 156
c727331e 157typedef enum cec_boolean
acec5f48
LOK
158{
159 CEC_FALSE = 0,
5ae8fa48 160 CEC_TRUE = 1
c727331e 161} cec_boolean;
acec5f48 162
6a1c0009 163typedef enum cec_version
acec5f48 164{
6a1c0009
LOK
165 CEC_VERSION_UNKNOWN = 0x00,
166 CEC_VERSION_1_2 = 0x01,
167 CEC_VERSION_1_2A = 0x02,
168 CEC_VERSION_1_3 = 0x03,
c4098482
LOK
169 CEC_VERSION_1_3A = 0x04,
170 CEC_VERSION_1_4 = 0x05
6a1c0009 171} cec_version;
acec5f48 172
c727331e 173typedef enum cec_channel_identifier
acec5f48
LOK
174{
175 CEC_CHANNEL_NUMBER_FORMAT_MASK = 0xFC000000,
5ae8fa48
LOK
176 CEC_1_PART_CHANNEL_NUMBER = 0x04000000,
177 CEC_2_PART_CHANNEL_NUMBER = 0x08000000,
178 CEC_MAJOR_CHANNEL_NUMBER_MASK = 0x3FF0000,
179 CEC_MINOR_CHANNEL_NUMBER_MASK = 0xFFFF
c727331e 180} cec_channel_identifier;
acec5f48 181
8ac9c610 182typedef enum cec_deck_control_mode
acec5f48 183{
5ae8fa48 184 CEC_DECK_CONTROL_MODE_SKIP_FORWARD_WIND = 1,
a9232a79 185 CEC_DECK_CONTROL_MODE_SKIP_REVERSE_REWIND = 2,
5ae8fa48
LOK
186 CEC_DECK_CONTROL_MODE_STOP = 3,
187 CEC_DECK_CONTROL_MODE_EJECT = 4
8ac9c610 188} cec_deck_control_mode;
acec5f48 189
8ac9c610 190typedef enum cec_deck_info
acec5f48 191{
5ae8fa48
LOK
192 CEC_DECK_INFO_PLAY = 0x11,
193 CEC_DECK_INFO_RECORD = 0x12,
194 CEC_DECK_INFO_PLAY_REVERSE = 0x13,
195 CEC_DECK_INFO_STILL = 0x14,
196 CEC_DECK_INFO_SLOW = 0x15,
197 CEC_DECK_INFO_SLOW_REVERSE = 0x16,
198 CEC_DECK_INFO_FAST_FORWARD = 0x17,
199 CEC_DECK_INFO_FAST_REVERSE = 0x18,
200 CEC_DECK_INFO_NO_MEDIA = 0x19,
201 CEC_DECK_INFO_STOP = 0x1A,
202 CEC_DECK_INFO_SKIP_FORWARD_WIND = 0x1B,
203 CEC_DECK_INFO_SKIP_REVERSE_REWIND = 0x1C,
acec5f48
LOK
204 CEC_DECK_INFO_INDEX_SEARCH_FORWARD = 0x1D,
205 CEC_DECK_INFO_INDEX_SEARCH_REVERSE = 0x1E,
8d915412
LOK
206 CEC_DECK_INFO_OTHER_STATUS = 0x1F,
207 CEC_DECK_INFO_OTHER_STATUS_LG = 0x20
8ac9c610 208} cec_deck_info;
acec5f48 209
f8513317 210typedef enum cec_device_type
acec5f48 211{
5ae8fa48 212 CEC_DEVICE_TYPE_TV = 0,
acec5f48 213 CEC_DEVICE_TYPE_RECORDING_DEVICE = 1,
5ae8fa48
LOK
214 CEC_DEVICE_TYPE_RESERVED = 2,
215 CEC_DEVICE_TYPE_TUNER = 3,
216 CEC_DEVICE_TYPE_PLAYBACK_DEVICE = 4,
217 CEC_DEVICE_TYPE_AUDIO_SYSTEM = 5
f8513317
LOK
218} cec_device_type;
219
1969b140 220typedef enum cec_display_control
acec5f48
LOK
221{
222 CEC_DISPLAY_CONTROL_DISPLAY_FOR_DEFAULT_TIME = 0x00,
5ae8fa48
LOK
223 CEC_DISPLAY_CONTROL_DISPLAY_UNTIL_CLEARED = 0x40,
224 CEC_DISPLAY_CONTROL_CLEAR_PREVIOUS_MESSAGE = 0x80,
225 CEC_DISPLAY_CONTROL_RESERVED_FOR_FUTURE_USE = 0xC0
1969b140 226} cec_display_control;
acec5f48 227
c727331e 228typedef enum cec_external_source_specifier
acec5f48 229{
5ae8fa48 230 CEC_EXTERNAL_SOURCE_SPECIFIER_EXTERNAL_PLUG = 4,
acec5f48 231 CEC_EXTERNAL_SOURCE_SPECIFIER_EXTERNAL_PHYSICAL_ADDRESS = 5
c727331e 232} cec_external_source_specifier;
acec5f48 233
c727331e 234typedef enum cec_menu_request_type
acec5f48 235{
5ae8fa48 236 CEC_MENU_REQUEST_TYPE_ACTIVATE = 0,
acec5f48 237 CEC_MENU_REQUEST_TYPE_DEACTIVATE = 1,
5ae8fa48 238 CEC_MENU_REQUEST_TYPE_QUERY = 2
c727331e 239} cec_menu_request_type;
acec5f48 240
c727331e 241typedef enum cec_menu_state
acec5f48 242{
5ae8fa48 243 CEC_MENU_STATE_ACTIVATED = 0,
acec5f48 244 CEC_MENU_STATE_DEACTIVATED = 1
c727331e 245} cec_menu_state;
acec5f48 246
c727331e 247typedef enum cec_play_mode
acec5f48 248{
5ae8fa48
LOK
249 CEC_PLAY_MODE_PLAY_FORWARD = 0x24,
250 CEC_PLAY_MODE_PLAY_REVERSE = 0x20,
251 CEC_PLAY_MODE_PLAY_STILL = 0x25,
252 CEC_PLAY_MODE_FAST_FORWARD_MIN_SPEED = 0x05,
acec5f48 253 CEC_PLAY_MODE_FAST_FORWARD_MEDIUM_SPEED = 0x06,
5ae8fa48
LOK
254 CEC_PLAY_MODE_FAST_FORWARD_MAX_SPEED = 0x07,
255 CEC_PLAY_MODE_FAST_REVERSE_MIN_SPEED = 0x09,
acec5f48 256 CEC_PLAY_MODE_FAST_REVERSE_MEDIUM_SPEED = 0x0A,
5ae8fa48
LOK
257 CEC_PLAY_MODE_FAST_REVERSE_MAX_SPEED = 0x0B,
258 CEC_PLAY_MODE_SLOW_FORWARD_MIN_SPEED = 0x15,
acec5f48 259 CEC_PLAY_MODE_SLOW_FORWARD_MEDIUM_SPEED = 0x16,
5ae8fa48
LOK
260 CEC_PLAY_MODE_SLOW_FORWARD_MAX_SPEED = 0x17,
261 CEC_PLAY_MODE_SLOW_REVERSE_MIN_SPEED = 0x19,
acec5f48 262 CEC_PLAY_MODE_SLOW_REVERSE_MEDIUM_SPEED = 0x1A,
5ae8fa48 263 CEC_PLAY_MODE_SLOW_REVERSE_MAX_SPEED = 0x1B
c727331e 264} cec_play_mode;
acec5f48 265
e55f3f70 266typedef enum cec_power_status
acec5f48 267{
5ae8fa48
LOK
268 CEC_POWER_STATUS_ON = 0x00,
269 CEC_POWER_STATUS_STANDBY = 0x01,
acec5f48 270 CEC_POWER_STATUS_IN_TRANSITION_STANDBY_TO_ON = 0x02,
e55f3f70 271 CEC_POWER_STATUS_IN_TRANSITION_ON_TO_STANDBY = 0x03,
5ae8fa48 272 CEC_POWER_STATUS_UNKNOWN = 0x99
e55f3f70 273} cec_power_status;
acec5f48 274
c727331e 275typedef enum cec_record_source_type
acec5f48 276{
5ae8fa48
LOK
277 CEC_RECORD_SOURCE_TYPE_OWN_SOURCE = 1,
278 CEC_RECORD_SOURCE_TYPE_DIGITAL_SERVICE = 2,
279 CEC_RECORD_SOURCE_TYPE_ANALOGUE_SERVICE = 3,
280 CEC_RECORD_SOURCE_TYPE_EXTERNAL_PLUS = 4,
acec5f48 281 CEC_RECORD_SOURCE_TYPE_EXTERNAL_PHYSICAL_ADDRESS = 5
c727331e 282} cec_record_source_type;
acec5f48 283
c727331e 284typedef enum cec_record_status_info
acec5f48 285{
5ae8fa48
LOK
286 CEC_RECORD_STATUS_INFO_RECORDING_CURRENTLY_SELECTED_SOURCE = 0x01,
287 CEC_RECORD_STATUS_INFO_RECORDING_DIGITAL_SERVICE = 0x02,
288 CEC_RECORD_STATUS_INFO_RECORDING_ANALOGUE_SERVICE = 0x03,
289 CEC_RECORD_STATUS_INFO_RECORDING_EXTERNAL_INPUT = 0x04,
290 CEC_RECORD_STATUS_INFO_NO_RECORDING_UNABLE_TO_RECORD_DIGITAL_SERVICE = 0x05,
acec5f48
LOK
291 CEC_RECORD_STATUS_INFO_NO_RECORDING_UNABLE_TO_RECORD_ANALOGUE_SERVICE = 0x06,
292 CEC_RECORD_STATUS_INFO_NO_RECORDING_UNABLE_TO_SELECT_REQUIRED_SERVICE = 0x07,
5ae8fa48
LOK
293 CEC_RECORD_STATUS_INFO_NO_RECORDING_INVALID_EXTERNAL_PLUG_NUMBER = 0x09,
294 CEC_RECORD_STATUS_INFO_NO_RECORDING_INVALID_EXTERNAL_ADDRESS = 0x0A,
295 CEC_RECORD_STATUS_INFO_NO_RECORDING_CA_SYSTEM_NOT_SUPPORTED = 0x0B,
296 CEC_RECORD_STATUS_INFO_NO_RECORDING_NO_OR_INSUFFICIENT_ENTITLEMENTS = 0x0C,
297 CEC_RECORD_STATUS_INFO_NO_RECORDING_NOT_ALLOWED_TO_COPY_SOURCE = 0x0D,
298 CEC_RECORD_STATUS_INFO_NO_RECORDING_NO_FURTHER_COPIES_ALLOWED = 0x0E,
299 CEC_RECORD_STATUS_INFO_NO_RECORDING_NO_MEDIA = 0x10,
300 CEC_RECORD_STATUS_INFO_NO_RECORDING_PLAYING = 0x11,
301 CEC_RECORD_STATUS_INFO_NO_RECORDING_ALREADY_RECORDING = 0x12,
302 CEC_RECORD_STATUS_INFO_NO_RECORDING_MEDIA_PROTECTED = 0x13,
303 CEC_RECORD_STATUS_INFO_NO_RECORDING_NO_SOURCE_SIGNAL = 0x14,
304 CEC_RECORD_STATUS_INFO_NO_RECORDING_MEDIA_PROBLEM = 0x15,
305 CEC_RECORD_STATUS_INFO_NO_RECORDING_NOT_ENOUGH_SPACE_AVAILABLE = 0x16,
306 CEC_RECORD_STATUS_INFO_NO_RECORDING_PARENTAL_LOCK_ON = 0x17,
307 CEC_RECORD_STATUS_INFO_RECORDING_TERMINATED_NORMALLY = 0x1A,
308 CEC_RECORD_STATUS_INFO_RECORDING_HAS_ALREADY_TERMINATED = 0x1B,
309 CEC_RECORD_STATUS_INFO_NO_RECORDING_OTHER_REASON = 0x1F
c727331e 310} cec_record_status_info;
acec5f48 311
c727331e 312typedef enum cec_recording_sequence
acec5f48 313{
5ae8fa48
LOK
314 CEC_RECORDING_SEQUENCE_SUNDAY = 0x01,
315 CEC_RECORDING_SEQUENCE_MONDAY = 0x02,
316 CEC_RECORDING_SEQUENCE_TUESDAY = 0x04,
acec5f48 317 CEC_RECORDING_SEQUENCE_WEDNESDAY = 0x08,
5ae8fa48
LOK
318 CEC_RECORDING_SEQUENCE_THURSDAY = 0x10,
319 CEC_RECORDING_SEQUENCE_FRIDAY = 0x20,
320 CEC_RECORDING_SEQUENCE_SATURDAY = 0x40,
acec5f48 321 CEC_RECORDING_SEQUENCE_ONCE_ONLY = 0x00
c727331e 322} cec_recording_sequence;
acec5f48 323
c727331e 324typedef enum cec_status_request
acec5f48 325{
5ae8fa48
LOK
326 CEC_STATUS_REQUEST_ON = 1,
327 CEC_STATUS_REQUEST_OFF = 2,
acec5f48 328 CEC_STATUS_REQUEST_ONCE = 3
c727331e 329} cec_status_request;
acec5f48 330
e5e86c76 331typedef enum cec_system_audio_status
acec5f48
LOK
332{
333 CEC_SYSTEM_AUDIO_STATUS_OFF = 0,
5ae8fa48 334 CEC_SYSTEM_AUDIO_STATUS_ON = 1
e5e86c76 335} cec_system_audio_status;
acec5f48 336
c727331e 337typedef enum cec_timer_cleared_status_data
acec5f48 338{
5ae8fa48
LOK
339 CEC_TIMER_CLEARED_STATUS_DATA_TIMER_NOT_CLEARED_RECORDING = 0x00,
340 CEC_TIMER_CLEARED_STATUS_DATA_TIMER_NOT_CLEARED_NO_MATCHING = 0x01,
acec5f48 341 CEC_TIMER_CLEARED_STATUS_DATA_TIMER_NOT_CLEARED_NO_INF0_AVAILABLE = 0x02,
5ae8fa48 342 CEC_TIMER_CLEARED_STATUS_DATA_TIMER_CLEARED = 0x80
c727331e 343} cec_timer_cleared_status_data;
acec5f48 344
c727331e 345typedef enum cec_timer_overlap_warning
acec5f48 346{
5ae8fa48 347 CEC_TIMER_OVERLAP_WARNING_NO_OVERLAP = 0,
acec5f48 348 CEC_TIMER_OVERLAP_WARNING_TIMER_BLOCKS_OVERLAP = 1
c727331e 349} cec_timer_overlap_warning;
acec5f48 350
c727331e 351typedef enum cec_media_info
acec5f48
LOK
352{
353 CEC_MEDIA_INFO_MEDIA_PRESENT_AND_NOT_PROTECTED = 0x00,
5ae8fa48
LOK
354 CEC_MEDIA_INFO_MEDIA_PRESENT_BUT_PROTECTED = 0x01,
355 CEC_MEDIA_INFO_MEDIA_NOT_PRESENT = 0x02,
356 CEC_MEDIA_INFO_FUTURE_USE = 0x03
c727331e 357} cec_media_info;
acec5f48 358
c727331e 359typedef enum cec_programmed_indicator
acec5f48
LOK
360{
361 CEC_PROGRAMMED_INDICATOR_NOT_PROGRAMMED = 0,
5ae8fa48 362 CEC_PROGRAMMED_INDICATOR_PROGRAMMED = 1
c727331e 363} cec_programmed_indicator;
acec5f48 364
c727331e 365typedef enum cec_programmed_info
acec5f48 366{
5ae8fa48
LOK
367 CEC_PROGRAMMED_INFO_FUTURE_USE = 0x0,
368 CEC_PROGRAMMED_INFO_ENOUGH_SPACE_AVAILABLE_FOR_RECORDING = 0x08,
acec5f48 369 CEC_PROGRAMMED_INFO_NOT_ENOUGH_SPACE_AVAILABLE_FOR_RECORDING = 0x09,
5ae8fa48
LOK
370 CEC_PROGRAMMED_INFO_MAY_NOT_BE_ENOUGH_SPACE_AVAILABLE = 0x0B,
371 CEC_PROGRAMMED_INFO_NO_MEDIA_INFO_AVAILABLE = 0x0A
c727331e 372} cec_programmed_info;
acec5f48 373
c727331e 374typedef enum cec_not_programmed_error_info
acec5f48 375{
5ae8fa48
LOK
376 CEC_NOT_PROGRAMMED_ERROR_INFO_FUTURE_USE = 0x0,
377 CEC_NOT_PROGRAMMED_ERROR_INFO_NO_FREE_TIMER_AVAILABLE = 0x01,
378 CEC_NOT_PROGRAMMED_ERROR_INFO_DATE_OUT_OF_RANGE = 0x02,
379 CEC_NOT_PROGRAMMED_ERROR_INFO_RECORDING_SEQUENCE_ERROR = 0x03,
380 CEC_NOT_PROGRAMMED_ERROR_INFO_INVALID_EXTERNAL_PLUG_NUMBER = 0x04,
381 CEC_NOT_PROGRAMMED_ERROR_INFO_INVALID_EXTERNAL_PHYSICAL_ADDRESS = 0x05,
382 CEC_NOT_PROGRAMMED_ERROR_INFO_CA_SYSTEM_NOT_SUPPORTED = 0x06,
acec5f48 383 CEC_NOT_PROGRAMMED_ERROR_INFO_NO_OR_INSUFFICIENT_CA_ENTITLEMENTS = 0x07,
5ae8fa48
LOK
384 CEC_NOT_PROGRAMMED_ERROR_INFO_DOES_NOT_SUPPORT_RESOLUTION = 0x08,
385 CEC_NOT_PROGRAMMED_ERROR_INFO_PARENTAL_LOCK_ON = 0x09,
386 CEC_NOT_PROGRAMMED_ERROR_INFO_CLOCK_FAILURE = 0x0A,
387 CEC_NOT_PROGRAMMED_ERROR_INFO_RESERVED_FOR_FUTURE_USE_START = 0x0B,
388 CEC_NOT_PROGRAMMED_ERROR_INFO_RESERVED_FOR_FUTURE_USE_END = 0x0D,
389 CEC_NOT_PROGRAMMED_ERROR_INFO_DUPLICATE_ALREADY_PROGRAMMED = 0x0E
c727331e 390} cec_not_programmed_error_info;
acec5f48 391
c727331e 392typedef enum cec_recording_flag
acec5f48
LOK
393{
394 CEC_RECORDING_FLAG_NOT_BEING_USED_FOR_RECORDING = 0,
5ae8fa48 395 CEC_RECORDING_FLAG_BEING_USED_FOR_RECORDING = 1
c727331e 396} cec_recording_flag;
acec5f48 397
c727331e 398typedef enum cec_tuner_display_info
acec5f48 399{
5ae8fa48
LOK
400 CEC_TUNER_DISPLAY_INFO_DISPLAYING_DIGITAL_TUNER = 0,
401 CEC_TUNER_DISPLAY_INFO_NOT_DISPLAYING_TUNER = 1,
acec5f48 402 CEC_TUNER_DISPLAY_INFO_DISPLAYING_ANALOGUE_TUNER = 2
c727331e 403} cec_tuner_display_info;
acec5f48 404
c727331e 405typedef enum cec_broadcast_system
acec5f48 406{
5ae8fa48
LOK
407 CEC_BROADCAST_SYSTEM_PAL_B_G = 0,
408 CEC_BROADCAST_SYSTEM_SECAM_L1 = 1,
409 CEC_BROADCAST_SYSTEM_PAL_M = 2,
410 CEC_BROADCAST_SYSTEM_NTSC_M = 3,
411 CEC_BROADCAST_SYSTEM_PAL_I = 4,
412 CEC_BROADCAST_SYSTEM_SECAM_DK = 5,
413 CEC_BROADCAST_SYSTEM_SECAM_B_G = 6,
414 CEC_BROADCAST_SYSTEM_SECAM_L2 = 7,
415 CEC_BROADCAST_SYSTEM_PAL_DK = 8,
acec5f48 416 CEC_BROADCAST_SYSTEM_OTHER_SYSTEM = 30
c727331e 417} cec_broadcast_system;
acec5f48
LOK
418
419typedef enum cec_user_control_code
420{
5ae8fa48
LOK
421 CEC_USER_CONTROL_CODE_SELECT = 0x00,
422 CEC_USER_CONTROL_CODE_UP = 0x01,
423 CEC_USER_CONTROL_CODE_DOWN = 0x02,
424 CEC_USER_CONTROL_CODE_LEFT = 0x03,
425 CEC_USER_CONTROL_CODE_RIGHT = 0x04,
426 CEC_USER_CONTROL_CODE_RIGHT_UP = 0x05,
427 CEC_USER_CONTROL_CODE_RIGHT_DOWN = 0x06,
428 CEC_USER_CONTROL_CODE_LEFT_UP = 0x07,
429 CEC_USER_CONTROL_CODE_LEFT_DOWN = 0x08,
430 CEC_USER_CONTROL_CODE_ROOT_MENU = 0x09,
431 CEC_USER_CONTROL_CODE_SETUP_MENU = 0x0A,
432 CEC_USER_CONTROL_CODE_CONTENTS_MENU = 0x0B,
433 CEC_USER_CONTROL_CODE_FAVORITE_MENU = 0x0C,
434 CEC_USER_CONTROL_CODE_EXIT = 0x0D,
435 CEC_USER_CONTROL_CODE_NUMBER0 = 0x20,
436 CEC_USER_CONTROL_CODE_NUMBER1 = 0x21,
437 CEC_USER_CONTROL_CODE_NUMBER2 = 0x22,
438 CEC_USER_CONTROL_CODE_NUMBER3 = 0x23,
439 CEC_USER_CONTROL_CODE_NUMBER4 = 0x24,
440 CEC_USER_CONTROL_CODE_NUMBER5 = 0x25,
441 CEC_USER_CONTROL_CODE_NUMBER6 = 0x26,
442 CEC_USER_CONTROL_CODE_NUMBER7 = 0x27,
443 CEC_USER_CONTROL_CODE_NUMBER8 = 0x28,
444 CEC_USER_CONTROL_CODE_NUMBER9 = 0x29,
445 CEC_USER_CONTROL_CODE_DOT = 0x2A,
446 CEC_USER_CONTROL_CODE_ENTER = 0x2B,
447 CEC_USER_CONTROL_CODE_CLEAR = 0x2C,
448 CEC_USER_CONTROL_CODE_NEXT_FAVORITE = 0x2F,
449 CEC_USER_CONTROL_CODE_CHANNEL_UP = 0x30,
450 CEC_USER_CONTROL_CODE_CHANNEL_DOWN = 0x31,
451 CEC_USER_CONTROL_CODE_PREVIOUS_CHANNEL = 0x32,
452 CEC_USER_CONTROL_CODE_SOUND_SELECT = 0x33,
453 CEC_USER_CONTROL_CODE_INPUT_SELECT = 0x34,
454 CEC_USER_CONTROL_CODE_DISPLAY_INFORMATION = 0x35,
455 CEC_USER_CONTROL_CODE_HELP = 0x36,
456 CEC_USER_CONTROL_CODE_PAGE_UP = 0x37,
457 CEC_USER_CONTROL_CODE_PAGE_DOWN = 0x38,
458 CEC_USER_CONTROL_CODE_POWER = 0x40,
459 CEC_USER_CONTROL_CODE_VOLUME_UP = 0x41,
460 CEC_USER_CONTROL_CODE_VOLUME_DOWN = 0x42,
461 CEC_USER_CONTROL_CODE_MUTE = 0x43,
462 CEC_USER_CONTROL_CODE_PLAY = 0x44,
463 CEC_USER_CONTROL_CODE_STOP = 0x45,
464 CEC_USER_CONTROL_CODE_PAUSE = 0x46,
465 CEC_USER_CONTROL_CODE_RECORD = 0x47,
466 CEC_USER_CONTROL_CODE_REWIND = 0x48,
467 CEC_USER_CONTROL_CODE_FAST_FORWARD = 0x49,
468 CEC_USER_CONTROL_CODE_EJECT = 0x4A,
469 CEC_USER_CONTROL_CODE_FORWARD = 0x4B,
470 CEC_USER_CONTROL_CODE_BACKWARD = 0x4C,
471 CEC_USER_CONTROL_CODE_STOP_RECORD = 0x4D,
472 CEC_USER_CONTROL_CODE_PAUSE_RECORD = 0x4E,
473 CEC_USER_CONTROL_CODE_ANGLE = 0x50,
474 CEC_USER_CONTROL_CODE_SUB_PICTURE = 0x51,
475 CEC_USER_CONTROL_CODE_VIDEO_ON_DEMAND = 0x52,
476 CEC_USER_CONTROL_CODE_ELECTRONIC_PROGRAM_GUIDE = 0x53,
477 CEC_USER_CONTROL_CODE_TIMER_PROGRAMMING = 0x54,
478 CEC_USER_CONTROL_CODE_INITIAL_CONFIGURATION = 0x55,
479 CEC_USER_CONTROL_CODE_PLAY_FUNCTION = 0x60,
480 CEC_USER_CONTROL_CODE_PAUSE_PLAY_FUNCTION = 0x61,
481 CEC_USER_CONTROL_CODE_RECORD_FUNCTION = 0x62,
482 CEC_USER_CONTROL_CODE_PAUSE_RECORD_FUNCTION = 0x63,
483 CEC_USER_CONTROL_CODE_STOP_FUNCTION = 0x64,
484 CEC_USER_CONTROL_CODE_MUTE_FUNCTION = 0x65,
485 CEC_USER_CONTROL_CODE_RESTORE_VOLUME_FUNCTION = 0x66,
486 CEC_USER_CONTROL_CODE_TUNE_FUNCTION = 0x67,
487 CEC_USER_CONTROL_CODE_SELECT_MEDIA_FUNCTION = 0x68,
488 CEC_USER_CONTROL_CODE_SELECT_AV_INPUT_FUNCTION = 0x69,
acec5f48 489 CEC_USER_CONTROL_CODE_SELECT_AUDIO_INPUT_FUNCTION = 0x6A,
5ae8fa48
LOK
490 CEC_USER_CONTROL_CODE_POWER_TOGGLE_FUNCTION = 0x6B,
491 CEC_USER_CONTROL_CODE_POWER_OFF_FUNCTION = 0x6C,
492 CEC_USER_CONTROL_CODE_POWER_ON_FUNCTION = 0x6D,
493 CEC_USER_CONTROL_CODE_F1_BLUE = 0x71,
494 CEC_USER_CONTROL_CODE_F2_RED = 0X72,
495 CEC_USER_CONTROL_CODE_F3_GREEN = 0x73,
496 CEC_USER_CONTROL_CODE_F4_YELLOW = 0x74,
497 CEC_USER_CONTROL_CODE_F5 = 0x75,
498 CEC_USER_CONTROL_CODE_DATA = 0x76,
b60a3d77 499 CEC_USER_CONTROL_CODE_AN_RETURN = 0x91,
340ce76c
LOK
500 CEC_USER_CONTROL_CODE_AN_CHANNELS_LIST = 0x96,
501 CEC_USER_CONTROL_CODE_MAX = 0x96,
acec5f48
LOK
502 CEC_USER_CONTROL_CODE_UNKNOWN
503} cec_user_control_code;
504
505typedef enum cec_logical_address
506{
5ae8fa48
LOK
507 CECDEVICE_UNKNOWN = -1, //not a valid logical address
508 CECDEVICE_TV = 0,
509 CECDEVICE_RECORDINGDEVICE1 = 1,
510 CECDEVICE_RECORDINGDEVICE2 = 2,
511 CECDEVICE_TUNER1 = 3,
512 CECDEVICE_PLAYBACKDEVICE1 = 4,
513 CECDEVICE_AUDIOSYSTEM = 5,
514 CECDEVICE_TUNER2 = 6,
515 CECDEVICE_TUNER3 = 7,
516 CECDEVICE_PLAYBACKDEVICE2 = 8,
517 CECDEVICE_RECORDINGDEVICE3 = 9,
518 CECDEVICE_TUNER4 = 10,
519 CECDEVICE_PLAYBACKDEVICE3 = 11,
520 CECDEVICE_RESERVED1 = 12,
521 CECDEVICE_RESERVED2 = 13,
522 CECDEVICE_FREEUSE = 14,
523 CECDEVICE_UNREGISTERED = 15,
524 CECDEVICE_BROADCAST = 15
acec5f48
LOK
525} cec_logical_address;
526
527typedef enum cec_opcode
528{
5ae8fa48
LOK
529 CEC_OPCODE_ACTIVE_SOURCE = 0x82,
530 CEC_OPCODE_IMAGE_VIEW_ON = 0x04,
531 CEC_OPCODE_TEXT_VIEW_ON = 0x0D,
532 CEC_OPCODE_INACTIVE_SOURCE = 0x9D,
533 CEC_OPCODE_REQUEST_ACTIVE_SOURCE = 0x85,
534 CEC_OPCODE_ROUTING_CHANGE = 0x80,
535 CEC_OPCODE_ROUTING_INFORMATION = 0x81,
536 CEC_OPCODE_SET_STREAM_PATH = 0x86,
537 CEC_OPCODE_STANDBY = 0x36,
538 CEC_OPCODE_RECORD_OFF = 0x0B,
539 CEC_OPCODE_RECORD_ON = 0x09,
540 CEC_OPCODE_RECORD_STATUS = 0x0A,
541 CEC_OPCODE_RECORD_TV_SCREEN = 0x0F,
542 CEC_OPCODE_CLEAR_ANALOGUE_TIMER = 0x33,
543 CEC_OPCODE_CLEAR_DIGITAL_TIMER = 0x99,
544 CEC_OPCODE_CLEAR_EXTERNAL_TIMER = 0xA1,
545 CEC_OPCODE_SET_ANALOGUE_TIMER = 0x34,
546 CEC_OPCODE_SET_DIGITAL_TIMER = 0x97,
547 CEC_OPCODE_SET_EXTERNAL_TIMER = 0xA2,
548 CEC_OPCODE_SET_TIMER_PROGRAM_TITLE = 0x67,
549 CEC_OPCODE_TIMER_CLEARED_STATUS = 0x43,
550 CEC_OPCODE_TIMER_STATUS = 0x35,
551 CEC_OPCODE_CEC_VERSION = 0x9E,
552 CEC_OPCODE_GET_CEC_VERSION = 0x9F,
553 CEC_OPCODE_GIVE_PHYSICAL_ADDRESS = 0x83,
554 CEC_OPCODE_GET_MENU_LANGUAGE = 0x91,
555 CEC_OPCODE_REPORT_PHYSICAL_ADDRESS = 0x84,
556 CEC_OPCODE_SET_MENU_LANGUAGE = 0x32,
557 CEC_OPCODE_DECK_CONTROL = 0x42,
558 CEC_OPCODE_DECK_STATUS = 0x1B,
559 CEC_OPCODE_GIVE_DECK_STATUS = 0x1A,
560 CEC_OPCODE_PLAY = 0x41,
561 CEC_OPCODE_GIVE_TUNER_DEVICE_STATUS = 0x08,
562 CEC_OPCODE_SELECT_ANALOGUE_SERVICE = 0x92,
563 CEC_OPCODE_SELECT_DIGITAL_SERVICE = 0x93,
564 CEC_OPCODE_TUNER_DEVICE_STATUS = 0x07,
565 CEC_OPCODE_TUNER_STEP_DECREMENT = 0x06,
566 CEC_OPCODE_TUNER_STEP_INCREMENT = 0x05,
567 CEC_OPCODE_DEVICE_VENDOR_ID = 0x87,
568 CEC_OPCODE_GIVE_DEVICE_VENDOR_ID = 0x8C,
569 CEC_OPCODE_VENDOR_COMMAND = 0x89,
570 CEC_OPCODE_VENDOR_COMMAND_WITH_ID = 0xA0,
571 CEC_OPCODE_VENDOR_REMOTE_BUTTON_DOWN = 0x8A,
572 CEC_OPCODE_VENDOR_REMOTE_BUTTON_UP = 0x8B,
573 CEC_OPCODE_SET_OSD_STRING = 0x64,
574 CEC_OPCODE_GIVE_OSD_NAME = 0x46,
575 CEC_OPCODE_SET_OSD_NAME = 0x47,
576 CEC_OPCODE_MENU_REQUEST = 0x8D,
577 CEC_OPCODE_MENU_STATUS = 0x8E,
578 CEC_OPCODE_USER_CONTROL_PRESSED = 0x44,
579 CEC_OPCODE_USER_CONTROL_RELEASE = 0x45,
580 CEC_OPCODE_GIVE_DEVICE_POWER_STATUS = 0x8F,
581 CEC_OPCODE_REPORT_POWER_STATUS = 0x90,
582 CEC_OPCODE_FEATURE_ABORT = 0x00,
583 CEC_OPCODE_ABORT = 0xFF,
584 CEC_OPCODE_GIVE_AUDIO_STATUS = 0x71,
acec5f48 585 CEC_OPCODE_GIVE_SYSTEM_AUDIO_MODE_STATUS = 0x7D,
5ae8fa48
LOK
586 CEC_OPCODE_REPORT_AUDIO_STATUS = 0x7A,
587 CEC_OPCODE_SET_SYSTEM_AUDIO_MODE = 0x72,
588 CEC_OPCODE_SYSTEM_AUDIO_MODE_REQUEST = 0x70,
589 CEC_OPCODE_SYSTEM_AUDIO_MODE_STATUS = 0x7E,
590 CEC_OPCODE_SET_AUDIO_RATE = 0x9A,
38ba806c
LOK
591
592 /* CEC 1.4 */
593 CEC_OPCODE_START_ARC = 0xC0,
594 CEC_OPCODE_REPORT_ARC_STARTED = 0xC1,
595 CEC_OPCODE_REPORT_ARC_ENDED = 0xC2,
596 CEC_OPCODE_REQUEST_ARC_START = 0xC3,
597 CEC_OPCODE_REQUEST_ARC_END = 0xC4,
598 CEC_OPCODE_END_ARC = 0xC5,
599 CEC_OPCODE_CDC = 0xF8,
5ae8fa48
LOK
600 /* when this opcode is set, no opcode will be sent to the device. this is one of the reserved numbers */
601 CEC_OPCODE_NONE = 0xFD
acec5f48
LOK
602} cec_opcode;
603
604typedef enum cec_log_level
605{
941c58b9
LOK
606 CEC_LOG_ERROR = 1,
607 CEC_LOG_WARNING = 2,
608 CEC_LOG_NOTICE = 4,
609 CEC_LOG_TRAFFIC = 8,
610 CEC_LOG_DEBUG = 16,
611 CEC_LOG_ALL = 31
acec5f48
LOK
612} cec_log_level;
613
acec5f48
LOK
614typedef enum cec_adapter_messagecode
615{
616 MSGCODE_NOTHING = 0,
617 MSGCODE_PING,
618 MSGCODE_TIMEOUT_ERROR,
619 MSGCODE_HIGH_ERROR,
620 MSGCODE_LOW_ERROR,
621 MSGCODE_FRAME_START,
622 MSGCODE_FRAME_DATA,
623 MSGCODE_RECEIVE_FAILED,
624 MSGCODE_COMMAND_ACCEPTED,
625 MSGCODE_COMMAND_REJECTED,
626 MSGCODE_SET_ACK_MASK,
627 MSGCODE_TRANSMIT,
628 MSGCODE_TRANSMIT_EOM,
629 MSGCODE_TRANSMIT_IDLETIME,
630 MSGCODE_TRANSMIT_ACK_POLARITY,
631 MSGCODE_TRANSMIT_LINE_TIMEOUT,
632 MSGCODE_TRANSMIT_SUCCEEDED,
633 MSGCODE_TRANSMIT_FAILED_LINE,
634 MSGCODE_TRANSMIT_FAILED_ACK,
635 MSGCODE_TRANSMIT_FAILED_TIMEOUT_DATA,
636 MSGCODE_TRANSMIT_FAILED_TIMEOUT_LINE,
637 MSGCODE_FIRMWARE_VERSION,
638 MSGCODE_START_BOOTLOADER,
b2f56d35 639 MSGCODE_GET_BUILDDATE,
9bb14797 640 MSGCODE_SET_CONTROLLED,
da59dc5f
LOK
641 MSGCODE_GET_AUTO_ENABLED,
642 MSGCODE_SET_AUTO_ENABLED,
643 MSGCODE_GET_DEFAULT_LOGICAL_ADDRESS,
644 MSGCODE_SET_DEFAULT_LOGICAL_ADDRESS,
645 MSGCODE_GET_LOGICAL_ADDRESS_MASK,
646 MSGCODE_SET_LOGICAL_ADDRESS_MASK,
647 MSGCODE_GET_PHYSICAL_ADDRESS,
648 MSGCODE_SET_PHYSICAL_ADDRESS,
649 MSGCODE_GET_DEVICE_TYPE,
650 MSGCODE_SET_DEVICE_TYPE,
651 MSGCODE_GET_HDMI_VERSION,
652 MSGCODE_SET_HDMI_VERSION,
653 MSGCODE_GET_OSD_NAME,
654 MSGCODE_SET_OSD_NAME,
655 MSGCODE_WRITE_EEPROM,
acec5f48
LOK
656 MSGCODE_FRAME_EOM = 0x80,
657 MSGCODE_FRAME_ACK = 0x40,
658} cec_adapter_messagecode;
659
f8ae3295
LOK
660typedef enum cec_bus_device_status
661{
662 CEC_DEVICE_STATUS_UNKNOWN,
663 CEC_DEVICE_STATUS_PRESENT,
664 CEC_DEVICE_STATUS_NOT_PRESENT,
665 CEC_DEVICE_STATUS_HANDLED_BY_LIBCEC
666} cec_bus_device_status;
667
5ae8fa48
LOK
668typedef enum cec_vendor_id
669{
1a87cacc
LOK
670 CEC_VENDOR_SAMSUNG = 0x0000F0,
671 CEC_VENDOR_LG = 0x00E091,
672 CEC_VENDOR_PANASONIC = 0x008045,
673 CEC_VENDOR_PIONEER = 0x00E036,
674 CEC_VENDOR_ONKYO = 0x0009B0,
675 CEC_VENDOR_YAMAHA = 0x00A0DE,
676 CEC_VENDOR_PHILIPS = 0x00903E,
677 CEC_VENDOR_SONY = 0x080046,
26555d6b 678 CEC_VENDOR_TOSHIBA = 0x000039,
23d38eec
LOK
679 CEC_VENDOR_AKAI = 0x0020C7,
680 CEC_VENDOR_AOC = 0x002467,
681 CEC_VENDOR_BENQ = 0x8065E9,
682 CEC_VENDOR_DAEWOO = 0x009053,
683 CEC_VENDOR_GRUNDIG = 0x00D0D5,
684 CEC_VENDOR_MEDION = 0x000CB8,
685 CEC_VENDOR_SHARP = 0x08001F,
8dd7087c 686 CEC_VENDOR_VIZIO = 0x6B746D,
23d38eec 687
5ae8fa48
LOK
688 CEC_VENDOR_UNKNOWN = 0
689} cec_vendor_id;
690
691typedef struct cec_menu_language
692{
b453e1b8 693 char language[4]; /**< the iso language code. @bug the language code is only 3 chars long, not 4. will be changed in v2.0, because changing it now would break backwards compat */
8d901fdb 694 cec_logical_address device; /**< the logical address of the device */
5ae8fa48
LOK
695} cec_menu_language;
696
ed21be2a
LOK
697typedef struct cec_osd_name
698{
8d901fdb
LOK
699 char name[14]; /**< the name of the device */
700 cec_logical_address device; /**< the logical address of the device */
ed21be2a
LOK
701} cec_osd_name;
702
5ae8fa48
LOK
703typedef struct cec_log_message
704{
8d901fdb
LOK
705 char message[1024]; /**< the actual message */
706 cec_log_level level; /**< log level of the message */
707 int64_t time; /**< the timestamp of this message */
5ae8fa48
LOK
708} cec_log_message;
709
710typedef struct cec_keypress
711{
8d901fdb
LOK
712 cec_user_control_code keycode; /**< the keycode */
713 unsigned int duration; /**< the duration of the keypress */
5ae8fa48
LOK
714} cec_keypress;
715
716typedef struct cec_adapter
717{
8d901fdb
LOK
718 char path[1024]; /**< the path to the com port */
719 char comm[1024]; /**< the name of the com port */
5ae8fa48
LOK
720} cec_adapter;
721
acec5f48
LOK
722typedef struct cec_datapacket
723{
8d901fdb
LOK
724 uint8_t data[100]; /**< the actual data */
725 uint8_t size; /**< the size of the data */
acec5f48
LOK
726
727#ifdef __cplusplus
60a245d1
LOK
728 cec_datapacket &operator =(const struct cec_datapacket &packet)
729 {
ab1469a0 730 Clear();
60a245d1 731 for (uint8_t iPtr = 0; iPtr < packet.size; iPtr++)
ab1469a0 732 PushBack(packet[iPtr]);
60a245d1
LOK
733
734 return *this;
735 }
736
f1f91c81
LOK
737 bool IsEmpty(void) const { return size == 0; } /**< @return True when this packet is empty, false otherwise. */
738 bool IsFull(void) const { return size == 100; } /**< @return True when this packet is false, false otherwise. */
739
740 /*!
741 * @brief Get the byte at the requested position.
742 * @param pos The position.
743 * @return The byte, or 0 when out of bounds.
744 */
acec5f48 745 uint8_t operator[](uint8_t pos) const { return pos < size ? data[pos] : 0; }
f1f91c81
LOK
746 /*!
747 * @brief Get the byte at the requested position.
748 * @param pos The position.
749 * @return The byte, or 0 when out of bounds.
750 */
ab1469a0 751 uint8_t At(uint8_t pos) const { return pos < size ? data[pos] : 0; }
acec5f48 752
f1f91c81
LOK
753 /*!
754 * @brief Shift the contents of this packet.
755 * @param iShiftBy The number of positions to shift.
756 */
ab1469a0 757 void Shift(uint8_t iShiftBy)
acec5f48
LOK
758 {
759 if (iShiftBy >= size)
760 {
ab1469a0 761 Clear();
acec5f48
LOK
762 }
763 else
764 {
765 for (uint8_t iPtr = 0; iPtr < size; iPtr++)
766 data[iPtr] = (iPtr + iShiftBy < size) ? data[iPtr + iShiftBy] : 0;
767 size = (uint8_t) (size - iShiftBy);
768 }
769 }
770
f1f91c81
LOK
771 /*!
772 * @brief Push a byte to the end of this packet.
773 * @param add The byte to add.
774 */
ab1469a0 775 void PushBack(uint8_t add)
acec5f48
LOK
776 {
777 if (size < 100)
778 data[size++] = add;
779 }
780
f1f91c81
LOK
781 /*!
782 * @brief Clear this packet.
783 */
ab1469a0 784 void Clear(void)
acec5f48
LOK
785 {
786 memset(data, 0, sizeof(data));
787 size = 0;
788 }
789#endif
790
791} cec_datapacket;
792
acec5f48
LOK
793typedef struct cec_command
794{
8d901fdb
LOK
795 cec_logical_address initiator; /**< the logical address of the initiator of this message */
796 cec_logical_address destination; /**< the logical address of the destination of this message */
797 int8_t ack; /**< 1 when the ACK bit is set, 0 otherwise */
798 int8_t eom; /**< 1 when the EOM bit is set, 0 otherwise */
799 cec_opcode opcode; /**< the opcode of this message */
800 cec_datapacket parameters; /**< the parameters attached to this message */
801 int8_t opcode_set; /**< 1 when an opcode is set, 0 otherwise (POLL message) */
802 int32_t transmit_timeout; /**< the timeout to use in ms */
acec5f48
LOK
803
804#ifdef __cplusplus
38f1fbcc
LOK
805 // @todo re-add in v2.0 (breaks ABI)
806 //cec_command(void)
807 //{
808 // Clear();
809 //}
a928fcdc 810
60a245d1
LOK
811 cec_command &operator =(const struct cec_command &command)
812 {
813 initiator = command.initiator;
814 destination = command.destination;
815 ack = command.ack;
816 eom = command.eom;
817 opcode = command.opcode;
818 opcode_set = command.opcode_set;
819 transmit_timeout = command.transmit_timeout;
820 parameters = command.parameters;
821
822 return *this;
823 }
824
f1f91c81
LOK
825 /*!
826 * @brief Formats a cec_command.
827 * @param command The command to format.
828 * @param initiator The logical address of the initiator.
829 * @param destination The logical addres of the destination.
830 * @param opcode The opcode of the command.
831 * @param timeout The transmission timeout.
832 */
ae693aaa 833 static void Format(cec_command &command, cec_logical_address initiator, cec_logical_address destination, cec_opcode opcode, int32_t timeout = CEC_DEFAULT_TRANSMIT_TIMEOUT)
acec5f48 834 {
ab1469a0 835 command.Clear();
caaf64d7
LOK
836 command.initiator = initiator;
837 command.destination = destination;
838 command.transmit_timeout = timeout;
57f45e6c
LOK
839 if (opcode != CEC_OPCODE_NONE)
840 {
841 command.opcode = opcode;
842 command.opcode_set = 1;
843 }
acec5f48
LOK
844 }
845
f1f91c81
LOK
846 /*!
847 * @brief Push a byte to the back of this command.
848 * @param data The byte to push.
849 */
ab1469a0 850 void PushBack(uint8_t data)
acec5f48 851 {
b2da2768
LOK
852 if (initiator == CECDEVICE_UNKNOWN && destination == CECDEVICE_UNKNOWN)
853 {
854 initiator = (cec_logical_address) (data >> 4);
855 destination = (cec_logical_address) (data & 0xF);
856 }
857 else if (!opcode_set)
acec5f48 858 {
02ee2c68 859 opcode_set = 1;
acec5f48
LOK
860 opcode = (cec_opcode) data;
861 }
862 else
ab1469a0 863 parameters.PushBack(data);
acec5f48
LOK
864 }
865
f1f91c81
LOK
866 /*!
867 * @brief Clear this command, resetting everything to the default values.
868 */
ab1469a0 869 void Clear(void)
acec5f48 870 {
1f0e9e0f
LOK
871 initiator = CECDEVICE_UNKNOWN;
872 destination = CECDEVICE_UNKNOWN;
873 ack = 0;
874 eom = 0;
875 opcode_set = 0;
876 opcode = CEC_OPCODE_FEATURE_ABORT;
ae693aaa 877 transmit_timeout = CEC_DEFAULT_TRANSMIT_TIMEOUT;
ab1469a0 878 parameters.Clear();
acec5f48 879 };
24d82513
LOK
880
881 static cec_opcode GetResponseOpcode(cec_opcode opcode)
882 {
883 switch (opcode)
884 {
885 case CEC_OPCODE_REQUEST_ACTIVE_SOURCE:
886 return CEC_OPCODE_ACTIVE_SOURCE;
887 case CEC_OPCODE_GET_CEC_VERSION:
888 return CEC_OPCODE_CEC_VERSION;
889 case CEC_OPCODE_GIVE_PHYSICAL_ADDRESS:
890 return CEC_OPCODE_REPORT_PHYSICAL_ADDRESS;
891 case CEC_OPCODE_GET_MENU_LANGUAGE:
892 return CEC_OPCODE_SET_MENU_LANGUAGE;
893 case CEC_OPCODE_GIVE_DECK_STATUS:
894 return CEC_OPCODE_DECK_STATUS;
895 case CEC_OPCODE_GIVE_TUNER_DEVICE_STATUS:
896 return CEC_OPCODE_TUNER_DEVICE_STATUS;
897 case CEC_OPCODE_GIVE_DEVICE_VENDOR_ID:
898 return CEC_OPCODE_DEVICE_VENDOR_ID;
899 case CEC_OPCODE_GIVE_OSD_NAME:
4fde2fd0 900 return CEC_OPCODE_SET_OSD_NAME;
24d82513
LOK
901 case CEC_OPCODE_MENU_REQUEST:
902 return CEC_OPCODE_MENU_STATUS;
903 case CEC_OPCODE_GIVE_DEVICE_POWER_STATUS:
904 return CEC_OPCODE_REPORT_POWER_STATUS;
905 case CEC_OPCODE_GIVE_AUDIO_STATUS:
906 return CEC_OPCODE_REPORT_AUDIO_STATUS;
907 case CEC_OPCODE_GIVE_SYSTEM_AUDIO_MODE_STATUS:
908 return CEC_OPCODE_SYSTEM_AUDIO_MODE_STATUS;
909 case CEC_OPCODE_SYSTEM_AUDIO_MODE_REQUEST:
910 return CEC_OPCODE_SET_SYSTEM_AUDIO_MODE;
911 default:
912 break;
913 }
914
4fde2fd0 915 return CEC_OPCODE_NONE;
24d82513 916 }
0b7822f9
LOK
917
918 void PushArray(size_t len, uint8_t *data)
919 {
920 for (size_t iPtr = 0; iPtr < len; iPtr++)
921 PushBack(data[iPtr]);
922 }
acec5f48
LOK
923#endif
924} cec_command;
925
5ae8fa48 926typedef struct cec_device_type_list
acec5f48 927{
8d901fdb 928 cec_device_type types[5]; /**< the list of device types */
0500da96 929
5ae8fa48 930#ifdef __cplusplus
c23380e7 931 /*!
f1f91c81
LOK
932 * @deprecated Use Clear() instead.
933 * @brief Clear this list.
c23380e7
LOK
934 */
935 void clear(void) { Clear(); }
936 /*!
f1f91c81
LOK
937 * @deprecated Use Add() instead.
938 * @brief Add a type to this list.
939 * @param type The type to add.
c23380e7
LOK
940 */
941 void add(const cec_device_type type) { Add(type); }
942
f1f91c81
LOK
943 /*!
944 * @brief Clear this list.
945 */
c23380e7 946 void Clear(void)
5ae8fa48
LOK
947 {
948 for (unsigned int iPtr = 0; iPtr < 5; iPtr++)
949 types[iPtr] = CEC_DEVICE_TYPE_RESERVED;
950 }
eafd9bed 951
f1f91c81
LOK
952 /*!
953 * @brief Add a type to this list.
954 * @param type The type to add.
955 */
c23380e7 956 void Add(const cec_device_type type)
5ae8fa48
LOK
957 {
958 for (unsigned int iPtr = 0; iPtr < 5; iPtr++)
959 {
960 if (types[iPtr] == CEC_DEVICE_TYPE_RESERVED)
961 {
962 types[iPtr] = type;
963 break;
964 }
965 }
966 }
967
f1f91c81
LOK
968 /*!
969 * @brief Check whether a type is set in this list.
970 * @param type The type to check.
971 * @return True when set, false otherwise.
972 */
c30acafa 973 bool IsSet(cec_device_type type)
5ae8fa48
LOK
974 {
975 bool bReturn(false);
976 for (unsigned int iPtr = 0; !bReturn && iPtr < 5; iPtr++)
977 {
978 if (types[iPtr] == type)
979 bReturn = true;
980 }
981 return bReturn;
982 }
983
f1f91c81
LOK
984 /*!
985 * @return True when this list is empty, false otherwise.
986 */
7c5c5bf4 987 bool IsEmpty() const
5ae8fa48
LOK
988 {
989 bool bReturn(true);
990 for (unsigned int iPtr = 0; bReturn && iPtr < 5; iPtr++)
991 {
992 if (types[iPtr] != CEC_DEVICE_TYPE_RESERVED)
993 bReturn = false;
994 }
995 return bReturn;
996 }
997
f1f91c81
LOK
998 /*!
999 * @brief Get the type at the requested position.
1000 * @param pos The position.
1001 * @return The type, or CEC_DEVICE_TYPE_RESERVED when out of bounds.
1002 */
5ae8fa48 1003 cec_device_type operator[](uint8_t pos) const { return pos < 5 ? types[pos] : CEC_DEVICE_TYPE_RESERVED; }
f1f91c81 1004
30b4aac0
LOK
1005 bool operator==(const cec_device_type_list &other) const
1006 {
1007 bool bEqual(true);
1008 for (uint8_t iPtr = 0; iPtr < 5; iPtr++)
1009 bEqual &= (types[iPtr] == other[iPtr]);
1010 return bEqual;
1011 }
1012
1013 bool operator!=(const cec_device_type_list &other) const
1014 {
1015 return !(*this == other);
1016 }
5ae8fa48
LOK
1017#endif
1018} cec_device_type_list;
1019
1020typedef struct cec_logical_addresses
1021{
8d901fdb
LOK
1022 cec_logical_address primary; /**< the primary logical address to use */
1023 int addresses[16]; /**< the list of addresses */
5ae8fa48
LOK
1024
1025#ifdef __cplusplus
f1f91c81
LOK
1026 /*!
1027 * @brief Clear this list.
1028 */
5ae8fa48
LOK
1029 void Clear(void)
1030 {
004b8382 1031 primary = CECDEVICE_UNREGISTERED;
5ae8fa48
LOK
1032 for (unsigned int iPtr = 0; iPtr < 16; iPtr++)
1033 addresses[iPtr] = 0;
1034 }
1035
f1f91c81
LOK
1036 /*!
1037 * @return True when empty, false otherwise.
1038 */
5ae8fa48
LOK
1039 bool IsEmpty(void) const
1040 {
004b8382 1041 return primary == CECDEVICE_UNREGISTERED;
5ae8fa48
LOK
1042 }
1043
f1f91c81
LOK
1044 /*!
1045 * @brief Calculate the ack-mask for this list, the mask to use when determining whether to send an ack message or not.
1046 * @return The ack-mask.
1047 */
5ae8fa48
LOK
1048 uint16_t AckMask(void) const
1049 {
1050 uint16_t mask = 0;
1051 for (unsigned int iPtr = 0; iPtr < 16; iPtr++)
1052 if (addresses[iPtr] == 1)
1053 mask |= 0x1 << iPtr;
1054 return mask;
1055 }
1056
f1f91c81
LOK
1057 /*!
1058 * @brief Mark a logical address as 'set'
1059 * @param address The logical address to add to this list.
1060 */
5ae8fa48
LOK
1061 void Set(cec_logical_address address)
1062 {
004b8382 1063 if (primary == CECDEVICE_UNREGISTERED)
5ae8fa48
LOK
1064 primary = address;
1065
1066 addresses[(int) address] = 1;
1067 }
1068
f1f91c81
LOK
1069 /*!
1070 * @brief Mark a logical address as 'unset'
1071 * @param address The logical address to remove from this list.
1072 */
004b8382 1073 void Unset(const cec_logical_address address)
5ae8fa48
LOK
1074 {
1075 if (primary == address)
004b8382 1076 primary = CECDEVICE_UNREGISTERED;
5ae8fa48
LOK
1077
1078 addresses[(int) address] = 0;
1079 }
1080
f1f91c81
LOK
1081 /*!
1082 * @brief Check whether an address is set in this list.
1083 * @param address The address to check.
1084 * @return True when set, false otherwise.
1085 */
c30acafa 1086 bool IsSet(cec_logical_address address) const { return addresses[(int) address] == 1; }
f1f91c81
LOK
1087
1088 /*!
1089 * @brief Check whether an address is set in this list.
1090 * @param pos The address to check.
1091 * @return True when set, false otherwise.
1092 */
5ae8fa48 1093 bool operator[](uint8_t pos) const { return pos < 16 ? IsSet((cec_logical_address) pos) : false; }
30b4aac0
LOK
1094
1095 bool operator==(const cec_logical_addresses &other) const
1096 {
1097 bool bEqual(true);
1098 for (uint8_t iPtr = 0; iPtr < 16; iPtr++)
1099 bEqual &= ((addresses[(int)iPtr] == 1) == other[iPtr]);
1100 return bEqual;
1101 }
1102
1103 bool operator!=(const cec_logical_addresses &other) const
1104 {
1105 return !(*this == other);
1106 }
5ae8fa48
LOK
1107#endif
1108} cec_logical_addresses;
acec5f48 1109
5ee37222
MK
1110typedef enum libcec_alert
1111{
b1c47f9d 1112 CEC_ALERT_SERVICE_DEVICE,
7068f331
LOK
1113 CEC_ALERT_CONNECTION_LOST,
1114 CEC_ALERT_PERMISSION_ERROR,
1115 CEC_ALERT_PORT_BUSY
5ee37222
MK
1116} libcec_alert;
1117
1118typedef enum libcec_parameter_type
1119{
5daed059
LOK
1120 CEC_PARAMETER_TYPE_STRING,
1121 CEC_PARAMETER_TYPE_UNKOWN
5ee37222
MK
1122} libcec_parameter_type;
1123
1124struct libcec_parameter
1125{
8d901fdb
LOK
1126 libcec_parameter_type paramType; /**< the type of this parameter */
1127 void* paramData; /**< the value of this parameter */
5ee37222
MK
1128};
1129
32403cc3
LOK
1130struct libcec_configuration;
1131
1132typedef int (CEC_CDECL* CBCecLogMessageType)(void *param, const cec_log_message &);
e9654a0e
LOK
1133typedef int (CEC_CDECL* CBCecKeyPressType)(void *param, const cec_keypress &);
1134typedef int (CEC_CDECL* CBCecCommandType)(void *param, const cec_command &);
32403cc3 1135typedef int (CEC_CDECL* CBCecConfigurationChangedType)(void *param, const libcec_configuration &);
5ee37222 1136typedef int (CEC_CDECL* CBCecAlertType)(void *param, const libcec_alert, const libcec_parameter &);
c3a20edb 1137typedef int (CEC_CDECL* CBCecMenuStateChangedType)(void *param, const cec_menu_state);
29d5198c 1138typedef void (CEC_CDECL* CBCecSourceActivatedType)(void *param, const cec_logical_address, const uint8_t);
c3039d2e
LOK
1139
1140typedef struct ICECCallbacks
fa4798bd
LOK
1141{
1142 /*!
1143 * @brief Transfer a log message from libCEC to the client.
1144 * @param message The message to transfer.
1145 * @return 1 when ok, 0 otherwise.
1146 */
c3039d2e 1147 CBCecLogMessageType CBCecLogMessage;
fa4798bd
LOK
1148
1149 /*!
1150 * @brief Transfer a keypress from libCEC to the client.
1151 * @param key The keypress to transfer.
1152 * @return 1 when ok, 0 otherwise.
1153 */
c3039d2e 1154 CBCecKeyPressType CBCecKeyPress;
fa4798bd
LOK
1155
1156 /*!
1157 * @brief Transfer a CEC command from libCEC to the client.
1158 * @param command The command to transfer.
1159 * @return 1 when ok, 0 otherwise.
1160 */
c3039d2e 1161 CBCecCommandType CBCecCommand;
32403cc3
LOK
1162
1163 /*!
1164 * @brief Transfer a changed configuration from libCEC to the client
1165 * @param configuration The configuration to transfer
1166 * @return 1 when ok, 0 otherwise
1167 */
1168 CBCecConfigurationChangedType CBCecConfigurationChanged;
5ee37222
MK
1169
1170 /*!
8d901fdb
LOK
1171 * @brief Transfer a libcec alert message from libCEC to the client
1172 * @param alert The alert type transfer.
1173 * @param data Misc. additional information.
5ee37222
MK
1174 * @return 1 when ok, 0 otherwise
1175 */
1176 CBCecAlertType CBCecAlert;
e1804a4e
LOK
1177
1178 /*!
c3ce6b47
LOK
1179 * @brief Transfer a menu state change to the client.
1180 * Transfer a menu state change to the client. If the command returns 1, then the change will be processed by
e1804a4e 1181 * the busdevice. If 0, then the state of the busdevice won't be changed, and will always be kept 'activated',
6ad51ff5 1182 * @warning CEC does not allow the player to suppress the menu state change on the TV, so the menu on the TV will always be displayed, whatever the return value of this method is.
e1804a4e
LOK
1183 * so keypresses are always routed.
1184 * @param newVal The new value.
6ad51ff5 1185 * @return 1 when libCEC should use this new value, 0 otherwise.
e1804a4e 1186 */
c3ce6b47 1187 CBCecMenuStateChangedType CBCecMenuStateChanged;
e1804a4e 1188
29d5198c
LOK
1189 /*!
1190 * @brief Called when a source that's handled by this client is activated.
1191 * @param logicalAddress The address that was just activated.
1192 * @param bActivated 1 when activated, 0 when deactivated.
1193 */
1194 CBCecSourceActivatedType CBCecSourceActivated;
1195
e1804a4e 1196#ifdef __cplusplus
38f1fbcc
LOK
1197 // @todo re-add in v2.0 (breaks ABI)
1198 // ICECCallbacks(void) { Clear(); }
1199 //~ICECCallbacks(void) { Clear(); };
e1804a4e
LOK
1200
1201 void Clear(void)
1202 {
1203 CBCecLogMessage = NULL;
1204 CBCecKeyPress = NULL;
1205 CBCecCommand = NULL;
1206 CBCecConfigurationChanged = NULL;
1207 CBCecAlert = NULL;
c3ce6b47 1208 CBCecMenuStateChanged = NULL;
29d5198c 1209 CBCecSourceActivated = NULL;
e1804a4e
LOK
1210 }
1211#endif
c3039d2e 1212} ICECCallbacks;
fa4798bd 1213
caca2d81
LOK
1214typedef enum cec_client_version
1215{
1216 CEC_CLIENT_VERSION_PRE_1_5 = 0,
41e3372a 1217 CEC_CLIENT_VERSION_1_5_0 = 0x1500,
2e82cff0 1218 CEC_CLIENT_VERSION_1_5_1 = 0x1501,
dd18e809
LOK
1219 CEC_CLIENT_VERSION_1_5_2 = 0x1502,
1220 CEC_CLIENT_VERSION_1_5_3 = 0x1503,
e4a7396c 1221 CEC_CLIENT_VERSION_1_6_0 = 0x1600,
3ef17606 1222 CEC_CLIENT_VERSION_1_6_1 = 0x1601,
5f2f3609 1223 CEC_CLIENT_VERSION_1_6_2 = 0x1602,
0a61dc24 1224 CEC_CLIENT_VERSION_1_6_3 = 0x1603,
92eea1e7
LOK
1225 CEC_CLIENT_VERSION_1_7_0 = 0x1700,
1226 CEC_CLIENT_VERSION_1_7_1 = 0x1701
caca2d81
LOK
1227} cec_client_version;
1228
3efda01a
LOK
1229typedef enum cec_server_version
1230{
1231 CEC_SERVER_VERSION_PRE_1_5 = 0,
41e3372a 1232 CEC_SERVER_VERSION_1_5_0 = 0x1500,
2e82cff0 1233 CEC_SERVER_VERSION_1_5_1 = 0x1501,
dd18e809 1234 CEC_SERVER_VERSION_1_5_2 = 0x1502,
e69d8f19 1235 CEC_SERVER_VERSION_1_5_3 = 0x1503,
e4a7396c 1236 CEC_SERVER_VERSION_1_6_0 = 0x1600,
0b714871 1237 CEC_SERVER_VERSION_1_6_1 = 0x1601,
5f2f3609 1238 CEC_SERVER_VERSION_1_6_2 = 0x1602,
0a61dc24 1239 CEC_SERVER_VERSION_1_6_3 = 0x1603,
92eea1e7
LOK
1240 CEC_SERVER_VERSION_1_7_0 = 0x1700,
1241 CEC_SERVER_VERSION_1_7_1 = 0x1701
3efda01a
LOK
1242} cec_server_version;
1243
caca2d81
LOK
1244typedef struct libcec_configuration
1245{
3efda01a 1246 uint32_t clientVersion; /*!< the version of the client that is connecting */
d068b3d4
LOK
1247 char strDeviceName[13]; /*!< how to name the device on the CEC bus */
1248 cec_device_type_list deviceTypes; /*!< the CEC device types to emulate */
20be20ea 1249 uint8_t bAutodetectAddress; /*!< (read only) set to 1 by libCEC when the physical address was autodetected */
8670c970
LOK
1250 uint16_t iPhysicalAddress; /*!< the physical address of the CEC adapter. only used when bAutodetectAddress = 0 or when the adapter doesn't support autodetection */
1251 cec_logical_address baseDevice; /*!< the logical address of the device to which the adapter is connected. only used when iPhysicalAddress = 0 and bAutodetectAddress = 0 or when the adapter doesn't support autodetection */
1252 uint8_t iHDMIPort; /*!< the HDMI port to which the adapter is connected. only used when iPhysicalAddress = 0 and bAutodetectAddress = 0 or when the adapter doesn't support autodetection */
3efda01a 1253 uint64_t tvVendor; /*!< override the vendor ID of the TV. leave this untouched to autodetect */
ca27e6cf
LOK
1254 cec_logical_addresses wakeDevices; /*!< wake these CEC devices when initialising libCEC or when calling PowerOnDevices() without any parameter */
1255 cec_logical_addresses powerOffDevices; /*!< power off these devices when calling StandbyDevices() without any parameter */
224ea877 1256
c9549d35 1257 uint32_t serverVersion; /*!< the version number of the server. read-only */
3efda01a 1258
224ea877 1259 // player specific settings
d068b3d4
LOK
1260 uint8_t bGetSettingsFromROM; /*!< true to get the settings from the ROM (if set, and a v2 ROM is present), false to use these settings. */
1261 uint8_t bUseTVMenuLanguage; /*!< use the menu language of the TV in the player application */
ca27e6cf 1262 uint8_t bActivateSource; /*!< make libCEC the active source on the bus when starting the player application */
d068b3d4 1263 uint8_t bPowerOffScreensaver; /*!< put devices in standby mode when activating the screensaver */
fa4b80df 1264 uint8_t bPowerOffOnStandby; /*!< put this PC in standby mode when the TV is switched off. only used when bShutdownOnStandby = 0 */
41e3372a 1265 uint8_t bSendInactiveSource; /*!< send an 'inactive source' message when stopping the player. added in 1.5.1 */
caca2d81 1266
d068b3d4
LOK
1267 void * callbackParam; /*!< the object to pass along with a call of the callback methods. NULL to ignore */
1268 ICECCallbacks * callbacks; /*!< the callback methods to use. set this to NULL when not using callbacks */
caca2d81 1269
20be20ea
LOK
1270 cec_logical_addresses logicalAddresses; /*!< (read-only) the current logical addresses. added in 1.5.3 */
1271 uint16_t iFirmwareVersion; /*!< (read-only) the firmware version of the adapter. added in 1.6.0 */
b98fc43d 1272 uint8_t bPowerOffDevicesOnStandby; /*!< put devices in standby when the PC/player is put in standby. added in 1.6.0 */
fa4b80df 1273 uint8_t bShutdownOnStandby; /*!< shutdown this PC when the TV is switched off. only used when bPowerOffOnStandby = 0. added in 1.6.0 */
7f274e72 1274 char strDeviceLanguage[3]; /*!< the menu language used by the client. 3 character ISO 639-2 country code. see http://http://www.loc.gov/standards/iso639-2/ added in 1.6.2 */
20be20ea 1275 uint32_t iFirmwareBuildDate; /*!< (read-only) the build date of the firmware, in seconds since epoch. if not available, this value will be set to 0. added in 1.6.2 */
5f2f3609 1276 uint8_t bMonitorOnly; /*!< won't allocate a CCECClient when starting the connection when set (same as monitor mode). added in 1.6.3 */
dd18e809 1277
caca2d81 1278#ifdef __cplusplus
38f1fbcc
LOK
1279 // @todo re-add in v2.0 (breaks ABI)
1280 // libcec_configuration(void) { Clear(); }
1281 //~libcec_configuration(void) { Clear(); }
e1804a4e 1282
b9dd18f9
LOK
1283 bool operator==(const libcec_configuration &other) const
1284 {
1285 return ( clientVersion == other.clientVersion &&
1286 !strncmp(strDeviceName, other.strDeviceName, 13) &&
1287 deviceTypes == other.deviceTypes &&
1288 bAutodetectAddress == other.bAutodetectAddress &&
1289 iPhysicalAddress == other.iPhysicalAddress &&
1290 baseDevice == other.baseDevice &&
1291 iHDMIPort == other.iHDMIPort &&
1292 tvVendor == other.tvVendor &&
1293 wakeDevices == other.wakeDevices &&
1294 powerOffDevices == other.powerOffDevices &&
1295 serverVersion == other.serverVersion &&
1296 bGetSettingsFromROM == other.bGetSettingsFromROM &&
1297 bUseTVMenuLanguage == other.bUseTVMenuLanguage &&
1298 bActivateSource == other.bActivateSource &&
1299 bPowerOffScreensaver == other.bPowerOffScreensaver &&
1300 bPowerOffOnStandby == other.bPowerOffOnStandby &&
1301 bSendInactiveSource == other.bSendInactiveSource &&
1302 /* libcec 1.5.3+ */
5f2f3609 1303 (other.clientVersion < CEC_CLIENT_VERSION_1_5_3 || logicalAddresses == other.logicalAddresses) &&
b9dd18f9 1304 /* libcec 1.6.0+ */
5f2f3609
LOK
1305 (other.clientVersion < CEC_CLIENT_VERSION_1_6_0 || iFirmwareVersion == other.iFirmwareVersion) &&
1306 (other.clientVersion < CEC_CLIENT_VERSION_1_6_0 || bPowerOffDevicesOnStandby == other.bPowerOffDevicesOnStandby) &&
1307 (other.clientVersion < CEC_CLIENT_VERSION_1_6_0 || bShutdownOnStandby == other.bShutdownOnStandby) &&
b9dd18f9 1308 /* libcec 1.6.2+ */
5f2f3609
LOK
1309 (other.clientVersion < CEC_CLIENT_VERSION_1_6_2 || !strncmp(strDeviceLanguage, other.strDeviceLanguage, 3)) &&
1310 (other.clientVersion < CEC_CLIENT_VERSION_1_6_2 || iFirmwareBuildDate == other.iFirmwareBuildDate) &&
1311 /* libcec 1.6.3+ */
1312 (other.clientVersion < CEC_CLIENT_VERSION_1_6_3 || bMonitorOnly == other.bMonitorOnly));
b9dd18f9
LOK
1313 }
1314
1315 bool operator!=(const libcec_configuration &other) const
1316 {
1317 return !(*this == other);
1318 }
1319
f1f91c81
LOK
1320 /*!
1321 * @brief Reset this configution struct to the default values.
1322 */
caca2d81
LOK
1323 void Clear(void)
1324 {
d2d1660c 1325 iPhysicalAddress = CEC_PHYSICAL_ADDRESS_TV;
7f274e72
LOK
1326 baseDevice = (cec_logical_address)CEC_DEFAULT_BASE_DEVICE;
1327 iHDMIPort = CEC_DEFAULT_HDMI_PORT;
1328 tvVendor = (uint64_t)CEC_VENDOR_UNKNOWN;
1329 clientVersion = (uint32_t)CEC_CLIENT_VERSION_PRE_1_5;
1330 serverVersion = (uint32_t)CEC_SERVER_VERSION_PRE_1_5;
20be20ea 1331 bAutodetectAddress = 0;
64ec6e79 1332 bGetSettingsFromROM = CEC_DEFAULT_SETTING_GET_SETTINGS_FROM_ROM;
7f274e72
LOK
1333 bUseTVMenuLanguage = CEC_DEFAULT_SETTING_USE_TV_MENU_LANGUAGE;
1334 bActivateSource = CEC_DEFAULT_SETTING_ACTIVATE_SOURCE;
1335 bPowerOffScreensaver = CEC_DEFAULT_SETTING_POWER_OFF_SCREENSAVER;
1336 bPowerOffOnStandby = CEC_DEFAULT_SETTING_POWER_OFF_ON_STANDBY;
1337 bShutdownOnStandby = CEC_DEFAULT_SETTING_SHUTDOWN_ON_STANDBY;
1338 bSendInactiveSource = CEC_DEFAULT_SETTING_SEND_INACTIVE_SOURCE;
1339 iFirmwareVersion = CEC_FW_VERSION_UNKNOWN;
1340 bPowerOffDevicesOnStandby = CEC_DEFAULT_SETTING_POWER_OFF_DEVICES_STANDBY;
1341 memcpy(strDeviceLanguage, CEC_DEFAULT_DEVICE_LANGUAGE, 3);
d2d1660c 1342 iFirmwareBuildDate = CEC_FW_BUILD_UNKNOWN;
5f2f3609 1343 bMonitorOnly = 0;
7f274e72 1344
caca2d81
LOK
1345 memset(strDeviceName, 0, 13);
1346 deviceTypes.clear();
7f274e72 1347 logicalAddresses.Clear();
d068b3d4 1348 wakeDevices.Clear();
ca27e6cf 1349 powerOffDevices.Clear();
224ea877 1350
ca27e6cf
LOK
1351 #if CEC_DEFAULT_SETTING_POWER_OFF_SHUTDOWN == 1
1352 powerOffDevices.Set(CECDEVICE_BROADCAST);
1353 #endif
41e3372a
LOK
1354 #if CEC_DEFAULT_SETTING_ACTIVATE_SOURCE == 1
1355 wakeDevices.Set(CECDEVICE_TV);
1356 #endif
224ea877 1357
7f274e72
LOK
1358 callbackParam = NULL;
1359 callbacks = NULL;
caca2d81
LOK
1360 }
1361#endif
1362} libcec_configuration;
1363
acec5f48
LOK
1364#ifdef __cplusplus
1365};
1366};
1367#endif
1368
1369#endif /* CECTYPES_H_ */