decodechassis.cpp 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396
  1. #include "decodechassis.h"
  2. #include <iostream>
  3. #include "ivlog.h"
  4. #include "ivfault.h"
  5. iv::Ivlog * mygivlog;
  6. iv::Ivfault * mygivfault;
  7. /**
  8. * @brief ShareChassis
  9. * Share Chassis State
  10. * @param pa pointer to module communication handle
  11. * @param pchassis pointer to chassis state
  12. **/
  13. static void ShareChassis(void * pa,iv::chassis * pchassis)
  14. {
  15. char * str;
  16. int ndatasize = pchassis->ByteSize();
  17. str = new char[ndatasize];
  18. std::shared_ptr<char> pstr;
  19. pstr.reset(str);
  20. if(!pchassis->SerializeToArray(str,ndatasize))
  21. {
  22. std::cout<<"ShareChassis Error."<<std::endl;
  23. return;
  24. }
  25. iv::modulecomm::ModuleSendMsg(pa,str,ndatasize);
  26. }
  27. /**
  28. * @brief ProcGE3Chassis
  29. * Process GE3 Chassis State
  30. * @param pa pointer to module communication handle
  31. * @param pmsg pointer to CAN Message
  32. * @retval 0 No Chassis Message 1 Have Chassis Message And Update
  33. **/
  34. int ProcGE3Chassis(void * pa, iv::can::canmsg * pmsg)
  35. {
  36. int i;
  37. int nRtn = 0;
  38. // mygivlog = new iv::Ivlog("chassis");
  39. // mygivfault = new iv::Ivfault("chassis");
  40. for(i=0;i<pmsg->rawmsg_size();i++)
  41. {
  42. const iv::can::canraw * praw = &(pmsg->rawmsg(i));
  43. unsigned char data[8];
  44. if(praw->id() == 0x13)
  45. {
  46. std::cout<<"receive chassis."<<std::endl;
  47. memcpy(data,praw->data().data(),8);
  48. unsigned char EPSMode,EPBFault,DriveMode,Shift,AEBAvailable,CDDAvailable;
  49. unsigned short angle_feedback;
  50. EPSMode = (data[1] & 0x60)>>5; //EPS_mode,00:失效;01:人工;10自动
  51. EPBFault = (data[1] & 0x10)>>4; //EPB故障状态,0:无故障 1:故障
  52. DriveMode = (data[1] & 0x0C)>>2; //驾驶模式,1:Manual 3:Auto
  53. Shift = data[1] & 0x03; //Gear,00N,01D,10R,11p
  54. angle_feedback = data[2] * 256 + data[3];
  55. angle_feedback = angle_feedback * 0.1 - 780;
  56. //制动的两个状态为反馈,AEBAvailable 和CDDAvailable,这两个都为1的时候制动有效,有一个为0,制动失效
  57. AEBAvailable = data[4] & 0x01; //0=Not available,1=Available
  58. CDDAvailable = (data[4] & 0x02) >> 1; //0=Not available,1=Available
  59. iv::chassis xchassis;
  60. //xchassis.set_epsmode(EPSMode);
  61. if(EPSMode == 0)
  62. {
  63. std::cout<<"eps mode"<<std::endl;
  64. // mygivlog->warn("chassis"," Warning!! NOW GE3 chassis triggers a epsmode!!");
  65. }
  66. if(EPSMode == 1)
  67. {
  68. // mygivlog->info("chassis","OK!! NOW GE3 chassis epsmode is Manual!");
  69. }
  70. if(EPSMode == 2)
  71. {
  72. // mygivlog->info("chassis","OK!! NOW GE3 chassis epsmode is Auto!");
  73. }
  74. // xchassis.set_epsmode(2);//为了不退出自动驾驶,经讨论,在这个地方写定值。
  75. xchassis.set_epsmode(EPSMode);
  76. xchassis.set_epbfault(EPBFault);
  77. xchassis.set_drivemode(DriveMode);
  78. xchassis.set_shift(Shift);
  79. xchassis.set_aebavailable(AEBAvailable);
  80. xchassis.set_cddavailable(CDDAvailable);
  81. xchassis.set_angle_feedback(angle_feedback);
  82. ShareChassis(pa,&xchassis);
  83. nRtn = 1;
  84. }
  85. }
  86. return nRtn;
  87. }
  88. //struct Command_Response_Bit_0x14
  89. //{
  90. // unsigned char feedback_angle_H;
  91. // unsigned char feedback_angle_L;
  92. // unsigned char feedback_angle_speed;
  93. // unsigned char feedback_torque;
  94. // unsigned char feedback_speed_H;
  95. // unsigned char feedback_speed_L;
  96. // unsigned char feedback_battery_power;
  97. // unsigned char feedback_door_state:2;
  98. // unsigned char feedback_EPB_state:1;
  99. // unsigned char feedback_reserved:3;
  100. // unsigned char feedback_dangwei:2;
  101. //};
  102. //ServiceCarStatus.torque_st = ServiceControlStatus.command_reponse_0x14.bit.feedback_torque;
  103. //ServiceCarStatus.dangwei_st = ServiceControlStatus.command_reponse_0x14.bit.feedback_dangwei;
  104. //ServiceCarStatus.battery_st = ServiceControlStatus.command_reponse_0x14.bit.feedback_battery_power*0.4;
  105. //ServiceCarStatus.vehSpeed_st= (ServiceControlStatus.command_reponse_0x14.bit.feedback_speed_H*256+
  106. // ServiceControlStatus.command_reponse_0x14.bit.feedback_speed_L)*0.05625;
  107. int ProcPROBLUEChassis(void * pa, iv::can::canmsg * pmsg)
  108. {
  109. int i;
  110. int nRtn = 0;
  111. for(i=0;i<pmsg->rawmsg_size();i++)
  112. {
  113. const iv::can::canraw * praw = &(pmsg->rawmsg(i));
  114. unsigned char data[8];
  115. if(praw->id() == 0x14)
  116. {
  117. memcpy(data,praw->data().data(),8);
  118. double torque,dangwei,soc,vehspeed;
  119. torque = data[3];
  120. dangwei = data[7]>>6;
  121. soc = data[6]; soc = soc *0.4;
  122. vehspeed = (data[4]*256.0 + data[5])*0.05625;
  123. iv::chassis xchassis;
  124. xchassis.set_torque(torque);
  125. xchassis.set_shift(dangwei);
  126. xchassis.set_soc(soc);
  127. xchassis.set_vel(vehspeed);
  128. ShareChassis(pa,&xchassis);
  129. nRtn = 1;
  130. }
  131. }
  132. return nRtn;
  133. }
  134. int ProcMIDCARChassis(void * pa, iv::can::canmsg * pmsg)
  135. {
  136. int i;
  137. int nRtn = 0;
  138. for(i=0;i<pmsg->rawmsg_size();i++)
  139. {
  140. const iv::can::canraw * praw = &(pmsg->rawmsg(i));
  141. unsigned char data[8];
  142. if(praw->id() == 0x14)
  143. {
  144. memcpy(data,praw->data().data(),8);
  145. double torque,dangwei,soc,vehspeed;
  146. torque = data[3];
  147. dangwei = data[7]>>6;
  148. soc = data[6]; soc = soc *0.4;
  149. vehspeed = (data[4]*256.0 + data[5])*0.05625;
  150. iv::chassis xchassis;
  151. xchassis.set_torque(torque);
  152. xchassis.set_shift(dangwei);
  153. xchassis.set_soc(soc);
  154. xchassis.set_vel(vehspeed);
  155. ShareChassis(pa,&xchassis);
  156. nRtn = 1;
  157. }
  158. else if(praw->id() == 0xC2)
  159. {
  160. memcpy(data,praw->data().data(),8);
  161. float soc;
  162. soc = data[0];
  163. iv::chassis xchassis;
  164. xchassis.set_soc(soc);
  165. ShareChassis(pa,&xchassis);
  166. nRtn = 1;
  167. }
  168. }
  169. return nRtn;
  170. }
  171. int ProcVV7Chassis(void * pa, iv::can::canmsg * pmsg)
  172. {
  173. int i;
  174. int nRtn = 0;
  175. for(i=0;i<pmsg->rawmsg_size();i++)
  176. {
  177. const iv::can::canraw * praw = &(pmsg->rawmsg(i));
  178. unsigned char data[8];
  179. if(praw->id() == 0x13)
  180. {
  181. memcpy(data,praw->data().data(),8);
  182. double engine_speed;
  183. engine_speed = (data[5]*256.0 + data[6])*0.125;
  184. iv::chassis xchassis;
  185. xchassis.set_engine_speed(engine_speed);
  186. ShareChassis(pa,&xchassis);
  187. nRtn = 1;
  188. }
  189. }
  190. return nRtn;
  191. }
  192. inline float gettwomotovalue(unsigned char * strdata,float fratio,float foff)
  193. {
  194. int a,b;
  195. a = strdata[0];
  196. b = strdata[1];
  197. float fvalue = a*256+ b;
  198. fvalue = fvalue * fratio + foff;
  199. return fvalue;
  200. }
  201. inline float getonevalue(unsigned char * strdata,float fratio,float foff)
  202. {
  203. int a;
  204. a = strdata[0];
  205. float fvalue = a;
  206. fvalue = fvalue * fratio + foff;
  207. // std::cout<<"hapo torque: "<<fvalue<<std::endl;
  208. return fvalue;
  209. }
  210. static bool ghave0x13= false;
  211. static bool ghave0x14= false;
  212. static bool ghave0x15= false;
  213. int ProcMIDBUSChassis(void * pa, iv::can::canmsg * pmsg)
  214. {
  215. int i;
  216. int nRtn = 0;
  217. static iv::chassis xchassis;
  218. for(i=0;i<pmsg->rawmsg_size();i++)
  219. {
  220. const iv::can::canraw * praw = &(pmsg->rawmsg(i));
  221. unsigned char data[8];
  222. memcpy(data,praw->data().data(),8);
  223. if(praw->id() == 0x13)
  224. {
  225. xchassis.set_angle_feedback(gettwomotovalue(data+0,0.1,-870));
  226. xchassis.set_torque(getonevalue(data+2,1.0,0));
  227. xchassis.set_brake_feedback(getonevalue(data+3,0.4,0));
  228. xchassis.set_vel(gettwomotovalue(data+4,0.05625,0));
  229. xchassis.set_epb_feedback(data[6]&0x03);
  230. xchassis.set_shift((data[6]&0xf0)>>4);
  231. xchassis.set_drivemode(data[7]&0x01);
  232. xchassis.set_emergencystop_feedback((data[7]&06)>>1);
  233. xchassis.set_brakelight_feedback((data[7]&0x08)>>3);
  234. ghave0x13 = true;
  235. }
  236. if(praw->id() == 0x14)
  237. {
  238. xchassis.set_range_feedback(data[0]);
  239. xchassis.set_soc(getonevalue(data+1,0.4,0));
  240. xchassis.set_drivectrltype_feedback(data[5]&0x0f);
  241. xchassis.set_brakectrltype_feedback((data[5]&0xf0)>>4);
  242. xchassis.set_epsctrltype_feedback(data[6]&0x0f);
  243. ghave0x14 = true;
  244. }
  245. if(praw->id() == 0x15)
  246. {
  247. xchassis.set_frontleftwheel_feedback(gettwomotovalue(data,0.05625,0));
  248. xchassis.set_frontrightwheel_feedback(gettwomotovalue(data+2,0.05625,0));
  249. xchassis.set_rearleftwheel_feedback(gettwomotovalue(data+4,0.05625,0));
  250. xchassis.set_rearrightwheel_feedback(gettwomotovalue(data+6,0.05625,0));
  251. ghave0x15 = true;
  252. }
  253. if(ghave0x13&&ghave0x14&&ghave0x15)
  254. {
  255. ghave0x13 = false;
  256. ghave0x14 = false;
  257. ghave0x15 = false;
  258. ShareChassis(pa,&xchassis);
  259. nRtn = 1;
  260. }
  261. }
  262. return nRtn;
  263. }
  264. int ProcHAPOChassis(void * pa, iv::can::canmsg * pmsg)
  265. {
  266. int i;
  267. int nRtn = 0;
  268. static iv::chassis xchassis;
  269. for(i=0;i<pmsg->rawmsg_size();i++)
  270. {
  271. const iv::can::canraw * praw = &(pmsg->rawmsg(i));
  272. unsigned char data[8];
  273. memcpy(data,praw->data().data(),8);
  274. if(praw->id() == 0x13)
  275. {
  276. xchassis.set_angle_feedback(gettwomotovalue(data+0,0.1,-870));
  277. xchassis.set_torque(getonevalue(data+2,0.4,0));
  278. xchassis.set_brake_feedback(getonevalue(data+3,0.4,0));
  279. xchassis.set_vel(gettwomotovalue(data+4,0.05625,0));
  280. xchassis.set_epb_feedback(data[6]&0x03);
  281. xchassis.set_shift((data[6]&0xf0)>>4);
  282. xchassis.set_drivemode(data[7]&0x01);
  283. xchassis.set_emergencystop_feedback((data[7]&06)>>1);
  284. xchassis.set_brakelight_feedback((data[7]&0x08)>>3);
  285. std::cout<<"torque is "<<xchassis.torque()<<std::endl;
  286. ghave0x13 = true;
  287. }
  288. if(praw->id() == 0x14)
  289. {
  290. xchassis.set_range_feedback(data[0]);
  291. xchassis.set_soc(getonevalue(data+1,0.4,0));
  292. xchassis.set_drivectrltype_feedback(data[5]&0x0f);
  293. xchassis.set_brakectrltype_feedback((data[5]&0xf0)>>4);
  294. xchassis.set_epsctrltype_feedback(data[6]&0x0f);
  295. ghave0x14 = true;
  296. }
  297. if(praw->id() == 0x15)
  298. {
  299. xchassis.set_frontleftwheel_feedback(gettwomotovalue(data,0.05625,0));
  300. xchassis.set_frontrightwheel_feedback(gettwomotovalue(data+2,0.05625,0));
  301. xchassis.set_rearleftwheel_feedback(gettwomotovalue(data+4,0.05625,0));
  302. xchassis.set_rearrightwheel_feedback(gettwomotovalue(data+6,0.05625,0));
  303. ghave0x15 = true;
  304. }
  305. if(ghave0x13&&ghave0x14&&ghave0x15)
  306. {
  307. ghave0x13 = false;
  308. ghave0x14 = false;
  309. ghave0x15 = false;
  310. ShareChassis(pa,&xchassis);
  311. nRtn = 1;
  312. }
  313. }
  314. return nRtn;
  315. }
  316. int ProcYUHESENChassis(void * pa, iv::can::canmsg * pmsg)
  317. {
  318. (void)pa;
  319. (void)pmsg;
  320. // int i;
  321. int nRtn = 0;
  322. return nRtn;
  323. }