@@ -43,9 +43,15 @@ function setup_connect(button_svg, button_color) {
4343
4444 const url_input = tip_div . querySelector ( `input[id="target_url"]` )
4545
46+ const heartbeat_checkbox = tip_div . querySelector ( `input[id="send_heartbeat"]` )
47+ const passphrase_input = tip_div . querySelector ( `input[id="signing_passphrase"]` )
48+
4649 const connect_button = tip_div . querySelector ( `input[id="connection_button"]` )
4750 const disconnect_button = tip_div . querySelector ( `input[id="disconnection_button"]` )
4851
52+ const system_id_input = tip_div . querySelector ( `input[id="system_id"]` ) ;
53+ const component_id_input = tip_div . querySelector ( `input[id="component_id"]` ) ;
54+
4955 // Websocket object
5056 let ws = null
5157 let expecting_close = false
@@ -60,6 +66,17 @@ function setup_connect(button_svg, button_color) {
6066 }
6167 set_inputs ( false )
6268
69+ function apply_ids ( ) {
70+ // clamp to valid ranges; fall back to GCS-like defaults 255/190
71+ let sid = parseInt ( system_id_input ?. value || "255" , 10 ) ;
72+ let cid = parseInt ( component_id_input ?. value || "190" , 10 ) ;
73+ if ( ! Number . isFinite ( sid ) || sid < 1 || sid > 255 ) sid = 255 ;
74+ if ( ! Number . isFinite ( cid ) || cid < 0 || cid > 255 ) cid = 190 ;
75+
76+ MAVLink . srcSystem = sid ;
77+ MAVLink . srcComponent = cid ;
78+ }
79+
6380 // Connect to WebSocket server
6481 function connect ( target , auto_connect ) {
6582 // Make sure we are not connected to something else
@@ -82,6 +99,9 @@ function setup_connect(button_svg, button_color) {
8299 ws . onopen = ( ) => {
83100 button_color ( "green" )
84101
102+ // setup system IDs
103+ apply_ids ( ) ;
104+
85105 // Hide tip
86106 tip . hide ( )
87107
@@ -92,8 +112,47 @@ function setup_connect(button_svg, button_color) {
92112 url_input . value = target
93113
94114 // Have been connected
95- been_connected = true
96- }
115+ been_connected = true ;
116+ setup_passphase = false ;
117+
118+ heartbeat_interval = setInterval ( ( ) => {
119+ try {
120+ if ( ! setup_passphase ) {
121+ const passphrase = passphrase_input . value . trim ( ) ;
122+ if ( passphrase . length > 0 ) {
123+ setup_passphase = true ;
124+ const enc = new TextEncoder ( ) ;
125+ const data = enc . encode ( passphrase ) ;
126+ const hash = mavlink20 . sha256 ( data ) ;
127+ MAVLink . signing . secret_key = new Uint8Array ( hash ) ;
128+ MAVLink . signing . sign_outgoing = true ;
129+ }
130+ }
131+
132+ if ( heartbeat_checkbox . checked ) {
133+ const msg = new mavlink20 . messages . heartbeat (
134+ 6 , // MAV_TYPE_GCS
135+ 8 , // MAV_AUTOPILOT_INVALID
136+ 0 , // base_mode
137+ 0 , // custom_mode
138+ 4 // MAV_STATE_ACTIVE
139+ ) ;
140+ const pkt = msg . pack ( MAVLink ) ;
141+ ws . send ( Uint8Array . from ( pkt ) ) ;
142+ //console.log("Sent HEARTBEAT", pkt);
143+ }
144+ } catch ( e ) {
145+ console . error ( "Error sending HEARTBEAT:" , e . message ) ;
146+ console . error ( e . stack ) ;
147+
148+ if ( heartbeat_interval !== null ) {
149+ clearInterval ( heartbeat_interval )
150+ heartbeat_interval = null
151+ console . warn ( "Heartbeat disabled; will retry on reconnect." )
152+ }
153+ }
154+ } , 1000 ) ;
155+ }
97156
98157 ws . onclose = ( ) => {
99158 if ( ( auto_connect === true ) && ! been_connected ) {
@@ -115,10 +174,15 @@ function setup_connect(button_svg, button_color) {
115174 }
116175
117176 ws . onmessage = ( msg ) => {
118- // Feed data to MAVLink parser and forward messages
119- for ( const char of new Uint8Array ( msg . data ) ) {
120- const m = MAVLink . parseChar ( char )
121- if ( ( m != null ) && ( m . _id != - 1 ) ) {
177+ // Feed data to MAVLink parser and forward messages
178+ MAVLink . pushBuffer ( new Uint8Array ( msg . data ) ) ;
179+ while ( true ) {
180+ const m = MAVLink . parseChar ( null ) ;
181+ if ( m === null ) {
182+ break ;
183+ }
184+ if ( m . _id != - 1 ) {
185+ //console.log(m);
122186 // Got message with known ID
123187 // Sent to each Widget
124188 for ( const widget of grid . getGridItems ( ) ) {
@@ -130,7 +194,6 @@ function setup_connect(button_svg, button_color) {
130194 }
131195 }
132196 }
133-
134197 }
135198
136199 // Disconnect from WebSocket server
0 commit comments