Compare commits

..

11 Commits

10 changed files with 187 additions and 168 deletions

View File

@ -205,7 +205,7 @@ class AsynDriverInterface : StreamBusInterface
void connectHandler();
void disconnectHandler();
bool connectToAsynPort();
void asynReadHandler(const char *data, int numchars, int eomReason);
void asynReadHandler(const char *data, size_t numchars, int eomReason);
asynQueuePriority priority() {
return static_cast<asynQueuePriority>
(StreamBusInterface::priority());
@ -502,6 +502,26 @@ connectToAsynPort()
clientName(), pasynUser->errorMessage);
return false;
}
// Is it really connected?
if (connected && !pasynGpib)
{
size_t received;
int eomReason;
char buffer[8];
pasynUser->timeout = 0.0;
status = pasynOctet->read(pvtOctet, pasynUser,
buffer, 0, &received, &eomReason);
debug("AsynDriverInterface::connectToAsynPort(%s): "
"read(..., 0, ...) [timeout=%f seconds] = %s\n",
clientName(), pasynUser->timeout,
asynStatusStr[status]);
pasynManager->isConnected(pasynUser, &connected);
debug("AsynDriverInterface::connectToAsynPort(%s): "
"device was %sconnected!\n",
clientName(),connected?"":"dis");
}
debug("AsynDriverInterface::connectToAsynPort(%s) is %s connected\n",
clientName(), connected ? "already" : "not yet");
if (!connected)
@ -622,6 +642,25 @@ writeHandler()
}
status = pasynOctet->write(pvtOctet, pasynUser,
outputBuffer, outputSize, &written);
debug("AsynDriverInterface::writeHandler(%s): "
"write(..., outputSize=%ld, written=%ld) "
"[timeout=%f seconds] = %s\n",
clientName(), (long)outputSize, (long)written,
pasynUser->timeout, asynStatusStr[status]);
// Up to asyn 4.17 I can't see when the server has disconnected. Why?
int connected;
pasynManager->isConnected(pasynUser, &connected);
debug("AsynDriverInterface::writeHandler(%s): "
"device is %sconnected\n",
clientName(),connected?"":"dis");
if (!connected) {
error("%s: connection closed in write\n",
clientName());
writeCallback(StreamIoFault);
return;
}
if (oldeoslen >= 0) // restore asyn terminator
{
pasynOctet->setOutputEos(pvtOctet, pasynUser,
@ -778,7 +817,7 @@ readHandler()
} while (deveoslen);
}
int bytesToRead = peeksize;
long bytesToRead = peeksize;
long buffersize;
if (expectedLength > 0)
@ -812,6 +851,7 @@ readHandler()
int eomReason;
asynStatus status;
long readMore;
int connected;
while (1)
{
@ -824,9 +864,20 @@ readHandler()
if (ioAction == Read || status != asynTimeout)
{
debug("AsynDriverInterface::readHandler(%s): "
"read(..., bytesToRead=%d, ...) [timeout=%f seconds] = %s\n",
clientName(), bytesToRead, pasynUser->timeout,
asynStatusStr[status]);
"read(..., bytesToRead=%ld, received=%ld...) "
"[timeout=%f seconds] = %s\n",
clientName(), bytesToRead, (long)received,
pasynUser->timeout, asynStatusStr[status]);
}
pasynManager->isConnected(pasynUser, &connected);
debug("AsynDriverInterface::readHandler(%s): "
"device is %sconnected\n",
clientName(),connected?"":"dis");
if (!connected) {
error("%s: connection closed in read\n",
clientName());
readCallback(StreamIoFault);
return;
}
// pasynOctet->read() has already cut off terminator.
@ -847,10 +898,10 @@ readHandler()
{
#ifndef NO_TEMPORARY
debug("AsynDriverInterface::readHandler(%s): "
"AsyncRead poll: received %d of %d bytes \"%s\" "
"AsyncRead poll: received %ld of %ld bytes \"%s\" "
"eomReason=%s [data ignored]\n",
clientName(), (int)received, bytesToRead,
StreamBuffer(buffer, (int)received).expand()(),
clientName(), (long)received, bytesToRead,
StreamBuffer(buffer, received).expand()(),
eomReasonStr[eomReason&0x7]);
#endif
// ignore what we got from here.
@ -861,10 +912,10 @@ readHandler()
}
#ifndef NO_TEMPORARY
debug("AsynDriverInterface::readHandler(%s): "
"received %d of %d bytes \"%s\" "
"received %ld of %ld bytes \"%s\" "
"eomReason=%s\n",
clientName(), (int)received, bytesToRead,
StreamBuffer(buffer, (int)received).expand()(),
clientName(), (long)received, bytesToRead,
StreamBuffer(buffer, received).expand()(),
eomReasonStr[eomReason&0x7]);
#endif
// asynOctet->read() cuts off terminator, but:
@ -920,9 +971,10 @@ readHandler()
// read timeout
#ifndef NO_TEMPORARY
debug("AsynDriverInterface::readHandler(%s): "
"ioAction=%s, timeout [%f seconds] after %d of %d bytes \"%s\"\n",
"ioAction=%s, timeout [%f seconds] "
"after %ld of %ld bytes \"%s\"\n",
clientName(), ioActionStr[ioAction], pasynUser->timeout,
(int)received, bytesToRead,
(long)received, bytesToRead,
StreamBuffer(buffer, received).expand()());
#endif
if (ioAction == AsyncRead || ioAction == AsyncReadMore)
@ -959,18 +1011,18 @@ readHandler()
case asynDisconnected:
error("%s: asynDisconnected in read: %s\n",
clientName(), pasynUser->errorMessage);
writeCallback(StreamIoFault);
readCallback(StreamIoFault);
return;
case asynDisabled:
error("%s: asynDisconnected in read: %s\n",
clientName(), pasynUser->errorMessage);
writeCallback(StreamIoFault);
readCallback(StreamIoFault);
return;
#endif
default:
error("%s: unknown asyn error in read: %s\n",
clientName(), pasynUser->errorMessage);
writeCallback(StreamIoFault);
readCallback(StreamIoFault);
return;
}
if (!readMore) break;
@ -983,7 +1035,7 @@ readHandler()
bytesToRead = inputBuffer.capacity();
}
debug("AsynDriverInterface::readHandler(%s) "
"readMore=%ld bytesToRead=%d\n",
"readMore=%ld bytesToRead=%ld\n",
clientName(), readMore, bytesToRead);
pasynUser->timeout = readTimeout;
waitForReply = false;
@ -1015,7 +1067,7 @@ void intrCallbackOctet(void* /*pvt*/, asynUser *pasynUser,
// get asynchronous input
void AsynDriverInterface::
asynReadHandler(const char *buffer, int received, int eomReason)
asynReadHandler(const char *buffer, size_t received, int eomReason)
{
// Due to multithreading, timerExpired() might come at any time.
// It queues the next poll request which is now useless because
@ -1031,9 +1083,9 @@ asynReadHandler(const char *buffer, int received, int eomReason)
#ifndef NO_TEMPORARY
debug("AsynDriverInterface::asynReadHandler(%s, buffer=\"%s\", "
"received=%d eomReason=%s) ioAction=%s\n",
"received=%ld eomReason=%s) ioAction=%s\n",
clientName(), StreamBuffer(buffer, received).expand()(),
received, eomReasonStr[eomReason&0x7], ioActionStr[ioAction]);
(long)received, eomReasonStr[eomReason&0x7], ioActionStr[ioAction]);
#endif
ioAction = None;
@ -1089,7 +1141,7 @@ asynReadHandler(const char *buffer, int received, int eomReason)
// set by stream, cut it off now.
status = pasynOctet->getInputEos(pvtOctet,
pasynUser, deveos, sizeof(deveos)-1, &deveoslen);
if (status == asynSuccess && received >= deveoslen)
if (status == asynSuccess && (long)received >= (long)deveoslen)
{
int i;
for (i = 1; i <= deveoslen; i++)

View File

@ -109,7 +109,7 @@ grow(long minsize)
memset(newbuffer+len, 0, newcap-len);
if (buffer != local)
{
delete buffer;
delete [] buffer;
}
buffer = newbuffer;
cap = newcap;
@ -219,7 +219,7 @@ replace(long remstart, long remlen, const void* ins, long inslen)
memset(newbuffer+newlen, 0, newcap-newlen);
if (buffer != local)
{
delete buffer;
delete [] buffer;
}
buffer = newbuffer;
cap = newcap;

View File

@ -825,10 +825,16 @@ lockCallback(StreamIoStatus status)
}
flags &= ~LockPending;
flags |= BusOwner;
if (status != StreamIoSuccess)
switch (status)
{
finishProtocol(LockTimeout);
return;
case StreamIoSuccess:
break;
case StreamIoTimeout:
finishProtocol(LockTimeout);
return;
default:
finishProtocol(Fault);
return;
}
flags |= WritePending;
if (!busWriteRequest(outputLine(), outputLine.length(), writeTimeout))

View File

@ -690,6 +690,7 @@ process()
debug("Stream::process(%s): could not start, status=%d\n",
name(), status);
(void) recGblSetSevr(record, status, INVALID_ALARM);
record->pact = false;
return false;
}
debug("Stream::process(%s): protocol started\n", name());
@ -1053,30 +1054,43 @@ matchValue(const StreamFormat& format, const void* fieldaddress)
buffer = fieldBuffer.clear().reserve(size);
for (nord = 0; nord < nelem; nord++)
{
debug("Stream::matchValue(%s): buffer before: %s\n", name(), fieldBuffer.expand()());
switch (format.type)
{
case long_format:
{
consumed = scanValue(format, lval);
if (consumed >= 0) ((epicsInt32*)buffer)[nord] = lval;
debug("Stream::matchValue(%s): %s[%li] = %li\n",
name(), pdbaddr->precord->name, nord, lval);
break;
}
case enum_format:
{
consumed = scanValue(format, lval);
if (consumed >= 0) ((epicsUInt16*)buffer)[nord] = (epicsUInt16)lval;
debug("Stream::matchValue(%s): %s[%li] = %li\n",
name(), pdbaddr->precord->name, nord, lval);
break;
}
case double_format:
{
consumed = scanValue(format, dval);
if (consumed >= 0) ((epicsFloat64*)buffer)[nord] = dval;
// Direct assignment to buffer fails fith gcc 3.4.3 for xscale_be
// Optimization bug?
epicsFloat64 f64=dval;
if (consumed >= 0) memcpy(((epicsFloat64*)buffer)+nord, &f64, sizeof(f64));
debug("Stream::matchValue(%s): %s[%li] = %#g %#g\n",
name(), pdbaddr->precord->name, nord, dval,
((epicsFloat64*)buffer)[nord]);
break;
}
case string_format:
{
consumed = scanValue(format,
buffer+MAX_STRING_SIZE*nord, MAX_STRING_SIZE);
debug("Stream::matchValue(%s): %s[%li] = \"%.*s\"\n",
name(), pdbaddr->precord->name, nord, MAX_STRING_SIZE, buffer+MAX_STRING_SIZE*nord);
break;
}
default:
@ -1084,6 +1098,7 @@ matchValue(const StreamFormat& format, const void* fieldaddress)
"Illegal format type\n", name());
return false;
}
debug("Stream::matchValue(%s): buffer after: %s\n", name(), fieldBuffer.expand()());
if (consumed < 0) break;
consumedInput += consumed;
}
@ -1127,12 +1142,13 @@ matchValue(const StreamFormat& format, const void* fieldaddress)
{
// write into own record, thus don't process it
// in @init we must not process other record
debug("Stream::matchValue(%s): dbPut(%s.%s,...)\n",
debug("Stream::matchValue(%s): dbPut(%s.%s,%s)\n",
name(),
pdbaddr->precord->name,
((dbFldDes*)pdbaddr->pfldDes)->name);
((dbFldDes*)pdbaddr->pfldDes)->name,
fieldBuffer.expand()());
putfunc = "dbPut";
status = dbPut(pdbaddr, dbfMapping[format.type], fieldBuffer(), nord);
status = dbPut(pdbaddr, dbfMapping[format.type], buffer, nord);
if (INIT_RUN && pdbaddr->precord != record)
{
// clean error status of other record in @init
@ -1144,12 +1160,13 @@ matchValue(const StreamFormat& format, const void* fieldaddress)
else
{
// write into other record, thus process it
debug("Stream::matchValue(%s): dbPutField(%s.%s,...)\n",
debug("Stream::matchValue(%s): dbPutField(%s.%s,%s)\n",
name(),
pdbaddr->precord->name,
((dbFldDes*)pdbaddr->pfldDes)->name);
((dbFldDes*)pdbaddr->pfldDes)->name,
fieldBuffer.expand()());
putfunc = "dbPutField";
status = dbPutField(pdbaddr, dbfMapping[format.type], fieldBuffer(), nord);
status = dbPutField(pdbaddr, dbfMapping[format.type], buffer, nord);
}
if (status != 0)
{

View File

@ -44,10 +44,10 @@ static long readData (dbCommon *record, format_t *format)
switch (aai->ftvl)
{
case DBF_DOUBLE:
((double *)aai->bptr)[aai->nord] = dval;
((epicsFloat64 *)aai->bptr)[aai->nord] = (epicsFloat64)dval;
break;
case DBF_FLOAT:
((float *)aai->bptr)[aai->nord] = (float)dval;
((epicsFloat32 *)aai->bptr)[aai->nord] = (epicsFloat32)dval;
break;
default:
errlogSevPrintf (errlogFatal,
@ -67,23 +67,23 @@ static long readData (dbCommon *record, format_t *format)
switch (aai->ftvl)
{
case DBF_DOUBLE:
((double *)aai->bptr)[aai->nord] = lval;
((epicsFloat64 *)aai->bptr)[aai->nord] = (epicsFloat64)lval;
break;
case DBF_FLOAT:
((float *)aai->bptr)[aai->nord] = (float)lval;
((epicsFloat32 *)aai->bptr)[aai->nord] = (epicsFloat32)lval;
break;
case DBF_LONG:
case DBF_ULONG:
((long *)aai->bptr)[aai->nord] = lval;
((epicsInt32 *)aai->bptr)[aai->nord] = (epicsInt32)lval;
break;
case DBF_SHORT:
case DBF_USHORT:
case DBF_ENUM:
((short *)aai->bptr)[aai->nord] = (short)lval;
((epicsInt16 *)aai->bptr)[aai->nord] = (epicsInt16)lval;
break;
case DBF_CHAR:
case DBF_UCHAR:
((char *)aai->bptr)[aai->nord] = (char)lval;
((epicsInt8 *)aai->bptr)[aai->nord] = (epicsInt8)lval;
break;
default:
errlogSevPrintf (errlogFatal,
@ -157,29 +157,29 @@ static long writeData (dbCommon *record, format_t *format)
switch (aai->ftvl)
{
case DBF_DOUBLE:
dval = ((double *)aai->bptr)[nowd];
dval = ((epicsFloat64 *)aai->bptr)[nowd];
break;
case DBF_FLOAT:
dval = ((float *)aai->bptr)[nowd];
dval = ((epicsFloat32 *)aai->bptr)[nowd];
break;
case DBF_LONG:
dval = ((long *)aai->bptr)[nowd];
dval = ((epicsInt32 *)aai->bptr)[nowd];
break;
case DBF_ULONG:
dval = ((unsigned long *)aai->bptr)[nowd];
dval = ((epicsUInt32 *)aai->bptr)[nowd];
break;
case DBF_SHORT:
dval = ((short *)aai->bptr)[nowd];
dval = ((epicsInt16 *)aai->bptr)[nowd];
break;
case DBF_USHORT:
case DBF_ENUM:
dval = ((unsigned short *)aai->bptr)[nowd];
dval = ((epicsUInt16 *)aai->bptr)[nowd];
break;
case DBF_CHAR:
dval = ((char *)aai->bptr)[nowd];
dval = ((epicsInt8 *)aai->bptr)[nowd];
break;
case DBF_UCHAR:
dval = ((unsigned char *)aai->bptr)[nowd];
dval = ((epicsUInt8 *)aai->bptr)[nowd];
break;
default:
errlogSevPrintf (errlogFatal,
@ -197,21 +197,23 @@ static long writeData (dbCommon *record, format_t *format)
switch (aai->ftvl)
{
case DBF_LONG:
lval = ((epicsInt32 *)aai->bptr)[nowd];
break;
case DBF_ULONG:
lval = ((long *)aai->bptr)[nowd];
lval = ((epicsUInt32 *)aai->bptr)[nowd];
break;
case DBF_SHORT:
lval = ((short *)aai->bptr)[nowd];
lval = ((epicsInt16 *)aai->bptr)[nowd];
break;
case DBF_USHORT:
case DBF_ENUM:
lval = ((unsigned short *)aai->bptr)[nowd];
lval = ((epicsUInt16 *)aai->bptr)[nowd];
break;
case DBF_CHAR:
lval = ((char *)aai->bptr)[nowd];
lval = ((epicsInt8 *)aai->bptr)[nowd];
break;
case DBF_UCHAR:
lval = ((unsigned char *)aai->bptr)[nowd];
lval = ((epicsUInt8 *)aai->bptr)[nowd];
break;
default:
errlogSevPrintf (errlogFatal,

View File

@ -44,10 +44,10 @@ static long readData (dbCommon *record, format_t *format)
switch (aao->ftvl)
{
case DBF_DOUBLE:
((double *)aao->bptr)[aao->nord] = dval;
((epicsFloat64 *)aao->bptr)[aao->nord] = (epicsFloat64)dval;
break;
case DBF_FLOAT:
((float *)aao->bptr)[aao->nord] = (float)dval;
((epicsFloat32 *)aao->bptr)[aao->nord] = (epicsFloat32)dval;
break;
default:
errlogSevPrintf (errlogFatal,
@ -67,23 +67,23 @@ static long readData (dbCommon *record, format_t *format)
switch (aao->ftvl)
{
case DBF_DOUBLE:
((double *)aao->bptr)[aao->nord] = lval;
((epicsFloat64 *)aao->bptr)[aao->nord] = (epicsFloat64)lval;
break;
case DBF_FLOAT:
((float *)aao->bptr)[aao->nord] = (float)lval;
((epicsFloat32 *)aao->bptr)[aao->nord] = (epicsFloat32)lval;
break;
case DBF_LONG:
case DBF_ULONG:
((long *)aao->bptr)[aao->nord] = lval;
((epicsInt32 *)aao->bptr)[aao->nord] = (epicsInt32)lval;
break;
case DBF_SHORT:
case DBF_USHORT:
case DBF_ENUM:
((short *)aao->bptr)[aao->nord] = (short)lval;
((epicsInt16 *)aao->bptr)[aao->nord] = (epicsInt16)lval;
break;
case DBF_CHAR:
case DBF_UCHAR:
((char *)aao->bptr)[aao->nord] = (char)lval;
((epicsInt8 *)aao->bptr)[aao->nord] = (epicsInt8)lval;
break;
default:
errlogSevPrintf (errlogFatal,
@ -157,29 +157,29 @@ static long writeData (dbCommon *record, format_t *format)
switch (aao->ftvl)
{
case DBF_DOUBLE:
dval = ((double *)aao->bptr)[nowd];
dval = ((epicsFloat64 *)aao->bptr)[nowd];
break;
case DBF_FLOAT:
dval = ((float *)aao->bptr)[nowd];
dval = ((epicsFloat32 *)aao->bptr)[nowd];
break;
case DBF_LONG:
dval = ((long *)aao->bptr)[nowd];
dval = ((epicsInt32 *)aao->bptr)[nowd];
break;
case DBF_ULONG:
dval = ((unsigned long *)aao->bptr)[nowd];
dval = ((epicsUInt32 *)aao->bptr)[nowd];
break;
case DBF_SHORT:
dval = ((short *)aao->bptr)[nowd];
dval = ((epicsInt16 *)aao->bptr)[nowd];
break;
case DBF_USHORT:
case DBF_ENUM:
dval = ((unsigned short *)aao->bptr)[nowd];
dval = ((epicsUInt16 *)aao->bptr)[nowd];
break;
case DBF_CHAR:
dval = ((char *)aao->bptr)[nowd];
dval = ((epicsInt8 *)aao->bptr)[nowd];
break;
case DBF_UCHAR:
dval = ((unsigned char *)aao->bptr)[nowd];
dval = ((epicsUInt8 *)aao->bptr)[nowd];
break;
default:
errlogSevPrintf (errlogFatal,
@ -197,21 +197,23 @@ static long writeData (dbCommon *record, format_t *format)
switch (aao->ftvl)
{
case DBF_LONG:
lval = ((epicsInt32 *)aao->bptr)[nowd];
break;
case DBF_ULONG:
lval = ((long *)aao->bptr)[nowd];
lval = ((epicsUInt32 *)aao->bptr)[nowd];
break;
case DBF_SHORT:
lval = ((short *)aao->bptr)[nowd];
lval = ((epicsInt16 *)aao->bptr)[nowd];
break;
case DBF_USHORT:
case DBF_ENUM:
lval = ((unsigned short *)aao->bptr)[nowd];
lval = ((epicsUInt16 *)aao->bptr)[nowd];
break;
case DBF_CHAR:
lval = ((char *)aao->bptr)[nowd];
lval = ((epicsInt8 *)aao->bptr)[nowd];
break;
case DBF_UCHAR:
lval = ((unsigned char *)aao->bptr)[nowd];
lval = ((epicsUInt8 *)aao->bptr)[nowd];
break;
default:
errlogSevPrintf (errlogFatal,

View File

@ -44,10 +44,10 @@ static long readData (dbCommon *record, format_t *format)
switch (wf->ftvl)
{
case DBF_DOUBLE:
((double *)wf->bptr)[wf->nord] = dval;
((epicsFloat64 *)wf->bptr)[wf->nord] = (epicsFloat64)dval;
break;
case DBF_FLOAT:
((float *)wf->bptr)[wf->nord] = (float)dval;
((epicsFloat32 *)wf->bptr)[wf->nord] = (epicsFloat32)dval;
break;
default:
errlogSevPrintf (errlogFatal,
@ -67,23 +67,23 @@ static long readData (dbCommon *record, format_t *format)
switch (wf->ftvl)
{
case DBF_DOUBLE:
((double *)wf->bptr)[wf->nord] = (double)lval;
((epicsFloat64 *)wf->bptr)[wf->nord] = (epicsFloat64)lval;
break;
case DBF_FLOAT:
((float *)wf->bptr)[wf->nord] = (float)lval;
((epicsFloat32 *)wf->bptr)[wf->nord] = (epicsFloat32)lval;
break;
case DBF_LONG:
case DBF_ULONG:
((long *)wf->bptr)[wf->nord] = lval;
((epicsInt32 *)wf->bptr)[wf->nord] = (epicsInt32)lval;
break;
case DBF_SHORT:
case DBF_USHORT:
case DBF_ENUM:
((short *)wf->bptr)[wf->nord] = (short)lval;
((epicsInt16 *)wf->bptr)[wf->nord] = (epicsInt16)lval;
break;
case DBF_CHAR:
case DBF_UCHAR:
((char *)wf->bptr)[wf->nord] = (char)lval;
((epicsInt8 *)wf->bptr)[wf->nord] = (epicsInt8)lval;
break;
default:
errlogSevPrintf (errlogFatal,
@ -157,29 +157,29 @@ static long writeData (dbCommon *record, format_t *format)
switch (wf->ftvl)
{
case DBF_DOUBLE:
dval = ((double *)wf->bptr)[nowd];
dval = ((epicsFloat64 *)wf->bptr)[nowd];
break;
case DBF_FLOAT:
dval = ((float *)wf->bptr)[nowd];
dval = ((epicsFloat32 *)wf->bptr)[nowd];
break;
case DBF_LONG:
dval = ((long *)wf->bptr)[nowd];
dval = ((epicsInt32 *)wf->bptr)[nowd];
break;
case DBF_ULONG:
dval = ((unsigned long *)wf->bptr)[nowd];
dval = ((epicsUInt32 *)wf->bptr)[nowd];
break;
case DBF_SHORT:
dval = ((short *)wf->bptr)[nowd];
dval = ((epicsInt16 *)wf->bptr)[nowd];
break;
case DBF_USHORT:
case DBF_ENUM:
dval = ((unsigned short *)wf->bptr)[nowd];
dval = ((epicsUInt16 *)wf->bptr)[nowd];
break;
case DBF_CHAR:
dval = ((char *)wf->bptr)[nowd];
dval = ((epicsInt8 *)wf->bptr)[nowd];
break;
case DBF_UCHAR:
dval = ((unsigned char *)wf->bptr)[nowd];
dval = ((epicsUInt8 *)wf->bptr)[nowd];
break;
default:
errlogSevPrintf (errlogFatal,
@ -197,21 +197,23 @@ static long writeData (dbCommon *record, format_t *format)
switch (wf->ftvl)
{
case DBF_LONG:
lval = ((epicsInt32 *)wf->bptr)[nowd];
break;
case DBF_ULONG:
lval = ((long *)wf->bptr)[nowd];
lval = ((epicsUInt32 *)wf->bptr)[nowd];
break;
case DBF_SHORT:
lval = ((short *)wf->bptr)[nowd];
lval = ((epicsInt16 *)wf->bptr)[nowd];
break;
case DBF_USHORT:
case DBF_ENUM:
lval = ((unsigned short *)wf->bptr)[nowd];
lval = ((epicsUInt16 *)wf->bptr)[nowd];
break;
case DBF_CHAR:
lval = ((char *)wf->bptr)[nowd];
lval = ((epicsInt8 *)wf->bptr)[nowd];
break;
case DBF_UCHAR:
lval = ((unsigned char *)wf->bptr)[nowd];
lval = ((epicsUInt8 *)wf->bptr)[nowd];
break;
default:
errlogSevPrintf (errlogFatal,

View File

@ -48,6 +48,16 @@ endif
streamApp_DBD += stream.dbd
ifdef PCRE
LIB_LIBS += pcre
else
ifneq ($(words $(PCRE_LIB) $(PCRE_INCLUDE)),0)
PROD_SYS_LIBS_DEFAULT += pcre
PROD_SYS_LIBS_WIN32 += $(PCRE_LIB)\\pcre
SHRLIB_DEPLIB_DIRS += $(PCRE_LIB)
endif
endif
PROD_LIBS += $(EPICS_BASE_IOC_LIBS)
# Write StreamDevice debug output to this file

View File

@ -74,6 +74,9 @@ proc receiveHandler {sock} {
set l [split $a]
if [catch {
switch -- [lindex $l 0] {
"exit" {
exit
}
"disconnect" {
sendReply $sock [string range $a 11 end]
destroy .$sock

View File

@ -1,75 +0,0 @@
#!/usr/bin/env tclsh
source streamtestlib.tcl
# Define records, protocol and startup (text goes to files)
# The asynPort "dummy" is not connected to any I/O
# Send commands to the ioc shell with ioccmd
set records {
record (ao, "DZ:test1")
{
field (DTYP, "stream")
field (OUT, "@test.proto test1 dummy")
}
}
set protocol {
Terminator = LF;
test1 {exec "dbpr %(NAME)s %i >testDummyInterface.out";}
}
set startup {
}
set debug 0
startioc
ioccmd {dbpf DZ:test1 3}
after 1000
if [catch {
set fd [open testDummyInterface.out]
set output [read $fd]
close $fd
} msg] {
puts stderr $msg
incr faults
}
set expected {ACKS: NO_ALARM ACKT: YES ADEL: 0 ALST: 0
AOFF: 0 ASG: ASLO: 0 BKPT: 00
DESC: DISA: 0 DISP: 0 DISS: NO_ALARM
DISV: 1 DOL:CONSTANT DRVH: 0 DRVL: 0
DTYP: stream EGU: EGUF: 0 EGUL: 0
EOFF: 0 ESLO: 1 EVNT: 0 FLNK:CONSTANT 0
HHSV: NO_ALARM HIGH: 0 HIHI: 0 HOPR: 0
HSV: NO_ALARM HYST: 0 INIT: 1
IVOA: Continue normally IVOV: 0 LALM: 3
LBRK: 0 LCNT: 0 LINR: NO CONVERSION LLSV: NO_ALARM
LOLO: 0 LOPR: 0 LOW: 0 LSV: NO_ALARM
MDEL: 0 MLST: 0 NAME: DZ:test1 NSEV: NO_ALARM
NSTA: NO_ALARM OIF: Full OMOD: 1 OMSL: supervisory
ORAW: 0 ORBV: 0 OROC: 0
OUT:INST_IO @test.proto test1 dummy OVAL: 3 PACT: 1
PHAS: 0 PINI: NO PREC: 0 PRIO: LOW
PROC: 0 PUTF: 1 PVAL: 3 RBV: 0
ROFF: 0 RPRO: 0 RVAL: 3 SCAN: Passive
SDIS:CONSTANT SEVR: INVALID SIML:CONSTANT SIMM: NO
SIMS: NO_ALARM SIOL:CONSTANT STAT: UDF TIME: <undefined>
TPRO: 0 TSE: 0 TSEL:CONSTANT UDF: 0
VAL: 3
}
if {"$output" != "$expected"} {
puts stderr "Wrong output:"
puts stderr "$output"
puts stderr "instead of:"
puts stderr "$expected"
incr faults
} else {
file delete testDummyInterface.out
}
finish