-rw-r--r-- | libopie/odevice.cpp | 136 | ||||
-rw-r--r-- | libopie/odevice.h | 14 |
2 files changed, 113 insertions, 37 deletions
diff --git a/libopie/odevice.cpp b/libopie/odevice.cpp index e24e043..bc09e92 100644 --- a/libopie/odevice.cpp +++ b/libopie/odevice.cpp @@ -137,15 +137,18 @@ public: virtual QValueList <OLed> ledList ( ) const; virtual QValueList <OLedState> ledStateList ( OLed led ) const; virtual OLedState ledState ( OLed led ) const; virtual bool setLedState ( OLed led, OLedState st ); + virtual bool hasHingeSensor() const; + virtual OHingeStatus readHingeSensor(); + static bool isZaurus(); - - // Does this break BC? + + // Does this break BC? virtual bool suspend ( ); virtual Transformation rotation ( ) const; virtual ODirection direction ( ) const; protected: virtual void buzzer ( int snd ); @@ -530,13 +533,13 @@ void ODevice::initButtons ( ) QCopChannel *sysch = new QCopChannel ( "QPE/System", this ); connect ( sysch, SIGNAL( received( const QCString &, const QByteArray & )), this, SLOT( systemMessage ( const QCString &, const QByteArray & ))); } ODevice::~ODevice ( ) { -// we leak m_devicebuttons and m_cpu_frequency +// we leak m_devicebuttons and m_cpu_frequency // but it's a singleton and it is not so importantant // -zecke delete d; } bool ODevice::setSoftSuspend ( bool /*soft*/ ) @@ -820,39 +823,55 @@ bool ODevice::setLedState ( OLed which, OLedState st ) bool ODevice::hasLightSensor ( ) const { return false; } /** - * @return a value from the light senso + * @return a value from the light sensor */ int ODevice::readLightSensor ( ) { return -1; } /** - * @return the light sensor resolution whatever that is ;) + * @return the light sensor resolution */ int ODevice::lightSensorResolution ( ) const { return 0; } /** + * @return if the device has a hinge sensor + */ +bool ODevice::hasHingeSensor ( ) const +{ + return false; +} + +/** + * @return a value from the hinge sensor + */ +OHingeStatus ODevice::readHingeSensor ( ) +{ + return CASE_UNKNOWN; +} + +/** * @return a list with CPU frequencies supported by the hardware */ const QStrList &ODevice::allowedCpuFrequencies ( ) const { return *d->m_cpu_frequencies; } /** * Set desired CPU frequency - * + * * @param index index into d->m_cpu_frequencies of the frequency to be set */ bool ODevice::setCurrentCpuFrequency(uint index) { if (index >= d->m_cpu_frequencies->count()) return false; @@ -1779,13 +1798,13 @@ void Zaurus::buzzer ( int sound ) break; case SHARP_BUZ_KEYSOUND: soundname = "keysound"; break; default: soundname = "alarm"; - + } } // If a soundname is defined, we expect that this device has // sound capabilities.. Otherwise we expect to have the buzzer // device.. @@ -1942,39 +1961,55 @@ bool Zaurus::setSoftSuspend ( bool soft ) return res; } bool Zaurus::setDisplayBrightness ( int bright ) { -// FIXME The C7x0 have a proc-interface (/proc/drivers/corgi-bl) which -// is nice to use. Currently it exposes 16+1 levels. Implement this! -// (or wait for kergoth unifying the interfaces in the OpenZaurus kernel.) - bool res = false; - int fd; - - if ( bright > 255 ) - bright = 255; - if ( bright < 0 ) - bright = 0; - - if (m_embedix) { - if (( fd = ::open ( "/dev/fl", O_WRONLY )) >= 0 ) { - int bl = ( bright * 4 + 127 ) / 255; // only 4 steps on zaurus - if ( bright && !bl ) - bl = 1; - res = ( ::ioctl ( fd, FL_IOCTL_STEP_CONTRAST, bl ) == 0 ); - ::close ( fd ); - } - } else { -#define FB_BACKLIGHT_SET_BRIGHTNESS _IOW('F', 1, u_int) /* set brightness */ - if (( fd = ::open ( "/dev/fb0", O_WRONLY )) >= 0 ) { - res = ( ::ioctl ( fd , FB_BACKLIGHT_SET_BRIGHTNESS, bright ) == 0 ); - ::close ( fd ); - } - } - return res; + bool res = false; + int fd; + + if ( bright > 255 ) bright = 255; + if ( bright < 0 ) bright = 0; + + if ( m_embedix ) + { + if ( d->m_model == Model_Zaurus_SLC7x0 ) + { + // special treatment for devices with the corgi backlight interface + if (( fd = ::open ( "/proc/driver/fl/corgi-bl", O_WRONLY )) >= 0 ) + { + if ( bright > 0x11 ) bright = 0x11; + char writeCommand[100]; + const int count = sprintf( writeCommand, "0x%x\n", bright ); + res = ( ::write ( fd, writeCommand, count ) != -1 ); + ::close ( fd ); + } + return res; + } + else + { + // standard treatment for devices with the dumb embedix frontlight interface + if (( fd = ::open ( "/dev/fl", O_WRONLY )) >= 0 ) { + int bl = ( bright * 4 + 127 ) / 255; // only 4 steps on zaurus + if ( bright && !bl ) + bl = 1; + res = ( ::ioctl ( fd, FL_IOCTL_STEP_CONTRAST, bl ) == 0 ); + ::close ( fd ); + } + } + } + else + { + // special treatment for the OpenZaurus unified interface + #define FB_BACKLIGHT_SET_BRIGHTNESS _IOW('F', 1, u_int) /* set brightness */ + if (( fd = ::open ( "/dev/fb0", O_WRONLY )) >= 0 ) { + res = ( ::ioctl ( fd , FB_BACKLIGHT_SET_BRIGHTNESS, bright ) == 0 ); + ::close ( fd ); + } + } + return res; } bool Zaurus::suspend ( ) { qDebug("ODevice::suspend"); if ( !isQWS( ) ) // only qwsserver is allowed to suspend @@ -2070,17 +2105,48 @@ ODirection Zaurus::direction ( ) const } int Zaurus::displayBrightnessResolution ( ) const { if (m_embedix) - return 5; + return d->m_model == Model_Zaurus_SLC7x0 ? 18 : 5; else return 256; } +bool Zaurus::hasHingeSensor() const +{ + return d->m_model == Model_Zaurus_SLC7x0; +} + +OHingeStatus Zaurus::readHingeSensor() +{ + int handle = ::open("/dev/apm_bios", O_RDWR|O_NONBLOCK); + if (handle == -1) + { + qWarning("Zaurus::readHingeSensor() - failed (%s)", "unknown reason" ); //FIXME: use strerror + return CASE_UNKNOWN; + } + else + { + int retval = ::ioctl(handle, SHARP_IOCTL_GET_ROTATION); + ::close (handle); + if ( retval == CASE_CLOSED || retval == CASE_PORTRAIT || retval == CASE_LANDSCAPE ) + { + qDebug( "Zaurus::readHingeSensor() - result = %d", retval ); + return static_cast<OHingeStatus>( retval ); + } + else + { + qWarning("Zaurus::readHingeSensor() - couldn't compute hinge status!" ); + return CASE_UNKNOWN; + } + } +} + + /************************************************** * * SIMpad * **************************************************/ diff --git a/libopie/odevice.h b/libopie/odevice.h index 8273761..ee0b0ec 100644 --- a/libopie/odevice.h +++ b/libopie/odevice.h @@ -140,12 +140,19 @@ enum OHardKey { enum ODirection { CW = 0, CCW = 1, Flip = 2, }; +enum OHingeStatus { + CASE_CLOSED = 3, + CASE_PORTRAIT = 2, + CASE_LANDSCAPE = 0, + CASE_UNKNOWN = 1, +}; + /** * A singleton which gives informations about device specefic option * like the Hardware used, LEDs, the Base Distribution and * hardware key mappings. * * @short A small class for device specefic options @@ -204,14 +211,14 @@ public: // don't add new virtual methods, use this: // /*virtual */ void boo(int i ) { return virtual_hook(1,&i); }; // and in your subclass do do overwrite // protected virtual int virtual_hook(int, void *) // which is defined below -// input / output - //FIXME playAlarmSound and al might be better -zecke + // input / output + //FIXME playAlarmSound and al might be better -zecke virtual void alarmSound ( ); virtual void keySound ( ); virtual void touchSound ( ); virtual QValueList <OLed> ledList ( ) const; virtual QValueList <OLedState> ledStateList ( OLed led ) const; @@ -219,12 +226,15 @@ public: virtual bool setLedState ( OLed led, OLedState st ); virtual bool hasLightSensor ( ) const; virtual int readLightSensor ( ); virtual int lightSensorResolution ( ) const; + virtual bool hasHingeSensor ( ) const; + virtual OHingeStatus readHingeSensor ( ); + const QStrList &allowedCpuFrequencies() const; bool setCurrentCpuFrequency(uint index); /** * Returns the available buttons on this device. The number and location * of buttons will vary depending on the device. Button numbers will be assigned |