Compare commits

...

12 Commits
2.8.5 ... 2.8.6

9 changed files with 42 additions and 47 deletions

View File

@ -32,9 +32,8 @@ HEADERS += StreamError.h
StreamCore.o StreamCore.d: streamReferences StreamCore.o StreamCore.d: streamReferences
# Update version string (contains __DATE__ and __TIME__) # Update version string (contains __DATE__ and __TIME__)
# each time make runs. # each time anything changes.
StreamVersion.o: FORCE StreamVersion.o: $(filter-out StreamVersion.o stream_exportAddress.o,$(LIBOBJS))
FORCE:
streamReferences: streamReferences:
$(PERL) ../src/makeref.pl Interface $(BUSSES) > $@ $(PERL) ../src/makeref.pl Interface $(BUSSES) > $@

View File

@ -14,14 +14,21 @@ TEMPLATE_TOP=$(EPICS_BASE)/templates/makeBaseApp/top
# define INSTALL_LOCATION_APP here # define INSTALL_LOCATION_APP here
#INSTALL_LOCATION_APP=<fullpathname> #INSTALL_LOCATION_APP=<fullpathname>
# For SynApps:
RELEASE=
EPICS_BASE=/usr/local/epics/base-3.16.1 EPICS_BASE=/usr/local/epics/base-7.0.1
ASYN=~/top-3.16/asyn4-30 ASYN=~/top-7/asyn4-33
CALC=~/top-3.16/SynApps/calc-2-8 CALC=~/top-7/SynApps/calc-2-8
PCRE=~/top-3.16/pcre-7-2 PCRE=~/top-7/pcre-7-2
PCRE_INCLUDE_SL6-x86=/usr/include
PCRE_INCLUDE_SL6-x86_64=/usr/include #EPICS_BASE=/usr/local/epics/base-3.16.1
PCRE_INCLUDE_SL6-x86_64-clang=/usr/include #ASYN=~/top-3.16/asyn4-30
#CALC=~/top-3.16/SynApps/calc-2-8
#PCRE=~/top-3.16/pcre-7-2
#PCRE_INCLUDE_SL6-x86=/usr/include
#PCRE_INCLUDE_SL6-x86_64=/usr/include
#PCRE_INCLUDE_SL6-x86_64-clang=/usr/include
#EPICS_BASE=/usr/local/epics/base-3.15.5 #EPICS_BASE=/usr/local/epics/base-3.15.5
#ASYN=~/top-3.15/asyn4-30 #ASYN=~/top-3.15/asyn4-30

View File

@ -98,7 +98,7 @@ come in a predictible order to be parsable by <em>StreamDevice</em>.
IOC Application Developer's Guide: IOC Application Developer's Guide:
<a href="https://epics.anl.gov/base/R3-14/12-docs/AppDevGuide/" <a href="https://epics.anl.gov/base/R3-14/12-docs/AppDevGuide/"
target="ex">R3.14.12</a>, target="ex">R3.14.12</a>,
<a href="https://epics.anl.gov/base/R3-15/5-docs/AppDevGuide/AppDevGuide.html" <a href="https://epics.anl.gov/base/R3-15/6-docs/AppDevGuide/AppDevGuide.html"
target="ex">R3.15.5</a>, target="ex">R3.15.5</a>,
<a href="https://epics.anl.gov/base/R3-16/1-docs/AppDevGuide/AppDevGuide.html" <a href="https://epics.anl.gov/base/R3-16/1-docs/AppDevGuide/AppDevGuide.html"
target="ex">R3.16.1</a> target="ex">R3.16.1</a>

View File

@ -23,7 +23,7 @@ written or read value.
<dd> <dd>
Not allowed. Not allowed.
</dd> </dd>
<dt>LONG format (e.g. <code>%i</code>):</dt> <dt>LONG <span class=new>or ENUM</span> format (e.g. <code>%i</code>):</dt>
<dd> <dd>
<dl> <dl>
<dt>If any of <code>ZRVL</code> ... <code>FFVL</code> is set <dt>If any of <code>ZRVL</code> ... <code>FFVL</code> is set
@ -41,17 +41,12 @@ written or read value.
</dd> </dd>
<dt>If none of <code>ZRVL</code> ... <code>FFVL</code> is set <dt>If none of <code>ZRVL</code> ... <code>FFVL</code> is set
(all are <code>0</code>):</dt> (all are <code>0</code>):</dt>
<dd> <dd class=new>
<u>Output:</u> <code><i>x</i>=VAL</code><br> <u>Output:</u> <code><i>x</i>=(VAL&lt;&lt;SHFT)&amp;MASK</code><br>
<u>Input:</u> <code>VAL=<i>x</i></code><br> <u>Input:</u> <code>VAL=(RBV=(<i>x</i>&amp;MASK))&gt;&gt;SHFT</code><br>
</dd> </dd>
</dl> </dl>
</dd> </dd>
<dt>ENUM format (e.g. <code>%{</code>):</dt>
<dd>
<u>Output:</u> <code><i>x</i>=VAL</code><br>
<u>Input:</u> <code>VAL=<i>x</i></code><br>
</dd>
<dt>STRING format (e.g. <code>%s</code>):</dt> <dt>STRING format (e.g. <code>%s</code>):</dt>
<dd> <dd>
<u>Output:</u> Depending on <code>VAL</code>, one of <code>ZRST</code> <u>Output:</u> Depending on <code>VAL</code>, one of <code>ZRST</code>

View File

@ -74,7 +74,7 @@ CPPFLAGS += -DUSE_TYPED_RSET
-include $(TOP)/configure/RULES -include $(TOP)/configure/RULES
# Update version string whenever something changes # Update version string whenever something changes
StreamVersion$(OBJ): ../*.c ../*.h ../*.cc ../CONFIG_STREAM StreamVersion$(OBJ): $(filter-out StreamVersion.o,$(LIBOBJS)$(LIBRARY_OBJS))
# Add references to all registrars to main file to avoid # Add references to all registrars to main file to avoid
# missing initialization. # missing initialization.

View File

@ -1088,7 +1088,7 @@ getFieldAddress(const char* fieldname, StreamBuffer& address)
// FIELD in this record or VAL in other record // FIELD in this record or VAL in other record
StreamBuffer fullname; StreamBuffer fullname;
fullname.print("%s.%s", name(), fieldname); fullname.print("%s.%s", name(), fieldname);
if (dbNameToAddr(fullname(), &dbaddr) != OK) if (dbNameToAddr(fullname(), &dbaddr) != OK || strcmp(((dbFldDes*)dbaddr.pfldDes)->name, fieldname) != 0)
{ {
// VAL in other record // VAL in other record
fullname.clear().print("%s.VAL", fieldname); fullname.clear().print("%s.VAL", fieldname);

View File

@ -32,7 +32,6 @@ extern "C" {
#define STREAM_MAJOR 2 #define STREAM_MAJOR 2
#define STREAM_MINOR 8 #define STREAM_MINOR 8
#define STREAM_PATCHLEVEL 0
#ifndef OK #ifndef OK
#define OK 0 #define OK 0

View File

@ -33,11 +33,12 @@ static long readData(dbCommon *record, format_t *format)
{ {
case DBF_ULONG: case DBF_ULONG:
case DBF_LONG: case DBF_LONG:
case DBF_ENUM:
{ {
if (streamScanf(record, format, &val) == ERROR) return ERROR; if (streamScanf(record, format, &val) == ERROR) return ERROR;
if (mbbo->mask) val &= mbbo->mask;
mbbo->rbv = val; mbbo->rbv = val;
mbbo->rval = val; mbbo->rval = val;
if (mbbo->mask) val &= mbbo->mask;
if (mbbo->shft > 0) val >>= mbbo->shft; if (mbbo->shft > 0) val >>= mbbo->shft;
/* read VAL or RBV? Look if any value is defined */ /* read VAL or RBV? Look if any value is defined */
if (mbbo->sdef) if (mbbo->sdef)
@ -56,17 +57,12 @@ static long readData(dbCommon *record, format_t *format)
mbbo->val = (epicsEnum16)val; mbbo->val = (epicsEnum16)val;
break; break;
} }
case DBF_ENUM:
{
if (streamScanf(record, format, &val) == ERROR) return ERROR;
mbbo->val = (epicsEnum16)val;
break;
}
case DBF_STRING: case DBF_STRING:
{ {
char buffer[sizeof(mbbo->zrst)]; char buffer[sizeof(mbbo->zrst)];
if (streamScanfN(record, format, buffer, sizeof(buffer)) == ERROR) if (streamScanfN(record, format, buffer, sizeof(buffer)) == ERROR)
return ERROR; return ERROR;
mbbo->val = 65535; /* initalize to unknown state*/
for (val = 0; val < 16; val++) for (val = 0; val < 16; val++)
{ {
if (strcmp ((&mbbo->zrst)[val], buffer) == 0) if (strcmp ((&mbbo->zrst)[val], buffer) == 0)
@ -75,6 +71,7 @@ static long readData(dbCommon *record, format_t *format)
break; break;
} }
} }
break;
} }
default: default:
return ERROR; return ERROR;
@ -82,12 +79,21 @@ static long readData(dbCommon *record, format_t *format)
if (record->pact) return DO_NOT_CONVERT; if (record->pact) return DO_NOT_CONVERT;
/* In @init handler, no processing, enforce monitor updates. */ /* In @init handler, no processing, enforce monitor updates. */
monitor_mask = recGblResetAlarms(record); monitor_mask = recGblResetAlarms(record);
if (mbbo->val > 15) {
recGblSetSevr(record, STATE_ALARM, mbbo->unsv);
} else {
recGblSetSevr(record, STATE_ALARM, (&(mbbo->zrsv))[mbbo->val]);
}
mbbo->lalm = mbbo->val;
if (mbbo->val != mbbo->lalm) {
if (!recGblSetSevr(record, COS_ALARM, mbbo->cosv)) mbbo->lalm = mbbo->val;
}
if (mbbo->mlst != mbbo->val) if (mbbo->mlst != mbbo->val)
{ {
monitor_mask |= (DBE_VALUE | DBE_LOG); monitor_mask |= (DBE_VALUE | DBE_LOG);
mbbo->mlst = mbbo->val; mbbo->mlst = mbbo->val;
} }
if (monitor_mask){ if (monitor_mask) {
db_post_events(record, &mbbo->val, monitor_mask); db_post_events(record, &mbbo->val, monitor_mask);
} }
if (mbbo->oraw != mbbo->rval) { if (mbbo->oraw != mbbo->rval) {
@ -110,39 +116,38 @@ static long writeData(dbCommon *record, format_t *format)
switch (format->type) switch (format->type)
{ {
case DBF_ULONG: case DBF_ULONG:
case DBF_ENUM:
/* print VAL or RVAL ? */ /* print VAL or RVAL ? */
val = mbbo->val; val = mbbo->val;
if (mbbo->shft > 0) val <<= mbbo->shft;
if (mbbo->sdef) for (i=0; i<16; i++) if (mbbo->sdef) for (i=0; i<16; i++)
{ {
if ((&mbbo->zrvl)[i]) if ((&mbbo->zrvl)[i])
{ {
/* any values defined ? */ /* any values defined ? */
val = mbbo->rval; val = mbbo->rval;
if (mbbo->mask) val &= mbbo->mask;
break; break;
} }
} }
if (mbbo->mask) val &= mbbo->mask;
return streamPrintf(record, format, val); return streamPrintf(record, format, val);
case DBF_LONG: case DBF_LONG:
{ {
/* print VAL or RVAL ? */ /* print VAL or RVAL ? */
val = (epicsInt16)mbbo->val; val = (epicsInt16)mbbo->val;
if (mbbo->shft > 0) val <<= mbbo->shft;
if (mbbo->sdef) for (i=0; i<16; i++) if (mbbo->sdef) for (i=0; i<16; i++)
{ {
if ((&mbbo->zrvl)[i]) if ((&mbbo->zrvl)[i])
{ {
/* any values defined ? */ /* any values defined ? */
val = (epicsInt32)mbbo->rval; val = (epicsInt32)mbbo->rval;
if (mbbo->mask) val &= mbbo->mask;
break; break;
} }
} }
if (mbbo->mask) val &= mbbo->mask;
return streamPrintf(record, format, val); return streamPrintf(record, format, val);
} }
case DBF_ENUM:
{
return streamPrintf(record, format, mbbo->val);
}
case DBF_STRING: case DBF_STRING:
{ {
if (mbbo->val >= 16) return ERROR; if (mbbo->val >= 16) return ERROR;

View File

@ -54,8 +54,6 @@ set debug 0
startioc startioc
# Some formats give different results on 32 bit and 64 bit machines. # Some formats give different results on 32 bit and 64 bit machines.
# This occurs when printing negative numbers with unsigned formats.
# This is normal. E.g. -1 HAS a different number of 1 bits.
# Specify the width field in the format if this is a problem. # Specify the width field in the format if this is a problem.
put DZ:percent 1 put DZ:percent 1
@ -75,17 +73,9 @@ assure "12345 12345 012345 3039 003039 11000000111001 11000000111001 111001 !!..
put DZ:lo 2147483647 put DZ:lo 2147483647
assure "2147483647 2147483647 2147483647 7fffffff FFFFFF 1111111111111111111111111111111 1111111111111111111111111111111 111111 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!\n" assure "2147483647 2147483647 2147483647 7fffffff FFFFFF 1111111111111111111111111111111 1111111111111111111111111111111 111111 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!\n"
put DZ:lo -1 put DZ:lo -1
if {$tcl_platform(machine) == "x86_64"} {
assure "-1 -1 -00001 ffffffffffffffff FFFFFF 1111111111111111111111111111111111111111111111111111111111111111 1111111111111111111111111111111111111111111111111111111111111111 111111 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!\n"
} else {
assure "-1 -1 -00001 ffffffff FFFFFF 11111111111111111111111111111111 11111111111111111111111111111111 111111 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!\n" assure "-1 -1 -00001 ffffffff FFFFFF 11111111111111111111111111111111 11111111111111111111111111111111 111111 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!\n"
}
put DZ:lo -1234 put DZ:lo -1234
if {$tcl_platform(machine) == "x86_64"} {
assure "-1234 -1234 -01234 fffffffffffffb2e FFFB2E 1111111111111111111111111111111111111111111111111111101100101110 1111111111111111111111111111111111111111111111111111101100101110 101110 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!.!!..!.!!!. !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!.!!..!.!!!.\n"
} else {
assure "-1234 -1234 -01234 fffffb2e FFFB2E 11111111111111111111101100101110 11111111111111111111101100101110 101110 !!!!!!!!!!!!!!!!!!!!!.!!..!.!!!. !!!!!!!!!!!!!!!!!!!!!.!!..!.!!!.\n" assure "-1234 -1234 -01234 fffffb2e FFFB2E 11111111111111111111101100101110 11111111111111111111101100101110 101110 !!!!!!!!!!!!!!!!!!!!!.!!..!.!!!. !!!!!!!!!!!!!!!!!!!!!.!!..!.!!!.\n"
}
put DZ:lo 255 put DZ:lo 255
assure "255 255 000255 ff 0000FF 11111111 11111111 111111 !!!!!!!! !!!!!!!!\n" assure "255 255 000255 ff 0000FF 11111111 11111111 111111 !!!!!!!! !!!!!!!!\n"
put DZ:lo 65535 put DZ:lo 65535