wait update RX cam sub
This commit is contained in:
		
							parent
							
								
									5bf2d49e6b
								
							
						
					
					
						commit
						80d9c925de
					
				
					 3 changed files with 530 additions and 60 deletions
				
			
		| 
						 | 
				
			
			@ -822,6 +822,31 @@ def get_camera_stability_data(camera_id, model_id):
 | 
			
		|||
    
 | 
			
		||||
    return _camera_stability_tracking[camera_id][model_id]
 | 
			
		||||
 | 
			
		||||
def reset_camera_stability_tracking(camera_id, model_id):
 | 
			
		||||
    """Reset all stability tracking data for a specific camera and model."""
 | 
			
		||||
    if camera_id in _camera_stability_tracking and model_id in _camera_stability_tracking[camera_id]:
 | 
			
		||||
        stability_data = _camera_stability_tracking[camera_id][model_id]
 | 
			
		||||
        
 | 
			
		||||
        # Clear all tracking data
 | 
			
		||||
        track_counters = stability_data["track_stability_counters"]
 | 
			
		||||
        stable_tracks = stability_data["stable_tracks"]
 | 
			
		||||
        
 | 
			
		||||
        old_counters = dict(track_counters)
 | 
			
		||||
        old_stable = list(stable_tracks)
 | 
			
		||||
        
 | 
			
		||||
        track_counters.clear()
 | 
			
		||||
        stable_tracks.clear()
 | 
			
		||||
        
 | 
			
		||||
        # Reset occupancy state to validation
 | 
			
		||||
        stability_data["occupancy_state"]["phase"] = "validation"
 | 
			
		||||
        stability_data["occupancy_state"]["absence_counter"] = 0
 | 
			
		||||
        stability_data["occupancy_state"]["pipeline_completed"] = False
 | 
			
		||||
        
 | 
			
		||||
        logger.info(f"🧹 Camera {camera_id}: CLEARED stability tracking - old_counters={old_counters}, old_stable={old_stable}")
 | 
			
		||||
        # Occupancy state reset logging removed - not used in enhanced lightweight mode
 | 
			
		||||
    else:
 | 
			
		||||
        logger.debug(f"🧹 Camera {camera_id}: No stability tracking data to clear for model {model_id}")
 | 
			
		||||
 | 
			
		||||
def update_single_track_stability(node, detection, camera_id, frame_shape=None, stability_threshold=4):
 | 
			
		||||
    """Update track stability validation for a single highest confidence car."""
 | 
			
		||||
    model_id = node.get("modelId", "unknown")
 | 
			
		||||
| 
						 | 
				
			
			@ -932,21 +957,13 @@ def update_single_track_stability(node, detection, camera_id, frame_shape=None,
 | 
			
		|||
            logger.debug(f"⏳ Camera {camera_id}: Stable track {current_track_id} still present")
 | 
			
		||||
        
 | 
			
		||||
    elif current_phase == "occupancy":
 | 
			
		||||
        # ═══ OCCUPANCY PHASE: Monitor track presence ═══
 | 
			
		||||
        logger.debug(f"🏢 Camera {camera_id}: OCCUPANCY MONITORING")
 | 
			
		||||
        logger.debug(f"🏢 Camera {camera_id}: Current track_id: {current_track_id}, Stable tracks: {list(stable_tracks)}")
 | 
			
		||||
        logger.debug(f"🏢 Camera {camera_id}: Absence counter before: {occupancy_state['absence_counter']}")
 | 
			
		||||
        
 | 
			
		||||
        # ═══ OCCUPANCY PHASE: UNUSED in enhanced lightweight mode ═══
 | 
			
		||||
        # This phase is bypassed by the new lightweight mode system
 | 
			
		||||
        # Keeping minimal logic for backward compatibility but no CLI logging
 | 
			
		||||
        if current_track_id is not None and current_track_id in stable_tracks:
 | 
			
		||||
            old_absence = occupancy_state["absence_counter"]
 | 
			
		||||
            occupancy_state["absence_counter"] = 0
 | 
			
		||||
            if old_absence > 0:
 | 
			
		||||
                logger.debug(f"🏢 Camera {camera_id}: Stable car returned - absence counter reset from {old_absence} to 0")
 | 
			
		||||
        else:
 | 
			
		||||
            occupancy_state["absence_counter"] += 1
 | 
			
		||||
            logger.debug(f"🏢 Camera {camera_id}: Stable car absent - absence counter: {occupancy_state['absence_counter']}")
 | 
			
		||||
            if occupancy_state["absence_counter"] == 1:
 | 
			
		||||
                logger.info(f"👻 Camera {camera_id}: Stable car disappeared - absence counter: {occupancy_state['absence_counter']}")
 | 
			
		||||
    
 | 
			
		||||
    # Final return - validation not complete
 | 
			
		||||
    result = {
 | 
			
		||||
| 
						 | 
				
			
			@ -1157,11 +1174,11 @@ def occupancy_detector(camera_id, model_id, enable=True):
 | 
			
		|||
    if enable:
 | 
			
		||||
        session_state["occupancy_mode"] = True
 | 
			
		||||
        session_state["occupancy_enabled_at"] = time.time()
 | 
			
		||||
        logger.info(f"Camera {camera_id}: 🏢 OCCUPANCY MODE ENABLED - model will stop after pipeline completion")
 | 
			
		||||
        # Occupancy mode logging removed - not used in enhanced lightweight mode
 | 
			
		||||
    else:
 | 
			
		||||
        session_state["occupancy_mode"] = False
 | 
			
		||||
        session_state.pop("occupancy_enabled_at", None)
 | 
			
		||||
        logger.info(f"Camera {camera_id}: 🔄 OCCUPANCY MODE DISABLED - model will continue running")
 | 
			
		||||
        # Occupancy mode logging removed - not used in enhanced lightweight mode
 | 
			
		||||
    
 | 
			
		||||
    return session_state.get("occupancy_mode", False)
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -1534,7 +1551,7 @@ def run_pipeline(frame, node: dict, return_bbox: bool=False, context=None):
 | 
			
		|||
                
 | 
			
		||||
                if absence_counter >= max_absence_frames:
 | 
			
		||||
                    # Stable tracks have been absent for too long - trigger "none" detection and reset
 | 
			
		||||
                    logger.info(f"🕒 Camera {camera_id}: OCCUPANCY TIMEOUT - Stable tracks absent for {absence_counter} frames, resetting to validation (sessionId: {backend_session_id or 'none'})")
 | 
			
		||||
                    # Occupancy timeout logging removed - not used in enhanced lightweight mode
 | 
			
		||||
                    
 | 
			
		||||
                    # Reset occupancy state to validation phase
 | 
			
		||||
                    stability_data = get_camera_stability_data(camera_id, model_id)
 | 
			
		||||
| 
						 | 
				
			
			@ -1552,10 +1569,12 @@ def run_pipeline(frame, node: dict, return_bbox: bool=False, context=None):
 | 
			
		|||
                    # Still in occupancy phase - check if stable tracks are present
 | 
			
		||||
                    if stable_tracks_present:
 | 
			
		||||
                        # Stable tracks detected - continue with cached result or light processing
 | 
			
		||||
                        logger.debug(f"👁️ Camera {camera_id}: OCCUPANCY PHASE - stable tracks present: {set(stable_tracks) & set(current_tracks)} (sessionId: {backend_session_id or 'none'})")
 | 
			
		||||
                        # Occupancy phase logging removed - not used in enhanced lightweight mode
 | 
			
		||||
                        pass
 | 
			
		||||
                    else:
 | 
			
		||||
                        # No stable tracks - absence counter was already incremented in track validation
 | 
			
		||||
                        logger.debug(f"👁️ Camera {camera_id}: OCCUPANCY PHASE - stable tracks absent {absence_counter}/{max_absence_frames} (sessionId: {backend_session_id or 'none'})")
 | 
			
		||||
                        # Occupancy phase logging removed - not used in enhanced lightweight mode
 | 
			
		||||
                        pass
 | 
			
		||||
                    
 | 
			
		||||
                    # Continue with normal pipeline processing
 | 
			
		||||
                    pass
 | 
			
		||||
| 
						 | 
				
			
			@ -1760,7 +1779,7 @@ def run_pipeline(frame, node: dict, return_bbox: bool=False, context=None):
 | 
			
		|||
            model_id = node.get("modelId", "unknown")
 | 
			
		||||
            
 | 
			
		||||
            # Enable occupancy detector automatically after first successful pipeline
 | 
			
		||||
            logger.info(f"Camera {camera_id}: Pipeline completed successfully - auto-enabling occupancy mode")
 | 
			
		||||
            # Auto-enabling occupancy logging removed - not used in enhanced lightweight mode
 | 
			
		||||
            occupancy_detector(camera_id, model_id, enable=True)
 | 
			
		||||
            
 | 
			
		||||
            logger.info(f"✅ Camera {camera_id}: Pipeline completed, detection data will be sent to backend")
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue