-rw-r--r-- | libopie/odevice.cpp | 320 |
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 | |||
@@ -131,8 +131,34 @@ protected: | |||
131 | 131 | ||
132 | OLedState m_leds [1]; | 132 | OLedState m_leds [1]; |
133 | }; | 133 | }; |
134 | 134 | ||
135 | class SIMpad : public ODevice, public QWSServer::KeyboardFilter { | ||
136 | protected: | ||
137 | virtual void init ( ); | ||
138 | virtual void initButtons ( ); | ||
139 | |||
140 | public: | ||
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 | |||
153 | protected: | ||
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 | ||
136 | struct i_button { | 162 | struct i_button { |
137 | uint model; | 163 | uint model; |
138 | Qt::Key code; | 164 | Qt::Key code; |
@@ -228,8 +254,30 @@ struct z_button z_buttons_c700 [] = { | |||
228 | "QPE/Rotation", "flip()", | 254 | "QPE/Rotation", "flip()", |
229 | "QPE/Rotation", "flip()" }, | 255 | "QPE/Rotation", "flip()" }, |
230 | }; | 256 | }; |
231 | 257 | ||
258 | struct 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 | |||
232 | static QCString makeChannel ( const char *str ) | 280 | static QCString makeChannel ( const char *str ) |
233 | { | 281 | { |
234 | if ( str && !::strchr ( str, '/' )) | 282 | if ( str && !::strchr ( str, '/' )) |
235 | return QCString ( "QPE/Application/" ) + str; | 283 | return QCString ( "QPE/Application/" ) + str; |
@@ -250,8 +298,10 @@ ODevice *ODevice::inst ( ) | |||
250 | if ( QFile::exists ( "/proc/hal/model" )) | 298 | if ( QFile::exists ( "/proc/hal/model" )) |
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 | ||
257 | dev-> init ( ); | 307 | dev-> init ( ); |
@@ -1439,4 +1489,274 @@ int Zaurus::displayBrightnessResolution ( ) const | |||
1439 | return 5; | 1489 | return 5; |
1440 | } | 1490 | } |
1441 | 1491 | ||
1442 | 1492 | ||
1493 | /************************************************** | ||
1494 | * | ||
1495 | * SIMpad | ||
1496 | * | ||
1497 | **************************************************/ | ||
1498 | |||
1499 | void 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 | |||
1547 | void 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 | |||
1600 | QValueList <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 | |||
1608 | QValueList <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 | |||
1619 | OLedState 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 | |||
1631 | bool 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 | |||
1665 | bool SIMpad::filter ( int /*unicode*/, int keycode, int modifiers, bool isPress, bool autoRepeat ) | ||
1666 | { | ||
1667 | //TODO | ||
1668 | return false; | ||
1669 | } | ||
1670 | |||
1671 | void 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 | |||
1680 | void 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 | |||
1718 | bool SIMpad::setSoftSuspend ( bool soft ) | ||
1719 | { | ||
1720 | //TODO | ||
1721 | return false; | ||
1722 | } | ||
1723 | |||
1724 | |||
1725 | bool 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 | |||
1749 | int 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 | |||