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