workaround for mbboDirect bug

This commit is contained in:
2016-07-01 10:18:34 +02:00
parent bc67317b0b
commit 40c33abac7

View File

@ -20,6 +20,7 @@
***************************************************************/ ***************************************************************/
#include <mbboDirectRecord.h> #include <mbboDirectRecord.h>
#include "alarm.h"
#include "devStream.h" #include "devStream.h"
#include <epicsExport.h> #include <epicsExport.h>
@ -67,9 +68,27 @@ static long initRecord (dbCommon *record)
mbboDirectRecord *mbboD = (mbboDirectRecord *) record; mbboDirectRecord *mbboD = (mbboDirectRecord *) record;
mbboD->mask <<= mbboD->shft; mbboD->mask <<= mbboD->shft;
/* Workaround for bug in mbboDirect record:
Put to VAL overwrites value to 0 if SEVR is INVALID_ALARM
Thus first write may send a wrong value.
*/
mbboD->sevr = 0;
return streamInitRecord (record, &mbboD->out, readData, writeData); return streamInitRecord (record, &mbboD->out, readData, writeData);
} }
/* Unfortunately the bug also corrupts the next write to VAL after an I/O error.
Thus make sure the record is never left in INVALID_ALARM status.
*/
static long write(dbCommon *record)
{
int status = streamWrite(record);
if (record->nsev == INVALID_ALARM) record->nsev = MAJOR_ALARM;
return status;
}
struct { struct {
long number; long number;
DEVSUPFUN report; DEVSUPFUN report;
@ -83,7 +102,7 @@ struct {
streamInit, streamInit,
initRecord, initRecord,
streamGetIointInfo, streamGetIointInfo,
streamWrite write
}; };
epicsExportAddress(dset,devmbboDirectStream); epicsExportAddress(dset,devmbboDirectStream);