Compare commits
22 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| bc9ac8422c | |||
| c3aec4e27b | |||
| 0abfeef5ed | |||
| 745119cf77 | |||
| 9f794721ab | |||
| 8f21ac8b9d | |||
| 9add9daf85 | |||
| aaacadb42d | |||
| 5961c83477 | |||
| b724b72624 | |||
| fc42cf798e | |||
| 71181afc93 | |||
| b92a3ddaa4 | |||
| 246cceae3e | |||
| 3f4df39ee0 | |||
| 837924af2e | |||
| 7b0e2b5986 | |||
| c84b24bb30 | |||
| f58c5159fc | |||
| a91ba8ef9e | |||
| ddb36536fe | |||
| 9153036ccc |
@@ -0,0 +1,17 @@
|
||||
# .readthedocs.yml
|
||||
# Read the Docs configuration file
|
||||
# See https://docs.readthedocs.io/en/stable/config-file/v2.html for details
|
||||
|
||||
# Required
|
||||
version: 2
|
||||
|
||||
# Build documentation in the documentation/ directory with Sphinx
|
||||
sphinx:
|
||||
configuration: documentation/conf.py
|
||||
|
||||
# Build documentation with MkDocs
|
||||
#mkdocs:
|
||||
# configuration: mkdocs.yml
|
||||
|
||||
# Optionally build your docs in additional formats such as PDF and ePub
|
||||
formats: all
|
||||
@@ -28,4 +28,3 @@ env:
|
||||
- BRBASE=7.0 RTEMS=4.9 TEST=NO
|
||||
- BRBASE=3.16
|
||||
- BRBASE=3.15
|
||||
- BRBASE=3.14
|
||||
|
||||
@@ -38,7 +38,7 @@ PROJECT_NAME = pvaClientCPP
|
||||
# could be handy for archiving the generated documentation or if some version
|
||||
# control system is used.
|
||||
|
||||
PROJECT_NUMBER =
|
||||
PROJECT_NUMBER = 4.7.1
|
||||
|
||||
# Using the PROJECT_BRIEF tag one can provide an optional one line description
|
||||
# for a project that appears at the top of each page and should give viewer a
|
||||
@@ -152,7 +152,7 @@ FULL_PATH_NAMES = YES
|
||||
# will be relative from the directory where doxygen is started.
|
||||
# This tag requires that the tag FULL_PATH_NAMES is set to YES.
|
||||
|
||||
STRIP_FROM_PATH =
|
||||
STRIP_FROM_PATH = src
|
||||
|
||||
# The STRIP_FROM_INC_PATH tag can be used to strip a user-defined part of the
|
||||
# path mentioned in the documentation of a class, which tells the reader which
|
||||
@@ -161,7 +161,7 @@ STRIP_FROM_PATH =
|
||||
# specify the list of include paths that are normally passed to the compiler
|
||||
# using the -I flag.
|
||||
|
||||
STRIP_FROM_INC_PATH =
|
||||
STRIP_FROM_INC_PATH = src
|
||||
|
||||
# If the SHORT_NAMES tag is set to YES, doxygen will generate much shorter (but
|
||||
# less readable) file names. This can be useful is your file systems doesn't
|
||||
@@ -765,7 +765,8 @@ WARN_LOGFILE =
|
||||
# spaces. See also FILE_PATTERNS and EXTENSION_MAPPING
|
||||
# Note: If this tag is empty the current directory is searched.
|
||||
|
||||
INPUT = include
|
||||
INPUT = src \
|
||||
src/pv
|
||||
|
||||
# This tag can be used to specify the character encoding of the source files
|
||||
# that doxygen parses. Internally doxygen uses the UTF-8 encoding. Doxygen uses
|
||||
@@ -796,7 +797,7 @@ FILE_PATTERNS =
|
||||
# be searched for input files as well.
|
||||
# The default value is: NO.
|
||||
|
||||
RECURSIVE = YES
|
||||
RECURSIVE = NO
|
||||
|
||||
# The EXCLUDE tag can be used to specify files and/or directories that should be
|
||||
# excluded from the INPUT source files. This way you can easily exclude a
|
||||
@@ -1035,7 +1036,7 @@ GENERATE_HTML = YES
|
||||
# The default directory is: html.
|
||||
# This tag requires that the tag GENERATE_HTML is set to YES.
|
||||
|
||||
HTML_OUTPUT = documentation/html
|
||||
HTML_OUTPUT = html/doxygen
|
||||
|
||||
# The HTML_FILE_EXTENSION tag can be used to specify the file extension for each
|
||||
# generated HTML page (for example: .htm, .php, .asp).
|
||||
|
||||
@@ -1,3 +1,12 @@
|
||||
# Version number for the PVA Client API and shared library
|
||||
|
||||
EPICS_PVACLIENT_MAJOR_VERSION = 4
|
||||
EPICS_PVACLIENT_MINOR_VERSION = 6
|
||||
EPICS_PVACLIENT_MAINTENANCE_VERSION = 0
|
||||
EPICS_PVACLIENT_MINOR_VERSION = 7
|
||||
EPICS_PVACLIENT_MAINTENANCE_VERSION = 1
|
||||
|
||||
# Development flag, set to zero for release versions
|
||||
|
||||
EPICS_PVACLIENT_DEVELOPMENT_FLAG = 0
|
||||
|
||||
# Immediately after a release the MAINTENANCE_VERSION
|
||||
# will be incremented and the DEVELOPMENT_FLAG set to 1
|
||||
|
||||
@@ -1,7 +1,20 @@
|
||||
# pvaClientCPP Module
|
||||
pwd# pvaClientCPP Module
|
||||
|
||||
This document summarizes the changes to the module between releases.
|
||||
|
||||
## Release 4.7.1 (EPICS 7.0.3.2 May 2020)
|
||||
|
||||
* support access to a union field that is a scalar or scalarArray
|
||||
* fixed issues #62 and #63
|
||||
|
||||
## Release 4.7.0 (EPICS 7.0.3.1, Nov 2019)
|
||||
|
||||
* added JSON support for put and putGet
|
||||
* Fix for
|
||||
[GitHub issue #62](https://github.com/epics-base/pvaClientCPP/issues/62)
|
||||
* Doxygen updates and read-the-docs integration.
|
||||
|
||||
|
||||
## Release 4.6.0 (EPICS 7.0.3, Jul 2019)
|
||||
|
||||
* pvaClient now handles exceptions from the server properly (issue #54).
|
||||
|
||||
@@ -0,0 +1,7 @@
|
||||
.wy-side-nav-search {
|
||||
background-color: #18334B;
|
||||
}
|
||||
|
||||
.wy-side-nav-search input[type="text"] {
|
||||
border-color: #18334b;
|
||||
}
|
||||
@@ -0,0 +1,80 @@
|
||||
# Configuration file for the Sphinx documentation builder.
|
||||
#
|
||||
# This file only contains a selection of the most common options. For a full
|
||||
# list see the documentation:
|
||||
# http://www.sphinx-doc.org/en/master/config
|
||||
|
||||
# -- Path setup --------------------------------------------------------------
|
||||
|
||||
# If extensions (or modules to document with autodoc) are in another directory,
|
||||
# add these directories to sys.path here. If the directory is relative to the
|
||||
# documentation root, use os.path.abspath to make it absolute, like shown here.
|
||||
#
|
||||
# import os
|
||||
# import sys
|
||||
# sys.path.insert(0, os.path.abspath('.'))
|
||||
|
||||
|
||||
# -- Project information -----------------------------------------------------
|
||||
|
||||
project = 'normativeTypes (C++)'
|
||||
copyright = '2019, EPICS Controls.'
|
||||
author = 'EPICS'
|
||||
|
||||
|
||||
# -- General configuration ---------------------------------------------------
|
||||
|
||||
# Add any Sphinx extension module names here, as strings. They can be
|
||||
# extensions coming with Sphinx (named 'sphinx.ext.*') or your custom
|
||||
# ones.
|
||||
extensions = [
|
||||
'sphinx.ext.intersphinx',
|
||||
]
|
||||
|
||||
# Add any paths that contain templates here, relative to this directory.
|
||||
templates_path = ['_templates']
|
||||
|
||||
# List of patterns, relative to source directory, that match files and
|
||||
# directories to ignore when looking for source files.
|
||||
# This pattern also affects html_static_path and html_extra_path.
|
||||
exclude_patterns = ['_build', 'Thumbs.db', '.DS_Store']
|
||||
|
||||
# Intersphinx links to subprojects
|
||||
intersphinx_mapping = {
|
||||
}
|
||||
|
||||
|
||||
# -- Options for HTML output -------------------------------------------------
|
||||
|
||||
# The theme to use for HTML and HTML Help pages. See the documentation for
|
||||
# a list of builtin themes.
|
||||
#
|
||||
html_theme = 'sphinx_rtd_theme'
|
||||
|
||||
|
||||
# Add any paths that contain custom static files (such as style sheets) here,
|
||||
# relative to this directory. They are copied after the builtin static files,
|
||||
# so a file named "default.css" will overwrite the builtin "default.css".
|
||||
html_static_path = ['_static']
|
||||
|
||||
html_css_files = [
|
||||
'css/custom.css',
|
||||
]
|
||||
|
||||
master_doc = 'index'
|
||||
|
||||
html_theme_options = {
|
||||
'logo_only': True,
|
||||
}
|
||||
html_logo = "images/EPICS_white_logo_v02.png"
|
||||
|
||||
html_extra_path = [
|
||||
'../html',
|
||||
'pvaClientCPP.html',
|
||||
]
|
||||
|
||||
|
||||
# -- Run Doxygen ------------------------------------------------------------
|
||||
|
||||
import subprocess
|
||||
subprocess.call('cd ..; mkdir -p html/doxygen; doxygen', shell=True)
|
||||
Binary file not shown.
|
After Width: | Height: | Size: 5.5 KiB |
@@ -0,0 +1,17 @@
|
||||
pvaClient (C++) Library
|
||||
========================
|
||||
|
||||
.. toctree::
|
||||
:hidden:
|
||||
|
||||
EPICS Website <https://epics-controls.org>
|
||||
EPICS Documentation Home <https://docs.epics-controls.org>
|
||||
|
||||
|
||||
.. toctree::
|
||||
:maxdepth: 1
|
||||
:caption: pvaClientCPP
|
||||
|
||||
Reference Manual <https://docs.epics-controls.org/projects/pvaclient-cpp/en/latest/pvaClientCPP.html>
|
||||
API Documentation <https://docs.epics-controls.org/projects/pvaclient-cpp/en/latest/doxygen>
|
||||
Source Code Repository on GitHub <https://github.com/epics-base/pvaClientCPP>
|
||||
+65
-33
@@ -17,7 +17,8 @@
|
||||
|
||||
#include <list>
|
||||
#include <iostream>
|
||||
#include <sstream>
|
||||
#include <ostream>
|
||||
#include <sstream>
|
||||
#include <pv/requester.h>
|
||||
#include <pv/status.h>
|
||||
#include <pv/event.h>
|
||||
@@ -35,12 +36,12 @@
|
||||
|
||||
#ifdef pvaClientEpicsExportSharedSymbols
|
||||
# define epicsExportSharedSymbols
|
||||
# undef pvaClientEpicsExportSharedSymbols
|
||||
# undef pvaClientEpicsExportSharedSymbols
|
||||
#endif
|
||||
|
||||
#include <shareLib.h>
|
||||
|
||||
namespace epics { namespace pvaClient {
|
||||
namespace epics { namespace pvaClient {
|
||||
|
||||
class PvaClient;
|
||||
typedef std::tr1::shared_ptr<PvaClient> PvaClientPtr;
|
||||
@@ -160,7 +161,7 @@ public:
|
||||
PvaClientChannelPtr createChannel(
|
||||
std::string const & channelName,
|
||||
std::string const & providerName = "pva");
|
||||
|
||||
|
||||
/** @brief Set a requester.
|
||||
*
|
||||
* The default is for PvaClient to handle messages by printing to System.out.
|
||||
@@ -203,7 +204,7 @@ class PvaClientPutCache;
|
||||
typedef std::tr1::shared_ptr<PvaClientPutCache> PvaClientPutCachePtr;
|
||||
|
||||
|
||||
/**
|
||||
/**
|
||||
* @brief A callback for change in connection status.
|
||||
*
|
||||
* <a href = "../htmldoxygen/pvaClientChannelStateChangeRequester.html">Overview of PvaClientChannelStateChangeRequester</a>
|
||||
@@ -227,7 +228,7 @@ public:
|
||||
virtual void channelStateChange(PvaClientChannelPtr const & channel, bool isConnected) = 0;
|
||||
};
|
||||
|
||||
/**
|
||||
/**
|
||||
* @brief An easy to use alternative to directly calling the Channel methods of pvAccess.
|
||||
*
|
||||
* <a href = "../htmldoxygen/pvaClientChannel.html">Overview of PvaClientChannel</a>
|
||||
@@ -244,7 +245,7 @@ public:
|
||||
*/
|
||||
~PvaClientChannel();
|
||||
/** @brief Set a client stateChangeRequester.
|
||||
*
|
||||
*
|
||||
* @param stateChangeRequester The client stateChangeRequester implementation.
|
||||
*/
|
||||
void setStateChangeRequester(PvaClientChannelStateChangeRequesterPtr const &stateChangeRequester);
|
||||
@@ -289,7 +290,7 @@ public:
|
||||
* @throw runtime_error if failure.
|
||||
*/
|
||||
PvaClientProcessPtr createProcess(std::string const & request = "");
|
||||
/** Creates a PvaClientProcess.
|
||||
/** Creates a PvaClientProcess.
|
||||
*
|
||||
* @param pvRequest The syntax of pvRequest is defined by the copy facility of pvData.
|
||||
* @return The interface.
|
||||
@@ -350,7 +351,7 @@ public:
|
||||
epics::pvData::shared_vector<const std::string> getStringArray(
|
||||
std::string const & request = "field(value)");
|
||||
/** @brief create a PvaClientPut.
|
||||
*
|
||||
*
|
||||
* Get a cached PvaClientPut or create and connect to a new PvaClientPut.
|
||||
* Then call it's get method.
|
||||
* @param request The syntax of request is defined by the copy facility of pvData.
|
||||
@@ -396,7 +397,7 @@ public:
|
||||
epics::pvData::shared_vector<const double> const & value,
|
||||
std::string const & request = "field(value)");
|
||||
/** @brief Copy array to the value field.
|
||||
*
|
||||
*
|
||||
* @param value The new value.
|
||||
* @param request The syntax of request is defined by the copy facility of pvData.
|
||||
* @throw runtime_error if failure.
|
||||
@@ -449,7 +450,7 @@ public:
|
||||
* @throw runtime_error if failure.
|
||||
*/
|
||||
PvaClientMonitorPtr monitor(std::string const & request = "field(value,alarm,timeStamp)");
|
||||
/** @brief Call the next method with request = "field(value,alarm,timeStamp)"
|
||||
/** @brief Call the next method with request = "field(value,alarm,timeStamp)"
|
||||
*
|
||||
* @param pvaClientMonitorRequester The client callback.
|
||||
* @return The interface.
|
||||
@@ -538,7 +539,7 @@ private:
|
||||
std::string channelName;
|
||||
std::string providerName;
|
||||
ConnectState connectState;
|
||||
|
||||
|
||||
epics::pvData::CreateRequest::shared_pointer createRequest;
|
||||
PvaClientGetCachePtr pvaClientGetCache;
|
||||
PvaClientPutCachePtr pvaClientPutCache;
|
||||
@@ -560,7 +561,7 @@ public:
|
||||
friend class PvaClient;
|
||||
};
|
||||
|
||||
/**
|
||||
/**
|
||||
* @brief A base class for PvaClientGetData, PvaClientPutData, and PvaClientMonitorData.
|
||||
*
|
||||
* <a href = "../htmldoxygen/pvaClientData.html">Overview of PvaClientData</a>
|
||||
@@ -613,6 +614,7 @@ public:
|
||||
void setData(
|
||||
epics::pvData::PVStructurePtr const & pvStructureFrom,
|
||||
epics::pvData::BitSetPtr const & bitSetFrom);
|
||||
|
||||
/** @brief Is there a top level field named value.
|
||||
* @return The answer.
|
||||
*/
|
||||
@@ -679,6 +681,29 @@ public:
|
||||
* @return The timeStamp.
|
||||
*/
|
||||
epics::pvData::TimeStamp getTimeStamp();
|
||||
/** @brief parse from args
|
||||
*
|
||||
* Accepts arguments of the form json or field='value' where value is json syntax.
|
||||
* field is name.name...
|
||||
* @param args The arguments
|
||||
* @throw runtime_error if failure.
|
||||
*/
|
||||
void parse(const std::vector<std::string> &args);
|
||||
/** @brief generate JSON output from the current PVStructure
|
||||
*
|
||||
* @param strm output stream
|
||||
* @param ignoreUnprintable false or true; default is true.
|
||||
* @param multiline false or true; default is false
|
||||
*
|
||||
* @throw runtime_error if failure.
|
||||
*/
|
||||
void streamJSON(
|
||||
std::ostream& strm,
|
||||
bool ignoreUnprintable = true,
|
||||
bool multiLine = false);
|
||||
/** @brief set length of all array fields to 0
|
||||
*/
|
||||
void zeroArrayLength();
|
||||
/** @brief Factory method for creating an instance of PvaClientData.
|
||||
*
|
||||
* NOTE: Not normally called by clients
|
||||
@@ -688,15 +713,23 @@ public:
|
||||
static PvaClientDataPtr create(epics::pvData::StructureConstPtr const & structure);
|
||||
protected:
|
||||
PvaClientData(epics::pvData::StructureConstPtr const & structure);
|
||||
epics::pvData::PVFieldPtr getSinglePVField();
|
||||
void checkValue();
|
||||
std::string messagePrefix;
|
||||
private:
|
||||
void parse(
|
||||
const std::string &arg,
|
||||
const epics::pvData::PVFieldPtr &dest,
|
||||
epics::pvData::BitSetPtr &bitSet);
|
||||
void parse(
|
||||
const std::string &arg,
|
||||
const epics::pvData::PVUnionPtr &dest);
|
||||
void zeroArrayLength(const epics::pvData::PVStructurePtr &pvStructure);
|
||||
|
||||
epics::pvData::StructureConstPtr structure;
|
||||
epics::pvData::PVStructurePtr pvStructure;
|
||||
epics::pvData::BitSetPtr bitSet;
|
||||
|
||||
|
||||
epics::pvData::PVFieldPtr pvValue;
|
||||
epics::pvData::PVAlarm pvAlarm;
|
||||
epics::pvData::PVTimeStamp pvTimeStamp;
|
||||
@@ -704,7 +737,7 @@ private:
|
||||
friend class PvaClientPutGet;
|
||||
};
|
||||
|
||||
/**
|
||||
/**
|
||||
* @brief A class that holds data returned by PvaClientGet or PvaClientPutGet
|
||||
*
|
||||
* <a href = "../htmldoxygen/pvaClientGetData.html">Overview of PvaClientGetData</a>
|
||||
@@ -731,7 +764,7 @@ private:
|
||||
};
|
||||
|
||||
class PvaClientPostHandlerPvt; // private to PvaClientPutData
|
||||
/**
|
||||
/**
|
||||
* @brief A class that holds data given to by PvaClientPut or PvaClientPutGet
|
||||
*
|
||||
* <a href = "../htmldoxygen/pvaClientPutData.html">Overview of PvaClientPutData</a>
|
||||
@@ -742,7 +775,7 @@ public:
|
||||
POINTER_DEFINITIONS(PvaClientPutData);
|
||||
/**
|
||||
* @brief Destructor
|
||||
*/
|
||||
*/
|
||||
~PvaClientPutData() {}
|
||||
/** @brief Put the value as a double.
|
||||
* @param value The new value.
|
||||
@@ -795,7 +828,7 @@ public:
|
||||
POINTER_DEFINITIONS(PvaClientMonitorData);
|
||||
/**
|
||||
* @brief Destructor
|
||||
*/
|
||||
*/
|
||||
~PvaClientMonitorData() {}
|
||||
/** @brief Get the overrun BitSet for the pvStructure
|
||||
* This shows which fields have had more than one change.
|
||||
@@ -881,7 +914,7 @@ public:
|
||||
PvaClientChannelPtr const & pvaClientChannel,
|
||||
epics::pvData::PVStructurePtr const &pvRequest
|
||||
);
|
||||
|
||||
|
||||
/** @brief Destructor
|
||||
*/
|
||||
~PvaClientProcess();
|
||||
@@ -935,7 +968,7 @@ private:
|
||||
PvaClientPtr const &pvaClient,
|
||||
PvaClientChannelPtr const & pvaClientChannel,
|
||||
epics::pvData::PVStructurePtr const &pvRequest);
|
||||
|
||||
|
||||
void checkProcessState();
|
||||
enum ProcessConnectState {connectIdle,connectActive,connected};
|
||||
|
||||
@@ -1246,7 +1279,7 @@ private :
|
||||
PvaClientPtr const &pvaClient,
|
||||
PvaClientChannelPtr const & pvaClientChannel,
|
||||
epics::pvData::PVStructurePtr const &pvRequest);
|
||||
|
||||
|
||||
void checkConnectState();
|
||||
enum PutConnectState {connectIdle,connectActive,connected};
|
||||
|
||||
@@ -1324,11 +1357,11 @@ public:
|
||||
PvaClientPutGetPtr const & clientPutGet)
|
||||
{
|
||||
}
|
||||
|
||||
|
||||
};
|
||||
|
||||
|
||||
/**
|
||||
/**
|
||||
* @brief An easy to use alternative to ChannelPutGet.
|
||||
*
|
||||
* <a href = "../htmldoxygen/pvaClientPutGet.html">Overview of PvaClientPutGet</a>
|
||||
@@ -1415,11 +1448,11 @@ public:
|
||||
/** @brief Get the put data.
|
||||
* @return The interface.
|
||||
*/
|
||||
PvaClientPutDataPtr getPutData();
|
||||
PvaClientPutDataPtr getPutData();
|
||||
/** @brief Get the get data.
|
||||
* @return The interface.
|
||||
*/
|
||||
PvaClientGetDataPtr getGetData();
|
||||
PvaClientGetDataPtr getGetData();
|
||||
/** @brief Get the PvaClientChannel;
|
||||
*
|
||||
* @return The interface.
|
||||
@@ -1560,7 +1593,7 @@ public:
|
||||
std::string const & request,
|
||||
PvaClientChannelStateChangeRequesterPtr const & stateChangeRequester
|
||||
= PvaClientChannelStateChangeRequesterPtr(),
|
||||
PvaClientMonitorRequesterPtr const & monitorRequester
|
||||
PvaClientMonitorRequesterPtr const & monitorRequester
|
||||
= PvaClientMonitorRequesterPtr()
|
||||
) EPICS_DEPRECATED;
|
||||
/** @brief Destructor
|
||||
@@ -1623,7 +1656,7 @@ public:
|
||||
*
|
||||
* @return The interface.
|
||||
*/
|
||||
PvaClientMonitorDataPtr getData();
|
||||
PvaClientMonitorDataPtr getData();
|
||||
private:
|
||||
std::string getRequesterName();
|
||||
void message(std::string const & message,epics::pvData::MessageType messageType);
|
||||
@@ -1654,7 +1687,7 @@ private:
|
||||
epics::pvData::Status monitorConnectStatus;
|
||||
epics::pvData::MonitorPtr monitor;
|
||||
epics::pvData::MonitorElementPtr monitorElement;
|
||||
|
||||
|
||||
PvaClientMonitorRequesterWPtr pvaClientMonitorRequester;
|
||||
MonitorConnectState connectState;
|
||||
bool userPoll;
|
||||
@@ -1731,7 +1764,7 @@ public:
|
||||
* @brief Set a timeout for a request.
|
||||
* @param responseTimeout The time in seconds to wait for a request to complete.
|
||||
*/
|
||||
void setResponseTimeout(double responseTimeout)
|
||||
void setResponseTimeout(double responseTimeout)
|
||||
{
|
||||
this->responseTimeout = responseTimeout;
|
||||
}
|
||||
@@ -1801,12 +1834,12 @@ private:
|
||||
PvaClient::weak_pointer pvaClient;
|
||||
epics::pvAccess::Channel::weak_pointer channel;
|
||||
epics::pvData::PVStructurePtr pvRequest;
|
||||
|
||||
|
||||
epics::pvData::Mutex mutex;
|
||||
epics::pvData::Event waitForConnect;
|
||||
epics::pvData::Event waitForDone;
|
||||
|
||||
PvaClientRPCRequesterWPtr pvaClientRPCRequester;
|
||||
PvaClientRPCRequesterWPtr pvaClientRPCRequester;
|
||||
RPCRequesterImplPtr rpcRequester;
|
||||
epics::pvAccess::ChannelRPC::shared_pointer channelRPC;
|
||||
epics::pvData::PVStructurePtr pvResponse;
|
||||
@@ -1825,6 +1858,5 @@ private:
|
||||
/** @page Overview Documentation
|
||||
*
|
||||
* <a href = "../pvaClientCPP.html">pvaClientCPP.html</a>
|
||||
*
|
||||
*
|
||||
*/
|
||||
|
||||
|
||||
@@ -21,14 +21,14 @@
|
||||
|
||||
#ifdef pvaClientMultiChannelEpicsExportSharedSymbols
|
||||
# define epicsExportSharedSymbols
|
||||
# undef pvaClientMultiChannelEpicsExportSharedSymbols
|
||||
# undef pvaClientMultiChannelEpicsExportSharedSymbols
|
||||
#endif
|
||||
|
||||
|
||||
#include <pv/pvaClient.h>
|
||||
|
||||
|
||||
namespace epics { namespace pvaClient {
|
||||
namespace epics { namespace pvaClient {
|
||||
|
||||
|
||||
class PvaClientMultiChannel;
|
||||
@@ -115,7 +115,7 @@ public:
|
||||
* @brief create a pvaClientMultiGetDouble
|
||||
* @return The interface.
|
||||
*/
|
||||
PvaClientMultiGetDoublePtr createGet();
|
||||
PvaClientMultiGetDoublePtr createGet();
|
||||
/**
|
||||
* @brief Create a pvaClientMultiPutDouble.
|
||||
* @return The interface.
|
||||
@@ -152,7 +152,7 @@ private:
|
||||
std::string const & providerName,
|
||||
size_t maxNotConnected);
|
||||
void checkConnected();
|
||||
|
||||
|
||||
PvaClientPtr pvaClient;
|
||||
epics::pvData::shared_vector<const std::string> channelName;
|
||||
std::string providerName;
|
||||
@@ -176,7 +176,7 @@ class epicsShareClass PvaClientMultiGetDouble :
|
||||
|
||||
public:
|
||||
POINTER_DEFINITIONS(PvaClientMultiGetDouble);
|
||||
|
||||
|
||||
/**
|
||||
* @brief Create a PvaClientMultiGetDouble.
|
||||
* @param pvaClientMultiChannel The interface to PvaClientMultiChannel.
|
||||
@@ -214,7 +214,7 @@ private:
|
||||
PvaClientChannelArray pvaClientChannelArray;
|
||||
size_t nchannel;
|
||||
epics::pvData::Mutex mutex;
|
||||
|
||||
|
||||
epics::pvData::shared_vector<double> doubleValue;
|
||||
std::vector<PvaClientGetPtr> pvaClientGet;
|
||||
bool isGetConnected;
|
||||
@@ -229,7 +229,7 @@ class epicsShareClass PvaClientMultiPutDouble :
|
||||
|
||||
public:
|
||||
POINTER_DEFINITIONS(PvaClientMultiPutDouble);
|
||||
|
||||
|
||||
/** @brief Create a PvaClientMultiPutDouble.
|
||||
* @param pvaClientMultiChannel The interface to PvaClientMultiChannel.
|
||||
* @param pvaClientChannelArray The PvaClientChannel array.
|
||||
@@ -277,7 +277,7 @@ class epicsShareClass PvaClientMultiMonitorDouble :
|
||||
|
||||
public:
|
||||
POINTER_DEFINITIONS(PvaClientMultiMonitorDouble);
|
||||
|
||||
|
||||
/** @brief Create a PvaClientMultiMonitorDouble.
|
||||
* @param pvaClientMultiChannel The interface to PvaClientMultiChannel.
|
||||
* @param pvaClientChannelArray The PvaClientChannel array.
|
||||
@@ -388,8 +388,8 @@ private:
|
||||
epics::pvData::PVStructurePtr pvRequest;
|
||||
size_t nchannel;
|
||||
epics::pvData::Mutex mutex;
|
||||
|
||||
|
||||
|
||||
|
||||
PvaClientNTMultiDataPtr pvaClientNTMultiData;
|
||||
std::vector<PvaClientGetPtr> pvaClientGet;
|
||||
bool isConnected;
|
||||
@@ -413,7 +413,7 @@ public:
|
||||
static PvaClientNTMultiPutPtr create(
|
||||
PvaClientMultiChannelPtr const &pvaClientMultiChannel,
|
||||
PvaClientChannelArray const &pvaClientChannelArray);
|
||||
|
||||
|
||||
~PvaClientNTMultiPut();
|
||||
/**
|
||||
* @brief Connect a channelPut for each channel.
|
||||
@@ -543,15 +543,15 @@ public:
|
||||
PvaClientChannelArray const &pvaClientChannelArray,
|
||||
epics::pvData::PVStructurePtr const & pvRequest);
|
||||
~PvaClientNTMultiData();
|
||||
|
||||
|
||||
/**
|
||||
* @brief Get the number of channels.
|
||||
* @return The number of channels.
|
||||
*/
|
||||
size_t getNumber();
|
||||
|
||||
|
||||
/**
|
||||
* @brief Set the timeStamp base for computing deltaTimes.
|
||||
* @brief Set the timeStamp base for computing deltaTimes.
|
||||
*/
|
||||
void startDeltaTime();
|
||||
/**
|
||||
@@ -564,7 +564,7 @@ public:
|
||||
* @brief Get the time when the last get was made.
|
||||
* @return The timeStamp.
|
||||
*/
|
||||
epics::pvData::TimeStamp getTimeStamp();
|
||||
epics::pvData::TimeStamp getTimeStamp();
|
||||
/**
|
||||
* @brief Get the NTMultiChannel.
|
||||
* @return The value.
|
||||
@@ -594,7 +594,7 @@ private:
|
||||
std::vector<epics::pvData::PVStructurePtr> topPVStructure;
|
||||
bool gotAlarm;
|
||||
bool gotTimeStamp;
|
||||
|
||||
|
||||
epics::pvData::StructureConstPtr ntMultiChannelStructure;
|
||||
epics::pvData::shared_vector<epics::pvData::PVUnionPtr> unionValue;
|
||||
epics::pvData::shared_vector<epics::pvData::int32> severity;
|
||||
@@ -615,4 +615,3 @@ private:
|
||||
}}
|
||||
|
||||
#endif /* PVACLIENTMULTICHANNEL_H */
|
||||
|
||||
|
||||
+5
-6
@@ -23,7 +23,7 @@ using namespace epics::pvAccess;
|
||||
using namespace epics::pvAccess::ca;
|
||||
using namespace std;
|
||||
|
||||
namespace epics { namespace pvaClient {
|
||||
namespace epics { namespace pvaClient {
|
||||
|
||||
|
||||
class epicsShareClass PvaClientChannelCache
|
||||
@@ -42,7 +42,7 @@ public:
|
||||
private:
|
||||
map<string,PvaClientChannelPtr> pvaClientChannelMap;
|
||||
};
|
||||
|
||||
|
||||
PvaClientChannelPtr PvaClientChannelCache::getChannel(
|
||||
string const & channelName,
|
||||
string const & providerName)
|
||||
@@ -77,7 +77,7 @@ void PvaClientChannelCache::showCache()
|
||||
string providerName = channel->getProvider()->getProviderName();
|
||||
cout << "channel " << channelName << " provider " << providerName << endl;
|
||||
pvaChannel->showCache();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
size_t PvaClientChannelCache::cacheSize()
|
||||
@@ -137,7 +137,7 @@ PvaClient::PvaClient(std::string const & providerNames)
|
||||
}
|
||||
CAClientFactory::start();
|
||||
caStarted = true;
|
||||
} else {
|
||||
} else {
|
||||
if(!channelRegistry->getProvider(providerName)) {
|
||||
cerr << "PvaClient::get provider " << providerName << " not known" << endl;
|
||||
}
|
||||
@@ -191,7 +191,7 @@ PvaClientChannelPtr PvaClient::channel(
|
||||
std::string const & providerName,
|
||||
double timeOut)
|
||||
{
|
||||
PvaClientChannelPtr pvaClientChannel =
|
||||
PvaClientChannelPtr pvaClientChannel =
|
||||
pvaClientChannelCache->getChannel(channelName,providerName);
|
||||
if(pvaClientChannel) return pvaClientChannel;
|
||||
pvaClientChannel = createChannel(channelName,providerName);
|
||||
@@ -231,4 +231,3 @@ size_t PvaClient::cacheSize()
|
||||
}
|
||||
|
||||
}}
|
||||
|
||||
|
||||
@@ -183,7 +183,7 @@ void PvaClientChannel::channelCreated(const Status& status, Channel::shared_poin
|
||||
throw std::runtime_error(message);
|
||||
}
|
||||
if(channel->isConnected()) {
|
||||
connectState = connected;
|
||||
connectState = connected;
|
||||
waitForConnect.signal();
|
||||
}
|
||||
}
|
||||
@@ -267,7 +267,7 @@ void PvaClientChannel::connect(double timeout)
|
||||
Status status = waitConnect(timeout);
|
||||
if(status.isOK()) return;
|
||||
if(PvaClient::getDebug()) cout << "PvaClientChannel::connect waitConnect failed\n";
|
||||
string message = string("channel ") + channelName
|
||||
string message = string("channel ") + channelName
|
||||
+ " PvaClientChannel::connect " + status.getMessage();
|
||||
throw std::runtime_error(message);
|
||||
}
|
||||
@@ -330,7 +330,7 @@ PvaClientProcessPtr PvaClientChannel::createProcess(string const & request)
|
||||
{
|
||||
PVStructurePtr pvRequest = createRequest->createRequest(request);
|
||||
if(!pvRequest) {
|
||||
string message = string("channel ") + channelName
|
||||
string message = string("channel ") + channelName
|
||||
+ " PvaClientChannel::createProcess invalid pvRequest: "
|
||||
+ createRequest->getMessage();
|
||||
throw std::runtime_error(message);
|
||||
@@ -364,7 +364,7 @@ PvaClientGetPtr PvaClientChannel::createGet(string const & request)
|
||||
{
|
||||
PVStructurePtr pvRequest = createRequest->createRequest(request);
|
||||
if(!pvRequest) {
|
||||
string message = string("channel ") + channelName
|
||||
string message = string("channel ") + channelName
|
||||
+ " PvaClientChannel::createGet invalid pvRequest: "
|
||||
+ createRequest->getMessage();
|
||||
throw std::runtime_error(message);
|
||||
@@ -419,7 +419,7 @@ PvaClientPutPtr PvaClientChannel::createPut(string const & request)
|
||||
{
|
||||
PVStructurePtr pvRequest = createRequest->createRequest(request);
|
||||
if(!pvRequest) {
|
||||
string message = string("channel ") + channelName
|
||||
string message = string("channel ") + channelName
|
||||
+ " PvaClientChannel::createPut invalid pvRequest: "
|
||||
+ createRequest->getMessage();
|
||||
throw std::runtime_error(message);
|
||||
@@ -477,7 +477,7 @@ PvaClientPutGetPtr PvaClientChannel::createPutGet(string const & request)
|
||||
{
|
||||
PVStructurePtr pvRequest = createRequest->createRequest(request);
|
||||
if(!pvRequest) {
|
||||
string message = string("channel ") + channelName
|
||||
string message = string("channel ") + channelName
|
||||
+ " PvaClientChannel::createPutGet invalid pvRequest: "
|
||||
+ createRequest->getMessage();
|
||||
throw std::runtime_error(message);
|
||||
@@ -499,7 +499,7 @@ PvaClientArrayPtr PvaClientChannel::createArray(string const & request)
|
||||
{
|
||||
PVStructurePtr pvRequest = createRequest->createRequest(request);
|
||||
if(!pvRequest) {
|
||||
string message = string("channel ") + channelName
|
||||
string message = string("channel ") + channelName
|
||||
+ " PvaClientChannel::createArray invalid pvRequest: "
|
||||
+ createRequest->getMessage();
|
||||
throw std::runtime_error(message);
|
||||
@@ -541,7 +541,7 @@ PvaClientMonitorPtr PvaClientChannel::createMonitor(string const & request)
|
||||
{
|
||||
PVStructurePtr pvRequest = createRequest->createRequest(request);
|
||||
if(!pvRequest) {
|
||||
string message = string("channel ") + channelName
|
||||
string message = string("channel ") + channelName
|
||||
+ " PvaClientChannel::createMonitor invalid pvRequest: "
|
||||
+ createRequest->getMessage();
|
||||
throw std::runtime_error(message);
|
||||
@@ -561,7 +561,7 @@ PVStructurePtr PvaClientChannel::rpc(
|
||||
PVStructurePtr const & pvRequest,
|
||||
PVStructurePtr const & pvArgument)
|
||||
{
|
||||
|
||||
|
||||
PvaClientRPCPtr rpc = createRPC(pvRequest);
|
||||
return rpc->request(pvArgument);
|
||||
}
|
||||
|
||||
+191
-112
@@ -11,9 +11,17 @@
|
||||
|
||||
#include <typeinfo>
|
||||
#include <sstream>
|
||||
#include <istream>
|
||||
#include <ostream>
|
||||
|
||||
#include <pv/createRequest.h>
|
||||
#include <pv/convert.h>
|
||||
#include <pv/pvEnumerated.h>
|
||||
|
||||
#if EPICS_VERSION_INT>=VERSION_INT(3,15,0,1)
|
||||
# include <pv/json.h>
|
||||
# define USE_JSON
|
||||
#endif
|
||||
|
||||
#define epicsExportSharedSymbols
|
||||
|
||||
@@ -49,6 +57,30 @@ PvaClientData::PvaClientData(StructureConstPtr const & structure)
|
||||
{
|
||||
}
|
||||
|
||||
PVFieldPtr PvaClientData::getSinglePVField()
|
||||
{
|
||||
if(PvaClient::getDebug()) cout << "PvaClientData::getSinglePVField\n";
|
||||
PVStructurePtr pvStructure = getPVStructure();
|
||||
while(true) {
|
||||
const PVFieldPtrArray fieldPtrArray(pvStructure->getPVFields());
|
||||
if(fieldPtrArray.size()==0) {
|
||||
throw std::logic_error("PvaClientData::getSinglePVField() pvRequest for empty structure");
|
||||
}
|
||||
if(fieldPtrArray.size()!=1) {
|
||||
PVFieldPtr pvValue = pvStructure->getSubField("value");
|
||||
if(pvValue) {
|
||||
Type type = pvValue->getField()->getType();
|
||||
if(type!=epics::pvData::structure) return pvValue;
|
||||
}
|
||||
throw std::logic_error("PvaClientData::getSinglePVField() pvRequest for multiple fields");
|
||||
}
|
||||
PVFieldPtr pvField(fieldPtrArray[0]);
|
||||
Type type = pvField->getField()->getType();
|
||||
if(type!=epics::pvData::structure) return pvField;
|
||||
pvStructure = static_pointer_cast<PVStructure>(pvField);
|
||||
}
|
||||
}
|
||||
|
||||
void PvaClientData::checkValue()
|
||||
{
|
||||
if(PvaClient::getDebug()) cout << "PvaClientData::checkValue\n";
|
||||
@@ -106,6 +138,7 @@ void PvaClientData::setData(
|
||||
pvValue = pvStructure->getSubField("value");
|
||||
}
|
||||
|
||||
|
||||
bool PvaClientData::hasValue()
|
||||
{
|
||||
if(PvaClient::getDebug()) cout << "PvaClientData::hasValue\n";
|
||||
@@ -171,34 +204,12 @@ PVScalarArrayPtr PvaClientData::getScalarArrayValue()
|
||||
double PvaClientData::getDouble()
|
||||
{
|
||||
if(PvaClient::getDebug()) cout << "PvaClientData::getDouble\n";
|
||||
PVScalarPtr pvScalar;
|
||||
PVStructurePtr pvStructure = getPVStructure();
|
||||
PVFieldPtr pvValue = pvStructure->getSubField("value");
|
||||
if(pvValue) {
|
||||
Type type = pvValue->getField()->getType();
|
||||
if(type==scalar) pvScalar = static_pointer_cast<PVScalar>(pvValue);
|
||||
}
|
||||
if(!pvScalar) {
|
||||
while(true) {
|
||||
const PVFieldPtrArray fieldPtrArray(pvStructure->getPVFields());
|
||||
if(fieldPtrArray.size()!=1) {
|
||||
throw std::logic_error(
|
||||
"PvaClientData::getDouble() pvRequest for multiple fields");
|
||||
}
|
||||
PVFieldPtr pvField(fieldPtrArray[0]);
|
||||
Type type = pvField->getField()->getType();
|
||||
if(type==scalar) {
|
||||
pvScalar = static_pointer_cast<PVScalar>(pvField);
|
||||
break;
|
||||
}
|
||||
if(pvField->getField()->getType()!=epics::pvData::structure) break;
|
||||
pvStructure = static_pointer_cast<PVStructure>(pvField);
|
||||
}
|
||||
}
|
||||
if(!pvScalar) {
|
||||
throw std::logic_error(
|
||||
"PvaClientData::getDouble() did not find a scalar field");
|
||||
PVFieldPtr pvField = getSinglePVField();
|
||||
Type type = pvField->getField()->getType();
|
||||
if(type!=scalar) {
|
||||
throw std::logic_error("PvaClientData::getDouble() did not find a scalar field");
|
||||
}
|
||||
PVScalarPtr pvScalar = static_pointer_cast<PVScalar>(pvField);
|
||||
ScalarType scalarType = pvScalar->getScalar()->getScalarType();
|
||||
if(scalarType==pvDouble) {
|
||||
PVDoublePtr pvDouble = static_pointer_cast<PVDouble>(pvScalar);
|
||||
@@ -214,70 +225,24 @@ double PvaClientData::getDouble()
|
||||
string PvaClientData::getString()
|
||||
{
|
||||
if(PvaClient::getDebug()) cout << "PvaClientData::getString\n";
|
||||
PVScalarPtr pvScalar;
|
||||
PVStructurePtr pvStructure = getPVStructure();
|
||||
PVFieldPtr pvValue = pvStructure->getSubField("value");
|
||||
if(pvValue) {
|
||||
Type type = pvValue->getField()->getType();
|
||||
if(type==scalar) pvScalar = static_pointer_cast<PVScalar>(pvValue);
|
||||
}
|
||||
if(!pvScalar) {
|
||||
while(true) {
|
||||
const PVFieldPtrArray fieldPtrArray(pvStructure->getPVFields());
|
||||
if(fieldPtrArray.size()!=1) {
|
||||
throw std::logic_error(
|
||||
"PvaClientData::getString() pvRequest for multiple fields");
|
||||
}
|
||||
PVFieldPtr pvField(fieldPtrArray[0]);
|
||||
Type type = pvField->getField()->getType();
|
||||
if(type==scalar) {
|
||||
pvScalar = static_pointer_cast<PVScalar>(pvField);
|
||||
break;
|
||||
}
|
||||
if(pvField->getField()->getType()!=epics::pvData::structure) break;
|
||||
pvStructure = static_pointer_cast<PVStructure>(pvField);
|
||||
}
|
||||
}
|
||||
if(!pvScalar) {
|
||||
throw std::logic_error(
|
||||
"PvaClientData::getString() did not find a scalar field");
|
||||
PVFieldPtr pvField = getSinglePVField();
|
||||
Type type = pvField->getField()->getType();
|
||||
if(type!=scalar) {
|
||||
throw std::logic_error("PvaClientData::getString() did not find a scalar field");
|
||||
}
|
||||
PVScalarPtr pvScalar = static_pointer_cast<PVScalar>(pvField);
|
||||
return convert->toString(pvScalar);
|
||||
}
|
||||
|
||||
shared_vector<const double> PvaClientData::getDoubleArray()
|
||||
{
|
||||
if(PvaClient::getDebug()) cout << "PvaClientData::getDoubleArray\n";
|
||||
PVScalarArrayPtr pvScalarArray;
|
||||
PVStructurePtr pvStructure = getPVStructure();
|
||||
PVFieldPtr pvValue = pvStructure->getSubField("value");
|
||||
if(pvValue) {
|
||||
Type type = pvValue->getField()->getType();
|
||||
if(type==scalarArray) {
|
||||
pvScalarArray = static_pointer_cast<PVScalarArray>(pvValue);
|
||||
}
|
||||
}
|
||||
if(!pvScalarArray) {
|
||||
while(true) {
|
||||
const PVFieldPtrArray fieldPtrArray(pvStructure->getPVFields());
|
||||
if(fieldPtrArray.size()!=1) {
|
||||
throw std::logic_error(
|
||||
"PvaClientData::getDoubleArray() pvRequest for multiple fields");
|
||||
}
|
||||
PVFieldPtr pvField(fieldPtrArray[0]);
|
||||
Type type = pvField->getField()->getType();
|
||||
if(type==scalarArray) {
|
||||
pvScalarArray = static_pointer_cast<PVScalarArray>(pvField);
|
||||
break;
|
||||
}
|
||||
if(pvField->getField()->getType()!=epics::pvData::structure) break;
|
||||
pvStructure = static_pointer_cast<PVStructure>(pvField);
|
||||
}
|
||||
}
|
||||
if(!pvScalarArray) {
|
||||
throw std::logic_error(
|
||||
"PvaClientData::getDoubleArray() did not find a scalarArray field");
|
||||
PVFieldPtr pvField = getSinglePVField();
|
||||
Type type = pvField->getField()->getType();
|
||||
if(type!=scalarArray) {
|
||||
throw std::logic_error("PvaClientData::getDoubleArray() did not find a scalarArray field");
|
||||
}
|
||||
PVScalarArrayPtr pvScalarArray = static_pointer_cast<PVScalarArray>(pvField);
|
||||
ScalarType scalarType = pvScalarArray->getScalarArray()->getElementType();
|
||||
if(!ScalarTypeFunc::isNumeric(scalarType)) {
|
||||
throw std::logic_error(
|
||||
@@ -291,36 +256,12 @@ shared_vector<const double> PvaClientData::getDoubleArray()
|
||||
shared_vector<const string> PvaClientData::getStringArray()
|
||||
{
|
||||
if(PvaClient::getDebug()) cout << "PvaClientData::getStringArray\n";
|
||||
PVScalarArrayPtr pvScalarArray;
|
||||
PVStructurePtr pvStructure = getPVStructure();
|
||||
PVFieldPtr pvValue = pvStructure->getSubField("value");
|
||||
if(pvValue) {
|
||||
Type type = pvValue->getField()->getType();
|
||||
if(type==scalarArray) {
|
||||
pvScalarArray = static_pointer_cast<PVScalarArray>(pvValue);
|
||||
}
|
||||
}
|
||||
if(!pvScalarArray) {
|
||||
while(true) {
|
||||
const PVFieldPtrArray fieldPtrArray(pvStructure->getPVFields());
|
||||
if(fieldPtrArray.size()!=1) {
|
||||
throw std::logic_error(
|
||||
"PvaClientData::getStringArray() pvRequest for multiple fields");
|
||||
}
|
||||
PVFieldPtr pvField(fieldPtrArray[0]);
|
||||
Type type = pvField->getField()->getType();
|
||||
if(type==scalarArray) {
|
||||
pvScalarArray = static_pointer_cast<PVScalarArray>(pvField);
|
||||
break;
|
||||
}
|
||||
if(pvField->getField()->getType()!=epics::pvData::structure) break;
|
||||
pvStructure = static_pointer_cast<PVStructure>(pvField);
|
||||
}
|
||||
}
|
||||
if(!pvScalarArray) {
|
||||
throw std::logic_error(
|
||||
"PvaClientData::getStringArray() did not find a scalarArray field");
|
||||
PVFieldPtr pvField = getSinglePVField();
|
||||
Type type = pvField->getField()->getType();
|
||||
if(type!=scalarArray) {
|
||||
throw std::logic_error("PvaClientData::getStringArray() did not find a scalarArray field");
|
||||
}
|
||||
PVScalarArrayPtr pvScalarArray = static_pointer_cast<PVScalarArray>(pvField);
|
||||
shared_vector<const string> retValue;
|
||||
pvScalarArray->getAs<const string>(retValue);
|
||||
return retValue;
|
||||
@@ -358,4 +299,142 @@ TimeStamp PvaClientData::getTimeStamp()
|
||||
throw std::runtime_error(messagePrefix + noTimeStamp);
|
||||
}
|
||||
|
||||
void PvaClientData::zeroArrayLength()
|
||||
{
|
||||
if(!pvStructure) throw new std::runtime_error(messagePrefix + noStructure);
|
||||
zeroArrayLength(pvStructure);
|
||||
}
|
||||
void PvaClientData::parse(
|
||||
const std::string &arg,const PVFieldPtr &dest,BitSetPtr & bitSet)
|
||||
{
|
||||
#ifdef USE_JSON
|
||||
std::istringstream strm(arg);
|
||||
parseJSON(strm, dest,&(*bitSet));
|
||||
#else
|
||||
throw std::runtime_error("JSON support not built");
|
||||
#endif
|
||||
}
|
||||
|
||||
void PvaClientData::parse(
|
||||
const std::string &arg,const PVUnionPtr &pvUnion)
|
||||
{
|
||||
if(pvUnion->getUnion()->isVariant()) {
|
||||
throw std::runtime_error(messagePrefix + "varient union not implemented");
|
||||
}
|
||||
size_t iequals = arg.find_first_of('=');
|
||||
string field;
|
||||
string rest;
|
||||
if(iequals==std::string::npos) {
|
||||
string mess(arg);
|
||||
mess += " was expected to start with field=";
|
||||
throw std::runtime_error(messagePrefix + mess);
|
||||
}
|
||||
field = arg.substr(0,iequals);
|
||||
rest = arg.substr(iequals+1);
|
||||
PVFieldPtr pvField(pvUnion->select(field));
|
||||
if(pvField->getField()->getType()==epics::pvData::union_) {
|
||||
PVUnionPtr pvu = static_pointer_cast<PVUnion>(pvField);
|
||||
parse(rest,pvu);
|
||||
return;
|
||||
}
|
||||
BitSetPtr bs;
|
||||
parse(rest,pvField,bs);
|
||||
return;
|
||||
}
|
||||
|
||||
void PvaClientData::parse(const std::vector<std::string> &args)
|
||||
{
|
||||
if(!pvStructure) throw std::runtime_error(messagePrefix + noStructure);
|
||||
if(!bitSet) throw std::runtime_error(messagePrefix + noStructure);
|
||||
size_t num = args.size();
|
||||
if(num<1) throw std::runtime_error(messagePrefix + " no arguments");
|
||||
for(size_t i=0; i<num; ++i)
|
||||
{
|
||||
string val = args[i];
|
||||
size_t iequals = val.find_first_of('=');
|
||||
string field;
|
||||
string rest(val);
|
||||
if(iequals==std::string::npos) {
|
||||
parse(rest,pvStructure,bitSet);
|
||||
continue;
|
||||
}
|
||||
field = val.substr(0,iequals);
|
||||
rest = val.substr(iequals+1);
|
||||
if(field.size()==std::string::npos) {
|
||||
parse(rest,pvStructure,bitSet);
|
||||
continue;
|
||||
}
|
||||
PVFieldPtr pvField(pvStructure->getSubField(field));
|
||||
if(!pvField) throw std::runtime_error(messagePrefix + field +" does not exist");
|
||||
// look for enumerated structure
|
||||
PVEnumerated pvEnumerated;
|
||||
bool result = pvEnumerated.attach(pvField);
|
||||
if(result) {
|
||||
PVStringArray::const_svector choices(pvEnumerated.getChoices());
|
||||
for(size_t i=0; i<choices.size(); ++i) {
|
||||
if(choices[i]==rest) {
|
||||
pvEnumerated.setIndex(i);
|
||||
return;
|
||||
}
|
||||
}
|
||||
}
|
||||
// look for union
|
||||
PVUnionPtr pvUnion(pvStructure->getSubField<PVUnion>(field));
|
||||
if(pvUnion) {
|
||||
parse(rest,pvUnion);
|
||||
bitSet->set(pvUnion->getFieldOffset());
|
||||
return;
|
||||
}
|
||||
parse(rest,pvField,bitSet);
|
||||
}
|
||||
}
|
||||
|
||||
void PvaClientData::streamJSON(
|
||||
std::ostream& strm,
|
||||
bool ignoreUnprintable,
|
||||
bool multiLine)
|
||||
{
|
||||
#ifdef USE_JSON
|
||||
JSONPrintOptions opts;
|
||||
opts.ignoreUnprintable = ignoreUnprintable;
|
||||
opts.multiLine = multiLine;
|
||||
printJSON(strm,*pvStructure,*bitSet,opts);
|
||||
#else
|
||||
throw std::runtime_error("JSON support not built");
|
||||
#endif
|
||||
}
|
||||
|
||||
|
||||
void PvaClientData::zeroArrayLength(const epics::pvData::PVStructurePtr &pvStructure)
|
||||
{
|
||||
const PVFieldPtrArray pvFields(pvStructure->getPVFields());
|
||||
for(size_t i=0; i<pvFields.size(); ++i) {
|
||||
PVFieldPtr pvField = pvFields[i];
|
||||
Type type(pvField->getField()->getType());
|
||||
switch(type) {
|
||||
case epics::pvData::scalarArray:
|
||||
{
|
||||
PVScalarArrayPtr pvScalarArray = static_pointer_cast<PVScalarArray>(pvField);
|
||||
pvScalarArray->setLength(0);
|
||||
}
|
||||
break;
|
||||
case epics::pvData::structureArray:
|
||||
{
|
||||
PVStructureArrayPtr pvStructureArray = static_pointer_cast<PVStructureArray>(pvField);
|
||||
pvStructureArray->setLength(0);
|
||||
}
|
||||
break;
|
||||
case epics::pvData::structure:
|
||||
{
|
||||
PVStructurePtr pvStructure = static_pointer_cast<PVStructure>(pvField);
|
||||
zeroArrayLength(pvStructure);
|
||||
}
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
}}
|
||||
|
||||
@@ -55,7 +55,7 @@ public:
|
||||
{
|
||||
PvaClientGetPtr clientGet(pvaClientGet.lock());
|
||||
if(!clientGet) return;
|
||||
clientGet->channelGetConnect(status,channelGet,structure);
|
||||
clientGet->channelGetConnect(status,channelGet,structure);
|
||||
}
|
||||
|
||||
virtual void getDone(
|
||||
@@ -182,7 +182,7 @@ void PvaClientGet::channelGetConnect(
|
||||
req->channelGetConnect(status,shared_from_this());
|
||||
}
|
||||
waitForConnect.signal();
|
||||
|
||||
|
||||
}
|
||||
|
||||
void PvaClientGet::getDone(
|
||||
|
||||
@@ -57,21 +57,21 @@ public:
|
||||
{
|
||||
PvaClientMonitorPtr clientMonitor(pvaClientMonitor.lock());
|
||||
if(!clientMonitor) return;
|
||||
clientMonitor->monitorConnect(status,monitor,structure);
|
||||
clientMonitor->monitorConnect(status,monitor,structure);
|
||||
}
|
||||
|
||||
virtual void unlisten(epics::pvData::MonitorPtr const & monitor)
|
||||
{
|
||||
PvaClientMonitorPtr clientMonitor(pvaClientMonitor.lock());
|
||||
if(!clientMonitor) return;
|
||||
clientMonitor->unlisten(monitor);
|
||||
clientMonitor->unlisten(monitor);
|
||||
}
|
||||
|
||||
virtual void monitorEvent(epics::pvData::MonitorPtr const & monitor)
|
||||
{
|
||||
PvaClientMonitorPtr clientMonitor(pvaClientMonitor.lock());
|
||||
if(!clientMonitor) return;
|
||||
clientMonitor->monitorEvent(monitor);
|
||||
clientMonitor->monitorEvent(monitor);
|
||||
}
|
||||
};
|
||||
|
||||
@@ -131,7 +131,7 @@ PvaClientMonitor::PvaClientMonitor(
|
||||
{
|
||||
if(PvaClient::getDebug()) {
|
||||
cout<< "PvaClientMonitor::PvaClientMonitor\n"
|
||||
<< " channelName " << pvaClientChannel->getChannel()->getChannelName()
|
||||
<< " channelName " << pvaClientChannel->getChannel()->getChannelName()
|
||||
<< endl;
|
||||
}
|
||||
}
|
||||
@@ -276,7 +276,7 @@ void PvaClientMonitor::monitorEvent(MonitorPtr const & monitor)
|
||||
cout << "PvaClientMonitor::monitorEvent"
|
||||
<< " channelName " << pvaClientChannel->getChannel()->getChannelName()
|
||||
<< endl;
|
||||
}
|
||||
}
|
||||
PvaClientMonitorRequesterPtr req = pvaClientMonitorRequester.lock();
|
||||
if(req) req->event(shared_from_this());
|
||||
if(userWait) waitForEvent.signal();
|
||||
@@ -300,7 +300,7 @@ void PvaClientMonitor::connect()
|
||||
issueConnect();
|
||||
Status status = waitConnect();
|
||||
if(status.isOK()) return;
|
||||
string message = string("channel ")
|
||||
string message = string("channel ")
|
||||
+ pvaClientChannel->getChannel()->getChannelName()
|
||||
+ " PvaClientMonitor::connect "
|
||||
+ status.getMessage();
|
||||
|
||||
@@ -80,7 +80,7 @@ Status PvaClientMultiChannel::connect(double timeout)
|
||||
Status status = Status::Ok;
|
||||
size_t numBad = 0;
|
||||
for(size_t i=0; i< numChannel; ++i) {
|
||||
if(numBad==0) {
|
||||
if(numBad==0) {
|
||||
status = pvaClientChannelArray[i]->waitConnect(timeout);
|
||||
} else {
|
||||
status = pvaClientChannelArray[i]->waitConnect(.001);
|
||||
@@ -140,7 +140,7 @@ PvaClientPtr PvaClientMultiChannel::getPvaClient()
|
||||
return pvaClient;
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
PvaClientMultiGetDoublePtr PvaClientMultiChannel::createGet()
|
||||
{
|
||||
|
||||
@@ -21,7 +21,7 @@ using namespace epics::pvAccess;
|
||||
using namespace epics::nt;
|
||||
using namespace std;
|
||||
|
||||
namespace epics { namespace pvaClient {
|
||||
namespace epics { namespace pvaClient {
|
||||
|
||||
|
||||
PvaClientMultiGetDoublePtr PvaClientMultiGetDouble::create(
|
||||
@@ -79,7 +79,7 @@ epics::pvData::shared_vector<double> PvaClientMultiGetDouble::get()
|
||||
{
|
||||
if(!isGetConnected) connect();
|
||||
shared_vector<epics::pvData::boolean> isConnected = pvaClientMultiChannel->getIsConnected();
|
||||
|
||||
|
||||
for(size_t i=0; i<nchannel; ++i)
|
||||
{
|
||||
if(isConnected[i]) {
|
||||
@@ -96,7 +96,7 @@ epics::pvData::shared_vector<double> PvaClientMultiGetDouble::get()
|
||||
throw std::runtime_error(message);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
for(size_t i=0; i<nchannel; ++i)
|
||||
{
|
||||
if(isConnected[i])
|
||||
|
||||
@@ -21,7 +21,7 @@ using namespace epics::pvAccess;
|
||||
using namespace epics::nt;
|
||||
using namespace std;
|
||||
|
||||
namespace epics { namespace pvaClient {
|
||||
namespace epics { namespace pvaClient {
|
||||
|
||||
|
||||
PvaClientMultiMonitorDoublePtr PvaClientMultiMonitorDouble::create(
|
||||
|
||||
@@ -21,7 +21,7 @@ using namespace epics::pvAccess;
|
||||
using namespace epics::nt;
|
||||
using namespace std;
|
||||
|
||||
namespace epics { namespace pvaClient {
|
||||
namespace epics { namespace pvaClient {
|
||||
|
||||
|
||||
PvaClientMultiPutDoublePtr PvaClientMultiPutDouble::create(
|
||||
|
||||
@@ -20,7 +20,7 @@ using namespace epics::pvAccess;
|
||||
using namespace epics::nt;
|
||||
using namespace std;
|
||||
|
||||
namespace epics { namespace pvaClient {
|
||||
namespace epics { namespace pvaClient {
|
||||
|
||||
PvaClientNTMultiDataPtr PvaClientNTMultiData::create(
|
||||
epics::pvData::UnionConstPtr const & u,
|
||||
@@ -63,7 +63,7 @@ PvaClientNTMultiData::PvaClientNTMultiData(
|
||||
severity.resize(nchannel);
|
||||
status.resize(nchannel);
|
||||
message.resize(nchannel);
|
||||
|
||||
|
||||
}
|
||||
if(pvRequest->getSubField("field.timeStamp")) {
|
||||
gotTimeStamp = true;
|
||||
@@ -165,7 +165,7 @@ void PvaClientNTMultiData::endDeltaTime(bool valueOnly)
|
||||
userTag[i] = pvTag->get();
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -20,7 +20,7 @@ using namespace epics::pvAccess;
|
||||
using namespace epics::nt;
|
||||
using namespace std;
|
||||
|
||||
namespace epics { namespace pvaClient {
|
||||
namespace epics { namespace pvaClient {
|
||||
|
||||
|
||||
PvaClientNTMultiGetPtr PvaClientNTMultiGet::create(
|
||||
@@ -75,7 +75,7 @@ void PvaClientNTMultiGet::connect()
|
||||
if(isConnected[i]) {
|
||||
Status status = pvaClientGet[i]->waitConnect();
|
||||
if(status.isOK()) continue;
|
||||
string message = string("channel ") +pvaClientChannelArray[i]->getChannelName()
|
||||
string message = string("channel ") +pvaClientChannelArray[i]->getChannelName()
|
||||
+ " PvaChannelGet::waitConnect " + status.getMessage();
|
||||
throw std::runtime_error(message);
|
||||
}
|
||||
@@ -87,7 +87,7 @@ void PvaClientNTMultiGet::get(bool valueOnly)
|
||||
{
|
||||
if(!isConnected) connect();
|
||||
shared_vector<epics::pvData::boolean> isConnected = pvaClientMultiChannel->getIsConnected();
|
||||
|
||||
|
||||
for(size_t i=0; i<nchannel; ++i)
|
||||
{
|
||||
if(isConnected[i]) {
|
||||
@@ -99,7 +99,7 @@ void PvaClientNTMultiGet::get(bool valueOnly)
|
||||
if(isConnected[i]) {
|
||||
Status status = pvaClientGet[i]->waitGet();
|
||||
if(status.isOK()) continue;
|
||||
string message = string("channel ") +pvaClientChannelArray[i]->getChannelName()
|
||||
string message = string("channel ") +pvaClientChannelArray[i]->getChannelName()
|
||||
+ " PvaChannelGet::waitGet " + status.getMessage();
|
||||
throw std::runtime_error(message);
|
||||
}
|
||||
|
||||
@@ -23,7 +23,7 @@ using namespace epics::pvAccess;
|
||||
using namespace epics::nt;
|
||||
using namespace std;
|
||||
|
||||
namespace epics { namespace pvaClient {
|
||||
namespace epics { namespace pvaClient {
|
||||
|
||||
PvaClientNTMultiMonitorPtr PvaClientNTMultiMonitor::create(
|
||||
PvaClientMultiChannelPtr const &pvaMultiChannel,
|
||||
@@ -79,7 +79,7 @@ void PvaClientNTMultiMonitor::connect()
|
||||
if(isConnected[i]) {
|
||||
Status status = pvaClientMonitor[i]->waitConnect();
|
||||
if(status.isOK()) continue;
|
||||
string message = string("channel ") +pvaClientChannelArray[i]->getChannelName()
|
||||
string message = string("channel ") +pvaClientChannelArray[i]->getChannelName()
|
||||
+ " PvaChannelMonitor::waitConnect " + status.getMessage();
|
||||
throw std::runtime_error(message);
|
||||
}
|
||||
|
||||
@@ -22,7 +22,7 @@ using namespace epics::pvAccess;
|
||||
using namespace epics::nt;
|
||||
using namespace std;
|
||||
|
||||
namespace epics { namespace pvaClient {
|
||||
namespace epics { namespace pvaClient {
|
||||
|
||||
PvaClientNTMultiPutPtr PvaClientNTMultiPut::create(
|
||||
PvaClientMultiChannelPtr const &pvaMultiChannel,
|
||||
@@ -67,7 +67,7 @@ void PvaClientNTMultiPut::connect()
|
||||
if(isConnected[i]) {
|
||||
Status status = pvaClientPut[i]->waitConnect();
|
||||
if(status.isOK()) continue;
|
||||
string message = string("channel ") +pvaClientChannelArray[i]->getChannelName()
|
||||
string message = string("channel ") +pvaClientChannelArray[i]->getChannelName()
|
||||
+ " PvaChannelPut::waitConnect " + status.getMessage();
|
||||
throw std::runtime_error(message);
|
||||
}
|
||||
@@ -83,7 +83,7 @@ void PvaClientNTMultiPut::connect()
|
||||
if(isConnected[i]) {
|
||||
Status status = pvaClientPut[i]->waitGet();
|
||||
if(status.isOK()) continue;
|
||||
string message = string("channel ") +pvaClientChannelArray[i]->getChannelName()
|
||||
string message = string("channel ") +pvaClientChannelArray[i]->getChannelName()
|
||||
+ " PvaChannelPut::waitGet " + status.getMessage();
|
||||
throw std::runtime_error(message);
|
||||
}
|
||||
@@ -121,9 +121,9 @@ void PvaClientNTMultiPut::put()
|
||||
if(isConnected[i]) {
|
||||
Status status = pvaClientPut[i]->waitPut();
|
||||
if(status.isOK()) continue;
|
||||
string message = string("channel ") +pvaClientChannelArray[i]->getChannelName()
|
||||
string message = string("channel ") +pvaClientChannelArray[i]->getChannelName()
|
||||
+ " PvaChannelPut::waitPut " + status.getMessage();
|
||||
throw std::runtime_error(message);
|
||||
throw std::runtime_error(message);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -54,7 +54,7 @@ public:
|
||||
{
|
||||
PvaClientProcessPtr clientProcess(pvaClientProcess.lock());
|
||||
if(!clientProcess) return;
|
||||
clientProcess->channelProcessConnect(status,channelProcess);
|
||||
clientProcess->channelProcessConnect(status,channelProcess);
|
||||
}
|
||||
|
||||
virtual void processDone(
|
||||
@@ -156,7 +156,7 @@ void PvaClientProcess::channelProcessConnect(
|
||||
req->channelProcessConnect(status,shared_from_this());
|
||||
}
|
||||
waitForConnect.signal();
|
||||
|
||||
|
||||
}
|
||||
|
||||
void PvaClientProcess::processDone(
|
||||
@@ -174,7 +174,7 @@ void PvaClientProcess::processDone(
|
||||
channelProcessStatus = status;
|
||||
processState = processComplete;
|
||||
}
|
||||
|
||||
|
||||
PvaClientProcessRequesterPtr req(pvaClientProcessRequester.lock());
|
||||
if(req) {
|
||||
req->processDone(status,shared_from_this());
|
||||
|
||||
@@ -55,7 +55,7 @@ public:
|
||||
{
|
||||
PvaClientPutPtr clientPut(pvaClientPut.lock());
|
||||
if(!clientPut) return;
|
||||
clientPut->channelPutConnect(status,channelPut,structure);
|
||||
clientPut->channelPutConnect(status,channelPut,structure);
|
||||
}
|
||||
|
||||
virtual void getDone(
|
||||
@@ -183,7 +183,7 @@ void PvaClientPut::channelPutConnect(
|
||||
req->channelPutConnect(status,shared_from_this());
|
||||
}
|
||||
waitForConnect.signal();
|
||||
|
||||
|
||||
}
|
||||
|
||||
void PvaClientPut::getDone(
|
||||
@@ -249,7 +249,7 @@ void PvaClientPut::connect()
|
||||
issueConnect();
|
||||
Status status = waitConnect();
|
||||
if(status.isOK()) return;
|
||||
string message = string("channel ")
|
||||
string message = string("channel ")
|
||||
+ pvaClientChannel->getChannel()->getChannelName()
|
||||
+ " PvaClientPut::connect "
|
||||
+ status.getMessage();
|
||||
@@ -271,7 +271,7 @@ void PvaClientPut::issueConnect()
|
||||
connectState = connectActive;
|
||||
channelPutConnectStatus = Status(Status::STATUSTYPE_ERROR, "connect active");
|
||||
channelPut = pvaClientChannel->getChannel()->createChannelPut(channelPutRequester,pvRequest);
|
||||
|
||||
|
||||
}
|
||||
|
||||
Status PvaClientPut::waitConnect()
|
||||
@@ -308,7 +308,7 @@ void PvaClientPut::get()
|
||||
issueGet();
|
||||
Status status = waitGet();
|
||||
if(status.isOK()) return;
|
||||
string message = string("channel ")
|
||||
string message = string("channel ")
|
||||
+ pvaClientChannel->getChannel()->getChannelName()
|
||||
+ " PvaClientPut::get "
|
||||
+ status.getMessage();
|
||||
@@ -376,7 +376,7 @@ void PvaClientPut::issuePut()
|
||||
if(PvaClient::getDebug()) {
|
||||
cout << "PvaClientPut::issuePut"
|
||||
<< " channelName " << pvaClientChannel->getChannel()->getChannelName()
|
||||
<< " pvStructure\n" << pvaClientData->getPVStructure()
|
||||
<< " pvStructure\n" << pvaClientData->getPVStructure()
|
||||
<< " bitSet " << *pvaClientData->getChangedBitSet() << endl
|
||||
<< endl;
|
||||
}
|
||||
|
||||
+20
-112
@@ -74,34 +74,12 @@ PvaClientPutData::PvaClientPutData(StructureConstPtr const & structure)
|
||||
void PvaClientPutData::putDouble(double value)
|
||||
{
|
||||
if(PvaClient::getDebug()) cout << "PvaClientPutData::putDouble\n";
|
||||
PVScalarPtr pvScalar;
|
||||
PVStructurePtr pvStructure = getPVStructure();
|
||||
PVFieldPtr pvValue = pvStructure->getSubField("value");
|
||||
if(pvValue) {
|
||||
Type type = pvValue->getField()->getType();
|
||||
if(type==scalar) pvScalar = static_pointer_cast<PVScalar>(pvValue);
|
||||
}
|
||||
if(!pvScalar) {
|
||||
while(true) {
|
||||
const PVFieldPtrArray fieldPtrArray(pvStructure->getPVFields());
|
||||
if(fieldPtrArray.size()!=1) {
|
||||
throw std::logic_error(
|
||||
"PvaClientData::putDouble() pvRequest for multiple fields");
|
||||
}
|
||||
PVFieldPtr pvField(fieldPtrArray[0]);
|
||||
Type type = pvField->getField()->getType();
|
||||
if(type==scalar) {
|
||||
pvScalar = static_pointer_cast<PVScalar>(pvField);
|
||||
break;
|
||||
}
|
||||
if(pvField->getField()->getType()!=epics::pvData::structure) break;
|
||||
pvStructure = static_pointer_cast<PVStructure>(pvField);
|
||||
}
|
||||
}
|
||||
if(!pvScalar) {
|
||||
throw std::logic_error(
|
||||
"PvaClientData::putDouble() did not find a scalar field");
|
||||
PVFieldPtr pvField = getSinglePVField();
|
||||
Type type = pvField->getField()->getType();
|
||||
if(type!=scalar) {
|
||||
throw std::logic_error("PvaClientData::putDouble() did not find a scalar field");
|
||||
}
|
||||
PVScalarPtr pvScalar = static_pointer_cast<PVScalar>(pvField);
|
||||
ScalarType scalarType = pvScalar->getScalar()->getScalarType();
|
||||
if(scalarType==pvDouble) {
|
||||
PVDoublePtr pvDouble = static_pointer_cast<PVDouble>(pvScalar);
|
||||
@@ -118,70 +96,24 @@ void PvaClientPutData::putDouble(double value)
|
||||
void PvaClientPutData::putString(std::string const & value)
|
||||
{
|
||||
if(PvaClient::getDebug()) cout << "PvaClientPutData::putString\n";
|
||||
PVScalarPtr pvScalar;
|
||||
PVStructurePtr pvStructure = getPVStructure();
|
||||
PVFieldPtr pvValue = pvStructure->getSubField("value");
|
||||
if(pvValue) {
|
||||
Type type = pvValue->getField()->getType();
|
||||
if(type==scalar) pvScalar = static_pointer_cast<PVScalar>(pvValue);
|
||||
}
|
||||
if(!pvScalar) {
|
||||
while(true) {
|
||||
const PVFieldPtrArray fieldPtrArray(pvStructure->getPVFields());
|
||||
if(fieldPtrArray.size()!=1) {
|
||||
throw std::logic_error(
|
||||
"PvaClientData::putString() pvRequest for multiple fields");
|
||||
}
|
||||
PVFieldPtr pvField(fieldPtrArray[0]);
|
||||
Type type = pvField->getField()->getType();
|
||||
if(type==scalar) {
|
||||
pvScalar = static_pointer_cast<PVScalar>(pvField);
|
||||
break;
|
||||
}
|
||||
if(pvField->getField()->getType()!=epics::pvData::structure) break;
|
||||
pvStructure = static_pointer_cast<PVStructure>(pvField);
|
||||
}
|
||||
}
|
||||
if(!pvScalar) {
|
||||
throw std::logic_error(
|
||||
"PvaClientData::putString() did not find a scalar field");
|
||||
PVFieldPtr pvField = getSinglePVField();
|
||||
Type type = pvField->getField()->getType();
|
||||
if(type!=scalar) {
|
||||
throw std::logic_error("PvaClientData::putString() did not find a scalar field");
|
||||
}
|
||||
PVScalarPtr pvScalar = static_pointer_cast<PVScalar>(pvField);
|
||||
convert->fromString(pvScalar,value);
|
||||
}
|
||||
|
||||
void PvaClientPutData::putDoubleArray(shared_vector<const double> const & value)
|
||||
{
|
||||
if(PvaClient::getDebug()) cout << "PvaClientPutData::putDoubleArray\n";
|
||||
PVScalarArrayPtr pvScalarArray;
|
||||
PVStructurePtr pvStructure = getPVStructure();
|
||||
PVFieldPtr pvValue = pvStructure->getSubField("value");
|
||||
if(pvValue) {
|
||||
Type type = pvValue->getField()->getType();
|
||||
if(type==scalarArray) {
|
||||
pvScalarArray = static_pointer_cast<PVScalarArray>(pvValue);
|
||||
}
|
||||
}
|
||||
if(!pvScalarArray) {
|
||||
while(true) {
|
||||
const PVFieldPtrArray fieldPtrArray(pvStructure->getPVFields());
|
||||
if(fieldPtrArray.size()!=1) {
|
||||
throw std::logic_error(
|
||||
"PvaClientData::putDoubleArray() pvRequest for multiple fields");
|
||||
}
|
||||
PVFieldPtr pvField(fieldPtrArray[0]);
|
||||
Type type = pvField->getField()->getType();
|
||||
if(type==scalarArray) {
|
||||
PVScalarArrayPtr pvScalarArray = static_pointer_cast<PVScalarArray>(pvField);
|
||||
break;
|
||||
}
|
||||
if(pvField->getField()->getType()!=epics::pvData::structure) break;
|
||||
pvStructure = static_pointer_cast<PVStructure>(pvField);
|
||||
}
|
||||
}
|
||||
if(!pvScalarArray) {
|
||||
throw std::logic_error(
|
||||
"PvaClientData::putDoubleArray() did not find a scalarArray field");
|
||||
PVFieldPtr pvField = getSinglePVField();
|
||||
Type type = pvField->getField()->getType();
|
||||
if(type!=scalarArray) {
|
||||
throw std::logic_error("PvaClientData::putDoubleArray() did not find a scalarArray field");
|
||||
}
|
||||
PVScalarArrayPtr pvScalarArray = static_pointer_cast<PVScalarArray>(pvField);
|
||||
ScalarType scalarType = pvScalarArray->getScalarArray()->getElementType();
|
||||
if(!ScalarTypeFunc::isNumeric(scalarType)) {
|
||||
throw std::logic_error(
|
||||
@@ -193,36 +125,12 @@ void PvaClientPutData::putDoubleArray(shared_vector<const double> const & value)
|
||||
void PvaClientPutData::putStringArray(shared_vector<const std::string> const & value)
|
||||
{
|
||||
if(PvaClient::getDebug()) cout << "PvaClientPutData::putStringArray\n";
|
||||
PVScalarArrayPtr pvScalarArray;
|
||||
PVStructurePtr pvStructure = getPVStructure();
|
||||
PVFieldPtr pvValue = pvStructure->getSubField("value");
|
||||
if(pvValue) {
|
||||
Type type = pvValue->getField()->getType();
|
||||
if(type==scalarArray) {
|
||||
pvScalarArray = static_pointer_cast<PVScalarArray>(pvValue);
|
||||
}
|
||||
}
|
||||
if(!pvScalarArray) {
|
||||
while(true) {
|
||||
const PVFieldPtrArray fieldPtrArray(pvStructure->getPVFields());
|
||||
if(fieldPtrArray.size()!=1) {
|
||||
throw std::logic_error(
|
||||
"PvaClientData::putStringArray() pvRequest for multiple fields");
|
||||
}
|
||||
PVFieldPtr pvField(fieldPtrArray[0]);
|
||||
Type type = pvField->getField()->getType();
|
||||
if(type==scalarArray) {
|
||||
pvScalarArray = static_pointer_cast<PVScalarArray>(pvField);
|
||||
break;
|
||||
}
|
||||
if(pvField->getField()->getType()!=epics::pvData::structure) break;
|
||||
pvStructure = static_pointer_cast<PVStructure>(pvField);
|
||||
}
|
||||
}
|
||||
if(!pvScalarArray) {
|
||||
throw std::logic_error(
|
||||
"PvaClientData::putStringArray() did not find a scalarArray field");
|
||||
PVFieldPtr pvField = getSinglePVField();
|
||||
Type type = pvField->getField()->getType();
|
||||
if(type!=scalarArray) {
|
||||
throw std::logic_error("PvaClientData::putStringArray() did not find a scalarArray field");
|
||||
}
|
||||
PVScalarArrayPtr pvScalarArray = static_pointer_cast<PVScalarArray>(pvField);
|
||||
pvScalarArray->putFrom<const string>(value);
|
||||
return;
|
||||
}
|
||||
|
||||
@@ -55,7 +55,7 @@ public:
|
||||
{
|
||||
PvaClientPutGetPtr clientPutGet(pvaClientPutGet.lock());
|
||||
if(!clientPutGet) return;
|
||||
clientPutGet->channelPutGetConnect(status,channelPutGet,putStructure,getStructure);
|
||||
clientPutGet->channelPutGetConnect(status,channelPutGet,putStructure,getStructure);
|
||||
}
|
||||
|
||||
virtual void putGetDone(
|
||||
@@ -173,7 +173,7 @@ void PvaClientPutGet::channelPutGetConnect(
|
||||
<< " channelName " << pvaClientChannel->getChannel()->getChannelName()
|
||||
<< " status.isOK " << (status.isOK() ? "true" : "false")
|
||||
<< endl;
|
||||
}
|
||||
}
|
||||
{
|
||||
Lock xx(mutex);
|
||||
this->channelPutGet = channelPutGet;
|
||||
@@ -184,7 +184,7 @@ void PvaClientPutGet::channelPutGetConnect(
|
||||
pvaClientPutData->setMessagePrefix(channelPutGet->getChannel()->getChannelName());
|
||||
pvaClientGetData = PvaClientGetData::create(getStructure);
|
||||
pvaClientGetData->setMessagePrefix(channelPutGet->getChannel()->getChannelName());
|
||||
|
||||
|
||||
} else {
|
||||
stringstream ss;
|
||||
ss << pvRequest;
|
||||
@@ -199,7 +199,7 @@ void PvaClientPutGet::channelPutGetConnect(
|
||||
req->channelPutGetConnect(status,shared_from_this());
|
||||
}
|
||||
waitForConnect.signal();
|
||||
|
||||
|
||||
}
|
||||
|
||||
void PvaClientPutGet::putGetDone(
|
||||
@@ -297,7 +297,7 @@ void PvaClientPutGet::connect()
|
||||
issueConnect();
|
||||
Status status = waitConnect();
|
||||
if(status.isOK()) return;
|
||||
string message = string("channel ")
|
||||
string message = string("channel ")
|
||||
+ pvaClientChannel->getChannel()->getChannelName()
|
||||
+ " PvaClientPutGet::connect "
|
||||
+ status.getMessage();
|
||||
@@ -358,7 +358,7 @@ void PvaClientPutGet::putGet()
|
||||
issuePutGet();
|
||||
Status status = waitPutGet();
|
||||
if(status.isOK()) return;
|
||||
string message = string("channel ")
|
||||
string message = string("channel ")
|
||||
+ pvaClientChannel->getChannel()->getChannelName()
|
||||
+ " PvaClientPut::putGet "
|
||||
+ status.getMessage();
|
||||
@@ -413,7 +413,7 @@ void PvaClientPutGet::getGet()
|
||||
issueGetGet();
|
||||
Status status = waitGetGet();
|
||||
if(status.isOK()) return;
|
||||
string message = string("channel ")
|
||||
string message = string("channel ")
|
||||
+ pvaClientChannel->getChannel()->getChannelName()
|
||||
+ " PvaClientPut::getGet "
|
||||
+ status.getMessage();
|
||||
@@ -466,7 +466,7 @@ void PvaClientPutGet::getPut()
|
||||
issueGetPut();
|
||||
Status status = waitGetPut();
|
||||
if(status.isOK()) return;
|
||||
string message = string("channel ")
|
||||
string message = string("channel ")
|
||||
+ pvaClientChannel->getChannel()->getChannelName()
|
||||
+ " PvaClientPut::getPut "
|
||||
+ status.getMessage();
|
||||
|
||||
@@ -94,7 +94,7 @@ PvaClientRPC::PvaClientRPC(
|
||||
PvaClientPtr const &pvaClient,
|
||||
Channel::shared_pointer const & channel,
|
||||
PVStructurePtr const &pvRequest)
|
||||
:
|
||||
:
|
||||
connectState(connectIdle),
|
||||
pvaClient(pvaClient),
|
||||
channel(channel),
|
||||
@@ -104,7 +104,7 @@ PvaClientRPC::PvaClientRPC(
|
||||
{
|
||||
if(PvaClient::getDebug()) {
|
||||
cout<< "PvaClientRPC::PvaClientRPC()"
|
||||
<< " channelName " << channel->getChannelName()
|
||||
<< " channelName " << channel->getChannelName()
|
||||
<< endl;
|
||||
}
|
||||
}
|
||||
@@ -170,7 +170,7 @@ void PvaClientRPC::rpcConnect(
|
||||
cout << "PvaClientRPC::rpcConnect calling waitForConnect.signal\n";
|
||||
}
|
||||
waitForConnect.signal();
|
||||
|
||||
|
||||
}
|
||||
|
||||
void PvaClientRPC::requestDone(
|
||||
@@ -195,7 +195,7 @@ void PvaClientRPC::requestDone(
|
||||
Channel::shared_pointer chan(channel.lock());
|
||||
if(chan) channelName = chan->getChannelName();
|
||||
string message = "channel "
|
||||
+ channelName
|
||||
+ channelName
|
||||
+" PvaClientRPC::requestDone"
|
||||
+ " but not active";
|
||||
throw std::runtime_error(message);
|
||||
@@ -222,7 +222,7 @@ void PvaClientRPC::connect()
|
||||
Channel::shared_pointer chan(channel.lock());
|
||||
string channelName("disconnected");
|
||||
if(chan) channelName = chan->getChannelName();
|
||||
string message = string("channel ")
|
||||
string message = string("channel ")
|
||||
+ channelName
|
||||
+ " PvaClientRPC::connect "
|
||||
+ status.getMessage();
|
||||
@@ -237,7 +237,7 @@ void PvaClientRPC::issueConnect()
|
||||
string channelName("disconnected");
|
||||
if(chan) channelName = chan->getChannelName();
|
||||
string message = string("channel ")
|
||||
+ channelName
|
||||
+ channelName
|
||||
+ " pvaClientRPC already connected ";
|
||||
throw std::runtime_error(message);
|
||||
}
|
||||
@@ -326,7 +326,7 @@ void PvaClientRPC::request(
|
||||
PVStructure::shared_pointer const & pvArgument,
|
||||
PvaClientRPCRequesterPtr const & pvaClientRPCRequester)
|
||||
{
|
||||
checkRPCState();
|
||||
checkRPCState();
|
||||
this->pvaClientRPCRequester = pvaClientRPCRequester;
|
||||
if(responseTimeout<=0.0) {
|
||||
{
|
||||
|
||||
Reference in New Issue
Block a user