@@ -1209,6 +1209,8 @@ def _setup_ros_control_interface(self):
12091209 Bool , '/coffee_bot/camera/cmd/face_detection' , self ._on_face_detection_command , 10 )
12101210 self .camera_refresh_sub = self .create_subscription (
12111211 String , '/coffee_bot/camera/cmd/refresh' , self ._on_camera_refresh_command , 10 )
1212+ self .diagnostics_request_sub = self .create_subscription (
1213+ String , '/coffee_bot/camera/cmd/diagnostics' , self ._on_diagnostics_request , 10 )
12121214
12131215 # Subscriber for state queries from separated UI
12141216 self .state_query_sub = self .create_subscription (
@@ -1275,6 +1277,80 @@ def _on_camera_refresh_command(self, msg):
12751277 status_msg .data = "Camera scan completed"
12761278 self .camera_status_pub .publish (status_msg )
12771279
1280+ def _on_diagnostics_request (self , msg ):
1281+ """Handle diagnostics request from separated UI"""
1282+ self .get_logger ().info ('Received diagnostics request from separated UI' )
1283+
1284+ # Generate diagnostics information
1285+ diagnostics_info = self ._generate_diagnostics_info ()
1286+
1287+ # Publish diagnostics response
1288+ diagnostics_msg = String ()
1289+ diagnostics_msg .data = diagnostics_info
1290+ self .diagnostics_pub .publish (diagnostics_msg )
1291+
1292+ self .get_logger ().info ('Published diagnostics information' )
1293+
1294+ def _generate_diagnostics_info (self ):
1295+ """Generate comprehensive diagnostics information"""
1296+ import os
1297+ import subprocess
1298+ import cv2
1299+
1300+ info = "Camera Node Diagnostics:\n \n "
1301+
1302+ # Check for video devices
1303+ video_devices = []
1304+ if os .path .exists ('/dev' ):
1305+ for device in os .listdir ('/dev' ):
1306+ if device .startswith ('video' ):
1307+ full_path = f"/dev/{ device } "
1308+ access = os .access (full_path , os .R_OK )
1309+ video_devices .append (f"{ full_path } (Readable: { access } )" )
1310+
1311+ if video_devices :
1312+ info += "Video Devices:\n " + "\n " .join (video_devices ) + "\n \n "
1313+ else :
1314+ info += "No video devices found!\n \n "
1315+
1316+ # OpenCV version and backend info
1317+ info += f"OpenCV Version: { cv2 .__version__ } \n "
1318+
1319+ # Camera state
1320+ if hasattr (self , 'ui' ) and hasattr (self .ui , 'frame_grabber' ):
1321+ info += f"Frame Grabber Running: { self .ui .frame_grabber .running } \n "
1322+ info += f"Current Camera Index: { getattr (self .ui .frame_grabber , 'camera_index' , 'Unknown' )} \n "
1323+ info += f"Frame Dimensions: { getattr (self .ui .frame_grabber , 'frame_width' , 'Unknown' )} x{ getattr (self .ui .frame_grabber , 'frame_height' , 'Unknown' )} \n "
1324+ info += f"Face Detection: { 'Enabled' if getattr (self .ui .frame_grabber , 'enable_face_detection' , False ) else 'Disabled' } \n \n "
1325+
1326+ # ROS Topics
1327+ info += "Active ROS Publishers:\n "
1328+ info += "- /coffee_bot/camera/image_raw (camera frames)\n "
1329+ info += "- /coffee_bot/camera/status/info (status updates)\n "
1330+ info += "- /coffee_bot/camera/status/available (camera list)\n "
1331+ info += "- /coffee_bot/camera/status/diagnostics (this message)\n "
1332+ info += "- /vision/face_position (face tracking)\n "
1333+ info += "- face_detection_data (face data)\n \n "
1334+
1335+ info += "Active ROS Subscribers:\n "
1336+ info += "- /coffee_bot/camera/cmd/select (camera selection)\n "
1337+ info += "- /coffee_bot/camera/cmd/quality (quality control)\n "
1338+ info += "- /coffee_bot/camera/cmd/face_detection (face detection toggle)\n "
1339+ info += "- /coffee_bot/camera/cmd/refresh (camera refresh)\n "
1340+ info += "- /coffee_bot/camera/cmd/diagnostics (this request)\n "
1341+ info += "- /coffee_bot/camera/query/state (state queries)\n \n "
1342+
1343+ # Available cameras
1344+ if hasattr (self , 'ui' ) and hasattr (self .ui , 'available_cameras' ):
1345+ camera_count = len (getattr (self .ui , 'available_cameras' , []))
1346+ info += f"Available Cameras: { camera_count } \n "
1347+ for idx , name in getattr (self .ui , 'available_cameras' , []):
1348+ info += f" - { name } (index: { idx } )\n "
1349+ else :
1350+ info += "Available Cameras: Not scanned yet\n "
1351+
1352+ return info
1353+
12781354 def _on_state_query (self , msg ):
12791355 """Handle state query from separated UI and respond with current camera state"""
12801356 self .get_logger ().info ('Received state query from separated UI' )
0 commit comments