Calibrationpara.cpp 16 KB

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