|
|
|
@ -371,9 +371,11 @@ supportsEvent()
|
|
|
|
|
intrCallbackInt32, this, &intrPvtInt32);
|
|
|
|
|
return true;
|
|
|
|
|
}
|
|
|
|
|
error("%s: port does not allow to register for "
|
|
|
|
|
const char *portname;
|
|
|
|
|
pasynManager->getPortName(pasynUser, &portname);
|
|
|
|
|
error("%s: port %s does not allow to register for "
|
|
|
|
|
"Int32 interrupts: %s\n",
|
|
|
|
|
clientName(), pasynUser->errorMessage);
|
|
|
|
|
clientName(), portname, pasynUser->errorMessage);
|
|
|
|
|
pasynInt32 = NULL;
|
|
|
|
|
intrPvtInt32 = NULL;
|
|
|
|
|
}
|
|
|
|
@ -397,9 +399,11 @@ supportsEvent()
|
|
|
|
|
intrCallbackUInt32, this, 0xFFFFFFFF, &intrPvtInt32);
|
|
|
|
|
return true;
|
|
|
|
|
}
|
|
|
|
|
error("%s: port does not allow to register for "
|
|
|
|
|
const char *portname;
|
|
|
|
|
pasynManager->getPortName(pasynUser, &portname);
|
|
|
|
|
error("%s: port %s does not allow to register for "
|
|
|
|
|
"UInt32 interrupts: %s\n",
|
|
|
|
|
clientName(), pasynUser->errorMessage);
|
|
|
|
|
clientName(), portname, pasynUser->errorMessage);
|
|
|
|
|
pasynUInt32 = NULL;
|
|
|
|
|
intrPvtUInt32 = NULL;
|
|
|
|
|
}
|
|
|
|
@ -418,9 +422,15 @@ supportsAsyncRead()
|
|
|
|
|
intrCallbackOctet, this, &intrPvtOctet) != asynSuccess)
|
|
|
|
|
{
|
|
|
|
|
const char *portname;
|
|
|
|
|
int addr;
|
|
|
|
|
pasynManager->getPortName(pasynUser, &portname);
|
|
|
|
|
error("%s: asyn port %s does not support asynchronous input: %s\n",
|
|
|
|
|
clientName(), portname, pasynUser->errorMessage);
|
|
|
|
|
pasynManager->getAddr(pasynUser, &addr);
|
|
|
|
|
if (addr >= 0)
|
|
|
|
|
error("%s: asyn port %s addr %d does not support asynchronous input: %s\n",
|
|
|
|
|
clientName(), portname, addr, pasynUser->errorMessage);
|
|
|
|
|
else
|
|
|
|
|
error("%s: asyn port %s does not support asynchronous input: %s\n",
|
|
|
|
|
clientName(), portname, pasynUser->errorMessage);
|
|
|
|
|
return false;
|
|
|
|
|
}
|
|
|
|
|
return true;
|
|
|
|
@ -485,28 +495,12 @@ connectToBus(const char* portname, int addr)
|
|
|
|
|
bool AsynDriverInterface::
|
|
|
|
|
lockRequest(unsigned long lockTimeout_ms)
|
|
|
|
|
{
|
|
|
|
|
int connected;
|
|
|
|
|
asynStatus status;
|
|
|
|
|
|
|
|
|
|
debug("AsynDriverInterface::lockRequest(%s, %ld msec)\n",
|
|
|
|
|
clientName(), lockTimeout_ms);
|
|
|
|
|
lockTimeout = lockTimeout_ms ? lockTimeout_ms*0.001 : -1.0;
|
|
|
|
|
ioAction = Lock;
|
|
|
|
|
status = pasynManager->isConnected(pasynUser, &connected);
|
|
|
|
|
if (status != asynSuccess)
|
|
|
|
|
{
|
|
|
|
|
error("%s lockRequest: pasynManager->isConnected() failed: %s\n",
|
|
|
|
|
clientName(), pasynUser->errorMessage);
|
|
|
|
|
return false;
|
|
|
|
|
}
|
|
|
|
|
if (!connected)
|
|
|
|
|
{
|
|
|
|
|
const char *portname;
|
|
|
|
|
pasynManager->getPortName(pasynUser, &portname);
|
|
|
|
|
error("%s lockRequest: asyn port %s is not connected\n",
|
|
|
|
|
clientName(), portname);
|
|
|
|
|
return false;
|
|
|
|
|
}
|
|
|
|
|
status = pasynManager->queueRequest(pasynUser,
|
|
|
|
|
priority(), lockTimeout);
|
|
|
|
|
if (status != asynSuccess)
|
|
|
|
@ -599,28 +593,10 @@ void AsynDriverInterface::
|
|
|
|
|
lockHandler()
|
|
|
|
|
{
|
|
|
|
|
asynStatus status;
|
|
|
|
|
int connected;
|
|
|
|
|
|
|
|
|
|
debug("AsynDriverInterface::lockHandler(%s)\n",
|
|
|
|
|
clientName());
|
|
|
|
|
|
|
|
|
|
status = pasynManager->isConnected(pasynUser, &connected);
|
|
|
|
|
if (status != asynSuccess)
|
|
|
|
|
{
|
|
|
|
|
error("%s lockHandler: pasynManager->isConnected() failed: %s\n",
|
|
|
|
|
clientName(), pasynUser->errorMessage);
|
|
|
|
|
lockCallback(StreamIoFault);
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
if (!connected)
|
|
|
|
|
{
|
|
|
|
|
const char *portname;
|
|
|
|
|
pasynManager->getPortName(pasynUser, &portname);
|
|
|
|
|
error("%s lockHandler: asyn port %s is not connected\n",
|
|
|
|
|
clientName(), portname);
|
|
|
|
|
lockCallback(StreamIoFault);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
status = pasynManager->blockProcessCallback(pasynUser, false);
|
|
|
|
|
if (status != asynSuccess)
|
|
|
|
|
{
|
|
|
|
@ -690,15 +666,18 @@ writeHandler()
|
|
|
|
|
size_t written = 0;
|
|
|
|
|
|
|
|
|
|
pasynUser->timeout = 0;
|
|
|
|
|
if (pasynGpib)
|
|
|
|
|
pasynOctet->flush(pvtOctet, pasynUser);
|
|
|
|
|
else
|
|
|
|
|
if (!pasynGpib)
|
|
|
|
|
// discard any early input, but forward it to potential async records
|
|
|
|
|
// thus do not use pasynOctet->flush()
|
|
|
|
|
// unfortunately we cannot do this with GPIB because addressing a device as talker
|
|
|
|
|
// when it has nothing to say is an error. Also timeout=0 does not help here (would need
|
|
|
|
|
// a change in asynGPIB), thus use flush() for GPIB.
|
|
|
|
|
do {
|
|
|
|
|
char buffer [256];
|
|
|
|
|
size_t received = 0;
|
|
|
|
|
int eomReason = 0;
|
|
|
|
|
debug("AsynDriverInterface::writeHandler(%s): reading old input\n",
|
|
|
|
|
clientName());
|
|
|
|
|
status = pasynOctet->read(pvtOctet, pasynUser,
|
|
|
|
|
buffer, sizeof(buffer), &received, &eomReason);
|
|
|
|
|
if (received == 0) break;
|
|
|
|
@ -707,6 +686,12 @@ writeHandler()
|
|
|
|
|
clientName(), (long)received, StreamBuffer(buffer, received).expand()());
|
|
|
|
|
#endif
|
|
|
|
|
} while (status == asynSuccess);
|
|
|
|
|
else
|
|
|
|
|
{
|
|
|
|
|
debug("AsynDriverInterface::writeHandler(%s): flushing old input\n",
|
|
|
|
|
clientName());
|
|
|
|
|
pasynOctet->flush(pvtOctet, pasynUser);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// discard any early events
|
|
|
|
|
receivedEvent = 0;
|
|
|
|
@ -741,6 +726,12 @@ writeHandler()
|
|
|
|
|
clientName(), (long)outputSize, (long)written,
|
|
|
|
|
pasynUser->timeout, asynStatusStr[status]);
|
|
|
|
|
|
|
|
|
|
if (oldeoslen >= 0) // restore asyn terminator
|
|
|
|
|
{
|
|
|
|
|
pasynOctet->setOutputEos(pvtOctet, pasynUser,
|
|
|
|
|
oldeos, oldeoslen);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// Up to asyn 4.17 I can't see when the server has disconnected. Why?
|
|
|
|
|
int connected;
|
|
|
|
|
pasynManager->isConnected(pasynUser, &connected);
|
|
|
|
@ -754,11 +745,6 @@ writeHandler()
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (oldeoslen >= 0) // restore asyn terminator
|
|
|
|
|
{
|
|
|
|
|
pasynOctet->setOutputEos(pvtOctet, pasynUser,
|
|
|
|
|
oldeos, oldeoslen);
|
|
|
|
|
}
|
|
|
|
|
switch (status)
|
|
|
|
|
{
|
|
|
|
|
case asynSuccess:
|
|
|
|
@ -783,32 +769,34 @@ writeHandler()
|
|
|
|
|
writeCallback(StreamIoSuccess);
|
|
|
|
|
return;
|
|
|
|
|
case asynTimeout:
|
|
|
|
|
error("%s: asynTimeout (%g sec) in write. Asyn says: %s\n",
|
|
|
|
|
clientName(), pasynUser->timeout, pasynUser->errorMessage);
|
|
|
|
|
writeCallback(StreamIoTimeout);
|
|
|
|
|
return;
|
|
|
|
|
case asynOverflow:
|
|
|
|
|
error("%s: asynOverflow in write: %s\n",
|
|
|
|
|
error("%s: asynOverflow in write. Asyn driver says: %s\n",
|
|
|
|
|
clientName(), pasynUser->errorMessage);
|
|
|
|
|
writeCallback(StreamIoFault);
|
|
|
|
|
return;
|
|
|
|
|
case asynError:
|
|
|
|
|
error("%s: asynError in write: %s\n",
|
|
|
|
|
error("%s: asynError in write. Asyn driver says: %s\n",
|
|
|
|
|
clientName(), pasynUser->errorMessage);
|
|
|
|
|
writeCallback(StreamIoFault);
|
|
|
|
|
return;
|
|
|
|
|
#ifdef ASYN_VERSION // asyn >= 4.14
|
|
|
|
|
case asynDisconnected:
|
|
|
|
|
error("%s: asynDisconnected in write: %s\n",
|
|
|
|
|
error("%s: asynDisconnected in write. Asyn driver says: %s\n",
|
|
|
|
|
clientName(), pasynUser->errorMessage);
|
|
|
|
|
writeCallback(StreamIoFault);
|
|
|
|
|
return;
|
|
|
|
|
case asynDisabled:
|
|
|
|
|
error("%s: asynDisconnected in write: %s\n",
|
|
|
|
|
error("%s: asynDisconnected in write. Asyn driver says: %s\n",
|
|
|
|
|
clientName(), pasynUser->errorMessage);
|
|
|
|
|
writeCallback(StreamIoFault);
|
|
|
|
|
return;
|
|
|
|
|
#endif
|
|
|
|
|
default:
|
|
|
|
|
error("%s: unknown asyn error in write: %s\n",
|
|
|
|
|
error("%s: unknown asyn error in write. Asyn driver says: %s\n",
|
|
|
|
|
clientName(), pasynUser->errorMessage);
|
|
|
|
|
writeCallback(StreamIoFault);
|
|
|
|
|
return;
|
|
|
|
@ -1106,29 +1094,29 @@ readHandler()
|
|
|
|
|
}
|
|
|
|
|
peeksize = inputBuffer.capacity();
|
|
|
|
|
// deliver whatever we could save
|
|
|
|
|
error("%s: asynOverflow in read: %s\n",
|
|
|
|
|
error("%s: asynOverflow in read. Asyn driver says: %s\n",
|
|
|
|
|
clientName(), pasynUser->errorMessage);
|
|
|
|
|
readCallback(StreamIoFault, buffer, received);
|
|
|
|
|
break;
|
|
|
|
|
case asynError:
|
|
|
|
|
error("%s: asynError in read: %s\n",
|
|
|
|
|
error("%s: asynError in read. Asyn driver says: %s\n",
|
|
|
|
|
clientName(), pasynUser->errorMessage);
|
|
|
|
|
readCallback(StreamIoFault, buffer, received);
|
|
|
|
|
break;
|
|
|
|
|
#ifdef ASYN_VERSION // asyn >= 4.14
|
|
|
|
|
case asynDisconnected:
|
|
|
|
|
error("%s: asynDisconnected in read: %s\n",
|
|
|
|
|
error("%s: asynDisconnected in read. Asyn driver says: %s\n",
|
|
|
|
|
clientName(), pasynUser->errorMessage);
|
|
|
|
|
readCallback(StreamIoFault);
|
|
|
|
|
return;
|
|
|
|
|
case asynDisabled:
|
|
|
|
|
error("%s: asynDisconnected in read: %s\n",
|
|
|
|
|
error("%s: asynDisconnected in read. Asyn driver says: %s\n",
|
|
|
|
|
clientName(), pasynUser->errorMessage);
|
|
|
|
|
readCallback(StreamIoFault);
|
|
|
|
|
return;
|
|
|
|
|
#endif
|
|
|
|
|
default:
|
|
|
|
|
error("%s: unknown asyn error in read: %s\n",
|
|
|
|
|
error("%s: unknown asyn error in read. Asyn driver says: %s\n",
|
|
|
|
|
clientName(), pasynUser->errorMessage);
|
|
|
|
|
readCallback(StreamIoFault);
|
|
|
|
|
return;
|
|
|
|
|