1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
//! Piper SDK - 松灵机械臂 Rust SDK
//!
//! 高性能、跨平台、零抽象开销的 Rust SDK,专用于松灵 Piper 机械臂的高频力控(>1kHz)。
//!
//! # 架构设计
//!
//! 本 SDK 采用分层架构,从底层到高层:
//!
//! - **CAN 层** (`can`): CAN 硬件抽象,支持 SocketCAN 和 GS-USB
//! - **协议层** (`protocol`): 类型安全的协议编码/解码
//! - **驱动层** (`driver`): IO 线程管理、状态同步、帧解析
//! - **客户端层** (`client`): 类型安全、易用的控制接口
//!
//! # 快速开始
//!
//! 大多数用户应该使用高层 API(客户端接口):
//!
//! ```rust
//! use piper_sdk::prelude::*;
//! // 或
//! use piper_sdk::{Piper, Observer};
//! ```
//!
//! 需要直接控制 CAN 帧或需要更高性能的用户可以使用驱动层:
//!
//! ```rust
//! use piper_sdk::driver::{Piper as Driver, PiperBuilder};
//! ```
// 内部模块结构(重新导出各个层)
// Prelude 模块
// --- 用户以此为界 ---
// CAN 层常用类型
pub use ;
// 协议层错误
pub use ProtocolError;
// 驱动层(高级用户使用)- 通过模块路径访问,避免命名冲突
// 注意:不直接导出 driver::Piper,因为与 client::Piper 冲突
// 用户可以通过 driver::Piper 或类型别名访问
pub use DriverError;
// 客户端层(普通用户使用)- 这是推荐的入口点
// 导出 client::Piper 为 Piper(这是大多数用户应该使用的)
pub use Piper; // Type State Pattern 的状态机
pub use ;
// 导出 recording 模块的常用类型
pub use ;
// 类型别名:为驱动层提供清晰的别名
pub type Driver = Piper; // 高级用户可以使用这个别名
// ============================================================
// 日志初始化宏
// ============================================================
/// 初始化日志系统(便捷宏)
///
/// ## 功能
///
/// - 兼容 `log` crate(通过 `tracing-log::LogTracer`)
/// - 从 `RUST_LOG` 环境变量读取日志级别
/// - 默认级别:`piper_sdk=info`
/// - 格式:compact,隐藏 target(易读)
///
/// ## 使用示例
///
/// ```rust,no_run
/// use piper_sdk::prelude::*;
///
/// fn main() -> std::result::Result<(), Box<dyn std::error::Error>> {
/// // 在 main 函数开头初始化日志
/// piper_sdk::init_logger!();
///
/// // 连接机器人
/// let driver = PiperBuilder::new().interface("can0").build()?;
///
/// // 现在可以使用 tracing::info!, tracing::warn! 等宏
/// tracing::info!("Connected to robot");
///
/// Ok(())
/// }
/// ```