#include "datamanager.h" #include #include DataManager::DataManager(QObject *parent) : QObject(parent) , m_recording(false) , m_headerWritten(false) { } DataManager::~DataManager() { stopRecording(); } bool DataManager::startRecording(const QString &dirPath) { stopRecording(); QDir dir(dirPath); if (!dir.exists()) { if (!dir.mkpath(".")) { qWarning() << "无法创建目录:" << dirPath; return false; } } QString fileName = QDateTime::currentDateTime().toString("yyyy-MM-dd_HH-mm-ss") + ".csv"; m_filePath = dir.filePath(fileName); m_file.setFileName(m_filePath); if (!m_file.open(QIODevice::WriteOnly | QIODevice::Text)) { qWarning() << "无法创建文件:" << m_filePath; return false; } m_stream.setDevice(&m_file); m_headerWritten = false; m_recording = true; qDebug() << "开始记录数据到:" << m_filePath; return true; } void DataManager::stopRecording() { if (m_recording) { m_stream.flush(); m_file.close(); m_recording = false; qDebug() << "停止记录, 文件:" << m_filePath; } } bool DataManager::isRecording() const { return m_recording; } QString DataManager::currentFilePath() const { return m_filePath; } void DataManager::appendDataPoint(const QVector &values) { if (!m_recording) return; QStringList parts; for (int v : values) { parts << QString::number(v); } m_stream << parts.join(",") << "\n"; } QVector> DataManager::loadFile(const QString &filePath, QString &error) { QVector> result(16); QFile file(filePath); if (!file.open(QIODevice::ReadOnly | QIODevice::Text)) { error = QString("无法打开文件: %1").arg(filePath); return result; } QTextStream stream(&file); bool firstLine = true; while (!stream.atEnd()) { QString line = stream.readLine().trimmed(); if (line.isEmpty()) continue; // 跳过表头 if (firstLine) { firstLine = false; // 检查是否是表头(包含非数字字符如ch) if (line.contains("ch", Qt::CaseInsensitive) && !line.at(0).isDigit()) { continue; } } QStringList parts = line.split(","); if (parts.size() < 16) continue; for (int i = 0; i < 16; ++i) { bool ok; double val = parts[i].toDouble(&ok); if (ok) { result[i].append(val); } } } file.close(); return result; }