From a9fa63658758a27606af4d8e6d40d94d8d49a322 Mon Sep 17 00:00:00 2001
From: "benjamin.franksen" <benjamin.franksen@helmholtz-berlin.de>
Date: Tue, 8 Oct 2013 12:38:28 +0000
Subject: [PATCH] seq: pvMonitor and pvStopMonitor support multi-PV arrays

---
 src/seq/seqCom.h |  4 +--
 src/seq/seq_if.c | 84 +++++++++++++++++++++++++++++++-----------------
 2 files changed, 56 insertions(+), 32 deletions(-)

diff --git a/src/seq/seqCom.h b/src/seq/seqCom.h
index 555b71e9..f818b765 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 0841a79a..a613576f 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;
 }
 
 /*
-- 
GitLab