Index: src/StreamBusInterface.cc =================================================================== RCS file: /afs/psi.ch/user/z/zimoch/.cvsroot/StreamDevice2/src/StreamBusInterface.cc,v retrieving revision 1.13 diff -u -r1.13 StreamBusInterface.cc --- src/StreamBusInterface.cc 30 May 2007 12:49:44 -0000 1.13 +++ src/StreamBusInterface.cc 10 Oct 2007 09:52:12 -0000 @@ -89,7 +89,7 @@ } bool StreamBusInterface:: -disconnect () +disconnectRequest () { return false; } @@ -134,6 +134,11 @@ void StreamBusInterface::Client:: connectCallback(StreamIoStatus) +{ +} + +void StreamBusInterface::Client:: +disconnectCallback(StreamIoStatus) { } Index: src/StreamBusInterface.h =================================================================== RCS file: /afs/psi.ch/user/z/zimoch/.cvsroot/StreamDevice2/src/StreamBusInterface.h,v retrieving revision 1.19 diff -u -r1.19 StreamBusInterface.h --- src/StreamBusInterface.h 30 May 2007 12:49:44 -0000 1.19 +++ src/StreamBusInterface.h 10 Oct 2007 09:52:12 -0000 @@ -42,6 +42,7 @@ const void* input, long size); virtual void eventCallback(StreamIoStatus status); virtual void connectCallback(StreamIoStatus status); + virtual void disconnectCallback(StreamIoStatus status); virtual long priority(); virtual const char* name() = 0; virtual const char* getInTerminator(size_t& length) = 0; @@ -86,7 +87,7 @@ return businterface->connectRequest(timeout_ms); } bool busDisconnect() { - return businterface->disconnect(); + return businterface->disconnectRequest(); } }; @@ -113,6 +114,8 @@ { client->eventCallback(status); } void connectCallback(StreamIoStatus status) { client->connectCallback(status); } + void disconnectCallback(StreamIoStatus status) + { client->disconnectCallback(status); } const char* getInTerminator(size_t& length) { return client->getInTerminator(length); } const char* getOutTerminator(size_t& length) @@ -132,7 +135,7 @@ unsigned long replytimeout_ms); // supportsEvents() returns true virtual void release(); virtual bool connectRequest(unsigned long connecttimeout_ms); - virtual bool disconnect(); + virtual bool disconnectRequest(); virtual void finish(); // pure virtual Index: src/StreamCore.cc =================================================================== RCS file: /afs/psi.ch/user/z/zimoch/.cvsroot/StreamDevice2/src/StreamCore.cc,v retrieving revision 1.29 diff -u -r1.29 StreamCore.cc --- src/StreamCore.cc 8 Aug 2007 10:03:35 -0000 1.29 +++ src/StreamCore.cc 2 Oct 2007 14:30:28 -0000 @@ -1510,8 +1510,23 @@ finishProtocol(Fault); return false; } - evalCommand(); return true; +} + +void StreamCore:: +disconnectCallback(StreamIoStatus status) +{ + switch (status) + { + case StreamIoSuccess: + evalCommand(); + return; + default: + error("%s: Disconnect failed\n", + name()); + finishProtocol(Fault); + return; + } } #include "streamReferences" Index: src/StreamCore.h =================================================================== RCS file: /afs/psi.ch/user/z/zimoch/.cvsroot/StreamDevice2/src/StreamCore.h,v retrieving revision 1.12 diff -u -r1.12 StreamCore.h --- src/StreamCore.h 14 May 2007 13:35:49 -0000 1.12 +++ src/StreamCore.h 2 Oct 2007 14:30:28 -0000 @@ -200,6 +200,7 @@ void eventCallback(StreamIoStatus status); void execCallback(StreamIoStatus status); void connectCallback(StreamIoStatus status); + void disconnectCallback(StreamIoStatus status); const char* getInTerminator(size_t& length); const char* getOutTerminator(size_t& length); Index: src/AsynDriverInterface.cc =================================================================== RCS file: /afs/psi.ch/user/z/zimoch/.cvsroot/StreamDevice2/src/AsynDriverInterface.cc,v retrieving revision 1.14 diff -u -r1.14 AsynDriverInterface.cc --- src/AsynDriverInterface.cc 27 Aug 2007 10:06:39 -0000 1.14 +++ src/AsynDriverInterface.cc 10 Oct 2007 10:07:09 -0000 @@ -186,7 +186,7 @@ bool supportsEvent(); bool supportsAsyncRead(); bool connectRequest(unsigned long connecttimeout_ms); - bool disconnect(); + bool disconnectRequest(); void finish(); #ifdef EPICS_3_14 @@ -497,6 +497,8 @@ clientName(), pasynUser->errorMessage); return false; } + debug("AsynDriverInterface::connectToAsynPort(%s) is %s connected\n", + clientName(), connected ? "already" : "not yet"); if (!connected) { status = pasynCommon->connect(pvtCommon, pasynUser); @@ -1202,46 +1204,27 @@ void AsynDriverInterface:: connectHandler() { - int connected; - asynStatus status; - - pasynManager->isConnected(pasynUser, &connected); - debug("AsynDriverInterface::connectHandler %s is %s connected\n", - clientName(), connected ? "already" : "not yet"); - if (!connected) - { - status = pasynCommon->connect(pvtCommon, pasynUser); - if (status != asynSuccess) - { - error("%s connectRequest: pasynCommon->connect() failed: %s\n", - clientName(), pasynUser->errorMessage); - connectCallback(StreamIoFault); - return; - } - } - connectCallback(StreamIoSuccess); + connectCallback(connectToAsynPort() ? StreamIoSuccess : StreamIoFault); } bool AsynDriverInterface:: -disconnect() +disconnectRequest() { asynStatus status; ioAction = Disconnect; - debug("AsynDriverInterface::disconnect %s\n", + debug("AsynDriverInterface::disconnectRequest %s\n", clientName()); status = pasynManager->queueRequest(pasynUser, asynQueuePriorityConnect, 0.0); if (status != asynSuccess) { - error("%s disconnect: pasynManager->queueRequest() failed: %s\n", + error("%s disconnectRequest: pasynManager->queueRequest() failed: %s\n", clientName(), pasynUser->errorMessage); return false; } // continues with: // handleRequest() -> disconnectHandler() - // or handleTimeout() - // (does not expect callback) return true; } @@ -1261,9 +1244,11 @@ { error("%s connectRequest: pasynCommon->disconnect() failed: %s\n", clientName(), pasynUser->errorMessage); + disconnectCallback(StreamIoFault); return; } } + disconnectCallback(StreamIoSuccess); } void AsynDriverInterface:: @@ -1335,9 +1320,9 @@ interface->connectCallback(StreamIoTimeout); break; case Disconnect: - debug ("AsynDriverInterface %s: disconnect timeout\n", + error("AsynDriverInterface %s: disconnect timeout\n", interface->clientName()); - // not interested in callback + // should not happen because of infinite timeout break; // No AsyncRead here because we don't use timeout when polling default: Index: doc/businterface.html =================================================================== RCS file: /afs/psi.ch/user/z/zimoch/.cvsroot/StreamDevice2/doc/businterface.html,v retrieving revision 1.5 diff -u -r1.5 businterface.html --- doc/businterface.html 30 May 2007 14:41:42 -0000 1.5 +++ doc/businterface.html 10 Oct 2007 10:10:30 -0000 @@ -172,6 +172,9 @@
void connectCallback(StreamIoStatus status);
+
+void disconnectCallback(StreamIoStatus status); +

Other provided methods, attibutes, and types

@@ -280,6 +283,9 @@
void connectCallback(IoStatus status);
+
+void disconnectCallback(IoStatus status); +

Connection should be handled automatically. If the device is disconnected, each attempt to access the @@ -292,7 +298,8 @@ disconnect explicitely. To connect, the client calls connectRequest(). This function should return true immediately -or false if the request cannot be accepted. +or false if the request cannot be accepted or connection +handling is not supported. The interface should call connectCallback(StreamIoSuccess) once the bus could be connected. If the bus cannot be connected within connecttimeout_ms @@ -305,10 +312,14 @@ connectCallback(StreamIoFault) may be called.

-To disconnect, the client calls disconnect(); +To disconnect, the client calls disconnectRequest(); This function should return true immediately or -false if disconnecting is impossible. -There is no callback for disconnect(). +false if the request cannot be accepted or connection +handling is not supported. +The interface should call connectCallback(StreamIoSuccess) +once the bus is disconnected. There is no timeout for this operation. +If disconnecting is impossible, the interface should call +connectCallback(StreamIoFault).

Index: streamApp/terminal.tcl =================================================================== RCS file: /afs/psi.ch/user/z/zimoch/.cvsroot/StreamDevice2/streamApp/terminal.tcl,v retrieving revision 1.7 diff -u -r1.7 terminal.tcl --- streamApp/terminal.tcl 30 May 2007 12:53:54 -0000 1.7 +++ streamApp/terminal.tcl 10 Oct 2007 10:15:21 -0000 @@ -52,6 +52,7 @@ if [catch { switch -- [lindex $a 0] { "disconnect" { + sendReply $sock [string range $a 11 end] destroy .$sock } "echo" {