You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
smokeboxidentification/src/lpSerialStation.cpp

301 lines
8.2 KiB
C++

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

#include "lpSerialStation.h"
lpSerialStation::lpSerialStation()
{
qRegisterMetaType<SerialErrorType>("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<LpSerialFrame> byteArr_ptr = QSharedPointer<LpSerialFrame>(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<QByteArray> 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<LpSerialFrame> data_ptr = QSharedPointer<LpSerialFrame>(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Э<72><D0AD><EFBFBD><EFBFBD><EFBFBD>ݷ<EFBFBD><DDB7><EFBFBD> <20><><EFBFBD>ͷ<EFBFBD>ʽ1
}
else if (sdID == eSideID::em_LEFT)
{
QString strCodeLeftOut = "UL" + streetNameTemp + codeStrNew;
m_queueCodeLeft.enqueue(strCodeLeftOut);
QSharedPointer<LpSerialFrame> data_ptr = QSharedPointer<LpSerialFrame>(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Э<72><D0AD><EFBFBD><EFBFBD><EFBFBD>ݷ<EFBFBD><DDB7><EFBFBD> <20><><EFBFBD>ͷ<EFBFBD>ʽ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<LpSerialFrame>)),
this, SLOT(onDataReceive(const QString&, QSharedPointer<LpSerialFrame>)));
connect(lp_serial_manager::instance(), SIGNAL(signal_state_changed(const QString&, SerialErrorType)),
this, SLOT(onStateChanged(const QString&, SerialErrorType)));//<2F><><EFBFBD>ڴ<EFBFBD><DAB4><EFBFBD>״̬
}
Q_SLOT void lpSerialStation::onDataReceive(const QString& sn, QSharedPointer<LpSerialFrame> 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) //<2F>Ҳ<EFBFBD>dz<EFBFBD><C7B3>λ
{
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) //<2F>Ҳ<EFBFBD><D2B2><EFBFBD><EFBFBD><EFBFBD>λ
{
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) //<2F><><EFBFBD><EFBFBD>dz<EFBFBD><C7B3>λ
{
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) //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>λ
{
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)
{
/*
<09><>ʾ<EFBFBD><CABE><EFBFBD><EFBFBD>״̬
*/
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;
}
}