odrive 0.6.9.dev0__py37-none-win_amd64.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- odrive/__init__.py +142 -0
- odrive/api_client.py +54 -0
- odrive/config.py +1296 -0
- odrive/crypto.py +369 -0
- odrive/data/brakeRs.json +18 -0
- odrive/data/drvs.json +82 -0
- odrive/data/encoders.json +86 -0
- odrive/data/motors.json +128 -0
- odrive/data/odrive-micro-x1.json +48 -0
- odrive/data/odrive-micro-x3.json +40 -0
- odrive/data/odrive-micro-x4.json +40 -0
- odrive/data/odrive-s1-x4.json +52 -0
- odrive/data/odrive-v4.4.json +58 -0
- odrive/data/schema-brakeR.json +6 -0
- odrive/data/schema-drv.json +6 -0
- odrive/data/schema-encoders.json +6 -0
- odrive/data/schema-motors.json +6 -0
- odrive/data/schema-odrive.json +5 -0
- odrive/data/schema.json +244 -0
- odrive/database.py +184 -0
- odrive/dfu.py +195 -0
- odrive/dfuse/DfuDevice.py +297 -0
- odrive/dfuse/__init__.py +1 -0
- odrive/enums.py +415 -0
- odrive/firmware.py +102 -0
- odrive/hw_version.py +67 -0
- odrive/legacy.py +73 -0
- odrive/legacy_config.py +123 -0
- odrive/legacy_dfu.py +442 -0
- odrive/lib/libodrive-windows-x64.dll +0 -0
- odrive/libodrive.py +325 -0
- odrive/pyfibre/fibre/__init__.py +4 -0
- odrive/pyfibre/fibre/libfibre-windows-amd64.dll +0 -0
- odrive/pyfibre/fibre/libfibre.py +1078 -0
- odrive/pyfibre/fibre/libwinpthread-1.dll +0 -0
- odrive/pyfibre/fibre/shell.py +162 -0
- odrive/pyfibre/fibre/utils.py +133 -0
- odrive/release_api.py +184 -0
- odrive/rich_text.py +134 -0
- odrive/shell.py +144 -0
- odrive/utils.py +881 -0
- odrive/version.py +1 -0
- odrive-0.6.9.dev0.data/scripts/odrive_demo.py +50 -0
- odrive-0.6.9.dev0.data/scripts/odrivetool +263 -0
- odrive-0.6.9.dev0.data/scripts/odrivetool.bat +2 -0
- odrive-0.6.9.dev0.dist-info/METADATA +22 -0
- odrive-0.6.9.dev0.dist-info/RECORD +49 -0
- odrive-0.6.9.dev0.dist-info/WHEEL +5 -0
- odrive-0.6.9.dev0.dist-info/top_level.txt +1 -0
odrive/version.py
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
__version__ = '0.6.9.dev0'
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
#!python
|
|
2
|
+
"""
|
|
3
|
+
Example usage of the ODrive python library to monitor and control ODrive devices
|
|
4
|
+
"""
|
|
5
|
+
|
|
6
|
+
from __future__ import print_function
|
|
7
|
+
|
|
8
|
+
import odrive
|
|
9
|
+
from odrive.enums import *
|
|
10
|
+
import time
|
|
11
|
+
import math
|
|
12
|
+
|
|
13
|
+
# Find a connected ODrive (this will block until you connect one)
|
|
14
|
+
print("finding an odrive...")
|
|
15
|
+
my_drive = odrive.find_any()
|
|
16
|
+
|
|
17
|
+
# Calibrate motor and wait for it to finish
|
|
18
|
+
print("starting calibration...")
|
|
19
|
+
my_drive.axis0.requested_state = AxisState.FULL_CALIBRATION_SEQUENCE
|
|
20
|
+
while AxisState(my_drive.axis0.current_state) != AxisState.IDLE:
|
|
21
|
+
time.sleep(0.1)
|
|
22
|
+
|
|
23
|
+
my_drive.axis0.requested_state = AxisState.CLOSED_LOOP_CONTROL
|
|
24
|
+
|
|
25
|
+
# To read a value, simply read the property
|
|
26
|
+
print("Bus voltage is " + str(my_drive.vbus_voltage) + "V")
|
|
27
|
+
|
|
28
|
+
# Or to change a value, just assign to the property
|
|
29
|
+
my_drive.axis0.controller.pos_setpoint = 3.14
|
|
30
|
+
print("Position setpoint is " + str(my_drive.axis0.controller.pos_setpoint))
|
|
31
|
+
|
|
32
|
+
# And this is how function calls are done:
|
|
33
|
+
for i in [1,2,3,4]:
|
|
34
|
+
print('voltage on GPIO{} is {} Volt'.format(i, my_drive.get_adc_voltage(i)))
|
|
35
|
+
|
|
36
|
+
# A sine wave to test
|
|
37
|
+
t0 = time.monotonic()
|
|
38
|
+
while True:
|
|
39
|
+
setpoint = 4.0 * math.sin((time.monotonic() - t0)*2)
|
|
40
|
+
print("goto " + str(int(setpoint)))
|
|
41
|
+
my_drive.axis0.controller.pos_setpoint = setpoint
|
|
42
|
+
time.sleep(0.01)
|
|
43
|
+
|
|
44
|
+
# Some more things you can try:
|
|
45
|
+
|
|
46
|
+
# Write to a read-only property:
|
|
47
|
+
my_drive.vbus_voltage = 11.0 # fails with `AttributeError: can't set attribute`
|
|
48
|
+
|
|
49
|
+
# Assign an incompatible value:
|
|
50
|
+
my_drive.motor0.pos_setpoint = "I like trains" # fails with `ValueError: could not convert string to float`
|
|
@@ -0,0 +1,263 @@
|
|
|
1
|
+
#!python
|
|
2
|
+
"""
|
|
3
|
+
ODrive command line utility
|
|
4
|
+
"""
|
|
5
|
+
|
|
6
|
+
from __future__ import print_function
|
|
7
|
+
import sys
|
|
8
|
+
|
|
9
|
+
if sys.version_info < (3, 6):
|
|
10
|
+
print("Your Python version (Python {}.{}) is too old. Please install Python 3.6 or newer.".format(
|
|
11
|
+
sys.version_info.major, sys.version_info.minor
|
|
12
|
+
))
|
|
13
|
+
exit(1)
|
|
14
|
+
|
|
15
|
+
import asyncio
|
|
16
|
+
import sys
|
|
17
|
+
import os
|
|
18
|
+
import argparse
|
|
19
|
+
import tempfile
|
|
20
|
+
import time
|
|
21
|
+
import math
|
|
22
|
+
import platform
|
|
23
|
+
|
|
24
|
+
import odrive
|
|
25
|
+
from odrive.utils import OperationAbortedException
|
|
26
|
+
from fibre import Logger
|
|
27
|
+
|
|
28
|
+
# Flush stdout by default
|
|
29
|
+
# Source:
|
|
30
|
+
# https://stackoverflow.com/questions/230751/how-to-flush-output-of-python-print
|
|
31
|
+
old_print = print
|
|
32
|
+
def print(*args, **kwargs):
|
|
33
|
+
kwargs.pop('flush', False)
|
|
34
|
+
old_print(*args, **kwargs)
|
|
35
|
+
file = kwargs.get('file', sys.stdout)
|
|
36
|
+
file.flush() if file is not None else sys.stdout.flush()
|
|
37
|
+
|
|
38
|
+
script_path=os.path.dirname(os.path.realpath(__file__))
|
|
39
|
+
|
|
40
|
+
## Parse arguments ##
|
|
41
|
+
parser = argparse.ArgumentParser(description='ODrive command line utility\n'
|
|
42
|
+
'Running this tool without any arguments is equivalent to running `odrivetool shell`\n',
|
|
43
|
+
formatter_class=argparse.RawTextHelpFormatter)
|
|
44
|
+
|
|
45
|
+
# Subcommands
|
|
46
|
+
subparsers = parser.add_subparsers(help='sub-command help', dest='command')
|
|
47
|
+
shell_parser = subparsers.add_parser('shell', help='Drop into an interactive python shell that lets you interact with the ODrive(s)')
|
|
48
|
+
shell_parser.add_argument("--no-ipython", action="store_true",
|
|
49
|
+
help="Use the regular Python shell "
|
|
50
|
+
"instead of the IPython shell, "
|
|
51
|
+
"even if IPython is installed.")
|
|
52
|
+
|
|
53
|
+
# These two DFU commands are aliases except for the info message
|
|
54
|
+
for command in ['new-dfu', 'dfu', 'legacy-dfu', 'install-bootloader']:
|
|
55
|
+
dfu_parser = subparsers.add_parser(command, help="Upgrade the ODrive device firmware."
|
|
56
|
+
"If no serial number is specified, the first ODrive that is found is updated")
|
|
57
|
+
dfu_parser.add_argument('file', nargs='?',
|
|
58
|
+
help='The .elf file to be flashed. Make sure target board version '
|
|
59
|
+
'of the firmware file matches the actual board version. '
|
|
60
|
+
'You can download the latest release manually from '
|
|
61
|
+
'https://github.com/odriverobotics/ODrive/releases. '
|
|
62
|
+
'If no file is provided, the script automatically downloads '
|
|
63
|
+
'the firmware from the internet.')
|
|
64
|
+
dfu_parser.add_argument('--channel', action='store',
|
|
65
|
+
help='The release channel to download from. '
|
|
66
|
+
'Mutually exclusive with --version. '
|
|
67
|
+
'If no channel, no version and no firmware file is specified, '
|
|
68
|
+
'the "master" channel is used. ')
|
|
69
|
+
dfu_parser.add_argument('--version', action='store',
|
|
70
|
+
help='The version name to download. '
|
|
71
|
+
'Mutually exclusive with --channel.')
|
|
72
|
+
if command != 'new-dfu': # Only valid for legacy-dfu
|
|
73
|
+
dfu_parser.add_argument('--no-erase-all', action='store_true',
|
|
74
|
+
help='If specified, only those flash sectors occupied '
|
|
75
|
+
'by the firmware will be erased. If not specified, all '
|
|
76
|
+
'flash sectors (including non-volatile config) will be '
|
|
77
|
+
'erased.')
|
|
78
|
+
else:
|
|
79
|
+
dfu_parser.add_argument('--erase-all', action='store_true',
|
|
80
|
+
help='If specified, all flash sectors (including those '
|
|
81
|
+
'containing non-volatile config) will be erased. '
|
|
82
|
+
'If not specified, only those flash sectors occupied '
|
|
83
|
+
'by the firmware will be erased.')
|
|
84
|
+
|
|
85
|
+
unlock_parser = subparsers.add_parser('unlock', help="Try to remove read-out protection."
|
|
86
|
+
"If no serial number is specified, the first ODrive that is found is unlocked")
|
|
87
|
+
|
|
88
|
+
backup_config_parser = subparsers.add_parser('backup-config', help="Saves the configuration of the ODrive to a JSON file")
|
|
89
|
+
backup_config_parser.add_argument('file', nargs='?',
|
|
90
|
+
help="Path to the file where to store the data. "
|
|
91
|
+
"If no path is provided, the configuration is stored in {}.".format(tempfile.gettempdir()))
|
|
92
|
+
|
|
93
|
+
restore_config_parser = subparsers.add_parser('restore-config', help="Restores the configuration of the ODrive from a JSON file")
|
|
94
|
+
restore_config_parser.add_argument('file', nargs='?',
|
|
95
|
+
help="Path to the file that contains the configuration data. "
|
|
96
|
+
"If no path is provided, the configuration is loaded from {}.".format(tempfile.gettempdir()))
|
|
97
|
+
|
|
98
|
+
subparsers.add_parser('liveplotter', help="For plotting of odrive parameters (i.e. position) in real time")
|
|
99
|
+
subparsers.add_parser('rate-test', help="Estimate the average transmission bandwidth over USB")
|
|
100
|
+
|
|
101
|
+
# General arguments
|
|
102
|
+
parser.add_argument("-p", "--path", metavar="PATH", action="store",
|
|
103
|
+
help="The path(s) where ODrive(s) should be discovered.\n"
|
|
104
|
+
"By default the script will connect to any ODrive on USB.\n\n"
|
|
105
|
+
"To select a specific USB device:\n"
|
|
106
|
+
" --path usb:BUS:DEVICE\n"
|
|
107
|
+
"usbwhere BUS and DEVICE are the bus and device numbers as shown in `lsusb`.\n\n"
|
|
108
|
+
"To select a specific serial port:\n"
|
|
109
|
+
" --path serial:PATH\n"
|
|
110
|
+
"where PATH is the path of the serial port. For example \"/dev/ttyUSB0\".\n"
|
|
111
|
+
"You can use `ls /dev/tty*` to find the correct port.\n\n"
|
|
112
|
+
"You can combine USB and serial specs by separating them with a comma (no space!)\n"
|
|
113
|
+
"Example:\n"
|
|
114
|
+
" --path usb,serial:/dev/ttyUSB0\n"
|
|
115
|
+
"means \"discover any USB device or a serial device on /dev/ttyUSB0\"")
|
|
116
|
+
parser.add_argument("-s", "--serial-number", action="store",
|
|
117
|
+
help="The 12-digit serial number of the device. "
|
|
118
|
+
"This is a string consisting of 12 upper case hexadecimal "
|
|
119
|
+
"digits as displayed in lsusb. \n"
|
|
120
|
+
" example: 385F324D3037\n"
|
|
121
|
+
"You can list all devices connected to USB by running\n"
|
|
122
|
+
"(lsusb -d 1209:0d32 -v; lsusb -d 0483:df11 -v) | grep iSerial\n"
|
|
123
|
+
"If omitted, any device is accepted.")
|
|
124
|
+
parser.add_argument("-v", "--verbose", action="store_true",
|
|
125
|
+
help="print debug information")
|
|
126
|
+
parser.add_argument("--version", action="store_true",
|
|
127
|
+
help="print version information and exit")
|
|
128
|
+
|
|
129
|
+
parser.set_defaults(path="usb:idVendor=0x1209,idProduct=0x0D32,bInterfaceClass=0,bInterfaceSubClass=1,bInterfaceProtocol=0")
|
|
130
|
+
args = parser.parse_args()
|
|
131
|
+
|
|
132
|
+
# Default command
|
|
133
|
+
if args.command is None:
|
|
134
|
+
args.command = 'shell'
|
|
135
|
+
args.no_ipython = False
|
|
136
|
+
|
|
137
|
+
logger = Logger(verbose=args.verbose)
|
|
138
|
+
|
|
139
|
+
def print_version():
|
|
140
|
+
sys.stderr.write("ODrive control utility v" + odrive.__version__ + "\n")
|
|
141
|
+
sys.stderr.flush()
|
|
142
|
+
|
|
143
|
+
if platform.system() == 'Linux':
|
|
144
|
+
if not os.path.isfile('/etc/udev/rules.d/91-odrive.rules'):
|
|
145
|
+
logger.warn(
|
|
146
|
+
"Device permissions are not set up. Please exit odrivetool and run the following command: \n"
|
|
147
|
+
"sudo bash -c \"curl https://cdn.odriverobotics.com/files/odrive-udev-rules.rules > /etc/udev/rules.d/91-odrive.rules && udevadm control --reload-rules && udevadm trigger\"\n"
|
|
148
|
+
"otherwise your ODrive may not be recognized.")
|
|
149
|
+
|
|
150
|
+
try:
|
|
151
|
+
if args.version == True:
|
|
152
|
+
print_version()
|
|
153
|
+
|
|
154
|
+
elif args.command == 'shell':
|
|
155
|
+
print_version()
|
|
156
|
+
if ".dev" in odrive.__version__:
|
|
157
|
+
print("")
|
|
158
|
+
logger.warn("Developer Preview")
|
|
159
|
+
print(" If you find issues, please report them")
|
|
160
|
+
print(" on https://github.com/odriverobotics/ODrive/issues")
|
|
161
|
+
print(" or better yet, submit a pull request to fix it.")
|
|
162
|
+
print("")
|
|
163
|
+
import odrive.shell
|
|
164
|
+
odrive.shell.launch_shell(args, logger)
|
|
165
|
+
|
|
166
|
+
elif args.command == 'new-dfu':
|
|
167
|
+
print_version()
|
|
168
|
+
|
|
169
|
+
import odrive.dfu
|
|
170
|
+
try:
|
|
171
|
+
if sum([bool(args.file), bool(args.channel), bool(args.version)]) > 1:
|
|
172
|
+
raise odrive.dfu.DfuError("Only one of firmware-file, --channel or --version must be specified.")
|
|
173
|
+
elif sum([bool(args.file), bool(args.channel), bool(args.version)]) == 0:
|
|
174
|
+
args.channel = 'master'
|
|
175
|
+
|
|
176
|
+
asyncio.run(odrive.dfu.dfu_ui(
|
|
177
|
+
serial_number=args.serial_number,
|
|
178
|
+
path=args.file,
|
|
179
|
+
channel=args.channel,
|
|
180
|
+
version=args.version,
|
|
181
|
+
erase_all=args.erase_all,
|
|
182
|
+
logger=logger))
|
|
183
|
+
except odrive.dfu.DfuError as ex:
|
|
184
|
+
logger.error(str(ex))
|
|
185
|
+
sys.exit(1)
|
|
186
|
+
|
|
187
|
+
elif args.command == 'dfu' or args.command == 'legacy-dfu' or args.command == 'install-bootloader':
|
|
188
|
+
print_version()
|
|
189
|
+
|
|
190
|
+
if args.command == 'dfu':
|
|
191
|
+
logger.warn("Try our new firmware update system!")
|
|
192
|
+
logger.warn("Supports firmware updates from the Web GUI and firmware updates via CAN bus.")
|
|
193
|
+
logger.warn("More info and migration instructions here: https://docs.odriverobotics.com/v/latest/guides/new-dfu.html.")
|
|
194
|
+
|
|
195
|
+
import odrive.legacy_dfu
|
|
196
|
+
try:
|
|
197
|
+
if 'win32' in sys.platform:
|
|
198
|
+
# needed for subprocess support
|
|
199
|
+
# https://docs.python.org/3/library/asyncio-platforms.html#asyncio-windows-subprocess
|
|
200
|
+
asyncio.set_event_loop_policy(asyncio.WindowsProactorEventLoopPolicy())
|
|
201
|
+
|
|
202
|
+
if sum([bool(args.file), bool(args.channel), bool(args.version)]) > 1:
|
|
203
|
+
raise odrive.dfu.DfuError("Only one of firmware-file, --channel or --version must be specified.")
|
|
204
|
+
elif sum([bool(args.file), bool(args.channel), bool(args.version)]) == 0:
|
|
205
|
+
args.channel = 'master'
|
|
206
|
+
|
|
207
|
+
asyncio.run(odrive.legacy_dfu.launch_dfu(
|
|
208
|
+
serial_number=args.serial_number,
|
|
209
|
+
path=args.file,
|
|
210
|
+
channel=args.channel,
|
|
211
|
+
version=args.version,
|
|
212
|
+
erase_all=not args.no_erase_all,
|
|
213
|
+
logger=logger,
|
|
214
|
+
installing_bootloader=args.command == 'install-bootloader',
|
|
215
|
+
release_type='bootloader' if args.command == 'install-bootloader' else 'firmware'))
|
|
216
|
+
except odrive.legacy_dfu.DfuError as ex:
|
|
217
|
+
logger.error(str(ex))
|
|
218
|
+
sys.exit(1)
|
|
219
|
+
|
|
220
|
+
elif args.command == 'unlock':
|
|
221
|
+
print_version()
|
|
222
|
+
import odrive.dfu
|
|
223
|
+
odrive.dfu.unlock_device(args.serial_number, None)
|
|
224
|
+
|
|
225
|
+
elif args.command == 'liveplotter':
|
|
226
|
+
from odrive.utils import start_liveplotter
|
|
227
|
+
print("Waiting for ODrive...")
|
|
228
|
+
my_odrive = odrive.find_any(path=args.path, serial_number=args.serial_number)
|
|
229
|
+
|
|
230
|
+
# If you want to plot different values, change them here.
|
|
231
|
+
# You can plot any number of values concurrently.
|
|
232
|
+
cancellation_token = start_liveplotter(lambda: [
|
|
233
|
+
my_odrive.axis0.encoder.pos_estimate,
|
|
234
|
+
my_odrive.axis1.encoder.pos_estimate,
|
|
235
|
+
])
|
|
236
|
+
|
|
237
|
+
print("Showing plot. Press Ctrl+C to exit.")
|
|
238
|
+
while not cancellation_token.is_set():
|
|
239
|
+
time.sleep(1)
|
|
240
|
+
|
|
241
|
+
elif args.command == 'rate-test':
|
|
242
|
+
from odrive.utils import rate_test
|
|
243
|
+
print("Waiting for ODrive...")
|
|
244
|
+
my_odrive = odrive.find_any(path=args.path, serial_number=args.serial_number)
|
|
245
|
+
rate_test(my_odrive)
|
|
246
|
+
|
|
247
|
+
elif args.command == 'backup-config':
|
|
248
|
+
from odrive.legacy_config import backup_config_ui
|
|
249
|
+
print("Waiting for ODrive...")
|
|
250
|
+
my_odrive = odrive.find_any(path=args.path, serial_number=args.serial_number)
|
|
251
|
+
backup_config_ui(my_odrive, args.file, logger)
|
|
252
|
+
|
|
253
|
+
elif args.command == 'restore-config':
|
|
254
|
+
from odrive.legacy_config import restore_config_ui
|
|
255
|
+
print("Waiting for ODrive...")
|
|
256
|
+
my_odrive = odrive.find_any(path=args.path, serial_number=args.serial_number)
|
|
257
|
+
restore_config_ui(my_odrive, args.file, logger)
|
|
258
|
+
|
|
259
|
+
else:
|
|
260
|
+
raise Exception("unknown command: " + args.command)
|
|
261
|
+
|
|
262
|
+
except OperationAbortedException:
|
|
263
|
+
logger.info("Operation aborted.")
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
Metadata-Version: 2.1
|
|
2
|
+
Name: odrive
|
|
3
|
+
Version: 0.6.9.dev0
|
|
4
|
+
Summary: Control utilities for the ODrive high performance motor controller
|
|
5
|
+
Home-page: https://odriverobotics.com/
|
|
6
|
+
Author: ODrive Robotics Inc
|
|
7
|
+
Author-email: info@odriverobotics.com
|
|
8
|
+
License: MIT
|
|
9
|
+
Keywords: odrive,motor,motor control,servo
|
|
10
|
+
Platform: UNKNOWN
|
|
11
|
+
Requires-Dist: PyUSB
|
|
12
|
+
Requires-Dist: aiohttp
|
|
13
|
+
Requires-Dist: appdirs
|
|
14
|
+
Requires-Dist: ipython
|
|
15
|
+
Requires-Dist: pyelftools
|
|
16
|
+
Requires-Dist: setuptools
|
|
17
|
+
Requires-Dist: pywin32 (>=222) ; platform_system == "Windows"
|
|
18
|
+
Provides-Extra: liveplotter
|
|
19
|
+
Requires-Dist: matplotlib ; extra == 'liveplotter'
|
|
20
|
+
|
|
21
|
+
UNKNOWN
|
|
22
|
+
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
odrive/__init__.py,sha256=qHt_JPF8fRjw1EtSmXp6aoX2okmYJsI-Ob__byGv6X8,5119
|
|
2
|
+
odrive/api_client.py,sha256=B_rTRbyJIo0d1uS71FDqN3cUAgrT-dYFN-zYNw4VYs8,2353
|
|
3
|
+
odrive/config.py,sha256=3UWAArlBP8bmqGF5B-XNJZKLxCXGkqlLXULzLEtq6Cg,53265
|
|
4
|
+
odrive/crypto.py,sha256=wA7KFwlolkv1nMnOthkOLxi2cms2h3_W1uiEQUB1fls,13415
|
|
5
|
+
odrive/database.py,sha256=pNislHP35RcCCnP1GwuTnUhBQV-lDFlejHcDpNFaWis,6272
|
|
6
|
+
odrive/dfu.py,sha256=YHAH6kTt9joFD44WrW4aym_Hz55Zl0lZRVSxf3xRf50,8502
|
|
7
|
+
odrive/enums.py,sha256=k4U0ZCBMYdOwXgU71X8t4J6MMYjyZvDFZgET9uTTdPs,16597
|
|
8
|
+
odrive/firmware.py,sha256=hb8UpfWa-AKU_n-NEprOujcOJzI3mF7P555ZvbK9VfM,3489
|
|
9
|
+
odrive/hw_version.py,sha256=ALb4gIoAvu_gNRUKsPiR2e4HXgZ_F8fEs1roCKPqzpE,2026
|
|
10
|
+
odrive/legacy.py,sha256=kfM0OyMPoGW1kDxZi26gdypkehQGXaH904jce_T3Ogc,3069
|
|
11
|
+
odrive/legacy_config.py,sha256=ZK25i7CSFl6Rz_cePtx0dMsYCsOBAzU6vXniGmQ4IbM,3857
|
|
12
|
+
odrive/legacy_dfu.py,sha256=mLj0k4dhzFDHabhCcRFJn1lY03ikNE0LJW27KEE0nAM,18908
|
|
13
|
+
odrive/libodrive.py,sha256=ESkjl1CzH_6Tle6zQoVIN8HiEOwe3hkecEtnLq4sNhA,13903
|
|
14
|
+
odrive/release_api.py,sha256=w1A-GA2B6rKISJ09yvxDjaFHuJPZ9azQL660wdl5dME,7049
|
|
15
|
+
odrive/rich_text.py,sha256=L6SZVnV8cTDUtR7qO2vc0ddELyfA68costdufjACqZg,4557
|
|
16
|
+
odrive/shell.py,sha256=JZ0En0knJ45B6ETtfgAXEr7oL85cQPCU2L3X3hTcOkQ,5514
|
|
17
|
+
odrive/utils.py,sha256=w81g1GNftfo4eO9Wx6JVGc8jP_zn9U4rXwy47Vbjwt4,36587
|
|
18
|
+
odrive/version.py,sha256=fdYqZmLuysogFGDnIzSTE6Tgj1DBJUV12qKTbQ3D7dk,26
|
|
19
|
+
odrive/data/brakeRs.json,sha256=OkMzo2DvuqPnkzWbR6uMRgYxO866anr1Yf_tvajgO64,308
|
|
20
|
+
odrive/data/drvs.json,sha256=8iB8csKpdEewet9hHP0HuRZJZJmjuWQU88I3SBrE1ks,3051
|
|
21
|
+
odrive/data/encoders.json,sha256=5JhdxKu4JzT2vPFM78bEO-jBlhKV1pIcPdIVlRl1rIk,2740
|
|
22
|
+
odrive/data/motors.json,sha256=xZ5pGYBojefbIBcf5MZ6zndHOtrRqgZfPiIy5TozKoo,3681
|
|
23
|
+
odrive/data/odrive-micro-x1.json,sha256=2z1sMwyDz7RVMkJmJDRJkVPuuAUVbMm-NzMNKoZpVXI,1076
|
|
24
|
+
odrive/data/odrive-micro-x3.json,sha256=L_CzJl0vIPfTepKMN2RwXHkcNXfjf3I8rL5xgYoAf7U,888
|
|
25
|
+
odrive/data/odrive-micro-x4.json,sha256=75sYfmISduwLxapq7XcpkHDdnuv6NR2IG1F4jzegTFE,888
|
|
26
|
+
odrive/data/odrive-s1-x4.json,sha256=SW-030PX9sDkocrK1cXfBwVDRL2lNAgC_RNRF5_QcJQ,1150
|
|
27
|
+
odrive/data/odrive-v4.4.json,sha256=JSsDSCR4AAw9tP_xPX51oKAKiHHueM3noqUbmrI7Ibk,1336
|
|
28
|
+
odrive/data/schema-brakeR.json,sha256=hBreKlfyqehKQIZ2S_kUBAxaCnN3_SyHvfvVl1y5czw,141
|
|
29
|
+
odrive/data/schema-drv.json,sha256=mwyduLsmXZpUVc0uJs7fZzLJKHp-Cv8kxswpT-s_XRk,138
|
|
30
|
+
odrive/data/schema-encoders.json,sha256=6jMevEPFwB7-VLSI2BfaCj-zMAnburCZ1RfMqvF2xtU,142
|
|
31
|
+
odrive/data/schema-motors.json,sha256=GHTbJjI0Wqis-7hrigcdTapFAobB8a50-1AnAa7k5NU,140
|
|
32
|
+
odrive/data/schema-odrive.json,sha256=57gQBK7ZRtvI_BggsKkqf0Cfvw5DL-hRIS-yNcHlxsw,93
|
|
33
|
+
odrive/data/schema.json,sha256=vvjypkK9SJgPbNJvG50aUj03_l1vYL6tVvPHze3zzCg,9044
|
|
34
|
+
odrive/dfuse/DfuDevice.py,sha256=bueeS19mfPoT27D5yIRtMp1w2U9QBPzA_7Z2JbpQRIY,10136
|
|
35
|
+
odrive/dfuse/__init__.py,sha256=SqD-q-CoJh4j6hr1a9BE2cP4LeQ278ZsuWOcoN0AtcY,54
|
|
36
|
+
odrive/lib/libodrive-windows-x64.dll,sha256=9AYeNgjbLl9V1ZzE5ne1xk2oL8BtJIBvf-dYFBnBT_k,3514636
|
|
37
|
+
odrive/pyfibre/fibre/__init__.py,sha256=rdIJGCovzGDddBGyIsOQn7woKhUYjFyieJnNuhiBeMI,105
|
|
38
|
+
odrive/pyfibre/fibre/libfibre-windows-amd64.dll,sha256=k0fUViBGNdydQqmFgGlsb0g0dnVt1kxyah2HKVayjqE,1235470
|
|
39
|
+
odrive/pyfibre/fibre/libfibre.py,sha256=j3ywl917iDNndW_wpLbddXtIzOtk3mmb0IC12NXuXNI,40071
|
|
40
|
+
odrive/pyfibre/fibre/libwinpthread-1.dll,sha256=jDYWluWzHcgDhM7zC1s0Qw9lLZi0HyTnV01WX2Ebx5Y,61576
|
|
41
|
+
odrive/pyfibre/fibre/shell.py,sha256=eHgWVVy-CfJ3mK4s1xjozjWTuvnq_PGx-vId0c9tcJc,6356
|
|
42
|
+
odrive/pyfibre/fibre/utils.py,sha256=rd8NoiVcUcM_c_LRRCvizFluMROr12L3G1doyQWmHOI,4788
|
|
43
|
+
odrive-0.6.9.dev0.data/scripts/odrive_demo.py,sha256=RQVEadmIwNKjk4K4p2u6JMas8OVxqPHKG57yZRVXWQM,1570
|
|
44
|
+
odrive-0.6.9.dev0.data/scripts/odrivetool,sha256=QSQOsDew_xPTmvQZrfz41XrWVCUNn4NYtxuhwkpqAU4,12586
|
|
45
|
+
odrive-0.6.9.dev0.data/scripts/odrivetool.bat,sha256=s-gOwGZmQy-k14P70z_elSbToWJV_Er8sx5fkxFu1GE,43
|
|
46
|
+
odrive-0.6.9.dev0.dist-info/METADATA,sha256=WBaqD_yxOGLPhTGwhlh1YggDBCKz01wcb5hwtPvuqiY,603
|
|
47
|
+
odrive-0.6.9.dev0.dist-info/WHEEL,sha256=KiPL0PI64mGLY_MHX7c-grPOEh7bS2zxdBak-i5y7xE,99
|
|
48
|
+
odrive-0.6.9.dev0.dist-info/top_level.txt,sha256=M46r8k9EGZCfhy0EIMcBrK7-Xmpb4WjOs7ei3HVOaBk,7
|
|
49
|
+
odrive-0.6.9.dev0.dist-info/RECORD,,
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
odrive
|