PVAttribue类派生自NDAttribute。它通过监视来自EPICS PV的回调获取它的值,并且因而被用于任意EPICS PV的当前值和一个NDArray。PVAttribute类文档详细描述这个类。
#ifndef INCPVAttributeH
#define INCPVAttributeH
#include
#include
#include
#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类派生自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)
驱动/插件属性的构造器。
参数:
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类派生自NDAttriubte。它从一个用户编写地C++函数获取它地值。functAttribute类非常通用,并且可以用于添加几乎任何信息到NDArray。ADCore包含示例代码,myAttributeFunctions.cpp演示了如何编写这样地函数。functAttribute类文档详细地描述了这个类。
#ifndef INCfunctAttributeH
#define INCfunctAttributeH
#include
#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)
函数属性的构造器。
参数:
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继承自asynPortDriver。它为NDArray对象实现了asynGenericPointer函数。插件和面探测器驱动都是间接从这个类派生的。asynNDArrayDriver类文档详细地描述了这个类。
文件asynNDArrayDriver.h定义了所有NDArray驱动和插件如何可能应该实现地所有NDArray驱动。这些参数由字符串(drvInfo)和一个相关联asyn接口和访问(只读或读写)定义。也有一个对这个参数的整数索引,由asynPortDriver在参数库中创建这个参数时,分配这个索引。EPICS数据库NDArrayBase.template提供了对这些标准驱动参数的访问。以下表格列出了标准驱动参数。列被定义成如下:
在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
#include
#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和插件或驱动的信息
2) 有关asyn端口的信息
3) 数据类型
4) 颜色模式
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。
参数:
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)
从组件构建一个文件名。
参数:
这是一个便捷函数,它从NDFilePath, NDFileName, NDFileNumber和NDFileTemplate参数构建一个完整的文件名。如果NDAutoIncrement是真,则它在创建这个文件名后,对NDFileNumber加1。
asynStatus asynNDArrayDriver::createFileName(int maxChars, char * filePath, char * fileName)
从组件构建一个文件名。
参数:
这是一个便捷方法,它从NDFilePath, NDFileName, NDFileNumber和NDFileTemplate参数构建一个文件路径和文件名。如果NDAutoIncrement是真,则在创建这个文件名后,它增加NDFileNumber。
asynStatus asynNDArrayDriver::createFilePath(const char * path, int pathDepth)
为文件创建目录路径的函数。
参数:
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,二者取较小者。
参数:
asynStatus asynNDArrayDriver::readInt32(asynUser * pasynUser, epicsInt32 * value)
asynStatus asynNDArrayDriver::readNDAttributesFile()
通过读取XML文件创建这个驱动的NDAttributeList(pAttriubteList)。这清除了来自这个驱动的NDAttriubteList的任何已有的属性,并且接着根据XML文件创建一个新的列表。
通过调用asynNDArrayDriver::getAttributes传递它pNDArray->pAttributeList,这些属性可以关联一个NDArray。
以下简单示例XML文件说明了PVAttribute和paramAttribute属性被定义的方式:
每个NDAttribute(当前为PVAttribute或者paramAttribute),但其它类型在将来被加入)用一个XML Attribute标签定义。对于每个属性,有很多XML属性(这里属性两个个含义:NDAttriubte和XML属性)。XML属性语法为name="value"。XML属性名是区分大小写的并且必须是小写,即:name="xxx",而非NAME="xxx"。XML属性值是由XML Schema指定的,并且对于datatype和dbrtype属性总是大小。XML属性名在这里被列出:
void asynNDArrayDriver::report(FILE * fp, int details)
报告这个驱动的状态。这个方法调用asynPortDriver基类中report函数。如果details>5, 它接着调用NDArrayPool::report()方法。
参数:
asynStatus asynNDArrayDriver::setIntegerParam(int index, int value)
设置参数库中一个整数的值。即,调用setIntegerParam(0, index, value), 即用于参数表0。
参数:
asynStatus asynNDArrayDriver::setIntegerParam(int list,int index, int value)
设置参数库中一个整数的值。
参数:
asynStatus asynNDArrayDriver::writeGenericPointer(asynUser * pasynUser, void * genericPointer
这个方法当前什么也没做,但应该在这个基类中实现它。派生类可以根据需要实现这个方法。
参数:
asynStatus asynNDArrayDriver::writeInt32(asynUser * pasynUser, epicsInt32 value)
设置一个int32参数。
参数:
如果这个功能码需要它,采取操作。
asynStatus asynNDArrayDriver::writeOctet(asynUser * pasynUser, const char * value, size_t nChars, size_t * nActual)
当asyn客户端调用paynOctet->write(),被调用。这个函数为某些参数执行操作,包括NDAttriubesFile。对于所有参数,它在参考库中设置这个值并且调用任何已注册的回调。
参数: