diff --git a/src/seq/seqCom.h b/src/seq/seqCom.h index 555b71e9e0ff740e18d048f547c1eb253657dc3d..f818b765c8c5e8a2a84f5ed810e5664f1547de9e 100644 --- a/src/seq/seqCom.h +++ b/src/seq/seqCom.h @@ -94,9 +94,9 @@ epicsShareFunc seqBool seq_pvPutComplete(SS_ID, VAR_ID, epicsShareFunc void seq_pvGetCancel(SS_ID, VAR_ID, unsigned); epicsShareFunc void seq_pvPutCancel(SS_ID, VAR_ID, unsigned); epicsShareFunc pvStat seq_pvAssign(SS_ID, VAR_ID, const char *); -epicsShareFunc pvStat seq_pvMonitor(SS_ID, VAR_ID); +epicsShareFunc pvStat seq_pvMonitor(SS_ID, VAR_ID, unsigned); epicsShareFunc void seq_pvSync(SS_ID, VAR_ID, unsigned, EV_ID); -epicsShareFunc pvStat seq_pvStopMonitor(SS_ID, VAR_ID); +epicsShareFunc pvStat seq_pvStopMonitor(SS_ID, VAR_ID, unsigned); /* pv info */ epicsShareFunc char *seq_pvName(SS_ID, VAR_ID); epicsShareFunc unsigned seq_pvCount(SS_ID, VAR_ID); diff --git a/src/seq/seq_if.c b/src/seq/seq_if.c index 0841a79a83b1eaa19540f587bee86fe29dd505c1..a613576fd6a67f3a01b7a9ae78301ceb7ffd94cb 100644 --- a/src/seq/seq_if.c +++ b/src/seq/seq_if.c @@ -692,53 +692,77 @@ epicsShareFunc pvStat seq_pvAssign(SS_ID ss, VAR_ID varId, const char *pvName) /* * Initiate a monitor. */ -epicsShareFunc pvStat seq_pvMonitor(SS_ID ss, VAR_ID varId) +epicsShareFunc pvStat seq_pvMonitor(SS_ID ss, VAR_ID varId, unsigned length) { PROG *sp = ss->prog; - CHAN *ch = sp->chan + varId; - DBCHAN *dbch = ch->dbch; + pvStat status = pvStatOK; + unsigned i; - if (!dbch && optTest(sp, OPT_SAFE)) + for (i=0; i<length; i++) { + CHAN *ch = sp->chan + varId + i; + DBCHAN *dbch = ch->dbch; + + if (!dbch && optTest(sp, OPT_SAFE)) + { + ch->monitored = TRUE; + continue; + } + if (!dbch) + { + errlogSevPrintf(errlogMajor, + "pvMonitor(%s): user error (not assigned to a PV)\n", + ch->varName + ); + return pvStatERROR; + } ch->monitored = TRUE; - return pvStatOK; - } - if (!dbch) - { - errlogSevPrintf(errlogMajor, - "pvMonitor(%s): user error (variable not assigned)\n", - ch->varName - ); - return pvStatERROR; + status = seq_camonitor(ch, TRUE); + if (status != pvStatOK) + { + pv_call_failure(dbch, metaPtr(ch,ss), status); + break; + } } - ch->monitored = TRUE; - return seq_camonitor(ch, TRUE); + return status; } /* * Cancel a monitor. */ -epicsShareFunc pvStat seq_pvStopMonitor(SS_ID ss, VAR_ID varId) +epicsShareFunc pvStat seq_pvStopMonitor(SS_ID ss, VAR_ID varId, unsigned length) { PROG *sp = ss->prog; - CHAN *ch = sp->chan + varId; - DBCHAN *dbch = ch->dbch; + pvStat status = pvStatOK; + unsigned i; - if (!dbch && optTest(sp, OPT_SAFE)) + for (i=0; i<length; i++) { + CHAN *ch = sp->chan + varId + i; + DBCHAN *dbch = ch->dbch; + + if (!dbch && optTest(sp, OPT_SAFE)) + { + ch->monitored = FALSE; + continue; + } + if (!dbch) + { + errlogSevPrintf(errlogMajor, + "pvStopMonitor(%s): user error (not assigned to a PV)\n", + ch->varName + ); + return pvStatERROR; + } ch->monitored = FALSE; - return pvStatOK; - } - if (!dbch) - { - errlogSevPrintf(errlogMajor, - "pvStopMonitor(%s): user error (variable not assigned)\n", - ch->varName - ); - return pvStatERROR; + status = seq_camonitor(ch, FALSE); + if (status != pvStatOK) + { + pv_call_failure(dbch, metaPtr(ch,ss), status); + break; + } } - ch->monitored = FALSE; - return seq_camonitor(ch, FALSE); + return status; } /*