ivdriver_gps_hcp2.cpp 4.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194
  1. #include "ivdriver_gps_hcp2.h"
  2. #include <math.h>
  3. namespace iv {
  4. ivdriver_gps_hcp2::ivdriver_gps_hcp2()
  5. {
  6. mTime.start();
  7. }
  8. int ivdriver_gps_hcp2::decode(iv::gps::gpsimu & xgpsimu)
  9. {
  10. int xpos = mstrBuffer.indexOf('\n');
  11. QString strsen;
  12. if(xpos>0)
  13. {
  14. strsen = mstrBuffer.left(xpos+1);
  15. mstrBuffer.remove(0,xpos+1);
  16. }
  17. else
  18. {
  19. return 0;
  20. }
  21. QStringList strlistrmc;
  22. RETRYDECODE:
  23. strlistrmc = strsen.split(",");
  24. if(strlistrmc.size() < 23)return -1;
  25. if(strlistrmc.at(0) != "$GPCHC")return -2;
  26. if(!checknmeasen(strsen.toLatin1().data(),strsen.length()))
  27. {
  28. int nPos = strsen.indexOf('$',10);
  29. if(nPos > 0)
  30. {
  31. QString strnewsen = strsen.right(strsen.size()-nPos);
  32. // qDebug("new sen is %s",strnewsen.toLatin1().data());
  33. strsen = strnewsen;
  34. goto RETRYDECODE;
  35. }
  36. return -3;
  37. }
  38. double fheading,fLat,fLon,fVel,fPitch,fRoll;
  39. double fHgt,gyro_x,gyro_y,gyro_z,acc_x,acc_y,acc_z;
  40. int nsv1,nsv2;
  41. int gpsweek,gpstime;
  42. int insstate,rtkstate;
  43. QString strx = strlistrmc.at(3);
  44. fheading = strx.toDouble();
  45. strx = strlistrmc.at(1);
  46. gpsweek = strx.toInt();
  47. strx = strlistrmc.at(2);
  48. gpstime = strx.toInt();
  49. strx = strlistrmc.at(12);
  50. fLat = strx.toDouble();
  51. strx = strlistrmc.at(13);
  52. fLon = strx.toDouble();
  53. strx = strlistrmc.at(14);
  54. fHgt = strx.toDouble();
  55. double ve,vn,vu;
  56. strx = strlistrmc.at(15);
  57. ve = strx.toDouble();
  58. strx = strlistrmc.at(16);
  59. vn = strx.toDouble();
  60. strx = strlistrmc.at(17);
  61. vu = strx.toDouble();
  62. fVel = sqrt(ve*ve + vn* vn);
  63. if((mTime.elapsed()-mOldTime) >= 100)
  64. {
  65. if(mOldTime == 0)
  66. {
  67. mfCalc_acc = 0;
  68. mfOldVel = fVel;
  69. mOldTime = mTime.elapsed();
  70. }
  71. else
  72. {
  73. mfCalc_acc = (fVel - mfOldVel)/((mTime.elapsed() - mOldTime)*0.001);
  74. mfOldVel = fVel;
  75. mOldTime = mTime.elapsed();
  76. }
  77. }
  78. strx = strlistrmc.at(4);
  79. fPitch = strx.toDouble();
  80. strx = strlistrmc.at(5);
  81. fRoll = strx.toDouble();
  82. strx = strlistrmc.at(6);
  83. gyro_x = strx.toDouble();
  84. strx = strlistrmc.at(7);
  85. gyro_y = strx.toDouble();
  86. strx = strlistrmc.at(8);
  87. gyro_z = strx.toDouble();
  88. strx = strlistrmc.at(9);
  89. acc_x = strx.toDouble();
  90. strx = strlistrmc.at(10);
  91. acc_y = strx.toDouble();
  92. strx = strlistrmc.at(11);
  93. acc_z = strx.toDouble();
  94. strx = strlistrmc.at(19);
  95. nsv1 = strx.toInt();
  96. strx = strlistrmc.at(20);
  97. nsv2 = strx.toInt();
  98. strx = strlistrmc.at(21);
  99. char strstate[3];
  100. strstate[2] = 0;
  101. if(strx.size() >= 2)
  102. {
  103. memcpy(strstate,strx.data(),2);
  104. // qDebug(strstate);
  105. char xstate;
  106. xstate = strstate[0];
  107. rtkstate = 4;
  108. int xs;
  109. if(xstate == '0')xs = 0;
  110. if(xstate == '1')xs = 3;
  111. if(xstate == '2')xs = 4;
  112. if(xstate == '3')xs = 8;
  113. if(xstate == '4')xs = 6;
  114. if(xstate == '5')xs = 5;
  115. if(xstate == '6')xs = 3;
  116. if(xstate == '7')xs = 4;
  117. if(xstate == '8')xs = 5;
  118. if(xstate == '9')xs = 5;
  119. rtkstate = xs;
  120. // if(mstate == 0)minsstate = 0;
  121. // else minsstate = 4;
  122. xstate = strstate[1];
  123. if(xstate == '0')insstate = 3;
  124. else insstate = 4;
  125. if(rtkstate == 0)insstate = 3;
  126. }
  127. xgpsimu.set_vd(vu);
  128. xgpsimu.set_ve(ve);
  129. xgpsimu.set_vn(vn);
  130. xgpsimu.set_lat(fLat);
  131. xgpsimu.set_lon(fLon);
  132. xgpsimu.set_heading(fheading);
  133. xgpsimu.set_state(4);
  134. xgpsimu.set_msgtime(QDateTime::currentMSecsSinceEpoch());
  135. xgpsimu.set_roll(fRoll);
  136. xgpsimu.set_pitch(fPitch);
  137. xgpsimu.set_rtk_state(rtkstate);
  138. xgpsimu.set_ins_state(insstate);
  139. xgpsimu.set_height(fHgt);
  140. xgpsimu.set_satnum1(nsv1);
  141. xgpsimu.set_satnum2(nsv2);
  142. xgpsimu.set_gpsweek(gpsweek);
  143. xgpsimu.set_gpstime(gpstime);
  144. xgpsimu.set_gyro_x(gyro_x);
  145. xgpsimu.set_gyro_y(gyro_y);
  146. xgpsimu.set_gyro_z(gyro_z);
  147. xgpsimu.set_acce_x(acc_x);
  148. xgpsimu.set_acce_y(acc_y);
  149. xgpsimu.set_acce_z(acc_z);
  150. xgpsimu.set_acc_calc(mfCalc_acc);
  151. return 1;
  152. }
  153. }