Add initial backend structure with models, utilities, and settings management
- Introduced .gitignore to exclude common Python artifacts and IDE files. - Added contour models for contour generation. - Implemented cryptographic utilities for data encryption and decryption. - Created CSV metadata model for handling wafer data. - Developed time-indexed data segment model. - Established local settings model for application configuration. - Added Z-wafer data models and parser for CSV file handling. - Implemented Marching Squares algorithm for contour generation.
This commit is contained in:
@@ -0,0 +1,93 @@
|
||||
import json
|
||||
import os
|
||||
from pathlib import Path
|
||||
|
||||
|
||||
# ===== Settings Persistence Model =====
|
||||
class LocalSettings:
|
||||
# ===== Defaults =====
|
||||
def __init__(self):
|
||||
self.chamber_id = ""
|
||||
self.reverse_z_wafer = False
|
||||
self.master = {} # Dict[str, str]
|
||||
self.wafer_data_size = {} # Dict[str, int]
|
||||
self.debug = False
|
||||
self.wafer_read_retries = 8
|
||||
# Timeout in msec for reading from the wafer (default 2 min)
|
||||
self.wafer_read_timeout = 120000
|
||||
self.wafer_detect_timeout = 5000
|
||||
self.split_threshold = 40.0
|
||||
|
||||
# ===== File Path Helpers =====
|
||||
@classmethod
|
||||
def _settings_path(cls, directory: str) -> Path:
|
||||
return Path(directory) / "settings.json"
|
||||
|
||||
# ===== Load/Save =====
|
||||
@classmethod
|
||||
def read_settings(cls, directory: str) -> "LocalSettings":
|
||||
"""Read settings from settings.json in the provided directory."""
|
||||
settings = cls()
|
||||
path = cls._settings_path(directory)
|
||||
|
||||
if not path.exists():
|
||||
return settings
|
||||
|
||||
try:
|
||||
with open(path, "r", encoding="utf-8") as f:
|
||||
data = json.load(f)
|
||||
for key, value in data.items():
|
||||
if hasattr(settings, key):
|
||||
setattr(settings, key, value)
|
||||
except Exception as e:
|
||||
print(f"Error reading setting file: {e}")
|
||||
|
||||
return settings
|
||||
|
||||
@classmethod
|
||||
def save_settings(cls, directory: str, settings: "LocalSettings") -> None:
|
||||
"""Save the current settings instance to settings.json."""
|
||||
path = cls._settings_path(directory)
|
||||
path.parent.mkdir(parents=True, exist_ok=True)
|
||||
data = settings.__dict__.copy()
|
||||
|
||||
try:
|
||||
with open(path, "w", encoding="utf-8") as f:
|
||||
json.dump(data, f, indent=4)
|
||||
except Exception as e:
|
||||
print(f"Error saving settings: {e}")
|
||||
|
||||
# ===== Master File Helpers =====
|
||||
@classmethod
|
||||
def get_master(cls, directory: str, wtype: str) -> str:
|
||||
"""Return the full path to a master file if it exists."""
|
||||
settings = cls.read_settings(directory)
|
||||
if wtype not in settings.master:
|
||||
return ""
|
||||
|
||||
file_path = Path(directory) / settings.master[wtype]
|
||||
if file_path.exists():
|
||||
return str(file_path)
|
||||
return ""
|
||||
|
||||
@classmethod
|
||||
def set_master(cls, directory: str, wtype: str, filename: str) -> None:
|
||||
"""Store a master filename for a wafer type and save settings."""
|
||||
settings = cls.read_settings(directory)
|
||||
settings.master[wtype] = os.path.basename(filename)
|
||||
cls.save_settings(directory, settings)
|
||||
|
||||
# ===== Wafer Sizing =====
|
||||
def get_wafer_data_size(self, wtype: str) -> int:
|
||||
"""Return the expected transfer size in bytes for a wafer type."""
|
||||
if not wtype:
|
||||
return 393216
|
||||
|
||||
if wtype in self.wafer_data_size:
|
||||
return self.wafer_data_size[wtype]
|
||||
|
||||
if wtype == "P":
|
||||
return 393216
|
||||
if wtype == "X":
|
||||
return 1310720
|
||||
return 393216
|
||||
Reference in New Issue
Block a user