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++

#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)
{
/*
<EFBFBD><EFBFBD>ʾ<EFBFBD><EFBFBD><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;
}
}