/branches/V2.02a_FirstTrial_Peter/FlightCtrl.aps |
---|
0,0 → 1,0 |
<AVRStudio><MANAGEMENT><ProjectName>FlightCtrl</ProjectName><Created>15-May-2007 11:20:41</Created><LastEdit>11-Oct-2007 22:58:54</LastEdit><ICON>241</ICON><ProjectType>0</ProjectType><Created>15-May-2007 11:20:41</Created><Version>4</Version><Build>4, 13, 0, 528</Build><ProjectTypeName>AVR GCC</ProjectTypeName></MANAGEMENT><CODE_CREATION><ObjectFile>default\Flight-Ctrl.elf</ObjectFile><EntryFile></EntryFile><SaveFolder>F:\SVN\MikroKopter\FlightCtrl\branches\V0.64_ZeroWarnings\</SaveFolder></CODE_CREATION><DEBUG_TARGET><CURRENT_TARGET>AVR Simulator</CURRENT_TARGET><CURRENT_PART>ATmega644.xml</CURRENT_PART><BREAKPOINTS></BREAKPOINTS><IO_EXPAND><HIDE>false</HIDE></IO_EXPAND><REGISTERNAMES><Register>R00</Register><Register>R01</Register><Register>R02</Register><Register>R03</Register><Register>R04</Register><Register>R05</Register><Register>R06</Register><Register>R07</Register><Register>R08</Register><Register>R09</Register><Register>R10</Register><Register>R11</Register><Register>R12</Register><Register>R13</Register><Register>R14</Register><Register>R15</Register><Register>R16</Register><Register>R17</Register><Register>R18</Register><Register>R19</Register><Register>R20</Register><Register>R21</Register><Register>R22</Register><Register>R23</Register><Register>R24</Register><Register>R25</Register><Register>R26</Register><Register>R27</Register><Register>R28</Register><Register>R29</Register><Register>R30</Register><Register>R31</Register></REGISTERNAMES><COM>Auto</COM><COMType>0</COMType><WATCHNUM>0</WATCHNUM><WATCHNAMES><Pane0></Pane0><Pane1></Pane1><Pane2></Pane2><Pane3></Pane3></WATCHNAMES><BreakOnTrcaeFull>0</BreakOnTrcaeFull></DEBUG_TARGET><Debugger><Triggers></Triggers></Debugger><AVRGCCPLUGIN><FILES><SOURCEFILE>uart.c</SOURCEFILE><SOURCEFILE>analog.c</SOURCEFILE><SOURCEFILE>eeprom.c</SOURCEFILE><SOURCEFILE>fc.c</SOURCEFILE><SOURCEFILE>GPS.c</SOURCEFILE><SOURCEFILE>main.c</SOURCEFILE><SOURCEFILE>menu.c</SOURCEFILE><SOURCEFILE>printf_P.c</SOURCEFILE><SOURCEFILE>rc.c</SOURCEFILE><SOURCEFILE>timer0.c</SOURCEFILE><SOURCEFILE>twimaster.c</SOURCEFILE><HEADERFILE>uart.h</HEADERFILE><HEADERFILE>_Settings.h</HEADERFILE><HEADERFILE>analog.h</HEADERFILE><HEADERFILE>fc.h</HEADERFILE><HEADERFILE>gps.h</HEADERFILE><HEADERFILE>main.h</HEADERFILE><HEADERFILE>menu.h</HEADERFILE><HEADERFILE>old_macros.h</HEADERFILE><HEADERFILE>printf_P.h</HEADERFILE><HEADERFILE>rc.h</HEADERFILE><HEADERFILE>Settings.h</HEADERFILE><HEADERFILE>timer0.h</HEADERFILE><HEADERFILE>twimaster.h</HEADERFILE></FILES><CONFIGS><CONFIG><NAME>default</NAME><USESEXTERNALMAKEFILE>NO</USESEXTERNALMAKEFILE><EXTERNALMAKEFILE></EXTERNALMAKEFILE><PART>atmega644</PART><HEX>1</HEX><LIST>1</LIST><MAP>1</MAP><OUTPUTFILENAME>Flight-Ctrl.elf</OUTPUTFILENAME><OUTPUTDIR>default\</OUTPUTDIR><ISDIRTY>1</ISDIRTY><OPTIONS><OPTION><FILE>GPS.c</FILE><OPTIONLIST></OPTIONLIST></OPTION><OPTION><FILE>analog.c</FILE><OPTIONLIST></OPTIONLIST></OPTION><OPTION><FILE>eeprom.c</FILE><OPTIONLIST></OPTIONLIST></OPTION><OPTION><FILE>fc.c</FILE><OPTIONLIST></OPTIONLIST></OPTION><OPTION><FILE>main.c</FILE><OPTIONLIST></OPTIONLIST></OPTION><OPTION><FILE>menu.c</FILE><OPTIONLIST></OPTIONLIST></OPTION><OPTION><FILE>printf_P.c</FILE><OPTIONLIST></OPTIONLIST></OPTION><OPTION><FILE>rc.c</FILE><OPTIONLIST></OPTIONLIST></OPTION><OPTION><FILE>timer0.c</FILE><OPTIONLIST></OPTIONLIST></OPTION><OPTION><FILE>twimaster.c</FILE><OPTIONLIST></OPTIONLIST></OPTION><OPTION><FILE>uart.c</FILE><OPTIONLIST></OPTIONLIST></OPTION></OPTIONS><INCDIRS/><LIBDIRS/><LIBS><LIB>libc.a</LIB><LIB>libm.a</LIB></LIBS><LINKOBJECTS/><OPTIONSFORALL>-Wall -gdwarf-2 -Wstrict-prototypes -std=gnu99 -Os -funsigned-char -funsigned-bitfields -fpack-struct -fshort-enums -DVERSION_HAUPTVERSION=0 -DVERSION_NEBENVERSION=64 -DVERSION_KOMPATIBEL=5</OPTIONSFORALL><LINKEROPTIONS></LINKEROPTIONS><SEGMENTS/></CONFIG></CONFIGS><LASTCONFIG>default</LASTCONFIG><USES_WINAVR>1</USES_WINAVR><GCC_LOC>C:\Program Files\WinAVR\bin\avr-gcc.exe</GCC_LOC><MAKE_LOC>C:\Program Files\WinAVR\utils\bin\make.exe</MAKE_LOC></AVRGCCPLUGIN><IOView><usergroups/></IOView><Files><File00000><FileId>00000</FileId><FileName>main.c</FileName><Status>1</Status></File00000><File00001><FileId>00001</FileId><FileName>uart.c</FileName><Status>1</Status></File00001><File00002><FileId>00002</FileId><FileName>menu.c</FileName><Status>1</Status></File00002><File00003><FileId>00003</FileId><FileName>timer0.c</FileName><Status>1</Status></File00003><File00004><FileId>00004</FileId><FileName>fc.c</FileName><Status>1</Status></File00004><File00005><FileId>00005</FileId><FileName>fc.h</FileName><Status>1</Status></File00005><File00006><FileId>00006</FileId><FileName>menu.h</FileName><Status>1</Status></File00006><File00007><FileId>00007</FileId><FileName>TWIMASTER.C</FileName><Status>1</Status></File00007><File00008><FileId>00008</FileId><FileName>twimaster.h</FileName><Status>1</Status></File00008><File00009><FileId>00009</FileId><FileName>uart.h</FileName><Status>1</Status></File00009><File00010><FileId>00010</FileId><FileName>_Settings.h</FileName><Status>1</Status></File00010><File00011><FileId>00011</FileId><FileName>analog.h</FileName><Status>1</Status></File00011><File00012><FileId>00012</FileId><FileName>gps.h</FileName><Status>1</Status></File00012><File00013><FileId>00013</FileId><FileName>main.h</FileName><Status>1</Status></File00013><File00014><FileId>00014</FileId><FileName>old_macros.h</FileName><Status>1</Status></File00014><File00015><FileId>00015</FileId><FileName>printf_P.h</FileName><Status>1</Status></File00015><File00016><FileId>00016</FileId><FileName>rc.h</FileName><Status>1</Status></File00016><File00017><FileId>00017</FileId><FileName>Settings.h</FileName><Status>1</Status></File00017><File00018><FileId>00018</FileId><FileName>timer0.h</FileName><Status>1</Status></File00018></Files><Events><Bookmarks></Bookmarks></Events><Trace><Filters></Filters></Trace></AVRStudio> |
/branches/V2.02a_FirstTrial_Peter/GPS.c |
---|
0,0 → 1,16 |
// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
// + Copyright (c) Holger Buss, Ingo Busker |
// + only for non-profit use |
// + www.MikroKopter.com |
// + see the File "License.txt" for further Informations |
// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
#include "main.h" |
signed int GPS_Nick = 0; |
signed int GPS_Roll = 0; |
unsigned char GPS_Aid_StickMultiplikator = 0; // 64 = 100% |
/branches/V2.02a_FirstTrial_Peter/Hex-Files/Flight-Ctrl_MEGA1284p_V2_02a.hex |
---|
0,0 → 1,5163 |
:100000000C94C4090C94210A0C94210A0C94210A22 |
:100010000C94210A0C94210A0C94210A0C94210AB4 |
:100020000C94210A0C94631D0C94210A0C94210A4F |
:100030000C94DE380C94210A0C94210A0C94210AA9 |
:100040000C94210A0C94210A0C9481190C94210A15 |
:100050000C9422100C94210A0C94EC0F0C94210A9D |
:100060000C94A9200C94210A0C9403340C94210ABA |
:100070000C94DD9C0C94210A0C942E920C94210A71 |
:100080000C94210A0C94210A0C94210AD220D72026 |
:10009000DC20E520FC201321232133216E21FF23C6 |
:1000A00013218A229B22CB22EA2207236123BC232D |
:1000B0006F265027E62767289F284F29162A772A78 |
:1000C000E92A292B812BAF2BDC2B412C8C2CD72C14 |
:1000D0003B2D372E2234563497340935213561357E |
:1000E00027362B372B372B372B372B372B372B3705 |
:1000F0002B372B372B372B37E036E236E736FF36F8 |
:100100000137A17295731A7441736E749D74E07215 |
:1001100070739F834384C8842A857E85E785658DB7 |
:1001200068869A869A869A869A869A869A869A8601 |
:100130009A869A86C8864387D487F9873C889488AC |
:100140002A89358A9C8A9C8A9C8A9C8A9C8A9C8A59 |
:100150009C8A9C8A9C8AD48AF28A178B738BAF8B79 |
:10016000138C408CE08C658D408D408D408D408D92 |
:10017000408D408D408D408DEC9AEF9AEF9AEF9A2A |
:10018000F89AFB9AFE9A109B0D9B0A0D3D3D3D3D52 |
:100190003D3D3D3D3D3D3D3D3D3D3D3D3D3D3D3D8F |
:1001A0003D3D3D3D3D3D3D3D3D3D3D3D3D3D3D00BC |
:1001B0000A0D426174743A002025642043656C6C1A |
:1001C000732000204C6F77207761726E696E673AFA |
:1001D0002025642E25640020204175746F6C616EAB |
:1001E00064696E673A2025642E2564000A0D466F07 |
:1001F000756E6420424C2D4374726C3A2000256465 |
:10020000000A0D0A0D2121204D495353494E472024 |
:10021000424C2D4354524C3A202564202121000A9F |
:100220000D43616C6962726174696E6720707265FA |
:1002300073737572652073656E736F722E2E004F27 |
:100240004B0A0D000A0D466C696768742D74696D60 |
:1002500065202575206D696E20546F74616C3A2598 |
:1002600075206D696E00416E676C654E69636B2029 |
:10027000202020202020416E676C65526F6C6C201E |
:100280002020202020204163634E69636B202020C2 |
:10029000202020202020416363526F6C6C2020209E |
:1002A0002020202020205961774779726F2020205C |
:1002B000202020202020416C746974756465205BC7 |
:1002C000302E316D5D204163635A20202020202094 |
:1002D0002020202020204761732020202020202063 |
:1002E000202020202020436F6D70617373205661A1 |
:1002F0006C7565202020566F6C74616765205B30DB |
:100300002E31565D20205265636569766572204CFA |
:100310006576656C20204779726F20436F6D706140 |
:100320007373202020204D6F746F722031202020A5 |
:100330002020202020204D6F746F7220322020203A |
:100340002020202020204D6F746F72203320202029 |
:100350002020202020204D6F746F72203420202018 |
:100360002020202020203136202020202020202066 |
:100370002020202020203137202020202020202055 |
:100380002020202020203138202020202020202044 |
:100390002020202020203139202020202020202033 |
:1003A000202020202020536572766F2020202020DE |
:1003B000202020202020486F7665726761732020FE |
:1003C00020202020202043757272656E74205B30DF |
:1003D0002E31415D20204361706163697479205B37 |
:1003E0006D41685D202048656967687420536574B5 |
:1003F000706F696E7420323520202020202020204C |
:1004000020202020202032362020202020202020C4 |
:10041000202020202020436F6D706173732053656E |
:1004200074706F696E744932432D4572726F722019 |
:10043000202020202020424C204C696D697420200F |
:100440002020202020204750535F4E69636B2020DE |
:100450002020202020204750535F526F6C6C2020BA |
:1004600020202020202021212120494E434F4D5083 |
:10047000415449424C4520212121002E000A0D20E3 |
:10048000444143206F7220493243204552524F521B |
:100490002120436865636B204932432C2033567218 |
:1004A00065662C2044414320616E6420424C2D43FC |
:1004B00074726C005B25695D005B25695D002B2013 |
:1004C0004D696B726F4B6F70746572202B004857CB |
:1004D0003A5625642E25642053573A25642E25303C |
:1004E00032642563200053657474696E673A25642D |
:1004F000202573004D69786572204572726F7221F4 |
:10050000004552522532643A004861726477617244 |
:1005100065204572726F7220313A256420212100D6 |
:100520004D697373696E6720424C2D4374726C3A47 |
:10053000256420212100493243204552524F522147 |
:10054000212100424C2D53656C66746573742045FF |
:1005500072723A253264004865696768743A2020EF |
:1005600025356900536574706F696E743A25356975 |
:100570000050726573737572653A253569004F6670 |
:10058000667365743A2020253569002841290025C5 |
:1005900069006163742E2062656172696E67004E46 |
:1005A00069636B3A20202020202025356900526F96 |
:1005B0006C6C3A20202020202025356900436F6D87 |
:1005C000706173733A202020253569004B25693A04 |
:1005D00025346920204B25693A25346920004E696D |
:1005E0003A2534692020526F3A2534692000477338 |
:1005F0003A253469202047693A2534692000503172 |
:100600003A253469202050323A253469200050338D |
:100610003A253469202050343A253469200047793E |
:10062000726F202D2053656E736F72004E69636B7D |
:100630002025346920282533692E25782900526F1A |
:100640006C6C2025346920282533692E25782900F3 |
:1006500059617720202534692028253369290041F4 |
:100660004343202D2053656E736F72004E69636B98 |
:100670002025346920282533692900526F6C6C20AD |
:10068000253469202825336929005A202020202577 |
:10069000346920282533692900566F6C74616765B9 |
:1006A0003A2020202533692E253169560043757282 |
:1006B00072656E743A2020202533692E25316941F8 |
:1006C00000506F7765723A2020202020253469572A |
:1006D000004469736368617267653A202535696D06 |
:1006E00041680052656365697665720052432D5119 |
:1006F00075616C6974793A202534690052432D4341 |
:1007000068616E6E656C733A25346900436F6D7075 |
:10071000617373004D61676E65743A202020253542 |
:1007200069004779726F3A20202020202535690022 |
:10073000536574706F696E743A2025356900506F87 |
:10074000746925693A202025336900506F74692542 |
:10075000693A202025336900536572766F202000A6 |
:10076000536574706F696E74202025336900506F73 |
:10077000736974696F6E3A202533690052616E6740 |
:10078000653A2533692D25336900424C2D43747237 |
:100790006C204572726F72732000253364202533FC |
:1007A0006420253364202533642000424C205465A6 |
:1007B0006D70657261747572650025336420253330 |
:1007C0006420253364202533642000424C20437587 |
:1007D0007272656E740028696E20302E31412900D6 |
:1007E0002533642025336420253364202533642099 |
:1007F00000424C2D4374726C20666F756E6420004D |
:100800002025632020202563202020256320202010 |
:10081000256320002025632020202563202020251B |
:1008200063202020256320002025632020202D2008 |
:1008300020202D2020202D200031300031310031AA |
:100840003200466C696768742D54696D652020001C |
:10085000546F74616C3A2535756D696E004163742F |
:100860003A20202535756D696E00287265736574B0 |
:1008700029000A0D2D2D3E20486172647761726552 |
:100880002056657273696F6E2042797465204368E3 |
:10089000616E676564203C2D2D000A0D47656E650D |
:1008A000726174696E672064656661756C7420504E |
:1008B0006172616D657465722053657420256400F2 |
:1008C0000A0D5573696E6720506172616D657465BC |
:1008D0007220536574202564000A0D47656E6572A9 |
:1008E0006174696E672064656661756C74204D691A |
:1008F000786572205461626C65000A0D4D697865F7 |
:10090000722D436F6E6669673A202725732720286A |
:100910002575204D6F746F727329000A0D41434392 |
:10092000206E6F742063616C69627261746564210A |
:100930000D0A0000008F001E01AD013B02CA0258E3 |
:1009400003E603740402058F051B06A7063307BEE2 |
:10095000074808D2085B09E3096B0AF20A780BFD25 |
:100960000B810C040D860D070E870E060F840F00F9 |
:10097000107B10F5106E11E5115B12CF124213B30C |
:100980001323149214FE146A15D3153B16A11605F1 |
:10099000176717C81727188318DE1837198E19E339 |
:1009A00019361A871AD61A231B6E1BB61BFD1B415C |
:1009B0001C831CC31C001D3C1D751DAB1DE01D12BE |
:1009C0001E421E6F1E9A1EC31EE91E0D1F2E1F4DB6 |
:1009D0001F691F841F9B1FB01FC31FD31FE11FEC84 |
:1009E0001FF51FFB1FFF1F002004010000FF7900FF |
:1009F000020101457B01030202D97B02040303814A |
:100A00007C03000404367C2532692E2531695600AA |
:100A1000253364256320253033646D2563005374CA |
:100A200061747573004552524F523A20253264204A |
:100A30000053657425643A2573202000253469200D |
:100A40002532693A25303269002534696D25630005 |
:100A50002533692025336920253369202533690032 |
:100A60002533692025336920253369202533690022 |
:100A700054656D70657261747572657320202020F5 |
:100A8000002563432020202020002532692E2531B7 |
:100A90006956202533692E2531694100253469576F |
:100AA000202536696D4168004D61676E65743A2591 |
:100AB0003369252520253369256300496E636C69F8 |
:100AC0002E3A2533692563202825692920002532FF |
:100AD000756D2F73205361743A25642000202033F4 |
:100AE00044004E6F4678004447505300486F6D6590 |
:100AF0003A2533646D202533642563202563004E39 |
:100B00006F204E6176694374726C2100000005000D |
:100B100005000401060108000601020004000400AB |
:100B20000700070007000700070007000700030190 |
:100B30000301050017010F01060009010A0119014F |
:100B40000501050119011A010F01010009004E6F8D |
:100B5000204572726F722020202020202020004E1D |
:100B60006F7420636F6D70617469626C6520200022 |
:100B70004D4B334D6167206E6F7420636F6D7061F4 |
:100B8000004E6F20464320636F6D6D756E69636123 |
:100B90007400436F6D7061737320636F6D6D756E5C |
:100BA00069630047505320636F6D6D756E696361B3 |
:100BB00074696F00636F6D706173732076616C751B |
:100BC00065202020005243205369676E616C206CC1 |
:100BD0006F73742020004643207370692072782060 |
:100BE0006572726F7220004E6F204E4320636F6DEE |
:100BF0006D756E69636174004643204E69636B20B6 |
:100C00004779726F2020202000464320526F6C6C81 |
:100C1000204779726F2020202000464320596177B9 |
:100C2000204779726F2020202020004643204E6903 |
:100C3000636B204143432020202020004643205264 |
:100C40006F6C6C204143432020202020004643202D |
:100C50005A2D414343202020202020202000507284 |
:100C60006573737572652073656E736F72200049CA |
:100C700032432046432D3E424C2D4374726C20007B |
:100C8000426C204D697373696E67202020202020FC |
:100C9000004D69786572204572726F7220202020A5 |
:100CA00020004361726566726565204572726F72DD |
:100CB00020200047505320466978206C6F737420C1 |
:100CC000202020004D61676E6574204572726F723E |
:100CD00020202020004D6F746F7220726573746144 |
:100CE000727420202000424C204C696D697461743C |
:100CF000696F6E202020004750532052616E676557 |
:100D000020202020202020004E6F2053442D4361BE |
:100D100072642020202020200053442D4C6F6767F0 |
:100D2000696E67206572726F7200466C79696E67D2 |
:100D30002072616E676521202020004D617820417E |
:100D40006C74697475646521202020004E6F204703 |
:100D500050532066697820202020202000636F6D8A |
:100D600070617373206E6F742063616C2E00424C4F |
:100D70002D53656C66746573742020202020005309 |
:100D8000657420203A002021212020204C414E442F |
:100D9000494E4720202020212120200020212120F1 |
:100DA0004C69506F20766F6C74616765202121203B |
:100DB000200020202020204D696B726F4B6F7074D3 |
:100DC00065722020202020002020202020202020AC |
:100DD0002020202020202020202020202000202033 |
:100DE0002532692E253169562020002020253269C0 |
:100DF0002E25316956202000414C543A2534696D26 |
:100E000020256300414C543A2534696D202000416F |
:100E10004C543A2D2D2D2D200020202532693A25C5 |
:100E200030326920200020202532693A253032698D |
:100E30002020004449523A202533642563004300B2 |
:100E4000200020202535692020002020253569201C |
:100E50002000493A2532692E2531694120003A00A7 |
:100E60003A003A002D2D2D2D2D2D2D2D2D2B2D2DF4 |
:100E70002D2D2D2D2D2D2D2D2D002D2D2D2D2D2DCF |
:100E80002D2D2D2D2D2D2D2D2D2D2D2D2D2D2D00BF |
:100E90003A005341543A2532642000444953543AAD |
:100EA0002533646D004420003344002121004D416E |
:100EB000473A25337525252000484D3A25336425CA |
:100EC0006320256300696E636C3A253264256328CC |
:100ED0002532692900202020202532756D2F733A94 |
:100EE0002020484D3A253364256320256300455270 |
:100EF000523A202532642021004552523A200021E6 |
:100F000021204C69506F20766F6C746167652021D9 |
:100F10002100207777772E4D696B726F4B6F70745D |
:100F200065722E6465202000202532693A25303212 |
:100F30006920202532692E25316956202534696DB6 |
:100F4000416800202532693A253032692020253257 |
:100F5000692E25316956202534696D416800444960 |
:100F6000523A253364256300414C543A2534696D67 |
:100F700000414C543A2534696D00414C543A2D2DB2 |
:100F80002D2D2000256300484D3A2533642563202C |
:100F900020444953543A2533646D2025630050574B |
:100FA000523A2532692E2531694120282569572971 |
:100FB00020004346002020004750533A2532756DEB |
:100FC0002F73205341543A256420002020334420BD |
:100FD000004E4F46495800444750532000202020DF |
:100FE0004E6F204E6176694374726C202020202061 |
:100FF0002020002532692E2569202532692E256999 |
:10100000202532692E2569202532692E2569410067 |
:101010002533692025336920253369202533692547 |
:101020006343002532692E2569202532692E256902 |
:1010300041002532692E2569202532692E25692037 |
:101040002532692E2569202532692E256941002522 |
:101050003369202533692563432020202020202068 |
:101060002000253369202533692025336920253365 |
:1010700069256343004552523A20253264202100FD |
:101080004552523A20002121204C69506F20766F42 |
:101090006C7461676520212100207777772E4D6978 |
:1010A0006B726F4B6F707465722E646520200053F5 |
:1010B000657474696E673A257520257320004D6943 |
:1010C0006E3A2532692E253169562025732000415C |
:1010D0004C543A00504F54493A2533752000284F5C |
:1010E0004E29202000284F46462920004C494D49D2 |
:1010F0005400564152494F0044495341424C4544E3 |
:101100000043463A0044495341424C45440020289C |
:101110004F4E29200020284F4646290020544541A3 |
:101120004348004750533A0044495341424C4544D8 |
:10113000002846524545290028484F4D452900289A |
:1011400041494429200028484F4C44290020465357 |
:101150003A257573656B2000484F4D4520414C542E |
:101160003A0025756D00484F4C4420004E693A25E1 |
:10117000346920526F3A25346920433A2533690097 |
:1011800047733A2534692059613A25346920005063 |
:10119000313A2534692050323A25346920333A25D2 |
:1011A00033690050343A2534692050353A25346982 |
:1011B00020363A25336900434F55504C494E47205D |
:1011C0004F46462120004C4F4F50494E47212000AA |
:1011D0004848212000434F4D50415353204F46462D |
:1011E000212000004F505152535453565748005835 |
:1011F00059005A5545464748410049424A4A00006D |
:10120000000000000000000000444C4D0000000001 |
:10121000004E0000004B00430A0D7777772E4D6992 |
:101220006B726F4B6F707465722E64652028632932 |
:1012300020486953797374656D7320476D62480067 |
:101240000A0D74686520757365206F66207468697F |
:101250007320736F667477617265206973206F6E97 |
:101260006C79207065726D6974746564200A0D6F05 |
:101270006E206F726967696E616C204D696B726F69 |
:101280004B6F707465722D4861726477617265008E |
:101290005573657200486F545420563400414354CE |
:1012A0002044534C004A657469005370656B747236 |
:1012B000756D0050504D000A0D5265636569766585 |
:1012C000723A2000532E42757300756E6B6E6F7705 |
:1012D0006E2E205573696E672050504D2E2E2E00B5 |
:1012E0006E6F7420737570706F72746564206279AC |
:1012F00020686172647761726521000A0D202D20DB |
:101300004C4942204E4F5420434F4D504154494286 |
:101310004C452021212121000A0D0A0D21212042C6 |
:101320006F6F746C6F61646572206E6F7420636F91 |
:101330006D70617469626C6520746F2048617264BD |
:1013400077617265203E20322E322021210A0D0A5B |
:101350000D000A0D466C69676874436F6E74726F96 |
:101360006C0A0D48617264776172653A25642E25B6 |
:10137000640A0D536F6674776172653A5625642E60 |
:10138000253032642563200011241FBECFEFD0E446 |
:10139000DEBFCDBF12E0A0E0B1E0ECE9F0E401E097 |
:1013A0000BBF02C007900D92A83EB107D9F71CE011 |
:1013B000A8EEB2E001C01D92A73BB107E1F77AEABF |
:1013C000E2E0F0E081E280935700D4907E0108943F |
:1013D000E11CF11C20EF37EF41E050E087016FE0A6 |
:1013E000DA01C9012F5F3F4F4F4F5F4FABBFFC0189 |
:1013F0008791F80181938F01615067FFF1CF84EEEF |
:101400008ABD898580936D05893138F086E08093A7 |
:10141000140187E0809313017BEAF7016EE081916C |
:1014200078277095615067FFFACF8889781729F07F |
:10143000F7E9DF1611F40000FECF0E940A0B0C94AE |
:101440004DA00C9400008AE891E09F938F9388E967 |
:1014500096E19F938F93E0919C05F0919D050995EE |
:101460000F900F900F900F90089580914108E82FF2 |
:10147000FF27EE0FFF1FE858F64F808191818D5EA8 |
:101480009F4F14F010920401808191818A5B9F4FDD |
:10149000CCF4809104018823A9F481E080930401B5 |
:1014A0008091D0058F5F8093D005853038F088EE2D |
:1014B00093E090931E0380931D03089566E970E006 |
:1014C0000E94243C0895CF93DF93C82F882389F08E |
:1014D00080EB91E09F938F9388E996E19F938F93A0 |
:1014E000E0919C05F0919D0509950F900F900F904C |
:1014F0000F9080912601909127016BE270E00E948D |
:10150000C09F962F9F5F9093000180916408823363 |
:1015100018F5989F802D112480930201CC23F1F0BF |
:1015200068EC70E0892F0E94243C8091000199278B |
:101530009F938F9388EB91E09F938F9388E996E137 |
:101540009F938F93E0919C05F0919D0509958DB730 |
:101550009EB706968DBF02C0809302019091AF089E |
:10156000923338F480910001899F802D112480935B |
:10157000AF088091AF0890910201981720F4915024 |
:101580009093AF089F5FCC2309F441C0892F6AE094 |
:101590000E94A09F892F99279F938F93809102018A |
:1015A0000E94A09F99279F938F9383EC91E09F9334 |
:1015B0008F93C8E9D6E1DF93CF93E0919C05F0913A |
:1015C0009D0509958DB79EB708968DBF8091AF0890 |
:1015D0008823E9F06AE00E94A09F892F99279F93B2 |
:1015E0008F938091AF080E94A09F99279F938F931C |
:1015F00087ED91E09F938F93DF93CF93E0919C05CC |
:10160000F0919D0509958DB79EB708968DBFDF9126 |
:10161000CF910895CFEFD0E4DEBFCDBF88249924C9 |
:10162000C1E07C2E14B815B88AE08AB98FE58BB971 |
:10163000B7EECB2EB3E0DB2E2EEC3FEFC20ED31E67 |
:10164000D7FEFACF6624199B08C04C9B04C085E1E5 |
:101650008093030108C086E101C089E18093030102 |
:1016600081E08093080481E887B93E9A8FEF88B9BA |
:101670008BE184B981E085B9469A84B7877F84BFBE |
:10168000809160008861809360001092600084EC1B |
:1016900099E090931E0380931D03109256041092BC |
:1016A000550410927D0910927C09109258041092F2 |
:1016B000570410925A0410925904209103012431C6 |
:1016C00028F084EC94E0A0E0B0E004C08BE095E06A |
:1016D000A0E0B0E08093420190934301A0934401C5 |
:1016E000B09345012A3011F0243110F0289801C040 |
:1016F000289A2C3010F0293111F4299A01C0299828 |
:101700000E94D21A0E94A31A0E94A0160E94A53815 |
:101710000E94E41E81E00E94B7330E9447710E943C |
:10172000797D85E00E94649B809103018C3010F0EC |
:10173000893111F4299A01C0299878940E949E3227 |
:1017400080916A03826080936A0310926D030E9405 |
:10175000314884EF91E00E94691A6C0180916A031C |
:1017600080FD05C0C6010E94721A8823B9F38CEE71 |
:1017700091E09F938F93A8E9AA2EA6E1BA2EBF927B |
:10178000AF92E0919C05F0919D05099580EA9FE05C |
:101790000E94691A6C01C0E0D0E00F900F900F908A |
:1017A0000F900AE119E0FEECEF2EF8E0FF2E0E9408 |
:1017B000314880916A0380FD05C0C6010E94721AFB |
:1017C0008823B9F3F70180811816ACF40BC00E948E |
:1017D000314880916A0380FD05C0C6010E94721ADB |
:1017E0008823B9F3C6010E94721A882321F4F801F4 |
:1017F0008081882364F7F801808187FF19C02196D2 |
:10180000DF93CF9321978EEF91E09F938F93BF92B9 |
:10181000AF92E0919C05F0919D0509958091E902B8 |
:101820008F5F8093E9022DB73EB72A5F3F4F2DBFF0 |
:10183000219684E090E0E80EF91E085F1F4FCC303F |
:10184000D10508F4B4CFC0E0D0E007E119E0EEEC38 |
:10185000EE2EE8E0FE2EF801838187FD1DC0F70122 |
:1018600080811816CCF42196DF93CF93219781E0E5 |
:1018700092E09F938F9388E996E19F938F93E091F5 |
:101880009C05F0919D05099582E080931B032DB77F |
:101890003EB72A5F3F4F2DBFF80183818078838355 |
:1018A000219624E030E0E20EF31E085F1F4FCC309B |
:1018B000D10588F20E94230A90913F088091E902A5 |
:1018C000981728F48091B60580618093B6058FE162 |
:1018D00092E09F938F93C8E9D6E1DF93CF93E09195 |
:1018E0009C05F0919D05099588EE93E00E94691A88 |
:1018F0006C010E94221F0F900F900F900F90C60155 |
:101900000E94721A8823D9F38FE392E09F938F93FA |
:10191000DF93CF93E0919C05F0919D05099580E0C0 |
:101920000E94083D809103010F900F900F900F903F |
:101930008A3011F0843110F0289801C0289A80ED87 |
:1019400097E090931E0380931D0385E58093D20555 |
:101950008EE090E00E94BE309927182F00278FE07C |
:1019600090E00E94BE30080F111D1093EF0200930B |
:10197000EE028AE090E00E94BE309927182F0027DF |
:101980008BE090E00E94BE30080F111D1093ED0215 |
:101990000093EC020F5F1F4F39F08091EE0290919F |
:1019A000EF028F5F9F4F41F41092EF021092EE0210 |
:1019B0001092ED021092EC028091EC029091ED02F7 |
:1019C0009F938F938091EE029091EF029F938F935C |
:1019D00084E492E09F938F93DF93CF93E0919C05F3 |
:1019E000F0919D0509950E94E72588E893E1909381 |
:1019F0003D0180933C01C1E0C093D1058C2F0E9432 |
:101A0000630A809167080E94B09A0E94230A80EDC1 |
:101A100097E00E94691A6C018AEF90E00E94691AAF |
:101A200083E0809399071092E8028091B2082DB765 |
:101A30003EB7285F3F4F2DBF84FF02C0C093F00226 |
:101A400012BC11BC8091F202882311F04798FECF9E |
:101A500080912103882309F4AEC280911801882364 |
:101A600009F4A9C2F8948091210381508093210345 |
:101A700078948091D005882319F00E94350A02C01D |
:101A80000E94B84B0E943148209103012A3011F086 |
:101A9000243110F0289801C0289A809149048823A5 |
:101AA00031F0809149048150809349040EC08091A7 |
:101AB0006F00806280936F0010927909109278090C |
:101AC0008091B60588608093B60580913C01909125 |
:101AD0003D01019790933D0180933C0180913C0131 |
:101AE00090913D01892B21F080916B038823C9F1EE |
:101AF00080913C0190913D01892BD9F40E94E13302 |
:101B000085E090E090933D0180933C018091D30764 |
:101B10009091D40701969093D4078093D307809136 |
:101B2000B60581608093B60580919A0782608093A4 |
:101B30009A0780910B0190910C018F5F9F4FC1F428 |
:101B4000809148048823A1F088EA91E690931E03CF |
:101B500080931D0380E890E090930C0180930B012B |
:101B600007C02A3011F0243110F0289801C0289ABB |
:101B70000E94609C80912103882309F01AC2809101 |
:101B80006805882319F00E94E58D13C28091110128 |
:101B9000882311F00E942C1B0E94E9160E947712E4 |
:101BA000C6010E94721A882309F4FFC184E190E003 |
:101BB000C80ED91E0E94EA1A80916708863019F46F |
:101BC0000E94638304C0843011F40E94B58E80911A |
:101BD0000804882331F18091E0079091E1078C524D |
:101BE000914074F08091A9079091AA07805092408B |
:101BF000C4F48091E0079091E107835593408CF005 |
:101C0000639432E3361570F480914804882331F0F0 |
:101C10008091B50580628093B50504C0809334043B |
:101C200001C0662480916B03882329F48091F10A16 |
:101C30008E3150F405C08091B60582608093B60560 |
:101C400080919A0782600FC080911D0390911E03BE |
:101C5000892B59F480913C0190913D01079728F020 |
:101C600080919A078D7F80939A078091F002882354 |
:101C700061F080914904873940F01092F00288E8C1 |
:101C800093E190931E0380931D03809106018823A6 |
:101C900021F08150809306012EC08093DC051092C4 |
:101CA0001C0410921B0410921A0410921904109232 |
:101CB000180410921704809149048823E1F480915C |
:101CC0000B0190910C018F5F9F4FA9F42091F002BE |
:101CD000223089F088E99AE390931E0380931D03D4 |
:101CE00080E09CE090930C0180930B01222319F07B |
:101CF00082E08093F0028091A401893C70F08150D1 |
:101D00008093A4018091B6058B7F8093B605809166 |
:101D1000B90581608093B90551C080917E0A8823FE |
:101D2000F9F08091B60584608093B60589E08093D0 |
:101D30002A0580910B0190910C018F5F9F4F81F4D8 |
:101D400080914804882361F088E99AE390931E0308 |
:101D500080931D0380E098EA90930C0180930B011F |
:101D600010921C0510921B0510921A05109219056D |
:101D7000109218051092710A8FEF8093E60A109264 |
:101D8000B00A1092AF0A1092B20A1092B10A8FEF05 |
:101D90009FEF9093AE0A8093AD0A10923804109290 |
:101DA000390410923A0410923B0410923C04809142 |
:101DB000B9058E7F8093B9051092A401609102014C |
:101DC000262F332780912601909127012817390764 |
:101DD000F4F08091100480628093100480910B01D4 |
:101DE00090910C018F5F9F4F91F48091260190910B |
:101DF00027010B9764F080E797E190931E0380938F |
:101E00001D0380E093E090930C0180930B0112BCC2 |
:101E100011BC8091F1028F5F8093F102813309F050 |
:101E20007BC01092F10280915205882319F08150F5 |
:101E3000809352058091100481FF0AC08091EA02CC |
:101E40009091EB0201969093EB028093EA0204C01A |
:101E50005AEA852E55E0952E809111049091120436 |
:101E60008050944008F049C02091E2073091E30788 |
:101E70004091E4075091E50780911E0190911F0168 |
:101E8000A0912001B0912101281739074A075B076B |
:101E900064F48091E2079091E307A091E407B09188 |
:101EA000E5070596A11DB11D20C02091E2073091E4 |
:101EB000E3074091E4075091E50780911E0190915E |
:101EC0001F01A0912001B091210182179307A4075F |
:101ED000B5079CF48091E2079091E307A091E40795 |
:101EE000B091E5070597A109B1098093E2079093A6 |
:101EF000E307A093E407B093E507862F992701969F |
:101F00002091260130912701821793072CF48091AC |
:101F100010048F7D809310040894811C911C82E72B |
:101F200088168BE0980609F040C0882499242091F7 |
:101F3000EE023091EF022F5F3F4F3093EF0220937C |
:101F4000EE028091EC029091ED0201969093ED02E9 |
:101F50008093EC02832F9927682F8EE090E00E94F7 |
:101F6000C6308091EE029091EF029070682F8FE062 |
:101F700090E00E94C6308091EC029091ED02892F92 |
:101F80009927682F8AE090E00E94C6308091EC0289 |
:101F90009091ED029070682F8BE090E00E94C63027 |
:101FA00084E190E00E94691A6C010E9494760E947C |
:101FB000AC7D71107A94772039F40E94587688238A |
:101FC00019F08CE0782E3ECD80911C03882309F017 |
:101FD00039CD0E94687136CD1F920F920FB60F92C5 |
:101FE00011248F939F93EF93FF938091080188238F |
:101FF000E1F480910C0390910D03019690930D03F1 |
:1020000080930C03FC01E354F94FE081ED3019F0AB |
:102010008C3D910539F410920D0310920C0381E070 |
:1020200080930801E093C60004C010920D03109243 |
:102030000C03FF91EF919F918F910F900FBE0F9026 |
:102040001F9018951F920F920FB60F9211242F9385 |
:102050003F934F935F936F937F938F939F93AF9330 |
:10206000BF93CF93EF93FF9390E08091F202813082 |
:1020700029F48091C6008093CE00D1C08091F202F5 |
:10208000823029F48091C6008093DF05C8C080911A |
:10209000C60080930403509112035C3D10F09093AE |
:1020A0001303809104038D3009F06AC080911303FB |
:1020B000823009F065C090931303852F99278152D0 |
:1020C0009A4FFC013297408120910E0330910F030B |
:1020D000241B3109DC0111978C91281B3109C9019E |
:1020E0009F7090930F0380930E0346E0969587951B |
:1020F0004A95E1F7982F935C909310032F733070FB |
:10210000235C209311038081981729F48C91281760 |
:1021100011F491E006C090E0809101038F5F8093FD |
:10212000010380910303882309F079C0992309F4FE |
:1021300076C081E080930303580F50930003515001 |
:10214000E52FFF27E152FA4F8DE080838091E10572 |
:10215000823509F064C0C0914804CC2309F05FC007 |
:102160000E94E72588E190E02CE00FB6F894A8954E |
:10217000809360000FBE20936000C0931B034FC08C |
:1021800020911303822F992781309105F9F0823035 |
:1021900091051CF4892B21F040C0029711F13DC03C |
:1021A00080910403833239F480910303882319F466 |
:1021B00081E080931303809104038093DF0581E025 |
:1021C0008093120380910403992722C02F5F2093EC |
:1021D0001303E52FFF27E152FA4F80910403808318 |
:1021E00009C0E52FFF27E152FA4F80910403808355 |
:1021F0005C3D20F45F5F5093120302C01092130302 |
:102200002091040380910E0390910F03820F911D82 |
:1022100090930F0380930E0302C010921303FF915B |
:10222000EF91CF91BF91AF919F918F917F916F91DE |
:102230005F914F913F912F910F900FBE0F901F9084 |
:102240001895AC01A0E0B0E09D01A817B90748F4CB |
:10225000EDEBF6E08191280F311D1196A417B5071B |
:10226000C8F33F70FD01E354F94FC90156E096955C |
:1022700087955A95E1F7835C80831196FD01E354BD |
:10228000F94F2F733070822F835C8083A254B94F33 |
:102290008DE08C93109208018091BD068093C6005A |
:1022A0000895A0E0B0E0E7E5F1E10C9419A02C85D9 |
:1022B0009D850E85BB2483E28093BD069F59909334 |
:1022C000BE062093BF0633E0E32EF12C002309F471 |
:1022D0009EC0CF84D888BE016D5E7F4FA989BA8920 |
:1022E0000150109709F493C01097B9F0F601EB0D67 |
:1022F000F11DB3949081119791F4002349F1FB01F2 |
:102300006E5F7F4FDB01C080D1806E5F7F4F0D908D |
:10231000BC91A02DBB24015002C090E019C01097C1 |
:10232000B9F0F601EB0DF11DB3944081119791F4D2 |
:10233000002341F1FB016E5F7F4FDB01C080D18044 |
:102340006E5F7F4F0D90BC91A02DBB24015002C049 |
:1023500040E018C01097B1F0F601EB0DF11DB394F9 |
:102360001081119781F4002371F0FB013296DB019B |
:10237000CD90DC90BF016E5F7F4FA081B181BB2407 |
:10238000015001C010E0F701E354F94F892F869501 |
:102390008695835C80830894E11CF11CF701E3546B |
:1023A000F94F892F99278370907024E0880F991F27 |
:1023B0002A95E1F755279A0194E0369527959A9545 |
:1023C000E1F7822B835C80830894E11CF11CF70108 |
:1023D000E354F94F4F705070440F551F440F551F71 |
:1023E000812F992726E0969587952A95E1F7842BEA |
:1023F000835C80830894E11CF11CF701E354F94FDE |
:102400001F73135C10830894E11CF11C6ACFC70191 |
:102410000E942111E9E00C9435A0A3E07A2F4091AD |
:1024200000034650442309F458C0E72FFF27E15228 |
:10243000FA4F80818D537F5FE72FFF27E152FA4FDC |
:1024400020812D537F5FE72FFF27E152FA4F308124 |
:102450003D537F5FE72FFF27E152FA4F60816D53B5 |
:102460007F5F9927880F991F880F991F522F5295C8 |
:102470005F70582B822F99278F709070F4E0880F2F |
:10248000991FFA95E1F7232F26952695282B832F60 |
:10249000992783709070E6E0880F991FEA95E1F71D |
:1024A000682B41504F3FC9F0EA2FFF27E152FA4F06 |
:1024B0005083AF5F41504F3F81F0EA2FFF27E15239 |
:1024C000FA4F2083AF5F41504F3F39F0EA2FFF278B |
:1024D000E152FA4F6083AF5FA5CF82EE95E0909313 |
:1024E000FF028093FE02A350A093FD020895A2E094 |
:1024F000B0E0EDE7F2E10C941FA080910303882384 |
:1025000009F412C40E940D128091E005823609F090 |
:10251000DEC28091E10599278037910509F4AFC0AB |
:1025200081379105C4F48A36910509F43BC28B3694 |
:10253000910544F48B34910571F18636910509F4C7 |
:1025400064C1C5C28D36910509F469C08E36910506 |
:1025500009F44DC0BCC28437910541F1853791051E |
:102560004CF48137910509F491C08337910509F442 |
:10257000E4C0ADC28737910509F4D6C1883791050B |
:102580002CF48537910509F492C1A1C289379105D0 |
:1025900009F477C19CC2E091FE02F091FF028081B4 |
:1025A0009181909391018093900191C28091000359 |
:1025B000A091FE02B091FF02853140F080E1EAEB8C |
:1025C000F5E00D9001928A95E1F70DC08D919D91F6 |
:1025D0000D90BC91A02D8093BA059093BB05A0935C |
:1025E000BC05B093BD0580EF8093FB024BC080918A |
:1025F00008018823E1F38DE490E09F938F9381ECB1 |
:1026000098E09F938F9381E08F938F938EE48F93C5 |
:102610000E9451118DB79EB707968DBF58C2A091E9 |
:10262000FE02B091FF021C91113081F48DE4E1ECC7 |
:10263000F8E00D9001928A95E1F70E94D931198353 |
:102640008091B6058F7E8093B60501C01982809176 |
:1026500008018823E1F381E090E09F938F93CE01FE |
:1026600001969F938F9381E08F938F938DE48F9347 |
:102670000E945111ADB7BEB71796ADBF28C281E019 |
:10268000809306038FEF8093060121C28091480456 |
:10269000882309F01CC2E091FE02F091FF02E08164 |
:1026A0008E2F8A508A3058F48983882311F481E070 |
:1026B00003C0863010F085E0898361E00EC08E2F64 |
:1026C00084518A3070F48983882311F481E003C037 |
:1026D000863010F085E0898360E089810E945B325A |
:1026E00012C0E983EF3F19F40E943C32898389814B |
:1026F000882311F481E003C0863010F085E08983DF |
:1027000089810E94DC30809108018823E1F380E810 |
:1027100090E09F938F9380E498E09F938F9381E064 |
:1027200090E09F938F93CE0101969F938F9382E0C9 |
:102730008F9381E08F9381E52DC12091FE0230912E |
:10274000FF02D9018C918150853008F045C0F90114 |
:102750008181813609F040C0809148048823E1F5E9 |
:102760002F5F3F4F80E8E0E4F8E0D9010D9001923F |
:102770008A95E1F7F90182910E944931809181089F |
:102780009927AA27BB27BC01CD0124EC39E040E002 |
:1027900050E00E94819FDC01CB01809388019093DF |
:1027A0008901A0938A01B0938B01809182089927B7 |
:1027B000AA27BB27BC01CD010E94819FDC01CB0170 |
:1027C0008093840190938501A0938601B093870143 |
:1027D0000E943C32898301C01982809108018823BC |
:1027E000E1F381E090E09F938F93CE0101969F9358 |
:1027F0008F9381E08F938F9383E58F930E94511184 |
:102800008DB79EB707968DBF2BC080914804882353 |
:1028100009F05DC1E091FE02F091FF02E0818E2F90 |
:102820008150853018F48E2F0E94DC300E943C329B |
:102830008983809108018823E1F381E090E09F93F0 |
:102840008F93CE0101969F938F9381E08F938F9307 |
:1028500086E48F930E945111ADB7BEB71796ADBFF6 |
:1028600010914804112341F46EE670E089810E94C2 |
:10287000243C812F0E94630A809167080E94B09ACD |
:1028800026C119822981A091FE02B091FF02E8E7DA |
:10289000F9E08D91992787FD909593A382A3822FCC |
:1028A0008F5F8983282F32968C3098F310C1E09186 |
:1028B000FE02F091FF0280810E94FB378A83882309 |
:1028C00019F481E0898301C019828091080188236D |
:1028D000E1F388E090E09F938F938FE099E09F93DE |
:1028E0008F9321E030E03F932F938091FE029091EF |
:1028F000FF029F938F933F932F93CE0102969F9356 |
:102900008F933F932F93CE01820F931F9F938F93AB |
:1029100084E08F9381E08F9385E58F930E9451111E |
:10292000EDB7FEB773963CC08091FD02893008F484 |
:10293000CEC02091FE023091FF022F5F3F4F88E012 |
:10294000AFE0B9E0F90101900D928A95E1F7D90164 |
:102950008E910E944E378A83882319F481E08983FF |
:1029600001C01982809108018823E1F321E030E061 |
:102970003F932F93CE0102969F938F933F932F9374 |
:10298000CE01820F931F9F938F9382E08F9381E0FC |
:102990008F9387E58F930E945111EDB7FEB73B9659 |
:1029A000EDBF95C080914804882309F090C00E9433 |
:1029B000679A8983823019F0843009F088C020E456 |
:1029C00030E0F8948091C1008F738093C1008091B2 |
:1029D000C9008F738093C9008091C100877E809366 |
:1029E000C1008091C900877E8093C9008091C80092 |
:1029F00087FF03C08091CE00F9CF8091C00087FF90 |
:102A000003C08091C600F9CFE091FE02F091FF0271 |
:102A1000E081E13021F482E08093F2022EC0E436BE |
:102A200011F421E830E081E08093F202832F9927AE |
:102A30008093CD002093CC008091CD008093C50081 |
:102A40008091CC008093C4008091CA008F7D8093D8 |
:102A5000CA008091CA008F7E8093CA008091C9000D |
:102A60008B7F8093C9008091CA0084608093CA00E4 |
:102A70008091CA0082608093CA008091CA00877FDB |
:102A80008093CA008091C200877F8093C2008091AA |
:102A9000C9008E7F8093C9008091C10088618093B6 |
:102AA000C1008091C90088618093C9008091C100F4 |
:102AB00080688093C1008091C90080688093C900BC |
:102AC00010926E0010926F001092700078948091B6 |
:102AD000E10599278436910509F4BBC08536910537 |
:102AE000ACF48136910509F46FC0823691052CF45F |
:102AF0008B34910509F45DC00FC18236910509F44C |
:102B000070C08336910509F47FC006C18C369105EB |
:102B100009F4EDC08D3691054CF48736910509F422 |
:102B2000F8C08836910509F4B2C0F6C08437910523 |
:102B300029F08637910509F4E8C0EEC080910003C2 |
:102B4000A091FE02B091FF02803140F080E1EAEBFB |
:102B5000F5E00D9001928A95E1F70DC08D919D9160 |
:102B60000D90BC91A02D8093BA059093BB05A093C6 |
:102B7000BC05B093BD05809108018823E1F31F9245 |
:102B8000809105018F9384E58F930E9451118AEF04 |
:102B90008093FB028FEF8093060180EA9FE00E9402 |
:102BA000691A9093F4028093F3020F900F900F90A4 |
:102BB000B3C0E091FE02F091FF0280819181909379 |
:102BC000910180939001A8C0E091FE02F091FF0274 |
:102BD000808180930701803298F08FE18093070114 |
:102BE0000FC0A091FE02B091FF028BE0E2EDF5E094 |
:102BF0000D9001928A95E1F78091DB058093DB07C8 |
:102C00008FEF8093060188C08091F7029091F802BF |
:102C1000892B89F4E091FE02F091FF02E081EE231E |
:102C200051F08AE0E89FC00111240E94691A909334 |
:102C3000AD058093AC05E091FE02F091FF0290811A |
:102C40008AE0989FC00111249093F8028093F702C4 |
:102C500015C08FEF80930601E091FE02F091FF0214 |
:102C600090818AE0989FC00111249093FA0280938A |
:102C7000F902892B19F081E08093080380EA9FE034 |
:102C80000E94691A9093F4028093F30245C08FEF7B |
:102C900080930601E091FE02F091FF02908197FD82 |
:102CA00008C082E0809305031092F6021092F502AC |
:102CB0001AC0909580916303892B8093630391815F |
:102CC0008AE0989FC00111249093F6028093F50248 |
:102CD00084E08093050380EA9FE00E94691A909344 |
:102CE000F4028093F30281E08093090315C08FEF13 |
:102CF00080930601E091FE02F091FF0280818093B3 |
:102D0000640381E080930A0307C081E08093070396 |
:102D100003C081E080930B03109203031092FF0223 |
:102D20001092FE021092FD02E3E0CE5F0C943BA0F5 |
:102D3000982F8091C00085FFFCCF9093C600089526 |
:102D40000F931F9388E18093C1008091C00082603F |
:102D50008093C0008091C10080688093C100809101 |
:102D6000C10080648093C10000E010E00093C500C2 |
:102D70008AE290E08093C4008091F9029091FA0277 |
:102D80000E94691A9093AF058093AE058CED90E098 |
:102D90000E94691A9093DE058093DD0582E080939E |
:102DA000B0058093B1051092B4058BE08093B20515 |
:102DB0001092B3051092B805809103018093B70576 |
:102DC0001093FF020093FE021092FD021F910F91DB |
:102DD0000895A0E1B0E0EFEEF6E10C941EA0809122 |
:102DE0000801882309F489C28091F3029091F402CA |
:102DF0000E94721A882361F01092F6021092F50276 |
:102E00001092FA021092F9021092F8021092F70250 |
:102E10008091F5029091F602892B41F08091BB06DA |
:102E20009091BC060E94721A882329F480910903AC |
:102E3000882309F460C080910801882309F45BC0ED |
:102E4000809105030FEE17E08430A8F00E94FD2565 |
:102E500080E590E09F938F931F930F9381E08F9372 |
:102E60008F9388E48F930E9451112DB73EB7295F4D |
:102E70003F4F2DBF34C01092650386E694E09F93C8 |
:102E80008F9380EF95E29F938F93E0919C05F09153 |
:102E90009D05099584E190E09F938F931F930F9375 |
:102EA00081E090E09F938F9385E093E09F938F93D1 |
:102EB00082E08F9381E08F9388E48F930E94511179 |
:102EC00080910503982F8F5F809305032DB73EB740 |
:102ED000215F3F4F2DBF943010F010920503809179 |
:102EE000F5029091F6020E94691A9093BC068093B5 |
:102EF000BB061092090380910A03882351F1809147 |
:102F00000801882331F10E94FD2580E590E09F9320 |
:102F10008F938FEE97E09F938F9321E030E03F9364 |
:102F20002F9388E291E09F938F933F932F9384E6B2 |
:102F300093E09F938F9383E08F9381E08F938CE452 |
:102F40008F930E94511110920A038DB79EB70F966E |
:102F50008DBF809107038823D1F0809108018823D9 |
:102F6000B1F08AE090E09F938F9380EB95E09F9380 |
:102F70008F9381E08F938F9386E58F930E945111F9 |
:102F8000109207032DB73EB7295F3F4F2DBF8091A9 |
:102F90000B038823D9F0809108018823B9F08BE0D6 |
:102FA00090E09F938F9382ED95E09F938F9381E0C4 |
:102FB0008F93809105018F9387E48F930E94511125 |
:102FC00010920B038DB79EB707968DBF8091F902C3 |
:102FD0009091FA02892B41F08091AE059091AF0556 |
:102FE0000E94721A882321F480910803882341F1FA |
:102FF00080910801882321F10E942E3B82E490E019 |
:103000009F938F9389E997E09F938F9381E08F93AC |
:103010008F9384E48F930E945111109208032DB76F |
:103020003EB7295F3F4F2DBF8091F9029091FA0280 |
:10303000009731F00E94691A9093AF058093AE0516 |
:103040008091F7029091F802892B09F497C0809142 |
:10305000AC059091AD050E94721A882309F48EC0C8 |
:1030600080910801882309F489C08091840A909195 |
:10307000850A90939F0580939E058091860A909182 |
:10308000870A9093A1058093A0052091660A30914C |
:10309000670A4091680A5091690ADA01C90163E040 |
:1030A000880F991FAA1FBB1F6A95D1F7820F931F24 |
:1030B000A41FB51F820F931FA41FB51F20914201AB |
:1030C000309143014091440150914501BC01CD0133 |
:1030D0000E94F59F3093A3052093A20580916B0475 |
:1030E00090916C04A0916D04B0916E0449E0B59587 |
:1030F000A795979587954A95D1F78093A4058091D8 |
:10310000670490916804A0916904B0916A0439E061 |
:10311000B595A795979587953A95D1F78093A5058D |
:103120008091730490917404A0917504B091760419 |
:1031300029E0B595A795979587952A95D1F780931E |
:10314000A6058EE090E09F938F938EE995E09F9384 |
:103150008F9381E08F938F9383E48F930E9451111B |
:103160008091F7029091F8020E94691A9093AD0540 |
:103170008093AC058DB79EB707968DBF80910701F0 |
:103180008F3F79F1992704E0880F991F0A95E1F79D |
:103190008A599D4F40E150E0BC01CE0101960E944A |
:1031A000CB9D80E190E09F938F93CE0101969F93FA |
:1031B0008F9381E090E09F938F9387E091E09F93BE |
:1031C0008F9382E08F9381E08F9381E48F930E94AD |
:1031D00051118FEF809307012DB73EB7255F3F4F09 |
:1031E0002DBF8091DB078823C9F0809108018823D7 |
:1031F000A9F081E090E09F938F938BED97E09F93F0 |
:103200008F9381E08F938F9382E48F930E9451116B |
:103210001092DB078DB79EB707968DBF809106038E |
:103220008823D1F0809108018823B1F086E490E0F2 |
:103230009F938F9388E799E09F938F9381E08F937B |
:103240008F9380E58F930E945111109206032DB742 |
:103250003EB7295F3F4F2DBF8091DD059091DE0580 |
:103260000E94721A882309F448C0809108018823BB |
:1032700009F443C08091840A9091850A9093CB050C |
:103280008093CA058091860A9091870A9093CD0514 |
:103290008093CC05809125048093CE0580912404F1 |
:1032A0008093CF0588E090E09F938F938AEC95E020 |
:1032B0009F938F9381E08F9383E08F938BE68F931F |
:1032C0000E9451118091D0052DB73EB7295F3F4F25 |
:1032D0002DBF853018F086E08093D0058091A40141 |
:1032E000882319F483E690E002C087EE93E00E9401 |
:1032F000691A9093DE058093DD05E4E0C05F0C94CD |
:103300003AA01F920F920FB60F9211242F933F9362 |
:103310005F936F937F938F939F93AF93BF93EF933D |
:10332000FF9380911C03882329F080911C03815016 |
:1033300080931C0380913D05882319F08150809370 |
:103340003D05809124038150809324038F3F09F031 |
:1033500051C089E08093240380912203909123033C |
:1033600001969093230380932203809112018F5F33 |
:10337000817080931201882349F480912103843065 |
:1033800028F4809121038F5F80932103349903C037 |
:1033900081E080931A0380911D0390911E03892B75 |
:1033A00011F180911D0390911E030B9750F08091B5 |
:1033B0001D0390911E030A9790931E0380931D0393 |
:1033C00004C010921E0310921D0380911D03909162 |
:1033D0001E0320910B0130910C0182239323892B32 |
:1033E00041F0479A07C08FEF9FEF90930C018093B5 |
:1033F0000B01479880911A03882309F45AC0209141 |
:10340000A401222309F055C08091560A83FF51C0C0 |
:1034100086B19927FC01E071F07084FF13C08091A0 |
:103420001F039091200301969093200380931F0324 |
:1034300080911F0390912003895E9340D0F12093E7 |
:103440001A0337C080911F0390912003892B69F1E3 |
:1034500080911F03909120038A56914030F580910E |
:103460001F039091200369E270E00E94AC9F80915D |
:103470001F0390912003860F971F90932003809342 |
:103480001F0380911F03909120030B9750F08091B0 |
:103490001F03909120030A979093910180939001CC |
:1034A00004C0F0939101E0939001109220031092D8 |
:1034B0001F03FF91EF91BF91AF919F918F917F91EA |
:1034C0006F915F913F912F910F900FBE0F901F90C2 |
:1034D00018952091220330912303280F391FC90129 |
:1034E000019608952091220330912303821B930BB0 |
:1034F000892F99278695807490700895CF93DF93D4 |
:103500000E94691AEC01CE010E94721A8823D9F335 |
:10351000DF91CF910895CF93DF930E94691AEC0158 |
:1035200009C080911801882329F0909318018FEC2D |
:1035300080937A00CE010E94721A982F882389F313 |
:10354000DF91CF9108959FB7F8945F983E9A469A7D |
:103550008091B0008F708093B0008091B000836044 |
:103560008093B0008091B1008B738093B100809103 |
:10357000B1008B608093B1001092B2008FEF809306 |
:10358000B3008091B00080688093B000809170009B |
:103590008A7F8093700080917000826080937000B9 |
:1035A0009FBF08958AE090E00E94691A9093DD071A |
:1035B0008093DC0782E085BD83EB84BD8FEF88BDFF |
:1035C00084EB87BD86E086BD80916E00816080932C |
:1035D0006E0008958091B10820916F0182FF30C084 |
:1035E000909170088CE3989FB001112490916F081E |
:1035F00080E5989FA0011124922F905897FD9D5F20 |
:103600009595959586E09802C001112420910901B5 |
:1036100030910A01281B390B30930A0120930901CC |
:10362000421753072CF050930A0140930901089563 |
:103630002617370784F070930A01609309010895F3 |
:10364000822F992736E0880F991F3A95E1F79093DA |
:103650000A01809309010895EF92FF920F931F933F |
:10366000CF93DF9380917708E82FFF27E85BFE4F29 |
:103670009681C08180911101813009F026C180912D |
:10368000B30887FF05C0C0E0D0E0E0E0F0E046C04E |
:10369000892F992787FD9095A92FB92F2091A304F1 |
:1036A0003091A4044091A5045091A604BC01CD0121 |
:1036B0000E94819F97FF04C061587F4F8F4F9F4F9B |
:1036C0007B018C0187E015950795F794E7948A951F |
:1036D000D1F78C2F992787FD9095A92FB92F20918D |
:1036E0009B0430919C0440919D0450919E04BC0128 |
:1036F000CD010E94819F97FF04C061587F4F8F4F7B |
:103700009F4FB7E09595879577956795BA95D1F7CF |
:10371000F801E701C61BD70BE80BF90B2091230535 |
:1037200030912405C901A3E0880F991FAA95E1F7FC |
:10373000821B930BAA2797FDA095BA2FC81BD90B04 |
:10374000EA0BFB0B80916D019927AA27BB27BC01CF |
:10375000CD019E01AF010E94819F97FF04C061507F |
:103760007E4F8F4F9F4FFC01EB0179E0F595E79578 |
:10377000D795C7957A95D1F71091B1086091090155 |
:1037800070910A0112FF05C07093100160930F0140 |
:1037900018C040910F015091100180917608282F98 |
:1037A0003327CB01841B950BB9010E94C09F8091E8 |
:1037B0000F0190911001860F971F90931001809335 |
:1037C0000F0110FF14C080910F019091100197FD1F |
:1037D0000F9664E0959587956A95E1F7AA2797FD7E |
:1037E000A095BA2FC80FD91FEA1FFB1F15C08091E3 |
:1037F0000F019091100197FD0F9654E095958795D4 |
:103800005A95E1F7AA2797FDA095BA2F8C1B9D0B1F |
:10381000AE0BBF0BFD01EC012091AA08222321F180 |
:1038200033278091160390911703829FA001839FF5 |
:10383000500D929F500D1124CA01AA2797FDA09503 |
:10384000BA2F8C0F9D1FAE1FBF1F2F5F3F4F442706 |
:1038500037FD4095542FBC01CD010E94F59F309358 |
:1038600017032093160304C0D0931703C0931603C5 |
:1038700080916F08282F3327220F331F220F331F09 |
:103880008091160390911703821793077CF0809123 |
:103890007008282F3327220F331F220F331F8091E8 |
:1038A0001603909117032817390724F43093170350 |
:1038B0002093160380910301843108F4FDC08091A8 |
:1038C00011018F5F80931101F9C0892F992787FD1E |
:1038D0009095A92FB92F20919B0430919C04409181 |
:1038E0009D0450919E04BC01CD010E94819F97FFD1 |
:1038F00004C061587F4F8F4F9F4F7B018C0187E041 |
:1039000015950795F794E7948A95D1F78C2F992709 |
:1039100087FD9095A92FB92F2091A3043091A4047D |
:103920004091A5045091A604BC01CD010E94819F45 |
:103930009B01AC0197FF04C021583F4F4F4F5F4F91 |
:10394000C7E05595479537952795CA95D1F72E0D20 |
:103950003F1D401F511F80916C019927AA27BB274B |
:10396000BC01CD010E94819F97FF04C061507E4F32 |
:103970008F4F9F4FFC01EB01B9E0F595E795D79587 |
:10398000C795BA95D1F780916E019927A6E0880F67 |
:10399000991FAA95E1F740910D0150910E012091D8 |
:1039A00076083327841B950BB9010E94C09F809134 |
:1039B0000D0190910E01860F971F90930E01809339 |
:1039C0000D018091B10881FF14C080910D0190918B |
:1039D0000E0197FD0F9674E0959587957A95E1F71E |
:1039E000AA2797FDA095BA2FC80FD91FEA1FFB1F62 |
:1039F00015C080910D0190910E0197FD0F9664E026 |
:103A0000959587956A95E1F7AA2797FDA095BA2F16 |
:103A10008C1B9D0BAE0BBF0BFD01EC012091AB0885 |
:103A2000222321F133278091140390911503829F63 |
:103A3000A001839F500D929F500D1124CA01AA2707 |
:103A400097FDA095BA2F8C0F9D1FAE1FBF1F2F5F34 |
:103A50003F4F442737FD4095542FBC01CD010E94B4 |
:103A6000F59F309315032093140304C0D0931503DE |
:103A7000C093140380917308282F3327220F331F1C |
:103A8000220F331F8091140390911503821793071F |
:103A90007CF080917408282F3327220F331F220FC8 |
:103AA000331F80911403909115032817390724F4CC |
:103AB000309315032093140310921101E6E0CDB763 |
:103AC000DEB70C9438A01F920F920FB60F921124FC |
:103AD0002F933F934F935F938F939F93EF93FF9316 |
:103AE0008091030190912503843108F04CC0992303 |
:103AF00009F029C18091B00086FF24C08091B000F8 |
:103B00008F7B8093B00080911603909117038755A7 |
:103B10009E4F909319038093180325E08D3D9207E3 |
:103B200018F08CED95E005C08757914030F487E799 |
:103B300091E090931903809318038091180390915A |
:103B40001903C2C08091B00080648093B00080915E |
:103B50007508282F33278DED96E0289FA001299F17 |
:103B6000500D389F500D1124CA0120912603309129 |
:103B70002703821B930B909319038093180381E012 |
:103B800080931101DDC0992309F0DDC08091B00060 |
:103B900086FF9FC08091B0008F7B8093B000E09142 |
:103BA000280320917508EE23D9F433278DED96E094 |
:103BB000289FA001299F500D389F500D1124CA0144 |
:103BC0002091260330912703821B930B90931903B6 |
:103BD000809318031092270310922603469AB0C0D0 |
:103BE0002E1738F48AE090E090931903809318031D |
:103BF000A7C089EA93E090931903809318038E2F4E |
:103C0000992783309105D9F08430910534F48130BF |
:103C1000910549F0029761F020C08430910591F040 |
:103C2000059799F01AC0809116039091170304C06C |
:103C3000809114039091150387559E4F1DC080916C |
:103C4000310A05C080910A0A02C080913A0A992778 |
:103C5000880F991F880F991FEFCFFF27EE0FFF1FC7 |
:103C6000E858F64F20813181220F331F80911803CD |
:103C700090911903820F931F909319038093180357 |
:103C8000809118039091190355E08D3D950718F028 |
:103C90008CED95E005C08757914030F487E791E0BF |
:103CA00090931903809318032091180330911903FE |
:103CB0002C5B304030931903209318038091260326 |
:103CC00090912703820F931F9093270380932603DD |
:103CD00037C08091B00080648093B0008CEB90E09E |
:103CE00090931903809318038091260390912703E2 |
:103CF00084549F4F909327038093260380911B0346 |
:103D0000882321F080914904882321F480911B03AA |
:103D1000823011F4469801C0469A809128038F5F43 |
:103D200080932803282F33278091750899270196BF |
:103D3000821793072CF481E08093110110922803DD |
:103D400081E080932503209118033091190341E00D |
:103D50002F37340730F08FEF8093B3002F5F304060 |
:103D60000FC02F3F3105C9F0C0F0A9014F5F50408F |
:103D70004F37510550F480E88093B300205830400D |
:103D8000309319032093180312C08FEF8093B30070 |
:103D900050931903409318030AC08091180380932D |
:103DA000B300109219031092180310922503FF918B |
:103DB000EF919F918F915F914F913F912F910F9034 |
:103DC0000FBE0F901F90189510927C008FEC80937F |
:103DD0007A0008958091080460911601709117018E |
:103DE00020913503882379F0CB01AA27BB273327FD |
:103DF00027FD3095432F532FBC01CD010E94819F99 |
:103E0000DC01CB0116C084E0660F771F8A95E1F7CD |
:103E1000CB01AA27BB27332727FD3095432F532FEC |
:103E2000BC01CD010E94819FDC01CB010497A10957 |
:103E3000B10980932D0390932E03A0932F03B09389 |
:103E400030030895CF93DF93109235030E94EA1E4A |
:103E500083E090E00E94BE30C82FDD27C03FD1052F |
:103E600008F42A96C7BD8C2F809588BD86E990E01E |
:103E70000E948B1A80911C0190911D0181529340E8 |
:103E800010F0C0EFD0E0C630D10510F1C7BD8C2FC7 |
:103E9000809588BD84E690E00E948B1A8BE794E0C1 |
:103EA0009F938F9388E996E19F938F93E0919C0570 |
:103EB000F0919D05099580911C0190911D010F9035 |
:103EC0000F900F900F908152934010F42197DBCF09 |
:103ED000C093EC076C2F83E090E00E94C630809185 |
:103EE0004D0880FF0AC08091EC078A508C3D28F075 |
:103EF0008091B50580648093B50580E180931501BC |
:103F0000809108048823E9F080910301873150F4FF |
:103F1000CC38D105B0F480EA90E08C1B9D0B6AE1AF |
:103F200070E009C0CA3AD10560F48CEB90E08C1BBC |
:103F30009D0B63E170E00E94AC9FCB01805F80939A |
:103F4000150180911501282F332780911C01909134 |
:103F50001D01829FA001839F500D929F500D11243F |
:103F6000CA01AA27BB2780931E0190931F01A0932B |
:103F70002001B09321018CE291E00E948B1ADF9125 |
:103F8000CF910895EF92FF921F93CF9310E080EDB1 |
:103F900097E00E94691A7C01CCE8133019F4CB3009 |
:103FA00008F0C9E010E080914403909145038C5FD4 |
:103FB000934024F480911B0181500AC080914403F6 |
:103FC000909145038750944034F080911B018F5F9E |
:103FD00080931B0101C011E0809142039091430343 |
:103FE0008C5F934024F480911A0181500AC0809123 |
:103FF0004203909143038750944034F080911A011A |
:104000008F5F80931A0101C01F5F809140039091E0 |
:1040100041038C5F934024F48091190181500AC0C0 |
:10402000809140039091410387509440C4F0809167 |
:1040300019018F5F8093190113C08DE794E09F935E |
:104040008F9388E996E19F938F93E0919C05F0917F |
:104050009D0509950F900F900F900F905FC01F5F07 |
:1040600082E18093700380916A038E7F80936A035C |
:1040700085EA8093BC0080911B018A3040F48091D6 |
:10408000B50581608093B5058AE080931B0180911E |
:104090001B01863F40F08091B50581608093B50596 |
:1040A00085EF80931B0180911A018A3040F4809142 |
:1040B000B50582608093B5058AE080931A018091EE |
:1040C0001A01863F40F08091B50582608093B50566 |
:1040D00085EF80931A01809119018A3040F4809114 |
:1040E000B50584608093B5058AE0809319018091BD |
:1040F0001901863F40F08091B50584608093B50535 |
:1041000085EF8093190180917003882339F0C701EE |
:104110000E94721A882309F090CFF5CF10921801EF |
:104120008FEC80937A00809118018823E1F3CA30E4 |
:1041300020F48AE090E00E948B1AC15009F02DCF44 |
:1041400086E490E00E948B1ACF911F91FF90EF9030 |
:1041500008951F920F920FB60F921124EF92FF92C3 |
:104160000F931F932F933F934F935F936F937F937F |
:104170008F939F93AF93BF93CF93DF93EF93FF936F |
:1041800080914D03282F3327442755278F5F809335 |
:104190004D03F9012231310508F0F2C4EA5BFF4F0B |
:1041A0000C9447A0809178009091790046C080914E |
:1041B000780090917900B8C1809178009091790051 |
:1041C0009093510380935003E3C18091AD0490918B |
:1041D000AE042091780030917900821B930B90936C |
:1041E000DF078093DE078091DE079091DF079093D1 |
:1041F0005B0380935A03EBC1809178009091790022 |
:104200002091AF043091B004821B930B9093EB0785 |
:104210008093EA078091EA079091EB0790935D0302 |
:1042200080935C03AFC48091540390915503209117 |
:10423000780030917900820F931F909355038093FB |
:10424000540381E0A0C480915203909153032091C4 |
:10425000780030917900820F931F909353038093DD |
:10426000520384E090C48091B20883FF1AC0809109 |
:104270002601909127019C01220F331F280F391F1F |
:1042800040917800509179008BE090E0489FB00118 |
:10429000499F700D589F700D1124CB016EE170E0A5 |
:1042A0000FC080912601909127019C01220F331F9E |
:1042B000280F391F809178009091790063E070E0B9 |
:1042C0000E94AC9F260F371F369527953695279568 |
:1042D000309327012093260185E055C48091780012 |
:1042E000909179009093E1078093E0078091E00737 |
:1042F0009091E1074091A9045091AA04841B950B69 |
:104300006091A804262F332727FD3095821B930B3D |
:1043100090933B0380933A0380910804882309F02B |
:1043200071C080913A0390913B0302977CF172E057 |
:104330004E3E57070CF0A7C020914E0330914F031B |
:104340002B5F3F4F30934F0320934E032550304057 |
:104350008091110490911204845F914030F4215FA8 |
:104360003F4F30934F0320934E0380914E03909123 |
:104370004F03853691050CF486C04F5F5F4F509315 |
:10438000AA044093A9048456904037C080913A0310 |
:1043900090913B038F5F9F4F0CF075C082E04732D6 |
:1043A00058070CF470C020914E0330914F032550F4 |
:1043B000304030934F0320934E032B5F3F4F80914B |
:1043C000110490911204845F914030F42F503040DA |
:1043D00030934F0320934E0380914E0390914F03EF |
:1043E0007FEF8C3997070CF04EC0415050405093EE |
:1043F000AA044093A9048C599F4F90934F03809334 |
:104400004E0341C08091260A9091270A8F5C9F41FC |
:10441000D4F180913A0390913B030297ACF0209144 |
:104420004E0330914F03C901019690934F0380933F |
:104430004E03895893413CF166301CF46F5F6093E2 |
:10444000A804275833411BC080913A0390913B0345 |
:104450008F5F9F4FC4F420914E0330914F03C901E9 |
:10446000019790934F0380934E0388579C4E5CF4C2 |
:104470006B3F1CF061506093A80429573C4E309369 |
:104480004F0320934E0380913A0390913B039C018C |
:10449000442737FD4095542F809163049091640424 |
:1044A000A0916504B0916604820F931FA41FB51FED |
:1044B0008093630490936404A0936504B0936604AE |
:1044C0002091630430916404409165045091660426 |
:1044D00057FF04C021503C4F4F4F5F4F6AE0559546 |
:1044E0004795379527956A95D1F780916304909108 |
:1044F0006404A0916504B0916604821B930BA40B25 |
:10450000B50B8093630490936404A0936504B09307 |
:10451000660430C18091520390915303209178003A |
:1045200030917900820F931F90935303809352032D |
:1045300010924C032AC3809103018A3071F4809158 |
:104540007800909179002091500330915103820FAF |
:10455000931F01969695879517C0409150035091EF |
:104560005103843158F02091780030917900240F64 |
:10457000351F8FEF97E0821B930B06C08091780068 |
:1045800090917900840F951F90934103809340038D |
:1045900080911401F8C28091AD049091AE042091F5 |
:1045A000780030917900821B930B9093DF07809302 |
:1045B000DE078091DE079091DF0720915A0330914A |
:1045C0005B03820F931F90933F0380933E03809180 |
:1045D0001301D9C280917800909179002091AF04A5 |
:1045E0003091B004821B930B9093EB078093EA0702 |
:1045F0008091EA079091EB0720915C0330915D0375 |
:10460000820F931F90933D0380933C03BBC2209184 |
:104610005403309155038091780090917900280FD0 |
:10462000391F3093550320935403809103018A303E |
:1046300019F4220F331F04C0220F331F220F331F20 |
:104640003093550320935403209154033091550324 |
:10465000C90137FD079603E0959587950A95E1F71F |
:1046600090934503809344038091560390915703A0 |
:10467000820F931F97FD0196959587959093570309 |
:10468000809356032091B9043091BA04821B930B96 |
:10469000909325018093240120914A0330914B038C |
:1046A0008091240190912501280F391F37FF02C006 |
:1046B0002F5F3F4F3595279530934B0320934A0347 |
:1046C000C0CD209152033091530380917800909196 |
:1046D0007900280F391F30935303209352038091A0 |
:1046E00003018A3019F4220F331F04C0220F331F35 |
:1046F000220F331F30935303209352032091520310 |
:1047000030915303C90137FD0796A3E0959587952E |
:10471000AA95E1F790934303809342038091580355 |
:1047200090915903820F931F97FD01969595879558 |
:1047300090935903809358032091B7043091B804A3 |
:10474000821B930B909323018093220120914803B5 |
:10475000309149038091220190912301280F391F44 |
:1047600037FF02C02F5F3F4F3595279530934903A0 |
:104770002093480383E007C280910804882309F14D |
:1047800080E00E94E8989B01AC0120503F4F4F4FC2 |
:104790005F4F57FF06C09B01AC0121503D4F4F4F6B |
:1047A0005F4F79E055954795379527957A95D1F7DD |
:1047B0002093290330932A0340932B0350932C0317 |
:1047C00010C08091430490914404A0914504B0919D |
:1047D00046048093290390932A03A0932B03B0935C |
:1047E0002C0310924D0381E08093180180913103D6 |
:1047F000909132030196909332038093310380911C |
:1048000078009091790090931D0180931C01809114 |
:104810000804882309F472C080911C0190911D0145 |
:104820007C010027112780912D0390912E03A091E8 |
:104830002F03B0913003E81AF90A0A0B1B0BE09220 |
:104840005E03F0925F030093600310936103809115 |
:104850001501282F33274427552780911E01909159 |
:104860001F01A0912001B0912101BC01CD010E9446 |
:10487000F59F80911E0190911F01A0912001B091A0 |
:104880002101821B930BA40BB50B80931E01909307 |
:104890001F01A0932001B093210180911E019091EE |
:1048A0001F01A0912001B09121018E0D9F1DA01F1D |
:1048B000B11F80931E0190931F01A0932001B0931C |
:1048C00021018091E2079091E307A091E407B09164 |
:1048D000E50720911E0130911F0140912001509168 |
:1048E0002101821B930BA40BB50B8093430490937F |
:1048F0004404A0934504B093460444C180911C0134 |
:1049000090911D01AA27BB27C0915E03D0915F0340 |
:10491000E0916003F0916103C80FD91FEA1FFB1FEC |
:10492000C0935E03D0935F03E0936003F093610351 |
:10493000809162038F5F80936203803108F422C10B |
:1049400080911E0190911F01A0912001B091210141 |
:104950009C01AD0163E0220F331F441F551F6A9570 |
:10496000D1F7281B390B4A0B5B0B2C0F3D1F4E1F39 |
:104970005F1F80912D0390912E03A0912F03B09182 |
:104980003003281B390B4A0B5B0B57FF04C0295F10 |
:104990003F4F4F4F5F4F03E055954795379527950C |
:1049A0000A95D1F720931E0130931F0140932001F7 |
:1049B00050932101C091E207D091E307E091E40711 |
:1049C000F091E50780911E0190911F01A0912001B7 |
:1049D000B0912101C81BD90BEA0BFB0BC093430418 |
:1049E000D0934404E0934504F093460420913603A9 |
:1049F00030913703409138035091390357FF04C079 |
:104A0000215F3F4F4F4F5F4F14E0559547953795C6 |
:104A100027951A95D1F78091360390913703A0918D |
:104A20003803B0913903821B930BA40BB50B809311 |
:104A3000360390933703A0933803B09339038091E2 |
:104A4000360390913703A0913803B09139038C0F4E |
:104A50009D1FAE1FBF1F8093360390933703A09313 |
:104A60003803B09339038091360390913703A091B6 |
:104A70003803B0913903B7FF03C00F96A11DB11DD4 |
:104A8000C4E0B595A79597958795CA95D1F72091DC |
:104A9000430430914404281B390B64E0213036076D |
:104AA0001CF020E034E006C07CEF2030370714F41F |
:104AB00020E03CEF809133039091340380913303E5 |
:104AC0009091340397FF03C0909581959F4FA90162 |
:104AD000F3E0440F551FFA95E1F78D5B9240C4F067 |
:104AE00080913303909134039C01E4E0220F331F43 |
:104AF000EA95E1F7281B390B240F351F37FF02C059 |
:104B0000215F3F4F74E0359527957A95E1F717C0FF |
:104B100080913303909134039C0165E0220F331F91 |
:104B20006A95E1F7281B390B240F351F37FF02C0A8 |
:104B3000215E3F4F45E0359527954A95E1F7309343 |
:104B400034032093330380915E0390915F03A0911F |
:104B50006003B0916103B7FF03C00196A11DB11DB1 |
:104B6000B595A7959795879580935E0390935F037E |
:104B7000A0936003B093610388E08093620302C056 |
:104B800010924D0382E080934C0380914C038093FC |
:104B90007C0080914D03882319F08FEC80937A007C |
:104BA000FF91EF91DF91CF91BF91AF919F918F9145 |
:104BB0007F916F915F914F913F912F911F910F9135 |
:104BC000FF90EF900F900FBE0F901F90189590E2FE |
:104BD000EFEEF7E08FE49193815087FFFCCF0895CB |
:104BE00090916503903540F4E92FFF27E151F84F8C |
:104BF00080839F5F909365030895A0E0B0E0E3E0B9 |
:104C0000F6E20C941AA02091630320FF0AC0809161 |
:104C10006403882311F0815002C0809128018093A1 |
:104C2000640321FF0CC090916403809128019817C0 |
:104C300019F41092640303C09F5F90936403822F62 |
:104C4000992780FF04C081FF02C0109264030E9474 |
:104C5000E72580916403282F332700EF15E2C091E8 |
:104C60009C05D0919D058A3098F481E1809365037D |
:104C70003F932F9384EB94E09F938F931F930F9315 |
:104C8000FE0109952DB73EB72A5F3F4F2DBF12C0D9 |
:104C900080E1809365033F932F9389EB94E09F938A |
:104CA0008F931F930F93FE0109954DB75EB74A5F2F |
:104CB0005F4F4DBF20916403822F9927AA27BB27FE |
:104CC000FC01429710F00C94982EE85AFF4F00EF29 |
:104CD00015E2C0919C05D0919D050C9447A01092BF |
:104CE00065038EEB94E09F938F9350EFE52E55E292 |
:104CF000F52E1F930F93FE01099584E180936503C0 |
:104D00000F900F900F900F9081E690E09F938F93FC |
:104D100082E090E09F938F939F938F938091030104 |
:104D20006AE00E94A09F892F99279F938F9380917B |
:104D300003010E94A09F99279F938F938EEC94E08C |
:104D40009F938F931F930F93E0919C05F0919D0586 |
:104D5000099588E2809365038DB79EB70E968DBF47 |
:104D600082EC98E09F938F938091010199279F9304 |
:104D70008F9386EE94E09F938F931F930F93E09110 |
:104D80009C05F0919D0509958091B6059927EDB791 |
:104D9000FEB73896EDBFEC01C071D07084FF0AC039 |
:104DA0008CE38093650384EF94E09F938F931F932C |
:104DB0000F9353C790912A05992351F18CE3809367 |
:104DC0006503892F99279F938F9381E095E09F93A7 |
:104DD0008F93FF92EF92E0919C05F0919D050995CC |
:104DE000DF93CF9390912A0581E1989FC001112410 |
:104DF000825B944F9F938F93FF92EF92E0919C057B |
:104E0000F0919D0509952DB73EB7245F3F4F77C4BC |
:104E10009091B505992371F08CE380936503892FF8 |
:104E200099279F938F9389E095E09F938F93FF92AB |
:104E3000EF9204C490916B039923B9F08CE38093B3 |
:104E40006503892F99279F938F9380E295E09F9325 |
:104E50008F93FF92EF92E0919C05F0919D0509954B |
:104E60008DB79EB706968DBF6CC780913C0190911F |
:104E70003D01069730F48CE38093650386E395E06B |
:104E8000E8C69091F10A9E3108F05BC78CE38093ED |
:104E90006503892F99279F938F9383E495E00AC137 |
:104EA000109265038091430490914404A0914504BD |
:104EB000B0914604BC01CD0125E030E040E050E077 |
:104EC0000E94F59F3F932F9387E595E09F938F93E3 |
:104ED0001F930F93FE01099584E1809365032DB71D |
:104EE0003EB72A5F3F4F2DBF80913F049091400411 |
:104EF000A0914104B0914204BC01CD0125E030E015 |
:104F000040E050E00E94F59F3F932F9384E695E0A8 |
:104F10009F938F931F930F93E0919C05F0919D05B4 |
:104F2000099588E2809365034DB75EB74A5F5F4F8E |
:104F30004DBF80911C0190911D019F938F9381E73C |
:104F400095E09F938F931F930F93E0919C05F091B1 |
:104F50009D0509958CE3809365038DB79EB70696F2 |
:104F60008DBF87B599279F938F938EE795E09F9389 |
:104F70008F931F930F93E0919C05F0919D050995E8 |
:104F8000EDB7FEB73696EDBF80910804882309F48B |
:104F9000D8C689E3809365038BE895E09F938F9350 |
:104FA0001F930F93E0919C05F0919D0509958DE469 |
:104FB000809365030F900F900F900F9080911501D3 |
:104FC00099279F938F938FE895E08CC31092650388 |
:104FD00082E995E09F938F9340EFE42E45E2F42E13 |
:104FE0001F930F93FE01099584E1809365030F9051 |
:104FF0000F900F900F908091A3049091A404A09122 |
:10500000A504B091A604B7FF04C081509C4FAF4FD8 |
:10501000BF4F3AE0B595A795979587953A95D1F703 |
:10502000BF93AF939F938F938FE995E09F938F9357 |
:10503000FF92EF92E0919C05F0919D05099588E221 |
:10504000809365034DB75EB7485F5F4F4DBF80915A |
:105050009B0490919C04A0919D04B0919E04B7FF85 |
:1050600004C081509C4FAF4FBF4F2AE0B595A79524 |
:10507000979587952A95D1F7BF93AF939F938F9379 |
:105080008EEA95E09F938F93FF92EF92E0919C05BB |
:10509000F0919D0509958CE3809365038DB79EB7CC |
:1050A00008968DBF8091120A9091130A9F938F9357 |
:1050B0008DEB95E09F938F93FF92EF92E0919C058B |
:1050C000F0919D050995EDB7FEB73696D8C391E0EE |
:1050D000F92EC1E0D0E00AE719E09F2D969584E112 |
:1050E000989FC001112480936503F8018281938108 |
:1050F0009F938F932196DF93CF9321978081918106 |
:105100009F938F93DF93CF938CEC95E09F938F9336 |
:1051100080EF95E29F938F93E0919C05F0919D0520 |
:1051200009952DB73EB7245F3F4F2DBF32E0F30EF8 |
:1051300022960C5F1F4F48E04F1578F602C610927A |
:10514000650380914208E82FFF27EE0FFF1FE85804 |
:10515000F64F808191819F938F9380914108E82F32 |
:10516000FF27EE0FFF1FE858F64F808191819F9334 |
:105170008F938EED95E09F938F931F930F93FE0176 |
:10518000099584E1809365038DB79EB708968DBF1E |
:1051900080914408E82FFF27EE0FFF1FE858F64FD5 |
:1051A000808191819F938F9380914308E82FFF27FF |
:1051B000EE0FFF1FE858F64F8081918181589F4F75 |
:1051C0009F938F938EEE95E09F938F931F930F93F2 |
:1051D000E0919C05F0919D05099588E28093650317 |
:1051E000EDB7FEB73896EDBF80914608E82FFF2750 |
:1051F000EE0FFF1FE858F64F8081918181589F4F35 |
:105200009F938F9380914508E82FFF27EE0FFF1F94 |
:10521000E858F64F8081918181589F4F9F938F93DB |
:105220008EEF95E09F938F931F930F93E0919C05D2 |
:10523000F0919D0509958CE3809365032DB73EB7EA |
:10524000285F3F4F2DBF80914808E82FFF27EE0FC2 |
:10525000FF1FE858F64F8081918181589F4F9F939F |
:105260008F9380914708E82FFF27EE0FFF1FE85824 |
:10527000F64F8081918181589F4F9F938F938EE04D |
:1052800096E09F938F931F930F93E0919C05F0916D |
:105290009D0509954DB75EB7485F5F4FD8C1109225 |
:1052A00065038EE196E09F938F9380EFE82E85E271 |
:1052B000F82E1F930F93FE01099584E180936503F7 |
:1052C0000F900F900F900F908091B9049091BA04B5 |
:1052D0009C0197FF02C0215F3F4F207F821B930BF1 |
:1052E00097FD0196959587959F938F938091B9042B |
:1052F0009091BA0497FD0F96B4E095958795BA956D |
:10530000E1F79F938F932091B9043091BA0437FF4E |
:1053100002C0295F3F4FA3E035952795AA95E1F795 |
:105320008091440390914503821B930B9F938F932D |
:105330008CE296E09F938F93FF92EF92E0919C0511 |
:10534000F0919D05099588E2809365038DB79EB71E |
:105350000A968DBF8091B7049091B8049C0197FF85 |
:1053600002C0215F3F4F207F821B930B97FD019668 |
:10537000959587959F938F938091B7049091B804EA |
:1053800097FD0F96E4E095958795EA95E1F79F9351 |
:105390008F932091B7043091B80437FF02C0295F82 |
:1053A0003F4F73E0359527957A95E1F78091420359 |
:1053B00090914303821B930B9F938F938EE396E010 |
:1053C0009F938F93FF92EF92E0919C05F0919D0542 |
:1053D00009958CE380936503EDB7FEB73A96EDBF70 |
:1053E0008091B5049091B60497FD019695958795A7 |
:1053F0009F938F938091B5049091B60420914003C0 |
:1054000030914103821B930B9F938F9380E596E02D |
:105410009F938F93FF92EF92E0919C05F0919D05F1 |
:1054200009952DB73EB7285F3F4F69C110926503BC |
:105430008FE596E09F938F931F930F93FE0109953D |
:1054400084E1809365030F900F900F900F908091EF |
:10545000AF049091B0049F938F9380913C039091FF |
:105460003D039F938F938CE696E09F938F931F93BA |
:105470000F93E0919C05F0919D05099588E280933A |
:1054800065034DB75EB7485F5F4F4DBF8091AD0478 |
:105490009091AE049F938F9380913E0390913F0330 |
:1054A0009F938F938BE796E09F938F931F930F9318 |
:1054B000E0919C05F0919D0509958CE3809365032F |
:1054C0008DB79EB708968DBF8091A9049091AA04CC |
:1054D0009F938F9380913A0390913B039F938F9377 |
:1054E0008AE896E09F938F931F930F93C0C1109209 |
:1054F000650380912601909127016AE070E00E9487 |
:10550000C09F9F938F9380912601909127016AE01D |
:1055100070E00E94C09F7F936F9389E996E09F930C |
:105520008F931F930F93FE01099584E18093650388 |
:105530002DB73EB7285F3F4F2DBF8091EB0A90916A |
:10554000EC0A6AE070E00E94AC9F9F938F93809179 |
:10555000EB0A9091EC0A6AE070E00E94AC9F7F93A6 |
:105560006F938DEA96E09F938F931F930F93E09133 |
:105570009C05F0919D05099588E2809365034DB7E0 |
:105580005EB7485F5F4F4DBF8091ED0A9091EE0A84 |
:105590009F938F9381EC96E09F938F931F930F932C |
:1055A000E0919C05F0919D0509958CE3809365033E |
:1055B0008DB79EB706968DBF8091EF0A9091F00A45 |
:1055C0009F938F9381ED96E09F938F931F930F93FB |
:1055D00075CD1092650383EE96E09F938F931F9392 |
:1055E0000F93FE01099588E2809365030F900F9059 |
:1055F0000F900F908091490499279F938F938CEE81 |
:1056000096E09F938F931F930F93E0919C05F091E9 |
:105610009D0509958CE3809365032DB73EB72A5FFE |
:105620003F4F2DBF80917709992701979F938F93C3 |
:105630008CEF96E09F938F931F930F93E0919C05BF |
:10564000F0919D0509954DB75EB74A5F5F4F4DBF1D |
:1056500078C3109265038CE097E09F938F931F931C |
:105660000F93FE01099584E1809365030F900F90DD |
:105670000F900F9080919001909191019F938F9343 |
:1056800084E197E09F938F931F930F93E0919C0584 |
:10569000F0919D05099588E2809365038DB79EB7CB |
:1056A00006968DBF8091120A9091130A9F938F9353 |
:1056B00082E297E09F938F931F930F93E0919C0555 |
:1056C000F0919D0509958CE380936503EDB7FEB7D6 |
:1056D0003696EDBF80916104909162049F938F9301 |
:1056E00080E397E09F938F931F930F93E0919C0526 |
:1056F000F0919D0509952DB73EB72A5F3F4F2DBF0D |
:1057000020C35AE4C52E54E0D52E20E030E0E90154 |
:1057100043E0F42EC0936503F60181916F01992750 |
:105720009F938F9389010F5F1F4F1F930F938EE3FA |
:1057300097E09F938F9380EF95E29F938F93E091F3 |
:105740009C05F0919D0509952DB73EB7285F3F4F09 |
:105750002DBFFA9464969801F7FEDCCFF2C29EE466 |
:10576000C92E94E0D92EC0E0D0E08E0183E0F82E5F |
:1057700000936503F60181916F0199279F938F93A1 |
:105780002596DF93CF938BE497E09F938F9380EFE1 |
:1057900095E29F938F93E0919C05F0919D0509956B |
:1057A0002DB73EB7285F3F4F2DBFFA940C5E1F4FB9 |
:1057B0002497F7FEDDCFC5C21092650388E597E018 |
:1057C0009F938F93B0EFEB2EB5E2FB2E1F930F93B9 |
:1057D000FE01099584E1809365030F900F900F906F |
:1057E0000F9080916F0199279F938F9380E697E0A8 |
:1057F0009F938F931F930F93E0919C05F0919D05CC |
:10580000099588E2809365034DB75EB74A5F5F4FA5 |
:105810004DBF809116039091170397FD03969595C0 |
:105820008795959587959F938F938EE697E09F93A5 |
:105830008F93FF92EF92E0919C05F0919D05099561 |
:105840008CE3809365038DB79EB706968DBF8091DC |
:10585000700899279F938F9380916F0899279F9342 |
:105860008F938CE797E09F938F93FF92EF92E09155 |
:105870009C05F0919D050995EDB7FEB73896EDBFF3 |
:1058800060C2109265038AE897E09F938F93F0EFD0 |
:10589000CF2EF5E2DF2E1F930F93FE0109950F9097 |
:1058A0000F900F900F90C7E1D9E000E010E0E2E028 |
:1058B000FE2E802F8C5E809365038B8D99278F77CA |
:1058C00090709F938F938B8999278F7790709F9378 |
:1058D0008F938B8599278F7790709F938F938B8170 |
:1058E00099278F7790709F938F938AE997E09F9382 |
:1058F0008F93DF92CF92E0919C05F0919D050995E1 |
:105900002DB73EB7245F3F4F2DBFFA940C5E1F4F5B |
:10591000A096F7FECECF15C2109265038BEA97E0F2 |
:105920009F938F9370EFC72E75E2D72E1F930F931F |
:10593000FE0109950F900F900F900F90C7E1D9E0ED |
:1059400000E010E062E0F62E802F8C5E809365030D |
:105950008F8D992787FD90959F938F938F89992796 |
:1059600087FD90959F938F938F85992787FD9095BD |
:105970009F938F938F81992787FD90959F938F9306 |
:105980008AEB97E09F938F93DF92CF92E0919C05F3 |
:10599000F0919D0509954DB75EB7445F5F4F4DBFD0 |
:1059A000FA940C5E1F4FA096F7FECECFCAC110929C |
:1059B00065038BEC97E09F938F9350EFC52E55E2D4 |
:1059C000D52E1F930F93FE01099587E480936503FD |
:1059D0000F900F900F900F9086ED97E09F938F930D |
:1059E0001F930F93E0919C05F0919D050995FF246D |
:1059F0000F900F900F900F90C0E0D0E08E01802F9D |
:105A00008C5E809365038C2F8D5F0E94907D9F93A9 |
:105A10008F938C2F8E5F0E94907D9F938F938C2FFE |
:105A20008F5F0E94907D9F938F938C2F0E94907D1B |
:105A30009F938F9380EE97E09F938F93DF92CF9207 |
:105A4000E0919C05F0919D0509959E012C5F3F4FCB |
:105A500080913F089927EDB7FEB73C96EDBF281718 |
:105A600039070CF06EC1F3940C5E1F4FE901F2E0B0 |
:105A7000FF1528F666C11092650381EF97E09F93AA |
:105A80008F9340EFE42E45E2F42E1F930F93FE0117 |
:105A9000099584E1809365030F900F900F900F900C |
:105AA00080913209881F8827881F97E0899FC0014D |
:105AB00011248D969F938F9380912A09881F8827A0 |
:105AC000881F96E0899FC00111248D969F938F9324 |
:105AD00080912209881F8827881F95E0899FC0012F |
:105AE00011248D969F938F9380911A09881F882780 |
:105AF000881F9927880F991F880F991F8D969F934C |
:105B00008F9380E098E09F938F931F930F93E09182 |
:105B10009C05F0919D05099588E2809365032DB75A |
:105B20003EB7245F3F4F2DBF80915209881F8827C1 |
:105B3000881F9BE0899FC00111248D969F938F93AE |
:105B400080914A09881F8827881F9AE0899FC00191 |
:105B500011248D969F938F9380914209881F8827E7 |
:105B6000881F99E0899FC00111248D969F938F9380 |
:105B700080913A09881F8827881F992723E0880F7A |
:105B8000991F2A95E1F78D969F938F9384E198E072 |
:105B90009F938F931F930F93E0919C05F0919D0528 |
:105BA00009958CE3809365034DB75EB7445F5F4F03 |
:105BB0004DBF80915A09881F8827881F9CE0899FC4 |
:105BC000C00111248D969F938F9388E298E09F9354 |
:105BD0008F931F930F93E0919C05F0919D0509957C |
:105BE00080916209EDB7FEB73696EDBF87FF12C010 |
:105BF00080E48093650389E398E09F938F931F93DC |
:105C00000F93E0919C05F0919D0509950F900F90E1 |
:105C10000F900F9080916A0987FF12C084E48093EF |
:105C200065038CE398E09F938F93FF92EF92E0914E |
:105C30009C05F0919D0509950F900F900F900F9086 |
:105C40008091720987FF7DC088E4809365038FE3AC |
:105C500098E09F938F93FF92EF92E0919C05F091D3 |
:105C60009D0509950F900F900F900F906AC01092AC |
:105C7000650382E498E09F938F931F930F93FE0137 |
:105C8000099584E1809365030F900F900F900F901A |
:105C90008091EC029091ED029F938F9380E598E0C4 |
:105CA0009F938F931F930F93E0919C05F0919D0517 |
:105CB000099588E2809365032DB73EB72A5F3F4F71 |
:105CC0002DBF8091EE029091EF029F938F938DE50F |
:105CD00098E09F938F931F930F93E0919C05F09111 |
:105CE0009D05099589E4809365034DB75EB74A5FCA |
:105CF0005F4F4DBF8AE698E09F938F931F930F935A |
:105D0000E0919C05F0919D050995809163030F90AA |
:105D10000F900F900F9083FF14C01092EF0210921B |
:105D2000EE0260E070E08EE090E00E94D73009C0A3 |
:105D300080912801281719F42150209328011092EE |
:105D4000640310926303E8E0CDB7DEB70C9436A08D |
:105D5000F999FECF92BD81BDF89A80B59927089533 |
:105D6000F999FECF1FBA92BD81BD60BD0FB6F89400 |
:105D7000FA9AF99A0FBE08954AEA20E030E0261711 |
:105D8000370740F4FC018191480F2F5F3F4F2617E2 |
:105D90003707C8F3842F99270895EAEA40E050E0D6 |
:105DA0004617570778F49C01F999FECF32BD21BD03 |
:105DB000F89A80B5E80F4F5F5F4F2F5F3F4F461750 |
:105DC000570790F38E2F9927089581E08093430819 |
:105DD00082E08093420883E08093410884E08093CE |
:105DE000440885E08093450886E08093460887E074 |
:105DF0008093470888E08093480889E080934908A9 |
:105E00008AE080934A088BE080934B088CE0809373 |
:105E10004C08089581E6809340088CE0E4EBF8E0BC |
:105E200011928A95E9F780910301843150F08AE05C |
:105E300080936008109284088BE180935C088EE464 |
:105E40000AC083E08093600880E2809384088EE13A |
:105E500080935C0885E5809381088093820880E2C6 |
:105E6000809383081092B0088AE680934D0882E7F9 |
:105E70008093B20880E58093B30886E0809367083A |
:105E80001092A4081092A10838E030935A0886EEC8 |
:105E900080935B0880E480935D0885E080935008E0 |
:105EA0002EE120934E0890910804992399F084E103 |
:105EB0008093510888E280934F082093530881E033 |
:105EC00080935408109255088FE7809356082093CA |
:105ED000A70810C08FE08093510820934F0890933B |
:105EE00053083093540884E18093550890935608E2 |
:105EF0009093A7088FE0809352081092AC088CE032 |
:105F00008093AD081092690810926A0810926B088D |
:105F100010926C08109286081092870810928808D8 |
:105F20001092890890E890936D0842E340936E08C0 |
:105F300072E07093B10888E180936F0886EE8093D9 |
:105F4000700883E0809375085DE75093780850935C |
:105F5000790850937A089093710865E56093720808 |
:105F600086E4809373088CED809374088CE38093AF |
:105F70007608109277089AEA90938A088CEC8093BE |
:105F80008C0810928E0890938F0898E290938B085B |
:105F900090938D081092900840937B082AE52093F7 |
:105FA0007C0840937D0836E03093910884E6809326 |
:105FB0009208809393082093940888E7809395082B |
:105FC000909399088BE48093960860939708809348 |
:105FD000980830939A0888E080939B0840939C0827 |
:105FE0008AE280939D0885EF80939E088CE88093D9 |
:105FF0009F087093A0081092A2081092A30881E253 |
:106000008093640881E48093650820936608109269 |
:10601000A5081092A60886E98093A80850937E08E8 |
:1060200084E380937F081092A9081092AA08109226 |
:10603000AB081092AE088FE18093AF0808950E94DC |
:106040000A2F8AE08093570880E18093580826E061 |
:10605000209359089AE590935E0888E780935F083B |
:1060600090936108809362082093630880E2809394 |
:1060700068088CE3809380088BE48093850886E42D |
:1060800091E6A3E7B4E78093B4089093B508A09392 |
:10609000B608B093B70860E870E080E498E00E942A |
:1060A000BC2E8093C0080895CF93DF930E940A2FDF |
:1060B00088E08093570830E13093580826E0209319 |
:1060C000590894E690935E0888E780935F08909360 |
:1060D000610880936208209363083093680886E41F |
:1060E0008093800880938508A4EBB8E085E0E9E21E |
:1060F000F1E0ED01019009928A95E1F760E870E026 |
:10610000CD01845790400E94BC2E8093C008DF913F |
:10611000CF9108950E940A2F26E0209357088AE025 |
:106120008093580884E08093590894E690935E0821 |
:1061300088E780935F0890936108809362082093BA |
:10614000630880E18093680886E4809380088093E8 |
:10615000850885E491E6A3E7B9E78093B4089093B6 |
:10616000B508A093B608B093B70860E870E080E483 |
:1061700098E00E94BC2E8093C0080895F999FECF44 |
:1061800092BD81BDF89A80B599270895F999FECFFF |
:106190001FBA92BD81BD60BD0FB6F894FA9AF99A04 |
:1061A0000FBE089568EA7EE20E940F9E089540EBBC |
:1061B0005EE20E94499E0895EF92FF920F931F9313 |
:1061C000CF93C82F8150853008F0C3E081E8C89F85 |
:1061D0008001112483EEE82E8FEFF82EE00EF11EE1 |
:1061E00060E870E0C7010E94CD2E682F98012D59FC |
:1061F0003F4F8FB39927AC014270507081FDF9CFAA |
:1062000032BD21BDF89A80B5861711F0CA0123C0AE |
:106210008FB399279C012270307081FDF9CFF2BCB9 |
:10622000E1BCF89A80B5813611F0C90114C081E84B |
:10623000C89FC00111244D9728EA3EE241E850E092 |
:10624000BC0180E498E00E94EA9D0E9485760E944D |
:10625000839781E090E0CF911F910F91FF90EF9095 |
:106260000895282F863010F025E003C0882309F414 |
:1062700021E020930101F999FECF1FBA82E090E05E |
:1062800092BD81BD20BD0FB6F894FA9AF99A0FBE5F |
:106290000895CF93C82F80914008813609F051C0EE |
:1062A000C63010F0C5E003C0CC2309F44AC00E94F8 |
:1062B0004A9C8091B30882FF07C0809165088436AC |
:1062C00018F080E58093650860E870E080E498E06D |
:1062D0000E94BC2E8093C00881E8C89FC001112491 |
:1062E00020EB3EE241E850E060E478E04D970E9408 |
:1062F000279E20EB3EE24CE050E061E478E080E550 |
:1063000090E00E94279E6CE070E081E498E00E949B |
:10631000BC2E282FF999FECF1FBA8CE590E092BDD4 |
:1063200081BD20BD0FB6F894FA9AF99A0FBE8C2F52 |
:106330000E9431310E9485760E94839781E090E02F |
:1063400002C080E090E0CF9108956DE470E088EEA7 |
:1063500093E00E94CD2E482F8FB399279C01227085 |
:10636000307081FDF9CF85E394E092BD81BDF89A4C |
:1063700080B5841779F48FB399279C01227030700F |
:1063800081FDF9CF88EE93E092BD81BDF89A80B58A |
:10639000813011F0C901089528EA3EE24EE450E050 |
:1063A00068EE73E081EC98E00E94EA9D81E090E065 |
:1063B00008958091C1088130A9F46DE470E081EC0A |
:1063C00098E00E94BC2E80930E0920EB3EE24EE442 |
:1063D00050E061EC78E088EE93E00E94279E81E037 |
:1063E00090E0089580E090E00895CF93DF9381E0FE |
:1063F0008093C108E1ECF8E08FE0158616861786D9 |
:10640000108A8150349687FFF8CF80E48093CE08BD |
:106410008093CF081092D0088093D1088093D2083F |
:1064200090EC9093D3081092D4088093D508809371 |
:10643000D6081092D7089093D8089093D9088093E3 |
:10644000DA081092DB088093DC089093DD08A2EC58 |
:10645000B8E08CE0EFE2F1E0ED01019009928A955D |
:10646000E1F76DE470E0CD0101970E94BC2E8093AE |
:106470000E09DF91CF910895F999FECF82E090E067 |
:1064800092BD81BDF89A80B5282F863078F023E040 |
:10649000322FF999FECF1FBA82E090E092BD81BD04 |
:1064A00030BD0FB6F894FA9AF99A0FBE2093010105 |
:1064B000822F992708951F93CF93C82F162F8630C8 |
:1064C00010F0C5E003C0882309F4C1E08C2F9927A0 |
:1064D0008230910541F08330910544F4019731F405 |
:1064E0000E941F3005C00E94543002C00E948A30B2 |
:1064F0001123E1F06CE070E080E590E00E94CD2E89 |
:10650000282FF999FECF8CE590E092BD81BDF89AD5 |
:1065100080B5821759F428EA3EE24CE050E060E58D |
:1065200070E081E498E00E94EA9D02C00E94E52E9E |
:106530008C2F0E944931CF911F910895DF92EF92E5 |
:10654000FF920F931F93CF93FF24DF2CEF2C81E159 |
:1065500090E00E94BE3090910301981791F196311E |
:1065600069F481E190E00E94BE30853139F44C99A4 |
:1065700005C06F2D81E090E00E94C630609103015C |
:1065800081E190E00E94C63088E190E028E00FB6FB |
:10659000F894A895809360000FBE2093600082E776 |
:1065A00098E09F938F9388E996E19F938F93E09172 |
:1065B0009C05F0919D0509950F900F900F900F90FD |
:1065C000FFCF81E090E00E94BE30813611F031E0D3 |
:1065D000E32E6CE070E080E590E00E94CD2EC82FA5 |
:1065E000F999FECF8CE590E092BD81BDF89A80B517 |
:1065F0008C1711F421E0D22EC1E001E010E0EE2072 |
:1066000029F48C2F0E94DC308823B9F591E0F92E13 |
:106610001F930F938AE998E09F938F9388E996E1FF |
:106620009F938F93E0919C05F0919D0509952DB75F |
:106630003EB72A5F3F4F2DBF0130110521F00230D8 |
:10664000110521F006C00E941F3005C00E94543081 |
:1066500002C00E948A30DD2059F028EA3EE24CE078 |
:1066600050E060E570E081E498E00E94EA9D02C09D |
:106670000E94E52E8C2F0E944931CF5F0F5F1F4F84 |
:10668000C63008F4BCCFFF2019F083E00E943131FE |
:106690000E943C32C82F0E94DC308C2F99279F9398 |
:1066A0008F9380EC98E09F938F9308E916E11F93F6 |
:1066B0000F93E0919C05F0919D05099581E090E094 |
:1066C0000E94BE302DB73EB72A5F3F4F2DBF8F3F90 |
:1066D00021F00E94A531882399F489ED98E09F93D9 |
:1066E0008F931F930F93E0919C05F0919D05099561 |
:1066F0000E94F5310E94D9310F900F900F900F90AA |
:10670000EE2029F061E681E090E00E94C630109210 |
:106710003F0890E0EEECF8E0CFE080813496181668 |
:106720000CF49F5FC150C7FFF8CF90933F08892FAB |
:1067300099279F938F9382EC98E09F938F938AEF92 |
:1067400098E09F938F931F930F93E0919C05F09196 |
:106750009D0509950E94230A8DB79EB708968DBFA7 |
:10676000CF911F910F91FF90EF90DF900895982F98 |
:106770002FB7F8943998389A88B1836088B9809196 |
:10678000B9008C7F8093B9008AE28093B8001092A0 |
:10679000700310926E0310926D03992379F0E7E174 |
:1067A000F9E08BE01082118212821382148215822A |
:1067B000168217828150389687FFF4CF78942FBFC6 |
:1067C00008951092700384E98093BC0080E8809360 |
:1067D000BC001092BD001092BA001092BB00109243 |
:1067E000B9001092B80010926C0380E00E94B73399 |
:1067F0001092BB0085E88093BC0080916A038260A0 |
:1068000080936A0308951F920F920FB60F9211247E |
:106810002F933F934F935F938F939F93EF93FF93A8 |
:1068200080917003282F3327442755278F5F80934B |
:106830007003F9012731310508F00DC3E659FF4F08 |
:106840000C9447A081E080936C0309C080916E0393 |
:106850008C3090F480916E038F5F80936E038091F3 |
:106860006E03E82FFF27EE0FFF1FEE0FFF1FEF5302 |
:10687000F74F8585181654F780916E038C3070F0B1 |
:10688000109269031092680310926E0385E0809362 |
:10689000700380916D03880F8D5A04C080916E0340 |
:1068A000880F8E5A8093BB0085E8CAC280916E0320 |
:1068B000E82FFF2723E0EE0FFF1F2A95E1F7E95E9F |
:1068C000F64F81818093BB0085E88093BC00809166 |
:1068D0006E03E82FFF2793E0EE0FFF1F9A95E1F775 |
:1068E000E95EF64F808180FF92C080916E03E82FB1 |
:1068F000FF2783E0EE0FFF1F8A95E1F7E95EF64F71 |
:106900008281882329F080913F08873008F4B9C23A |
:106910008091680390916903892B09F0B2C280913C |
:10692000660390916703892B09F0ABC270C0809118 |
:106930006E0321E030E002C0220F331F8A95E2F798 |
:10694000809166039091670328233923232B79F0E4 |
:1069500080916E03E82FFF27EE0FFF1FEE0FFF1F42 |
:10696000EE0FFF1FE95EF64F80E184830DC080913A |
:106970006E03E82FFF27EE0FFF1FEE0FFF1FEE0F36 |
:10698000FF1FE95EF64F148280916E03E82FFF2708 |
:10699000EE0FFF1FEE0FFF1FEE0FFF1FE95EF64F1A |
:1069A0008481282F3327220F331F220F331F220FFA |
:1069B000331F80916E03E82FFF2753E0EE0FFF1F78 |
:1069C0005A95E1F7E95EF64F82818770822B8093BA |
:1069D000BB0085E88093BC0020916E0381E090E0CD |
:1069E00002C0880F991F2A95E2F720916803309121 |
:1069F000690382239323892B51F08FE099E09093D0 |
:106A000074038093730388E0809375033AC284E033 |
:106A1000D4C1E0917303F091740381918093BB0022 |
:106A200085E88093BC00F0937403E0937303809136 |
:106A30007503815080937503882309F422C283E093 |
:106A4000BCC18091B900803349F5809171038823DE |
:106A500029F480916E038F5F8093710380916E03A0 |
:106A6000E82FFF2743E0EE0FFF1F4A95E1F7E95EAD |
:106A7000F64F838199278F7790708F37910574F443 |
:106A800080916E03E82FFF2733E0EE0FFF1F3A954A |
:106A9000E1F7E95EF64F83818F5F83831092700385 |
:106AA00084E98093BC008AE090E090933D0180935C |
:106AB0003C0180916E038F5F80936E031092700390 |
:106AC000B9C18091B9008034C1F180916D03E82F84 |
:106AD000FF2723E0EE0FFF1F2A95E1F7E95EF64F4F |
:106AE00083818F77838380916D038F5F80936D03A4 |
:106AF00080916D038C30A0F010926D0310926703AB |
:106B000010926603809172038F5F809372038C30C2 |
:106B100038F01092720380916A038D7F80936A032C |
:106B200080916A03816080936A031092700384E904 |
:106B30008093BC0010926C0383C080916D03E82F9A |
:106B4000FF2793E0EE0FFF1F9A95E1F7E95EF64FFE |
:106B500083818068838380916D03E82FFF2783E022 |
:106B6000EE0FFF1F8A95E1F7E95EF64F808180FF07 |
:106B700040C080916D03E82FFF27EE0FFF1FEE0F3F |
:106B8000FF1FEE0FFF1FE95EF64F848199270097E4 |
:106B9000D1F0409709F04BC08FE099E090937403D7 |
:106BA0008093730388E08093750380916D03E82FD1 |
:106BB000FF27EE0FFF1FEE0FFF1FEE0FFF1FE95E17 |
:106BC000F64F148234C080916D039927E3E0880F5B |
:106BD000991FEA95E1F7845E964F90937403809332 |
:106BE000730390916D03809172039817E9F483E029 |
:106BF0001CC080916D039927880F991F880F991FDA |
:106C0000880F991F845E964F90937403809373034B |
:106C100080916A0381FD06C090916D03809172039B |
:106C2000981711F482E001C081E080937503809190 |
:106C30007503813011F485E801C085EC8093BC00B8 |
:106C40008091710380936B03109271031AC1E091DC |
:106C50007303F09174038091BB0080838091730370 |
:106C600090917403019690937403809373038091C1 |
:106C70007503815080937503823010F085EC9AC0C3 |
:106C8000813011F485E896C080916A0381FF6AC063 |
:106C90008091100480FD66C080916D03E82FFF276E |
:106CA000EE0FFF1FEE0FFF1FEE0FFF1FE95EF64F07 |
:106CB000868199278C7F9070883F910579F4809127 |
:106CC0006D03E82FFF2753E0EE0FFF1F5A95E1F702 |
:106CD000E95EF64F8081816080830CC080916D03F6 |
:106CE000E82FFF2743E0EE0FFF1F4A95E1F7E95E2B |
:106CF000F64F108280916D03E82FFF2733E0EE0FEF |
:106D0000FF1F3A95E1F7E95EF64F8681883F71F4FF |
:106D100080916D03E82FFF2723E0EE0FFF1F2A95D8 |
:106D2000E1F7E95EF64F808186601BC080916D03BC |
:106D3000E82FFF2793E0EE0FFF1F9A95E1F7E95E3A |
:106D4000F64F8681893F71F480916D03E82FFF270C |
:106D500083E0EE0FFF1F8A95E1F7E95EF64F808131 |
:106D60008460808380916D038F5F80936D03809139 |
:106D70006D038C30A0F010926D0310926703109297 |
:106D80006603809172038F5F809372038C3038F0BA |
:106D90001092720380916A038D7F80936A03109230 |
:106DA000700384E98093BC0080916A0381608093C2 |
:106DB0006A0365C08093BC0086E08093700361C065 |
:106DC00088E970CD80916F03880F805F6BCD8091D3 |
:106DD0006F0399278130910561F0823091051CF491 |
:106DE000892B21F04EC0029739F04BC080911B01D6 |
:106DF00059CD80911A0156CD8091190153CD80E86B |
:106E000051CD1092700384E98093BC0010926C0302 |
:106E10008AE090E090933D0180933C0180916F0364 |
:106E2000823088F480916F038F5F80936F0382E1DB |
:106E30008093700380916A038E7F80936A0385EA52 |
:106E40008093BC001EC010926F0380916A03816022 |
:106E500080936A0316C01092700384E98093BC008B |
:106E600080916A03816080936A038AE090E0909346 |
:106E70003D0180933C0110926E0310926D031092BD |
:106E80006C03FF91EF919F918F915F914F913F9193 |
:106E90002F910F900FBE0F901F9018951F93CF93B7 |
:106EA000DF93182F80914804882321F48091FB02FE |
:106EB000882319F081E090E09AC01D3008F095C059 |
:106EC0001123B1F0E12FFF2743E0EE0FFF1F4A959A |
:106ED000E1F7E95EF64F35978081359688230CF00F |
:106EE00084C03897808180FD03C083E090E07FC03C |
:106EF00080910F0999278B709070029719F084E0A8 |
:106F000090E075C067E070E08FE099E00E94BC2ED1 |
:106F100090911609891719F085E090E068C080ED1E |
:106F200097E00E94691AEC0180916A0380FD05C018 |
:106F3000CE010E94721A8823B9F3112319F48FEF3E |
:106F400090E00BC0212F33272150304081E090E0AA |
:106F500002C0880F991F2A95E2F7909369038093E6 |
:106F60006803A1E0B0E0E7E1F9E040E050E06BE069 |
:106F7000CD01042E02C0880F991F0A94E2F72091D8 |
:106F800068033091690382239323892B11F01182C6 |
:106F9000128261504F5F5F4F389667FFE9CF1092C2 |
:106FA0006E031092700380916A038E7F80936A0350 |
:106FB00085EA8093BC0080916A0380FD05C0CE0104 |
:106FC0000E94721A8823B9F3809168039091690333 |
:106FD000892B29F0CE010E94721A882311F3809127 |
:106FE000680390916903009711F082E090E0DF91CF |
:106FF000CF911F9108950F931F93CF93DF93982FF5 |
:1070000080914804882321F48091FB02882319F0A1 |
:1070100081E090E095C09D30A0F4992319F486E0BA |
:1070200090E08EC0C92FDD27FE0153E0EE0FFF1F59 |
:107030005A95E1F7E95EF64F35978081359687FDE1 |
:1070400003C082E090E07CC03897808180FD03C05F |
:1070500083E090E075C080ED97E00E94691A8C0192 |
:1070600080916A0380FD05C0C8010E94721A8823BE |
:10707000B9F3219721E030E0C90102C0880F991FC0 |
:10708000CA95E2F79093670380936603D901E7E11D |
:10709000F9E040E050E06BE0CD01042E02C0880F23 |
:1070A000991F0A94E2F720916603309167038223C7 |
:1070B0009323892B11F01182128261504F5F5F4F31 |
:1070C000389667FFE9CF10926D0310920F09109266 |
:1070D00016091092700380916A038E7F80936A0371 |
:1070E00085EA8093BC0080916A0380FD05C0C801D9 |
:1070F0000E94721A8823B9F3809166039091670306 |
:10710000892B29F0C8010E94721A882311F38091FB |
:107110000F0999278B709070029719F084E090E026 |
:107120000FC067E070E08FE099E00E94BC2E909164 |
:107130001609891719F085E090E002C080E090E020 |
:10714000DF91CF911F910F910895CF93DF9380E04E |
:1071500021E83FEFCEEBD9E0E8E7F9E0DF01853049 |
:1071600020F411961C921E9202C031832083198252 |
:10717000188222968F5F12963296833280F38FE7C1 |
:1071800090E09093B7098093B60981E89FEF9093C0 |
:10719000B5098093B4091092B9091092B8091092F8 |
:1071A000B6041092B5041092B8041092B70410926D |
:1071B000BA041092B904DF91CF9108951F920F92F3 |
:1071C0000FB60F9211240F931F932F933F934F935A |
:1071D0005F936F937F938F939F93AF93BF93CF935F |
:1071E000DF93EF93FF938091B20882FDC2C040917C |
:1071F0008600509187008091770390917803481B17 |
:10720000590B80918600909187009093780380932A |
:107210007703CA018D549440A0917903B0917A0309 |
:10722000835F9A4158F4809179038093770914978A |
:1072300014F01092400181E090E096C0A131B105B8 |
:107240000CF0F7C1CA018B5F9040845B914008F05D |
:1072500086C080913E0190913F01481B590BE091FF |
:10726000A908EE2351F0FF27EE0FFF1FE858F64F55 |
:107270008081918184369105ECF4FD01EA0FFB1FBA |
:10728000E858F64F80819181FA01E81BF90BCF0194 |
:10729000F7FF03C0909581959F4F06975CF480910E |
:1072A0004904883C20F480914904865F01C088EC41 |
:1072B00080934904FD01EA0FFB1FE858F64F8081D7 |
:1072C00091819C01220F331F280F391F240F351F76 |
:1072D00037FF02C02D5F3F4FE901D595C795D59582 |
:1072E000C795CA0101968C179D0714F4219706C013 |
:1072F00041505040C417D5070CF4219680914904A1 |
:10730000833CE0F08D010A0F1B1FF801E858F64F8F |
:10731000808191819E01281B390BC90163E070E0D7 |
:107320000E94C09FCB01880F991F860F971F0254A0 |
:10733000164FD80111969C938E9307C0AA0FBB1FBE |
:10734000A254B64F11961C921E92E0917903F091CF |
:107350007A03EE0FFF1FE858F64FD183C083809168 |
:10736000790390917A03019690937A03809379033D |
:1073700060C1409186005091870080917B0390917D |
:107380007C03481B590B8091860090918700909355 |
:107390007C0380937B03CA018D5494406091050463 |
:1073A000835F9A4108F07AC06093760380917603F8 |
:1073B000843008F453C09091770980917603981730 |
:1073C00009F04CC0509106045B3008F43FC01092A5 |
:1073D00040011092050440E05F31C0F0E42FFF2728 |
:1073E000EE0FFF1F9F012F533C4FDF01A858B64FF0 |
:1073F0008D919C91D9018D939C93DF01A254B64F3E |
:107400008D919C91ED51FC4F91838083E42FFF2758 |
:10741000EE0FFF1F9F012858364FDF01A358BC4FC6 |
:107420008D919C91D90111969C938E93DF01A15669 |
:10743000BC4F8D919C91E254F64F91838083842FB1 |
:107440008F5F482F813140F28093050480910604BC |
:107450008F3FB9F08F5F8093060413C080910604BC |
:10746000853620F08AE08093060402C0109206045C |
:10747000809103018A3011F0843110F0289A01C004 |
:10748000289881E08093050480914804882309F0BE |
:10749000D0C08091760380937709CBC0613108F02A |
:1074A000A0C0CA018B5F9040845B914008F090C0FF |
:1074B00080913E0190913F01481B590BE62FFF2719 |
:1074C000EE0FFF1FE358FC4F80819181FA01E81B0A |
:1074D000F90BCF0105960B9720F5E091A908EE2353 |
:1074E00051F0FF27EE0FFF1FE858F64F8081918182 |
:1074F00084369105B4F4809106048A3120F080919D |
:107500004904865F05C08B3028F0809149048E5F66 |
:107510008093490480914904893C18F088EC809359 |
:107520004904E62FFF27EE0FFF1FE358FC4F808131 |
:1075300091819C01220F331F280F391F240F351F03 |
:1075400037FF02C02D5F3F4FE901D595C795D5950F |
:10755000C795CA0101968C179D0714F4219706C0A0 |
:1075600041505040C417D5070CF42196809149042E |
:107570008E3BD8F0E62FFF27EE0FFF1FDF01A35849 |
:10758000BC4F8D919C919E01281B390BC90163E072 |
:1075900070E00E94C09FCB01880F991F860F971F34 |
:1075A000E156FC4F9183808308C0E62FFF27EE0F42 |
:1075B000FF1FE156FC4F1182108280910504E82FD5 |
:1075C000FF27EE0FFF1FE358FC4FD183C08309C094 |
:1075D000809103018A3011F0843110F0289A01C0A3 |
:1075E000289880910504843120F48F5F80930504EE |
:1075F00020C08431F1F4809103018A3011F084318C |
:1076000010F0289A01C028988EE18093050420E1AB |
:10761000CEEBD9E0A1ECB3E0E8E7F9E08D919D91E4 |
:10762000918380833296198218822296215027FFF7 |
:10763000F5CFFF91EF91DF91CF91BF91AF919F91E6 |
:107640008F917F916F915F914F913F912F911F91FA |
:107650000F910F900FBE0F901F9018958091840A84 |
:107660009091850A90939C0780939B078091860A4E |
:107670009091870A90939E0780939D0780915A0A64 |
:1076800090915B0A97FD03969595879595958795BB |
:107690009093A00780939F0780916A0A90916B0A4C |
:1076A00097FD039695958795959587959093A20755 |
:1076B0008093A1078091B5049091B6042091400376 |
:1076C00030914103821B930B9093A4078093A307EF |
:1076D0008091430490914404A0914504B0914604E4 |
:1076E000BC01CD012AE030E040E050E00E94F59F6F |
:1076F0003093A6072093A5078091E0079091E107BA |
:107700009093A8078093A707809190019091910191 |
:107710009093AC078093AB0780912601909127014D |
:107720009093AE078093AD07809149049927909379 |
:10773000B0078093AF078091120A9091130A90933B |
:10774000B2078093B1078091180999279093B407E5 |
:107750008093B3078091200999279093B60780936F |
:10776000B5078091280999279093B8078093B707A8 |
:107770008091300999279093BA078093B907809137 |
:107780001603909117039093C4078093C3078091C9 |
:107790002D0490912E049093C6078093C507809185 |
:1077A000EB0A9091EC0A9093C8078093C7078091E9 |
:1077B000EF0A9091F00A9093CA078093C9078091CD |
:1077C0003F0490914004A0914104B0914204BC0157 |
:1077D000CD012AE030E040E050E00E94F59F309378 |
:1077E000CC072093CB078091610490916204909321 |
:1077F000D2078093D1078091F10A99279093D607F9 |
:107800008093D50780911B0590911C059093D80714 |
:107810008093D7078091190590911A059093DA0704 |
:107820008093D9078091B505882321F48091B6050E |
:10783000882321F080919A07816003C080919A0784 |
:107840008E7F80939A070895EF92FF921F93CF93B4 |
:10785000DF93182F7B0180914804882391F5809154 |
:1078600003018C3010F0893111F4299801C0299A54 |
:1078700011501F3FE9F0F0921E03E0921D03E70153 |
:1078800080911D0390911E03892B11F4209781F3A1 |
:10789000809121038823A1F31092210380911D037D |
:1078A00090911E03892B09F421970E94609CE8CFD8 |
:1078B000809103018C3010F0893111F4299A01C0B4 |
:1078C0002998DF91CF911F91FF90EF900895CF936A |
:1078D000DF93809103018D3011F40E94C21F10923A |
:1078E0007A00809144039091450390931D0A809300 |
:1078F0001C0A809142039091430390930E0A809357 |
:107900000D0A80914003909141039093600A809307 |
:107910005F0A20913C0330913D03C901880F991FF4 |
:10792000880F991F820F931F820F931F90935B0AFA |
:1079300080935A0A20913E0330913F03C901880F7A |
:10794000991F880F991F820F931F820F931F909387 |
:107950006B0A80936A0A8FEC80937A00AAE4B4E001 |
:10796000C5E4D8E097E08991E82FFF27EE0FFF1FCD |
:10797000E858F64F0190F081E02DE158FF4F1E16B8 |
:107980001F061CF0E0E0F0E005C0EF3FF10514F049 |
:10799000EFEFF0E08C91282F3327E217F30714F470 |
:1079A000815004C02E173F0714F48F5F8C939150C1 |
:1079B000119697FFD8CF809181089927AA27BB27D6 |
:1079C000BC01CD0124EC39E040E050E00E94819FF1 |
:1079D000DC01CB018093880190938901A0938A01F7 |
:1079E000B0938B01809182089927AA27BB27BC01FD |
:1079F000CD010E94819FDC01CB0180938401909393 |
:107A00008501A0938601B0938701DF91CF910895FE |
:107A1000A0E0B0E0EEE0FDE30C9414A0782E91E03D |
:107A2000692ECC24DD2456014601E6011092B505ED |
:107A3000D092B004C092AF04D092AE04C092AD0414 |
:107A4000D092AA04C092A9041092A804D092BA04B9 |
:107A5000C092B904D092B804C092B704D092B604D0 |
:107A6000C092B50410926A01109269011092350318 |
:107A70000E94673C84E690E00E948B1A0E94673C5B |
:107A800080914D0880FF14C080911C0190911D01D0 |
:107A9000875B934058F480911C0190911D018E5E8C |
:107AA000924020F080913503882311F00E94221F1C |
:107AB00000911C0110911D0187B58B5F87BD87B5B3 |
:107AC000809588BD8FE1E82E8AE090E00E948B1AB5 |
:107AD0008091400390914103C80ED91E80914403C8 |
:107AE00090914503A80EB91E8091420390914303E3 |
:107AF000880E991E8091E0079091E107C80FD91F69 |
:107B0000EA94E7FEE1CF80911C0190911D01825F14 |
:107B1000934080F480911C0190911D01459750F095 |
:107B200080911C0190911D01081B190B10931701E6 |
:107B30000093160187B5855087BD87B5809588BDB0 |
:107B40009501205F3F4F36952795369527953093C1 |
:107B5000BA042093B904C4014096969587959695EA |
:107B600087959093B8048093B70440E150E0C40E29 |
:107B7000D51EB5E0D694C794BA95E1F7D092B60475 |
:107B8000C092B504C40FD51FA5E0D695C795AA9598 |
:107B9000E1F7D093AA04C093A9049093B40480930E |
:107BA000B3043093B2042093B10452E07516C9F5C2 |
:107BB00080915A0A90915B0A97FF03C09095819536 |
:107BC0009F4F6CE070E00E94C09F9B017093B004D7 |
:107BD0006093AF0480916A0A90916B0A97FF03C08B |
:107BE000909581959F4F6CE070E00E94C09F7093CC |
:107BF000AE046093AD04B90184E090E00E94D730F8 |
:107C00006091AD047091AE0486E090E00E94D730A0 |
:107C10006091A9047091AA0488E090E00E94D73096 |
:107C20004FC084E090E00E94D2309093B0048093E3 |
:107C3000AF0486E090E00E94D2309C019093AE04A5 |
:107C40008093AD048091AF049091B004815098402E |
:107C500018F421503840A0F18BE199E09F938F9365 |
:107C600088E996E19F938F93E0919C05F0919D05A3 |
:107C7000099580915A0A90915B0A97FF03C09095ED |
:107C800081959F4F6CE070E00E94C09F7093B0049C |
:107C90006093AF0480916A0A90916B0A97FF03C0CA |
:107CA000909581959F4F6CE070E00E94C09F70930B |
:107CB000AE046093AD0466240F900F900F900F9068 |
:107CC00012BC11BC10921D0A10921C0A10920E0ACE |
:107CD00010920D0A1092600A10925F0A88EC90E0F0 |
:107CE0000E948B1A80913C0390913D039C01220FCE |
:107CF000331F220F331F280F391F280F391F3093CE |
:107D00005B0A20935A0A80913E0390913F038C01B5 |
:107D1000000F111F000F111F080F191F080F191F47 |
:107D200010936B0A00936A0A80915C08C82EDD24C8 |
:107D3000EE24FF24442737FD4095542FC701B60198 |
:107D40000E94819F4B015C016093A3047093A40483 |
:107D50008093A5049093A6049801442737FD40958D |
:107D6000542FC701B6010E94819FDC01CB01809393 |
:107D70009B0490939C04A0939D04B0939E048092D6 |
:107D8000830490928404A0928504B0928604809328 |
:107D90007B0490937C04A0937D04B0937E041092A6 |
:107DA000730410927404109275041092760400917A |
:107DB000900110919101109362040093610484E694 |
:107DC00090E090938D0180938C0182E390E09093FA |
:107DD0001E0380931D03809181089927AA27BB2742 |
:107DE000BC01CD0124EC39E040E050E00E94819FCD |
:107DF000DC01CB018856954CAF4FBF4F8093880173 |
:107E000090938901A0938A01B0938B01809182089D |
:107E10009927AA27BB27BC01CD010E94819FDC01C5 |
:107E2000CB018856954CAF4FBF4F80938401909300 |
:107E30008501A0938601B0938701109247011092AB |
:107E40004601C801AA2797FDA095BA2F20914201AB |
:107E5000309143014091440150914501BC01CD0155 |
:107E60000E94819FDC01CB018093660A9093670A90 |
:107E7000A093680AB093690A10925E0410925D04A0 |
:107E80000E948576772029F0809110048460809389 |
:107E900010048FEF8093E60A1092E70A80E2809345 |
:107EA000E80ACAE4D4E0A5E4B8E077E0E72E8D91D3 |
:107EB000E82FFF27EE0FFF1FE858F64F80819181D2 |
:107EC00081588993EA94E7FEF2CF84E680934904CF |
:107ED00080911B03882311F0579A17C08091B10835 |
:107EE000992780FF05C082FF03C080EE9EE202C09A |
:107EF00080E091E190930A018093090181E08093F1 |
:107F000011010E942C1B0E942C1B8091A3049091B4 |
:107F1000A404A091A504B091A604E0904201F090C1 |
:107F200043010091440110914501BC01CD01A8011C |
:107F300097010E94F59F59016A0180919B049091DD |
:107F40009C04A0919D04B0919E04BC01CD01A801A8 |
:107F500097010E94F59FB901C5010E94A19D8C0166 |
:107F60000E94F7799C019093270A8093260A8091BA |
:107F7000A9049091AA04AA2797FDA095BA2F6DE0B5 |
:107F8000880F991FAA1FBB1F6A95D1F78050904F89 |
:107F9000AF43B040442737FD4095542FBC01CD017D |
:107FA0000E94F59FC90180509E4F9093AA04809330 |
:107FB000A904053111050CF06624772079F0809131 |
:107FC0000804882359F0C90181599040C39730F0C3 |
:107FD0008091B50580628093B50566248091B904CF |
:107FE0009091BA0480569940815C9B4228F0809120 |
:107FF000B50581608093B5058091B7049091B80470 |
:1080000080569940815C9B4228F08091B505826042 |
:108010008093B5058091B5049091B6048C5291403F |
:108020008957954028F08091B50584608093B50507 |
:108030008091AF049091B0048C529140835C914048 |
:1080400028F08091B50588608093B5058091AD04D6 |
:108050009091AE048C529140835C914028F08091C5 |
:10806000B50580618093B5058091A9049091AA041B |
:10807000805092408355914028F08091B5058062F0 |
:108080008093B5058091B5058111662486E48093BF |
:108090007F010E94839782E00E94E89880911E01F0 |
:1080A00090911F01A0912001B09121018093E207DE |
:1080B0009093E307A093E407B093E507109234038D |
:1080C0001092330310923603109237031092380344 |
:1080D00010923903109263041092640410926504A4 |
:1080E000109266041092D4071092D3070E94EA1EE1 |
:1080F000862D9927EEE0CDB7DEB70C9430A0A3E132 |
:10810000B0E0E5E8F0E40C9410A08091B504909103 |
:10811000B6042091400330914103821B930B90934E |
:10812000600A80935F0A80914A0390914B0397FD08 |
:1081300007969C0153E0359527955A95E1F73093C2 |
:108140001D0A20931C0A809148039091490397FDD2 |
:10815000079643E0959587954A95E1F790930E0A27 |
:1081600080930D0A3093290A2093280A9093200ABD |
:1081700080931F0A80915A0A90915B0AAC01440FC8 |
:10818000551F480F591F20913C0330913D03C901F1 |
:10819000880F991F880F991F820F931F820F931FBB |
:1081A000480F591F57FF02C04D5F5F4F55954795C8 |
:1081B0005595479550935B0A40935A0A80916A0AF5 |
:1081C00090916B0AAC01440F551F480F591F209125 |
:1081D0003E0330913F03C901880F991F880F991FF3 |
:1081E000820F931F820F931F480F591F57FF02C022 |
:1081F0004D5F5F4F559547955595479550936B0A41 |
:1082000040936A0A20913C0330913D03C901880FD5 |
:10821000991F880F991F820F931F820F931F9C0134 |
:10822000442737FD4095542F8091930490919404F6 |
:10823000A0919504B0919604820F931FA41FB51FBF |
:108240008093930490939404A0939504B093960420 |
:1082500020913E0330913F03C901880F991F880F79 |
:10826000991F820F931F820F931F9C01442737FD94 |
:108270004095542F80918F0490919004A091910487 |
:10828000B0919204820F931FA41FB51F80938F0497 |
:1082900090939004A0939104B09392048091320A39 |
:1082A0009091330A20913C0330913D03820F931F3C |
:1082B0009093330A8093320A8091620A9091630A04 |
:1082C00020913E0330913F03820F931F9093630AE6 |
:1082D0008093620A8091AB049091AC0401969093D4 |
:1082E000AC048093AB048091E0079091E10720916A |
:1082F000A9043091AA04821B930B9C01442737FDEB |
:108300004095542F80918B0490918C04A0918D0402 |
:10831000B0918E04820F931FA41FB51F80938B040E |
:1083200090938C04A0938D04B0938E048FEC809373 |
:108330007A001092180120917B0430917C044091C6 |
:108340007D0450917E0429873A874B875C872954A6 |
:108350003B46414050402CF028E43BE641E050E0F1 |
:108360000DC089859A85AB85BC85885B9449AE4FE5 |
:10837000BF4F4CF428EB34E94EEF5FEF2D833E8383 |
:108380004F83588708C089859A85AB85BC858D83C6 |
:108390009E83AF83B88720918304309184044091F9 |
:1083A0008504509186042D873E874F87588B29542A |
:1083B0003B46414050402CF028E43BE641E050E091 |
:1083C0000DC08D859E85AF85B889885B9449AE4F79 |
:1083D000BF4F4CF428EB34E94EEF5FEF29833A832B |
:1083E0004B835C8308C08D859E85AF85B889898362 |
:1083F0009A83AB83BC83A0915F0AB091600ABB8B68 |
:10840000AA8BFD01CF01AA2797FDA095BA2FA090B6 |
:108410007304B0907404C0907504D0907604A80ED4 |
:10842000B91ECA1EDB1EA0927304B0927404C092DF |
:108430007504D0927604E090660AF090670A009185 |
:10844000680A1091690AE80EF91E0A1F1B1FE092C4 |
:10845000660AF092670A0093680A1093690AF0911D |
:108460002C04F98BFF2309F098C180912B048823F9 |
:1084700009F093C18091560A86FF8FC180910D0A41 |
:1084800090910E0AAA2797FDA095BA2FBC01CD01A5 |
:1084900029813A814B815C810E94819F9B01AC01C3 |
:1084A00097FF04C02150384F4F4F5F4F6BE05595F9 |
:1084B0004795379527956A95D1F780916901682E80 |
:1084C000772488249924CA01B901A40193010E9448 |
:1084D000819FDC01CB018093C5049093C604A093D7 |
:1084E000C704B093C804B7FF04C08150904FAF4F8A |
:1084F000BF4F1C012D013CE05594479437942794BD |
:108500003A95D1F72092C5043092C6044092C70430 |
:108510005092C80480911C0A90911D0AAA2797FDC9 |
:10852000A095BA2FBC01CD012D813E814F81588588 |
:108530000E94819F97FF04C06150784F8F4F9F4FDB |
:108540002BE095958795779567952A95D1F7A401A6 |
:1085500093010E94819FDC01CB018093C904909319 |
:10856000CA04A093CB04B093CC04B7FF04C08150DD |
:10857000904FAF4FBF4F9C01AD018CE05595479593 |
:10858000379527958A95D1F72093C9043093CA046B |
:108590004093CB045093CC048091C5049091C604C1 |
:1085A0009093050A8093040A8091C9049091CA04AB |
:1085B0009093090A8093080A22193309440955093E |
:1085C0002093C9043093CA044093CB045093CC0445 |
:1085D000E20EF31E041F151FE092660AF092670A6E |
:1085E0000093680A1093690A809168018823B1F4A6 |
:1085F00057FF04C02F5F3F4F4F4F5F4F5595479533 |
:1086000037952795A21AB30AC40AD50AA092730413 |
:10861000B0927404C0927504D09276042A893B8982 |
:1086200079010027F7FC0095102F8091C9049091E3 |
:10863000CA04A091CB04B091CC04E80EF91E0A1F25 |
:108640001B1FC801B70129813A814B815C810E94BF |
:10865000819F9B01AC0197FF04C02150384F4F4FC1 |
:108660005F4FBBE05595479537952795BA95D1F75C |
:1086700080916A01A82EBB24CC24DD24CA01B90153 |
:10868000A60195010E94819FDC01CB018093BD046E |
:108690009093BE04A093BF04B093C004B7FF04C07E |
:1086A0008150904FAF4FBF4F3C014D01ACE09594CE |
:1086B000879477946794AA95D1F76092BD047092DD |
:1086C000BE048092BF049092C004C801B7012D81FE |
:1086D0003E814F8158850E94819F97FF04C0615061 |
:1086E000784F8F4F9F4FFBE09595879577956795CE |
:1086F000FA95D1F7A60195010E94819FDC01CB017B |
:108700008093C1049093C204A093C304B093C404A3 |
:10871000B7FF04C08150904FAF4FBF4FAC01BD01B8 |
:10872000ECE07595679557954795EA95D1F7409395 |
:10873000C1045093C2046093C3047093C4042A8993 |
:108740003B8937FF03C0309521953F4F21343105D8 |
:10875000E4F1D401C30197FE07C0B095A0959095B0 |
:1087600081959F4FAF4FBF4F81389105A105B1054E |
:1087700084F4DB01CA0177FF07C0B095A0959095FE |
:1087800081959F4FAF4FBF4F81389105A105B1052E |
:10879000E4F081E080935F0418C01092090A1092FF |
:1087A000080A1092050A1092040A1092C10410924D |
:1087B000C2041092C3041092C4041092BD0410921B |
:1087C000BE041092BF041092C0048091C104909125 |
:1087D000C204A091C304B091C404BC01CD0124E63D |
:1087E00030E040E050E00E94F59FE090BD04F09042 |
:1087F000BE04E21AF30AF0921B0AE0921A0A809170 |
:10880000BD049091BE04A091BF04B091C004BC010E |
:10881000CD0124E630E040E050E00E94F59FDA010F |
:10882000C9012091C1043091C2048C01021B130BB9 |
:108830001093100A00930F0A809142019091430116 |
:10884000A0914401B0914501BC01CD0128E631E081 |
:1088500040E050E00E94819F2091660A3091670AB3 |
:108860004091680A5091690A261737074807590747 |
:1088700064F0261B370B480B590B2093660A309384 |
:10888000670A4093680A5093690A2091660A3091FA |
:10889000670A4091680A5091690A57FF0CC0260F79 |
:1088A000371F481F591F2093660A3093670A409369 |
:1088B000680A5093690A60910D0A70910E0A6E0D54 |
:1088C0007F1D9B01442737FD4095542F80917704ED |
:1088D00090917804A0917904B0917A04820F931F4B |
:1088E000A41FB51F8093770490937804A093790414 |
:1088F000B0937A048091310490913204681B790B13 |
:10890000CB01AA2797FDA095BA2F29853A854B85DB |
:108910005C85820F931FA41FB51F80937B049093E7 |
:108920007C04A0937D04B0937E04C0908401D09019 |
:108930008501E0908601F0908701C816D906EA0605 |
:10894000FB06C4F488EA91E6A0E0B0E08C199D092A |
:10895000AE09BF0980937B0490937C04A0937D04AF |
:10896000B0937E048093770490937804A093790465 |
:10897000B0937A0422273327A9012C193D094E0907 |
:108980005F0980917B0490917C04A0917D04B0915B |
:108990007E0482179307A407B507B4F4D701C60174 |
:1089A000885A9146A040B04080937B0490937C0409 |
:1089B000A0937D04B0937E04809377049093780411 |
:1089C000A0937904B0937A0460911C0A70911D0AF7 |
:1089D000600F711F9B01442737FD4095542F8091F4 |
:1089E0007F0490918004A0918104B0918204820F51 |
:1089F000931FA41FB51F80937F0490938004A093BE |
:108A00008104B093820480912F0490913004681BFC |
:108A1000790BCB01AA2797FDA095BA2F2D853E850E |
:108A20004F855889820F931FA41FB51F809383041D |
:108A300090938404A0938504B0938604E090880109 |
:108A4000F090890100918A0110918B01E816F906D6 |
:108A50000A071B07C4F488EA91E6A0E0B0E08E198B |
:108A60009F09A00BB10B8093830490938404A0937F |
:108A70008504B093860480937F0490938004A09330 |
:108A80008104B093820422273327A9012E193F09BC |
:108A9000400B510B8091830490918404A091850434 |
:108AA000B091860482179307A407B507B4F4D801E0 |
:108AB000C701885A9146A040B040809383049093A8 |
:108AC0008404A0938504B093860480937F049093DC |
:108AD0008004A0938104B0938204809173049091E8 |
:108AE0007404A0917504B0917604809387049093E8 |
:108AF0008804A0938904B0938A04809183049091A0 |
:108B00008404A0918504B09186048093A30490937B |
:108B1000A404A093A504B093A60480917B04909133 |
:108B20007C04A0917D04B0917E0480939B0490937B |
:108B30009C04A0939D04B0939E0480917F04909127 |
:108B40008004A0918104B091820480939F0490934B |
:108B5000A004A093A104B093A20480917704909103 |
:108B60007804A0917904B0917A048093970490934B |
:108B70009804A0939904B0939A0480912401909151 |
:108B8000250197FD079633E0959587953A95E1F78E |
:108B900090931D0A80931C0A8091220190912301D9 |
:108BA00097FD079623E0959587952A95E1F7909391 |
:108BB0000E0A80930D0A80914403909145030F970C |
:108BC00034F488E19CEF90931D0A80931C0A8091F5 |
:108BD000440390914503079734F480E398EF909312 |
:108BE0001D0A80931C0A209103012A30A9F4809168 |
:108BF000440390914503835F934034F088EE93E003 |
:108C000090931D0A80931C0A809144039091450320 |
:108C10008A5F9340DCF014C0809144039091450337 |
:108C2000815D974034F088EE93E090931D0A809325 |
:108C30001C0A8091440390914503805E974034F074 |
:108C400080ED97E090931D0A80931C0A8091420367 |
:108C5000909143030F9734F488E19CEF90930E0AB0 |
:108C600080930D0A8091420390914303079734F457 |
:108C700080E398EF90930E0A80930D0A2A30A9F4AE |
:108C80008091420390914303835F934034F088EED8 |
:108C900093E090930E0A80930D0A80914203909185 |
:108CA00043038A5F9340DCF014C0809142039091AB |
:108CB0004303815D974034F088EE93E090930E0A71 |
:108CC00080930D0A8091420390914303805E974008 |
:108CD00034F080ED97E090930E0A80930D0A609136 |
:108CE0007701662309F4AFC040912401509125011A |
:108CF0008091CD049091CE04481B590B5093D4041D |
:108D00004093D3042091240130912501280F391F6D |
:108D100037FF02C02F5F3F4F359527953093CE0424 |
:108D20002093CD04413851051CF080E890E005C047 |
:108D300040585F4F34F480E89FEF9093D4048093C1 |
:108D4000D30440912201509123018091CF0490914E |
:108D5000D004481B590B5093D2044093D104209166 |
:108D6000220130912301280F391F37FF02C02F5FE6 |
:108D70003F4F359527953093D0042093CF04413849 |
:108D800051051CF080E890E005C040585F4F34F476 |
:108D900080E89FEF9093D2048093D104462F55270B |
:108DA0008091D3049091D404849FB001859F700D6D |
:108DB000949F700D11249B0177FF02C0215F3F4FEC |
:108DC000B4E035952795BA95E1F780911C0A90910A |
:108DD0001D0A820F931F90931D0A80931C0A809195 |
:108DE000D1049091D204849FD001859FB00D949FAF |
:108DF000B00D1124AD019D01B7FF02C0215F3F4FAF |
:108E0000A4E035952795AA95E1F780910D0A9091F8 |
:108E10000E0A820F931F90930E0A80930D0A809181 |
:108E2000240190912501860F971F9093250180932F |
:108E300024018091220190912301840F951F90932A |
:108E400023018093220100911F0A1091200A809132 |
:108E5000040A9091050A101611065CF59C0197FF13 |
:108E600004C022273327281B390BC901AA2797FDE5 |
:108E7000A095BA2F20916801332744275527BC01BC |
:108E8000CD010E94819F9B01AC0197FF04C0215C32 |
:108E90003F4F4F4F5F4FF6E05595479537952795D4 |
:108EA000FA95D1F780911A0A90911B0A820F931FAD |
:108EB00027C097FF03C0909581959F4FAA2797FDE4 |
:108EC000A095BA2F20916801332744275527BC016C |
:108ED000CD010E94819F9B01AC0197FF04C0215CE2 |
:108EE0003F4F4F4F5F4FE6E0559547953795279594 |
:108EF000EA95D1F780911A0A90911B0A821B930B75 |
:108F000090931B0A80931A0AE090280AF090290A8D |
:108F10008091080A9091090A1E141F045CF59C01B7 |
:108F200097FF04C022273327281B390BC901AA2722 |
:108F300097FDA095BA2F2091680133274427552724 |
:108F4000BC01CD010E94819F9B01AC0197FF04C031 |
:108F5000215C3F4F4F4F5F4F76E0559547953795D2 |
:108F600027957A95D1F780910F0A9091100A820F78 |
:108F7000931F27C097FF03C0909581959F4FAA2705 |
:108F800097FDA095BA2F20916801332744275527D4 |
:108F9000BC01CD010E94819F9B01AC0197FF04C0E1 |
:108FA000215C3F4F4F4F5F4F66E055954795379592 |
:108FB00027956A95D1F780910F0A9091100A821B2C |
:108FC000930B9093100A80930F0A8091560A87FFA3 |
:108FD00044C0B989BB2309F040C080912B04882389 |
:108FE000E1F5E1E0EE16E1E0FE064CF080911C0AAE |
:108FF00090911D0A8E0D9F1D805091400DC0F0E094 |
:10900000EF16FFEFFF0664F480911C0A90911D0A91 |
:109010008E0D9F1D80509F4F90931D0A80931C0AB8 |
:1090200021E0013012074CF080910D0A90910E0A58 |
:10903000800F911F805091400CC03FEF003013070C |
:1090400064F480910D0A90910E0A800F911F805058 |
:109050009F4F90930E0A80930D0AE2E1CD5E0C942F |
:109060002CA080914804882329F5809110048C7FDE |
:109070008093100480910F048F7D80930F04AAEBDE |
:10908000B5E0E7E1F9E09BE08091FB02882309F479 |
:109090008C938D91818312829150389697FFF4CFF3 |
:1090A0008091FB02882359F08091FB0281508093CC |
:1090B000FB0205C0809110048160809310048091B0 |
:1090C0006C03882319F010926C03089580936E034B |
:1090D0008093700380916A038E7F80936A0385EA90 |
:1090E0008093BC000895882319F480E090E00895EF |
:1090F000E82FFF27EE0FFF1FE858F64F8081918180 |
:1091000081589F4F8F3F910521F01CF08FEF90E029 |
:1091100004C097FF02C080E090E099270895CF93A4 |
:10912000DF93AAE4B4E0C5E4D8E057E08991E82FE2 |
:10913000FF27EE0FFF1FE858F64F0190F081E02D5A |
:10914000E158FF4FEF3FF10521F01CF0EFEFF0E0A9 |
:1091500004C0F7FF02C0E0E0F0E0893111F4EC93C5 |
:109160001BC04C91242F3327E217F307A9F0CF013E |
:10917000821B930B97FD03969595879595958795FB |
:10918000242F280F2C93822F9927E817F90714F41E |
:10919000215001C02F5F2C935150119657FFC6CF1D |
:1091A00080914F08883F38F0EFEFF0E0E81BF109BD |
:1091B000E65BFB4F808180937C0180917C0188235A |
:1091C00029F0843618F084E680937C018091510860 |
:1091D000883F38F0EFEFF0E0E81BF109E65BFB4F6A |
:1091E000808180937B0180917B01882329F08436E4 |
:1091F00018F084E680937B0180915E08883F38F008 |
:10920000EFEFF0E0E81BF109E65BFB4F8081809314 |
:109210007601809176018B3010F48AE002C08F3F96 |
:1092200011F48093760180918B08883F38F0EFEF3E |
:10923000F0E0E81BF109E65BFB4F80818093340A84 |
:109240008091340A863010F485E002C08F3F11F41B |
:109250008093340A80918D08883F38F0EFEFF0E07A |
:10926000E81BF109E65BFB4F808180935D0A8091EA |
:109270005D0A863010F485E002C08F3F11F48093C0 |
:109280005D0A80917808873F19F4429905C006C0AD |
:10929000863F31F4439B02C08CE815C086E413C0BE |
:1092A000883F38F0EFEFF0E0E81BF109E65BFB4F99 |
:1092B00080818093310A8091310A893110F488E1EC |
:1092C00002C08F3F11F48093310A80917908873F63 |
:1092D00019F4429905C006C0863F31F4439B02C091 |
:1092E0008CE815C086E413C0883F38F0EFEFF0E05B |
:1092F000E81BF109E65BFB4F808180930A0A8091AD |
:109300000A0A893110F488E102C08F3F11F480937A |
:109310000A0A80917A08883F38F0EFEFF0E0E81B06 |
:10932000F109E65BFB4F808180933A0A80913A0A0B |
:10933000893110F488E102C08F3F11F480933A0A1A |
:10934000809150080E9473488093260480915308AE |
:10935000883F38F0EFEFF0E0E81BF109E65BFB4FE8 |
:10936000808180937A0180915508883F38F0EFEF33 |
:10937000F0E0E81BF109E65BFB4F80818093780108 |
:1093800080915D08883F38F0EFEFF0E0E81BF109CD |
:10939000E65BFB4F80818093790180915F08883F75 |
:1093A00038F0EFEFF0E0E81BF109E65BFB4F80815E |
:1093B0008093750180916008883F38F0EFEFF0E00E |
:1093C000E81BF109E65BFB4F808180937701809178 |
:1093D0006108883F38F0EFEFF0E0E81BF109E65B49 |
:1093E000FB4F80818093740180916208883F38F040 |
:1093F000EFEFF0E0E81BF109E65BFB4F8081809323 |
:10940000730180916808883F38F0EFEFF0E0E81BC7 |
:10941000F109E65BFB4F80818093710180916908BF |
:10942000883F38F0EFEFF0E0E81BF109E65BFB4F17 |
:1094300080818093250480916A08883F38F0EFEF9F |
:10944000F0E0E81BF109E65BFB4F80818093240488 |
:1094500080916B08883F38F0EFEFF0E0E81BF109EE |
:10946000E65BFB4F80818093230480916C08883FEA |
:1094700038F0EFEFF0E0E81BF109E65BFB4F80818D |
:109480008093220480918608883F38F0EFEFF0E067 |
:10949000E81BF109E65BFB4F8081809321048091FA |
:1094A0008708883F38F0EFEFF0E0E81BF109E65B52 |
:1094B000FB4F80818093200480918808883F38F09A |
:1094C000EFEFF0E0E81BF109E65BFB4F8081809352 |
:1094D0001F0480918908883F38F0EFEFF0E0E81B27 |
:1094E000F109E65BFB4F808180931E0480916D083B |
:1094F000883F38F0EFEFF0E0E81BF109E65BFB4F47 |
:10950000808180936F0180917108883F38F0EFEF80 |
:10951000F0E0E81BF109E65BFB4F808180936E0170 |
:1095200080916E08883F38F0EFEFF0E0E81BF1091A |
:10953000E65BFB4F808180936D0180917208883FCC |
:1095400038F0EFEFF0E0E81BF109E65BFB4F8081BC |
:1095500080936C0180917B08883F38F0EFEFF0E05A |
:10956000E81BF109E65BFB4F808180936B018091E2 |
:109570007E08883F38F0EFEFF0E0E81BF109E65B8A |
:10958000FB4F808180936A0180917F08883F38F08B |
:10959000EFEFF0E0E81BF109E65BFB4F8081809381 |
:1095A000690180918008883F38F0EFEFF0E0E81B18 |
:1095B000F109E65BFB4F8081809368018091A808E8 |
:1095C000883F38F0EFEFF0E0E81BF109E65BFB4F76 |
:1095D00080818093190A90912505992321F080912B |
:1095E000190A981720F08091190A882311F4909392 |
:1095F000190A80914D088093560A8091B208809391 |
:10960000390A80918508883F38F0EFEFF0E0E81BD9 |
:10961000F109E65BFB4F8081809367018091A1088F |
:10962000883F38F0EFEFF0E0E81BF109E65BFB4F15 |
:10963000808180936D0A80917101282F33272F5FDD |
:109640003F4F8CE398E2B9010E94C09F70937E0166 |
:1096500060937D0180915B0880935E0A80915A0837 |
:109660008093210AE091A308EE2309F449C081E028 |
:1096700080931D04FF27EE0FFF1FE858F64F8081EF |
:109680009181805C9F4F14F410921D0480917F01A2 |
:1096900020911D04821721F18330F8F43091AC0140 |
:1096A000222351F08CED95E090931E0380931D03CF |
:1096B000332369F48EE209C088EC90E090931E0396 |
:1096C00080931D03332319F487E18093AC0185E077 |
:1096D0008093330420937F0103C0815080937F01E6 |
:1096E0008091AD0A9091AE0A97FF0FC080911D0442 |
:1096F000882359F08091B50580688093B50505C031 |
:10970000E0931D048AE080937F018091AD0A9091DF |
:10971000AE0A97FF1DC0809148048823C9F080914C |
:109720001D048823A9F080910B0190910C018F5F9B |
:109730009F4F71F488E99AE390931E0380931D0371 |
:1097400080E094EA90930C0180930B0110921D0429 |
:1097500080911D04882321F080910F04816003C053 |
:1097600080910F048E7F80930F04DF91CF91089535 |
:10977000A7E1B0E0EEEBFBE40C9410A00E947F4068 |
:1097800080911004992784719070892B91F58091B4 |
:10979000B30882FF27C080912D0490912E0400977A |
:1097A000F1F002E088359007D4F49C0197FF02C0E5 |
:1097B0002D5F3F4F35952795359527958091650805 |
:1097C0009927289FA001299F500D389F500D1124E3 |
:1097D000CA0164E670E00E94C09FCB0106C08DE222 |
:1097E00090E003C080916508992790930E048093C0 |
:1097F0000D0420910B0430910C0455E720333507FC |
:1098000059F410925404109253048091210A99271C |
:1098100090930E0480930D0460915304709154044E |
:109820007A8369838091210A99270A9668177907B4 |
:1098300014F49A83898380914904843608F06AC0BD |
:1098400080910F0482FD66C08091E9049091EA0442 |
:10985000009731F001979093EA048093E9040BC0DC |
:109860001092480490931204809311048091100484 |
:109870008D7E80931004809103018A3011F0843131 |
:1098800010F0289A01C02898809111049091120438 |
:10989000895E9340E0F18091F10A8536C0F18091B4 |
:1098A0000D0490910E049A83898380911004806145 |
:1098B0008093100480914108A82FBB27AA0FBB1FDB |
:1098C000FD01E254F64F1182108280914208282F48 |
:1098D0003327220F331FC9018254964FFC01118296 |
:1098E0001082A858B64F11961C921E922858364FD7 |
:1098F000D90111961C921E9280914408E82FFF27EF |
:10990000EE0FFF1FE858F64F11821082B4C5109277 |
:109910004804B1C5809149048D3808F482C59091FE |
:10992000AC08992309F445C08091AD08882309F457 |
:1099300040C0E92FFF27EE0FFF1FE858F64F808148 |
:109940009181C397BCF080919401823361F480913E |
:109950000F0485FF08C080910F04806480930F047A |
:1099600080E38093AC0180910F048F7780930F0484 |
:1099700086E917C0808191818E5C9F4FACF4809105 |
:109980009401863941F480910F04806880930F041C |
:109990008FE28093AC0180910F048F7B80930F0442 |
:1099A00082E38093940105C080910F048F738093AC |
:1099B0000F04809110048F7E8093100490916608AC |
:1099C00082E3989FC00111249093EA048093E904F4 |
:1099D000E981FA81B9978CF080914804882369F075 |
:1099E0008091110490911204FFEF8F3F9F0729F09F |
:1099F00001969093120480931104409111045091A8 |
:109A000012044F3F510509F048F510926B04109273 |
:109A10006C0410926D0410926E0410926704109200 |
:109A200068041092690410926A041092D50410928E |
:109A3000D6041092D7041092D80410927304109296 |
:109A40007404109275041092760480910F04806261 |
:109A500080930F0484E68093940135C180911004B3 |
:109A600082608093100480910F0485FF98C08091DC |
:109A7000260599279C012470307082FD04C08091D6 |
:109A80000F0486FF2AC0809141018D3331F580910A |
:109A90000804882311F180E58093380484EF91E075 |
:109AA000A0E0B0E08093390490933A04A0933B0483 |
:109AB000B0933C0480933F0490934004A0934104EE |
:109AC000B093420488EE93E09093930180939201C7 |
:109AD000232B19F08DE08093AC01809129039091A4 |
:109AE0002A03A0912B03B0912C0387399105A1057E |
:109AF000B1058CF48091430490914404A0914504F5 |
:109B0000B0914604825A9E4FAF4FBF4F24F08091D0 |
:109B1000560A80FD21C088EE93E0909393018093D4 |
:109B2000920180910F0486FF0FC0109238048CE2DE |
:109B300091E0A0E0B0E080933F0490934004A093B4 |
:109B40004104B093420403C080E38093AC01809150 |
:109B50000F048F7180930F0410926B0410926C04A9 |
:109B600010926D0410926E041092670410926804B3 |
:109B70001092690410926A04109273041092740493 |
:109B80001092750410927604495E534008F49BC00D |
:109B900088EE93E0909312048093110494C0809116 |
:109BA0000F0487FF1AC080914101863711F08D3371 |
:109BB000A1F480910804882381F08091AD088093FE |
:109BC000380480EE91EBAFEFBFEF809339049093B0 |
:109BD0003A04A0933B04B0933C042091920130914D |
:109BE000930143E0283E340708F048C02F5F3F4F01 |
:109BF000309393012093920110926B0410926C04A5 |
:109C000010926D0410926E04109267041092680412 |
:109C10001092690410926A041092730410927404F2 |
:109C200010927504109276048091290390912A0372 |
:109C3000A0912B03B0912C038C529140A040B040D6 |
:109C400080933F0490934004A0934104B093420456 |
:109C5000285E3340C1F580910F0487FF34C08091A6 |
:109C600041018B3281F180910F048F7780930F0433 |
:109C700080910F04806280930F0425C080910804B6 |
:109C8000882309F180914101863711F08D32D9F492 |
:109C90008091430490914404A0914504B0914604FE |
:109CA000885E9340A040B04074F48091E0079091AA |
:109CB000E1078D5A93403CF010929301109292016B |
:109CC0008EE08093AC0180914308E82FFF27EE0FD0 |
:109CD000FF1FE858F64F80819181813591050CF482 |
:109CE00054C120914804222309F04FC180914408B7 |
:109CF000E82FFF27EE0FFF1FE858F64F8081918174 |
:109D00008C3491050CF411C18091EB048F5F80932A |
:109D1000EB04893C08F439C12093EB04109212043F |
:109D20001092110430914108E32FFF27EE0FFF1F1F |
:109D3000E858F64F8081918187349105B4F4809181 |
:109D40004208E82FFF27EE0FFF1FE858F64F8081EB |
:109D500091810190F081E02DF7FF03C0F095E1952E |
:109D6000FF4FE734F1050CF478C041E02091420840 |
:109D7000A22FBB27AA0FBB1FA858B64F8D919C914D |
:109D800011978734910544F0E32FFF27EE0FFF1F53 |
:109D9000E858F64F808191818D919C91873491058F |
:109DA00074F080914108E82FFF27EE0FFF1FE8585D |
:109DB000F64F80819181873491050CF042E0E22FCB |
:109DC000FF27EE0FFF1FE858F64F80819181863400 |
:109DD000910574F480914108E82FFF27EE0FFF1FD3 |
:109DE000E858F64F80819181873491050CF043E06B |
:109DF000E22FFF27EE0FFF1FE858F64F8081918179 |
:109E00008A5B9F4F74F480914108E82FFF27EE0F83 |
:109E1000FF1FE858F64F80819181873491050CF03F |
:109E200044E0E22FFF27EE0FFF1FE858F64F808136 |
:109E300091818A5B9F4F74F480914108E82FFF273E |
:109E4000EE0FFF1FE858F64F80819181863491050F |
:109E50000CF445E0842F0E94313180914208E82FB4 |
:109E6000FF27EE0FFF1FE858F64F80819181019088 |
:109E7000F081E02DF7FF03C0F095E195FF4F7E974D |
:109E8000CCF480914108E82FFF27EE0FFF1FE85820 |
:109E9000F64F808191818A5B9F4F64F481E08093CB |
:109EA000D0051092340488EE93E090931E038093C3 |
:109EB0001D036BC0809101010E94DC3080E00E9494 |
:109EC000630A809167080E94B09A8091560A80FFC9 |
:109ED00010C080911C0190911D01875B934038F464 |
:109EE00080911C0190911D018E5E924010F40E94A1 |
:109EF000221F81E00E94083D982F8093340421E0C6 |
:109F000020931B03579A8091B505882311F087E0B1 |
:109F100006C0992319F42093AC0103C088E1809313 |
:109F2000AC0185E08093520527C080819181855BDB |
:109F30009F4F4CF58091EB048F5F8093EB04893C3D |
:109F400020F1209348042093EB0410921204109205 |
:109F5000110482E00E94083D982F80933404809180 |
:109F6000B505882311F087E005C0992311F481E03D |
:109F700001C088E18093AC0168E770E08091010145 |
:109F80000E94243C02C02093EB0480914308E82FF8 |
:109F9000FF27EE0FFF1FE858F64F808191818C5903 |
:109FA0009F4F0CF037C22091A408E22FFF27EF77D4 |
:109FB000F070EE0FFF1FE254F64F808191810697FB |
:109FC00014F084E606C0808191818B5F9F4F1CF462 |
:109FD0008CE98093EE0480914804E0914408882342 |
:109FE00009F063C1FF27EE0FFF1FE858F64F80818D |
:109FF00091818C599F4F9CF48091B30883FD0BC0D5 |
:10A00000E22FFF27EE0FFF1FE858F64F8081918166 |
:10A01000855B9F4FDCF08091A4088823B9F0809184 |
:10A02000B30883FF3FC18091A408E82FFF27EE0FFC |
:10A03000FF1FE858F64F80819181875F9F4F0CF496 |
:10A0400031C18091EE04843609F02CC18091340432 |
:10A05000882329F0809110048860809310048091F7 |
:10A060001E0190911F01A0912001B09121018093C8 |
:10A07000E2079093E307A093E407B093E5071092FB |
:10A08000290310922A0310922B0310922C03109292 |
:10A090004304109244041092450410924604109216 |
:10A0A00036031092370310923803109239038091CF |
:10A0B0004108E82FFF27EE0FFF1FE858F64F808179 |
:10A0C00091818D599F4FACF480914208E82FFF2772 |
:10A0D000EE0FFF1FE858F64F808191810190F081CB |
:10A0E000E02DF7FF03C0F095E195FF4FE436F10551 |
:10A0F00034F48091A408882311F48093EC048091B7 |
:10A10000EC048F5F8093EC048E3F08F466C180916D |
:10A110005F0A9091600A97FF03C0909581959F4FC9 |
:10A120008197B4F480911C0A90911D0A97FF03C097 |
:10A13000909581959F4F45975CF480910D0A909181 |
:10A140000E0A97FF03C0909581959F4F459714F095 |
:10A15000109234041092EC048091B505882309F024 |
:10A1600094C080913404882309F48FC080912A051B |
:10A17000882309F08AC081E090E0909312048093D4 |
:10A18000110481E0809348041092D5041092D60403 |
:10A190001092D7041092D804109273041092740491 |
:10A1A000109275041092760410926F04109270044D |
:10A1B000109271041092720480915C08E82EFF24C2 |
:10A1C0000027112780915A0A90915B0A9C0144272D |
:10A1D00037FD4095542FC801B7010E94819FDC01D3 |
:10A1E000CB018093830490938404A0938504B0935F |
:10A1F000860480916A0A90916B0A9C01442737FD7E |
:10A200004095542FC801B7010E94819FDC01CB010A |
:10A2100080937B0490937C04A0937D04B0937E0490 |
:10A220008091A3049091A404A091A504B091A604E8 |
:10A2300080937F0490938004A0938104B093820460 |
:10A2400080919B0490919C04A0919D04B0919E04E8 |
:10A250008093770490937804A0937904B0937A0460 |
:10A2600010926B0410926C0410926D0410926E04A4 |
:10A2700010926704109268041092690410926A04A4 |
:10A2800084E68093330484E39AC08CED95E0909348 |
:10A290001E0380931D0380913404882309F09DC020 |
:10A2A00081E08DC01092EC0498C0FF27EE0FFF1FD5 |
:10A2B000E858F64F80819181853691059CF0809118 |
:10A2C000B30883FD0BC0E22FFF27EE0FFF1FE858F6 |
:10A2D000F64F80819181855B9F4FDCF08091A408CF |
:10A2E0008823B9F08091B30883FF75C08091A408DA |
:10A2F000E82FFF27EE0FFF1FE858F64F808191816E |
:10A300008E5C9F4F0CF067C08091EE048C3909F091 |
:10A3100062C080914108E82FFF27EE0FFF1FE85829 |
:10A32000F64F808191818D599F4FACF48091420806 |
:10A33000E82FFF27EE0FFF1FE858F64F808191812D |
:10A340000190F081E02DF7FF03C0F095E195FF4FFC |
:10A35000E436F1053CF48091A408882319F4809335 |
:10A36000ED0418C010926B0410926C0410926D04EE |
:10A3700010926E041092670410926804109269049F |
:10A3800010926A0410925A041092590410925804C0 |
:10A39000109257048091ED048F5F8093ED048B3F02 |
:10A3A00088F0109248041092ED041092120410925A |
:10A3B000110480910F048F7180930F0486E28093C3 |
:10A3C000AC010BC0843649F48CEA9DE090931E03E7 |
:10A3D00080931D0302C01092ED0420910B04309174 |
:10A3E0000C04F3E0283E3F0708F045C0809133039A |
:10A3F000909134038B569F4F1CF02F5F3F4F05C049 |
:10A4000021153105C1F12150304030930C042093C7 |
:10A410000B0431C01092EE0410920C0410920B0445 |
:10A420002AC02E5E324038F18091750A9091760AEA |
:10A430008059914000F58091430490914404A0918B |
:10A440004504B09146048C5D9540A040B0409CF41A |
:10A4500080E395E790930C0480930B0480911104A2 |
:10A46000909112048A5E934030F089EE93E09093CD |
:10A470001204809311048091400181508093400127 |
:10A48000809140018F3F21F08091100484FFDFC351 |
:10A490000E948F48B09057088091F7049091F8047B |
:10A4A0009C01220F331F280F391FC0904108AC2D8B |
:10A4B000BB27AA0FBB1FFD01E858F64F4B2D5527B0 |
:10A4C00080819181849FB001859F700D949F700D54 |
:10A4D0001124260F371F37FF02C02D5F3F4FB901F0 |
:10A4E0007595679575956795A254B64F80915808F4 |
:10A4F000082F11278D919C91809FD001819FB00DD5 |
:10A50000909FB00D11246A0F7B1F7093F804609325 |
:10A51000F7048091F9049091FA049C01220F331FF3 |
:10A52000280F391FD0904208AD2DBB27AA0FBB1FA3 |
:10A53000FD01E858F64F80819181849FF001859F4D |
:10A54000F00D949FF00D11242E0F3F1F37FF02C016 |
:10A550002D5F3F4FA9015595479555954795A254B5 |
:10A56000B64F8D919C91809F7001819FF00C909FC0 |
:10A57000F00C11244E0D5F1D5093FA044093F90422 |
:10A5800080911D04882309F448C0CB0177FD039610 |
:10A59000DC01B595A795B595A795CA0157FD03961A |
:10A5A000FC01F595E795F595E7958091A501682F54 |
:10A5B000772767FD70956A9F90016B9F300D7A9F9A |
:10A5C000300D112480912C05482F552747FD5095BB |
:10A5D0004E9FC0014F9F900D5E9F900D1124280F3C |
:10A5E000391F37FF02C0295F3F4F03E0359527959C |
:10A5F0000A95E1F730935A04209359046E9F900115 |
:10A600006F9F300D7E9F300D11244A9FC0014B9FDC |
:10A61000900D5A9F900D11243FC08091A208E82F01 |
:10A62000FF27E85BFE4F86818093A5019081909380 |
:10A630002C05A82FBB27A7FDB095A69F9001A79F2B |
:10A64000300DB69F300D1124E92FFF27E7FDF0955F |
:10A65000E49FC001E59F900DF49F900D1124280FF9 |
:10A66000391F37FF02C0295F3F4F13E0359527950B |
:10A670001A95E1F730935A0420935904A49F90014E |
:10A68000A59F300DB49F300D1124E69FC001E79FB8 |
:10A69000900DF69F900D1124281B390B37FF02C037 |
:10A6A000295F3F4F43E0359527954A95E1F7309371 |
:10A6B00058042093570480914408E82FFF27EE0F99 |
:10A6C000FF1FE858F64F80819181909581959F4FAB |
:10A6D00090935604809355048530910514F00497A7 |
:10A6E00005C00FEF8C3F900734F404969093560406 |
:10A6F0008093550404C01092560410925504809122 |
:10A700000B0490910C048150924078F1809159048F |
:10A7100090915A0497FD079623E0959587952A9581 |
:10A72000E1F790935A0480935904809157049091D3 |
:10A73000580497FD079603E0959587950A95E1F7EC |
:10A74000909358048093570410926B0410926C04F9 |
:10A7500010926D0410926E041092670410926804B7 |
:10A760001092690410926A0443C0809118058823EE |
:10A7700009F43EC0282F33278091590490915A0440 |
:10A7800097FD079613E0959587951A95E1F7289F11 |
:10A79000A001299F500D389F500D1124CA0157FD6B |
:10A7A0000F96B4E095958795BA95E1F790935A0482 |
:10A7B00080935904809157049091580497FD07960F |
:10A7C000A3E095958795AA95E1F7289FB001299F69 |
:10A7D000700D389F700D1124CB0177FD0F96F4E0BA |
:10A7E00095958795FA95E1F79093580480935704CF |
:10A7F0008090590490905A0480911B0590911C05FB |
:10A80000881A990A90925A04809259040091570428 |
:10A81000109158048091190590911A05081B190B85 |
:10A82000109358040093570480914308E82FFF27A2 |
:10A83000EE0FFF1FE858F64FE080F1808FE790E0C1 |
:10A84000E80EF91EF0925404E092530480917601D0 |
:10A850009927AA2797FDA095BA2FBC01CD010E9488 |
:10A86000F59EDC01CB0120E030E040E251E4BC0188 |
:10A87000CD010E94639EDC01CB01BC01CD010E9491 |
:10A88000C79EDC01CB018093640A8091750180939F |
:10A890003B0A809174019927AA2797FDA095BA2FAA |
:10A8A000BC01CD010E94F59EDC01CB0120E030E02F |
:10A8B00040E251E4BC01CD010E94639EDC01CB016A |
:10A8C000BC01CD010E94C79EDC01CB018093140A1C |
:10A8D0008091730180932A0A8091DC0580FF59C022 |
:10A8E00080916D0A813808F454C08091D50599276C |
:10A8F00087FD90952B2D3327829FD001839FB00D2C |
:10A90000929FB00D11248A0E9B1E90925A04809241 |
:10A9100059048091D605992787FD9095829FF00173 |
:10A92000839FF00D929FF00D11240E0F1F1F1093A7 |
:10A930005804009357048091D705282F332727FD0B |
:10A9400030958091550490915604820F931F9093F7 |
:10A950005604809355048091D905282F332727FD6D |
:10A960003095809152089927289F8001299F100DCA |
:10A97000389F100D112410934701009346018091D8 |
:10A98000D80599278E159F0524F49093540480933D |
:10A990005304809153049091540497FF04C0109283 |
:10A9A0005404109253048091560A82FF02C0109200 |
:10A9B0003B0A4091590450915A04CA0157FD03962D |
:10A9C0009C01359527953595279537FF03C0309520 |
:10A9D00021953F4F8091150490911604821793079B |
:10A9E000B4F4CA0157FF03C0909581959F4F97FD1E |
:10A9F00003969595879595958795909316048093E2 |
:10AA000015048536910544F084E690E001C0019775 |
:10AA10009093160480931504409157045091580464 |
:10AA2000CA0157FD03969C013595279535952795C5 |
:10AA300037FF03C0309521953F4F809113049091CB |
:10AA4000140482179307B4F4CA0157FF03C090950A |
:10AA500081959F4F97FD0396959587959595879539 |
:10AA600090931404809313048536910544F084E692 |
:10AA700090E001C001979093140480931304809197 |
:10AA8000100484FF08C0109216041092150410924E |
:10AA9000140410921304ED2DFF27EE0FFF1FE8584A |
:10AAA000F64F40917C08242F33278081918128170D |
:10AAB000390744F48091B00882FF04C081E080939C |
:10AAC0002A0413C0ED2DFF27EE0FFF1FE858F64FA5 |
:10AAD000842F992720917D08821B91092081318143 |
:10AAE0002817390714F410922A0440914208E42FE1 |
:10AAF000FF27EE0FFF1FE858F64F50917C08852F77 |
:10AB0000992722273327281B390B808191818217AF |
:10AB1000930744F48091B00883FF04C081E08093E0 |
:10AB2000290416C080912904882391F0E42FFF277F |
:10AB3000EE0FFF1FE858F64F80917D089927851B7F |
:10AB40009109208131818217930714F4109229040E |
:10AB5000EC2DFF27EE0FFF1FE858F64F40917C08C1 |
:10AB6000242F3327808191812817390744F480915D |
:10AB7000B00880FF04C081E08093270417C0809153 |
:10AB80002704882399F0EC2DFF27EE0FFF1FE858CC |
:10AB9000F64F842F992720917D08821B91092081EF |
:10ABA00031812817390714F4109227044091410885 |
:10ABB000E42FFF27EE0FFF1FE858F64F50917C0857 |
:10ABC000852F992722273327281B390B80819181D4 |
:10ABD0008217930744F48091B00881FF04C081E09C |
:10ABE0008093280416C080912804882391F0E42FD4 |
:10ABF000FF27EE0FFF1FE858F64F80917D08992739 |
:10AC0000851B9109208131818217930714F41092DA |
:10AC1000280480912A04882319F480912904811141 |
:10AC200081E080932B0480912704882321F4809174 |
:10AC30002804882351F081E080932C0410922B0487 |
:10AC400010922A041092290402C080932C0480914F |
:10AC50002B04882321F480912C04882369F08091AF |
:10AC60007B08992729813A818217930714F49A83E4 |
:10AC7000898381E080935F0480910F0499279C0170 |
:10AC80002470307082FF2DC080911B0590911C05AF |
:10AC9000909581959F4F90935A0480935904809189 |
:10ACA000190590911A05909581959F4F909358049E |
:10ACB0008093570480918201909183019093540472 |
:10ACC000809353048091560A8B778B668093560A43 |
:10ACD0008091390A8C7B8093390A88EC8093260412 |
:10ACE0001EC08091100484FF1AC030935604209334 |
:10ACF000550430935A0420935904309358042093F8 |
:10AD000057049AE59093640A88E780933B0A9093EE |
:10AD1000140A80932A0A10922B0410922C0480911A |
:10AD20002D0A90912E0AA0912F0AB091300A2091FD |
:10AD3000A3043091A4044091A5045091A604820F6D |
:10AD4000931FA41FB51F80932D0A90932E0AA093E2 |
:10AD50002F0AB093300A8091350A9091360AA0915B |
:10AD6000370AB091380AE0909B04F0909C0400915F |
:10AD70009D0410919E04EB82FC820D831E838E0D38 |
:10AD80009F1DA01FB11F8093350A9093360AA09390 |
:10AD9000370AB093380A8091220A9091230AA09131 |
:10ADA000240AB091250AE0909F04F090A00400913D |
:10ADB000A1041091A204EF82F88609871A878E0DEC |
:10ADC0009F1DA01FB11F8093220A9093230AA09376 |
:10ADD000240AB093250A8091150A9091160AA09131 |
:10ADE000170AB091180AE0909704F0909804009127 |
:10ADF000990410919A04EB86FC860D871E878E0DB0 |
:10AE00009F1DA01FB11F8093150A9093160AA0934F |
:10AE1000170AB093180AF0902C04FF86FF2029F43B |
:10AE200080912B04882309F460C01092930410923F |
:10AE30009404109295041092960410928F0410922C |
:10AE40009004109291041092920410922D0A109284 |
:10AE50002E0A10922F0A1092300A1092350A109280 |
:10AE6000360A1092370A1092380A1092220A10926B |
:10AE7000230A1092240A1092250A1092150A1092A1 |
:10AE8000160A1092170A1092180A80918304909162 |
:10AE90008404A0918504B091860480937F049093EC |
:10AEA0008004A0938104B093820480917B049091EC |
:10AEB0007C04A0917D04B0917E04809377049093EC |
:10AEC0007804A0937904B0937A041092320310921C |
:10AED00031031092300410922F0410923204109219 |
:10AEE00031040F85002309F0D0C180912B04882301 |
:10AEF00009F0CBC18091E0079091E1078150924029 |
:10AF00002CF480914804882309F4BFC19090E60A8C |
:10AF1000A0905C0820905A0A30905B0A40906A0A20 |
:10AF200050906B0A19140CF0BBC0BB24CC24DD2458 |
:10AF3000CA01B901A60195010E94F59F79018A0114 |
:10AF40008091AF0A9091B00A281A390AC101AA2744 |
:10AF500097FDA095BA2FE81AF90A0A0B1B0B6B8113 |
:10AF60007C818D819E81A60195010E94F59F5901EA |
:10AF70006A018091B10A9091B20A481A590AC20135 |
:10AF8000AA2797FDA095BA2FA81AB90ACA0ADB0A00 |
:10AF9000292C332427FC3094432C532CC801B701AF |
:10AFA000A20191010E94819F97FF04C061507E4FD2 |
:10AFB0008F4F9F4F3B014C0109E095948794779404 |
:10AFC00067940A95D1F7C601B501A20191010E94CB |
:10AFD000819F97FF04C061507E4F8F4F9F4F5B0151 |
:10AFE0006C0119E0D594C794B794A7941A95D1F73A |
:10AFF0008091150490911604813491053CF4809160 |
:10B0000013049091140481349105D4F0D401C30148 |
:10B0100097FE03C00196A11DB11D3C014D01959401 |
:10B02000879477946794D601C501D7FE03C0019633 |
:10B03000A11DB11D5C016D01D594C794B794A7946F |
:10B040008091E80A282F332727FD3095432F532F6F |
:10B05000261537054805590514F439014A01992781 |
:10B0600087FD9095909581959F4FAA2797FDA09574 |
:10B07000BA2F681679068A069B0614F43C014D0126 |
:10B080002A153B054C055D0514F459016A01A81603 |
:10B09000B906CA06DB060CF0D0C05C016D01CDC05C |
:10B0A000EA2CFF2400271127CA01B901A801970142 |
:10B0B0000E94F59F39014A01C101AA2797FDA09579 |
:10B0C000BA2F681A790A8A0A9B0A6B817C818D8162 |
:10B0D0009E81A80197010E94F59F59016A01C20152 |
:10B0E000AA2797FDA095BA2FA81AB90ACA0ADB0A9F |
:10B0F000D401C30197FE03C00F96A11DB11D3C01F1 |
:10B100004D01F4E09594879477946794FA95D1F77C |
:10B11000D601C501D7FE03C00F96A11DB11D5C016C |
:10B120006D01E4E0D594C794B794A794EA95D1F75C |
:10B130008091150490911604813491053CF480911E |
:10B1400013049091140481349105A4F0C401B30157 |
:10B1500023E030E040E050E00E94F59F39014A01D1 |
:10B16000C601B50123E030E040E050E00E94F59FC9 |
:10B1700059016A0180914408E82FFF27EE0FFF1F55 |
:10B18000E858F64F808191810190F081E02DF7FF22 |
:10B1900003C0F095E195FF4F7A97A4F0C401B30185 |
:10B1A00023E030E040E050E00E94F59F39014A0181 |
:10B1B000C601B50123E030E040E050E00E94F59F79 |
:10B1C00059016A0189E180938E0121E262167104BE |
:10B1D000810491042CF070E2672E712C812C912C4B |
:10B1E00030EE63163FEF73063FEF83063FEF9306A3 |
:10B1F00044F460EE662E6FEF762E6FEF862E6FEFC3 |
:10B20000962E41E2A416B104C104D1042CF050E200 |
:10B21000A52EB12CC12CD12C50EEA5165FEFB50692 |
:10B220005FEFC5065FEFD50644F440EEA42E4FEF66 |
:10B23000B42E4FEFC42E4FEFD42E80918304909103 |
:10B240008404A0918504B091860486199709A80901 |
:10B25000B9098093830490938404A0938504B093E8 |
:10B26000860480917B0490917C04A0917D04B09130 |
:10B270007E048A199B09AC09BD0980937B049093D5 |
:10B280007C04A0937D04B0937E048091310390915F |
:10B2900032038F3F910509F008F4C4C56F8566231A |
:10B2A00009F04EC580912B04882309F049C580918F |
:10B2B0005F04882309F044C570918408788B772354 |
:10B2C00009F43EC580912D0A90912E0AA0912F0A73 |
:10B2D000B091300AB7FF04C081509F4FAF4FBF4FAE |
:10B2E000E92EFA2E0B2F112707FD1A95E0922D0A51 |
:10B2F000F0922E0A00932F0A1093300A8091350A9B |
:10B300009091360AA091370AB091380AB7FF04C06D |
:10B3100081509F4FAF4FBF4F892F9A2FAB2FBB2725 |
:10B32000A7FDBA95898B9A8BAB8BBC8B8093350A22 |
:10B330009093360AA093370AB093380A80915C083C |
:10B34000A82EBB24CC24DD242091930430919404B6 |
:10B350004091950450919604C601B5010E94819FC9 |
:10B3600097FF04C061507F4F8F4F9F4F672E782EFD |
:10B37000892E992487FC9A94609293047092940485 |
:10B38000809295049092960420918F0430919004BD |
:10B390004091910450919204C601B5010E94819F91 |
:10B3A00097FF04C061507F4F8F4F9F4F272E382E3D |
:10B3B000492E552447FC5A9420928F0430929004D1 |
:10B3C000409291045092920480918B0490918C044D |
:10B3D000A0918D04B0918E04B7FF04C081509F4F9F |
:10B3E000AF4FBF4F892F9A2FAB2FBB27A7FDBA9521 |
:10B3F00080938B0490938C04A0938D04B0938E045F |
:10B40000D801C70186199709A809B9098093E104F1 |
:10B410009093E204A093E304B093E40420918308A2 |
:10B42000E22EFF2400271127BC01CD01A8019701BE |
:10B430000E94F59F59016A012093EF043093F004B4 |
:10B440004093F1045093F20489899A89AB89BC89AD |
:10B4500082199309A409B5098093E5049093E60441 |
:10B46000A093E704B093E804BC01CD01A8019701C3 |
:10B470000E94F59F2093F3043093F4044093F50465 |
:10B480005093F604D601C501D7FE04C081509F4FEA |
:10B49000AF4FBF4F892F9A2FAB2FBB27A7FDBA9570 |
:10B4A0009093300480932F0457FF04C021503F4FE6 |
:10B4B0004F4F5F4FBB2757FDBA95A52F942F832F72 |
:10B4C0009093320480933104809115049091160476 |
:10B4D00081349105DCF4809113049091140481343B |
:10B4E0009105A4F480914408E82FFF27EE0FFF1F79 |
:10B4F000E858F64F808191810190F081E02DF7FFAF |
:10B5000003C0F095E195FF4F7A97E4F08091E60A49 |
:10B510008F3FC1F480912F049091300497FD0196E4 |
:10B52000959587959093300480932F0480913104F2 |
:10B530009091320497FD01969595879590933204EA |
:10B54000809331048091220A9091230AA091240AC9 |
:10B55000B091250AB7FF04C081509F4FAF4FBF4F36 |
:10B56000892F9A2FAB2FBB27A7FDBA958093220A6C |
:10B570009093230AA093240AB093250A8091150A78 |
:10B580009091160AA091170AB091180AB7FF04C04B |
:10B5900081509F4FAF4FBF4F892F9A2FAB2FBB27A3 |
:10B5A000A7FDBA958093150A9093160AA093170ADF |
:10B5B000B093180A8091A3049091A404A091A504CB |
:10B5C000B091A6042F81388549855A85281B390BEF |
:10B5D0004A0B5B0B2093D9043093DA044093DB04CD |
:10B5E0005093DC0480919B0490919C04A0919D0455 |
:10B5F000B0919E04EB84FC840D851E85E81AF90A3F |
:10B600000A0B1B0BE092DD04F092DE040093DF04D2 |
:10B610001093E0042093E1043093E2044093E304A8 |
:10B620005093E404E092E504F092E6040093E7040A |
:10B630001093E80480917F0490918004A09181048C |
:10B64000B0918204821B930BA40BB50B80937F04F3 |
:10B6500090938004A0938104B09382048091770436 |
:10B6600090917804A0917904B0917A048E199F0981 |
:10B67000A00BB10B8093770490937804A093790486 |
:10B68000B0937A0488898823E1F020915D04309199 |
:10B690005E04213831054CF08091B5049091B604D8 |
:10B6A00001969093B6048093B50420583F4F4CF414 |
:10B6B0008091B5049091B60401979093B60480935D |
:10B6C000B50410925E0410925D0481E090E09093C6 |
:10B6D000FC048093FB04E090E104F090E20400910C |
:10B6E000E3041091E404D801C70117FF07C08827BD |
:10B6F0009927DC018E199F09A00BB10B8150924054 |
:10B70000A040B04034F084E090E09093FC0480933B |
:10B71000FB048091010590910205A0910305B09171 |
:10B72000040520912D0A30912E0A40912F0A509144 |
:10B73000300A821B930BA40BB50B815E914BAF4F6C |
:10B74000BF4F8F539C49A040B04028F08091E70A3A |
:10B7500089310CF4FFC021E0E21620E1F20620E07E |
:10B76000020720E012070CF473C08091FD048823C7 |
:10B7700009F46AC0D801C70117FF07C088279927B5 |
:10B78000DC018E199F09A00BB10B9C01AD01B7FF25 |
:10B7900004C021503E4F4F4F5F4FF9E055954795FC |
:10B7A00037952795FA95D1F78091FB049091FC0489 |
:10B7B000820F931F9093FC048093FB04D801C70170 |
:10B7C00017FF03C00796A11DB11DE3E0B595A7952E |
:10B7D00097958795EA95D1F78093EF049093F004BD |
:10B7E000A093F104B093F20489589341A040B04073 |
:10B7F00064F088E893E1A0E0B0E08093EF049093D8 |
:10B80000F004A093F104B093F2042091EF0430917E |
:10B81000F0044091F1045091F20457FF04C021500C |
:10B820003F4F4F4F5F4F232F342F452F552747FD55 |
:10B830005A9580912F0490913004820F931F90931A |
:10B84000300480932F0406C081E08093FD0402C081 |
:10B850001092FD0440E0E41640EFF4064FEF0407B9 |
:10B860004FEF14070CF073C08091FE04882309F495 |
:10B870006AC0D801C70117FF07C088279927DC01D4 |
:10B880008E199F09A00BB10B9C01AD01B7FF04C03D |
:10B8900021503E4F4F4F5F4F69E055954795379583 |
:10B8A00027956A95D1F78091FB049091FC04820F53 |
:10B8B000931F9093FC048093FB04D801C70117FFEA |
:10B8C00003C00796A11DB11D23E0B595A7959795D7 |
:10B8D00087952A95D1F78093EF049093F004A09375 |
:10B8E000F104B093F20488579C4EAF4FBF4F64F4FD |
:10B8F00088E79CEEAFEFBFEF8093EF049093F004E6 |
:10B90000A093F104B093F2042091EF043091F0047D |
:10B910004091F1045091F20457FF04C021503F4F71 |
:10B920004F4F5F4F232F342F452F552747FD5A95F3 |
:10B9300080912F0490913004820F931F90933004D4 |
:10B9400080932F0411C081E08093FE040DC01092FB |
:10B95000FE040AC01092FC041092FB0484E690E0FE |
:10B9600090938D0180938C016889262F33278091D5 |
:10B97000FB049091FC042817390724F43093FC044D |
:10B980002093FB041091E70A112379F0212F33272C |
:10B9900027FD30958091FB049091FC04281739070E |
:10B9A00024F43093FC042093FB044091E104509173 |
:10B9B000E2046091E3047091E404413851056105AB |
:10B9C000710574F08091B9049091BA042091FB0440 |
:10B9D0003091FC04820F931F9093BA048093B904B2 |
:10B9E00040585F4F6F4F7F4F74F48091B90490912E |
:10B9F000BA042091FB043091FC04821B930B9093BA |
:10BA0000BA048093B90481E090E09093FC048093A1 |
:10BA1000FB04C090E504D090E604E090E704F090C9 |
:10BA2000E804D701C601F7FE07C088279927DC0183 |
:10BA30008C199D09AE09BF0981509240A040B040C9 |
:10BA400034F084E090E09093FC048093FB048091B8 |
:10BA5000050590910605A0910705B0910805209174 |
:10BA6000350A3091360A4091370A5091380A821BC4 |
:10BA7000930BA40BB50B815E914BAF4FBF4F8F5310 |
:10BA80009C49A040B04018F019310CF4FFC001E00F |
:10BA9000C01600E1D00600E0E00600E0F0060CF47D |
:10BAA00073C08091FF04882309F46AC0D701C601DE |
:10BAB000F7FE07C088279927DC018C199D09AE097C |
:10BAC000BF099C01AD01B7FF04C021503E4F4F4F4D |
:10BAD0005F4F09E055954795379527950A95D1F71A |
:10BAE0008091FB049091FC04820F931F9093FC04BF |
:10BAF0008093FB04D701C601F7FE03C00796A11D82 |
:10BB0000B11D13E0B595A795979587951A95D1F72F |
:10BB10008093F3049093F404A093F504B093F60497 |
:10BB200089589341A040B04064F088E893E1A0E0D8 |
:10BB3000B0E08093F3049093F404A093F504B093E1 |
:10BB4000F6042091F3043091F4044091F5045091EF |
:10BB5000F60457FF04C021503F4F4F4F5F4F232F34 |
:10BB6000342F452F552747FD5A95809131049091E8 |
:10BB70003204820F931F909332048093310406C0E5 |
:10BB800081E08093FF0402C01092FF0420E0C216FF |
:10BB900020EFD2062FEFE2062FEFF2060CF073C073 |
:10BBA00080910005882309F46AC0D701C601F7FE19 |
:10BBB00007C088279927DC018C199D09AE09BF09A8 |
:10BBC0009C01AD01B7FF04C021503E4F4F4F5F4F66 |
:10BBD000E9E05595479537952795EA95D1F78091F6 |
:10BBE000FB049091FC04820F931F9093FC048093BC |
:10BBF000FB04D701C601F7FE03C00796A11DB11DC6 |
:10BC000073E0B595A795979587957A95D1F7809329 |
:10BC1000F3049093F404A093F504B093F6048857CA |
:10BC20009C4EAF4FBF4F64F488E79CEEAFEFBFEF81 |
:10BC30008093F3049093F404A093F504B093F60476 |
:10BC40002091F3043091F4044091F5045091F604EE |
:10BC500057FF04C021503F4F4F4F5F4F232F342FCA |
:10BC6000452F552747FD5A95809131049091320414 |
:10BC7000820F931F909332048093310411C081E0AE |
:10BC8000809300050DC0109200050AC01092FC04BC |
:10BC90001092FB0484E690E090938D0180938C01D8 |
:10BCA0004889242F33278091FB049091FC042817A6 |
:10BCB000390724F43093FC042093FB048091E70AB5 |
:10BCC000882379F0282F332727FD30958091FB04B6 |
:10BCD0009091FC042817390724F43093FC04209336 |
:10BCE000FB044091E5045091E6046091E7047091F3 |
:10BCF000E804413851056105710574F08091B7047D |
:10BD00009091B8042091FB043091FC04820F931FA2 |
:10BD10009093B8048093B70440585F4F6F4F7F4FA4 |
:10BD2000CCF48091B7049091B8042091FB04309139 |
:10BD3000FC04821B930B9093B8048093B7040AC051 |
:10BD400010923204109231041092300410922F0499 |
:10BD500010925F0480913B0A882341F410923204D0 |
:10BD6000109231041092300410922F0480912D0A09 |
:10BD700090912E0AA0912F0AB091300A809301056C |
:10BD800090930205A0930305B09304058091350AB2 |
:10BD90009091360AA091370AB091380A8093050530 |
:10BDA00090930605A0930705B0930805109293049D |
:10BDB00010929404109295041092960410928F049D |
:10BDC00010929004109291041092920410928B049D |
:10BDD00010928C0410928D0410928E0410922D0AF1 |
:10BDE00010922E0A10922F0A1092300A1092350AE1 |
:10BDF0001092360A1092370A1092380A1092220ACC |
:10BE00001092230A1092240A1092250A1092150A01 |
:10BE10001092160A1092170A1092180A1092320302 |
:10BE200010923103E0905504F0905604C701F7FEDC |
:10BE300004C0882799278E199F0904973CF08091A8 |
:10BE4000560A84FD03C082E380933304109159089D |
:10BE5000A12EBB24CC24DD24B701882777FD809553 |
:10BE6000982F9701F7FE04C0222733272E193F0988 |
:10BE7000442737FD4095542F0E94819F9B01AC01C0 |
:10BE8000C601B5010E94819F97FF04C061507E4F9B |
:10BE90008F4F9F4F59E095958795779567955A9560 |
:10BEA000D1F79B01812F99278E9DD0018F9DB00DD9 |
:10BEB0009E9DB00D1124CD01B7FD039695958795F4 |
:10BEC00095958795280F391F80910B0490910C044C |
:10BED0008150924010F020E030E080913504909144 |
:10BEE0003604280F391F442737FD4095542F2093DF |
:10BEF000D5043093D6044093D7045093D80480914E |
:10BF0000730490917404A0917504B0917604821B1F |
:10BF1000930BA40BB50B8093730490937404A093BC |
:10BF20007504B09376048155934CA040B04064F002 |
:10BF300080E593ECA0E0B0E08093730490937404E8 |
:10BF4000A0937504B0937604809173049091740467 |
:10BF5000A0917504B0917604805B9C43AF4FBF4FB6 |
:10BF600064F480EB9CE3AFEFBFEF80937304909396 |
:10BF70007404A0937504B09376040091900110911D |
:10BF8000910117FDFCC08091560A83FFF8C0809193 |
:10BF90008F01815080938F01882309F0F4C08DE0D8 |
:10BFA00080938F018091A3049091A404A091A50493 |
:10BFB000B091A604B7FF04C081509E4FAF4FBF4F52 |
:10BFC00039E0B595A795979587953A95D1F77C0176 |
:10BFD00097FF04C0F094E194F108F39480919B04DE |
:10BFE00090919C04A0919D04B0919E04B7FF04C061 |
:10BFF00081509E4FAF4FBF4F29E0B595A7959795BC |
:10C0000087952A95D1F79C0197FF03C0309521951C |
:10C010003F4FE216F3060CF47901B701F7FE02C0B8 |
:10C02000695F7F4F2B01A3E055944794AA95E1F7F0 |
:10C0300022E030E0420E531E6090660A7090670A5C |
:10C040008090680A9090690A2091420130914301E2 |
:10C050004091440150914501C401B3010E94F59FF4 |
:10C0600059016A013093130A2093120A021B130B21 |
:10C07000C801845E9D4F68E671E00E94C09F9C01EC |
:10C08000245B304080918C0190918D01009731F0BC |
:10C09000019790938D0180938C011BC049E1E416B8 |
:10C0A000F104BCF480915D0490915E04820F931FB3 |
:10C0B00090935E0480935D0480913304882349F05B |
:10C0C000815080933304882321F4B0926204A092BB |
:10C0D000610480918C0190918D01892BF9F48091FC |
:10C0E0008E019927289FB001299F700D389F700DF0 |
:10C0F0001124CB01B2010E94C09FCB01AA2797FD5A |
:10C10000A095BA2F680E791E8A1E9B1E6092660A41 |
:10C110007092670A8092680A9092690A809133044B |
:10C12000882369F580916104909162042091120A3C |
:10C130003091130A821B930B845E9D4F68E671E079 |
:10C140000E94C09F9C01245B3040809179018695BC |
:10C150009927289FD001299FB00D389FB00D112439 |
:10C160009D01B7FF02C0215F3F4FF4E03595279551 |
:10C17000FA95E1F7309336042093350404C0109209 |
:10C1800036041092350480915F04882381F0109268 |
:10C190006704109268041092690410926A04109265 |
:10C1A0006B0410926C0410926D0410926E04F09067 |
:10C1B0002C04FF20F1F480913B0A282F33274427D9 |
:10C1C00055278091A3049091A404A091A504B09157 |
:10C1D000A604BC01CD010E94819FDC01CB01BC0102 |
:10C1E000CD0128EF3AE240E050E00E94F59F29019E |
:10C1F00002C044245524E0902B04EE20F1F48091F9 |
:10C200003B0A282F33274427552780919B04909180 |
:10C210009C04A0919D04B0919E04BC01CD010E949C |
:10C22000819FDC01CB01BC01CD0128EF3AE240E067 |
:10C2300050E00E94F59F190102C02224332480910E |
:10C240000F0A9091100A893C91051CF088EC90E04F |
:10C2500005C088539F4F34F488E39FEF9093100AF2 |
:10C2600080930F0A80911A0A90911B0A893C9105CC |
:10C270001CF088EC90E005C088539F4F34F488E3AD |
:10C280009FEF90931B0A80931A0A80911C0A909149 |
:10C290001D0AAA2797FDA095BA2F2091640AA22E05 |
:10C2A000BB24CC24DD24BC01CD01A60195010E9454 |
:10C2B000819F9B01AC0180910F0A9091100AAA27DF |
:10C2C00097FDA095BA2FE7E0880F991FAA1FBB1F03 |
:10C2D000EA95D1F7280F391F4A1F5B1F57FF04C08B |
:10C2E000215C3F4F4F4F5F4F76E05595479537950F |
:10C2F00027957A95D1F78201020F131F10931D0A1B |
:10C3000000931C0A80910D0A90910E0AAA2797FDAE |
:10C31000A095BA2FBC01CD01A60195010E94819F75 |
:10C320009B01AC0180911A0A90911B0AAA2797FDE4 |
:10C33000A095BA2F67E0880F991FAA1FBB1F6A95A7 |
:10C34000D1F7280F391F4A1F5B1F57FF04C0215C1C |
:10C350003F4F4F4F5F4FA6E055954795379527952F |
:10C36000AA95D1F74101820E931E90920E0A8092F7 |
:10C370000D0A80915F0A9091600A880F991FAA2781 |
:10C3800097FDA095BA2F2091140A332744275527EB |
:10C39000BC01CD010E94819F5B016C0197FF08C029 |
:10C3A0002FE330E040E050E0A20EB31EC41ED51EC5 |
:10C3B000F6E0D594C794B794A794FA95D1F78091F5 |
:10C3C0002A0A282F332744275527809187049091E4 |
:10C3D0008804A0918904B0918A04BC01CD010E9417 |
:10C3E000819FDC01CB01BC01CD0120EF35E540E0B0 |
:10C3F00050E00E94F59FB501620F731F7093600AB1 |
:10C4000060935F0A0150104134F080E090E1909316 |
:10C410001D0A80931C0A80911C0A90911D0A80506D |
:10C42000904F34F480E090EF90931D0A80931C0AA3 |
:10C4300051E0851650E1950634F080E090E190934C |
:10C440000E0A80930D0A80910D0A90910E0A805079 |
:10C45000904F34F480E090EF90930E0A80930D0A91 |
:10C460006150704134F080E090E19093600A8093D5 |
:10C470005F0A80915F0A9091600A8050904F34F477 |
:10C4800080E090EF9093600A80935F0A809110049F |
:10C4900085FD16C0809102019927209126013091D7 |
:10C4A000270149815A81489F8001499F100D589F5B |
:10C4B000100D1124C801B9010E94AC9F7A836983D1 |
:10C4C000809109058150809309058F3F09F047C08D |
:10C4D00080910A0590910B05892B41F480912601EA |
:10C4E0009091270190930B0580930A058091260176 |
:10C4F0009091270120910A0530910B0528173907E3 |
:10C5000018F42F5F3F4F09C08091260190912701B9 |
:10C510008217930730F42150304030930B0520935D |
:10C520000A0584E6809309058091AF08282F3327F8 |
:10C5300040910A0550910B054217530710F48AE009 |
:10C540000CC080910001280F311D2417350738F4E5 |
:10C5500080910704882319F081508093070480910B |
:10C5600007048823D1F08091390490913A04A09176 |
:10C570003B04B0913C04B7FD10C08091AD0880939E |
:10C58000380480EE91EBAFEFBFEF809339049093C6 |
:10C590003A04A0933B04B0933C0469817A81660F0E |
:10C5A000771F660F771F7A8369838091560A80FD13 |
:10C5B00002C00C944F6DEE2011F00C944F6DFF20D3 |
:10C5C00011F00C944F6D8091B50599278F7790707D |
:10C5D000009711F00C944F6D3C018091BB04909139 |
:10C5E000BC04892B09F044C080911C0190911D016D |
:10C5F0008959934058F087B58A3F20F480913503DC |
:10C60000815011C081E0809317055EC080911C01AC |
:10C6100090911D018436910530F587B58630F8F08C |
:10C62000809135038F5F8093350395E089029001F7 |
:10C6300011248091EC07821B87BD87B5809588BD4A |
:10C640008CE291E090931E0380931D038EE591E0B0 |
:10C650009093BC048093BB040E94EA1E35C081E025 |
:10C660008093160531C0F0921605F09217052CC084 |
:10C67000709234036092330380910804882321F080 |
:10C6800081E00E94E89817C080914304909144048F |
:10C69000A0914504B091460454E0880F991FAA1F49 |
:10C6A000BB1F5A95D1F78093360390933703A0931D |
:10C6B0003803B09339038091BB049091BC04019777 |
:10C6C0009093BC048093BB048091560A2091260469 |
:10C6D00081FF3CC0223348F58091950181508093C1 |
:10C6E00095018F3F09F052C08091AC01882339F445 |
:10C6F00080916004882319F088E28093AC01109245 |
:10C7000060048091430490914404A0914504B09149 |
:10C71000460480933F0490934004A0934104B09357 |
:10C72000420481E08093950131C0273478F18091F3 |
:10C73000AC01882339F480916004882319F487E2DE |
:10C740008093AC0188EC809395011DC080914601D7 |
:10C7500090914701820F911D209152083327829FAB |
:10C76000D001839FB00D929FB00D1124CD01AA2757 |
:10C7700097FDA095BA2F80933F0490934004A09317 |
:10C780004104B093420481E0809360048091A3044B |
:10C790009091A404A091A504B091A604E090420158 |
:10C7A000F09043010091440110914501BC01CD017D |
:10C7B000A80197010E94F59F59016A0180919B048D |
:10C7C00090919C04A0919D04B0919E04BC01CD0168 |
:10C7D000A80197010E94F59FB901C5010E94A19D82 |
:10C7E0009093270A8093260ACC9734F08CE390E04C |
:10C7F0009093270A8093260A8091260A9091270A0F |
:10C800000E94F7799093270A8093260A80E280930A |
:10C81000410110923E0410923D04809160048823EF |
:10C8200009F4A1C78091100499279C0120713070F0 |
:10C8300084FD99C780910F04826080930F047091EA |
:10C84000390A872F992741E0842E912C882299223A |
:10C8500080FD04C08091560A81FD10C0E980FA80F5 |
:10C8600030930D0520930C0530933E0420933D0436 |
:10C8700080911004806C8093100410C38091100488 |
:10C8800081FFDFC20091820110918301C8010F96E0 |
:10C89000E0915304F0915404FF8BEE8B8E179F07A9 |
:10C8A0000CF09AC080911605882309F095C08091FC |
:10C8B000100487FF15C0809110048F7780931004B7 |
:10C8C0008091290390912A03A0912B03B0912C030E |
:10C8D00080933F0490934004A0934104B09342049A |
:10C8E000E090190AEE20D9F180913F049091400424 |
:10C8F000A0914104B0914204BC01CD0124E630E096 |
:10C9000040E050E00E94F59FAE2CBB24CC24DD24F7 |
:10C91000A216B306C406D50614F590923E04809282 |
:10C920003D048091AC018823C1F48091430490912F |
:10C930004404A0914504B0914604BC01CD012FE50B |
:10C9400030E040E050E00E94F59FA216B306C40616 |
:10C95000D5061CF48AE18093AC018DE338C0809148 |
:10C960000E0590910F05459784F0809129039091D1 |
:10C970002A03A0912B03B0912C0380933F04909342 |
:10C980004004A0934104B093420480911004806459 |
:10C99000809310042E893F89201B310B2F5030408B |
:10C9A00037FF03C0309521953F4F30933E042093CD |
:10C9B0003D0480910704882349F0C90163E070E0D9 |
:10C9C0000E94C09F70933E0460933D048BE280936D |
:10C9D00041011092370437C1C8010F97EE88FF88D4 |
:10C9E000E816F906CCF5209117052223A9F58091C8 |
:10C9F000100486FF15C0809110048F7B8093100473 |
:10CA00008091290390912A03A0912B03B0912C03CC |
:10CA100080933F0490934004A0934104B093420458 |
:10CA2000809110048068809310048E899F89801BF8 |
:10CA3000910B0F9697FF03C0909581959F4F90950E |
:10CA400081959F4F90933E0480933D048DE28093A7 |
:10CA5000410120933704F7C08DE380934101609139 |
:10CA60003804662371F12091390430913A044091E1 |
:10CA70003B0450913C0480913F0490914004A0916C |
:10CA80004104B091420482179307A407B507CCF480 |
:10CA900080911004806480931004862F99279093CE |
:10CAA0003E0480933D048AE0809337048EE58093B2 |
:10CAB00041018091100487FFC6C0809110048F77D8 |
:10CAC00033C0662309F443C02091390430913A04FD |
:10CAD00040913B0450913C0480913F04909140046C |
:10CAE000A0914104B0914204281739074A075B0717 |
:10CAF00074F580911004806880931004862F992724 |
:10CB0000909581959F4F90933E0480933D0486EFCE |
:10CB10008093370486E7809341018091100486FF5B |
:10CB200092C0809110048F7B809310048091290320 |
:10CB300090912A03A0912B03B0912C0380933F0482 |
:10CB400090934004A0934104B09342047CC0809130 |
:10CB50001004807C09F477C080913704882309F0A1 |
:10CB60004CC08091290390912A03A0912B03B0918E |
:10CB70002C03885C9040A040B04020913F0430914D |
:10CB80004004409141045091420482179307A40746 |
:10CB9000B5076CF08091290390912A03A0912B0393 |
:10CBA000B0912C03885C9040A040B0401DC08091A3 |
:10CBB000290390912A03A0912B03B0912C03885351 |
:10CBC0009F4FAF4FBF4F281739074A075B07BCF08D |
:10CBD0008091290390912A03A0912B03B0912C03FB |
:10CBE00088539F4FAF4FBF4F80933F0490934004B3 |
:10CBF000A0934104B093420402C010923704809184 |
:10CC000010048F738093100410920D0510920C0580 |
:10CC100071FF06C084EF91E090931E0380931D0383 |
:10CC200080914704882379F48091430490914404CF |
:10CC3000A0914504B0914604C397A105B1051CF02D |
:10CC400081E08093470460910C0570910D058091FF |
:10CC50003D0490913E04680F791F70930D05609319 |
:10CC60000C05CB0177FF04C088279927861B970BFB |
:10CC7000855F91400CF4CEC040913704442389F184 |
:10CC80008091390490913A0420913F0430914004FE |
:10CC9000821B930B0996439748F480913904909135 |
:10CCA0003A04A0913B04B0913C0412C0242F3327D6 |
:10CCB00027FD3095432F532F80913F0490914004DE |
:10CCC000A0914104B0914204820F931FA41FB51F8D |
:10CCD00080933F0490934004A0934104B093420496 |
:10CCE00024C020913F043091400440914104509170 |
:10CCF0004204809152081616170644F463E00E941D |
:10CD0000A09F280F311D411D511D07C063E00E94E7 |
:10CD1000A09F281B31094109510920933F043093FA |
:10CD20004004409341045093420410920D05109228 |
:10CD30000C05E0904304F0904404009145041091E8 |
:10CD40004604D801C70180509440A040B0402091D3 |
:10CD50003F043091400440914104509142048217B5 |
:10CD60009307A407B5075CF4D801C70180509C4F16 |
:10CD7000AF4FBF4F281739074A075B0744F080932E |
:10CD80003F0490934004A0934104B09342048091E7 |
:10CD9000390A81FF06C084E690E090931E038093D9 |
:10CDA0001D03809156088823A9F5809138048823B3 |
:10CDB00089F540912D0450912E0457FF02C04D5F1C |
:10CDC0005F4F5595479555954795809126019091D0 |
:10CDD0002701209102013327489FB001499F700D20 |
:10CDE000589F700D1124CB01B9010E94C09F709310 |
:10CDF000830160938201663471051CF486E490E03F |
:10CE000005C06739710534F086E990E0909383019D |
:10CE1000809382018091BB049091BC04892BD1F155 |
:10CE20008091290390912A03A0912B03B0912C03A8 |
:10CE300080933F0490934004A0934104B093420434 |
:10CE400029C08091430490914404A0914504B0917D |
:10CE5000460480599140A040B04080933F04909395 |
:10CE60004004A0934104B093420480915608882363 |
:10CE700011F0992702C088E790E090938301809396 |
:10CE8000820189819A8190932E0480932D048EE2F1 |
:10CE900080934101E0902D04F0902E0480912903AD |
:10CEA00090912A03A0912B03B0912C0320913F0471 |
:10CEB00030914004409141045091420428173907B1 |
:10CEC0004A075B0724F08091390A80FD98C480915D |
:10CED00008046091BB047091BC04882309F07CC2F3 |
:10CEE000672B49F0E0902D04F0902E0410920F056E |
:10CEF00010920E05E1C08091290390912A03A09120 |
:10CF00002B03B0912C03821B930BA40BB50B8093C6 |
:10CF1000D9049093DA04A093DB04B093DC0482304C |
:10CF2000E0E89E07EFEFAE07EFEFBE072CF481E0DD |
:10CF300090E8AFEFBFEF09C08F5F9F47A040B040C0 |
:10CF400064F08FEF9FE7A0E0B0E08093D904909366 |
:10CF5000DA04A093DB04B093DC048091D9049091AF |
:10CF6000DA0490930F0580930E0580917B01282FA2 |
:10CF70003327442755278091D9049091DA04A09152 |
:10CF8000DB04B091DC04BC01CD010E94819F97FFBE |
:10CF900004C0615E7F4F8F4F9F4F25E09595879529 |
:10CFA000779567952A95D1F76093D9047093DA0441 |
:10CFB0008093DB049093DC0465300EEF70070FEF75 |
:10CFC00080070FEF90072CF484E09EEFAFEFBFEFE8 |
:10CFD00009C0605074408040904064F080E094E06C |
:10CFE000A0E0B0E08093D9049093DA04A093DB042E |
:10CFF000B093DC046090D9047090DA04209133037C |
:10D000003091340337FF02C0295F3F4F03E035956D |
:10D0100027950A95E1F74FEF223834071CF421E8F1 |
:10D020003FEF05C02038310514F020E830E0C90199 |
:10D03000AA2797FDA095BA2F20917C01332744277A |
:10D040005527BC01CD010E94819F97FF04C06D5FF1 |
:10D050007F4F8F4F9F4F12E09595879577956795F6 |
:10D060001A95D1F79B015FEF613075071CF420E042 |
:10D070003FEF06C06F3F710519F014F020E031E07A |
:10D0800080911004807C49F0C90137FD03969C0112 |
:10D0900035952795359527950DC08091390A80FFE4 |
:10D0A00009C0C90137FD07969C01A3E03595279576 |
:10D0B000AA95E1F7620E731E20917A01222309F4EA |
:10D0C00054C06091630470916404809165049091F0 |
:10D0D000660497FF04C061587F4F8F4F9F4FF7E062 |
:10D0E0009595879577956795FA95D1F733274427D6 |
:10D0F00055270E94819F97FF04C0615E7F4F8F4F2D |
:10D100009F4FE5E09595879577956795EA95D1F7D7 |
:10D110006093D9047093DA048093DB049093DC0469 |
:10D120006138AFEF7A07AFEF8A07AFEF9A072CF4B9 |
:10D1300080E89FEFAFEFBFEF0AC06F3F7105810539 |
:10D14000910569F064F080E091E0A0E0B0E08093A8 |
:10D15000D9049093DA04A093DB04B093DC048091AB |
:10D16000D9049091DA04680E791E80917801282FF5 |
:10D1700033278091EA0A992787FD9095289FF0012F |
:10D18000299FF00D389FF00D11249F01F7FF02C079 |
:10D1900021583F4F220F232F221F330BFFEF21383F |
:10D1A0003F071CF420E83FEF06C02F3F310519F080 |
:10D1B00014F020E031E0260D371DC901AA2797FDA4 |
:10D1C000A095BA2F00912D0410912E0498014427A8 |
:10D1D00037FD4095542FBC01CD010E94819F97FFE0 |
:10D1E00004C061507E4F8F4F9F4F59E095958795B2 |
:10D1F000779567955A95D1F7E61AF70A80913D041D |
:10D2000090913E04892B09F064C0101611060CF0B1 |
:10D2100060C020910E0530910F05C90137FF03C092 |
:10D22000309521953F4F2D33310540F480915B04BB |
:10D2300090915C048E159F0574F526C02C533040E8 |
:10D2400045E0369527954A95E1F72031310510F0F4 |
:10D250002FE030E040915B0450915C0418161906F1 |
:10D26000E4F480E190E0821B930B489F9001499F7A |
:10D27000300D589F300D1124B4E036952795BA959E |
:10D28000E1F72E153F0520F58091800190918101F5 |
:10D29000E816F906F4F07C011CC0205F3F4F809136 |
:10D2A000800190918101829FB001839F700D929FB8 |
:10D2B000700D11249B01A4E036952795AA95E1F7FE |
:10D2C0004E155F0514F07A0104C0E216F30608F06B |
:10D2D0007901C701AA2797FDA095BA2FFDE0880F15 |
:10D2E000991FAA1FBB1FFA95D1F72091260A3091EA |
:10D2F000270A442737FD4095542FBC01CD010E94D9 |
:10D30000F59F2093DD043093DE044093DF045093B7 |
:10D31000E004E090DD04F090DE048091100590912F |
:10D3200011059C01220F331F280F391F2E0D3F1DA1 |
:10D3300037FF02C02D5F3F4FA90155954795559581 |
:10D340004795509311054093100580914E08282F62 |
:10D350003327220F331F220F331F241735076CF496 |
:10D3600080915E0A282F3327220F331F220F331F8D |
:10D37000205530404217530724F030931105209375 |
:10D3800010058091390A80FF14C08091100590919A |
:10D390001105A981BA818A179B0724F0B093110562 |
:10D3A000A0931005E0911005F0911105FA83E9832F |
:10D3B00026C229813A81201B310B37FF02C02D5F25 |
:10D3C0003F4F3595279535952795E0901005F090BE |
:10D3D0001105E20EF31EC1C1672B49F0E0902D0448 |
:10D3E000F0902E0410920F0510920E0538C1809116 |
:10D3F000290390912A03A0912B03B0912C03821B47 |
:10D40000930BA40BB50B8093D9049093DA04A093EB |
:10D41000DB04B093DC04823000E890070FEFA00734 |
:10D420000FEFB0072CF481E090E8AFEFBFEF09C039 |
:10D430008F5F9F47A040B04064F08FEF9FE7A0E070 |
:10D44000B0E08093D9049093DA04A093DB04B09306 |
:10D45000DC048091D9049091DA0490930F058093B5 |
:10D460000E0580917B01282F332744275527809173 |
:10D47000D9049091DA04A091DB04B091DC04BC01E2 |
:10D48000CD010E94819F97FF04C0615E7F4F8F4F47 |
:10D490009F4F05E095958795779567950A95D1F704 |
:10D4A0006093D9047093DA048093DB049093DC04D6 |
:10D4B000653028EF72072FEF82072FEF92072CF4C9 |
:10D4C00084E098EFAFEFBFEF09C060507840804034 |
:10D4D000904064F080E098E0A0E0B0E08093D90450 |
:10D4E0009093DA04A093DB04B093DC046090D90439 |
:10D4F0007090DA0480917A01282F332780913A03C3 |
:10D5000090913B03829FA001839F500D929F500DED |
:10D5100011249A0157FF02C021503F4F232F330F90 |
:10D52000330B8091330390913403820F931FAA270A |
:10D5300097FDA095BA2F8093D9049093DA04A09315 |
:10D54000DB04B093DC048091370420913D043091DA |
:10D550003E04882331F0B3E0220F331FBA95E1F780 |
:10D560001BC0809152089927289FB001299F700DF8 |
:10D57000389F700D11249B01A3E0220F331FAA9541 |
:10D58000E1F7260F371F37FF02C0215E3F4FF5E05E |
:10D5900035952795FA95E1F730930A04209309040D |
:10D5A0008091090490910A049C01442737FD40951D |
:10D5B000542F8091D9049091DA04A091DB04B091AA |
:10D5C000DC04821B930BA40BB50B8093D9049093BE |
:10D5D000DA04A093DB04B093DC0420917C013327B0 |
:10D5E00044275527BC01CD010E94819F97FF04C0AD |
:10D5F000615E7F4F8F4F9F4FE5E0959587957795BB |
:10D600006795EA95D1F76093D9047093DA04809313 |
:10D61000DB049093DC046530A8EF7A07AFEF8A074C |
:10D62000AFEF9A072CF484E098EFAFEFBFEF09C09B |
:10D63000605078408040904064F080E098E0A0E046 |
:10D64000B0E08093D9049093DA04A093DB04B09304 |
:10D65000DC048091D9049091DA04680E791EE618F2 |
:10D66000F70880915B0490915C048E159F053CF453 |
:10D670008091800190918101E816F9060CF07C01FF |
:10D68000C701AA2797FDA095BA2F5DE0880F991FC3 |
:10D69000AA1FBB1F5A95D1F72091260A3091270A5D |
:10D6A000442737FD4095542FBC01CD010E94F59FC2 |
:10D6B0002093DD043093DE044093DF045093E004B4 |
:10D6C000E090DD04F090DE0480911005909111054A |
:10D6D0009C01220F331F280F391F2E0D3F1D37FFCE |
:10D6E00002C02D5F3F4FA901559547955595479528 |
:10D6F000509311054093100580914E08282F332731 |
:10D70000220F331F220F331F241735076CF480912B |
:10D710005E0A282F3327220F331F220F331F205575 |
:10D7200030404217530724F0309311052093100521 |
:10D730008091390A209110053091110580FF10C0A9 |
:10D74000E981FA812E173F0724F0F0931105E09349 |
:10D750001005E0901005F0901105FA82E9824FC0A3 |
:10D760003A8329834CC080915608882301F5609143 |
:10D770002D0470912E0477FF02C06D5F7F4F759569 |
:10D780006795759567954091260150912701809185 |
:10D790000201282F3327649FC001659F900D749F5D |
:10D7A000900D1124B9010E94C09FCB0101C099279F |
:10D7B00090938301809382018091820190918301F3 |
:10D7C000873491051CF486E490E005C08639910504 |
:10D7D00034F086E990E0909383018093820109817F |
:10D7E0001A81109311050093100580911004806C2C |
:10D7F0008093100480910F048D7F80930F0480919B |
:10D80000100499279C012270307081FF39C18091EA |
:10D81000120590911305A0911405B091150500977C |
:10D82000A105B10521F0809147048130B9F48091C0 |
:10D830002D0490912E04AA2797FDA095BA2F1EE0E3 |
:10D84000880F991FAA1FBB1F1A95D1F78093120545 |
:10D8500090931305A0931405B09315058091470488 |
:10D86000813019F482E08093470429813A8179015B |
:10D870000027F7FC0095102F8091260A9091270A27 |
:10D880009C01442737FD4095542FC801B7010E94E1 |
:10D89000819FDC01CB018093DD049093DE04A09393 |
:10D8A000DF04B093E004B7FF04C08150904EAF4F47 |
:10D8B000BF4F7C018D01ADE015950795F794E79476 |
:10D8C000AA95D1F7E092DD04F092DE040093DF0424 |
:10D8D0001093E00460911104709112043FE0603AEB |
:10D8E000730750F58091120590911305A0911405CE |
:10D8F000B09115059C01AD01FAE056954795379515 |
:10D900002795FA95D1F7821B930BA40BB50BA801B1 |
:10D910009701E4E0220F331F441F551FEA95D1F70A |
:10D92000820F931FA41FB51F8093120590931305B8 |
:10D93000A0931405B093150560547F4118F58091AC |
:10D94000120590911305A0911405B09115059C0145 |
:10D95000AD016CE056954795379527956A95D1F7B7 |
:10D96000821B930BA40BB50BA8019701F2E0220FC9 |
:10D97000331F441F551FFA95D1F7820F931FA41F21 |
:10D98000B51F41C0809133039091340380913303DC |
:10D990009091340397FF03C0909581959F4F8436F3 |
:10D9A0009105CCF58091290390912A03A0912B0336 |
:10D9B000B0912C039C0180913F0490914004281B5E |
:10D9C000390B37FF03C0309521953F4F2F3F31056D |
:10D9D00009F00CF58091120590911305A0911405A2 |
:10D9E000B09115059C01AD01EEE056954795379530 |
:10D9F0002795EA95D1F7821B930BA40BB50B8E0DDF |
:10DA00009F1DA01FB11F8093120590931305A09333 |
:10DA10001405B09315058091120590911305A091FE |
:10DA20001405B09115057EE0B695A7959795879555 |
:10DA30007A95D1F790932E0480932D044091540849 |
:10DA4000442399F055279C01BA010E94C09FC90147 |
:10DA5000861B970B90935C0480935B04260F371F03 |
:10DA600030938101209380011FC010925C041092BA |
:10DA70005B048FEF93E0909381018093800114C049 |
:10DA8000109247041092120510921305109214057B |
:10DA90001092150530932E0420932D0405C080911B |
:10DAA0001004806C809310048091260581FF37C09C |
:10DAB00089819A8197FD0396959587959595879588 |
:10DAC00020910D0430910E042817390760F48091DD |
:10DAD0002D0490912E04892B31F0220F331F220F39 |
:10DAE000331F3A8329838091290390912A03A091BF |
:10DAF0002B03B0912C0380933F0490934004A09398 |
:10DB00004104B093420488E99AE390931E03809302 |
:10DB10001D0380E09EE090930C0180930B01209107 |
:10DB2000210A822F9927880F991F880F991F88969D |
:10DB300069817A818617970714F09A838983709197 |
:10DB40005E0A7D8B872F9927880F991F880F991F51 |
:10DB500080559040A981BA818A179B0714F49A8353 |
:10DB6000898380916B03882341F48091F10A8F3F70 |
:10DB700021F480912A05882321F18091110490914C |
:10DB800012040297C097E8F4E981FA811E161F0675 |
:10DB9000C4F481E090E09093120480931104E22E8B |
:10DBA000FF24EE0CFF1CEE0CFF1C8701085D1F4FCD |
:10DBB0001A8309838091F10A883218F489E08093EE |
:10DBC000AC0129813A813093AA072093A90780915B |
:10DBD000D5049091D604A091D704B091D80412E056 |
:10DBE000880F991FAA1FBB1F1A95D1F700915F0AD2 |
:10DBF0001091600A081B190B213A31058CF0C901FC |
:10DC000037FD019695958795801791070CF48C0147 |
:10DC1000909581959F4F081719076CF48C010BC0E4 |
:10DC20000135110514F000E510E03FEF003B13074C |
:10DC300014F400EB1FEF4D89242F3327220F331FDD |
:10DC4000220F331FC90169817A81861B970B8017C8 |
:10DC500091070CF48C0189819A81821B930B081720 |
:10DC600019070CF48C0180911C0A90911D0A609197 |
:10DC7000590470915A04861B970B90932C0A809339 |
:10DC80002B0AD0903B0A20916B0430916C04409198 |
:10DC90006D0450916E04DD2041F0461A570AC2010E |
:10DCA000AA2797FDA095BA2F04C0AA2797FDA09593 |
:10DCB000BA2F280F391F4A1F5B1F20936B04309324 |
:10DCC0006C0440936D0450936E0480916B049091AA |
:10DCD0006C04A0916D04B0916E0481509A4FA040E5 |
:10DCE000B04064F080E09AEFA0E0B0E080936B0475 |
:10DCF00090936C04A0936D04B0936E0480916B04B8 |
:10DD000090916C04A0916D04B0916E048050964087 |
:10DD1000AF4FBF4F64F480E096E0AFEFBFEF80936A |
:10DD20006B0490936C04A0936D04B0936E04C09048 |
:10DD3000630820912B0A30912C0A78E0E72EEC142E |
:10DD400098F08C2D9927829FA001839F500D929F60 |
:10DD5000500D1124CA0157FD07967C0163E0F5942C |
:10DD6000E7946A95E1F712C08C2D86959927829FDA |
:10DD7000B001839F700D929F700D1124CB0177FD30 |
:10DD800003967C01F594E794F594E794A0907D01C7 |
:10DD9000B0907E019501442737FD4095542F809126 |
:10DDA0006B0490916C04A0916D04B0916E04BC0161 |
:10DDB000CD010E94F59FE20EF31E90906701692D40 |
:10DDC000772788279927980117FF04C02227332730 |
:10DDD000201B310B37FF02C02F5F3F4F3595279532 |
:10DDE000A981BA812A0F3B1F442737FD4095542F44 |
:10DDF0000E94819F97FF04C0615C7F4F8F4F9F4FB0 |
:10DE000026E095958795779567952A95D1F79B019B |
:10DE10006E157F050CF47B01309521953F4FE2167E |
:10DE2000F3060CF4790180910D0A90910E0A60912D |
:10DE3000570470915804861B970B90930C0A80939B |
:10DE40000B0A209167043091680440916904509155 |
:10DE50006A04DD2041F0261A370AC101AA2797FD7E |
:10DE6000A095BA2F04C0AA2797FDA095BA2F280F16 |
:10DE7000391F4A1F5B1F2093670430936804409347 |
:10DE8000690450936A048091670490916804A0919A |
:10DE90006904B0916A0481509A4FA040B04064F088 |
:10DEA00080E09AEFA0E0B0E080936704909368046C |
:10DEB000A0936904B0936A04809167049091680408 |
:10DEC000A0916904B0916A0480509640AF4FBF4F53 |
:10DED00064F480E096E0AFEFBFEF80936704909327 |
:10DEE0006804A0936904B0936A0420910B0A3091EE |
:10DEF0000C0A48E04C1598F08C2D9927829FB001B0 |
:10DF0000839F700D929F700D1124CB0177FD0796B2 |
:10DF10006C0193E0D594C7949A95E1F712C0C6942A |
:10DF20008C2D9927829FD001839FB00D929FB00DB9 |
:10DF30001124CD01B7FD03966C01D594C794D594F7 |
:10DF4000C7949501442737FD4095542F809167046D |
:10DF500090916804A0916904B0916A04BC01CD015C |
:10DF60000E94F59FC20ED31E692D77278827992717 |
:10DF7000980117FF04C022273327201B310B37FFDE |
:10DF800002C02F5F3F4F35952795E981FA812E0F0B |
:10DF90003F1F442737FD4095542F0E94819F97FFD4 |
:10DFA00004C0615C7F4F8F4F9F4FA6E0959587958A |
:10DFB00077956795AA95D1F79B016C157D050CF4B3 |
:10DFC0006B01309521953F4FC216D3060CF46901C1 |
:10DFD0008091210A282E33245090A508F7E1AF2E16 |
:10DFE000F9E0BF2EEEEC8E2EE8E09E2E7BE0472E71 |
:10DFF0006CE3662E6AE0762ED4012C9112160CF09A |
:10E0000030C1203429F4E981FA81FF8BEE8B1FC0E7 |
:10E0100049815A81CA01AA2797FDA095BA2F3327B3 |
:10E0200027FD3095432F532FBC01CD010E94819FC6 |
:10E0300097FF04C0615C7F4F8F4F9F4F56E09595CF |
:10E040008795779567955A95D1F77F8B6E8BF401FD |
:10E050002181203439F42E893F892E0D3F1D3F8BBD |
:10E060002E8B2AC0203C39F44E895F894E195F09F6 |
:10E070005F8B4E8B21C0C701AA2797FDA095BA2FB1 |
:10E08000332727FD3095432F532FBC01CD010E942C |
:10E09000819F97FF04C0615C7F4F8F4F9F4F46E089 |
:10E0A00095958795779567954A95D1F7AE89BF89FC |
:10E0B000A60FB71FBF8BAE8BF4012281203439F439 |
:10E0C0002E893F892C0D3D1D3F8B2E8B2AC0203C75 |
:10E0D00039F44E895F894C195D095F8B4E8B21C0E5 |
:10E0E000C601AA2797FDA095BA2F332727FD3095A3 |
:10E0F000432F532FBC01CD010E94819F97FF04C085 |
:10E10000615C7F4F8F4F9F4F36E095958795779550 |
:10E1100067953A95D1F7AE89BF89A60FB71FBF8B18 |
:10E12000AE8BF4012381203439F42E893F89200FEE |
:10E13000311F3F8B2E8B2AC0203C39F44E895F89DA |
:10E14000401B510B5F8B4E8B21C0C801AA2797FD46 |
:10E15000A095BA2F332727FD3095432F532FBC01AD |
:10E16000CD010E94819F97FF04C0615C7F4F8F4F5C |
:10E170009F4F26E095958795779567952A95D1F7D6 |
:10E18000AE89BF89A60FB71FBF8BAE8BF50180810B |
:10E1900081FD08C0D3018D919C91EE89FF898E1776 |
:10E1A0009F0774F4D3018D919C91EE89FF898E0FA6 |
:10E1B0009F1F97FD0196959587959F8B8E8B1EC00F |
:10E1C000552049F42E893F89220F331F281B390B14 |
:10E1D0003F8B2E8B13C031E0351580F4252D33276E |
:10E1E0004E895F89841B950BB9010E94C09FCB01AA |
:10E1F0006E897F89680F791F7F8B6E8BC101880FB5 |
:10E20000991F880F991FAE89BF898A179B0764F4ED |
:10E21000BD898B2F9927880F991F880F991FEE8929 |
:10E22000FF89E817F90714F09F8B8E8B8E899F89E1 |
:10E2300097FD03969595879595958795F50181832B |
:10E24000880F991F880F991F2E893F89281B390B2A |
:10E25000C901880F8283EE89FF89D301ED93FC9376 |
:10E2600003C0F501118212824A9422E030E0620E6E |
:10E27000731E44E050E0840E951E68E070E0A60E28 |
:10E28000B71E47FEB9CEE2E1C95E0C942CA084B162 |
:10E29000806A84B93D9A82E58CBD1DBC459A81E0B7 |
:10E2A0008093700A8AEA8093810A83E88093820AC5 |
:10E2B0008AE08093830A1092850A1092840A109251 |
:10E2C000870A1092860A1092E90A1092A50A089508 |
:10E2D0003091700A332309F070C00DB407FE6DC091 |
:10E2E00083E080931C03459A2EB580912D059927D4 |
:10E2F0008130910589F0823091051CF4892B21F041 |
:10E300003EC00297B9F03BC03093A40A20932E057B |
:10E310002138A9F581E008C0253549F480912E0502 |
:10E32000820F80932E0582E080932D0528C03093C4 |
:10E330002D0525C08091A40AE82FFF27EA53F54F49 |
:10E3400020838F5F8093A40A90912E058032A0F0E5 |
:10E35000291769F480E2A6ECBAE0E6EAFAE00D904B |
:10E3600001928A95E1F781E08093A50A02C030937B |
:10E37000A50A10922D0503C0920F90932E052091AF |
:10E38000800A2232A0F4459800000000000000003E |
:10E39000E091790AF0917A0AE20FF11D80818EBD39 |
:10E3A0008091A20A9081890F8093A20A03C081E024 |
:10E3B0008093700A2F5F2093800A0895EF92FF9256 |
:10E3C0000F931F9380915C089927880F991F880FDE |
:10E3D000991F7C010027F7FC0095102F8091A30462 |
:10E3E0009091A404A091A504B091A604BC01CD0114 |
:10E3F000A80197010E94F59F3093850A2093840A13 |
:10E4000080919B0490919C04A0919D04B0919E04E6 |
:10E41000BC01CD01A80197010E94F59F3093870AA6 |
:10E420002093860A2091660A3091670A4091680A13 |
:10E430005091690ADA01C90173E0880F991FAA1F78 |
:10E44000BB1F7A95D1F7820F931FA41FB51F820FB0 |
:10E45000931FA41FB51F20914201309143014091A9 |
:10E46000440150914501BC01CD010E94F59F3093BC |
:10E470008D0A20938C0A8091B5049091B604209166 |
:10E48000400330914103821B930B9093930A809336 |
:10E49000920AE091AB04F091AC048091320A909121 |
:10E4A000330ABF010E94C09FCB019B01220F331F83 |
:10E4B000220F331F280F391F280F391F37FF02C0C3 |
:10E4C0002D5F3F4F35952795359527953093890AD0 |
:10E4D0002093880A8091620A9091630ABF010E948A |
:10E4E000C09F9B01220F331F220F331F260F371FA0 |
:10E4F000260F371F37FF02C02D5F3F4F35952795F9 |
:10E500003595279530938B0A20938A0A1092AC0494 |
:10E510001092AB041092330A1092320A1092630ADE |
:10E520001092620A8091830A9927AA27BB27FC01CF |
:10E530003A97E830F10508F030C2EF57FF4F0C94DE |
:10E5400047A0809125048093960A809124048093AB |
:10E55000970A809123048093980A809122048093E3 |
:10E56000990A8091210480939A0A809120048093D3 |
:10E570009B0A80911F0480939C0A80911E048093C3 |
:10E580009D0A8091100480939E0A80911004837FDD |
:10E59000809310048091010180939F0A809126014D |
:10E5A000909127018093A00A80910F048093A10A83 |
:10E5B0004299F3C180910F04877F80930F04EDC1CE |
:10E5C0008091EB0A9091EC0A9093970A8093960AB7 |
:10E5D0008091EF0A9091F00A9093990A8093980A9B |
:10E5E000809191080E94734880939A0A809141011A |
:10E5F00080939B0A90912F0590939C0AE92FFF2707 |
:10E6000013E0EE0FFF1F1A95E1F7E95EF64F8081E8 |
:10E6100080939D0A868180939E0A838180939F0ABE |
:10E6200087818093A00A85818093A10A9F5F909340 |
:10E630002F05E92FFF27EE0FFF1FEE0FFF1FEF53F0 |
:10E64000F74F8585882309F0A8C1992309F4A5C14E |
:10E65000892F992701966CE070E00E94C09F9C0171 |
:10E66000982FE82FFF27EE0FFF1FEE0FFF1FEF532E |
:10E67000F74F8585882311F4222351F720932F0526 |
:10E680008CC1809102018093960A809192088093B8 |
:10E69000970A809193088093980A809194088093B8 |
:10E6A000990A8091950880939A0A8091990880939D |
:10E6B0009B0A80919A0880939C0A80919B08809382 |
:10E6C0009D0A80919E0880939E0A80919C08809369 |
:10E6D0009F0A80919D088093A00A80919F085BC14A |
:10E6E000809190088093960A80916708863081F027 |
:10E6F0008091E802823451F00E94DE7EE82FFF27ED |
:10E70000ED51FE4E84918093E80202C00E94DE7EAD |
:10E71000809153058093970A8091AD088093980A61 |
:10E720008091A6088093990A38C1F8948091430893 |
:10E73000E82FFF27EE0FFF1FE858F64F0190F081FA |
:10E74000E02DE038F1051CF0EFE7F0E006C02FEF18 |
:10E75000E138F20714F4E1E8FFEFE093960A8091C4 |
:10E760004408E82FFF27EE0FFF1FE858F64F0190EF |
:10E77000F081E02DE038F1051CF0EFE7F0E006C095 |
:10E780007FEFE138F70714F4E1E8FFEFE093970A31 |
:10E7900080914208E82FFF27EE0FFF1FE858F64F41 |
:10E7A0000190F081E02DE038F1051CF0EFE7F0E09A |
:10E7B00006C08FEFE138F80714F4E1E8FFEFE093CB |
:10E7C000980A80914108E82FFF27EE0FFF1FE858B5 |
:10E7D000F64F0190F081E02DE038F1051CF0EFE7F5 |
:10E7E000F0E006C02FEFE138F20714F4E1E8FFEFA4 |
:10E7F0007894E093990A80914A0480939A0A8091D0 |
:10E800004B0480939B0A80914C0480939C0A8091D6 |
:10E810004D0480939D0A80914E0480939E0A8091BE |
:10E820004F0480939F0A809150048093A00A8091A6 |
:10E830005104B1C08091D005863018F01092D005F7 |
:10E8400085E08093960A8091A0088093970A809132 |
:10E85000430490914404A0914504B0914604BC0146 |
:10E86000CD0125E030E040E050E00E94F59F30937C |
:10E87000990A2093980A80913F0490914004A091B6 |
:10E880004104B0914204BC01CD0125E030E040E0FC |
:10E8900050E00E94F59F30939B0A20939A0A809142 |
:10E8A000960880939C0A8091970880939D0A809196 |
:10E8B000980880939E0A8091490480939F0A8091D2 |
:10E8C00030058093A00A8091A9079091AA0797FD2F |
:10E8D000039695958795959587955DC082E0809381 |
:10E8E000960A8093970A1092980A89E38093990A6E |
:10E8F0008091030180939A0A8091B50580939B0AC9 |
:10E900009091B60590939C0A8F778093B50590718E |
:10E910009093B6058091AE0880939D0A8091560A27 |
:10E9200080939E0A8091390A80939F0A8091A20861 |
:10E930008093A00A8091B3082EC0809175088093BF |
:10E94000960A8091B1088093970A80916F01809315 |
:10E95000980A80916E088093990A80916F0880933D |
:10E960009A0A8091700880939B0A80916E0180932F |
:10E970009C0A8091720880939D0A8091730880930D |
:10E980009E0A8091740880939F0A8091F10A809377 |
:10E99000A00A8091D3078093A10A8091A50A8823B9 |
:10E9A00009F479C16091A60A8091A601681719F04F |
:10E9B0008AEF8093A4016093A60181E080938F0188 |
:10E9C0004091A70A5091A80ACA0181509E4F8F5FBB |
:10E9D0009340B0F42091A90A3091AA0AC90181504C |
:10E9E0009E4F8F5F934060F480914D0885FF08C073 |
:10E9F00050931C0540931B0530931A05209319056D |
:10EA00008091AD0A9091AE0A21E08936920724F4F4 |
:10EA100090939101809390012091B70A3091B80AA8 |
:10EA200080911D0390911E038217930740F48091FB |
:10EA3000F002882321F430931E0320931D03862FB8 |
:10EA400099278936910509F4A5C08A36910544F4C1 |
:10EA50008736910571F08836910509F462C023C1AB |
:10EA60008A36910509F414C18B36910509F4E2C088 |
:10EA70001AC18091B90A8093E60A8091BA0A8093FC |
:10EA8000E80A8091BB0A8093E70A8091BC0A8093D0 |
:10EA90008E018091BD0A8093EA0A8091BE0A80931C |
:10EAA000A5018091BF0A80932C058091C00A8093B4 |
:10EAB000180580911D048823F9F02091C10A309136 |
:10EAC000C20A37FD19C0309362042093610490910B |
:10EAD0007708992389F08FE0989FC0011124281BA3 |
:10EAE000390BC90188599E4F68E671E00E94C09FAA |
:10EAF0009093620480936104209123053091240552 |
:10EB00008091C30A9091C40A280F391F37FF02C0B1 |
:10EB10002F5F3F4F3595279530932405209323058C |
:10EB2000C2C08091B90A80937B0A8091BA0A80930F |
:10EB30007C0A8091BB0A80937D0A8091BC0A8093F5 |
:10EB40007E0A8091BD0A80937F0A809199079091F7 |
:10EB5000BE0A892B8093990790919A0793708091B0 |
:10EB6000BF0A8C70982B90939A078091C00A80936B |
:10EB70002A058091C10A809396018091C20A8093F0 |
:10EB8000E90A8091C30A809326058091C40A809384 |
:10EB9000250589C08091B90A8093710A8091BA0ACB |
:10EBA0008093720A8091BB0A8093730A8091BC0A99 |
:10EBB0008093740A8091BD0A9091BE0A9093760A60 |
:10EBC0008093750A8091BF0A9091C00A9093780A49 |
:10EBD0008093770A8091C10A992787FD9095909339 |
:10EBE000B3098093B2098091C20A8093380480915E |
:10EBF000C30A9091C40A9C01442737FD4095542FC5 |
:10EC0000DA01C90163E0880F991FAA1FBB1F6A952B |
:10EC1000D1F7820F931FA41FB51F820F931FA41F4C |
:10EC2000B51F8093390490933A04A0933B04B093AA |
:10EC30003C0439C08091B90A809329058091BA0AB1 |
:10EC4000809328058091BB0A809327059091BC0A88 |
:10EC5000992349F08091AC01882319F081518330C8 |
:10EC600010F49093AC018091BD0A80935B05809174 |
:10EC7000BE0A80935A058091BF0A9091C00A909372 |
:10EC80005805809357058091C10A809359050BC0A0 |
:10EC90000E94457F08C010921C0510921B0510921F |
:10ECA0001A05109219051F910F91FF90EF9008958A |
:10ECB0008091700A882319F480E090E008954598C7 |
:10ECC00081E89AE090937A0A8093790A90912B05D3 |
:10ECD000E92FFF27E956FE4F9F5F90932B05808118 |
:10ECE0008093830A9D3010F010922B051092700AC9 |
:10ECF0000E94DE7181E08093800A8091810A809376 |
:10ED0000A20A8EBD81E090E0089587B18C6087B93A |
:10ED1000429843981092320580E88093A80110929F |
:10ED200031058093A70108958091B2099091B309AC |
:10ED300081589F4F39F08091B2099091B309815861 |
:10ED400080933C05809137058150809337058F3F34 |
:10ED500009F052C180918A088093380580918C080F |
:10ED60008093390589E080933705809110049927B5 |
:10ED700080739070892B21F48091B60580FF1DC0AF |
:10ED800080918E08882351F080913A05882319F4E8 |
:10ED900084E08093320581E080933A0580918F086A |
:10EDA000882379F080913B05882319F484E08093CF |
:10EDB000310581E080933B0504C010923A05109222 |
:10EDC0003B0580913A05882309F082C08091B00804 |
:10EDD000282F332724FF07C080914804882319F483 |
:10EDE00025FD8FC090C090918B08983F48F080918E |
:10EDF000340A8D3D28F08091380588236CF00AC0D4 |
:10EE0000983F78F08091340A853059F48091380524 |
:10EE100087FF02C0429A01C0429881E08093A80116 |
:10EE200054C0809132058150809332058F3F09F0A4 |
:10EE30006BC08091B30885FF2FC090913C05892F4E |
:10EE4000869580933205992361F4909330058091E3 |
:10EE5000380587FF02C0429A01C042981092A8016B |
:10EE600053C081E0809330058091A80190913805CE |
:10EE7000882349F480933C0580E48093A80199237A |
:10EE80000CF43FC040C0982311F0429A01C0429850 |
:10EE900086958093A80138C08091340A8695809326 |
:10EEA00032058091A801813021F410923C0580E464 |
:10EEB00001C086958093A8018091A80190913805A2 |
:10EEC000892311F0429A01C04298109230051CC06B |
:10EED000809132058150809332058F3FA9F489E0FB |
:10EEE000809332058091A801813011F480E801C03F |
:10EEF00086958093A8018091A80190918E0889231E |
:10EF000011F0429A01C0429880913B05882309F094 |
:10EF100043C09091B00897FF07C0809148048823B0 |
:10EF200019F496FD52C053C090918D08983F48F057 |
:10EF300080915D0A8D3D28F08091390588236CF021 |
:10EF40000AC0983F78F080915D0A853059F480912D |
:10EF5000390587FF02C0439A01C0439881E080933E |
:10EF6000A70136C0809131058150809331058F3FD4 |
:10EF700079F580915D0A8695809331058091A7018E |
:10EF8000813011F480E401C086958093A7018091BF |
:10EF9000A7019091390517C0809131058150809368 |
:10EFA00031058F3FA9F489E0809331058091A70155 |
:10EFB000813011F480E801C086958093A70180918B |
:10EFC000A70190918F08892311F0439A01C04398BB |
:10EFD000429B05C080910F04886080930F04439B7F |
:10EFE00006C080910F04806180930F040895809182 |
:10EFF0000F048F7E80930F0408954FB724E130E013 |
:10F00000F8948091C9008F778093C9008091C900DE |
:10F010008F7B8093C9008091C9008F7D8093C90048 |
:10F02000832F99278093CD002093CC008091C80036 |
:10F0300082608093C80080E18093C9008091CA00FB |
:10F040008F778093CA008091CA008F7B8093CA001B |
:10F050008091CA008F7D8093CA008091CA008F7E04 |
:10F060008093CA008091CA00877F8093CA008091F4 |
:10F07000C9008B7F8093C9008091CA00846080930F |
:10F08000CA008091CA0082608093CA008091C80043 |
:10F0900087FF03C08091CE00F9CF8091C9008068BE |
:10F0A0008093C9004FBF0895EF92FF920F931F9373 |
:10F0B000CF93DF93482F00E010E08091A9018130C9 |
:10F0C00061F41092A90184E480933D0510923F05FC |
:10F0D00010923E051092400539C180913D0588236C |
:10F0E00019F421E030E001C0980190913E05992388 |
:10F0F00071F4232B11F081E010C084E480933D056E |
:10F1000090933F0590933E059093400508C1913040 |
:10F1100069F4232B09F0F9C082E080933E058091C9 |
:10F120003F058F5F80933F0583E0F7C09230D1F4B5 |
:10F13000232B09F0EAC083E080933D05409340050E |
:10F1400090913F05923039F41092410547FF03C07A |
:10F1500081E08093410583E080933E059F5F90931B |
:10F160003F05DDC0933009F0D0C0232B09F0CDC09E |
:10F1700090933D0582E080933E0580913F058F5F2F |
:10F1800080933F0520914005822F9927782F66278D |
:10F19000842F9927682B792B80916708813049F457 |
:10F1A0007370CB018050924063E070E00E94C09F7A |
:10F1B00017C0823061F47770CB018050944066E0D4 |
:10F1C00070E00E94C09F2695269526950BC073700F |
:10F1D00068567140CB0177FD0196BC017595679526 |
:10F1E00026952695022F11270F7010700F5F1F4F65 |
:10F1F0000D30110508F082C07801E00EF11EF70114 |
:10F20000E858F64F808191819B01281B390BC90179 |
:10F2100037FF03C0909581959F4F069704F5E091C5 |
:10F22000A908EE2351F0FF27EE0FFF1FE858F64F15 |
:10F23000808191818436910594F480914904883CC1 |
:10F2400030F480914904865F8093490408C088ECBB |
:10F250008093490480916F008F7D80936F00F70148 |
:10F26000E858F64F808191819C01220F331F280FAF |
:10F27000391F260F371F37FF02C02D5F3F4FE901AF |
:10F28000D595C795D595C795CB0101968C179D0748 |
:10F2900014F4219706C061507040C617D7070CF4CC |
:10F2A000219680914904843BD0F0F701E858F64F4D |
:10F2B00080819181FE01E81BF90BCF0163E070E0D2 |
:10F2C0000E94C09FCB01880F991F860F971F2EEBBE |
:10F2D00039E0E20EF31EF7019183808307C02EEB25 |
:10F2E00039E0E20EF31EF70111821082000F111FA8 |
:10F2F0000858164FF801D183C08311C0023111059F |
:10F3000070F081E08093A9010AC081E08093A90197 |
:10F3100010923F051092410584E480933D05809151 |
:10F320003F05803198F080914105882331F4809128 |
:10F33000A901882311F48093400110923F05109297 |
:10F34000410510923E0584E480933D05E6E0CDB78B |
:10F35000DEB70C9438A0CF93FC0197FF05C0CFEF28 |
:10F36000F095E195FF4F01C0C1E028E631E0CF0103 |
:10F37000B9010E94C09FFC018B35910554F08B555B |
:10F3800090408A35910538F484EB90E08E1B9F0BFA |
:10F39000FC0141E00DC0CF01855B90408A359105AD |
:10F3A00018F4E45BF04003C02E1B3F0BF9014FEF54 |
:10F3B000EE0FFF1FED5CF64F259134918C2F9927AE |
:10F3C00087FD9095289FB001299F700D389F700D83 |
:10F3D0001124842F992787FD9095689FA001699F2C |
:10F3E000500D789F500D1124CA01CF9108952AE540 |
:10F3F00030E0281B390BC9010E94AB790895CF93E7 |
:10F40000DF9380E00E94B2918091260190912701C4 |
:10F410006AE070E00E94C09F9F938F9380912601C5 |
:10F42000909127016AE070E00E94C09F7F936F93E4 |
:10F4300087E09AE09F938F93C5EAD1E9DF93CF935A |
:10F44000E0919C05F0919D0509952DB73EB7285F89 |
:10F450003F4F2DBF8091A401882361F186E00E9477 |
:10F46000B2918091960199279F938F938091750A0D |
:10F470009091760A6AE070E00E94AC9F7F936F9350 |
:10F480008FED90E09F938F938091120A9091130AD1 |
:10F490009F938F9380E19AE09F938F93DF93CF9315 |
:10F4A000E0919C05F0919D0509958DB79EB70C964E |
:10F4B0008DBF12C086E00E94B2918EE19AE09F93C8 |
:10F4C0008F93DF93CF93E0919C05F0919D05099573 |
:10F4D0000F900F900F900F9080912A05882309F4C8 |
:10F4E00052C080914205909143050E94721A882370 |
:10F4F00091F08091AA01882319F01092AA0103C00B |
:10F5000081E08093AA018CED95E00E94691A9093A6 |
:10F510004305809342058091AA018823E1F080E0B1 |
:10F520000E94B2911F921F9290912A0581E1989FAB |
:10F53000C0011124825B944F9F938F93DF93CF93ED |
:10F54000E0919C05F0919D0509952DB73EB72A5F86 |
:10F550003F4F2DBF3BC086E00E94B29180912A05AB |
:10F5600099279F938F9385E29AE09F938F93DF93E0 |
:10F57000CF93E0919C05F0919D0509958DB79EB7BD |
:10F5800006968DBF23C0809152058823F9F00E9412 |
:10F59000B89180E10E94B29184EB98E09F938F93A1 |
:10F5A0008091010199279F938F9381E39AE09F9324 |
:10F5B0008F93DF93CF93E0919C05F0919D05099582 |
:10F5C0002DB73EB7285F3F4F2DBF5CC080E10E9442 |
:10F5D000B2918091EA029091EB026CE370E00E949C |
:10F5E000AC9F9F938F938091EA029091EB026CE322 |
:10F5F00070E00E94AC9F7F936F938091EF0A90918F |
:10F60000F00A9F938F938CE39AE09F938F93C5EAC0 |
:10F61000D1E9DF93CF93E0919C05F0919D05099589 |
:10F620008091560A2DB73EB7265F3F4F2DBF80FF12 |
:10F6300029C08AE10E94B2918091410199279F934C |
:10F640008F938091430490914404A0914504B0911C |
:10F650004604BC01CD0124E630E040E050E00E94C9 |
:10F66000F59F3F932F9389E49AE09F938F93DF93C5 |
:10F67000CF93E0919C05F0919D0509958DB79EB7BC |
:10F6800008968DBFDF91CF910895CF93DF9380E0EF |
:10F690000E94B29180913609992787FD90959F939A |
:10F6A0008F9380912E09992787FD90959F938F9333 |
:10F6B00080912609992787FD90959F938F9380913C |
:10F6C0001E09992787FD90959F938F9380E59AE077 |
:10F6D0009F938F93C5EAD1E9DF93CF93E0919C0587 |
:10F6E000F0919D05099580E10E94B2912DB73EB73A |
:10F6F000245F3F4F2DBF80915609992787FD909534 |
:10F700009F938F9380914E09992787FD90959F93A2 |
:10F710008F9380914609992787FD90959F938F93AA |
:10F7200080913E09992787FD90959F938F9380E65E |
:10F730009AE09F938F93DF93CF93E0919C05F09194 |
:10F740009D05099580913F082DB73EB7245F3F4F37 |
:10F750002DBF853098F480E10E94B29180E79AE055 |
:10F760009F938F93DF93CF93E0919C05F0919D053C |
:10F7700009950F900F900F900F9018C08730B0F43C |
:10F7800088E10E94B2918FED90E09F938F9381E882 |
:10F790009AE09F938F93DF93CF93E0919C05F09134 |
:10F7A0009D0509958DB79EB706968DBFDF91CF91C8 |
:10F7B00008950F931F9380E00E94B2912AE030E0F9 |
:10F7C0008091EB0A9091EC0AB9010E94AC9F9F9343 |
:10F7D0008F938091EB0A9091EC0AB9010E94AC9F43 |
:10F7E0007F936F938091260190912701B9010E9428 |
:10F7F000C09F9F938F938091260190912701B9011B |
:10F800000E94C09F7F936F938AE89AE09F938F93A3 |
:10F8100005EA11E91F930F93E0919C05F0919D0576 |
:10F82000099580E10E94B2918DB79EB70C968DBF6D |
:10F830008091EF0A9091F00A9F938F938091ED0A47 |
:10F840009091EE0A9F938F938CE99AE09F938F9308 |
:10F850001F930F93E0919C05F0919D0509958DB73D |
:10F860009EB708968DBF1F910F910895EF92FF925A |
:10F870000F931F9380E00E94B2918FEDE82EF12C40 |
:10F88000FF92EF9280919001909191019F938F93BD |
:10F890008091290599279F938F9388EA9AE09F93F7 |
:10F8A0008F9305EA11E91F930F93E0919C05F09166 |
:10F8B0009D05099580E10E94B2918DB79EB70A9689 |
:10F8C0008DBF8091270599279F938F93FF92EF9289 |
:10F8D0008091280599279F938F938BEB9AE09F93B4 |
:10F8E0008F931F930F93E0919C05F0919D050995CF |
:10F8F0008DB79EB70A968DBF1F910F91FF90EF9025 |
:10F9000008950F931F93CF93DF938091A401C5EACD |
:10F91000D1E9882309F47DC080E00E94B2918091F2 |
:10F92000720A99279F938F938091740A99279F93C6 |
:10F930008F938EEC9AE09F938F938E01DF93CF93FA |
:10F94000E0919C05F0919D0509958DB79EB70896AD |
:10F950008DBF8091730A833031F48CE00E94B291A4 |
:10F960008DED9AE005C08CE00E94B29182EE9AE0A3 |
:10F970009F938F93DF93CF93E0919C05F0919D052A |
:10F9800009950F900F900F900F908091710A81FF51 |
:10F9900012C08CE00E94B29187EE9AE09F938F9301 |
:10F9A0001F930F93E0919C05F0919D0509950F9091 |
:10F9B0000F900F900F9080E10E94B291809196017C |
:10F9C00099279F938F938FED90E09F938F938091D2 |
:10F9D000770A9091780A9F938F938091750A9091FE |
:10F9E000760A6AE070E00E94AC9F7F936F938CEE82 |
:10F9F0009AE09F938F9385EA91E99F938F93E0918B |
:10FA00009C05F0919D0509958DB79EB70C968DBF0D |
:10FA100012C082E00E94B2918FEF9AE09F938F9381 |
:10FA2000DF93CF93E0919C05F0919D0509950F9090 |
:10FA30000F900F900F90DF91CF911F910F9108952C |
:10FA4000CF93C82F209144052093450599278F32E5 |
:10FA50009105E1F0803391051CF44F9779F027C0B0 |
:10FA60008F349105D9F08F38910509F586E0289FEC |
:10FA7000F0011124E751F64F849117C086E0289FCA |
:10FA8000F0011124E651F64F84910FC086E0289FC3 |
:10FA9000F0011124E551F64F849107C086E0289FBC |
:10FAA000F0011124E451F64F849180934405909124 |
:10FAB0004405809145059813C0E08091AB01282F43 |
:10FAC00033278F5F8093AB0120FF0FC00E94B89156 |
:10FAD0009091440586E0989FF0011124E351F64F80 |
:10FAE000259134918C2FF901099580E090E0CF9118 |
:10FAF00008951092EC0A1092EB0A1092F00A1092FC |
:10FB0000EF0A1092EE0A1092ED0A1092F10A82E3C7 |
:10FB100090E00E94691A90934705809346050895E6 |
:10FB2000E82FFF2783E0EE0FFF1F8A95E1F7E95EDC |
:10FB3000F64F9581993C18F4892F99270895808173 |
:10FB400082FF07C08AE0989FC00111248850974027 |
:10FB50000895892F99270895A0E0B0E0E2EBFDE732 |
:10FB60000C9419A080914605909147050E94721A45 |
:10FB7000882309F4C0C08091460590914705C2963C |
:10FB80009093470580934605C0E0D0E07E01BB24FA |
:10FB90007FEFC72EDB2C07E119E0F801838187FF97 |
:10FBA00014C0B3948581893C30F08D2D0E94907DE6 |
:10FBB000C80FD91F02C0C80FD11DF8018181E80EFE |
:10FBC000F11C86818C1508F4C82ED394085F1F4F52 |
:10FBD000FBE0FD1510F7C092F10AEF2841F52091E6 |
:10FBE0004C0530914D0540914E0550914F05BB2776 |
:10FBF000A52F942F832F90934B0580934A05AA2716 |
:10FC0000BB27281B390B4A0B5B0BCE01AA27BB274E |
:10FC1000280F391F4A1F5B1F20934C0530934D0559 |
:10FC200040934E0550934F05C5E0D0E013C080913E |
:10FC30004A0590914B058C179D0718F4C81BD90BEA |
:10FC400002C0C0E0D0E08B2D9927880F991FC80F04 |
:10FC5000D91F2596D093EC0AC093EB0ACF3FD1056C |
:10FC600078F480912601909127018C9F90018D9FBF |
:10FC7000300D9C9F300D1124C90164E670E013C063 |
:10FC8000CE0196958795969587952091260130917E |
:10FC90002701289FA001299F500D389F500D112446 |
:10FCA000CA0169E170E00E94AC9F7093EE0A609314 |
:10FCB000ED0A80914805909149058C0F9D1F909306 |
:10FCC00049058093480552E0813D9507A0F02091B9 |
:10FCD000EF0A3091F00A2F5F3F4F805D9240E2E0E3 |
:10FCE000813D9E07C0F79093490580934805309366 |
:10FCF000F00A2093EF0AE9E0CDB7DEB70C9435A007 |
:10FD000030915C05E32FFF2783E0EE0FFF1F8A95FC |
:10FD1000E1F7E95EF64F2781422F552747FD5095C1 |
:10FD200080915D059927841795072CF420935D0534 |
:10FD300030935F050AC0222341F080915E05992728 |
:10FD40004817590714F420935E05832F8F5F809323 |
:10FD50005C058C30D0F010925C0580915E058F3F81 |
:10FD600019F08093550502C01092550580915D05EC |
:10FD70008093560580915F05809354058FEF8093A3 |
:10FD80005E0510925D0510925F05089595E1899FCB |
:10FD9000802D11240E947E9788EC9DE09F938F9385 |
:10FDA00080E597E99F938F93E0919C05F0919D05E5 |
:10FDB00009950F900F900F900F900895CF93C0E08A |
:10FDC0004091AC01409353058091100485FF0CC015 |
:10FDD00080910704882331F080916708863011F400 |
:10FDE000CEE029C0C0E127C080912A058823D1F048 |
:10FDF000282F3327C90101968197A4F480914804E4 |
:10FE0000882341F4F901E20FF31FE35FF44F84917B |
:10FE1000882341F4220F331F245F344FF901C4912A |
:10FE2000CC2349F48091B30886FD03C01092AC0145 |
:10FE300004C0C42F02C0C0935305809160058C1785 |
:10FE400071F480916105909162050E94721A882375 |
:10FE500019F480E090E017C080EA9FE002C080EDD6 |
:10FE600097E00E94691A9093620580936105CC2304 |
:10FE700031F08091AC01C81711F41092AC01C0931D |
:10FE800060058C2F9927CF91089520E030E050E055 |
:10FE90008091C40A992789389105B9F08A3891056B |
:10FEA00034F481309105F1F00297F9F021C08D38DA |
:10FEB0009105A1F08E38910524F48A38910541F01E |
:10FEC00017C08E38910539F013C02AE43BE008C012 |
:10FED00022E23CE005C022EF3AE002C02EE13BE026 |
:10FEE0005CE206C025EC32E002C028ED32E054E0CE |
:10FEF0009091B90A40E08091BA0A481770F49517BA |
:10FF000060F4D901A90FB11DE42FFF27EA55F54F81 |
:10FF100085898C939F5F4F5FEECF089520E335E78F |
:10FF2000809141018B3211F08D32F9F480915208A9 |
:10FF3000282F332780913D0490913E04829FA00199 |
:10FF4000839F500D929F500D1124CA0163E070E011 |
:10FF50000E94C09FCB019B01205D3A48C196C1978A |
:10FF600008F03FC02EEF34E73CC0803229F5809185 |
:10FF7000100481FF36C02091500530915105205D5D |
:10FF80003A4855E72133350748F085E724393807E3 |
:10FF900018F420E335E702C02456304045E720330B |
:10FFA0003407F8F454E72D3C350718F020E335E723 |
:10FFB00018C02C593F4F15C08E3549F49091380424 |
:10FFC0008AE0989F90011124205D3A480AC0863744 |
:10FFD00041F4909138048AE0989FC0011124281BB5 |
:10FFE000390BC90108951F9399278A38910509F49F |
:10FFF000A5C18B38910524F48938910551F05EC371 |
:020000021000EC |
:100000008D38910509F491C28E38910509F4EAC141 |
:1000100055C30E94DE7E182F8093240C80914304E8 |
:1000200090914404A0914504B0914604BC01CD01D7 |
:1000300024E630E040E050E00E94F59FDA01C9017B |
:100040008C509E4F9093500B80934F0B112319F4BB |
:100050000E948E7F02C080E395E79093560B8093B9 |
:10006000550B8091550B9091560B9093580B8093A4 |
:10007000570B90935A0B8093590B20914F0B309153 |
:10008000500B8091530B9091540B2817390724F48F |
:100090003093540B2093530B8091510B9091520B42 |
:1000A0008217930724F43093520B2093510B109234 |
:1000B0004C0B8AE49BE090937405809373058091C8 |
:1000C00041018093700B80910F0480FF02C083E494 |
:1000D00001C080E28093710B20912A05222311F147 |
:1000E000822F6AE00E94A09F805D80935B0B822F2D |
:1000F0000E94A09F892F805D80935C0B8AE3809390 |
:100100005D0B81E1289FF0011124AEE5BBE0E25BCD |
:10011000F44F9FE084918D939150319697FFFACFE1 |
:1001200080E241C080910704882361F0ABE5BBE029 |
:10013000E6E8FDE094E184918D939150319697FF2C |
:10014000FACFB9C28091100485FF0CC0ABE5BBE0CB |
:10015000ECE9FDE094E184918D939150319697FF05 |
:10016000FACFA9C280915205882301F1ABE5BBE02B |
:10017000EFE7FDE096E084918D939150319697FFE3 |
:10018000FACF80910101805D80935F0BA2E6BBE016 |
:10019000E4EBF8E09BE081918D93915097FFFBCFCA |
:1001A00080E280936D0B80936E0BB9C030915A053D |
:1001B000332309F499C087E580935B0B80E5809336 |
:1001C0005C0B40E240935D0B20915B05822F6AE05F |
:1001D0000E94A09F805D80935E0B822F0E94A09F53 |
:1001E000892F805D80935F0B8FE28093600B832F5C |
:1001F0000E94A09F805D8093610B832F0E94A09F2F |
:10020000892F805D8093620B4093630B209157058B |
:100210003091580583E0293E380780F0C90168EE27 |
:1002200073E00E94AC9FCB01805D8093640BC90199 |
:1002300068EE73E00E94AC9F9C0102C04093640B87 |
:100240002536310580F0C90164E670E00E94AC9F5C |
:10025000CB01805D8093650BC90164E670E00E946C |
:10026000AC9F9C0103C080E28093650BC9016AE0EA |
:1002700070E00E94AC9FCB01805D8093660BC9014A |
:100280006AE070E00E94AC9F805D8093670B8DE612 |
:100290008093680B80E28093690B20915905253685 |
:1002A00060F0822F64E60E94A09F805D80936A0BBD |
:1002B000822F0E94A09F292F02C080936A0B822F59 |
:1002C0006AE00E94A09F805D80936B0B822F0E944A |
:1002D000A09F892F805D80936C0B83E780936D0BCB |
:1002E00080E280936E0BE7C1809134048823D1F4BF |
:1002F000ABE5BBE0E4EBFDE090E184918D939150A0 |
:10030000319697FFFACF92E390936B0B8EE2809336 |
:100310006C0B80E380936D0B90936E0B81E6809362 |
:100320006F0BC9C1ABE5BBE0E2EBFDE094E184916A |
:100330008D939150319697FFFACFBDC180914304C0 |
:1003400090914404A0914504B0914604BC01CD01B4 |
:1003500024E630E040E050E00E94F59FDA01C90158 |
:100360008C509E4F9093380C8093370C8091240CC6 |
:10037000882319F40E948E7F02C080E395E7909352 |
:100380003A0C8093390C88E780933B0C8091720A79 |
:1003900080933C0C8091710A81FF02C084E407C005 |
:1003A0008091730A833011F480E201C081E280936E |
:1003B0003D0C82E29CE090937405809373058091DC |
:1003C00096018093490C80913D0C80934B0C809159 |
:1003D000770A9091780A97FD019695958795809375 |
:1003E0003E0C69C10E94807E809143049091440438 |
:1003F000A0914504B0914604BC01CD0124E630E053 |
:1004000040E050E00E94F59FDA01C9018C509E4FF8 |
:1004100090930D0B80930C0B8091260190912701F6 |
:100420009093070B8093060B8091260190912701F2 |
:100430009093090B8093080B8091120A9091130AF4 |
:1004400097FD0196959587958093F80A8093FF0A0A |
:100450002091770A3091780A37FF02C02F5F3F4F13 |
:10046000359527952093FD0A8091750A9091760A1B |
:1004700064E170E00E94AC9F6093FE0A2093040B3D |
:100480006093050B8091240C882319F40E948E7FC1 |
:1004900002C080E395E79093150B8093140B88E7D7 |
:1004A0008093160B80912601909127019093110B58 |
:1004B0008093100B809155058C5E80930A0B809180 |
:1004C00056058C5E80930B0B8091EF0A9091F00A99 |
:1004D0006AE070E00E94AC9F7093130B6093120B64 |
:1004E0008091240C8093F40A8091EB0A9091EC0A9D |
:1004F00090930F0B80930E0B82EF9AE0909374050C |
:10050000809373052091EA023091EB02C9016CE3FC |
:1005100070E00E94AC9F6093190BC9016CE370E01E |
:100520000E94AC9F80931A0BC6C00E94807E80916F |
:10053000750A9091760A64E670E00E94AC9F709311 |
:10054000340B6093330B8091120A9091130A97FD3C |
:100550000196959587958093240B809190019091B9 |
:10056000910197FD0196959587958093250B809134 |
:10057000D3078093280B8091770A9091780A97FD92 |
:100580000196959587958093290B80910201482FBC |
:1005900055279A012E5F3F4F8091260190912701A8 |
:1005A0002817390784F48091260190912701841B34 |
:1005B000950B9C01220F331F280F391F822F865065 |
:1005C0008093300B02C01092300B8091300B853637 |
:1005D00018F084E68093300B80912A059927909338 |
:1005E000320B8093310B8091430490914404A0918D |
:1005F0004504B0914604BC01CD0124E630E040E062 |
:1006000050E00E94F59FDA01C9018C509E4F9093F3 |
:10061000360B8093350B80912601909127019093A2 |
:100620002B0B80932A0B80912601909127019093A8 |
:100630002D0B80932C0B8091240C882319F40E949D |
:100640008E7F02C080E395E79093380B8093370B41 |
:100650008091240C88588093390B809126019091C9 |
:10066000270190933D0B80933C0B809155058C5E48 |
:1006700080932E0B809156058C5E80932F0B80917A |
:10068000EF0A9091F00A6AE070E00E94AC9F7093CC |
:100690003F0B60933E0B1092200B8091EB0A9091E0 |
:1006A000EC0A90933B0B80933A0B8EE19BE0909386 |
:1006B0007405809373052CE230E002C020E030E046 |
:1006C000C9011F910895EF92FF920F931F93CF934B |
:1006D000DF9380915005909151059C0153E0220FCA |
:1006E000331F5A95E1F7281B390B80913303909102 |
:1006F0003403280F391F37FF02C0295F3F4F43E003 |
:10070000359527954A95E1F730935105209350058B |
:1007100090916405992309F026C380916305282FE1 |
:100720003327442755278F5F80936305F9012131D3 |
:10073000310508F015C3E757FF4F0C9447A080918F |
:10074000100485FF2AC080E00E947E9780912601D8 |
:10075000909127016AE070E00E94C09F9F938F9361 |
:1007600080912601909127016AE070E00E94C09F6D |
:100770007F936F938EED9DE09F938F9381E797E931 |
:100780009F938F93E0919C05F0919D0509952DB75E |
:100790003EB7285F3F4F2DBF28C080E00E947E9764 |
:1007A00080912601909127016AE070E00E94C09F2D |
:1007B0009F938F9380912601909127016AE070E0CA |
:1007C0000E94C09F7F936F938BEE9DE09F938F93CA |
:1007D00080E597E99F938F93E0919C05F0919D05AB |
:1007E00009958DB79EB708968DBF8091560A80FFF8 |
:1007F0003FC0809160048823E9F08AE00E947E97E0 |
:100800008091410199279F938F9380914304909108 |
:100810004404A0914504B0914604BC01CD0124E6F6 |
:1008200030E040E050E00E94F59F3F932F9388EF27 |
:100830009DE0C8C68AE00E947E9780914304909113 |
:100840004404A0914504B0914604BC01CD0124E6C6 |
:1008500030E040E050E00E94F59F3F932F9384E00A |
:100860009EE09F938F9380E597E99F938F93D1C7E5 |
:100870008AE00E947E978FE09EE09F938F9380E5B1 |
:1008800097E90C94348D8091100485FF2AC085E18E |
:100890000E947E978091EA029091EB026CE370E0F7 |
:1008A0000E94AC9F9F938F938091EA029091EB02FC |
:1008B0006CE370E00E94AC9F7F936F9389E19EE0B0 |
:1008C0009F938F9381E797E99F938F93E0919C0586 |
:1008D000F0919D0509952DB73EB7285F3F4F2DBF7D |
:1008E00028C085E10E947E978091EA029091EB02F8 |
:1008F0006CE370E00E94AC9F9F938F938091EA021B |
:100900009091EB026CE370E00E94AC9F7F936F9339 |
:1009100086E29EE09F938F9380E597E99F938F9364 |
:10092000E0919C05F0919D0509958DB79EB70896BD |
:100930008DBF8FE10E947E9780E690E09F938F931A |
:100940008091120A9091130A9F938F9383E39EE004 |
:100950009F938F93C0E5D7E9DF93CF93E0919C05F8 |
:10096000F0919D05099580910F042DB73EB7285F42 |
:100970003F4F2DBF80FF06C089E20E947E978EE325 |
:100980009EE06FC389E20E947E9780E49EE0E2C60B |
:100990008091100485FF1BC08AE20E947E9780919F |
:1009A000EF0A9091F00A9F938F9382E49EE09F93C9 |
:1009B0008F9381E797E99F938F93E0919C05F09146 |
:1009C0009D0509958DB79EB706968DBF1BC08AE21F |
:1009D0000E947E978091EF0A9091F00A9F938F93E7 |
:1009E0008AE49EE09F938F9380E597E99F938F938E |
:1009F000E0919C05F0919D0509952DB73EB72A5FC2 |
:100A00003F4F2DBF86E30E947E978091EB0A909125 |
:100A1000EC0A6AE070E00E94AC9F9F938F938091F4 |
:100A2000EB0A9091EC0A6AE070E00E94AC9F7F9321 |
:100A30006F9382E59EE09F938F9380E597E99F9364 |
:100A40008F93E0919C05F0919D0509958DB79EB718 |
:100A50000896E7C689E00E947E978EE59EE09F9308 |
:100A60008F9300E517E91F930F93E0919C05F09198 |
:100A70009D0509958EE10E947E970F900F900F9033 |
:100A80000F9080E69EE09F938F931F930F93E091CA |
:100A90009C05F0919D05099583E30E947E970F9038 |
:100AA0000F900F900F9082E69EE09F938F931F937D |
:100AB0000F93E0919C05F0919D0509958FE30E94AD |
:100AC0007E970F900F900F900F9084E69EE09F937B |
:100AD0008F931F930F93E0919C05F0919D050995CD |
:100AE0008EE70E947E970F900F900F900F908AE7ED |
:100AF0009EE09F938F931F930F93B8C78091A4019B |
:100B0000882309F462C08DE50E947E9780E99EE00B |
:100B10009F938F93C0E5D7E9DF93CF93E0919C0536 |
:100B2000F0919D05099584E50E947E970F900F90A6 |
:100B30000F900F908091720A99279F938F9382E96B |
:100B40009EE09F938F93DF93CF93E0919C05F0916C |
:100B50009D0509958EE50E947E972DB73EB72A5FC9 |
:100B60003F4F2DBF8091750A9091760A6AE070E040 |
:100B70000E94AC9F7F936F938BE99EE09F938F932E |
:100B8000DF93CF93E0919C05F0919D0509958DB77A |
:100B90009EB706968DBF8091730A833081F4809151 |
:100BA000710A81FF06C08BE50E947E9785EA9EE070 |
:100BB000D1C58BE50E947E9788EA9EE0CBC58BE588 |
:100BC0000E947E978BEA9EE04BC784E0FCC3809135 |
:100BD000A401882309F47AC08091660520E5E22EFD |
:100BE00027E9F22E882309F44BC089E60E947E97FC |
:100BF0008091290599279F938F938EEA9EE09F937A |
:100C00008F93FF92EF92E0919C05F0919D050995DD |
:100C100085E70E947E972DB73EB72A5F3F4F2DBFD5 |
:100C20008091960199279F938F9300E610E01F9380 |
:100C30000F938091770A9091780A9F938F9389EB15 |
:100C40009EE09F938F93FF92EF92E0919C05F0912D |
:100C50009D05099582E70E947E978DB79EB70A96FB |
:100C60008DBF8091270599279F938F931F930F9393 |
:100C70008091280599279F938F9385EC9EE091C6DC |
:100C800089E60E947E978091960199279F938F9382 |
:100C900080E690E09F938F938091770A9091780AF5 |
:100CA0009F938F938091740A99279F938F9385EDDB |
:100CB0009EE09F938F93FF92EF92E0919C05F091BD |
:100CC0009D0509958DB79EB70C96ABC585E07BC396 |
:100CD00090912A059923D1F080917005882381F0A5 |
:100CE000913270F487E00E94C67E83E90E947E976D |
:100CF00080912A0599279F938F938EEE9EE0CDC316 |
:100D000083E90E947E9789EF9EE0DCC38091100406 |
:100D100090E5E92E97E9F92E85FF06C084E90E9447 |
:100D20007E978FEF9EE003C483E90E947E9782E165 |
:100D30009FE0FDC38091870C863059F48091660551 |
:100D4000882319F010926605B8C681E08093660585 |
:100D5000B4C6883009F0B1C60E94839781E004C40C |
:100D600090936305B2C6913009F009C48091630580 |
:100D7000282F3327442755278F5F80936305F90178 |
:100D80002131310508F09CC6E656FF4F0C9447A070 |
:100D90008091100485FF43C080E00E947E9780917F |
:100DA000EF0A9091F00A9F938F9380912601909182 |
:100DB00027016AE070E00E94C09F9F938F9380910B |
:100DC0002601909127016AE070E00E94C09F7F9306 |
:100DD0006F938091EA029091EB026CE370E00E94C5 |
:100DE000AC9F9F938F938091EA029091EB026CE30A |
:100DF00070E00E94AC9F7F936F9388E29FE09F9387 |
:100E00008F9381E797E99F938F93E0919C05F091F1 |
:100E10009D0509952DB73EB7225F3F4FCFC580E0B6 |
:100E20000E947E978091EF0A9091F00A9F938F9392 |
:100E300080912601909127016AE070E00E94C09F96 |
:100E40009F938F9380912601909127016AE070E033 |
:100E50000E94C09F7F936F938091EA029091EB0272 |
:100E60006CE370E00E94AC9F9F938F938091EA02A5 |
:100E70009091EB026CE370E00E94AC9F7F936F93C4 |
:100E800083E49FE0EBC285E10E947E9780E690E0DC |
:100E90009F938F9380919001909191019F938F9355 |
:100EA0008EE59FE09F938F93C0E5D7E9DF93CF93C3 |
:100EB000E0919C05F0919D0509958091560A2DB70A |
:100EC0003EB7285F3F4F2DBF80FF51C08091600427 |
:100ED000882339F18FE10E947E978091430490919D |
:100EE0004404A0914504B0914604BC01CD0124E620 |
:100EF00030E040E050E00E94F59F3F932F9388E65A |
:100F00009FE09F938F9380E697E99F938F93E09163 |
:100F10009C05F0919D0509958DB79EB706968DBFEE |
:100F200038C08FE10E947E978091430490914404E1 |
:100F3000A0914504B0914604BC01CD0124E630E007 |
:100F400040E050E00E94F59F3F932F9381E79FE0A0 |
:100F50009F938F93DF93CF93E0919C05F0919D0534 |
:100F600009952DB73EB72A5F3F4F2DBF12C08FE1C5 |
:100F70000E947E978AE79FE09F938F93DF93CF93A2 |
:100F8000E0919C05F0919D0509950F900F900F90B1 |
:100F90000F9089E20E947E978091410199279F934B |
:100FA0008F9384E89FE031C48091A4018823F9F0F5 |
:100FB0008BE20E947E978091960199279F938F9351 |
:100FC0008091750A9091760A6AE070E00E94AC9F69 |
:100FD0007F936F9380E690E09F938F938091770A41 |
:100FE0009091780A9F938F9387E89FE068C182E091 |
:100FF000EAC18FE30E947E978091ED0A9091EE0AFC |
:101000009F938F938091EB0A9091EC0A6AE070E0D5 |
:101010000E94AC9F9F938F938091EB0A9091EC0A72 |
:101020006AE070E00E94AC9F7F936F938EE99FE02F |
:101030009F938F93C0E5D7E9DF93CF93E0919C0511 |
:10104000F0919D05099580910F042DB73EB7265F5D |
:101050003F4F2DBF80FF0AC082E50E947E9782EB42 |
:101060009FE09F938F9380E697E9FEC482E50E94FC |
:101070007E9785EB9FE06EC38091A40100E5E02E92 |
:1010800007E9F02E882309F449C084E50E947E9781 |
:101090008091720A99279F938F938091740A992760 |
:1010A0009F938F9388EB9FE09F938F93E701FF922D |
:1010B000EF92E0919C05F0919D0509958DB79EB743 |
:1010C00008968DBF8091730A833051F484E60E94A4 |
:1010D0007E978BEC9FE09F938F93FF92EF920BC0D4 |
:1010E00084E60E947E9781ED9FE09F938F9381E736 |
:1010F00097E99F938F93E0919C05F0919D05099549 |
:101100000F900F900F900F908091710A81FFDDC4B6 |
:1011100084E60E947E9787ED9FE01CC384E50E94D1 |
:101120007E978DED9FE003C28091650510E5E12E6D |
:1011300017E9F12E882309F45BC089E60E947E97A7 |
:1011400083E00E94907D6AE070E00E94AC9F9F93D4 |
:101150008F9383E00E94907D6AE070E00E94AC9FD4 |
:101160007F936F9382E00E94907D6AE070E00E941E |
:10117000AC9F9F938F9382E00E94907D6AE070E025 |
:101180000E94AC9F7F936F9381E00E94907D6AE004 |
:1011900070E00E94AC9F9F938F9381E00E94907DAE |
:1011A0006AE070E00E94AC9F7F936F9380E00E94A2 |
:1011B000907D6AE070E00E94AC9F9F938F9380E0E7 |
:1011C0000E94907D6AE070E00E94AC9F7F936F93D5 |
:1011D00083EF9FE09F938F93FF92EF92E0919C05A6 |
:1011E000F0919D0509952DB73EB72C5E3F4FE6C3A4 |
:1011F00089E60E947E9780E690E09F938F9380918E |
:101200003609992787FD90959F938F9380912E099A |
:10121000992787FD90959F938F9380912609992711 |
:1012200087FD90959F938F9380911E09992787FD45 |
:1012300090959F938F9380E190E19F938F93FF927E |
:10124000EF92E0919C05F0919D0509958DB79EB7B1 |
:101250000E96E7C28091650590913F08882309F4B6 |
:10126000AFC0943009F4AEC09630C9F58EE70E9445 |
:101270007E9785E00E94907D6AE070E00E94AC9FBE |
:101280009F938F9385E00E94907D6AE070E00E94BA |
:10129000AC9F7F936F9384E00E94907D6AE070E042 |
:1012A0000E94AC9F9F938F9384E00E94907D6AE0A0 |
:1012B00070E00E94AC9F7F936F9383E290E19F93D5 |
:1012C0008F9380E597E99F938F93E0919C05F09130 |
:1012D0009D0509952DB73EB7245F3F4F6FC39730EB |
:1012E00008F4F3C38EE70E947E9788E00E94907D09 |
:1012F0006AE070E00E94AC9F9F938F9388E00E9409 |
:10130000907D6AE070E00E94AC9F7F936F9387E0CE |
:101310000E94907D6AE070E00E94AC9F9F938F9343 |
:1013200087E00E94907D6AE070E00E94AC9F7F930E |
:101330006F9386E00E94907D6AE070E00E94AC9F0F |
:101340009F938F9386E00E94907D6AE070E00E94F8 |
:10135000AC9F7F936F9385E00E94907D6AE070E080 |
:101360000E94AC9F9F938F9385E00E94907D6AE0DE |
:1013700070E00E94AC9F7F936F9384E00E94907D09 |
:101380006AE070E00E94AC9F9F938F9384E00E947C |
:10139000907D6AE070E00E94AC9F7F936F9382E340 |
:1013A00090E19F938F9380E597E99F938F93E091CE |
:1013B0009C05F0919D0509958DB79EB7489631C261 |
:1013C000943021F486E00E94C67E7FC39630F1F40B |
:1013D0008EE70E947E9780E690E09F938F938091A6 |
:1013E0004609992787FD90959F938F9380913E0999 |
:1013F000992787FD90959F938F938FE490E19F931A |
:101400008F9380E597E99F938F93CFC2973008F42D |
:101410005CC38EE70E947E9780E690E09F938F9357 |
:1014200080915609992787FD90959F938F9380917E |
:101430004E09992787FD90959F938F938091460938 |
:10144000992787FD90959F938F9380913E099927C7 |
:1014500087FD90959F938F9382E690E19F938F9362 |
:1014600080E597E99F938F93ECCE90912A0599237D |
:1014700009F44AC0809170058823F9F09132E8F4AC |
:1014800087E00E94C67E83E90E947E9780912A05AC |
:1014900099279F938F9385E790E19F938F9380E6A1 |
:1014A00097E99F938F93E0919C05F0919D05099595 |
:1014B0002DB73EB72A5F3F4F81C283E90E947E97D6 |
:1014C00080E890E19F938F9300E517E91F930F93B6 |
:1014D000E0919C05F0919D0509951F921F929091B6 |
:1014E0002A0581E1989FC0011124825B944F9F934C |
:1014F0008F931F930F93E0919C05F0919D050995A3 |
:101500008DB79EB70A968DC180911004C0E5EC2E70 |
:10151000C7E9FC2E85FF06C084E90E947E9786E815 |
:1015200090E105C083E90E947E9789E990E19F934D |
:101530008F93FF92EF929AC28091870C863079F454 |
:1015400080916505882319F01092650503C081E03C |
:101550008093650585E00E94C67E86E0A3C2883040 |
:1015600031F40E94839782E080936405A4C28130A5 |
:1015700009F0A3C20E948397109264059CC2923026 |
:1015800009F0A1C280916305282F332744275527EE |
:101590008F5F80936305F9012131310508F090C216 |
:1015A000E555FF4F0C9447A080E00E947E9784EBA6 |
:1015B00098E09F938F938091010199279F938F9338 |
:1015C0008FEA90E19F938F9380E697E99F938F93A3 |
:1015D000E0919C05F0919D0509952DB73EB7285FD8 |
:1015E0003F4FECC185E10E947E9782EC98E09F938B |
:1015F0008F93809102016AE00E94A09F892F992712 |
:101600009F938F93809102010E94A09F99279F939F |
:101610008F938EEB90E19F938F9380E597E99F9353 |
:101620008F93E0919C05F0919D05099569CF8AE221 |
:101630000E947E978FEC90E19F938F93C0E5D7E94E |
:10164000DF93CF93E0919C05F0919D0509958091E2 |
:10165000560A0F900F900F900F9080FF41C080911D |
:101660004D089091260481FD0BC0892F99279F93E7 |
:101670008F9384ED90E19F938F93DF93CF9313CF5C |
:10168000E0919C05F0919D05933318F08EED90E16B |
:1016900002C085EE90E19F938F93DF93CF930995DE |
:1016A0000F900F900F900F908091390AE0919C0558 |
:1016B000F0919D059091260480FF0BC0892F9927FA |
:1016C0009F938F938CEE90E19F938F93DF93CF93B3 |
:1016D000A4C0892F99279F938F9382EF90E1C4C074 |
:1016E00088EF90E137C08FE30E947E9781E091E11F |
:1016F0009F938F93C0E5D7E9DF93CF93E0919C054B |
:10170000F0919D0509950F900F900F900F9080918B |
:10171000A308882319F485E091E11CC080911D0481 |
:10172000E0919C05F0919D05882319F08EE091E1F0 |
:1017300002C085E191E19F938F93DF93CF93099549 |
:101740000F900F900F900F908091B20886FFBDC14F |
:101750008CE191E19F938F93DF93CF9387C184E5D1 |
:101760000E947E9783E291E19F938F93C0E5D7E932 |
:10177000DF93CF93E0919C05F0919D0509958091B1 |
:10178000560A0F900F900F900F9085FD03C088E2CE |
:1017900091E108C0809191080E947348823358F407 |
:1017A00081E391E19F938F93DF93CF93E0919C0529 |
:1017B000F0919D0516C0843B18F088E391E1F2CFCB |
:1017C0008091B208E0919C05F0919D0585FF03C0D2 |
:1017D0008FE391E102C086E491E19F938F93DF93C1 |
:1017E000CF9309950F900F900F900F908091A708BD |
:1017F000882309F46AC18EE50E947E978091A7082C |
:1018000099279F938F938DE491E19F938F93DF931B |
:10181000CF93E0919C05F0919D0509958DB79EB7FA |
:1018200006968DBF52C189E60E947E9788E591E1B8 |
:101830009F938F93C0E5D7E9DF93CF93E0919C0509 |
:10184000F0919D0509950F900F900F900F9080914A |
:10185000A608E0919C05F0919D05882351F09927F9 |
:101860009F938F9382E691E19F938F93DF93CF9322 |
:101870001ECE86E691E19F938F93DF93CF93FAC0BC |
:1018800080916705B0E5EB2EB7E9FB2E882309F0C0 |
:1018900053C08EE70E947E9780916F0199279F9396 |
:1018A0008F9380914208E82FFF27EE0FFF1FE85823 |
:1018B000F64F808191819F938F9380914108E82F0B |
:1018C000FF27EE0FFF1FE858F64F808191819F930D |
:1018D0008F938CE691E19F938F93FF92EF92E0912B |
:1018E0009C05F0919D05099583E90E947E978DB72F |
:1018F0009EB70A968DBF80914408E82FFF27EE0F10 |
:10190000FF1FE858F64F808191819F938F938091BC |
:101910004308E82FFF27EE0FFF1FE858F64F80819E |
:10192000918181589F4F9F938F9380E891E19F937E |
:101930008F93FF92EF924CCE8EE70E947E9780911C |
:101940004C0499279F938F9380914B0499279F93E1 |
:101950008F9380914A0499279F938F938FE891E109 |
:101960009F938F93FF92EF92E0919C05F0919D05DC |
:10197000099583E90E947E978DB79EB70A968DBF21 |
:1019800080914F0499279F938F9380914E049927BC |
:101990009F938F9380914D0499279F938F9383EA10 |
:1019A00091E19F938F93FF92EF92E0919C05F091CC |
:1019B0009D0509952DB73EB7265F3F4F2DBF85C0CA |
:1019C00080917005882309F480C08EE70E947E977D |
:1019D0008091560A86FD11C087EB91E19F938F930A |
:1019E00081E797E99F938F93E0919C05F0919D0586 |
:1019F00009950F900F900F900F908091B008992744 |
:101A00008F709070892B89F086EC91E19F938F9372 |
:101A100081E797E99F938F93E0919C05F0919D0555 |
:101A200009950F900F900F900F908091560A82FFAA |
:101A300011C080ED91E19F938F9381E797E99F9388 |
:101A40008F93E0919C05F0919D0509950F900F9063 |
:101A50000F900F908091560A83FD37C085ED91E17C |
:101A60009F938F9381E797E99F938F93E0919C05D4 |
:101A7000F0919D0509950F900F900F900F9025C044 |
:101A80000091870C063089F480916705882319F04E |
:101A90001092670503C081E08093670586E00E948D |
:101AA000C67E87E00E94C67E08C0013031F40E94E5 |
:101AB000839700936405109263051092870C05C00C |
:101AC0001092630502C010926405E6E0CDB7DEB760 |
:101AD0000C9438A04FB728E130E0F8948091C90009 |
:101AE0008F778093C9008091C9008F7B8093C90054 |
:101AF0008091C9008F7D8093C900832F992780939F |
:101B0000CD002093CC008091C80082608093C800F3 |
:101B100080E18093C9008091CA008F778093CA00CA |
:101B20008091CA008F7B8093CA008091CA00809107 |
:101B3000CA008F7E8093CA008091CA00886080931B |
:101B4000CA008091C9008B7F8093C9008091CA0030 |
:101B500084608093CA008091CA0082608093CA002A |
:101B60008091C80087FF03C08091CE00F9CF80919B |
:101B7000C90080688093C9008091650C846080935F |
:101B8000650C4FBF089590913D05992341F48F3026 |
:101B900031F49093690580E580933D050895E091C7 |
:101BA0006905EF5FE0936905E83121F481E08093F6 |
:101BB00068050895E93120F089E180936905089569 |
:101BC000FF27E25BF34F80830895A0E0B0E0EBEEE7 |
:101BD000FDE80C9418A091E0D92E82E0A82EBD2C2F |
:101BE000E12C01E0F02E8091650C82FDB5C0809162 |
:101BF0006F008F7D80936F00E091A908EE2351F074 |
:101C0000FF27EE0FFF1FE858F64F80819181843641 |
:101C100091055CF480914904883C20F4809149044A |
:101C20008C5E01C088EC8093490480914F0C682F32 |
:101C3000772780916A05815080936A058F3F31F440 |
:101C40001CE7C12E82E080936A0502C0C4E2CC2E5C |
:101C500040E04C1508F07EC0EA2DFF27E25BF34F11 |
:101C600080818D2111F06E297F298D2D9927880F74 |
:101C7000991FD82E882319F4B1E0DB2EAD0CEE0CA1 |
:101C8000FF1C20E0E21628E0F20609F061C0A1E0A6 |
:101C9000EA2EF12CCB018050944065E070E00E9468 |
:101CA000C09FAB2DBB27FD01EA0FFB1FE858F64F85 |
:101CB000808191819C01220F331F280F391F260F2D |
:101CC000371F37FF02C02D5F3F4FE901D595C795FC |
:101CD000D595C795CB0101968C179D0714F42197D4 |
:101CE00006C061507040C617D7070CF4219680914A |
:101CF0004904833CD8F08D010A0F1B1FF801E858F6 |
:101D0000F64F80819181FE01E81BF90BCF0163E062 |
:101D100070E00E94C09FCB01880F991F860F971F0C |
:101D20000254164FF8019183808307C0AA0FBB1F8E |
:101D3000A254B64F11961C921E92EB2DFF27EE0F68 |
:101D4000FF1FE858F64FD183C08360E070E0B39482 |
:101D50004F5F7FCF1092400110926805EAE0CDB747 |
:101D6000DEB70C9434A00895089540E050E08091CF |
:101D70006B0590916C059C01220F331F280F391FB2 |
:101D80008091330390913403280F391F37FF02C02D |
:101D90002D5F3F4F359527953595279530936C05E9 |
:101DA00020936B05809141018B32D9F480915208C8 |
:101DB000282F332780913D0490913E04829FA001FB |
:101DC000839F500D929F500D1124CA0157FD4F96CD |
:101DD000AC0125E0559547952A95E1F74B5F5F4F9C |
:101DE0003DC08D32D9F480915208282F332780913D |
:101DF0003D0490913E04829FA001839F500D929FCD |
:101E0000500D1124CA0157FD4F96AC0195E0559530 |
:101E100047959A95E1F74550504020C0803271F4C3 |
:101E20008091100481FF1AC0C90137FD4F96AC01A3 |
:101E300085E0559547958A95E1F710C08E3529F4D0 |
:101E400080913804482F552709C0863739F480918E |
:101E50003804992744275527481B590BCA01AA273C |
:101E600097FDA095BA2F80939F029093A002A09314 |
:101E7000A102B093A20208950F931F930E94807E47 |
:101E80008091260190912701AA2797FDA095BA2F4E |
:101E90008093CE019093CF01A093D001B093D10154 |
:101EA0008091EB0A9091EC0AAA27BB278093E1016D |
:101EB0009093E201A093E301B093E4010AE010E003 |
:101EC0008091EF0A9091F00AB8010E94AC9FCB017B |
:101ED000AA27BB278093F4019093F501A093F60104 |
:101EE000B093F7018091430490914404A09145047C |
:101EF000B0914604BC01CD0124E630E040E050E062 |
:101F00000E94F59F20930702309308024093090234 |
:101F100050930A028091900190919101AA2797FD18 |
:101F2000A095BA2F80931A0290931B02A0931C02D3 |
:101F3000B0931D028091720A9927AA27BB2780932C |
:101F40002D0290932E02A0932F02B0933002809125 |
:101F5000740A9927AA27BB278093400290934102D5 |
:101F6000A0934202B09343028091750A9091760A41 |
:101F7000B8010E94AC9FCB01AA27BB2780935302D4 |
:101F800090935402A0935502B09356028091770A21 |
:101F90009091780AAA2797FDA095BA2F80936602A0 |
:101FA00090936702A0936802B093690280915605EE |
:101FB0009927AA27BB278093790290937A02A0934E |
:101FC0007B02B0937C02809129059927AA27BB2721 |
:101FD00080938C0290938D02A0938E02B0938F0217 |
:101FE00080912A059927AA27BB278093B202909354 |
:101FF000B302A093B402B093B5021F910F9108955C |
:102000004FB720E430E0F8948091C9008F77809337 |
:10201000C9008091C9008F7B8093C9008091C9005D |
:102020008F7D8093C900832F99278093CD002093C3 |
:10203000CC008091C80082608093C80088E18093C2 |
:10204000C9008091CA008F778093CA008091CA002E |
:102050008F7B8093CA008091CA008F7D8093CA00D5 |
:102060008091CA008F7E8093CA008091CA00877FCA |
:102070008093CA008091C9008B7F8093C9008091B2 |
:10208000CA0084608093CA008091CA0082608093F5 |
:10209000CA008091C80087FF03C08091CE00F9CFAD |
:1020A0008091C90080688093C9004FBF08950F9345 |
:1020B0001F93CF93DF93482F4F5F893108F08BC078 |
:1020C00080917709841720F44F5F4093770941503E |
:1020D000CB0183539B4268E170E00E94C09FA42F14 |
:1020E000BB27FD01EA0FFB1FE858F64F8081918165 |
:1020F0009B01281B390BC90137FF03C090958195BF |
:102100009F4F069794F480914904883C30F4809165 |
:102110004904865F8093490408C088EC8093490491 |
:1021200080916F008F7D80936F00FD01EA0FFB1F90 |
:10213000E858F64F808191819C01220F331F280FB0 |
:10214000391F260F371F37FF02C02D5F3F4FE901B0 |
:10215000D595C795D595C795CB0101968C179D0749 |
:1021600014F4219706C061507040C617D7070CF4CD |
:10217000219680914904843BD8F08D010A0F1B1FE2 |
:10218000F801E858F64F80819181FE01E81BF90BB8 |
:10219000CF0163E070E00E94C09FCB01880F991FC0 |
:1021A000860F971F0254164FF8019183808307C052 |
:1021B000AA0FBB1FA254B64F11961C921E92E42F79 |
:1021C000FF27EE0FFF1FE858F64FD183C08344303E |
:1021D00011F410924001DF91CF911F910F9108955A |
:1021E000CF93DF932091880C822F9927807F907066 |
:1021F000409709F066C02F3109F040C08091890CEA |
:102200008093770590918B0C9093790580918C0C3D |
:1022100080937805992309F054C080914108282FB4 |
:102220003327220F331FF901E254F64F1182108237 |
:1022300080914208A82FBB27AA0FBB1FFD01E254C3 |
:10224000F64F1182108280914408E82FFF27EE0F8D |
:10225000FF1FCF018254964FEC0119821882285833 |
:10226000364FE90119821882A858B64F11961C9270 |
:102270001E92E858F64F1182108223C0C22FCF70F1 |
:10228000CA30F8F48091890C8093B40C80918A0C48 |
:102290008093B30C80918B0C8093B60C80918C0C46 |
:1022A0008093B50C6091B30C7091B40C8C2F0E948C |
:1022B00057906091B50C7091B60C8C2F8F5F0E9477 |
:1022C0005790DF91CF910895CF93C82F8F3F49F456 |
:1022D00080917A058F3F29F410927C0510927B053E |
:1022E00032C020917C05222339F4CF3111F485E0EE |
:1022F00001C084E080937D0580917D0590917B05F0 |
:102300008217A0F4892F809580937B058F3F19F465 |
:102310008EEF80937B0580917B05C81711F40E9496 |
:10232000F09010927C0510927B050BC0E22FFF27E6 |
:10233000E857F34FC0832F5F20937C059C0F909349 |
:102340007B05C0937A05CF910895909176059332DD |
:1023500040F4E92FFF27E057F34F80839F5F90936E |
:1023600076050895833218F48D5F8093760508957D |
:1023700090E2E3E9FCE08FE19193815087FFFCCF8D |
:102380000895CF93CFB723E031E0F8948091C9004E |
:102390008F778093C9008091C9008F7B8093C9009B |
:1023A0008091C9008F7D8093C900832F99278093E6 |
:1023B000CD002093CC008091C80082608093C8003B |
:1023C00088E18093C9008091CA008F778093CA000A |
:1023D0008091CA008F7B8093CA008091CA0080627E |
:1023E0008093CA008091CA0080618093CA00809166 |
:1023F000CA0088608093CA008091C900846080937D |
:10240000C9008091CA0084608093CA008091CA008C |
:1024100082608093CA008091C80087FF03C08091CA |
:10242000CE00F9CF8091C90080688093C900809167 |
:10243000C90080648093C9000E94B891CFBFCF913A |
:102440000895282F99278F709070892B31F420954B |
:1024500080917505822B8093750508951F920F92C8 |
:102460000FB60F9211248F93EF93FF938091E302A5 |
:10247000882309F068C0E0917F05EE2389F48091FC |
:102480007E05882369F48091900C882321F081E0F7 |
:102490008093800505C08091C90081608093C90048 |
:1024A00080918005882379F4EF5FE0937F05809128 |
:1024B000670C8E1720F481E0809380051CC0FF27F5 |
:1024C000E959F34F3CC080917E05882361F48091E7 |
:1024D000900C882311F483E003C0813999F481E0E2 |
:1024E00080937E050FC0833099F48091900C8823EF |
:1024F00049F01092900C8091C9008E7F8093C900A2 |
:102500008EEF1EC08091C90081608093C9000EC00B |
:10251000833261F48091C9008E7F8093C9008FEF70 |
:102520008093CE0081E08093E30218C080917E0505 |
:10253000E82FFF27E057F34F8F5F80937E05808160 |
:102540008093CE000BC010927E0510927F051092F2 |
:1025500080058091C90080618093C900FF91EF914F |
:102560008F910F900FBE0F901F901895682727E04E |
:10257000322F67FF06C0862F9927880F991F832760 |
:1025800002C0862F880F682F215027FFF2CF99278E |
:1025900008950F931F93CF93DF93062F60E0162FBC |
:1025A000601740F4EC0189910E94B692682F1F5F7A |
:1025B0001017C8F3862F9927DF91CF911F910F91A4 |
:1025C0000895DC0190E0961758F48C91803241F028 |
:1025D0009F5F961728F4FD01E90FF11D8081F6CF6A |
:1025E000892F99270895A0E0B0E0E9EFF2E90C9473 |
:1025F00019A08FE98093680C80E180936A0C84EACB |
:1026000080936B0C85E580936C0C8DE580936D0C4D |
:1026100010926E0C80918205882309F06AC0809127 |
:10262000810513E1819FC001112463E089549E4F0D |
:102630000E94E192082F80918105819FC0011124A1 |
:102640006AE083559E4F0E94E192982F800F865F2B |
:102650008093670C2EEFB22EB80EB092690C2091C9 |
:10266000810520936F0CE92EFF24C70113E0880F2A |
:10267000991F1A95E1F7802B8093700C822F992770 |
:10268000C3E1CC2ED12C8C9D90018D9D300D9C9D55 |
:10269000300D1124C90183559E4FA701BC0181E76C |
:1026A0009CE00E94E19D11278091810599278C9DD6 |
:1026B000E0018D9DD00D9C9DD00D1124CE0189543B |
:1026C0009E4FA801BC01C7018F58934F0E94E19D06 |
:1026D0000959134F0E0D1F1D6B2D89E69CE00E94BA |
:1026E000C992F8018287809182058F5F809382056D |
:1026F00093C0C0906E0C1C2D0E943C8F3091E40260 |
:10270000303108F058C0B3E1EB2EF12C632F812F4C |
:102710009927FC01EE0FFF1FE80FF91FEC0DF11DCB |
:10272000E959F34F832F99278E9DD0018F9DB00DCE |
:102730009E9DB00D1124A355BE4FED012D8574E073 |
:10274000880F991F7A95E1F7282B20873E3088F46F |
:102750002E853F853F798A899927982F88279295DA |
:10276000990F907E282B392B2187832F99278287D9 |
:1027700016C0ED012E853F85488959892187BB27E1 |
:10278000A52F942F832F8287CA01AA27BB2783876F |
:10279000852F9927AA27BB278487E2E0CE0E862FB4 |
:1027A0008F5F682F1F5F163020F4382F803108F4B8 |
:1027B000AECF8093E40283E0189FC00111242C2D3A |
:1027C000280F285F2093670C225C2093690C812FCF |
:1027D00099278C01000F111F080F191F0C0D111DD7 |
:1027E0000959134F2054622F89E69CE00E94C99238 |
:1027F000E80188878091E402803170F081E0809365 |
:10280000E40210928205809181058F5F809381059B |
:10281000803110F010928105E9E0CDB7DEB70C945D |
:1028200035A08091E302882309F447C08091100409 |
:1028300085FD04C08091E802882381F082E98093BD |
:10284000900C83E28093910C8091E802882309F434 |
:1028500085E58093920C1092E80202C08093900C60 |
:102860008091E5028F3071F4809175050E94207D82 |
:10287000882341F081E98093900C8093910C81E34F |
:102880008093920C1092E3028091C80085FFFCCFE8 |
:102890008091C9008F7E8093C9008091C9008E7F8E |
:1028A0008093C9000E94F3928EE78093CE008091BE |
:1028B00075058093E502109275050895EF92FF92D9 |
:1028C0000F931F93CF93DF937C018B01EA01452B7C |
:1028D00039F0F80181918F01F70109952197C9F726 |
:1028E000E6E0CDB7DEB70C9438A0EF92FF920F93DD |
:1028F0001F93CF93DF937C018B01EA01452B41F0BD |
:10290000F8010F5F1F4F8491F70109952197C1F7D7 |
:10291000E6E0CDB7DEB70C9438A00F931F93CF93AA |
:102920008C01C62F161634F480E2F8010995C150C7 |
:102930001C16D4F3CF911F910F9108950F931F93FD |
:10294000CF938C01C62F161634F480E3F801099555 |
:10295000C1501C16D4F3CF911F910F910895A5E398 |
:10296000B0E0E5EBF4E90C9410A02E96EEADFFADCF |
:102970002E9788249924540180916F05882321F48F |
:102980002C961FAE1EAE2C97AEE44A2E512C4C0E48 |
:102990005D1E6F01B60105C0153239F00894C11CE7 |
:1029A000D11CF60114911123B9F7A601461B570B50 |
:1029B00031F02C968EAD9FAD2C970E94759411230B |
:1029C00009F46AC20894C11CD11CFF24FDA6FCA610 |
:1029D000EFEFEE2EF9A6F6010894C11CD11C14915C |
:1029E000153721F0812F80628837B1F4F0FE0AC0DC |
:1029F000F20124E030E0420E531E80809180A280DC |
:102A0000B3800AC0F20142E050E0440E551E8081BE |
:102A100091814C01AA24BB24103221F489A588237A |
:102A2000D1F61DC0133219F458E0F52AD4CF1A326A |
:102A300011F01D3291F41A3259F4F20182E090E063 |
:102A4000480E591EE081ECA7EE232CF6E195ECA789 |
:102A500090E1F92AAFEDFA22BECF1B3211F419A78B |
:102A6000BACF1E32C1F5F6010894C11CD11C1491D5 |
:102A70001A3279F4F20122E030E0420E531E408116 |
:102A800051813FEF4F3F530714F44FEF5FEFE42EB8 |
:102A9000A2CF40E050E0812F80538A30A0F4CA01D9 |
:102AA00073E0880F991F7A95E1F7840F951F480FFF |
:102AB000591F410F511D40535040F6010894C11C4D |
:102AC000D11C1491E8CF8FEF4F3F580714F44FEF0C |
:102AD0005FEFE42E85CF103329F4F4FC7CCF90E235 |
:102AE000F92A79CF812F81538930D8F440E050E022 |
:102AF000CA0163E0880F991F6A95E1F7840F951F5B |
:102B0000480F591F410F511D40535040F601089482 |
:102B1000C11CD11C1491812F80538A3048F34CA7DB |
:102B20005FCF183619F4A4E0FA2A55CF1C3619F4F1 |
:102B3000B1E0FB2A50CF133661F43E010894611CCA |
:102B4000711CF20122E030E0420E531E8081898325 |
:102B50003CC1143421F0143611F0193651F51434F7 |
:102B600011F431E0F32AF0FE0AC0F20144E050E033 |
:102B7000440E551E80809180A280B3800CC0F2016B |
:102B800082E090E0480E591E808191814C01AA2478 |
:102B900097FCA094BA2CB7FE0AC0B094A09490946D |
:102BA0008094811C911CA11CB11C8DE289A70AE0B4 |
:102BB0006FC01F3411F01F3631F41F3411F491E04F |
:102BC000F92A08E064C0103779F4F201A2E0B0E01D |
:102BD0004A0E5B1E808191814C01AA24BB2400E136 |
:102BE000B0E4FB2A18E753C01337C1F5F20122E025 |
:102BF00030E0420E531E608071806114710489F4CC |
:102C00003E010894611C711C88E289838EE6F30101 |
:102C1000818385E78B838CE68C838D8389E28E8329 |
:102C20001F82E7FC13C08E2D992787FD9095AC017C |
:102C300060E070E0C3010E94D49D009729F0382E17 |
:102C40003618E3140CF0C3C03E2CC1C0F301019050 |
:102C50000020E9F731973E2E3618B9C0153511F02E |
:102C6000153731F4153511F4F1E0FF2A0AE00FC0F1 |
:102C7000183519F0183709F0A0C000E1F3FE07C0BD |
:102C800081149104A104B10411F020E4F22A19A6E0 |
:102C9000EDA6E7FC02C03FEDF32249E2642E712C61 |
:102CA0006C0E7D1E81149104A104B10421F44DA584 |
:102CB000442309F47BC0802F9927AA27BB278EA71E |
:102CC0009FA7A8ABB9AB202E332490E0891690E0E3 |
:102CD000990691E0A90690E0B90648F0C501B40153 |
:102CE0002EA53FA548A959A90E94D39F17C0AFEFB1 |
:102CF0008A169104A104B10449F040F0C401B10165 |
:102D00000E94AC9F9B014427552708C0882D602F47 |
:102D10000E94A09F282F3327442755272AAB3BAB7F |
:102D20004CAB5DAB0A3059F48AA9880F880F880F25 |
:102D30009AA9990F890F382D381B832F10C00031A5 |
:102D400039F48AA98295807F482D481B842F07C0BB |
:102D50008AA9880F880F880F582D581B852F90E05F |
:102D60002EA53FA548A959A982169306A406B50623 |
:102D700008F091E08AA89BA8ACA8BDA88A3010F4FE |
:102D8000805D04C0895A183509F48F7DD3018E9374 |
:102D90003D01992309F099CF083041F4F3FE06C0B4 |
:102DA000803321F080E3FD0182933F01CE01019643 |
:102DB000382E3618F8E23F0E0BC0112309F46CC010 |
:102DC0003E010894611C711C198331E0332E19A651 |
:102DD000032D2DA4231827FC222489A5882311F074 |
:102DE0000F5F02C0F6FC0E5F020DEF2CFF24C7013F |
:102DF00080739070892B49F48CA5801B682F2C96CA |
:102E00008EAD9FAD2C970E948D9489A5882331F0BB |
:102E100041E050E0BE01675D7F4F0AC0E6FE0EC094 |
:102E200080E38AA71BA742E050E0BE01665D7F4FAA |
:102E30002C968EAD9FAD2C970E945E94C701807337 |
:102E40009070809749F48CA5801B682F2C968EADCE |
:102E50009FAD2C970E949E94622D2C968EAD9FADB7 |
:102E60002C970E949E94832D992787FD9095AC0105 |
:102E7000B3012C968EAD9FAD2C970E945E94E4FE1C |
:102E800089CD2CA5201B2CA7622F2C968EAD9FAD33 |
:102E90002C970E948D947ECDE2E1CB5C0C942CA00B |
:102EA000982F80918F0C883A50F480918F0CE82FE6 |
:102EB000FF27EA58F44F93838F5F80938F0C089518 |
:102EC000982F80918F0C883A58F480918F0CE82FBE |
:102ED000FF27EA58F44F906893838F5F80938F0C9D |
:102EE0000895982F80917005882321F0892F0E94E2 |
:102EF00060970895892F0E9450970895883A10F49A |
:102F000080938F0C089580E090E2E9E7FBE09193D5 |
:102F10008F5F883AE0F308954FB721E830E0F894E6 |
:102F20008091C9008F778093C9008091C9008F7B01 |
:102F30008093C9008091C9008F7D8093C900832F41 |
:102F400099278093CD002093CC008091C8008260A7 |
:102F50008093C80088E18093C9008091CA008F7770 |
:102F60008093CA008091CA008F7B8093CA008091B1 |
:102F7000CA008F7D8093CA008091CA008F7E8093A3 |
:102F8000CA008091CA00877F8093CA008091C900DF |
:102F900084608093C9008091CA0084608093CA00D5 |
:102FA0008091CA0082608093CA008091C9008160CC |
:102FB0008093C9008091C80087FF03C08091CE0034 |
:102FC000F9CF8091C90080688093C9004FBF3CE76A |
:102FD0003093F20A2DE720931D0B8EE88093F30ABD |
:102FE00010920F0B10920E0B1092F80A80EE809345 |
:102FF000F50A30934A0B2093750B1092560B1092E2 |
:10300000550B1092580B1092570B10925A0B1092AE |
:10301000590B84EF91E09093540B8093530B909352 |
:10302000520B8093510B9093500B80934F0B109247 |
:103030004C0B89E880934B0B1092730B1092740B1E |
:1030400080E980934D0B3093220C20934D0C10920D |
:10305000240C8AE88093230C10922A0C1092290CDD |
:103060001092280C10922C0C10922D0C10922E0CF9 |
:1030700010922F0C1092310C1092320C1092330CD3 |
:103080001092340C1092380C1092370C1092360CAF |
:103090001092350C80EA8093250C30931E0B209300 |
:1030A000490B1092200B8DE880931F0B1092480B58 |
:1030B00080ED8093210B8BE78093760B80E88093E3 |
:1030C000770B1092780B8091F80A90E2E9E7FBE029 |
:1030D00091938F5F883AE0F38DE78093210C0895F8 |
:1030E000CF93C82F80918305803879F48C2F0E946C |
:1030F000F37F8093720580917205882331F1C0932C |
:103100008E0C809172058F5F16C08F37F1F480911D |
:10311000870C882329F48C2F80958F708093870CDF |
:103120000E94DE7E8093780B86E79BE09093740587 |
:10313000809373058DEA809372058091C9008F7E1C |
:103140008093C90082E080937105C0938305CF917D |
:10315000089530917105332331F0809171058150CC |
:1031600080937105089580917205882381F14091C3 |
:10317000720590918405413091F4292F3093840594 |
:103180008091C90080618093C90080917005882377 |
:1031900019F03093700510C0409370050DC0E09198 |
:1031A0007305F09174058191F0937405E0937305B4 |
:1031B000282F980F909384058091C80085FFFCCF3D |
:1031C0002093CE00809172058150809372050895FE |
:1031D0006F927F928F929F92AF92BF92CF92DF9227 |
:1031E000EF92FF920F931F93882361F1823041F495 |
:1031F00010928D0510928E0510928F0510929005F9 |
:103200002091430430914404409145045091460478 |
:10321000DA01C90119E0880F991FAA1FBB1F1A956F |
:10322000D1F78093360390933703A0933803B0937C |
:103230003903209385053093860540938705509385 |
:10324000880526C1A0904304B0904404C090450472 |
:10325000D09046048091850590918605A0918705C0 |
:10326000B091880535014601681A790A8A0A9B0AD5 |
:103270006092890570928A0580928B0590928C05E8 |
:1032800080913A0390913B0384559F4F7C01002726 |
:10329000F7FC0095102F8091260A9091270A9C0137 |
:1032A000442737FD4095542FC801B7010E94819FE4 |
:1032B00097FF04C06150704E8F4F9F4FAB01BC0110 |
:1032C000FDE07595679557954795FA95D1F74C5A56 |
:1032D0005040604070404093910550939205609338 |
:1032E0009305709394052091860A3091870A37FFE1 |
:1032F00002C0215F3F4FE4E035952795EA95E1F75D |
:1033000080913E0390913F03829FD001839FB00D37 |
:10331000929FB00D1124CD01B7FF02C081509F4F85 |
:10332000E92FFF27E7FDFA952091840A3091850A5D |
:1033300037FF02C0215F3F4F84E0359527958A957E |
:10334000E1F780913C0390913D03829FD001839FE0 |
:10335000B00D929FB00D1124CD01B7FF02C0815076 |
:103360009F4F892F990F990BE80FF91FCF01AA27BB |
:1033700097FDA095BA2F840F951FA61FB71F8093A6 |
:10338000910590939205A0939305B0939405BC0189 |
:10339000CD012DE030E040E050E00E94819F7B01B4 |
:1033A0008C01C401B30124EF31E040E050E00E9401 |
:1033B000819FDC01CB01E80EF91E0A1F1B1F8091C3 |
:1033C0008D0590918E05A0918F05B091900520916B |
:1033D0009505309196054091970550919805821B6F |
:1033E000930BA40BB50BE80EF91E0A1F1B1FE092EE |
:1033F0008D05F0928E0500938F0510939005D801EE |
:10340000C70180509E4FAF4FBF4FB7FF06C0D801D6 |
:10341000C70181509A4FAF4FBF4F1AE0B595A7959E |
:10342000979587951A95D1F7809395059093960572 |
:10343000A0939705B0939805A0928505B092860554 |
:10344000C0928705D09288052091360330913703CA |
:103450004091380350913903E0902903F0902A03FA |
:1034600000912B0310912C032E193F09400B510B97 |
:10347000280F391F4A1F5B1F2A0D3B1D4C1D5D1D68 |
:103480002093360330933703409338035093390326 |
:103490008091950590919605909334038093330322 |
:1034A0008091360390913703A0913803B09139038E |
:1034B000BC01CD011F910F91FF90EF90DF90CF9055 |
:1034C000BF90AF909F908F907F906F9008952FB78F |
:1034D00040E0F894E0E0F0E081E2809357009491BE |
:1034E000E2E0F0E0809357003491E4E0F0E0809374 |
:1034F000570084912FBF9E3199F4363941F48930B9 |
:1035000011F441E00DC08A3059F442E009C0373966 |
:1035100039F4863011F443E003C0853009F444E007 |
:10352000842F992708959FB7F8948091C900877FC9 |
:103530008093C9008091C9008F7E8093C9008091DB |
:10354000C9008F778093C9008091C9008F7B8093D9 |
:10355000C9008091C9008F7D8093C9009FBF0895E5 |
:103560001F93CF93DF93182F80916F05882309F461 |
:10357000A7C08091E202181709F4A2C080916E05DD |
:10358000882321F40E94679A80936E0582ED91E072 |
:1035900090933F0180933E0187EB92E19F938F933D |
:1035A000C8E9D6E1DF93CF93E0919C05F0919D05AA |
:1035B00009950F900F900F900F90812F9927AA27B0 |
:1035C000BB27FC01099778F5E454FF4F20919C0537 |
:1035D00030919D050C9447A083EB92E102C08AEAEA |
:1035E00092E19F938F93DF93CF93F901099527C0C1 |
:1035F00085EA92E1F6CF8DE992E1F3CF85E992E198 |
:103600009F938F93DF93CF93F901099588ED91E014 |
:1036100090933F0180933E0112C080E992E1E1CF97 |
:1036200084EC92E1DECF8AEC92E19F938F93DF935B |
:10363000CF93E0919C05F0919D05099510E00F90C6 |
:103640000F900F900F9080916E05843011F08230B2 |
:1036500011F50E94939A812F8150833018F40E94B3 |
:10366000FD772CC0143019F40E94C19127C0183086 |
:1036700019F40E94B38E22C0153019F40E940090F4 |
:103680001DC0163019F40E948C9718C01730B1F481 |
:103690000E946A8D13C0112389F080EE92E19F93FE |
:1036A0008F9388E996E19F938F93E0919C05F09129 |
:1036B0009D0509950F900F900F900F901093E202C7 |
:1036C000DF91CF911F9108950F931F93082F81E0F1 |
:1036D00080936F054091E102E0E4F2E120E030E008 |
:1036E0005FE4849199272F5F3F4F829FB001839FB2 |
:1036F000700D929F700D112446275150319657FF3F |
:10370000F0CF4093E102E8E1F2E120E030E057E25F |
:10371000849199272F5F3F4F829FB001839F700D47 |
:10372000929F700D112446275150319657FFF0CFCC |
:103730004093E10280916E05882321F40E94679AEC |
:1037400080936E058FEA94E990939D0580939C0584 |
:103750008091E102833459F088E190E029E20FB6CC |
:10376000F894A895809360000FBE20936000053008 |
:1037700091F08BEF92E19F938F9388E996E19F936D |
:103780008F93E0919C05F0919D0509950F900F9006 |
:103790000F900F90EECF80910301893158F1809105 |
:1037A0006D058823A9F488E193E19F938F9388E9BD |
:1037B00096E19F938F93E0919C05F0919D0509956B |
:1037C00087E1809303010F900F900F900F9012C02C |
:1037D00015BC873119F48093030106C087E08093FC |
:1037E000140186E080931301E091DF02F091E00282 |
:1037F0008DEF09950E94230A81E690E09F938F93B5 |
:1038000082E090E09F938F939F938F938091030129 |
:103810006AE00E94A09F892F99279F938F938091A0 |
:1038200003010E94A09F99279F938F9382E593E1C4 |
:103830009F938F9308E916E11F930F93E0919C05E6 |
:10384000F0919D05099580E492E19F938F931F93DA |
:103850000F93E0919C05F0919D05099588E192E117 |
:103860009F938F931F930F93E0919C05F0919D057B |
:1038700009950E94230A83EC8093810080916F0058 |
:10388000806280936F008DB79EB746968DBF1F9163 |
:103890000F9108958091A7088D3338F08091710AB7 |
:1038A00087FD03C08CE38093A70880915608882386 |
:1038B00031F08055853618F08FE7809356080895CB |
:1038C00080916F05882309F477C080919905815014 |
:1038D00080939905882309F059C089E1809399055F |
:1038E0008091A7088E3338F08091710A87FD03C05C |
:1038F0008DE38093A70880914904823820F5809158 |
:10390000110490911204805D974020F08091F10A9B |
:10391000843620F410929B0510929A0580919A05A6 |
:1039200090919B05009739F1019790939B058093A7 |
:103930009A05419728F18091710A84FF21C08091F6 |
:103940000F0484601BC080914904853BC8F09091AE |
:10395000A70884E1989FC0011124409620919A0500 |
:1039600030919B052817390730F42F5F3F4F309374 |
:103970009B0520939A0580910F048B7F80930F0401 |
:103980008091E102833411F010926F059091E20270 |
:10399000963019F40E94A99808958091E602882330 |
:1039A00021F081508093E60208958BE48093E60233 |
:1039B000943011F40E94119408951F920F920FB643 |
:1039C0000F9211242F933F934F935F936F937F93A5 |
:1039D0008F939F93AF93BF93EF93FF939091CE00FC |
:1039E0008091F2028823B9F09093C6008091F20290 |
:1039F000823009F03FC09F3FE9F58FEF94E3ACE0E0 |
:103A0000B0E0C297A109B109B7FFFBCF8091DF05F4 |
:103A10008093CE002FC02091E202822F815083300C |
:103A200020F4892F0E94547825C0243021F4892F56 |
:103A30000E9421921FC0283021F4892F0E94B48E49 |
:103A400019C080910301893120F080916D05882390 |
:103A500089F0253021F4892F0E9464910BC0263013 |
:103A600021F4892F0E94709805C0273019F4892FFE |
:103A70000E94C38DFF91EF91BF91AF919F918F9164 |
:103A80007F916F915F914F913F912F910F900FBE5A |
:103A90000F901F901895002422273327442751E0C8 |
:103AA000BB27EE27FF27A0E1660F771F881F991F0E |
:103AB000001C221F331F441F660F771F881F991F8A |
:103AC000001C221F331F441F2AF4050E2B1F3E1F0C |
:103AD0004F1F04C0051A2B0B3E0B4F0B550FBB1F7E |
:103AE000EE1F587F556047FD5250AA95E9F6E695BE |
:103AF000B7955795E695B7955795852F9B2F0895C0 |
:103B00002227332741E0552768E0880F991F221F9D |
:103B1000331F880F991F221F331F1AF4240F351FDC |
:103B200002C0241B350B440F551F487F456037FDED |
:103B300042506A9551F75695479556954795842F6B |
:103B40000895AA2797FF04C0809590958A1F9A1F11 |
:103B500077FF04C0609570956A1F7A1F669F900179 |
:103B6000779FA001679F300D411D5A1F300D411DE9 |
:103B70005A1F889FF001999F2E0F3F1F401D511D16 |
:103B8000899F300D411D5A1F300D411D5A1FCA011A |
:103B9000B901112480CFFB01DC0102C005900D9218 |
:103BA00041505040D8F70895FC014150504030F04A |
:103BB00001900616D1F73197CF01089588279927EC |
:103BC0000895FB01DC0102C001900D92415050406C |
:103BD000D8F70895A0E0B0E0E0EFFDE90C9418A05C |
:103BE0006C017B01EA01590121978FEFCF3FD80784 |
:103BF00089F086010894C11CD11CC7010894E11CFE |
:103C0000F11CF5010995F80180832197FFEFCF3F63 |
:103C1000DF0779F7EAE0CDB7DEB70C9434A0CF9296 |
:103C2000DF92EF92FF920F931F937C016B01FB01D8 |
:103C30000995082FC7010196F6010995182FC801AB |
:103C40001F910F91FF90EF90DF90CF900895A0E02B |
:103C5000B0E0EDE2FEE90C941AA08C017B01EA01D0 |
:103C6000690121978FEFCF3FD80771F0F7012191BC |
:103C70007F01C8010F5F1F4F622FF6010995219741 |
:103C8000FFEFCF3FDF0791F7E8E0CDB7DEB70C9449 |
:103C900036A0CF92DF92EF92FF920F931F936C01A9 |
:103CA0008B017A01FA010995812F9927682FC601A6 |
:103CB0000196F70109951F910F91FF90EF90DF900A |
:103CC000CF9008955058BB27AA270ED0E0C0D1D07E |
:103CD00030F0D6D020F031F49F3F11F41EF4C6C06E |
:103CE0000EF4E095E7FBBCC0E92FE2D080F3BA17F1 |
:103CF000620773078407950718F071F49EF5FAC000 |
:103D00000EF4E0950B2EBA2FA02D0B01B9019001F6 |
:103D10000C01CA01A0011124FF27591B99F0593F3A |
:103D200050F4503E68F11A16F040A22F232F342F82 |
:103D30004427585FF3CF469537952795A795F040D0 |
:103D40005395C9F77EF41F16BA0B620B730B840BE5 |
:103D5000BAF09150A1F0FF0FBB1F661F771F881F9D |
:103D6000C2F70EC0BA0F621F731F841F48F48795F5 |
:103D700077956795B795F7959E3F08F0B3CF9395E4 |
:103D8000880F08F09927EE0F97958795089598D09A |
:103D900088F09F5790F0B92F9927B751A0F0D1F034 |
:103DA000660F771F881F991F1AF0BA95C9F712C0BE |
:103DB000B13081F09FD0B1E008959CC0672F782F7B |
:103DC0008827B85F39F0B93FCCF38695779567952A |
:103DD000B395D9F73EF490958095709561957F4F96 |
:103DE0008F4F9F4F0895E89409C097FB3EF490953C |
:103DF0008095709561957F4F8F4F9F4F9923A9F0C4 |
:103E0000F92F96E9BB279395F69587957795679552 |
:103E1000B795F111F8CFFAF4BB0F11F460FF1BC096 |
:103E20006F5F7F4F8F4F9F4F16C0882311F096E929 |
:103E300011C0772321F09EE8872F762F05C06623D7 |
:103E400071F096E8862F70E060E02AF09A95660F90 |
:103E5000771F881FDAF7880F9695879597F9089549 |
:103E600097F99F6780E870E060E008959FEF80EC2D |
:103E7000089500240A9416161706180609060895D0 |
:103E800000240A9412161306140605060895092E36 |
:103E90000394000C11F4882352F0BB0F40F4BF2BA5 |
:103EA00011F460FF04C06F5F7F4F8F4F9F4F0895E5 |
:103EB00057FD9058440F551F59F05F3F71F04795DB |
:103EC000880F97FB991F61F09F3F79F087950895C0 |
:103ED000121613061406551FF2CF4695F1DF08C0DF |
:103EE000161617061806991FF1CF869571056105FC |
:103EF00008940895E894BB2766277727CB0197F9A4 |
:103F00000895629FD001739FF001829FE00DF11D23 |
:103F1000649FE00DF11D929FF00D839FF00D749F43 |
:103F2000F00D659FF00D9927729FB00DE11DF91FEF |
:103F3000639FB00DE11DF91FBD01CF01112408954C |
:103F4000991B79E004C0991F961708F0961B881FEB |
:103F50007A95C9F780950895AA1BBB1B51E107C04C |
:103F6000AA1FBB1FA617B70710F0A61BB70B881F09 |
:103F7000991F5A95A9F780959095BC01CD01089598 |
:103F800097FB092E07260AD077FD04D0E5DF06D07F |
:103F900000201AF4709561957F4F0895F6F790957B |
:103FA00081959F4F0895A1E21A2EAA1BBB1BFD010C |
:103FB0000DC0AA1FBB1FEE1FFF1FA217B307E40708 |
:103FC000F50720F0A21BB30BE40BF50B661F771F60 |
:103FD000881F991F1A9469F7609570958095909540 |
:103FE0009B01AC01BD01CF01089597FB092E052669 |
:103FF0000ED057FD04D0D7DF0AD0001C38F45095FE |
:104000004095309521953F4F4F4F5F4F0895F6F7FC |
:1040100090958095709561957F4F8F4F9F4F089534 |
:104020002F923F924F925F926F927F928F929F92C8 |
:10403000AF92BF92CF92DF92EF92FF920F931F93B6 |
:10404000CF93DF93CDB7DEB7CA1BDB0B0FB6F89467 |
:10405000DEBF0FBECDBF09942A88398848885F84A7 |
:104060006E847D848C849B84AA84B984C884DF8018 |
:10407000EE80FD800C811B81AA81B981CE0FD11DFC |
:104080000FB6F894DEBF0FBECDBFED010895EE0F61 |
:0C409000FF1F0590F491E02D0994FFCF74 |
:10409C0004035E0A010164FF010020FFFFC01FC082 |
:1040AC001F0101070610F40101737373FF03007DF8 |
:1040BC000000C409C4096400114167696C650051B2 |
:1040CC00756164726F000000000000006400D20192 |
:1040DC0001200B050000ECFF00020406070808088D |
:1040EC000706040200FEFCFAF9F8F8F8F9FAFCFEEF |
:1040FC00000204060708086440415A4655326464BD |
:10410C00640A02969696960840403A10303801326E |
:10411C00FF037F0090D0030090D003003200206496 |
:10412C00FFFFE8036464200B0A0D0B0E100B0A0C46 |
:10413C000F0B1110FA20680101010101154D4B20E4 |
:10414C002020202020202020202001000000000022 |
:10415C00566F6C746167652020205620200100008A |
:10416C0000000143757272656E742020204120207E |
:10417C0001000000000143617061636974792020C3 |
:10418C00416820010000000002416C746974756480 |
:10419C006520206D2020010000000000436F6D7031 |
:1041AC00617373202020B020200100000000005318 |
:1041BC00617473202020202020202020010000008A |
:1041CC000000537065656420202020206D2F730142 |
:1041DC00000000000044697374616E636520206DFB |
:1041EC002020010000000000486F6D652D446972AD |
:1041FC002020B020200100000000006D61782E54BA |
:10420C00656D702E20B043200100000000004D6150 |
:10421C00676E2E6669656C64252020010000000025 |
:10422C0000566172696F2020202020202020010080 |
:10423C00000000004572726F72436F64652020208D |
:10424C00200100000000004C6174697475646520E5 |
:10425C00202020200900000000004C6F6E6769745C |
:10426C0075646520202020090000000000F7FFFC89 |
:08427C00FF70FF01010F640057 |
:00000001FF |
/branches/V2.02a_FirstTrial_Peter/Hex-Files/License.txt |
---|
0,0 → 1,69 |
// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
// + www.MikroKopter.com |
// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
// + Software Nutzungsbedingungen (english version: see below) |
// + der Fa. HiSystems GmbH, Flachsmeerstrasse 2, 26802 Moormerland - nachfolgend Lizenzgeber genannt - |
// + |
// + Der Lizenzgeber räumt dem Kunden ein nicht-ausschließliches, zeitlich und räumlich* unbeschränktes Recht ein, die im den |
// + Mikrocontroller verwendete Firmware für die Hardware Flight-Ctrl, Navi-Ctrl, BL-Ctrl, MK3Mag & PC-Programm MikroKopter-Tool |
// + - nachfolgend Software genannt - nur für private Zwecke zu nutzen. |
// + Der Einsatz dieser Software ist nur auf oder mit Produkten des Lizenzgebers zulässig. |
// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
// + Die vom Lizenzgeber gelieferte Software ist urheberrechtlich geschützt. Alle Rechte an der Software sowie an sonstigen im |
// + Rahmen der Vertragsanbahnung und Vertragsdurchführung überlassenen Unterlagen stehen im Verhältnis der Vertragspartner ausschließlich dem Lizenzgeber zu. |
// + Die in der Software enthaltenen Copyright-Vermerke, Markenzeichen, andere Rechtsvorbehalte, Seriennummern sowie |
// + sonstige der Programmidentifikation dienenden Merkmale dürfen vom Kunden nicht verändert oder unkenntlich gemacht werden. |
// + Der Kunde trifft angemessene Vorkehrungen für den sicheren Einsatz der Software. Er wird die Software gründlich auf deren |
// + Verwendbarkeit zu dem von ihm beabsichtigten Zweck testen, bevor er diese operativ einsetzt. |
// + Die Haftung des Lizenzgebers wird - soweit gesetzlich zulässig - begrenzt in Höhe des typischen und vorhersehbaren |
// + Schadens. Die gesetzliche Haftung bei Personenschäden und nach dem Produkthaftungsgesetz bleibt unberührt. Dem Lizenzgeber steht jedoch der Einwand |
// + des Mitverschuldens offen. |
// + Der Kunde trifft angemessene Vorkehrungen für den Fall, dass die Software ganz oder teilweise nicht ordnungsgemäß arbeitet. |
// + Er wird die Software gründlich auf deren Verwendbarkeit zu dem von ihm beabsichtigten Zweck testen, bevor er diese operativ einsetzt. |
// + Der Kunde wird er seine Daten vor Einsatz der Software nach dem Stand der Technik sichern. |
// + Der Kunde ist darüber unterrichtet, dass der Lizenzgeber seine Daten im zur Vertragsdurchführung erforderlichen Umfang |
// + und auf Grundlage der Datenschutzvorschriften erhebt, speichert, verarbeitet und, sofern notwendig, an Dritte übermittelt. |
// + *) Die räumliche Nutzung bezieht sich nur auf den Einsatzort, nicht auf die Reichweite der programmierten Software. |
// + #### ENDE DER NUTZUNGSBEDINGUNGEN ####' |
// + Hinweis: Informationen über erweiterte Nutzungsrechte (wie z.B. Nutzung für nicht-private Zwecke) sind auf Anfrage per Email an info(@)hisystems.de verfügbar. |
// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
// + Software LICENSING TERMS |
// + of HiSystems GmbH, Flachsmeerstrasse 2, 26802 Moormerland, Germany - the Licensor - |
// + |
// + The Licensor grants the customer a non-exclusive license to use the microcontroller firmware of the Flight-Ctrl, Navi-Ctrl, BL-Ctrl, and MK3Mag hardware |
// + (the Software) exclusively for private purposes. The License is unrestricted with respect to time and territory*. |
// + The Software may only be used with the Licensor's products. |
// + The Software provided by the Licensor is protected by copyright. With respect to the relationship between the parties to this |
// + agreement, all rights pertaining to the Software and other documents provided during the preparation and execution of this |
// + agreement shall be the property of the Licensor. |
// + The information contained in the Software copyright notices, trademarks, other legal reservations, serial numbers and other |
// + features that can be used to identify the program may not be altered or defaced by the customer. |
// + The customer shall be responsible for taking reasonable precautions |
// + for the safe use of the Software. The customer shall test the Software thoroughly regarding its suitability for the |
// + intended purpose before implementing it for actual operation. The Licensor's liability shall be limited to the extent of typical and |
// + foreseeable damage to the extent permitted by law, notwithstanding statutory liability for bodily injury and product |
// + liability. However, the Licensor shall be entitled to the defense of contributory negligence. |
// + The customer will take adequate precautions in the case, that the software is not working properly. The customer will test |
// + the software for his purpose before any operational usage. The customer will backup his data before using the software. |
// + The customer understands that the Licensor collects, stores and processes, and, where required, forwards, customer data |
// + to third parties to the extent necessary for executing the agreement, subject to applicable data protection and privacy regulations. |
// + *) The territory aspect only refers to the place where the Software is used, not its programmed range. |
// + #### END OF LICENSING TERMS #### |
// + Note: For information on license extensions (e.g. commercial use), please contact us at info(@)hisystems.de. |
// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
// + |
// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
// + * porting the sources to other systems or using the software on other systems (except hardware from www.mikrokopter.de) is not allowed |
// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
// + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" |
// + AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE |
// + IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE |
// + ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE |
// + LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR |
// + CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF |
// + SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS |
// + INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN |
// + CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) |
// + ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE |
// + POSSIBILITY OF SUCH DAMAGE. |
// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
/branches/V2.02a_FirstTrial_Peter/Hex-Files/WasIstWas.txt |
---|
0,0 → 1,14 |
+++++++++++++++++++++++++ |
+ Flight-Ctrl: |
+++++++++++++++++++++++++ |
Flight-Ctrl_MEGA1284_Vx_yy.hex |
Flight-Ctrl_MEGA644_Vx_yy.hex |
Aktuelle Firmware |
Wird per serielle Schnittstelle (durch den Bootloader) eingespielt |
Achtung: Die Programme für den ATMEGA1284 dürfen ausschliesslich per Bootloader, also seriell (MKUSB) eingespielt werden und NICHT per ISP |
Warning: do not program the ATMEGA1284 (FC2.1) via SPI. Only use the MKUSB and the Koptertool for update! |
/branches/V2.02a_FirstTrial_Peter/License.txt |
---|
0,0 → 1,52 |
// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
// + www.MikroKopter.com |
// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
// + Software Nutzungsbedingungen (english version: see below) |
// + der Fa. HiSystems GmbH, Flachsmeerstrasse 2, 26802 Moormerland - nachfolgend Lizenzgeber genannt - |
// + Der Lizenzgeber räumt dem Kunden ein nicht-ausschließliches, zeitlich und räumlich* unbeschränktes Recht ein, die im den |
// + Mikrocontroller verwendete Firmware für die Hardware Flight-Ctrl, Navi-Ctrl, BL-Ctrl, MK3Mag & PC-Programm MikroKopter-Tool |
// + - nachfolgend Software genannt - nur für private Zwecke zu nutzen. |
// + Der Einsatz dieser Software ist nur auf oder mit Produkten des Lizenzgebers zulässig. |
// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
// + Die vom Lizenzgeber gelieferte Software ist urheberrechtlich geschützt. Alle Rechte an der Software sowie an sonstigen im |
// + Rahmen der Vertragsanbahnung und Vertragsdurchführung überlassenen Unterlagen stehen im Verhältnis der Vertragspartner ausschließlich dem Lizenzgeber zu. |
// + Die in der Software enthaltenen Copyright-Vermerke, Markenzeichen, andere Rechtsvorbehalte, Seriennummern sowie |
// + sonstige der Programmidentifikation dienenden Merkmale dürfen vom Kunden nicht verändert oder unkenntlich gemacht werden. |
// + Der Kunde trifft angemessene Vorkehrungen für den sicheren Einsatz der Software. Er wird die Software gründlich auf deren |
// + Verwendbarkeit zu dem von ihm beabsichtigten Zweck testen, bevor er diese operativ einsetzt. |
// + Die Haftung des Lizenzgebers wird - soweit gesetzlich zulässig - begrenzt in Höhe des typischen und vorhersehbaren |
// + Schadens. Die gesetzliche Haftung bei Personenschäden und nach dem Produkthaftungsgesetz bleibt unberührt. Dem Lizenzgeber steht jedoch der Einwand |
// + des Mitverschuldens offen. |
// + Der Kunde trifft angemessene Vorkehrungen für den Fall, dass die Software ganz oder teilweise nicht ordnungsgemäß arbeitet. |
// + Er wird die Software gründlich auf deren Verwendbarkeit zu dem von ihm beabsichtigten Zweck testen, bevor er diese operativ einsetzt. |
// + Der Kunde wird er seine Daten vor Einsatz der Software nach dem Stand der Technik sichern. |
// + Der Kunde ist darüber unterrichtet, dass der Lizenzgeber seine Daten im zur Vertragsdurchführung erforderlichen Umfang |
// + und auf Grundlage der Datenschutzvorschriften erhebt, speichert, verarbeitet und, sofern notwendig, an Dritte übermittelt. |
// + *) Die räumliche Nutzung bezieht sich nur auf den Einsatzort, nicht auf die Reichweite der programmierten Software. |
// + #### ENDE DER NUTZUNGSBEDINGUNGEN ####' |
// + Hinweis: Informationen über erweiterte Nutzungsrechte (wie z.B. Nutzung für nicht-private Zwecke) sind auf Anfrage per Email an info(@)hisystems.de verfügbar. |
// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
// + Software LICENSING TERMS |
// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
// + of HiSystems GmbH, Flachsmeerstrasse 2, 26802 Moormerland, Germany - the Licensor - |
// + The Licensor grants the customer a non-exclusive license to use the microcontroller firmware of the Flight-Ctrl, Navi-Ctrl, BL-Ctrl, and MK3Mag hardware |
// + (the Software) exclusively for private purposes. The License is unrestricted with respect to time and territory*. |
// + The Software may only be used with the Licensor's products. |
// + The Software provided by the Licensor is protected by copyright. With respect to the relationship between the parties to this |
// + agreement, all rights pertaining to the Software and other documents provided during the preparation and execution of this |
// + agreement shall be the property of the Licensor. |
// + The information contained in the Software copyright notices, trademarks, other legal reservations, serial numbers and other |
// + features that can be used to identify the program may not be altered or defaced by the customer. |
// + The customer shall be responsible for taking reasonable precautions |
// + for the safe use of the Software. The customer shall test the Software thoroughly regarding its suitability for the |
// + intended purpose before implementing it for actual operation. The Licensor's liability shall be limited to the extent of typical and |
// + foreseeable damage to the extent permitted by law, notwithstanding statutory liability for bodily injury and product |
// + liability. However, the Licensor shall be entitled to the defense of contributory negligence. |
// + The customer will take adequate precautions in the case, that the software is not working properly. The customer will test |
// + the software for his purpose before any operational usage. The customer will backup his data before using the software. |
// + The customer understands that the Licensor collects, stores and processes, and, where required, forwards, customer data |
// + to third parties to the extent necessary for executing the agreement, subject to applicable data protection and privacy regulations. |
// + *) The territory aspect only refers to the place where the Software is used, not its programmed range. |
// + #### END OF LICENSING TERMS #### |
// + Note: For information on license extensions (e.g. commercial use), please contact us at info(@)hisystems.de. |
// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
/branches/V2.02a_FirstTrial_Peter/Settings.h |
---|
--- V2.02a_FirstTrial_Peter/Spektrum.c (nonexistent) |
+++ V2.02a_FirstTrial_Peter/Spektrum.c (revision 2437) |
@@ -0,0 +1,406 @@ |
+/*####################################################################################### |
+Decodieren eines RC Summen Signals oder Spektrum Empfänger-Satellit |
+#######################################################################################*/ |
+ |
+#include "Spektrum.h" |
+#include "main.h" |
+ |
+unsigned char SpektrumTimer = 0; |
+ |
+// Achtung: RECEIVER_SPEKTRUM_DX7EXP oder RECEIVER_SPEKTRUM_DX8EXP wird in der main.h gesetzt |
+#if defined (RECEIVER_SPEKTRUM_DX7EXP) || defined (RECEIVER_SPEKTRUM_DX8EXP) |
+unsigned char s_excnt = 0; // Bitcounter for Spektrum-Expander |
+unsigned char s_exparity = 0; // Parity Bit for Spektrum-Expander |
+signed char s_exdata[11]; // Data for Spektrum-Expander |
+ |
+void s_update(unsigned char channel, signed int value) // Channel-Diff numbercrunching and finally assign new stickvalue to PPM_in |
+{ |
+ if(SenderOkay >= 180) PPM_diff[channel] = ((value - PPM_in[channel]) / 3) * 3; |
+ else PPM_diff[channel] = 0; |
+ PPM_in[channel] = value; |
+} |
+#endif |
+ |
+//############################################################################ |
+// USART1 initialisation from killagreg |
+void SpektrumUartInit(void) |
+//############################################################################ |
+ { |
+ // -- Start of USART1 initialisation for Spekturm seriell-mode |
+ // USART1 Control and Status Register A, B, C and baud rate register |
+ uint8_t sreg = SREG; |
+ |
+ uint16_t ubrr = (uint16_t) ((uint32_t) SYSCLK/(8 * 115200) - 1); |
+ |
+ // disable all interrupts before reconfiguration |
+ cli(); |
+ // disable RX-Interrupt |
+ UCSR1B &= ~(1 << RXCIE1); |
+ // disable TX-Interrupt |
+ UCSR1B &= ~(1 << TXCIE1); |
+ // disable DRE-Interrupt |
+ UCSR1B &= ~(1 << UDRIE1); |
+/* |
+ // set direction of RXD1 and TXD1 pins |
+ // set RXD1 (PD2) as an input pin |
+ PORTD |= (1 << PORTD2); |
+ DDRD &= ~(1 << DDD2); |
+ // set TXD1 (PD3) as an output pin |
+ PORTD |= (1 << PORTD3); |
+ DDRD |= (1 << DDD3); |
+*/ |
+ // USART0 Baud Rate Register |
+ // set clock divider |
+ UBRR1H = (uint8_t)(ubrr>>8); |
+ UBRR1L = (uint8_t)ubrr; |
+ // enable double speed operation |
+ UCSR1A |= (1 << U2X1); |
+ // enable receiver and transmitter |
+ //UCSR1B = (1<<RXEN1)|(1<<TXEN1); |
+ |
+ UCSR1B = (1<<RXEN1); |
+ // set asynchronous mode |
+ UCSR1C &= ~(1 << UMSEL11); |
+ UCSR1C &= ~(1 << UMSEL10); |
+ // no parity |
+ UCSR1C &= ~(1 << UPM11); |
+ UCSR1C &= ~(1 << UPM10); |
+ // 1 stop bit |
+ UCSR1C &= ~(1 << USBS1); |
+ // 8-bit |
+ UCSR1B &= ~(1 << UCSZ12); |
+ UCSR1C |= (1 << UCSZ11); |
+ UCSR1C |= (1 << UCSZ10); |
+ // flush receive buffer explicit |
+ while(UCSR1A & (1<<RXC1)) UDR1; |
+ // enable RX-interrupts at the end |
+ UCSR1B |= (1 << RXCIE1); |
+ // -- End of USART1 initialisation |
+ // restore global interrupt flags |
+ |
+ SREG = sreg; |
+ return; |
+ } |
+ |
+// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
+// + Copyright (c) Rainer Walther |
+// + RC-routines from original MK rc.c (c) H&I |
+// + Useful infos from Walter: http://www.rcgroups.com/forums/showthread.php?t=714299&page=2 |
+// + only for non-profit use |
+// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
+// |
+// 20080808 rw Modified for Spektrum AR6100 (PPM) |
+// 20080823 rw Add Spektrum satellite receiver on USART1 (644P only) |
+// 20081213 rw Add support for Spektrum DS9 Air-Tx-Module (9 channels) |
+// Replace AR6100-coding with original composit-signal routines |
+// |
+// --- |
+// Entweder Summensignal ODER Spektrum-Receiver anschließen. Nicht beides gleichzeitig betreiben! |
+// Binding is not implemented. Bind with external Receiver. |
+// Servo output J3, J4, J5 not serviced |
+// |
+// Anschuß Spektrum Receiver |
+// Orange: 3V von der FC (keinesfalls an 5V anschließen!) |
+// Schwarz: GND |
+// Grau: RXD1 (Pin 3) auf 10-Pol FC-Stecker |
+// |
+// --- |
+// Satellite-Reciever connected on USART1: |
+// |
+// DX7/DX6i: One data-frame at 115200 baud every 22ms. |
+// DX7se: One data-frame at 115200 baud every 11ms. |
+// byte1: unknown |
+// byte2: unknown |
+// byte3: and byte4: channel data (FLT-Mode) |
+// byte5: and byte6: channel data (Roll) |
+// byte7: and byte8: channel data (Nick) |
+// byte9: and byte10: channel data (Gier) |
+// byte11: and byte12: channel data (Gear Switch) |
+// byte13: and byte14: channel data (Gas) |
+// byte15: and byte16: channel data (AUX2) |
+// |
+// DS9 (9 Channel): One data-frame at 115200 baud every 11ms, alternating frame 1/2 for CH1-7 / CH8-9 |
+// 1st Frame: |
+// byte1: unknown |
+// byte2: unknown |
+// byte3: and byte4: channel data |
+// byte5: and byte6: channel data |
+// byte7: and byte8: channel data |
+// byte9: and byte10: channel data |
+// byte11: and byte12: channel data |
+// byte13: and byte14: channel data |
+// byte15: and byte16: channel data |
+// 2nd Frame: |
+// byte1: unknown |
+// byte2: unknown |
+// byte3: and byte4: channel data |
+// byte5: and byte6: channel data |
+// byte7: and byte8: 0xffff |
+// byte9: and byte10: 0xffff |
+// byte11: and byte12: 0xffff |
+// byte13: and byte14: 0xffff |
+// byte15: and byte16: 0xffff |
+// |
+// Each channel data (16 bit= 2byte, first msb, second lsb) is arranged as: |
+// |
+// Bits: F 0 C3 C2 C1 C0 D9 D8 D7 D6 D5 D4 D3 D2 D1 D0 |
+// |
+// 0 means a '0' bit |
+// F: 1 = indicates beginning of 2nd frame for CH8-9 (DS9 only) |
+// C3 to C0 is the channel number. 0 to 9 (4 bit, as assigned in the transmitter) |
+// D9 to D0 is the channel data (10 bit) 0xaa..0x200..0x356 for 100% transmitter-travel |
+// |
+// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
+ |
+#define MIN_FRAMEGAP 68 // 7ms |
+#define MAX_BYTEGAP 3 // 310us |
+ |
+ |
+//############################################################################ |
+// Wird im UART-Interrupt aufgerufen |
+//############################################################################ |
+void SpektrumParser(unsigned char c) |
+{ |
+ static unsigned char Sync=0, FrameCnt=0, ByteHigh=0, ReSync=1, Frame2=0; |
+ unsigned int Channel, index = 0; |
+ signed int signal = 0, tmp; |
+ int bCheckDelay; |
+// c = UDR1; // get data byte |
+ if(ReSync == 1) |
+ { |
+ // wait for beginning of new frame |
+ ReSync = 0; |
+ SpektrumTimer = MIN_FRAMEGAP; |
+ FrameCnt = 0; |
+ Sync = 0; |
+ ByteHigh = 0; |
+ } |
+ else |
+ { |
+ if(!SpektrumTimer) bCheckDelay = 1; else bCheckDelay = 0;//CheckDelay(FrameTimer); |
+ if ( Sync == 0 ) |
+ { |
+ if(bCheckDelay) |
+ { |
+ // nach einer Pause von mind. 7ms erstes Sync-Character gefunden |
+ // Zeichen ignorieren, da Bedeutung unbekannt |
+ Sync = 1; |
+ FrameCnt ++; |
+ SpektrumTimer = MAX_BYTEGAP; |
+ } |
+ else |
+ { |
+ // Zeichen kam vor Ablauf der 7ms Sync-Pause |
+ // warten auf erstes Sync-Zeichen |
+ SpektrumTimer = MIN_FRAMEGAP; |
+ FrameCnt = 0; |
+ Sync = 0; |
+ ByteHigh = 0; |
+ } |
+ } |
+ else if((Sync == 1) && !bCheckDelay) |
+ { |
+ // zweites Sync-Character ignorieren, Bedeutung unbekannt |
+ Sync = 2; |
+ FrameCnt ++; |
+ SpektrumTimer = MAX_BYTEGAP; |
+ } |
+ else if((Sync == 2) && !bCheckDelay) |
+ { |
+ SpektrumTimer = MAX_BYTEGAP; |
+ // Datenbyte high |
+ ByteHigh = c; |
+ if (FrameCnt == 2) |
+ { |
+ // is 1st Byte of Channel-data |
+ // Frame 1 with Channel 1-7 comming next |
+ Frame2 = 0; |
+ if(ByteHigh & 0x80) |
+ { |
+ // DS9: Frame 2 with Channel 8-9 comming next |
+ Frame2 = 1; |
+ } |
+ } |
+ Sync = 3; |
+ FrameCnt ++; |
+ } |
+ else if((Sync == 3) && !bCheckDelay) |
+ { |
+ // Datenbyte low |
+ // High-Byte for next channel comes next |
+ SpektrumTimer = MAX_BYTEGAP; |
+ Sync = 2; |
+ FrameCnt ++; |
+ Channel = ((unsigned int)ByteHigh << 8) | c; |
+ if(EE_Parameter.Receiver == RECEIVER_SPEKTRUM) |
+ { |
+ signal = Channel & 0x3ff; |
+ signal -= 0x200; // Offset, range 0x000..0x3ff? |
+ signal = signal/3; // scaling to fit PPM resolution |
+ index = (ByteHigh >> 2) & 0x0f; |
+ } |
+ else |
+ if(EE_Parameter.Receiver == RECEIVER_SPEKTRUM_HI_RES) |
+ { |
+ signal = Channel & 0x7ff; |
+ signal -= 0x400; // Offset, range 0x000..0x7ff? |
+ signal = signal/6; // scaling to fit PPM resolution |
+ index = (ByteHigh >> 3) & 0x0f; |
+ } |
+ else |
+ //if(EE_Parameter.Receiver == RECEIVER_SPEKTRUM_LOW_RES) |
+ { |
+ signal = Channel & 0x3ff; |
+ signal -= 360; // Offset, range 0x000..0x3ff? |
+ signal = signal/2; // scaling to fit PPM resolution |
+ index = (ByteHigh >> 2) & 0x0f; |
+ } |
+ |
+ index++; |
+ if(index < 13) |
+ { |
+ // Stabiles Signal |
+#if defined (RECEIVER_SPEKTRUM_DX7EXP) || defined (RECEIVER_SPEKTRUM_DX8EXP) |
+ if (index == 2) index = 4; // Analog channel reassigment (2 <-> 4) for logical numbering (1,2,3,4) |
+ else if (index == 4) index = 2; |
+#endif |
+ if(abs(signal - PPM_in[index]) < 6) |
+ { |
+ if(EE_Parameter.FailsafeChannel == 0 || PPM_in[EE_Parameter.FailsafeChannel] < 100) // forces Failsafe if the receiver doesn't have 'signal loss' on Failsafe |
+ { |
+ if(SenderOkay < 200) SenderOkay += 10; |
+ else |
+ { |
+ SenderOkay = 200; |
+ TIMSK1 &= ~_BV(ICIE1); // disable PPM-Input |
+ } |
+ } |
+ } |
+ tmp = (3 * (PPM_in[index]) + signal) / 4; |
+ if(tmp > signal+1) tmp--; else |
+ if(tmp < signal-1) tmp++; |
+ |
+#ifdef RECEIVER_SPEKTRUM_DX7EXP |
+ if(index == 6) // FLIGHT-MODE - The channel used for our data uplink |
+ { |
+ if (signal > 100) // SYNC received |
+ { |
+ if (s_exdata[s_excnt] == 125) s_exparity = ~s_exparity; // Bit = 1 -> Re-Invert parity bit |
+ if ((s_excnt == 6 && ((s_exparity != 0 && s_exdata[s_excnt] == -125) || (s_exparity == 0 && s_exdata[s_excnt] == 125))) || (s_excnt == 9 && ((s_exparity == 0 && s_exdata[s_excnt] == -125) || (s_exparity != 0 && s_exdata[s_excnt] == 125)))) // Parity check |
+ { |
+ if (s_exdata[1] == 125 && s_exdata[2] == -125) s_update(5,-125); // Reconstruct tripole Flight-Mode value (CH5) |
+ else if (s_exdata[1] == -125 && s_exdata[2] == -125) s_update(5,0); // Reconstruct tripole Flight-Mode value (CH5) |
+ else if (s_exdata[1] == -125 && s_exdata[2] == 125) s_update(5,125); // Reconstruct tripole Flight-Mode value (CH5) |
+ s_update(6,s_exdata[3]); // Elevator (CH6) |
+ s_update(11,s_exdata[4]); // Aileron (CH11) |
+ s_update(12,s_exdata[5]); // Rudder (CH12) |
+ |
+ if (s_excnt == 9) // New Mode (12 Channels) |
+ { |
+ if (s_exdata[7] == 125) s_update(8,PPM_in[8]+5); // Hover Pitch UP (CH8) |
+ if (s_exdata[8] == 125) s_update(8,PPM_in[8]-5); // Hover Pitch DN (CH8) |
+ if (PPM_in[8] < -125) PPM_in[8] = -125; // Range-Limit |
+ else if (PPM_in[8] > 125) PPM_in[8] = 125; // Range-Limit |
+ s_update(10,s_exdata[6]); // AUX2 (CH10) |
+ } |
+ } |
+ |
+ s_excnt = 0; // Reset bitcounter |
+ s_exparity = 0; // Reset parity bit |
+ } |
+ |
+ if (signal < 10) s_exdata[++s_excnt] = -125; // Bit = 0 -> value = -125 (min) |
+ if (s_excnt == 10) s_excnt = 0; // Overflow protection |
+ if (signal < -100) |
+ { |
+ s_exdata[s_excnt] = 125; // Bit = 1 -> value = 125 (max) |
+ s_exparity = ~s_exparity; // Bit = 1 -> Invert parity bit |
+ } |
+ |
+ } |
+ |
+ if (index < 5 ) s_update(index,tmp); // Update normal potis (CH1-4) |
+ else if (index == 5) s_update(7,signal); // Gear (CH7) |
+ else if (index == 7) s_update(9,signal); // Hover Throttle (CH9) |
+ |
+#elif defined RECEIVER_SPEKTRUM_DX8EXP |
+ if(index == 6) // FLIGHT-MODE - The channel used for our data uplink |
+ { |
+ if (signal > 100) // SYNC received |
+ { |
+ if (s_exdata[s_excnt] == 125) s_exparity = ~s_exparity; // Bit = 1 -> Re-Invert parity bit |
+ if (s_excnt == 9 && ((s_exparity == 0 && s_exdata[s_excnt] == -125) || (s_exparity != 0 && s_exdata[s_excnt] == 125))) // Parity check |
+ { |
+ if (s_exdata[1] == 125 && s_exdata[2] == -125) s_update(5,-125); // Reconstruct tripole Flight-Mode value (CH5) |
+ else if (s_exdata[1] == -125 && s_exdata[2] == -125) s_update(5,0); // Reconstruct tripole Flight-Mode value (CH5) |
+ else if (s_exdata[1] == -125 && s_exdata[2] == 125) s_update(5,125); // Reconstruct tripole Flight-Mode value (CH5) |
+ |
+ if (s_exdata[3] == 125 && s_exdata[6] == -125) s_update(6,125); // Reconstruct tripole Elev D/R value (CH6) |
+ else if (s_exdata[3] == -125 && s_exdata[6] == -125) s_update(6,0); // Reconstruct tripole Elev D/R value (CH6) |
+ else if (s_exdata[3] == -125 && s_exdata[6] == 125) s_update(6,-125); // Reconstruct tripole Elev D/R value (CH6) |
+ |
+ |
+ if (s_exdata[7] == 125 && s_exdata[8] == -125) s_update(9,-125); // Reconstruct tripole AIL D/R value (CH9) |
+ else if (s_exdata[7] == -125 && s_exdata[8] == -125) s_update(9,0); // Reconstruct tripole AIL D/R value (CH9) |
+ else if (s_exdata[7] == -125 && s_exdata[8] == 125) s_update(9,125); // Reconstruct tripole AIL D/R value (CH9) |
+ |
+ s_update(10,s_exdata[5]); // Gear (CH10) |
+ s_update(12,s_exdata[4]); // Mix (CH12) |
+ } |
+ |
+ s_excnt = 0; // Reset bitcounter |
+ s_exparity = 0; // Reset parity bit |
+ } |
+ |
+ if (signal < 10) s_exdata[++s_excnt] = -125; // Bit = 0 -> value = -125 (min) |
+ if (s_excnt == 10) s_excnt = 0; // Overflow protection |
+ if (signal < -100) |
+ { |
+ s_exdata[s_excnt] = 125; // Bit = 1 -> value = 125 (max) |
+ s_exparity = ~s_exparity; // Bit = 1 -> Invert parity bit |
+ } |
+ |
+ } |
+ |
+ if (index < 5 ) s_update(index,tmp); // Update normal potis (CH1-4) |
+ else if (index == 7) s_update(7,signal); // R Trim (CH7) |
+ else if (index == 5) s_update(8,signal); // AUX2 (CH8) |
+ else if (index == 8) s_update(11,signal); // AUX3 (CH11) |
+ |
+#else |
+ if(SenderOkay >= 180) PPM_diff[index] = ((tmp - PPM_in[index]) / 3) * 3; |
+ else PPM_diff[index] = 0; |
+ PPM_in[index] = tmp; |
+#endif |
+ } |
+ else if(index > 17) ReSync = 1; // hier stimmt was nicht: neu synchronisieren |
+ } |
+ else |
+ { |
+ // hier stimmt was nicht: neu synchronisieren |
+ ReSync = 1; |
+ FrameCnt = 0; |
+ Frame2 = 0; |
+ // new frame next, nach fruehestens 7ms erwartet |
+ SpektrumTimer = MIN_FRAMEGAP; |
+ } |
+ |
+ // 16 Bytes eingetroffen -> Komplett |
+ if(FrameCnt >= 16) |
+ { |
+ // Frame complete |
+ if(Frame2 == 0) |
+ { |
+ // Null bedeutet: Neue Daten |
+ // nur beim ersten Frame (CH 0-7) setzen |
+ if(!ReSync) NewPpmData = 0; |
+ } |
+ FrameCnt = 0; |
+ Frame2 = 0; |
+ Sync = 0; |
+ SpektrumTimer = MIN_FRAMEGAP; |
+ } |
+ } |
+} |
+ |
+ |
/branches/V2.02a_FirstTrial_Peter/Spektrum.h |
---|
0,0 → 1,12 |
/*####################################################################################### |
Dekodieren eines Spektrum Signals |
#######################################################################################*/ |
#ifndef _SPEKTRUM_H |
#define _SPEKTRUM_H |
void SpektrumUartInit(void); |
void SpektrumBinding(void); |
extern unsigned char SpektrumTimer; |
extern void SpektrumParser(unsigned char c); |
#endif //_RC_H |
/branches/V2.02a_FirstTrial_Peter/analog.c |
---|
0,0 → 1,385 |
// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
// + www.MikroKopter.com |
// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
// + Software Nutzungsbedingungen (english version: see below) |
// + der Fa. HiSystems GmbH, Flachsmeerstrasse 2, 26802 Moormerland - nachfolgend Lizenzgeber genannt - |
// + Der Lizenzgeber räumt dem Kunden ein nicht-ausschließliches, zeitlich und räumlich* unbeschränktes Recht ein, die im den |
// + Mikrocontroller verwendete Firmware für die Hardware Flight-Ctrl, Navi-Ctrl, BL-Ctrl, MK3Mag & PC-Programm MikroKopter-Tool |
// + - nachfolgend Software genannt - nur für private Zwecke zu nutzen. |
// + Der Einsatz dieser Software ist nur auf oder mit Produkten des Lizenzgebers zulässig. |
// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
// + Die vom Lizenzgeber gelieferte Software ist urheberrechtlich geschützt. Alle Rechte an der Software sowie an sonstigen im |
// + Rahmen der Vertragsanbahnung und Vertragsdurchführung überlassenen Unterlagen stehen im Verhältnis der Vertragspartner ausschließlich dem Lizenzgeber zu. |
// + Die in der Software enthaltenen Copyright-Vermerke, Markenzeichen, andere Rechtsvorbehalte, Seriennummern sowie |
// + sonstige der Programmidentifikation dienenden Merkmale dürfen vom Kunden nicht verändert oder unkenntlich gemacht werden. |
// + Der Kunde trifft angemessene Vorkehrungen für den sicheren Einsatz der Software. Er wird die Software gründlich auf deren |
// + Verwendbarkeit zu dem von ihm beabsichtigten Zweck testen, bevor er diese operativ einsetzt. |
// + Die Haftung des Lizenzgebers wird - soweit gesetzlich zulässig - begrenzt in Höhe des typischen und vorhersehbaren |
// + Schadens. Die gesetzliche Haftung bei Personenschäden und nach dem Produkthaftungsgesetz bleibt unberührt. Dem Lizenzgeber steht jedoch der Einwand |
// + des Mitverschuldens offen. |
// + Der Kunde trifft angemessene Vorkehrungen für den Fall, dass die Software ganz oder teilweise nicht ordnungsgemäß arbeitet. |
// + Er wird die Software gründlich auf deren Verwendbarkeit zu dem von ihm beabsichtigten Zweck testen, bevor er diese operativ einsetzt. |
// + Der Kunde wird er seine Daten vor Einsatz der Software nach dem Stand der Technik sichern. |
// + Der Kunde ist darüber unterrichtet, dass der Lizenzgeber seine Daten im zur Vertragsdurchführung erforderlichen Umfang |
// + und auf Grundlage der Datenschutzvorschriften erhebt, speichert, verarbeitet und, sofern notwendig, an Dritte übermittelt. |
// + *) Die räumliche Nutzung bezieht sich nur auf den Einsatzort, nicht auf die Reichweite der programmierten Software. |
// + #### ENDE DER NUTZUNGSBEDINGUNGEN ####' |
// + Hinweis: Informationen über erweiterte Nutzungsrechte (wie z.B. Nutzung für nicht-private Zwecke) sind auf Anfrage per Email an info(@)hisystems.de verfügbar. |
// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
// + Software LICENSING TERMS |
// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
// + of HiSystems GmbH, Flachsmeerstrasse 2, 26802 Moormerland, Germany - the Licensor - |
// + The Licensor grants the customer a non-exclusive license to use the microcontroller firmware of the Flight-Ctrl, Navi-Ctrl, BL-Ctrl, and MK3Mag hardware |
// + (the Software) exclusively for private purposes. The License is unrestricted with respect to time and territory*. |
// + The Software may only be used with the Licensor's products. |
// + The Software provided by the Licensor is protected by copyright. With respect to the relationship between the parties to this |
// + agreement, all rights pertaining to the Software and other documents provided during the preparation and execution of this |
// + agreement shall be the property of the Licensor. |
// + The information contained in the Software copyright notices, trademarks, other legal reservations, serial numbers and other |
// + features that can be used to identify the program may not be altered or defaced by the customer. |
// + The customer shall be responsible for taking reasonable precautions |
// + for the safe use of the Software. The customer shall test the Software thoroughly regarding its suitability for the |
// + intended purpose before implementing it for actual operation. The Licensor's liability shall be limited to the extent of typical and |
// + foreseeable damage to the extent permitted by law, notwithstanding statutory liability for bodily injury and product |
// + liability. However, the Licensor shall be entitled to the defense of contributory negligence. |
// + The customer will take adequate precautions in the case, that the software is not working properly. The customer will test |
// + the software for his purpose before any operational usage. The customer will backup his data before using the software. |
// + The customer understands that the Licensor collects, stores and processes, and, where required, forwards, customer data |
// + to third parties to the extent necessary for executing the agreement, subject to applicable data protection and privacy regulations. |
// + *) The territory aspect only refers to the place where the Software is used, not its programmed range. |
// + #### END OF LICENSING TERMS #### |
// + Note: For information on license extensions (e.g. commercial use), please contact us at info(@)hisystems.de. |
// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
#include "main.h" |
#include "eeprom.h" |
volatile int Aktuell_Nick,Aktuell_Roll,Aktuell_Gier,Aktuell_ax, Aktuell_ay,Aktuell_az, UBat = 100; |
volatile int AdWertNickFilter = 0, AdWertRollFilter = 0, AdWertGierFilter = 0; |
volatile int HiResNick = 2500, HiResRoll = 2500; |
volatile int AdWertNick = 0, AdWertRoll = 0, AdWertGier = 0; |
volatile int AdWertAccRoll = 0,AdWertAccNick = 0,AdWertAccHoch = 0; |
volatile long Luftdruck = 32000; |
volatile long SummenHoehe = 0; |
volatile long StartLuftdruck; |
volatile unsigned int MessLuftdruck = 1023; |
unsigned char DruckOffsetSetting; |
signed char ExpandBaro = 0; |
volatile int VarioMeter = 0; |
volatile unsigned int ZaehlMessungen = 0; |
unsigned char AnalogOffsetNick = 115,AnalogOffsetRoll = 115,AnalogOffsetGier = 115; |
volatile unsigned char AdReady = 1; |
unsigned int BaroStep = 500; |
long ExpandBaroStep = 0; |
volatile long HoehenWertF = 0; |
#if (defined(__AVR_ATmega1284__) || defined(__AVR_ATmega1284P__)) |
unsigned char CalAthmospheare = 16; |
unsigned char AD_ACC_Y = 6; |
unsigned char AD_ACC_X = 7; |
#endif |
//####################################################################################### |
void ADC_Init(void) |
//####################################################################################### |
{ |
ADMUX = 0;//Referenz ist extern |
ANALOG_ON; |
} |
#define DESIRED_H_ADC 800 |
void CalcExpandBaroStep(void) |
{ |
if(ACC_AltitudeControl) ExpandBaroStep = BaroStep * (long)ExpandBaro; |
else ExpandBaroStep = (16 * BaroStep) * (long)ExpandBaro - 4; |
} |
void SucheLuftruckOffset(void) |
{ |
unsigned int off; |
ExpandBaro = 0; |
CalcExpandBaroStep(); |
off = GetParamByte(PID_PRESSURE_OFFSET); |
if(off < 240) off += 10; |
OCR0A = off; |
OCR0B = 255-off; |
Delay_ms_Mess(150); |
if(MessLuftdruck > DESIRED_H_ADC) off = 240; |
for(; off > 5; off--) |
{ |
OCR0A = off; |
OCR0B = 255-off; |
Delay_ms_Mess(100); |
printf("."); |
if(MessLuftdruck > DESIRED_H_ADC) break; |
} |
DruckOffsetSetting = off; |
SetParamByte(PID_PRESSURE_OFFSET, off); |
if((EE_Parameter.GlobalConfig & CFG_HOEHENREGELUNG) && (DruckOffsetSetting < 10 || DruckOffsetSetting >= 230)) VersionInfo.HardwareError[0] |= FC_ERROR0_PRESSURE; |
#if (defined(__AVR_ATmega1284__) || defined(__AVR_ATmega1284P__)) |
// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
// + correction of the altitude error in higher altitudes |
// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
CalAthmospheare = 16; |
if(ACC_AltitudeControl) |
{ |
if(PlatinenVersion < 23) { if(off < 140) CalAthmospheare += (160 - off) / 26; } |
else { if(off < 170) CalAthmospheare += (188 - off) / 19; } |
} |
Luftdruck = MessLuftdruck * CalAthmospheare; |
#endif |
Delay_ms_Mess(300); |
} |
void SucheGyroOffset(void) |
{ |
unsigned char i, ready = 0; |
int timeout; |
timeout = SetDelay(2000); |
for(i=140; i != 0; i--) |
{ |
if(ready == 3 && i > 10) i = 9; |
ready = 0; |
if(AdWertNick < 1020) AnalogOffsetNick--; else if(AdWertNick > 1030) AnalogOffsetNick++; else ready++; |
if(AdWertRoll < 1020) AnalogOffsetRoll--; else if(AdWertRoll > 1030) AnalogOffsetRoll++; else ready++; |
if(AdWertGier < 1020) AnalogOffsetGier--; else if(AdWertGier > 1030) AnalogOffsetGier++; else ready++; |
I2C_Start(TWI_STATE_GYRO_OFFSET_TX); |
if(AnalogOffsetNick < 10) { VersionInfo.HardwareError[0] |= FC_ERROR0_GYRO_NICK; AnalogOffsetNick = 10;}; if(AnalogOffsetNick > 245) { VersionInfo.HardwareError[0] |= FC_ERROR0_GYRO_NICK; AnalogOffsetNick = 245;}; |
if(AnalogOffsetRoll < 10) { VersionInfo.HardwareError[0] |= FC_ERROR0_GYRO_ROLL; AnalogOffsetRoll = 10;}; if(AnalogOffsetRoll > 245) { VersionInfo.HardwareError[0] |= FC_ERROR0_GYRO_ROLL; AnalogOffsetRoll = 245;}; |
if(AnalogOffsetGier < 10) { VersionInfo.HardwareError[0] |= FC_ERROR0_GYRO_YAW; AnalogOffsetGier = 10;}; if(AnalogOffsetGier > 245) { VersionInfo.HardwareError[0] |= FC_ERROR0_GYRO_YAW; AnalogOffsetGier = 245;}; |
while(twi_state) if(CheckDelay(timeout)) {printf("\n\r DAC or I2C ERROR! Check I2C, 3Vref, DAC and BL-Ctrl"); break;} |
AdReady = 0; |
ANALOG_ON; |
while(!AdReady); |
if(i<10) Delay_ms_Mess(10); |
} |
Delay_ms_Mess(70); |
} |
/* |
0 n |
1 r |
2 g |
3 y |
4 x |
5 n |
6 r |
7 u |
8 z |
9 L |
10 n |
11 r |
12 g |
13 y |
14 x |
15 n |
16 r |
17 L |
*/ |
//####################################################################################### |
// |
ISR(ADC_vect) |
//####################################################################################### |
{ |
static unsigned char kanal=0,state = 0; |
static signed int subcount = 0; |
static signed int gier1, roll1, nick1, nick_filter, roll_filter; |
static signed int accy, accx; |
static long tmpLuftdruck = 0; |
static char messanzahl_Druck = 0; |
switch(state++) |
{ |
case 0: |
nick1 = ADC; |
kanal = AD_ROLL; |
break; |
case 1: |
roll1 = ADC; |
kanal = AD_GIER; |
break; |
case 2: |
gier1 = ADC; |
kanal = AD_ACC_Y; |
break; |
case 3: |
Aktuell_ay = NeutralAccY - ADC; |
accy = Aktuell_ay; |
kanal = AD_ACC_X; |
break; |
case 4: |
Aktuell_ax = ADC - NeutralAccX; |
accx = Aktuell_ax; |
kanal = AD_NICK; |
break; |
case 5: |
nick1 += ADC; |
kanal = AD_ROLL; |
break; |
case 6: |
roll1 += ADC; |
kanal = AD_UBAT; |
break; |
case 7: |
#if (defined(__AVR_ATmega1284__) || defined(__AVR_ATmega1284P__)) |
if(EE_Parameter.ExtraConfig & CFG_3_3V_REFERENCE) UBat = (3 * UBat + (11 * ADC) / 30) / 4; // there were some single FC2.1 with 3.3V reference |
else |
#endif |
UBat = (3 * UBat + ADC / 3) / 4; |
kanal = AD_ACC_Z; |
break; |
case 8: |
Aktuell_az = ADC; |
AdWertAccHoch = Aktuell_az - NeutralAccZ - (int) NeutralAccZfine; |
if(!ACC_AltitudeControl) // The Offset must be corrected, because of the ACC-Drift from vibrations |
{ |
if(AdWertAccHoch > 1) |
{ |
if(NeutralAccZ < 750) |
{ |
subcount += 5; |
if(modell_fliegt < 500) subcount += 10; |
if(subcount > 100) { NeutralAccZ++; subcount -= 100;} |
} |
} |
else if(AdWertAccHoch < -1) |
{ |
if(NeutralAccZ > 550) |
{ |
subcount -= 5; |
if(modell_fliegt < 500) subcount -= 10; |
if(subcount < -100) { NeutralAccZ--; subcount += 100;} |
} |
} |
} |
#if (defined(__AVR_ATmega1284__) || defined(__AVR_ATmega1284P__)) |
else |
if(CosAttitude > 8192 - 50) // horizontal leveled within 6° |
{ |
if(AdWertAccHoch > 1) |
{ |
if(++subcount > 5000) |
{ |
if(NeutralAccZfine < 6) NeutralAccZfine++; |
subcount -= 5000; |
} |
} |
else |
if(AdWertAccHoch < -1) |
{ |
if(--subcount < -5000) |
{ |
if(NeutralAccZfine > -6) NeutralAccZfine--; |
subcount += 5000; |
} |
} |
} |
#endif |
Mess_Integral_Hoch += AdWertAccHoch; // Integrieren |
Mess_Integral_Hoch -= Mess_Integral_Hoch / 1024; // dämfen |
kanal = AD_DRUCK; |
break; |
// "case 9:" fehlt hier absichtlich |
case 10: |
nick1 += ADC; |
kanal = AD_ROLL; |
break; |
case 11: |
roll1 += ADC; |
kanal = AD_GIER; |
break; |
case 12: |
if(PlatinenVersion == 10) AdWertGier = (ADC + gier1 + 1) / 2; |
else |
if(PlatinenVersion >= 20) AdWertGier = 2047 - (ADC + gier1); |
else AdWertGier = (ADC + gier1); |
kanal = AD_ACC_Y; |
break; |
case 13: |
Aktuell_ay = NeutralAccY - ADC; |
AdWertAccRoll = (Aktuell_ay + accy); |
kanal = AD_ACC_X; |
break; |
case 14: |
Aktuell_ax = ADC - NeutralAccX; |
AdWertAccNick = (Aktuell_ax + accx); |
kanal = AD_NICK; |
break; |
case 15: |
nick1 += ADC; |
if(PlatinenVersion == 10) nick1 *= 2; else nick1 *= 4; |
AdWertNick = nick1 / 8; |
nick_filter = (nick_filter + nick1) / 2; |
HiResNick = nick_filter - AdNeutralNick; |
AdWertNickFilter = (AdWertNickFilter + HiResNick) / 2; |
kanal = AD_ROLL; |
break; |
case 16: |
roll1 += ADC; |
if(PlatinenVersion == 10) roll1 *= 2; else roll1 *= 4; |
AdWertRoll = roll1 / 8; |
roll_filter = (roll_filter + roll1) / 2; |
HiResRoll = roll_filter - AdNeutralRoll; |
AdWertRollFilter = (AdWertRollFilter + HiResRoll) / 2; |
kanal = AD_DRUCK; |
break; |
case 17: |
#if (defined(__AVR_ATmega1284__) || defined(__AVR_ATmega1284P__)) |
if(ACC_AltitudeControl) |
{ |
HoehenWertF = (ACC_AltitudeFusion(0) + SA_FILTER/2)/SA_FILTER; // cm |
} |
else HoehenWertF = HoehenWert; |
#else |
HoehenWertF = HoehenWert; |
#endif |
state = 0; |
AdReady = 1; |
ZaehlMessungen++; |
// "break" fehlt hier absichtlich |
case 9: |
MessLuftdruck = ADC; |
#if (defined(__AVR_ATmega1284__) || defined(__AVR_ATmega1284P__)) |
if(ACC_AltitudeControl) |
{ |
// ExpandBaroStep = BaroStep * (long)ExpandBaro; // wird in fc.c aufgerufen |
// tmpLuftdruck = MessLuftdruck - BaroStep * (long)ExpandBaro; // -523 counts per offset step |
tmpLuftdruck = MessLuftdruck - ExpandBaroStep; // -523 counts per offset step |
Luftdruck -= Luftdruck / CalAthmospheare; // 16 |
Luftdruck += tmpLuftdruck; |
HoehenWert = StartLuftdruck - Luftdruck; // cm |
} |
else |
#endif |
{ // old version (until FC V2.1) |
tmpLuftdruck += MessLuftdruck; |
if(++messanzahl_Druck >= 16) // war bis 0.86 "18" |
{ |
signed int tmp; |
// Luftdruck = (7 * Luftdruck + tmpLuftdruck - (16 * BaroStep) * (long)ExpandBaro + 4) / 8; // -523.19 counts per 10 counts offset step |
// ExpandBaroStep = (16 * BaroStep) * (long)ExpandBaro - 4; // wird in fc.c aufgerufen |
Luftdruck = (7 * Luftdruck + tmpLuftdruck - ExpandBaroStep) / 8; // -523.19 counts per 10 counts offset step |
HoehenWert = StartLuftdruck - Luftdruck; |
SummenHoehe -= SummenHoehe/SM_FILTER; |
SummenHoehe += HoehenWert; |
tmp = (HoehenWert - SummenHoehe/SM_FILTER); |
if(tmp > 1024) tmp = 1024; else if(tmp < -1024) tmp = -1024; |
if(abs(VarioMeter) > 700) VarioMeter = (15 * VarioMeter + 8 * tmp)/16; |
else VarioMeter = (31 * VarioMeter + 8 * tmp)/32; |
tmpLuftdruck /= 2; |
messanzahl_Druck = 16/2; |
} |
} |
kanal = AD_NICK; |
break; |
default: |
kanal = 0; state = 0; kanal = AD_NICK; |
break; |
} |
ADMUX = kanal; |
if(state != 0) ANALOG_ON; |
} |
/branches/V2.02a_FirstTrial_Peter/analog.h |
---|
0,0 → 1,58 |
#ifndef _ANALOG_H |
#define _ANALOG_H |
/*####################################################################################### |
#######################################################################################*/ |
#define SM_FILTER 16 |
#define SA_FILTER 512 |
extern volatile int UBat; |
extern volatile int AdWertNick, AdWertRoll, AdWertGier; |
extern volatile int AdWertAccRoll,AdWertAccNick,AdWertAccHoch; |
extern volatile int HiResNick, HiResRoll; |
extern volatile int AdWertNickFilter, AdWertRollFilter, AdWertGierFilter; |
extern volatile int Aktuell_Nick,Aktuell_Roll,Aktuell_Gier,Aktuell_ax, Aktuell_ay,Aktuell_az; |
extern volatile long Luftdruck; |
extern volatile long SummenHoehe; |
extern volatile char messanzahl_Druck; |
extern volatile unsigned int ZaehlMessungen; |
extern unsigned char DruckOffsetSetting; |
extern signed char ExpandBaro; |
extern volatile int VarioMeter; |
extern volatile unsigned int MessLuftdruck; |
extern volatile long StartLuftdruck; |
extern volatile char MessanzahlNick; |
extern unsigned char AnalogOffsetNick,AnalogOffsetRoll,AnalogOffsetGier; |
extern volatile unsigned char AdReady; |
extern unsigned int BaroStep; |
volatile long HoehenWertF; |
unsigned int ReadADC(unsigned char adc_input); |
void ADC_Init(void); |
void SucheLuftruckOffset(void); |
void SucheGyroOffset(void); |
void CalcExpandBaroStep(void); |
#if (defined(__AVR_ATmega1284__) || defined(__AVR_ATmega1284P__)) |
extern unsigned char CalAthmospheare; |
#endif |
#define AD_GIER 0 |
#define AD_ROLL 1 |
#define AD_NICK 2 |
#define AD_DRUCK 3 |
#define AD_UBAT 4 |
#define AD_ACC_Z 5 |
#if (defined(__AVR_ATmega1284__) || defined(__AVR_ATmega1284P__)) |
extern unsigned char AD_ACC_Y; |
extern unsigned char AD_ACC_X; |
#else |
#define AD_ACC_Y 6 |
#define AD_ACC_X 7 |
#endif |
#define ANALOG_OFF ADCSRA=0 |
#define ANALOG_ON ADCSRA=(1<<ADEN)|(1<<ADSC)|(0<<ADATE)|(1<<ADPS2)|(1<<ADPS1)|(1<<ADPS0)|(1<<ADIE) |
//Signle trigger Mode, Interrupt on |
#endif //_ANALOG_H |
/branches/V2.02a_FirstTrial_Peter/capacity.c |
---|
0,0 → 1,162 |
// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
// + www.MikroKopter.com |
// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
// + Software Nutzungsbedingungen (english version: see below) |
// + der Fa. HiSystems GmbH, Flachsmeerstrasse 2, 26802 Moormerland - nachfolgend Lizenzgeber genannt - |
// + Der Lizenzgeber räumt dem Kunden ein nicht-ausschließliches, zeitlich und räumlich* unbeschränktes Recht ein, die im den |
// + Mikrocontroller verwendete Firmware für die Hardware Flight-Ctrl, Navi-Ctrl, BL-Ctrl, MK3Mag & PC-Programm MikroKopter-Tool |
// + - nachfolgend Software genannt - nur für private Zwecke zu nutzen. |
// + Der Einsatz dieser Software ist nur auf oder mit Produkten des Lizenzgebers zulässig. |
// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
// + Die vom Lizenzgeber gelieferte Software ist urheberrechtlich geschützt. Alle Rechte an der Software sowie an sonstigen im |
// + Rahmen der Vertragsanbahnung und Vertragsdurchführung überlassenen Unterlagen stehen im Verhältnis der Vertragspartner ausschließlich dem Lizenzgeber zu. |
// + Die in der Software enthaltenen Copyright-Vermerke, Markenzeichen, andere Rechtsvorbehalte, Seriennummern sowie |
// + sonstige der Programmidentifikation dienenden Merkmale dürfen vom Kunden nicht verändert oder unkenntlich gemacht werden. |
// + Der Kunde trifft angemessene Vorkehrungen für den sicheren Einsatz der Software. Er wird die Software gründlich auf deren |
// + Verwendbarkeit zu dem von ihm beabsichtigten Zweck testen, bevor er diese operativ einsetzt. |
// + Die Haftung des Lizenzgebers wird - soweit gesetzlich zulässig - begrenzt in Höhe des typischen und vorhersehbaren |
// + Schadens. Die gesetzliche Haftung bei Personenschäden und nach dem Produkthaftungsgesetz bleibt unberührt. Dem Lizenzgeber steht jedoch der Einwand |
// + des Mitverschuldens offen. |
// + Der Kunde trifft angemessene Vorkehrungen für den Fall, dass die Software ganz oder teilweise nicht ordnungsgemäß arbeitet. |
// + Er wird die Software gründlich auf deren Verwendbarkeit zu dem von ihm beabsichtigten Zweck testen, bevor er diese operativ einsetzt. |
// + Der Kunde wird er seine Daten vor Einsatz der Software nach dem Stand der Technik sichern. |
// + Der Kunde ist darüber unterrichtet, dass der Lizenzgeber seine Daten im zur Vertragsdurchführung erforderlichen Umfang |
// + und auf Grundlage der Datenschutzvorschriften erhebt, speichert, verarbeitet und, sofern notwendig, an Dritte übermittelt. |
// + *) Die räumliche Nutzung bezieht sich nur auf den Einsatzort, nicht auf die Reichweite der programmierten Software. |
// + #### ENDE DER NUTZUNGSBEDINGUNGEN ####' |
// + Hinweis: Informationen über erweiterte Nutzungsrechte (wie z.B. Nutzung für nicht-private Zwecke) sind auf Anfrage per Email an info(@)hisystems.de verfügbar. |
// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
// + Software LICENSING TERMS |
// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
// + of HiSystems GmbH, Flachsmeerstrasse 2, 26802 Moormerland, Germany - the Licensor - |
// + The Licensor grants the customer a non-exclusive license to use the microcontroller firmware of the Flight-Ctrl, Navi-Ctrl, BL-Ctrl, and MK3Mag hardware |
// + (the Software) exclusively for private purposes. The License is unrestricted with respect to time and territory*. |
// + The Software may only be used with the Licensor's products. |
// + The Software provided by the Licensor is protected by copyright. With respect to the relationship between the parties to this |
// + agreement, all rights pertaining to the Software and other documents provided during the preparation and execution of this |
// + agreement shall be the property of the Licensor. |
// + The information contained in the Software copyright notices, trademarks, other legal reservations, serial numbers and other |
// + features that can be used to identify the program may not be altered or defaced by the customer. |
// + The customer shall be responsible for taking reasonable precautions |
// + for the safe use of the Software. The customer shall test the Software thoroughly regarding its suitability for the |
// + intended purpose before implementing it for actual operation. The Licensor's liability shall be limited to the extent of typical and |
// + foreseeable damage to the extent permitted by law, notwithstanding statutory liability for bodily injury and product |
// + liability. However, the Licensor shall be entitled to the defense of contributory negligence. |
// + The customer will take adequate precautions in the case, that the software is not working properly. The customer will test |
// + the software for his purpose before any operational usage. The customer will backup his data before using the software. |
// + The customer understands that the Licensor collects, stores and processes, and, where required, forwards, customer data |
// + to third parties to the extent necessary for executing the agreement, subject to applicable data protection and privacy regulations. |
// + *) The territory aspect only refers to the place where the Software is used, not its programmed range. |
// + #### END OF LICENSING TERMS #### |
// + Note: For information on license extensions (e.g. commercial use), please contact us at info(@)hisystems.de. |
// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
#include "capacity.h" |
#include "twimaster.h" |
#include "main.h" |
#include "timer0.h" |
#include "analog.h" |
//#define CAPACITY_UPDATE_INTERVAL 10 // 10 ms |
#define CAPACITY_UPDATE_INTERVAL 50 // 50 ms |
#define FC_OFFSET_CURRENT 5 // calculate with a current of 0.5A |
#define BL_OFFSET_CURRENT 2 // calculate with a current of 0.2A |
// global varialbles |
unsigned short update_timer = 0; |
Capacity_t Capacity; |
// initialize capacity calculation |
void Capacity_Init(void) |
{ |
Capacity.ActualCurrent = 0; |
Capacity.UsedCapacity = 0; |
Capacity.ActualPower = 0; |
Capacity.MinOfMaxPWM = 0; |
update_timer = SetDelay(CAPACITY_UPDATE_INTERVAL); |
} |
// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
// + extended Current measurement -> 200 = 20A 201 = 21A 255 = 75A (20+55) |
// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
unsigned int BL3_Current(unsigned char who) // in 0,1A |
{ |
if(Motor[who].Current == 255) return(0); // invalid |
if(Motor[who].Current <= 200) return(Motor[who].Current); |
else |
{ |
if(Motor[who].Version & MOTOR_STATE_BL30) return(200 + 10 * ((unsigned int)Motor[who].Current-200)); |
else return(Motor[who].Current); |
} |
} |
// called in main loop at a regular interval |
void Capacity_Update(void) |
{ |
unsigned short Current, SetSum; // max value will be 255 * 12 = 3060 |
static unsigned short SubCounter = 0; |
static unsigned short CurrentOffset = 0; |
static unsigned long SumCurrentOffset = 0; |
unsigned char i, NumOfMotors, MinOfMaxPWM; |
if(CheckDelay(update_timer)) |
{ |
update_timer += CAPACITY_UPDATE_INTERVAL; // do not use SetDelay to avoid timing leaks |
// determine sum of all present BL currents and setpoints |
Current = 0; |
SetSum = 0; |
NumOfMotors = 0; |
MinOfMaxPWM = 255; |
for(i = 0; i < MAX_MOTORS; i++) |
{ |
if(Motor[i].State & MOTOR_STATE_PRESENT_MASK/* && Mixer.Motor[i][MIX_GAS]*/) |
{ |
NumOfMotors++; |
if(Motor[i].Current > 200) |
{ |
Current += BL3_Current(i); // extended Current measurement -> 200 = 20A 201 = 21A 255 = 75A (20+55) |
} |
else Current += (unsigned int)(Motor[i].Current); |
SetSum += (unsigned int)(Motor[i].SetPoint); |
if(Motor[i].MaxPWM < MinOfMaxPWM) MinOfMaxPWM = Motor[i].MaxPWM; |
} |
} |
Capacity.MinOfMaxPWM = MinOfMaxPWM; |
if(SetSum == 0) // if all setpoints are 0 |
{ // determine offsets of motor currents |
#define CURRENT_AVERAGE 8 // 8bit = 256 * 10 ms = 2.56s average time |
CurrentOffset = (unsigned int)(SumCurrentOffset>>CURRENT_AVERAGE); |
SumCurrentOffset -= CurrentOffset; |
SumCurrentOffset += Current; |
// after averaging set current to static offset |
Current = FC_OFFSET_CURRENT; |
} |
else // some motors are running, includes also motor test condition, where "MotorRunning" is false |
{ // subtract offset |
if(Current > CurrentOffset) Current -= CurrentOffset; |
else Current = 0; |
// add the FC and BL Offsets |
Current += FC_OFFSET_CURRENT + NumOfMotors * BL_OFFSET_CURRENT; |
} |
// update actual Current |
Capacity.ActualCurrent = Current; |
// update actual Power |
if(Current < 255) Capacity.ActualPower = (UBat * Current) / 100; // in W higher resolution |
else Capacity.ActualPower = (UBat * (Current/4)) / 25; // in W |
// update used capacity |
SubCounter += Current; |
// 100mA * 1ms * CAPACITY_UPDATE_INTERVAL = 1 mA * 100 ms * CAPACITY_UPDATE_INTERVAL |
// = 1mA * 0.1s * CAPACITY_UPDATE_INTERVAL = 1mA * 1min / (600 / CAPACITY_UPDATE_INTERVAL) |
// = 1mAh / (36000 / CAPACITY_UPDATE_INTERVAL) |
#define SUB_COUNTER_LIMIT (36000 / CAPACITY_UPDATE_INTERVAL) |
while(SubCounter > SUB_COUNTER_LIMIT) |
{ |
Capacity.UsedCapacity++; // we have one mAh more |
SubCounter -= SUB_COUNTER_LIMIT; // keep the remaining sub part |
} |
} // EOF check delay update timer |
} |
/branches/V2.02a_FirstTrial_Peter/capacity.h |
---|
0,0 → 1,18 |
#ifndef _CAPACITY_H |
#define _CAPACITY_H |
typedef struct |
{ |
unsigned short ActualCurrent; // in 0.1A Steps |
unsigned short ActualPower; // in 0.1W |
unsigned short UsedCapacity; // in mAh |
unsigned char MinOfMaxPWM; // BL Power Limit |
} __attribute__((packed)) Capacity_t; |
extern Capacity_t Capacity; |
void Capacity_Init(void); |
void Capacity_Update(void); |
#endif //_CAPACITY_H |
/branches/V2.02a_FirstTrial_Peter/debug.c |
---|
0,0 → 1,48 |
#include "main.h" |
#include "debug.h" |
#ifdef DEBUG // only include functions if DEBUG is defined in main.h |
#warning : "### DEBUG-Funktion aktiv ###" |
unsigned char Debug_BufPtr = 0; |
struct str_Debug tDebug; |
unsigned char SendDebugOutput = 0; |
// function called from _printf_P to output character |
void Debug_Putchar(char c) |
{ |
if (!SendDebugOutput) |
{ |
tDebug.Text[Debug_BufPtr++] = c; // copy character to buffer |
if (Debug_BufPtr > 30) Debug_BufPtr = 30; // avoid buffer overflow |
} |
} |
void DebugSend(unsigned char cmd) |
{ |
if (!SendDebugOutput) |
{ |
tDebug.Cmd = cmd; |
tDebug.Text[Debug_BufPtr] = '\0'; // end of text marker |
Debug_BufPtr = 0; // set bufferindex to 0 |
SendDebugOutput = 1; // set flag to trasmit data the next time in serial transmit function |
} |
} |
#endif |
/* |
add the following code block to the serial transmit function |
#ifdef DEBUG // only include functions if DEBUG is defined |
if(SendDebugOutput && UebertragungAbgeschlossen) |
{ |
SendOutData('0', FC_ADDRESS, 1, (unsigned char *) &tDebug, sizeof(tDebug)); |
SendDebugOutput = 0; |
} |
#endif |
*/ |
/branches/V2.02a_FirstTrial_Peter/debug.h |
---|
0,0 → 1,60 |
#ifndef _DEBUG_H |
#define _DEBUG_H |
// ---------------------------------------------- |
#define CMD_NONE 0x00 |
#define CMD_RAW_OUTPUT 0x01 |
#define CMD_ERROR_MSG 0x02 |
#define CMD_WARNING_MSG 0x04 |
#define CMD_GREEN_MSG 0x08 |
// debug console in MK-Tool can also handle ANSI ESC seq. |
#define ANSI_ATTRIBUTE_OFF "\033[0m" |
#define ANSI_BOLD "\033[1m" |
#define ANSI_UNDERSCORE "\033[4m" |
#define ANSI_BLINK "\033[5m" |
#define ANSI_INVERSE "\033[7m" |
#define ANSI_INVISIBLE "\033[8m" |
#define ANSI_COLOR_BLACK "\033[30m" |
#define ANSI_COLOR_RED "\033[31m" |
#define ANSI_COLOR_GREEN "\033[32m" |
#define ANSI_COLOR_YELLOW "\033[33m" |
#define ANSI_COLOR_BLUE "\033[34m" |
#define ANSI_COLOR_VIOLETT "\033[35m" |
#define ANSI_COLOR_KOBALTBLUE "\033[36m" |
#define ANSI_COLOR_WHITE "\033[37m" |
#define ANSI_CLEAR "\033[2J" |
#define ANSI_HOME "\033[H" |
// macros for easier use |
#ifdef DEBUG // only include functions if DEBUG is defined in main.h |
#define Debug(format, args...) { _printf_P(&Debug_Putchar, PSTR(format) , ## args); DebugSend(CMD_NONE); } |
#define Debug_Raw(format, args...) { _printf_P(&Debug_Putchar, PSTR(format) , ## args); DebugSend(CMD_RAW_OUTPUT); } |
#define Debug_Warning(format, args...) { _printf_P(&Debug_Putchar, PSTR(format) , ## args); DebugSend(CMD_WARNING_MSG); } |
#define Debug_Error(format, args...) { _printf_P(&Debug_Putchar, PSTR(format) , ## args); DebugSend(CMD_ERROR_MSG); } |
#define Debug_OK(format, args...) { _printf_P(&Debug_Putchar, PSTR(format) , ## args); DebugSend(CMD_GREEN_MSG); } |
struct str_Debug |
{ |
unsigned char Cmd; // bitcoded command |
char Text[32]; |
}; |
extern struct str_Debug tDebug; |
unsigned char SendDebugOutput; |
void Debug_Putchar(char c); |
void DebugSend(unsigned char cmd); |
#else // dummy macros (won't waste flash, if #DEBUG is disabled) |
#define Debug(format, args...) ; |
#define Debug_Raw(format, args...) ; |
#define Debug_Warning(format, args...) ; |
#define Debug_Error(format, args...) ; |
#define Debug_OK(format, args...) ; |
#endif |
// ---------------------------------------------- |
#endif |
/branches/V2.02a_FirstTrial_Peter/eeprom.c |
---|
0,0 → 1,655 |
// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
// + www.MikroKopter.com |
// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
// + Software Nutzungsbedingungen (english version: see below) |
// + der Fa. HiSystems GmbH, Flachsmeerstrasse 2, 26802 Moormerland - nachfolgend Lizenzgeber genannt - |
// + Der Lizenzgeber räumt dem Kunden ein nicht-ausschließliches, zeitlich und räumlich* unbeschränktes Recht ein, die im den |
// + Mikrocontroller verwendete Firmware für die Hardware Flight-Ctrl, Navi-Ctrl, BL-Ctrl, MK3Mag & PC-Programm MikroKopter-Tool |
// + - nachfolgend Software genannt - nur für private Zwecke zu nutzen. |
// + Der Einsatz dieser Software ist nur auf oder mit Produkten des Lizenzgebers zulässig. |
// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
// + Die vom Lizenzgeber gelieferte Software ist urheberrechtlich geschützt. Alle Rechte an der Software sowie an sonstigen im |
// + Rahmen der Vertragsanbahnung und Vertragsdurchführung überlassenen Unterlagen stehen im Verhältnis der Vertragspartner ausschließlich dem Lizenzgeber zu. |
// + Die in der Software enthaltenen Copyright-Vermerke, Markenzeichen, andere Rechtsvorbehalte, Seriennummern sowie |
// + sonstige der Programmidentifikation dienenden Merkmale dürfen vom Kunden nicht verändert oder unkenntlich gemacht werden. |
// + Der Kunde trifft angemessene Vorkehrungen für den sicheren Einsatz der Software. Er wird die Software gründlich auf deren |
// + Verwendbarkeit zu dem von ihm beabsichtigten Zweck testen, bevor er diese operativ einsetzt. |
// + Die Haftung des Lizenzgebers wird - soweit gesetzlich zulässig - begrenzt in Höhe des typischen und vorhersehbaren |
// + Schadens. Die gesetzliche Haftung bei Personenschäden und nach dem Produkthaftungsgesetz bleibt unberührt. Dem Lizenzgeber steht jedoch der Einwand |
// + des Mitverschuldens offen. |
// + Der Kunde trifft angemessene Vorkehrungen für den Fall, dass die Software ganz oder teilweise nicht ordnungsgemäß arbeitet. |
// + Er wird die Software gründlich auf deren Verwendbarkeit zu dem von ihm beabsichtigten Zweck testen, bevor er diese operativ einsetzt. |
// + Der Kunde wird er seine Daten vor Einsatz der Software nach dem Stand der Technik sichern. |
// + Der Kunde ist darüber unterrichtet, dass der Lizenzgeber seine Daten im zur Vertragsdurchführung erforderlichen Umfang |
// + und auf Grundlage der Datenschutzvorschriften erhebt, speichert, verarbeitet und, sofern notwendig, an Dritte übermittelt. |
// + *) Die räumliche Nutzung bezieht sich nur auf den Einsatzort, nicht auf die Reichweite der programmierten Software. |
// + #### ENDE DER NUTZUNGSBEDINGUNGEN ####' |
// + Hinweis: Informationen über erweiterte Nutzungsrechte (wie z.B. Nutzung für nicht-private Zwecke) sind auf Anfrage per Email an info(@)hisystems.de verfügbar. |
// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
// + Software LICENSING TERMS |
// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
// + of HiSystems GmbH, Flachsmeerstrasse 2, 26802 Moormerland, Germany - the Licensor - |
// + The Licensor grants the customer a non-exclusive license to use the microcontroller firmware of the Flight-Ctrl, Navi-Ctrl, BL-Ctrl, and MK3Mag hardware |
// + (the Software) exclusively for private purposes. The License is unrestricted with respect to time and territory*. |
// + The Software may only be used with the Licensor's products. |
// + The Software provided by the Licensor is protected by copyright. With respect to the relationship between the parties to this |
// + agreement, all rights pertaining to the Software and other documents provided during the preparation and execution of this |
// + agreement shall be the property of the Licensor. |
// + The information contained in the Software copyright notices, trademarks, other legal reservations, serial numbers and other |
// + features that can be used to identify the program may not be altered or defaced by the customer. |
// + The customer shall be responsible for taking reasonable precautions |
// + for the safe use of the Software. The customer shall test the Software thoroughly regarding its suitability for the |
// + intended purpose before implementing it for actual operation. The Licensor's liability shall be limited to the extent of typical and |
// + foreseeable damage to the extent permitted by law, notwithstanding statutory liability for bodily injury and product |
// + liability. However, the Licensor shall be entitled to the defense of contributory negligence. |
// + The customer will take adequate precautions in the case, that the software is not working properly. The customer will test |
// + the software for his purpose before any operational usage. The customer will backup his data before using the software. |
// + The customer understands that the Licensor collects, stores and processes, and, where required, forwards, customer data |
// + to third parties to the extent necessary for executing the agreement, subject to applicable data protection and privacy regulations. |
// + *) The territory aspect only refers to the place where the Software is used, not its programmed range. |
// + #### END OF LICENSING TERMS #### |
// + Note: For information on license extensions (e.g. commercial use), please contact us at info(@)hisystems.de. |
// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
#ifndef EEMEM |
#define EEMEM __attribute__ ((section (".eeprom"))) |
#endif |
#include <avr/eeprom.h> |
#include <string.h> |
#include "eeprom.h" |
#include "uart.h" |
#include "led.h" |
#include "main.h" |
#include "fc.h" |
#include "twimaster.h" |
paramset_t EE_Parameter; |
MixerTable_t Mixer; |
uint8_t RequiredMotors; |
uint8_t RAM_Checksum(uint8_t* pBuffer, uint16_t len) |
{ |
uint8_t crc = 0xAA; |
uint16_t i; |
for(i=0; i<len; i++) |
{ |
crc += pBuffer[i]; |
} |
return crc; |
} |
uint8_t EEProm_Checksum(uint16_t EEAddr, uint16_t len) |
{ |
uint8_t crc = 0xAA; |
uint16_t off; |
for(off=0; off<len; off++) |
{ |
crc += eeprom_read_byte((uint8_t*)(EEAddr + off));; |
} |
return crc; |
} |
void ParamSet_DefaultStickMapping(void) |
{ |
EE_Parameter.Kanalbelegung[K_GAS] = 1; |
EE_Parameter.Kanalbelegung[K_ROLL] = 2; |
EE_Parameter.Kanalbelegung[K_NICK] = 3; |
EE_Parameter.Kanalbelegung[K_GIER] = 4; |
EE_Parameter.Kanalbelegung[K_POTI1] = 5; |
EE_Parameter.Kanalbelegung[K_POTI2] = 6; |
EE_Parameter.Kanalbelegung[K_POTI3] = 7; |
EE_Parameter.Kanalbelegung[K_POTI4] = 8; |
EE_Parameter.Kanalbelegung[K_POTI5] = 9; |
EE_Parameter.Kanalbelegung[K_POTI6] = 10; |
EE_Parameter.Kanalbelegung[K_POTI7] = 11; |
EE_Parameter.Kanalbelegung[K_POTI8] = 12; |
} |
/***************************************************/ |
/* Default Values for parameter set 1 */ |
/***************************************************/ |
void CommonDefaults(void) |
{ |
EE_Parameter.Revision = EEPARAM_REVISION; |
memset(EE_Parameter.Name,0,12); // delete name |
if(PlatinenVersion >= 20) |
{ |
EE_Parameter.Gyro_D = 10; |
EE_Parameter.Driftkomp = 0; |
EE_Parameter.GyroAccFaktor = 27; |
EE_Parameter.WinkelUmschlagNick = 78; |
EE_Parameter.WinkelUmschlagRoll = 78; |
} |
else |
{ |
EE_Parameter.Gyro_D = 3; |
EE_Parameter.Driftkomp = 32; |
EE_Parameter.GyroAccFaktor = 30; |
EE_Parameter.WinkelUmschlagNick = 85; |
EE_Parameter.WinkelUmschlagRoll = 85; |
} |
EE_Parameter.GyroAccAbgleich = 32; // 1/k |
EE_Parameter.BitConfig = 0; // Looping usw. |
EE_Parameter.GlobalConfig = CFG_ACHSENKOPPLUNG_AKTIV | CFG_KOMPASS_AKTIV | CFG_GPS_AKTIV | CFG_HOEHEN_SCHALTER; |
EE_Parameter.ExtraConfig = CFG_GPS_AID | CFG2_VARIO_BEEP | CFG_LEARNABLE_CAREFREE | CFG_NO_RCOFF_BEEPING; |
EE_Parameter.GlobalConfig3 = CFG3_SPEAK_ALL | CFG3_NO_GPSFIX_NO_START;// |
EE_Parameter.Receiver = RECEIVER_HOTT; |
EE_Parameter.MotorSafetySwitch = 0; |
EE_Parameter.ExternalControl = 0; |
EE_Parameter.Gas_Min = 8; // Wert : 0-32 |
EE_Parameter.Gas_Max = 230; // Wert : 33-247 |
EE_Parameter.KompassWirkung = 64; // Wert : 0-247 |
EE_Parameter.HoeheChannel = 5; // Wert : 0-32 |
EE_Parameter.Hoehe_MinGas = 30; |
#if (defined(__AVR_ATmega1284__) || defined(__AVR_ATmega1284P__)) |
if(ACC_AltitudeControl) |
{ |
EE_Parameter.Hoehe_P = 20; // Wert : 0-32 |
EE_Parameter.Luftdruck_D = 40; // Wert : 0-247 |
EE_Parameter.Hoehe_ACC_Wirkung = 30; // Wert : 0-247 |
EE_Parameter.Hoehe_HoverBand = 1; // Wert : 0-247 |
EE_Parameter.Hoehe_GPS_Z = 0; // Wert : 0-247 |
EE_Parameter.Hoehe_StickNeutralPoint = 127;// Wert : 0-247 (0 = Hover-Estimation) |
EE_Parameter.FailSafeTime = 30; // 0 = off |
} |
else |
#endif |
{ |
EE_Parameter.Hoehe_P = 15; // Wert : 0-32 |
EE_Parameter.Luftdruck_D = 30; // Wert : 0-247 |
EE_Parameter.Hoehe_ACC_Wirkung = 0; // Wert : 0-247 |
EE_Parameter.Hoehe_HoverBand = 8; // Wert : 0-247 |
EE_Parameter.Hoehe_GPS_Z = 20; // Wert : 0-247 |
EE_Parameter.Hoehe_StickNeutralPoint = 0;// Wert : 0-247 (0 = Hover-Estimation) |
EE_Parameter.FailSafeTime = 0; // 0 = off |
} |
EE_Parameter.Hoehe_Verstaerkung = 15; // Wert : 0-50 (15 -> ca. +/- 5m/sek bei Stick-Voll-Ausschlag) |
EE_Parameter.StartLandChannel = 0; |
EE_Parameter.LandingSpeed = 12; |
EE_Parameter.UserParam1 = 0; // zur freien Verwendung |
EE_Parameter.UserParam2 = 0; // zur freien Verwendung |
EE_Parameter.UserParam3 = 0; // zur freien Verwendung |
EE_Parameter.UserParam4 = 0; // zur freien Verwendung |
EE_Parameter.UserParam5 = 0; // zur freien Verwendung |
EE_Parameter.UserParam6 = 0; // zur freien Verwendung |
EE_Parameter.UserParam7 = 0; // zur freien Verwendung |
EE_Parameter.UserParam8 = 0; // zur freien Verwendung |
EE_Parameter.ServoNickControl = 128; // Wert : 0-247 // Stellung des Servos |
EE_Parameter.ServoNickComp = 50; // Wert : 0-247 // Einfluss Gyro/Servo |
EE_Parameter.ServoCompInvert = 2; // Wert : 0-247 // Richtung Einfluss Gyro/Servo |
EE_Parameter.ServoNickMin = 24; // Wert : 0-247 // Anschlag |
EE_Parameter.ServoNickMax = 230; // Wert : 0-247 // Anschlag |
EE_Parameter.ServoNickRefresh = 3; |
EE_Parameter.Servo3 = 125; |
EE_Parameter.Servo4 = 125; |
EE_Parameter.Servo5 = 125; |
EE_Parameter.ServoRollControl = 128; // Wert : 0-247 // Stellung des Servos |
EE_Parameter.ServoRollComp = 85; // Wert : 0-247 // Einfluss Gyro/Servo |
EE_Parameter.ServoRollMin = 70; // Wert : 0-247 // Anschlag |
EE_Parameter.ServoRollMax = 220; // Wert : 0-247 // Anschlag |
EE_Parameter.ServoManualControlSpeed = 60; |
EE_Parameter.CamOrientation = 0; // Wert : 0-24 -> 0-360 -> 15° steps |
EE_Parameter.J16Bitmask = 0xAA; |
EE_Parameter.J17Bitmask = 0xCC; |
EE_Parameter.WARN_J16_Bitmask = 0x00; |
EE_Parameter.WARN_J17_Bitmask = 0xAA; |
EE_Parameter.J16Timing = 40; |
EE_Parameter.J17Timing = 40; |
EE_Parameter.NaviOut1Parameter = 0; // Photo release in meter |
EE_Parameter.LoopGasLimit = 50; |
EE_Parameter.LoopThreshold = 90; // Wert: 0-247 Schwelle für Stickausschlag |
EE_Parameter.LoopHysterese = 50; |
EE_Parameter.NaviGpsModeChannel = 6; // Kanal 6 |
EE_Parameter.NaviGpsGain = 100; |
EE_Parameter.NaviGpsP = 100; |
EE_Parameter.NaviGpsI = 90; |
EE_Parameter.NaviGpsD = 120; |
EE_Parameter.NaviGpsA = 40; |
EE_Parameter.NaviGpsPLimit = 75; |
EE_Parameter.NaviGpsILimit = 85; |
EE_Parameter.NaviGpsDLimit = 75; |
EE_Parameter.NaviGpsMinSat = 6; |
EE_Parameter.NaviStickThreshold = 8; |
EE_Parameter.NaviWindCorrection = 50; |
EE_Parameter.NaviAccCompensation = 42; |
EE_Parameter.NaviOperatingRadius = 245; |
EE_Parameter.NaviAngleLimitation = 140; |
EE_Parameter.NaviPH_LoginTime = 2; |
EE_Parameter.OrientationAngle = 0; |
EE_Parameter.CareFreeChannel = 0; |
EE_Parameter.UnterspannungsWarnung = 33; // Wert : 0-247 ( Automatische Zellenerkennung bei < 50) |
EE_Parameter.NotGas = 65; // Wert : 0-247 // Gaswert bei Empangsverlust (ggf. in Prozent) |
EE_Parameter.NotGasZeit = 90; // Wert : 0-247 // Zeit bis auf NotGas geschaltet wird, wg. Rx-Problemen |
EE_Parameter.MotorSmooth = 0; |
EE_Parameter.ComingHomeAltitude = 0; // 0 = don't change |
EE_Parameter.MaxAltitude = 150; // 0 = off |
EE_Parameter.AchsKopplung1 = 125; |
EE_Parameter.AchsKopplung2 = 52; |
EE_Parameter.FailsafeChannel = 0; |
EE_Parameter.ServoFilterNick = 0; |
EE_Parameter.ServoFilterRoll = 0; |
EE_Parameter.CompassOffset = 0; |
EE_Parameter.AutoLandingVoltage = 31; |
} |
/* |
void ParamSet_DefaultSet1(void) // sport |
{ |
CommonDefaults(); |
EE_Parameter.Stick_P = 14; // Wert : 1-20 |
EE_Parameter.Stick_D = 16; // Wert : 0-20 |
EE_Parameter.StickGier_P = 12; // Wert : 1-20 |
EE_Parameter.Gyro_P = 80; // Wert : 0-247 |
EE_Parameter.Gyro_I = 150; // Wert : 0-247 |
EE_Parameter.Gyro_Gier_P = 80; // Wert : 0-247 |
EE_Parameter.Gyro_Gier_I = 150; // Wert : 0-247 |
EE_Parameter.Gyro_Stability = 6; // Wert : 1-8 |
EE_Parameter.I_Faktor = 32; |
EE_Parameter.CouplingYawCorrection = 1; |
EE_Parameter.GyroAccAbgleich = 16; // 1/k; |
EE_Parameter.DynamicStability = 100; |
memcpy(EE_Parameter.Name, "Sport\0", 12); |
EE_Parameter.crc = RAM_Checksum((uint8_t*)(&EE_Parameter), sizeof(EE_Parameter)-1); |
} |
*/ |
/***************************************************/ |
/* Default Values for parameter set 1 */ |
/***************************************************/ |
void ParamSet_DefaultSet1(void) // normal |
{ |
CommonDefaults(); |
EE_Parameter.Stick_P = 10; // Wert : 1-20 |
EE_Parameter.Stick_D = 16; // Wert : 0-20 |
EE_Parameter.StickGier_P = 6; // Wert : 1-20 |
EE_Parameter.Gyro_P = 90; // Wert : 0-247 |
EE_Parameter.Gyro_I = 120; // Wert : 0-247 |
EE_Parameter.Gyro_Gier_P = 90; // Wert : 0-247 |
EE_Parameter.Gyro_Gier_I = 120; // Wert : 0-247 |
EE_Parameter.Gyro_Stability = 6; // Wert : 1-8 |
EE_Parameter.I_Faktor = 32; |
EE_Parameter.CouplingYawCorrection = 60; |
EE_Parameter.DynamicStability = 75; |
memcpy(EE_Parameter.Name, "Fast",4); |
EE_Parameter.crc = RAM_Checksum((uint8_t*)(&EE_Parameter), sizeof(EE_Parameter)-1); |
} |
/***************************************************/ |
/* Default Values for parameter set 2 */ |
/***************************************************/ |
void ParamSet_DefaultSet2(void) // Agil |
{ |
CommonDefaults(); |
EE_Parameter.Stick_P = 8; // Wert : 1-20 |
EE_Parameter.Stick_D = 16; // Wert : 0-20 |
EE_Parameter.StickGier_P = 6; // Wert : 1-20 |
EE_Parameter.Gyro_P = 100; // Wert : 0-247 |
EE_Parameter.Gyro_I = 120; // Wert : 0-247 |
EE_Parameter.Gyro_Gier_P = 100; // Wert : 0-247 |
EE_Parameter.Gyro_Gier_I = 120; // Wert : 0-247 |
EE_Parameter.Gyro_Stability = 6; // Wert : 1-8 |
EE_Parameter.I_Faktor = 16; |
EE_Parameter.CouplingYawCorrection = 70; |
EE_Parameter.DynamicStability = 70; |
memcpy(EE_Parameter.Name, "Agile",5); |
EE_Parameter.crc = RAM_Checksum((uint8_t*)(&EE_Parameter), sizeof(EE_Parameter)-1); |
} |
/***************************************************/ |
/* Default Values for parameter set 3 */ |
/***************************************************/ |
void ParamSet_DefaultSet3(void) // Easy |
{ |
CommonDefaults(); |
EE_Parameter.Stick_P = 6; // Wert : 1-20 |
EE_Parameter.Stick_D = 10; // Wert : 0-20 |
EE_Parameter.StickGier_P = 4; // Wert : 1-20 |
EE_Parameter.Gyro_P = 100; // Wert : 0-247 |
EE_Parameter.Gyro_I = 120; // Wert : 0-247 |
EE_Parameter.Gyro_Gier_P = 100; // Wert : 0-247 |
EE_Parameter.Gyro_Gier_I = 120; // Wert : 0-247 |
EE_Parameter.Gyro_Stability = 6; // Wert : 1-8 |
EE_Parameter.I_Faktor = 16; |
EE_Parameter.CouplingYawCorrection = 70; |
EE_Parameter.DynamicStability = 70; |
memcpy(EE_Parameter.Name, "Easy", 4); |
EE_Parameter.crc = RAM_Checksum((uint8_t*)(&EE_Parameter), sizeof(EE_Parameter)-1); |
} |
/***************************************************/ |
/* Read Parameter from EEPROM as byte */ |
/***************************************************/ |
uint8_t GetParamByte(uint16_t param_id) |
{ |
return eeprom_read_byte((uint8_t*)(EEPROM_ADR_PARAM_BEGIN + param_id)); |
} |
/***************************************************/ |
/* Write Parameter to EEPROM as byte */ |
/***************************************************/ |
void SetParamByte(uint16_t param_id, uint8_t value) |
{ |
eeprom_write_byte((uint8_t*)(EEPROM_ADR_PARAM_BEGIN + param_id), value); |
} |
/***************************************************/ |
/* Read Parameter from EEPROM as word */ |
/***************************************************/ |
uint16_t GetParamWord(uint16_t param_id) |
{ |
return eeprom_read_word((uint16_t *)(EEPROM_ADR_PARAM_BEGIN + param_id)); |
} |
/***************************************************/ |
/* Write Parameter to EEPROM as word */ |
/***************************************************/ |
void SetParamWord(uint16_t param_id, uint16_t value) |
{ |
eeprom_write_word((uint16_t*)(EEPROM_ADR_PARAM_BEGIN + param_id), value); |
} |
/***************************************************/ |
/* Read Parameter Set from EEPROM */ |
/***************************************************/ |
// number [1..5] |
uint8_t ParamSet_ReadFromEEProm(uint8_t setnumber) |
{ |
uint8_t crc; |
uint16_t eeaddr; |
// range the setnumber |
if((1 > setnumber) || (setnumber > 5)) setnumber = 3; |
// calculate eeprom addr |
eeaddr = EEPROM_ADR_PARAMSET + PARAMSET_STRUCT_LEN * (setnumber - 1); |
// calculate checksum from eeprom |
crc = EEProm_Checksum(eeaddr, PARAMSET_STRUCT_LEN - 1); |
// check crc |
if(crc != eeprom_read_byte((uint8_t*)(eeaddr + PARAMSET_STRUCT_LEN - 1))) return 0; |
// check revision |
if(eeprom_read_byte((uint8_t*)(eeaddr)) != EEPARAM_REVISION) return 0; |
// read paramset from eeprom |
eeprom_read_block((void *) &EE_Parameter, (void*)(EEPROM_ADR_PARAMSET + PARAMSET_STRUCT_LEN * (setnumber - 1)), PARAMSET_STRUCT_LEN); |
LED_Init(); |
#if (defined(__AVR_ATmega1284__) || defined(__AVR_ATmega1284P__)) |
LIBFC_HoTT_Clear(); |
#endif |
return 1; |
} |
/***************************************************/ |
/* Write Parameter Set to EEPROM */ |
/***************************************************/ |
// number [1..5] |
uint8_t ParamSet_WriteToEEProm(uint8_t setnumber) |
{ |
uint8_t crc; |
if(EE_Parameter.Revision == EEPARAM_REVISION) // write only the right revision to eeprom |
{ |
if(setnumber > 5) setnumber = 5; |
if(setnumber < 1) return 0; |
LIBFC_CheckSettings(); |
if(EE_Parameter.GlobalConfig3 & CFG3_VARIO_FAILSAFE) // check the Setting: Not more than 100% emergency gas |
{ |
if(EE_Parameter.NotGas > 99) EE_Parameter.NotGas = 80; // i.e. 80% of Hovergas |
} |
// update checksum |
EE_Parameter.crc = RAM_Checksum((uint8_t*)(&EE_Parameter), sizeof(EE_Parameter)-1); |
// write paramset to eeprom |
eeprom_write_block((void *) &EE_Parameter, (void*)(EEPROM_ADR_PARAMSET + PARAMSET_STRUCT_LEN * (setnumber - 1)), PARAMSET_STRUCT_LEN); |
// backup channel settings to separate block in eeprom |
eeprom_write_block( (void*)(EE_Parameter.Kanalbelegung), (void*)(EEPROM_ADR_CHANNELS), sizeof(EE_Parameter.Kanalbelegung)); |
// write crc of channel block to eeprom |
crc = RAM_Checksum((uint8_t*)(EE_Parameter.Kanalbelegung), sizeof(EE_Parameter.Kanalbelegung)); |
eeprom_write_byte((uint8_t*)(EEPROM_ADR_CHANNELS + sizeof(EE_Parameter.Kanalbelegung)), crc); |
// update active settings number |
SetActiveParamSet(setnumber); |
LED_Init(); |
#if (defined(__AVR_ATmega1284__) || defined(__AVR_ATmega1284P__)) |
LIBFC_HoTT_Clear(); |
#endif |
return 1; |
} |
// wrong revision |
return 0; |
} |
/***************************************************/ |
/* Read MixerTable from EEPROM */ |
/***************************************************/ |
uint8_t MixerTable_ReadFromEEProm(void) |
{ |
uint8_t crc; |
// calculate checksum in eeprom |
crc = EEProm_Checksum(EEPROM_ADR_MIXERTABLE, sizeof(Mixer) - 1); |
// check crc |
if( crc != eeprom_read_byte((uint8_t*)(EEPROM_ADR_MIXERTABLE + sizeof(Mixer) - 1)) ) return 0; |
// check revision |
if(eeprom_read_byte((uint8_t*)(EEPROM_ADR_MIXERTABLE)) != EEMIXER_REVISION) return 0; |
// read mixer table |
eeprom_read_block((void *) &Mixer, (void*)(EEPROM_ADR_MIXERTABLE), sizeof(Mixer)); |
return 1; |
} |
/***************************************************/ |
/* Write Mixer Table to EEPROM */ |
/***************************************************/ |
uint8_t MixerTable_WriteToEEProm(void) |
{ |
if(Mixer.Revision == EEMIXER_REVISION) |
{ |
// update crc |
Mixer.crc = RAM_Checksum((uint8_t*)(&Mixer), sizeof(Mixer) - 1); |
// write to eeprom |
eeprom_write_block((void *) &Mixer, (void*)(EEPROM_ADR_MIXERTABLE), sizeof(Mixer)); |
return 1; |
} |
else return 0; |
} |
/***************************************************/ |
/* Default Values for Mixer Table */ |
/***************************************************/ |
void MixerTable_Default(void) // Quadro |
{ |
uint8_t i; |
Mixer.Revision = EEMIXER_REVISION; |
// clear mixer table |
for(i = 0; i < 16; i++) |
{ |
Mixer.Motor[i][MIX_GAS] = 0; |
Mixer.Motor[i][MIX_NICK] = 0; |
Mixer.Motor[i][MIX_ROLL] = 0; |
Mixer.Motor[i][MIX_YAW] = 0; |
} |
// default = Quadro |
Mixer.Motor[0][MIX_GAS] = 64; Mixer.Motor[0][MIX_NICK] = +64; Mixer.Motor[0][MIX_ROLL] = 0; Mixer.Motor[0][MIX_YAW] = +64; |
Mixer.Motor[1][MIX_GAS] = 64; Mixer.Motor[1][MIX_NICK] = -64; Mixer.Motor[1][MIX_ROLL] = 0; Mixer.Motor[1][MIX_YAW] = +64; |
Mixer.Motor[2][MIX_GAS] = 64; Mixer.Motor[2][MIX_NICK] = 0; Mixer.Motor[2][MIX_ROLL] = -64; Mixer.Motor[2][MIX_YAW] = -64; |
Mixer.Motor[3][MIX_GAS] = 64; Mixer.Motor[3][MIX_NICK] = 0; Mixer.Motor[3][MIX_ROLL] = +64; Mixer.Motor[3][MIX_YAW] = -64; |
memcpy(Mixer.Name, "Quadro\0\0\0\0\0\0", 12); |
Mixer.crc = RAM_Checksum((uint8_t*)(&Mixer), sizeof(Mixer) - 1); |
} |
/***************************************************/ |
/* Get active parameter set */ |
/***************************************************/ |
uint8_t GetActiveParamSet(void) |
{ |
uint8_t setnumber; |
setnumber = eeprom_read_byte((uint8_t*)(EEPROM_ADR_PARAM_BEGIN + PID_ACTIVE_SET)); |
if(setnumber > 5) |
{ |
setnumber = 3; |
eeprom_write_byte((void*)(EEPROM_ADR_PARAM_BEGIN+PID_ACTIVE_SET), setnumber); |
} |
ActiveParamSet = setnumber; |
return(setnumber); |
} |
/***************************************************/ |
/* Set active parameter set */ |
/***************************************************/ |
void SetActiveParamSet(uint8_t setnumber) |
{ |
if(setnumber > 5) setnumber = 5; |
if(setnumber < 1) setnumber = 1; |
ActiveParamSet = setnumber; |
eeprom_write_byte((uint8_t*)(EEPROM_ADR_PARAM_BEGIN + PID_ACTIVE_SET), setnumber); |
} |
/***************************************************/ |
/* Set default parameter set */ |
/***************************************************/ |
void SetDefaultParameter(uint8_t set, uint8_t restore_channels) |
{ |
if(set > 5) set = 5; |
else if(set < 1) set = 1; |
switch(set) |
{ |
case 1: |
ParamSet_DefaultSet1(); // Fill ParamSet Structure to default parameter set 1 (Sport) |
break; |
case 2: |
ParamSet_DefaultSet2(); // Kamera |
break; |
case 3: |
ParamSet_DefaultSet3(); // Beginner |
break; |
default: |
ParamSet_DefaultSet3(); // Beginner |
break; |
} |
if(restore_channels) |
{ |
uint8_t crc; |
// 1st check for a valid channel backup in eeprom |
crc = EEProm_Checksum(EEPROM_ADR_CHANNELS, sizeof(EE_Parameter.Kanalbelegung)); |
if(crc == eeprom_read_byte((uint8_t*)(EEPROM_ADR_CHANNELS + sizeof(EE_Parameter.Kanalbelegung))) ) |
{ |
eeprom_read_block((void *)EE_Parameter.Kanalbelegung, (void*)(EEPROM_ADR_CHANNELS), sizeof(EE_Parameter.Kanalbelegung)); |
} |
else ParamSet_DefaultStickMapping(); |
} |
else ParamSet_DefaultStickMapping(); |
ParamSet_WriteToEEProm(set); |
} |
/***************************************************/ |
/* Initialize EEPROM Parameter Sets */ |
/***************************************************/ |
void ParamSet_Init(void) |
{ |
uint8_t channel_backup = 0, bad_params = 0, ee_default = 0,i; |
#if (defined(__AVR_ATmega1284__) || defined(__AVR_ATmega1284P__)) |
if(PlatinenVersion != GetParamByte(PID_HARDWARE_VERSION)) |
{ |
if(PlatinenVersion == 22 && GetParamByte(PID_HARDWARE_VERSION) == 21 && !(PIND & 0x10)) SetParamByte(PID_EE_REVISION,0); // reset the Settings if the Version changed to V2.2 |
SetParamByte(PID_HARDWARE_VERSION,PlatinenVersion); // Remember the Version number |
wdt_enable(WDTO_15MS); // Reset-Commando |
printf("\n\r--> Hardware Version Byte Changed <--"); |
while(1); |
} |
#endif |
if((EEPARAM_REVISION) != GetParamByte(PID_EE_REVISION)) |
{ |
ee_default = 1; // software update or forced by mktool |
} |
// 1st check for a valid channel backup in eeprom |
i = EEProm_Checksum(EEPROM_ADR_CHANNELS, sizeof(EE_Parameter.Kanalbelegung)); |
if(i == eeprom_read_byte((uint8_t*)(EEPROM_ADR_CHANNELS + sizeof(EE_Parameter.Kanalbelegung)))) channel_backup = 1; |
// parameter check |
// check all 5 parameter settings |
for (i = 1;i < 6; i++) |
{ |
if(ee_default || !ParamSet_ReadFromEEProm(i)) // could not read paramset from eeprom |
{ |
bad_params = 1; |
printf("\n\rGenerating default Parameter Set %d",i); |
switch(i) |
{ |
case 1: |
ParamSet_DefaultSet1(); // Fill ParamSet Structure to default parameter set 1 (Sport) |
break; |
case 2: |
ParamSet_DefaultSet2(); // Normal |
break; |
default: |
ParamSet_DefaultSet3(); // Easy |
break; |
} |
if(channel_backup) // if we have an channel mapping backup in eeprom |
{ // restore it from eeprom |
eeprom_read_block((void *)EE_Parameter.Kanalbelegung, (void*)(EEPROM_ADR_CHANNELS), sizeof(EE_Parameter.Kanalbelegung)); |
} |
else |
{ // use default mapping |
ParamSet_DefaultStickMapping(); |
} |
ParamSet_WriteToEEProm(i); |
} |
} |
if(bad_params) // at least one of the parameter settings were invalid |
{ |
// default-Setting is parameter set 3 |
SetActiveParamSet(3); |
} |
// read active parameter set to ParamSet stucture |
i = GetActiveParamSet(); |
ParamSet_ReadFromEEProm(i); |
printf("\n\rUsing Parameter Set %d", i); |
// load mixer table |
if(GetParamByte(PID_EE_REVISION) == 0xff || !MixerTable_ReadFromEEProm() ) |
{ |
printf("\n\rGenerating default Mixer Table"); |
MixerTable_Default(); // Quadro |
MixerTable_WriteToEEProm(); |
} |
if(ee_default) SetParamByte(PID_EE_REVISION, (EEPARAM_REVISION)); |
// determine motornumber |
RequiredMotors = 0; |
for(i = 0; i < 16; i++) |
{ |
if(Mixer.Motor[i][MIX_GAS] > 0) RequiredMotors++; |
} |
printf("\n\rMixer-Config: '%s' (%u Motors)",Mixer.Name, RequiredMotors); |
PrintLine();// ("\n\r==================================="); |
} |
/branches/V2.02a_FirstTrial_Peter/eeprom.h |
---|
0,0 → 1,284 |
#ifndef _EEPROM_H |
#define _EEPROM_H |
#include <inttypes.h> |
#include "twimaster.h" |
#define EEPARAM_REVISION 97 // is count up, if paramater stucture has changed (compatibility) |
#define EEMIXER_REVISION 1 // is count up, if mixer stucture has changed (compatibility) |
#define EEPROM_ADR_PARAM_BEGIN 0 |
#define EE_DUMMY 0 // Byte |
#define PID_EE_REVISION 1 // byte |
#define PID_ACTIVE_SET 2 // byte |
#define PID_PRESSURE_OFFSET 3 // byte |
#define PID_ACC_NICK 4 // word |
#define PID_ACC_ROLL 6 // word |
#define PID_ACC_TOP 8 // word |
#define PID_FLIGHT_MINUTES_TOTAL 10 // word |
#define PID_FLIGHT_MINUTES 14 // word |
#define PID_SPEAK_HOTT_CFG 16 // Byte |
#define PID_HARDWARE_VERSION 17 // Byte |
#define EEPROM_ADR_CHANNELS 80 // 80 - 93, 12 bytes + 1 byte crc |
#define EEPROM_ADR_PARAMSET 100 // 100 - 725, 5 * 125 bytes |
#define EEPROM_ADR_MIXERTABLE 1000 // 1000 - 1078, 78 bytes |
#define EEPROM_ADR_BLCONFIG 1200 // 1200 - 1296, 12 * 8 bytes |
#define MIX_GAS 0 |
#define MIX_NICK 1 |
#define MIX_ROLL 2 |
#define MIX_YAW 3 |
typedef struct |
{ |
uint8_t Revision; |
int8_t Name[12]; |
int8_t Motor[16][4]; |
uint8_t crc; |
} __attribute__((packed)) MixerTable_t; |
extern MixerTable_t Mixer; |
extern uint8_t RequiredMotors; |
//GlobalConfig3 |
#define CFG3_NO_SDCARD_NO_START 0x01 |
#define CFG3_DPH_MAX_RADIUS 0x02 |
#define CFG3_VARIO_FAILSAFE 0x04 |
#define CFG3_MOTOR_SWITCH_MODE 0x08 |
#define CFG3_NO_GPSFIX_NO_START 0x10 |
#define CFG3_USE_NC_FOR_OUT1 0x20 |
#define CFG3_SPEAK_ALL 0x40 |
#define CFG3_SERVO_NICK_COMP_OFF 0x80 |
//GlobalConfig |
#define CFG_HOEHENREGELUNG 0x01 |
#define CFG_HOEHEN_SCHALTER 0x02 |
#define CFG_HEADING_HOLD 0x04 |
#define CFG_KOMPASS_AKTIV 0x08 |
#define CFG_KOMPASS_FIX 0x10 |
#define CFG_GPS_AKTIV 0x20 |
#define CFG_ACHSENKOPPLUNG_AKTIV 0x40 |
#define CFG_DREHRATEN_BEGRENZER 0x80 |
//BitConfig |
#define CFG_LOOP_OBEN 0x01 |
#define CFG_LOOP_UNTEN 0x02 |
#define CFG_LOOP_LINKS 0x04 |
#define CFG_LOOP_RECHTS 0x08 |
#define CFG_MOTOR_BLINK1 0x10 |
#define CFG_MOTOR_OFF_LED1 0x20 |
#define CFG_MOTOR_OFF_LED2 0x40 |
#define CFG_MOTOR_BLINK2 0x80 |
// ExtraConfig |
#define CFG2_HEIGHT_LIMIT 0x01 |
#define CFG2_VARIO_BEEP 0x02 |
#define CFG_SENSITIVE_RC 0x04 |
#define CFG_3_3V_REFERENCE 0x08 |
#define CFG_NO_RCOFF_BEEPING 0x10 |
#define CFG_GPS_AID 0x20 |
#define CFG_LEARNABLE_CAREFREE 0x40 |
#define CFG_IGNORE_MAG_ERR_AT_STARTUP 0x80 |
// bit mask for ParamSet.Config0 |
#define CFG0_AIRPRESS_SENSOR 0x01 |
#define CFG0_HEIGHT_SWITCH 0x02 |
#define CFG0_HEADING_HOLD 0x04 |
#define CFG0_COMPASS_ACTIVE 0x08 |
#define CFG0_COMPASS_FIX 0x10 |
#define CFG0_GPS_ACTIVE 0x20 |
#define CFG0_AXIS_COUPLING_ACTIVE 0x40 |
#define CFG0_ROTARY_RATE_LIMITER 0x80 |
// bitcoding for EE_Parameter.ServoCompInvert |
#define SERVO_NICK_INV 0x01 |
#define SERVO_ROLL_INV 0x02 |
#define SERVO_RELATIVE 0x04 // direct poti control or relative moving of the servo value |
// defines for the receiver selection |
#define RECEIVER_PPM 0 |
#define RECEIVER_SPEKTRUM 1 |
#define RECEIVER_SPEKTRUM_HI_RES 2 |
#define RECEIVER_SPEKTRUM_LOW_RES 3 |
#define RECEIVER_JETI 4 |
#define RECEIVER_ACT_DSL 5 |
#define RECEIVER_HOTT 6 |
#define RECEIVER_SBUS 7 |
#define RECEIVER_USER 8 |
#define RECEIVER_UNKNOWN 0xFF |
// defines for lookup ParamSet.ChannelAssignment |
#define K_NICK 0 |
#define K_ROLL 1 |
#define K_GAS 2 |
#define K_GIER 3 |
#define K_POTI1 4 |
#define K_POTI2 5 |
#define K_POTI3 6 |
#define K_POTI4 7 |
#define K_POTI5 8 |
#define K_POTI6 9 |
#define K_POTI7 10 |
#define K_POTI8 11 |
// values above 247 representing poti1 to poti8 |
// poti1 = 255 |
// poti2 = 254 |
// poti3 = 253 |
// poti4 = 252 |
// poti5 = 251 |
// poti6 = 250 |
// poti7 = 249 |
// poti8 = 248 |
typedef struct |
{ |
unsigned char Revision; |
unsigned char Kanalbelegung[12]; // GAS[0], GIER[1],NICK[2], ROLL[3], POTI1, POTI2, POTI3 |
unsigned char GlobalConfig; // 0x01=Höhenregler aktiv,0x02=Kompass aktiv, 0x04=GPS aktiv, 0x08=Heading Hold aktiv |
unsigned char Hoehe_MinGas; // Wert : 0-100 |
unsigned char Luftdruck_D; // Wert : 0-250 |
unsigned char HoeheChannel; // Wert : 0-32 |
unsigned char Hoehe_P; // Wert : 0-32 |
unsigned char Hoehe_Verstaerkung; // Wert : 0-50 |
unsigned char Hoehe_ACC_Wirkung; // Wert : 0-250 |
unsigned char Hoehe_HoverBand; // Wert : 0-250 |
unsigned char Hoehe_GPS_Z; // Wert : 0-250 |
unsigned char Hoehe_StickNeutralPoint;// Wert : 0-250 |
unsigned char Stick_P; // Wert : 1-6 |
unsigned char Stick_D; // Wert : 0-64 |
unsigned char StickGier_P; // Wert : 1-20 |
unsigned char Gas_Min; // Wert : 0-32 |
unsigned char Gas_Max; // Wert : 33-250 |
unsigned char GyroAccFaktor; // Wert : 1-64 |
unsigned char KompassWirkung; // Wert : 0-32 |
unsigned char Gyro_P; // Wert : 10-250 |
unsigned char Gyro_I; // Wert : 0-250 |
unsigned char Gyro_D; // Wert : 0-250 |
unsigned char Gyro_Gier_P; // Wert : 10-250 |
unsigned char Gyro_Gier_I; // Wert : 0-250 |
unsigned char Gyro_Stability; // Wert : 0-16 |
unsigned char UnterspannungsWarnung; // Wert : 0-250 |
unsigned char NotGas; // Wert : 0-250 //Gaswert bei Empängsverlust |
unsigned char NotGasZeit; // Wert : 0-250 // Zeitbis auf NotGas geschaltet wird, wg. Rx-Problemen |
unsigned char Receiver; // 0= Summensignal, 1= Spektrum, 2 =Jeti, 3=ACT DSL, 4=ACT S3D |
unsigned char I_Faktor; // Wert : 0-250 |
unsigned char UserParam1; // Wert : 0-250 |
unsigned char UserParam2; // Wert : 0-250 |
unsigned char UserParam3; // Wert : 0-250 |
unsigned char UserParam4; // Wert : 0-250 |
unsigned char ServoNickControl; // Wert : 0-250 // Stellung des Servos |
unsigned char ServoNickComp; // Wert : 0-250 // Einfluss Gyro/Servo |
unsigned char ServoNickMin; // Wert : 0-250 // Anschlag |
unsigned char ServoNickMax; // Wert : 0-250 // Anschlag |
//--- Seit V0.75 |
unsigned char ServoRollControl; // Wert : 0-250 // Stellung des Servos |
unsigned char ServoRollComp; // Wert : 0-250 |
unsigned char ServoRollMin; // Wert : 0-250 |
unsigned char ServoRollMax; // Wert : 0-250 |
//--- |
unsigned char ServoNickRefresh; // Speed of the Servo |
unsigned char ServoManualControlSpeed;// |
unsigned char CamOrientation; // |
unsigned char Servo3; // Value or mapping of the Servo Output |
unsigned char Servo4; // Value or mapping of the Servo Output |
unsigned char Servo5; // Value or mapping of the Servo Output |
unsigned char LoopGasLimit; // Wert: 0-250 max. Gas während Looping |
unsigned char LoopThreshold; // Wert: 0-250 Schwelle für Stickausschlag |
unsigned char LoopHysterese; // Wert: 0-250 Hysterese für Stickausschlag |
unsigned char AchsKopplung1; // Wert: 0-250 Faktor, mit dem Gier die Achsen Roll und Nick koppelt (NickRollMitkopplung) |
unsigned char AchsKopplung2; // Wert: 0-250 Faktor, mit dem Nick und Roll verkoppelt werden |
unsigned char CouplingYawCorrection; // Wert: 0-250 Faktor, mit dem Nick und Roll verkoppelt werden |
unsigned char WinkelUmschlagNick; // Wert: 0-250 180°-Punkt |
unsigned char WinkelUmschlagRoll; // Wert: 0-250 180°-Punkt |
unsigned char GyroAccAbgleich; // 1/k (Koppel_ACC_Wirkung) |
unsigned char Driftkomp; |
unsigned char DynamicStability; |
unsigned char UserParam5; // Wert : 0-250 |
unsigned char UserParam6; // Wert : 0-250 |
unsigned char UserParam7; // Wert : 0-250 |
unsigned char UserParam8; // Wert : 0-250 |
//---Output --------------------------------------------- |
unsigned char J16Bitmask; // for the J16 Output |
unsigned char J16Timing; // for the J16 Output |
unsigned char J17Bitmask; // for the J17 Output |
unsigned char J17Timing; // for the J17 Output |
// seit version V0.75c |
unsigned char WARN_J16_Bitmask; // for the J16 Output |
unsigned char WARN_J17_Bitmask; // for the J17 Output |
//---NaviCtrl--------------------------------------------- |
unsigned char NaviOut1Parameter; // for the J16 Output |
unsigned char NaviGpsModeChannel; // Parameters for the Naviboard |
unsigned char NaviGpsGain; |
unsigned char NaviGpsP; |
unsigned char NaviGpsI; |
unsigned char NaviGpsD; |
unsigned char NaviGpsPLimit; |
unsigned char NaviGpsILimit; |
unsigned char NaviGpsDLimit; |
unsigned char NaviGpsA; |
unsigned char NaviGpsMinSat; |
unsigned char NaviStickThreshold; |
unsigned char NaviWindCorrection; |
unsigned char NaviAccCompensation; // New since 0.86 -> was: SpeedCompensation |
unsigned char NaviOperatingRadius; |
unsigned char NaviAngleLimitation; |
unsigned char NaviPH_LoginTime; |
//---Ext.Ctrl--------------------------------------------- |
unsigned char ExternalControl; // for serial Control |
//---CareFree--------------------------------------------- |
unsigned char OrientationAngle; // Where is the front-direction? |
unsigned char CareFreeChannel; // switch for CareFree |
unsigned char MotorSafetySwitch; |
unsigned char MotorSmooth; |
unsigned char ComingHomeAltitude; |
unsigned char FailSafeTime; |
unsigned char MaxAltitude; |
unsigned char FailsafeChannel; // if the value of this channel is > 100, the MK reports "RC-Lost" |
unsigned char ServoFilterNick; |
unsigned char ServoFilterRoll; |
unsigned char StartLandChannel; |
unsigned char LandingSpeed; |
unsigned char CompassOffset; |
unsigned char AutoLandingVoltage; // in 0,1V 0 -> disabled |
//------------------------------------------------ |
unsigned char BitConfig; // (war Loop-Cfg) Bitcodiert: 0x01=oben, 0x02=unten, 0x04=links, 0x08=rechts / wird getrennt behandelt |
unsigned char ServoCompInvert; // // 0x01 = Nick, 0x02 = Roll, 0x04 = relative moving // WICHTIG!!! am Ende lassen |
unsigned char ExtraConfig; // bitcodiert |
unsigned char GlobalConfig3; // bitcodiert |
char Name[12]; |
unsigned char crc; // must be the last byte! |
} paramset_t; // 127 bytes |
#define PARAMSET_STRUCT_LEN sizeof(paramset_t) |
extern paramset_t EE_Parameter; |
extern uint8_t RAM_Checksum(uint8_t* pBuffer, uint16_t len); |
extern void ParamSet_Init(void); |
extern void SetDefaultParameter(uint8_t set, uint8_t restore_channels); |
extern uint8_t ParamSet_ReadFromEEProm(uint8_t setnumber); |
extern uint8_t ParamSet_WriteToEEProm(uint8_t setnumber); |
extern uint8_t GetActiveParamSet(void); |
extern void SetActiveParamSet(uint8_t setnumber); |
extern uint8_t MixerTable_ReadFromEEProm(void); |
extern uint8_t MixerTable_WriteToEEProm(void); |
extern uint8_t GetParamByte(uint16_t param_id); |
extern void SetParamByte(uint16_t param_id, uint8_t value); |
extern uint16_t GetParamWord(uint16_t param_id); |
extern void SetParamWord(uint16_t param_id, uint16_t value); |
#endif //_EEPROM_H |
/branches/V2.02a_FirstTrial_Peter/fc.c |
---|
0,0 → 1,2218 |
/*####################################################################################### |
Flight Control |
#######################################################################################*/ |
// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
// + www.MikroKopter.com |
// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
// + Software Nutzungsbedingungen (english version: see below) |
// + der Fa. HiSystems GmbH, Flachsmeerstrasse 2, 26802 Moormerland - nachfolgend Lizenzgeber genannt - |
// + Der Lizenzgeber räumt dem Kunden ein nicht-ausschließliches, zeitlich und räumlich* unbeschränktes Recht ein, die im den |
// + Mikrocontroller verwendete Firmware für die Hardware Flight-Ctrl, Navi-Ctrl, BL-Ctrl, MK3Mag & PC-Programm MikroKopter-Tool |
// + - nachfolgend Software genannt - nur für private Zwecke zu nutzen. |
// + Der Einsatz dieser Software ist nur auf oder mit Produkten des Lizenzgebers zulässig. |
// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
// + Die vom Lizenzgeber gelieferte Software ist urheberrechtlich geschützt. Alle Rechte an der Software sowie an sonstigen im |
// + Rahmen der Vertragsanbahnung und Vertragsdurchführung überlassenen Unterlagen stehen im Verhältnis der Vertragspartner ausschließlich dem Lizenzgeber zu. |
// + Die in der Software enthaltenen Copyright-Vermerke, Markenzeichen, andere Rechtsvorbehalte, Seriennummern sowie |
// + sonstige der Programmidentifikation dienenden Merkmale dürfen vom Kunden nicht verändert oder unkenntlich gemacht werden. |
// + Der Kunde trifft angemessene Vorkehrungen für den sicheren Einsatz der Software. Er wird die Software gründlich auf deren |
// + Verwendbarkeit zu dem von ihm beabsichtigten Zweck testen, bevor er diese operativ einsetzt. |
// + Die Haftung des Lizenzgebers wird - soweit gesetzlich zulässig - begrenzt in Höhe des typischen und vorhersehbaren |
// + Schadens. Die gesetzliche Haftung bei Personenschäden und nach dem Produkthaftungsgesetz bleibt unberührt. Dem Lizenzgeber steht jedoch der Einwand |
// + des Mitverschuldens offen. |
// + Der Kunde trifft angemessene Vorkehrungen für den Fall, dass die Software ganz oder teilweise nicht ordnungsgemäß arbeitet. |
// + Er wird die Software gründlich auf deren Verwendbarkeit zu dem von ihm beabsichtigten Zweck testen, bevor er diese operativ einsetzt. |
// + Der Kunde wird er seine Daten vor Einsatz der Software nach dem Stand der Technik sichern. |
// + Der Kunde ist darüber unterrichtet, dass der Lizenzgeber seine Daten im zur Vertragsdurchführung erforderlichen Umfang |
// + und auf Grundlage der Datenschutzvorschriften erhebt, speichert, verarbeitet und, sofern notwendig, an Dritte übermittelt. |
// + *) Die räumliche Nutzung bezieht sich nur auf den Einsatzort, nicht auf die Reichweite der programmierten Software. |
// + #### ENDE DER NUTZUNGSBEDINGUNGEN ####' |
// + Hinweis: Informationen über erweiterte Nutzungsrechte (wie z.B. Nutzung für nicht-private Zwecke) sind auf Anfrage per Email an info(@)hisystems.de verfügbar. |
// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
// + Software LICENSING TERMS |
// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
// + of HiSystems GmbH, Flachsmeerstrasse 2, 26802 Moormerland, Germany - the Licensor - |
// + The Licensor grants the customer a non-exclusive license to use the microcontroller firmware of the Flight-Ctrl, Navi-Ctrl, BL-Ctrl, and MK3Mag hardware |
// + (the Software) exclusively for private purposes. The License is unrestricted with respect to time and territory*. |
// + The Software may only be used with the Licensor's products. |
// + The Software provided by the Licensor is protected by copyright. With respect to the relationship between the parties to this |
// + agreement, all rights pertaining to the Software and other documents provided during the preparation and execution of this |
// + agreement shall be the property of the Licensor. |
// + The information contained in the Software copyright notices, trademarks, other legal reservations, serial numbers and other |
// + features that can be used to identify the program may not be altered or defaced by the customer. |
// + The customer shall be responsible for taking reasonable precautions |
// + for the safe use of the Software. The customer shall test the Software thoroughly regarding its suitability for the |
// + intended purpose before implementing it for actual operation. The Licensor's liability shall be limited to the extent of typical and |
// + foreseeable damage to the extent permitted by law, notwithstanding statutory liability for bodily injury and product |
// + liability. However, the Licensor shall be entitled to the defense of contributory negligence. |
// + The customer will take adequate precautions in the case, that the software is not working properly. The customer will test |
// + the software for his purpose before any operational usage. The customer will backup his data before using the software. |
// + The customer understands that the Licensor collects, stores and processes, and, where required, forwards, customer data |
// + to third parties to the extent necessary for executing the agreement, subject to applicable data protection and privacy regulations. |
// + *) The territory aspect only refers to the place where the Software is used, not its programmed range. |
// + #### END OF LICENSING TERMS #### |
// + Note: For information on license extensions (e.g. commercial use), please contact us at info(@)hisystems.de. |
// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
#include "main.h" |
#include "mymath.h" |
#include "isqrt.h" |
unsigned char h,m,s; |
unsigned int BaroExpandActive = 0; |
int MesswertNick,MesswertRoll,MesswertGier,MesswertGierBias, RohMesswertNick,RohMesswertRoll; |
int TrimNick, TrimRoll; |
int AdNeutralNick = 0,AdNeutralRoll = 0,AdNeutralGier = 0,StartNeutralRoll = 0,StartNeutralNick = 0; |
int Mittelwert_AccNick, Mittelwert_AccRoll; |
unsigned int NeutralAccX=0, NeutralAccY=0; |
int NaviAccNick, NaviAccRoll,NaviCntAcc = 0; |
int NeutralAccZ = 0; |
signed char NeutralAccZfine = 0; |
unsigned char ControlHeading = 0;// in 2° |
long IntegralNick = 0,IntegralNick2 = 0; |
long IntegralRoll = 0,IntegralRoll2 = 0; |
long IntegralAccNick = 0,IntegralAccRoll = 0,IntegralAccZ = 0; |
long Integral_Gier = 0; |
long Mess_IntegralNick = 0,Mess_IntegralNick2 = 0; |
long Mess_IntegralRoll = 0,Mess_IntegralRoll2 = 0; |
long Mess_Integral_Gier = 0,Mess_Integral_Gier2 = 0; |
long MittelIntegralNick,MittelIntegralRoll,MittelIntegralNick2,MittelIntegralRoll2; |
long SummeNick=0,SummeRoll=0; |
volatile long Mess_Integral_Hoch = 0; |
int KompassValue = -1; |
int KompassSollWert = 0; |
//int KompassRichtung = 0; |
char CalculateCompassTimer = 100; |
unsigned char KompassFusion = 32; |
unsigned int KompassSignalSchlecht = 50; |
unsigned char MAX_GAS,MIN_GAS; |
unsigned char HoehenReglerAktiv = 0; |
unsigned char TrichterFlug = 0; |
long Umschlag180Nick = 250000L, Umschlag180Roll = 250000L; |
long ErsatzKompass; |
int ErsatzKompassInGrad; // Kompasswert in Grad |
int GierGyroFehler = 0; |
char GyroFaktor,GyroFaktorGier; |
char IntegralFaktor,IntegralFaktorGier; |
int DiffNick,DiffRoll; |
int StickGasHover = 127, HoverGasMin = 0, HoverGasMax = 1023; |
int StickNick = 0,StickRoll = 0,StickGier = 0,StickGas = 0; |
//int Poti1 = 0, Poti2 = 0, Poti3 = 0, Poti4 = 0, Poti5 = 0, Poti6 = 0, Poti7 = 0, Poti8 = 0; |
unsigned char Poti[9] = {0,0,0,0,0,0,0,0}; |
volatile unsigned char SenderOkay = 0; |
char MotorenEin = 0,StartTrigger = 0; |
long HoehenWert = 0; |
long SollHoehe = 0; |
signed int AltitudeSetpointTrimming = 0; |
long FromNC_AltitudeSetpoint = 0; |
unsigned char FromNC_AltitudeSpeed = 0; |
unsigned char carefree_old = 50; // to make the Beep when switching |
signed char WaypointTrimming = 0; |
int CompassGierSetpoint = 0; |
unsigned char CalibrationDone = 0; |
char NeueKompassRichtungMerken = 0; |
int LageKorrekturRoll = 0,LageKorrekturNick = 0, HoverGas = 0; |
//float Ki = FAKTOR_I; |
int Ki = 10300 / 33; |
unsigned char Looping_Nick = 0,Looping_Roll = 0; |
unsigned char Looping_Links = 0, Looping_Rechts = 0, Looping_Unten = 0, Looping_Oben = 0; |
unsigned char Parameter_Luftdruck_D = 48; // Wert : 0-250 |
unsigned char Parameter_HoehenSchalter = 0; // Wert : 0-250 |
unsigned char Parameter_Hoehe_P = 16; // Wert : 0-32 |
unsigned char Parameter_Hoehe_ACC_Wirkung = 58; // Wert : 0-250 |
unsigned char Parameter_KompassWirkung = 64; // Wert : 0-250 |
unsigned char Parameter_Hoehe_GPS_Z = 64; // Wert : 0-250 |
unsigned char Parameter_Gyro_D = 8; // Wert : 0-250 |
unsigned char Parameter_Gyro_P = 150; // Wert : 10-250 |
unsigned char Parameter_Gyro_I = 150; // Wert : 0-250 |
unsigned char Parameter_Gyro_Gier_P = 150; // Wert : 10-250 |
unsigned char Parameter_Gyro_Gier_I = 150; // Wert : 10-250 |
unsigned char Parameter_Gier_P = 2; // Wert : 1-20 |
unsigned char Parameter_I_Faktor = 10; // Wert : 1-20 |
unsigned char Parameter_UserParam1 = 0; |
unsigned char Parameter_UserParam2 = 0; |
unsigned char Parameter_UserParam3 = 0; |
unsigned char Parameter_UserParam4 = 0; |
unsigned char Parameter_UserParam5 = 0; |
unsigned char Parameter_UserParam6 = 0; |
unsigned char Parameter_UserParam7 = 0; |
unsigned char Parameter_UserParam8 = 0; |
unsigned char Parameter_NickControl = 100; |
unsigned char Parameter_ServoNickControl = 100; |
unsigned char Parameter_ServoRollControl = 100; |
unsigned char Parameter_ServoNickComp = 50; |
unsigned char Parameter_ServoRollComp = 85; |
unsigned char Parameter_LoopGasLimit = 70; |
unsigned char Parameter_AchsKopplung1 = 90; |
unsigned char Parameter_AchsKopplung2 = 65; |
unsigned char Parameter_CouplingYawCorrection = 64; |
//unsigned char Parameter_AchsGegenKopplung1 = 0; |
unsigned char Parameter_DynamicStability = 100; |
unsigned char Parameter_J16Bitmask; // for the J16 Output |
unsigned char Parameter_J16Timing; // for the J16 Output |
unsigned char Parameter_J17Bitmask; // for the J17 Output |
unsigned char Parameter_J17Timing; // for the J17 Output |
unsigned char Parameter_NaviGpsGain; |
unsigned char Parameter_NaviGpsP; |
unsigned char Parameter_NaviGpsI; |
unsigned char Parameter_NaviGpsD; |
unsigned char Parameter_NaviGpsA; |
unsigned char Parameter_NaviOperatingRadius; |
unsigned char Parameter_NaviWindCorrection; |
unsigned char Parameter_NaviSpeedCompensation; |
unsigned char Parameter_ExternalControl; |
unsigned char Parameter_GlobalConfig; |
unsigned char Parameter_ExtraConfig; |
unsigned char Parameter_MaximumAltitude; |
unsigned char Parameter_Servo3,Parameter_Servo4,Parameter_Servo5; |
unsigned char CareFree = 0; |
const signed char sintab[31] = { 0, 2, 4, 6, 7, 8, 8, 8, 7, 6, 4, 2, 0, -2, -4, -6, -7, -8, -8, -8, -7, -6, -4, -2, 0, 2, 4, 6, 7, 8, 8}; // 15° steps |
signed int ExternStickNick = 0,ExternStickRoll = 0,ExternStickGier = 0, ExternHoehenValue = -20; |
int MaxStickNick = 0,MaxStickRoll = 0; |
unsigned int modell_fliegt = 0; |
volatile unsigned char FC_StatusFlags = 0, FC_StatusFlags2 = 0; |
long GIER_GRAD_FAKTOR = 1291; |
signed int KopplungsteilNickRoll,KopplungsteilRollNick; |
signed int tmp_motorwert[MAX_MOTORS]; |
char VarioCharacter = ' '; |
unsigned int HooverGasEmergencyPercent = 0; // The gas value for Emergency landing |
unsigned int GasIsZeroCnt = 0; // to detect that the gas-stick is down for a while |
signed int Variance = 0; |
signed int CosAttitude; // for projection of hoover gas |
unsigned char ACC_AltitudeControl = 0; |
unsigned char LowVoltageLandingActive = 0; |
#if (defined(__AVR_ATmega1284__) || defined(__AVR_ATmega1284P__)) |
#define OPA_OFFSET_STEP 5 |
#else |
#define OPA_OFFSET_STEP 10 |
#endif |
// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
// Debugwerte zuordnen |
// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
void CopyDebugValues(void) |
{ |
DebugOut.Analog[0] = ToNaviCtrl.IntegralNick;//IntegralNick / (EE_Parameter.GyroAccFaktor * 4); |
DebugOut.Analog[1] = ToNaviCtrl.IntegralRoll;//IntegralRoll / (EE_Parameter.GyroAccFaktor * 4); |
DebugOut.Analog[2] = Mittelwert_AccNick / 4; |
DebugOut.Analog[3] = Mittelwert_AccRoll / 4; |
DebugOut.Analog[4] = (signed int) AdNeutralGier - AdWertGier; |
DebugOut.Analog[5] = HoehenWert/10; |
DebugOut.Analog[6] = Aktuell_az;//AdWertAccHoch;//(Mess_Integral_Hoch / 512); |
DebugOut.Analog[8] = KompassValue; |
DebugOut.Analog[9] = UBat; |
DebugOut.Analog[10] = SenderOkay; |
DebugOut.Analog[11] = ErsatzKompassInGrad; |
DebugOut.Analog[12] = Motor[0].SetPoint; |
DebugOut.Analog[13] = Motor[1].SetPoint; |
DebugOut.Analog[14] = Motor[2].SetPoint; |
DebugOut.Analog[15] = Motor[3].SetPoint; |
DebugOut.Analog[20] = ServoNickValue; |
DebugOut.Analog[21] = HoverGas; |
DebugOut.Analog[22] = Capacity.ActualCurrent; |
DebugOut.Analog[23] = Capacity.UsedCapacity; |
DebugOut.Analog[24] = SollHoehe/10; |
DebugOut.Analog[27] = KompassSollWert; |
DebugOut.Analog[29] = Capacity.MinOfMaxPWM; |
DebugOut.Analog[30] = GPS_Nick; |
DebugOut.Analog[31] = GPS_Roll; |
if(VersionInfo.HardwareError[0] || VersionInfo.HardwareError[1]) DebugOut.Status[1] |= 1; else DebugOut.Status[1] &= 0xfe; |
//DebugOut.Analog[16] = MinBlTemperture; |
//DebugOut.Analog[17] = MaxBlTemperture; |
//DebugOut.Analog[16] = Variance; |
//DebugOut.Analog[17] = VarioMeter; |
//DebugOut.Analog[16] = GasIsZeroCnt; |
//DebugOut.Analog[18] = HoehenWertF; |
//DebugOut.Analog[25] = Parameter_Hoehe_P; |
//DebugOut.Analog[26] = Parameter_Luftdruck_D; |
} |
void Piep(unsigned char Anzahl, unsigned int dauer) |
{ |
unsigned int wait = 0; |
if(MotorenEin) return; //auf keinen Fall im Flug! |
GRN_OFF; |
while(Anzahl--) |
{ |
beeptime = dauer; |
wait = dauer; |
while(beeptime || wait) |
{ |
if(UpdateMotor) |
{ |
UpdateMotor = 0; |
if(!beeptime) wait--; |
LIBFC_Polling(); |
}; |
} |
} |
GRN_ON; |
} |
//############################################################################ |
// Messwerte beim Ermitteln der Nullage |
void CalibrierMittelwert(void) |
//############################################################################ |
{ |
unsigned char i; |
if(PlatinenVersion == 13) SucheGyroOffset(); |
// ADC auschalten, damit die Werte sich nicht während der Berechnung ändern |
ANALOG_OFF; |
MesswertNick = AdWertNick; |
MesswertRoll = AdWertRoll; |
MesswertGier = AdWertGier; |
Mittelwert_AccNick = ACC_AMPLIFY * AdWertAccNick; |
Mittelwert_AccRoll = ACC_AMPLIFY * AdWertAccRoll; |
// ADC einschalten |
ANALOG_ON; |
for(i=0;i<8;i++) |
{ |
int tmp; |
tmp = PPM_in[EE_Parameter.Kanalbelegung[K_POTI1 + i]] + 127; |
LIMIT_MIN_MAX(tmp, 0, 255); |
if(Poti[i] > tmp) Poti[i]--; else if(Poti[i] < tmp) Poti[i]++; |
} |
Umschlag180Nick = (long) EE_Parameter.WinkelUmschlagNick * 2500L; |
Umschlag180Roll = (long) EE_Parameter.WinkelUmschlagRoll * 2500L; |
} |
//############################################################################ |
// Nullwerte ermitteln |
// Parameter: 0 -> after switch on (ignore ACC-Z fault) |
// Parameter: 1 -> before Start |
// Parameter: 2 -> calibrate and store ACC |
unsigned char SetNeutral(unsigned char AdjustmentMode) // retuns: "sucess" |
//############################################################################ |
{ |
unsigned char i, sucess = 1; |
unsigned int gier_neutral = 0, nick_neutral = 0, roll_neutral = 0, acc_z_neutral = 0, barotest; |
VersionInfo.HardwareError[0] = 0; |
// HEF4017Reset_ON; |
NeutralAccX = 0; |
NeutralAccY = 0; |
NeutralAccZ = 0; |
NeutralAccZfine = 0; |
AdNeutralNick = 0; |
AdNeutralRoll = 0; |
AdNeutralGier = 0; |
Parameter_AchsKopplung1 = 0; |
Parameter_AchsKopplung2 = 0; |
ExpandBaro = 0; |
CalibrierMittelwert(); |
Delay_ms_Mess(100); |
CalibrierMittelwert(); |
if((EE_Parameter.GlobalConfig & CFG_HOEHENREGELUNG)) // Höhenregelung aktiviert? |
{ |
if((MessLuftdruck > 950) || (MessLuftdruck < 750) || ExpandBaro) SucheLuftruckOffset(); |
} |
barotest = MessLuftdruck; |
#define NEUTRAL_FILTER 32 |
OCR0A += OPA_OFFSET_STEP; |
OCR0B = 255 - OCR0A; |
for(i=0; i<NEUTRAL_FILTER; i++) |
{ |
Delay_ms_Mess(10); |
gier_neutral += AdWertGier; |
nick_neutral += AdWertNick; |
roll_neutral += AdWertRoll; |
acc_z_neutral += Aktuell_az; |
} |
if(MessLuftdruck < 1010 && MessLuftdruck > 20) BaroStep = barotest - MessLuftdruck; |
OCR0A -= OPA_OFFSET_STEP; |
OCR0B = 255 - OCR0A; |
AdNeutralNick = (nick_neutral+NEUTRAL_FILTER/2) / (NEUTRAL_FILTER / 8); |
AdNeutralRoll = (roll_neutral+NEUTRAL_FILTER/2) / (NEUTRAL_FILTER / 8); |
AdNeutralGier = (gier_neutral+NEUTRAL_FILTER/2) / (NEUTRAL_FILTER); |
NeutralAccZ = (acc_z_neutral+NEUTRAL_FILTER/2) / (NEUTRAL_FILTER); |
StartNeutralRoll = AdNeutralRoll; |
StartNeutralNick = AdNeutralNick; |
if(AdjustmentMode == 2) |
{ |
NeutralAccX = abs(Mittelwert_AccNick) / (2*ACC_AMPLIFY); |
NeutralAccY = abs(Mittelwert_AccRoll) / (2*ACC_AMPLIFY); |
// Save ACC neutral settings to eeprom |
SetParamWord(PID_ACC_NICK, (uint16_t)NeutralAccX); |
SetParamWord(PID_ACC_ROLL, (uint16_t)NeutralAccY); |
SetParamWord(PID_ACC_TOP, (uint16_t)NeutralAccZ); |
} |
else |
{ |
// restore from eeprom |
NeutralAccX = (int16_t)GetParamWord(PID_ACC_NICK); |
NeutralAccY = (int16_t)GetParamWord(PID_ACC_ROLL); |
// strange settings? |
if(((unsigned int) NeutralAccX > 2048) || ((unsigned int) NeutralAccY > 2048)/* || ((unsigned int) NeutralAccZ > 1024)*/) |
{ |
printf("\n\rACC not calibrated!\r\n"); |
NeutralAccX = abs(Mittelwert_AccNick) / (2*ACC_AMPLIFY); |
NeutralAccY = abs(Mittelwert_AccRoll) / (2*ACC_AMPLIFY); |
sucess = 0; |
} |
} |
EEAR = EE_DUMMY; // Set the EEPROM Address pointer to an unused space |
MesswertNick = 0; |
MesswertRoll = 0; |
MesswertGier = 0; |
Delay_ms_Mess(200); |
Mittelwert_AccNick = ACC_AMPLIFY * AdWertAccNick; |
Mittelwert_AccRoll = ACC_AMPLIFY * AdWertAccRoll; |
IntegralNick = EE_Parameter.GyroAccFaktor * (long)Mittelwert_AccNick; |
IntegralRoll = EE_Parameter.GyroAccFaktor * (long)Mittelwert_AccRoll; |
Mess_IntegralNick = IntegralNick; |
Mess_IntegralRoll = IntegralRoll; |
Mess_Integral_Gier = 0; |
KompassSollWert = KompassValue; |
KompassSignalSchlecht = 100; |
beeptime = 50; |
Umschlag180Nick = ((long) EE_Parameter.WinkelUmschlagNick * 2500L) + 15000L; |
Umschlag180Roll = ((long) EE_Parameter.WinkelUmschlagRoll * 2500L) + 15000L; |
ExternHoehenValue = 0; |
ErsatzKompass = KompassValue * GIER_GRAD_FAKTOR; |
GierGyroFehler = 0; |
LED_Init(); |
if(AdjustmentMode != 0) FC_StatusFlags |= FC_STATUS_CALIBRATE; |
FromNaviCtrl_Value.Kalman_K = -1; |
FromNaviCtrl_Value.Kalman_MaxDrift = 0; |
FromNaviCtrl_Value.Kalman_MaxFusion = 32; |
for(i=0;i<8;i++) |
{ |
Poti[i] = PPM_in[EE_Parameter.Kanalbelegung[K_POTI1 + i]] + 127; |
} |
SenderOkay = 100; |
if(ServoActive) DDRD |=0x80; // enable J7 -> Servo signal |
else |
{ |
if((EE_Parameter.ServoCompInvert & SERVO_NICK_INV) && (EE_Parameter.ServoCompInvert & SERVO_RELATIVE)) NickServoValue = 12000;//((128 + 60) * 4 * 16); // neutral position = upper 1/4// else |
else NickServoValue = ((128 - 60) * 4 * 16); // neutral position = lower 1/4 |
CalculateServoSignals = 1; |
CalculateServo(); // nick |
CalculateServo(); // roll |
} |
#if (defined(__AVR_ATmega1284__) || defined(__AVR_ATmega1284P__)) |
signed int tilt1, tilt2; |
tilt1 = (int)(IntegralNick/GIER_GRAD_FAKTOR); // nick angle in deg |
tilt2 = (int)(IntegralRoll/GIER_GRAD_FAKTOR); // roll angle in deg |
tilt1 = (int16_t)ihypot(tilt1,tilt2); // tilt angle over all |
CosAttitude = c_cos_8192(tilt1); |
NeutralAccZ = (long)((long) (NeutralAccZ - 512) * 8192 + 4096) / CosAttitude + 512; |
if(tilt1 > 20) sucess = 0; // calibration must be within 20° Tilt angle |
if(AdjustmentMode != 0 && ACC_AltitudeControl) if((NeutralAccZ < 682 - 25) || (NeutralAccZ > 682 + 25)) { VersionInfo.HardwareError[0] |= FC_ERROR0_ACC_TOP; sucess = 0;}; |
#else |
NeutralAccZ = (int16_t)GetParamWord(PID_ACC_TOP); |
EEAR = EE_DUMMY; // Set the EEPROM Address pointer to an unused space |
#endif |
if((AdNeutralNick < 150 * 16) || (AdNeutralNick > 850 * 16)) { VersionInfo.HardwareError[0] |= FC_ERROR0_GYRO_NICK; }; |
if((AdNeutralRoll < 150 * 16) || (AdNeutralRoll > 850 * 16)) { VersionInfo.HardwareError[0] |= FC_ERROR0_GYRO_ROLL; }; |
if((AdNeutralGier < 150 * 2) || (AdNeutralGier > 850 * 2)) { VersionInfo.HardwareError[0] |= FC_ERROR0_GYRO_YAW; }; |
if((NeutralAccX < 300) || (NeutralAccX > 750)) { VersionInfo.HardwareError[0] |= FC_ERROR0_ACC_NICK; }; |
if((NeutralAccY < 300) || (NeutralAccY > 750)) { VersionInfo.HardwareError[0] |= FC_ERROR0_ACC_ROLL; }; |
if((NeutralAccZ < 512) || (NeutralAccZ > 850)) { VersionInfo.HardwareError[0] |= FC_ERROR0_ACC_TOP; }; |
if(VersionInfo.HardwareError[0]) sucess = 0; |
carefree_old = 70; |
#if (defined(__AVR_ATmega1284__) || defined(__AVR_ATmega1284P__)) |
LIBFC_HoTT_Clear(); |
ACC_AltitudeFusion(2); // initalisation |
#endif |
StartLuftdruck = Luftdruck; |
VarioMeter = 0; |
SummenHoehe = 0; Mess_Integral_Hoch = 0; |
DebugOut.Analog[28] = 0; // I2C-Counter |
CalcExpandBaroStep(); |
return(sucess); |
} |
//############################################################################ |
// Bearbeitet die Messwerte |
void Mittelwert(void) |
//############################################################################ |
{ |
static signed long tmpl,tmpl2,tmpl3,tmpl4; |
static signed int oldNick, oldRoll, d2Roll, d2Nick; |
signed long winkel_nick, winkel_roll; |
MesswertGier = (signed int) AdNeutralGier - AdWertGier; |
MesswertNick = (signed int) AdWertNickFilter / 8; |
MesswertRoll = (signed int) AdWertRollFilter / 8; |
RohMesswertNick = MesswertNick; |
RohMesswertRoll = MesswertRoll; |
// Beschleunigungssensor ++++++++++++++++++++++++++++++++++++++++++++++++ |
Mittelwert_AccNick = (Mittelwert_AccNick * 3 + ((ACC_AMPLIFY * AdWertAccNick))) / 4L; |
Mittelwert_AccRoll = (Mittelwert_AccRoll * 3 + ((ACC_AMPLIFY * AdWertAccRoll))) / 4L; |
IntegralAccNick += ACC_AMPLIFY * AdWertAccNick; |
IntegralAccRoll += ACC_AMPLIFY * AdWertAccRoll; |
NaviAccNick += AdWertAccNick; |
NaviAccRoll += AdWertAccRoll; |
NaviCntAcc++; |
IntegralAccZ += Aktuell_az - NeutralAccZ; |
//++++++++++++++++++++++++++++++++++++++++++++++++ |
// ADC einschalten |
ANALOG_ON; |
AdReady = 0; |
//++++++++++++++++++++++++++++++++++++++++++++++++ |
if(Mess_IntegralRoll > 93000L) winkel_roll = 93000L; |
else if(Mess_IntegralRoll <-93000L) winkel_roll = -93000L; |
else winkel_roll = Mess_IntegralRoll; |
if(Mess_IntegralNick > 93000L) winkel_nick = 93000L; |
else if(Mess_IntegralNick <-93000L) winkel_nick = -93000L; |
else winkel_nick = Mess_IntegralNick; |
// Gier ++++++++++++++++++++++++++++++++++++++++++++++++ |
Mess_Integral_Gier += MesswertGier; |
ErsatzKompass += MesswertGier; |
// Kopplungsanteil +++++++++++++++++++++++++++++++++++++ |
if(!Looping_Nick && !Looping_Roll && (Parameter_GlobalConfig & CFG_ACHSENKOPPLUNG_AKTIV)) |
{ |
tmpl3 = (MesswertRoll * winkel_nick) / 2048L; |
tmpl3 *= Parameter_AchsKopplung2; //65 |
tmpl3 /= 4096L; |
tmpl4 = (MesswertNick * winkel_roll) / 2048L; |
tmpl4 *= Parameter_AchsKopplung2; //65 |
tmpl4 /= 4096L; |
KopplungsteilNickRoll = tmpl3; |
KopplungsteilRollNick = tmpl4; |
tmpl4 -= tmpl3; |
ErsatzKompass += tmpl4; |
if(!Parameter_CouplingYawCorrection) Mess_Integral_Gier -= tmpl4/2; // Gier nachhelfen |
tmpl = ((MesswertGier + tmpl4) * winkel_nick) / 2048L; |
tmpl *= Parameter_AchsKopplung1; // 90 |
tmpl /= 4096L; |
tmpl2 = ((MesswertGier + tmpl4) * winkel_roll) / 2048L; |
tmpl2 *= Parameter_AchsKopplung1; |
tmpl2 /= 4096L; |
if(abs(MesswertGier) > 64) if(labs(tmpl) > 128 || labs(tmpl2) > 128) TrichterFlug = 1; |
//MesswertGier += (Parameter_CouplingYawCorrection * tmpl4) / 256; |
} |
else tmpl = tmpl2 = KopplungsteilNickRoll = KopplungsteilRollNick = 0; |
TrimRoll = tmpl - tmpl2 / 100L; |
TrimNick = -tmpl2 + tmpl / 100L; |
// Kompasswert begrenzen ++++++++++++++++++++++++++++++++++++++++++++++++ |
if(ErsatzKompass >= (360L * GIER_GRAD_FAKTOR)) ErsatzKompass -= 360L * GIER_GRAD_FAKTOR; // 360° Umschlag |
if(ErsatzKompass < 0) ErsatzKompass += 360L * GIER_GRAD_FAKTOR; |
// Roll ++++++++++++++++++++++++++++++++++++++++++++++++ |
Mess_IntegralRoll2 += MesswertRoll + TrimRoll; |
Mess_IntegralRoll += MesswertRoll + TrimRoll - LageKorrekturRoll; |
if(Mess_IntegralRoll > Umschlag180Roll) |
{ |
Mess_IntegralRoll = -(Umschlag180Roll - 25000L); |
Mess_IntegralRoll2 = Mess_IntegralRoll; |
} |
if(Mess_IntegralRoll <-Umschlag180Roll) |
{ |
Mess_IntegralRoll = (Umschlag180Roll - 25000L); |
Mess_IntegralRoll2 = Mess_IntegralRoll; |
} |
// Nick ++++++++++++++++++++++++++++++++++++++++++++++++ |
Mess_IntegralNick2 += MesswertNick + TrimNick; |
Mess_IntegralNick += MesswertNick + TrimNick - LageKorrekturNick; |
if(Mess_IntegralNick > Umschlag180Nick) |
{ |
Mess_IntegralNick = -(Umschlag180Nick - 25000L); |
Mess_IntegralNick2 = Mess_IntegralNick; |
} |
if(Mess_IntegralNick <-Umschlag180Nick) |
{ |
Mess_IntegralNick = (Umschlag180Nick - 25000L); |
Mess_IntegralNick2 = Mess_IntegralNick; |
} |
Integral_Gier = Mess_Integral_Gier; |
IntegralNick = Mess_IntegralNick; |
IntegralRoll = Mess_IntegralRoll; |
IntegralNick2 = Mess_IntegralNick2; |
IntegralRoll2 = Mess_IntegralRoll2; |
#define D_LIMIT 128 |
MesswertNick = HiResNick / 8; |
MesswertRoll = HiResRoll / 8; |
if(AdWertNick < 15) MesswertNick = -1000; if(AdWertNick < 7) MesswertNick = -2000; |
if(PlatinenVersion == 10) { if(AdWertNick > 1010) MesswertNick = +1000; if(AdWertNick > 1017) MesswertNick = +2000; } |
else { if(AdWertNick > 2000) MesswertNick = +1000; if(AdWertNick > 2015) MesswertNick = +2000; } |
if(AdWertRoll < 15) MesswertRoll = -1000; if(AdWertRoll < 7) MesswertRoll = -2000; |
if(PlatinenVersion == 10) { if(AdWertRoll > 1010) MesswertRoll = +1000; if(AdWertRoll > 1017) MesswertRoll = +2000; } |
else { if(AdWertRoll > 2000) MesswertRoll = +1000; if(AdWertRoll > 2015) MesswertRoll = +2000; } |
if(Parameter_Gyro_D) |
{ |
d2Nick = HiResNick - oldNick; |
oldNick = (oldNick + HiResNick)/2; |
if(d2Nick > D_LIMIT) d2Nick = D_LIMIT; |
else if(d2Nick < -D_LIMIT) d2Nick = -D_LIMIT; |
d2Roll = HiResRoll - oldRoll; |
oldRoll = (oldRoll + HiResRoll)/2; |
if(d2Roll > D_LIMIT) d2Roll = D_LIMIT; |
else if(d2Roll < -D_LIMIT) d2Roll = -D_LIMIT; |
MesswertNick += (d2Nick * (signed int) Parameter_Gyro_D) / 16; |
MesswertRoll += (d2Roll * (signed int) Parameter_Gyro_D) / 16; |
HiResNick += (d2Nick * (signed int) Parameter_Gyro_D); |
HiResRoll += (d2Roll * (signed int) Parameter_Gyro_D); |
} |
if(RohMesswertRoll > 0) TrimRoll += ((long) abs(KopplungsteilNickRoll) * Parameter_CouplingYawCorrection) / 64L; |
else TrimRoll -= ((long) abs(KopplungsteilNickRoll) * Parameter_CouplingYawCorrection) / 64L; |
if(RohMesswertNick > 0) TrimNick += ((long) abs(KopplungsteilRollNick) * Parameter_CouplingYawCorrection) / 64L; |
else TrimNick -= ((long) abs(KopplungsteilRollNick) * Parameter_CouplingYawCorrection) / 64L; |
if(Parameter_GlobalConfig & CFG_DREHRATEN_BEGRENZER && !Looping_Nick && !Looping_Roll) |
{ |
if(RohMesswertNick > 256) MesswertNick += 1 * (RohMesswertNick - 256); |
else if(RohMesswertNick < -256) MesswertNick += 1 * (RohMesswertNick + 256); |
if(RohMesswertRoll > 256) MesswertRoll += 1 * (RohMesswertRoll - 256); |
else if(RohMesswertRoll < -256) MesswertRoll += 1 * (RohMesswertRoll + 256); |
} |
} |
//############################################################################ |
// Senden der Motorwerte per I2C-Bus |
void SendMotorData(void) |
//############################################################################ |
{ |
unsigned char i; |
if(!MotorenEin) |
{ |
FC_StatusFlags &= ~(FC_STATUS_MOTOR_RUN | FC_STATUS_FLY); |
FC_StatusFlags2 &= ~FC_STATUS2_WAIT_FOR_TAKEOFF; |
for(i=0;i<MAX_MOTORS;i++) |
{ |
if(!PC_MotortestActive) MotorTest[i] = 0; |
Motor[i].SetPoint = MotorTest[i]; |
Motor[i].SetPointLowerBits = 0; |
/* |
Motor[i].SetPoint = MotorTest[i] / 4; // testing the high resolution |
Motor[i].SetPointLowerBits = MotorTest[i] % 4; |
*/ |
} |
if(PC_MotortestActive) PC_MotortestActive--; |
} |
else FC_StatusFlags |= FC_STATUS_MOTOR_RUN; |
if(I2C_TransferActive) |
{ |
I2C_TransferActive = 0; // enable for the next time |
} |
else |
{ |
motor_write = 0; |
I2C_Start(TWI_STATE_MOTOR_TX); //Start I2C Interrupt Mode |
} |
} |
unsigned char GetChannelValue(unsigned char ch) // gives the unsigned value of the channel |
{ |
int tmp2; |
if(ch == 0) return(0); |
tmp2 = PPM_in[ch] + 127; |
if(tmp2 > 255) tmp2 = 255; else if(tmp2 < 0) tmp2 = 0; |
return(tmp2); |
} |
//############################################################################ |
// Trägt ggf. das Poti als Parameter ein |
void ParameterZuordnung(void) |
//############################################################################ |
{ |
unsigned char tmp,i; |
for(i=0;i<8;i++) |
{ |
int tmp2; |
tmp = EE_Parameter.Kanalbelegung[K_POTI1 + i]; |
tmp2 = PPM_in[tmp] + 127; |
if(tmp2 > 255) tmp2 = 255; else if(tmp2 < 0) tmp2 = 0; |
if(tmp == 25) Poti[i] = tmp2; // 25 = WaypointEvent channel -> no filter |
else |
if(tmp2 != Poti[i]) |
{ |
Poti[i] += (tmp2 - Poti[i]) / 4; |
if(Poti[i] > tmp2) Poti[i]--; |
else Poti[i]++; |
} |
} |
CHK_POTI_MM(Parameter_Luftdruck_D,EE_Parameter.Luftdruck_D,0,100); |
CHK_POTI_MM(Parameter_Hoehe_P,EE_Parameter.Hoehe_P,0,100); |
CHK_POTI_MM(Parameter_Gyro_P,EE_Parameter.Gyro_P,10,255); |
CHK_POTI_MM(Parameter_J16Timing,EE_Parameter.J16Timing,5,255); |
CHK_POTI_MM(Parameter_J17Timing,EE_Parameter.J17Timing,5,255); |
if(EE_Parameter.Servo3 == 247) { if(PORTC & (1<<PORTC2)) Parameter_Servo3 = 140; else Parameter_Servo3 = 70;} // Out1 (J16) |
else if(EE_Parameter.Servo3 == 246) { if(PORTC & (1<<PORTC3)) Parameter_Servo3 = 140; else Parameter_Servo3 = 70;} |
else CHK_POTI_MM(Parameter_Servo3,EE_Parameter.Servo3, 24, 255); |
if(EE_Parameter.Servo4 == 247) { if(PORTC & (1<<PORTC2)) Parameter_Servo4 = 140; else Parameter_Servo4 = 70;} |
else if(EE_Parameter.Servo4 == 246) { if(PORTC & (1<<PORTC3)) Parameter_Servo4 = 140; else Parameter_Servo4 = 70;} // Out2 (J17) |
else CHK_POTI_MM(Parameter_Servo4,EE_Parameter.Servo4, 24, 255); |
CHK_POTI_MM(Parameter_Servo5,EE_Parameter.Servo5, 24, 255); |
Parameter_HoehenSchalter = GetChannelValue(EE_Parameter.HoeheChannel); |
CHK_POTI(Parameter_Hoehe_ACC_Wirkung,EE_Parameter.Hoehe_ACC_Wirkung); |
CHK_POTI(Parameter_Hoehe_GPS_Z,EE_Parameter.Hoehe_GPS_Z); |
CHK_POTI(Parameter_KompassWirkung,EE_Parameter.KompassWirkung); |
CHK_POTI(Parameter_Gyro_I,EE_Parameter.Gyro_I); |
CHK_POTI(Parameter_Gyro_D,EE_Parameter.Gyro_D); |
CHK_POTI(Parameter_Gyro_Gier_P,EE_Parameter.Gyro_Gier_P); |
CHK_POTI(Parameter_Gyro_Gier_I,EE_Parameter.Gyro_Gier_I); |
CHK_POTI(Parameter_I_Faktor,EE_Parameter.I_Faktor); |
CHK_POTI(Parameter_UserParam1,EE_Parameter.UserParam1); |
CHK_POTI(Parameter_UserParam2,EE_Parameter.UserParam2); |
CHK_POTI(Parameter_UserParam3,EE_Parameter.UserParam3); |
CHK_POTI(Parameter_UserParam4,EE_Parameter.UserParam4); |
CHK_POTI(Parameter_UserParam5,EE_Parameter.UserParam5); |
CHK_POTI(Parameter_UserParam6,EE_Parameter.UserParam6); |
CHK_POTI(Parameter_UserParam7,EE_Parameter.UserParam7); |
CHK_POTI(Parameter_UserParam8,EE_Parameter.UserParam8); |
CHK_POTI(Parameter_ServoNickControl,EE_Parameter.ServoNickControl); |
CHK_POTI(Parameter_ServoRollControl,EE_Parameter.ServoRollControl); |
CHK_POTI(Parameter_ServoNickComp,EE_Parameter.ServoNickComp); |
CHK_POTI(Parameter_ServoRollComp,EE_Parameter.ServoRollComp); |
CHK_POTI(Parameter_LoopGasLimit,EE_Parameter.LoopGasLimit); |
CHK_POTI(Parameter_AchsKopplung1,EE_Parameter.AchsKopplung1); |
CHK_POTI(Parameter_AchsKopplung2,EE_Parameter.AchsKopplung2); |
CHK_POTI(Parameter_CouplingYawCorrection,EE_Parameter.CouplingYawCorrection); |
CHK_POTI(Parameter_MaximumAltitude,EE_Parameter.MaxAltitude); |
if((NC_To_FC_MaxAltitude && NC_To_FC_MaxAltitude < Parameter_MaximumAltitude) || Parameter_MaximumAltitude == 0) Parameter_MaximumAltitude = NC_To_FC_MaxAltitude; |
Parameter_GlobalConfig = EE_Parameter.GlobalConfig; |
Parameter_ExtraConfig = EE_Parameter.ExtraConfig; |
// CHK_POTI(Parameter_AchsGegenKopplung1,EE_Parameter.AchsGegenKopplung1,0,255); |
CHK_POTI(Parameter_DynamicStability,EE_Parameter.DynamicStability); |
CHK_POTI(Parameter_ExternalControl,EE_Parameter.ExternalControl); |
Ki = 10300 / (Parameter_I_Faktor + 1); |
MAX_GAS = EE_Parameter.Gas_Max; |
MIN_GAS = EE_Parameter.Gas_Min; |
if(EE_Parameter.CareFreeChannel) |
{ |
CareFree = 1; |
if(PPM_in[EE_Parameter.CareFreeChannel] < -64) CareFree = 0; |
// if(tmp >= 248 && Poti[255 - tmp] < 50) CareFree = 0; |
if(carefree_old != CareFree) |
{ |
if(carefree_old < 3) |
{ |
#if (defined(__AVR_ATmega1284__) || defined(__AVR_ATmega1284P__)) |
if(CareFree) { beeptime = 1500; if(!SpeakHoTT) SpeakHoTT = SPEAK_CF_ON; } |
else { beeptime = 200; if(!SpeakHoTT) SpeakHoTT = SPEAK_CF_OFF; } |
#else |
if(CareFree) beeptime = 1500; |
else beeptime = 200; |
#endif |
NeueKompassRichtungMerken = 5; |
carefree_old = CareFree; |
} else carefree_old--; |
} |
if(FromNaviCtrl.CompassValue < 0 && CareFree) VersionInfo.HardwareError[0] |= FC_ERROR0_CAREFREE; //else VersionInfo.HardwareError[0] &= ~FC_ERROR0_CAREFREE; |
} |
else |
{ |
CareFree = 0; |
carefree_old = 10; |
} |
if(FromNaviCtrl.CompassValue < 0 && MotorenEin && CareFree && BeepMuster == 0xffff) // ungültiger Kompasswert |
{ |
beeptime = 15000; |
BeepMuster = 0xA400; |
CareFree = 0; |
} |
if(CareFree) { FC_StatusFlags2 |= FC_STATUS2_CAREFREE; /*if(Parameter_AchsKopplung1 < 210) Parameter_AchsKopplung1 += 30;*/} else FC_StatusFlags2 &= ~FC_STATUS2_CAREFREE; |
} |
//############################################################################ |
// |
void MotorRegler(void) |
//############################################################################ |
{ |
int pd_ergebnis_nick,pd_ergebnis_roll,tmp_int, tmp_int2; |
int GierMischanteil,GasMischanteil; |
static long sollGier = 0,tmp_long,tmp_long2; |
static long IntegralFehlerNick = 0; |
static long IntegralFehlerRoll = 0; |
static unsigned int RcLostTimer; |
static unsigned char delay_neutral = 0; |
static unsigned char delay_einschalten = 0,delay_ausschalten = 0; |
static signed char move_safety_switch = 0; |
static long ausgleichNick, ausgleichRoll; |
int IntegralNickMalFaktor,IntegralRollMalFaktor; |
unsigned char i; |
Mittelwert(); |
// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
// Gaswert ermitteln |
// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
if(!(FC_StatusFlags & (FC_STATUS_EMERGENCY_LANDING | FC_STATUS2_RC_FAILSAVE_ACTIVE))) |
{ |
if(EE_Parameter.GlobalConfig3 & CFG3_VARIO_FAILSAFE) |
{ |
if(HoverGas && HoverGas < 150 * STICK_GAIN) |
{ |
HooverGasEmergencyPercent = (HoverGas/(STICK_GAIN) * EE_Parameter.NotGas) / 100; // i.e. 80% of Hovergas |
} |
else HooverGasEmergencyPercent = 45; // default if the Hoovergas was could not calculated yet |
} else HooverGasEmergencyPercent = EE_Parameter.NotGas; |
} |
if(GasIsZeroCnt == 30000) // in that case we have RC-Lost, but the MK is probably landed |
{ |
StickGas = 0; // Hold Gas down in that case |
HooverGasEmergencyPercent = MIN_GAS; |
} |
GasMischanteil = StickGas; |
if(GasMischanteil < MIN_GAS + 10) GasMischanteil = MIN_GAS + 10; |
// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
// Empfang schlecht |
// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
if(SenderOkay < 100 && !(FC_StatusFlags2 & FC_STATUS2_RC_FAILSAVE_ACTIVE)) |
{ |
if(RcLostTimer) RcLostTimer--; |
else |
{ |
MotorenEin = 0; |
modell_fliegt = 0; |
FC_StatusFlags &= ~(FC_STATUS_EMERGENCY_LANDING | FC_STATUS_FLY); |
} |
ROT_ON; |
if(modell_fliegt > 1000 && Capacity.MinOfMaxPWM > 100) // wahrscheinlich in der Luft --> langsam absenken |
{ |
GasMischanteil = HooverGasEmergencyPercent; |
FC_StatusFlags |= FC_STATUS_EMERGENCY_LANDING; |
PPM_diff[EE_Parameter.Kanalbelegung[K_NICK]] = 0; |
PPM_diff[EE_Parameter.Kanalbelegung[K_ROLL]] = 0; |
PPM_in[EE_Parameter.Kanalbelegung[K_NICK]] = 0; |
PPM_in[EE_Parameter.Kanalbelegung[K_ROLL]] = 0; |
PPM_in[EE_Parameter.Kanalbelegung[K_GIER]] = 0; |
} |
else |
{ |
MotorenEin = 0; |
} |
} |
else |
// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
// Emfang gut |
// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
if(SenderOkay > 140) |
{ |
#if (defined(__AVR_ATmega1284__) || defined(__AVR_ATmega1284P__)) |
static unsigned int trigger = 1000; |
static unsigned char old_switch = 100; |
if(EE_Parameter.StartLandChannel && EE_Parameter.LandingSpeed) |
{ |
if(PPM_in[EE_Parameter.StartLandChannel] > 50) |
{ |
if(old_switch == 50) if(FC_StatusFlags2 & FC_STATUS2_WAIT_FOR_TAKEOFF) { FC_StatusFlags2 |= FC_STATUS2_AUTO_STARTING; SpeakHoTT = SPEAK_RISING;} |
FC_StatusFlags2 &= ~FC_STATUS2_AUTO_LANDING; |
old_switch = 150; |
} |
else |
if(PPM_in[EE_Parameter.StartLandChannel] < -50) |
{ |
if(old_switch == 150) { FC_StatusFlags2 |= FC_STATUS2_AUTO_LANDING; SpeakHoTT = SPEAK_SINKING;} |
FC_StatusFlags2 &= ~FC_STATUS2_AUTO_STARTING; |
old_switch = 50; |
} |
else |
{ |
FC_StatusFlags2 &= ~(FC_STATUS2_AUTO_STARTING | FC_STATUS2_AUTO_LANDING); |
} |
} |
#endif |
FC_StatusFlags &= ~FC_STATUS_EMERGENCY_LANDING; |
RcLostTimer = EE_Parameter.NotGasZeit * 50; |
if(GasMischanteil > 40 && MotorenEin) |
{ |
if(modell_fliegt < 0xffff) modell_fliegt++; |
} |
if((modell_fliegt < 256)) |
{ |
SummeNick = 0; |
SummeRoll = 0; |
sollGier = 0; |
Mess_Integral_Gier = 0; |
FC_StatusFlags2 |= FC_STATUS2_WAIT_FOR_TAKEOFF; |
#if (defined(__AVR_ATmega1284__) || defined(__AVR_ATmega1284P__)) |
old_switch = 100; |
#endif |
} |
else |
{ |
FC_StatusFlags |= FC_STATUS_FLY; |
if(FC_StatusFlags2 & FC_STATUS2_WAIT_FOR_TAKEOFF) |
{ |
#if (defined(__AVR_ATmega1284__) || defined(__AVR_ATmega1284P__)) |
if((NC_To_FC_Flags & NC_TO_FC_AUTOSTART || FC_StatusFlags2 & FC_STATUS2_AUTO_STARTING) && (VarioCharacter == '=') && ACC_AltitudeControl) |
{ |
FromNC_AltitudeSpeed = 80; |
FromNC_AltitudeSetpoint = 500; |
SollHoehe = 500; |
trigger = 1000; |
if(NC_To_FC_Flags & NC_TO_FC_AUTOSTART) SpeakHoTT = SPEAK_NEXT_WP; |
/* if(StartTrigger != 2) |
{ |
StartTrigger = 1; |
if(HoverGas < STICK_GAIN * 35) HoverGas = STICK_GAIN * 35; |
} |
*/ |
} |
// else FC_StatusFlags2 &= ~(FC_STATUS2_AUTO_STARTING); |
#endif |
if(HoehenWertF > 150 || HoehenWert < -350 || !(Parameter_GlobalConfig & CFG_HOEHENREGELUNG)) |
{ |
#if (defined(__AVR_ATmega1284__) || defined(__AVR_ATmega1284P__)) |
trigger = 1000; |
if(FC_StatusFlags2 & FC_STATUS2_AUTO_STARTING) { FromNC_AltitudeSpeed = 0; SollHoehe = 300;/*HoehenWertF + 100;*/} |
else SpeakHoTT = SPEAK_RISING; |
#endif |
FC_StatusFlags2 &= ~(FC_STATUS2_WAIT_FOR_TAKEOFF | FC_STATUS2_AUTO_STARTING | FC_STATUS2_AUTO_LANDING); |
} |
SummeNick = 0; |
SummeRoll = 0; |
Mess_Integral_Gier = 0; |
// sollGier = 0; |
if(modell_fliegt > 1000) modell_fliegt = 1000; // for the Hooverpoint-Estimation |
} |
else // Flying mode |
{ |
#if (defined(__AVR_ATmega1284__) || defined(__AVR_ATmega1284P__)) |
if((FC_StatusFlags2 & FC_STATUS2_AUTO_LANDING) && (VarioCharacter == 'v' || VarioCharacter == '=') && ACC_AltitudeControl) |
{ |
FromNC_AltitudeSpeed = EE_Parameter.LandingSpeed; |
FromNC_AltitudeSetpoint = -20000; |
} |
if(trigger < 1000) |
{ |
trigger++; |
SummeNick = 0; |
SummeRoll = 0; |
Mess_Integral_Gier = 0; |
SollHoehe = HoehenWertF - 300; |
if(trigger == 1000 && FC_StatusFlags2 & FC_STATUS2_AUTO_LANDING && VarioCharacter != '+') |
{ |
FC_StatusFlags2 &= ~FC_STATUS2_AUTO_LANDING; |
FC_StatusFlags2 |= FC_STATUS2_WAIT_FOR_TAKEOFF; // go back into starting state |
} |
} |
else |
if(ACC_AltitudeControl && (VarioCharacter == 'v' || VarioCharacter == '-') && HoehenWert < 1000 /*&& FromNC_AltitudeSetpoint < 0*/) |
{ |
if(Aktuell_az > 940) |
{ |
trigger = 0; |
SpeakHoTT = SPEAK_LANDING; |
}; |
} |
#endif |
} |
} // end of: modell_fliegt > 256 |
if((PPM_in[EE_Parameter.Kanalbelegung[K_GAS]] > 80) && MotorenEin == 0) |
{ |
// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
// auf Nullwerte kalibrieren |
// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
if(PPM_in[EE_Parameter.Kanalbelegung[K_GIER]] > 75) // Neutralwerte |
{ |
if(++delay_neutral > 200) // nicht sofort |
{ |
delay_neutral = 0; |
modell_fliegt = 0; |
if(PPM_in[EE_Parameter.Kanalbelegung[K_NICK]] > 70 || abs(PPM_in[EE_Parameter.Kanalbelegung[K_ROLL]]) > 70) |
{ |
unsigned char setting=1; |
if(PPM_in[EE_Parameter.Kanalbelegung[K_ROLL]] > 70 && PPM_in[EE_Parameter.Kanalbelegung[K_NICK]] < 70) setting = 1; |
if(PPM_in[EE_Parameter.Kanalbelegung[K_ROLL]] > 70 && PPM_in[EE_Parameter.Kanalbelegung[K_NICK]] > 70) setting = 2; |
if(PPM_in[EE_Parameter.Kanalbelegung[K_ROLL]] < 70 && PPM_in[EE_Parameter.Kanalbelegung[K_NICK]] > 70) setting = 3; |
if(PPM_in[EE_Parameter.Kanalbelegung[K_ROLL]] <-70 && PPM_in[EE_Parameter.Kanalbelegung[K_NICK]] > 70) setting = 4; |
if(PPM_in[EE_Parameter.Kanalbelegung[K_ROLL]] <-70 && PPM_in[EE_Parameter.Kanalbelegung[K_NICK]] < 70) setting = 5; |
SetActiveParamSet(setting); // aktiven Datensatz merken |
} |
if(abs(PPM_in[EE_Parameter.Kanalbelegung[K_ROLL]]) < 30 && PPM_in[EE_Parameter.Kanalbelegung[K_NICK]] < -70) |
{ |
WinkelOut.CalcState = 1; |
CalibrationDone = 0; |
beeptime = 1000; |
} |
else |
{ |
ParamSet_ReadFromEEProm(ActiveParamSet); |
LipoDetection(0); |
LIBFC_ReceiverInit(EE_Parameter.Receiver); |
if((Parameter_GlobalConfig & CFG_HOEHENREGELUNG)) // Höhenregelung aktiviert? |
{ |
if((MessLuftdruck > 950) || (MessLuftdruck < 750)) SucheLuftruckOffset(); |
} |
CalibrationDone = SetNeutral(1); |
ServoActive = 1; |
DDRD |=0x80; // enable J7 -> Servo signal |
#if (defined(__AVR_ATmega1284__) || defined(__AVR_ATmega1284P__)) |
if(VersionInfo.HardwareError[0]) SpeakHoTT = SPEAK_ERR_SENSOR; |
else |
if(!CalibrationDone) SpeakHoTT = SPEAK_ERR_CALIBARTION; |
else SpeakHoTT = SPEAK_CALIBRATE; |
ShowSettingNameTime = 5; // for HoTT & Jeti |
#endif |
Piep(ActiveParamSet,120); |
} |
} |
} |
else |
if(PPM_in[EE_Parameter.Kanalbelegung[K_GIER]] < -75) // ACC Neutralwerte speichern |
{ |
if(++delay_neutral > 200) // nicht sofort |
{ |
MotorenEin = 0; |
delay_neutral = 0; |
modell_fliegt = 0; |
CalibrationDone = SetNeutral(2); // store ACC values into EEPROM |
#if (defined(__AVR_ATmega1284__) || defined(__AVR_ATmega1284P__)) |
if(VersionInfo.HardwareError[0]) SpeakHoTT = SPEAK_ERR_SENSOR; |
else |
if(!CalibrationDone) SpeakHoTT = SPEAK_ERR_CALIBARTION; |
else SpeakHoTT = SPEAK_CALIBRATE; |
#endif |
Piep(ActiveParamSet,120); |
} |
} |
else delay_neutral = 0; |
} |
// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
// Gas ist unten |
// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
if(PPM_in[EE_Parameter.Kanalbelegung[K_GAS]] < -100) |
{ |
if(PPM_diff[EE_Parameter.MotorSafetySwitch & 127] > 5) move_safety_switch = 100; |
else |
if(PPM_diff[EE_Parameter.MotorSafetySwitch & 127] < -5) move_safety_switch = -100; |
// Motoren Starten |
if(!MotorenEin) |
{ |
if((((PPM_in[EE_Parameter.Kanalbelegung[K_GIER]] < -100) && ((!(EE_Parameter.GlobalConfig3 & CFG3_MOTOR_SWITCH_MODE) && PPM_in[EE_Parameter.MotorSafetySwitch] < -75) || EE_Parameter.MotorSafetySwitch == 0))) |
|| (((EE_Parameter.GlobalConfig3 & CFG3_MOTOR_SWITCH_MODE) && PPM_in[EE_Parameter.MotorSafetySwitch] > -10 && move_safety_switch == 100))) |
{ |
// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
// Einschalten |
// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
if(CalibrationDone) FC_StatusFlags |= FC_STATUS_START; |
StartLuftdruck = Luftdruck; |
HoehenWertF = 0; |
HoehenWert = 0; |
SummenHoehe = 0; |
if((PPM_in[EE_Parameter.Kanalbelegung[K_NICK]] > -100 || abs(PPM_in[EE_Parameter.Kanalbelegung[K_ROLL]]) < 100) && EE_Parameter.MotorSafetySwitch == 0) delay_einschalten = 0; |
if(++delay_einschalten > 253) |
{ |
if((abs(MesswertGier) > 32 || abs(MesswertNick) > 20) || abs(MesswertRoll) > 20) CalibrationDone = 0; // dann ist der Gyro defekt, schlecht kalibriert oder der MK dreht sich |
delay_einschalten = 0; |
if(!VersionInfo.HardwareError[0] && CalibrationDone && !NC_ErrorCode) |
{ |
modell_fliegt = 1; |
MotorenEin = 1; |
sollGier = 0; |
Mess_Integral_Gier = 0; |
Mess_Integral_Gier2 = 0; |
Mess_IntegralNick = EE_Parameter.GyroAccFaktor * (long)Mittelwert_AccNick; |
Mess_IntegralRoll = EE_Parameter.GyroAccFaktor * (long)Mittelwert_AccRoll; |
Mess_IntegralNick2 = IntegralNick; |
Mess_IntegralRoll2 = IntegralRoll; |
SummeNick = 0; |
SummeRoll = 0; |
// ControlHeading = (((int) EE_Parameter.OrientationAngle * 15 + KompassValue) % 360) / 2; |
NeueKompassRichtungMerken = 100; // 2 sekunden |
#if (defined(__AVR_ATmega1284__) || defined(__AVR_ATmega1284P__)) |
SpeakHoTT = SPEAK_STARTING; |
#endif |
} |
else |
{ |
beeptime = 1500; // indicate missing calibration |
#if (defined(__AVR_ATmega1284__) || defined(__AVR_ATmega1284P__)) |
if(!CalibrationDone) SpeakHoTT = SPEAK_ERR_CALIBARTION; |
#endif |
} |
} |
} |
else delay_einschalten = 0; |
} |
// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
// Auschalten |
// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
else // only if motors are running |
{ |
// if((PPM_in[EE_Parameter.Kanalbelegung[K_GIER]] > 75) && (PPM_in[EE_Parameter.MotorSafetySwitch] < -75 || EE_Parameter.MotorSafetySwitch == 0)) |
if((((PPM_in[EE_Parameter.Kanalbelegung[K_GIER]] > 100) && ((!(EE_Parameter.GlobalConfig3 & CFG3_MOTOR_SWITCH_MODE) && PPM_in[EE_Parameter.MotorSafetySwitch] < -75) || EE_Parameter.MotorSafetySwitch == 0))) |
|| (((EE_Parameter.GlobalConfig3 & CFG3_MOTOR_SWITCH_MODE) && PPM_in[EE_Parameter.MotorSafetySwitch] < -50 && move_safety_switch == -100))) |
{ |
if((PPM_in[EE_Parameter.Kanalbelegung[K_NICK]] > -100 || abs(PPM_in[EE_Parameter.Kanalbelegung[K_ROLL]]) < 100) && EE_Parameter.MotorSafetySwitch == 0) |
{ |
delay_ausschalten = 0; |
} |
else |
{ |
SummeNick = 0; |
SummeRoll = 0; |
StickNick = 0; |
StickRoll = 0; |
} |
if(++delay_ausschalten > 250) // nicht sofort |
{ |
MotorenEin = 0; |
delay_ausschalten = 0; |
modell_fliegt = 0; |
FC_StatusFlags2 &= ~(FC_STATUS2_WAIT_FOR_TAKEOFF | FC_STATUS2_AUTO_STARTING | FC_STATUS2_AUTO_LANDING); |
#if (defined(__AVR_ATmega1284__) || defined(__AVR_ATmega1284P__)) |
SpeakHoTT = SPEAK_MK_OFF; |
#endif |
} |
else |
if(delay_ausschalten == 100) beeptime = 3500; |
} |
else delay_ausschalten = 0; |
} |
if(GasIsZeroCnt < 1000) |
{ |
if(VarioMeter > -150) GasIsZeroCnt++; |
else if(GasIsZeroCnt) GasIsZeroCnt--; |
} |
} |
else // gas not at minimum |
{ |
move_safety_switch = 0; |
GasIsZeroCnt = 0; |
} |
} |
else // Empfang zwischen 100 und 140 -> schlecht |
{ |
if(GasIsZeroCnt >= 750) // gas-stick was down for 1.5 seconds before RC-Lost |
{ |
if((GPSInfo.HomeDistance < 40 * 10) && (HoehenWert < 15 * 100)) // and we are at the starting point -> maybe landed? |
{ |
GasIsZeroCnt = 30000; |
if(modell_fliegt > 1001) modell_fliegt = 1001; |
} |
} |
} |
// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
// neue Werte von der Funke |
// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
if(!NewPpmData-- || (FC_StatusFlags & FC_STATUS_EMERGENCY_LANDING)) |
{ |
static int stick_nick,stick_roll; |
unsigned char stick_p; |
ParameterZuordnung(); |
stick_p = EE_Parameter.Stick_P; |
stick_nick = (stick_nick * 3 + PPM_in[EE_Parameter.Kanalbelegung[K_NICK]] * stick_p) / 4; |
stick_nick += PPM_diff[EE_Parameter.Kanalbelegung[K_NICK]] * EE_Parameter.Stick_D; |
stick_roll = (stick_roll * 3 + PPM_in[EE_Parameter.Kanalbelegung[K_ROLL]] * stick_p) / 4; |
stick_roll += PPM_diff[EE_Parameter.Kanalbelegung[K_ROLL]] * EE_Parameter.Stick_D; |
// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
// CareFree und freie Wahl der vorderen Richtung |
// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
if(CareFree) |
{ |
signed int nick, roll; |
nick = stick_nick / 4; |
roll = stick_roll / 4; |
StickNick = ((FromNC_Rotate_C * nick) + (FromNC_Rotate_S * roll)) / (32 / 4); |
StickRoll = ((FromNC_Rotate_C * roll) - (FromNC_Rotate_S * nick)) / (32 / 4); |
} |
else |
{ |
FromNC_Rotate_C = sintab[EE_Parameter.OrientationAngle + 6]; |
FromNC_Rotate_S = sintab[EE_Parameter.OrientationAngle]; |
StickNick = ((FromNC_Rotate_C * stick_nick) + (FromNC_Rotate_S * stick_roll)) / 8; |
StickRoll = ((FromNC_Rotate_C * stick_roll) - (FromNC_Rotate_S * stick_nick)) / 8; |
} |
StickGier = -PPM_in[EE_Parameter.Kanalbelegung[K_GIER]]; |
if(StickGier > 4) StickGier -= 4; else |
if(StickGier < -4) StickGier += 4; else StickGier = 0; |
if(GasIsZeroCnt > 512) // About to switch - off |
{ |
StickNick = StickNick/8; |
StickRoll = StickRoll/8; |
SummeNick = 0; |
SummeRoll = 0; |
} |
else |
if(GPS_Aid_StickMultiplikator) // in that case the GPS controls stronger |
{ |
StickNick = (GPS_Aid_StickMultiplikator * (StickNick / 8)) / 16; |
StickRoll = (GPS_Aid_StickMultiplikator * (StickRoll / 8)) / 16; |
} |
StickNick -= GPS_Nick; |
StickRoll -= GPS_Roll; |
StickGas = PPM_in[EE_Parameter.Kanalbelegung[K_GAS]] + 127; |
GyroFaktor = (Parameter_Gyro_P + 10.0); |
IntegralFaktor = Parameter_Gyro_I; |
GyroFaktorGier = (Parameter_Gyro_Gier_P + 10.0); |
IntegralFaktorGier = Parameter_Gyro_Gier_I; |
//+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
//+ Analoge Steuerung per Seriell |
//+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
if(ExternControl.Config & 0x01 && Parameter_ExternalControl > 128) |
{ |
StickNick += (int) ExternControl.Nick * (int) EE_Parameter.Stick_P; |
StickRoll += (int) ExternControl.Roll * (int) EE_Parameter.Stick_P; |
StickGier += ExternControl.Gier; |
ExternHoehenValue = (int) ExternControl.Hight * (int)EE_Parameter.Hoehe_Verstaerkung; |
if(ExternControl.Gas < StickGas) StickGas = ExternControl.Gas; |
} |
if(StickGas < 0) StickGas = 0; |
if(Parameter_GlobalConfig & CFG_HEADING_HOLD) IntegralFaktor = 0; |
if(abs(StickNick/STICK_GAIN) > MaxStickNick) |
{ |
MaxStickNick = abs(StickNick)/STICK_GAIN; |
if(MaxStickNick > 100) MaxStickNick = 100; |
} |
else MaxStickNick--; |
if(abs(StickRoll/STICK_GAIN) > MaxStickRoll) |
{ |
MaxStickRoll = abs(StickRoll)/STICK_GAIN; |
if(MaxStickRoll > 100) MaxStickRoll = 100; |
} |
else MaxStickRoll--; |
if(FC_StatusFlags & FC_STATUS_EMERGENCY_LANDING) {MaxStickNick = 0; MaxStickRoll = 0;} |
// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
// Looping? |
// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
if((PPM_in[EE_Parameter.Kanalbelegung[K_ROLL]] > EE_Parameter.LoopThreshold) && EE_Parameter.BitConfig & CFG_LOOP_LINKS) Looping_Links = 1; |
else |
{ |
{ |
if((PPM_in[EE_Parameter.Kanalbelegung[K_ROLL]] < (EE_Parameter.LoopThreshold - EE_Parameter.LoopHysterese))) Looping_Links = 0; |
} |
} |
if((PPM_in[EE_Parameter.Kanalbelegung[K_ROLL]] < -EE_Parameter.LoopThreshold) && EE_Parameter.BitConfig & CFG_LOOP_RECHTS) Looping_Rechts = 1; |
else |
{ |
if(Looping_Rechts) // Hysterese |
{ |
if(PPM_in[EE_Parameter.Kanalbelegung[K_ROLL]] > -(EE_Parameter.LoopThreshold - EE_Parameter.LoopHysterese)) Looping_Rechts = 0; |
} |
} |
if((PPM_in[EE_Parameter.Kanalbelegung[K_NICK]] > EE_Parameter.LoopThreshold) && EE_Parameter.BitConfig & CFG_LOOP_OBEN) Looping_Oben = 1; |
else |
{ |
if(Looping_Oben) // Hysterese |
{ |
if((PPM_in[EE_Parameter.Kanalbelegung[K_NICK]] < (EE_Parameter.LoopThreshold - EE_Parameter.LoopHysterese))) Looping_Oben = 0; |
} |
} |
if((PPM_in[EE_Parameter.Kanalbelegung[K_NICK]] < -EE_Parameter.LoopThreshold) && EE_Parameter.BitConfig & CFG_LOOP_UNTEN) Looping_Unten = 1; |
else |
{ |
if(Looping_Unten) // Hysterese |
{ |
if(PPM_in[EE_Parameter.Kanalbelegung[K_NICK]] > -(EE_Parameter.LoopThreshold - EE_Parameter.LoopHysterese)) Looping_Unten = 0; |
} |
} |
if(Looping_Links || Looping_Rechts) Looping_Roll = 1; else Looping_Roll = 0; |
if(Looping_Oben || Looping_Unten) { Looping_Nick = 1; Looping_Roll = 0; Looping_Links = 0; Looping_Rechts = 0;} else Looping_Nick = 0; |
} // Ende neue Funken-Werte |
if(Looping_Roll || Looping_Nick) |
{ |
if(GasMischanteil > EE_Parameter.LoopGasLimit) GasMischanteil = EE_Parameter.LoopGasLimit; |
TrichterFlug = 1; |
} |
// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
// Bei Empfangsausfall im Flug |
// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
if(FC_StatusFlags2 & FC_STATUS2_RC_FAILSAVE_ACTIVE) |
{ |
StickNick = -GPS_Nick; |
StickRoll = -GPS_Roll; |
StickGas = StickGasHover; |
Parameter_GlobalConfig &= ~(CFG_HEADING_HOLD | CFG_DREHRATEN_BEGRENZER); |
Parameter_GlobalConfig |= CFG_HOEHENREGELUNG | CFG_ACHSENKOPPLUNG_AKTIV | CFG_KOMPASS_AKTIV | CFG_GPS_AKTIV | CFG_HOEHEN_SCHALTER | CFG_GPS_AKTIV; |
Parameter_ExtraConfig &= ~(CFG2_HEIGHT_LIMIT | CFG_LEARNABLE_CAREFREE | CFG2_VARIO_BEEP); |
Parameter_HoehenSchalter = 200; // switch on |
} |
else |
if(FC_StatusFlags & FC_STATUS_EMERGENCY_LANDING) |
{ |
StickGier = 0; |
StickNick = 0; |
StickRoll = 0; |
GyroFaktor = 90; |
IntegralFaktor = 120; |
GyroFaktorGier = 90; |
IntegralFaktorGier = 120; |
Looping_Roll = 0; |
Looping_Nick = 0; |
} |
// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
// Integrale auf ACC-Signal abgleichen |
// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
#define ABGLEICH_ANZAHL 256L |
MittelIntegralNick += IntegralNick; // Für die Mittelwertbildung aufsummieren |
MittelIntegralRoll += IntegralRoll; |
MittelIntegralNick2 += IntegralNick2; |
MittelIntegralRoll2 += IntegralRoll2; |
if(Looping_Nick || Looping_Roll) |
{ |
IntegralAccNick = 0; |
IntegralAccRoll = 0; |
MittelIntegralNick = 0; |
MittelIntegralRoll = 0; |
MittelIntegralNick2 = 0; |
MittelIntegralRoll2 = 0; |
Mess_IntegralNick2 = Mess_IntegralNick; |
Mess_IntegralRoll2 = Mess_IntegralRoll; |
ZaehlMessungen = 0; |
LageKorrekturNick = 0; |
LageKorrekturRoll = 0; |
} |
// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
if(!Looping_Nick && !Looping_Roll && (Aktuell_az > 512 || MotorenEin)) |
{ |
long tmp_long, tmp_long2; |
if(FromNaviCtrl_Value.Kalman_K > 0 /*&& !TrichterFlug*/) |
{ |
tmp_long = (long)(IntegralNick / EE_Parameter.GyroAccFaktor - (long)(Mittelwert_AccNick - FromNaviCtrl.AccErrorN)); |
tmp_long2 = (long)(IntegralRoll / EE_Parameter.GyroAccFaktor - (long)(Mittelwert_AccRoll - FromNaviCtrl.AccErrorR)); |
tmp_long = (tmp_long * FromNaviCtrl_Value.Kalman_K) / (32 * 16); |
tmp_long2 = (tmp_long2 * FromNaviCtrl_Value.Kalman_K) / (32 * 16); |
if((MaxStickNick > 64) || (MaxStickRoll > 64)) |
{ |
tmp_long /= 2; |
tmp_long2 /= 2; |
} |
if(tmp_long > (long) FromNaviCtrl_Value.Kalman_MaxFusion) tmp_long = (long) FromNaviCtrl_Value.Kalman_MaxFusion; |
if(tmp_long < (long)-FromNaviCtrl_Value.Kalman_MaxFusion) tmp_long = (long)-FromNaviCtrl_Value.Kalman_MaxFusion; |
if(tmp_long2 > (long) FromNaviCtrl_Value.Kalman_MaxFusion) tmp_long2 = (long) FromNaviCtrl_Value.Kalman_MaxFusion; |
if(tmp_long2 < (long)-FromNaviCtrl_Value.Kalman_MaxFusion) tmp_long2 = (long)-FromNaviCtrl_Value.Kalman_MaxFusion; |
} |
else |
{ |
tmp_long = (long)(IntegralNick / EE_Parameter.GyroAccFaktor - (long)Mittelwert_AccNick); |
tmp_long2 = (long)(IntegralRoll / EE_Parameter.GyroAccFaktor - (long)Mittelwert_AccRoll); |
tmp_long /= 16; |
tmp_long2 /= 16; |
if((MaxStickNick > 64) || (MaxStickRoll > 64)) |
{ |
tmp_long /= 3; |
tmp_long2 /= 3; |
} |
if(abs(PPM_in[EE_Parameter.Kanalbelegung[K_GIER]]) > 25) |
{ |
tmp_long /= 3; |
tmp_long2 /= 3; |
} |
KompassFusion = 25; |
#define AUSGLEICH 32 |
if(tmp_long > AUSGLEICH) tmp_long = AUSGLEICH; |
if(tmp_long < -AUSGLEICH) tmp_long =-AUSGLEICH; |
if(tmp_long2 > AUSGLEICH) tmp_long2 = AUSGLEICH; |
if(tmp_long2 <-AUSGLEICH) tmp_long2 =-AUSGLEICH; |
} |
Mess_IntegralNick -= tmp_long; |
Mess_IntegralRoll -= tmp_long2; |
} |
// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
if(ZaehlMessungen >= ABGLEICH_ANZAHL) |
{ |
static int cnt = 0; |
static char last_n_p,last_n_n,last_r_p,last_r_n; |
static long MittelIntegralNick_Alt,MittelIntegralRoll_Alt; |
if(!Looping_Nick && !Looping_Roll && !TrichterFlug && EE_Parameter.Driftkomp) |
{ |
MittelIntegralNick /= ABGLEICH_ANZAHL; |
MittelIntegralRoll /= ABGLEICH_ANZAHL; |
IntegralAccNick = (EE_Parameter.GyroAccFaktor * IntegralAccNick) / ABGLEICH_ANZAHL; |
IntegralAccRoll = (EE_Parameter.GyroAccFaktor * IntegralAccRoll) / ABGLEICH_ANZAHL; |
IntegralAccZ = IntegralAccZ / ABGLEICH_ANZAHL; |
#define MAX_I 0 |
// Nick ++++++++++++++++++++++++++++++++++++++++++++++++ |
IntegralFehlerNick = (long)(MittelIntegralNick - (long)IntegralAccNick); |
ausgleichNick = IntegralFehlerNick / EE_Parameter.GyroAccAbgleich; |
// Roll ++++++++++++++++++++++++++++++++++++++++++++++++ |
IntegralFehlerRoll = (long)(MittelIntegralRoll - (long)IntegralAccRoll); |
ausgleichRoll = IntegralFehlerRoll / EE_Parameter.GyroAccAbgleich; |
LageKorrekturNick = ausgleichNick / ABGLEICH_ANZAHL; |
LageKorrekturRoll = ausgleichRoll / ABGLEICH_ANZAHL; |
if(((MaxStickNick > 64) || (MaxStickRoll > 64) || (abs(PPM_in[EE_Parameter.Kanalbelegung[K_GIER]]) > 25)) && (FromNaviCtrl_Value.Kalman_K == -1)) |
{ |
LageKorrekturNick /= 2; |
LageKorrekturRoll /= 2; |
} |
// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
// Gyro-Drift ermitteln |
// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
MittelIntegralNick2 /= ABGLEICH_ANZAHL; |
MittelIntegralRoll2 /= ABGLEICH_ANZAHL; |
tmp_long = IntegralNick2 - IntegralNick; |
tmp_long2 = IntegralRoll2 - IntegralRoll; |
IntegralFehlerNick = tmp_long; |
IntegralFehlerRoll = tmp_long2; |
Mess_IntegralNick2 -= IntegralFehlerNick; |
Mess_IntegralRoll2 -= IntegralFehlerRoll; |
if(EE_Parameter.Driftkomp) |
{ |
if(GierGyroFehler > ABGLEICH_ANZAHL/2) { AdNeutralGier++; } |
if(GierGyroFehler <-ABGLEICH_ANZAHL/2) { AdNeutralGier--; } |
} |
GierGyroFehler = 0; |
#define FEHLER_LIMIT (ABGLEICH_ANZAHL / 2) |
#define FEHLER_LIMIT1 (ABGLEICH_ANZAHL * 2) //4 |
#define FEHLER_LIMIT2 (ABGLEICH_ANZAHL * 16) //16 |
#define BEWEGUNGS_LIMIT 20000 |
// Nick +++++++++++++++++++++++++++++++++++++++++++++++++ |
cnt = 1;// + labs(IntegralFehlerNick) / 4096; |
if(labs(IntegralFehlerNick) > FEHLER_LIMIT1) cnt = 4; |
if(labs(MittelIntegralNick_Alt - MittelIntegralNick) < BEWEGUNGS_LIMIT || (FromNaviCtrl_Value.Kalman_MaxDrift > 3*8)) |
{ |
if(IntegralFehlerNick > FEHLER_LIMIT2) |
{ |
if(last_n_p) |
{ |
cnt += labs(IntegralFehlerNick) / (FEHLER_LIMIT2 / 8); |
ausgleichNick = IntegralFehlerNick / 8; |
if(ausgleichNick > 5000) ausgleichNick = 5000; |
LageKorrekturNick += ausgleichNick / ABGLEICH_ANZAHL; |
} |
else last_n_p = 1; |
} else last_n_p = 0; |
if(IntegralFehlerNick < -FEHLER_LIMIT2) |
{ |
if(last_n_n) |
{ |
cnt += labs(IntegralFehlerNick) / (FEHLER_LIMIT2 / 8); |
ausgleichNick = IntegralFehlerNick / 8; |
if(ausgleichNick < -5000) ausgleichNick = -5000; |
LageKorrekturNick += ausgleichNick / ABGLEICH_ANZAHL; |
} |
else last_n_n = 1; |
} else last_n_n = 0; |
} |
else |
{ |
cnt = 0; |
KompassSignalSchlecht = 100; |
} |
if(cnt > EE_Parameter.Driftkomp) cnt = EE_Parameter.Driftkomp; |
if(FromNaviCtrl_Value.Kalman_MaxDrift) if(cnt > FromNaviCtrl_Value.Kalman_MaxDrift) cnt = FromNaviCtrl_Value.Kalman_MaxDrift; |
if(IntegralFehlerNick > FEHLER_LIMIT) AdNeutralNick += cnt; |
if(IntegralFehlerNick < -FEHLER_LIMIT) AdNeutralNick -= cnt; |
// Roll +++++++++++++++++++++++++++++++++++++++++++++++++ |
cnt = 1;// + labs(IntegralFehlerRoll) / 4096; |
if(labs(IntegralFehlerRoll) > FEHLER_LIMIT1) cnt = 4; |
if(labs(MittelIntegralRoll_Alt - MittelIntegralRoll) < BEWEGUNGS_LIMIT || (FromNaviCtrl_Value.Kalman_MaxDrift > 3*8)) |
{ |
if(IntegralFehlerRoll > FEHLER_LIMIT2) |
{ |
if(last_r_p) |
{ |
cnt += labs(IntegralFehlerRoll) / (FEHLER_LIMIT2 / 8); |
ausgleichRoll = IntegralFehlerRoll / 8; |
if(ausgleichRoll > 5000) ausgleichRoll = 5000; |
LageKorrekturRoll += ausgleichRoll / ABGLEICH_ANZAHL; |
} |
else last_r_p = 1; |
} else last_r_p = 0; |
if(IntegralFehlerRoll < -FEHLER_LIMIT2) |
{ |
if(last_r_n) |
{ |
cnt += labs(IntegralFehlerRoll) / (FEHLER_LIMIT2 / 8); |
ausgleichRoll = IntegralFehlerRoll / 8; |
if(ausgleichRoll < -5000) ausgleichRoll = -5000; |
LageKorrekturRoll += ausgleichRoll / ABGLEICH_ANZAHL; |
} |
else last_r_n = 1; |
} else last_r_n = 0; |
} else |
{ |
cnt = 0; |
KompassSignalSchlecht = 100; |
} |
if(cnt > EE_Parameter.Driftkomp) cnt = EE_Parameter.Driftkomp; |
if(FromNaviCtrl_Value.Kalman_MaxDrift) if(cnt > FromNaviCtrl_Value.Kalman_MaxDrift) cnt = FromNaviCtrl_Value.Kalman_MaxDrift; |
if(IntegralFehlerRoll > FEHLER_LIMIT) AdNeutralRoll += cnt; |
if(IntegralFehlerRoll < -FEHLER_LIMIT) AdNeutralRoll -= cnt; |
} |
else |
{ |
LageKorrekturRoll = 0; |
LageKorrekturNick = 0; |
TrichterFlug = 0; |
} |
if(!IntegralFaktor) { LageKorrekturRoll = 0; LageKorrekturNick = 0;} // z.B. bei HH |
// +++++++++++++++++++++++++++++++++++++++++++++++++++++ |
MittelIntegralNick_Alt = MittelIntegralNick; |
MittelIntegralRoll_Alt = MittelIntegralRoll; |
// +++++++++++++++++++++++++++++++++++++++++++++++++++++ |
IntegralAccNick = 0; |
IntegralAccRoll = 0; |
IntegralAccZ = 0; |
MittelIntegralNick = 0; |
MittelIntegralRoll = 0; |
MittelIntegralNick2 = 0; |
MittelIntegralRoll2 = 0; |
ZaehlMessungen = 0; |
} // ZaehlMessungen >= ABGLEICH_ANZAHL |
// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
// Gieren |
// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
if(abs(StickGier) > 3) // war 15 |
{ |
// KompassSignalSchlecht = 1000; |
if(!(Parameter_GlobalConfig & CFG_KOMPASS_FIX)) |
{ |
NeueKompassRichtungMerken = 50; // eine Sekunde zum Einloggen |
}; |
} |
tmp_int = (long) EE_Parameter.StickGier_P * ((long)StickGier * abs(StickGier)) / 512L; // expo y = ax + bx² |
tmp_int += (EE_Parameter.StickGier_P * StickGier) / 4; |
if(GasIsZeroCnt > 512) tmp_int = 0; // disable Yawing when Gas-Stick is to Zero |
tmp_int += CompassGierSetpoint; |
sollGier = tmp_int; |
Mess_Integral_Gier -= tmp_int; |
if(Mess_Integral_Gier > 50000) Mess_Integral_Gier = 50000; // begrenzen |
if(Mess_Integral_Gier <-50000) Mess_Integral_Gier =-50000; |
// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
// Kompass |
// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
if(KompassValue >= 0 && (Parameter_GlobalConfig & CFG_KOMPASS_AKTIV)) |
{ |
if(CalculateCompassTimer-- == 1) |
{ |
int w,v,r,fehler,korrektur; // wird von der SPI-Routine auf 1 gesetzt |
CalculateCompassTimer = 13; // falls keine Navi-Daten |
// max. Korrekturwert schätzen |
w = abs(IntegralNick /512); // mit zunehmender Neigung den Einfluss drosseln |
v = abs(IntegralRoll /512); |
if(v > w) w = v; // grösste Neigung ermitteln |
// korrektur = w / 4 + 1; |
korrektur = w / 8 + 2; |
ErsatzKompassInGrad = ErsatzKompass/GIER_GRAD_FAKTOR; |
// Kompassfehlerwert bestimmen |
fehler = ((540 + KompassValue - ErsatzKompassInGrad) % 360) - 180; |
// GIER_GRAD_FAKTOR ist ca. 1200 |
// Kompasswert einloggen |
if(KompassSignalSchlecht) KompassSignalSchlecht--; |
else |
if(w < 25) |
{ |
GierGyroFehler += fehler; |
if(NeueKompassRichtungMerken) |
{ |
if(--NeueKompassRichtungMerken == 0) |
{ |
KompassSollWert = ErsatzKompassInGrad; |
} |
} |
} |
// Kompass fusionieren |
if(!KompassSignalSchlecht) ErsatzKompass += (fehler * KompassFusion) / korrektur; |
// MK Gieren |
if(!NeueKompassRichtungMerken) |
{ |
r = ((540 + (KompassSollWert - ErsatzKompassInGrad)) % 360) - 180; |
v = r * (Parameter_KompassWirkung/2); // nach Kompass ausrichten |
CompassGierSetpoint = v / 16; |
} |
else CompassGierSetpoint = 0; |
} // CalculateCompassTimer |
} |
else CompassGierSetpoint = 0; |
//DebugOut.Analog[16] = KompassFusion; |
// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
// Drehgeschwindigkeit und -winkel zu einem Istwert zusammenfassen |
// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
if(TrichterFlug) { SummeRoll = 0; SummeNick = 0;}; |
if(!Looping_Nick) IntegralNickMalFaktor = (IntegralNick * IntegralFaktor) / (44000 / STICK_GAIN); else IntegralNickMalFaktor = 0; |
if(!Looping_Roll) IntegralRollMalFaktor = (IntegralRoll * IntegralFaktor) / (44000 / STICK_GAIN); else IntegralRollMalFaktor = 0; |
#define TRIM_MAX 200 |
if(TrimNick > TRIM_MAX) TrimNick = TRIM_MAX; else if(TrimNick <-TRIM_MAX) TrimNick =-TRIM_MAX; |
if(TrimRoll > TRIM_MAX) TrimRoll = TRIM_MAX; else if(TrimRoll <-TRIM_MAX) TrimRoll =-TRIM_MAX; |
MesswertNick = IntegralNickMalFaktor + (long)((long)MesswertNick * GyroFaktor + (long)TrimNick * 128L) / (256L / STICK_GAIN); |
MesswertRoll = IntegralRollMalFaktor + (long)((long)MesswertRoll * GyroFaktor + (long)TrimRoll * 128L) / (256L / STICK_GAIN); |
MesswertGier = (long)(MesswertGier * 2 * (long)GyroFaktorGier) / (256L / STICK_GAIN) + (long)(Integral_Gier * IntegralFaktorGier) / (2 * (44000 / STICK_GAIN)); |
// Maximalwerte abfangen |
#define MAX_SENSOR (4096) |
if(MesswertNick > MAX_SENSOR) MesswertNick = MAX_SENSOR; |
if(MesswertNick < -MAX_SENSOR) MesswertNick = -MAX_SENSOR; |
if(MesswertRoll > MAX_SENSOR) MesswertRoll = MAX_SENSOR; |
if(MesswertRoll < -MAX_SENSOR) MesswertRoll = -MAX_SENSOR; |
if(MesswertGier > MAX_SENSOR) MesswertGier = MAX_SENSOR; |
if(MesswertGier < -MAX_SENSOR) MesswertGier = -MAX_SENSOR; |
// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
// Undervoltage |
// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
if(!(FC_StatusFlags & FC_STATUS_LOWBAT)) |
{ |
GasMischanteil = ((unsigned int)GasMischanteil * BattLowVoltageWarning) / UBat; // Gas auf das aktuelle Spannungvieveau beziehen |
} |
// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
// Auto-Landing |
// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
#if (defined(__AVR_ATmega1284__) || defined(__AVR_ATmega1284P__)) |
static unsigned char slower; |
if(!slower--) |
{ |
static unsigned int u_filter = 0; |
if(!u_filter) u_filter = UBat; |
if(UBat > u_filter) u_filter++; else |
if(UBat < u_filter) u_filter--; |
slower = 100; // 5Hz |
// if(FromNC_AltitudeSetpoint >= 0) hysteresis *= 2; |
if(u_filter < EE_Parameter.AutoLandingVoltage) |
{ |
LowVoltageLandingActive = 10; // 2 sek |
} |
else if(u_filter > EE_Parameter.AutoLandingVoltage + LipoCells && LowVoltageLandingActive) LowVoltageLandingActive--; |
} |
if(LowVoltageLandingActive && FromNC_AltitudeSetpoint >= 0) |
{ |
FromNC_AltitudeSpeed = EE_Parameter.LandingSpeed; |
FromNC_AltitudeSetpoint = -20000; |
} |
#endif |
//DebugOut.Analog[16] = StickGasMiddle; |
// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
// Höhenregelung |
// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
GasMischanteil *= STICK_GAIN; |
// if height control is activated |
if((Parameter_GlobalConfig & CFG_HOEHENREGELUNG) && !(Looping_Roll || Looping_Nick) && !(VersionInfo.HardwareError[0] & 0x7F)) // Höhenregelung |
{ |
#define HOVER_GAS_AVERAGE 16384L // 16384 * 2ms = 32s averaging |
#define HC_GAS_AVERAGE 4 // 4 * 2ms= 8ms averaging |
int HCGas, GasReduction = 0; |
static int HeightTrimming = 0; // rate for change of height setpoint |
static int HeightDeviation = 0, FilterHCGas = 0; |
static unsigned long HoverGasFilter = 0; |
static unsigned char delay = 100, BaroAtUpperLimit = 0, BaroAtLowerLimit = 0; |
// Expand the measurement |
// measurement of air pressure close to upper limit and no overflow in correction of the new OCR0A value occurs |
if(!BaroExpandActive) |
{ |
if(MessLuftdruck > 920) |
{ // increase offset |
if(OCR0A < (255 - OPA_OFFSET_STEP)) |
{ |
ExpandBaro -= 1; |
OCR0A = DruckOffsetSetting - OPA_OFFSET_STEP * ExpandBaro; // increase offset to shift ADC down |
OCR0B = 255 - OCR0A; |
beeptime = 300; |
BaroExpandActive = 350; |
CalcExpandBaroStep(); |
} |
else |
{ |
BaroAtLowerLimit = 1; |
} |
} |
// measurement of air pressure close to lower limit and |
else |
if(MessLuftdruck < 100) |
{ // decrease offset |
if(OCR0A > OPA_OFFSET_STEP) |
{ |
ExpandBaro += 1; |
OCR0A = DruckOffsetSetting - OPA_OFFSET_STEP * ExpandBaro; // decrease offset to shift ADC up |
OCR0B = 255 - OCR0A; |
beeptime = 300; |
BaroExpandActive = 350; |
CalcExpandBaroStep(); |
} |
else |
{ |
BaroAtUpperLimit = 1; |
} |
} |
else |
{ |
BaroAtUpperLimit = 0; |
BaroAtLowerLimit = 0; |
} |
} |
else // delay, because of expanding the Baro-Range |
{ |
// now clear the D-values |
VarioMeter = 0; |
#if (defined(__AVR_ATmega1284__) || defined(__AVR_ATmega1284P__)) |
if(ACC_AltitudeControl) ACC_AltitudeFusion(1); // init |
else SummenHoehe = HoehenWert * SM_FILTER; |
#else |
SummenHoehe = HoehenWert * SM_FILTER; |
#endif |
BaroExpandActive--; |
} |
// if height control is activated by an rc channel |
if(Parameter_GlobalConfig & CFG_HOEHEN_SCHALTER) // Regler wird über Schalter gesteuert |
{ // check if parameter is less than activation threshold |
if(Parameter_HoehenSchalter < 50) // for 3 or 2-state switch height control is disabled in lowest position |
{ //height control not active |
if(!delay--) |
{ |
#if (defined(__AVR_ATmega1284__) || defined(__AVR_ATmega1284P__)) |
if(!SpeakHoTT && HoehenReglerAktiv) SpeakHoTT = SPEAK_ALTITUDE_OFF; |
#endif |
HoehenReglerAktiv = 0; // disable height control |
SollHoehe = HoehenWert; // update SetPoint with current reading |
delay = 1; |
} |
} |
else |
if(Parameter_HoehenSchalter > 70) |
{ //height control is activated |
#if (defined(__AVR_ATmega1284__) || defined(__AVR_ATmega1284P__)) |
if(!SpeakHoTT && !HoehenReglerAktiv) SpeakHoTT = SPEAK_ALTITUDE_ON; |
#endif |
delay = 200; |
HoehenReglerAktiv = 1; // enable height control |
} |
} |
else // no switchable height control |
{ |
SollHoehe = ((int16_t) ExternHoehenValue + (int16_t) Parameter_HoehenSchalter) * (int)EE_Parameter.Hoehe_Verstaerkung; |
HoehenReglerAktiv = 1; |
} |
// calculate cos of nick and roll angle used for projection of the vertical hoover gas |
tmp_int = (int)(IntegralNick/GIER_GRAD_FAKTOR); // nick angle in deg |
tmp_int2 = (int)(IntegralRoll/GIER_GRAD_FAKTOR); // roll angle in deg |
CosAttitude = (int16_t)ihypot(tmp_int, tmp_int2); // phytagoras gives effective attitude angle in deg |
LIMIT_MAX(CosAttitude, 60); // limit effective attitude angle |
CosAttitude = c_cos_8192(CosAttitude); // cos of actual attitude |
VarioCharacter = ' '; |
AltitudeSetpointTrimming = 0; |
if(HoehenReglerAktiv && !(FC_StatusFlags & FC_STATUS_EMERGENCY_LANDING)) |
{ |
// Holger original version |
// start of height control algorithm |
// the height control is only an attenuation of the actual gas stick. |
// I.e. it will work only if the gas stick is higher than the hover gas |
// and the hover height will be allways larger than height setpoint. |
FC_StatusFlags2 |= FC_STATUS2_ALTITUDE_CONTROL; |
if((Parameter_ExtraConfig & CFG2_HEIGHT_LIMIT) || !(Parameter_GlobalConfig & CFG_HOEHEN_SCHALTER)) // Regler wird über Schalter gesteuert) |
{ // old version |
HCGas = GasMischanteil; // take current stick gas as neutral point for the height control |
HeightTrimming = 0; |
AltitudeSetpointTrimming = 0; |
// set both flags to indicate no vario mode |
FC_StatusFlags |= (FC_STATUS_VARIO_TRIM_UP|FC_STATUS_VARIO_TRIM_DOWN); |
} |
else |
{ |
// alternative height control |
// PD-Control with respect to hoover point |
// the thrust loss out of horizontal attitude is compensated |
// the setpoint will be fine adjusted with the gas stick position |
if(/*1 || */FC_StatusFlags & FC_STATUS_FLY) // trim setpoint only when flying |
{ // gas stick is above hoover point |
if(StickGas > (StickGasHover + HEIGHT_CONTROL_STICKTHRESHOLD) && !BaroAtUpperLimit) |
{ |
if(FC_StatusFlags & FC_STATUS_VARIO_TRIM_DOWN) |
{ |
FC_StatusFlags &= ~FC_STATUS_VARIO_TRIM_DOWN; |
SollHoehe = HoehenWertF; // update setpoint to current heigth |
} |
// Limit the maximum Altitude |
if(Parameter_MaximumAltitude && (SollHoehe/100 > Parameter_MaximumAltitude)) |
{ |
AltitudeSetpointTrimming = 0; |
#if (defined(__AVR_ATmega1284__) || defined(__AVR_ATmega1284P__)) |
if(!SpeakHoTT && HoehenWert/95 > Parameter_MaximumAltitude) SpeakHoTT = SPEAK_MAX_ALTITUD; |
#endif |
VarioCharacter = '='; |
} |
else |
{ |
if(HeightDeviation > 20) SollHoehe = HoehenWertF; // update setpoint to current heigth |
FC_StatusFlags |= FC_STATUS_VARIO_TRIM_UP; |
AltitudeSetpointTrimming = abs(StickGas - (StickGasHover + HEIGHT_CONTROL_STICKTHRESHOLD)); |
if(LowVoltageLandingActive) AltitudeSetpointTrimming /= 3; // only 33% rising |
VarioCharacter = '+'; |
} |
WaypointTrimming = 0; |
} // gas stick is below hoover point |
else if(StickGas < (StickGasHover - HEIGHT_CONTROL_STICKTHRESHOLD) && !BaroAtLowerLimit ) // Minus |
{ |
if(FC_StatusFlags & FC_STATUS_VARIO_TRIM_UP) |
{ |
FC_StatusFlags &= ~FC_STATUS_VARIO_TRIM_UP; |
SollHoehe = HoehenWertF; // update setpoint to current heigth |
} |
FC_StatusFlags |= FC_STATUS_VARIO_TRIM_DOWN; |
AltitudeSetpointTrimming = -abs(StickGas - (StickGasHover - HEIGHT_CONTROL_STICKTHRESHOLD)); |
VarioCharacter = '-'; |
WaypointTrimming = 0; |
} |
else // Gas Stick in Hover Range |
{ |
VarioCharacter = '='; |
if(FromNC_AltitudeSpeed && FromNC_AltitudeSetpoint > SollHoehe) // von NC gesteuert -> Steigen |
{ |
FC_StatusFlags |= FC_STATUS_VARIO_TRIM_UP; |
AltitudeSetpointTrimming = FromNC_AltitudeSpeed; |
//HeightTrimming += FromNC_AltitudeSpeed; |
WaypointTrimming = 10; |
VarioCharacter = '^'; |
if(FC_StatusFlags & FC_STATUS_VARIO_TRIM_DOWN) // changed from sinking to rising |
{ |
FC_StatusFlags &= ~FC_STATUS_VARIO_TRIM_DOWN; |
SollHoehe = HoehenWertF; // update setpoint to current heigth |
} |
} |
else |
if(FromNC_AltitudeSpeed && FromNC_AltitudeSetpoint < SollHoehe) // von NC gesteuert -> sinken |
{ |
FC_StatusFlags |= FC_STATUS_VARIO_TRIM_DOWN; |
AltitudeSetpointTrimming = -FromNC_AltitudeSpeed; |
//HeightTrimming -= FromNC_AltitudeSpeed; |
WaypointTrimming = -10; |
VarioCharacter = 'v'; |
if(FC_StatusFlags & FC_STATUS_VARIO_TRIM_UP) // changed from rising to sinking |
{ |
FC_StatusFlags &= ~FC_STATUS_VARIO_TRIM_UP; |
SollHoehe = HoehenWertF; // update setpoint to current heigth |
} |
} |
else |
if(FC_StatusFlags & (FC_STATUS_VARIO_TRIM_UP|FC_STATUS_VARIO_TRIM_DOWN)) |
{ |
if(!WaypointTrimming) LIMIT_MIN_MAX(SollHoehe, (HoehenWertF-200), (HoehenWertF+200)) // max. 2m Unterschied |
else WaypointTrimming = 0; |
FC_StatusFlags &= ~(FC_STATUS_VARIO_TRIM_UP|FC_STATUS_VARIO_TRIM_DOWN); |
HeightTrimming = 0; |
if(Parameter_ExtraConfig & CFG2_VARIO_BEEP) beeptime = 500; |
if(!StartTrigger && HoehenWert > 50) |
{ |
StartTrigger = 1; |
} |
} |
} |
// Trim height set point |
HeightTrimming += AltitudeSetpointTrimming; |
if(abs(HeightTrimming) > 500) // bei Waypoint-Flug ist das ca. die 500Hz |
{ |
if(WaypointTrimming) |
{ |
if(abs(FromNC_AltitudeSetpoint - SollHoehe) < 10) SollHoehe = FromNC_AltitudeSetpoint; |
else SollHoehe += WaypointTrimming; |
} |
else |
{ |
if(HeightTrimming > 0) SollHoehe += EE_Parameter.Hoehe_Verstaerkung / 3; |
else SollHoehe -= EE_Parameter.Hoehe_Verstaerkung / 3; |
} |
HeightTrimming = 0; |
LIMIT_MIN_MAX(SollHoehe, (HoehenWert-1024), (HoehenWert+1024)); // max. 10m Unterschied |
if(Parameter_ExtraConfig & CFG2_VARIO_BEEP) beeptime = 100; |
//update hoover gas stick value when setpoint is shifted |
if(!EE_Parameter.Hoehe_StickNeutralPoint && FromNC_AltitudeSpeed == 0) |
{ |
StickGasHover = HoverGas/STICK_GAIN; //rescale back to stick value |
StickGasHover = (StickGasHover * UBat) / BattLowVoltageWarning; |
if(StickGasHover < 70) StickGasHover = 70; |
else if(StickGasHover > 150) StickGasHover = 150; |
} |
} |
if(BaroExpandActive) SollHoehe = HoehenWertF; // update setpoint to current altitude if Expanding is active |
} //if FCFlags & MKFCFLAG_FLY |
else |
{ |
SollHoehe = HoehenWert - 400; |
if(EE_Parameter.Hoehe_StickNeutralPoint) StickGasHover = EE_Parameter.Hoehe_StickNeutralPoint; |
else StickGasHover = 120; |
HoverGas = GasMischanteil; |
VarioCharacter = '.'; |
} |
HCGas = HoverGas; // take hover gas (neutral point) |
} |
if(HoehenWertF > SollHoehe || !(Parameter_ExtraConfig & CFG2_HEIGHT_LIMIT)) |
{ |
if(!ACC_AltitudeControl) |
{ |
// from this point the Heigth Control Algorithm is identical for both versions |
if(BaroExpandActive) // baro range expanding active |
{ |
HCGas = HoverGas; // hover while expanding baro adc range |
HeightDeviation = 0; |
} // EOF // baro range expanding active |
else // valid data from air pressure sensor |
{ |
// ------------------------- P-Part ---------------------------- |
tmp_long = (HoehenWertF - SollHoehe); // positive when too high |
LIMIT_MIN_MAX(tmp_long, -32767L, 32767L); // avoid overflov when casting to int16_t |
HeightDeviation = (int)(tmp_long); // positive when too high |
tmp_long = (tmp_long * (long)Parameter_Hoehe_P) / 32L; // p-part |
LIMIT_MIN_MAX(tmp_long, -127 * STICK_GAIN, 256 * STICK_GAIN); // more than the full range makes no sense |
GasReduction = tmp_long; |
// ------------------------- D-Part 1: Vario Meter ---------------------------- |
tmp_int = VarioMeter / 8; |
LIMIT_MIN_MAX(tmp_int, -127, 128); |
tmp_int = (tmp_int * (long)Parameter_Luftdruck_D) / 4L; // scale to d-gain parameter |
LIMIT_MIN_MAX(tmp_int,-64 * STICK_GAIN, 64 * STICK_GAIN); |
if(FC_StatusFlags & (FC_STATUS_VARIO_TRIM_UP|FC_STATUS_VARIO_TRIM_DOWN)) tmp_int /= 4; // reduce d-part while trimming setpoint |
else |
if(Parameter_ExtraConfig & CFG2_HEIGHT_LIMIT) tmp_int /= 8; // reduce d-part in "Deckel" mode |
GasReduction += tmp_int; |
} // EOF no baro range expanding |
// ------------------------ D-Part 2: ACC-Z Integral ------------------------ |
if(Parameter_Hoehe_ACC_Wirkung) |
{ |
tmp_long = ((Mess_Integral_Hoch / 128L) * (int32_t) Parameter_Hoehe_ACC_Wirkung) / (128L / STICK_GAIN); |
LIMIT_MIN_MAX(tmp_long, -32 * STICK_GAIN, 64 * STICK_GAIN); |
GasReduction += tmp_long; |
} |
// ------------------------ D-Part 3: GpsZ ---------------------------------- |
tmp_int = (Parameter_Hoehe_GPS_Z * (int)FromNaviCtrl_Value.GpsZ)/128L; |
LIMIT_MIN_MAX(tmp_int, -32 * STICK_GAIN, 64 * STICK_GAIN); |
GasReduction += tmp_int; |
GasReduction = (long)((long)GasReduction * HoverGas) / 512; // scale to the gas value |
// ------------------------ ---------------------------------- |
HCGas -= GasReduction; |
// limit deviation from hoover point within the target region |
if(!AltitudeSetpointTrimming && HoverGas > 0) // height setpoint is not changed and hoover gas not zero |
{ |
unsigned int tmp; |
tmp = abs(HeightDeviation); |
if(tmp <= 60) |
{ |
LIMIT_MIN_MAX(HCGas, HoverGasMin, HoverGasMax); // limit gas around the hoover point |
} |
else |
{ |
tmp = (tmp - 60) / 32; |
if(tmp > 15) tmp = 15; |
if(HeightDeviation > 0) |
{ |
tmp = (HoverGasMin * (16 - tmp)) / 16; |
LIMIT_MIN_MAX(HCGas, tmp, HoverGasMax); // limit gas around the hoover point |
} |
else |
{ |
tmp = (HoverGasMax * (tmp + 16)) / 16; |
LIMIT_MIN_MAX(HCGas, HoverGasMin, tmp); // limit gas around the hoover point |
} |
} |
} |
// strech control output by inverse attitude projection 1/cos |
// + 1/cos(angle) ++++++++++++++++++++++++++ |
tmp_long2 = (int32_t)HCGas; |
tmp_long2 *= 8192L; |
tmp_long2 /= CosAttitude; |
HCGas = (int16_t)tmp_long2; |
// update height control gas averaging |
FilterHCGas = (FilterHCGas * (HC_GAS_AVERAGE - 1) + HCGas) / HC_GAS_AVERAGE; |
// limit height control gas pd-control output |
LIMIT_MIN_MAX(FilterHCGas, EE_Parameter.Hoehe_MinGas * STICK_GAIN, (MAX_GAS - 20) * STICK_GAIN); |
// set GasMischanteil to HeightControlGasFilter |
if(Parameter_ExtraConfig & CFG2_HEIGHT_LIMIT) |
{ // old version |
LIMIT_MAX(FilterHCGas, GasMischanteil); // nicht mehr als Gas |
GasMischanteil = FilterHCGas; |
} |
else GasMischanteil = FilterHCGas + (GasMischanteil - HoverGas) / 4; // only in Vario-Mode |
} |
#if (defined(__AVR_ATmega1284__) || defined(__AVR_ATmega1284P__)) |
else // ACC-Altitude control |
{ |
// from this point the Heigth Control Algorithm is identical for both versions |
if(BaroExpandActive) // baro range expanding active |
{ |
HCGas = HoverGas; // hover while expanding baro adc range |
HeightDeviation = 0; |
} // EOF // baro range expanding active |
else // valid data from air pressure sensor |
{ |
// ------------------------- P-Part ---------------------------- |
tmp_long = (HoehenWertF - SollHoehe); // positive when too high |
LIMIT_MIN_MAX(tmp_long, -32767L, 32767L); // avoid overflov when casting to int16_t |
HeightDeviation = (int)(tmp_long); // positive when too high |
tmp_long = (tmp_long * (long)Parameter_Hoehe_P) / 32L; // p-part |
LIMIT_MIN_MAX(tmp_long, -511 * STICK_GAIN, 512 * STICK_GAIN); // more than full range makes sense |
GasReduction = tmp_long; |
// ------------------------ D-Part: ACC-Z Integral ------------------------ |
tmp_long = VarioMeter + (AdWertAccHoch * Parameter_Hoehe_ACC_Wirkung)/256; |
// ------------------------- D-Part: Vario Meter ---------------------------- |
if(WaypointTrimming) { |
Variance = AltitudeSetpointTrimming * 8; |
} else { |
Variance = AltitudeSetpointTrimming * EE_Parameter.Hoehe_Verstaerkung*9/32; |
} |
tmp_long -= (long)Variance; |
tmp_long = (tmp_long * (long)Parameter_Luftdruck_D) / 32; // scale to d-gain parameter |
LIMIT_MIN_MAX(tmp_long,-511 * STICK_GAIN, 512 * STICK_GAIN); |
GasReduction += tmp_long; |
} // EOF no baro range expanding |
HCGas -= GasReduction; |
LIMIT_MIN_MAX(HCGas, HoverGasMin, HoverGasMax); // limits gas around hover point |
// strech control output by inverse attitude projection 1/cos |
// + 1/cos(angle) ++++++++++++++++++++++++++ |
tmp_long2 = (int32_t)HCGas; |
tmp_long2 *= 8192L; |
tmp_long2 /= CosAttitude; |
HCGas = (int16_t)tmp_long2; |
// update height control gas averaging |
FilterHCGas = (FilterHCGas * (HC_GAS_AVERAGE - 1) + HCGas) / HC_GAS_AVERAGE; |
// limit height control gas pd-control output |
LIMIT_MIN_MAX(FilterHCGas, EE_Parameter.Hoehe_MinGas * STICK_GAIN, (MAX_GAS - 20) * STICK_GAIN); |
// set GasMischanteil to HeightControlGasFilter |
if(Parameter_ExtraConfig & CFG2_HEIGHT_LIMIT) |
{ // old version |
LIMIT_MAX(FilterHCGas, GasMischanteil); // nicht mehr als Gas |
GasMischanteil = FilterHCGas; |
} |
else GasMischanteil = FilterHCGas; |
} // end of ACC-Altitude control |
#endif |
} |
}// EOF height control active |
else // HC not active |
{ |
//update hoover gas stick value when HC is not active |
if(!EE_Parameter.Hoehe_StickNeutralPoint) |
{ |
StickGasHover = HoverGas/STICK_GAIN; // rescale back to stick value |
StickGasHover = (StickGasHover * UBat) / BattLowVoltageWarning; |
} |
else StickGasHover = EE_Parameter.Hoehe_StickNeutralPoint; |
LIMIT_MIN_MAX(StickGasHover, 70, 150); // reserve some range for trim up and down |
FilterHCGas = GasMischanteil; |
// set both flags to indicate no vario mode |
FC_StatusFlags |= (FC_STATUS_VARIO_TRIM_UP|FC_STATUS_VARIO_TRIM_DOWN); |
FC_StatusFlags2 &= ~FC_STATUS2_ALTITUDE_CONTROL; |
} |
// Hover gas estimation by averaging gas control output on small z-velocities |
// this is done only if height contol option is selected in global config and aircraft is flying |
if((FC_StatusFlags & FC_STATUS_FLY))// && !(FC_SatusFlags & FC_STATUS_EMERGENCY_LANDING)) |
{ |
//if(HoverGasFilter == 0 || StartTrigger == 1) HoverGasFilter = HOVER_GAS_AVERAGE * (unsigned long)(GasMischanteil); // init estimation |
if(HoverGasFilter == 0 || StartTrigger == 1) HoverGasFilter = HOVER_GAS_AVERAGE * (unsigned long)(HoverGas); // 0.90f: geändert |
if(StartTrigger == 1) StartTrigger = 2; |
tmp_long2 = (int32_t)GasMischanteil; // take current thrust |
tmp_long2 *= CosAttitude; // apply attitude projection |
tmp_long2 /= 8192; |
// average vertical projected thrust |
if(modell_fliegt < 4000) // the first 8 seconds |
{ // reduce the time constant of averaging by factor of 4 to get much faster a stable value |
HoverGasFilter -= HoverGasFilter/(HOVER_GAS_AVERAGE/16L); |
HoverGasFilter += 16L * tmp_long2; |
} |
if(modell_fliegt < 8000) // the first 16 seconds |
{ // reduce the time constant of averaging by factor of 2 to get much faster a stable value |
HoverGasFilter -= HoverGasFilter/(HOVER_GAS_AVERAGE/4L); |
HoverGasFilter += 4L * tmp_long2; |
} |
else //later |
if(abs(VarioMeter) < 100 && abs(HoehenWertF - SollHoehe) < 256) // only on small vertical speed & difference is small (only descending) |
{ |
HoverGasFilter -= HoverGasFilter/HOVER_GAS_AVERAGE; |
HoverGasFilter += tmp_long2; |
} |
HoverGas = (int16_t)(HoverGasFilter/HOVER_GAS_AVERAGE); |
if(EE_Parameter.Hoehe_HoverBand) |
{ |
int16_t band; |
band = HoverGas / EE_Parameter.Hoehe_HoverBand; // the higher the parameter the smaller the range |
HoverGasMin = HoverGas - band; |
HoverGasMax = HoverGas + band; |
} |
else |
{ // no limit |
HoverGasMin = 0; |
HoverGasMax = 1023; |
} |
} |
else |
{ |
StartTrigger = 0; |
HoverGasFilter = 0; |
HoverGas = 0; |
} |
}// EOF Parameter_GlobalConfig & CFG_HEIGHT_CONTROL |
else |
{ |
// set undefined state to indicate vario off |
FC_StatusFlags |= (FC_STATUS_VARIO_TRIM_UP|FC_STATUS_VARIO_TRIM_DOWN); |
} // EOF no height control |
// Limits the maximum gas in case of "Out of Range emergency landing" |
if(NC_To_FC_Flags & NC_TO_FC_EMERGENCY_LANDING) |
{ |
if(GasMischanteil/STICK_GAIN > HooverGasEmergencyPercent && HoverGas) GasMischanteil = HooverGasEmergencyPercent * STICK_GAIN; |
SollHoehe = HoehenWertF; // update setpoint to current heigth |
beeptime = 15000; |
BeepMuster = 0x0E00; |
} |
// limit gas to parameter setting |
LIMIT_MIN(GasMischanteil, (MIN_GAS + 10) * STICK_GAIN); |
if(GasMischanteil > (MAX_GAS - 20) * STICK_GAIN) GasMischanteil = (MAX_GAS - 20) * STICK_GAIN; |
// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
// all BL-Ctrl connected? |
// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
if(MissingMotor || Capacity.MinOfMaxPWM != 255 || NC_ErrorCode) // wait until all BL-Ctrls started and no Errors |
if(modell_fliegt > 1 && modell_fliegt < 50 && GasMischanteil > 0) // only during start-phase |
{ |
modell_fliegt = 1; |
GasMischanteil = (MIN_GAS + 10) * STICK_GAIN; |
#if (defined(__AVR_ATmega1284__) || defined(__AVR_ATmega1284P__)) |
if(Capacity.MinOfMaxPWM < 40) SpeakHoTT = SPEAK_ERR_MOTOR; |
#endif |
} |
// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
// + Mischer und PI-Regler |
// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
DebugOut.Analog[7] = GasMischanteil; |
// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
// Gier-Anteil |
// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
GierMischanteil = MesswertGier - sollGier * STICK_GAIN; // Regler für Gier |
#define MIN_GIERGAS (40*STICK_GAIN) // unter diesem Gaswert trotzdem Gieren |
if(GasMischanteil > MIN_GIERGAS) |
{ |
if(GierMischanteil > (GasMischanteil / 2)) GierMischanteil = GasMischanteil / 2; |
if(GierMischanteil < -(GasMischanteil / 2)) GierMischanteil = -(GasMischanteil / 2); |
} |
else |
{ |
if(GierMischanteil > (MIN_GIERGAS / 2)) GierMischanteil = MIN_GIERGAS / 2; |
if(GierMischanteil < -(MIN_GIERGAS / 2)) GierMischanteil = -(MIN_GIERGAS / 2); |
} |
tmp_int = MAX_GAS*STICK_GAIN; |
if(GierMischanteil > ((tmp_int - GasMischanteil))) GierMischanteil = ((tmp_int - GasMischanteil)); |
if(GierMischanteil < -((tmp_int - GasMischanteil))) GierMischanteil = -((tmp_int - GasMischanteil)); |
// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
// Nick-Achse |
// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
DiffNick = MesswertNick - StickNick; // Differenz bestimmen |
if(IntegralFaktor) SummeNick += IntegralNickMalFaktor - StickNick; // I-Anteil bei Winkelregelung |
else SummeNick += DiffNick; // I-Anteil bei HH |
if(SummeNick > (STICK_GAIN * 16000L)) SummeNick = (STICK_GAIN * 16000L); |
if(SummeNick < -(16000L * STICK_GAIN)) SummeNick = -(16000L * STICK_GAIN); |
if(EE_Parameter.Gyro_Stability <= 8) pd_ergebnis_nick = (EE_Parameter.Gyro_Stability * DiffNick) / 8; // PI-Regler für Nick |
else pd_ergebnis_nick = ((EE_Parameter.Gyro_Stability / 2) * DiffNick) / 4; // Überlauf verhindern |
pd_ergebnis_nick += SummeNick / Ki; |
tmp_int = (long)((long)Parameter_DynamicStability * (long)(GasMischanteil + abs(GierMischanteil)/2)) / 64; |
if(pd_ergebnis_nick > tmp_int) pd_ergebnis_nick = tmp_int; |
if(pd_ergebnis_nick < -tmp_int) pd_ergebnis_nick = -tmp_int; |
// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
// Roll-Achse |
// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
DiffRoll = MesswertRoll - StickRoll; // Differenz bestimmen |
if(IntegralFaktor) SummeRoll += IntegralRollMalFaktor - StickRoll;// I-Anteil bei Winkelregelung |
else SummeRoll += DiffRoll; // I-Anteil bei HH |
if(SummeRoll > (STICK_GAIN * 16000L)) SummeRoll = (STICK_GAIN * 16000L); |
if(SummeRoll < -(16000L * STICK_GAIN)) SummeRoll = -(16000L * STICK_GAIN); |
if(EE_Parameter.Gyro_Stability <= 8) pd_ergebnis_roll = (EE_Parameter.Gyro_Stability * DiffRoll) / 8; // PI-Regler für Roll |
else pd_ergebnis_roll = ((EE_Parameter.Gyro_Stability / 2) * DiffRoll) / 4; // Überlauf verhindern |
pd_ergebnis_roll += SummeRoll / Ki; |
tmp_int = (long)((long)Parameter_DynamicStability * (long)(GasMischanteil + abs(GierMischanteil)/2)) / 64; |
if(pd_ergebnis_roll > tmp_int) pd_ergebnis_roll = tmp_int; |
if(pd_ergebnis_roll < -tmp_int) pd_ergebnis_roll = -tmp_int; |
// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
// Universal Mixer |
// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
for(i=0; i<MAX_MOTORS; i++) |
{ |
signed int tmp_int; |
if(Mixer.Motor[i][0] > 0) |
{ |
// Gas |
if(Mixer.Motor[i][0] == 64) tmp_int = GasMischanteil; else tmp_int = ((long)GasMischanteil * Mixer.Motor[i][0]) / 64L; |
// Nick |
if(Mixer.Motor[i][1] == 64) tmp_int += pd_ergebnis_nick; |
else if(Mixer.Motor[i][1] == -64) tmp_int -= pd_ergebnis_nick; |
else tmp_int += ((long)pd_ergebnis_nick * Mixer.Motor[i][1]) / 64L; |
// Roll |
if(Mixer.Motor[i][2] == 64) tmp_int += pd_ergebnis_roll; |
else if(Mixer.Motor[i][2] == -64) tmp_int -= pd_ergebnis_roll; |
else tmp_int += ((long)pd_ergebnis_roll * Mixer.Motor[i][2]) / 64L; |
// Gier |
if(Mixer.Motor[i][3] == 64) tmp_int += GierMischanteil; |
else if(Mixer.Motor[i][3] == -64) tmp_int -= GierMischanteil; |
else tmp_int += ((long)GierMischanteil * Mixer.Motor[i][3]) / 64L; |
if(Motor[i].Version & MOTOR_STATE_FAST_MODE || tmp_int > tmp_motorwert[i]) tmp_int = (tmp_motorwert[i] + tmp_int) / 2; // Beschleunigen |
else |
{ // BL-Ctrl 1.0 or 2.0 |
if(EE_Parameter.MotorSmooth == 0) |
{ |
tmp_int = 2 * tmp_int - tmp_motorwert[i]; // original MotorSmoothing |
} |
else // 1 means tmp_int = tmp_int; |
if(EE_Parameter.MotorSmooth > 1) |
{ |
// If >= 2 then allow >= 50% of the intended step down to rapidly reach the intended value. |
tmp_int = tmp_int + ((tmp_motorwert[i] - tmp_int) / EE_Parameter.MotorSmooth); |
} |
} |
LIMIT_MIN_MAX(tmp_int,(int) MIN_GAS * 4,(int) MAX_GAS * 4); |
Motor[i].SetPoint = tmp_int / 4; |
Motor[i].SetPointLowerBits = (tmp_int % 4)<<1; // (3 bits total) |
tmp_motorwert[i] = tmp_int; |
} |
else |
{ |
Motor[i].SetPoint = 0; |
Motor[i].SetPointLowerBits = 0; |
} |
} |
} |
//DebugOut.Analog[16] |
/branches/V2.02a_FirstTrial_Peter/fc.h |
---|
0,0 → 1,153 |
/*####################################################################################### |
Flight Control |
#######################################################################################*/ |
#ifndef _FC_H |
#define _FC_H |
//#define GIER_GRAD_FAKTOR 1291L // Abhängigkeit zwischen GyroIntegral und Winkel |
//#define GIER_GRAD_FAKTOR 1160L |
extern long GIER_GRAD_FAKTOR; // Abhängigkeit zwischen GyroIntegral und Winkel |
#define STICK_GAIN 4 |
#define ACC_AMPLIFY 6 |
#define HEIGHT_CONTROL_STICKTHRESHOLD 15 |
// FC_StatusFlags |
#define FC_STATUS_MOTOR_RUN 0x01 |
#define FC_STATUS_FLY 0x02 |
#define FC_STATUS_CALIBRATE 0x04 |
#define FC_STATUS_START 0x08 |
#define FC_STATUS_EMERGENCY_LANDING 0x10 |
#define FC_STATUS_LOWBAT 0x20 |
#define FC_STATUS_VARIO_TRIM_UP 0x40 |
#define FC_STATUS_VARIO_TRIM_DOWN 0x80 |
// FC_StatusFlags2 |
#define FC_STATUS2_CAREFREE 0x01 |
#define FC_STATUS2_ALTITUDE_CONTROL 0x02 |
#define FC_STATUS2_RC_FAILSAVE_ACTIVE 0x04 |
#define FC_STATUS2_OUT1_ACTIVE 0x08 |
#define FC_STATUS2_OUT2_ACTIVE 0x10 |
#define FC_STATUS2_WAIT_FOR_TAKEOFF 0x20 // Motor Running, but still on the ground |
#define FC_STATUS2_AUTO_STARTING 0x40 |
#define FC_STATUS2_AUTO_LANDING 0x80 |
//NC_To_FC_Flags |
#define NC_TO_FC_FLYING_RANGE 0x01 |
#define NC_TO_FC_EMERGENCY_LANDING 0x02 |
#define NC_TO_FC_AUTOSTART 0x04 |
#define NC_TO_FC_AUTOLANDING 0x08 // not used |
extern volatile unsigned char FC_StatusFlags, FC_StatusFlags2; |
extern void ParameterZuordnung(void); |
extern unsigned char GetChannelValue(unsigned char ch); // gives the unsigned value of the channel |
#define Poti1 Poti[0] |
#define Poti2 Poti[1] |
#define Poti3 Poti[2] |
#define Poti4 Poti[3] |
#define Poti5 Poti[4] |
#define Poti6 Poti[5] |
#define Poti7 Poti[6] |
#define Poti8 Poti[7] |
#define LIMIT_MIN(value, min) {if(value <= min) value = min;} |
#define LIMIT_MAX(value, max) {if(value >= max) value = max;} |
#define LIMIT_MIN_MAX(value, min, max) {if(value <= min) value = min; else if(value >= max) value = max;} |
#define CHK_POTI(b,a) {if(a < 248) b = a; else b = Poti[255 - a];} |
#define CHK_POTI_OFF(b,a,off) {if(a < 248) b = a; else b = Poti[255 - a] - off;} |
#define CHK_POTI_MM(b,a,min,max) {CHK_POTI(b,a); LIMIT_MIN_MAX(b, min, max);} |
#define CHK_POTI_MM_OFF(b,a,min,max,off) {CHK_POTI_OFF(b,a,off); LIMIT_MIN_MAX(b, min, max);} |
extern unsigned char Sekunde,Minute; |
extern unsigned int BaroExpandActive; |
extern long IntegralNick,IntegralNick2; |
extern long IntegralRoll,IntegralRoll2; |
//extern int IntegralNick,IntegralNick2; |
//extern int IntegralRoll,IntegralRoll2; |
extern unsigned char Poti[9]; |
extern long Mess_IntegralNick,Mess_IntegralNick2; |
extern long Mess_IntegralRoll,Mess_IntegralRoll2; |
extern long IntegralAccNick,IntegralAccRoll; |
extern long SummeNick,SummeRoll; |
extern volatile long Mess_Integral_Hoch; |
extern long Integral_Gier,Mess_Integral_Gier,Mess_Integral_Gier2; |
extern int KompassValue; |
extern int KompassSollWert; |
extern int KompassRichtung; |
extern char CalculateCompassTimer; |
extern unsigned char KompassFusion; |
extern unsigned char ControlHeading; |
extern int TrimNick, TrimRoll; |
extern long ErsatzKompass; |
extern int ErsatzKompassInGrad; // Kompasswert in Grad |
extern long HoehenWert; |
extern long SollHoehe; |
extern long FromNC_AltitudeSetpoint; |
extern unsigned char FromNC_AltitudeSpeed; |
extern unsigned char Parameter_HoehenSchalter; // Wert : 0-250 |
extern unsigned char CareFree; |
extern int MesswertNick,MesswertRoll,MesswertGier; |
extern int AdNeutralNick,AdNeutralRoll,AdNeutralGier, Mittelwert_AccNick, Mittelwert_AccRoll; |
extern unsigned int NeutralAccX, NeutralAccY; |
extern unsigned char HoehenReglerAktiv; |
extern int NeutralAccZ; |
extern signed char NeutralAccZfine; |
extern long Umschlag180Nick, Umschlag180Roll; |
extern signed int ExternStickNick,ExternStickRoll,ExternStickGier; |
extern unsigned char Parameter_UserParam1,Parameter_UserParam2,Parameter_UserParam3,Parameter_UserParam4,Parameter_UserParam5,Parameter_UserParam6,Parameter_UserParam7,Parameter_UserParam8; |
extern int NaviAccNick,NaviAccRoll,NaviCntAcc; |
extern unsigned int modell_fliegt; |
extern void MotorRegler(void); |
extern void SendMotorData(void); |
//void CalibrierMittelwert(void); |
//void Mittelwert(void); |
extern unsigned char SetNeutral(unsigned char AccAdjustment); // retuns: "sucess" |
extern void Piep(unsigned char Anzahl, unsigned int dauer); |
extern void CopyDebugValues(void); |
extern unsigned char ACC_AltitudeControl; |
extern signed int CosAttitude; // for projection of hoover gas |
extern unsigned char h,m,s; |
extern int StickNick,StickRoll,StickGier,StickGas; |
extern volatile unsigned char Timeout ; |
extern unsigned char CosinusNickWinkel, CosinusRollWinkel; |
extern int DiffNick,DiffRoll; |
//extern int Poti1, Poti2, Poti3, Poti4; |
extern volatile unsigned char SenderOkay; |
extern int StickNick,StickRoll,StickGier; |
extern char MotorenEin; |
extern unsigned char CalibrationDone; |
extern unsigned char Parameter_Servo3,Parameter_Servo4,Parameter_Servo5; |
extern char VarioCharacter; |
extern signed int AltitudeSetpointTrimming; |
extern signed char WaypointTrimming; |
extern int HoverGas; |
extern unsigned char Parameter_Luftdruck_D; |
//extern unsigned char Parameter_MaxHoehe; |
extern unsigned char Parameter_Hoehe_P; |
extern unsigned char Parameter_Hoehe_ACC_Wirkung; |
extern unsigned char Parameter_KompassWirkung; |
extern unsigned char Parameter_Gyro_P; |
extern unsigned char Parameter_Gyro_I; |
extern unsigned char Parameter_Gier_P; |
extern unsigned char Parameter_ServoNickControl; |
extern unsigned char Parameter_ServoRollControl; |
extern unsigned char Parameter_ServoNickComp; |
extern unsigned char Parameter_ServoRollComp; |
extern unsigned char Parameter_AchsKopplung1; |
extern unsigned char Parameter_AchsKopplung2; |
//extern unsigned char Parameter_AchsGegenKopplung1; |
extern unsigned char Parameter_J16Bitmask; // for the J16 Output |
extern unsigned char Parameter_J16Timing; // for the J16 Output |
extern unsigned char Parameter_J17Bitmask; // for the J17 Output |
extern unsigned char Parameter_J17Timing; // for the J17 Output |
extern unsigned char Parameter_GlobalConfig; |
extern unsigned char Parameter_ExtraConfig; |
extern signed char MixerTable[MAX_MOTORS][4]; |
extern const signed char sintab[31]; |
extern unsigned char LowVoltageLandingActive; |
#endif //_FC_H |
/branches/V2.02a_FirstTrial_Peter/flight.pnproj |
---|
0,0 → 1,0 |
<Project name="Flight-Ctrl"><File path="uart.h"></File><File path="jeti.h"></File><File path="main.c"></File><File path="main.h"></File><File path="makefile"></File><File path="uart.c"></File><File path="printf_P.h"></File><File path="timer0.c"></File><File path="timer0.h"></File><File path="old_macros.h"></File><File path="twimaster.c"></File><File path="version.txt"></File><File path="twimaster.h"></File><File path="rc.c"></File><File path="rc.h"></File><File path="fc.h"></File><File path="menu.h"></File><File path="menu.c"></File><File path="_Settings.h"></File><File path="analog.c"></File><File path="analog.h"></File><File path="GPS.c"></File><File path="gps.h"></File><File path="License.txt"></File><File path="spi.h"></File><File path="spi.c"></File><File path="led.h"></File><File path="led.c"></File><File path="fc.c"></File><File path="mymath.c"></File><File path="mymath.h"></File><File path="isqrt.S"></File><File path="Spektrum.c"></File><File path="Spektrum.h"></File><File path="eeprom.h"></File><File path="eeprom.c"></File><File path="libfc.h"></File><File path="debug.c"></File><File path="debug.h"></File><File path="hottmenu.c"></File><File path="hottmenu.h"></File></Project> |
/branches/V2.02a_FirstTrial_Peter/flight.pnps |
---|
0,0 → 1,0 |
<pd><ViewState><e p="Flight-Ctrl" x="true"></e></ViewState></pd> |
/branches/V2.02a_FirstTrial_Peter/gps.h |
---|
0,0 → 1,3 |
extern signed int GPS_Nick; |
extern signed int GPS_Roll; |
extern unsigned char GPS_Aid_StickMultiplikator; |
/branches/V2.02a_FirstTrial_Peter/hottmenu.c |
---|
0,0 → 1,859 |
// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
// + www.MikroKopter.com |
// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
// + Software Nutzungsbedingungen (english version: see below) |
// + der Fa. HiSystems GmbH, Flachsmeerstrasse 2, 26802 Moormerland - nachfolgend Lizenzgeber genannt - |
// + Der Lizenzgeber räumt dem Kunden ein nicht-ausschließliches, zeitlich und räumlich* unbeschränktes Recht ein, die im den |
// + Mikrocontroller verwendete Firmware für die Hardware Flight-Ctrl, Navi-Ctrl, BL-Ctrl, MK3Mag & PC-Programm MikroKopter-Tool |
// + - nachfolgend Software genannt - nur für private Zwecke zu nutzen. |
// + Der Einsatz dieser Software ist nur auf oder mit Produkten des Lizenzgebers zulässig. |
// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
// + Die vom Lizenzgeber gelieferte Software ist urheberrechtlich geschützt. Alle Rechte an der Software sowie an sonstigen im |
// + Rahmen der Vertragsanbahnung und Vertragsdurchführung überlassenen Unterlagen stehen im Verhältnis der Vertragspartner ausschließlich dem Lizenzgeber zu. |
// + Die in der Software enthaltenen Copyright-Vermerke, Markenzeichen, andere Rechtsvorbehalte, Seriennummern sowie |
// + sonstige der Programmidentifikation dienenden Merkmale dürfen vom Kunden nicht verändert oder unkenntlich gemacht werden. |
// + Der Kunde trifft angemessene Vorkehrungen für den sicheren Einsatz der Software. Er wird die Software gründlich auf deren |
// + Verwendbarkeit zu dem von ihm beabsichtigten Zweck testen, bevor er diese operativ einsetzt. |
// + Die Haftung des Lizenzgebers wird - soweit gesetzlich zulässig - begrenzt in Höhe des typischen und vorhersehbaren |
// + Schadens. Die gesetzliche Haftung bei Personenschäden und nach dem Produkthaftungsgesetz bleibt unberührt. Dem Lizenzgeber steht jedoch der Einwand |
// + des Mitverschuldens offen. |
// + Der Kunde trifft angemessene Vorkehrungen für den Fall, dass die Software ganz oder teilweise nicht ordnungsgemäß arbeitet. |
// + Er wird die Software gründlich auf deren Verwendbarkeit zu dem von ihm beabsichtigten Zweck testen, bevor er diese operativ einsetzt. |
// + Der Kunde wird er seine Daten vor Einsatz der Software nach dem Stand der Technik sichern. |
// + Der Kunde ist darüber unterrichtet, dass der Lizenzgeber seine Daten im zur Vertragsdurchführung erforderlichen Umfang |
// + und auf Grundlage der Datenschutzvorschriften erhebt, speichert, verarbeitet und, sofern notwendig, an Dritte übermittelt. |
// + *) Die räumliche Nutzung bezieht sich nur auf den Einsatzort, nicht auf die Reichweite der programmierten Software. |
// + #### ENDE DER NUTZUNGSBEDINGUNGEN ####' |
// + Hinweis: Informationen über erweiterte Nutzungsrechte (wie z.B. Nutzung für nicht-private Zwecke) sind auf Anfrage per Email an info(@)hisystems.de verfügbar. |
// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
// + Software LICENSING TERMS |
// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
// + of HiSystems GmbH, Flachsmeerstrasse 2, 26802 Moormerland, Germany - the Licensor - |
// + The Licensor grants the customer a non-exclusive license to use the microcontroller firmware of the Flight-Ctrl, Navi-Ctrl, BL-Ctrl, and MK3Mag hardware |
// + (the Software) exclusively for private purposes. The License is unrestricted with respect to time and territory*. |
// + The Software may only be used with the Licensor's products. |
// + The Software provided by the Licensor is protected by copyright. With respect to the relationship between the parties to this |
// + agreement, all rights pertaining to the Software and other documents provided during the preparation and execution of this |
// + agreement shall be the property of the Licensor. |
// + The information contained in the Software copyright notices, trademarks, other legal reservations, serial numbers and other |
// + features that can be used to identify the program may not be altered or defaced by the customer. |
// + The customer shall be responsible for taking reasonable precautions |
// + for the safe use of the Software. The customer shall test the Software thoroughly regarding its suitability for the |
// + intended purpose before implementing it for actual operation. The Licensor's liability shall be limited to the extent of typical and |
// + foreseeable damage to the extent permitted by law, notwithstanding statutory liability for bodily injury and product |
// + liability. However, the Licensor shall be entitled to the defense of contributory negligence. |
// + The customer will take adequate precautions in the case, that the software is not working properly. The customer will test |
// + the software for his purpose before any operational usage. The customer will backup his data before using the software. |
// + The customer understands that the Licensor collects, stores and processes, and, where required, forwards, customer data |
// + to third parties to the extent necessary for executing the agreement, subject to applicable data protection and privacy regulations. |
// + *) The territory aspect only refers to the place where the Software is used, not its programmed range. |
// + #### END OF LICENSING TERMS #### |
// + Note: For information on license extensions (e.g. commercial use), please contact us at info(@)hisystems.de. |
// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
#include "libfc.h" |
#include "printf_P.h" |
#include "main.h" |
#include "spi.h" |
#include "capacity.h" |
#if (defined(__AVR_ATmega1284__) || defined(__AVR_ATmega1284P__)) |
#define HoTT_printf(format, args...) { _printf_P(&LIBFC_HoTT_Putchar, PSTR(format) , ## args);} |
#define HoTT_printfxy(x,y,format, args...) { LIBFC_HoTT_SetPos(y * 21 + x); _printf_P(&LIBFC_HoTT_Putchar, PSTR(format) , ## args);} |
#define HoTT_printfxy_INV(x,y,format, args...) { LIBFC_HoTT_SetPos(y * 21 + x); _printf_P(&LIBFC_HoTT_Putchar_INV, PSTR(format) , ## args);} |
#define HoTT_printfxy_BLINK(x,y,format, args...) { LIBFC_HoTT_SetPos(y * 21 + x); _printf_P(&LIBFC_HoTT_Putchar_BLINK, PSTR(format) , ## args);} |
#define HoTT_printf_BLINK(format, args...) { _printf_P(&LIBFC_HoTT_Putchar_BLINK, PSTR(format) , ## args);} |
#define HoTT_printf_INV(format, args...) { _printf_P(&LIBFC_HoTT_Putchar_INV, PSTR(format) , ## args);} |
#define VOICE_MINIMALE_EINGANSSPANNUNG 16 |
#define VOICE_BEEP 5 |
#define HoTT_GRAD 96 |
#define HoTT_LINKS 123 |
#define HoTT_RECHTS 124 |
#define HoTT_OBEN 125 |
#define HoTT_UNTEN 126 |
#define HOTT_KEY_RIGHT 1 |
#define HOTT_KEY_DOWN 2 |
#define HOTT_KEY_UP 4 |
#define HOTT_KEY_SET 6 |
#define HOTT_KEY_LEFT 8 |
#define VARIO_ZERO 30000 |
unsigned char NaviData_WaypointIndex = 0, NaviData_WaypointNumber = 0, NaviData_TargetHoldTime = 0; |
unsigned int NaviData_TargetDistance = 0; |
unsigned char MaxBlTemperture = 0; |
unsigned char MinBlTemperture = 0; |
unsigned char HottestBl = 0; |
GPSPacket_t GPSPacket; |
VarioPacket_t VarioPacket; |
ASCIIPacket_t ASCIIPacket; |
ElectricAirPacket_t ElectricAirPacket; |
HoTTGeneral_t HoTTGeneral; |
unsigned char SpeakHoTT = SPEAK_MIKROKOPTER; |
unsigned char ToNC_SpeakHoTT = 0, ShowSettingNameTime = 0; |
int HoTTVarioMeter = 0; |
const char PROGMEM MIKROKOPTER[] = {" MikroKopter "}; |
const char PROGMEM UNDERVOLTAGE[] = {" !! LiPo voltage !! "}; |
const char PROGMEM LANDING[] = {" !! LANDING !! "}; |
const char PROGMEM SETTING[] = {"Set :"}; |
const char PROGMEM NC_ERROR_TEXT[MAX_ERR_NUMBER][17] = |
{ |
//0123456789123456 |
"No Error \0", // 0 |
"Not compatible \0", // 1 |
"MK3Mag not compa\0", // 2 |
"No FC communicat\0", // 3 |
"Compass communic\0", // 4 |
"GPS communicatio\0", // 5 |
"compass value \0", // 6 |
"RC Signal lost \0", // 7 |
"FC spi rx error \0", // 8 |
"No NC communicat\0", // 9 |
"FC Nick Gyro \0", // 10 |
"FC Roll Gyro \0", // 11 |
"FC Yaw Gyro \0", // 12 |
"FC Nick ACC \0", // 13 |
"FC Roll ACC \0", // 14 |
"FC Z-ACC \0", // 15 |
"Pressure sensor \0", // 16 |
"I2C FC->BL-Ctrl \0", // 17 |
"Bl Missing \0", // 18 |
"Mixer Error \0", // 19 |
"Carefree Error \0", // 20 |
"GPS Fix lost \0", // 21 |
"Magnet Error \0", // 22 |
"Motor restart \0", // 23 |
"BL Limitation \0", // 24 |
"GPS Range \0", // 25 |
"No SD-Card \0", // 26 |
"SD-Logging error\0", // 27 |
"Flying range! \0", // 28 |
"Max Altitude! \0", // 29 |
"No GPS fix \0", // 30 |
"compass not cal.\0", // 31 |
"BL-Selftest \0" // 32 |
}; |
const char PROGMEM HOTT_ERROR[MAX_ERR_NUMBER][2] = |
{ // 1 -> only in flight 0 -> also on ground |
//0123456789123456 |
{0,0},// "No Error \0", // 0 |
{SPEAK_ERROR,0}, // "Not compatible \0", // 1 |
{SPEAK_ERROR,0}, // "MK3Mag not compa\0", // 2 |
{SPEAK_ERR_NAVI,1}, // "No FC communicat\0", // 3 |
{SPEAK_ERR_COMPASS,1}, // "MK3Mag communica\0", // 4 |
{SPEAK_ERR_GPS,0}, // "GPS communicatio\0", // 5 |
{SPEAK_ERR_COMPASS,1}, // "compass value \0", // 6 |
{SPEAK_ERR_RECEICER,0},// "RC Signal lost \0", // 7 |
{SPEAK_ERR_NAVI,0}, // "FC spi rx error \0", // 8 |
{SPEAK_ERR_NAVI,0}, // "No NC communicat\0", // 9 |
{SPEAK_ERR_SENSOR,0}, // "FC Nick Gyro \0", // 10 |
{SPEAK_ERR_SENSOR,0}, // "FC Roll Gyro \0", // 11 |
{SPEAK_ERR_SENSOR,0}, // "FC Yaw Gyro \0", // 12 |
{SPEAK_ERR_SENSOR,0}, // "FC Nick ACC \0", // 13 |
{SPEAK_ERR_SENSOR,0}, // "FC Roll ACC \0", // 14 |
{SPEAK_ERR_SENSOR,0}, // "FC Z-ACC \0", // 15 |
{SPEAK_ERR_SENSOR,0}, // "Pressure sensor \0", // 16 |
{SPEAK_ERR_DATABUS,1}, // "I2C FC->BL-Ctrl \0", // 17 |
{SPEAK_ERR_DATABUS,1}, // "Bl Missing \0", // 18 |
{SPEAK_ERROR,0}, // "Mixer Error \0", // 19 |
{SPEAK_CF_OFF,1}, // "Carefree Error \0", // 20 |
{SPEAK_GPS_FIX,1}, // "GPS Fix lost \0", // 21 |
{SPEAK_ERR_COMPASS,0}, // "Magnet Error \0", // 22 |
{SPEAK_ERR_MOTOR,1}, // "Motor restart \0", // 23 |
{SPEAK_MAX_TEMPERAT,1},// "BL Limitation \0", // 24 |
{SPEAK_MAX_RANGE,1}, // "GPS Range \0", // 25 |
{SPEAK_ERROR,1}, // "No SD-Card \0", // 26 |
{SPEAK_ERROR,1}, // "SD-Logging error\0", // 27 |
{SPEAK_MAX_RANGE,1}, // "Flying range! \0", // 28 |
{SPEAK_MAX_ALTITUD,1}, // "Max Altitude! \0" // 29 |
{SPEAK_GPS_FIX,1}, // "No GPS fix \0" // 30 |
{SPEAK_ERR_CALIBARTION,0},// "compass not cal." // 31 |
{SPEAK_ERR_MOTOR,0} // "BL-Selftest \0" // 32 |
}; |
void GetHottestBl(void) |
{ |
static unsigned char search = 0,tmp_max,tmp_min,who; |
if(Motor[search].Temperature > tmp_max) { tmp_max = Motor[search].Temperature; who = search;} |
else |
if(Motor[search].Temperature) if(Motor[search].Temperature < tmp_min) tmp_min = Motor[search].Temperature; |
if(++search >= MAX_MOTORS) |
{ |
search = 0; |
if(tmp_min != 255) MinBlTemperture = tmp_min; else MinBlTemperture = 0; |
MaxBlTemperture = tmp_max; |
HottestBl = who; |
tmp_min = 255; |
tmp_max = 0; |
who = 0; |
} |
} |
//--------------------------------------------------------------- |
void Hott_ClearLine(unsigned char line) |
{ |
HoTT_printfxy(0,line," "); |
} |
//--------------------------------------------------------------- |
unsigned char HoTT_Waring(void) |
{ |
unsigned char status = 0; |
static char old_status = 0; |
static int repeat; |
//if(Parameter_UserParam1) return(Parameter_UserParam1); |
ToNC_SpeakHoTT = SpeakHoTT; |
if(FC_StatusFlags & FC_STATUS_LOWBAT) |
{ |
if(LowVoltageLandingActive && (EE_Parameter.Receiver == RECEIVER_HOTT)) status = SPEAK_LANDING; |
else status = VOICE_MINIMALE_EINGANSSPANNUNG; // Jeti hat kein wort: "LANDEN" |
} |
else |
if(NC_ErrorCode && NC_ErrorCode+1 < MAX_ERR_NUMBER) // Fehlercodes |
{ |
if(MotorenEin || !pgm_read_byte(&HOTT_ERROR[NC_ErrorCode][1])) status = pgm_read_byte(&HOTT_ERROR[NC_ErrorCode][0]); |
} |
if(!status) // Sprachansagen |
{ |
// if(!(GetParamByte(PID_SPEAK_HOTT_CFG) & 0x01)) SpeakHoTT = 0; // is the voice wanted? |
if(!(EE_Parameter.GlobalConfig3 & CFG3_SPEAK_ALL)) SpeakHoTT = 0; // is the voice wanted? |
else status = SpeakHoTT; |
} |
else ToNC_SpeakHoTT = status; |
if(old_status == status) // Gleichen Fehler nur alle 4 sek bringen |
{ |
if(!CheckDelay(repeat)) return(0); |
repeat = SetDelay(4000); |
} |
else repeat = SetDelay(2000); |
if(status) |
{ |
if(status == SpeakHoTT) SpeakHoTT = 0; |
} |
old_status = status; |
// DebugOut.Analog[16] = status; |
return(status); |
} |
/* |
unsigned char HoTTErrorCode(void) |
{ |
return(NC_ErrorCode); |
} |
*/ |
//--------------------------------------------------------------- |
void NC_Fills_HoTT_Telemety(void) |
{ |
unsigned char *ptr = NULL; |
unsigned char max = 0,i,z; |
switch(FromNaviCtrl.Param.Byte[11]) |
{ |
case HOTT_VARIO_PACKET_ID: |
ptr = (unsigned char *) &VarioPacket; |
max = sizeof(VarioPacket); |
break; |
case HOTT_GPS_PACKET_ID: |
ptr = (unsigned char *) &GPSPacket; |
max = sizeof(GPSPacket); |
break; |
case HOTT_ELECTRIC_AIR_PACKET_ID: |
ptr = (unsigned char *) &ElectricAirPacket; |
max = sizeof(ElectricAirPacket); |
break; |
case HOTT_GENERAL_PACKET_ID: |
ptr = (unsigned char *) &HoTTGeneral; |
max = sizeof(HoTTGeneral); |
break; |
case JETI_GPS_PACKET_ID1: |
ptr = (unsigned char *) &JetiExData[14].Value; |
max = sizeof(JetiExData[14].Value); |
break; |
case JETI_GPS_PACKET_ID2: |
ptr = (unsigned char *) &JetiExData[15].Value; |
max = sizeof(JetiExData[15].Value); |
break; |
} |
z = FromNaviCtrl.Param.Byte[0]; // Data allocation |
for(i=0; i < FromNaviCtrl.Param.Byte[1]; i++) |
{ |
if(z >= max) break; |
ptr[z] = FromNaviCtrl.Param.Byte[2+i]; |
z++; |
} |
} |
unsigned int BuildHoTT_Vario(void) |
{ |
unsigned int tmp = VARIO_ZERO; |
if(VarioCharacter == '+' || VarioCharacter == '-') |
{ |
tmp = VARIO_ZERO + (AltitudeSetpointTrimming * EE_Parameter.Hoehe_Verstaerkung) / 3; |
if(tmp < VARIO_ZERO && tmp > VARIO_ZERO - 50) tmp = VARIO_ZERO - 50; // weil es sonst erst bei < 0,5m/sek piept |
} |
else |
if((VarioCharacter == ' ') && (FC_StatusFlags & FC_STATUS_FLY)) |
{ |
tmp = VARIO_ZERO + HoTTVarioMeter; |
if(tmp > VARIO_ZERO) |
{ |
if(tmp < VARIO_ZERO + 100) tmp = VARIO_ZERO; |
else tmp -= 100; |
} |
if(tmp < VARIO_ZERO) |
{ |
if(tmp > VARIO_ZERO - 100) tmp = VARIO_ZERO; |
else tmp += 100; |
} |
} |
else |
if(VarioCharacter == '^') tmp = VARIO_ZERO + FromNC_AltitudeSpeed * 10; |
else |
if(VarioCharacter == 'v') tmp = VARIO_ZERO - FromNC_AltitudeSpeed * 10; |
return(tmp); |
} |
//--------------------------------------------------------------- |
unsigned char HoTT_Telemety(unsigned char packet_request) |
{ |
unsigned char i; |
//Debug("rqst: %02X",packet_request); |
switch(packet_request) |
{ |
case HOTT_VARIO_PACKET_ID: |
GPSPacket.WarnBeep = HoTT_Waring(); // Achtung: das ist richtig hier, damit der Varioton schon vorher abgestellt wird |
VarioPacket.Altitude = HoehenWert/100 + 500; |
if(!GPSPacket.WarnBeep) VarioPacket.m_sec = BuildHoTT_Vario(); else VarioPacket.m_sec = VARIO_ZERO; |
VarioPacket.m_3sec = VarioPacket.m_sec; |
VarioPacket.m_10sec = VarioPacket.m_sec; |
if (VarioPacket.Altitude < VarioPacket.MinAltitude) VarioPacket.MinAltitude = VarioPacket.Altitude; |
if (VarioPacket.Altitude > VarioPacket.MaxAltitude) VarioPacket.MaxAltitude = VarioPacket.Altitude; |
VarioPacket.WarnBeep = 0;//HoTT_Waring(); |
HoTT_DataPointer = (unsigned char *) &VarioPacket; |
VarioPacket.FreeCharacters[0] = VarioCharacter; |
if(FC_StatusFlags2 & FC_STATUS2_CAREFREE) VarioPacket.FreeCharacters[1] = 'C'; else VarioPacket.FreeCharacters[1] = ' '; |
// VarioPacket.FreeCharacters[2] = ' '; |
if(NC_ErrorCode) |
{ |
VarioPacket.Text[0] = NC_ErrorCode/10 + '0'; |
VarioPacket.Text[1] = NC_ErrorCode%10 + '0'; |
VarioPacket.Text[2] = ':'; |
for(i=0; i<16;i++) VarioPacket.Text[i+3] = pgm_read_byte(&NC_ERROR_TEXT[NC_ErrorCode][i]); |
VarioPacket.Text[19] = ' '; |
VarioPacket.Text[20] = ' '; |
} |
else |
if(LowVoltageLandingActive) for(i=0; i<21;i++) VarioPacket.Text[i] = pgm_read_byte(&LANDING[i]); // no Error |
else |
if(FC_StatusFlags & FC_STATUS_LOWBAT) for(i=0; i<21;i++) VarioPacket.Text[i] = pgm_read_byte(&UNDERVOLTAGE[i]); // no Error |
else |
if(ShowSettingNameTime) // no Error |
{ |
for(i=0; i<sizeof(SETTING);i++) VarioPacket.Text[i] = pgm_read_byte(&SETTING[i]); |
VarioPacket.Text[4] = '0' + ActiveParamSet; |
for(i=0; i<sizeof(EE_Parameter.Name);i++) VarioPacket.Text[i+7] = EE_Parameter.Name[i]; // no Error |
VarioPacket.Text[18] = ' '; |
VarioPacket.Text[19] = ' '; |
VarioPacket.Text[20] = ' '; |
} |
else |
if(NaviData_WaypointNumber) |
{ |
unsigned int tmp_int; |
unsigned char tmp; |
VarioPacket.Text[0] = 'W'; VarioPacket.Text[1] = 'P'; |
VarioPacket.Text[2] = ' '; |
VarioPacket.Text[3] = '0'+(NaviData_WaypointIndex) / 10; |
VarioPacket.Text[4] = '0'+(NaviData_WaypointIndex) % 10; |
VarioPacket.Text[5] = '/'; |
VarioPacket.Text[6] = '0'+(NaviData_WaypointNumber) / 10; |
VarioPacket.Text[7] = '0'+(NaviData_WaypointNumber) % 10; |
VarioPacket.Text[8] = ' '; |
tmp_int = NaviData_TargetDistance; |
if(tmp_int > 1000) { VarioPacket.Text[9] = '0'+(tmp_int) / 1000; tmp_int %= 1000;} |
else VarioPacket.Text[9] = ' '; |
if(tmp_int > 100) { VarioPacket.Text[10] = '0'+(tmp_int) / 100; tmp_int %= 100;} |
else VarioPacket.Text[10] = ' '; |
VarioPacket.Text[11] = '0'+(tmp_int) / 10; |
VarioPacket.Text[12] = '0'+(tmp_int) % 10; |
VarioPacket.Text[13] = 'm'; |
VarioPacket.Text[14] = ' '; |
tmp = NaviData_TargetHoldTime; |
if(tmp > 100) { VarioPacket.Text[15] = '0'+(tmp) / 100; tmp %= 100;} else VarioPacket.Text[15] = ' '; |
VarioPacket.Text[16] = '0'+(tmp) / 10; |
VarioPacket.Text[17] = '0'+(tmp) % 10; |
VarioPacket.Text[18] = 's'; |
VarioPacket.Text[19] = ' '; |
} |
else |
if(!CalibrationDone) |
{ |
for(i=0; i<17;i++) VarioPacket.Text[i] = pgm_read_byte(&MIKROKOPTER[i+2]); // no Error and not calibrated |
VarioPacket.Text[16] = '0'+VERSION_MAJOR; |
VarioPacket.Text[17] = '.'; |
VarioPacket.Text[18] = '0'+VERSION_MINOR/10; |
VarioPacket.Text[19] = '0'+VERSION_MINOR%10; |
VarioPacket.Text[20] = 'a'+VERSION_PATCH; |
} |
else |
{ |
for(i=0; i<21;i++) VarioPacket.Text[i] = pgm_read_byte(&MIKROKOPTER[i]); // no Error |
} |
return(sizeof(VarioPacket)); |
break; |
case HOTT_GPS_PACKET_ID: |
GPSPacket.Altitude = HoehenWert/100 + 500; |
// GPSPacket.Distance = GPSInfo.HomeDistance/10; // macht die NC |
// GPSPacket.Heading = GPSInfo.HomeBearing/2; // macht die NC |
// GPSPacket.Speed = (GPSInfo.Speed * 36) / 10; // macht die NC |
// GPSPacket.WarnBeep = HoTT_Waring(); //(wird jetzt weiter oben gemacht) |
if(!GPSPacket.WarnBeep) GPSPacket.m_sec = BuildHoTT_Vario(); else GPSPacket.m_sec = VARIO_ZERO; |
GPSPacket.m_3sec = 120; |
GPSPacket.NumOfSats = GPSInfo.NumOfSats; |
if(GPSInfo.Flags & FLAG_DIFFSOLN) GPSPacket.SatFix = 'D'; |
else |
if(GPSInfo.SatFix == SATFIX_3D) GPSPacket.SatFix = ' '; |
else GPSPacket.SatFix = '!'; |
HoTT_DataPointer = (unsigned char *) &GPSPacket; |
GPSPacket.FreeCharacters[0] = NC_GPS_ModeCharacter; |
GPSPacket.FreeCharacters[2] = GPSPacket.SatFix; |
GPSPacket.HomeDirection = GPSInfo.HomeBearing / 2;//230; |
return(sizeof(GPSPacket)); |
break; |
case HOTT_ELECTRIC_AIR_PACKET_ID: |
GetHottestBl(); |
ElectricAirPacket.Altitude = HoehenWert/100 + 500; |
ElectricAirPacket.Battery1 = UBat; |
ElectricAirPacket.Battery2 = UBat; |
ElectricAirPacket.VoltageCell1 = ErsatzKompassInGrad / 2; |
ElectricAirPacket.VoltageCell8 = ElectricAirPacket.VoltageCell1; |
ElectricAirPacket.VoltageCell6 = GPSInfo.HomeBearing / 2; |
ElectricAirPacket.VoltageCell7 = GPSInfo.HomeDistance/20; |
ElectricAirPacket.VoltageCell13 = ElectricAirPacket.VoltageCell6; |
ElectricAirPacket.VoltageCell14 = ElectricAirPacket.VoltageCell7; |
if(!GPSPacket.WarnBeep) ElectricAirPacket.m_sec = BuildHoTT_Vario(); else ElectricAirPacket.m_sec = VARIO_ZERO; |
ElectricAirPacket.m_3sec = 120; |
ElectricAirPacket.InputVoltage = UBat; |
ElectricAirPacket.Temperature1 = MinBlTemperture + 20; |
ElectricAirPacket.Temperature2 = MaxBlTemperture + 20; |
ElectricAirPacket.Capacity = Capacity.UsedCapacity/10; |
// ElectricAirPacket.WarnBeep = 0;//HoTT_Waring(); |
ElectricAirPacket.WarnBeep = GPSPacket.WarnBeep; |
ElectricAirPacket.Current = Capacity.ActualCurrent; |
HoTT_DataPointer = (unsigned char *) &ElectricAirPacket; |
ElectricAirPacket.FlightTimeMinutes = FlugSekunden / 60; |
ElectricAirPacket.FlightTimeSeconds = FlugSekunden % 60; |
return(sizeof(ElectricAirPacket)); |
break; |
case HOTT_GENERAL_PACKET_ID: |
GetHottestBl(); |
HoTTGeneral.Rpm = GPSInfo.HomeDistance/100; |
HoTTGeneral.VoltageCell1 = ErsatzKompassInGrad / 2; |
HoTTGeneral.VoltageCell2 = KompassValue / 2; |
//HoTTGeneral.VoltageCell3 = Magnetstaerke -> macht NC |
//HoTTGeneral.VoltageCell4 = Inclinition -> macht NC |
HoTTGeneral.VoltageCell5 = DebugOut.Analog[28]; // I2C ErrorCounter |
HoTTGeneral.VoltageCell6 = GPSInfo.HomeBearing / 2; |
if(UBat > BattLowVoltageWarning + 2) HoTTGeneral.FuelPercent = (UBat - (BattLowVoltageWarning + 2)) * 3; |
else HoTTGeneral.FuelPercent = 0; |
if(HoTTGeneral.FuelPercent > 100) HoTTGeneral.FuelPercent = 100; |
HoTTGeneral.FuelCapacity = NC_ErrorCode;//HoehenWert/100; // Oelpegel |
// if(HoTTGeneral.FuelCapacity < 0) HoTTGeneral.FuelCapacity = 0; |
HoTTGeneral.Altitude = HoehenWert/100 + 500; |
HoTTGeneral.Battery1 = UBat; |
HoTTGeneral.Battery2 = UBat; |
if(!GPSPacket.WarnBeep) HoTTGeneral.m_sec = BuildHoTT_Vario(); else HoTTGeneral.m_sec = VARIO_ZERO; |
HoTTGeneral.m_3sec = 120 + GPSPacket.WarnBeep; |
HoTTGeneral.InputVoltage = UBat; |
HoTTGeneral.Temperature1 = MinBlTemperture + 20; |
HoTTGeneral.Temperature2 = MaxBlTemperture + 20; |
HoTTGeneral.Capacity = Capacity.UsedCapacity/10; |
HoTTGeneral.WarnBeep = 0;//HoTT_Waring(); |
HoTTGeneral.Current = Capacity.ActualCurrent; |
//HoTTGeneral.ErrorNumber = HoTTErrorCode(); |
HoTT_DataPointer = (unsigned char *) &HoTTGeneral; |
return(sizeof(HoTTGeneral)); |
break; |
default: return(0); |
} |
} |
//--------------------------------------------------------------- |
void HoTT_Menu(void) |
{ |
static unsigned char line, page = 0,show_current = 0,show_mag = 0, show_poti = 0; |
unsigned char tmp; |
HoTTVarioMeter = (HoTTVarioMeter * 7 + VarioMeter) / 8; |
if(page == 0) |
switch(line++) |
{ |
case 0: |
if(FC_StatusFlags & FC_STATUS_LOWBAT) |
HoTT_printfxy_BLINK(0,0," %2i.%1iV ",UBat/10, UBat%10) |
else |
HoTT_printfxy(0,0," %2i.%1iV ",UBat/10, UBat%10) |
if(Parameter_GlobalConfig & CFG_HOEHENREGELUNG) |
{ |
if(HoehenReglerAktiv) HoTT_printfxy_INV(10,0,"ALT:%4im %c", (int16_t)(HoehenWert/100),VarioCharacter) |
else HoTT_printfxy(10,0,"ALT:%4im ", (int16_t)(HoehenWert/100)) |
} |
else HoTT_printfxy(10,0,"ALT:---- "); |
break; |
case 1: |
if(FC_StatusFlags & FC_STATUS_LOWBAT) |
HoTT_printfxy_BLINK(0,1," %2i:%02i ",FlugSekunden/60,FlugSekunden%60) |
else HoTT_printfxy(0,1," %2i:%02i ",FlugSekunden/60,FlugSekunden%60); |
HoTT_printfxy(10,1,"DIR: %3d%c",ErsatzKompassInGrad, HoTT_GRAD); |
if(FC_StatusFlags2 & FC_STATUS2_CAREFREE) HoTT_printfxy_INV(20,1,"C") else HoTT_printfxy(20,1," "); |
break; |
case 2: |
if(FC_StatusFlags & FC_STATUS_LOWBAT) |
HoTT_printfxy_BLINK(0,2," %5i ",Capacity.UsedCapacity) |
else HoTT_printfxy(0,2," %5i ",Capacity.UsedCapacity); |
HoTT_printfxy(12,2,"I:%2i.%1iA ",Capacity.ActualCurrent/10, Capacity.ActualCurrent%10); |
break; |
case 3: |
HoTT_printfxy(9,0,":"); |
HoTT_printfxy(9,1,":"); |
HoTT_printfxy(9,2,":"); |
HoTT_printfxy(0,3,"---------+-----------"); |
// HoTT_printfxy(0,3,"---------------------"); |
HoTT_printfxy(0,6,"---------------------"); |
break; |
case 4: |
if(NaviDataOkay) |
{ |
HoTT_printfxy(9,4,":"); |
HoTT_printfxy(0,4,"SAT:%2d ",GPSInfo.NumOfSats); |
HoTT_printfxy(10,4,"DIST:%3dm",GPSInfo.HomeDistance/10); |
switch (GPSInfo.SatFix) |
{ |
case SATFIX_3D: |
if(GPSInfo.Flags & FLAG_DIFFSOLN) HoTT_printfxy(7,4,"D ") |
else HoTT_printfxy(7,4,"3D"); |
break; |
default: |
HoTT_printfxy_BLINK(7,4,"!!"); |
break; |
} |
} |
else |
{ |
Hott_ClearLine(4); |
} |
break; |
case 5: |
if(NaviDataOkay) |
{ |
if(show_mag) |
{ |
HoTT_printfxy(0,5,"MAG:%3u%% ",EarthMagneticField); |
HoTT_printfxy(12,5,"HM:%3d%c %c", GPSInfo.HomeBearing, HoTT_GRAD, NC_GPS_ModeCharacter); |
HoTT_printfxy(9,5,"incl:%2d%c(%2i)",EarthMagneticInclination, HoTT_GRAD,EarthMagneticInclinationTheoretic); |
} |
else |
{ |
HoTT_printfxy(0,5," %2um/s: HM:%3d%c %c",GPSInfo.Speed, GPSInfo.HomeBearing, HoTT_GRAD, NC_GPS_ModeCharacter); |
} |
} |
else Hott_ClearLine(5); |
break; |
case 6: |
break; |
case 7: if(NC_ErrorCode) |
{ |
if(HoTTBlink && NC_ErrorCode < MAX_ERR_NUMBER) |
{ |
Hott_ClearLine(7); |
HoTT_printfxy_INV(0,7,"ERR: %2d !",NC_ErrorCode); |
} |
else |
{ |
HoTT_printfxy(0,7,"ERR: "); _printf_P(&LIBFC_HoTT_Putchar, NC_ERROR_TEXT[NC_ErrorCode] , 0);}; |
} |
else |
if(FC_StatusFlags & FC_STATUS_LOWBAT) HoTT_printfxy(1,7,"!! LiPo voltage !!") |
else HoTT_printfxy(0,7," www.MikroKopter.de "); |
break; |
case 8: //ASCIIPacket.WarnBeep = HoTT_Waring(); |
// ASCIIPacket.WarnBeep = Parameter_UserParam1; |
case 9: |
case 10: |
case 11: |
case 12: |
case 13: |
case 14: |
case 15: |
case 16: |
if(HottKeyboard == HOTT_KEY_SET) { if(show_mag) show_mag = 0; else show_mag = 1;} |
else |
if(HottKeyboard == HOTT_KEY_LEFT) { LIBFC_HoTT_Clear(); page = 1; line = 0;}; |
HottKeyboard = 0; |
break; |
default: line = 0; |
break; |
} |
else |
if(page == 1) |
switch(line++) |
{ |
case 0: |
if(FC_StatusFlags & FC_STATUS_LOWBAT) |
HoTT_printfxy_BLINK(0,0," %2i:%02i %2i.%1iV %4imAh",FlugSekunden/60,FlugSekunden%60,UBat/10, UBat%10,Capacity.UsedCapacity) |
else HoTT_printfxy(0,0," %2i:%02i %2i.%1iV %4imAh",FlugSekunden/60,FlugSekunden%60,UBat/10, UBat%10,Capacity.UsedCapacity); |
break; |
case 1: |
HoTT_printfxy(0,1,"DIR:%3d%c",KompassValue, HoTT_GRAD); |
if(Parameter_GlobalConfig & CFG_HOEHENREGELUNG) |
{ |
if(HoehenReglerAktiv) HoTT_printfxy_INV(10,1,"ALT:%4im", (int16_t)(HoehenWert/100)) |
else HoTT_printfxy(10,1,"ALT:%4im", (int16_t)(HoehenWert/100)) |
} |
else HoTT_printfxy(10,1,"ALT:---- "); |
HoTT_printfxy(20,1,"%c",VarioCharacter); |
break; |
case 2: |
if(NaviDataOkay) |
{ |
HoTT_printfxy(1,2,"HM:%3d%c DIST:%3dm %c", GPSInfo.HomeBearing, HoTT_GRAD, GPSInfo.HomeDistance/10, NC_GPS_ModeCharacter); |
} |
else |
{ |
Hott_ClearLine(2); |
} |
break; |
case 3: |
HoTT_printfxy(0,3,"PWR:%2i.%1iA (%iW) ",Capacity.ActualCurrent/10, Capacity.ActualCurrent%10,Capacity.ActualPower); |
if(FC_StatusFlags2 & FC_STATUS2_CAREFREE) HoTT_printfxy_INV(19,3,"CF") else HoTT_printfxy(19,3," "); |
break; |
case 4: |
if(NaviDataOkay) |
{ |
HoTT_printfxy(0,4,"GPS:%2um/s SAT:%d ",GPSInfo.Speed,GPSInfo.NumOfSats); |
switch (GPSInfo.SatFix) |
{ |
case SATFIX_3D: |
HoTT_printfxy(16,4," 3D "); |
break; |
//case SATFIX_2D: |
//case SATFIX_NONE: |
default: |
HoTT_printfxy_BLINK(16,4,"NOFIX"); |
break; |
} |
if(GPSInfo.Flags & FLAG_DIFFSOLN) |
{ |
HoTT_printfxy(16,4,"DGPS "); |
} |
} |
else |
{ //012345678901234567890 |
HoTT_printfxy(0,4," No NaviCtrl "); |
} |
break; |
case 5: |
if(show_current) |
{ |
// HoTT_printfxy(0,5,"%2i.%i %2i.%i %2i.%i %2i.%iA", Motor[0].Current/10,Motor[0].Current%10,Motor[1].Current/10,Motor[1].Current%10,Motor[2].Current/10,Motor[2].Current%10,Motor[3].Current/10,Motor[3].Current%10); |
HoTT_printfxy(0,5,"%2i.%i %2i.%i %2i.%i %2i.%iA", BL3_Current(0)/10,BL3_Current(0)%10,BL3_Current(1)/10,BL3_Current(1)%10,BL3_Current(2)/10,BL3_Current(2)%10,BL3_Current(3)/10,BL3_Current(3)%10); |
} |
else |
{ |
HoTT_printfxy(0,5,"%3i %3i %3i %3i%cC", Motor[0].Temperature, Motor[1].Temperature, Motor[2].Temperature, Motor[3].Temperature,HoTT_GRAD); |
} |
break; |
case 6: |
if(show_current) |
{ |
if(RequiredMotors == 4) Hott_ClearLine(6); |
else |
// if(RequiredMotors == 6) HoTT_printfxy(0,6,"%2i.%i %2i.%iA", Motor[4].Current/10,Motor[4].Current%10,Motor[5].Current/10,Motor[5].Current%10) |
if(RequiredMotors == 6) HoTT_printfxy(0,6,"%2i.%i %2i.%iA", BL3_Current(4)/10,BL3_Current(4)%10, BL3_Current(5)/10,BL3_Current(5)%10) |
else |
// if(RequiredMotors > 6) HoTT_printfxy(0,6,"%2i.%i %2i.%i %2i.%i %2i.%iA", Motor[4].Current/10,Motor[4].Current%10,Motor[5].Current/10,Motor[5].Current%10,Motor[6].Current/10,Motor[6].Current%10,Motor[7].Current/10,Motor[7].Current%10); |
if(RequiredMotors > 6) HoTT_printfxy(0,6,"%2i.%i %2i.%i %2i.%i %2i.%iA", BL3_Current(4)/10,BL3_Current(4)%10,BL3_Current(5)/10,BL3_Current(5)%10,BL3_Current(6)/10,BL3_Current(6)%10,BL3_Current(7)/10,BL3_Current(7)%10,BL3_Current(8)/10,BL3_Current(8)%10); |
} |
else |
{ |
if(RequiredMotors == 4) Hott_ClearLine(6); |
else |
if(RequiredMotors == 6) HoTT_printfxy(0,6,"%3i %3i%cC ", Motor[4].Temperature, Motor[5].Temperature,HoTT_GRAD) |
else |
if(RequiredMotors > 6) HoTT_printfxy(0,6,"%3i %3i %3i %3i%cC", Motor[4].Temperature, Motor[5].Temperature, Motor[6].Temperature, Motor[7].Temperature,HoTT_GRAD); |
} |
break; |
case 7: if(NC_ErrorCode) |
{ |
if(HoTTBlink && NC_ErrorCode < MAX_ERR_NUMBER) |
{ |
Hott_ClearLine(7); |
HoTT_printfxy_INV(0,7,"ERR: %2d !",NC_ErrorCode); |
} |
else |
{ |
HoTT_printfxy(0,7,"ERR: "); _printf_P(&LIBFC_HoTT_Putchar, NC_ERROR_TEXT[NC_ErrorCode] , 0);}; |
} |
else |
if(FC_StatusFlags & FC_STATUS_LOWBAT) HoTT_printfxy(1,7,"!! LiPo voltage !!") |
else HoTT_printfxy(0,7," www.MikroKopter.de "); |
break; |
case 8: // ASCIIPacket.WarnBeep = HoTT_Waring(); |
// ASCIIPacket.WarnBeep = Parameter_UserParam1; |
case 9: |
case 10: |
case 11: |
case 12: |
case 13: |
case 14: |
case 15: |
case 16: |
if(HottKeyboard == HOTT_KEY_SET) { if(show_current) show_current = 0; else show_current = 1; Hott_ClearLine(5); Hott_ClearLine(6);} |
else |
if(HottKeyboard == HOTT_KEY_LEFT) { LIBFC_HoTT_Clear(); page = 2; line = 0;} |
else |
if(HottKeyboard == HOTT_KEY_RIGHT) { LIBFC_HoTT_Clear(); page = 0; line = 0;} |
//if(HottKeyboard) HoTT_printfxy(15,6,"%KEY:%02x ",HottKeyboard); |
HottKeyboard = 0; |
break; |
default: line = 0; |
break; |
} |
else |
if(page == 2) |
switch(line++) |
{ |
case 0: |
HoTT_printfxy_INV(0,0,"Setting:%u %s ",ActiveParamSet,EE_Parameter.Name); |
break; |
case 1: HoTT_printfxy(0,1,"Min:%2i.%1iV %s ",BattLowVoltageWarning/10, BattLowVoltageWarning%10, Mixer.Name); |
break; |
case 2: HoTT_printfxy(0,2,"ALT:"); |
if(Parameter_GlobalConfig & CFG_HOEHENREGELUNG) |
{ |
if(!(EE_Parameter.GlobalConfig & CFG_HOEHEN_SCHALTER)) HoTT_printf("POTI:%3u ", Parameter_HoehenSchalter) |
else |
{ |
if(Parameter_HoehenSchalter > 50) HoTT_printf("(ON) ") else HoTT_printf("(OFF) "); |
if((Parameter_ExtraConfig & CFG2_HEIGHT_LIMIT)) HoTT_printf("LIMIT", Parameter_HoehenSchalter) |
else HoTT_printf("VARIO", Parameter_HoehenSchalter); |
} |
} |
else |
HoTT_printf("DISABLED"); |
break; |
case 3: HoTT_printfxy(0,3,"CF:"); |
if(!EE_Parameter.CareFreeChannel) HoTT_printf("DISABLED") |
else |
{ |
if(CareFree) HoTT_printf(" (ON) ") else HoTT_printf(" (OFF)"); |
if(EE_Parameter.ExtraConfig & CFG_LEARNABLE_CAREFREE) HoTT_printf(" TEACH"); |
} |
break; |
case 4: HoTT_printfxy(0,4,"GPS:"); |
if(!(Parameter_GlobalConfig & CFG_GPS_AKTIV)) HoTT_printf("DISABLED") |
else |
{ |
tmp = GetChannelValue(EE_Parameter.NaviGpsModeChannel); |
if(tmp < 50) HoTT_printf("(FREE)") |
else |
if(tmp >= 180) HoTT_printf("(HOME)") |
else |
if(EE_Parameter.ExtraConfig & CFG_GPS_AID) HoTT_printf("(AID) ") |
else HoTT_printf("(HOLD)") |
} |
if(EE_Parameter.FailSafeTime) HoTT_printfxy(10,4," FS:%usek ",EE_Parameter.FailSafeTime) |
break; |
case 5: HoTT_printfxy(0,5,"HOME ALT:"); |
if(EE_Parameter.ComingHomeAltitude) HoTT_printf("%um",EE_Parameter.ComingHomeAltitude) else HoTT_printf("HOLD "); |
break; |
case 6: |
if(!show_poti) |
{ |
HoTT_printfxy(0,6,"Ni:%4i Ro:%4i C:%3i",PPM_in[EE_Parameter.Kanalbelegung[K_NICK]],PPM_in[EE_Parameter.Kanalbelegung[K_ROLL]], Parameter_ServoNickControl); |
HoTT_printfxy(0,7,"Gs:%4i Ya:%4i ",PPM_in[EE_Parameter.Kanalbelegung[K_GAS]]+127,PPM_in[EE_Parameter.Kanalbelegung[K_GIER]]); |
} |
else |
{ |
HoTT_printfxy(0,6,"P1:%4i P2:%4i 3:%3i",Poti1,Poti2, Poti3); |
HoTT_printfxy(0,7,"P4:%4i P5:%4i 6:%3i",Poti4,Poti5, Poti6); |
} |
break; |
case 7: //HoTT_printfxy(0,6,"WARNINGS:"); |
if(HoTTBlink) |
{ |
LIBFC_HoTT_SetPos(6 * 21); |
if(!(Parameter_GlobalConfig & CFG_ACHSENKOPPLUNG_AKTIV)) HoTT_printf_BLINK("COUPLING OFF! "); |
if(EE_Parameter.BitConfig & (CFG_LOOP_LINKS | CFG_LOOP_RECHTS | CFG_LOOP_UNTEN | CFG_LOOP_OBEN)) HoTT_printf_BLINK("LOOPING! "); |
if(Parameter_GlobalConfig & CFG_HEADING_HOLD) HoTT_printf_BLINK("HH! "); |
if(!(Parameter_GlobalConfig & CFG_KOMPASS_AKTIV)) HoTT_printf_BLINK("COMPASS OFF! "); |
} |
break; |
case 8: //ASCIIPacket.WarnBeep = HoTT_Waring(); |
break; |
case 9: |
case 10: |
case 11: |
case 12: |
case 13: |
case 14: |
case 15: |
case 16: |
if(HottKeyboard == HOTT_KEY_SET) { if(show_poti) show_poti = 0; else show_poti = 1; Hott_ClearLine(6); Hott_ClearLine(7);} |
// else |
// if(HottKeyboard == HOTT_KEY_LEFT) { LIBFC_HoTT_Clear(); page = 3; line = 0;} |
else |
if(HottKeyboard == HOTT_KEY_RIGHT) { LIBFC_HoTT_Clear(); page = 1; line = 0;}; |
HottKeyboard = 0; |
break; |
default: line = 0; |
break; |
} |
/* else |
if(page == 3) |
switch(line++) |
{ |
case 0: |
HoTT_printfxy(0,2,"Speak:"); |
break; |
case 1: |
// if(GetParamByte(PID_SPEAK_HOTT_CFG) & 0x01) |
if(!(GlobalConfig3 & CFG3_SPEAK_ALL) & 0x01)) HoTT_printfxy_INV(7,2,"All Messages ") |
else HoTT_printfxy_INV(7,2,"Warnings only"); |
break; |
case 2: |
HoTT_printfxy(1,4,"Use (set) to select"); |
break; |
default: |
if(HottKeyboard == HOTT_KEY_SET) |
{ |
SetParamByte(PID_SPEAK_HOTT_CFG, GetParamByte(PID_SPEAK_HOTT_CFG) ^ 0x01); |
} |
else |
if(HottKeyboard == HOTT_KEY_RIGHT) { LIBFC_HoTT_Clear(); page = 2; line = 0;}; |
HottKeyboard = 0; |
line = 0; |
break; |
} |
*/ |
else page = 0; |
} |
#endif |
/branches/V2.02a_FirstTrial_Peter/hottmenu.h |
---|
0,0 → 1,234 |
#ifndef _HOTTMENU_H |
#define _HOTTMENU_H |
#if (defined(__AVR_ATmega1284__) || defined(__AVR_ATmega1284P__)) |
#define SPEAK_ERR_CALIBARTION 1 |
#define SPEAK_ERR_RECEICER 2 |
#define SPEAK_ERR_DATABUS 3 |
#define SPEAK_ERR_NAVI 4 |
#define SPEAK_ERROR 5 |
#define SPEAK_ERR_COMPASS 6 |
#define SPEAK_ERR_SENSOR 7 |
#define SPEAK_ERR_GPS 8 |
#define SPEAK_ERR_MOTOR 9 |
#define SPEAK_MAX_TEMPERAT 10 |
#define SPEAK_ALTI_REACHED 11 |
#define SPEAK_WP_REACHED 12 |
#define SPEAK_NEXT_WP 13 |
#define SPEAK_LANDING 14 |
#define SPEAK_GPS_FIX 15 |
#define SPEAK_UNDERVOLTAGE 16 |
#define SPEAK_GPS_HOLD 17 |
#define SPEAK_GPS_HOME 18 |
#define SPEAK_GPS_OFF 19 |
#define SPEAK_BEEP 20 |
#define SPEAK_MIKROKOPTER 21 |
#define SPEAK_CAPACITY 22 |
#define SPEAK_CF_OFF 23 |
#define SPEAK_CALIBRATE 24 |
#define SPEAK_MAX_RANGE 25 |
#define SPEAK_MAX_ALTITUD 26 |
#define SPEAK_MK_OFF 38 |
#define SPEAK_ALTITUDE_ON 39 |
#define SPEAK_ALTITUDE_OFF 40 |
#define SPEAK_CF_ON 46 |
#define SPEAK_SINKING 47 |
#define SPEAK_RISING 48 |
#define SPEAK_HOLDING 49 |
#define SPEAK_GPS_ON 50 |
#define SPEAK_FOLLWING 51 |
#define SPEAK_STARTING 52 |
#define MAX_ERR_NUMBER (32+1) |
extern const char PROGMEM NC_ERROR_TEXT[MAX_ERR_NUMBER][17]; |
extern unsigned char NaviData_WaypointIndex, NaviData_WaypointNumber, NaviData_TargetHoldTime; |
extern unsigned int NaviData_TargetDistance; |
extern unsigned char MaxBlTemperture; |
extern unsigned char MinBlTemperture; |
extern unsigned char HottestBl; |
extern unsigned char HottKeyboard,HoTT_RequestedSensor; |
extern unsigned char HottUpdate(unsigned char key); |
extern unsigned char SpeakHoTT,ShowSettingNameTime; |
extern unsigned char ToNC_SpeakHoTT; |
extern volatile unsigned char *HoTT_DataPointer; |
extern void CreateHoTT_Menu(void); |
extern void LIBFC_HoTT_Putchar(char); |
extern void LIBFC_HoTT_Putchar_INV(char); // print Invers |
extern void LIBFC_HoTT_Putchar_BLINK(char); |
extern void LIBFC_HoTT_SetPos(unsigned char); |
extern void LIBFC_HoTT_Clear(void); |
extern void NC_Fills_HoTT_Telemety(void); |
extern void HoTT_Menu(void); |
extern unsigned char HoTT_Telemety(unsigned char); |
extern unsigned char HoTT_Waring(void); |
extern volatile unsigned char HoTTBlink; |
extern void GetHottestBl(void); |
typedef struct |
{ |
unsigned char StartByte; // 0x7C |
unsigned char Packet_ID; // HOTT_GENERAL_PACKET_ID |
unsigned char WarnBeep; // 3 Anzahl der Töne 0..36 |
unsigned char SensorID; // 4 0xD0 |
unsigned char InverseStatus1; // 5 |
unsigned char InverseStatus2; // 6 |
unsigned char VoltageCell1; // 7 208 = 4,16V (Voltage * 50 = Wert) |
unsigned char VoltageCell2; // 8 209 = 4,18V |
unsigned char VoltageCell3; // 9 |
unsigned char VoltageCell4; // 10 |
unsigned char VoltageCell5; // 11 |
unsigned char VoltageCell6; // 12 |
unsigned int Battery1; // 13+14 51 = 5,1V |
unsigned int Battery2; // 15+16 51 = 5,1V |
unsigned char Temperature1; // 17 44 = 24°C, 0 = -20°C |
unsigned char Temperature2; // 18 44 = 24°C, 0 = -20°C |
unsigned char FuelPercent; // 19 |
signed int FuelCapacity; // 20+21 |
unsigned int Rpm; // 22+23 |
signed int Altitude; // 24+25 |
unsigned int m_sec; // 26+27 3000 = 0 |
unsigned char m_3sec; // 28 120 = 0 |
unsigned int Current; // 29+30 1 = 0.1A |
unsigned int InputVoltage; // 31+32 66 = 6,6V |
unsigned int Capacity; // 33+34 1 = 10mAh |
unsigned int Speed; // 35+36 |
unsigned char LowestCellVoltage; // 37 |
unsigned char LowestCellNumber; // 38 |
unsigned int Rpm2; // 39+40 |
unsigned char ErrorNumber; // 41 |
unsigned char Pressure; // 42 in 0,1bar 20=2,0bar |
unsigned char Version; // 43 |
unsigned char EndByte; // 0x7D |
} HoTTGeneral_t; |
typedef struct |
{ |
unsigned char StartByte; // 0x7C |
unsigned char Packet_ID; // HOTT_ELECTRIC_AIR_PACKET_ID |
unsigned char WarnBeep; // Anzahl der Töne 0..36 |
unsigned char SensorID; // 4 0xE0 |
unsigned char InverseStatus1; // 5 |
unsigned char InverseStatus2; // 6 |
unsigned char VoltageCell1; // 7 208 = 4,16V (Voltage * 50 = Wert) |
unsigned char VoltageCell2; // 209 = 4,18V |
unsigned char VoltageCell3; // |
unsigned char VoltageCell4; // |
unsigned char VoltageCell5; // |
unsigned char VoltageCell6; // |
unsigned char VoltageCell7; // |
unsigned char VoltageCell8; // |
unsigned char VoltageCell9; // |
unsigned char VoltageCell10; // |
unsigned char VoltageCell11; // |
unsigned char VoltageCell12; // |
unsigned char VoltageCell13; // |
unsigned char VoltageCell14; // 20 |
unsigned int Battery1; // 21+22 51 = 5,1V |
unsigned int Battery2; // 23+24 51 = 5,1V |
unsigned char Temperature1; // 25 44 = 24°C, 0 = -20°C |
unsigned char Temperature2; // 26 44 = 24°C, 0 = -20°C |
signed int Altitude; // 27+28 |
unsigned int Current; // 29+30 1 = 0.1A |
unsigned int InputVoltage; // 31+32 66 = 6,6V |
unsigned int Capacity; // 33+34 1 = 10mAh |
unsigned int m_sec; // 35+36 30000 = 0 |
unsigned char m_3sec; // 37 120 = 0 |
unsigned int Rpm; // 38+39 |
unsigned char FlightTimeMinutes; // 40 |
unsigned char FlightTimeSeconds; // 41 |
unsigned char Speed; // 42 1=2km |
unsigned char Version; // 43 0x00 |
unsigned char EndByte; // 0x7D |
} ElectricAirPacket_t; |
typedef struct |
{ |
unsigned char StartByte; // 0x7C |
unsigned char Packet_ID; // 0x89 - Vario ID |
unsigned char WarnBeep; //3 // Anzahl der Töne 0..36 |
unsigned char SensorID; // 0x90 |
unsigned char InverseStatus; |
signed int Altitude; //6+7 // 500 = 0m |
signed int MaxAltitude; //8+9 // 500 = 0m |
signed int MinAltitude; //10+11 // 500 = 0m |
unsigned int m_sec; //12+13 // 3000 = 0 |
unsigned int m_3sec; //14+15 |
unsigned int m_10sec; //26+17 |
char Text[21]; //18-38 |
char FreeCharacters[3]; // 39-41 |
unsigned char NullByte; // 42 0x00 |
unsigned char Version; // 43 |
unsigned char EndByte; // 0x7D |
} VarioPacket_t; |
typedef struct |
{ |
unsigned char StartByte; //0 // 0x7C |
unsigned char Packet_ID; //1 // 0x8A - GPS ID |
unsigned char WarnBeep; //2 // Anzahl der Töne 0..36 |
unsigned char SensorID; // 4 0xA0 |
unsigned char InverseStatus1; // 5 |
unsigned char InverseStatus2; // 6 |
unsigned char Heading; //7 // 1 = 2° |
unsigned int Speed; //8+9 // in km/h |
unsigned char Lat_North; //10 |
unsigned char Lat_G; //11 |
unsigned char Lat_M; //12 |
unsigned char Lat_Sek1; //13 |
unsigned char Lat_Sek2; //14 |
unsigned char Lon_East; //15 |
unsigned char Lon_G; //16 |
unsigned char Lon_M; //17 |
unsigned char Lon_Sek1; //18 |
unsigned char Lon_Sek2; //19 |
unsigned int Distance; //20+21 // 9000 = 0m |
signed int Altitude; //22+23 // 500 = 0m |
unsigned int m_sec; //24+25 // 3000 = 0 |
unsigned char m_3sec; //26 120 = 0 |
unsigned char NumOfSats; //27 |
unsigned char SatFix; //28 |
unsigned char HomeDirection; // 29 |
unsigned char AngleX; // 30 |
unsigned char AngleY; // 31 |
unsigned char AngleZ; // 32 |
signed int GyroX; //33+34 |
signed int GyroY; //35+36 |
signed int GyroZ; //37+38 |
unsigned char Vibration; // 39 |
char FreeCharacters[3]; // 40-42 |
unsigned char Version; // 43 |
unsigned char EndByte; // 0x7D |
} GPSPacket_t; |
typedef struct |
{ |
unsigned char StartByte; // 0x7B |
unsigned char Packet_ID; // |
unsigned char WarnBeep; // Anzahl der Töne 0..36 |
char Text[8*21]; |
unsigned char EndByte; // 0x7D |
} ASCIIPacket_t; |
extern GPSPacket_t GPSPacket; |
extern VarioPacket_t VarioPacket; |
extern ASCIIPacket_t ASCIIPacket; |
extern ElectricAirPacket_t ElectricAirPacket; |
extern HoTTGeneral_t HoTTGeneral; |
#define HOTT_VARIO_PACKET_ID 0x89 |
#define HOTT_GPS_PACKET_ID 0x8A |
#define HOTT_ELECTRIC_AIR_PACKET_ID 0x8E |
#define HOTT_GENERAL_PACKET_ID 0x8D |
#define JETI_GPS_PACKET_ID1 0x01 |
#define JETI_GPS_PACKET_ID2 0x02 |
#endif |
#endif |
/branches/V2.02a_FirstTrial_Peter/isqrt.S |
---|
0,0 → 1,203 |
;-----------------------------------------------------------------------------; |
; Fast integer squareroot routines for avr-gcc project (C)ChaN, 2008 |
; http://elm-chan.org/docs/avrlib/sqrt32.S |
;-----------------------------------------------------------------------------; |
; uint16_t isqrt32 (uint32_t n); |
; uint8_t isqrt16 (uint16_t n); |
; uint16_t ihypot (int16_t x, int16_t y); |
;-----------------------------------------------------------------------------: |
; 32bit integer squareroot |
;-----------------------------------------------------------------------------; |
; uint16_t isqrt32 ( |
; uint32_t n |
; ); |
; |
; Return Value: |
; Squareroot of n. |
; |
; Size = 53 words |
; Clock = 532..548 cycles |
; Stack = 0 byte |
.global isqrt32 |
.func isqrt32 |
isqrt32: |
clr r0 |
clr r18 |
clr r19 |
clr r20 |
ldi r21, 1 |
clr r27 |
clr r30 |
clr r31 |
ldi r26, 16 |
1: lsl r22 |
rol r23 |
rol r24 |
rol r25 |
rol r0 |
rol r18 |
rol r19 |
rol r20 |
lsl r22 |
rol r23 |
rol r24 |
rol r25 |
rol r0 |
rol r18 |
rol r19 |
rol r20 |
brpl 2f |
add r0, r21 |
adc r18, r27 |
adc r19, r30 |
adc r20, r31 |
rjmp 3f |
2: sub r0, r21 |
sbc r18, r27 |
sbc r19, r30 |
sbc r20, r31 |
3: lsl r21 |
rol r27 |
rol r30 |
andi r21, 0b11111000 |
ori r21, 0b00000101 |
sbrc r20, 7 |
subi r21, 2 |
dec r26 |
brne 1b |
lsr r30 |
ror r27 |
ror r21 |
lsr r30 |
ror r27 |
ror r21 |
mov r24, r21 |
mov r25, r27 |
ret |
.endfunc |
;-----------------------------------------------------------------------------: |
; 16bit integer squareroot |
;-----------------------------------------------------------------------------; |
; uint8_t isqrt16 ( |
; uint16_t n |
; ); |
; |
; Return Value: |
; Squareroot of n. |
; |
; Size = 33 words |
; Clock = 181..189 cycles |
; Stack = 0 byte |
.global isqrt16 |
.func isqrt16 |
isqrt16: |
clr r18 |
clr r19 |
ldi r20, 1 |
clr r21 |
ldi r22, 8 |
1: lsl r24 |
rol r25 |
rol r18 |
rol r19 |
lsl r24 |
rol r25 |
rol r18 |
rol r19 |
brpl 2f |
add r18, r20 |
adc r19, r21 |
rjmp 3f |
2: sub r18, r20 |
sbc r19, r21 |
3: lsl r20 |
rol r21 |
andi r20, 0b11111000 |
ori r20, 0b00000101 |
sbrc r19, 7 |
subi r20, 2 |
dec r22 |
brne 1b |
lsr r21 |
ror r20 |
lsr r21 |
ror r20 |
mov r24, r20 |
ret |
.endfunc |
;-----------------------------------------------------------------------------: |
; 16bit integer hypot (megaAVR is required) |
;-----------------------------------------------------------------------------; |
; uint16_t ihypot ( |
; int16_t x, |
; int16_t y |
; ); |
; |
; Return Value: |
; Squareroot of (x*x + y*y) |
; |
; Size = 42 words |
; Clock = 581..597 cycles |
; Stack = 0 byte |
.global ihypot |
.func ihypot |
ihypot: |
clr r26 |
sbrs r25, 7 |
rjmp 1f |
com r24 |
com r25 |
adc r24, r26 |
adc r25, r26 |
1: sbrs r23, 7 |
rjmp 2f |
com r22 |
com r23 |
adc r22, r26 |
adc r23, r26 |
2: mul r22, r22 |
movw r18, r0 |
mul r23, r23 |
movw r20, r0 |
mul r22, r23 |
add r19, r0 |
adc r20, r1 |
adc r21, r26 |
add r19, r0 |
adc r20, r1 |
adc r21, r26 |
mul r24, r24 |
movw r30, r0 |
mul r25, r25 |
add r18, r30 |
adc r19, r31 |
adc r20, r0 |
adc r21, r1 |
mul r24, r25 |
add r19, r0 |
adc r20, r1 |
adc r21, r26 |
add r19, r0 |
adc r20, r1 |
adc r21, r26 |
movw r24, r20 |
movw r22, r18 |
clr r1 |
rjmp isqrt32 |
.endfunc |
/branches/V2.02a_FirstTrial_Peter/isqrt.h |
---|
0,0 → 1,11 |
#ifndef _ISQRT_H |
#define _ISQRT_H |
#include <inttypes.h> |
// coded in assembler file |
extern uint16_t isqrt32(uint32_t n); |
extern uint8_t isqrt16(uint16_t n); |
extern uint16_t ihypot(int16_t x, int16_t y); |
#endif // _ISQRT_H |
/branches/V2.02a_FirstTrial_Peter/jeti_ex.c |
---|
0,0 → 1,144 |
#include "libfc.h" |
#include "printf_P.h" |
#include "main.h" |
#include "spi.h" |
#include "capacity.h" |
#include "jeti_ex.h" |
#include "hottmenu.h" |
#if (defined(__AVR_ATmega1284__) || defined(__AVR_ATmega1284P__)) |
const char PROGMEM JETI_CODE[53] = |
{ |
0, // 0 |
'O', // SPEAK_ERR_CALIBARTION 1 |
'P', // SPEAK_ERR_RECEICER 2 |
'Q', // SPEAK_ERR_DATABUS 3 |
'R', // SPEAK_ERR_NAVI 4 |
'S', // SPEAK_ERROR 5 |
'T', // SPEAK_ERR_COMPASS 6 |
'S', // SPEAK_ERR_SENSOR 7 |
'V', // SPEAK_ERR_GPS 8 |
'W', // SPEAK_ERR_MOTOR 9 |
'H', // SPEAK_MAX_TEMPERAT 10 |
0, // SPEAK_ALTI_REACHED 11 |
'X', // SPEAK_WP_REACHED 12 |
'Y', // SPEAK_NEXT_WP 13 |
0, // SPEAK_LANDING 14 |
'Z', // SPEAK_GPS_FIX 15 |
'U', // SPEAK_UNDERVOLTAGE 16 |
'E', // SPEAK_GPS_HOLD 17 |
'F', // SPEAK_GPS_HOME 18 |
'G', // SPEAK_GPS_OFF 19 |
'H', // SPEAK_BEEP 20 |
'A', // SPEAK_MIKROKOPTER 21 |
0, // SPEAK_CAPACITY 22 |
'I', // SPEAK_CF_OFF 23 |
'B', // SPEAK_CALIBRATE 24 |
'J', // SPEAK_MAX_RANGE 25 |
'J', // SPEAK_MAX_ALTITUD 26 |
0, // 27 |
0, // 28 |
0, // 29 |
0, // 30 |
0, // 31 |
0, // 32 |
0, // 33 |
0, // 34 |
0, // 35 |
0, // 36 |
0, // 37 |
'D', // SPEAK_MK_OFF 38 |
'L', // SPEAK_ALTITUDE_ON 39 |
'M', // SPEAK_ALTITUDE_OFF 40 |
0, // 41 |
0, // 42 |
0, // 43 |
0, // 44 |
0, // 45 |
'N', // SPEAK_CF_ON 46 |
0, // SPEAK_SINKING 47 |
0, // SPEAK_RISING 48 |
0, // SPEAK_HOLDING 49 |
'K', // SPEAK_GPS_ON 50 |
0, // SPEAK_FOLLWING 51 |
'C' // SPEAK_STARTING 52 |
}; |
JetiExPacket_t JetiExData[JETI_EX_PARAMETER_COUNT + 1] = // Parameter count + DeviceName (ID0) |
{ |
// Label[10] unit[3], data type, Data , position of decimal point |
// "1234567890", "123", |
// { "-=.M_K.=-" , " ", 1, 0 , 0 }, // first one is device name // datatype 1 = -8192...8192 |
{ "MK " , " ", 1, 0 , 0 }, // first one is device name // datatype 1 = -8192...8192 |
{ "Voltage " , "V ", 1, 0 , 1 }, // ID 1 |
{ "Current " , "A ", 1, 0 , 1 }, // ID 2 |
{ "Capacity " , "Ah ", 1, 0 , 2 }, // ID 3 |
{ "Altitude " , "m ", 1, 0 , 0 }, // ID 4 |
{ "Compass " , "° ", 1, 0 , 0 }, // ID 5 |
{ "Sats " , " ", 1, 0 , 0 }, // ID 6 |
{ "Speed " , "m/s", 1, 0 , 0 }, // ID 7 |
{ "Distance " , "m ", 1, 0 , 0 }, // ID 8 |
{ "Home-Dir " , "° ", 1, 0 , 0 }, // ID 9 |
{ "max.Temp. " , "°C ", 1, 0 , 0 }, // ID 10 |
{ "Magn.field" , "% ", 1, 0 , 0 }, // ID 11 |
{ "Vario " , " ", 1, 0 , 0 }, // ID 12 |
{ "ErrorCode " , " ", 1, 0 , 0 }, // ID 13 |
{ "Latitude " , " ", 9, 0 , 0 }, // ID 14 special data type for coordinates Import: fixed position in list ID 14 - DO NOT MOVE !!! |
{ "Longitude " , " ", 9, 0 , 0 }, // ID 15 special data type for coordinates Import: fixed position in list ID 15 - DO NOT MOVE !!! |
}; |
void BuildJeti_Vario(void) |
{ |
signed int tmp = 0; |
static signed int JetiVarioMeter = 0; |
JetiVarioMeter = (JetiVarioMeter * 3 + VarioMeter) / 4; |
if(VarioCharacter == '+') |
{ |
tmp = (AltitudeSetpointTrimming * EE_Parameter.Hoehe_Verstaerkung) / 32 + 5; |
} |
else |
if(VarioCharacter == '-') |
{ |
tmp = (AltitudeSetpointTrimming * EE_Parameter.Hoehe_Verstaerkung) / 32 - 5; |
} |
else |
if((VarioCharacter == ' ') && (FC_StatusFlags & FC_STATUS_FLY)) |
{ |
tmp = (JetiVarioMeter/32); |
} |
else |
if(VarioCharacter == '^') tmp = FromNC_AltitudeSpeed; |
else |
if(VarioCharacter == 'v') tmp = tmp - FromNC_AltitudeSpeed; |
JetiExData[12].Value = tmp; |
} |
// -------------------------------------------------------------------------------------------------- |
void JetiEX_Update(void) |
{ |
GetHottestBl(); |
JetiExData[1].Value = UBat; |
JetiExData[2].Value = Capacity.ActualCurrent; |
JetiExData[3].Value = Capacity.UsedCapacity / 10; |
JetiExData[4].Value = HoehenWert / 100; |
JetiExData[5].Value = KompassValue; |
JetiExData[6].Value = GPSInfo.NumOfSats; |
JetiExData[7].Value = GPSInfo.Speed; |
JetiExData[8].Value = GPSInfo.HomeDistance / 10; |
JetiExData[9].Value = GPSInfo.HomeBearing; |
JetiExData[10].Value = MaxBlTemperture; |
JetiExData[11].Value = EarthMagneticField; |
// JetiExData[12].Value = Vario; // wird in BuildJeti_Vario() gemacht |
JetiExData[13].Value = NC_ErrorCode; |
//JetiExData[14].Value = 53 * 0x10000 + 23467; // GPS-Latitude (macht NC_Fills_HoTT_Telemety() ) |
//JetiExData[15].Value = 7 * 0x10000 + 23467; // GPS-Longitude (macht NC_Fills_HoTT_Telemety() ) |
} |
#endif |
/branches/V2.02a_FirstTrial_Peter/jeti_ex.h |
---|
0,0 → 1,37 |
#ifndef _JETI_EX_H |
#define _JETI_EX_H |
#if (defined(__AVR_ATmega1284__) || defined(__AVR_ATmega1284P__)) |
extern void BuildJeti_Vario(void); |
// define here how many Jeti EX parameters should be transmitted (max. = 15) |
// |
#define JETI_EX_PARAMETER_COUNT 15 |
// |
// ------------------------------------------------------------------------- |
extern const char PROGMEM JETI_CODE[53]; |
typedef struct |
{ |
char Label[10]; |
char Unit[3]; |
unsigned char DataType; |
long Value; |
unsigned char DecimalPointPos; |
} JetiExPacket_t; |
extern JetiExPacket_t JetiExData[]; |
extern void JetiEX_Update(void); |
#if (JETI_EX_PARAMETER_COUNT > 15) |
#error "ERROR: Too many Jeti EX parameters (max. allowed 15)" |
#endif |
#endif |
#endif //_JETI_EX_H |
/branches/V2.02a_FirstTrial_Peter/jetimenu.c |
---|
0,0 → 1,267 |
// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
// + Software Nutzungsbedingungen (english version: see below) |
// + www.MikroKopter.com |
// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
// + der Fa. HiSystems GmbH, Flachsmeerstrasse 2, 26802 Moormerland - nachfolgend Lizenzgeber genannt - |
// + Der Lizenzgeber räumt dem Kunden ein nicht-ausschließliches, zeitlich und räumlich* unbeschränktes Recht ein, die im den |
// + Mikrocontroller verwendete Firmware für die Hardware Flight-Ctrl, Navi-Ctrl, BL-Ctrl, MK3Mag & PC-Programm MikroKopter-Tool |
// + - nachfolgend Software genannt - nur für private Zwecke zu nutzen. |
// + Der Einsatz dieser Software ist nur auf oder mit Produkten des Lizenzgebers zulässig. |
// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
// + Die vom Lizenzgeber gelieferte Software ist urheberrechtlich geschützt. Alle Rechte an der Software sowie an sonstigen im |
// + Rahmen der Vertragsanbahnung und Vertragsdurchführung überlassenen Unterlagen stehen im Verhältnis der Vertragspartner ausschließlich dem Lizenzgeber zu. |
// + Die in der Software enthaltenen Copyright-Vermerke, Markenzeichen, andere Rechtsvorbehalte, Seriennummern sowie |
// + sonstige der Programmidentifikation dienenden Merkmale dürfen vom Kunden nicht verändert oder unkenntlich gemacht werden. |
// + Der Kunde trifft angemessene Vorkehrungen für den sicheren Einsatz der Software. Er wird die Software gründlich auf deren |
// + Verwendbarkeit zu dem von ihm beabsichtigten Zweck testen, bevor er diese operativ einsetzt. |
// + Die Haftung des Lizenzgebers wird - soweit gesetzlich zulässig - begrenzt in Höhe des typischen und vorhersehbaren |
// + Schadens. Die gesetzliche Haftung bei Personenschäden und nach dem Produkthaftungsgesetz bleibt unberührt. Dem Lizenzgeber steht jedoch der Einwand |
// + des Mitverschuldens offen. |
// + Der Kunde trifft angemessene Vorkehrungen für den Fall, dass die Software ganz oder teilweise nicht ordnungsgemäß arbeitet. |
// + Er wird die Software gründlich auf deren Verwendbarkeit zu dem von ihm beabsichtigten Zweck testen, bevor er diese operativ einsetzt. |
// + Der Kunde wird er seine Daten vor Einsatz der Software nach dem Stand der Technik sichern. |
// + Der Kunde ist darüber unterrichtet, dass der Lizenzgeber seine Daten im zur Vertragsdurchführung erforderlichen Umfang |
// + und auf Grundlage der Datenschutzvorschriften erhebt, speichert, verarbeitet und, sofern notwendig, an Dritte übermittelt. |
// + *) Die räumliche Nutzung bezieht sich nur auf den Einsatzort, nicht auf die Reichweite der programmierten Software. |
// + #### ENDE DER NUTZUNGSBEDINGUNGEN ####' |
// + Hinweis: Informationen über erweiterte Nutzungsrechte (wie z.B. Nutzung für nicht-private Zwecke) sind auf Anfrage per Email an info(@)hisystems.de verfügbar. |
// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
// + Software LICENSING TERMS |
// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
// + of HiSystems GmbH, Flachsmeerstrasse 2, 26802 Moormerland, Germany - the Licensor - |
// + The Licensor grants the customer a non-exclusive license to use the microcontroller firmware of the Flight-Ctrl, Navi-Ctrl, BL-Ctrl, and MK3Mag hardware |
// + (the Software) exclusively for private purposes. The License is unrestricted with respect to time and territory*. |
// + The Software may only be used with the Licensor's products. |
// + The Software provided by the Licensor is protected by copyright. With respect to the relationship between the parties to this |
// + agreement, all rights pertaining to the Software and other documents provided during the preparation and execution of this |
// + agreement shall be the property of the Licensor. |
// + The information contained in the Software copyright notices, trademarks, other legal reservations, serial numbers and other |
// + features that can be used to identify the program may not be altered or defaced by the customer. |
// + The customer shall be responsible for taking reasonable precautions |
// + for the safe use of the Software. The customer shall test the Software thoroughly regarding its suitability for the |
// + intended purpose before implementing it for actual operation. The Licensor's liability shall be limited to the extent of typical and |
// + foreseeable damage to the extent permitted by law, notwithstanding statutory liability for bodily injury and product |
// + liability. However, the Licensor shall be entitled to the defense of contributory negligence. |
// + The customer will take adequate precautions in the case, that the software is not working properly. The customer will test |
// + the software for his purpose before any operational usage. The customer will backup his data before using the software. |
// + The customer understands that the Licensor collects, stores and processes, and, where required, forwards, customer data |
// + to third parties to the extent necessary for executing the agreement, subject to applicable data protection and privacy regulations. |
// + *) The territory aspect only refers to the place where the Software is used, not its programmed range. |
// + #### END OF LICENSING TERMS #### |
// + Note: For information on license extensions (e.g. commercial use), please contact us at info(@)hisystems.de. |
// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
#include "jetimenu.h" |
#include "libfc.h" |
#include "printf_P.h" |
#include "main.h" |
#include "spi.h" |
#include "capacity.h" |
#include "hottmenu.h" |
#define JETIBOX_KEY_RIGHT 0x1F |
#define JETIBOX_KEY_UP 0x2F |
#define JETIBOX_KEY_DOWN 0x4F |
#define JETIBOX_KEY_LEFT 0x8F |
#define JETIBOX_KEY_NONE 0x0F |
#define JETIBOX_KEY_UNDEF 0x00 |
#define JetiBox_printfxy(x,y,format, args...) { LIBFC_JetiBox_SetPos(y * 16 + x); _printf_P(&LIBFC_JetiBox_Putchar, PSTR(format) , ## args);} |
#define JetiBox_printf(format, args...) { _printf_P(&LIBFC_JetiBox_Putchar, PSTR(format) , ## args);} |
// ----------------------------------------------------------- |
// the menu functions |
// ----------------------------------------------------------- |
void Menu_Status(uint8_t key) |
{ //0123456789ABCDEF |
#if !defined (RECEIVER_SPEKTRUM_DX7EXP) && !defined (RECEIVER_SPEKTRUM_DX8EXP) |
JetiBox_printfxy(0,0,"%2i.%1iV",UBat/10, UBat%10); |
if(NaviDataOkay) |
{ |
JetiBox_printfxy(6,0,"%3d%c %03dm%c",ErsatzKompassInGrad, 0xDF, GPSInfo.HomeDistance/10,NC_GPS_ModeCharacter); |
} |
else |
{ |
JetiBox_printfxy(6,0,"Status"); |
} |
#if (defined(__AVR_ATmega1284__) || defined(__AVR_ATmega1284P__)) |
if(NC_ErrorCode) |
{ |
static unsigned int timer; |
static char toggle = 1; |
if(CheckDelay(timer)) { if(toggle) toggle = 0; else toggle = 1; timer = SetDelay(1500);}; |
if(toggle) |
{ |
LIBFC_JetiBox_SetPos(0); |
_printf_P(&LIBFC_JetiBox_Putchar, NC_ERROR_TEXT[NC_ErrorCode] , 0); |
} |
else |
{ |
JetiBox_printfxy(6,0,"ERROR: %2d ",NC_ErrorCode); |
// if(MotorenEin) JetiBeep = 'O'; |
} |
} |
else |
if(ShowSettingNameTime) |
{ |
LIBFC_JetiBox_Clear(); |
JetiBox_printfxy(0,1,"Set%d:%s ",ActiveParamSet,EE_Parameter.Name); |
return; // nichts weiter ausgeben |
} |
#else |
if(NC_ErrorCode) { JetiBox_printfxy(6,0,"ERROR: %2d ",NC_ErrorCode); if(MotorenEin) JetiBeep = 'S';}; |
#endif |
JetiBox_printfxy(0,1,"%4i %2i:%02i",Capacity.UsedCapacity,FlugSekunden/60,FlugSekunden%60); |
if(Parameter_GlobalConfig & CFG_HOEHENREGELUNG) |
{ |
JetiBox_printfxy(10,1,"%4im%c", (int16_t)(HoehenWert/100),VarioCharacter); |
} |
#endif |
} |
void Menu_Temperature(uint8_t key) |
{ //0123456789ABCDEF |
#if !defined (RECEIVER_SPEKTRUM_DX7EXP) && !defined (RECEIVER_SPEKTRUM_DX8EXP) |
JetiBox_printfxy(0,0,"%3i %3i %3i %3i", Motor[0].Temperature, Motor[1].Temperature, Motor[2].Temperature, Motor[3].Temperature); |
JetiBox_printfxy(0,1,"%3i %3i %3i %3i", Motor[4].Temperature, Motor[5].Temperature, Motor[6].Temperature, Motor[7].Temperature); |
if(RequiredMotors <= 4) |
{ |
JetiBox_printfxy(0,1,"Temperatures "); |
} |
else |
if(RequiredMotors <= 6) |
{ |
JetiBox_printfxy(8,1,"\%cC ",0xdf); |
} |
#endif |
} |
void Menu_Battery(uint8_t key) |
{ //0123456789ABCDEF |
#if !defined (RECEIVER_SPEKTRUM_DX7EXP) && !defined (RECEIVER_SPEKTRUM_DX8EXP) |
JetiBox_printfxy(0,0,"%2i.%1iV %3i.%1iA", UBat/10, UBat%10, Capacity.ActualCurrent/10, Capacity.ActualCurrent%10); |
JetiBox_printfxy(0,1,"%4iW %6imAh",Capacity.ActualPower, Capacity.UsedCapacity); |
#endif |
} |
void Magnet_Values(uint8_t key) |
{ //0123456789ABCDEF |
#if !defined (RECEIVER_SPEKTRUM_DX7EXP) && !defined (RECEIVER_SPEKTRUM_DX8EXP) |
JetiBox_printfxy(0,0,"Magnet:%3i%% %3i%c",EarthMagneticField, KompassValue,0xDF); |
JetiBox_printfxy(0,1,"Incli.:%3i%c (%i) ",EarthMagneticInclination, 0xDF,EarthMagneticInclinationTheoretic); |
#endif |
} |
void Menu_PosInfo(uint8_t key) |
{ |
#if !defined (RECEIVER_SPEKTRUM_DX7EXP) && !defined (RECEIVER_SPEKTRUM_DX8EXP) |
if(NaviDataOkay) |
{ |
JetiBox_printfxy(0,0,"%2um/s Sat:%d ",GPSInfo.Speed,GPSInfo.NumOfSats); |
switch (GPSInfo.SatFix) |
{ |
case SATFIX_3D: |
JetiBox_printfxy(12,0," 3D"); |
break; |
// case SATFIX_2D: |
// case SATFIX_NONE: |
default: |
JetiBox_printfxy(12,0,"NoFx"); |
break; |
} |
if(GPSInfo.Flags & FLAG_DIFFSOLN) |
{ |
JetiBox_printfxy(12,0,"DGPS"); |
} |
JetiBox_printfxy(0,1,"Home:%3dm %3d%c %c", GPSInfo.HomeDistance/10, GPSInfo.HomeBearing, 0xDF,NC_GPS_ModeCharacter); |
} |
else |
{ //0123456789ABCDEF |
JetiBox_printfxy(2,0,"No NaviCtrl!"); |
} |
#endif |
} |
// ----------------------------------------------------------- |
// the menu topology |
// ----------------------------------------------------------- |
typedef void (*pFctMenu) (uint8_t); // the menu item handler function pointer |
typedef struct{ |
int8_t left; |
int8_t right; |
int8_t up; |
int8_t down; |
pFctMenu pHandler; |
} MENU_ENTRY; |
// the menu navigation structure |
/* | |
3 - 0 - 1 - 2 - 3 - 0 |
*/ |
const MENU_ENTRY JetiBox_Menu[] PROGMEM= |
{ // l r u d pHandler |
#if !defined (RECEIVER_SPEKTRUM_DX7EXP) && !defined (RECEIVER_SPEKTRUM_DX8EXP) |
{4, 1, 0, 0, &Menu_Status }, // 0 |
{0, 2, 1, 1, &Menu_Temperature }, // 1 |
{1, 3, 2, 2, &Menu_Battery }, // 2 |
{2, 4, 3, 3, &Menu_PosInfo }, // 3 |
{3, 0, 4, 4, &Magnet_Values } // 4 |
#endif |
}; |
// ----------------------------------------------------------- |
// Update display buffer |
// ----------------------------------------------------------- |
unsigned char JetiBox_Update(unsigned char key) |
{ |
#if !defined (RECEIVER_SPEKTRUM_DX7EXP) && !defined (RECEIVER_SPEKTRUM_DX8EXP) |
static uint8_t item = 0, last_item = 0; // the menu item |
static uint8_t updateDelay = 1; |
// navigate within the menu by key action |
last_item = item; |
switch(key) |
{ |
case JETIBOX_KEY_LEFT: |
//if (item == 0) return (1); // switch back to jeti expander menu |
// else |
item = pgm_read_byte(&JetiBox_Menu[item].left); //trigger to left menu item |
break; |
case JETIBOX_KEY_RIGHT: |
item = pgm_read_byte(&JetiBox_Menu[item].right); //trigger to right menu item |
break; |
case JETIBOX_KEY_UP: |
item = pgm_read_byte(&JetiBox_Menu[item].up); //trigger to up menu item |
break; |
case JETIBOX_KEY_DOWN: |
item = pgm_read_byte(&JetiBox_Menu[item].down); //trigger to down menu item |
break; |
default: |
break; |
} |
// if the menu item has been changed, do not pass the key to the item handler |
// to avoid jumping over to items |
if(item != last_item) key = JETIBOX_KEY_UNDEF; |
if (updateDelay++ & 0x01) |
{ |
LIBFC_JetiBox_Clear(); |
//execute menu item handler |
((pFctMenu)(pgm_read_word(&(JetiBox_Menu[item].pHandler))))(key); |
} |
#endif |
return (0); |
} |
/branches/V2.02a_FirstTrial_Peter/jetimenu.h |
---|
0,0 → 1,6 |
#ifndef _JETIMENU_H |
#define _JETIMENU_H |
extern unsigned char JetiBox_Update(unsigned char key); |
#endif //_JETIMENU_H |
/branches/V2.02a_FirstTrial_Peter/led.c |
---|
0,0 → 1,132 |
#include <inttypes.h> |
#include "main.h" |
uint16_t LED1_Timing = 0; |
uint16_t LED2_Timing = 0; |
unsigned char J16Blinkcount = 0, J16Mask = 1; |
unsigned char J17Blinkcount = 0, J17Mask = 1; |
unsigned char NC_Wait_for_LED = 0; // signal to NC: Wait for the LAD PAtter before switching to the next WP |
// initializes the LED control outputs J16, J17 |
void LED_Init(void) |
{ |
// set PC2 & PC3 as output (control of J16 & J17) |
DDRC |= (1<<DDC2)|(1<<DDC3); |
J16_OFF; |
J17_OFF; |
J16Blinkcount = 0; J16Mask = 128; |
J17Blinkcount = 0; J17Mask = 128; |
} |
// called in UpdateMotors() every 2ms |
void LED_Update(void) |
{ |
static char delay = 0; |
static unsigned char J16Bitmask = 0; |
static unsigned char J17Bitmask = 0; |
static unsigned char J16Warn = 0, J17Warn = 0; |
static unsigned char from_nc = 0; |
if(FromNC_WP_EventChannel != -127) { from_nc = (unsigned char) FromNC_WP_EventChannel + 127; /*beeptime = 300;*/}; |
if(!delay--) // 20ms Intervall |
{ |
J16Bitmask = EE_Parameter.J16Bitmask; |
J17Bitmask = EE_Parameter.J17Bitmask; |
delay = 9; |
if(FC_StatusFlags & (FC_STATUS_LOWBAT | FC_STATUS_EMERGENCY_LANDING) || (VersionInfo.HardwareError[1] & FC_ERROR1_I2C)) |
{ |
if(EE_Parameter.WARN_J16_Bitmask) |
{ |
if(!J16Warn) J16Blinkcount = 4; |
J16Warn = 1; |
} |
if(EE_Parameter.WARN_J17_Bitmask) |
{ |
if(!J17Warn) J17Blinkcount = 4; |
J17Warn = 1; |
} |
} |
else |
{ |
J16Warn = 0; |
J17Warn = 0; |
} |
//DebugOut.Analog[29] = EE_Parameter.GlobalConfig3; |
// Output 1 |
if(!J16Warn) |
{ |
if((EE_Parameter.BitConfig & CFG_MOTOR_BLINK1) && !MotorenEin) {if(EE_Parameter.BitConfig & CFG_MOTOR_OFF_LED1) J16_ON; else J16_OFF;} |
else |
if((EE_Parameter.J16Timing > 247) && (Parameter_J16Timing > 220)) {if(J16Bitmask & 128) J16_OFF; else J16_ON; J16Mask = 1; NC_Wait_for_LED = 0;} // Manual overwrite |
else |
if((EE_Parameter.J16Timing > 247) && (Parameter_J16Timing == 5)) {if(J16Bitmask & 128) J16_ON; else J16_OFF; J16Mask = 1; NC_Wait_for_LED = 0;} // Manual overwrite |
else |
if(!J16Blinkcount--) |
{ |
if(EE_Parameter.GlobalConfig3 & CFG3_USE_NC_FOR_OUT1) |
{ |
J16Blinkcount = from_nc / 2; |
if(!from_nc) { NC_Wait_for_LED = 0; if(J16Bitmask & 128) J16_ON; else J16_OFF; J16Mask = 0; } // Ausschalten |
else |
{ |
NC_Wait_for_LED = 1; |
if(J16Mask == 0) |
{ |
from_nc = 0; |
J16Mask = 64; |
if(J16Bitmask & 128) J16_ON; else J16_OFF; // Ausschalten |
} |
else |
{ |
//if(FromNC_WP_EventChannel != -127) |
if(J16Mask & J16Bitmask) J16_ON; else J16_OFF; |
J16Mask /= 2; |
} |
} |
} |
else |
{ |
J16Blinkcount = Parameter_J16Timing / 2; |
if(J16Mask == 1) { from_nc = 0; J16Mask = 64; } else J16Mask /= 2; |
if(J16Mask & J16Bitmask) J16_ON; else J16_OFF; |
NC_Wait_for_LED = 0; |
} |
} |
} |
else // warning case |
if(!J16Blinkcount--) |
{ |
J16Blinkcount = 10-1; |
if(J16Mask == 1) J16Mask = 128; else J16Mask /= 2; |
if(J16Mask & EE_Parameter.WARN_J16_Bitmask) J16_ON; else J16_OFF; |
} |
// Output 2 |
if(!J17Warn) |
{ |
if((EE_Parameter.BitConfig & CFG_MOTOR_BLINK2) && !MotorenEin) {if(EE_Parameter.BitConfig & CFG_MOTOR_OFF_LED2) J17_ON; else J17_OFF;} |
else |
if((EE_Parameter.J17Timing > 247) && (Parameter_J17Timing > 220)) {if(J17Bitmask & 128) J17_OFF; else J17_ON; J17Mask = 1;} |
else |
if((EE_Parameter.J17Timing > 247) && (Parameter_J17Timing == 5)) {if(J17Bitmask & 128) J17_ON; else J17_OFF; J17Mask = 1;} |
else |
if(!J17Blinkcount--) |
{ |
J17Blinkcount = Parameter_J17Timing / 2; |
if(J17Mask == 1) J17Mask = 64; else J17Mask /= 2; |
if(J17Mask & J17Bitmask) J17_ON; else J17_OFF; |
} |
} |
else // warning case |
if(!J17Blinkcount--) |
{ |
J17Blinkcount = 10-1; |
if(J17Mask == 1) J17Mask = 128; else J17Mask /= 2; |
if(J17Mask & EE_Parameter.WARN_J17_Bitmask) J17_ON; else J17_OFF; |
} |
if(PORTC & (1<<PORTC2)) FC_StatusFlags2 |= FC_STATUS2_OUT1_ACTIVE; //else FC_StatusFlags2 &= ~FC_STATUS2_OUT1_ACTIVE; // Out1 (J16) -> wird in der SPI zurück gesetzt |
if(PORTC & (1<<PORTC3)) FC_StatusFlags2 |= FC_STATUS2_OUT2_ACTIVE; else FC_StatusFlags2 &= ~FC_STATUS2_OUT2_ACTIVE; // Out2 (J17) |
} |
} |
/branches/V2.02a_FirstTrial_Peter/led.h |
---|
0,0 → 1,12 |
#include <avr/io.h> |
#define J16_ON PORTC |= (1<<PORTC2) |
#define J16_OFF PORTC &= ~(1<<PORTC2) |
#define J16_TOGGLE PORTC ^= (1<<PORTC2) |
#define J17_ON PORTC |= (1<<PORTC3) |
#define J17_OFF PORTC &= ~(1<<PORTC3) |
#define J17_TOGGLE PORTC ^= (1<<PORTC3) |
extern void LED_Init(void); |
extern void LED_Update(void); |
extern unsigned char NC_Wait_for_LED; |
/branches/V2.02a_FirstTrial_Peter/libfc.h |
---|
0,0 → 1,24 |
#ifndef _LIBFC_H |
#define _LIBFC_H |
#define CPU_UNKNOWN 0 |
#define CPU_ATMEGA644 1 |
#define CPU_ATMEGA644P 2 |
#define CPU_ATMEGA1284 3 |
#define CPU_ATMEGA1284P 4 |
extern void LIBFC_Init(unsigned char); |
extern void LIBFC_Polling(void); |
extern void LIBFC_ReceiverInit(unsigned char rtype); |
extern void LIBFC_JetiBox_Putchar(char c); |
extern void LIBFC_JetiBox_SetPos(unsigned char index); |
extern void LIBFC_JetiBox_Clear(void); |
extern void LIBFC_CheckSettings(void); |
extern unsigned char LIBFC_GetCPUType(void); |
#if (defined(__AVR_ATmega1284__) || defined(__AVR_ATmega1284P__)) |
extern long ACC_AltitudeFusion(unsigned char init); |
#endif |
#endif //_LIBFC_H |
/branches/V2.02a_FirstTrial_Peter/libfc1284.a |
---|
Cannot display: file marked as a binary type. |
svn:mime-type = application/octet-stream |
Property changes: |
Added: svn:mime-type |
+application/octet-stream |
\ No newline at end of property |
/branches/V2.02a_FirstTrial_Peter/libfc644.a |
---|
Cannot display: file marked as a binary type. |
svn:mime-type = application/octet-stream |
Property changes: |
Added: svn:mime-type |
+application/octet-stream |
\ No newline at end of property |
/branches/V2.02a_FirstTrial_Peter/main.c |
---|
0,0 → 1,479 |
// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
// + www.MikroKopter.com |
// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
// + Software Nutzungsbedingungen (english version: see below) |
// + der Fa. HiSystems GmbH, Flachsmeerstrasse 2, 26802 Moormerland - nachfolgend Lizenzgeber genannt - |
// + Der Lizenzgeber räumt dem Kunden ein nicht-ausschließliches, zeitlich und räumlich* unbeschränktes Recht ein, die im den |
// + Mikrocontroller verwendete Firmware für die Hardware Flight-Ctrl, Navi-Ctrl, BL-Ctrl, MK3Mag & PC-Programm MikroKopter-Tool |
// + - nachfolgend Software genannt - nur für private Zwecke zu nutzen. |
// + Der Einsatz dieser Software ist nur auf oder mit Produkten des Lizenzgebers zulässig. |
// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
// + Die vom Lizenzgeber gelieferte Software ist urheberrechtlich geschützt. Alle Rechte an der Software sowie an sonstigen im |
// + Rahmen der Vertragsanbahnung und Vertragsdurchführung überlassenen Unterlagen stehen im Verhältnis der Vertragspartner ausschließlich dem Lizenzgeber zu. |
// + Die in der Software enthaltenen Copyright-Vermerke, Markenzeichen, andere Rechtsvorbehalte, Seriennummern sowie |
// + sonstige der Programmidentifikation dienenden Merkmale dürfen vom Kunden nicht verändert oder unkenntlich gemacht werden. |
// + Der Kunde trifft angemessene Vorkehrungen für den sicheren Einsatz der Software. Er wird die Software gründlich auf deren |
// + Verwendbarkeit zu dem von ihm beabsichtigten Zweck testen, bevor er diese operativ einsetzt. |
// + Die Haftung des Lizenzgebers wird - soweit gesetzlich zulässig - begrenzt in Höhe des typischen und vorhersehbaren |
// + Schadens. Die gesetzliche Haftung bei Personenschäden und nach dem Produkthaftungsgesetz bleibt unberührt. Dem Lizenzgeber steht jedoch der Einwand |
// + des Mitverschuldens offen. |
// + Der Kunde trifft angemessene Vorkehrungen für den Fall, dass die Software ganz oder teilweise nicht ordnungsgemäß arbeitet. |
// + Er wird die Software gründlich auf deren Verwendbarkeit zu dem von ihm beabsichtigten Zweck testen, bevor er diese operativ einsetzt. |
// + Der Kunde wird er seine Daten vor Einsatz der Software nach dem Stand der Technik sichern. |
// + Der Kunde ist darüber unterrichtet, dass der Lizenzgeber seine Daten im zur Vertragsdurchführung erforderlichen Umfang |
// + und auf Grundlage der Datenschutzvorschriften erhebt, speichert, verarbeitet und, sofern notwendig, an Dritte übermittelt. |
// + *) Die räumliche Nutzung bezieht sich nur auf den Einsatzort, nicht auf die Reichweite der programmierten Software. |
// + #### ENDE DER NUTZUNGSBEDINGUNGEN ####' |
// + Hinweis: Informationen über erweiterte Nutzungsrechte (wie z.B. Nutzung für nicht-private Zwecke) sind auf Anfrage per Email an info(@)hisystems.de verfügbar. |
// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
// + Software LICENSING TERMS |
// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
// + of HiSystems GmbH, Flachsmeerstrasse 2, 26802 Moormerland, Germany - the Licensor - |
// + The Licensor grants the customer a non-exclusive license to use the microcontroller firmware of the Flight-Ctrl, Navi-Ctrl, BL-Ctrl, and MK3Mag hardware |
// + (the Software) exclusively for private purposes. The License is unrestricted with respect to time and territory*. |
// + The Software may only be used with the Licensor's products. |
// + The Software provided by the Licensor is protected by copyright. With respect to the relationship between the parties to this |
// + agreement, all rights pertaining to the Software and other documents provided during the preparation and execution of this |
// + agreement shall be the property of the Licensor. |
// + The information contained in the Software copyright notices, trademarks, other legal reservations, serial numbers and other |
// + features that can be used to identify the program may not be altered or defaced by the customer. |
// + The customer shall be responsible for taking reasonable precautions |
// + for the safe use of the Software. The customer shall test the Software thoroughly regarding its suitability for the |
// + intended purpose before implementing it for actual operation. The Licensor's liability shall be limited to the extent of typical and |
// + foreseeable damage to the extent permitted by law, notwithstanding statutory liability for bodily injury and product |
// + liability. However, the Licensor shall be entitled to the defense of contributory negligence. |
// + The customer will take adequate precautions in the case, that the software is not working properly. The customer will test |
// + the software for his purpose before any operational usage. The customer will backup his data before using the software. |
// + The customer understands that the Licensor collects, stores and processes, and, where required, forwards, customer data |
// + to third parties to the extent necessary for executing the agreement, subject to applicable data protection and privacy regulations. |
// + *) The territory aspect only refers to the place where the Software is used, not its programmed range. |
// + #### END OF LICENSING TERMS #### |
// + Note: For information on license extensions (e.g. commercial use), please contact us at info(@)hisystems.de. |
// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
#include "main.h" |
unsigned char DisableRcOffBeeping = 0; |
unsigned char PlatinenVersion = 10; |
unsigned char BattLowVoltageWarning = 94; |
unsigned int FlugMinuten = 0,FlugMinutenGesamt = 0; |
unsigned int FlugSekunden = 0; |
pVoidFnct_pVoidFnctChar_const_fmt _printf_P; |
unsigned char FoundMotors = 0; |
unsigned char JetiBeep = 0; // to allow any Morse-Beeping of the Jeti-Box |
unsigned char ActiveParamSet = 3; |
unsigned char LipoCells = 4; |
void PrintLine(void) |
{ |
printf("\n\r==================================="); |
} |
void CalMk3Mag(void) |
{ |
static unsigned char stick = 1; |
if(PPM_in[EE_Parameter.Kanalbelegung[K_NICK]] > -20) stick = 0; |
if((PPM_in[EE_Parameter.Kanalbelegung[K_NICK]] < -70) && !stick) |
{ |
stick = 1; |
WinkelOut.CalcState++; |
if(WinkelOut.CalcState > 4) |
{ |
// WinkelOut.CalcState = 0; // in Uart.c |
beeptime = 1000; |
} |
else Piep(WinkelOut.CalcState,150); |
} |
} |
void LipoDetection(unsigned char print) |
{ |
#define MAX_CELL_VOLTAGE 43 // max cell volatage for LiPO |
if(print) printf("\n\rBatt:"); |
// timer = SetDelay(100); |
// if(print) while (!CheckDelay(timer)); |
// up to 6s LiPo, less than 2s is technical impossible |
// for(cells = 2; cells < 7; cells++) if(UBat < cells * MAX_CELL_VOLTAGE) break; |
LipoCells = 1 + UBat / MAX_CELL_VOLTAGE; |
if(EE_Parameter.UnterspannungsWarnung < 50) |
{ |
BattLowVoltageWarning = LipoCells * EE_Parameter.UnterspannungsWarnung; |
if(print) |
{ |
Piep(LipoCells, 200); |
printf(" %d Cells ", LipoCells); |
} |
} |
else BattLowVoltageWarning = EE_Parameter.UnterspannungsWarnung; |
// automatische Zellenerkennung |
if(EE_Parameter.AutoLandingVoltage < 50) EE_Parameter.AutoLandingVoltage = LipoCells * EE_Parameter.AutoLandingVoltage; |
if(EE_Parameter.AutoLandingVoltage > BattLowVoltageWarning) EE_Parameter.AutoLandingVoltage = BattLowVoltageWarning - 1; |
if(print) |
{ |
printf(" Low warning: %d.%d",BattLowVoltageWarning/10,BattLowVoltageWarning%10); |
if(EE_Parameter.AutoLandingVoltage) printf(" Autolanding: %d.%d",EE_Parameter.AutoLandingVoltage/10,EE_Parameter.AutoLandingVoltage%10); |
} |
} |
//############################################################################ |
//Hauptprogramm |
int main (void) |
//############################################################################ |
{ |
unsigned int timer,i,timer2 = 0, timerPolling; |
unsigned char update_spi = 1; |
DDRB = 0x00; |
PORTB = 0x00; |
DDRD = 0x0A; // UART & J3 J4 J5 |
PORTD = 0x5F; // PPM-Input & UART |
for(timer = 0; timer < 1000; timer++); // verzögern |
#if (defined(__AVR_ATmega1284__) || defined(__AVR_ATmega1284P__)) |
unsigned char AccZ_ErrorCnt = 0; |
if(PINB & 0x02) |
{ |
if(PIND & 0x10) PlatinenVersion = 21; // No Bridge from J4 to GND |
else { PlatinenVersion = 22; ACC_AltitudeControl = 1;}; |
} |
else |
{ |
PlatinenVersion = 25; ACC_AltitudeControl = 1; |
} |
#else |
if(PINB & 0x01) |
{ |
if(PINB & 0x02) PlatinenVersion = 13; |
else PlatinenVersion = 11; |
} |
else |
{ |
if(PINB & 0x02) PlatinenVersion = 20; |
else |
{ |
PlatinenVersion = 10; |
DDRD = 0x3E; // Speaker & TXD & J3 J4 J5 |
PORTD = 0x47; // |
} |
} |
#endif |
DDRC = 0x81; // I2C, Spaker |
DDRC |=0x40; // HEF4017 Reset |
PORTC = 0xff; // Pullup SDA |
DDRB = 0x1B; // LEDs und Druckoffset |
PORTB = 0x01; // LED_Rot |
HEF4017Reset_ON; |
MCUSR &=~(1<<WDRF); |
WDTCSR |= (1<<WDCE)|(1<<WDE); |
WDTCSR = 0; |
beeptime = 2500; |
StickGier = 0; PPM_in[K_GAS] = 0; StickRoll = 0; StickNick = 0; |
if(PlatinenVersion >= 20) GIER_GRAD_FAKTOR = 1220; else GIER_GRAD_FAKTOR = 1291; // unterschiedlich für ME und ENC |
ROT_OFF; |
GRN_ON; |
Timer_Init(); |
TIMER2_Init(); |
UART_Init(); |
rc_sum_init(); |
ADC_Init(); |
I2C_Init(1); |
SPI_MasterInit(); |
Capacity_Init(); |
LIBFC_Init(LIB_FC_COMPATIBLE); |
GRN_ON; |
sei(); |
ParamSet_Init(); |
// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
// + Check connected BL-Ctrls |
// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
// Check connected BL-Ctrls |
BLFlags |= BLFLAG_READ_VERSION; |
motor_read = 0; // read the first I2C-Data |
SendMotorData(); |
timer = SetDelay(500); |
while(!(BLFlags & BLFLAG_TX_COMPLETE) && !CheckDelay(timer)); //wait for complete transfer |
printf("\n\rFound BL-Ctrl: "); |
timer = SetDelay(4000); |
for(i=0; i < MAX_MOTORS; i++) |
{ |
SendMotorData(); |
while(!(BLFlags & BLFLAG_TX_COMPLETE) && !CheckDelay(timer)); //wait for complete transfer |
if(Mixer.Motor[i][0] > 0) // wait max 4 sec for the BL-Ctrls to wake up |
{ |
while(!CheckDelay(timer) && !(Motor[i].State & MOTOR_STATE_PRESENT_MASK) ) |
{ |
SendMotorData(); |
while(!(BLFlags & BLFLAG_TX_COMPLETE) && !CheckDelay(timer)); //wait for complete transfer |
} |
} |
if(Motor[i].State & MOTOR_STATE_PRESENT_MASK) |
{ |
printf("%d",i+1); |
FoundMotors++; |
// if(Motor[i].Version & MOTOR_STATE_FAST_MODE) printf("(fast)\n\r"); |
// else if(Motor[i].Version & MOTOR_STATE_NEW_PROTOCOL_MASK) printf("(new)\n\r"); |
} |
} |
for(i=0; i < MAX_MOTORS; i++) |
{ |
if(!(Motor[i].State & MOTOR_STATE_PRESENT_MASK) && Mixer.Motor[i][0] > 0) |
{ |
printf("\n\r\n\r!! MISSING BL-CTRL: %d !!",i+1); |
ServoActive = 2; // just in case the FC would be used as camera-stabilizer |
} |
Motor[i].State &= ~MOTOR_STATE_ERROR_MASK; // clear error counter |
} |
PrintLine();// ("\n\r==================================="); |
if(RequiredMotors < FoundMotors) VersionInfo.HardwareError[1] |= FC_ERROR1_MIXER; |
//if(EE_Parameter.GlobalConfig & CFG_HOEHENREGELUNG) |
{ |
printf("\n\rCalibrating pressure sensor.."); |
timer = SetDelay(1000); |
SucheLuftruckOffset(); |
while (!CheckDelay(timer)); |
printf("OK\n\r"); |
} |
SetNeutral(0); |
ROT_OFF; |
beeptime = 2000; |
ExternControl.Digital[0] = 0x55; |
FlugMinuten = (unsigned int)GetParamByte(PID_FLIGHT_MINUTES) * 256 + (unsigned int)GetParamByte(PID_FLIGHT_MINUTES + 1); |
FlugMinutenGesamt = (unsigned int)GetParamByte(PID_FLIGHT_MINUTES_TOTAL) * 256 + (unsigned int)GetParamByte(PID_FLIGHT_MINUTES_TOTAL + 1); |
if((FlugMinutenGesamt == 0xFFFF) || (FlugMinuten == 0xFFFF)) |
{ |
FlugMinuten = 0; |
FlugMinutenGesamt = 0; |
} |
printf("\n\rFlight-time %u min Total:%u min", FlugMinuten, FlugMinutenGesamt); |
LcdClear(); |
I2CTimeout = 5000; |
WinkelOut.Orientation = 1; |
LipoDetection(1); |
LIBFC_ReceiverInit(EE_Parameter.Receiver); |
PrintLine();// ("\n\r==================================="); |
//SpektrumBinding(); |
timer = SetDelay(2000); |
timerPolling = SetDelay(250); |
Debug(ANSI_CLEAR "FC-Start!\n\rFlugzeit: %d min", FlugMinutenGesamt); // Note: this won't waste flash memory, if #DEBUG is not active |
//printf("\n\rEE_Parameter size:%i\n\r", PARAMSET_STRUCT_LEN); |
DebugOut.Status[0] = 0x01 | 0x02; |
JetiBeep = 0; |
if(EE_Parameter.ExtraConfig & CFG_NO_RCOFF_BEEPING) DisableRcOffBeeping = 1; |
EEAR = EE_DUMMY; // Set the EEPROM Address pointer to an unused space |
while(1) |
{ |
if(ReceiverUpdateModeActive) while (1) PORTC &= ~(1<<7); // Beeper off |
//GRN_ON; |
if(UpdateMotor && AdReady) // ReglerIntervall |
{ |
//GRN_OFF; |
cli(); |
UpdateMotor--; |
sei(); |
if(WinkelOut.CalcState) CalMk3Mag(); |
else MotorRegler(); |
SendMotorData(); |
ROT_OFF; |
if(SenderOkay) { SenderOkay--; /*VersionInfo.HardwareError[1] &= ~FC_ERROR1_PPM;*/ } |
else |
{ |
TIMSK1 |= _BV(ICIE1); // enable PPM-Input |
PPM_in[0] = 0; // set RSSI to zero on data timeout |
VersionInfo.HardwareError[1] |= FC_ERROR1_PPM; |
} |
//+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
//if(HoehenReglerAktiv && NaviDataOkay && SenderOkay < 160 && SenderOkay > 10 && FromNaviCtrl_Value.SerialDataOkay > 220) SenderOkay = 160; |
//if(HoehenReglerAktiv && NaviDataOkay && SenderOkay < 101 && SenderOkay > 10 && FromNaviCtrl_Value.SerialDataOkay > 1) SenderOkay = 101; |
//+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
if(!--I2CTimeout || MissingMotor) |
{ |
if(!I2CTimeout) |
{ |
I2C_Reset(); |
I2CTimeout = 5; |
DebugOut.Analog[28]++; // I2C-Error |
VersionInfo.HardwareError[1] |= FC_ERROR1_I2C; |
DebugOut.Status[1] |= 0x02; // BL-Error-Status |
} |
if((BeepMuster == 0xffff) && MotorenEin) |
{ |
beeptime = 25000; |
BeepMuster = 0x0080; |
} |
} |
else |
{ |
ROT_OFF; |
} |
LIBFC_Polling(); |
if(!UpdateMotor) |
{ |
#if (defined(__AVR_ATmega1284__) || defined(__AVR_ATmega1284P__)) |
if(NewSBusData) ProcessSBus(); |
else |
#endif |
{ |
if(CalculateServoSignals) CalculateServo(); |
DatenUebertragung(); |
BearbeiteRxDaten(); |
if(CheckDelay(timer)) |
{ |
static unsigned char second; |
timer += 20; // 20 ms interval |
CalcNickServoValue(); |
#if (defined(__AVR_ATmega1284__) || defined(__AVR_ATmega1284P__)) |
if(EE_Parameter.Receiver == RECEIVER_HOTT) HoTT_Menu(); |
else |
if(EE_Parameter.Receiver == RECEIVER_JETI) BuildJeti_Vario(); |
// ++++++++++++++++++++++++++++ |
// + check the ACC-Z range |
if(ACC_AltitudeControl && ((Aktuell_az < 300) || (DebugOut.Analog[7] < (128 * 4) && Aktuell_az > 850))) // DebugOut.Analog[7] = GasMischanteil |
{ |
if(++AccZ_ErrorCnt > 50) |
{ |
if(MotorenEin) VersionInfo.HardwareError[0] |= FC_ERROR0_ACC_TOP; |
else CalibrationDone = 0; |
} |
} |
else AccZ_ErrorCnt = 0; |
// ++++++++++++++++++++++++++++ |
#endif |
if(MissingMotor || Capacity.MinOfMaxPWM < 30) |
{ |
if(MissingMotor) VersionInfo.HardwareError[1] |= FC_ERROR1_BL_MISSING; |
DebugOut.Status[1] |= 0x02; // BL-Error-Status |
} |
else |
{ |
if(!beeptime) |
{ |
if(I2CTimeout > 6) DebugOut.Status[1] &= ~0x02; // BL-Error-Status |
} |
} |
if(DisableRcOffBeeping) if(SenderOkay > 150) { DisableRcOffBeeping = 0; beeptime = 5000;}; |
if(PcZugriff) PcZugriff--; |
else |
{ |
ExternControl.Config = 0; |
ExternStickNick = 0; |
ExternStickRoll = 0; |
ExternStickGier = 0; |
if(!SenderOkay) |
{ |
if(BeepMuster == 0xffff && DisableRcOffBeeping != 2) |
{ |
beeptime = 15000; |
BeepMuster = 0x0c00; |
if(DisableRcOffBeeping) DisableRcOffBeeping = 2; |
} |
} |
} |
if(NaviDataOkay > 200) |
{ |
NaviDataOkay--; |
VersionInfo.HardwareError[1] &= ~FC_ERROR1_SPI_RX; |
VersionInfo.Flags |= FC_VERSION_FLAG_NC_PRESENT; |
} |
else |
{ |
if(NC_Version.Compatible) |
{ |
VersionInfo.HardwareError[1] |= FC_ERROR1_SPI_RX; |
NC_ErrorCode = 9; // "ERR: no NC communication" |
if(BeepMuster == 0xffff && MotorenEin) |
{ |
beeptime = 15000; |
BeepMuster = 0xA800; |
} |
} |
GPS_Nick = 0; |
GPS_Roll = 0; |
GPS_Aid_StickMultiplikator = 0; |
GPSInfo.Flags = 0; |
FromNaviCtrl_Value.Kalman_K = -1; |
FromNaviCtrl.AccErrorN = 0; |
FromNaviCtrl.AccErrorR = 0; |
FromNaviCtrl.CompassValue = -1; |
FromNC_AltitudeSpeed = 0; |
FromNC_AltitudeSetpoint = 0; |
VersionInfo.Flags &= ~FC_VERSION_FLAG_NC_PRESENT; |
NaviDataOkay = 0; |
} |
if(UBat <= BattLowVoltageWarning) |
{ |
FC_StatusFlags |= FC_STATUS_LOWBAT; |
if(BeepMuster == 0xffff && UBat > 10) // Do not beep, if the voltage reading is below 1V (Supplied via MKUSB) |
{ |
beeptime = 6000; |
BeepMuster = 0x0300; |
} |
} |
// SendSPI = SPI_BYTEGAP; |
EEAR = EE_DUMMY; // Set the EEPROM Address pointer to an unused space |
// +++++++++++++++++++++++++++++++++ |
// Sekundentakt |
if(++second == 49) |
{ |
second = 0; |
#if (defined(__AVR_ATmega1284__) || defined(__AVR_ATmega1284P__)) |
if(ShowSettingNameTime) ShowSettingNameTime--; |
#endif |
if(FC_StatusFlags & FC_STATUS_FLY) FlugSekunden++; |
else timer2 = 1450; // 0,5 Minuten aufrunden |
if(modell_fliegt < 1024) |
{ |
if(StartLuftdruck < Luftdruck) StartLuftdruck += 5; |
else |
if(StartLuftdruck > Luftdruck) StartLuftdruck -= 5; |
} |
if(UBat > BattLowVoltageWarning + 1) FC_StatusFlags &= ~FC_STATUS_LOWBAT; |
} |
// +++++++++++++++++++++++++++++++++ |
if(++timer2 == 2930) // eine Minute |
{ |
timer2 = 0; |
FlugMinuten++; |
FlugMinutenGesamt++; |
SetParamByte(PID_FLIGHT_MINUTES,FlugMinuten / 256); |
SetParamByte(PID_FLIGHT_MINUTES+1,FlugMinuten % 256); |
SetParamByte(PID_FLIGHT_MINUTES_TOTAL,FlugMinutenGesamt / 256); |
SetParamByte(PID_FLIGHT_MINUTES_TOTAL+1,FlugMinutenGesamt % 256); |
timer = SetDelay(20); // falls "timer += 20;" mal nicht geht |
} |
} |
LED_Update(); |
Capacity_Update(); |
} |
} //else DebugOut.Analog[18]++; |
if(update_spi) update_spi--; |
} // 500Hz |
if(update_spi == 0) // 41Hz |
{ |
if(SPI_StartTransmitPacket()) update_spi = 12; |
else |
if(BytegapSPI == 0) SPI_TransmitByte(); |
} |
else if(BytegapSPI == 0) SPI_TransmitByte(); |
} |
} |
//DebugOut.Analog[16] |
/branches/V2.02a_FirstTrial_Peter/main.h |
---|
0,0 → 1,85 |
#ifndef _MAIN_H |
#define _MAIN_H |
//#define DEBUG // use to activate debug output to MK-Tool: use Debug(text); |
//#define ACT_S3D_SUMMENSIGNAL |
//#define UserParameter8_FAILSAFE |
//#define RECEIVER_SPEKTRUM_DX7EXP |
//#define RECEIVER_SPEKTRUM_DX8EXP |
// neue Hardware |
#define ROT_OFF {if((PlatinenVersion == 10)||(PlatinenVersion >= 20)) PORTB &=~0x01; else PORTB |= 0x01;} |
#define ROT_ON {if((PlatinenVersion == 10)||(PlatinenVersion >= 20)) PORTB |= 0x01; else PORTB &=~0x01;} |
#define ROT_FLASH PORTB ^= 0x01 |
#define GRN_OFF {if((PlatinenVersion < 12) || PlatinenVersion == 25) PORTB &=~0x02; else PORTB |= 0x02;} |
#define GRN_ON {if((PlatinenVersion < 12) || PlatinenVersion == 25) PORTB |= 0x02; else PORTB &=~0x02;} |
#define GRN_FLASH PORTB ^= 0x02 |
#define SYSCLK F_CPU |
//+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
#define J3High PORTD |= 0x20 |
#define J3Low PORTD &= ~0x20 |
#define J4High PORTD |= 0x10 |
#define J4Low PORTD &= ~0x10 |
#define J5High PORTD |= 0x08 |
#define J5Low PORTD &= ~0x08 |
extern volatile unsigned char SenderOkay; |
extern unsigned char BattLowVoltageWarning; |
extern unsigned char CosinusNickWinkel, CosinusRollWinkel; |
extern unsigned char PlatinenVersion; |
extern unsigned char FoundMotors,DisableRcOffBeeping; |
extern unsigned char JetiBeep; |
void LipoDetection(unsigned char print); |
extern unsigned int FlugMinuten,FlugMinutenGesamt,FlugSekunden; |
extern void PrintLine(void); // "=================================" |
extern unsigned char ActiveParamSet; |
extern unsigned int BL3_Current(unsigned char who); // in 0,1A |
extern unsigned char LipoCells; |
#include <avr/pgmspace.h> |
#if (defined(__AVR_ATmega1284__) || defined(__AVR_ATmega1284P__)) |
#endif |
#include <stdlib.h> |
#include <string.h> |
#include <avr/io.h> |
#include <avr/pgmspace.h> |
#include <avr/interrupt.h> |
#include <avr/eeprom.h> |
#include <avr/boot.h> |
#include <avr/wdt.h> |
#include "old_macros.h" |
#include "printf_P.h" |
#include "timer0.h" |
#include "uart.h" |
#include "analog.h" |
#include "twimaster.h" |
#include "menu.h" |
#include "rc.h" |
#include "fc.h" |
#include "gps.h" |
#include "spi.h" |
#include "led.h" |
#include "spektrum.h" |
#include "capacity.h" |
#include "eeprom.h" |
#include "libfc.h" |
#include "hottmenu.h" |
#include "debug.h" |
#include "sbus.h" |
#include "jeti_ex.h" |
#endif //_MAIN_H |
/branches/V2.02a_FirstTrial_Peter/makefile |
---|
0,0 → 1,496 |
#-------------------------------------------------------------------- |
# MCU name |
MCU = atmega1284p |
#MCU = atmega644p |
F_CPU = 20000000 |
#------------------------------------------------------------------- |
VERSION_MAJOR = 2 |
VERSION_MINOR = 01 |
VERSION_PATCH = 5 |
VERSION_SERIAL_MAJOR = 11 # Serial Protocol |
VERSION_SERIAL_MINOR = 0 # Serial Protocol |
NC_SPI_COMPATIBLE = 57 # Navi-Kompatibilität |
LIB_FC_COMPATIBLE = 5 # Library |
#------------------------------------------------------------------- |
# ATMEGA644: 63487 is maximum |
#------------------------------------------------------------------- |
# 0 a |
# 1 b |
# 2 c |
# 3 d |
# 4 e |
# 5 f |
# 6 g |
# 7 h |
# 8 i |
# 9 j |
# 10 k |
# 11 L |
#------------------------------------------------------------------- |
# get SVN revision |
REV := $(shell sh -c "cat .svn/entries | sed -n '4p'") |
ifeq ($(MCU), atmega1284p) |
FUSE_SETTINGS = -u -U lfuse:w:0xff:m -U hfuse:w:0xdf:m |
HEX_NAME = MEGA1284P |
LIBFC_EXT = 1284 |
endif |
ifeq ($(MCU), atmega644p) |
FUSE_SETTINGS = -u -U lfuse:w:0xff:m -U hfuse:w:0xdf:m |
HEX_NAME = MEGA644 |
LIBFC_EXT = 644 |
endif |
ifeq ($(F_CPU), 16000000) |
QUARZ = 16MHZ |
endif |
ifeq ($(F_CPU), 20000000) |
QUARZ = 20MHZ |
endif |
# Output format. (can be srec, ihex, binary) |
FORMAT = ihex |
# Target file name (without extension). |
ifeq ($(VERSION_PATCH), 0) |
TARGET = Flight-Ctrl_$(HEX_NAME)_V$(VERSION_MAJOR)_$(VERSION_MINOR)a_SVN$(REV) |
endif |
ifeq ($(VERSION_PATCH), 1) |
TARGET = Flight-Ctrl_$(HEX_NAME)_V$(VERSION_MAJOR)_$(VERSION_MINOR)b_SVN$(REV) |
endif |
ifeq ($(VERSION_PATCH), 2) |
TARGET = Flight-Ctrl_$(HEX_NAME)_V$(VERSION_MAJOR)_$(VERSION_MINOR)c_SVN$(REV) |
endif |
ifeq ($(VERSION_PATCH), 3) |
TARGET = Flight-Ctrl_$(HEX_NAME)_V$(VERSION_MAJOR)_$(VERSION_MINOR)d_SVN$(REV) |
endif |
ifeq ($(VERSION_PATCH), 4) |
TARGET = Flight-Ctrl_$(HEX_NAME)_V$(VERSION_MAJOR)_$(VERSION_MINOR)e_SVN$(REV) |
endif |
ifeq ($(VERSION_PATCH), 5) |
TARGET = Flight-Ctrl_$(HEX_NAME)_V$(VERSION_MAJOR)_$(VERSION_MINOR)f_SVN$(REV) |
endif |
ifeq ($(VERSION_PATCH), 6) |
TARGET = Flight-Ctrl_$(HEX_NAME)_V$(VERSION_MAJOR)_$(VERSION_MINOR)g_SVN$(REV) |
endif |
ifeq ($(VERSION_PATCH), 7) |
TARGET = Flight-Ctrl_$(HEX_NAME)_V$(VERSION_MAJOR)_$(VERSION_MINOR)h_SVN$(REV) |
endif |
ifeq ($(VERSION_PATCH), 8) |
TARGET = Flight-Ctrl_$(HEX_NAME)_V$(VERSION_MAJOR)_$(VERSION_MINOR)i_SVN$(REV) |
endif |
ifeq ($(VERSION_PATCH), 9) |
TARGET = Flight-Ctrl_$(HEX_NAME)_V$(VERSION_MAJOR)_$(VERSION_MINOR)j_SVN$(REV) |
endif |
ifeq ($(VERSION_PATCH), 10) |
TARGET = Flight-Ctrl_$(HEX_NAME)_V$(VERSION_MAJOR)_$(VERSION_MINOR)k_SVN$(REV) |
endif |
ifeq ($(VERSION_PATCH), 11) |
TARGET = Flight-Ctrl_$(HEX_NAME)_V$(VERSION_MAJOR)_$(VERSION_MINOR)L_SVN$(REV) |
endif |
ifeq ($(VERSION_PATCH), 12) |
TARGET = Flight-Ctrl_$(HEX_NAME)_V$(VERSION_MAJOR)_$(VERSION_MINOR)m_SVN$(REV) |
endif |
ifeq ($(VERSION_PATCH), 13) |
TARGET = Flight-Ctrl_$(HEX_NAME)_V$(VERSION_MAJOR)_$(VERSION_MINOR)n_SVN$(REV) |
endif |
ifeq ($(VERSION_PATCH), 14) |
TARGET = Flight-Ctrl_$(HEX_NAME)_V$(VERSION_MAJOR)_$(VERSION_MINOR)o_SVN$(REV) |
endif |
ifeq ($(VERSION_PATCH), 15) |
TARGET = Flight-Ctrl_$(HEX_NAME)_V$(VERSION_MAJOR)_$(VERSION_MINOR)p_SVN$(REV) |
endif |
ifeq ($(VERSION_PATCH), 16) |
TARGET = Flight-Ctrl_$(HEX_NAME)_V$(VERSION_MAJOR)_$(VERSION_MINOR)q_SVN$(REV) |
endif |
ifeq ($(VERSION_PATCH), 17) |
TARGET = Flight-Ctrl_$(HEX_NAME)_V$(VERSION_MAJOR)_$(VERSION_MINOR)r_SVN$(REV) |
endif |
ifeq ($(VERSION_PATCH), 18) |
TARGET = Flight-Ctrl_$(HEX_NAME)_V$(VERSION_MAJOR)_$(VERSION_MINOR)s_SVN$(REV) |
endif |
ifeq ($(VERSION_PATCH), 19) |
TARGET = Flight-Ctrl_$(HEX_NAME)_V$(VERSION_MAJOR)_$(VERSION_MINOR)t_SVN$(REV) |
endif |
ifeq ($(VERSION_PATCH), 20) |
TARGET = Flight-Ctrl_$(HEX_NAME)_V$(VERSION_MAJOR)_$(VERSION_MINOR)u_SVN$(REV) |
endif |
ifeq ($(VERSION_PATCH), 21) |
TARGET = Flight-Ctrl_$(HEX_NAME)_V$(VERSION_MAJOR)_$(VERSION_MINOR)v_SVN$(REV) |
endif |
ifeq ($(VERSION_PATCH), 22) |
TARGET = Flight-Ctrl_$(HEX_NAME)_V$(VERSION_MAJOR)_$(VERSION_MINOR)w_SVN$(REV) |
endif |
ifeq ($(VERSION_PATCH), 23) |
TARGET = Flight-Ctrl_$(HEX_NAME)_V$(VERSION_MAJOR)_$(VERSION_MINOR)x_SVN$(REV) |
endif |
ifeq ($(VERSION_PATCH), 24) |
TARGET = Flight-Ctrl_$(HEX_NAME)_V$(VERSION_MAJOR)_$(VERSION_MINOR)y_SVN$(REV) |
endif |
ifeq ($(VERSION_PATCH), 25) |
TARGET = Flight-Ctrl_$(HEX_NAME)_V$(VERSION_MAJOR)_$(VERSION_MINOR)z_SVN$(REV) |
endif |
# Optimization level, can be [0, 1, 2, 3, s]. 0 turns off optimization. |
# (Note: 3 is not always the best optimization level. See avr-libc FAQ.) |
OPT = s |
#OPT = 2 |
########################################################################################################## |
# List C source files here. (C dependencies are automatically generated.) |
SRC = main.c uart.c timer0.c analog.c menu.c eeprom.c |
SRC += twimaster.c rc.c fc.c GPS.c spi.c led.c Spektrum.c |
SRC += mymath.c jetimenu.c capacity.c debug.c |
SRC += hottmenu.c sbus.c user_receiver.c |
SRC += jeti_ex.c |
########################################################################################################## |
# List Assembler source files here. |
# Make them always end in a capital .S. Files ending in a lowercase .s |
# will not be considered source files but generated files (assembler |
# output from the compiler), and will be deleted upon "make clean"! |
# Even though the DOS/Win* filesystem matches both .s and .S the same, |
# it will preserve the spelling of the filenames, and gcc itself does |
# care about how the name is spelled on its command-line. |
ASRC = isqrt.S |
# List any extra directories to look for include files here. |
# Each directory must be seperated by a space. |
EXTRAINCDIRS = |
# Optional compiler flags. |
# -g: generate debugging information (for GDB, or for COFF conversion) |
# -O*: optimization level |
# -f...: tuning, see gcc manual and avr-libc documentation |
# -Wall...: warning level |
# -Wa,...: tell GCC to pass this to the assembler. |
# -ahlms: create assembler listing |
CFLAGS = -O$(OPT) -funsigned-char -funsigned-bitfields -fpack-struct -fshort-enums -Wall -Wstrict-prototypes -Wa,-adhlns=$(<:%.c=%.lst) $(patsubst %,-I%,$(EXTRAINCDIRS)) |
# Set a "language standard" compiler flag. |
# Unremark just one line below to set the language standard to use. |
# gnu99 = C99 + GNU extensions. See GCC manual for more information. |
#CFLAGS += -std=c89 |
#CFLAGS += -std=gnu89 |
#CFLAGS += -std=c99 |
CFLAGS += -std=gnu99 |
# shrink code size |
CFLAGS += -mtiny-stack |
#CFLAGS += -fno-inline-functions |
CFLAGS += -mcall-prologues |
CFLAGS += -DF_CPU=$(F_CPU) -DVERSION_MAJOR=$(VERSION_MAJOR) -DVERSION_MINOR=$(VERSION_MINOR) -DVERSION_PATCH=$(VERSION_PATCH) -DVERSION_SERIAL_MAJOR=$(VERSION_SERIAL_MAJOR) -DVERSION_SERIAL_MINOR=$(VERSION_SERIAL_MINOR) -DNC_SPI_COMPATIBLE=$(NC_SPI_COMPATIBLE) -DLIB_FC_COMPATIBLE=$(LIB_FC_COMPATIBLE) |
# Optional assembler flags. |
# -Wa,...: tell GCC to pass this to the assembler. |
# -ahlms: create listing |
# -gstabs: have the assembler create line number information; note that |
# for use in COFF files, additional information about filenames |
# and function names needs to be present in the assembler source |
# files -- see avr-libc docs [FIXME: not yet described there] |
ASFLAGS = -Wa,-adhlns=$(<:.S=.lst),-gstabs |
# Optional linker flags. |
# -Wl,...: tell GCC to pass this to linker. |
# -Map: create map file |
# --cref: add cross reference to map file |
LDFLAGS = -Wl,-Map=$(TARGET).map,--cref |
# Additional libraries |
# Minimalistic printf version |
#LDFLAGS += -Wl,-u,vfprintf -lprintf_min |
# Floating point printf version (requires -lm below) |
#LDFLAGS += -Wl,-u,vfprintf -lprintf_flt |
# -lm = math library |
LDFLAGS += -lm |
LDFLAGS += libfc$(LIBFC_EXT).a |
##LDFLAGS += -T./linkerfile/avr5.x |
# Programming support using avrdude. Settings and variables. |
# Programming hardware: alf avr910 avrisp bascom bsd |
# dt006 pavr picoweb pony-stk200 sp12 stk200 stk500 |
# |
# Type: avrdude -c ? |
# to get a full listing. |
# |
#AVRDUDE_PROGRAMMER = dt006 |
#AVRDUDE_PROGRAMMER = stk200 |
#AVRDUDE_PROGRAMMER = ponyser |
AVRDUDE_PROGRAMMER = avrispv2 |
#falls Ponyser ausgewählt wird, muss sich unsere avrdude-Configdatei im Bin-Verzeichnis des Compilers befinden |
#AVRDUDE_PORT = com1 # programmer connected to serial device |
#AVRDUDE_PORT = lpt1 # programmer connected to parallel port |
AVRDUDE_PORT = usb # programmer connected to USB |
#AVRDUDE_WRITE_FLASH = -U flash:w:$(TARGET).hex |
AVRDUDE_WRITE_FLASH = -U flash:w:$(TARGET).hex $(FUSE_SETTINGS) |
#AVRDUDE_WRITE_EEPROM = -U eeprom:w:$(TARGET).eep |
#avrdude -c avrispv2 -P usb -p m32 -U flash:w:blink.hex |
AVRDUDE_FLAGS = -p $(MCU) -P $(AVRDUDE_PORT) -c $(AVRDUDE_PROGRAMMER) |
# Uncomment the following if you want avrdude's erase cycle counter. |
# Note that this counter needs to be initialized first using -Yn, |
# see avrdude manual. |
#AVRDUDE_ERASE += -y |
# Uncomment the following if you do /not/ wish a verification to be |
# performed after programming the device. |
AVRDUDE_FLAGS += -V |
# Increase verbosity level. Please use this when submitting bug |
# reports about avrdude. See <http://savannah.nongnu.org/projects/avrdude> |
# to submit bug reports. |
#AVRDUDE_FLAGS += -v -v |
# --------------------------------------------------------------------------- |
# Define directories, if needed. |
DIRAVR = c:/winavr |
DIRAVRBIN = $(DIRAVR)/bin |
DIRAVRUTILS = $(DIRAVR)/utils/bin |
DIRINC = . |
DIRLIB = $(DIRAVR)/avr/lib |
# Define programs and commands. |
SHELL = sh |
CC = avr-gcc |
OBJCOPY = avr-objcopy |
OBJDUMP = avr-objdump |
SIZE = avr-size |
# Programming support using avrdude. |
AVRDUDE = avrdude |
REMOVE = rm -f |
COPY = cp |
HEXSIZE = $(SIZE) --target=$(FORMAT) $(TARGET).hex |
ELFSIZE = $(SIZE) -x -A $(TARGET).elf |
LIMITS = $(SIZE) --mcu=$(MCU) -C $(TARGET).elf |
# Define Messages |
# English |
MSG_ERRORS_NONE = Errors: none |
MSG_BEGIN = -------- begin -------- |
MSG_END = -------- end -------- |
MSG_SIZE_BEFORE = Size before: |
MSG_SIZE_AFTER = Size after: |
MSG_COFF = Converting to AVR COFF: |
MSG_EXTENDED_COFF = Converting to AVR Extended COFF: |
MSG_FLASH = Creating load file for Flash: |
MSG_EEPROM = Creating load file for EEPROM: |
MSG_EXTENDED_LISTING = Creating Extended Listing: |
MSG_SYMBOL_TABLE = Creating Symbol Table: |
MSG_LINKING = Linking: |
MSG_COMPILING = Compiling: |
MSG_ASSEMBLING = Assembling: |
MSG_CLEANING = Cleaning project: |
# Define all object files. |
OBJ = $(SRC:.c=.o) $(ASRC:.S=.o) |
# Define all listing files. |
LST = $(ASRC:.S=.lst) $(SRC:.c=.lst) |
# Combine all necessary flags and optional flags. |
# Add target processor to flags. |
#ALL_CFLAGS = -mmcu=$(MCU) -DF_CPU=$(F_CPU) -I. $(CFLAGS) |
ALL_CFLAGS = -mmcu=$(MCU) -I. $(CFLAGS) |
ALL_ASFLAGS = -mmcu=$(MCU) -I. -x assembler-with-cpp $(ASFLAGS) |
# Default target. |
all: begin gccversion sizebefore $(TARGET).elf $(TARGET).hex sizeafter finished end |
# Eye candy. |
# AVR Studio 3.x does not check make's exit code but relies on |
# the following magic strings to be generated by the compile job. |
begin: |
@echo |
@echo $(MSG_BEGIN) |
finished: |
@echo $(MSG_ERRORS_NONE) |
end: |
@echo $(MSG_END) |
@echo |
# Display size of file. |
sizebefore: |
@if [ -f $(TARGET).elf ]; then echo Size before:; $(ELFSIZE); $(HEXSIZE); $(LIMITS); echo; fi |
sizeafter: |
@if [ -f $(TARGET).elf ]; then echo Size after:; $(ELFSIZE); $(HEXSIZE); $(LIMITS); echo; fi |
# Display compiler version information. |
gccversion : |
@$(CC) --version |
# Convert ELF to COFF for use in debugging / simulating in |
# AVR Studio or VMLAB. |
COFFCONVERT=$(OBJCOPY) --debugging \ |
--change-section-address .data-0x800000 \ |
--change-section-address .bss-0x800000 \ |
--change-section-address .noinit-0x800000 \ |
--change-section-address .eeprom-0x810000 |
coff: $(TARGET).elf |
@echo |
@echo $(MSG_COFF) $(TARGET).cof |
$(COFFCONVERT) -O coff-avr $< $(TARGET).cof |
extcoff: $(TARGET).elf |
@echo |
@echo $(MSG_EXTENDED_COFF) $(TARGET).cof |
$(COFFCONVERT) -O coff-ext-avr $< $(TARGET).cof |
# Program the device. |
program: $(TARGET).hex $(TARGET).eep |
$(AVRDUDE) $(AVRDUDE_FLAGS) $(AVRDUDE_WRITE_FLASH) $(AVRDUDE_WRITE_EEPROM) |
# Create final output files (.hex, .eep) from ELF output file. |
%.hex: %.elf |
@echo |
@echo $(MSG_FLASH) $@ |
$(OBJCOPY) -O $(FORMAT) -R .eeprom $< $@ |
%.eep: %.elf |
@echo |
@echo $(MSG_EEPROM) $@ |
-$(OBJCOPY) -j .eeprom --set-section-flags=.eeprom="alloc,load" \ |
--change-section-lma .eeprom=0 -O $(FORMAT) $< $@ |
# Create extended listing file from ELF output file. |
%.lss: %.elf |
@echo |
@echo $(MSG_EXTENDED_LISTING) $@ |
$(OBJDUMP) -h -S $< > $@ |
# Create a symbol table from ELF output file. |
%.sym: %.elf |
@echo |
@echo $(MSG_SYMBOL_TABLE) $@ |
avr-nm -n $< > $@ |
# Link: create ELF output file from object files. |
.SECONDARY : $(TARGET).elf |
.PRECIOUS : $(OBJ) |
%.elf: $(OBJ) |
@echo |
@echo $(MSG_LINKING) $@ |
$(CC) $(ALL_CFLAGS) $(OBJ) --output $@ $(LDFLAGS) |
# Compile: create object files from C source files. |
%.o : %.c |
@echo |
@echo $(MSG_COMPILING) $< |
$(CC) -c $(ALL_CFLAGS) $< -o $@ |
# Compile: create assembler files from C source files. |
%.s : %.c |
$(CC) -S $(ALL_CFLAGS) $< -o $@ |
# Assemble: create object files from assembler source files. |
%.o : %.S |
@echo |
@echo $(MSG_ASSEMBLING) $< |
$(CC) -c $(ALL_ASFLAGS) $< -o $@ |
# Target: clean project. |
clean: begin clean_list finished end |
clean_list : |
@echo |
@echo $(MSG_CLEANING) |
$(REMOVE) Flight-Ctrl_*.hex |
$(REMOVE) Flight-Ctrl_*.eep |
$(REMOVE) $(TARGET).obj |
$(REMOVE) $(TARGET).cof |
$(REMOVE) Flight-Ctrl_*.elf |
$(REMOVE) Flight-Ctrl_*.map |
$(REMOVE) $(TARGET).obj |
$(REMOVE) $(TARGET).a90 |
$(REMOVE) Flight-Ctrl_*.sym |
$(REMOVE) $(TARGET).lnk |
$(REMOVE) $(TARGET).lss |
$(REMOVE) $(OBJ) |
$(REMOVE) $(LST) |
$(REMOVE) $(SRC:.c=.s) |
$(REMOVE) $(SRC:.c=.d) |
$(REMOVE) $(SRC:.c=.o) |
# Automatically generate C source code dependencies. |
# (Code originally taken from the GNU make user manual and modified |
# (See README.txt Credits).) |
# |
# Note that this will work with sh (bash) and sed that is shipped with WinAVR |
# (see the SHELL variable defined above). |
# This may not work with other shells or other seds. |
# |
%.d: %.c |
set -e; $(CC) -MM $(ALL_CFLAGS) $< \ |
| sed 's,\(.*\)\.o[ :]*,\1.o \1.d : ,g' > $@; \ |
[ -s $@ ] || rm -f $@ |
# Remove the '-' if you want to see the dependency files generated. |
-include $(SRC:%.c=%.d) |
# Listing of phony targets. |
.PHONY : all begin finish end sizebefore sizeafter gccversion coff extcoff \ |
clean clean_list program |
/branches/V2.02a_FirstTrial_Peter/menu.c |
---|
0,0 → 1,282 |
// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
// + www.MikroKopter.com |
// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
// + Software Nutzungsbedingungen (english version: see below) |
// + der Fa. HiSystems GmbH, Flachsmeerstrasse 2, 26802 Moormerland - nachfolgend Lizenzgeber genannt - |
// + Der Lizenzgeber räumt dem Kunden ein nicht-ausschließliches, zeitlich und räumlich* unbeschränktes Recht ein, die im den |
// + Mikrocontroller verwendete Firmware für die Hardware Flight-Ctrl, Navi-Ctrl, BL-Ctrl, MK3Mag & PC-Programm MikroKopter-Tool |
// + - nachfolgend Software genannt - nur für private Zwecke zu nutzen. |
// + Der Einsatz dieser Software ist nur auf oder mit Produkten des Lizenzgebers zulässig. |
// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
// + Die vom Lizenzgeber gelieferte Software ist urheberrechtlich geschützt. Alle Rechte an der Software sowie an sonstigen im |
// + Rahmen der Vertragsanbahnung und Vertragsdurchführung überlassenen Unterlagen stehen im Verhältnis der Vertragspartner ausschließlich dem Lizenzgeber zu. |
// + Die in der Software enthaltenen Copyright-Vermerke, Markenzeichen, andere Rechtsvorbehalte, Seriennummern sowie |
// + sonstige der Programmidentifikation dienenden Merkmale dürfen vom Kunden nicht verändert oder unkenntlich gemacht werden. |
// + Der Kunde trifft angemessene Vorkehrungen für den sicheren Einsatz der Software. Er wird die Software gründlich auf deren |
// + Verwendbarkeit zu dem von ihm beabsichtigten Zweck testen, bevor er diese operativ einsetzt. |
// + Die Haftung des Lizenzgebers wird - soweit gesetzlich zulässig - begrenzt in Höhe des typischen und vorhersehbaren |
// + Schadens. Die gesetzliche Haftung bei Personenschäden und nach dem Produkthaftungsgesetz bleibt unberührt. Dem Lizenzgeber steht jedoch der Einwand |
// + des Mitverschuldens offen. |
// + Der Kunde trifft angemessene Vorkehrungen für den Fall, dass die Software ganz oder teilweise nicht ordnungsgemäß arbeitet. |
// + Er wird die Software gründlich auf deren Verwendbarkeit zu dem von ihm beabsichtigten Zweck testen, bevor er diese operativ einsetzt. |
// + Der Kunde wird er seine Daten vor Einsatz der Software nach dem Stand der Technik sichern. |
// + Der Kunde ist darüber unterrichtet, dass der Lizenzgeber seine Daten im zur Vertragsdurchführung erforderlichen Umfang |
// + und auf Grundlage der Datenschutzvorschriften erhebt, speichert, verarbeitet und, sofern notwendig, an Dritte übermittelt. |
// + *) Die räumliche Nutzung bezieht sich nur auf den Einsatzort, nicht auf die Reichweite der programmierten Software. |
// + #### ENDE DER NUTZUNGSBEDINGUNGEN ####' |
// + Hinweis: Informationen über erweiterte Nutzungsrechte (wie z.B. Nutzung für nicht-private Zwecke) sind auf Anfrage per Email an info(@)hisystems.de verfügbar. |
// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
// + Software LICENSING TERMS |
// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
// + of HiSystems GmbH, Flachsmeerstrasse 2, 26802 Moormerland, Germany - the Licensor - |
// + The Licensor grants the customer a non-exclusive license to use the microcontroller firmware of the Flight-Ctrl, Navi-Ctrl, BL-Ctrl, and MK3Mag hardware |
// + (the Software) exclusively for private purposes. The License is unrestricted with respect to time and territory*. |
// + The Software may only be used with the Licensor's products. |
// + The Software provided by the Licensor is protected by copyright. With respect to the relationship between the parties to this |
// + agreement, all rights pertaining to the Software and other documents provided during the preparation and execution of this |
// + agreement shall be the property of the Licensor. |
// + The information contained in the Software copyright notices, trademarks, other legal reservations, serial numbers and other |
// + features that can be used to identify the program may not be altered or defaced by the customer. |
// + The customer shall be responsible for taking reasonable precautions |
// + for the safe use of the Software. The customer shall test the Software thoroughly regarding its suitability for the |
// + intended purpose before implementing it for actual operation. The Licensor's liability shall be limited to the extent of typical and |
// + foreseeable damage to the extent permitted by law, notwithstanding statutory liability for bodily injury and product |
// + liability. However, the Licensor shall be entitled to the defense of contributory negligence. |
// + The customer will take adequate precautions in the case, that the software is not working properly. The customer will test |
// + the software for his purpose before any operational usage. The customer will backup his data before using the software. |
// + The customer understands that the Licensor collects, stores and processes, and, where required, forwards, customer data |
// + to third parties to the extent necessary for executing the agreement, subject to applicable data protection and privacy regulations. |
// + *) The territory aspect only refers to the place where the Software is used, not its programmed range. |
// + #### END OF LICENSING TERMS #### |
// + Note: For information on license extensions (e.g. commercial use), please contact us at info(@)hisystems.de. |
// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
#include "main.h" |
#include "eeprom.h" |
char DisplayBuff[80]; |
unsigned char DispPtr = 0; |
unsigned char MaxMenue = 17; |
unsigned char MenuePunkt = 0; |
unsigned char RemoteKeys = 0; |
#define KEY1 0x01 |
#define KEY2 0x02 |
#define KEY3 0x04 |
#define KEY4 0x08 |
#define KEY5 0x10 |
void LcdClear(void) |
{ |
unsigned char i; |
for(i=0;i<80;i++) DisplayBuff[i] = ' '; |
} |
void Menu_Putchar(char c) |
{ |
if(DispPtr < 80) DisplayBuff[DispPtr++] = c; |
} |
void Menu(void) |
{ |
unsigned char i; |
if(RemoteKeys & KEY1) { if(MenuePunkt) MenuePunkt--; else MenuePunkt = MaxMenue;} |
if(RemoteKeys & KEY2) { if(MenuePunkt == MaxMenue) MenuePunkt = 0; else MenuePunkt++;} |
if((RemoteKeys & KEY1) && (RemoteKeys & KEY2)) MenuePunkt = 0; |
LcdClear(); |
if(MenuePunkt < 10) {LCD_printfxy(17,0,"[%i]",MenuePunkt);} |
else {LCD_printfxy(16,0,"[%i]",MenuePunkt);}; |
switch(MenuePunkt) |
{ |
case 0: |
LCD_printfxy(0,0,"+ MikroKopter +"); |
LCD_printfxy(0,1,"HW:V%d.%d SW:%d.%02d%c ",PlatinenVersion/10,PlatinenVersion%10, VERSION_MAJOR, VERSION_MINOR, VERSION_PATCH +'a'); |
LCD_printfxy(0,2,"Setting:%d %s", ActiveParamSet,Mixer.Name); |
if(VersionInfo.HardwareError[1] & FC_ERROR1_MIXER) LCD_printfxy(0,3,"Mixer Error!") |
else |
#if (defined(__AVR_ATmega1284__) || defined(__AVR_ATmega1284P__)) |
if(NC_ErrorCode) |
{ |
LCD_printfxy(0,3,"ERR%2d:",NC_ErrorCode); |
_printf_P(&Menu_Putchar, NC_ERROR_TEXT[NC_ErrorCode] , 0); |
} |
else |
#endif |
if(VersionInfo.HardwareError[0]) LCD_printfxy(0,3,"Hardware Error 1:%d !!",VersionInfo.HardwareError[0]) |
else |
if(MissingMotor) LCD_printfxy(0,3,"Missing BL-Ctrl:%d !!",MissingMotor) |
#if (defined(__AVR_ATmega1284__) || defined(__AVR_ATmega1284P__)) |
#else |
else |
if(NC_ErrorCode) |
{ |
LCD_printfxy(0,3,"! NC-ERR: %2d ! ",NC_ErrorCode); |
} |
#endif |
// if(VersionInfo.HardwareError[1]) LCD_printfxy(0,3,"Error 2:%d !!",VersionInfo.HardwareError[1]) |
else |
if(I2CTimeout < 6) LCD_printfxy(0,3,"I2C ERROR!!!") |
else |
if(Capacity.MinOfMaxPWM < 30) LCD_printfxy(0,3,"BL-Selftest Err:%2d",Capacity.MinOfMaxPWM) |
break; |
case 1: |
LCD_printfxy(0,0,"Height: %5i",(int)(HoehenWert/5)); |
LCD_printfxy(0,1,"Setpoint:%5i",(int)(SollHoehe/5)); |
LCD_printfxy(0,2,"Pressure:%5i",MessLuftdruck); |
LCD_printfxy(0,3,"Offset: %5i",OCR0A); |
#if (defined(__AVR_ATmega1284__) || defined(__AVR_ATmega1284P__)) |
if(ACC_AltitudeControl) |
{ |
LCD_printfxy(17,2,"(A)"); |
LCD_printfxy(17,3,"%i",CalAthmospheare); |
} |
#endif |
break; |
case 2: |
LCD_printfxy(0,0,"act. bearing"); |
LCD_printfxy(0,1,"Nick: %5i",IntegralNick/1024); |
LCD_printfxy(0,2,"Roll: %5i",IntegralRoll/1024); |
LCD_printfxy(0,3,"Compass: %5i",ErsatzKompassInGrad); |
break; |
case 3: |
for(i=1;i<9;i+=2) LCD_printfxy(0,i/2,"K%i:%4i K%i:%4i ",i,PPM_in[i],i+1,PPM_in[i+1]); |
break; |
case 4: |
LCD_printfxy(0,0,"Ni:%4i Ro:%4i ",PPM_in[EE_Parameter.Kanalbelegung[K_NICK]],PPM_in[EE_Parameter.Kanalbelegung[K_ROLL]]); |
LCD_printfxy(0,1,"Gs:%4i Gi:%4i ",PPM_in[EE_Parameter.Kanalbelegung[K_GAS]]+127,PPM_in[EE_Parameter.Kanalbelegung[K_GIER]]); |
LCD_printfxy(0,2,"P1:%4i P2:%4i ",PPM_in[EE_Parameter.Kanalbelegung[K_POTI1]]+127,PPM_in[EE_Parameter.Kanalbelegung[K_POTI2]]+127); |
LCD_printfxy(0,3,"P3:%4i P4:%4i ",PPM_in[EE_Parameter.Kanalbelegung[K_POTI3]]+127,PPM_in[EE_Parameter.Kanalbelegung[K_POTI4]]+127); |
break; |
case 5: |
LCD_printfxy(0,0,"Gyro - Sensor"); |
LCD_printfxy(0,1,"Nick %4i (%3i.%x)",AdWertNick - AdNeutralNick/8, AdNeutralNick/16, (AdNeutralNick%16)/2); |
LCD_printfxy(0,2,"Roll %4i (%3i.%x)",AdWertRoll - AdNeutralRoll/8, AdNeutralRoll/16, (AdNeutralRoll%16)/2); |
LCD_printfxy(0,3,"Yaw %4i (%3i)",AdNeutralGier - AdWertGier, AdNeutralGier/2); |
/* |
// entfernt aus Platzmangel |
if(PlatinenVersion == 10) |
{ |
LCD_printfxy(0,1,"Nick%4i (%3i.%i)",AdWertNick - AdNeutralNick/8, AdNeutralNick/8, AdNeutralNick%8); |
LCD_printfxy(0,2,"Roll%4i (%3i.%i)",AdWertRoll - AdNeutralRoll/8, AdNeutralRoll/8, AdNeutralRoll%8); |
LCD_printfxy(0,3,"Gier%4i (%3i)",AdNeutralGier - AdWertGier, AdNeutralGier); |
} |
else |
if((PlatinenVersion == 11) || (PlatinenVersion >= 20)) |
{ |
LCD_printfxy(0,1,"Nick %4i (%3i.%x)",AdWertNick - AdNeutralNick/8, AdNeutralNick/16, (AdNeutralNick%16)/2); |
LCD_printfxy(0,2,"Roll %4i (%3i.%x)",AdWertRoll - AdNeutralRoll/8, AdNeutralRoll/16, (AdNeutralRoll%16)/2); |
LCD_printfxy(0,3,"Yaw %4i (%3i)",AdNeutralGier - AdWertGier, AdNeutralGier/2); |
} |
else |
if(PlatinenVersion == 13) |
{ |
LCD_printfxy(0,1,"Nick %4i (%3i)(%3i)",AdWertNick - AdNeutralNick/8, AdNeutralNick/16,AnalogOffsetNick); |
LCD_printfxy(0,2,"Roll %4i (%3i)(%3i)",AdWertRoll - AdNeutralRoll/8, AdNeutralRoll/16,AnalogOffsetRoll); |
LCD_printfxy(0,3,"Yaw %4i (%3i)(%3i)",AdNeutralGier - AdWertGier, AdNeutralGier/2,AnalogOffsetGier); |
} |
*/ |
break; |
case 6: |
LCD_printfxy(0,0,"ACC - Sensor"); |
LCD_printfxy(0,1,"Nick %4i (%3i)",AdWertAccNick,NeutralAccX); |
LCD_printfxy(0,2,"Roll %4i (%3i)",AdWertAccRoll,NeutralAccY); |
LCD_printfxy(0,3,"Z %4i (%3i)",AdWertAccHoch,(int)NeutralAccZ); |
break; |
case 7: |
LCD_printfxy(0,0,"Voltage: %3i.%1iV",UBat/10, UBat%10); |
LCD_printfxy(0,1,"Current: %3i.%1iA",Capacity.ActualCurrent/10, Capacity.ActualCurrent%10); |
LCD_printfxy(0,2,"Power: %4iW",Capacity.ActualPower); |
LCD_printfxy(0,3,"Discharge: %5imAh", Capacity.UsedCapacity); |
break; |
case 8: |
LCD_printfxy(0,0,"Receiver"); |
// LCD_printfxy(0,1,"RC-RSSI: %4i", PPM_in[0]); |
LCD_printfxy(0,2,"RC-Quality: %4i", SenderOkay); |
LCD_printfxy(0,3,"RC-Channels:%4i", Channels-1); |
break; |
case 9: |
LCD_printfxy(0,0,"Compass"); |
LCD_printfxy(0,1,"Magnet: %5i",KompassValue); |
LCD_printfxy(0,2,"Gyro: %5i",ErsatzKompassInGrad); |
LCD_printfxy(0,3,"Setpoint: %5i",KompassSollWert); |
break; |
case 10: |
for(i=0;i<4;i++) LCD_printfxy(0,i,"Poti%i: %3i",i+1,Poti[i]); |
break; |
case 11: |
for(i=0;i<4;i++) LCD_printfxy(0,i,"Poti%i: %3i",i+5,Poti[i+4]); |
break; |
case 12: |
//#if (defined(__AVR_ATmega1284__) || defined(__AVR_ATmega1284P__)) |
LCD_printfxy(0,0,"Servo " ); |
LCD_printfxy(0,1,"Setpoint %3i",Parameter_ServoNickControl); |
LCD_printfxy(0,2,"Position: %3i",ServoNickValue/4); |
LCD_printfxy(0,3,"Range:%3i-%3i",EE_Parameter.ServoNickMin,EE_Parameter.ServoNickMax); |
break; |
/* case 13: |
LCD_printfxy(0,0,"ExternControl " ); |
LCD_printfxy(0,1,"Ni:%4i Ro:%4i ",ExternControl.Nick,ExternControl.Roll); |
LCD_printfxy(0,2,"Gs:%4i Gi:%4i ",ExternControl.Gas,ExternControl.Gier); |
LCD_printfxy(0,3,"Hi:%4i Cf:%4i ",ExternControl.Hight,ExternControl.Config); |
break; |
*/ |
//#endif |
case 13: |
LCD_printfxy(0,0,"BL-Ctrl Errors " ); |
for(i=0;i<3;i++) |
{ |
LCD_printfxy(0,i+1,"%3d %3d %3d %3d ",Motor[i*4].State & MOTOR_STATE_ERROR_MASK,Motor[i*4+1].State & MOTOR_STATE_ERROR_MASK,Motor[i*4+2].State & MOTOR_STATE_ERROR_MASK,Motor[i*4+3].State & MOTOR_STATE_ERROR_MASK); |
// if(i*4 >= RequiredMotors) break; |
} |
break; |
case 14: |
LCD_printfxy(0,0,"BL Temperature" ); |
for(i=0;i<3;i++) |
{ |
LCD_printfxy(0,i+1,"%3d %3d %3d %3d ",Motor[i*4].Temperature,Motor[i*4+1].Temperature,Motor[i*4+2].Temperature,Motor[i*4+3].Temperature); |
// if(4 + i * 4 >= RequiredMotors) break; |
} |
break; |
//#if (defined(__AVR_ATmega1284__) || defined(__AVR_ATmega1284P__)) |
case 15: |
LCD_printfxy(0,0,"BL Current" ); |
LCD_printfxy(11,3,"(in 0.1A)" ); |
for(i=0;i<3;i++) |
{ |
// LCD_printfxy(0,i+1,"%3d %3d %3d %3d ",Motor[i*4].Current,Motor[i*4+1].Current,Motor[i*4+2].Current,Motor[i*4+3].Current); |
LCD_printfxy(0,i+1,"%3d %3d %3d %3d ",BL3_Current(i*4),BL3_Current(i*4+1),BL3_Current(i*4+2),BL3_Current(i*4+3)); |
// LCD_printfxy(0,i+1,"%3d %3d %3d %3d ",Motor[i*4].MaxPWM,Motor[i*4+1].MaxPWM,Motor[i*4+2].MaxPWM,Motor[i*4+3].MaxPWM); |
if(4 + i * 4 >= RequiredMotors) break; |
} |
break; |
//#endif |
case 16: |
LCD_printfxy(0,0,"BL-Ctrl found " ); |
LCD_printfxy(0,1," %c %c %c %c ",'-' + 4 * (Motor[0].State>>7),'-' + 5 * (Motor[1].State>>7),'-' + 6 * (Motor[2].State>>7),'-' + 7 * (Motor[3].State>>7)); |
LCD_printfxy(0,2," %c %c %c %c ",'-' + 8 * (Motor[4].State>>7),'-' + 9 * (Motor[5].State>>7),'-' + 10 * (Motor[6].State>>7),'-' + 11 * (Motor[7].State>>7)); |
LCD_printfxy(0,3," %c - - - ",'-' + 12 * (Motor[8].State>>7)); |
if(Motor[9].State>>7) LCD_printfxy(4,3,"10"); |
if(Motor[10].State>>7) LCD_printfxy(8,3,"11"); |
if(Motor[11].State>>7) LCD_printfxy(12,3,"12"); |
break; |
case 17: |
LCD_printfxy(0,0,"Flight-Time " ); |
LCD_printfxy(0,1,"Total:%5umin",FlugMinutenGesamt); |
LCD_printfxy(0,2,"Act: %5umin",FlugMinuten); |
LCD_printfxy(13,3,"(reset)"); |
if(RemoteKeys & KEY4) |
{ |
FlugMinuten = 0; |
SetParamWord(PID_FLIGHT_MINUTES, FlugMinuten); |
} |
break; |
default: |
if(MenuePunkt == MaxMenue) MaxMenue--; |
MenuePunkt = 0; |
break; |
} |
RemoteKeys = 0; |
} |
/branches/V2.02a_FirstTrial_Peter/menu.h |
---|
0,0 → 1,17 |
#ifndef _MENU_H |
#define _MENU_H |
extern void Menu(void); |
extern void LcdClear(void); |
extern void Menu_Putchar(char c); |
extern char DisplayBuff[80]; |
extern unsigned char DispPtr; |
extern unsigned char MaxMenue; |
extern unsigned char MenuePunkt; |
extern unsigned char RemoteKeys; |
#define LCD_printfxy(x,y,format, args...) { DispPtr = (y) * 20 + (x); _printf_P(&Menu_Putchar,PSTR(format) , ## args);} |
#define LCD_printf(format, args...) { _printf_P(&Menu_Putchar, PSTR(format) , ## args);} |
#endif //_MENU_H |
/branches/V2.02a_FirstTrial_Peter/mymath.c |
---|
0,0 → 1,41 |
#include <stdlib.h> |
#include <avr/pgmspace.h> |
#include "mymath.h" |
// discrete mathematics |
// Sinus with argument in degree at an angular resolution of 1 degree and a discretisation of 13 bit. |
const uint16_t pgm_sinlookup[91] PROGMEM = {0, 143, 286, 429, 571, 714, 856, 998, 1140, 1282, 1423, 1563, 1703, 1843, 1982, 2120, 2258, 2395, 2531, 2667, 2802, 2936, 3069, 3201, 3332, 3462, 3591, 3719, 3846, 3972, 4096, 4219, 4341, 4462, 4581, 4699, 4815, 4930, 5043, 5155, 5266, 5374, 5482, 5587, 5691, 5793, 5893, 5991, 6088, 6183, 6275, 6366, 6455, 6542, 6627, 6710, 6791, 6870, 6947, 7022, 7094, 7165, 7233, 7299, 7363, 7424, 7484, 7541, 7595, 7648, 7698, 7746, 7791, 7834, 7875, 7913, 7949, 7982, 8013, 8041, 8068, 8091, 8112, 8131, 8147, 8161, 8172, 8181, 8187, 8191, 8192}; |
int16_t c_sin_8192(int16_t angle) |
{ |
int8_t m,n; |
int16_t sinus; |
// avoid negative angles |
if (angle < 0) |
{ |
m = -1; |
angle = abs(angle); |
} |
else m = +1; |
// fold angle to intervall 0 to 359 |
angle %= 360; |
// check quadrant |
if (angle <= 90) n=1; // first quadrant |
else if ((angle > 90) && (angle <= 180)) {angle = 180 - angle; n = 1;} // second quadrant |
else if ((angle > 180) && (angle <= 270)) {angle = angle - 180; n = -1;} // third quadrant |
else {angle = 360 - angle; n = -1;} //fourth quadrant |
// get lookup value |
sinus = pgm_read_word(&pgm_sinlookup[angle]); |
// calculate sinus value |
return (sinus * m * n); |
} |
// Cosinus with argument in degree at an angular resolution of 1 degree and a discretisation of 13 bit. |
int16_t c_cos_8192(int16_t angle) |
{ |
return (c_sin_8192(90 - angle)); |
} |
/branches/V2.02a_FirstTrial_Peter/mymath.h |
---|
0,0 → 1,10 |
#ifndef _MYMATH_H |
#define _MYMATH_H |
#include <inttypes.h> |
extern int16_t c_sin_8192(int16_t angle); |
extern int16_t c_cos_8192(int16_t angle); |
extern int16_t c_atan2(int16_t y, int16_t x); |
extern uint32_t c_sqrt(uint32_t a); |
#endif // _MYMATH_H |
/branches/V2.02a_FirstTrial_Peter/old_macros.h |
---|
0,0 → 1,47 |
/* |
For backwards compatibility only. |
Ingo Busker ingo@mikrocontroller.com |
*/ |
#ifndef cbi |
#define cbi(sfr, bit) (_SFR_BYTE(sfr) &= ~_BV(bit)) |
#endif |
#ifndef sbi |
#define sbi(sfr, bit) (_SFR_BYTE(sfr) |= _BV(bit)) |
#endif |
#ifndef inb |
#define inb(sfr) _SFR_BYTE(sfr) |
#endif |
#ifndef outb |
#define outb(sfr, val) (_SFR_BYTE(sfr) = (val)) |
#endif |
#ifndef inw |
#define inw(sfr) _SFR_WORD(sfr) |
#endif |
#ifndef outw |
#define outw(sfr, val) (_SFR_WORD(sfr) = (val)) |
#endif |
#ifndef outp |
#define outp(val, sfr) outb(sfr, val) |
#endif |
#ifndef inp |
#define inp(sfr) inb(sfr) |
#endif |
#ifndef BV |
#define BV(bit) _BV(bit) |
#endif |
#ifndef PRG_RDB |
#define PRG_RDB pgm_read_byte |
#endif |
/branches/V2.02a_FirstTrial_Peter/printf_P.h |
---|
0,0 → 1,69 |
// Die Funktion printf_P() unterliegt ihrer eigenen Lizenz und ist nicht von der Lizenz für den MikroKopter-Teil unterstellt |
/* |
Copyright (C) 1993 Free Software Foundation |
This file is part of the GNU IO Library. This library is free |
software; you can redistribute it and/or modify it under the |
terms of the GNU General Public License as published by the |
Free Software Foundation; either version 2, or (at your option) |
any later version. |
This library is distributed in the hope that it will be useful, |
but WITHOUT ANY WARRANTY; without even the implied warranty of |
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
GNU General Public License for more details. |
You should have received a copy of the GNU General Public License |
along with this library; see the file COPYING. If not, write to the Free |
Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. |
As a special exception, if you link this library with files |
compiled with a GNU compiler to produce an executable, this does not cause |
the resulting executable to be covered by the GNU General Public License. |
This exception does not however invalidate any other reasons why |
the executable file might be covered by the GNU General Public License. */ |
/* |
* Copyright (c) 1990 Regents of the University of California. |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* 1. Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* 2. Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* 3. [rescinded 22 July 1999] |
* 4. Neither the name of the University nor the names of its contributors |
* may be used to endorse or promote products derived from this software |
* without specific prior written permission. |
* |
* THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND |
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE |
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE |
* ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE |
* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL |
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS |
* OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) |
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT |
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY |
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF |
* SUCH DAMAGE. |
*/ |
/******************************************************************************/ |
#ifndef _PRINTF_P_H_ |
#define _PRINTF_P_H_ |
#include <avr/pgmspace.h> |
// function pointer to external callback function |
typedef void (*pVoidFnctChar) (char ); |
typedef void (*pVoidFnct_pVoidFnctChar_const_fmt) (pVoidFnctChar, char const *fmt0, ...); |
extern pVoidFnct_pVoidFnctChar_const_fmt _printf_P; |
#endif //_PRINTF_P_H_ |
/branches/V2.02a_FirstTrial_Peter/rc.c |
---|
0,0 → 1,283 |
/*####################################################################################### |
Decodieren eines RC Summen Signals |
#######################################################################################*/ |
// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
// + www.MikroKopter.com |
// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
// + Software Nutzungsbedingungen (english version: see below) |
// + der Fa. HiSystems GmbH, Flachsmeerstrasse 2, 26802 Moormerland - nachfolgend Lizenzgeber genannt - |
// + Der Lizenzgeber räumt dem Kunden ein nicht-ausschließliches, zeitlich und räumlich* unbeschränktes Recht ein, die im den |
// + Mikrocontroller verwendete Firmware für die Hardware Flight-Ctrl, Navi-Ctrl, BL-Ctrl, MK3Mag & PC-Programm MikroKopter-Tool |
// + - nachfolgend Software genannt - nur für private Zwecke zu nutzen. |
// + Der Einsatz dieser Software ist nur auf oder mit Produkten des Lizenzgebers zulässig. |
// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
// + Die vom Lizenzgeber gelieferte Software ist urheberrechtlich geschützt. Alle Rechte an der Software sowie an sonstigen im |
// + Rahmen der Vertragsanbahnung und Vertragsdurchführung überlassenen Unterlagen stehen im Verhältnis der Vertragspartner ausschließlich dem Lizenzgeber zu. |
// + Die in der Software enthaltenen Copyright-Vermerke, Markenzeichen, andere Rechtsvorbehalte, Seriennummern sowie |
// + sonstige der Programmidentifikation dienenden Merkmale dürfen vom Kunden nicht verändert oder unkenntlich gemacht werden. |
// + Der Kunde trifft angemessene Vorkehrungen für den sicheren Einsatz der Software. Er wird die Software gründlich auf deren |
// + Verwendbarkeit zu dem von ihm beabsichtigten Zweck testen, bevor er diese operativ einsetzt. |
// + Die Haftung des Lizenzgebers wird - soweit gesetzlich zulässig - begrenzt in Höhe des typischen und vorhersehbaren |
// + Schadens. Die gesetzliche Haftung bei Personenschäden und nach dem Produkthaftungsgesetz bleibt unberührt. Dem Lizenzgeber steht jedoch der Einwand |
// + des Mitverschuldens offen. |
// + Der Kunde trifft angemessene Vorkehrungen für den Fall, dass die Software ganz oder teilweise nicht ordnungsgemäß arbeitet. |
// + Er wird die Software gründlich auf deren Verwendbarkeit zu dem von ihm beabsichtigten Zweck testen, bevor er diese operativ einsetzt. |
// + Der Kunde wird er seine Daten vor Einsatz der Software nach dem Stand der Technik sichern. |
// + Der Kunde ist darüber unterrichtet, dass der Lizenzgeber seine Daten im zur Vertragsdurchführung erforderlichen Umfang |
// + und auf Grundlage der Datenschutzvorschriften erhebt, speichert, verarbeitet und, sofern notwendig, an Dritte übermittelt. |
// + *) Die räumliche Nutzung bezieht sich nur auf den Einsatzort, nicht auf die Reichweite der programmierten Software. |
// + #### ENDE DER NUTZUNGSBEDINGUNGEN ####' |
// + Hinweis: Informationen über erweiterte Nutzungsrechte (wie z.B. Nutzung für nicht-private Zwecke) sind auf Anfrage per Email an info(@)hisystems.de verfügbar. |
// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
// + Software LICENSING TERMS |
// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
// + of HiSystems GmbH, Flachsmeerstrasse 2, 26802 Moormerland, Germany - the Licensor - |
// + The Licensor grants the customer a non-exclusive license to use the microcontroller firmware of the Flight-Ctrl, Navi-Ctrl, BL-Ctrl, and MK3Mag hardware |
// + (the Software) exclusively for private purposes. The License is unrestricted with respect to time and territory*. |
// + The Software may only be used with the Licensor's products. |
// + The Software provided by the Licensor is protected by copyright. With respect to the relationship between the parties to this |
// + agreement, all rights pertaining to the Software and other documents provided during the preparation and execution of this |
// + agreement shall be the property of the Licensor. |
// + The information contained in the Software copyright notices, trademarks, other legal reservations, serial numbers and other |
// + features that can be used to identify the program may not be altered or defaced by the customer. |
// + The customer shall be responsible for taking reasonable precautions |
// + for the safe use of the Software. The customer shall test the Software thoroughly regarding its suitability for the |
// + intended purpose before implementing it for actual operation. The Licensor's liability shall be limited to the extent of typical and |
// + foreseeable damage to the extent permitted by law, notwithstanding statutory liability for bodily injury and product |
// + liability. However, the Licensor shall be entitled to the defense of contributory negligence. |
// + The customer will take adequate precautions in the case, that the software is not working properly. The customer will test |
// + the software for his purpose before any operational usage. The customer will backup his data before using the software. |
// + The customer understands that the Licensor collects, stores and processes, and, where required, forwards, customer data |
// + to third parties to the extent necessary for executing the agreement, subject to applicable data protection and privacy regulations. |
// + *) The territory aspect only refers to the place where the Software is used, not its programmed range. |
// + #### END OF LICENSING TERMS #### |
// + Note: For information on license extensions (e.g. commercial use), please contact us at info(@)hisystems.de. |
// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
#include "rc.h" |
#include "main.h" |
// Achtung: ACT_S3D_SUMMENSIGNAL wird in der Main.h gesetzt |
#define MAX_RC_IN 16+12+3+4 // 16ch + 12ser + 3stages + 4 reserved |
volatile int PPM_in[MAX_RC_IN]; |
volatile int PPM_diff[MAX_RC_IN]; // das differnzierte Stick-Signal |
volatile char Channels,tmpChannels = 0; |
volatile unsigned char NewPpmData = 1; |
unsigned int PPM_Neutral = 466; |
//############################################################################ |
// Clear the values |
void rc_sum_init(void) |
//############################################################################ |
{ |
unsigned char i; |
for(i=0;i<MAX_RC_IN;i++) |
{ |
if(i < 5) PPM_in[i] = 0; else PPM_in[i] = -127; |
PPM_diff[i] = 0; |
} |
PPM_in[PPM_IN_MAX] = +127; |
PPM_in[PPM_IN_OFF] = -127; |
PPM_in[PPM_IN_MID] = 0; |
AdNeutralGier = 0; |
AdNeutralRoll = 0; |
AdNeutralNick = 0; |
return; |
} |
#ifndef ACT_S3D_SUMMENSIGNAL |
//############################################################################ |
// Interrupt function for the PPM-Input |
ISR(TIMER1_CAPT_vect) |
//############################################################################ |
{ |
#if (defined(__AVR_ATmega1284__) || defined(__AVR_ATmega1284P__)) |
if(!(EE_Parameter.ExtraConfig & CFG_SENSITIVE_RC)) |
#endif |
{ |
static unsigned int AltICR=0; |
signed int signal = 0,tmp; |
static int index; |
signal = (unsigned int) ICR1 - AltICR; |
AltICR = ICR1; |
//Syncronisationspause? (3.52 ms < signal < 25.6 ms) |
if((signal > 1100) && (signal < 8000)) |
{ |
Channels = index; |
if(index >= 4) NewPpmData = 0; // Null bedeutet: Neue Daten |
index = 1; |
} |
else |
{ |
if(index < 13+4) |
{ |
if((signal > 250) && (signal < 687)) |
{ |
signal -= PPM_Neutral; |
// Stabiles Signal |
if(EE_Parameter.FailsafeChannel == 0 || PPM_in[EE_Parameter.FailsafeChannel] < 100) // forces Failsafe if the receiver doesn't have 'signal loss' on Failsafe |
{ |
if(abs(signal - PPM_in[index]) < 6) { if(SenderOkay < 200) SenderOkay += 10; else SenderOkay = 200;} |
} |
tmp = (3 * (PPM_in[index]) + signal) / 4; |
if(tmp > signal+1) tmp--; else |
if(tmp < signal-1) tmp++; |
if(SenderOkay >= 195) PPM_diff[index] = ((tmp - PPM_in[index]) / 3) * 3; |
else PPM_diff[index] = 0; |
PPM_in[index] = tmp; |
} |
index++; |
#if (defined(__AVR_ATmega1284__) || defined(__AVR_ATmega1284P__)) |
#else |
if(PlatinenVersion < 20) |
{ |
if(index == 5) J3High; else J3Low; // Servosignal an J3 anlegen |
if(index == 6) J4High; else J4Low; // Servosignal an J4 anlegen |
if(index == 7) J5High; else J5Low; // Servosignal an J5 anlegen |
} |
#endif |
} |
} |
} |
#if (defined(__AVR_ATmega1284__) || defined(__AVR_ATmega1284P__)) |
else |
{ |
static unsigned int AltICR=0; |
static int ppm_in[13+4]; |
static int ppm_diff[13+4]; |
static int old_ppm_in[13+4]; |
static int old_ppm_diff[13+4]; |
signed int signal = 0,tmp; |
static unsigned char index, okay_cnt = 0; |
signal = (unsigned int) ICR1 - AltICR; |
AltICR = ICR1; |
//Syncronisationspause? (3.52 ms < signal < 25.6 ms) |
if((signal > 1100) && (signal < 8000)) |
{ |
tmpChannels = index; |
if(tmpChannels >= 4 && Channels == tmpChannels) |
{ |
if(okay_cnt > 10) |
{ |
NewPpmData = 0; // Null bedeutet: Neue Daten |
for(index = 0; index < 13+4; index++) |
{ |
if(okay_cnt > 30) |
{ |
old_ppm_in[index] = PPM_in[index]; |
old_ppm_diff[index] = PPM_diff[index]; |
} |
PPM_in[index] = ppm_in[index]; |
PPM_diff[index] = ppm_diff[index]; |
} |
} |
if(okay_cnt < 255) okay_cnt++; |
} |
else |
{ |
if(okay_cnt > 100) okay_cnt = 10; else okay_cnt = 0; |
ROT_ON; |
} |
index = 1; |
if(!MotorenEin) Channels = tmpChannels; |
} |
else |
{ |
if(index < 13+4) |
{ |
if((signal > 250) && (signal < 687)) |
{ |
signal -= PPM_Neutral; |
// Stabiles Signal |
if((abs(signal - ppm_in[index]) < 6)) |
{ |
if(EE_Parameter.FailsafeChannel == 0 || PPM_in[EE_Parameter.FailsafeChannel] < 100) // forces Failsafe if the receiver doesn't have 'signal loss' on Failsafe |
{ |
if(okay_cnt > 25) SenderOkay += 10; |
else |
if(okay_cnt > 10) SenderOkay += 2; |
if(SenderOkay > 200) SenderOkay = 200; |
} |
} |
tmp = (3 * (ppm_in[index]) + signal) / 4; |
if(tmp > signal+1) tmp--; else |
if(tmp < signal-1) tmp++; |
if(SenderOkay >= 190) ppm_diff[index] = ((tmp - ppm_in[index]) / 3) * 3; |
else ppm_diff[index] = 0; |
ppm_in[index] = tmp; |
} |
else ROT_ON; |
#if (defined(__AVR_ATmega1284__) || defined(__AVR_ATmega1284P__)) |
#else |
if(PlatinenVersion < 20) |
{ |
if(index == 5) J3High; else J3Low; // Servosignal an J3 anlegen |
if(index == 6) J4High; else J4Low; // Servosignal an J4 anlegen |
if(index == 7) J5High; else J5Low; // Servosignal an J5 anlegen |
} |
#endif |
} |
if(index < 20) index++; |
else |
if(index == 20) |
{ |
unsigned char i; |
ROT_ON; |
index = 30; |
for(i=0;i<13+4;i++) // restore from older data |
{ |
PPM_in[i] = old_ppm_in[i]; |
PPM_diff[i] = 0; |
// okay_cnt /= 2; |
} |
} |
} |
} |
#endif |
} |
#else |
//############################################################################ |
// Interrupt function for the PPM-Input |
ISR(TIMER1_CAPT_vect) |
//############################################################################ |
{ |
static unsigned int AltICR=0; |
signed int signal = 0,tmp; |
static int index; |
signal = (unsigned int) ICR1 - AltICR; |
signal /= 2; |
AltICR = ICR1; |
//Syncronisationspause? |
if((signal > 1100*2) && (signal < 8000*2)) |
{ |
if(index >= 4) NewPpmData = 0; // Null bedeutet: Neue Daten |
index = 1; |
} |
else |
{ |
if(index < 13) |
{ |
if((signal > 250) && (signal < 687*2)) |
{ |
signal -= 962; |
// Stabiles Signal |
if(abs(signal - PPM_in[index]) < 6) { if(SenderOkay < 200) SenderOkay += 10;} |
tmp = (3 * (PPM_in[index]) + signal) / 4; |
if(tmp > signal+1) tmp--; else |
if(tmp < signal-1) tmp++; |
if(SenderOkay >= 195) PPM_diff[index] = ((tmp - PPM_in[index]) / 3) * 3; |
else PPM_diff[index] = 0; |
PPM_in[index] = tmp; |
} |
index++; |
} |
} |
} |
#endif |
/branches/V2.02a_FirstTrial_Peter/rc.h |
---|
0,0 → 1,42 |
/*####################################################################################### |
Derkodieren eines RC Summen Signals |
#######################################################################################*/ |
#ifndef _RC_H |
#define _RC_H |
#if defined (__AVR_ATmega644__) |
#define TIMER_RELOAD_VALUE 250 |
#endif |
#if defined (__AVR_ATmega644P__) |
#define TIMER_RELOAD_VALUE 250 |
#endif |
#define MAX_RC_IN 16+12+3+4 // 16ch + 12ser + 3stages + 4 reserved |
extern void rc_sum_init (void); |
extern volatile int PPM_in[MAX_RC_IN]; |
extern volatile int PPM_diff[MAX_RC_IN]; // das diffenzierte Stick-Signal |
extern volatile unsigned char NewPpmData; |
extern volatile char Channels,tmpChannels; |
extern unsigned int PPM_Neutral; |
// 0 -> frei bzw. ACT rssi |
// 1 - 16 -> 1-16 |
// 17 - 28 -> 12 Serial channels |
// 29 -> WP-Event kanal |
// 30 -> -127 |
// 31 -> 0 |
// 32 -> 128 |
#define SERIAL_POTI_START 17 |
#define WP_EVENT_PPM_IN 29 |
#define PPM_IN_OFF 30 |
#define PPM_IN_MAX 31 |
#define PPM_IN_MID 32 |
#define FromNC_WP_EventChannel PPM_in[WP_EVENT_PPM_IN] // WP_EVENT-Channel-Value |
#endif //_RC_H |
/branches/V2.02a_FirstTrial_Peter/sbus.c |
---|
0,0 → 1,199 |
/*####################################################################################### |
Decodes the sbus protocol |
#######################################################################################*/ |
// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
// + www.MikroKopter.com |
// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
// + Software Nutzungsbedingungen (english version: see below) |
// + der Fa. HiSystems GmbH, Flachsmeerstrasse 2, 26802 Moormerland - nachfolgend Lizenzgeber genannt - |
// + Der Lizenzgeber räumt dem Kunden ein nicht-ausschließliches, zeitlich und räumlich* unbeschränktes Recht ein, die im den |
// + Mikrocontroller verwendete Firmware für die Hardware Flight-Ctrl, Navi-Ctrl, BL-Ctrl, MK3Mag & PC-Programm MikroKopter-Tool |
// + - nachfolgend Software genannt - nur für private Zwecke zu nutzen. |
// + Der Einsatz dieser Software ist nur auf oder mit Produkten des Lizenzgebers zulässig. |
// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
// + Die vom Lizenzgeber gelieferte Software ist urheberrechtlich geschützt. Alle Rechte an der Software sowie an sonstigen im |
// + Rahmen der Vertragsanbahnung und Vertragsdurchführung überlassenen Unterlagen stehen im Verhältnis der Vertragspartner ausschließlich dem Lizenzgeber zu. |
// + Die in der Software enthaltenen Copyright-Vermerke, Markenzeichen, andere Rechtsvorbehalte, Seriennummern sowie |
// + sonstige der Programmidentifikation dienenden Merkmale dürfen vom Kunden nicht verändert oder unkenntlich gemacht werden. |
// + Der Kunde trifft angemessene Vorkehrungen für den sicheren Einsatz der Software. Er wird die Software gründlich auf deren |
// + Verwendbarkeit zu dem von ihm beabsichtigten Zweck testen, bevor er diese operativ einsetzt. |
// + Die Haftung des Lizenzgebers wird - soweit gesetzlich zulässig - begrenzt in Höhe des typischen und vorhersehbaren |
// + Schadens. Die gesetzliche Haftung bei Personenschäden und nach dem Produkthaftungsgesetz bleibt unberührt. Dem Lizenzgeber steht jedoch der Einwand |
// + des Mitverschuldens offen. |
// + Der Kunde trifft angemessene Vorkehrungen für den Fall, dass die Software ganz oder teilweise nicht ordnungsgemäß arbeitet. |
// + Er wird die Software gründlich auf deren Verwendbarkeit zu dem von ihm beabsichtigten Zweck testen, bevor er diese operativ einsetzt. |
// + Der Kunde wird er seine Daten vor Einsatz der Software nach dem Stand der Technik sichern. |
// + Der Kunde ist darüber unterrichtet, dass der Lizenzgeber seine Daten im zur Vertragsdurchführung erforderlichen Umfang |
// + und auf Grundlage der Datenschutzvorschriften erhebt, speichert, verarbeitet und, sofern notwendig, an Dritte übermittelt. |
// + *) Die räumliche Nutzung bezieht sich nur auf den Einsatzort, nicht auf die Reichweite der programmierten Software. |
// + #### ENDE DER NUTZUNGSBEDINGUNGEN ####' |
// + Hinweis: Informationen über erweiterte Nutzungsrechte (wie z.B. Nutzung für nicht-private Zwecke) sind auf Anfrage per Email an info(@)hisystems.de verfügbar. |
// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
// + Software LICENSING TERMS |
// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
// + of HiSystems GmbH, Flachsmeerstrasse 2, 26802 Moormerland, Germany - the Licensor - |
// + The Licensor grants the customer a non-exclusive license to use the microcontroller firmware of the Flight-Ctrl, Navi-Ctrl, BL-Ctrl, and MK3Mag hardware |
// + (the Software) exclusively for private purposes. The License is unrestricted with respect to time and territory*. |
// + The Software may only be used with the Licensor's products. |
// + The Software provided by the Licensor is protected by copyright. With respect to the relationship between the parties to this |
// + agreement, all rights pertaining to the Software and other documents provided during the preparation and execution of this |
// + agreement shall be the property of the Licensor. |
// + The information contained in the Software copyright notices, trademarks, other legal reservations, serial numbers and other |
// + features that can be used to identify the program may not be altered or defaced by the customer. |
// + The customer shall be responsible for taking reasonable precautions |
// + for the safe use of the Software. The customer shall test the Software thoroughly regarding its suitability for the |
// + intended purpose before implementing it for actual operation. The Licensor's liability shall be limited to the extent of typical and |
// + foreseeable damage to the extent permitted by law, notwithstanding statutory liability for bodily injury and product |
// + liability. However, the Licensor shall be entitled to the defense of contributory negligence. |
// + The customer will take adequate precautions in the case, that the software is not working properly. The customer will test |
// + the software for his purpose before any operational usage. The customer will backup his data before using the software. |
// + The customer understands that the Licensor collects, stores and processes, and, where required, forwards, customer data |
// + to third parties to the extent necessary for executing the agreement, subject to applicable data protection and privacy regulations. |
// + *) The territory aspect only refers to the place where the Software is used, not its programmed range. |
// + #### END OF LICENSING TERMS #### |
// + Note: For information on license extensions (e.g. commercial use), please contact us at info(@)hisystems.de. |
// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
#include "sbus.h" |
#include "main.h" |
#if (defined(__AVR_ATmega1284__) || defined(__AVR_ATmega1284P__)) |
unsigned char NewSBusData = 0, sBusBuffer[25]; |
//############################################################################ |
// USART1 initialisation from killagreg |
void SbusUartInit(void) |
//############################################################################ |
{ |
// -- Start of USART1 initialisation for Spekturm seriell-mode |
// USART1 Control and Status Register A, B, C and baud rate register |
uint8_t sreg = SREG; |
uint16_t ubrr = (uint16_t) ((uint32_t) SYSCLK/(8 * 100000) - 1); |
// disable all interrupts before reconfiguration |
cli(); |
// disable RX-Interrupt |
UCSR1B &= ~(1 << RXCIE1); |
// disable TX-Interrupt |
UCSR1B &= ~(1 << TXCIE1); |
// disable DRE-Interrupt |
UCSR1B &= ~(1 << UDRIE1); |
/* |
// set direction of RXD1 and TXD1 pins |
// set RXD1 (PD2) as an input pin |
PORTD |= (1 << PORTD2); |
DDRD &= ~(1 << DDD2); |
// set TXD1 (PD3) as an output pin |
PORTD |= (1 << PORTD3); |
DDRD |= (1 << DDD3); |
*/ |
// USART0 Baud Rate Register |
// set clock divider |
UBRR1H = (uint8_t)(ubrr>>8); |
UBRR1L = (uint8_t)ubrr; |
// enable double speed operation |
UCSR1A |= (1 << U2X1); |
// enable receiver and transmitter |
//UCSR1B = (1<<RXEN1)|(1<<TXEN1); |
UCSR1B = (1<<RXEN1); |
// set asynchronous mode |
UCSR1C &= ~(1 << UMSEL11); |
UCSR1C &= ~(1 << UMSEL10); |
// parity |
UCSR1C <= (1 << UPM11); // even |
UCSR1C &= ~(1 << UPM10); |
// stop bit |
UCSR1C |= (1 << USBS1); // two |
// 8-bit |
UCSR1B &= ~(1 << UCSZ12); |
UCSR1C |= (1 << UCSZ11); |
UCSR1C |= (1 << UCSZ10); |
// flush receive buffer explicit |
while(UCSR1A & (1<<RXC1)) UDR1; |
// enable RX-interrupts at the end |
UCSR1B |= (1 << RXCIE1); |
// -- End of USART1 initialisation |
// restore global interrupt flags |
sBusBuffer[23] |= 4; // This Bit contains the 'Signal loss' |
SREG = sreg; |
return; |
} |
// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
#define MIN_FRAMEGAP 68 // 7ms |
#define MAX_BYTEGAP 3 // 310us |
//############################################################################ |
// Is called by the uart RX interrupt |
//############################################################################ |
void SbusParser(unsigned char udr) |
{ |
static unsigned char ptr = 0; |
if(!SpektrumTimer && udr == 0x0f) // wait for the start |
{ |
ptr = 0; |
SpektrumTimer = 80; // 8ms gap |
} |
else |
{ |
if(++ptr == 24) // last byte |
{ |
NewSBusData = 1; |
} |
else |
if(ptr > 24) ptr = 25; |
else |
{ |
sBusBuffer[ptr] = udr; // collect all bytes |
} |
} |
} |
void ProcessSBus(void) |
{ |
static unsigned char load = 0; |
unsigned char bitmask8 = 1, sbyte = 2, i, index = 1, process; |
unsigned int bitmask11 = 256; |
signed int signal = 0,tmp; |
if(!(sBusBuffer[23] & 4)) // This Bit contains the 'Signal loss' |
{ |
TIMSK1 &= ~_BV(ICIE1); // disable PPM-Input |
if(EE_Parameter.FailsafeChannel == 0 || PPM_in[EE_Parameter.FailsafeChannel] < 100) // forces Failsafe if the receiver doesn't have 'signal loss' on Failsafe |
{ |
if(SenderOkay < 200) SenderOkay += 20; else SenderOkay = 200; |
} |
signal = sBusBuffer[1]; |
if(!load--) { process = (12*11 - 8); load = 2;} else process = (4*11 - 8); // lowers the processor load |
for(i = 0; i < process; i++) // collect the single bits |
{ |
if(sBusBuffer[sbyte] & bitmask8) signal |= bitmask11; |
bitmask8 *= 2; |
if(!bitmask8) |
{ |
bitmask8 = 1; |
sbyte++; |
} |
bitmask11 *= 2; |
if(bitmask11 == 2048) |
{ |
bitmask11 = 1; |
signal = (signal-1024) / 5; // the resolution is higher than required |
tmp = (3 * (PPM_in[index]) + signal) / 4; |
if(tmp > signal+1) tmp--; else |
if(tmp < signal-1) tmp++; |
if(SenderOkay >= 195) PPM_diff[index] = ((tmp - PPM_in[index]) / 3) * 3; |
else PPM_diff[index] = 0; |
PPM_in[index] = tmp; |
signal = 0; |
index++; // next channel |
} |
} |
NewPpmData = 0; // Null bedeutet: Neue Daten |
} |
NewSBusData = 0; |
} |
#endif |
/branches/V2.02a_FirstTrial_Peter/sbus.h |
---|
0,0 → 1,11 |
#ifndef _SBUS_H |
#define _SBUS_H |
#if (defined(__AVR_ATmega1284__) || defined(__AVR_ATmega1284P__)) |
extern unsigned char NewSBusData, sBusBuffer[25]; |
extern void SbusParser(unsigned char); |
extern void SbusUartInit(void); |
extern void ProcessSBus(void); |
#endif |
#endif |
/branches/V2.02a_FirstTrial_Peter/spi.c |
---|
0,0 → 1,403 |
// ######################## SPI - FlightCtrl ################### |
#include "main.h" |
#include "eeprom.h" |
//struct str_ToNaviCtrl_Version ToNaviCtrl_Version; |
//struct str_FromNaviCtrl_Version FromNaviCtrl_Version; |
struct str_ToNaviCtrl ToNaviCtrl; |
struct str_FromNaviCtrl FromNaviCtrl; |
struct str_FromNaviCtrl_Value FromNaviCtrl_Value; |
struct str_SPI_VersionInfo NC_Version; |
struct str_GPSInfo GPSInfo; |
unsigned char SPI_BufferIndex; |
unsigned char SPI_RxBufferIndex; |
signed char FromNC_Rotate_C = 32, FromNC_Rotate_S = 0; |
volatile unsigned char SPI_Buffer[sizeof(FromNaviCtrl)]; |
unsigned char *SPI_TX_Buffer; |
unsigned char SPITransferCompleted, SPI_ChkSum; |
unsigned char SPI_RxDataValid,NaviDataOkay = 250; |
unsigned char SPI_CommandSequence[] = { SPI_FCCMD_STICK, SPI_FCCMD_USER, SPI_FCCMD_PARAMETER1, |
SPI_FCCMD_STICK, SPI_FCCMD_VERSION, SPI_FCCMD_BL_ACCU, |
SPI_FCCMD_STICK, SPI_FCCMD_USER, SPI_FCCMD_MISC,SPI_FCCMD_SERVOS, |
SPI_FCCMD_STICK, SPI_FCCMD_PARAMETER2, SPI_FCCMD_BL_ACCU |
}; |
unsigned char SPI_CommandCounter = 0; |
unsigned char NC_ErrorCode = 0; |
unsigned char NC_GPS_ModeCharacter = ' '; |
unsigned char EarthMagneticField = 0; |
unsigned char EarthMagneticInclination = 0, EarthMagneticInclinationTheoretic = 0; |
unsigned char NC_To_FC_Flags = 0; |
unsigned char NC_To_FC_MaxAltitude = 0; // this is a Parameter on the SD-card |
signed int POI_KameraNick = 0; // in 0,1° |
vector16_t MagVec = {0,0,0}; |
#ifdef USE_SPI_COMMUNICATION |
//------------------------------------------------------ |
void SPI_MasterInit(void) |
{ |
DDR_SPI |= (1<<DD_MOSI)|(1<<DD_SCK); // Set MOSI and SCK output, all others input |
SLAVE_SELECT_DDR_PORT |= (1 << SPI_SLAVE_SELECT); |
SPCR = (1<<SPE)|(1<<MSTR)|(1<<SPR1)|(0<<SPR0)|(0<<SPIE); // Enable SPI, Master, set clock rate fck/64 |
SPSR = 0;//(1<<SPI2X); |
SLAVE_SELECT_PORT |= (1 << SPI_SLAVE_SELECT); |
SPITransferCompleted = 1; |
//SPDR = 0x00; // dummy write |
ToNaviCtrl.Sync1 = 0xAA; |
ToNaviCtrl.Sync2 = 0x83; |
ToNaviCtrl.Command = SPI_FCCMD_USER; |
ToNaviCtrl.IntegralNick = 0; |
ToNaviCtrl.IntegralRoll = 0; |
FromNaviCtrl_Value.SerialDataOkay = 0; |
SPI_RxDataValid = 0; |
} |
//------------------------------------------------------ |
unsigned char SPI_StartTransmitPacket(void) |
{ |
if(!SPITransferCompleted) return(0); |
SLAVE_SELECT_PORT &= ~(1 << SPI_SLAVE_SELECT); // SelectSlave |
SPI_TX_Buffer = (unsigned char *) &ToNaviCtrl; |
ToNaviCtrl.Command = SPI_CommandSequence[SPI_CommandCounter++]; |
if (SPI_CommandCounter >= sizeof(SPI_CommandSequence)) SPI_CommandCounter = 0; |
SPITransferCompleted = 0; |
UpdateSPI_Buffer(); // update buffer |
SPI_BufferIndex = 1; |
ToNaviCtrl.Chksum = ToNaviCtrl.Sync1; |
SPDR = ToNaviCtrl.Sync1; // Start transmission |
return(1); |
} |
//------------------------------------------------------ |
//SIGNAL(SIG_SPI) |
void SPI_TransmitByte(void) |
{ |
static unsigned char SPI_RXState = 0; |
unsigned char rxdata; |
static unsigned char rxchksum; |
if (SPITransferCompleted) return; |
if (!(SPSR & (1 << SPIF))) return; |
BytegapSPI = SPI_BYTEGAP; |
// _delay_us(30); |
SLAVE_SELECT_PORT |= (1 << SPI_SLAVE_SELECT); // DeselectSlave |
rxdata = SPDR; |
switch ( SPI_RXState) |
{ |
case 0: |
SPI_RxBufferIndex = 0; |
rxchksum = rxdata; |
if (rxdata == 0x81 ) { SPI_RXState = 1; } // 1. Syncbyte ok |
break; |
case 1: |
if (rxdata == 0x55) { rxchksum += rxdata; SPI_RXState = 2; } // 2. Syncbyte ok |
else SPI_RXState = 0; |
break; |
case 2: |
SPI_Buffer[SPI_RxBufferIndex++]= rxdata; // get data |
//DebugOut.Analog[19]++; |
if (SPI_RxBufferIndex >= sizeof(FromNaviCtrl)) |
{ |
if (rxdata == rxchksum) |
{ |
unsigned char *ptr = (unsigned char *)&FromNaviCtrl; |
memcpy(ptr, (unsigned char *) SPI_Buffer, sizeof(SPI_Buffer)); |
SPI_RxDataValid = 1; |
} |
else |
{ |
SPI_RxDataValid = 0; |
} |
SPI_RXState = 0; |
} |
else rxchksum += rxdata; |
break; |
} |
if (SPI_BufferIndex < sizeof(ToNaviCtrl)) |
{ |
SLAVE_SELECT_PORT &= ~(1 << SPI_SLAVE_SELECT); // SelectSlave |
asm volatile ("nop"); asm volatile ("nop"); asm volatile ("nop"); asm volatile ("nop"); |
SPDR = SPI_TX_Buffer[SPI_BufferIndex]; |
ToNaviCtrl.Chksum += SPI_TX_Buffer[SPI_BufferIndex]; |
} |
else SPITransferCompleted = 1; |
SPI_BufferIndex++; |
} |
//------------------------------------------------------ |
void UpdateSPI_Buffer(void) |
{ |
signed int tmp; |
static unsigned char motorindex, oldcommand = SPI_NCCMD_VERSION; |
ToNaviCtrl.IntegralNick = (int) (IntegralNick / (long)(EE_Parameter.GyroAccFaktor * 4)); // etwa in 0.1 Grad |
ToNaviCtrl.IntegralRoll = (int) (IntegralRoll / (long)(EE_Parameter.GyroAccFaktor * 4)); // etwa in 0.1 Grad |
ToNaviCtrl.GyroCompass = (10 * ErsatzKompass) / GIER_GRAD_FAKTOR; |
ToNaviCtrl.GyroGier = (signed int) AdNeutralGier - AdWertGier; |
ToNaviCtrl.AccNick = ((int) ACC_AMPLIFY * (NaviAccNick / NaviCntAcc))/4; |
ToNaviCtrl.AccRoll = ((int) ACC_AMPLIFY * (NaviAccRoll / NaviCntAcc))/4; |
NaviCntAcc = 0; NaviAccNick = 0; NaviAccRoll = 0; |
// ToNaviCtrl.User8 = Parameter_UserParam8; |
// ToNaviCtrl.CalState = WinkelOut.CalcState; |
switch(ToNaviCtrl.Command) // |
{ |
case SPI_FCCMD_USER: |
ToNaviCtrl.Param.Byte[0] = Parameter_UserParam1; |
ToNaviCtrl.Param.Byte[1] = Parameter_UserParam2; |
ToNaviCtrl.Param.Byte[2] = Parameter_UserParam3; |
ToNaviCtrl.Param.Byte[3] = Parameter_UserParam4; |
ToNaviCtrl.Param.Byte[4] = Parameter_UserParam5; |
ToNaviCtrl.Param.Byte[5] = Parameter_UserParam6; |
ToNaviCtrl.Param.Byte[6] = Parameter_UserParam7; |
ToNaviCtrl.Param.Byte[7] = Parameter_UserParam8; |
ToNaviCtrl.Param.Byte[8] = FC_StatusFlags; |
//if(FC_StatusFlags2 & FC_STATUS2_WAIT_FOR_TAKEOFF) ToNaviCtrl.Param.Byte[8] &= ~FC_STATUS_FLY; |
FC_StatusFlags &= ~(FC_STATUS_CALIBRATE | FC_STATUS_START); |
ToNaviCtrl.Param.Byte[9] = ActiveParamSet; |
ToNaviCtrl.Param.Byte[10] = (unsigned char) UBat; // 0.1V |
ToNaviCtrl.Param.Byte[11] = FC_StatusFlags2; |
if(!(PORTC & (1<<PORTC2))) FC_StatusFlags2 &= ~FC_STATUS2_OUT1_ACTIVE; // Out1 (J16) |
break; |
case SPI_FCCMD_BL_ACCU: |
ToNaviCtrl.Param.Int[0] = Capacity.ActualCurrent; // 0.1A |
ToNaviCtrl.Param.Int[1] = Capacity.UsedCapacity; // mAh |
ToNaviCtrl.Param.Byte[4] = GetChannelValue(EE_Parameter.NaviGpsModeChannel); // GPS-Mode control |
ToNaviCtrl.Param.Byte[5] = VarioCharacter; |
ToNaviCtrl.Param.Byte[6] = motorindex; |
ToNaviCtrl.Param.Byte[7] = Motor[motorindex].Version; |
ToNaviCtrl.Param.Byte[8] = Motor[motorindex].MaxPWM; |
ToNaviCtrl.Param.Byte[9] = Motor[motorindex].State; |
ToNaviCtrl.Param.Byte[10] = Motor[motorindex].Temperature; |
ToNaviCtrl.Param.Byte[11] = Motor[motorindex].Current; |
if(Mixer.Motor[++motorindex][0] == 0) // next motor is not used ? |
while(Mixer.Motor[motorindex][0] == 0 && motorindex) motorindex = (motorindex + 1) % 12; |
break; |
case SPI_FCCMD_PARAMETER1: |
ToNaviCtrl.Param.Byte[0] = (unsigned char) BattLowVoltageWarning; //0.1V |
ToNaviCtrl.Param.Byte[1] = EE_Parameter.NaviGpsGain; // Parameters for the Naviboard |
ToNaviCtrl.Param.Byte[2] = EE_Parameter.NaviGpsP; |
ToNaviCtrl.Param.Byte[3] = EE_Parameter.NaviGpsI; |
ToNaviCtrl.Param.Byte[4] = EE_Parameter.NaviGpsD; |
ToNaviCtrl.Param.Byte[5] = EE_Parameter.NaviGpsA; |
ToNaviCtrl.Param.Byte[6] = EE_Parameter.NaviGpsMinSat; |
ToNaviCtrl.Param.Byte[7] = EE_Parameter.NaviStickThreshold; |
ToNaviCtrl.Param.Byte[8] = EE_Parameter.NaviOperatingRadius; |
ToNaviCtrl.Param.Byte[9] = EE_Parameter.NaviWindCorrection; |
ToNaviCtrl.Param.Byte[10] = EE_Parameter.NaviAccCompensation; |
ToNaviCtrl.Param.Byte[11] = EE_Parameter.NaviAngleLimitation; |
break; |
case SPI_FCCMD_PARAMETER2: |
ToNaviCtrl.Param.Byte[0] = EE_Parameter.NaviOut1Parameter; // Distance between Photo releases |
#if (defined(__AVR_ATmega1284__) || defined(__AVR_ATmega1284P__)) |
// create the ToNC_SpeakHoTT |
if(EE_Parameter.Receiver != RECEIVER_HOTT) |
{ |
if(JetiBeep != 'B') JetiBeep = pgm_read_byte(&JETI_CODE[HoTT_Waring()]); |
else HoTT_Waring(); |
} |
ToNaviCtrl.Param.Byte[1] = ToNC_SpeakHoTT; |
#else |
ToNaviCtrl.Param.Byte[1] = 0; |
#endif |
ToNaviCtrl.Param.Byte[2] = EE_Parameter.LandingSpeed; |
ToNaviCtrl.Param.Byte[3] = EE_Parameter.ComingHomeAltitude; |
break; |
case SPI_FCCMD_STICK: |
cli(); |
tmp = PPM_in[EE_Parameter.Kanalbelegung[K_GAS]]; if(tmp > 127) tmp = 127; else if(tmp < -127) tmp = -127; |
ToNaviCtrl.Param.Byte[0] = (char) tmp; |
tmp = PPM_in[EE_Parameter.Kanalbelegung[K_GIER]]; if(tmp > 127) tmp = 127; else if(tmp < -127) tmp = -127; |
ToNaviCtrl.Param.Byte[1] = (char) tmp; |
tmp = PPM_in[EE_Parameter.Kanalbelegung[K_ROLL]]; if(tmp > 127) tmp = 127; else if(tmp < -127) tmp = -127; |
ToNaviCtrl.Param.Byte[2] = (char) tmp; |
tmp = PPM_in[EE_Parameter.Kanalbelegung[K_NICK]]; if(tmp > 127) tmp = 127; else if(tmp < -127) tmp = -127; |
sei(); |
ToNaviCtrl.Param.Byte[3] = (char) tmp; |
ToNaviCtrl.Param.Byte[4] = (unsigned char) Poti[0]; |
ToNaviCtrl.Param.Byte[5] = (unsigned char) Poti[1]; |
ToNaviCtrl.Param.Byte[6] = (unsigned char) Poti[2]; |
ToNaviCtrl.Param.Byte[7] = (unsigned char) Poti[3]; |
ToNaviCtrl.Param.Byte[8] = (unsigned char) Poti[4]; |
ToNaviCtrl.Param.Byte[9] = (unsigned char) Poti[5]; |
ToNaviCtrl.Param.Byte[10] = (unsigned char) Poti[6]; |
ToNaviCtrl.Param.Byte[11] = (unsigned char) Poti[7]; |
break; |
case SPI_FCCMD_MISC: |
if(WinkelOut.CalcState > 5) |
{ |
WinkelOut.CalcState = 0; |
ToNaviCtrl.Param.Byte[0] = 5; |
} |
else ToNaviCtrl.Param.Byte[0] = WinkelOut.CalcState; |
ToNaviCtrl.Param.Byte[1] = EE_Parameter.NaviPH_LoginTime; |
ToNaviCtrl.Param.Int[1] = (int)(HoehenWert/5); |
ToNaviCtrl.Param.Int[2] = (int)(SollHoehe/5); |
ToNaviCtrl.Param.Byte[6] = EE_Parameter.NaviGpsPLimit; |
ToNaviCtrl.Param.Byte[7] = EE_Parameter.NaviGpsILimit; |
ToNaviCtrl.Param.Byte[8] = EE_Parameter.NaviGpsDLimit; |
ToNaviCtrl.Param.Byte[9] = (unsigned char) SenderOkay; |
// ToNaviCtrl.Param.Byte[10] = (unsigned char) PPM_in[0]; // ACT RSSI |
ToNaviCtrl.Param.Byte[10] = NC_Wait_for_LED; |
ToNaviCtrl.Param.Byte[11] = DebugOut.Analog[7] / 4; //GasMischanteil |
break; |
case SPI_FCCMD_VERSION: |
ToNaviCtrl.Param.Byte[0] = VERSION_MAJOR; |
ToNaviCtrl.Param.Byte[1] = VERSION_MINOR; |
ToNaviCtrl.Param.Byte[2] = VERSION_PATCH; |
ToNaviCtrl.Param.Byte[3] = NC_SPI_COMPATIBLE; |
ToNaviCtrl.Param.Byte[4] = PlatinenVersion; |
ToNaviCtrl.Param.Byte[5] = VersionInfo.HardwareError[0]; |
ToNaviCtrl.Param.Byte[6] = VersionInfo.HardwareError[1]; |
VersionInfo.HardwareError[0] &= ~FC_ERROR0_CAREFREE; // VersionInfo.HardwareError[0] = 0; |
VersionInfo.HardwareError[1] &= FC_ERROR1_MIXER; |
ToNaviCtrl.Param.Byte[7] = EE_Parameter.CompassOffset; |
ToNaviCtrl.Param.Byte[8] = Parameter_GlobalConfig; |
ToNaviCtrl.Param.Byte[9] = Parameter_ExtraConfig; |
ToNaviCtrl.Param.Byte[10] = EE_Parameter.OrientationAngle; |
ToNaviCtrl.Param.Byte[11] = EE_Parameter.GlobalConfig3; |
break; |
case SPI_FCCMD_SERVOS: |
ToNaviCtrl.Param.Byte[0] = EE_Parameter.ServoNickRefresh; // Parameters for the Servo Control |
ToNaviCtrl.Param.Byte[1] = EE_Parameter.ServoCompInvert; |
ToNaviCtrl.Param.Byte[2] = Parameter_ServoNickControl; |
ToNaviCtrl.Param.Byte[3] = EE_Parameter.ServoNickComp; |
ToNaviCtrl.Param.Byte[4] = EE_Parameter.ServoNickMin; |
ToNaviCtrl.Param.Byte[5] = EE_Parameter.ServoNickMax; |
ToNaviCtrl.Param.Byte[6] = Parameter_ServoRollControl; |
ToNaviCtrl.Param.Byte[7] = EE_Parameter.ServoRollComp; |
ToNaviCtrl.Param.Byte[8] = EE_Parameter.ServoRollMin; |
ToNaviCtrl.Param.Byte[9] = EE_Parameter.ServoRollMax; |
ToNaviCtrl.Param.Byte[10] = Capacity.MinOfMaxPWM; |
ToNaviCtrl.Param.Byte[11] = DebugOut.Analog[28]; // I2C-Error counter |
break; |
} |
if(SPI_RxDataValid) |
{ |
if(FromNaviCtrl.Command != oldcommand) NaviDataOkay = 250; |
oldcommand = FromNaviCtrl.Command; |
CalculateCompassTimer = 1; |
if(abs(FromNaviCtrl.GPS_Nick) < 512 && abs(FromNaviCtrl.GPS_Roll) < 512 && (EE_Parameter.GlobalConfig & CFG_GPS_AKTIV)) |
{ |
GPS_Nick = FromNaviCtrl.GPS_Nick; |
GPS_Roll = FromNaviCtrl.GPS_Roll; |
} |
// update compass readings |
// MagVec.x = FromNaviCtrl.MagVecX; |
// MagVec.y = FromNaviCtrl.MagVecY; |
// MagVec.z = FromNaviCtrl.MagVecZ; |
if(FromNaviCtrl.CompassValue <= 360) KompassValue = FromNaviCtrl.CompassValue; |
// KompassRichtung = ((540 + KompassValue - KompassSollWert) % 360) - 180; |
if(FromNaviCtrl.BeepTime > beeptime && !DisableRcOffBeeping) beeptime = FromNaviCtrl.BeepTime; |
switch (FromNaviCtrl.Command) |
{ |
case SPI_NCCMD_KALMAN: |
FromNaviCtrl_Value.Kalman_K = FromNaviCtrl.Param.sByte[0]; |
FromNaviCtrl_Value.Kalman_MaxFusion = FromNaviCtrl.Param.sByte[1]; |
FromNaviCtrl_Value.Kalman_MaxDrift = FromNaviCtrl.Param.sByte[2]; |
KompassFusion = FromNaviCtrl.Param.sByte[3]; |
FromNaviCtrl_Value.GpsZ = FromNaviCtrl.Param.Byte[4]; |
FromNC_Rotate_C = FromNaviCtrl.Param.Byte[5]; |
FromNC_Rotate_S = FromNaviCtrl.Param.Byte[6]; |
GPS_Aid_StickMultiplikator = FromNaviCtrl.Param.Byte[7]; |
if(CareFree && FromNaviCtrl.Param.sInt[4] >= 0) |
{ |
KompassSollWert = FromNaviCtrl.Param.sInt[4]; // bei Carefree kann NC den Kompass-Sollwinkel vorgeben |
if(EE_Parameter.CamOrientation) // Kamera angle is not front |
{ |
KompassSollWert += 360 - ((unsigned int) EE_Parameter.CamOrientation * 15); |
KompassSollWert %= 360; |
} |
} |
POI_KameraNick = (POI_KameraNick + FromNaviCtrl.Param.sInt[5]) / 2; // FromNaviCtrl.Param.sInt[5]; // Nickwinkel |
break; |
case SPI_NCCMD_VERSION: |
NC_Version.Major = FromNaviCtrl.Param.Byte[0]; |
NC_Version.Minor = FromNaviCtrl.Param.Byte[1]; |
NC_Version.Patch = FromNaviCtrl.Param.Byte[2]; |
NC_Version.Compatible = FromNaviCtrl.Param.Byte[3]; |
NC_Version.Hardware = FromNaviCtrl.Param.Byte[4]; |
DebugOut.Status[0] |= FromNaviCtrl.Param.Byte[5]; |
DebugOut.Status[1] = (DebugOut.Status[1] & (0x01|0x02)) | (FromNaviCtrl.Param.Byte[6] & (0x04 | 0x08)); |
NC_ErrorCode = FromNaviCtrl.Param.Byte[7]; |
NC_GPS_ModeCharacter = FromNaviCtrl.Param.Byte[8]; |
FromNaviCtrl_Value.SerialDataOkay = FromNaviCtrl.Param.Byte[9]; |
NC_To_FC_Flags = FromNaviCtrl.Param.Byte[10]; |
NC_To_FC_MaxAltitude = FromNaviCtrl.Param.Byte[11]; |
break; |
case SPI_NCCMD_GPSINFO: |
GPSInfo.Flags = FromNaviCtrl.Param.Byte[0]; |
GPSInfo.NumOfSats = FromNaviCtrl.Param.Byte[1]; |
GPSInfo.SatFix = FromNaviCtrl.Param.Byte[2]; |
GPSInfo.Speed = FromNaviCtrl.Param.Byte[3]; |
GPSInfo.HomeDistance = FromNaviCtrl.Param.Int[2]; |
GPSInfo.HomeBearing = FromNaviCtrl.Param.sInt[3]; |
PPM_in[WP_EVENT_PPM_IN] = (signed char) FromNaviCtrl.Param.Byte[8]; // WP_EVENT-Channel-Value (FromNC_WP_EventChannel) |
FromNC_AltitudeSpeed = FromNaviCtrl.Param.Byte[9]; |
FromNC_AltitudeSetpoint = (long) FromNaviCtrl.Param.sInt[5] * 10; // in cm |
break; |
case SPI_MISC: |
EarthMagneticField = FromNaviCtrl.Param.Byte[0]; |
EarthMagneticInclination = FromNaviCtrl.Param.Byte[1]; |
EarthMagneticInclinationTheoretic = FromNaviCtrl.Param.Byte[2]; |
#if (defined(__AVR_ATmega1284__) || defined(__AVR_ATmega1284P__)) |
if(FromNaviCtrl.Param.Byte[3]) |
if(!SpeakHoTT || (SpeakHoTT >= SPEAK_GPS_HOLD && SpeakHoTT <= SPEAK_GPS_OFF)) SpeakHoTT = FromNaviCtrl.Param.Byte[3]; |
NaviData_WaypointIndex = FromNaviCtrl.Param.Byte[4]; |
NaviData_WaypointNumber = FromNaviCtrl.Param.Byte[5]; |
NaviData_TargetDistance = FromNaviCtrl.Param.Int[3]; |
NaviData_TargetHoldTime = FromNaviCtrl.Param.Byte[8]; |
#endif |
break; |
#if (defined(__AVR_ATmega1284__) || defined(__AVR_ATmega1284P__)) |
case SPI_NCCMD_HOTT_DATA: |
//if(EE_Parameter.Receiver == RECEIVER_HOTT) |
NC_Fills_HoTT_Telemety(); |
break; |
#endif |
// 0 = 0,1 |
// 1 = 2,3 |
// 2 = 4,5 |
// 3 = 6,7 |
// 4 = 8,9 |
// 5 = 10,11 |
default: |
break; |
} |
} |
else |
{ |
// KompassValue = 0; |
// KompassRichtung = 0; |
GPS_Nick = 0; |
GPS_Roll = 0; |
} |
} |
#endif |
/branches/V2.02a_FirstTrial_Peter/spi.h |
---|
0,0 → 1,197 |
// ######################## SPI - FlightCtrl ################### |
#ifndef _SPI_H |
#define _SPI_H |
#include <util/delay.h> |
#include "vector.h" |
#define USE_SPI_COMMUNICATION |
#define SPI_BYTEGAP 3 |
//----------------------------------------- |
#define DDR_SPI DDRB |
#define SLAVE_SELECT_DDR_PORT DDRC |
#define SLAVE_SELECT_PORT PORTC |
#if defined(__AVR_ATmega1284P__) |
#define DD_SS PORTB4 |
#define DD_SCK PORTB7 |
#define DD_MOSI PORTB5 |
#define DD_MISO PORTB6 |
#define SPI_SLAVE_SELECT PORTC5 |
#else |
#define DD_SS PB4 |
#define DD_SCK PB7 |
#define DD_MOSI PB5 |
#define DD_MISO PB6 |
#define SPI_SLAVE_SELECT PC5 |
#endif |
// for compatibility reasons gcc3.x <-> gcc4.x |
#ifndef SPCR |
#define SPCR SPCR0 |
#endif |
#ifndef SPE |
#define SPE SPE0 |
#endif |
#ifndef MSTR |
#define MSTR MSTR0 |
#endif |
#ifndef SPR1 |
#define SPR1 SPR01 |
#endif |
#ifndef SPR0 |
#define SPR0 SPR00 |
#endif |
#ifndef SPIE |
#define SPIE SPIE0 |
#endif |
#ifndef SPDR |
#define SPDR SPDR0 |
#endif |
#ifndef SPIF |
#define SPIF SPIF0 |
#endif |
#ifndef SPSR |
#define SPSR SPSR0 |
#endif |
// ------------------------- |
#define SPI_FCCMD_USER 10 |
#define SPI_FCCMD_STICK 11 |
#define SPI_FCCMD_MISC 12 |
#define SPI_FCCMD_PARAMETER1 13 |
#define SPI_FCCMD_VERSION 14 |
#define SPI_FCCMD_SERVOS 15 |
#define SPI_FCCMD_BL_ACCU 16 |
#define SPI_FCCMD_PARAMETER2 17 |
struct str_ToNaviCtrl |
{ |
unsigned char Sync1, Sync2; |
unsigned char Command; |
signed int IntegralNick; |
signed int IntegralRoll; |
signed int AccNick; |
signed int AccRoll; |
signed int GyroCompass; |
signed int GyroNick; |
signed int GyroRoll; |
signed int GyroGier; |
unsigned int FCStatus; |
union |
{ |
unsigned char Byte[12]; |
char sByte[12]; |
unsigned int Int[6]; |
int sInt[6]; |
unsigned long Long[3]; |
long sLong[3]; |
float Float[3]; |
} Param; |
unsigned char Chksum; |
}; |
#define SPI_NCCMD_KALMAN 103 |
#define SPI_NCCMD_VERSION 104 |
#define SPI_NCCMD_GPSINFO 105 |
#define SPI_NCCMD_HOTT_DATA 106 |
#define SPI_MISC 107 |
struct str_FromNaviCtrl |
{ |
unsigned char Command; |
signed int GPS_Nick; |
signed int GPS_Roll; |
signed int MagVecX; |
signed int CompassValue; |
signed int AccErrorN; |
signed int AccErrorR; |
signed int MagVecY; |
signed int MagVecZ; |
unsigned int BeepTime; |
union |
{ |
unsigned char Byte[12]; |
char sByte[12]; |
unsigned int Int[6]; |
int sInt[6]; |
unsigned long Long[3]; |
long sLong[3]; |
float Float[3]; |
} Param; |
unsigned char Chksum; |
}; |
struct str_FromNaviCtrl_Value |
{ |
signed char Kalman_K; |
signed char Kalman_MaxDrift; |
signed char Kalman_MaxFusion; |
unsigned char SerialDataOkay; |
signed char GpsZ; |
}; |
struct str_SPI_VersionInfo |
{ |
unsigned char Major; |
unsigned char Minor; |
unsigned char Patch; |
unsigned char Compatible; |
unsigned char Hardware; |
}; |
// Satfix types for GPSData.SatFix |
#define SATFIX_NONE 0x00 |
#define SATFIX_DEADRECKOING 0x01 |
#define SATFIX_2D 0x02 |
#define SATFIX_3D 0x03 |
#define SATFIX_GPS_DEADRECKOING 0x04 |
#define SATFIX_TIMEONLY 0x05 |
// Flags for interpretation of the GPSData.Flags |
#define FLAG_GPSFIXOK 0x01 // (i.e. within DOP & ACC Masks) |
#define FLAG_DIFFSOLN 0x02 // (is DGPS used) |
#define FLAG_WKNSET 0x04 // (is Week Number valid) |
#define FLAG_TOWSET 0x08 // (is Time of Week valid) |
#define FLAG_GPS_NAVIGATION_ACTIVE 0x10 // NC to FC -> NC is ready to navigate |
struct str_GPSInfo |
{ |
unsigned char Flags; // Status Flags |
unsigned char NumOfSats; // number of satelites |
unsigned char SatFix; // type of satfix |
unsigned char Speed; // m/sek |
unsigned int HomeDistance; // distance to Home in dm |
int HomeBearing; // bearing to home in deg |
}; |
#ifdef USE_SPI_COMMUNICATION |
extern struct str_GPSInfo GPSInfo; |
extern struct str_SPI_VersionInfo NC_Version; |
extern struct str_FromNaviCtrl_Value FromNaviCtrl_Value; |
extern struct str_ToNaviCtrl ToNaviCtrl; |
extern struct str_FromNaviCtrl FromNaviCtrl; |
extern unsigned char SPI_CommandCounter,NaviDataOkay; |
extern signed char FromNC_Rotate_C, FromNC_Rotate_S; |
extern unsigned char NC_ErrorCode; |
extern void SPI_MasterInit(void); |
extern unsigned char SPI_StartTransmitPacket(void); |
extern void UpdateSPI_Buffer(void); |
extern void SPI_TransmitByte(void); |
extern signed int POI_KameraNick; |
extern unsigned char NC_GPS_ModeCharacter, NC_To_FC_Flags, NC_To_FC_MaxAltitude; |
extern vector16_t MagVec; |
extern unsigned char EarthMagneticField; |
extern unsigned char EarthMagneticInclination,EarthMagneticInclinationTheoretic; |
#else |
// -------------------------------- Dummy ----------------------------------------- |
#define SPI_MasterInit() ; |
//#define SPI_StartTransmitPacket() ; |
#define UpdateSPI_Buffer() ; |
#define SPI_TransmitByte() ; |
#endif |
#endif |
/branches/V2.02a_FirstTrial_Peter/timer0.c |
---|
0,0 → 1,486 |
// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
// + www.MikroKopter.com |
// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
// + Software Nutzungsbedingungen (english version: see below) |
// + der Fa. HiSystems GmbH, Flachsmeerstrasse 2, 26802 Moormerland - nachfolgend Lizenzgeber genannt - |
// + Der Lizenzgeber räumt dem Kunden ein nicht-ausschließliches, zeitlich und räumlich* unbeschränktes Recht ein, die im den |
// + Mikrocontroller verwendete Firmware für die Hardware Flight-Ctrl, Navi-Ctrl, BL-Ctrl, MK3Mag & PC-Programm MikroKopter-Tool |
// + - nachfolgend Software genannt - nur für private Zwecke zu nutzen. |
// + Der Einsatz dieser Software ist nur auf oder mit Produkten des Lizenzgebers zulässig. |
// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
// + Die vom Lizenzgeber gelieferte Software ist urheberrechtlich geschützt. Alle Rechte an der Software sowie an sonstigen im |
// + Rahmen der Vertragsanbahnung und Vertragsdurchführung überlassenen Unterlagen stehen im Verhältnis der Vertragspartner ausschließlich dem Lizenzgeber zu. |
// + Die in der Software enthaltenen Copyright-Vermerke, Markenzeichen, andere Rechtsvorbehalte, Seriennummern sowie |
// + sonstige der Programmidentifikation dienenden Merkmale dürfen vom Kunden nicht verändert oder unkenntlich gemacht werden. |
// + Der Kunde trifft angemessene Vorkehrungen für den sicheren Einsatz der Software. Er wird die Software gründlich auf deren |
// + Verwendbarkeit zu dem von ihm beabsichtigten Zweck testen, bevor er diese operativ einsetzt. |
// + Die Haftung des Lizenzgebers wird - soweit gesetzlich zulässig - begrenzt in Höhe des typischen und vorhersehbaren |
// + Schadens. Die gesetzliche Haftung bei Personenschäden und nach dem Produkthaftungsgesetz bleibt unberührt. Dem Lizenzgeber steht jedoch der Einwand |
// + des Mitverschuldens offen. |
// + Der Kunde trifft angemessene Vorkehrungen für den Fall, dass die Software ganz oder teilweise nicht ordnungsgemäß arbeitet. |
// + Er wird die Software gründlich auf deren Verwendbarkeit zu dem von ihm beabsichtigten Zweck testen, bevor er diese operativ einsetzt. |
// + Der Kunde wird er seine Daten vor Einsatz der Software nach dem Stand der Technik sichern. |
// + Der Kunde ist darüber unterrichtet, dass der Lizenzgeber seine Daten im zur Vertragsdurchführung erforderlichen Umfang |
// + und auf Grundlage der Datenschutzvorschriften erhebt, speichert, verarbeitet und, sofern notwendig, an Dritte übermittelt. |
// + *) Die räumliche Nutzung bezieht sich nur auf den Einsatzort, nicht auf die Reichweite der programmierten Software. |
// + #### ENDE DER NUTZUNGSBEDINGUNGEN ####' |
// + Hinweis: Informationen über erweiterte Nutzungsrechte (wie z.B. Nutzung für nicht-private Zwecke) sind auf Anfrage per Email an info(@)hisystems.de verfügbar. |
// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
// + Software LICENSING TERMS |
// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
// + of HiSystems GmbH, Flachsmeerstrasse 2, 26802 Moormerland, Germany - the Licensor - |
// + The Licensor grants the customer a non-exclusive license to use the microcontroller firmware of the Flight-Ctrl, Navi-Ctrl, BL-Ctrl, and MK3Mag hardware |
// + (the Software) exclusively for private purposes. The License is unrestricted with respect to time and territory*. |
// + The Software may only be used with the Licensor's products. |
// + The Software provided by the Licensor is protected by copyright. With respect to the relationship between the parties to this |
// + agreement, all rights pertaining to the Software and other documents provided during the preparation and execution of this |
// + agreement shall be the property of the Licensor. |
// + The information contained in the Software copyright notices, trademarks, other legal reservations, serial numbers and other |
// + features that can be used to identify the program may not be altered or defaced by the customer. |
// + The customer shall be responsible for taking reasonable precautions |
// + for the safe use of the Software. The customer shall test the Software thoroughly regarding its suitability for the |
// + intended purpose before implementing it for actual operation. The Licensor's liability shall be limited to the extent of typical and |
// + foreseeable damage to the extent permitted by law, notwithstanding statutory liability for bodily injury and product |
// + liability. However, the Licensor shall be entitled to the defense of contributory negligence. |
// + The customer will take adequate precautions in the case, that the software is not working properly. The customer will test |
// + the software for his purpose before any operational usage. The customer will backup his data before using the software. |
// + The customer understands that the Licensor collects, stores and processes, and, where required, forwards, customer data |
// + to third parties to the extent necessary for executing the agreement, subject to applicable data protection and privacy regulations. |
// + *) The territory aspect only refers to the place where the Software is used, not its programmed range. |
// + #### END OF LICENSING TERMS #### |
// + Note: For information on license extensions (e.g. commercial use), please contact us at info(@)hisystems.de. |
// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
#include "main.h" |
#define MULTIPLYER 4 |
volatile unsigned int CountMilliseconds = 0; |
volatile unsigned int tim_main; |
volatile unsigned char UpdateMotor = 0; |
volatile unsigned int cntKompass = 0; |
volatile unsigned int beeptime = 0; |
volatile unsigned char BytegapSPI = 0, ServoActive = 0, CalculateServoSignals = 1; |
unsigned char JustMK3MagConnected = 0; |
uint16_t RemainingPulse = 0; |
volatile int16_t ServoNickOffset = (255 / 2) * MULTIPLYER * 16; // initial value near center positon |
volatile int16_t ServoRollOffset = (255 / 2) * MULTIPLYER * 16; // initial value near center positon |
unsigned int BeepMuster = 0xffff; |
signed int NickServoValue = 128 * MULTIPLYER * 16; |
volatile int16_t ServoNickValue = 0; |
volatile int16_t ServoRollValue = 0; |
enum { |
STOP = 0, |
CK = 1, |
CK8 = 2, |
CK64 = 3, |
CK256 = 4, |
CK1024 = 5, |
T0_FALLING_EDGE = 6, |
T0_RISING_EDGE = 7 |
}; |
ISR(TIMER0_OVF_vect) // 9,7kHz |
{ |
static unsigned char cnt_1ms = 1,cnt = 0; |
unsigned char pieper_ein = 0; |
if(BytegapSPI) BytegapSPI--; |
if(SpektrumTimer) SpektrumTimer--; |
if(!cnt--) |
{ |
cnt = 9; |
CountMilliseconds++; |
cnt_1ms++; |
cnt_1ms %= 2; |
if(!cnt_1ms) if(UpdateMotor < 4) UpdateMotor++; |
if(!(PINC & 0x10)) JustMK3MagConnected = 1; |
if(beeptime) |
{ |
if(beeptime > 10) beeptime -= 10; else beeptime = 0; |
if(beeptime & BeepMuster) |
{ |
pieper_ein = 1; |
} |
else pieper_ein = 0; |
} |
else |
{ |
pieper_ein = 0; |
BeepMuster = 0xffff; |
} |
#if (defined(__AVR_ATmega1284__) || defined(__AVR_ATmega1284P__)) |
if(pieper_ein) PORTC |= (1<<7); // Speaker an PORTC.7 |
else PORTC &= ~(1<<7); |
#else |
if(pieper_ein) |
{ |
if(PlatinenVersion == 10) PORTD |= (1<<2); // Speaker an PORTD.2 |
else PORTC |= (1<<7); // Speaker an PORTC.7 |
} |
else |
{ |
if(PlatinenVersion == 10) PORTD &= ~(1<<2); |
else PORTC &= ~(1<<7); |
} |
#endif |
} |
if(JustMK3MagConnected && !NaviDataOkay && Parameter_GlobalConfig & CFG_KOMPASS_AKTIV) |
{ |
if(PINC & 0x10) |
{ |
if(++cntKompass > 1000) JustMK3MagConnected = 0; |
} |
else |
{ |
if((cntKompass) && (cntKompass < 362)) |
{ |
cntKompass += cntKompass / 41; |
if(cntKompass > 10) KompassValue = cntKompass - 10; else KompassValue = 0; |
// KompassRichtung = ((540 + KompassValue - KompassSollWert) % 360) - 180; |
} |
cntKompass = 0; |
} |
} |
} |
// ----------------------------------------------------------------------- |
unsigned int SetDelay(unsigned int t) |
{ |
// TIMSK0 &= ~_BV(TOIE0); |
return(CountMilliseconds + t + 1); |
// TIMSK0 |= _BV(TOIE0); |
} |
// ----------------------------------------------------------------------- |
char CheckDelay(unsigned int t) |
{ |
// TIMSK0 &= ~_BV(TOIE0); |
return(((t - CountMilliseconds) & 0x8000) >> 9); |
// TIMSK0 |= _BV(TOIE0); |
} |
// ----------------------------------------------------------------------- |
void Delay_ms(unsigned int w) |
{ |
unsigned int akt; |
akt = SetDelay(w); |
while (!CheckDelay(akt)); |
} |
void Delay_ms_Mess(unsigned int w) |
{ |
unsigned int akt; |
akt = SetDelay(w); |
while (!CheckDelay(akt)) if(AdReady) {AdReady = 0; ANALOG_ON;} |
} |
/*****************************************************/ |
/* Initialize Timer 2 */ |
/*****************************************************/ |
// The timer 2 is used to generate the PWM at PD7 (J7) |
// to control a camera servo for nick compensation. |
void TIMER2_Init(void) |
{ |
uint8_t sreg = SREG; |
// disable all interrupts before reconfiguration |
cli(); |
PORTD &= ~(1<<PORTD7); // set PD7 to low |
DDRC |= (1<<DDC6); // set PC6 as output (Reset for HEF4017) |
HEF4017Reset_ON; |
// Timer/Counter 2 Control Register A |
// Timer Mode is FastPWM with timer reload at OCR2A (Bits: WGM22 = 1, WGM21 = 1, WGM20 = 1) |
// PD7: Normal port operation, OC2A disconnected, (Bits: COM2A1 = 0, COM2A0 = 0) |
// PD6: Normal port operation, OC2B disconnected, (Bits: COM2B1 = 0, COM2B0 = 0) |
TCCR2A &= ~((1<<COM2A1)|(1<<COM2A0)|(1<<COM2B1)|(1<<COM2B0)); |
TCCR2A |= (1<<WGM21)|(1<<WGM20); |
// Timer/Counter 2 Control Register B |
// Set clock divider for timer 2 to SYSKLOCK/32 = 20MHz / 32 = 625 kHz |
// The timer increments from 0x00 to 0xFF with an update rate of 625 kHz or 1.6 us |
// hence the timer overflow interrupt frequency is 625 kHz / 256 = 2.44 kHz or 0.4096 ms |
// divider 32 (Bits: CS022 = 0, CS21 = 1, CS20 = 1) |
TCCR2B &= ~((1<<FOC2A)|(1<<FOC2B)|(1<<CS22)); |
TCCR2B |= (1<<CS21)|(1<<CS20)|(1<<WGM22); |
// Initialize the Timer/Counter 2 Register |
TCNT2 = 0; |
// Initialize the Output Compare Register A used for PWM generation on port PD7. |
OCR2A = 255; |
TCCR2A |= (1<<COM2A1); // set or clear at compare match depends on value of COM2A0 |
// Timer/Counter 2 Interrupt Mask Register |
// Enable timer output compare match A Interrupt only |
TIMSK2 &= ~((1<<OCIE2B)|(1<<TOIE2)); |
TIMSK2 |= (1<<OCIE2A); |
SREG = sreg; |
} |
//---------------------------- |
void Timer_Init(void) |
{ |
tim_main = SetDelay(10); |
TCCR0B = CK8; |
// TCCR0A = (1<<COM0A1)|(1<<COM0B1)|3;//fast PWM |
TCCR0A = (1<<COM0A1)|(1<<COM0B1)|(1<<COM0B0)|3;//fast PWM |
OCR0B = 255; |
OCR0A = 180; |
TCNT0 = (unsigned char)-TIMER_RELOAD_VALUE; // reload |
//OCR1 = 0x00; |
TIMSK0 |= _BV(TOIE0); |
} |
/*****************************************************/ |
/* Control Servo Position */ |
/*****************************************************/ |
void CalcNickServoValue(void) |
{ |
signed int max, min; |
if(EE_Parameter.ServoCompInvert & SERVO_RELATIVE) // relative moving of the servo value |
{ |
max = ((unsigned int) EE_Parameter.ServoNickMax * MULTIPLYER * 15); |
min = ((unsigned int) EE_Parameter.ServoNickMin * MULTIPLYER * 20); |
NickServoValue -= ((signed char) (Parameter_ServoNickControl - 128) / 4) * 6; |
LIMIT_MIN_MAX(NickServoValue,min, max); |
} |
else NickServoValue = (int16_t)Parameter_ServoNickControl * (MULTIPLYER*16); // direct poti control |
} |
void CalculateServo(void) |
{ |
signed char cosinus, sinus; |
signed long nick, roll; |
cosinus = sintab[EE_Parameter.CamOrientation + 6]; |
sinus = sintab[EE_Parameter.CamOrientation]; |
if(CalculateServoSignals == 1) |
{ |
if(EE_Parameter.GlobalConfig3 & CFG3_SERVO_NICK_COMP_OFF) nick = 0; |
else nick = (cosinus * IntegralNick) / 128L - (sinus * IntegralRoll) / 128L; |
nick -= POI_KameraNick * 7; |
nick = ((long)Parameter_ServoNickComp * nick) / 512L; |
// offset (Range from 0 to 255 * 3 = 765) |
if(EE_Parameter.ServoCompInvert & SERVO_RELATIVE) ServoNickOffset = NickServoValue; |
else ServoNickOffset += (NickServoValue - ServoNickOffset) / EE_Parameter.ServoManualControlSpeed; |
if(EE_Parameter.ServoCompInvert & SERVO_NICK_INV) // inverting movement of servo |
{ |
nick = ServoNickOffset / 16 + nick; |
} |
else |
{ // inverting movement of servo |
nick = ServoNickOffset / 16 - nick; |
} |
if(EE_Parameter.ServoFilterNick) ServoNickValue = ((ServoNickValue * EE_Parameter.ServoFilterNick) + nick) / (EE_Parameter.ServoFilterNick + 1); |
else ServoNickValue = nick; |
// limit servo value to its parameter range definition |
if(ServoNickValue < ((int16_t)EE_Parameter.ServoNickMin * MULTIPLYER)) |
{ |
ServoNickValue = (int16_t)EE_Parameter.ServoNickMin * MULTIPLYER; |
} |
else |
if(ServoNickValue > ((int16_t)EE_Parameter.ServoNickMax * MULTIPLYER)) |
{ |
ServoNickValue = (int16_t)EE_Parameter.ServoNickMax * MULTIPLYER; |
} |
if(PlatinenVersion < 20) CalculateServoSignals = 0; else CalculateServoSignals++; |
} |
else |
{ |
roll = (cosinus * IntegralRoll) / 128L + (sinus * IntegralNick) / 128L; |
roll = ((long)Parameter_ServoRollComp * roll) / 512L; |
ServoRollOffset += ((int16_t)Parameter_ServoRollControl * (MULTIPLYER*16) - ServoRollOffset) / EE_Parameter.ServoManualControlSpeed; |
if(EE_Parameter.ServoCompInvert & SERVO_ROLL_INV) |
{ // inverting movement of servo |
roll = ServoRollOffset / 16 + roll; |
} |
else |
{ // inverting movement of servo |
roll = ServoRollOffset / 16 - roll; |
} |
if(EE_Parameter.ServoFilterRoll) ServoRollValue = ((ServoRollValue * EE_Parameter.ServoFilterRoll) + roll) / (EE_Parameter.ServoFilterRoll + 1); |
else ServoRollValue = roll; |
// limit servo value to its parameter range definition |
if(ServoRollValue < ((int16_t)EE_Parameter.ServoRollMin * MULTIPLYER)) |
{ |
ServoRollValue = (int16_t)EE_Parameter.ServoRollMin * MULTIPLYER; |
} |
else |
if(ServoRollValue > ((int16_t)EE_Parameter.ServoRollMax * MULTIPLYER)) |
{ |
ServoRollValue = (int16_t)EE_Parameter.ServoRollMax * MULTIPLYER; |
} |
CalculateServoSignals = 0; |
} |
} |
ISR(TIMER2_COMPA_vect) |
{ |
// frame len 22.5 ms = 14063 * 1.6 us |
// stop pulse: 0.3 ms = 188 * 1.6 us |
// min servo pulse: 0.6 ms = 375 * 1.6 us |
// max servo pulse: 2.4 ms = 1500 * 1.6 us |
// resolution: 1500 - 375 = 1125 steps |
#define IRS_RUNTIME 127 |
#define PPM_STOPPULSE 188 |
#define PPM_FRAMELEN (1757 * EE_Parameter.ServoNickRefresh) |
#define MINSERVOPULSE 375 |
#define MAXSERVOPULSE 1500 |
#define SERVORANGE (MAXSERVOPULSE - MINSERVOPULSE) |
static uint8_t PulseOutput = 0; |
static uint16_t ServoFrameTime = 0; |
static uint8_t ServoIndex = 0; |
if(PlatinenVersion < 20) |
{ |
//--------------------------- |
// Nick servo state machine |
//--------------------------- |
if(!PulseOutput) // pulse output complete |
{ |
if(TCCR2A & (1<<COM2A0)) // we had a low pulse |
{ |
TCCR2A &= ~(1<<COM2A0);// make a high pulse |
RemainingPulse = MINSERVOPULSE + SERVORANGE/2; // center position ~ 1.5ms |
RemainingPulse += ServoNickValue - (256 / 2) * MULTIPLYER; // shift ServoNickValue to center position |
// range servo pulse width |
if(RemainingPulse > MAXSERVOPULSE ) RemainingPulse = MAXSERVOPULSE; // upper servo pulse limit |
else if(RemainingPulse < MINSERVOPULSE ) RemainingPulse = MINSERVOPULSE; // lower servo pulse limit |
// accumulate time for correct update rate |
ServoFrameTime = RemainingPulse; |
} |
else // we had a high pulse |
{ |
TCCR2A |= (1<<COM2A0); // make a low pulse |
RemainingPulse = PPM_FRAMELEN - ServoFrameTime; |
CalculateServoSignals = 1; |
} |
// set pulse output active |
PulseOutput = 1; |
} |
} // EOF Nick servo state machine |
else |
{ |
//----------------------------------------------------- |
// PPM state machine, onboard demultiplexed by HEF4017 |
//----------------------------------------------------- |
if(!PulseOutput) // pulse output complete |
{ |
if(TCCR2A & (1<<COM2A0)) // we had a low pulse |
{ |
TCCR2A &= ~(1<<COM2A0);// make a high pulse |
if(ServoIndex == 0) // if we are at the sync gap |
{ |
RemainingPulse = PPM_FRAMELEN - ServoFrameTime; // generate sync gap by filling time to full frame time |
ServoFrameTime = 0; // reset servo frame time |
HEF4017Reset_ON; // enable HEF4017 reset |
} |
else // servo channels |
if(ServoIndex > EE_Parameter.ServoNickRefresh) |
{ |
RemainingPulse = 10; // end it here |
} |
else |
{ |
RemainingPulse = MINSERVOPULSE + SERVORANGE/2; // center position ~ 1.5ms |
switch(ServoIndex) // map servo channels |
{ |
case 1: // Nick Compensation Servo |
RemainingPulse += ServoNickValue - (256 / 2) * MULTIPLYER; // shift ServoNickValue to center position |
break; |
case 2: // Roll Compensation Servo |
RemainingPulse += ServoRollValue - (256 / 2) * MULTIPLYER; // shift ServoNickValue to center position |
break; |
case 3: |
RemainingPulse += ((int16_t)Parameter_Servo3 * MULTIPLYER) - (256 / 2) * MULTIPLYER; |
break; |
case 4: |
RemainingPulse += ((int16_t)Parameter_Servo4 * MULTIPLYER) - (256 / 2) * MULTIPLYER; |
break; |
case 5: |
RemainingPulse += ((int16_t)Parameter_Servo5 * MULTIPLYER) - (256 / 2) * MULTIPLYER; |
break; |
default: // other servo channels |
RemainingPulse += 2 * PPM_in[ServoIndex]; // add channel value, factor of 2 because timer 1 increments 3.2µs |
break; |
} |
// range servo pulse width |
if(RemainingPulse > MAXSERVOPULSE) RemainingPulse = MAXSERVOPULSE; // upper servo pulse limit |
else if(RemainingPulse < MINSERVOPULSE) RemainingPulse = MINSERVOPULSE; // lower servo pulse limit |
// substract stop pulse width |
RemainingPulse -= PPM_STOPPULSE; |
// accumulate time for correct sync gap |
ServoFrameTime += RemainingPulse; |
} |
} |
else // we had a high pulse |
{ |
TCCR2A |= (1<<COM2A0); // make a low pulse |
// set pulsewidth to stop pulse width |
RemainingPulse = PPM_STOPPULSE; |
// accumulate time for correct sync gap |
ServoFrameTime += RemainingPulse; |
if((ServoActive && SenderOkay) || ServoActive == 2) HEF4017Reset_OFF; // disable HEF4017 reset |
else HEF4017Reset_ON; |
ServoIndex++; |
if(ServoIndex > EE_Parameter.ServoNickRefresh+1) |
{ |
CalculateServoSignals = 1; |
ServoIndex = 0; // reset to the sync gap |
} |
} |
// set pulse output active |
PulseOutput = 1; |
} |
} // EOF PPM state machine |
// General pulse output generator |
if(RemainingPulse > (255 + IRS_RUNTIME)) |
{ |
OCR2A = 255; |
RemainingPulse -= 255; |
} |
else |
{ |
if(RemainingPulse > 255) // this is the 2nd last part |
{ |
if((RemainingPulse - 255) < IRS_RUNTIME) |
{ |
OCR2A = 255 - IRS_RUNTIME; |
RemainingPulse -= 255 - IRS_RUNTIME; |
} |
else // last part > ISR_RUNTIME |
{ |
OCR2A = 255; |
RemainingPulse -= 255; |
} |
} |
else // this is the last part |
{ |
OCR2A = RemainingPulse; |
RemainingPulse = 0; |
PulseOutput = 0; // trigger to stop pulse |
} |
} // EOF general pulse output generator |
} |
/branches/V2.02a_FirstTrial_Peter/timer0.h |
---|
0,0 → 1,25 |
#define TIMER_TEILER CK8 |
#define TIMER_RELOAD_VALUE 250 |
#define HEF4017Reset_ON PORTC |= (1<<PORTC6) |
#define HEF4017Reset_OFF PORTC &= ~(1<<PORTC6) |
void Timer_Init(void); |
void TIMER2_Init(void); |
void Delay_ms(unsigned int); |
void Delay_ms_Mess(unsigned int); |
unsigned int SetDelay (unsigned int t); |
char CheckDelay (unsigned int t); |
void CalculateServo(void); |
void CalcNickServoValue(void); |
extern volatile unsigned int CountMilliseconds; |
extern volatile unsigned char UpdateMotor; |
extern volatile unsigned int beeptime; |
extern volatile unsigned int cntKompass; |
extern unsigned int BeepMuster; |
extern volatile unsigned char BytegapSPI, ServoActive, CalculateServoSignals; |
extern volatile int16_t ServoNickValue; |
extern volatile int16_t ServoRollValue; |
extern signed int NickServoValue; |
extern unsigned char JustMK3MagConnected; |
/branches/V2.02a_FirstTrial_Peter/twimaster.c |
---|
0,0 → 1,477 |
// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
// + www.MikroKopter.com |
// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
// + Software Nutzungsbedingungen (english version: see below) |
// + der Fa. HiSystems GmbH, Flachsmeerstrasse 2, 26802 Moormerland - nachfolgend Lizenzgeber genannt - |
// + Der Lizenzgeber räumt dem Kunden ein nicht-ausschließliches, zeitlich und räumlich* unbeschränktes Recht ein, die im den |
// + Mikrocontroller verwendete Firmware für die Hardware Flight-Ctrl, Navi-Ctrl, BL-Ctrl, MK3Mag & PC-Programm MikroKopter-Tool |
// + - nachfolgend Software genannt - nur für private Zwecke zu nutzen. |
// + Der Einsatz dieser Software ist nur auf oder mit Produkten des Lizenzgebers zulässig. |
// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
// + Die vom Lizenzgeber gelieferte Software ist urheberrechtlich geschützt. Alle Rechte an der Software sowie an sonstigen im |
// + Rahmen der Vertragsanbahnung und Vertragsdurchführung überlassenen Unterlagen stehen im Verhältnis der Vertragspartner ausschließlich dem Lizenzgeber zu. |
// + Die in der Software enthaltenen Copyright-Vermerke, Markenzeichen, andere Rechtsvorbehalte, Seriennummern sowie |
// + sonstige der Programmidentifikation dienenden Merkmale dürfen vom Kunden nicht verändert oder unkenntlich gemacht werden. |
// + Der Kunde trifft angemessene Vorkehrungen für den sicheren Einsatz der Software. Er wird die Software gründlich auf deren |
// + Verwendbarkeit zu dem von ihm beabsichtigten Zweck testen, bevor er diese operativ einsetzt. |
// + Die Haftung des Lizenzgebers wird - soweit gesetzlich zulässig - begrenzt in Höhe des typischen und vorhersehbaren |
// + Schadens. Die gesetzliche Haftung bei Personenschäden und nach dem Produkthaftungsgesetz bleibt unberührt. Dem Lizenzgeber steht jedoch der Einwand |
// + des Mitverschuldens offen. |
// + Der Kunde trifft angemessene Vorkehrungen für den Fall, dass die Software ganz oder teilweise nicht ordnungsgemäß arbeitet. |
// + Er wird die Software gründlich auf deren Verwendbarkeit zu dem von ihm beabsichtigten Zweck testen, bevor er diese operativ einsetzt. |
// + Der Kunde wird er seine Daten vor Einsatz der Software nach dem Stand der Technik sichern. |
// + Der Kunde ist darüber unterrichtet, dass der Lizenzgeber seine Daten im zur Vertragsdurchführung erforderlichen Umfang |
// + und auf Grundlage der Datenschutzvorschriften erhebt, speichert, verarbeitet und, sofern notwendig, an Dritte übermittelt. |
// + *) Die räumliche Nutzung bezieht sich nur auf den Einsatzort, nicht auf die Reichweite der programmierten Software. |
// + #### ENDE DER NUTZUNGSBEDINGUNGEN ####' |
// + Hinweis: Informationen über erweiterte Nutzungsrechte (wie z.B. Nutzung für nicht-private Zwecke) sind auf Anfrage per Email an info(@)hisystems.de verfügbar. |
// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
// + Software LICENSING TERMS |
// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
// + of HiSystems GmbH, Flachsmeerstrasse 2, 26802 Moormerland, Germany - the Licensor - |
// + The Licensor grants the customer a non-exclusive license to use the microcontroller firmware of the Flight-Ctrl, Navi-Ctrl, BL-Ctrl, and MK3Mag hardware |
// + (the Software) exclusively for private purposes. The License is unrestricted with respect to time and territory*. |
// + The Software may only be used with the Licensor's products. |
// + The Software provided by the Licensor is protected by copyright. With respect to the relationship between the parties to this |
// + agreement, all rights pertaining to the Software and other documents provided during the preparation and execution of this |
// + agreement shall be the property of the Licensor. |
// + The information contained in the Software copyright notices, trademarks, other legal reservations, serial numbers and other |
// + features that can be used to identify the program may not be altered or defaced by the customer. |
// + The customer shall be responsible for taking reasonable precautions |
// + for the safe use of the Software. The customer shall test the Software thoroughly regarding its suitability for the |
// + intended purpose before implementing it for actual operation. The Licensor's liability shall be limited to the extent of typical and |
// + foreseeable damage to the extent permitted by law, notwithstanding statutory liability for bodily injury and product |
// + liability. However, the Licensor shall be entitled to the defense of contributory negligence. |
// + The customer will take adequate precautions in the case, that the software is not working properly. The customer will test |
// + the software for his purpose before any operational usage. The customer will backup his data before using the software. |
// + The customer understands that the Licensor collects, stores and processes, and, where required, forwards, customer data |
// + to third parties to the extent necessary for executing the agreement, subject to applicable data protection and privacy regulations. |
// + *) The territory aspect only refers to the place where the Software is used, not its programmed range. |
// + #### END OF LICENSING TERMS #### |
// + Note: For information on license extensions (e.g. commercial use), please contact us at info(@)hisystems.de. |
// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
#include <avr/io.h> |
#include <avr/interrupt.h> |
#include <util/twi.h> |
#include "eeprom.h" |
#include "twimaster.h" |
#include "fc.h" |
#include "analog.h" |
#include "uart.h" |
#include "timer0.h" |
volatile uint8_t twi_state = TWI_STATE_MOTOR_TX; |
volatile uint8_t dac_channel = 0; |
volatile uint8_t motor_write = 0; |
volatile uint8_t motor_read = 0; |
volatile uint8_t I2C_TransferActive = 0; |
volatile uint16_t I2CTimeout = 100; |
uint8_t MissingMotor = 0; |
volatile uint8_t BLFlags = 0; |
MotorData_t Motor[MAX_MOTORS]; |
// bit mask for witch BL the configuration should be sent |
volatile uint16_t BLConfig_WriteMask = 0; |
// bit mask for witch BL the configuration should be read |
volatile uint16_t BLConfig_ReadMask = 0; |
// buffer for BL Configuration |
BLConfig_t BLConfig; |
#define I2C_WriteByte(byte) {TWDR = byte; TWCR = (1<<TWINT) | (1<<TWEN) | (1<<TWIE);} |
#define I2C_ReceiveByte() {TWCR = (1<<TWINT) | (1<<TWEN) | (1<<TWIE) | (1<<TWEA);} |
#define I2C_ReceiveLastByte() {TWCR = (1<<TWINT) | (1<<TWEN) | (1<<TWIE);} |
#define SCL_CLOCK 200000L |
#define I2C_TIMEOUT 30000 |
#define TWI_BASE_ADDRESS 0x52 |
/**************************************************/ |
/* Initialize I2C (TWI) */ |
/**************************************************/ |
void I2C_Init(char clear) |
{ |
uint8_t i; |
uint8_t sreg = SREG; |
cli(); |
// SDA is INPUT |
DDRC &= ~(1<<DDC1); |
// SCL is output |
DDRC |= (1<<DDC0); |
// pull up SDA |
PORTC |= (1<<PORTC0)|(1<<PORTC1); |
// TWI Status Register |
// prescaler 1 (TWPS1 = 0, TWPS0 = 0) |
TWSR &= ~((1<<TWPS1)|(1<<TWPS0)); |
// set TWI Bit Rate Register |
TWBR = ((F_CPU/SCL_CLOCK)-16)/2; |
twi_state = TWI_STATE_MOTOR_TX; |
motor_write = 0; |
motor_read = 0; |
if(clear) for(i=0; i < MAX_MOTORS; i++) |
{ |
Motor[i].Version = 0; |
Motor[i].SetPoint = 0; |
Motor[i].SetPointLowerBits = 0; |
Motor[i].State = 0; |
Motor[i].ReadMode = BL_READMODE_STATUS; |
Motor[i].Current = 0; |
Motor[i].MaxPWM = 0; |
Motor[i].Temperature = 0; |
} |
sei(); |
SREG = sreg; |
} |
void I2C_Reset(void) |
{ |
// stop i2c bus |
I2C_Stop(TWI_STATE_MOTOR_TX); |
TWCR = (1<<TWINT); // reset to original state incl. interrupt flag reset |
TWAMR = 0; |
TWAR = 0; |
TWDR = 0; |
TWSR = 0; |
TWBR = 0; |
I2C_TransferActive = 0; |
I2C_Init(0); |
I2C_WriteByte(0); |
BLFlags |= BLFLAG_READ_VERSION; |
} |
/****************************************/ |
/* I2C ISR */ |
/****************************************/ |
ISR (TWI_vect) |
{ |
static uint8_t missing_motor = 0, motor_read_temperature = 0; |
static uint8_t *pBuff = 0; |
static uint8_t BuffLen = 0; |
switch (twi_state++) |
{ |
// Master Transmit |
case 0: // TWI_STATE_MOTOR_TX |
I2C_TransferActive = 1; |
// skip motor if not used in mixer |
while((Mixer.Motor[motor_write][MIX_GAS] <= 0) && (motor_write < MAX_MOTORS)) motor_write++; |
if(motor_write >= MAX_MOTORS) // writing finished, read now |
{ |
BLConfig_WriteMask = 0; // reset configuration bitmask |
motor_write = 0; // reset motor write counter for next cycle |
twi_state = TWI_STATE_MOTOR_RX; |
I2C_WriteByte(TWI_BASE_ADDRESS + TW_READ + (motor_read<<1) ); // select slave address in rx mode |
} |
else I2C_WriteByte(TWI_BASE_ADDRESS + TW_WRITE + (motor_write<<1) ); // select slave address in tx mode |
break; |
case 1: // Send Data to Slave |
I2C_WriteByte(Motor[motor_write].SetPoint); // transmit setpoint |
// if old version has been detected |
if(!(Motor[motor_write].Version & MOTOR_STATE_NEW_PROTOCOL_MASK)) |
{ |
twi_state = 4; //jump over sending more data |
} |
// the new version has been detected |
else if(!( (Motor[motor_write].SetPointLowerBits && (RequiredMotors < 7)) || BLConfig_WriteMask || BLConfig_ReadMask ) ) |
{ // or LowerBits are zero and no BlConfig should be sent (saves round trip time) |
twi_state = 4; //jump over sending more data |
} |
break; |
case 2: // lower bits of setpoint (higher resolution) |
if ((0x0001<<motor_write) & BLConfig_ReadMask) |
{ |
Motor[motor_write].ReadMode = BL_READMODE_CONFIG; // configuration request |
} |
else |
{ |
Motor[motor_write].ReadMode = BL_READMODE_STATUS; // normal status request |
} |
// send read mode and the lower bits of setpoint |
I2C_WriteByte((Motor[motor_write].ReadMode<<3)|(Motor[motor_write].SetPointLowerBits & 0x07)); |
// configuration tranmission request? |
if((0x0001<<motor_write) & BLConfig_WriteMask) |
{ // redirect tx pointer to configuration data |
pBuff = (uint8_t*)&BLConfig; // select config for motor |
BuffLen = sizeof(BLConfig_t); |
} |
else |
{ // jump to end of transmission for that motor |
twi_state = 4; |
} |
break; |
case 3: // send configuration |
I2C_WriteByte(*pBuff); |
pBuff++; |
if(--BuffLen > 0) twi_state = 3; // if there are some bytes left |
break; |
case 4: // repeat case 0-4 for all motors |
if(TWSR == TW_MT_DATA_NACK) // Data transmitted, NACK received |
{ |
if(!missing_motor) missing_motor = motor_write + 1; |
if((Motor[motor_write].State & MOTOR_STATE_ERROR_MASK) < MOTOR_STATE_ERROR_MASK) Motor[motor_write].State++; // increment error counter and handle overflow |
} |
I2C_Stop(TWI_STATE_MOTOR_TX); |
I2CTimeout = 10; |
motor_write++; // next motor |
I2C_Start(TWI_STATE_MOTOR_TX); // Repeated start -> switch slave or switch Master Transmit -> Master Receive |
break; |
// Master Receive Data |
case 5: // TWI_STATE_MOTOR_RX |
if(TWSR != TW_MR_SLA_ACK) // SLA+R transmitted but no ACK received |
{ // no response from the addressed slave received |
Motor[motor_read].State &= ~MOTOR_STATE_PRESENT_MASK; // clear present bit |
if(++motor_read >= MAX_MOTORS) |
{ // all motors read |
motor_read = 0; // restart from beginning |
BLConfig_ReadMask = 0; // reset read configuration bitmask |
if(++motor_read_temperature >= MAX_MOTORS) |
{ |
motor_read_temperature = 0; |
BLFlags &= ~BLFLAG_READ_VERSION; |
} |
} |
BLFlags |= BLFLAG_TX_COMPLETE; |
I2C_Stop(TWI_STATE_MOTOR_TX); |
I2C_TransferActive = 0; |
} |
else |
{ // motor successfully addressed |
Motor[motor_read].State |= MOTOR_STATE_PRESENT_MASK; // set present bit |
if(Motor[motor_read].Version & MOTOR_STATE_NEW_PROTOCOL_MASK) |
{ |
// new BL found |
switch(Motor[motor_read].ReadMode) |
{ |
case BL_READMODE_CONFIG: |
pBuff = (uint8_t*)&BLConfig; |
BuffLen = sizeof(BLConfig_t); |
Motor[motor_read].ReadMode = BL_READMODE_STATUS; // only once |
break; |
case BL_READMODE_STATUS: |
pBuff = (uint8_t*)&(Motor[motor_read].Current); |
if(motor_read == motor_read_temperature) BuffLen = 3; // read Current, MaxPwm & Temp |
else BuffLen = 1;// read Current only |
break; |
} |
} |
else // old BL version |
{ |
pBuff = (uint8_t*)&(Motor[motor_read].Current); |
if((BLFlags & BLFLAG_READ_VERSION) || (motor_read == motor_read_temperature)) BuffLen = 2; // Current & MaxPwm |
else BuffLen = 1; // read Current only |
} |
if(BuffLen == 1) |
{ |
I2C_ReceiveLastByte(); // read last byte |
} |
else |
{ |
I2C_ReceiveByte(); // read next byte |
} |
} |
MissingMotor = missing_motor; |
missing_motor = 0; |
break; |
case 6: // receive bytes |
*pBuff = TWDR; |
pBuff++; |
BuffLen--; |
if(BuffLen>1) |
{ |
I2C_ReceiveByte(); // read next byte |
} |
else if (BuffLen == 1) |
{ |
I2C_ReceiveLastByte(); // read last byte |
} |
else // nothing left |
{ |
if(BLFlags & BLFLAG_READ_VERSION) |
{ |
// if(!(FC_StatusFlags & FC_STATUS_MOTOR_RUN) && ((Motor[motor_read].MaxPWM & 252) == 248)) Motor[motor_read].Version |= MOTOR_STATE_NEW_PROTOCOL_MASK; |
// else Motor[motor_read].Version = 0; |
if(!(FC_StatusFlags & FC_STATUS_MOTOR_RUN)) |
{ |
if((Motor[motor_read].MaxPWM & 252) == 248) Motor[motor_read].Version |= MOTOR_STATE_NEW_PROTOCOL_MASK; |
else Motor[motor_read].Version = 0; |
if(Motor[motor_read].MaxPWM == 248) Motor[motor_read].Version |= (MOTOR_STATE_FAST_MODE | MOTOR_STATE_BL30); |
else |
if(Motor[motor_read].MaxPWM == 249) Motor[motor_read].Version |= MOTOR_STATE_BL30; |
} |
} |
if(++motor_read >= MAX_MOTORS) |
{ |
motor_read = 0; // restart from beginning |
BLConfig_ReadMask = 0; // reset read configuration bitmask |
if(++motor_read_temperature >= MAX_MOTORS) |
{ |
motor_read_temperature = 0; |
BLFlags &= ~BLFLAG_READ_VERSION; |
} |
} |
I2C_Stop(TWI_STATE_MOTOR_TX); |
BLFlags |= BLFLAG_TX_COMPLETE; |
I2C_TransferActive = 0; |
return; |
} |
twi_state = 6; // if there are some bytes left |
break; |
// writing Gyro-Offsets |
case 18: |
I2C_WriteByte(0x98); // Address the DAC |
break; |
case 19: |
I2C_WriteByte(0x10 + (dac_channel * 2)); // Select DAC Channel (0x10 = A, 0x12 = B, 0x14 = C) |
break; |
case 20: |
switch(dac_channel) |
{ |
case 0: |
I2C_WriteByte(AnalogOffsetNick); // 1st byte for Channel A |
break; |
case 1: |
I2C_WriteByte(AnalogOffsetRoll); // 1st byte for Channel B |
break; |
case 2: |
I2C_WriteByte(AnalogOffsetGier); // 1st byte for Channel C |
break; |
} |
break; |
case 21: |
I2C_WriteByte(0x80); // 2nd byte for all channels is 0x80 |
break; |
case 22: |
I2C_Stop(TWI_STATE_MOTOR_TX); |
I2C_TransferActive = 0; |
I2CTimeout = 10; |
// repeat case 18...22 until all DAC Channels are updated |
if(dac_channel < 2) |
{ |
dac_channel ++; // jump to next channel |
I2C_Start(TWI_STATE_GYRO_OFFSET_TX); // start transmission for next channel |
} |
else |
{ |
dac_channel = 0; // reset dac channel counter |
BLFlags |= BLFLAG_TX_COMPLETE; |
} |
break; |
default: |
I2C_Stop(TWI_STATE_MOTOR_TX); |
BLFlags |= BLFLAG_TX_COMPLETE; |
I2CTimeout = 10; |
motor_write = 0; |
motor_read = 0; |
I2C_TransferActive = 0; |
break; |
} |
} |
uint8_t I2C_WriteBLConfig(uint8_t motor) |
{ |
uint8_t i; |
uint16_t timer; |
if(MotorenEin || PC_MotortestActive) return(BLCONFIG_ERR_MOTOR_RUNNING); // not when motors are running! |
if(motor > MAX_MOTORS) return (BLCONFIG_ERR_MOTOR_NOT_EXIST); // motor does not exist! |
if(motor) |
{ |
if(!(Motor[motor-1].State & MOTOR_STATE_PRESENT_MASK)) return(BLCONFIG_ERR_MOTOR_NOT_EXIST); // motor does not exist! |
if(!(Motor[motor-1].Version & MOTOR_STATE_NEW_PROTOCOL_MASK)) return(BLCONFIG_ERR_HW_NOT_COMPATIBLE); // not a new BL! |
} |
// check BL configuration to send |
if((BLConfig.Revision & 0x0B) != BLCONFIG_REVISION) return (BLCONFIG_ERR_SW_NOT_COMPATIBLE); // bad revison |
i = RAM_Checksum((uint8_t*)&BLConfig, sizeof(BLConfig_t) - 1); |
if(i != BLConfig.crc) return(BLCONFIG_ERR_CHECKSUM); // bad checksum |
timer = SetDelay(2000); |
while(!(BLFlags & BLFLAG_TX_COMPLETE) && !CheckDelay(timer)); //wait for complete transfer |
// prepare the bitmask |
if(!motor) // 0 means all |
{ |
BLConfig_WriteMask = 0xFF; // all motors at once with the same configuration |
} |
else //only one specific motor |
{ |
BLConfig_WriteMask = 0x0001<<(motor-1); |
} |
for(i = 0; i < MAX_MOTORS; i++) |
{ |
if((0x0001<<i) & BLConfig_WriteMask) |
{ |
Motor[i].SetPoint = 0; |
Motor[i].SetPointLowerBits = 0; |
} |
} |
motor_write = 0; |
// needs at least MAX_MOTORS loops of 2 ms (12*2ms = 24ms) |
do |
{ |
I2C_Start(TWI_STATE_MOTOR_TX); // start an i2c transmission |
while(!(BLFlags & BLFLAG_TX_COMPLETE) && !CheckDelay(timer)); //wait for complete transfer |
}while(BLConfig_WriteMask && !CheckDelay(timer)); // repeat until the BL config has been sent |
if(BLConfig_WriteMask) return(BLCONFIG_ERR_MOTOR_NOT_EXIST); |
return(BLCONFIG_SUCCESS); |
} |
uint8_t I2C_ReadBLConfig(uint8_t motor) |
{ |
uint8_t i; |
uint16_t timer; |
if(MotorenEin || PC_MotortestActive) return(BLCONFIG_ERR_MOTOR_RUNNING); // not when motors are running! |
if(motor > MAX_MOTORS) return (BLCONFIG_ERR_MOTOR_NOT_EXIST); // motor does not exist! |
if(motor == 0) return (BLCONFIG_ERR_READ_NOT_POSSIBLE); |
if(!(Motor[motor-1].State & MOTOR_STATE_PRESENT_MASK)) return(BLCONFIG_ERR_MOTOR_NOT_EXIST); // motor does not exist! |
if(!(Motor[motor-1].Version & MOTOR_STATE_NEW_PROTOCOL_MASK)) return(BLCONFIG_ERR_HW_NOT_COMPATIBLE); // not a new BL! |
timer = SetDelay(2000); |
while(!(BLFlags & BLFLAG_TX_COMPLETE) && !CheckDelay(timer)); //wait for complete transfer |
// prepare the bitmask |
BLConfig_ReadMask = 0x0001<<(motor-1); |
for(i = 0; i < MAX_MOTORS; i++) |
{ |
if((0x0001<<i) & BLConfig_ReadMask) |
{ |
Motor[i].SetPoint = 0; |
Motor[i].SetPointLowerBits = 0; |
} |
} |
motor_read = 0; |
BLConfig.Revision = 0; // bad revision |
BLConfig.crc = 0; // bad checksum |
// needs at least MAX_MOTORS loops of 2 ms (12*2ms = 24ms) |
do |
{ |
I2C_Start(TWI_STATE_MOTOR_TX); // start an i2c transmission |
while(!(BLFlags & BLFLAG_TX_COMPLETE) && !CheckDelay(timer)); //wait for complete transfer |
}while(BLConfig_ReadMask && !CheckDelay(timer)); // repeat until the BL config has been received from all motors |
// validate result |
if((BLConfig.Revision & 0x0B) != BLCONFIG_REVISION) return (BLCONFIG_ERR_SW_NOT_COMPATIBLE); // bad revison |
i = RAM_Checksum((uint8_t*)&BLConfig, sizeof(BLConfig_t) - 1); |
if(i != BLConfig.crc) return(BLCONFIG_ERR_CHECKSUM); // bad checksum |
return(BLCONFIG_SUCCESS); |
} |
/branches/V2.02a_FirstTrial_Peter/twimaster.h |
---|
0,0 → 1,102 |
#ifndef _I2C_MASTER_H |
#define _I2C_MASTER_H |
+ |
+#include <inttypes.h> |
+ |
+#define TWI_STATE_MOTOR_TX 0 |
+#define TWI_STATE_MOTOR_RX 5 |
+#define TWI_STATE_GYRO_OFFSET_TX 18 |
+ |
+extern volatile uint8_t twi_state; |
+extern volatile uint8_t motor_write; |
+extern volatile uint8_t motor_read; |
+extern volatile uint8_t I2C_TransferActive; |
+ |
+extern uint8_t MissingMotor; |
+ |
+#define MAX_MOTORS 12 |
+#define MOTOR_STATE_PRESENT_MASK 0x80 |
+#define MOTOR_STATE_ERROR_MASK 0x7F |
+ |
+//Motor[x].Version |
+#define MOTOR_STATE_NEW_PROTOCOL_MASK 0x01 |
+#define MOTOR_STATE_FAST_MODE 0x02 |
+#define MOTOR_STATE_BL30 0x04 // extended Current measurement -> 200 = 20A 201 = 21A 255 = 75A (20+55) |
+ |
+#define BLFLAG_TX_COMPLETE 0x01 |
+#define BLFLAG_READ_VERSION 0x02 |
+ |
+extern volatile uint8_t BLFlags; |
+ |
+#define BL_READMODE_STATUS 0 |
+#define BL_READMODE_CONFIG 16 |
+ |
+typedef struct |
+{ |
+ uint8_t Version; // the version of the BL (0 = old) |
+ uint8_t SetPoint; // written by attitude controller |
+ uint8_t SetPointLowerBits; // for higher Resolution of new BLs |
+ uint8_t State; // 7 bit for I2C error counter, highest bit indicates if motor is present |
+ uint8_t ReadMode; // select data to read |
+ // the following bytes must be exactly in that order! |
+ uint8_t Current; // in 0.1 A steps, read back from BL |
+ uint8_t MaxPWM; // read back from BL -> is less than 255 if BL is in current limit, not running (250) or starting (40) |
+ int8_t Temperature; // old BL-Ctrl will return a 255 here, the new version the temp. in °C |
+} __attribute__((packed)) MotorData_t; |
+ |
+extern MotorData_t Motor[MAX_MOTORS]; |
+ |
+#define BLCONFIG_REVISION 2 |
+ |
+#define MASK_SET_PWM_SCALING 0x01 |
+#define MASK_SET_CURRENT_LIMIT 0x02 |
+#define MASK_SET_TEMP_LIMIT 0x04 |
+#define MASK_SET_CURRENT_SCALING 0x08 |
+#define MASK_SET_BITCONFIG 0x10 |
+#define MASK_SET_STARTPWM 0x20 |
+#define MASK_SET_DEFAULT_PARAMS 0x40 |
+#define MASK_SET_SAVE_EEPROM 0x80 |
+ |
+#define BITCONF_REVERSE_ROTATION 0x01 |
+#define BITCONF_STARTGAS1 0x02 |
+#define BITCONF_STARTGAS2 0x04 |
+#define BITCONF_STARTGAS3 0x08 |
+#define BITCONF_RES4 0x10 |
+#define BITCONF_RES5 0x20 |
+#define BITCONF_RES6 0x40 |
+#define BITCONF_RES7 0x80 |
+ |
+typedef struct |
+{ |
+ uint8_t Revision; // must be BL_REVISION |
+ uint8_t SetMask; // settings mask |
+ uint8_t PwmScaling; // maximum value of control pwm, acts like a thrust limit |
+ uint8_t CurrentLimit; // current limit in A |
+ uint8_t TempLimit; // in °C |
+ uint8_t CurrentScaling; // scaling factor for current measurement |
+ uint8_t BitConfig; // see defines above |
+ uint8_t crc; // checksum |
+} __attribute__((packed)) BLConfig_t; |
+ |
+extern BLConfig_t BLConfig; |
+ |
+extern volatile uint16_t I2CTimeout; |
+ |
+void I2C_Init(char); // Initialize I2C |
+#define I2C_Start(start_state) {twi_state = start_state; BLFlags &= ~BLFLAG_TX_COMPLETE; TWCR = (1<<TWSTA) | (1<<TWEN) | (1<<TWINT) | (1<<TWIE);} |
+#define I2C_Stop(start_state) {twi_state = start_state; TWCR = (1<<TWEN) | (1<<TWSTO) | (1<<TWINT);} |
+void I2C_Reset(void); // Reset I2C |
+ |
+#define BLCONFIG_SUCCESS 0 |
+#define BLCONFIG_ERR_MOTOR_RUNNING 1 |
+#define BLCONFIG_ERR_MOTOR_NOT_EXIST 2 |
+#define BLCONFIG_ERR_HW_NOT_COMPATIBLE 3 |
+#define BLCONFIG_ERR_SW_NOT_COMPATIBLE 4 |
+#define BLCONFIG_ERR_CHECKSUM 5 |
+#define BLCONFIG_ERR_READ_NOT_POSSIBLE 6 |
+ |
+uint8_t I2C_WriteBLConfig(uint8_t motor); |
+uint8_t I2C_ReadBLConfig(uint8_t motor); |
+ |
+#endif |
/branches/V2.02a_FirstTrial_Peter/uart.c |
---|
0,0 → 1,797 |
// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
// + www.MikroKopter.com |
// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
// + Software Nutzungsbedingungen (english version: see below) |
// + der Fa. HiSystems GmbH, Flachsmeerstrasse 2, 26802 Moormerland - nachfolgend Lizenzgeber genannt - |
// + Der Lizenzgeber räumt dem Kunden ein nicht-ausschließliches, zeitlich und räumlich* unbeschränktes Recht ein, die im den |
// + Mikrocontroller verwendete Firmware für die Hardware Flight-Ctrl, Navi-Ctrl, BL-Ctrl, MK3Mag & PC-Programm MikroKopter-Tool |
// + - nachfolgend Software genannt - nur für private Zwecke zu nutzen. |
// + Der Einsatz dieser Software ist nur auf oder mit Produkten des Lizenzgebers zulässig. |
// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
// + Die vom Lizenzgeber gelieferte Software ist urheberrechtlich geschützt. Alle Rechte an der Software sowie an sonstigen im |
// + Rahmen der Vertragsanbahnung und Vertragsdurchführung überlassenen Unterlagen stehen im Verhältnis der Vertragspartner ausschließlich dem Lizenzgeber zu. |
// + Die in der Software enthaltenen Copyright-Vermerke, Markenzeichen, andere Rechtsvorbehalte, Seriennummern sowie |
// + sonstige der Programmidentifikation dienenden Merkmale dürfen vom Kunden nicht verändert oder unkenntlich gemacht werden. |
// + Der Kunde trifft angemessene Vorkehrungen für den sicheren Einsatz der Software. Er wird die Software gründlich auf deren |
// + Verwendbarkeit zu dem von ihm beabsichtigten Zweck testen, bevor er diese operativ einsetzt. |
// + Die Haftung des Lizenzgebers wird - soweit gesetzlich zulässig - begrenzt in Höhe des typischen und vorhersehbaren |
// + Schadens. Die gesetzliche Haftung bei Personenschäden und nach dem Produkthaftungsgesetz bleibt unberührt. Dem Lizenzgeber steht jedoch der Einwand |
// + des Mitverschuldens offen. |
// + Der Kunde trifft angemessene Vorkehrungen für den Fall, dass die Software ganz oder teilweise nicht ordnungsgemäß arbeitet. |
// + Er wird die Software gründlich auf deren Verwendbarkeit zu dem von ihm beabsichtigten Zweck testen, bevor er diese operativ einsetzt. |
// + Der Kunde wird er seine Daten vor Einsatz der Software nach dem Stand der Technik sichern. |
// + Der Kunde ist darüber unterrichtet, dass der Lizenzgeber seine Daten im zur Vertragsdurchführung erforderlichen Umfang |
// + und auf Grundlage der Datenschutzvorschriften erhebt, speichert, verarbeitet und, sofern notwendig, an Dritte übermittelt. |
// + *) Die räumliche Nutzung bezieht sich nur auf den Einsatzort, nicht auf die Reichweite der programmierten Software. |
// + #### ENDE DER NUTZUNGSBEDINGUNGEN ####' |
// + Hinweis: Informationen über erweiterte Nutzungsrechte (wie z.B. Nutzung für nicht-private Zwecke) sind auf Anfrage per Email an info(@)hisystems.de verfügbar. |
// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
// + Software LICENSING TERMS |
// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
// + of HiSystems GmbH, Flachsmeerstrasse 2, 26802 Moormerland, Germany - the Licensor - |
// + The Licensor grants the customer a non-exclusive license to use the microcontroller firmware of the Flight-Ctrl, Navi-Ctrl, BL-Ctrl, and MK3Mag hardware |
// + (the Software) exclusively for private purposes. The License is unrestricted with respect to time and territory*. |
// + The Software may only be used with the Licensor's products. |
// + The Software provided by the Licensor is protected by copyright. With respect to the relationship between the parties to this |
// + agreement, all rights pertaining to the Software and other documents provided during the preparation and execution of this |
// + agreement shall be the property of the Licensor. |
// + The information contained in the Software copyright notices, trademarks, other legal reservations, serial numbers and other |
// + features that can be used to identify the program may not be altered or defaced by the customer. |
// + The customer shall be responsible for taking reasonable precautions |
// + for the safe use of the Software. The customer shall test the Software thoroughly regarding its suitability for the |
// + intended purpose before implementing it for actual operation. The Licensor's liability shall be limited to the extent of typical and |
// + foreseeable damage to the extent permitted by law, notwithstanding statutory liability for bodily injury and product |
// + liability. However, the Licensor shall be entitled to the defense of contributory negligence. |
// + The customer will take adequate precautions in the case, that the software is not working properly. The customer will test |
// + the software for his purpose before any operational usage. The customer will backup his data before using the software. |
// + The customer understands that the Licensor collects, stores and processes, and, where required, forwards, customer data |
// + to third parties to the extent necessary for executing the agreement, subject to applicable data protection and privacy regulations. |
// + *) The territory aspect only refers to the place where the Software is used, not its programmed range. |
// + #### END OF LICENSING TERMS #### |
// + Note: For information on license extensions (e.g. commercial use), please contact us at info(@)hisystems.de. |
// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
#include <stdarg.h> |
#include <string.h> |
#include <avr/pgmspace.h> |
#include "main.h" |
#include "uart.h" |
#include "libfc.h" |
#include "eeprom.h" |
#define FC_ADDRESS 1 |
#define NC_ADDRESS 2 |
#define MK3MAG_ADDRESS 3 |
#define BL_CTRL_ADDRESS 5 |
#define ABO_TIMEOUT 4000 // disable abo after 4 seconds |
#define MAX_SENDE_BUFF 220 |
#define MAX_EMPFANGS_BUFF 220 |
#define BLPARAM_REVISION 1 |
#define MASK_SET_PWM_SCALING 0x01 |
#define MASK_SET_CURRENT_LIMIT 0x02 |
#define MASK_SET_TEMP_LIMIT 0x04 |
#define MASK_SET_CURRENT_SCALING 0x08 |
#define MASK_SET_BITCONFIG 0x10 |
#define MASK_RESET_CAPCOUNTER 0x20 |
#define MASK_SET_DEFAULT_PARAMS 0x40 |
#define MASK_SET_SAVE_EEPROM 0x80 |
unsigned char GetExternalControl = 0,DebugDisplayAnforderung1 = 0, DebugDisplayAnforderung = 0,DebugDataAnforderung = 0,GetVersionAnforderung = 0, GetPPMChannelAnforderung = 0; |
unsigned char DisplayLine = 0; |
unsigned volatile char SioTmp = 0; |
unsigned volatile char NeuerDatensatzEmpfangen = 0; |
unsigned volatile char NeueKoordinateEmpfangen = 0; |
unsigned volatile char UebertragungAbgeschlossen = 1; |
unsigned volatile char CntCrcError = 0; |
unsigned volatile char AnzahlEmpfangsBytes = 0; |
unsigned volatile char TxdBuffer[MAX_SENDE_BUFF]; |
unsigned volatile char RxdBuffer[MAX_EMPFANGS_BUFF]; |
unsigned char *pRxData = 0; |
unsigned char RxDataLen = 0; |
unsigned volatile char PC_DebugTimeout = 0; |
unsigned volatile char PC_MotortestActive = 0; |
unsigned char DebugTextAnforderung = 255; |
unsigned char PcZugriff = 100; |
unsigned char MotorTest[16]; |
unsigned char MeineSlaveAdresse = 1; // Flight-Ctrl |
unsigned char ConfirmFrame; |
struct str_DebugOut DebugOut; |
struct str_ExternControl ExternControl; |
struct str_VersionInfo VersionInfo; |
struct str_WinkelOut WinkelOut; |
struct str_Data3D Data3D; |
int Display_Timer, Debug_Timer,Kompass_Timer,Timer3D; |
unsigned int DebugDataIntervall = 0, Intervall3D = 0, Display_Interval = 0; |
unsigned int AboTimeOut = 0; |
unsigned volatile char ReceiverUpdateModeActive = 0; // 1 = Update 2 = JetiBox-Simulation |
const unsigned char ANALOG_TEXT[32][16] PROGMEM = |
{ |
//1234567890123456 |
"AngleNick ", //0 |
"AngleRoll ", |
"AccNick ", |
"AccRoll ", |
"YawGyro ", |
"Altitude [0.1m] ", //5 |
"AccZ ", |
"Gas ", |
"Compass Value ", |
"Voltage [0.1V] ", |
"Receiver Level ", //10 |
"Gyro Compass ", |
"Motor 1 ", |
"Motor 2 ", |
"Motor 3 ", |
"Motor 4 ", //15 |
"16 ", |
"17 ", |
"18 ", |
"19 ", |
"Servo ", //20 |
"Hovergas ", |
"Current [0.1A] ", |
"Capacity [mAh] ", |
"Height Setpoint ", |
"25 ", //25 |
"26 ", //"26 CPU OverLoad ", |
"Compass Setpoint", |
"I2C-Error ", |
"BL Limit ", |
"GPS_Nick ", //30 |
"GPS_Roll " |
}; |
//+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
//++ Sende-Part der Datenübertragung |
//+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
ISR(USART0_TX_vect) |
{ |
static unsigned int ptr = 0; |
unsigned char tmp_tx; |
if(!UebertragungAbgeschlossen) |
{ |
ptr++; // die [0] wurde schon gesendet |
tmp_tx = TxdBuffer[ptr]; |
if((tmp_tx == '\r') || (ptr == MAX_SENDE_BUFF)) |
{ |
ptr = 0; |
UebertragungAbgeschlossen = 1; |
} |
UDR0 = tmp_tx; |
} |
else ptr = 0; |
} |
//+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
//++ Empfangs-Part der Datenübertragung, incl. CRC-Auswertung |
//+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
ISR(USART0_RX_vect) |
{ |
static unsigned int crc; |
static unsigned char crc1,crc2,buf_ptr; |
static unsigned char UartState = 0; |
unsigned char CrcOkay = 0; |
if (ReceiverUpdateModeActive == 1) { UDR1 = UDR0; return; } // 1 = Update |
if (ReceiverUpdateModeActive == 2) { RxdBuffer[0] = UDR0; return; } // 2 = JetiBox-Simulation |
SioTmp = UDR0; |
if(buf_ptr >= MAX_SENDE_BUFF) UartState = 0; |
if(SioTmp == '\r' && UartState == 2) |
{ |
UartState = 0; |
crc -= RxdBuffer[buf_ptr-2]; |
crc -= RxdBuffer[buf_ptr-1]; |
crc %= 4096; |
crc1 = '=' + crc / 64; |
crc2 = '=' + crc % 64; |
CrcOkay = 0; |
if((crc1 == RxdBuffer[buf_ptr-2]) && (crc2 == RxdBuffer[buf_ptr-1])) CrcOkay = 1; else { CrcOkay = 0; CntCrcError++;}; |
if(!NeuerDatensatzEmpfangen && CrcOkay) // Datensatz schon verarbeitet |
{ |
NeuerDatensatzEmpfangen = 1; |
AnzahlEmpfangsBytes = buf_ptr + 1; |
RxdBuffer[buf_ptr] = '\r'; |
if(RxdBuffer[2] == 'R' && !MotorenEin) |
{ |
LcdClear(); |
wdt_enable(WDTO_250MS); // Reset-Commando |
ServoActive = 0; |
} |
} |
} |
else |
switch(UartState) |
{ |
case 0: |
if(SioTmp == '#' && !NeuerDatensatzEmpfangen) UartState = 1; // Startzeichen und Daten schon verarbeitet |
buf_ptr = 0; |
RxdBuffer[buf_ptr++] = SioTmp; |
crc = SioTmp; |
break; |
case 1: // Adresse auswerten |
UartState++; |
RxdBuffer[buf_ptr++] = SioTmp; |
crc += SioTmp; |
break; |
case 2: // Eingangsdaten sammeln |
RxdBuffer[buf_ptr] = SioTmp; |
if(buf_ptr < MAX_EMPFANGS_BUFF) buf_ptr++; |
else UartState = 0; |
crc += SioTmp; |
break; |
default: |
UartState = 0; |
break; |
} |
} |
// -------------------------------------------------------------------------- |
void AddCRC(unsigned int wieviele) |
{ |
unsigned int tmpCRC = 0,i; |
for(i = 0; i < wieviele;i++) |
{ |
tmpCRC += TxdBuffer[i]; |
} |
// if(i > MAX_SENDE_BUFF - 3) tmpCRC += 11; |
tmpCRC %= 4096; |
TxdBuffer[i++] = '=' + tmpCRC / 64; |
TxdBuffer[i++] = '=' + tmpCRC % 64; |
TxdBuffer[i++] = '\r'; |
UebertragungAbgeschlossen = 0; |
UDR0 = TxdBuffer[0]; |
//if(DebugOut.Analog[] < i) DebugOut.Analog[] = i; |
} |
// -------------------------------------------------------------------------- |
void SendOutData(unsigned char cmd,unsigned char address, unsigned char BufferAnzahl, ...) //unsigned char *snd, unsigned char len) |
{ |
va_list ap; |
unsigned int pt = 0; |
unsigned char a,b,c; |
unsigned char ptr = 0; |
unsigned char *snd = 0; |
int len = 0; |
TxdBuffer[pt++] = '#'; // Startzeichen |
TxdBuffer[pt++] = 'a' + address; // Adresse (a=0; b=1,...) |
TxdBuffer[pt++] = cmd; // Commando |
va_start(ap, BufferAnzahl); |
if(BufferAnzahl) |
{ |
snd = va_arg(ap, unsigned char*); |
len = va_arg(ap, int); |
ptr = 0; |
BufferAnzahl--; |
} |
while(len) |
{ |
if(len) |
{ |
a = snd[ptr++]; |
len--; |
if((!len) && BufferAnzahl) |
{ |
snd = va_arg(ap, unsigned char*); |
len = va_arg(ap, int); |
ptr = 0; |
BufferAnzahl--; |
} |
} |
else a = 0; |
if(len) |
{ |
b = snd[ptr++]; |
len--; |
if((!len) && BufferAnzahl) |
{ |
snd = va_arg(ap, unsigned char*); |
len = va_arg(ap, int); |
ptr = 0; |
BufferAnzahl--; |
} |
} |
else b = 0; |
if(len) |
{ |
c = snd[ptr++]; |
len--; |
if((!len) && BufferAnzahl) |
{ |
snd = va_arg(ap, unsigned char*); |
len = va_arg(ap, int); |
ptr = 0; |
BufferAnzahl--; |
} |
} |
else c = 0; |
TxdBuffer[pt++] = '=' + (a >> 2); |
TxdBuffer[pt++] = '=' + (((a & 0x03) << 4) | ((b & 0xf0) >> 4)); |
TxdBuffer[pt++] = '=' + (((b & 0x0f) << 2) | ((c & 0xc0) >> 6)); |
TxdBuffer[pt++] = '=' + ( c & 0x3f); |
} |
va_end(ap); |
AddCRC(pt); |
} |
// -------------------------------------------------------------------------- |
void Decode64(void) // die daten werden im rx buffer dekodiert, das geht nur, weil aus 4 byte immer 3 gemacht werden. |
{ |
unsigned char a,b,c,d; |
unsigned char x,y,z; |
unsigned char ptrIn = 3; // start at begin of data block |
unsigned char ptrOut = 3; |
unsigned char len = AnzahlEmpfangsBytes - 6; // von der Gesamtbytezahl eines Frames gehen 3 Bytes des Headers ('#',Addr, Cmd) und 3 Bytes des Footers (CRC1, CRC2, '\r') ab. |
while(len) |
{ |
a = RxdBuffer[ptrIn++] - '='; |
b = RxdBuffer[ptrIn++] - '='; |
c = RxdBuffer[ptrIn++] - '='; |
d = RxdBuffer[ptrIn++] - '='; |
x = (a << 2) | (b >> 4); |
y = ((b & 0x0f) << 4) | (c >> 2); |
z = ((c & 0x03) << 6) | d; |
if(len--) RxdBuffer[ptrOut++] = x; else break; |
if(len--) RxdBuffer[ptrOut++] = y; else break; |
if(len--) RxdBuffer[ptrOut++] = z; else break; |
} |
pRxData = (unsigned char*)&RxdBuffer[3]; // decodierte Daten beginnen beim 4. Byte |
RxDataLen = ptrOut - 3; // wie viele Bytes wurden dekodiert? |
} |
// -------------------------------------------------------------------------- |
void BearbeiteRxDaten(void) |
{ |
if(!NeuerDatensatzEmpfangen) return; |
unsigned char tempchar1, tempchar2; |
Decode64(); // dekodiere datenblock im Empfangsbuffer |
switch(RxdBuffer[1]-'a') // check for Slave Address |
{ |
case FC_ADDRESS: // FC special commands |
switch(RxdBuffer[2]) |
{ |
case 'K':// Kompasswert |
memcpy((unsigned char *)&KompassValue , (unsigned char *)pRxData, sizeof(KompassValue)); |
// KompassRichtung = ((540 + KompassValue - KompassSollWert) % 360) - 180; |
break; |
case 't':// Motortest |
if(AnzahlEmpfangsBytes > 20) memcpy(&MotorTest[0], (unsigned char *)pRxData, sizeof(MotorTest)); |
else memcpy(&MotorTest[0], (unsigned char *)pRxData, 4); |
PC_MotortestActive = 240; |
//while(!UebertragungAbgeschlossen); |
//SendOutData('T', MeineSlaveAdresse, 0); |
PcZugriff = 255; |
break; |
case 'n':// "Get Mixer |
while(!UebertragungAbgeschlossen); |
SendOutData('N', FC_ADDRESS, 1, (unsigned char *) &Mixer, sizeof(Mixer) - 1); |
Debug("Mixer lesen"); |
break; |
case 'm':// "Write Mixer |
if(pRxData[0] == EEMIXER_REVISION) |
{ |
memcpy(&Mixer, (unsigned char *)pRxData, sizeof(Mixer) - 1); |
MixerTable_WriteToEEProm(); |
tempchar1 = 1; |
VersionInfo.HardwareError[1] &= ~FC_ERROR1_MIXER; |
} |
else |
{ |
tempchar1 = 0; |
} |
while(!UebertragungAbgeschlossen); |
SendOutData('M', FC_ADDRESS, 1, &tempchar1, sizeof(tempchar1)); |
break; |
case 'p': // get PPM Channels |
GetPPMChannelAnforderung = 1; |
PcZugriff = 255; |
break; |
case 'q':// "Get"-Anforderung für Settings |
// Bei Get werden die vom PC einstellbaren Werte vom PC zurückgelesen |
if(MotorenEin) break; |
if((10 <= pRxData[0]) && (pRxData[0] < 20)) |
{ |
tempchar1 = pRxData[0] - 10; |
if(tempchar1< 1) tempchar1 = 1; // limit to 1 |
else if(tempchar1 > 5) tempchar1 = 5; // limit to 5 |
SetDefaultParameter(tempchar1, 1); |
} |
else if((20 <= pRxData[0]) && (pRxData[0] < 30)) |
{ |
tempchar1 = pRxData[0] - 20; |
if(tempchar1< 1) tempchar1 = 1; // limit to 1 |
else if(tempchar1 > 5) tempchar1 = 5; // limit to 5 |
SetDefaultParameter(tempchar1, 0); |
} |
else |
{ |
tempchar1 = pRxData[0]; |
if(tempchar1 == 0xFF) |
{ |
tempchar1 = GetActiveParamSet(); |
} |
if(tempchar1< 1) tempchar1 = 1; // limit to 1 |
else if(tempchar1 > 5) tempchar1 = 5; // limit to 5 |
// load requested parameter set |
ParamSet_ReadFromEEProm(tempchar1); |
} |
while(!UebertragungAbgeschlossen); |
SendOutData('Q', FC_ADDRESS, 2, &tempchar1, sizeof(tempchar1), (unsigned char *) &EE_Parameter, sizeof(EE_Parameter) - 1); |
Debug("Lese Setting %d", tempchar1); |
break; |
case 's': // Parametersatz speichern |
if((1 <= pRxData[0]) && (pRxData[0] <= 5) && (pRxData[1] == EEPARAM_REVISION) && MotorenEin == 0) // check for setting to be in range |
{ |
memcpy(&EE_Parameter, (uint8_t*)&pRxData[1], sizeof(EE_Parameter) - 1); |
ParamSet_WriteToEEProm(pRxData[0]); |
Umschlag180Nick = (long) EE_Parameter.WinkelUmschlagNick * 2500L; |
Umschlag180Roll = (long) EE_Parameter.WinkelUmschlagRoll * 2500L; |
tempchar1 = GetActiveParamSet(); |
} |
else |
{ |
tempchar1 = 0; // mark in response an invlid setting |
} |
while(!UebertragungAbgeschlossen); |
SendOutData('S', FC_ADDRESS, 1, &tempchar1, sizeof(tempchar1)); |
if(!MotorenEin) |
{ |
Piep(tempchar1,110); |
LipoDetection(0); |
} |
LIBFC_ReceiverInit(EE_Parameter.Receiver); |
break; |
case 'f': // auf anderen Parametersatz umschalten |
if(MotorenEin) break; |
if((1 <= pRxData[0]) && (pRxData[0] <= 5)) ParamSet_ReadFromEEProm(pRxData[0]); |
tempchar1 = GetActiveParamSet(); |
while(!UebertragungAbgeschlossen); |
SendOutData('F', FC_ADDRESS, 1, &tempchar1, sizeof(tempchar1)); |
if(!MotorenEin) |
{ |
Piep(tempchar1,110); |
LipoDetection(0); |
} |
LIBFC_ReceiverInit(EE_Parameter.Receiver); |
break; |
case 'y':// serial Potis |
for(tempchar1 = 0; tempchar1 < 12; tempchar1++) PPM_in[SERIAL_POTI_START + tempchar1] = (signed char) pRxData[tempchar1]; |
break; |
case 'u': // request BL parameter |
Debug("Reading BL %d", pRxData[0]); |
// try to read BL configuration |
tempchar2 = I2C_ReadBLConfig(pRxData[0]); |
if(tempchar2 == BLCONFIG_SUCCESS) tempchar1 = 1; |
else tempchar1 = 0; |
while(!UebertragungAbgeschlossen); // wait for previous frame to be sent |
SendOutData('U', FC_ADDRESS, 4, &tempchar1, sizeof(tempchar1), &tempchar2, sizeof(tempchar2), &pRxData[0], 1, &BLConfig, sizeof(BLConfig_t)); |
break; |
case 'w': // write BL parameter |
Debug("Writing BL %d", pRxData[0]); |
if(RxDataLen >= 1+sizeof(BLConfig_t)) |
{ |
memcpy(&BLConfig, (uint8_t*)(&pRxData[1]), sizeof(BLConfig_t)); |
tempchar2 = I2C_WriteBLConfig(pRxData[0]); |
if(tempchar2 == BLCONFIG_SUCCESS) tempchar1 = 1; |
else tempchar1 = 0; // indicate error |
while(!UebertragungAbgeschlossen); // wait for previous frame to be sent |
SendOutData('W', FC_ADDRESS,2, &tempchar1, sizeof(tempchar1), &tempchar2, sizeof(tempchar2)); |
} |
break; |
case 'j': |
if(MotorenEin) break; |
tempchar1 = LIBFC_GetCPUType(); |
if((tempchar1 == CPU_ATMEGA644P) || (tempchar1 == CPU_ATMEGA1284P)) |
{ |
uint16_t ubrr = (uint16_t) ((uint32_t) F_CPU/ (8 * 38400L) - 1); |
cli(); |
// UART0 & UART1 disable RX and TX-Interrupt |
UCSR0B &= ~((1 << RXCIE0)|(1 << TXCIE0)); |
UCSR1B &= ~((1 << RXCIE1)|(1 << TXCIE1)); |
// UART0 & UART1 disable receiver and transmitter |
UCSR0B &= ~((1 << TXEN0) | (1 << RXEN0)); |
UCSR1B &= ~((1 << TXEN1) | (1 << RXEN1)); |
// UART0 & UART1 flush receive buffer explicit |
while ( UCSR1A & (1<<RXC1) ) UDR1; |
while ( UCSR0A & (1<<RXC0) ) UDR0; |
if(pRxData[0] == 1) ReceiverUpdateModeActive = 2; |
else |
{ // Jeti or HoTT update |
//#if (defined(__AVR_ATmega1284__) || defined(__AVR_ATmega1284P__)) |
if(pRxData[0] == 100) ubrr = (uint16_t) ((uint32_t) F_CPU/ (8 * 19200L) - 1); // HoTT |
//#endif |
ReceiverUpdateModeActive = 1; |
// UART0 & UART1 set baudrate |
UBRR1H = (uint8_t)(ubrr>>8); |
UBRR1L = (uint8_t)ubrr; |
UBRR0H = UBRR1H; |
UBRR0L = UBRR1L; |
// UART1 no parity |
UCSR1C &= ~(1 << UPM11); |
UCSR1C &= ~(1 << UPM10); |
// UART1 8-bit |
UCSR1B &= ~(1 << UCSZ12); |
UCSR1C |= (1 << UCSZ11); |
UCSR1C |= (1 << UCSZ10); |
} |
// UART0 & UART1 1 stop bit |
UCSR1C &= ~(1 << USBS1); |
UCSR0C &= ~(1 << USBS0); |
// UART1 clear 9th bit |
UCSR1B &= ~(1<<TXB81); |
// enable receiver and transmitter for UART0 and UART1 |
UCSR0B |= (1 << TXEN0) | (1 << RXEN0); |
UCSR1B |= (1 << TXEN1) | (1 << RXEN1); |
// enable RX-Interrupt for UART0 and UART1 |
UCSR0B |= (1 << RXCIE0); |
UCSR1B |= (1 << RXCIE1); |
// disable other Interrupts |
TIMSK0 = 0; |
TIMSK1 = 0; |
TIMSK2 = 0; |
sei(); |
} |
break; |
} // case FC_ADDRESS: |
default: // any Slave Address |
switch(RxdBuffer[2]) |
{ |
// 't' comand placed here only for compatibility to BL |
case 't':// Motortest |
if(AnzahlEmpfangsBytes >= sizeof(MotorTest)) memcpy(&MotorTest[0], (unsigned char *)pRxData, sizeof(MotorTest)); |
else memcpy(&MotorTest[0], (unsigned char *)pRxData, 4); |
while(!UebertragungAbgeschlossen); |
SendOutData('T', MeineSlaveAdresse, 0); |
PC_MotortestActive = 250; |
PcZugriff = 255; |
AboTimeOut = SetDelay(ABO_TIMEOUT); |
break; |
// 'K' comand placed here only for compatibility to old MK3MAG software, that does not send the right Slave Address |
case 'K':// Kompasswert |
memcpy((unsigned char *)&KompassValue , (unsigned char *)pRxData, sizeof(KompassValue)); |
// KompassRichtung = ((540 + KompassValue - KompassSollWert) % 360) - 180; |
break; |
case 'a':// Texte der Analogwerte |
DebugTextAnforderung = pRxData[0]; |
if (DebugTextAnforderung > 31) DebugTextAnforderung = 31; |
PcZugriff = 255; |
break; |
case 'b': |
memcpy((unsigned char *)&ExternControl, (unsigned char *)pRxData, sizeof(ExternControl)); |
ConfirmFrame = ExternControl.Frame; |
PcZugriff = 255; |
break; |
case 'c': // Poll the 3D-Data |
if(!Intervall3D) { if(pRxData[0]) Timer3D = SetDelay(pRxData[0] * 10);} |
Intervall3D = pRxData[0] * 10; |
AboTimeOut = SetDelay(ABO_TIMEOUT); |
break; |
case 'd': // Poll the debug data |
PcZugriff = 255; |
DebugDataIntervall = (unsigned int)pRxData[0] * 10; |
if(DebugDataIntervall > 0) DebugDataAnforderung = 1; |
AboTimeOut = SetDelay(ABO_TIMEOUT); |
break; |
case 'h':// x-1 Displayzeilen |
PcZugriff = 255; |
if((pRxData[0] & 0x80) == 0x00) // old format |
{ |
DisplayLine = 2; |
Display_Interval = 0; |
} |
else // new format |
{ |
RemoteKeys |= ~pRxData[0]; |
Display_Interval = (unsigned int)pRxData[1] * 10; |
DisplayLine = 4; |
AboTimeOut = SetDelay(ABO_TIMEOUT); |
} |
DebugDisplayAnforderung = 1; |
break; |
case 'l':// x-1 Displayzeilen |
PcZugriff = 255; |
MenuePunkt = pRxData[0]; |
DebugDisplayAnforderung1 = 1; |
break; |
case 'v': // Version-Anforderung und Ausbaustufe |
GetVersionAnforderung = 1; |
break; |
case 'g':// |
GetExternalControl = 1; |
break; |
default: |
//unsupported command received |
break; |
} |
break; // default: |
} |
NeuerDatensatzEmpfangen = 0; |
pRxData = 0; |
RxDataLen = 0; |
} |
//############################################################################ |
//Routine für die Serielle Ausgabe |
void uart_putchar (char c) |
//############################################################################ |
{ |
//Warten solange bis Zeichen gesendet wurde |
loop_until_bit_is_set(UCSR0A, UDRE0); |
//Ausgabe des Zeichens |
UDR0 = c; |
} |
//############################################################################ |
//INstallation der Seriellen Schnittstelle |
void UART_Init (void) |
//############################################################################ |
{ |
unsigned int ubrr = (unsigned int) ((unsigned long) F_CPU/(8 * USART0_BAUD) - 1); |
//Enable TXEN im Register UCR TX-Data Enable & RX Enable |
UCSR0B = (1 << TXEN0) | (1 << RXEN0); |
// UART Double Speed (U2X) |
UCSR0A |= (1 << U2X0); |
// RX-Interrupt Freigabe |
UCSR0B |= (1 << RXCIE0); |
// TX-Interrupt Freigabe |
UCSR0B |= (1 << TXCIE0); |
// USART0 Baud Rate Register |
// set clock divider |
UBRR0H = (uint8_t)(ubrr >> 8); |
UBRR0L = (uint8_t)ubrr; |
Debug_Timer = SetDelay(DebugDataIntervall); |
Kompass_Timer = SetDelay(220); |
VersionInfo.SWMajor = VERSION_MAJOR; |
VersionInfo.SWMinor = VERSION_MINOR; |
VersionInfo.SWPatch = VERSION_PATCH; |
VersionInfo.ProtoMajor = VERSION_SERIAL_MAJOR; |
VersionInfo.reserved1 = 0; |
VersionInfo.reserved2 = 0; |
VersionInfo.HWMajor = PlatinenVersion; |
pRxData = 0; |
RxDataLen = 0; |
} |
//--------------------------------------------------------------------------------------------- |
void DatenUebertragung(void) |
{ |
if(!UebertragungAbgeschlossen) return; |
if(CheckDelay(AboTimeOut)) |
{ |
Display_Interval = 0; |
DebugDataIntervall = 0; |
Intervall3D = 0; |
} |
if(((Display_Interval>0 && CheckDelay(Display_Timer)) || DebugDisplayAnforderung) && UebertragungAbgeschlossen) |
{ |
if(DisplayLine > 3)// new format |
{ |
Menu(); |
SendOutData('H', FC_ADDRESS, 1, (uint8_t *)DisplayBuff, 80); |
} |
else // old format |
{ |
LCD_printfxy(0,0,"!!! INCOMPATIBLE !!!"); |
SendOutData('H', FC_ADDRESS, 2, &DisplayLine, sizeof(DisplayLine), (uint8_t *)DisplayBuff, 20); |
if(DisplayLine++ > 3) DisplayLine = 0; |
} |
Display_Timer = SetDelay(Display_Interval); |
DebugDisplayAnforderung = 0; |
} |
if(DebugDisplayAnforderung1 && UebertragungAbgeschlossen) |
{ |
Menu(); |
SendOutData('L', FC_ADDRESS, 3, &MenuePunkt, sizeof(MenuePunkt), &MaxMenue, sizeof(MaxMenue), DisplayBuff, sizeof(DisplayBuff)); |
DebugDisplayAnforderung1 = 0; |
} |
if(GetVersionAnforderung && UebertragungAbgeschlossen) |
{ |
SendOutData('V', FC_ADDRESS, 1, (unsigned char *) &VersionInfo, sizeof(VersionInfo)); |
GetVersionAnforderung = 0; |
Debug_OK("Version gesendet"); |
} |
if(GetExternalControl && UebertragungAbgeschlossen) // Bei Get werden die vom PC einstellbaren Werte vom PC zurückgelesen |
{ |
SendOutData('G',MeineSlaveAdresse, 1, (unsigned char *) &ExternControl, sizeof(ExternControl)); |
GetExternalControl = 0; |
} |
if(((DebugDataIntervall>0 && CheckDelay(Debug_Timer)) || DebugDataAnforderung) && UebertragungAbgeschlossen) |
{ |
CopyDebugValues(); |
SendOutData('D', FC_ADDRESS, 1, (unsigned char *) &DebugOut,sizeof(DebugOut)); |
DebugDataAnforderung = 0; |
if(DebugDataIntervall>0) Debug_Timer = SetDelay(DebugDataIntervall); |
} |
if(Intervall3D > 0 && CheckDelay(Timer3D) && UebertragungAbgeschlossen) |
{ |
Data3D.Winkel[0] = ToNaviCtrl.IntegralNick;//(int) (IntegralNick / (EE_Parameter.GyroAccFaktor * 4)); // etwa in 0.1 Grad |
Data3D.Winkel[1] = ToNaviCtrl.IntegralRoll;//(int) (IntegralRoll / (EE_Parameter.GyroAccFaktor * 4)); // etwa in 0.1 Grad |
Data3D.Winkel[2] = (int) ((10 * ErsatzKompass) / GIER_GRAD_FAKTOR); |
Data3D.Centroid[0] = SummeNick >> 9; |
Data3D.Centroid[1] = SummeRoll >> 9; |
Data3D.Centroid[2] = Mess_Integral_Gier >> 9; |
SendOutData('C', FC_ADDRESS, 1, (unsigned char *) &Data3D,sizeof(Data3D)); |
Timer3D = SetDelay(Intervall3D); |
} |
if(DebugTextAnforderung != 255) // Texte für die Analogdaten |
{ |
unsigned char label[16]; // local sram buffer |
memcpy_P(label, ANALOG_TEXT[DebugTextAnforderung], 16); // read lable from flash to sra |
SendOutData('A', FC_ADDRESS, 2, (unsigned char *)&DebugTextAnforderung, sizeof(DebugTextAnforderung),label, 16); |
DebugTextAnforderung = 255; |
} |
if(ConfirmFrame && UebertragungAbgeschlossen) // Datensatz bestätigen |
{ |
SendOutData('B', FC_ADDRESS, 1, (uint8_t*)&ConfirmFrame, sizeof(ConfirmFrame)); |
ConfirmFrame = 0; |
} |
if(GetPPMChannelAnforderung && UebertragungAbgeschlossen) |
{ |
SendOutData('P', FC_ADDRESS, 1, (unsigned char *) &PPM_in, sizeof(PPM_in)); |
GetPPMChannelAnforderung = 0; |
} |
if((CheckDelay(Kompass_Timer)) && UebertragungAbgeschlossen) |
{ |
WinkelOut.Winkel[0] = ToNaviCtrl.IntegralNick;//(int) (IntegralNick / (EE_Parameter.GyroAccFaktor * 4)); // etwa in 0.1 Grad |
WinkelOut.Winkel[1] = ToNaviCtrl.IntegralRoll;//(int) (IntegralRoll / (EE_Parameter.GyroAccFaktor * 4)); // etwa in 0.1 Grad |
WinkelOut.UserParameter[0] = Parameter_UserParam1; |
WinkelOut.UserParameter[1] = Parameter_UserParam2; |
SendOutData('k', MK3MAG_ADDRESS, 1, (unsigned char *) &WinkelOut,sizeof(WinkelOut)); |
if(WinkelOut.CalcState > 4) WinkelOut.CalcState = 6; // wird dann in SPI auf Null gesetzt |
if(!NaviDataOkay) Kompass_Timer = SetDelay(99); |
else Kompass_Timer = SetDelay(999); |
} |
#ifdef DEBUG // only include functions if DEBUG is defined |
if(SendDebugOutput && UebertragungAbgeschlossen) |
{ |
SendOutData('0', FC_ADDRESS, 1, (unsigned char *) &tDebug, sizeof(tDebug)); |
SendDebugOutput = 0; |
} |
#endif |
} |
/branches/V2.02a_FirstTrial_Peter/uart.h |
---|
0,0 → 1,117 |
#ifndef _UART_H |
#define _UART_H |
#define printf_P(format, args...) _printf_P(&uart_putchar, format , ## args) |
#define printf(format, args...) _printf_P(&uart_putchar, PSTR(format) , ## args) |
void BearbeiteRxDaten(void); |
extern unsigned char DebugGetAnforderung; |
extern unsigned volatile char ReceiverUpdateModeActive; |
extern unsigned volatile char UebertragungAbgeschlossen; |
extern unsigned volatile char PC_DebugTimeout; |
extern unsigned volatile char NeueKoordinateEmpfangen; |
extern unsigned volatile char PC_MotortestActive; |
extern unsigned char MeineSlaveAdresse; |
extern unsigned char PcZugriff; |
extern unsigned char RemotePollDisplayLine; |
extern unsigned volatile char RxdBuffer[]; |
extern int Debug_Timer,Kompass_Timer; |
extern void UART_Init (void); |
extern void uart_putchar (char c); |
//extern void boot_program_page (uint32_t page, uint8_t *buf); |
extern void DatenUebertragung(void); |
extern void Uart1Init(void); |
extern void BearbeiteRxDaten(void); |
extern unsigned char MotorTest[16]; |
struct str_DebugOut |
{ |
unsigned char Status[2]; |
signed int Analog[32]; // Debugwerte |
}; |
extern struct str_DebugOut DebugOut; |
struct str_WinkelOut |
{ |
signed int Winkel[2]; |
unsigned char UserParameter[2]; |
unsigned char CalcState; |
unsigned char Orientation; |
}; |
extern struct str_WinkelOut WinkelOut; |
struct str_Data3D |
{ |
signed int Winkel[3]; // nick, roll, compass in 0,1° |
signed char Centroid[3]; |
signed char reserve[5]; |
}; |
extern struct str_Data3D Data3D; |
struct str_ExternControl |
{ |
unsigned char Digital[2]; |
unsigned char RemoteTasten; |
signed char Nick; |
signed char Roll; |
signed char Gier; |
unsigned char Gas; |
signed char Hight; |
unsigned char free; |
unsigned char Frame; |
unsigned char Config; |
}; |
extern struct str_ExternControl ExternControl; |
// FC hardware errors |
// bitmask for UART_VersionInfo_t.HardwareError[0] |
#define FC_ERROR0_GYRO_NICK 0x01 |
#define FC_ERROR0_GYRO_ROLL 0x02 |
#define FC_ERROR0_GYRO_YAW 0x04 |
#define FC_ERROR0_ACC_NICK 0x08 |
#define FC_ERROR0_ACC_ROLL 0x10 |
#define FC_ERROR0_ACC_TOP 0x20 |
#define FC_ERROR0_PRESSURE 0x40 |
#define FC_ERROR0_CAREFREE 0x80 |
// bitmask for UART_VersionInfo_t.HardwareError[1] |
#define FC_ERROR1_I2C 0x01 |
#define FC_ERROR1_BL_MISSING 0x02 |
#define FC_ERROR1_SPI_RX 0x04 |
#define FC_ERROR1_PPM 0x08 |
#define FC_ERROR1_MIXER 0x10 |
#define FC_ERROR1_RES1 0x20 |
#define FC_ERROR1_RES2 0x40 |
#define FC_ERROR1_RES3 0x80 |
// for FlightCtrl |
//VersionInfo.Flags |
#define FC_VERSION_FLAG_NC_PRESENT 0x01 |
// for NaviCtrl |
#define NC_VERSION_FLAG_MK3MAG_PRESENT 0x01 |
struct str_VersionInfo |
{ |
unsigned char SWMajor; |
unsigned char SWMinor; |
unsigned char ProtoMajor; |
unsigned char reserved1; |
unsigned char SWPatch; |
unsigned char HardwareError[2]; |
unsigned char HWMajor; |
unsigned char reserved2; |
unsigned char Flags; |
}; |
extern struct str_VersionInfo VersionInfo; |
//#define USART0_BAUD 9600 |
//#define USART0_BAUD 14400 |
//#define USART0_BAUD 28800 |
//#define USART0_BAUD 38400 |
#define USART0_BAUD 57600 |
#endif //_UART_H |
/branches/V2.02a_FirstTrial_Peter/user_receiver.c |
---|
0,0 → 1,23 |
//############################################################################ |
// Implement your own RC-decoding routines here |
//############################################################################ |
//############################################################################ |
// Initialize the UART here |
//############################################################################ |
void User_Receiver_Init(void) |
{ |
// SpektrumUartInit(); // or use an existing routine like this |
}; |
//############################################################################ |
// Is called by the uart RX interrupt |
// UDR contains the received byte |
//############################################################################ |
void User_RX_Parser(unsigned char udr) |
{ |
}; |
/branches/V2.02a_FirstTrial_Peter/user_receiver.h |
---|
0,0 → 1,4 |
// for own implementations |
void User_Receiver_Init(void); |
void User_RX_Parser(unsigned char); |
/branches/V2.02a_FirstTrial_Peter/vector.h |
---|
0,0 → 1,19 |
#ifndef _VECTOR_H |
#define _VECTOR_H |
typedef struct |
{ |
int32_t x; |
int32_t y; |
int32_t z; |
} __attribute__((packed)) vector32_t; |
typedef struct |
{ |
int16_t x; |
int16_t y; |
int16_t z; |
} __attribute__((packed)) vector16_t; |
#endif //_VECTOR_H |
/branches/V2.02a_FirstTrial_Peter/version.txt |
---|
0,0 → 1,662 |
------- |
V0.53 27.04.2007 H.Buss |
- erste öffentliche Version |
V0.53b 29.04.2007 H.Buss |
- der FAKTOR_I war versehentlich auf Null, dann liegt der MikroKopter nicht so hart in der Luft |
V0.53c 29.04.2007 H.Buss |
- es gib ein Menü, in dem die Werte der Kanäle nach Nick, Roll, Gas,... sortiert sind. |
Die angezeigten Werte waren nicht die Werte der Funke |
V0.54 01.05.2007 H.Buss |
- die Paramtersätze können jetzt vor dem Start ausgewählt werden |
Dazu wird beim Kalibrieren der Messwerte (Gashebel oben links) der Nick-Rollhebel abgefragt: |
2 3 4 |
1 x 5 |
- - - |
Bedeutet: Nick-Rollhebel Links Mitte = Setting:1 Links Oben = Setting:2 usw. |
- der Faktor_I für den Hauptregler ist hinzugekommen. Im Heading-Hold-Modus sollte er vergössert werden, was Stabilität bringt |
V0.55 14.05.2007 H.Buss |
- es können nun Servos an J3,J4,J5 mit den Kanälen 5-7 gesteuert werden |
V0.56 14.05.2007 H.Buss |
- es gab Probleme mit Funken, die mehr als 8 Kanäle haben, wenn mehrere Kanäle dann auf Null waren |
- Funken, die nicht bis +-120 aussteuern können, sollten jetzt auch gehen |
V0.57 24.05.2007 H.Buss |
- Der Höhenregler kann nun auch mittels Schalter bedient werden |
- Bug im Gier-Algorithmus behoben; Schnelles Gieren fürhrte dazu, dass der MK zu weit gedreht hat |
- Kompass-Einfluss dämpfen bei Neigung |
- Man kann zwischen Kompass FIX (Richtung beim Kalibrieren) und Variabel (einstellbar per Gier) wählen |
- Der Motortest vom Kopter-Tool geht jetzt |
- Man kann den Parametersätzen einen Namen geben |
- Das Kamerasetting ist unter Setting 2 defaultmässig integriert |
V0.58 30.05.2007 H.Buss |
- Der Höhenregler-Algorithmus wird nun umgangen, wenn der Höhenreglerschalter aus ist |
V0.60 17.08.2007 H.Buss |
- "Schwindel-Bug" behoben |
- Die Poti-Werte werden jetzt auf Unterlauf (<0) überprüft |
- Poti4 zugefügt |
- Es werden jetzt 8 Kanäle ausgewertet |
- Kamera-Servo (an J7) |
- Die Settings müssen überschrieben werden |
V0.61 - V0.63 H.Buss 27.09.2007 |
- Poti 4 und Kanal 8 werden im Menü angezeigt |
- ein paar Kleinigkeiten bei den DefaultKonstanten2 bereinigt |
- Analog.c: Aktuell_ax korrigiert |
- auf 32 Debug-Kanäle erweitert |
- Loopings sind jetzt möglich und einzeln im KopterTool freischaltbar |
- leichte Anpassungen im Gier - Geschwindigkeit und Drift |
- die Hardwareversion V1.1 wird erkannt und das Programm stellt sich auf die geänderte Gyroverstärkung und die geänderten Portpins ein |
- die Software startet nach dem Einschalten schneller, weil der Luftdruckoffset schneller gefunden wird |
- die PPM-Ausgänge liegen wieder an den Pins an |
- Details an der Sensordatenverarbeitung -> es fliegt sich geringfügig anders |
- der MK ist bei wenig Gas nicht mehr so giftig -> soll das Landen vereinfachen |
- I2C-Bus läuft jetzt sicher nach einer Störung wieder an |
- Sticksignale werden präziser ausgewertet |
- Stick-Kanäle werden ans Kopter-Tool übertragen |
- Es muss die Version V1.47 des Kopter-Tool verwendet werden |
- Die Settings werden auf Default zurückgesetzt |
- am Piepen kann man die Fehlerart unterscheiden |
1. einzelnes Piepen beim Einschalten und Kalibrieren |
2. langsames Intervall mindestens 1 Sek -> Empfangsausfall |
3. schnelleres Intervall mindestens 1 Sek -> Akku |
4. sehr schnelles Intervall mindestens 1 Sek -> Kommunikation zu den Reglern gestört |
V0.64 H.Buss 30.09.2007 |
- beim Gieren wurden die Achsen nicht hart genug geregelt |
V0.65a H.Buss 15.10.2007 |
- Integral im Mischer wieder integriert |
- Feinabstimmung im ACC/Gyro Abgleich -> 1/32 & 100 |
- ACC/Gyro Abgleich auch bei HH |
V0.66a H.Buss 3.11.2007 |
- Messwertverarbeitung aus dem Analog-Interrupt entfernt |
- Analogmessung hängt jetzt am FC-Timing |
- Looping-Stick-Hysterese eingebaut |
- Looping-180°-Umschlag einstellbar |
- Achsenkopplung: Gierbewegung verkoppelt Nick und Roll |
- Lageregelung nach ACC-Sensor verbessert |
- zusätzlicher I-Anteil in der Lageregelung verbessert die Neutrallage |
- Gyrodriftkompensation überarbeitet |
- Bug in der Gier-Stick-Berechnung behoben |
- Gyro-Messung auf 1kHz beschleunigt |
V0.67a H.Buss 16.11.2007 |
- der Hauptregler-I-Anteil wirkt jetzt nur noch auf den Winkel (ausser im HH-Mode) |
- Gyro-Acc-Abgleich jetzt wieder in jedem Zyklus |
- Feinabstimmung |
- Beim HH-Modus gab es noch Bugs |
V0.67e H.Buss 29.11.2007 |
- Parameter: Dynamic Stability und Driftfaktor eingeführt |
- Die Namen der Analogwerte werden jetzt zum Koptertool übertragen |
- Kompatibilität zum Koptertool erhöht |
V0.67f H.Buss 04.12.2007 |
- Das Integral des Hauptreglers wird jetzt linear entladen und nicht mehr proportional |
- Schub für Gier wird jetzt auf den Gaswert begrenzt, dadurch steigt der MK nicht mehr beim Gieren. Gier ist allerdings nicht mehr so agressiv |
- Die ACC-Nullwerte können jetzt dauerhaft im EEPROM gespeichert werden (Stick:Vollgas und Gier rechts) |
V0.68a I.Busker 28.12.2007 |
- SPI.c & SPI.h ins Projekt aufgenommen |
SPI-Kommuikation kann in SPI.h aktiviert/deaktivert werden |
V0.68c H.Buss 05.01.2008 |
- Stickauswertung verbessert -> träger und präziser |
- Alle Settings angepasst |
V0.69e H.Buss 05.05.2008 |
- kleinere Bugs beseitigt |
- Schneller Sinkflug jetzt möglich |
- Min- und Maxgas in den Settings geändert |
- Lagewinkel wird jetzt in 0,1 Grad an Kompass und Navi gesendet |
- Kalibrierung für MK3Mag -> Nick unten beim Kalibrieren |
- Kompassroutine um den Ersatzkompass (Gyro unterstützt Kompasswert) erweitert |
V0.69h H.Buss 21.05.2008 |
- STICK_GAIN = 4 eingeführt. Das erhöht die Auflösung der Sollwerte. Stick_P und Stick_I müssen nun um Faktor 4 erhöht werden |
- SenderOkay auch an das Naviboard übertragen |
- Bessere Parameter bei Senderausfall |
V0.69j H.Buss 30.05.2008 |
- Höhere Präzision der Achsenkopplung |
V0.69k H.Buss 31.05.2008 |
- Bug in SPI.C behoben |
- in 0.69h war ein Bug, der zu ungewollten Loopings führen konnte |
V0.69L H.Buss 14.06.2008 |
- feinere Cam-Servo-Auflösung |
V0.70a H.Buss 01.07.2008 |
- Unterstützung der V1.3-Hardware mit automatischem Hardware-Gyro-Abgleich |
V0.70b H.Buss 14.07.2008 |
- flexible Einstellungsmöglichkeit von J16 und J17 (Transistorausgänge) |
- eigene Parameter für GPS-Naviboard |
- eigener Parameter für ExternalControl (war vorher UserParameter1 bzw. 8) |
- neue Parameter im EEPROM-Datensatz: J16Bitmask, J16Timing, ExternalControl, Navi... |
- MikroKopterFlags eingeführt, damit das Navi den Status des MKs kennt |
- KopterTool-Kompatibilität auf 8 erhöht |
V0.70c H.Buss 30.07.2008 |
- Parameter der Datenfusion leicht modifiziert |
- EEPROM-Parameter für Looping-Umschlag angepasst (von 100 auf 85) |
- MaxStick wird auf 100 begrenzt |
V0.70d H.Buss 02.08.2008 |
- Transistorausgänge: das oberste Bit der Blinkmaske (im KopterTool linkes Bit) gibt nun den Zustand des Ausgangs im Schalterbetrieb an |
0.71b: H.Buss 19.10.2008 |
Kommunikation zum Navi erweitert: |
- Beeptime jetzt 32Bit |
- Datenfusion und Driftkopensation wird durch NaviBoard unterstützt |
0.71c: H.Buss 20.10.2008 |
- LoopConfig heisst jetzt BitConfig |
- 3-Fach-Schalter für Höhensteuerung möglich -> kann man mit GPS-Schalter zusammenlegen |
- bei den Settings wurde Setting[0] mit abgespeichert, welches es nicht gab. |
- in Zukunft werden bei neuen EEPROM-Settings die Kanäle von Setting 1 übernommen |
- Variablen NaviWindCorrection, NaviSpeedCompensation, NaviOperatingRadius eingeführt |
0.71f: H.Buss 15.11.2008 |
- Ausschalten der Höhenregelung per Schalter um 0,3 sek verzögert |
- bei der seriellen Übertragung hat die FC jetzt als SlaveAdresse die 1 |
- VersionInfo.NaviKompatibel eingeführt |
- wenn manuell gegiert wird, wird der GyroKompass-Wert auf den Kompasswert gesetzt |
- Luftdruckwert wird an das Navi übertragen |
- Der Baro-Offset wird jetzt nachgeführt, um den Messbereich zu erweitern. Geht nur bei Höhenregler mit Schalter |
- Debugdaten können jetzt mit 'f' gepollt werden |
0.71g: Gregor 09.12.2008 |
- Kommunikation überarbeitet |
Infos hier: http://www.mikrokopter.de/ucwiki/en/SerialCommands |
0.71h: H.Buss 15.12.2008 |
- Freigegebene Version |
- NaviAngleLimitation als Parameter zum Navi implementiert |
- Antwort auf CMD: 't' entfernt |
0.72d: H.Buss 22.01.2009 |
- OCTO als Compilerschalter |
- Unterstützung der FC 2.0 (ME) |
- GYRO_D eingeführt |
- Achsenkopplung jetzt auch auf Nick/Roll-Bewegung |
0.72e: H.Buss 27.01.2009 |
- die 0.72d hatte kein Integral im Gier |
- Parameter eingeführt: |
EE_Parameter.NaviGpsPLimit |
EE_Parameter.NaviGpsILimit |
EE_Parameter.NaviGpsDLimit |
EE_Parameter.NaviPH_LoginTime |
EE_Parameter.AchsKopplung2 |
EE_Parameter.CouplingYawCorrection |
0.72f: H.Buss 28.01.2009 |
- Bug im Ersatzkompass entfernt |
0.72h: H.Buss 05.02.2009 |
- Algorithmen beschleunigt -> Floats durch Fixkomma ersetzt |
- Achsentkopplung weiter verbessert |
- Nick- und Roll im Octo-Mischer auf jeweils vier Motoren aufgeteilt |
0.72i: H.Buss 07.02.2009 |
- Abtastrate von 1kHz auf 2kHz erhöht |
0.72j: H.Buss 09.02.2009 |
- neue Implementierung der Servoausgänge |
0.72k: H.Buss 10.02.2009 |
- Abtastrate auf 5kHz erhöht |
0.72L: H.Buss 13.02.2009 |
- Signalfilterung überarbeitet |
- OCTO2 implementiert |
0.72M: H.Buss 13.02.2009 |
- Code Cleanup |
0.72o: H.Buss 24.02.2009 |
- Abtastrate auf 2kHz |
- HW-Version an Navi |
- neuer Datensatz 'c' -> Lagedaten für 3D-Grafik |
- Auswerteroutine für Spectrum-Satteliten implementiert |
- Kanalsettings werden beim Parameterreset nicht mehr gelöscht |
- die Driftkompensation wird jetzt feiner aufgelöst --> EE_Parameter.Driftkomp muss mal 8 genommen werden |
- die Integrale und ACC-Werte werden jetzt im Scope in ca. 0,1° angezeigt (wie beim NaviBrd) |
0.72p: H.Buss 01.03.2009 |
- Octo3 erstellt |
- Analogwerte umbenannt |
0.73a-d: H.Buss 05.04.2009 |
- MixerTabelle implementiert |
- I2C-Bus auf bis zu 12 Motoren erweitert |
- die Busfehler der BL-Regler werden im Menü angezeigt |
- Revision der MixerTabelle eingeführt |
- MixerTabelle wird bei Parameterreset neu initialisiert |
- Motortest auf [12] erweitert |
- Motorschalter nicht mehr 3-Stufig |
0.74a |
- Datenfusion im Flug auch, wenn ACC-Z < 512 |
- Wert für die Luftdruck-Messbereichserweiterung abgefangen |
0.74d |
- Die Driftkompensation ist jetzt dreistufig -> 0,5% pro sekunde zusätzlich eingeführts |
0.75a G.Stobrawa 22.5.2009 |
- Extern Control also received from NC via SPI |
0.75b H.Buss 27.05.2009 |
- Spektrum-Singale schalten den PPM-Eingang aus |
- max. 2 Sekunden nach dem Start auf die BL-Regler warten |
- Automatische Zellenerkennung, wenn Spannungswarnung < 5,0V |
- Bei automatischer Zellenerkennung piept es je nach Zellenzahl |
- EE_DATENREVISION auf 76 erhöht |
- Servo: |
- Roll-Servo für FC ME implementiert |
- Update-Cmd stoppt Servos |
- Servos werden erst nach dem ersten Kalibrieren aktiviert |
0.75c G.Stobrawa 25.7.2009 |
- Übertragung der Servo-Settings zur NC |
- RSSI wird an NC gesendet, derzeit wird der Wert nicht gesetzt |
- Bugfix Messbereichsumschaltung des Luftdrucksensors springt |
- Auflösung des Luftdrucks nun bis auf 1 cm (5mal feiner) zur genaueren Berechnung des D-Anteils |
- Unterstützung von Warnings-Bitmasks für die J16, J17-Outputs bei Unterspannung |
- Unterspannung für einzelne Zelle´n von 3.2V auf 3.3V angehoben (9.6V --> 9.9V für 3S) |
0.75d H.Buss 13.8.2009 |
- RC-Routine: Empfangsausfall soll sicherer erkannt werden |
- Zellenerkennung nun auch beim Speichern der Settings |
- Warnungs-Blinkmaske auch bei Empfangsausfall |
0.75e H.Buss 18.8.2009 |
- LED-Blinken kann an die Motoren gekoppelt werden |
- Feinabstimmung des Höhenreglers |
0.75f H.Buss 27.8.2009 |
- D-Anteil des Höhenreglers jetzt mit Quadratischer Komponente |
- Lagewinkel wirkt jetzt mit 1/Cos(x) mit in den Höhenregler |
- leichte Modifikation der RC-Empfangroutine |
0.75g H.Buss 31.08.2009 |
- die Akkuspannung geht jetzt antiproportional ins Gas ein |
0.75h H.Buss 3.09.2009 |
- im Höhenregler werden jetzt die Stellwerte begrenzt --> max +- 16% vom geschätzten Schwebegas |
0.75i H.Buss 7.09.2009 |
- GpsZ vom Navi zur FC für den Höhenregler |
- "hoovergas-Variation" als Parameter |
- Kompatibilität zu NC und PC erhöht |
0.75j H.Buss 17.09.2009 |
- Laufzeitzähler eingebaut |
0.75k H.Buss 22.09.2009 |
- zweite Variante (Gregor) der Höhenregelung implementiert |
- umschaltbare RC-Routine |
0.75L H.Buss 23.09.2009 |
- SollHoehe und Gas geht nun auch an die NC |
0.75M H.Buss 29.09.2009 |
- Spektrum-Timing wird nun überwacht |
- die FC kann nun stand-Alone als Kamera-Stabilizer eingesetzt werden, weil die Servos aktiviert werden, wenn I2C fehlt |
0.75N H.Buss 29.09.2009 |
- Hoover-Stickpunkt wird bei aktivem Höhenregler nicht nachgeführt |
- Hoover-Stickpunkt kann per Parameter fest eingestellt werden |
- Baro-Messbereichserweiterung auch bei aktiviertem Höhenregler |
- Gyro_Gier_P und Gyro_Gier_I eingeführt |
- I2C_fehler-Zähler jetzt in den Analogdaten |
0.75o H.Buss 01.10.2009 |
- der Höhenregler wird jetzt nur alle 10ms bearbeitet |
- Baro-Messbereichserweiterung auch bei Poti als Sollwert |
0.76d H.Buss 10.10.2009 |
- bei aktiver Messbereichserweiterung wird die aktuelle Höhe übernommen |
0.76e H.Buss 27.10.2009 |
- es werden beim Start einmal alle BL-Regler angesprochen, damit BL-Regler#8 auch einen Selbsttest macht |
- S3D-ACT-Summensignal als Compilerschalter |
0.76f H.Buss 05.11.2009 |
- untere Spannungsgrenze der Unterspannungswarnung (9,3V) entfernt |
0.76g H.Buss 10.11.2009 |
- Casting-Fehler in der Gas-Berechnung |
0.77a H.Buss 11.11.2009 |
- Erweiterung auf 12 Kanäle |
- Bei Koptertool-Kanalabfrage kein Empfangsausfall-Piepsen |
- serielle Kanalerweiterung eingebaut -> PPM_in auf 25 erweitert |
- Servos3-5 einstellbar |
- neues Kommando "f" -> schaltet auf anderen Parametersatz um |
0.77b H.Buss 09.12.2009 |
- JetiBox: Menü wird übertragen |
- neu: FCFlags |= FCFLAG_I2CERR; |
- LED-Warn-Blinken nun mit festem Timing und abschaltbar |
0.77c H.Buss 07.01.2010 |
- zwei weitere Spektrum-Varianten implementiert |
0.77d H.Buss 25.01.2010 |
- Strom-Messung eingebaut |
0.78a H.Buss 03.02.2010 |
- Bugfix: Settingsumschaltung im Flug |
0.78b H.Buss |
- veröffentlichte Version |
0.78c H.Buss + G.Stobrawa 22.2.2010 |
- Bewegungsbegrenzung an Servo 3 to 5 der FC 2.0 |
- Theoretischer Variablenüberlauf bei Vario-Höhenregler |
- Anzeige des "SPI RX communication error" wenn GPS Option nicht aktiv |
- LED-Schwellwerte fürs Blinken waren unterschiedlich |
0.78c H.Buss + G.Stobrawa 04.3.2010 |
- Code cosmetics |
0.78f H.Buss + I.Busker 23.3.2010 |
- Unterstützung für Jeti-Expander |
- Begrenzung des Vario-Höhenreglers auf ein 10m-Fenster um Überläufe zu verhindern |
- Einführung eines Vario-Zeichens (+/-/ ) auf der Jetibox |
- BL-Timeout beim Start erhöht |
0.80a-d H. Buss + G.Stobrawa 20.5.2010 - 22.7.2010 |
- Motoren Starten nicht ohne Kalibrierung |
- Unterstützung der BL2.0-Regler |
- statt 8 nun 10 Bit Auflösung der Lageregekung |
- Unterstützung der BL2.0-Regler Konfiguration via MK-Tool |
- Parametersätze werden per I2C an die BL-Regler durchgereicht |
- "Care-Free" implementiert |
- Freie Belegung der "Vorne"-Richtung |
- nur wenn Motoren laufen: Beepen, wenn Carefree ohne Navi oder ohne gültigen MK3Mag-Wert |
- nur wenn Motoren laufen: Beepen wenn NC plötzlich ausfällt |
- #define RECEIVER_SPEKTRUM_EXP eingeführt |
- #define SWITCH_LEARNS_CAREFREE eingeführt |
- Schwerpunktanzeige in den 3D-Daten |
- Checksummen gesicherte Datenablage im EEProm |
- Fehlerdiagnose implementiert (Wiki: ErrorCodes) |
- ErrorCode aufs Jeti-Display |
- JetiMenü: bis acht Temperaturen der BL-Regler |
- GPSInfo.Speed im Jeti-Display |
- Compass-Richtung nun im Jeti-menü |
- diverse Änderungen im Höhenregler |
- P wirkt schwächer |
- D wirkt stärker |
- Anpassung der Höhenregelung auf Level des Hoovergases |
- AccZ schneller nachführen |
Parameter modifiziert: |
- EEPROM-Kompatibilität auf 84 -> Parameter werden resettet |
- EE_Parameter.Hoehe_ACC_Wirkung = 0; // war 30 |
- EE_Parameter.Hoehe_HoverBand = 8; // war 5 |
- Notgas = 45 |
- NotgasZeit = 90 |
- Beginnersetting: EE_Parameter.DynamicStability = 70; |
- Neu: GyroStability = 6 |
- GPS-Login-Time auf 2 reduziert |
0.80e H.Buss 02.08.2010 |
- MK3Mag ohne NC ging nicht |
0.80f H.Buss 04.08.2010 |
- Beim Höhenregler "Deckel" wird das Gas wieder wie in der alten Version behandelt und der D-Anteil auf das alte Verhalten (um Faktor 8) reduziert |
0.80g H.Buss 11.08.2010 |
- erweitetern Messbereich für Luftdruck bei der FC2.1 aktiviert |
0.80h H.Buss 30.08.2010 |
- bei I2C-Fehlern wurden die Counter zurück gesetzt und für einige ms die Interrupts angehalten - das ist jetzt behoben |
- Nur I2C-Daten senden, wenn das alte Paket komplett raus ist |
0.82a H.Buss 08.11.2010 |
- MotorSafetySwitch - Verriegelt das Ein/Ausschalten |
- ServoManualControlSpeed - Verlangsamt das Cam-Servo |
- CamOrientation - für verdrehte Kamera-Servos |
- Position der Status-Bits verändert |
- "Zucken" der Servos bei kurzen Empfangsausfällen behoben |
- jeti update command 'j' added |
- Poti-Auswertung nach ParameterZuordnung() verschoben -> FC-Code schneller |
- Waypont-Events z.B. zum Triggern der Kamera |
- Gyro-Sytbility: Werte bis 16 möglich |
0.82b H.Buss 08.12.2010 |
- Unterstützung von 3,3V-Referenzspannung (nur ATMEGA128) |
0.84a H.Buss 21.03.2011 (Release: 30.03.2011) |
- nur starten, wenn NC_ErrorCode = 0 |
- Beeptime von NC auch beim Kalibrieren durchlassen |
- Varible "JetiBeep" eingeführt |
- Kompass-Winkelvorgabe von NaviControl -> POI |
- Piepen beim Umschalten von CareFree |
- Compass-Routinen überarbeitet |
- Dafaultvalues Servo-Min/MAx an MKDS18 angepasst |
- Defaultreceiver ist RECEIVER_JETI |
- GPS-Operation-Radius per default auf 245m bzw. 100% |
- Höhenvorgabe im Vario-Mode durch Waypoints |
- bei laufenden Motoren keine neuen Settings annehmen |
- immer einmal Carefree Beepen nach dem Kalibrieren |
- Kanaloffset für Potis von 110 auf 127 erhöht, damit es gleich ist mit allen anderen Kanälen |
- POI-Richtung (Soll-Himmelsrichtung) bezieht sich auf den Kamera-Winkel |
0.86a H.Buss 13.09.2011 |
- Variable "JetiBeep" wird gelöscht, wenn an den Empfänger gesendet wurde |
- wenn GPS deaktiviert ist, keinen Fehler bringen, wenn GPS fehlt. Auch dann nicht piepsen |
- GPS-Sollwertverschiebung |
- Empfangs-Piepen unterdrücken -> einstellbar |
- MotorSmooth einstellbar |
- Höhenregler: keine 'harte' IstWert-Übernahme bei Bewegen des Sticks in die Hoover-Position |
- Coming Home mit Höhenvorgabe |
- Coming Home als Failsafe |
- Einführung des GPS-Characters (- / W H D P) |
- Klartext bei den Jeti-Fehlermeldungen |
- Jeti-Beep "3*kurz" bei NC-Errors |
- Jeti-LCD-Aufruf nur noch alle 300ms, weil die Werte zu unruhig waren |
- Mixer-Settings werden nicht gelöscht, wenn sich die Parameter-Revision ändert |
- GPS-Angle limit von 100 auf 140 |
- GPS-I-Limit von 75 auf 85 |
- GAS-Offset von 120 auf 127 erhöht, damit es für alle Kanäle gleich ist |
- EE_Parameter.Hoehe_StickNeutralPoint auf Werte zwischen 80 und 180 begrenzt |
- PPM_Neutral eingeführt, um den Offset bei HoTT auszugleichen; |
- LED_Update() nun nur noch alle 20ms, weil die schnellste Ausgabe (bei Potivorgabe) ohnehin nur 40ms sind |
- Jeti & HoTT: Nur beim Fehler auch JetiBeep, wenn die Motoren laufen -> sonst nervt das bei der Fehlerbehebung (Compass-Kalibrieren usw.) |
- Error-Text auch im virtuellen Display des Koptertools |
- virtuelles LCD-Menü: |
- "ExternControl" aus Platzgründen aus dem virtuellen LCD-Menü entfernt. |
- keine BL-Temperaturen und I2C-Fehler anzeigen, wenn die BL-Regler nicht verwendet werden |
- nach dem Gieren nicht den Ersatzkompass auf den Kompasswert stellen, die Umschaltung war zu hart |
- ACC Correction eingeführt |
- I2C Fehler kamen nicht bei der NC an, weil die zu kurz waren - jetzt meldet die NC die Fehler mind. 8 Sekunden |
- Fehlermeldungen stehen jetzt mind. so lange an, bis sie an die Nc ge sendet wurden |
- neue Fehlermeldungen: |
"No NC communicat", // 9 |
"GPS Fix lost ", // 21 |
"Magnet Error ", // 22 |
"Motor restart ", // 23 |
"BL Limitation " // 24 |
- LED: Schaltfläche "nur bei Motor start" bei beiden getrennt |
- Ausbau der HoTT-Telemetrie |
- Variable "KompassRichtung" entfernt |
- ErsatzKompassInGrad sinvoll genutzt |
- HoTT-Update per Uart-Durchschleifen |
- AltitudeSetpointTrimming eingeführt |
- Vario-Anzeige für HoTT |
- Verhindern eines Überlaufs im Vario |
- echter Varioton auch ohne Vario-Höhenregler |
- Flugminuten laufen jetzt bei (FC_StatusFlags & FC_STATUS_FLY) los, weil sonst die Zeit zur NC verschieden war |
- KompassFusion wird jetzt getrennt von der NC berechnet |
- Sport-Setting entfernt und ein "Easy-Setting" eingeführt (leicht reduzierte Sticks); "Beginner" ist jetzt "Normal" |
- MagnetError kann man in der Startphase ignorieren |
- BL-Temperaturen, I2C-Fehler und BL-MaxPWM zum Loggen an NC |
- Einzelströme nun auch bei HoTT angezeigt |
0.86b H.Buss 20.09.2011 |
- Höhenbegrenzung bewirkt nur, dass im Vario-Mode der Sollwert nicht weiter nach oben geschoben werden kann |
- grüne LED ging aus - gefixt |
- K1-K8 wurden im LCD mit 0-7 bezeichnet |
0.86c H.Buss 22.09.2011 |
- Neue Anzeige: Magnetfeld und Inklination bei HoTT und Jeti |
- Neuer SPI-Block 'SPI_MISC' |
- Kompass-Fusions-Dämpfung bei Neigung leicht verringert |
- '.' im Vario-Höhenregler |
0.86d H.Buss 26.09.2011 |
- Analog.c: Vario Überlauf anders verhinden |
- Poti1-6 auch im HoTT-Display |
0.88 H.Buss 12.12.2011 - 26.03.2012 |
- Failsafe-Kanal |
- Failsafe: 5 Sekunden warten & Höhe ändern (macht die NC) |
- Option: Failsafe-Sinkflug xx% Schwebegas |
- Stopp der Motoren wenn bei Failsafe ein Motor blockiert |
- von 30 auf 60 Sekunden Failsafe-Zeit verlängert |
- Höhenwert auf cm kalibriert (zeigte ca. 10% zu viel an) |
- Neue Error-Codes: "No SD-Card", "Flying range!" und "Error SD-Logging" |
- Wenn die Motoren aus sind, den Luftduckwert langsam nachführen |
- das sbus-protokoll implementiert (nur FC2.1) |
- Schaltkanal auf Servo-Ausgang |
- Filter auf den Ausgängen der Servos |
- Option: Failsafe-Sinkflug xx% Schwebegas |
- "Max Altitude" als Parameter auf der SD-Karte im Navi -> Beeinflusst "Parameter_MaximumAltitude" (das niedrigste gilt) und es gibt eine Fehlermeldung "ERR:Max Altitude" |
- SPI-Protokoll: BL.Status eingefügt und Parameter.GlobalConfig & Parameter.ExtraConfig verschoben |
- Senden der Out1 & Out2-Zustände an die NC, damit es in der OSD-Darstellung angezeigt werden kann |
- Kompassrichtung neu merken, wenn CF geschaltet wird |
- "I" aus dem Hott-Menü entfernt und durch ":" ersetzt, weil das nur auf der mx-20 gut aussah |
- Höhenregler-Settings: GPS-Z von 64 auf 20 reduziert |
0.88M H.Buss 15.05.2012 |
- HoTT V4 |
- Kamera-Servo beim Kalibrieren weiter laufen lassen. |
- Error 30: no GPS fix bei Start |
- echter MotorSchalter |
0.88n H.Buss 06.07.2012 |
- Bugfix: Der letzte angesteuerte Servo-Puls war zu kurz |
0.90 H.Buss 04.03.2013 |
- Anzeige WP x/Y in der HoTT-Telemetrie |
- Schalter und WP-Event gleichzeitig |
- Photo-Auslösung als Entfernungsintervalle |
- Jeti + |
- Kamera-Neitung als Integral |
- RC-Lost am Startpunkt macht kein Failsafe, wenn GAS auf Null für 1,5sek war |
- Auswahl:Speak-All nun in der KopterTool-Config |
0.90e H.Buss 04.03.2013 |
- Parameter_ServoRollComp jetzt auf Poti /Kompatibilität auf 93 erhöht) |
0.90f (26.04.2013) |
- disable Yawing when Gas-Stick is to Zero |
- calibration must be within 20° Tilt angle |
- Hold I-Parts of the attitude control to zero when the MK is still on the ground |
- ACC-Altitude sensor data fusion implemented to the altitude controller (HW-Update from FC2.1 to 2.2 needed) |
- MK must be within 20° tilt angle when calibrating sensors |
- Parameter Reset, if the HW-Version changes (FC2.1 to 2.2) |
0.90g (29.04.2013) |
- No ACC-Z error if the MK is tilted after switching on |
- ATMEGA644 (until FC2.0): Sensitive RC-Signal validation removed -> that was only nessecary for old 35MHz receivers |
0.90h (14.05.2013) |
- Auto Start and landing for Waypoints |
- back to old eeprom-compatiblity to remain compatible to other Tools |
- HoTT-Bugfix: no speech while vario tone |
- Bugfix: Wrong error speech in JetiEX ("Error calibration") |
0.90j (27.05.2013) |
- Changes for better EEPROM-Safety |
- variable ActiveParamSet instead of the direct EEPROM-Reading (faster) |
- Checking the ACC-Z value in flight and report ACC-Z if out of range |
- disable Altitude hold in case of ACC-Z error |
2.00a (after public Beta test 0.91) |
- show SW-Version in Hot Display |
- GPS-Parameter changed (P = 90->100; I = 90->90; D = 90->120; A = 40) |
- Move NICK/Roll Sticks for switching on / off |
- Move the Stick > 100 instead > 75 for switch on / off |
- Failsafe active if ACC-Upgarde |
- AltitudeMode, GPS_Mode & Carefree_Mode are now direct channels instead of Poti-Values (NaviGpsModeChannel,CareFreeChannel,HoeheChannel) |
- NC-SPI communication from 25Hz to 41Hz |
- MotorTemperature and GPS-Mode-Switch more often to NC |
- Auto-Start/Landing |
- JetiEX: Name set to 'MK' |
- if(CareFree) Parameter_AchsKopplung1 += 30; removed |
- StickNeutral setting per default 127 |
- UART-Buffer increased from 175 to 220 Bytes |
- show name of active parameter set in the HoTT/Jeti display |
- fixed in 0.91L: if "ServoRelative" is used, it coud happen that the servo moves a wide range in the first second after the first calibration |
- Servo3-5 Limit to 24-255 |
- no. of channels increased from 12 to 16 |
// 0 -> frei bzw. ACT rssi (or zero if unsigned) |
// 1 - 16 -> 1-16 |
// 17 - 28 -> 12 Serial channels |
// 29 -> WP-Event kanal |
// 30 Fix -> -127 |
// 31 Fix -> 0 |
// 32 Fix -> 128 |
2.00b |
- default Camera-Position after calibration changed if Inverted |
- some changes in ACC-Altitude hold to reduce climbing in fast foreward fly |
- UserParameter1 > 100 disables camera nick control (for BL-Gimbals with self-alignments) |
- Beep at motor off (1sek) |
2.00d |
- Do not start if MK is moving |
- Full Range of altitude measure expansion (3000m flight instead of 950m) |
- compensation of the atmospheric altitude error |
- Measure the exact influence of the barometric range extender |
- Reduce Nick/Roll if Gas is Zero -> avoids MK to turn over during switch-off sequence |
- Tell NC to wait at the Waypoint until Out1 Pattern is over |
- virtual menu: single BL-Currents (FC2.1) |
- per default active: NO_GPSFIX_NO_START and CFG_NO_RCOFF_BEEPING |
- Servo-Nick-Refres reduced from 4 to 3 in default setting -> makes the camera servos faster |
- No undervoltage Beeping if the FC is only supplied by MKUSB (the Voltage measurement is zero) |
- Reset I2C-Error counter when calibrating the Sensors |
- HOTT & Jeti bugfix: The temperatures were sometimes wrong |
- HoTT: |
- GPS coordiante now in Degree + Minutes.Decimalminutes (like in original Graupner-Receivers) |
- added the MK Status in Transmitter Logfile -> General->Fuel |
- added the MK Speach in Transmitter Logfile -> General->Alt3Sek |
2.02a |
- code too big for MEGA644 -> only ATMEGA1284 supported |
- Jeti:GPS-Koordinate |
- Don't accept Reset-Command if Motor running |
- 'Idle' Bit in Output-Mask |
- Option: DisableServoNick |
- Bugfix Maximum Altitude -> New: SpeakHoTT Errormessage = "MaximumAltitude" and VarioCharacter goes to '=' |
- New Error code 32 "ERR:BL Selftest" |
- prepared for current measurements up to 75A per ESC |
- reduced speed of capacity-calculation() from 10ms to 50ms - that should be fast enough |
- Timing correction for NC-Data (41Hz) |
- Autolanding if undervoltage |
- Compass offset angle |
- 0.2V hysteresis in undervoltage warning |
- Fixed: Bug in LED-Output |
- Autolanding per default at 3,1V |
/branches/V2.02a_FirstTrial_Peter |
---|
Property changes: |
Added: tsvn:logminsize |
+8 |
\ No newline at end of property |