diff --git a/src/rec/aiRecord.c b/src/rec/aiRecord.c index 44b67e996..1a6fc9ede 100644 --- a/src/rec/aiRecord.c +++ b/src/rec/aiRecord.c @@ -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); } diff --git a/src/rec/aiRecord.dbd b/src/rec/aiRecord.dbd index 1843fcf28..30a0c3fde 100644 --- a/src/rec/aiRecord.dbd +++ b/src/rec/aiRecord.dbd @@ -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) { diff --git a/src/rec/aoRecord.c b/src/rec/aoRecord.c index 84fda8079..116b9569c 100644 --- a/src/rec/aoRecord.c +++ b/src/rec/aoRecord.c @@ -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; diff --git a/src/rec/aoRecord.dbd b/src/rec/aoRecord.dbd index a41b18609..dc29466da 100644 --- a/src/rec/aoRecord.dbd +++ b/src/rec/aoRecord.dbd @@ -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") }