#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)
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 */
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 | 0x8000);
}
}
-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)
int eRCConsole::getKeyCompatibleCode(const eRCKey &key) const
{
- return key.code; // | KEY_ASCII;
+ return key.code;
}
class eRCConsoleInit
eRCConsoleDriver driver;
eRCConsole device;
public:
- eRCConsoleInit(): driver("/dev/stdin"), device(&driver)
+ eRCConsoleInit(): driver("/dev/tty0"), device(&driver)
{
}
};