Prevent overflows in ao value conversion.
Also makes ROFF fields unsigned, needed for ROFF=0x80000000
This commit is contained in:
@@ -176,8 +176,8 @@ recordtype(ai) {
|
||||
pp(TRUE)
|
||||
interest(2)
|
||||
}
|
||||
field(ROFF,DBF_LONG) {
|
||||
prompt("Raw Offset, obsolete")
|
||||
field(ROFF,DBF_ULONG) {
|
||||
prompt("Raw Offset")
|
||||
pp(TRUE)
|
||||
interest(2)
|
||||
}
|
||||
|
||||
@@ -469,10 +469,20 @@ static void convert(aoRecord *prec, double value)
|
||||
}
|
||||
value -= prec->aoff;
|
||||
if (prec->aslo != 0) value /= prec->aslo;
|
||||
if (value >= 0.0)
|
||||
prec->rval = (epicsInt32)(value + 0.5) - prec->roff;
|
||||
else
|
||||
prec->rval = (epicsInt32)(value - 0.5) - prec->roff;
|
||||
|
||||
/* Apply raw offset and limits, round to 32-bit integer */
|
||||
value -= prec->roff;
|
||||
if (value >= 0.0) {
|
||||
if (value >= (0x7fffffff - 0.5))
|
||||
prec->rval = 0x7fffffff;
|
||||
else
|
||||
prec->rval = (epicsInt32)(value + 0.5);
|
||||
} else {
|
||||
if (value > (0.5 - 0x80000000))
|
||||
prec->rval = (epicsInt32)(value - 0.5);
|
||||
else
|
||||
prec->rval = 0x80000000;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
@@ -82,8 +82,8 @@ recordtype(ao) {
|
||||
interest(1)
|
||||
size(16)
|
||||
}
|
||||
field(ROFF,DBF_LONG) {
|
||||
prompt("Raw Offset, obsolete")
|
||||
field(ROFF,DBF_ULONG) {
|
||||
prompt("Raw Offset")
|
||||
pp(TRUE)
|
||||
interest(2)
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user