Changes include:
1) Added method PvaClientNTMultiData::getChannelChangeFlags. 2) In pvaClientMultiChannel made methods not intended for client protected. 3) Fixed many connection related problems. 4) Cleaned up doxygen.
This commit is contained in:
@ -1,5 +0,0 @@
|
||||
NOT FOR DIRECT USE
|
||||
==================
|
||||
|
||||
This directory holds files that are used by doxygen.
|
||||
The files are not meant to be read except via the doxygen documention.
|
@ -1,146 +0,0 @@
|
||||
<?xml version="1.0" encoding="iso-8859-1"?>
|
||||
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
|
||||
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
|
||||
<html xmlns="http://www.w3.org/1999/xhtml">
|
||||
<head>
|
||||
<meta http-equiv="content-type" content="text/html; charset=iso-8859-1" />
|
||||
<title>PvaClient</title>
|
||||
<link rel="stylesheet" type="text/css"
|
||||
href="http://epics-pvdata.sourceforge.net/base.css" />
|
||||
<link rel="stylesheet" type="text/css"
|
||||
href="http://epics-pvdata.sourceforge.net/epicsv4.css" />
|
||||
<style type="text/css">
|
||||
/*<![CDATA[*/
|
||||
.about { margin-left: 3em; margin-right: 3em; font-size: .83em}
|
||||
table { margin-left: auto; margin-right: auto }
|
||||
.diagram { text-align: center; margin: 2.5em 0 }
|
||||
span.opt { color: grey }
|
||||
span.nterm { font-style:italic }
|
||||
span.term { font-family:courier }
|
||||
span.user { font-family:courier }
|
||||
span.user:before { content:"<" }
|
||||
span.user:after { content:">" }
|
||||
.nonnorm { font-style:italic }
|
||||
p.ed { color: #AA0000 }
|
||||
span.ed { color: #AA0000 }
|
||||
p.ed.priv { display: inline; }
|
||||
span.ed.priv { display: inline; }
|
||||
/*]]>*/</style>
|
||||
<!-- Script that generates the Table of Contents -->
|
||||
<script type="text/javascript"
|
||||
src="http://epics-pvdata.sourceforge.net/script/tocgen.js">
|
||||
</script>
|
||||
</head>
|
||||
<body>
|
||||
|
||||
<h1>PvaClient</h1>
|
||||
|
||||
|
||||
<h2>Overview</h2>
|
||||
<p>
|
||||
pvaClient is a synchronous wrapper for the pvAccess API, which is a callback based API.
|
||||
Thus it is easier to use than pvAccess itself.
|
||||
In addition pvaClient provides many convenience methods.
|
||||
</p>
|
||||
<p>
|
||||
Class <b>PvaClient</b> is a class that is used by all the other pvaClient classes.
|
||||
An application that uses pvaClient must call:</p>
|
||||
<pre>
|
||||
PvaClientPtr pvaClient = PvaClient::get(providers);
|
||||
</pre>
|
||||
<p>
|
||||
before it uses any other pvaClient classes.
|
||||
</p>
|
||||
<p>
|
||||
This is a singleton method, i. e. only one instance of PvaClient is created.
|
||||
</p>
|
||||
<p>
|
||||
<b>pvaClient</b> must not be deleted until the client no longer wants to use any part
|
||||
of pvaClient.
|
||||
</p>
|
||||
<p>
|
||||
<b>providers</b> is a blank separated set of provider names.
|
||||
For example:</p>
|
||||
<pre>
|
||||
PvaClientPtr pvaClient = PvaClient::get("ca pva");
|
||||
</pre>
|
||||
<p>
|
||||
The providers <b>ca</b> and <b>pva</b> are special.
|
||||
For each of these a client context is created when the <b>PvaClient</b>
|
||||
is constructed and the context destroyed when <b>PvaClient</b> is deleted.
|
||||
</p>
|
||||
<h2>Channel Caching</h2>
|
||||
<p>
|
||||
<b>PvaClient</b> has a method:
|
||||
</p>
|
||||
<pre>
|
||||
PvaClientChannelPtr channel(
|
||||
string const & channelName,
|
||||
string const &providerName = "pva",
|
||||
double timeOut = 5.0);
|
||||
</pre>
|
||||
<p>
|
||||
This method creates a
|
||||
<b>PvaClientChannel</b> and then connects to the channel.
|
||||
</p>
|
||||
<p>
|
||||
If a call is successful then multiple calls to the same channelName and providerName
|
||||
share the same PvaClientChannel, i. e. the PvaClientChannel is cached.
|
||||
</p>
|
||||
<p>
|
||||
<b>pvaClientChannelGet</b> and <b>pvaClientChannelPut</b> also implement caching.
|
||||
</p>
|
||||
<p>
|
||||
For example consider a client that makes multiple calls like:
|
||||
</p>
|
||||
<pre>
|
||||
double value;
|
||||
value = pva->channel(channelName)->get()->getData()->getDouble();
|
||||
...
|
||||
value = pva->channel(channelName)->get()->getData()->getDouble();
|
||||
</pre>
|
||||
<p>
|
||||
Only the first call creates a new PvaClientChannel and a new PvaClientGet.
|
||||
The second call reuses the cached PvaClientChannel and PvaClientGet.
|
||||
</p>
|
||||
<h2>Non Cached Channels</h2>
|
||||
<p>
|
||||
<b>PvaClient</b> has a method:
|
||||
</p>
|
||||
<pre>
|
||||
PvaClientChannelPtr createChannel(
|
||||
string const & channelName,
|
||||
string const &providerName = "pva");
|
||||
</pre>
|
||||
<p>
|
||||
This method is just creates a new PvaClientChannel and returns it to the caller.
|
||||
The caller must call the PvaClientChannel connect methods.
|
||||
</p>
|
||||
|
||||
<h2>Blocking vs Non-Blocking Methods</h2>
|
||||
<p>Each component of pvaClient provides a set of blocking and non-blocking calls.
|
||||
For example several components (examples are <b>PvaClientChannel</b> and <b>PvaChannelGet</b>)
|
||||
have methods:</p>
|
||||
<dl>
|
||||
<dt>connect</dt>
|
||||
<dd>
|
||||
This calls issueConnect and then waitConnect.
|
||||
If waitConnect fails an exception is thrown.
|
||||
Since waitConnect is a blocking method so is this.
|
||||
</dd>
|
||||
<dt>issueConnect</dt>
|
||||
<dd>
|
||||
This is a request to connect, i. e. issue a request to the server to create something
|
||||
on the server. This is a non blocking call.
|
||||
</dd>
|
||||
<dt>waitConnect</dt>
|
||||
<dd>
|
||||
This waits for the server to respond to issueConnect.
|
||||
It blocks until the server responds or a timeout occurs.
|
||||
</dd>
|
||||
</dl>
|
||||
|
||||
|
||||
</body>
|
||||
</html>
|
||||
|
@ -1,123 +0,0 @@
|
||||
<?xml version="1.0" encoding="iso-8859-1"?>
|
||||
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
|
||||
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
|
||||
<html xmlns="http://www.w3.org/1999/xhtml">
|
||||
<head>
|
||||
<meta http-equiv="content-type" content="text/html; charset=iso-8859-1" />
|
||||
<title>PvaClientChannel</title>
|
||||
<link rel="stylesheet" type="text/css"
|
||||
href="http://epics-pvdata.sourceforge.net/base.css" />
|
||||
<link rel="stylesheet" type="text/css"
|
||||
href="http://epics-pvdata.sourceforge.net/epicsv4.css" />
|
||||
<style type="text/css">
|
||||
/*<![CDATA[*/
|
||||
.about { margin-left: 3em; margin-right: 3em; font-size: .83em}
|
||||
table { margin-left: auto; margin-right: auto }
|
||||
.diagram { text-align: center; margin: 2.5em 0 }
|
||||
span.opt { color: grey }
|
||||
span.nterm { font-style:italic }
|
||||
span.term { font-family:courier }
|
||||
span.user { font-family:courier }
|
||||
span.user:before { content:"<" }
|
||||
span.user:after { content:">" }
|
||||
.nonnorm { font-style:italic }
|
||||
p.ed { color: #AA0000 }
|
||||
span.ed { color: #AA0000 }
|
||||
p.ed.priv { display: inline; }
|
||||
span.ed.priv { display: inline; }
|
||||
/*]]>*/</style>
|
||||
<!-- Script that generates the Table of Contents -->
|
||||
<script type="text/javascript"
|
||||
src="http://epics-pvdata.sourceforge.net/script/tocgen.js">
|
||||
</script>
|
||||
</head>
|
||||
<body>
|
||||
|
||||
<h1>PvaClientChannel</h1>
|
||||
|
||||
<h2>Overview</h2>
|
||||
<p>
|
||||
pvaClientChannel is a synchronous wrapper for the pvAccess::Channel API, which is a callback based API.
|
||||
Thus it is easier to use than pvAccess::Channel itself.
|
||||
</p>
|
||||
<p>An instance of <b>PvaClientChannel</b> connects to a single channel.
|
||||
An instance can only be created via class <b>PvaClient</b> which has both synchronous methods, which block, and non blocking methods.
|
||||
The synchrouous methods block until a connection is made to the channel and throw an exception if a
|
||||
timeout occurs while trying to make a connection.
|
||||
The non blocking methods leave connection to the caller.
|
||||
</p>
|
||||
<p><b>PvaClientChannel</b> has methods:</p>
|
||||
<dl>
|
||||
<dt>Connect to channel</dt>
|
||||
<dd>These can be called indirectly by a blocking request to <b>PvaClient</b>
|
||||
or by the client if a non blocking request is made to <b>PvaClient</b>.
|
||||
</dd>
|
||||
<dt>Channel state change requester</dt>
|
||||
<dd>The client can provide a callback that is called each time the connection state
|
||||
of the channel changes.
|
||||
</dd>
|
||||
<dt>Creating all of the following</dt>
|
||||
<dd>
|
||||
<pre>
|
||||
PvaClientField NOT IMPLEMENTED
|
||||
PvaClientProcess
|
||||
PvaClientGet
|
||||
PvaClientPut
|
||||
PvaClientPutGet
|
||||
PvaClientMonitor
|
||||
PvaClientArray NOT IMPLEMENTED
|
||||
PvaClientRPC
|
||||
</pre>
|
||||
</dd>
|
||||
</dl>
|
||||
<h2>Connect: Blocking vs Non-Blocking </h2>
|
||||
<p><b>PvaClientChannel</b> has methods:</p>
|
||||
<dl>
|
||||
<dt>connect</dt>
|
||||
<dd>
|
||||
This calls issueConnect and then waitConnect.
|
||||
If waitConnect fails an exception is thrown.
|
||||
Since waitConnect is a blocking method so is this.
|
||||
</dd>
|
||||
<dt>issueConnect</dt>
|
||||
<dd>
|
||||
This is a request to connect to the channel. This is a non blocking call.
|
||||
</dd>
|
||||
<dt>waitConnect</dt>
|
||||
<dd>
|
||||
This waits for the server to respond to issueConnect.
|
||||
It blocks until the server responds or a timeout occurs.
|
||||
</dd>
|
||||
</dl>
|
||||
|
||||
<h2>Get and Put Caching</h2>
|
||||
<p>
|
||||
<b>PvaClientChannel</b> has methods:
|
||||
</p>
|
||||
<pre>
|
||||
PvaClientGetPtr get(std::string const & request);
|
||||
PvaClientPutPtr put(std::string const & request);
|
||||
</pre>
|
||||
<p>
|
||||
Each of these caches.
|
||||
For example all calls to <b>get</b> with the same <b>request</b> will share the same
|
||||
<b>PvaChannelGet</b>
|
||||
</p>
|
||||
<p>
|
||||
For example consider a client that makes multiple calls like:
|
||||
</p>
|
||||
<pre>
|
||||
double value;
|
||||
value = pva->channel(channelName)->get()->getData()->getDouble();
|
||||
...
|
||||
value = pva->channel(channelName)->get()->getData()->getDouble();
|
||||
</pre>
|
||||
<p>
|
||||
Only the first call creates a new PvaClientChannel and a new PvaClientGet.
|
||||
The second call reuses the cached PvaClientChannel and PvaClientGet.
|
||||
</p>
|
||||
|
||||
|
||||
</body>
|
||||
</html>
|
||||
|
@ -1,81 +0,0 @@
|
||||
<?xml version="1.0" encoding="iso-8859-1"?>
|
||||
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
|
||||
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
|
||||
<html xmlns="http://www.w3.org/1999/xhtml">
|
||||
<head>
|
||||
<meta http-equiv="content-type" content="text/html; charset=iso-8859-1" />
|
||||
<title>PvaClientChannelStateChangeRequester</title>
|
||||
<link rel="stylesheet" type="text/css"
|
||||
href="http://epics-pvdata.sourceforge.net/base.css" />
|
||||
<link rel="stylesheet" type="text/css"
|
||||
href="http://epics-pvdata.sourceforge.net/epicsv4.css" />
|
||||
<style type="text/css">
|
||||
/*<![CDATA[*/
|
||||
.about { margin-left: 3em; margin-right: 3em; font-size: .83em}
|
||||
table { margin-left: auto; margin-right: auto }
|
||||
.diagram { text-align: center; margin: 2.5em 0 }
|
||||
span.opt { color: grey }
|
||||
span.nterm { font-style:italic }
|
||||
span.term { font-family:courier }
|
||||
span.user { font-family:courier }
|
||||
span.user:before { content:"<" }
|
||||
span.user:after { content:">" }
|
||||
.nonnorm { font-style:italic }
|
||||
p.ed { color: #AA0000 }
|
||||
span.ed { color: #AA0000 }
|
||||
p.ed.priv { display: inline; }
|
||||
span.ed.priv { display: inline; }
|
||||
/*]]>*/</style>
|
||||
<!-- Script that generates the Table of Contents -->
|
||||
<script type="text/javascript"
|
||||
src="http://epics-pvdata.sourceforge.net/script/tocgen.js">
|
||||
</script>
|
||||
</head>
|
||||
<body>
|
||||
|
||||
<h1>PvaClientChannelStateChangeRequester</h1>
|
||||
|
||||
<p>This class has the single method <b>channelStateChange</b>.
|
||||
It is called each time the channel connection status changes.
|
||||
</p>
|
||||
<p>
|
||||
<b>NOTE:</b>
|
||||
The implementation must not call a method that blocks waiting for a response from the server.
|
||||
It it does the client may be blocked forever.
|
||||
</p>
|
||||
<p>
|
||||
An example of illegal code is:
|
||||
</p>
|
||||
<pre>
|
||||
virtual void channelStateChange(PvaClientChannelPtr const & channel, bool isConnected)
|
||||
{
|
||||
if(isConnected&&!pvaClientPut)
|
||||
{
|
||||
pvaClientPut = pvaClientChannel->createPut(request);
|
||||
pvaClientPut->connect();
|
||||
}
|
||||
}
|
||||
</pre>
|
||||
<p>
|
||||
This is illegal because the call to <b>connect</b> blocks.
|
||||
</p>
|
||||
<p>The following is an example of legal code:
|
||||
</p>
|
||||
<pre>
|
||||
virtual void channelStateChange(PvaClientChannelPtr const & channel, bool isConnected)
|
||||
{
|
||||
if(isConnected&&!pvaClientPut)
|
||||
{
|
||||
pvaClientPut = pvaClientChannel->createPut(request);
|
||||
pvaClientPut->issueConnect();
|
||||
}
|
||||
}
|
||||
</pre>
|
||||
<p>This is legal code because neither <b>createPut</b> or <b>issueConnect</b>
|
||||
blocks.
|
||||
</p>
|
||||
|
||||
|
||||
</body>
|
||||
</html>
|
||||
|
@ -1,74 +0,0 @@
|
||||
<?xml version="1.0" encoding="iso-8859-1"?>
|
||||
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
|
||||
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
|
||||
<html xmlns="http://www.w3.org/1999/xhtml">
|
||||
<head>
|
||||
<meta http-equiv="content-type" content="text/html; charset=iso-8859-1" />
|
||||
<title>PvaClientGet</title>
|
||||
<link rel="stylesheet" type="text/css"
|
||||
href="http://epics-pvdata.sourceforge.net/base.css" />
|
||||
<link rel="stylesheet" type="text/css"
|
||||
href="http://epics-pvdata.sourceforge.net/epicsv4.css" />
|
||||
<style type="text/css">
|
||||
/*<![CDATA[*/
|
||||
.about { margin-left: 3em; margin-right: 3em; font-size: .83em}
|
||||
table { margin-left: auto; margin-right: auto }
|
||||
.diagram { text-align: center; margin: 2.5em 0 }
|
||||
span.opt { color: grey }
|
||||
span.nterm { font-style:italic }
|
||||
span.term { font-family:courier }
|
||||
span.user { font-family:courier }
|
||||
span.user:before { content:"<" }
|
||||
span.user:after { content:">" }
|
||||
.nonnorm { font-style:italic }
|
||||
p.ed { color: #AA0000 }
|
||||
span.ed { color: #AA0000 }
|
||||
p.ed.priv { display: inline; }
|
||||
span.ed.priv { display: inline; }
|
||||
/*]]>*/</style>
|
||||
<!-- Script that generates the Table of Contents -->
|
||||
<script type="text/javascript"
|
||||
src="http://epics-pvdata.sourceforge.net/script/tocgen.js">
|
||||
</script>
|
||||
</head>
|
||||
<body>
|
||||
|
||||
<h1>PvaClientGet</h1>
|
||||
|
||||
|
||||
<p>
|
||||
pvaClientGet is a synchronous wrapper for the pvAccess::ChannelGet API, which is a callback based API.
|
||||
Thus it is easier to use than pvAccess::ChannelGet itself.
|
||||
</p>
|
||||
<p>An instance of PvaClientGet is created via a call to one of the following:</p>
|
||||
<pre>
|
||||
class PvaClientChannel
|
||||
...
|
||||
{
|
||||
...
|
||||
PvaClientGetPtr get(std::string const & request = "field(value,alarm,timeStamp)");
|
||||
PvaClientGetPtr createGet(std::string const & request = "");
|
||||
PvaClientGetPtr createGet(epics::pvData::PVStructurePtr const & pvRequest);
|
||||
...
|
||||
};
|
||||
<p>An instance of <b>PvaClientGet</b> connects to a single channel.
|
||||
<b>PvaClientGet</b> has both synchronous methods, which block, and non blocking methods.
|
||||
</p>
|
||||
<p><b>PvaClientChannel</b> has methods:</p>
|
||||
<pre>
|
||||
connect Calls issueConnect and then waitConnect.
|
||||
issueConnect issues a request to the server to create the server side of ChannelPut.
|
||||
waitConnect blocks until server responds that it has created the ChannelPut.
|
||||
get Calls issueGet and then waitGet.
|
||||
issueGet issues a get request to the server.
|
||||
waitGet waits until the server send a message that the get is complete.
|
||||
getData get the data.
|
||||
</pre>
|
||||
<p>
|
||||
<b>issueConnect</b> and <b>issueGet</b> do not block.
|
||||
All other methods can block.
|
||||
</p>
|
||||
|
||||
</body>
|
||||
</html>
|
||||
|
@ -1,63 +0,0 @@
|
||||
<?xml version="1.0" encoding="iso-8859-1"?>
|
||||
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
|
||||
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
|
||||
<html xmlns="http://www.w3.org/1999/xhtml">
|
||||
<head>
|
||||
<meta http-equiv="content-type" content="text/html; charset=iso-8859-1" />
|
||||
<title>PvaClientGetData</title>
|
||||
<link rel="stylesheet" type="text/css"
|
||||
href="http://epics-pvdata.sourceforge.net/base.css" />
|
||||
<link rel="stylesheet" type="text/css"
|
||||
href="http://epics-pvdata.sourceforge.net/epicsv4.css" />
|
||||
<style type="text/css">
|
||||
/*<![CDATA[*/
|
||||
.about { margin-left: 3em; margin-right: 3em; font-size: .83em}
|
||||
table { margin-left: auto; margin-right: auto }
|
||||
.diagram { text-align: center; margin: 2.5em 0 }
|
||||
span.opt { color: grey }
|
||||
span.nterm { font-style:italic }
|
||||
span.term { font-family:courier }
|
||||
span.user { font-family:courier }
|
||||
span.user:before { content:"<" }
|
||||
span.user:after { content:">" }
|
||||
.nonnorm { font-style:italic }
|
||||
p.ed { color: #AA0000 }
|
||||
span.ed { color: #AA0000 }
|
||||
p.ed.priv { display: inline; }
|
||||
span.ed.priv { display: inline; }
|
||||
/*]]>*/</style>
|
||||
<!-- Script that generates the Table of Contents -->
|
||||
<script type="text/javascript"
|
||||
src="http://epics-pvdata.sourceforge.net/script/tocgen.js">
|
||||
</script>
|
||||
</head>
|
||||
<body>
|
||||
|
||||
<h1>PvaClientGetData</h1>
|
||||
|
||||
<p>This class provides access to the data returned by calls to get data via <b>PvaChannelGet</b>
|
||||
It provides methods:</p>
|
||||
<pre>
|
||||
getStructure Get the introspection interface for data returned from server
|
||||
getPVStructure Get the complete set of data returned from the server.
|
||||
getChangedBitSet Get the bitSet that shows which fields have a new value since last get.
|
||||
showChanged Show all the fields that have changed value since the last get,
|
||||
getAlarm If a alarm field is available get it.
|
||||
getTimeStamp If a timeStamp field is available get it.
|
||||
hasValue Does the PVStructure have a top level field named value
|
||||
NOTE: The following only apply if hasValue is true.
|
||||
isValueScalar Is the value field a scalar?
|
||||
isValueScalarArray Is the value field a scalar array?
|
||||
getValue Get the value field.
|
||||
getScalarValue Get a scalar value field.
|
||||
getArrayValue Get an array value field.
|
||||
getScalarArrayValue Get a scalar array value field.
|
||||
getDouble Get scalar value field as a double.
|
||||
getString Get value field as a string.
|
||||
getDoubleArray Get value field as a double array.
|
||||
getStringArray Get value field as a string array.
|
||||
</pre>
|
||||
|
||||
</body>
|
||||
</html>
|
||||
|
@ -1,59 +0,0 @@
|
||||
<?xml version="1.0" encoding="iso-8859-1"?>
|
||||
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
|
||||
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
|
||||
<html xmlns="http://www.w3.org/1999/xhtml">
|
||||
<head>
|
||||
<meta http-equiv="content-type" content="text/html; charset=iso-8859-1" />
|
||||
<title>PvaClientGetRequester</title>
|
||||
<link rel="stylesheet" type="text/css"
|
||||
href="http://epics-pvdata.sourceforge.net/base.css" />
|
||||
<link rel="stylesheet" type="text/css"
|
||||
href="http://epics-pvdata.sourceforge.net/epicsv4.css" />
|
||||
<style type="text/css">
|
||||
/*<![CDATA[*/
|
||||
.about { margin-left: 3em; margin-right: 3em; font-size: .83em}
|
||||
table { margin-left: auto; margin-right: auto }
|
||||
.diagram { text-align: center; margin: 2.5em 0 }
|
||||
span.opt { color: grey }
|
||||
span.nterm { font-style:italic }
|
||||
span.term { font-family:courier }
|
||||
span.user { font-family:courier }
|
||||
span.user:before { content:"<" }
|
||||
span.user:after { content:">" }
|
||||
.nonnorm { font-style:italic }
|
||||
p.ed { color: #AA0000 }
|
||||
span.ed { color: #AA0000 }
|
||||
p.ed.priv { display: inline; }
|
||||
span.ed.priv { display: inline; }
|
||||
/*]]>*/</style>
|
||||
<!-- Script that generates the Table of Contents -->
|
||||
<script type="text/javascript"
|
||||
src="http://epics-pvdata.sourceforge.net/script/tocgen.js">
|
||||
</script>
|
||||
</head>
|
||||
<body>
|
||||
|
||||
<h1>PvaClientGetRequester</h1>
|
||||
|
||||
<p>This is a virtual class that can be implemented by a client that uses <b>PvaClientGet</b>.
|
||||
It has the methods:</p>
|
||||
<pre>
|
||||
virtual void channelGetConnect(
|
||||
const Status& status,
|
||||
PvaClientGetPtr const & clientGet) {}
|
||||
virtual void getDone(
|
||||
const Status& status,
|
||||
PvaClientGetPtr const & clientGet) = 0;
|
||||
</pre>
|
||||
|
||||
<p>The client must call</p>
|
||||
<pre>
|
||||
pvaClientGet->setRequester(shared_from_this());
|
||||
</pre>
|
||||
<p>
|
||||
after creating an instance of PvaClientGet.
|
||||
</p>
|
||||
|
||||
</body>
|
||||
</html>
|
||||
|
@ -1,106 +0,0 @@
|
||||
<?xml version="1.0" encoding="iso-8859-1"?>
|
||||
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
|
||||
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
|
||||
<html xmlns="http://www.w3.org/1999/xhtml">
|
||||
<head>
|
||||
<meta http-equiv="content-type" content="text/html; charset=iso-8859-1" />
|
||||
<title>PvaClientMonitor</title>
|
||||
<link rel="stylesheet" type="text/css"
|
||||
href="http://epics-pvdata.sourceforge.net/base.css" />
|
||||
<link rel="stylesheet" type="text/css"
|
||||
href="http://epics-pvdata.sourceforge.net/epicsv4.css" />
|
||||
<style type="text/css">
|
||||
/*<![CDATA[*/
|
||||
.about { margin-left: 3em; margin-right: 3em; font-size: .83em}
|
||||
table { margin-left: auto; margin-right: auto }
|
||||
.diagram { text-align: center; margin: 2.5em 0 }
|
||||
span.opt { color: grey }
|
||||
span.nterm { font-style:italic }
|
||||
span.term { font-family:courier }
|
||||
span.user { font-family:courier }
|
||||
span.user:before { content:"<" }
|
||||
span.user:after { content:">" }
|
||||
.nonnorm { font-style:italic }
|
||||
p.ed { color: #AA0000 }
|
||||
span.ed { color: #AA0000 }
|
||||
p.ed.priv { display: inline; }
|
||||
span.ed.priv { display: inline; }
|
||||
/*]]>*/</style>
|
||||
<!-- Script that generates the Table of Contents -->
|
||||
<script type="text/javascript"
|
||||
src="http://epics-pvdata.sourceforge.net/script/tocgen.js">
|
||||
</script>
|
||||
</head>
|
||||
<body>
|
||||
|
||||
<h1>PvaClientMonitor</h1>
|
||||
<p>
|
||||
<b>NOTE:</b> This is a work in progress.
|
||||
</p>
|
||||
<h2>Overview</h2>
|
||||
<p>
|
||||
This provides an easier way to create a monitor on a channel than to use pvAccessCPP itself.
|
||||
It provides two main ways to create a monitor:
|
||||
</p>
|
||||
<h3>The client first creates a PvaClientMonitorChannel and then creates a monitor</h3>
|
||||
The client calls:
|
||||
<pre>
|
||||
static PvaClientMonitorPtr create(
|
||||
PvaClientMonitorPtr const &PvaClientMonitor,
|
||||
PvaClientMonitorChannelPtr const & PvaClientMonitorChannel,
|
||||
epics::pvData::PVStructurePtr const &pvRequest
|
||||
);
|
||||
|
||||
where
|
||||
|
||||
PvaClientMonitor
|
||||
The PvaClientMonitor.
|
||||
|
||||
PvaClientMonitorChannel
|
||||
The PvaClientMonitorChannel that has already been created by the client.
|
||||
|
||||
pvRequest
|
||||
The pvRequest for creating the monitor.
|
||||
</pre>
|
||||
With this method the monitor is created and started.
|
||||
This method blocks while the monitor is created.
|
||||
<h3>The client provides names for a channel and a provider</h3>
|
||||
The client calls:
|
||||
<pre>
|
||||
static PvaClientMonitorPtr create(
|
||||
PvaClientMonitorPtr const &PvaClientMonitor,
|
||||
std::string const & channelName,
|
||||
std::string const & providerName,
|
||||
std::string const & request,
|
||||
PvaClientMonitorChannelStateChangeRequesterPtr const & stateChangeRequester,
|
||||
PvaClientMonitorRequesterPtr const & monitorRequester
|
||||
);
|
||||
|
||||
where
|
||||
|
||||
PvaClientMonitor
|
||||
The PvaClientMonitor.
|
||||
|
||||
channelName
|
||||
The name of the channel.
|
||||
|
||||
providerName
|
||||
The name of the provider
|
||||
|
||||
request
|
||||
The request for creating the monitor
|
||||
|
||||
stateChangeRequester
|
||||
The client supplied state change requester.
|
||||
This will be called each time a state change for the channel occurs.
|
||||
|
||||
monitorRequester
|
||||
The client supplied monitor requester.
|
||||
This is called each time a new monitor event is available.
|
||||
</pre>
|
||||
With this method a pvaChannel is created and after it connects a pvaMonitor is created and started.
|
||||
This method never blocks.
|
||||
|
||||
</body>
|
||||
</html>
|
||||
|
@ -1,66 +0,0 @@
|
||||
<?xml version="1.0" encoding="iso-8859-1"?>
|
||||
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
|
||||
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
|
||||
<html xmlns="http://www.w3.org/1999/xhtml">
|
||||
<head>
|
||||
<meta http-equiv="content-type" content="text/html; charset=iso-8859-1" />
|
||||
<title>PvaClientMonitorData</title>
|
||||
<link rel="stylesheet" type="text/css"
|
||||
href="http://epics-pvdata.sourceforge.net/base.css" />
|
||||
<link rel="stylesheet" type="text/css"
|
||||
href="http://epics-pvdata.sourceforge.net/epicsv4.css" />
|
||||
<style type="text/css">
|
||||
/*<![CDATA[*/
|
||||
.about { margin-left: 3em; margin-right: 3em; font-size: .83em}
|
||||
table { margin-left: auto; margin-right: auto }
|
||||
.diagram { text-align: center; margin: 2.5em 0 }
|
||||
span.opt { color: grey }
|
||||
span.nterm { font-style:italic }
|
||||
span.term { font-family:courier }
|
||||
span.user { font-family:courier }
|
||||
span.user:before { content:"<" }
|
||||
span.user:after { content:">" }
|
||||
.nonnorm { font-style:italic }
|
||||
p.ed { color: #AA0000 }
|
||||
span.ed { color: #AA0000 }
|
||||
p.ed.priv { display: inline; }
|
||||
span.ed.priv { display: inline; }
|
||||
/*]]>*/</style>
|
||||
<!-- Script that generates the Table of Contents -->
|
||||
<script type="text/javascript"
|
||||
src="http://epics-pvdata.sourceforge.net/script/tocgen.js">
|
||||
</script>
|
||||
</head>
|
||||
<body>
|
||||
|
||||
<h1>PvaClientMonitorData</h1>
|
||||
|
||||
|
||||
<p>This class provides access to the data returned by calls to get data via <b>PvaChannelGet</b>
|
||||
It provides methods:</p>
|
||||
<pre>
|
||||
getStructure Get the introspection interface for data returned from server
|
||||
getPVStructure Get the complete set of data returned from the server.
|
||||
getChangedBitSet Get the bitSet that shows which fields have a new value since last monitor event.
|
||||
getOverrunBitSet Get the bitSet that shows which fields have changed more than once since last monitor event.
|
||||
showChanged Show all the fields that have changed value since the last monitor event,
|
||||
showChanged Show all the fields that have changed value more than once since last monitor event.
|
||||
getAlarm If a alarm field is available get it.
|
||||
getTimeStamp If a timeStamp field is available get it.
|
||||
hasValue Does the PVStructure have a top level field named value
|
||||
NOTE: The following only apply if hasValue is true.
|
||||
isValueScalar Is the value field a scalar?
|
||||
isValueScalarArray Is the value field a scalar array?
|
||||
getValue Get the value field.
|
||||
getScalarValue Get a scalar value field.
|
||||
getArrayValue Get an array value field.
|
||||
getScalarArrayValue Get a scalar array value field.
|
||||
getDouble Get scalar value field as a double.
|
||||
getString Get value field as a string.
|
||||
getDoubleArray Get value field as a double array.
|
||||
getStringArray Get value field as a string array.
|
||||
</pre>
|
||||
|
||||
</body>
|
||||
</html>
|
||||
|
@ -1,65 +0,0 @@
|
||||
<?xml version="1.0" encoding="iso-8859-1"?>
|
||||
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
|
||||
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
|
||||
<html xmlns="http://www.w3.org/1999/xhtml">
|
||||
<head>
|
||||
<meta http-equiv="content-type" content="text/html; charset=iso-8859-1" />
|
||||
<title>PvaClientMonitorRequester</title>
|
||||
<link rel="stylesheet" type="text/css"
|
||||
href="http://epics-pvdata.sourceforge.net/base.css" />
|
||||
<link rel="stylesheet" type="text/css"
|
||||
href="http://epics-pvdata.sourceforge.net/epicsv4.css" />
|
||||
<style type="text/css">
|
||||
/*<![CDATA[*/
|
||||
.about { margin-left: 3em; margin-right: 3em; font-size: .83em}
|
||||
table { margin-left: auto; margin-right: auto }
|
||||
.diagram { text-align: center; margin: 2.5em 0 }
|
||||
span.opt { color: grey }
|
||||
span.nterm { font-style:italic }
|
||||
span.term { font-family:courier }
|
||||
span.user { font-family:courier }
|
||||
span.user:before { content:"<" }
|
||||
span.user:after { content:">" }
|
||||
.nonnorm { font-style:italic }
|
||||
p.ed { color: #AA0000 }
|
||||
span.ed { color: #AA0000 }
|
||||
p.ed.priv { display: inline; }
|
||||
span.ed.priv { display: inline; }
|
||||
/*]]>*/</style>
|
||||
<!-- Script that generates the Table of Contents -->
|
||||
<script type="text/javascript"
|
||||
src="http://epics-pvdata.sourceforge.net/script/tocgen.js">
|
||||
</script>
|
||||
</head>
|
||||
<body>
|
||||
|
||||
<h1>PvaClientMonitorRequester</h1>
|
||||
|
||||
<p>This is a virtual class that can be implemented by a client that uses <b>PvaClientMonitor</b>.
|
||||
It has the methods:</p>
|
||||
<pre>
|
||||
virtual void monitorConnect(
|
||||
const Status& status,
|
||||
PvaClientMonitorPtr const & clientMonitor,
|
||||
StructureConstPtr const & structure) {}
|
||||
virtual void event(
|
||||
PvaClientMonitor const & clientGet) = 0;
|
||||
virtual void unlisten()
|
||||
{
|
||||
std::cerr << "PvaClientMonitorRequester::unlisten called"
|
||||
<< " but no PvaClientMonitorRequester::unlisten\n";
|
||||
}
|
||||
</pre>
|
||||
|
||||
<p>The client must call</p>
|
||||
<pre>
|
||||
pvaClientMonitor->setRequester(shared_from_this());
|
||||
</pre>
|
||||
<p>
|
||||
after creating an instance of PvaClientMonitor.
|
||||
</p>
|
||||
|
||||
|
||||
</body>
|
||||
</html>
|
||||
|
@ -1,71 +0,0 @@
|
||||
<?xml version="1.0" encoding="iso-8859-1"?>
|
||||
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
|
||||
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
|
||||
<html xmlns="http://www.w3.org/1999/xhtml">
|
||||
<head>
|
||||
<meta http-equiv="content-type" content="text/html; charset=iso-8859-1" />
|
||||
<title>PvaClientProcess</title>
|
||||
<link rel="stylesheet" type="text/css"
|
||||
href="http://epics-pvdata.sourceforge.net/base.css" />
|
||||
<link rel="stylesheet" type="text/css"
|
||||
href="http://epics-pvdata.sourceforge.net/epicsv4.css" />
|
||||
<style type="text/css">
|
||||
/*<![CDATA[*/
|
||||
.about { margin-left: 3em; margin-right: 3em; font-size: .83em}
|
||||
table { margin-left: auto; margin-right: auto }
|
||||
.diagram { text-align: center; margin: 2.5em 0 }
|
||||
span.opt { color: grey }
|
||||
span.nterm { font-style:italic }
|
||||
span.term { font-family:courier }
|
||||
span.user { font-family:courier }
|
||||
span.user:before { content:"<" }
|
||||
span.user:after { content:">" }
|
||||
.nonnorm { font-style:italic }
|
||||
p.ed { color: #AA0000 }
|
||||
span.ed { color: #AA0000 }
|
||||
p.ed.priv { display: inline; }
|
||||
span.ed.priv { display: inline; }
|
||||
/*]]>*/</style>
|
||||
<!-- Script that generates the Table of Contents -->
|
||||
<script type="text/javascript"
|
||||
src="http://epics-pvdata.sourceforge.net/script/tocgen.js">
|
||||
</script>
|
||||
</head>
|
||||
<body>
|
||||
|
||||
<h1>PvaClientProcess</h1>
|
||||
|
||||
<p>
|
||||
pvaClientProcess is a synchronous wrapper for the pvAccess::ChannelProcess API, which is a callback based API.
|
||||
Thus it is easier to use than pvAccess::ChannelProcess itself.
|
||||
</p>
|
||||
<p>An instance of PvaClientProcess is created via a call to one of the followimg:</p>
|
||||
<pre>
|
||||
class PvaClientChannel
|
||||
...
|
||||
{
|
||||
...
|
||||
PvaClientProcessPtr createProcess(std::string const & request = "");
|
||||
PvaClientProcessPtr createProcess(epics::pvData::PVStructurePtr const & pvRequest);
|
||||
...
|
||||
};
|
||||
<p>An instance of <b>PvaClientProcess</b> connects to a single channel.
|
||||
<b>PvaClientProcess</b> has both synchronous methods, which block, and non blocking methods.
|
||||
</p>
|
||||
<p><b>PvaClientChannel</b> has methods:</p>
|
||||
<pre>
|
||||
connect Calls issueConnect and then waitConnect.
|
||||
issueConnect issues a request to the server to create the server side of ChannelPut.
|
||||
waitConnect blocks until server responds that it has created the ChannelPut.
|
||||
process Calls issueProcess and then waitProcess.
|
||||
issueProcess issues a process request to the server.
|
||||
waitProcess waits until the server send a message that the process is complete.
|
||||
</pre>
|
||||
<p>
|
||||
<b>issueConnect</b> and <b>issueProcess</b> do not block.
|
||||
All other methods can block.
|
||||
</p>
|
||||
|
||||
</body>
|
||||
</html>
|
||||
|
@ -1,82 +0,0 @@
|
||||
<?xml version="1.0" encoding="iso-8859-1"?>
|
||||
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
|
||||
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
|
||||
<html xmlns="http://www.w3.org/1999/xhtml">
|
||||
<head>
|
||||
<meta http-equiv="content-type" content="text/html; charset=iso-8859-1" />
|
||||
<title>PvaClientChannelPut</title>
|
||||
<link rel="stylesheet" type="text/css"
|
||||
href="http://epics-pvdata.sourceforge.net/base.css" />
|
||||
<link rel="stylesheet" type="text/css"
|
||||
href="http://epics-pvdata.sourceforge.net/epicsv4.css" />
|
||||
<style type="text/css">
|
||||
/*<![CDATA[*/
|
||||
.about { margin-left: 3em; margin-right: 3em; font-size: .83em}
|
||||
table { margin-left: auto; margin-right: auto }
|
||||
.diagram { text-align: center; margin: 2.5em 0 }
|
||||
span.opt { color: grey }
|
||||
span.nterm { font-style:italic }
|
||||
span.term { font-family:courier }
|
||||
span.user { font-family:courier }
|
||||
span.user:before { content:"<" }
|
||||
span.user:after { content:">" }
|
||||
.nonnorm { font-style:italic }
|
||||
p.ed { color: #AA0000 }
|
||||
span.ed { color: #AA0000 }
|
||||
p.ed.priv { display: inline; }
|
||||
span.ed.priv { display: inline; }
|
||||
/*]]>*/</style>
|
||||
<!-- Script that generates the Table of Contents -->
|
||||
<script type="text/javascript"
|
||||
src="http://epics-pvdata.sourceforge.net/script/tocgen.js">
|
||||
</script>
|
||||
</head>
|
||||
<body>
|
||||
|
||||
<h1>PvaClientChannelPut</h1>s
|
||||
|
||||
<p>
|
||||
pvaClientPut is a synchronous wrapper for the pvAccess::ChannelPut API, which is a callback based API.
|
||||
Thus it is easier to use than pvAccess::ChannelPut itself.
|
||||
</p>
|
||||
<p>
|
||||
<b>NOTE:</b>
|
||||
Except for union fields pvaClientPut takes care of modifying the bitSet associated with
|
||||
the data sent to the server.
|
||||
</p>
|
||||
<p>An instance of PvaClientPut is created via a call to one of the followimg:</p>
|
||||
<pre>
|
||||
class PvaClientChannel
|
||||
...
|
||||
{
|
||||
...
|
||||
PvaClientPutPtr put(std::string const & request = "field(value,alarm,timeStamp)");
|
||||
PvaClientPutPtr createPut(std::string const & request = "");
|
||||
PvaClientPutPtr createPut(epics::pvData::PVStructurePtr const & pvRequest);
|
||||
...
|
||||
};
|
||||
<p>An instance of <b>PvaClientPut/b> connects to a single channel.
|
||||
<b>PvaClientPut</b> has both synchronous methods, which block, and non blocking methods.
|
||||
</p>
|
||||
<p><b>PvaClientPut</b> has methods:</p>
|
||||
<pre>
|
||||
connect Calls issueConnect and then waitConnect.
|
||||
issueConnect issues a request to the server to create the server side of ChannelPut.
|
||||
waitConnect blocks until server responds that it has created the ChannelPut.
|
||||
get Calls issueGet and then waitGet.
|
||||
issueGet issues a request to the server to get the latest data.
|
||||
waitGet waits until the server send a message that the get is complete.
|
||||
put Calls issuePut and then waitPut.
|
||||
issuePut issues a put request to the server.
|
||||
waitPut waits until the server send a message that the put is complete.
|
||||
getData get the data.
|
||||
</pre>
|
||||
<p>
|
||||
Note that <b>issueConnect</b>, <b>issueGet</b> and <b>issuePut</b> do not block but all other methods
|
||||
do block.
|
||||
</p>
|
||||
|
||||
|
||||
</body>
|
||||
</html>
|
||||
|
@ -1,75 +0,0 @@
|
||||
<?xml version="1.0" encoding="iso-8859-1"?>
|
||||
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
|
||||
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
|
||||
<html xmlns="http://www.w3.org/1999/xhtml">
|
||||
<head>
|
||||
<meta http-equiv="content-type" content="text/html; charset=iso-8859-1" />
|
||||
<title>PvaClientPutData</title>
|
||||
<link rel="stylesheet" type="text/css"
|
||||
href="http://epics-pvdata.sourceforge.net/base.css" />
|
||||
<link rel="stylesheet" type="text/css"
|
||||
href="http://epics-pvdata.sourceforge.net/epicsv4.css" />
|
||||
<style type="text/css">
|
||||
/*<![CDATA[*/
|
||||
.about { margin-left: 3em; margin-right: 3em; font-size: .83em}
|
||||
table { margin-left: auto; margin-right: auto }
|
||||
.diagram { text-align: center; margin: 2.5em 0 }
|
||||
span.opt { color: grey }
|
||||
span.nterm { font-style:italic }
|
||||
span.term { font-family:courier }
|
||||
span.user { font-family:courier }
|
||||
span.user:before { content:"<" }
|
||||
span.user:after { content:">" }
|
||||
.nonnorm { font-style:italic }
|
||||
p.ed { color: #AA0000 }
|
||||
span.ed { color: #AA0000 }
|
||||
p.ed.priv { display: inline; }
|
||||
span.ed.priv { display: inline; }
|
||||
/*]]>*/</style>
|
||||
<!-- Script that generates the Table of Contents -->
|
||||
<script type="text/javascript"
|
||||
src="http://epics-pvdata.sourceforge.net/script/tocgen.js">
|
||||
</script>
|
||||
</head>
|
||||
<body>
|
||||
|
||||
<h1>PvaClientPutData</h1>
|
||||
|
||||
<p>This class provides access to data to send to the server via a <b>PvaChannelPut</b>
|
||||
It is created by <b>PvaChannelPut</b> or <b>PvaChannelPutGet</b>.
|
||||
This the client only gets access to an instance by getting it from <b>PvaChannelPut</b> or <b>PvaChannelPutGet</b>.
|
||||
<p>
|
||||
<p>Note also that for all field types except <b>union</b> the <b>BitSet</b> for the data is updated
|
||||
by <b>PvaChannelPut</b> or <b>PvaChannelPutGet</b> whenever the client changes a field.
|
||||
For a <b>union</b> or <b>unionArray</b> field the client must update the <b>BitSet</b>.
|
||||
</p>
|
||||
|
||||
<p>
|
||||
PvaClientPutData provides methods:</p>
|
||||
<pre>
|
||||
getStructure Get the introspection interface for data sent to server
|
||||
getPVStructure Get the complete set of data sent to the server.
|
||||
getChangedBitSet Get the bitSet that shows which fields have a new value since last get.
|
||||
showChanged Show all the fields that have changed value since the last get,
|
||||
getAlarm If a alarm field is available get it.
|
||||
getTimeStamp If a timeStamp field is available get it.
|
||||
hasValue Does the PVStructure have a top level field named value
|
||||
NOTE: The following only apply if hasValue is true.
|
||||
isValueScalar Is the value field a scalar?
|
||||
isValueScalarArray Is the value field a scalar array?
|
||||
getValue Get the value field.
|
||||
getScalarValue Get a scalar value field.
|
||||
getArrayValue Get an array value field.
|
||||
getScalarArrayValue Get a scalar array value field.
|
||||
getDouble Get scalar value field as a double.
|
||||
getString Get value field as a string.
|
||||
getDoubleArray Get value field as a double array.
|
||||
getStringArray Get value field as a string array.
|
||||
putDouble Put scalar value field as a double.
|
||||
putString Put value field as a string.
|
||||
putDoubleArray Put value field as a double array.
|
||||
putStringArray Put value field as a string array.
|
||||
</pre>
|
||||
</body>
|
||||
</html>
|
||||
|
@ -1,85 +0,0 @@
|
||||
<?xml version="1.0" encoding="iso-8859-1"?>
|
||||
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
|
||||
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
|
||||
<html xmlns="http://www.w3.org/1999/xhtml">
|
||||
<head>
|
||||
<meta http-equiv="content-type" content="text/html; charset=iso-8859-1" />
|
||||
<title>PvaClientPutGetGet</title>
|
||||
<link rel="stylesheet" type="text/css"
|
||||
href="http://epics-pvdata.sourceforge.net/base.css" />
|
||||
<link rel="stylesheet" type="text/css"
|
||||
href="http://epics-pvdata.sourceforge.net/epicsv4.css" />
|
||||
<style type="text/css">
|
||||
/*<![CDATA[*/
|
||||
.about { margin-left: 3em; margin-right: 3em; font-size: .83em}
|
||||
table { margin-left: auto; margin-right: auto }
|
||||
.diagram { text-align: center; margin: 2.5em 0 }
|
||||
span.opt { color: grey }
|
||||
span.nterm { font-style:italic }
|
||||
span.term { font-family:courier }
|
||||
span.user { font-family:courier }
|
||||
span.user:before { content:"<" }
|
||||
span.user:after { content:">" }
|
||||
.nonnorm { font-style:italic }
|
||||
p.ed { color: #AA0000 }
|
||||
span.ed { color: #AA0000 }
|
||||
p.ed.priv { display: inline; }
|
||||
span.ed.priv { display: inline; }
|
||||
/*]]>*/</style>
|
||||
<!-- Script that generates the Table of Contents -->
|
||||
<script type="text/javascript"
|
||||
src="http://epics-pvdata.sourceforge.net/script/tocgen.js">
|
||||
</script>
|
||||
</head>
|
||||
<body>
|
||||
|
||||
<h1>PvaClientPutGetGet</h1>
|
||||
|
||||
<p>
|
||||
pvaClientPutGet is a synchronous wrapper for the pvAccess::ChannelPutGet API, which is a callback based API.
|
||||
Thus it is easier to use than pvAccess::ChannelPut itself.
|
||||
</p>
|
||||
<p>
|
||||
<b>NOTE:</b>
|
||||
Except for union fields pvaClientPutGet takes care of modifying the bitSet associated with
|
||||
the data sent to the server.
|
||||
</p>
|
||||
<p>An instance of PvaClientPutGet is created via a call to one of the followimg:</p>
|
||||
<pre>
|
||||
class PvaClientChannel
|
||||
...
|
||||
{
|
||||
...
|
||||
PvaClientPutGetPtr createPutGet(std::string const & request);
|
||||
PvaClientPutGetPtr createPutGet(epics::pvData::PVStructurePtr const & pvRequest);
|
||||
...
|
||||
};
|
||||
<p>An instance of <b>PvaClientPutGet</b> connects to a single channel.
|
||||
<b>PvaClientPutGet</b> has both synchronous methods, which block, and non blocking methods.
|
||||
</p>
|
||||
<p><b>PvaClientPutGet</b> has methods:</p>
|
||||
<pre>
|
||||
connect calls issueConnect and then waitConnect.
|
||||
issueConnect issues a request to the server to create the server side of ChannelPut.
|
||||
waitConnect blocks until server responds that it has created the ChannelPut.
|
||||
putGet call issuePutGet and then waitPutGet.
|
||||
issuePutGet issue a putGet and return immediately.
|
||||
waitPutGet wait until putGet completes.
|
||||
getGet calls issueGetGet and then waitGetGet.
|
||||
issueGetGet issues a request to the server to get the latest data for the get data.
|
||||
waitGetGet waits until the server send a message that the getGet is complete.
|
||||
getPut calls issueGetPut and then waitGetPut.
|
||||
issueGetPut issues a request to the server to get the latest data for the put data.
|
||||
waitGetPut waits until the server send a message that the getPut is complete.
|
||||
getPutData get the put portion of the data.
|
||||
getGetData get the get portion of the data.
|
||||
</pre>
|
||||
<p>
|
||||
<b>issueConnect</b>, <b>issuePutGet</b>, <b>issueGetGet</b> and <b>issueGetPut</b> do not block.
|
||||
All other methods can block.
|
||||
</p>
|
||||
|
||||
|
||||
</body>
|
||||
</html>
|
||||
|
@ -1,66 +0,0 @@
|
||||
<?xml version="1.0" encoding="iso-8859-1"?>
|
||||
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
|
||||
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
|
||||
<html xmlns="http://www.w3.org/1999/xhtml">
|
||||
<head>
|
||||
<meta http-equiv="content-type" content="text/html; charset=iso-8859-1" />
|
||||
<title>PvaClientPutGetRequester</title>
|
||||
<link rel="stylesheet" type="text/css"
|
||||
href="http://epics-pvdata.sourceforge.net/base.css" />
|
||||
<link rel="stylesheet" type="text/css"
|
||||
href="http://epics-pvdata.sourceforge.net/epicsv4.css" />
|
||||
<style type="text/css">
|
||||
/*<![CDATA[*/
|
||||
.about { margin-left: 3em; margin-right: 3em; font-size: .83em}
|
||||
table { margin-left: auto; margin-right: auto }
|
||||
.diagram { text-align: center; margin: 2.5em 0 }
|
||||
span.opt { color: grey }
|
||||
span.nterm { font-style:italic }
|
||||
span.term { font-family:courier }
|
||||
span.user { font-family:courier }
|
||||
span.user:before { content:"<" }
|
||||
span.user:after { content:">" }
|
||||
.nonnorm { font-style:italic }
|
||||
p.ed { color: #AA0000 }
|
||||
span.ed { color: #AA0000 }
|
||||
p.ed.priv { display: inline; }
|
||||
span.ed.priv { display: inline; }
|
||||
/*]]>*/</style>
|
||||
<!-- Script that generates the Table of Contents -->
|
||||
<script type="text/javascript"
|
||||
src="http://epics-pvdata.sourceforge.net/script/tocgen.js">
|
||||
</script>
|
||||
</head>
|
||||
<body>
|
||||
|
||||
<h1>PvaClientPutGetRequester</h1>
|
||||
|
||||
<p>This is a virtual class that can be implemented by a client that uses <b>PvaClientPut</b>.
|
||||
It has the methods:</p>
|
||||
<pre>
|
||||
virtual void channelPutGetConnect(
|
||||
const Status& status,
|
||||
PvaClientPutGetPtr const & clientPutGet) {}
|
||||
virtual void putGetDone(
|
||||
const Status& status,
|
||||
PvaClientPutGetPtr const & clientPutGet) {}
|
||||
virtual void getPutDone(
|
||||
const Status& status,
|
||||
PvaClientPutGetPtr const & clientPutGet) = 0;
|
||||
virtual void getGetDone(
|
||||
const Status& status,
|
||||
PvaClientPutGetPtr const & clientPutGet) = 0;
|
||||
</pre>
|
||||
|
||||
<p>The client must call</p>
|
||||
<pre>
|
||||
pvaClientPutGet->setRequester(shared_from_this());
|
||||
</pre>
|
||||
<p>
|
||||
after creating an instance of PvaClientPutGet.
|
||||
</p>
|
||||
|
||||
|
||||
</body>
|
||||
</html>
|
||||
|
@ -1,63 +0,0 @@
|
||||
<?xml version="1.0" encoding="iso-8859-1"?>
|
||||
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
|
||||
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
|
||||
<html xmlns="http://www.w3.org/1999/xhtml">
|
||||
<head>
|
||||
<meta http-equiv="content-type" content="text/html; charset=iso-8859-1" />
|
||||
<title>PvaClientPutRequester</title>
|
||||
<link rel="stylesheet" type="text/css"
|
||||
href="http://epics-pvdata.sourceforge.net/base.css" />
|
||||
<link rel="stylesheet" type="text/css"
|
||||
href="http://epics-pvdata.sourceforge.net/epicsv4.css" />
|
||||
<style type="text/css">
|
||||
/*<![CDATA[*/
|
||||
.about { margin-left: 3em; margin-right: 3em; font-size: .83em}
|
||||
table { margin-left: auto; margin-right: auto }
|
||||
.diagram { text-align: center; margin: 2.5em 0 }
|
||||
span.opt { color: grey }
|
||||
span.nterm { font-style:italic }
|
||||
span.term { font-family:courier }
|
||||
span.user { font-family:courier }
|
||||
span.user:before { content:"<" }
|
||||
span.user:after { content:">" }
|
||||
.nonnorm { font-style:italic }
|
||||
p.ed { color: #AA0000 }
|
||||
span.ed { color: #AA0000 }
|
||||
p.ed.priv { display: inline; }
|
||||
span.ed.priv { display: inline; }
|
||||
/*]]>*/</style>
|
||||
<!-- Script that generates the Table of Contents -->
|
||||
<script type="text/javascript"
|
||||
src="http://epics-pvdata.sourceforge.net/script/tocgen.js">
|
||||
</script>
|
||||
</head>
|
||||
<body>
|
||||
|
||||
<h1>PvaClientPutRequester</h1>
|
||||
|
||||
<p>This is a virtual class that can be implemented by a client that uses <b>PvaClientPut</b>.
|
||||
It has the methods:</p>
|
||||
<pre>
|
||||
virtual void channelPutConnect(
|
||||
const Status& status,
|
||||
PvaClientPutPtr const & clientPut) {}
|
||||
virtual void getDone(
|
||||
const Status& status,
|
||||
PvaClientPutPtr const & clientPut) {}
|
||||
virtual void putDone(
|
||||
const Status& status,
|
||||
PvaClientPutPtr const & clientPut) = 0;
|
||||
</pre>
|
||||
|
||||
<p>The client must call</p>
|
||||
<pre>
|
||||
pvaClientPut->setRequester(shared_from_this());
|
||||
</pre>
|
||||
<p>
|
||||
after creating an instance of PvaClientPut.
|
||||
</p>
|
||||
|
||||
|
||||
</body>
|
||||
</html>
|
||||
|
@ -1,44 +0,0 @@
|
||||
<?xml version="1.0" encoding="iso-8859-1"?>
|
||||
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
|
||||
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
|
||||
<html xmlns="http://www.w3.org/1999/xhtml">
|
||||
<head>
|
||||
<meta http-equiv="content-type" content="text/html; charset=iso-8859-1" />
|
||||
<title>PvaClientRPC</title>
|
||||
<link rel="stylesheet" type="text/css"
|
||||
href="http://epics-pvdata.sourceforge.net/base.css" />
|
||||
<link rel="stylesheet" type="text/css"
|
||||
href="http://epics-pvdata.sourceforge.net/epicsv4.css" />
|
||||
<style type="text/css">
|
||||
/*<![CDATA[*/
|
||||
.about { margin-left: 3em; margin-right: 3em; font-size: .83em}
|
||||
table { margin-left: auto; margin-right: auto }
|
||||
.diagram { text-align: center; margin: 2.5em 0 }
|
||||
span.opt { color: grey }
|
||||
span.nterm { font-style:italic }
|
||||
span.term { font-family:courier }
|
||||
span.user { font-family:courier }
|
||||
span.user:before { content:"<" }
|
||||
span.user:after { content:">" }
|
||||
.nonnorm { font-style:italic }
|
||||
p.ed { color: #AA0000 }
|
||||
span.ed { color: #AA0000 }
|
||||
p.ed.priv { display: inline; }
|
||||
span.ed.priv { display: inline; }
|
||||
/*]]>*/</style>
|
||||
<!-- Script that generates the Table of Contents -->
|
||||
<script type="text/javascript"
|
||||
src="http://epics-pvdata.sourceforge.net/script/tocgen.js">
|
||||
</script>
|
||||
</head>
|
||||
<body>
|
||||
|
||||
<h1>PvaClientRPC</h1>
|
||||
|
||||
<p>
|
||||
<b>Not Yet Written</b>
|
||||
</p>
|
||||
|
||||
</body>
|
||||
</html>
|
||||
|
@ -1,44 +0,0 @@
|
||||
<?xml version="1.0" encoding="iso-8859-1"?>
|
||||
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
|
||||
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
|
||||
<html xmlns="http://www.w3.org/1999/xhtml">
|
||||
<head>
|
||||
<meta http-equiv="content-type" content="text/html; charset=iso-8859-1" />
|
||||
<title>PvaClientRPCRequester</title>
|
||||
<link rel="stylesheet" type="text/css"
|
||||
href="http://epics-pvdata.sourceforge.net/base.css" />
|
||||
<link rel="stylesheet" type="text/css"
|
||||
href="http://epics-pvdata.sourceforge.net/epicsv4.css" />
|
||||
<style type="text/css">
|
||||
/*<![CDATA[*/
|
||||
.about { margin-left: 3em; margin-right: 3em; font-size: .83em}
|
||||
table { margin-left: auto; margin-right: auto }
|
||||
.diagram { text-align: center; margin: 2.5em 0 }
|
||||
span.opt { color: grey }
|
||||
span.nterm { font-style:italic }
|
||||
span.term { font-family:courier }
|
||||
span.user { font-family:courier }
|
||||
span.user:before { content:"<" }
|
||||
span.user:after { content:">" }
|
||||
.nonnorm { font-style:italic }
|
||||
p.ed { color: #AA0000 }
|
||||
span.ed { color: #AA0000 }
|
||||
p.ed.priv { display: inline; }
|
||||
span.ed.priv { display: inline; }
|
||||
/*]]>*/</style>
|
||||
<!-- Script that generates the Table of Contents -->
|
||||
<script type="text/javascript"
|
||||
src="http://epics-pvdata.sourceforge.net/script/tocgen.js">
|
||||
</script>
|
||||
</head>
|
||||
<body>
|
||||
|
||||
<h1>PvaClientRPCRequester</h1>
|
||||
|
||||
<p>
|
||||
<b>Not Yet Written</b>
|
||||
</p>
|
||||
|
||||
</body>
|
||||
</html>
|
||||
|
@ -58,8 +58,6 @@ typedef std::tr1::shared_ptr<PvaClientChannelStateChangeRequester> PvaClientChan
|
||||
typedef std::tr1::weak_ptr<PvaClientChannelStateChangeRequester> PvaClientChannelStateChangeRequesterWPtr;
|
||||
class PvaClientChannel;
|
||||
typedef std::tr1::shared_ptr<PvaClientChannel> PvaClientChannelPtr;
|
||||
class PvaClientField;
|
||||
typedef std::tr1::shared_ptr<PvaClientField> PvaClientFieldPtr;
|
||||
class PvaClientProcessRequester;
|
||||
typedef std::tr1::shared_ptr<PvaClientProcessRequester> PvaClientProcessRequesterPtr;
|
||||
typedef std::tr1::weak_ptr<PvaClientProcessRequester> PvaClientProcessRequesterWPtr;
|
||||
@ -85,8 +83,6 @@ typedef std::tr1::shared_ptr<PvaClientMonitor> PvaClientMonitorPtr;
|
||||
class PvaClientMonitorRequester;
|
||||
typedef std::tr1::shared_ptr<PvaClientMonitorRequester> PvaClientMonitorRequesterPtr;
|
||||
typedef std::tr1::weak_ptr<PvaClientMonitorRequester> PvaClientMonitorRequesterWPtr;
|
||||
class PvaClientArray;
|
||||
typedef std::tr1::shared_ptr<PvaClientArray> PvaClientArrayPtr;
|
||||
class PvaClientRPC;
|
||||
typedef std::tr1::shared_ptr<PvaClientRPC> PvaClientRPCPtr;
|
||||
class PvaClientRPCRequester;
|
||||
@ -101,7 +97,6 @@ typedef std::tr1::shared_ptr<PvaClientChannelCache> PvaClientChannelCachePtr;
|
||||
/**
|
||||
* @brief pvaClient is a synchronous wrapper for the pvAccess API, which is a callback based API.
|
||||
*
|
||||
* <a href = "../htmldoxygen/pvaClient.html">Overview of PvaClient</a>
|
||||
*/
|
||||
class epicsShareClass PvaClient :
|
||||
public epics::pvData::Requester,
|
||||
@ -119,16 +114,11 @@ public:
|
||||
* @return shared pointer to the single instance.
|
||||
*/
|
||||
static PvaClientPtr get(std::string const & providerNames = "pva ca");
|
||||
/** @brief Get the requester name.
|
||||
* @return The name.
|
||||
*/
|
||||
/** @brief Create an instance of PvaClient with providerName "pva ca".
|
||||
/** @brief Create an instance of PvaClient with providerName "pva ca".
|
||||
* @return shared pointer to the single instance
|
||||
* @deprecated This method will go away in future versions. Use get instead.
|
||||
*/
|
||||
static PvaClientPtr create() EPICS_DEPRECATED;
|
||||
|
||||
std::string getRequesterName();
|
||||
/** @brief A new message.
|
||||
*
|
||||
* If a requester is set then it is called otherwise message is displayed
|
||||
@ -156,7 +146,6 @@ public:
|
||||
* @param channelName The channelName.
|
||||
* @param providerName The provider.
|
||||
* @return The interface.
|
||||
* @throw runtime_error if connection fails.
|
||||
*/
|
||||
PvaClientChannelPtr createChannel(
|
||||
std::string const & channelName,
|
||||
@ -168,6 +157,13 @@ public:
|
||||
* @param requester The requester.
|
||||
*/
|
||||
void setRequester(epics::pvData::RequesterPtr const & requester);
|
||||
/** @brief Get the requester name.
|
||||
*
|
||||
* If client calls setRequester then the client supplies the name.
|
||||
* Otherwise the name is pvaClient.
|
||||
* @return The name.
|
||||
*/
|
||||
std::string getRequesterName();
|
||||
/** @brief Clear the requester. PvaClient will handle messages.
|
||||
*/
|
||||
void clearRequester();
|
||||
@ -207,7 +203,6 @@ typedef std::tr1::shared_ptr<PvaClientPutCache> PvaClientPutCachePtr;
|
||||
/**
|
||||
* @brief A callback for change in connection status.
|
||||
*
|
||||
* <a href = "../htmldoxygen/pvaClientChannelStateChangeRequester.html">Overview of PvaClientChannelStateChangeRequester</a>
|
||||
*
|
||||
*/
|
||||
class epicsShareClass PvaClientChannelStateChangeRequester
|
||||
@ -231,7 +226,6 @@ public:
|
||||
/**
|
||||
* @brief An easy to use alternative to directly calling the Channel methods of pvAccess.
|
||||
*
|
||||
* <a href = "../htmldoxygen/pvaClientChannel.html">Overview of PvaClientChannel</a>
|
||||
*/
|
||||
|
||||
class epicsShareClass PvaClientChannel :
|
||||
@ -276,13 +270,6 @@ public:
|
||||
* @return status.
|
||||
*/
|
||||
epics::pvData::Status waitConnect(double timeout = 5.0);
|
||||
/** @brief Create a PvaClientField for the specified subField.
|
||||
*
|
||||
* @param subField The desired subField, i. e. "field.field...."
|
||||
* An empty string, i. e. "", asks for the entire top level struture as defined by the server.
|
||||
* @return The interface.
|
||||
*/
|
||||
PvaClientFieldPtr createField(std::string const & subField = "");
|
||||
/** @brief First call createRequest as implemented by pvDataCPP and then call the next method.
|
||||
*
|
||||
* @param request The syntax of request is defined by the copy facility of pvData.
|
||||
@ -426,20 +413,6 @@ public:
|
||||
* @return The interface.
|
||||
*/
|
||||
PvaClientPutGetPtr createPutGet(epics::pvData::PVStructurePtr const & pvRequest);
|
||||
/** @brief Create a PvaClientArray.
|
||||
*
|
||||
* First call createRequest as implemented by pvDataJava and then call the next method.
|
||||
* @param request The syntax of request is defined by the copy facility of pvData.
|
||||
* @return The interface.
|
||||
* @throw runtime_error if failure.
|
||||
*/
|
||||
PvaClientArrayPtr createArray(std::string const & request = "field(value)");
|
||||
/** @brief Create a PvaClientArray.
|
||||
* @param pvRequest The syntax of pvRequest is defined by the copy facility of pvData.
|
||||
* @return The interface.
|
||||
* @throw runtime_error if failure.
|
||||
*/
|
||||
PvaClientArrayPtr createArray(epics::pvData::PVStructurePtr const & pvRequest);
|
||||
/** @brief Create a PvaClientMonitor.
|
||||
*
|
||||
* Create and connect to a new PvaClientMonitor.
|
||||
@ -564,7 +537,6 @@ public:
|
||||
/**
|
||||
* @brief A base class for PvaClientGetData, PvaClientPutData, and PvaClientMonitorData.
|
||||
*
|
||||
* <a href = "../htmldoxygen/pvaClientData.html">Overview of PvaClientData</a>
|
||||
*/
|
||||
class epicsShareClass PvaClientData
|
||||
{
|
||||
@ -685,15 +657,15 @@ public:
|
||||
*
|
||||
* Accepts arguments of the form json or field='value' where value is json syntax.
|
||||
* field is name.name...
|
||||
* @param args The arguments
|
||||
* @param args The arguments.
|
||||
* @throw runtime_error if failure.
|
||||
*/
|
||||
void parse(const std::vector<std::string> &args);
|
||||
/** @brief generate JSON output from the current PVStructure
|
||||
/** @brief generate JSON output from the current PVStructure and displays it on the output stream.
|
||||
*
|
||||
* @param strm output stream
|
||||
* @param ignoreUnprintable false or true; default is true.
|
||||
* @param multiline false or true; default is false
|
||||
* @param strm The output stream.
|
||||
* @param ignoreUnprintable false or true; The default is true.
|
||||
* @param multiline false or true; The default is false.
|
||||
*
|
||||
* @throw runtime_error if failure.
|
||||
*/
|
||||
@ -704,14 +676,8 @@ public:
|
||||
/** @brief set length of all array fields to 0
|
||||
*/
|
||||
void zeroArrayLength();
|
||||
/** @brief Factory method for creating an instance of PvaClientData.
|
||||
*
|
||||
* NOTE: Not normally called by clients
|
||||
* @param structure Introspection interface
|
||||
* @throw runtime_error if failure.
|
||||
*/
|
||||
static PvaClientDataPtr create(epics::pvData::StructureConstPtr const & structure);
|
||||
protected:
|
||||
static PvaClientDataPtr create(epics::pvData::StructureConstPtr const & structure);
|
||||
PvaClientData(epics::pvData::StructureConstPtr const & structure);
|
||||
epics::pvData::PVFieldPtr getSinglePVField();
|
||||
void checkValue();
|
||||
@ -740,7 +706,6 @@ private:
|
||||
/**
|
||||
* @brief A class that holds data returned by PvaClientGet or PvaClientPutGet
|
||||
*
|
||||
* <a href = "../htmldoxygen/pvaClientGetData.html">Overview of PvaClientGetData</a>
|
||||
*/
|
||||
class epicsShareClass PvaClientGetData : public PvaClientData
|
||||
{
|
||||
@ -767,7 +732,6 @@ class PvaClientPostHandlerPvt; // private to PvaClientPutData
|
||||
/**
|
||||
* @brief A class that holds data given to by PvaClientPut or PvaClientPutGet
|
||||
*
|
||||
* <a href = "../htmldoxygen/pvaClientPutData.html">Overview of PvaClientPutData</a>
|
||||
*/
|
||||
class epicsShareClass PvaClientPutData : public PvaClientData
|
||||
{
|
||||
@ -819,8 +783,6 @@ private:
|
||||
|
||||
/**
|
||||
* @brief A class that holds data returned by PvaClientMonitor
|
||||
*
|
||||
* <a href = "../htmldoxygen/pvaClientMonitorData.html">Overview of PvaClientMonitorData</a>
|
||||
*/
|
||||
class epicsShareClass PvaClientMonitorData : public PvaClientData
|
||||
{
|
||||
@ -861,7 +823,6 @@ private:
|
||||
/**
|
||||
* @brief Optional client callback.
|
||||
*
|
||||
* <a href = "../htmldoxygen/pvaClientProcessRequester.html">Overview of PvaClientProcessRequester</a>
|
||||
*/
|
||||
class epicsShareClass PvaClientProcessRequester
|
||||
{
|
||||
@ -896,7 +857,6 @@ typedef std::tr1::shared_ptr<ChannelProcessRequesterImpl> ChannelProcessRequeste
|
||||
/**
|
||||
* @brief An easy to use alternative to ChannelProcess.
|
||||
*
|
||||
* <a href = "../htmldoxygen/pvaClientProcess.html">Overview of PvaClientProcess</a>
|
||||
*/
|
||||
class epicsShareClass PvaClientProcess :
|
||||
public std::tr1::enable_shared_from_this<PvaClientProcess>
|
||||
@ -1001,7 +961,6 @@ typedef std::tr1::shared_ptr<ChannelGetRequesterImpl> ChannelGetRequesterImplPtr
|
||||
/**
|
||||
* @brief Optional client callback.
|
||||
*
|
||||
* <a href = "../htmldoxygen/pvaClientGetRequester.html">Overview of PvaClientGetRequester</a>
|
||||
*/
|
||||
class epicsShareClass PvaClientGetRequester
|
||||
{
|
||||
@ -1030,7 +989,6 @@ public:
|
||||
/**
|
||||
* @brief An easy to use alternative to ChannelGet.
|
||||
*
|
||||
* <a href = "../htmldoxygen/pvaClientGet.html">Overview of PvaClientGet</a>
|
||||
*/
|
||||
class epicsShareClass PvaClientGet :
|
||||
public std::tr1::enable_shared_from_this<PvaClientGet>
|
||||
@ -1146,7 +1104,6 @@ typedef std::tr1::shared_ptr<ChannelPutRequesterImpl> ChannelPutRequesterImplPtr
|
||||
/**
|
||||
* @brief Optional client callback.
|
||||
*
|
||||
* <a href = "../htmldoxygen/pvaClientPutRequester.html">Overview of PvaClientPutRequester</a>
|
||||
*/
|
||||
class epicsShareClass PvaClientPutRequester
|
||||
{
|
||||
@ -1186,7 +1143,6 @@ public:
|
||||
/**
|
||||
* @brief An easy to use alternative to ChannelPut.
|
||||
*
|
||||
* <a href = "../htmldoxygen/pvaClientPut.html">Overview of PvaClientPut</a>
|
||||
*/
|
||||
class epicsShareClass PvaClientPut :
|
||||
public std::tr1::enable_shared_from_this<PvaClientPut>
|
||||
@ -1312,7 +1268,6 @@ typedef std::tr1::shared_ptr<ChannelPutGetRequesterImpl> ChannelPutGetRequesterI
|
||||
/**
|
||||
* @brief Optional client callback.
|
||||
*
|
||||
* <a href = "../htmldoxygen/pvaClientPutGetRequester.html">Overview of PvaClientPutGetRequester</a>
|
||||
*/
|
||||
class epicsShareClass PvaClientPutGetRequester
|
||||
{
|
||||
@ -1364,7 +1319,6 @@ public:
|
||||
/**
|
||||
* @brief An easy to use alternative to ChannelPutGet.
|
||||
*
|
||||
* <a href = "../htmldoxygen/pvaClientPutGet.html">Overview of PvaClientPutGet</a>
|
||||
*/
|
||||
class epicsShareClass PvaClientPutGet :
|
||||
public std::tr1::enable_shared_from_this<PvaClientPutGet>
|
||||
@ -1511,11 +1465,9 @@ public:
|
||||
friend class ChannelPutGetRequesterImpl;
|
||||
};
|
||||
|
||||
//class ChannelMonitorRequester; // private to PvaClientMonitor
|
||||
/**
|
||||
* @brief Optional client callback.
|
||||
*
|
||||
* <a href = "../htmldoxygen/pvaClientMonitorRequester.html">Overview of PvaClientMonitorRequester</a>
|
||||
*/
|
||||
class epicsShareClass PvaClientMonitorRequester
|
||||
{
|
||||
@ -1556,7 +1508,6 @@ typedef std::tr1::shared_ptr<MonitorRequesterImpl> MonitorRequesterImplPtr;
|
||||
/**
|
||||
* @brief An easy to use alternative to Monitor.
|
||||
*
|
||||
* <a href = "../htmldoxygen/pvaClientMonitor.html">Overview of PvaClientMonitor</a>
|
||||
*/
|
||||
class epicsShareClass PvaClientMonitor :
|
||||
public PvaClientChannelStateChangeRequester, // remove when deprecated create removed
|
||||
@ -1705,7 +1656,6 @@ public:
|
||||
/**
|
||||
* @brief Optional client callback.
|
||||
*
|
||||
* <a href = "../htmldoxygen/pvaClientRPCRequester.html">Overview of PvaClientRPCRequester</a>
|
||||
*/
|
||||
class PvaClientRPCRequester
|
||||
{
|
||||
@ -1731,7 +1681,6 @@ typedef std::tr1::shared_ptr<RPCRequesterImpl> RPCRequesterImplPtr;
|
||||
/**
|
||||
* @brief An easy to use alternative to RPC.
|
||||
*
|
||||
* <a href = "../htmldoxygen/pvaClientRPC.html">Overview of PvaClientRPC</a>
|
||||
*/
|
||||
class epicsShareClass PvaClientRPC :
|
||||
public std::tr1::enable_shared_from_this<PvaClientRPC>
|
||||
@ -1854,9 +1803,3 @@ private:
|
||||
}}
|
||||
|
||||
#endif /* PVACLIENT_H */
|
||||
|
||||
/** @page Overview Documentation
|
||||
*
|
||||
* <a href = "../pvaClientCPP.html">pvaClientCPP.html</a>
|
||||
*
|
||||
*/
|
||||
|
@ -148,13 +148,13 @@ public:
|
||||
private:
|
||||
PvaClientMultiChannel(
|
||||
PvaClientPtr const &pvaClient,
|
||||
epics::pvData::shared_vector<const std::string> const & channelName,
|
||||
epics::pvData::shared_vector<const std::string> const & channelNames,
|
||||
std::string const & providerName,
|
||||
size_t maxNotConnected);
|
||||
void checkConnected();
|
||||
|
||||
PvaClientPtr pvaClient;
|
||||
epics::pvData::shared_vector<const std::string> channelName;
|
||||
epics::pvData::shared_vector<const std::string> channelNames;
|
||||
std::string providerName;
|
||||
size_t maxNotConnected;
|
||||
|
||||
@ -162,6 +162,7 @@ private:
|
||||
epics::pvData::Mutex mutex;
|
||||
|
||||
size_t numConnected;
|
||||
bool firstConnect;
|
||||
PvaClientChannelArray pvaClientChannelArray;
|
||||
epics::pvData::shared_vector<epics::pvData::boolean> isConnected;
|
||||
epics::pvData::CreateRequest::shared_pointer createRequest;
|
||||
@ -176,19 +177,16 @@ class epicsShareClass PvaClientMultiGetDouble :
|
||||
|
||||
public:
|
||||
POINTER_DEFINITIONS(PvaClientMultiGetDouble);
|
||||
|
||||
/**
|
||||
* @brief Create a PvaClientMultiGetDouble.
|
||||
* @param pvaClientMultiChannel The interface to PvaClientMultiChannel.
|
||||
* @param pvaClientChannelArray The PvaClientChannel array.
|
||||
* @return The interface.
|
||||
*/
|
||||
protected:
|
||||
static PvaClientMultiGetDoublePtr create(
|
||||
PvaClientMultiChannelPtr const &pvaClientMultiChannel,
|
||||
PvaClientChannelArray const &pvaClientChannelArray);
|
||||
|
||||
friend class PvaClientMultiChannel;
|
||||
public:
|
||||
/**
|
||||
* @brief Destructor
|
||||
*/
|
||||
~PvaClientMultiGetDouble();
|
||||
|
||||
/**
|
||||
* @brief Create a channelGet for each channel.
|
||||
*/
|
||||
@ -198,13 +196,6 @@ public:
|
||||
* @return The double[] where each element is the value field of the corresponding channel.
|
||||
*/
|
||||
epics::pvData::shared_vector<double> get();
|
||||
/** @brief Get the shared pointer to self.
|
||||
* @return The shared pointer.
|
||||
*/
|
||||
PvaClientMultiGetDoublePtr getPtrSelf()
|
||||
{
|
||||
return shared_from_this();
|
||||
}
|
||||
private:
|
||||
PvaClientMultiGetDouble(
|
||||
PvaClientMultiChannelPtr const &pvaClientMultiChannel,
|
||||
@ -229,15 +220,15 @@ class epicsShareClass PvaClientMultiPutDouble :
|
||||
|
||||
public:
|
||||
POINTER_DEFINITIONS(PvaClientMultiPutDouble);
|
||||
|
||||
/** @brief Create a PvaClientMultiPutDouble.
|
||||
* @param pvaClientMultiChannel The interface to PvaClientMultiChannel.
|
||||
* @param pvaClientChannelArray The PvaClientChannel array.
|
||||
* @return The interface.
|
||||
*/
|
||||
protected:
|
||||
static PvaClientMultiPutDoublePtr create(
|
||||
PvaClientMultiChannelPtr const &pvaClientMultiChannel,
|
||||
PvaClientChannelArray const &pvaClientChannelArray);
|
||||
friend class PvaClientMultiChannel;
|
||||
public:
|
||||
/**
|
||||
* @brief Destructor
|
||||
*/
|
||||
~PvaClientMultiPutDouble();
|
||||
/**
|
||||
* @brief Create a channelPut for each channel.
|
||||
@ -247,13 +238,7 @@ public:
|
||||
* @param data The array of data for each channel.
|
||||
*/
|
||||
void put(epics::pvData::shared_vector<double> const &data);
|
||||
/** @brief Get the shared pointer to self.
|
||||
* @return The shared pointer.
|
||||
*/
|
||||
PvaClientMultiPutDoublePtr getPtrSelf()
|
||||
{
|
||||
return shared_from_this();
|
||||
}
|
||||
|
||||
private:
|
||||
PvaClientMultiPutDouble(
|
||||
PvaClientMultiChannelPtr const &pvaClientMultiChannel,
|
||||
@ -277,15 +262,15 @@ class epicsShareClass PvaClientMultiMonitorDouble :
|
||||
|
||||
public:
|
||||
POINTER_DEFINITIONS(PvaClientMultiMonitorDouble);
|
||||
|
||||
/** @brief Create a PvaClientMultiMonitorDouble.
|
||||
* @param pvaClientMultiChannel The interface to PvaClientMultiChannel.
|
||||
* @param pvaClientChannelArray The PvaClientChannel array.
|
||||
* @return The interface.
|
||||
*/
|
||||
protected:
|
||||
static PvaClientMultiMonitorDoublePtr create(
|
||||
PvaClientMultiChannelPtr const &pvaClientMultiChannel,
|
||||
PvaClientChannelArray const &pvaClientChannelArray);
|
||||
friend class PvaClientMultiChannel;
|
||||
public:
|
||||
/**
|
||||
* @brief Destructor
|
||||
*/
|
||||
~PvaClientMultiMonitorDouble();
|
||||
/**
|
||||
* @brief Connect a channel monitor for each channel.
|
||||
@ -310,13 +295,7 @@ public:
|
||||
* @return The double[] where each element is the value field of the corresponding channel.
|
||||
*/
|
||||
epics::pvData::shared_vector<double> get();
|
||||
/** @brief Monitor the shared pointer to self.
|
||||
* @return The shared pointer.
|
||||
*/
|
||||
PvaClientMultiMonitorDoublePtr getPtrSelf()
|
||||
{
|
||||
return shared_from_this();
|
||||
}
|
||||
|
||||
private:
|
||||
PvaClientMultiMonitorDouble(
|
||||
PvaClientMultiChannelPtr const &pvaClientMultiChannel,
|
||||
@ -341,18 +320,16 @@ class epicsShareClass PvaClientNTMultiGet :
|
||||
|
||||
public:
|
||||
POINTER_DEFINITIONS(PvaClientNTMultiGet);
|
||||
/**
|
||||
* @brief Create a PvaClientNTMultiGet.
|
||||
* @param pvaClientMultiChannel The interface to PvaClientMultiChannel.
|
||||
* @param pvaClientChannelArray The PvaClientChannel array.
|
||||
* @param pvRequest The pvRequest for each channel.
|
||||
* @return The interface.
|
||||
*/
|
||||
protected:
|
||||
static PvaClientNTMultiGetPtr create(
|
||||
PvaClientMultiChannelPtr const &pvaClientMultiChannel,
|
||||
PvaClientChannelArray const &pvaClientChannelArray,
|
||||
epics::pvData::PVStructurePtr const & pvRequest);
|
||||
|
||||
friend class PvaClientMultiChannel;
|
||||
public:
|
||||
/**
|
||||
* @brief Destructor
|
||||
*/
|
||||
~PvaClientNTMultiGet();
|
||||
/**
|
||||
* @brief Connect a channelGet for each channel.
|
||||
@ -369,13 +346,7 @@ public:
|
||||
* @return the pvaClientNTMultiData.
|
||||
*/
|
||||
PvaClientNTMultiDataPtr getData();
|
||||
/** @brief Get the shared pointer to self.
|
||||
* @return The shared pointer.
|
||||
*/
|
||||
PvaClientNTMultiGetPtr getPtrSelf()
|
||||
{
|
||||
return shared_from_this();
|
||||
}
|
||||
|
||||
private:
|
||||
PvaClientNTMultiGet(
|
||||
epics::pvData::UnionConstPtr const & u,
|
||||
@ -389,7 +360,6 @@ private:
|
||||
size_t nchannel;
|
||||
epics::pvData::Mutex mutex;
|
||||
|
||||
|
||||
PvaClientNTMultiDataPtr pvaClientNTMultiData;
|
||||
std::vector<PvaClientGetPtr> pvaClientGet;
|
||||
bool isConnected;
|
||||
@ -404,16 +374,15 @@ class epicsShareClass PvaClientNTMultiPut :
|
||||
|
||||
public:
|
||||
POINTER_DEFINITIONS(PvaClientNTMultiPut);
|
||||
/**
|
||||
* @brief Create a PvaClientNTMultiPut.
|
||||
* @param pvaClientMultiChannel The interface to PvaClientMultiChannel.
|
||||
* @param pvaClientChannelArray The PvaClientChannel array.
|
||||
* @return The interface.
|
||||
*/
|
||||
protected:
|
||||
static PvaClientNTMultiPutPtr create(
|
||||
PvaClientMultiChannelPtr const &pvaClientMultiChannel,
|
||||
PvaClientChannelArray const &pvaClientChannelArray);
|
||||
|
||||
friend class PvaClientMultiChannel;
|
||||
public:
|
||||
/**
|
||||
* @brief Destructor
|
||||
*/
|
||||
~PvaClientNTMultiPut();
|
||||
/**
|
||||
* @brief Connect a channelPut for each channel.
|
||||
@ -426,15 +395,9 @@ public:
|
||||
epics::pvData::shared_vector<epics::pvData::PVUnionPtr> getValues();
|
||||
/**
|
||||
* @brief Issue a put for each channel.
|
||||
' */
|
||||
void put();
|
||||
/** @brief Get the shared pointer to self.
|
||||
* @return The shared pointer.
|
||||
*/
|
||||
PvaClientNTMultiPutPtr getPtrSelf()
|
||||
{
|
||||
return shared_from_this();
|
||||
}
|
||||
void put();
|
||||
|
||||
private:
|
||||
PvaClientNTMultiPut(
|
||||
PvaClientMultiChannelPtr const &pvaClientMultiChannel,
|
||||
@ -460,16 +423,16 @@ class epicsShareClass PvaClientNTMultiMonitor :
|
||||
|
||||
public:
|
||||
POINTER_DEFINITIONS(PvaClientNTMultiMonitor);
|
||||
/** @brief Create a PvaClientNTMultiMonitor.
|
||||
* @param pvaClientMultiChannel The interface to PvaClientMultiChannel.
|
||||
* @param pvaClientChannelArray The PvaClientChannel array.
|
||||
* @param pvRequest The pvRequest for each channel.
|
||||
* @return The interface.
|
||||
*/
|
||||
protected:
|
||||
static PvaClientNTMultiMonitorPtr create(
|
||||
PvaClientMultiChannelPtr const &pvaClientMultiChannel,
|
||||
PvaClientChannelArray const &pvaClientChannelArray,
|
||||
epics::pvData::PVStructurePtr const & pvRequest);
|
||||
friend class PvaClientMultiChannel;
|
||||
public:
|
||||
/**
|
||||
* @brief Destructor
|
||||
*/
|
||||
~PvaClientNTMultiMonitor();
|
||||
/**
|
||||
* @brief Connect to a channel monitor for each channel.
|
||||
@ -495,13 +458,7 @@ public:
|
||||
* @return the pvaClientNTMultiData.
|
||||
*/
|
||||
PvaClientNTMultiDataPtr getData();
|
||||
/** Monitor the shared pointer to self.
|
||||
* @return The shared pointer.
|
||||
*/
|
||||
PvaClientNTMultiMonitorPtr getPtrSelf()
|
||||
{
|
||||
return shared_from_this();
|
||||
}
|
||||
|
||||
private:
|
||||
PvaClientNTMultiMonitor(
|
||||
epics::pvData::UnionConstPtr const & u,
|
||||
@ -528,39 +485,13 @@ class epicsShareClass PvaClientNTMultiData :
|
||||
|
||||
public:
|
||||
POINTER_DEFINITIONS(PvaClientNTMultiData);
|
||||
/**
|
||||
* @brief Create a PvaClientNTMultiData.
|
||||
*
|
||||
* Normally only called by PvaClientNTMultiGet and PvaClientNTMultiMonitor.
|
||||
* @param u The union interface for the value field of each channel.
|
||||
* @param pvaClientMultiChannel The interface to PvaClientMultiChannel.
|
||||
* @param pvaClientChannelArray The PvaClientChannel array.
|
||||
* @param pvRequest The pvRequest for each channel.
|
||||
*/
|
||||
static PvaClientNTMultiDataPtr create(
|
||||
epics::pvData::UnionConstPtr const & u,
|
||||
PvaClientMultiChannelPtr const &pvaClientMultiChannel,
|
||||
PvaClientChannelArray const &pvaClientChannelArray,
|
||||
epics::pvData::PVStructurePtr const & pvRequest);
|
||||
~PvaClientNTMultiData();
|
||||
|
||||
/**
|
||||
/**
|
||||
* @brief Get the number of channels.
|
||||
* @return The number of channels.
|
||||
*/
|
||||
size_t getNumber();
|
||||
|
||||
/**
|
||||
* @brief Set the timeStamp base for computing deltaTimes.
|
||||
*/
|
||||
void startDeltaTime();
|
||||
/**
|
||||
* @brief Update NTMultiChannel fields.
|
||||
*
|
||||
* @param valueOnly use only value for union.
|
||||
*/
|
||||
void endDeltaTime(bool valueOnly = true);
|
||||
/**
|
||||
/**
|
||||
* @brief Get the time when the last get was made.
|
||||
* @return The timeStamp.
|
||||
*/
|
||||
@ -570,13 +501,21 @@ public:
|
||||
* @return The value.
|
||||
*/
|
||||
epics::nt::NTMultiChannelPtr getNTMultiChannel();
|
||||
/** @brief Get the shared pointer to self.
|
||||
* @return The shared pointer.
|
||||
/**
|
||||
* @brief Get channel change flags.
|
||||
* @return Array of boolean fields that are set to true if corresponding channel changed
|
||||
*/
|
||||
PvaClientNTMultiDataPtr getPtrSelf()
|
||||
{
|
||||
return shared_from_this();
|
||||
}
|
||||
epics::pvData::shared_vector<epics::pvData::boolean> getChannelChangeFlags();
|
||||
protected:
|
||||
static PvaClientNTMultiDataPtr create(
|
||||
epics::pvData::UnionConstPtr const & u,
|
||||
PvaClientMultiChannelPtr const &pvaClientMultiChannel,
|
||||
PvaClientChannelArray const &pvaClientChannelArray,
|
||||
epics::pvData::PVStructurePtr const & pvRequest);
|
||||
void startDeltaTime();
|
||||
void endDeltaTime(bool valueOnly = true);
|
||||
friend class PvaClientNTMultiGet;
|
||||
friend class PvaClientNTMultiMonitor;
|
||||
private:
|
||||
PvaClientNTMultiData(
|
||||
epics::pvData::UnionConstPtr const & u,
|
||||
@ -594,7 +533,8 @@ private:
|
||||
std::vector<epics::pvData::PVStructurePtr> topPVStructure;
|
||||
bool gotAlarm;
|
||||
bool gotTimeStamp;
|
||||
|
||||
|
||||
epics::pvData::shared_vector<epics::pvData::boolean> changeFlags;
|
||||
epics::pvData::StructureConstPtr ntMultiChannelStructure;
|
||||
epics::pvData::shared_vector<epics::pvData::PVUnionPtr> unionValue;
|
||||
epics::pvData::shared_vector<epics::pvData::int32> severity;
|
||||
@ -606,9 +546,6 @@ private:
|
||||
epics::pvData::Alarm alarm;
|
||||
epics::pvData::TimeStamp timeStamp;;
|
||||
epics::pvData::PVTimeStamp pvTimeStamp;
|
||||
friend class PvaClientNTMultiGet;
|
||||
friend class PvaClientNTMultiPut;
|
||||
friend class PvaClientNTMultiMonitor;
|
||||
};
|
||||
|
||||
|
||||
|
@ -319,13 +319,6 @@ Status PvaClientChannel::waitConnect(double timeout)
|
||||
return Status(Status::STATUSTYPE_ERROR," not connected");
|
||||
}
|
||||
|
||||
|
||||
PvaClientFieldPtr PvaClientChannel::createField(string const & subField)
|
||||
{
|
||||
if(connectState!=connected) connect(5.0);
|
||||
throw std::runtime_error("PvaClientChannel::createField not implemented");
|
||||
}
|
||||
|
||||
PvaClientProcessPtr PvaClientChannel::createProcess(string const & request)
|
||||
{
|
||||
PVStructurePtr pvRequest = createRequest->createRequest(request);
|
||||
@ -493,27 +486,6 @@ PvaClientPutGetPtr PvaClientChannel::createPutGet(PVStructurePtr const & pvReque
|
||||
return PvaClientPutGet::create(yyy,shared_from_this(),pvRequest);
|
||||
}
|
||||
|
||||
|
||||
|
||||
PvaClientArrayPtr PvaClientChannel::createArray(string const & request)
|
||||
{
|
||||
PVStructurePtr pvRequest = createRequest->createRequest(request);
|
||||
if(!pvRequest) {
|
||||
string message = string("channel ") + channelName
|
||||
+ " PvaClientChannel::createArray invalid pvRequest: "
|
||||
+ createRequest->getMessage();
|
||||
throw std::runtime_error(message);
|
||||
}
|
||||
return createArray(pvRequest);
|
||||
}
|
||||
|
||||
PvaClientArrayPtr PvaClientChannel::createArray(PVStructurePtr const & pvRequest)
|
||||
{
|
||||
if(connectState!=connected) connect(5.0);
|
||||
throw std::runtime_error("PvaClientChannel::createArray not implemented");
|
||||
}
|
||||
|
||||
|
||||
PvaClientMonitorPtr PvaClientChannel::monitor(string const & request)
|
||||
{
|
||||
PvaClientMonitorPtr pvaClientMonitor = createMonitor(request);
|
||||
|
@ -405,20 +405,20 @@ void PvaClientData::streamJSON(
|
||||
}
|
||||
|
||||
|
||||
void PvaClientData::zeroArrayLength(const epics::pvData::PVStructurePtr &pvStructure)
|
||||
void PvaClientData::zeroArrayLength(const PVStructurePtr &pvStructure)
|
||||
{
|
||||
const PVFieldPtrArray pvFields(pvStructure->getPVFields());
|
||||
for(size_t i=0; i<pvFields.size(); ++i) {
|
||||
PVFieldPtr pvField = pvFields[i];
|
||||
Type type(pvField->getField()->getType());
|
||||
switch(type) {
|
||||
case epics::pvData::scalarArray:
|
||||
case scalarArray:
|
||||
{
|
||||
PVScalarArrayPtr pvScalarArray = static_pointer_cast<PVScalarArray>(pvField);
|
||||
pvScalarArray->setLength(0);
|
||||
}
|
||||
break;
|
||||
case epics::pvData::structureArray:
|
||||
case structureArray:
|
||||
{
|
||||
PVStructureArrayPtr pvStructureArray = static_pointer_cast<PVStructureArray>(pvField);
|
||||
pvStructureArray->setLength(0);
|
||||
|
@ -42,7 +42,7 @@ public:
|
||||
return clientGet->getRequesterName();
|
||||
}
|
||||
|
||||
virtual void message(std::string const & message, epics::pvData::MessageType messageType) {
|
||||
virtual void message(std::string const & message, MessageType messageType) {
|
||||
PvaClientGetPtr clientGet(pvaClientGet.lock());
|
||||
if(!clientGet) return;
|
||||
clientGet->message(message,messageType);
|
||||
@ -172,7 +172,8 @@ void PvaClientGet::channelGetConnect(
|
||||
stringstream ss;
|
||||
ss << pvRequest;
|
||||
string message = string("\nPvaClientGet::channelGetConnect)")
|
||||
+ "\npvRequest\n" + ss.str()
|
||||
+ "\nchannelName=" + pvaClientChannel->getChannel()->getChannelName()
|
||||
+ "\npvRequest=" + ss.str()
|
||||
+ "\nerror\n" + status.getMessage();
|
||||
channelGetConnectStatus = Status(Status::STATUSTYPE_ERROR,message);
|
||||
}
|
||||
|
@ -44,7 +44,7 @@ public:
|
||||
return clientMonitor->getRequesterName();
|
||||
}
|
||||
|
||||
virtual void message(std::string const & message, epics::pvData::MessageType messageType) {
|
||||
virtual void message(std::string const & message, MessageType messageType) {
|
||||
PvaClientMonitorPtr clientMonitor(pvaClientMonitor.lock());
|
||||
if(!clientMonitor) return;
|
||||
clientMonitor->message(message,messageType);
|
||||
@ -60,14 +60,14 @@ public:
|
||||
clientMonitor->monitorConnect(status,monitor,structure);
|
||||
}
|
||||
|
||||
virtual void unlisten(epics::pvData::MonitorPtr const & monitor)
|
||||
virtual void unlisten(MonitorPtr const & monitor)
|
||||
{
|
||||
PvaClientMonitorPtr clientMonitor(pvaClientMonitor.lock());
|
||||
if(!clientMonitor) return;
|
||||
clientMonitor->unlisten(monitor);
|
||||
}
|
||||
|
||||
virtual void monitorEvent(epics::pvData::MonitorPtr const & monitor)
|
||||
virtual void monitorEvent(MonitorPtr const & monitor)
|
||||
{
|
||||
PvaClientMonitorPtr clientMonitor(pvaClientMonitor.lock());
|
||||
if(!clientMonitor) return;
|
||||
@ -231,9 +231,11 @@ void PvaClientMonitor::monitorConnect(
|
||||
stringstream ss;
|
||||
ss << pvRequest;
|
||||
string message = string("\nPvaClientMonitor::monitorConnect)")
|
||||
+ "\nchannelName=" + pvaClientChannel->getChannel()->getChannelName()
|
||||
+ "\npvRequest\n" + ss.str()
|
||||
+ "\nerror\n" + status.getMessage();
|
||||
monitorConnectStatus = Status(Status::STATUSTYPE_ERROR,message);
|
||||
waitForConnect.signal();
|
||||
return;
|
||||
}
|
||||
}
|
||||
@ -438,7 +440,7 @@ bool PvaClientMonitor::poll()
|
||||
if(!monitorElement) return false;
|
||||
userPoll = true;
|
||||
pvaClientData->setData(monitorElement);
|
||||
return true;
|
||||
return true;
|
||||
}
|
||||
|
||||
bool PvaClientMonitor::waitEvent(double secondsToWait)
|
||||
|
@ -28,7 +28,7 @@ static CreateRequest::shared_pointer createRequestPvt = CreateRequest::create()
|
||||
|
||||
PvaClientMultiChannelPtr PvaClientMultiChannel::create(
|
||||
PvaClientPtr const &pvaClient,
|
||||
epics::pvData::shared_vector<const string> const & channelNames,
|
||||
shared_vector<const string> const & channelNames,
|
||||
string const & providerName,
|
||||
size_t maxNotConnected)
|
||||
{
|
||||
@ -39,17 +39,18 @@ PvaClientMultiChannelPtr PvaClientMultiChannel::create(
|
||||
|
||||
PvaClientMultiChannel::PvaClientMultiChannel(
|
||||
PvaClientPtr const &pvaClient,
|
||||
epics::pvData::shared_vector<const string> const & channelName,
|
||||
shared_vector<const string> const & channelNames,
|
||||
string const & providerName,
|
||||
size_t maxNotConnected)
|
||||
: pvaClient(pvaClient),
|
||||
channelName(channelName),
|
||||
channelNames(channelNames),
|
||||
providerName(providerName),
|
||||
maxNotConnected(maxNotConnected),
|
||||
numChannel(channelName.size()),
|
||||
numChannel(channelNames.size()),
|
||||
numConnected(0),
|
||||
firstConnect(true),
|
||||
pvaClientChannelArray(PvaClientChannelArray(numChannel,PvaClientChannelPtr())),
|
||||
isConnected(shared_vector<epics::pvData::boolean>(numChannel,false)),
|
||||
isConnected(shared_vector<boolean>(numChannel,false)),
|
||||
createRequest(CreateRequest::create())
|
||||
{
|
||||
if(PvaClient::getDebug()) cout<< "PvaClientMultiChannel::PvaClientMultiChannel()\n";
|
||||
@ -62,18 +63,23 @@ PvaClientMultiChannel::~PvaClientMultiChannel()
|
||||
|
||||
void PvaClientMultiChannel::checkConnected()
|
||||
{
|
||||
if(numConnected==0) connect();
|
||||
if(firstConnect) {
|
||||
connect();
|
||||
firstConnect = false;
|
||||
}
|
||||
}
|
||||
|
||||
epics::pvData::shared_vector<const string> PvaClientMultiChannel::getChannelNames()
|
||||
shared_vector<const string> PvaClientMultiChannel::getChannelNames()
|
||||
{
|
||||
return channelName;
|
||||
return channelNames;
|
||||
}
|
||||
|
||||
Status PvaClientMultiChannel::connect(double timeout)
|
||||
{
|
||||
if(!firstConnect) return Status::Ok;
|
||||
firstConnect = false;
|
||||
for(size_t i=0; i< numChannel; ++i) {
|
||||
pvaClientChannelArray[i] = pvaClient->createChannel(channelName[i],providerName);
|
||||
pvaClientChannelArray[i] = pvaClient->createChannel(channelNames[i],providerName);
|
||||
pvaClientChannelArray[i]->issueConnect();
|
||||
}
|
||||
Status returnStatus = Status::Ok;
|
||||
@ -88,11 +94,10 @@ Status PvaClientMultiChannel::connect(double timeout)
|
||||
if(status.isOK()) {
|
||||
++numConnected;
|
||||
isConnected[i] = true;
|
||||
continue;
|
||||
} else {
|
||||
if(returnStatus.isOK()) returnStatus = status;
|
||||
++numBad;
|
||||
}
|
||||
if(returnStatus.isOK()) returnStatus = status;
|
||||
++numBad;
|
||||
if(numBad>maxNotConnected) break;
|
||||
}
|
||||
return numBad>maxNotConnected ? returnStatus : Status::Ok;
|
||||
}
|
||||
@ -115,7 +120,7 @@ bool PvaClientMultiChannel::connectionChange()
|
||||
return false;
|
||||
}
|
||||
|
||||
epics::pvData::shared_vector<epics::pvData::boolean> PvaClientMultiChannel::getIsConnected()
|
||||
shared_vector<boolean> PvaClientMultiChannel::getIsConnected()
|
||||
{
|
||||
for(size_t i=0; i<numChannel; ++i) {
|
||||
PvaClientChannelPtr pvaClientChannel = pvaClientChannelArray[i];
|
||||
@ -144,6 +149,7 @@ PvaClientPtr PvaClientMultiChannel::getPvaClient()
|
||||
|
||||
PvaClientMultiGetDoublePtr PvaClientMultiChannel::createGet()
|
||||
{
|
||||
cout << "PvaClientMultiChannel::createGet\n";
|
||||
checkConnected();
|
||||
return PvaClientMultiGetDouble::create(shared_from_this(),pvaClientChannelArray);
|
||||
}
|
||||
@ -151,6 +157,7 @@ PvaClientMultiGetDoublePtr PvaClientMultiChannel::createGet()
|
||||
|
||||
PvaClientMultiPutDoublePtr PvaClientMultiChannel::createPut()
|
||||
{
|
||||
cout << "PvaClientMultiChannel::createPut\n";
|
||||
checkConnected();
|
||||
return PvaClientMultiPutDouble::create(shared_from_this(),pvaClientChannelArray);
|
||||
}
|
||||
@ -158,6 +165,7 @@ PvaClientMultiPutDoublePtr PvaClientMultiChannel::createPut()
|
||||
|
||||
PvaClientMultiMonitorDoublePtr PvaClientMultiChannel::createMonitor()
|
||||
{
|
||||
cout << "PvaClientMultiChannel::createMonitor\n";
|
||||
checkConnected();
|
||||
return PvaClientMultiMonitorDouble::create(shared_from_this(), pvaClientChannelArray);
|
||||
}
|
||||
|
@ -39,7 +39,7 @@ PvaClientMultiGetDouble::PvaClientMultiGetDouble(
|
||||
: pvaClientMultiChannel(pvaClientMultiChannel),
|
||||
pvaClientChannelArray(pvaClientChannelArray),
|
||||
nchannel(pvaClientChannelArray.size()),
|
||||
doubleValue(shared_vector<double>(nchannel)),
|
||||
doubleValue( shared_vector<double>(nchannel)),
|
||||
pvaClientGet(std::vector<PvaClientGetPtr>(nchannel,PvaClientGetPtr())),
|
||||
isGetConnected(false)
|
||||
{
|
||||
@ -53,7 +53,7 @@ PvaClientMultiGetDouble::~PvaClientMultiGetDouble()
|
||||
|
||||
void PvaClientMultiGetDouble::connect()
|
||||
{
|
||||
shared_vector<epics::pvData::boolean> isConnected = pvaClientMultiChannel->getIsConnected();
|
||||
shared_vector<boolean>isConnected = pvaClientMultiChannel->getIsConnected();
|
||||
string request = "value";
|
||||
for(size_t i=0; i<nchannel; ++i)
|
||||
{
|
||||
@ -75,14 +75,14 @@ void PvaClientMultiGetDouble::connect()
|
||||
isGetConnected = true;
|
||||
}
|
||||
|
||||
epics::pvData::shared_vector<double> PvaClientMultiGetDouble::get()
|
||||
shared_vector<double> PvaClientMultiGetDouble::get()
|
||||
{
|
||||
if(!isGetConnected) connect();
|
||||
shared_vector<epics::pvData::boolean> isConnected = pvaClientMultiChannel->getIsConnected();
|
||||
|
||||
shared_vector<boolean> isConnected = pvaClientMultiChannel->getIsConnected();
|
||||
for(size_t i=0; i<nchannel; ++i)
|
||||
{
|
||||
if(isConnected[i]) {
|
||||
if(!pvaClientGet[i]) pvaClientGet[i]=pvaClientChannelArray[i]->createGet("value");
|
||||
pvaClientGet[i]->issueGet();
|
||||
}
|
||||
}
|
||||
@ -96,13 +96,22 @@ epics::pvData::shared_vector<double> PvaClientMultiGetDouble::get()
|
||||
throw std::runtime_error(message);
|
||||
}
|
||||
}
|
||||
|
||||
for(size_t i=0; i<nchannel; ++i)
|
||||
{
|
||||
if(isConnected[i])
|
||||
{
|
||||
PVStructurePtr pvStructure = pvaClientGet[i]->getData()->getPVStructure();
|
||||
doubleValue[i] = getConvert()->toDouble(pvStructure->getSubField<PVScalar>("value"));
|
||||
PVScalarPtr pvScalar(pvStructure->getSubField<PVScalar>("value"));
|
||||
if(pvScalar) {
|
||||
ScalarType scalarType = pvScalar->getScalar()->getScalarType();
|
||||
if(ScalarTypeFunc::isNumeric(scalarType)) {
|
||||
doubleValue[i] = getConvert()->toDouble(pvScalar);
|
||||
} else {
|
||||
doubleValue[i] = epicsNAN;
|
||||
}
|
||||
} else {
|
||||
doubleValue[i] = epicsNAN;
|
||||
}
|
||||
} else {
|
||||
doubleValue[i] = epicsNAN;
|
||||
}
|
||||
|
@ -53,7 +53,7 @@ PvaClientMultiMonitorDouble::~PvaClientMultiMonitorDouble()
|
||||
|
||||
void PvaClientMultiMonitorDouble::connect()
|
||||
{
|
||||
shared_vector<epics::pvData::boolean> isConnected = pvaClientMultiChannel->getIsConnected();
|
||||
shared_vector<boolean> isConnected = pvaClientMultiChannel->getIsConnected();
|
||||
string request = "value";
|
||||
for(size_t i=0; i<nchannel; ++i)
|
||||
{
|
||||
@ -86,10 +86,21 @@ bool PvaClientMultiMonitorDouble::poll()
|
||||
epicsThreadSleep(.1);
|
||||
}
|
||||
bool result = false;
|
||||
shared_vector<epics::pvData::boolean> isConnected = pvaClientMultiChannel->getIsConnected();
|
||||
shared_vector<boolean> isConnected = pvaClientMultiChannel->getIsConnected();
|
||||
for(size_t i=0; i<nchannel; ++i)
|
||||
{
|
||||
if(isConnected[i]) {
|
||||
if(!pvaClientMonitor[i]){
|
||||
pvaClientMonitor[i] = pvaClientChannelArray[i]->createMonitor("value");
|
||||
pvaClientMonitor[i]->issueConnect();
|
||||
Status status = pvaClientMonitor[i]->waitConnect();
|
||||
if(!status.isOK()) {
|
||||
string message = string("channel ") + pvaClientChannelArray[i]->getChannelName()
|
||||
+ " PvaChannelMonitor::waitConnect " + status.getMessage();
|
||||
throw std::runtime_error(message);
|
||||
}
|
||||
pvaClientMonitor[i]->start();
|
||||
}
|
||||
if(pvaClientMonitor[i]->poll()) {
|
||||
doubleValue[i] = pvaClientMonitor[i]->getData()->getDouble();
|
||||
pvaClientMonitor[i]->releaseEvent();
|
||||
@ -116,7 +127,7 @@ bool PvaClientMultiMonitorDouble::waitEvent(double waitForEvent)
|
||||
return false;
|
||||
}
|
||||
|
||||
epics::pvData::shared_vector<double> PvaClientMultiMonitorDouble::get()
|
||||
shared_vector<double> PvaClientMultiMonitorDouble::get()
|
||||
{
|
||||
return doubleValue;
|
||||
}
|
||||
|
@ -55,7 +55,7 @@ PvaClientMultiPutDouble::~PvaClientMultiPutDouble()
|
||||
|
||||
void PvaClientMultiPutDouble::connect()
|
||||
{
|
||||
shared_vector<epics::pvData::boolean> isConnected = pvaClientMultiChannel->getIsConnected();
|
||||
shared_vector<boolean> isConnected = pvaClientMultiChannel->getIsConnected();
|
||||
for(size_t i=0; i<nchannel; ++i)
|
||||
{
|
||||
if(isConnected[i]) {
|
||||
@ -76,20 +76,28 @@ void PvaClientMultiPutDouble::connect()
|
||||
isPutConnected = true;
|
||||
}
|
||||
|
||||
void PvaClientMultiPutDouble::put(epics::pvData::shared_vector<double> const &data)
|
||||
void PvaClientMultiPutDouble::put(shared_vector<double> const &data)
|
||||
{
|
||||
if(!isPutConnected) connect();
|
||||
if(data.size()!=nchannel) {
|
||||
throw std::runtime_error("data has wrong size");
|
||||
}
|
||||
shared_vector<epics::pvData::boolean> isConnected = pvaClientMultiChannel->getIsConnected();
|
||||
shared_vector<boolean> isConnected = pvaClientMultiChannel->getIsConnected();
|
||||
for(size_t i=0; i<nchannel; ++i)
|
||||
{
|
||||
if(isConnected[i]) {
|
||||
if(!pvaClientPut[i]) pvaClientPut[i]=pvaClientChannelArray[i]->createPut("value");
|
||||
PVStructurePtr pvTop = pvaClientPut[i]->getData()->getPVStructure();
|
||||
PVScalarPtr pvValue = pvTop->getSubField<PVScalar>("value");
|
||||
getConvert()->fromDouble(pvValue,data[i]);
|
||||
pvaClientPut[i]->issuePut();
|
||||
PVScalarPtr pvScalar= pvTop->getSubField<PVScalar>("value");
|
||||
if(pvScalar && ScalarTypeFunc::isNumeric(pvScalar->getScalar()->getScalarType())) {
|
||||
getConvert()->fromDouble(pvScalar,data[i]);
|
||||
pvaClientPut[i]->issuePut();
|
||||
} else {
|
||||
string message = string("channel ")
|
||||
+ pvaClientChannelArray[i]->getChannelName()
|
||||
+ " is not a numeric scalar";
|
||||
throw std::runtime_error(message);
|
||||
}
|
||||
}
|
||||
if(isConnected[i]) {
|
||||
Status status = pvaClientPut[i]->waitPut();
|
||||
|
@ -23,7 +23,7 @@ using namespace std;
|
||||
namespace epics { namespace pvaClient {
|
||||
|
||||
PvaClientNTMultiDataPtr PvaClientNTMultiData::create(
|
||||
epics::pvData::UnionConstPtr const & u,
|
||||
UnionConstPtr const & u,
|
||||
PvaClientMultiChannelPtr const &pvaMultiChannel,
|
||||
PvaClientChannelArray const &pvaClientChannelArray,
|
||||
PVStructurePtr const & pvRequest)
|
||||
@ -33,18 +33,21 @@ PvaClientNTMultiDataPtr PvaClientNTMultiData::create(
|
||||
}
|
||||
|
||||
PvaClientNTMultiData::PvaClientNTMultiData(
|
||||
epics::pvData::UnionConstPtr const & u,
|
||||
UnionConstPtr const & u,
|
||||
PvaClientMultiChannelPtr const &pvaClientMultiChannel,
|
||||
PvaClientChannelArray const &pvaClientChannelArray,
|
||||
epics::pvData::PVStructurePtr const & pvRequest)
|
||||
PVStructurePtr const & pvRequest)
|
||||
: pvaClientMultiChannel(pvaClientMultiChannel),
|
||||
pvaClientChannelArray(pvaClientChannelArray),
|
||||
nchannel(pvaClientChannelArray.size()),
|
||||
gotAlarm(false),
|
||||
gotTimeStamp(false)
|
||||
|
||||
{
|
||||
if(PvaClient::getDebug()) cout<< "PvaClientNTMultiData::PvaClientNTMultiData()\n";
|
||||
changeFlags = shared_vector<boolean>(nchannel);
|
||||
topPVStructure.resize(nchannel);
|
||||
|
||||
unionValue.resize(nchannel);
|
||||
PVDataCreatePtr pvDataCreate = getPVDataCreate();
|
||||
for(size_t i=0; i< nchannel; ++i) {
|
||||
@ -90,12 +93,18 @@ void PvaClientNTMultiData::setPVStructure(
|
||||
topPVStructure[index] = pvStructure;
|
||||
}
|
||||
|
||||
shared_vector<boolean> PvaClientNTMultiData::getChannelChangeFlags()
|
||||
{
|
||||
return changeFlags;
|
||||
}
|
||||
|
||||
size_t PvaClientNTMultiData::getNumber()
|
||||
{
|
||||
return nchannel;
|
||||
}
|
||||
|
||||
|
||||
|
||||
void PvaClientNTMultiData::startDeltaTime()
|
||||
{
|
||||
for(size_t i=0; i<nchannel; ++i)
|
||||
@ -126,9 +135,9 @@ void PvaClientNTMultiData::endDeltaTime(bool valueOnly)
|
||||
for(size_t i=0; i<nchannel; ++i)
|
||||
{
|
||||
PVStructurePtr pvst = topPVStructure[i];
|
||||
if(!pvst) {
|
||||
unionValue[i] = PVUnionPtr();
|
||||
} else if(unionValue[i]) {
|
||||
changeFlags[i] = false;
|
||||
if(pvst&&unionValue[i]) {
|
||||
changeFlags[i] = true;
|
||||
if(valueOnly) {
|
||||
PVFieldPtr pvValue = pvst->getSubField("value");
|
||||
if(pvValue) {
|
||||
@ -180,11 +189,11 @@ NTMultiChannelPtr PvaClientNTMultiData::getNTMultiChannel()
|
||||
PVStructurePtr pvStructure = getPVDataCreate()->createPVStructure(ntMultiChannelStructure);
|
||||
NTMultiChannelPtr ntMultiChannel = NTMultiChannel::wrap(pvStructure);
|
||||
ntMultiChannel->getChannelName()->replace(pvaClientMultiChannel->getChannelNames());
|
||||
shared_vector<epics::pvData::PVUnionPtr> val(nchannel);
|
||||
shared_vector<PVUnionPtr> val(nchannel);
|
||||
for(size_t i=0; i<nchannel; ++i) val[i] = unionValue[i];
|
||||
ntMultiChannel->getValue()->replace(freeze(val));
|
||||
shared_vector<epics::pvData::boolean> connected = pvaClientMultiChannel->getIsConnected();
|
||||
shared_vector<epics::pvData::boolean> isConnected(nchannel);
|
||||
shared_vector<boolean> connected = pvaClientMultiChannel->getIsConnected();
|
||||
shared_vector<boolean> isConnected(nchannel);
|
||||
for(size_t i=0; i<nchannel; ++i) isConnected[i] = connected[i];
|
||||
ntMultiChannel->getIsConnected()->replace(freeze(isConnected));
|
||||
if(gotAlarm)
|
||||
|
@ -38,7 +38,7 @@ PvaClientNTMultiGet::PvaClientNTMultiGet(
|
||||
UnionConstPtr const & u,
|
||||
PvaClientMultiChannelPtr const &pvaClientMultiChannel,
|
||||
PvaClientChannelArray const &pvaClientChannelArray,
|
||||
epics::pvData::PVStructurePtr const & pvRequest)
|
||||
PVStructurePtr const & pvRequest)
|
||||
: pvaClientMultiChannel(pvaClientMultiChannel),
|
||||
pvaClientChannelArray(pvaClientChannelArray),
|
||||
pvRequest(pvRequest),
|
||||
@ -62,7 +62,7 @@ PvaClientNTMultiGet::~PvaClientNTMultiGet()
|
||||
void PvaClientNTMultiGet::connect()
|
||||
{
|
||||
pvaClientGet.resize(nchannel);
|
||||
shared_vector<epics::pvData::boolean> isConnected = pvaClientMultiChannel->getIsConnected();
|
||||
shared_vector<boolean> isConnected = pvaClientMultiChannel->getIsConnected();
|
||||
for(size_t i=0; i<nchannel; ++i)
|
||||
{
|
||||
if(isConnected[i]) {
|
||||
@ -86,11 +86,15 @@ void PvaClientNTMultiGet::connect()
|
||||
void PvaClientNTMultiGet::get(bool valueOnly)
|
||||
{
|
||||
if(!isConnected) connect();
|
||||
shared_vector<epics::pvData::boolean> isConnected = pvaClientMultiChannel->getIsConnected();
|
||||
shared_vector<boolean> isConnected = pvaClientMultiChannel->getIsConnected();
|
||||
|
||||
for(size_t i=0; i<nchannel; ++i)
|
||||
{
|
||||
if(isConnected[i]) {
|
||||
if(!pvaClientGet[i]){
|
||||
pvaClientGet[i]=pvaClientChannelArray[i]->createGet(pvRequest);
|
||||
pvaClientGet[i]->connect();
|
||||
}
|
||||
pvaClientGet[i]->issueGet();
|
||||
}
|
||||
}
|
||||
|
@ -28,7 +28,7 @@ namespace epics { namespace pvaClient {
|
||||
PvaClientNTMultiMonitorPtr PvaClientNTMultiMonitor::create(
|
||||
PvaClientMultiChannelPtr const &pvaMultiChannel,
|
||||
PvaClientChannelArray const &pvaClientChannelArray,
|
||||
epics::pvData::PVStructurePtr const & pvRequest)
|
||||
PVStructurePtr const & pvRequest)
|
||||
{
|
||||
UnionConstPtr u = getFieldCreate()->createVariantUnion();
|
||||
PvaClientNTMultiMonitorPtr pvaClientNTMultiMonitor(
|
||||
@ -66,7 +66,7 @@ PvaClientNTMultiMonitor::~PvaClientNTMultiMonitor()
|
||||
void PvaClientNTMultiMonitor::connect()
|
||||
{
|
||||
pvaClientMonitor.resize(nchannel);
|
||||
shared_vector<epics::pvData::boolean> isConnected = pvaClientMultiChannel->getIsConnected();
|
||||
shared_vector<boolean> isConnected = pvaClientMultiChannel->getIsConnected();
|
||||
for(size_t i=0; i<nchannel; ++i)
|
||||
{
|
||||
if(isConnected[i]) {
|
||||
@ -95,20 +95,25 @@ bool PvaClientNTMultiMonitor::poll(bool valueOnly)
|
||||
{
|
||||
if(!isConnected) connect();
|
||||
bool result = false;
|
||||
shared_vector<epics::pvData::boolean> isConnected = pvaClientMultiChannel->getIsConnected();
|
||||
pvaClientNTMultiData->startDeltaTime();
|
||||
shared_vector<boolean> isConnected = pvaClientMultiChannel->getIsConnected();
|
||||
pvaClientNTMultiData->startDeltaTime();
|
||||
for(size_t i=0; i<nchannel; ++i)
|
||||
{
|
||||
if(isConnected[i]) {
|
||||
if(pvaClientMonitor[i]->poll()) {
|
||||
if(!pvaClientMonitor[i]){
|
||||
pvaClientMonitor[i]=pvaClientChannelArray[i]->createMonitor(pvRequest);
|
||||
pvaClientMonitor[i]->connect();
|
||||
pvaClientMonitor[i]->start();
|
||||
}
|
||||
if(pvaClientMonitor[i]->poll()) {
|
||||
pvaClientNTMultiData->setPVStructure(
|
||||
pvaClientMonitor[i]->getData()->getPVStructure(),i);
|
||||
pvaClientMonitor[i]->getData()->getPVStructure(),i);
|
||||
pvaClientMonitor[i]->releaseEvent();
|
||||
result = true;
|
||||
}
|
||||
}
|
||||
}
|
||||
if(result) pvaClientNTMultiData->endDeltaTime(valueOnly);
|
||||
}
|
||||
if(result) pvaClientNTMultiData->endDeltaTime(valueOnly);
|
||||
return result;
|
||||
}
|
||||
|
||||
|
@ -38,8 +38,8 @@ PvaClientNTMultiPut::PvaClientNTMultiPut(
|
||||
: pvaClientMultiChannel(pvaClientMultiChannel),
|
||||
pvaClientChannelArray(pvaClientChannelArray),
|
||||
nchannel(pvaClientChannelArray.size()),
|
||||
unionValue(shared_vector<epics::pvData::PVUnionPtr>(nchannel,PVUnionPtr())),
|
||||
value(shared_vector<epics::pvData::PVFieldPtr>(nchannel,PVFieldPtr())),
|
||||
unionValue(shared_vector<PVUnionPtr>(nchannel,PVUnionPtr())),
|
||||
value(shared_vector<PVFieldPtr>(nchannel,PVFieldPtr())),
|
||||
isConnected(false)
|
||||
{
|
||||
if(PvaClient::getDebug()) cout<< "PvaClientNTMultiPut::PvaClientNTMultiPut()\n";
|
||||
@ -54,7 +54,7 @@ PvaClientNTMultiPut::~PvaClientNTMultiPut()
|
||||
void PvaClientNTMultiPut::connect()
|
||||
{
|
||||
pvaClientPut.resize(nchannel);
|
||||
shared_vector<epics::pvData::boolean> isConnected = pvaClientMultiChannel->getIsConnected();
|
||||
shared_vector<boolean> isConnected = pvaClientMultiChannel->getIsConnected();
|
||||
for(size_t i=0; i<nchannel; ++i)
|
||||
{
|
||||
if(isConnected[i]) {
|
||||
@ -102,19 +102,47 @@ void PvaClientNTMultiPut::connect()
|
||||
this->isConnected = true;
|
||||
}
|
||||
|
||||
shared_vector<epics::pvData::PVUnionPtr> PvaClientNTMultiPut::getValues()
|
||||
shared_vector<PVUnionPtr> PvaClientNTMultiPut::getValues()
|
||||
{
|
||||
if(!isConnected) connect();
|
||||
shared_vector<boolean> isConnected = pvaClientMultiChannel->getIsConnected();
|
||||
for(size_t i=0; i<nchannel; ++i)
|
||||
{
|
||||
if(isConnected[i]) {
|
||||
if(!pvaClientPut[i]){
|
||||
pvaClientPut[i] = pvaClientChannelArray[i]->createPut();
|
||||
pvaClientPut[i]->connect();
|
||||
pvaClientPut[i]->get();
|
||||
value[i] = pvaClientPut[i]->getData()->getValue();
|
||||
FieldCreatePtr fieldCreate = getFieldCreate();
|
||||
PVDataCreatePtr pvDataCreate = getPVDataCreate();
|
||||
FieldBuilderPtr builder = fieldCreate->createFieldBuilder();
|
||||
builder->add("value",value[i]->getField());
|
||||
unionValue[i] = pvDataCreate->createPVUnion(builder->createUnion());
|
||||
}
|
||||
}
|
||||
}
|
||||
return unionValue;
|
||||
}
|
||||
|
||||
void PvaClientNTMultiPut::put()
|
||||
{
|
||||
if(!isConnected) connect();
|
||||
shared_vector<epics::pvData::boolean> isConnected = pvaClientMultiChannel->getIsConnected();
|
||||
shared_vector<boolean> isConnected = pvaClientMultiChannel->getIsConnected();
|
||||
for(size_t i=0; i<nchannel; ++i)
|
||||
{
|
||||
if(isConnected[i]) {
|
||||
if(!pvaClientPut[i]){
|
||||
pvaClientPut[i] = pvaClientChannelArray[i]->createPut();
|
||||
pvaClientPut[i]->connect();
|
||||
pvaClientPut[i]->get();
|
||||
value[i] = pvaClientPut[i]->getData()->getValue();
|
||||
FieldCreatePtr fieldCreate = getFieldCreate();
|
||||
PVDataCreatePtr pvDataCreate = getPVDataCreate();
|
||||
FieldBuilderPtr builder = fieldCreate->createFieldBuilder();
|
||||
builder->add("value",value[i]->getField());
|
||||
unionValue[i] = pvDataCreate->createPVUnion(builder->createUnion());
|
||||
}
|
||||
value[i]->copy(*unionValue[i]->get());
|
||||
pvaClientPut[i]->issuePut();
|
||||
}
|
||||
|
@ -42,7 +42,7 @@ public:
|
||||
return clientProcess->getRequesterName();
|
||||
}
|
||||
|
||||
virtual void message(std::string const & message, epics::pvData::MessageType messageType) {
|
||||
virtual void message(std::string const & message, MessageType messageType) {
|
||||
PvaClientProcessPtr clientProcess(pvaClientProcess.lock());
|
||||
if(!clientProcess) return;
|
||||
clientProcess->message(message,messageType);
|
||||
|
@ -42,7 +42,7 @@ public:
|
||||
return clientPut->getRequesterName();
|
||||
}
|
||||
|
||||
virtual void message(std::string const & message, epics::pvData::MessageType messageType) {
|
||||
virtual void message(std::string const & message, MessageType messageType) {
|
||||
PvaClientPutPtr clientPut(pvaClientPut.lock());
|
||||
if(!clientPut) return;
|
||||
clientPut->message(message,messageType);
|
||||
@ -173,6 +173,7 @@ void PvaClientPut::channelPutConnect(
|
||||
stringstream ss;
|
||||
ss << pvRequest;
|
||||
string message = string("\nPvaClientPut::channelPutConnect)")
|
||||
+ "\nchannelName=" + pvaClientChannel->getChannel()->getChannelName()
|
||||
+ "\npvRequest\n" + ss.str()
|
||||
+ "\nerror\n" + status.getMessage();
|
||||
channelPutConnectStatus = Status(Status::STATUSTYPE_ERROR,message);
|
||||
|
@ -41,7 +41,7 @@ public:
|
||||
return clientPutGet->getRequesterName();
|
||||
}
|
||||
|
||||
virtual void message(std::string const & message, epics::pvData::MessageType messageType) {
|
||||
virtual void message(std::string const & message, MessageType messageType) {
|
||||
PvaClientPutGetPtr clientPutGet(pvaClientPutGet.lock());
|
||||
if(!clientPutGet) return;
|
||||
clientPutGet->message(message,messageType);
|
||||
@ -189,6 +189,7 @@ void PvaClientPutGet::channelPutGetConnect(
|
||||
stringstream ss;
|
||||
ss << pvRequest;
|
||||
string message = string("\nPvaClientPutGet::channelPutGetConnect)")
|
||||
+ "\nchannelName=" + pvaClientChannel->getChannel()->getChannelName()
|
||||
+ "\npvRequest\n" + ss.str()
|
||||
+ "\nerror\n" + status.getMessage();
|
||||
channelPutGetConnectStatus = Status(Status::STATUSTYPE_ERROR,message);
|
||||
|
@ -45,14 +45,14 @@ public:
|
||||
return clientRPC->getRequesterName();
|
||||
}
|
||||
|
||||
virtual void message(std::string const & message, epics::pvData::MessageType messageType) {
|
||||
virtual void message(std::string const & message, MessageType messageType) {
|
||||
PvaClientRPCPtr clientRPC(pvaClientRPC.lock());
|
||||
if(!clientRPC) return;
|
||||
clientRPC->message(message,messageType);
|
||||
}
|
||||
|
||||
virtual void channelRPCConnect(
|
||||
const epics::pvData::Status& status,
|
||||
const Status& status,
|
||||
ChannelRPC::shared_pointer const & channelRPC)
|
||||
{
|
||||
PvaClientRPCPtr clientRPC(pvaClientRPC.lock());
|
||||
|
Reference in New Issue
Block a user