jba changes

This commit is contained in:
Janet B. Anderson
1991-02-21 16:33:27 +00:00
parent 26cba54ab7
commit 34740ae6a8
16 changed files with 932 additions and 836 deletions

View File

@@ -77,16 +77,17 @@
long init_record();
long process();
long special();
long get_precision();
long get_value();
#define cvt_dbaddr NULL
#define get_array_info NULL
#define put_array_info NULL
#define get_enum_str NULL
long get_units();
long get_precision();
#define get_enum_str NULL
#define get_enum_strs NULL
long get_graphic_double();
long get_control_double();
#define get_enum_strs NULL
long get_alarm_double();
struct rset aiRSET={
RSETNUMBER,
@@ -95,16 +96,17 @@ struct rset aiRSET={
init_record,
process,
special,
get_precision,
get_value,
cvt_dbaddr,
get_array_info,
put_array_info,
get_enum_str,
get_units,
get_precision,
get_enum_str,
get_enum_strs,
get_graphic_double,
get_control_double,
get_enum_strs };
get_alarm_double};
struct aidset { /* analog input dset */
long number;
@@ -118,8 +120,8 @@ struct aidset { /* analog input dset */
DEVSUPFUN special_linconv;
};
void convert();
void alarm();
void convert();
void monitor();
static long init_record(pai)
@@ -212,16 +214,6 @@ static long special(paddr,after)
}
}
static long get_precision(paddr,precision)
struct dbAddr *paddr;
long *precision;
{
struct aiRecord *pai=(struct aiRecord *)paddr->precord;
*precision = pai->prec;
return(0);
}
static long get_value(pai,pvdes)
struct aiRecord *pai;
struct valueDes *pvdes;
@@ -242,6 +234,16 @@ static long get_units(paddr,units)
return(0);
}
static long get_precision(paddr,precision)
struct dbAddr *paddr;
long *precision;
{
struct aiRecord *pai=(struct aiRecord *)paddr->precord;
*precision = pai->prec;
return(0);
}
static long get_graphic_double(paddr,pgd)
struct dbAddr *paddr;
struct dbr_grDouble *pgd;
@@ -250,10 +252,6 @@ static long get_graphic_double(paddr,pgd)
pgd->upper_disp_limit = pai->hopr;
pgd->lower_disp_limit = pai->lopr;
pgd->upper_alarm_limit = pai->hihi;
pgd->upper_warning_limit = pai->high;
pgd->lower_warning_limit = pai->low;
pgd->lower_alarm_limit = pai->lolo;
return(0);
}
@@ -267,21 +265,35 @@ static long get_control_double(paddr,pcd)
pcd->lower_ctrl_limit = pai->lopr;
return(0);
}
static long get_alarm_double(paddr,pad)
struct dbAddr *paddr;
struct dbr_alDouble *pad;
{
struct aiRecord *pai=(struct aiRecord *)paddr->precord;
pad->upper_alarm_limit = pai->hihi;
pad->upper_warning_limit = pai->high;
pad->lower_warning_limit = pai->low;
pad->lower_alarm_limit = pai->lolo;
return(0);
}
static void alarm(pai)
struct aiRecord *pai;
{
float ftemp;
float val=pai->val;
/* if difference is not > hysterisis don't bother */
/* if difference is not > hysterisis use lalm not val */
ftemp = pai->lalm - pai->val;
if(ftemp<0.0) ftemp = -ftemp;
if (ftemp < pai->hyst) return;
if (ftemp < pai->hyst) val=pai->lalm;
/* alarm condition hihi */
if (pai->nsev<pai->hhsv){
if (pai->val > pai->hihi){
pai->lalm = pai->val;
if (val > pai->hihi){
pai->lalm = val;
pai->nsta = HIHI_ALARM;
pai->nsev = pai->hhsv;
return;
@@ -290,8 +302,8 @@ static void alarm(pai)
/* alarm condition lolo */
if (pai->nsev<pai->llsv){
if (pai->val < pai->lolo){
pai->lalm = pai->val;
if (val < pai->lolo){
pai->lalm = val;
pai->nsta = LOLO_ALARM;
pai->nsev = pai->llsv;
return;
@@ -300,8 +312,8 @@ static void alarm(pai)
/* alarm condition high */
if (pai->nsev<pai->hsv){
if (pai->val > pai->high){
pai->lalm = pai->val;
if (val > pai->high){
pai->lalm = val;
pai->nsta = HIGH_ALARM;
pai->nsev =pai->hsv;
return;
@@ -310,8 +322,8 @@ static void alarm(pai)
/* alarm condition lolo */
if (pai->nsev<pai->lsv){
if (pai->val < pai->low){
pai->lalm = pai->val;
if (val < pai->low){
pai->lalm = val;
pai->nsta = LOW_ALARM;
pai->nsev = pai->lsv;
return;
@@ -320,69 +332,6 @@ static void alarm(pai)
return;
}
static void monitor(pai)
struct aiRecord *pai;
{
unsigned short monitor_mask;
float delta;
short stat,sevr,nsta,nsev;
/* get previous stat and sevr and new stat and sevr*/
stat=pai->stat;
sevr=pai->sevr;
nsta=pai->nsta;
nsev=pai->nsev;
/*set current stat and sevr*/
pai->stat = nsta;
pai->sevr = nsev;
pai->nsta = 0;
pai->nsev = 0;
/* anyone waiting for an event on this record */
if (pai->mlis.count == 0) return;
/* Flags which events to fire on the value field */
monitor_mask = 0;
/* alarm condition changed this scan */
if (stat!=nsta || sevr!=nsev) {
/* post events for alarm condition change*/
monitor_mask = DBE_ALARM;
/* post stat and nsev fields */
db_post_events(pai,&pai->stat,DBE_VALUE);
db_post_events(pai,&pai->sevr,DBE_VALUE);
}
/* check for value change */
delta = pai->mlst - pai->val;
if(delta<0.0) delta = -delta;
if (delta > pai->mdel) {
/* post events for value change */
monitor_mask |= DBE_VALUE;
/* update last value monitored */
pai->mlst = pai->val;
}
/* check for archive change */
delta = pai->alst - pai->val;
if(delta<0.0) delta = 0.0;
if (delta > pai->adel) {
/* post events on value field for archive change */
monitor_mask |= DBE_LOG;
/* update last archive value monitored */
pai->alst = pai->val;
}
/* send out monitors connected to the value field */
if (monitor_mask){
db_post_events(pai,&pai->val,monitor_mask);
if(pai->oraw != pai->rval) {
db_post_events(pai,&pai->rval,monitor_mask);
pai->oraw = pai->rval;
}
}
return;
}
static void convert(pai)
struct aiRecord *pai;
{
@@ -454,3 +403,66 @@ struct aiRecord *pai;
}
return;
}
static void monitor(pai)
struct aiRecord *pai;
{
unsigned short monitor_mask;
float delta;
short stat,sevr,nsta,nsev;
/* get previous stat and sevr and new stat and sevr*/
stat=pai->stat;
sevr=pai->sevr;
nsta=pai->nsta;
nsev=pai->nsev;
/*set current stat and sevr*/
pai->stat = nsta;
pai->sevr = nsev;
pai->nsta = 0;
pai->nsev = 0;
/* anyone waiting for an event on this record */
if (pai->mlis.count == 0) return;
/* Flags which events to fire on the value field */
monitor_mask = 0;
/* alarm condition changed this scan */
if (stat!=nsta || sevr!=nsev) {
/* post events for alarm condition change*/
monitor_mask = DBE_ALARM;
/* post stat and nsev fields */
db_post_events(pai,&pai->stat,DBE_VALUE);
db_post_events(pai,&pai->sevr,DBE_VALUE);
}
/* check for value change */
delta = pai->mlst - pai->val;
if(delta<0.0) delta = -delta;
if (delta > pai->mdel) {
/* post events for value change */
monitor_mask |= DBE_VALUE;
/* update last value monitored */
pai->mlst = pai->val;
}
/* check for archive change */
delta = pai->alst - pai->val;
if(delta<0.0) delta = 0.0;
if (delta > pai->adel) {
/* post events on value field for archive change */
monitor_mask |= DBE_LOG;
/* update last archive value monitored */
pai->alst = pai->val;
}
/* send out monitors connected to the value field */
if (monitor_mask){
db_post_events(pai,&pai->val,monitor_mask);
if(pai->oraw != pai->rval) {
db_post_events(pai,&pai->rval,monitor_mask);
pai->oraw = pai->rval;
}
}
return;
}

View File

@@ -72,16 +72,17 @@
long init_record();
long process();
long special();
long get_precision();
long get_value();
#define cvt_dbaddr NULL
#define get_array_info NULL
#define put_array_info NULL
#define get_enum_str NULL
long get_units();
long get_precision();
#define get_enum_str NULL
#define get_enum_strs NULL
long get_graphic_double();
long get_control_double();
#define get_enum_strs NULL
long get_alarm_double();
struct rset aoRSET={
RSETNUMBER,
@@ -90,16 +91,17 @@ struct rset aoRSET={
init_record,
process,
special,
get_precision,
get_value,
cvt_dbaddr,
get_array_info,
put_array_info,
get_enum_str,
get_units,
get_precision,
get_enum_str,
get_enum_strs,
get_graphic_double,
get_control_double,
get_enum_strs };
get_alarm_double };
struct aodset { /* analog input dset */
long number;
@@ -169,10 +171,9 @@ static long process(paddr)
}
if(pao->pact == FALSE) {
convert(pao);
if(pao->oraw != pao->oval) status=(*pdset->write_ao)(pao);
else status=0;
status=(*pdset->write_ao)(pao);
} else {
status=(*pdset->write_ao)(pao); /* write the new value */
status=(*pdset->write_ao)(pao);
pao->pact = TRUE;
}
@@ -214,16 +215,6 @@ static long special(paddr,after)
}
}
static long get_precision(paddr,precision)
struct dbAddr *paddr;
long *precision;
{
struct aoRecord *pao=(struct aoRecord *)paddr->precord;
*precision = pao->prec;
return(0);
}
static long get_value(pao,pvdes)
struct aoRecord *pao;
struct valueDes *pvdes;
@@ -244,6 +235,16 @@ static long get_units(paddr,units)
return(0);
}
static long get_precision(paddr,precision)
struct dbAddr *paddr;
long *precision;
{
struct aoRecord *pao=(struct aoRecord *)paddr->precord;
*precision = pao->prec;
return(0);
}
static long get_graphic_double(paddr,pgd)
struct dbAddr *paddr;
struct dbr_grDouble *pgd;
@@ -252,10 +253,6 @@ static long get_graphic_double(paddr,pgd)
pgd->upper_disp_limit = pao->hopr;
pgd->lower_disp_limit = pao->lopr;
pgd->upper_alarm_limit = pao->hihi;
pgd->upper_warning_limit = pao->high;
pgd->lower_warning_limit = pao->low;
pgd->lower_alarm_limit = pao->lolo;
return(0);
}
@@ -269,21 +266,35 @@ static long get_control_double(paddr,pcd)
pcd->lower_ctrl_limit = pao->lopr;
return(0);
}
static long get_alarm_double(paddr,pad)
struct dbAddr *paddr;
struct dbr_alDouble *pad;
{
struct aoRecord *pao=(struct aoRecord *)paddr->precord;
pad->upper_alarm_limit = pao->hihi;
pad->upper_warning_limit = pao->high;
pad->lower_warning_limit = pao->low;
pad->lower_alarm_limit = pao->lolo;
return(0);
}
static void alarm(pao)
struct aoRecord *pao;
{
float ftemp;
float val=pao->val;
/* if difference is not > hysterisis don't bother */
/* if difference is not > hysterisis use lalm not val */
ftemp = pao->lalm - pao->val;
if(ftemp<0.0) ftemp = -ftemp;
if (ftemp < pao->hyst) return;
if (ftemp < pao->hyst) val=pao->lalm;
/* alarm condition hihi */
if (pao->nsev<pao->hhsv){
if (pao->val > pao->hihi){
pao->lalm = pao->val;
if (val > pao->hihi){
pao->lalm = val;
pao->nsta = HIHI_ALARM;
pao->nsev = pao->hhsv;
return;
@@ -292,8 +303,8 @@ static void alarm(pao)
/* alarm condition lolo */
if (pao->nsev<pao->llsv){
if (pao->val < pao->lolo){
pao->lalm = pao->val;
if (val < pao->lolo){
pao->lalm = val;
pao->nsta = LOLO_ALARM;
pao->nsev = pao->llsv;
return;
@@ -302,8 +313,8 @@ static void alarm(pao)
/* alarm condition high */
if (pao->nsev<pao->hsv){
if (pao->val > pao->high){
pao->lalm = pao->val;
if (val > pao->high){
pao->lalm = val;
pao->nsta = HIGH_ALARM;
pao->nsev =pao->hsv;
return;
@@ -312,8 +323,8 @@ static void alarm(pao)
/* alarm condition lolo */
if (pao->nsev<pao->lsv){
if (pao->val < pao->low){
pao->lalm = pao->val;
if (val < pao->low){
pao->lalm = val;
pao->nsta = LOW_ALARM;
pao->nsev = pao->lsv;
return;
@@ -321,6 +332,65 @@ static void alarm(pao)
}
return;
}
static void convert(pao)
struct aoRecord *pao;
{
float value;
/* fetch the desired output if there is a database link */
if ((pao->dol.type == DB_LINK) && (pao->omsl == CLOSED_LOOP)){
long nRequest;
long options;
short save_pact;
long status;
options=0;
nRequest=1;
save_pact = pao->pact;
pao->pact = TRUE;
status = dbGetLink(&pao->dol.value,DBR_FLOAT,&value,&options,&nRequest);
pao->pact = save_pact;
if(status) {
if(pao->nsev<VALID_ALARM) {
pao->nsta = LINK_ALARM;
pao->nsev=VALID_ALARM;
}
return;
}
if (pao->oif == OUTPUT_INCREMENTAL) value += pao->val;
} else value = pao->val;
/* check drive limits */
if(pao->drvh > pao->drvl) {
if (value > pao->drvh) value = pao->drvh;
else if (value < pao->drvl) value = pao->drvl;
}
pao->val = value;
/* now set value equal to desired output value */
/* apply the output rate of change */
if (pao->oroc){
float diff;
diff = value - pao->oval;
if (diff < 0){
if (pao->oroc < -diff) value = pao->oval - pao->oroc;
}else if (pao->oroc < diff) value = pao->oval + pao->oroc;
}
pao->oval = value;
/* convert */
if (pao->linr == LINEAR){
if (pao->eslo == 0) pao->rval = 0;
else pao->rval = (value - pao->egul) / pao->eslo;
}else{
pao->rval = value;
}
}
static void monitor(pao)
struct aoRecord *pao;
@@ -391,61 +461,3 @@ static void monitor(pao)
}
return;
}
static void convert(pao)
struct aoRecord *pao;
{
float value;
/* fetch the desired output if there is a database link */
if ((pao->dol.type == DB_LINK) && (pao->omsl == CLOSED_LOOP)){
long nRequest;
long options;
short save_pact;
long status;
options=0;
nRequest=1;
save_pact = pao->pact;
pao->pact = TRUE;
status = dbGetLink(&pao->dol.value,DBR_FLOAT,&value,&options,&nRequest);
pao->pact = save_pact;
if(status) {
if(pao->nsev<VALID_ALARM) {
pao->nsta = LINK_ALARM;
pao->nsev=VALID_ALARM;
}
return;
}
if (pao->oif == OUTPUT_INCREMENTAL) value += pao->val;
} else value = pao->val;
/* check drive limits */
if(pao->drvh > pao->drvl) {
if (value > pao->drvh) value = pao->drvh;
else if (value < pao->drvl) value = pao->drvl;
}
pao->val = value;
/* now set value equal to desired output value */
/* apply the output rate of change */
if (pao->oroc){
float diff;
diff = value - pao->oval;
if (diff < 0){
if (pao->oroc < -diff) value = pao->oval - pao->oroc;
}else if (pao->oroc < diff) value = pao->oval + pao->oroc;
}
pao->oval = value;
/* convert */
if (pao->linr == LINEAR){
if (pao->eslo == 0) pao->rval = 0;
else pao->rval = (value - pao->egul) / pao->eslo;
}else{
pao->rval = value;
}
}

View File

@@ -65,16 +65,17 @@
long init_record();
long process();
#define special NULL
#define get_precision NULL
long get_value();
#define cvt_dbaddr NULL
#define get_array_info NULL
#define put_array_info NULL
long get_enum_str();
#define get_units NULL
#define get_precision NULL
long get_enum_str();
long get_enum_strs();
#define get_graphic_double NULL
#define get_control_double NULL
long get_enum_strs();
#define get_alarm_double NULL
struct rset biRSET={
RSETNUMBER,
report,
@@ -82,16 +83,17 @@ struct rset biRSET={
init_record,
process,
special,
get_precision,
get_value,
cvt_dbaddr,
get_array_info,
put_array_info,
get_enum_str,
get_units,
get_precision,
get_enum_str,
get_enum_strs,
get_graphic_double,
get_control_double,
get_enum_strs };
get_alarm_double };
struct bidset { /* binary input dset */
long number;
DEVSUPFUN dev_report;
@@ -122,7 +124,6 @@ static long init_record(pbi)
if((status=(*pdset->init_record)(pbi,process))) return(status);
}
pbi->mlst = -1;
pbi->lalm = -1;
return(0);
}
@@ -201,10 +202,6 @@ static void alarm(pbi)
struct biRecord *pbi;
{
if (pbi->val == pbi->lalm) return;
/* set last alarmed value */
pbi->lalm = pbi->val;
/* check for state alarm */
if (pbi->val == 0){

View File

@@ -75,16 +75,17 @@
long init_record();
long process();
#define special NULL
#define get_precision NULL
long get_value();
#define cvt_dbaddr NULL
#define get_array_info NULL
#define put_array_info NULL
long get_enum_str();
#define get_units NULL
#define get_precision NULL
long get_enum_str();
long get_enum_strs();
#define get_graphic_double NULL
#define get_control_double NULL
long get_enum_strs();
#define get_alarm_double NULL
struct rset boRSET={
RSETNUMBER,
@@ -93,16 +94,17 @@ struct rset boRSET={
init_record,
process,
special,
get_precision,
get_value,
cvt_dbaddr,
get_array_info,
put_array_info,
get_enum_str,
get_units,
get_precision,
get_enum_str,
get_enum_strs,
get_graphic_double,
get_control_double,
get_enum_strs };
get_alarm_double };
struct bodset { /* binary output dset */
long number;
@@ -167,10 +169,9 @@ static long init_record(pbo)
pbo->dpvt = (caddr_t)pcallback;
pcallback->callback = myCallback;
if(dbNameToAddr(pbo->name,&(pcallback->dbAddr))) {
logMsg("dbNameToAddr failed in init_record for devAiTestAsyn\n");
logMsg("dbNameToAddr failed in init_record for recBo\n");
exit(1);
}
pbo->lalm = -1;
pbo->mlst = -1;
return(0);
}
@@ -202,22 +203,21 @@ static long process(paddr)
pbo->pact = savepact;
}
if(pbo->lalm != pbo->val) {/*we have a change */
status=(*pdset->write_bo)(pbo); /* write the new value */
pbo->pact = TRUE;
status=(*pdset->write_bo)(pbo); /* write the new value */
pbo->pact = TRUE;
/* status is one if an asynchronous record is being processed*/
if(status==1) return(0);
/* status is one if an asynchronous record is being processed*/
if(status==1) return(0);
wait_time = (int)(pbo->high) * vxTicksPerSecond; /* seconds to ticks */
if(pbo->val==1 && wait_time>0) {
struct callback *pcallback;
wait_time = (int)(pbo->high) * vxTicksPerSecond; /* seconds to ticks */
if(pbo->val==1 && wait_time>0) {
struct callback *pcallback;
pcallback = (struct callback *)(pbo->dpvt);
if(pcallback->wd_id==NULL) pcallback->wd_id = wdCreate();
wdStart(pcallback->wd_id,wait_time,callbackRequest,pcallback);
}
pcallback = (struct callback *)(pbo->dpvt);
if(pcallback->wd_id==NULL) pcallback->wd_id = wdCreate();
wdStart(pcallback->wd_id,wait_time,callbackRequest,pcallback);
}
} else pbo->pact = TRUE;
/* check for alarms */
alarm(pbo);
@@ -275,10 +275,6 @@ static void alarm(pbo)
struct boRecord *pbo;
{
if (pbo->val == pbo->lalm) return;
/* set last alarmed value */
pbo->lalm = pbo->val;
/* check for state alarm */
if (pbo->val == 0){

View File

@@ -79,16 +79,17 @@
long init_record();
long process();
long special();
long get_precision();
long get_value();
#define cvt_dbaddr NULL
#define get_array_info NULL
#define put_array_info NULL
#define get_enum_str NULL
long get_units();
long get_precision();
#define get_enum_str NULL
#define get_enum_strs NULL
long get_graphic_double();
long get_control_double();
#define get_enum_strs NULL
long get_alarm_double();
struct rset calcRSET={
RSETNUMBER,
@@ -97,16 +98,17 @@ struct rset calcRSET={
init_record,
process,
special,
get_precision,
get_value,
cvt_dbaddr,
get_array_info,
put_array_info,
get_enum_str,
get_units,
get_precision,
get_enum_str,
get_enum_strs,
get_graphic_double,
get_control_double,
get_enum_strs };
get_alarm_double };
void alarm();
void monitor();
@@ -138,85 +140,6 @@ static long init_record(pcalc)
return(0);
}
static long special(paddr,after)
struct dbAddr *paddr;
int after;
{
long status;
struct calcRecord *pcalc = (struct calcRecord *)(paddr->precord);
int special_type = paddr->special;
short error_number;
char rpbuf[80];
if(!after) return(0);
switch(special_type) {
case(SPC_CALC):
status=postfix(pcalc->calc,rpbuf,&error_number);
if(status) return(status);
bcopy(rpbuf,pcalc->rpcl,sizeof(pcalc->rpcl));
return(0);
default:
recGblDbaddrError(S_db_badChoice,paddr,"calc: special");
return(S_db_badChoice);
}
}
static long get_precision(paddr,precision)
struct dbAddr *paddr;
long *precision;
{
struct calcRecord *pcalc=(struct calcRecord *)paddr->precord;
*precision = pcalc->prec;
return(0);
}
static long get_value(pcalc,pvdes)
struct calcRecord *pcalc;
struct valueDes *pvdes;
{
pvdes->field_type = DBF_FLOAT;
pvdes->no_elements=1;
(float *)(pvdes->pvalue) = &pcalc->val;
return(0);
}
static long get_units(paddr,units)
struct dbAddr *paddr;
char *units;
{
struct calcRecord *pcalc=(struct calcRecord *)paddr->precord;
strncpy(units,pcalc->egu,sizeof(pcalc->egu));
return(0);
}
static long get_graphic_double(paddr,pgd)
struct dbAddr *paddr;
struct dbr_grDouble *pgd;
{
struct calcRecord *pcalc=(struct calcRecord *)paddr->precord;
pgd->upper_disp_limit = pcalc->hopr;
pgd->lower_disp_limit = pcalc->lopr;
pgd->upper_alarm_limit = pcalc->hihi;
pgd->upper_warning_limit = pcalc->high;
pgd->lower_warning_limit = pcalc->low;
pgd->lower_alarm_limit = pcalc->lolo;
return(0);
}
static long get_control_double(paddr,pcd)
struct dbAddr *paddr;
struct dbr_ctrlDouble *pcd;
{
struct calcRecord *pcalc=(struct calcRecord *)paddr->precord;
pcd->upper_ctrl_limit = pcalc->hopr;
pcd->lower_ctrl_limit = pcalc->lopr;
return(0);
}
static long process(paddr)
struct dbAddr *paddr;
{
@@ -239,21 +162,110 @@ static long process(paddr)
pcalc->pact = FALSE;
return(0);
}
static long special(paddr,after)
struct dbAddr *paddr;
int after;
{
long status;
struct calcRecord *pcalc = (struct calcRecord *)(paddr->precord);
int special_type = paddr->special;
short error_number;
char rpbuf[80];
if(!after) return(0);
switch(special_type) {
case(SPC_CALC):
status=postfix(pcalc->calc,rpbuf,&error_number);
if(status) return(status);
bcopy(rpbuf,pcalc->rpcl,sizeof(pcalc->rpcl));
return(0);
default:
recGblDbaddrError(S_db_badChoice,paddr,"calc: special");
return(S_db_badChoice);
}
}
static long get_value(pcalc,pvdes)
struct calcRecord *pcalc;
struct valueDes *pvdes;
{
pvdes->field_type = DBF_FLOAT;
pvdes->no_elements=1;
(float *)(pvdes->pvalue) = &pcalc->val;
return(0);
}
static long get_units(paddr,units)
struct dbAddr *paddr;
char *units;
{
struct calcRecord *pcalc=(struct calcRecord *)paddr->precord;
strncpy(units,pcalc->egu,sizeof(pcalc->egu));
return(0);
}
static long get_precision(paddr,precision)
struct dbAddr *paddr;
long *precision;
{
struct calcRecord *pcalc=(struct calcRecord *)paddr->precord;
*precision = pcalc->prec;
return(0);
}
static long get_graphic_double(paddr,pgd)
struct dbAddr *paddr;
struct dbr_grDouble *pgd;
{
struct calcRecord *pcalc=(struct calcRecord *)paddr->precord;
pgd->upper_disp_limit = pcalc->hopr;
pgd->lower_disp_limit = pcalc->lopr;
return(0);
}
static long get_control_double(paddr,pcd)
struct dbAddr *paddr;
struct dbr_ctrlDouble *pcd;
{
struct calcRecord *pcalc=(struct calcRecord *)paddr->precord;
pcd->upper_ctrl_limit = pcalc->hopr;
pcd->lower_ctrl_limit = pcalc->lopr;
return(0);
}
static long get_alarm_double(paddr,pad)
struct dbAddr *paddr;
struct dbr_alDouble *pad;
{
struct calcRecord *pcalc=(struct calcRecord *)paddr->precord;
pad->upper_alarm_limit = pcalc->hihi;
pad->upper_warning_limit = pcalc->high;
pad->lower_warning_limit = pcalc->low;
pad->lower_alarm_limit = pcalc->lolo;
return(0);
}
static void alarm(pcalc)
struct calcRecord *pcalc;
{
float ftemp;
float val=pcalc->val;
/* if difference is not > hysterisis don't bother */
ftemp = pcalc->lalm - pcalc->val;
if(ftemp<0.0) ftemp = -ftemp;
if (ftemp < pcalc->hyst) return;
if (ftemp < pcalc->hyst) val=pcalc->lalm;
/* alarm condition hihi */
if (pcalc->nsev<pcalc->hhsv){
if (pcalc->val > pcalc->hihi){
pcalc->lalm = pcalc->val;
if (val > pcalc->hihi){
pcalc->lalm = val;
pcalc->nsta = HIHI_ALARM;
pcalc->nsev = pcalc->hhsv;
return;
@@ -262,8 +274,8 @@ static void alarm(pcalc)
/* alarm condition lolo */
if (pcalc->nsev<pcalc->llsv){
if (pcalc->val < pcalc->lolo){
pcalc->lalm = pcalc->val;
if (val < pcalc->lolo){
pcalc->lalm = val;
pcalc->nsta = LOLO_ALARM;
pcalc->nsev = pcalc->llsv;
return;
@@ -272,8 +284,8 @@ static void alarm(pcalc)
/* alarm condition high */
if (pcalc->nsev<pcalc->hsv){
if (pcalc->val > pcalc->high){
pcalc->lalm = pcalc->val;
if (val > pcalc->high){
pcalc->lalm = val;
pcalc->nsta = HIGH_ALARM;
pcalc->nsev =pcalc->hsv;
return;
@@ -282,8 +294,8 @@ static void alarm(pcalc)
/* alarm condition lolo */
if (pcalc->nsev<pcalc->lsv){
if (pcalc->val < pcalc->low){
pcalc->lalm = pcalc->val;
if (val < pcalc->low){
pcalc->lalm = val;
pcalc->nsta = LOW_ALARM;
pcalc->nsev = pcalc->lsv;
return;

View File

@@ -71,16 +71,17 @@
long init_record();
long process();
long special();
long get_precision();
long get_value();
long cvt_dbaddr();
long get_array_info();
long put_array_info();
#define get_enum_str NULL
long get_units();
long get_precision();
#define get_enum_str NULL
#define get_enum_strs NULL
long get_graphic_double();
long get_control_double();
#define get_enum_strs NULL
#define get_alarm_double NULL
struct rset compressRSET={
RSETNUMBER,
@@ -89,16 +90,17 @@ struct rset compressRSET={
init_record,
process,
special,
get_precision,
get_value,
cvt_dbaddr,
get_array_info,
put_array_info,
get_enum_str,
get_units,
get_precision,
get_enum_str,
get_enum_strs,
get_graphic_double,
get_control_double,
get_enum_strs };
get_alarm_double };
#define NTO1LOW 0
#define NTO1HIGH 1
@@ -138,6 +140,56 @@ static long init_record(pcompress)
return(0);
}
static long process(paddr)
struct dbAddr *paddr;
{
struct compressRecord *pcompress=(struct compressRecord *)(paddr->precord);
long status=0;
pcompress->pact = TRUE;
if (pcompress->inp.type != DB_LINK) {
status=0;
}else if (pcompress->wptr == NULL) {
if(pcompress->nsev<MAJOR_ALARM) {
pcompress->nsta = READ_ALARM;
pcompress->nsev = MAJOR_ALARM;
}
status=0;
} else {
struct dbAddr *pdbAddr =
(struct dbAddr *)(pcompress->inp.value.db_link.pdbAddr);
long options=0;
long no_elements=pdbAddr->no_elements;
int alg=pcompress->alg;
(void)dbGetLink(&pcompress->inp.value.db_link,pcompress,DBR_FLOAT,pcompress->wptr,
&options,&no_elements);
if(alg==AVERAGE) {
status = array_average(pcompress,pcompress->wptr,no_elements);
} else if(alg==CIRBUF) {
(void)put_value(pcompress,pcompress->wptr,no_elements);
status = 0;
} else if(pdbAddr->no_elements>1) {
status = compress_array(pcompress,pcompress->wptr,no_elements);
}else if(no_elements==1){
status = compress_value(pcompress,pcompress->wptr);
}else status=1;
}
/* check event list */
if(status!=1) {
monitor(pcompress);
/* process the forward scan link record */
if (pcompress->flnk.type==DB_LINK) dbScanPassive(pcompress->flnk.value.db_link.pdbAddr);
}
pcompress->pact=FALSE;
return(0);
}
static long special(paddr,after)
struct dbAddr *paddr;
int after;
@@ -160,16 +212,6 @@ static long special(paddr,after)
}
}
static long get_precision(paddr,precision)
struct dbAddr *paddr;
long *precision;
{
struct compressRecord *pcompress=(struct compressRecord *)paddr->precord;
*precision = pcompress->prec;
return(0);
}
static long get_value(pcompress,pvdes)
struct compressRecord *pcompress;
struct valueDes *pvdes;
@@ -230,6 +272,16 @@ static long get_units(paddr,units)
return(0);
}
static long get_precision(paddr,precision)
struct dbAddr *paddr;
long *precision;
{
struct compressRecord *pcompress=(struct compressRecord *)paddr->precord;
*precision = pcompress->prec;
return(0);
}
static long get_graphic_double(paddr,pgd)
struct dbAddr *paddr;
struct dbr_grDouble *pgd;
@@ -238,12 +290,9 @@ static long get_graphic_double(paddr,pgd)
pgd->upper_disp_limit = pcompress->hopr;
pgd->lower_disp_limit = pcompress->lopr;
pgd->upper_alarm_limit = 0.0;
pgd->upper_warning_limit = 0.0;
pgd->lower_warning_limit = 0.0;
pgd->lower_alarm_limit = 0.0;
return(0);
}
static long get_control_double(paddr,pcd)
struct dbAddr *paddr;
struct dbr_ctrlDouble *pcd;
@@ -254,54 +303,7 @@ static long get_control_double(paddr,pcd)
pcd->lower_ctrl_limit = pcompress->lopr;
return(0);
}
static long process(paddr)
struct dbAddr *paddr;
{
struct compressRecord *pcompress=(struct compressRecord *)(paddr->precord);
long status;
pcompress->pact = TRUE;
if (pcompress->inp.type != DB_LINK) {
status=0;
}else if (pcompress->wptr == NULL) {
if(pcompress->nsev<MAJOR_ALARM) {
pcompress->nsta = READ_ALARM;
pcompress->nsev = MAJOR_ALARM;
}
status=0;
} else {
struct dbAddr *pdbAddr =
(struct dbAddr *)(pcompress->inp.value.db_link.pdbAddr);
long options=0;
long no_elements=pdbAddr->no_elements;
int alg=pcompress->alg;
(void)dbGetLink(&pcompress->inp.value.db_link,pcompress,DBR_FLOAT,pcompress->wptr,
&options,&no_elements);
if(alg==AVERAGE) {
status = array_average(pcompress,pcompress->wptr,no_elements);
} else if(alg==CIRBUF) {
(void)put_value(pcompress,pcompress->wptr,no_elements);
status = 0;
} else if(pdbAddr->no_elements>1) {
status = compress_array(pcompress,pcompress->wptr,no_elements);
}else if(no_elements==1){
status = compress_value(pcompress,pcompress->wptr);
}else status=1;
}
/* check event list */
if(status!=1) {
monitor(pcompress);
/* process the forward scan link record */
if (pcompress->flnk.type==DB_LINK) dbScanPassive(pcompress->flnk.value.db_link.pdbAddr);
}
pcompress->pact=FALSE;
return(0);
}
static void monitor(pcompress)
struct compressRecord *pcompress;

View File

@@ -57,16 +57,17 @@
#define init_record NULL
long process();
#define special NULL
#define get_precision 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_units NULL
#define get_precision NULL
#define get_enum_str NULL
#define get_enum_strs NULL
#define get_graphic_double NULL
#define get_control_double NULL
#define get_enum_strs NULL
#define get_alarm_double NULL
struct rset fanoutRSET={
RSETNUMBER,
@@ -75,16 +76,17 @@ struct rset fanoutRSET={
init_record,
process,
special,
get_precision,
get_value,
cvt_dbaddr,
get_array_info,
put_array_info,
get_enum_str,
get_units,
get_precision,
get_enum_str,
get_enum_strs,
get_graphic_double,
get_control_double,
get_enum_strs };
get_alarm_double };
static long process(paddr)
struct dbAddr *paddr;

View File

@@ -68,16 +68,18 @@
long init_record();
long process();
long special();
#define get_precision NULL
long get_value();
#define cvt_dbaddr NULL
#define get_array_info NULL
#define put_array_info NULL
long get_enum_str();
#define get_units NULL
#define get_precision NULL
long get_enum_str();
long get_enum_strs();
#define get_graphic_double NULL
#define get_control_double NULL
long get_enum_strs();
#define get_alarm_double NULL
struct rset mbbiRSET={
RSETNUMBER,
report,
@@ -85,16 +87,18 @@ struct rset mbbiRSET={
init_record,
process,
special,
get_precision,
get_value,
cvt_dbaddr,
get_array_info,
put_array_info,
get_enum_str,
get_units,
get_precision,
get_enum_str,
get_enum_strs,
get_graphic_double,
get_control_double,
get_enum_strs };
get_alarm_double };
struct mbbidset { /* multi bit binary input dset */
long number;
DEVSUPFUN dev_report;
@@ -147,67 +151,6 @@ static long init_record(pmbbi)
}
return(0);
}
static long special(paddr,after)
struct dbAddr *paddr;
int after;
{
struct mbbiRecord *pmbbi = (struct mbbiRecord *)(paddr->precord);
int special_type = paddr->special;
if(!after) return(0);
switch(special_type) {
case(SPC_MOD):
init_common(pmbbi);
return(0);
default:
recGblDbaddrError(S_db_badChoice,paddr,"mbbi: special");
return(S_db_badChoice);
}
}
static long get_value(pmbbi,pvdes)
struct mbbiRecord *pmbbi;
struct valueDes *pvdes;
{
pvdes->field_type = DBF_ENUM;
pvdes->no_elements=1;
(unsigned short *)(pvdes->pvalue) = &pmbbi->val;
return(0);
}
static long get_enum_str(paddr,pstring)
struct dbAddr *paddr;
char *pstring;
{
struct mbbiRecord *pmbbi=(struct mbbiRecord *)paddr->precord;
char *psource;
unsigned short val=pmbbi->val;
if(val<= 15) {
psource = (pmbbi->zrst);
psource += (val * sizeof(pmbbi->zrst));
strncpy(pstring,psource,sizeof(pmbbi->zrst));
} else {
strcpy(pstring,"Illegal Value");
}
return(0);
}
static long get_enum_strs(paddr,pes)
struct dbAddr *paddr;
struct dbr_enumStrs *pes;
{
struct mbbiRecord *pmbbi=(struct mbbiRecord *)paddr->precord;
char *psource;
int i;
pes->no_str = 16;
bzero(pes->strs,sizeof(pes->strs));
for(i=0,psource=(pmbbi->zrst); i<15; i++, psource += sizeof(pmbbi->zrst) )
strncpy(pes->strs[i],psource,sizeof(pmbbi->zrst));
return(0);
}
static long process(paddr)
struct dbAddr *paddr;
@@ -260,6 +203,68 @@ static long process(paddr)
pmbbi->pact=FALSE;
return(status);
}
static long special(paddr,after)
struct dbAddr *paddr;
int after;
{
struct mbbiRecord *pmbbi = (struct mbbiRecord *)(paddr->precord);
int special_type = paddr->special;
if(!after) return(0);
switch(special_type) {
case(SPC_MOD):
init_common(pmbbi);
return(0);
default:
recGblDbaddrError(S_db_badChoice,paddr,"mbbi: special");
return(S_db_badChoice);
}
}
static long get_value(pmbbi,pvdes)
struct mbbiRecord *pmbbi;
struct valueDes *pvdes;
{
pvdes->field_type = DBF_ENUM;
pvdes->no_elements=1;
(unsigned short *)(pvdes->pvalue) = &pmbbi->val;
return(0);
}
static long get_enum_str(paddr,pstring)
struct dbAddr *paddr;
char *pstring;
{
struct mbbiRecord *pmbbi=(struct mbbiRecord *)paddr->precord;
char *psource;
unsigned short val=pmbbi->val;
if(val<= 15) {
psource = (pmbbi->zrst);
psource += (val * sizeof(pmbbi->zrst));
strncpy(pstring,psource,sizeof(pmbbi->zrst));
} else {
strcpy(pstring,"Illegal Value");
}
return(0);
}
static long get_enum_strs(paddr,pes)
struct dbAddr *paddr;
struct dbr_enumStrs *pes;
{
struct mbbiRecord *pmbbi=(struct mbbiRecord *)paddr->precord;
char *psource;
int i;
pes->no_str = 16;
bzero(pes->strs,sizeof(pes->strs));
for(i=0,psource=(pmbbi->zrst); i<15; i++, psource += sizeof(pmbbi->zrst) )
strncpy(pes->strs[i],psource,sizeof(pmbbi->zrst));
return(0);
}
static void alarm(pmbbi)
struct mbbiRecord *pmbbi;
@@ -267,8 +272,6 @@ static void alarm(pmbbi)
unsigned short *severities;
short val=pmbbi->val;
if(val == pmbbi->lalm) return;
pmbbi->lalm = val;
/* check for state alarm */
/* unknown state */

View File

@@ -72,16 +72,17 @@
long init_record();
long process();
long special();
#define get_precision NULL
long get_value();
#define cvt_dbaddr NULL
#define get_array_info NULL
#define put_array_info NULL
long get_enum_str();
#define get_units NULL
#define get_precision NULL
long get_enum_str();
long get_enum_strs();
#define get_graphic_double NULL
#define get_control_double NULL
long get_enum_strs();
#define get_alarm_double NULL
struct rset mbboRSET={
RSETNUMBER,
@@ -90,16 +91,17 @@ struct rset mbboRSET={
init_record,
process,
special,
get_precision,
get_value,
cvt_dbaddr,
get_array_info,
put_array_info,
get_enum_str,
get_units,
get_precision,
get_enum_str,
get_enum_strs,
get_graphic_double,
get_control_double,
get_enum_strs };
get_alarm_double };
struct mbbodset { /* multi bit binary input dset */
long number;
@@ -113,6 +115,7 @@ struct mbbodset { /* multi bit binary input dset */
void alarm();
void monitor();
static void init_common(pmbbo)
struct mbboRecord *pmbbo;
@@ -142,7 +145,6 @@ static long init_record(pmbbo)
init_common(pmbbo);
pmbbo->mlst = -1;
pmbbo->lalm = -1;
if(!(pdset = (struct mbbodset *)(pmbbo->dset))) {
recGblRecordError(S_dev_noDSET,pmbbo,"mbbo: init_record");
@@ -175,6 +177,67 @@ static long init_record(pmbbo)
return(0);
}
static long process(paddr)
struct dbAddr *paddr;
{
struct mbboRecord *pmbbo=(struct mbboRecord *)(paddr->precord);
struct mbbodset *pdset = (struct mbbodset *)(pmbbo->dset);
long status;
unsigned long *pstate_values;
short i,rbv;
if( (pdset==NULL) || (pdset->write_mbbo==NULL) ) {
pmbbo->pact=TRUE;
recGblRecordError(S_dev_missingSup,pmbbo,"write_mbbo");
return(S_dev_missingSup);
}
/* fetch the desired output if there is a database link */
if (!pmbbo->pact && pmbbo->dol.type==DB_LINK && pmbbo->omsl==CLOSED_LOOP){
long options=0;
long nRequest=1;
short savepact=pmbbo->pact;
pmbbo->pact = TRUE;
(void)dbGetLink(&pmbbo->dol.value.db_link,pmbbo,DBR_ENUM,
&(pmbbo->val),&options,&nRequest);
pmbbo->pact = savepact;
}
status=(*pdset->write_mbbo)(pmbbo); /* write the new value */
pmbbo->pact = TRUE;
/* status is one if an asynchronous record is being processed*/
if(status==1) return(0);
/* convert the value */
if (pmbbo->sdef){
pstate_values = &(pmbbo->zrvl);
rbv = -1; /* initalize to unknown state*/
for (i = 0; i < 16; i++){
if (*pstate_values == pmbbo->rval){
rbv = i;
break;
}
pstate_values++;
}
}else{
/* the raw value is the desired value */
rbv = (unsigned short)(pmbbo->rval);
}
pmbbo->rbv = rbv;
/* check for alarms */
alarm(pmbbo);
/* check event list */
monitor(pmbbo);
/* process the forward scan link record */
if (pmbbo->flnk.type==DB_LINK) dbScanPassive(pmbbo->flnk.value.db_link.pdbAddr);
pmbbo->pact=FALSE;
return(status);
}
static long special(paddr,after)
struct dbAddr *paddr;
int after;
@@ -236,77 +299,12 @@ static long get_enum_strs(paddr,pes)
return(0);
}
static long process(paddr)
struct dbAddr *paddr;
{
struct mbboRecord *pmbbo=(struct mbboRecord *)(paddr->precord);
struct mbbodset *pdset = (struct mbbodset *)(pmbbo->dset);
long status;
unsigned long *pstate_values;
short i,rbv;
if( (pdset==NULL) || (pdset->write_mbbo==NULL) ) {
pmbbo->pact=TRUE;
recGblRecordError(S_dev_missingSup,pmbbo,"write_mbbo");
return(S_dev_missingSup);
}
/* fetch the desired output if there is a database link */
if (!pmbbo->pact && pmbbo->dol.type==DB_LINK && pmbbo->omsl==CLOSED_LOOP){
long options=0;
long nRequest=1;
short savepact=pmbbo->pact;
pmbbo->pact = TRUE;
(void)dbGetLink(&pmbbo->dol.value.db_link,pmbbo,DBR_ENUM,
&(pmbbo->val),&options,&nRequest);
pmbbo->pact = savepact;
}
if(pmbbo->lalm != pmbbo->val) { /*we have a change*/
status=(*pdset->write_mbbo)(pmbbo); /* write the new value */
pmbbo->pact = TRUE;
/* status is one if an asynchronous record is being processed*/
if(status==1) return(0);
/* convert the value */
if (pmbbo->sdef){
pstate_values = &(pmbbo->zrvl);
rbv = -1; /* initalize to unknown state*/
for (i = 0; i < 16; i++){
if (*pstate_values == pmbbo->rval){
rbv = i;
break;
}
pstate_values++;
}
}else{
/* the raw value is the desired value */
rbv = (unsigned short)(pmbbo->rval);
}
pmbbo->rbv = rbv;
} else pmbbo->pact = TRUE;
/* check for alarms */
alarm(pmbbo);
/* check event list */
monitor(pmbbo);
/* process the forward scan link record */
if (pmbbo->flnk.type==DB_LINK) dbScanPassive(pmbbo->flnk.value.db_link.pdbAddr);
pmbbo->pact=FALSE;
return(status);
}
static void alarm(pmbbo)
struct mbboRecord *pmbbo;
{
unsigned short *severities;
short val=pmbbo->val;
if(val == pmbbo->lalm) return;
pmbbo->lalm = val;
/* check for state alarm */
/* unknown state */

View File

@@ -50,16 +50,17 @@
#define init_record NULL
long process();
#define special NULL
#define get_precision NULL
long get_value();
#define cvt_dbaddr NULL
#define get_array_info NULL
#define put_array_info NULL
#define get_enum_str NULL
#define get_units NULL
#define get_precision NULL
#define get_enum_str NULL
#define get_enum_strs NULL
#define get_graphic_double NULL
#define get_control_double NULL
#define get_enum_strs NULL
#define get_alarm_double NULL
struct rset permissiveRSET={
RSETNUMBER,
@@ -68,27 +69,18 @@ struct rset permissiveRSET={
init_record,
process,
special,
get_precision,
get_value,
cvt_dbaddr,
get_array_info,
put_array_info,
get_enum_str,
get_units,
get_precision,
get_enum_str,
get_enum_strs,
get_graphic_double,
get_control_double,
get_enum_strs };
get_alarm_double };
static long get_value(ppermissive,pvdes)
struct permissiveRecord *ppermissive;
struct valueDes *pvdes;
{
pvdes->field_type = DBF_SHORT;
pvdes->no_elements=1;
(short *)(pvdes->pvalue) = &(ppermissive->val);
return(0);
}
static long process(paddr)
struct dbAddr *paddr;
{
@@ -100,3 +92,13 @@ static long process(paddr)
ppermissive->pact=FALSE;
return(0);
}
static long get_value(ppermissive,pvdes)
struct permissiveRecord *ppermissive;
struct valueDes *pvdes;
{
pvdes->field_type = DBF_SHORT;
pvdes->no_elements=1;
(short *)(pvdes->pvalue) = &(ppermissive->val);
return(0);
}

View File

@@ -53,16 +53,17 @@ unsigned long tickGet();
long init_record();
long process();
#define special NULL
long get_precision();
long get_value();
#define cvt_dbaddr NULL
#define get_array_info NULL
#define put_array_info NULL
#define get_enum_str NULL
long get_units();
long get_precision();
#define get_enum_str NULL
#define get_enum_strs NULL
long get_graphic_double();
long get_control_double();
#define get_enum_strs NULL
long get_alarm_double();
struct rset pidRSET={
RSETNUMBER,
@@ -71,16 +72,17 @@ struct rset pidRSET={
init_record,
process,
special,
get_precision,
get_value,
cvt_dbaddr,
get_array_info,
put_array_info,
get_enum_str,
get_enum_strs,
get_units,
get_precision,
get_graphic_double,
get_control_double,
get_enum_strs };
get_alarm_double };
void alarm();
@@ -101,62 +103,6 @@ static long init_record(ppid)
ppid->val = ppid->stpl.value.value;
return(0);
}
static long get_precision(paddr,precision)
struct dbAddr *paddr;
long *precision;
{
struct pidRecord *ppid=(struct pidRecord *)paddr->precord;
*precision = ppid->prec;
return(0);
}
static long get_value(ppid,pvdes)
struct pidRecord *ppid;
struct valueDes *pvdes;
{
pvdes->field_type = DBF_FLOAT;
pvdes->no_elements=1;
(float *)(pvdes->pvalue) = &ppid->val;
return(0);
}
static long get_units(paddr,units)
struct dbAddr *paddr;
char *units;
{
struct pidRecord *ppid=(struct pidRecord *)paddr->precord;
strncpy(units,ppid->egu,sizeof(ppid->egu));
return(0);
}
static long get_graphic_double(paddr,pgd)
struct dbAddr *paddr;
struct dbr_grDouble *pgd;
{
struct pidRecord *ppid=(struct pidRecord *)paddr->precord;
pgd->upper_disp_limit = ppid->hopr;
pgd->lower_disp_limit = ppid->lopr;
pgd->upper_alarm_limit = ppid->hihi;
pgd->upper_warning_limit = ppid->high;
pgd->lower_warning_limit = ppid->low;
pgd->lower_alarm_limit = ppid->lolo;
return(0);
}
static long get_control_double(paddr,pcd)
struct dbAddr *paddr;
struct dbr_ctrlDouble *pcd;
{
struct pidRecord *ppid=(struct pidRecord *)paddr->precord;
pcd->upper_ctrl_limit = ppid->hopr;
pcd->lower_ctrl_limit = ppid->lopr;
return(0);
}
static long process(paddr)
struct dbAddr *paddr;
@@ -184,21 +130,88 @@ static long process(paddr)
ppid->pact=FALSE;
return(status);
}
static long get_value(ppid,pvdes)
struct pidRecord *ppid;
struct valueDes *pvdes;
{
pvdes->field_type = DBF_FLOAT;
pvdes->no_elements=1;
(float *)(pvdes->pvalue) = &ppid->val;
return(0);
}
static long get_units(paddr,units)
struct dbAddr *paddr;
char *units;
{
struct pidRecord *ppid=(struct pidRecord *)paddr->precord;
strncpy(units,ppid->egu,sizeof(ppid->egu));
return(0);
}
static long get_precision(paddr,precision)
struct dbAddr *paddr;
long *precision;
{
struct pidRecord *ppid=(struct pidRecord *)paddr->precord;
*precision = ppid->prec;
return(0);
}
static long get_graphic_double(paddr,pgd)
struct dbAddr *paddr;
struct dbr_grDouble *pgd;
{
struct pidRecord *ppid=(struct pidRecord *)paddr->precord;
pgd->upper_disp_limit = ppid->hopr;
pgd->lower_disp_limit = ppid->lopr;
return(0);
}
static long get_control_double(paddr,pcd)
struct dbAddr *paddr;
struct dbr_ctrlDouble *pcd;
{
struct pidRecord *ppid=(struct pidRecord *)paddr->precord;
pcd->upper_ctrl_limit = ppid->hopr;
pcd->lower_ctrl_limit = ppid->lopr;
return(0);
}
static long get_alarm_double(paddr,pad)
struct dbAddr *paddr;
struct dbr_alDouble *pad;
{
struct pidRecord *ppid=(struct pidRecord *)paddr->precord;
pad->upper_alarm_limit = ppid->hihi;
pad->upper_warning_limit = ppid->high;
pad->lower_warning_limit = ppid->low;
pad->lower_alarm_limit = ppid->lolo;
return(0);
}
static void alarm(ppid)
struct pidRecord *ppid;
{
float ftemp;
float val=ppid->val;
/* if difference is not > hysterisis don't bother */
/* if difference is not > hysterisis use lalm not val */
ftemp = ppid->lalm - ppid->val;
if(ftemp<0.0) ftemp = -ftemp;
if (ftemp < ppid->hyst) return;
if (ftemp < ppid->hyst) val=ppid->lalm;
/* alarm condition hihi */
if (ppid->nsev<ppid->hhsv){
if (ppid->val > ppid->hihi){
ppid->lalm = ppid->val;
if (val > ppid->hihi){
ppid->lalm = val;
ppid->nsta = HIHI_ALARM;
ppid->nsev = ppid->hhsv;
return;
@@ -207,8 +220,8 @@ static void alarm(ppid)
/* alarm condition lolo */
if (ppid->nsev<ppid->llsv){
if (ppid->val < ppid->lolo){
ppid->lalm = ppid->val;
if (val < ppid->lolo){
ppid->lalm = val;
ppid->nsta = LOLO_ALARM;
ppid->nsev = ppid->llsv;
return;
@@ -217,8 +230,8 @@ static void alarm(ppid)
/* alarm condition high */
if (ppid->nsev<ppid->hsv){
if (ppid->val > ppid->high){
ppid->lalm = ppid->val;
if (val > ppid->high){
ppid->lalm = val;
ppid->nsta = HIGH_ALARM;
ppid->nsev =ppid->hsv;
return;
@@ -227,8 +240,8 @@ static void alarm(ppid)
/* alarm condition lolo */
if (ppid->nsev<ppid->lsv){
if (ppid->val < ppid->low){
ppid->lalm = ppid->val;
if (val < ppid->low){
ppid->lalm = val;
ppid->nsta = LOW_ALARM;
ppid->nsev = ppid->lsv;
return;

View File

@@ -54,16 +54,17 @@
long init_record();
long process();
#define special NULL
long get_precision();
long get_value();
#define cvt_dbaddr NULL
#define get_array_info NULL
#define put_array_info NULL
#define get_enum_str NULL
long get_units();
long get_precision();
#define get_enum_str NULL
#define get_enum_strs NULL
long get_graphic_double();
long get_control_double();
#define get_enum_strs NULL
long get_alarm_double();
struct rset selRSET={
RSETNUMBER,
@@ -72,16 +73,17 @@ struct rset selRSET={
init_record,
process,
special,
get_precision,
get_value,
cvt_dbaddr,
get_array_info,
put_array_info,
get_enum_str,
get_units,
get_precision,
get_enum_str,
get_enum_strs,
get_graphic_double,
get_control_double,
get_enum_strs };
get_alarm_double };
#define SEL_MAX 6
#define SELECTED 0
@@ -110,62 +112,6 @@ static long init_record(psel)
if(psel->inpf.type==CONSTANT) psel->f = psel->inpf.value.value;
return(0);
}
static long get_precision(paddr,precision)
struct dbAddr *paddr;
long *precision;
{
struct selRecord *psel=(struct selRecord *)paddr->precord;
*precision = psel->prec;
return(0);
}
static long get_value(psel,pvdes)
struct selRecord *psel;
struct valueDes *pvdes;
{
pvdes->field_type = DBF_FLOAT;
pvdes->no_elements=1;
(float *)(pvdes->pvalue) = &psel->val;
return(0);
}
static long get_units(paddr,units)
struct dbAddr *paddr;
char *units;
{
struct selRecord *psel=(struct selRecord *)paddr->precord;
strncpy(units,psel->egu,sizeof(psel->egu));
return(0);
}
static long get_graphic_double(paddr,pgd)
struct dbAddr *paddr;
struct dbr_grDouble *pgd;
{
struct selRecord *psel=(struct selRecord *)paddr->precord;
pgd->upper_disp_limit = psel->hopr;
pgd->lower_disp_limit = psel->lopr;
pgd->upper_alarm_limit = psel->hihi;
pgd->upper_warning_limit = psel->high;
pgd->lower_warning_limit = psel->low;
pgd->lower_alarm_limit = psel->lolo;
return(0);
}
static long get_control_double(paddr,pcd)
struct dbAddr *paddr;
struct dbr_ctrlDouble *pcd;
{
struct selRecord *psel=(struct selRecord *)paddr->precord;
pcd->upper_ctrl_limit = psel->hopr;
pcd->lower_ctrl_limit = psel->lopr;
return(0);
}
static long process(paddr)
struct dbAddr *paddr;
@@ -174,7 +120,7 @@ static long process(paddr)
psel->pact = TRUE;
fetch_values(psel);
if(!do_sel(psel)) {
if(do_sel(psel)!=0) {
if(psel->nsev<MAJOR_ALARM) {
psel->nsta = CALC_ALARM;
psel->nsev = MAJOR_ALARM;
@@ -194,21 +140,90 @@ static long process(paddr)
psel->pact=FALSE;
return(0);
}
static long get_value(psel,pvdes)
struct selRecord *psel;
struct valueDes *pvdes;
{
pvdes->field_type = DBF_FLOAT;
pvdes->no_elements=1;
(float *)(pvdes->pvalue) = &psel->val;
return(0);
}
static long get_units(paddr,units)
struct dbAddr *paddr;
char *units;
{
struct selRecord *psel=(struct selRecord *)paddr->precord;
strncpy(units,psel->egu,sizeof(psel->egu));
return(0);
}
static long get_precision(paddr,precision)
struct dbAddr *paddr;
long *precision;
{
struct selRecord *psel=(struct selRecord *)paddr->precord;
*precision = psel->prec;
return(0);
}
static long get_graphic_double(paddr,pgd)
struct dbAddr *paddr;
struct dbr_grDouble *pgd;
{
struct selRecord *psel=(struct selRecord *)paddr->precord;
pgd->upper_disp_limit = psel->hopr;
pgd->lower_disp_limit = psel->lopr;
return(0);
}
static long get_control_double(paddr,pcd)
struct dbAddr *paddr;
struct dbr_ctrlDouble *pcd;
{
struct selRecord *psel=(struct selRecord *)paddr->precord;
pcd->upper_ctrl_limit = psel->hopr;
pcd->lower_ctrl_limit = psel->lopr;
return(0);
}
static long get_alarm_double(paddr,pgd)
struct dbAddr *paddr;
struct dbr_alDouble *pgd;
{
struct selRecord *psel=(struct selRecord *)paddr->precord;
pgd->upper_alarm_limit = psel->hihi;
pgd->upper_warning_limit = psel->high;
pgd->lower_warning_limit = psel->low;
pgd->lower_alarm_limit = psel->lolo;
return(0);
}
static void alarm(psel)
struct selRecord *psel;
{
float ftemp;
float val=psel->val;
/* if difference is not > hysterisis don't bother */
/* if difference is not > hysterisis use lalm not val */
ftemp = psel->lalm - psel->val;
if(ftemp<0.0) ftemp = -ftemp;
if (ftemp < psel->hyst) return;
if (ftemp < psel->hyst) val=psel->lalm;
/* alarm condition hihi */
if (psel->nsev<psel->hhsv){
if (psel->val > psel->hihi){
psel->lalm = psel->val;
if (val > psel->hihi){
psel->lalm = val;
psel->nsta = HIHI_ALARM;
psel->nsev = psel->hhsv;
return;
@@ -216,8 +231,8 @@ static void alarm(psel)
}
/* alarm condition lolo */
if (psel->nsev<psel->llsv){
if (psel->val < psel->lolo){
psel->lalm = psel->val;
if (val < psel->lolo){
psel->lalm = val;
psel->nsta = LOLO_ALARM;
psel->nsev = psel->llsv;
return;
@@ -225,8 +240,8 @@ static void alarm(psel)
}
/* alarm condition high */
if (psel->nsev<psel->hsv){
if (psel->val > psel->high){
psel->lalm = psel->val;
if (val > psel->high){
psel->lalm = val;
psel->nsta = HIGH_ALARM;
psel->nsev =psel->hsv;
return;
@@ -234,8 +249,8 @@ static void alarm(psel)
}
/* alarm condition lolo */
if (psel->nsev<psel->lsv){
if (psel->val < psel->low){
psel->lalm = psel->val;
if (val < psel->low){
psel->lalm = val;
psel->nsta = LOW_ALARM;
psel->nsev = psel->lsv;
return;
@@ -330,6 +345,7 @@ struct selRecord *psel; /* pointer to selection record */
case (SELECT_HIGH):
psel->val = *pvalue;
for (i = 0; i < SEL_MAX; i++,pvalue++){
if (*pvalue == udfFloat) continue;
if (psel->val < *pvalue)
psel->val = *pvalue;
}
@@ -337,6 +353,7 @@ struct selRecord *psel; /* pointer to selection record */
case (SELECT_LOW):
psel->val = *pvalue;
for (i = 0; i < SEL_MAX; i++,pvalue++){
if (*pvalue == udfFloat) continue;
if (psel->val > *pvalue)
psel->val = *pvalue;
}
@@ -346,6 +363,7 @@ struct selRecord *psel; /* pointer to selection record */
plink = &psel->inpa;
order_inx = 0;
for (i = 0; i < SEL_MAX; i++,pvalue++,plink++){
if (*pvalue == udfFloat) continue;
if (plink->type == DB_LINK){
j = order_inx;
while ((order[j-1] > *pvalue) && (j > 0)){

View File

@@ -51,16 +51,17 @@
#define init_record NULL
long process();
#define special NULL
#define get_precision NULL
long get_value();
#define cvt_dbaddr NULL
#define get_array_info NULL
#define put_array_info NULL
#define get_enum_str NULL
#define get_units NULL
#define get_precision NULL
#define get_enum_str NULL
#define get_enum_strs NULL
#define get_graphic_double NULL
#define get_control_double NULL
#define get_enum_strs NULL
#define get_alarm_double NULL
struct rset stateRSET={
RSETNUMBER,
@@ -69,28 +70,18 @@ struct rset stateRSET={
init_record,
process,
special,
get_precision,
get_value,
cvt_dbaddr,
get_array_info,
put_array_info,
get_enum_str,
get_units,
get_precision,
get_enum_str,
get_enum_strs,
get_graphic_double,
get_control_double,
get_enum_strs };
get_alarm_double };
static long get_value(pstate,pvdes)
struct stateRecord *pstate;
struct valueDes *pvdes;
{
pvdes->field_type = DBF_STRING;
pvdes->no_elements=1;
pvdes->pvalue = (caddr_t)(&pstate->val[0]);
return(0);
}
static long process(paddr)
struct dbAddr *paddr;
{
@@ -107,3 +98,14 @@ static long process(paddr)
pstate->pact=FALSE;
return(0);
}
static long get_value(pstate,pvdes)
struct stateRecord *pstate;
struct valueDes *pvdes;
{
pvdes->field_type = DBF_STRING;
pvdes->no_elements=1;
pvdes->pvalue = (caddr_t)(&pstate->val[0]);
return(0);
}

View File

@@ -54,16 +54,17 @@
long init_record();
long process();
#define special NULL
long get_precision();
long get_value();
#define cvt_dbaddr NULL
#define get_array_info NULL
#define put_array_info NULL
#define get_enum_str NULL
long get_units();
long get_precision();
#define get_enum_str NULL
#define get_enum_strs NULL
long get_graphic_double();
long get_control_double();
#define get_enum_strs NULL
long get_alarm_double();
struct rset subRSET={
RSETNUMBER,
@@ -72,16 +73,17 @@ struct rset subRSET={
init_record,
process,
special,
get_precision,
get_value,
cvt_dbaddr,
get_array_info,
put_array_info,
get_enum_str,
get_units,
get_precision,
get_enum_str,
get_enum_strs,
get_graphic_double,
get_control_double,
get_enum_strs };
get_alarm_double };
void alarm();
void monitor();
@@ -122,7 +124,7 @@ static long init_record(psub)
status = psubroutine(psub,process);
/* convert the subroutine name to an address and type */
/* convert the initialization subroutine name */
/* convert the processing subroutine name */
temp[0] = 0; /* all global variables start with _ */
if (psub->snam[0] != '_'){
strcpy(temp,"_");
@@ -137,62 +139,6 @@ static long init_record(psub)
return(0);
}
static long get_precision(paddr,precision)
struct dbAddr *paddr;
long *precision;
{
struct subRecord *psub=(struct subRecord *)paddr->precord;
*precision = psub->prec;
return(0);
}
static long get_value(psub,pvdes)
struct subRecord *psub;
struct valueDes *pvdes;
{
pvdes->field_type = DBF_FLOAT;
pvdes->no_elements=1;
(float *)(pvdes->pvalue) = &psub->val;
return(0);
}
static long get_units(paddr,units)
struct dbAddr *paddr;
char *units;
{
struct subRecord *psub=(struct subRecord *)paddr->precord;
strncpy(units,psub->egu,sizeof(psub->egu));
return(0);
}
static long get_graphic_double(paddr,pgd)
struct dbAddr *paddr;
struct dbr_grDouble *pgd;
{
struct subRecord *psub=(struct subRecord *)paddr->precord;
pgd->upper_disp_limit = psub->hopr;
pgd->lower_disp_limit = psub->lopr;
pgd->upper_alarm_limit = psub->hihi;
pgd->upper_warning_limit = psub->high;
pgd->lower_warning_limit = psub->low;
pgd->lower_alarm_limit = psub->lolo;
return(0);
}
static long get_control_double(paddr,pcd)
struct dbAddr *paddr;
struct dbr_ctrlDouble *pcd;
{
struct subRecord *psub=(struct subRecord *)paddr->precord;
pcd->upper_ctrl_limit = psub->hopr;
pcd->lower_ctrl_limit = psub->lopr;
return(0);
}
static long process(paddr)
struct dbAddr *paddr;
{
@@ -216,21 +162,88 @@ static long process(paddr)
psub->pact = FALSE;
return(0);
}
static long get_value(psub,pvdes)
struct subRecord *psub;
struct valueDes *pvdes;
{
pvdes->field_type = DBF_FLOAT;
pvdes->no_elements=1;
(float *)(pvdes->pvalue) = &psub->val;
return(0);
}
static long get_units(paddr,units)
struct dbAddr *paddr;
char *units;
{
struct subRecord *psub=(struct subRecord *)paddr->precord;
strncpy(units,psub->egu,sizeof(psub->egu));
return(0);
}
static long get_precision(paddr,precision)
struct dbAddr *paddr;
long *precision;
{
struct subRecord *psub=(struct subRecord *)paddr->precord;
*precision = psub->prec;
return(0);
}
static long get_graphic_double(paddr,pgd)
struct dbAddr *paddr;
struct dbr_grDouble *pgd;
{
struct subRecord *psub=(struct subRecord *)paddr->precord;
pgd->upper_disp_limit = psub->hopr;
pgd->lower_disp_limit = psub->lopr;
return(0);
}
static long get_control_double(paddr,pcd)
struct dbAddr *paddr;
struct dbr_ctrlDouble *pcd;
{
struct subRecord *psub=(struct subRecord *)paddr->precord;
pcd->upper_ctrl_limit = psub->hopr;
pcd->lower_ctrl_limit = psub->lopr;
return(0);
}
static long get_alarm_double(paddr,pad)
struct dbAddr *paddr;
struct dbr_alDouble *pad;
{
struct subRecord *psub=(struct subRecord *)paddr->precord;
pad->upper_alarm_limit = psub->hihi;
pad->upper_warning_limit = psub->high;
pad->lower_warning_limit = psub->low;
pad->lower_alarm_limit = psub->lolo;
return(0);
}
static void alarm(psub)
struct subRecord *psub;
{
float ftemp;
float val=psub->val;
/* if difference is not > hysterisis don't bother */
/* if difference is not > hysterisis use lalm not val */
ftemp = psub->lalm - psub->val;
if(ftemp<0.0) ftemp = -ftemp;
if (ftemp < psub->hyst) return;
if (ftemp < psub->hyst) val=psub->lalm;
/* alarm condition hihi */
if (psub->nsev<psub->hhsv){
if (psub->val > psub->hihi){
psub->lalm = psub->val;
if (val > psub->hihi){
psub->lalm = val;
psub->nsta = HIHI_ALARM;
psub->nsev = psub->hhsv;
return;
@@ -239,8 +252,8 @@ static void alarm(psub)
/* alarm condition lolo */
if (psub->nsev<psub->llsv){
if (psub->val < psub->lolo){
psub->lalm = psub->val;
if (val < psub->lolo){
psub->lalm = val;
psub->nsta = LOLO_ALARM;
psub->nsev = psub->llsv;
return;
@@ -249,8 +262,8 @@ static void alarm(psub)
/* alarm condition high */
if (psub->nsev<psub->hsv){
if (psub->val > psub->high){
psub->lalm = psub->val;
if (val > psub->high){
psub->lalm = val;
psub->nsta = HIGH_ALARM;
psub->nsev =psub->hsv;
return;
@@ -258,8 +271,8 @@ static void alarm(psub)
}
/* alarm condition lolo */
if (psub->nsev<psub->lsv){
if (psub->val < psub->low){
psub->lalm = psub->val;
if (val < psub->low){
psub->lalm = val;
psub->nsta = LOW_ALARM;
psub->nsev = psub->lsv;
return;

View File

@@ -62,16 +62,17 @@
long init_record();
long process();
#define special NULL
#define get_precision NULL
long get_value();
#define cvt_dbaddr NULL
#define get_array_info NULL
#define put_array_info NULL
#define get_enum_str NULL
#define get_units NULL
#define get_precision NULL
#define get_enum_str NULL
#define get_enum_strs NULL
#define get_graphic_double NULL
#define get_control_double NULL
#define get_enum_strs NULL
#define get_alarm_double NULL
struct rset timerRSET={
RSETNUMBER,
@@ -80,16 +81,17 @@ struct rset timerRSET={
init_record,
process,
special,
get_precision,
get_value,
cvt_dbaddr,
get_array_info,
put_array_info,
get_enum_str,
get_units,
get_precision,
get_enum_str,
get_enum_strs,
get_graphic_double,
get_control_double,
get_enum_strs };
get_alarm_double };
/* because the driver does all the work just declare device support here*/
struct dset devTmMizar8310={4,NULL,NULL,NULL,NULL};
@@ -112,15 +114,6 @@ static long init_record(ptimer)
return(0);
}
static long get_value(ptimer,pvdes)
struct timerRecord *ptimer;
struct valueDes *pvdes;
{
pvdes->field_type = DBF_SHORT;
pvdes->no_elements=1;
(short *)(pvdes->pvalue) = &ptimer->val;
return(0);
}
static long process(paddr)
struct dbAddr *paddr;
@@ -141,8 +134,18 @@ static long process(paddr)
return(0);
}
static long get_value(ptimer,pvdes)
struct timerRecord *ptimer;
struct valueDes *pvdes;
{
pvdes->field_type = DBF_SHORT;
pvdes->no_elements=1;
(short *)(pvdes->pvalue) = &ptimer->val;
return(0);
}
static void monitor(ptimer)
struct timerRecord *ptimer;
struct timerRecord *ptimer;
{
unsigned short monitor_mask;
short stat,sevr,nsta,nsev;

View File

@@ -68,16 +68,17 @@
long init_record();
long process();
#define special NULL
long get_precision();
long get_value();
long cvt_dbaddr();
long get_array_info();
long put_array_info();
#define get_enum_str NULL
long get_units();
long get_precision();
#define get_enum_str NULL
#define get_enum_strs NULL
long get_graphic_double();
long get_control_double();
#define get_enum_strs NULL
long get_alarm_double();
struct rset waveformRSET={
RSETNUMBER,
@@ -86,16 +87,18 @@ struct rset waveformRSET={
init_record,
process,
special,
get_precision,
get_value,
cvt_dbaddr,
get_array_info,
put_array_info,
get_enum_str,
get_units,
get_precision,
get_enum_str,
get_enum_strs,
get_graphic_double,
get_control_double,
get_enum_strs };
get_alarm_double };
struct wfdset { /* waveform dset */
long number;
DEVSUPFUN dev_report;
@@ -143,15 +146,31 @@ static long init_record(pwf)
}
return(0);
}
static long get_precision(paddr,precision)
struct dbAddr *paddr;
long *precision;
static long process(paddr)
struct dbAddr *paddr;
{
struct waveformRecord *pwf=(struct waveformRecord *)paddr->precord;
struct waveformRecord *pwf=(struct waveformRecord *)(paddr->precord);
struct wfdset *pdset = (struct wfdset *)(pwf->dset);
long status;
*precision = pwf->prec;
return(0);
if( (pdset==NULL) || (pdset->read_wf==NULL) ) {
pwf->pact=TRUE;
recGblRecordError(S_dev_missingSup,pwf,"read_wf");
return(S_dev_missingSup);
}
/*pact must not be set true until read_wf completes*/
status=(*pdset->read_wf)(pwf); /* read the new value */
pwf->pact = TRUE;
/* status is one if an asynchronous record is being processed*/
if(status==1) return(0);
monitor(pwf);
/* process the forward scan link record */
if (pwf->flnk.type==DB_LINK) dbScanPassive(pwf->flnk.value.db_link.pdbAddr);
pwf->pact=FALSE;
return(0);
}
static long get_value(pwf,pvdes)
@@ -199,7 +218,7 @@ static long put_array_info(paddr,nNew)
{
struct waveformRecord *pwf=(struct waveformRecord *)paddr->precord;
pwf->nord = (pwf->nord + nNew);
pwf->nord = nNew;
if(pwf->nord > pwf->nelm) pwf->nord = pwf->nelm;
return(0);
}
@@ -214,6 +233,16 @@ static long get_units(paddr,units)
return(0);
}
static long get_precision(paddr,precision)
struct dbAddr *paddr;
long *precision;
{
struct waveformRecord *pwf=(struct waveformRecord *)paddr->precord;
*precision = pwf->prec;
return(0);
}
static long get_graphic_double(paddr,pgd)
struct dbAddr *paddr;
struct dbr_grDouble *pgd;
@@ -222,10 +251,6 @@ static long get_graphic_double(paddr,pgd)
pgd->upper_disp_limit = pwf->hopr;
pgd->lower_disp_limit = pwf->lopr;
pgd->upper_alarm_limit = 0.0;
pgd->upper_warning_limit = 0.0;
pgd->lower_warning_limit = 0.0;
pgd->lower_alarm_limit = 0.0;
return(0);
}
static long get_control_double(paddr,pcd)
@@ -238,31 +263,17 @@ static long get_control_double(paddr,pcd)
pcd->lower_ctrl_limit = pwf->lopr;
return(0);
}
static long process(paddr)
struct dbAddr *paddr;
static long get_alarm_double(paddr,pgd)
struct dbAddr *paddr;
struct dbr_alDouble *pgd;
{
struct waveformRecord *pwf=(struct waveformRecord *)(paddr->precord);
struct wfdset *pdset = (struct wfdset *)(pwf->dset);
long status;
struct waveformRecord *pwf=(struct waveformRecord *)paddr->precord;
if( (pdset==NULL) || (pdset->read_wf==NULL) ) {
pwf->pact=TRUE;
recGblRecordError(S_dev_missingSup,pwf,"read_wf");
return(S_dev_missingSup);
}
/*pact must not be set true until read_wf completes*/
status=(*pdset->read_wf)(pwf); /* read the new value */
pwf->pact = TRUE;
/* status is one if an asynchronous record is being processed*/
if(status==1) return(0);
monitor(pwf);
/* process the forward scan link record */
if (pwf->flnk.type==DB_LINK) dbScanPassive(pwf->flnk.value.db_link.pdbAddr);
pwf->pact=FALSE;
return(0);
pgd->upper_alarm_limit = 0.0;
pgd->upper_warning_limit = 0.0;
pgd->lower_warning_limit = 0.0;
pgd->lower_alarm_limit = 0.0;
return(0);
}
static void monitor(pwf)