summaryrefslogtreecommitdiff
path: root/tvapi/libtv/tvin/CSourceConnectDetect.cpp (plain)
blob: 4399473e22323286cf29dfb121cca23a0f8759d4
1#include "CTvin.h"
2#include <CTvLog.h>
3#include <stdio.h>
4#include <stdlib.h>
5#include <unistd.h>
6#include <sys/prctl.h>
7#include <fcntl.h>
8#include <errno.h>
9
10#include <cutils/log.h>
11
12#include "../tvutils/tvutils.h"
13#include "../tvconfig/tvconfig.h"
14
15#include "CSourceConnectDetect.h"
16#ifdef LOG_TAG
17#undef LOG_TAG
18#define LOG_TAG "CSourceConnectDetect"
19#endif
20
21CSourceConnectDetect::CSourceConnectDetect(CTvin *pTvin)
22{
23 mpObserver = NULL;
24 mpTvin = pTvin;
25 if (mEpoll.create() < 0) {
26 return;
27 }
28 //avin
29 if (mAvinDetectFile.openFile(AVIN_DETECT_PATH) > 0)
30 {
31 m_event.data.fd = mAvinDetectFile.getFd();
32 m_event.events = EPOLLIN | EPOLLET;
33 mEpoll.add(mAvinDetectFile.getFd(), &m_event);
34 }
35 //HDMI
36 if (mHdmiDetectFile.openFile(HDMI_DETECT_PATH) > 0)
37 {
38 m_event.data.fd = mHdmiDetectFile.getFd();
39 m_event.events = EPOLLIN | EPOLLET;
40 mEpoll.add(mHdmiDetectFile.getFd(), &m_event);
41 }
42 //vfame size change
43 if (mVppPollFile.openFile(VPP_POLL_PATCH) > 0)
44 {
45 m_event.data.fd = mVppPollFile.getFd();
46 m_event.events = EPOLLIN | EPOLLET;
47 mEpoll.add(mVppPollFile.getFd(), &m_event);
48 }
49}
50
51CSourceConnectDetect::~CSourceConnectDetect()
52{
53}
54
55int CSourceConnectDetect::startDetect()
56{
57 this->run();
58
59 return 0;
60}
61
62int CSourceConnectDetect::SourceInputMaptoChipHdmiPort(tv_source_input_t source_input)
63{
64 tvin_port_t source_port = TVIN_PORT_NULL;
65 source_port = mpTvin->Tvin_GetSourcePortBySourceInput(source_input);
66 switch (source_port)
67 {
68 case TVIN_PORT_HDMI0:
69 return HDMI_DETECT_STATUS_BIT_A;
70 break;
71 case TVIN_PORT_HDMI1:
72 return HDMI_DETECT_STATUS_BIT_B;
73 break;
74 case TVIN_PORT_HDMI2:
75 return HDMI_DETECT_STATUS_BIT_C;
76 break;
77 case TVIN_PORT_HDMI3:
78 return HDMI_DETECT_STATUS_BIT_D;
79 break;
80 default:
81 return HDMI_DETECT_STATUS_BIT_A;
82 break;
83 }
84
85}
86
87tv_source_input_t CSourceConnectDetect::ChipHdmiPortMaptoSourceInput(int port)
88{
89 switch (port)
90 {
91 case HDMI_DETECT_STATUS_BIT_A:
92 return mpTvin->Tvin_PortToSourceInput(TVIN_PORT_HDMI0);
93 break;
94 case HDMI_DETECT_STATUS_BIT_B:
95 return mpTvin->Tvin_PortToSourceInput(TVIN_PORT_HDMI1);
96 break;
97 case HDMI_DETECT_STATUS_BIT_C:
98 return mpTvin->Tvin_PortToSourceInput(TVIN_PORT_HDMI2);
99 break;
100 case HDMI_DETECT_STATUS_BIT_D:
101 return mpTvin->Tvin_PortToSourceInput(TVIN_PORT_HDMI3);
102 break;
103 default:
104 return mpTvin->Tvin_PortToSourceInput(TVIN_PORT_HDMI0);
105 break;
106 }
107}
108
109int CSourceConnectDetect::GetSourceConnectStatus(tv_source_input_t source_input)
110{
111 int PlugStatus = -1;
112 int hdmi_status = 0;
113 int source = -1;
114 int HdmiDetectStatusBit = SourceInputMaptoChipHdmiPort((tv_source_input_t)source_input);
115 switch (source_input)
116 {
117 case SOURCE_AV2:
118 case SOURCE_AV1:
119 {
120 struct report_data_s status[2];
121 mAvinDetectFile.readFile((void *)(&status), sizeof(struct report_data_s) * 2);
122 for (int i = 0; i < 2; i++)
123 {
124 if (status[i].channel == AVIN_CHANNEL1)
125 {
126 source = SOURCE_AV1;
127 }else if (status[i].channel == AVIN_CHANNEL2)
128 {
129 source = SOURCE_AV2;
130 }
131
132 if (source == source_input)
133 {
134 if (status[i].status == AVIN_STATUS_IN)
135 {
136 PlugStatus = CC_SOURCE_PLUG_IN;
137 }else {
138 PlugStatus = CC_SOURCE_PLUG_OUT;
139 }
140 break;
141 }
142 m_avin_status[i] = status[i];
143 }//end for
144
145 break;
146 }
147 case SOURCE_HDMI1:
148 case SOURCE_HDMI2:
149 case SOURCE_HDMI3:
150 {
151 mHdmiDetectFile.readFile((void*)(&hdmi_status), sizeof(int));
152 if ((hdmi_status & HdmiDetectStatusBit) == HdmiDetectStatusBit)
153 {
154 PlugStatus = CC_SOURCE_PLUG_IN;
155 } else {
156 PlugStatus = CC_SOURCE_PLUG_OUT;
157 }
158 m_hdmi_status = hdmi_status;
159 break;
160 }
161 default:
162 LOGD("GetSourceConnectStatus not support source!!!!!!!!!!!!!!!1");
163 break;
164 }
165
166 return PlugStatus;
167}
168
169bool CSourceConnectDetect::threadLoop()
170{
171 if ( mpObserver == NULL ) {
172 return false;
173 }
174
175 LOGD("%s, entering...\n", "TV");
176
177 prctl(PR_SET_NAME, (unsigned long)"CSourceConnectDetect thread loop");
178 //init status
179 mHdmiDetectFile.readFile((void*)(&m_hdmi_status), sizeof(int));
180 mAvinDetectFile.readFile((void *)(&m_avin_status), sizeof(struct report_data_s) * 2);
181 LOGD("CSourceConnectDetect Loop, get init hdmi = 0x%x avin[0].status = %d, avin[1].status = %d", m_hdmi_status, m_avin_status[0].status, m_avin_status[1].status);
182
183 while (!exitPending()) { //requietexit() or requietexitWait() not call
184 int num = mEpoll.wait();
185 for (int i = 0; i < num; ++i) {
186 int fd = (mEpoll)[i].data.fd;
187 /**
188 * EPOLLIN event
189 */
190 if ((mEpoll)[i].events & EPOLLIN) {
191 if (fd == mAvinDetectFile.getFd()) {//avin
192 struct report_data_s status[2];
193 mAvinDetectFile.readFile((void *)(&status), sizeof(struct report_data_s) * 2);
194 for (int i = 0; i < 2; i++)
195 {
196 int source = -1, plug = -1;
197 if (/*status[i].channel == m_avin_status[i].channel &&*/ status[i].status != m_avin_status[i].status)
198 {
199 //LOGD("status[i].status != m_avin_status[i].status");
200 if (status[i].status == AVIN_STATUS_IN)
201 {
202 plug = CC_SOURCE_PLUG_IN;
203 }else {
204 plug = CC_SOURCE_PLUG_OUT;
205 }
206
207 if (status[i].channel == AVIN_CHANNEL1)
208 {
209 source = SOURCE_AV1;
210 }else if (status[i].channel == AVIN_CHANNEL2)
211 {
212 source = SOURCE_AV2;
213 }
214
215 if (mpObserver != NULL)
216 {
217 mpObserver->onSourceConnect(source, plug);
218 }
219 }//not equal
220 m_avin_status[i] = status[i];
221 }
222 }else if (fd == mHdmiDetectFile.getFd())//hdmi
223 {
224 int hdmi_status = 0;
225 mHdmiDetectFile.readFile((void*)(&hdmi_status), sizeof(int));
226 int source = -1, plug = -1;
227 if ((hdmi_status & HDMI_DETECT_STATUS_BIT_A) != (m_hdmi_status & HDMI_DETECT_STATUS_BIT_A) )
228 {
229 if ((hdmi_status & HDMI_DETECT_STATUS_BIT_A) == HDMI_DETECT_STATUS_BIT_A)
230 {
231 source = ChipHdmiPortMaptoSourceInput(HDMI_DETECT_STATUS_BIT_A);
232 plug = CC_SOURCE_PLUG_IN;
233 } else {
234 source = ChipHdmiPortMaptoSourceInput(HDMI_DETECT_STATUS_BIT_A);;
235 plug = CC_SOURCE_PLUG_OUT;
236 }
237 mpObserver->onSourceConnect(source, plug);
238 }
239
240 if ((hdmi_status & HDMI_DETECT_STATUS_BIT_B) != (m_hdmi_status & HDMI_DETECT_STATUS_BIT_B) )
241 {
242 if ((hdmi_status & HDMI_DETECT_STATUS_BIT_B) == HDMI_DETECT_STATUS_BIT_B)
243 {
244 source = ChipHdmiPortMaptoSourceInput(HDMI_DETECT_STATUS_BIT_B);
245 plug = CC_SOURCE_PLUG_IN;
246 } else {
247 source = ChipHdmiPortMaptoSourceInput(HDMI_DETECT_STATUS_BIT_B);;
248 plug = CC_SOURCE_PLUG_OUT;
249 }
250 mpObserver->onSourceConnect(source, plug);
251 }
252
253 if ((hdmi_status & HDMI_DETECT_STATUS_BIT_C) != (m_hdmi_status & HDMI_DETECT_STATUS_BIT_C) )
254 {
255 if ((hdmi_status & HDMI_DETECT_STATUS_BIT_C) == HDMI_DETECT_STATUS_BIT_C)
256 {
257 source = ChipHdmiPortMaptoSourceInput(HDMI_DETECT_STATUS_BIT_C);
258 plug = CC_SOURCE_PLUG_IN;
259 } else {
260 source = ChipHdmiPortMaptoSourceInput(HDMI_DETECT_STATUS_BIT_C);;
261 plug = CC_SOURCE_PLUG_OUT;
262 }
263 mpObserver->onSourceConnect(source, plug);
264 }
265
266 if ((hdmi_status & HDMI_DETECT_STATUS_BIT_D) != (m_hdmi_status & HDMI_DETECT_STATUS_BIT_D) )
267 {
268 if ((hdmi_status & HDMI_DETECT_STATUS_BIT_D) == HDMI_DETECT_STATUS_BIT_D)
269 {
270 source = ChipHdmiPortMaptoSourceInput(HDMI_DETECT_STATUS_BIT_D);
271 plug = CC_SOURCE_PLUG_IN;
272 } else {
273 source = ChipHdmiPortMaptoSourceInput(HDMI_DETECT_STATUS_BIT_D);;
274 plug = CC_SOURCE_PLUG_OUT;
275 }
276 mpObserver->onSourceConnect(source, plug);
277 }
278 m_hdmi_status = hdmi_status;
279 }else if (fd == mVppPollFile.getFd())//vframe size change
280 {
281 mpObserver->onVframeSizeChange();
282 }
283 /**
284 * EPOLLOUT event
285 */
286 if ((mEpoll)[i].events & EPOLLOUT) {
287
288 }
289 }
290 }
291 }//exit
292
293 LOGD("%s, exiting...\n", "CSourceConnectDetect");
294 //return true, run again, return false,not run.
295 return false;
296}
297