#include "ValidProcess.h" ValidProcess::ValidProcess(QObject* parent) : IProcess(parent) {} ValidProcess::~ValidProcess() { if (m_pConstBuffer) { delete m_pConstBuffer; m_pConstBuffer = nullptr; } m_file.write(m_fileArray); m_file.flush(); m_file.close(); } void ValidProcess::init(Frame* frame, map& mapUIntProcess) { m_pFrame = frame; m_mapUIntProcess = mapUIntProcess; m_pConstBuffer = new ConstBuffer(DataBufferLength, false, false, m_pFrame->m_uiFrameLen); createDataPath("Valid"); } void ValidProcess::run() { unsigned char* m_ReadBuffer = new unsigned char[m_pFrame->m_uiFrameLen]; unsigned short usReadLen; m_uiDataSize = 0; m_uiIndex = 0; m_bNeedWork = true; while (m_bNeedWork) { usReadLen = m_pConstBuffer->read(m_ReadBuffer, m_pFrame->m_uiFrameLen); if (usReadLen <= 0) { QThread::usleep(1); continue; } m_byteArray.append((char*)m_ReadBuffer, (int)m_pFrame->m_uiFrameLen); m_uiDataSize = m_byteArray.size(); m_uiIndex = 0; // 副帧类型 if (m_pFrame->m_usSubFrameType == 1) { // 无副帧 while (m_uiIndex + m_pFrame->m_uiFrameLen <= m_uiDataSize) { if (m_pFrame->m_headArray[0] == m_byteArray[m_uiIndex] && m_pFrame->m_headArray[1] == m_byteArray[m_uiIndex + 1]) { if (m_pFrame->m_usHeadAddr == 1) { // 帧头在每行最前 m_validArray = m_byteArray.mid(m_uiIndex - m_pFrame->m_usBeforeHeadLen, m_pFrame->m_uiFrameLen); frameExtract(); m_uiIndex += m_pFrame->m_uiFrameLen; } else if (m_pFrame->m_usHeadAddr == 2) { // 帧头在每行最后 if (m_pFrame->m_usBeforeHeadLen <= m_uiIndex) { // 说明第一个子帧满足 m_validArray = m_byteArray.mid(m_uiIndex - m_pFrame->m_usBeforeHeadLen, m_pFrame->m_uiFrameLen); frameExtract(); m_uiIndex -= m_pFrame->m_usBeforeHeadLen; m_uiIndex += m_pFrame->m_uiFrameLen; } else { ++m_uiIndex; } } } else { ++m_uiIndex; } } m_byteArray.remove(0, m_uiIndex); m_uiDataSize = 0; m_uiIndex = 0; } else if (m_pFrame->m_usSubFrameType == 2) { // 反码副帧 while (m_uiIndex + m_pFrame->m_uiFrameLen <= m_uiDataSize) { if (m_pFrame->m_headArray[0] == m_byteArray[m_uiIndex] && m_pFrame->m_headArray[1] == m_byteArray[m_uiIndex + 1] && m_pFrame->m_subHeadArray[0] == m_byteArray[m_uiIndex + m_pFrame->m_uiFrameLen - m_pFrame->m_uiColumn] && m_pFrame->m_subHeadArray[1] == m_byteArray[m_uiIndex + m_pFrame->m_uiFrameLen - m_pFrame->m_uiColumn + 1]) { if (m_pFrame->m_usHeadAddr == 1) { // 帧头在每行最前 m_validArray = m_byteArray.mid(m_uiIndex - m_pFrame->m_usBeforeHeadLen, m_pFrame->m_uiFrameLen); frameExtract(); m_uiIndex += m_pFrame->m_uiFrameLen; } else if (m_pFrame->m_usHeadAddr == 2) { // 帧头在每行最后 if (m_pFrame->m_usBeforeHeadLen <= m_uiIndex) { // 说明第一个子帧满足 m_validArray = m_byteArray.mid(m_uiIndex - m_pFrame->m_usBeforeHeadLen, m_pFrame->m_uiFrameLen); frameExtract(); m_uiIndex -= m_pFrame->m_usBeforeHeadLen; m_uiIndex += m_pFrame->m_uiFrameLen; } else { ++m_uiIndex; } } } else { ++m_uiIndex; } } m_byteArray.remove(0, m_uiIndex); m_uiDataSize = 0; m_uiIndex = 0; } else if (m_pFrame->m_usSubFrameType == 3) { // ID副帧 while (m_uiIndex + m_pFrame->m_uiFrameLen <= m_uiDataSize) { if (m_pFrame->m_headArray[0] == m_byteArray[m_uiIndex] && m_pFrame->m_headArray[1] == m_byteArray[m_uiIndex + 1] && m_pFrame->m_headArray[0] == m_byteArray[m_uiIndex + m_pFrame->m_uiFrameLen - m_pFrame->m_uiColumn] && m_pFrame->m_headArray[1] == m_byteArray[m_uiIndex + m_pFrame->m_uiFrameLen - m_pFrame->m_uiColumn + 1]) { QByteArray startId = QByteArray::number(m_pFrame->m_usIdStart, 16); // 第一个Id号 QByteArray endId = QByteArray::number(m_pFrame->m_usIdEnd, 16); // 最后一个Id号 if (m_pFrame->m_usHeadAddr == 1) { // 帧头在每行最前 if (startId[0] == m_byteArray[m_uiIndex + m_pFrame->m_usIdAddr] && endId[0] == m_byteArray[m_uiIndex + m_pFrame->m_usIdAddr + m_pFrame->m_uiFrameLen - m_pFrame->m_uiColumn]) { m_validArray = m_byteArray.mid(m_uiIndex - m_pFrame->m_usBeforeHeadLen, m_pFrame->m_uiFrameLen); frameExtract(); m_uiIndex += m_pFrame->m_uiFrameLen; } } else if (m_pFrame->m_usHeadAddr == 2) { if (m_pFrame->m_usBeforeHeadLen <= m_uiIndex) { // 说明第一个子帧满足 if (startId[0] == m_byteArray[m_uiIndex - m_pFrame->m_usBeforeHeadLen + m_pFrame->m_usIdAddr] && endId[0] == m_byteArray[m_uiIndex - m_pFrame->m_usBeforeHeadLen + m_pFrame->m_usIdAddr + m_pFrame->m_uiFrameLen - m_pFrame->m_uiColumn]) { m_validArray = m_byteArray.mid(m_uiIndex - m_pFrame->m_usBeforeHeadLen, m_pFrame->m_uiFrameLen); frameExtract(); m_uiIndex -= m_pFrame->m_usBeforeHeadLen; m_uiIndex += m_pFrame->m_uiFrameLen; } else { ++m_uiIndex; } } } } else { ++m_uiIndex; } } m_byteArray.remove(0, m_uiIndex); m_uiDataSize = 0; m_uiIndex = 0; } } m_uiDataSize = 0; m_uiIndex = 0; m_byteArray.clear(); m_validArray.clear(); } void ValidProcess::frameExtract() { for (auto process : m_mapUIntProcess) { if (process.second) { if (process.second->getProcessModel() == 3) { // 图像 VideoProcess* pVideoProcess = (VideoProcess*)process.second; if (pVideoProcess->getVideoPlayStatus() == false) { continue; } } process.second->getConstBuffer()->write((unsigned char*)m_validArray.data(), (unsigned short)m_validArray.size()); } } m_fileArray.append(m_validArray); m_validArray.clear(); if (DataAchiveBuffer <= m_fileArray.size()) { m_file.write(m_fileArray); m_file.flush(); m_fileArray.clear(); } }