CSM315ProtocolEx.cpp 15 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596
  1. #include "stdafx.h"
  2. #include "CSM315ProtocolEx.h"
  3. string CCSM315ProtocolEx::ToString(LPVOID buf, int len, int dir/* = 1*/)
  4. {
  5. size_t sz = 5 + 1 + 1 + 1 + 4;
  6. if (sz > (unsigned)len)
  7. return "";
  8. LPBYTE pos = (LPBYTE)buf;
  9. StFrame data;
  10. memcpy_s(&data, sz, pos, sz);
  11. if (data.datalen == 0)
  12. {
  13. data.datalen = len - 16;
  14. }
  15. pos += sz;
  16. sz = 5 + 1 + 1 + 1 + 4 + data.datalen + 4;
  17. if (sz != (unsigned)len)//严格一点
  18. return "";
  19. string strMsg;
  20. //这里pos指向数据部分
  21. if (data.datalen > 0)
  22. {
  23. switch (data.ftype)
  24. {
  25. case FRAME_TYPE_HEARTBEAT:
  26. {
  27. StHeartBeat315* lpdata = (StHeartBeat315*)pos;
  28. CTime t(lpdata->hbtime);
  29. strMsg = t.Format("[心跳包]%Y-%m-%d %H:%M:%S");
  30. pos += data.datalen;
  31. break;
  32. }
  33. case FRAME_TYPE_DATA:
  34. {
  35. strMsg = ParseDataFrm(data, (LPVOID*)&pos, data.datalen, dir);
  36. pos += data.datalen;
  37. break;
  38. }
  39. default:
  40. break;
  41. }
  42. }//if
  43. memcpy_s(&data.ftail, 4, pos, 4);
  44. pos += 4;
  45. if (data.ftail != 0xFFFFFFFF || pos != (LPBYTE)buf + len)
  46. {
  47. //CCSM315ProtocolEx::Release(data, dir);
  48. return "";
  49. }
  50. return strMsg;
  51. }
  52. ////将buf解析为StFrame, 内部包含包的类别 命令还是应答等
  53. //BOOL CCSM315ProtocolEx::Parse(StFrame& data, LPVOID buf, int len, int dir)
  54. //{
  55. // ZeroMemory(&data, sizeof(data));
  56. // data.e_frmKind = GENERAL;
  57. // LPBYTE pos = (LPBYTE)buf;
  58. //
  59. // size_t sz = 5 + 1 + 1 + 1 + 4;
  60. // if (sz > (unsigned)len)
  61. // return FALSE;
  62. // memcpy_s(&data, sz, pos, sz);
  63. // if (data.datalen == 0)
  64. // {
  65. // data.datalen = len - 16;
  66. // }
  67. // pos += sz;
  68. //
  69. // sz = 5 + 1 + 1 + 1 + 4 + data.datalen + 4;
  70. // if (sz != (unsigned)len)//严格一点
  71. // return FALSE;
  72. //
  73. // //这里pos指向数据部分
  74. // if (data.datalen > 0)
  75. // {
  76. // switch (data.ftype)
  77. // {
  78. //
  79. // case FRAME_TYPE_HEARTBEAT:
  80. // {
  81. // StHeartBeat315* lpdata = new StHeartBeat315;
  82. // if (CCSM315Protocol::Parse(*lpdata, pos, data.datalen))
  83. // {
  84. // data.lpdata = lpdata;
  85. // pos += data.datalen;
  86. // }
  87. // else
  88. // {
  89. // delete lpdata;
  90. // return FALSE;
  91. // }
  92. // break;
  93. // }
  94. // case FRAME_TYPE_DATA:
  95. // {
  96. // if (!ParseDataFrm(data, (LPVOID*)&pos, data.datalen, dir)) { //pos传地址用于在内部更新最新位置,失败了内部释放内存
  97. // return false;
  98. // };
  99. // break;
  100. // }
  101. // default:
  102. // break;
  103. // }
  104. // }//if
  105. //
  106. // memcpy_s(&data.ftail, 4, pos, 4);
  107. // pos += 4;
  108. //
  109. // if (data.ftail != 0xFFFFFFFF || pos != (LPBYTE)buf + len)
  110. // {
  111. // CCSM315ProtocolEx::Release(data, dir);
  112. // return FALSE;
  113. // }
  114. //
  115. // return TRUE;
  116. //}
  117. string CCSM315ProtocolEx::GetOptDirDesc(int direct)
  118. {
  119. switch (direct)
  120. {
  121. case 0:
  122. return _T("定到反");
  123. case 1:
  124. return _T("反到定");
  125. case 2:
  126. return _T("定到定");
  127. case 3:
  128. return _T("反到反");
  129. case 4:
  130. return _T("定位到故障位");
  131. case 5:
  132. return _T("反位到故障位");
  133. case 6:
  134. return _T("故障到定位");
  135. case 7:
  136. return _T("故障到反位");
  137. case 8:
  138. return _T("故障到故障位");
  139. case 9:
  140. return _T("定位过车");
  141. case 10:
  142. return _T("反位过车");
  143. default:
  144. return _T("无效[") + to_string(direct) + "]";
  145. break;
  146. }
  147. return _T("");
  148. }
  149. string CCSM315ProtocolEx::GetAcqTypeDesc(int acqtype)
  150. {
  151. switch (acqtype)
  152. {
  153. case 0x101: return "定位测力值";
  154. case 0x102: return "反位测力值";
  155. case 0x103: return "转换阻力测力值";
  156. case 0x104: return "温度";
  157. case 0x105: return "湿度";
  158. default:
  159. break;
  160. }
  161. return "未知";
  162. }
  163. string CCSM315ProtocolEx::GetAlarmTypeDesc(int alarmID)
  164. {
  165. switch (alarmID)
  166. {
  167. case 0x101: return "定位瞬时冲击力超限预警";
  168. case 0x102: return "反位瞬时冲击力超限预警";
  169. case 0x103: return "定位锁闭力最小值超限预警";
  170. case 0x104: return "定位锁闭力最小值超限报警";
  171. case 0x105: return "反位锁闭力最小值超限预警";
  172. case 0x106: return "反位锁闭力最小值超限报警";
  173. case 0x107: return "定位锁闭力最大值超限预警";
  174. case 0x108: return "定位锁闭力最大值超限报警";
  175. case 0x109: return "反位锁闭力最大值超限预警";
  176. case 0x110: return "反位锁闭力最大值超限报警";
  177. case 0x111: return "定扳反转换阻力超限预警";
  178. case 0x112: return "定扳反转换阻力超限报警";
  179. case 0x113: return "反扳定转换阻力超限预警";
  180. case 0x114: return "反扳定转换阻力超限报警";
  181. case 0x115: return "定位保持力下降预警";
  182. case 0x116: return "定位保持力下降报警";
  183. case 0x117: return "牵引点离线报警";
  184. default:
  185. break;
  186. }
  187. return "未知报警";
  188. }
  189. //曲线类型
  190. string CCSM315ProtocolEx::GetCurveTypeDesc(int curvetype)
  191. {
  192. switch (curvetype)
  193. {
  194. case 0x1010: return "定位测力曲线";
  195. case 0x1020: return "反位测力曲线";
  196. case 0x1030: return "转换阻力曲线";
  197. case 0x1040: return "温度曲线";
  198. case 0x1050: return "湿度曲线";
  199. default:
  200. break;
  201. }
  202. return "未知";
  203. }
  204. //buf指向数据内容 len数据内容的长度 返回data 和 最新位置的buf LPVOID*只是为了方便返回最新位置
  205. string CCSM315ProtocolEx::ParseDataFrm(StFrame& data, LPVOID* buf, int len, int dir)
  206. {
  207. LPBYTE pos = (LPBYTE)(*buf);
  208. StDataBasic* basic = (StDataBasic*)pos;
  209. auto protol = (E_315_PROTOCOL_TYPE)basic->cmdid;
  210. int idx = 1;
  211. switch (protol)
  212. {
  213. //case E_315_PROTOCOL_TYPE::ACTIVE_KEEP:
  214. // break;
  215. //case E_315_PROTOCOL_TYPE::E_315_PROTOCOL_0x23:
  216. // break;
  217. //case E_315_PROTOCOL_TYPE::E_315_PROTOCOL_0x26:
  218. // break;
  219. //case E_315_PROTOCOL_TYPE::E_315_PROTOCOL_0x27:
  220. // break;
  221. //case E_315_PROTOCOL_TYPE::E_315_PROTOCOL_0x29:
  222. // break;
  223. //case E_315_PROTOCOL_TYPE::E_315_PROTOCOL_0x32:
  224. // break;
  225. //case E_315_PROTOCOL_TYPE::E_315_PROTOCOL_0x2A:
  226. // break;
  227. //case E_315_PROTOCOL_TYPE::E_315_PROTOCOL_0x2E:
  228. // break;
  229. //case E_315_PROTOCOL_TYPE::E_315_PROTOCOL_0x2F:
  230. // break;
  231. //case E_315_PROTOCOL_TYPE::E_315_PROTOCOL_0x22:
  232. // break;
  233. //case E_315_PROTOCOL_TYPE::E_315_PROTOCOL_0x25:
  234. // break;
  235. //case E_315_PROTOCOL_TYPE::E_315_PROTOCOL_0x24:
  236. // break;
  237. //case E_315_PROTOCOL_TYPE::E_315_PROTOCOL_0x30:
  238. // break;
  239. //case E_315_PROTOCOL_TYPE::E_315_PROTOCOL_0x31:
  240. // break;
  241. case E_315_PROTOCOL_TYPE::E_315_PROTOCOL_0x50:
  242. {
  243. WORD size = *(WORD*)(pos + idx); idx += 2;
  244. string strMsg = "[0x50配置]个数:" + to_string(size) + "\r\n";
  245. for (WORD i = 0; i < size; i++)
  246. {
  247. BYTE len = *(BYTE*)(pos + idx); idx += 1;
  248. CString strText((char*)pos + idx, len); idx += len;
  249. strMsg += "名称:";
  250. strMsg += (LPCSTR)strText;
  251. WORD id = *(WORD*)(pos + idx); idx += 2;
  252. strMsg += ", ID:" + to_string(id);
  253. BYTE cnt = *(BYTE*)(pos + idx); idx += 1;
  254. strMsg += ", 采集类型数量:" + to_string(cnt) + "[";
  255. for (BYTE j = 0; j < cnt; j++)
  256. {
  257. WORD acqtype = *(WORD*)(pos + idx); idx += 2;
  258. strText.Format("%s,", GetAcqTypeDesc(acqtype).c_str());
  259. strMsg += (LPCSTR)strText;
  260. }
  261. strMsg += "]\r\n";
  262. }
  263. return strMsg;
  264. }
  265. break;
  266. case E_315_PROTOCOL_TYPE::E_315_PROTOCOL_0x51:
  267. {
  268. CString strText;
  269. BYTE bPush = *(BYTE*)(pos + idx); idx += 1;
  270. string strMsg = "[0x51最新值]";
  271. if (bPush == 0) strMsg += "主动推送";
  272. else strMsg += "请求回执";
  273. WORD size = *(WORD*)(pos + idx); idx += 2;
  274. strMsg += ", 个数:" + to_string(size) + "\r\n";
  275. for (WORD i = 0; i < size; i++)
  276. {
  277. DWORD st = *(DWORD*)(pos + idx); idx += 4;
  278. CTime t(st);
  279. strMsg += t.Format("采集时间:%Y-%m-%d %H:%M:%S, ");
  280. WORD id = *(WORD*)(pos + idx); idx += 2;
  281. strMsg += ", ID:" + to_string(id) + ",位置:";
  282. BYTE dir = *(BYTE*)(pos + idx); idx += 1;
  283. strMsg += (dir == 0 ? "定位" : (dir == 1 ? "反位" : "未知"));
  284. BYTE cnt = *(BYTE*)(pos + idx); idx += 1;
  285. strMsg += ", 采集类型数量:" + to_string(cnt);
  286. for (BYTE j = 0; j < cnt; j++)
  287. {
  288. WORD acqtype = *(WORD*)(pos + idx); idx += 2;
  289. BYTE acqsta = *(BYTE*)(pos + idx); idx += 1;
  290. TIEDA_ACQ_VALUE *val = (TIEDA_ACQ_VALUE*)(pos + idx); idx += 3;
  291. strText.Format("[类型:%s,状态:%s, 值:%s],", GetAcqTypeDesc(acqtype).c_str(), acqsta == 0 ? "故障" : "正常", val->tostring().c_str());
  292. strMsg += (LPCSTR)strText;
  293. }
  294. strMsg += "]\r\n";
  295. }
  296. return strMsg;
  297. }
  298. break;
  299. case E_315_PROTOCOL_TYPE::E_315_PROTOCOL_0x52:
  300. break;
  301. case E_315_PROTOCOL_TYPE::E_315_PROTOCOL_0x53:
  302. {
  303. BYTE bPush = *(BYTE*)(pos + idx); idx += 1;
  304. string strMsg = "[0x53预报警]";
  305. if (bPush == 0) strMsg += "主动推送";
  306. else strMsg += "请求回执";
  307. BYTE no = *(BYTE*)(pos + idx); idx += 1;
  308. strMsg += ", 流水号:" + to_string(no);
  309. WORD size = *(WORD*)(pos + idx); idx += 2;
  310. strMsg += ",个数:" + to_string(size) + "\r\n";
  311. for (WORD i = 0; i < size; i++)
  312. {
  313. stAlarmItem* it = (stAlarmItem*)(pos + idx); idx += sizeof(stAlarmItem);
  314. strMsg += "[ID:" + to_string(it->wNodeID);
  315. strMsg += ", 报警类型:" + GetAlarmTypeDesc(it->wAlarmType) + ", 报警状态:";
  316. strMsg += it->byAlarmType == 1 ? "报警" : "恢复";
  317. CTime t(it->time);
  318. strMsg += t.Format(", 报警时间:%Y-%m-%d %H:%M:%S, 报警值:");
  319. strMsg += it->sAlarmValue.tostring();
  320. strMsg += ", 参考值:" + it->sRefValue.tostring();
  321. if (it->byAlarmType != 1)
  322. {
  323. t = CTime(it->dwRestoreTime);
  324. strMsg += t.Format(", 恢复时间:%Y-%m-%d %H:%M:%S");
  325. }
  326. strMsg += ", 报警建议:" + to_string(it->wSuggestID);
  327. strMsg += "]\r\n";
  328. }
  329. return strMsg;
  330. }
  331. break;
  332. case E_315_PROTOCOL_TYPE::E_315_PROTOCOL_0x54:
  333. break;
  334. case E_315_PROTOCOL_TYPE::E_315_PROTOCOL_0x55:
  335. {
  336. WORD size = *(WORD*)(pos + idx); idx += 2;
  337. string strMsg = "[0x55历史数据]个数:" + to_string(size) + "\r\n";
  338. for (WORD i = 0; i < size; i++)
  339. {
  340. WORD id = *(WORD*)(pos + idx); idx += 2;
  341. strMsg += ", ID:" + to_string(id);
  342. WORD acqtype = *(WORD*)(pos + idx); idx += 2;
  343. strMsg += ", 采集类型:" + GetAcqTypeDesc(acqtype);
  344. DWORD time = *(DWORD*)(pos + idx); idx += 4;
  345. CTime t(time);
  346. strMsg += t.Format(", 起始时间:%Y-%m-%d %H:%M:%S");
  347. WORD cnt = *(WORD*)(pos + idx); idx += 2;
  348. strMsg += ", 值数据:" + to_string(cnt) + "{";
  349. for (WORD j = 0; j < cnt; j++)
  350. {
  351. WORD offset = *(WORD*)(pos + idx); idx += 2;
  352. strMsg += "[偏移:" + to_string(offset) + ", 值:";
  353. TIEDA_ACQ_VALUE* val = (TIEDA_ACQ_VALUE*)(pos + idx); idx += 3;
  354. strMsg += val->tostring() + "]";
  355. }
  356. strMsg += "}\r\n";
  357. }
  358. return strMsg;
  359. }
  360. break;
  361. case E_315_PROTOCOL_TYPE::E_315_PROTOCOL_0x56:
  362. {
  363. WORD size = *(WORD*)(pos + idx); idx += 2;
  364. string strMsg = "[0x56历史曲线列表]个数:" + to_string(size) + "\r\n";
  365. for (WORD i = 0; i < size; i++)
  366. {
  367. WORD id = *(WORD*)(pos + idx); idx += 2;
  368. strMsg += "ID:" + to_string(id);
  369. WORD cnt = *(WORD*)(pos + idx); idx += 2;
  370. strMsg += ", 条数:" + to_string(cnt) + "[";
  371. for (WORD j = 0; j < cnt; j++)
  372. {
  373. DWORD time = *(DWORD*)(pos + idx); idx += 4;
  374. CTime t(time);
  375. strMsg += t.Format("%Y-%m-%d %H:%M:%S,");
  376. }
  377. strMsg += "]\r\n";
  378. }
  379. return strMsg;
  380. }
  381. break;
  382. case E_315_PROTOCOL_TYPE::E_315_PROTOCOL_0x57:
  383. {
  384. BYTE bPush = *(BYTE*)(pos + idx); idx += 1;
  385. string strMsg = "[0x57曲线数据]";
  386. if (bPush == 0) strMsg += "主动推送";
  387. else strMsg += "请求回执";
  388. BYTE no = *(BYTE *)(pos + idx); idx += 1;
  389. strMsg += ", 流水号:" + to_string(no);
  390. WORD id = *(WORD*)(pos + idx); idx += 2;
  391. strMsg += ", ID:" + to_string(id);
  392. DWORD time = *(DWORD*)(pos + idx); idx += 4;
  393. CTime t(time);
  394. strMsg += t.Format(", 曲线时间:%Y-%m-%d %H:%M:%S");
  395. BYTE size = *(BYTE*)(pos + idx); idx += 1;
  396. strMsg += ",条数:" + to_string(size) + "\r\n";
  397. for (WORD i = 0; i < size; i++)
  398. {
  399. WORD curvetype = *(WORD*)(pos + idx); idx += 2;
  400. strMsg += "[曲线类型:" + GetCurveTypeDesc(curvetype);
  401. BYTE dir = *(BYTE*)(pos + idx); idx += 1;
  402. strMsg += ", 曲线方向:" + GetOptDirDesc(dir);
  403. WORD offset = *(WORD*)(pos + idx); idx += 2;
  404. strMsg += ", 偏移:" + to_string(offset);
  405. WORD frq = *(WORD*)(pos + idx); idx += 2;
  406. strMsg += ", 频率:" + to_string(frq);
  407. int cnt = *(int*)(pos + idx); idx += 4;
  408. strMsg += ", 点数:" + to_string(cnt)+"[";
  409. for (int j = 0; j < cnt; j++)
  410. {
  411. TIEDA_ACQ_VALUE* val = (TIEDA_ACQ_VALUE*)(pos + idx); idx += 3;
  412. strMsg += val->tostring() + ",";
  413. }
  414. strMsg += "]\r\n";
  415. }
  416. return strMsg;
  417. }
  418. break;
  419. case E_315_PROTOCOL_TYPE::E_315_PROTOCOL_0x58:
  420. break;
  421. default:
  422. break;
  423. }
  424. *buf = pos;
  425. return "";
  426. }
  427. //释放内存,dir: 数据包方向 0-微机监测->JHD 1-JHD->微机监测
  428. BOOL CCSM315ProtocolEx::Release(StFrame& data, int dir)
  429. {
  430. if (data.datalen != 0 && data.lpdata != NULL)
  431. {
  432. switch (data.ftype)
  433. {
  434. case FRAME_TYPE_HEARTBEAT:
  435. break;
  436. case FRAME_TYPE_DATA:
  437. {
  438. StDataBasic* basic = (StDataBasic*)data.lpdata;
  439. switch ((E_315_PROTOCOL_TYPE)basic->cmdid)
  440. {
  441. case E_315_PROTOCOL_TYPE::ACTIVE_KEEP:
  442. break;
  443. case E_315_PROTOCOL_TYPE::E_315_PROTOCOL_0x23:
  444. break;
  445. case E_315_PROTOCOL_TYPE::E_315_PROTOCOL_0x26:
  446. break;
  447. case E_315_PROTOCOL_TYPE::E_315_PROTOCOL_0x27:
  448. break;
  449. case E_315_PROTOCOL_TYPE::E_315_PROTOCOL_0x29:
  450. break;
  451. case E_315_PROTOCOL_TYPE::E_315_PROTOCOL_0x32:
  452. break;
  453. case E_315_PROTOCOL_TYPE::E_315_PROTOCOL_0x2A:
  454. break;
  455. case E_315_PROTOCOL_TYPE::E_315_PROTOCOL_0x2E:
  456. break;
  457. case E_315_PROTOCOL_TYPE::E_315_PROTOCOL_0x2F:
  458. break;
  459. case E_315_PROTOCOL_TYPE::E_315_PROTOCOL_0x22:
  460. break;
  461. case E_315_PROTOCOL_TYPE::E_315_PROTOCOL_0x25:
  462. break;
  463. case E_315_PROTOCOL_TYPE::E_315_PROTOCOL_0x24:
  464. break;
  465. case E_315_PROTOCOL_TYPE::E_315_PROTOCOL_0x30:
  466. break;
  467. case E_315_PROTOCOL_TYPE::E_315_PROTOCOL_0x31:
  468. break;
  469. case E_315_PROTOCOL_TYPE::E_315_PROTOCOL_0x50:
  470. break;
  471. case E_315_PROTOCOL_TYPE::E_315_PROTOCOL_0x51:
  472. break;
  473. case E_315_PROTOCOL_TYPE::E_315_PROTOCOL_0x52:
  474. break;
  475. case E_315_PROTOCOL_TYPE::E_315_PROTOCOL_0x53:
  476. break;
  477. case E_315_PROTOCOL_TYPE::E_315_PROTOCOL_0x54:
  478. break;
  479. case E_315_PROTOCOL_TYPE::E_315_PROTOCOL_0x55:
  480. break;
  481. case E_315_PROTOCOL_TYPE::E_315_PROTOCOL_0x56:
  482. break;
  483. case E_315_PROTOCOL_TYPE::E_315_PROTOCOL_0x57:
  484. break;
  485. case E_315_PROTOCOL_TYPE::E_315_PROTOCOL_0x58:
  486. break;
  487. default:
  488. break;
  489. }
  490. break;
  491. }
  492. default:
  493. break;
  494. }
  495. delete data.lpdata;
  496. }
  497. return TRUE;
  498. }
  499. int CCSM315ProtocolEx::GetDaysOfMonth(int y, int m)
  500. {
  501. int d;
  502. int day[] = { 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 };
  503. if (m == 2)
  504. d = (((0 == y % 4) && (0 != y % 100) || (0 == y % 400)) ? 29 : 28);
  505. else
  506. d = day[m - 1];
  507. return d;
  508. }
  509. bool CCSM315ProtocolEx::IsValid(const SYSTEMTIME& sDT)
  510. {
  511. if (sDT.wYear < 2000)
  512. return false;
  513. if ((sDT.wMonth > 12) || (sDT.wMonth == 0))
  514. return false;
  515. if (sDT.wHour > 23)
  516. return false;
  517. if (sDT.wMinute > 59)
  518. return false;
  519. if (sDT.wSecond > 59)
  520. return false;
  521. WORD wDays = GetDaysOfMonth(sDT.wYear, sDT.wMonth);
  522. if ((sDT.wDay == 0) || (sDT.wDay > wDays))
  523. return false;
  524. return true;
  525. }
  526. int CCSM315ProtocolEx::CalcTimePassSecond(SYSTEMTIME* stLast, SYSTEMTIME* stNow, BOOL bReturnOriginalVal)
  527. {
  528. SYSTEMTIME stNowTime;
  529. if (stNow)
  530. {
  531. stNowTime = *stNow;
  532. }
  533. else
  534. {
  535. GetLocalTime(&stNowTime);
  536. }
  537. if (!IsValid(*stLast))
  538. memset(stLast, 0, sizeof(SYSTEMTIME));
  539. CTime dTimeNow(stNowTime);
  540. CTime dTimeLast(*stLast);
  541. CTimeSpan dTimeSpan = dTimeNow - dTimeLast;
  542. int iSecnonSpan = dTimeSpan.GetTotalSeconds();
  543. //处理毫秒时差
  544. {
  545. //低位不足,就要借位
  546. if (stNowTime.wMilliseconds < stLast->wMilliseconds)
  547. {
  548. iSecnonSpan--;
  549. }
  550. }
  551. if (bReturnOriginalVal)//返回原始值
  552. {
  553. return iSecnonSpan;
  554. }
  555. return abs(iSecnonSpan);
  556. }