summaryrefslogtreecommitdiff
path: root/libopie/odevice.cpp
authorsandman <sandman>2002-06-18 12:44:05 (UTC)
committer sandman <sandman>2002-06-18 12:44:05 (UTC)
commite21322ab34a8df36344eece685e604abe4f83fc6 (patch) (side-by-side diff)
tree199bf3f1b70b7d364d5ad836e01789ab6ce87d70 /libopie/odevice.cpp
parent714133d7f0e2a0dafe55b280f93915765fc67fe3 (diff)
downloadopie-e21322ab34a8df36344eece685e604abe4f83fc6.zip
opie-e21322ab34a8df36344eece685e604abe4f83fc6.tar.gz
opie-e21322ab34a8df36344eece685e604abe4f83fc6.tar.bz2
Reimplemented OHwInfo as ODevice with enhanced capabilities
ODevice should replace custom-*.h in the future (iPAQ is finished)
Diffstat (limited to 'libopie/odevice.cpp') (more/less context) (show whitespace changes)
-rw-r--r--libopie/odevice.cpp469
1 files changed, 469 insertions, 0 deletions
diff --git a/libopie/odevice.cpp b/libopie/odevice.cpp
new file mode 100644
index 0000000..d952edf
--- a/dev/null
+++ b/libopie/odevice.cpp
@@ -0,0 +1,469 @@
+/* This file is part of the OPIE libraries
+ Copyright (C) 2002 Robert Griebl (sandman@handhelds.org)
+
+ This library is free software; you can redistribute it and/or
+ modify it under the terms of the GNU Library General Public
+ License as published by the Free Software Foundation; either
+ version 2 of the License, or (at your option) any later version.
+
+ This library 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 <qfile.h>
+#include <qtextstream.h>
+
+
+#include "odevice.h"
+
+
+class ODeviceData {
+public:
+ QString m_vendorstr;
+ OVendor m_vendor;
+
+ QString m_modelstr;
+ OModel m_model;
+
+ QString m_systemstr;
+ OSystem m_system;
+
+ OLedState m_leds [4]; // just for convenience ...
+};
+
+class ODeviceIPAQ : public ODevice {
+protected:
+ virtual void init ( );
+
+public:
+ virtual void alarmSound ( );
+ virtual void keySound ( );
+ virtual void touchSound ( );
+
+ virtual uint hasLeds ( ) const;
+ virtual OLedState led ( uint which ) const;
+ virtual bool setLed ( uint which, OLedState st );
+};
+
+class ODeviceZaurus : public ODevice {
+protected:
+ virtual void init ( );
+
+public:
+ virtual void alarmSound ( );
+ virtual void keySound ( );
+ virtual void touchSound ( );
+
+ virtual uint hasLeds ( ) const;
+ virtual OLedState led ( uint which ) const;
+ virtual bool setLed ( uint which, OLedState st );
+
+protected:
+ virtual void buzzer ( int snd );
+};
+
+
+
+
+
+
+
+ODevice *ODevice::inst ( )
+{
+ static ODevice *dev = 0;
+
+ if ( !dev ) {
+ if ( QFile::exists ( "/proc/hal/model" ))
+ dev = new ODeviceIPAQ ( );
+ else if ( QFile::exists ( "/dev/sharp_buz" ) || QFile::exists ( "/dev/sharp_led" ))
+ dev = new ODeviceZaurus ( );
+ else
+ dev = new ODevice ( );
+
+ dev-> init ( );
+ }
+ return dev;
+}
+
+ODevice::ODevice ( )
+{
+ d = new ODeviceData;
+
+ d-> m_modelstr = "Unknown";
+ d-> m_model = OMODEL_Unknown;
+ d-> m_vendorstr = "Unkown";
+ d-> m_vendor = OVENDOR_Unknown;
+ d-> m_systemstr = "Unkown";
+ d-> m_system = OSYSTEM_Unknown;
+}
+
+void ODevice::init ( )
+{
+}
+
+ODevice::~ODevice ( )
+{
+ delete d;
+}
+
+QString ODevice::vendorString ( )
+{
+ return d-> m_vendorstr;
+}
+
+OVendor ODevice::vendor ( )
+{
+ return d-> m_vendor;
+}
+
+QString ODevice::modelString ( )
+{
+ return d-> m_modelstr;
+}
+
+OModel ODevice::model ( )
+{
+ return d-> m_model;
+}
+
+QString ODevice::systemString ( )
+{
+ return d-> m_systemstr;
+}
+
+OSystem ODevice::system ( )
+{
+ return d-> m_system;
+}
+
+void ODevice::alarmSound ( )
+{
+}
+
+void ODevice::keySound ( )
+{
+}
+
+void ODevice::touchSound ( )
+{
+}
+
+uint ODevice::hasLeds ( ) const
+{
+ return 0;
+}
+
+OLedState ODevice::led ( uint /*which*/ ) const
+{
+ return OLED_Off;
+}
+
+bool ODevice::setLed ( uint /*which*/, OLedState /*st*/ )
+{
+ return false;
+}
+
+
+
+
+//#if defined( QT_QWS_IPAQ ) // IPAQ
+
+
+void ODeviceIPAQ::init ( )
+{
+ d-> m_vendorstr = "HP";
+ d-> m_vendor = OVENDOR_HP;
+
+ QFile f ( "/proc/hal/model" );
+
+ if ( f. open ( IO_ReadOnly )) {
+ QTextStream ts ( &f );
+
+ d-> m_modelstr = "H" + ts. readLine ( );
+
+ if ( d-> m_modelstr == "H3100" )
+ d-> m_model = OMODEL_iPAQ_H31xx;
+ else if ( d-> m_modelstr == "H3600" )
+ d-> m_model = OMODEL_iPAQ_H36xx;
+ else if ( d-> m_modelstr == "H3700" )
+ d-> m_model = OMODEL_iPAQ_H37xx;
+ else if ( d-> m_modelstr == "H3800" )
+ d-> m_model = OMODEL_iPAQ_H38xx;
+ else
+ d-> m_model = OMODEL_Unknown;
+
+ f. close ( );
+ }
+
+ if ( QFile::exists ( "/etc/familiar-version" )) {
+ d-> m_systemstr = "Familiar";
+ d-> m_system = OSYSTEM_Familiar;
+ }
+
+ d-> m_leds [0] = OLED_Off;
+}
+
+#include <unistd.h>
+#include <fcntl.h>
+#include <sys/ioctl.h>
+#include <linux/soundcard.h>
+#include <qapplication.h>
+#include <qpe/resource.h>
+#include <qpe/config.h>
+#include <qpe/sound.h>
+
+//#include <linux/h3600_ts.h> // including kernel headers is evil ...
+
+typedef struct h3600_ts_led {
+ unsigned char OffOnBlink; /* 0=off 1=on 2=Blink */
+ unsigned char TotalTime; /* Units of 5 seconds */
+ unsigned char OnTime; /* units of 100m/s */
+ unsigned char OffTime; /* units of 100m/s */
+} LED_IN;
+
+
+// #define IOC_H3600_TS_MAGIC 'f'
+// #define LED_ON _IOW(IOC_H3600_TS_MAGIC, 5, struct h3600_ts_led)
+#define LED_ON (( 1<<30 ) | ( 'f'<<8 ) | ( 5 ) | ( sizeof(struct h3600_ts_led)<<16 )) // _IOW only defined in kernel headers :(
+
+
+void ODeviceIPAQ::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 ) ||
+ (( fd = ::open ( "/dev/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 (( volalarm & 0xff ) > ( vol & 0xff )) {
+ 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
+}
+
+void ODeviceIPAQ::touchSound ( )
+{
+#ifndef QT_NO_SOUND
+ static Sound snd ( "touchsound" );
+
+ if ( snd. isFinished ( ))
+ snd. play ( );
+#endif
+}
+
+void ODeviceIPAQ::keySound ( )
+{
+#ifndef QT_NO_SOUND
+ static Sound snd ( "keysound" );
+
+ if ( snd. isFinished ( ))
+ snd. play ( );
+#endif
+}
+
+
+uint ODeviceIPAQ::hasLeds ( ) const
+{
+ return 1;
+}
+
+OLedState ODeviceIPAQ::led ( uint which ) const
+{
+ if ( which == 0 )
+ return d-> m_leds [0];
+ else
+ return OLED_Off;
+}
+
+bool ODeviceIPAQ::setLed ( uint which, OLedState st )
+{
+ static int fd = ::open ( "/dev/touchscreen/0", O_RDWR|O_NONBLOCK );
+
+ if ( which == 0 ) {
+ if ( fd >= 0 ) {
+ struct h3600_ts_led leds;
+ ::memset ( &leds, 0, sizeof( leds ));
+ leds. TotalTime = 0;
+ leds. OnTime = 0;
+ leds. OffTime = 1;
+ leds. OffOnBlink = 2;
+
+ switch ( st ) {
+ case OLED_Off : leds. OffOnBlink = 0; break;
+ case OLED_On : leds. OffOnBlink = 1; break;
+ case OLED_BlinkSlow: leds. OnTime = 10; leds. OffTime = 10; break;
+ case OLED_BlinkFast: leds. OnTime = 5; leds. OffTime = 5; break;
+ }
+
+ if ( ::ioctl ( fd, LED_ON, &leds ) >= 0 ) {
+ d-> m_leds [0] = st;
+ return true;
+ }
+ }
+ }
+ return false;
+}
+
+
+//#endif
+
+
+
+
+
+//#if defined( QT_QWS_CUSTOM ) // Zaurus
+
+void ODeviceZaurus::init ( )
+{
+ d-> m_modelstr = "Zaurus SL5000";
+ d-> m_model = OMODEL_Zaurus_SL5000;
+ d-> m_vendorstr = "Sharp";
+ d-> m_vendor = OVENDOR_Sharp;
+
+ QFile f ( "/proc/filesystems" );
+
+ if ( f. open ( IO_ReadOnly ) && ( QTextStream ( &f ). read ( ). find ( "\tjffs2\n" ) >= 0 )) {
+ d-> m_systemstr = "OpenZaurus";
+ d-> m_system = OSYSTEM_OpenZaurus;
+
+ f. close ( );
+ }
+ else {
+ d-> m_systemstr = "Zaurus";
+ d-> m_system = OSYSTEM_Zaurus;
+ }
+
+ d-> m_leds [0] = OLED_Off;
+}
+
+#include <unistd.h>
+#include <fcntl.h>
+#include <sys/ioctl.h>
+
+//#include <asm/sharp_char.h> // including kernel headers is evil ...
+
+#define SHARP_DEV_IOCTL_COMMAND_START 0x5680
+
+#define SHARP_BUZZER_IOCTL_START (SHARP_DEV_IOCTL_COMMAND_START)
+#define SHARP_BUZZER_MAKESOUND (SHARP_BUZZER_IOCTL_START)
+
+#define SHARP_BUZ_TOUCHSOUND 1 /* touch panel sound */
+#define SHARP_BUZ_KEYSOUND 2 /* key sound */
+#define SHARP_BUZ_SCHEDULE_ALARM 11 /* schedule alarm */
+
+
+#define SHARP_LED_IOCTL_START (SHARP_DEV_IOCTL_COMMAND_START)
+#define SHARP_LED_SETSTATUS (SHARP_LED_IOCTL_START+1)
+
+typedef struct sharp_led_status {
+ int which; /* select which LED status is wanted. */
+ int status; /* set new led status if you call SHARP_LED_SETSTATUS */
+} sharp_led_status;
+
+#define SHARP_LED_MAIL_EXISTS 9 /* mail status (exists or not) */
+
+#define LED_MAIL_NO_UNREAD_MAIL 0 /* for SHARP_LED_MAIL_EXISTS */
+#define LED_MAIL_NEWMAIL_EXISTS 1 /* for SHARP_LED_MAIL_EXISTS */
+#define LED_MAIL_UNREAD_MAIL_EX 2 /* for SHARP_LED_MAIL_EXISTS */
+
+
+
+void ODeviceZaurus::buzzer ( int sound )
+{
+ static int fd = ::open ( "/dev/sharp_buz", O_RDWR|O_NONBLOCK );
+
+ if ( fd >= 0 )
+ ::ioctl ( fd, SHARP_BUZZER_MAKESOUND, sound );
+}
+
+
+void ODeviceZaurus::alarmSound ( )
+{
+ buzzer ( SHARP_BUZ_SCHEDULE_ALARM );
+}
+
+void ODeviceZaurus::touchSound ( )
+{
+ buzzer ( SHARP_BUZ_TOUCHSOUND );
+}
+
+void ODeviceZaurus::keySound ( )
+{
+ buzzer ( SHARP_BUZ_KEYSOUND );
+}
+
+
+uint ODeviceZaurus::hasLeds ( ) const
+{
+ return 1;
+}
+
+OLedState ODeviceZaurus::led ( uint which ) const
+{
+ if ( which == 0 )
+ return d-> m_leds [0];
+ else
+ return OLED_Off;
+}
+
+bool ODeviceZaurus::setLed ( uint which, OLedState st )
+{
+ static int fd = ::open ( "/dev/sharp_led", O_RDWR|O_NONBLOCK );
+
+ if ( which == 0 ) {
+ if ( fd >= 0 ) {
+ struct sharp_led_status leds;
+ ::memset ( &leds, 0, sizeof( leds ));
+ leds. which = SHARP_LED_MAIL_EXISTS;
+
+ switch ( st ) {
+ case OLED_Off : leds. status = LED_MAIL_NO_UNREAD_MAIL; break;
+ case OLED_On : leds. status = LED_MAIL_NEWMAIL_EXISTS; break;
+ case OLED_BlinkSlow:
+ case OLED_BlinkFast: leds. status = LED_MAIL_UNREAD_MAIL_EX; break;
+ }
+
+ if ( ::ioctl ( fd, SHARP_LED_SETSTATUS, &leds ) >= 0 ) {
+ d-> m_leds [0] = st;
+ return true;
+ }
+ }
+ }
+ return false;
+}
+
+//#endif