main.cpp 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435
  1. #include <QCoreApplication>
  2. #include <iostream>
  3. #include <QDateTime>
  4. #include <math.h>
  5. #include "modulecomm.h"
  6. #include "xmlparam.h"
  7. #include "ivexit.h"
  8. #include "ivfault.h"
  9. #include "ivlog.h"
  10. #include "ivversion.h"
  11. #include "ivbacktrace.h"
  12. #include "canmsg.pb.h"
  13. #include "gpsimu.pb.h"
  14. #include "gps.pb.h"
  15. #include <cmath>
  16. #include <cstring>
  17. #include <thread>
  18. iv::gps::gpsimu hcp2_obj;
  19. int gntemp = 0;
  20. void * gpa , * gpb;
  21. QTime gTime;
  22. bool gbRun = true;
  23. std::thread * gstatethread;
  24. iv::Ivfault *gfault = nullptr;
  25. iv::Ivlog *givlog = nullptr;
  26. int gnOldRtkState = 0;
  27. int gnogpsdata = 0;
  28. static inline void bigtolittle(char * strbig, char * strlittle, int n)
  29. {
  30. int i;
  31. for(i = 0; i < n; i++)
  32. {
  33. strlittle[i] = strbig[n-1-i];
  34. }
  35. }
  36. void ShareResult()
  37. {
  38. gnogpsdata = 0;
  39. char * str = new char[hcp2_obj.ByteSize()];
  40. int nsize = hcp2_obj.ByteSize();
  41. if(hcp2_obj.SerializeToArray(str,nsize))
  42. {
  43. iv::modulecomm::ModuleSendMsg(gpa,str,nsize);
  44. }
  45. // qDebug("share time is %d ",gTime.elapsed());
  46. qDebug("time is %s", qPrintable( QDateTime::fromMSecsSinceEpoch(QDateTime::currentMSecsSinceEpoch()).toString("yyyy--MM-dd hh:mm:ss:zzz") ));
  47. delete str;
  48. }
  49. void Decode_hcp2(iv::can::canmsg xmsg)
  50. {
  51. static bool x1ok = false;
  52. static bool x2ok = false;
  53. static bool x3ok = false;
  54. static bool x4ok = false;
  55. static bool x5ok = false;
  56. double acc_x = 0.0, acc_y = 0.0, acc_z = 0.0, ins_pitch = 0.0, ins_roll = 0.0, ins_heading = 0.0,
  57. ins_northspd = 0.0, ins_eastspd = 0.0, ins_skyspd = 0.0, ins_carspd = 0.0,
  58. gyro_x = 0.0, gyro_y = 0.0, gyro_z = 0.0, ins_long = 0.0, ins_lat = 0.0, ins_localheight = 0.0, ins_time = 0.0;
  59. if(xmsg.rawmsg_size() < 1)
  60. return;
  61. int i;
  62. for(i=0;i<xmsg.rawmsg_size();i++)
  63. {
  64. iv::can::canraw canmsg = xmsg.rawmsg(i);
  65. if(canmsg.id() == 803)//323
  66. {
  67. x1ok = true;
  68. int data[8];
  69. unsigned char cdata[8];
  70. memset(cdata,0,8);
  71. memcpy(cdata,canmsg.data().data(),8);
  72. int j;
  73. for(j=0;j<8;j++)
  74. data[j] = cdata[j];
  75. //unsigned char ins_status,rtk_status,sat_num;
  76. int ins_status,rtk_status,sat_num;
  77. if(0 == data[0])
  78. {
  79. ins_status = 3;
  80. }
  81. else
  82. {
  83. ins_status = 4;
  84. }
  85. sat_num = data[1];
  86. switch(data[2])
  87. {
  88. case 0:
  89. rtk_status = 0;
  90. break;
  91. case 1:
  92. rtk_status = 3;
  93. break;
  94. case 2:
  95. rtk_status = 4;
  96. break;
  97. case 3:
  98. rtk_status = 8;
  99. break;
  100. case 4:
  101. rtk_status = 6;
  102. break;
  103. case 5:
  104. rtk_status = 5;
  105. break;
  106. case 6:
  107. rtk_status = 3;
  108. break;
  109. case 7:
  110. rtk_status = 3;
  111. break;
  112. case 8:
  113. rtk_status = 5;
  114. break;
  115. case 9:
  116. rtk_status = 5;
  117. break;
  118. default:
  119. rtk_status = 0;
  120. break;
  121. }
  122. std::cout<<"rtk_status="<<rtk_status<<std::endl;
  123. std::cout<<"ins_status="<<ins_status<<std::endl;
  124. hcp2_obj.set_rtk_state(rtk_status);
  125. hcp2_obj.set_ins_state(ins_status);
  126. hcp2_obj.set_satnum1(sat_num); //....
  127. }
  128. if(canmsg.id()==804){//0x324
  129. x2ok = true;
  130. int data[8];
  131. unsigned char cdata[8];
  132. memset(cdata,0,8);
  133. memcpy(cdata,canmsg.data().data(),8);
  134. qDebug("candata(id=804) = %02x %02x %02x %02x %02x %02x %02x %02x \n",cdata[7],cdata[6],cdata[5],cdata[4],cdata[3],cdata[2],cdata[1],cdata[0]);;
  135. int j;
  136. for(j=0;j<8;j++)
  137. data[j] = cdata[j];
  138. int ins_latt,ins_latt1;
  139. int ins_longg,ins_longg1;
  140. ins_latt1=((data[0]<<24)|(data[1]<<16)|(data[2]<<8)|data[3]);
  141. ins_longg1=((data[4]<<24)|(data[5]<<16)|(data[6]<<8)|data[7]);
  142. // char strlitlat[4],strlitlon[4];
  143. // bigtolittle((char *)&data[0],strlitlat,4);
  144. // bigtolittle((char *)&data[4],strlitlon,4);
  145. // memcpy(&ins_latt,strlitlat,4);
  146. // memcpy(&ins_longg,strlitlon,4);
  147. // ins_lat=ins_latt*0.0000001;
  148. // ins_long=ins_longg*0.0000001;
  149. double ins_lat1,ins_long1;
  150. ins_lat1=ins_latt1*0.0000001;
  151. ins_long1=ins_longg1*0.0000001;
  152. hcp2_obj.set_lat(ins_lat1);
  153. hcp2_obj.set_lon(ins_long1);
  154. // std::cout<<"ins_latt= \n"<<ins_lat;
  155. // std::cout<<"ins_longg= \n"<<ins_long;
  156. std::cout<<"ins_latt1= "<<ins_lat1<<std::endl;
  157. std::cout<<"ins_longg1= "<<ins_long1<<std::endl;
  158. }
  159. if(canmsg.id()==805){//0x325
  160. x3ok = true;
  161. int data[8];
  162. unsigned char cdata[8];
  163. memset(cdata,0,8);
  164. memcpy(cdata,canmsg.data().data(),8);
  165. int j;
  166. for(j=0;j<8;j++)
  167. data[j] = cdata[j];
  168. int localheight;
  169. localheight=((data[0]<<24)+(data[1]<<16)+(data[2]<<8)+data[3]);
  170. ins_localheight=localheight*0.001;
  171. hcp2_obj.set_height(ins_localheight);
  172. std::cout<<"ins_localheight= "<<ins_localheight<<std::endl;
  173. }
  174. if(canmsg.id()==807){//327
  175. x4ok = true;
  176. int16_t data[8];
  177. unsigned char cdata[8];
  178. memset(cdata,0,8);
  179. memcpy(cdata,canmsg.data().data(),8);
  180. int j;
  181. for(j=0;j<8;j++)
  182. data[j] = cdata[j];
  183. short northspd;
  184. short eastspd;
  185. short skyspd;
  186. short carspd;
  187. eastspd=((data[0]<<8) + data[1]);
  188. northspd=((data[2]<<8) + data[3]);
  189. skyspd=((data[4]<<8) + data[5]);
  190. carspd=((data[6]<<8) + data[7]);
  191. ins_northspd=northspd*0.01;
  192. ins_eastspd=eastspd*0.01;
  193. ins_skyspd=skyspd*0.01;
  194. ins_carspd=carspd*0.01;
  195. qDebug("e: %f, n: %f, c: %f", ins_eastspd, ins_northspd, ins_carspd);
  196. hcp2_obj.set_vn(ins_northspd);
  197. hcp2_obj.set_ve(ins_eastspd);
  198. hcp2_obj.set_vd(ins_skyspd);
  199. hcp2_obj.set_speed(ins_carspd);
  200. }
  201. if(canmsg.id()==810){//32A
  202. x5ok = true;
  203. // short data[8];
  204. char cdata[8];
  205. memset(cdata,0,8);
  206. memcpy(cdata,canmsg.data().data(),8);
  207. // int j;
  208. // for(j=0;j<8;j++)
  209. // data[j] = cdata[j];
  210. unsigned short heading;
  211. short pitch;
  212. short roll;
  213. heading=((cdata[0]<<8)| cdata[1]);
  214. pitch=((cdata[2]<<8)| cdata[3]);
  215. roll=((cdata[4]<<8) | cdata[5]);
  216. ins_pitch=pitch*0.01;
  217. ins_roll=roll*0.01;
  218. ins_heading=heading*0.01;
  219. if(ins_heading < 0)ins_heading = ins_heading + 360.0;
  220. if(ins_heading >= 360)ins_heading = ins_heading - 360;
  221. hcp2_obj.set_heading(ins_heading);
  222. hcp2_obj.set_pitch(ins_pitch);
  223. hcp2_obj.set_roll(ins_roll);
  224. }
  225. if(x1ok && x2ok && x3ok && x4ok && x5ok)
  226. {
  227. x1ok = false;
  228. x2ok = false;
  229. x3ok = false;
  230. x4ok = false;
  231. x5ok = false;
  232. hcp2_obj.set_msgtime(QDateTime::currentMSecsSinceEpoch());
  233. hcp2_obj.set_time(QDateTime::currentMSecsSinceEpoch());
  234. std::cout<<"time is "<<gTime.elapsed()<<std::endl;
  235. givlog->verbose("gps lat:%11.7f lon:%11.7f heading:%11.3f rtk:%d",hcp2_obj.lat(),hcp2_obj.lon(),hcp2_obj.heading(),hcp2_obj.rtk_state());
  236. if(hcp2_obj.rtk_state() != gnOldRtkState)
  237. {
  238. gnOldRtkState = hcp2_obj.rtk_state();
  239. if(hcp2_obj.rtk_state() == 6)
  240. {
  241. givlog->info("GPS Fix.");
  242. gfault->SetFaultState(0,0,"GPS Fix");
  243. }
  244. else
  245. {
  246. givlog->info("GPS Not Fix, RTK State is %d",hcp2_obj.rtk_state());
  247. gfault->SetFaultState(1,2,"GPS Not Fix.");
  248. }
  249. }
  250. ShareResult();
  251. }
  252. }
  253. }
  254. void Listencan0(const char * strdata,const unsigned int nSize,const unsigned int index,const QDateTime * dt,const char * strmemname)
  255. {
  256. if(nSize<1)return;
  257. iv::can::canmsg xmsg;
  258. if(false == xmsg.ParseFromArray(strdata,nSize))
  259. {
  260. std::cout<<"hcp2 Listencan0 fail."<<std::endl;
  261. return;
  262. }
  263. Decode_hcp2(xmsg);
  264. // qDebug("can size is %d",xmsg.rawmsg_size());
  265. // xt = QDateTime::currentMSecsSinceEpoch();
  266. // qDebug("latence = %ld ",xt-pic.time());
  267. }
  268. void Listencan1(const char * strdata,const unsigned int nSize,const unsigned int index,const QDateTime * dt,const char * strmemname)
  269. {
  270. if(nSize<1)return;
  271. iv::can::canmsg xmsg;
  272. if(false == xmsg.ParseFromArray(strdata,nSize))
  273. {
  274. std::cout<<"esr Listencan1 fail."<<std::endl;
  275. return;
  276. }
  277. Decode_hcp2(xmsg);
  278. // qDebug("can size is %d",xmsg.rawmsg_size());
  279. // xt = QDateTime::currentMSecsSinceEpoch();
  280. // qDebug("latence = %ld ",xt-pic.time());
  281. }
  282. void exitfunc()
  283. {
  284. std::cout<<"enter exitfunc."<<std::endl;
  285. gbRun = false;
  286. gstatethread->join();
  287. iv::modulecomm::Unregister(gpa);
  288. iv::modulecomm::Unregister(gpb);
  289. std::cout<<"Complete exitfunc."<<std::endl;
  290. }
  291. void statethread()
  292. {
  293. int nstate = 0;
  294. int noldstate = 0;
  295. while(gbRun)
  296. {
  297. std::this_thread::sleep_for(std::chrono::milliseconds(10));
  298. if(gnogpsdata < 1000000)gnogpsdata++;
  299. if(gnogpsdata > 100)nstate = 1;
  300. if(gnogpsdata > 6000)nstate = 2;
  301. if(nstate != noldstate)
  302. {
  303. noldstate = nstate;
  304. switch (nstate) {
  305. case 0:
  306. gfault->SetFaultState(0,0,"OK.");
  307. givlog->info("GPS OK.");
  308. break;
  309. case 1:
  310. gfault->SetFaultState(1,1,"More than 1 second not have data.");
  311. givlog->warn("More than 1 second not have data.");
  312. break;
  313. case 2:
  314. gfault->SetFaultState(2,3,"More than 60 seconds not have data.");
  315. givlog->error("More than 60 seconds not have data.");
  316. break;
  317. default:
  318. break;
  319. }
  320. }
  321. }
  322. }
  323. int main(int argc, char *argv[])
  324. {
  325. RegisterIVBackTrace();
  326. showversion("detection_gps_hcp2");
  327. QCoreApplication a(argc, argv);
  328. gTime.start();
  329. gfault = new iv::Ivfault("detection_gps_hcp2");
  330. givlog = new iv::Ivlog("detection_gps_hcp2");
  331. gfault->SetFaultState(0,0,"Initialize.");
  332. QString strpath = QCoreApplication::applicationDirPath();
  333. if(argc < 2)
  334. strpath = strpath + "/detection_gps_hcp2.xml";
  335. else
  336. strpath = argv[1];
  337. std::cout<<strpath.toStdString()<<std::endl;
  338. iv::xmlparam::Xmlparam xp(strpath.toStdString());
  339. std::string strmemcan0 = xp.GetParam("canrecv","canrecv1");
  340. std::string strmemsend0 = xp.GetParam("cansend","hcp2_gpsimu");
  341. gpa = iv::modulecomm::RegisterSend(strmemsend0.data(),100000,3);
  342. gpb = iv::modulecomm::RegisterRecv(strmemcan0.data(),Listencan0);
  343. gstatethread = new std::thread(statethread);
  344. iv::ivexit::RegIVExitCall(exitfunc);
  345. return a.exec();
  346. }