examples are moved to project exampleCPP; update doc
This commit is contained in:
6
Doxyfile
6
Doxyfile
@ -32,7 +32,7 @@ DOXYFILE_ENCODING = UTF-8
|
|||||||
# title of most generated pages and in a few other places.
|
# title of most generated pages and in a few other places.
|
||||||
# The default value is: My Project.
|
# The default value is: My Project.
|
||||||
|
|
||||||
PROJECT_NAME = easyPVACPP
|
PROJECT_NAME = pvaClientCPP
|
||||||
|
|
||||||
# The PROJECT_NUMBER tag can be used to enter a project or revision number. This
|
# The PROJECT_NUMBER tag can be used to enter a project or revision number. This
|
||||||
# could be handy for archiving the generated documentation or if some version
|
# could be handy for archiving the generated documentation or if some version
|
||||||
@ -169,7 +169,7 @@ SHORT_NAMES = NO
|
|||||||
# description.)
|
# description.)
|
||||||
# The default value is: NO.
|
# The default value is: NO.
|
||||||
|
|
||||||
JAVADOC_AUTOBRIEF = YES
|
JAVADOC_AUTOBRIEF = NO
|
||||||
|
|
||||||
# If the QT_AUTOBRIEF tag is set to YES then doxygen will interpret the first
|
# If the QT_AUTOBRIEF tag is set to YES then doxygen will interpret the first
|
||||||
# line (until the first dot) of a Qt-style comment as the brief description. If
|
# line (until the first dot) of a Qt-style comment as the brief description. If
|
||||||
@ -1078,7 +1078,7 @@ HTML_EXTRA_STYLESHEET =
|
|||||||
# files will be copied as-is; there are no commands or markers available.
|
# files will be copied as-is; there are no commands or markers available.
|
||||||
# This tag requires that the tag GENERATE_HTML is set to YES.
|
# This tag requires that the tag GENERATE_HTML is set to YES.
|
||||||
|
|
||||||
HTML_EXTRA_FILES = documentation/overview.html
|
HTML_EXTRA_FILES =
|
||||||
|
|
||||||
# The HTML_COLORSTYLE_HUE tag controls the color of the HTML output. Doxygen
|
# The HTML_COLORSTYLE_HUE tag controls the color of the HTML output. Doxygen
|
||||||
# will adjust the colors in the stylesheet and background images according to
|
# will adjust the colors in the stylesheet and background images according to
|
||||||
|
18
Makefile
18
Makefile
@ -1,20 +1,10 @@
|
|||||||
#Makefile at top of application tree
|
#Makefile at top of application tree
|
||||||
TOP = .
|
TOP = .
|
||||||
include $(TOP)/configure/CONFIG
|
include $(TOP)/configure/CONFIG
|
||||||
DIRS := $(DIRS) $(filter-out $(DIRS), configure)
|
DIRS += configure
|
||||||
DIRS := $(DIRS) $(filter-out $(DIRS), src)
|
|
||||||
DIRS := $(DIRS) $(filter-out $(DIRS), example)
|
|
||||||
|
|
||||||
EMBEDDED_TOPS := $(EMBEDDED_TOPS) $(filter-out $(EMBEDDED_TOPS), example)
|
DIRS += src
|
||||||
|
src_DEPEND_DIRS = configure
|
||||||
define DIR_template
|
|
||||||
$(1)_DEPEND_DIRS = configure
|
|
||||||
endef
|
|
||||||
$(foreach dir, $(filter-out configure,$(DIRS)),$(eval $(call DIR_template,$(dir))))
|
|
||||||
|
|
||||||
define EMB_template
|
|
||||||
$(1)_DEPEND_DIRS = src
|
|
||||||
endef
|
|
||||||
$(foreach dir, $(EMBEDDED_TOPS),$(eval $(call EMB_template,$(dir))))
|
|
||||||
|
|
||||||
include $(TOP)/configure/RULES_TOP
|
include $(TOP)/configure/RULES_TOP
|
||||||
|
|
||||||
|
@ -21,12 +21,7 @@ for directions for how to build.
|
|||||||
Examples
|
Examples
|
||||||
------------
|
------------
|
||||||
|
|
||||||
The examples require the database in pvaClientTestCPP.
|
Project exampleCPP has examples for pvaClientCPP
|
||||||
For example:
|
|
||||||
|
|
||||||
mrk> pwd
|
|
||||||
/home/epicsv4/pvaClientTestCPP/database/iocBoot/exampleDatabase
|
|
||||||
mrk> ../../bin/linux-x86_64/exampleDatabase st.cmd
|
|
||||||
|
|
||||||
Status
|
Status
|
||||||
------
|
------
|
||||||
|
@ -1,9 +1,8 @@
|
|||||||
|
EPICS4_DIR=/home/epicsv4/master
|
||||||
|
PVACCESS=${EPICS4_DIR}/pvAccessCPP
|
||||||
|
NORMATIVETYPES=${EPICS4_DIR}/normativeTypesCPP
|
||||||
|
PVDATA=${EPICS4_DIR}/pvDataCPP
|
||||||
|
PVCOMMON=${EPICS4_DIR}/pvCommonCPP
|
||||||
|
|
||||||
TEMPLATE_TOP=$(EPICS_BASE)/templates/makeBaseApp/top
|
TEMPLATE_TOP=$(EPICS_BASE)/templates/makeBaseApp/top
|
||||||
|
|
||||||
EPICS_BASE=/home/install/epics/base
|
EPICS_BASE=/home/install/epics/base
|
||||||
V4BASE=/home/epicsv4
|
|
||||||
PVCOMMON=${V4BASE}/pvCommonCPP
|
|
||||||
PVDATA=${V4BASE}/pvDataCPP
|
|
||||||
NORMATIVETYPES=${V4BASE}/normativeTypesCPP
|
|
||||||
PVACCESS=${V4BASE}/pvAccessCPP
|
|
||||||
|
@ -26,25 +26,7 @@
|
|||||||
|
|
||||||
<div class="head">
|
<div class="head">
|
||||||
<h1>EPICS pvaClientCPP</h1>
|
<h1>EPICS pvaClientCPP</h1>
|
||||||
<!-- Maturity: Working Draft or Request for Comments, or Recommendation, and date. -->
|
<h2 class="nocount">Release 4.2 - 2016.01.12</h2>
|
||||||
<h2 class="nocount">EPICS V4 Working Group, Working Draft,
|
|
||||||
02-October-2015</h2>
|
|
||||||
<dl>
|
|
||||||
<dt>This version:</dt>
|
|
||||||
<dd><a
|
|
||||||
href="pvaClientCPP.html">pvaClientCPP.html
|
|
||||||
</a> </dd>
|
|
||||||
<dt>Latest version:</dt>
|
|
||||||
<dd><a
|
|
||||||
href="pvaClientCPP_20151002.html">pvaClientCPP_20151002.html
|
|
||||||
</a> </dd>
|
|
||||||
<dt>Previous version:</dt>
|
|
||||||
<dd><a
|
|
||||||
href="pvaClientCPP_20150803.html">pvaClientCPP_20150803.html
|
|
||||||
</a> </dd>
|
|
||||||
<dt>Editors:</dt>
|
|
||||||
<dd>Marty Kraimer, BNL</dd>
|
|
||||||
</dl>
|
|
||||||
|
|
||||||
<h2 class="nocount">Abstract</h2>
|
<h2 class="nocount">Abstract</h2>
|
||||||
|
|
||||||
@ -78,11 +60,6 @@ The data for the channels is presented via normative type NTMultiChannel.
|
|||||||
Control System</a>.</p>
|
Control System</a>.</p>
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
<h2 class="nocount">Status of this Document and of the pvaClient Software</h2>
|
|
||||||
|
|
||||||
<p>pvaClientCPP is ready for use.</p>
|
|
||||||
|
|
||||||
</div> <!-- head -->
|
</div> <!-- head -->
|
||||||
|
|
||||||
<div id="toc">
|
<div id="toc">
|
||||||
@ -95,92 +72,340 @@ The data for the channels is presented via normative type NTMultiChannel.
|
|||||||
|
|
||||||
<h2>Introduction</h2>
|
<h2>Introduction</h2>
|
||||||
|
|
||||||
<p>pvaClient is a synchronous API for accessing PVData via PVAccess. It provides
|
<p>PvaClient is a synchronous API for accessing PVData via PVAccess.
|
||||||
an interface to many of the features provided by pvData and pvAccess.</p>
|
It also provides a number of convenience methods.
|
||||||
|
It allows the client to request access without checking for failure,
|
||||||
|
but throws an exception if a request fails.
|
||||||
|
A client can also check for failues and thus prevent exceptions.</p>
|
||||||
|
|
||||||
<p>This document describes the layout of the source files in this project.</p>
|
<p>Doxygen documentation is available at <a
|
||||||
<p>
|
href="./html/index.html">doxygenDoc</a></p>
|
||||||
A user overview is available via
|
|
||||||
<a
|
<p>The PvaClient API has the following features:</p>
|
||||||
href="./pvaClientOverview.html">pvaClientOverview.html
|
<ol>
|
||||||
</a>
|
<li>Provides a synchronous API rather than the callback API provided by pvAccess.</li>
|
||||||
</p>
|
<li>Makes common requests easy.</li>
|
||||||
<p>
|
<li>Provides full access to the pvAccess API for more demanding
|
||||||
Doxygen documentation is available at
|
applications</li>
|
||||||
<a
|
<li>Allows efficient client side programs.</li>
|
||||||
href="./html/index.html">doxygenDoc
|
<li>Takes care of most object resource management problems.</li>
|
||||||
</a>
|
</ol>
|
||||||
</p>
|
<p>Simple examples of using pva:</p>
|
||||||
<h2>Example Database</h2>
|
|
||||||
<p>The examples require that the database provided by project pvaClientTestCPP
|
|
||||||
is running.
|
|
||||||
For example:</p>
|
|
||||||
<pre>
|
<pre>
|
||||||
mrk> pwd
|
// pvaGet
|
||||||
/home/epicsv4/pvaClientTestCPP/database/iocBoot/exampleDatabase
|
PvaClientPtr pva = PvaClient::create();
|
||||||
mrk> ../../bin/linux-x86_64/exampleDatabase st.cmd
|
double value = pva->channel("exampleDouble")->get()->getData()->getDouble();
|
||||||
|
|
||||||
|
// pvaPut
|
||||||
|
PvaClientChannelPtr channel = pva->channel("exampleDouble");
|
||||||
|
PvaClientPutPtr put = channel->put();
|
||||||
|
PvaClientPutDataPtr putData = put->getData();
|
||||||
|
putData->putDouble(3.0); put->put();
|
||||||
|
|
||||||
|
// pvaMonitor
|
||||||
|
PvaClientMonitorPtr monitor = pva->channel("examplePowerSupply")->monitor("");
|
||||||
|
PvaClientMonitorDataPtr pvaData = monitor->getData();
|
||||||
|
while(true) {
|
||||||
|
monitor->waitEvent();
|
||||||
|
cout << "changed\n";
|
||||||
|
pvaData->showChanged(cout);
|
||||||
|
cout << "overrun\n";
|
||||||
|
pvaData->showOverrun(cout);
|
||||||
|
monitor->releaseEvent();
|
||||||
|
}
|
||||||
|
|
||||||
|
// pvaProcess
|
||||||
|
PvaClientChannelPtr channel = pva->channel("exampleDouble");
|
||||||
|
PvaClientProcessPtr process = channel->createProcess();
|
||||||
|
process->process();
|
||||||
|
|
||||||
</pre>
|
</pre>
|
||||||
<h2>Examples</h2>
|
<p>A separate project <b>exampleCPP</b> has examples for <b>pvDatabaseCPP</b>
|
||||||
<p>Examples are in directory <b>example/src</b>.
|
and for <b>pvaClientCPP</b>.
|
||||||
An example of how to run them is:</p>
|
See it for pvaClientCPP examples.
|
||||||
<pre>
|
</p>
|
||||||
mrk> pwd
|
<p>pvaClient does <b>not</b> provide support for:</p>
|
||||||
/home/epicsv4/pvaClientCPP/example
|
|
||||||
mrk> bin/linux-x86_64/examplePvaClientGet
|
|
||||||
</pre>
|
|
||||||
<p>The following is a brief description of each example.
|
|
||||||
In order to understand each example it
|
|
||||||
helps to also look at the source for the example.</p>
|
|
||||||
<h2>examplePvaClientGet</h2>
|
|
||||||
<p>This has a number of examples:</p>
|
|
||||||
<dl>
|
<dl>
|
||||||
<dt>exampleDouble</dt>
|
<dt>ChannelArray</dt>
|
||||||
<dd>
|
<dd>TBD</dd>
|
||||||
This shows two methods for getting data from a channel that has a numeric
|
<dt>ChannelRPC</dt>
|
||||||
scalar value field.
|
<dd>pvAccess itself already provides a synchronous interface.
|
||||||
</dd>
|
<b>exampleCPP</b> provides <b>helloRPC</b>, which is an example of using channelRPC.
|
||||||
<dt>exampleDoubleArray</dt>
|
|
||||||
<dd>
|
|
||||||
This shows two methods for getting data from a channel that has a
|
|
||||||
double array value field.
|
|
||||||
</dd>
|
|
||||||
<dt>exampleCADouble</dt>
|
|
||||||
<dd>
|
|
||||||
This is like exampleDouble except it uses provider <b>ca</b>.
|
|
||||||
</dd>
|
|
||||||
<dt>exampleCADoubleArray</dt>
|
|
||||||
<dd>
|
|
||||||
This is like exampleDoubleArray except it uses provider <b>ca</b>.
|
|
||||||
</dd>
|
|
||||||
<dt>examplePowerSupply</dt>
|
|
||||||
<dd>
|
|
||||||
This is an example of getting data from a channel that does not
|
|
||||||
have a value field.
|
|
||||||
</dd>
|
</dd>
|
||||||
</dl>
|
</dl>
|
||||||
<h2>examplePvaClientMonitor</h2>
|
|
||||||
<p>This is an example of creating a monitor on a channel.
|
<h2>Building pvaClientCPP</h2>
|
||||||
It monitors a scalar double field.
|
<p>
|
||||||
It also issues puts to the same channel so that it can make the monitors occur.
|
If a proper <b>RELEASE.local</b> is present one directory level above <b>pvaClientCPP</b>.
|
||||||
</p>
|
</p>
|
||||||
<h2>examplePvaClientPut</h2>
|
<p>
|
||||||
<p>This example gets and puts to channels exampleDouble
|
Just type:
|
||||||
and exampleDoubleArray.</p>
|
|
||||||
<h2>examplePvaClientProcess</h2>
|
|
||||||
<p>This example makes a process request to channel exampleDouble.</p>
|
|
||||||
<h2>helloWorldPutGet</h2>
|
|
||||||
<p>This is an example of issuing a channelPutGet.</p>
|
|
||||||
<h2>examplePvaClientMultiDouble</h2>
|
|
||||||
<p>This is an example of using pvaClientMultiChannel,
|
|
||||||
pvaClientMultiGetDouble, pvaClientMultiPutDouble, and pvaClientMultiMonitorDouble.
|
|
||||||
</p>
|
</p>
|
||||||
<h2>examplePvaClientNTMulti</h2>
|
<pre>
|
||||||
<p>This is an example of using pvaClientMultiChannel,
|
make
|
||||||
pvaClientNTMultiGet, pvaClientNTMultiPut, pvaClientNTMultiMonitor, and pvaClientNTMultiData.
|
</pre>
|
||||||
|
<p>
|
||||||
|
An example of a proper <b>RELEASE.local</b> is:
|
||||||
</p>
|
</p>
|
||||||
<h2>helloWorldRPC</h2>
|
<pre>
|
||||||
<p>This is an example of issuing a channelRPC request.
|
EPICS4_DIR=/home/epicsv4/master
|
||||||
It does <b>not</b> use pva.</p>
|
EXAMPLE=${EPICS4_DIR}/exampleCPP
|
||||||
|
PVDATABASE=${EPICS4_DIR}/pvDatabaseCPP
|
||||||
|
PVACLIENT=${EPICS4_DIR}/pvaClientCPP
|
||||||
|
PVASRV=${EPICS4_DIR}/pvaSrv
|
||||||
|
PVACCESS=${EPICS4_DIR}/pvAccessCPP
|
||||||
|
NORMATIVETYPES=${EPICS4_DIR}/normativeTypesCPP
|
||||||
|
PVDATA=${EPICS4_DIR}/pvDataCPP
|
||||||
|
PVCOMMON=${EPICS4_DIR}/pvCommonCPP
|
||||||
|
|
||||||
|
EPICS_BASE=/home/install/epics/base
|
||||||
|
</pre>
|
||||||
|
|
||||||
|
<p>pvaClientCPP can also be built if a file RELEASE.local exists in directory configure.
|
||||||
|
To create one do the following:</p>
|
||||||
|
<pre>
|
||||||
|
mrk> pwd
|
||||||
|
/home/hg/pvaClientCPP/configure
|
||||||
|
mrk> cp ExampleRELEASE.local RELEASE.local
|
||||||
|
</pre>
|
||||||
|
<p>Then edit <b>RELEASE.local</b> so that it has the correct location of each
|
||||||
|
product pvaClientCPP requires.
|
||||||
|
Than at the top level just execute <b>make</b>:</p>
|
||||||
|
<pre>
|
||||||
|
mrk> cd ..
|
||||||
|
mrk> pwd
|
||||||
|
/home/epicsv4/master/pvaClientCPP
|
||||||
|
mrk> make
|
||||||
|
</pre>
|
||||||
|
|
||||||
|
<h2>PvaClient</h2>
|
||||||
|
<p>An instance of PvaClient is obtained via the call:</p>
|
||||||
|
<pre>
|
||||||
|
PvaClientPtr pva = PvaClient::create();
|
||||||
|
</pre>
|
||||||
|
|
||||||
|
<p>PvaClient has methods to create instances of <b>PvaClientChannel</b>.
|
||||||
|
The client can specify the provider name or use the default provider.
|
||||||
|
The client can manage it's own channels or can let pvaClient cache channels.
|
||||||
|
An example of using the cached method is:</p>
|
||||||
|
<pre>
|
||||||
|
PvaClientChannelPtr pvaChannel = pva->channel("exampleDouble");
|
||||||
|
</pre>
|
||||||
|
<p>This will attempt to connect to channel exampleDouble.
|
||||||
|
Since the client did not specify a timeout an exception wll be thrown if
|
||||||
|
the connection request fails.
|
||||||
|
The client will block until the connection is made or an exception is thrown.
|
||||||
|
If the request succeeds, pva caches the pvaChannel so that if the
|
||||||
|
client makes another request for the same channel the cached object is
|
||||||
|
returned to the client.
|
||||||
|
</p>
|
||||||
|
<p>An example of using a non cached method is:</p>
|
||||||
|
<pre>
|
||||||
|
PvaClientChannelPtr pvaChannel = pva->createChannel("exampleDouble");
|
||||||
|
</pre>
|
||||||
|
<p>This will create an PvaClientChannel and return it to the client.
|
||||||
|
The client must itself connect.
|
||||||
|
This is useful if the client wants to connect to multiple channels in parallel.
|
||||||
|
</p>
|
||||||
|
|
||||||
|
<h2>PvaClientChannel - Wrapper For Single Channel</h2>
|
||||||
|
<h3>PvaClientChannel</h3>
|
||||||
|
<p>This provides methods for connecting to a channel and for creating instances of
|
||||||
|
PvaClientField, PvaClientProcess, ..., PvaClientPutGet.</p>
|
||||||
|
<p>Connection must be made before any create method is called or
|
||||||
|
an exception is raised.
|
||||||
|
The following is a synchronous connection request:</p>
|
||||||
|
<pre>
|
||||||
|
pvaChannel->connect(5.0); // BLOCKS AND THROWS IF NO CONNECT
|
||||||
|
</pre>
|
||||||
|
<p>This blocks until then connection is made or until timout occurs.
|
||||||
|
An exception is raised if the connection request fails.
|
||||||
|
</p>
|
||||||
|
<p>The same request can be made without blocking and without exceptions.</p>
|
||||||
|
<pre>
|
||||||
|
pvaChannel->issueConnect(); // DOES NOT BLOCK
|
||||||
|
.....
|
||||||
|
Status status =pvaChannel->waitConnect(5.0); // BLOCKS DOES NOT THROW
|
||||||
|
if(!status.isOK()) {
|
||||||
|
// failure do something
|
||||||
|
}
|
||||||
|
</pre>
|
||||||
|
<p>Once the channel is connected other PvaClient objects can be created.
|
||||||
|
For example:</p>
|
||||||
|
<pre>
|
||||||
|
PvaClientGetPtr pvaGet = pvaChannel->get(); // DOES BLOCK
|
||||||
|
</pre>
|
||||||
|
<p>This is a caching request.
|
||||||
|
If the client already has made an identical request the client will receive the
|
||||||
|
cached object.
|
||||||
|
If a new pvaGet is created than it is connected before it is returned to the client.
|
||||||
|
</p>
|
||||||
|
<p>The client can also managed it's own objects:</p>
|
||||||
|
<pre>
|
||||||
|
PvaClientGetPtr pvaGet = pvaChannel->createGet(); // DOES NOT BLOCK
|
||||||
|
</pre>
|
||||||
|
<p>The client must connect the pvaGet.</p>
|
||||||
|
|
||||||
|
<h3>PvaClientGetData</h3>
|
||||||
|
<p>This provides the data returned by pvaGet and pvaPutGet.
|
||||||
|
It is obtained via:</p>
|
||||||
|
<pre>
|
||||||
|
PvaClientGetDataPtr pvaData = pvaGet->getData();
|
||||||
|
</pre>
|
||||||
|
<p>It provides methods to get everything returned by channelGet.
|
||||||
|
In addition there are methods that make it easier to handle a value
|
||||||
|
field that is a scalar or a scalarArray.
|
||||||
|
Also for a scalar that is a double or a scalarArray with element type double.
|
||||||
|
</p>
|
||||||
|
<p>An example is:</p>
|
||||||
|
<pre>
|
||||||
|
double value = pvaData->getDouble();
|
||||||
|
</pre>
|
||||||
|
<p>It also keeps a bitSet showing which fields have changed since the last channelGet or channelPutGet.</p>
|
||||||
|
|
||||||
|
<h3>PvaClientMonitorData</h3>
|
||||||
|
<p>To the client this looks identical to PvaClientGetData except that
|
||||||
|
it provides two BitSets: changedBitSet and overrrunBitSet.
|
||||||
|
It is used by pvaMonitor.
|
||||||
|
</p>
|
||||||
|
<h3>PvaClientPutData</h3>
|
||||||
|
<p>This is used to provided data for pvaPut and pvaPutGet.
|
||||||
|
It has many of the same methods as pvaGetData.
|
||||||
|
It does not have a bitSet.
|
||||||
|
It also has put methods like:</p>
|
||||||
|
<pre>
|
||||||
|
void pvaData->putDouble(5.0);
|
||||||
|
</pre>
|
||||||
|
<h3>PvaClientGet</h3>
|
||||||
|
<p>This provides methods to connect to channelGet and to issue get request.
|
||||||
|
To connect via a single synchronous call:</p>
|
||||||
|
<pre>
|
||||||
|
easyGet->connect(); // BLOCKS AND CAN THROW
|
||||||
|
</pre>
|
||||||
|
<p>This can also be done in two steps:</p>
|
||||||
|
<pre>
|
||||||
|
pvaGet->issueConnect(); // DOES NOT BLOCK
|
||||||
|
...
|
||||||
|
Status status = pvaGet->waitConnect(); // BLOCKS AND DOES NOT THROW
|
||||||
|
</pre>
|
||||||
|
<p>Once connected gets are issued via either:</p>
|
||||||
|
<pre>
|
||||||
|
void pvaGet->get(); // BLOCKS AND CAN THROW
|
||||||
|
</pre>
|
||||||
|
or
|
||||||
|
<pre>
|
||||||
|
pvaGet->issueGet(); // DOES NOT BLOCK
|
||||||
|
...
|
||||||
|
Status status = pvaGet->waitGet(); // BLOCKS AND DOES NOT THROW
|
||||||
|
</pre>
|
||||||
|
<h3>PvaClientPut</h3>
|
||||||
|
<p>This is similar to pvaGet except that it wraps channelPut instead of channelGet.
|
||||||
|
</p>
|
||||||
|
<p>Once connected puts are issued via either:</p>
|
||||||
|
<pre>
|
||||||
|
void pvaPut->put(); // BLOCKS AND CAN THROW
|
||||||
|
</pre>
|
||||||
|
or
|
||||||
|
<pre>
|
||||||
|
pvaPut->issuePut(); // DOES NOT BLOCK
|
||||||
|
...
|
||||||
|
Status status = pvaPut->waitPut(); // BLOCKS AND DOES NOT THROW
|
||||||
|
</pre>
|
||||||
|
<h3>PvaClientMonitor</h3>
|
||||||
|
<p>Connecting is similar to pvaGet and pvaPut.
|
||||||
|
The other methods are:</p>
|
||||||
|
<dl>
|
||||||
|
<dt>start</dt>
|
||||||
|
<dd>Starts monitoring</dd>
|
||||||
|
<dt>stop</dt>
|
||||||
|
<dd>Stops monitoring</dd>
|
||||||
|
<dt>poll</dt>
|
||||||
|
<dd>polls for a monitorEvent.
|
||||||
|
The data is avalable via pvaMonitorData.
|
||||||
|
</dd>
|
||||||
|
<dt>releaseEvent</dt>
|
||||||
|
<dd>Release the data from the last poll.
|
||||||
|
Note that this must be called before another poll is requested.
|
||||||
|
</dd>
|
||||||
|
<dt>waitEvent</dt>
|
||||||
|
<dd>Block until a monitorEvent is available.
|
||||||
|
If true is returned a poll has already been issued.
|
||||||
|
</dd>
|
||||||
|
<dt>setRequester</dt>
|
||||||
|
<dd>A client callback is registered to receive notice of monitorEvents.</dd>
|
||||||
|
</dl>
|
||||||
|
<h3>PvaClientProcess</h3>
|
||||||
|
<p>Connecting is similar to pvaGet.
|
||||||
|
It has methods:</p>
|
||||||
|
<dl>
|
||||||
|
<dt>process</dt>
|
||||||
|
<dd>call issueProcess and waitProcess.</dd>
|
||||||
|
<dt>issueProcess</dt>
|
||||||
|
<dd>call channelProcess->process() and return immediately.
|
||||||
|
</dd>
|
||||||
|
<dt>waitProcess</dt>
|
||||||
|
<dd>Wait for process to complete.</dd>
|
||||||
|
</dl>
|
||||||
|
<h3>PvaClientPutGet</h3>
|
||||||
|
<p>Connecting is similar to pvaGet.
|
||||||
|
It has methods:</p>
|
||||||
|
<dl>
|
||||||
|
<dt>putGet</dt>
|
||||||
|
<dd>calls issuePutGet and waitPutGet.
|
||||||
|
throws an exception if not successfull.
|
||||||
|
</dd>
|
||||||
|
<dt>issuePutGet</dt>
|
||||||
|
<dd>
|
||||||
|
Calls channel->putGet() and returns.
|
||||||
|
</dd>
|
||||||
|
<dt>waitPutGet</dt>
|
||||||
|
<dd>
|
||||||
|
Waits until putGet completes and returns status.
|
||||||
|
</dd>
|
||||||
|
<dt>getGet,issueGetGet, and waitGetGet</dt>
|
||||||
|
<dd>Gets the data for the get part of channelPutGet.</dd>
|
||||||
|
<dt>getPut,issueGetPut,and waitGetPut</dt>
|
||||||
|
<dd>Gets the data for the put part of channelPutGet.</dd>
|
||||||
|
<dt>getPutData</dt>
|
||||||
|
<dd>
|
||||||
|
Returns the PvaClientData for the put part of channelPutGet.
|
||||||
|
</dd>
|
||||||
|
<dt>getGetData</dt>
|
||||||
|
<dd>
|
||||||
|
Returns the PvaClientData for the get part of channelPutGet.
|
||||||
|
</dd>
|
||||||
|
</dl>
|
||||||
|
<p>Look at javaDoc for details.</p>
|
||||||
|
|
||||||
|
<h2>PvaClientMultiChannel - Wrapper For Multiple Channels</h2>
|
||||||
|
<h3>PvaClientMultiChannel</h3>
|
||||||
|
<p>This provides methods for connecting to multiple channels.
|
||||||
|
</p>
|
||||||
|
<h3>PvaClientMultiGetDouble</h3>
|
||||||
|
<p>This provides support for channelGet to multiple channels where each channel has a value field that is a numeric scalar.
|
||||||
|
</p>
|
||||||
|
<h3>PvaClientMultiPutDouble</h3>
|
||||||
|
<p>This provides support for channelPut to multiple channels where each channel has a value field that is a numeric scalar.
|
||||||
|
</p>
|
||||||
|
<h3>PvaClientMultiMonitorDouble</h3>
|
||||||
|
<p>This provides support for monitoring changes to multiple channels where each channel has a value field that is a numeric scalar.
|
||||||
|
</p>
|
||||||
|
<h3>PvaClientNTMultiGet</h3>
|
||||||
|
<p>This provides support for channelGet to multiple channels where each channel has a value field that has any valid type.
|
||||||
|
</p>
|
||||||
|
<h3>PvaClientNTMultiPut</h3>
|
||||||
|
<p>This provides support for channelPut to multiple channels where each channel has a value
|
||||||
|
field that has any valid type.
|
||||||
|
</p>
|
||||||
|
<h3>PvaClientNTMultiMonitor</h3>
|
||||||
|
<p>This provides support for monitoring changes to multiple channels where each channel has a
|
||||||
|
value field that has any valid type.
|
||||||
|
</p>
|
||||||
|
<h3>PvaClientNTMultiData</h3>
|
||||||
|
<p>This provides support for monitoring changes to multiple channels where each channel has a value field that has any valid type.
|
||||||
|
The client can get the data as normative type NTMultiChannel.
|
||||||
|
</p>
|
||||||
|
|
||||||
</div> <!-- class="contents" -->
|
</div> <!-- class="contents" -->
|
||||||
</body>
|
</body>
|
||||||
</html>
|
</html>
|
||||||
|
@ -1,199 +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>EPICS pva</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 }
|
|
||||||
body { margin-right: 10% }
|
|
||||||
/*]]>*/</style>
|
|
||||||
|
|
||||||
<!-- Script that generates the Table of Contents -->
|
|
||||||
<script type="text/javascript" src="http://epics-pvdata.sourceforge.net/script/tocgen.js"></script>
|
|
||||||
|
|
||||||
</head>
|
|
||||||
|
|
||||||
<body>
|
|
||||||
|
|
||||||
<div class="head">
|
|
||||||
<h1>EPICS pvaClientCPP</h1>
|
|
||||||
<!-- Maturity: Working Draft or Request for Comments, or Recommendation, and date. -->
|
|
||||||
<h2 class="nocount">EPICS V4 Working Group, Working Draft,
|
|
||||||
26-June-2015</h2>
|
|
||||||
<dl>
|
|
||||||
<dt>This version:</dt>
|
|
||||||
<dd><a
|
|
||||||
href="pvaClientCPP.html">pvaClientCPP.html
|
|
||||||
</a> </dd>
|
|
||||||
<dt>Latest version:</dt>
|
|
||||||
<dd><a
|
|
||||||
href="pvaClientCPP_20150626.html">pvaClientCPP_20150626.html
|
|
||||||
</a> </dd>
|
|
||||||
<dt>Previous version:</dt>
|
|
||||||
<dd><a
|
|
||||||
href="easyPVA_20150609.html">easyPVA_20150609.html</a>
|
|
||||||
</dd>
|
|
||||||
<dt>Editors:</dt>
|
|
||||||
<dd>Marty Kraimer, BNL</dd>
|
|
||||||
</dl>
|
|
||||||
|
|
||||||
<h2 class="nocount">Abstract</h2>
|
|
||||||
|
|
||||||
<p>pvaClient is a software library that provides to an EPICS client programmer, a friendly
|
|
||||||
client side programming interface to the data of an EPICS based control system. It is intended
|
|
||||||
for such uses as rapid development of ad hoc programs by controls engineers, or to provide
|
|
||||||
scientists a way to directly develop analytical applications.</p>
|
|
||||||
|
|
||||||
<p>Specifically, pvaClient provides a synchronous interface for pvAccess, which is the
|
|
||||||
software support for high speed controls network communications used in EPICS version 4.
|
|
||||||
pvAccess provides a callback based interface, which can be hard to use.
|
|
||||||
pvaClient provides an interface that does not require callbacks even for monitors.
|
|
||||||
</p>
|
|
||||||
pvaClientChannel provides many "convenience" methods to directly get and put
|
|
||||||
scalar and scalarArray data types.
|
|
||||||
Additional methods provide access to the full features of pvAccess.
|
|
||||||
</p>
|
|
||||||
<p>
|
|
||||||
pvaClientMultiChannel provides access to data from multiple channels.
|
|
||||||
It can be used directly by a client or via pvaClientMultiDouble or pvaClientNTMultiChannel.
|
|
||||||
pvaClientMultiDouble allows the client to get and put data to multiple channels.
|
|
||||||
But each channel must have a value field that is a numeric scalar.
|
|
||||||
pvaClientNTMultiChannel allows the client to get and put data to multiple channels.
|
|
||||||
Each channel must have a value field.
|
|
||||||
The data for the channels is presented via normative type NTMultiChannel.
|
|
||||||
</p>
|
|
||||||
<!-- last para of Abstract is boilerplate reference to EPICS -->
|
|
||||||
<p>For more information about EPICS generally, please refer to the home page of the <a
|
|
||||||
href="http://www.aps.anl.gov/epics/">Experimental Physics and Industrial
|
|
||||||
Control System</a>.</p>
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
<h2 class="nocount">Status of this Document and of the pvaClient Software</h2>
|
|
||||||
|
|
||||||
<p>pvaClientCPP is ready for use.</p>
|
|
||||||
|
|
||||||
</div> <!-- head -->
|
|
||||||
|
|
||||||
<div id="toc">
|
|
||||||
<h2 class="nocount">Table of Contents</h2>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<!-- Place what you would like in the Table of Contents, inside the contents div -->
|
|
||||||
<div id="contents" class="contents">
|
|
||||||
<hr />
|
|
||||||
|
|
||||||
<h2>Introduction</h2>
|
|
||||||
|
|
||||||
<p>pvaClient is a synchronous API for accessing PVData via PVAccess. It provides
|
|
||||||
an interface to many of the features provided by pvData and pvAccess.</p>
|
|
||||||
|
|
||||||
<p>This document describes the layout of the source files in this project.</p>
|
|
||||||
<p>
|
|
||||||
A user overview is available via
|
|
||||||
<a
|
|
||||||
href="./pvaClientOverview.html">pvaClientOverview.html
|
|
||||||
</a>
|
|
||||||
</p>
|
|
||||||
<p>
|
|
||||||
Doxygen documentation is available at
|
|
||||||
<a
|
|
||||||
href="./html/index.html">doxygenDoc
|
|
||||||
</a>
|
|
||||||
</p>
|
|
||||||
<h2>Example Database</h2>
|
|
||||||
<p>The examples require that an example pvAccess server is runnimg.
|
|
||||||
To get the test database go to:</p>
|
|
||||||
<a
|
|
||||||
href="https://github.com/epics_base/pvaClientTestCPP/blob/master/database.zip">pvaClientTestCPP/database.zip
|
|
||||||
</a>
|
|
||||||
Then select "raw file" and You will be able to download the zip file.
|
|
||||||
<p>
|
|
||||||
When unzipped this is used to create an example IOC database.
|
|
||||||
</p>
|
|
||||||
<p>
|
|
||||||
After unzipping the file:
|
|
||||||
</p>
|
|
||||||
<pre>
|
|
||||||
cd database/configure
|
|
||||||
cp ExampleRELEASE.local RELEASE.local
|
|
||||||
edit RELEASE.local
|
|
||||||
cd ..
|
|
||||||
make
|
|
||||||
cd iocBoot/exampleDatabase
|
|
||||||
../../bin/<arch:>/exampleDatabase st.cmd
|
|
||||||
</pre>
|
|
||||||
<h2>Examples</h2>
|
|
||||||
<p>Examples are in directory <b>example/src</b>.
|
|
||||||
An example of how to run them is:</p>
|
|
||||||
<pre>
|
|
||||||
mrk> pwd
|
|
||||||
/home/epicsv4/pvaClientCPP/example
|
|
||||||
mrk> bin/linux-x86_64/examplePvaClientGet
|
|
||||||
</pre>
|
|
||||||
<p>The following is a brief description of each example.
|
|
||||||
In order to understand each example it
|
|
||||||
helps to also look at the source for the example.</p>
|
|
||||||
<h2>examplePvaClientGet</h2>
|
|
||||||
<p>This has a number of examples:</p>
|
|
||||||
<dl>
|
|
||||||
<dt>exampleDouble</dt>
|
|
||||||
<dd>
|
|
||||||
This shows two methods for getting data from a channel that has a numeric
|
|
||||||
scalar value field.
|
|
||||||
</dd>
|
|
||||||
<dt>exampleDoubleArray</dt>
|
|
||||||
<dd>
|
|
||||||
This shows two methods for getting data from a channel that has a
|
|
||||||
double array value field.
|
|
||||||
</dd>
|
|
||||||
<dt>exampleCADouble</dt>
|
|
||||||
<dd>
|
|
||||||
This is like exampleDouble except it uses provider <b>ca</b>.
|
|
||||||
</dd>
|
|
||||||
<dt>exampleCADoubleArray</dt>
|
|
||||||
<dd>
|
|
||||||
This is like exampleDoubleArray except it uses provider <b>ca</b>.
|
|
||||||
</dd>
|
|
||||||
<dt>examplePowerSupply</dt>
|
|
||||||
<dd>
|
|
||||||
This is an example of getting data from a channel that does not
|
|
||||||
have a value field.
|
|
||||||
</dd>
|
|
||||||
</dl>
|
|
||||||
<h2>examplePvaClientMonitor</h2>
|
|
||||||
<p>This is an example of creating a monitor on a channel.
|
|
||||||
It monitors a channel that models a powerSupply, i. e. it is not a "standard" record.
|
|
||||||
It does not have a value field.
|
|
||||||
</p>
|
|
||||||
<p>After starting the example a change can be made to the powerSupply by issuing:</p>
|
|
||||||
<pre>
|
|
||||||
pvput -r "power.value,voltage.value" examplePowerSupply 6 6
|
|
||||||
</pre>
|
|
||||||
<h2>examplePvaClientPut</h2>
|
|
||||||
<p>This example gets and puts to channel exampleDouble.</p>
|
|
||||||
<h2>examplePvaClientProcess</h2>
|
|
||||||
<p>This example makes a process request to channel exampleDouble.</p>
|
|
||||||
<h2>helloWorldPutGet</h2>
|
|
||||||
<p>This is an example of issuing a channelPutGet.</p>
|
|
||||||
<h2>examplePvaClientMultiDouble</h2>
|
|
||||||
<p>This is an example of issuing gets and puts to multiple channels where each
|
|
||||||
channel has a numeric scalar value field.</p>
|
|
||||||
<h2>examplePvaClientNTMultiChannel</h2>
|
|
||||||
<p>This is an example of using NDMultiChannel to obtain data from multiple channels.
|
|
||||||
</p>
|
|
||||||
<h2>helloWorldRPC</h2>
|
|
||||||
<p>This is an example of issuing a channelRPC request.
|
|
||||||
It does <b>not</b> use pva.</p>
|
|
||||||
</div> <!-- class="contents" -->
|
|
||||||
</body>
|
|
||||||
</html>
|
|
@ -1,182 +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>EPICS pva</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 }
|
|
||||||
body { margin-right: 10% }
|
|
||||||
/*]]>*/</style>
|
|
||||||
|
|
||||||
<!-- Script that generates the Table of Contents -->
|
|
||||||
<script type="text/javascript" src="http://epics-pvdata.sourceforge.net/script/tocgen.js"></script>
|
|
||||||
|
|
||||||
</head>
|
|
||||||
|
|
||||||
<body>
|
|
||||||
|
|
||||||
<div class="head">
|
|
||||||
<h1>EPICS pvaClientCPP</h1>
|
|
||||||
<!-- Maturity: Working Draft or Request for Comments, or Recommendation, and date. -->
|
|
||||||
<h2 class="nocount">EPICS V4 Working Group, Working Draft,
|
|
||||||
03-August-2015</h2>
|
|
||||||
<dl>
|
|
||||||
<dt>This version:</dt>
|
|
||||||
<dd><a
|
|
||||||
href="pvaClientCPP.html">pvaClientCPP.html
|
|
||||||
</a> </dd>
|
|
||||||
<dt>Latest version:</dt>
|
|
||||||
<dd><a
|
|
||||||
href="pvaClientCPP_20150803.html">pvaClientCPP_20150803.html
|
|
||||||
</a> </dd>
|
|
||||||
<dt>Previous version:</dt>
|
|
||||||
<dd><a
|
|
||||||
href="pvaClientCPP_20150626.html">pvaClientCPP_20150626.html
|
|
||||||
</a> </dd>
|
|
||||||
<dt>Editors:</dt>
|
|
||||||
<dd>Marty Kraimer, BNL</dd>
|
|
||||||
</dl>
|
|
||||||
|
|
||||||
<h2 class="nocount">Abstract</h2>
|
|
||||||
|
|
||||||
<p>pvaClient is a software library that provides to an EPICS client programmer, a friendly
|
|
||||||
client side programming interface to the data of an EPICS based control system. It is intended
|
|
||||||
for such uses as rapid development of ad hoc programs by controls engineers, or to provide
|
|
||||||
scientists a way to directly develop analytical applications.</p>
|
|
||||||
|
|
||||||
<p>Specifically, pvaClient provides a synchronous interface for pvAccess, which is the
|
|
||||||
software support for high speed controls network communications used in EPICS version 4.
|
|
||||||
pvAccess provides a callback based interface, which can be hard to use.
|
|
||||||
pvaClient provides an interface that does not require callbacks even for monitors.
|
|
||||||
</p>
|
|
||||||
<p>
|
|
||||||
pvaClientChannel provides many "convenience" methods to directly get and put
|
|
||||||
scalar and scalarArray data types.
|
|
||||||
Additional methods provide access to the full features of pvAccess.
|
|
||||||
</p>
|
|
||||||
<p>
|
|
||||||
pvaClientMultiChannel provides access to data from multiple channels.
|
|
||||||
It can be used directly by a client or via pvaClientMultiDouble or pvaClientNTMultiChannel.
|
|
||||||
pvaClientMultiDouble allows the client to get and put data to multiple channels.
|
|
||||||
But each channel must have a value field that is a numeric scalar.
|
|
||||||
pvaClientNTMultiChannel allows the client to get and put data to multiple channels.
|
|
||||||
Each channel must have a value field.
|
|
||||||
The data for the channels is presented via normative type NTMultiChannel.
|
|
||||||
</p>
|
|
||||||
<!-- last para of Abstract is boilerplate reference to EPICS -->
|
|
||||||
<p>For more information about EPICS generally, please refer to the home page of the <a
|
|
||||||
href="http://www.aps.anl.gov/epics/">Experimental Physics and Industrial
|
|
||||||
Control System</a>.</p>
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
<h2 class="nocount">Status of this Document and of the pvaClient Software</h2>
|
|
||||||
|
|
||||||
<p>pvaClientCPP is ready for use.</p>
|
|
||||||
|
|
||||||
</div> <!-- head -->
|
|
||||||
|
|
||||||
<div id="toc">
|
|
||||||
<h2 class="nocount">Table of Contents</h2>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<!-- Place what you would like in the Table of Contents, inside the contents div -->
|
|
||||||
<div id="contents" class="contents">
|
|
||||||
<hr />
|
|
||||||
|
|
||||||
<h2>Introduction</h2>
|
|
||||||
|
|
||||||
<p>pvaClient is a synchronous API for accessing PVData via PVAccess. It provides
|
|
||||||
an interface to many of the features provided by pvData and pvAccess.</p>
|
|
||||||
|
|
||||||
<p>This document describes the layout of the source files in this project.</p>
|
|
||||||
<p>
|
|
||||||
A user overview is available via
|
|
||||||
<a
|
|
||||||
href="./pvaClientOverview.html">pvaClientOverview.html
|
|
||||||
</a>
|
|
||||||
</p>
|
|
||||||
<p>
|
|
||||||
Doxygen documentation is available at
|
|
||||||
<a
|
|
||||||
href="./html/index.html">doxygenDoc
|
|
||||||
</a>
|
|
||||||
</p>
|
|
||||||
<h2>Example Database</h2>
|
|
||||||
<p>The examples require that the database provided by project pvaClientTestCPP
|
|
||||||
is running.
|
|
||||||
For example:</p>
|
|
||||||
<pre>
|
|
||||||
mrk> pwd
|
|
||||||
/home/epicsv4/pvaClientTestCPP/database/iocBoot/exampleDatabase
|
|
||||||
mrk> ../../bin/linux-x86_64/exampleDatabase st.cmd
|
|
||||||
</pre>
|
|
||||||
<h2>Examples</h2>
|
|
||||||
<p>Examples are in directory <b>example/src</b>.
|
|
||||||
An example of how to run them is:</p>
|
|
||||||
<pre>
|
|
||||||
mrk> pwd
|
|
||||||
/home/epicsv4/pvaClientCPP/example
|
|
||||||
mrk> bin/linux-x86_64/examplePvaClientGet
|
|
||||||
</pre>
|
|
||||||
<p>The following is a brief description of each example.
|
|
||||||
In order to understand each example it
|
|
||||||
helps to also look at the source for the example.</p>
|
|
||||||
<h2>examplePvaClientGet</h2>
|
|
||||||
<p>This has a number of examples:</p>
|
|
||||||
<dl>
|
|
||||||
<dt>exampleDouble</dt>
|
|
||||||
<dd>
|
|
||||||
This shows two methods for getting data from a channel that has a numeric
|
|
||||||
scalar value field.
|
|
||||||
</dd>
|
|
||||||
<dt>exampleDoubleArray</dt>
|
|
||||||
<dd>
|
|
||||||
This shows two methods for getting data from a channel that has a
|
|
||||||
double array value field.
|
|
||||||
</dd>
|
|
||||||
<dt>exampleCADouble</dt>
|
|
||||||
<dd>
|
|
||||||
This is like exampleDouble except it uses provider <b>ca</b>.
|
|
||||||
</dd>
|
|
||||||
<dt>exampleCADoubleArray</dt>
|
|
||||||
<dd>
|
|
||||||
This is like exampleDoubleArray except it uses provider <b>ca</b>.
|
|
||||||
</dd>
|
|
||||||
<dt>examplePowerSupply</dt>
|
|
||||||
<dd>
|
|
||||||
This is an example of getting data from a channel that does not
|
|
||||||
have a value field.
|
|
||||||
</dd>
|
|
||||||
</dl>
|
|
||||||
<h2>examplePvaClientMonitor</h2>
|
|
||||||
<p>This is an example of creating a monitor on a channel.
|
|
||||||
It monitors a scalar double field.
|
|
||||||
It also issues puts to the same channel so that it can make the monitors occur.
|
|
||||||
</p>
|
|
||||||
<h2>examplePvaClientPut</h2>
|
|
||||||
<p>This example gets and puts to channels exampleDouble
|
|
||||||
and exampleDoubleArray.</p>
|
|
||||||
<h2>examplePvaClientProcess</h2>
|
|
||||||
<p>This example makes a process request to channel exampleDouble.</p>
|
|
||||||
<h2>helloWorldPutGet</h2>
|
|
||||||
<p>This is an example of issuing a channelPutGet.</p>
|
|
||||||
<h2>examplePvaClientMultiDouble</h2>
|
|
||||||
<p>This is an example of using pvaClientMultiChannel,
|
|
||||||
pvaClientMultiGetDouble, pvaClientMultiPutDouble, and pvaClientMultiMonitorDouble.
|
|
||||||
</p>
|
|
||||||
<h2>helloWorldRPC</h2>
|
|
||||||
<p>This is an example of issuing a channelRPC request.
|
|
||||||
It does <b>not</b> use pva.</p>
|
|
||||||
</div> <!-- class="contents" -->
|
|
||||||
</body>
|
|
||||||
</html>
|
|
@ -1,186 +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>EPICS pva</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 }
|
|
||||||
body { margin-right: 10% }
|
|
||||||
/*]]>*/</style>
|
|
||||||
|
|
||||||
<!-- Script that generates the Table of Contents -->
|
|
||||||
<script type="text/javascript" src="http://epics-pvdata.sourceforge.net/script/tocgen.js"></script>
|
|
||||||
|
|
||||||
</head>
|
|
||||||
|
|
||||||
<body>
|
|
||||||
|
|
||||||
<div class="head">
|
|
||||||
<h1>EPICS pvaClientCPP</h1>
|
|
||||||
<!-- Maturity: Working Draft or Request for Comments, or Recommendation, and date. -->
|
|
||||||
<h2 class="nocount">EPICS V4 Working Group, Working Draft,
|
|
||||||
02-October-2015</h2>
|
|
||||||
<dl>
|
|
||||||
<dt>This version:</dt>
|
|
||||||
<dd><a
|
|
||||||
href="pvaClientCPP.html">pvaClientCPP.html
|
|
||||||
</a> </dd>
|
|
||||||
<dt>Latest version:</dt>
|
|
||||||
<dd><a
|
|
||||||
href="pvaClientCPP_20151002.html">pvaClientCPP_20151002.html
|
|
||||||
</a> </dd>
|
|
||||||
<dt>Previous version:</dt>
|
|
||||||
<dd><a
|
|
||||||
href="pvaClientCPP_20150803.html">pvaClientCPP_20150803.html
|
|
||||||
</a> </dd>
|
|
||||||
<dt>Editors:</dt>
|
|
||||||
<dd>Marty Kraimer, BNL</dd>
|
|
||||||
</dl>
|
|
||||||
|
|
||||||
<h2 class="nocount">Abstract</h2>
|
|
||||||
|
|
||||||
<p>pvaClient is a software library that provides to an EPICS client programmer, a friendly
|
|
||||||
client side programming interface to the data of an EPICS based control system. It is intended
|
|
||||||
for such uses as rapid development of ad hoc programs by controls engineers, or to provide
|
|
||||||
scientists a way to directly develop analytical applications.</p>
|
|
||||||
|
|
||||||
<p>Specifically, pvaClient provides a synchronous interface for pvAccess, which is the
|
|
||||||
software support for high speed controls network communications used in EPICS version 4.
|
|
||||||
pvAccess provides a callback based interface, which can be hard to use.
|
|
||||||
pvaClient provides an interface that does not require callbacks even for monitors.
|
|
||||||
</p>
|
|
||||||
<p>
|
|
||||||
pvaClientChannel provides many "convenience" methods to directly get and put
|
|
||||||
scalar and scalarArray data types.
|
|
||||||
Additional methods provide access to the full features of pvAccess.
|
|
||||||
</p>
|
|
||||||
<p>
|
|
||||||
pvaClientMultiChannel provides access to data from multiple channels.
|
|
||||||
It can be used directly by a client or via pvaClientMultiDouble or pvaClientNTMultiChannel.
|
|
||||||
pvaClientMultiDouble allows the client to get and put data to multiple channels.
|
|
||||||
But each channel must have a value field that is a numeric scalar.
|
|
||||||
pvaClientNTMultiChannel allows the client to get and put data to multiple channels.
|
|
||||||
Each channel must have a value field.
|
|
||||||
The data for the channels is presented via normative type NTMultiChannel.
|
|
||||||
</p>
|
|
||||||
<!-- last para of Abstract is boilerplate reference to EPICS -->
|
|
||||||
<p>For more information about EPICS generally, please refer to the home page of the <a
|
|
||||||
href="http://www.aps.anl.gov/epics/">Experimental Physics and Industrial
|
|
||||||
Control System</a>.</p>
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
<h2 class="nocount">Status of this Document and of the pvaClient Software</h2>
|
|
||||||
|
|
||||||
<p>pvaClientCPP is ready for use.</p>
|
|
||||||
|
|
||||||
</div> <!-- head -->
|
|
||||||
|
|
||||||
<div id="toc">
|
|
||||||
<h2 class="nocount">Table of Contents</h2>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<!-- Place what you would like in the Table of Contents, inside the contents div -->
|
|
||||||
<div id="contents" class="contents">
|
|
||||||
<hr />
|
|
||||||
|
|
||||||
<h2>Introduction</h2>
|
|
||||||
|
|
||||||
<p>pvaClient is a synchronous API for accessing PVData via PVAccess. It provides
|
|
||||||
an interface to many of the features provided by pvData and pvAccess.</p>
|
|
||||||
|
|
||||||
<p>This document describes the layout of the source files in this project.</p>
|
|
||||||
<p>
|
|
||||||
A user overview is available via
|
|
||||||
<a
|
|
||||||
href="./pvaClientOverview.html">pvaClientOverview.html
|
|
||||||
</a>
|
|
||||||
</p>
|
|
||||||
<p>
|
|
||||||
Doxygen documentation is available at
|
|
||||||
<a
|
|
||||||
href="./html/index.html">doxygenDoc
|
|
||||||
</a>
|
|
||||||
</p>
|
|
||||||
<h2>Example Database</h2>
|
|
||||||
<p>The examples require that the database provided by project pvaClientTestCPP
|
|
||||||
is running.
|
|
||||||
For example:</p>
|
|
||||||
<pre>
|
|
||||||
mrk> pwd
|
|
||||||
/home/epicsv4/pvaClientTestCPP/database/iocBoot/exampleDatabase
|
|
||||||
mrk> ../../bin/linux-x86_64/exampleDatabase st.cmd
|
|
||||||
</pre>
|
|
||||||
<h2>Examples</h2>
|
|
||||||
<p>Examples are in directory <b>example/src</b>.
|
|
||||||
An example of how to run them is:</p>
|
|
||||||
<pre>
|
|
||||||
mrk> pwd
|
|
||||||
/home/epicsv4/pvaClientCPP/example
|
|
||||||
mrk> bin/linux-x86_64/examplePvaClientGet
|
|
||||||
</pre>
|
|
||||||
<p>The following is a brief description of each example.
|
|
||||||
In order to understand each example it
|
|
||||||
helps to also look at the source for the example.</p>
|
|
||||||
<h2>examplePvaClientGet</h2>
|
|
||||||
<p>This has a number of examples:</p>
|
|
||||||
<dl>
|
|
||||||
<dt>exampleDouble</dt>
|
|
||||||
<dd>
|
|
||||||
This shows two methods for getting data from a channel that has a numeric
|
|
||||||
scalar value field.
|
|
||||||
</dd>
|
|
||||||
<dt>exampleDoubleArray</dt>
|
|
||||||
<dd>
|
|
||||||
This shows two methods for getting data from a channel that has a
|
|
||||||
double array value field.
|
|
||||||
</dd>
|
|
||||||
<dt>exampleCADouble</dt>
|
|
||||||
<dd>
|
|
||||||
This is like exampleDouble except it uses provider <b>ca</b>.
|
|
||||||
</dd>
|
|
||||||
<dt>exampleCADoubleArray</dt>
|
|
||||||
<dd>
|
|
||||||
This is like exampleDoubleArray except it uses provider <b>ca</b>.
|
|
||||||
</dd>
|
|
||||||
<dt>examplePowerSupply</dt>
|
|
||||||
<dd>
|
|
||||||
This is an example of getting data from a channel that does not
|
|
||||||
have a value field.
|
|
||||||
</dd>
|
|
||||||
</dl>
|
|
||||||
<h2>examplePvaClientMonitor</h2>
|
|
||||||
<p>This is an example of creating a monitor on a channel.
|
|
||||||
It monitors a scalar double field.
|
|
||||||
It also issues puts to the same channel so that it can make the monitors occur.
|
|
||||||
</p>
|
|
||||||
<h2>examplePvaClientPut</h2>
|
|
||||||
<p>This example gets and puts to channels exampleDouble
|
|
||||||
and exampleDoubleArray.</p>
|
|
||||||
<h2>examplePvaClientProcess</h2>
|
|
||||||
<p>This example makes a process request to channel exampleDouble.</p>
|
|
||||||
<h2>helloWorldPutGet</h2>
|
|
||||||
<p>This is an example of issuing a channelPutGet.</p>
|
|
||||||
<h2>examplePvaClientMultiDouble</h2>
|
|
||||||
<p>This is an example of using pvaClientMultiChannel,
|
|
||||||
pvaClientMultiGetDouble, pvaClientMultiPutDouble, and pvaClientMultiMonitorDouble.
|
|
||||||
</p>
|
|
||||||
<h2>examplePvaClientNTMulti</h2>
|
|
||||||
<p>This is an example of using pvaClientMultiChannel,
|
|
||||||
pvaClientNTMultiGet, pvaClientNTMultiPut, pvaClientNTMultiMonitor, and pvaClientNTMultiData.
|
|
||||||
</p>
|
|
||||||
<h2>helloWorldRPC</h2>
|
|
||||||
<p>This is an example of issuing a channelRPC request.
|
|
||||||
It does <b>not</b> use pva.</p>
|
|
||||||
</div> <!-- class="contents" -->
|
|
||||||
</body>
|
|
||||||
</html>
|
|
@ -1,328 +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>pva C++ Overview</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 }
|
|
||||||
body { margin-right: 10% }
|
|
||||||
/*]]>*/</style>
|
|
||||||
|
|
||||||
<!-- Script that generates the Table of Contents -->
|
|
||||||
<script type="text/javascript" src="http://epics-pvdata.sourceforge.net/script/tocgen.js"></script>
|
|
||||||
|
|
||||||
</head>
|
|
||||||
|
|
||||||
<body>
|
|
||||||
|
|
||||||
<div class="head">
|
|
||||||
<h1>PvaClient C++ Overview</h1>
|
|
||||||
|
|
||||||
</div> <!-- head -->
|
|
||||||
|
|
||||||
<div id="toc">
|
|
||||||
<h2 class="nocount">Table of Contents</h2>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<!-- Place what you would like in the Table of Contents, inside the contents div -->
|
|
||||||
<div id="contents" class="contents">
|
|
||||||
<hr />
|
|
||||||
|
|
||||||
<h2>Introduction</h2>
|
|
||||||
|
|
||||||
<p>PvaClient is a synchronous API for accessing PVData via PVAccess.
|
|
||||||
It also provides a number of convenience methods.
|
|
||||||
It allows the client to request access without checking for failure,
|
|
||||||
but throws an exception if a request fails.
|
|
||||||
A client can also check for failues and thus prevent exceptions.</p>
|
|
||||||
|
|
||||||
<p>The PvaClient API has the following features:</p>
|
|
||||||
<ol>
|
|
||||||
<li>Provides a synchronous API rather than the callback API provided by pvAccess.</li>
|
|
||||||
<li>Makes common requests pva.</li>
|
|
||||||
<li>Provides full access to the pvAccess API for more demanding
|
|
||||||
applications</li>
|
|
||||||
<li>Allows efficient client side programs.</li>
|
|
||||||
<li>Takes care of most object resource management problems.</li>
|
|
||||||
</ol>
|
|
||||||
<p>Simple examples of using pva:</p>
|
|
||||||
<pre>
|
|
||||||
// pvaGet
|
|
||||||
PvaClientPtr pva = PvaClient::create();
|
|
||||||
double value = pva->channel("exampleDouble")->get()->getData()->getDouble();
|
|
||||||
|
|
||||||
// pvaPut
|
|
||||||
PvaClientChannelPtr channel = pva->channel("exampleDouble");
|
|
||||||
PvaClientPutPtr put = channel->put();
|
|
||||||
PvaClientPutDataPtr putData = put->getData();
|
|
||||||
putData->putDouble(3.0); put->put();
|
|
||||||
|
|
||||||
// pvaMonitor
|
|
||||||
PvaClientMonitorPtr monitor = pva->channel("examplePowerSupply")->monitor("");
|
|
||||||
PvaClientMonitorDataPtr pvaData = monitor->getData();
|
|
||||||
while(true) {
|
|
||||||
monitor->waitEvent();
|
|
||||||
cout << "changed\n";
|
|
||||||
pvaData->showChanged(cout);
|
|
||||||
cout << "overrun\n";
|
|
||||||
pvaData->showOverrun(cout);
|
|
||||||
monitor->releaseEvent();
|
|
||||||
}
|
|
||||||
|
|
||||||
// pvaProcess
|
|
||||||
PvaClientChannelPtr channel = pva->channel("exampleDouble");
|
|
||||||
PvaClientProcessPtr process = channel->createProcess();
|
|
||||||
process->process();
|
|
||||||
|
|
||||||
</pre>
|
|
||||||
<p><b>pvClientCPP/example</b> includes a number of examples.</p>
|
|
||||||
<p>pvaClient does <b>not</b> provide support for:</p>
|
|
||||||
<dl>
|
|
||||||
<dt>ChannelArray</dt>
|
|
||||||
<dd>TBD</dd>
|
|
||||||
<dt>ChannelRPC</dt>
|
|
||||||
<dd>pvAccess itself already provides a synchronous interface.
|
|
||||||
The examples include helloWorldRPC, which is an example of using channelRP.
|
|
||||||
</dd>
|
|
||||||
</dl>
|
|
||||||
|
|
||||||
<h2>PvaClient</h2>
|
|
||||||
<p>An instance of PvaClient is obtained via the call:</p>
|
|
||||||
<pre>
|
|
||||||
PvaClientPtr pva = PvaClient::create();
|
|
||||||
</pre>
|
|
||||||
|
|
||||||
<p>PvaClient has methods to create instances of <b>PvaClientChannel</b>.
|
|
||||||
The client can specify the provider name or use the default provider.
|
|
||||||
The client can manage it's own channels or can let pvaClient cache channels.
|
|
||||||
An example of using the cached method is:</p>
|
|
||||||
<pre>
|
|
||||||
PvaClientChannelPtr pvaChannel = pva->channel("exampleDouble");
|
|
||||||
</pre>
|
|
||||||
<p>This will attempt to connect to channel exampleDouble.
|
|
||||||
Since the client did not specify a timeout an exception wll be thrown if
|
|
||||||
the connection request fails.
|
|
||||||
The client will block until the connection is made or an exception is thrown.
|
|
||||||
If the request succeeds, pva caches the pvaChannel so that if the
|
|
||||||
client makes another request for the same channel the cached object is
|
|
||||||
returned to the client.
|
|
||||||
</p>
|
|
||||||
<p>An example of using a non cached method is:</p>
|
|
||||||
<pre>
|
|
||||||
PvaClientChannelPtr pvaChannel = pva->createChannel("exampleDouble");
|
|
||||||
</pre>
|
|
||||||
<p>This will create an PvaClientChannel and return it to the client.
|
|
||||||
The client must itself connect.
|
|
||||||
This is useful if the client wants to connect to multiple channels in parallel.
|
|
||||||
</p>
|
|
||||||
|
|
||||||
<h2>PvaClientChannel - Wrapper For Single Channel</h2>
|
|
||||||
<h3>PvaClientChannel</h3>
|
|
||||||
<p>This provides methods for connecting to a channel and for creating instances of
|
|
||||||
PvaClientField, PvaClientProcess, ..., PvaClientPutGet.</p>
|
|
||||||
<p>Connection must be made before any create method is called or
|
|
||||||
an exception is raised.
|
|
||||||
The following is a synchronous connection request:</p>
|
|
||||||
<pre>
|
|
||||||
pvaChannel->connect(5.0); // BLOCKS AND THROWS IF NO CONNECT
|
|
||||||
</pre>
|
|
||||||
<p>This blocks until then connection is made or until timout occurs.
|
|
||||||
An exception is raised if the connection request fails.
|
|
||||||
</p>
|
|
||||||
<p>The same request can be made without blocking and without exceptions.</p>
|
|
||||||
<pre>
|
|
||||||
pvaChannel->issueConnect(); // DOES NOT BLOCK
|
|
||||||
.....
|
|
||||||
Status status =pvaChannel->waitConnect(5.0); // BLOCKS DOES NOT THROW
|
|
||||||
if(!status.isOK()) {
|
|
||||||
// failure do something
|
|
||||||
}
|
|
||||||
</pre>
|
|
||||||
<p>Once the channel is connected other PvaClient objects can be created.
|
|
||||||
For example:</p>
|
|
||||||
<pre>
|
|
||||||
PvaClientGetPtr pvaGet = pvaChannel->get(); // DOES BLOCK
|
|
||||||
</pre>
|
|
||||||
<p>This is a caching request.
|
|
||||||
If the client already has made an identical request the client will receive the
|
|
||||||
cached object.
|
|
||||||
If a new pvaGet is created than it is connected before it is returned to the client.
|
|
||||||
</p>
|
|
||||||
<p>The client can also managed it's own objects:</p>
|
|
||||||
<pre>
|
|
||||||
PvaClientGetPtr pvaGet = pvaChannel->createGet(); // DOES NOT BLOCK
|
|
||||||
</pre>
|
|
||||||
<p>The client must connect the pvaGet.</p>
|
|
||||||
|
|
||||||
<h3>PvaClientGetData</h3>
|
|
||||||
<p>This provides the data returned by pvaGet and pvaPutGet.
|
|
||||||
It is obtained via:</p>
|
|
||||||
<pre>
|
|
||||||
PvaClientGetDataPtr pvaData = pvaGet->getData();
|
|
||||||
</pre>
|
|
||||||
<p>It provides methods to get everything returned by channelGet.
|
|
||||||
In addition there are methods that make it easier to handle a value
|
|
||||||
field that is a scalar or a scalarArray.
|
|
||||||
Also for a scalar that is a double or a scalarArray with element type double.
|
|
||||||
</p>
|
|
||||||
<p>An example is:</p>
|
|
||||||
<pre>
|
|
||||||
double value = pvaData->getDouble();
|
|
||||||
</pre>
|
|
||||||
<p>It also keeps a bitSet showing which fields have changed since the last channelGet or channelPutGet.</p>
|
|
||||||
|
|
||||||
<h3>PvaClientMonitorData</h3>
|
|
||||||
<p>To the client this looks identical to PvaClientGetData except that
|
|
||||||
it provides two BitSets: changedBitSet and overrrunBitSet.
|
|
||||||
It is used by pvaMonitor.
|
|
||||||
</p>
|
|
||||||
<h3>PvaClientPutData</h3>
|
|
||||||
<p>This is used to provided data for pvaPut and pvaPutGet.
|
|
||||||
It has many of the same methods as pvaGetData.
|
|
||||||
It does not have a bitSet.
|
|
||||||
It also has put methods like:</p>
|
|
||||||
<pre>
|
|
||||||
void pvaData->putDouble(5.0);
|
|
||||||
</pre>
|
|
||||||
<h3>PvaClientGet</h3>
|
|
||||||
<p>This provides methods to connect to channelGet and to issue get request.
|
|
||||||
To connect via a single synchronous call:</p>
|
|
||||||
<pre>
|
|
||||||
eastGet->connect(); // BLOCKS AND CAN THROW
|
|
||||||
</pre>
|
|
||||||
<p>This can also be done in two steps:</p>
|
|
||||||
<pre>
|
|
||||||
pvaGet->issueConnect(); // DOES NOT BLOCK
|
|
||||||
...
|
|
||||||
Status status = pvaGet->waitConnect(); // BLOCKS AND DOES NOT HROW
|
|
||||||
</pre>
|
|
||||||
<p>Once connected gets are issued via either:</p>
|
|
||||||
<pre>
|
|
||||||
void pvaGet->get(); // BLOCKS AND CAN THROW
|
|
||||||
</pre>
|
|
||||||
or
|
|
||||||
<pre>
|
|
||||||
pvaGet->issueGet(); // DOES NOT BLOCK
|
|
||||||
...
|
|
||||||
Status status = pvaGet->waitGet(); // BLOCKS AND DOES NOT THROW
|
|
||||||
</pre>
|
|
||||||
<h3>PvaClientPut</h3>
|
|
||||||
<p>This is similar to pvaGet except that it wraps channelPut instead of channelGet.
|
|
||||||
</p>
|
|
||||||
<p>Once connected puts are issued via either:</p>
|
|
||||||
<pre>
|
|
||||||
void pvaPut->put(); // BLOCKS AND CAN THROW
|
|
||||||
</pre>
|
|
||||||
or
|
|
||||||
<pre>
|
|
||||||
pvaPut->issuePut(); // DOES NOT BLOCK
|
|
||||||
...
|
|
||||||
Status status = pvaPut->waitPut(); // BLOCKS AND DOES NOT THROW
|
|
||||||
</pre>
|
|
||||||
<h3>PvaClientMonitor</h3>
|
|
||||||
<p>Connecting is similar to pvaGet and pvaPut.
|
|
||||||
The other methods are:</p>
|
|
||||||
<dl>
|
|
||||||
<dt>start</dt>
|
|
||||||
<dd>Starts monitoring</dd>
|
|
||||||
<dt>stop</dt>
|
|
||||||
<dd>Stops monitoring</dd>
|
|
||||||
<dt>poll</dt>
|
|
||||||
<dd>polls for a monitorEvent.
|
|
||||||
The data is avalable via pvaMonitorData.
|
|
||||||
</dd>
|
|
||||||
<dt>releaseEvent</dt>
|
|
||||||
<dd>Release the data from the last poll.
|
|
||||||
Note that this must be called before another poll is requested.
|
|
||||||
</dd>
|
|
||||||
<dt>waitEvent</dt>
|
|
||||||
<dd>Block until a monitorEvent is available.
|
|
||||||
If true is returned a poll has already been issued.
|
|
||||||
</dd>
|
|
||||||
<dt>setRequester</dt>
|
|
||||||
<dd>A client callback is registered to receive notice of monitorEvents.</dd>
|
|
||||||
</dl>
|
|
||||||
<h3>PvaClientProcess</h3>
|
|
||||||
<p>Connecting is similar to pvaGet.
|
|
||||||
It has methods:</p>
|
|
||||||
<dl>
|
|
||||||
<dt>process</dt>
|
|
||||||
<dd>call issueProcess and waitProcess.</dd>
|
|
||||||
<dt>issueProcess</dt>
|
|
||||||
<dd>call channelProcess->process() and return immediately.
|
|
||||||
</dd>
|
|
||||||
<dt>waitProcess</dt>
|
|
||||||
<dd>Wait for process to complete.</dd>
|
|
||||||
</dl>
|
|
||||||
<h3>PvaClientPutGet</h3>
|
|
||||||
<p>Connecting is similar to pvaGet.
|
|
||||||
It has methods:</p>
|
|
||||||
<dl>
|
|
||||||
<dt>putGet</dt>
|
|
||||||
<dd>calls issuePutGet and waitPutGet.
|
|
||||||
throws an exception if not successfull.
|
|
||||||
</dd>
|
|
||||||
<dt>issuePutGet</dt>
|
|
||||||
<dd>
|
|
||||||
Calls channel->putGet() and returns.
|
|
||||||
</dd>
|
|
||||||
<dt>waitPutGet</dt>
|
|
||||||
<dd>
|
|
||||||
Waits until putGet completes and returns status.
|
|
||||||
</dd>
|
|
||||||
<dt>getGet,issueGetGet, and waitGetGet</dt>
|
|
||||||
<dd>Gets the data for the get part of channelPutGet.</dd>
|
|
||||||
<dt>getPut,issueGetPut,and waitGetPut</dt>
|
|
||||||
<dd>Gets the data for the put part of channelPutGet.</dd>
|
|
||||||
<dt>getPutData</dt>
|
|
||||||
<dd>
|
|
||||||
Returns the PvaClientData for the put part of channelPutGet.
|
|
||||||
</dd>
|
|
||||||
<dt>getGetData</dt>
|
|
||||||
<dd>
|
|
||||||
Returns the PvaClientData for the get part of channelPutGet.
|
|
||||||
</dd>
|
|
||||||
</dl>
|
|
||||||
<p>Look at javaDoc for details.</p>
|
|
||||||
|
|
||||||
<h2>PvaClientMultiChannel - Wrapper For Multiple Channels</h2>
|
|
||||||
<h3>PvaClientMultiChannel</h3>
|
|
||||||
<p>This provides methods for connecting to multiple channels.
|
|
||||||
</p>
|
|
||||||
<h3>PvaClientMultiGetDouble</h3>
|
|
||||||
<p>This provides support for channelGet to multiple channels where each channel has a value field that is a numeric scalar.
|
|
||||||
</p>
|
|
||||||
<h3>PvaClientMultiPutDouble</h3>
|
|
||||||
<p>This provides support for channelPut to multiple channels where each channel has a value field that is a numeric scalar.
|
|
||||||
</p>
|
|
||||||
<h3>PvaClientMultiMonitorDouble</h3>
|
|
||||||
<p>This provides support for monitoring changes to multiple channels where each channel has a value field that is a numeric scalar.
|
|
||||||
</p>
|
|
||||||
<h3>PvaClientNTMultiGet</h3>
|
|
||||||
<p>This provides support for channelGet to multiple channels where each channel has a value field that has any valid type.
|
|
||||||
</p>
|
|
||||||
<h3>PvaClientNTMultiPut</h3>
|
|
||||||
<p>This provides support for channelPut to multiple channels where each channel has a value
|
|
||||||
field that has any valid type.
|
|
||||||
</p>
|
|
||||||
<h3>PvaClientNTMultiMonitor</h3>
|
|
||||||
<p>This provides support for monitoring changes to multiple channels where each channel has a
|
|
||||||
value field that has any valid type.
|
|
||||||
</p>
|
|
||||||
<h3>PvaClientNTMultiData</h3>
|
|
||||||
<p>This provides support for monitoring changes to multiple channels where each channel has a value field that has any valid type.
|
|
||||||
The client can get the data as normative type NTMultiChannel.
|
|
||||||
</p>
|
|
||||||
|
|
||||||
</div> <!-- class="contents" -->
|
|
||||||
</body>
|
|
||||||
</html>
|
|
@ -1,13 +0,0 @@
|
|||||||
# Makefile at top of application tree
|
|
||||||
|
|
||||||
TOP = .
|
|
||||||
include $(TOP)/configure/CONFIG
|
|
||||||
|
|
||||||
DIRS += configure
|
|
||||||
|
|
||||||
DIRS += src
|
|
||||||
src_DEPEND_DIRS = configure
|
|
||||||
|
|
||||||
include $(TOP)/configure/RULES_TOP
|
|
||||||
|
|
||||||
|
|
@ -1,29 +0,0 @@
|
|||||||
# CONFIG - Load build configuration data
|
|
||||||
#
|
|
||||||
# Do not make changes to this file!
|
|
||||||
|
|
||||||
# Allow user to override where the build rules come from
|
|
||||||
RULES = $(EPICS_BASE)
|
|
||||||
|
|
||||||
# RELEASE files point to other application tops
|
|
||||||
include $(TOP)/configure/RELEASE
|
|
||||||
-include $(TOP)/configure/RELEASE.$(EPICS_HOST_ARCH).Common
|
|
||||||
ifdef T_A
|
|
||||||
-include $(TOP)/configure/RELEASE.Common.$(T_A)
|
|
||||||
-include $(TOP)/configure/RELEASE.$(EPICS_HOST_ARCH).$(T_A)
|
|
||||||
endif
|
|
||||||
|
|
||||||
CONFIG = $(RULES)/configure
|
|
||||||
include $(CONFIG)/CONFIG
|
|
||||||
|
|
||||||
# Override the Base definition:
|
|
||||||
INSTALL_LOCATION = $(TOP)
|
|
||||||
|
|
||||||
# CONFIG_SITE files contain other build configuration settings
|
|
||||||
include $(TOP)/configure/CONFIG_SITE
|
|
||||||
-include $(TOP)/configure/CONFIG_SITE.$(EPICS_HOST_ARCH).Common
|
|
||||||
ifdef T_A
|
|
||||||
-include $(TOP)/configure/CONFIG_SITE.Common.$(T_A)
|
|
||||||
-include $(TOP)/configure/CONFIG_SITE.$(EPICS_HOST_ARCH).$(T_A)
|
|
||||||
endif
|
|
||||||
|
|
@ -1,27 +0,0 @@
|
|||||||
# CONFIG_SITE
|
|
||||||
|
|
||||||
# Make any application-specific changes to the EPICS build
|
|
||||||
# configuration variables in this file.
|
|
||||||
#
|
|
||||||
# Host/target specific settings can be specified in files named
|
|
||||||
# CONFIG_SITE.$(EPICS_HOST_ARCH).Common
|
|
||||||
# CONFIG_SITE.Common.$(T_A)
|
|
||||||
# CONFIG_SITE.$(EPICS_HOST_ARCH).$(T_A)
|
|
||||||
|
|
||||||
# CHECK_RELEASE controls the consistency checking of the support
|
|
||||||
# applications pointed to by the RELEASE* files.
|
|
||||||
# Normally CHECK_RELEASE should be set to YES.
|
|
||||||
# Set CHECK_RELEASE to NO to disable checking completely.
|
|
||||||
# Set CHECK_RELEASE to WARN to perform consistency checking but
|
|
||||||
# continue building anyway if conflicts are found.
|
|
||||||
CHECK_RELEASE = WARN
|
|
||||||
|
|
||||||
# To install files into a location other than $(TOP) define
|
|
||||||
# INSTALL_LOCATION here.
|
|
||||||
#INSTALL_LOCATION=</path/name/to/install/top>
|
|
||||||
|
|
||||||
INSTALL_INCLUDE = $(INSTALL_LOCATION)/include/pv
|
|
||||||
USR_INCLUDES += -I $(INSTALL_LOCATION)/include
|
|
||||||
|
|
||||||
-include $(TOP)/../../CONFIG_SITE.local
|
|
||||||
-include $(TOP)/../configure/CONFIG_SITE.local
|
|
@ -1,7 +0,0 @@
|
|||||||
EPICS_BASE=/home/install/epics/base
|
|
||||||
TEMPLATE_TOP=$(EPICS_BASE)/templates/makeBaseApp/top
|
|
||||||
EPICSV4HOME=/home/hg
|
|
||||||
PVCOMMON=${EPICSV4HOME}/pvCommonCPP
|
|
||||||
PVDATA=${EPICSV4HOME}/pvDataCPP
|
|
||||||
PVACCESS=${EPICSV4HOME}/pvAccessCPP
|
|
||||||
EASYPVA==${EPICSV4HOME}/easyPVACPP
|
|
@ -1,8 +0,0 @@
|
|||||||
TOP=..
|
|
||||||
|
|
||||||
include $(TOP)/configure/CONFIG
|
|
||||||
|
|
||||||
TARGETS = $(CONFIG_TARGETS)
|
|
||||||
CONFIGS += $(subst ../,,$(wildcard $(CONFIG_INSTALLS)))
|
|
||||||
|
|
||||||
include $(TOP)/configure/RULES
|
|
@ -1,41 +0,0 @@
|
|||||||
# pvDatabaseCPP/example RELEASE - Location of external support modules
|
|
||||||
#
|
|
||||||
# IF YOU CHANGE this file or any file it includes you must
|
|
||||||
# subsequently do a "gnumake rebuild" in the application's
|
|
||||||
# top level directory.
|
|
||||||
#
|
|
||||||
# The build process does not check dependencies against files
|
|
||||||
# that are outside this application, thus you should also do a
|
|
||||||
# "gnumake rebuild" in the top level directory after EPICS_BASE
|
|
||||||
# or any other external module pointed to below is rebuilt.
|
|
||||||
#
|
|
||||||
# Host- or target-specific settings can be given in files named
|
|
||||||
# RELEASE.$(EPICS_HOST_ARCH).Common
|
|
||||||
# RELEASE.Common.$(T_A)
|
|
||||||
# RELEASE.$(EPICS_HOST_ARCH).$(T_A)
|
|
||||||
|
|
||||||
# EPICS V4 Developers: Do not edit the locations in this file!
|
|
||||||
#
|
|
||||||
# Create a file RELEASE.local pointing to your PVASRV, PVACCESS,
|
|
||||||
# PVDATA, PVCOMMON and EPICS_BASE build directories, e.g.
|
|
||||||
# PVASRV = /path/to/epics/pvaSrvCPP
|
|
||||||
# PVACCESS = /path/to/epics/pvAccessCPP
|
|
||||||
# PVDATA = /path/to/epics/pvDataCPP
|
|
||||||
# PVCOMMON = /path/to/epics/pvCommonCPP
|
|
||||||
# EPICS_BASE = /path/to/epics/base
|
|
||||||
|
|
||||||
# If this example is built in a directory under pvDatabaseCPP,
|
|
||||||
# use the following definitions:
|
|
||||||
|
|
||||||
EASYPVA = $(TOP)/..
|
|
||||||
|
|
||||||
-include $(TOP)/../configure/RELEASE.local
|
|
||||||
-include $(TOP)/../../RELEASE.local
|
|
||||||
|
|
||||||
# If you copied this example from pvDatabaseCPP to be built as a
|
|
||||||
# standalone TOP, adjust and use the following definitions:
|
|
||||||
|
|
||||||
#EASYPVA = /path/to/epics/easyPVACPP
|
|
||||||
|
|
||||||
#-include $(TOP)/../RELEASE.local
|
|
||||||
#-include $(TOP)/configure/RELEASE.local
|
|
@ -1,6 +0,0 @@
|
|||||||
# RULES
|
|
||||||
|
|
||||||
include $(CONFIG)/RULES
|
|
||||||
|
|
||||||
# Library should be rebuilt because LIBOBJS may have changed.
|
|
||||||
$(LIBNAME): ../Makefile
|
|
@ -1,2 +0,0 @@
|
|||||||
#RULES.ioc
|
|
||||||
include $(CONFIG)/RULES.ioc
|
|
@ -1,2 +0,0 @@
|
|||||||
#RULES_DIRS
|
|
||||||
include $(CONFIG)/RULES_DIRS
|
|
@ -1,3 +0,0 @@
|
|||||||
#RULES_TOP
|
|
||||||
include $(CONFIG)/RULES_TOP
|
|
||||||
|
|
@ -1,84 +0,0 @@
|
|||||||
TOP=..
|
|
||||||
|
|
||||||
include $(TOP)/configure/CONFIG
|
|
||||||
#----------------------------------------
|
|
||||||
# ADD MACRO DEFINITIONS AFTER THIS LINE
|
|
||||||
|
|
||||||
|
|
||||||
PROD_HOST += examplePvaClientProcess
|
|
||||||
examplePvaClientProcess_SRCS += examplePvaClientProcess.cpp
|
|
||||||
examplePvaClientProcess_LIBS += pvaClient
|
|
||||||
examplePvaClientProcess_LIBS += pvAccess
|
|
||||||
examplePvaClientProcess_LIBS += nt
|
|
||||||
examplePvaClientProcess_LIBS += pvData
|
|
||||||
examplePvaClientProcess_LIBS += ca
|
|
||||||
examplePvaClientProcess_LIBS += Com
|
|
||||||
|
|
||||||
PROD_HOST += examplePvaClientGet
|
|
||||||
examplePvaClientGet_SRCS += examplePvaClientGet.cpp
|
|
||||||
examplePvaClientGet_LIBS += pvaClient
|
|
||||||
examplePvaClientGet_LIBS += pvAccess
|
|
||||||
examplePvaClientGet_LIBS += nt
|
|
||||||
examplePvaClientGet_LIBS += pvData
|
|
||||||
examplePvaClientGet_LIBS += ca
|
|
||||||
examplePvaClientGet_LIBS += Com
|
|
||||||
|
|
||||||
PROD_HOST += examplePvaClientPut
|
|
||||||
examplePvaClientPut_SRCS += examplePvaClientPut.cpp
|
|
||||||
examplePvaClientPut_LIBS += pvaClient
|
|
||||||
examplePvaClientPut_LIBS += pvAccess
|
|
||||||
examplePvaClientPut_LIBS += nt
|
|
||||||
examplePvaClientPut_LIBS += pvData
|
|
||||||
examplePvaClientPut_LIBS += ca
|
|
||||||
examplePvaClientPut_LIBS += Com
|
|
||||||
|
|
||||||
PROD_HOST += examplePvaClientMonitor
|
|
||||||
examplePvaClientMonitor_SRCS += examplePvaClientMonitor.cpp
|
|
||||||
examplePvaClientMonitor_LIBS += pvaClient
|
|
||||||
examplePvaClientMonitor_LIBS += pvAccess
|
|
||||||
examplePvaClientMonitor_LIBS += nt
|
|
||||||
examplePvaClientMonitor_LIBS += pvData
|
|
||||||
examplePvaClientMonitor_LIBS += ca
|
|
||||||
examplePvaClientMonitor_LIBS += Com
|
|
||||||
|
|
||||||
PROD_HOST += examplePvaClientMultiDouble
|
|
||||||
examplePvaClientMultiDouble_SRCS += examplePvaClientMultiDouble.cpp
|
|
||||||
examplePvaClientMultiDouble_LIBS += pvaClient
|
|
||||||
examplePvaClientMultiDouble_LIBS += pvAccess
|
|
||||||
examplePvaClientMultiDouble_LIBS += nt
|
|
||||||
examplePvaClientMultiDouble_LIBS += pvData
|
|
||||||
examplePvaClientMultiDouble_LIBS += ca
|
|
||||||
examplePvaClientMultiDouble_LIBS += Com
|
|
||||||
|
|
||||||
PROD_HOST += examplePvaClientNTMulti
|
|
||||||
examplePvaClientNTMulti_SRCS += examplePvaClientNTMulti.cpp
|
|
||||||
examplePvaClientNTMulti_LIBS += pvaClient
|
|
||||||
examplePvaClientNTMulti_LIBS += pvAccess
|
|
||||||
examplePvaClientNTMulti_LIBS += nt
|
|
||||||
examplePvaClientNTMulti_LIBS += pvData
|
|
||||||
examplePvaClientNTMulti_LIBS += ca
|
|
||||||
examplePvaClientNTMulti_LIBS += Com
|
|
||||||
|
|
||||||
PROD_HOST += helloWorldRPC
|
|
||||||
helloWorldRPC_SRCS += helloWorldRPC.cpp
|
|
||||||
helloWorldRPC_LIBS += pvaClient
|
|
||||||
helloWorldRPC_LIBS += pvAccess
|
|
||||||
helloWorldRPC_LIBS += nt
|
|
||||||
helloWorldRPC_LIBS += pvData
|
|
||||||
helloWorldRPC_LIBS += Com
|
|
||||||
|
|
||||||
PROD_HOST += helloWorldPutGet
|
|
||||||
helloWorldPutGet_SRCS += helloWorldPutGet.cpp
|
|
||||||
helloWorldPutGet_LIBS += pvaClient
|
|
||||||
helloWorldPutGet_LIBS += pvAccess
|
|
||||||
helloWorldPutGet_LIBS += nt
|
|
||||||
helloWorldPutGet_LIBS += pvData
|
|
||||||
helloWorldPutGet_LIBS += ca
|
|
||||||
helloWorldPutGet_LIBS += Com
|
|
||||||
|
|
||||||
#===========================
|
|
||||||
|
|
||||||
include $(TOP)/configure/RULES
|
|
||||||
#----------------------------------------
|
|
||||||
# ADD RULES AFTER THIS LINE
|
|
||||||
|
|
@ -1,146 +0,0 @@
|
|||||||
/*examplePvaClientGet.cpp */
|
|
||||||
/**
|
|
||||||
* Copyright - See the COPYRIGHT that is included with this distribution.
|
|
||||||
* EPICS pvData is distributed subject to a Software License Agreement found
|
|
||||||
* in file LICENSE that is included with this distribution.
|
|
||||||
*/
|
|
||||||
/**
|
|
||||||
* @author mrk
|
|
||||||
*/
|
|
||||||
|
|
||||||
/* Author: Marty Kraimer */
|
|
||||||
|
|
||||||
#include <iostream>
|
|
||||||
|
|
||||||
#include <pv/pvaClient.h>
|
|
||||||
|
|
||||||
using namespace std;
|
|
||||||
using namespace epics::pvData;
|
|
||||||
using namespace epics::pvAccess;
|
|
||||||
using namespace epics::pvaClient;
|
|
||||||
|
|
||||||
|
|
||||||
static void exampleDouble(PvaClientPtr const &pva)
|
|
||||||
{
|
|
||||||
cout << "example double scalar\n";
|
|
||||||
double value;
|
|
||||||
try {
|
|
||||||
cout << "short way\n";
|
|
||||||
value = pva->channel("exampleDouble")->get()->getData()->getDouble();
|
|
||||||
cout << "as double " << value << endl;
|
|
||||||
} catch (std::runtime_error e) {
|
|
||||||
cout << "exception " << e.what() << endl;
|
|
||||||
}
|
|
||||||
cout << "long way\n";
|
|
||||||
PvaClientChannelPtr pvaChannel = pva->createChannel("exampleDouble");
|
|
||||||
pvaChannel->issueConnect();
|
|
||||||
Status status = pvaChannel->waitConnect(2.0);
|
|
||||||
if(!status.isOK()) {cout << " connect failed\n"; return;}
|
|
||||||
PvaClientGetPtr pvaGet = pvaChannel->createGet();
|
|
||||||
pvaGet->issueConnect();
|
|
||||||
status = pvaGet->waitConnect();
|
|
||||||
if(!status.isOK()) {cout << " createGet failed\n"; return;}
|
|
||||||
PvaClientGetDataPtr pvaData = pvaGet->getData();
|
|
||||||
value = pvaData->getDouble();
|
|
||||||
cout << "as double " << value << endl;
|
|
||||||
}
|
|
||||||
|
|
||||||
static void exampleDoubleArray(PvaClientPtr const &pva)
|
|
||||||
{
|
|
||||||
cout << "example double array\n";
|
|
||||||
shared_vector<const double> value;
|
|
||||||
try {
|
|
||||||
cout << "short way\n";
|
|
||||||
value = pva->channel("exampleDoubleArray")->get()->getData()->getDoubleArray();
|
|
||||||
cout << "as doubleArray " << value << endl;
|
|
||||||
} catch (std::runtime_error e) {
|
|
||||||
cout << "exception " << e.what() << endl;
|
|
||||||
}
|
|
||||||
try {
|
|
||||||
cout << "long way\n";
|
|
||||||
PvaClientChannelPtr pvaChannel = pva->createChannel("exampleDoubleArray");
|
|
||||||
pvaChannel->connect(2.0);
|
|
||||||
PvaClientGetPtr pvaGet = pvaChannel->createGet();
|
|
||||||
PvaClientGetDataPtr pvaData = pvaGet->getData();
|
|
||||||
value = pvaData->getDoubleArray();
|
|
||||||
cout << "as doubleArray " << value << endl;
|
|
||||||
} catch (std::runtime_error e) {
|
|
||||||
cout << "exception " << e.what() << endl;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
static void examplePowerSupply(PvaClientPtr const &pva)
|
|
||||||
{
|
|
||||||
cout << "example powerSupply\n";
|
|
||||||
PVStructurePtr pvStructure;
|
|
||||||
try {
|
|
||||||
cout << "short way\n";
|
|
||||||
pvStructure = pva->channel("examplePowerSupply")->
|
|
||||||
get("field()")->getData()->getPVStructure();
|
|
||||||
cout << pvStructure << endl;
|
|
||||||
} catch (std::runtime_error e) {
|
|
||||||
cout << "exception " << e.what() << endl;
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
static void exampleCADouble(PvaClientPtr const &pva)
|
|
||||||
{
|
|
||||||
cout << "example double scalar\n";
|
|
||||||
double value;
|
|
||||||
try {
|
|
||||||
cout << "short way\n";
|
|
||||||
value = pva->channel("double00","ca",5.0)->get()->getData()->getDouble();
|
|
||||||
cout << "as double " << value << endl;
|
|
||||||
} catch (std::runtime_error e) {
|
|
||||||
cout << "exception " << e.what() << endl;
|
|
||||||
}
|
|
||||||
cout << "long way\n";
|
|
||||||
PvaClientChannelPtr pvaChannel = pva->createChannel("double00","ca");
|
|
||||||
pvaChannel->issueConnect();
|
|
||||||
Status status = pvaChannel->waitConnect(2.0);
|
|
||||||
if(!status.isOK()) {cout << " connect failed\n"; return;}
|
|
||||||
PvaClientGetPtr pvaGet = pvaChannel->createGet();
|
|
||||||
pvaGet->issueConnect();
|
|
||||||
status = pvaGet->waitConnect();
|
|
||||||
if(!status.isOK()) {cout << " createGet failed\n"; return;}
|
|
||||||
PvaClientGetDataPtr pvaData = pvaGet->getData();
|
|
||||||
value = pvaData->getDouble();
|
|
||||||
cout << "as double " << value << endl;
|
|
||||||
}
|
|
||||||
|
|
||||||
static void exampleCADoubleArray(PvaClientPtr const &pva)
|
|
||||||
{
|
|
||||||
cout << "example double array\n";
|
|
||||||
shared_vector<const double> value;
|
|
||||||
try {
|
|
||||||
cout << "short way\n";
|
|
||||||
value = pva->channel("doubleArray","ca",5.0)->get()->getData()->getDoubleArray();
|
|
||||||
cout << "as doubleArray " << value << endl;
|
|
||||||
} catch (std::runtime_error e) {
|
|
||||||
cout << "exception " << e.what() << endl;
|
|
||||||
}
|
|
||||||
try {
|
|
||||||
cout << "long way\n";
|
|
||||||
PvaClientChannelPtr pvaChannel = pva->createChannel("doubleArray","ca");
|
|
||||||
pvaChannel->connect(2.0);
|
|
||||||
PvaClientGetPtr pvaGet = pvaChannel->createGet();
|
|
||||||
PvaClientGetDataPtr pvaData = pvaGet->getData();
|
|
||||||
value = pvaData->getDoubleArray();
|
|
||||||
cout << "as doubleArray " << value << endl;
|
|
||||||
} catch (std::runtime_error e) {
|
|
||||||
cout << "exception " << e.what() << endl;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
int main(int argc,char *argv[])
|
|
||||||
{
|
|
||||||
PvaClientPtr pva= PvaClient::create();
|
|
||||||
exampleDouble(pva);
|
|
||||||
exampleDoubleArray(pva);
|
|
||||||
examplePowerSupply(pva);
|
|
||||||
exampleCADouble(pva);
|
|
||||||
exampleCADoubleArray(pva);
|
|
||||||
cout << "done\n";
|
|
||||||
return 0;
|
|
||||||
}
|
|
@ -1,61 +0,0 @@
|
|||||||
/*examplePvaClientMonitor.cpp */
|
|
||||||
/**
|
|
||||||
* Copyright - See the COPYRIGHT that is included with this distribution.
|
|
||||||
* EPICS pvData is distributed subject to a Software License Agreement found
|
|
||||||
* in file LICENSE that is included with this distribution.
|
|
||||||
*/
|
|
||||||
/**
|
|
||||||
* @author mrk
|
|
||||||
*/
|
|
||||||
|
|
||||||
/* Author: Marty Kraimer */
|
|
||||||
|
|
||||||
#include <epicsThread.h>
|
|
||||||
|
|
||||||
#include <iostream>
|
|
||||||
|
|
||||||
#include <pv/pvaClient.h>
|
|
||||||
|
|
||||||
using namespace std;
|
|
||||||
using namespace epics::pvData;
|
|
||||||
using namespace epics::pvAccess;
|
|
||||||
using namespace epics::pvaClient;
|
|
||||||
|
|
||||||
|
|
||||||
static void exampleMonitor(PvaClientPtr const &pva,string provider)
|
|
||||||
{
|
|
||||||
PvaClientMonitorPtr monitor = pva->channel("double00",provider,2.0)->monitor("");
|
|
||||||
PvaClientMonitorDataPtr monitorData = monitor->getData();
|
|
||||||
PvaClientPutPtr put = pva->channel("double00",provider,2.0)->put("");
|
|
||||||
PvaClientPutDataPtr putData = put->getData();
|
|
||||||
for(size_t ntimes=0; ntimes<5; ++ntimes)
|
|
||||||
{
|
|
||||||
double value = ntimes;
|
|
||||||
cout << "put " << value << endl;
|
|
||||||
putData->putDouble(value); put->put();
|
|
||||||
if(!monitor->waitEvent(.1)) {
|
|
||||||
cout << "waitEvent returned false. Why???";
|
|
||||||
continue;
|
|
||||||
} else while(true) {
|
|
||||||
cout << "monitor " << monitorData->getDouble() << endl;
|
|
||||||
cout << "changed\n";
|
|
||||||
monitorData->showChanged(cout);
|
|
||||||
cout << "overrun\n";
|
|
||||||
monitorData->showOverrun(cout);
|
|
||||||
monitor->releaseEvent();
|
|
||||||
if(!monitor->poll()) break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
int main(int argc,char *argv[])
|
|
||||||
{
|
|
||||||
PvaClientPtr pva = PvaClient::create();
|
|
||||||
cout << "exampleMonitor pva\n";
|
|
||||||
exampleMonitor(pva,"pva");
|
|
||||||
cout << "exampleMonitor ca\n";
|
|
||||||
exampleMonitor(pva,"ca");
|
|
||||||
cout << "done\n";
|
|
||||||
return 0;
|
|
||||||
}
|
|
@ -1,79 +0,0 @@
|
|||||||
/*examplePvaClientMultiDouble.cpp */
|
|
||||||
/**
|
|
||||||
* Copyright - See the COPYRIGHT that is included with this distribution.
|
|
||||||
* EPICS pvData is distributed subject to a Software License Agreement found
|
|
||||||
* in file LICENSE that is included with this distribution.
|
|
||||||
*/
|
|
||||||
/**
|
|
||||||
* @author mrk
|
|
||||||
*/
|
|
||||||
|
|
||||||
/* Author: Marty Kraimer */
|
|
||||||
|
|
||||||
#include <iostream>
|
|
||||||
|
|
||||||
#include <pv/pvaClientMultiChannel.h>
|
|
||||||
|
|
||||||
using namespace std;
|
|
||||||
using namespace epics::pvData;
|
|
||||||
using namespace epics::pvAccess;
|
|
||||||
using namespace epics::pvaClient;
|
|
||||||
|
|
||||||
static void example(
|
|
||||||
PvaClientPtr const &pva,
|
|
||||||
string provider,
|
|
||||||
shared_vector<const string> const &channelNames)
|
|
||||||
{
|
|
||||||
|
|
||||||
size_t num = channelNames.size();
|
|
||||||
cout << "num " << num << " names " << channelNames << endl;
|
|
||||||
PvaClientMultiChannelPtr multiChannel(
|
|
||||||
PvaClientMultiChannel::create(pva,channelNames,provider));
|
|
||||||
PvaClientMultiGetDoublePtr multiGet(multiChannel->createGet());
|
|
||||||
PvaClientMultiPutDoublePtr multiPut(multiChannel->createPut());
|
|
||||||
PvaClientMultiMonitorDoublePtr multiMonitor(multiChannel->createMonitor());
|
|
||||||
shared_vector<double> data(num,0);
|
|
||||||
for(double value = 0.2; value< 2.3; value+= 1.0) {
|
|
||||||
try {
|
|
||||||
for(size_t i=0; i<num; ++i) data[i] = value + i;
|
|
||||||
cout << "put " << data << endl;
|
|
||||||
multiPut->put(data);
|
|
||||||
data = multiGet->get();
|
|
||||||
cout << "get " << data << endl;
|
|
||||||
bool result = multiMonitor->waitEvent(.1);
|
|
||||||
while(result) {
|
|
||||||
cout << "monitor data " << multiMonitor->get() << endl;
|
|
||||||
result = multiMonitor->poll();
|
|
||||||
}
|
|
||||||
} catch (std::runtime_error e) {
|
|
||||||
cout << "exception " << e.what() << endl;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
int main(int argc,char *argv[])
|
|
||||||
{
|
|
||||||
PvaClientPtr pva = PvaClient::create();
|
|
||||||
size_t num = 5;
|
|
||||||
shared_vector<string> channelNames(num);
|
|
||||||
channelNames[0] = "double01";
|
|
||||||
channelNames[1] = "int01";
|
|
||||||
channelNames[2] = "double03";
|
|
||||||
channelNames[3] = "double04";
|
|
||||||
channelNames[4] = "double05";
|
|
||||||
cout << "double pva\n";
|
|
||||||
shared_vector<const string> names(freeze(channelNames));
|
|
||||||
example(pva,"pva",names);
|
|
||||||
cout << "double ca\n";
|
|
||||||
example(pva,"ca",names);
|
|
||||||
channelNames = shared_vector<string>(num);
|
|
||||||
channelNames[0] = "exampleDouble01";
|
|
||||||
channelNames[1] = "exampleInt";
|
|
||||||
channelNames[2] = "exampleDouble03";
|
|
||||||
channelNames[3] = "exampleDouble04";
|
|
||||||
channelNames[4] = "exampleDouble05";
|
|
||||||
names = freeze(channelNames);
|
|
||||||
cout << "exampleDouble pva\n";
|
|
||||||
example(pva,"pva",names);
|
|
||||||
return 0;
|
|
||||||
}
|
|
@ -1,141 +0,0 @@
|
|||||||
/*examplePvaClientNTMulti.cpp */
|
|
||||||
/**
|
|
||||||
* Copyright - See the COPYRIGHT that is included with this distribution.
|
|
||||||
* EPICS pvData is distributed subject to a Software License Agreement found
|
|
||||||
* in file LICENSE that is included with this distribution.
|
|
||||||
*/
|
|
||||||
/**
|
|
||||||
* @author mrk
|
|
||||||
*/
|
|
||||||
|
|
||||||
/* Author: Marty Kraimer */
|
|
||||||
|
|
||||||
#include <iostream>
|
|
||||||
|
|
||||||
#include <pv/pvaClientMultiChannel.h>
|
|
||||||
#include <pv/convert.h>
|
|
||||||
|
|
||||||
using std::tr1::static_pointer_cast;
|
|
||||||
using namespace std;
|
|
||||||
using namespace epics::pvData;
|
|
||||||
using namespace epics::pvAccess;
|
|
||||||
using namespace epics::pvaClient;
|
|
||||||
|
|
||||||
static PVDataCreatePtr pvDataCreate = getPVDataCreate();
|
|
||||||
static ConvertPtr convert = getConvert();
|
|
||||||
|
|
||||||
static void setValue(PVUnionPtr const &pvUnion, double value)
|
|
||||||
{
|
|
||||||
UnionConstPtr u = pvUnion->getUnion();
|
|
||||||
FieldConstPtr field = u->getField(0);
|
|
||||||
Type type = field->getType();
|
|
||||||
if(type==scalar) {
|
|
||||||
ScalarConstPtr scalar = static_pointer_cast<const Scalar>(field);
|
|
||||||
ScalarType scalarType = scalar->getScalarType();
|
|
||||||
if(scalarType==pvDouble) {
|
|
||||||
PVDoublePtr pvValue = static_pointer_cast<PVDouble>(
|
|
||||||
pvDataCreate->createPVScalar(pvDouble));
|
|
||||||
pvValue->put(value);
|
|
||||||
pvUnion->set(0,pvValue);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
if(scalarType==pvString) {
|
|
||||||
PVStringPtr pvValue = static_pointer_cast<PVString>(
|
|
||||||
pvDataCreate->createPVScalar(pvString));
|
|
||||||
stringstream ss;
|
|
||||||
ss << "value" << value;
|
|
||||||
pvValue->put(ss.str());
|
|
||||||
pvUnion->set(0,pvValue);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
throw std::runtime_error("only pvDouble and pvString are supported");
|
|
||||||
}
|
|
||||||
if(type==scalarArray) {
|
|
||||||
ScalarArrayConstPtr scalarArray = static_pointer_cast<const ScalarArray>(field);
|
|
||||||
ScalarType scalarType = scalarArray->getElementType();
|
|
||||||
if(scalarType==pvDouble) {
|
|
||||||
size_t num = 5;
|
|
||||||
PVDoubleArrayPtr pvValue = static_pointer_cast<PVDoubleArray>(
|
|
||||||
pvDataCreate->createPVScalarArray(pvDouble));
|
|
||||||
shared_vector<double> data(num);
|
|
||||||
for(size_t i=0; i<num; ++i) data[i] = value +i;
|
|
||||||
pvValue->replace(freeze(data));
|
|
||||||
pvUnion->set(0,pvValue);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
if(scalarType==pvString) {
|
|
||||||
size_t num = 5;
|
|
||||||
PVStringArrayPtr pvValue = static_pointer_cast<PVStringArray>(
|
|
||||||
pvDataCreate->createPVScalarArray(pvString));
|
|
||||||
shared_vector<string> data(num);
|
|
||||||
for(size_t i=0; i<num; ++i) {
|
|
||||||
stringstream ss;
|
|
||||||
ss << "value" << value << i;
|
|
||||||
data[i] = ss.str();
|
|
||||||
}
|
|
||||||
pvValue->replace(freeze(data));
|
|
||||||
pvUnion->set(0,pvValue);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
throw std::runtime_error("only pvDouble and pvString are supported");
|
|
||||||
}
|
|
||||||
throw std::runtime_error("only scalar and scalarArray fields are supported");
|
|
||||||
}
|
|
||||||
|
|
||||||
static void example(
|
|
||||||
PvaClientPtr const &pva,
|
|
||||||
string provider,
|
|
||||||
shared_vector<const string> const &channelNames)
|
|
||||||
{
|
|
||||||
|
|
||||||
size_t num = channelNames.size();
|
|
||||||
PvaClientMultiChannelPtr multiChannel(
|
|
||||||
PvaClientMultiChannel::create(pva,channelNames,provider));
|
|
||||||
PvaClientNTMultiGetPtr multiGet(multiChannel->createNTGet());
|
|
||||||
PvaClientNTMultiPutPtr multiPut(multiChannel->createNTPut());
|
|
||||||
PvaClientNTMultiMonitorPtr multiMonitor(multiChannel->createNTMonitor());
|
|
||||||
shared_vector<epics::pvData::PVUnionPtr> data = multiPut->getValues();
|
|
||||||
for(double value = 0.0; value< 2.1; value+= 1.0) {
|
|
||||||
for(size_t i=0; i<num ; ++i) {
|
|
||||||
PVUnionPtr pvUnion = data[i];
|
|
||||||
setValue(pvUnion,value);
|
|
||||||
}
|
|
||||||
multiPut->put();
|
|
||||||
multiGet->get();
|
|
||||||
PvaClientNTMultiDataPtr multiData = multiGet->getData();
|
|
||||||
PVStructurePtr pvStructure = multiData->getNTMultiChannel()->getPVStructure();
|
|
||||||
cout << "pvStructure\n" << pvStructure << endl;
|
|
||||||
bool result = multiMonitor->waitEvent(.1);
|
|
||||||
while(result) {
|
|
||||||
multiData = multiMonitor->getData();
|
|
||||||
pvStructure = multiData->getNTMultiChannel()->getPVStructure();
|
|
||||||
cout << "monitor pvStructure\n" << pvStructure << endl;
|
|
||||||
result = multiMonitor->poll();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
int main(int argc,char *argv[])
|
|
||||||
{
|
|
||||||
PvaClientPtr pva = PvaClient::create();
|
|
||||||
size_t num = 4;
|
|
||||||
shared_vector<string> channelNames(num);
|
|
||||||
channelNames[0] = "double01";
|
|
||||||
channelNames[1] = "string01";
|
|
||||||
channelNames[2] = "doubleArray01";
|
|
||||||
channelNames[3] = "stringArray01";
|
|
||||||
cout << "dbRecord pva\n";
|
|
||||||
shared_vector<const string> names(freeze(channelNames));
|
|
||||||
example(pva,"pva",names);
|
|
||||||
cout << "dbRecord ca\n";
|
|
||||||
example(pva,"ca",names);
|
|
||||||
channelNames = shared_vector<string>(num);
|
|
||||||
channelNames[0] = "exampleDouble";
|
|
||||||
channelNames[1] = "exampleString";
|
|
||||||
channelNames[2] = "exampleDoubleArray";
|
|
||||||
channelNames[3] = "exampleStringArray";
|
|
||||||
names = freeze(channelNames);
|
|
||||||
cout << "pvRecord pva\n";
|
|
||||||
example(pva,"pva",names);
|
|
||||||
return 0;
|
|
||||||
}
|
|
@ -1,44 +0,0 @@
|
|||||||
/*examplePvaClientProcess.cpp */
|
|
||||||
/**
|
|
||||||
* Copyright - See the COPYRIGHT that is included with this distribution.
|
|
||||||
* EPICS pvData is distributed subject to a Software License Agreement found
|
|
||||||
* in file LICENSE that is included with this distribution.
|
|
||||||
*/
|
|
||||||
/**
|
|
||||||
* @author mrk
|
|
||||||
*/
|
|
||||||
|
|
||||||
/* Author: Marty Kraimer */
|
|
||||||
|
|
||||||
#include <iostream>
|
|
||||||
|
|
||||||
#include <pv/pvaClient.h>
|
|
||||||
|
|
||||||
using namespace std;
|
|
||||||
using namespace epics::pvData;
|
|
||||||
using namespace epics::pvAccess;
|
|
||||||
using namespace epics::pvaClient;
|
|
||||||
|
|
||||||
|
|
||||||
static void exampleProcess(PvaClientPtr const &pva)
|
|
||||||
{
|
|
||||||
cout << "example process\n";
|
|
||||||
PvaClientChannelPtr channel = pva->channel("exampleDouble");
|
|
||||||
PvaClientProcessPtr process = channel->createProcess();
|
|
||||||
try {
|
|
||||||
process->process();
|
|
||||||
cout << channel->get("field()")->getData()->showChanged(cout) << endl;
|
|
||||||
process->process();
|
|
||||||
cout << channel->get("field()")->getData()->showChanged(cout) << endl;
|
|
||||||
} catch (std::runtime_error e) {
|
|
||||||
cout << "exception " << e.what() << endl;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
int main(int argc,char *argv[])
|
|
||||||
{
|
|
||||||
PvaClientPtr pva = PvaClient::create();
|
|
||||||
exampleProcess(pva);
|
|
||||||
return 0;
|
|
||||||
}
|
|
@ -1,77 +0,0 @@
|
|||||||
/*examplePvaClientPut.cpp */
|
|
||||||
/**
|
|
||||||
* Copyright - See the COPYRIGHT that is included with this distribution.
|
|
||||||
* EPICS pvData is distributed subject to a Software License Agreement found
|
|
||||||
* in file LICENSE that is included with this distribution.
|
|
||||||
*/
|
|
||||||
/**
|
|
||||||
* @author mrk
|
|
||||||
*/
|
|
||||||
|
|
||||||
/* Author: Marty Kraimer */
|
|
||||||
|
|
||||||
#include <iostream>
|
|
||||||
|
|
||||||
#include <pv/pvaClient.h>
|
|
||||||
#include <pv/convert.h>
|
|
||||||
|
|
||||||
using std::tr1::static_pointer_cast;
|
|
||||||
using namespace std;
|
|
||||||
using namespace epics::pvData;
|
|
||||||
using namespace epics::pvAccess;
|
|
||||||
using namespace epics::pvaClient;
|
|
||||||
|
|
||||||
static ConvertPtr convert = getConvert();
|
|
||||||
|
|
||||||
|
|
||||||
static void examplePut(PvaClientPtr const &pva)
|
|
||||||
{
|
|
||||||
cout << "example put\n";
|
|
||||||
PvaClientChannelPtr channel = pva->channel("exampleDouble");
|
|
||||||
PvaClientPutPtr put = channel->put();
|
|
||||||
PvaClientPutDataPtr putData = put->getData();
|
|
||||||
PvaClientMonitorPtr monitor = pva->channel("exampleDouble")->monitor("");
|
|
||||||
PvaClientMonitorDataPtr monitorData = monitor->getData();
|
|
||||||
try {
|
|
||||||
putData->putDouble(3.0); put->put();
|
|
||||||
cout << channel->get("field()")->getData()->showChanged(cout) << endl;
|
|
||||||
putData->putDouble(4.0); put->put();
|
|
||||||
cout << channel->get("field()")->getData()->showChanged(cout) << endl;
|
|
||||||
if(!monitor->waitEvent()) {
|
|
||||||
cout << "waitEvent returned false. Why???";
|
|
||||||
} else while(true) {
|
|
||||||
cout << "monitor changed\n" << monitorData->showChanged(cout);
|
|
||||||
monitor->releaseEvent();
|
|
||||||
if(!monitor->poll()) break;
|
|
||||||
}
|
|
||||||
} catch (std::runtime_error e) {
|
|
||||||
cout << "exception " << e.what() << endl;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
static void examplePVFieldPut(PvaClientPtr const &pva)
|
|
||||||
{
|
|
||||||
cout << "example put\n";
|
|
||||||
PvaClientChannelPtr channel = pva->channel("exampleDouble");
|
|
||||||
PvaClientPutPtr put = channel->put();
|
|
||||||
PvaClientPutDataPtr putData = put->getData();
|
|
||||||
PVFieldPtr pvField = putData->getValue();
|
|
||||||
PVScalarPtr pvScalar = static_pointer_cast<PVScalar>(pvField);
|
|
||||||
try {
|
|
||||||
convert->fromDouble(pvScalar,1.0); put->put();
|
|
||||||
cout << channel->get("field()")->getData()->showChanged(cout) << endl;
|
|
||||||
convert->fromDouble(pvScalar,2.0); put->put();
|
|
||||||
cout << channel->get("field()")->getData()->showChanged(cout) << endl;
|
|
||||||
} catch (std::runtime_error e) {
|
|
||||||
cout << "exception " << e.what() << endl;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
int main(int argc,char *argv[])
|
|
||||||
{
|
|
||||||
PvaClientPtr pva = PvaClient::create();
|
|
||||||
examplePut(pva);
|
|
||||||
examplePVFieldPut(pva);
|
|
||||||
return 0;
|
|
||||||
}
|
|
@ -1,48 +0,0 @@
|
|||||||
/*helloWorldPutGet.cpp */
|
|
||||||
/**
|
|
||||||
* Copyright - See the COPYRIGHT that is included with this distribution.
|
|
||||||
* EPICS pvData is distributed subject to a Software License Agreement found
|
|
||||||
* in file LICENSE that is included with this distribution.
|
|
||||||
*/
|
|
||||||
/**
|
|
||||||
* @author mrk
|
|
||||||
*/
|
|
||||||
|
|
||||||
/* Author: Marty Kraimer */
|
|
||||||
|
|
||||||
#include <iostream>
|
|
||||||
|
|
||||||
#include <pv/pvaClient.h>
|
|
||||||
|
|
||||||
using namespace std;
|
|
||||||
using namespace epics::pvData;
|
|
||||||
using namespace epics::pvAccess;
|
|
||||||
using namespace epics::pvaClient;
|
|
||||||
|
|
||||||
|
|
||||||
static void example(PvaClientPtr const &pva)
|
|
||||||
{
|
|
||||||
cout << "helloWorldPutGet\n";
|
|
||||||
try {
|
|
||||||
PvaClientChannelPtr channel = pva->channel("exampleHello");
|
|
||||||
PvaClientPutGetPtr putGet = channel->createPutGet();
|
|
||||||
putGet->connect();
|
|
||||||
PvaClientPutDataPtr putData = putGet->getPutData();
|
|
||||||
PVStructurePtr arg = putData->getPVStructure();
|
|
||||||
PVStringPtr pvValue = arg->getSubField<PVString>("argument.value");
|
|
||||||
pvValue->put("World");
|
|
||||||
putGet->putGet();
|
|
||||||
PvaClientGetDataPtr getData = putGet->getGetData();
|
|
||||||
cout << getData->getPVStructure() << endl;
|
|
||||||
} catch (std::runtime_error e) {
|
|
||||||
cout << "exception " << e.what() << endl;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
int main(int argc,char *argv[])
|
|
||||||
{
|
|
||||||
PvaClientPtr pva = PvaClient::create();
|
|
||||||
example(pva);
|
|
||||||
return 0;
|
|
||||||
}
|
|
@ -1,77 +0,0 @@
|
|||||||
/*helloWorldRPC.cpp */
|
|
||||||
/**
|
|
||||||
* Copyright - See the COPYRIGHT that is included with this distribution.
|
|
||||||
* EPICS pvData is distributed subject to a Software License Agreement found
|
|
||||||
* in file LICENSE that is included with this distribution.
|
|
||||||
*/
|
|
||||||
/**
|
|
||||||
* @author mrk
|
|
||||||
*/
|
|
||||||
|
|
||||||
/* Author: Marty Kraimer */
|
|
||||||
|
|
||||||
#include <iostream>
|
|
||||||
#include <pv/pvData.h>
|
|
||||||
#include <pv/pvAccess.h>
|
|
||||||
#include <pv/rpcClient.h>
|
|
||||||
|
|
||||||
using namespace std;
|
|
||||||
using namespace epics::pvData;
|
|
||||||
using namespace epics::pvAccess;
|
|
||||||
|
|
||||||
static FieldCreatePtr fieldCreate = getFieldCreate();
|
|
||||||
static PVDataCreatePtr pvDataCreate = getPVDataCreate();
|
|
||||||
|
|
||||||
|
|
||||||
static void exampleSimple()
|
|
||||||
{
|
|
||||||
StructureConstPtr topStructure = fieldCreate->createFieldBuilder()->
|
|
||||||
add("value",pvString)->
|
|
||||||
createStructure();
|
|
||||||
PVStructurePtr pvRequest = pvDataCreate->createPVStructure(topStructure);
|
|
||||||
PVStringPtr pvArgument = pvRequest->getSubField<PVString>("value");
|
|
||||||
pvArgument->put("World");
|
|
||||||
cout << "example channeRPC simple\n";
|
|
||||||
try {
|
|
||||||
PVStructurePtr pvResult =
|
|
||||||
RPCClient::sendRequest("exampleHelloRPC", pvRequest);
|
|
||||||
cout << "result\n" << pvResult << endl;
|
|
||||||
} catch (RPCRequestException &e) {
|
|
||||||
cout << e.what() << endl;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void exampleMore()
|
|
||||||
{
|
|
||||||
StructureConstPtr topStructure = fieldCreate->createFieldBuilder()->
|
|
||||||
add("value",pvString)->
|
|
||||||
createStructure();
|
|
||||||
PVStructurePtr pvRequest = pvDataCreate->createPVStructure(topStructure);
|
|
||||||
PVStringPtr pvArgument = pvRequest->getSubField<PVString>("value");
|
|
||||||
pvArgument->put("World");
|
|
||||||
cout << "example channeRPC more\n";
|
|
||||||
try {
|
|
||||||
RPCClient::shared_pointer client = RPCClient::create("exampleHelloRPC");
|
|
||||||
client->issueConnect();
|
|
||||||
if (client->waitConnect())
|
|
||||||
{
|
|
||||||
client->issueRequest(pvRequest);
|
|
||||||
PVStructure::shared_pointer result = client->waitResponse();
|
|
||||||
std::cout << *result << std::endl;
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
cout << "waitConnect timeout\n";
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
} catch (RPCRequestException &e) {
|
|
||||||
cout << e.what() << endl;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
int main(int argc,char *argv[])
|
|
||||||
{
|
|
||||||
exampleSimple();
|
|
||||||
exampleMore();
|
|
||||||
return 0;
|
|
||||||
}
|
|
@ -65,7 +65,8 @@ make distclean all
|
|||||||
###########################################
|
###########################################
|
||||||
# Test
|
# Test
|
||||||
|
|
||||||
make runtests
|
# no regression tests
|
||||||
|
#make runtests
|
||||||
|
|
||||||
###########################################
|
###########################################
|
||||||
# Create distribution
|
# Create distribution
|
||||||
|
@ -77,7 +77,7 @@ class PvaClientChannelCache;
|
|||||||
typedef std::tr1::shared_ptr<PvaClientChannelCache> PvaClientChannelCachePtr;
|
typedef std::tr1::shared_ptr<PvaClientChannelCache> PvaClientChannelCachePtr;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @brief PvaClient is a synchronous interface to pvAccess plus convenience methods.
|
* @brief A synchronous interface to pvAccess plus convenience methods.
|
||||||
*
|
*
|
||||||
* @author mrk
|
* @author mrk
|
||||||
*/
|
*/
|
||||||
@ -180,7 +180,9 @@ typedef std::tr1::shared_ptr<PvaClientGetCache> PvaClientGetCachePtr;
|
|||||||
class PvaClientPutCache;
|
class PvaClientPutCache;
|
||||||
typedef std::tr1::shared_ptr<PvaClientPutCache> PvaClientPutCachePtr;
|
typedef std::tr1::shared_ptr<PvaClientPutCache> PvaClientPutCachePtr;
|
||||||
class ChannelRequesterImpl;
|
class ChannelRequesterImpl;
|
||||||
/** An easy to use alternative to directly calling the Channel methods of pvAccess.
|
|
||||||
|
/**
|
||||||
|
* @brief An easy to use alternative to directly calling the Channel methods of pvAccess.
|
||||||
*
|
*
|
||||||
* @author mrk
|
* @author mrk
|
||||||
*/
|
*/
|
||||||
@ -412,7 +414,8 @@ private:
|
|||||||
friend class ChannelRequesterImpl;
|
friend class ChannelRequesterImpl;
|
||||||
};
|
};
|
||||||
|
|
||||||
/** This is a class that holds data returned by PvaClientGet or PvaClientPutGet
|
/**
|
||||||
|
* @brief A class that holds data returned by PvaClientGet or PvaClientPutGet
|
||||||
*
|
*
|
||||||
*/
|
*/
|
||||||
class epicsShareClass PvaClientGetData
|
class epicsShareClass PvaClientGetData
|
||||||
@ -529,7 +532,8 @@ private:
|
|||||||
};
|
};
|
||||||
|
|
||||||
class PvaClientPostHandlerPvt; // private to PvaClientPutData
|
class PvaClientPostHandlerPvt; // private to PvaClientPutData
|
||||||
/** This is a class that holds data given to by PvaClientPut or PvaClientPutGet
|
/**
|
||||||
|
* @brief A class that holds data given to by PvaClientPut or PvaClientPutGet
|
||||||
*
|
*
|
||||||
*/
|
*/
|
||||||
class epicsShareClass PvaClientPutData
|
class epicsShareClass PvaClientPutData
|
||||||
@ -654,7 +658,7 @@ private:
|
|||||||
};
|
};
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* This is a class that holds data returned by PvaClientMonitor
|
* @brief A class that holds data returned by PvaClientMonitor
|
||||||
*
|
*
|
||||||
*/
|
*/
|
||||||
class epicsShareClass PvaClientMonitorData
|
class epicsShareClass PvaClientMonitorData
|
||||||
@ -785,7 +789,7 @@ private:
|
|||||||
|
|
||||||
class ChannelProcessRequesterImpl; // private to PvaClientProcess
|
class ChannelProcessRequesterImpl; // private to PvaClientProcess
|
||||||
/**
|
/**
|
||||||
* An easy to use alternative to ChannelProcess.
|
* @brief An easy to use alternative to ChannelProcess.
|
||||||
*
|
*
|
||||||
* @author mrk
|
* @author mrk
|
||||||
*/
|
*/
|
||||||
@ -870,7 +874,7 @@ private:
|
|||||||
|
|
||||||
class ChannelGetRequesterImpl; // private to PvaClientGet
|
class ChannelGetRequesterImpl; // private to PvaClientGet
|
||||||
/**
|
/**
|
||||||
* An easy to use alternative to ChannelGet.
|
* @brief An easy to use alternative to ChannelGet.
|
||||||
*
|
*
|
||||||
* @author mrk
|
* @author mrk
|
||||||
*/
|
*/
|
||||||
@ -968,7 +972,7 @@ private:
|
|||||||
|
|
||||||
class ChannelPutRequesterImpl; // private to PvaClientPut
|
class ChannelPutRequesterImpl; // private to PvaClientPut
|
||||||
/**
|
/**
|
||||||
* An easy to use alternative to ChannelPut.
|
* @brief An easy to use alternative to ChannelPut.
|
||||||
*
|
*
|
||||||
* @author mrk
|
* @author mrk
|
||||||
*/
|
*/
|
||||||
@ -1076,7 +1080,8 @@ private :
|
|||||||
};
|
};
|
||||||
|
|
||||||
class ChannelPutGetRequesterImpl; // private to PvaClientPutGet
|
class ChannelPutGetRequesterImpl; // private to PvaClientPutGet
|
||||||
/** An easy to use alternative to ChannelPutGet.
|
/**
|
||||||
|
* @brief An easy to use alternative to ChannelPutGet.
|
||||||
*
|
*
|
||||||
* @author mrk
|
* @author mrk
|
||||||
*/
|
*/
|
||||||
@ -1210,7 +1215,7 @@ private :
|
|||||||
|
|
||||||
class ChannelMonitorRequester; // private to PvaClientMonitor
|
class ChannelMonitorRequester; // private to PvaClientMonitor
|
||||||
/**
|
/**
|
||||||
* Optional client callback.
|
* @brief Optional client callback.
|
||||||
*
|
*
|
||||||
*/
|
*/
|
||||||
class epicsShareClass PvaClientMonitorRequester
|
class epicsShareClass PvaClientMonitorRequester
|
||||||
@ -1227,7 +1232,7 @@ public:
|
|||||||
};
|
};
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* An easy to use alternative to Monitor.
|
* @brief An easy to use alternative to Monitor.
|
||||||
*
|
*
|
||||||
*/
|
*/
|
||||||
class epicsShareClass PvaClientMonitor :
|
class epicsShareClass PvaClientMonitor :
|
||||||
@ -1342,7 +1347,7 @@ private:
|
|||||||
|
|
||||||
/** @page Overview Documentation
|
/** @page Overview Documentation
|
||||||
*
|
*
|
||||||
* <a href = "../pvaClientOverview.html">pvaClientOverview.html</a>
|
* <a href = "../pvaClientCPP.html">pvaClientCPP.html</a>
|
||||||
*
|
*
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
@ -190,7 +190,7 @@ private:
|
|||||||
};
|
};
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* This provides channelGet to multiple channels where each channel has a numeric scalar value field.
|
* @brief Provides channelGet to multiple channels where each channel has a numeric scalar value field.
|
||||||
*/
|
*/
|
||||||
class epicsShareClass PvaClientMultiGetDouble :
|
class epicsShareClass PvaClientMultiGetDouble :
|
||||||
public std::tr1::enable_shared_from_this<PvaClientMultiGetDouble>
|
public std::tr1::enable_shared_from_this<PvaClientMultiGetDouble>
|
||||||
@ -247,7 +247,7 @@ private:
|
|||||||
};
|
};
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* This provides channelPut to multiple channels where each channel has a numeric scalar value field.
|
* @brief Provides channelPut to multiple channels where each channel has a numeric scalar value field.
|
||||||
*/
|
*/
|
||||||
class epicsShareClass PvaClientMultiPutDouble :
|
class epicsShareClass PvaClientMultiPutDouble :
|
||||||
public std::tr1::enable_shared_from_this<PvaClientMultiPutDouble>
|
public std::tr1::enable_shared_from_this<PvaClientMultiPutDouble>
|
||||||
@ -301,7 +301,7 @@ private:
|
|||||||
};
|
};
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* This provides a monitor to multiple channels where each channel has a numeric scalar value field.
|
* @brief Provides a monitor to multiple channels where each channel has a numeric scalar value field.
|
||||||
*/
|
*/
|
||||||
class epicsShareClass PvaClientMultiMonitorDouble :
|
class epicsShareClass PvaClientMultiMonitorDouble :
|
||||||
public std::tr1::enable_shared_from_this<PvaClientMultiMonitorDouble>
|
public std::tr1::enable_shared_from_this<PvaClientMultiMonitorDouble>
|
||||||
@ -370,7 +370,7 @@ private:
|
|||||||
};
|
};
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* This provides channelGet to multiple channels where the value field of each channel is presented as a union.
|
* @brief Provides channelGet to multiple channels where the value field of each channel is presented as a union.
|
||||||
*/
|
*/
|
||||||
class epicsShareClass PvaClientNTMultiGet :
|
class epicsShareClass PvaClientNTMultiGet :
|
||||||
public std::tr1::enable_shared_from_this<PvaClientNTMultiGet>
|
public std::tr1::enable_shared_from_this<PvaClientNTMultiGet>
|
||||||
@ -436,7 +436,7 @@ private:
|
|||||||
};
|
};
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* This provides channelPut to multiple channels where the value field of each channel is presented as a union.
|
* @brief Provides channelPut to multiple channels where the value field of each channel is presented as a union.
|
||||||
*/
|
*/
|
||||||
class epicsShareClass PvaClientNTMultiPut :
|
class epicsShareClass PvaClientNTMultiPut :
|
||||||
public std::tr1::enable_shared_from_this<PvaClientNTMultiPut>
|
public std::tr1::enable_shared_from_this<PvaClientNTMultiPut>
|
||||||
@ -496,7 +496,7 @@ private:
|
|||||||
};
|
};
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* This provides channel monitor to multiple channels where the value field of each channel is presented as a union.
|
* @brief Provides channel monitor to multiple channels where the value field of each channel is presented as a union.
|
||||||
*/
|
*/
|
||||||
class epicsShareClass PvaClientNTMultiMonitor :
|
class epicsShareClass PvaClientNTMultiMonitor :
|
||||||
public std::tr1::enable_shared_from_this<PvaClientNTMultiMonitor>
|
public std::tr1::enable_shared_from_this<PvaClientNTMultiMonitor>
|
||||||
@ -568,7 +568,7 @@ private:
|
|||||||
};
|
};
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* This provides NTMultiChannel data for both PvaClientNTMultiGet and PvaClientNTMultiMonitor.
|
* @brief Provides NTMultiChannel data for both PvaClientNTMultiGet and PvaClientNTMultiMonitor.
|
||||||
*/
|
*/
|
||||||
class epicsShareClass PvaClientNTMultiData :
|
class epicsShareClass PvaClientNTMultiData :
|
||||||
public std::tr1::enable_shared_from_this<PvaClientNTMultiData>
|
public std::tr1::enable_shared_from_this<PvaClientNTMultiData>
|
||||||
@ -668,9 +668,3 @@ private:
|
|||||||
|
|
||||||
#endif /* PVACLIENTMULTICHANNEL_H */
|
#endif /* PVACLIENTMULTICHANNEL_H */
|
||||||
|
|
||||||
/** @page Overview Documentation
|
|
||||||
*
|
|
||||||
* <a href = "../pvaClientOverview.html">pvaClientOverview.html</a>
|
|
||||||
*
|
|
||||||
*/
|
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user