fix virtual keyboard bug.
[vuplus_dvbapp] / lib / driver / hdmi_cec.cpp
1 #include <unistd.h>
2 #include <fcntl.h>
3 #include <sys/ioctl.h>
4 #include <string.h>
5
6 #include <lib/base/init.h>
7 #include <lib/base/init_num.h>
8 #include <lib/base/eerror.h>
9 #include <lib/base/ebase.h>
10 #include <lib/driver/hdmi_cec.h>
11
12 eHdmiCEC *eHdmiCEC::instance = NULL;
13
14 eHdmiCEC::eHdmiCEC()
15 {
16         ASSERT(!instance);
17         instance = this;
18         hdmiFd = ::open("/dev/hdmi_cec", O_RDWR | O_NONBLOCK);
19         if (hdmiFd >= 0)
20         {
21                 messageNotifier = eSocketNotifier::create(eApp, hdmiFd, eSocketNotifier::Read);
22                 CONNECT(messageNotifier->activated, eHdmiCEC::hdmiEvent);
23         }
24 }
25
26 eHdmiCEC::~eHdmiCEC()
27 {
28         if (hdmiFd >= 0) ::close(hdmiFd);
29 }
30
31 eHdmiCEC *eHdmiCEC::getInstance()
32 {
33         return instance;
34 }
35
36 void eHdmiCEC::hdmiEvent(int what)
37 {
38         struct cec_message message;
39         if (::read(hdmiFd, &message, 2) == 2)
40         {
41                 if (::read(hdmiFd, &message.data, message.length) == message.length)
42                 {
43                         messageReceived(message.address, message.data[0]);
44                         //eDebug("[HDMI-CEC] ******************* received from %02x command: %02x %02x %02x %02x", message.address, message.data[0], message.data[1], message.data[2], message.data[3]);
45                         switch(message.data[0])
46                         {
47                                 case 0x44: 
48                                         messageReceivedKey(message.address, message.data[1]);
49                                         break;
50                                 /*case 0x45: 
51                                         messageReceivedKey(message.address, message.data[1]);
52                                         break;
53                                 for future functions =)
54                                 case 0x99: 
55                                         messageReceivedKey(message.address, message.data[1]);
56                                         SecondmessageReceivedKey(message.address, message.data[2]);    
57                                         break;
58                                 */
59                         }
60                 }
61         }
62 }
63
64 void eHdmiCEC::sendMessage(unsigned char address, unsigned char length, char *data)
65 {
66         if (hdmiFd >= 0)
67         {
68                 struct cec_message message;
69                 message.address = address;
70                 if (length > sizeof(message.data)) length = sizeof(message.data);
71                 message.length = length;
72                 memcpy(message.data, data, length);
73                 ::write(hdmiFd, &message, 2 + length);
74         }
75 }
76
77 eAutoInitP0<eHdmiCEC> init_hdmicec(eAutoInitNumbers::rc, "Hdmi CEC driver");