cec: async writes for CUSBCECAdapterCommunication. less locks and polls, more speed
[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,
9bb14797
BL
605 MSGCODE_SET_POWERSTATE,
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
60a245d1
LOK
762 cec_command &operator =(const struct cec_command &command)
763 {
764 initiator = command.initiator;
765 destination = command.destination;
766 ack = command.ack;
767 eom = command.eom;
768 opcode = command.opcode;
769 opcode_set = command.opcode_set;
770 transmit_timeout = command.transmit_timeout;
771 parameters = command.parameters;
772
773 return *this;
774 }
775
f1f91c81
LOK
776 /*!
777 * @brief Formats a cec_command.
778 * @param command The command to format.
779 * @param initiator The logical address of the initiator.
780 * @param destination The logical addres of the destination.
781 * @param opcode The opcode of the command.
782 * @param timeout The transmission timeout.
783 */
ae693aaa 784 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 785 {
ab1469a0 786 command.Clear();
caaf64d7
LOK
787 command.initiator = initiator;
788 command.destination = destination;
789 command.transmit_timeout = timeout;
57f45e6c
LOK
790 if (opcode != CEC_OPCODE_NONE)
791 {
792 command.opcode = opcode;
793 command.opcode_set = 1;
794 }
acec5f48
LOK
795 }
796
f1f91c81
LOK
797 /*!
798 * @brief Push a byte to the back of this command.
799 * @param data The byte to push.
800 */
ab1469a0 801 void PushBack(uint8_t data)
acec5f48 802 {
b2da2768
LOK
803 if (initiator == CECDEVICE_UNKNOWN && destination == CECDEVICE_UNKNOWN)
804 {
805 initiator = (cec_logical_address) (data >> 4);
806 destination = (cec_logical_address) (data & 0xF);
807 }
808 else if (!opcode_set)
acec5f48 809 {
02ee2c68 810 opcode_set = 1;
acec5f48
LOK
811 opcode = (cec_opcode) data;
812 }
813 else
ab1469a0 814 parameters.PushBack(data);
acec5f48
LOK
815 }
816
f1f91c81
LOK
817 /*!
818 * @brief Clear this command, resetting everything to the default values.
819 */
ab1469a0 820 void Clear(void)
acec5f48 821 {
1f0e9e0f
LOK
822 initiator = CECDEVICE_UNKNOWN;
823 destination = CECDEVICE_UNKNOWN;
824 ack = 0;
825 eom = 0;
826 opcode_set = 0;
827 opcode = CEC_OPCODE_FEATURE_ABORT;
ae693aaa 828 transmit_timeout = CEC_DEFAULT_TRANSMIT_TIMEOUT;
ab1469a0 829 parameters.Clear();
acec5f48
LOK
830 };
831#endif
832} cec_command;
833
5ae8fa48 834typedef struct cec_device_type_list
acec5f48 835{
8d901fdb 836 cec_device_type types[5]; /**< the list of device types */
0500da96 837
5ae8fa48 838#ifdef __cplusplus
c23380e7 839 /*!
f1f91c81
LOK
840 * @deprecated Use Clear() instead.
841 * @brief Clear this list.
c23380e7
LOK
842 */
843 void clear(void) { Clear(); }
844 /*!
f1f91c81
LOK
845 * @deprecated Use Add() instead.
846 * @brief Add a type to this list.
847 * @param type The type to add.
c23380e7
LOK
848 */
849 void add(const cec_device_type type) { Add(type); }
850
f1f91c81
LOK
851 /*!
852 * @brief Clear this list.
853 */
c23380e7 854 void Clear(void)
5ae8fa48
LOK
855 {
856 for (unsigned int iPtr = 0; iPtr < 5; iPtr++)
857 types[iPtr] = CEC_DEVICE_TYPE_RESERVED;
858 }
eafd9bed 859
f1f91c81
LOK
860 /*!
861 * @brief Add a type to this list.
862 * @param type The type to add.
863 */
c23380e7 864 void Add(const cec_device_type type)
5ae8fa48
LOK
865 {
866 for (unsigned int iPtr = 0; iPtr < 5; iPtr++)
867 {
868 if (types[iPtr] == CEC_DEVICE_TYPE_RESERVED)
869 {
870 types[iPtr] = type;
871 break;
872 }
873 }
874 }
875
f1f91c81
LOK
876 /*!
877 * @brief Check whether a type is set in this list.
878 * @param type The type to check.
879 * @return True when set, false otherwise.
880 */
5ae8fa48
LOK
881 bool IsSet(cec_device_type type)
882 {
883 bool bReturn(false);
884 for (unsigned int iPtr = 0; !bReturn && iPtr < 5; iPtr++)
885 {
886 if (types[iPtr] == type)
887 bReturn = true;
888 }
889 return bReturn;
890 }
891
f1f91c81
LOK
892 /*!
893 * @return True when this list is empty, false otherwise.
894 */
7c5c5bf4 895 bool IsEmpty() const
5ae8fa48
LOK
896 {
897 bool bReturn(true);
898 for (unsigned int iPtr = 0; bReturn && iPtr < 5; iPtr++)
899 {
900 if (types[iPtr] != CEC_DEVICE_TYPE_RESERVED)
901 bReturn = false;
902 }
903 return bReturn;
904 }
905
f1f91c81
LOK
906 /*!
907 * @brief Get the type at the requested position.
908 * @param pos The position.
909 * @return The type, or CEC_DEVICE_TYPE_RESERVED when out of bounds.
910 */
5ae8fa48 911 cec_device_type operator[](uint8_t pos) const { return pos < 5 ? types[pos] : CEC_DEVICE_TYPE_RESERVED; }
f1f91c81 912
30b4aac0
LOK
913 bool operator==(const cec_device_type_list &other) const
914 {
915 bool bEqual(true);
916 for (uint8_t iPtr = 0; iPtr < 5; iPtr++)
917 bEqual &= (types[iPtr] == other[iPtr]);
918 return bEqual;
919 }
920
921 bool operator!=(const cec_device_type_list &other) const
922 {
923 return !(*this == other);
924 }
5ae8fa48
LOK
925#endif
926} cec_device_type_list;
927
928typedef struct cec_logical_addresses
929{
8d901fdb
LOK
930 cec_logical_address primary; /**< the primary logical address to use */
931 int addresses[16]; /**< the list of addresses */
5ae8fa48
LOK
932
933#ifdef __cplusplus
f1f91c81
LOK
934 /*!
935 * @brief Clear this list.
936 */
5ae8fa48
LOK
937 void Clear(void)
938 {
939 primary = CECDEVICE_UNKNOWN;
940 for (unsigned int iPtr = 0; iPtr < 16; iPtr++)
941 addresses[iPtr] = 0;
942 }
943
f1f91c81
LOK
944 /*!
945 * @return True when empty, false otherwise.
946 */
5ae8fa48
LOK
947 bool IsEmpty(void) const
948 {
949 return primary == CECDEVICE_UNKNOWN;
950 }
951
f1f91c81
LOK
952 /*!
953 * @brief Calculate the ack-mask for this list, the mask to use when determining whether to send an ack message or not.
954 * @return The ack-mask.
955 */
5ae8fa48
LOK
956 uint16_t AckMask(void) const
957 {
958 uint16_t mask = 0;
959 for (unsigned int iPtr = 0; iPtr < 16; iPtr++)
960 if (addresses[iPtr] == 1)
961 mask |= 0x1 << iPtr;
962 return mask;
963 }
964
f1f91c81
LOK
965 /*!
966 * @brief Mark a logical address as 'set'
967 * @param address The logical address to add to this list.
968 */
5ae8fa48
LOK
969 void Set(cec_logical_address address)
970 {
971 if (primary == CECDEVICE_UNKNOWN)
972 primary = address;
973
974 addresses[(int) address] = 1;
975 }
976
f1f91c81
LOK
977 /*!
978 * @brief Mark a logical address as 'unset'
979 * @param address The logical address to remove from this list.
980 */
5ae8fa48
LOK
981 void Unset(cec_logical_address address)
982 {
983 if (primary == address)
984 primary = CECDEVICE_UNKNOWN;
985
986 addresses[(int) address] = 0;
987 }
988
f1f91c81
LOK
989 /*!
990 * @brief Check whether an address is set in this list.
991 * @param address The address to check.
992 * @return True when set, false otherwise.
993 */
5ae8fa48 994 bool IsSet(cec_logical_address address) const { return addresses[(int) address] == 1; }
f1f91c81
LOK
995
996 /*!
997 * @brief Check whether an address is set in this list.
998 * @param pos The address to check.
999 * @return True when set, false otherwise.
1000 */
5ae8fa48 1001 bool operator[](uint8_t pos) const { return pos < 16 ? IsSet((cec_logical_address) pos) : false; }
30b4aac0
LOK
1002
1003 bool operator==(const cec_logical_addresses &other) const
1004 {
1005 bool bEqual(true);
1006 for (uint8_t iPtr = 0; iPtr < 16; iPtr++)
1007 bEqual &= ((addresses[(int)iPtr] == 1) == other[iPtr]);
1008 return bEqual;
1009 }
1010
1011 bool operator!=(const cec_logical_addresses &other) const
1012 {
1013 return !(*this == other);
1014 }
5ae8fa48
LOK
1015#endif
1016} cec_logical_addresses;
acec5f48 1017
5ee37222
MK
1018typedef enum libcec_alert
1019{
b1c47f9d
LOK
1020 CEC_ALERT_SERVICE_DEVICE,
1021 CEC_ALERT_CONNECTION_LOST
5ee37222
MK
1022} libcec_alert;
1023
1024typedef enum libcec_parameter_type
1025{
1026 CEC_PARAMETER_TYPE_STRING
1027} libcec_parameter_type;
1028
1029struct libcec_parameter
1030{
8d901fdb
LOK
1031 libcec_parameter_type paramType; /**< the type of this parameter */
1032 void* paramData; /**< the value of this parameter */
5ee37222
MK
1033};
1034
32403cc3
LOK
1035struct libcec_configuration;
1036
1037typedef int (CEC_CDECL* CBCecLogMessageType)(void *param, const cec_log_message &);
e9654a0e
LOK
1038typedef int (CEC_CDECL* CBCecKeyPressType)(void *param, const cec_keypress &);
1039typedef int (CEC_CDECL* CBCecCommandType)(void *param, const cec_command &);
32403cc3 1040typedef int (CEC_CDECL* CBCecConfigurationChangedType)(void *param, const libcec_configuration &);
5ee37222 1041typedef int (CEC_CDECL* CBCecAlertType)(void *param, const libcec_alert, const libcec_parameter &);
c3a20edb 1042typedef int (CEC_CDECL* CBCecMenuStateChangedType)(void *param, const cec_menu_state);
c3039d2e
LOK
1043
1044typedef struct ICECCallbacks
fa4798bd
LOK
1045{
1046 /*!
1047 * @brief Transfer a log message from libCEC to the client.
1048 * @param message The message to transfer.
1049 * @return 1 when ok, 0 otherwise.
1050 */
c3039d2e 1051 CBCecLogMessageType CBCecLogMessage;
fa4798bd
LOK
1052
1053 /*!
1054 * @brief Transfer a keypress from libCEC to the client.
1055 * @param key The keypress to transfer.
1056 * @return 1 when ok, 0 otherwise.
1057 */
c3039d2e 1058 CBCecKeyPressType CBCecKeyPress;
fa4798bd
LOK
1059
1060 /*!
1061 * @brief Transfer a CEC command from libCEC to the client.
1062 * @param command The command to transfer.
1063 * @return 1 when ok, 0 otherwise.
1064 */
c3039d2e 1065 CBCecCommandType CBCecCommand;
32403cc3
LOK
1066
1067 /*!
1068 * @brief Transfer a changed configuration from libCEC to the client
1069 * @param configuration The configuration to transfer
1070 * @return 1 when ok, 0 otherwise
1071 */
1072 CBCecConfigurationChangedType CBCecConfigurationChanged;
5ee37222
MK
1073
1074 /*!
8d901fdb
LOK
1075 * @brief Transfer a libcec alert message from libCEC to the client
1076 * @param alert The alert type transfer.
1077 * @param data Misc. additional information.
5ee37222
MK
1078 * @return 1 when ok, 0 otherwise
1079 */
1080 CBCecAlertType CBCecAlert;
e1804a4e
LOK
1081
1082 /*!
c3ce6b47
LOK
1083 * @brief Transfer a menu state change to the client.
1084 * Transfer a menu state change to the client. If the command returns 1, then the change will be processed by
e1804a4e 1085 * the busdevice. If 0, then the state of the busdevice won't be changed, and will always be kept 'activated',
6ad51ff5 1086 * @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
1087 * so keypresses are always routed.
1088 * @param newVal The new value.
6ad51ff5 1089 * @return 1 when libCEC should use this new value, 0 otherwise.
e1804a4e 1090 */
c3ce6b47 1091 CBCecMenuStateChangedType CBCecMenuStateChanged;
e1804a4e
LOK
1092
1093#ifdef __cplusplus
1094 ICECCallbacks(void) { Clear(); }
1095 ~ICECCallbacks(void) { Clear(); };
1096
1097 void Clear(void)
1098 {
1099 CBCecLogMessage = NULL;
1100 CBCecKeyPress = NULL;
1101 CBCecCommand = NULL;
1102 CBCecConfigurationChanged = NULL;
1103 CBCecAlert = NULL;
c3ce6b47 1104 CBCecMenuStateChanged = NULL;
e1804a4e
LOK
1105 }
1106#endif
c3039d2e 1107} ICECCallbacks;
fa4798bd 1108
caca2d81
LOK
1109typedef enum cec_client_version
1110{
1111 CEC_CLIENT_VERSION_PRE_1_5 = 0,
41e3372a 1112 CEC_CLIENT_VERSION_1_5_0 = 0x1500,
2e82cff0 1113 CEC_CLIENT_VERSION_1_5_1 = 0x1501,
dd18e809
LOK
1114 CEC_CLIENT_VERSION_1_5_2 = 0x1502,
1115 CEC_CLIENT_VERSION_1_5_3 = 0x1503,
e4a7396c 1116 CEC_CLIENT_VERSION_1_6_0 = 0x1600,
3ef17606
MK
1117 CEC_CLIENT_VERSION_1_6_1 = 0x1601,
1118 CEC_CLIENT_VERSION_1_6_2 = 0x1602
caca2d81
LOK
1119} cec_client_version;
1120
3efda01a
LOK
1121typedef enum cec_server_version
1122{
1123 CEC_SERVER_VERSION_PRE_1_5 = 0,
41e3372a 1124 CEC_SERVER_VERSION_1_5_0 = 0x1500,
2e82cff0 1125 CEC_SERVER_VERSION_1_5_1 = 0x1501,
dd18e809 1126 CEC_SERVER_VERSION_1_5_2 = 0x1502,
e69d8f19 1127 CEC_SERVER_VERSION_1_5_3 = 0x1503,
e4a7396c 1128 CEC_SERVER_VERSION_1_6_0 = 0x1600,
0b714871
LOK
1129 CEC_SERVER_VERSION_1_6_1 = 0x1601,
1130 CEC_SERVER_VERSION_1_6_2 = 0x1602
3efda01a
LOK
1131} cec_server_version;
1132
caca2d81
LOK
1133typedef struct libcec_configuration
1134{
3efda01a 1135 uint32_t clientVersion; /*!< the version of the client that is connecting */
d068b3d4
LOK
1136 char strDeviceName[13]; /*!< how to name the device on the CEC bus */
1137 cec_device_type_list deviceTypes; /*!< the CEC device types to emulate */
8670c970
LOK
1138 uint8_t bAutodetectAddress; /*!< try to autodetect the physical address when 1 */
1139 uint16_t iPhysicalAddress; /*!< the physical address of the CEC adapter. only used when bAutodetectAddress = 0 or when the adapter doesn't support autodetection */
1140 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 */
1141 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 1142 uint64_t tvVendor; /*!< override the vendor ID of the TV. leave this untouched to autodetect */
ca27e6cf
LOK
1143 cec_logical_addresses wakeDevices; /*!< wake these CEC devices when initialising libCEC or when calling PowerOnDevices() without any parameter */
1144 cec_logical_addresses powerOffDevices; /*!< power off these devices when calling StandbyDevices() without any parameter */
224ea877 1145
c9549d35 1146 uint32_t serverVersion; /*!< the version number of the server. read-only */
3efda01a 1147
224ea877 1148 // player specific settings
d068b3d4
LOK
1149 uint8_t bGetSettingsFromROM; /*!< true to get the settings from the ROM (if set, and a v2 ROM is present), false to use these settings. */
1150 uint8_t bUseTVMenuLanguage; /*!< use the menu language of the TV in the player application */
ca27e6cf 1151 uint8_t bActivateSource; /*!< make libCEC the active source on the bus when starting the player application */
d068b3d4 1152 uint8_t bPowerOffScreensaver; /*!< put devices in standby mode when activating the screensaver */
fa4b80df 1153 uint8_t bPowerOffOnStandby; /*!< put this PC in standby mode when the TV is switched off. only used when bShutdownOnStandby = 0 */
41e3372a 1154 uint8_t bSendInactiveSource; /*!< send an 'inactive source' message when stopping the player. added in 1.5.1 */
caca2d81 1155
d068b3d4
LOK
1156 void * callbackParam; /*!< the object to pass along with a call of the callback methods. NULL to ignore */
1157 ICECCallbacks * callbacks; /*!< the callback methods to use. set this to NULL when not using callbacks */
caca2d81 1158
dd18e809 1159 cec_logical_addresses logicalAddresses; /*!< the current logical addresses. read-only. added in 1.5.3 */
b98fc43d
LOK
1160 uint16_t iFirmwareVersion; /*!< the firmware version of the adapter. added in 1.6.0 */
1161 uint8_t bPowerOffDevicesOnStandby; /*!< put devices in standby when the PC/player is put in standby. added in 1.6.0 */
fa4b80df 1162 uint8_t bShutdownOnStandby; /*!< shutdown this PC when the TV is switched off. only used when bPowerOffOnStandby = 0. added in 1.6.0 */
3ef17606 1163 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 1164
caca2d81 1165#ifdef __cplusplus
e1804a4e
LOK
1166 libcec_configuration(void) { Clear(); }
1167 ~libcec_configuration(void) { Clear(); }
1168
f1f91c81
LOK
1169 /*!
1170 * @brief Reset this configution struct to the default values.
1171 */
caca2d81
LOK
1172 void Clear(void)
1173 {
1174 memset(strDeviceName, 0, 13);
1175 deviceTypes.clear();
8cd01ab8 1176 iPhysicalAddress = 0;
caca2d81
LOK
1177 baseDevice = (cec_logical_address)CEC_DEFAULT_BASE_DEVICE;
1178 iHDMIPort = CEC_DEFAULT_HDMI_PORT;
3efda01a
LOK
1179 tvVendor = (uint64_t)CEC_VENDOR_UNKNOWN;
1180 clientVersion = (uint32_t)CEC_CLIENT_VERSION_PRE_1_5;
1181 serverVersion = (uint32_t)CEC_SERVER_VERSION_PRE_1_5;
d068b3d4 1182 wakeDevices.Clear();
ca27e6cf 1183 powerOffDevices.Clear();
224ea877 1184
8670c970 1185 bAutodetectAddress = 1;
224ea877
LOK
1186 bGetSettingsFromROM = 0;
1187 bUseTVMenuLanguage = CEC_DEFAULT_SETTING_USE_TV_MENU_LANGUAGE;
ca27e6cf
LOK
1188 bActivateSource = CEC_DEFAULT_SETTING_ACTIVATE_SOURCE;
1189 #if CEC_DEFAULT_SETTING_POWER_OFF_SHUTDOWN == 1
1190 powerOffDevices.Set(CECDEVICE_BROADCAST);
1191 #endif
41e3372a
LOK
1192 #if CEC_DEFAULT_SETTING_ACTIVATE_SOURCE == 1
1193 wakeDevices.Set(CECDEVICE_TV);
1194 #endif
224ea877
LOK
1195 bPowerOffScreensaver = CEC_DEFAULT_SETTING_POWER_OFF_SCREENSAVER;
1196 bPowerOffOnStandby = CEC_DEFAULT_SETTING_POWER_OFF_ON_STANDBY;
fa4b80df 1197 bShutdownOnStandby = CEC_DEFAULT_SETTING_SHUTDOWN_ON_STANDBY;
41e3372a 1198 bSendInactiveSource = CEC_DEFAULT_SETTING_SEND_INACTIVE_SOURCE;
dd18e809 1199 logicalAddresses.Clear();
7c5c5bf4 1200 iFirmwareVersion = CEC_FW_VERSION_UNKNOWN;
b98fc43d 1201 bPowerOffDevicesOnStandby = CEC_DEFAULT_SETTING_POWER_OFF_DEVICES_STANDBY;
3ef17606 1202 memcpy(strDeviceLanguage, CEC_DEFAULT_DEVICE_LANGUAGE, 3);
224ea877 1203
caca2d81
LOK
1204 callbackParam = NULL;
1205 callbacks = NULL;
1206 }
1207#endif
1208} libcec_configuration;
1209
1de6617c
LOK
1210#ifdef UNUSED
1211#elif defined(__GNUC__)
1212#define UNUSED(x) UNUSED_ ## x __attribute__((unused))
1213#elif defined(__LCLINT__)
1214#define UNUSED(x) /*@unused@*/ x
1215#else
1216#define UNUSED(x) x
1217#endif
1218
acec5f48
LOK
1219#ifdef __cplusplus
1220};
1221};
1222#endif
1223
1224#endif /* CECTYPES_H_ */