3 * This file is part of the libCEC(R) library.
5 * libCEC(R) is Copyright (C) 2011-2012 Pulse-Eight Limited. All rights reserved.
6 * libCEC(R) is an original work, containing original code.
8 * libCEC(R) is a trademark of Pulse-Eight Limited.
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.
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.
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.
25 * Alternatively, you can license this library under a commercial license,
26 * please contact Pulse-Eight Licensing for more information.
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/
34 #include "../../../include/cectypes.h"
37 #include "../platform/threads/mutex.h"
38 #include "../platform/util/StdString.h"
48 CResponse(cec_opcode opcode
) :
55 bool Wait(uint32_t iTimeout
)
57 return m_event
.Wait(iTimeout
);
67 PLATFORM::CEvent m_event
;
70 class CWaitForResponse
73 CWaitForResponse(void) {}
74 ~CWaitForResponse(void)
76 PLATFORM::CLockObject
lock(m_mutex
);
80 bool Wait(cec_opcode opcode
, uint32_t iTimeout
= 2000)
82 CResponse
*response
= GetEvent(opcode
);
83 return response
? response
->Wait(iTimeout
) : false;
86 void Received(cec_opcode opcode
)
88 CResponse
*response
= GetEvent(opcode
);
90 response
->Broadcast();
94 CResponse
*GetEvent(cec_opcode opcode
)
96 CResponse
*retVal(NULL
);
98 PLATFORM::CLockObject
lock(m_mutex
);
99 std::map
<cec_opcode
, CResponse
*>::iterator it
= m_waitingFor
.find(opcode
);
100 if (it
!= m_waitingFor
.end())
106 retVal
= new CResponse(opcode
);
107 m_waitingFor
[opcode
] = retVal
;
113 PLATFORM::CMutex m_mutex
;
114 std::map
<cec_opcode
, CResponse
*> m_waitingFor
;
117 class CCECCommandHandler
120 CCECCommandHandler(CCECBusDevice
*busDevice
);
121 virtual ~CCECCommandHandler(void);
123 virtual bool HandleCommand(const cec_command
&command
);
124 virtual cec_vendor_id
GetVendorId(void) { return m_vendorId
; };
125 virtual void SetVendorId(cec_vendor_id vendorId
) { m_vendorId
= vendorId
; }
126 static bool HasSpecificHandler(cec_vendor_id vendorId
) { return vendorId
== CEC_VENDOR_LG
|| vendorId
== CEC_VENDOR_SAMSUNG
|| vendorId
== CEC_VENDOR_PANASONIC
;}
128 virtual bool InitHandler(void) { return true; }
129 virtual bool ActivateSource(void);
130 virtual uint8_t GetTransmitRetries(void) const { return m_iTransmitRetries
; }
132 virtual bool PowerOn(const cec_logical_address iInitiator
, const cec_logical_address iDestination
);
133 virtual bool TransmitImageViewOn(const cec_logical_address iInitiator
, const cec_logical_address iDestination
);
134 virtual bool TransmitStandby(const cec_logical_address iInitiator
, const cec_logical_address iDestination
);
135 virtual bool TransmitRequestCecVersion(const cec_logical_address iInitiator
, const cec_logical_address iDestination
);
136 virtual bool TransmitRequestMenuLanguage(const cec_logical_address iInitiator
, const cec_logical_address iDestination
);
137 virtual bool TransmitRequestOSDName(const cec_logical_address iInitiator
, const cec_logical_address iDestination
);
138 virtual bool TransmitRequestPhysicalAddress(const cec_logical_address iInitiator
, const cec_logical_address iDestination
);
139 virtual bool TransmitRequestPowerStatus(const cec_logical_address iInitiator
, const cec_logical_address iDestination
);
140 virtual bool TransmitRequestVendorId(const cec_logical_address iInitiator
, const cec_logical_address iDestination
);
141 virtual bool TransmitActiveSource(const cec_logical_address iInitiator
, uint16_t iPhysicalAddress
);
142 virtual bool TransmitCECVersion(const cec_logical_address iInitiator
, const cec_logical_address iDestination
, cec_version cecVersion
);
143 virtual bool TransmitInactiveSource(const cec_logical_address iInitiator
, uint16_t iPhysicalAddress
);
144 virtual bool TransmitMenuState(const cec_logical_address iInitiator
, const cec_logical_address iDestination
, cec_menu_state menuState
);
145 virtual bool TransmitOSDName(const cec_logical_address iInitiator
, const cec_logical_address iDestination
, CStdString strDeviceName
);
146 virtual bool TransmitOSDString(const cec_logical_address iInitiator
, const cec_logical_address iDestination
, cec_display_control duration
, const char *strMessage
);
147 virtual bool TransmitPhysicalAddress(const cec_logical_address iInitiator
, uint16_t iPhysicalAddress
, cec_device_type type
);
148 virtual bool TransmitPoll(const cec_logical_address iInitiator
, const cec_logical_address iDestination
);
149 virtual bool TransmitPowerState(const cec_logical_address iInitiator
, const cec_logical_address iDestination
, cec_power_status state
);
150 virtual bool TransmitVendorID(const cec_logical_address iInitiator
, uint64_t iVendorId
);
151 virtual bool TransmitAudioStatus(const cec_logical_address iInitiator
, const cec_logical_address iDestination
, uint8_t state
);
152 virtual bool TransmitSetSystemAudioMode(const cec_logical_address iInitiator
, const cec_logical_address iDestination
, cec_system_audio_status state
);
153 virtual bool TransmitSystemAudioModeStatus(const cec_logical_address iInitiator
, const cec_logical_address iDestination
, cec_system_audio_status state
);
154 virtual bool TransmitDeckStatus(const cec_logical_address iInitiator
, const cec_logical_address iDestination
, cec_deck_info state
);
155 virtual bool TransmitKeypress(const cec_logical_address iInitiator
, const cec_logical_address iDestination
, cec_user_control_code key
, bool bWait
= true);
156 virtual bool TransmitKeyRelease(const cec_logical_address iInitiator
, const cec_logical_address iDestination
, bool bWait
= true);
157 virtual bool TransmitSetStreamPath(uint16_t iStreamPath
);
158 virtual bool SendDeckStatusUpdateOnActiveSource(void) const { return m_bOPTSendDeckStatusUpdateOnActiveSource
; };
161 virtual bool HandleActiveSource(const cec_command
&command
);
162 virtual bool HandleDeckControl(const cec_command
&command
);
163 virtual bool HandleDeviceCecVersion(const cec_command
&command
);
164 virtual bool HandleDeviceVendorCommandWithId(const cec_command
&command
);
165 virtual bool HandleDeviceVendorId(const cec_command
&command
);
166 virtual bool HandleFeatureAbort(const cec_command
&command
);
167 virtual bool HandleGetCecVersion(const cec_command
&command
);
168 virtual bool HandleGiveAudioStatus(const cec_command
&command
);
169 virtual bool HandleGiveDeckStatus(const cec_command
&command
);
170 virtual bool HandleGiveDevicePowerStatus(const cec_command
&command
);
171 virtual bool HandleGiveDeviceVendorId(const cec_command
&command
);
172 virtual bool HandleGiveOSDName(const cec_command
&command
);
173 virtual bool HandleGivePhysicalAddress(const cec_command
&command
);
174 virtual bool HandleGiveSystemAudioModeStatus(const cec_command
&command
);
175 virtual bool HandleImageViewOn(const cec_command
&command
);
176 virtual bool HandleMenuRequest(const cec_command
&command
);
177 virtual bool HandleReportAudioStatus(const cec_command
&command
);
178 virtual bool HandleReportPhysicalAddress(const cec_command
&command
);
179 virtual bool HandleReportPowerStatus(const cec_command
&command
);
180 virtual bool HandleRequestActiveSource(const cec_command
&command
);
181 virtual bool HandleRoutingChange(const cec_command
&command
);
182 virtual bool HandleRoutingInformation(const cec_command
&command
);
183 virtual bool HandleSetMenuLanguage(const cec_command
&command
);
184 virtual bool HandleSetOSDName(const cec_command
&command
);
185 virtual bool HandleSetStreamPath(const cec_command
&command
);
186 virtual bool HandleSystemAudioModeRequest(const cec_command
&command
);
187 virtual bool HandleStandby(const cec_command
&command
);
188 virtual bool HandleSystemAudioModeStatus(const cec_command
&command
);
189 virtual bool HandleSetSystemAudioMode(const cec_command
&command
);
190 virtual bool HandleTextViewOn(const cec_command
&command
);
191 virtual bool HandleUserControlPressed(const cec_command
&command
);
192 virtual bool HandleUserControlRelease(const cec_command
&command
);
193 virtual bool HandleVendorCommand(const cec_command
&command
);
194 virtual void UnhandledCommand(const cec_command
&command
);
196 virtual size_t GetMyDevices(std::vector
<CCECBusDevice
*> &devices
) const;
197 virtual CCECBusDevice
*GetDevice(cec_logical_address iLogicalAddress
) const;
198 virtual CCECBusDevice
*GetDeviceByPhysicalAddress(uint16_t iPhysicalAddress
) const;
199 virtual CCECBusDevice
*GetDeviceByType(cec_device_type type
) const;
201 virtual bool SetVendorId(const cec_command
&command
);
202 virtual void SetPhysicalAddress(cec_logical_address iAddress
, uint16_t iNewAddress
);
204 virtual bool Transmit(cec_command
&command
, bool bExpectResponse
= true, cec_opcode expectedResponse
= CEC_OPCODE_NONE
);
206 CCECBusDevice
* m_busDevice
;
207 CCECProcessor
* m_processor
;
208 int32_t m_iTransmitTimeout
;
209 int32_t m_iTransmitWait
;
210 int8_t m_iTransmitRetries
;
211 bool m_bHandlerInited
;
212 bool m_bOPTSendDeckStatusUpdateOnActiveSource
;
213 cec_vendor_id m_vendorId
;
214 CWaitForResponse
*m_waitForResponse
;