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.

AnalogProcess.cpp 19 kB

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