You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

442 lines
14 KiB

2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
  1. #include "zcanhost.hpp"
  2. using namespace iflytop;
  3. using namespace core;
  4. using namespace zcr;
  5. #define zint16p(x) ((int16_t*)(x))
  6. #define zuint16p(x) ((uint16_t*)(x))
  7. #define zint32p(x) ((int32_t*)(x))
  8. #define CHECK_ARGC_NUM(x) \
  9. if (argc != (x + 1)) { \
  10. logger->error("do {},argc error {}!={}", argv[0], argc, x + 1); \
  11. retval = "argc num error"; \
  12. return false; \
  13. }
  14. void ZCanHost::initialize(string can_if_name, int baudrate, bool enablLoopback) {
  15. m_zcanReceiverHost = make_shared<ZCanReceiverHost>();
  16. m_zcanReceiverHost->initialize(can_if_name, baudrate, enablLoopback);
  17. m_cmdMap["pumpctrl_c1004"] = [this](int argc, char** argv, string& retval) {
  18. // CHECK_ARGC_NUM(3);
  19. if (argc == 4) {
  20. uint8_t id = atoi(argv[1]);
  21. int16_t acc = atoi(argv[2]);
  22. int16_t rpm = atoi(argv[3]);
  23. return pumpctrl_c1004(id, acc, rpm) != 0;
  24. } else if (argc == 6) {
  25. uint8_t id = atoi(argv[1]);
  26. int16_t acc = atoi(argv[2]);
  27. int16_t rpm = atoi(argv[3]);
  28. int8_t idlepower = atoi(argv[4]);
  29. int8_t power = atoi(argv[5]);
  30. return pumpctrl_c1004(id, acc, rpm, idlepower, power) != 0;
  31. }
  32. logger->error("do {},argc error {}!={},{}", argv[0], argc, 4, 6);
  33. retval = "argc num error";
  34. return false;
  35. };
  36. // ZCanHost::readio(int id, bool& value)
  37. // ZCanHost::writeio(int id, bool value)
  38. // ZCanHost::readadc(int id, int& value)
  39. m_cmdMap["readio"] = [this](int argc, char** argv, string& retval) {
  40. CHECK_ARGC_NUM(1);
  41. uint8_t id = atoi(argv[1]);
  42. bool v = false;
  43. if (readio(id, v) != 0) {
  44. logger->error("readio fail");
  45. return false;
  46. }
  47. retval = to_string(v);
  48. logger->info("readio:{},{}", id, v);
  49. return true;
  50. };
  51. m_cmdMap["writeio"] = [this](int argc, char** argv, string& retval) {
  52. CHECK_ARGC_NUM(2);
  53. uint8_t id = atoi(argv[1]);
  54. bool v = atoi(argv[2]);
  55. if (writeio(id, v) != 0) {
  56. logger->error("writeio fail");
  57. return false;
  58. }
  59. return true;
  60. };
  61. m_cmdMap["readadc"] = [this](int argc, char** argv, string& retval) {
  62. CHECK_ARGC_NUM(1);
  63. uint8_t id = atoi(argv[1]);
  64. int v = 0;
  65. if (readadc(id, v) != 0) {
  66. logger->error("readadc fail");
  67. return false;
  68. }
  69. logger->info("readadc:{},{}", id, v);
  70. retval = fmt::format("ACK:{}", v);
  71. return true;
  72. };
  73. m_cmdMap["hpp272_read_c1000"] = [this](int argc, char** argv, string& retval) {
  74. CHECK_ARGC_NUM(1);
  75. uint8_t id = atoi(argv[1]);
  76. hpp272_data_t v = {0};
  77. if (hpp272_read_c1000(id, v) != 0) {
  78. logger->error("hpp272_read_c1000 fail");
  79. return false;
  80. }
  81. logger->info("hpp272_read_c1000 {}:", id);
  82. logger->info(" hydrogen_peroxide_volume :{}", v.hydrogen_peroxide_volume);
  83. logger->info(" h2o_h2o2_rs :{}", v.h2o_h2o2_rs);
  84. logger->info(" temperature1 :{}", v.temperature1);
  85. logger->info(" relative_humidity :{}", v.relative_humidity);
  86. logger->info(" absolute_hydrogen_peroxide :{}", v.absolute_hydrogen_peroxide);
  87. logger->info(" h2o_h2o2dew_point_temperature :{}", v.h2o_h2o2dew_point_temperature);
  88. logger->info(" reserved1 :{}", v.reserved1);
  89. logger->info(" water_volume :{}", v.water_volume);
  90. logger->info(" water_vapor_pressure :{}", v.water_vapor_pressure);
  91. logger->info(" absolute_humidity :{}", v.absolute_humidity);
  92. logger->info(" water_vapor_saturation_pressure_h2o :{}", v.water_vapor_saturation_pressure_h2o);
  93. logger->info(" temperature2 :{}", v.temperature2);
  94. logger->info(" h2o2_vapor_pressure :{}", v.h2o2_vapor_pressure);
  95. logger->info(" water_vapor_saturation_pressure_h2o_h2o2 :{}", v.water_vapor_saturation_pressure_h2o_h2o2);
  96. // retval = fmt::format("ACK:{}", v);
  97. return true;
  98. };
  99. m_cmdMap["warning_light_ctrl_c1002"] = [this](int argc, char** argv, string& retval) {
  100. CHECK_ARGC_NUM(5);
  101. uint8_t id = atoi(argv[1]);
  102. uint8_t r = atoi(argv[2]);
  103. uint8_t g = atoi(argv[3]);
  104. uint8_t b = atoi(argv[4]);
  105. uint8_t w = atoi(argv[5]);
  106. if (warning_light_ctrl_c1002(id, r, g, b, w) != 0) {
  107. logger->error("warning_light_ctrl_c1002 fail");
  108. return false;
  109. }
  110. return true;
  111. };
  112. // huacheng_pressure_sensor_read_c1005
  113. m_cmdMap["huacheng_pressure_sensor_read_c1005"] = [this](int argc, char** argv, string& retval) {
  114. CHECK_ARGC_NUM(1);
  115. uint8_t id = atoi(argv[1]);
  116. huacheng_pressure_sensor_read_c1005_t v;
  117. if (huacheng_pressure_sensor_read_c1005(id, v) != 0) {
  118. logger->error("huacheng_pressure_sensor_read_c1005 fail");
  119. return false;
  120. }
  121. // uint8_t precision; // 0,1,2,3
  122. // uint8_t unit; // 0-Mpa ,1-Kpa ,2-Pa ,3-Bar ,4-Mbar ,5-kg/cm2 ,6-psi ,7-mh2o ,8-mmh2o
  123. // uint16_t value; // value, realvalue = value / 10^precision unit
  124. // uint16_t zero; // 零点
  125. // uint16_t full; // 满量程
  126. logger->info("huacheng_pressure_sensor_read_c1005 {}:", id);
  127. logger->info(" precision :{}", v.precision);
  128. logger->info(" unit :{}", v.unit);
  129. logger->info(" value :{}", v.value);
  130. logger->info(" zero :{}", v.zero);
  131. logger->info(" full :{}", v.full);
  132. // retval = fmt::format("ACK:{}", v);
  133. return true;
  134. };
  135. m_cmdMap["sleep_ms"] = [this](int argc, char** argv, string& retval) {
  136. CHECK_ARGC_NUM(1);
  137. int32_t ms = atoi(argv[1]);
  138. logger->info("sleep_ms:{}", ms);
  139. std::this_thread::sleep_for(std::chrono::milliseconds(ms));
  140. return true;
  141. };
  142. }
  143. static void prase_cmd(char* input, int inputlen, int& argc, char* argv[]) {
  144. bool findcomment = false;
  145. for (size_t i = 0; input[i] == 0 || i < inputlen; i++) {
  146. if (input[i] == ' ' || input[i] == '\r' || input[i] == '\n' || input[i] == '\t') {
  147. input[i] = 0;
  148. }
  149. if (input[i] == '#') {
  150. findcomment = true;
  151. }
  152. if (findcomment) {
  153. input[i] = 0;
  154. }
  155. }
  156. int j = 0;
  157. for (size_t i = 0; input[i] == 0 || i < inputlen; i++) {
  158. if (input[i] != 0 && j == 0) {
  159. argv[argc++] = &input[i];
  160. j = 1;
  161. continue;
  162. }
  163. if (input[i] == 0 && j == 1) {
  164. j = 0;
  165. continue;
  166. }
  167. }
  168. }
  169. bool ZCanHost::execcmd(string cmd, string& retval) {
  170. int argc = 0;
  171. char* argv[10] = {0};
  172. char cmdcache[1024] = {0};
  173. // context.rawcmd = cmd;
  174. strcpy(cmdcache, cmd.c_str());
  175. logger->info("do cmd:{}", cmdcache);
  176. for (size_t i = 0; i < cmd.size(); i++) {
  177. if (cmdcache[i] == '#') {
  178. cmdcache[i] = '\0';
  179. }
  180. }
  181. prase_cmd(cmdcache, strlen(cmdcache), argc, argv);
  182. if (argc == 0) {
  183. logger->error("cmd:{} prase error", cmd);
  184. return false;
  185. }
  186. if (m_cmdMap.find(string(argv[0])) != m_cmdMap.end()) {
  187. return m_cmdMap.find(string(argv[0]))->second(argc, argv, retval);
  188. }
  189. logger->error("cmd:{} not found", argv[0]);
  190. return false;
  191. }
  192. /*******************************************************************************
  193. * CMD *
  194. *******************************************************************************/
  195. /**
  196. * @brief 0-1000 Command support
  197. */
  198. int32_t ZCanHost::ping(int board_id) {
  199. shared_ptr<ZCanReceiverCMD> cmd = make_shared<ZCanReceiverCMD>();
  200. cmd->cmdid = 0;
  201. cmd->subcmdid = 0;
  202. cmd->data[0] = board_id;
  203. cmd->len = 1;
  204. auto rx = m_zcanReceiverHost->sendcmdblock(cmd, 100);
  205. if (rx == nullptr) {
  206. return err::zecode(err::knoack);
  207. }
  208. if (rx->packetType == kpt_error_ack) {
  209. logger->error("ping error ack,{}", *zuint16p(&rx->data[0]));
  210. return err::zecode(err::kfail);
  211. }
  212. return 0;
  213. }
  214. int32_t ZCanHost::readio(int id, bool& value) {
  215. shared_ptr<ZCanReceiverCMD> cmd = make_shared<ZCanReceiverCMD>();
  216. cmd->cmdid = 1;
  217. cmd->subcmdid = 0;
  218. cmd->data[0] = id;
  219. cmd->len = 1;
  220. auto rx = m_zcanReceiverHost->sendcmdblock(cmd, 100);
  221. if (rx == nullptr) {
  222. return err::zecode(err::knoack);
  223. }
  224. if (rx->packetType == kpt_error_ack) {
  225. logger->error("readio error ack,{}", *zuint16p(&rx->data[0]));
  226. return err::zecode(err::knoack);
  227. }
  228. value = rx->data[1];
  229. return 0;
  230. }
  231. int32_t ZCanHost::writeio(int id, bool value) {
  232. shared_ptr<ZCanReceiverCMD> cmd = make_shared<ZCanReceiverCMD>();
  233. cmd->cmdid = 2;
  234. cmd->subcmdid = 0;
  235. cmd->data[0] = id;
  236. cmd->data[1] = value;
  237. cmd->len = 2;
  238. auto rx = m_zcanReceiverHost->sendcmdblock(cmd, 100);
  239. if (rx == nullptr) {
  240. return err::zecode(err::knoack);
  241. }
  242. if (rx->packetType == kpt_error_ack) {
  243. logger->error("writeio error ack,{}", *zuint16p(&rx->data[0]));
  244. return err::zecode(err::knoack);
  245. }
  246. m_writeio_cache[id] = value;
  247. return 0;
  248. }
  249. bool ZCanHost::read_writeio_state_cache(int id) { return m_writeio_cache[id]; }
  250. int32_t ZCanHost::readadc(int id, int& value) {
  251. shared_ptr<ZCanReceiverCMD> cmd = make_shared<ZCanReceiverCMD>();
  252. cmd->cmdid = 3;
  253. cmd->subcmdid = 0;
  254. cmd->data[0] = id;
  255. cmd->len = 1;
  256. auto rx = m_zcanReceiverHost->sendcmdblock(cmd, 100);
  257. if (rx == nullptr) {
  258. return err::zecode(err::knoack);
  259. }
  260. if (rx->packetType == kpt_error_ack) {
  261. logger->error("readadc error ack,{}", *zuint16p(&rx->data[0]));
  262. return err::zecode(err::knoack);
  263. }
  264. value = *(int32_t*)(&rx->data[2]);
  265. return 0;
  266. }
  267. // 1004
  268. int32_t ZCanHost::pumpctrl_c1004(int sensorid, int16_t acc, int16_t rpm) {
  269. shared_ptr<ZCanReceiverCMD> cmd = make_shared<ZCanReceiverCMD>();
  270. cmd->cmdid = 1004;
  271. cmd->subcmdid = 0;
  272. cmd->data[0] = sensorid;
  273. *zint16p(&cmd->data[2]) = acc;
  274. *zint16p(&cmd->data[4]) = rpm;
  275. cmd->len = 6;
  276. auto rx = m_zcanReceiverHost->sendcmdblock(cmd, 100);
  277. if (rx == nullptr) {
  278. return err::zecode(err::knoack);
  279. }
  280. if (rx->packetType == kpt_error_ack) {
  281. logger->error("pumpctrl_c1004 error ack,{}", *zuint16p(&rx->data[0]));
  282. return err::zecode(err::kfail);
  283. }
  284. m_pumpc1004_speed_cache[sensorid] = rpm;
  285. return 0;
  286. }
  287. int16_t ZCanHost::pumpctrl_c1004_get_speed_cache(int id) { return m_pumpc1004_speed_cache[id]; }
  288. int32_t ZCanHost::pumpctrl_c1004(int sensorid, int16_t acc, int16_t rpm, int8_t idlepower, int8_t power) {
  289. shared_ptr<ZCanReceiverCMD> cmd = make_shared<ZCanReceiverCMD>();
  290. cmd->cmdid = 1004;
  291. cmd->subcmdid = 1;
  292. cmd->data[0] = sensorid;
  293. *zint16p(&cmd->data[2]) = acc;
  294. *zint16p(&cmd->data[4]) = rpm;
  295. cmd->data[6] = idlepower;
  296. cmd->data[7] = power;
  297. cmd->len = 8;
  298. auto rx = m_zcanReceiverHost->sendcmdblock(cmd, 100);
  299. if (rx == nullptr) {
  300. return err::zecode(err::knoack);
  301. }
  302. if (rx->packetType == kpt_error_ack) {
  303. logger->error("pumpctrl_c1004 error ack,{}", *zuint16p(&rx->data[0]));
  304. return err::zecode(err::kfail);
  305. }
  306. m_pumpc1004_speed_cache[sensorid] = rpm;
  307. return 0;
  308. }
  309. /**
  310. * @brief
  311. *
  312. * @param sensorid
  313. * @param r
  314. * @param g
  315. * @param b
  316. * @param w
  317. */
  318. int32_t ZCanHost::warning_light_ctrl_c1002(uint8_t sensorid, uint8_t r, uint8_t g, uint8_t b, uint8_t w) {
  319. shared_ptr<ZCanReceiverCMD> cmd = make_shared<ZCanReceiverCMD>();
  320. cmd->cmdid = 1002;
  321. cmd->subcmdid = 0;
  322. cmd->data[0] = sensorid;
  323. cmd->data[2] = r;
  324. cmd->data[3] = g;
  325. cmd->data[4] = b;
  326. cmd->data[5] = w;
  327. cmd->len = 6;
  328. auto rx = m_zcanReceiverHost->sendcmdblock(cmd, 100);
  329. if (!rx) {
  330. return err::zecode(err::knoack);
  331. }
  332. if (rx->packetType == kpt_error_ack) {
  333. logger->error("warning_light_ctrl_c1002 error ack,{}", *zuint16p(&rx->data[0]));
  334. return err::zecode(err::kfail);
  335. }
  336. return 0;
  337. }
  338. /**
  339. * @brief
  340. *
  341. * @param sensorid
  342. * @param value
  343. */
  344. int32_t ZCanHost::huacheng_pressure_sensor_read_c1005(int sensorid, huacheng_pressure_sensor_read_c1005_t& value) {
  345. /**
  346. * @brief
  347. */
  348. shared_ptr<ZCanReceiverCMD> cmd = make_shared<ZCanReceiverCMD>();
  349. cmd->cmdid = 1005;
  350. cmd->subcmdid = 0;
  351. cmd->data[0] = sensorid;
  352. cmd->len = 2;
  353. auto rx = m_zcanReceiverHost->sendcmdblock(cmd, 100);
  354. if (!rx) {
  355. return err::zecode(err::knoack);
  356. }
  357. if (rx->packetType == kpt_error_ack) {
  358. logger->error("huacheng_pressure_sensor_read_c1005 error ack");
  359. return err::zecode(err::kfail);
  360. }
  361. if (rx->len != 10) {
  362. logger->warn("huacheng_pressure_sensor_read_c1005 rx len error:{}", rx->len);
  363. return err::zecode(err::kfail);
  364. }
  365. value.precision = rx->data[2];
  366. value.unit = rx->data[3];
  367. value.value = *(int16_t*)(&rx->data[4]);
  368. value.zero = *(int16_t*)(&rx->data[6]);
  369. value.full = *(int16_t*)(&rx->data[8]);
  370. return 0;
  371. }
  372. int32_t ZCanHost::hpp272_read_c1000(int sensorid, hpp272_data_t& value) {
  373. memset(&value, 0, sizeof(hpp272_data_t));
  374. shared_ptr<ZCanReceiverCMD> cmd = make_shared<ZCanReceiverCMD>();
  375. cmd->cmdid = 1000;
  376. cmd->subcmdid = 0;
  377. cmd->data[0] = sensorid;
  378. cmd->len = 2;
  379. auto rx = m_zcanReceiverHost->sendcmdblock(cmd, 300);
  380. if (!rx) {
  381. logger->error("hpp272_read_c1000 timeout");
  382. return err::zecode(err::knoack);
  383. }
  384. if (rx->packetType == kpt_error_ack) {
  385. logger->error("hpp272_read_c1000 error ack");
  386. return err::zecode(err::kfail);
  387. }
  388. if (rx->len != sizeof(hpp272_data_t) + 2) {
  389. logger->warn("hpp272_read_c1000 rx len error:{}!=", rx->len, sizeof(hpp272_data_t) + 2);
  390. return err::zecode(err::kfail);
  391. }
  392. memcpy(&value, &rx->data[2], sizeof(hpp272_data_t));
  393. return 0;
  394. }