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