summaryrefslogtreecommitdiff
path: root/tvapi/libtv/tvin/CSourceConnectDetect.cpp (plain)
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
21CSourceConnectDetect::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
47CSourceConnectDetect::~CSourceConnectDetect()
48{
49}
50
51int CSourceConnectDetect::startDetect()
52{
53 this->run();
54
55 return 0;
56}
57
58int 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
82tv_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
103int 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
154bool 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