canrecv_consumer.cpp 7.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214
  1. #include "canrecv_consumer.h"
  2. #include "math.h"
  3. extern setupConfig_t setupConfig;
  4. extern iv::msgunit shmSonar;
  5. CANRecv_Consumer::CANRecv_Consumer(CAN_Producer_Consumer *pBuf)
  6. {
  7. pBuffer = pBuf;
  8. QObject::connect(this,&CANRecv_Consumer::UltrasonicData_Ready,this,&CANRecv_Consumer::UltrasonicData_Ready_Slot);
  9. objDist.fill(DIST_ERROR,NUM_OF_SENSOR_MAX);
  10. sensorStatus.fill(false,NUM_OF_SENSOR_MAX);
  11. objDist_Send.fill(DIST_ERROR,NUM_OF_SENSOR_MAX);
  12. sensorStatus_Send.fill(false,NUM_OF_SENSOR_MAX);
  13. }
  14. CANRecv_Consumer::~CANRecv_Consumer()
  15. {
  16. requestInterruption();
  17. while(this->isFinished() == false);
  18. }
  19. void CANRecv_Consumer::Clear_CAN_PrivateTempVariable(void)
  20. {
  21. CAN_ID = 0x000u;
  22. CAN_DLC = 0;
  23. for(int i=0;i<8;i++) CAN_data[i] = 0x00;
  24. }
  25. uint32_t CANRecv_Consumer::Trans_From_CANRaw(const iv::can::canraw &xraw) //only for standard data frame, return can id
  26. {
  27. this->Clear_CAN_PrivateTempVariable();
  28. CAN_ID = xraw.id();
  29. CAN_DLC = xraw.len();
  30. char tempData[8];
  31. int tempLen = (xraw.data().size() > 8) ? 8 : xraw.data().size();
  32. strncpy(tempData,xraw.data().data(),tempLen);
  33. for(int i=0;i<tempLen;i++)
  34. {
  35. CAN_data[i] = (uint8_t)tempData[i];
  36. }
  37. return CAN_ID;
  38. }
  39. void CANRecv_Consumer::run()
  40. {
  41. iv::can::canraw tempCANRaw;
  42. uint8_t tempSensorID = 0;
  43. uint32_t tempLastResult = DIST_ERROR;
  44. uint16_t tempDist;
  45. decodeTimer.start();
  46. while (!QThread::isInterruptionRequested())
  47. {
  48. tempCANRaw.CopyFrom(pBuffer->Consume_Element(1));
  49. if(decodeEnableFlag == true)
  50. {
  51. if(decodeTimer.elapsed() >= 50)
  52. {
  53. decodeEnableFlag = false;
  54. objDist[decodeSensorID] = DIST_ERROR;
  55. sensorStatus[decodeSensorID] = false;
  56. tempSensorID = decodeSensorID + 1;
  57. if(tempSensorID >= NUM_OF_SENSOR_MAX)
  58. {
  59. sonarSend_Lock.lock();
  60. tempLastResult = objDist_Send[0];
  61. sonarSend_Lock.unlock();
  62. }
  63. else
  64. {
  65. sonarSend_Lock.lock();
  66. tempLastResult = objDist_Send[tempSensorID];
  67. sonarSend_Lock.unlock();
  68. }
  69. if(tempSensorID >= NUM_OF_SENSOR_MAX)
  70. {
  71. //copy and send
  72. sonarSend_Lock.lock();
  73. objDist_Send.clear();
  74. sensorStatus_Send.clear();
  75. objDist_Send.swap(objDist);
  76. sensorStatus_Send.swap(sensorStatus);
  77. sonarSend_Lock.unlock();
  78. emit UltrasonicData_Ready();
  79. //clear
  80. objDist.fill(DIST_ERROR,NUM_OF_SENSOR_MAX);
  81. sensorStatus.fill(false,NUM_OF_SENSOR_MAX);
  82. tempSensorID = 0;
  83. }
  84. // if(tempLastResult <= 2000)
  85. // emit Enable_Ask(true,tempSensorID,2);
  86. // else if(tempLastResult <= 3800)
  87. // emit Enable_Ask(true,tempSensorID,1);
  88. // else
  89. // emit Enable_Ask(true,tempSensorID,0);
  90. decodeTimer.restart();
  91. }
  92. else
  93. {
  94. this->Trans_From_CANRaw(tempCANRaw);
  95. if(CAN_ID == setupConfig.sonarCAN_ID && CAN_DLC == 2)
  96. {
  97. tempDist = (CAN_data[0] << 8) | CAN_data[1];
  98. if(tempDist <= 0x1650 && tempDist >= 0xD0)
  99. {
  100. decodeEnableFlag = false;
  101. objDist[decodeSensorID] = tempDist;
  102. sensorStatus[decodeSensorID] = true;
  103. tempSensorID = decodeSensorID + 1;
  104. if(tempSensorID >= NUM_OF_SENSOR_MAX)
  105. {
  106. sonarSend_Lock.lock();
  107. tempLastResult = objDist_Send[0];
  108. sonarSend_Lock.unlock();
  109. }
  110. else
  111. {
  112. sonarSend_Lock.lock();
  113. tempLastResult = objDist_Send[tempSensorID];
  114. sonarSend_Lock.unlock();
  115. }
  116. if(tempSensorID >= NUM_OF_SENSOR_MAX)
  117. {
  118. //copy and send
  119. sonarSend_Lock.lock();
  120. objDist_Send.clear();
  121. sensorStatus_Send.clear();
  122. objDist_Send.swap(objDist);
  123. sensorStatus_Send.swap(sensorStatus);
  124. sonarSend_Lock.unlock();
  125. emit UltrasonicData_Ready();
  126. //clear
  127. objDist.fill(DIST_ERROR,NUM_OF_SENSOR_MAX);
  128. sensorStatus.fill(false,NUM_OF_SENSOR_MAX);
  129. tempSensorID = 0;
  130. }
  131. // if(tempLastResult <= 2000)
  132. // emit Enable_Ask(true,tempSensorID,2);
  133. // else if(tempLastResult <= 3800)
  134. // emit Enable_Ask(true,tempSensorID,1);
  135. // else
  136. // emit Enable_Ask(true,tempSensorID,0);
  137. decodeTimer.restart();
  138. }
  139. }
  140. }
  141. }
  142. }
  143. }
  144. void CANRecv_Consumer::Enable_DecodeResult_Slot(bool enableFlag,uint8_t sensorID)
  145. {
  146. decodeEnableFlag = enableFlag;
  147. decodeSensorID = sensorID;
  148. decodeTimer.restart();
  149. }
  150. void CANRecv_Consumer::UltrasonicData_Ready_Slot(void)
  151. {
  152. iv::ultrasonic::ultrasonic xmsg;
  153. uint64_t tempLastTime = QDateTime::currentMSecsSinceEpoch();
  154. std::cout<<"interval time is "<<tempLastTime - gLastTime<<std::endl;
  155. gLastTime = tempLastTime;
  156. sonarSend_Lock.lock();
  157. xmsg.set_sigobjdist_flside(objDist_Send[0]);
  158. xmsg.set_sigobjdist_flcorner(objDist_Send[1]);
  159. xmsg.set_sigobjdist_flmiddle(objDist_Send[2]);
  160. xmsg.set_sigobjdist_frmiddle(objDist_Send[3]);
  161. xmsg.set_sigobjdist_frcorner(objDist_Send[4]);
  162. xmsg.set_sigobjdist_frside(objDist_Send[5]);
  163. xmsg.set_sigobjdist_rrside(objDist_Send[6]);
  164. xmsg.set_sigobjdist_rrcorner(objDist_Send[7]);
  165. xmsg.set_sigobjdist_rrmiddle(objDist_Send[8]);
  166. xmsg.set_sigobjdist_rlmiddle(objDist_Send[9]);
  167. xmsg.set_sigobjdist_rlcorner(objDist_Send[10]);
  168. xmsg.set_sigobjdist_rlside(objDist_Send[11]);
  169. xmsg.set_sigsensor_front_ls(sensorStatus_Send[0]);
  170. xmsg.set_sigsensor_front_l(sensorStatus_Send[1]);
  171. xmsg.set_sigsensor_front_lm(sensorStatus_Send[2]);
  172. xmsg.set_sigsensor_front_rm(sensorStatus_Send[3]);
  173. xmsg.set_sigsensor_front_r(sensorStatus_Send[4]);
  174. xmsg.set_sigsensor_front_rs(sensorStatus_Send[5]);
  175. xmsg.set_sigsensor_rear_rs(sensorStatus_Send[6]);
  176. xmsg.set_sigsensor_rear_r(sensorStatus_Send[7]);
  177. xmsg.set_sigsensor_rear_rm(sensorStatus_Send[8]);
  178. xmsg.set_sigsensor_rear_lm(sensorStatus_Send[9]);
  179. xmsg.set_sigsensor_rear_l(sensorStatus_Send[10]);
  180. xmsg.set_sigsensor_rear_ls(sensorStatus_Send[11]);
  181. sonarSend_Lock.unlock();
  182. xmsg.set_timestamp(QDateTime::currentMSecsSinceEpoch());
  183. int ndatasize = xmsg.ByteSize();
  184. char * strser = new char[ndatasize];
  185. std::shared_ptr<char> pstrser;
  186. pstrser.reset(strser);
  187. if(xmsg.SerializePartialToArray(strser,ndatasize))
  188. {
  189. iv::modulecomm::ModuleSendMsg(shmSonar.mpa,strser,ndatasize);
  190. }
  191. else
  192. {
  193. std::cout<<"ultrasonic data serialize error."<<std::endl;
  194. }
  195. }