54 // Destructor |
55 // Destructor |
55 //----------------------------------------------------------------------------- |
56 //----------------------------------------------------------------------------- |
56 // |
57 // |
57 CGlxTvConnectionMonitor::~CGlxTvConnectionMonitor() |
58 CGlxTvConnectionMonitor::~CGlxTvConnectionMonitor() |
58 { |
59 { |
59 GLX_LOG_INFO("~CGlxTvConnectionMonitor"); |
60 TRACER("~CGlxTvConnectionMonitor"); |
60 Cancel(); |
61 Cancel(); |
61 iTvAccCon.CloseSubSession(); |
62 iTvAccCon.CloseSubSession(); |
62 iTvAccServer.Disconnect(); |
63 iTvAccServer.Disconnect(); |
63 } |
64 } |
64 |
65 |
65 |
66 |
66 //----------------------------------------------------------------------------- |
67 //----------------------------------------------------------------------------- |
67 // Default C++ constructor |
68 // Default C++ constructor |
68 //----------------------------------------------------------------------------- |
69 //----------------------------------------------------------------------------- |
69 // |
70 // |
70 CGlxTvConnectionMonitor::CGlxTvConnectionMonitor |
71 CGlxTvConnectionMonitor::CGlxTvConnectionMonitor( |
71 ( MGlxTvConnectionObserver& aConnectionObserver ) |
72 MGlxTvConnectionObserver& aConnectionObserver) : |
72 :CActive(EPriorityStandard), |
73 CActive(EPriorityStandard), iConnectionObserver(aConnectionObserver), |
73 iConnectionObserver ( aConnectionObserver ) |
74 iTvOutConnectionState(EFalse), iHDMIConnectionState(EFalse) |
74 { |
75 |
75 GLX_LOG_INFO("CGlxTvConnectionMonitor"); |
76 { |
76 CActiveScheduler::Add( this ); |
77 TRACER("CGlxTvConnectionMonitor"); |
77 } |
78 CActiveScheduler::Add(this); |
|
79 } |
78 |
80 |
79 |
81 |
80 //----------------------------------------------------------------------------- |
82 //----------------------------------------------------------------------------- |
81 // Symbian second phase constructor |
83 // Symbian second phase constructor |
82 //----------------------------------------------------------------------------- |
84 //----------------------------------------------------------------------------- |
83 // |
85 // |
84 void CGlxTvConnectionMonitor::ConstructL() |
86 void CGlxTvConnectionMonitor::ConstructL() |
85 { |
87 { |
86 GLX_LOG_INFO("CGlxTvConnectionMonitor::ConstructL"); |
88 TRACER("CGlxTvConnectionMonitor::ConstructL"); |
87 User::LeaveIfError(iTvAccServer.Connect()); |
89 User::LeaveIfError(iTvAccServer.Connect()); |
88 User::LeaveIfError(iTvAccCon.CreateSubSession(iTvAccServer)); |
90 User::LeaveIfError(iTvAccCon.CreateSubSession(iTvAccServer)); |
89 User::LeaveIfError(iTvAccCon.GetAccessoryConnectionStatus(iCurrentAccArray)); |
91 |
90 for (int i = 0; i < iCurrentAccArray.Count(); i++) |
92 UpdateConnectionStatusL(); |
91 { |
|
92 iTvOutConnectionState |
|
93 = (iCurrentAccArray.GetGenericIDL(i).PhysicalConnectionCaps() |
|
94 == KPCWired); |
|
95 iHDMIConnectionState |
|
96 = (iCurrentAccArray.GetGenericIDL(i).PhysicalConnectionCaps() |
|
97 == KPCHDMI); |
|
98 } |
|
99 IssueRequest(); |
93 IssueRequest(); |
100 } |
94 } |
101 |
95 |
102 //----------------------------------------------------------------------------- |
96 //----------------------------------------------------------------------------- |
103 // From class CActive. |
97 // From class CActive. |
104 // Receive notification of change in the connection state |
98 // Receive notification of change in the connection state |
105 //----------------------------------------------------------------------------- |
99 //----------------------------------------------------------------------------- |
106 // |
100 // |
107 void CGlxTvConnectionMonitor::RunL() |
101 void CGlxTvConnectionMonitor::RunL() |
108 { |
102 { |
109 GLX_LOG_INFO("CGlxTvConnectionMonitor::RunL"); |
103 TRACER("CGlxTvConnectionMonitor::RunL"); |
110 // Check for errors |
104 // Check for errors |
111 User::LeaveIfError( iStatus.Int() ); |
105 User::LeaveIfError( iStatus.Int() ); |
112 // Notify observers |
106 // Notify observers |
113 IssueNotificationL(); |
107 IssueNotificationL(); |
114 // Request the next event |
108 // Request the next event |
158 // IsConnected |
152 // IsConnected |
159 //----------------------------------------------------------------------------- |
153 //----------------------------------------------------------------------------- |
160 // |
154 // |
161 TBool CGlxTvConnectionMonitor::IsHDMIConnected() const |
155 TBool CGlxTvConnectionMonitor::IsHDMIConnected() const |
162 { |
156 { |
163 GLX_LOG_INFO("CGlxTvConnectionMonitor::IsHDMIConnected"); |
157 TRACER("CGlxTvConnectionMonitor::IsHDMIConnected"); |
164 GLX_LOG_INFO1("CGlxTvConnectionMonitor::IsHDMIConnected iHDMIConnectionState=%d",iHDMIConnectionState); |
158 GLX_LOG_INFO1("CGlxTvConnectionMonitor::IsHDMIConnected iHDMIConnectionState=%d",iHDMIConnectionState); |
165 return iHDMIConnectionState; |
159 return iHDMIConnectionState; |
166 } |
160 } |
167 |
161 |
168 //----------------------------------------------------------------------------- |
162 //----------------------------------------------------------------------------- |
169 // Request accessory server events |
163 // Request accessory server events |
170 //----------------------------------------------------------------------------- |
164 //----------------------------------------------------------------------------- |
171 // |
165 // |
172 void CGlxTvConnectionMonitor::IssueRequest() |
166 void CGlxTvConnectionMonitor::IssueRequest() |
173 { |
167 { |
174 GLX_LOG_INFO("CGlxTvConnectionMonitor::IssueRequest"); |
168 TRACER("CGlxTvConnectionMonitor::IssueRequest"); |
175 if (!IsActive()) // required for testing |
169 if (!IsActive()) // required for testing |
176 { |
170 { |
177 iTvAccCon.NotifyAccessoryConnectionStatusChanged(iStatus,iCurrentAccArray); |
171 iTvAccCon.NotifyAccessoryConnectionStatusChanged(iStatus,iCurrentAccArray); |
178 SetActive(); |
172 SetActive(); |
179 } |
173 } |
182 //----------------------------------------------------------------------------- |
176 //----------------------------------------------------------------------------- |
183 // Sends notification to observers if TV Out is connected |
177 // Sends notification to observers if TV Out is connected |
184 //----------------------------------------------------------------------------- |
178 //----------------------------------------------------------------------------- |
185 // |
179 // |
186 void CGlxTvConnectionMonitor::IssueNotificationL() |
180 void CGlxTvConnectionMonitor::IssueNotificationL() |
187 { |
181 { |
188 GLX_LOG_INFO("CGlxTvConnectionMonitor::IssueNotificationL"); |
182 TRACER("CGlxTvConnectionMonitor::IssueNotificationL"); |
189 TBool previousTvState = iTvOutConnectionState; |
183 TBool previousTvState = iTvOutConnectionState; |
190 TBool previousHDMIState = iHDMIConnectionState; |
184 TBool previousHDMIState = iHDMIConnectionState; |
191 GLX_LOG_INFO2("previousTvState = %d , previousHDMIState = %d", |
185 |
192 previousTvState,previousHDMIState); |
186 // Update the connection status |
193 |
187 UpdateConnectionStatusL(); |
194 //gets the TV status in to the iCurrentAccArray and haves the Latest Accesory in 0-index |
188 |
195 User::LeaveIfError(iTvAccCon.GetAccessoryConnectionStatus(iCurrentAccArray)); |
189 // trigger tvstatus change only when there is actually a change the in the connection and not |
196 |
190 // for spurious events |
197 CAccPolSubblockNameArray* nameArray = CAccPolSubblockNameArray::NewL(); |
|
198 CleanupStack::PushL(nameArray); |
|
199 |
|
200 // |
|
201 // Get the number of currently connected accessories |
|
202 // Loop through each connected accessory looking for |
|
203 // the desired capabilities |
|
204 // |
|
205 iTvOutConnectionState = EFalse; |
|
206 iHDMIConnectionState = EFalse; |
|
207 const TInt count = iCurrentAccArray.Count(); |
|
208 for (TInt index = 0; index < count; index++) |
|
209 { |
|
210 TAccPolGenericID genId = iCurrentAccArray.GetGenericIDL(index); |
|
211 // Get all supported capabilities for this connected accessory. |
|
212 iTvAccCon.GetSubblockNameArrayL(genId, *nameArray); |
|
213 // Check if this connected accessory supports TV-Out capabality. |
|
214 if (nameArray->HasName(KAccVideoOut)) |
|
215 { |
|
216 GLX_LOG_INFO("TV-Out Capabilities Exist"); |
|
217 TAccPolNameRecord nameRecord; |
|
218 nameRecord.SetNameL(KAccVideoOut); |
|
219 TAccValueTypeTInt value; |
|
220 iTvAccCon.GetValueL(genId, nameRecord, value); |
|
221 if (value.iValue == EAccVideoOutEHDMI) |
|
222 { |
|
223 GLX_LOG_INFO("HDMI is connected Capabilities Exist"); |
|
224 iHDMIConnectionState = ETrue; |
|
225 break; |
|
226 } |
|
227 else if (value.iValue == EAccVideoOutCVideo) |
|
228 { |
|
229 GLX_LOG_INFO("TV is connected Capabilities Exist"); |
|
230 iTvOutConnectionState = ETrue; |
|
231 break; |
|
232 } |
|
233 } |
|
234 |
|
235 } |
|
236 CleanupStack::PopAndDestroy(nameArray); |
|
237 |
|
238 if (previousTvState != iTvOutConnectionState || previousHDMIState |
191 if (previousTvState != iTvOutConnectionState || previousHDMIState |
239 != iHDMIConnectionState) |
192 != iHDMIConnectionState) |
240 { |
193 { |
241 GLX_LOG_INFO("CGlxTvConnectionMonitor::IssueNotificationL -" |
194 GLX_LOG_INFO("CGlxTvConnectionMonitor::IssueNotificationL - Connection Altered"); |
242 " TvConnectionStatusChanged"); |
|
243 GLX_LOG_INFO2("CurrentTvState = %d , CurrentHDMIState = %d", |
|
244 iTvOutConnectionState,iHDMIConnectionState); |
|
245 iConnectionObserver.HandleTvConnectionStatusChangedL(); |
195 iConnectionObserver.HandleTvConnectionStatusChangedL(); |
246 } |
196 } |
247 } |
197 } |
248 |
198 |
|
199 //----------------------------------------------------------------------------- |
|
200 // UpdateConnectionStatusL() |
|
201 //----------------------------------------------------------------------------- |
|
202 // |
|
203 void CGlxTvConnectionMonitor::UpdateConnectionStatusL() |
|
204 { |
|
205 TRACER("CGlxTvConnectionMonitor::UpdateConnectionStatusL()"); |
|
206 |
|
207 GLX_LOG_INFO2("CGlxTvConnectionMonitor::UpdateConnectionStatusL previousTvState = %d , previousHDMIState = %d", |
|
208 iTvOutConnectionState,iHDMIConnectionState); |
|
209 |
|
210 // reset the states |
|
211 iHDMIConnectionState = EFalse; |
|
212 iTvOutConnectionState = EFalse; |
|
213 |
|
214 //gets the TV status in to the iCurrentAccArray and haves the Latest Accesory in 0-index |
|
215 User::LeaveIfError(iTvAccCon.GetAccessoryConnectionStatus(iCurrentAccArray)); |
|
216 |
|
217 CAccPolSubblockNameArray* nameArray = CAccPolSubblockNameArray::NewL(); |
|
218 CleanupStack::PushL(nameArray); |
|
219 |
|
220 // Get the number of currently connected accessories |
|
221 // Loop through each connected accessory looking for |
|
222 // the desired capabilities |
|
223 // |
|
224 const TInt count = iCurrentAccArray.Count(); |
|
225 GLX_LOG_INFO1("CGlxTvConnectionMonitor::UpdateConnectionStatusL current count value is %d",count); |
|
226 for (TInt index = 0; index < count; index++) |
|
227 { |
|
228 const TAccPolGenericID genId = iCurrentAccArray.GetGenericIDL(index); |
|
229 // Check if this connected accessory supports TV-Out capabality. |
|
230 GLX_LOG_INFO1("CGlxTvConnectionMonitor::UpdateConnectionStatusL current index value is %d",index); |
|
231 GLX_LOG_INFO("CGlxTvConnectionMonitor::UpdateConnectionStatusL Video Accessory Supported"); |
|
232 TAccPolNameRecord nameRecord; |
|
233 nameRecord.SetNameL(KAccVideoOut); |
|
234 |
|
235 if (genId.DeviceTypeCaps( KDTAVDevice ) && |
|
236 genId.PhysicalConnectionCaps( KPCHDMI )) |
|
237 { |
|
238 TAccValueTypeTInt value; |
|
239 TInt err = iTvAccCon.GetValueL(genId, nameRecord, value); |
|
240 if (err ==KErrNone) |
|
241 { |
|
242 if (value.iValue == EAccVideoOutEHDMI) |
|
243 { |
|
244 GLX_LOG_INFO("CGlxTvConnectionMonitor::UpdateConnectionStatusL HDMI is connected"); |
|
245 iHDMIConnectionState = ETrue; |
|
246 } |
|
247 } |
|
248 } |
|
249 else if (genId.DeviceTypeCaps( KDTAVDevice ) && |
|
250 genId.PhysicalConnectionCaps( KPCWired )) |
|
251 { |
|
252 TAccValueTypeTInt value; |
|
253 TInt err = iTvAccCon.GetValueL(genId, nameRecord, value); |
|
254 if (err ==KErrNone) |
|
255 { |
|
256 if (value.iValue == EAccVideoOutCVideo) |
|
257 { |
|
258 GLX_LOG_INFO("CGlxTvConnectionMonitor::UpdateConnectionStatusL Tv is connected"); |
|
259 iTvOutConnectionState = ETrue; |
|
260 } |
|
261 } |
|
262 } |
|
263 } |
|
264 CleanupStack::PopAndDestroy(nameArray); |
|
265 |
|
266 GLX_LOG_INFO2("CGlxTvConnectionMonitor::UpdateConnectionStatusL CurrentTvState = %d , CurrentHDMIState = %d", |
|
267 iTvOutConnectionState,iHDMIConnectionState); |
|
268 } |