-rw-r--r-- | noncore/net/opietooth/applet/bluezapplet.cpp | 31 | ||||
-rw-r--r-- | noncore/net/opietooth/applet/bluezapplet.h | 8 | ||||
-rw-r--r-- | noncore/net/opietooth/lib/device.cc | 5 |
3 files changed, 36 insertions, 8 deletions
diff --git a/noncore/net/opietooth/applet/bluezapplet.cpp b/noncore/net/opietooth/applet/bluezapplet.cpp index f7774f0..127b0af 100644 --- a/noncore/net/opietooth/applet/bluezapplet.cpp +++ b/noncore/net/opietooth/applet/bluezapplet.cpp @@ -48,130 +48,130 @@ using namespace Opie::Core; #include <qlayout.h> #include <qframe.h> #include <qpixmap.h> #include <qstring.h> #include <qtimer.h> #include <qpopupmenu.h> #include <qmessagebox.h> /* STD */ #include <device.h> namespace OpieTooth { BluezApplet::BluezApplet( QWidget *parent, const char *name ) : QWidget( parent, name ) { setFixedHeight( AppLnk::smallIconSize() ); setFixedWidth( AppLnk::smallIconSize() ); #if OPIE_VERSION < 102010 bluezOnPixmap = Resource::loadPixmap( "bluetoothapplet/bluezon" ); bluezOffPixmap = Resource::loadPixmap( "bluetoothapplet/bluezoff" ); bluezDiscoveryOnPixmap = Resource::loadPixmap( "bluetoothapplet/magglass.png" ); #else bluezOnPixmap = OResource::loadImage( "bluetoothapplet/bluezon", OResource::SmallIcon ); bluezOffPixmap = OResource::loadImage( "bluetoothapplet/bluezoff", Opie::Core::OResource::SmallIcon ); bluezDiscoveryOnPixmap = OResource::loadImage( "bluetoothapplet/bluezondiscovery", Opie::Core::OResource::SmallIcon ); #endif startTimer(2000); btDevice = 0; btManager = 0; bluezactive = false; bluezDiscoveryActive = false; doListDevice = false; isScanning = false; m_wasOn = false; + m_sync = false; // TODO: determine whether this channel has to be closed at destruction time. QCopChannel* chan = new QCopChannel("QPE/Bluetooth", this ); connect(chan, SIGNAL(received(const QCString&,const QByteArray&) ), this, SLOT(slotMessage(const QCString&,const QByteArray&) ) ); ::system("/etc/init.d/bluetooth stop >/dev/null 2>/dev/null"); } BluezApplet::~BluezApplet() { if ( btDevice ) { + ::system("/etc/init.d/bluetooth stop >/dev/null 2>/dev/null"); delete btDevice; } if ( btManager ) { delete btManager; } } int BluezApplet::position() { return 6; } bool BluezApplet::checkBluezStatus() { if (btDevice) { if (btDevice->isLoaded() ) { odebug << "btDevice isLoaded" << oendl; return true; } else { odebug << "btDevice is NOT loaded" << oendl; return false; } } else { odebug << "btDevice is ZERO" << oendl; return false; } } int BluezApplet::setBluezStatus(int c, bool sync) { if ( c == 1 ) { switch ( ODevice::inst()->model() ) { case Model_iPAQ_H39xx: btDevice = new Device( "/dev/tts/1", "bcsp", "921600" ); break; case Model_iPAQ_H5xxx: btDevice = new Device( "/dev/tts/1", "any", "921600" ); break; -#ifndef OPIE120 +#if OPIE_VERSION >= 102010 case Model_MyPal_716: btDevice = new Device( "/dev/ttyS1", "bcsp", "921600" ); break; #endif default: btDevice = new Device( "/dev/ttySB0", "bcsp", "230400" ); break; } - if (sync) { - ::system("/etc/init.d/bluetooth start >/dev/null 2>/dev/null"); - } else { - QCopEnvelope e("QPE/System", "execute(QString)"); - e << QString("/etc/init.d/bluetooth start"); - } + m_sync = sync; + connect(btDevice, SIGNAL(device(const QString&, bool)), + this, SLOT(slotDevice(const QString&, bool))); + } else { ::system("/etc/init.d/bluetooth stop >/dev/null 2>/dev/null"); if ( btManager ) { delete btManager; btManager = 0; } if ( btDevice ) { delete btDevice; btDevice = 0; } } return 0; } int BluezApplet::checkBluezDiscoveryStatus() { return isScanning; } int BluezApplet::setBluezDiscoveryStatus(int d) { return bluezDiscoveryActive = d; } // FIXME mbhaynie // receiver for QCopChannel("QPE/Bluetooth") messages. void BluezApplet::slotMessage( const QCString& str, const QByteArray& ) { if ( str == "enableBluetooth()") { m_wasOn = checkBluezStatus(); if (!m_wasOn) { setBluezStatus(1, true); sleep(2); } @@ -307,37 +307,54 @@ namespace OpieTooth { if (bluezactive && doListDevice) { const QByteArray arr; slotMessage("listDevices()", arr); } } /** * Implementation of the paint event * @param the QPaintEvent */ void BluezApplet::paintEvent( QPaintEvent* ) { QPainter p(this); odebug << "paint bluetooth pixmap" << oendl; if (bluezactive) { #if OPIE_VERSION < 102010 p.drawPixmap( 0, -1, bluezOnPixmap ); #else p.drawPixmap( 0, 0, bluezOnPixmap ); #endif } else { #if OPIE_VERSION < 102010 p.drawPixmap( 0, -1, bluezOffPixmap ); #else p.drawPixmap( 0, 0, bluezOffPixmap ); #endif } if (bluezDiscoveryActive) { p.drawPixmap( 0, 0, bluezDiscoveryOnPixmap ); } } + /** + * Reacts on device up + * @param name device name + * @param up if device was brought up + */ + void BluezApplet::slotDevice(const QString& name, bool up) + { + if (!up) + return; + odebug << name << " is up" << oendl; + if (m_sync) { + ::system("/etc/init.d/bluetooth start >/dev/null 2>/dev/null"); + } else { + QCopEnvelope e("QPE/System", "execute(QString)"); + e << QString("/etc/init.d/bluetooth start"); + } + } }; EXPORT_OPIE_APPLET_v1( OpieTooth::BluezApplet ) diff --git a/noncore/net/opietooth/applet/bluezapplet.h b/noncore/net/opietooth/applet/bluezapplet.h index 1937934..b79ed5b 100644 --- a/noncore/net/opietooth/applet/bluezapplet.h +++ b/noncore/net/opietooth/applet/bluezapplet.h @@ -41,41 +41,49 @@ namespace OpieTooth { class BluezApplet : public QWidget { Q_OBJECT public: BluezApplet( QWidget *parent = 0, const char *name=0 ); ~BluezApplet(); static int position(); protected: void timerEvent(QTimerEvent *te ); public slots: void fillList( const QString& device, RemoteDevice::ValueList list ); private: void mousePressEvent( QMouseEvent * ); void paintEvent( QPaintEvent* ); void launchManager(); bool checkBluezStatus(); int setBluezStatus(int, bool sync = false); int checkBluezDiscoveryStatus(); int setBluezDiscoveryStatus(int); private: Device* btDevice; Manager *btManager; QPixmap bluezOnPixmap; QPixmap bluezOffPixmap; QPixmap bluezDiscoveryOnPixmap; bool bluezactive; bool bluezDiscoveryActive; bool doListDevice; //If I have to list devices after bringing BT up? bool isScanning; //If I'm scanning devices bool m_wasOn; //If BT was started by menu? + protected: + bool m_sync; //If we have to bring BT synchronously private slots: void slotMessage( const QCString& , const QByteArray& ); + /** + * Reacts on device up + * @param name device name + * @param up if device was brought up + */ + void slotDevice(const QString&, bool); }; }; #endif diff --git a/noncore/net/opietooth/lib/device.cc b/noncore/net/opietooth/lib/device.cc index 2f04d46..88d4cf9 100644 --- a/noncore/net/opietooth/lib/device.cc +++ b/noncore/net/opietooth/lib/device.cc @@ -97,86 +97,89 @@ void Device::detach(){ // kill the pid we got if(m_attached ){ //kill the pid owarn << "killing" << oendl; ::kill(pid, 9); } owarn << "detached" << oendl; } bool Device::isLoaded()const{ return m_attached; } QString Device::devName()const { return QString::fromLatin1("hci0"); }; void Device::slotExited( OProcess* proc) { owarn << "prcess exited" << oendl; if(proc== m_process ){ owarn << "proc == m_process" << oendl; if( m_process->normalExit() ){ // normal exit owarn << "normalExit" << oendl; int ret = m_process->exitStatus(); if( ret == 0 ){ // attached owarn << "attached" << oendl; owarn << "Output: " << m_output.data() << oendl; pid = parsePid( m_output ); owarn << "Pid = " << pid << oendl; // now hciconfig hci0 up ( determine hciX FIXME) // and call hciconfig hci0 up // FIXME hardcoded to hci0 now :( m_hci = new OProcess( ); *m_hci << "hciconfig"; - *m_hci << "hci0 up"; + *m_hci << "hci0"; + *m_hci << "up"; connect(m_hci, SIGNAL( processExited(Opie::Core::OProcess*) ), this, SLOT( slotExited(Opie::Core::OProcess* ) ) ); if(!m_hci->start() ){ owarn << "could not start" << oendl; m_attached = false; emit device("hci0", false ); } }else{ owarn << "crass" << oendl; m_attached = false; emit device("hci0", false ); } } delete m_process; m_process = 0; }else if(proc== m_hci ){ owarn << "M HCI exited" << oendl; if( m_hci->normalExit() ){ owarn << "normal exit" << oendl; int ret = m_hci->exitStatus(); if( ret == 0 ){ owarn << "attached really really attached" << oendl; m_attached = true; + //Wait for a device to be brought up + ::sleep(1); emit device("hci0", true ); }else{ owarn << "failed" << oendl; emit device("hci0", false ); m_attached = false; } }// normal exit delete m_hci; m_hci = 0; } } void Device::slotStdOut(OProcess* proc, char* chars, int len) { owarn << "std out" << oendl; if( len <1 ){ owarn << "len < 1 " << oendl; return; } if(proc == m_process ){ QCString string( chars, len+1 ); // \0 == +1 owarn << "output: " << string.data() << oendl; m_output.append( string.data() ); } } void Device::slotStdErr(OProcess* proc, char* chars, int len) { owarn << "std err" << oendl; slotStdOut( proc, chars, len ); } |