Remove deprecated files and scripts to streamline the codebase
- Deleted unused API test files, RTSP diagnostic scripts, and development utility scripts to reduce clutter. - Removed outdated database schema and modularization proposal documents to maintain focus on current architecture. - Cleaned up configuration files and logging scripts that are no longer in use, enhancing project maintainability.
This commit is contained in:
@@ -17,7 +17,7 @@
|
||||
},
|
||||
"system": {
|
||||
"camera_check_interval_seconds": 2,
|
||||
"log_level": "DEBUG",
|
||||
"log_level": "WARNING",
|
||||
"log_file": "usda_vision_system.log",
|
||||
"api_host": "0.0.0.0",
|
||||
"api_port": 8000,
|
||||
|
||||
@@ -123,7 +123,7 @@ class APIServer:
|
||||
|
||||
def _setup_routes(self):
|
||||
"""Setup API routes"""
|
||||
|
||||
|
||||
# Register routes from modules
|
||||
register_system_routes(
|
||||
app=self.app,
|
||||
@@ -299,7 +299,24 @@ class APIServer:
|
||||
self._event_loop = asyncio.new_event_loop()
|
||||
asyncio.set_event_loop(self._event_loop)
|
||||
|
||||
uvicorn.run(self.app, host=self.config.system.api_host, port=self.config.system.api_port, log_level="info")
|
||||
# Map our log level to uvicorn's log level
|
||||
uvicorn_log_level_map = {
|
||||
"DEBUG": "debug",
|
||||
"INFO": "info",
|
||||
"WARNING": "warning",
|
||||
"ERROR": "error",
|
||||
"CRITICAL": "critical"
|
||||
}
|
||||
config_log_level = self.config.system.log_level.upper()
|
||||
uvicorn_log_level = uvicorn_log_level_map.get(config_log_level, "warning")
|
||||
|
||||
uvicorn.run(
|
||||
self.app,
|
||||
host=self.config.system.api_host,
|
||||
port=self.config.system.api_port,
|
||||
log_level=uvicorn_log_level,
|
||||
access_log=False # Disable access logs (GET, POST, etc.) to reduce noise
|
||||
)
|
||||
except Exception as e:
|
||||
self.logger.error(f"Error running API server: {e}")
|
||||
finally:
|
||||
|
||||
@@ -186,34 +186,48 @@ class CameraMonitor:
|
||||
# Ensure SDK is initialized
|
||||
ensure_sdk_initialized()
|
||||
|
||||
self.logger.info(f"Attempting to initialize camera {camera_name} for availability test...")
|
||||
|
||||
# Suppress output to avoid MVCAMAPI error messages during camera testing
|
||||
with suppress_camera_errors():
|
||||
hCamera = mvsdk.CameraInit(device_info, -1, -1)
|
||||
hCamera = None
|
||||
try:
|
||||
with suppress_camera_errors():
|
||||
hCamera = mvsdk.CameraInit(device_info, -1, -1)
|
||||
self.logger.info(f"Camera {camera_name} initialized successfully, starting test capture...")
|
||||
except mvsdk.CameraException as init_e:
|
||||
self.logger.warning(f"CameraInit failed for {camera_name}: {init_e.message} (error_code: {init_e.error_code})")
|
||||
return "error", f"Camera initialization failed: {init_e.message}", self._get_device_info_dict(device_info)
|
||||
|
||||
# Quick test - try to get one frame
|
||||
try:
|
||||
mvsdk.CameraSetTriggerMode(hCamera, 0)
|
||||
mvsdk.CameraPlay(hCamera)
|
||||
|
||||
self.logger.info(f"Camera {camera_name} test: Attempting to capture frame with {CAMERA_TEST_CAPTURE_TIMEOUT}ms timeout...")
|
||||
# Try to capture with short timeout
|
||||
pRawData, FrameHead = mvsdk.CameraGetImageBuffer(hCamera, CAMERA_TEST_CAPTURE_TIMEOUT)
|
||||
mvsdk.CameraReleaseImageBuffer(hCamera, pRawData)
|
||||
|
||||
# Success - camera is available
|
||||
mvsdk.CameraUnInit(hCamera)
|
||||
self.logger.info(f"Camera {camera_name} test successful - camera is available")
|
||||
return "available", "Camera test successful", self._get_device_info_dict(device_info)
|
||||
|
||||
except mvsdk.CameraException as e:
|
||||
mvsdk.CameraUnInit(hCamera)
|
||||
if e.error_code == mvsdk.CAMERA_STATUS_TIME_OUT:
|
||||
except mvsdk.CameraException as capture_e:
|
||||
if hCamera:
|
||||
mvsdk.CameraUnInit(hCamera)
|
||||
self.logger.warning(f"Camera {camera_name} capture test failed: {capture_e.message} (error_code: {capture_e.error_code})")
|
||||
if capture_e.error_code == mvsdk.CAMERA_STATUS_TIME_OUT:
|
||||
return "available", "Camera available but slow response", self._get_device_info_dict(device_info)
|
||||
else:
|
||||
return "error", f"Camera test failed: {e.message}", self._get_device_info_dict(device_info)
|
||||
return "error", f"Camera test failed: {capture_e.message}", self._get_device_info_dict(device_info)
|
||||
|
||||
except mvsdk.CameraException as e:
|
||||
return "error", f"Camera initialization failed: {e.message}", self._get_device_info_dict(device_info)
|
||||
self.logger.error(f"CameraException during initialization test for {camera_name}: {e.message} (error_code: {e.error_code})")
|
||||
return "error", f"Camera initialization failed: {e.message}", self._get_device_info_dict(device_info) if device_info else None
|
||||
|
||||
except Exception as e:
|
||||
self.logger.error(f"Unexpected exception during camera check for {camera_name}: {e}", exc_info=True)
|
||||
return "error", f"Camera check failed: {str(e)}", None
|
||||
|
||||
def _get_device_info_dict(self, device_info) -> Dict[str, Any]:
|
||||
|
||||
@@ -96,7 +96,7 @@ class SystemConfig:
|
||||
"""System-wide configuration"""
|
||||
|
||||
camera_check_interval_seconds: int = 2
|
||||
log_level: str = "INFO"
|
||||
log_level: str = "WARNING"
|
||||
log_file: str = "usda_vision_system.log"
|
||||
api_host: str = "0.0.0.0"
|
||||
api_port: int = 8000
|
||||
|
||||
@@ -112,23 +112,32 @@ class USDAVisionLogger:
|
||||
def _setup_component_loggers(self) -> None:
|
||||
"""Setup specific log levels for different components"""
|
||||
|
||||
# MQTT client - can be verbose
|
||||
# MQTT client - reduce INFO logs
|
||||
mqtt_logger = logging.getLogger('usda_vision_system.mqtt')
|
||||
if self.log_level == 'DEBUG':
|
||||
mqtt_logger.setLevel(logging.DEBUG)
|
||||
else:
|
||||
elif self.log_level == 'INFO':
|
||||
mqtt_logger.setLevel(logging.INFO)
|
||||
else:
|
||||
mqtt_logger.setLevel(logging.WARNING)
|
||||
|
||||
# Camera components - important for debugging
|
||||
# Camera components - reduce INFO logs, keep WARNING and above
|
||||
camera_logger = logging.getLogger('usda_vision_system.camera')
|
||||
camera_logger.setLevel(logging.INFO)
|
||||
if self.log_level == 'DEBUG':
|
||||
camera_logger.setLevel(logging.DEBUG)
|
||||
elif self.log_level == 'INFO':
|
||||
camera_logger.setLevel(logging.INFO)
|
||||
else:
|
||||
camera_logger.setLevel(logging.WARNING)
|
||||
|
||||
# API server - can be noisy
|
||||
# API server - reduce INFO noise
|
||||
api_logger = logging.getLogger('usda_vision_system.api')
|
||||
if self.log_level == 'DEBUG':
|
||||
api_logger.setLevel(logging.DEBUG)
|
||||
else:
|
||||
elif self.log_level == 'INFO':
|
||||
api_logger.setLevel(logging.INFO)
|
||||
else:
|
||||
api_logger.setLevel(logging.WARNING)
|
||||
|
||||
# Uvicorn - reduce noise unless debugging
|
||||
uvicorn_logger = logging.getLogger('uvicorn')
|
||||
|
||||
@@ -45,8 +45,21 @@ class StandaloneAutoRecorder:
|
||||
|
||||
# Setup logging (only if not already configured)
|
||||
if not logging.getLogger().handlers:
|
||||
logging.basicConfig(level=logging.INFO, format="%(asctime)s - %(name)s - %(levelname)s - %(message)s", handlers=[logging.FileHandler("standalone_auto_recorder.log"), logging.StreamHandler()])
|
||||
# Use WARNING level by default to reduce INFO log noise
|
||||
log_level = getattr(self.config.system, 'log_level', 'WARNING')
|
||||
log_level_num = getattr(logging, log_level.upper(), logging.WARNING)
|
||||
logging.basicConfig(
|
||||
level=log_level_num,
|
||||
format="%(asctime)s - %(name)s - %(levelname)s - %(message)s",
|
||||
handlers=[
|
||||
logging.FileHandler("standalone_auto_recorder.log"),
|
||||
logging.StreamHandler()
|
||||
]
|
||||
)
|
||||
self.logger = logging.getLogger(__name__)
|
||||
# Ensure this logger respects the configured log level
|
||||
if hasattr(self.config, 'system') and hasattr(self.config.system, 'log_level'):
|
||||
self.logger.setLevel(getattr(logging, self.config.system.log_level.upper(), logging.WARNING))
|
||||
|
||||
# Initialize components
|
||||
self.state_manager = StateManager()
|
||||
@@ -59,6 +72,9 @@ class StandaloneAutoRecorder:
|
||||
self.camera_recorders: Dict[str, CameraRecorder] = {}
|
||||
self.active_recordings: Dict[str, str] = {} # camera_name -> filename
|
||||
|
||||
# Camera device cache
|
||||
self._device_list: Optional[list] = None
|
||||
|
||||
# Machine to camera mapping
|
||||
self.machine_camera_map = self._build_machine_camera_map()
|
||||
|
||||
@@ -257,7 +273,7 @@ class StandaloneAutoRecorder:
|
||||
return None
|
||||
|
||||
def _find_camera_device(self, camera_name: str):
|
||||
"""Simplified camera device discovery"""
|
||||
"""Find camera device by matching serial number or using index mapping"""
|
||||
try:
|
||||
# Import camera SDK
|
||||
import sys
|
||||
@@ -266,23 +282,73 @@ class StandaloneAutoRecorder:
|
||||
sys.path.append(os.path.join(os.path.dirname(__file__), "..", "..", "camera_sdk"))
|
||||
import mvsdk
|
||||
|
||||
# Initialize SDK
|
||||
mvsdk.CameraSdkInit(1)
|
||||
# Initialize SDK (only if not already initialized)
|
||||
try:
|
||||
mvsdk.CameraSdkInit(1)
|
||||
except:
|
||||
pass # SDK may already be initialized
|
||||
|
||||
# Enumerate cameras
|
||||
device_list = mvsdk.CameraEnumerateDevice()
|
||||
|
||||
# For now, map by index (camera1 = index 0, camera2 = index 1)
|
||||
camera_index = int(camera_name.replace("camera", "")) - 1
|
||||
|
||||
if 0 <= camera_index < len(device_list):
|
||||
return device_list[camera_index]
|
||||
# Cache device list to avoid re-enumerating
|
||||
if self._device_list is None:
|
||||
device_list = mvsdk.CameraEnumerateDevice()
|
||||
self._device_list = device_list
|
||||
self.logger.info(f"Enumerated {len(device_list)} camera device(s)")
|
||||
else:
|
||||
self.logger.error(f"Camera index {camera_index} not found (total: {len(device_list)})")
|
||||
device_list = self._device_list
|
||||
|
||||
if len(device_list) == 0:
|
||||
self.logger.error("No cameras detected")
|
||||
return None
|
||||
|
||||
# Find camera config to get serial number or device_index if available
|
||||
camera_config = None
|
||||
for config in self.config.cameras:
|
||||
if config.name == camera_name:
|
||||
camera_config = config
|
||||
break
|
||||
|
||||
# Try to match by serial number if available in device info
|
||||
if camera_config:
|
||||
# Check if config has device_index specified
|
||||
device_index = getattr(camera_config, 'device_index', None)
|
||||
if device_index is not None and 0 <= device_index < len(device_list):
|
||||
self.logger.info(f"Using device_index {device_index} for {camera_name}")
|
||||
return device_list[device_index]
|
||||
|
||||
# Try matching by serial number from camera config if available
|
||||
config_serial = getattr(camera_config, 'serial_number', None)
|
||||
if config_serial:
|
||||
for i, dev_info in enumerate(device_list):
|
||||
try:
|
||||
dev_serial = getattr(dev_info, 'acSn', None) or getattr(dev_info, 'GetSn', lambda: None)()
|
||||
if dev_serial and str(dev_serial) == str(config_serial):
|
||||
self.logger.info(f"Matched {camera_name} to device {i} by serial number: {dev_serial}")
|
||||
return dev_info
|
||||
except:
|
||||
continue
|
||||
|
||||
# Fallback to index mapping (camera1 = index 0, camera2 = index 1, etc.)
|
||||
try:
|
||||
camera_index = int(camera_name.replace("camera", "")) - 1
|
||||
if 0 <= camera_index < len(device_list):
|
||||
self.logger.info(f"Using index mapping for {camera_name} -> device {camera_index}")
|
||||
return device_list[camera_index]
|
||||
else:
|
||||
self.logger.error(f"Camera index {camera_index} not found (total: {len(device_list)}). Available indices: 0-{len(device_list)-1}")
|
||||
# If only one camera is available, use it for any camera name
|
||||
if len(device_list) == 1:
|
||||
self.logger.warning(f"Only 1 camera detected, using it for {camera_name}")
|
||||
return device_list[0]
|
||||
except ValueError:
|
||||
pass
|
||||
|
||||
self.logger.error(f"No device found for camera {camera_name}")
|
||||
return None
|
||||
|
||||
except Exception as e:
|
||||
self.logger.error(f"Error finding camera device: {e}")
|
||||
import traceback
|
||||
self.logger.debug(traceback.format_exc())
|
||||
return None
|
||||
|
||||
def start(self) -> bool:
|
||||
|
||||
Reference in New Issue
Block a user