rcconsole: fix for escape codes split into multiple reads
[enigma2.git] / lib / driver / rcconsole.cpp
index f662b2b146bd27361e87efab08842463e6495586..97a6e7c7c22354fcc9c0ac308541b0954caf67bc 100644 (file)
@@ -5,7 +5,7 @@
 #include <stdio.h>
 #include <fcntl.h>
 
-eRCConsoleDriver::eRCConsoleDriver(const char *filename): eRCDriver(eRCInput::getInstance())
+eRCConsoleDriver::eRCConsoleDriver(const char *filename): eRCDriver(eRCInput::getInstance()), m_escape(false)
 {
        handle=open(filename, O_RDONLY|O_NONBLOCK);
        if (handle<0)
@@ -14,9 +14,8 @@ eRCConsoleDriver::eRCConsoleDriver(const char *filename): eRCDriver(eRCInput::ge
                sn=0;
        } else
        {
-               sn=new eSocketNotifier(eApp, handle, eSocketNotifier::Read);
+               sn=eSocketNotifier::create(eApp, handle, eSocketNotifier::Read);
                CONNECT(sn->activated, eRCConsoleDriver::keyPressed);
-               eRCInput::getInstance()->setFile(handle);
        }
        
                /* set console mode */
@@ -32,59 +31,51 @@ 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;
+       unsigned char data[16];
+       unsigned char *d = data;
        int num = read(handle, data, 16);
-       int code;
-#if 0  
+       unsigned char code;
+       
        int km = input->getKeyboardMode();
 
        if (km == eRCInput::kmNone)
                return;
-#endif
+
        while (num--)
        {
-#if 0
-               if (km == eRCInput::kmAll)
-#endif
-                       code = *d++;
-#if 0
-               else
+               code = *d++;
+//             eDebug("console code %02x\n", code);
+               if (km == eRCInput::kmAscii) {
+                       if (m_escape) {
+                               if (code != '[')
+                                       m_escape = false;
+                               continue;
+                       }
+
+                       if (code == 27) // escape code
+                               m_escape = true;
+
+                       if ((code < 32) ||      // control characters
+                           (code == 0x7e) ||   // mute, einfg, entf
+                           (code == 0x7f))     // backspace
+                               continue;
+               }
+
+               for (std::list<eRCDevice*>::iterator i(listeners.begin()); i!=listeners.end(); ++i)
                {
-                       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;
+//                     eDebug("ascii %02x", code);
+                       (*i)->handleCode(code);
                }
-#endif
-               if (code != -1)
-                       for (std::list<eRCDevice*>::iterator i(listeners.begin()); i!=listeners.end(); ++i)
-                               (*i)->handleCode(code);
        }
 }
 
-void eRCConsole::handleCode(int code)
+void eRCConsole::handleCode(long code)
 {
-       input->keyPressed(eRCKey(this, code, 0));
+       input->keyPressed(eRCKey(this, code, eRCKey::flagAscii));
 }
 
 eRCConsole::eRCConsole(eRCDriver *driver)
@@ -104,7 +95,7 @@ const char *eRCConsole::getKeyDescription(const eRCKey &key) const
 
 int eRCConsole::getKeyCompatibleCode(const eRCKey &key) const
 {
-       return key.code; // | KEY_ASCII;
+       return key.code;
 }
 
 class eRCConsoleInit