diff --git a/script-gen-manager/src/instr_metadata/mpsu50_metadata.rs b/script-gen-manager/src/instr_metadata/mpsu50_metadata.rs index 279477a..5d4d162 100644 --- a/script-gen-manager/src/instr_metadata/mpsu50_metadata.rs +++ b/script-gen-manager/src/instr_metadata/mpsu50_metadata.rs @@ -25,6 +25,8 @@ impl Mpsu50Metadata { base.add_range("source.levelv".to_string(), -50.0, 50.0); base.add_range("source.leveli".to_string(), -5.0, 5.0); + base.add_range("source.limiti".to_string(), 0.01, 5.1); + // Add region maps // when pulse mode is off let exclude_i = NumberLimit::new(-10.0e-9, 10.0e-9, false, None); diff --git a/script-gen-manager/src/instr_metadata/msmu60_metadata.rs b/script-gen-manager/src/instr_metadata/msmu60_metadata.rs index 2cce204..e8deb9c 100644 --- a/script-gen-manager/src/instr_metadata/msmu60_metadata.rs +++ b/script-gen-manager/src/instr_metadata/msmu60_metadata.rs @@ -1,5 +1,6 @@ use crate::model::{ - chan_data::region_map::RegionMapMetadata, sweep_data::number_limit::NumberLimit, + chan_data::region_map::RegionMapMetadata, + sweep_data::{number_limit::NumberLimit, parameters::ParameterFloat}, }; use super::base_metadata::{BaseMetadata, Metadata}; @@ -42,6 +43,9 @@ impl Msmu60Metadata { base.add_range("source.levelv".to_string(), -60.0, 60.0); base.add_range("source.leveli".to_string(), -1.5, 1.5); + base.add_range("source.limiti".to_string(), -1e-8, 1.515); + base.add_range("source.limitv".to_string(), -0.02, 60.6); + // Add region maps // when pulse mode is off let exclude_v = Some(NumberLimit::new(-0.01, 0.01, false, None)); diff --git a/script-gen-manager/src/model/chan_data/bias_channel.rs b/script-gen-manager/src/model/chan_data/bias_channel.rs index 75f5e5d..621d265 100644 --- a/script-gen-manager/src/model/chan_data/bias_channel.rs +++ b/script-gen-manager/src/model/chan_data/bias_channel.rs @@ -21,18 +21,12 @@ impl BiasChannel { // Call set_defaults on the common_chan_attributes field bias_channel.common_chan_attributes.set_defaults(); - bias_channel - .common_chan_attributes - .update_region_constraints(bias_channel.bias.value, bias_channel.bias.value); - bias_channel } pub fn evaluate(&mut self) { self.common_chan_attributes.evaluate(); self.determine_bias_value(); - self.common_chan_attributes - .update_region_constraints(self.bias.value, self.bias.value); } fn determine_bias_value(&mut self) { 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 9903966..748ee71 100644 --- a/script-gen-manager/src/model/chan_data/default_channel.rs +++ b/script-gen-manager/src/model/chan_data/default_channel.rs @@ -20,7 +20,7 @@ pub struct CommonChanAttributes { pub meas_function: ParameterString, pub source_range: ChannelRange, meas_range: ChannelRange, - pub source_limiti: ParameterFloat, + pub source_limiti: Option, pub source_limitv: Option, pub sense_mode: Option, @@ -40,11 +40,7 @@ impl CommonChanAttributes { meas_function: ParameterString::new("meas_function"), source_range: ChannelRange::new(), meas_range: ChannelRange::new(), - source_limiti: ParameterFloat::new( - "source_limiti", - 1e-1, - Some(BaseMetadata::UNIT_AMPERES.to_string()), - ), + source_limiti: None, source_limitv: None, sense_mode: None, @@ -66,9 +62,19 @@ impl CommonChanAttributes { 20.0, Some(BaseMetadata::UNIT_VOLTS.to_string()), )); + self.source_limiti = Some(ParameterFloat::new( + "source_limiti", + 1e-1, + Some(BaseMetadata::UNIT_AMPERES.to_string()), + )); } DeviceType::Psu => { self.source_function.range = vec![BaseMetadata::FUNCTION_VOLTAGE.to_string()]; + self.source_limiti = Some(ParameterFloat::new( + "source_limiti", + 0.5, + Some(BaseMetadata::UNIT_AMPERES.to_string()), + )); } DeviceType::Unknown => { //todo: handle error @@ -101,6 +107,7 @@ impl CommonChanAttributes { self.set_source_range(&device_metadata); self.set_source_range_limits(&device_metadata); self.set_source_range_value(); + self.validate_source_limits(&device_metadata); } fn set_source_range(&mut self, metadata: &MetadataEnum) { @@ -243,102 +250,27 @@ impl CommonChanAttributes { Some(sense_mode) } - pub fn update_region_constraints(&mut self, min_value: f64, max_value: f64) -> bool { - let mut changed = false; - let mut region_id = -1; - - match self.device.device_type { - DeviceType::Smu => { - if let Some(region_map) = - self.get_region_map(&self.device.get_metadata(), "smu.region") - { - let mut value = 0.0; - if self.source_range.is_range_auto() - || self.source_range.is_range_follow_limiti() - { - value = if min_value.abs() > max_value.abs() { - min_value - } else { - max_value - }; - } else { - if let Some(res) = self.source_range.get_scaled_value() { - value = res - } - } - - let old_id = region_id; - let old_limiti = self.source_limiti.value; - let old_limitv = self - .source_limitv - .as_ref() - .map(|v| v.value) - .unwrap_or(f64::NAN); - - if self.source_function.value == BaseMetadata::FUNCTION_VOLTAGE.to_string() { - let source_limit_ilimits = region_map.get_current_limit(value); - self.source_limiti.value = - source_limit_ilimits.limit(self.source_limiti.value); - region_id = region_map.find_region(value, self.source_limiti.value); - } else { - let source_limit_vlimits = region_map.get_voltage_limit(value); - if let Some(ref mut limitv) = self.source_limitv { - limitv.value = source_limit_vlimits.limit(limitv.value); - region_id = region_map.find_region(limitv.value, value); - } - } - - if (region_id != old_id) - || (old_limiti != self.source_limiti.value) - || (old_limitv - != self - .source_limitv - .as_ref() - .map(|v| v.value) - .unwrap_or(f64::NAN)) - { - changed = true; - } - } - } - DeviceType::Psu => { - if let Some(region_map) = - self.get_region_map(&self.device.get_metadata(), "psu.region") - { - let mut value = 0.0; - if self.source_range.is_range_auto() - || self.source_range.is_range_follow_limiti() - { - value = if min_value.abs() > max_value.abs() { - min_value - } else { - max_value - }; - } else { - if let Some(res) = self.source_range.get_scaled_value() { - value = res - } - } - - let old_id = region_id; - let old_limiti = self.source_limiti.value; - - if self.source_function.value == BaseMetadata::FUNCTION_VOLTAGE.to_string() { - let source_limit_ilimits = region_map.get_current_limit(value); - self.source_limiti.value = - source_limit_ilimits.limit(self.source_limiti.value); - region_id = region_map.find_region(value, self.source_limiti.value); - } - - if (region_id != old_id) || (old_limiti != self.source_limiti.value) { - changed = true; - } - } + pub fn validate_source_limits(&mut self, metadata: &MetadataEnum) { + if let Some((min, max)) = self.get_range_limits(metadata, "source.limiti") { + if let Some(ref mut limiti) = self.source_limiti { + limiti.value = Self::limit(limiti.value, min, max); } - DeviceType::Unknown => { - //todo: handle error + } + if let Some((min, max)) = self.get_range_limits(metadata, "source.limitv") { + if let Some(ref mut limitv) = self.source_limitv { + limitv.value = Self::limit(limitv.value, min, max); } } - changed + } + + fn limit(mut value: f64, min: f64, max: f64) -> f64 { + if value >= min && value <= max { + return value; + } else if value < min { + value = min + } else { + value = max + } + return value; } } diff --git a/script-gen-manager/src/model/chan_data/start_stop_channel.rs b/script-gen-manager/src/model/chan_data/start_stop_channel.rs index 6ac7645..81c6106 100644 --- a/script-gen-manager/src/model/chan_data/start_stop_channel.rs +++ b/script-gen-manager/src/model/chan_data/start_stop_channel.rs @@ -42,8 +42,6 @@ impl StartStopChannel { BaseMetadata::STYLE_LOG.to_string(), ]; self.style.value = BaseMetadata::STYLE_LIN.to_string(); - self.common_chan_attributes - .update_region_constraints(self.start.value, self.stop.value); self.set_list(steps_or_points); } @@ -65,8 +63,6 @@ impl StartStopChannel { self.common_chan_attributes.evaluate(); self.determine_start_value(); self.determine_stop_value(); - self.common_chan_attributes - .update_region_constraints(self.start.value, self.stop.value); //List evaluation diff --git a/script-gen-manager/src/script_component/sweep.rs b/script-gen-manager/src/script_component/sweep.rs index f31256f..e9ae175 100644 --- a/script-gen-manager/src/script_component/sweep.rs +++ b/script-gen-manager/src/script_component/sweep.rs @@ -156,10 +156,15 @@ impl SweepModel { .insert(instr_name.clone() + ":LIMITV", String::from("nil")); } - self.val_replacement_map.insert( - instr_name.clone() + ":LIMITI", - self.format(bias_channel.common_chan_attributes.source_limiti.value), - ); + if let Some(source_limiti) = &bias_channel.common_chan_attributes.source_limiti { + self.val_replacement_map.insert( + instr_name.clone() + ":LIMITI", + self.format(source_limiti.value), + ); + } else { + self.val_replacement_map + .insert(instr_name.clone() + ":LIMITI", String::from("nil")); + } self.val_replacement_map.insert( instr_name.clone() + ":BIAS", @@ -283,16 +288,19 @@ impl SweepModel { .insert(instr_name.clone() + ":LIMITV", String::from("nil")); } - self.val_replacement_map.insert( - instr_name.clone() + ":LIMITI", - self.format( - step_channel - .start_stop_channel - .common_chan_attributes - .source_limiti - .value, - ), - ); + if let Some(source_limiti) = &step_channel + .start_stop_channel + .common_chan_attributes + .source_limiti + { + self.val_replacement_map.insert( + instr_name.clone() + ":LIMITI", + self.format(source_limiti.value), + ); + } else { + self.val_replacement_map + .insert(instr_name.clone() + ":LIMITI", String::from("nil")); + } self.val_replacement_map.insert( instr_name.clone() + ":START", @@ -479,16 +487,19 @@ impl SweepModel { .insert(instr_name.clone() + ":LIMITV", String::from("nil")); } - self.val_replacement_map.insert( - instr_name.clone() + ":LIMITI", - self.format( - sweep_channel - .start_stop_channel - .common_chan_attributes - .source_limiti - .value, - ), - ); + if let Some(source_limiti) = &sweep_channel + .start_stop_channel + .common_chan_attributes + .source_limiti + { + self.val_replacement_map.insert( + instr_name.clone() + ":LIMITI", + self.format(source_limiti.value), + ); + } else { + self.val_replacement_map + .insert(instr_name.clone() + ":LIMITI", String::from("nil")); + } self.val_replacement_map.insert( instr_name.clone() + ":START",