diff --git a/API Documentations/docs/API_CHANGES_SUMMARY.md b/API Documentations/docs/API_CHANGES_SUMMARY.md index d7af414..a23b324 100644 --- a/API Documentations/docs/API_CHANGES_SUMMARY.md +++ b/API Documentations/docs/API_CHANGES_SUMMARY.md @@ -1,27 +1,32 @@ # API Changes Summary: Camera Settings and Video Format Updates ## Overview + This document tracks major API changes including camera settings enhancements and the MP4 video format update. ## 🎥 Latest Update: MP4 Video Format (v2.1) + **Date**: August 2025 **Major Changes**: -- **Video Format**: Changed from AVI/XVID to MP4/MPEG-4 format + +- **Video Format**: Changed from AVI/XVID to MP4/H.264 format - **File Extensions**: New recordings use `.mp4` instead of `.avi` - **File Size**: ~40% reduction in file sizes - **Streaming**: Better web browser compatibility **New Configuration Fields**: + ```json { "video_format": "mp4", // File format: "mp4" or "avi" - "video_codec": "mp4v", // Video codec: "mp4v", "XVID", "MJPG" + "video_codec": "h264", // Video codec: "h264", "mp4v", "XVID", "MJPG" "video_quality": 95 // Quality: 0-100 (higher = better) } ``` **Frontend Impact**: + - ✅ Better streaming performance and browser support - ✅ Smaller file sizes for faster transfers - ✅ Universal HTML5 video player compatibility @@ -38,12 +43,14 @@ Enhanced the `POST /cameras/{camera_name}/start-recording` API endpoint to accep ## Changes Made ### 1. API Models (`usda_vision_system/api/models.py`) + - **Enhanced `StartRecordingRequest`** to include optional parameters: - `exposure_ms: Optional[float]` - Exposure time in milliseconds - `gain: Optional[float]` - Camera gain value - `fps: Optional[float]` - Target frames per second ### 2. Camera Recorder (`usda_vision_system/camera/recorder.py`) + - **Added `update_camera_settings()` method** to dynamically update camera settings: - Updates exposure time using `mvsdk.CameraSetExposureTime()` - Updates gain using `mvsdk.CameraSetAnalogGain()` @@ -52,20 +59,23 @@ Enhanced the `POST /cameras/{camera_name}/start-recording` API endpoint to accep - Returns boolean indicating success/failure ### 3. Camera Manager (`usda_vision_system/camera/manager.py`) + - **Enhanced `manual_start_recording()` method** to accept new parameters: - Added optional `exposure_ms`, `gain`, and `fps` parameters - Calls `update_camera_settings()` if any settings are provided - **Automatic datetime prefix**: Always prepends timestamp to filename - If custom filename provided: `{timestamp}_{custom_filename}` - - If no filename provided: `{camera_name}_manual_{timestamp}.avi` + - If no filename provided: `{camera_name}_manual_{timestamp}.mp4` ### 4. API Server (`usda_vision_system/api/server.py`) + - **Updated start-recording endpoint** to: - Pass new camera settings to camera manager - Handle filename response with datetime prefix - Maintain backward compatibility with existing requests ### 5. API Tests (`api-tests.http`) + - **Added comprehensive test examples**: - Basic recording (existing functionality) - Recording with camera settings @@ -75,8 +85,9 @@ Enhanced the `POST /cameras/{camera_name}/start-recording` API endpoint to accep ## Usage Examples ### Basic Recording (unchanged) + ```http -POST http://localhost:8000/cameras/camera1/start-recording +POST http://vision:8000/cameras/camera1/start-recording Content-Type: application/json { @@ -84,11 +95,13 @@ Content-Type: application/json "filename": "test.avi" } ``` + **Result**: File saved as `20241223_143022_test.avi` ### Recording with Camera Settings + ```http -POST http://localhost:8000/cameras/camera1/start-recording +POST http://vision:8000/cameras/camera1/start-recording Content-Type: application/json { @@ -99,13 +112,16 @@ Content-Type: application/json "fps": 5.0 } ``` + **Result**: + - Camera settings updated before recording - File saved as `20241223_143022_high_quality.avi` ### Maximum FPS Recording + ```http -POST http://localhost:8000/cameras/camera1/start-recording +POST http://vision:8000/cameras/camera1/start-recording Content-Type: application/json { @@ -116,14 +132,17 @@ Content-Type: application/json "fps": 0 } ``` + **Result**: + - Camera captures at maximum possible speed (no delay between frames) - Video file saved with 30 FPS metadata for proper playback - Actual capture rate depends on camera hardware and exposure settings ### Settings Only (no filename) + ```http -POST http://localhost:8000/cameras/camera1/start-recording +POST http://vision:8000/cameras/camera1/start-recording Content-Type: application/json { @@ -133,34 +152,41 @@ Content-Type: application/json "fps": 7.0 } ``` -**Result**: + +**Result**: + - Camera settings updated - File saved as `camera1_manual_20241223_143022.avi` ## Key Features ### 1. **Backward Compatibility** + - All existing API calls continue to work unchanged - New parameters are optional - Default behavior preserved when no settings provided ### 2. **Automatic Datetime Prefix** + - **ALL filenames now have datetime prefix** regardless of what's sent - Format: `YYYYMMDD_HHMMSS_` (Atlanta timezone) - Ensures unique filenames and chronological ordering ### 3. **Dynamic Camera Settings** + - Settings can be changed per recording without restarting system - Based on proven implementation from `old tests/camera_video_recorder.py` - Proper error handling and logging ### 4. **Maximum FPS Capture** + - **`fps: 0`** = Capture at maximum possible speed (no delay between frames) - **`fps > 0`** = Capture at specified frame rate with controlled timing - **`fps` omitted** = Uses camera config default (usually 3.0 fps) - Video files saved with 30 FPS metadata when fps=0 for proper playback ### 5. **Parameter Validation** + - Uses Pydantic models for automatic validation - Optional parameters with proper type checking - Descriptive field documentation @@ -168,6 +194,7 @@ Content-Type: application/json ## Testing Run the test script to verify functionality: + ```bash # Start the system first python main.py @@ -177,6 +204,7 @@ python test_api_changes.py ``` The test script verifies: + - Basic recording functionality - Camera settings application - Filename datetime prefix handling @@ -185,22 +213,27 @@ The test script verifies: ## Implementation Notes ### Camera Settings Mapping + - **Exposure**: Converted from milliseconds to microseconds for SDK - **Gain**: Converted to camera units (multiplied by 100) - **FPS**: Stored in camera config, used by recording loop ### Error Handling + - Settings update failures are logged but don't prevent recording - Invalid camera names return appropriate HTTP errors - Camera initialization failures are handled gracefully ### Filename Generation + - Uses `format_filename_timestamp()` from timezone utilities - Ensures Atlanta timezone consistency - Handles both custom and auto-generated filenames ## Similar to Old Implementation + The camera settings functionality mirrors the proven approach in `old tests/camera_video_recorder.py`: + - Same parameter names and ranges - Same SDK function calls - Same conversion factors diff --git a/API Documentations/docs/API_DOCUMENTATION.md b/API Documentations/docs/API_DOCUMENTATION.md index 0a648c0..065413d 100644 --- a/API Documentations/docs/API_DOCUMENTATION.md +++ b/API Documentations/docs/API_DOCUMENTATION.md @@ -18,10 +18,13 @@ This document provides comprehensive documentation for all API endpoints in the ## 🔧 System Status & Health ### Get System Status + ```http GET /system/status ``` + **Response**: `SystemStatusResponse` + ```json { "system_started": true, @@ -49,10 +52,13 @@ GET /system/status ``` ### Health Check + ```http GET /health ``` + **Response**: Simple health status + ```json { "status": "healthy", @@ -63,16 +69,21 @@ GET /health ## 📷 Camera Management ### Get All Cameras + ```http GET /cameras ``` + **Response**: `Dict[str, CameraStatusResponse]` ### Get Specific Camera Status + ```http GET /cameras/{camera_name}/status ``` + **Response**: `CameraStatusResponse` + ```json { "name": "camera1", @@ -97,12 +108,13 @@ GET /cameras/{camera_name}/status ## 🎥 Recording Control ### Start Recording + ```http POST /cameras/{camera_name}/start-recording Content-Type: application/json { - "filename": "test_recording.avi", + "filename": "test_recording.mp4", "exposure_ms": 2.0, "gain": 4.0, "fps": 5.0 @@ -110,30 +122,36 @@ Content-Type: application/json ``` **Request Model**: `StartRecordingRequest` + - `filename` (optional): Custom filename (datetime prefix will be added automatically) - `exposure_ms` (optional): Exposure time in milliseconds - `gain` (optional): Camera gain value - `fps` (optional): Target frames per second **Response**: `StartRecordingResponse` + ```json { "success": true, "message": "Recording started for camera1", - "filename": "20240115_103000_test_recording.avi" + "filename": "20240115_103000_test_recording.mp4" } ``` **Key Features**: + - ✅ **Automatic datetime prefix**: All filenames get `YYYYMMDD_HHMMSS_` prefix - ✅ **Dynamic camera settings**: Adjust exposure, gain, and FPS per recording - ✅ **Backward compatibility**: All existing API calls work unchanged ### Stop Recording + ```http POST /cameras/{camera_name}/stop-recording ``` + **Response**: `StopRecordingResponse` + ```json { "success": true, @@ -145,10 +163,13 @@ POST /cameras/{camera_name}/stop-recording ## 🤖 Auto-Recording Management ### Enable Auto-Recording for Camera + ```http POST /cameras/{camera_name}/auto-recording/enable ``` + **Response**: `AutoRecordingConfigResponse` + ```json { "success": true, @@ -159,16 +180,21 @@ POST /cameras/{camera_name}/auto-recording/enable ``` ### Disable Auto-Recording for Camera + ```http POST /cameras/{camera_name}/auto-recording/disable ``` + **Response**: `AutoRecordingConfigResponse` ### Get Auto-Recording Status + ```http GET /auto-recording/status ``` + **Response**: `AutoRecordingStatusResponse` + ```json { "running": true, @@ -179,6 +205,7 @@ GET /auto-recording/status ``` **Auto-Recording Features**: + - 🤖 **MQTT-triggered recording**: Automatically starts/stops based on machine state - 🔄 **Retry logic**: Failed recordings are retried with configurable delays - 📊 **Per-camera control**: Enable/disable auto-recording individually @@ -187,10 +214,13 @@ GET /auto-recording/status ## 🎛️ Camera Configuration ### Get Camera Configuration + ```http GET /cameras/{camera_name}/config ``` + **Response**: `CameraConfigResponse` + ```json { "name": "camera1", @@ -225,6 +255,7 @@ GET /cameras/{camera_name}/config ``` ### Update Camera Configuration + ```http PUT /cameras/{camera_name}/config Content-Type: application/json @@ -238,11 +269,13 @@ Content-Type: application/json ``` ### Apply Configuration (Restart Required) + ```http POST /cameras/{camera_name}/apply-config ``` **Configuration Categories**: + - ✅ **Real-time**: `exposure_ms`, `gain`, `target_fps`, `sharpness`, `contrast`, etc. - ⚠️ **Restart required**: `noise_filter_enabled`, `denoise_3d_enabled`, `bit_depth`, `video_format`, `video_codec`, `video_quality` @@ -251,16 +284,21 @@ For detailed configuration options, see [Camera Configuration API Guide](api/CAM ## 📡 MQTT & Machine Status ### Get All Machines + ```http GET /machines ``` + **Response**: `Dict[str, MachineStatusResponse]` ### Get MQTT Status + ```http GET /mqtt/status ``` + **Response**: `MQTTStatusResponse` + ```json { "connected": true, @@ -275,10 +313,13 @@ GET /mqtt/status ``` ### Get MQTT Events History + ```http GET /mqtt/events?limit=10 ``` + **Response**: `MQTTEventsHistoryResponse` + ```json { "events": [ @@ -299,10 +340,13 @@ GET /mqtt/events?limit=10 ## 💾 Storage & File Management ### Get Storage Statistics + ```http GET /storage/stats ``` + **Response**: `StorageStatsResponse` + ```json { "base_path": "/storage", @@ -328,6 +372,7 @@ GET /storage/stats ``` ### Get File List + ```http POST /storage/files Content-Type: application/json @@ -339,7 +384,9 @@ Content-Type: application/json "limit": 50 } ``` + **Response**: `FileListResponse` + ```json { "files": [ @@ -356,6 +403,7 @@ Content-Type: application/json ``` ### Cleanup Old Files + ```http POST /storage/cleanup Content-Type: application/json @@ -364,7 +412,9 @@ Content-Type: application/json "max_age_days": 30 } ``` + **Response**: `CleanupResponse` + ```json { "files_removed": 25, @@ -376,42 +426,55 @@ Content-Type: application/json ## 🔄 Camera Recovery & Diagnostics ### Test Camera Connection + ```http POST /cameras/{camera_name}/test-connection ``` + **Response**: `CameraTestResponse` ### Reconnect Camera + ```http POST /cameras/{camera_name}/reconnect ``` + **Response**: `CameraRecoveryResponse` ### Restart Camera Grab Process + ```http POST /cameras/{camera_name}/restart-grab ``` + **Response**: `CameraRecoveryResponse` ### Reset Camera Timestamp + ```http POST /cameras/{camera_name}/reset-timestamp ``` + **Response**: `CameraRecoveryResponse` ### Full Camera Reset + ```http POST /cameras/{camera_name}/full-reset ``` + **Response**: `CameraRecoveryResponse` ### Reinitialize Camera + ```http POST /cameras/{camera_name}/reinitialize ``` + **Response**: `CameraRecoveryResponse` **Recovery Response Example**: + ```json { "success": true, @@ -425,22 +488,27 @@ POST /cameras/{camera_name}/reinitialize ## 📺 Live Streaming ### Get Live MJPEG Stream + ```http GET /cameras/{camera_name}/stream ``` + **Response**: MJPEG video stream (multipart/x-mixed-replace) ### Start Camera Stream + ```http POST /cameras/{camera_name}/start-stream ``` ### Stop Camera Stream + ```http POST /cameras/{camera_name}/stop-stream ``` **Streaming Features**: + - 📺 **MJPEG format**: Compatible with web browsers and React apps - 🔄 **Concurrent operation**: Stream while recording simultaneously - ⚡ **Low latency**: Real-time preview for monitoring @@ -450,8 +518,9 @@ For detailed streaming integration, see [Streaming Guide](guides/STREAMING_GUIDE ## 🌐 WebSocket Real-time Updates ### Connect to WebSocket + ```javascript -const ws = new WebSocket('ws://localhost:8000/ws'); +const ws = new WebSocket('ws://vision:8000/ws'); ws.onmessage = (event) => { const update = JSON.parse(event.data); @@ -460,6 +529,7 @@ ws.onmessage = (event) => { ``` **WebSocket Message Types**: + - `system_status`: System status changes - `camera_status`: Camera status updates - `recording_started`: Recording start events @@ -468,6 +538,7 @@ ws.onmessage = (event) => { - `auto_recording_event`: Auto-recording status changes **Example WebSocket Message**: + ```json { "type": "recording_started", @@ -483,26 +554,28 @@ ws.onmessage = (event) => { ## 🚀 Quick Start Examples ### Basic System Monitoring + ```bash # Check system health -curl http://localhost:8000/health +curl http://vision:8000/health # Get overall system status -curl http://localhost:8000/system/status +curl http://vision:8000/system/status # Get all camera statuses -curl http://localhost:8000/cameras +curl http://vision:8000/cameras ``` ### Manual Recording Control + ```bash # Start recording with default settings -curl -X POST http://localhost:8000/cameras/camera1/start-recording \ +curl -X POST http://vision:8000/cameras/camera1/start-recording \ -H "Content-Type: application/json" \ -d '{"filename": "manual_test.avi"}' # Start recording with custom camera settings -curl -X POST http://localhost:8000/cameras/camera1/start-recording \ +curl -X POST http://vision:8000/cameras/camera1/start-recording \ -H "Content-Type: application/json" \ -d '{ "filename": "high_quality.avi", @@ -512,28 +585,30 @@ curl -X POST http://localhost:8000/cameras/camera1/start-recording \ }' # Stop recording -curl -X POST http://localhost:8000/cameras/camera1/stop-recording +curl -X POST http://vision:8000/cameras/camera1/stop-recording ``` ### Auto-Recording Management + ```bash # Enable auto-recording for camera1 -curl -X POST http://localhost:8000/cameras/camera1/auto-recording/enable +curl -X POST http://vision:8000/cameras/camera1/auto-recording/enable # Check auto-recording status -curl http://localhost:8000/auto-recording/status +curl http://vision:8000/auto-recording/status # Disable auto-recording for camera1 -curl -X POST http://localhost:8000/cameras/camera1/auto-recording/disable +curl -X POST http://vision:8000/cameras/camera1/auto-recording/disable ``` ### Camera Configuration + ```bash # Get current camera configuration -curl http://localhost:8000/cameras/camera1/config +curl http://vision:8000/cameras/camera1/config # Update camera settings (real-time) -curl -X PUT http://localhost:8000/cameras/camera1/config \ +curl -X PUT http://vision:8000/cameras/camera1/config \ -H "Content-Type: application/json" \ -d '{ "exposure_ms": 1.5, @@ -548,28 +623,33 @@ curl -X PUT http://localhost:8000/cameras/camera1/config \ ### ✨ New in Latest Version #### 1. Enhanced Recording API + - **Dynamic camera settings**: Set exposure, gain, and FPS per recording - **Automatic datetime prefixes**: All filenames get timestamp prefixes - **Backward compatibility**: Existing API calls work unchanged #### 2. Auto-Recording Feature + - **Per-camera control**: Enable/disable auto-recording individually - **MQTT integration**: Automatic recording based on machine states - **Retry logic**: Failed recordings are automatically retried - **Status tracking**: Monitor auto-recording attempts and failures #### 3. Advanced Camera Configuration + - **Real-time settings**: Update exposure, gain, image quality without restart - **Image enhancement**: Sharpness, contrast, saturation, gamma controls - **Noise reduction**: Configurable noise filtering and 3D denoising - **HDR support**: High Dynamic Range imaging capabilities #### 4. Live Streaming + - **MJPEG streaming**: Real-time camera preview - **Concurrent operation**: Stream while recording simultaneously - **Web-compatible**: Direct integration with React/HTML video elements #### 5. Enhanced Monitoring + - **MQTT event history**: Track machine state changes over time - **Storage statistics**: Monitor disk usage and file counts - **WebSocket updates**: Real-time system status notifications @@ -577,11 +657,13 @@ curl -X PUT http://localhost:8000/cameras/camera1/config \ ### 🔄 Migration Notes #### From Previous Versions + 1. **Recording API**: All existing calls work, but now return filenames with datetime prefixes 2. **Configuration**: New camera settings are optional and backward compatible 3. **Auto-recording**: New feature, requires enabling in `config.json` and per camera #### Configuration Updates + ```json { "cameras": [ @@ -613,22 +695,28 @@ curl -X PUT http://localhost:8000/cameras/camera1/config \ ## 📞 Support & Integration ### API Base URL -- **Development**: `http://localhost:8000` + +- **Development**: `http://vision:8000` - **Production**: Configure in `config.json` under `system.api_host` and `system.api_port` ### Error Handling + All endpoints return standard HTTP status codes: + - `200`: Success - `404`: Resource not found (camera, file, etc.) - `500`: Internal server error - `503`: Service unavailable (camera manager, MQTT, etc.) ### Rate Limiting + - No rate limiting currently implemented - WebSocket connections are limited to reasonable concurrent connections ### CORS Support + - CORS is enabled for web dashboard integration - Configure allowed origins in the API server settings + ``` ``` diff --git a/API Documentations/docs/API_QUICK_REFERENCE.md b/API Documentations/docs/API_QUICK_REFERENCE.md index 1ec7a54..0c267bf 100644 --- a/API Documentations/docs/API_QUICK_REFERENCE.md +++ b/API Documentations/docs/API_QUICK_REFERENCE.md @@ -6,30 +6,30 @@ Quick reference for the most commonly used API endpoints. For complete documenta ```bash # Health check -curl http://localhost:8000/health +curl http://vision:8000/health # System overview -curl http://localhost:8000/system/status +curl http://vision:8000/system/status # All cameras -curl http://localhost:8000/cameras +curl http://vision:8000/cameras # All machines -curl http://localhost:8000/machines +curl http://vision:8000/machines ``` ## 🎥 Recording Control ### Start Recording (Basic) ```bash -curl -X POST http://localhost:8000/cameras/camera1/start-recording \ +curl -X POST http://vision:8000/cameras/camera1/start-recording \ -H "Content-Type: application/json" \ -d '{"filename": "test.avi"}' ``` ### Start Recording (With Settings) ```bash -curl -X POST http://localhost:8000/cameras/camera1/start-recording \ +curl -X POST http://vision:8000/cameras/camera1/start-recording \ -H "Content-Type: application/json" \ -d '{ "filename": "high_quality.avi", @@ -41,30 +41,30 @@ curl -X POST http://localhost:8000/cameras/camera1/start-recording \ ### Stop Recording ```bash -curl -X POST http://localhost:8000/cameras/camera1/stop-recording +curl -X POST http://vision:8000/cameras/camera1/stop-recording ``` ## 🤖 Auto-Recording ```bash # Enable auto-recording -curl -X POST http://localhost:8000/cameras/camera1/auto-recording/enable +curl -X POST http://vision:8000/cameras/camera1/auto-recording/enable # Disable auto-recording -curl -X POST http://localhost:8000/cameras/camera1/auto-recording/disable +curl -X POST http://vision:8000/cameras/camera1/auto-recording/disable # Check auto-recording status -curl http://localhost:8000/auto-recording/status +curl http://vision:8000/auto-recording/status ``` ## 🎛️ Camera Configuration ```bash # Get camera config -curl http://localhost:8000/cameras/camera1/config +curl http://vision:8000/cameras/camera1/config # Update camera settings -curl -X PUT http://localhost:8000/cameras/camera1/config \ +curl -X PUT http://vision:8000/cameras/camera1/config \ -H "Content-Type: application/json" \ -d '{ "exposure_ms": 1.5, @@ -77,41 +77,41 @@ curl -X PUT http://localhost:8000/cameras/camera1/config \ ```bash # Start streaming -curl -X POST http://localhost:8000/cameras/camera1/start-stream +curl -X POST http://vision:8000/cameras/camera1/start-stream # Get MJPEG stream (use in browser/video element) -# http://localhost:8000/cameras/camera1/stream +# http://vision:8000/cameras/camera1/stream # Stop streaming -curl -X POST http://localhost:8000/cameras/camera1/stop-stream +curl -X POST http://vision:8000/cameras/camera1/stop-stream ``` ## 🔄 Camera Recovery ```bash # Test connection -curl -X POST http://localhost:8000/cameras/camera1/test-connection +curl -X POST http://vision:8000/cameras/camera1/test-connection # Reconnect camera -curl -X POST http://localhost:8000/cameras/camera1/reconnect +curl -X POST http://vision:8000/cameras/camera1/reconnect # Full reset -curl -X POST http://localhost:8000/cameras/camera1/full-reset +curl -X POST http://vision:8000/cameras/camera1/full-reset ``` ## 💾 Storage Management ```bash # Storage statistics -curl http://localhost:8000/storage/stats +curl http://vision:8000/storage/stats # List files -curl -X POST http://localhost:8000/storage/files \ +curl -X POST http://vision:8000/storage/files \ -H "Content-Type: application/json" \ -d '{"camera_name": "camera1", "limit": 10}' # Cleanup old files -curl -X POST http://localhost:8000/storage/cleanup \ +curl -X POST http://vision:8000/storage/cleanup \ -H "Content-Type: application/json" \ -d '{"max_age_days": 30}' ``` @@ -120,17 +120,17 @@ curl -X POST http://localhost:8000/storage/cleanup \ ```bash # MQTT status -curl http://localhost:8000/mqtt/status +curl http://vision:8000/mqtt/status # Recent MQTT events -curl http://localhost:8000/mqtt/events?limit=10 +curl http://vision:8000/mqtt/events?limit=10 ``` ## 🌐 WebSocket Connection ```javascript // Connect to real-time updates -const ws = new WebSocket('ws://localhost:8000/ws'); +const ws = new WebSocket('ws://vision:8000/ws'); ws.onmessage = (event) => { const update = JSON.parse(event.data); diff --git a/API Documentations/docs/MP4_FORMAT_UPDATE.md b/API Documentations/docs/MP4_FORMAT_UPDATE.md index ecae663..a6f2dcc 100644 --- a/API Documentations/docs/MP4_FORMAT_UPDATE.md +++ b/API Documentations/docs/MP4_FORMAT_UPDATE.md @@ -1,20 +1,24 @@ # 🎥 MP4 Video Format Update - Frontend Integration Guide ## Overview + The USDA Vision Camera System has been updated to record videos in **MP4 format** instead of AVI format for better streaming compatibility and smaller file sizes. ## 🔄 What Changed ### Video Format + - **Before**: AVI files with XVID codec (`.avi` extension) -- **After**: MP4 files with MPEG-4 codec (`.mp4` extension) +- **After**: MP4 files with H.264 codec (`.mp4` extension) ### File Extensions + - All new video recordings now use `.mp4` extension - Existing `.avi` files remain accessible and functional - File size reduction: ~40% smaller than equivalent AVI files ### API Response Updates + New fields added to camera configuration responses: ```json @@ -28,13 +32,17 @@ New fields added to camera configuration responses: ## 🌐 Frontend Impact ### 1. Video Player Compatibility + **✅ Better Browser Support** + - MP4 format has native support in all modern browsers - No need for additional codecs or plugins - Better mobile device compatibility (iOS/Android) ### 2. File Handling Updates + **File Extension Handling** + ```javascript // Update file extension checks const isVideoFile = (filename) => { @@ -50,7 +58,9 @@ const getVideoMimeType = (filename) => { ``` ### 3. Video Streaming + **Improved Streaming Performance** + ```javascript // MP4 files can be streamed directly without conversion const videoUrl = `/api/videos/${videoId}/stream`; @@ -63,7 +73,9 @@ const videoUrl = `/api/videos/${videoId}/stream`; ``` ### 4. File Size Display + **Updated Size Expectations** + - MP4 files are ~40% smaller than equivalent AVI files - Update any file size warnings or storage calculations - Better compression means faster downloads and uploads @@ -71,9 +83,11 @@ const videoUrl = `/api/videos/${videoId}/stream`; ## 📡 API Changes ### Camera Configuration Endpoint + **GET** `/cameras/{camera_name}/config` **New Response Fields:** + ```json { "name": "camera1", @@ -95,7 +109,9 @@ const videoUrl = `/api/videos/${videoId}/stream`; ``` ### Video Listing Endpoints + **File Extension Updates** + - Video files in responses will now have `.mp4` extensions - Existing `.avi` files will still appear in listings - Filter by both extensions when needed @@ -103,42 +119,49 @@ const videoUrl = `/api/videos/${videoId}/stream`; ## 🔧 Configuration Options ### Video Format Settings + ```json { "video_format": "mp4", // Options: "mp4", "avi" - "video_codec": "mp4v", // Options: "mp4v", "XVID", "MJPG" + "video_codec": "h264", // Options: "h264", "mp4v", "XVID", "MJPG" "video_quality": 95 // Range: 0-100 (higher = better quality) } ``` ### Recommended Settings -- **Production**: `"mp4"` format, `"mp4v"` codec, `95` quality -- **Storage Optimized**: `"mp4"` format, `"mp4v"` codec, `85` quality + +- **Production**: `"mp4"` format, `"h264"` codec, `95` quality +- **Storage Optimized**: `"mp4"` format, `"h264"` codec, `85` quality - **Legacy Mode**: `"avi"` format, `"XVID"` codec, `95` quality ## 🎯 Frontend Implementation Checklist ### ✅ Video Player Updates + - [ ] Verify HTML5 video player works with MP4 files - [ ] Update video MIME type handling - [ ] Test streaming performance with new format ### ✅ File Management + - [ ] Update file extension filters to include `.mp4` - [ ] Modify file type detection logic - [ ] Update download/upload handling for MP4 files ### ✅ UI/UX Updates + - [ ] Update file size expectations in UI - [ ] Modify any format-specific icons or indicators - [ ] Update help text or tooltips mentioning video formats ### ✅ Configuration Interface + - [ ] Add video format settings to camera config UI - [ ] Include video quality slider/selector - [ ] Add restart warning for video format changes ### ✅ Testing + - [ ] Test video playback with new MP4 files - [ ] Verify backward compatibility with existing AVI files - [ ] Test streaming performance and loading times @@ -146,11 +169,13 @@ const videoUrl = `/api/videos/${videoId}/stream`; ## 🔄 Backward Compatibility ### Existing AVI Files + - All existing `.avi` files remain fully functional - No conversion or migration required - Video player should handle both formats ### API Compatibility + - All existing API endpoints continue to work - New fields are additive (won't break existing code) - Default values provided for new configuration fields @@ -158,6 +183,7 @@ const videoUrl = `/api/videos/${videoId}/stream`; ## 📊 Performance Benefits ### File Size Reduction + ``` Example 5-minute recording at 1280x1024: - AVI/XVID: ~180 MB @@ -165,12 +191,14 @@ Example 5-minute recording at 1280x1024: ``` ### Streaming Improvements + - Faster initial load times - Better progressive download support - Reduced bandwidth usage - Native browser optimization ### Storage Efficiency + - More recordings fit in same storage space - Faster backup and transfer operations - Reduced storage costs over time @@ -178,16 +206,19 @@ Example 5-minute recording at 1280x1024: ## 🚨 Important Notes ### Restart Required + - Video format changes require camera service restart - Mark video format settings as "restart required" in UI - Provide clear user feedback about restart necessity ### Browser Compatibility + - MP4 format supported in all modern browsers - Better mobile device support than AVI - No additional plugins or codecs needed ### Quality Assurance + - Video quality maintained at 95/100 setting - No visual degradation compared to AVI - High bitrate ensures professional quality diff --git a/API Documentations/docs/PROJECT_COMPLETE.md b/API Documentations/docs/PROJECT_COMPLETE.md index 0f4df48..7f240d6 100644 --- a/API Documentations/docs/PROJECT_COMPLETE.md +++ b/API Documentations/docs/PROJECT_COMPLETE.md @@ -97,11 +97,11 @@ python test_system.py ### Dashboard Integration ```javascript // React component example -const systemStatus = await fetch('http://localhost:8000/system/status'); -const cameras = await fetch('http://localhost:8000/cameras'); +const systemStatus = await fetch('http://vision:8000/system/status'); +const cameras = await fetch('http://vision:8000/cameras'); // WebSocket for real-time updates -const ws = new WebSocket('ws://localhost:8000/ws'); +const ws = new WebSocket('ws://vision:8000/ws'); ws.onmessage = (event) => { const update = JSON.parse(event.data); // Handle real-time system updates @@ -111,13 +111,13 @@ ws.onmessage = (event) => { ### Manual Control ```bash # Start recording manually -curl -X POST http://localhost:8000/cameras/camera1/start-recording +curl -X POST http://vision:8000/cameras/camera1/start-recording # Stop recording manually -curl -X POST http://localhost:8000/cameras/camera1/stop-recording +curl -X POST http://vision:8000/cameras/camera1/stop-recording # Get system status -curl http://localhost:8000/system/status +curl http://vision:8000/system/status ``` ## 📊 System Capabilities @@ -151,7 +151,7 @@ curl http://localhost:8000/system/status ### Troubleshooting - **Test Suite**: `python test_system.py` - **Time Check**: `python check_time.py` -- **API Health**: `curl http://localhost:8000/health` +- **API Health**: `curl http://vision:8000/health` - **Debug Mode**: `python main.py --log-level DEBUG` ## 🎯 Production Readiness diff --git a/API Documentations/docs/VIDEO_STREAMING.md b/API Documentations/docs/VIDEO_STREAMING.md index 8e2cb61..8cbed70 100644 --- a/API Documentations/docs/VIDEO_STREAMING.md +++ b/API Documentations/docs/VIDEO_STREAMING.md @@ -204,10 +204,10 @@ sudo systemctl restart usda-vision-camera ### Check Status ```bash # Check video module status -curl http://localhost:8000/system/video-module +curl http://vision:8000/system/video-module # Check available videos -curl http://localhost:8000/videos/ +curl http://vision:8000/videos/ ``` ### Logs diff --git a/API Documentations/docs/api/CAMERA_CONFIG_API.md b/API Documentations/docs/api/CAMERA_CONFIG_API.md index d65f0f8..e0e898f 100644 --- a/API Documentations/docs/api/CAMERA_CONFIG_API.md +++ b/API Documentations/docs/api/CAMERA_CONFIG_API.md @@ -185,7 +185,7 @@ POST /cameras/{camera_name}/apply-config ### Example 1: Adjust Exposure and Gain ```bash -curl -X PUT http://localhost:8000/cameras/camera1/config \ +curl -X PUT http://vision:8000/cameras/camera1/config \ -H "Content-Type: application/json" \ -d '{ "exposure_ms": 1.5, @@ -195,7 +195,7 @@ curl -X PUT http://localhost:8000/cameras/camera1/config \ ### Example 2: Improve Image Quality ```bash -curl -X PUT http://localhost:8000/cameras/camera1/config \ +curl -X PUT http://vision:8000/cameras/camera1/config \ -H "Content-Type: application/json" \ -d '{ "sharpness": 150, @@ -206,7 +206,7 @@ curl -X PUT http://localhost:8000/cameras/camera1/config \ ### Example 3: Configure for Indoor Lighting ```bash -curl -X PUT http://localhost:8000/cameras/camera1/config \ +curl -X PUT http://vision:8000/cameras/camera1/config \ -H "Content-Type: application/json" \ -d '{ "anti_flicker_enabled": true, @@ -218,7 +218,7 @@ curl -X PUT http://localhost:8000/cameras/camera1/config \ ### Example 4: Enable HDR Mode ```bash -curl -X PUT http://localhost:8000/cameras/camera1/config \ +curl -X PUT http://vision:8000/cameras/camera1/config \ -H "Content-Type: application/json" \ -d '{ "hdr_enabled": true, @@ -232,7 +232,7 @@ curl -X PUT http://localhost:8000/cameras/camera1/config \ ```jsx import React, { useState, useEffect } from 'react'; -const CameraConfig = ({ cameraName, apiBaseUrl = 'http://localhost:8000' }) => { +const CameraConfig = ({ cameraName, apiBaseUrl = 'http://vision:8000' }) => { const [config, setConfig] = useState(null); const [loading, setLoading] = useState(false); const [error, setError] = useState(null); diff --git a/API Documentations/docs/guides/CAMERA_RECOVERY_GUIDE.md b/API Documentations/docs/guides/CAMERA_RECOVERY_GUIDE.md index 963f3ef..4787e57 100644 --- a/API Documentations/docs/guides/CAMERA_RECOVERY_GUIDE.md +++ b/API Documentations/docs/guides/CAMERA_RECOVERY_GUIDE.md @@ -56,27 +56,27 @@ When a camera has issues, follow this order: 1. **Test Connection** - Diagnose the problem ```http - POST http://localhost:8000/cameras/camera1/test-connection + POST http://vision:8000/cameras/camera1/test-connection ``` 2. **Try Reconnect** - Most common fix ```http - POST http://localhost:8000/cameras/camera1/reconnect + POST http://vision:8000/cameras/camera1/reconnect ``` 3. **Restart Grab** - If reconnect doesn't work ```http - POST http://localhost:8000/cameras/camera1/restart-grab + POST http://vision:8000/cameras/camera1/restart-grab ``` 4. **Full Reset** - For persistent issues ```http - POST http://localhost:8000/cameras/camera1/full-reset + POST http://vision:8000/cameras/camera1/full-reset ``` 5. **Reinitialize** - For cameras that never worked ```http - POST http://localhost:8000/cameras/camera1/reinitialize + POST http://vision:8000/cameras/camera1/reinitialize ``` ## Response Format diff --git a/API Documentations/docs/guides/MQTT_LOGGING_GUIDE.md b/API Documentations/docs/guides/MQTT_LOGGING_GUIDE.md index abe1859..f1f9fd0 100644 --- a/API Documentations/docs/guides/MQTT_LOGGING_GUIDE.md +++ b/API Documentations/docs/guides/MQTT_LOGGING_GUIDE.md @@ -38,7 +38,7 @@ When you run the system, you'll see: ### MQTT Status ```http -GET http://localhost:8000/mqtt/status +GET http://vision:8000/mqtt/status ``` **Response:** @@ -60,7 +60,7 @@ GET http://localhost:8000/mqtt/status ### Machine Status ```http -GET http://localhost:8000/machines +GET http://vision:8000/machines ``` **Response:** @@ -85,7 +85,7 @@ GET http://localhost:8000/machines ### System Status ```http -GET http://localhost:8000/system/status +GET http://vision:8000/system/status ``` **Response:** @@ -125,13 +125,13 @@ Tests all the API endpoints and shows expected responses. ### 4. **Query APIs Directly** ```bash # Check MQTT status -curl http://localhost:8000/mqtt/status +curl http://vision:8000/mqtt/status # Check machine states -curl http://localhost:8000/machines +curl http://vision:8000/machines # Check overall system status -curl http://localhost:8000/system/status +curl http://vision:8000/system/status ``` ## 🔧 Configuration diff --git a/API Documentations/docs/guides/STREAMING_GUIDE.md b/API Documentations/docs/guides/STREAMING_GUIDE.md index ca55700..e35c6c3 100644 --- a/API Documentations/docs/guides/STREAMING_GUIDE.md +++ b/API Documentations/docs/guides/STREAMING_GUIDE.md @@ -40,13 +40,13 @@ Open `camera_preview.html` in your browser and click "Start Stream" for any came ### 3. API Usage ```bash # Start streaming for camera1 -curl -X POST http://localhost:8000/cameras/camera1/start-stream +curl -X POST http://vision:8000/cameras/camera1/start-stream # View live stream (open in browser) -http://localhost:8000/cameras/camera1/stream +http://vision:8000/cameras/camera1/stream # Stop streaming -curl -X POST http://localhost:8000/cameras/camera1/stop-stream +curl -X POST http://vision:8000/cameras/camera1/stop-stream ``` ## 📡 API Endpoints @@ -150,10 +150,10 @@ The system supports these concurrent operations: ### Example: Concurrent Usage ```bash # Start streaming -curl -X POST http://localhost:8000/cameras/camera1/start-stream +curl -X POST http://vision:8000/cameras/camera1/start-stream # Start recording (while streaming continues) -curl -X POST http://localhost:8000/cameras/camera1/start-recording \ +curl -X POST http://vision:8000/cameras/camera1/start-recording \ -H "Content-Type: application/json" \ -d '{"filename": "test_recording.avi"}' @@ -232,8 +232,8 @@ For issues with streaming functionality: 1. Check the system logs: `usda_vision_system.log` 2. Run the test script: `python test_streaming.py` -3. Verify API health: `http://localhost:8000/health` -4. Check camera status: `http://localhost:8000/cameras` +3. Verify API health: `http://vision:8000/health` +4. Check camera status: `http://vision:8000/cameras` --- diff --git a/API Documentations/docs/legacy/IMPLEMENTATION_SUMMARY.md b/API Documentations/docs/legacy/IMPLEMENTATION_SUMMARY.md index f16e737..84759d9 100644 --- a/API Documentations/docs/legacy/IMPLEMENTATION_SUMMARY.md +++ b/API Documentations/docs/legacy/IMPLEMENTATION_SUMMARY.md @@ -73,10 +73,10 @@ Edit `config.json` to customize: - System parameters ### API Access -- System status: `http://localhost:8000/system/status` -- Camera status: `http://localhost:8000/cameras` -- Manual recording: `POST http://localhost:8000/cameras/camera1/start-recording` -- Real-time updates: WebSocket at `ws://localhost:8000/ws` +- System status: `http://vision:8000/system/status` +- Camera status: `http://vision:8000/cameras` +- Manual recording: `POST http://vision:8000/cameras/camera1/start-recording` +- Real-time updates: WebSocket at `ws://vision:8000/ws` ## 📊 Test Results @@ -146,18 +146,18 @@ The system provides everything needed for your React dashboard: ```javascript // Example API usage -const systemStatus = await fetch('http://localhost:8000/system/status'); -const cameras = await fetch('http://localhost:8000/cameras'); +const systemStatus = await fetch('http://vision:8000/system/status'); +const cameras = await fetch('http://vision:8000/cameras'); // WebSocket for real-time updates -const ws = new WebSocket('ws://localhost:8000/ws'); +const ws = new WebSocket('ws://vision:8000/ws'); ws.onmessage = (event) => { const update = JSON.parse(event.data); // Handle real-time system updates }; // Manual recording control -await fetch('http://localhost:8000/cameras/camera1/start-recording', { +await fetch('http://vision:8000/cameras/camera1/start-recording', { method: 'POST', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify({ camera_name: 'camera1' }) diff --git a/API Documentations/docs/legacy/README_SYSTEM.md b/API Documentations/docs/legacy/README_SYSTEM.md index 932f632..67b0542 100644 --- a/API Documentations/docs/legacy/README_SYSTEM.md +++ b/API Documentations/docs/legacy/README_SYSTEM.md @@ -192,13 +192,13 @@ Comprehensive error tracking with: ```bash # Check system status -curl http://localhost:8000/system/status +curl http://vision:8000/system/status # Check camera status -curl http://localhost:8000/cameras +curl http://vision:8000/cameras # Manual recording start -curl -X POST http://localhost:8000/cameras/camera1/start-recording \ +curl -X POST http://vision:8000/cameras/camera1/start-recording \ -H "Content-Type: application/json" \ -d '{"camera_name": "camera1"}' ``` @@ -246,4 +246,4 @@ This project is developed for USDA research purposes. For issues and questions: 1. Check the logs in `usda_vision_system.log` 2. Review the troubleshooting section -3. Check API status at `http://localhost:8000/health` +3. Check API status at `http://vision:8000/health` diff --git a/API Documentations/docs/legacy/TIMEZONE_SETUP_SUMMARY.md b/API Documentations/docs/legacy/TIMEZONE_SETUP_SUMMARY.md index 9866f08..24ef130 100644 --- a/API Documentations/docs/legacy/TIMEZONE_SETUP_SUMMARY.md +++ b/API Documentations/docs/legacy/TIMEZONE_SETUP_SUMMARY.md @@ -76,7 +76,7 @@ timedatectl status ### API Endpoints ```bash # System status includes time info -curl http://localhost:8000/system/status +curl http://vision:8000/system/status # Example response includes: { diff --git a/api-endpoints.http b/api-endpoints.http index 66265e7..721f549 100644 --- a/api-endpoints.http +++ b/api-endpoints.http @@ -171,7 +171,7 @@ POST http://vision:8000/cameras/camera1/start-recording Content-Type: application/json { - "filename": "test_recording.avi", + "filename": "test_recording.mp4", "exposure_ms": 1.5, "gain": 3.0, "fps": 0 @@ -187,7 +187,7 @@ Content-Type: application/json # { # "success": true, # "message": "Recording started for camera1", -# "filename": "20250728_120000_test_recording.avi" +# "filename": "20250728_120000_test_recording.mp4" # } ### @@ -197,7 +197,7 @@ POST http://vision:8000/cameras/camera1/start-recording Content-Type: application/json { - "filename": "simple_test.avi" + "filename": "simple_test.mp4" } ### diff --git a/src/components/AutoRecordingTest.tsx b/src/components/AutoRecordingTest.tsx index 8670c11..0459047 100644 --- a/src/components/AutoRecordingTest.tsx +++ b/src/components/AutoRecordingTest.tsx @@ -52,7 +52,7 @@ export function AutoRecordingTest() { if (state === 'on') { // Simulate starting recording on the correct camera const result = await visionApi.startRecording(cameraName, { - filename: `test_auto_${machine}_${Date.now()}.avi` + filename: `test_auto_${machine}_${Date.now()}.mp4` }) event.result = result.success ? `✅ Recording started on ${cameraName}: ${result.filename}` : `❌ Failed: ${result.message}` } else { diff --git a/src/components/CameraConfigModal.tsx b/src/components/CameraConfigModal.tsx index b7b63a0..bf1971d 100644 --- a/src/components/CameraConfigModal.tsx +++ b/src/components/CameraConfigModal.tsx @@ -166,22 +166,39 @@ export function CameraConfigModal({ cameraName, isOpen, onClose, onSuccess, onEr if (!isOpen) return null return ( -