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