1. 程式人生 > 其它 >專案實戰:Qt球機控制工具 v1.0.0(球機運動八個方向以及運動速度,設定運動到指定角度,查詢當前水平和垂直角度)

專案實戰:Qt球機控制工具 v1.0.0(球機運動八個方向以及運動速度,設定運動到指定角度,查詢當前水平和垂直角度)

需求

  1.除錯球機控制,方向速度,設定到指定的角度;
  2.支援串列埠,485等基於串列埠的協議埠配置開啟;
  3.子執行緒串列埠控制和.子執行緒協議解析;
  4.支援球機水平運動速度、垂直運動速度設定;
  5.支援球機運動八個方向:上、右上、右、右下、下、左下、左、左上;
  6.支援變倍縮放;
  7.支援變焦距(球機自動對焦則無效)
  8.光圈(球機支援才行)
  9.顯示當前球機角度;
  10.設定球機運動到指定的水平位置;
  11.設定球機運動到指定的垂直位置;

注意

  有的球機運動以及一些其他控制指令沒有協議返回,理論上有返回,但是球機無返回只有查詢協議有返回)。

Demo演示

  

  

  

除錯工具下載地址

  CSDN免積分下載:https://download.csdn.net/download/qq21497936/48131428
  QQ群:1047134658(點選“檔案”搜尋“cameraMove”,群內與博文同步更新)

相關標頭檔案

CameraMoveToolDemo.h

#ifndef CAMERAMOVETOOLDEMO_H
#define CAMERAMOVETOOLDEMO_H

#include <QWidget>
#include <QElapsedTimer>
#include "ArrowControlWidget.h"
#include "ProtocolPelcoDManager.h"

namespace Ui {
class CameraMoveToolDemo;
}

class CameraMoveToolDemo : public QWidget
{
    Q_OBJECT

public:
    explicit CameraMoveToolDemo(QWidget *parent = 0);
    ~CameraMoveToolDemo();

protected:
    void initControls();
    void updateControls();
    void queryAngle();

protected slots:                // 與方向操作鍵盤的槽函式
    void slot_arrowControlButtonEvent(ArrowControlWidget::DIRECT direct, bool pressed);

protected slots:                // 串列埠開啟與關閉訊號槽
    void slot_serialPortOpened(bool result);
    void slot_serialPortClosed(bool result);

protected slots:
    void slot_event(ProtocolPelcoDManager::EVENT_TYPE eventType, double value);

protected:
    void timerEvent(QTimerEvent *event);

private slots:                  // 按鍵訊息
    void on_pushButton_open_clicked();
    void on_pushButton_close_clicked();
    void on_horizontalSlider_horizalSpeed_valueChanged(int value);
    void on_horizontalSlider_vertialcaSpeed_valueChanged(int value);
    void on_pushButton_zoomTele_pressed();
    void on_pushButton_zoomTele_released();
    void on_pushButton_focusNear_pressed();
    void on_pushButton_focusNear_released();
    void on_pushButton_irisOpen_pressed();
    void on_pushButton_irisOpen_released();
    void on_pushButton_zoomWide_pressed();
    void on_pushButton_zoomWide_released();
    void on_pushButton_focusFar_pressed();
    void on_pushButton_focusFar_released();
    void on_pushButton_irisClose_pressed();
    void on_pushButton_irisClose_released();
    void on_pushButton_setHorizalAngle_clicked();
    void on_pushButton_verticalAngle_clicked();

private:
    Ui::CameraMoveToolDemo *ui;

private:
    int _timerId;
    int _queryIntervalMs;
};

#endif // CAMERAMOVETOOLDEMO_H

ArrowControlWidget.h

#ifndef ARROWCONTROLWIDGET_H
#define ARROWCONTROLWIDGET_H

/**********************************************************************\
 * 類名: ArrowControlWidget
 * 說明: 方向鍵盤按鍵
 * 著作權資訊
 *      作者:紅胖子(AAA紅模仿)
 *      公司:長沙紅胖子網路科技有限公司
 *      網址:hpzwl.blog.csdn.net
 *      聯絡方式:QQ(21497936) 微信(yangsir198808) 電話(15173255813)
 * 版本資訊
 *       日期             版本           描述
 *    2021年11月23日     v1.0.0         基礎功能
\**********************************************************************/

#include <QWidget>
#include <QPushButton>

namespace Ui {
class ArrowControlWidget;
}

class ArrowControlWidget : public QWidget
{
    Q_OBJECT
public:
    enum DIRECT {               // 方向
        DIRECT_STOP = 0x00,
        DIRECT_UP,
        DIRECT_RIGHT_UP,
        DIRECT_RIGHT,
        DIRECT_RIGHT_DOWN,

        DIRECT_DOWN,
        DIRECT_LEFT_DOWN,
        DIRECT_LEFT,
        DIRECT_LEFT_UP,
    };

public:
    explicit ArrowControlWidget(QWidget *parent = 0);
    ~ArrowControlWidget();

signals:
    void signal_buttonEvent(ArrowControlWidget::DIRECT direct, bool pressed);
                                                    // 不是true - pressed,就是false - release

protected:
    void initControls();

private slots:
    void slot_buttonPressed();
    void slot_buttonRelease();

private:
    Ui::ArrowControlWidget *ui;

private:
    QHash<QPushButton*, ArrowControlWidget::DIRECT> _hashPushButton2Direct;
};

#endif // ARROWCONTROLWIDGET_H

SerialPortManager.h

#ifndef SERIALPORTMANAGER_H
#defineSERIALPORTMANAGER_H

/**********************************************************************\
 * 類名: SerialPortManager
 * 說明: 串列埠相關操作
 * 訊號:
 *       void signal_recevData(QByteArray byteArray) -- 丟擲收到的資料
 *       void signal_error(int err) -- 丟擲錯誤資訊
 * 成員函式:
 *          bool isRunning() -- 是否已經在執行
 *          void serialError(QSerialPort::SerialPortError) -- 錯誤接受槽函式
 * 執行緒函式:
 *          void slot_start() -- 開始執行
 *          void slot_stop() -- 停止執行
 * 部分函式:
 *          QStringList getAllSerialPortNames() -- 獲取所有串列埠
 *          QString getPortName() -- 獲取當前串列埠裝置名稱
 *          void setPortName() -- 設定當前串列埠裝置名稱
 *          void slot_open() -- 開啟串列埠
 *          void slot_close() -- 關閉串列埠
 *          void slot_sendData(QByteArray byteArray) -- 傳送資料
 *          void setPortName(QString name) -- 設定串列埠名稱,如"com1"(windows),"/dev/ttyS0"(linux)
 *          void setSerialPortSettings(SerialPortSettings& serialPortSettings) -- 配置串列埠相關引數
 * 著作權資訊
 *      作者:紅胖子(AAA紅模仿)
 *      公司:長沙紅胖子網路科技有限公司
 *      網址:hpzwl.blog.csdn.net
 *      聯絡方式:QQ(21497936) 微信(yangsir198808) 電話(15173255813)
 * 版本資訊
 *       日期             版本           描述
 *    2016年11月11日     v1.0.0         基礎功能
 *    2019年06月02日     v1.1.0         增加串列埠預設初始化引數“9600,8,無奇偶,1,noFlow",增加設定獲取裝置名,增加獲取所有串列埠名
 *    2020年07月06日     v1.2.0         修改模組名稱,規劃程式碼
 *    2020年07月08日     v1.3.0         唯一例項類
 *    2021年11月23日     v1.4.0         整理程式碼,增加設定單項配置串列埠資訊列舉,增加單項設定波特率數字和字串(如9600,"N","1"等)
\**********************************************************************/

#include <QObject>
#include <QSerialPort>
#include <QSerialPortInfo>
#include <QDebug>
#include <QMutex>

class SerialPortManager : public QObject
{
    Q_OBJECT
public:
    struct SerialPortSettings{
        SerialPortSettings():
            baudRate(QSerialPort::Baud9600),
            dataBits(QSerialPort::Data8),
            parity(QSerialPort::NoParity),
            stopBit(QSerialPort::OneStop),
            flowControl(QSerialPort::NoFlowControl)
        {
        }
        QSerialPort::BaudRate baudRate;
        QSerialPort::DataBits dataBits;
        QSerialPort::Parity parity;
        QSerialPort::StopBits stopBit;
        QSerialPort::FlowControl flowControl;
    };

private:
    explicit SerialPortManager(QObject *parent = 0);

public:
    ~SerialPortManager();

public:
    static SerialPortManager *getInstance();

public:
    bool getRunning() const;                                // 當前執行緒是否執行
    bool getOpened() const;                                 // 串列埠是非都開
    QString getPortName();                                  // 獲取串列埠名
    SerialPortSettings getSerialPortSettings() const;       // 獲取串列埠配置資訊


public:
    void setPortName(QString name);                         // 設定串列埠名稱
    void setSerialPortSettings(SerialPortSettings &serialPortSettings);
                                                            // 設定串列埠配置資訊(一次性)
    void setBaudRate(QSerialPort::BaudRate baudRate);       // 設定串列埠波特率
    void setBaudRate(int baudRate);                         // 設定串列埠波特率
    void setDateBits(QSerialPort::DataBits dataBits);       // 設定資料位
    void setDateBits(int dateBits);                         // 設定資料位
    void setParity(QSerialPort::Parity parity);             // 設定校驗方式
    void setParity(QString parity);                         // 設定校驗方式
    void setStopBit(QSerialPort::StopBits stopBits);        // 設定停止位
    void setStopBit(QString stopBits);                      // 設定停止位
    void setFlowControl(QSerialPort::FlowControl flowControl);
                                                            // 設定硬體流控制

public:
    static QStringList getAllSerialPortNames();

signals:
    void signal_opened(bool result);                        // 開啟訊號
    void signal_closed(bool result);                        // 關閉訊號
    void signal_recevData(QByteArray byteArray);            // 接收資料訊號
    void signal_error(int err);                             // 錯誤程式碼

public:
    void open(QString portName = QString());                // 開啟串列埠(拋送到串列埠執行緒)
    void close();                                           // 關閉串列埠(拋送到串列埠執行緒)

public:
    void sendData(QByteArray byteArray);                    // 傳送資料(拋送到串列埠執行緒)

public slots:
    void slot_start();                                      // 執行緒開啟
    void slot_stop();                                       // 執行緒停止
    void slot_open(QString portName = QString());           // 執行緒開啟
    void slot_close();                                      // 執行緒關閉
    void slot_sendData(QByteArray byteArray);               // 傳送資料

protected:
    void initControls();                                    // 初始化

protected slots:
    void slot_recv();                                       // 接收資料
    void slot_serialError(QSerialPort::SerialPortError);    // 接收鎖霧

private:
    static SerialPortManager *_pInstance;
    static QMutex _mutex;

private:
    bool _running;                                          // 是否正在執行
    QSerialPort *_pSerialPort;                              // 串列埠指標
    SerialPortSettings _serialPortSettings;                 // 串列埠設定資訊

private:
    bool _opened;                                           // 串列埠是否開啟
    QString _portName;                                      // 串列埠名稱

    int _id;
};

#endif // SEARIALPORT_H

ProtocolPelcoDManager.h

#ifndef PROTOCOLPALCODMANAGER_H
#define PROTOCOLPALCODMANAGER_H

/**********************************************************************\
 * 類名: ProtocolPelcoDManager
 * 說明: pelco-D協議組裝和解析類
 * 執行緒函式:
 *          void slot_start() -- 開始執行
 *          void slot_stop() -- 停止執行
 * 著作權資訊
 *      作者:紅胖子(AAA紅模仿)
 *      公司:長沙紅胖子網路科技有限公司
 *      網址:hpzwl.blog.csdn.net
 *      聯絡方式:QQ(21497936) 微信(yangsir198808) 電話(15173255813)
 * 版本資訊
 *       日期             版本           描述
 *    2021年11月24日     v1.0.0         基礎功能
\**********************************************************************/

#include <QObject>
#include <QMutex>
#include <QJsonArray>
#include <QJsonObject>
#include <QJsonDocument>
#include <QDebug>
#include <QDateTime>


class ProtocolPelcoDManager : public QObject
{
    Q_OBJECT
public:
    enum EVENT_TYPE {
        EVENT_TYPE_HORIZAL_ANGLE = 0x00,
        EVENT_TYPE_VERTICAL_ANGLE,
    };

private:
    explicit ProtocolPelcoDManager(QObject *parent = 0);

public:
    static ProtocolPelcoDManager *getInstance();    // 獲取例項

public:
    int getAddr() const;

public:
    void setAddr(int addr);

signals:
    void signal_event(ProtocolPelcoDManager::EVENT_TYPE eventType, double value);

public:                     // 移動方向指令: 上、下、左、右
    QByteArray constructMoveUpProtocol   (int verticalSpeed = 0x20, int addr = -1);
    QByteArray constructMoveRightProtocol(int horizalSpeed  = 0x20, int addr = -1);
    QByteArray constructMoveDownProtocol (int verticalSpeed = 0x20, int addr = -1);
    QByteArray constructMoveLeftProtocol (int horizalSpeed  = 0x20, int addr = -1);
                            // 移動方向指令:左上、左下、右上、右下
    QByteArray constructMoveRightUpProtocol  (int horizalSpeed = 0x20, int verticalSpeed = 0x20, int addr = -1);
    QByteArray constructMoveRightDownProtocol(int horizalSpeed = 0x20, int verticalSpeed = 0x20, int addr = -1);
    QByteArray constructMoveLeftDownProtocol (int horizalSpeed = 0x20, int verticalSpeed = 0x20, int addr = -1);
    QByteArray constructMoveLeftUpProtocol   (int horizalSpeed = 0x20, int verticalSpeed = 0x20, int addr = -1);
                            // 變倍小、大
    QByteArray constructZoomWideProtocol(int addr = -1);
    QByteArray constructZoomTeleProtocol(int addr = -1);
                            // 聚焦近、遠
    QByteArray constructFocusNearProtocol(int addr = -1);
    QByteArray constructFocusFarWideProtocol(int addr = -1);
                            // 光圈開、關
    QByteArray constructIrisOpenProtocol(int addr = -1);
    QByteArray constructIrisCloseProtocol(int addr = -1);
                            // 查詢水平角度、垂直角度
    QByteArray constructQueryHorizalProtocol(int addr = -1);
    QByteArray constructQueryVerticalProtocol(int addr = -1);
                            // 設定水平角度、垂直角度
    QByteArray constructSetHorizalProtocol(double angle, int addr = -1);
    QByteArray constructSetVerticalProtocol(double angle, int addr = -1);

public:
    QByteArray constructStopProtocol(int addr = -1);

public slots:
    void slot_start();                              // 執行緒開始
    void slot_stop();                               // 執行緒停止

public slots:
    void slot_recvProtocol(QByteArray byteArray);   // 協議接收入口

public:
    static void sendProtocol(QByteArray byteArray); // 傳送協議(目前為空,根據使用時是否繫結串列埠設計)

protected:
    QByteArray constructCtrlProtocol(char addr, char cmnd1, char cmnd2, char horizalSpeed, char veritalSpeed);

private:
    static ProtocolPelcoDManager *_pInstance;
    static QMutex _mutex;

private:
    bool _running;                                  // 執行緒是否在執行

private:
    int _addr;
};

#endif // PROTOCOLPALCODMANAGER_H

若該文為原創文章,轉載請註明原文出處
本文章部落格地址:https://hpzwl.blog.csdn.net/article/details/121512987