1+ import copy
2+
13from pymavlink import mavutil
24from typing_extensions import TypedDict
35
46import app .droneStatus as droneStatus
57from app import logger , socketio
8+ from app .drone import DATASTREAM_RATES
69from app .utils import (
710 missingParameterError ,
811 sendMessage ,
@@ -48,6 +51,17 @@ class SetStreamRateType(TypedDict):
4851}
4952
5053
54+ DASHBOARD_STREAM_RATES = copy .deepcopy (DATASTREAM_RATES )
55+
56+
57+ def apply_dashboard_stream_rates () -> None :
58+ if not droneStatus .drone :
59+ return
60+
61+ for stream , rate in DASHBOARD_STREAM_RATES .items ():
62+ droneStatus .drone .sendDataStreamRequestMessage (stream , rate )
63+
64+
5165@socketio .on ("set_state" )
5266def set_state (data : SetStateType ) -> None :
5367 """
@@ -73,29 +87,37 @@ def set_state(data: SetStateType) -> None:
7387 # Remove all existing message listeners
7488 droneStatus .drone .clearAllMessageListeners ()
7589
76- # Always setup position stream to get GLOBAL_POSITION_INT messages
77- droneStatus .drone .setupSingleDataStream (mavutil .mavlink .MAV_DATA_STREAM_POSITION )
90+ # Always setup position stream to get GLOBAL_POSITION_INT messages on
91+ # non-dashboard pages
92+ if droneStatus .state != "dashboard" :
93+ droneStatus .drone .sendDataStreamRequestMessage (
94+ mavutil .mavlink .MAV_DATA_STREAM_POSITION , 1
95+ )
7896
7997 for message in GLOBAL_MESSAGE_LISTENERS :
8098 droneStatus .drone .addMessageListener (message , sendMessage )
8199
82100 if droneStatus .state == "dashboard" :
83- droneStatus . drone . setupDataStreams ()
101+ apply_dashboard_stream_rates ()
84102 for message in STATES_MESSAGE_LISTENERS ["dashboard" ]:
85103 droneStatus .drone .addMessageListener (message , sendMessage )
86104
87105 elif droneStatus .state == "missions" :
88- droneStatus .drone .setupSingleDataStream (
89- mavutil .mavlink .MAV_DATA_STREAM_EXTENDED_STATUS
106+ droneStatus .drone .sendDataStreamRequestMessage (
107+ mavutil .mavlink .MAV_DATA_STREAM_EXTENDED_STATUS , 1
90108 )
91109 for message in STATES_MESSAGE_LISTENERS ["missions" ]:
92110 droneStatus .drone .addMessageListener (message , sendMessage )
93111 elif droneStatus .state == "graphs" :
94- droneStatus .drone .setupSingleDataStream (
95- mavutil .mavlink .MAV_DATA_STREAM_EXTENDED_STATUS
112+ droneStatus .drone .sendDataStreamRequestMessage (
113+ mavutil .mavlink .MAV_DATA_STREAM_EXTENDED_STATUS , 1
114+ )
115+ droneStatus .drone .sendDataStreamRequestMessage (
116+ mavutil .mavlink .MAV_DATA_STREAM_EXTRA1 , 4
117+ )
118+ droneStatus .drone .sendDataStreamRequestMessage (
119+ mavutil .mavlink .MAV_DATA_STREAM_EXTRA2 , 3
96120 )
97- droneStatus .drone .setupSingleDataStream (mavutil .mavlink .MAV_DATA_STREAM_EXTRA1 )
98- droneStatus .drone .setupSingleDataStream (mavutil .mavlink .MAV_DATA_STREAM_EXTRA2 )
99121
100122 for message in STATES_MESSAGE_LISTENERS ["graphs" ]:
101123 droneStatus .drone .addMessageListener (message , sendMessage )
@@ -128,11 +150,25 @@ def set_stream_rate(data: SetStreamRateType):
128150 return
129151
130152 if (rate := data .get ("rate" , None )) is None :
131- return missingParameterError ("set_state" , "state" )
153+ return missingParameterError ("set_stream_rate" , "rate" )
154+
155+ if (stream := data .get ("stream" , None )) is None :
156+ return missingParameterError ("set_stream_rate" , "stream" )
157+
158+ try :
159+ rate = int (rate )
160+ stream = int (stream )
161+ except (ValueError , TypeError ):
162+ logger .error ("Invalid set_stream_rate payload types" )
163+ return
132164
133165 if rate > 15 or rate < 0 :
134166 logger .error ("Cannot set data stream rate outside of range [0, 15]" )
135167 return
136168
137- logger .info (f"Setting data stream rate { data ['rate' ]} " )
138- droneStatus .drone .sendDataStreamRequestMessage (data ["stream" ], rate )
169+ DASHBOARD_STREAM_RATES [stream ] = rate
170+
171+ # Dashboard-only behavior: only apply immediately while dashboard is active.
172+ if droneStatus .state == "dashboard" :
173+ logger .info (f"Setting dashboard data stream { stream } rate to { rate } " )
174+ droneStatus .drone .sendDataStreamRequestMessage (stream , rate )
0 commit comments