add re-init support to aao

This commit is contained in:
2018-08-07 18:04:50 +02:00
parent 81ce1dfc62
commit fa122460fd

View File

@ -18,6 +18,8 @@
* * * *
***************************************************************/ ***************************************************************/
#include <stdio.h>
#include "epicsString.h"
#include "aaoRecord.h" #include "aaoRecord.h"
#include "devStream.h" #include "devStream.h"
@ -26,6 +28,7 @@ static long readData(dbCommon *record, format_t *format)
aaoRecord *aao = (aaoRecord *)record; aaoRecord *aao = (aaoRecord *)record;
double dval; double dval;
long lval; long lval;
unsigned short monitor_mask;
for (aao->nord = 0; aao->nord < aao->nelm; aao->nord++) for (aao->nord = 0; aao->nord < aao->nelm; aao->nord++)
{ {
@ -34,9 +37,7 @@ static long readData(dbCommon *record, format_t *format)
case DBF_DOUBLE: case DBF_DOUBLE:
{ {
if (streamScanf(record, format, &dval) == ERROR) if (streamScanf(record, format, &dval) == ERROR)
{ goto end;
return aao->nord ? OK : ERROR;
}
switch (aao->ftvl) switch (aao->ftvl)
{ {
case DBF_DOUBLE: case DBF_DOUBLE:
@ -58,9 +59,7 @@ static long readData(dbCommon *record, format_t *format)
case DBF_ENUM: case DBF_ENUM:
{ {
if (streamScanf(record, format, &lval) == ERROR) if (streamScanf(record, format, &lval) == ERROR)
{ goto end;
return aao->nord ? OK : ERROR;
}
switch (aao->ftvl) switch (aao->ftvl)
{ {
case DBF_DOUBLE: case DBF_DOUBLE:
@ -104,9 +103,7 @@ static long readData(dbCommon *record, format_t *format)
if (streamScanfN(record, format, if (streamScanfN(record, format,
(char *)aao->bptr + aao->nord * MAX_STRING_SIZE, (char *)aao->bptr + aao->nord * MAX_STRING_SIZE,
MAX_STRING_SIZE) == ERROR) MAX_STRING_SIZE) == ERROR)
{ goto end;
return aao->nord ? OK : ERROR;
}
break; break;
case DBF_CHAR: case DBF_CHAR:
case DBF_UCHAR: case DBF_UCHAR:
@ -129,7 +126,7 @@ static long readData(dbCommon *record, format_t *format)
((char*)aao->bptr)[aao->nelm-1] = 0; ((char*)aao->bptr)[aao->nelm-1] = 0;
} }
aao->nord = (long)length; aao->nord = (long)length;
return OK; goto end_no_check;
} }
default: default:
errlogSevPrintf(errlogFatal, errlogSevPrintf(errlogFatal,
@ -149,6 +146,38 @@ static long readData(dbCommon *record, format_t *format)
} }
} }
} }
end:
if (aao->nord == 0) return ERROR;
end_no_check:
if (record->pact) return OK;
/* In @init handler, no processing, enforce monitor updates. */
monitor_mask = recGblResetAlarms(aao);
#if defined(VERSION_INT) || EPICS_MODIFICATION >= 12
if (aao->mpst == aaoPOST_Always)
monitor_mask |= DBE_VALUE;
if (aao->apst == aaoPOST_Always)
monitor_mask |= DBE_LOG;
if ((aao->mpst == aaoPOST_OnChange) ||
(aao->apst == aaoPOST_OnChange))
{
unsigned int hash = epicsMemHash(aao->bptr,
aao->nord * dbValueSize(aao->ftvl), 0);
if (hash != aao->hash)
{
if (aao->mpst == aaoPOST_OnChange)
monitor_mask |= DBE_VALUE;
if (aao->apst == aaoPOST_OnChange)
monitor_mask |= DBE_LOG;
aao->hash = hash;
db_post_events(aao, &aao->hash, DBE_VALUE);
}
}
#else
monitor_mask |= DBE_VALUE | DBE_LOG;
#endif
if (monitor_mask)
db_post_events(aao, aao->bptr, monitor_mask);
return OK; return OK;
} }