From c1ae5064b8199fc21f4d9779b6eb58e9fabea75b Mon Sep 17 00:00:00 2001 From: Joao Paulo Martins Date: Fri, 14 Feb 2020 10:10:58 +0000 Subject: [PATCH] Added OOPT to longout record --- modules/database/src/std/rec/longoutRecord.c | 62 ++++++++++++++++++- .../src/std/rec/longoutRecord.dbd.pod | 25 ++++++++ 2 files changed, 86 insertions(+), 1 deletion(-) diff --git a/modules/database/src/std/rec/longoutRecord.c b/modules/database/src/std/rec/longoutRecord.c index f0e2252bd..f5bb4a292 100644 --- a/modules/database/src/std/rec/longoutRecord.c +++ b/modules/database/src/std/rec/longoutRecord.c @@ -85,6 +85,7 @@ static void checkAlarms(longoutRecord *prec); static void monitor(longoutRecord *prec); static long writeValue(longoutRecord *prec); static void convert(longoutRecord *prec, epicsInt32 value); +static long conditional_write(longoutRecord *prec); static long init_record(struct dbCommon *pcommon, int pass) { @@ -119,6 +120,7 @@ static long init_record(struct dbCommon *pcommon, int pass) prec->mlst = prec->val; prec->alst = prec->val; prec->lalm = prec->val; + prec->oval = prec->val; return 0; } @@ -210,6 +212,15 @@ static long special(DBADDR *paddr, int after) recGblCheckSimm((dbCommon *)prec, &prec->sscn, prec->oldsimm, prec->simm); return(0); } + + /* If OOPT is "on change" we force a write operation */ + if (dbGetFieldIndex(paddr) == longoutRecordOUT) { + if ((!after) && (prec->oopt == longoutOOPT_On_Change)) + prec->oopt = longoutOOPT_Write_Once_Then_On_Change; + return 0; + } + + default: recGblDbaddrError(S_db_badChoice, paddr, "longout: special"); return(S_db_badChoice); @@ -381,7 +392,10 @@ static void monitor(longoutRecord *prec) static long writeValue(longoutRecord *prec) { +<<<<<<< HEAD longoutdset *pdset = (longoutdset *) prec->dset; +======= +>>>>>>> 2b7ca9598 (Added OOPT to longout record) long status = 0; if (!prec->pact) { @@ -391,7 +405,7 @@ static long writeValue(longoutRecord *prec) switch (prec->simm) { case menuYesNoNO: - status = pdset->write_longout(prec); + status = conditional_write(prec); break; case menuYesNoYES: { @@ -428,3 +442,49 @@ static void convert(longoutRecord *prec, epicsInt32 value) } prec->val = value; } + +/* Evaluate OOPT field to perform the write operation */ +static long conditional_write(longoutRecord *prec) +{ + struct longoutdset *pdset = (struct longoutdset *) prec->dset; + long status = 0; + int doDevSupWrite = 0; + + switch (prec->oopt) + { + case longoutOOPT_On_Change: + doDevSupWrite = (prec->val != prec->oval); + break; + + case longoutOOPT_Write_Once_Then_On_Change: + prec->oopt = longoutOOPT_On_Change; + case longoutOOPT_Every_Time: + doDevSupWrite = 1; + break; + + case longoutOOPT_When_Zero: + doDevSupWrite = (prec->val == 0); + break; + + case longoutOOPT_When_Non_zero: + doDevSupWrite = (prec->val != 0); + break; + + case longoutOOPT_Transition_To_Zero: + doDevSupWrite = ((prec->val == 0)&&(prec->oval != 0)); + break; + + case longoutOOPT_Transition_To_Non_zero: + doDevSupWrite = ((prec->val != 0)&&(prec->oval == 0)); + break; + + default: + break; + } + + if (doDevSupWrite) + status = pdset->write_longout(prec); + + prec->oval = prec->val; + return status; +} \ No newline at end of file diff --git a/modules/database/src/std/rec/longoutRecord.dbd.pod b/modules/database/src/std/rec/longoutRecord.dbd.pod index 60037a62f..3f11769ba 100644 --- a/modules/database/src/std/rec/longoutRecord.dbd.pod +++ b/modules/database/src/std/rec/longoutRecord.dbd.pod @@ -20,6 +20,17 @@ limits. =cut +menu(longoutOOPT) { + choice(longoutOOPT_Every_Time,"Every Time") + choice(longoutOOPT_On_Change,"On Change") + choice(longoutOOPT_When_Zero,"When Zero") + choice(longoutOOPT_When_Non_zero,"When Non-zero") + choice(longoutOOPT_Transition_To_Zero,"Transition To Zero") + choice(longoutOOPT_Transition_To_Non_zero,"Transition To Non-zero") + choice(longoutOOPT_Write_Once_Then_On_Change, "Write Once Then On Change") +} + + recordtype(longout) { =head2 Parameter Fields @@ -93,6 +104,7 @@ and database links. } field(OUT,DBF_OUTLINK) { prompt("Output Specification") + special(SPC_MOD) promptgroup("50 - Output") interest(1) } @@ -373,6 +385,19 @@ for more information on simulation mode and its fields. promptgroup("50 - Output") interest(2) } + field(OVAL,DBF_LONG) { + prompt("Last Value Written") + promptgroup("50 - Output") + asl(ASL1) + special(SPC_NOMOD) + } + field(OOPT,DBF_MENU) { + prompt("Output Execute Opt") + promptgroup("50 - Output") + interest(1) + menu(longoutOOPT) + initial("0") + } =begin html