ceo: 完成configs迁移和main.rs插件注册
- 从旧项目复制dog_state_machine.json和cat_state_machine.json - 实现main.rs完整插件注册(screen, wifi, video, ble, http) - 添加命令行参数支持(--config, --validate) - 实现Ctrl+C优雅退出 - 添加ctrlc依赖
This commit is contained in:
78
src/main.rs
78
src/main.rs
@@ -1,10 +1,39 @@
|
||||
use anyhow::Result;
|
||||
use showen_v2::core::config::AppConfig;
|
||||
use showen_v2::core::service_manager::ServiceManager;
|
||||
use showen_v2::plugins::{
|
||||
ble::BlePlugin, http::HttpPlugin, screen::ScreenPlugin, video::VideoPlugin, wifi::WifiPlugin,
|
||||
};
|
||||
use std::sync::atomic::{AtomicBool, Ordering};
|
||||
use std::sync::Arc;
|
||||
|
||||
fn main() -> Result<()> {
|
||||
let config_path = std::env::args()
|
||||
// 解析命令行参数
|
||||
let args: Vec<String> = std::env::args().collect();
|
||||
|
||||
// 处理 --validate 参数
|
||||
if args.contains(&"--validate".to_string()) {
|
||||
let config_path = args
|
||||
.iter()
|
||||
.skip_while(|arg| *arg != "--config")
|
||||
.nth(1)
|
||||
.cloned()
|
||||
.unwrap_or_else(|| "configs/dog_state_machine.json".to_string());
|
||||
|
||||
println!("验证配置文件: {}", config_path);
|
||||
let config = AppConfig::from_file(&config_path)?;
|
||||
config.validate_paths()?;
|
||||
println!("✓ 配置文件有效");
|
||||
return Ok(());
|
||||
}
|
||||
|
||||
// 获取配置文件路径
|
||||
let config_path = args
|
||||
.iter()
|
||||
.skip_while(|arg| *arg != "--config")
|
||||
.nth(1)
|
||||
.cloned()
|
||||
.or_else(|| args.get(1).cloned())
|
||||
.unwrap_or_else(|| "configs/dog_state_machine.json".to_string());
|
||||
|
||||
println!("ShowenV2 — 数字生命窗口平台");
|
||||
@@ -15,15 +44,48 @@ fn main() -> Result<()> {
|
||||
|
||||
let mut manager = ServiceManager::new(config);
|
||||
|
||||
// TODO: 按平台注册插件 (Commit 8)
|
||||
// manager.register(Box::new(VideoPlugin::new()));
|
||||
// manager.register(Box::new(HttpPlugin::new()));
|
||||
// manager.register(Box::new(BlePlugin::new()));
|
||||
// manager.register(Box::new(ScreenPlugin::new()));
|
||||
// manager.register(Box::new(WifiPlugin::new()));
|
||||
// 按依赖顺序注册插件
|
||||
// 独立插件:screen, wifi, video, ble
|
||||
// 依赖插件:http (依赖 video)
|
||||
|
||||
println!("注册插件...");
|
||||
manager.register(Box::new(ScreenPlugin::new()));
|
||||
println!(" ✓ ScreenPlugin");
|
||||
|
||||
manager.register(Box::new(WifiPlugin::new()));
|
||||
println!(" ✓ WifiPlugin");
|
||||
|
||||
manager.register(Box::new(VideoPlugin::new()));
|
||||
println!(" ✓ VideoPlugin");
|
||||
|
||||
manager.register(Box::new(BlePlugin::new()));
|
||||
println!(" ✓ BlePlugin");
|
||||
|
||||
manager.register(Box::new(HttpPlugin::new()));
|
||||
println!(" ✓ HttpPlugin");
|
||||
|
||||
// 设置 Ctrl+C 信号处理
|
||||
let running = Arc::new(AtomicBool::new(true));
|
||||
let r = running.clone();
|
||||
|
||||
ctrlc::set_handler(move || {
|
||||
println!("\n收到退出信号,正在关闭...");
|
||||
r.store(false, Ordering::SeqCst);
|
||||
})?;
|
||||
|
||||
println!("启动所有插件...");
|
||||
manager.start_all()?;
|
||||
manager.run()?;
|
||||
|
||||
println!("ShowenV2 运行中... (按 Ctrl+C 退出)");
|
||||
|
||||
// 运行主循环
|
||||
while running.load(Ordering::SeqCst) {
|
||||
manager.run()?;
|
||||
}
|
||||
|
||||
println!("正在停止所有插件...");
|
||||
manager.stop_all()?;
|
||||
println!("ShowenV2 已退出");
|
||||
|
||||
Ok(())
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user