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