task_manager 是任务状态的唯一权威

This commit is contained in:
Alvin-lyq 2026-05-11 17:29:04 +08:00
parent 875594c213
commit e94b9d2e89

View File

@ -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,37 +562,28 @@ 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)
{
status_up = static_cast<TaskStatus>(msg->task_status);
// 如果当前路径已完成,检查是否有下一条路径
if (status_up == TaskStatus::PATH_FINISHED)
// 只有 PATH_FINISHED 需要 task_manager 处理(切换路径或完成任务)
// 其他状态RUNNING/PENDING/COMPLETED仅用于日志不更新 task_manager 内部状态
if (msg->task_status == TaskStatus::PATH_FINISHED)
{
LOG_INFO("当前路径执行完成,检查下一条路径...");
if (task_manager.hasNextRoute())
{
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());
// 复制文件到 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层重载新路径");
// task_status_ 保持为 1 (RUNNING),不修改
LOG_INFO("等待PL层重载新路径");
}
else
{
@ -613,26 +603,7 @@ class TaskManagerNode : public rclcpp::Node
task_manager.updateCurrentTaskStatus(TaskStatus::COMPLETED);
}
}
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后状态被覆盖");
}
}
}
else
{
LOG_WARN("收到无效的任务状态: %d", msg->task_status);
}
// 其他状态RUNNING/PENDING/COMPLETED不做处理仅用于 MQTT 上报
}
rclcpp::TimerBase::SharedPtr timer_;