diff --git a/script-gen-manager/src/instr_metadata/base_metadata.rs b/script-gen-manager/src/instr_metadata/base_metadata.rs index 8f5044b..48176b9 100644 --- a/script-gen-manager/src/instr_metadata/base_metadata.rs +++ b/script-gen-manager/src/instr_metadata/base_metadata.rs @@ -17,6 +17,7 @@ pub trait Metadata: Debug + Clone { fn get_default(&self, key: &str) -> Option<&'static str>; fn get_name(&self, key: &str) -> Option<&'static str>; fn get_region_map(&self, key: &str) -> Option; + fn get_overrange_scale(&self) -> f64; } /// A struct that holds base metadata information common to all Trebuchet instruments. @@ -27,6 +28,7 @@ pub struct BaseMetadata { defaults: HashMap<&'static str, &'static str>, names: HashMap<&'static str, &'static str>, region_maps: HashMap<&'static str, RegionMapMetadata>, + overrange_scale: f64, } impl BaseMetadata { @@ -65,6 +67,7 @@ impl BaseMetadata { let defaults = HashMap::new(); let mut names = HashMap::new(); let region_maps = HashMap::new(); + let overrange_scale = 1.0; //timing: source or measure delay type options.insert( @@ -85,6 +88,7 @@ impl BaseMetadata { defaults, names, region_maps, + overrange_scale, } } @@ -103,6 +107,10 @@ impl BaseMetadata { pub fn add_region_map(&mut self, key: &'static str, region_map_metadata: RegionMapMetadata) { self.region_maps.insert(key, region_map_metadata); } + + pub fn add_overrange_scale(&mut self, scale: f64) { + self.overrange_scale = scale; + } } impl Metadata for BaseMetadata { @@ -127,6 +135,10 @@ impl Metadata for BaseMetadata { fn get_region_map(&self, key: &str) -> Option { self.region_maps.get(key).cloned() } + + fn get_overrange_scale(&self) -> f64 { + self.overrange_scale + } } impl Default for BaseMetadata { diff --git a/script-gen-manager/src/instr_metadata/mpsu50_metadata.rs b/script-gen-manager/src/instr_metadata/mpsu50_metadata.rs index 5d4d162..98773bf 100644 --- a/script-gen-manager/src/instr_metadata/mpsu50_metadata.rs +++ b/script-gen-manager/src/instr_metadata/mpsu50_metadata.rs @@ -22,7 +22,7 @@ impl Mpsu50Metadata { //TODO: verify for Trebuchet PSU (model: MPSU50-2ST) // Add ranges - base.add_range("source.levelv".to_string(), -50.0, 50.0); + base.add_range("source.levelv".to_string(), -50.1, 50.1); base.add_range("source.leveli".to_string(), -5.0, 5.0); base.add_range("source.limiti".to_string(), 0.01, 5.1); @@ -37,6 +37,8 @@ impl Mpsu50Metadata { region_map_metadata.add_region(1, 0.0, 0.0, -50.0, -1.0); base.add_region_map("psu.region", region_map_metadata); + base.add_overrange_scale(1.002); + Mpsu50Metadata { base, // Initialize additional properties @@ -64,4 +66,8 @@ impl Metadata for Mpsu50Metadata { fn get_region_map(&self, key: &str) -> Option { self.base.get_region_map(key) } + + fn get_overrange_scale(&self) -> f64 { + self.base.get_overrange_scale() + } } diff --git a/script-gen-manager/src/instr_metadata/msmu60_metadata.rs b/script-gen-manager/src/instr_metadata/msmu60_metadata.rs index 0c55e54..47b89cf 100644 --- a/script-gen-manager/src/instr_metadata/msmu60_metadata.rs +++ b/script-gen-manager/src/instr_metadata/msmu60_metadata.rs @@ -55,6 +55,8 @@ impl Msmu60Metadata { region_map_metadata.add_region(1, -20.0, -1.5, 20.0, 1.5); base.add_region_map("smu.region", region_map_metadata); + base.add_overrange_scale(1.01); + Msmu60Metadata { base, // Initialize additional properties @@ -82,4 +84,8 @@ impl Metadata for Msmu60Metadata { fn get_region_map(&self, key: &str) -> Option { self.base.get_region_map(key) } + + fn get_overrange_scale(&self) -> f64 { + self.base.get_overrange_scale() + } } diff --git a/script-gen-manager/src/model/chan_data/channel_range.rs b/script-gen-manager/src/model/chan_data/channel_range.rs index 6ad4365..9998a6c 100644 --- a/script-gen-manager/src/model/chan_data/channel_range.rs +++ b/script-gen-manager/src/model/chan_data/channel_range.rs @@ -12,6 +12,8 @@ pub struct ChannelRange { pub min: f64, #[serde(skip)] pub max: f64, + #[serde(skip)] + pub overrange_scale: f64, } impl ChannelRange { @@ -22,6 +24,7 @@ impl ChannelRange { unit: String::new(), min: 0.0, max: 0.0, + overrange_scale: 1.0, } } @@ -33,6 +36,10 @@ impl ChannelRange { self.max = max; } + pub fn set_overrange_scale(&mut self, scale: f64) { + self.overrange_scale = scale; + } + pub fn limit(&mut self, value: f64) -> f64 { let result = value; if self.value == "AUTO" { @@ -44,7 +51,7 @@ impl ChannelRange { } else { let scaled_value = self.get_scaled_value(); if let Some(scaled_value) = scaled_value { - let overrange_scaled_value = scaled_value * 1.01; + let overrange_scaled_value = scaled_value * self.overrange_scale; if result < -overrange_scaled_value { return -overrange_scaled_value; } else if result > overrange_scaled_value { diff --git a/script-gen-manager/src/model/chan_data/default_channel.rs b/script-gen-manager/src/model/chan_data/default_channel.rs index 748ee71..2c22c51 100644 --- a/script-gen-manager/src/model/chan_data/default_channel.rs +++ b/script-gen-manager/src/model/chan_data/default_channel.rs @@ -107,6 +107,7 @@ impl CommonChanAttributes { self.set_source_range(&device_metadata); self.set_source_range_limits(&device_metadata); self.set_source_range_value(); + self.set_overrange_scale(&device_metadata); self.validate_source_limits(&device_metadata); } @@ -132,6 +133,11 @@ impl CommonChanAttributes { } } + fn set_overrange_scale(&mut self, metadata: &MetadataEnum) { + let scale = self.get_overrange_scale(metadata); + self.source_range.set_overrange_scale(scale); + } + fn set_source_range_value(&mut self) { if !self.source_range.range.contains(&self.source_range.value) { let key = if self.source_function.value == BaseMetadata::FUNCTION_VOLTAGE.to_string() { @@ -214,6 +220,14 @@ impl CommonChanAttributes { } } + fn get_overrange_scale(&self, metadata: &MetadataEnum) -> f64 { + match metadata { + MetadataEnum::Base(base_metadata) => base_metadata.get_overrange_scale(), + MetadataEnum::Msmu60(msmu60_metadata) => msmu60_metadata.get_overrange_scale(), + MetadataEnum::Mpsu50(mpsu50_metadata) => mpsu50_metadata.get_overrange_scale(), + } + } + fn get_range_defaults(&self, metadata: &MetadataEnum, key: &str) -> Option<&'static str> { match metadata { MetadataEnum::Base(base_metadata) => base_metadata.get_default(key),