DIOS.Dev.DME.NormalDME.cpp 19 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728
  1. // DIOS.Dev.DME.NormalDME.cpp : 定义 DLL 应用程序的导出函数。
  2. //
  3. #include "stdafx.h"
  4. #include <assert.h>
  5. #include <functional>
  6. #include "common_api.h"
  7. using namespace std::placeholders;
  8. #include "DIOS.Dev.DME.NormalDME.h"
  9. #include "Helper.JSON.hpp"
  10. using namespace DIOS::Dev::Detail::DME;
  11. namespace nsDME = DIOS::Dev::Detail::DME;
  12. #pragma warning (disable:4244) // warning C4244: “初始化”: 从“double”转换到“float”,可能丢失数据
  13. #pragma warning (disable:4305) // warning C4305: “参数”: 从“double”到“float”截断
  14. #pragma warning (disable:4267) // warning C4267 : “初始化”: 从“size_t”转换到“int”,可能丢失数据
  15. static const int msTimeOut_Lock = 500;
  16. #ifdef _WIN64
  17. #ifdef _DEBUG
  18. static const auto COM_SCFDllName = "Dios.Dev.SerialSCFX64D.dll";
  19. #else
  20. static const auto COM_SCFDllName = "Dios.Dev.SerialSCFX64.dll";
  21. #endif
  22. #endif
  23. #ifdef _WIN64
  24. #ifdef _DEBUG
  25. static const auto TCP_SCFDllName = "Dios.Dev.TcpipSCFX64D.dll";
  26. #else
  27. static const auto TCP_SCFDllName = "Dios.Dev.TcpipSCFX64.dll";
  28. #endif
  29. #endif
  30. //-----------------------------------------------------------------------------
  31. // DMEDevice
  32. //-----------------------------------------------------------------------------
  33. nsDME::DMENormalDMEDevice::DMENormalDMEDevice(std::shared_ptr <IOEventCenter> center, nsSCF::SCF SCF, string configfile) : super(center, SCF)
  34. {
  35. assert(EventCenter);
  36. ResDataObject temp;
  37. temp.loadFile(configfile.c_str());
  38. m_DMEConfig = temp["CONFIGURATION"];
  39. TransJsonText(m_DMEConfig);
  40. if (m_DMEConfig.GetKeyCount("CalibrateValue") > 0)
  41. {
  42. m_nCalibrateValue = (int)m_DMEConfig["CalibrateValue"];
  43. }
  44. else
  45. {
  46. m_nCalibrateValue = 0;
  47. }
  48. if (m_DMEConfig.GetKeyCount("MeasurementInterval") > 0)
  49. {
  50. m_nMeasurementInterval = (int)m_DMEConfig["MeasurementInterval"];
  51. }
  52. else
  53. {
  54. m_nMeasurementInterval = 1;
  55. }
  56. if (m_DMEConfig.GetKeyCount("Position") > 0)
  57. {
  58. m_nPosition = (int)m_DMEConfig["Position"];
  59. }
  60. else
  61. {
  62. m_nPosition = 0;
  63. }
  64. if (m_DMEConfig.GetKeyCount("Range") > 0)
  65. {
  66. m_nRange = (int)m_DMEConfig["Range"];//Range : 05,10,30,50,80m
  67. }
  68. else
  69. {
  70. m_nRange = 5;
  71. }
  72. if (m_DMEConfig.GetKeyCount("Frequency") > 0)
  73. {
  74. m_nFrequency = (int)m_DMEConfig["Frequency"];//Freq : 05 10 20
  75. }
  76. else
  77. {
  78. m_nFrequency = 5;
  79. }
  80. if (m_DMEConfig.GetKeyCount("Resolution") > 0)
  81. {
  82. m_nResolution = (int)m_DMEConfig["Resolution"];//1(1mm),2(0.1mm)
  83. }
  84. else
  85. {
  86. m_nResolution = 1;
  87. }
  88. if (m_DMEConfig.GetKeyCount("MeasureSID") > 0)
  89. {
  90. m_nMeasureSID = (int)m_DMEConfig["MeasureSID"];
  91. }
  92. else
  93. {
  94. m_nMeasureSID = 180;
  95. }
  96. if (m_DMEConfig.GetKeyCount("MeasureAngle") > 0)
  97. {
  98. m_nMeasureAngle = (int)m_DMEConfig["MeasureAngle"];
  99. }
  100. else
  101. {
  102. m_nMeasureAngle = 0;
  103. }
  104. m_DMEUnit.m_Distance.reset(new DistanceMould(0.0f, 0.0f, 5000.0f, 0.1));
  105. m_DMEUnit.m_LaserState.reset(new LaserStateMould(0, 0, 1, 1));
  106. m_DMEUnit.m_ConnectionStatus.reset(new ConnectionStatusMould(0, 0, 1, 1));
  107. m_MSGUnit.reset(new nsDetail::MSGUnit(center, nsDME::DMEUnitType));
  108. Register();
  109. }
  110. nsDME::DMENormalDMEDevice::~DMENormalDMEDevice()
  111. {
  112. }
  113. std::string nsDME::DMENormalDMEDevice::GetGUID() const
  114. {
  115. mLog::FINFO("\n===============GetGUID : {$} ===================\n", DMEUnitType);
  116. return DMEUnitType;
  117. }
  118. RET_STATUS nsDME::DMENormalDMEDevice::FetchDistance()
  119. {
  120. char szCmdBuf[4];
  121. szCmdBuf[0] = 0x80;
  122. szCmdBuf[1] = 0x06;
  123. szCmdBuf[2] = 0x02;
  124. szCmdBuf[3] = 0x78;
  125. mLog::FINFO("Fetching distance with command: {$}", std::string(szCmdBuf, 4).c_str()); // Log the command buffer
  126. return HWSend(szCmdBuf, 4);
  127. }
  128. RET_STATUS nsDME::DMENormalDMEDevice::SetCalibrateValue(int pParams)
  129. {
  130. char szCmdBuf[6];
  131. szCmdBuf[0] = 0xFA;
  132. szCmdBuf[1] = 0x04;
  133. szCmdBuf[2] = 0x06;
  134. if (pParams > 0)
  135. {
  136. szCmdBuf[3] = 0x2B;
  137. }
  138. else if (pParams < 0)
  139. {
  140. szCmdBuf[3] = 0x2D;
  141. }
  142. else
  143. {
  144. //=0 do nonthing..
  145. mLog::FINFO("calibrate value = 0,so directly return .");
  146. return RET_STATUS::RET_SUCCEED;
  147. }
  148. szCmdBuf[4] = pParams;
  149. char checksum = (char)(~(char)(szCmdBuf[0] + szCmdBuf[1] + szCmdBuf[2] + szCmdBuf[3] + szCmdBuf[4]) + 1);
  150. szCmdBuf[5] = checksum;
  151. mLog::FINFO("Setting calibration value: {$} with command: {$}", pParams, std::string(szCmdBuf, 6).c_str()); // Log calibration command
  152. return HWSend(szCmdBuf, 6);
  153. }
  154. RET_STATUS nsDME::DMENormalDMEDevice::SetMeasurementInterval(int pParams)
  155. {
  156. char szCmdBuf[5];
  157. szCmdBuf[0] = 0xFA;
  158. szCmdBuf[1] = 0x04;
  159. szCmdBuf[2] = 0x05;
  160. szCmdBuf[3] = pParams;
  161. char checksum = (char)(~((char)(szCmdBuf[0] + szCmdBuf[1] + szCmdBuf[2] + szCmdBuf[3])) + 1);
  162. szCmdBuf[4] = checksum;
  163. mLog::FINFO("Setting measurement interval: {$} with command: {$}", pParams, std::string(szCmdBuf, 5).c_str()); // Log interval setting
  164. return HWSend(szCmdBuf, 5);
  165. }
  166. RET_STATUS nsDME::DMENormalDMEDevice::SetStartEndPoints(int pParams)
  167. {
  168. char szCmdBuf[5];
  169. szCmdBuf[0] = 0xFA;
  170. szCmdBuf[1] = 0x04;
  171. szCmdBuf[2] = 0x08;
  172. szCmdBuf[3] = pParams;
  173. char checksum = (char)(~((char)(szCmdBuf[0] + szCmdBuf[1] + szCmdBuf[2] + szCmdBuf[3])) + 1);
  174. szCmdBuf[4] = checksum;
  175. mLog::FINFO("Setting start-end points: {$} with command: {$}", pParams, std::string(szCmdBuf, 5).c_str()); // Log points setting
  176. return HWSend(szCmdBuf, 5);
  177. }
  178. RET_STATUS nsDME::DMENormalDMEDevice::SetRange(int pParams)
  179. {
  180. char szCmdBuf[5];
  181. szCmdBuf[0] = 0xFA;
  182. szCmdBuf[1] = 0x04;
  183. szCmdBuf[2] = 0x09;
  184. szCmdBuf[3] = pParams;
  185. char checksum = (char)(~((char)(szCmdBuf[0] + szCmdBuf[1] + szCmdBuf[2] + szCmdBuf[3])) + 1);
  186. szCmdBuf[4] = checksum;
  187. mLog::FINFO("Setting range: {$} with command: {$}", pParams, std::string(szCmdBuf, 5).c_str());
  188. return HWSend(szCmdBuf, 5);
  189. }
  190. RET_STATUS nsDME::DMENormalDMEDevice::SetFrequency(int pParams)
  191. {
  192. char szCmdBuf[5];
  193. szCmdBuf[0] = 0xFA;
  194. szCmdBuf[1] = 0x04;
  195. szCmdBuf[2] = 0x0A;
  196. szCmdBuf[3] = pParams;
  197. char checksum = (char)(~((char)(szCmdBuf[0] + szCmdBuf[1] + szCmdBuf[2] + szCmdBuf[3])) + 1);
  198. szCmdBuf[4] = checksum;
  199. mLog::FINFO("Setting frequency: {$} with command: {$}", pParams, std::string(szCmdBuf, 5).c_str()); // Log frequency setting
  200. return HWSend(szCmdBuf, 5);
  201. }
  202. RET_STATUS nsDME::DMENormalDMEDevice::SetResolution(int pParams)
  203. {
  204. char szCmdBuf[5];
  205. szCmdBuf[0] = 0xFA;
  206. szCmdBuf[1] = 0x04;
  207. szCmdBuf[2] = 0x0C;
  208. szCmdBuf[3] = pParams;
  209. char checksum = (char)(~((char)(szCmdBuf[0] + szCmdBuf[1] + szCmdBuf[2] + szCmdBuf[3])) + 1);
  210. szCmdBuf[4] = checksum;
  211. mLog::FINFO("Setting resolution: {$} with command: {$}", pParams, std::string(szCmdBuf, 5).c_str()); // Log resolution setting
  212. return HWSend(szCmdBuf, 5);
  213. }
  214. RET_STATUS nsDME::DMENormalDMEDevice::SetLaserState(int pParams)
  215. {
  216. char szCmdBuf[5];
  217. szCmdBuf[0] = 0x80;
  218. szCmdBuf[1] = 0x06;
  219. szCmdBuf[2] = 0x05;
  220. szCmdBuf[3] = (char)pParams;
  221. char checksum = (char)(~(char)(szCmdBuf[0] + szCmdBuf[1] + szCmdBuf[2] + szCmdBuf[3]) + 1);
  222. szCmdBuf[4] = checksum;
  223. mLog::FINFO("Setting laser state: {$} with command: {$}", pParams, std::string(szCmdBuf, 5).c_str()); // Log laser state setting
  224. return HWSend(szCmdBuf, 5);
  225. }
  226. RET_STATUS nsDME::DMENormalDMEDevice::ShutDown()
  227. {
  228. char szCmdBuf[4];
  229. szCmdBuf[0] = 0x80;
  230. szCmdBuf[1] = 0x04;
  231. szCmdBuf[2] = 0x02;
  232. szCmdBuf[3] = 0x7A;
  233. mLog::FINFO("Shutting down device with command: {$}", std::string(szCmdBuf, 4).c_str()); // Log shutdown command
  234. return HWSend(szCmdBuf, 4);
  235. }
  236. void nsDME::DMENormalDMEDevice::Register()
  237. {
  238. auto Disp = &Dispatch;
  239. superGen::Register(Disp);
  240. Disp->Get.Push(m_MSGUnit->GetKey().c_str(), [this](std::string& out) { out = m_MSGUnit->JSGet(); return RET_STATUS::RET_SUCCEED; });
  241. }
  242. bool nsDME::DMENormalDMEDevice::isChecksumValid(const char* str, size_t len)
  243. {
  244. int sum = 0;
  245. for (size_t i = 0; i < len - 1; ++i) {
  246. sum += str[i]; // 累加每个字符的 ASCII 值
  247. }
  248. char checksum = ~(char)(sum)+1;
  249. return static_cast<char>(checksum) == str[len - 1];
  250. }
  251. void nsDME::DMENormalDMEDevice::SendNextCommand()
  252. {
  253. if (!commandQueue.empty()) {
  254. std::string command = commandQueue.front();
  255. SetCommand(command);
  256. commandQueue.pop();
  257. std::this_thread::sleep_for(std::chrono::milliseconds(50)); // 命令节流的延迟
  258. }
  259. }
  260. RET_STATUS nsDME::DMENormalDMEDevice::HWSend(const char* strCommand,int length,int nTimeOut)
  261. {
  262. if (!m_SCF) return RET_STATUS::RET_FAILED;
  263. int ret = 0;
  264. m_SCF.Lock(msTimeOut_Lock)
  265. .SendPacket(strCommand, length, nTimeOut, ret);
  266. Sleep(nTimeOut);
  267. return RET_STATUS::RET_SUCCEED;
  268. }
  269. RET_STATUS nsDME::DMENormalDMEDevice::SetCommand(std::string& cmd)
  270. {
  271. int nlen = cmd.length();
  272. return HWSend(cmd.c_str(), static_cast<int>(cmd.length()));
  273. }
  274. //-----------------------------------------------------------------------------
  275. // ProcessCmd
  276. //-----------------------------------------------------------------------------
  277. void nsDME::DMENormalDMEDevice::FireNotify(std::string key, std::string content)
  278. {
  279. EventCenter->OnNotify(1, key, content);
  280. }
  281. void nsDME::DMENormalDMEDevice::OnCallBack(const char* strPackage, DWORD Length)
  282. {
  283. if (m_DMEUnit.m_ConnectionStatus->Update(true))
  284. FireNotify(m_DMEUnit.m_ConnectionStatus->GetKey(), m_DMEUnit.m_ConnectionStatus->JSGet());;
  285. // 打印日志
  286. std::string hexString;
  287. for (DWORD j = 0; j < Length; ++j) {
  288. char buffer[3];
  289. snprintf(buffer, sizeof(buffer), "%02X", static_cast<unsigned char>(strPackage[j]));
  290. hexString += buffer;
  291. }
  292. mLog::FINFO("==IN==: {$}", hexString.c_str());
  293. std::string str;
  294. size_t packageLength = Length;
  295. // 提取处理函数
  296. auto handlePackage = [&](size_t offset, size_t length) {
  297. if (isChecksumValid(strPackage, packageLength)) {
  298. str.assign(strPackage + offset, length);
  299. }
  300. };
  301. switch (strPackage[0]) {
  302. case char(0x80) :
  303. if (strPackage[1] == (char)0x06 && (strPackage[2] == (char)0x82 || strPackage[2] == (char)0x85)) {
  304. handlePackage(2, packageLength - 3); // 处理有效数据
  305. }
  306. break;
  307. case char(0xFA) :
  308. if (strPackage[1] == (char)0x04 || strPackage[1] == (char)0x84) {
  309. handlePackage(1, packageLength - 2); // 处理有效数据
  310. }
  311. break;
  312. default:
  313. break;
  314. }
  315. const char* chdigital = str.c_str() + 1;
  316. float _fDistance = 0.0f;
  317. switch (str[0]) {
  318. case (char)0x82: // Case 0x82
  319. {
  320. mLog::FINFO("enter 0x82 branch --2");
  321. _fDistance = atof(chdigital); // 单位:m
  322. mLog::FINFO("distance from hard to obj front is {$} ,unit: m", _fDistance);
  323. // 计算 m_nDistance
  324. int nDistance = static_cast<int>((_fDistance * 100) * cos(m_nMeasureAngle / 180 * 3.1415926));
  325. mLog::FINFO("sid= {$} cm, subtraction m_ndistance is {$} cm. obj's height is {$} cm.", m_nMeasureSID, nDistance, (m_nMeasureSID - nDistance));
  326. m_DMEUnit.m_Distance->Update(nDistance);
  327. FireNotify(m_DMEUnit.m_Distance->GetKey(), m_DMEUnit.m_Distance->JSGet());
  328. break;
  329. }
  330. case (char)0x04: // Case 0x04
  331. {
  332. switch (str[1]) {
  333. case (char)0x8C: // set resolution ratio
  334. mLog::FINFO("set resolution ratio success. type is {$}", m_nResolution);
  335. break;
  336. case (char)0x8B: // set calibrate value
  337. mLog::FINFO("set calibrate value success.");
  338. break;
  339. default:
  340. break;
  341. }
  342. break;
  343. }
  344. case (char)0x84: // Case 0x84 (Error case)
  345. {
  346. mLog::FINFO("something wrong");
  347. switch (str[1]) {
  348. case (char)0x8B:
  349. mLog::FINFO("set calibrate value failed.");
  350. break;
  351. case (char)0x8C:
  352. mLog::FINFO("set resolution ratio failed.");
  353. break;
  354. default:
  355. break;
  356. }
  357. break;
  358. }
  359. case (char)0x85: // Case 0x85
  360. mLog::FINFO("{$}",str[1] == 0x01 ? "set laser cmd, success" : "set laser cmd, failed.");
  361. break;
  362. case 'E': // Error case
  363. {
  364. mLog::FERROR("error");
  365. break;
  366. }
  367. case 'D': // Calibration value case
  368. {
  369. chdigital = str.c_str() + 2;
  370. int _nCalibrateValue = atoi(chdigital);
  371. mLog::FINFO("Calibrate value = {$} mm.", _nCalibrateValue);
  372. m_nCalibrateValue = _nCalibrateValue / 10;
  373. break;
  374. }
  375. case 'L': // Distance case
  376. {
  377. chdigital = str.c_str() + 2;
  378. int _nDistance = atoi(chdigital);
  379. mLog::FINFO("distance from hard to obj front is {$} ,unit: mm", _nDistance);
  380. // 计算 nDistance
  381. int nDistance = static_cast<int>((_fDistance * 100) * cos(m_nMeasureAngle / 180 * 3.1415926));
  382. mLog::FINFO("height of obj is {$} cm.", nDistance);
  383. m_DMEUnit.m_Distance->Update(nDistance);
  384. FireNotify(m_DMEUnit.m_Distance->GetKey(), m_DMEUnit.m_Distance->JSGet());
  385. break;
  386. }
  387. case 'M': // Data mode or max len case
  388. {
  389. if (str[1] == '=')
  390. {
  391. chdigital = str.c_str() + 2;
  392. int nDataMode = atoi(chdigital);
  393. mLog::FINFO("data mode : {$}", nDataMode);
  394. }
  395. else
  396. {
  397. chdigital = str.c_str() + 4;
  398. int nMaxLen = atoi(chdigital);
  399. mLog::FINFO("max len = {$}", nMaxLen);
  400. }
  401. break;
  402. }
  403. case 'S': // Distance send mode case
  404. {
  405. chdigital = str.c_str() + 2;
  406. int nDistanceSendMode = atoi(chdigital);
  407. mLog::FINFO("distance send mode : {$}", nDistanceSendMode);
  408. break;
  409. }
  410. case 'T': // Send interval case
  411. {
  412. chdigital = str.c_str() + 2;
  413. int nSendInterval = atoi(chdigital);
  414. mLog::FINFO("send interval : {$}", nSendInterval);
  415. break;
  416. }
  417. default:
  418. break;
  419. }
  420. }
  421. nsDME::DMENormalDMEDriver::DMENormalDMEDriver()
  422. {
  423. }
  424. nsDME::DMENormalDMEDriver::~DMENormalDMEDriver()
  425. {
  426. mLog::Close();
  427. mLog::gLogger = nullptr;
  428. }
  429. auto nsDME::DMENormalDMEDriver::CreateDevice(int index) -> std::unique_ptr <IODevice>
  430. {
  431. mLog::FINFO("CreateDevice in");
  432. m_pDevice = new DMENormalDMEDevice(EventCenter, m_SCF, m_ConfigFileName);
  433. auto dev = std::unique_ptr <IODevice>(new IODevice(m_pDevice));
  434. mLog::FINFO("CreateDevice in m_pDevice :{$}", m_pDevice);
  435. //m_pDevice->Register();
  436. return dev;
  437. }
  438. void nsDME::DMENormalDMEDriver::FireNotify(int code, std::string key, std::string content)
  439. {
  440. EventCenter->OnNotify(code, key, content);
  441. }
  442. Log4CPP::Logger* mLog::gLogger = nullptr;
  443. void nsDME::DMENormalDMEDriver::Prepare()
  444. {
  445. mLog::FINFO("Prepare in");
  446. ResDataObject r_config;
  447. if (r_config.loadFile(m_ConfigFileName.c_str()))
  448. {
  449. string strLogPath = GetProcessDirectory() + R"(\OEMDrivers\DME\Conf\Log4CPP.Config.DME.xml)";
  450. Log4CPP::GlobalContext::Map::Set(ECOM::Utility::Hash("LogFileName"), "DME.NormalDME");
  451. auto rc = Log4CPP::LogManager::LoadConfigFile(strLogPath.c_str());
  452. mLog::gLogger = Log4CPP::LogManager::GetLogger("DME.NormalDME");
  453. m_SCFDllName = GetConnectDLL(m_ConfigFileName);
  454. }
  455. super::Prepare();
  456. }
  457. bool DATA_ACTION nsDME::DMENormalDMEDriver::Connect()
  458. {
  459. super::Disconnect();
  460. m_SCF.Disconnect();
  461. mLog::FINFO("Connect in");
  462. ResDataObject Connection = GetConnectParam(m_ConfigFileName);
  463. mLog::FINFO("connections:{$}", Connection.encode());
  464. auto erCode = m_SCF.Connect(Connection.encode(), &nsDME::DMENormalDMEDriver::callbackPackageProcess, SCF_PACKET_TRANSFER, 3000);
  465. if (erCode != SCF_ERR::SCF_SUCCEED)
  466. {
  467. mLog::FINFO("erCode != SCF_ERR::SCF_SUCCEED:{$}", erCode);
  468. return false;
  469. }
  470. auto rc = super::Connect();
  471. if (!rc)
  472. {
  473. mLog::FINFO("super::Connect failed");
  474. return false;
  475. }
  476. return true;
  477. }
  478. void nsDME::DMENormalDMEDriver::Disconnect()
  479. {
  480. super::Disconnect();
  481. m_SCF.Disconnect();
  482. }
  483. bool nsDME::DMENormalDMEDriver::isConnected() const
  484. {
  485. return super::isConnected();
  486. }
  487. std::string nsDME::DMENormalDMEDriver::DriverProbe()
  488. {
  489. mLog::FINFO("DriverProbe in");
  490. ResDataObject r_config, HardwareInfo;
  491. if (r_config.loadFile(m_ConfigFileName.c_str()))
  492. {
  493. HardwareInfo.add("MajorID", r_config["CONFIGURATION"]["MajorID"]);
  494. HardwareInfo.add("MinorID", r_config["CONFIGURATION"]["MinorID"]);
  495. HardwareInfo.add("VendorID", r_config["CONFIGURATION"]["VendorID"]);
  496. HardwareInfo.add("ProductID", r_config["CONFIGURATION"]["ProductID"]);
  497. HardwareInfo.add("SerialID", r_config["CONFIGURATION"]["SerialID"]);
  498. }
  499. else
  500. {
  501. HardwareInfo.add("MajorID", "DME");
  502. HardwareInfo.add("MinorID", "Dr");
  503. HardwareInfo.add("VendorID", "NormalDME");
  504. HardwareInfo.add("ProductID", "HF");
  505. HardwareInfo.add("SerialID", "Drv");
  506. }
  507. string ret = HardwareInfo.encode();
  508. return ret;
  509. }
  510. std::string nsDME::DMENormalDMEDriver::GetResource()
  511. {
  512. mLog::FINFO("GetResource in");
  513. ResDataObject temp;
  514. if (!temp.loadFile(m_ConfigFileName.c_str()))
  515. return std::string();
  516. auto r_config = temp["CONFIGURATION"];
  517. for (auto& Item : m_ConfigInfo)
  518. {
  519. string key = Item.GetKey();
  520. if (key == ConfKey::DiosType)
  521. {
  522. Item.SetCurrentValue(((string)r_config["VendorID"]).c_str());
  523. }
  524. else if (key == ConfKey::DiosModel)
  525. {
  526. Item.SetCurrentValue(((string)r_config["ProductID"]).c_str());
  527. }
  528. else if (key == ConfKey::DiosSCFType)
  529. {
  530. Item.SetCurrentValue(((string)r_config["connections"][0]["type"]).c_str());
  531. }
  532. else if (key == ConfKey::DiosSCFPort || key == ConfKey::DiosSCFBaudrate || key == ConfKey::DiosSCFBytesize
  533. || key == ConfKey::DiosSCFParity || key == ConfKey::DiosSCFStopbits || key == ConfKey::DiosSCFIP)
  534. {
  535. if (r_config["connections"][0].GetFirstOf(key.c_str()) >= 0)
  536. {
  537. Item.SetCurrentValue(((string)r_config["connections"][0][key.c_str()]).c_str());
  538. }
  539. }
  540. }
  541. ResDataObject resAttr, resDescription;
  542. for (auto Item : m_ConfigInfo)
  543. {
  544. resAttr.add(Item.GetKey(), Item.GetCurrentValue());
  545. resDescription.add(Item.GetKey(), Item.GetDescription());
  546. }
  547. ResDataObject resDeviceResource;
  548. resDeviceResource.add(ConfKey::DiosAttribute, resAttr);
  549. resDeviceResource.add(ConfKey::DiosDescription, resDescription);
  550. string res = resDeviceResource.encode();
  551. mLog::FINFO("sresDeviceResource : {$}", resDeviceResource.encode());
  552. //printf("resDeviceResource :%s \n", resDeviceResource.encode());
  553. return res;
  554. }
  555. std::string nsDME::DMENormalDMEDriver::DeviceProbe()
  556. {
  557. mLog::FINFO("DeviceProbe in");
  558. ResDataObject r_config, HardwareInfo;
  559. if (r_config.loadFile(m_ConfigFileName.c_str()))
  560. {
  561. HardwareInfo.add("MajorID", r_config["CONFIGURATION"]["MajorID"]);
  562. HardwareInfo.add("MinorID", r_config["CONFIGURATION"]["MinorID"]);
  563. HardwareInfo.add("VendorID", r_config["CONFIGURATION"]["VendorID"]);
  564. HardwareInfo.add("ProductID", r_config["CONFIGURATION"]["ProductID"]);
  565. HardwareInfo.add("SerialID", r_config["CONFIGURATION"]["SerialID"]);
  566. }
  567. else
  568. {
  569. HardwareInfo.add("MajorID", "DME");
  570. HardwareInfo.add("MinorID", "Dr");
  571. HardwareInfo.add("VendorID", "NormalDME");
  572. HardwareInfo.add("ProductID", "HF");
  573. HardwareInfo.add("SerialID", "1234");
  574. }
  575. string ret = HardwareInfo.encode();
  576. return ret;
  577. }
  578. void nsDME::DMENormalDMEDriver::Dequeue(const char* Packet, DWORD Length)
  579. {
  580. mLog::FINFO("Dequeue in m_pDevice :{$}", m_pDevice);
  581. m_pDevice->OnCallBack(Packet, Length);
  582. }
  583. PACKET_RET nsDME::DMENormalDMEDriver::callbackPackageProcess(const char* RecData, DWORD nLength, DWORD& PacketLength)
  584. {
  585. // 判断是否是整包
  586. /*
  587. 这个是回调函数,我收到的数据会需要这个回调函数帮我判断是否是整个的包;
  588. 如果有整个的包,返回值为true,在PacketLength处返回给我整个包的长度,我再截取后放入缓存供上层使用;
  589. 如果缓存中的数据没有整个的数据包,那么返回false
  590. */
  591. if (nLength < 1)
  592. {
  593. mLog::Warn("nLength < 1, nLength=={$}", nLength);
  594. return PACKET_USELESS;
  595. }
  596. // 查找包的结束标志(0x0d 0x0a)
  597. for (DWORD i = 0; i < nLength - 1; i++)
  598. {
  599. if (RecData[i] == (char)0xFA || RecData[i] == (char)0x80)
  600. {
  601. // 找到了完整的包
  602. PacketLength = nLength; // 将包的长度设置为结束标志之后的位置
  603. std::string hexString;
  604. for (DWORD j = 0; j < nLength; ++j) {
  605. char buffer[3];
  606. snprintf(buffer, sizeof(buffer), "%02X", static_cast<unsigned char>(RecData[j]));
  607. hexString += buffer;
  608. }
  609. mLog::FINFO("callbackPackageProcess, Packet content: {$}", hexString.c_str());
  610. return PACKET_ISPACKET; // 返回整个包
  611. }
  612. }
  613. // 未找到包的结束标志,返回无效包
  614. return PACKET_NOPACKET;
  615. }
  616. //-----------------------------------------------------------------------------
  617. // GetIODriver & CreateIODriver
  618. //-----------------------------------------------------------------------------
  619. static nsDME::DMENormalDMEDriver gIODriver;
  620. extern "C" DIOS::Dev::IODriver * __cdecl GetIODriver() // 返回静态对象的引用, 调用者不能删除 !
  621. {
  622. return &gIODriver;
  623. }
  624. extern "C" DIOS::Dev::IODriver * __cdecl CreateIODriver() // 返回新对象, 调用者必须自行删除此对象 !
  625. {
  626. return new nsDME::DMENormalDMEDriver();
  627. }
  628. #if 0
  629. #endif