blob: cbb2044a27ad163c40a06a64cf8e9eec78440414
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 | m_event.data.fd = mAvinDetectFile.getFd(); |
31 | m_event.events = EPOLLIN | EPOLLET; |
32 | mEpoll.add(mAvinDetectFile.getFd(), &m_event); |
33 | } |
34 | //HDMI |
35 | if (mHdmiDetectFile.openFile(HDMI_DETECT_PATH) > 0) { |
36 | m_event.data.fd = mHdmiDetectFile.getFd(); |
37 | m_event.events = EPOLLIN | EPOLLET; |
38 | mEpoll.add(mHdmiDetectFile.getFd(), &m_event); |
39 | } |
40 | //vfame size change |
41 | if (mVppPollFile.openFile(VPP_POLL_PATCH) > 0) { |
42 | m_event.data.fd = mVppPollFile.getFd(); |
43 | m_event.events = EPOLLIN | EPOLLET; |
44 | mEpoll.add(mVppPollFile.getFd(), &m_event); |
45 | } |
46 | } |
47 | |
48 | CSourceConnectDetect::~CSourceConnectDetect() |
49 | { |
50 | } |
51 | |
52 | int CSourceConnectDetect::startDetect() |
53 | { |
54 | this->run(); |
55 | |
56 | return 0; |
57 | } |
58 | |
59 | int CSourceConnectDetect::SourceInputMaptoChipHdmiPort(tv_source_input_t source_input) |
60 | { |
61 | tvin_port_t source_port = TVIN_PORT_NULL; |
62 | source_port = mpTvin->Tvin_GetSourcePortBySourceInput(source_input); |
63 | switch (source_port) { |
64 | case TVIN_PORT_HDMI0: |
65 | return HDMI_DETECT_STATUS_BIT_A; |
66 | break; |
67 | case TVIN_PORT_HDMI1: |
68 | return HDMI_DETECT_STATUS_BIT_B; |
69 | break; |
70 | case TVIN_PORT_HDMI2: |
71 | return HDMI_DETECT_STATUS_BIT_C; |
72 | break; |
73 | case TVIN_PORT_HDMI3: |
74 | return HDMI_DETECT_STATUS_BIT_D; |
75 | break; |
76 | default: |
77 | return HDMI_DETECT_STATUS_BIT_A; |
78 | break; |
79 | } |
80 | |
81 | } |
82 | |
83 | tv_source_input_t CSourceConnectDetect::ChipHdmiPortMaptoSourceInput(int port) |
84 | { |
85 | switch (port) { |
86 | case HDMI_DETECT_STATUS_BIT_A: |
87 | return mpTvin->Tvin_PortToSourceInput(TVIN_PORT_HDMI0); |
88 | break; |
89 | case HDMI_DETECT_STATUS_BIT_B: |
90 | return mpTvin->Tvin_PortToSourceInput(TVIN_PORT_HDMI1); |
91 | break; |
92 | case HDMI_DETECT_STATUS_BIT_C: |
93 | return mpTvin->Tvin_PortToSourceInput(TVIN_PORT_HDMI2); |
94 | break; |
95 | case HDMI_DETECT_STATUS_BIT_D: |
96 | return mpTvin->Tvin_PortToSourceInput(TVIN_PORT_HDMI3); |
97 | break; |
98 | default: |
99 | return mpTvin->Tvin_PortToSourceInput(TVIN_PORT_HDMI0); |
100 | break; |
101 | } |
102 | } |
103 | |
104 | int CSourceConnectDetect::GetSourceConnectStatus(tv_source_input_t source_input) |
105 | { |
106 | int PlugStatus = -1; |
107 | int hdmi_status = 0; |
108 | int source = -1; |
109 | int HdmiDetectStatusBit = SourceInputMaptoChipHdmiPort((tv_source_input_t)source_input); |
110 | switch (source_input) { |
111 | case SOURCE_AV2: |
112 | case SOURCE_AV1: { |
113 | struct report_data_s status[2]; |
114 | mAvinDetectFile.readFile((void *)(&status), sizeof(struct report_data_s) * 2); |
115 | for (int i = 0; i < 2; i++) { |
116 | if (status[i].channel == AVIN_CHANNEL1) { |
117 | source = SOURCE_AV1; |
118 | } else if (status[i].channel == AVIN_CHANNEL2) { |
119 | source = SOURCE_AV2; |
120 | } |
121 | |
122 | if (source == source_input) { |
123 | if (status[i].status == AVIN_STATUS_IN) { |
124 | PlugStatus = CC_SOURCE_PLUG_IN; |
125 | } else { |
126 | PlugStatus = CC_SOURCE_PLUG_OUT; |
127 | } |
128 | break; |
129 | } |
130 | m_avin_status[i] = status[i]; |
131 | }//end for |
132 | |
133 | break; |
134 | } |
135 | case SOURCE_HDMI1: |
136 | case SOURCE_HDMI2: |
137 | case SOURCE_HDMI3: { |
138 | mHdmiDetectFile.readFile((void *)(&hdmi_status), sizeof(int)); |
139 | if ((hdmi_status & HdmiDetectStatusBit) == HdmiDetectStatusBit) { |
140 | PlugStatus = CC_SOURCE_PLUG_IN; |
141 | } else { |
142 | PlugStatus = CC_SOURCE_PLUG_OUT; |
143 | } |
144 | m_hdmi_status = hdmi_status; |
145 | break; |
146 | } |
147 | default: |
148 | LOGD("GetSourceConnectStatus not support source!!!!!!!!!!!!!!!1"); |
149 | break; |
150 | } |
151 | |
152 | return PlugStatus; |
153 | } |
154 | |
155 | bool CSourceConnectDetect::threadLoop() |
156 | { |
157 | if ( mpObserver == NULL ) { |
158 | return false; |
159 | } |
160 | |
161 | LOGD("%s, entering...\n", "TV"); |
162 | |
163 | prctl(PR_SET_NAME, (unsigned long)"CSourceConnectDetect thread loop"); |
164 | //init status |
165 | mHdmiDetectFile.readFile((void *)(&m_hdmi_status), sizeof(int)); |
166 | mAvinDetectFile.readFile((void *)(&m_avin_status), sizeof(struct report_data_s) * 2); |
167 | 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); |
168 | |
169 | while (!exitPending()) { //requietexit() or requietexitWait() not call |
170 | int num = mEpoll.wait(); |
171 | for (int i = 0; i < num; ++i) { |
172 | int fd = (mEpoll)[i].data.fd; |
173 | /** |
174 | * EPOLLIN event |
175 | */ |
176 | if ((mEpoll)[i].events & EPOLLIN) { |
177 | if (fd == mAvinDetectFile.getFd()) {//avin |
178 | struct report_data_s status[2]; |
179 | mAvinDetectFile.readFile((void *)(&status), sizeof(struct report_data_s) * 2); |
180 | for (int i = 0; i < 2; i++) { |
181 | int source = -1, plug = -1; |
182 | if (/*status[i].channel == m_avin_status[i].channel &&*/ status[i].status != m_avin_status[i].status) { |
183 | //LOGD("status[i].status != m_avin_status[i].status"); |
184 | if (status[i].status == AVIN_STATUS_IN) { |
185 | plug = CC_SOURCE_PLUG_IN; |
186 | } else { |
187 | plug = CC_SOURCE_PLUG_OUT; |
188 | } |
189 | |
190 | if (status[i].channel == AVIN_CHANNEL1) { |
191 | source = SOURCE_AV1; |
192 | } else if (status[i].channel == AVIN_CHANNEL2) { |
193 | source = SOURCE_AV2; |
194 | } |
195 | |
196 | if (mpObserver != NULL) { |
197 | mpObserver->onSourceConnect(source, plug); |
198 | } |
199 | }//not equal |
200 | m_avin_status[i] = status[i]; |
201 | } |
202 | } else if (fd == mHdmiDetectFile.getFd()) { //hdmi |
203 | int hdmi_status = 0; |
204 | mHdmiDetectFile.readFile((void *)(&hdmi_status), sizeof(int)); |
205 | int source = -1, plug = -1; |
206 | if ((hdmi_status & HDMI_DETECT_STATUS_BIT_A) != (m_hdmi_status & HDMI_DETECT_STATUS_BIT_A) ) { |
207 | if ((hdmi_status & HDMI_DETECT_STATUS_BIT_A) == HDMI_DETECT_STATUS_BIT_A) { |
208 | source = ChipHdmiPortMaptoSourceInput(HDMI_DETECT_STATUS_BIT_A); |
209 | plug = CC_SOURCE_PLUG_IN; |
210 | } else { |
211 | source = ChipHdmiPortMaptoSourceInput(HDMI_DETECT_STATUS_BIT_A);; |
212 | plug = CC_SOURCE_PLUG_OUT; |
213 | } |
214 | mpObserver->onSourceConnect(source, plug); |
215 | } |
216 | |
217 | if ((hdmi_status & HDMI_DETECT_STATUS_BIT_B) != (m_hdmi_status & HDMI_DETECT_STATUS_BIT_B) ) { |
218 | if ((hdmi_status & HDMI_DETECT_STATUS_BIT_B) == HDMI_DETECT_STATUS_BIT_B) { |
219 | source = ChipHdmiPortMaptoSourceInput(HDMI_DETECT_STATUS_BIT_B); |
220 | plug = CC_SOURCE_PLUG_IN; |
221 | } else { |
222 | source = ChipHdmiPortMaptoSourceInput(HDMI_DETECT_STATUS_BIT_B);; |
223 | plug = CC_SOURCE_PLUG_OUT; |
224 | } |
225 | mpObserver->onSourceConnect(source, plug); |
226 | } |
227 | |
228 | if ((hdmi_status & HDMI_DETECT_STATUS_BIT_C) != (m_hdmi_status & HDMI_DETECT_STATUS_BIT_C) ) { |
229 | if ((hdmi_status & HDMI_DETECT_STATUS_BIT_C) == HDMI_DETECT_STATUS_BIT_C) { |
230 | source = ChipHdmiPortMaptoSourceInput(HDMI_DETECT_STATUS_BIT_C); |
231 | plug = CC_SOURCE_PLUG_IN; |
232 | } else { |
233 | source = ChipHdmiPortMaptoSourceInput(HDMI_DETECT_STATUS_BIT_C);; |
234 | plug = CC_SOURCE_PLUG_OUT; |
235 | } |
236 | mpObserver->onSourceConnect(source, plug); |
237 | } |
238 | |
239 | if ((hdmi_status & HDMI_DETECT_STATUS_BIT_D) != (m_hdmi_status & HDMI_DETECT_STATUS_BIT_D) ) { |
240 | if ((hdmi_status & HDMI_DETECT_STATUS_BIT_D) == HDMI_DETECT_STATUS_BIT_D) { |
241 | source = ChipHdmiPortMaptoSourceInput(HDMI_DETECT_STATUS_BIT_D); |
242 | plug = CC_SOURCE_PLUG_IN; |
243 | } else { |
244 | source = ChipHdmiPortMaptoSourceInput(HDMI_DETECT_STATUS_BIT_D);; |
245 | plug = CC_SOURCE_PLUG_OUT; |
246 | } |
247 | mpObserver->onSourceConnect(source, plug); |
248 | } |
249 | m_hdmi_status = hdmi_status; |
250 | } else if (fd == mVppPollFile.getFd()) { //vframe size change |
251 | mpObserver->onVframeSizeChange(); |
252 | } |
253 | /** |
254 | * EPOLLOUT event |
255 | */ |
256 | if ((mEpoll)[i].events & EPOLLOUT) { |
257 | |
258 | } |
259 | } |
260 | } |
261 | }//exit |
262 | |
263 | LOGD("%s, exiting...\n", "CSourceConnectDetect"); |
264 | //return true, run again, return false,not run. |
265 | return false; |
266 | } |
267 |