From 13173a30dcac56d2d1213156087b2276bf3cba3f Mon Sep 17 00:00:00 2001 From: timecop Date: Fri, 24 Feb 2012 03:42:07 +0000 Subject: [PATCH] added dynamic mixer stuff moved around features/sensors setting stuff into config instead of drv_system saving features to eeprom now to avoid stupid added gcc crap for __nop and __dmb added digital servo feature to pwm driver, used for tri or whatever added just plain reboot option in addition to reboot to bootloader git-svn-id: https://afrodevices.googlecode.com/svn/trunk/baseflight@93 7c89a4a9-59b9-e629-4cfe-3a2d53b20e61 --- baseflight.uvgui.timecop | 1106 ++++++++++++++++++++++++++++++++------ baseflight.uvopt | 215 +++----- baseflight.uvproj | 49 +- board.h | 2 + config.c | 85 ++- drv_bmp085.c | 4 + drv_i2c.c | 12 +- drv_pwm.c | 11 +- drv_pwm.h | 2 +- drv_system.c | 43 +- drv_system.h | 11 +- imu.c | 40 +- main.c | 6 +- mixer.c | 339 +++++++----- mw.c | 6 - mw.h | 77 +-- serial.c | 20 +- 17 files changed, 1361 insertions(+), 667 deletions(-) diff --git a/baseflight.uvgui.timecop b/baseflight.uvgui.timecop index c325186e6..9a6fac964 100755 --- a/baseflight.uvgui.timecop +++ b/baseflight.uvgui.timecop @@ -5,29 +5,23 @@
### uVision Project, (C) Keil Software
- - - System Viewer\I2C2 - - 133 - - + 38003 Registers - 115 100 + 115 93 346 Code Coverage - 1136 261 + 1136 680 204 Performance Analyzer - 1296 194 194 100 + 1296 194 194 132 @@ -96,8 +90,8 @@ 0 - 1795 - 01000000040000000100000001000000010000000100000000000000020000000000000001000000010000000000000028000000280000000100000015000000080000000100000035443A5C666C795F3132325C70726F6A656374735C62617365666C696768745C737461727475705F73746D3332663130785F6D642E730000000016737461727475705F73746D3332663130785F6D642E7300000000A5C2D700FFFFFFFF28443A5C666C795F3132325C70726F6A656374735C62617365666C696768745C6472765F6164632E6300000000096472765F6164632E63000000005FC3CF00FFFFFFFF28443A5C666C795F3132325C70726F6A656374735C62617365666C696768745C6472765F6932632E6800000000096472765F6932632E6800000000FFDC7800FFFFFFFF23443A5C666C795F3132325C70726F6A656374735C62617365666C696768745C6D772E6800000000046D772E6800000000C5D4F200FFFFFFFF52443A5C666C795F3132325C70726F6A656374735C62617365666C696768745C6C69625C53544D3332463130785F5374645065726970685F4472697665725C7372635C73746D3332663130785F6770696F2E63000000001073746D3332663130785F6770696F2E6300000000C1838300FFFFFFFF25443A5C666C795F3132325C70726F6A656374735C62617365666C696768745C6D61696E2E6300000000066D61696E2E6300000000B5E99D00FFFFFFFF26443A5C666C795F3132325C70726F6A656374735C62617365666C696768745C626F6172642E680000000007626F6172642E6800000000C5D4F200FFFFFFFF27443A5C666C795F3132325C70726F6A656374735C62617365666C696768745C73657269616C2E63000000000873657269616C2E6300000000FFDC7800FFFFFFFF23443A5C666C795F3132325C70726F6A656374735C62617365666C696768745C6D772E6300000000046D772E6300000000BECEA100FFFFFFFF2C443A5C666C795F3132325C70726F6A656374735C62617365666C696768745C6472765F6D7075333035302E63000000000D6472765F6D7075333035302E6300000000F0A0A100FFFFFFFF2C443A5C666C795F3132325C70726F6A656374735C62617365666C696768745C6472765F6164786C3334352E63000000000D6472765F6164786C3334352E6300000000BCA8E100FFFFFFFF2D443A5C666C795F3132325C70726F6A656374735C62617365666C696768745C6472765F686D63353838336C2E63000000000E6472765F686D63353838336C2E63000000009CC1B600FFFFFFFF24443A5C666C795F3132325C70726F6A656374735C62617365666C696768745C696D752E630000000005696D752E6300000000F7B88600FFFFFFFF28443A5C666C795F3132325C70726F6A656374735C62617365666C696768745C73656E736F72732E63000000000973656E736F72732E6300000000D9ADC200FFFFFFFF28443A5C666C795F3132325C70726F6A656374735C62617365666C696768745C6472765F6932632E6300000000096472765F6932632E6300000000B5E99D00FFFFFFFF2B443A5C666C795F3132325C70726F6A656374735C62617365666C696768745C6472765F626D703038352E63000000000C6472765F626D703038352E6300000000B3A6BE00FFFFFFFF2B443A5C666C795F3132325C70726F6A656374735C62617365666C696768745C6472765F73797374656D2E63000000000C6472765F73797374656D2E6300000000EAD6A300FFFFFFFF51443A5C666C795F3132325C70726F6A656374735C62617365666C696768745C6C69625C53544D3332463130785F5374645065726970685F4472697665725C7372635C73746D3332663130785F7263632E63000000000F73746D3332663130785F7263632E6300000000F6FA7D00FFFFFFFF51443A5C666C795F3132325C70726F6A656374735C62617365666C696768745C6C69625C53544D3332463130785F5374645065726970685F4472697665725C696E635C73746D3332663130785F7263632E68000000000F73746D3332663130785F7263632E68000000005FC3CF00FFFFFFFF52443A5C666C795F3132325C70726F6A656374735C62617365666C696768745C6C69625C53544D3332463130785F5374645065726970685F4472697665725C696E635C73746D3332663130785F6770696F2E68000000001073746D3332663130785F6770696F2E6800000000CACAD500FFFFFFFF28443A5C666C795F3132325C70726F6A656374735C62617365666C696768745C6472765F70776D2E6300000000096472765F70776D2E6300000000BCA8E100FFFFFFFF0100000010000000C5D4F200FFDC7800BECEA100F0A0A100BCA8E1009CC1B600F7B88600D9ADC200A5C2D700B3A6BE00EAD6A300F6FA7D00B5E99D005FC3CF00C1838300CACAD500010000000000000002000000DE0000005E00000000080000FE020000 + 629 + 01000000040000000100000001000000010000000100000000000000020000000000000001000000010000000000000028000000280000000100000007000000030000000100000027443A5C666C795F3132325C70726F6A656374735C62617365666C696768745C636F6E6669672E630000000008636F6E6669672E6300000000FFDC7800FFFFFFFF2B443A5C666C795F3132325C70726F6A656374735C62617365666C696768745C6472765F73797374656D2E63000000000C6472765F73797374656D2E6300000000BECEA100FFFFFFFF23443A5C666C795F3132325C70726F6A656374735C62617365666C696768745C6D772E6800000000046D772E6800000000BCA8E100FFFFFFFF25443A5C666C795F3132325C70726F6A656374735C62617365666C696768745C6D61696E2E6300000000066D61696E2E6300000000F0A0A100FFFFFFFF26443A5C666C795F3132325C70726F6A656374735C62617365666C696768745C6D697865722E6300000000076D697865722E6300000000BCA8E100FFFFFFFF27443A5C666C795F3132325C70726F6A656374735C62617365666C696768745C73657269616C2E63000000000873657269616C2E63000000009CC1B600FFFFFFFF2B443A5C666C795F3132325C70726F6A656374735C62617365666C696768745C6472765F73797374656D2E68000000000C6472765F73797374656D2E6800000000F7B88600FFFFFFFF0100000010000000C5D4F200FFDC7800BECEA100F0A0A100BCA8E1009CC1B600F7B88600D9ADC200A5C2D700B3A6BE00EAD6A300F6FA7D00B5E99D005FC3CF00C1838300CACAD500010000000000000002000000DE0000005E00000000080000FE020000 @@ -1583,6 +1577,26 @@ 0A0000000A0000006E0000006E000000 + + 50029 + 50029 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + 0300000082020000930100009B020000 + + + 16 + 0A0000000A0000006E0000006E000000 + + 50034 50034 @@ -2303,6 +2317,26 @@ 0A0000000A0000006E0000006E000000 + + 50393 + 50393 + 1 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + 6B04000075000000F50500008E000000 + + + 16 + 0A0000000A0000006E0000006E000000 + + 50407 50407 @@ -2923,6 +2957,46 @@ 0A0000000A0000006E0000006E000000 + + 50646 + 50646 + 1 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + E100000075000000F50500008E000000 + + + 16 + 0A0000000A0000006E0000006E000000 + + + + 50649 + 50649 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + 0300000082020000930100009B020000 + + + 16 + 0A0000000A0000006E0000006E000000 + + 50666 50666 @@ -2943,6 +3017,26 @@ 0A0000000A0000006E0000006E000000 + + 50671 + 50671 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + 0300000082020000930100009B020000 + + + 16 + 0A0000000A0000006E0000006E000000 + + 50678 50678 @@ -3183,6 +3277,66 @@ 0A0000000A0000006E0000006E000000 + + 50730 + 50730 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + 0300000082020000930100009B020000 + + + 16 + 0A0000000A0000006E0000006E000000 + + + + 50734 + 50734 + 1 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + E100000075000000F50500008E000000 + + + 16 + 0A0000000A0000006E0000006E000000 + + + + 50741 + 50741 + 1 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + E100000075000000F50500008E000000 + + + 16 + 0A0000000A0000006E0000006E000000 + + 50743 50743 @@ -3283,6 +3437,66 @@ 0A0000000A0000006E0000006E000000 + + 50758 + 50758 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + 0300000082020000930100009B020000 + + + 16 + 0A0000000A0000006E0000006E000000 + + + + 50761 + 50761 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + 0300000082020000930100009B020000 + + + 16 + 0A0000000A0000006E0000006E000000 + + + + 50764 + 50764 + 1 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + 6B04000075000000F50500008E000000 + + + 16 + 0A0000000A0000006E0000006E000000 + + 50770 50770 @@ -3343,6 +3557,126 @@ 0A0000000A0000006E0000006E000000 + + 50784 + 50784 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + 0300000082020000930100009B020000 + + + 16 + 0A0000000A0000006E0000006E000000 + + + + 50786 + 50786 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + 0300000082020000930100009B020000 + + + 16 + 0A0000000A0000006E0000006E000000 + + + + 50791 + 50791 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + 0300000082020000930100009B020000 + + + 16 + 0A0000000A0000006E0000006E000000 + + + + 50793 + 50793 + 1 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + 6B04000075000000F50500008E000000 + + + 16 + 0A0000000A0000006E0000006E000000 + + + + 50796 + 50796 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + 0300000082020000930100009B020000 + + + 16 + 0A0000000A0000006E0000006E000000 + + + + 50801 + 50801 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + 0300000082020000930100009B020000 + + + 16 + 0A0000000A0000006E0000006E000000 + + 50803 50803 @@ -3383,6 +3717,146 @@ 0A0000000A0000006E0000006E000000 + + 50818 + 50818 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + 0300000082020000930100009B020000 + + + 16 + 0A0000000A0000006E0000006E000000 + + + + 50826 + 50826 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + 0300000082020000930100009B020000 + + + 16 + 0A0000000A0000006E0000006E000000 + + + + 50841 + 50841 + 1 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + 6B04000075000000F50500008E000000 + + + 16 + 0A0000000A0000006E0000006E000000 + + + + 50846 + 50846 + 1 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + 6B04000075000000F50500008E000000 + + + 16 + 0A0000000A0000006E0000006E000000 + + + + 50848 + 50848 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + 0300000082020000930100009B020000 + + + 16 + 0A0000000A0000006E0000006E000000 + + + + 50852 + 50852 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + 0300000082020000930100009B020000 + + + 16 + 0A0000000A0000006E0000006E000000 + + + + 50864 + 50864 + 1 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + E100000075000000F50500008E000000 + + + 16 + 0A0000000A0000006E0000006E000000 + + 50890 50890 @@ -3576,7 +4050,7 @@ 0 16 - 00000000000000000108000017000000 + 00000000000000000008000017000000 16 @@ -3612,7 +4086,7 @@ File 2002 - 00200000010000002800FFFF01001100434D4643546F6F6C426172427574746F6E00E100000000000000000000000000000000000000000000000100000001000000018001E100000000000001000000000000000000000000000000000100000001000000018003E1000000000000020000000000000000000000000000000001000000010000000180CD7F0000000000000300000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF000000000000000000000000000100000001000000018023E100000000040004000000000000000000000000000000000100000001000000018022E100000000000005000000000000000000000000000000000100000001000000018025E10000000000000600000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF00000000000000000000000000010000000100000001802BE10000000000000700000000000000000000000000000000010000000100000001802CE10000000004000800000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF00000000000000000000000000010000000100000001807A8A0000000000000900000000000000000000000000000000010000000100000001807B8A0000000004000A00000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF0000000000000000000000000001000000010000000180D3B00000000000000B000000000000000000000000000000000100000001000000018015B10000000004000C0000000000000000000000000000000001000000010000000180F4B00000000004000D000000000000000000000000000000000100000001000000018036B10000000004000E00000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF0000000000000000000000000001000000010000000180FF88000000000400460000000000000000000000000000000001000000010000000180FE880000000004004500000000000000000000000000000000010000000100000001800B810000000004001300000000000000000000000000000000010000000100000001800C810000000004001400000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF0000000000000000000000000001000000010000000180F0880000020000000F000000000000000000000000000000000100000001000000FFFF0100120043555646696E64436F6D626F427574746F6EE803000000000000000000000000000000000000000000000001000000010000009600000002002050FFFFFFFF0096000000000000000000018024E10000000000001100000000000000000000000000000000010000000100000001800A810000000000001200000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF000000000000000000000000000100000001000000018022800000020000001500000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF0000000000000000000000000001000000010000000180C488000000000000160000000000000000000000000000000001000000010000000180C988000000000400180000000000000000000000000000000001000000010000000180C788000000000000190000000000000000000000000000000001000000010000000180C8880000000000001700000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF000000000000000000000000000100000001000000FFFF01001500434D4643546F6F6C4261724D656E75427574746F6E4C010000020000001A0000000F50726F6A6563742057696E646F7773000000000000000000000000010000000100000000000000000000000100000008002880DD880000000000001A0000000750726F6A656374000000000000000000000000010000000100000000000000000000000100000000002880DC8B0000000000003A00000005426F6F6B73000000000000000000000000010000000100000000000000000000000100000000002880E18B0000000000003B0000000946756E6374696F6E73000000000000000000000000010000000100000000000000000000000100000000002880E28B000000000000400000000954656D706C6174657300000000000000000000000001000000010000000000000000000000010000000000288018890000000000003D0000000E536F757263652042726F777365720000000000000000000000000100000001000000000000000000000001000000000028800000000000000400FFFFFFFF00000000000000000001000000000000000100000000000000000000000100000000002880D988000000000000390000000C4275696C64204F7574707574000000000000000000000000010000000100000000000000000000000100000000002880E38B000000000000410000000B46696E64204F75747075740000000000000000000000000100000001000000000000000000000001000000000001800000000001000000FFFFFFFF0000000000000000000000000001000000010000000180FB7F0000000000001B000000000000000000000000000000000100000001000000000000000446696C6572030000 + 00200000010000002800FFFF01001100434D4643546F6F6C426172427574746F6E00E100000000000000000000000000000000000000000000000100000001000000018001E100000000000001000000000000000000000000000000000100000001000000018003E1000000000000020000000000000000000000000000000001000000010000000180CD7F0000000000000300000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF000000000000000000000000000100000001000000018023E100000000040004000000000000000000000000000000000100000001000000018022E100000000000005000000000000000000000000000000000100000001000000018025E10000000000000600000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF00000000000000000000000000010000000100000001802BE10000000000000700000000000000000000000000000000010000000100000001802CE10000000004000800000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF00000000000000000000000000010000000100000001807A8A0000000000000900000000000000000000000000000000010000000100000001807B8A0000000004000A00000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF0000000000000000000000000001000000010000000180D3B00000000000000B000000000000000000000000000000000100000001000000018015B10000000004000C0000000000000000000000000000000001000000010000000180F4B00000000004000D000000000000000000000000000000000100000001000000018036B10000000004000E00000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF0000000000000000000000000001000000010000000180FF88000000000400460000000000000000000000000000000001000000010000000180FE880000000004004500000000000000000000000000000000010000000100000001800B810000000004001300000000000000000000000000000000010000000100000001800C810000000004001400000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF0000000000000000000000000001000000010000000180F0880000020000000F000000000000000000000000000000000100000001000000FFFF0100120043555646696E64436F6D626F427574746F6EE803000000000000000000000000000000000000000000000001000000010000009600000002002050FFFFFFFF0096000000000000000000018024E10000000000001100000000000000000000000000000000010000000100000001800A810000000000001200000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF000000000000000000000000000100000001000000018022800000020000001500000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF0000000000000000000000000001000000010000000180C488000000000000160000000000000000000000000000000001000000010000000180C988000000000400180000000000000000000000000000000001000000010000000180C788000000000000190000000000000000000000000000000001000000010000000180C8880000000000001700000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF000000000000000000000000000100000001000000FFFF01001500434D4643546F6F6C4261724D656E75427574746F6E4C010000020001001A0000000F50726F6A6563742057696E646F7773000000000000000000000000010000000100000000000000000000000100000008002880DD880000000000001A0000000750726F6A656374000000000000000000000000010000000100000000000000000000000100000000002880DC8B0000000000003A00000005426F6F6B73000000000000000000000000010000000100000000000000000000000100000000002880E18B0000000000003B0000000946756E6374696F6E73000000000000000000000000010000000100000000000000000000000100000000002880E28B000000000000400000000954656D706C6174657300000000000000000000000001000000010000000000000000000000010000000000288018890000000000003D0000000E536F757263652042726F777365720000000000000000000000000100000001000000000000000000000001000000000028800000000000000400FFFFFFFF00000000000000000001000000000000000100000000000000000000000100000000002880D988000000000000390000000C4275696C64204F7574707574000000000000000000000000010000000100000000000000000000000100000000002880E38B000000000000410000000B46696E64204F75747075740000000000000000000000000100000001000000000000000000000001000000000001800000000001000000FFFFFFFF0000000000000000000000000001000000010000000180FB7F0000000000001B000000000000000000000000000000000100000001000000000000000446696C6572030000 1423 @@ -3677,11 +4151,11 @@ 0 16 - DE0000004B0000006C06000092010000 + DE0000004B0000000008000092010000 16 - DE0000005E0000006C060000A5010000 + DE0000005E00000000080000A5010000 @@ -3697,7 +4171,7 @@ 0 16 - 0300000062000000D700000003030000 + 0300000062000000D70000004C020000 16 @@ -3737,7 +4211,7 @@ 0 16 - 0704000037030000FD07000025040000 + 0704000080020000FD0700006E030000 16 @@ -3757,7 +4231,7 @@ 0 16 - 0704000037030000FD07000025040000 + 0704000080020000FD0700006E030000 16 @@ -3777,7 +4251,7 @@ 0 16 - 0704000037030000FD07000025040000 + 0704000080020000FD0700006E030000 16 @@ -3797,7 +4271,7 @@ 0 16 - 0704000037030000FD07000025040000 + 0704000080020000FD0700006E030000 16 @@ -3837,7 +4311,7 @@ 0 16 - E1000000620000006906000079010000 + E100000062000000FD07000079010000 16 @@ -3857,7 +4331,7 @@ 0 16 - 0704000037030000FD07000025040000 + 0704000080020000FD0700006E030000 16 @@ -3877,7 +4351,7 @@ 0 16 - 0704000037030000FD07000025040000 + 0704000080020000FD0700006E030000 16 @@ -3897,7 +4371,7 @@ 0 16 - 0704000037030000FD07000025040000 + 0704000080020000FD0700006E030000 16 @@ -3917,7 +4391,7 @@ 0 16 - 0704000037030000FD07000025040000 + 0704000080020000FD0700006E030000 16 @@ -3937,7 +4411,7 @@ 0 16 - 0704000037030000FD07000025040000 + 0704000080020000FD0700006E030000 16 @@ -3957,7 +4431,7 @@ 0 16 - 0704000037030000FD07000025040000 + 0704000080020000FD0700006E030000 16 @@ -3977,7 +4451,7 @@ 0 16 - 0704000037030000FD07000025040000 + 0704000080020000FD0700006E030000 16 @@ -4057,7 +4531,7 @@ 0 16 - 0000000020030000000400003E040000 + 00000000690200000004000087030000 16 @@ -4067,17 +4541,17 @@ 199 199 - 0 + 1 0 0 - 0 + 1 32767 0 4096 0 16 - 03000000A2030000FD07000025040000 + 000000009F030000000800003E040000 16 @@ -4097,7 +4571,7 @@ 0 16 - DE0000005F0000006C06000092010000 + DE0000005F0000000008000092010000 16 @@ -4117,7 +4591,7 @@ 0 16 - E1000000620000006906000079010000 + E100000062000000FD07000079010000 16 @@ -4157,7 +4631,7 @@ 0 16 - E1000000620000006906000079010000 + E100000062000000FD07000079010000 16 @@ -4177,7 +4651,7 @@ 0 16 - E1000000620000006906000079010000 + E100000062000000FD07000079010000 16 @@ -4197,7 +4671,7 @@ 0 16 - E1000000620000006906000079010000 + E100000062000000FD07000079010000 16 @@ -4217,7 +4691,7 @@ 0 16 - E1000000620000006906000079010000 + E100000062000000FD07000079010000 16 @@ -4627,17 +5101,17 @@ 35905 35905 - 1 + 0 0 0 - 1 + 0 32767 0 4096 0 16 - 700600005F000000000800001C030000 + 7306000062000000FD07000003030000 16 @@ -4657,7 +5131,7 @@ 0 16 - 0300000062000000D700000003030000 + 0300000062000000D70000004C020000 16 @@ -5744,6 +6218,26 @@ 0A0000000A0000006E0000006E000000 + + 50393 + 50393 + 1 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + 7306000075000000FD0700008E000000 + + + 16 + 0A0000000A0000006E0000006E000000 + + 50407 50407 @@ -6184,6 +6678,46 @@ 0A0000000A0000006E0000006E000000 + + 50646 + 50646 + 1 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + E100000075000000FD0700008E000000 + + + 16 + 0A0000000A0000006E0000006E000000 + + + + 50649 + 50649 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + 070400004A0300009705000063030000 + + + 16 + 0A0000000A0000006E0000006E000000 + + 50666 50666 @@ -6204,6 +6738,26 @@ 0A0000000A0000006E0000006E000000 + + 50671 + 50671 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + 070400004A0300009705000063030000 + + + 16 + 0A0000000A0000006E0000006E000000 + + 50686 50686 @@ -6364,6 +6918,26 @@ 0A0000000A0000006E0000006E000000 + + 50741 + 50741 + 1 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + E100000075000000FD0700008E000000 + + + 16 + 0A0000000A0000006E0000006E000000 + + 50743 50743 @@ -6464,6 +7038,66 @@ 0A0000000A0000006E0000006E000000 + + 50758 + 50758 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + 070400004A0300009705000063030000 + + + 16 + 0A0000000A0000006E0000006E000000 + + + + 50761 + 50761 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + 070400009302000097050000AC020000 + + + 16 + 0A0000000A0000006E0000006E000000 + + + + 50764 + 50764 + 1 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + 7306000075000000FD0700008E000000 + + + 16 + 0A0000000A0000006E0000006E000000 + + 50770 50770 @@ -6524,6 +7158,106 @@ 0A0000000A0000006E0000006E000000 + + 50784 + 50784 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + 070400004A0300009705000063030000 + + + 16 + 0A0000000A0000006E0000006E000000 + + + + 50786 + 50786 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + 070400009302000097050000AC020000 + + + 16 + 0A0000000A0000006E0000006E000000 + + + + 50791 + 50791 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + 070400004A0300009705000063030000 + + + 16 + 0A0000000A0000006E0000006E000000 + + + + 50793 + 50793 + 1 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + 7306000075000000FD0700008E000000 + + + 16 + 0A0000000A0000006E0000006E000000 + + + + 50801 + 50801 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + 070400004A0300009705000063030000 + + + 16 + 0A0000000A0000006E0000006E000000 + + 50803 50803 @@ -6564,6 +7298,126 @@ 0A0000000A0000006E0000006E000000 + + 50818 + 50818 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + 070400004A0300009705000063030000 + + + 16 + 0A0000000A0000006E0000006E000000 + + + + 50826 + 50826 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + 070400009302000097050000AC020000 + + + 16 + 0A0000000A0000006E0000006E000000 + + + + 50846 + 50846 + 1 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + 7306000075000000FD0700008E000000 + + + 16 + 0A0000000A0000006E0000006E000000 + + + + 50848 + 50848 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + 070400004A0300009705000063030000 + + + 16 + 0A0000000A0000006E0000006E000000 + + + + 50852 + 50852 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + 070400004A0300009705000063030000 + + + 16 + 0A0000000A0000006E0000006E000000 + + + + 50864 + 50864 + 1 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + E100000075000000690600008E000000 + + + 16 + 0A0000000A0000006E0000006E000000 + + 50890 50890 @@ -6706,14 +7560,14 @@ 2466 - 000000000B000000000000000020000001000000FFFFFFFFFFFFFFFFDE000000920100006C060000960100000100000001000010040000000100000033FFFFFFF9010000FFFFFFFF07000000CB00000057010000CC000000F08B00005A01000079070000CA090000FFFF02000B004354616262656450616E650020000001000000DE0000005E0000006C060000A5010000DE0000004B0000006C060000920100000000000040280056070000000B446973617373656D626C7901000000CB00000001000000FFFFFFFFFFFFFFFF14506572666F726D616E636520416E616C797A6572000000005701000001000000FFFFFFFFFFFFFFFF14506572666F726D616E636520416E616C797A657200000000CC00000001000000FFFFFFFFFFFFFFFF0E4C6F67696320416E616C797A657200000000F08B000001000000FFFFFFFFFFFFFFFF0D436F646520436F766572616765000000005A01000001000000FFFFFFFFFFFFFFFF11496E737472756374696F6E205472616365000000007907000001000000FFFFFFFFFFFFFFFF0A5472616365204461746100000000CA09000001000000FFFFFFFFFFFFFFFF00000000000000000000000000000000000000000000000001000000FFFFFFFFCB00000001000000FFFFFFFFCB000000000000000040000001000000FFFFFFFFFFFFFFFF6C0600004B000000700600001C030000010000000200001004000000010000000000000000000000FFFFFFFF16000000E20500002D8C00002E8C00002F8C0000308C0000318C0000328C0000338C0000348C0000358C0000368C0000378C0000388C0000398C00003A8C00003B8C00003C8C00003D8C00003E8C00003F8C0000408C0000418C000001800040000001000000700600005E000000000800002F030000700600004B000000000800001C0300000000000040410056160000000753796D626F6C7300000000E205000001000000FFFFFFFFFFFFFFFF00000000002D8C000001000000FFFFFFFFFFFFFFFF00000000002E8C000001000000FFFFFFFFFFFFFFFF00000000002F8C000001000000FFFFFFFFFFFFFFFF0000000000308C000001000000FFFFFFFFFFFFFFFF0000000000318C000001000000FFFFFFFFFFFFFFFF0000000000328C000001000000FFFFFFFFFFFFFFFF0000000000338C000001000000FFFFFFFFFFFFFFFF0000000000348C000001000000FFFFFFFFFFFFFFFF0000000000358C000001000000FFFFFFFFFFFFFFFF0000000000368C000001000000FFFFFFFFFFFFFFFF0000000000378C000001000000FFFFFFFFFFFFFFFF0000000000388C000001000000FFFFFFFFFFFFFFFF0000000000398C000001000000FFFFFFFFFFFFFFFF00000000003A8C000001000000FFFFFFFFFFFFFFFF00000000003B8C000001000000FFFFFFFFFFFFFFFF00000000003C8C000001000000FFFFFFFFFFFFFFFF00000000003D8C000001000000FFFFFFFFFFFFFFFF00000000003E8C000001000000FFFFFFFFFFFFFFFF00000000003F8C000001000000FFFFFFFFFFFFFFFF0000000000408C000001000000FFFFFFFFFFFFFFFF044932433201000000418C000001000000FFFFFFFFFFFFFFFF15000000000000000000000000000000000000000000000001000000FFFFFFFFE205000001000000FFFFFFFFE2050000000000000010000001000000FFFFFFFFFFFFFFFFDA0000004B000000DE0000001C030000010000000200001004000000010000000000000000000000FFFFFFFF05000000ED0300006D000000C3000000C40000007394000001800010000001000000000000005E000000DA0000002F030000000000004B000000DA0000001C0300000000000040140056050000000750726F6A65637401000000ED03000001000000FFFFFFFFFFFFFFFF05426F6F6B73000000006D00000001000000FFFFFFFFFFFFFFFF0946756E6374696F6E7300000000C300000001000000FFFFFFFFFFFFFFFF0954656D706C6174657300000000C400000001000000FFFFFFFFFFFFFFFF09526567697374657273010000007394000001000000FFFFFFFFFFFFFFFF04000000000000000000000000000000000000000000000001000000FFFFFFFFED03000001000000FFFFFFFFED030000000000000080000001000000FFFFFFFFFFFFFFFF000000001C0300000008000020030000010000000100001004000000010000005AFDFFFF6500000000000000000000000000000001000000C6000000FFFFFFFF0B0000008F070000930700009407000095070000960700009007000091070000B9050000BA050000BB050000BC05000001800080000001000000040400003303000000080000510400000404000020030000000800003E04000000000000404100560B0000001343616C6C20537461636B202B204C6F63616C73010000008F07000001000000FFFFFFFFFFFFFFFF0755415254202331000000009307000001000000FFFFFFFFFFFFFFFF0755415254202332000000009407000001000000FFFFFFFFFFFFFFFF0755415254202333000000009507000001000000FFFFFFFFFFFFFFFF15446562756720287072696E74662920566965776572000000009607000001000000FFFFFFFFFFFFFFFF0757617463682031010000009007000001000000FFFFFFFFFFFFFFFF0757617463682032000000009107000001000000FFFFFFFFFFFFFFFF084D656D6F7279203101000000B905000001000000FFFFFFFFFFFFFFFF084D656D6F7279203201000000BA05000001000000FFFFFFFFFFFFFFFF084D656D6F7279203300000000BB05000001000000FFFFFFFFFFFFFFFF084D656D6F7279203400000000BC05000001000000FFFFFFFFFFFFFFFF050000000000000001000000000000000100000001000000FFFFFFFF0004000020030000040400003E04000001000000020000100400000000000000000000000000000000000000000000000000000002000000C6000000FFFFFFFF8F07000001000000FFFFFFFF8F07000001000000C6000000000000000080000000000000FFFFFFFFFFFFFFFF0000000087030000000800008B0300000000000001000000040000000100000084FDFFFFDE000000FFFFFFFF03000000C5000000C70000007794000001800080000000000000000000009E0300000008000051040000000000008B030000000800003E0400000000000040820046030000000C4275696C64204F757470757400000000C500000001000000FFFFFFFFFFFFFFFF0D46696E6420496E2046696C657300000000C700000001000000FFFFFFFFFFFFFFFF0642726F777365000000007794000001000000FFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000000000000001000000FFFFFFFFC500000001000000FFFFFFFFC5000000000000000000000000000000 + 000000000B000000000000000020000001000000FFFFFFFFFFFFFFFFDE0000009201000000080000960100000100000001000010040000000100000033FFFFFFF9010000FFFFFFFF07000000CB00000057010000CC000000F08B00005A01000079070000CA090000FFFF02000B004354616262656450616E650020000001000000DE0000005E00000000080000A5010000DE0000004B00000000080000920100000000000040280056070000000B446973617373656D626C7901000000CB00000001000000FFFFFFFFFFFFFFFF14506572666F726D616E636520416E616C797A6572000000005701000001000000FFFFFFFFFFFFFFFF14506572666F726D616E636520416E616C797A657200000000CC00000001000000FFFFFFFFFFFFFFFF0E4C6F67696320416E616C797A657200000000F08B000001000000FFFFFFFFFFFFFFFF0D436F646520436F766572616765000000005A01000001000000FFFFFFFFFFFFFFFF11496E737472756374696F6E205472616365000000007907000001000000FFFFFFFFFFFFFFFF0A5472616365204461746100000000CA09000001000000FFFFFFFFFFFFFFFF00000000000000000000000000000000000000000000000001000000FFFFFFFFCB00000001000000FFFFFFFFCB000000000000000040000000000000FFFFFFFFFFFFFFFF6C0600004B000000700600001C030000000000000200000004000000010000000000000000000000FFFFFFFF16000000E20500002D8C00002E8C00002F8C0000308C0000318C0000328C0000338C0000348C0000358C0000368C0000378C0000388C0000398C00003A8C00003B8C00003C8C00003D8C00003E8C00003F8C0000408C0000418C000001800040000000000000700600005E000000000800002F030000700600004B000000000800001C0300000000000040410046160000000753796D626F6C7300000000E205000001000000FFFFFFFFFFFFFFFF00000000002D8C000001000000FFFFFFFFFFFFFFFF00000000002E8C000001000000FFFFFFFFFFFFFFFF00000000002F8C000001000000FFFFFFFFFFFFFFFF0000000000308C000001000000FFFFFFFFFFFFFFFF0000000000318C000001000000FFFFFFFFFFFFFFFF0000000000328C000001000000FFFFFFFFFFFFFFFF0000000000338C000001000000FFFFFFFFFFFFFFFF0000000000348C000001000000FFFFFFFFFFFFFFFF0000000000358C000001000000FFFFFFFFFFFFFFFF0000000000368C000001000000FFFFFFFFFFFFFFFF0000000000378C000001000000FFFFFFFFFFFFFFFF0000000000388C000001000000FFFFFFFFFFFFFFFF0000000000398C000001000000FFFFFFFFFFFFFFFF00000000003A8C000001000000FFFFFFFFFFFFFFFF00000000003B8C000001000000FFFFFFFFFFFFFFFF00000000003C8C000001000000FFFFFFFFFFFFFFFF00000000003D8C000001000000FFFFFFFFFFFFFFFF00000000003E8C000001000000FFFFFFFFFFFFFFFF00000000003F8C000001000000FFFFFFFFFFFFFFFF0000000000408C000001000000FFFFFFFFFFFFFFFF044932433200000000418C000001000000FFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000000000000001000000FFFFFFFFE205000001000000FFFFFFFFE2050000000000000010000001000000FFFFFFFFFFFFFFFFDA0000004B000000DE00000065020000010000000200001004000000010000000000000000000000FFFFFFFF05000000ED0300006D000000C3000000C40000007394000001800010000001000000000000005E000000DA0000002F030000000000004B000000DA000000650200000000000040140056050000000750726F6A65637401000000ED03000001000000FFFFFFFFFFFFFFFF05426F6F6B73000000006D00000001000000FFFFFFFFFFFFFFFF0946756E6374696F6E7300000000C300000001000000FFFFFFFFFFFFFFFF0954656D706C6174657300000000C400000001000000FFFFFFFFFFFFFFFF09526567697374657273010000007394000001000000FFFFFFFFFFFFFFFF04000000000000000000000000000000000000000000000001000000FFFFFFFFED03000001000000FFFFFFFFED030000000000000080000001000000FFFFFFFFFFFFFFFF00000000650200000008000069020000010000000100001004000000010000005AFDFFFF6500000000000000000000000000000001000000C6000000FFFFFFFF0B0000008F070000930700009407000095070000960700009007000091070000B9050000BA050000BB050000BC05000001800080000001000000040400003303000000080000510400000404000069020000000800008703000000000000404100560B0000001343616C6C20537461636B202B204C6F63616C73010000008F07000001000000FFFFFFFFFFFFFFFF0755415254202331000000009307000001000000FFFFFFFFFFFFFFFF0755415254202332000000009407000001000000FFFFFFFFFFFFFFFF0755415254202333000000009507000001000000FFFFFFFFFFFFFFFF15446562756720287072696E74662920566965776572000000009607000001000000FFFFFFFFFFFFFFFF0757617463682031010000009007000001000000FFFFFFFFFFFFFFFF0757617463682032000000009107000001000000FFFFFFFFFFFFFFFF084D656D6F7279203101000000B905000001000000FFFFFFFFFFFFFFFF084D656D6F7279203201000000BA05000001000000FFFFFFFFFFFFFFFF084D656D6F7279203300000000BB05000001000000FFFFFFFFFFFFFFFF084D656D6F7279203400000000BC05000001000000FFFFFFFFFFFFFFFF050000000000000001000000000000000100000001000000FFFFFFFF0004000069020000040400008703000001000000020000100400000000000000000000000000000000000000000000000000000002000000C6000000FFFFFFFF8F07000001000000FFFFFFFF8F07000001000000C6000000000000000080000001000000FFFFFFFFFFFFFFFF0000000087030000000800008B0300000100000001000000040000000100000084FDFFFFDE000000FFFFFFFF03000000C5000000C70000007794000001800080000001000000000000009E0300000008000051040000000000008B030000000800003E0400000000000040820056030000000C4275696C64204F757470757400000000C500000001000000FFFFFFFFFFFFFFFF0D46696E6420496E2046696C657301000000C700000001000000FFFFFFFFFFFFFFFF0642726F777365000000007794000001000000FFFFFFFFFFFFFFFF01000000000000000000000000000000000000000000000001000000FFFFFFFFC500000001000000FFFFFFFFC5000000000000000000000000000000 59392 File 2002 - 00200000010000002800FFFF01001100434D4643546F6F6C426172427574746F6E00E100000000000000000000000000000000000000000000000100000001000000018001E100000000000001000000000000000000000000000000000100000001000000018003E1000000000000020000000000000000000000000000000001000000010000000180CD7F0000000000000300000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF000000000000000000000000000100000001000000018023E100000000040004000000000000000000000000000000000100000001000000018022E100000000040005000000000000000000000000000000000100000001000000018025E10000000004000600000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF00000000000000000000000000010000000100000001802BE10000000004000700000000000000000000000000000000010000000100000001802CE10000000004000800000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF00000000000000000000000000010000000100000001807A8A0000000004000900000000000000000000000000000000010000000100000001807B8A0000000004000A00000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF0000000000000000000000000001000000010000000180D3B00000000004000B000000000000000000000000000000000100000001000000018015B10000000004000C0000000000000000000000000000000001000000010000000180F4B00000000004000D000000000000000000000000000000000100000001000000018036B10000000004000E00000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF0000000000000000000000000001000000010000000180FF88000000000400460000000000000000000000000000000001000000010000000180FE880000000004004500000000000000000000000000000000010000000100000001800B810000000004001300000000000000000000000000000000010000000100000001800C810000000004001400000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF0000000000000000000000000001000000010000000180F0880000020000000F000000000000000000000000000000000100000001000000FFFF0100120043555646696E64436F6D626F427574746F6EE803000000000000000000000000000000000000000000000001000000010000009600000002002050FFFFFFFF0096000000000000000000018024E10000000004001100000000000000000000000000000000010000000100000001800A810000000004001200000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF000000000000000000000000000100000001000000018022800000020001001500000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF0000000000000000000000000001000000010000000180C488000000000000160000000000000000000000000000000001000000010000000180C988000000000400180000000000000000000000000000000001000000010000000180C788000000000000190000000000000000000000000000000001000000010000000180C8880000000000001700000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF000000000000000000000000000100000001000000FFFF01001500434D4643546F6F6C4261724D656E75427574746F6E4C010000020001001A0000000F50726F6A6563742057696E646F7773000000000000000000000000010000000100000000000000000000000100000008002880DD880000000000001A0000000750726F6A656374000000000000000000000000010000000100000000000000000000000100000000002880DC8B0000000000003A00000005426F6F6B73000000000000000000000000010000000100000000000000000000000100000000002880E18B0000000000003B0000000946756E6374696F6E73000000000000000000000000010000000100000000000000000000000100000000002880E28B000000000000400000000954656D706C6174657300000000000000000000000001000000010000000000000000000000010000000000288018890000000000003D0000000E536F757263652042726F777365720000000000000000000000000100000001000000000000000000000001000000000028800000000000000400FFFFFFFF00000000000000000001000000000000000100000000000000000000000100000000002880D988000000000000390000000C4275696C64204F7574707574000000000000000000000000010000000100000000000000000000000100000000002880E38B000000000000410000000B46696E64204F75747075740000000000000000000000000100000001000000000000000000000001000000000001800000000001000000FFFFFFFF0000000000000000000000000001000000010000000180FB7F0000000000001B000000000000000000000000000000000100000001000000000000000446696C6572030000 + 00200000010000002800FFFF01001100434D4643546F6F6C426172427574746F6E00E100000000000000000000000000000000000000000000000100000001000000018001E100000000000001000000000000000000000000000000000100000001000000018003E1000000000000020000000000000000000000000000000001000000010000000180CD7F0000000000000300000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF000000000000000000000000000100000001000000018023E100000000040004000000000000000000000000000000000100000001000000018022E100000000000005000000000000000000000000000000000100000001000000018025E10000000000000600000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF00000000000000000000000000010000000100000001802BE10000000000000700000000000000000000000000000000010000000100000001802CE10000000004000800000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF00000000000000000000000000010000000100000001807A8A0000000000000900000000000000000000000000000000010000000100000001807B8A0000000004000A00000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF0000000000000000000000000001000000010000000180D3B00000000000000B000000000000000000000000000000000100000001000000018015B10000000004000C0000000000000000000000000000000001000000010000000180F4B00000000004000D000000000000000000000000000000000100000001000000018036B10000000004000E00000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF0000000000000000000000000001000000010000000180FF88000000000400460000000000000000000000000000000001000000010000000180FE880000000004004500000000000000000000000000000000010000000100000001800B810000000004001300000000000000000000000000000000010000000100000001800C810000000004001400000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF0000000000000000000000000001000000010000000180F0880000020000000F000000000000000000000000000000000100000001000000FFFF0100120043555646696E64436F6D626F427574746F6EE803000000000000000000000000000000000000000000000001000000010000009600000002002050FFFFFFFF0096000000000000000000018024E10000000000001100000000000000000000000000000000010000000100000001800A810000000000001200000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF000000000000000000000000000100000001000000018022800000020001001500000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF0000000000000000000000000001000000010000000180C488000000000400160000000000000000000000000000000001000000010000000180C988000000000400180000000000000000000000000000000001000000010000000180C788000000000000190000000000000000000000000000000001000000010000000180C8880000000000001700000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF000000000000000000000000000100000001000000FFFF01001500434D4643546F6F6C4261724D656E75427574746F6E4C010000020001001A0000000F50726F6A6563742057696E646F7773000000000000000000000000010000000100000000000000000000000100000008002880DD880000000000001A0000000750726F6A656374000000000000000000000000010000000100000000000000000000000100000000002880DC8B0000000000003A00000005426F6F6B73000000000000000000000000010000000100000000000000000000000100000000002880E18B0000000000003B0000000946756E6374696F6E73000000000000000000000000010000000100000000000000000000000100000000002880E28B000000000000400000000954656D706C6174657300000000000000000000000001000000010000000000000000000000010000000000288018890000000000003D0000000E536F757263652042726F777365720000000000000000000000000100000001000000000000000000000001000000000028800000000000000400FFFFFFFF00000000000000000001000000000000000100000000000000000000000100000000002880D988000000000000390000000C4275696C64204F7574707574000000000000000000000000010000000100000000000000000000000100000000002880E38B000000000000410000000B46696E64204F75747075740000000000000000000000000100000001000000000000000000000001000000000001800000000001000000FFFFFFFF0000000000000000000000000001000000010000000180FB7F0000000000001B000000000000000000000000000000000100000001000000000000000446696C6572030000 1423 @@ -6745,7 +7599,7 @@ Debug 2290 - 00200000010000001B00FFFF01001100434D4643546F6F6C426172427574746F6ECC880000000000002500000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF000000000000000000000000000100000001000000018017800000000000002600000000000000000000000000000000010000000100000001801D800000000004002700000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF00000000000000000000000000010000000100000001801A800000000000002800000000000000000000000000000000010000000100000001801B80000000000000290000000000000000000000000000000001000000010000000180E57F0000000000002A00000000000000000000000000000000010000000100000001801C800000000000002B00000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF000000000000000000000000000100000001000000018000890000000000002C00000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF0000000000000000000000000001000000010000000180E48B0000020001002D0000000000000000000000000000000001000000010000000180F07F0000020001002E0000000000000000000000000000000001000000010000000180E8880000020000003700000000000000000000000000000000010000000100000001803B010000020001002F0000000000000000000000000000000001000000010000000180BB8A00000200010030000000000000000000000000000000000100000001000000FFFF01001500434D4643546F6F6C4261724D656E75427574746F6E0E01000002000100310000000D57617463682057696E646F7773000000000000000000000000010000000100000000000000000000000100000002001380D88B000000000000310000000757617463682031000000000000000000000000010000000100000000000000000000000100000000001380D98B0000000000003100000007576174636820320000000000000000000000000100000001000000000000000000000001000000000013800F01000002000100320000000E4D656D6F72792057696E646F7773000000000000000000000000010000000100000000000000000000000100000004001380D28B00000000000032000000084D656D6F72792031000000000000000000000000010000000100000000000000000000000100000000001380D38B00000000000032000000084D656D6F72792032000000000000000000000000010000000100000000000000000000000100000000001380D48B00000000000032000000084D656D6F72792033000000000000000000000000010000000100000000000000000000000100000000001380D58B00000000000032000000084D656D6F727920340000000000000000000000000100000001000000000000000000000001000000000013801001000002000000330000000E53657269616C2057696E646F77730000000000000000000000000100000001000000000000000000000001000000040013809307000000000000330000000755415254202331000000000000000000000000010000000100000000000000000000000100000000001380940700000000000033000000075541525420233200000000000000000000000001000000010000000000000000000000010000000000138095070000000000003300000007554152542023330000000000000000000000000100000001000000000000000000000001000000000013809607000000000000330000000E49544D2F525441205669657765720000000000000000000000000100000001000000000000000000000001000000000013803C010000020000003400000010416E616C797369732057696E646F7773000000000000000000000000010000000100000000000000000000000100000003001380658A000000000000340000000E4C6F67696320416E616C797A6572000000000000000000000000010000000100000000000000000000000100000000001380DC7F0000000000003E00000014506572666F726D616E636520416E616C797A6572000000000000000000000000010000000100000000000000000000000100000000001380E788000000000000380000000D436F646520436F76657261676500000000000000000000000001000000010000000000000000000000010000000000138053010000000000003F0000000D54726163652057696E646F77730000000000000000000000000100000001000000000000000000000001000000010013805401000000000000FFFFFFFF115472616365204D656E7520416E63686F720000000000000000010000000000000001000000000000000000000001000000000013802901000000000000350000001553797374656D205669657765722057696E646F77730000000000000000000000000100000001000000000000000000000001000000010013804B01000000000000FFFFFFFF1453797374656D2056696577657220416E63686F720000000000000000010000000000000001000000000000000000000001000000000001800000000001000000FFFFFFFF000000000000000000000000000100000001000000138001890000020000003600000007546F6F6C626F7800000000000000000000000001000000010000000000000000000000010000000300138044C5000000000000FFFFFFFF0E5570646174652057696E646F77730000000000000000010000000000000001000000000000000000000001000000000013800000000000000400FFFFFFFF000000000000000000010000000000000001000000000000000000000001000000000013805B01000000000000FFFFFFFF12546F6F6C626F78204D656E75416E63686F720000000000000000010000000000000001000000000000000000000001000000000001800000000001000000FFFFFFFF0000000000000000000000000001000000010000000180460100000000040049000000000000000000000000000000000100000001000000000000000544656275675A020000 + 00200000010000001B00FFFF01001100434D4643546F6F6C426172427574746F6ECC880000000000002500000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF000000000000000000000000000100000001000000018017800000000000002600000000000000000000000000000000010000000100000001801D800000000004002700000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF00000000000000000000000000010000000100000001801A800000000000002800000000000000000000000000000000010000000100000001801B80000000000000290000000000000000000000000000000001000000010000000180E57F0000000000002A00000000000000000000000000000000010000000100000001801C800000000004002B00000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF000000000000000000000000000100000001000000018000890000000000002C00000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF0000000000000000000000000001000000010000000180E48B0000020001002D0000000000000000000000000000000001000000010000000180F07F0000020001002E0000000000000000000000000000000001000000010000000180E8880000020000003700000000000000000000000000000000010000000100000001803B010000020001002F0000000000000000000000000000000001000000010000000180BB8A00000200010030000000000000000000000000000000000100000001000000FFFF01001500434D4643546F6F6C4261724D656E75427574746F6E0E01000002000100310000000D57617463682057696E646F7773000000000000000000000000010000000100000000000000000000000100000002001380D88B000000000000310000000757617463682031000000000000000000000000010000000100000000000000000000000100000000001380D98B0000000000003100000007576174636820320000000000000000000000000100000001000000000000000000000001000000000013800F01000002000100320000000E4D656D6F72792057696E646F7773000000000000000000000000010000000100000000000000000000000100000004001380D28B00000000000032000000084D656D6F72792031000000000000000000000000010000000100000000000000000000000100000000001380D38B00000000000032000000084D656D6F72792032000000000000000000000000010000000100000000000000000000000100000000001380D48B00000000000032000000084D656D6F72792033000000000000000000000000010000000100000000000000000000000100000000001380D58B00000000000032000000084D656D6F727920340000000000000000000000000100000001000000000000000000000001000000000013801001000002000000330000000E53657269616C2057696E646F77730000000000000000000000000100000001000000000000000000000001000000040013809307000000000000330000000755415254202331000000000000000000000000010000000100000000000000000000000100000000001380940700000000000033000000075541525420233200000000000000000000000001000000010000000000000000000000010000000000138095070000000000003300000007554152542023330000000000000000000000000100000001000000000000000000000001000000000013809607000000000000330000000E49544D2F525441205669657765720000000000000000000000000100000001000000000000000000000001000000000013803C010000020000003400000010416E616C797369732057696E646F7773000000000000000000000000010000000100000000000000000000000100000003001380658A000000000000340000000E4C6F67696320416E616C797A6572000000000000000000000000010000000100000000000000000000000100000000001380DC7F0000000000003E00000014506572666F726D616E636520416E616C797A6572000000000000000000000000010000000100000000000000000000000100000000001380E788000000000000380000000D436F646520436F76657261676500000000000000000000000001000000010000000000000000000000010000000000138053010000000000003F0000000D54726163652057696E646F77730000000000000000000000000100000001000000000000000000000001000000010013805401000000000000FFFFFFFF115472616365204D656E7520416E63686F720100000000000000010000000000000001000000000000000000000001000000000013802901000000000000350000001553797374656D205669657765722057696E646F77730000000000000000000000000100000001000000000000000000000001000000010013804B01000000000000FFFFFFFF1453797374656D2056696577657220416E63686F720100000000000000010000000000000001000000000000000000000001000000000001800000000001000000FFFFFFFF000000000000000000000000000100000001000000138001890000020000003600000007546F6F6C626F7800000000000000000000000001000000010000000000000000000000010000000300138044C5000000000000FFFFFFFF0E5570646174652057696E646F77730100000000000000010000000000000001000000000000000000000001000000000013800000000000000400FFFFFFFF000000000000000000010000000000000001000000000000000000000001000000000013805B01000000000000FFFFFFFF12546F6F6C626F78204D656E75416E63686F720100000000000000010000000000000001000000000000000000000001000000000001800000000001000000FFFFFFFF0000000000000000000000000001000000010000000180460100000000040049000000000000000000000000000000000100000001000000000000000544656275675A020000 968 @@ -6766,22 +7620,10 @@ - D:\fly_122\projects\baseflight\lib\STM32F10x_StdPeriph_Driver\inc\stm32f10x_rcc.h - 0 - 499 - 499 - - - D:\fly_122\projects\baseflight\lib\STM32F10x_StdPeriph_Driver\inc\stm32f10x_gpio.h - 0 - 53 - 74 - - - D:\fly_122\projects\baseflight\drv_i2c.h + D:\fly_122\projects\baseflight\drv_system.h 0 1 - 6 + 16 @@ -6790,132 +7632,48 @@ 0 100 - 8 + 3 - .\startup_stm32f10x_md.s - 21 - 133 - 143 - - - .\drv_adc.c - 6 - 18 - 18 - - - drv_i2c.h - 0 - 1 - 6 - - - mw.h - 0 - 154 - 167 - - - .\lib\STM32F10x_StdPeriph_Driver\src\stm32f10x_gpio.c - 0 - 576 - 591 - - - .\main.c - 32 - 1 - 23 - - - board.h - 14 - 22 - 28 - - - .\serial.c - 12 - 162 - 181 - - - .\mw.c - 0 - 624 - 631 - - - .\drv_mpu3050.c - 13 - 13 - 28 - - - .\drv_adxl345.c - 0 - 32 - 56 - - - .\drv_hmc5883l.c - 42 - 20 - 45 - - - .\imu.c - 0 - 27 - 27 - - - .\sensors.c - 0 - 187 - 212 - - - .\drv_i2c.c - 0 - 283 - 300 - - - .\drv_bmp085.c - 0 - 213 - 232 + .\config.c + 4 + 107 + 120 .\drv_system.c - 115 - 55 - 60 + 22 + 139 + 169 - .\lib\STM32F10x_StdPeriph_Driver\src\stm32f10x_rcc.c - 34 - 1095 - 1102 + mw.h + 27 + 115 + 124 - lib\STM32F10x_StdPeriph_Driver\inc\stm32f10x_rcc.h - 62 - 499 - 499 + .\main.c + 37 + 1 + 26 - lib\STM32F10x_StdPeriph_Driver\inc\stm32f10x_gpio.h - 15 - 53 - 74 - - - .\drv_pwm.c + .\mixer.c 0 1 - 1 + 11 + + + .\serial.c + 26 + 200 + 215 + + + drv_system.h + 0 + 1 + 16 diff --git a/baseflight.uvopt b/baseflight.uvopt index cdb0cb202..8b89d4ef1 100755 --- a/baseflight.uvopt +++ b/baseflight.uvopt @@ -112,7 +112,7 @@ 1 0 0 - 7 + 1 @@ -123,7 +123,7 @@ - Segger\JL2CM3.dll + BIN\UL2CM3.DLL @@ -144,7 +144,7 @@ 0 DLGUARM - (106=-1,-1,-1,-1,0)(107=-1,-1,-1,-1,0) + (105=-1,-1,-1,-1,0)(106=-1,-1,-1,-1,0)(107=-1,-1,-1,-1,0) 0 @@ -154,77 +154,9 @@ 0 UL2CM3 - -O14 -S0 -C0 -N00("ARM Cortex-M3") -D00(1BA00477) -L00(4) -FO7 -FD20000000 -FC800 -FN1 -FF0STM32F10x_128 -FS08000000 -FL010000) + -UV0168AVR -O238 -S8 -C0 -N00("ARM CoreSight SW-DP") -D00(1BA01477) -L00(0) -TO18 -TC10000000 -TP21 -TDS8007 -TDT0 -TDC1F -TIEFFFFFFFF -TIP8 -FO7 -FD20000000 -FC800 -FN1 -FF0STM32F10x_128 -FS08000000 -FL010000 - - - 0 - 1 - gyroADC,0x0A - - - 1 - 1 - accADC,0x0A - - - 2 - 1 - currentTime,0x0A - - - 3 - 1 - previousTime,0x0A - - - 4 - 1 - cycleTime,0x0A - - - 5 - 1 - eep_entry - - - 6 - 1 - gyroData,0x0A - - - 7 - 1 - magADC,0x0A - - - 8 - 1 - maginv - - - 9 - 1 - magaxis - - - 10 - 1 - rawMagADC,0x0A - - - 11 - 1 - param_b5 - - - - 12 - 1 - rawADC,0x0A - - 1 @@ -267,19 +199,6 @@ - - - 0 - cycleTime - 00800000000000000000000000000000E0FFEF40000000000000000000000000000000006379636C6554696D650000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000000000000CC010008 - - - - - System Viewer\I2C2 - 35905 - - @@ -545,10 +464,10 @@ 1 0 0 - 32 + 37 0 1 - 23 + 26 0 .\main.c main.c @@ -559,10 +478,10 @@ 5 0 0 - 14 + 25 0 - 22 - 28 + 0 + 0 0 .\board.h board.h @@ -573,10 +492,10 @@ 1 0 0 - 0 + 26 0 - 27 - 27 + 0 + 0 0 .\imu.c imu.c @@ -589,8 +508,8 @@ 0 0 0 - 624 - 631 + 0 + 0 0 .\mw.c mw.c @@ -601,10 +520,10 @@ 5 0 0 - 0 + 27 0 - 154 - 167 + 115 + 124 0 .\mw.h mw.h @@ -617,8 +536,8 @@ 0 0 0 - 187 - 212 + 0 + 0 0 .\sensors.c sensors.c @@ -629,10 +548,10 @@ 1 0 0 - 26 + 0 0 - 0 - 0 + 1 + 11 0 .\mixer.c mixer.c @@ -643,10 +562,10 @@ 1 0 0 - 12 + 26 0 - 162 - 181 + 200 + 215 0 .\serial.c serial.c @@ -657,10 +576,10 @@ 1 0 0 - 0 + 4 0 - 0 - 0 + 107 + 120 0 .\config.c config.c @@ -680,8 +599,8 @@ 0 0 0 - 283 - 300 + 0 + 0 0 .\drv_i2c.c drv_i2c.c @@ -694,8 +613,8 @@ 0 0 0 - 1 - 1 + 0 + 0 0 .\drv_pwm.c drv_pwm.c @@ -708,8 +627,8 @@ 0 6 0 - 18 - 18 + 0 + 0 0 .\drv_adc.c drv_adc.c @@ -720,10 +639,10 @@ 1 0 0 - 0 + 8 0 - 213 - 232 + 0 + 0 0 .\drv_bmp085.c drv_bmp085.c @@ -736,8 +655,8 @@ 0 0 0 - 32 - 56 + 0 + 0 0 .\drv_adxl345.c drv_adxl345.c @@ -750,8 +669,8 @@ 0 13 0 - 13 - 28 + 0 + 0 0 .\drv_mpu3050.c drv_mpu3050.c @@ -774,12 +693,12 @@ 2 17 1 - 0 + 1 0 - 115 + 22 0 - 55 - 60 + 139 + 169 0 .\drv_system.c drv_system.c @@ -792,8 +711,8 @@ 0 42 0 - 20 - 45 + 0 + 0 0 .\drv_hmc5883l.c drv_hmc5883l.c @@ -835,7 +754,7 @@ 3 - 22 + 21 1 0 0 @@ -849,7 +768,7 @@ 3 - 23 + 22 1 0 0 @@ -863,11 +782,11 @@ 3 - 24 + 23 1 0 0 - 26 + 0 0 0 0 @@ -877,7 +796,7 @@ 3 - 25 + 24 1 0 0 @@ -891,11 +810,11 @@ 3 - 26 + 25 1 0 0 - 16 + 0 0 0 0 @@ -905,21 +824,21 @@ 3 - 27 + 26 1 0 0 34 0 - 1095 - 1102 + 0 + 0 0 .\lib\STM32F10x_StdPeriph_Driver\src\stm32f10x_rcc.c stm32f10x_rcc.c 3 - 28 + 27 1 0 0 @@ -933,7 +852,7 @@ 3 - 29 + 28 1 0 0 @@ -947,21 +866,21 @@ 3 - 30 + 29 1 0 0 0 0 - 576 - 591 + 0 + 0 0 .\lib\STM32F10x_StdPeriph_Driver\src\stm32f10x_gpio.c stm32f10x_gpio.c 3 - 31 + 30 1 0 0 @@ -975,14 +894,14 @@ 3 - 0 + 31 2 0 0 - 21 + 0 0 - 133 - 143 + 0 + 0 0 .\startup_stm32f10x_md.s startup_stm32f10x_md.s diff --git a/baseflight.uvproj b/baseflight.uvproj index 305ed6fe3..f0db64f8b 100755 --- a/baseflight.uvproj +++ b/baseflight.uvproj @@ -136,7 +136,7 @@ 1 0 - 7 + 1 @@ -150,7 +150,7 @@ - Segger\JL2CM3.dll + BIN\UL2CM3.DLL @@ -160,9 +160,9 @@ 0 1 1 - 4099 + 4096 - Segger\JL2CM3.dll + BIN\UL2CM3.DLL "" () @@ -331,7 +331,7 @@ 1 - 1 + 4 0 0 0 @@ -390,45 +390,6 @@ main.c 1 .\main.c - - - 2 - 0 - 0 - 0 - 0 - 2 - 2 - 2 - 2 - 2 - 11 - - - - - - 2 - 4 - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 0 - 2 - - - - - - - - - board.h diff --git a/board.h b/board.h index d22edfeb1..fcbd6fa68 100755 --- a/board.h +++ b/board.h @@ -28,6 +28,8 @@ typedef enum { typedef enum { FEATURE_PPM = 1 << 0, FEATURE_VBAT = 1 << 1, + FEATURE_SERVO = 1 << 2, + FEATURE_DIGITAL_SERVO = 1 << 3, } AvailableFeatures; #define digitalHi(p, i) { p->BSRR = i; } diff --git a/config.c b/config.c index e550377f1..6336df165 100755 --- a/config.c +++ b/config.c @@ -5,7 +5,10 @@ #define FLASH_PAGE_SIZE ((uint16_t)0x400) #define FLASH_WRITE_ADDR (0x08000000 + (uint32_t)FLASH_PAGE_SIZE * 63) // use the last KB for storage -static uint8_t checkNewConf = 151; +static uint32_t enabledSensors = 0; +static uint32_t enabledFeatures = 0; + +static uint8_t checkNewConf = 152; typedef struct eep_entry_t { void *var; @@ -17,6 +20,8 @@ typedef struct eep_entry_t { // ************************************************************************************************************ volatile eep_entry_t eep_entry[] = { {&checkNewConf, sizeof(checkNewConf)} + , {&enabledFeatures, sizeof(enabledFeatures)} + , {&mixerConfiguration, sizeof(mixerConfiguration)} , {&P8, sizeof(P8)} , {&I8, sizeof(I8)} , {&D8, sizeof(D8)} @@ -31,14 +36,9 @@ volatile eep_entry_t eep_entry[] = { , {&activate1, sizeof(activate1)} , {&activate2, sizeof(activate2)} , {&powerTrigger1, sizeof(powerTrigger1)} -#ifdef FLYING_WING , {&wing_left_mid, sizeof(wing_left_mid)} , {&wing_right_mid, sizeof(wing_right_mid)} -#endif -#ifdef TRI , {&tri_yaw_middle, sizeof(tri_yaw_middle)} -#endif - }; #define EEBLOCK_SIZE sizeof(eep_entry) / sizeof(eep_entry_t) @@ -56,15 +56,20 @@ void readEEPROM(void) #if defined(POWERMETER) pAlarm = (uint32_t) powerTrigger1 *(uint32_t) PLEVELSCALE *(uint32_t) PLEVELDIV; // need to cast before multiplying #endif + for (i = 0; i < 7; i++) lookupRX[i] = (2500 + rcExpo8 * (i * i - 25)) * i * (int32_t) rcRate8 / 1250; -#ifdef FLYING_WING - wing_left_mid = constrain(wing_left_mid, WING_LEFT_MIN, WING_LEFT_MAX); //LEFT - wing_right_mid = constrain(wing_right_mid, WING_RIGHT_MIN, WING_RIGHT_MAX); //RIGHT -#endif -#ifdef TRI - tri_yaw_middle = constrain(tri_yaw_middle, TRI_YAW_CONSTRAINT_MIN, TRI_YAW_CONSTRAINT_MAX); //REAR -#endif + + switch (mixerConfiguration) { + case MULTITYPE_FLYING_WING: + wing_left_mid = constrain(wing_left_mid, WING_LEFT_MIN, WING_LEFT_MAX); //LEFT + wing_right_mid = constrain(wing_right_mid, WING_RIGHT_MIN, WING_RIGHT_MAX); //RIGHT + break; + + case MULTITYPE_TRI: + tri_yaw_middle = constrain(tri_yaw_middle, TRI_YAW_CONSTRAINT_MIN, TRI_YAW_CONSTRAINT_MAX); //REAR + break; + } } void writeParams(void) @@ -80,7 +85,7 @@ void writeParams(void) memcpy(p, eep_entry[i].var, eep_entry[i].size); p += eep_entry[i].size; } - + p = conf; FLASH_Unlock(); @@ -112,6 +117,9 @@ void checkFirstTime(void) return; // Default settings + mixerConfiguration = MULTITYPE_QUADX; + featureSet(FEATURE_VBAT | FEATURE_PPM); + P8[ROLL] = 40; I8[ROLL] = 30; D8[ROLL] = 23; @@ -146,12 +154,47 @@ void checkFirstTime(void) accTrim[0] = 0; accTrim[1] = 0; powerTrigger1 = 0; -#ifdef FLYING_WING - wing_left_mid = WING_LEFT_MID; - wing_right_mid = WING_RIGHT_MID; -#endif -#ifdef TRI - tri_yaw_middle = TRI_YAW_MIDDLE; -#endif + + switch (mixerConfiguration) { + case MULTITYPE_FLYING_WING: + wing_left_mid = WING_LEFT_MID; + wing_right_mid = WING_RIGHT_MID; + break; + + case MULTITYPE_TRI: + tri_yaw_middle = TRI_YAW_MIDDLE; + break; + } + writeParams(); } + +bool sensors(uint32_t mask) +{ + return enabledSensors & mask; +} + +void sensorsSet(uint32_t mask) +{ + enabledSensors |= mask; +} + +void sensorsClear(uint32_t mask) +{ + enabledSensors &= ~(mask); +} + +bool feature(uint32_t mask) +{ + return enabledFeatures & mask; +} + +void featureSet(uint32_t mask) +{ + enabledFeatures |= mask; +} + +void featureClear(uint32_t mask) +{ + enabledFeatures &= ~(mask); +} diff --git a/drv_bmp085.c b/drv_bmp085.c index b94033d40..116760f43 100755 --- a/drv_bmp085.c +++ b/drv_bmp085.c @@ -224,6 +224,10 @@ void bmp085_start_ut(void) i2cWrite(p_bmp085->dev_addr, BMP085_CTRL_MEAS_REG, BMP085_T_MEASURE); } +#ifdef __GNUC__ + #define __nop() asm("mov r0,r0"); +#endif + uint16_t bmp085_get_ut(void) { uint16_t ut; diff --git a/drv_i2c.c b/drv_i2c.c index e84a27d9d..92a1e46bd 100755 --- a/drv_i2c.c +++ b/drv_i2c.c @@ -4,10 +4,8 @@ // SCL PB10 // SDA PB11 -#ifdef __gnuc__ // TODO check this -#define DMB() asm volatile ("dmb":::"memory") -#else -#define DMB() __DMB() +#ifdef __GNUC__ // TODO check this +#define __DMB() asm volatile ("dmb":::"memory") #endif static I2C_TypeDef *I2Cx; @@ -168,17 +166,17 @@ void i2c_ev_handler(void) } else if (SReg_1 & 0x0002) { //we just sent the address - EV6 in ref manual //Read SR1,2 to clear ADDR volatile uint8_t a; - DMB(); // memory fence to control hardware + __DMB(); // memory fence to control hardware if (bytes == 1 && reading && subaddress_sent) { //we are receiving 1 byte - EV6_3 I2C_AcknowledgeConfig(I2Cx, DISABLE); //turn off ACK - DMB(); + __DMB(); a = I2Cx->SR2; //clear ADDR after ACK is turned off I2C_GenerateSTOP(I2Cx, ENABLE); //program the stop final_stop = 1; I2C_ITConfig(I2Cx, I2C_IT_BUF, ENABLE); //allow us to have an EV7 } else { //EV6 and EV6_1 a = I2Cx->SR2; //clear the ADDR here - DMB(); + __DMB(); if (bytes == 2 && reading && subaddress_sent) { //rx 2 bytes - EV6_1 I2C_AcknowledgeConfig(I2Cx, DISABLE); //turn off ACK I2C_ITConfig(I2Cx, I2C_IT_BUF, DISABLE); //disable TXE to allow the buffer to fill diff --git a/drv_pwm.c b/drv_pwm.c index 8ff94cbe2..8c0de0c50 100755 --- a/drv_pwm.c +++ b/drv_pwm.c @@ -144,7 +144,7 @@ static void pwmIRQHandler(TIM_TypeDef *tim) } } -void pwmInit(bool usePPM, bool useServos) +void pwmInit(bool usePPM, bool useServos, bool useDigitalServos) { uint8_t i; GPIO_InitTypeDef GPIO_InitStructure = { 0, }; @@ -268,8 +268,11 @@ void pwmInit(bool usePPM, bool useServos) // Output timers if (useServos) { - // 50Hz period on ch1, 2 for servo - TIM_TimeBaseStructure.TIM_Period = PULSE_PERIOD_SERVO_ANALOG - 1; + // 50Hz/200Hz period on ch1, 2 for servo + if (useDigitalServos) + TIM_TimeBaseStructure.TIM_Period = PULSE_PERIOD_SERVO_DIGITAL - 1; + else + TIM_TimeBaseStructure.TIM_Period = PULSE_PERIOD_SERVO_ANALOG - 1; TIM_TimeBaseInit(TIM1, &TIM_TimeBaseStructure); TIM_TimeBaseStructure.TIM_Period = PULSE_PERIOD - 1; TIM_TimeBaseInit(TIM4, &TIM_TimeBaseStructure); @@ -278,7 +281,7 @@ void pwmInit(bool usePPM, bool useServos) TIM_TimeBaseInit(TIM1, &TIM_TimeBaseStructure); TIM_TimeBaseInit(TIM4, &TIM_TimeBaseStructure); } - + TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM2; TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable; TIM_OCInitStructure.TIM_OutputNState = TIM_OutputNState_Disable; diff --git a/drv_pwm.h b/drv_pwm.h index 567e5051c..88811aec4 100755 --- a/drv_pwm.h +++ b/drv_pwm.h @@ -1,5 +1,5 @@ #pragma once -void pwmInit(bool usePPM, bool useServos); +void pwmInit(bool usePPM, bool useServos, bool useDigitalServos); void pwmWrite(uint8_t channel, uint16_t value); uint16_t pwmRead(uint8_t channel); diff --git a/drv_system.c b/drv_system.c index 7bb23fc7a..73586fb71 100755 --- a/drv_system.c +++ b/drv_system.c @@ -1,8 +1,5 @@ #include "board.h" -static uint32_t enabledSensors = 0; -static uint32_t enabledFeatures = 0; - // Cycle counter stuff - these should be defined by CMSIS, but they aren't #define DWT_CTRL (*(volatile uint32_t *)0xE0001000) #define DWT_CYCCNT ((volatile uint32_t *)0xE0001004) @@ -143,36 +140,6 @@ void delay(uint32_t ms) delayMicroseconds(1000); } -bool sensors(uint32_t mask) -{ - return enabledSensors & mask; -} - -void sensorsSet(uint32_t mask) -{ - enabledSensors |= mask; -} - -void sensorsClear(uint32_t mask) -{ - enabledSensors &= ~(mask); -} - -bool feature(uint32_t mask) -{ - return enabledFeatures & mask; -} - -void featureSet(uint32_t mask) -{ - enabledFeatures |= mask; -} - -void featureClear(uint32_t mask) -{ - enabledFeatures &= ~(mask); -} - void failureMode(uint8_t mode) { LED1_ON; @@ -189,11 +156,13 @@ void failureMode(uint8_t mode) #define AIRCR_VECTKEY_MASK ((uint32_t)0x05FA0000) -void systemResetToBootloader(void) +void systemReset(bool toBootloader) { - // 1FFFF000 -> 20000200 -> SP - // 1FFFF004 -> 1FFFF021 -> PC - *((uint32_t *)0x20004FF0) = 0xDEADBEEF; // 20KB STM32F103 + if (toBootloader) { + // 1FFFF000 -> 20000200 -> SP + // 1FFFF004 -> 1FFFF021 -> PC + *((uint32_t *)0x20004FF0) = 0xDEADBEEF; // 20KB STM32F103 + } // Generate system reset SCB->AIRCR = AIRCR_VECTKEY_MASK | (uint32_t)0x04; diff --git a/drv_system.h b/drv_system.h index b109d0002..baf361b2f 100755 --- a/drv_system.h +++ b/drv_system.h @@ -7,17 +7,8 @@ void delay(uint32_t ms); uint32_t micros(void); uint32_t millis(void); -// features -bool sensors(uint32_t mask); -void sensorsSet(uint32_t mask); -void sensorsClear(uint32_t mask); - -bool feature(uint32_t mask); -void featureSet(uint32_t mask); -void featureClear(uint32_t mask); - // failure void failureMode(uint8_t mode); // bootloader/IAP -void systemResetToBootloader(void); +void systemReset(bool toBootloader); diff --git a/imu.c b/imu.c index 911cd440d..17a964432 100755 --- a/imu.c +++ b/imu.c @@ -70,11 +70,11 @@ void computeIMU(void) if (!sensors(SENSOR_ACC)) accADC[axis] = 0; } - -#if defined(TRI) - gyroData[YAW] = (gyroYawSmooth * 2 + gyroData[YAW] + 1) / 3; - gyroYawSmooth = gyroData[YAW]; -#endif + + if (mixerConfiguration == MULTITYPE_TRI) { + gyroData[YAW] = (gyroYawSmooth * 2 + gyroData[YAW] + 1) / 3; + gyroYawSmooth = gyroData[YAW]; + } } // ************************************************** @@ -152,37 +152,11 @@ void rotateV(struct fp_vector *v, float *delta) v->Y += delta[PITCH] * v_tmp.Z + delta[YAW] * v_tmp.X; } -#if 1 static int16_t _atan2f(float y, float x) { -#define fp_is_neg(val) (val < 0 ? 1 : 0) - - float z = y / x; - int16_t zi = abs((int16_t)(z * 100)); - int8_t y_neg = fp_is_neg(y); - if (zi < 100) { - if (zi > 10) - z = z / (1.0f + 0.28f * z * z); - if (fp_is_neg(x)) { - if (y_neg) - z -= M_PI; - else - z += M_PI; - } - } else { - z = (M_PI / 2.0f) - z / (z * z + 0.28f); - if (y_neg) - z -= M_PI; - } - z *= (180.0f / M_PI * 10); - return z; + // no need for aidsy inaccurate shortcuts on a proper platform + return (int16_t)(atan2f(y, x) * (180.0f / M_PI * 10.0f)); } -#else -static int16_t _atan2f(float y, float x) -{ - return (int16_t)atan2f(y, x) * (180.0f / M_PI * 10.0f); -} -#endif static void getEstimatedAttitude(void) { diff --git a/main.c b/main.c index 2d6385e94..951e90e98 100755 --- a/main.c +++ b/main.c @@ -6,6 +6,7 @@ int main(void) uint8_t i; #if 0 + // using this to write asm for bootloader :) RCC->APB2ENR |= RCC_APB2Periph_GPIOB | RCC_APB2Periph_AFIO; // GPIOB + AFIO AFIO->MAPR &= 0xF0FFFFFF; AFIO->MAPR = 0x02000000; @@ -22,8 +23,9 @@ int main(void) featureSet(FEATURE_VBAT | FEATURE_PPM); sensorsSet(SENSOR_ACC | SENSOR_BARO | SENSOR_MAG); - pwmInit(feature(FEATURE_PPM), false); - + mixerInit(); // this will configure FEATURE_SERVO depending on mixer type + pwmInit(feature(FEATURE_PPM), feature(FEATURE_SERVO), feature(FEATURE_DIGITAL_SERVO)); + LED1_ON; LED0_OFF; for (i = 0; i < 10; i++) { diff --git a/mixer.c b/mixer.c index f12ae49ab..a97d647d9 100755 --- a/mixer.c +++ b/mixer.c @@ -1,59 +1,96 @@ #include "board.h" #include "mw.h" -#if defined(BI) || defined(TRI) || defined(SERVO_TILT) || defined(GIMBAL) || defined(FLYING_WING) || defined(CAMTRIG) -#define SERVO -#endif +static uint8_t numberMotor = 4; +int16_t motor[8]; +int16_t servo[8] = { 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500 }; +uint8_t mixerConfiguration = MULTITYPE_TRI; +uint16_t wing_left_mid = WING_LEFT_MID; +uint16_t wing_right_mid = WING_RIGHT_MID; +uint16_t tri_yaw_middle = TRI_YAW_MIDDLE; -#if defined(GIMBAL) -#define NUMBER_MOTOR 0 -#define PRI_SERVO_FROM 1 // use servo from 1 to 2 -#define PRI_SERVO_TO 2 -#elif defined(FLYING_WING) -#define NUMBER_MOTOR 1 -#define PRI_SERVO_FROM 1 // use servo from 1 to 2 -#define PRI_SERVO_TO 2 -#elif defined(BI) -#define NUMBER_MOTOR 2 -#define PRI_SERVO_FROM 5 // use servo from 5 to 6 -#define PRI_SERVO_TO 6 -#elif defined(TRI) -#define NUMBER_MOTOR 3 -#define PRI_SERVO_FROM 6 // use only servo 5 -#define PRI_SERVO_TO 6 -#elif defined(QUADP) || defined(QUADX) || defined(Y4) -#define NUMBER_MOTOR 4 -#elif defined(Y6) || defined(HEX6) || defined(HEX6X) -#define NUMBER_MOTOR 6 -#elif defined(OCTOX8) || defined(OCTOFLATP) || defined(OCTOFLATX) -#define NUMBER_MOTOR 8 -#endif +void mixerInit(void) +{ + if (mixerConfiguration == MULTITYPE_BI || mixerConfiguration == MULTITYPE_TRI || mixerConfiguration == MULTITYPE_GIMBAL || mixerConfiguration == MULTITYPE_FLYING_WING) + featureSet(FEATURE_SERVO); + + switch (mixerConfiguration) { + case MULTITYPE_GIMBAL: + numberMotor = 0; + break; + case MULTITYPE_FLYING_WING: + numberMotor = 1; + break; + case MULTITYPE_BI: + numberMotor = 2; + break; + case MULTITYPE_TRI: + numberMotor = 3; + break; + + case MULTITYPE_QUADP: + case MULTITYPE_QUADX: + case MULTITYPE_Y4: + case MULTITYPE_VTAIL4: + numberMotor = 4; + break; + + case MULTITYPE_Y6: + case MULTITYPE_HEX6: + case MULTITYPE_HEX6X: + numberMotor = 6; + break; + + case MULTITYPE_OCTOX8: + case MULTITYPE_OCTOFLATP: + case MULTITYPE_OCTOFLATX: + numberMotor = 8; + break; + } +} void writeServos(void) { -#if defined(SERVO) + if (!feature(FEATURE_SERVO)) + return; -#endif + if (mixerConfiguration == MULTITYPE_TRI || mixerConfiguration == MULTITYPE_BI) { + /* One servo on Motor #4 */ + pwmWrite(0, servo[4]); + if (mixerConfiguration == MULTITYPE_BI) + pwmWrite(1, servo[5]); + } else { + /* Two servos for camstab or FLYING_WING */ + pwmWrite(0, servo[0]); + pwmWrite(1, servo[1]); + } } void writeMotors(void) { uint8_t i; + uint8_t offset = 0; - for (i = 0; i < NUMBER_MOTOR; i++) - pwmWrite(i, motor[i]); + // when servos are enabled, motor outputs 1..2 are for servos only + if (feature(FEATURE_SERVO)) + offset = 2; + + for (i = 0; i < numberMotor; i++) + pwmWrite(i + offset, motor[i]); } void writeAllMotors(int16_t mc) { uint8_t i; - + // Sends commands to all motors - for (i = 0; i < NUMBER_MOTOR; i++) + for (i = 0; i < numberMotor; i++) motor[i] = mc; writeMotors(); } +#define PIDMIX(X,Y,Z) rcCommand[THROTTLE] + axisPID[ROLL] * X + axisPID[PITCH] * Y + YAW_DIRECTION * axisPID[YAW] * Z + void mixTable(void) { int16_t maxMotor; @@ -61,105 +98,133 @@ void mixTable(void) static uint8_t camCycle = 0; static uint8_t camState = 0; static uint32_t camTime = 0; + + if (numberMotor > 3) { + //prevent "yaw jump" during yaw correction + axisPID[YAW] = constrain(axisPID[YAW], -100 - abs(rcCommand[YAW]), +100 + abs(rcCommand[YAW])); + } -#define PIDMIX(X,Y,Z) rcCommand[THROTTLE] + axisPID[ROLL] * X + axisPID[PITCH] * Y + YAW_DIRECTION * axisPID[YAW] * Z + switch (mixerConfiguration) { + case MULTITYPE_BI: + motor[0] = PIDMIX(+1, 0, 0); //LEFT + motor[1] = PIDMIX(-1, 0, 0); //RIGHT + servo[4] = constrain(1500 + YAW_DIRECTION * (axisPID[YAW] + axisPID[PITCH]), 1020, 2000); //LEFT + servo[5] = constrain(1500 + YAW_DIRECTION * (axisPID[YAW] - axisPID[PITCH]), 1020, 2000); //RIGHT + break; + + case MULTITYPE_TRI: + motor[0] = PIDMIX(0, +4 / 3, 0); //REAR + motor[1] = PIDMIX(-1, -2 / 3, 0); //RIGHT + motor[2] = PIDMIX(+1, -2 / 3, 0); //LEFT + servo[4] = constrain(tri_yaw_middle + YAW_DIRECTION * axisPID[YAW], TRI_YAW_CONSTRAINT_MIN, TRI_YAW_CONSTRAINT_MAX); //REAR + break; -#if NUMBER_MOTOR > 3 - //prevent "yaw jump" during yaw correction - axisPID[YAW] = constrain(axisPID[YAW], -100 - abs(rcCommand[YAW]), +100 + abs(rcCommand[YAW])); -#endif -#ifdef BI - motor[0] = PIDMIX(+1, 0, 0); //LEFT - motor[1] = PIDMIX(-1, 0, 0); //RIGHT - servo[4] = constrain(1500 + YAW_DIRECTION * (axisPID[YAW] + axisPID[PITCH]), 1020, 2000); //LEFT - servo[5] = constrain(1500 + YAW_DIRECTION * (axisPID[YAW] - axisPID[PITCH]), 1020, 2000); //RIGHT -#endif -#ifdef TRI - motor[0] = PIDMIX(0, +4 / 3, 0); //REAR - motor[1] = PIDMIX(-1, -2 / 3, 0); //RIGHT - motor[2] = PIDMIX(+1, -2 / 3, 0); //LEFT - servo[5] = constrain(tri_yaw_middle + YAW_DIRECTION * axisPID[YAW], TRI_YAW_CONSTRAINT_MIN, TRI_YAW_CONSTRAINT_MAX); //REAR + case MULTITYPE_QUADP: + motor[0] = PIDMIX(0, +1, -1); //REAR + motor[1] = PIDMIX(-1, 0, +1); //RIGHT + motor[2] = PIDMIX(+1, 0, +1); //LEFT + motor[3] = PIDMIX(0, -1, -1); //FRONT + break; -#endif -#ifdef QUADP - motor[0] = PIDMIX(0, +1, -1); //REAR - motor[1] = PIDMIX(-1, 0, +1); //RIGHT - motor[2] = PIDMIX(+1, 0, +1); //LEFT - motor[3] = PIDMIX(0, -1, -1); //FRONT -#endif -#ifdef QUADX - motor[0] = PIDMIX(-1, +1, -1); //REAR_R - motor[1] = PIDMIX(-1, -1, +1); //FRONT_R - motor[2] = PIDMIX(+1, +1, +1); //REAR_L - motor[3] = PIDMIX(+1, -1, -1); //FRONT_L -#endif -#ifdef Y4 - motor[0] = PIDMIX(+0, +1, -1); //REAR_1 CW - motor[1] = PIDMIX(-1, -1, 0); //FRONT_R CCW - motor[2] = PIDMIX(+0, +1, +1); //REAR_2 CCW - motor[3] = PIDMIX(+1, -1, 0); //FRONT_L CW -#endif -#ifdef Y6 - motor[0] = PIDMIX(+0, +4 / 3, +1); //REAR - motor[1] = PIDMIX(-1, -2 / 3, -1); //RIGHT - motor[2] = PIDMIX(+1, -2 / 3, -1); //LEFT - motor[3] = PIDMIX(+0, +4 / 3, -1); //UNDER_REAR - motor[4] = PIDMIX(-1, -2 / 3, +1); //UNDER_RIGHT - motor[5] = PIDMIX(+1, -2 / 3, +1); //UNDER_LEFT -#endif -#ifdef HEX6 - motor[0] = PIDMIX(-1 / 2, +1 / 2, +1); //REAR_R - motor[1] = PIDMIX(-1 / 2, -1 / 2, -1); //FRONT_R - motor[2] = PIDMIX(+1 / 2, +1 / 2, +1); //REAR_L - motor[3] = PIDMIX(+1 / 2, -1 / 2, -1); //FRONT_L - motor[4] = PIDMIX(+0, -1, +1); //FRONT - motor[5] = PIDMIX(+0, +1, -1); //REAR -#endif -#ifdef HEX6X - motor[0] = PIDMIX(-1 / 2, +1 / 2, +1); //REAR_R - motor[1] = PIDMIX(-1 / 2, -1 / 2, +1); //FRONT_R - motor[2] = PIDMIX(+1 / 2, +1 / 2, -1); //REAR_L - motor[3] = PIDMIX(+1 / 2, -1 / 2, -1); //FRONT_L - motor[4] = PIDMIX(-1, +0, -1); //RIGHT - motor[5] = PIDMIX(+1, +0, +1); //LEFT -#endif -#ifdef OCTOX8 - motor[0] = PIDMIX(-1, +1, -1); //REAR_R - motor[1] = PIDMIX(-1, -1, +1); //FRONT_R - motor[2] = PIDMIX(+1, +1, +1); //REAR_L - motor[3] = PIDMIX(+1, -1, -1); //FRONT_L - motor[4] = PIDMIX(-1, +1, +1); //UNDER_REAR_R - motor[5] = PIDMIX(-1, -1, -1); //UNDER_FRONT_R - motor[6] = PIDMIX(+1, +1, -1); //UNDER_REAR_L - motor[7] = PIDMIX(+1, -1, +1); //UNDER_FRONT_L -#endif -#ifdef OCTOFLATP - motor[0] = PIDMIX(+7 / 10, -7 / 10, +1); //FRONT_L - motor[1] = PIDMIX(-7 / 10, -7 / 10, +1); //FRONT_R - motor[2] = PIDMIX(-7 / 10, +7 / 10, +1); //REAR_R - motor[3] = PIDMIX(+7 / 10, +7 / 10, +1); //REAR_L - motor[4] = PIDMIX(+0, -1, -1); //FRONT - motor[5] = PIDMIX(-1, +0, -1); //RIGHT - motor[6] = PIDMIX(+0, +1, -1); //REAR - motor[7] = PIDMIX(+1, +0, -1); //LEFT -#endif -#ifdef OCTOFLATX - motor[0] = PIDMIX(+1, -1 / 2, +1); //MIDFRONT_L - motor[1] = PIDMIX(-1 / 2, -1, +1); //FRONT_R - motor[2] = PIDMIX(-1, +1 / 2, +1); //MIDREAR_R - motor[3] = PIDMIX(+1 / 2, +1, +1); //REAR_L - motor[4] = PIDMIX(+1 / 2, -1, -1); //FRONT_L - motor[5] = PIDMIX(-1, -1 / 2, -1); //MIDFRONT_R - motor[6] = PIDMIX(-1 / 2, +1, -1); //REAR_R - motor[7] = PIDMIX(+1, +1 / 2, -1); //MIDREAR_L -#endif -#ifdef VTAIL4 - motor[0] = PIDMIX(+0, +1, -1 / 2); //REAR_R - motor[1] = PIDMIX(-1, -1, +2 / 10); //FRONT_R - motor[2] = PIDMIX(+0, +1, +1 / 2); //REAR_L - motor[3] = PIDMIX(+1, -1, -2 / 10); //FRONT_L -#endif + case MULTITYPE_QUADX: + motor[0] = PIDMIX(-1, +1, -1); //REAR_R + motor[1] = PIDMIX(-1, -1, +1); //FRONT_R + motor[2] = PIDMIX(+1, +1, +1); //REAR_L + motor[3] = PIDMIX(+1, -1, -1); //FRONT_L + break; + case MULTITYPE_Y4: + motor[0] = PIDMIX(+0, +1, -1); //REAR_1 CW + motor[1] = PIDMIX(-1, -1, 0); //FRONT_R CCW + motor[2] = PIDMIX(+0, +1, +1); //REAR_2 CCW + motor[3] = PIDMIX(+1, -1, 0); //FRONT_L CW + break; + + case MULTITYPE_Y6: + motor[0] = PIDMIX(+0, +4 / 3, +1); //REAR + motor[1] = PIDMIX(-1, -2 / 3, -1); //RIGHT + motor[2] = PIDMIX(+1, -2 / 3, -1); //LEFT + motor[3] = PIDMIX(+0, +4 / 3, -1); //UNDER_REAR + motor[4] = PIDMIX(-1, -2 / 3, +1); //UNDER_RIGHT + motor[5] = PIDMIX(+1, -2 / 3, +1); //UNDER_LEFT + break; + + case MULTITYPE_HEX6: + motor[0] = PIDMIX(-1 / 2, +1 / 2, +1); //REAR_R + motor[1] = PIDMIX(-1 / 2, -1 / 2, -1); //FRONT_R + motor[2] = PIDMIX(+1 / 2, +1 / 2, +1); //REAR_L + motor[3] = PIDMIX(+1 / 2, -1 / 2, -1); //FRONT_L + motor[4] = PIDMIX(+0, -1, +1); //FRONT + motor[5] = PIDMIX(+0, +1, -1); //REAR + break; + + case MULTITYPE_HEX6X: + motor[0] = PIDMIX(-1 / 2, +1 / 2, +1); //REAR_R + motor[1] = PIDMIX(-1 / 2, -1 / 2, +1); //FRONT_R + motor[2] = PIDMIX(+1 / 2, +1 / 2, -1); //REAR_L + motor[3] = PIDMIX(+1 / 2, -1 / 2, -1); //FRONT_L + motor[4] = PIDMIX(-1, +0, -1); //RIGHT + motor[5] = PIDMIX(+1, +0, +1); //LEFT + break; + + case MULTITYPE_OCTOX8: + motor[0] = PIDMIX(-1, +1, -1); //REAR_R + motor[1] = PIDMIX(-1, -1, +1); //FRONT_R + motor[2] = PIDMIX(+1, +1, +1); //REAR_L + motor[3] = PIDMIX(+1, -1, -1); //FRONT_L + motor[4] = PIDMIX(-1, +1, +1); //UNDER_REAR_R + motor[5] = PIDMIX(-1, -1, -1); //UNDER_FRONT_R + motor[6] = PIDMIX(+1, +1, -1); //UNDER_REAR_L + motor[7] = PIDMIX(+1, -1, +1); //UNDER_FRONT_L + break; + + case MULTITYPE_OCTOFLATP: + motor[0] = PIDMIX(+7 / 10, -7 / 10, +1); //FRONT_L + motor[1] = PIDMIX(-7 / 10, -7 / 10, +1); //FRONT_R + motor[2] = PIDMIX(-7 / 10, +7 / 10, +1); //REAR_R + motor[3] = PIDMIX(+7 / 10, +7 / 10, +1); //REAR_L + motor[4] = PIDMIX(+0, -1, -1); //FRONT + motor[5] = PIDMIX(-1, +0, -1); //RIGHT + motor[6] = PIDMIX(+0, +1, -1); //REAR + motor[7] = PIDMIX(+1, +0, -1); //LEFT + break; + + case MULTITYPE_OCTOFLATX: + motor[0] = PIDMIX(+1, -1 / 2, +1); //MIDFRONT_L + motor[1] = PIDMIX(-1 / 2, -1, +1); //FRONT_R + motor[2] = PIDMIX(-1, +1 / 2, +1); //MIDREAR_R + motor[3] = PIDMIX(+1 / 2, +1, +1); //REAR_L + motor[4] = PIDMIX(+1 / 2, -1, -1); //FRONT_L + motor[5] = PIDMIX(-1, -1 / 2, -1); //MIDFRONT_R + motor[6] = PIDMIX(-1 / 2, +1, -1); //REAR_R + motor[7] = PIDMIX(+1, +1 / 2, -1); //MIDREAR_L + break; + + case MULTITYPE_VTAIL4: + motor[0] = PIDMIX(+0, +1, -1 / 2); //REAR_R + motor[1] = PIDMIX(-1, -1, +2 / 10); //FRONT_R + motor[2] = PIDMIX(+0, +1, +1 / 2); //REAR_L + motor[3] = PIDMIX(+1, -1, -2 / 10); //FRONT_L + break; + + case MULTITYPE_GIMBAL: + servo[0] = constrain(TILT_PITCH_MIDDLE + TILT_PITCH_PROP * angle[PITCH] / 16 + rcCommand[PITCH], TILT_PITCH_MIN, TILT_PITCH_MAX); + servo[1] = constrain(TILT_ROLL_MIDDLE + TILT_ROLL_PROP * angle[ROLL] / 16 + rcCommand[ROLL], TILT_ROLL_MIN, TILT_ROLL_MAX); + break; + + case MULTITYPE_FLYING_WING: + motor[0] = rcCommand[THROTTLE]; + if (passThruMode) { // do not use sensors for correction, simple 2 channel mixing + servo[0] = PITCH_DIRECTION_L * (rcData[PITCH] - MIDRC) + ROLL_DIRECTION_L * (rcData[ROLL] - MIDRC); + servo[1] = PITCH_DIRECTION_R * (rcData[PITCH] - MIDRC) + ROLL_DIRECTION_R * (rcData[ROLL] - MIDRC); + } else { // use sensors to correct (gyro only or gyro+acc according to aux1/aux2 configuration + servo[0] = PITCH_DIRECTION_L * axisPID[PITCH] + ROLL_DIRECTION_L * axisPID[ROLL]; + servo[1] = PITCH_DIRECTION_R * axisPID[PITCH] + ROLL_DIRECTION_R * axisPID[ROLL]; + } + servo[0] = constrain(servo[0] + wing_left_mid , WING_LEFT_MIN, WING_LEFT_MAX); + servo[1] = constrain(servo[1] + wing_right_mid, WING_RIGHT_MIN, WING_RIGHT_MAX); + break; + } #ifdef SERVO_TILT servo[0] = TILT_PITCH_MIDDLE + rcData[AUX3] - 1500; @@ -173,22 +238,6 @@ void mixTable(void) servo[0] = constrain(servo[0], TILT_PITCH_MIN, TILT_PITCH_MAX); servo[1] = constrain(servo[1], TILT_ROLL_MIN, TILT_ROLL_MAX); #endif -#ifdef GIMBAL - servo[0] = constrain(TILT_PITCH_MIDDLE + TILT_PITCH_PROP * angle[PITCH] / 16 + rcCommand[PITCH], TILT_PITCH_MIN, TILT_PITCH_MAX); - servo[1] = constrain(TILT_ROLL_MIDDLE + TILT_ROLL_PROP * angle[ROLL] / 16 + rcCommand[ROLL], TILT_ROLL_MIN, TILT_ROLL_MAX); -#endif -#ifdef FLYING_WING - motor[0] = rcCommand[THROTTLE]; - if (passThruMode) {// do not use sensors for correction, simple 2 channel mixing - servo[0] = PITCH_DIRECTION_L * (rcData[PITCH] - MIDRC) + ROLL_DIRECTION_L * (rcData[ROLL] - MIDRC); - servo[1] = PITCH_DIRECTION_R * (rcData[PITCH] - MIDRC) + ROLL_DIRECTION_R * (rcData[ROLL] - MIDRC); - } else { // use sensors to correct (gyro only or gyro+acc according to aux1/aux2 configuration - servo[0] = PITCH_DIRECTION_L * axisPID[PITCH] + ROLL_DIRECTION_L * axisPID[ROLL]; - servo[1] = PITCH_DIRECTION_R * axisPID[PITCH] + ROLL_DIRECTION_R * axisPID[ROLL]; - } - servo[0] = constrain(servo[0] + wing_left_mid , WING_LEFT_MIN, WING_LEFT_MAX); - servo[1] = constrain(servo[1] + wing_right_mid, WING_RIGHT_MIN, WING_RIGHT_MAX); -#endif #if defined(CAMTRIG) if (camCycle == 1) { if (camState == 0) { @@ -213,10 +262,10 @@ void mixTable(void) #endif maxMotor = motor[0]; - for (i = 1; i < NUMBER_MOTOR; i++) + for (i = 1; i < numberMotor; i++) if (motor[i] > maxMotor) maxMotor = motor[i]; - for (i = 0; i < NUMBER_MOTOR; i++) { + for (i = 0; i < numberMotor; i++) { if (maxMotor > MAXTHROTTLE) // this is a way to still have good gyro corrections if at least one motor reaches its max. motor[i] -= maxMotor - MAXTHROTTLE; motor[i] = constrain(motor[i], MINTHROTTLE, MAXTHROTTLE); diff --git a/mw.c b/mw.c index fcfbc47b2..ca4e06739 100755 --- a/mw.c +++ b/mw.c @@ -42,12 +42,6 @@ uint8_t magMode = 0; // if compass heading hold is a activated uint8_t baroMode = 0; // if altitude hold is activated int16_t axisPID[3]; -int16_t motor[8]; -int16_t servo[8] = { 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500 }; -uint16_t wing_left_mid = WING_LEFT_MID; -uint16_t wing_right_mid = WING_RIGHT_MID; -uint16_t tri_yaw_middle = TRI_YAW_MIDDLE; - volatile uint16_t rcValue[18] = { 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502 }; // interval [1000;2000] uint8_t rcChannel[8] = { ROLL, PITCH, THROTTLE, YAW, AUX1, AUX2, AUX3, AUX4 }; diff --git a/mw.h b/mw.h index 1303deb54..1ca09cf29 100755 --- a/mw.h +++ b/mw.h @@ -1,7 +1,5 @@ #pragma once -#define QUADX - #define MINCHECK 1100 #define MAXCHECK 1900 @@ -59,6 +57,19 @@ #define WING_RIGHT_MIN 1020 // limit servo travel range must be inside [1020;2000] #define WING_RIGHT_MAX 2000 // limit servo travel range must be inside [1020;2000] +/* The following lines apply only for a pitch/roll tilt stabilization system + On promini board, it is not compatible with config with 6 motors or more + Uncomment the first line to activate it */ +//#define SERVO_TILT +#define TILT_PITCH_MIN 1020 //servo travel min, don't set it below 1020 +#define TILT_PITCH_MAX 2000 //servo travel max, max value=2000 +#define TILT_PITCH_MIDDLE 1500 //servo neutral value +#define TILT_PITCH_PROP 10 //servo proportional (tied to angle) ; can be negative to invert movement +#define TILT_ROLL_MIN 1020 +#define TILT_ROLL_MAX 2000 +#define TILT_ROLL_MIDDLE 1500 +#define TILT_ROLL_PROP 10 + /* for V BAT monitoring after the resistor divisor we should get [0V;5V]->[0;1023] on analog V_BATPIN with R1=33k and R2=51k @@ -70,38 +81,28 @@ #define VBATLEVEL3_3S 99 // 9.9V #define NO_VBAT 16 // Avoid beeping without any battery - #define VERSION 19 -#if defined(TRI) - #define MULTITYPE 1 -#elif defined(QUADP) - #define MULTITYPE 2 -#elif defined(QUADX) - #define MULTITYPE 3 -#elif defined(BI) - #define MULTITYPE 4 -#elif defined(GIMBAL) - #define MULTITYPE 5 -#elif defined(Y6) - #define MULTITYPE 6 -#elif defined(HEX6) - #define MULTITYPE 7 -#elif defined(FLYING_WING) - #define MULTITYPE 8 -#elif defined(Y4) - #define MULTITYPE 9 -#elif defined(HEX6X) - #define MULTITYPE 10 -#elif defined(OCTOX8) - #define MULTITYPE 11 -#elif defined(OCTOFLATP) - #define MULTITYPE 11 //the GUI is the same for all 8 motor configs -#elif defined(OCTOFLATX) - #define MULTITYPE 11 //the GUI is the same for all 8 motor configs -#elif defined(VTAIL4) - #define MULTITYPE 15 -#endif +// Syncronized with GUI. Only exception is mixer > 11, which is always returned as 11 during serialization. +typedef enum MultiType +{ + MULTITYPE_TRI = 1, // XA + MULTITYPE_QUADP = 2, // XB + MULTITYPE_QUADX = 3, // XC + MULTITYPE_BI = 4, // XD + MULTITYPE_GIMBAL = 5, // XE + MULTITYPE_Y6 = 6, // XF + MULTITYPE_HEX6 = 7, // XG + MULTITYPE_FLYING_WING = 8, // XH + MULTITYPE_Y4 = 9, // XI + MULTITYPE_HEX6X = 10, // XJ + MULTITYPE_OCTOX8 = 11, // XK + MULTITYPE_OCTOFLATP = 12, // XL the GUI is the same for all 8 motor configs + MULTITYPE_OCTOFLATX = 13, // XM the GUI is the same for all 8 motor configs + // XN missing for some reason?? + MULTITYPE_VTAIL4 = 15, // XO + MULTITYPE_LAST = 16 +} MultiType; /*********** RC alias *****************/ #define ROLL 0 @@ -174,6 +175,7 @@ extern int32_t EstVelocity; extern int16_t BaroPID; extern uint8_t headFreeMode; extern int16_t headFreeModeHold; +extern uint8_t passThruMode; extern int8_t smallAngle25; extern int16_t zVelocity; extern int16_t heading, magHold; @@ -205,6 +207,10 @@ extern uint8_t GPSModeHold; extern uint8_t vbat; extern uint8_t powerTrigger1; extern int16_t lookupRX[7]; // lookup table for expo & RC rate +extern uint8_t mixerConfiguration; +extern uint16_t wing_left_mid; +extern uint16_t wing_right_mid; +extern uint16_t tri_yaw_middle; // main void loop(void); @@ -225,6 +231,7 @@ void Mag_init(void); void Mag_getADC(void); // Output +void mixerInit(void); void writeServos(void); void writeMotors(void); void mixTable(void); @@ -236,3 +243,9 @@ void serialCom(void); void readEEPROM(void); void writeParams(void); void checkFirstTime(void); +bool sensors(uint32_t mask); +void sensorsSet(uint32_t mask); +void sensorsClear(uint32_t mask); +bool feature(uint32_t mask); +void featureSet(uint32_t mask); +void featureClear(uint32_t mask); diff --git a/serial.c b/serial.c index 66e5afa79..46a9d5d5c 100755 --- a/serial.c +++ b/serial.c @@ -155,7 +155,7 @@ void serialCom(void) serialize16(i2cGetErrorCounter()); for (i = 0; i < 2; i++) serialize16(angle[i]); - serialize8(MULTITYPE); + serialize8(mixerConfiguration); for (i = 0; i < PIDITEMS; i++) { serialize8(P8[i]); serialize8(I8[i]); @@ -207,8 +207,22 @@ void serialCom(void) serialize8('O'); //49 // UartSendData(); break; - case 'R': // reboot to bootloader - systemResetToBootloader(); + case 'R': // reboot to bootloader (oops, apparently this w as used for other trash, fix later) + systemReset(true); + break; + + case 'X': // dynamic mixer + i = uartReadPoll(); + if (i > 64 && i < 64 + MULTITYPE_LAST) { + serialize8('O'); + serialize8('K'); + mixerConfiguration = i - '@'; // A..B..C.. index + writeParams(); + systemReset(false); + break; + } + serialize8('N'); + serialize8('G'); break; case 'W': //GUI write params to eeprom @ arduino