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