Difference between revisions of "V4 Design: dbdClass"

From EPICSWIKI
 
(19 intermediate revisions by the same user not shown)
Line 1: Line 1:
== EPICS: C++ class definitions for Database Definition ==
This page is obsolete. It is replaced by dbdInterfaces.
 
May 18 2005
 
<center>
 
== Overview ==
 
</center>
 
This document describes the C++ class definitions for code that implements
the semantics for records created from Database Definitions. The definitions
are intended for code that:
* includes header files generated from dbd definitions.  Header files are generated from the following dbd definitions:
** <tt>record</tt> - Should only be included by record support.
** <tt>struct</tt> - Included by code that understands the struct.
** <tt>menu</tt> - Included by code that understands the menu.
*  does not include the header files.
 
The following headers files are described:
* <tt>epicsTypes.h</tt> - A set of primitive types that are part of <tt>base/src/libCom</tt>
* <tt>dbdTypes.h</tt> - Type definitions for <tt>field</tt> definitions in <tt>struct</tt> or <tt>record></tt> DBD definitions.
* <tt>dbdStatements.h</tt>  - Type definitions for DBD statements.
* <tt>dbdInterfaces.h</tt> - Type definitions for interfaces related to DBD definitions.
 
----
<center>
 
== epicsTypes ==
 
</center>
=== <tt>epicsTypes.h</tt> ===
<tt>epicsTypes.h</tt> defines a set of primitive tupes. It is used because the <tt>C99</tt> standard does not define the exact number of bits for the primitive data types. It only defines the minimum number of bits.
 
In addition two extra types are defined:
* <tt>epicsUnknownT</tt> - Unknown
* <tt>epicsOctetT</tt> - An 8 bit byte.
 
<tt>epicsTypes.h</tt> contains the following:
 
enum epicsType {
    epicsUnknownT,
    epicsBooleanT,
    epicsOctetT,
    epicsInt16T,
    epicsUInt16T,
    epicsInt32T,
    epicsUInt32T,
    epicsInt64T,
    epicsUInt64T,
    epicsFloat32T,
    epicsFloat64T,
};
 
/* some of the following may require OSD definitions*/
typedef bool              epicsBoolean;
typedef char              epicsOctet;
typedef short              epicsInt16;
typedef unsigned short    epicsUInt16;
typedef int                epicsInt32;
typedef unsigned int      epicsUInt32;
typedef long long          epicsInt64;
typedef unsigned long long epicsUInt64;
typedef float              epicsFloat32;
typedef double            epicsFloat64;
 
=== Discussion of epicsTypes ===
 
 
Each epicsType maps to a C++ primitive type.
It may be necessary to provide operating system dependent definitions for some of the types. For example on some architectures a epicsInt64 may have to be defined as a <tt>long</tt> rather than a <tt>long long</tt>.
 
<tt>epicsTypeUnknownT</tt> is reserved for unknown types and will normally be caused by a configuration error.
 
----
<center>
 
== dbdTypes ==
</center>
 
File <tt>dbdTypes.h</tt> describes types and classes related to
dbd <tt>struct</tt> or <tt>record</tt> field definitions.
The following naming conventions are used:
; dbf
: A primitive field type
; Dbf
: any class starting with Dbf describes a non-primitive struct or record field. For example DbfString describes a field(name,string).
; *Dbd*
: A class name that has Dbd imbeded in it describes something directly related to a dbd statement. For example LinkDbdSupport describes a dbd link definition.
 
=== <tt>dbdTypes.h</tt> ===
enum dbfType {
    dbfUnknownT = epicsUnknownT,
    dbfBooleanT = epicsBooleanT,
    dbfOctetT = epicsOctetT,
    dbfInt16T = epicsInt16T,
    dbfUInt16T = epicsUInt16T,
    dbfInt32T = epicsInt32T,
    dbfUInt32T = epicsUInt32T,
    dbfInt64T = epicsInt64T,
    dbfUInt64T = epicsUInt64T,
    dbfFloat32T = epicsFloat32T,
    dbfFloat64T = epicsFloat64T,
    dbfStringT,
    dbfStructT,
    dbfArrayT,
    dbfEnumT,
    dbfMenuT,
    dbfLinkT,
    dbfDeviceT
};
 
typedef epicsBoolean  dbfBoolean;
typedef epicsOctet    dbfOctet;
typedef epicsInt16    dbfInt16;
typedef epicsUInt16  dbfUInt16;
typedef epicsInt32    dbfInt32;
typedef epicsUInt32  dbfUInt32;
typedef epicsInt64    dbfInt64;
typedef epicsUInt64  dbfUInt64;
typedef epicsFloat32  dbfFloat32;
typedef epicsFloat64  dbfFloat64;
 
// StructDbd is base class for classes implementing struct
class StructDbd {};
// The following are described  in dbdStatements.h
class StructDbdDef; //describes a dbd struct definition
class MenuDbdDef; //describes a dbd menu definition
class LinkDbd;    //describes dbd link statement
class DeviceDbd;  //describes dbd device statement
 
/*DbfString holds UTF-8 characters*/
class DbfString {
public:
    dbfInt32  capacity;  /*capacity in bytes*/
    dbfBoolean isCharString;
    dbfOctet  *pstorage;
};
 
class DbfStruct{
public:
    StructDbdDef *pstructDef;
    StructDbd    *pstorage;
};
 
class DbfArray {
public:
    dbfInt32  capacity;  /*capacity in number of elements*/
    dbfInt32  size;      /*current number of elements*/
    dbfType  type; // can be dbfBooleanT, ..., dbfArrayT
    void      *pstorage; // aligned on natural boundary
};
 
class DbfMenu{
public:
    dbfInt16    index;
    MenuDbdDef  *pmenuDef; /* address of global menu */
};
 
class DbfEnum{
public:
    dbfInt16  index;
    DbfArray  *pchoiceArray; // addr of field that is DbfArray on choices
};
enum LinkDir {
    LinkDirNone,
    LinkDirForward,
    LinkDirIn,
    LinkDirOut,
    LinkDirInOut
};
 
class DbfLink{
public:
    LinkDir  dir;
    LinkDbd  *plinkDef;
    DbfStruct dataStruct;
};
 
class DbfDevice{
public:
    LinkDir  dir;
    DeviceDbd *pdeviceDef;
    DbfStruct dataStruct;
};
 
=== Discussion of dbdTypes ===
 
==== Primitive Types ====
The primitive types, all map directly to an epicsType.
 
If a record is defined as:
    record(xxx) extends iocRecord {
        ...
        field(fbool,bool)
        field(foctet,octet)
        ...
        field(ffloat64,float64)
        ...
    }
Then the generated header file will be
    class xxxRecord : public iocRecord {
    public:
        dbfBoolean fbool;
        dbfOctet  foctet;
        ...
        dbfFloat64 ffloat64;
        ...
    };
 
==== DbfString ====
<tt>DbfString</tt> is described as:
    class DbfString {
    public:
        dbfInt32  capacity;  /*capacity in bytes*/
        dbfBoolean isCharString;
        dbfOctet  *pstorage;
    };
If a record definition contains
    field(sfield,string)
Then the generated header file contains
    DbfString sfield;
 
; <tt>capacity</tt>
: the the number of bytes referenced by <tt>pstorage</tt> NOT the number of characters.
; <tt>isCharString</tt>
: <tt>false</tt> if the current string can not be converted to a <tt>char</tt>
array, i.e. it can only be converted to a <tt>wchar_t</tt> array.
; <tt>pstorage</tt>
: the address of a UTF-8 null terminated character string.
 
An interface DbfStringSupport is defined to support DbfString.
 
==== DbfStruct ====
 
<tt>DbfStruct></tt> is described as:
    class DbfStruct{
    public:
        StructDbdDef *pstructDef;
        StructDbd    *pstorage;
    };
 
If a record definition contains
    field(sstruct,struct(name))
Then the generated header file contains
    DbfStruct sfield;
<tt>pstorage</tt> is the address of storage for the structure and <tt>pstructDef</tt> is the address of a description of the structure. StructDbdDef is described in <tt>dbdStatatements.h</tt>
 
Note that given a dbdStruct it is possible to locate both the address and description of the associated structure.
 
==== DbfArray ====
 
A DbfArray describes a 1-dim array of a single dbfType. Multi dimensional
array can be constructed since a DbfArray can be a 1 dim array of DbfArray.
 
<tt>pstorage</tt> is guaranteed to be allocated on a natural boundary for dbfType.
 
==== DbfMenu ====
<tt>DbfMenu></tt> is described as:
    class DbfMenu{
    public:
        dbfInt16    index;
        MenuDbfDef  *pmenuDef;
    };
 
If a record definition contains
    field(fmenu,menu(name))
Then the generated header file contains
    DbfMenu fmenu;
<tt>DbfMenu</tt> provides the current menu index and also the menu definition.
 
==== DbfEnum ====
<tt>DbfEnum></tt> is described as:
    class DbfEnum{
    public:
        dbfInt16  index;
        DbfArray  *pchoiceArray; // addr of field that is DbfArray on choices
    };
 
If a record definition contains
    field(fenum,enum)
Then the generated header file contains
    DbfEnum fenum;
<tt>pchoiceArray</tt> is the address of a field in the same record that is a
DbfArray of choices.
==== DbfLink ====
<tt>DbfLink</tt> is described as
    class DbfLink{
    public:
        LinkDir  dir;
        LinkDbd  *plinkDef;
        DbfStruct dataStruct;
    };
If a record definition contains
    field(flink,link(in))
Then the generated header file contains
    DbfLink flink;
The fields of DbfLink are initialized by locating a dbd <tt>link</tt> definition that matches the <tt>dir</tt> specified in the dbd <tt>field</tt> definition.
 
The fields of <tt>DbfLink</tt> are initialized as follows:
; <tt>dir</tt>
: This is taken from either the <tt>field</tt> definition or from the <tt>LinkDbd</tt> definition and is the most restrictive. For example if one says inout and the other says in then <tt>dir</tt> will be in.
; <tt>plinkDef</tt>
: This is the address of the <tt>LinkDbd</tt>.
; <tt>dataStruct</tt>
: The describes the data structure specified in the dbd <tt>link</tt> definition. It contains data used by the link support.
 
Note that link support always implements interface <tt>LinkDbdSupport</tt>
==== DbfDevice ====
 
A <tt>DbfDevice</tt> is similar to a <tt>DbfLink</tt> except that the interface implemented by the device support is also specified, i.e. instead of implementing interface <tt>LinkDbdSupport</tt>, the device support implements an interface that both record support and device support understand.
 
 
----
<center>
 
== dbdStatements ==
 
</center>
The classes in <tt>dbdStatements.h</tt> allow introspection of ioc records. They describe everything defined in DBD definitions.
 
=== <tt>dbdStatements.h</tt> ===
 
 
// FieldDbdPtr is the address of storage for a dbfType
typedef void *FieldDbdPtr;
 
// Interface is base class for an interface
class Interface {};
class InterfaceLocator {
public:
    DbfString name;
    Interface *pinterface;
};
 
class StructFieldAttribute {
    DbfString  default;
    dbfBoolean readonly;
    dbfBoolean design;
    dbfBoolean special;
    dbfBoolean dynamic;
    epicsInt16 asl;
};
 
class StructDbdField {
public:
    DbfString name;
    dbfType  type;
    StructFieldAttribute *pattribute;
};
 
class StructDbdDef{
public:
    DbfString    name;
    Interface    *plifetime; // references a StructDbdLifetime
    dbfInt16    nfields;
    StructDbdField *pfield[]; // ptr to array of ptr to StructDbdField
};
 
class MenuDbdDef{
public:
    DbfString name;
    dbfInt16  nchoices;
    DbfString *pchoice[];
};
 
class LinkDbd{ //describes dbd link statement
public:
    LinkDir    dir;
    DbfString  choiceName;
    DbfString  dataStructName;
    Interface  *pinterface;
};
 
class DeviceDbd { //describes dbd device statement
public:
    LinkDir  dir;
    DbfString interfaceName;
    DbfString choiceName;
    DbfString dataStructName;
    Interface *pinterface;
};
 
// The following describes a record type
class RecordDbdDef { // describes a record type
    DbfString    name;
    Interface    *plifetime; // references a StructDbdLifetime
    dbfInt16    nfields;
    StructDbdField *pfield[]; // ptr to array of ptr to StructDbdField
};
 
// The following describes a record instance
class UserDbdField {
public:
    dbfString  name;
    dbfType    type;
    FieldDbdPtr pfield;
    InterfacePtr *pinterface; // references userFieldHandler
};
 
class RecordInstanceDef { // describes a record instance
    DbfString    name;
    RecordDbdDef *pRecordDbdDef;
    FieldDbdPtr  *precord;    // address of record instance
    UserDbdField *puserField[];
};
 
 
=== Discussion of dbdStatements ===
==== Struct ====
The Struct classes describe the fields in a dbd <tt>struct</tt> or <tt>record</tt> definition. The classes are : <tt>StructDbdDef</tt>, <tt>StructDbdField</tt>,and <tt>StructFieldAttribute</tt>
 
The fields of <tt>StructDbdDef</tt> are:
; <tt>name</tt>
: The name of the struct.
; <tt>plifetime</tt>
: The address of an implementation of interface <tt>StructDbdLifetime</tt>. The implementation is automatically generated from the dbd <tt>struct</tt> statement. See below for a description of the <tt>StructDbdLifetime</tt> methods.
; <tt>nfields</tt>
: The number of fields, e.g. fields in the structure.
; <tt>pfields</tt>
: pointer to an array of pointers to <tt>StructDbdField</tt>. Each StructDbdField contains the name and type of the fields.
 
The fields of <tt>StructDbdField</tt> are:
; <tt>name</tt>
: The name of the field
; <tt>type</tt>
: The dbfType for the field.
; <tt>pattribute</tt>
: The address of a StructFieldAttribute for the field
 
<tt>StructFieldAttribute</tt> has the attribute values for the field.
 
==== Menu ====
 
A dbd <tt>menu</tt> is described by class MenuDbdDef
 
The fields of MenuDbdDef are:
; <tt>name</tt>
: The menu name.
; <tt>nchoices</tt>
: The number of menu choices.
; <tt>pchoice</tt>
: The address of an array of pointers to DbfString. Each DbfString is a choice.
 
==== Link and Device ====
 
Each dbd <tt>link</tt> definition has an associated class <tt>LinkDbd</tt> with fields:
; <tt>dir</tt>
: The link direction
; <tt>choiceName</tt>
: The name that matches a LinkDbd for a DbfLink instance.
; <tt>dataStructName</tt>
: The class name of a DbfStruct for the Interface implementation
; <tt>pinterface</tt>
: The address of the Interface implementation. The interface class is LinkDbdSupport
 
Each dbd <tt>device</tt> definition has an associated class <tt>DeviceDbd</tt> with fields:
; <tt>dir</tt>
: The link direction
; <tt>interfaceName</tt>
: The name of the interface class implemented by the device support
; <tt>choiceName</tt>
: The name that matches a DeviceDbd for a DbfDevice instance.
; <tt>dataStructName</tt>
: The class name of a DbfStruct for the Interface implementation
; <tt>pinterface</tt>
: The address of the Interface implementation.
 
==== Record ====
A record type has an associated class: <tt>RecordDbdDef</tt>.
The fields of <tt>RecordDbdDef</tt> are the same as fields in <tt>StructDbdDef</tt> except that they refer to a record instead of a structure.
; <tt>name</tt>
: The name of the record.
; <tt>plifetime</tt>
: The address of an implementation of interface <tt>StructDbdLifetime</tt>. The implementation is automatically generated from the dbd <tt>record</tt> statement. See below for a description of the <tt>StructDbdLifetime</tt> methods.
; <tt>nfields</tt>
: The number of fields, e.g. fields in the record.
; <tt>pfields</tt>
: pointer to an array of pointers to <tt>StructDbdField</tt>. Each StructDbdField contains the name and type of the fields.
; <tt>puserField</tt>
: Address of an array of pointers to <tt>UserDbdField</tt>.
 
Question? Is RecordDbdDef necessary? Might be good to keep it in case a difference between struct and record becomes necessary.
 
==== Record Instance ====
 
A record instance has two associated classes:<tt>UserDbdField</tt> and <tt>RecordInstanceDef</tt>.
 
<tt>UserDbdField</tt> contains information for a user defined field:
; <tt>name</tt>
: The name of the user defined field
; <tt>type</tt>
: The dbfType for the field.
; <tt>pfield</tt>
: Address of storage for field.
; <tt>pinterface</tt>
: The address of an implementation of interface userFieldHandler;
 
The fields of <tt>RecordInstanceDef</tt> are:
 
; <tt>name</tt>
: The name of the record instance
; <tt>pRecordDbdDef</tt>
: The address of the description of the record type
; <tt>precord</tt>
: The address of the record itself.
; <tt>puserField</tt>
: The address of a array of pointers to UserDbdField
 
----
<center>
 
== dbdInterfaces ==
 
dbdInterfaces describes standard interfaces implemented by code that
supports runtime database access. For some the code is automatically generated from the dbd definitions.
 
</center>
 
=== <tt>dbdInterfaces.h</tt> ===
<tt>dbdInterfaces.h</tt> contains the following:
 
// every struct and every record support module implements the following
// The implementation is generated from the dbd definition
class StructDbdLifetime {
public:
    virtual StructDbdPtr create() = 0;
    virtual bool initialize(dbfString *errorMessage,
                              StructDbdPtr ptr) = 0;
    virtual bool finalize(dbfString *errorMessage,
                              StructDbdPtr ptr) = 0;
    virtual void destroy(StructDbdPtr ptr) = 0;
    virtual void *indexToAddr(dbfString *errorMessage,
                              StructDbdPtr ptr, dbfInt16 index) = 0;
    // ???? is anything else needed
};
 
// every link support module implements the following interface
class LinkDbdSupport {
public:
    virtual void report(dbfString *errorMessage,
                      iocRecord *precord, dbfLink *pdbfLink) = 0;
    virtual bool initialize(dbfString *errorMessage,
                      iocRecord *precord, dbfLink *pdbfLink) = 0;
    virtual bool finalize(dbfString *errorMessage,
                      iocRecord *precord, dbfLink *pdbfLink) = 0;
    virtual bool connect(dbfString *errorMessage,
                      iocRecord *precord, dbfLink *pdbfLink) = 0;
    virtual bool disconnect(dbfString *errorMessage,
                      iocRecord *precord, dbfLink *pdbfLink) = 0;
    virtual bool get(dbfString *errorMessage,
                      iocRecord *precord, dbfLink *pdbfLink,
                      dbfType type, FieldDbdPtr pfield) = 0;
    virtual bool put(dbfString *errorMessage,
                      iocRecord *precord, dbfLink *pdbfLink,
                      dbfType type, FieldDbdPtr pfield) = 0;
};
 
/* record support implements the following*/
class RecordDbdSupport {
public:
    virtual iocRecord *create(dbfString *errorMessage) = 0;
    virtual bool destroy(dbfString *errorMessage, iocRecord *precord) = 0;
    virtual bool init(dbfString *errorMessage,
                      iocRecord *precord, bool firstPass) = 0;
    virtual void special(iocRecord *precord, iocRecord *precord,
            bool  after,
            dbfInt16 nlevels, // number of elements in fieldIndex
            dbfInt16 fieldIndex[] // array of field indices
            ) = 0;
};
 
class UserFieldHandler {
public:
    virtual bool initialize(dbfString *errorMessage,
                      iocRecord *precord,UserDbdField *puserField) = 0;
    virtual bool finalize(dbfString *errorMessage,
                      iocRecord *precord,UserDbdField *puserField) = 0;
    virtual bool process(dbfString *errorMessage,
                      iocRecord *precord,UserDbdField *puserField) = 0;
};
 
=== Discussion of dbdInterfaces ===
==== <tt>StructDbdLifetime</tt> ====
Every dbd <tt>struct</tt> and <tt>record</tt> has an associated <tt>StructDbdLifetime</tt> interface implementation. A tool is provided that automatically generates the implementation form the dbd definition.
<tt>StructDbdLifetime</tt> has the following fields:
; <tt>create</tt>
: Creates storage for the struct or record.
; <tt>initialize</tt>
: initializes the struct or record
; <tt>finalize</tt>
: cleans up but does not free storage
; <tt>destroy</tt>
: frees storage
; <tt>indexToAddr</tt>
: Given an index it returns the address of the storage. Note the the generated header files assign an index to each field.
 
==== <tt>LinkDbdSupport</tt> ====
This describes the interface implemented by link support.
==== <tt>RecordDbdSupport</tt> ====
This is the interface implemented by record support.
==== <tt>UserFieldHandler</tt> ====
This is the interface implemented by code for user extensible fields.
 
----
 
 
 
 
<center>
 
== DbfStringSupport Interface ==
 
</center>
 
This describes a proposed interface to support DbfString.
 
The interface is "minimal" in that it provides only a basic set of methods.
If code needs to do serious character manipulation it must:
* Use toChar or toWcar to convert a DbfString to an array of char or wchar_t
* Use standard library support to do character manipulation
* Use fromChar or fromWChar to convert the result to a DbfString,
 
<tt>DbfString</tt> is defined as:
    class DbfString {
    public:
        dbfInt32  capacity;  /*capacity in bytes*/
        dbfBoolean isCharString;
        dbfOctet  *pstorage;
    };
 
; <tt>capacity</tt>
: is the amount of storage in bytes allocated for pstorage
; <tt>isCharString</tt>
: Is <tt>true</tt> if the UTF_8 null terminated string can be converted
to a char array. It is false if a wchar_t is required.
; <tt>pstorage</tt>
: Is a null terminated UTF_8 encoded character string.
 
<tt>DbfStringSupport.h</tt> contains:
 
    class DbfStringSupport {
        virtual bool allocate(DbfString *pstring, epicsInt32 capacity) = 0;
        virtual null free(DbfString *pstring) = 0;
        virtual bool isCharString(DbfString *pstring) = 0;
        virtual epicsInt32 length(DbfString *p) = 0;
        virtual epicsInt32 length(char *p,epicsInt32 maxsize) = 0;
        virtual epicsInt32 length(wchar_t *p,epicsInt32 maxsize) = 0;
        virtual bool isEqual(DbfString *p1st,DbfString *p2nd) = 0;
        virtual bool toChar(DbfString *pstring,DbfString error,
                    char *pcharstring, epicsInt32 maxsize) = 0;
        virtual bool fromChar(DbfString *pstring,
                    const char *pcharstring, epicsInt32 maxsize) = 0;
        virtual bool toWChar(DbfString *pstring,DbfString error,
                    wchar_t *pcharstring, epicsInt32 maxsize) = 0;
        virtual bool fromWChar(DbfString *pstring,
                    wchar_t *pcharstring) = 0;
    };
 
; <tt>allocate</tt>
: <tt>pstring.pstorage</tt> is set equal to the address of capacity bytes of memory.  <tt>pstring.capacity</tt> is set equal to the number of bytes.  pstorage MUST NEVER be allocated by any means other than calling allocate.
; <tt>free</tt>
: The storage referenced by pstring.pstorage is freed. <tt>pstring.capacity</tt> and <tt>pstring.pstorage</tt> are set to 0.
; <tt>length(DbfString *p)</tt>
: Returns the number of characters in the string.
; <tt>length(char *p,epicsInt32 maxsize)</tt>
: Returns the number of bytes required for a UTF_8 encoded string.
; <tt>length(wchar_t *p,epicsInt32 maxsize)</tt>
: Returns the number of bytes required for a UTF_8 encoded string.
; <tt>isEqual</tt>
: Performs a byte by byte comparison until a null byte is detected or capacity of either string is reached. It returns (false,true) if the strings (are not, are) equal.
; <tt>toChar</tt>
: Converts  a DbfString to a null terminated C char array.  A return of <tt>true</tt> means success.  A return of <tt>false</tt> means failure and the reason is returned in <tt>error</tt>.  : Converts  a null terminated C char array to a DbfString.  If the current capacity of pstring is not sufficent, free and allocate are called automatically.  A return of <tt>true</tt> means success.  A return of <tt>false</tt> means failure and the reason is returned in <tt>error</tt>.
; <tt>toWChar</tt>
: Converts  a DbfString to a null terminated C wchar_t array.  A return of <tt>true</tt> means success.  A return of <tt>false</tt> means failure and the reason is returned in <tt>error</tt>.  ; <tt>fromChar</tt>
; <tt>fromWChar</tt>
: Converts  a null terminated C wchar_t array to a DbfString.  The result is a UTF_8 encode string.  If the current capacity of pstring is not sufficent, free and allocate are called automatically.  A return of <tt>true</tt> means success.  A return of <tt>false</tt> means failure and the reason is returned in <tt>error</tt>.
 
 
Questions:
* Is one implementation of DbfStringSupport sufficient or is a separate implementation required for each locale?
* Hopefully only one implementation is required. But then are the above arguments sufficient.
 
 
 
----
 
<center>
 
== Example of Generated Header Files ==
 
</center>
 
=== Database Definition Files ===
 
<tt>menuAlarmSevr.dbd</tt> contains:
    menu(menuAlarmSevr) {
          choice(menuAlarmSevrNO_ALARM,"NO_ALARM")
          choice(menuAlarmSevrMINOR,"MINOR")
          choice(menuAlarmSevrMAJOR,"MAJOR")
          choice(menuAlarmSevrINVALID,"INVALID")
    }
 
<tt>displayLimit.dbd</tt> contains:
    struct(displayLimit) {
        field(low,float64)
        field(high,float64)
    }
<tt>exampleRecord.dbd</tt> contains:
    record(example) extends iocRecord {
        field(value,float64)
        field(displayLimit,struct(displayLimit))
    }
<tt>alltypesRecord.dbd</tt> contains:
    record(allTypes) extends iocRecord {
        field(fbool,bool)
        field(foctet,octet)
        field(fint16,int16)
        field(fuint16,uint16)
        field(fint32,int32)
        field(fuint32,uint32)
        field(fint64,int64)
        field(fuint64,uint64)
        field(ffloat32,float32)
        field(ffloat64,float64)
        field(fstring,string)
        field(fmenu,menu(menuName))
        field(fenum,enum(stateNames))
        field(stateNames,array(string[]))
        field(fstruct,struct(displayLimit))
        field(flink,link(dir))
        field(fdevice,device(dir,interfaceName))
    }
=== Generated Header Files ===
Tools are provided to generate header files from the following dbd definitions:
*menu
*struct
*record
<tt>menuAlarmSevr.h</tt> is generated from <tt>menuAlarmSevr.dbd</tt>
    enum menuAlarmSevr {
            menuAlarmSevrNO_ALARM,
            menuAlarmSevrMINOR,
            menuAlarmSevrMAJOR,
            menuAlarmSevrINVALID
    };
<tt>displayLimit.h</tt> is generated from <tt>displayLimit.dbd</tt>
    class displayLimit : public StructDbd {
    public:
        dbfFloat64 low;
        dbfFloat64 high;
    };
    const dbfInt16 displayLimit_firstIndex = 1
    const dbfInt16 displayLimit_low        = 1
    const dbfInt16 displayLimit_high      = 2
    const dbfInt16 displayLimit_lastIndex =displayLimit_high
<tt>exampleRecord.h</tt> is generated from <tt>exampleRecord.dbd</tt>
    class exampleRecord : public iocRecord{
    public:
        dbfFloat64 value;
        dbfStruct  displayLimit;
    };
   
    const dbfInt16 example_firstIndex = 1001001
    const dbfInt16 example_low = 1001001;
    const dbfInt16 example_high = 1001002;
    const dbfInt16 example_lastIndex = example_high;
<tt>alltypesRecord.h</tt> is generated from <tt>alltypesRecord.dbd</tt>
    class allTypesRecord : public iocRecord{
    public:
        dbfBoolean fbool;
        dbfOctet  foctet;
        dbfInt16  fint16;
        dbfUInt16  fuint16;
        dbfInt32  fint32;
        dbfUInt32  fuint32;
        dbfInt64  fint32;
        dbfUInt64  fuint32;
        dbfFloat32 ffloat32;
        dbfFloat64 ffloat64;
        DbfString  fstring;
        DbfMenu    fmenu;
        DbfEnum    fenum
        DbfArray  stateStrings;
        DbfStruct  fstruct;
        DbfLink    flink;
        DbfDevice  fdevice;
    };
   
    const dbfInt16 allTypes_firstIndex = 1001001;
    const dbfInt16 allTypes_fbool = 1001001;
    const dbfInt16 allTypes_foctet = 1001002;
    const dbfInt16 allTypes_fint16 = 1001003;
    const dbfInt16 allTypes_fuint16 = 1001004;
    const dbfInt16 allTypes_fint32 = 1001005;
    const dbfInt16 allTypes_fuint32 = 1001006;
    const dbfInt16 allTypes_fint64 = 1001007;
    const dbfInt16 allTypes_fuint64 = 1001008;
    const dbfInt16 allTypes_ffloat32 = 1001009;
    const dbfInt16 allTypes_ffloatn64 = 10010010;
    const dbfInt16 allTypes_ffstring = 10010011;
    const dbfInt16 allTypes_fmenu = 10010012;
    const dbfInt16 allTypes_fenum = 10010013;
    const dbfInt16 allTypes_stateStrings = 10010014;
    const dbfInt16 allTypes_fstruct = 10010015;
    const dbfInt16 allTypes_flink = 10010016;
    const dbfInt16 allTypes_fdevice = 10010017;
    const dbfInt16 allTypes_lastIndex = allTypes_fdevice;
 
----

Latest revision as of 19:53, 11 August 2005

This page is obsolete. It is replaced by dbdInterfaces.