Calibrationpara.cpp 16 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612
  1. #include "Calibrationpara.h"
  2. #include <QDebug>
  3. #include <QJsonDocument>
  4. #include <QJsonArray>
  5. #include <QJsonObject>
  6. #include <QByteArray>
  7. #include <QFile>
  8. #include <algorithm>
  9. ParaItem::ParaItem(){
  10. max_volume = 0; // L per unit
  11. keep_time = 0; // s
  12. outermax = 0;
  13. outermin = 0;
  14. outerkp = 0;
  15. outerki = 0;
  16. outerkd = 0;
  17. innermax = 0;
  18. innermin = 0;
  19. innerkp = 0;
  20. innerki = 0;
  21. innerkd = 0;
  22. innermaxI = 0;
  23. innerIstep = 0;
  24. innerDstep = 0;
  25. }
  26. ParaItem::~ParaItem()
  27. {
  28. }
  29. bool sortByVolume(const ParaItem& item1, const ParaItem& item2){
  30. return (item1.max_volume < item2.max_volume); //升序排列
  31. }
  32. static CalibrationPara* _calibrationPara = nullptr;
  33. CalibrationPara::CalibrationPara(QObject* parent)
  34. :QObject(parent)
  35. {
  36. }
  37. CalibrationPara::~CalibrationPara(){
  38. }
  39. CalibrationPara* CalibrationPara::instance(){
  40. if(nullptr == _calibrationPara){
  41. _calibrationPara = new CalibrationPara();
  42. }
  43. return _calibrationPara;
  44. }
  45. void CalibrationPara::init()
  46. {
  47. m_paras.clear();
  48. load_parameters();
  49. if(m_paras.empty()){
  50. add_default();
  51. save_parameters();
  52. }
  53. std::sort(m_paras.begin(), m_paras.end(), sortByVolume);
  54. }
  55. QJsonObject CalibrationPara::get_paras()
  56. {
  57. QJsonArray pidArray;
  58. //QJsonArray itemArray;
  59. QJsonObject rootObj;
  60. int count = static_cast<int>(m_paras.size());
  61. //if(count > 5){
  62. // count=5;
  63. //}
  64. qDebug() << "m_paras.size:" << count;
  65. rootObj.insert("count", count);
  66. for(int i=0; i < count; i++){
  67. QJsonObject stdObj;
  68. stdObj.insert("max_volume", m_paras[i].max_volume);
  69. stdObj.insert("keep_time", m_paras[i].keep_time);
  70. stdObj.insert("outermax", m_paras[i].outermax);
  71. stdObj.insert("outermin", m_paras[i].outermin);
  72. stdObj.insert("outerkp", m_paras[i].outerkp);
  73. stdObj.insert("outerki", m_paras[i].outerki);
  74. stdObj.insert("outerkd", m_paras[i].outerkd);
  75. stdObj.insert("innermax", m_paras[i].innermax);
  76. stdObj.insert("innermin", m_paras[i].innermin);
  77. stdObj.insert("innerkp", m_paras[i].innerkp);
  78. stdObj.insert("innerki", m_paras[i].innerki);
  79. stdObj.insert("innerkd", m_paras[i].innerkd);
  80. stdObj.insert("innermaxI", m_paras[i].innermaxI);
  81. stdObj.insert("innerIstep", m_paras[i].innerIstep);
  82. stdObj.insert("innerDstep", m_paras[i].innerDstep);
  83. pidArray.append(stdObj);
  84. }
  85. rootObj.insert("pids", pidArray);
  86. return rootObj;
  87. }
  88. bool CalibrationPara::set_paras(const QString& jsonStr)
  89. {
  90. QJsonDocument jsonDoc = QJsonDocument::fromJson(jsonStr.toUtf8());
  91. QJsonObject jsonObj = jsonDoc.object();
  92. QJsonArray jsonArray;
  93. if(jsonObj.contains("pids") && jsonObj.value("pids").isArray()){
  94. jsonArray = jsonObj.value("pids").toArray();
  95. m_paras.clear();
  96. for(int i=0; i < jsonArray.size(); i++){
  97. ParaItem para;
  98. QJsonObject childObj = jsonArray[i].toObject();
  99. if(childObj.contains("max_volume") && childObj.value("max_volume").isDouble()){
  100. para.max_volume = childObj.value("max_volume").toDouble();
  101. }
  102. if(childObj.contains("keep_time") && childObj.value("keep_time").isDouble()){
  103. para.keep_time = childObj.value("keep_time").toDouble();
  104. }
  105. if(childObj.contains("outermax") && childObj.value("outermax").isDouble()){
  106. para.outermax = childObj.value("outermax").toDouble();
  107. }
  108. if(childObj.contains("outermin") && childObj.value("outermin").isDouble()){
  109. para.outermin = childObj.value("outermin").toDouble();
  110. }
  111. if(childObj.contains("outerkp") && childObj.value("outerkp").isDouble()){
  112. para.outerkp = childObj.value("outerkp").toDouble();
  113. }
  114. if(childObj.contains("outerki") && childObj.value("outerki").isDouble()){
  115. para.outerki = childObj.value("outerki").toDouble();
  116. }
  117. if(childObj.contains("outerkd") && childObj.value("outerkd").isDouble()){
  118. para.outerkd = childObj.value("outerkd").toDouble();
  119. }
  120. if(childObj.contains("innermax") && childObj.value("innermax").isDouble()){
  121. para.innermax = childObj.value("innermax").toDouble();
  122. }
  123. if(childObj.contains("innermin") && childObj.value("innermin").isDouble()){
  124. para.innermin = childObj.value("innermin").toDouble();
  125. }
  126. if(childObj.contains("innerkp") && childObj.value("innerkp").isDouble()){
  127. para.innerkp = childObj.value("innerkp").toDouble();
  128. }
  129. if(childObj.contains("innerki") && childObj.value("innerki").isDouble()){
  130. para.innerki = childObj.value("innerki").toDouble();
  131. }
  132. if(childObj.contains("innerkd") && childObj.value("innerkd").isDouble()){
  133. para.innerkd = childObj.value("innerkd").toDouble();
  134. }
  135. if(childObj.contains("innermaxI") && childObj.value("innermaxI").isDouble()){
  136. para.innermaxI = childObj.value("innermaxI").toDouble();
  137. }
  138. if(childObj.contains("innerIstep") && childObj.value("innerIstep").isDouble()){
  139. para.innerIstep = childObj.value("innerIstep").toDouble();
  140. }
  141. if(childObj.contains("innerDstep") && childObj.value("innerDstep").isDouble()){
  142. para.innerDstep = childObj.value("innerDstep").toDouble();
  143. }
  144. m_paras.push_back(para);
  145. }
  146. std::sort(m_paras.begin(), m_paras.end(), sortByVolume);
  147. qDebug() << "m_paras.size:" << m_paras.size();
  148. }else{
  149. return false;
  150. }
  151. save_parameters();
  152. return true;
  153. }
  154. void CalibrationPara::load_parameters()
  155. {
  156. QFile file("./Calibration.json");
  157. if(!file.open(QIODevice::ReadOnly|QIODevice::Text)){
  158. //QJsonObject jsonObject;
  159. //jsonObject["name"] =""
  160. qDebug() << "load_parameters file open failed ";
  161. return ;
  162. }
  163. QTextStream jsonstream(&file);
  164. jsonstream.setCodec("UTF-8");
  165. //jsonstream.readAll();
  166. qDebug() << "load_parameters enter";
  167. QString jsonString = jsonstream.readAll();
  168. file.close();
  169. QJsonParseError json_error;
  170. QJsonDocument jsonDoc = QJsonDocument::fromJson(jsonString.toUtf8(), &json_error);
  171. if(json_error.error == QJsonParseError::NoError){
  172. QJsonObject rootObj = jsonDoc.object();
  173. QJsonArray jsonArray;
  174. if(rootObj.contains("pids") && rootObj.value("pids").isArray()){
  175. jsonArray = rootObj.value("pids").toArray();
  176. for(int i=0; i < jsonArray.size(); i++){
  177. ParaItem para;
  178. QJsonObject childObj = jsonArray[i].toObject();
  179. if(childObj.contains("max_volume") && childObj.value("max_volume").isDouble()){
  180. para.max_volume = childObj.value("max_volume").toDouble();
  181. }
  182. if(childObj.contains("keep_time") && childObj.value("keep_time").isDouble()){
  183. para.keep_time = childObj.value("keep_time").toDouble();
  184. }
  185. if(childObj.contains("outermax") && childObj.value("outermax").isDouble()){
  186. para.outermax = childObj.value("outermax").toDouble();
  187. }
  188. if(childObj.contains("outermin") && childObj.value("outermin").isDouble()){
  189. para.outermin = childObj.value("outermin").toDouble();
  190. }
  191. if(childObj.contains("outerkp") && childObj.value("outerkp").isDouble()){
  192. para.outerkp = childObj.value("outerkp").toDouble();
  193. }
  194. if(childObj.contains("outerki") && childObj.value("outerki").isDouble()){
  195. para.outerki = childObj.value("outerki").toDouble();
  196. }
  197. if(childObj.contains("outerkd") && childObj.value("outerkd").isDouble()){
  198. para.outerkd = childObj.value("outerkd").toDouble();
  199. }
  200. if(childObj.contains("innermax") && childObj.value("innermax").isDouble()){
  201. para.innermax = childObj.value("innermax").toDouble();
  202. }
  203. if(childObj.contains("innermin") && childObj.value("innermin").isDouble()){
  204. para.innermin = childObj.value("innermin").toDouble();
  205. }
  206. if(childObj.contains("innerkp") && childObj.value("innerkp").isDouble()){
  207. para.innerkp = childObj.value("innerkp").toDouble();
  208. }
  209. if(childObj.contains("innerki") && childObj.value("innerki").isDouble()){
  210. para.innerki = childObj.value("innerki").toDouble();
  211. }
  212. if(childObj.contains("innerkd") && childObj.value("innerkd").isDouble()){
  213. para.innerkd = childObj.value("innerkd").toDouble();
  214. }
  215. if(childObj.contains("innermaxI") && childObj.value("innermaxI").isDouble()){
  216. para.innermaxI = childObj.value("innermaxI").toDouble();
  217. }
  218. if(childObj.contains("innerIstep") && childObj.value("innerIstep").isDouble()){
  219. para.innerIstep = childObj.value("innerIstep").toDouble();
  220. }
  221. if(childObj.contains("innerDstep") && childObj.value("innerDstep").isDouble()){
  222. para.innerDstep = childObj.value("innerDstep").toDouble();
  223. }
  224. m_paras.push_back(para);
  225. }
  226. }
  227. }else{
  228. qDebug() << "json_error.error occurred";
  229. }
  230. qDebug() << "load_parameters m_paras.size:" << m_paras.size();
  231. }
  232. void CalibrationPara::save_parameters()
  233. {
  234. QJsonArray pidArray;
  235. //QJsonArray itemArray;
  236. QJsonObject rootObj;
  237. for(int i=0; i < static_cast<int>(m_paras.size()); i++){
  238. QJsonObject stdObj;
  239. stdObj.insert("max_volume", m_paras[i].max_volume);
  240. stdObj.insert("keep_time", m_paras[i].keep_time);
  241. stdObj.insert("outermax", m_paras[i].outermax);
  242. stdObj.insert("outermin", m_paras[i].outermin);
  243. stdObj.insert("outerkp", m_paras[i].outerkp);
  244. stdObj.insert("outerki", m_paras[i].outerki);
  245. stdObj.insert("outerkd", m_paras[i].outerkd);
  246. stdObj.insert("innermax", m_paras[i].innermax);
  247. stdObj.insert("innermin", m_paras[i].innermin);
  248. stdObj.insert("innerkp", m_paras[i].innerkp);
  249. stdObj.insert("innerki", m_paras[i].innerki);
  250. stdObj.insert("innerkd", m_paras[i].innerkd);
  251. stdObj.insert("innermaxI", m_paras[i].innermaxI);
  252. stdObj.insert("innerIstep", m_paras[i].innerIstep);
  253. stdObj.insert("innerDstep", m_paras[i].innerDstep);
  254. pidArray.append(stdObj);
  255. }
  256. rootObj.insert("pids", pidArray);
  257. QJsonDocument jsonDoc;
  258. jsonDoc.setObject(rootObj);
  259. QByteArray byteArray = jsonDoc.toJson(QJsonDocument::Indented);
  260. QFile file("./Calibration.json");
  261. if(!file.open(QIODevice::WriteOnly | QIODevice::Text))
  262. {
  263. qDebug() << QString("fail to open the file: %1, %2, %3").arg(__FILE__).arg(__LINE__).arg(__FUNCTION__);
  264. return;
  265. }
  266. QTextStream out(&file);
  267. out.setCodec("UTF-8");
  268. out << byteArray;
  269. file.close();
  270. }
  271. void CalibrationPara::add_default()
  272. {
  273. ParaItem para;
  274. #if 0
  275. para.max_volume = 0;
  276. para.keep_time = 0;
  277. para.outermax = 0;
  278. para.outermin = 0;
  279. para.outerkp = 0;
  280. para.outerki = 0;
  281. para.outerkd = 0;
  282. para.innermax = 0;
  283. para.innermin = 0;
  284. para.innerkp = 0;
  285. para.innerki = 0;
  286. para.innerkd = 0;
  287. para.innermaxI = 0;
  288. para.innerIstep = 0;
  289. para.innerDstep = 0;
  290. m_paras.push_back(para);
  291. para.max_volume = 0;
  292. para.keep_time = 0;
  293. para.outermax = 0;
  294. para.outermin = 0;
  295. para.outerkp = 0;
  296. para.outerki = 0;
  297. para.outerkd = 0;
  298. para.innermax = 0;
  299. para.innermin = 0;
  300. para.innerkp = 0;
  301. para.innerki = 0;
  302. para.innerkd = 0;
  303. para.innermaxI = 0;
  304. para.innerIstep = 0;
  305. para.innerDstep = 0;
  306. m_paras.push_back(para);
  307. #endif
  308. // <= 200 主要是系统自测
  309. para.max_volume = 200;
  310. para.keep_time = 30;
  311. para.outermax = 0.1;
  312. para.outermin = 0;
  313. para.outerkp = 0.05;
  314. para.outerki = 0;
  315. para.outerkd = 0;
  316. para.innermax = 200;
  317. para.innermin = -50;
  318. para.innerkp = 1000;
  319. para.innerki = 80;
  320. para.innerkd = 60;
  321. para.innermaxI = 10;
  322. para.innerIstep = 1;
  323. para.innerDstep = 10;
  324. m_paras.push_back(para);
  325. //<= 1000
  326. para.max_volume = 1000;
  327. para.keep_time = 30;
  328. para.outermax = 0.1;
  329. para.outermin = 0;
  330. para.outerkp = 0.05;
  331. para.outerki = 0;
  332. para.outerkd = 0;
  333. para.innermax = 200;
  334. para.innermin = -40;
  335. para.innerkp = 1000;
  336. para.innerki = 80;
  337. para.innerkd = 60;
  338. para.innermaxI = 10;
  339. para.innerIstep = 1;
  340. para.innerDstep = 10;
  341. m_paras.push_back(para);
  342. //<= 5000
  343. para.max_volume = 5000;
  344. para.keep_time = 60; //1 min
  345. para.outermax = 0.1;
  346. para.outermin = 0;
  347. para.outerkp = 0.1;
  348. para.outerki = 0;
  349. para.outerkd = 0;
  350. para.innermax = 800;
  351. para.innermin = -30;
  352. para.innerkp = 3000;
  353. para.innerki = 80;
  354. para.innerkd = 60;
  355. para.innermaxI = 15;
  356. para.innerIstep = 2;
  357. para.innerDstep = 10;
  358. m_paras.push_back(para);
  359. //<= 10000
  360. para.max_volume = 10000;
  361. para.keep_time = 120; //2 min
  362. para.outermax = 0.1;
  363. para.outermin = 0;
  364. para.outerkp = 0.2;
  365. para.outerki = 0;
  366. para.outerkd = 0;
  367. para.innermax = 800;
  368. para.innermin = -15;
  369. para.innerkp = 5000;
  370. para.innerki = 80;
  371. para.innerkd = 60;
  372. para.innermaxI = 30;
  373. para.innerIstep = 8;
  374. para.innerDstep = 30;
  375. m_paras.push_back(para);
  376. //<= 20000
  377. para.max_volume = 20000;
  378. para.keep_time = 180; // 3min
  379. para.outermax = 0.1;
  380. para.outermin = 0;
  381. para.outerkp = 0.2;
  382. para.outerki = 0;
  383. para.outerkd = 0;
  384. para.innermax = 800;
  385. para.innermin = -15;
  386. para.innerkp = 8000;
  387. para.innerki = 80;
  388. para.innerkd = 60;
  389. para.innermaxI = 40;
  390. para.innerIstep = 15;
  391. para.innerDstep = 30;
  392. m_paras.push_back(para);
  393. //<= 30000
  394. para.max_volume = 30000;
  395. para.keep_time = 240; // 4min
  396. para.outermax = 0.1;
  397. para.outermin = 0;
  398. para.outerkp = 0.4;
  399. para.outerki = 0;
  400. para.outerkd = 0;
  401. para.innermax = 800;
  402. para.innermin = 0;
  403. para.innerkp = 8000;
  404. para.innerki = 80;
  405. para.innerkd = 60;
  406. para.innermaxI = 40;
  407. para.innerIstep = 20;
  408. para.innerDstep = 60;
  409. m_paras.push_back(para);
  410. //<= 40000
  411. para.max_volume = 40000;
  412. para.keep_time = 300; // 5min
  413. para.outermax = 0.1;
  414. para.outermin = 0;
  415. para.outerkp = 0.4;
  416. para.outerki = 0;
  417. para.outerkd = 0;
  418. para.innermax = 800;
  419. para.innermin = 0;
  420. para.innerkp = 8000;
  421. para.innerki = 80;
  422. para.innerkd = 60;
  423. para.innermaxI = 40;
  424. para.innerIstep = 20;
  425. para.innerDstep = 60;
  426. m_paras.push_back(para);
  427. //<= 1000000 最大
  428. para.max_volume = 1000000;
  429. para.keep_time = 300; // 5min
  430. para.outermax = 0.1;
  431. para.outermin = 0;
  432. para.outerkp = 0.4;
  433. para.outerki = 0;
  434. para.outerkd = 0;
  435. para.innermax = 800;
  436. para.innermin = 0;
  437. para.innerkp = 8000;
  438. para.innerki = 80;
  439. para.innerkd = 60;
  440. para.innermaxI = 40;
  441. para.innerIstep = 20;
  442. para.innerDstep = 60;
  443. m_paras.push_back(para);
  444. std::sort(m_paras.begin(), m_paras.end(), sortByVolume);
  445. }
  446. bool CalibrationPara::get_pidPara(int volume, ParaItem& item)
  447. {
  448. int min_volme = 0;
  449. bool ret_value = false;
  450. #if 0
  451. std::sort(m_paras.begin(), m_paras.end(), sortByVolume);
  452. for(std::vector<ParaItem>::iterator it = m_paras.begin(); it != m_paras.end(); it++){
  453. if(it->max_volume >= volume){
  454. item = *it;
  455. ret_value = true;
  456. }
  457. }
  458. #else
  459. for(std::vector<ParaItem>::iterator it = m_paras.begin(); it != m_paras.end(); it++){
  460. if(it->max_volume >= volume){
  461. if(0 == min_volme){
  462. min_volme = it->max_volume;
  463. }else{
  464. if(it->max_volume < min_volme){
  465. min_volme = it->max_volume;
  466. }
  467. }
  468. }
  469. }
  470. for(std::vector<ParaItem>::iterator it = m_paras.begin(); it != m_paras.end(); it++){
  471. if(it->max_volume == min_volme){
  472. item = *it;
  473. ret_value = true;
  474. }
  475. }
  476. #endif
  477. return ret_value;
  478. }