use crate::xio::LoadableDevice;
use crate::{file_load_json as load_json, LoadPathPattern, Result};
use indexmap::{IndexMap, IndexSet};
use std::path::PathBuf;
use xio_base_datatypes::DataValueDescriptive;
use xio_jobset::{
ChannelAssignment, Job, ParameterDescription, ParameterSetMetadata,
};
#[derive(Debug)]
pub struct Device {
inner: crate::filesystem::Device,
}
impl Device {
pub fn new(inner: crate::filesystem::Device) -> Self {
Device { inner }
}
pub fn device_dir(&self) -> PathBuf {
self.inner.device_dir().join("xio")
}
pub fn boards_dir(&self) -> PathBuf {
self.device_dir().join("board")
}
pub fn board_dir(&self, board_id: &str) -> PathBuf {
self.boards_dir().join(board_id)
}
pub fn device_parameter_metadata_file(&self) -> PathBuf {
self.device_dir().join("parameters_description.json")
}
pub fn device_parameter_descriptions_file(&self) -> PathBuf {
self.device_dir().join("parameters.json")
}
pub fn device_parameter_values_file(&self) -> PathBuf {
self.device_dir().join("parameterset.json")
}
pub fn board_mapping_file(&self, board_id: &str) -> PathBuf {
self.board_dir(board_id).join("mapping.json")
}
pub fn board_parameter_metadata_file(
&self,
board_id: &str,
) -> PathBuf {
self.board_dir(board_id).join("parameters_description.json")
}
pub fn board_parameter_descriptions_file(
&self,
board_id: &str,
) -> PathBuf {
self.board_dir(board_id).join("parameters.json")
}
pub fn board_parameter_values_file(&self, board_id: &str) -> PathBuf {
self.board_dir(board_id).join("parameterset.json")
}
pub fn calibration_dir(&self, calibration_id: &str) -> PathBuf {
self.inner
.description_calibration_dir(calibration_id)
.join("xio")
}
pub fn sampling_dir(&self, sampling_id: &str) -> PathBuf {
self.inner.sampling_dir(sampling_id).join("xio")
}
pub fn calibration_jobs_dir(&self, calibration_id: &str) -> PathBuf {
self.calibration_dir(calibration_id).join("jobs")
}
pub fn calibration_job_file(
&self,
calibration_id: &str,
job_id: &str,
) -> PathBuf {
self.calibration_jobs_dir(calibration_id)
.join(format!("{}.json", job_id))
}
pub fn calibration_parameter_metadata_file(
&self,
calibration_id: &str,
) -> PathBuf {
self.calibration_dir(calibration_id)
.join("parameters_description.json")
}
pub fn calibration_parameter_descriptions_file(
&self,
calibration_id: &str,
) -> PathBuf {
self.calibration_dir(calibration_id).join("parameters.json")
}
pub fn calibration_parameter_values_file(
&self,
calibration_id: &str,
) -> PathBuf {
self.calibration_dir(calibration_id)
.join("parameterset.json")
}
pub fn sampling_jobs_dir(&self, sampling_id: &str) -> PathBuf {
self.sampling_dir(sampling_id).join("jobs")
}
pub fn sampling_job_file(
&self,
sampling_id: &str,
job_id: &str,
) -> PathBuf {
self.sampling_jobs_dir(sampling_id)
.join(format!("{}.json", job_id))
}
pub fn sampling_parameter_metadata_file(
&self,
sampling_id: &str,
) -> PathBuf {
self.sampling_dir(sampling_id)
.join("parameters_description.json")
}
pub fn sampling_parameter_descriptions_file(
&self,
sampling_id: &str,
) -> PathBuf {
self.sampling_dir(sampling_id).join("parameters.json")
}
pub fn sampling_parameter_values_file(
&self,
sampling_id: &str,
) -> PathBuf {
self.sampling_dir(sampling_id).join("parameterset.json")
}
}
impl LoadableDevice for Device {
fn load_device_parameter_metadata(
&self,
) -> Result<ParameterSetMetadata> {
load_json(self.device_parameter_metadata_file())
}
fn load_device_parameter_descriptions(
&self,
) -> Result<IndexMap<String, ParameterDescription>> {
load_json(self.device_parameter_descriptions_file())
}
fn load_device_parameter_values(
&self,
) -> Result<IndexMap<String, DataValueDescriptive>> {
load_json(self.device_parameter_values_file())
}
fn load_board_index(&self) -> Result<IndexSet<String>> {
IndexSet::load_path_pattern_from_dir(self.boards_dir(), "*")
}
fn load_board_mapping(
&self,
board_id: &str,
) -> Result<IndexMap<String, ChannelAssignment>> {
load_json(self.board_mapping_file(board_id))
}
fn load_board_parameter_metadata(
&self,
board_id: &str,
) -> Result<ParameterSetMetadata> {
load_json(self.board_parameter_metadata_file(board_id))
}
fn load_board_parameter_descriptions(
&self,
board_id: &str,
) -> Result<IndexMap<String, ParameterDescription>> {
load_json(self.board_parameter_descriptions_file(board_id))
}
fn load_board_parameter_values(
&self,
board_id: &str,
) -> Result<IndexMap<String, DataValueDescriptive>> {
load_json(self.board_parameter_values_file(board_id))
}
fn load_calibration_parameter_metadata(
&self,
calibration_id: &str,
) -> Result<ParameterSetMetadata> {
load_json(self.calibration_parameter_metadata_file(calibration_id))
}
fn load_calibration_parameter_descriptions(
&self,
calibration_id: &str,
) -> Result<IndexMap<String, ParameterDescription>> {
load_json(
self.calibration_parameter_descriptions_file(calibration_id),
)
}
fn load_calibration_parameter_values(
&self,
calibration_id: &str,
) -> Result<IndexMap<String, DataValueDescriptive>> {
load_json(self.calibration_parameter_values_file(calibration_id))
}
fn load_calibration_job_index(
&self,
calibration_id: &str,
) -> Result<IndexSet<String>> {
IndexSet::load_path_pattern_from_dir(
self.calibration_jobs_dir(calibration_id),
"*.json",
)
}
fn load_calibration_job(
&self,
calibration_id: &str,
job_id: &str,
) -> Result<Job> {
load_json(self.calibration_job_file(calibration_id, job_id))
}
fn load_sampling_parameter_metadata(
&self,
sampling_id: &str,
) -> Result<ParameterSetMetadata> {
load_json(self.sampling_parameter_metadata_file(sampling_id))
}
fn load_sampling_parameter_descriptions(
&self,
sampling_id: &str,
) -> Result<IndexMap<String, ParameterDescription>> {
load_json(self.sampling_parameter_descriptions_file(sampling_id))
}
fn load_sampling_parameter_values(
&self,
sampling_id: &str,
) -> Result<IndexMap<String, DataValueDescriptive>> {
load_json(self.sampling_parameter_values_file(sampling_id))
}
fn load_sampling_job_index(
&self,
sampling_id: &str,
) -> Result<IndexSet<String>> {
IndexSet::load_path_pattern_from_dir(
self.sampling_jobs_dir(sampling_id),
"*.json",
)
}
fn load_sampling_job(
&self,
sampling_id: &str,
job_id: &str,
) -> Result<Job> {
load_json(self.sampling_job_file(sampling_id, job_id))
}
}