/**************************************************************************** ** ** Copyright (C) 2000-2006 TROLLTECH ASA. All rights reserved. ** ** This file is part of the Phone Edition of the Qtopia Toolkit. ** ** This software is licensed under the terms of the GNU General Public ** License (GPL) version 2. ** ** See http://www.trolltech.com/gpl/ for GPL licensing information. ** ** Contact info@trolltech.com if any conditions of this licensing are ** not clear to you. ** ** ** ** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE ** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. ** ****************************************************************************/ #include "htcbuthandler.h" //#ifdef QT_QWS_PXA27X #include #include #include #include #include #include #include #include #include #include #include #define OK_BUTTON 96 #define IE_BUTTON 150 #define WIN_BUTTON 139 #define CAM_BUTTON 212 #define REC_BUTTON 167 #define JOG_DOWN 114 #define JOG_UP 115 #define PWR_BUTTON 116 #define PAD_UP 103 #define PAD_RIGHT 106 #define PAD_DOWN 108 #define PAD_LEFT 105 #define PHONE_CALL 65 #define PHONE_HANGUP 66 #define CONTACT_KEY 63 #define CALENDAR_KEY 64 htcButHandler::htcButHandler(const QString &device) { setObjectName( "HTC buttons Handler" ); devName = device; setEnvDevice(devName); shift=false; } htcButHandler::~htcButHandler() { } int htcButHandler::setDevice(const QString& device, const QString& mode) { if (mode == QString("ASIC3")) { Asic3FD = ::open(device.toLocal8Bit().constData(), O_RDONLY, 0); if (Asic3FD >= 0) { //qWarning("Opened event1 as button ASIC3 input"); m_notify = new QSocketNotifier( Asic3FD, QSocketNotifier::Read, this ); connect( m_notify, SIGNAL(activated(int)), this, SLOT(readAsic3Keys())); } else { qWarning("Cannot open %s for ASIC3 buttons (%s)", devName.toLocal8Bit().constData(), strerror(errno)); return 1; } } if (mode == QString("GPIO")) { GpioFD = ::open(device.toLocal8Bit().constData(), O_RDONLY, 0); if (GpioFD >= 0) { //qWarning("Opened event0 as button GPIO input"); m_notify = new QSocketNotifier( GpioFD, QSocketNotifier::Read, this ); connect( m_notify, SIGNAL(activated(int)), this, SLOT(readGpioKeys())); } else { qWarning("Cannot open event0 for GPIO buttons (%s)", devName.toLocal8Bit().constData(), strerror(errno)); return 1; } } if (mode == QString("EXT")) { ExtFD = ::open(device.toLocal8Bit().constData(), O_RDONLY, 0); if (ExtFD >= 0) { //qWarning("Opened event0 as button GPIO input"); m_notify = new QSocketNotifier( ExtFD, QSocketNotifier::Read, this ); connect( m_notify, SIGNAL(activated(int)), this, SLOT(readExtKeys())); } else { qWarning("Cannot open event0 for GPIO buttons (%s)", devName.toLocal8Bit().constData(), strerror(errno)); return 1; } } return 0; } /* TSDogs: added this to detect from environment */ /* this is duplicate checking as qtopiacore has this info */ /* but does not pass it by to external plugins (?) */ int htcButHandler::setEnvDevice(const QString &keys) { QStringList *keyboard; keyboard = new QStringList(keys); /* this should never happen, as then how were we called */ if (keyboard->isEmpty()) return 1; QString device; QString type; QString mode; for (int i = keyboard->size() - 1; i >= 0; --i) { const QString spec = keyboard->at(i); qWarning( "device to use : %s ", spec.toLocal8Bit().constData()); QStringList devices = spec.split(QLatin1Char(':')); for (int j = devices.size() - 1; j >= 0; --j) { const QString event = devices.at(j); int param1 = event.indexOf(QLatin1Char(',')); mode = event.mid(param1+1); device = event.left(param1); qWarning("Set device %s to handle %s", device.toLocal8Bit().constData(), mode.toLocal8Bit().constData()); if (setDevice( device, mode)) { qWarning("Leave with error"); return 1; } } } return 0; } void htcButHandler::readGpioKeys() { htcInput event; int n = read(GpioFD, &event, sizeof(htcInput)); if(n !=16) { qWarning("keypressed on GPIO: n=%03d",n); return; } processEvent(event); } void htcButHandler::readAsic3Keys() { htcInput event; int n = read(Asic3FD, &event, sizeof(htcInput)); if(n !=16) { qWarning("keypressed on ASIC3: n=%03d",n); return; } processEvent(event); } void htcButHandler::readExtKeys() { htcInput event; int n = read(ExtFD, &event, sizeof(htcInput)); if(n !=16) { qWarning("keypressed on EXT: n=%03d",n); return; } processEvent(event); } void htcButHandler::processEvent(htcInput event) { int modifiers=0; int unicode=0xffff; int key_code=0; switch(event.code) { case OK_BUTTON: key_code = Qt::Key_Select; unicode = 0xffff; break; case IE_BUTTON: key_code = Qt::Key_Back; unicode = 0xffff; break; case WIN_BUTTON: key_code = Qt::Key_F12; unicode = 0xffff; break; case CAM_BUTTON: key_code = Qt::Key_F4; unicode = 0xffff; break; case REC_BUTTON: key_code = Qt::Key_Select; unicode = 0xffff; break; case JOG_DOWN: key_code = Qt::Key_F6; unicode = 0xffff; break; case JOG_UP: key_code = Qt::Key_F5; unicode = 0xffff; break; case PWR_BUTTON: key_code = Qt::Key_F34; unicode = 0xffff; break; case PAD_UP: key_code = Qt::Key_Up; unicode = 0xffff; break; case PAD_RIGHT: key_code = Qt::Key_Right; unicode = 0xffff; break; case PAD_DOWN: key_code = Qt::Key_Down; unicode = 0xffff; break; case PAD_LEFT: key_code = Qt::Key_Left; unicode = 0xffff; break; case PHONE_CALL: key_code = Qt::Key_Call; unicode = 0xffff; break; case PHONE_HANGUP: key_code = Qt::Key_Hangup; unicode = 0xffff; break; case CALENDAR_KEY: key_code = Qt::Key_F9; unicode = 0xffff; break; case CONTACT_KEY: key_code = Qt::Key_F10; unicode = 0xffff; break; } if(shift) modifiers |= Qt::ShiftModifier; processKeyEvent(unicode, key_code, (Qt::KeyboardModifiers)modifiers, event.value!=0, false); // qWarning("keypressed: type=%03d, code=%03d, value=%03d (%s)",event.type, event.code,event.value,((event.value)!=0) ? "Down":"Up"); } //#endif // QT_QWS_PXA27X