GrabBag/GrabBagApp/Presenter/Inc/SerialProtocol.h

165 lines
4.5 KiB
C
Raw Normal View History

#ifndef SERIALPROTOCOL_H
#define SERIALPROTOCOL_H
#include <functional>
#include <vector>
#include <string>
#include <QTimer>
#include <QObject>
#include <QThread>
#include <QMutex>
#include <QMutexLocker>
#include <atomic>
#include <thread>
#include <mutex>
#include "ProtocolCommon.h"
#include <QSerialPort>
#include <QSerialPortInfo>
/**
* @brief
*
*/
class SerialProtocol : public QObject
{
Q_OBJECT
public:
/**
* @brief 使
*/
using SerialStatus = ConnectionStatus;
public:
SerialProtocol(QObject* parent = nullptr);
~SerialProtocol();
/**
* @brief
* @param portName COM1, /dev/ttyUSB0等
* @param baudRate
* @param dataBits (5, 6, 7, 8)
* @param stopBits (1, 2)
* @param parity (0-, 1-, 2-)
* @param flowControl (0-, 1-, 2-)
* @return 0--
*/
int OpenSerial(const std::string& portName, int baudRate = 9600,
int dataBits = 8, int stopBits = 1, int parity = 0, int flowControl = 0);
/**
* @brief
*/
void CloseSerial();
/**
* @brief
* $,DATA,NUM,posX,posY,posZ,posC,posX,posY,posZ,posC...,#
* @param multiTargetData
* @param cameraId ID1
* @return 0--
*/
int SendMultiTargetData(const MultiTargetData& multiTargetData, uint16_t cameraId);
/**
* @brief
* @return
*/
SerialStatus GetSerialStatus() const;
/**
* @brief
* @param callback
*/
void SetConnectionCallback(const ConnectionCallback& callback);
/**
* @brief
* @param callback
*/
void SetWorkSignalCallback(const WorkSignalCallback& callback);
/**
* @brief
* @return true-false-
*/
bool IsOpen() const;
private slots:
/**
* @brief
*/
void OnSerialDataReceived();
/**
* @brief
* @param error
*/
void OnSerialError(QSerialPort::SerialPortError error);
private:
/**
* @brief
* @param data
*/
void ParseProtocolData(const QString& data);
/**
* @brief
* @param data
* @return 0--
*/
int SendData(const std::string& data);
/**
* @brief
* @param multiTargetData
* @param cameraId ID
* @return
*/
std::string BuildDataProtocol(const MultiTargetData& multiTargetData, uint16_t cameraId);
/**
* @brief 线
*/
void SerialReceiveThreadFunction();
/**
* @brief 线
*/
void StartReceiveThread();
/**
* @brief 线
*/
void StopReceiveThread();
/**
* @brief 线
*/
void ProcessReceivedData();
private:
QSerialPort* m_pSerialPort; // 串口对象
SerialStatus m_serialStatus; // 串口状态
QString m_receiveBuffer; // 接收缓冲区
// 线程相关
std::thread m_receiveThread; // 接收线程
std::atomic<bool> m_threadRunning; // 线程运行标志
std::mutex m_bufferMutex; // 缓冲区互斥锁
// 回调函数
ConnectionCallback m_connectionCallback; // 连接状态回调
WorkSignalCallback m_workSignalCallback; // 工作信号回调
// 协议常量
static const QString PROTOCOL_START; // 协议开始标识 "$"
static const QString PROTOCOL_END; // 协议结束标识 "#"
static const QString CMD_START; // 开始命令 "START"
static const QString CMD_DATA; // 数据命令 "DATA"
static const QString SEPARATOR; // 分隔符 ","
};
#endif // SERIALPROTOCOL_H