add some stuff
[enigma2.git] / lib / dvb_ci / dvbci_mmi.cpp
1 /* DVB CI MMI */
2
3 #include <lib/dvb_ci/dvbci_mmi.h>
4
5 eDVBCIMMISession::eDVBCIMMISession(eDVBCISlot *tslot)
6 {
7         slot = tslot;
8         slot->mmi_session = this;
9 }
10
11 eDVBCIMMISession::~eDVBCIMMISession()
12 {
13         slot->mmi_session = 0;
14 }
15
16 int eDVBCIMMISession::receivedAPDU(const unsigned char *tag, const void *data, int len)
17 {
18         printf("SESSION(%d)/MMI %02x %02x %02x: ", session_nb, tag[0], tag[1],tag[2]);
19         for (int i=0; i<len; i++)
20                 printf("%02x ", ((const unsigned char*)data)[i]);
21         printf("\n");
22
23         if ((tag[0]==0x9f) && (tag[1]==0x88))
24         {
25                 switch (tag[2])
26                 {
27                         case 0x01:
28                         printf("MMI display control\n");
29                         if (((unsigned char*)data)[0] != 1)
30                                 printf("kann ich nicht. aber das sag ich dem modul nicht.\n");
31                         state=stateDisplayReply;
32                         return 1;
33                 case 0x09:
34                 case 0x0c:
35                 {
36                         unsigned char *d=(unsigned char*)data;
37                         unsigned char *max=((unsigned char*)d) + len;
38                         printf("Tmenu_last\n");
39                         if (d > max)
40                                 break;
41                         int n=*d++;
42                         if (n == 0xFF)
43                                 n=0;
44                         else
45                                 n++;
46                         printf("%d texts\n", n);
47                         for (int i=0; i < (n+3); ++i)
48                         {
49                                 int textlen;
50                                 if ((d+3) > max)
51                                         break;
52                                 printf("text tag: %02x %02x %02x\n", d[0], d[1], d[2]);
53                                 d+=3;
54                                 d+=parseLengthField(d, textlen);
55                                 printf("%d bytes text\n", textlen);
56                                 if ((d+textlen) > max)
57                                         break;
58                                 while (textlen--)
59                                         printf("%c", *d++);
60                                 printf("\n");
61                         }
62                         break;
63                 }
64                 default:
65                         printf("unknown APDU tag 9F 88 %02x\n", tag[2]);
66                         break;
67                 }
68         }
69         return 0;
70 }
71
72 int eDVBCIMMISession::doAction()
73 {
74         switch (state)
75         {
76         case stateStarted:
77                 state=stateIdle;
78                 break;
79         case stateDisplayReply:
80         {
81                 unsigned char tag[]={0x9f, 0x88, 0x02};
82                 unsigned char data[]={0x01, 0x01};
83                 sendAPDU(tag, data, 2);
84                 state=stateFakeOK;
85                 return 1;
86                 break;
87         }
88         case stateFakeOK:
89         {
90                 unsigned char tag[]={0x9f, 0x88, 0x0b};
91                 unsigned char data[]={5};
92                 sendAPDU(tag, data, 1);
93                 state=stateIdle;
94                 break;
95         }
96         case stateIdle:
97                 break;
98         default:
99                 break;
100         }
101         return 0;
102 }
103
104 int eDVBCIMMISession::stopMMI()
105 {
106         printf("eDVBCIMMISession::stopMMI()\n");
107
108         unsigned char tag[]={0x9f, 0x88, 0x00};
109         unsigned char data[]={0x00};
110         sendAPDU(tag, data, 1);
111 }
112