feat: AiAnalysis - 16通道AI数据UDP实时采集与分析

功能:
- UDP端口监听,实时接收数据
- 解析16通道逗号分隔的ADC数据
- 实时波形绘制(支持滚轮缩放、右键拖拽、双击恢复)
- 数据自动保存到 data_端口号/ 目录
- 支持打开历史CSV文件回放查看
- 16通道独立颜色,可切换显示/隐藏
- 深色主题界面
This commit is contained in:
iorebuild
2026-04-30 12:46:49 +08:00
commit 7e3593c898
11 changed files with 1232 additions and 0 deletions

52
udpreceiver.cpp Normal file
View File

@@ -0,0 +1,52 @@
#include "udpreceiver.h"
#include <QNetworkInterface>
UdpReceiver::UdpReceiver(QObject *parent)
: QObject(parent)
, m_socket(new QUdpSocket(this))
, m_port(0)
{
connect(m_socket, &QUdpSocket::readyRead, this, &UdpReceiver::onReadyRead);
}
UdpReceiver::~UdpReceiver()
{
stop();
}
bool UdpReceiver::start(quint16 port)
{
stop();
m_port = port;
if (!m_socket->bind(QHostAddress::AnyIPv4, port, QUdpSocket::ShareAddress)) {
emit errorOccurred(QString("无法绑定端口 %1: %2").arg(port).arg(m_socket->errorString()));
return false;
}
// 设置足够大的缓冲区
m_socket->setSocketOption(QAbstractSocket::ReceiveBufferSizeSocketOption, 8 * 1024 * 1024);
return true;
}
void UdpReceiver::stop()
{
m_socket->close();
m_port = 0;
}
bool UdpReceiver::isRunning() const
{
return m_socket->state() == QAbstractSocket::BoundState;
}
void UdpReceiver::onReadyRead()
{
while (m_socket->hasPendingDatagrams()) {
QByteArray datagram;
datagram.resize(m_socket->pendingDatagramSize());
m_socket->readDatagram(datagram.data(), datagram.size());
emit dataReceived(datagram);
}
}