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"
42 #define COMMAND_HANDLED 0xFF
50 CResponse(cec_opcode opcode
) :
57 bool Wait(uint32_t iTimeout
)
59 return m_event
.Wait(iTimeout
);
69 PLATFORM::CEvent m_event
;
72 class CWaitForResponse
75 CWaitForResponse(void) {}
76 ~CWaitForResponse(void)
78 PLATFORM::CLockObject
lock(m_mutex
);
82 bool Wait(cec_opcode opcode
, uint32_t iTimeout
= CEC_DEFAULT_TRANSMIT_WAIT
)
84 CResponse
*response
= GetEvent(opcode
);
85 return response
? response
->Wait(iTimeout
) : false;
88 void Received(cec_opcode opcode
)
90 CResponse
*response
= GetEvent(opcode
);
92 response
->Broadcast();
96 CResponse
*GetEvent(cec_opcode opcode
)
98 CResponse
*retVal(NULL
);
100 PLATFORM::CLockObject
lock(m_mutex
);
101 std::map
<cec_opcode
, CResponse
*>::iterator it
= m_waitingFor
.find(opcode
);
102 if (it
!= m_waitingFor
.end())
108 retVal
= new CResponse(opcode
);
109 m_waitingFor
[opcode
] = retVal
;
115 PLATFORM::CMutex m_mutex
;
116 std::map
<cec_opcode
, CResponse
*> m_waitingFor
;
119 class CCECCommandHandler
122 CCECCommandHandler(CCECBusDevice
*busDevice
);
123 virtual ~CCECCommandHandler(void);
125 virtual bool HandleCommand(const cec_command
&command
);
126 virtual cec_vendor_id
GetVendorId(void) { return m_vendorId
; };
127 virtual void SetVendorId(cec_vendor_id vendorId
) { m_vendorId
= vendorId
; }
128 static bool HasSpecificHandler(cec_vendor_id vendorId
) { return vendorId
== CEC_VENDOR_LG
|| vendorId
== CEC_VENDOR_SAMSUNG
|| vendorId
== CEC_VENDOR_PANASONIC
;}
130 virtual bool InitHandler(void) { return true; }
131 virtual bool ActivateSource(void);
132 virtual uint8_t GetTransmitRetries(void) const { return m_iTransmitRetries
; }
134 virtual bool PowerOn(const cec_logical_address iInitiator
, const cec_logical_address iDestination
);
135 virtual bool TransmitImageViewOn(const cec_logical_address iInitiator
, const cec_logical_address iDestination
);
136 virtual bool TransmitStandby(const cec_logical_address iInitiator
, const cec_logical_address iDestination
);
137 virtual bool TransmitRequestActiveSource(const cec_logical_address iInitiator
, bool bWaitForResponse
= true);
138 virtual bool TransmitRequestCecVersion(const cec_logical_address iInitiator
, const cec_logical_address iDestination
, bool bWaitForResponse
= true);
139 virtual bool TransmitRequestMenuLanguage(const cec_logical_address iInitiator
, const cec_logical_address iDestination
, bool bWaitForResponse
= true);
140 virtual bool TransmitRequestOSDName(const cec_logical_address iInitiator
, const cec_logical_address iDestination
, bool bWaitForResponse
= true);
141 virtual bool TransmitRequestPhysicalAddress(const cec_logical_address iInitiator
, const cec_logical_address iDestination
, bool bWaitForResponse
= true);
142 virtual bool TransmitRequestPowerStatus(const cec_logical_address iInitiator
, const cec_logical_address iDestination
, bool bWaitForResponse
= true);
143 virtual bool TransmitRequestVendorId(const cec_logical_address iInitiator
, const cec_logical_address iDestination
, bool bWaitForResponse
= true);
144 virtual bool TransmitActiveSource(const cec_logical_address iInitiator
, uint16_t iPhysicalAddress
);
145 virtual bool TransmitCECVersion(const cec_logical_address iInitiator
, const cec_logical_address iDestination
, cec_version cecVersion
);
146 virtual bool TransmitInactiveSource(const cec_logical_address iInitiator
, uint16_t iPhysicalAddress
);
147 virtual bool TransmitMenuState(const cec_logical_address iInitiator
, const cec_logical_address iDestination
, cec_menu_state menuState
);
148 virtual bool TransmitOSDName(const cec_logical_address iInitiator
, const cec_logical_address iDestination
, CStdString strDeviceName
);
149 virtual bool TransmitOSDString(const cec_logical_address iInitiator
, const cec_logical_address iDestination
, cec_display_control duration
, const char *strMessage
);
150 virtual bool TransmitPhysicalAddress(const cec_logical_address iInitiator
, uint16_t iPhysicalAddress
, cec_device_type type
);
151 virtual bool TransmitSetMenuLanguage(const cec_logical_address iInitiator
, const char lang
[3]);
152 virtual bool TransmitPoll(const cec_logical_address iInitiator
, const cec_logical_address iDestination
);
153 virtual bool TransmitPowerState(const cec_logical_address iInitiator
, const cec_logical_address iDestination
, cec_power_status state
);
154 virtual bool TransmitVendorID(const cec_logical_address iInitiator
, uint64_t iVendorId
);
155 virtual bool TransmitAudioStatus(const cec_logical_address iInitiator
, const cec_logical_address iDestination
, uint8_t state
);
156 virtual bool TransmitSetSystemAudioMode(const cec_logical_address iInitiator
, const cec_logical_address iDestination
, cec_system_audio_status state
);
157 virtual bool TransmitSystemAudioModeStatus(const cec_logical_address iInitiator
, const cec_logical_address iDestination
, cec_system_audio_status state
);
158 virtual bool TransmitDeckStatus(const cec_logical_address iInitiator
, const cec_logical_address iDestination
, cec_deck_info state
);
159 virtual bool TransmitKeypress(const cec_logical_address iInitiator
, const cec_logical_address iDestination
, cec_user_control_code key
, bool bWait
= true);
160 virtual bool TransmitKeyRelease(const cec_logical_address iInitiator
, const cec_logical_address iDestination
, bool bWait
= true);
161 virtual bool TransmitSetStreamPath(uint16_t iStreamPath
);
162 virtual bool SendDeckStatusUpdateOnActiveSource(void) const { return m_bOPTSendDeckStatusUpdateOnActiveSource
; };
163 virtual bool TransmitPendingActiveSourceCommands(void) { return true; }
165 virtual void SignalOpcode(cec_opcode opcode
);
167 virtual bool ActiveSourcePending(void);
168 virtual bool SupportsDeviceType(const cec_device_type
UNUSED(type
)) const { return true; };
169 virtual cec_device_type
GetReplacementDeviceType(const cec_device_type type
) const { return type
; }
172 virtual int HandleActiveSource(const cec_command
&command
);
173 virtual int HandleDeckControl(const cec_command
&command
);
174 virtual int HandleDeviceCecVersion(const cec_command
&command
);
175 virtual int HandleDeviceVendorCommandWithId(const cec_command
&command
);
176 virtual int HandleDeviceVendorId(const cec_command
&command
);
177 virtual int HandleFeatureAbort(const cec_command
&command
);
178 virtual int HandleGetCecVersion(const cec_command
&command
);
179 virtual int HandleGiveAudioStatus(const cec_command
&command
);
180 virtual int HandleGiveDeckStatus(const cec_command
&command
);
181 virtual int HandleGiveDevicePowerStatus(const cec_command
&command
);
182 virtual int HandleGiveDeviceVendorId(const cec_command
&command
);
183 virtual int HandleGiveOSDName(const cec_command
&command
);
184 virtual int HandleGivePhysicalAddress(const cec_command
&command
);
185 virtual int HandleGiveMenuLanguage(const cec_command
&command
);
186 virtual int HandleGiveSystemAudioModeStatus(const cec_command
&command
);
187 virtual int HandleImageViewOn(const cec_command
&command
);
188 virtual int HandleMenuRequest(const cec_command
&command
);
189 virtual bool HandlePoll(const cec_command
&command
);
190 virtual int HandleReportAudioStatus(const cec_command
&command
);
191 virtual int HandleReportPhysicalAddress(const cec_command
&command
);
192 virtual int HandleReportPowerStatus(const cec_command
&command
);
193 virtual int HandleRequestActiveSource(const cec_command
&command
);
194 virtual int HandleRoutingChange(const cec_command
&command
);
195 virtual int HandleRoutingInformation(const cec_command
&command
);
196 virtual int HandleSetMenuLanguage(const cec_command
&command
);
197 virtual int HandleSetOSDName(const cec_command
&command
);
198 virtual int HandleSetStreamPath(const cec_command
&command
);
199 virtual int HandleSystemAudioModeRequest(const cec_command
&command
);
200 virtual int HandleStandby(const cec_command
&command
);
201 virtual int HandleSystemAudioModeStatus(const cec_command
&command
);
202 virtual int HandleSetSystemAudioMode(const cec_command
&command
);
203 virtual int HandleTextViewOn(const cec_command
&command
);
204 virtual int HandleUserControlPressed(const cec_command
&command
);
205 virtual int HandleUserControlRelease(const cec_command
&command
);
206 virtual int HandleVendorCommand(const cec_command
&command
);
207 virtual int HandleVendorRemoteButtonDown(const cec_command
& UNUSED(command
)) { return CEC_ABORT_REASON_REFUSED
; }
208 virtual int HandleVendorRemoteButtonUp(const cec_command
& UNUSED(command
)) { return CEC_ABORT_REASON_REFUSED
; }
209 virtual void UnhandledCommand(const cec_command
&command
, const cec_abort_reason reason
);
211 virtual size_t GetMyDevices(std::vector
<CCECBusDevice
*> &devices
) const;
212 virtual CCECBusDevice
*GetDevice(cec_logical_address iLogicalAddress
) const;
213 virtual CCECBusDevice
*GetDeviceByPhysicalAddress(uint16_t iPhysicalAddress
) const;
215 virtual bool SetVendorId(const cec_command
&command
);
216 virtual void SetPhysicalAddress(cec_logical_address iAddress
, uint16_t iNewAddress
);
218 virtual bool Transmit(cec_command
&command
, bool bSuppressWait
= false);
220 CCECBusDevice
* m_busDevice
;
221 CCECProcessor
* m_processor
;
222 int32_t m_iTransmitTimeout
;
223 int32_t m_iTransmitWait
;
224 int8_t m_iTransmitRetries
;
225 bool m_bHandlerInited
;
226 bool m_bOPTSendDeckStatusUpdateOnActiveSource
;
227 cec_vendor_id m_vendorId
;
228 CWaitForResponse
*m_waitForResponse
;
229 bool m_bActiveSourcePending
;
230 PLATFORM::CMutex m_mutex
;