TestService.cpp 62 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273127412751276127712781279128012811282128312841285128612871288128912901291129212931294129512961297129812991300130113021303130413051306130713081309131013111312131313141315131613171318131913201321132213231324132513261327132813291330133113321333133413351336133713381339134013411342134313441345134613471348134913501351135213531354135513561357135813591360136113621363136413651366136713681369137013711372137313741375137613771378137913801381138213831384138513861387138813891390139113921393139413951396139713981399140014011402140314041405140614071408140914101411141214131414141514161417141814191420142114221423142414251426142714281429143014311432143314341435143614371438143914401441144214431444144514461447144814491450145114521453145414551456145714581459146014611462146314641465146614671468146914701471147214731474147514761477147814791480148114821483148414851486148714881489149014911492149314941495149614971498149915001501150215031504150515061507150815091510151115121513151415151516151715181519152015211522152315241525152615271528152915301531153215331534153515361537153815391540154115421543154415451546154715481549155015511552155315541555155615571558155915601561156215631564156515661567156815691570157115721573157415751576157715781579158015811582158315841585158615871588158915901591159215931594159515961597159815991600160116021603160416051606160716081609161016111612161316141615161616171618161916201621162216231624162516261627162816291630163116321633163416351636163716381639164016411642164316441645164616471648164916501651165216531654165516561657165816591660166116621663166416651666166716681669167016711672167316741675167616771678167916801681168216831684168516861687168816891690169116921693169416951696169716981699170017011702170317041705170617071708170917101711171217131714171517161717171817191720172117221723172417251726172717281729173017311732173317341735173617371738173917401741174217431744174517461747174817491750175117521753175417551756175717581759176017611762176317641765176617671768176917701771177217731774177517761777177817791780178117821783178417851786178717881789179017911792179317941795179617971798179918001801180218031804180518061807180818091810181118121813181418151816181718181819182018211822182318241825182618271828182918301831183218331834183518361837183818391840184118421843184418451846184718481849185018511852185318541855185618571858185918601861186218631864186518661867186818691870187118721873187418751876187718781879188018811882188318841885188618871888188918901891189218931894189518961897189818991900190119021903190419051906190719081909191019111912191319141915191619171918191919201921192219231924192519261927192819291930193119321933193419351936193719381939194019411942194319441945194619471948194919501951195219531954195519561957195819591960196119621963196419651966196719681969197019711972197319741975197619771978197919801981198219831984198519861987198819891990199119921993199419951996199719981999200020012002200320042005200620072008200920102011201220132014201520162017201820192020202120222023202420252026202720282029203020312032203320342035203620372038203920402041204220432044204520462047204820492050205120522053205420552056205720582059206020612062206320642065206620672068206920702071207220732074207520762077207820792080
  1. #include "TestService.h"
  2. #include "pid.h"
  3. #include "Modbus.h"
  4. #include<QDateTime>
  5. #include<QTime>
  6. #include<QEventLoop>
  7. #include<QMessageBox>
  8. #include<cmath>
  9. #include <QSignalSpy>
  10. //#include <QAxObject>
  11. //#include <QAxWidget>
  12. #include <QDebug>
  13. //#include <QFileDialog>
  14. //#include <QTextCodec>
  15. //#include <QtCore/QtMath>
  16. #include <QFile>
  17. #include <QDir>
  18. TestService::TestService(QThread *parent)
  19. :QThread(parent)
  20. ,m_SerialUi3(nullptr)
  21. ,m_SerialUi4(nullptr)
  22. ,m_pTimer_1(nullptr)
  23. ,m_pTimer_2(nullptr)
  24. ,m_compartmentid(0)
  25. {
  26. m_bRunning=false;
  27. for(int i=0; i<MAX_COMPARTMENT_NUM; i++ ){
  28. m_tank.m_comparts[i].m_id = i;
  29. }
  30. //moveToThread(&m_Thread);
  31. //connect(this, SIGNAL(operate()), this, SLOT(doTest()));
  32. }
  33. TestService::~TestService()
  34. {
  35. }
  36. void TestService::init()
  37. {
  38. m_pTimer_1 = new QTimer(this);
  39. connect(m_pTimer_1, SIGNAL(timeout()), this, SLOT(OnTimer1()));
  40. //m_pTimer_2 = new QTimer(this);
  41. // connect(m_pTimer_2, SIGNAL(timeout()), this, SLOT(OnTimer2()));
  42. if(!m_SerialUi3.serialConnect("COM3", "9600", "8", "0", "1")){
  43. QString str = "打开串口COM3失败";
  44. emit onNotice(str);
  45. }
  46. #if 1
  47. if(!m_SerialUi4.serialConnect("COM4", "9600", "8", "2", "1")){
  48. QString str = "打开串口COM4失败";
  49. emit onNotice(str);
  50. }
  51. #endif
  52. connect(&m_report, SIGNAL(onProgress(QString)), this, SLOT(receive_reportprogress(QString)));
  53. }
  54. bool TestService::setTankinfo(const QVariantList& list)
  55. {
  56. QString standard_name;
  57. QString licenseplate_str;
  58. QString companyname_str;
  59. int compartment_num = 0;
  60. int total_volume = 0;
  61. int volume[MAX_COMPARTMENT_NUM] ={0};
  62. for(int i=0; i<list.count(); i++){
  63. QString item_string = list[i].toString();
  64. if(0 == i){
  65. standard_name = item_string;
  66. }else if(1 == i){
  67. licenseplate_str = item_string;
  68. }else if(2 == i){
  69. companyname_str = item_string;
  70. }else if(3 == i){
  71. total_volume = item_string.toInt();
  72. }else if(4 == i){
  73. compartment_num = item_string.toInt();
  74. }else{
  75. if(i< (8+5))
  76. volume[i-5] = item_string.toInt();
  77. }
  78. }
  79. //check invalid
  80. bool ret_bool = true;
  81. if( compartment_num > 0 && compartment_num <= MAX_COMPARTMENT_NUM){
  82. int volume_sum =0;
  83. for(int i=0; i<compartment_num; i++){
  84. volume_sum += volume[i];
  85. }
  86. if(total_volume != volume_sum){
  87. ret_bool = false;
  88. }
  89. }else{
  90. ret_bool = false;
  91. }
  92. if(true == ret_bool){
  93. m_standardname = standard_name;
  94. qDebug("setTankinfo: standard_name:[%s]", standard_name.toStdString().c_str());
  95. m_tank.licenseplate_str = licenseplate_str;
  96. qDebug("setTankinfo: licenseplate:[%s]", licenseplate_str.toStdString().c_str());
  97. m_tank.companyname_str = companyname_str;
  98. qDebug("setTankinfo: companyname:[%s]", companyname_str.toStdString().c_str());
  99. m_tank.total_volume = total_volume;
  100. qDebug("setTankinfo: total_volume:[%d]", total_volume);
  101. m_tank.compartment_num = compartment_num;
  102. qDebug("setTankinfo: compartment_num:[%d]", compartment_num);
  103. Standard standard;
  104. g_StandardManager->getStandard(m_standardname, standard);
  105. for(int i=0; i<compartment_num; i++){
  106. m_tank.m_comparts[i].m_volume = volume[i];
  107. qDebug("setTankinfo: volume [%d]:[%d]", i, volume[i]);
  108. for(int j=0; j<standard.item_count; j++){
  109. if(volume[i] >= standard.item[j].oilcompartment_volume){
  110. m_tank.m_comparts[i].m_standarditem = standard.item[j];
  111. qDebug("setTankinfo: compart [%d]: volume[%d]", i, standard.item[j].oilcompartment_volume);
  112. qDebug("setTankinfo: compart [%d]: sys[%f]", i, standard.item[j].system_threshold);
  113. qDebug("setTankinfo: compart [%d]: valve[%f]", i, standard.item[j].valve_threshold);
  114. }
  115. }
  116. }
  117. }
  118. return ret_bool;
  119. }
  120. bool TestService::tstart(int compartmentid, int direction)
  121. {
  122. if(m_bRunning){
  123. QString str = "当前有任务正在进行中...";
  124. emit onNotice(str);
  125. return false;
  126. }
  127. m_compartmentid = compartmentid-1;
  128. if(0 == direction)
  129. m_direction = Test_Direction_Positive;
  130. else
  131. m_direction = Test_Direction_Negative;
  132. m_stage = Test_Stage_SysTest;
  133. m_step = Test_Step_Start;
  134. m_pressuremutex.lock();
  135. m_pressurelist.clear(); //用来计算平均压力
  136. m_pressuremutex.unlock();
  137. QMessageBox::StandardButton result = QMessageBox::information(NULL, "提示:", "请对油气回收系统相关部件进行检查", QMessageBox::Ok|QMessageBox::Abort, QMessageBox::Ok);
  138. switch (result)
  139. {
  140. case QMessageBox::Ok:
  141. qDebug()<<"Ok";
  142. m_pTimer_1->start(1*1000); // 1s
  143. m_bRunning = true;
  144. start();
  145. break;
  146. case QMessageBox::Abort:
  147. qDebug()<<"Abort";
  148. return false;
  149. break;
  150. default:
  151. qDebug()<<"default";
  152. return false;
  153. break;
  154. }
  155. return true;
  156. }
  157. bool TestService::tselfstart(int compartmentid, int direction)
  158. {
  159. if(m_bRunning){
  160. QString str = "当前有任务正在进行中...";
  161. emit onNotice(str);
  162. return false;
  163. }
  164. m_compartmentid = compartmentid-1;
  165. if(0 == direction)
  166. m_direction = Test_Direction_Positive;
  167. else
  168. m_direction = Test_Direction_Negative;
  169. m_stage = Test_Stage_SysTest;
  170. m_step = Test_Step_Start;
  171. m_pressuremutex.lock();
  172. m_pressurelist.clear(); //用来计算平均压力
  173. m_pressuremutex.unlock();
  174. QMessageBox::StandardButton result = QMessageBox::question(NULL, "提示:", "系统即将自检,请确认所有部件都己接好", QMessageBox::Ok|QMessageBox::Abort, QMessageBox::Ok);
  175. switch (result)
  176. {
  177. case QMessageBox::Ok:
  178. qDebug()<<"Ok";
  179. m_pTimer_1->start(1*1000); // 1s
  180. m_bRunning = true;
  181. start();
  182. break;
  183. case QMessageBox::Abort:
  184. qDebug()<<"Abort";
  185. return false;
  186. break;
  187. default:
  188. qDebug()<<"default";
  189. return false;
  190. break;
  191. }
  192. return true;
  193. }
  194. bool TestService::tstop(int compartmentid)
  195. {
  196. if(m_compartmentid != compartmentid-1){
  197. return false;
  198. }
  199. if(m_pTimer_1->isActive())
  200. m_pTimer_1->stop();
  201. //if(m_pTimer_2->isActive())
  202. // m_pTimer_2->stop();
  203. if(m_bRunning){
  204. //stop();
  205. m_bRunning = false;
  206. }
  207. return true;
  208. }
  209. bool TestService::reportpic_Ready(int compartmentid)
  210. {
  211. Compartment& com = m_tank.get_compartment(compartmentid-1);
  212. com.m_bpicReady = true;
  213. return true;
  214. }
  215. bool TestService::check_alltest_ok()
  216. {
  217. bool ret_flag = true;
  218. for(int i=0; i< m_tank.compartment_num; i++){
  219. Compartment& com = m_tank.get_compartment(i);
  220. if(com.m_bpicReady == false ){
  221. ret_flag = false;
  222. break;
  223. }
  224. }
  225. if(false == ret_flag){
  226. QMessageBox::StandardButton result = QMessageBox::question(NULL, "提示:", "有油仓还未进行检测,是否强制生成报告?", QMessageBox::Yes|QMessageBox::No, QMessageBox::No);
  227. switch (result)
  228. {
  229. case QMessageBox::Yes:
  230. ret_flag = true;
  231. break;
  232. case QMessageBox::No:
  233. break;
  234. default:
  235. break;
  236. }
  237. }
  238. return ret_flag;
  239. }
  240. void TestService::receive_reportprogress(QString qstr)
  241. {
  242. qDebug() << "TestService::receive_reportprogress ";
  243. qDebug() << qstr;
  244. emit onGenreportProgress(qstr);
  245. }
  246. bool TestService::genReport(QString word_path, QString pic_dir)
  247. {
  248. if(word_path.contains(".doc")){
  249. return m_report.make_Word(m_tank, word_path, pic_dir);
  250. }else if(word_path.contains(".pdf")){
  251. return m_report.make_PDF(m_tank, word_path, pic_dir);
  252. }
  253. QString str = "word_path invalid!";
  254. qDebug() << str;
  255. return false;
  256. }
  257. QJsonObject TestService::get_vrs_items()
  258. {
  259. return m_tank.get_vrs_items();
  260. }
  261. QJsonObject TestService::get_bls_items()
  262. {
  263. return m_tank.get_bls_items();
  264. }
  265. bool TestService::set_item_result(const QString& jsonStr )
  266. {
  267. return m_tank.set_item_result(jsonStr);
  268. }
  269. unsigned short TestService::Calcrc(const unsigned char *ptr, int count)
  270. {
  271. unsigned short crc;
  272. crc=CRC16_MODBUS((unsigned char *)ptr,count);
  273. return crc;
  274. }
  275. void TestService::SendCmd(QSerialPort* pSerial, QByteArray data)
  276. {
  277. int crc;
  278. //unsigned char buf[128];
  279. crc=Calcrc((unsigned char *)data.data(),data.size());
  280. data.append((crc>>8)&0xff);
  281. data.append(crc&0xff);
  282. if(pSerial==nullptr)
  283. return;
  284. if (pSerial->isOpen())
  285. {
  286. pSerial->write(data);
  287. QString str = QString::fromUtf8("TX: ");
  288. str.append(data.toHex().toUpper());
  289. qDebug("[%s]", str.toStdString().c_str());
  290. }
  291. }
  292. bool TestService::check_crc(QByteArray data)
  293. {
  294. int size = data.size();
  295. unsigned short crc1 =0, crc2= 0;
  296. unsigned char crc_h = data.at(size-2);
  297. //qDebug("crc_h: %x", crc_h);
  298. unsigned char crc_l = data.at(size-1);
  299. // qDebug("crc_l: %x", crc_l);
  300. crc1 = (crc_h <<8) |crc_l;
  301. // qDebug("crc1: %x", crc1);
  302. crc2 = Calcrc((unsigned char *)data.data(),data.size()-2);
  303. // qDebug("crc2: %x", crc2);
  304. if(crc1 == crc2){
  305. return true;
  306. }else{
  307. return false;
  308. }
  309. }
  310. bool TestService::Read_pressure(float& pressure) //FROM COM4
  311. {
  312. QByteArray tx_buf;
  313. //bool ret_flag = true;
  314. char zero = 0x00;
  315. tx_buf.append(PRESSURESENSOR_ADDRESS);
  316. //tx_buf.append(0x03);
  317. tx_buf.append(0x04);
  318. tx_buf.append(zero);
  319. tx_buf.append(zero);
  320. tx_buf.append(zero);
  321. tx_buf.append(0x02);
  322. int crc;
  323. crc=Calcrc((unsigned char *)tx_buf.data(),tx_buf.size());
  324. tx_buf.append((crc>>8)&0xff);
  325. tx_buf.append(crc&0xff);
  326. QByteArray rx_buf;
  327. rx_buf = m_SerialUi4.serialWriteReponse(tx_buf);
  328. if(rx_buf.size() > 0){
  329. if(check_crc(rx_buf)){
  330. char value[4];
  331. value[3] = rx_buf.at(5);
  332. value[2] = rx_buf.at(6);
  333. value[1] = rx_buf.at(3);
  334. value[0] = rx_buf.at(4);
  335. float * p = (float*)value;
  336. pressure = *p;
  337. qDebug("read pressure , the pressure is [%f]", pressure);
  338. push_pressurelist(pressure);
  339. pressure = calculate_averagepressure();
  340. return true;
  341. }else{
  342. //pressure = calculate_averagepressure();
  343. qDebug("Read_pressure <<< check crc failed");
  344. return false;
  345. }
  346. }else{
  347. return false;
  348. }
  349. #if 0
  350. m_Serial4mutex.lock();
  351. SendCmd(m_SerialPort4, tx_buf);
  352. /*
  353. if(!m_SerialPort4->waitForBytesWritten(200)){
  354. qDebug("waitForBytesWritten failed");
  355. m_Serial4mutex.unlock();
  356. return false;
  357. }
  358. */
  359. QSignalSpy spy(m_SerialPort4, SIGNAL(readyRead()));
  360. bool ret = spy.wait(650);
  361. if(ret == true){
  362. QByteArray buffer = m_SerialPort4->readAll();
  363. while (spy.wait(50) == true){
  364. buffer += m_SerialPort4->readAll();
  365. }
  366. if(buffer.size() == 9){
  367. //QString str = QString::fromUtf8("Read_pressure RX: ");
  368. //str.append(buffer.toHex().toUpper());
  369. //qDebug("[%s]", str.toStdString().c_str());
  370. if(!check_crc(buffer)){
  371. pressure = calculate_averagepressure();
  372. ret_flag = false;
  373. }else{
  374. char value[4];
  375. value[3] = buffer.at(5);
  376. value[2] = buffer.at(6);
  377. value[1] = buffer.at(3);
  378. value[0] = buffer.at(4);
  379. float * p = (float*)value;
  380. pressure = *p;
  381. qDebug("read pressure , the pressure is [%f]", pressure);
  382. push_pressurelist(pressure);
  383. pressure = calculate_averagepressure();
  384. }
  385. }else{
  386. QString str = QString::fromUtf8("Read_pressure less than 9 RX: ");
  387. str.append(buffer.toHex().toUpper());
  388. qDebug("[%s]", str.toStdString().c_str());
  389. pressure = calculate_averagepressure();
  390. ret_flag = false;
  391. }
  392. }
  393. else{
  394. qDebug()<<"Read_pressure time out";
  395. pressure = calculate_averagepressure();
  396. ret_flag = false;
  397. }
  398. m_Serial4mutex.unlock();
  399. return ret_flag;
  400. #endif
  401. #if 0
  402. QEventLoop eventLoop;//局部事件循环,不卡
  403. QTimer::singleShot(2000, &eventLoop, &QEventLoop::quit);
  404. QObject::connect(m_SerialPort4, SIGNAL(readyRead()), &eventLoop, SLOT(quit()));
  405. eventLoop.exec();
  406. if(m_SerialPort4->bytesAvailable() > 0)
  407. {
  408. QByteArray buffer;
  409. int count = 2;
  410. while (1)
  411. {
  412. buffer += m_SerialPort4->readAll();
  413. QString str = QString::fromUtf8("Read_pressure RX: ");
  414. str.append(buffer.toHex().toUpper());
  415. qDebug("[%s]", str.toStdString().c_str());
  416. if(buffer.size() == 9){
  417. QString str = QString::fromUtf8("Read_pressure RX: ");
  418. str.append(buffer.toHex().toUpper());
  419. qDebug("[%s]", str.toStdString().c_str());
  420. if(!check_crc(buffer)){
  421. return false;
  422. }
  423. char value[4];
  424. value[3] = buffer.at(5);
  425. value[2] = buffer.at(6);
  426. value[1] = buffer.at(3);
  427. value[0] = buffer.at(4);
  428. float * p = (float*)value;
  429. pressure = *p;
  430. qDebug("read pressure , the pressure is [%f]", pressure);
  431. push_pressurelist(pressure);
  432. pressure = calculate_averagepressure();
  433. return true;
  434. }else if(buffer.size() > 9){
  435. QString str = QString::fromUtf8("Read_pressure big than 9 RX: ");
  436. str.append(buffer.toHex().toUpper());
  437. qDebug("[%s]", str.toStdString().c_str());
  438. return false;
  439. }
  440. if(!m_SerialPort3->waitForReadyRead(5)){
  441. count--;
  442. if(count > 0){
  443. break;
  444. }
  445. }
  446. }
  447. QString str = QString::fromUtf8("Read_pressure timeout RX: ");
  448. str.append(buffer.toHex().toUpper());
  449. qDebug("[%s]", str.toStdString().c_str());
  450. return false;
  451. }
  452. else
  453. {
  454. qInfo()<<m_SerialPort4->portName()<<" no answer ";
  455. QObject::disconnect(m_SerialPort4, SIGNAL(readyRead()), &eventLoop, SLOT(quit()));
  456. return false;
  457. }
  458. #endif
  459. }
  460. void TestService::push_pressurelist(float pressure)
  461. {
  462. m_pressuremutex.lock();
  463. if(m_pressurelist.size() == AVERAGE_PRESSURE_COUNT){
  464. m_pressurelist.removeAt(0);
  465. }
  466. m_pressurelist.append(pressure);
  467. m_pressuremutex.unlock();
  468. }
  469. void TestService::clear_pressurelist()
  470. {
  471. m_pressuremutex.lock();
  472. m_pressurelist.clear(); //用来计算平均压力
  473. m_pressuremutex.unlock();
  474. }
  475. float TestService::calculate_averagepressure()
  476. {
  477. float average = 0.0;
  478. m_pressuremutex.lock();
  479. int n = m_pressurelist.size();
  480. if(n>0){
  481. float sum = 0.0;
  482. for(int i=0; i<n; i++){
  483. sum += m_pressurelist.at(i);
  484. //qDebug("push_pressurelist 333 size[%f]", m_pressurelist.at(i));
  485. }
  486. average = sum/n;
  487. }
  488. m_pressuremutex.unlock();
  489. return average;
  490. }
  491. bool TestService::Adjust_pressure(unsigned short voltage)
  492. {
  493. QByteArray tx_buf;
  494. //bool ret_flag = true;
  495. //char zero = 0x00;
  496. tx_buf.append(ADJUSTVALVE_ADDRESS);
  497. tx_buf.append(0x06);
  498. tx_buf.append(0x20);
  499. tx_buf.append(0x01);
  500. char c_high = (voltage>>8)&0xff;
  501. char c_low = (voltage)&0xff;
  502. tx_buf.append(c_high);
  503. tx_buf.append(c_low);
  504. int crc;
  505. crc=Calcrc((unsigned char *)tx_buf.data(),tx_buf.size());
  506. tx_buf.append((crc>>8)&0xff);
  507. tx_buf.append(crc&0xff);
  508. QByteArray rx_buf;
  509. rx_buf = m_SerialUi3.serialWriteReponse(tx_buf);
  510. if(rx_buf.size() > 0){
  511. if(check_crc(rx_buf)){
  512. return true;
  513. }else{
  514. return false;
  515. }
  516. }else{
  517. return false;
  518. }
  519. #if 0
  520. m_Serial3mutex.lock();
  521. SendCmd(m_SerialPort3, tx_buf);
  522. /*
  523. if(!m_SerialPort3->waitForBytesWritten(100)){
  524. qDebug("waitForBytesWritten failed");
  525. m_Serial3mutex.unlock();
  526. return false;
  527. }
  528. */
  529. #if 1
  530. QSignalSpy spy(m_SerialPort3, SIGNAL(readyRead()));
  531. bool ret = spy.wait(500);
  532. if(ret == true){
  533. QByteArray buffer;
  534. //while (m_SerialPort3->waitForReadyRead(5))
  535. //{
  536. buffer += m_SerialPort3->readAll();
  537. //QString str = QString::fromUtf8("adjust_pressure RX: ");
  538. //str.append(buffer.toHex().toUpper());
  539. //qDebug("[%s]", str.toStdString().c_str());
  540. if(!check_crc(buffer)){
  541. ret_flag = false;
  542. }
  543. }else
  544. {
  545. qInfo()<<m_SerialPort3->portName()<<" no answer ";
  546. ret_flag = true;
  547. }
  548. m_Serial3mutex.unlock();
  549. return ret_flag;
  550. #else
  551. QEventLoop eventLoop;//局部事件循环,不卡界面
  552. QTimer::singleShot(2000, &eventLoop, &QEventLoop::quit);
  553. QObject::connect(m_SerialPort3, SIGNAL(readyRead()), &eventLoop, SLOT(quit()));
  554. eventLoop.exec();
  555. if(m_SerialPort3->bytesAvailable() > 0)
  556. {
  557. QByteArray buffer;
  558. //while (m_SerialPort3->waitForReadyRead(5))
  559. //{
  560. buffer += m_SerialPort3->readAll();
  561. QString str = QString::fromUtf8("adjust_pressure RX: ");
  562. str.append(buffer.toHex().toUpper());
  563. qDebug("[%s]", str.toStdString().c_str());
  564. if(check_crc(buffer)){
  565. return true;
  566. }else{
  567. return false;
  568. }
  569. //}
  570. //return true;
  571. }
  572. else
  573. {
  574. qInfo()<<m_SerialPort3->portName()<<" no answer ";
  575. QObject::disconnect(m_SerialPort3, SIGNAL(readyRead()), &eventLoop, SLOT(quit()));
  576. return false;
  577. }
  578. #endif
  579. #endif
  580. }
  581. bool TestService::Valve_op(Valve_ID id, Valve_OP op)
  582. {
  583. QByteArray tx_buf;
  584. //bool ret_flag = true;
  585. char zero = 0x00;
  586. tx_buf.append(RELAY_ADDRESS);
  587. if(Valve_ID_All == id){
  588. tx_buf.append(0x0F);
  589. tx_buf.append(zero);
  590. tx_buf.append(zero);
  591. tx_buf.append(zero);
  592. tx_buf.append(0x10);
  593. tx_buf.append(0x02);
  594. }else{
  595. tx_buf.append(0x05);
  596. tx_buf.append(zero);
  597. tx_buf.append(static_cast<char>(id));
  598. }
  599. if(Valve_OP_Open == op){
  600. tx_buf.append(0xFF);
  601. tx_buf.append(zero);
  602. }
  603. else{
  604. tx_buf.append(zero);
  605. tx_buf.append(zero);
  606. }
  607. int crc;
  608. crc=Calcrc((unsigned char *)tx_buf.data(),tx_buf.size());
  609. tx_buf.append((crc>>8)&0xff);
  610. tx_buf.append(crc&0xff);
  611. QByteArray rx_buf;
  612. rx_buf = m_SerialUi3.serialWriteReponse(tx_buf);
  613. if(rx_buf.size() > 0){
  614. if(check_crc(rx_buf)){
  615. qDebug("Valve_op ok valve_id[%d], op[%d] ", id, op);
  616. return true;
  617. }else{
  618. qDebug("Valve_op failed valve_id[%d], op[%d] ", id, op);
  619. return false;
  620. }
  621. }else{
  622. qDebug("Valve_op failed valve_id[%d], op[%d] ", id, op);
  623. return false;
  624. }
  625. #if 0
  626. m_Serial3mutex.lock();
  627. SendCmd(m_SerialPort3, tx_buf);
  628. /*
  629. if(!m_SerialPort3->waitForBytesWritten(100)){
  630. qDebug("waitForBytesWritten failed");
  631. m_Serial3mutex.unlock();
  632. return false;
  633. }
  634. */
  635. #if 1
  636. QSignalSpy spy(m_SerialPort3, SIGNAL(readyRead()));
  637. bool ret = spy.wait(500);
  638. if(ret == true){
  639. QByteArray buffer;
  640. //while (m_SerialPort3->waitForReadyRead(5))
  641. //{
  642. buffer += m_SerialPort3->readAll();
  643. //QString str = QString::fromUtf8("adjust_pressure RX: ");
  644. //str.append(buffer.toHex().toUpper());
  645. //qDebug("[%s]", str.toStdString().c_str());
  646. if(!check_crc(buffer)){
  647. ret_flag = false;
  648. }
  649. }else
  650. {
  651. qInfo()<<m_SerialPort3->portName()<<" no answer ";
  652. ret_flag = false;
  653. }
  654. m_Serial3mutex.unlock();
  655. return ret_flag;
  656. #else
  657. QEventLoop eventLoop;//局部事件循环,不卡界面
  658. QTimer::singleShot(2000, &eventLoop, &QEventLoop::quit);
  659. QObject::connect(m_SerialPort3, SIGNAL(readyRead()), &eventLoop, SLOT(quit()));
  660. eventLoop.exec();
  661. if(m_SerialPort3->bytesAvailable() > 0)
  662. {
  663. QByteArray ba;
  664. //while (m_SerialPort3->waitForReadyRead(5))
  665. //{
  666. ba += m_SerialPort3->readAll();
  667. QString str = QString::fromUtf8("adjust_pressure RX: ");
  668. str.append(ba.toHex().toUpper());
  669. qDebug("[%s]", str.toStdString().c_str());
  670. if(check_crc(ba)){
  671. return true;
  672. }else{
  673. return false;
  674. }
  675. //}
  676. //return true;
  677. }
  678. else
  679. {
  680. qInfo()<<m_SerialPort3->portName()<<" no answer ";
  681. QObject::disconnect(m_SerialPort3, SIGNAL(readyRead()), &eventLoop, SLOT(quit()));
  682. return false;
  683. }
  684. #endif
  685. #endif
  686. }
  687. void TestService::valve_open(Valve_ID id)
  688. {
  689. qDebug("valve_open [%d]", id);
  690. Valve_op(id, Valve_OP_Open);
  691. }
  692. void TestService::valve_close(Valve_ID id)
  693. {
  694. qDebug("valve_close [%d]", id);
  695. Valve_op(id, Valve_OP_Close);
  696. }
  697. QString TestService::read_PressureValue()
  698. {
  699. float pressure = 0.0;
  700. static int timeout_count =0;
  701. if(Read_pressure(pressure)){
  702. //qDebug("Read_PressureValue [%f]", pressure);
  703. timeout_count=0;
  704. }else{
  705. pressure = calculate_averagepressure();
  706. qDebug("Read_PressureValue failed");
  707. timeout_count++;
  708. if(timeout_count >= AVERAGE_PRESSURE_COUNT){
  709. //data is to old, clear
  710. clear_pressurelist();
  711. qDebug("clear_pressurelist ");
  712. }
  713. }
  714. QString pressure_str = QString("%1").arg(pressure, 5,'f',3,QLatin1Char('0'));
  715. return pressure_str;
  716. }
  717. void TestService::adjust_Pressure(QString voltage_str)
  718. {
  719. bool ok;
  720. ushort voltage = voltage_str.toUShort(&ok, 10);
  721. qDebug("Add_Pressure [%d]", voltage);
  722. Adjust_pressure(voltage);
  723. }
  724. bool TestService::OpenSerial3()
  725. {
  726. m_SerialPort3 = new QSerialPort();
  727. m_SerialPort3->setPortName("COM3");
  728. m_SerialPort3->setBaudRate(9600, QSerialPort::AllDirections);
  729. m_SerialPort3->setDataBits(QSerialPort::Data8);
  730. m_SerialPort3->setParity(QSerialPort::NoParity);
  731. m_SerialPort3->setStopBits(QSerialPort::OneStop);
  732. //m_SerialPort3->setFlowControl(QSerialPort::NoFlowControl);//Set to no flow control
  733. if (m_SerialPort3->open(QIODevice::ReadWrite) == false){
  734. qDebug("open COM3 failed");
  735. //QMessageBox::warning(this, "警告", "打开串口COM3失败");
  736. QString str = "打开串口COM3失败";
  737. emit onNotice(str);
  738. return false;
  739. }
  740. else
  741. {
  742. //controlserial->close();
  743. //connect(m_SerialPort3,SIGNAL(readyRead()),this,SLOT(ReadSerialport3()));
  744. return true;
  745. }
  746. }
  747. bool TestService::OpenSerial4()
  748. {
  749. m_SerialPort4 = new QSerialPort();
  750. m_SerialPort4->setPortName("COM4");
  751. m_SerialPort4->setBaudRate(9600, QSerialPort::AllDirections);
  752. m_SerialPort4->setDataBits(QSerialPort::Data8);
  753. m_SerialPort4->setParity(QSerialPort::EvenParity);
  754. m_SerialPort4->setStopBits(QSerialPort::OneStop);
  755. m_SerialPort4->setFlowControl(QSerialPort::NoFlowControl);//Set to no flow control
  756. if (m_SerialPort4->open(QIODevice::ReadWrite) == false){
  757. qDebug("open COM4 failed");
  758. //QMessageBox::warning(this, "警告", "打开串口COM4失败");
  759. QString str = "打开串口COM4失败,无法读取压力";
  760. emit onNotice(str);
  761. return false;
  762. }
  763. else
  764. {
  765. //readserial->close();
  766. //connect(m_SerialPort4,SIGNAL(readyRead()),this,SLOT(ReadSerialport4()));
  767. return true;
  768. }
  769. }
  770. void TestService::OnTimer1()
  771. {
  772. float pressure = 0.001;
  773. static int timeout_count =0;
  774. if(Read_pressure(pressure)){
  775. //if(false){
  776. //qDebug("Read_PressureValue [%f]", pressure);
  777. timeout_count=0;
  778. }else{
  779. qDebug("Read_PressureValue failed");
  780. pressure = calculate_averagepressure();
  781. timeout_count++;
  782. if(timeout_count >= AVERAGE_PRESSURE_COUNT){
  783. //data is to old, clear
  784. clear_pressurelist();
  785. qDebug("clear_pressurelist ");
  786. }
  787. }
  788. #if 0
  789. if(timeout_count < 180){
  790. m_stage =Test_Stage_SysTest;
  791. m_step = Test_Step_Start;
  792. //pressure = 0.1 * timeout_count;
  793. if(timeout_count > 60){
  794. m_step = Test_Step_KeepPressure;
  795. //pressure = 0.1 * timeout_count;
  796. }
  797. }else if(timeout_count < 360){
  798. if(timeout_count == 180){
  799. m_tank.m_comparts[m_compartmentid].m_result.sysstart_pressure = 4.5;
  800. m_tank.m_comparts[m_compartmentid].m_result.sysend_pressure = 4.3;
  801. m_tank.m_comparts[m_compartmentid].m_result.delta_sys_pressure = 0.2;
  802. m_tank.m_comparts[m_compartmentid].m_result.pass_sys_pressure = true;
  803. m_tank.m_comparts[m_compartmentid].m_result.sys_test_ok = true;
  804. }
  805. m_stage =Test_Stage_ValveTest;
  806. m_step = Test_Step_Start;
  807. //pressure = 0.1 * timeout_count;
  808. if(timeout_count > 240){
  809. m_step = Test_Step_KeepPressure;
  810. //pressure = 0.1 * timeout_count;
  811. }
  812. }else {
  813. if(timeout_count == 360){
  814. m_tank.m_comparts[m_compartmentid].m_result.valvestart_pressure = 4.5;
  815. m_tank.m_comparts[m_compartmentid].m_result.valveend_pressure = 3.3;
  816. m_tank.m_comparts[m_compartmentid].m_result.delta_valve_pressure = 1.2;
  817. m_tank.m_comparts[m_compartmentid].m_result.pass_valve_pressure = true;
  818. m_tank.m_comparts[m_compartmentid].m_result.valve_test_ok = true;
  819. }
  820. m_step = Test_Step_End;
  821. }
  822. //pressure = 0.1 * timeout_count;
  823. pressure = 3 + 3*sin(M_PI*timeout_count/60);
  824. #endif
  825. int _ipressure = pressure*100;
  826. pressure = _ipressure/100.0;
  827. QString pressure_str = QString("%1").arg(pressure, 4,'f',2,QLatin1Char('0'));
  828. PressureItem item;
  829. //item.m_pressure = pressure_str;
  830. item.m_testDirection = m_direction;
  831. item.m_testStage = m_stage;
  832. item.m_testStep = m_step;
  833. QVariantMap map;
  834. map.clear();
  835. map.insert("pressure", pressure_str);
  836. map.insert("direction", item.m_testDirection);
  837. map.insert("stage", item.m_testStage);
  838. map.insert("step", item.m_testStep);
  839. //QString pressure_str = QString("%1").arg(pressure, 5,'f',3,QLatin1Char('0'));
  840. //m_tank.m_comparts[m_compartmentid].m_currentpressure= pressure_str.toFloat();
  841. emit sigPressure(m_compartmentid+1, map);
  842. }
  843. void TestService::OnTimer2()
  844. {
  845. qDebug("OnTimer2 >>>enter ");
  846. //float pressure;
  847. //Read_pressure(pressure);
  848. QThread::sleep(5);
  849. //emit Pressure_changed(QDateTime::currentDateTime().toString("yyyy-MM-dd hh:mm:ss"));
  850. qDebug("OnTimer2 >>>leave ");
  851. }
  852. Ret_Value TestService::Pressure_RoughAdjust(const TestExpect& expect)
  853. {
  854. Ret_Value ret_v = Ret_OK;
  855. int count = 0;
  856. bool bOpen1 = false;
  857. bool bOpen2 = false;
  858. bool bOpen3 = false;
  859. QElapsedTimer timer;
  860. timer.start();
  861. float current_pressure;
  862. //等待压力达到目标值附近
  863. while(m_bRunning){
  864. current_pressure = calculate_averagepressure();
  865. if(current_pressure >= expect.target+0.1){
  866. count++;
  867. if(bOpen1){
  868. if(Valve_op(Valve_ID_ROUGH_0, Valve_OP_Close))
  869. bOpen1 = false;
  870. }
  871. if(bOpen2){
  872. if(Valve_op(Valve_ID_ROUGH_1, Valve_OP_Close))
  873. bOpen2 = false;
  874. }
  875. if(bOpen3){
  876. if(Valve_op(Valve_ID_ROUGH_2, Valve_OP_Close))
  877. bOpen3 = false;
  878. }
  879. //break;
  880. }else if(current_pressure < expect.target) {
  881. count =0;
  882. if(!bOpen1){
  883. bOpen1 = Valve_op(Valve_ID_ROUGH_0, Valve_OP_Open);
  884. }
  885. if(!bOpen2){
  886. bOpen2 = Valve_op(Valve_ID_ROUGH_1, Valve_OP_Open);
  887. }
  888. if(!bOpen3){
  889. bOpen3 = Valve_op(Valve_ID_ROUGH_2, Valve_OP_Open);
  890. }
  891. }else{
  892. count++;
  893. }
  894. if(count >= 240){ //about 60s
  895. break;
  896. }
  897. QThread::msleep(500);
  898. int remainingtime = expect.timeout*1000 - timer.elapsed();
  899. if(remainingtime <= 0){
  900. qDebug(" add_pressure timeout, Rough valve will colse");
  901. ret_v = Ret_Timeout;
  902. break;
  903. }
  904. }
  905. if(!m_bRunning){
  906. // be stoped
  907. ret_v = Ret_Exit;
  908. }
  909. if(bOpen1){
  910. if(Valve_op(Valve_ID_ROUGH_0, Valve_OP_Close))
  911. bOpen1 = false;
  912. }
  913. if(bOpen2){
  914. if(Valve_op(Valve_ID_ROUGH_1, Valve_OP_Close))
  915. bOpen2 = false;
  916. }
  917. if(bOpen3){
  918. if(Valve_op(Valve_ID_ROUGH_2, Valve_OP_Close))
  919. bOpen3 = false;
  920. }
  921. return ret_v;
  922. }
  923. #if 1
  924. Ret_Value TestService::Pressure_Adjust(const TestExpect& expect)
  925. {
  926. PID pid = PID(1, 20, -10, 5.1, 28.0, 1.0);
  927. float current_pressure;
  928. Ret_Value ret_v = Ret_OK;
  929. int voltage_offset = 0;
  930. int keep_times = 0;
  931. QElapsedTimer timer;
  932. Valve_op(Valve_ID_INTAKE, Valve_OP_Open);
  933. timer.start();
  934. while(m_bRunning){
  935. current_pressure = calculate_averagepressure();
  936. double inc = pid.calculate(expect.target, current_pressure);
  937. voltage_offset = (inc);
  938. if(!Adjust_pressure(expect.start_voltage+voltage_offset)){
  939. QThread::msleep(200);
  940. if(!Adjust_pressure(expect.start_voltage+voltage_offset)){
  941. qDebug("communication error, ajust_pressure failed");
  942. ret_v = Ret_Failed;
  943. break;
  944. }
  945. }
  946. if(abs(current_pressure - (expect.target+0.05)) < 0.05){
  947. keep_times++;
  948. }else{
  949. keep_times=0;
  950. }
  951. if(keep_times >= 15){
  952. break;
  953. }
  954. QThread::msleep(1000);
  955. int remainingtime = expect.timeout*1000 - timer.elapsed();
  956. if(remainingtime < 0){
  957. ret_v = Ret_Timeout;
  958. qDebug("timeout, ajust_pressure failed");
  959. break;
  960. }
  961. }
  962. Valve_op(Valve_ID_INTAKE, Valve_OP_Close);
  963. if(!m_bRunning){
  964. // be stoped
  965. ret_v = Ret_Exit;
  966. }
  967. return ret_v;
  968. }
  969. #else
  970. int TestService::Pressure_Adjust(const TestExpect& expect)
  971. {
  972. float current_pressure;
  973. int keep_times = 0;
  974. bool bValveOpen = false;
  975. int add_base = 5;
  976. int sub_base = 0;
  977. float delta = 0.0; //当前差值
  978. keep_times = 0;
  979. int count_h = 0;
  980. int count_l =0;
  981. short voltage_offset = 0;
  982. QElapsedTimer timer;
  983. timer.start();
  984. int ret_value = 0;
  985. keep_times=0;
  986. while(m_bRunning){
  987. current_pressure = calculate_averagepressure();
  988. if(current_pressure >= expect.target-0.04){
  989. count_l = 0;
  990. delta = current_pressure - expect.target;
  991. if(delta >= 0.08){
  992. keep_times=0;
  993. count_h++;
  994. if(count_h < 30){
  995. if(bValveOpen){
  996. if(Valve_op(Valve_ID_INTAKE, Valve_OP_Close))
  997. bValveOpen = false;
  998. qDebug("ajust_pressure IntakeValve close return[%d] ", bValveOpen == true? 1:0);
  999. }
  1000. }
  1001. qDebug("ajust_pressure count_h[%d] ", count_h);
  1002. if(count_h > 30){
  1003. voltage_offset = 0;
  1004. qDebug("ajust_pressure , voltage: %d \n", expect.start_voltage+voltage_offset);
  1005. if(!Adjust_pressure(expect.start_voltage+voltage_offset)){
  1006. QThread::msleep(200);
  1007. if(!Adjust_pressure(expect.start_voltage+voltage_offset)){
  1008. qDebug("communication error, ajust_pressure failed");
  1009. }
  1010. }
  1011. if(false == bValveOpen){
  1012. bValveOpen = Valve_op(Valve_ID_INTAKE, Valve_OP_Open);
  1013. qDebug("ajust_pressure IntakeValve open return[%d] ", bValveOpen == true? 1:0);
  1014. }
  1015. }
  1016. }else{
  1017. keep_times++;
  1018. //count_h=0;
  1019. if(count_h > 30){
  1020. if(delta > 0.05){
  1021. if(bValveOpen){
  1022. if(Valve_op(Valve_ID_INTAKE, Valve_OP_Close))
  1023. bValveOpen = false;
  1024. }
  1025. }else if(){
  1026. }
  1027. }
  1028. }
  1029. }else {
  1030. keep_times=0;
  1031. count_h=0;
  1032. count_l++;
  1033. delta = expect.target - current_pressure;
  1034. if(delta > 0.0){
  1035. int k = count_l/30;
  1036. if(voltage_offset != (add_base+k*1)){
  1037. voltage_offset = add_base+k*1;
  1038. //add_base = voltage_offset;
  1039. qDebug("ajust_pressure voltage: %d \n", expect.start_voltage+voltage_offset);
  1040. if(!Adjust_pressure(expect.start_voltage+voltage_offset)){
  1041. QThread::msleep(200);
  1042. if(!Adjust_pressure(expect.start_voltage+voltage_offset)){
  1043. qDebug("communication error, ajust_pressure failed");
  1044. }
  1045. }
  1046. }
  1047. if(false == bValveOpen){
  1048. bValveOpen = Valve_op(Valve_ID_INTAKE, Valve_OP_Open);
  1049. qDebug("ajust_pressure IntakeValve open return[%d] ", bValveOpen == true? 1:0);
  1050. }
  1051. }
  1052. }
  1053. qDebug("ajust_pressure keep_times [%d] ", keep_times);
  1054. if(keep_times >= 30){
  1055. break;
  1056. }
  1057. QThread::msleep(500);
  1058. int remainingtime = expect.timeout*1000 - timer.elapsed();
  1059. if(remainingtime < 0){
  1060. ret_value = -1;
  1061. qDebug("timeout, ajust_pressure failed");
  1062. break;
  1063. }
  1064. }
  1065. if(!m_bRunning){
  1066. // be stoped
  1067. return 1;
  1068. }
  1069. return ret_value;
  1070. }
  1071. #endif
  1072. Ret_Value TestService::Pressure_Relief(const TestExpect& expect)
  1073. {
  1074. Ret_Value ret_v = Ret_OK;
  1075. //打开泄压阀
  1076. if(!Valve_op(Valve_ID_VENT, Valve_OP_Open)){
  1077. QThread::msleep(200);
  1078. if(!Valve_op(Valve_ID_VENT, Valve_OP_Open)){
  1079. qDebug("Pressure_Relief faile, valve communicate failed");
  1080. ret_v = Ret_Failed;
  1081. return ret_v;
  1082. }
  1083. }
  1084. //等待压力清零
  1085. float last_pressure = calculate_averagepressure();
  1086. float current_pressure;
  1087. int keep_count = 0;
  1088. while(m_bRunning){
  1089. QThread::msleep(1000);
  1090. current_pressure = calculate_averagepressure();
  1091. if(abs(current_pressure-last_pressure) < 0.02){
  1092. keep_count++;
  1093. if(keep_count > 15){
  1094. break;
  1095. }
  1096. }else{
  1097. keep_count = 0;
  1098. }
  1099. last_pressure = current_pressure;
  1100. }
  1101. //关闭泄压阀
  1102. if(!Valve_op(Valve_ID_VENT, Valve_OP_Close)){
  1103. if(!Valve_op(Valve_ID_VENT, Valve_OP_Close)){
  1104. qDebug("Pressure_Relief faile, valve communicate failed");
  1105. ret_v = Ret_Failed;
  1106. return ret_v;
  1107. }
  1108. }
  1109. if(!m_bRunning){
  1110. ret_v = Ret_Exit;
  1111. }
  1112. return ret_v;
  1113. }
  1114. Ret_Value TestService::Pressure_Keep(int keeptime, float threshold, float& delta)
  1115. {
  1116. int count = 0;
  1117. Ret_Value ret_v = Ret_OK;
  1118. float start_pressure = calculate_averagepressure();
  1119. while((count < keeptime) && m_bRunning){
  1120. QThread::msleep(1000);
  1121. count++;
  1122. }
  1123. if(!m_bRunning){
  1124. // be stoped
  1125. //return 1;
  1126. ret_v = Ret_Exit;
  1127. }else{
  1128. delta = start_pressure - calculate_averagepressure();
  1129. if(abs(delta) <= threshold){
  1130. ret_v = Ret_OK;
  1131. }else{
  1132. ret_v = Ret_Failed;
  1133. }
  1134. }
  1135. return ret_v;
  1136. }
  1137. int TestService::make_messagebox(Test_Direction direction, Test_Step step, Ret_Value ret_v)
  1138. {
  1139. int ret_btn = QMessageBox::NoButton;
  1140. QString notice_str;
  1141. if(Test_Direction_Positive == direction){
  1142. switch(step){
  1143. case Test_Step_AddPressure:
  1144. if(Ret_Timeout == ret_v){
  1145. notice_str = "加压超时, 是否重试?";
  1146. ret_btn = m_msgbox.information(NULL, "提示:", notice_str, QMessageBox::Retry|QMessageBox::Abort, QMessageBox::Retry);
  1147. }else if(Ret_Failed == ret_v){
  1148. notice_str = "继电器通信失败, 和序终止";
  1149. ret_btn = m_msgbox.information(NULL, "提示:", notice_str, QMessageBox::Ok, QMessageBox::Ok);
  1150. }
  1151. break;
  1152. case Test_Step_AdjustPressure:
  1153. if( Ret_Timeout == ret_v ){
  1154. notice_str = "比例阀调压精调超时, 是否重试?";
  1155. ret_btn = m_msgbox.information(NULL, "提示:", notice_str, QMessageBox::Retry|QMessageBox::Abort, QMessageBox::Retry);
  1156. //emit onNotice(notice_str);
  1157. }else if(Ret_Failed == ret_v){
  1158. notice_str = "继电器通信失败, 程序终止";
  1159. ret_btn = m_msgbox.information(NULL, "提示:", notice_str, QMessageBox::Ok, QMessageBox::Ok);
  1160. //emit onNotice(notice_str);
  1161. }
  1162. break;
  1163. default:
  1164. break;
  1165. }
  1166. }else {
  1167. }
  1168. return ret_btn;
  1169. }
  1170. void TestService::run()
  1171. {
  1172. qDebug("doTest >>>enter ");
  1173. QString notice_str;
  1174. QElapsedTimer q_time;
  1175. int ret_btn = QMessageBox::NoButton;
  1176. TestExpect texpect;
  1177. bool bQuit = false;
  1178. q_time.start();
  1179. Ret_Value ret_v = Ret_OK;
  1180. #if 0
  1181. while(m_bRunning){
  1182. QThread::sleep(4);
  1183. int ret = m_msgbox.warning(NULL, "提示:", "请打开旋拧阀给系统加压", QMessageBox::Retry|QMessageBox::Abort, QMessageBox::Abort);
  1184. switch (ret)
  1185. {
  1186. case QMessageBox::Ok:
  1187. qDebug()<<"111 OK";
  1188. break;
  1189. case QMessageBox::Retry:
  1190. qDebug()<<"111 Retry";
  1191. break;
  1192. case QMessageBox::Abort:
  1193. qDebug()<<"111 Abort";
  1194. break;
  1195. default:
  1196. qDebug()<<"111 default";
  1197. break;
  1198. }
  1199. }
  1200. #else
  1201. if(m_compartmentid >= 0){
  1202. if(m_direction == Test_Direction_Positive){
  1203. while(m_bRunning && (bQuit == false)){
  1204. switch(m_step){
  1205. case Test_Step_Start:
  1206. {
  1207. m_tank.get_compartment(m_compartmentid).clear_result();
  1208. // close all valves
  1209. Valve_op(Valve_ID_All, Valve_OP_Close);
  1210. ret_btn = m_msgbox.information(NULL, "提示:", "请打开旋拧阀给系统加压", QMessageBox::Ok, QMessageBox::Ok);
  1211. switch (ret_btn)
  1212. {
  1213. case QMessageBox::Ok:
  1214. qDebug()<<"Yes";
  1215. // 打开压力传感阀
  1216. Valve_op(Valve_ID_PRESSURESENSOR, Valve_OP_Open);
  1217. // 如果容积大于 1000L , 才进入粗调步骤
  1218. if(m_tank.get_compartment(m_compartmentid).m_volume >= 1000){
  1219. m_step = Test_Step_AddPressure;
  1220. }else{
  1221. m_step = Test_Step_AdjustPressure;
  1222. }
  1223. break;
  1224. default:
  1225. break;
  1226. }
  1227. }
  1228. break;
  1229. case Test_Step_AddPressure:
  1230. {
  1231. if(m_stage == Test_Stage_SysTest){
  1232. emit sigState(m_compartmentid+1, "回收系统测试,开始加压", "");
  1233. }else{
  1234. emit sigState(m_compartmentid+1, "回收阀测试,开始加压", "");
  1235. }
  1236. texpect.target = 4.50;
  1237. texpect.timeout = m_tank.m_comparts[m_compartmentid].get_Roughadjust_timeout();
  1238. ret_v = Pressure_RoughAdjust(texpect);
  1239. if(Ret_OK == ret_v){
  1240. //m_step = Test_Step_AdjustPressure;
  1241. //m_step = Test_Step_KeepPressure;
  1242. if(m_stage == Test_Stage_SysTest){
  1243. m_step = Test_Step_KeepPressure;
  1244. }else if(m_stage == Test_Stage_ValveTest){
  1245. m_step = Test_Step_reliefPressure;
  1246. }
  1247. }else if(Ret_Exit == ret_v){
  1248. bQuit = true;
  1249. }else{
  1250. ret_btn = make_messagebox(m_direction, m_step, ret_v);
  1251. switch (ret_btn)
  1252. {
  1253. case QMessageBox::Retry:
  1254. qDebug()<<"Retry";
  1255. break;
  1256. case QMessageBox::Abort:
  1257. qDebug()<<"Abort";
  1258. bQuit = true;
  1259. break;
  1260. case QMessageBox::Ok:
  1261. qDebug()<<"OK";
  1262. bQuit = true;
  1263. break;
  1264. default:
  1265. break;
  1266. }
  1267. }
  1268. #if 0
  1269. if(ret_v < 0){
  1270. ret_btn = QMessageBox::NoButton;
  1271. if( -1 == state ){
  1272. notice_str = "加压超时, 是否重试?";
  1273. ret_btn = m_msgbox.information(NULL, "提示:", notice_str, QMessageBox::Retry|QMessageBox::Abort, QMessageBox::Retry);
  1274. //emit onNotice(notice_str);
  1275. }else if(-2 == state){
  1276. notice_str = "继电器读写不成功, 和序终止";
  1277. ret_btn = m_msgbox.information(NULL, "提示:", notice_str, QMessageBox::Ok, QMessageBox::Ok);
  1278. //emit onNotice(notice_str);
  1279. }
  1280. qDebug() << notice_str;
  1281. //ret_btn = QMessageBox::information(NULL, "提示:", notice_str, QMessageBox::Yes|QMessageBox::No, QMessageBox::Yes);
  1282. switch (ret_btn)
  1283. {
  1284. case QMessageBox::Retry:
  1285. qDebug()<<"Retry";
  1286. break;
  1287. case QMessageBox::Abort:
  1288. qDebug()<<"Abort";
  1289. bQuit = true;
  1290. break;
  1291. case QMessageBox::Ok:
  1292. qDebug()<<"OK";
  1293. bQuit = true;
  1294. break;
  1295. default:
  1296. break;
  1297. }
  1298. }else{
  1299. m_step = Test_Step_AdjustPressure;
  1300. }
  1301. #endif
  1302. }
  1303. break;
  1304. case Test_Step_AdjustPressure:
  1305. {
  1306. if(m_stage == Test_Stage_SysTest){
  1307. emit sigState(m_compartmentid+1, "回收系统测试,开始调压", "");
  1308. }else{
  1309. emit sigState(m_compartmentid+1, "回收阀测试,开始调压", "");
  1310. }
  1311. texpect.start_voltage = 175;
  1312. texpect.target = 4.50;
  1313. texpect.timeout = m_tank.m_comparts[m_compartmentid].get_adjust_timeout();
  1314. ret_v = Pressure_Adjust(texpect);
  1315. if(Ret_OK == ret_v){
  1316. if(m_stage == Test_Stage_SysTest){
  1317. m_step = Test_Step_KeepPressure;
  1318. }else if(m_stage == Test_Stage_ValveTest){
  1319. m_step = Test_Step_reliefPressure;
  1320. }
  1321. }else if(Ret_Exit == ret_v){
  1322. bQuit = true;
  1323. }else{
  1324. ret_btn = make_messagebox(m_direction, m_step, ret_v);
  1325. switch (ret_btn)
  1326. {
  1327. case QMessageBox::Retry:
  1328. qDebug()<<"Retry";
  1329. break;
  1330. case QMessageBox::Abort:
  1331. qDebug()<<"Abort";
  1332. bQuit = true;
  1333. break;
  1334. case QMessageBox::Ok:
  1335. qDebug()<<"OK";
  1336. bQuit = true;
  1337. break;
  1338. default:
  1339. break;
  1340. }
  1341. }
  1342. #if 0
  1343. if(state < 0){
  1344. ret_btn = QMessageBox::NoButton;
  1345. if( -1 == state ){
  1346. notice_str = "比例阀调压超时, 是否重试?";
  1347. ret_btn = m_msgbox.information(NULL, "提示:", notice_str, QMessageBox::Retry|QMessageBox::Abort, QMessageBox::Retry);
  1348. //emit onNotice(notice_str);
  1349. }else if(-2 == state){
  1350. notice_str = "继电器读写不成功, 程序终止";
  1351. ret_btn = m_msgbox.information(NULL, "提示:", notice_str, QMessageBox::Ok, QMessageBox::Ok);
  1352. //emit onNotice(notice_str);
  1353. }
  1354. qDebug() << notice_str;
  1355. //ret_btn = QMessageBox::information(NULL, "提示:", notice_str, QMessageBox::Yes|QMessageBox::No, QMessageBox::Yes);
  1356. switch (ret_btn)
  1357. {
  1358. case QMessageBox::Retry:
  1359. qDebug()<<"Retry";
  1360. break;
  1361. case QMessageBox::Abort:
  1362. qDebug()<<"Abort";
  1363. bQuit = true;
  1364. break;
  1365. case QMessageBox::Ok:
  1366. qDebug()<<"OK";
  1367. bQuit = true;
  1368. break;
  1369. default:
  1370. break;
  1371. }
  1372. }else{
  1373. if(m_stage == Test_Stage_SysTest){
  1374. m_step = Test_Step_KeepPressure;
  1375. }else if(m_stage == Test_Stage_ValveTest){
  1376. m_step = Test_Step_reliefPressure;
  1377. }
  1378. }
  1379. #endif
  1380. }
  1381. break;
  1382. case Test_Step_KeepPressure:
  1383. {
  1384. if(m_stage == Test_Stage_SysTest){
  1385. emit sigState(m_compartmentid+1, "回收系统测试,开始保压", "");
  1386. }else{
  1387. emit sigState(m_compartmentid+1, "回收阀测试,开始保压", "");
  1388. }
  1389. // 检测 5分钟都没超限,就是通过了
  1390. float delta = 0;
  1391. float threshold = 0.0;
  1392. bool bPassed = true;
  1393. if(m_stage == Test_Stage_SysTest){
  1394. threshold = m_tank.m_comparts[m_compartmentid].m_standarditem.system_threshold;
  1395. m_tank.m_comparts[m_compartmentid].m_result.sysstart_pressure = calculate_averagepressure();
  1396. ret_v = Pressure_Keep(5*60, threshold, delta);
  1397. m_tank.m_comparts[m_compartmentid].m_result.sysend_pressure = calculate_averagepressure();
  1398. m_tank.m_comparts[m_compartmentid].m_result.delta_sys_pressure = delta;
  1399. if(Ret_Exit == ret_v){
  1400. bQuit = true;
  1401. } else {
  1402. if(Ret_OK == ret_v){
  1403. //正压测试通过
  1404. bPassed = true;
  1405. m_tank.m_comparts[m_compartmentid].m_result.pass_sys_pressure = true;
  1406. } else{
  1407. //notice_str = "油气回收系统密封性,测试未通过";
  1408. bPassed = false;
  1409. m_tank.m_comparts[m_compartmentid].m_result.pass_sys_pressure = false;
  1410. }
  1411. m_tank.m_comparts[m_compartmentid].m_result.sys_test_ok = true;
  1412. QString delta_str = QString("%1").arg(delta, 4,'f',2,QLatin1Char('0'));
  1413. emit sigSystemResult(m_compartmentid+1, delta_str, bPassed);
  1414. emit sigState(m_compartmentid+1, "回收系统检测,结束", "");
  1415. ret_btn = QMessageBox::NoButton;
  1416. notice_str = "系统密闭性已经检测完成,是否进行阀门密闭性检测?";
  1417. ret_btn = m_msgbox.information(NULL, "提示:", notice_str, QMessageBox::Yes|QMessageBox::No, QMessageBox::Yes);
  1418. switch (ret_btn)
  1419. {
  1420. case QMessageBox::Yes:
  1421. m_stage = Test_Stage_ValveTest;
  1422. if(calculate_averagepressure() < 4.50){
  1423. m_step = Test_Step_AddPressure;
  1424. }else{
  1425. m_step = Test_Step_reliefPressure; //如果压力还在4.5以上, 可以不调压
  1426. }
  1427. break;
  1428. case QMessageBox::No:
  1429. m_step = Test_Step_End;
  1430. break;
  1431. default:
  1432. break;
  1433. }
  1434. }
  1435. }else{
  1436. threshold = m_tank.m_comparts[m_compartmentid].m_standarditem.valve_threshold;
  1437. m_tank.m_comparts[m_compartmentid].m_result.valvestart_pressure = calculate_averagepressure();
  1438. ret_v = Pressure_Keep(5*60, threshold, delta);
  1439. m_tank.m_comparts[m_compartmentid].m_result.valveend_pressure = calculate_averagepressure();
  1440. m_tank.m_comparts[m_compartmentid].m_result.delta_valve_pressure = delta;
  1441. if(Ret_Exit == ret_v){
  1442. bQuit = true;
  1443. }else {
  1444. if(Ret_OK == ret_v){
  1445. m_tank.m_comparts[m_compartmentid].m_result.pass_valve_pressure = true;
  1446. bPassed = true;
  1447. }else{
  1448. m_tank.m_comparts[m_compartmentid].m_result.pass_valve_pressure = false;
  1449. bPassed = false;
  1450. }
  1451. m_tank.m_comparts[m_compartmentid].m_result.valve_test_ok = true;
  1452. QString delta_str = QString("%1").arg(delta, 4,'f',2,QLatin1Char('0'));
  1453. emit sigValveResult(m_compartmentid+1, delta_str, bPassed);
  1454. emit sigState(m_compartmentid+1, "回收阀测试,结束", "");
  1455. m_step = Test_Step_End;
  1456. }
  1457. }
  1458. }
  1459. break;
  1460. case Test_Step_reliefPressure:
  1461. {
  1462. ret_btn = m_msgbox.information(NULL, "提示:", "请确认已经关闭油气回收阀。", QMessageBox::Ok, QMessageBox::Ok);
  1463. switch (ret_btn)
  1464. {
  1465. case QMessageBox::Ok:
  1466. break;
  1467. default:
  1468. break;
  1469. }
  1470. if(m_stage == Test_Stage_SysTest){
  1471. emit sigState(m_compartmentid+1, "油气回收系统测试,开始泄压", "");
  1472. }else{
  1473. emit sigState(m_compartmentid+1, "油气回收阀测试,开始泄压", "");
  1474. }
  1475. texpect.start_voltage = 0;
  1476. texpect.target = 0.0;
  1477. texpect.timeout = 0;//m_tank.m_comparts[m_compartmentid].get_adjust_timeout();
  1478. ret_v = Pressure_Relief(texpect);
  1479. if(Ret_Exit == ret_v){
  1480. bQuit = true;
  1481. }else if(Ret_OK == ret_v){
  1482. m_step = Test_Step_KeepPressure;
  1483. }else{
  1484. ret_btn = QMessageBox::NoButton;
  1485. if(Ret_Timeout == ret_v){
  1486. notice_str = "泄压超时, 是否重试?";
  1487. ret_btn = m_msgbox.information(NULL, "提示:", notice_str, QMessageBox::Retry|QMessageBox::Abort, QMessageBox::Retry);
  1488. }else{
  1489. notice_str = "继电器通信失败, 程序终止";
  1490. ret_btn = m_msgbox.information(NULL, "提示:", notice_str, QMessageBox::Ok, QMessageBox::Ok);
  1491. }
  1492. switch (ret_btn)
  1493. {
  1494. case QMessageBox::Retry:
  1495. break;
  1496. case QMessageBox::Abort:
  1497. bQuit = true;
  1498. break;
  1499. case QMessageBox::Ok:
  1500. bQuit = true;
  1501. break;
  1502. default:
  1503. break;
  1504. }
  1505. }
  1506. }
  1507. break;
  1508. default:
  1509. break;
  1510. }
  1511. if(Test_Step_End == m_step){
  1512. break;
  1513. }
  1514. }
  1515. }else{
  1516. //负压测试, 暂不支持
  1517. m_stage = Test_Stage_SysTest;
  1518. qDebug(" negative test is not support now ");
  1519. }
  1520. }else{
  1521. //self test
  1522. if(m_direction == Test_Direction_Positive){
  1523. while(m_bRunning && (bQuit == false)){
  1524. switch(m_step){
  1525. case Test_Step_Start:
  1526. {
  1527. emit sigState(m_compartmentid+1, "开始", "");
  1528. int errors = 0;
  1529. // close all valves
  1530. errors = Valve_op(Valve_ID_All, Valve_OP_Close)? 0:1;
  1531. if(errors > 0){
  1532. ret_btn = m_msgbox.information(NULL, "提示:", "继电器通信故障,请终止程序", QMessageBox::Abort, QMessageBox::Abort);
  1533. }else{
  1534. ret_btn = m_msgbox.information(NULL, "提示:", "请确认已经打开旋拧阀给系统施缓慢加压", QMessageBox::Ok, QMessageBox::Ok);
  1535. }
  1536. switch (ret_btn)
  1537. {
  1538. case QMessageBox::Ok:
  1539. qDebug()<<"Yes";
  1540. // 打开压力传感阀
  1541. Valve_op(Valve_ID_PRESSURESENSOR, Valve_OP_Open);
  1542. m_step = Test_Step_AdjustPressure;
  1543. break;
  1544. case QMessageBox::Abort:
  1545. bQuit = true;
  1546. break;
  1547. }
  1548. }
  1549. break;
  1550. case Test_Step_AdjustPressure:
  1551. {
  1552. emit sigState(m_compartmentid+1, "调压", "");
  1553. QThread::msleep(2000);
  1554. texpect.start_voltage = 175;
  1555. texpect.target = 4.50;
  1556. texpect.timeout = 10*60; //10分钟
  1557. ret_v = Pressure_Adjust(texpect);
  1558. if(Ret_Exit == ret_v){
  1559. bQuit = true;
  1560. }else if(Ret_OK == ret_v){
  1561. m_step = Test_Step_KeepPressure;
  1562. }else{
  1563. ret_btn = QMessageBox::NoButton;
  1564. if(Ret_Timeout == ret_v){
  1565. notice_str = "比例阀调压超时, 是否重试?";
  1566. ret_btn = m_msgbox.information(NULL, "提示:", notice_str, QMessageBox::Retry|QMessageBox::Abort, QMessageBox::Retry);
  1567. }else{
  1568. notice_str = "继电器通信失败, 程序终止";
  1569. ret_btn = m_msgbox.information(NULL, "提示:", notice_str, QMessageBox::Ok, QMessageBox::Ok);
  1570. }
  1571. switch (ret_btn)
  1572. {
  1573. case QMessageBox::Retry:
  1574. break;
  1575. case QMessageBox::Abort:
  1576. bQuit = true;
  1577. break;
  1578. case QMessageBox::Ok:
  1579. bQuit = true;
  1580. break;
  1581. default:
  1582. break;
  1583. }
  1584. }
  1585. }
  1586. break;
  1587. case Test_Step_KeepPressure:
  1588. {
  1589. emit sigState(m_compartmentid+1, "保压", "");
  1590. // 检测 5分钟都没超限,就是通过了
  1591. float delta = 0;
  1592. float threshold = 0.2;
  1593. bool bPassed = true;
  1594. ret_v = Pressure_Keep(5*60, threshold, delta);
  1595. if(Ret_Exit == ret_v){
  1596. bQuit = true;
  1597. }else{
  1598. if(Ret_OK == ret_v){
  1599. bPassed = true;
  1600. }else{
  1601. bPassed = false;
  1602. }
  1603. QString delta_str = QString("%1").arg(delta, 4,'f',2,QLatin1Char('0'));
  1604. emit sigSelfTestResult(m_compartmentid+1, delta_str, bPassed);
  1605. emit sigState(m_compartmentid+1, "结束", "");
  1606. m_step = Test_Step_End;
  1607. }
  1608. }
  1609. break;
  1610. default:
  1611. break;
  1612. }
  1613. if(Test_Step_End == m_step){
  1614. break;
  1615. }
  1616. }
  1617. }else{ //negtive
  1618. }
  1619. }
  1620. if(Test_Step_End == m_step){
  1621. ret_btn = m_msgbox.information(NULL, "提示:", "栓测任务结束,是否要泄压?", QMessageBox::Yes|QMessageBox::No, QMessageBox::Yes);
  1622. }else{
  1623. if(true == bQuit){
  1624. if(Ret_Exit == ret_v){ // 主动退出
  1625. ret_btn = m_msgbox.information(NULL, "提示:", "程序退出,是否要泄压?", QMessageBox::Yes|QMessageBox::No, QMessageBox::Yes);
  1626. }else if(Ret_Timeout == ret_v){ // 超时退出
  1627. ret_btn = m_msgbox.information(NULL, "提示:", "程序退出,是否要泄压?", QMessageBox::Yes|QMessageBox::No, QMessageBox::Yes);
  1628. }else{//通信错误退出
  1629. ret_btn = m_msgbox.information(NULL, "提示:", "程序退出,是否要泄压?", QMessageBox::Yes|QMessageBox::No, QMessageBox::Yes);
  1630. }
  1631. }
  1632. }
  1633. switch (ret_btn)
  1634. {
  1635. case QMessageBox::Yes:
  1636. qDebug()<<"Yes";
  1637. // 打开泄压阀
  1638. Valve_op(Valve_ID_VENT, Valve_OP_Open);
  1639. break;
  1640. default:
  1641. break;
  1642. }
  1643. if(m_bRunning){
  1644. m_bRunning = false;
  1645. emit sigStop(m_compartmentid+1);
  1646. }else{
  1647. }
  1648. // 关闭压力传感阀
  1649. //Valve_op(Valve_ID_PRESSURESENSOR, Valve_OP_Close);
  1650. // 复位
  1651. Adjust_pressure(0);
  1652. //m_pTimer_1->stop();
  1653. #endif
  1654. qDebug("doTest >>>leave ");
  1655. }