ESLO and EOFF are now design fields, usable when no device support

special_linconv() routine is provided (for Raw Soft support).
LINR=SLOPE also allows design-time and CA setting of ESLO & EOFF.
Value changes by device support also cause CA monitors to be posted.
This commit is contained in:
Andrew Johnson
2001-08-17 22:34:58 +00:00
parent 99e5535085
commit a1b9e58cd0
4 changed files with 80 additions and 46 deletions
+32 -13
View File
@@ -1,4 +1,3 @@
/* aiRecord.c */
/* base/src/rec $Id$ */
/* aiRecord.c - Record Support Routines for Analog Input records */
@@ -160,7 +159,7 @@ static long init_record(void *precord,int pass)
{
aiRecord *pai = (aiRecord *)precord;
aidset *pdset;
long status;
double eoff = pai->eoff, eslo = pai->eslo;
if (pass==0) return(0);
@@ -184,10 +183,17 @@ static long init_record(void *precord,int pass)
return(S_dev_missingSup);
}
pai->init = TRUE;
pai->eoff = pai->egul;
if ((pai->linr == menuConvertLINEAR) && pdset->special_linconv) {
pai->eoff = pai->egul;
}
if( pdset->init_record ) {
if((status=(*pdset->init_record)(pai))) return(status);
long status=(*pdset->init_record)(pai);
if (pai->linr == menuConvertSLOPE) {
pai->eoff = eoff;
pai->eslo = eslo;
}
return (status);
}
return(0);
}
@@ -238,9 +244,19 @@ static long special(DBADDR *paddr,int after)
return(S_db_noMod);
}
pai->init=TRUE;
pai->eoff = pai->egul;
if(!(pdset->special_linconv)) return(0);
return((*pdset->special_linconv)(pai,after));
if ((pai->linr == menuConvertLINEAR) && pdset->special_linconv) {
double eoff = pai->eoff;
double eslo = pai->eslo;
long status;
pai->eoff = pai->egul;
status = (*pdset->special_linconv)(pai,after);
if (eoff != pai->eoff)
db_post_events(pai, &pai->eoff, DBE_VALUE|DBE_LOG);
if (eslo != pai->eslo)
db_post_events(pai, &pai->eslo, DBE_VALUE|DBE_LOG);
return(status);
}
return(0);
default:
recGblDbaddrError(S_db_badChoice,paddr,"ai: special");
return(S_db_badChoice);
@@ -367,13 +383,16 @@ static void convert(aiRecord *pai)
val+=pai->aoff;
/* convert raw to engineering units and signal units */
if(pai->linr == menuConvertNO_CONVERSION) {
; /* do nothing*/
}
else if(pai->linr == menuConvertLINEAR) {
switch (pai->linr) {
case menuConvertNO_CONVERSION:
break; /* do nothing*/
case menuConvertLINEAR:
case menuConvertSLOPE:
val = (val * pai->eslo) + pai->eoff;
}
else { /* must use breakpoint table */
break;
default: /* must use breakpoint table */
if (cvtRawToEngBpt(&val,pai->linr,pai->init,(void *)&pai->pbrk,&pai->lbrk)!=0) {
recGblSetSevr(pai,SOFT_ALARM,MAJOR_ALARM);
}
+4 -4
View File
@@ -155,16 +155,16 @@ recordtype(ai) {
interest(3)
}
field(ESLO,DBF_DOUBLE) {
prompt("Rawto EGU Slope")
prompt("Raw to EGU Slope")
promptgroup(GUI_CONVERT)
asl(ASL0)
pp(TRUE)
interest(2)
initial("1")
}
field(EOFF,DBF_DOUBLE) {
prompt("Eng Unit Offset")
prompt("Raw to EGU Offset")
promptgroup(GUI_CONVERT)
asl(ASL0)
pp(TRUE)
interest(2)
}
field(ROFF,DBF_LONG) {
+41 -26
View File
@@ -1,7 +1,6 @@
/* recAo.c */
/* base/src/rec $Id$ */
/* recAo.c - Record Support Routines for Analog Output records */
/* aoRecord.c - Record Support Routines for Analog Output records */
/*
* Original Author: Bob Dalesio
* Current Author: Marty Kraimer
@@ -98,7 +97,7 @@
/* Create RSET - Record Support Entry Table*/
#define report NULL
#define initialize NULL
static long init_record();
static long init_record(struct aoRecord *pao, int pass);
static long process();
static long special();
#define get_value NULL
@@ -152,12 +151,10 @@ static void convert();
static void monitor();
static long writeValue();
static long init_record(pao,pass)
struct aoRecord *pao;
int pass;
static long init_record(struct aoRecord *pao, int pass)
{
struct aodset *pdset;
long status=0;
double eoff = pao->eoff, eslo = pao->eslo;
double value;
if (pass==0) return(0);
@@ -183,10 +180,16 @@ static long init_record(pao,pass)
return(S_dev_missingSup);
}
pao->init = TRUE;
pao->eoff = pao->egul;
if ((pao->linr == menuConvertLINEAR) && pdset->special_linconv) {
pao->eoff = pao->egul;
}
if (pdset->init_record) {
status=(*pdset->init_record)(pao);
long status=(*pdset->init_record)(pao);
if (pao->linr == menuConvertSLOPE) {
pao->eoff = eoff;
pao->eslo = eslo;
}
switch(status){
case(0): /* convert */
value = (double)pao->rval + (double)pao->roff;
@@ -194,8 +197,9 @@ static long init_record(pao,pass)
value += pao->aoff;
if (pao->linr == menuConvertNO_CONVERSION){
; /*do nothing*/
}else if (pao->linr == menuConvertLINEAR){
value = value*pao->eslo + pao->eoff;
} else if ((pao->linr == menuConvertLINEAR) ||
(pao->linr == menuConvertSLOPE)) {
value = value*pao->eslo + pao->eoff;
}else{
if(cvtRawToEngBpt(&value,pao->linr,pao->init,
(void *)&pao->pbrk,&pao->lbrk)!=0) break;
@@ -300,9 +304,19 @@ static long special(paddr,after)
return(S_db_noMod);
}
pao->init=TRUE;
pao->eoff = pao->egul;
if(!(pdset->special_linconv)) return(0);
return((*pdset->special_linconv)(pao,after));
if ((pao->linr == menuConvertLINEAR) && pdset->special_linconv) {
double eoff = pao->eoff;
double eslo = pao->eslo;
long status;
pao->eoff = pao->egul;
status = (*pdset->special_linconv)(pao,after);
if (eoff != pao->eoff)
db_post_events(pao, &pao->eoff, DBE_VALUE|DBE_LOG);
if (eslo != pao->eslo)
db_post_events(pao, &pao->eslo, DBE_VALUE|DBE_LOG);
return (status);
}
return (0);
default:
recGblDbaddrError(S_db_badChoice,paddr,"ao: special");
return(S_db_badChoice);
@@ -483,18 +497,19 @@ static void convert(pao,value)
pao->oval = value;
/* convert */
if (pao->linr == menuConvertNO_CONVERSION) {
; /* do nothing*/
} else if (pao->linr == menuConvertLINEAR){
if (pao->eslo == 0.0) value = 0;
else {
value = (value - pao->eoff) / pao->eslo;
}
}else{
if(cvtEngToRawBpt(&value,pao->linr,pao->init,(void *)&pao->pbrk,&pao->lbrk)!=0){
recGblSetSevr(pao,SOFT_ALARM,MAJOR_ALARM);
return;
}
switch (pao->linr) {
case menuConvertNO_CONVERSION:
break; /* do nothing*/
case menuConvertLINEAR:
case menuConvertSLOPE:
if (pao->eslo == 0.0) value = 0;
else value = (value - pao->eoff) / pao->eslo;
break;
default:
if(cvtEngToRawBpt(&value,pao->linr,pao->init,(void *)&pao->pbrk,&pao->lbrk)!=0){
recGblSetSevr(pao,SOFT_ALARM,MAJOR_ALARM);
return;
}
}
value -= pao->aoff;
if(pao->aslo!=0.0) value /= pao->aslo;
+3 -3
View File
@@ -79,15 +79,15 @@ recordtype(ao) {
interest(2)
}
field(EOFF,DBF_DOUBLE) {
prompt("Eng Unit Offset")
prompt("EGU to Raw Offset")
promptgroup(GUI_CONVERT)
asl(ASL0)
pp(TRUE)
interest(2)
}
field(ESLO,DBF_DOUBLE) {
prompt("EGU to Raw Slope")
promptgroup(GUI_CONVERT)
asl(ASL0)
pp(TRUE)
interest(2)
initial("1")
}