V4 Design: dbdClass
From EPICSWIKI
Revision as of 12:34, 12 May 2005 by MartyKraimer (talk | contribs)
EPICS: C++ class definitions for Database Definition
May 11 2005
UNDER CONSTRUCTION - DO NOT COMMENT
Overview
This document describes the C++ class definitions for code that implements the semantics for records created from Database Definitions. The classes can be separated into two classes:
- dbdTypes.h - Classes that described fields in header files generated from dbd definitions. Header files are generated from the following dbd definitions:
- record
- struct
- menu
- dbdIntrospect.h - Classes intended for introspection, i.e. for code that does not include the generated header files.
Example Database Definition Files
Database Definition Files
menuAlarmSevr.dbd contains:
menu(menuAlarmSevr) { choice("NO_ALARM") choice("MINOR") choice("MAJOR") choice("INVALID") }
displayLimit.dbd contains:
struct(displayLimit) { field(low,float64) field(high,float64) }
exampleRecord.dbd contains:
record(example) extends iocRecord { field(value,float64) field(displayLimit,struct(displayLimit)) }
alltypesRecord.dbd 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) field(fstruct,struct(displayLimit)) field(flink,link(dir)) field(fdevice,device(dir,interfaceName)) }
Generated Header Files
menuAlarmSevr.h is generated from menuAlarmSevr.dbd
enum menuAlarmSevr { menuAlarmSevrNO_ALARM, menuAlarmSevrMINOR, menuAlarmSevrMAJOR, menuAlarmSevrINVALID };
displayLimit.h is generated from displayLimit.dbd
class displayLimit { dbdFloat64 low; dbdFloat64 high; }; const dbdInt16 displayLimit_firstIndex = 1 const dbdInt16 displayLimit_low = 1 const dbdInt16 displayLimit_high = 2 const dbdInt16 displayLimit_lastIndex =displayLimit_high
exampleRecord.h is generated from exampleRecord.dbd
class exampleRecord { public: ... All the fields from iocRecord.dbd dbdFloat64 value; dbdStruct displayLimit; }; const dbdInt16 example_firstIndex = 1001001 const dbdInt16 example_low = 1001001; const dbdInt16 example_high = 1001002; const dbdInt16 example_lastIndex = example_high;
alltypesRecord.h is generated from alltypesRecord.dbd
class allTypesRecord { public: ... All the fields from iocRecord.dbd dbdRecord common; dbdBoolean fbool; dbdOctet foctet; dbdInt16 fint16; dbdUInt16 fuint16; dbdInt32 fint32; dbdUInt32 fuint32; dbdInt64 fint32; dbdUInt64 fuint32; dbdFloat32 ffloat32; dbdFloat64 ffloat64; dbdString fstring; dbdMenu fmenu; dbdEnum fenum dbdStruct fstruct; dbdLink flink; dbdDevice fdevice; }; const dbdInt16 allTypes_firstIndex = 1001001 const dbdInt16 allTypes_fbool = 1001001; const dbdInt16 allTypes_foctet = 1001002; const dbdInt16 allTypes_fint16 = 1001003; const dbdInt16 allTypes_fuint16 = 1001004; const dbdInt16 allTypes_fint32 = 1001005; const dbdInt16 allTypes_fuint32 = 1001006; const dbdInt16 allTypes_fint64 = 1001007; const dbdInt16 allTypes_fuint64 = 1001008; const dbdInt16 allTypes_ffloat32 = 1001009; const dbdInt16 allTypes_ffloatn64 = 10010010; const dbdInt16 allTypes_ffstring = 10010011; const dbdInt16 allTypes_fmenu = 10010012; const dbdInt16 allTypes_fenum = 10010013; const dbdInt16 allTypes_fstruct = 10010014; const dbdInt16 allTypes_flink = 10010015 const dbdInt16 allTypes_fdevice = 10010016 const dbdInt16 allTypes_lastIndex = allTypes_fdevice;
dbdTypes.h
File dbdTypes.h describes the datatypes used by V4 databases:
/* TBD dbdNdimArrayT*/ enum dbdType { dbdUnknownT,dbdBooleanT,dbdOctetT, dbdInt16T,dbdUInt16T,dbdInt32T,dbdUInt32T,dbdInt64T,dbdUInt64T, dbdFloat32T,dbdFloat64T, dbdStringT, dbdStructT, dbdMenuT,dbdEnumT, dbdLinkT,dbdDeviceT, dbdArrayT };
/* some of the following may require OSD definitions*/ typedef bool dbdBoolean; typedef char dbdOctet; typedef short dbdInt16; typedef unsigned short dbdUInt16; typedef int dbdInt32; typedef unsigned int dbdUInt32; typedef long long dbdInt64; typedef unsigned long long dbdUInt64; typedef float dbdFloat32; typedef double dbdFloat64;
class dbdRecord;
// dbdStructPtr always references a class generated from a struct dbd typedef void * dbdStructPtr;
// dbdInterfacePtr always references a class that contains only methods typedef void *dbdInterfacePtr;
class dbdInterface { public: const char *interfaceType; dbdInterfacePtr *pinterface; };
/*dbdString holds UTF-8 characters*/ class dbdString { public: dbdInt32 capacity; /*capacity in bytes*/ dbdOctet *pstorage; };
class dbdStructMember { dbdString name; dbdType type; };
class dbdStructDef{ dbdString name; dbdInt16 nmembers; dbdStructMember *pmember[]; dbdInterface interface; };
class dbdStruct{ // for a field referencing a struct dbdStructDef *pdbdStructDef; dbdStructPtr ptr; };
class dbdMenuDef{ public: dbdString name; dbdInt16 nchoices; dbdString *pchoice[]; };
class dbdMenu{ // for a struct or record field public: dbdInt16 index; dbdMenuDef *pdbdMenuDef[]; };
class dbdEnum{ public: dbdInt16 index; dbdInt16 nchoices; dbdString *pchoice[]; };
class dbdInterfaceDef { public: dbdString interfaceName; dbdString choiceName; dbdString dataStructName; dbdInterface *pdbdInterface; };
enum dbdLinkDir { dbdLinkDirNone, dbdLinkDirForward, dbdLinkDirIn, dbdLinkDirOut, dbdLinkDirInOut }; class dbdLinkDef{ public: dbdLinkDir dir; dbdString choiceName; dbdInterface *pdbdInterface; dbdString dataStructName; }; class dbdLink{ // for a struct or record field public: dbdLinkDir dir; dbdString choiceName; dbdLinkDef *plinkDef; dbdStruct dataStruct; };
class dbdDeviceDef { public: dbdLinkDir dir; dbdString interfaceName; dbdString choiceName; dbdString dataStructName; dbdInterface *pdbdInterface; };
class dbdDevice{ // for a struct or record field public: dbdLinkDir dir; dbdString choiceName; dbdDeviceDef *pdeviceDef; dbdStruct dataStruct; };
template< class ARR_T > class dbdArray { public: dbdInt32 capacity; /*capacity in number of elements*/ dbdInt32 size; /*current number of elements*/ dbdType type; ARR_T *pstorage; };
/* The following array types are supported by dbdCore * dbdArray<void>; * dbdArray<dbdOctet>; * dbdArray<dbdInt16>; * dbdArray<dbdUInt16>; * dbdArray<dbdInt32>; * dbdArray<dbdUInt32>; * dbdArray<dbdInt64>; * dbdArray<dbdUInt64>; * dbdArray<dbdFloat32>; * dbdArray<dbdFloat64>; * dbdArray<dbdString>; * dbdArray<dbdLinkField>; **/
/* every struct and every record support module implements the following*/ class dbdStructMetaSupport { virtual dbdStructPtr create() = 0; virtual dbdBoolean initialize(dbdString *errorMessage, dbdStructPtr ptr) = 0; virtual dbdBoolean finalize(dbdString *errorMessage, dbdStructPtr ptr) = 0; virtual void destroy(dbdStructPtr ptr) = 0; virtual void *indexToAddr(dbdString *errorMessage, dbdStructPtr ptr, dbdInt16 index) = 0; // ???? is anything else needed };
/* record support implements the following*/ class dbdRecordSupport { virtual void special(dbdRecord *pdbdRecord, dbdBoolean after, dbdInt16 nlevels, // number of elements in fieldIndex dbdInt16 fieldIndex[] // array of field indices ) = 0; };