diff --git a/tools/odrive/tests/calibration_test.py b/tools/odrive/tests/calibration_test.py new file mode 100644 index 00000000..0c179a20 --- /dev/null +++ b/tools/odrive/tests/calibration_test.py @@ -0,0 +1,205 @@ + +import test_runner + +import time +from math import pi +import os + +from fibre.utils import Logger +from test_runner import AxisTestContext, MotorTestContext, EncoderTestContext, test_assert_eq, test_assert_no_error, request_state, program_teensy +from odrive.enums import * + +def modpm(val, range): + return ((val + (range / 2)) % range) - (range / 2) + + +class TestMotorCalibration(): + """ + Runs the motor calibration (phase inductance and phase resistance measurement) + and checks if the measurements match the expectation. + """ + + def is_compatible(self, axis_ctx: AxisTestContext, motor_ctx: MotorTestContext): + return axis_ctx.yaml == motor_ctx.yaml['name'] # check if connected + + def run_test(self, axis_ctx: AxisTestContext, motor_ctx: MotorTestContext, logger: Logger): + # reset old calibration values + axis_ctx.handle.motor.config.phase_resistance = 0.0 + axis_ctx.handle.motor.config.phase_inductance = 0.0 + axis_ctx.handle.motor.config.pre_calibrated = False + + axis_ctx.handle.clear_errors() + + # run calibration + request_state(axis_ctx, AXIS_STATE_MOTOR_CALIBRATION) + time.sleep(6) + test_assert_eq(axis_ctx.handle.current_state, AXIS_STATE_IDLE) + test_assert_no_error(axis_ctx) + + # check if measurements match expectation + test_assert_eq(axis_ctx.handle.motor.config.phase_resistance, float(motor_ctx.yaml['phase-resistance']), accuracy=0.2) + test_assert_eq(axis_ctx.handle.motor.config.phase_inductance, float(motor_ctx.yaml['phase-inductance']), accuracy=0.5) + test_assert_eq(axis_ctx.handle.motor.is_calibrated, True) + + +class TestDisconnectedMotorCalibration(): + """ + Tests if the motor calibration fails as expected if the phases are floating. + """ + + def is_compatible(self, axis_ctx: AxisTestContext): + return axis_ctx.yaml == 'floating' + + def run_test(self, axis_ctx: AxisTestContext, logger: Logger): + axis = axis_ctx.handle + + # reset old calibration values + axis_ctx.handle.motor.config.phase_resistance = 0.0 + axis_ctx.handle.motor.config.phase_inductance = 0.0 + axis_ctx.handle.motor.config.pre_calibrated = False + + axis_ctx.handle.clear_errors() + + # run test + request_state(axis_ctx, AXIS_STATE_MOTOR_CALIBRATION) + time.sleep(6) + test_assert_eq(axis_ctx.handle.current_state, AXIS_STATE_IDLE) + test_assert_eq(axis_ctx.handle.error, errors.axis.ERROR_MOTOR_FAILED) + test_assert_eq(axis_ctx.handle.motor.error, errors.motor.ERROR_PHASE_RESISTANCE_OUT_OF_RANGE) + + +class TestEncoderDirFind(): + """ + Runs the encoder index search. + """ + + def is_compatible(self, axis_ctx: AxisTestContext, motor_ctx: MotorTestContext, enc_ctx: EncoderTestContext): + return (axis_ctx.yaml == motor_ctx.yaml['name']) and (axis_ctx.num == enc_ctx.num) # check if connected + + def run_test(self, axis_ctx: AxisTestContext, motor_ctx: MotorTestContext, enc_ctx: EncoderTestContext, logger: Logger): + axis = axis_ctx.handle + # TODO: read teensy config from YAML file + hexfile = 'encoder_pass_through.ino.hex' + program_teensy(os.path.join(os.path.dirname(__file__), hexfile), 26, logger) + time.sleep(1.0) # wait for PLLs to stabilize + + # Set motor calibration values + axis_ctx.handle.motor.config.phase_resistance = float(motor_ctx.yaml['phase-resistance']) + axis_ctx.handle.motor.config.phase_inductance = float(motor_ctx.yaml['phase-inductance']) + axis_ctx.handle.motor.config.pre_calibrated = True + + # Set calibration settings + axis_ctx.handle.motor.config.direction = 0 + axis_ctx.handle.config.calibration_lockin.vel = 12.566 # 2 electrical revolutions per second + + axis_ctx.handle.clear_errors() + + # run test + request_state(axis_ctx, AXIS_STATE_ENCODER_DIR_FIND) + + time.sleep(4) # actual calibration takes 3 seconds + + test_assert_eq(axis_ctx.handle.current_state, AXIS_STATE_IDLE) + test_assert_no_error(axis_ctx) + + test_assert_eq(axis_ctx.handle.motor.config.direction in [-1, 1], True) + + +class TestEncoderOffsetCalibration(): + """ + Runs the encoder index search. + """ + + def is_compatible(self, axis_ctx: AxisTestContext, motor_ctx: MotorTestContext, enc_ctx: EncoderTestContext): + return (axis_ctx.yaml == motor_ctx.yaml['name']) and (axis_ctx.num == enc_ctx.num) # check if connected + + def run_test(self, axis_ctx: AxisTestContext, motor_ctx: MotorTestContext, enc_ctx: EncoderTestContext, logger: Logger): + axis = axis_ctx.handle + # TODO: read teensy config from YAML file + hexfile = 'encoder_pass_through.ino.hex' + program_teensy(os.path.join(os.path.dirname(__file__), hexfile), 26, logger) + time.sleep(1.0) # wait for PLLs to stabilize + + # Set motor calibration values + axis_ctx.handle.motor.config.phase_resistance = float(motor_ctx.yaml['phase-resistance']) + axis_ctx.handle.motor.config.phase_inductance = float(motor_ctx.yaml['phase-inductance']) + axis_ctx.handle.motor.config.pre_calibrated = True + + # Set calibration settings + axis_ctx.handle.motor.config.direction = 0 + enc_ctx.handle.config.use_index = False + enc_ctx.handle.config.calib_scan_omega = 12.566 # 2 electrical revolutions per second + enc_ctx.handle.config.calib_scan_distance = 50.265 # 8 revolutions + + axis_ctx.handle.clear_errors() + + # run test + request_state(axis_ctx, AXIS_STATE_ENCODER_OFFSET_CALIBRATION) + + time.sleep(9) # actual calibration takes 8 seconds + + test_assert_eq(axis_ctx.handle.current_state, AXIS_STATE_IDLE) + test_assert_no_error(axis_ctx) + + test_assert_eq(enc_ctx.handle.is_ready, True) + test_assert_eq(axis_ctx.handle.motor.config.direction in [-1, 1], True) + + +class TestEncoderIndexSearch(): + """ + Runs the encoder index search. + The index pin is triggered manually after three seconds from the testbench + host's GPIO. + """ + + def is_compatible(self, axis_ctx: AxisTestContext, motor_ctx: MotorTestContext, enc_ctx: EncoderTestContext): + return (axis_ctx.yaml == motor_ctx.yaml['name']) and (axis_ctx.num == enc_ctx.num) # check if connected + + def run_test(self, axis_ctx: AxisTestContext, motor_ctx: MotorTestContext, enc_ctx: EncoderTestContext, logger: Logger): + axis = axis_ctx.handle + # TODO: read teensy config from YAML file + hexfile = 'encoder_pass_through.ino.hex' + program_teensy(os.path.join(os.path.dirname(__file__), hexfile), 26, logger) + time.sleep(1.0) # wait for PLLs to stabilize + + # Set motor calibration values + axis_ctx.handle.motor.config.phase_resistance = float(motor_ctx.yaml['phase-resistance']) + axis_ctx.handle.motor.config.phase_inductance = float(motor_ctx.yaml['phase-inductance']) + axis_ctx.handle.motor.config.pre_calibrated = True + + # Set calibration settings + axis_ctx.handle.config.calibration_lockin.vel = 12.566 # 2 electrical revolutions per second + + axis_ctx.handle.clear_errors() + + # run test + request_state(axis_ctx, AXIS_STATE_ENCODER_INDEX_SEARCH) + + time.sleep(3) + + test_assert_eq(enc_ctx.handle.index_found, False) + with open("/sys/class/gpio/gpio{}/value".format(20), "w") as gpio: + gpio.write("0") + time.sleep(0.1) + with open("/sys/class/gpio/gpio{}/value".format(20), "w") as gpio: + gpio.write("1") + test_assert_eq(enc_ctx.handle.index_found, True) + + test_assert_eq(axis_ctx.handle.current_state, AXIS_STATE_IDLE) + test_assert_no_error(axis_ctx) + + test_assert_eq(enc_ctx.handle.shadow_count, 0.0, range=20) + test_assert_eq(enc_ctx.handle.count_in_cpr, 0.0, range=20) + test_assert_eq(enc_ctx.handle.pos_estimate, 0.0, range=20) + test_assert_eq(enc_ctx.handle.pos_cpr, 0.0, range=20) + test_assert_eq(enc_ctx.handle.pos_abs, 0.0, range=20) + + +if __name__ == '__main__': + test_runner.run([ + TestMotorCalibration(), + TestDisconnectedMotorCalibration(), + TestEncoderDirFind(), + TestEncoderOffsetCalibration(), + TestEncoderIndexSearch() + ]) diff --git a/tools/odrive/tests/encoder_pass_through.ino.hex b/tools/odrive/tests/encoder_pass_through.ino.hex new file mode 100644 index 00000000..2f0798bf --- /dev/null +++ b/tools/odrive/tests/encoder_pass_through.ino.hex @@ -0,0 +1,792 @@ +:0200000460009A +:100000004643464200000156000000000101020084 +:1000100000000000000000000000000000000000E0 +:1000200000000000000000000000000000000000D0 +:1000300000000000000000000000000000000000C0 +:1000400000000000010403000000000000000000A8 +:100050000000200000000000000000000000000080 +:100060000000000000000000000000000000000090 +:100070000000000000000000000000000000000080 +:10008000EB04180A063204260000000000000000FD +:10009000050404240000000000000000000000002F +:1000A0000000000000000000000000000000000050 +:1000B0000604000000000000000000000000000036 +:1000C0000000000000000000000000000000000030 +:1000D00020041808000000000000000000000000DC +:1000E0000000000000000000000000000000000010 +:1000F0000000000000000000000000000000000000 +:10010000D8041808000000000000000000000000F3 +:100110000204180804200000000000000000000095 +:1001200000000000000000000000000000000000CF +:10013000600400000000000000000000000000005B +:1001400000000000000000000000000000000000AF +:10015000000000000000000000000000000000009F +:10016000000000000000000000000000000000008F +:10017000000000000000000000000000000000007F +:10018000000000000000000000000000000000006F +:10019000000000000000000000000000000000005F +:1001A000000000000000000000000000000000004F +:1001B000000000000000000000000000000000003F +:1001C000000100000010000001000000000000001D +:1001D000000001000000000000000000000000001E +:1001E000000000000000000000000000000000000F +:1001F00000000000000000000000000000000000FF +:10020000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE +:10021000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEE +:10022000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDE +:10023000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFCE +:10024000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBE +:10025000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFAE +:10026000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF9E +:10027000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF8E +:10028000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7E +:10029000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF6E +:1002A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5E +:1002B000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF4E +:1002C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3E +:1002D000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF2E +:1002E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1E +:1002F000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0E +:10030000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD +:10031000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFED +:10032000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDD +:10033000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFCD +:10034000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBD +:10035000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFAD +:10036000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF9D +:10037000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF8D +:10038000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7D +:10039000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF6D +:1003A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5D +:1003B000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF4D +:1003C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3D +:1003D000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF2D +:1003E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1D +:1003F000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0D +:10040000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC +:10041000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEC +:10042000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDC +:10043000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFCC +:10044000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBC +:10045000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFAC +:10046000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF9C +:10047000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF8C +:10048000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7C +:10049000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF6C +:1004A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5C +:1004B000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF4C +:1004C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3C +:1004D000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF2C +:1004E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1C +:1004F000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0C +:10050000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB +:10051000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEB +:10052000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDB +:10053000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFCB +:10054000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBB +:10055000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFAB +:10056000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF9B +:10057000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF8B +:10058000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7B +:10059000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF6B +:1005A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5B +:1005B000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF4B +:1005C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3B +:1005D000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF2B +:1005E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1B +:1005F000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0B +:10060000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA +:10061000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEA +:10062000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDA +:10063000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFCA +:10064000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBA +:10065000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFAA +:10066000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF9A +:10067000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF8A +:10068000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7A +:10069000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF6A +:1006A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5A +:1006B000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF4A +:1006C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3A +:1006D000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF2A +:1006E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1A +:1006F000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0A +:10070000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF9 +:10071000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE9 +:10072000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD9 +:10073000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC9 +:10074000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB9 +:10075000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA9 +:10076000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF99 +:10077000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF89 +:10078000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF79 +:10079000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF69 +:1007A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF59 +:1007B000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF49 +:1007C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF39 +:1007D000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF29 +:1007E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF19 +:1007F000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF09 +:10080000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF8 +:10081000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE8 +:10082000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD8 +:10083000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC8 +:10084000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB8 +:10085000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA8 +:10086000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF98 +:10087000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF88 +:10088000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF78 +:10089000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF68 +:1008A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF58 +:1008B000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF48 +:1008C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF38 +:1008D000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF28 +:1008E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF18 +:1008F000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF08 +:10090000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7 +:10091000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE7 +:10092000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD7 +:10093000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC7 +:10094000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB7 +:10095000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA7 +:10096000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF97 +:10097000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF87 +:10098000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF77 +:10099000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF67 +:1009A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF57 +:1009B000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF47 +:1009C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF37 +:1009D000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF27 +:1009E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF17 +:1009F000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF07 +:100A0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF6 +:100A1000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE6 +:100A2000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD6 +:100A3000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC6 +:100A4000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB6 +:100A5000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA6 +:100A6000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF96 +:100A7000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF86 +:100A8000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF76 +:100A9000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF66 +:100AA000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF56 +:100AB000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF46 +:100AC000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF36 +:100AD000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF26 +:100AE000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF16 +:100AF000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF06 +:100B0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5 +:100B1000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE5 +:100B2000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD5 +:100B3000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC5 +:100B4000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB5 +:100B5000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA5 +:100B6000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF95 +:100B7000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF85 +:100B8000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF75 +:100B9000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF65 +:100BA000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF55 +:100BB000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF45 +:100BC000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF35 +:100BD000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF25 +:100BE000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF15 +:100BF000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF05 +:100C0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF4 +:100C1000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE4 +:100C2000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD4 +:100C3000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC4 +:100C4000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB4 +:100C5000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA4 +:100C6000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF94 +:100C7000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF84 +:100C8000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF74 +:100C9000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF64 +:100CA000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF54 +:100CB000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF44 +:100CC000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF34 +:100CD000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF24 +:100CE000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF14 +:100CF000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF04 +:100D0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3 +:100D1000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE3 +:100D2000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD3 +:100D3000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC3 +:100D4000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB3 +:100D5000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA3 +:100D6000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF93 +:100D7000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF83 +:100D8000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF73 +:100D9000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF63 +:100DA000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF53 +:100DB000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF43 +:100DC000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF33 +:100DD000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF23 +:100DE000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF13 +:100DF000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF03 +:100E0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF2 +:100E1000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE2 +:100E2000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD2 +:100E3000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC2 +:100E4000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB2 +:100E5000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA2 +:100E6000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF92 +:100E7000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF82 +:100E8000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF72 +:100E9000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF62 +:100EA000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF52 +:100EB000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF42 +:100EC000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF32 +:100ED000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF22 +:100EE000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF12 +:100EF000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF02 +:100F0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1 +:100F1000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE1 +:100F2000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD1 +:100F3000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC1 +:100F4000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB1 +:100F5000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA1 +:100F6000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF91 +:100F7000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF81 +:100F8000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF71 +:100F9000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF61 +:100FA000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF51 +:100FB000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF41 +:100FC000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF31 +:100FD000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF21 +:100FE000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF11 +:100FF000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF01 +:10100000D10020402C100060000000000000000013 +:1010100020100060001000600000000000000000D0 +:1010200000000060403100000000000000000120CE +:1010300035100060764B0720764C4FF42A01764A33 +:101040005C64186499639546744A75498A420FD066 +:10105000744B9A420CD2D4430846234423F0030332 +:1010600004330B4450F8041B984242F8041BF9D196 +:101070006D4A6E498A420FD06D4B9A420CD2D443CE +:101080000846234423F0030304330B4450F8041BA5 +:10109000984242F8041BF9D1664A674B9A420BD238 +:1010A000D04311460024034423F0030304331344C4 +:1010B00041F8044B8B42FBD1604A4FF47001604B06 +:1010C000116003F530715F4A43F8042F9942FBD158 +:1010D0005D4B80215D4A03F8011B9342FBD15C4CC0 +:1010E0004FF080375B4E4FF0FF32DFF8A8A10025AC +:1010F000DFF8A491DFF8A481574B4549C3F800A05D +:10110000C4F80471C4F80091C4F8F470C4F8F08015 +:10111000F36923F07F0343F04003F361736A23F024 +:101120007F0343F0400373628A66CA660A674A67B0 +:1011300000F0B6F8494A6320494B4A49106003223F +:101140001D60CAF8381043F8082C4749474A4848F8 +:10115000C3F8082D0B68474A43F08073CAF83C0077 +:1011600045480B601368454943F001031360036869 +:101170000B6000F0E5F8C4F804714148C4F8009130 +:10118000C4F8F470C4F8F08000F036FA00BF00BF75 +:1011900000BF00BFF16E3B4A41F440513A4BF1664B +:1011A0001560C2F80851C2F81851C2F82851C2F8A7 +:1011B00038519A6BD20708D442F615623349596503 +:1011C0001A659A6B42F001029A632F4A304C936879 +:1011D00043F00113936000F033FA2368132BFCD91A +:1011E00000F05CF900F0D0F900F022FA00F0DAF833 +:1011F00000F006FA2368B3F5967FFBD300F010FAEF +:1012000000F012FA00F008FA00F016FAFAE700BF50 +:1012100000C00A40ABAAAAAA008007200000000074 +:10122000501600602017000000000020742D0060A0 +:10123000D0030020D0030020C032002088ED00E061 +:10124000FC0F00206102000000E400E0A0E400E0E8 +:1012500000800D4000C00F4008ED00E014E000E009 +:1012600018E000E0D90D0000FCED00E000002020B7 +:10127000DD0E0000001000E0041000E0A40D0020CE +:101280000046C3230040084000400D400000C05607 +:10129000A80D0020001000201B1018200C0D1113A9 +:1012A000F0B5194A0021194B4FF0100E18480124CF +:1012B000184E194D0160194FC2F800E01E6015600C +:1012C000174E184D1F601660174F1D60174E184DB2 +:1012D00017601E60174F1560174E184D1F6016607F +:1012E0001D600460BFF34F8FBFF36F8FC3F8B01161 +:1012F000BFF34F8FBFF36F8F52F8883C43F44033F6 +:1013000042F8883CF0BD00BF9CED00E0A0ED00E09D +:1013100094ED00E0250008031100200021000207E1 +:1013200012000020250008131300202027000B13B3 +:101330001400004033001013150000602F000B074D +:10134000F0B4174A40274FF480314FF480564FF4E1 +:1013500000554FF4404443F24200136913F0020F6A +:1013600006D0946151619061136913F0020FF8D1B6 +:1013700013F4005F01D15561EFE713F4805F01D1F1 +:101380005661EAE7002BE8DA13F4803F01D091615F +:10139000E3E75B0601D45761DFE7F0BC704700BFAD +:1013A00000800D40364A03203649F3EE096A13687F +:1013B00023F00103F0B51360C2F89000D1F8E030DB +:1013C000DFF8D4E0DCB2C3F30B202F4FC0EB135394 +:1013D00007EE904AA4F15501CEF80040B8EEE77A46 +:1013E00003EB830407EE900A03FB01F13B6003EB80 +:1013F0008313B8EEE75A07EE901A091B77EE666A78 +:10140000B8EE677A214D07EE901A0B44C5ED006ADD +:10141000F8EE677A1E4EC7EE265A1E4930601068F5 +:1014200087EEA66A07EE903AF8EE677A87EEA67A1C +:1014300075EE855A76EE056AFCEEE55AFCEEE66A34 +:1014400015EE903A40EA035316EE900A77EE057ACD +:10145000136001EA0041D2F81031FCEEE77A0B4349 +:10146000C2F8103117EE903AD2F81011C3F30B0303 +:101470000B43C2F81031136843F002031360F0BD50 +:1014800080810D4000441F40F8030020F403002039 +:10149000FC0300200000FF0FF0030020304B40F65B +:1014A000617270B5C3F8202140F2044500F0B0F835 +:1014B0002C492D48D1F880202C4C42F003022C4BB3 +:1014C000C1F88020C0F86051226813401BB9D0F8E1 +:1014D000A8319A071AD0244B4FF00041234A516398 +:1014E0001A46D3F8401141F00201C3F84011D2F876 +:1014F00040319B07FBD44FF400301E491B4B4FF08B +:101500000042086019209A6300F072F81A4D002218 +:10151000164B4FF08041144C0A26996328461A60F6 +:101520001146C4F8A8614FF4207200F06DF84FF432 +:1015300081064FF4800040F24313104A10492E6098 +:101540002864C4F85851C2F80412C4F848310D4A4E +:101550004FF4003101231160C4F8403170BD00BF69 +:1015600000800D4000C00F4000002E4000900D4054 +:10157000001C1E008CE200E0003000200010002063 +:101580003D0400000CE100E0114B1249D86E0A4600 +:1015900040F4403030B4D86640F2B765D86EA0242D +:1015A00040F44070D8664D648C64936C1B06FCD488 +:1015B000094B40F2B760A021064A58649964936CC5 +:1015C00013F08003FBD1054A137030BC704700BF95 +:1015D00000C00F4000400C4000800C40A10D0020D6 +:1015E000F8B500BFF8BC08BC9E467047FFFFFFFF80 +:1015F0005FF800F0311200005FF800F09D0F00006E +:101600005FF800F07D0200005FF800F07D1600003A +:101610005FF800F03D0B00005FF800F005010000EE +:101620005FF800F02D1600005FF800F001010000E7 +:101630005FF800F0411300005FF800F0FD0E0000BD +:101640005FF800F07902000045000000FFFFFFFF97 +:10165000000000000000000000000000000000008A +:10166000000000000000000000000000000000007A +:1016700010B5054C237833B9044B13B10448AFF3CC +:1016800000800123237010BDD00300200000000063 +:1016900024170000084B10B51BB108490848AFF3E8 +:1016A00000800848036803B910BD074B002BFBD02E +:1016B000BDE81040184700BF00000000D403002020 +:1016C00024170000D00300200000000008B5174BCD +:1016D0000121187800F0ACF8154B0121187800F0C2 +:1016E000A7F8144B0121187800F0A2F8124B012141 +:1016F000187800F09DF8114B0121187800F098F847 +:101700000F4B0121187800F093F80E4B0021187848 +:1017100000F08EF80C4B0021187800F089F80B4B84 +:1017200000211878BDE8084000F082B8F4020020DB +:1017300000030020040300200C0300200803002005 +:10174000F8020020EC030020EC020020F002002050 +:10175000FFF7BCBF174B70B5187800F063F8164B55 +:101760000646187800F05EF8144B0546187800F02D +:1017700059F8134B04463146187800F04DF8114BD8 +:101780002946187800F048F80F4B2146187800F0E9 +:1017900043F80E4B3146187800F03EF80C4B2946C2 +:1017A000187800F039F80B4B21461878BDE87040E6 +:1017B00000F032B8FC020020EC020020F002002011 +:1017C000F402002000030020040300200C0300208A +:1017D00008030020F80200200001074B1A181B58CC +:1017E000D2685868104202D011B9C3F888207047F7 +:1017F000C3F88420704700BF000000200001054BA3 +:101800001A5819189268CB681A4214BF0120002098 +:10181000704700BF00000020272801D8FFF7DCBF79 +:10182000704700BF272801D8FFF7E8BF00207047A6 +:1018300027281CD800011A4A012902EB000310587E +:1018400010B415D0042913D0DC68426822EA0402DF +:1018500042609A68E9B102291ED003295B685DF8ED +:10186000044B0CBF0F491049116015221A607047D4 +:10187000DA680129446842EA040242609A6808D0A2 +:1018800040F6380111605B6815225DF8044B1A6060 +:10189000704738211160F6E704491160F3E700BF93 +:1018A00000000020383001003800010038F001004D +:1018B00004207146084203D0EFF3098000F008B815 +:1018C000EFF3088000F004B8704700BF704700BF16 +:1018D0001B4B05211B4A382030B5C2F8481108219E +:1018E000C2F8380383B05A68174C0A4317485A6045 +:1018F000C3F88410C3F888102368834202D91448BF +:1019000000F074FE0E4D08240020124A1249C5F85A +:1019100084400190019B934205D8019B01330193C0 +:10192000019B9342F9D9C5F888400190019B8B42F5 +:10193000EDD8019B01330193019B8B42F9D9E6E776 +:1019400000C01B4000801F40C4030020FF45C3238C +:1019500000A3E1113F420F003F548900836B30B474 +:101960001BB1536843F40043536072B6446B9CB19F +:10197000104B2260D3F8B0410C4217D1D3F840414C +:1019800044F48044C3F84041D3F8B851D3F84041FF +:101990006404F3D5294209D10023064C8260C36058 +:1019A000D4F8B0311943C4F8B0110263426362B68F +:1019B00030BC704700002E4038B50546036B06E08A +:1019C000AA6B1C6890476A6B2346944208D018465D +:1019D00033B1012B04D05A681206F1D52B6338BD00 +:1019E00000232B636B6338BDF0B5F1B9224C23495A +:1019F0000020234B01228025A1600A601A464D6019 +:101A0000E060D3F8BC41886044F001141D4DC3F878 +:101A1000BC41D3F8B01141F00101C3F8B011286006 +:101A2000D2F8B031002BFBD1F0BD0904164B144D98 +:101A30000126114C41F0800100221E60596000F522 +:101A4000805CE26400F5005EA36400F54057D5F8C1 +:101A5000B01100F580462A46986041F48031C3F801 +:101A60000CC0C3F810E05F619E61C5F8B011D2F8F8 +:101A7000B031002BFBD1BAE700300020202000203D +:101A800000002E400C040020002000202DE9F04F23 +:101A9000BB4C83B0D4F8448118F0010FC4F84481E2 +:101AA0005ED0D4F8AC31002B55D04FF00119DFF8DF +:101AB000F0B22646B34FCA46B96AFA6AC4F8AC31E6 +:101AC000D4F8403143F40053C4F84031D4F84031E5 +:101AD0009D04F5D5D6F8403123F40053C6F84031C3 +:101AE000C6F8B4A1D4F8B43113F00113FAD188B216 +:101AF00040F28165CBF80030A84200F29680B0F544 +:101B0000D06F80F0D881B0F5817F00F0578100F26E +:101B1000D580802800F02681822840F0C78092B2CC +:101B200002F07F01072900F2C18089009648974D95 +:101B30000844016810062B706B7040F1E581C90301 +:101B400001D501232B7002219048FFF74DFFD4F8F7 +:101B5000AC31002BB0D18A4AD2F8BC31002B44D131 +:101B600018F0400F18D0864BD3F8AC111A46C3F8C2 +:101B7000AC11D3F8BC11C3F8BC11D2F8B041804B02 +:101B8000002CFAD14FF0FF32C3F8B421D3F88431DE +:101B900000F074FB7E4B1C6018F0807F03D07D4BFF +:101BA0001B6803B1984718F0007F03D07A4B1B687D +:101BB00003B1984718F0040F02D0714BD3F8843169 +:101BC0006F4BD3F8482112060CD518F0800F09D0BE +:101BD00072490A78002A00F08E81531EDBB20B7026 +:101BE00003B9FBBE03B0BDE8F08F6D49C2F8BC314C +:101BF0000868034240F0CC81654A14681C40AFD0AD +:101C0000630700F1E281670300F1EF81260700F12D +:101C1000E881250300F1E181E00600F1DA81E102CB +:101C20009ED56048FFF7C8FE9AE742F22105A84218 +:101C300038D06FD8B0F5086F00F02F81B0F5106F75 +:101C400034D1C1F30741584A584811705849594A8C +:101C50000193C6F8C801C6F8CC11C6F8D02100F02F +:101C60000FFB554A019B80210120FB6410605160ED +:101C7000D6F8BC11936041F00111BA64C6F8BC11EA +:101C8000D6F8B02142F48032C6F8B021444A13603D +:101C9000D4F8B031002BFBD1D4F8AC31002B7FF459 +:101CA0000BAF58E7100C072800F03281C4F8C09140 +:101CB000D4F8AC31002B7FF4FFAE4CE740F2023594 +:101CC000A84200F0B780B0F5A06FEFD13A4A80206B +:101CD0000125FB6450601560D6F8BC01936040F0AC +:101CE0000113BA64C6F8BC31D6F8B03143F480337E +:101CF000C6F8B031D4F8B031002BFBD10B0C5B0629 +:101D000043F08073C6F85431D4F8AC31002B7FF423 +:101D1000D3AE20E742F22123984200F0828042F2C3 +:101D200021339842C2D1244B012180221960002125 +:101D30005A60D4F8BC21BB6442F001129960F96486 +:101D4000C4F8BC21D4F8B03143F48033C4F8B031C6 +:101D5000D4F8B031002BFBD1D4F8AC31002B7FF498 +:101D6000ABAEF8E6094A0221104613705370FFF734 +:101D70003BFED4F8AC31002B7FF49EAEEBE600BF07 +:101D800000002E4000300020C0012E402004002022 +:101D90000404002000040020080400201004002097 +:101DA0000C04002040320020300400200200CC004F +:101DB000C80002000200C8002020002092B202F0F9 +:101DC0007F03072B3FF672AF12F0800F4FEA8303B9 +:101DD000884A4FF001011A44136814BF23F480337A +:101DE00023F0010313608022834B196000215A60A5 +:101DF000D4F8BC21BB6442F001129960F964C4F8C4 +:101E0000BC21D4F8B03143F48033C4F8B031D4F8F5 +:101E1000B031002BFBD1D4F8AC31002B7FF44CAEA9 +:101E200099E6764BC1F30741754A1868754B106007 +:101E3000197078E792B202F07F03072B3FF636AFB6 +:101E400012F0800F4FEA83036A4A4FF001011A44EF +:101E5000136814BF43F4803343F0010313608022FE +:101E6000654B196000215A60D4F8BC21BB6442F074 +:101E700001129960F964C4F8BC21D4F8B03143F47C +:101E80008033C4F8B031D4F8B031002BFBD1D4F892 +:101E9000AC31002B7FF410AE5DE65B4A01215B4B59 +:101EA000127818461A70FFF79FFDD4F8AC31002B5A +:101EB0007FF402AE4FE6564B586800283FF4F6AE6A +:101EC000090C1FFA82FE04E00C33586800283FF426 +:101ED000EDAE1D888D42F7D15D887545F4D1090AB4 +:101EE000120C03290CBF01781989914228BF1146B1 +:101EF000FFF77AFD2BE6D3F8482122F08002C3F8E1 +:101F0000482103B0BDE8F08FCA077FF51CAE18E684 +:101F1000404D0120FB6029603F4B404918605960EB +:101F20003F49D6F8B0016A6001F5005E40F0010259 +:101F3000A1F5005001F58055BB609860A1F5805077 +:101F4000D860C6F8B02119615D61C3F818E0D4F813 +:101F5000B031002BFBD1284A012048F28001FB64FC +:101F600010604FF480305160D6F8BC11936041F09E +:101F70000113BA64C6F8BC31D6F8B0310343C6F8D1 +:101F8000B031CBF80000D4F8B031002BFBD1DEE546 +:101F9000204C42F22100002524880D6084427FF409 +:101FA0002BAE2049204C03C90D0C86282060A1804F +:101FB000A5717FF421AED2F8481150241B4841F09E +:101FC0008001C2F84811047016E61948FFF7F4FCC6 +:101FD00019E61848FFF7F0FC21E61748FFF7ECFC7C +:101FE0001AE61648FFF7E8FC13E61548FFF7E4FC8D +:101FF0000CE600BFC0012E4020200020A80D0020CC +:1020000088320020800D00203004002020040020B1 +:10201000800200201804002000200020800007001B +:1020200028240020280400208032002010040020F2 +:102030000031002000320020C0310020803100201B +:1020400040310020002AA0F102022DE9F04714BF20 +:1020500000274FF00057022A01D9BDE8F0874FEA68 +:10206000C01ADFF840900D4604460AEB090600212D +:1020700040229846304600F029FE012047EA0541FB +:102080004AF80910C6F83880B060B8F1000FE4D003 +:10209000034BA0401C6820431860BDE8F08700BFD8 +:1020A0000404002000300020002AA0F102022DE9E3 +:1020B000F04714BF00274FF00057022A01D9BDE8AE +:1020C000F0874022C501DFF844908846154400217E +:1020D00004461E4605EB090A504600F0F7FD0122B2 +:1020E00047EA084145F80910CAF83860CAF80820DC +:1020F000002EE4D004F11000034B82401868024324 +:102100001A60BDE8F08700BF040400200030002002 +:1021100012048160C36142F08002F0B44260012782 +:1021200001F5805601F5005501F5405401F5804256 +:102130000760C660056144618261F0BC704700BF02 +:10214000831E022B00D9704730B4064B00F11004F7 +:1021500001250A4603EBC01005FA04F130BCFFF775 +:10216000FDBB00BF40300020831E022B00D970470A +:1021700010B4054B01240A4604FA00F103EBC01029 +:102180005DF8044BFFF7EABB00300020124A134B06 +:10219000D2F8200220F07F40984210B584B002D8D7 +:1021A00000EB800040000E4C01A90A2200F0C8FBA1 +:1021B00001A90023204611F8012B01333AB10A2B63 +:1021C00020F8022FF7D11623237004B010BD5B0056 +:1021D000DBB2237004B010BD00441F407F9698000E +:1021E000A80300204368C269C3F30E43054930B415 +:1021F000C3F14003044C002521F8123024F812509A +:1022000030BC7047000C0020F80B0020F8B5154BCF +:102210001B783BB903F0FF04134B1B7813B1134D2C +:102220002A8802B9F8BD124F2346124EC2F58072B9 +:102230003978114806EB411600EB01213046FFF7D3 +:1022400067FF31460420FFF77BFF3B780133DBB2A9 +:10225000062B98BF3B704FF0000388BF3C702B806B +:10226000F8BD00BF340B002030040020800C00209B +:10227000350B0020A00C002034040020704700BF64 +:102280000021E0222048F8B50C46204E204D00F0F9 +:102290001DFD204F2146204B6022347028461F4EE2 +:1022A0001C8000F013FD23462246102102203C60D2 +:1022B000BC803460B480FFF7F7FE2246184B402103 +:1022C0000320FFF7BFFE2346224640210420FFF7EC +:1022D000EBFE2346402228461249FFF719FF294604 +:1022E0000320FFF741FF104B4A22104910480860B5 +:1022F000C3F88440C3F88020D3F8482142F08072AC +:10230000C3F84821F8BD00BFA00C0020350B002009 +:10231000200C0020000C0020800C0020F80B002076 +:10232000950B0000380B002000002E400004002018 +:10233000BD0B0000024A034B10881B88C01A70476F +:10234000000C0020F80B002010B4EFF3108272B6DE +:10235000437F33B9017F012908D0032910D001231D +:10236000437702B962B65DF8044B7047114C21689F +:10237000A1B1114943610B68086083615861EEE7C0 +:102380000E4C216881B10E4943610B68086083617E +:1023900058610C4B4FF080511960E0E7064B4161EA +:1023A000816120601860DAE7054B4161816120603E +:1023B0001860EEE7940D0020900D0020840D0020A1 +:1023C000880D002004ED00E010B4047F4160022C71 +:1023D000C26003D05DF8044BFFF7B6BF83685DF8B9 +:1023E000044B184770B5EFF3108172B60C4C23689C +:1023F0008BB10C4E00255A6922607AB1956101B902 +:1024000062B65D7718469B689847EFF3108172B605 +:102410002368002BEFD101B962B670BD3260EEE7E0 +:10242000840D0020880D0020FFF7DCBF184A30B46F +:102430001468002C28D0036821688B420FD2CB1A75 +:1024400000218460C1602360E0601060022330BC22 +:10245000037570470360144611688B4208D3A26865 +:102460005B1A002AF6D18260C4600360A060EDE7C9 +:10247000D568CB1A82600222C560E060C1688860BE +:102480002360027530BC70478460C4601060DDE773 +:102490008C0D0020F8B5224E34682CB32368002B35 +:1024A0003AD11D461F4F04E03468ECB12368002B7D +:1024B00032D1A36803B1DD602069336003682575FC +:1024C0001B68BB4221D1037F4560022BC46020D032 +:1024D000FFF73AFF6368002BE6D023602046FFF742 +:1024E000A5FF3468002CE1D1EFF3108372B60E4AD9 +:1024F00000211068116003B962B628B18468FFF743 +:1025000095FF20460028F9D1F8BD224600219847C2 +:10251000E0E783689847DDE7013B2360E4E700BF1D +:102520008C0D0020790D00009C0D0020044A054B05 +:102530001168054A1960136801331360FFF7AABFD9 +:10254000041000E0A40D0020A80D002070B5214C5F +:10255000237883B9204B01221B7822701BBB1F4BB1 +:102560001B78002B29D11E4B00211A68217012B153 +:10257000EFF3058202B170BDEFF3108072B61A68F6 +:10258000F2B1184C2178D9B90126556926701D6021 +:10259000D5B1A96100B962B6002593681046557798 +:1025A0009847257070BDFFF7C5FE0028D7D000F012 +:1025B0005FFB0A4B1B78002BD5D000F045FBD2E720 +:1025C0000028D8D162B670BD074B1D600028E3D14A +:1025D000E1E700BFA00D0020C8030020C80D0020C7 +:1025E000940D0020980D0020900D00208C4A8D4BFA +:1025F00090422DE9F0438C4D5C699969EF681DD9D3 +:102600008A4B984240F20181894B40F22766DFF8FD +:1026100060E20344874D1A0AAEFB0232D30903EB92 +:10262000830303EB830202F2E243B34228BF334643 +:10263000A3F54873A5FB0336F60804E07E4EB042CE +:1026400094BF06260E26774A07F01F0ED2F8803078 +:10265000B64543F0C003C2F880300AD2724B27F06F +:102660001F071A463743DF601368002BFCDA07F0B8 +:102670001F0E14F000732ED1704D714AD5F810C0A2 +:1026800015460CEA0202AA420ABF4FF0C0534FF4AB +:102690008052002284EA030515F0605F06D024F022 +:1026A000605403F060535F4D1C436C6181EA020388 +:1026B00013F4405F08D05B4B21F4405111431A469C +:1026C0009961936C1D07FCD444F00074554A546121 +:1026D000936C9906FCD401215A4D0A4601FB02F382 +:1026E00000FB03F3AB4209D8072A00F284800132D1 +:1026F00001FB02F300FB03F3AB42F5D95248534D03 +:102700001844A5FB0030030D6C2B79D8352B7ED8EF +:10271000DFF8608136234E48DFF820C14D4DDCF8EC +:102720000090B0FBF2F009EA05054545B0FBF1F079 +:102730000BD043F400534FF480586546CCF800802A +:10274000CCF800302B68002BFCDADFF8D8C0013A57 +:10275000DCF8103003F00703934207D002F00702C1 +:102760006546CCF81020AB6CDB03FCD40139890240 +:1027700084EA010313F4E05F0AD02A4B24F4E05406 +:1027800001F4E0511A460C435C61936C9907FCD448 +:10279000314B32490344DB09A1FB0331090B042906 +:1027A00028BF04214B1E1B0284EA030212F4407F5F +:1027B00006D024F4407403F440731A4A1C43546155 +:1027C000184B24F000741A465C61936C9B06FCD491 +:1027D000B0FBF1F1224A7645224B1060196008D215 +:1027E000114B27F01F071A463743DF601368002B91 +:1027F000FCDABDE8F083042980D8013101226DE7BD +:10280000DFF874806C23184886E712261BE7174808 +:10281000DFF8688000FB03F043EA08087CE700BFAC +:1028200000A4781F00C00F40000008400046C323EA +:1028300000BA3CDC1F85EB5100366E0100800D4074 +:1028400040300080FFB19F26808D5B00819F5E1627 +:1028500000B29F267F3001807FD1F0089F10E500F5 +:10286000C4030020C003002000643F4D001BB700DC +:1028700023B24C00362000806C20008000200080B5 +:10288000002852D02DE9F04F814683B0274C01201B +:10289000274D284E54E8003F2A68316844E8000379 +:1028A000002BF7D1244F4FF47A7E2448D7F800C08C +:1028B000BB4607F1C6470368C1EB0C0107F5DE17FD +:1028C00007F67F67A7FB03C3BA4601279B0CB1FB42 +:1028D000F3F30EFB023854E8003F2A68316844E8FD +:1028E0000073002BF7D1DBF800C04FF47A7E036849 +:1028F0000EFB02F2C1EB0C01AAFB033EC8EB020384 +:102900004FEA9E42B1FBF2F1CA18B2F57A7F07D3C3 +:10291000B9F1010908F57A78DDD103B0BDE8F08F8F +:102920000190FFF713FE0198D5E770478C32002025 +:10293000A80D0020A40D0020041000E0C403002016 +:10294000F0B44E1E0025374600E00135B0FBF2F32F +:1029500002FB130000F13704092800F13000E4B253 +:1029600098BFC4B2184607F8014F002BEDD14A19A1 +:1029700053704DB1013316F8014F1778E81A3770CC +:10298000834202F80149F5DB0846F0BC704700BFFE +:10299000A4484FF00F0CA44B826F42F47F02F0B5B5 +:1029A00082670025D0F880204FF470469F4C4FF48A +:1029B000604E29464FF4806714432A46C0F8804091 +:1029C000A3F88C6148F2B826A3F88EC1A3F8905101 +:1029D000B3F8880180B240F0F000A3F8880101EB61 +:1029E0004100914B0131002540011C46042903445C +:1029F000A3F804E0DF805A841A865A805A81DE8167 +:102A00005A82DA825A83DA83E9D1B4F888014FF026 +:102A10000F0C874B4FF4704680B229464FF4604745 +:102A20002A4640EA0C004FF4806EA4F88801B4F8FE +:102A3000880180B240F47060A4F88801A3F88C612A +:102A400048F2B826A3F88EC1A3F89051B3F88801D4 +:102A500080B240F0F000A3F8880101EB4100744B14 +:102A60000131002540011C46042903449F80A3F83E +:102A700006E05A841A865A805A81DE815A82DA82A6 +:102A80005A83DA83E9D1B4F888014FF00F0C694B0F +:102A90004FF4704680B229464FF460472A4640EA18 +:102AA0000C004FF4806EA4F88801B4F8880180B25D +:102AB00040F47060A4F88801A3F88C6148F2B8264D +:102AC000A3F88EC1A3F89051B3F8880180B240F00A +:102AD000F000A3F8880101EB4100564B01310025BD +:102AE00040011C46042903449F80A3F806E05A8451 +:102AF0001A865A805A81DE815A82DA825A83DA83B0 +:102B0000E9D1B4F888014FF00F0C4B4B4FF47047EC +:102B100080B229464FF460462A4640EA0C004FF442 +:102B2000806EA4F88801B4F8880180B240F4706027 +:102B3000A4F88801A3F88C7148F2B827A3F88EC1D5 +:102B4000A3F89051B3F8880180B240F0F000A3F8E8 +:102B5000880101EB4100384B013140011C4604293A +:102B600003449E80A3F806E05A841A865A805A814C +:102B7000DF815A82DA825A83DA83EAD1B4F8883163 +:102B80000F27002241F201069BB245F6C05E1146B6 +:102B900043F226053B43A4F88831B4F888319BB250 +:102BA00043F47063A4F888315001244B013203448C +:102BB000042A99815981DF819E82A3F806E0198059 +:102BC00019829D81F0D100220F2741F2010645F6BE +:102BD000C055114643F226045001194B01320344FB +:102BE000042A99815981DF819E82DD8019801982B2 +:102BF0009C81F1D100220F2741F2010645F6C05514 +:102C0000114643F2260450010E4B01320344042ABC +:102C100099815981DF819E82DD80198019829C8192 +:102C2000F1D1F0BD00C00F4000C03D40000003FCEA +:102C300000003E4000403E4000803E4000C01D403D +:102C400000001E4000401E4038B5074B1C784CB1B8 +:102C5000064D55F8043F002BFBD09847631E13F038 +:102C6000FF04F6D138BD00BFC80D0020A80D00201C +:102C7000014B00221A707047C803002070B50F4E38 +:102C80000F4D761BB61018BF002405D0013455F83F +:102C9000043B9847A642F9D10A4E0B4D761B00F033 +:102CA00063F8B61018BF002406D0013455F8043B71 +:102CB0009847A642F9D170BD70BD00BF48160060AC +:102CC000481600604C1600604816006070B4840717 +:102CD00046D0541E002A41D0CDB2034602E0621E07 +:102CE000E4B3144603F8015B9A07F8D1032C2ED9FC +:102CF000CDB245EA05250F2C45EA054519D903F162 +:102D000010022646103E0F2E42F8105C42F80C5C72 +:102D100042F8085C42F8045C02F11002F2D8A4F117 +:102D2000100222F00F0204F00F041032032C13449F +:102D30000DD91E462246043A032A46F8045BFAD807 +:102D4000221F22F003020432134404F003042CB1C6 +:102D5000C9B21C4403F8011BA342FBD170BC7047ED +:102D600014460346C2E700BF5FF800F0E1150060BB +:042D7000F8B500BFF3 +:102D740000000042C8801F40B8821F4008000000C5 +:102D840000000042C4801F40B4821F4004000000C1 +:102D940000C0004224801F4014821F401000000025 +:102DA40000C0004228801F4018821F4020000000FD +:102DB40000C000422C801F401C821F4040000000C5 +:102DC40000C0004234801F4024821F4000010000E4 +:102DD4000040004264811F4054831F4000040000EF +:102DE4000040004280811F4070831F4000000200A9 +:102DF400004000427C811F406C831F4000000100A2 +:102E04000040004268811F4058831F4000080000B2 +:102E1400004000423C811F402C831F400100000001 +:102E24000040004244811F4034831F4004000000DE +:102E34000040004240811F4030831F4002000000D8 +:102E44000040004248811F4038831F4008000000B2 +:102E54000000004204811F40F4821F40000004006F +:102E64000000004208811F40F8821F400000080053 +:102E74000000004218811F4008831F4000008000AA +:102E84000000004214811F4004831F4000004000E2 +:102E94000000004200811F40F0821F400000020039 +:102EA40000000042FC801F40EC821F400000010033 +:102EB4000000004224811F4014831F4000000004CE +:102EC4000000004228811F4018831F4000000008B2 +:102ED400000000421C811F400C831F4000000001C1 +:102EE4000000004220811F4010831F4000000002A8 +:102EF40000000042EC801F40DC821F4000100000F4 +:102F040000000042F0801F40E0821F4000200000CB +:102F14000000004234811F4024831F400000004011 +:102F24000000004238811F4028831F4000000080B9 +:102F34000080004294801F4084821F4000000400EF +:102F440000C0004290801F4080821F40000000802B +:102F540000800042A8801F4098821F40000080002B +:102F640000800042A4801F4094821F400000400063 +:102F7400004000426C811F405C831F400010000031 +:102F840000C0004230801F4020821F4080000000AB +:102F940000800042C8811F40B8831F4000800000A9 +:102FA40000800042C4811F40B4831F4000400000E1 +:102FB40000800042C0811F40B0831F4000200000F9 +:102FC40000800042BC811F40AC831F400010000001 +:102FD40000800042D0811F40C0831F4000000200D7 +:102FE40000800042CC811F40BC831F4000000100D0 +:102FF4000001000078030020120000000006000019 +:10300400100300200A000000000200003403002026 +:1030140043000000000700003403002043000000C8 +:1030240000030000A40300200000000001030904C1 +:103034001C03002000000000020309048C0300208C +:103044000000000003030904A8030020000000009E +:10305400000000000000000000000000010000006B +:10306400020000001700000012000000040000002D +:1030740016000000150000001300000014000000FA +:103084000A06000202000040010000001803540078 +:10309400650065006E0073007900640075006900C6 +:1030A4006E006F0009024300020100C032090400EF +:1030B40000010202010005240010010524010101A0 +:1030C40004240206052406000107058203100010EB +:1030D40009040100020A0000000705030240000081 +:1030E40007058402400000001201000202000040B3 +:1030F400C01683047902010203010000160355007F +:103104005300420020005300650072006900610012 +:103114006C000000040309040C030000000000001C +:10312400000000000000000000000000000000009B +:103134000029DE07007B9A17010000000000000050 +:040000056000100087 +:00000001FF diff --git a/tools/odrive/tests/motor_calibration_test.py b/tools/odrive/tests/motor_calibration_test.py deleted file mode 100644 index e755f832..00000000 --- a/tools/odrive/tests/motor_calibration_test.py +++ /dev/null @@ -1,70 +0,0 @@ - -import test_runner - -import time -from math import pi -import os - -from fibre.utils import Logger -from test_runner import AxisTestContext, MotorTestContext, test_assert_eq, test_assert_no_error, request_state -from odrive.enums import * - -def modpm(val, range): - return ((val + (range / 2)) % range) - (range / 2) - -class TestMotorCalibration(): - """ - Runs the motor calibration and checks if the measurements match the expectation. - """ - - def is_compatible(self, axis_ctx: AxisTestContext, motor_ctx: MotorTestContext): - return axis_ctx.yaml == motor_ctx.yaml['name'] # check if connected - - def run_test(self, axis_ctx: AxisTestContext, motor_ctx: MotorTestContext, logger: Logger): - # reset old calibration values - axis_ctx.handle.motor.config.phase_resistance = 0.0 - axis_ctx.handle.motor.config.phase_inductance = 0.0 - - axis_ctx.handle.clear_errors() - - # run calibration - request_state(axis_ctx, AXIS_STATE_MOTOR_CALIBRATION) - time.sleep(6) - test_assert_eq(axis_ctx.handle.current_state, AXIS_STATE_IDLE) - test_assert_no_error(axis_ctx) - - # check if measurements match expectation - test_assert_eq(axis_ctx.handle.motor.config.phase_resistance, float(motor_ctx.yaml['phase-resistance']), accuracy=0.2) - test_assert_eq(axis_ctx.handle.motor.config.phase_inductance, float(motor_ctx.yaml['phase-inductance']), accuracy=0.5) - - -class TestDisconnectedMotorCalibration(): - """ - Tests if the motor calibration fails as expected if the phases are floating. - """ - - def is_compatible(self, axis_ctx: AxisTestContext): - return axis_ctx.yaml == 'floating' - - def run_test(self, axis_ctx: AxisTestContext, logger: Logger): - axis = axis_ctx.handle - - # reset old calibration values - axis_ctx.handle.motor.config.phase_resistance = 0.0 - axis_ctx.handle.motor.config.phase_inductance = 0.0 - - axis_ctx.handle.clear_errors() - - # run test - request_state(axis_ctx, AXIS_STATE_MOTOR_CALIBRATION) - time.sleep(6) - test_assert_eq(axis_ctx.handle.current_state, AXIS_STATE_IDLE) - test_assert_eq(axis_ctx.handle.error, errors.axis.ERROR_MOTOR_FAILED) - test_assert_eq(axis_ctx.handle.motor.error, errors.motor.ERROR_PHASE_RESISTANCE_OUT_OF_RANGE) - - -if __name__ == '__main__': - test_runner.run([ - TestMotorCalibration(), - TestDisconnectedMotorCalibration() - ])