- add rcconsole key input (for now)
[enigma2.git] / lib / driver / rcconsole.cpp
diff --git a/lib/driver/rcconsole.cpp b/lib/driver/rcconsole.cpp
new file mode 100644 (file)
index 0000000..ec75916
--- /dev/null
@@ -0,0 +1,120 @@
+#include <lib/base/init.h>
+#include <lib/base/init_num.h>
+#include <lib/base/eerror.h>
+#include <lib/driver/rcconsole.h>
+#include <stdio.h>
+#include <fcntl.h>
+
+eRCConsoleDriver::eRCConsoleDriver(const char *filename): eRCDriver(eRCInput::getInstance())
+{
+       handle=open(filename, O_RDONLY|O_NONBLOCK);
+       if (handle<0)
+       {
+               eDebug("failed to open %s", filename);
+               sn=0;
+       } else
+       {
+               sn=new eSocketNotifier(eApp, handle, eSocketNotifier::Read);
+               CONNECT(sn->activated, eRCConsoleDriver::keyPressed);
+               eRCInput::getInstance()->setFile(handle);
+       }
+       
+               /* set console mode */
+       struct termios t,ot;
+       tcgetattr(handle, &t);
+       t.c_lflag &= ~(ECHO | ICANON | ECHOK | ECHOE | ECHONL);
+       ot = t;
+       tcsetattr(handle, TCSANOW,&t);
+}
+
+eRCConsoleDriver::~eRCConsoleDriver()
+{
+       tcsetattr(handle,TCSANOW, &ot);
+       if (handle>=0)
+               close(handle);
+       if (sn)
+               delete sn;
+}
+
+void eRCConsoleDriver::keyPressed(int)
+{
+       char data[16];
+       char *d = data;
+       int num = read(handle, data, 16);
+       int code;
+#if 0  
+       int km = input->getKeyboardMode();
+
+       if (km == eRCInput::kmNone)
+               return;
+#endif
+       while (num--)
+       {
+#if 0
+               if (km == eRCInput::kmAll)
+#endif
+                       code = *d++;
+#if 0
+               else
+               {
+                       if (*d == 27) // escape code
+                       {
+                               while (num)
+                               {
+                                       num--;
+                                       if (*++d != '[')
+                                               break;
+                               }
+                               code = -1;
+                       } else
+                               code = *d;
+                       ++d;
+                       
+                       if (code < 32)                  /* control characters */
+                               code = -1;
+                       if (code == 0x7F)               /* delete */
+                               code = -1;
+               }
+#endif
+               if (code != -1)
+                       for (std::list<eRCDevice*>::iterator i(listeners.begin()); i!=listeners.end(); ++i)
+                               (*i)->handleCode(code);
+       }
+}
+
+void eRCConsole::handleCode(int code)
+{
+       input->keyPressed(eRCKey(this, code, 0));
+}
+
+eRCConsole::eRCConsole(eRCDriver *driver)
+                       : eRCDevice("Console", driver)
+{
+}
+
+const char *eRCConsole::getDescription() const
+{
+       return "Console";
+}
+
+const char *eRCConsole::getKeyDescription(const eRCKey &key) const
+{
+       return 0;
+}
+
+int eRCConsole::getKeyCompatibleCode(const eRCKey &key) const
+{
+       return key.code; // | KEY_ASCII;
+}
+
+class eRCConsoleInit
+{
+       eRCConsoleDriver driver;
+       eRCConsole device;
+public:
+       eRCConsoleInit(): driver("/dev/vc/0"), device(&driver)
+       {
+       }
+};
+
+eAutoInitP0<eRCConsoleInit> init_rcconsole(eAutoInitNumbers::rc+1, "Console RC Driver");