I will agree with Jeff that adding new types to db_access.h and
implementing them is not an easy or desirable thing to do.
However I suggest that the way the JavaIOC handles data solves the
problem. The current implementation is in Java but support for the same
data types could be implemented in C++
I have attached the overview document for a new project called pvData.
pvData is the the next version of the data portion of the JavaIOC. The
xml syntax is completely different (due to comments from Matej and
Andrew). The types are simplified due to discussions with Matej. The
pvData project has what is required for data handling and can be used by
more than the JavaIOC. The next release of the JavaIOC will use pvData
instead of pvData being part of the javaIOC.
Marty
Jeff Hill wrote:
*6. CA Support for "Our ArchiveRecord" and Others*
The DESY archive record samples "value, time and severity" into an array
of structures. Unfortunately we can not pass this array over channel
access directly (as far as I know). So we have additional arrays with
value (double), seconds_epoch (ulong), nanoseconds (ulong) and severity
(short). It would be better and more safe (locking is not provided well
now) if we could use something like an array of
"DBR_TIME_DOUBLE_STAT_SEVR (or so).
I will leave Jeff Hill to comment on the feasibility of adding new request
types like this and the idea below to CA.
The quick answer is that there are two ways to do this.
1) We certainly can code new data types into the db_access data model. The primary obstacle to overcome, when satisfying your request, will be that CA and db_access both currently expect that arrays occur only with the value field, and that the value field is always the last field in the structure. Thus, making arrays of DBR_TIME_DOUBLE_STAT_SEVR tends to break data model consistency in a number of important places. In the CA client API, CA client library, in the CA protocol, in the CA server, and in the database library. I think that an inconsistent approach to arrays in the legacy CA client API is what we might be most fearful of. Furthermore, I think it's safe to say that the scale of the changes in the base codes is not making this appropriate for an R3.14 patch.
2) So it appears that we need a better API and when we make that jump it's important to adopt a flexible approach which will accommodate future needs. What we really need is more flexible APIs so we can have generalized client and service specified formats for aggregating data. I have written a design document (it's on the wiki) describing a new protocol that can have this level of flexibility, but for R3.15 we are concentrating only on new flexibility allowing service specified formats for aggregating data on the server's (IOC's) event queue, and on an ability for clients to specify in their subscriptions generic filtering expressions that test service specific parameters determining which subscription updates will be sent. We admit to being strongly requirements driven for our upgrade here at LANSCE, but nevertheless we are committed to a very general approach which should have excellent utility for the community.
To summarize, the db_access data model has many severe constraints, but changing the model to make its approach to arrays inconsistent may not be a great strategy, and making large changes in R3.14 probably isn’t a robustness enhancing strategy either. From my perspective, the Data Access library is the proper flexible, runtime bound, API for accessing client/service specified data aggregation formats that we will need in the future. Furthermore, wire protocol flexibility for client / service specified data formats is not on the short list, but event queue flexibility and API flexibility is. Once the near term event queue goals and API upgrades are done, then wire protocol flexibility looks like a logical next step. I admit to working specifically on LANSCE's immediately needs for its upgrade, and while protocol flexibility is certainly going to be very useful here it hasn’t been given as high a priority near term as the event queue changes.
Jeff
Title: EPICS PVData
EPICS PVData
Overview
2009.02.19
CONTENTS
Introduction
This product is available via the open source
license described at the end of this document.
PVData (Process Variable Data) defines and implements an efficent way to
store, access, and transmit memory resident structured data.
- definition
- Package org.epics.pvData.pv has Java interface definitions that
define PVData. Although defined with Java syntax they also document
what is required for implementation in other languages such as C++.
- implementation
- The set of packages provides by this project provide a complete Java
implementation of PVData. It will be used to implement Channel Access:
Network, Client, and Server. It is used by the JavaIOC.
- efficient
- Small memory footprint, low cpu overhead, and concise code base.
- store data
- PVData defines separate introspection and data interfaces. The
introspection interfaces provide access to immutable objects, which
allows introspection instances to be freely shared. The introspection
interface for a process variable can be accessed without requiring
access to the data.
- access data
- Client code can access PVData via the introspection and data
interfaces. For "well known" data, e.g. timeStamp, specialized
interfaces can be provided without requiring any changes to the core
software.
- transmit data
- The separation of introspection and data interfaces allows for
efficient network data transfer. At connection time introspection
information can be passed from server to client. Each side can create a
data instance. The data is transferred between these instances. The
data in the network buffers does not have to be self describing since
each side has the introspection information.
- memory resident
- PVData only defines memory resident data.
- structured data
- PVData has three types: scalar, array, and structure. A scalar can be
one of the following: boolean, byte, short, int, long, float, double,
string. An array is a one dimensional array with the element type being
a scalar. A structure is an ordered set of fields where each field has
a name and type. Since a field can have type structure complex
structures are supported. No other types are needed since structures
can be defined that simulate types.
A Process Variable (PV) Database, which is a memory resident database
holding PVData, has the following features:
- A database has records.
- Each record has a unique record name.
- A record is a structure.
- A field contains data of one of the following types:
- scalar : boolean, byte, short, int, long, float, double, string
- array: a 1-dim array with the elementType being any scalar
type.
- structure: a subStructure with each field being any of the
supported types.
PVData was initially created to support the JavaIOC and was part of the
JavaIOC project. It is now a separate project that is used by the JavaIOC. In
addition to the JavaIOC, PVData is intended for use by 1) Channel Access
Client, 2) Interface between client and network, 3) Interface between network
and Channel Access server, 4) Interface between Server and IOC database.
Since it is an interface to data, it could also be used by other systems,
e.g. TANGO, TINE, etc. A high level Physics application can hold data as
PVData. By starting a channel access server, the data can made available to
network clients.
PVData contains everything required to support Channel Access and Channel
Access clients and servers.
Interface Definitions
Types
The following are the type definitions:
public enum Type {
scalar,
scalarArray,
structure;
}
public enum ScalarType {
pvBoolean,
pvByte,pvShort,pvInt,pvLong,
pvFloat,pvDouble,
pvString;
// The following are convenience methods
public boolean isInteger();
public boolean isNumeric()
public boolean isPrimitive()
public static ScalarType getScalarType(String type);
}
- boolean
- true or false
- byte
- An 8 bit signed byte
- short
- 16 bit signed integer
- int
- 32 bit signed integer
- long
- 64 bit signed integer
- float
- 32 bit IEEE float
- double
- 64 bit IEEE float
- string
- An immutable string. The Java implementation is String. For other
implementations the network representation must be the same as for
Java.
- array
- A one dimensional array. The element type is any scalar type.
- structure
- A structure of fields where each field has a name and a type.
Introspection Interfaces
The complete set of introspection interfaces are:
public interface Field extends Serializable {
String getFieldName();
Type getType();
}
public interface Scalar extends Field{
ScalarType getScalarType();
}
public interface Array extends Field{
ScalarType getElementType();
}
public interface Structure extends Field{
String[] getFieldNames();
Field getField(String fieldName);
int getFieldIndex(String fieldName);
Field[] getFields();
}
The introspection interfaces provide access to immutable objects. This
allows introspection interfaces to be freely shared between data objects. For
example the introspection interface for a timeStamp, which is a structure
containing two fields, can be stared by every record that has a time
stamp.
Data Interfaces
PVField is the base interface for a data field:
public enum MessageType {info,warning,error,fatalError}
public interface Requester {
String getRequesterName();
void message(String message, MessageType messageType);
}
public interface Serializable {
void serialize(ByteBuffer buffer);
int getSerializationSize();
void deserialize(ByteBuffer buffer);
}
public interface PVAuxInfo {
PVField getPVField();
PVScalar createInfo(String key,ScalarType scalarType);
Map<String,PVScalar> getInfos();
PVScalar getInfo(String key);
}
public interface PVField extends Requester, Serializable {
Field getField();
PVStructure getParent();
PVRecord getPVRecord();
String getFullFieldName();
String getFullName();
PVAuxInfo getPVAuxInfo(); //auxillary information
boolean isMutable();
void setMutable(boolean value);
void replacePVField(PVField newPVField);
// following methods are for monitoring changes
boolean addListener(PVListener pvListener);
void removeListener(PVListener pvListener);
void postPut();
}
Each scalar type has an associated data interface: PVBoolean, PVByte,
PVShort, PVInt, PVLong, PVFloat, PVDouble, and PVString. Each has a get and a
put method. For example:
public interface PVDouble extends PVScalar{
double get();
void put(double value);
}
PVArray is the base class for arrays.
public interface PVArray extends PVField{
Array getArray();
int getLength();
void setLength(int len);
int getCapacity();
void setCapacity(int len);
boolean isCapacityMutable();
void setCapacityMutable(boolean isMutable);
}
For each scalar type an associated array data interface is defined. Each
has a get and put method. For example:
public class DoubleArrayData {
public double[] data;
public int offset;
}
public interface PVDoubleArray extends PVArray{
int get(int offset, int len, DoubleArrayData data);
int put(int offset,int len, double[] from, int fromOffset);
}
PVStructure is the data interface for a structure.
public interface PVStructure extends PVField {
Structure getStructure();
PVField[] getPVFields();
PVField getSubField(String fieldName);
boolean replaceStructureField(String fieldName,Structure structure);
void appendPVField(PVField pvField);
void postPut(PVField subField);
// The following are convenience methods
PVBoolean getBooleanField(String fieldName);
PVByte getByteField(String fieldName);
PVShort getShortField(String fieldName);
PVInt getIntField(String fieldName);
PVLong getLongField(String fieldName);
PVFloat getFloatField(String fieldName);
PVDouble getDoubleField(String fieldName);
PVString getStringField(String fieldName);
PVStructure getStructureField(String fieldName);
PVArray getArrayField(String fieldName,ScalarType elementType);
}
Introspection and Data creation
The following interface creates introspection instances:
public interface FieldCreate {
Scalar createScalar(String fieldName,ScalarType scalarType);
Array createArray(String fieldName,ScalarType elementType);
Structure createStructure(String fieldName, Field[] field);
}
The following interface creates data instances:
public interface PVDataCreate {
PVField createPVField(PVStructure parent, Field field);
PVScalar createPVScalar(PVStructure parent,Scalar scalar);
PVScalar createPVScalar(PVStructure parent,String fieldName,
ScalarType fieldType);
PVArray createPVArray(PVStructure parent,Array array);
PVArray createPVArray(PVStructure parent,String fieldName,
ScalarType elementType);
PVStructure createPVStructure(PVStructure parent,String fieldName,
Field[] fields);
PVStructure createPVStructure(PVStructure parent,String fieldName,
PVStructure structToClone);
PVStructure createPVStructure(PVStructure parent,String fieldName,
PVDatabase pvDatabase,String structureName);
PVRecord createPVRecord(String recordName,Field[] fields);
PVRecord createPVRecord(String recordName,PVStructure structToClone);
PVRecord createPVRecord(String recordName,PVDatabase pvDatabase,
String structureName);
}
PVData Conversion
An interface named Convert provides all reasonable conversions to/from
PVData. See org.epics.pvData.pv.Convert for details.
Package Summary
This document describes everything via Java definitions. The initial
implementation is in Java but the functionality could also be implemented in
other languages such as C++.
PVData is distributed as a eclipse Java Project named pvData. This project
consists of the following java packages:
{@link org.epics.pvData.pv}
The Java enum, interface, and class definitions that define PVData. This
section provides a complete definition of what PVData is. This package
completely describes how PVData is accessed.
{@link org.epics.pvData.factory}
Java Facilities for creating a PV Database and PVData. It provides
everything required for creating PVData. It provides the following
factories:
- FieldFactory
- Creates introspection interfaces.
- PVDataFactory
- Creates data interfaces for all of the supported data types.
- PVDatabaseFactory
- Creates and manages PVData databases. A database contains memory
resident structures and records. Structures make it easy to create
structure fields with pre-defined fields.
- ConvertFactory
- Converts between support data types.
- PVReplaceFactory
- Finds all fields within each record of a database that have an
associated factory that implements a replacement for the default
implementation for the field.
Although PVDataFactory can provide the implementation for all supported
data types, often it is desirable to provide other implementations. To make
it easy to create alternate implementations a set of abstract and base
classes are supplied.
{@link org.epics.pvData.property}
Provides a way to associated properties with a field.
The basic idea is to associate properties with any field named "value".
All the fields in the structure that contains the value field are considered
properties of value with the field name being the property name. See that
package overview for details.
This package also provides support for "well known" field definitions like
timeStamp, alarm, display,etc. Code that uses PVData can be simplified by
using this support.
{@link org.epics.pvData.xml}
One way to create a PV database is via an xml parser. This package defines
the syntax and provides a parser.
{@link org.epics.pvData.misc}
This package provides support that is used by pvData factories and might
also be useful to software that uses PVData.
{@link org.epics.pvData.test}
Test code.
Unresolved Issues
Property
How should properties be associated with a field? Package
org.epics.pvData.property shows one way of assigning properties. Is this what
is desired? No matter what a property should end up producing a PVField
interface.
Attribute
Do we also want attributes for a field? Are both property and attribute
desirable?
Remote Procedure Call
Although this document does not discuss remote procedure calls, an RPC
facility could easily be implemented via PVData. The following is a possible
interface for a remote procedure call.
interface PVRPC {
PVString methodName;
PVStructure arguments;
PVStructure result;
}
The Channel access methods can be implemented via a PVRPC. Method names
would be something like: get, put, putGet, processGet, putProcess,
putProcessGet. Each would have a appropriate combination of arguments and
result. What about monitors? Perhaps the client could just call
PVRecord.registerListener and PVField.addListener on client side
implementations of a "shadow" of a record in the server.
License Agreement
Copyright (c) 2008 Martin R. Kraimer
Copyright (c) 2006 The University of Chicago, as Operator of Argonne
National Laboratory.
Copyright (c) 2006 Deutsches Elektronen-Synchroton,
Member of the Helmholtz Association, (DESY), HAMBURG, GERMANY.
Copyright (c) 2007 Control System Laboratory,
(COSYLAB) Ljubljana Slovenia
Permission is hereby granted, free of charge, to any person
obtaining a copy of this software and associated documentation
files (the "Software"), to deal in the Software without
restriction, including without limitation the rights to use,
copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the
Software is furnished to do so, subject to the following
conditions:
The above copyright notice and this permission notice shall be
included in all copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
OTHER DEALINGS IN THE SOFTWARE.
________________________________________________________________________
This software is in part copyrighted by the University of Chicago (UofC)
In no event shall UofC be liable to any party for direct, indirect,
special, incidental, or consequential damages arising out of the use of
this software, its documentation, or any derivatives thereof, even if
UofC has been advised of the possibility of such damage.
UofC specifically disclaims any warranties, including, but not limited
to, the implied warranties of merchantability, fitness for a particular
purpose, and non-infringement. This software is provided on an "as is"
basis, and UofC has no obligation to provide maintenance, support,
updates, enhancements, or modifications.
________________________________________________________________________
This software is in part copyrighted by the BERLINER SPEICHERRING
GESELLSCHAFT FUER SYNCHROTRONSTRAHLUNG M.B.H. (BESSY), BERLIN, GERMANY.
In no event shall BESSY be liable to any party for direct, indirect,
special, incidental, or consequential damages arising out of the use of
this software, its documentation, or any derivatives thereof, even if
BESSY has been advised of the possibility of such damage.
BESSY specifically disclaims any warranties, including, but not limited
to, the implied warranties of merchantability, fitness for a particular
purpose, and non-infringement. This software is provided on an "as is"
basis, and BESSY has no obligation to provide maintenance, support,
updates, enhancements, or modifications.
________________________________________________________________________
This software is in part copyrighted by the Deutsches Elektronen-Synchroton,
Member of the Helmholtz Association, (DESY), HAMBURG, GERMANY.
In no event shall DESY be liable to any party for direct, indirect,
special, incidental, or consequential damages arising out of the use of
this software, its documentation, or any derivatives thereof, even if
DESY has been advised of the possibility of such damage.
DESY specifically disclaims any warranties, including, but not limited
to, the implied warranties of merchantability, fitness for a particular
purpose, and non-infringement. This software is provided on an "as is"
basis, and DESY has no obligation to provide maintenance, support,
updates, enhancements, or modifications.
________________________________________________________________________
- References:
- Ideas for Codeathon Bernd Schoeneburg
- Re: Ideas for Codeathon Andrew Johnson
- RE: Ideas for Codeathon Jeff Hill
- Navigate by Date:
- Prev:
Re: Ideas for Codeathon Schoeneburg, Bernd
- Next:
Re: Local CA out links broken during PINI Ralph Lange
- Index:
2002
2003
2004
2005
2006
2007
2008
<2009>
2010
2011
2012
2013
2014
2015
2016
2017
2018
2019
2020
2021
2022
2023
2024
- Navigate by Thread:
- Prev:
RE: Ideas for Codeathon Jeff Hill
- Next:
Re: Local CA out links broken during PINI Ralph Lange
- Index:
2002
2003
2004
2005
2006
2007
2008
<2009>
2010
2011
2012
2013
2014
2015
2016
2017
2018
2019
2020
2021
2022
2023
2024
|