Files
mission_adapters/include/mission_adapters/adapter.h
2026-08-03 22:40:26 +07:00

96 lines
3.7 KiB
C++

/*********************************************************************
*
* Software License Agreement (BSD License)
*
* Interface plugin duy nhất của gói: nguồn mission.
*
* Author: DuongTD
*********************************************************************/
#ifndef MISSION_ADAPTERS_ADAPTER_H_
#define MISSION_ADAPTERS_ADAPTER_H_
#include <memory>
#include <string>
#include <vector>
#include <robot/node_handle.h>
#include <mission_adapters/mission_request.h>
#include <mission_adapters/types.h>
namespace mission_adapters
{
/// @brief Quan hệ giữa mission mới và hàng đợi đang có.
enum class SubmitMode
{
/// Yêu cầu mới: thay toàn bộ hàng đợi, chặng đang chạy bị preempt (và được bảo dừng).
kReplace,
/**
* Phần nối tiếp của yêu cầu đang chạy: chỉ thêm vào cuối hàng đợi.
*
* Đây là hình dạng của VDA5050 order update — phần horizon được release thêm. Xử lý nó như
* kReplace sẽ huỷ và chạy lại chặng đang đi, dù tuyến đường không hề đổi.
*/
kAppend
};
/// @brief Kết quả chuyển đổi: mission sinh ra và cách chúng vào hàng đợi.
struct ConversionResult
{
std::vector<std::shared_ptr<Mission>> missions;
SubmitMode mode = SubmitMode::kReplace;
bool empty() const { return missions.empty(); }
};
/**
* @class MissionSourceAdapter
* @brief Biến payload của một nguồn cụ thể thành mission của mission layer.
*
* Plugin được nạp bằng Boost.DLL theo khoá `library_path` trong YAML, giống mọi plugin khác của
* workspace. Contract này là public interface qua ranh giới .so: đổi chữ ký thì phải đổi cả
* registry trong cùng một lần sửa, vì import_alias là dlsym + reinterpret_cast và không có kiểm
* kiểu nào bắt được sự lệch đó lúc biên dịch.
*
* Việc thực thi action KHÔNG thuộc về interface này: adapter chỉ chuyển dữ liệu, navigation
* runtime mới là nơi chạy action (D8).
*/
class MissionSourceAdapter
{
public:
using Ptr = std::shared_ptr<MissionSourceAdapter>;
virtual ~MissionSourceAdapter() = default;
/**
* @brief Đọc param riêng của instance. Gọi đúng một lần khi nạp.
* @param name Tên instance trong `mission_sources` — cũng là namespace param của nó.
* @param nh NodeHandle gốc.
* @return false nếu cấu hình không hợp lệ; registry sẽ báo lỗi và không đăng ký adapter này.
*/
virtual bool configure(const std::string& name, robot::NodeHandle& nh) = 0;
/// @brief Schema mà adapter này xử lý. Core định tuyến theo đúng giá trị này.
virtual std::string schema() const = 0;
/**
* @brief Kiểm payload TRƯỚC khi convert.
* @param[out] reason Lý do từ chối, dùng cho log.
* @return false -> core từ chối sớm và không đụng vào hàng đợi.
*/
virtual bool validate(const MissionRequest& request, std::string& reason) const = 0;
/**
* @brief Chuyển payload thành 0..n mission, kèm cách chúng vào hàng đợi.
*
* Trả rỗng nghĩa là **không có việc**, KHÔNG phải lỗi và cũng không phải lệnh huỷ: core sẽ
* bỏ qua, giữ nguyên hàng đợi đang chạy (A1).
*/
virtual ConversionResult convert(const MissionRequest& request) = 0;
};
} // namespace mission_adapters
#endif // MISSION_ADAPTERS_ADAPTER_H_