/*********************************/
/*QWSVr41xxButtonsHandler类的构造函数*/
/*********************************/
QWSVr41xxButtonsHandler::QWSVr41xxButtonsHandler() : QWSKeyboardHandler()
terminalName = "/dev/buttons";
buttonFD = -1;
notifier = 0;
if ((buttonFD = open(terminalName, O_RDWR | O_NDELAY, 0)) < 0)
{
qWarning("Cannot open %s\n", terminalName.latin1());
}
if ( buttonFD >= 0 ) {
notifier = new QSocketNotifier( buttonFD, QSocketNotifier::Read, this );
connect( notifier, SIGNAL(activated(int)),this,
SLOT(readKeyboardData()) );
}
kbdBufferLen = 80;
kbdBuffer = new unsigned char [kbdBufferLen];
kbdIdx = 0;
}
/********************************************/
/*QWSVr41xxButtonsHandler类的readKeyboardData函数*/
/********************************************/
void QWSVr41xxButtonsHandler::readKeyboardData()
{
int n = 0;
do {
n = read(buttonFD, kbdBuffer+kbdIdx, kbdBufferLen - kbdIdx );
if ( n > 0 )
kbdIdx += n;
} while ( n > 0 );
int idx = 0;
while ( kbdIdx - idx >= 2 ) {
unsigned char *next = kbdBuffer + idx;
unsigned short *code = (unsigned short *)next;
int keycode = Qt::Key_unknown;
switch ( (*code) & 0x0fff ) {
case 0x7:
keycode = Qt::Key_Up;
break;
case 0x9:
keycode = Qt::Key_Right;
break;
case 0x8:
keycode = Qt::Key_Down;
break;
case 0xa:
keycode = Qt::Key_Left;
break;
case 0x3:
keycode = Qt::Key_Up;
break;
case 0x4:
keycode = Qt::Key_Down;
break;
case 0x1:
keycode = Qt::Key_Return;
break;
case 0x2:
keycode = Qt::Key_F4;
break;
default:
qDebug("Unrecognised key sequence %d", (int)code );
}
if ( (*code) & 0x8000 )
processKeyEvent( 0, keycode, 0, FALSE, FALSE );
else
processKeyEvent( 0, keycode, 0, TRUE, FALSE );
idx += 2;
}
int surplus = kbdIdx - idx;
for ( int i = 0; i < surplus; i++ )
kbdBuffer = kbdBuffer[idx+i];
kbdIdx = surplus;
}
从理论上说,我的按键驱动程序只要放在"/dev/buttons"就可以响应了,但我在构造函数中加上了一些调试信息,当我按按键时却没有信息在终端打印出来