Skip to content

Commit 706550e

Browse files
Track source limit for a PSU (#39)
Co-authored-by: jharajeev55 <[email protected]>
1 parent aa0c8b6 commit 706550e

File tree

4 files changed

+98
-8
lines changed

4 files changed

+98
-8
lines changed

kic-script-gen/src/back_end/data_model.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -93,7 +93,7 @@ impl DataModel {
9393
pub fn process_data_from_saved_config(&mut self, data: String) -> String {
9494
match serde_json::from_str::<SweepModel>(&data) {
9595
Ok(mut sweep_model) => {
96-
println!("Successfully deserialized saved JSON in server: {sweep_model:?}");
96+
//println!("Successfully deserialized saved JSON in server: {sweep_model:?}");
9797
sweep_model.sweep_config.evaluate();
9898

9999
self.sweep_model = sweep_model.clone();

script-gen-manager/src/instr_metadata/mpsu50_metadata.rs

Lines changed: 58 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -22,8 +22,18 @@ impl Mpsu50Metadata {
2222

2323
//TODO: verify for Trebuchet PSU (model: MPSU50-2ST)
2424
// Add ranges
25-
base.add_range("source.levelv".to_string(), -50.1, 50.1);
26-
base.add_range("source.leveli".to_string(), -5.0, 5.0);
25+
let max_supported_voltage = 50.1;
26+
let max_supported_current = 5.0;
27+
base.add_range(
28+
"source.levelv".to_string(),
29+
-max_supported_voltage,
30+
max_supported_voltage,
31+
);
32+
base.add_range(
33+
"source.leveli".to_string(),
34+
-max_supported_current,
35+
max_supported_current,
36+
);
2737

2838
base.add_range("source.limiti".to_string(), 0.01, 5.1);
2939

@@ -33,11 +43,14 @@ impl Mpsu50Metadata {
3343
// when pulse mode is off
3444
let exclude_i = NumberLimit::new(-10.0e-9, 10.0e-9, false, None);
3545
let mut region_map_metadata = RegionMapMetadata::new(None, exclude_i);
36-
region_map_metadata.add_region(1, 0.0, 0.0, 50.0, 1.0);
37-
region_map_metadata.add_region(1, 0.0, 0.0, 10.0, 5.0);
38-
region_map_metadata.add_region(1, 0.0, 0.0, -10.0, -5.0);
39-
region_map_metadata.add_region(1, 0.0, 0.0, -50.0, -1.0);
40-
base.add_region_map("psu.region", region_map_metadata);
46+
47+
region_map_metadata.add_region(1, 0.0, 0.0, 10.0, max_supported_current);
48+
region_map_metadata.add_region(1, 0.0, 0.0, -10.0, -max_supported_current);
49+
50+
Self::add_1st_quadrant_curved_region(10.0, 50.0, 0.001, 0.0, &mut region_map_metadata); //First quadrant curve
51+
Self::add_3rd_quadrant_curved_region(-10.0, -50.0, -0.001, 0.0, &mut region_map_metadata); //Third quadrant curve
52+
53+
base.add_region_map("50 V", region_map_metadata); //Use source range to identify region map
4154

4255
base.add_overrange_scale(1.002);
4356

@@ -46,6 +59,44 @@ impl Mpsu50Metadata {
4659
// Initialize additional properties
4760
}
4861
}
62+
63+
fn add_1st_quadrant_curved_region(
64+
voltage_start: f64,
65+
voltage_max: f64,
66+
step: f64, // Use the step parameter to finely control the approximation
67+
current: f64, // Fixed current for the curve
68+
region_map_metadata: &mut RegionMapMetadata,
69+
) {
70+
// Add region maps iteratively as small rectangles to approximate the curve
71+
72+
let mut v1 = voltage_start;
73+
74+
while v1.abs() <= voltage_max.abs() {
75+
let v2 = v1 + step;
76+
let i2 = voltage_max / v2.abs();
77+
region_map_metadata.add_region(1, v1, current, v2, i2);
78+
v1 += step;
79+
}
80+
}
81+
82+
fn add_3rd_quadrant_curved_region(
83+
voltage_start: f64,
84+
voltage_max: f64,
85+
step: f64, // Use the step parameter to finely control the approximation
86+
current: f64, // Fixed current for the curve
87+
region_map_metadata: &mut RegionMapMetadata,
88+
) {
89+
// Add region maps iteratively as small rectangles to approximate the curve
90+
91+
let mut v1 = voltage_start;
92+
93+
while v1.abs() <= voltage_max.abs() {
94+
let v2 = v1 + step;
95+
let i2 = voltage_max / v2.abs();
96+
region_map_metadata.add_region(1, v2, i2, v1, current);
97+
v1 += step;
98+
}
99+
}
49100
}
50101

51102
impl Metadata for Mpsu50Metadata {

script-gen-manager/src/model/chan_data/default_channel.rs

Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -277,6 +277,43 @@ impl CommonChanAttributes {
277277
}
278278
}
279279

280+
pub fn evaluate_source_limits(
281+
&mut self,
282+
start_value: &ParameterFloat,
283+
stop_value: &ParameterFloat,
284+
) {
285+
if let Some((min, max)) = self.get_range_limits(&self.device.metadata, ":MODE") {
286+
if let Some(ref mut limiti) = self.source_limiti {
287+
limiti.value = Self::limit(limiti.value, min, max);
288+
}
289+
}
290+
291+
if let Some(region_map) =
292+
self.get_region_map(&self.device.metadata, &self.source_range.value)
293+
{
294+
//Do this only to the PSU for now
295+
let mut limit_value = start_value.value;
296+
if stop_value.value.abs() > limit_value.abs() {
297+
//Use the largest absolute value
298+
limit_value = stop_value.value;
299+
}
300+
if let Some(ref mut limiti) = self.source_limiti {
301+
let curr_limit = region_map.get_current_limit(limit_value);
302+
limiti.value =
303+
Self::limit(limiti.value, curr_limit.get_min(), curr_limit.get_max());
304+
println!("Evaluated current limit value is {:?}", limiti.value);
305+
}
306+
}
307+
308+
if let Some((min, max)) = self.get_range_limits(&self.device.metadata, "source.limitv") {
309+
if let Some(ref mut limitv) = self.source_limitv {
310+
limitv.value = Self::limit(limitv.value, min, max);
311+
}
312+
}
313+
314+
println!("Source range value is {:?}", self.source_range.value);
315+
}
316+
280317
fn limit(mut value: f64, min: f64, max: f64) -> f64 {
281318
if value >= min && value <= max {
282319
return value;

script-gen-manager/src/model/chan_data/start_stop_channel.rs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -65,6 +65,8 @@ impl StartStopChannel {
6565
//List evaluation
6666

6767
self.update_list(list_size);
68+
self.common_chan_attributes
69+
.evaluate_source_limits(&self.start, &self.stop);
6870
}
6971

7072
fn update_list(&mut self, list_size: usize) {

0 commit comments

Comments
 (0)