add all Norilsk calibs, add upd feautures
This commit is contained in:
@ -0,0 +1,18 @@
|
||||
{
|
||||
"preset": {
|
||||
"filename": "s11_start100_stop8800_points1000_bw1khz.bin",
|
||||
"mode": "s11",
|
||||
"start_freq": 100000000.0,
|
||||
"stop_freq": 8800000000.0,
|
||||
"points": 1000,
|
||||
"bandwidth": 1000.0
|
||||
},
|
||||
"calibration_name": "20251021_vna2_s11_plata",
|
||||
"standards": [
|
||||
"open",
|
||||
"short",
|
||||
"load"
|
||||
],
|
||||
"created_timestamp": "2025-10-21T15:01:22.834932",
|
||||
"is_complete": true
|
||||
}
|
||||
File diff suppressed because it is too large
Load Diff
@ -0,0 +1,16 @@
|
||||
{
|
||||
"preset": {
|
||||
"filename": "s11_start100_stop8800_points1000_bw1khz.bin",
|
||||
"mode": "s11",
|
||||
"start_freq": 100000000.0,
|
||||
"stop_freq": 8800000000.0,
|
||||
"points": 1000,
|
||||
"bandwidth": 1000.0
|
||||
},
|
||||
"calibration_name": "20251021_vna2_s11_plata",
|
||||
"standard": "load",
|
||||
"sweep_number": 57,
|
||||
"sweep_timestamp": 1761033678.751442,
|
||||
"created_timestamp": "2025-10-21T15:01:22.834573",
|
||||
"total_points": 1000
|
||||
}
|
||||
File diff suppressed because it is too large
Load Diff
@ -0,0 +1,16 @@
|
||||
{
|
||||
"preset": {
|
||||
"filename": "s11_start100_stop8800_points1000_bw1khz.bin",
|
||||
"mode": "s11",
|
||||
"start_freq": 100000000.0,
|
||||
"stop_freq": 8800000000.0,
|
||||
"points": 1000,
|
||||
"bandwidth": 1000.0
|
||||
},
|
||||
"calibration_name": "20251021_vna2_s11_plata",
|
||||
"standard": "open",
|
||||
"sweep_number": 55,
|
||||
"sweep_timestamp": 1761033490.9448445,
|
||||
"created_timestamp": "2025-10-21T15:01:22.828740",
|
||||
"total_points": 1000
|
||||
}
|
||||
File diff suppressed because it is too large
Load Diff
@ -0,0 +1,16 @@
|
||||
{
|
||||
"preset": {
|
||||
"filename": "s11_start100_stop8800_points1000_bw1khz.bin",
|
||||
"mode": "s11",
|
||||
"start_freq": 100000000.0,
|
||||
"stop_freq": 8800000000.0,
|
||||
"points": 1000,
|
||||
"bandwidth": 1000.0
|
||||
},
|
||||
"calibration_name": "20251021_vna2_s11_plata",
|
||||
"standard": "short",
|
||||
"sweep_number": 56,
|
||||
"sweep_timestamp": 1761033582.5801551,
|
||||
"created_timestamp": "2025-10-21T15:01:22.832002",
|
||||
"total_points": 1000
|
||||
}
|
||||
@ -0,0 +1,18 @@
|
||||
{
|
||||
"preset": {
|
||||
"filename": "s11_start100_stop8800_points1000_bw1khz.bin",
|
||||
"mode": "s11",
|
||||
"start_freq": 100000000.0,
|
||||
"stop_freq": 8800000000.0,
|
||||
"points": 1000,
|
||||
"bandwidth": 1000.0
|
||||
},
|
||||
"calibration_name": "20251022_Cabinet_Platyi_N2",
|
||||
"standards": [
|
||||
"open",
|
||||
"short",
|
||||
"load"
|
||||
],
|
||||
"created_timestamp": "2025-10-22T16:18:30.295003",
|
||||
"is_complete": true
|
||||
}
|
||||
File diff suppressed because it is too large
Load Diff
@ -0,0 +1,16 @@
|
||||
{
|
||||
"preset": {
|
||||
"filename": "s11_start100_stop8800_points1000_bw1khz.bin",
|
||||
"mode": "s11",
|
||||
"start_freq": 100000000.0,
|
||||
"stop_freq": 8800000000.0,
|
||||
"points": 1000,
|
||||
"bandwidth": 1000.0
|
||||
},
|
||||
"calibration_name": "20251022_Cabinet_Platyi_N2",
|
||||
"standard": "load",
|
||||
"sweep_number": 16,
|
||||
"sweep_timestamp": 1761124705.3246522,
|
||||
"created_timestamp": "2025-10-22T16:18:30.294665",
|
||||
"total_points": 1000
|
||||
}
|
||||
File diff suppressed because it is too large
Load Diff
@ -0,0 +1,16 @@
|
||||
{
|
||||
"preset": {
|
||||
"filename": "s11_start100_stop8800_points1000_bw1khz.bin",
|
||||
"mode": "s11",
|
||||
"start_freq": 100000000.0,
|
||||
"stop_freq": 8800000000.0,
|
||||
"points": 1000,
|
||||
"bandwidth": 1000.0
|
||||
},
|
||||
"calibration_name": "20251022_Cabinet_Platyi_N2",
|
||||
"standard": "open",
|
||||
"sweep_number": 14,
|
||||
"sweep_timestamp": 1761124345.5289564,
|
||||
"created_timestamp": "2025-10-22T16:18:30.288561",
|
||||
"total_points": 1000
|
||||
}
|
||||
File diff suppressed because it is too large
Load Diff
@ -0,0 +1,16 @@
|
||||
{
|
||||
"preset": {
|
||||
"filename": "s11_start100_stop8800_points1000_bw1khz.bin",
|
||||
"mode": "s11",
|
||||
"start_freq": 100000000.0,
|
||||
"stop_freq": 8800000000.0,
|
||||
"points": 1000,
|
||||
"bandwidth": 1000.0
|
||||
},
|
||||
"calibration_name": "20251022_Cabinet_Platyi_N2",
|
||||
"standard": "short",
|
||||
"sweep_number": 15,
|
||||
"sweep_timestamp": 1761124659.1153042,
|
||||
"created_timestamp": "2025-10-22T16:18:30.292961",
|
||||
"total_points": 1000
|
||||
}
|
||||
@ -0,0 +1,18 @@
|
||||
{
|
||||
"preset": {
|
||||
"filename": "s11_start100_stop8800_points1000_bw1khz.bin",
|
||||
"mode": "s11",
|
||||
"start_freq": 100000000.0,
|
||||
"stop_freq": 8800000000.0,
|
||||
"points": 1000,
|
||||
"bandwidth": 1000.0
|
||||
},
|
||||
"calibration_name": "20251023_cabinet_samples",
|
||||
"standards": [
|
||||
"open",
|
||||
"short",
|
||||
"load"
|
||||
],
|
||||
"created_timestamp": "2025-10-23T15:11:38.979279",
|
||||
"is_complete": true
|
||||
}
|
||||
File diff suppressed because it is too large
Load Diff
@ -0,0 +1,16 @@
|
||||
{
|
||||
"preset": {
|
||||
"filename": "s11_start100_stop8800_points1000_bw1khz.bin",
|
||||
"mode": "s11",
|
||||
"start_freq": 100000000.0,
|
||||
"stop_freq": 8800000000.0,
|
||||
"points": 1000,
|
||||
"bandwidth": 1000.0
|
||||
},
|
||||
"calibration_name": "20251023_cabinet_samples",
|
||||
"standard": "load",
|
||||
"sweep_number": 6,
|
||||
"sweep_timestamp": 1761207096.755639,
|
||||
"created_timestamp": "2025-10-23T15:11:38.978961",
|
||||
"total_points": 1000
|
||||
}
|
||||
File diff suppressed because it is too large
Load Diff
@ -0,0 +1,16 @@
|
||||
{
|
||||
"preset": {
|
||||
"filename": "s11_start100_stop8800_points1000_bw1khz.bin",
|
||||
"mode": "s11",
|
||||
"start_freq": 100000000.0,
|
||||
"stop_freq": 8800000000.0,
|
||||
"points": 1000,
|
||||
"bandwidth": 1000.0
|
||||
},
|
||||
"calibration_name": "20251023_cabinet_samples",
|
||||
"standard": "open",
|
||||
"sweep_number": 4,
|
||||
"sweep_timestamp": 1761206866.4641244,
|
||||
"created_timestamp": "2025-10-23T15:11:38.955500",
|
||||
"total_points": 1000
|
||||
}
|
||||
File diff suppressed because it is too large
Load Diff
@ -0,0 +1,16 @@
|
||||
{
|
||||
"preset": {
|
||||
"filename": "s11_start100_stop8800_points1000_bw1khz.bin",
|
||||
"mode": "s11",
|
||||
"start_freq": 100000000.0,
|
||||
"stop_freq": 8800000000.0,
|
||||
"points": 1000,
|
||||
"bandwidth": 1000.0
|
||||
},
|
||||
"calibration_name": "20251023_cabinet_samples",
|
||||
"standard": "short",
|
||||
"sweep_number": 5,
|
||||
"sweep_timestamp": 1761206957.058148,
|
||||
"created_timestamp": "2025-10-23T15:11:38.977151",
|
||||
"total_points": 1000
|
||||
}
|
||||
@ -0,0 +1,18 @@
|
||||
{
|
||||
"preset": {
|
||||
"filename": "s11_start100_stop8800_points1000_bw1khz.bin",
|
||||
"mode": "s11",
|
||||
"start_freq": 100000000.0,
|
||||
"stop_freq": 8800000000.0,
|
||||
"points": 1000,
|
||||
"bandwidth": 1000.0
|
||||
},
|
||||
"calibration_name": "20251024_N2_cabinet_platyi_noamp",
|
||||
"standards": [
|
||||
"open",
|
||||
"short",
|
||||
"load"
|
||||
],
|
||||
"created_timestamp": "2025-10-24T16:11:14.707119",
|
||||
"is_complete": true
|
||||
}
|
||||
File diff suppressed because it is too large
Load Diff
@ -0,0 +1,16 @@
|
||||
{
|
||||
"preset": {
|
||||
"filename": "s11_start100_stop8800_points1000_bw1khz.bin",
|
||||
"mode": "s11",
|
||||
"start_freq": 100000000.0,
|
||||
"stop_freq": 8800000000.0,
|
||||
"points": 1000,
|
||||
"bandwidth": 1000.0
|
||||
},
|
||||
"calibration_name": "20251024_N2_cabinet_platyi_noamp",
|
||||
"standard": "load",
|
||||
"sweep_number": 8,
|
||||
"sweep_timestamp": 1761297068.5551102,
|
||||
"created_timestamp": "2025-10-24T16:11:14.706824",
|
||||
"total_points": 1000
|
||||
}
|
||||
File diff suppressed because it is too large
Load Diff
@ -0,0 +1,16 @@
|
||||
{
|
||||
"preset": {
|
||||
"filename": "s11_start100_stop8800_points1000_bw1khz.bin",
|
||||
"mode": "s11",
|
||||
"start_freq": 100000000.0,
|
||||
"stop_freq": 8800000000.0,
|
||||
"points": 1000,
|
||||
"bandwidth": 1000.0
|
||||
},
|
||||
"calibration_name": "20251024_N2_cabinet_platyi_noamp",
|
||||
"standard": "open",
|
||||
"sweep_number": 6,
|
||||
"sweep_timestamp": 1761296919.9108818,
|
||||
"created_timestamp": "2025-10-24T16:11:14.687921",
|
||||
"total_points": 1000
|
||||
}
|
||||
File diff suppressed because it is too large
Load Diff
@ -0,0 +1,16 @@
|
||||
{
|
||||
"preset": {
|
||||
"filename": "s11_start100_stop8800_points1000_bw1khz.bin",
|
||||
"mode": "s11",
|
||||
"start_freq": 100000000.0,
|
||||
"stop_freq": 8800000000.0,
|
||||
"points": 1000,
|
||||
"bandwidth": 1000.0
|
||||
},
|
||||
"calibration_name": "20251024_N2_cabinet_platyi_noamp",
|
||||
"standard": "short",
|
||||
"sweep_number": 7,
|
||||
"sweep_timestamp": 1761296985.4298542,
|
||||
"created_timestamp": "2025-10-24T16:11:14.705201",
|
||||
"total_points": 1000
|
||||
}
|
||||
@ -0,0 +1,18 @@
|
||||
{
|
||||
"preset": {
|
||||
"filename": "s11_start100_stop8800_points1000_bw1khz.bin",
|
||||
"mode": "s11",
|
||||
"start_freq": 100000000.0,
|
||||
"stop_freq": 8800000000.0,
|
||||
"points": 1000,
|
||||
"bandwidth": 1000.0
|
||||
},
|
||||
"calibration_name": "20251031_SOL_N2_g&r_forkvp",
|
||||
"standards": [
|
||||
"open",
|
||||
"short",
|
||||
"load"
|
||||
],
|
||||
"created_timestamp": "2025-10-31T15:29:49.348949",
|
||||
"is_complete": true
|
||||
}
|
||||
File diff suppressed because it is too large
Load Diff
@ -0,0 +1,16 @@
|
||||
{
|
||||
"preset": {
|
||||
"filename": "s11_start100_stop8800_points1000_bw1khz.bin",
|
||||
"mode": "s11",
|
||||
"start_freq": 100000000.0,
|
||||
"stop_freq": 8800000000.0,
|
||||
"points": 1000,
|
||||
"bandwidth": 1000.0
|
||||
},
|
||||
"calibration_name": "20251031_SOL_N2_g&r_forkvp",
|
||||
"standard": "load",
|
||||
"sweep_number": 23,
|
||||
"sweep_timestamp": 1761913785.401429,
|
||||
"created_timestamp": "2025-10-31T15:29:49.346894",
|
||||
"total_points": 1000
|
||||
}
|
||||
File diff suppressed because it is too large
Load Diff
@ -0,0 +1,16 @@
|
||||
{
|
||||
"preset": {
|
||||
"filename": "s11_start100_stop8800_points1000_bw1khz.bin",
|
||||
"mode": "s11",
|
||||
"start_freq": 100000000.0,
|
||||
"stop_freq": 8800000000.0,
|
||||
"points": 1000,
|
||||
"bandwidth": 1000.0
|
||||
},
|
||||
"calibration_name": "20251031_SOL_N2_g&r_forkvp",
|
||||
"standard": "open",
|
||||
"sweep_number": 21,
|
||||
"sweep_timestamp": 1761913673.8630784,
|
||||
"created_timestamp": "2025-10-31T15:29:49.290677",
|
||||
"total_points": 1000
|
||||
}
|
||||
File diff suppressed because it is too large
Load Diff
@ -0,0 +1,16 @@
|
||||
{
|
||||
"preset": {
|
||||
"filename": "s11_start100_stop8800_points1000_bw1khz.bin",
|
||||
"mode": "s11",
|
||||
"start_freq": 100000000.0,
|
||||
"stop_freq": 8800000000.0,
|
||||
"points": 1000,
|
||||
"bandwidth": 1000.0
|
||||
},
|
||||
"calibration_name": "20251031_SOL_N2_g&r_forkvp",
|
||||
"standard": "short",
|
||||
"sweep_number": 22,
|
||||
"sweep_timestamp": 1761913724.010445,
|
||||
"created_timestamp": "2025-10-31T15:29:49.337144",
|
||||
"total_points": 1000
|
||||
}
|
||||
@ -0,0 +1,18 @@
|
||||
{
|
||||
"preset": {
|
||||
"filename": "s11_start100_stop8800_points1000_bw1khz.bin",
|
||||
"mode": "s11",
|
||||
"start_freq": 100000000.0,
|
||||
"stop_freq": 8800000000.0,
|
||||
"points": 1000,
|
||||
"bandwidth": 1000.0
|
||||
},
|
||||
"calibration_name": "241025_SOL_g&r_forkvp_N2",
|
||||
"standards": [
|
||||
"load",
|
||||
"short",
|
||||
"open"
|
||||
],
|
||||
"created_timestamp": "2025-10-24T12:11:24.607328",
|
||||
"is_complete": true
|
||||
}
|
||||
File diff suppressed because it is too large
Load Diff
@ -0,0 +1,16 @@
|
||||
{
|
||||
"preset": {
|
||||
"filename": "s11_start100_stop8800_points1000_bw1khz.bin",
|
||||
"mode": "s11",
|
||||
"start_freq": 100000000.0,
|
||||
"stop_freq": 8800000000.0,
|
||||
"points": 1000,
|
||||
"bandwidth": 1000.0
|
||||
},
|
||||
"calibration_name": "241025_SOL_g&r_forkvp_N2",
|
||||
"standard": "load",
|
||||
"sweep_number": 21,
|
||||
"sweep_timestamp": 1761282597.914453,
|
||||
"created_timestamp": "2025-10-24T12:11:24.590655",
|
||||
"total_points": 1000
|
||||
}
|
||||
File diff suppressed because it is too large
Load Diff
@ -0,0 +1,16 @@
|
||||
{
|
||||
"preset": {
|
||||
"filename": "s11_start100_stop8800_points1000_bw1khz.bin",
|
||||
"mode": "s11",
|
||||
"start_freq": 100000000.0,
|
||||
"stop_freq": 8800000000.0,
|
||||
"points": 1000,
|
||||
"bandwidth": 1000.0
|
||||
},
|
||||
"calibration_name": "241025_SOL_g&r_forkvp_N2",
|
||||
"standard": "open",
|
||||
"sweep_number": 23,
|
||||
"sweep_timestamp": 1761282662.8935268,
|
||||
"created_timestamp": "2025-10-24T12:11:24.606098",
|
||||
"total_points": 1000
|
||||
}
|
||||
File diff suppressed because it is too large
Load Diff
@ -0,0 +1,16 @@
|
||||
{
|
||||
"preset": {
|
||||
"filename": "s11_start100_stop8800_points1000_bw1khz.bin",
|
||||
"mode": "s11",
|
||||
"start_freq": 100000000.0,
|
||||
"stop_freq": 8800000000.0,
|
||||
"points": 1000,
|
||||
"bandwidth": 1000.0
|
||||
},
|
||||
"calibration_name": "241025_SOL_g&r_forkvp_N2",
|
||||
"standard": "short",
|
||||
"sweep_number": 22,
|
||||
"sweep_timestamp": 1761282628.7853029,
|
||||
"created_timestamp": "2025-10-24T12:11:24.599809",
|
||||
"total_points": 1000
|
||||
}
|
||||
@ -0,0 +1,18 @@
|
||||
{
|
||||
"preset": {
|
||||
"filename": "s11_start100_stop8800_points1000_bw1khz.bin",
|
||||
"mode": "s11",
|
||||
"start_freq": 100000000.0,
|
||||
"stop_freq": 8800000000.0,
|
||||
"points": 1000,
|
||||
"bandwidth": 1000.0
|
||||
},
|
||||
"calibration_name": "N2_SOL_grey&red_forkvp_231025",
|
||||
"standards": [
|
||||
"open",
|
||||
"short",
|
||||
"load"
|
||||
],
|
||||
"created_timestamp": "2025-10-23T10:58:13.181202",
|
||||
"is_complete": true
|
||||
}
|
||||
File diff suppressed because it is too large
Load Diff
@ -0,0 +1,16 @@
|
||||
{
|
||||
"preset": {
|
||||
"filename": "s11_start100_stop8800_points1000_bw1khz.bin",
|
||||
"mode": "s11",
|
||||
"start_freq": 100000000.0,
|
||||
"stop_freq": 8800000000.0,
|
||||
"points": 1000,
|
||||
"bandwidth": 1000.0
|
||||
},
|
||||
"calibration_name": "N2_SOL_grey&red_forkvp_231025",
|
||||
"standard": "load",
|
||||
"sweep_number": 23,
|
||||
"sweep_timestamp": 1761191858.9400437,
|
||||
"created_timestamp": "2025-10-23T10:58:13.180239",
|
||||
"total_points": 1000
|
||||
}
|
||||
File diff suppressed because it is too large
Load Diff
@ -0,0 +1,16 @@
|
||||
{
|
||||
"preset": {
|
||||
"filename": "s11_start100_stop8800_points1000_bw1khz.bin",
|
||||
"mode": "s11",
|
||||
"start_freq": 100000000.0,
|
||||
"stop_freq": 8800000000.0,
|
||||
"points": 1000,
|
||||
"bandwidth": 1000.0
|
||||
},
|
||||
"calibration_name": "N2_SOL_grey&red_forkvp_231025",
|
||||
"standard": "open",
|
||||
"sweep_number": 21,
|
||||
"sweep_timestamp": 1761191773.1479347,
|
||||
"created_timestamp": "2025-10-23T10:58:13.156746",
|
||||
"total_points": 1000
|
||||
}
|
||||
File diff suppressed because it is too large
Load Diff
@ -0,0 +1,16 @@
|
||||
{
|
||||
"preset": {
|
||||
"filename": "s11_start100_stop8800_points1000_bw1khz.bin",
|
||||
"mode": "s11",
|
||||
"start_freq": 100000000.0,
|
||||
"stop_freq": 8800000000.0,
|
||||
"points": 1000,
|
||||
"bandwidth": 1000.0
|
||||
},
|
||||
"calibration_name": "N2_SOL_grey&red_forkvp_231025",
|
||||
"standard": "short",
|
||||
"sweep_number": 22,
|
||||
"sweep_timestamp": 1761191820.2173865,
|
||||
"created_timestamp": "2025-10-23T10:58:13.175163",
|
||||
"total_points": 1000
|
||||
}
|
||||
@ -0,0 +1,18 @@
|
||||
{
|
||||
"preset": {
|
||||
"filename": "s11_start100_stop8800_points1000_bw1khz.bin",
|
||||
"mode": "s11",
|
||||
"start_freq": 100000000.0,
|
||||
"stop_freq": 8800000000.0,
|
||||
"points": 1000,
|
||||
"bandwidth": 1000.0
|
||||
},
|
||||
"calibration_name": "N2_grey_211025",
|
||||
"standards": [
|
||||
"open",
|
||||
"short",
|
||||
"load"
|
||||
],
|
||||
"created_timestamp": "2025-10-21T22:03:34.631095",
|
||||
"is_complete": true
|
||||
}
|
||||
File diff suppressed because it is too large
Load Diff
@ -0,0 +1,16 @@
|
||||
{
|
||||
"preset": {
|
||||
"filename": "s11_start100_stop8800_points1000_bw1khz.bin",
|
||||
"mode": "s11",
|
||||
"start_freq": 100000000.0,
|
||||
"stop_freq": 8800000000.0,
|
||||
"points": 1000,
|
||||
"bandwidth": 1000.0
|
||||
},
|
||||
"calibration_name": "N2_grey_211025",
|
||||
"standard": "load",
|
||||
"sweep_number": 6,
|
||||
"sweep_timestamp": 1761058968.8240635,
|
||||
"created_timestamp": "2025-10-21T22:03:34.630310",
|
||||
"total_points": 1000
|
||||
}
|
||||
File diff suppressed because it is too large
Load Diff
@ -0,0 +1,16 @@
|
||||
{
|
||||
"preset": {
|
||||
"filename": "s11_start100_stop8800_points1000_bw1khz.bin",
|
||||
"mode": "s11",
|
||||
"start_freq": 100000000.0,
|
||||
"stop_freq": 8800000000.0,
|
||||
"points": 1000,
|
||||
"bandwidth": 1000.0
|
||||
},
|
||||
"calibration_name": "N2_grey_211025",
|
||||
"standard": "open",
|
||||
"sweep_number": 4,
|
||||
"sweep_timestamp": 1761058894.0138934,
|
||||
"created_timestamp": "2025-10-21T22:03:34.622858",
|
||||
"total_points": 1000
|
||||
}
|
||||
File diff suppressed because it is too large
Load Diff
@ -0,0 +1,16 @@
|
||||
{
|
||||
"preset": {
|
||||
"filename": "s11_start100_stop8800_points1000_bw1khz.bin",
|
||||
"mode": "s11",
|
||||
"start_freq": 100000000.0,
|
||||
"stop_freq": 8800000000.0,
|
||||
"points": 1000,
|
||||
"bandwidth": 1000.0
|
||||
},
|
||||
"calibration_name": "N2_grey_211025",
|
||||
"standard": "short",
|
||||
"sweep_number": 5,
|
||||
"sweep_timestamp": 1761058927.2508612,
|
||||
"created_timestamp": "2025-10-21T22:03:34.627319",
|
||||
"total_points": 1000
|
||||
}
|
||||
@ -0,0 +1,18 @@
|
||||
{
|
||||
"preset": {
|
||||
"filename": "s11_start100_stop8800_points1000_bw1khz.bin",
|
||||
"mode": "s11",
|
||||
"start_freq": 100000000.0,
|
||||
"stop_freq": 8800000000.0,
|
||||
"points": 1000,
|
||||
"bandwidth": 1000.0
|
||||
},
|
||||
"calibration_name": "for_kvp_211025_grey&red",
|
||||
"standards": [
|
||||
"open",
|
||||
"short",
|
||||
"load"
|
||||
],
|
||||
"created_timestamp": "2025-10-21T08:58:43.086454",
|
||||
"is_complete": true
|
||||
}
|
||||
File diff suppressed because it is too large
Load Diff
@ -0,0 +1,16 @@
|
||||
{
|
||||
"preset": {
|
||||
"filename": "s11_start100_stop8800_points1000_bw1khz.bin",
|
||||
"mode": "s11",
|
||||
"start_freq": 100000000.0,
|
||||
"stop_freq": 8800000000.0,
|
||||
"points": 1000,
|
||||
"bandwidth": 1000.0
|
||||
},
|
||||
"calibration_name": "for_kvp_211025_grey&red",
|
||||
"standard": "load",
|
||||
"sweep_number": 10,
|
||||
"sweep_timestamp": 1761011885.4749713,
|
||||
"created_timestamp": "2025-10-21T08:58:43.085331",
|
||||
"total_points": 1000
|
||||
}
|
||||
File diff suppressed because it is too large
Load Diff
@ -0,0 +1,16 @@
|
||||
{
|
||||
"preset": {
|
||||
"filename": "s11_start100_stop8800_points1000_bw1khz.bin",
|
||||
"mode": "s11",
|
||||
"start_freq": 100000000.0,
|
||||
"stop_freq": 8800000000.0,
|
||||
"points": 1000,
|
||||
"bandwidth": 1000.0
|
||||
},
|
||||
"calibration_name": "for_kvp_211025_grey&red",
|
||||
"standard": "open",
|
||||
"sweep_number": 8,
|
||||
"sweep_timestamp": 1761011802.4032564,
|
||||
"created_timestamp": "2025-10-21T08:58:43.077201",
|
||||
"total_points": 1000
|
||||
}
|
||||
File diff suppressed because it is too large
Load Diff
@ -0,0 +1,16 @@
|
||||
{
|
||||
"preset": {
|
||||
"filename": "s11_start100_stop8800_points1000_bw1khz.bin",
|
||||
"mode": "s11",
|
||||
"start_freq": 100000000.0,
|
||||
"stop_freq": 8800000000.0,
|
||||
"points": 1000,
|
||||
"bandwidth": 1000.0
|
||||
},
|
||||
"calibration_name": "for_kvp_211025_grey&red",
|
||||
"standard": "short",
|
||||
"sweep_number": 9,
|
||||
"sweep_timestamp": 1761011841.287023,
|
||||
"created_timestamp": "2025-10-21T08:58:43.081495",
|
||||
"total_points": 1000
|
||||
}
|
||||
@ -0,0 +1,18 @@
|
||||
{
|
||||
"preset": {
|
||||
"filename": "s11_start100_stop8800_points1000_bw1khz.bin",
|
||||
"mode": "s11",
|
||||
"start_freq": 100000000.0,
|
||||
"stop_freq": 8800000000.0,
|
||||
"points": 1000,
|
||||
"bandwidth": 1000.0
|
||||
},
|
||||
"calibration_name": "for_kvp_grey&red_N2_221025",
|
||||
"standards": [
|
||||
"open",
|
||||
"short",
|
||||
"load"
|
||||
],
|
||||
"created_timestamp": "2025-10-22T11:12:29.520083",
|
||||
"is_complete": true
|
||||
}
|
||||
File diff suppressed because it is too large
Load Diff
@ -0,0 +1,16 @@
|
||||
{
|
||||
"preset": {
|
||||
"filename": "s11_start100_stop8800_points1000_bw1khz.bin",
|
||||
"mode": "s11",
|
||||
"start_freq": 100000000.0,
|
||||
"stop_freq": 8800000000.0,
|
||||
"points": 1000,
|
||||
"bandwidth": 1000.0
|
||||
},
|
||||
"calibration_name": "for_kvp_grey&red_N2_221025",
|
||||
"standard": "load",
|
||||
"sweep_number": 7,
|
||||
"sweep_timestamp": 1761106309.8736792,
|
||||
"created_timestamp": "2025-10-22T11:12:29.519011",
|
||||
"total_points": 1000
|
||||
}
|
||||
File diff suppressed because it is too large
Load Diff
@ -0,0 +1,16 @@
|
||||
{
|
||||
"preset": {
|
||||
"filename": "s11_start100_stop8800_points1000_bw1khz.bin",
|
||||
"mode": "s11",
|
||||
"start_freq": 100000000.0,
|
||||
"stop_freq": 8800000000.0,
|
||||
"points": 1000,
|
||||
"bandwidth": 1000.0
|
||||
},
|
||||
"calibration_name": "for_kvp_grey&red_N2_221025",
|
||||
"standard": "open",
|
||||
"sweep_number": 5,
|
||||
"sweep_timestamp": 1761106224.5574822,
|
||||
"created_timestamp": "2025-10-22T11:12:29.508112",
|
||||
"total_points": 1000
|
||||
}
|
||||
File diff suppressed because it is too large
Load Diff
@ -0,0 +1,16 @@
|
||||
{
|
||||
"preset": {
|
||||
"filename": "s11_start100_stop8800_points1000_bw1khz.bin",
|
||||
"mode": "s11",
|
||||
"start_freq": 100000000.0,
|
||||
"stop_freq": 8800000000.0,
|
||||
"points": 1000,
|
||||
"bandwidth": 1000.0
|
||||
},
|
||||
"calibration_name": "for_kvp_grey&red_N2_221025",
|
||||
"standard": "short",
|
||||
"sweep_number": 6,
|
||||
"sweep_timestamp": 1761106268.756612,
|
||||
"created_timestamp": "2025-10-22T11:12:29.513427",
|
||||
"total_points": 1000
|
||||
}
|
||||
@ -0,0 +1,16 @@
|
||||
{
|
||||
"preset": {
|
||||
"filename": "s21_start100_stop8800_points1000_bw1khz.bin",
|
||||
"mode": "s21",
|
||||
"start_freq": 100000000.0,
|
||||
"stop_freq": 8800000000.0,
|
||||
"points": 1000,
|
||||
"bandwidth": 1000.0
|
||||
},
|
||||
"calibration_name": "20251023_n2_451u_noamp_through",
|
||||
"standards": [
|
||||
"through"
|
||||
],
|
||||
"created_timestamp": "2025-10-23T09:25:12.520901",
|
||||
"is_complete": true
|
||||
}
|
||||
File diff suppressed because it is too large
Load Diff
@ -0,0 +1,16 @@
|
||||
{
|
||||
"preset": {
|
||||
"filename": "s21_start100_stop8800_points1000_bw1khz.bin",
|
||||
"mode": "s21",
|
||||
"start_freq": 100000000.0,
|
||||
"stop_freq": 8800000000.0,
|
||||
"points": 1000,
|
||||
"bandwidth": 1000.0
|
||||
},
|
||||
"calibration_name": "20251023_n2_451u_noamp_through",
|
||||
"standard": "through",
|
||||
"sweep_number": 16,
|
||||
"sweep_timestamp": 1761186276.904338,
|
||||
"created_timestamp": "2025-10-23T09:25:12.520239",
|
||||
"total_points": 1000
|
||||
}
|
||||
@ -7,10 +7,10 @@
|
||||
"points": 1000,
|
||||
"bandwidth": 1000.0
|
||||
},
|
||||
"calibration_name": "bambambum",
|
||||
"calibration_name": "T_N1_tair_451U_x2",
|
||||
"standards": [
|
||||
"through"
|
||||
],
|
||||
"created_timestamp": "2025-09-25T14:41:46.014320",
|
||||
"created_timestamp": "2025-10-19T19:38:31.093090",
|
||||
"is_complete": true
|
||||
}
|
||||
File diff suppressed because it is too large
Load Diff
@ -7,10 +7,10 @@
|
||||
"points": 1000,
|
||||
"bandwidth": 1000.0
|
||||
},
|
||||
"calibration_name": "bimBimPatapim",
|
||||
"calibration_name": "T_N1_tair_451U_x2",
|
||||
"standard": "through",
|
||||
"sweep_number": 1186,
|
||||
"sweep_timestamp": 1758725431.370608,
|
||||
"created_timestamp": "2025-09-24T17:50:35.610460",
|
||||
"sweep_number": 79,
|
||||
"sweep_timestamp": 1760877457.5906727,
|
||||
"created_timestamp": "2025-10-19T19:38:31.092429",
|
||||
"total_points": 1000
|
||||
}
|
||||
@ -0,0 +1,16 @@
|
||||
{
|
||||
"preset": {
|
||||
"filename": "s21_start100_stop8800_points1000_bw1khz.bin",
|
||||
"mode": "s21",
|
||||
"start_freq": 100000000.0,
|
||||
"stop_freq": 8800000000.0,
|
||||
"points": 1000,
|
||||
"bandwidth": 1000.0
|
||||
},
|
||||
"calibration_name": "T_N2_451U_x2_noamp_20251105",
|
||||
"standards": [
|
||||
"through"
|
||||
],
|
||||
"created_timestamp": "2025-11-05T20:50:07.441271",
|
||||
"is_complete": true
|
||||
}
|
||||
File diff suppressed because it is too large
Load Diff
@ -0,0 +1,16 @@
|
||||
{
|
||||
"preset": {
|
||||
"filename": "s21_start100_stop8800_points1000_bw1khz.bin",
|
||||
"mode": "s21",
|
||||
"start_freq": 100000000.0,
|
||||
"stop_freq": 8800000000.0,
|
||||
"points": 1000,
|
||||
"bandwidth": 1000.0
|
||||
},
|
||||
"calibration_name": "T_N2_451U_x2_noamp_20251105",
|
||||
"standard": "through",
|
||||
"sweep_number": 14,
|
||||
"sweep_timestamp": 1762365005.456789,
|
||||
"created_timestamp": "2025-11-05T20:50:07.440235",
|
||||
"total_points": 1000
|
||||
}
|
||||
@ -7,10 +7,10 @@
|
||||
"points": 1000,
|
||||
"bandwidth": 1000.0
|
||||
},
|
||||
"calibration_name": "bimBimPatapim",
|
||||
"calibration_name": "T_N2_noamp_451U_x2",
|
||||
"standards": [
|
||||
"through"
|
||||
],
|
||||
"created_timestamp": "2025-09-24T17:50:35.610853",
|
||||
"created_timestamp": "2025-10-21T14:32:41.701864",
|
||||
"is_complete": true
|
||||
}
|
||||
File diff suppressed because it is too large
Load Diff
@ -7,10 +7,10 @@
|
||||
"points": 1000,
|
||||
"bandwidth": 1000.0
|
||||
},
|
||||
"calibration_name": "bambambum",
|
||||
"calibration_name": "T_N2_noamp_451U_x2",
|
||||
"standard": "through",
|
||||
"sweep_number": 50,
|
||||
"sweep_timestamp": 1758800474.7658994,
|
||||
"created_timestamp": "2025-09-25T14:41:46.014170",
|
||||
"sweep_number": 45,
|
||||
"sweep_timestamp": 1761031914.1084657,
|
||||
"created_timestamp": "2025-10-21T14:32:41.687603",
|
||||
"total_points": 1000
|
||||
}
|
||||
@ -0,0 +1,16 @@
|
||||
{
|
||||
"preset": {
|
||||
"filename": "s21_start100_stop8800_points1000_bw1khz.bin",
|
||||
"mode": "s21",
|
||||
"start_freq": 100000000.0,
|
||||
"stop_freq": 8800000000.0,
|
||||
"points": 1000,
|
||||
"bandwidth": 1000.0
|
||||
},
|
||||
"calibration_name": "T_N2_tair_451U_x2_151025",
|
||||
"standards": [
|
||||
"through"
|
||||
],
|
||||
"created_timestamp": "2025-10-15T14:48:36.080061",
|
||||
"is_complete": true
|
||||
}
|
||||
File diff suppressed because it is too large
Load Diff
@ -0,0 +1,16 @@
|
||||
{
|
||||
"preset": {
|
||||
"filename": "s21_start100_stop8800_points1000_bw1khz.bin",
|
||||
"mode": "s21",
|
||||
"start_freq": 100000000.0,
|
||||
"stop_freq": 8800000000.0,
|
||||
"points": 1000,
|
||||
"bandwidth": 1000.0
|
||||
},
|
||||
"calibration_name": "T_N2_tair_451U_x2_151025",
|
||||
"standard": "through",
|
||||
"sweep_number": 15,
|
||||
"sweep_timestamp": 1760528906.2259266,
|
||||
"created_timestamp": "2025-10-15T14:48:36.078899",
|
||||
"total_points": 1000
|
||||
}
|
||||
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
@ -35,7 +35,7 @@ VNA_PID = 0x5740 # STM32 Virtual ComPort
|
||||
# -----------------------------------------------------------------------------
|
||||
# Simulator mode settings
|
||||
# -----------------------------------------------------------------------------
|
||||
USE_SIMULATOR = True # Set to True to use simulator instead of real device
|
||||
USE_SIMULATOR = False # Set to True to use simulator instead of real device
|
||||
SIMULATOR_SWEEP_FILE = BASE_DIR / "binary_input" / "sweep_example" / "example.json"
|
||||
SIMULATOR_NOISE_LEVEL = 100 # Standard deviation of Gaussian noise to add to real and imaginary parts
|
||||
|
||||
|
||||
@ -171,6 +171,133 @@ class BaseProcessor:
|
||||
self._sweep_history.clear()
|
||||
logger.debug("History cleared")
|
||||
|
||||
def append_history(self, history_data: list[dict[str, Any]]) -> ProcessedResult | None:
|
||||
"""
|
||||
Append sweep history from external source (e.g., loaded file) to existing history.
|
||||
|
||||
Parameters
|
||||
----------
|
||||
history_data:
|
||||
List of history entries in the format exported by export_history_data.
|
||||
|
||||
Returns
|
||||
-------
|
||||
ProcessedResult | None
|
||||
Result after appending history, or None if history is empty.
|
||||
|
||||
Notes
|
||||
-----
|
||||
- Only history is appended, processor config is NOT updated.
|
||||
- If total history exceeds max_history limit, oldest entries are dropped.
|
||||
"""
|
||||
if not history_data:
|
||||
logger.warning("Append history called with empty data")
|
||||
return None
|
||||
|
||||
from vna_system.core.acquisition.sweep_buffer import SweepData
|
||||
from vna_system.core.settings.preset_manager import VNAMode
|
||||
|
||||
with self._lock:
|
||||
initial_count = len(self._sweep_history)
|
||||
|
||||
# Convert imported data to internal format (same as import_history_data)
|
||||
for idx, entry in enumerate(history_data):
|
||||
sweep_points = entry.get("sweep_points", [])
|
||||
calibrated_points = entry.get("calibrated_points", [])
|
||||
reference_points = entry.get("reference_points", [])
|
||||
raw_reference_points = entry.get("raw_reference_points", [])
|
||||
|
||||
# Reconstruct SweepData objects
|
||||
sweep_data = SweepData(
|
||||
sweep_number=initial_count + idx,
|
||||
timestamp=entry.get("timestamp", 0.0),
|
||||
points=sweep_points,
|
||||
total_points=len(sweep_points)
|
||||
) if sweep_points else None
|
||||
|
||||
calibrated_data = SweepData(
|
||||
sweep_number=initial_count + idx,
|
||||
timestamp=entry.get("timestamp", 0.0),
|
||||
points=calibrated_points,
|
||||
total_points=len(calibrated_points)
|
||||
) if calibrated_points else None
|
||||
|
||||
reference_data = SweepData(
|
||||
sweep_number=initial_count + idx,
|
||||
timestamp=entry.get("timestamp", 0.0),
|
||||
points=reference_points,
|
||||
total_points=len(reference_points)
|
||||
) if reference_points else None
|
||||
|
||||
raw_reference_data = SweepData(
|
||||
sweep_number=initial_count + idx,
|
||||
timestamp=entry.get("timestamp", 0.0),
|
||||
points=raw_reference_points,
|
||||
total_points=len(raw_reference_points)
|
||||
) if raw_reference_points else None
|
||||
|
||||
# Reconstruct calibration standards
|
||||
calibration_standards = None
|
||||
cal_standards_data = entry.get("calibration_standards")
|
||||
if cal_standards_data:
|
||||
calibration_standards = {}
|
||||
for std_name, std_data in cal_standards_data.items():
|
||||
std_points = std_data.get("points", [])
|
||||
if std_points:
|
||||
calibration_standards[std_name] = SweepData(
|
||||
sweep_number=std_data.get("sweep_number", initial_count + idx),
|
||||
timestamp=std_data.get("timestamp", entry.get("timestamp", 0.0)),
|
||||
points=std_points,
|
||||
total_points=len(std_points)
|
||||
)
|
||||
|
||||
# Reconstruct reference info
|
||||
from vna_system.core.settings.reference_manager import ReferenceInfo
|
||||
reference_info = None
|
||||
ref_info_data = entry.get("reference_info")
|
||||
if ref_info_data and ref_info_data.get("name"):
|
||||
# Only create ReferenceInfo if we have required fields
|
||||
try:
|
||||
reference_info = ReferenceInfo(
|
||||
name=ref_info_data.get("name", ""),
|
||||
timestamp=datetime.fromtimestamp(ref_info_data.get("timestamp", 0.0)) if ref_info_data.get("timestamp") else datetime.now(),
|
||||
preset_filename=ref_info_data.get("preset_filename", ""),
|
||||
description=ref_info_data.get("description", ""),
|
||||
metadata=ref_info_data.get("metadata")
|
||||
)
|
||||
except Exception:
|
||||
# If ReferenceInfo creation fails, skip it
|
||||
reference_info = None
|
||||
|
||||
# Reconstruct VNA config
|
||||
vna_config = entry.get("vna_config", {})
|
||||
|
||||
# Append to history
|
||||
self._sweep_history.append({
|
||||
"sweep_data": sweep_data,
|
||||
"calibrated_data": calibrated_data,
|
||||
"vna_config": vna_config,
|
||||
"reference_data": reference_data,
|
||||
"reference_info": reference_info,
|
||||
"raw_reference_data": raw_reference_data,
|
||||
"calibration_standards": calibration_standards,
|
||||
"timestamp": entry.get("timestamp", datetime.now().timestamp()),
|
||||
})
|
||||
|
||||
self._trim_history()
|
||||
final_count = len(self._sweep_history)
|
||||
|
||||
logger.info(
|
||||
"History appended",
|
||||
processor_id=self.processor_id,
|
||||
added=len(history_data),
|
||||
initial_count=initial_count,
|
||||
final_count=final_count,
|
||||
dropped=initial_count + len(history_data) - final_count
|
||||
)
|
||||
|
||||
return self.recalculate()
|
||||
|
||||
def _trim_history(self) -> None:
|
||||
"""Internal: keep only the newest `_max_history` items."""
|
||||
if len(self._sweep_history) > self._max_history:
|
||||
@ -636,17 +763,29 @@ class BaseProcessor:
|
||||
"timestamp": getattr(std_data, "timestamp", None),
|
||||
}
|
||||
|
||||
# Export reference info with all fields
|
||||
ref_info_export = None
|
||||
if reference_info:
|
||||
ref_info_export = {
|
||||
"name": getattr(reference_info, "name", None),
|
||||
"timestamp": getattr(reference_info, "timestamp", datetime.now()).timestamp() if hasattr(reference_info, "timestamp") else None,
|
||||
"preset_filename": getattr(reference_info, "preset_filename", None),
|
||||
"description": getattr(reference_info, "description", None),
|
||||
"metadata": getattr(reference_info, "metadata", None),
|
||||
}
|
||||
|
||||
# Get timestamp safely
|
||||
entry_timestamp = entry.get("timestamp")
|
||||
timestamp_export = float(entry_timestamp) if entry_timestamp is not None else None
|
||||
|
||||
exported.append({
|
||||
"timestamp": float(entry.get("timestamp")) if entry.get("timestamp") is not None else None,
|
||||
"timestamp": timestamp_export,
|
||||
"sweep_points": self._points_to_list(getattr(sweep_data, "points", [])),
|
||||
"calibrated_points": self._points_to_list(getattr(calibrated_data, "points", [])),
|
||||
"reference_points": self._points_to_list(getattr(reference_data, "points", [])),
|
||||
"raw_reference_points": self._points_to_list(getattr(raw_reference_data, "points", [])),
|
||||
"calibration_standards": cal_standards_export,
|
||||
"reference_info": {
|
||||
"name": getattr(reference_info, "name", None),
|
||||
"description": getattr(reference_info, "description", None),
|
||||
} if reference_info else None,
|
||||
"reference_info": ref_info_export,
|
||||
"vna_config": self._snapshot_vna_config(entry.get("vna_config")),
|
||||
})
|
||||
|
||||
@ -671,6 +810,7 @@ class BaseProcessor:
|
||||
sweep_points = entry.get("sweep_points", [])
|
||||
calibrated_points = entry.get("calibrated_points", [])
|
||||
reference_points = entry.get("reference_points", [])
|
||||
raw_reference_points = entry.get("raw_reference_points", [])
|
||||
|
||||
# Reconstruct SweepData objects
|
||||
# Use sequential index as sweep_number since it's not stored
|
||||
@ -695,6 +835,46 @@ class BaseProcessor:
|
||||
total_points=len(reference_points)
|
||||
) if reference_points else None
|
||||
|
||||
raw_reference_data = SweepData(
|
||||
sweep_number=idx,
|
||||
timestamp=entry.get("timestamp", 0.0),
|
||||
points=raw_reference_points,
|
||||
total_points=len(raw_reference_points)
|
||||
) if raw_reference_points else None
|
||||
|
||||
# Reconstruct calibration standards
|
||||
calibration_standards = None
|
||||
cal_standards_data = entry.get("calibration_standards")
|
||||
if cal_standards_data:
|
||||
calibration_standards = {}
|
||||
for std_name, std_data in cal_standards_data.items():
|
||||
std_points = std_data.get("points", [])
|
||||
if std_points:
|
||||
calibration_standards[std_name] = SweepData(
|
||||
sweep_number=std_data.get("sweep_number", idx),
|
||||
timestamp=std_data.get("timestamp", entry.get("timestamp", 0.0)),
|
||||
points=std_points,
|
||||
total_points=len(std_points)
|
||||
)
|
||||
|
||||
# Reconstruct reference info
|
||||
from vna_system.core.settings.reference_manager import ReferenceInfo
|
||||
reference_info = None
|
||||
ref_info_data = entry.get("reference_info")
|
||||
if ref_info_data and ref_info_data.get("name"):
|
||||
# Only create ReferenceInfo if we have required fields
|
||||
try:
|
||||
reference_info = ReferenceInfo(
|
||||
name=ref_info_data.get("name", ""),
|
||||
timestamp=datetime.fromtimestamp(ref_info_data.get("timestamp", 0.0)) if ref_info_data.get("timestamp") else datetime.now(),
|
||||
preset_filename=ref_info_data.get("preset_filename", ""),
|
||||
description=ref_info_data.get("description", ""),
|
||||
metadata=ref_info_data.get("metadata")
|
||||
)
|
||||
except Exception:
|
||||
# If ReferenceInfo creation fails, skip it
|
||||
reference_info = None
|
||||
|
||||
# Restore VNAMode enum from string if needed
|
||||
vna_config = entry.get("vna_config", {})
|
||||
if isinstance(vna_config.get("mode"), str):
|
||||
@ -707,6 +887,9 @@ class BaseProcessor:
|
||||
"sweep_data": sweep_data,
|
||||
"calibrated_data": calibrated_data,
|
||||
"reference_data": reference_data,
|
||||
"raw_reference_data": raw_reference_data,
|
||||
"reference_info": reference_info,
|
||||
"calibration_standards": calibration_standards,
|
||||
"vna_config": vna_config,
|
||||
"timestamp": entry.get("timestamp"),
|
||||
})
|
||||
|
||||
@ -1,11 +1,11 @@
|
||||
{
|
||||
"open_air": false,
|
||||
"axis": "phase",
|
||||
"cut": 0.279,
|
||||
"max": 4.0,
|
||||
"gain": 0.5,
|
||||
"start_freq": 100.0,
|
||||
"stop_freq": 8230.0,
|
||||
"open_air": true,
|
||||
"axis": "abs",
|
||||
"cut": 0.244,
|
||||
"max": 1.0,
|
||||
"gain": 1.0,
|
||||
"start_freq": 600.0,
|
||||
"stop_freq": 6080.0,
|
||||
"clear_history": false,
|
||||
"data_limit": 500
|
||||
}
|
||||
@ -3,6 +3,6 @@
|
||||
"y_max": 40,
|
||||
"autoscale": true,
|
||||
"show_magnitude": true,
|
||||
"show_phase": false,
|
||||
"open_air": true
|
||||
"show_phase": true,
|
||||
"open_air": false
|
||||
}
|
||||
@ -144,6 +144,51 @@ class BScanProcessor(BaseProcessor):
|
||||
self._plot_history.clear()
|
||||
logger.info("Plot and sweep history cleared completely", processor_id=self.processor_id)
|
||||
|
||||
def delete_column(self, column_index: int) -> bool:
|
||||
"""
|
||||
Delete a specific column (sweep) from the plot history.
|
||||
|
||||
Parameters
|
||||
----------
|
||||
column_index : int
|
||||
The 1-based column index to delete (matching the sweep number displayed to the user).
|
||||
|
||||
Returns
|
||||
-------
|
||||
bool
|
||||
True if deletion was successful, False otherwise.
|
||||
"""
|
||||
try:
|
||||
with self._lock:
|
||||
# Convert 1-based index to 0-based
|
||||
array_index = column_index - 1
|
||||
|
||||
if array_index < 0 or array_index >= len(self._plot_history):
|
||||
logger.warning(
|
||||
"Invalid column index for deletion",
|
||||
column_index=column_index,
|
||||
history_length=len(self._plot_history)
|
||||
)
|
||||
return False
|
||||
|
||||
# Delete from plot history
|
||||
del self._plot_history[array_index]
|
||||
|
||||
# Also delete from sweep history if indices match
|
||||
if array_index < len(self._sweep_history):
|
||||
del self._sweep_history[array_index]
|
||||
|
||||
logger.info(
|
||||
"Column deleted successfully",
|
||||
column_index=column_index,
|
||||
remaining_columns=len(self._plot_history)
|
||||
)
|
||||
return True
|
||||
|
||||
except Exception as exc:
|
||||
logger.error("Column deletion failed", error=repr(exc), column_index=column_index)
|
||||
return False
|
||||
|
||||
# -------------------------------------------------------------------------
|
||||
# Processing
|
||||
# -------------------------------------------------------------------------
|
||||
|
||||
@ -206,6 +206,47 @@ class ProcessorManager:
|
||||
logger.error("History load error", processor_id=processor_id, error=repr(exc))
|
||||
raise
|
||||
|
||||
def append_processor_history(self, processor_id: str, history_data: list[dict[str, Any]]) -> ProcessedResult | None:
|
||||
"""
|
||||
Append sweep history to existing processor history from JSON data and recalculate.
|
||||
|
||||
Does NOT update processor configuration - only appends history.
|
||||
|
||||
Parameters
|
||||
----------
|
||||
processor_id : str
|
||||
The processor to append history to.
|
||||
history_data : list[dict]
|
||||
History records in the format exported by export_history_data.
|
||||
|
||||
Returns
|
||||
-------
|
||||
ProcessedResult | None
|
||||
The result of recalculation after appending history.
|
||||
"""
|
||||
processor = self.get_processor(processor_id)
|
||||
if not processor:
|
||||
raise ValueError(f"Processor {processor_id} not found")
|
||||
|
||||
try:
|
||||
result = processor.append_history(history_data)
|
||||
|
||||
if result:
|
||||
with self._lock:
|
||||
callbacks = list(self._result_callbacks)
|
||||
for cb in callbacks:
|
||||
try:
|
||||
cb(processor_id, result)
|
||||
except Exception as exc: # noqa: BLE001
|
||||
logger.error("Result callback failed", processor_id=processor_id, error=repr(exc))
|
||||
|
||||
logger.info("History appended and recalculated", processor_id=processor_id, records=len(history_data))
|
||||
return result
|
||||
|
||||
except Exception as exc: # noqa: BLE001
|
||||
logger.error("History append error", processor_id=processor_id, error=repr(exc))
|
||||
raise
|
||||
|
||||
def build_processor_state(self, processor_id: str) -> dict[str, Any]:
|
||||
"""Return a JSON-ready snapshot of processor state and current result."""
|
||||
processor = self.get_processor(processor_id)
|
||||
|
||||
@ -104,6 +104,10 @@ class ProcessorWebSocketHandler:
|
||||
await self._handle_load_history(websocket, message)
|
||||
elif mtype == "get_processor_state":
|
||||
await self._handle_get_processor_state(websocket, message)
|
||||
elif mtype == "delete_column":
|
||||
await self._handle_delete_column(websocket, message)
|
||||
elif mtype == "append_history":
|
||||
await self._handle_append_history(websocket, message)
|
||||
else:
|
||||
await self._send_error(websocket, f"Неизвестный тип сообщения: {mtype!r}")
|
||||
except json.JSONDecodeError as json_error:
|
||||
@ -202,6 +206,33 @@ class ProcessorWebSocketHandler:
|
||||
logger.error("History load failed", processor_id=processor_id, error=repr(exc))
|
||||
await self._send_error(websocket, f"Загрузка истории не удалась: {exc}")
|
||||
|
||||
async def _handle_append_history(self, websocket: WebSocket, message: dict[str, Any]) -> None:
|
||||
"""
|
||||
Append sweep history from JSON data to existing processor history and recalculate.
|
||||
|
||||
Does NOT update processor configuration - only appends history.
|
||||
"""
|
||||
processor_id = message.get("processor_id")
|
||||
history_data = message.get("history_data")
|
||||
|
||||
if not processor_id:
|
||||
await self._send_error(websocket, "Требуется processor_id")
|
||||
return
|
||||
|
||||
if not history_data or not isinstance(history_data, list):
|
||||
await self._send_error(websocket, "Требуется history_data (список)")
|
||||
return
|
||||
|
||||
try:
|
||||
result = self.processor_manager.append_processor_history(processor_id, history_data)
|
||||
if result:
|
||||
await websocket.send_text(json.dumps(self._result_to_message(processor_id, result)))
|
||||
else:
|
||||
await self._send_error(websocket, f"Нет результата от процессора {processor_id} после дополнения истории")
|
||||
except Exception as exc: # noqa: BLE001
|
||||
logger.error("History append failed", processor_id=processor_id, error=repr(exc))
|
||||
await self._send_error(websocket, f"Дополнение истории не удалось: {exc}")
|
||||
|
||||
async def _handle_get_processor_state(self, websocket: WebSocket, message: dict[str, Any]) -> None:
|
||||
"""
|
||||
Fetch complete processor state including sweep history and current data.
|
||||
@ -222,6 +253,58 @@ class ProcessorWebSocketHandler:
|
||||
logger.error("Error getting processor state", processor_id=processor_id, error=repr(exc))
|
||||
await self._send_error(websocket, f"Ошибка получения состояния процессора: {exc}")
|
||||
|
||||
async def _handle_delete_column(self, websocket: WebSocket, message: dict[str, Any]) -> None:
|
||||
"""
|
||||
Delete a specific column (sweep) from the bscan processor plot history.
|
||||
"""
|
||||
processor_id = message.get("processor_id")
|
||||
column_index = message.get("column_index")
|
||||
|
||||
if not processor_id:
|
||||
await self._send_error(websocket, "Требуется processor_id")
|
||||
return
|
||||
|
||||
if column_index is None or not isinstance(column_index, int):
|
||||
await self._send_error(websocket, "Требуется column_index (целое число)")
|
||||
return
|
||||
|
||||
try:
|
||||
processor = self.processor_manager.get_processor(processor_id)
|
||||
if processor is None:
|
||||
await self._send_error(websocket, f"Процессор {processor_id} не найден")
|
||||
return
|
||||
|
||||
# Check if processor has delete_column method (only BScanProcessor)
|
||||
if not hasattr(processor, "delete_column"):
|
||||
await self._send_error(
|
||||
websocket,
|
||||
f"Процессор {processor_id} не поддерживает удаление столбцов"
|
||||
)
|
||||
return
|
||||
|
||||
# Execute deletion
|
||||
success = processor.delete_column(column_index)
|
||||
|
||||
if not success:
|
||||
await self._send_error(
|
||||
websocket,
|
||||
f"Не удалось удалить столбец {column_index}"
|
||||
)
|
||||
return
|
||||
|
||||
# Recalculate and send updated result to all clients
|
||||
result = processor.recalculate()
|
||||
if result:
|
||||
# Broadcast to all connected clients
|
||||
message_str = json.dumps(self._result_to_message(processor_id, result))
|
||||
await self._send_to_connections(message_str)
|
||||
else:
|
||||
await self._send_error(websocket, "Пересчёт после удаления не удался")
|
||||
|
||||
except Exception as exc: # noqa: BLE001
|
||||
logger.error("Column deletion failed", processor_id=processor_id, error=repr(exc))
|
||||
await self._send_error(websocket, f"Удаление столбца не удалось: {exc}")
|
||||
|
||||
def _result_to_message(self, processor_id: str, result: ProcessedResult) -> dict[str, Any]:
|
||||
"""
|
||||
Convert a `ProcessedResult` into a lightweight JSON-serializable message for broadcasting.
|
||||
|
||||
@ -1,11 +1,11 @@
|
||||
{
|
||||
"name": "qweqwe",
|
||||
"timestamp": "2025-10-16T19:41:41.209674",
|
||||
"name": "20.10.25_point1",
|
||||
"timestamp": "2025-10-20T11:12:35.907329",
|
||||
"preset_filename": "s21_start100_stop8800_points1000_bw1khz.bin",
|
||||
"description": "qweqwqwe",
|
||||
"description": "",
|
||||
"metadata": {
|
||||
"calibration": {
|
||||
"calibration_name": "bambambum",
|
||||
"calibration_name": "T_N1_tair_451U_x2",
|
||||
"preset_filename": "s21_start100_stop8800_points1000_bw1khz.bin"
|
||||
}
|
||||
}
|
||||
File diff suppressed because it is too large
Load Diff
@ -0,0 +1,12 @@
|
||||
{
|
||||
"name": "231025_N2_noamp_blue",
|
||||
"timestamp": "2025-10-23T11:40:40.463989",
|
||||
"preset_filename": "s21_start100_stop8800_points1000_bw1khz.bin",
|
||||
"description": "",
|
||||
"metadata": {
|
||||
"calibration": {
|
||||
"calibration_name": "20251023_n2_451u_noamp_through",
|
||||
"preset_filename": "s21_start100_stop8800_points1000_bw1khz.bin"
|
||||
}
|
||||
}
|
||||
}
|
||||
File diff suppressed because it is too large
Load Diff
@ -0,0 +1,12 @@
|
||||
{
|
||||
"name": "241025_N2_noamp_blue",
|
||||
"timestamp": "2025-10-24T12:42:24.263579",
|
||||
"preset_filename": "s21_start100_stop8800_points1000_bw1khz.bin",
|
||||
"description": "",
|
||||
"metadata": {
|
||||
"calibration": {
|
||||
"calibration_name": "20251023_n2_451u_noamp_through",
|
||||
"preset_filename": "s21_start100_stop8800_points1000_bw1khz.bin"
|
||||
}
|
||||
}
|
||||
}
|
||||
File diff suppressed because it is too large
Load Diff
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user