From 0eddbfc11c44e0d21e0009f0b8c644df9538301b Mon Sep 17 00:00:00 2001 From: Samuel Sadok Date: Tue, 17 Apr 2018 19:59:44 -0700 Subject: [PATCH] Add udev-setup command to odrivetool --- tools/odrive/utils.py | 13 +++++++++++++ tools/odrivetool | 5 +++++ tools/setup.py | 6 ++++++ 3 files changed, 24 insertions(+) diff --git a/tools/odrive/utils.py b/tools/odrive/utils.py index 810780d0..5834ff85 100755 --- a/tools/odrive/utils.py +++ b/tools/odrive/utils.py @@ -7,6 +7,8 @@ import sys import time import threading import platform +import subprocess +import os try: if platform.system() == 'Windows': @@ -109,6 +111,17 @@ def rate_test(device): FramePerSec = loopsPerSec/loopsPerFrame print("Frames per second: " + str(FramePerSec)) +def setup_udev_rules(logger): + if platform.system() != 'Linux': + logger.error("This command only makes sense on Linux") + if os.getuid() != 0: + logger.warn("you should run this as root, otherwise it will probably not work") + with open('/etc/udev/rules.d/50-odrive.rules', 'w') as file: + file.write('SUBSYSTEM=="usb", ATTR{idVendor}=="1209", ATTR{idProduct}=="0d3[0-9]", MODE="0666"\n') + subprocess.run(["udevadm", "control", "--reload-rules"], check=True) + subprocess.run(["udevadm", "trigger"], check=True) + logger.info('udev rules configured successfully') + ## Exceptions ## diff --git a/tools/odrivetool b/tools/odrivetool index b66db5c7..2feb9b2c 100755 --- a/tools/odrivetool +++ b/tools/odrivetool @@ -31,6 +31,7 @@ dfu_parser.add_argument('file', metavar='HEX', help='The .hex file to be flashed subparsers.add_parser('liveplotter', help="Upgrade the ODrive's Firmware") subparsers.add_parser('drv-status', help="Show status of the on-board DRV8301 chips (for debugging only)") subparsers.add_parser('rate-test', help="Estimate the average transmission bandwidth over USB") +subparsers.add_parser('udev-setup', help="Linux only: Gives users on your system permission to access the ODrive by installing udev rules") # General arguments parser.add_argument("-p", "--path", metavar="PATH", action="store", @@ -126,6 +127,10 @@ try: my_odrive = odrive.discovery.find_any(path=args.path, serial_number=args.serial_number) rate_test(my_odrive) + elif args.command == 'udev-setup': + from odrive.utils import setup_udev_rules + setup_udev_rules(logger) + else: raise Exception("unknown command: " + args.command) diff --git a/tools/setup.py b/tools/setup.py index 7fde17bd..a7ac5980 100644 --- a/tools/setup.py +++ b/tools/setup.py @@ -58,6 +58,12 @@ if creating_package: with open(version_file_path, mode='w') as version_file: version_file.write(version) +# TODO: find a better place for this +if not creating_package: + import platform + if platform.system() == 'Linux': + import odrive.utils + odrive.utils.setup_udev_rules(odrive.utils.Logger()) setup( name = 'odrive',