ivradarview.cpp 7.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260
  1. #include "ivradarview.h"
  2. #include <QColor>
  3. #include <iostream>
  4. #define VIEW_WIDTH 2000
  5. #define VIEW_HEIGHT 2000
  6. QColor selradarcolor[] = {Qt::red,Qt::green,Qt::blue,Qt::cyan,Qt::magenta,Qt::yellow};
  7. IVRadarView::IVRadarView()
  8. {
  9. int i;
  10. for(i=0;i<NUM_MAX_RADAR;i++)
  11. {
  12. mnNotDataCount[i] = NOTDATACOUNTMAX;
  13. mbCheck[i] = true;
  14. }
  15. for(i=0;i<NUM_MAX_MSG;i++)
  16. if(i==0||i==1||i==4) msgCheck[i]=true;
  17. else msgCheck[i]=false;
  18. image = new QImage(VIEW_WIDTH, VIEW_HEIGHT, QImage::Format_RGB32);//画布的初始化大小设为300*300,使用32位颜色
  19. mimagepaint = new QImage(VIEW_WIDTH, VIEW_HEIGHT, QImage::Format_RGB32);
  20. painter = new QPainter(image);
  21. painter->end();
  22. }
  23. void IVRadarView::run()
  24. {
  25. while(!QThread::isInterruptionRequested())
  26. {
  27. if(mnReadIndex != mnWriteIndex)
  28. {
  29. paint();
  30. mnReadIndex = mnWriteIndex;
  31. mbImageUpdate = true;
  32. }
  33. else
  34. {
  35. msleep(1);
  36. }
  37. }
  38. }
  39. void IVRadarView::paint()
  40. {
  41. iv::radar::radarobjectarray xobj;
  42. painter->begin(image);
  43. image->fill(QColor(255, 255, 255));//对画布进行填充
  44. // std::vector<iv::GPSData> navigation_data = brain->navigation_data;
  45. painter->setRenderHint(QPainter::Antialiasing, true);//设置反锯齿模式,好看一点
  46. painter->translate(1000,1000);
  47. painter->setPen(Qt::black);
  48. painter->drawLine(-1000,0,1000,0);
  49. painter->drawLine(0,-1000,0,1000);
  50. int i;
  51. for(i=-9;i<=9;i++)
  52. {
  53. painter->drawLine(i*100,0,i*100,-20);
  54. // painter->drawText(i*100-20,-50,40,20,Qt::AlignHCenter | Qt::AlignTop,QString::number(i*10));
  55. }
  56. // std::cout<<"enter paint."<<std::endl;
  57. painter->save();
  58. painter->rotate(90);
  59. for(i=-9;i<=9;i++)
  60. {
  61. painter->drawLine(i*100,0,i*100,-20);
  62. // painter->drawText(i*100-20,-50,40,20,Qt::AlignHCenter | Qt::AlignTop,QString::number(i*(-10)));
  63. }
  64. painter->restore();
  65. painter->setPen(QPen(Qt::black, 2));
  66. painter->setBrush(Qt::blue);
  67. QFont esr_font("Microsoft YaHei", 10, 60); //第一个属性是字体(微软雅黑),第二个是大小,第三个是加粗(权重是75)
  68. painter->setFont(esr_font);
  69. int k;
  70. for(k=0;k<NUM_MAX_RADAR;k++)
  71. {
  72. mMutex.lock();
  73. xobj.CopyFrom(mradar[k]);
  74. mMutex.unlock();
  75. if(mbCheck[k] == false)continue;
  76. QColor xcolor = Qt::gray;
  77. if(mnNotDataCount[k] < NOTDATACOUNTMAX)
  78. {
  79. if(k<6)
  80. {
  81. xcolor = selradarcolor[k];
  82. }
  83. else
  84. {
  85. xcolor = Qt::black;
  86. }
  87. }
  88. //根据类型改变颜色
  89. if(xobj.has_acc_sta_obj_id())
  90. xcolor = selradarcolor[0];
  91. if(xobj.has_acc_mov_obj_id())
  92. xcolor = selradarcolor[1];
  93. if(xobj.has_cmbb_sta_obj_id())
  94. xcolor = selradarcolor[2];
  95. if(xobj.has_cmbb_mov_obj_id())
  96. xcolor = selradarcolor[3];
  97. if(xobj.has_fcw_sta_obj_id())
  98. xcolor = selradarcolor[4];
  99. if(xobj.has_fcw_mov_obj_id())
  100. xcolor = selradarcolor[5];
  101. painter->setBrush(xcolor);
  102. for(i=0;i<xobj.obj_size();i++)
  103. {
  104. iv::radar::radarobject xr = xobj.obj(i);
  105. if(xr.bvalid())
  106. {
  107. int x;
  108. int y;
  109. x = (int)(xr.x()*10.0);
  110. y = (int)(xr.y()*(-10.0));
  111. painter->drawEllipse(x, y, 10, 10);
  112. // char strradar[1000];
  113. // sprintf(strradar,"(%6.1f %6.1f %6.1f)",xr.x(),xr.y(),xr.vel());
  114. // painter->drawText(x,y,strradar);
  115. // // sprintf(coordinate_ear, "(%d, %d)", (int)ServiceCarStatus.obs_radar[a].nomal_x, (int)ServiceCarStatus.obs_radar[a].nomal_y);
  116. // // painter->drawText(((ServiceCarStatus.obs_radar)[a].nomal_x) * 10 + 450, -(ServiceCarStatus.obs_radar)[a].nomal_y * 10 + 700, QString(coordinate_ear));
  117. QString str="";
  118. if(msgCheck[0]) str+=QString::number(xr.x(),'f',1)+",";
  119. if(msgCheck[1]) str+=QString::number(xr.y(),'f',1)+",";
  120. if(msgCheck[2]) str+=QString::number(xr.vx())+",";
  121. if(msgCheck[3]) str+=QString::number(xr.vy())+",";
  122. if(msgCheck[4]) str+=QString::number(xr.vel())+",";
  123. if(msgCheck[5]) str+="true,";
  124. if(msgCheck[6]) str+=QString::number(xr.range())+",";
  125. if(msgCheck[7]) str+=QString::number(xr.range_rate())+",";
  126. if(msgCheck[8]) str+=QString::number(xr.range_accel())+",";
  127. if(msgCheck[9]) str+=QString::number(xr.angle())+",";
  128. if(msgCheck[10]) str+=QString::number(xr.width())+",";
  129. if(msgCheck[11]) str+="true,";
  130. if(msgCheck[12]) str+="true,";
  131. if(msgCheck[13]) str+="true,";
  132. if(msgCheck[14]) str+=QString::number(xr.med_range_mode())+",";
  133. if(msgCheck[15]) str+=QString::number(xr.track_status())+",";
  134. if(msgCheck[16]) str+="true,";
  135. if(msgCheck[17]) str+="true,";
  136. if(msgCheck[18]) str+="true,";
  137. if(msgCheck[19]) str+="true,";
  138. if(msgCheck[20]) str+=QString::number(xr.power())+",";
  139. if(msgCheck[21]) str+=QString::number(xr.detect_valid_level())+",";
  140. if(msgCheck[22]) str+="true,";
  141. painter->drawText(x,y,str.length()>0? "("+str.mid(0,str.length()-1)+")":"");
  142. }//if
  143. }//for
  144. if(mnNotDataCount[k] <NOTDATACOUNTMAX)mnNotDataCount[k]++;
  145. }
  146. double lrange = xobj.valid_lr_range()*10;
  147. double langle = xobj.valid_lr_angle();
  148. double mrange = xobj.valid_mr_range()*10;
  149. double mangle = xobj.valid_mr_angle();
  150. if(msgCheck[23]){
  151. painter->setBrush(QBrush(QColor(255,0,0,80)));
  152. //lrange=60*10,langle=75;
  153. painter->drawPie(-lrange/2,-lrange/2,lrange,lrange,(180-langle)/2*16,langle*16);
  154. }
  155. if(msgCheck[24]){
  156. painter->setBrush(QBrush(QColor(0,0,255,80)));
  157. //mrange=40*10, mangle=100;
  158. painter->drawPie(-mrange/2,-mrange/2,mrange,mrange,(180-mangle)/2*16,mangle*16);
  159. }
  160. painter->end();
  161. mMutexPaint.lock();
  162. // delete mimagepaint;
  163. // mimagepaint = new QImage(*image);
  164. *mimagepaint = image->copy();
  165. mMutexPaint.unlock();
  166. }
  167. QImage IVRadarView::GetImage()
  168. {
  169. mMutexPaint.lock();
  170. // QImage imagertn(*mimagepaint);
  171. QImage imagertn = mimagepaint->copy();
  172. mMutexPaint.unlock();
  173. mbImageUpdate = false;
  174. return imagertn;
  175. }
  176. bool IVRadarView::IsHaveNew()
  177. {
  178. return mbImageUpdate;
  179. }
  180. int IVRadarView::GetType()
  181. {
  182. return 3;
  183. }
  184. void IVRadarView::SetRADAR(iv::radar::radarobjectarray radarobj,int index)
  185. {
  186. mMutex.lock();
  187. mnWriteIndex++;
  188. mradar[index].clear_obj();
  189. mradar[index].CopyFrom(radarobj);
  190. mnNotDataCount[index] = 0;
  191. mMutex.unlock();
  192. }
  193. void IVRadarView::SetCheck(int n, bool bcheck)
  194. {
  195. // if((n<0)||(n>NUM_MAX_RADAR))return;
  196. // mbCheck[n] = bcheck;
  197. if(n<0||n>NUM_MAX_MSG+NUM_MAX_RADAR) return;
  198. else if(n<NUM_MAX_RADAR)
  199. mbCheck[n]=bcheck;
  200. else
  201. msgCheck[n-NUM_MAX_RADAR]=bcheck;
  202. }