/******************************************************************** created: 2014/12/23 author: M.Yang purpose: UCI库的全局定义文件 modify: *********************************************************************/ #ifndef ucidef_h__ #define ucidef_h__ #if (defined(WIN32) || defined(_WIN32) || defined(__WIN32__) || defined(__NT__)) && !defined(_NI_mswin16_) #define _UCIAPI __stdcall #define _UCICallBack __stdcall #endif #define _in #define _out #define _in_out #ifdef __cplusplus namespace uci { #endif // __cplusplus #ifdef _CVI_ #define u_inline static #else #define u_inline inline #endif // _CVI_ #ifndef MAX_PATH #define MAX_PATH 260 #endif // !MAX_PATH ////////////////////////////////////////////////////////////////////////// //{ 基础数据类型定义 #ifdef _UNICODE //@brief : 表示一个 Unicode 字符。 #define u_tchar wchar_t #else //@brief : 表示一个 ASCII 字符。 #define u_tchar char #endif // _UNICODE #if defined(_WIN64) typedef unsigned __int64 u_unit_ptr; typedef __int64 u_long_ptr; #else typedef unsigned int u_unit_ptr; typedef long u_long_ptr; #endif //@brief : Boolean型 #define u_bool bool //@brief : 8位无符号整数 #define u_byte unsigned char //@brief : 8位有符号整数 #define u_char char //@brief : 不指定数据类型的缓冲区指针 #define u_buf void* //@brief : 对象类型的抽象类型 #define u_object void //@brief : 表示 16 位有符号整数。 #define u_short short //@brief : 表示 16 位无符号整数。 #define u_ushort unsigned short //@brief : 表示 16 位有符号整数。 #define u_int16 u_short //@brief : 表示 16 位无符号整数。 #define u_uint16 u_ushort //@brief : 表示 32 位有符号整数。 #define u_int32 int //@brief : 表示 32 位无符号整数。 #define u_uint32 unsigned int //@brief : 表示UCI接口返回的状态值(32位有符号数) #define u_status u_int32 //@brief : 表示大小,32位无符号数 #define u_size u_uint32 //@brief : 表示会话ID,32位无符号数 #define u_session u_uint32 //@brief : 表示字符串类型 #define u_string u_tchar* //@brief : 表示只读字符串类型 #define u_cstring const u_tchar* //@brief : 表示属性ID类型,32位无符号数 #define u_attr u_int32 //@brief : 表示属性值类型,32位无符号数 #define u_attr_v u_int32 //@brief : 表示一个16位无符号类型的单字 #define u_word u_ushort //@brief : 表示一个32位无符号类型的双字 #define u_dword u_uint32 //@brief : 消息参数 #define u_wparam u_unit_ptr //@brief : 消息参数 #define u_lparam u_long_ptr //} ////////////////////////////////////////////////////////////////////////// //{ 接口返回状态值定义 //@brief : 操作成功 #define UCI_SUCCESS (0) //@brief : 定义错误码的起始值 #define UCI_ERR (-1000) //@brief : 判断当前接口是否执行失败 //@brief : 判断当前接口是否执行成功 #define UCIERR(r) (r < 0) #define UCISUCCESS(r) (!UCIERR(r)) //@brief : 定义错误码 typedef enum _UCIErr { NoError = 0, //@brief : 资源初始化错误 InitResourceError = UCI_ERR - 20, //@brief : 无效的会话 Invalid_Session, //@brief : 操作超时 Timeout, //@brief : 操作失败 Failed, //@brief : 不支持的操作 Unsupported, //@brief : 内存空间不足 Insufficient_Memory, //@brief : 系统繁忙,无法响应 Busy, //@brief : 通信异常,不可逆! COMExpection, //@brief : 通道未打开! ChannelNotOpened, //@brief : 未知的错误 Unknown = UCI_ERR - 40 - 1, //@brief : 建立连接的字符串地址格式错误 Connect_InvalidAddress = UCI_ERR - 40, //@brief : 连接还未建立 Connect_NotBuild, //@brief : 连接已断开 Connect_Break, //@brief : 不支持的通信方式 Connect_Unsupported_COMType, //@brief : 未发现指定的设备 Device_NoFound = UCI_ERR - 60, //@brief : 不支持的设备 Device_Unsupported, //@brief : 需要先执行查询设备的操作 Device_QueryFirst, //@brief : 机型不匹配 Device_NotMatch, //@brief : 查询网络设备失败 Query_LANNodesFailed, //@brief : USB设备地址只在执行查询设备操作后才有效, //@remarks : 从UCI库导出的USB设备地址,只是一个列表索引,不是真正的设备地址。 AddrValid_AfterQueryDeviceOper, //@brief : 未发现U盘接入 UDisk_NotFound, //@brief : 按键已经锁定 Key_Locked, //@brief : 命令字符串格式错误 CMD_Invalid_StringFormat = UCI_ERR - 80, //@brief : 只支持单条命令 CMD_OnlySupportSingle, //@brief : 一条命令只支持一个属性 CMD_OnlySupportSingleAttr, //@brief : 不支持的命令 CMD_Unsupported, //@brief : 发送命令失败 CMD_SendFailed, //@brief : 协议数据格式错误 CMD_Invalid_ProtocolFormat, //@brief : 设备端写文件到flash失败! CMD_WriteFileToFlash_Failed, //@brief : 未发现有效的回复数据 CMD_NoFound_Valid_Reply_Data, //@brief : 命令消息错误,请查看命令参数是否符合协议 CMD_Error_Message, //@brief : 无效的表达式 CMD_Invalid_Expression, //@brief : 参数错误 Args_Invalid = UCI_ERR - 100, //@brief : 参数提供的空间太小 Args_MemoryTooSmall, //@brief : 所提供的文件名太长(最长50个字节) Args_FileNameTooLong, //@brief : 参数所给的数据大小与协议不匹配(防止数据错误) Args_DataLenNotMatch, //@brief : 数字溢出 Data_Overflow = UCI_ERR - 120, //@brief : 超出范围 Data_OutRange, //@brief : 数据未全部读取完 Data_NotReadEnoughLenth, //@brief : 数据校验失败 Data_ECC_Failed, //@brief : 无效的数据 Data_Invalid, //@brief : 数据压缩失败 Data_Zip_Error, //@brief : 数据解压缩失败 Data_UnZip_Error, //@brief : 数据传输失败 Data_Transfer_Error, //@brief : 数据传输失败 Data_Transfer_Break, //@brief : 无有效数据可读取 Data_No_Data_Incoming, //@brief : File_AccessDenied = UCI_ERR - 140, //@brief : An unspecified error occurred. File_GenericException, //@brief : The file could not be located. File_NotFound, //@brief : All or part of the path is invalid. File_BadPath, //@brief : The permitted number of open files was exceeded. File_TooManyOpenFiles, //@brief : There was an attempt to use an invalid file handle // or The file format is unsupported! // or The file data is error! File_InvalidFile, //@brief : The current working directory cannot be removed File_RemoveCurrentDir, //@brief : There are no more directory entries File_DirectoryFull, //@brief : There was an error trying to set the file pointer File_BadSeek, //@brief : There was a hardware error File_HardIO, //@brief : SHARE.EXE was not loaded, or a shared region was locked File_SharingViolation, //@brief : There was an attempt to lock a region that was already locked File_LockViolation, //@brief : The disk is full File_DiskFull, //@brief : The end of file was reached File_EndOfFile, //@brief : 写文件到磁盘失败 File_SaveToDiskFailed, }UErr; //} ////////////////////////////////////////////////////////////////////////// //@brief : 错误的会话ID #define INVALID_SESSION ((u_uint32)(-1)) ////////////////////////////////////////////////////////////////////////// //{ 属性 //切换中英文: "lang:zh-hans" or "lang:en-us" //使能USB设备移除和连接检测机制 : "devchange:1" //} #define CACHE_LINE 1 #define CACHE_ALIGN __declspec(align(CACHE_LINE)) //@brief : 设置结构体的对齐方式 #define PACK_ALIGN(n) __declspec(align(n)) #ifdef __cplusplus extern "C"{ #endif // __cplusplus //one Word is 2 bytes u_inline u_word UCI_HIWORD(u_dword _dw) { return ((u_word)((_dw >> 16) & 0xffff)); } u_inline u_word UCI_LOWORD(u_dword _dw) { return ((u_word)(_dw & 0xffff)); } //#pragma pack(show)// C4810 //ensure byte-packed structures(1字节对齐) #include //如果编译环境中没有该文件,请替换为当前平台的字节对齐语句。 //@brief : 读数据接口的参数包 //@remarks : 普通读数据命令可通过uci_CreateRParams接口创建 typedef struct _RParams { //@brief : 命令字符串,以'\0'结尾. 具体格式见具体协议文档; u_cstring CMDString; //@brief : 要返回的数据量,具体意义视具体命令而定,通常和要读取\查询的数据是对应的; u_uint32 RetCount; //@brief : 读超时 u_uint32 Timeout; //@brief : 附加数据 //@remarks : 普通操作不使用,可空置;在查询设备时用到, //数据类型为QParams,其它以文档为准! u_buf ExtraData; //reserve //@brief : 附加数据的长度 u_size ExtraDataLen; }RParams, *PRParams; #ifdef __cplusplus inline RParams* uci_CreateRParams(RParams& _p, u_cstring _cmd, u_uint32 _timeout, u_buf _ExtraData, u_size _ExtraDataLen) { memset(&_p, 0, sizeof(_p)); _p.CMDString = _cmd; _p.Timeout = _timeout; _p.ExtraData = _ExtraData; _p.ExtraDataLen = _ExtraDataLen; return &_p; } #else u_inline RParams* uci_CreateRParams(RParams* _p, u_cstring _cmd, u_uint32 _timeout, u_buf _ExtraData, u_size _ExtraDataLen) { memset(_p, 0, sizeof(*_p)); _p->CMDString = _cmd; _p->Timeout = _timeout; _p->ExtraData = _ExtraData; _p->ExtraDataLen = _ExtraDataLen; return _p; } #endif typedef struct _DeviceIOParams { u_int32 Count; u_int32* Data; }DeviceIOParams; typedef struct _QParams { //@brief : 要查询的通信节点类型 //@remarks : 从enum NodeType 取值! 通过标志位存放类型值 //@eg : NodeType::USB | NodeType::LAN u_int32 Type; //@brief : 端口集端口数量 u_int32 PortCount; //@brief : 端口集 u_int32* Ports; //@brief : PVID集的PVID的个数 //@remarks : u_int32 PVIDCount; //@brief : PID 和 VID集 //@remarks : 使用MakePVID创建,GetPID和GetVID获取 u_int32* PVID; //@brief : 查询字符串,nullptr时表示查询所有设备,否则查询指定设备名的设备。 u_cstring Msg; }QParams, *PQParams;//@brief : 查询设备时的配置参数 u_inline u_int32 MakePVID(u_ushort _pid, u_ushort _vid) { return ((_pid << 16) | (_vid)); }; u_inline u_ushort GetPID(u_int32 _pvid) { return UCI_HIWORD(_pvid); } u_inline u_ushort GetVID(u_int32 _pvid) { return UCI_LOWORD(_pvid); } #ifdef __cplusplus inline QParams* UCI_CreateQParam(QParams& _qp, u_int32 _type, u_int32* _ports, u_int32 _port_cnt, u_int32* _pvid, u_int32 _pvid_cnt, u_cstring _msg) { memset(&_qp, 0, sizeof(_qp)); _qp.Type = _type; _qp.Ports = _ports; _qp.PortCount = _port_cnt; _qp.PVID = _pvid; _qp.PVIDCount = _pvid_cnt; _qp.Msg = _msg; return &_qp; } #else u_inline QParams* UCI_CreateQParam(QParams* _qp, u_int32 _type, u_int32* _ports, u_int32 _port_cnt, u_int32* _pvid, u_int32 _pvid_cnt, u_cstring _msg) { memset(_qp, 0, sizeof(*_qp)); _qp->Type = _type; _qp->Ports = _ports; _qp->PortCount = _port_cnt; _qp->PVID = _pvid; _qp->PVIDCount = _pvid_cnt; _qp->Msg = _msg; return _qp; } #endif //@brief : 写数据接口参数包 //@remarks : 可通过接口uci_CreateWParams创建 typedef struct _WParams { //@brief : 命令字符串,以'\0'结尾. 具体格式见文档; u_cstring CMDString; //@brief : 返回的数据量数据,具体意义视具体命令而定; u_uint32 RetCount; //@brief : 读超时 u_uint32 Timeout; }WParams, *PWParams; #ifdef __cplusplus u_inline WParams* uci_CreateWParams(WParams& _p, u_cstring _cmd, u_uint32 _timeout) { memset(&_p, 0, sizeof(_p)); _p.CMDString = _cmd; _p.Timeout = _timeout; return &_p; } #else u_inline WParams* uci_CreateWParams(WParams* _p, u_cstring _cmd, u_uint32 _timeout) { memset(_p, 0, sizeof(*_p)); _p->CMDString = _cmd; _p->Timeout = _timeout; return _p; } #endif typedef struct _CommandParams { //@brief : 命令字符串,以'\0'结尾. 具体格式见文档; u_cstring CMDString; //@brief : 命令参数1 u_uint32 Param1; //@brief : 命令参数1 u_uint32 Param2; //@brief : 超时 u_uint32 Timeout; }CommandParams, *PCommandParams; //@brief : 写文件操作的参数包 typedef struct _WFileParams { //@brief : 命令字符串,以'\0'结尾. 具体格式见文档; u_cstring CMDString; //@brief : 要写入的文件路径(包括文件名) u_cstring FilePath; //@brief : 写超时(单位:ms) u_uint32 Timeout; }WFileParams, *PWFileParams; //@brief : 读文件接口的参数包 typedef struct _RFileParams { //@brief : 命令字符串,以'\0'结尾. 具体格式见文档; u_cstring CMDString; //@brief : 缓冲数据到本地磁盘的文件路径。(包括文件名和后缀) u_cstring FilePath; //@brief : 读超时(单位:ms) u_uint32 Timeout; //@brief : 最终输出文件的路径 u_tchar FilePathFinal[MAX_PATH]; }RFileParams, *PRFileParams; //@brief : 通信节点类型 //@remarks : 在QParams中是按位与,在Node中取的是enum值。 typedef enum _NodeType{ LAN = 0x0001, USB = 0x0010, }NodeType; //@brief : USB设备的描述符 //@remarks : typedef struct _USBDescriptor { //@brief : PID u_ushort PID; //@brief : VID u_ushort VID; //@brief : 地址 u_ushort Addr; }USBDescriptor; //@brief : IP地址 //@remarks : 填充顺序为 f1(192).f2(168).f3(1).f4(253) - 小端模式 typedef union _IPAddr { struct { u_byte f1, f2, f3, f4; } Field; u_int32 Addr; }u_IPAddr; //@brief : LAN口通信的设备描述符 //@remarks : typedef struct _LANDescriptor { //@brief : IP地址(字符串类型) u_tchar IP[16]; //@brief : IP地址 u_IPAddr Addr; //@brief : 网络端口 //@remarks : TCPIP连接用的端口号 u_ushort Port; }LANDescriptor; //@brief : 查询到的设备节点的参数 //@remarks : typedef struct _Node { //@brief : 通信接口方式 NodeType Type; //@brief : 设备名(机型名) //@remarks : 在本UCI库导出时,该名称为UCI库协议一致的名称, // 在已出厂机型未统一设置内置名称时,UCI库内部自动匹配为UCI协议设置的名字! u_tchar Name[50]; //@brief : 设备类型 //@remarks : 信号源 = SG, 示波器 = DSO; u_tchar DevType[10]; //@brief : LAN口参数 LANDescriptor LAN; //@brief : USB接口参数 USBDescriptor USB; //@brief : 连接字符串 u_tchar UCIAddr[256]; //@brief : 序列号 u_tchar SN[50]; //@brief : 设备状态 u_status Status; //@brief : 设备实际显示名称 u_tchar IDN[20]; }Node, *PNode; //@brief : 查询到的设备节点的参数 //@remarks : typedef struct _NodeEx { //@brief : 通信接口方式 NodeType Type; //@brief : 设备名(机型名) //@remarks : 在本UCI库导出时,该名称为UCI库协议一致的名称。 u_tchar Name[50]; //@brief : 设备类型 //@remarks : 信号源 = SG, 示波器 = DSO; u_tchar DevType[10]; //@brief : LAN口参数 LANDescriptor LAN; //@brief : USB接口参数 USBDescriptor USB; //@brief : 连接字符串 u_tchar UCIAddr[256]; //@brief : 序列号 u_tchar SN[50]; //@brief : 设备状态 u_status Status; //@brief : 设备实际显示名称 u_tchar IDN[20]; }NodeEx, *PNodeEx; typedef struct _UCIMSG { u_session Session; u_uint32 Message; u_wparam wParams; u_lparam lParams; u_byte Reserved[240]; }UCIMSG;//256Bytes ////////////////////////////////////////////////////////////////////////// typedef enum _uci_msg { UMSG_CONNECT_CLOSED = 1, //@brief : 文件传输消息 //@remarks : // wParams 总帧数; // lParams 帧计数; -1 : 开始传输; [0,wParams)传输中, 等于wParams传输结束 //-> UCIMSGProc return -1 : 表示中断传输. UMSG_FILE_TRANSFER = 2, //@brief : USB插拔消息 //@remarks : // wParams : 使用低16位,其中,高8位为pid,低8位为vid; // lParams : 事件类型, 移除 = 0, 插入 = 1; UMSG_DEVICE_NOTIFY = 3, }EUCIMSG; typedef int(__stdcall *UCIMSGProc)(UCIMSG* _msg); #include #ifdef __cplusplus } #endif//__cplusplus #ifdef __cplusplus } #endif // __cplusplus #endif // ucidef_h__