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:
showen
2026-03-12 07:15:21 +08:00
parent 765e1f1a78
commit 0709d0de05
6 changed files with 2529 additions and 8 deletions

View File

@@ -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(())
}