#include "canrecv_consumer.h" #include "math.h" extern setupConfig_t setupConfig; extern iv::msgunit shmSonar; CANRecv_Consumer::CANRecv_Consumer(CAN_Producer_Consumer *pBuf) { pBuffer = pBuf; QObject::connect(this,&CANRecv_Consumer::UltrasonicData_Ready,this,&CANRecv_Consumer::UltrasonicData_Ready_Slot); objDist.fill(DIST_ERROR,NUM_OF_SENSOR_MAX); sensorStatus.fill(false,NUM_OF_SENSOR_MAX); objDist_Send.fill(DIST_ERROR,NUM_OF_SENSOR_MAX); sensorStatus_Send.fill(false,NUM_OF_SENSOR_MAX); } CANRecv_Consumer::~CANRecv_Consumer() { requestInterruption(); while(this->isFinished() == false); } void CANRecv_Consumer::Clear_CAN_PrivateTempVariable(void) { CAN_ID = 0x000u; CAN_DLC = 0; for(int i=0;i<8;i++) CAN_data[i] = 0x00; } uint32_t CANRecv_Consumer::Trans_From_CANRaw(const iv::can::canraw &xraw) //only for standard data frame, return can id { this->Clear_CAN_PrivateTempVariable(); CAN_ID = xraw.id(); CAN_DLC = xraw.len(); char tempData[8]; int tempLen = (xraw.data().size() > 8) ? 8 : xraw.data().size(); strncpy(tempData,xraw.data().data(),tempLen); for(int i=0;iConsume_Element(1)); if(decodeEnableFlag == true) { if(decodeTimer.elapsed() >= 50) { decodeEnableFlag = false; objDist[decodeSensorID] = DIST_ERROR; sensorStatus[decodeSensorID] = false; tempSensorID = decodeSensorID + 1; if(tempSensorID >= NUM_OF_SENSOR_MAX) { sonarSend_Lock.lock(); tempLastResult = objDist_Send[0]; sonarSend_Lock.unlock(); } else { sonarSend_Lock.lock(); tempLastResult = objDist_Send[tempSensorID]; sonarSend_Lock.unlock(); } if(tempSensorID >= NUM_OF_SENSOR_MAX) { //copy and send sonarSend_Lock.lock(); objDist_Send.clear(); sensorStatus_Send.clear(); objDist_Send.swap(objDist); sensorStatus_Send.swap(sensorStatus); sonarSend_Lock.unlock(); emit UltrasonicData_Ready(); //clear objDist.fill(DIST_ERROR,NUM_OF_SENSOR_MAX); sensorStatus.fill(false,NUM_OF_SENSOR_MAX); tempSensorID = 0; } // if(tempLastResult <= 2000) // emit Enable_Ask(true,tempSensorID,2); // else if(tempLastResult <= 3800) // emit Enable_Ask(true,tempSensorID,1); // else // emit Enable_Ask(true,tempSensorID,0); decodeTimer.restart(); } else { this->Trans_From_CANRaw(tempCANRaw); if(CAN_ID == setupConfig.sonarCAN_ID && CAN_DLC == 2) { tempDist = (CAN_data[0] << 8) | CAN_data[1]; if(tempDist <= 0x1650 && tempDist >= 0xD0) { decodeEnableFlag = false; objDist[decodeSensorID] = tempDist; sensorStatus[decodeSensorID] = true; tempSensorID = decodeSensorID + 1; if(tempSensorID >= NUM_OF_SENSOR_MAX) { sonarSend_Lock.lock(); tempLastResult = objDist_Send[0]; sonarSend_Lock.unlock(); } else { sonarSend_Lock.lock(); tempLastResult = objDist_Send[tempSensorID]; sonarSend_Lock.unlock(); } if(tempSensorID >= NUM_OF_SENSOR_MAX) { //copy and send sonarSend_Lock.lock(); objDist_Send.clear(); sensorStatus_Send.clear(); objDist_Send.swap(objDist); sensorStatus_Send.swap(sensorStatus); sonarSend_Lock.unlock(); emit UltrasonicData_Ready(); //clear objDist.fill(DIST_ERROR,NUM_OF_SENSOR_MAX); sensorStatus.fill(false,NUM_OF_SENSOR_MAX); tempSensorID = 0; } // if(tempLastResult <= 2000) // emit Enable_Ask(true,tempSensorID,2); // else if(tempLastResult <= 3800) // emit Enable_Ask(true,tempSensorID,1); // else // emit Enable_Ask(true,tempSensorID,0); decodeTimer.restart(); } } } } } } void CANRecv_Consumer::Enable_DecodeResult_Slot(bool enableFlag,uint8_t sensorID) { decodeEnableFlag = enableFlag; decodeSensorID = sensorID; decodeTimer.restart(); } void CANRecv_Consumer::UltrasonicData_Ready_Slot(void) { iv::ultrasonic::ultrasonic xmsg; uint64_t tempLastTime = QDateTime::currentMSecsSinceEpoch(); std::cout<<"interval time is "< pstrser; pstrser.reset(strser); if(xmsg.SerializePartialToArray(strser,ndatasize)) { iv::modulecomm::ModuleSendMsg(shmSonar.mpa,strser,ndatasize); } else { std::cout<<"ultrasonic data serialize error."<