mavtables  0.2.1
MAVLink router and firewall.
packet_scripter.py
Go to the documentation of this file.
1 #!/usr/bin/env python
2 
3 from __future__ import (absolute_import, division,
4  print_function, unicode_literals)
5 from builtins import *
6 
7 import os
8 import sys
9 from time import sleep
10 from argparse import ArgumentParser
11 from threading import Thread
12 from pymavlink import mavutil
13 from datetime import datetime, timedelta
14 
15 
16 def send_packet(mav, packet, system=0, component=0):
17  def a(n):
18  return tuple(range(0, n))
19  def b(n):
20  return bytes(range(0, n))
21  if packet == 'SYS_STATUS': # 1
22  mav.mav.sys_status_send(*a(13))
23  elif packet == 'SYSTEM_TIME': # 2
24  mav.mav.system_time_send(*a(2))
25  elif packet == 'PING': # 4
26  args = a(2) + (system, component)
27  mav.mav.ping_send(*args)
28  elif packet == 'CHANGE_OPERATOR_CONTROL': # 5
29  args = (system,) + a(2) + (b(25),)
30  mav.mav.change_operator_control_send(*args)
31  elif packet == 'CHANGE_OPERATOR_CONTROL_ACK': # 6
32  mav.mav.change_operator_control_ack_send(*a(3))
33  elif packet == 'AUTH_KEY': # 7
34  mav.mav.auth_key_send(b(32))
35  elif packet == 'PARAM_REQUEST_READ': # 20
36  mav.mav.param_request_read_send(system, component, b(16), 1)
37  elif packet == 'PARAM_REQUEST_LIST': # 21
38  mav.mav.param_request_list_send(system, component)
39  elif packet == 'PARAM_VALUE': # 22
40  mav.mav.param_value_send(b(16), *a(4))
41  elif packet == 'PARAM_SET': # 23
42  mav.mav.param_set_send(system, component, b(16), *a(2))
43  elif packet == 'GPS_RAW_INT': # 24
44  if mav.mavlink20():
45  mav.mav.gps_raw_int_send(*a(15))
46  else:
47  mav.mav.gps_raw_int_send(*a(10))
48  elif packet == 'GPS_STATUS': # 25
49  mav.mav.gps_status_send(1, b(20), b(20), b(20), b(20), b(20))
50  elif packet == 'SCALED_IMU': # 26
51  mav.mav.scaled_imu_send(*a(10))
52  elif packet == 'RAW_IMU': # 27
53  mav.mav.raw_imu_send(*a(10))
54  elif packet == 'RAW_PRESSURE': # 28
55  mav.mav.raw_pressure_send(*a(5))
56  elif packet == 'SCALED_PRESSURE': # 29
57  mav.mav.scaled_pressure_send(*a(4))
58  elif packet == 'ATTITUDE': # 30
59  mav.mav.attitude_send(*a(7))
60  elif packet == 'ATTITUDE_QUATERNION': # 31
61  mav.mav.attitude_quaternion_send(*a(8))
62  elif packet == 'LOCAL_POSITION_NED': # 32
63  mav.mav.local_position_ned_send(*a(7))
64  elif packet == 'GLOBAL_POSITION_INT': # 33
65  mav.mav.global_position_int_send(*a(9))
66  elif packet == 'RC_CHANNELS_SCALED': # 34
67  mav.mav.rc_channels_scaled_send(*a(11))
68  elif packet == 'RC_CHANNELS_RAW': # 35
69  mav.mav.rc_channels_raw_send(*a(11))
70  elif packet == 'SERVO_OUTPUT_RAW': # 36
71  if mav.mavlink20():
72  mav.mav.servo_output_raw_send(*a(18))
73  else:
74  mav.mav.servo_output_raw_send(*a(10))
75  elif packet == 'MISSION_REQUEST_PARTIAL_LIST': # 37
76  if mav.mavlink20():
77  mav.mav.mission_request_partial_list_send(system, component, *a(3))
78  else:
79  mav.mav.mission_request_partial_list_send(system, component, *a(2))
80  elif packet == 'MISSION_WRITE_PARTIAL_LIST': # 38
81  if mav.mavlink20():
82  mav.mav.mission_write_partial_list_send(system, component, *a(3))
83  else:
84  mav.mav.mission_write_partial_list_send(system, component, *a(2))
85  elif packet == 'MISSION_ITEM': # 39
86  if mav.mavlink20():
87  mav.mav.mission_item_send(system, component, *a(13))
88  else:
89  mav.mav.mission_item_send(system, component, *a(12))
90  elif packet == 'MISSION_REQUEST': # 40
91  if mav.mavlink20():
92  mav.mav.mission_request_send(system, component, *a(2))
93  else:
94  mav.mav.mission_request_send(system, component, 1)
95  elif packet == 'MISSION_SET_CURRENT': # 41
96  mav.mav.mission_set_current_send(system, component, 1)
97  elif packet == 'MISSION_CURRENT': # 42
98  mav.mav.mission_current_send(1)
99  elif packet == 'MISSION_REQUEST_LIST': # 43
100  if mav.mavlink20():
101  mav.mav.mission_request_list_send(system, component, 1)
102  else:
103  mav.mav.mission_request_list_send(system, component)
104  elif packet == 'MISSION_COUNT': # 44
105  if mav.mavlink20():
106  mav.mav.mission_count_send(system, component, *a(2))
107  else:
108  mav.mav.mission_count_send(system, component, 1)
109  elif packet == 'MISSION_CLEAR_ALL': # 45
110  if mav.mavlink20():
111  mav.mav.mission_clear_all_send(system, component, 1)
112  else:
113  mav.mav.mission_clear_all_send(system, component)
114  elif packet == 'MISSION_ITEM_REACHED': # 46
115  mav.mav.mission_item_reached_send(1)
116  elif packet == 'MISSION_ACK': # 47
117  if mav.mavlink20():
118  mav.mav.mission_ack_send(system, component, *a(2))
119  else:
120  mav.mav.mission_ack_send(system, component, 1)
121  elif packet == 'SET_GPS_GLOBAL_ORIGIN': # 48
122  if mav.mavlink20():
123  mav.mav.set_gps_global_origin_send(system, *a(4))
124  else:
125  mav.mav.set_gps_global_origin_send(system, *a(3))
126  elif packet == 'GPS_GLOBAL_ORIGIN': # 49
127  if mav.mavlink20():
128  mav.mav.gps_global_origin_send(*a(4))
129  else:
130  mav.mav.gps_global_origin_send(*a(3))
131  elif packet == 'PARAM_MAP_RC': # 50
132  mav.mav.param_map_rc_send(system, component, b(16), *a(6))
133  elif packet == 'MISSION_REQUEST_INT': # 51
134  if mav.mavlink20():
135  mav.mav.mission_request_int_send(system, component, *a(2))
136  else:
137  mav.mav.mission_request_int_send(system, component, 1)
138  elif packet == 'SAFETY_SET_ALLOWED_AREA': # 54
139  mav.mav.safety_set_allowed_area_send(system, component, *a(7))
140  elif packet == 'SAFETY_ALLOWED_AREA': # 55
141  mav.mav.safety_allowed_area_send(*a(7))
142  elif packet == 'ATTITUDE_QUATERNION_COV': # 61
143  args = (1, b(4)) + a(3) + (b(9),)
144  mav.mav.attitude_quaternion_cov_send(*args)
145  elif packet == 'NAV_CONTROLLER_OUTPUT': # 62
146  mav.mav.nav_controller_output_send(*a(8))
147  elif packet == 'GLOBAL_POSITION_INT_COV': # 63
148  args = a(9) + (b(36),)
149  mav.mav.global_position_int_cov_send(*args)
150  elif packet == 'LOCAL_POSITION_NED_COV': # 64
151  args = a(11) + (b(45),)
152  mav.mav.local_position_ned_cov_send(*args)
153  elif packet == 'RC_CHANNELS': # 65
154  mav.mav.rc_channels_send(*a(21))
155  elif packet == 'MANUAL_CONTROL': # 69
156  mav.mav.manual_control_send(system, *a(5))
157  elif packet == 'RC_CHANNELS_OVERRIDE': # 70
158  mav.mav.rc_channels_override_send(system, component, *a(8))
159  elif packet == 'MISSION_ITEM_INT': # 73
160  if mav.mavlink20():
161  mav.mav.mission_item_int_send(system, component, *a(13))
162  else:
163  mav.mav.mission_item_int_send(system, component, *a(12))
164  elif packet == 'VFR_HUD': # 74
165  mav.mav.vfr_hud_send(*a(6))
166  elif packet == 'COMMAND_INT': # 75
167  mav.mav.command_int_send(system, component, *a(11))
168  elif packet == 'COMMAND_LONG': # 76
169  mav.mav.command_long_send(system, component, *a(9))
170  elif packet == 'COMMAND_ACK': # 77
171  mav.mav.command_ack_send(*a(2))
172  elif packet == 'MANUAL_SETPOINT': # 81
173  mav.mav.manual_setpoint_send(*a(7))
174  elif packet == 'SET_ATTITUDE_TARGET': # 82
175  mav.mav.set_attitude_target_send(1, system, component, 1, b(4), *a(4))
176  elif packet == 'ATTITUDE_TARGET': # 83
177  args = a(2) + (b(4), ) + a(4)
178  mav.mav.attitude_target_send(*args)
179  elif packet == 'SET_POSITION_TARGET_LOCAL_NED': # 84
180  mav.mav.set_position_target_local_ned_send(
181  1, system, component, *a(13))
182  elif packet == 'POSITION_TARGET_LOCAL_NED': # 85
183  mav.mav.position_target_local_ned_send(*a(14))
184  elif packet == 'SET_POSITION_TARGET_GLOBAL_INT': # 86
185  mav.mav.set_position_target_global_int_send(
186  1, system, component, *a(13))
187  elif packet == 'POSITION_TARGET_GLOBAL_INT': # 87
188  mav.mav.position_target_global_int_send(*a(14))
189  elif packet == 'LOCAL_POSITION_NED_SYSTEM_GLOBAL_OFFSET': # 89
190  mav.mav.local_position_ned_system_global_offset_send(*a(7))
191  elif packet == 'HIL_CONTROLS': # 91
192  mav.mav.hil_controls_send(*a(11))
193  elif packet == 'HIL_RC_INPUTS_RAW': # 92
194  mav.mav.hil_rc_inputs_raw_send(*a(14))
195  elif packet == 'HIL_ACTUATOR_CONTROLS': # 93
196  mav.mav.hil_actuator_controls_send(1, b(16), *a(2))
197  elif packet == 'OPTICAL_FLOW': # 100
198  if mav.mavlink20():
199  mav.mav.optical_flow_send(*a(10))
200  else:
201  mav.mav.optical_flow_send(*a(8))
202  elif packet == 'GLOBAL_VISION_POSITION_ESTIMATE': # 101
203  if mav.mavlink20():
204  args = a(7) + (b(21),)
205  mav.mav.global_vision_position_estimate_send(*args)
206  else:
207  mav.mav.global_vision_position_estimate_send(*a(7))
208  elif packet == 'VISION_POSITION_ESTIMATE': # 102
209  if mav.mavlink20():
210  args = a(7) + (b(21),)
211  mav.mav.vision_position_estimate_send(*args)
212  else:
213  mav.mav.vision_position_estimate_send(*a(7))
214  elif packet == 'VISION_SPEED_ESTIMATE': # 103
215  if mav.mavlink20():
216  args = a(4) + (b(9),)
217  mav.mav.vision_speed_estimate_send(*args)
218  else:
219  mav.mav.vision_speed_estimate_send(*a(4))
220  elif packet == 'VICON_POSITION_ESTIMATE': # 104
221  if mav.mavlink20():
222  args = a(7) + (b(21),)
223  mav.mav.vicon_position_estimate_send(*args)
224  else:
225  mav.mav.vicon_position_estimate_send(*a(7))
226  elif packet == 'HIGHRES_IMU': # 105
227  mav.mav.highres_imu_send(*a(15))
228  elif packet == 'OPTICAL_FLOW_RAD': # 106
229  mav.mav.optical_flow_rad_send(*a(12))
230  elif packet == 'HIL_SENSOR': # 107
231  mav.mav.hil_sensor_send(*a(15))
232  elif packet == 'SIM_STATE': # 108
233  mav.mav.sim_state_send(*a(21))
234  elif packet == 'RADIO_STATUS': # 109
235  mav.mav.radio_status_send(*a(7))
236  elif packet == 'FILE_TRANSFER_PROTOCOL': # 110
237  mav.mav.file_transfer_protocol_send(0, system, component, b(251))
238  elif packet == 'TIMESYNC': # 111
239  mav.mav.timesync_send(*a(2))
240  elif packet == 'CAMERA_TRIGGER': # 112
241  mav.mav.camera_trigger_send(*a(2))
242  elif packet == 'HIL_GPS': # 113
243  mav.mav.hil_gps_send(*a(13))
244  elif packet == 'HIL_OPTICAL_FLOW': # 114
245  mav.mav.hil_optical_flow_send(*a(12))
246  elif packet == 'HIL_STATE_QUATERNION': # 115
247  mav.mav.hil_state_quaternion_send(1, b(4), *a(14))
248  elif packet == 'SCALED_IMU2': # 116
249  mav.mav.scaled_imu2_send(*a(10))
250  elif packet == 'LOG_REQUEST_LIST': # 117
251  mav.mav.log_request_list_send(system, component, *a(2))
252  elif packet == 'LOG_ENTRY': # 118
253  mav.mav.log_entry_send(*a(5))
254  elif packet == 'LOG_REQUEST_DATA': # 119
255  mav.mav.log_request_data_send(system, component, *a(3))
256  elif packet == 'LOG_DATA': # 120
257  args = a(3) + (b(90),)
258  mav.mav.log_data_send(*args)
259  elif packet == 'LOG_ERASE': # 121
260  mav.mav.log_erase_send(system, component)
261  elif packet == 'LOG_REQUEST_END': # 122
262  mav.mav.log_request_end_send(system, component)
263  elif packet == 'GPS_INJECT_DATA': # 123
264  mav.mav.gps_inject_data_send(system, component, 110, b(110))
265  elif packet == 'GPS2_RAW': # 124
266  mav.mav.gps2_raw_send(*a(12))
267  elif packet == 'POWER_STATUS': # 125
268  mav.mav.power_status_send(*a(3))
269  elif packet == 'SERIAL_CONTROL': # 126
270  args = a(5) + (b(70),)
271  mav.mav.serial_control_send(*args)
272  elif packet == 'GPS_RTK': # 127
273  mav.mav.gps_rtk_send(*a(13))
274  elif packet == 'GPS2_RTK': # 128
275  mav.mav.gps2_rtk_send(*a(13))
276  elif packet == 'SCALED_IMU3': # 129
277  mav.mav.scaled_imu3_send(*a(10))
278  elif packet == 'DATA_TRANSMISSION_HANDSHAKE': # 130
279  mav.mav.data_transmission_handshake_send(*a(7))
280  elif packet == 'ENCAPSULATED_DATA': # 131
281  mav.mav.encapsulated_data_send(1, b(253))
282  elif packet == 'DISTANCE_SENSOR': # 132
283  mav.mav.distance_sensor_send(*a(8))
284  elif packet == 'TERRAIN_REQUEST': # 133
285  mav.mav.terrain_request_send(*a(4))
286  elif packet == 'TERRAIN_DATA': # 134
287  args = a(4) + (b(16),)
288  mav.mav.terrain_data_send(*args)
289  elif packet == 'TERRAIN_CHECK': # 135
290  mav.mav.terrain_check_send(*a(2))
291  elif packet == 'TERRAIN_REPORT': # 136
292  mav.mav.terrain_report_send(*a(7))
293  elif packet == 'SCALED_PRESSURE2': # 137
294  mav.mav.scaled_pressure2_send(*a(4))
295  elif packet == 'ATT_POS_MOCAP': # 138
296  if mav.mavlink20():
297  args = (1, b(4)) + a(3) + (b(21),)
298  mav.mav.att_pos_mocap_send(*args)
299  else:
300  mav.mav.att_pos_mocap_send(1, b(4), *a(3))
301  elif packet == 'SET_ACTUATOR_CONTROL_TARGET': # 139
302  args = a(2) + (system, component, b(8))
303  mav.mav.set_actuator_control_target_send(*args)
304  elif packet == 'ACTUATOR_CONTROL_TARGET': # 140
305  args = a(2) + (b(8),)
306  mav.mav.actuator_control_target_send(*args)
307  elif packet == 'ALTITUDE': # 141
308  mav.mav.altitude_send(*a(7))
309  elif packet == 'RESOURCE_REQUEST': # 142
310  args = a(2) + (b(120), 1, b(120))
311  mav.mav.resource_request_send(*args)
312  elif packet == 'SCALED_PRESSURE3': # 143
313  mav.mav.scaled_pressure3_send(*a(4))
314  elif packet == 'FOLLOW_TARGET': # 144
315  args = a(5) + (b(3), b(3), b(4), b(3), b(3), 1)
316  mav.mav.follow_target_send(*args)
317  elif packet == 'CONTROL_SYSTEM_STATE': # 146
318  args = a(11) + (b(3), b(3), b(4)) + a(3)
319  mav.mav.control_system_state_send(*args)
320  elif packet == 'BATTERY_STATUS': # 147
321  args = a(4) + (b(10),) + a(4)
322  mav.mav.battery_status_send(*args)
323  elif packet == 'AUTOPILOT_VERSION': # 148
324  if mav.mavlink20():
325  args = a(5) + (b(8), b(8), b(8)) + a(3) + (b(18),)
326  mav.mav.autopilot_version_send(*args)
327  else:
328  args = a(5) + (b(8), b(8), b(8)) + a(3)
329  mav.mav.autopilot_version_send(*args)
330  elif packet == 'LANDING_TARGET': # 149
331  if mav.mavlink20():
332  args = a(11) + (b(4),) + a(2)
333  mav.mav.landing_target_send(*args)
334  else:
335  mav.mav.landing_target_send(*a(8))
336  elif packet == 'ESTIMATOR_STATUS': # 230
337  mav.mav.estimator_status_send(*a(10))
338  elif packet == 'WIND_COV': # 231
339  mav.mav.wind_cov_send(*a(9))
340  elif packet == 'GPS_INPUT': # 232
341  mav.mav.gps_input_send(*a(18))
342  elif packet == 'GPS_RTCM_DATA': # 233
343  args = a(2) + (b(180),)
344  mav.mav.gps_rtcm_data_send(*args)
345  elif packet == 'HIGH_LATENCY': # 234
346  mav.mav.high_latency_send(*a(24))
347  elif packet == 'VIBRATION': # 241
348  mav.mav.vibration_send(*a(7))
349  elif packet == 'HOME_POSITION': # 242
350  if mav.mavlink20():
351  args = a(6) + (b(4),) + a(4)
352  mav.mav.home_position_send(*args)
353  else:
354  args = a(6) + (b(4),) + a(3)
355  mav.mav.home_position_send(*args)
356  elif packet == 'SET_HOME_POSITION': # 243
357  if mav.mavlink20():
358  args = (system,) + a(6) + (b(4),) + a(4)
359  mav.mav.set_home_position_send(*args)
360  else:
361  args = (system,) + a(6) + (b(4),) + a(3)
362  mav.mav.set_home_position_send(*args)
363  elif packet == 'MESSAGE_INTERVAL': # 244
364  mav.mav.message_interval_send(*a(2))
365  elif packet == 'EXTENDED_SYS_STATE': # 245
366  mav.mav.extended_sys_state_send(*a(2))
367  elif packet == 'ADSB_VEHICLE': # 246
368  args = a(8) + (b(9),) + a(4)
369  mav.mav.adsb_vehicle_send(*args)
370  elif packet == 'COLLISION': # 247
371  mav.mav.collision_send(*a(7))
372  elif packet == 'V2_EXTENSION': # 248
373  mav.mav.v2_extension_send(1, system, component, 1, a(249))
374  elif packet == 'MEMORY_VECT': # 249
375  args = a(3) + (b(32),)
376  mav.mav.memory_vect_send(*args)
377  elif packet == 'DEBUG_VECT': # 250
378  mav.mav.debug_vect_send(b(10), *a(4))
379  elif packet == 'NAMED_VALUE_FLOAT': # 251
380  mav.mav.named_value_float_send(1, b(10), 1)
381  elif packet == 'NAMED_VALUE_INT': # 252
382  mav.mav.named_value_int_send(1, b(10), 1)
383  elif packet == 'STATUSTEXT': # 253
384  mav.mav.statustext_send(1, b(50))
385  elif packet == 'DEBUG': # 254
386  mav.mav.debug_send(*a(3))
387  elif packet == 'SETUP_SIGNING': # 256
388  mav.mav.setup_signing_send(system, component, b(32), 1)
389  elif packet == 'BUTTON_CHANGE': # 257
390  mav.mav.button_change_send(*a(3))
391  elif packet == 'PLAY_TUNE': # 258
392  mav.mav.play_tune_send(system, component, b(30))
393  elif packet == 'CAMERA_IMAGE_CAPTURED': # 263
394  args = a(7) + (b(4),) + a(2) + (b(205),)
395  mav.mav.camera_image_captured_send(*args)
396  elif packet == 'FLIGHT_INFORMATION': # 264
397  mav.mav.flight_information_send(*a(4))
398  elif packet == 'MOUNT_ORIENTATION': # 265
399  mav.mav.mount_orientation_send(*a(4))
400  elif packet == 'LOGGING_DATA': # 266
401  args = (system, component) + a(3) + (b(249),)
402  mav.mav.logging_data_send(*args)
403  elif packet == 'LOGGING_DATA_ACKED': # 267
404  args = (system, component) + a(3) + (b(249),)
405  mav.mav.logging_data_acked_send(*args)
406  elif packet == 'LOGGING_ACK': # 268
407  mav.mav.logging_ack_send(system, component, 1)
408  elif packet == 'WIFI_CONFIG_AP': # 299
409  mav.mav.wifi_config_ap_send(b(32), b(64))
410  elif packet == 'PROTOCOL_VERSION': # 300
411  args = a(3) + (b(8), b(8))
412  mav.mav.protocol_version_send(*args)
413  elif packet == 'UAVCAN_NODE_STATUS': # 310
414  mav.mav.uavcan_node_status_send(*a(6))
415  elif packet == 'UAVCAN_NODE_INFO': # 311
416  args = a(2) + (b(80),) + a(2) + (b(16),) + a(3)
417  mav.mav.uavcan_node_info_send(*args)
418  elif packet == 'OBSTACLE_DISTANCE': # 330
419  args = a(2) + (b(72),) + a(3)
420  mav.mav.obstacle_distance_send(*args)
421  else:
422  print('unknown packet type {:s}'.format(packet))
423  sys.exit(1)
424 
425 
426 def parse_line(line):
427  parts = line.split(' to ')
428  packet = parts[0]
429  try:
430  system, component = parts[1].split('.')
431  except:
432  system = 0
433  component = 0
434  return packet, int(system), int(component)
435 
436 
437 def parse_file(filename):
438  with open(filename) as f:
439  content = f.readlines()
440  return [parse_line(x.strip()) for x in content]
441 
442 
444  if not args['mavlink1']:
445  os.environ['MAVLINK20'] = '1'
446  mavutil.set_dialect('common')
447  if args['udp']:
448  mav = mavutil.mavlink_connection('udpout:' + args['udp'],
449  source_system=args['system'], source_component=args['component'])
450  elif args['serial']:
451  mav = mavutil.mavlink_connection(args['serial'], baud=57600,
452  source_system=args['system'], source_component=args['component'])
453  else:
454  sys.exit()
455  return mav
456 
457 
459  parser = ArgumentParser(description='Send mavlink packets from file.')
460  parser.add_argument('system', type=int, help='system ID')
461  parser.add_argument('component', type=int, help='component ID')
462  parser.add_argument('script', help='script file to run')
463  parser.add_argument(
464  '--mavlink1', action='store_true',
465  help='force MAVLink v1.0 instead of v2.0')
466  parser.add_argument(
467  '--udp', action='store', help='UDP address:port to connect to')
468  parser.add_argument(
469  '--serial', action='store', help='serial port device string')
470  args = vars(parser.parse_args())
471  if not args['udp'] and not args['serial']:
472  print('expected --udp or --serial option')
473  sys.exit()
474  if args['udp'] and args['serial']:
475  print('expected --udp or --serial option, but not both')
476  sys.exit()
477  return args
478 
479 
480 def main():
481  args = parse_args()
482  packets = parse_file(args['script'])
483  mav = start_connection(args)
484  last_heartbeat = datetime.now() - timedelta(seconds=180)
485  for packet, system, component in packets:
486  if ((datetime.now() - last_heartbeat) > timedelta(seconds=120)):
487  last_heartbeat = datetime.now()
488  mav.mav.heartbeat_send(0, 0, 0, 0, 0)
489  send_packet(mav, packet, system, component)
490  sleep(0.0003)
491 
492 
493 if __name__ == '__main__':
494  main()
def start_connection(args)
def parse_line(line)
def send_packet(mav, packet, system=0, component=0)
def parse_file(filename)