#include "CounterDevice.h" #include <iostream> #include <QDateTime> #include <QDebug> CounterDevice::CounterDevice(QObject *parent) : QObject(parent) { connect(&this->serialUtil, &QSerialPortUtil::dataRecieved, this, &CounterDevice::dataReceivedHandler); udpClient = new QUdpSocket(this); } CounterDevice::~CounterDevice() { disconnect(&this->serialUtil, &QSerialPortUtil::dataRecieved, this, &CounterDevice::dataReceivedHandler); } void CounterDevice::setComName(QString comName) { this->comName = comName; } void CounterDevice::setBaudRate(int baudRate) { this->baudRate = baudRate; } QString CounterDevice::getDevCode() { return this->devCode; } void CounterDevice::setDevCode(QString devCode) { this->devCode = devCode; } void CounterDevice::setDeviceId(QString deviceId) { this->deviceId = deviceId; } bool CounterDevice::isSerialOpen() { return this->serialUtil.isOpen(); } void CounterDevice::initSerialPort() { this->serialUtil.openSerialPort(this->comName, this->baudRate); } void CounterDevice::dataReceivedHandler(QByteArray data) { this->dataBuff.append(data); std::cout << QByteUtil::binToHexString(this->dataBuff).toStdString() << std::endl; CounterDataDto * counterData = new CounterDataDto(this); if (CounterProtocolXH::checkFrame(this->dataBuff) == true) { counterData->rawFrame = this->dataBuff; // ★解析成数据对象 bool parse = CounterProtocolXH::parseMessureData(this->dataBuff, counterData); // 解析成功 if (parse == true) { this->dataBuff.clear(); QDateTime now = QDateTime::currentDateTime(); counterData->devCode = this->devCode; counterData->timestamp = now.toString("yyyy-MM-dd HH:mm:ss.zzz"); counterData->milisecond = now.toMSecsSinceEpoch(); this->afterFramePhase(counterData); } } else if (this->dataBuff.size() > COUNTER_FRAME_MIN_LENGTH) { std::cout << QString("%1").arg(this->dataBuff.size()).toStdString() << std::endl; this->dataBuff.clear(); } // 在此处释放内存,不影响后续显示 // 不在此处释放内存则会导致内存持续增加 // 具体原因不明 delete counterData; } void CounterDevice::afterFramePhase(CounterDataDto * counterData) { // 0. 输出到日志文件中 QString date = counterData->timestamp.mid(0, 10); // 1. 原始字节数组数据 QString filename = "raw_" + devCode + ".log"; QString content = counterData->timestamp + " " + counterData->rawFrame; QLogUtil::writeRawDataLogByDate(date, filename, content); // 2. 各个通道的clock diff数据 for (int i = 1; i <= counterData->channelActiveArray.size(); i++) { if (counterData->channelRefId == i) { continue; } if (counterData->channelActiveArray.at(i-1).toUInt() == 1) { QString chFilename("%1_CH_%2.log"); chFilename = chFilename.arg(devCode); if (i < 10) { chFilename = chFilename.arg(QString("0%1").arg(i)); } else { chFilename = chFilename.arg(i); } QString channelDataStr = QString("%1 [%2] %3").arg(counterData->timestamp).arg(counterData->frameId).arg(counterData->channelDataArray.at(i-1)); QLogUtil::writeChannelDataLogByDate(date, chFilename, channelDataStr); // 取到钟编号和时延值 QString openClock = SettingConfig::getInstance().CLOCK_ARR.at(0).at(i - 1); QString closeClock = SettingConfig::getInstance().CLOCK_ARR.at(0).at(counterData->channelRefId - 1); QString delay = SettingConfig::getInstance().DELAY_ARR.at(0).at(i - 1); // 3. 通过UDP发送到本地的Java后端进行存库处理 QJsonObject jsonObj = counterData->toJSON(i - 1); jsonObj.insert("deviceId", deviceId); jsonObj.insert("devCode", devCode); QJsonObject data = jsonObj.take("data").toObject(); data.insert("openClock", openClock); data.insert("closeClock", closeClock); double value = data.find("dataValue")->toString().toDouble(); value += delay.toDouble() * 1E-9; data.insert("dataValue", QString::number(value, 'f', 12)); jsonObj.insert("data", data); udpClient->writeDatagram(QString(QJsonDocument(jsonObj).toJson(QJsonDocument::Compact)).toLocal8Bit(), QHostAddress(SettingConfig::getInstance().RECV_HOST), SettingConfig::getInstance().RECV_PORT); } } // 4. 在界面上简单显示相差数据结果 emit this->sendDataToDraw(counterData); } void CounterDevice::onClockChanged() { } void CounterDevice::onDelayChanged() { }