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.
Files changed (49) hide show
  1. odrive/__init__.py +142 -0
  2. odrive/api_client.py +54 -0
  3. odrive/config.py +1296 -0
  4. odrive/crypto.py +369 -0
  5. odrive/data/brakeRs.json +18 -0
  6. odrive/data/drvs.json +82 -0
  7. odrive/data/encoders.json +86 -0
  8. odrive/data/motors.json +128 -0
  9. odrive/data/odrive-micro-x1.json +48 -0
  10. odrive/data/odrive-micro-x3.json +40 -0
  11. odrive/data/odrive-micro-x4.json +40 -0
  12. odrive/data/odrive-s1-x4.json +52 -0
  13. odrive/data/odrive-v4.4.json +58 -0
  14. odrive/data/schema-brakeR.json +6 -0
  15. odrive/data/schema-drv.json +6 -0
  16. odrive/data/schema-encoders.json +6 -0
  17. odrive/data/schema-motors.json +6 -0
  18. odrive/data/schema-odrive.json +5 -0
  19. odrive/data/schema.json +244 -0
  20. odrive/database.py +184 -0
  21. odrive/dfu.py +195 -0
  22. odrive/dfuse/DfuDevice.py +297 -0
  23. odrive/dfuse/__init__.py +1 -0
  24. odrive/enums.py +415 -0
  25. odrive/firmware.py +102 -0
  26. odrive/hw_version.py +67 -0
  27. odrive/legacy.py +73 -0
  28. odrive/legacy_config.py +123 -0
  29. odrive/legacy_dfu.py +442 -0
  30. odrive/lib/libodrive-windows-x64.dll +0 -0
  31. odrive/libodrive.py +325 -0
  32. odrive/pyfibre/fibre/__init__.py +4 -0
  33. odrive/pyfibre/fibre/libfibre-windows-amd64.dll +0 -0
  34. odrive/pyfibre/fibre/libfibre.py +1078 -0
  35. odrive/pyfibre/fibre/libwinpthread-1.dll +0 -0
  36. odrive/pyfibre/fibre/shell.py +162 -0
  37. odrive/pyfibre/fibre/utils.py +133 -0
  38. odrive/release_api.py +184 -0
  39. odrive/rich_text.py +134 -0
  40. odrive/shell.py +144 -0
  41. odrive/utils.py +881 -0
  42. odrive/version.py +1 -0
  43. odrive-0.6.9.dev0.data/scripts/odrive_demo.py +50 -0
  44. odrive-0.6.9.dev0.data/scripts/odrivetool +263 -0
  45. odrive-0.6.9.dev0.data/scripts/odrivetool.bat +2 -0
  46. odrive-0.6.9.dev0.dist-info/METADATA +22 -0
  47. odrive-0.6.9.dev0.dist-info/RECORD +49 -0
  48. odrive-0.6.9.dev0.dist-info/WHEEL +5 -0
  49. 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,2 @@
1
+ @echo off
2
+ ipython "%~dp0\odrivetool" -- %*
@@ -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,5 @@
1
+ Wheel-Version: 1.0
2
+ Generator: bdist_wheel (0.37.1)
3
+ Root-Is-Purelib: true
4
+ Tag: py37-none-win_amd64
5
+
@@ -0,0 +1 @@
1
+ odrive