diff --git a/vna_system/core/processors/base_processor.py b/vna_system/core/processors/base_processor.py index a68da91..6baa78d 100644 --- a/vna_system/core/processors/base_processor.py +++ b/vna_system/core/processors/base_processor.py @@ -562,6 +562,26 @@ class BaseProcessor: # --------------------------------------------------------------------- # # History Export/Import # --------------------------------------------------------------------- # + def _make_json_serializable(self, obj: Any) -> Any: + """ + Recursively convert non-serializable objects to JSON-compatible types. + + Handles Enums, custom objects, etc. + """ + from enum import Enum + + if isinstance(obj, Enum): + return obj.value + elif isinstance(obj, dict): + return {key: self._make_json_serializable(value) for key, value in obj.items()} + elif isinstance(obj, (list, tuple)): + return [self._make_json_serializable(item) for item in obj] + elif hasattr(obj, '__dict__'): + # Custom object - try to serialize its dict + return self._make_json_serializable(obj.__dict__) + else: + return obj + def export_history_data(self) -> list[dict[str, Any]]: """ Export sweep history in JSON-serializable format. @@ -578,13 +598,16 @@ class BaseProcessor: calibrated_data = entry["calibrated_data"] reference_data = entry.get("reference_data") + # Convert vna_config to fully serializable format + vna_config = self._make_json_serializable(entry.get("vna_config", {})) + exported.append({ "sweep_number": sweep_data.sweep_number if sweep_data else None, "timestamp": entry.get("timestamp"), "sweep_points": sweep_data.points if sweep_data else [], "calibrated_points": calibrated_data.points if calibrated_data else [], "reference_points": reference_data.points if reference_data else [], - "vna_config": entry.get("vna_config", {}), + "vna_config": vna_config, }) return exported