本项目为了实现对灯箱仪器的控制,自动从系统查找串口,并设置固定的通讯参数。
1、类关系
类之间的关系如下:
Dialog为界面类,主要完成人机交互。LampCtrl为设备控制类,主要完成同仪器的通信。CLogManager为日志记录,记录通信的状态等。
2、设备的通信协议
1.色温设定:
发送格式:
<ID,C=数值>(数值范围:0100,ID:19)
例:对 2 号设备设定 50%色温
<2,C=50>
正确返回:<ID,B=OK> 例: <2,B=OK>
错误返回:无返回
2.亮度设定:
发送格式:
<ID,L=数值>(数值范围(只能带 1 位小数):0.0~ 100.0,ID:1~ 9)
例:对 3 号设备设定 100%亮度
< 3,L=100.0>
正确返回:<ID,B=OK> 例: < 3,B=OK>
错误返回:无返回
3.频率设定:
发送格式:
<ID,F=数值>(数值范围 :ID:1~9)
数值范围为:000~999HZ 时,数值直接输,
例:对 5 号设备设定 666HZ 频率
<5,F=666>
正确返回:<ID,B=OK>例: <5,B=OK>
错误返回:无返回
4.开关控制:
开灯发送格式:
<ID,S=ON>
例:关闭 5 号设备灯
<5,S=OFF>
正确返回:<ID,B=OK>例: <5,B=OK>
错误返回:无返回
5.查询设备状态:
发送格式:
<ID,I=INFO>
例:对 6 号设备查询状态
<6,I=INFO>
正确返回状态:<ID,C=数值,L=数值,F=数值,S=ON/OFF>
错误返回:无返回
3、界面设计
4、Dialog类
#ifndef DIALOG_H
#define DIALOG_H
#include
#include “lampctrl.h”
namespace Ui {
class Dialog;
}
class CFormula;
class Dialog : public QDialog
{
Q_OBJECT
public:
explicit Dialog(QWidget *parent = 0);
virtual ~Dialog();
public:
void keyPressEvent(QKeyEvent *event);
private:
void InitUI();
void UpdateStatus(bool bIsConnected );
void SpaceLCDDisplay( double dbVal );
void TempLCDDisplay( double dbVal );
void FreqLCDDisplay( double dbVal );
void UpdateTurn( bool bOpen );
private slots:
void on_ptOK_clicked();
void on_ptConnect_clicked();
void OnFreqSpinValueChanged( double dbVal );
void OnFreqSliderValueChanged( int iVal );
void OnTempSpinValueChanged( double dbVal );
void OnTempSliderValueChanged( int iVal );
void OnSpaceSpinValueChanged( double dbVal );
void OnSpaceSliderValueChanged( int iVal );
void OnAutoValueChanged(bool bVal );
void on_ptSave_clicked();
void OnFormulaIndexChanged(int index);
void on_btnTurn_clicked();
private:
Ui::Dialog ui;
LampCtrl theCtrl;
QString m_strCfgFile;
QList<CFormula> m_Formula;
bool m_bTurn;
};
#endif // DIALOG_H
=============================================
#include “dialog.h”
#include “ui_dialog.h”
#include
#include “Log/LogManager.h”
#include
#include
#include “cformula.h”
Dialog::Dialog(QWidget *parent) :
QDialog(parent),
ui(new Ui::Dialog)
{
ui->setupUi(this);
m_bTurn = false;
m_strCfgFile = QCoreApplication::applicationDirPath().append("/config.ini");
InitUI();
theCtrl.Startup();
}
Dialog::~Dialog()
{
theCtrl.StopRun();
ILog.StopRun();
m_Formula.clear();
delete ui;
}
void Dialog::InitUI()
{
double dbFreqVal = 1500.0f, dbSpaceVal=10.0f, dbTempVal=10.0f;
//频率-滑动条==================================
int nMin = 0;
int nMax = 15000;
ui->FreqSlider->setMinimum(nMin); // 最小值
ui->FreqSlider->setMaximum(nMax); // 最大值
ui->FreqSlider->setSingleStep(1); // 步长
//频率-微调框
double dbMin = 0;
double dbMax = 15000;
ui->FreqSpin->setMinimum(dbMin); // 最小值
ui->FreqSpin->setMaximum(dbMax); // 最大值
ui->FreqSpin->setSingleStep(1); // 步长
//频率-连接信号槽
connect(ui->FreqSpin, SIGNAL(valueChanged(double)), this, SLOT(OnFreqSpinValueChanged(double)));
connect(ui->FreqSlider, SIGNAL(valueChanged(int)), this, SLOT(OnFreqSliderValueChanged(int)));
ui->FreqSpin->setValue( dbFreqVal );
//色温-滑动条==================================
nMin = 0;
nMax = 100;
ui->TempSlider->setMinimum(nMin); // 最小值
ui->TempSlider->setMaximum(nMax); // 最大值
ui->TempSlider->setSingleStep(1); // 步长
//色温-微调框
dbMin = 0;
dbMax = 100;
ui->TempSpin->setMinimum(dbMin); // 最小值
ui->TempSpin->setMaximum(dbMax); // 最大值
ui->TempSpin->setSingleStep(1); // 步长
//色温-连接信号槽
connect(ui->TempSpin, SIGNAL(valueChanged(double)), this, SLOT(OnTempSpinValueChanged(double)));
connect(ui->