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