|
@@ -0,0 +1,150 @@
|
|
|
+#include "canrecv_consumer.h"
|
|
|
+
|
|
|
+#include "math.h"
|
|
|
+
|
|
|
+extern setupConfig_t setupConfig;
|
|
|
+extern iv::msgunit shmSonar;
|
|
|
+
|
|
|
+extern Byte_Qvector_Producer_Consumer SDIDataRecv;
|
|
|
+extern Byte_Qvector_Producer_Consumer FreeSpaceDataRecv;
|
|
|
+
|
|
|
+//#define RESULT_OUTPUT_ENABLE
|
|
|
+
|
|
|
+CANRecv_Consumer::CANRecv_Consumer(CAN_Producer_Consumer *pBuf)
|
|
|
+{
|
|
|
+ pBuffer = pBuf;
|
|
|
+
|
|
|
+ QObject::connect(this,&CANRecv_Consumer::SDI_Data_Ready,this,&CANRecv_Consumer::SDI_Data_Ready_Slot);
|
|
|
+ QObject::connect(this,&CANRecv_Consumer::FreeSpace_Data_Ready,this,&CANRecv_Consumer::FreeSpace_Data_Ready_Slot);
|
|
|
+
|
|
|
+ SDI_data.fill(0x00,2048);
|
|
|
+ freeSpace_data.fill(0x00,2048);
|
|
|
+}
|
|
|
+
|
|
|
+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();
|
|
|
+ for(int i=0;i<CAN_DLC;i++)
|
|
|
+ {
|
|
|
+ CAN_data[i] = xraw.data()[i];
|
|
|
+ }
|
|
|
+
|
|
|
+ return CAN_ID;
|
|
|
+}
|
|
|
+
|
|
|
+void CANRecv_Consumer::run()
|
|
|
+{
|
|
|
+ iv::can::canraw tempCANRaw;
|
|
|
+
|
|
|
+ while (!QThread::isInterruptionRequested())
|
|
|
+ {
|
|
|
+ tempCANRaw.CopyFrom(pBuffer->Consume_Element()); // tempCANRaw is unnecessary to clear, Consume_Element may return an empty data
|
|
|
+ if(tempCANRaw.id() == 0x600)
|
|
|
+ {
|
|
|
+ SDI_data.clear();
|
|
|
+ SDI_data.fill(0x00,2048);
|
|
|
+ Trans_From_CANRaw(tempCANRaw);
|
|
|
+ SDI_data_ptr = 0;
|
|
|
+ SDI_msg_CNT = CAN_data[3]<<8 | CAN_data[2];
|
|
|
+ SDI_payload_size = CAN_data[1]<<8 | CAN_data[0];
|
|
|
+ SDI_recvStatus = RecevingData;
|
|
|
+ }
|
|
|
+ else if(SDI_recvStatus == RecevingData && tempCANRaw.id() > 0x600 && tempCANRaw.id() < 0x700)
|
|
|
+ {
|
|
|
+ Trans_From_CANRaw(tempCANRaw);
|
|
|
+ uint16_t tempMsgCnt = CAN_ID - 0x600;
|
|
|
+ if(tempMsgCnt <= SDI_msg_CNT)
|
|
|
+ {
|
|
|
+ for(int i=0;i<CAN_DLC;i++)
|
|
|
+ {
|
|
|
+ SDI_data[SDI_data_ptr] = CAN_data[i];
|
|
|
+ SDI_data_ptr +=1;
|
|
|
+ }
|
|
|
+ if(SDI_data_ptr != 0 && tempMsgCnt >= SDI_msg_CNT && SDI_data_ptr >= SDI_payload_size)
|
|
|
+ {
|
|
|
+ SDI_data_fine_lock.lock();
|
|
|
+ SDI_data_fine.swap(SDI_data);
|
|
|
+ SDI_data_fine_lock.unlock();
|
|
|
+ emit SDI_Data_Ready();
|
|
|
+ SDI_recvStatus = WaitingMsgHeader;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ SDI_data_ptr = 0;
|
|
|
+ SDI_msg_CNT = 0;
|
|
|
+ SDI_payload_size = 0;
|
|
|
+ SDI_recvStatus = WaitingMsgHeader;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ else if(tempCANRaw.id() == 0x700)
|
|
|
+ {
|
|
|
+ freeSpace_data.clear();
|
|
|
+ freeSpace_data.fill(0x00,2048);
|
|
|
+ Trans_From_CANRaw(tempCANRaw);
|
|
|
+ freeSpace_data_ptr = 0;
|
|
|
+ freeSpace_msg_CNT = CAN_data[3]<<8 | CAN_data[2];
|
|
|
+ freeSpace_payload_size = CAN_data[1]<<8 | CAN_data[0];
|
|
|
+ freeSpace_recvStatus = RecevingData;
|
|
|
+ }
|
|
|
+ else if(freeSpace_recvStatus == RecevingData && tempCANRaw.id() > 0x700 && tempCANRaw.id() < 0x800)
|
|
|
+ {
|
|
|
+ Trans_From_CANRaw(tempCANRaw);
|
|
|
+ uint16_t tempMsgCnt = CAN_ID - 0x600;
|
|
|
+ if(tempMsgCnt <= freeSpace_msg_CNT)
|
|
|
+ {
|
|
|
+ for(int i=0;i<CAN_DLC;i++)
|
|
|
+ {
|
|
|
+ freeSpace_data[freeSpace_data_ptr] = CAN_data[i];
|
|
|
+ freeSpace_data_ptr +=1;
|
|
|
+ }
|
|
|
+ if(freeSpace_data_ptr != 0 && tempMsgCnt >= freeSpace_msg_CNT && freeSpace_data_ptr >= freeSpace_payload_size)
|
|
|
+ {
|
|
|
+ freeSpace_data_fine_lock.lock();
|
|
|
+ freeSpace_data_fine.swap(freeSpace_data);
|
|
|
+ freeSpace_data_fine_lock.unlock();
|
|
|
+ emit FreeSpace_Data_Ready();
|
|
|
+ freeSpace_recvStatus = WaitingMsgHeader;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ freeSpace_data_ptr = 0;
|
|
|
+ freeSpace_msg_CNT = 0;
|
|
|
+ freeSpace_payload_size = 0;
|
|
|
+ freeSpace_recvStatus = WaitingMsgHeader;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+}
|
|
|
+
|
|
|
+void CANRecv_Consumer::SDI_Data_Ready_Slot(void)
|
|
|
+{
|
|
|
+ SDI_data_fine_lock.lock();
|
|
|
+ SDIDataRecv.Produce_Element(SDI_data_fine);
|
|
|
+ SDI_data_fine.clear();
|
|
|
+ SDI_data_fine_lock.unlock();
|
|
|
+}
|
|
|
+
|
|
|
+void CANRecv_Consumer::FreeSpace_Data_Ready_Slot(void)
|
|
|
+{
|
|
|
+ freeSpace_data_fine_lock.lock();
|
|
|
+ FreeSpaceDataRecv.Produce_Element(SDI_data_fine);
|
|
|
+ freeSpace_data_fine.clear();
|
|
|
+ freeSpace_data_fine_lock.unlock();
|
|
|
+}
|