/**
* @file XRayControl.h
* @brief 射线源封装
*
* 射线源封装
*
* @author jyh
* @version 1.0.0
* @date 2023年12月14日
* @note 新建
*/
#ifndef XRAYCONTROL_H
#define XRAYCONTROL_H
#include <QObject>
#include <QMap>
#include <QtSerialPort/QSerialPort> // 提供访问串口的功能
#include "SerialPortHelp\HamamatsuHelp.h"
#include "WebSocket\CometCubeHelper.h"
namespace drive
{
class XRayControl : public QObject
{
Q_OBJECT
public:
XRayControl(QObject *parent = Q_NULLPTR);
~XRayControl();
bool Init();
bool UnInit();
void SetXRayRst();
void SetSyncWarmUp();
void SetWarmUp();
int SetXRaySwitch(bool bIsOpen);
int SetXRayElectricParams(int nVol, int nCur);
XRayMonitorStatus GetAutoXRaySts();
XRayMonitorStatus GetXRayStatus();
int GetXRayUseTime();
bool SyncXRayClose(int nTime = XRAY_SYNC_WAIT);
bool SyncXRayOpen(int nVol, int nCur, int nTime = 40);
bool AutoMotionReady();
XRayMonitorMap GetXRayMonitorMap();
int GetOutputVoltage() const { return m_nOutVol; }
int GetOutputCurrent()const { return m_nOutCur; }
private:
SerialPortBase* m_pXRayHelp; //射线源串口类
QThread* m_pXRayThread; //射线源子线程
XRayMonitorMap m_XRayStatusMap; //监听数据信息
//XRayType m_XRayType; //射线源类型
XRayMonitorStatus m_XRayStatus; //射线源状态
XRaySettingParams m_stXRaySettingParams; //射线源串口设置参数结构体
int m_nOutVol; //输出电压
int m_nOutCur; //输出电流
int m_nUseTime; /*!< 射线源使用时间 >*/
void GetMonitorParams();
signals:
void SigXRayRst();
void SigXRayWarmUp();
void SigRevFrameData(const QString& str, bool nResult);
void SigUpdateXRayStatus(XRayMonitorStatus status, int nVol, int nCur);
void SigUpdateXRayUseTime(int nUseTime);
void SigUnInit();
void SigSetXRayElectricParams(int nVol, int nCur);
void SigSetXRaySwitch(bool bStatus);
public slots :
void OnXRayStatusChanged(QMap<SerialPortCommand, int> qMapStatus);
};
}
#endif
#include "XRayControl.h"
#include "common\PiercingEyeSetting.h"
#include <QtConcurrent>
using namespace drive;
const int g_SerialFailedTimes = 3; //串口发送重试次数
drive::XRayControl::XRayControl(QObject * parent)
:QObject(parent)
, m_pXRayHelp(NULL)
, m_nOutVol(0)
, m_nOutCur(0)
, m_nUseTime(0)
{
}
drive::XRayControl::~XRayControl()
{
delete m_pXRayThread;
m_pXRayThread = nullptr;
}
bool drive::XRayControl::Init()
{
m_stXRaySettingParams = common::PiercingEyeSetting::GetInstall().GetXRayPortParams();
switch (m_stXRaySettingParams.eXRayType)
{
case Hamamatsu_L10941_05:
if (NULL == m_pXRayHelp)
{
m_pXRayHelp = new drive::HamamatsuHelp();
}
break;
case Hamamatsu_L9181_05:
break;
case Comet_Cube:
if (NULL == m_pXRayHelp)
{
m_pXRayHelp = new drive::CometCubeHelper();
}
break;
default:
break;
}
for (int i = XRMT_STS; i < XRMT_NUMS; i++)
{
m_XRayStatusMap[i] = 0;
}
m_pXRayThread = new QThread;
m_pXRayHelp->moveToThread(m_pXRayThread);
m_pXRayHelp->SetPortParams(m_stXRaySettingParams.sPortName, (QSerialPort::BaudRate)m_stXRaySettingParams.nBaudRate);
connect(m_pXRayThread, &QThread::started, m_pXRayHelp, &SerialPortBase::OnSerialThreadStarted);
connect(m_pXRayThread, &QThread::finished, m_pXRayHelp, &QObject::deleteLater);
//射线源数据更新
connect(m_pXRayHelp, &SerialPortBase::SigMapParamsUpdate, this, &XRayControl::OnXRayStatusChanged, Qt::UniqueConnection);
//射线源使用时间刷新
connect(m_pXRayHelp, &SerialPortBase::SigUpdateXRayUseTime, this, &XRayControl::SigUpdateXRayUseTime);
//射线源逆初始化
connect(this, &XRayControl::SigUnInit, m_pXRayHelp, &SerialPortBase::UnInit);
//射线源软复位
connect(this, &XRayControl::SigXRayRst, m_pXRayHelp, &SerialPortBase::OnResetXRay);
//射线源预热指令
connect(this, &XRayControl::SigXRayWarmUp, m_pXRayHelp, &SerialPortBase::OnWarmUpXRay);
//设置电压电流
connect(this, &XRayControl::SigSetXRayElectricParams, m_pXRayHelp, &SerialPortBase::OnSetXRayParams);
//开启或关闭射线源
connect(this, &XRayControl::SigSetXRaySwitch, m_pXRayHelp, &SerialPortBase::OnSwitchXRay);
m_pXRayThread->start();
return false;
}
bool drive::XRayControl::UnInit()
{
emit SigSetXRaySwitch(false);
//添加阻塞
QEventLoop loop;
connect(m_pXRayHelp, &SerialPortBase::SigUnitFinished, &loop, &QEventLoop::quit);
emit SigUnInit();
loop.exec();
m_pXRayThread->quit();
m_pXRayThread->wait();
return false;
}
void drive::XRayControl::SetXRayRst()
{
emit SigXRayRst();
}
void drive::XRayControl::SetSyncWarmUp()
{
}
void drive::XRayControl::SetWarmUp()
{
emit SigXRayWarmUp();
}
int drive::XRayControl::SetXRaySwitch(bool bIsOpen)
{
emit SigSetXRaySwitch(bIsOpen);
if (!bIsOpen && m_XRayStatus == XRMS_On) //只有开源后关源才设置成准备就绪
{
m_XRayStatus = XRMS_StandBy;
}
return true;
}
int drive::XRayControl::SetXRayElectricParams(int nVol, int nCur)
{
emit SigSetXRayElectricParams(nVol, nCur);
return 0;
}
XRayMonitorStatus drive::XRayControl::GetAutoXRaySts()
{
XRayMonitorStatus nXRaySts = GetXRayStatus();
switch (nXRaySts)
{
case XRMS_NeedWarmUp:
break;
case XRMS_WarmUp:
break;
case XRMS_StandBy:
break;
case XRMS_On:
break;
case XRMS_Protected:
{
SetXRayRst();
QThread::msleep(1000);
nXRaySts = GetXRayStatus();
}break;
case XRMS_Failure:
case XRMS_TsfOn:
case XRMS_LockOn:
{
QThread::msleep(1000);
nXRaySts = GetXRayStatus();
}break;
default:
break;
}
return nXRaySts;
}
XRayMonitorStatus drive::XRayControl::GetXRayStatus()
{
//重新获取下状态
XRayMonitorMap xRayStatus = GetXRayMonitorMap();
OnXRayStatusChanged(xRayStatus);
return m_XRayStatus;
}
int drive::XRayControl::GetXRayUseTime()
{
return m_nUseTime;
}
bool drive::XRayControl::SyncXRayClose(int nTime)
{
SetXRaySwitch(false);
int nWait = 0;
while (nWait < nTime)
{
if (m_nOutVol < 1 && m_nOutCur < 1)
{
//qDebug("XRayOpen Wait Time == %d ms", nWait * XRAY_WAIT_TIME);
LOG_DEBUG("XRay Close Wait Time == %d ms", nWait * XRAY_WAIT_TIME);
//QThread::msleep(XRAY_WAIT_TIME);
break;
}
QThread::msleep(XRAY_WAIT_TIME);
nWait++;
}
if (nWait >= nTime)
{
return false;
}
m_XRayStatus = XRMS_StandBy;
return true;
}
bool drive::XRayControl::SyncXRayOpen(int nVol, int nCur, int nTime)
{
SetXRayElectricParams(nVol, nCur);
SetXRaySwitch(true);
int nIdx = 0;
while (nIdx < nTime)
{
if (nVol<= (m_nOutVol+1)&&nCur <= (m_nOutCur + 1))
{
qDebug("XRayOpen Wait Time == %d ms", nIdx*XRAY_WAIT_TIME);
break;
}
QThread::msleep(XRAY_WAIT_TIME);
nIdx++;
}
if (nIdx >= nTime)
{
return false;
}
return true;
}
XRayMonitorMap drive::XRayControl::GetXRayMonitorMap()
{
return m_pXRayHelp->GetXRayMonitorMap();
}
bool drive::XRayControl::AutoMotionReady()
{
switch (m_XRayStatus)
{
case XRMS_NeedWarmUp:
{
emit SigRevFrameData(tr("C_XRayNeedWarmUp"), false);
return false;
}
case XRMS_WarmUp:
{
emit SigRevFrameData(tr("C_XRayWarmUp"), false);
return false;
}
break;
case XRMS_StandBy:
case XRMS_On:
{
//射线源状态正常
emit SigRevFrameData(tr("C_XRayReady"), true);
}break;
case XRMS_Protected:
case XRMS_Failure:
case XRMS_TsfOn:
case XRMS_LockOn:
{
//启动失败,射线源连锁关闭
emit SigRevFrameData(tr("C_XRayLockOn"), false);
return false;
}break;
default:
break;
}
return true;
}
void drive::XRayControl::GetMonitorParams()
{
m_pXRayHelp->SendCommand(XRSCH_SAR, 0);
}
void drive::XRayControl::OnXRayStatusChanged(XRayMonitorMap qMapStatus)
{
XRayMonitorStatus nStatus = XRMS_NeedWarmUp;
for (int i = XRMT_STS; i < XRMT_NUMS; i++)
{
m_XRayStatusMap[i] = qMapStatus[i];
}
if (m_XRayStatusMap[XRMT_STS] == 5 && m_XRayStatusMap[XRMT_SIN] == 1)
{
nStatus = XRMS_LockOn;
}
else
{
nStatus = (XRayMonitorStatus)m_XRayStatusMap[XRMT_STS];
}
if (m_nOutVol != m_XRayStatusMap[XRMT_SHV] ||
m_nOutCur != m_XRayStatusMap[XRMT_SCU] ||
m_XRayStatus != nStatus)
{
m_nOutVol = m_XRayStatusMap[XRMT_SHV];
m_nOutCur = m_XRayStatusMap[XRMT_SCU];
m_XRayStatus = nStatus;
LOG_DEBUG("XRayMonitorStatus:Sts: %d; vol:%d ; Cur:%d ", m_XRayStatus, m_nOutVol, m_nOutCur);
emit SigUpdateXRayStatus(m_XRayStatus, m_nOutVol, m_nOutCur);
}
if (m_nUseTime != m_XRayStatusMap[XRMT_XST_TIME])
{
m_nUseTime = m_XRayStatusMap[XRMT_XST_TIME];
emit SigUpdateXRayUseTime(m_nUseTime);
}
}
讲讲这些代码,仔细讲解每一行,然后给出整体的运行流程