#ifndef CCOS_DRIVER_H #define CCOS_DRIVER_H #include #include #include #include "ResDataObject.h" #define CCOS_DRIVER_API #define CCOS_DRIVER_C_API extern "C" ////////////////////////////////////////////////////////////////// /// C版本驱动框架接口 /// 分为驱动接口篇、设备接口篇 /// 驱动接口为标准驱动接口,所有驱动均有相同接口,各自实现 /// 设备接口分为若干章节 /// 包括基本篇,所有设备均有的接口 /// 设备模型篇,不同的设备类型,有不同的接口 /// ////////////////////////////////////////////////////////////////// //#define SYSTEM_CALL #define SYSTEM_CALL #define DEVICE_HANDLE void* #pragma warning(disable : 4190) //C接口形式导出的函数使用了C++的string //typedef void(* SystemLogCallback)(DEVICE_HANDLE,int, string, string, string); //产生系统日志的通知回调函数 //typedef void(* NotifyCallBack)(DEVICE_HANDLE, int, string, string); //普通通知回调函数 //typedef void(* RawDataNotifyCallBack)(DEVICE_HANDLE, int, string, string, string, char*, int); //原始数据的回调函数 //typedef void(* NotifyCallBackSetBlockSize)(DEVICE_HANDLE, string, unsigned int, unsigned int, unsigned int, unsigned int); //设置回调块大小回调函数 typedef void(* VoidCall)(void); typedef bool(* BoolCall)(void); typedef bool(* BoolCallString)(std::string); typedef std::string(* StringCall)(void); typedef int(* IntCall)(void); typedef void* (* VoindPointerCallInt)(int); typedef bool(* BoolCallStringRef)(std::string&); typedef int(* StdGetCall)(const std::string, std::string&); typedef int(* TmplGetCall)(std::string&); typedef std::string(* GetDevCall)(void*); typedef void(* VoidDevCall)(void*); typedef void(* VoidDevMqttCall)(void*, std::vector& ); typedef bool(* BoolDevCall)(void*); //typedef void(* DevSetSystemLogCallback)(DEVICE_HANDLE, SystemLogCallback); //typedef void(* DevSetNotifyCallBack)(DEVICE_HANDLE, NotifyCallBack); //typedef void(* DevSetRawDataNotifyCallBack)(DEVICE_HANDLE, RawDataNotifyCallBack); //typedef void(* DevSetBlockSizeNotifyCallBack)(DEVICE_HANDLE, NotifyCallBackSetBlockSize); typedef int(* DevAddCall)(void*, const std::string, std::string, std::string&); typedef int(* DevDeleteCall)(void*, const std::string, std::string, std::string&); typedef int(* DevUpdateCall)(void*, const std::string, std::string, std::string&); typedef int(* DevActionCall)(void*, const std::string, std::string, std::string&); typedef int(* DevGetCall)(void*, const std::string, std::string&); typedef int(* DevSetCall)(void*, const std::string, std::string); typedef int(* DevPathAddCall)(std::string, const std::string, std::string, std::string&); typedef int(* DevPathDeleteCall)(std::string, const std::string, std::string, std::string&); typedef int(* DevPathUpdateCall)(std::string, const std::string, std::string, std::string&); typedef int(* DevPathActionCall)(std::string, const std::string, std::string, std::string&); typedef int(* DevPathGetCall)(std::string, const std::string, std::string&); typedef int(* DevPathSetCall)(std::string, const std::string, std::string); typedef int(* DevAddTmplCall)(void*, std::string, std::string&); typedef int(* DevDeleteTmplCall)(void*, std::string, std::string&); typedef int(* DevUpdateTmplCall)(void*, std::string, std::string&); typedef int(* DevActionTmplCall)(void*, std::string, std::string&); typedef int(* DevGetTmplCall)(void*, std::string&); typedef int(* DevSetTmplCall)(void*, std::string); typedef int(* DevPathAddTmplCall)(std::string, std::string, std::string&); typedef int(* DevPathDeleteTmplCall)(std::string, std::string, std::string&); typedef int(* DevPathUpdateTmplCall)(std::string, std::string, std::string&); typedef int(* DevPathActionTmplCall)(std::string, std::string, std::string&);//设备路径为第一个参数,操作在函数名称中 typedef int(* DevPathGetTmplCall)(std::string, std::string&); typedef int(* DevPathSetTmplCall)(std::string, std::string); typedef int(* DevTemplPathActionTmplCall)(std::string, std::string&); //操作在函数名中,设备路径也在函数名中 typedef int(* DevTemplPathGetTmplCall)(std::string&);//属性在函数名中,设备路径也在函数名中 typedef int(* DevTemplPathSetTmplCall)(std::string);//属性在函数名中,设备路径也在函数名中 typedef std::map DrvTemplGetCallMap; typedef struct __CCOS_DRIVER_OBJ{ VoidCall DRV_Prepare; BoolCallString DRV_DriverEntry; StringCall DRV_DriverProbe; StringCall DRV_GetGUID; StringCall DRV_GetResource; StringCall DRV_DeviceProbe; BoolCall DRV_OnHeartBeat; BoolCall DRV_ReLoadConfig; //重新加载配置 //IntCall DRV_Connect; //VoidCall DRV_Disconnect; VoindPointerCallInt DRV_CreateDevice; VoidDevCall DRV_FreeDevice; BoolCallString DRV_GetDeviceConfig; BoolCallStringRef DRV_SetDeviceConfig; StdGetCall DRV_Get; StdGetCall DRV_Set; TmplGetCall DRV_Get_XXX; TmplGetCall DRV_Set_XXX; //设置类,返回设置结果 DrvTemplGetCallMap GetCallTmplMap; //属性名与函数指针映射表 DrvTemplGetCallMap SetCallTmplMap; //属性名与函数指针映射表 } CCOS_DRIVER_OBJ; ////////////////////////////////////////////////////////////////// /// /// 驱动接口,必须实现 /// ////////////////////////////////////////////////////////////////// CCOS_DRIVER_C_API void DRV_Prepare(); CCOS_DRIVER_C_API bool DRV_DriverEntry(std::string CfgFileName); CCOS_DRIVER_C_API std::string DRV_DriverProbe(); //返回驱动静态资源,如厂商/序列号/等不会变化的常量信息,包括不限于字典等 CCOS_DRIVER_C_API std::string DRV_GetGUID(); //为了保持的一定的兼容性,GUID保留,每个公开的值 参考相关文档 CCOS_DRIVER_C_API std::string DRV_GetResource(); //返回驱动资源,包括各种可能变更的属性、方法等等 CCOS_DRIVER_C_API std::string DRV_DeviceProbe(); //返回该驱动下所有设备的静态资源,如序列号、字典等信息 CCOS_DRIVER_C_API bool DRV_OnHeartBeat(); CCOS_DRIVER_C_API bool DRV_ReLoadConfig(); //CCOS_DRIVER_C_API int DRV_Connect(); //CCOS_DRIVER_C_API void DRV_Disconnect(); //CCOS_DRIVER_C_API bool DRV_isConnected(); CCOS_DRIVER_C_API DEVICE_HANDLE DRV_CreateDevice(int index); CCOS_DRIVER_C_API void DRV_FreeDevice(DEVICE_HANDLE); CCOS_DRIVER_C_API bool DRV_GetDeviceConfig(std::string& Cfg); CCOS_DRIVER_C_API bool DRV_SetDeviceConfig(std::string Cfg); CCOS_DRIVER_C_API int DRV_Get(const std::string attrName, std::string& Out); CCOS_DRIVER_C_API int DRV_Set(const std::string attrName, std::string& Out); /// XXX 为属性名,可以定义任意多个,每次取一个属性值,等同 DRV_GET(XXX,Out) CCOS_DRIVER_C_API int DRV_Get_XXX(std::string& Out); /// XXX 为属性名,可以定义任意多个,每次取一个属性值,等同 DRV_GET(XXX,Out) CCOS_DRIVER_C_API int DRV_Set_XXX(std::string& InOut); ////////////////////////////////////////////////////////////////// /// /// 通用设备接口 Part1,必须实现 /// ////////////////////////////////////////////////////////////////// typedef std::map DevActionCallMap; //设备对象 Action映射: Action名称->Action函数指针(设备对象) typedef std::map DevGetCallMap; //设备对象 Get属性映射 typedef std::map DevSetCallMap; //设备对象 Set属性映射 typedef std::map DevPathActionCallMap; //设备路径 Action映射:Action名称->Action函数指针(设备路径) typedef std::map DevPathGetCallMap; //设备路径 Get属性映射 typedef std::map DevPathSetCallMap; //设备路径 Set属性映射 typedef std::map DevTmplPathActionCallMap;//逻辑设备路径-> 逻辑设备Action映射表 typedef std::map DevTemplPathGetCallMap; typedef std::map DevTemplPathSetCallMap; typedef struct __CCOS_DEVICE_OBJ { GetDevCall DEV_GetGUID; GetDevCall DEV_GetResource; VoidDevCall DEV_CompleteInit; BoolDevCall DEV_Prepare; VoidDevCall DEV_CompleteUnInit; VoidDevMqttCall DEV_SubscribeSelf; DevAddCall DEV_Add; DevDeleteCall Dev_Delete; DevUpdateCall Dev_Update; DevActionCall Dev_Action; DevGetCall Dev_Get; DevSetCall Dev_Set; DevPathAddCall DevPath_Add; DevPathDeleteCall DevPath_Delete; DevPathUpdateCall DevPath_Update; DevPathActionCall DevPath_Action; DevPathGetCall DevPath_Get; DevPathSetCall DevPath_Set; DevActionCallMap DevAddTmplMap; DevActionCallMap DevDeleteTmplMap; DevActionCallMap DevUpdateTmplMap; DevActionCallMap DevActionTmplMap; DevGetCallMap DevGetTmplMap; DevSetCallMap DevSetTmplMap; //所有路径访问模板方法映射 DevPathActionCallMap DevPathAddTmplMap; //路径设备 Add方法映射,key: XXX,设备路径为输入参数 DevPathActionCallMap DevPathDeleteTmplMap; //路径设备 Delete方法映射,key: XXX,设备路径为输入参数 DevPathActionCallMap DevPathUpdateTmplMap;//路径设备 Update方法映射,key: XXX,设备路径为输入参数 DevPathActionCallMap DevPathActionTmplMap;//路径设备 Action方法映射,key: XXX,设备路径为输入参数 DevPathGetCallMap DevPathGetTmplMap;//路径设备 Get方法映射,key: XXX,设备路径为输入参数 DevPathSetCallMap DevPathSetTmplMap;//路径设备 Set方法映射,key: XXX,设备路径为输入参数 DevTmplPathActionCallMap LogicDevAddTmpMap; //逻辑设备Add方法映射,key: XXX_/XXX_Devpath DevTmplPathActionCallMap LogicDevDeleteTmpMap;//逻辑设备Delete方法映射,key: XXX_/XXX_Devpath DevTmplPathActionCallMap LogicDevUpdateTmpMap;//逻辑设备Update方法映射,key: XXX_/XXX_Devpath DevTmplPathActionCallMap LogicDevActionTmpMap;//逻辑设备Action方法映射,key: XXX_/XXX_Devpath DevTemplPathGetCallMap LogicDevGetTmpMap;//逻辑设备Get方法映射,key: XXX_/XXX_Devpath DevTemplPathSetCallMap LogicDevSetTmpMap;//逻辑设备Set方法映射,key: XXX_/XXX_Devpath }CCOS_DEVICE_OBJ; CCOS_DRIVER_C_API std::string DEV_GetGUID(DEVICE_HANDLE hDev) ; CCOS_DRIVER_C_API std::string DEV_GetPath(DEVICE_HANDLE hDev); CCOS_DRIVER_C_API std::string DEV_GetResource(DEVICE_HANDLE hDev) ; //这里定义了该设备的模型资源,含属性、方法 CCOS_DRIVER_C_API void DEV_CompleteInit(DEVICE_HANDLE hDev) ; CCOS_DRIVER_C_API bool DEV_Prepare(DEVICE_HANDLE hDev); CCOS_DRIVER_C_API void DEV_CompleteUnInit(DEVICE_HANDLE hDev) ; CCOS_DRIVER_C_API void DEV_GetSubscribeTopicList(DEVICE_HANDLE hDev, std::vector &TopicList) ; ////////////////////////////////////////////////////////////////// /// /// 通用设备接口 Part2,通用模型化原始接口实现,ADD/DELETE/UPDATE/ACTION/GET/SET /// 参考 HTTP RESTFULL, /// 驱动可以直接实现此接口,无需额外创建接口,适用任意设备 /// DEVPath 为设备路径访问接口,直接访问对应设备路径的方法 /// 各驱动可以根据自己特点,实现一套或者2套,不实现的方法需要返回-2 ////////////////////////////////////////////////////////////////// CCOS_DRIVER_C_API int DEV_Add(DEVICE_HANDLE hDev, const std::string funcName, std::string In, std::string& Out); CCOS_DRIVER_C_API int DEV_Delete(DEVICE_HANDLE hDev, const std::string funcName, std::string In, std::string& Out); CCOS_DRIVER_C_API int DEV_Update(DEVICE_HANDLE hDev, const std::string funcName, std::string In, std::string& Out); CCOS_DRIVER_C_API int DEV_Action(DEVICE_HANDLE hDev, const std::string funcName, std::string In, std::string& Out); CCOS_DRIVER_C_API int DEV_Get(DEVICE_HANDLE hDev, const std::string funcName, std::string& Out); CCOS_DRIVER_C_API int DEV_Set(DEVICE_HANDLE hDev, const std::string funcName, std::string In); CCOS_DRIVER_C_API int DEVPath_Add(const std::string devPath, const std::string funcName, std::string In, std::string& Out); CCOS_DRIVER_C_API int DEVPath_Delete(const std::string devPath, const std::string funcName, std::string In, std::string& Out); CCOS_DRIVER_C_API int DEVPath_Update(const std::string devPath, const std::string funcName, std::string In, std::string& Out); CCOS_DRIVER_C_API int DEVPath_Action(const std::string devPath, const std::string funcName, std::string In, std::string& Out); CCOS_DRIVER_C_API int DEVPath_Get(const std::string devPath, const std::string funcName, std::string& Out); CCOS_DRIVER_C_API int DEVPath_Set(const std::string devPath, const std::string funcName, std::string In); ////////////////////////////////////////////////////////////////// /// /// 设备模型接口 Part3,各中设备的标准方法 /// XXX为属性名或者方法名,用于区分行为的Key /// 各驱动可以根据自己特点,定义标准方法集合 ////////////////////////////////////////////////////////////////// //实现者需要为每一个创建的设备对象定义模型实现,入口参数为设备时创建的对象句柄,需要自行区分对象与方法的对应 CCOS_DRIVER_C_API int DEV_Add_XXX(DEVICE_HANDLE hDev, std::string In, std::string& Out); CCOS_DRIVER_C_API int DEV_Delete_XXX(DEVICE_HANDLE hDev, std::string In, std::string& Out); CCOS_DRIVER_C_API int DEV_Update_XXX(DEVICE_HANDLE hDev, std::string In, std::string& Out); CCOS_DRIVER_C_API int DEV_Action_XXX(DEVICE_HANDLE hDev, std::string In, std::string& Out); CCOS_DRIVER_C_API int DEV_Get_XXX(DEVICE_HANDLE hDev, std::string& Out); CCOS_DRIVER_C_API int DEV_Set_XXX(DEVICE_HANDLE hDev, std::string In); //实现者需要为每一个逻辑对象的设备路径 定义模型实现,需要自行根据设备路径和 方法进行区分 CCOS_DRIVER_C_API int DEVPath_Add_XXX(const std::string devPath, std::string In, std::string& Out); CCOS_DRIVER_C_API int DEVPath_Delete_XXX(const std::string devPath, std::string In, std::string& Out); CCOS_DRIVER_C_API int DEVPath_Update_XXX(const std::string devPath, std::string In, std::string& Out); CCOS_DRIVER_C_API int DEVPath_Action_XXX(const std::string devPath, std::string In, std::string& Out); CCOS_DRIVER_C_API int DEVPath_Get_XXX(const std::string devPath, std::string& Out); CCOS_DRIVER_C_API int DEVPath_Set_XXX(const std::string devPath, std::string In); //设备树的模型实现 //根设备的模型方法一套 CCOS_DRIVER_C_API int DEVPath_Add_XXX_(std::string In, std::string& Out); CCOS_DRIVER_C_API int DEVPath_Delete_XXX_(std::string In, std::string& Out); CCOS_DRIVER_C_API int DEVPath_Update_XXX_(std::string In, std::string& Out); CCOS_DRIVER_C_API int DEVPath_Action_XXX_(std::string In, std::string& Out); CCOS_DRIVER_C_API int DEVPath_Get_XXX_(std::string& Out); CCOS_DRIVER_C_API int DEVPath_Set_XXX_(std::string In); //每一个逻辑设备路径一套,如下 /Dev01/SubDev的 CCOS_DRIVER_C_API int DEVPath_Add_XXX_Dev01_SubDev(std::string In, std::string& Out); CCOS_DRIVER_C_API int DEVPath_Delete_XXX_Dev01_SubDev(std::string In, std::string& Out); CCOS_DRIVER_C_API int DEVPath_Update_XXX_Dev01_SubDev(std::string In, std::string& Out); CCOS_DRIVER_C_API int DEVPath_Action_XXX_Dev01_SubDev(std::string In, std::string& Out); CCOS_DRIVER_C_API int DEVPath_Get_XXX_Dev01_SubDev(std::string& Out); CCOS_DRIVER_C_API int DEVPath_Set_XXX_Dev01_SubDev(std::string In); #endif