From 5076057d8d2d6fb619210aa26e39e6ee867a6691 Mon Sep 17 00:00:00 2001 From: Dave Hickin Date: Thu, 20 Aug 2015 17:19:18 +0100 Subject: [PATCH] Make isConnected optional field of multi-channel types A boolean[] isConnected field was included in all constructed NTMultiChannels and NTScalarMultiChannels. However this is neither a required nor optional field of these types. Applications use this though, (specifically pvaClient) so treat as if optional field. Add addIsConnected() function to builders and retain isConnected() in wrapper classes. Leave isConnected field in structures until clients updated. --- src/nt/ntmultiChannel.cpp | 18 +++++++++++++++--- src/nt/ntmultiChannel.h | 6 ++++++ src/nt/ntscalarMultiChannel.cpp | 18 +++++++++++++++--- src/nt/ntscalarMultiChannel.h | 6 ++++++ 4 files changed, 42 insertions(+), 6 deletions(-) diff --git a/src/nt/ntmultiChannel.cpp b/src/nt/ntmultiChannel.cpp index b48086a..35dbfd7 100644 --- a/src/nt/ntmultiChannel.cpp +++ b/src/nt/ntmultiChannel.cpp @@ -84,10 +84,16 @@ NTMultiChannelBuilder::shared_pointer NTMultiChannelBuilder::addUserTag() return shared_from_this(); } +NTMultiChannelBuilder::shared_pointer NTMultiChannelBuilder::addIsConnected() +{ + isConnected = true; + return shared_from_this(); +} + StructureConstPtr NTMultiChannelBuilder::createStructure() { StandardFieldPtr standardField = getStandardField(); - size_t nfields = 3; + size_t nfields = 2; size_t extraCount = extraFieldNames.size(); nfields += extraCount; if(descriptor) ++nfields; @@ -99,6 +105,7 @@ StructureConstPtr NTMultiChannelBuilder::createStructure() if(secondsPastEpoch) ++nfields; if(nanoseconds) ++nfields; if(userTag) ++nfields; + if(isConnected) ++nfields; FieldConstPtrArray fields(nfields); StringArray names(nfields); size_t ind = 0; @@ -110,8 +117,6 @@ StructureConstPtr NTMultiChannelBuilder::createStructure() } names[ind] = "channelName"; fields[ind++] = fieldCreate->createScalarArray(pvString); - names[ind] = "isConnected"; - fields[ind++] = fieldCreate->createScalarArray(pvBoolean); if(descriptor) { names[ind] = "descriptor"; fields[ind++] = fieldCreate->createScalar(pvString); @@ -148,6 +153,10 @@ StructureConstPtr NTMultiChannelBuilder::createStructure() names[ind] = "userTag"; fields[ind++] = fieldCreate->createScalarArray(pvInt); } + if(isConnected) { + names[ind] = "isConnected"; + fields[ind++] = fieldCreate->createScalarArray(pvBoolean); + } for (size_t i = 0; i< extraCount; i++) { names[ind] = extraFieldNames[i]; fields[ind++] = extraFields[i]; @@ -187,6 +196,9 @@ void NTMultiChannelBuilder::reset() secondsPastEpoch = false; nanoseconds = false; userTag = false; + // TODO When client code updated, don't include isConnected by default + // i.e. change line below to isConnected = false; + isConnected = true; } diff --git a/src/nt/ntmultiChannel.h b/src/nt/ntmultiChannel.h index c0e806f..0c59a57 100644 --- a/src/nt/ntmultiChannel.h +++ b/src/nt/ntmultiChannel.h @@ -99,6 +99,11 @@ namespace detail { * @return this instance of NTMultiChannelBuilder. */ shared_pointer addUserTag(); + /** + * Add isConnected array to the NTMultiChannel. + * @return this instance of NTMultiChannelBuilder. + */ + shared_pointer addIsConnected(); /** * Create a Structure that represents NTMultiChannel. * This resets this instance state and allows new instance to be created. @@ -139,6 +144,7 @@ namespace detail { bool secondsPastEpoch; bool nanoseconds; bool userTag; + bool isConnected; // NOTE: this preserves order, however it does not handle duplicates epics::pvData::StringArray extraFieldNames; diff --git a/src/nt/ntscalarMultiChannel.cpp b/src/nt/ntscalarMultiChannel.cpp index 2d45142..043e712 100644 --- a/src/nt/ntscalarMultiChannel.cpp +++ b/src/nt/ntscalarMultiChannel.cpp @@ -84,10 +84,16 @@ NTScalarMultiChannelBuilder::shared_pointer NTScalarMultiChannelBuilder::addUser return shared_from_this(); } +NTScalarMultiChannelBuilder::shared_pointer NTScalarMultiChannelBuilder::addIsConnected() +{ + isConnected = true; + return shared_from_this(); +} + StructureConstPtr NTScalarMultiChannelBuilder::createStructure() { StandardFieldPtr standardField = getStandardField(); - size_t nfields = 3; + size_t nfields = 2; size_t extraCount = extraFieldNames.size(); nfields += extraCount; if(descriptor) ++nfields; @@ -99,6 +105,7 @@ StructureConstPtr NTScalarMultiChannelBuilder::createStructure() if(secondsPastEpoch) ++nfields; if(nanoseconds) ++nfields; if(userTag) ++nfields; + if(isConnected) ++nfields; FieldConstPtrArray fields(nfields); StringArray names(nfields); size_t ind = 0; @@ -106,8 +113,6 @@ StructureConstPtr NTScalarMultiChannelBuilder::createStructure() fields[ind++] = fieldCreate->createScalarArray(valueType); names[ind] = "channelName"; fields[ind++] = fieldCreate->createScalarArray(pvString); - names[ind] = "isConnected"; - fields[ind++] = fieldCreate->createScalarArray(pvBoolean); if(descriptor) { names[ind] = "descriptor"; fields[ind++] = fieldCreate->createScalar(pvString); @@ -144,6 +149,10 @@ StructureConstPtr NTScalarMultiChannelBuilder::createStructure() names[ind] = "userTag"; fields[ind++] = fieldCreate->createScalarArray(pvInt); } + if(isConnected) { + names[ind] = "isConnected"; + fields[ind++] = fieldCreate->createScalarArray(pvBoolean); + } for (size_t i = 0; i< extraCount; i++) { names[ind] = extraFieldNames[i]; fields[ind++] = extraFields[i]; @@ -184,6 +193,9 @@ void NTScalarMultiChannelBuilder::reset() secondsPastEpoch = false; nanoseconds = false; userTag = false; + // TODO When client code updated, don't include isConnected by default + // i.e. change line below to isConnected = false; + isConnected = true; } diff --git a/src/nt/ntscalarMultiChannel.h b/src/nt/ntscalarMultiChannel.h index 9b8c295..645147f 100644 --- a/src/nt/ntscalarMultiChannel.h +++ b/src/nt/ntscalarMultiChannel.h @@ -100,6 +100,11 @@ namespace detail { * @return this instance of NTScalarMultiChannelBuilder. */ shared_pointer addUserTag(); + /** + * Add isConnected array to the NTScalarMultiChannel. + * @return this instance of NTScalarMultiChannelBuilder. + */ + shared_pointer addIsConnected(); /** * Create a Structure that represents NTScalarMultiChannel. * This resets this instance state and allows new instance to be created. @@ -140,6 +145,7 @@ namespace detail { bool secondsPastEpoch; bool nanoseconds; bool userTag; + bool isConnected; // NOTE: this preserves order, however it does not handle duplicates epics::pvData::StringArray extraFieldNames;