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 | |
21 | CSourceConnectDetect::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 | |
51 | CSourceConnectDetect::~CSourceConnectDetect() |
52 | { |
53 | } |
54 | |
55 | int CSourceConnectDetect::startDetect() |
56 | { |
57 | this->run(); |
58 | |
59 | return 0; |
60 | } |
61 | |
62 | int 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 | |
87 | tv_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 | |
109 | int 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 | |
169 | bool 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 |