You can not select more than 25 topics Topics must start with a chinese character,a letter or number, can include dashes ('-') and can be up to 35 characters long.

AnalogAfterProc.cpp 18 kB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459
  1. #include "AnalogAfterProc.h"
  2. AnalogAfterProc::AnalogAfterProc(QObject* parent) : IAfterProc(parent)
  3. {}
  4. AnalogAfterProc::~AnalogAfterProc()
  5. {
  6. m_file.flush();
  7. m_file.close();
  8. }
  9. void AnalogAfterProc::run()
  10. {
  11. double dStartTime = 0.0;
  12. double dCodeTime = 0.0;
  13. m_uiDataSize = m_byteArray.size();
  14. while (m_uiIndex + m_pFrame->m_uiFrameLen <= m_uiDataSize) {
  15. m_tempArray = m_byteArray.mid(m_uiIndex, m_pFrame->m_uiFrameLen);
  16. unsigned char* pData = (unsigned char*)m_tempArray.data();
  17. unsigned int uiCodePos = 0;
  18. if (m_pFrame->m_usHeadAddr == 1) { // 帧头在每行最前
  19. uiCodePos = 2;
  20. } else if (m_pFrame->m_usHeadAddr == 2) { // 帧头在每行最后
  21. uiCodePos = 0;
  22. }
  23. if (m_pParam->getCurveWidget()->m_bRefTime == false) { // 未设置基准时间
  24. dStartTime = GetBCDTimeCode(pData + uiCodePos); // 初始时码值
  25. QString strTime = "时间(ms)-基准时间:" + GetBCDTimeCodeHMS(pData + uiCodePos);
  26. QCustomPlot* pCustomPlot = m_pParam->getCurveWidget()->getCustomplot();
  27. pCustomPlot->xAxis->setLabel(strTime);
  28. m_pParam->getCurveWidget()->m_bRefTime = true;
  29. }
  30. dCodeTime = GetBCDTimeCode(pData + uiCodePos) - dStartTime; // 时码值
  31. // 提取一个数据,添加一个时间
  32. for (auto channel : m_pParam->m_pChannelGroup->m_vecChannel) {
  33. m_validArray.append(m_tempArray.at(channel->m_uiAbsolutePos));
  34. }
  35. m_tempArray.clear();
  36. m_ableArray = m_validArray;
  37. m_validArray.clear();
  38. // 将数据写入文件中
  39. m_file.write(m_ableArray);
  40. m_file.flush();
  41. // 处理有效工程量数据
  42. validDataDeal(dCodeTime);
  43. m_uiIndex += m_pFrame->m_uiFrameLen;
  44. }
  45. m_uiDataSize = 0;
  46. m_uiIndex = 0;
  47. m_byteArray.clear();
  48. emit parseFinished();
  49. }
  50. unsigned int AnalogAfterProc::getDataNum()
  51. {
  52. unsigned int uiChannelNum = m_pParam->m_pChannelGroup->m_uiChannelNum; // 所占通道数量
  53. unsigned short usType = m_pParam->m_usType;
  54. unsigned int uiDataNum = 0;
  55. // 计算有效数据个数
  56. switch (usType) {
  57. case 1:
  58. case 2:
  59. uiDataNum = uiChannelNum;
  60. break;
  61. case 3:
  62. case 4:
  63. uiDataNum = uiChannelNum / 2;
  64. break;
  65. case 5:
  66. case 6:
  67. uiDataNum = uiChannelNum / 4;
  68. break;
  69. case 7:
  70. case 8:
  71. uiDataNum = uiChannelNum / 8;
  72. break;
  73. default:
  74. break;
  75. }
  76. return uiDataNum;
  77. }
  78. // 处理有效数据
  79. void AnalogAfterProc::validDataDeal(qreal time)
  80. {
  81. // 获取时码
  82. double dFrameTime = m_pFrame->m_dFrameTime; // 帧间隔
  83. unsigned int uiDataNum = getDataNum(); // 有效数据个数
  84. double dTimeInterval = dFrameTime / (uiDataNum * 1.0);
  85. unsigned short usModel = m_pParam->m_usModel; // 参数类型
  86. unsigned short usOrder = m_pParam->m_usOrder; // 大小端
  87. unsigned int m_uiIndex = 0;
  88. unsigned int m_uiNum = 0;
  89. double dTime = 0.0;
  90. unsigned int m_uiDataSize = m_ableArray.size();
  91. unsigned char* pData = (unsigned char*)m_ableArray.data();
  92. if (usModel == 1) { // 模拟量
  93. switch (m_pParam->m_usType) {
  94. case 1: { // char
  95. while (m_uiIndex < m_uiDataSize) {
  96. char cData = (char)m_ableArray.at(m_uiIndex);
  97. dTime = time + dTimeInterval * m_uiNum;
  98. // 对char进行处理
  99. setCurveData(dTime, cData);
  100. ++m_uiIndex;
  101. ++m_uiNum;
  102. }
  103. break;
  104. }
  105. case 2: { // unsigned char
  106. while (m_uiIndex < m_uiDataSize) {
  107. unsigned char ucData = (unsigned char)m_ableArray.at(m_uiIndex);
  108. dTime = time + dTimeInterval * m_uiNum;
  109. // 对unsigned char进行处理
  110. setCurveData(dTime, ucData);
  111. ++m_uiIndex;
  112. ++m_uiNum;
  113. }
  114. break;
  115. }
  116. case 3: { // short
  117. while (m_uiIndex + 2 <= m_uiDataSize) {
  118. short sData = 0x0000;
  119. if (usOrder == 1) { // 大端
  120. char cTemp = pData[m_uiIndex];
  121. pData[m_uiIndex] = pData[m_uiIndex + 1];
  122. pData[m_uiIndex] = cTemp;
  123. sData = *(reinterpret_cast<const short*>(pData + m_uiIndex));
  124. } else if (usOrder == 2) { // 小端
  125. sData = *(reinterpret_cast<const short*>(pData + m_uiIndex));
  126. }
  127. dTime = time + dTimeInterval * m_uiNum;
  128. setCurveData(dTime, sData);
  129. m_uiIndex += 2;
  130. ++m_uiNum;
  131. }
  132. break;
  133. }
  134. case 4: { // unsigned short
  135. while (m_uiIndex + 2 <= m_uiDataSize) {
  136. unsigned short usData = 0x0000;
  137. if (usOrder == 1) { // 大端
  138. char cTemp = pData[m_uiIndex];
  139. pData[m_uiIndex] = pData[m_uiIndex + 1];
  140. pData[m_uiIndex] = cTemp;
  141. usData = *(reinterpret_cast<const unsigned short*>(pData + m_uiIndex));
  142. } else if (usOrder == 2) { // 小端
  143. usData = *(reinterpret_cast<const unsigned short*>(pData + m_uiIndex));
  144. }
  145. dTime = time + dTimeInterval * m_uiNum;
  146. setCurveData(dTime, usData);
  147. m_uiIndex += 2;
  148. ++m_uiNum;
  149. }
  150. break;
  151. }
  152. case 5: { // int
  153. while (m_uiIndex + 4 <= m_uiDataSize) {
  154. int iData = 0x00000000;
  155. if (usOrder == 1) { // 大端
  156. char cTemp[4] = {0x00, 0x00, 0x00, 0x00};
  157. cTemp[0] = pData[m_uiIndex + 3];
  158. cTemp[1] = pData[m_uiIndex + 2];
  159. cTemp[2] = pData[m_uiIndex + 1];
  160. cTemp[3] = pData[m_uiIndex];
  161. iData = *(reinterpret_cast<const int*>(cTemp));
  162. } else if (usOrder == 2) { // 小端
  163. iData = *(reinterpret_cast<const int*>(pData));
  164. }
  165. dTime = time + dTimeInterval * m_uiNum;
  166. setCurveData(dTime, iData);
  167. m_uiIndex += 4;
  168. ++m_uiNum;
  169. }
  170. break;
  171. }
  172. case 6: { // unsigned int
  173. while (m_uiIndex + 4 <= m_uiDataSize) {
  174. unsigned int uiData = 0x00000000;
  175. if (usOrder == 1) { // 大端
  176. char cTemp[4] = {0x00, 0x00, 0x00, 0x00};
  177. cTemp[0] = pData[m_uiIndex + 3];
  178. cTemp[1] = pData[m_uiIndex + 2];
  179. cTemp[2] = pData[m_uiIndex + 1];
  180. cTemp[3] = pData[m_uiIndex];
  181. uiData = *(reinterpret_cast<const unsigned int*>(cTemp));
  182. } else if (usOrder == 2) { // 小端
  183. uiData = *(reinterpret_cast<const unsigned int*>(pData));
  184. }
  185. dTime = time + dTimeInterval * m_uiNum;
  186. setCurveData(dTime, uiData);
  187. m_uiIndex += 4;
  188. ++m_uiNum;
  189. }
  190. break;
  191. }
  192. case 7: { // long long
  193. while (m_uiIndex + 8 <= m_uiDataSize) {
  194. long long llData = 0x0000000000000000;
  195. if (usOrder == 1) { // 大端
  196. char cTemp[4] = {0x00, 0x00, 0x00, 0x00};
  197. cTemp[0] = pData[m_uiIndex + 7];
  198. cTemp[1] = pData[m_uiIndex + 6];
  199. cTemp[2] = pData[m_uiIndex + 5];
  200. cTemp[3] = pData[m_uiIndex + 4];
  201. cTemp[4] = pData[m_uiIndex + 3];
  202. cTemp[5] = pData[m_uiIndex + 2];
  203. cTemp[6] = pData[m_uiIndex + 1];
  204. cTemp[7] = pData[m_uiIndex];
  205. llData = *(reinterpret_cast<const long long*>(cTemp));
  206. } else if (usOrder == 2) { // 小端
  207. llData = *(reinterpret_cast<const long long*>(pData));
  208. }
  209. dTime = time + dTimeInterval * m_uiNum;
  210. setCurveData(dTime, llData);
  211. m_uiIndex += 8;
  212. ++m_uiNum;
  213. }
  214. break;
  215. }
  216. case 8: { // unsigned long long
  217. while (m_uiIndex + 8 <= m_uiDataSize) {
  218. unsigned long long ullData = 0x0000000000000000;
  219. if (usOrder == 1) { // 大端
  220. char cTemp[4] = {0x00, 0x00, 0x00, 0x00};
  221. cTemp[0] = pData[m_uiIndex + 7];
  222. cTemp[1] = pData[m_uiIndex + 6];
  223. cTemp[2] = pData[m_uiIndex + 5];
  224. cTemp[3] = pData[m_uiIndex + 4];
  225. cTemp[4] = pData[m_uiIndex + 3];
  226. cTemp[5] = pData[m_uiIndex + 2];
  227. cTemp[6] = pData[m_uiIndex + 1];
  228. cTemp[7] = pData[m_uiIndex];
  229. ullData = *(reinterpret_cast<const unsigned long long*>(cTemp));
  230. } else if (usOrder == 2) { // 小端
  231. ullData = *(reinterpret_cast<const unsigned long long*>(pData));
  232. }
  233. dTime = time + dTimeInterval * m_uiNum;
  234. setCurveData(dTime, ullData);
  235. m_uiIndex += 8;
  236. ++m_uiNum;
  237. }
  238. break;
  239. }
  240. default:
  241. break;
  242. }
  243. } else if (usModel == 4) { // 状态量
  244. QString strBit = m_pParam->m_strBit; // 状态量比特位
  245. unsigned int iBit = strBit.toInt(nullptr, 16);
  246. switch (m_pParam->m_usType) {
  247. case 1: { // char
  248. while (m_uiIndex < m_uiDataSize) {
  249. char cData = (char)m_ableArray.at(m_uiIndex);
  250. // 对char进行处理
  251. char cBit = *(char*)&iBit;
  252. cData &= cBit;
  253. dTime = time + dTimeInterval * m_uiNum;
  254. setCurveData(dTime, cData);
  255. ++m_uiIndex;
  256. ++m_uiNum;
  257. }
  258. break;
  259. }
  260. case 2: { // unsigned char
  261. while (m_uiIndex < m_uiDataSize) {
  262. unsigned char ucData = (unsigned char)m_ableArray.at(m_uiIndex);
  263. // 对unsigned char进行处理
  264. unsigned char cBit = *(unsigned char*)&iBit;
  265. ucData &= cBit;
  266. dTime = time + dTimeInterval * m_uiNum;
  267. setCurveData(dTime, ucData);
  268. ++m_uiIndex;
  269. ++m_uiNum;
  270. }
  271. break;
  272. }
  273. case 3: { // short
  274. while (m_uiIndex + 2 <= m_uiDataSize) {
  275. short sData = 0x0000;
  276. if (usOrder == 1) { // 大端
  277. char cTemp = pData[m_uiIndex];
  278. pData[m_uiIndex] = pData[m_uiIndex + 1];
  279. pData[m_uiIndex] = cTemp;
  280. sData = *(reinterpret_cast<const short*>(pData + m_uiIndex));
  281. } else if (usOrder == 2) { // 小端
  282. sData = *(reinterpret_cast<const short*>(pData + m_uiIndex));
  283. }
  284. sData &= (short)iBit;
  285. dTime = time + dTimeInterval * m_uiNum;
  286. setCurveData(dTime, sData);
  287. m_uiIndex += 2;
  288. ++m_uiNum;
  289. }
  290. break;
  291. }
  292. case 4: { // unsigned short
  293. while (m_uiIndex + 2 <= m_uiDataSize) {
  294. unsigned short usData = 0x0000;
  295. if (usOrder == 1) { // 大端
  296. char cTemp = pData[m_uiIndex];
  297. pData[m_uiIndex] = pData[m_uiIndex + 1];
  298. pData[m_uiIndex] = cTemp;
  299. usData = *(reinterpret_cast<const unsigned short*>(pData + m_uiIndex));
  300. } else if (usOrder == 2) { // 小端
  301. usData = *(reinterpret_cast<const unsigned short*>(pData + m_uiIndex));
  302. }
  303. usData &= (unsigned short)iBit;
  304. dTime = time + dTimeInterval * m_uiNum;
  305. setCurveData(dTime, usData);
  306. m_uiIndex += 2;
  307. ++m_uiNum;
  308. }
  309. break;
  310. }
  311. case 5: { // int
  312. while (m_uiIndex + 4 <= m_uiDataSize) {
  313. int iData = 0x00000000;
  314. if (usOrder == 1) { // 大端
  315. char cTemp[4] = {0x00, 0x00, 0x00, 0x00};
  316. cTemp[0] = pData[m_uiIndex + 3];
  317. cTemp[1] = pData[m_uiIndex + 2];
  318. cTemp[2] = pData[m_uiIndex + 1];
  319. cTemp[3] = pData[m_uiIndex];
  320. iData = *(reinterpret_cast<const int*>(cTemp));
  321. } else if (usOrder == 2) { // 小端
  322. iData = *(reinterpret_cast<const int*>(pData));
  323. }
  324. iData &= (int)iBit;
  325. dTime = time + dTimeInterval * m_uiNum;
  326. setCurveData(dTime, iData);
  327. m_uiIndex += 4;
  328. ++m_uiNum;
  329. }
  330. break;
  331. }
  332. case 6: { // unsigned int
  333. while (m_uiIndex + 4 <= m_uiDataSize) {
  334. unsigned int uiData = 0x00000000;
  335. if (usOrder == 1) { // 大端
  336. char cTemp[4] = {0x00, 0x00, 0x00, 0x00};
  337. cTemp[0] = pData[m_uiIndex + 3];
  338. cTemp[1] = pData[m_uiIndex + 2];
  339. cTemp[2] = pData[m_uiIndex + 1];
  340. cTemp[3] = pData[m_uiIndex];
  341. uiData = *(reinterpret_cast<const unsigned int*>(cTemp));
  342. } else if (usOrder == 2) { // 小端
  343. uiData = *(reinterpret_cast<const unsigned int*>(pData));
  344. }
  345. uiData &= (unsigned int)iBit;
  346. dTime = time + dTimeInterval * m_uiNum;
  347. setCurveData(dTime, uiData);
  348. m_uiIndex += 4;
  349. ++m_uiNum;
  350. }
  351. break;
  352. }
  353. case 7: { // long long
  354. while (m_uiIndex + 8 <= m_uiDataSize) {
  355. long long llData = 0x0000000000000000;
  356. if (usOrder == 1) { // 大端
  357. char cTemp[8] = {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00};
  358. cTemp[0] = pData[m_uiIndex + 7];
  359. cTemp[1] = pData[m_uiIndex + 6];
  360. cTemp[2] = pData[m_uiIndex + 5];
  361. cTemp[3] = pData[m_uiIndex + 4];
  362. cTemp[4] = pData[m_uiIndex + 3];
  363. cTemp[5] = pData[m_uiIndex + 2];
  364. cTemp[6] = pData[m_uiIndex + 1];
  365. cTemp[7] = pData[m_uiIndex];
  366. llData = *(reinterpret_cast<const long long*>(cTemp));
  367. } else if (usOrder == 2) { // 小端
  368. llData = *(reinterpret_cast<const long long*>(pData));
  369. }
  370. llData &= (long long)iBit;
  371. dTime = time + dTimeInterval * m_uiNum;
  372. setCurveData(dTime, llData);
  373. m_uiIndex += 8;
  374. ++m_uiNum;
  375. }
  376. break;
  377. }
  378. case 8: { // unsigned long long
  379. while (m_uiIndex + 8 <= m_uiDataSize) {
  380. unsigned long long ullData = 0x0000000000000000;
  381. if (usOrder == 1) { // 大端
  382. char cTemp[8] = {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00};
  383. cTemp[0] = pData[m_uiIndex + 7];
  384. cTemp[1] = pData[m_uiIndex + 6];
  385. cTemp[2] = pData[m_uiIndex + 5];
  386. cTemp[3] = pData[m_uiIndex + 4];
  387. cTemp[4] = pData[m_uiIndex + 3];
  388. cTemp[5] = pData[m_uiIndex + 2];
  389. cTemp[6] = pData[m_uiIndex + 1];
  390. cTemp[7] = pData[m_uiIndex];
  391. ullData = *(reinterpret_cast<const unsigned long long*>(cTemp));
  392. } else if (usOrder == 2) { // 小端
  393. ullData = *(reinterpret_cast<const unsigned long long*>(pData));
  394. }
  395. ullData &= (unsigned long long)iBit;
  396. dTime = time + dTimeInterval * m_uiNum;
  397. setCurveData(dTime, ullData);
  398. m_uiIndex += 8;
  399. ++m_uiNum;
  400. }
  401. break;
  402. }
  403. default:
  404. break;
  405. }
  406. }
  407. m_uiDataSize = 0;
  408. m_uiIndex = 0;
  409. m_ableArray.clear();
  410. }
  411. void AnalogAfterProc::setCurveData(qreal time, qreal value)
  412. {
  413. qreal qValue = value;
  414. if (m_pParam->m_formula.equaNum != 0) {
  415. qValue = convertData(value); // 对原始数据进行处理
  416. }
  417. CurveInfo* curveInfo = m_pParam->getCurveWidget()->getCurveInfo();
  418. // 对char进行处理
  419. curveInfo->m_vecAxisX.push_back(time);
  420. curveInfo->m_vecAxisY.push_back(qValue);
  421. curveInfo->maxX = time;
  422. curveInfo->minX = 0;
  423. if (curveInfo->m_bIsInited == false) {
  424. curveInfo->minY = 0.99 * qValue;
  425. curveInfo->maxY = 1.01 * qValue;
  426. curveInfo->m_bIsInited = true;
  427. }
  428. if (curveInfo->minY > qValue) {
  429. curveInfo->minY = qValue;
  430. }
  431. if (curveInfo->maxY < qValue) {
  432. curveInfo->maxY = qValue;
  433. }
  434. }
  435. qreal AnalogAfterProc::convertData(qreal value)
  436. {
  437. qreal qValue = 0.0;
  438. int iEqualNum = m_pParam->m_formula.equaNum; // 最高次方
  439. double Equation[10];
  440. for (int i = 0; i < 10; i++) {
  441. Equation[i] = m_pParam->m_formula.Equation[i];
  442. }
  443. for (int j = iEqualNum; j >= 0; j--) {
  444. for (int k = 0; k < j; k++) {
  445. Equation[j] *= value;
  446. }
  447. qValue += Equation[j];
  448. }
  449. return qValue;
  450. }