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; MQTTManager mqtt_manager;
TaskManager task_manager; TaskManager task_manager;
int last_status = 0; int last_status = 0;
TaskStatus status_up = TaskStatus::PENDING;
std::thread status_report_thread; std::thread status_report_thread;
// =============== 动态 MQTT topic + 身份控制 =============== // =============== 动态 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, LOG_INFO_THROTTLE(1000, "收到任务状态更新: ID=%d, Status=%d, Name=%s", msg->task_id, msg->task_status,
msg->task_name.c_str()); 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<TaskStatus>(msg->task_status); LOG_INFO("当前路径执行完成,检查下一条路径...");
if (task_manager.hasNextRoute())
// 如果当前路径已完成,检查是否有下一条路径
if (status_up == TaskStatus::PATH_FINISHED)
{ {
LOG_INFO("当前路径执行完成,检查下一条路径..."); LOG_INFO("发现下一条路径,准备切换...");
if (task_manager.hasNextRoute()) if (task_manager.switchToNextRoute())
{ {
LOG_INFO("发现下一条路径,准备切换..."); ROUTE_INFO nextRoute = task_manager.getCurrentRouteInfo();
// 切换到下一条路径 string filepath = "routes/" + nextRoute.fileName;
if (task_manager.switchToNextRoute()) 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)
{ {
// 获取新路径并复制 dst << src.rdbuf();
ROUTE_INFO nextRoute = task_manager.getCurrentRouteInfo(); LOG_INFO("路径文件复制成功: %s -> gps_load_now.txt", nextRoute.fileName.c_str());
string filepath = "routes/" + nextRoute.fileName; // task_status_ 保持为 1 (RUNNING),不修改
LOG_INFO("切换到新路径: %s (%s)", nextRoute.routeName.c_str(), nextRoute.fileName.c_str()); LOG_INFO("等待PL层重载新路径");
// 复制文件到 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());
}
} }
else else
{ {
LOG_ERROR("路径切换失败"); LOG_ERROR("无法复制路径文件: %s", filepath.c_str());
} }
} }
else else
{ {
// 最后一条路径完成,发送 Status=0 触发 PL 停止线程 LOG_ERROR("路径切换失败");
LOG_INFO("所有 %d 条路径执行完成,任务结束", task_manager.getRouteCount());
task_manager.setTaskStatus(0); // 设为0触发PL停止
task_manager.updateCurrentTaskStatus(TaskStatus::COMPLETED);
} }
} }
else else
{ {
// 如果不是 PATH_FINISHED 状态,直接同步更新任务管理器的状态 // 最后一条路径完成,发送 Status=0 触发 PL 停止线程
// 但忽略来自PL的COMPLETED状态避免stop后状态被覆盖 LOG_INFO("所有 %d 条路径执行完成,任务结束", task_manager.getRouteCount());
if (msg->task_status != TaskStatus::COMPLETED) task_manager.setTaskStatus(0); // 设为0触发PL停止
{ task_manager.updateCurrentTaskStatus(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 // 其他状态RUNNING/PENDING/COMPLETED不做处理仅用于 MQTT 上报
{
LOG_WARN("收到无效的任务状态: %d", msg->task_status);
}
} }
rclcpp::TimerBase::SharedPtr timer_; rclcpp::TimerBase::SharedPtr timer_;