Files
epics-base/modules/database/test/ioc/db/xRecord.c
2021-06-09 18:09:18 -05:00

171 lines
4.2 KiB
C

/*************************************************************************\
* Copyright (c) 2010 UChicago Argonne LLC, as Operator of Argonne
* National Laboratory.
* Copyright (c) 2010 Brookhaven National Laboratory.
* Copyright (c) 2010 Helmholtz-Zentrum Berlin
* fuer Materialien und Energie GmbH.
* SPDX-License-Identifier: EPICS
* EPICS BASE is distributed subject to a Software License Agreement found
* in file LICENSE that is included with this distribution.
\*************************************************************************/
/*
* Author: Andrew Johnson <anj@aps.anl.gov>
* Ralph Lange <Ralph.Lange@bessy.de>
*/
#include <string.h>
#include "dbAccess.h"
#include "dbEvent.h"
#include "recSup.h"
#include "recGbl.h"
#include "devSup.h"
#include "dbScan.h"
#define GEN_SIZE_OFFSET
#include "xRecord.h"
#include <epicsExport.h>
#include "devx.h"
static long init_record(struct dbCommon *pcommon, int pass)
{
struct xRecord *prec = (struct xRecord *)pcommon;
long ret = 0;
xdset *xset = (xdset*)prec->dset;
if(!pass) return 0;
if(!xset) {
recGblRecordError(S_dev_noDSET, prec, "x: init_record");
return S_dev_noDSET;
}
if(xset->init_record)
ret = (*xset->init_record)(prec);
return ret;
}
static void monitor(xRecord *prec)
{
unsigned short monitor_mask = recGblResetAlarms(prec);
/* we don't track value change, so always post */
monitor_mask |= DBE_VALUE | DBE_LOG;
if (monitor_mask){
db_post_events(prec,&prec->val,monitor_mask);
}
}
static long process(struct dbCommon *pcommon)
{
struct xRecord *prec = (struct xRecord *)pcommon;
long ret = 0;
xdset *xset = (xdset*)prec->dset;
prec->pact = TRUE;
if(prec->clbk)
(*prec->clbk)(prec);
if(xset && xset->process)
ret = (*xset->process)(prec);
monitor(prec);
recGblGetTimeStamp(prec);
recGblFwdLink(prec);
prec->pact = FALSE;
return ret;
}
static long special(struct dbAddr *paddr, int after)
{
struct xRecord *prec = (struct xRecord *) paddr->precord;
if (dbGetFieldIndex(paddr) != xRecordVAL &&
dbGetFieldIndex(paddr) != xRecordINP) {
recGblRecordError(S_db_badField, prec, "x: special");
return S_db_badField;
}
if (prec->sfx == after) {
return S_db_Blocked;
}
return 0;
}
long get_units(struct dbAddr *paddr, char *units)
{
if(dbGetFieldIndex(paddr)==xRecordOTST) {
strncpy(units, "arbitrary", DB_UNITS_SIZE);
}
return 0;
}
long get_precision(const struct dbAddr *paddr, long *precision)
{
if(dbGetFieldIndex(paddr)==xRecordOTST) {
*precision = 0x12345678;
}
return 0;
}
long get_graphic_double(struct dbAddr *paddr, struct dbr_grDouble *p)
{
xRecord *prec = (xRecord *)paddr->precord;
if(dbGetFieldIndex(paddr)==xRecordOTST) {
p->lower_disp_limit = prec->otst-1.0;
p->upper_disp_limit = prec->otst+1.0;
}
return 0;
}
long get_control_double(struct dbAddr *paddr, struct dbr_ctrlDouble *p)
{
xRecord *prec = (xRecord *)paddr->precord;
if(dbGetFieldIndex(paddr)==xRecordOTST) {
p->lower_ctrl_limit = prec->otst-2.0;
p->upper_ctrl_limit = prec->otst+2.0;
}
return 0;
}
long get_alarm_double(struct dbAddr *paddr, struct dbr_alDouble *p)
{
xRecord *prec = (xRecord *)paddr->precord;
if(dbGetFieldIndex(paddr)==xRecordOTST) {
p->lower_alarm_limit = prec->otst-3.0;
p->lower_warning_limit = prec->otst-4.0;
p->upper_warning_limit = prec->otst+4.0;
p->upper_alarm_limit = prec->otst+3.0;
}
return 0;
}
#define report NULL
#define initialize NULL
#define get_value NULL
#define cvt_dbaddr NULL
#define get_array_info NULL
#define put_array_info NULL
#define get_enum_str NULL
#define get_enum_strs NULL
#define put_enum_str NULL
static rset xRSET = {
RSETNUMBER,
report,
initialize,
init_record,
process,
special,
get_value,
cvt_dbaddr,
get_array_info,
put_array_info,
get_units,
get_precision,
get_enum_str,
get_enum_strs,
put_enum_str,
get_graphic_double,
get_control_double,
get_alarm_double
};
epicsExportAddress(rset,xRSET);