2828from rclpy .node import Node
2929from python_qt_binding .QtWidgets import QApplication , QMainWindow , QHBoxLayout , QVBoxLayout , QWidget
3030from python_qt_binding .QtCore import QTimer
31+ from std_msgs .msg import String
3132
3233# Import our modular components
3334from .ros_interface import CameraController , FrameReceiver
@@ -72,12 +73,15 @@ def __init__(self, node):
7273
7374 # Initialize ROS communication components
7475 self .camera_controller = CameraController (node )
75- self .frame_receiver = FrameReceiver (node , 'camera_frame ' )
76+ self .frame_receiver = FrameReceiver (node , '/coffee_bot/camera/image_raw ' )
7677
7778 # Initialize UI components
7879 self .camera_display = CameraDisplay ()
7980 self .control_panel = ControlPanel ()
8081
82+ # Set up state query publisher
83+ self .state_query_pub = node .create_publisher (String , '/coffee_bot/camera/query/state' , 10 )
84+
8185 # Set up connection timeout monitoring
8286 self .connection_timer = QTimer ()
8387 self .connection_timer .timeout .connect (self ._check_connection )
@@ -86,8 +90,8 @@ def __init__(self, node):
8690 self .init_ui ()
8791 self .setup_connections ()
8892
89- # Request initial camera scan after a short delay
90- QTimer .singleShot (1000 , self .control_panel . refresh_cameras_requested . emit )
93+ # Query camera_node state instead of sending commands
94+ QTimer .singleShot (1000 , self ._query_camera_node_state )
9195
9296 def init_ui (self ):
9397 """Initialize the user interface layout and components."""
@@ -120,6 +124,7 @@ def setup_connections(self):
120124 self .camera_controller .cameras_updated .connect (self .control_panel .update_camera_list )
121125 self .camera_controller .camera_status_updated .connect (self .control_panel .update_status )
122126 self .camera_controller .diagnostics_ready .connect (self .control_panel .show_diagnostics )
127+ self .camera_controller .state_received .connect (self .control_panel .sync_to_camera_state )
123128
124129 # Control panel to camera controller connections
125130 self .control_panel .camera_selected .connect (self .camera_controller .select_camera )
@@ -130,6 +135,24 @@ def setup_connections(self):
130135
131136 self .node .get_logger ().info ('Signal connections established between all components' )
132137
138+ def _query_camera_node_state (self ):
139+ """Query camera_node for its current state instead of sending commands"""
140+ self .node .get_logger ().info ('Querying camera_node for current state' )
141+
142+ # Send state query
143+ query_msg = String ()
144+ query_msg .data = "get_state"
145+ self .state_query_pub .publish (query_msg )
146+
147+ # Set up one-time listener for state response
148+ QTimer .singleShot (2000 , self ._setup_state_listener )
149+
150+ def _setup_state_listener (self ):
151+ """Set up listener for state response from camera_node"""
152+ # The state response comes through the same topic as camera list updates
153+ # We'll handle it in the existing camera_controller callback
154+ self .node .get_logger ().info ('Listening for camera_node state response' )
155+
133156 def _check_connection (self ):
134157 """Periodically check frame receiver connection status."""
135158 self .frame_receiver .check_connection_timeout ()
0 commit comments