Calibrationpara.cpp 16 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610
  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. }
  231. void CalibrationPara::save_parameters()
  232. {
  233. QJsonArray pidArray;
  234. //QJsonArray itemArray;
  235. QJsonObject rootObj;
  236. for(int i=0; i < static_cast<int>(m_paras.size()); i++){
  237. QJsonObject stdObj;
  238. stdObj.insert("max_volume", m_paras[i].max_volume);
  239. stdObj.insert("keep_time", m_paras[i].keep_time);
  240. stdObj.insert("outermax", m_paras[i].outermax);
  241. stdObj.insert("outermin", m_paras[i].outermin);
  242. stdObj.insert("outerkp", m_paras[i].outerkp);
  243. stdObj.insert("outerki", m_paras[i].outerki);
  244. stdObj.insert("outerkd", m_paras[i].outerkd);
  245. stdObj.insert("innermax", m_paras[i].innermax);
  246. stdObj.insert("innermin", m_paras[i].innermin);
  247. stdObj.insert("innerkp", m_paras[i].innerkp);
  248. stdObj.insert("innerki", m_paras[i].innerki);
  249. stdObj.insert("innerkd", m_paras[i].innerkd);
  250. stdObj.insert("innermaxI", m_paras[i].innermaxI);
  251. stdObj.insert("innerIstep", m_paras[i].innerIstep);
  252. stdObj.insert("innerDstep", m_paras[i].innerDstep);
  253. pidArray.append(stdObj);
  254. }
  255. rootObj.insert("pids", pidArray);
  256. QJsonDocument jsonDoc;
  257. jsonDoc.setObject(rootObj);
  258. QByteArray byteArray = jsonDoc.toJson(QJsonDocument::Indented);
  259. QFile file("./Calibration.json");
  260. if(!file.open(QIODevice::WriteOnly | QIODevice::Text))
  261. {
  262. qDebug() << QString("fail to open the file: %1, %2, %3").arg(__FILE__).arg(__LINE__).arg(__FUNCTION__);
  263. return;
  264. }
  265. QTextStream out(&file);
  266. out.setCodec("UTF-8");
  267. out << byteArray;
  268. file.close();
  269. }
  270. void CalibrationPara::add_default()
  271. {
  272. ParaItem para;
  273. #if 0
  274. para.max_volume = 0;
  275. para.keep_time = 0;
  276. para.outermax = 0;
  277. para.outermin = 0;
  278. para.outerkp = 0;
  279. para.outerki = 0;
  280. para.outerkd = 0;
  281. para.innermax = 0;
  282. para.innermin = 0;
  283. para.innerkp = 0;
  284. para.innerki = 0;
  285. para.innerkd = 0;
  286. para.innermaxI = 0;
  287. para.innerIstep = 0;
  288. para.innerDstep = 0;
  289. m_paras.push_back(para);
  290. para.max_volume = 0;
  291. para.keep_time = 0;
  292. para.outermax = 0;
  293. para.outermin = 0;
  294. para.outerkp = 0;
  295. para.outerki = 0;
  296. para.outerkd = 0;
  297. para.innermax = 0;
  298. para.innermin = 0;
  299. para.innerkp = 0;
  300. para.innerki = 0;
  301. para.innerkd = 0;
  302. para.innermaxI = 0;
  303. para.innerIstep = 0;
  304. para.innerDstep = 0;
  305. m_paras.push_back(para);
  306. #endif
  307. // <= 200 主要是系统自测
  308. para.max_volume = 200;
  309. para.keep_time = 30;
  310. para.outermax = 0.1;
  311. para.outermin = 0;
  312. para.outerkp = 0.05;
  313. para.outerki = 0;
  314. para.outerkd = 0;
  315. para.innermax = 200;
  316. para.innermin = -50;
  317. para.innerkp = 1000;
  318. para.innerki = 80;
  319. para.innerkd = 60;
  320. para.innermaxI = 10;
  321. para.innerIstep = 1;
  322. para.innerDstep = 10;
  323. m_paras.push_back(para);
  324. //<= 1000
  325. para.max_volume = 1000;
  326. para.keep_time = 30;
  327. para.outermax = 0.1;
  328. para.outermin = 0;
  329. para.outerkp = 0.05;
  330. para.outerki = 0;
  331. para.outerkd = 0;
  332. para.innermax = 200;
  333. para.innermin = -40;
  334. para.innerkp = 1000;
  335. para.innerki = 80;
  336. para.innerkd = 60;
  337. para.innermaxI = 10;
  338. para.innerIstep = 1;
  339. para.innerDstep = 10;
  340. m_paras.push_back(para);
  341. //<= 5000
  342. para.max_volume = 5000;
  343. para.keep_time = 60; //1 min
  344. para.outermax = 0.1;
  345. para.outermin = 0;
  346. para.outerkp = 0.1;
  347. para.outerki = 0;
  348. para.outerkd = 0;
  349. para.innermax = 800;
  350. para.innermin = -30;
  351. para.innerkp = 3000;
  352. para.innerki = 80;
  353. para.innerkd = 60;
  354. para.innermaxI = 15;
  355. para.innerIstep = 2;
  356. para.innerDstep = 10;
  357. m_paras.push_back(para);
  358. //<= 10000
  359. para.max_volume = 10000;
  360. para.keep_time = 120; //2 min
  361. para.outermax = 0.1;
  362. para.outermin = 0;
  363. para.outerkp = 0.2;
  364. para.outerki = 0;
  365. para.outerkd = 0;
  366. para.innermax = 800;
  367. para.innermin = -15;
  368. para.innerkp = 5000;
  369. para.innerki = 80;
  370. para.innerkd = 60;
  371. para.innermaxI = 30;
  372. para.innerIstep = 8;
  373. para.innerDstep = 30;
  374. m_paras.push_back(para);
  375. //<= 20000
  376. para.max_volume = 20000;
  377. para.keep_time = 180; // 3min
  378. para.outermax = 0.1;
  379. para.outermin = 0;
  380. para.outerkp = 0.2;
  381. para.outerki = 0;
  382. para.outerkd = 0;
  383. para.innermax = 800;
  384. para.innermin = -15;
  385. para.innerkp = 8000;
  386. para.innerki = 80;
  387. para.innerkd = 60;
  388. para.innermaxI = 40;
  389. para.innerIstep = 15;
  390. para.innerDstep = 30;
  391. m_paras.push_back(para);
  392. //<= 30000
  393. para.max_volume = 30000;
  394. para.keep_time = 240; // 4min
  395. para.outermax = 0.1;
  396. para.outermin = 0;
  397. para.outerkp = 0.4;
  398. para.outerki = 0;
  399. para.outerkd = 0;
  400. para.innermax = 800;
  401. para.innermin = 0;
  402. para.innerkp = 8000;
  403. para.innerki = 80;
  404. para.innerkd = 60;
  405. para.innermaxI = 40;
  406. para.innerIstep = 20;
  407. para.innerDstep = 60;
  408. m_paras.push_back(para);
  409. //<= 40000
  410. para.max_volume = 40000;
  411. para.keep_time = 300; // 5min
  412. para.outermax = 0.1;
  413. para.outermin = 0;
  414. para.outerkp = 0.4;
  415. para.outerki = 0;
  416. para.outerkd = 0;
  417. para.innermax = 800;
  418. para.innermin = 0;
  419. para.innerkp = 8000;
  420. para.innerki = 80;
  421. para.innerkd = 60;
  422. para.innermaxI = 40;
  423. para.innerIstep = 20;
  424. para.innerDstep = 60;
  425. m_paras.push_back(para);
  426. //<= 1000000 最大
  427. para.max_volume = 1000000;
  428. para.keep_time = 300; // 5min
  429. para.outermax = 0.1;
  430. para.outermin = 0;
  431. para.outerkp = 0.4;
  432. para.outerki = 0;
  433. para.outerkd = 0;
  434. para.innermax = 800;
  435. para.innermin = 0;
  436. para.innerkp = 8000;
  437. para.innerki = 80;
  438. para.innerkd = 60;
  439. para.innermaxI = 40;
  440. para.innerIstep = 20;
  441. para.innerDstep = 60;
  442. m_paras.push_back(para);
  443. std::sort(m_paras.begin(), m_paras.end(), sortByVolume);
  444. }
  445. bool CalibrationPara::get_pidPara(int volume, ParaItem& item)
  446. {
  447. int min_volme = 0;
  448. bool ret_value = false;
  449. #if 0
  450. std::sort(m_paras.begin(), m_paras.end(), sortByVolume);
  451. for(std::vector<ParaItem>::iterator it = m_paras.begin(); it != m_paras.end(); it++){
  452. if(it->max_volume >= volume){
  453. item = *it;
  454. ret_value = true;
  455. }
  456. }
  457. #else
  458. for(std::vector<ParaItem>::iterator it = m_paras.begin(); it != m_paras.end(); it++){
  459. if(it->max_volume >= volume){
  460. if(0 == min_volme){
  461. min_volme = it->max_volume;
  462. }else{
  463. if(it->max_volume < min_volme){
  464. min_volme = it->max_volume;
  465. }
  466. }
  467. }
  468. }
  469. for(std::vector<ParaItem>::iterator it = m_paras.begin(); it != m_paras.end(); it++){
  470. if(it->max_volume == min_volme){
  471. item = *it;
  472. ret_value = true;
  473. }
  474. }
  475. #endif
  476. return ret_value;
  477. }