Task planning and path generation software for automated data collection equipment (hyperspectral cameras, DSLR, depth cameras). - Generate mission plans (JSON) with subtasks per device - Generate scan path binary files (.RecordLine3) - Multi-rectangle area planning with reference map support - Device-specific FOV defaults (Pika L 17.6°, Pika NIR 21.7°, etc.) - Timeline scheduling with constraint validation - Tauri 2.x + Vue 3 + Naive UI + Pinia
77 lines
2.2 KiB
Rust
77 lines
2.2 KiB
Rust
use tauri::command;
|
|
use crate::error::AppError;
|
|
use crate::models::{MissionScanConfig, PlannerDefaults};
|
|
use std::path::PathBuf;
|
|
|
|
fn defaults_dir() -> PathBuf {
|
|
// Save next to the executable
|
|
std::env::current_exe()
|
|
.unwrap_or_else(|_| PathBuf::from("."))
|
|
.parent()
|
|
.unwrap_or_else(|| std::path::Path::new("."))
|
|
.to_path_buf()
|
|
}
|
|
|
|
#[command]
|
|
pub fn save_default_scan_config(config: MissionScanConfig) -> Result<(), AppError> {
|
|
let path = defaults_dir().join("scan_defaults.json");
|
|
let content = serde_json::to_string_pretty(&config)?;
|
|
std::fs::write(path, content)?;
|
|
Ok(())
|
|
}
|
|
|
|
#[command]
|
|
pub fn load_default_scan_config() -> Result<MissionScanConfig, AppError> {
|
|
let path = defaults_dir().join("scan_defaults.json");
|
|
if path.exists() {
|
|
let content = std::fs::read_to_string(path)?;
|
|
let config: MissionScanConfig = serde_json::from_str(&content)?;
|
|
Ok(config)
|
|
} else {
|
|
Ok(MissionScanConfig::default())
|
|
}
|
|
}
|
|
|
|
#[command]
|
|
pub fn save_default_background(path: String) -> Result<(), AppError> {
|
|
let file_path = defaults_dir().join("background_default.txt");
|
|
std::fs::write(file_path, &path)?;
|
|
Ok(())
|
|
}
|
|
|
|
#[command]
|
|
pub fn load_default_background() -> Result<Option<String>, AppError> {
|
|
let file_path = defaults_dir().join("background_default.txt");
|
|
if file_path.exists() {
|
|
let content = std::fs::read_to_string(file_path)?;
|
|
let trimmed = content.trim().to_string();
|
|
if trimmed.is_empty() {
|
|
Ok(None)
|
|
} else {
|
|
Ok(Some(trimmed))
|
|
}
|
|
} else {
|
|
Ok(None)
|
|
}
|
|
}
|
|
|
|
#[command]
|
|
pub fn save_planner_defaults(config: PlannerDefaults) -> Result<(), AppError> {
|
|
let path = defaults_dir().join("planner_defaults.json");
|
|
let content = serde_json::to_string_pretty(&config)?;
|
|
std::fs::write(path, content)?;
|
|
Ok(())
|
|
}
|
|
|
|
#[command]
|
|
pub fn load_planner_defaults() -> Result<PlannerDefaults, AppError> {
|
|
let path = defaults_dir().join("planner_defaults.json");
|
|
if path.exists() {
|
|
let content = std::fs::read_to_string(path)?;
|
|
let config: PlannerDefaults = serde_json::from_str(&content)?;
|
|
Ok(config)
|
|
} else {
|
|
Ok(PlannerDefaults::default())
|
|
}
|
|
}
|