Commit | Line | Data |
---|---|---|
a75e3a5a LOK |
1 | /* |
2 | * This file is part of the libCEC(R) library. | |
3 | * | |
4 | * libCEC(R) is Copyright (C) 2011-2012 Pulse-Eight Limited. All rights reserved. | |
5 | * libCEC(R) is an original work, containing original code. | |
6 | * | |
7 | * libCEC(R) is a trademark of Pulse-Eight Limited. | |
8 | * | |
9 | * This program is dual-licensed; you can redistribute it and/or modify | |
10 | * it under the terms of the GNU General Public License as published by | |
11 | * the Free Software Foundation; either version 2 of the License, or | |
12 | * (at your option) any later version. | |
13 | * | |
14 | * This program is distributed in the hope that it will be useful, | |
15 | * but WITHOUT ANY WARRANTY; without even the implied warranty of | |
16 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |
17 | * GNU General Public License for more details. | |
18 | * | |
19 | * You should have received a copy of the GNU General Public License | |
20 | * along with this program; if not, write to the Free Software | |
21 | * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. | |
22 | * | |
23 | * | |
24 | * Alternatively, you can license this library under a commercial license, | |
25 | * please contact Pulse-Eight Licensing for more information. | |
26 | * | |
27 | * For more information contact: | |
28 | * Pulse-Eight Licensing <license@pulse-eight.com> | |
29 | * http://www.pulse-eight.com/ | |
30 | * http://www.pulse-eight.net/ | |
31 | */ | |
32 | ||
33 | #include "USBCECAdapterCommands.h" | |
34 | #include "../LibCEC.h" | |
35 | #include "../CECProcessor.h" | |
36 | ||
37 | using namespace CEC; | |
38 | using namespace PLATFORM; | |
39 | ||
7c5c5bf4 LOK |
40 | CUSBCECAdapterCommands::CUSBCECAdapterCommands(CUSBCECAdapterCommunication *comm) : |
41 | m_comm(comm), | |
42 | m_bSettingsRetrieved(false), | |
43 | m_bSettingAutoEnabled(false), | |
44 | m_settingCecVersion(CEC_VERSION_UNKNOWN), | |
45 | m_iSettingLAMask(0), | |
46 | m_bNeedsWrite(false) | |
47 | { | |
48 | m_persistedConfiguration.Clear(); | |
49 | } | |
50 | ||
a75e3a5a LOK |
51 | cec_datapacket CUSBCECAdapterCommands::RequestSetting(cec_adapter_messagecode msgCode) |
52 | { | |
53 | cec_datapacket retVal; | |
54 | retVal.Clear(); | |
55 | ||
56 | CCECAdapterMessage params; | |
57 | CCECAdapterMessage *message = m_comm->SendCommand(msgCode, params); | |
58 | if (message->state == ADAPTER_MESSAGE_STATE_SENT_ACKED) | |
59 | { | |
60 | retVal = message->response; | |
61 | retVal.Shift(2); // shift out start and msgcode | |
62 | retVal.size -= 1; // remove end | |
63 | } | |
64 | delete message; | |
65 | return retVal; | |
66 | } | |
67 | ||
68 | uint16_t CUSBCECAdapterCommands::RequestFirmwareVersion(void) | |
69 | { | |
7c5c5bf4 | 70 | m_persistedConfiguration.iFirmwareVersion = CEC_FW_VERSION_UNKNOWN; |
a75e3a5a LOK |
71 | unsigned int iFwVersionTry(0); |
72 | ||
7c5c5bf4 | 73 | while (m_persistedConfiguration.iFirmwareVersion == CEC_FW_VERSION_UNKNOWN && iFwVersionTry++ < 3) |
a75e3a5a LOK |
74 | { |
75 | CLibCEC::AddLog(CEC_LOG_DEBUG, "requesting the firmware version"); | |
76 | cec_datapacket response = RequestSetting(MSGCODE_FIRMWARE_VERSION); | |
77 | if (response.size == 2) | |
7c5c5bf4 | 78 | m_persistedConfiguration.iFirmwareVersion = (response[0] << 8 | response[1]); |
a75e3a5a LOK |
79 | else |
80 | { | |
81 | CLibCEC::AddLog(CEC_LOG_WARNING, "the adapter did not respond with a correct firmware version (try %d)", iFwVersionTry); | |
82 | CEvent::Sleep(500); | |
83 | } | |
84 | } | |
85 | ||
7c5c5bf4 | 86 | if (m_persistedConfiguration.iFirmwareVersion == CEC_FW_VERSION_UNKNOWN) |
a75e3a5a LOK |
87 | { |
88 | CLibCEC::AddLog(CEC_LOG_DEBUG, "defaulting to firmware version 1"); | |
7c5c5bf4 | 89 | m_persistedConfiguration.iFirmwareVersion = 1; |
a75e3a5a LOK |
90 | } |
91 | ||
7c5c5bf4 | 92 | return m_persistedConfiguration.iFirmwareVersion; |
a75e3a5a LOK |
93 | } |
94 | ||
7c5c5bf4 | 95 | bool CUSBCECAdapterCommands::RequestSettingAutoEnabled(void) |
a75e3a5a LOK |
96 | { |
97 | CLibCEC::AddLog(CEC_LOG_DEBUG, "requesting autonomous mode setting"); | |
98 | ||
99 | cec_datapacket response = RequestSetting(MSGCODE_GET_AUTO_ENABLED); | |
100 | if (response.size == 1) | |
101 | { | |
7c5c5bf4 | 102 | m_bSettingAutoEnabled = response[0] == 1; |
a75e3a5a LOK |
103 | return true; |
104 | } | |
105 | return false; | |
106 | } | |
107 | ||
7c5c5bf4 | 108 | bool CUSBCECAdapterCommands::RequestSettingCECVersion(void) |
a75e3a5a LOK |
109 | { |
110 | CLibCEC::AddLog(CEC_LOG_DEBUG, "requesting CEC version setting"); | |
111 | ||
112 | cec_datapacket response = RequestSetting(MSGCODE_GET_HDMI_VERSION); | |
113 | if (response.size == 1) | |
114 | { | |
7c5c5bf4 | 115 | m_settingCecVersion = (cec_version)response[0]; |
a75e3a5a LOK |
116 | return true; |
117 | } | |
118 | return false; | |
119 | } | |
120 | ||
7c5c5bf4 | 121 | bool CUSBCECAdapterCommands::RequestSettingDefaultLogicalAddress(void) |
a75e3a5a LOK |
122 | { |
123 | CLibCEC::AddLog(CEC_LOG_DEBUG, "requesting default logical address setting"); | |
124 | ||
125 | cec_datapacket response = RequestSetting(MSGCODE_GET_DEFAULT_LOGICAL_ADDRESS); | |
126 | if (response.size == 1) | |
127 | { | |
7c5c5bf4 | 128 | m_persistedConfiguration.logicalAddresses.primary = (cec_logical_address)response[0]; |
a75e3a5a LOK |
129 | return true; |
130 | } | |
131 | return false; | |
132 | } | |
133 | ||
7c5c5bf4 | 134 | bool CUSBCECAdapterCommands::RequestSettingDeviceType(void) |
a75e3a5a LOK |
135 | { |
136 | CLibCEC::AddLog(CEC_LOG_DEBUG, "requesting device type setting"); | |
7c5c5bf4 | 137 | m_persistedConfiguration.deviceTypes.Clear(); |
a75e3a5a LOK |
138 | |
139 | cec_datapacket response = RequestSetting(MSGCODE_GET_DEVICE_TYPE); | |
140 | if (response.size == 1) | |
141 | { | |
7c5c5bf4 LOK |
142 | m_persistedConfiguration.deviceTypes.Add((cec_device_type)response[0]); |
143 | CLibCEC::AddLog(CEC_LOG_DEBUG, "using persisted device type setting %s", CLibCEC::GetInstance()->ToString((cec_device_type)response[0])); | |
a75e3a5a LOK |
144 | return true; |
145 | } | |
7c5c5bf4 | 146 | CLibCEC::AddLog(CEC_LOG_DEBUG, "no persisted device type setting"); |
a75e3a5a LOK |
147 | return false; |
148 | } | |
149 | ||
7c5c5bf4 | 150 | bool CUSBCECAdapterCommands::RequestSettingLogicalAddressMask(void) |
a75e3a5a LOK |
151 | { |
152 | CLibCEC::AddLog(CEC_LOG_DEBUG, "requesting logical address mask setting"); | |
153 | ||
154 | cec_datapacket response = RequestSetting(MSGCODE_GET_LOGICAL_ADDRESS_MASK); | |
155 | if (response.size == 2) | |
156 | { | |
7c5c5bf4 | 157 | m_iSettingLAMask = ((uint16_t)response[0] << 8) | ((uint16_t)response[1]); |
a75e3a5a LOK |
158 | return true; |
159 | } | |
160 | return false; | |
161 | } | |
162 | ||
7c5c5bf4 | 163 | bool CUSBCECAdapterCommands::RequestSettingOSDName(void) |
a75e3a5a LOK |
164 | { |
165 | CLibCEC::AddLog(CEC_LOG_DEBUG, "requesting OSD name setting"); | |
166 | ||
7c5c5bf4 | 167 | memset(m_persistedConfiguration.strDeviceName, 0, 13); |
a75e3a5a LOK |
168 | cec_datapacket response = RequestSetting(MSGCODE_GET_OSD_NAME); |
169 | if (response.size == 0) | |
7c5c5bf4 LOK |
170 | { |
171 | CLibCEC::AddLog(CEC_LOG_DEBUG, "no persisted device name setting"); | |
a75e3a5a | 172 | return false; |
7c5c5bf4 | 173 | } |
a75e3a5a LOK |
174 | |
175 | char buf[14]; | |
176 | for (uint8_t iPtr = 0; iPtr < response.size && iPtr < 13; iPtr++) | |
177 | buf[iPtr] = (char)response[iPtr]; | |
178 | buf[response.size] = 0; | |
179 | ||
7c5c5bf4 LOK |
180 | snprintf(m_persistedConfiguration.strDeviceName, 13, "%s", buf); |
181 | CLibCEC::AddLog(CEC_LOG_DEBUG, "using persisted device name setting %s", buf); | |
a75e3a5a LOK |
182 | return true; |
183 | } | |
184 | ||
7c5c5bf4 | 185 | bool CUSBCECAdapterCommands::RequestSettingPhysicalAddress(void) |
a75e3a5a LOK |
186 | { |
187 | CLibCEC::AddLog(CEC_LOG_DEBUG, "requesting physical address setting"); | |
188 | ||
189 | cec_datapacket response = RequestSetting(MSGCODE_GET_PHYSICAL_ADDRESS); | |
190 | if (response.size == 2) | |
191 | { | |
7c5c5bf4 LOK |
192 | m_persistedConfiguration.iPhysicalAddress = ((uint16_t)response[0] << 8) | ((uint16_t)response[1]); |
193 | CLibCEC::AddLog(CEC_LOG_DEBUG, "using persisted physical address setting %4x", m_persistedConfiguration.iPhysicalAddress); | |
a75e3a5a LOK |
194 | return true; |
195 | } | |
7c5c5bf4 | 196 | CLibCEC::AddLog(CEC_LOG_DEBUG, "no persisted physical address setting"); |
a75e3a5a LOK |
197 | return false; |
198 | } | |
199 | ||
200 | bool CUSBCECAdapterCommands::SetSettingAutoEnabled(bool enabled) | |
201 | { | |
7c5c5bf4 LOK |
202 | bool bReturn(true); |
203 | ||
204 | /* check whether this value was changed */ | |
205 | if (m_bSettingAutoEnabled == enabled) | |
206 | { | |
207 | CLibCEC::AddLog(CEC_LOG_DEBUG, "autonomous mode setting unchanged (%s)", enabled ? "on" : "off"); | |
208 | return bReturn; | |
209 | } | |
210 | ||
211 | m_bNeedsWrite = true; | |
a75e3a5a LOK |
212 | CLibCEC::AddLog(CEC_LOG_DEBUG, "turning autonomous mode %s", enabled ? "on" : "off"); |
213 | ||
214 | CCECAdapterMessage params; | |
215 | params.PushEscaped(enabled ? 1 : 0); | |
216 | CCECAdapterMessage *message = m_comm->SendCommand(MSGCODE_SET_AUTO_ENABLED, params); | |
7c5c5bf4 | 217 | bReturn = message->state == ADAPTER_MESSAGE_STATE_SENT_ACKED; |
a75e3a5a | 218 | delete message; |
7c5c5bf4 LOK |
219 | |
220 | if (bReturn) | |
221 | m_bSettingAutoEnabled = enabled; | |
222 | ||
a75e3a5a LOK |
223 | return bReturn; |
224 | } | |
225 | ||
226 | bool CUSBCECAdapterCommands::SetSettingDeviceType(cec_device_type type) | |
227 | { | |
7c5c5bf4 LOK |
228 | bool bReturn(true); |
229 | ||
230 | /* check whether this value was changed */ | |
231 | if (m_persistedConfiguration.deviceTypes.types[0] == type) | |
232 | { | |
233 | CLibCEC::AddLog(CEC_LOG_DEBUG, "device type setting unchanged (%X)", (uint8_t)type); | |
234 | return bReturn; | |
235 | } | |
236 | ||
237 | m_bNeedsWrite = true; | |
238 | CLibCEC::AddLog(CEC_LOG_DEBUG, "setting the device type to %X", (uint8_t)type); | |
a75e3a5a LOK |
239 | |
240 | CCECAdapterMessage params; | |
241 | params.PushEscaped((uint8_t)type); | |
242 | CCECAdapterMessage *message = m_comm->SendCommand(MSGCODE_SET_DEVICE_TYPE, params); | |
7c5c5bf4 | 243 | bReturn = message->state == ADAPTER_MESSAGE_STATE_SENT_ACKED; |
a75e3a5a | 244 | delete message; |
7c5c5bf4 | 245 | |
a75e3a5a LOK |
246 | return bReturn; |
247 | } | |
248 | ||
249 | bool CUSBCECAdapterCommands::SetSettingDefaultLogicalAddress(cec_logical_address address) | |
250 | { | |
7c5c5bf4 LOK |
251 | bool bReturn(true); |
252 | ||
253 | /* check whether this value was changed */ | |
254 | if (m_persistedConfiguration.logicalAddresses.primary == address) | |
255 | { | |
256 | CLibCEC::AddLog(CEC_LOG_DEBUG, "logical address setting unchanged (%X)", (uint8_t)address); | |
257 | return bReturn; | |
258 | } | |
259 | ||
260 | m_bNeedsWrite = true; | |
261 | CLibCEC::AddLog(CEC_LOG_DEBUG, "setting the default logical address to %X", (uint8_t)address); | |
a75e3a5a LOK |
262 | |
263 | CCECAdapterMessage params; | |
264 | params.PushEscaped((uint8_t)address); | |
265 | CCECAdapterMessage *message = m_comm->SendCommand(MSGCODE_SET_DEFAULT_LOGICAL_ADDRESS, params); | |
7c5c5bf4 | 266 | bReturn = message->state == ADAPTER_MESSAGE_STATE_SENT_ACKED; |
a75e3a5a | 267 | delete message; |
7c5c5bf4 LOK |
268 | |
269 | if (bReturn) | |
270 | m_persistedConfiguration.logicalAddresses.primary = address; | |
271 | ||
a75e3a5a LOK |
272 | return bReturn; |
273 | } | |
274 | ||
275 | bool CUSBCECAdapterCommands::SetSettingLogicalAddressMask(uint16_t iMask) | |
276 | { | |
7c5c5bf4 LOK |
277 | bool bReturn(true); |
278 | ||
279 | /* check whether this value was changed */ | |
280 | if (m_iSettingLAMask == iMask) | |
281 | { | |
282 | CLibCEC::AddLog(CEC_LOG_DEBUG, "logical address mask setting unchanged (%2X)", iMask); | |
283 | return bReturn; | |
284 | } | |
285 | ||
286 | m_bNeedsWrite = true; | |
a75e3a5a LOK |
287 | CLibCEC::AddLog(CEC_LOG_DEBUG, "setting the logical address mask to %2X", iMask); |
288 | ||
289 | CCECAdapterMessage params; | |
290 | params.PushEscaped(iMask >> 8); | |
291 | params.PushEscaped((uint8_t)iMask); | |
292 | CCECAdapterMessage *message = m_comm->SendCommand(MSGCODE_SET_LOGICAL_ADDRESS_MASK, params); | |
7c5c5bf4 | 293 | bReturn = message->state == ADAPTER_MESSAGE_STATE_SENT_ACKED; |
a75e3a5a | 294 | delete message; |
7c5c5bf4 LOK |
295 | |
296 | if (bReturn) | |
297 | m_iSettingLAMask = iMask; | |
298 | ||
a75e3a5a LOK |
299 | return bReturn; |
300 | } | |
301 | ||
302 | bool CUSBCECAdapterCommands::SetSettingPhysicalAddress(uint16_t iPhysicalAddress) | |
303 | { | |
7c5c5bf4 LOK |
304 | bool bReturn(true); |
305 | ||
306 | /* check whether this value was changed */ | |
307 | if (m_persistedConfiguration.iPhysicalAddress == iPhysicalAddress) | |
308 | { | |
e35aa7ba | 309 | CLibCEC::AddLog(CEC_LOG_DEBUG, "physical address setting unchanged (%04X)", iPhysicalAddress); |
7c5c5bf4 LOK |
310 | return bReturn; |
311 | } | |
312 | ||
313 | m_bNeedsWrite = true; | |
a75e3a5a LOK |
314 | CLibCEC::AddLog(CEC_LOG_DEBUG, "setting the physical address to %04X", iPhysicalAddress); |
315 | ||
316 | CCECAdapterMessage params; | |
317 | params.PushEscaped(iPhysicalAddress >> 8); | |
318 | params.PushEscaped((uint8_t)iPhysicalAddress); | |
319 | CCECAdapterMessage *message = m_comm->SendCommand(MSGCODE_SET_PHYSICAL_ADDRESS, params); | |
7c5c5bf4 | 320 | bReturn = message->state == ADAPTER_MESSAGE_STATE_SENT_ACKED; |
a75e3a5a | 321 | delete message; |
7c5c5bf4 LOK |
322 | |
323 | if (bReturn) | |
324 | m_persistedConfiguration.iPhysicalAddress = iPhysicalAddress; | |
325 | ||
a75e3a5a LOK |
326 | return bReturn; |
327 | } | |
328 | ||
329 | bool CUSBCECAdapterCommands::SetSettingCECVersion(cec_version version) | |
330 | { | |
7c5c5bf4 LOK |
331 | bool bReturn(true); |
332 | ||
333 | /* check whether this value was changed */ | |
334 | if (m_settingCecVersion == version) | |
335 | { | |
336 | CLibCEC::AddLog(CEC_LOG_DEBUG, "CEC version setting unchanged (%s)", CLibCEC::GetInstance()->ToString(version)); | |
337 | return bReturn; | |
338 | } | |
339 | ||
340 | m_bNeedsWrite = true; | |
a75e3a5a LOK |
341 | CLibCEC::AddLog(CEC_LOG_DEBUG, "setting the CEC version to %s", CLibCEC::GetInstance()->ToString(version)); |
342 | ||
343 | CCECAdapterMessage params; | |
344 | params.PushEscaped((uint8_t)version); | |
345 | CCECAdapterMessage *message = m_comm->SendCommand(MSGCODE_SET_HDMI_VERSION, params); | |
7c5c5bf4 | 346 | bReturn = message->state == ADAPTER_MESSAGE_STATE_SENT_ACKED; |
a75e3a5a | 347 | delete message; |
7c5c5bf4 LOK |
348 | |
349 | if (bReturn) | |
350 | m_settingCecVersion = version; | |
351 | ||
a75e3a5a LOK |
352 | return bReturn; |
353 | } | |
354 | ||
355 | bool CUSBCECAdapterCommands::SetSettingOSDName(const char *strOSDName) | |
356 | { | |
7c5c5bf4 LOK |
357 | bool bReturn(true); |
358 | ||
359 | /* check whether this value was changed */ | |
360 | if (!strcmp(m_persistedConfiguration.strDeviceName, strOSDName)) | |
361 | { | |
362 | CLibCEC::AddLog(CEC_LOG_DEBUG, "OSD name setting unchanged (%s)", strOSDName); | |
363 | return bReturn; | |
364 | } | |
365 | ||
a75e3a5a LOK |
366 | CLibCEC::AddLog(CEC_LOG_DEBUG, "setting the OSD name to %s", strOSDName); |
367 | ||
368 | CCECAdapterMessage params; | |
369 | for (size_t iPtr = 0; iPtr < strlen(strOSDName); iPtr++) | |
370 | params.PushEscaped(strOSDName[iPtr]); | |
371 | CCECAdapterMessage *message = m_comm->SendCommand(MSGCODE_SET_OSD_NAME, params); | |
7c5c5bf4 | 372 | bReturn = message->state == ADAPTER_MESSAGE_STATE_SENT_ACKED; |
a75e3a5a | 373 | delete message; |
7c5c5bf4 LOK |
374 | |
375 | if (bReturn) | |
376 | snprintf(m_persistedConfiguration.strDeviceName, 13, "%s", strOSDName); | |
377 | ||
a75e3a5a LOK |
378 | return bReturn; |
379 | } | |
380 | ||
381 | bool CUSBCECAdapterCommands::WriteEEPROM(void) | |
382 | { | |
7c5c5bf4 LOK |
383 | if (!m_bNeedsWrite) |
384 | return true; | |
385 | ||
a75e3a5a LOK |
386 | CLibCEC::AddLog(CEC_LOG_DEBUG, "writing settings in the EEPROM"); |
387 | ||
388 | CCECAdapterMessage params; | |
389 | CCECAdapterMessage *message = m_comm->SendCommand(MSGCODE_WRITE_EEPROM, params); | |
7c5c5bf4 | 390 | m_bNeedsWrite = !(message->state == ADAPTER_MESSAGE_STATE_SENT_ACKED); |
a75e3a5a | 391 | delete message; |
7c5c5bf4 | 392 | return m_bNeedsWrite; |
a75e3a5a LOK |
393 | } |
394 | ||
395 | bool CUSBCECAdapterCommands::PersistConfiguration(libcec_configuration *configuration) | |
396 | { | |
7c5c5bf4 LOK |
397 | if (m_persistedConfiguration.iFirmwareVersion < 2) |
398 | return false; | |
399 | ||
400 | if (!RequestSettings()) | |
a75e3a5a LOK |
401 | return false; |
402 | ||
403 | bool bReturn(true); | |
404 | bReturn &= SetSettingAutoEnabled(true); | |
405 | bReturn &= SetSettingDeviceType(CLibCEC::GetType(configuration->logicalAddresses.primary)); | |
406 | bReturn &= SetSettingDefaultLogicalAddress(configuration->logicalAddresses.primary); | |
407 | bReturn &= SetSettingLogicalAddressMask(CLibCEC::GetMaskForType(configuration->logicalAddresses.primary)); | |
408 | bReturn &= SetSettingPhysicalAddress(configuration->iPhysicalAddress); | |
409 | bReturn &= SetSettingCECVersion(CEC_VERSION_1_3A); | |
410 | bReturn &= SetSettingOSDName(configuration->strDeviceName); | |
7c5c5bf4 | 411 | bReturn &= WriteEEPROM(); |
a75e3a5a LOK |
412 | return bReturn; |
413 | } | |
414 | ||
7c5c5bf4 | 415 | bool CUSBCECAdapterCommands::RequestSettings(void) |
a75e3a5a | 416 | { |
7c5c5bf4 | 417 | if (m_persistedConfiguration.iFirmwareVersion < 2) |
a75e3a5a | 418 | { |
4c70b3b6 | 419 | CLibCEC::AddLog(CEC_LOG_DEBUG, "%s - firmware version %d does not have any eeprom settings", __FUNCTION__, m_persistedConfiguration.iFirmwareVersion); |
7c5c5bf4 LOK |
420 | // settings can only be persisted with firmware v2+ |
421 | return false; | |
a75e3a5a LOK |
422 | } |
423 | ||
4c70b3b6 | 424 | if (m_bSettingsRetrieved) |
7c5c5bf4 | 425 | return true; |
a75e3a5a | 426 | |
7c5c5bf4 LOK |
427 | bool bReturn(true); |
428 | bReturn &= RequestSettingAutoEnabled(); | |
429 | bReturn &= RequestSettingCECVersion(); | |
430 | bReturn &= RequestSettingDefaultLogicalAddress(); | |
431 | bReturn &= RequestSettingDeviceType(); | |
432 | bReturn &= RequestSettingLogicalAddressMask(); | |
433 | bReturn &= RequestSettingOSDName(); | |
434 | bReturn &= RequestSettingPhysicalAddress(); | |
a75e3a5a LOK |
435 | |
436 | // don't read the following settings: | |
437 | // - auto enabled (always enabled) | |
438 | // - default logical address (autodetected) | |
439 | // - logical address mask (autodetected) | |
440 | // - CEC version (1.3a) | |
441 | ||
442 | // TODO to be added to the firmware: | |
443 | // - base device (4 bits) | |
444 | // - HDMI port number (4 bits) | |
445 | // - TV vendor id (12 bits) | |
446 | // - wake devices (8 bits) | |
447 | // - standby devices (8 bits) | |
448 | // - use TV menu language (1 bit) | |
449 | // - activate source (1 bit) | |
450 | // - power off screensaver (1 bit) | |
451 | // - power off on standby (1 bit) | |
452 | // - send inactive source (1 bit) | |
7c5c5bf4 LOK |
453 | |
454 | m_bSettingsRetrieved = true; | |
455 | ||
a75e3a5a LOK |
456 | return bReturn; |
457 | } | |
458 | ||
7c5c5bf4 LOK |
459 | bool CUSBCECAdapterCommands::GetConfiguration(libcec_configuration *configuration) |
460 | { | |
461 | // get the settings from the eeprom if needed | |
462 | if (!RequestSettings()) | |
463 | return false; | |
464 | ||
465 | // copy the settings | |
466 | configuration->iFirmwareVersion = m_persistedConfiguration.iFirmwareVersion; | |
467 | configuration->deviceTypes = m_persistedConfiguration.deviceTypes; | |
468 | configuration->iPhysicalAddress = m_persistedConfiguration.iPhysicalAddress; | |
469 | snprintf(configuration->strDeviceName, 13, "%s", m_persistedConfiguration.strDeviceName); | |
470 | ||
471 | return true; | |
472 | } | |
473 | ||
a75e3a5a LOK |
474 | bool CUSBCECAdapterCommands::PingAdapter(void) |
475 | { | |
476 | CLibCEC::AddLog(CEC_LOG_DEBUG, "sending ping"); | |
477 | ||
478 | CCECAdapterMessage params; | |
479 | CCECAdapterMessage *message = m_comm->SendCommand(MSGCODE_PING, params); | |
480 | bool bReturn = message->state == ADAPTER_MESSAGE_STATE_SENT_ACKED; | |
481 | delete message; | |
482 | return bReturn; | |
483 | } | |
484 | ||
485 | bool CUSBCECAdapterCommands::SetAckMask(uint16_t iMask) | |
486 | { | |
487 | CLibCEC::AddLog(CEC_LOG_DEBUG, "setting ackmask to %2x", iMask); | |
488 | ||
489 | CCECAdapterMessage params; | |
490 | params.PushEscaped(iMask >> 8); | |
491 | params.PushEscaped((uint8_t)iMask); | |
492 | CCECAdapterMessage *message = m_comm->SendCommand(MSGCODE_SET_ACK_MASK, params); | |
493 | bool bReturn = message->state == ADAPTER_MESSAGE_STATE_SENT_ACKED; | |
494 | delete message; | |
495 | return bReturn; | |
496 | } | |
497 | ||
498 | bool CUSBCECAdapterCommands::StartBootloader(void) | |
499 | { | |
500 | CLibCEC::AddLog(CEC_LOG_DEBUG, "starting the bootloader"); | |
501 | ||
502 | CCECAdapterMessage params; | |
503 | CCECAdapterMessage *message = m_comm->SendCommand(MSGCODE_START_BOOTLOADER, params); | |
504 | bool bReturn = message->state == ADAPTER_MESSAGE_STATE_SENT_ACKED; | |
505 | delete message; | |
506 | return bReturn; | |
507 | } | |
508 | ||
509 | bool CUSBCECAdapterCommands::SetLineTimeout(uint8_t iTimeout) | |
510 | { | |
511 | CLibCEC::AddLog(CEC_LOG_DEBUG, "setting the line timeout to %d", iTimeout); | |
512 | CCECAdapterMessage params; | |
513 | params.PushEscaped(iTimeout); | |
514 | CCECAdapterMessage *message = m_comm->SendCommand(MSGCODE_TRANSMIT_IDLETIME, params); | |
515 | bool bReturn = message->state == ADAPTER_MESSAGE_STATE_SENT_ACKED; | |
516 | delete message; | |
517 | return bReturn; | |
518 | } | |
519 | ||
520 | bool CUSBCECAdapterCommands::SetControlledMode(bool controlled) | |
521 | { | |
522 | CLibCEC::AddLog(CEC_LOG_DEBUG, "turning controlled mode %s", controlled ? "on" : "off"); | |
523 | ||
524 | CCECAdapterMessage params; | |
525 | params.PushEscaped(controlled ? 1 : 0); | |
526 | CCECAdapterMessage *message = m_comm->SendCommand(MSGCODE_SET_CONTROLLED, params); | |
527 | bool bReturn = message->state == ADAPTER_MESSAGE_STATE_SENT_ACKED; | |
528 | delete message; | |
529 | return bReturn; | |
530 | } |