author | erik <erik> | 2007-02-08 21:46:07 (UTC) |
---|---|---|
committer | erik <erik> | 2007-02-08 21:46:07 (UTC) |
commit | 497621fb3ba39ea511842a30cddfcdbda090e7ba (patch) (side-by-side diff) | |
tree | 13e70fb1840b7cc1c7b3a16ff9b6e71925b76b57 | |
parent | 63f64a9733d5504bb04d5f06cdf52b42a4b8006c (diff) | |
download | opie-497621fb3ba39ea511842a30cddfcdbda090e7ba.zip opie-497621fb3ba39ea511842a30cddfcdbda090e7ba.tar.gz opie-497621fb3ba39ea511842a30cddfcdbda090e7ba.tar.bz2 |
This commit provides the necessary changes and new files for Opie to
have partial support for the Palm LD, TX and Z72 handheld computers.
This commit is based on a patch submitted by Cristiano to the opie-devel
list. The patch itself comprises work done by Alex Osborne, Cristiano,
Sergey Lapin, Jan Herman and Aaron. Thanks goes to them for sticking with
the patch and expanding the number of devices Opie works on.
-rw-r--r-- | libopie2/opiecore/device/device.pro | 6 | ||||
-rw-r--r-- | libopie2/opiecore/device/odevice.cpp | 2 | ||||
-rw-r--r-- | libopie2/opiecore/device/odevice.h | 7 | ||||
-rw-r--r-- | libopie2/opiecore/device/odevice_palm.cpp | 282 | ||||
-rw-r--r-- | libopie2/opiecore/device/odevice_palm.h | 72 |
5 files changed, 367 insertions, 2 deletions
diff --git a/libopie2/opiecore/device/device.pro b/libopie2/opiecore/device/device.pro index b517032..2fd5ded 100644 --- a/libopie2/opiecore/device/device.pro +++ b/libopie2/opiecore/device/device.pro @@ -10,9 +10,10 @@ HEADERS += device/odevice.h \ device/odevice_genuineintel.h \ device/odevice_yopy.h \ device/odevice_mypal.h \ device/odevice_htc.h \ - device/odevice_motorola_ezx.h + device/odevice_motorola_ezx.h \ + device/odevice_palm.h SOURCES += device/odevice.cpp \ device/odevicebutton.cpp \ device/odevice_abstractmobiledevice.cpp \ @@ -25,6 +26,7 @@ SOURCES += device/odevice.cpp \ device/odevice_genuineintel.cpp \ device/odevice_yopy.cpp \ device/odevice_mypal.cpp \ device/odevice_htc.cpp \ - device/odevice_motorola_ezx.cpp + device/odevice_motorola_ezx.cpp \ + device/odevice_palm.cpp diff --git a/libopie2/opiecore/device/odevice.cpp b/libopie2/opiecore/device/odevice.cpp index 8f5be8b..e4233eb 100644 --- a/libopie2/opiecore/device/odevice.cpp +++ b/libopie2/opiecore/device/odevice.cpp @@ -38,8 +38,9 @@ #include "odevice_zaurus.h" #include "odevice_genuineintel.h" #include "odevice_htc.h" #include "odevice_motorola_ezx.h" +#include "odevice_palm.h" /* QT */ #include <qapplication.h> #include <qfile.h> @@ -147,8 +148,9 @@ ODevice *ODevice::inst() else if ( line.contains( "ramses", false ) ) dev = new Internal::Ramses(); else if ( line.contains( "Tradesquare.NL", false ) ) dev = new Internal::Beagle(); else if ( line.contains( "HTC", false ) ) dev = new Internal::HTC(); else if ( line.contains( "Motorola", false ) ) dev = new Internal::Motorola_EZX(); + else if ( line.contains( "Palm", false ) ) dev = new Internal::Palm(); else qWarning( "ODevice() - unknown hardware - using default." ); break; } else if ( line.startsWith( "vendor_id" ) ) { diff --git a/libopie2/opiecore/device/odevice.h b/libopie2/opiecore/device/odevice.h index a8362cd..1eb5959 100644 --- a/libopie2/opiecore/device/odevice.h +++ b/libopie2/opiecore/device/odevice.h @@ -137,8 +137,14 @@ enum OModel { Model_Motorola = ( 9 << 17 ), Model_Motorola_All = ( Model_Motorola | 0xffff ), Model_Motorola_EZX = ( Model_Motorola | 0x0001 ), + Model_Palm = ( 10 << 16), + Model_Palm_All = ( Model_Palm | 0xffff ), + Model_Palm_LD = ( Model_Palm | 0x0001 ), + Model_Palm_TX = ( Model_Palm | 0x0002 ), + Model_Palm_Z72 = ( Model_Palm | 0x0003 ), + }; /** * The vendor of the device @@ -155,8 +161,9 @@ enum OVendor { Vendor_GenuineIntel, Vendor_Asus, Vendor_HTC, Vendor_Motorola, + Vendor_Palm, }; /** * The System used diff --git a/libopie2/opiecore/device/odevice_palm.cpp b/libopie2/opiecore/device/odevice_palm.cpp new file mode 100644 index 0000000..76399f8 --- a/dev/null +++ b/libopie2/opiecore/device/odevice_palm.cpp @@ -0,0 +1,282 @@ +/* + This file is part of the Opie Project + + Copyright (C)2002-2005 The Opie Team <opie-devel@handhelds.org> + =. + .=l. + .>+-= + _;:, .> :=|. This program is free software; you can +.> <`_, > . <= redistribute it and/or modify it under +:`=1 )Y*s>-.-- : the terms of the GNU Library General Public +.="- .-=="i, .._ License as published by the Free Software + - . .-<_> .<> Foundation; either version 2 of the License, + ._= =} : or (at your option) any later version. + .%`+i> _;_. + .i_,=:_. -<s. This program is distributed in the hope that + + . -:. = it will be useful, but WITHOUT ANY WARRANTY; + : .. .:, . . . without even the implied warranty of + =_ + =;=|` MERCHANTABILITY or FITNESS FOR A + _.=:. : :=>`: PARTICULAR PURPOSE. See the GNU +..}^=.= = ; Library General Public License for more +++= -. .` .: details. +: = ...= . :.=- + -. .:....=;==+<; You should have received a copy of the GNU + -_. . . )=. = Library General Public License along with + -- :-=` this library; see the file COPYING.LIB. + If not, write to the Free Software Foundation, + Inc., 59 Temple Place - Suite 330, + Boston, MA 02111-1307, USA. +*/ + +#include "odevice_palm.h" + +/* QT */ +#include <qapplication.h> +#include <qfile.h> +#include <qtextstream.h> +#include <qwindowsystem_qws.h> +#include <qgfx_qws.h> + +/* OPIE */ +#include <qpe/config.h> +#include <qpe/sound.h> +#include <qpe/qcopenvelope_qws.h> + +#include <opie2/okeyfilter.h> +#include <opie2/oresource.h> + +/* STD */ +#include <fcntl.h> +#include <math.h> +#include <stdlib.h> +#include <signal.h> +#include <sys/ioctl.h> +#include <sys/time.h> +#include <unistd.h> +#ifndef QT_NO_SOUND +#include <linux/soundcard.h> +#endif + +using namespace Opie::Core; +using namespace Opie::Core::Internal; + +struct palm_button palm_buttons [] = { + { Model_Palm_TX | Model_Palm_LD | Model_Palm_Z72, + Qt::Key_F9, QT_TRANSLATE_NOOP( "Button", "Home Button" ), + "devicebuttons/palm_home", + "QPE/Launcher", "home()", + "buttonsettings", "raise()" }, + { Model_Palm_TX | Model_Palm_LD | Model_Palm_Z72, + Qt::Key_F10, QT_TRANSLATE_NOOP( "Button", "Calendar Button" ), + "devicebuttons/palm_calendar", + "datebook", "nextView()", + "today", "raise()" }, + { Model_Palm_TX | Model_Palm_LD | Model_Palm_Z72, + Qt::Key_F11, QT_TRANSLATE_NOOP( "Button", "Todo Button" ), + "devicebuttons/palm_todo", + "todolist", "raise()", + "todolist", "create()" }, + { Model_Palm_TX | Model_Palm_LD | Model_Palm_Z72, + Qt::Key_F12, QT_TRANSLATE_NOOP( "Button", "Mail Button" ), + "devicebuttons/palm_mail", + "opiemail", "raise()", + "opiemail", "newmail()" }, + { Model_Palm_LD, + Qt::Key_F7, QT_TRANSLATE_NOOP( "Button", "Voice Memo Button" ), + "devicebuttons/palm_voice_memo", + "QPE/TaskBar", "toggleMenu()", + "QPE/TaskBar", "toggleStartMenu()" }, + { Model_Palm_LD, + Qt::Key_F8, QT_TRANSLATE_NOOP( "Button", "Rotate Button" ), + "devicebuttons/palm_rotate", + "QPE/Rotation", "flip()",0}, +}; + +void Palm::init(const QString& cpu_info) +{ + d->m_vendorstr = "Palm"; + d->m_vendor = Vendor_Palm; + + QString model = "unknown"; + + int loc = cpu_info.find( ":" ); + if ( loc != -1 ) + model = cpu_info.mid( loc+2 ).simplifyWhiteSpace(); + else + model = cpu_info; + + if ( model == "Palm LifeDrive" ) { + d->m_modelstr = "Palm LifeDrive"; + d->m_model = Model_Palm_LD; + } + else if ( model == "Palm TX" ) { + d->m_modelstr = "Palm TX"; + d->m_model = Model_Palm_TX; + } + else if ( model == "Palm Zire 72" ) { + d->m_modelstr = "Palm Zire 72"; + d->m_model = Model_Palm_Z72; + } + else + d->m_model = Model_Unknown; + + switch ( d->m_model ) + { + case Model_Palm_LD: + case Model_Palm_TX: + case Model_Palm_Z72: + m_backlightdev = "/sys/class/backlight/pxapwm-bl/"; + d->m_rotation = Rot0; + d->m_direction = CCW; + d->m_qteDriver = "Transformed"; + break; + default: + m_backlightdev = ""; + } + +} + + +void Palm::initButtons() +{ + + if ( d->m_buttons ) + return ; + + if ( isQWS( ) ) { + addPreHandler(this); + } + + d->m_buttons = new QValueList <ODeviceButton>; + + for ( uint i = 0; i < ( sizeof( palm_buttons ) / sizeof( palm_button ) ); i++ ) + { + palm_button *ib = palm_buttons + i; + ODeviceButton b; + + if (( ib->model & d->m_model ) == d->m_model ) { + b. setKeycode ( ib->code ); + b. setUserText ( QObject::tr ( "Button", ib->utext )); + b. setPixmap ( OResource::loadPixmap ( ib->pix )); + b. setFactoryPresetPressedAction ( OQCopMessage ( makeChannel ( ib->fpressedservice ), ib->fpressedaction )); + b. setFactoryPresetHeldAction ( OQCopMessage ( makeChannel ( ib->fheldservice ), ib->fheldaction )); + + d->m_buttons->append ( b ); + } + } + reloadButtonMapping(); +} + + +bool Palm::filter ( int /*unicode*/, int keycode, int modifiers, bool isPress, bool autoRepeat ) +{ + int newkeycode = keycode; + + if (qt_screen->transformOrientation() != Rot0){ + + switch ( keycode ) { + case Key_Left : + case Key_Right: + case Key_Up : + case Key_Down : + newkeycode = Key_Left + ( keycode - Key_Left + (int) qt_screen->transformOrientation() ) % 4; + default: + break; + } + + if (newkeycode!=keycode) { + if ( newkeycode != Key_unknown ) { + QWSServer::sendKeyEvent ( -1, newkeycode, modifiers, isPress, autoRepeat ); + } + return true; + } + + } + + return false; +} + + +bool Palm::suspend() +{ + // some Palms do not implement their own power management at the moment. + + bool res = false; + + if ( !isQWS( ) ) // only qwsserver is allowed to suspend + return false; + + switch ( d->m_model ) { + case Model_Palm_LD: + case Model_Palm_Z72: + { + QCopChannel::send( "QPE/System", "aboutToSuspend()" ); + + ::sync(); // flush fs caches + res = ( ::system ( "apm --suspend" ) == 0 ); + + QCopChannel::send( "QPE/System", "returnFromSuspend()" ); + } + break; + } + + return res; +} + + +int Palm::displayBrightnessResolution() const +{ + int res = 1; + + switch ( d->m_model ) + { + case Model_Palm_LD: + case Model_Palm_TX: + case Model_Palm_Z72: + int fd = ::open( m_backlightdev + "max_brightness", O_RDONLY|O_NONBLOCK ); + if ( fd ) + { + char buf[100]; + if ( ::read( fd, &buf[0], sizeof buf ) ) ::sscanf( &buf[0], "%d", &res ); + ::close( fd ); + } + break; + + default: + res = 1; + } + + return res; +} + + +bool Palm::setDisplayBrightness( int bright ) +{ + bool res = false; + + if ( bright > 255 ) bright = 255; + if ( bright < 0 ) bright = 0; + + int numberOfSteps = displayBrightnessResolution(); + int val = ( bright == 1 ) ? 1 : ( bright * numberOfSteps ) / 255; + + switch ( d->m_model ) + { + + case Model_Palm_LD: + case Model_Palm_TX: + case Model_Palm_Z72: + int fd = ::open( m_backlightdev + "brightness", O_WRONLY|O_NONBLOCK ); + if ( fd ) + { + char buf[100]; + int len = ::snprintf( &buf[0], sizeof buf, "%d", val ); + res = ( ::write( fd, &buf[0], len ) == 0 ); + ::close( fd ); + } + break; + + default: res = false; + } + return res; +} diff --git a/libopie2/opiecore/device/odevice_palm.h b/libopie2/opiecore/device/odevice_palm.h new file mode 100644 index 0000000..3ce786c --- a/dev/null +++ b/libopie2/opiecore/device/odevice_palm.h @@ -0,0 +1,72 @@ +/* + This file is part of the Opie Project + Copyright (C) The Opie Team <opie-devel@handhelds.org> + =. + .=l. + .>+-= +_;:, .> :=|. This program is free software; you can +.> <`_, > . <= redistribute it and/or modify it under +:`=1 )Y*s>-.-- : the terms of the GNU Library General Public +.="- .-=="i, .._ License as published by the Free Software +- . .-<_> .<> Foundation; either version 2 of the License, + ._= =} : or (at your option) any later version. + .%`+i> _;_. + .i_,=:_. -<s. This program is distributed in the hope that + + . -:. = it will be useful, but WITHOUT ANY WARRANTY; + : .. .:, . . . without even the implied warranty of + =_ + =;=|` MERCHANTABILITY or FITNESS FOR A + _.=:. : :=>`: PARTICULAR PURPOSE. See the GNU +..}^=.= = ; Library General Public License for more +++= -. .` .: details. +: = ...= . :.=- +-. .:....=;==+<; You should have received a copy of the GNU + -_. . . )=. = Library General Public License along with + -- :-=` this library; see the file COPYING.LIB. + If not, write to the Free Software Foundation, + Inc., 59 Temple Place - Suite 330, + Boston, MA 02111-1307, USA. +*/ + +#ifndef ODEVICE_PALM +#define ODEVICE_PALM + +#include "odevice_abstractmobiledevice.h" + +namespace Opie { +namespace Core { +namespace Internal { +class Palm : public OAbstractMobileDevice, public QWSServer::KeyboardFilter +{ + protected: + + virtual void init(const QString&); + virtual void initButtons(); + virtual bool filter( int unicode, int keycode, int modifiers, bool isPress, bool autoRepeat ); + + QString m_backlightdev; + + public: + virtual bool suspend(); + + virtual bool setDisplayBrightness ( int b ); + virtual int displayBrightnessResolution() const; + +}; + +struct palm_button +{ + uint model; + Qt::Key code; + char *utext; + char *pix; + char *fpressedservice; + char *fpressedaction; + char *fheldservice; + char *fheldaction; +}; + +} +} +} + +#endif |