#include "lpSerialStation.h" lpSerialStation::lpSerialStation() { qRegisterMetaType("SerialErrorType"); m_pobjThread = new QThread; moveToThread(m_pobjThread); connect(m_pobjThread, &QThread::started, this, &lpSerialStation::onOpen); connect(m_pobjThread, &QThread::finished, this, &QObject::deleteLater); } lpSerialStation::~lpSerialStation() { closeComs(); if (m_pobjThread) { m_pobjThread->quit(); m_pobjThread->wait(); m_pobjThread = nullptr; } } bool lpSerialStation::loadParameters(const QString& filePath) { int error; QJsonObject objJson = QZkJsonParser::ReadJsonObject(filePath, &error); if (!objJson.empty()) { QJsonArray jArray = objJson.value("leaper").toArray(); for (int i = 0; i < jArray.size(); ++i) { QJsonObject COMObj = jArray[i].toObject(); SerialParam sp; sp.port_name_ = COMObj.value("port_name").toString(); sp.baud_ = COMObj.value("BAUD").toInt(); sp.auto_connect_ = COMObj.value("auto_connect").toBool(); sp.modbus_type_ = SERIAL_LEAPER; m_commDeviceMap.insert(COMObj.value("device_name").toString(), sp); } } else { qDebug() << "please check the comSetting file, err: " << error; return false; } qDebug() << "SensorsCom load param successed"; return true; } void lpSerialStation::openComs() { m_pobjThread->start(); } void lpSerialStation::closeComs() { for (auto iter = m_commDeviceMap.begin(); iter != m_commDeviceMap.end(); iter++) { lp_serial_manager::instance()->close(iter.value().port_name_); } } void lpSerialStation::onControlSideLight(int cmdData) { QSharedPointer byteArr_ptr = QSharedPointer(new LpSerialFrame); byteArr_ptr->cmd = LP_SIDELIGHT_SWITCH; byteArr_ptr->data2 = cmdData; lp_serial_manager::instance()->on_data_send(m_commDeviceMap[SINGLECHIP_COM].port_name_, byteArr_ptr); } Q_SLOT void lpSerialStation::onStartEmptyPlaceCheck(QString streetName) { m_bStartEmptyCheck = true; m_strStreetName = streetName; m_queueCodeLeft.clear(); m_queueCodeRight.clear(); m_mapEmptyLeft.clear(); m_mapEmptyRight.clear(); } Q_SLOT void lpSerialStation::onStopEmptyPlaceCheck() { m_bStartEmptyCheck = false; emit sgNewEmptyCheckResults(m_mapEmptyLeft); QThread::msleep(5); emit sgNewEmptyCheckResults(m_mapEmptyRight); } Q_SLOT void lpSerialStation::onNewCodeScanResults(int sdID, QSharedPointer data_ptr_) { if (!m_bStartEmptyCheck) { return; } //CodeScanResults csr; //csr.sdID = sdID; //csr.ResData = *data_ptr_; //m_CodeScanResQ.enqueue(csr); QString codeStr = QString(*data_ptr_).trimmed().mid(1); QString codeStrNew = codeStr; if (codeStrNew.length() == 10) { QString strCol = codeStrNew.mid(1, 3); //col 1~62 QString strRow = codeStrNew.mid(4, 2);// row 1~9 int nCol = strCol.toInt(0); int nRow = strRow.toInt(0); if (nCol < 1 || nCol > 62 || nRow < 1 || nRow > 9) { qWarning() << "col or row overrun!"; return; } if (m_strStreetName == "6") { if (nRow == 1 || nRow == 2) { QString strColNew = QString("%1").arg(nCol + 1, 3, 10, QLatin1Char('0')); codeStrNew.replace(1, 3, strColNew); } } int streetSn = m_strStreetName.toInt(); QString streetNameTemp = QString("%1").arg(streetSn, 2, 10, QLatin1Char('0')); if (sdID == eSideID::em_RIGHT) { QString strCodeRightOut = "UL" + streetNameTemp + codeStrNew; m_queueCodeRight.enqueue(strCodeRightOut); QSharedPointer data_ptr = QSharedPointer(new LpSerialFrame); int streetNum = m_strStreetName.toInt(); data_ptr->cmd = 0x84; if (streetNum <= 6 && streetNum >= 1 || streetNum == 10) { data_ptr->data1 = 1; } else { data_ptr->data1 = 1; data_ptr->data3 = 1; } lp_serial_manager::instance()->on_data_send(m_commDeviceMap[SINGLECHIP_COM].port_name_, data_ptr);//leaper协议数据发送 发送方式1 } else if (sdID == eSideID::em_LEFT) { QString strCodeLeftOut = "UL" + streetNameTemp + codeStrNew; m_queueCodeLeft.enqueue(strCodeLeftOut); QSharedPointer data_ptr = QSharedPointer(new LpSerialFrame); int streetNum = m_strStreetName.toInt(); data_ptr->cmd = 0x84; if (streetNum <= 7 && streetNum >= 1) { data_ptr->data2 = 1; } else { data_ptr->data2 = 1; data_ptr->data4 = 1; } lp_serial_manager::instance()->on_data_send(m_commDeviceMap[SINGLECHIP_COM].port_name_, data_ptr);//leaper协议数据发送 发送方式1 } } } Q_SLOT void lpSerialStation::onOpen() { for (auto iter = m_commDeviceMap.begin(); iter != m_commDeviceMap.end(); iter++) { if (lp_serial_manager::instance()->open(iter.value()) == -1) { qDebug() << "open " << iter.value().port_name_ << " fail."; continue; } } connect(lp_serial_manager::instance(), SIGNAL(signal_data_recv(const QString&, QSharedPointer)), this, SLOT(onDataReceive(const QString&, QSharedPointer))); connect(lp_serial_manager::instance(), SIGNAL(signal_state_changed(const QString&, SerialErrorType)), this, SLOT(onStateChanged(const QString&, SerialErrorType)));//串口打开状态 } Q_SLOT void lpSerialStation::onDataReceive(const QString& sn, QSharedPointer data_ptr_) { qDebug() << "monitor receive data"; // for monitor trigger if (data_ptr_->cmd == 0x83) { qDebug() << "i rsv data 0:" << data_ptr_->data1; qDebug() << "i rsv data 1:" << data_ptr_->data2; if (data_ptr_->data1 == StockCheckTrigger::emMonitorTriggerStart) { emit sgMonitorSensorTriggerStart(em_RIGHT); qDebug() << "i start right trigger"; } else if (data_ptr_->data1 == StockCheckTrigger::emMonitorTriggerStop) { emit sgMonitorSensorTriggerStop(em_RIGHT); qDebug() << "i stop right trigger"; } if (data_ptr_->data2 == StockCheckTrigger::emMonitorTriggerStart) { emit sgMonitorSensorTriggerStart(em_LEFT); qDebug() << "i start left trigger"; } else if (data_ptr_->data2 == StockCheckTrigger::emMonitorTriggerStop) { emit sgMonitorSensorTriggerStop(em_LEFT); qDebug() << "i stop left trigger"; } return; } else if (data_ptr_->cmd == 0x84) { quint16 data1 = data_ptr_->data1; quint16 data2 = data_ptr_->data2; quint16 data3 = data_ptr_->data3; quint16 data4 = data_ptr_->data4; if (data1 != 0) //右侧浅货位 { int empty; empty = data1 == EmptyResult::emExist ? 1 : 0; if (m_queueCodeRight.size() <= 0) { return; } QString strCodeRightOut = m_queueCodeRight.dequeue(); qDebug() << "right out code: " << strCodeRightOut << " empty: " << empty; m_mapEmptyRight.insert(strCodeRightOut, empty); if (data3 != 0) //右侧深货位 { if (m_strStreetName.toInt() != 10) { empty = data3 == EmptyResult::emExist ? 1 : 0; QString strCodeRightIn = strCodeRightOut; strCodeRightIn.replace(11, 1, "2"); qDebug() << "right in code: " << strCodeRightIn << " empty: " << empty; m_mapEmptyRight.insert(strCodeRightIn, empty); } } } else if (data2 != 0) //左侧浅货位 { int empty; empty = data2 == EmptyResult::emExist ? 1 : 0; if (m_queueCodeLeft.size() <= 0) { return; } QString strCodeLeftOut = m_queueCodeLeft.dequeue(); qDebug() << "left out code: " << strCodeLeftOut << " empty: " << empty; m_mapEmptyLeft.insert(strCodeLeftOut, empty); if (data4 != 0) //左侧深货位 { if (m_strStreetName.toInt() != 7) { empty = data4 == EmptyResult::emExist ? 1 : 0; QString strCodeLeftIn = strCodeLeftOut; strCodeLeftIn.replace(11, 1, "2"); qDebug() << "left in code: " << strCodeLeftIn << " empty: " << empty; m_mapEmptyLeft.insert(strCodeLeftIn, empty); } } } } } Q_SLOT void lpSerialStation::onStateChanged(const QString& sn, SerialErrorType err) { /* 显示串口状态 */ QString strMsg; if (err == OpenSuccess) { strMsg = QString("%1 open success!").arg(sn); qDebug() << strMsg; } else if (err == DeviceNotFoundError) { strMsg = QString("%1 not found! open failed.").arg(sn); qDebug() << strMsg; } else if (err == OpenError) { strMsg = QString("%1 open failed.").arg(sn); qDebug() << strMsg; } else if (err == CloseSuccess) { strMsg = QString("%1 close success.").arg(sn); qDebug() << strMsg; } else if (err == CloseError) { strMsg = QString("%1 Not found! close failed.").arg(sn); qDebug() << strMsg; } }