diff --git a/Doxyfile b/Doxyfile index baf5873..216cc44 100644 --- a/Doxyfile +++ b/Doxyfile @@ -32,7 +32,7 @@ DOXYFILE_ENCODING = UTF-8 # title of most generated pages and in a few other places. # 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 # could be handy for archiving the generated documentation or if some version @@ -169,7 +169,7 @@ SHORT_NAMES = NO # description.) # 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 # 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. # 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 # will adjust the colors in the stylesheet and background images according to diff --git a/Makefile b/Makefile index fa4edd0..5648314 100644 --- a/Makefile +++ b/Makefile @@ -1,20 +1,10 @@ #Makefile at top of application tree TOP = . include $(TOP)/configure/CONFIG -DIRS := $(DIRS) $(filter-out $(DIRS), configure) -DIRS := $(DIRS) $(filter-out $(DIRS), src) -DIRS := $(DIRS) $(filter-out $(DIRS), example) +DIRS += configure -EMBEDDED_TOPS := $(EMBEDDED_TOPS) $(filter-out $(EMBEDDED_TOPS), example) - -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)))) +DIRS += src +src_DEPEND_DIRS = configure include $(TOP)/configure/RULES_TOP + diff --git a/README.md b/README.md index 068c7d2..b138de5 100644 --- a/README.md +++ b/README.md @@ -21,12 +21,7 @@ for directions for how to build. Examples ------------ -The examples require the database in pvaClientTestCPP. -For example: - - mrk> pwd - /home/epicsv4/pvaClientTestCPP/database/iocBoot/exampleDatabase - mrk> ../../bin/linux-x86_64/exampleDatabase st.cmd +Project exampleCPP has examples for pvaClientCPP Status ------ diff --git a/configure/ExampleRELEASE.local b/configure/ExampleRELEASE.local index 28a63d1..cda07c2 100644 --- a/configure/ExampleRELEASE.local +++ b/configure/ExampleRELEASE.local @@ -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 - EPICS_BASE=/home/install/epics/base -V4BASE=/home/epicsv4 -PVCOMMON=${V4BASE}/pvCommonCPP -PVDATA=${V4BASE}/pvDataCPP -NORMATIVETYPES=${V4BASE}/normativeTypesCPP -PVACCESS=${V4BASE}/pvAccessCPP diff --git a/documentation/pvaClientCPP.html b/documentation/pvaClientCPP.html index dabc299..ad8ac7c 100644 --- a/documentation/pvaClientCPP.html +++ b/documentation/pvaClientCPP.html @@ -26,25 +26,7 @@

EPICS pvaClientCPP

- -

EPICS V4 Working Group, Working Draft, -02-October-2015

-
-
This version:
-
pvaClientCPP.html -
-
Latest version:
-
pvaClientCPP_20151002.html -
-
Previous version:
-
pvaClientCPP_20150803.html -
-
Editors:
-
Marty Kraimer, BNL
-
+

Release 4.2 - 2016.01.12

Abstract

@@ -78,11 +60,6 @@ The data for the channels is presented via normative type NTMultiChannel. Control System.

- -

Status of this Document and of the pvaClient Software

- -

pvaClientCPP is ready for use.

-
@@ -95,92 +72,340 @@ The data for the channels is presented via normative type NTMultiChannel.

Introduction

-

pvaClient is a synchronous API for accessing PVData via PVAccess. It provides -an interface to many of the features provided by pvData and pvAccess.

+

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.

-

This document describes the layout of the source files in this project.

-

-A user overview is available via -pvaClientOverview.html - -

-

-Doxygen documentation is available at -doxygenDoc - -

-

Example Database

-

The examples require that the database provided by project pvaClientTestCPP -is running. -For example:

+

Doxygen documentation is available at doxygenDoc

+ +

The PvaClient API has the following features:

+
    +
  1. Provides a synchronous API rather than the callback API provided by pvAccess.
  2. +
  3. Makes common requests easy.
  4. +
  5. Provides full access to the pvAccess API for more demanding + applications
  6. +
  7. Allows efficient client side programs.
  8. +
  9. Takes care of most object resource management problems.
  10. +
+

Simple examples of using pva:

-mrk> pwd
-/home/epicsv4/pvaClientTestCPP/database/iocBoot/exampleDatabase
-mrk> ../../bin/linux-x86_64/exampleDatabase st.cmd 
+// 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();
+
 
-

Examples

-

Examples are in directory example/src. -An example of how to run them is:

-
-mrk> pwd
-/home/epicsv4/pvaClientCPP/example
-mrk> bin/linux-x86_64/examplePvaClientGet 
-
-

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.

-

examplePvaClientGet

-

This has a number of examples:

+

A separate project exampleCPP has examples for pvDatabaseCPP +and for pvaClientCPP. +See it for pvaClientCPP examples. +

+

pvaClient does not provide support for:

-
exampleDouble
-
- This shows two methods for getting data from a channel that has a numeric - scalar value field. -
-
exampleDoubleArray
-
- This shows two methods for getting data from a channel that has a - double array value field. -
-
exampleCADouble
-
- This is like exampleDouble except it uses provider ca. -
-
exampleCADoubleArray
-
- This is like exampleDoubleArray except it uses provider ca. -
-
examplePowerSupply
-
- This is an example of getting data from a channel that does not - have a value field. +
ChannelArray
+
TBD
+
ChannelRPC
+
pvAccess itself already provides a synchronous interface. + exampleCPP provides helloRPC, which is an example of using channelRPC.
-

examplePvaClientMonitor

-

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. + +

Building pvaClientCPP

+

+If a proper RELEASE.local is present one directory level above pvaClientCPP.

-

examplePvaClientPut

-

This example gets and puts to channels exampleDouble -and exampleDoubleArray.

-

examplePvaClientProcess

-

This example makes a process request to channel exampleDouble.

-

helloWorldPutGet

-

This is an example of issuing a channelPutGet.

-

examplePvaClientMultiDouble

-

This is an example of using pvaClientMultiChannel, -pvaClientMultiGetDouble, pvaClientMultiPutDouble, and pvaClientMultiMonitorDouble. +

+Just type:

-

examplePvaClientNTMulti

-

This is an example of using pvaClientMultiChannel, -pvaClientNTMultiGet, pvaClientNTMultiPut, pvaClientNTMultiMonitor, and pvaClientNTMultiData. +

+make
+
+

+An example of a proper RELEASE.local is:

-

helloWorldRPC

-

This is an example of issuing a channelRPC request. -It does not use pva.

+
+EPICS4_DIR=/home/epicsv4/master
+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
+
+ +

pvaClientCPP can also be built if a file RELEASE.local exists in directory configure. +To create one do the following:

+
+mrk> pwd
+/home/hg/pvaClientCPP/configure
+mrk> cp ExampleRELEASE.local RELEASE.local
+
+

Then edit RELEASE.local so that it has the correct location of each +product pvaClientCPP requires. +Than at the top level just execute make:

+
+mrk> cd ..
+mrk> pwd
+/home/epicsv4/master/pvaClientCPP
+mrk> make
+
+ +

PvaClient

+

An instance of PvaClient is obtained via the call:

+
+PvaClientPtr pva = PvaClient::create();
+
+ +

PvaClient has methods to create instances of PvaClientChannel. +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:

+
+PvaClientChannelPtr pvaChannel = pva->channel("exampleDouble");
+
+

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. +

+

An example of using a non cached method is:

+
+PvaClientChannelPtr pvaChannel = pva->createChannel("exampleDouble");
+
+

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. +

+ +

PvaClientChannel - Wrapper For Single Channel

+

PvaClientChannel

+

This provides methods for connecting to a channel and for creating instances of +PvaClientField, PvaClientProcess, ..., PvaClientPutGet.

+

Connection must be made before any create method is called or +an exception is raised. +The following is a synchronous connection request:

+
+pvaChannel->connect(5.0); // BLOCKS AND THROWS IF NO CONNECT
+
+

This blocks until then connection is made or until timout occurs. +An exception is raised if the connection request fails. +

+

The same request can be made without blocking and without exceptions.

+
+pvaChannel->issueConnect(); // DOES NOT BLOCK
+.....
+Status status =pvaChannel->waitConnect(5.0);  // BLOCKS DOES NOT THROW
+if(!status.isOK()) {
+   // failure do something
+}
+
+

Once the channel is connected other PvaClient objects can be created. +For example:

+
+PvaClientGetPtr pvaGet = pvaChannel->get(); // DOES BLOCK
+
+

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. +

+

The client can also managed it's own objects:

+
+PvaClientGetPtr pvaGet = pvaChannel->createGet(); // DOES NOT BLOCK
+
+

The client must connect the pvaGet.

+ +

PvaClientGetData

+

This provides the data returned by pvaGet and pvaPutGet. +It is obtained via:

+
+PvaClientGetDataPtr pvaData = pvaGet->getData();
+
+

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. +

+

An example is:

+
+double value = pvaData->getDouble();
+
+

It also keeps a bitSet showing which fields have changed since the last channelGet or channelPutGet.

+ +

PvaClientMonitorData

+

To the client this looks identical to PvaClientGetData except that +it provides two BitSets: changedBitSet and overrrunBitSet. +It is used by pvaMonitor. +

+

PvaClientPutData

+

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:

+
+void pvaData->putDouble(5.0);
+
+

PvaClientGet

+

This provides methods to connect to channelGet and to issue get request. +To connect via a single synchronous call:

+
+easyGet->connect();  // BLOCKS AND CAN THROW
+
+

This can also be done in two steps:

+
+pvaGet->issueConnect(); // DOES NOT BLOCK
+...
+Status status = pvaGet->waitConnect(); // BLOCKS AND DOES NOT THROW
+
+

Once connected gets are issued via either:

+
+void pvaGet->get(); // BLOCKS AND CAN THROW
+
+or +
+pvaGet->issueGet(); // DOES NOT BLOCK
+...
+Status status = pvaGet->waitGet(); // BLOCKS AND DOES NOT THROW
+
+

PvaClientPut

+

This is similar to pvaGet except that it wraps channelPut instead of channelGet. +

+

Once connected puts are issued via either:

+
+void pvaPut->put(); // BLOCKS AND CAN THROW
+
+or +
+pvaPut->issuePut(); // DOES NOT BLOCK
+...
+Status status = pvaPut->waitPut(); // BLOCKS AND DOES NOT THROW
+
+

PvaClientMonitor

+

Connecting is similar to pvaGet and pvaPut. +The other methods are:

+
+
start
+
Starts monitoring
+
stop
+
Stops monitoring
+
poll
+
polls for a monitorEvent. + The data is avalable via pvaMonitorData. +
+
releaseEvent
+
Release the data from the last poll. + Note that this must be called before another poll is requested. +
+
waitEvent
+
Block until a monitorEvent is available. + If true is returned a poll has already been issued. +
+
setRequester
+
A client callback is registered to receive notice of monitorEvents.
+
+

PvaClientProcess

+

Connecting is similar to pvaGet. +It has methods:

+
+
process
+
call issueProcess and waitProcess.
+
issueProcess
+
call channelProcess->process() and return immediately. +
+
waitProcess
+
Wait for process to complete.
+
+

PvaClientPutGet

+

Connecting is similar to pvaGet. +It has methods:

+
+
putGet
+
calls issuePutGet and waitPutGet. + throws an exception if not successfull. +
+
issuePutGet
+
+ Calls channel->putGet() and returns. +
+
waitPutGet
+
+ Waits until putGet completes and returns status. +
+
getGet,issueGetGet, and waitGetGet
+
Gets the data for the get part of channelPutGet.
+
getPut,issueGetPut,and waitGetPut
+
Gets the data for the put part of channelPutGet.
+
getPutData
+
+ Returns the PvaClientData for the put part of channelPutGet. +
+
getGetData
+
+ Returns the PvaClientData for the get part of channelPutGet. +
+
+

Look at javaDoc for details.

+ +

PvaClientMultiChannel - Wrapper For Multiple Channels

+

PvaClientMultiChannel

+

This provides methods for connecting to multiple channels. +

+

PvaClientMultiGetDouble

+

This provides support for channelGet to multiple channels where each channel has a value field that is a numeric scalar. +

+

PvaClientMultiPutDouble

+

This provides support for channelPut to multiple channels where each channel has a value field that is a numeric scalar. +

+

PvaClientMultiMonitorDouble

+

This provides support for monitoring changes to multiple channels where each channel has a value field that is a numeric scalar. +

+

PvaClientNTMultiGet

+

This provides support for channelGet to multiple channels where each channel has a value field that has any valid type. +

+

PvaClientNTMultiPut

+

This provides support for channelPut to multiple channels where each channel has a value +field that has any valid type. +

+

PvaClientNTMultiMonitor

+

This provides support for monitoring changes to multiple channels where each channel has a +value field that has any valid type. +

+

PvaClientNTMultiData

+

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. +

+
diff --git a/documentation/pvaClientCPP_20150626.html b/documentation/pvaClientCPP_20150626.html deleted file mode 100644 index 529daec..0000000 --- a/documentation/pvaClientCPP_20150626.html +++ /dev/null @@ -1,199 +0,0 @@ - - - - - - EPICS pva - - - - - - - - - - - -
-

EPICS pvaClientCPP

- -

EPICS V4 Working Group, Working Draft, -26-June-2015

-
-
This version:
-
pvaClientCPP.html -
-
Latest version:
-
pvaClientCPP_20150626.html -
-
Previous version:
-
easyPVA_20150609.html -
-
Editors:
-
Marty Kraimer, BNL
-
- -

Abstract

- -

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.

- -

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. -

-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. -

-

-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. -

- -

For more information about EPICS generally, please refer to the home page of the Experimental Physics and Industrial - Control System.

- - - -

Status of this Document and of the pvaClient Software

- -

pvaClientCPP is ready for use.

- -
- -
-

Table of Contents

-
- - -
-
- -

Introduction

- -

pvaClient is a synchronous API for accessing PVData via PVAccess. It provides -an interface to many of the features provided by pvData and pvAccess.

- -

This document describes the layout of the source files in this project.

-

-A user overview is available via -pvaClientOverview.html - -

-

-Doxygen documentation is available at -doxygenDoc - -

-

Example Database

-

The examples require that an example pvAccess server is runnimg. -To get the test database go to:

-pvaClientTestCPP/database.zip - -Then select "raw file" and You will be able to download the zip file. -

-When unzipped this is used to create an example IOC database. -

-

-After unzipping the file: -

-
-cd database/configure
-cp ExampleRELEASE.local RELEASE.local
-edit RELEASE.local
-cd ..
-make
-cd iocBoot/exampleDatabase
-../../bin/<arch:>/exampleDatabase st.cmd
-
-

Examples

-

Examples are in directory example/src. -An example of how to run them is:

-
-mrk> pwd
-/home/epicsv4/pvaClientCPP/example
-mrk> bin/linux-x86_64/examplePvaClientGet 
-
-

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.

-

examplePvaClientGet

-

This has a number of examples:

-
-
exampleDouble
-
- This shows two methods for getting data from a channel that has a numeric - scalar value field. -
-
exampleDoubleArray
-
- This shows two methods for getting data from a channel that has a - double array value field. -
-
exampleCADouble
-
- This is like exampleDouble except it uses provider ca. -
-
exampleCADoubleArray
-
- This is like exampleDoubleArray except it uses provider ca. -
-
examplePowerSupply
-
- This is an example of getting data from a channel that does not - have a value field. -
-
-

examplePvaClientMonitor

-

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. -

-

After starting the example a change can be made to the powerSupply by issuing:

-
-pvput -r "power.value,voltage.value" examplePowerSupply 6 6
-
-

examplePvaClientPut

-

This example gets and puts to channel exampleDouble.

-

examplePvaClientProcess

-

This example makes a process request to channel exampleDouble.

-

helloWorldPutGet

-

This is an example of issuing a channelPutGet.

-

examplePvaClientMultiDouble

-

This is an example of issuing gets and puts to multiple channels where each -channel has a numeric scalar value field.

-

examplePvaClientNTMultiChannel

-

This is an example of using NDMultiChannel to obtain data from multiple channels. -

-

helloWorldRPC

-

This is an example of issuing a channelRPC request. -It does not use pva.

-
- - diff --git a/documentation/pvaClientCPP_20150803.html b/documentation/pvaClientCPP_20150803.html deleted file mode 100644 index 10eb3b5..0000000 --- a/documentation/pvaClientCPP_20150803.html +++ /dev/null @@ -1,182 +0,0 @@ - - - - - - EPICS pva - - - - - - - - - - - -
-

EPICS pvaClientCPP

- -

EPICS V4 Working Group, Working Draft, -03-August-2015

-
-
This version:
-
pvaClientCPP.html -
-
Latest version:
-
pvaClientCPP_20150803.html -
-
Previous version:
-
pvaClientCPP_20150626.html -
-
Editors:
-
Marty Kraimer, BNL
-
- -

Abstract

- -

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.

- -

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. -

-

-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. -

-

-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. -

- -

For more information about EPICS generally, please refer to the home page of the Experimental Physics and Industrial - Control System.

- - - -

Status of this Document and of the pvaClient Software

- -

pvaClientCPP is ready for use.

- -
- -
-

Table of Contents

-
- - -
-
- -

Introduction

- -

pvaClient is a synchronous API for accessing PVData via PVAccess. It provides -an interface to many of the features provided by pvData and pvAccess.

- -

This document describes the layout of the source files in this project.

-

-A user overview is available via -pvaClientOverview.html - -

-

-Doxygen documentation is available at -doxygenDoc - -

-

Example Database

-

The examples require that the database provided by project pvaClientTestCPP -is running. -For example:

-
-mrk> pwd
-/home/epicsv4/pvaClientTestCPP/database/iocBoot/exampleDatabase
-mrk> ../../bin/linux-x86_64/exampleDatabase st.cmd 
-
-

Examples

-

Examples are in directory example/src. -An example of how to run them is:

-
-mrk> pwd
-/home/epicsv4/pvaClientCPP/example
-mrk> bin/linux-x86_64/examplePvaClientGet 
-
-

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.

-

examplePvaClientGet

-

This has a number of examples:

-
-
exampleDouble
-
- This shows two methods for getting data from a channel that has a numeric - scalar value field. -
-
exampleDoubleArray
-
- This shows two methods for getting data from a channel that has a - double array value field. -
-
exampleCADouble
-
- This is like exampleDouble except it uses provider ca. -
-
exampleCADoubleArray
-
- This is like exampleDoubleArray except it uses provider ca. -
-
examplePowerSupply
-
- This is an example of getting data from a channel that does not - have a value field. -
-
-

examplePvaClientMonitor

-

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. -

-

examplePvaClientPut

-

This example gets and puts to channels exampleDouble -and exampleDoubleArray.

-

examplePvaClientProcess

-

This example makes a process request to channel exampleDouble.

-

helloWorldPutGet

-

This is an example of issuing a channelPutGet.

-

examplePvaClientMultiDouble

-

This is an example of using pvaClientMultiChannel, -pvaClientMultiGetDouble, pvaClientMultiPutDouble, and pvaClientMultiMonitorDouble. -

-

helloWorldRPC

-

This is an example of issuing a channelRPC request. -It does not use pva.

-
- - diff --git a/documentation/pvaClientCPP_20151002.html b/documentation/pvaClientCPP_20151002.html deleted file mode 100644 index dabc299..0000000 --- a/documentation/pvaClientCPP_20151002.html +++ /dev/null @@ -1,186 +0,0 @@ - - - - - - EPICS pva - - - - - - - - - - - -
-

EPICS pvaClientCPP

- -

EPICS V4 Working Group, Working Draft, -02-October-2015

-
-
This version:
-
pvaClientCPP.html -
-
Latest version:
-
pvaClientCPP_20151002.html -
-
Previous version:
-
pvaClientCPP_20150803.html -
-
Editors:
-
Marty Kraimer, BNL
-
- -

Abstract

- -

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.

- -

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. -

-

-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. -

-

-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. -

- -

For more information about EPICS generally, please refer to the home page of the Experimental Physics and Industrial - Control System.

- - - -

Status of this Document and of the pvaClient Software

- -

pvaClientCPP is ready for use.

- -
- -
-

Table of Contents

-
- - -
-
- -

Introduction

- -

pvaClient is a synchronous API for accessing PVData via PVAccess. It provides -an interface to many of the features provided by pvData and pvAccess.

- -

This document describes the layout of the source files in this project.

-

-A user overview is available via -pvaClientOverview.html - -

-

-Doxygen documentation is available at -doxygenDoc - -

-

Example Database

-

The examples require that the database provided by project pvaClientTestCPP -is running. -For example:

-
-mrk> pwd
-/home/epicsv4/pvaClientTestCPP/database/iocBoot/exampleDatabase
-mrk> ../../bin/linux-x86_64/exampleDatabase st.cmd 
-
-

Examples

-

Examples are in directory example/src. -An example of how to run them is:

-
-mrk> pwd
-/home/epicsv4/pvaClientCPP/example
-mrk> bin/linux-x86_64/examplePvaClientGet 
-
-

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.

-

examplePvaClientGet

-

This has a number of examples:

-
-
exampleDouble
-
- This shows two methods for getting data from a channel that has a numeric - scalar value field. -
-
exampleDoubleArray
-
- This shows two methods for getting data from a channel that has a - double array value field. -
-
exampleCADouble
-
- This is like exampleDouble except it uses provider ca. -
-
exampleCADoubleArray
-
- This is like exampleDoubleArray except it uses provider ca. -
-
examplePowerSupply
-
- This is an example of getting data from a channel that does not - have a value field. -
-
-

examplePvaClientMonitor

-

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. -

-

examplePvaClientPut

-

This example gets and puts to channels exampleDouble -and exampleDoubleArray.

-

examplePvaClientProcess

-

This example makes a process request to channel exampleDouble.

-

helloWorldPutGet

-

This is an example of issuing a channelPutGet.

-

examplePvaClientMultiDouble

-

This is an example of using pvaClientMultiChannel, -pvaClientMultiGetDouble, pvaClientMultiPutDouble, and pvaClientMultiMonitorDouble. -

-

examplePvaClientNTMulti

-

This is an example of using pvaClientMultiChannel, -pvaClientNTMultiGet, pvaClientNTMultiPut, pvaClientNTMultiMonitor, and pvaClientNTMultiData. -

-

helloWorldRPC

-

This is an example of issuing a channelRPC request. -It does not use pva.

-
- - diff --git a/documentation/pvaClientOverview.html b/documentation/pvaClientOverview.html deleted file mode 100644 index a0b4921..0000000 --- a/documentation/pvaClientOverview.html +++ /dev/null @@ -1,328 +0,0 @@ - - - - - - pva C++ Overview - - - - - - - - - - - -
-

PvaClient C++ Overview

- -
- -
-

Table of Contents

-
- - -
-
- -

Introduction

- -

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.

- -

The PvaClient API has the following features:

-
    -
  1. Provides a synchronous API rather than the callback API provided by pvAccess.
  2. -
  3. Makes common requests pva.
  4. -
  5. Provides full access to the pvAccess API for more demanding - applications
  6. -
  7. Allows efficient client side programs.
  8. -
  9. Takes care of most object resource management problems.
  10. -
-

Simple examples of using pva:

-
-// 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();
-
-
-

pvClientCPP/example includes a number of examples.

-

pvaClient does not provide support for:

-
-
ChannelArray
-
TBD
-
ChannelRPC
-
pvAccess itself already provides a synchronous interface. - The examples include helloWorldRPC, which is an example of using channelRP. -
-
- -

PvaClient

-

An instance of PvaClient is obtained via the call:

-
-PvaClientPtr pva = PvaClient::create();
-
- -

PvaClient has methods to create instances of PvaClientChannel. -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:

-
-PvaClientChannelPtr pvaChannel = pva->channel("exampleDouble");
-
-

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. -

-

An example of using a non cached method is:

-
-PvaClientChannelPtr pvaChannel = pva->createChannel("exampleDouble");
-
-

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. -

- -

PvaClientChannel - Wrapper For Single Channel

-

PvaClientChannel

-

This provides methods for connecting to a channel and for creating instances of -PvaClientField, PvaClientProcess, ..., PvaClientPutGet.

-

Connection must be made before any create method is called or -an exception is raised. -The following is a synchronous connection request:

-
-pvaChannel->connect(5.0); // BLOCKS AND THROWS IF NO CONNECT
-
-

This blocks until then connection is made or until timout occurs. -An exception is raised if the connection request fails. -

-

The same request can be made without blocking and without exceptions.

-
-pvaChannel->issueConnect(); // DOES NOT BLOCK
-.....
-Status status =pvaChannel->waitConnect(5.0);  // BLOCKS DOES NOT THROW
-if(!status.isOK()) {
-   // failure do something
-}
-
-

Once the channel is connected other PvaClient objects can be created. -For example:

-
-PvaClientGetPtr pvaGet = pvaChannel->get(); // DOES BLOCK
-
-

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. -

-

The client can also managed it's own objects:

-
-PvaClientGetPtr pvaGet = pvaChannel->createGet(); // DOES NOT BLOCK
-
-

The client must connect the pvaGet.

- -

PvaClientGetData

-

This provides the data returned by pvaGet and pvaPutGet. -It is obtained via:

-
-PvaClientGetDataPtr pvaData = pvaGet->getData();
-
-

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. -

-

An example is:

-
-double value = pvaData->getDouble();
-
-

It also keeps a bitSet showing which fields have changed since the last channelGet or channelPutGet.

- -

PvaClientMonitorData

-

To the client this looks identical to PvaClientGetData except that -it provides two BitSets: changedBitSet and overrrunBitSet. -It is used by pvaMonitor. -

-

PvaClientPutData

-

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:

-
-void pvaData->putDouble(5.0);
-
-

PvaClientGet

-

This provides methods to connect to channelGet and to issue get request. -To connect via a single synchronous call:

-
-eastGet->connect();  // BLOCKS AND CAN THROW
-
-

This can also be done in two steps:

-
-pvaGet->issueConnect(); // DOES NOT BLOCK
-...
-Status status = pvaGet->waitConnect(); // BLOCKS AND DOES NOT HROW
-
-

Once connected gets are issued via either:

-
-void pvaGet->get(); // BLOCKS AND CAN THROW
-
-or -
-pvaGet->issueGet(); // DOES NOT BLOCK
-...
-Status status = pvaGet->waitGet(); // BLOCKS AND DOES NOT THROW
-
-

PvaClientPut

-

This is similar to pvaGet except that it wraps channelPut instead of channelGet. -

-

Once connected puts are issued via either:

-
-void pvaPut->put(); // BLOCKS AND CAN THROW
-
-or -
-pvaPut->issuePut(); // DOES NOT BLOCK
-...
-Status status = pvaPut->waitPut(); // BLOCKS AND DOES NOT THROW
-
-

PvaClientMonitor

-

Connecting is similar to pvaGet and pvaPut. -The other methods are:

-
-
start
-
Starts monitoring
-
stop
-
Stops monitoring
-
poll
-
polls for a monitorEvent. - The data is avalable via pvaMonitorData. -
-
releaseEvent
-
Release the data from the last poll. - Note that this must be called before another poll is requested. -
-
waitEvent
-
Block until a monitorEvent is available. - If true is returned a poll has already been issued. -
-
setRequester
-
A client callback is registered to receive notice of monitorEvents.
-
-

PvaClientProcess

-

Connecting is similar to pvaGet. -It has methods:

-
-
process
-
call issueProcess and waitProcess.
-
issueProcess
-
call channelProcess->process() and return immediately. -
-
waitProcess
-
Wait for process to complete.
-
-

PvaClientPutGet

-

Connecting is similar to pvaGet. -It has methods:

-
-
putGet
-
calls issuePutGet and waitPutGet. - throws an exception if not successfull. -
-
issuePutGet
-
- Calls channel->putGet() and returns. -
-
waitPutGet
-
- Waits until putGet completes and returns status. -
-
getGet,issueGetGet, and waitGetGet
-
Gets the data for the get part of channelPutGet.
-
getPut,issueGetPut,and waitGetPut
-
Gets the data for the put part of channelPutGet.
-
getPutData
-
- Returns the PvaClientData for the put part of channelPutGet. -
-
getGetData
-
- Returns the PvaClientData for the get part of channelPutGet. -
-
-

Look at javaDoc for details.

- -

PvaClientMultiChannel - Wrapper For Multiple Channels

-

PvaClientMultiChannel

-

This provides methods for connecting to multiple channels. -

-

PvaClientMultiGetDouble

-

This provides support for channelGet to multiple channels where each channel has a value field that is a numeric scalar. -

-

PvaClientMultiPutDouble

-

This provides support for channelPut to multiple channels where each channel has a value field that is a numeric scalar. -

-

PvaClientMultiMonitorDouble

-

This provides support for monitoring changes to multiple channels where each channel has a value field that is a numeric scalar. -

-

PvaClientNTMultiGet

-

This provides support for channelGet to multiple channels where each channel has a value field that has any valid type. -

-

PvaClientNTMultiPut

-

This provides support for channelPut to multiple channels where each channel has a value -field that has any valid type. -

-

PvaClientNTMultiMonitor

-

This provides support for monitoring changes to multiple channels where each channel has a -value field that has any valid type. -

-

PvaClientNTMultiData

-

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. -

- -
- - diff --git a/example/Makefile b/example/Makefile deleted file mode 100644 index 0a9fd57..0000000 --- a/example/Makefile +++ /dev/null @@ -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 - - diff --git a/example/configure/CONFIG b/example/configure/CONFIG deleted file mode 100644 index c1a4703..0000000 --- a/example/configure/CONFIG +++ /dev/null @@ -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 - diff --git a/example/configure/CONFIG_SITE b/example/configure/CONFIG_SITE deleted file mode 100644 index 6648852..0000000 --- a/example/configure/CONFIG_SITE +++ /dev/null @@ -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= - -INSTALL_INCLUDE = $(INSTALL_LOCATION)/include/pv -USR_INCLUDES += -I $(INSTALL_LOCATION)/include - --include $(TOP)/../../CONFIG_SITE.local --include $(TOP)/../configure/CONFIG_SITE.local diff --git a/example/configure/ExampleRELEASE.local b/example/configure/ExampleRELEASE.local deleted file mode 100644 index c94e3be..0000000 --- a/example/configure/ExampleRELEASE.local +++ /dev/null @@ -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 diff --git a/example/configure/Makefile b/example/configure/Makefile deleted file mode 100644 index 9254309..0000000 --- a/example/configure/Makefile +++ /dev/null @@ -1,8 +0,0 @@ -TOP=.. - -include $(TOP)/configure/CONFIG - -TARGETS = $(CONFIG_TARGETS) -CONFIGS += $(subst ../,,$(wildcard $(CONFIG_INSTALLS))) - -include $(TOP)/configure/RULES diff --git a/example/configure/RELEASE b/example/configure/RELEASE deleted file mode 100644 index 56e5b8b..0000000 --- a/example/configure/RELEASE +++ /dev/null @@ -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 diff --git a/example/configure/RULES b/example/configure/RULES deleted file mode 100644 index 6d56e14..0000000 --- a/example/configure/RULES +++ /dev/null @@ -1,6 +0,0 @@ -# RULES - -include $(CONFIG)/RULES - -# Library should be rebuilt because LIBOBJS may have changed. -$(LIBNAME): ../Makefile diff --git a/example/configure/RULES.ioc b/example/configure/RULES.ioc deleted file mode 100644 index 901987c..0000000 --- a/example/configure/RULES.ioc +++ /dev/null @@ -1,2 +0,0 @@ -#RULES.ioc -include $(CONFIG)/RULES.ioc diff --git a/example/configure/RULES_DIRS b/example/configure/RULES_DIRS deleted file mode 100644 index 3ba269d..0000000 --- a/example/configure/RULES_DIRS +++ /dev/null @@ -1,2 +0,0 @@ -#RULES_DIRS -include $(CONFIG)/RULES_DIRS diff --git a/example/configure/RULES_TOP b/example/configure/RULES_TOP deleted file mode 100644 index d09d668..0000000 --- a/example/configure/RULES_TOP +++ /dev/null @@ -1,3 +0,0 @@ -#RULES_TOP -include $(CONFIG)/RULES_TOP - diff --git a/example/src/Makefile b/example/src/Makefile deleted file mode 100644 index f930b0e..0000000 --- a/example/src/Makefile +++ /dev/null @@ -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 - diff --git a/example/src/examplePvaClientGet.cpp b/example/src/examplePvaClientGet.cpp deleted file mode 100644 index 1e7e713..0000000 --- a/example/src/examplePvaClientGet.cpp +++ /dev/null @@ -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 - -#include - -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 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 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; -} diff --git a/example/src/examplePvaClientMonitor.cpp b/example/src/examplePvaClientMonitor.cpp deleted file mode 100644 index 5e996c3..0000000 --- a/example/src/examplePvaClientMonitor.cpp +++ /dev/null @@ -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 - -#include - -#include - -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; -} diff --git a/example/src/examplePvaClientMultiDouble.cpp b/example/src/examplePvaClientMultiDouble.cpp deleted file mode 100644 index 054024c..0000000 --- a/example/src/examplePvaClientMultiDouble.cpp +++ /dev/null @@ -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 - -#include - -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 &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 data(num,0); - for(double value = 0.2; value< 2.3; value+= 1.0) { - try { - for(size_t i=0; iput(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 channelNames(num); - channelNames[0] = "double01"; - channelNames[1] = "int01"; - channelNames[2] = "double03"; - channelNames[3] = "double04"; - channelNames[4] = "double05"; - cout << "double pva\n"; - shared_vector names(freeze(channelNames)); - example(pva,"pva",names); - cout << "double ca\n"; - example(pva,"ca",names); - channelNames = shared_vector(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; -} diff --git a/example/src/examplePvaClientNTMulti.cpp b/example/src/examplePvaClientNTMulti.cpp deleted file mode 100644 index 5841875..0000000 --- a/example/src/examplePvaClientNTMulti.cpp +++ /dev/null @@ -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 - -#include -#include - -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(field); - ScalarType scalarType = scalar->getScalarType(); - if(scalarType==pvDouble) { - PVDoublePtr pvValue = static_pointer_cast( - pvDataCreate->createPVScalar(pvDouble)); - pvValue->put(value); - pvUnion->set(0,pvValue); - return; - } - if(scalarType==pvString) { - PVStringPtr pvValue = static_pointer_cast( - 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(field); - ScalarType scalarType = scalarArray->getElementType(); - if(scalarType==pvDouble) { - size_t num = 5; - PVDoubleArrayPtr pvValue = static_pointer_cast( - pvDataCreate->createPVScalarArray(pvDouble)); - shared_vector data(num); - for(size_t i=0; ireplace(freeze(data)); - pvUnion->set(0,pvValue); - return; - } - if(scalarType==pvString) { - size_t num = 5; - PVStringArrayPtr pvValue = static_pointer_cast( - pvDataCreate->createPVScalarArray(pvString)); - shared_vector data(num); - for(size_t i=0; ireplace(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 &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 data = multiPut->getValues(); - for(double value = 0.0; value< 2.1; value+= 1.0) { - for(size_t i=0; iput(); - 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 channelNames(num); - channelNames[0] = "double01"; - channelNames[1] = "string01"; - channelNames[2] = "doubleArray01"; - channelNames[3] = "stringArray01"; - cout << "dbRecord pva\n"; - shared_vector names(freeze(channelNames)); - example(pva,"pva",names); - cout << "dbRecord ca\n"; - example(pva,"ca",names); - channelNames = shared_vector(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; -} diff --git a/example/src/examplePvaClientProcess.cpp b/example/src/examplePvaClientProcess.cpp deleted file mode 100644 index 43571c4..0000000 --- a/example/src/examplePvaClientProcess.cpp +++ /dev/null @@ -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 - -#include - -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; -} diff --git a/example/src/examplePvaClientPut.cpp b/example/src/examplePvaClientPut.cpp deleted file mode 100644 index dfa3559..0000000 --- a/example/src/examplePvaClientPut.cpp +++ /dev/null @@ -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 - -#include -#include - -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(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; -} diff --git a/example/src/helloWorldPutGet.cpp b/example/src/helloWorldPutGet.cpp deleted file mode 100644 index 58f784d..0000000 --- a/example/src/helloWorldPutGet.cpp +++ /dev/null @@ -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 - -#include - -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("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; -} diff --git a/example/src/helloWorldRPC.cpp b/example/src/helloWorldRPC.cpp deleted file mode 100644 index 238aad3..0000000 --- a/example/src/helloWorldRPC.cpp +++ /dev/null @@ -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 -#include -#include -#include - -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("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("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; -} diff --git a/jenkins/cloudbees_build b/jenkins/cloudbees_build index a1ce43e..5cd5299 100644 --- a/jenkins/cloudbees_build +++ b/jenkins/cloudbees_build @@ -65,7 +65,8 @@ make distclean all ########################################### # Test -make runtests +# no regression tests +#make runtests ########################################### # Create distribution diff --git a/src/pvaClient.h b/src/pvaClient.h index 09c2d0d..8f85fc1 100644 --- a/src/pvaClient.h +++ b/src/pvaClient.h @@ -77,7 +77,7 @@ class PvaClientChannelCache; typedef std::tr1::shared_ptr PvaClientChannelCachePtr; /** - * @brief PvaClient is a synchronous interface to pvAccess plus convenience methods. + * @brief A synchronous interface to pvAccess plus convenience methods. * * @author mrk */ @@ -180,7 +180,9 @@ typedef std::tr1::shared_ptr PvaClientGetCachePtr; class PvaClientPutCache; typedef std::tr1::shared_ptr PvaClientPutCachePtr; 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 */ @@ -412,7 +414,8 @@ private: 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 @@ -529,7 +532,8 @@ private: }; 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 @@ -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 @@ -785,7 +789,7 @@ private: class ChannelProcessRequesterImpl; // private to PvaClientProcess /** - * An easy to use alternative to ChannelProcess. + * @brief An easy to use alternative to ChannelProcess. * * @author mrk */ @@ -870,7 +874,7 @@ private: class ChannelGetRequesterImpl; // private to PvaClientGet /** - * An easy to use alternative to ChannelGet. + * @brief An easy to use alternative to ChannelGet. * * @author mrk */ @@ -968,7 +972,7 @@ private: class ChannelPutRequesterImpl; // private to PvaClientPut /** - * An easy to use alternative to ChannelPut. + * @brief An easy to use alternative to ChannelPut. * * @author mrk */ @@ -1076,7 +1080,8 @@ private : }; class ChannelPutGetRequesterImpl; // private to PvaClientPutGet -/** An easy to use alternative to ChannelPutGet. +/** + * @brief An easy to use alternative to ChannelPutGet. * * @author mrk */ @@ -1210,7 +1215,7 @@ private : class ChannelMonitorRequester; // private to PvaClientMonitor /** - * Optional client callback. + * @brief Optional client callback. * */ 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 : @@ -1342,7 +1347,7 @@ private: /** @page Overview Documentation * - * pvaClientOverview.html + * pvaClientCPP.html * */ diff --git a/src/pvaClientMultiChannel.h b/src/pvaClientMultiChannel.h index a815970..cadb90b 100644 --- a/src/pvaClientMultiChannel.h +++ b/src/pvaClientMultiChannel.h @@ -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 : public std::tr1::enable_shared_from_this @@ -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 : public std::tr1::enable_shared_from_this @@ -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 : public std::tr1::enable_shared_from_this @@ -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 : public std::tr1::enable_shared_from_this @@ -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 : public std::tr1::enable_shared_from_this @@ -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 : public std::tr1::enable_shared_from_this @@ -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 : public std::tr1::enable_shared_from_this @@ -668,9 +668,3 @@ private: #endif /* PVACLIENTMULTICHANNEL_H */ -/** @page Overview Documentation - * - * pvaClientOverview.html - * - */ -