add,计划采集2:
添加计划任务的数据结构,并实现读写数据结构
This commit is contained in:
196
HPPA/TimedDataCollectionDataStructures.cpp
Normal file
196
HPPA/TimedDataCollectionDataStructures.cpp
Normal file
@ -0,0 +1,196 @@
|
||||
#include "TimedDataCollectionDataStructures.h"
|
||||
#include <QJsonDocument>
|
||||
#include <QJsonObject>
|
||||
#include <QJsonArray>
|
||||
#include <QFile>
|
||||
#include <QTextStream>
|
||||
#include <QDebug>
|
||||
|
||||
// ==================== 公共接口实现 ====================
|
||||
|
||||
bool TimedDataCollectionDataStructuresReaderWriter::saveTasksToFile(const QString& filePath, const QVector<TimedTask>& tasks)
|
||||
{
|
||||
QJsonObject root;
|
||||
root["version"] = "1.0";
|
||||
root["taskCount"] = tasks.size();
|
||||
|
||||
QJsonArray tasksArray;
|
||||
for (const auto& task : tasks) {
|
||||
tasksArray.append(timedTaskToJson(task));
|
||||
}
|
||||
root["tasks"] = tasksArray;
|
||||
|
||||
QJsonDocument doc(root);
|
||||
QFile file(filePath);
|
||||
if (!file.open(QIODevice::WriteOnly | QIODevice::Text)) {
|
||||
qWarning() << "Failed to open file for writing:" << filePath;
|
||||
return false;
|
||||
}
|
||||
|
||||
QTextStream out(&file);
|
||||
//out.setEncoding(QStringConverter::Utf8);
|
||||
out << doc.toJson(QJsonDocument::Indented);
|
||||
file.close();
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
bool TimedDataCollectionDataStructuresReaderWriter::loadTasksFromFile(const QString& filePath, QVector<TimedTask>& tasks)
|
||||
{
|
||||
QFile file(filePath);
|
||||
if (!file.open(QIODevice::ReadOnly | QIODevice::Text)) {
|
||||
qWarning() << "Failed to open file for reading:" << filePath;
|
||||
return false;
|
||||
}
|
||||
|
||||
QByteArray jsonData = file.readAll();
|
||||
file.close();
|
||||
|
||||
QJsonParseError parseError;
|
||||
QJsonDocument doc = QJsonDocument::fromJson(jsonData, &parseError);
|
||||
if (parseError.error != QJsonParseError::NoError) {
|
||||
qWarning() << "JSON parse error:" << parseError.errorString();
|
||||
return false;
|
||||
}
|
||||
|
||||
if (!doc.isObject()) {
|
||||
qWarning() << "Invalid JSON root object";
|
||||
return false;
|
||||
}
|
||||
|
||||
QJsonObject root = doc.object();
|
||||
QJsonArray tasksArray = root["tasks"].toArray();
|
||||
tasks.clear();
|
||||
tasks.reserve(tasksArray.size());
|
||||
|
||||
for (const auto& taskValue : tasksArray) {
|
||||
if (!taskValue.isObject()) continue;
|
||||
TimedTask task;
|
||||
if (jsonToTimedTask(taskValue.toObject(), task)) {
|
||||
tasks.append(task);
|
||||
}
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
// ==================== 枚举转换函数 ====================
|
||||
|
||||
QString TimedDataCollectionDataStructuresReaderWriter::taskStatusToString(TaskStatus status)
|
||||
{
|
||||
switch (status) {
|
||||
case TaskStatus::Waiting: return "Waiting";
|
||||
case TaskStatus::Running: return "Running";
|
||||
case TaskStatus::Finished: return "Finished";
|
||||
default: return "Waiting";
|
||||
}
|
||||
}
|
||||
|
||||
TaskStatus TimedDataCollectionDataStructuresReaderWriter::stringToTaskStatus(const QString& str)
|
||||
{
|
||||
if (str == "Running") return TaskStatus::Running;
|
||||
if (str == "Finished") return TaskStatus::Finished;
|
||||
return TaskStatus::Waiting;
|
||||
}
|
||||
|
||||
QString TimedDataCollectionDataStructuresReaderWriter::subTaskTypeToString(SubTaskType type)
|
||||
{
|
||||
switch (type) {
|
||||
case SubTaskType::HyperSpectual400_1000nm: return "HyperSpectual400_1000nm";
|
||||
case SubTaskType::HyperSpectual1000_1700nm: return "HyperSpectual1000_1700nm";
|
||||
case SubTaskType::SingleLensReflex: return "SingleLensReflex";
|
||||
case SubTaskType::DepthCamera: return "DepthCamera";
|
||||
default: return "Unknown";
|
||||
}
|
||||
}
|
||||
|
||||
SubTaskType TimedDataCollectionDataStructuresReaderWriter::stringToSubTaskType(const QString& str)
|
||||
{
|
||||
if (str == "HyperSpectual400_1000nm") return SubTaskType::HyperSpectual400_1000nm;
|
||||
if (str == "HyperSpectual1000_1700nm") return SubTaskType::HyperSpectual1000_1700nm;
|
||||
if (str == "SingleLensReflex") return SubTaskType::SingleLensReflex;
|
||||
if (str == "DepthCamera") return SubTaskType::DepthCamera;
|
||||
return SubTaskType::SingleLensReflex;
|
||||
}
|
||||
|
||||
// ==================== SubTask序列化 ====================
|
||||
|
||||
QJsonObject TimedDataCollectionDataStructuresReaderWriter::subTaskToJson(const SubTask& subTask)
|
||||
{
|
||||
QJsonObject obj;
|
||||
obj["type"] = subTaskTypeToString(subTask.type);
|
||||
obj["startTime"] = subTask.startTime.toString(Qt::ISODate);
|
||||
obj["endTime"] = subTask.endTime.toString(Qt::ISODate);
|
||||
obj["durationSeconds"] = subTask.durationSeconds;
|
||||
obj["estimatedDurationSeconds"] = subTask.estimatedDurationSeconds;
|
||||
obj["pathLineFilePath"] = subTask.pathLineFilePath;
|
||||
obj["status"] = taskStatusToString(subTask.status);
|
||||
obj["frameRate"] = subTask.frameRate;
|
||||
obj["exposureTime"] = subTask.exposureTime;
|
||||
obj["defaultRenderBand"] = subTask.defaultRenderBand;
|
||||
obj["captureIntervalSeconds"] = subTask.captureIntervalSeconds;
|
||||
return obj;
|
||||
}
|
||||
|
||||
bool TimedDataCollectionDataStructuresReaderWriter::jsonToSubTask(const QJsonObject& json, SubTask& subTask)
|
||||
{
|
||||
subTask.type = stringToSubTaskType(json["type"].toString());
|
||||
subTask.startTime = QDateTime::fromString(json["startTime"].toString(), Qt::ISODate);
|
||||
subTask.endTime = QDateTime::fromString(json["endTime"].toString(), Qt::ISODate);
|
||||
subTask.durationSeconds = json["durationSeconds"].toInt();
|
||||
subTask.estimatedDurationSeconds = json["estimatedDurationSeconds"].toInt();
|
||||
subTask.pathLineFilePath = json["pathLineFilePath"].toString();
|
||||
subTask.status = stringToTaskStatus(json["status"].toString());
|
||||
subTask.frameRate = json["frameRate"].toDouble();
|
||||
subTask.exposureTime = json["exposureTime"].toDouble();
|
||||
subTask.defaultRenderBand = json["defaultRenderBand"].toInt();
|
||||
subTask.captureIntervalSeconds = json["captureIntervalSeconds"].toInt();
|
||||
return true;
|
||||
}
|
||||
|
||||
// ==================== TimedTask序列化 ====================
|
||||
|
||||
QJsonObject TimedDataCollectionDataStructuresReaderWriter::timedTaskToJson(const TimedTask& task)
|
||||
{
|
||||
QJsonObject obj;
|
||||
obj["id"] = task.id;
|
||||
obj["scheduledTime"] = task.scheduledTime.toString(Qt::ISODate);
|
||||
obj["startTime"] = task.startTime.toString(Qt::ISODate);
|
||||
obj["endTime"] = task.endTime.toString(Qt::ISODate);
|
||||
obj["durationSeconds"] = task.durationSeconds;
|
||||
obj["savePath"] = task.savePath;
|
||||
obj["status"] = taskStatusToString(task.status);
|
||||
|
||||
QJsonArray subTasksArray;
|
||||
for (const auto& subTask : task.subTasks) {
|
||||
subTasksArray.append(subTaskToJson(subTask));
|
||||
}
|
||||
obj["subTasks"] = subTasksArray;
|
||||
|
||||
return obj;
|
||||
}
|
||||
|
||||
bool TimedDataCollectionDataStructuresReaderWriter::jsonToTimedTask(const QJsonObject& json, TimedTask& task)
|
||||
{
|
||||
task.id = json["id"].toInt();
|
||||
task.scheduledTime = QDateTime::fromString(json["scheduledTime"].toString(), Qt::ISODate);
|
||||
task.startTime = QDateTime::fromString(json["startTime"].toString(), Qt::ISODate);
|
||||
task.endTime = QDateTime::fromString(json["endTime"].toString(), Qt::ISODate);
|
||||
task.durationSeconds = json["durationSeconds"].toInt();
|
||||
task.savePath = json["savePath"].toString();
|
||||
task.status = stringToTaskStatus(json["status"].toString());
|
||||
|
||||
QJsonArray subTasksArray = json["subTasks"].toArray();
|
||||
task.subTasks.clear();
|
||||
task.subTasks.reserve(subTasksArray.size());
|
||||
|
||||
for (const auto& subTaskValue : subTasksArray) {
|
||||
if (!subTaskValue.isObject()) continue;
|
||||
SubTask subTask;
|
||||
if (jsonToSubTask(subTaskValue.toObject(), subTask)) {
|
||||
task.subTasks.append(subTask);
|
||||
}
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
Reference in New Issue
Block a user