PVAttribute
PVAttribue类派生自NDAttribute。它通过监视来自EPICS PV的回调获取它的值,并且因而被用于任意EPICS PV的当前值和一个NDArray。PVAttribute类文档详细描述这个类。
#ifndef INCPVAttributeH
#define INCPVAttributeH
#include <cadef.h>
#include <epicsMutex.h>
#include <epicsEvent.h>
#include "NDAttribute.h"
#define DBR_NATIVE -1
class ADCORE_API PVAttribute : public NDAttribute {
public:
PVAttribute(const char *pName, const char *pDescription, const char *pSource, chtype dbrType);
PVAttribute(PVAttribute& attribute);
~PVAttribute();
PVAttribute* copy(NDAttribute *pAttribute);
virtual int updateValue();
/* These callbacks must be public because they are called from C */
void connectCallback(struct connection_handler_args cha);
void monitorCallback(struct event_handler_args cha);
int report(FILE *fp, int details);
private:
chid chanId;
evid eventId;
chtype dbrType;
NDAttrValue callbackValue;
char *callbackString;
bool connectedOnce;
epicsMutexId lock;
};
#endif /*INCPVAttributeH*/
从一个EPICS PV获取它的值的属性(Attribute)。
PVAttribute::PVAttribute(const char * pName, const char * pDescription, const char * pSource, chtype dbrType)
一个EPICS PV属性的构造器。
参数:
[in]pName:要被创建的属性的名称。不区分大小写。
[in]pDescription:属性描述。
[in]pSource:要被用来获取这个属性值的EPICS PV的名称。
[in]dbrType:要被使用的EPICS DBR_XXX类型(DBR_STRING, DBR_DOUBLE)。除了正常的DBR类型外,还可以使用一种特殊类型DBR_NATIVE,这表示使用由通道访问返回的用于这个PV的本地数据类型。
PVAttribute::PVAttribute(PVAttribute & attribute)
一个EPICS PV属性的拷贝构造器。
参数:
[in]attribute:从其复制的PVAttribute。注意:复制不是"功能的",当PV变换时,它不更新,值被冻结。
PVAttribute::~PVAttribute()
析构函数。
void PVAttribute::connectCallback(struct connection_handler_args cha)
当一个EPICS PV连接或者断开连接时,连接回调被调用。如果它是一个连接事件,当值变化时,它调用ca_add_masked_array_event来请求回调。
参数:
[in]cha:通过通道访问传递的连接handler参数结构体。
参数:
[in]pOut:指向输出属性的指针,如果NULL,将使用拷贝构造器创建这个输出属性。仅值被复制,认为所有其它字段在pOut已经相同。
返回:返回一个指向副本的指针。
在这里重新实现了NDAttribute的这个方法。
void PVAttribute::monitorCallback(struct event_handler_args eha)
当EPICS PV变化值时,monitor回调被调用。
调用NDAttribute::setValue来存储新值。
参数:
[in]eha:通过通道访问传递的事件handler参数结构体。
int PVAttribute::report(FILE * fp, int details)
报告PVAttribute的属性。调用基类NDAttribue::report()来报告这个参数值。
参数:
[in]fp:报告输出的文件指针。
[in]details:所需的报告详细程度;在这个派生类中当前什么也不做。
在这里重新实现了NDAttribute的这个方法。
int PVAttribute::updateValue()
更新这个属性的当前值。
基类什么也不做,但派生类可以获取这个属性的当前值,例如,从一个EPICS PV或者驱动参数库。
paramAttribute
paramAttribute类派生自NDAttriube。它从驱动或插件参数的当前值获取它的值。当获取参数的当前值是重要的以及相应的PVAttribute的值因为EPICS PV还未更新可能不是当前的时,一般使用paramAttribute类。paramAttriubte类文档详细地描述了这个类。
从asynNDArrayDriver驱动参数获取它的值的属性。
#ifndef INCparamAttributeH
#define INCparamAttributeH
#include "NDAttribute.h"
#include "asynNDArrayDriver.h"
#define DBR_NATIVE -1
typedef enum {
paramAttrTypeInt,
paramAttrTypeInt64,
paramAttrTypeDouble,
paramAttrTypeString,
paramAttrTypeUnknown
} paramAttrType_t;
class ADCORE_API paramAttribute : public NDAttribute {
public:
paramAttribute(const char *pName, const char *pDescription, const char *pSource, int addr,
class asynNDArrayDriver *pDriver, const char *dataType);
paramAttribute(paramAttribute& attribute);
~paramAttribute();
paramAttribute* copy(NDAttribute *pAttribute);
int updateValue();
int report(FILE *fp, int details);
private:
int paramId;
int paramAddr;
paramAttrType_t paramType;
class asynNDArrayDriver *pDriver;
};
#endif /*INCparamAttributeH*/
从asynNDArrayDriver驱动参数获取它的值的属性。这个类的updateValue()方法获取这个驱动参数的当前值。
paramAttribute::paramAttribute(const char *pName,const char * pDescription,const char * pSource,int addr,class asynNDArrayDriver * pDriver,const char *dataType)
驱动/插件属性的构造器。
参数:
- [in]pName:要被创建的属性的名称;不区分大小写。
- [in]pDescription:这个属性的描述。
- [in]pSource:用于标识asynPortDriver中参数的DRV_INFO字符串。
- [in]addr:这个参数的asyn addr(地址)。
- [in]pDriver:从其获取这个参数的驱动或插件对象。
- [in]dataType:这个参数的数据类型。必须是"INT", "DOUBLE"或"STRING"(不区分大小写)。
paramAttribute::paramAttribute(paramAttribute & attribute)
驱动/插件属性的拷贝构造器。
参数:
[in]attribute:从其复制的paramAttribute。
paramAttribute::~paramAttribute()
驱动/插件属性的析构器。
paramAttribute * paramAttribute::copy(NDAttribute * pOut)
从this复制属性到pOut。
参数:
[in]pOut:一个指向输出属性的指针,如果NULL,使用拷贝构造器创建这个输出属性。仅复制值,认为所有其它字段在pOut中已经相同。
返回:指向这个副本的指针。
int paramAttribute::report(FILE * fp,int details)
报告paramAttribute对象的属性。调用基类NDAttribute::report()来报告这个参数值。
参数:
[in]fp:用于报告输出的文件指针。
[in]details:所需的报告详细程度;在这个派生类中当前什么也不做。
在这个类中被重新实现。
int paramAttribute::updateValue()
更新这个属性的当前值;设置这个属性值为驱动/插件参数在这个参数库中的当前值。
在这个类中被重新实现。
functAttribute
functAttribute类派生自NDAttriubte。它从一个用户编写地C++函数获取它地值。functAttribute类非常通用,并且可以用于添加几乎任何信息到NDArray。ADCore包含示例代码,myAttributeFunctions.cpp演示了如何编写这样地函数。functAttribute类文档详细地描述了这个类。
#ifndef INCfunctAttributeH
#define INCfunctAttributeH
#include <stdio.h>
#include "NDAttribute.h"
typedef int (*NDAttributeFunction)(const char *functParam, void **functionPvt, class functAttribute *pAttribute);
class ADCORE_API functAttribute : public NDAttribute {
public:
functAttribute(const char *pName, const char *pDescription, const char *pSource, const char *pParam);
functAttribute(functAttribute& attribute);
~functAttribute();
functAttribute* copy(NDAttribute *pAttribute);
virtual int updateValue();
int report(FILE *fp, int details);
private:
char *functParam;
NDAttributeFunction pFunction;
void *functionPvt;
};
从一个用户定义地函数获取它的值的属性。这个类的updateValue()方法从这个函数获取当前值。
functAttribute::functAttribute(const char * pName,const char * pDescription,const char * pSource,const char * pParam)
函数属性的构造器。
参数:
- [in]pName:要被创建的属性的名称;不区分大小写。
- [in]pDecription:这个属性的描述。
- [in]pSource:被调用来获取这个参数的值的函数的符号名。
- [in]pParam:将被传递给这个函数的字符串,一般指定什么/如何获取这个值。
functAttribute::functAttribute(functAttribute & attribute)
函数属性的拷贝构造器。
参数:
[in]attribute:从其复制的functAttribute。
functAttribute::~functAttribute()
驱动/插件属性的析构函数。
functAttribute * functAttribute::copy(NDAttribute * pOut)
从this复制属性到pOut。
参数:
[in]pOut:一个指向输出属性的指针,如果NULL,使用拷贝构造器创建这个输出属性。仅复制值,认为所有其它字段在pOut中已经相同。
返回:指向这个副本的指针。
在本类中重新实现。
int functAttribute::report(FILE * fp, int details)
报告functAttribute对象的属性;基类NDAttribute::report()报告这个参数值。
参数:
[in]fp:用于报告输出的文件指针。
[in]details:所需的报告详细程度;在这个派生类中当前什么也不做。
在这个类中被重新实现。
int functAttribute::updateValue()
更新这个属性的当前值,设置属性值为指定函数的返回值。
在这个类中被重新实现。
asynNDArrayDriver
asynNDArrayDriver继承自asynPortDriver。它为NDArray对象实现了asynGenericPointer函数。插件和面探测器驱动都是间接从这个类派生的。asynNDArrayDriver类文档详细地描述了这个类。
文件asynNDArrayDriver.h定义了所有NDArray驱动和插件如何可能应该实现地所有NDArray驱动。这些参数由字符串(drvInfo)和一个相关联asyn接口和访问(只读或读写)定义。也有一个对这个参数的整数索引,由asynPortDriver在参数库中创建这个参数时,分配这个索引。EPICS数据库NDArrayBase.template提供了对这些标准驱动参数的访问。以下表格列出了标准驱动参数。列被定义成如下:
- 参数索引变量:在驱动中这个参数索引的变量名。在ADBase.template中有若干EPICS记录没有相关联的参数索引,并且这些被表示成Not Applicable(N/A)。
- asyn接口:这些asyn接口用于传递这个参数给驱动。
- 访问:读写(r/w)或只读(r/o)。
- drvInfo字符串:这个字符串用于通过drvUser接口在驱动中查找这个参数。这个字符串在EPICS数据库文件中使用,用于通用的asyn设备支持关联一个记录和特定的参数。它也用来关联一个paramAttribute和由asynNDArrayDriver::readNDAttributesFile读取的XML文件中一个驱动参数。
- EPICS记录名:在ADBase.template中记录的名称。每个记录以两个宏参数$(P)$(R)开头。在遇到读/写参数的情况下,通常有两个记录,一个用于写这个参数,而另一个以_RBV结尾,包含了这个参数的实际值(回读值)。
- EPICS记录类型:记录的记录类型。长度(NELM)=256字节和EPICS数据类型(FTVL)=UCHAR的Waveform记录用于保存长字符串。这消除了如果使用EPICS "string" PV,产生的40个字符限制字符串长度。在发送路径名给EPICS前,EPICS客户端将一般需要从一个string转换这样长的字符串为一个整数或者字节数组。
在SPEC中按以下做:
128.SPEC> array _temp[256]
129.SPEC> _temp = ""
130.SPEC> _temp="/home/orangepi/userdata"
131.SPEC> epics_put("AD:SIM1:TIFF1:FilePath", _temp)
133.SPEC> p epics_get("AD:SIM1:TIFF1:FilePath","string")
/home/orangepi/userdata
注意:对于其值是由枚举值定义的参数(例如:NDDataType, DBColorMode等),驱动可以对这些值使用不同枚举值的集合。通过在装载ADBase.template后装载重定义那个记录字段的驱动专用模板文件,重写ADBase.template中这个枚举菜单。
#ifndef asynNDArrayDriver_H
#define asynNDArrayDriver_H
#include <epicsMutex.h>
#include <epicsEvent.h>
#include "asynPortDriver.h"
#include "NDArray.h"
#include "ADCoreVersion.h"
#define MAX_FILENAME_LEN 256
typedef enum {
NDFileModeSingle,
NDFileModeCapture,
NDFileModeStream
} NDFileMode_t;
typedef enum {
NDFileWriteOK,
NDFileWriteError
} NDFileWriteStatus_t;
typedef enum {
NDAttributesOK,
NDAttributesFileNotFound,
NDAttributesXMLSyntaxError,
NDAttributesMacroError
} NDAttributesStatus_t;
/*字符串:asyn接口访问描述*/
#define NDPortNameSelfString "PORT_NAME_SELF"
#define NDADCoreVersionString "ADCORE_VERSION"
#define NDDriverVersionString "DRIVER_VERSION"
/* 这些参数先前在ADDriver.h中
* 我们移动到这里,因而它们可以被其它驱动类型使用。、
* 为了一致性,#define和参数名应该以ND开头而不是AD,但会打破后向兼容性。
*/
#define ADManufacturerString "MANUFACTURER"
#define ADModelString "MODEL"
#define ADSerialNumberString "SERIAL_NUMBER"
#define ADSDKVersionString "SDK_VERSION"
#define ADFirmwareVersionString "FIRMWARE_VERSION"
#define ADAcquireString "ACQUIRE"
#define ADAcquireBusyString "ACQUIRE_BUSY"
#define ADWaitForPluginsString "WAIT_FOR_PLUGINS"
/* 定义从探测器获取地数组数据特点地参数。
* NDArraySizeX和NDArraySizeY是数组数据的实际维度,包括区域定义和binning的作用。
*/
#define NDArraySizeXString "ARRAY_SIZE_X"
#define NDArraySizeYString "ARRAY_SIZE_Y"
#define NDArraySizeZString "ARRAY_SIZE_Z"
#define NDArraySizeString "ARRAY_SIZE"
#define NDNDimensionsString "ARRAY_NDIMENSIONS"
#define NDDimensionsString "ARRAY_DIMENSIONS"
#define NDDataTypeString "DATA_TYPE"
#define NDColorModeString "COLOR_MODE"
#define NDUniqueIdString "UNIQUE_ID"
#define NDTimeStampString "TIME_STAMP"
#define NDEpicsTSSecString "EPICS_TS_SEC"
#define NDEpicsTSNsecString "EPICS_TS_NSEC"
#define NDBayerPatternString "BAYER_PATTERN"
#define NDCodecString "CODEC"
#define NDCompressedSizeString "COMPRESSED_SIZE"
/* 采集的数组数目的统计*/
#define NDArrayCounterString "ARRAY_COUNTER"
/*
* 用于保存数据的文件名相关的参数。不需要驱动实现文件保存,但如果它们做了,应该使用这些参数。
* 驱动通常将组合NDFilePath, NDFileName, 和 NDFileNumber为一个文件名,使用NDFileTemplate中格式说明的顺序。
* 例如:NDFileTemplate可以是"%s%s_%d.tif"。
*/
#define NDFilePathString "FILE_PATH"
#define NDFilePathExistsString "FILE_PATH_EXISTS"
#define NDFileNameString "FILE_NAME"
#define NDFileNumberString "FILE_NUMBER"
#define NDFileTemplateString "FILE_TEMPLATE"
#define NDAutoIncrementString "AUTO_INCREMENT"
#define NDFullFileNameString "FULL_FILE_NAME"
#define NDFileFormatString "FILE_FORMAT"
#define NDAutoSaveString "AUTO_SAVE"
#define NDWriteFileString "WRITE_FILE"
#define NDReadFileString "READ_FILE"
#define NDFileWriteModeString "WRITE_MODE"
#define NDFileWriteStatusString "WRITE_STATUS"
#define NDFileWriteMessageString "WRITE_MESSAGE"
#define NDFileNumCaptureString "NUM_CAPTURE"
#define NDFileNumCapturedString "NUM_CAPTURED"
#define NDFileCaptureString "CAPTURE"
#define NDFileDeleteDriverFileString "DELETE_DRIVER_FILE"
#define NDFileLazyOpenString "FILE_LAZY_OPEN"
#define NDFileCreateDirString "CREATE_DIR"
#define NDFileTempSuffixString "FILE_TEMP_SUFFIX"
#define NDAttributesFileString "ND_ATTRIBUTES_FILE"
#define NDAttributesStatusString "ND_ATTRIBUTES_STATUS"
#define NDAttributesMacrosString "ND_ATTRIBUTES_MACROS"
/* 探测器数组数据 */
#define NDArrayDataString "ARRAY_DATA"
#define NDArrayCallbacksString "ARRAY_CALLBACKS"
/* NDArray池状态和控制 */
#define NDPoolMaxBuffersString "POOL_MAX_BUFFERS"
#define NDPoolAllocBuffersString "POOL_ALLOC_BUFFERS"
#define NDPoolFreeBuffersString "POOL_FREE_BUFFERS"
#define NDPoolMaxMemoryString "POOL_MAX_MEMORY"
#define NDPoolUsedMemoryString "POOL_USED_MEMORY"
#define NDPoolEmptyFreeListString "POOL_EMPTY_FREELIST"
/* 排队的数组 */
#define NDNumQueuedArraysString "NUM_QUEUED_ARRAYS"
class ADCORE_API asynNDArrayDriver : public asynPortDriver {
public:
asynNDArrayDriver(const char *portName, int maxAddr, int maxBuffers, size_t maxMemory,
int interfaceMask, int interruptMask,
int asynFlags, int autoConnect, int priority, int stackSize);
virtual ~asynNDArrayDriver();
/* 这些方法重写自asynPortDriver */
virtual asynStatus writeOctet(asynUser *pasynUser, const char *value, size_t maxChars,
size_t *nActual);
virtual asynStatus readGenericPointer(asynUser *pasynUser, void *genericPointer);
virtual asynStatus writeGenericPointer(asynUser *pasynUser, void *genericPointer);
virtual asynStatus writeInt32(asynUser *pasynUser, epicsInt32 value);
virtual asynStatus setIntegerParam(int index, int value);
virtual asynStatus setIntegerParam(int list, int index, int value);
virtual asynStatus readInt32(asynUser *pasynUser, epicsInt32 *value);
virtual asynStatus readFloat64(asynUser *pasynUser, epicsFloat64 *value);
virtual void report(FILE *fp, int details);
/* 这些是这个类的添加的新方法 */
virtual asynStatus createFilePath(const char *path, int pathDepth);
virtual asynStatus checkPath();
virtual bool checkPath(std::string &filePath);
virtual asynStatus createFileName(int maxChars, char *fullFileName);
virtual asynStatus createFileName(int maxChars, char *filePath, char *fileName);
virtual asynStatus readNDAttributesFile();
virtual asynStatus getAttributes(NDAttributeList *pAttributeList);
asynStatus incrementQueuedArrayCount();
asynStatus decrementQueuedArrayCount();
int getQueuedArrayCount();
void updateQueuedArrayCount();
class NDArrayPool *pNDArrayPool; //一个NDArrayPool指针,它在构造器中被初始化为pNDArrayPoolPvt_。插件更改这个指针为在NDArray::pNDArrayPool中被传递的。
protected:
int NDPortNameSelf;
#define FIRST_NDARRAY_PARAM NDPortNameSelf
int NDADCoreVersion;
int NDDriverVersion;
int ADManufacturer;
int ADModel;
int ADSerialNumber;
int ADSDKVersion;
int ADFirmwareVersion;
int ADAcquire;
int ADAcquireBusy;
int ADWaitForPlugins;
int NDArraySizeX;
int NDArraySizeY;
int NDArraySizeZ;
int NDArraySize;
int NDNDimensions;
int NDDimensions;
int NDDataType;
int NDColorMode;
int NDUniqueId;
int NDTimeStamp;
int NDEpicsTSSec;
int NDEpicsTSNsec;
int NDBayerPattern;
int NDCodec;
int NDCompressedSize;
int NDArrayCounter;
int NDFilePath;
int NDFilePathExists;
int NDFileName;
int NDFileNumber;
int NDFileTemplate;
int NDAutoIncrement;
int NDFullFileName;
int NDFileFormat;
int NDAutoSave;
int NDWriteFile;
int NDReadFile;
int NDFileWriteMode;
int NDFileWriteStatus;
int NDFileWriteMessage;
int NDFileNumCapture;
int NDFileNumCaptured;
int NDFileCapture;
int NDFileDeleteDriverFile;
int NDFileLazyOpen;
int NDFileCreateDir;
int NDFileTempSuffix;
int NDAttributesFile;
int NDAttributesStatus;
int NDAttributesMacros;
int NDArrayData;
int NDArrayCallbacks;
int NDPoolMaxBuffers;
int NDPoolAllocBuffers;
int NDPoolFreeBuffers;
int NDPoolMaxMemory;
int NDPoolUsedMemory;
int NDPoolEmptyFreeList;
int NDNumQueuedArrays;
class NDArray **pArrays; // 用于在这个驱动中存储数据的NDArray指针数组
class NDAttributeList *pAttributeList; // 用于获取一组属性的当前值的NDAttributeList对象
int threadStackSize_;
int threadPriority_;
private:
NDArrayPool *pNDArrayPoolPvt_;
epicsMutex *queuedArrayCountMutex_;
epicsEventId queuedArrayEvent_;
int queuedArrayCount_;
bool queuedArrayUpdateRun_;
epicsEventId queuedArrayUpdateDone_;
friend class NDArrayPool;
};
#endif
NDArray驱动是从这个类派生的;实现了用于NDArray对象的asynGenericPointer方法。对于areaDetector,插件和探测器驱动都是间接从这个类派生的。asynNDArrayDriver继承自asynPortDriver。
在asynNDArrayDriver.h中参数定义以及在NDArrayBase.template中EPICS记录定义(文件相关联的记录在NDFile.template中)
1)有关ADCore和插件或驱动的信息
- NDADCoreVersion: asynOctet: r/o: ADCore版本号。这可以由通道访问客户端使用来根据用于构建这个驱动或插件的ADCore版本更改它们的行为: ADCORE_VERSION: $(P)$(R)ADCoreVersion_RBV: stringin
- NDDriverVersion: asynOctet: r/o: 驱动或插件版本号。这可以由通道访问客户端使用来根据这个插件或驱动的版本更改它们的行为: DRIVER_VERSION: $(P)$(R)DriverVersion_RBV: stringin
2) 有关asyn端口的信息
- NDPortNameSelf: asynOctet: r/o: asyn端口名: PORT_NAME_SELF: $(P)$(R)PortName_RBV: stringin
3) 数据类型
- NDDdataType: asynInt32: r/w: 数据类型(NDDataType_t): DATA_TYPE: $(P)$(R)DataType: mbbo: $(P)$(R)DataType_RBV: mbbi
4) 颜色模式
- NDColorMode: asynInt32: r/w: 颜色模式(NDColorMode_t): COLOR_MODE: $(P)$(R)ColorMode: mbbo: $(P)$(R)ColorMode_RBV: mbbi
5) NDBayerPattern: asynInt32: r/o: NDArray数据的Bayer模式(NDBayerPattern_t): BAYER_PATTERN: $(P)$(R)BayerPattern_RBV: mbbi
asynNDArrayDriver::asynNDArrayDriver(const char * portName, int maxAddr, int maxBuffers, size_t maxMemory, int interfaceMask, int interruptMask, int asynFlags, int autoConnect, int priority, int stackSize)
这是asynNDArrayDriver类的构造器。
portName, maxAddr, interfaceMask, interruptMask, asynFlags, autoConnect, priority和stackSize只是被传递给了asynPortDriver::asynPortDriver。asynNDArrayDriver创建一个NDArrayPool对象来分配NDArray对象。maxBuffers和maxMemroy被传递给了NDArrayPool::NDArrayPool。
参数:
- [in]portName:要被创建的asyn端口驱动的名称。
- [in]maxAddr:这个驱动支持的asyn addr地址数目。1最小。
- [in]maxBuffer:允许这个驱动的NDArrayPool分配的NDArray缓存的最大数目。设置这个为0,允许无限数目的缓存。这个值不再被使用并且被忽略。它将在将来主发行版中被移除。
- [in]maxMemory:允许这个驱动的NDArrayPool分配的最大内存量。设置这个为0,允许无限内存量。
- [in]interfaceMask:定义这个驱动支持的asyn接口的位掩码。
- [in]interruptMask:定义asyn接口可以产生中断(回调)的位掩码。
- [in]asynFlags:创建这个asyn端口驱动的标记;包括ASYN_CANBLOCK和ASYN_MULTIDEVICE.
- [in]autoConnect:这个端口驱动的autoConnect标记。
- [in]priority:如果在asynFlags中设置了ASYN_CANBLOCK,这个asyn端口驱动的线程优先级。这个值也应该用于这个对象创建的任何其它线程。
- [in]stackSize:如果在asynFlags中设置了ASYN_CANBLOCK,这个asyn端口驱动的栈大小。这个值也应该用于这个对象创建的任何其它线程。
asynNDArrayDriver::~asynNDArrayDriver()
析构函数。
asynStatus asynNDArrayDriver::checkPath()
检测在NDFilePath参数中指定的目录是否存在。这是一个确定在NDFilePth参数中指定的目录是否存在的便捷方式。如果设置NDFilePathExists为0(不存在)或者1(存在)。如果在路径中'末尾/'没有出现,它也添加一个末尾的'/'。如果这个目录不存在,返回一个错误状态。
bool asynNDArrayDriver::checkPath(std::string & filePath)
这是确定指定目录是否存在的便捷函数。如果路径末尾没有'/'或'\'字符,它添加一个末尾'/'或'\'到这个路径。如果目录存在返回true,不存在,返回false。
asynStatus asynNDArrayDriver::createFileName(int maxChars, char* fullFileName)
从组件构建一个文件名。
参数:
- [in]maxChars:fullFileName字符串的大小。
- [in]fullFileName:构建的包括文件路径的文件名。
这是一个便捷函数,它从NDFilePath, NDFileName, NDFileNumber和NDFileTemplate参数构建一个完整的文件名。如果NDAutoIncrement是真,则它在创建这个文件名后,对NDFileNumber加1。
asynStatus asynNDArrayDriver::createFileName(int maxChars, char * filePath, char * fileName)
从组件构建一个文件名。
参数:
- [in]maxChars:fullFileName字符串的大小。
- [out]filePath:文件路径。
- [out]fileName:构建的不带文件路径的文件名。
这是一个便捷方法,它从NDFilePath, NDFileName, NDFileNumber和NDFileTemplate参数构建一个文件路径和文件名。如果NDAutoIncrement是真,则在创建这个文件名后,它增加NDFileNumber。
asynStatus asynNDArrayDriver::createFilePath(const char * path, int pathDepth)
为文件创建目录路径的函数。
参数:
- [in]path:要创建的路径。末尾部分是文件名并且不被窗。
- [in]pathDepth:这确定了在尝试创建目录前认为存在多少路径:pathDepth=0不创建目录,pathDepth=1创建需要的所有目录(即:仅认为根目录存在)。pathDepth=2,认为根目录下存在1个目录,pathDepth=-1,认为除了一个目录外都存在,pathDepth=-2,认为除两个目录外都存在。
asynStatus asynNDArrayDriver::decrementQueuedArrayCount()
int asynNDArrayDriver::getQueuedArrayCount()
asynStatus asynNDArrayDriver::incrementQueuedArrayCount()
void asynNDArrayDriver::updateQueuedArrayCount()
asynStatus asynNDArrayDriver::getAttributes(NDAttributeList * pList)
从驱动获取属性的当前值并且添加它们到一个输出属性列表。
为这个驱动的属性列表调用NDAttributeList::updateValues,并且接着NDAttributeList:copy复制这个驱动的属性列表到pList,追加这些值到输出属性列表。
参数:
[out]pList:复制属性到的NDAttributeList。
asynStatus asynNDArrayDriver::readFloat64(asynUser * pasynUser,epicsFloat64 * value)
asynStatus asynNDArrayDriver::readGenericPointer(asynUser * pasynUser, void * genericPointer)
这个方法从asynNDArrayDriver复制一个NDArray对象到由调用者传入的一个NDArray指针。目的NDArray地址被调用者在genericPointer参数中传递。调用者必须为数组分配内存,并且在NDArray->dataSize中传递大小。这个方法将限制被复制的数据量为实际数组大小或者输入的dataSize,二者取较小者。
参数:
- [in]pasynUser:用于获取从其复制的和用于asynTrace输出的NDArray的地址。
- [in]genericPointer:指向一个NDArray的指针。NDArray必须之前已经由调用者分配。来自asynNDArrayDriver的NDArray将被复制到由genericPointer指向的NDArray。
asynStatus asynNDArrayDriver::readInt32(asynUser * pasynUser, epicsInt32 * value)
asynStatus asynNDArrayDriver::readNDAttributesFile()
通过读取XML文件创建这个驱动的NDAttributeList(pAttriubteList)。这清除了来自这个驱动的NDAttriubteList的任何已有的属性,并且接着根据XML文件创建一个新的列表。
通过调用asynNDArrayDriver::getAttributes传递它pNDArray->pAttributeList,这些属性可以关联一个NDArray。
以下简单示例XML文件说明了PVAttribute和paramAttribute属性被定义的方式:
<?xml version="1.0" standalone="no" ?>
<Attributes>
<Attribute name="AcquireTime" type="EPICS_PV" source="13SIM1:cam1:AcquireTime" dbrtype="DBR_NATIVE" description="Camera acquire time"/>
<Attribute name="CameraManufacturer" type="PARAM" source="MANUFACTURER" datatype="STRING" description="Camera manufacturer"/>
</Attributes>
每个NDAttribute(当前为PVAttribute或者paramAttribute),但其它类型在将来被加入)用一个XML Attribute标签定义。对于每个属性,有很多XML属性(这里属性两个个含义:NDAttriubte和XML属性)。XML属性语法为name="value"。XML属性名是区分大小写的并且必须是小写,即:name="xxx",而非NAME="xxx"。XML属性值是由XML Schema指定的,并且对于datatype和dbrtype属性总是大小。XML属性名在这里被列出:
- name:决定NDAttribue的名称。需要它,必须唯一,不区分大小写,必须以一个字母开头。它只包含字母,数字和下划线(没有空格或其它标点)
- type:确定NDAttribute的类型。"EPICS_PV"创建一个PVAttribute,而"PARAM"创建一个paramAttribute。如果这个XML属性缺少,默认是EPICS_PV.
- source:决定NDAttriubte的来源。需要它,如果type="EPICS_PV",则这是这个EPICS PV的名称,它是区分大小写的。如果type="PARAM",则这是在EPICS数据库中文件使用来识别这个参数的drvInfo字符串。
- dbrtype:确定将被使用用通道访问读取一个EPICS_PV值的数据类型。它可以是标准的EPICS DBR类型之一(例如:"DBR_DOUBLE", "DBR_STRING", ...)或者它可以是特殊的"DBR_NATIVVE",这表示使用这个PV的本地通道访问数据类型。如果这个XML属性缺少,默认使用DBR_NATIVE。总是使用大写。
- datatype:确定type="PARAM"的参数数据类型。它必须匹配驱动或插件参数库中的实际数据类型,并且必须是"INT", "DOUBLE", 或"STRING"。如果这个XML属性缺失,默认是"INT"。总是大写。
- addr:决定type="PARAM"的asyn地址。如果XML属性缺少,默认是0。
- description:确定这个属性的描述。它不是必需的,并且默认是一个NULL字符串。
void asynNDArrayDriver::report(FILE * fp, int details)
报告这个驱动的状态。这个方法调用asynPortDriver基类中report函数。如果details>5, 它接着调用NDArrayPool::report()方法。
参数:
- [in]fp:由调用者传递的文件指针,输出将被写入它。
- [in]details:则NDArrayPool::report和NDAttriubteList:report都被调用。
asynStatus asynNDArrayDriver::setIntegerParam(int index, int value)
设置参数库中一个整数的值。即,调用setIntegerParam(0, index, value), 即用于参数表0。
参数:
- [in]index:参数编号
- [in]value:设置的值。
asynStatus asynNDArrayDriver::setIntegerParam(int list,int index, int value)
设置参数库中一个整数的值。
参数:
- [in]list:参数表编号。必须小于传递给asynPortDriver::asynPortDriver的maxAddr。
- [in]index:参数编号
- [in]value:设置的值。增加这个函数捕获驱动设置ADAquire为0和设置NumQueuedArrays。它实现了设置ADAquireBusy来反映采集是否结束的逻辑。如果WaitForPlugins为True,则这包括等待NumQueueArrays为0。当ADAcquire变为0,它必须使用getQueuedArrayCount而不是来自参数库的NumQueuedArrays,因为NumQueuedArrays在一个单独线程中被更新,并且可能还未被更新。getQueuedArrayCount立即更新。
asynStatus asynNDArrayDriver::writeGenericPointer(asynUser * pasynUser, void * genericPointer
这个方法当前什么也没做,但应该在这个基类中实现它。派生类可以根据需要实现这个方法。
参数:
- [in]pasynUser:用于获取要被复制到的NDArray的地址,以及用于asynTrace输出。
- [in]genericPointer:指向一个NDArray的指针。由genericPointer指向的NDArray将被复制到在asynNDArrayDriver中的NDArray。
asynStatus asynNDArrayDriver::writeInt32(asynUser * pasynUser, epicsInt32 value)
设置一个int32参数。
参数:
- [in]pasynUser:在pasynUser->reason中包含功能码的asynUser结构体。
- [in]value:这个参数的值。
如果这个功能码需要它,采取操作。
asynStatus asynNDArrayDriver::writeOctet(asynUser * pasynUser, const char * value, size_t nChars, size_t * nActual)
当asyn客户端调用paynOctet->write(),被调用。这个函数为某些参数执行操作,包括NDAttriubesFile。对于所有参数,它在参考库中设置这个值并且调用任何已注册的回调。
参数:
- [in]pasynUser:编码reason和地址的pasynUser结构体。
- [in]value:要写字符串的地址。
- [in]nChars:要写字符的数目。
- [in]nActuals:实际被写字符的数目。