Added OOPT to longout record
This commit is contained in:
@@ -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;
|
||||
}
|
||||
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user