#include #include //#include "scf.h" #include "CDI.h" #include "LocalConfig.h" #include "BusUnitClient.h" #include "LogicClient.h" #include "common_api.h" #include "PacketAnalizer.h" #include "AutoDmp.h" #define CRTDBG_MAP_ALLOC #include #include #include #include #include "DeviceManager.h" const int maxDeviceNum = 30; int totalDeviceNum = 0; LogicDevice* g_AllDevice[maxDeviceNum]; using namespace std; AutoDmp atdmp; LDM_API const char* add_driver(char* driverName) { if (AddDriverConfig(driverName) == false) { printf("DriverConfig File not Right.%s \nexit in 3sec\n", driverName); sleep(3); return 0; } return GetMajorID().c_str(); } const char* pszAllDevice = ""; /// /// //返回以;分割的可以Open的设备URI列表 /// /// 本驱动实际监听的RPC端口号 /// 本驱动实际监听的HTTP端口号 /// 以;分割的可以Open的设备URI列表字符串 LDM_API const char* get_all_device(int rpcPort, int httpPort) { if (totalDeviceNum <= 0) { if (GetCommandDispathIF()->InitAs(CCOS_PROC_MASTER, (UINT64)getpid())) { //启动成功,返回设备树 return (pszAllDevice = GetCommandDispathIF()->GetAllDevice((void**)(&g_AllDevice[0]), totalDeviceNum)); } else { cout << "Call from GRPC " << "get_all_device init failed." << endl; return ""; } } else { return (pszAllDevice = GetCommandDispathIF()->GetAllDevice((void**)(&g_AllDevice[0]), totalDeviceNum)); } return ""; } void* CreateCgoStruct(std::vector& argList) { int nLen = sizeof(void*) * argList.size(); for (int x = 0; x < argList.size(); x++) { nLen += argList[x].length(); nLen += 1; } void* ret = malloc(nLen); char* pString = ((char*)ret) + argList.size() * sizeof(void*); for (int x = 0; x < argList.size(); x++) { string msg = argList[x]; ((char**)ret)[x] = pString; memcpy(pString, msg.c_str(), msg.length() + 1); pString += (msg.length() + 1); } return ret; } /// /// 打开设备 /// /// /// /// /// /// LDM_API int open_device(int devIdx, char* devUri, char* devGroup, void** reply) { if (devIdx >= totalDeviceNum) { if (devUri != nullptr && devUri[0] == 0) { string msg = "Enum All Device ok."; string context = pszAllDevice ; std::vector allDev; SplitDeviceList(pszAllDevice, allDev); ResDataObject rescontext,resList; rescontext.add("Driver", resList); rescontext.add("Device", resList); rescontext.add("Host", resList); for (int x = 0; x < allDev.size(); x++) { //CCOS/DRIVER //CCOS/HOST/ //CCOS/DEVICE if (allDev[x].substr(0, 11) == "CCOS/DRIVER") { rescontext["Driver"].update(allDev[x].c_str(), ""); } else if (allDev[x].substr(0, 11) == "CCOS/DEVICE") { rescontext["Device"].update(allDev[x].c_str(), ""); } else if (allDev[x].substr(0, 9) == "CCOS/HOST") { rescontext["Host"].update(allDev[x].c_str(), ""); } } context = rescontext.encode(); std::vector params; params.push_back(msg); params.push_back(context); *reply = CreateCgoStruct(params); return RET_SUCCEED; } *reply = nullptr; return 0; } LogicDevice* pDev = nullptr; int nScanStart, nScanEnd; if (devIdx >= 0) { pDev = g_AllDevice[devIdx]; if (pDev == nullptr) { *reply = nullptr; return 0; } nScanStart = nScanEnd = devIdx; } else { nScanStart = 0; nScanEnd = totalDeviceNum - 1; } string devUriString = devUri; for (; nScanStart <= nScanEnd; nScanStart++) { if (devUriString == g_AllDevice[nScanStart]->GetCcosAbstractPath() || devUriString == g_AllDevice[nScanStart]->GetCcosRootPath()) { pDev = g_AllDevice[nScanStart]; break; } } if (pDev != nullptr) { //设备路径校验ok ResDataObject resResource; RET_STATUS ret = pDev->DevOpen(devUri, devGroup, resResource); std::vector params; string msg = "Open ok."; string context = resResource.size() > 0 ? resResource.encode() : (const char*)resResource; params.push_back(msg); params.push_back(context); *reply = CreateCgoStruct(params); return RET_SUCCEED; } cout << "Call from GRPC " << "open_device" << endl; return 0; } /// /// 关闭设备 /// /// /// /// /// /// LDM_API int close_device(int devIdx, char* devUri, char* devGroup, void** reply) { if (devIdx >= totalDeviceNum) { *reply = nullptr; return 0; } LogicDevice* pDev = nullptr; int nScanStart, nScanEnd; if (devIdx >= 0) { pDev = g_AllDevice[devIdx]; if (pDev == nullptr) { *reply = nullptr; return 0; } nScanStart = nScanEnd = devIdx; } else { nScanStart = 0; nScanEnd = totalDeviceNum - 1; } string devUriString = devUri; for (; nScanStart <= nScanEnd; nScanStart++) { if (devUriString == g_AllDevice[nScanStart]->GetCcosAbstractPath() || devUriString == g_AllDevice[nScanStart]->GetCcosRootPath()) { pDev = g_AllDevice[nScanStart]; break; } } if (pDev != nullptr) { //设备路径校验ok ResDataObject resResource; RET_STATUS ret = pDev->DevClose(devUri, devGroup, resResource); std::vector params; string msg = "Close ok."; string context = resResource.size() > 0 ? resResource.encode() : (const char*)resResource; params.push_back(msg); params.push_back(context); *reply = CreateCgoStruct(params); return RET_SUCCEED; } cout << "Call from GRPC " << "close_device" << endl; return 0; } /// /// 获取设备属性 /// /// /// /// /// /// LDM_API int device_get(int devIdx, char* devUri, char* devProperty, void** reply) { if (devIdx >= totalDeviceNum) { *reply = nullptr; return 0; } LogicDevice* pDev = nullptr; int nScanStart, nScanEnd; if (devIdx >= 0) { pDev = g_AllDevice[devIdx]; if (pDev == nullptr) { *reply = nullptr; return 0; } nScanStart = nScanEnd = devIdx; } else { nScanStart = 0; nScanEnd = totalDeviceNum - 1; } string devUriString = devUri; for (; nScanStart <= nScanEnd; nScanStart++) { if (devUriString == g_AllDevice[nScanStart]->GetCcosAbstractPath() || devUriString == g_AllDevice[nScanStart]->GetCcosRootPath()) { pDev = g_AllDevice[nScanStart]; break; } } if (pDev != nullptr) { //设备路径校验ok ResDataObject resResource; RET_STATUS ret = pDev->DevGet(devUri, devProperty, resResource); std::vector params; string msg = "Get ok."; string context = resResource.size() > 0? resResource.encode(): (const char*)resResource; params.push_back(devProperty); params.push_back(msg); params.push_back(context); *reply = CreateCgoStruct(params); return ret; } cout << "Call from GRPC " << "device get" << endl; return 0; } /// /// 设置设备属性 /// /// /// /// /// /// /// LDM_API int device_set(int devIdx, char* devUri, char* devProperty, char* devValueSet, void** reply) { if (devIdx >= totalDeviceNum) { *reply = nullptr; return 0; } LogicDevice* pDev = nullptr; int nScanStart, nScanEnd; if (devIdx >= 0) { pDev = g_AllDevice[devIdx]; if (pDev == nullptr) { *reply = nullptr; return 0; } nScanStart = nScanEnd = devIdx; } else { nScanStart = 0; nScanEnd = totalDeviceNum - 1; } string devUriString = devUri; for (; nScanStart <= nScanEnd; nScanStart++) { if (devUriString == g_AllDevice[nScanStart]->GetCcosAbstractPath() || devUriString == g_AllDevice[nScanStart]->GetCcosRootPath()) { pDev = g_AllDevice[nScanStart]; break; } } if (pDev != nullptr) { //设备路径校验ok ResDataObject resResource; RET_STATUS ret = pDev->DevSet(devUri, devProperty, devValueSet, resResource); std::vector params; string msg = "Set ok."; string context = resResource.size() > 0 ? resResource.encode() : (const char*)resResource; params.push_back(devProperty); params.push_back(msg); params.push_back(context); *reply = CreateCgoStruct(params); return ret; } return 0; } /// /// 更新设备属性,设备额外做工作,并返回执行结果 /// /// /// /// /// /// /// LDM_API int device_update(int devIdx, char* devUri, char* devProperty, char* devValueUpdate, void** reply) { if (devIdx >= totalDeviceNum) { *reply = nullptr; return 0; } LogicDevice* pDev = nullptr; int nScanStart, nScanEnd; if (devIdx >= 0) { pDev = g_AllDevice[devIdx]; if (pDev == nullptr) { *reply = nullptr; return 0; } nScanStart = nScanEnd = devIdx; } else { nScanStart = 0; nScanEnd = totalDeviceNum - 1; } string devUriString = devUri; for (; nScanStart <= nScanEnd; nScanStart++) { if (devUriString == g_AllDevice[nScanStart]->GetCcosAbstractPath() || devUriString == g_AllDevice[nScanStart]->GetCcosRootPath()) { pDev = g_AllDevice[nScanStart]; break; } } if (pDev != nullptr) { //设备路径校验ok ResDataObject resResource; RET_STATUS ret = pDev->DevUpdate(devUri, devProperty, devValueUpdate, resResource); std::vector params; string msg = "Update ok."; string context = resResource.size() > 0 ? resResource.encode() : (const char*)resResource; params.push_back(devProperty); params.push_back(msg); params.push_back(context); *reply = CreateCgoStruct(params); return ret; } return 0; } /// /// 设备属性添加 /// /// /// /// /// /// /// LDM_API int device_add(int devIdx, char* devUri, char* devProperty, char* devValueAdd, void** reply) { if (devIdx >= totalDeviceNum) { *reply = nullptr; return 0; } LogicDevice* pDev = nullptr; int nScanStart, nScanEnd; if (devIdx >= 0) { pDev = g_AllDevice[devIdx]; if (pDev == nullptr) { *reply = nullptr; return 0; } nScanStart = nScanEnd = devIdx; } else { nScanStart = 0; nScanEnd = totalDeviceNum - 1; } string devUriString = devUri; for (; nScanStart <= nScanEnd; nScanStart++) { if (devUriString == g_AllDevice[nScanStart]->GetCcosAbstractPath() || devUriString == g_AllDevice[nScanStart]->GetCcosRootPath()) { pDev = g_AllDevice[nScanStart]; break; } } if (pDev != nullptr) { //设备路径校验ok ResDataObject resResource; RET_STATUS ret = pDev->DevAdd(devUri, devProperty, devValueAdd , resResource); std::vector params; string msg = "Add ok."; string context = resResource.size() > 0 ? resResource.encode() : (const char*)resResource; params.push_back(devProperty); params.push_back(msg); params.push_back(context); *reply = CreateCgoStruct(params); return ret; } return 0; } /// /// 设备属性移除 /// /// /// /// /// /// /// LDM_API int device_del(int devIdx, char* devUri, char* devProperty, char* devValueDel, void** reply) { if (devIdx >= totalDeviceNum) { *reply = nullptr; return 0; } LogicDevice* pDev = nullptr; int nScanStart, nScanEnd; if (devIdx >= 0) { pDev = g_AllDevice[devIdx]; if (pDev == nullptr) { *reply = nullptr; return 0; } nScanStart = nScanEnd = devIdx; } else { nScanStart = 0; nScanEnd = totalDeviceNum - 1; } string devUriString = devUri; for (; nScanStart <= nScanEnd; nScanStart++) { if (devUriString == g_AllDevice[nScanStart]->GetCcosAbstractPath() || devUriString == g_AllDevice[nScanStart]->GetCcosRootPath()) { pDev = g_AllDevice[nScanStart]; break; } } if (pDev != nullptr) { //设备路径校验ok ResDataObject resResource; RET_STATUS ret = pDev->DevDel(devUri, devProperty, devValueDel , resResource); std::vector params; string msg = "Del ok."; string context = resResource.size() > 0 ? resResource.encode() : (const char*)resResource; params.push_back(devProperty); params.push_back(msg); params.push_back(context); *reply = CreateCgoStruct(params); return ret; } return 0; } /// /// 设备执行Action /// /// /// /// /// /// /// LDM_API int device_action(int devIdx, char* devUri, char* devFunction, char* devReqParams, void** reply) { if (devIdx >= totalDeviceNum) { *reply = nullptr; return 0; } LogicDevice* pDev = nullptr; int nScanStart, nScanEnd; if (devIdx >= 0) { pDev = g_AllDevice[devIdx]; if (pDev == nullptr) { *reply = nullptr; return 0; } nScanStart = nScanEnd = devIdx; } else { nScanStart = 0; nScanEnd = totalDeviceNum - 1; } string devUriString = devUri; string absPath, rootPath; for (; nScanStart <= nScanEnd; nScanStart++) { absPath = g_AllDevice[nScanStart]->GetCcosAbstractPath(); rootPath = g_AllDevice[nScanStart]->GetCcosRootPath(); if (devUriString == absPath || devUriString == rootPath) { pDev = g_AllDevice[nScanStart]; break; } if (absPath.find(devUriString) == 0 || rootPath.find(devUriString) == 0) { pDev = g_AllDevice[nScanStart]; break; } } if (pDev != nullptr) { //设备路径校验ok ResDataObject resResource; RET_STATUS ret = pDev->DevAction(devUri, devFunction, devReqParams , resResource); std::vector params; string msg = "Action ok."; string context = resResource.size() > 0 ? resResource.encode() : (const char*)resResource; params.push_back(devFunction); params.push_back(msg); params.push_back(context); *reply = CreateCgoStruct(params); return ret; } return 0; } /// /// 给设备发送消息,用于消息交换 /// /// /// /// /// /// /// LDM_API int device_message(int devIdx, char* devUri, char* devTopic, char* devMessageValue, void** reply) { if (devIdx >= totalDeviceNum) { *reply = nullptr; return 0; } LogicDevice* pDev = nullptr; int nScanStart, nScanEnd; if (devIdx >= 0) { pDev = g_AllDevice[devIdx]; if (pDev == nullptr) { *reply = nullptr; return 0; } nScanStart = nScanEnd = devIdx; } else { nScanStart = 0; nScanEnd = totalDeviceNum - 1; } string devUriString = devUri; for (; nScanStart <= nScanEnd; nScanStart++) { if (devUriString == g_AllDevice[nScanStart]->GetCcosAbstractPath() || devUriString == g_AllDevice[nScanStart]->GetCcosRootPath()) { pDev = g_AllDevice[nScanStart]; break; } } if (pDev != nullptr) { //设备路径校验ok ResDataObject resResource; RET_STATUS ret = pDev->DevMessage(devUri, devTopic, devMessageValue, resResource); std::vector params; string msg = "Set ok."; string context = resResource.size() > 0 ? resResource.encode() : (const char*)resResource; params.push_back(devTopic); params.push_back(msg); params.push_back(context); *reply = CreateCgoStruct(params); return ret; } return 0; } //LDM_API int device_get() { // cout << "Call from GRPC " << "device_get" << endl; // // return 0; //} // //LDM_API int device_update() { // cout << "Call from GRPC " << "device_update" << endl; // return 0; //} // //LDM_API int device_add() { // cout << "Call from GRPC " << "device_add" << endl; // return 0; //} // //LDM_API int device_del() { // cout << "Call from GRPC " << "device_del" << endl; // return 0; //} // //LDM_API int device_action() { // cout << "Call from GRPC " << "device_action" << endl; // return 0; //} // //LDM_API int device_message() { // cout << "Call from GRPC " << "device_message" << endl; // return 0; //} /// /// 释放结构体内的每一个char* /// /// /// /// LDM_API int free_struct(void* pPoirnt, int nItemCount) { if(pPoirnt != nullptr) free(pPoirnt); return RET_SUCCEED; }