aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRonny Strutz <ronny.strutz@multimedia-labs.de>2005-11-19 14:58:51 +0000
committerRonny Strutz <ronny.strutz@multimedia-labs.de>2005-11-19 14:58:51 +0000
commitbb9abed29ca9126cc2b8a0fa3d76ea2e7245cee7 (patch)
tree005bd350072da905196834aad93ade76356e55a3
parent9bbcaf7052e0b4d75de7483e1b01cb334dda9d84 (diff)
downloadenigma2-bb9abed29ca9126cc2b8a0fa3d76ea2e7245cee7.tar.gz
enigma2-bb9abed29ca9126cc2b8a0fa3d76ea2e7245cee7.zip
mmi support
-rw-r--r--lib/dvb_ci/dvbci.cpp28
-rw-r--r--lib/dvb_ci/dvbci.h6
-rw-r--r--lib/dvb_ci/dvbci_mmi.cpp28
-rw-r--r--lib/dvb_ci/dvbci_mmi.h2
-rw-r--r--lib/dvb_ci/dvbci_ui.cpp82
-rw-r--r--lib/dvb_ci/dvbci_ui.h15
6 files changed, 151 insertions, 10 deletions
diff --git a/lib/dvb_ci/dvbci.cpp b/lib/dvb_ci/dvbci.cpp
index 4e5b6e68..cf7acde6 100644
--- a/lib/dvb_ci/dvbci.cpp
+++ b/lib/dvb_ci/dvbci.cpp
@@ -103,14 +103,24 @@ int eDVBCIInterfaces::stopMMI(int slotid)
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;
- 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)
@@ -250,9 +260,19 @@ int eDVBCISlot::stopMMI()
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;
}
diff --git a/lib/dvb_ci/dvbci.h b/lib/dvb_ci/dvbci.h
index e9de4876..bdfa5d96 100644
--- a/lib/dvb_ci/dvbci.h
+++ b/lib/dvb_ci/dvbci.h
@@ -34,7 +34,8 @@ public:
int initialize();
int startMMI();
int stopMMI();
- int answerMMI(int answer, char *value);
+ int answerText(int answer);
+ int answerEnq(int answer, char *value);
};
class eDVBCIInterfaces
@@ -54,7 +55,8 @@ public:
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
diff --git a/lib/dvb_ci/dvbci_mmi.cpp b/lib/dvb_ci/dvbci_mmi.cpp
index f9179d9b..b652da89 100644
--- a/lib/dvb_ci/dvbci_mmi.cpp
+++ b/lib/dvb_ci/dvbci_mmi.cpp
@@ -1,6 +1,7 @@
/* DVB CI MMI */
#include <lib/dvb_ci/dvbci_mmi.h>
+#include <lib/dvb_ci/dvbci_ui.h>
/*
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;
+ int pos = 0;
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
@@ -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;
+
+ 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");
}
+ //FIXME: slotid
+ eDVBCI_UI::getInstance()->mmiScreenFinish(0);
break;
}
default:
@@ -122,3 +140,13 @@ int eDVBCIMMISession::stopMMI()
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);
+}
+
diff --git a/lib/dvb_ci/dvbci_mmi.h b/lib/dvb_ci/dvbci_mmi.h
index 0cc3f323..6b542670 100644
--- a/lib/dvb_ci/dvbci_mmi.h
+++ b/lib/dvb_ci/dvbci_mmi.h
@@ -16,6 +16,8 @@ public:
eDVBCIMMISession(eDVBCISlot *tslot);
~eDVBCIMMISession();
int stopMMI();
+ int answerText(int answer);
+
};
#endif
diff --git a/lib/dvb_ci/dvbci_ui.cpp b/lib/dvb_ci/dvbci_ui.cpp
index 72a9daae..11163df1 100644
--- a/lib/dvb_ci/dvbci_ui.cpp
+++ b/lib/dvb_ci/dvbci_ui.cpp
@@ -23,6 +23,7 @@ eDVBCI_UI::eDVBCI_UI()
ASSERT(!instance);
instance = this;
+ mmiScreenReady = 0;
}
eDVBCI_UI::~eDVBCI_UI()
@@ -51,7 +52,7 @@ std::string eDVBCI_UI::getAppName(int slot)
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;
}
@@ -75,9 +76,84 @@ int eDVBCI_UI::initialize(int 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"
diff --git a/lib/dvb_ci/dvbci_ui.h b/lib/dvb_ci/dvbci_ui.h
index 680b7897..7d45bfaa 100644
--- a/lib/dvb_ci/dvbci_ui.h
+++ b/lib/dvb_ci/dvbci_ui.h
@@ -2,6 +2,7 @@
#define __dvbci_ui_h
#include <string>
+#include <Python.h>
#define MAX_SLOTS 2
@@ -25,7 +26,19 @@ public:
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