main.cpp 17 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592
  1. #include <QCoreApplication>
  2. #include <iostream>
  3. #include <QDateTime>
  4. #include <math.h>
  5. #include <thread>
  6. #include <QDebug>
  7. #include <signal.h>
  8. #include <stdlib.h>
  9. #include <setjmp.h>
  10. #include <unistd.h>
  11. #include "modulecomm.h"
  12. #include "xmlparam.h"
  13. #include "ivlog.h"
  14. #include "ivfault.h"
  15. #include "canmsg.pb.h"
  16. #include "radarobjectarray.pb.h"
  17. #include "gpsimu.pb.h"
  18. #include "can_car.pb.h"
  19. #include "can_send_data_struct.h"
  20. /******************************************/
  21. #define fujiankuan //<宏开关
  22. std::string gstrmemgpsimu;
  23. std::string gstrmemcancar;
  24. static uint16_t CAN_Scan_Index;
  25. static double Vehicle_Yaw_Rate;
  26. static double Vehicle_Speed; //< m/s
  27. static double Steering_Angle; //< optional signal, ready to use
  28. static int16_t Radius_Curvature = 0; //< optional signal, 8191 meter is default
  29. static uint8_t Radar_FOV_Long_Range = 30; //< 0-30 degree
  30. static uint8_t Radar_FOV_Mid_Range = 120; //< 0-120 degree
  31. static uint8_t Radar_Height = 50;//< 0-125 cm
  32. static uint16_t Radar_to_Rear_Axle = 370;//< 0-710 cm
  33. static uint16_t Car_Wheel_Base = 270;//< 0-710 cm
  34. static uint8_t Car_Steering_Gear_Ratio = 18;//< 0-31.875
  35. /******************************************/
  36. canSend4F0 canData4f0;
  37. canSend4F1 canData4f1;
  38. canSend5F2 canData5f2;
  39. canSend5F4 canData5f4;
  40. /******************************************/
  41. iv::Ivlog * givlog;
  42. iv::Ivfault * givfault;
  43. iv::radar::radarobjectarray gobj;
  44. int gntemp = 0;
  45. void * gpa , * gpb;
  46. QTime gTime;
  47. int gnRadarState = 0;
  48. #ifdef fujiankuan
  49. /***==================================================================================***/
  50. static int gnIndex = 0;
  51. //static unsigned char tmp1[8] = {0x00,0x00,0x00,0x00,0x00,0x00,0xBF,0x00};
  52. void ExecSend()
  53. {
  54. iv::can::canmsg xmsg;
  55. iv::can::canraw xraw;
  56. qDebug()<<QTime::currentTime();
  57. xraw.set_id(0x4F0);
  58. xraw.set_data(canData4f0.byte,8);
  59. xraw.set_bext(false);
  60. xraw.set_bremote(false);
  61. xraw.set_len(8);
  62. iv::can::canraw * pxraw = xmsg.add_rawmsg();
  63. pxraw->CopyFrom(xraw);
  64. xmsg.set_channel(1);
  65. xmsg.set_index(gnIndex);
  66. xraw.set_id(0x4F1);
  67. xraw.set_data(canData4f1.byte,8);
  68. xraw.set_bext(false);
  69. xraw.set_bremote(false);
  70. xraw.set_len(8);
  71. pxraw = xmsg.add_rawmsg();
  72. pxraw->CopyFrom(xraw);
  73. xmsg.set_channel(1);
  74. xmsg.set_index(gnIndex);
  75. /*
  76. xraw.set_id(0x5F2);
  77. xraw.set_data(canData5f2.byte,8);
  78. xraw.set_bext(false);
  79. xraw.set_bremote(false);
  80. xraw.set_len(8);
  81. pxraw = xmsg.add_rawmsg();
  82. pxraw->CopyFrom(xraw);
  83. xmsg.set_channel(1);
  84. xmsg.set_index(gnIndex);
  85. xraw.set_id(0x5F4);
  86. xraw.set_data(canData5f4.byte,8);
  87. xraw.set_bext(false);
  88. xraw.set_bremote(false);
  89. xraw.set_len(8);
  90. pxraw = xmsg.add_rawmsg();
  91. pxraw->CopyFrom(xraw);
  92. xmsg.set_channel(1);
  93. xmsg.set_index(gnIndex);
  94. */
  95. gnIndex++;
  96. xmsg.set_mstime(QDateTime::currentMSecsSinceEpoch());
  97. int ndatasize = xmsg.ByteSize();
  98. char * strser = new char[ndatasize];
  99. std::shared_ptr<char> pstrser;
  100. pstrser.reset(strser);
  101. if(xmsg.SerializePartialToArray(strser,ndatasize))
  102. {
  103. iv::modulecomm::ModuleSendMsg(gpb,strser,ndatasize);
  104. }
  105. else
  106. {
  107. std::cout<<"MainWindow::onTimer serialize error."<<std::endl;
  108. }
  109. }
  110. void Listengpsimu(const char * strdata,const unsigned int nSize,const unsigned int index,const QDateTime * dt,const char * strmemname)
  111. {
  112. if(nSize<1)return;
  113. iv::gps::gpsimu xgpsimu;
  114. if(false == xgpsimu.ParseFromArray(strdata,nSize))
  115. {
  116. givlog->warn("detection_radar_delphi_esr_send--Listengpsimu parse errror. nSize is %d",nSize);
  117. return;
  118. }
  119. Vehicle_Yaw_Rate = xgpsimu.gyro_z() * -1;
  120. Vehicle_Speed = sqrt(xgpsimu.vn()*xgpsimu.vn() + xgpsimu.ve()*xgpsimu.ve() + xgpsimu.vd()*xgpsimu.vd());
  121. }
  122. void Listencancar(const char * strdata,const unsigned int nSize,const unsigned int index,const QDateTime * dt,const char * strmemname)
  123. {
  124. if(nSize<1)return;
  125. iv::can_car::can_car xcancar;
  126. if(false == xcancar.ParseFromArray(strdata,nSize))
  127. {
  128. givlog->warn("detection_radar_delphi_esr_send--Listencancar parse errror. nSize is %d",nSize);
  129. return;
  130. }
  131. // Vehicle_Speed = xcancar.v();
  132. }
  133. /****==================================================================================***/
  134. #endif
  135. /****************timer*********************/
  136. void signalHandler(int num)
  137. {
  138. unsigned int speed = (unsigned int)(Vehicle_Speed / 0.0625);
  139. int yawRate = (int)(Vehicle_Yaw_Rate / 0.0625);
  140. canData4f0.bit.canVehicleSpeedH = speed >> 8;
  141. canData4f0.bit.canVehicleSpeedL = speed & 0xFF;
  142. if(Vehicle_Speed >= 0.0)
  143. canData4f0.bit.can_VehicleSpeedDirection = 0x00;
  144. else
  145. canData4f0.bit.can_VehicleSpeedDirection = 0x01;
  146. canData4f0.bit.canYawRateH = yawRate >> 8;
  147. canData4f0.bit.canYawRateL = yawRate & 0xFF;
  148. canData4f0.bit.canYawRateValid = 0x01;
  149. canData4f0.bit.canRadiusCurvatureH = Radius_Curvature >> 8;
  150. canData4f0.bit.canRadiusCurvatureL = Radius_Curvature & 0x3F;
  151. canData4f1.bit.canScanIndexAckH = CAN_Scan_Index >> 8;
  152. canData4f1.bit.canScanIndexAckL = CAN_Scan_Index & 0xFF;
  153. canData4f1.bit.canMaximumTracks = 0x3F;
  154. canData4f1.bit.canRadarCmdRadiate = 0x01;
  155. canData4f1.bit.canGroupingMode = 0x03;
  156. canData4f1.bit.canVehicleSpeedValid = 0x01;
  157. canData5f2.bit.canRadarFovLrH = Radar_FOV_Long_Range >> 1;
  158. canData5f2.bit.canRadarFovLrL = Radar_FOV_Long_Range & 0x01;
  159. canData5f2.bit.canRadarFovMr = Radar_FOV_Mid_Range & 0x7F;
  160. canData5f2.bit.canRadarHeight = Radar_Height & 0x7F;
  161. canData5f2.bit.canAalignAvgCtrTotal = 0x03;
  162. canData5f4.bit.canBeamwidthVert = 0x47;
  163. canData5f4.bit.canDistanceRearAxle = (uint8_t)((Radar_to_Rear_Axle - 200) / 2.0);
  164. // qDebug()<<canData5f4.bit.canDistanceRearAxle;
  165. canData5f4.bit.canWheelBase = (uint8_t)((Car_Wheel_Base - 200) / 2.0);
  166. canData5f4.bit.canSteeringGearRatio = (uint8_t)(Car_Steering_Gear_Ratio / 0.125);
  167. ExecSend();
  168. }
  169. /*****************************************/
  170. void ShareResult()
  171. {
  172. char * str = new char[gobj.ByteSize()];
  173. int nsize = gobj.ByteSize();
  174. if(gobj.SerializeToArray(str,nsize))
  175. {
  176. iv::modulecomm::ModuleSendMsg(gpa,str,nsize);
  177. }
  178. static qint64 oldrecvtime;
  179. if((QDateTime::currentMSecsSinceEpoch() - oldrecvtime)>100)
  180. {
  181. givlog->warn("radar interval is more than 100ms. value is %ld",QDateTime::currentMSecsSinceEpoch() - oldrecvtime);
  182. }
  183. oldrecvtime = QDateTime::currentMSecsSinceEpoch();
  184. givlog->verbose("share time is %d ",gTime.elapsed());
  185. // qDebug("share time is %d ",gTime.elapsed());
  186. delete str;
  187. }
  188. void DecodeRadar(iv::can::canmsg xmsg)
  189. {
  190. // int32_t range, rate, angle;
  191. if(xmsg.rawmsg_size() < 1)return;
  192. int i;
  193. for(i=0;i<xmsg.rawmsg_size();i++)
  194. {
  195. iv::can::canraw canmsg = xmsg.rawmsg(i);
  196. if(canmsg.id() == 0x4E0)
  197. {
  198. gnRadarState = 10;
  199. unsigned char cdata[8];
  200. memcpy(cdata,canmsg.data().data(),8);
  201. CAN_Scan_Index = (cdata[3] << 8) | cdata[4];
  202. gntemp++;
  203. if(gntemp > 10)
  204. {
  205. gobj.set_mstime(QDateTime::currentMSecsSinceEpoch());
  206. ShareResult();
  207. gntemp = 0;
  208. }
  209. }
  210. if(canmsg.id() == 0x4E1)
  211. {
  212. gnRadarState = 10;
  213. unsigned char cdata[8];
  214. memcpy(cdata,canmsg.data().data(),8);
  215. gobj.set_internal_error((cdata[1] >> 5) & 0x01);
  216. gobj.set_range_perf_error((cdata[1] >> 6) & 0x01);
  217. gobj.set_overheat_error((cdata[1] >> 7) & 0x01);
  218. gntemp++;
  219. }
  220. if(canmsg.id() == 0x4E3)
  221. {
  222. gnRadarState = 10;
  223. unsigned char cdata[8];
  224. memcpy(cdata,canmsg.data().data(),8);
  225. gobj.set_acc_sta_obj_id(cdata[7]);
  226. gobj.set_acc_mov_obj_id(cdata[1]);
  227. gobj.set_cmbb_mov_obj_id(cdata[2]);
  228. gobj.set_cmbb_sta_obj_id(cdata[3]);
  229. gobj.set_fcw_mov_obj_id(cdata[4]);
  230. gobj.set_fcw_sta_obj_id(cdata[5]);
  231. gobj.set_grating_lobe_det((cdata[0] >> 6) & 0x01);
  232. gobj.set_truck_target_det((cdata[0] >> 7) & 0x01);
  233. gntemp++;
  234. }
  235. if((canmsg.id() >= 0x500)&&(canmsg.id() <= 0x53F))
  236. {
  237. gnRadarState = 10;
  238. int data[8];
  239. unsigned char cdata[8];
  240. memcpy(cdata,canmsg.data().data(),8);
  241. int radar_ID_index = canmsg.id() - 0x500;
  242. int j;
  243. for(j=0;j<8;j++)data[j] = cdata[j];
  244. iv::radar::radarobject * pobj = gobj.mutable_obj(radar_ID_index);
  245. int16_t range = ((data[2] & 0x07) << 8) | data[3];
  246. pobj->set_range(range * 0.1);
  247. int16_t range_rate = (((data[6] & 0x3F) << 8) | data[7]) << 2;
  248. range_rate = range_rate >> 2;
  249. pobj->set_range_rate(range_rate * 0.01);
  250. int16_t range_accel = (((data[4] & 0x03) << 8) | data[5]) << 6;
  251. range_accel = range_accel >> 6;
  252. pobj->set_range_accel(range_accel * 0.05);
  253. int16_t angle = (((data[1] & 0x1F) << 8) | (data[2] & 0xF8)) << 3;
  254. angle = angle >> 6;
  255. pobj->set_angle(angle * 0.1);
  256. int8_t width = (data[4] & 0x3C) >> 2;
  257. pobj->set_width(width * 0.5);
  258. pobj->set_grouping_changed((data[0] & 0x02) >> 1);
  259. pobj->set_oncoming(data[0] & 0x01);
  260. int8_t lat_rate = data[0] & 0xFC;
  261. lat_rate = lat_rate >> 2;
  262. pobj->set_lat_rate(lat_rate * 0.25);
  263. if (angle != 0 || range != 0)
  264. {
  265. double rad_angle = pobj->angle() / 180.0 * M_PI;
  266. pobj->set_bvalid(true);
  267. pobj->set_x(pobj->range() * sin(rad_angle));
  268. pobj->set_y(pobj->range() * cos(rad_angle));
  269. pobj->set_vel(sqrt(pobj->range_rate() * pobj->range_rate() + pobj->lat_rate() * pobj->lat_rate()));
  270. pobj->set_vx(pobj->range_rate() * sin(rad_angle) - pobj->lat_rate() * cos(rad_angle));
  271. pobj->set_vy(pobj->range_rate() * cos(rad_angle) + pobj->lat_rate() * sin(rad_angle));
  272. }
  273. else
  274. {
  275. pobj->set_bvalid(false);
  276. }
  277. pobj->set_med_range_mode((data[6] >> 6) & 0x03);
  278. pobj->set_track_status((data[1] >> 5) & 0x07);
  279. pobj->set_bridge_object((data[4] >> 7) & 0x01);
  280. gntemp++;
  281. }
  282. if(canmsg.id() == 0x540)
  283. {
  284. gnRadarState = 10;
  285. unsigned char cdata[8];
  286. memcpy(cdata,canmsg.data().data(),8);
  287. uint8_t group_id = cdata[0] & 0x0F;
  288. if(group_id < 9)
  289. {
  290. for(int i=0;i<7;i++)
  291. {
  292. iv::radar::radarobject * pobj = gobj.mutable_obj(i + group_id * 7);
  293. int8_t power = cdata[i+1] & 0x1F;
  294. pobj->set_power(power - 10);
  295. // qDebug()<<power;
  296. pobj->set_moving((cdata[i+1] >> 5) & 0x01);
  297. pobj->set_fast_movable((cdata[i+1] >> 7) & 0x01);
  298. pobj->set_slow_movable((cdata[i+1] >> 6) & 0x01);
  299. }
  300. }
  301. else if(group_id == 9)
  302. {
  303. iv::radar::radarobject * pobj = gobj.mutable_obj(63);
  304. int8_t power = cdata[1] & 0x1F;
  305. pobj->set_power(power - 10);
  306. pobj->set_moving((cdata[1] >> 5) & 0x01);
  307. pobj->set_fast_movable((cdata[1] >> 7) & 0x01);
  308. pobj->set_slow_movable((cdata[1] >> 6) & 0x01);
  309. }
  310. gntemp++;
  311. }
  312. if(canmsg.id() == 0x5D0)
  313. {
  314. gnRadarState = 10;
  315. unsigned char cdata[8];
  316. memcpy(cdata,canmsg.data().data(),8);
  317. int16_t valid_range = (cdata[1] << 8) | cdata[2];
  318. gobj.set_valid_lr_range(valid_range / 128.0);
  319. int16_t valid_range_rate = (cdata[3] << 8) | cdata[4];
  320. gobj.set_valid_lr_range_rate(valid_range_rate / 128.0);
  321. int16_t valid_angle = (cdata[5] << 8) | cdata[6];
  322. gobj.set_valid_lr_angle(valid_angle / 16.0);
  323. gobj.set_valid_lr_power(cdata[7]);
  324. gntemp++;
  325. }
  326. if(canmsg.id() == 0x5D1)
  327. {
  328. gnRadarState = 10;
  329. unsigned char cdata[8];
  330. memcpy(cdata,canmsg.data().data(),8);
  331. int16_t valid_range = (cdata[1] << 8) | cdata[2];
  332. gobj.set_valid_mr_range(valid_range / 128.0);
  333. int16_t valid_range_rate = (cdata[3] << 8) | cdata[4];
  334. gobj.set_valid_mr_range_rate(valid_range_rate / 128.0);
  335. int16_t valid_angle = (cdata[5] << 8) | cdata[6];
  336. gobj.set_valid_mr_angle(valid_angle / 16.0);
  337. gobj.set_valid_mr_power(cdata[7]);
  338. gntemp++;
  339. }
  340. if(canmsg.id() == 0x5E8)
  341. {
  342. gnRadarState = 10;
  343. unsigned char cdata[8];
  344. memcpy(cdata,canmsg.data().data(),8);
  345. uint8_t spray_ID = (cdata[4] >> 1) & 0x7F;
  346. gobj.set_water_spray_target_id(spray_ID);
  347. int16_t xohp_acc_cipv = ((cdata[4] & 0x01) | cdata[5]) << 7;
  348. xohp_acc_cipv = xohp_acc_cipv >> 7;
  349. gobj.set_filtered_xohp_acc_cipv(xohp_acc_cipv * 0.03125);
  350. gobj.set_path_id_acc_2(cdata[6]);
  351. gobj.set_path_id_acc_3(cdata[7]);
  352. gntemp++;
  353. gobj.set_mstime(QDateTime::currentMSecsSinceEpoch());
  354. ShareResult();
  355. gntemp = 0;
  356. }
  357. if(gntemp > 100)
  358. {
  359. gobj.set_mstime(QDateTime::currentMSecsSinceEpoch());
  360. ShareResult();
  361. gntemp = 0;
  362. }
  363. // qDebug("id is %08x",canmsg.id());
  364. }
  365. }
  366. void Listencan0(const char * strdata,const unsigned int nSize,const unsigned int index,const QDateTime * dt,const char * strmemname)
  367. {
  368. if(nSize<1)return;
  369. iv::can::canmsg xmsg;
  370. if(false == xmsg.ParseFromArray(strdata,nSize))
  371. {
  372. std::cout<<"esr Listencan0 fail."<<std::endl;
  373. return;
  374. }
  375. DecodeRadar(xmsg);
  376. // qDebug("can size is %d",xmsg.rawmsg_size());
  377. // xt = QDateTime::currentMSecsSinceEpoch();
  378. // qDebug("latence = %ld ",xt-pic.time());
  379. }
  380. void threadstate()
  381. {
  382. while(1)
  383. {
  384. std::this_thread::sleep_for(std::chrono::milliseconds(10));
  385. if(gnRadarState > -100)gnRadarState--;
  386. if(gnRadarState > 0)
  387. {
  388. givfault->SetFaultState(0,0,"OK");
  389. }
  390. else
  391. {
  392. if(gnRadarState > -100)
  393. {
  394. givfault->SetFaultState(1,1,"无CAN数据");
  395. }
  396. else
  397. {
  398. givfault->SetFaultState(2,2,"无CAN数据");
  399. }
  400. }
  401. }
  402. }
  403. int main(int argc, char *argv[])
  404. {
  405. QCoreApplication a(argc, argv);
  406. iv::radar::radarobjectarray x;
  407. x.set_mstime(0);
  408. int i;
  409. for(i=0;i<64;i++)
  410. {
  411. iv::radar::radarobject * xobj = x.add_obj();
  412. xobj->set_x(0);
  413. xobj->set_y(0);
  414. xobj->set_vx(0);
  415. xobj->set_vy(0);
  416. xobj->set_vel(0);
  417. xobj->set_bvalid(false);
  418. }
  419. gobj.CopyFrom(x);
  420. gTime.start();
  421. memset(canData4f0.byte,0,8);
  422. memset(canData4f1.byte,0,8);
  423. Vehicle_Yaw_Rate = 0;
  424. Vehicle_Speed = 0;
  425. canData4f1.bit.canMaximumTracks = 64;
  426. canData4f1.bit.canRadarCmdRadiate = 1;
  427. canData4f1.bit.canGroupingMode = 3;
  428. canData4f1.bit.canVehicleSpeedValid = 1;
  429. memset(canData5f2.byte,0,8);
  430. memset(canData5f4.byte,0,8);
  431. QString strpath = QCoreApplication::applicationDirPath();
  432. if(argc < 2)
  433. strpath = strpath + "/detection_radar_esr.xml";
  434. else
  435. strpath = argv[1];
  436. std::cout<<strpath.toStdString()<<std::endl;
  437. iv::xmlparam::Xmlparam xp(strpath.toStdString());
  438. std::string strmemcan = xp.GetParam("canrecv","canrecv1");
  439. std::string strmemsend = xp.GetParam("cansend","cansend1");
  440. std::string strmemradar = xp.GetParam("radar","radar");
  441. std::string strmodulename = xp.GetParam("modulename","detection_radar_delphi_esr");
  442. #ifdef fujiankuan
  443. gstrmemgpsimu = xp.GetParam("gpsimu_name","hcp2_gpsimu");
  444. gstrmemcancar = xp.GetParam("cancar","can_car");
  445. #endif
  446. givlog = new iv::Ivlog(strmodulename.data());
  447. givfault = new iv::Ivfault(strmodulename.data());
  448. givfault->SetFaultState(1,1,"初始化");
  449. givlog->info("Initialized");
  450. gpa = iv::modulecomm::RegisterSend(strmemradar.data(),100000,3);
  451. gpb = iv::modulecomm::RegisterSend(strmemsend.data(),100000,1);
  452. void * pa = iv::modulecomm::RegisterRecv(strmemcan.data(),Listencan0);
  453. #ifdef fujiankuan
  454. void * pb = iv::modulecomm::RegisterRecv(gstrmemgpsimu.data(),Listengpsimu);
  455. void * pc = iv::modulecomm::RegisterRecv(gstrmemcancar.data(),Listencancar);
  456. #endif
  457. std::thread threadfault(threadstate);
  458. // signal(SIGALRM, signalHandler);
  459. // ualarm(2000,2000);
  460. signal(SIGALRM, signalHandler);
  461. struct itimerval new_value, old_value;
  462. new_value.it_value.tv_sec = 0;
  463. new_value.it_value.tv_usec = 1;
  464. new_value.it_interval.tv_sec = 0;
  465. new_value.it_interval.tv_usec = 20000;
  466. setitimer(ITIMER_REAL, &new_value, NULL);
  467. return a.exec();
  468. }