summaryrefslogtreecommitdiff
path: root/libopie/odevice.cpp
Side-by-side diff
Diffstat (limited to 'libopie/odevice.cpp') (more/less context) (show whitespace changes)
-rw-r--r--libopie/odevice.cpp320
1 files changed, 320 insertions, 0 deletions
diff --git a/libopie/odevice.cpp b/libopie/odevice.cpp
index 7d862cd..921a94e 100644
--- a/libopie/odevice.cpp
+++ b/libopie/odevice.cpp
@@ -132,6 +132,32 @@ protected:
OLedState m_leds [1];
};
+class SIMpad : public ODevice, public QWSServer::KeyboardFilter {
+protected:
+ virtual void init ( );
+ virtual void initButtons ( );
+
+public:
+ virtual bool setSoftSuspend ( bool soft );
+
+ virtual bool setDisplayBrightness ( int b );
+ virtual int displayBrightnessResolution ( ) const;
+
+ virtual void alarmSound ( );
+
+ 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 );
+
+protected:
+ virtual bool filter ( int unicode, int keycode, int modifiers, bool isPress, bool autoRepeat );
+ virtual void timerEvent ( QTimerEvent *te );
+
+ int m_power_timer;
+
+ OLedState m_leds [1]; //FIXME check if really only one
+};
struct i_button {
uint model;
@@ -229,6 +255,28 @@ struct z_button z_buttons_c700 [] = {
"QPE/Rotation", "flip()" },
};
+struct s_button {
+ uint model;
+ Qt::Key code;
+ char *utext;
+ char *pix;
+ char *fpressedservice;
+ char *fpressedaction;
+ char *fheldservice;
+ char *fheldaction;
+} simpad_buttons [] = {
+ { Model_SIMpad_CL4 | Model_SIMpad_SL4 | Model_SIMpad_SLC | Model_SIMpad_TSinus,
+ Qt::Key_F11, QT_TRANSLATE_NOOP("Button", "Menu Button"),
+ "devicebuttons/simpad_menu",
+ "QPE/TaskBar", "toggleMenu()",
+ "QPE/TaskBar", "toggleStartMenu()" },
+ { Model_SIMpad_CL4 | Model_SIMpad_SL4 | Model_SIMpad_SLC | Model_SIMpad_TSinus,
+ Qt::Key_F12, QT_TRANSLATE_NOOP("Button", "Home Button"),
+ "devicebuttons/ipaq_home",
+ "QPE/Launcher", "home()",
+ "buttonsettings", "raise()" },
+};
+
static QCString makeChannel ( const char *str )
{
if ( str && !::strchr ( str, '/' ))
@@ -251,6 +299,8 @@ ODevice *ODevice::inst ( )
dev = new iPAQ ( );
else if ( QFile::exists ( "/dev/sharp_buz" ) || QFile::exists ( "/dev/sharp_led" ))
dev = new Zaurus ( );
+ else if ( QFile::exists ( "/proc/ucb1x00" ) && QFile::exists ( "/proc/CS3" ))
+ dev = new SIMpad ( );
else
dev = new ODevice ( );
@@ -1440,3 +1490,273 @@ int Zaurus::displayBrightnessResolution ( ) const
}
+/**************************************************
+ *
+ * SIMpad
+ *
+ **************************************************/
+
+void SIMpad::init ( )
+{
+ d-> m_vendorstr = "SIEMENS";
+ d-> m_vendor = Vendor_SIEMENS;
+
+ QFile f ( "/proc/hal/model" );
+
+ //TODO Implement model checking
+ //FIXME For now we assume an SL4
+
+ d-> m_modelstr = "SL4";
+ d-> m_model = Model_SIMpad_SL4;
+
+ switch ( d-> m_model ) {
+ default:
+ d-> m_rotation = Rot270;
+ break;
+ }
+
+ f. setName ( "/etc/familiar-version" );
+ if ( f. open ( IO_ReadOnly )) {
+ d-> m_systemstr = "Familiar";
+ d-> m_system = System_Familiar;
+
+ QTextStream ts ( &f );
+ d-> m_sysverstr = ts. readLine ( ). mid ( 10 );
+
+ f. close ( );
+ } else {
+ f. setName ( "/etc/oz_version" );
+
+ if ( f. open ( IO_ReadOnly )) {
+ d-> m_systemstr = "OpenEmbedded/SIMpad";
+ d-> m_system = System_OpenZaurus;
+
+ QTextStream ts ( &f );
+ ts.setDevice ( &f );
+ d-> m_sysverstr = ts. readLine ( );
+ f. close ( );
+ }
+ }
+
+ m_leds [0] = m_leds [1] = Led_Off;
+
+ m_power_timer = 0;
+
+}
+
+void SIMpad::initButtons ( )
+{
+ if ( d-> m_buttons )
+ return;
+
+ if ( isQWS( ) )
+ QWSServer::setKeyboardFilter ( this );
+
+ d-> m_buttons = new QValueList <ODeviceButton>;
+
+ for ( uint i = 0; i < ( sizeof( simpad_buttons ) / sizeof( s_button )); i++ ) {
+ s_button *sb = simpad_buttons + i;
+ ODeviceButton b;
+
+ if (( sb-> model & d-> m_model ) == d-> m_model ) {
+ b. setKeycode ( sb-> code );
+ b. setUserText ( QObject::tr ( "Button", sb-> utext ));
+ b. setPixmap ( Resource::loadPixmap ( sb-> pix ));
+ b. setFactoryPresetPressedAction ( OQCopMessage ( makeChannel ( sb-> fpressedservice ), sb-> fpressedaction ));
+ b. setFactoryPresetHeldAction ( OQCopMessage ( makeChannel ( sb-> fheldservice ), sb-> fheldaction ));
+
+ d-> m_buttons-> append ( b );
+ }
+ }
+ reloadButtonMapping ( );
+
+ QCopChannel *sysch = new QCopChannel ( "QPE/System", this );
+ connect ( sysch, SIGNAL( received( const QCString &, const QByteArray & )), this, SLOT( systemMessage ( const QCString &, const QByteArray & )));
+}
+
+// SIMpad boardcontrol register CS3
+#define SIMPAD_BOARDCONTROL "/proc/CS3"
+#define SIMPAD_VCC_5V_EN 0x0001 // For 5V PCMCIA
+#define SIMPAD_VCC_3V_EN 0x0002 // FOR 3.3V PCMCIA
+#define SIMPAD_EN1 0x0004 // This is only for EPROM's
+#define SIMPAD_EN0 0x0008 // Both should be enable for 3.3V or 5V
+#define SIMPAD_DISPLAY_ON 0x0010
+#define SIMPAD_PCMCIA_BUFF_DIS 0x0020
+#define SIMPAD_MQ_RESET 0x0040
+#define SIMPAD_PCMCIA_RESET 0x0080
+#define SIMPAD_DECT_POWER_ON 0x0100
+#define SIMPAD_IRDA_SD 0x0200 // Shutdown for powersave
+#define SIMPAD_RS232_ON 0x0400
+#define SIMPAD_SD_MEDIAQ 0x0800 // Shutdown for powersave
+#define SIMPAD_LED2_ON 0x1000
+#define SIMPAD_IRDA_MODE 0x2000 // Fast/Slow IrDA mode
+#define SIMPAD_ENABLE_5V 0x4000 // Enable 5V circuit
+#define SIMPAD_RESET_SIMCARD 0x8000
+
+//SIMpad touchscreen backlight strength control
+#define SIMPAD_BACKLIGHT_CONTROL "/proc/driver/mq200/registers/PWM_CONTROL"
+#define SIMPAD_BACKLIGHT_MASK 0x00a10044
+
+QValueList <OLed> SIMpad::ledList ( ) const
+{
+ QValueList <OLed> vl;
+ vl << Led_Power; //FIXME which LED is LED2 ? The green one or the amber one?
+ //vl << Led_Mail; //TODO find out if LED1 is accessible anyway
+ return vl;
+}
+
+QValueList <OLedState> SIMpad::ledStateList ( OLed l ) const
+{
+ QValueList <OLedState> vl;
+
+ if ( l == Led_Power ) //FIXME which LED is LED2 ? The green one or the amber one?
+ vl << Led_Off << Led_On;
+ //else if ( l == Led_Mail ) //TODO find out if LED1 is accessible anyway
+ //vl << Led_Off;
+ return vl;
+}
+
+OLedState SIMpad::ledState ( OLed l ) const
+{
+ switch ( l ) {
+ case Led_Power:
+ return m_leds [0];
+ //case Led_Mail:
+ // return m_leds [1];
+ default:
+ return Led_Off;
+ }
+}
+
+bool SIMpad::setLedState ( OLed l, OLedState st )
+{
+ static int fd = ::open ( SIMPAD_BOARDCONTROL, O_RDWR | O_NONBLOCK );
+
+ if ( l == Led_Power ) {
+ if ( fd >= 0 ) {
+ LED_IN leds;
+ ::memset ( &leds, 0, sizeof( leds ));
+ leds. TotalTime = 0;
+ leds. OnTime = 0;
+ leds. OffTime = 1;
+ leds. OffOnBlink = 2;
+
+ switch ( st ) {
+ case Led_Off : leds. OffOnBlink = 0; break;
+ case Led_On : leds. OffOnBlink = 1; break;
+ case Led_BlinkSlow: leds. OnTime = 10; leds. OffTime = 10; break;
+ case Led_BlinkFast: leds. OnTime = 5; leds. OffTime = 5; break;
+ }
+
+ {
+ /*TODO Implement this like that:
+ read from CS3
+ && with SIMPAD_LED2_ON
+ write to CS3 */
+ m_leds [0] = st;
+ return true;
+ }
+ }
+ }
+ return false;
+}
+
+
+bool SIMpad::filter ( int /*unicode*/, int keycode, int modifiers, bool isPress, bool autoRepeat )
+{
+ //TODO
+ return false;
+}
+
+void SIMpad::timerEvent ( QTimerEvent * )
+{
+ killTimer ( m_power_timer );
+ m_power_timer = 0;
+ QWSServer::sendKeyEvent ( -1, HardKey_Backlight, 0, true, false );
+ QWSServer::sendKeyEvent ( -1, HardKey_Backlight, 0, false, false );
+}
+
+
+void SIMpad::alarmSound ( )
+{
+#ifndef QT_NO_SOUND
+ static Sound snd ( "alarm" );
+ int fd;
+ int vol;
+ bool vol_reset = false;
+
+ if (( fd = ::open ( "/dev/sound/mixer", O_RDWR )) >= 0 ) {
+ if ( ::ioctl ( fd, MIXER_READ( 0 ), &vol ) >= 0 ) {
+ Config cfg ( "qpe" );
+ cfg. setGroup ( "Volume" );
+
+ int volalarm = cfg. readNumEntry ( "AlarmPercent", 50 );
+ if ( volalarm < 0 )
+ volalarm = 0;
+ else if ( volalarm > 100 )
+ volalarm = 100;
+ volalarm |= ( volalarm << 8 );
+
+ if ( ::ioctl ( fd, MIXER_WRITE( 0 ), &volalarm ) >= 0 )
+ vol_reset = true;
+ }
+ }
+
+ snd. play ( );
+ while ( !snd. isFinished ( ))
+ qApp-> processEvents ( );
+
+ if ( fd >= 0 ) {
+ if ( vol_reset )
+ ::ioctl ( fd, MIXER_WRITE( 0 ), &vol );
+ ::close ( fd );
+ }
+#endif
+}
+
+
+bool SIMpad::setSoftSuspend ( bool soft )
+{
+ //TODO
+ return false;
+}
+
+
+bool SIMpad::setDisplayBrightness ( int bright )
+{
+ bool res = false;
+ int fd;
+
+ if ( bright > 255 )
+ bright = 255;
+ if ( bright < 0 )
+ bright = 0;
+
+ if (( fd = ::open ( SIMPAD_BACKLIGHT_CONTROL, O_WRONLY )) >= 0 ) {
+ int value = 255 - bright;
+ const int mask = SIMPAD_BACKLIGHT_MASK;
+ value = value << 8;
+ value += mask;
+ char writeCommand[100];
+ const int count = sprintf( writeCommand, "0x%x\n", value );
+ res = ( ::write ( fd, writeCommand, count ) != -1 );
+ ::close ( fd );
+ }
+ return res;
+}
+
+
+int SIMpad::displayBrightnessResolution ( ) const
+{
+ switch ( model ( )) {
+ case Model_SIMpad_CL4:
+ case Model_SIMpad_SL4:
+ case Model_SIMpad_SLC:
+ case Model_SIMpad_TSinus:
+ return 255; //TODO find out if this is save
+
+ default:
+ return 2;
+ }
+}
+