From ee59d7e9410148ade30d1e21d355ba09cd51d52b Mon Sep 17 00:00:00 2001
From: Jonathan Hanks <jonathan.hanks@ligo.org>
Date: Mon, 7 Oct 2019 11:28:51 -0700
Subject: [PATCH] Fix counting of disconnected/connected channels in the
 standalone_edc

You can get into a situation where multiple disconnect events happen
w/o connection events.  This makes it look like the code cannot count
connected channels.  Only change the counts when we have a change from
the current state.
---
 src/epics/seq/standalone_edcu.cc | 22 +++++++++++++++++-----
 1 file changed, 17 insertions(+), 5 deletions(-)

diff --git a/src/epics/seq/standalone_edcu.cc b/src/epics/seq/standalone_edcu.cc
index 3d7e93466..2bd61524e 100644
--- a/src/epics/seq/standalone_edcu.cc
+++ b/src/epics/seq/standalone_edcu.cc
@@ -576,11 +576,23 @@ connectCallback( struct connection_handler_args args )
 {
     // **************************************************************************
     int* channel_status = (int*)ca_puser( args.chid );
-    *channel_status = args.op == CA_OP_CONN_UP ? 0 : 0xbad;
-    if ( args.op == CA_OP_CONN_UP )
-        daqd_edcu1.con_chans++;
-    else
-        daqd_edcu1.con_chans--;
+    int  new_status = ( args.op == CA_OP_CONN_UP ? 0 : 0xbad );
+    /* In practice we have seen multiple disconnect events in a row w/o a
+     * connect event. So only update when there is a change.  Otherwise this
+     * code cannot count well.
+     */
+    if ( *channel_status != new_status )
+    {
+        *channel_status = new_status;
+        if ( args.op == CA_OP_CONN_UP )
+        {
+            daqd_edcu1.con_chans++;
+        }
+        else
+        {
+            daqd_edcu1.con_chans--;
+        }
+    }
     daqd_edcu1.con_events++;
 }
 
-- 
GitLab