@@ -20,7 +20,7 @@ pub struct CommonChanAttributes {
2020 pub meas_function : ParameterString ,
2121 pub source_range : ChannelRange ,
2222 meas_range : ChannelRange ,
23- pub source_limiti : ParameterFloat ,
23+ pub source_limiti : Option < ParameterFloat > ,
2424 pub source_limitv : Option < ParameterFloat > ,
2525 pub sense_mode : Option < ParameterString > ,
2626
@@ -40,11 +40,7 @@ impl CommonChanAttributes {
4040 meas_function : ParameterString :: new ( "meas_function" ) ,
4141 source_range : ChannelRange :: new ( ) ,
4242 meas_range : ChannelRange :: new ( ) ,
43- source_limiti : ParameterFloat :: new (
44- "source_limiti" ,
45- 1e-1 ,
46- Some ( BaseMetadata :: UNIT_AMPERES . to_string ( ) ) ,
47- ) ,
43+ source_limiti : None ,
4844 source_limitv : None ,
4945 sense_mode : None ,
5046
@@ -66,9 +62,19 @@ impl CommonChanAttributes {
6662 20.0 ,
6763 Some ( BaseMetadata :: UNIT_VOLTS . to_string ( ) ) ,
6864 ) ) ;
65+ self . source_limiti = Some ( ParameterFloat :: new (
66+ "source_limiti" ,
67+ 1e-1 ,
68+ Some ( BaseMetadata :: UNIT_AMPERES . to_string ( ) ) ,
69+ ) ) ;
6970 }
7071 DeviceType :: Psu => {
7172 self . source_function . range = vec ! [ BaseMetadata :: FUNCTION_VOLTAGE . to_string( ) ] ;
73+ self . source_limiti = Some ( ParameterFloat :: new (
74+ "source_limiti" ,
75+ 0.5 ,
76+ Some ( BaseMetadata :: UNIT_AMPERES . to_string ( ) ) ,
77+ ) ) ;
7278 }
7379 DeviceType :: Unknown => {
7480 //todo: handle error
@@ -101,6 +107,7 @@ impl CommonChanAttributes {
101107 self . set_source_range ( & device_metadata) ;
102108 self . set_source_range_limits ( & device_metadata) ;
103109 self . set_source_range_value ( ) ;
110+ self . validate_source_limits ( & device_metadata) ;
104111 }
105112
106113 fn set_source_range ( & mut self , metadata : & MetadataEnum ) {
@@ -243,102 +250,27 @@ impl CommonChanAttributes {
243250 Some ( sense_mode)
244251 }
245252
246- pub fn update_region_constraints ( & mut self , min_value : f64 , max_value : f64 ) -> bool {
247- let mut changed = false ;
248- let mut region_id = -1 ;
249-
250- match self . device . device_type {
251- DeviceType :: Smu => {
252- if let Some ( region_map) =
253- self . get_region_map ( & self . device . get_metadata ( ) , "smu.region" )
254- {
255- let mut value = 0.0 ;
256- if self . source_range . is_range_auto ( )
257- || self . source_range . is_range_follow_limiti ( )
258- {
259- value = if min_value. abs ( ) > max_value. abs ( ) {
260- min_value
261- } else {
262- max_value
263- } ;
264- } else {
265- if let Some ( res) = self . source_range . get_scaled_value ( ) {
266- value = res
267- }
268- }
269-
270- let old_id = region_id;
271- let old_limiti = self . source_limiti . value ;
272- let old_limitv = self
273- . source_limitv
274- . as_ref ( )
275- . map ( |v| v. value )
276- . unwrap_or ( f64:: NAN ) ;
277-
278- if self . source_function . value == BaseMetadata :: FUNCTION_VOLTAGE . to_string ( ) {
279- let source_limit_ilimits = region_map. get_current_limit ( value) ;
280- self . source_limiti . value =
281- source_limit_ilimits. limit ( self . source_limiti . value ) ;
282- region_id = region_map. find_region ( value, self . source_limiti . value ) ;
283- } else {
284- let source_limit_vlimits = region_map. get_voltage_limit ( value) ;
285- if let Some ( ref mut limitv) = self . source_limitv {
286- limitv. value = source_limit_vlimits. limit ( limitv. value ) ;
287- region_id = region_map. find_region ( limitv. value , value) ;
288- }
289- }
290-
291- if ( region_id != old_id)
292- || ( old_limiti != self . source_limiti . value )
293- || ( old_limitv
294- != self
295- . source_limitv
296- . as_ref ( )
297- . map ( |v| v. value )
298- . unwrap_or ( f64:: NAN ) )
299- {
300- changed = true ;
301- }
302- }
303- }
304- DeviceType :: Psu => {
305- if let Some ( region_map) =
306- self . get_region_map ( & self . device . get_metadata ( ) , "psu.region" )
307- {
308- let mut value = 0.0 ;
309- if self . source_range . is_range_auto ( )
310- || self . source_range . is_range_follow_limiti ( )
311- {
312- value = if min_value. abs ( ) > max_value. abs ( ) {
313- min_value
314- } else {
315- max_value
316- } ;
317- } else {
318- if let Some ( res) = self . source_range . get_scaled_value ( ) {
319- value = res
320- }
321- }
322-
323- let old_id = region_id;
324- let old_limiti = self . source_limiti . value ;
325-
326- if self . source_function . value == BaseMetadata :: FUNCTION_VOLTAGE . to_string ( ) {
327- let source_limit_ilimits = region_map. get_current_limit ( value) ;
328- self . source_limiti . value =
329- source_limit_ilimits. limit ( self . source_limiti . value ) ;
330- region_id = region_map. find_region ( value, self . source_limiti . value ) ;
331- }
332-
333- if ( region_id != old_id) || ( old_limiti != self . source_limiti . value ) {
334- changed = true ;
335- }
336- }
253+ pub fn validate_source_limits ( & mut self , metadata : & MetadataEnum ) {
254+ if let Some ( ( min, max) ) = self . get_range_limits ( metadata, "source.limiti" ) {
255+ if let Some ( ref mut limiti) = self . source_limiti {
256+ limiti. value = Self :: limit ( limiti. value , min, max) ;
337257 }
338- DeviceType :: Unknown => {
339- //todo: handle error
258+ }
259+ if let Some ( ( min, max) ) = self . get_range_limits ( metadata, "source.limitv" ) {
260+ if let Some ( ref mut limitv) = self . source_limitv {
261+ limitv. value = Self :: limit ( limitv. value , min, max) ;
340262 }
341263 }
342- changed
264+ }
265+
266+ fn limit ( mut value : f64 , min : f64 , max : f64 ) -> f64 {
267+ if value >= min && value <= max {
268+ return value;
269+ } else if value < min {
270+ value = min
271+ } else {
272+ value = max
273+ }
274+ return value;
343275 }
344276}
0 commit comments