task_manager 是任务状态的唯一权威
This commit is contained in:
parent
875594c213
commit
e94b9d2e89
@ -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_;
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user