====== OGs Service Tool for Dji products ====== By mefisto and the OG's, Github here: https://github.com/o-gs/dji-firmware-tools/blob/master/comm_og_service_tool.py The script allows to trigger a few service functions of Dji drones. It talks to the drone like comm_serialtalk.py, but provides easier interface for some important functions. File Download: https://github.com/o-gs/dji-firmware-tools/raw/master/comm_og_service_tool.py ==== Java UI ==== Big thanks to Ace-Code1 for a UI for the app https://github.com/Ace-Code1/commOgServiceGUI ==== Example functions: ==== Example of listing Flight Controller Parameters 200-300 on Ph3 Pro to CSV format: ./comm_og_service_tool.py /dev/ttyUSB0 P3X FlycParam list --start=200 --count=100 --fmt=csv Example of getting value of Flight Controller Parameters on Spark: ./comm_og_service_tool.py /dev/ttyUSB0 -vv SPARK FlycParam get g_config.flying_limit.max_height_0 --fmt=2line Example of setting value of Flight Controller Parameters on Spark: ./comm_og_service_tool.py /dev/ttyUSB0 -vv SPARK FlycParam set g_config.flying_limit.max_height_0 500 Example of performing service "joint coarse" calibration of Spark gimbal: ./comm_og_service_tool.py /dev/ttyUSB0 -vv SPARK GimbalCalib JointCoarse Example of performing service "linear hall" calibration of Spark gimbal, using Windows host: python3 comm_og_service_tool.py COM23 -vv SPARK GimbalCalib LinearHall ==== Supported Aircraft ==== * A2 = 0 # Released 2013-09-04 A2 Flight Controller * P330 = 1 # Released 2013-01-07 Phantom 1 * P330V = 2 # Released 2013-10-28 Phantom 2 Vision * P330Z = 3 # Released 2013-12-15 Phantom 2 w/ Zenmuse H3-2D * P330VP = 4 # Released 2014-04-07 Phantom 2 Vision+ * WM610 = 5 # Released 2014-11-13 Inspire 1 * P3X = 6 # Released 2015-03-09 Phantom 3 Professional * P3S = 7 # Released 2015-03-09 Phantom 3 Advanced * MAT100 = 8 # Released 2015-06-08 Matrice 100 * P3C = 9 # Released 2015-08-04 Phantom 3 Standard * MG1 = 10 # Released 2015-11-27 Agras MG-1 * WM325 = 11 # Released 2016-01-05 Phantom 3 4K * WM330 = 12 # Released 2016-03-02 Phantom 4 (now referenced as Phantom 4 Standard) * MAT600 = 13 # Released 2016-04-17 Matrice 600 * WM220 = 14 # Released 2016-09-28 Mavic Pro (also includes Released 2017-08-24 Mavic Pro Platinum) * WM620 = 15 # Released 2016-11-16 Inspire 2 * WM331 = 16 # Released 2016-11-16 Phantom 4 Pro * MAT200 = 17 # Released 2017-02-26 Matrice 200 * MG1S = 18 # Released 2017-03-28 Agras MG-1S * WM332 = 19 # Released 2017-04-13 Phantom 4 Advanced * WM100 = 20 # Released 2017-05-24 Spark * WM230 = 21 # Released 2018-01-23 Mavic Air * WM335 = 22 # Released 2018-05-08 Phantom 4 Pro V2 * WM240 = 23 # Released 2018-08-23 Mavic 2 Pro/Zoom * WM245 = 24 # Released 2018-10-29 Mavic 2 Enterprise * WM246 = 25 # Released 2018-12-20 Mavic 2 Enterprise Dual * WM160 = 26 # Released 2019-10-30 Mavic Mini ==== Types of commands ==== THis section is a WIP SERVICE_CMD FlycParam = 0 GimbalCalib = 1 CameraCalib = 2 FLYC_PARAM_CMD LIST = 0 GET = 1 SET = 2 GIMBAL_CALIB_CMD JOINTCOARSE = 0 LINEARHALL = 1 CAMERA_CALIB_CMD ENCRYPTCHECK = 0 ENCRYPTPAIR = 1 CAMERA_ENCRYPT_PAIR_TARGET ALL = 0 CAMERA = 1 GIMBAL = 4 LB_DM3XX_SKY = 8 ==== Command line ===== usage: comm_og_Service_Tool.py [-h] [-b BAUDRATE] [-w TIMEOUT] [--dry-test] [-v] [--version] port product command ... Needs cleaning up from code Its task is to parse command line options and call a function which performs serial communication. """ parser = argparse.ArgumentParser(description=__doc__) parser.add_argument('port', type=str, help="the serial port to write to and read from") parser.add_argument('product', metavar='product', choices=[i.name for i in PRODUCT_CODE], type=parse_product_code, help="target product code name; one of: {:s}".format(','.join(i.name for i in PRODUCT_CODE))) parser.add_argument('-b', '--baudrate', default=9600, type=int, help="the baudrate to use for the serial port (default is %(default)s)") parser.add_argument('-w', '--timeout', default=500, type=int, help="how long to wait for answer, in miliseconds (default is %(default)s)") parser.add_argument('--dry-test', action='store_true', help="internal testing mode; do not use real serial interface and use template answers from the drone.") parser.add_argument('-v', '--verbose', action='count', default=0, help="increases verbosity level; max level is set by -vvv") parser.add_argument('--version', action='version', version="%(prog)s {version} by {author}" .format(version=__version__,author=__author__), help="display version information and exit")