Files
2026-06-09 12:42:15 +08:00

57 lines
2.0 KiB
C++
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
#pragma once
#include "line_laser_modbus/device.hpp"
namespace line_laser_modbus {
// 板卡运动控制适配接口。
//
// 迁移到真实驱动板时,协议库不需要知道具体轴控、插补、报警和坐标系实现。
// 板卡侧只要实现这个接口,MotionControlBridge 就能把 Modbus 寄存器协议和
// 真实运动控制模块连接起来。
class MotionControlAdapter {
public:
virtual ~MotionControlAdapter() = default;
// 上位机写入 0xD000 模式命令字,并且 DeviceServer 已确认该模式合法后调用。
virtual void on_mode_changed(WorkMode mode) = 0;
// 上位机写入 0xD020 ~ 0xD02D 目标示教位姿后调用。
virtual void on_target_pose(const Pose6D& pose) = 0;
// 上位机写入 0xD036 ~ 0xD043 六轴纠偏量后调用。
virtual void on_correction(const Pose6D& correction) = 0;
// 返回板卡当前实际位姿。桥接层会把它写入 0xD00A ~ 0xD017。
[[nodiscard]] virtual Pose6D current_pose() const = 0;
// 返回板卡当前设备状态。桥接层会把它写入 0xD001。
[[nodiscard]] virtual DeviceState current_state() const = 0;
};
// 协议服务器与板卡运动控制之间的桥接器。
//
// 固件主循环可以直接调用 process_request()
// 1. 先把板卡实时反馈发布到 RegisterBank
// 2. 调用 DeviceServer 处理 RTU 请求;
// 3. 如果本帧是合法写请求,则把写入结果回调给 MotionControlAdapter。
class MotionControlBridge {
public:
MotionControlBridge(DeviceServer& server, MotionControlAdapter& adapter) noexcept;
[[nodiscard]] ByteVector process_request(const ByteVector& request);
// 没有上位机请求时,也可以周期调用该函数刷新当前位姿和状态寄存器。
void publish_feedback();
private:
[[nodiscard]] bool write_ack_matches(const ByteVector& response,
const WriteRequest& request) const;
void notify_adapter_for_write(const WriteRequest& request);
DeviceServer& server_;
MotionControlAdapter& adapter_;
};
} // 命名空间 line_laser_modbus