mmi support
authorRonny Strutz <ronny.strutz@multimedia-labs.de>
Sat, 19 Nov 2005 14:58:51 +0000 (14:58 +0000)
committerRonny Strutz <ronny.strutz@multimedia-labs.de>
Sat, 19 Nov 2005 14:58:51 +0000 (14:58 +0000)
lib/dvb_ci/dvbci.cpp
lib/dvb_ci/dvbci.h
lib/dvb_ci/dvbci_mmi.cpp
lib/dvb_ci/dvbci_mmi.h
lib/dvb_ci/dvbci_ui.cpp
lib/dvb_ci/dvbci_ui.h

index 4e5b6e688b38a5a03a26c336e560c44c7c499455..cf7acde6130bafb186ed9be3efd0567ebb776196 100644 (file)
@@ -103,14 +103,24 @@ int eDVBCIInterfaces::stopMMI(int slotid)
        return slot->stopMMI();
 }
 
        return slot->stopMMI();
 }
 
-int eDVBCIInterfaces::answerMMI(int slotid, int answer, char *value)
+int eDVBCIInterfaces::answerText(int slotid, int answer)
 {
        eDVBCISlot *slot;
 
        if( (slot = getSlot(slotid)) == 0 )
                return -1;
        
 {
        eDVBCISlot *slot;
 
        if( (slot = getSlot(slotid)) == 0 )
                return -1;
        
-       return slot->answerMMI(answer, value);
+       return slot->answerText(answer);
+}
+
+int eDVBCIInterfaces::answerEnq(int slotid, int answer, char *value)
+{
+       eDVBCISlot *slot;
+
+       if( (slot = getSlot(slotid)) == 0 )
+               return -1;
+       
+       return slot->answerEnq(answer, value);
 }
 
 int eDVBCISlot::send(const unsigned char *data, size_t len)
 }
 
 int eDVBCISlot::send(const unsigned char *data, size_t len)
@@ -250,9 +260,19 @@ int eDVBCISlot::stopMMI()
        return 0;
 }
 
        return 0;
 }
 
-int eDVBCISlot::answerMMI(int answer, char *value)
+int eDVBCISlot::answerText(int answer)
+{
+       printf("edvbcislot: answerText(%d)\n", answer);
+
+       if(mmi_session)
+               mmi_session->answerText(answer);
+
+       return 0;
+}
+
+int eDVBCISlot::answerEnq(int answer, char *value)
 {
 {
-       printf("edvbcislot: answerMMI()\n");
+       printf("edvbcislot: answerMMI(%d,%s)\n", answer, value);
        return 0;
 }
 
        return 0;
 }
 
index e9de48763df6275aa2358febefe5bf47d467f549..bdfa5d96d49cc182d82a9bf438df3e77a15532fb 100644 (file)
@@ -34,7 +34,8 @@ public:
        int initialize();
        int startMMI();
        int stopMMI();
        int initialize();
        int startMMI();
        int stopMMI();
-       int answerMMI(int answer, char *value);
+       int answerText(int answer);
+       int answerEnq(int answer, char *value);
 };
 
 class eDVBCIInterfaces
 };
 
 class eDVBCIInterfaces
@@ -54,7 +55,8 @@ public:
        int initialize(int slot);
        int startMMI(int slot);
        int stopMMI(int slot);
        int initialize(int slot);
        int startMMI(int slot);
        int stopMMI(int slot);
-       int answerMMI(int slot, int answer, char *value);
+       int answerText(int slot, int answer);
+       int answerEnq(int slot, int answer, char *value);
 };
 
 #endif
 };
 
 #endif
index f9179d9bacc7be394c45b37779b8961b55d09c85..b652da89fafddd005a87beb70ae6916cfe09a08d 100644 (file)
@@ -1,6 +1,7 @@
 /* DVB CI MMI */
 
 #include <lib/dvb_ci/dvbci_mmi.h>
 /* DVB CI MMI */
 
 #include <lib/dvb_ci/dvbci_mmi.h>
+#include <lib/dvb_ci/dvbci_ui.h>
 
 /*
 PyObject *list = PyList_New(len);
 
 /*
 PyObject *list = PyList_New(len);
@@ -47,10 +48,18 @@ int eDVBCIMMISession::receivedAPDU(const unsigned char *tag, const void *data, i
                {
                        unsigned char *d=(unsigned char*)data;
                        unsigned char *max=((unsigned char*)d) + len;
                {
                        unsigned char *d=(unsigned char*)data;
                        unsigned char *max=((unsigned char*)d) + len;
+                       int pos = 0;
                        printf("Tmenu_last\n");
                        if (d > max)
                                break;
                        int n=*d++;
                        printf("Tmenu_last\n");
                        if (d > max)
                                break;
                        int n=*d++;
+                       
+                       //FIXME: slotid
+                       if(tag[2] == 0x09)
+                               eDVBCI_UI::getInstance()->mmiScreenBegin(0, 0);
+                       else
+                               eDVBCI_UI::getInstance()->mmiScreenBegin(0, 1);
+                       
                        if (n == 0xFF)
                                n=0;
                        else
                        if (n == 0xFF)
                                n=0;
                        else
@@ -67,10 +76,19 @@ int eDVBCIMMISession::receivedAPDU(const unsigned char *tag, const void *data, i
                                printf("%d bytes text\n", textlen);
                                if ((d+textlen) > max)
                                        break;
                                printf("%d bytes text\n", textlen);
                                if ((d+textlen) > max)
                                        break;
+                                       
+                               char str[textlen + 1];
+                               memcpy(str, ((char*)d), textlen);
+                               str[textlen] = '\0';
+                               
+                               eDVBCI_UI::getInstance()->mmiScreenAddText(0, pos++, str);
+                                       
                                while (textlen--)
                                        printf("%c", *d++);
                                printf("\n");
                        }
                                while (textlen--)
                                        printf("%c", *d++);
                                printf("\n");
                        }
+                       //FIXME: slotid
+                       eDVBCI_UI::getInstance()->mmiScreenFinish(0);
                        break;
                }
                default:
                        break;
                }
                default:
@@ -122,3 +140,13 @@ int eDVBCIMMISession::stopMMI()
        sendAPDU(tag, data, 1);
 }
 
        sendAPDU(tag, data, 1);
 }
 
+int eDVBCIMMISession::answerText(int answer)
+{
+       printf("eDVBCIMMISession::answerText(%d)\n",answer);
+
+       unsigned char tag[]={0x9f, 0x88, 0x0B};
+       unsigned char data[]={0x00};
+       data[0] = answer & 0xff;
+       sendAPDU(tag, data, 1);
+}
+
index 0cc3f32319dabee89c3766cfc3aaaaf716d5344e..6b5426704ae096662589d2534f18df5f080f7fce 100644 (file)
@@ -16,6 +16,8 @@ public:
        eDVBCIMMISession(eDVBCISlot *tslot);
        ~eDVBCIMMISession();
        int stopMMI();
        eDVBCIMMISession(eDVBCISlot *tslot);
        ~eDVBCIMMISession();
        int stopMMI();
+       int answerText(int answer);
+
 };
 
 #endif
 };
 
 #endif
index 72a9daae278730d6eab6cd0ebc48c8a93d89c6d5..11163df1f9304fa23347fd27e6aefcc2ed0a6704 100644 (file)
@@ -23,6 +23,7 @@ eDVBCI_UI::eDVBCI_UI()
 
        ASSERT(!instance);
        instance = this;
 
        ASSERT(!instance);
        instance = this;
+       mmiScreenReady = 0;
 }
 
 eDVBCI_UI::~eDVBCI_UI()
 }
 
 eDVBCI_UI::~eDVBCI_UI()
@@ -51,7 +52,7 @@ std::string eDVBCI_UI::getAppName(int slot)
 
 void eDVBCI_UI::setAppName(int slot, const char *name)
 {
 
 void eDVBCI_UI::setAppName(int slot, const char *name)
 {
-       printf("set name to -%c-\n", name);
+       //printf("set name to -%c-\n", name);
        appName = name;
 }
 
        appName = name;
 }
 
@@ -75,9 +76,84 @@ int eDVBCI_UI::initialize(int slot)
        eDVBCIInterfaces::getInstance()->initialize(slot);
 }
 
        eDVBCIInterfaces::getInstance()->initialize(slot);
 }
 
-int eDVBCI_UI::answerMMI(int slot, int answer, char *value=0)
+int eDVBCI_UI::answerMenu(int slot, int answer)
 {
 {
-       eDVBCIInterfaces::getInstance()->answerMMI(slot, answer, value);
+       eDVBCIInterfaces::getInstance()->answerText(slot, answer);
+}
+
+int eDVBCI_UI::answerEnq(int slot, int answer, char *value)
+{
+       eDVBCIInterfaces::getInstance()->answerEnq(slot, answer, value);
+}
+
+int eDVBCI_UI::availableMMI(int slot)
+{
+       return mmiScreenReady;
+}
+
+int eDVBCI_UI::mmiScreenBegin(int slot, int listmenu)
+{
+       printf("eDVBCI_UI::mmiScreenBegin\n");
+
+       mmiScreenReady = 0;
+       
+       mmiScreen = PyList_New(1);
+
+  PyObject *tuple = PyTuple_New(1);
+       if(listmenu)
+               PyTuple_SetItem(tuple, 0, PyString_FromString("LIST"));
+       else    
+               PyTuple_SetItem(tuple, 0, PyString_FromString("MENU"));
+  PyList_SetItem(mmiScreen, 0, tuple);
+       
+       mmiTuplePos = 1;
+       
+       return 0;
+}
+
+int eDVBCI_UI::mmiScreenAddText(int slot, int type, char *value)
+{
+       printf("eDVBCI_UI::mmiScreenAddText(%s)\n",value);
+
+  PyObject *tuple = PyTuple_New(3);
+       
+       if(type == 0)                                                   //title
+               PyTuple_SetItem(tuple, 0, PyString_FromString("TITLE"));
+       else if(type == 1)                              //subtitle
+               PyTuple_SetItem(tuple, 0, PyString_FromString("SUBTITLE"));
+       else if(type == 2)                              //bottom
+               PyTuple_SetItem(tuple, 0, PyString_FromString("BOTTOM"));
+       else
+               PyTuple_SetItem(tuple, 0, PyString_FromString("TEXT"));
+
+       printf("addText %s with id %d\n", value, type);
+
+       PyTuple_SetItem(tuple, 1, PyString_FromString(value));
+       
+       if(type > 2)
+         PyTuple_SetItem(tuple, 2, PyInt_FromLong(type-2));
+       else    
+         PyTuple_SetItem(tuple, 2, PyInt_FromLong(-1));
+       
+       PyList_Append(mmiScreen, tuple);
+       
+       return 0;
+}
+
+int eDVBCI_UI::mmiScreenFinish(int slot)
+{
+       printf("eDVBCI_UI::mmiScreenFinish\n");
+
+       mmiScreenReady = 1;
+
+       return 0;
+}
+
+PyObject *eDVBCI_UI::getMMIScreen(int slot)
+{
+       mmiScreenReady = 0;
+
+       return mmiScreen;
 }
 
 //FIXME: correct "run/startlevel"
 }
 
 //FIXME: correct "run/startlevel"
index 680b7897c070b138160c939e10706e55fcd1cf8e..7d45bfaad16aa988b248c11decf5bc94319978dd 100644 (file)
@@ -2,6 +2,7 @@
 #define __dvbci_ui_h
 
 #include <string>
 #define __dvbci_ui_h
 
 #include <string>
+#include <Python.h>
 
 #define MAX_SLOTS      2       
 
 
 #define MAX_SLOTS      2       
 
@@ -25,7 +26,19 @@ public:
        int initialize(int slot);
        int startMMI(int slot);
        int stopMMI(int slot);
        int initialize(int slot);
        int startMMI(int slot);
        int stopMMI(int slot);
-       int answerMMI(int slot, int answer, char *val);
+       int availableMMI(int slot);
+
+       int answerMenu(int slot, int answer);
+       int answerEnq(int slot, int answer, char *val);
+
+       PyObject *eDVBCI_UI::getMMIScreen(int slot);
+       PyObject *mmiScreen;
+       int mmiTuplePos;
+       int mmiScreenReady;
+       
+       int mmiScreenBegin(int slot, int listmenu);
+       int mmiScreenAddText(int slot, int type, char *value);
+       int mmiScreenFinish(int slot);
 };
 
 #endif
 };
 
 #endif