Calibrationpara.cpp 14 KB

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