Compare commits

...

12 Commits

11 changed files with 89 additions and 52 deletions

View File

@ -44,7 +44,7 @@ ifneq (${EPICS_BASETYPE},3.13)
RECORDTYPES += calcout
endif
StreamCore.o: streamReferences
StreamCore.o StreamCore.d: streamReferences
streamReferences:
perl ../src/makeref.pl Interface $(BUSSES) > $@

View File

@ -562,13 +562,7 @@ connectToAsynPort()
clientName(), connected ? "already" : "not yet");
if (!connected)
{
printf ("%s: AsynDriverInterface::connectToAsynPort: "
"pasynCommon->connect(%p, %p)\n",
clientName(), pvtCommon, pasynUser);
status = pasynCommon->connect(pvtCommon, pasynUser);
printf ("%s: AsynDriverInterface::connectToAsynPort: "
"pasynCommon->connect(%p, %p) = %s\n",
clientName(), pvtCommon, pasynUser, asynStatusStr[status]);
debug("AsynDriverInterface::connectToAsynPort(%s): "
"status=%s\n",
clientName(), asynStatusStr[status]);
@ -718,13 +712,19 @@ writeHandler()
pasynOctet->setOutputEos(pvtOctet, pasynUser,
NULL, 0);
}
pasynUser->errorMessage[0] = 0;
status = pasynOctet->write(pvtOctet, pasynUser,
outputBuffer, outputSize, &written);
#ifndef NO_TEMPORARY
debug("AsynDriverInterface::writeHandler(%s): "
"write(..., outputSize=%ld, written=%ld) "
"[timeout=%g sec] = %s\n",
clientName(), (long)outputSize, (long)written,
pasynUser->timeout, asynStatusStr[status]);
"write(..., \"%s\", outputSize=%ld, written=%ld) "
"[timeout=%g sec] = %s (%s)\n",
clientName(),
StreamBuffer(outputBuffer, outputSize).expand()(),
(long)outputSize, (long)written,
pasynUser->timeout, asynStatusStr[status],
pasynUser->errorMessage);
#endif
if (oldeoslen >= 0) // restore asyn terminator
{
@ -769,34 +769,34 @@ writeHandler()
writeCallback(StreamIoSuccess);
return;
case asynTimeout:
error("%s: asynTimeout (%g sec) in write. Asyn says: %s\n",
error("%s: asynTimeout (%g sec) in write. Asyn driver says: \"%s\"\n",
clientName(), pasynUser->timeout, pasynUser->errorMessage);
writeCallback(StreamIoTimeout);
return;
case asynOverflow:
error("%s: asynOverflow in write. Asyn driver says: %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. Asyn driver says: %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. Asyn driver says: %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. Asyn driver says: %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. Asyn driver says: %s\n",
error("%s: unknown asyn error in write. Asyn driver says: \"%s\"\n",
clientName(), pasynUser->errorMessage);
writeCallback(StreamIoFault);
return;
@ -887,6 +887,11 @@ readHandler()
oldeoslen = -1;
} else do {
// device (e.g. GPIB) might not accept full eos length
if ((int)deveoslen == oldeoslen && strcmp(deveos, oldeos) == 0)
{
// nothing to do: old and new eos are the same
break;
}
if (pasynOctet->setInputEos(pvtOctet, pasynUser,
deveos, deveoslen) == asynSuccess)
{
@ -894,8 +899,9 @@ readHandler()
if (ioAction != AsyncRead)
{
debug("AsynDriverInterface::readHandler(%s) "
"input EOS set to %s\n",
"input EOS changed from \"%s\" to \"%s\"\n",
clientName(),
StreamBuffer(oldeos, oldeoslen).expand()(),
StreamBuffer(deveos, deveoslen).expand()());
}
#endif
@ -951,6 +957,7 @@ readHandler()
readMore = 0;
received = 0;
eomReason = 0;
pasynUser->errorMessage[0] = 0;
debug("AsynDriverInterface::readHandler(%s): ioAction=%s "
"read(..., bytesToRead=%ld, ...) "
@ -959,12 +966,13 @@ readHandler()
bytesToRead, pasynUser->timeout);
status = pasynOctet->read(pvtOctet, pasynUser,
buffer, bytesToRead, &received, &eomReason);
#ifndef NO_TEMPORARY
debug("AsynDriverInterface::readHandler(%s): "
"read returned %s: ioAction=%s received=%ld, eomReason=%s, buffer=\"%s\"\n",
clientName(), asynStatusStr[status], ioActionStr[ioAction],
(long)received,eomReasonStr[eomReason&0x7],
StreamBuffer(buffer, received).expand()());
#endif
pasynManager->isConnected(pasynUser, &connected);
debug("AsynDriverInterface::readHandler(%s): "
"device is now %sconnected\n",
@ -1094,29 +1102,29 @@ readHandler()
}
peeksize = inputBuffer.capacity();
// deliver whatever we could save
error("%s: asynOverflow in read. Asyn driver says: %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. Asyn driver says: %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. Asyn driver says: %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. Asyn driver says: %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. Asyn driver says: %s\n",
error("%s: unknown asyn error in read. Asyn driver says: \"%s\"\n",
clientName(), pasynUser->errorMessage);
readCallback(StreamIoFault);
return;
@ -1138,10 +1146,16 @@ readHandler()
}
// restore original EOS
if (oldeoslen >= 0)
if (oldeoslen >= 0 && oldeoslen != (int)deveoslen && strcmp(deveos, oldeos) != 0)
{
pasynOctet->setInputEos(pvtOctet, pasynUser,
oldeos, oldeoslen);
#ifndef NO_TEMPORARY
debug("AsynDriverInterface::readHandler(%s) "
"input EOS restored to \"%s\"\n",
clientName(),
StreamBuffer(oldeos, oldeoslen).expand()());
#endif
}
}

View File

@ -223,7 +223,7 @@ static void regsubst(const StreamFormat& fmt, StreamBuffer& buffer, long start)
}
buffer.replace(start+c+ovector[0], l, s);
length += s.length() - l;
c += s.length();
c += ovector[0] + s.length();
if (n == fmt.prec) // max match reached
return;
}

View File

@ -296,7 +296,7 @@ StreamBuffer StreamBuffer::expand(ssize_t start, ssize_t length) const
for (i = start; i < end; i++)
{
c = buffer[i];
if ((c & 0x7f) < 0x20 || (c & 0x7f) == 0x7f)
if (c < 0x20 || c >= 0x7f)
{
result.print("<%02x>", c & 0xff);
}

View File

@ -460,7 +460,7 @@ finishProtocol(ProtocolResult status)
status = Fault;
}
//// flags &= ~(AcceptInput|AcceptEvent);
if (runningHandler)
if (runningHandler || flags & InitRun)
{
// get original error status
if (status == Success) status = runningHandler;

View File

@ -196,8 +196,12 @@ extern "C" long streamReload(char* recordname)
dbCommon* record;
long status;
int oldStreamError = streamError;
streamError = 1;
if(!pdbbase) {
error("No database has been loaded\n");
streamError = oldStreamError;
return ERROR;
}
debug("streamReload(%s)\n", recordname);
@ -234,6 +238,7 @@ extern "C" long streamReload(char* recordname)
}
dbFinishEntry(&dbentry);
StreamProtocolParser::free();
streamError = oldStreamError;
return OK;
}
@ -408,6 +413,7 @@ long streamInit(int after)
{
if (after)
{
streamError = 0; // Switch off errors after init in order not to spam messages when a device is down.
StreamProtocolParser::free();
}
return OK;

View File

@ -23,7 +23,7 @@
#include <stdio.h>
int streamDebug = 0;
int streamError = 0;
int streamError = 1;
extern "C" {
#ifdef _WIN32
__declspec(dllexport)

View File

@ -512,20 +512,31 @@ Each time newline is read, line is incremented.
buffer(token));
return false;
}
if (c == '$' && buffer[-1] == '\\')
{
// quoted variable reference
// terminate string here and do variable in next pass
buffer[-1] = quote;
ungetc(c, file);
break;
}
buffer.append(c);
if (c == quote && buffer[-2] != '\\')
if (c == quote)
{
quote = false;
break;
}
if (c == '\\')
{
c = getc(file);
if (c == '$')
{
// quoted variable reference
// terminate string here and do variable in next pass
buffer[-1] = quote;
ungetc(c, file);
break;
}
if (c == EOF || c == '\n')
{
error(line, filename(), "Backslash at end of line: %s\n",
buffer(token));
return false;
}
buffer.append(c);
}
c = getc(file);
}
buffer.append('\0').append(&l, sizeof(l)); // append line number

View File

@ -23,7 +23,7 @@
#define STREAM_MAJOR 2
#define STREAM_MINOR 7
#define STREAM_PATCHLEVEL 8
#define STREAM_PATCHLEVEL 12
#if defined(__vxworks) || defined(vxWorks)
#include <vxWorks.h>
@ -58,7 +58,6 @@ extern "C" {
#include <dbCommon.h>
#include <dbScan.h>
#include <devSup.h>
/* #include <dbFldTypes.h> */
#include <dbAccess.h>
#ifdef devStream_epicsExportSharedSymbols

View File

@ -55,11 +55,14 @@ static long readData (dbCommon *record, format_t *format)
ai->rval = rval;
if (ai->linr == menuConvertNO_CONVERSION)
{
/* allow more bits than 32 */
/* allow integers with more than 32 bits */
double val;
if (format->type == DBF_ULONG)
ai->val = (unsigned long)rval;
val = (unsigned long)rval;
else
ai->val = rval;
val = rval;
if (ai->aslo != 0.0 && ai->aslo != 1.0) val *= ai->aslo;
ai->val = val + ai->aoff;
return DO_NOT_CONVERT;
}
return OK;

View File

@ -46,11 +46,14 @@ static long readData (dbCommon *record, format_t *format)
ao->rval = rval;
if (ao->linr == menuConvertNO_CONVERSION)
{
/* allow more bits than 32 */
/* allow integers with more than 32 bits */
double val;
if (format->type == DBF_ULONG)
ao->val = (unsigned long)rval;
val = (unsigned long)rval;
else
ao->val = rval;
val = rval;
if (ao->aslo != 0.0 && ao->aslo != 1.0) val *= ao->aslo;
ao->val = val + ao->aoff;
return DO_NOT_CONVERT;
}
return OK;
@ -63,20 +66,21 @@ static long writeData (dbCommon *record, format_t *format)
{
aoRecord *ao = (aoRecord *) record;
double val = (INIT_RUN ? ao->val : ao->oval) - ao->aoff;
if (ao->aslo != 0.0 && ao->aslo != 1.0) val /= ao->aslo;
switch (format->type)
{
case DBF_DOUBLE:
{
double val = (INIT_RUN ? ao->val : ao->oval) - ao->aoff;
if (ao->aslo != 0.0 && ao->aslo != 1.0) val /= ao->aslo;
return streamPrintf (record, format, val);
}
case DBF_ULONG:
{
if (ao->linr == menuConvertNO_CONVERSION)
{
/* allow more bits than 32 */
return streamPrintf (record, format, (unsigned long)(INIT_RUN ? ao->val : ao->oval));
/* allow integers with more than 32 bits */
return streamPrintf (record, format, (unsigned long)val);
}
return streamPrintf (record, format, (unsigned long)ao->rval);
}
@ -84,8 +88,8 @@ static long writeData (dbCommon *record, format_t *format)
{
if (ao->linr == menuConvertNO_CONVERSION)
{
/* allow more bits than 32 */
return streamPrintf (record, format, (long)(INIT_RUN ? ao->val : ao->oval));
/* allow integers with more than 32 bits */
return streamPrintf (record, format, (long)val);
}
return streamPrintf (record, format, (long)ao->rval);
}