summaryrefslogtreecommitdiff
path: root/libopie/odevice.cpp
Unidiff
Diffstat (limited to 'libopie/odevice.cpp') (more/less context) (ignore 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:
132 OLedState m_leds [1]; 132 OLedState m_leds [1];
133}; 133};
134 134
135class SIMpad : public ODevice, public QWSServer::KeyboardFilter {
136protected:
137 virtual void init ( );
138 virtual void initButtons ( );
139
140public:
141 virtual bool setSoftSuspend ( bool soft );
142
143 virtual bool setDisplayBrightness ( int b );
144 virtual int displayBrightnessResolution ( ) const;
145
146 virtual void alarmSound ( );
147
148 virtual QValueList <OLed> ledList ( ) const;
149 virtual QValueList <OLedState> ledStateList ( OLed led ) const;
150 virtual OLedState ledState ( OLed led ) const;
151 virtual bool setLedState ( OLed led, OLedState st );
152
153protected:
154 virtual bool filter ( int unicode, int keycode, int modifiers, bool isPress, bool autoRepeat );
155 virtual void timerEvent ( QTimerEvent *te );
156
157 int m_power_timer;
158
159 OLedState m_leds [1]; //FIXME check if really only one
160};
135 161
136struct i_button { 162struct i_button {
137 uint model; 163 uint model;
@@ -229,6 +255,28 @@ struct z_button z_buttons_c700 [] = {
229 "QPE/Rotation", "flip()" }, 255 "QPE/Rotation", "flip()" },
230}; 256};
231 257
258struct s_button {
259 uint model;
260 Qt::Key code;
261 char *utext;
262 char *pix;
263 char *fpressedservice;
264 char *fpressedaction;
265 char *fheldservice;
266 char *fheldaction;
267} simpad_buttons [] = {
268 { Model_SIMpad_CL4 | Model_SIMpad_SL4 | Model_SIMpad_SLC | Model_SIMpad_TSinus,
269 Qt::Key_F11, QT_TRANSLATE_NOOP("Button", "Menu Button"),
270 "devicebuttons/simpad_menu",
271 "QPE/TaskBar", "toggleMenu()",
272 "QPE/TaskBar", "toggleStartMenu()" },
273 { Model_SIMpad_CL4 | Model_SIMpad_SL4 | Model_SIMpad_SLC | Model_SIMpad_TSinus,
274 Qt::Key_F12, QT_TRANSLATE_NOOP("Button", "Home Button"),
275 "devicebuttons/ipaq_home",
276 "QPE/Launcher", "home()",
277 "buttonsettings", "raise()" },
278};
279
232static QCString makeChannel ( const char *str ) 280static QCString makeChannel ( const char *str )
233{ 281{
234 if ( str && !::strchr ( str, '/' )) 282 if ( str && !::strchr ( str, '/' ))
@@ -251,6 +299,8 @@ ODevice *ODevice::inst ( )
251 dev = new iPAQ ( ); 299 dev = new iPAQ ( );
252 else if ( QFile::exists ( "/dev/sharp_buz" ) || QFile::exists ( "/dev/sharp_led" )) 300 else if ( QFile::exists ( "/dev/sharp_buz" ) || QFile::exists ( "/dev/sharp_led" ))
253 dev = new Zaurus ( ); 301 dev = new Zaurus ( );
302 else if ( QFile::exists ( "/proc/ucb1x00" ) && QFile::exists ( "/proc/CS3" ))
303 dev = new SIMpad ( );
254 else 304 else
255 dev = new ODevice ( ); 305 dev = new ODevice ( );
256 306
@@ -1440,3 +1490,273 @@ int Zaurus::displayBrightnessResolution ( ) const
1440} 1490}
1441 1491
1442 1492
1493/**************************************************
1494 *
1495 * SIMpad
1496 *
1497 **************************************************/
1498
1499void SIMpad::init ( )
1500{
1501 d-> m_vendorstr = "SIEMENS";
1502 d-> m_vendor = Vendor_SIEMENS;
1503
1504 QFile f ( "/proc/hal/model" );
1505
1506 //TODO Implement model checking
1507 //FIXME For now we assume an SL4
1508
1509 d-> m_modelstr = "SL4";
1510 d-> m_model = Model_SIMpad_SL4;
1511
1512 switch ( d-> m_model ) {
1513 default:
1514 d-> m_rotation = Rot270;
1515 break;
1516 }
1517
1518 f. setName ( "/etc/familiar-version" );
1519 if ( f. open ( IO_ReadOnly )) {
1520 d-> m_systemstr = "Familiar";
1521 d-> m_system = System_Familiar;
1522
1523 QTextStream ts ( &f );
1524 d-> m_sysverstr = ts. readLine ( ). mid ( 10 );
1525
1526 f. close ( );
1527 } else {
1528 f. setName ( "/etc/oz_version" );
1529
1530 if ( f. open ( IO_ReadOnly )) {
1531 d-> m_systemstr = "OpenEmbedded/SIMpad";
1532 d-> m_system = System_OpenZaurus;
1533
1534 QTextStream ts ( &f );
1535 ts.setDevice ( &f );
1536 d-> m_sysverstr = ts. readLine ( );
1537 f. close ( );
1538 }
1539 }
1540
1541 m_leds [0] = m_leds [1] = Led_Off;
1542
1543 m_power_timer = 0;
1544
1545}
1546
1547void SIMpad::initButtons ( )
1548{
1549 if ( d-> m_buttons )
1550 return;
1551
1552 if ( isQWS( ) )
1553 QWSServer::setKeyboardFilter ( this );
1554
1555 d-> m_buttons = new QValueList <ODeviceButton>;
1556
1557 for ( uint i = 0; i < ( sizeof( simpad_buttons ) / sizeof( s_button )); i++ ) {
1558 s_button *sb = simpad_buttons + i;
1559 ODeviceButton b;
1560
1561 if (( sb-> model & d-> m_model ) == d-> m_model ) {
1562 b. setKeycode ( sb-> code );
1563 b. setUserText ( QObject::tr ( "Button", sb-> utext ));
1564 b. setPixmap ( Resource::loadPixmap ( sb-> pix ));
1565 b. setFactoryPresetPressedAction ( OQCopMessage ( makeChannel ( sb-> fpressedservice ), sb-> fpressedaction ));
1566 b. setFactoryPresetHeldAction ( OQCopMessage ( makeChannel ( sb-> fheldservice ), sb-> fheldaction ));
1567
1568 d-> m_buttons-> append ( b );
1569 }
1570 }
1571 reloadButtonMapping ( );
1572
1573 QCopChannel *sysch = new QCopChannel ( "QPE/System", this );
1574 connect ( sysch, SIGNAL( received( const QCString &, const QByteArray & )), this, SLOT( systemMessage ( const QCString &, const QByteArray & )));
1575}
1576
1577// SIMpad boardcontrol register CS3
1578#define SIMPAD_BOARDCONTROL "/proc/CS3"
1579#define SIMPAD_VCC_5V_EN 0x0001 // For 5V PCMCIA
1580#define SIMPAD_VCC_3V_EN 0x0002 // FOR 3.3V PCMCIA
1581#define SIMPAD_EN1 0x0004 // This is only for EPROM's
1582#define SIMPAD_EN0 0x0008 // Both should be enable for 3.3V or 5V
1583#define SIMPAD_DISPLAY_ON 0x0010
1584#define SIMPAD_PCMCIA_BUFF_DIS 0x0020
1585#define SIMPAD_MQ_RESET 0x0040
1586#define SIMPAD_PCMCIA_RESET 0x0080
1587#define SIMPAD_DECT_POWER_ON 0x0100
1588#define SIMPAD_IRDA_SD 0x0200 // Shutdown for powersave
1589#define SIMPAD_RS232_ON 0x0400
1590#define SIMPAD_SD_MEDIAQ 0x0800 // Shutdown for powersave
1591#define SIMPAD_LED2_ON 0x1000
1592#define SIMPAD_IRDA_MODE 0x2000 // Fast/Slow IrDA mode
1593#define SIMPAD_ENABLE_5V 0x4000 // Enable 5V circuit
1594#define SIMPAD_RESET_SIMCARD 0x8000
1595
1596//SIMpad touchscreen backlight strength control
1597#define SIMPAD_BACKLIGHT_CONTROL "/proc/driver/mq200/registers/PWM_CONTROL"
1598#define SIMPAD_BACKLIGHT_MASK 0x00a10044
1599
1600QValueList <OLed> SIMpad::ledList ( ) const
1601{
1602 QValueList <OLed> vl;
1603 vl << Led_Power; //FIXME which LED is LED2 ? The green one or the amber one?
1604 //vl << Led_Mail; //TODO find out if LED1 is accessible anyway
1605 return vl;
1606}
1607
1608QValueList <OLedState> SIMpad::ledStateList ( OLed l ) const
1609{
1610 QValueList <OLedState> vl;
1611
1612 if ( l == Led_Power ) //FIXME which LED is LED2 ? The green one or the amber one?
1613 vl << Led_Off << Led_On;
1614 //else if ( l == Led_Mail ) //TODO find out if LED1 is accessible anyway
1615 //vl << Led_Off;
1616 return vl;
1617}
1618
1619OLedState SIMpad::ledState ( OLed l ) const
1620{
1621 switch ( l ) {
1622 case Led_Power:
1623 return m_leds [0];
1624 //case Led_Mail:
1625 //return m_leds [1];
1626 default:
1627 return Led_Off;
1628 }
1629}
1630
1631bool SIMpad::setLedState ( OLed l, OLedState st )
1632{
1633 static int fd = ::open ( SIMPAD_BOARDCONTROL, O_RDWR | O_NONBLOCK );
1634
1635 if ( l == Led_Power ) {
1636 if ( fd >= 0 ) {
1637 LED_IN leds;
1638 ::memset ( &leds, 0, sizeof( leds ));
1639 leds. TotalTime = 0;
1640 leds. OnTime = 0;
1641 leds. OffTime = 1;
1642 leds. OffOnBlink = 2;
1643
1644 switch ( st ) {
1645 case Led_Off : leds. OffOnBlink = 0; break;
1646 case Led_On : leds. OffOnBlink = 1; break;
1647 case Led_BlinkSlow: leds. OnTime = 10; leds. OffTime = 10; break;
1648 case Led_BlinkFast: leds. OnTime = 5; leds. OffTime = 5; break;
1649 }
1650
1651 {
1652 /*TODO Implement this like that:
1653 read from CS3
1654 && with SIMPAD_LED2_ON
1655 write to CS3 */
1656 m_leds [0] = st;
1657 return true;
1658 }
1659 }
1660 }
1661 return false;
1662}
1663
1664
1665bool SIMpad::filter ( int /*unicode*/, int keycode, int modifiers, bool isPress, bool autoRepeat )
1666{
1667 //TODO
1668 return false;
1669}
1670
1671void SIMpad::timerEvent ( QTimerEvent * )
1672{
1673 killTimer ( m_power_timer );
1674 m_power_timer = 0;
1675 QWSServer::sendKeyEvent ( -1, HardKey_Backlight, 0, true, false );
1676 QWSServer::sendKeyEvent ( -1, HardKey_Backlight, 0, false, false );
1677}
1678
1679
1680void SIMpad::alarmSound ( )
1681{
1682#ifndef QT_NO_SOUND
1683 static Sound snd ( "alarm" );
1684 int fd;
1685 int vol;
1686 bool vol_reset = false;
1687
1688 if (( fd = ::open ( "/dev/sound/mixer", O_RDWR )) >= 0 ) {
1689 if ( ::ioctl ( fd, MIXER_READ( 0 ), &vol ) >= 0 ) {
1690 Config cfg ( "qpe" );
1691 cfg. setGroup ( "Volume" );
1692
1693 int volalarm = cfg. readNumEntry ( "AlarmPercent", 50 );
1694 if ( volalarm < 0 )
1695 volalarm = 0;
1696 else if ( volalarm > 100 )
1697 volalarm = 100;
1698 volalarm |= ( volalarm << 8 );
1699
1700 if ( ::ioctl ( fd, MIXER_WRITE( 0 ), &volalarm ) >= 0 )
1701 vol_reset = true;
1702 }
1703 }
1704
1705 snd. play ( );
1706 while ( !snd. isFinished ( ))
1707 qApp-> processEvents ( );
1708
1709 if ( fd >= 0 ) {
1710 if ( vol_reset )
1711 ::ioctl ( fd, MIXER_WRITE( 0 ), &vol );
1712 ::close ( fd );
1713 }
1714#endif
1715}
1716
1717
1718bool SIMpad::setSoftSuspend ( bool soft )
1719{
1720 //TODO
1721 return false;
1722}
1723
1724
1725bool SIMpad::setDisplayBrightness ( int bright )
1726{
1727 bool res = false;
1728 int fd;
1729
1730 if ( bright > 255 )
1731 bright = 255;
1732 if ( bright < 0 )
1733 bright = 0;
1734
1735 if (( fd = ::open ( SIMPAD_BACKLIGHT_CONTROL, O_WRONLY )) >= 0 ) {
1736 int value = 255 - bright;
1737 const int mask = SIMPAD_BACKLIGHT_MASK;
1738 value = value << 8;
1739 value += mask;
1740 char writeCommand[100];
1741 const int count = sprintf( writeCommand, "0x%x\n", value );
1742 res = ( ::write ( fd, writeCommand, count ) != -1 );
1743 ::close ( fd );
1744 }
1745 return res;
1746}
1747
1748
1749int SIMpad::displayBrightnessResolution ( ) const
1750{
1751 switch ( model ( )) {
1752 case Model_SIMpad_CL4:
1753 case Model_SIMpad_SL4:
1754 case Model_SIMpad_SLC:
1755 case Model_SIMpad_TSinus:
1756 return 255; //TODO find out if this is save
1757
1758 default:
1759 return 2;
1760 }
1761}
1762