From e94b9d2e895df870b584dce8211a711e1da2252f Mon Sep 17 00:00:00 2001 From: Alvin-lyq Date: Mon, 11 May 2026 17:29:04 +0800 Subject: [PATCH] =?UTF-8?q?task=5Fmanager=20=E6=98=AF=E4=BB=BB=E5=8A=A1?= =?UTF-8?q?=E7=8A=B6=E6=80=81=E7=9A=84=E5=94=AF=E4=B8=80=E6=9D=83=E5=A8=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../task_manager/src/task_manager_main.cpp | 79 ++++++------------- 1 file changed, 25 insertions(+), 54 deletions(-) diff --git a/src/communication/task_manager/src/task_manager_main.cpp b/src/communication/task_manager/src/task_manager_main.cpp index 1a607f5..5c12a9c 100644 --- a/src/communication/task_manager/src/task_manager_main.cpp +++ b/src/communication/task_manager/src/task_manager_main.cpp @@ -21,7 +21,6 @@ volatile std::sig_atomic_t signal_received = 0; MQTTManager mqtt_manager; TaskManager task_manager; int last_status = 0; -TaskStatus status_up = TaskStatus::PENDING; std::thread status_report_thread; // =============== 动态 MQTT topic + 身份控制 =============== @@ -563,76 +562,48 @@ class TaskManagerNode : public rclcpp::Node LOG_INFO_THROTTLE(1000, "收到任务状态更新: ID=%d, Status=%d, Name=%s", msg->task_id, msg->task_status, msg->task_name.c_str()); - if (msg->task_status >= TaskStatus::PENDING && msg->task_status <= TaskStatus::PATH_FINISHED) + // 只有 PATH_FINISHED 需要 task_manager 处理(切换路径或完成任务) + // 其他状态(RUNNING/PENDING/COMPLETED)仅用于日志,不更新 task_manager 内部状态 + if (msg->task_status == TaskStatus::PATH_FINISHED) { - status_up = static_cast(msg->task_status); - - // 如果当前路径已完成,检查是否有下一条路径 - if (status_up == TaskStatus::PATH_FINISHED) + LOG_INFO("当前路径执行完成,检查下一条路径..."); + if (task_manager.hasNextRoute()) { - LOG_INFO("当前路径执行完成,检查下一条路径..."); - if (task_manager.hasNextRoute()) + LOG_INFO("发现下一条路径,准备切换..."); + if (task_manager.switchToNextRoute()) { - LOG_INFO("发现下一条路径,准备切换..."); - // 切换到下一条路径 - if (task_manager.switchToNextRoute()) + ROUTE_INFO nextRoute = task_manager.getCurrentRouteInfo(); + string filepath = "routes/" + nextRoute.fileName; + LOG_INFO("切换到新路径: %s (%s)", nextRoute.routeName.c_str(), nextRoute.fileName.c_str()); + + std::ifstream src(filepath, std::ios::binary); + std::ofstream dst("gps_load_now.txt", std::ios::binary); + if (src && dst) { - // 获取新路径并复制 - ROUTE_INFO nextRoute = task_manager.getCurrentRouteInfo(); - string filepath = "routes/" + nextRoute.fileName; - LOG_INFO("切换到新路径: %s (%s)", nextRoute.routeName.c_str(), nextRoute.fileName.c_str()); - - // 复制文件到 gps_load_now.txt - std::ifstream src(filepath, std::ios::binary); - std::ofstream dst("gps_load_now.txt", std::ios::binary); - if (src && dst) - { - dst << src.rdbuf(); - LOG_INFO("路径文件复制成功: %s -> gps_load_now.txt", nextRoute.fileName.c_str()); - - // 同时更新两个状态,保持任务继续运行 - task_manager.setTaskStatus(1); - task_manager.updateCurrentTaskStatus(TaskStatus::RUNNING); - LOG_INFO("任务状态已更新为 RUNNING,等待PL层重载新路径"); - } - else - { - LOG_ERROR("无法复制路径文件: %s", filepath.c_str()); - } + dst << src.rdbuf(); + LOG_INFO("路径文件复制成功: %s -> gps_load_now.txt", nextRoute.fileName.c_str()); + // task_status_ 保持为 1 (RUNNING),不修改 + LOG_INFO("等待PL层重载新路径"); } else { - LOG_ERROR("路径切换失败"); + LOG_ERROR("无法复制路径文件: %s", filepath.c_str()); } } else { - // 最后一条路径完成,发送 Status=0 触发 PL 停止线程 - LOG_INFO("所有 %d 条路径执行完成,任务结束", task_manager.getRouteCount()); - task_manager.setTaskStatus(0); // 设为0触发PL停止 - task_manager.updateCurrentTaskStatus(TaskStatus::COMPLETED); + LOG_ERROR("路径切换失败"); } } else { - // 如果不是 PATH_FINISHED 状态,直接同步更新任务管理器的状态 - // 但忽略来自PL的COMPLETED状态,避免stop后状态被覆盖 - if (msg->task_status != TaskStatus::COMPLETED) - { - LOG_INFO_THROTTLE(5000, "更新任务状态: %d", msg->task_status); - task_manager.setTaskStatus(msg->task_status); - task_manager.updateCurrentTaskStatus(status_up); - } - else - { - LOG_DEBUG("忽略PL的COMPLETED状态,避免stop后状态被覆盖"); - } + // 最后一条路径完成,发送 Status=0 触发 PL 停止线程 + LOG_INFO("所有 %d 条路径执行完成,任务结束", task_manager.getRouteCount()); + task_manager.setTaskStatus(0); // 设为0触发PL停止 + task_manager.updateCurrentTaskStatus(TaskStatus::COMPLETED); } } - else - { - LOG_WARN("收到无效的任务状态: %d", msg->task_status); - } + // 其他状态(RUNNING/PENDING/COMPLETED)不做处理,仅用于 MQTT 上报 } rclcpp::TimerBase::SharedPtr timer_;