canrecv_consumer.cpp 8.2 KB

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