diff --git a/.gitignore b/.gitignore index 8df9393..8d68f1e 100644 --- a/.gitignore +++ b/.gitignore @@ -10,3 +10,10 @@ *.lai *.la *.a +.git +.pioenvs +.piolibdeps +.pio +.clang_complete +.gcc-flags.json +.DS_Store diff --git a/.pio/build/leonardo/.sconsign38.dblite b/.pio/build/leonardo/.sconsign38.dblite new file mode 100644 index 0000000..2754ca8 Binary files /dev/null and b/.pio/build/leonardo/.sconsign38.dblite differ diff --git a/.pio/build/leonardo/firmware.elf b/.pio/build/leonardo/firmware.elf new file mode 100755 index 0000000..2cc1390 Binary files /dev/null and b/.pio/build/leonardo/firmware.elf differ diff --git a/.pio/build/leonardo/firmware.hex b/.pio/build/leonardo/firmware.hex new file mode 100644 index 0000000..a53f8e3 --- /dev/null +++ b/.pio/build/leonardo/firmware.hex @@ -0,0 +1,798 @@ +:100000000C948E020C94B6020C94B6020C94B602B8 +:100010000C94B6020C94B6020C94B6020C94B60280 +:100020000C94B6020C94B6020C948D0B0C94FC0B41 +:100030000C94B6020C94B6020C94B6020C94B60260 +:100040000C94B6020C94B6020C94B6020C94B60250 +:100050000C94B6020C94B6020C94B6020C94430BAA +:100060000C94B6020C942E0E0C94B6020C94B602AC +:100070000C94B6020C94B6020C94B6020C94B60220 +:100080000C94B6020C94B6020C94B6020C94B60210 +:100090000C94280A0C94B6020C94B6020C94B60286 +:1000A0000C94B6020C94B6020C94B6020A55736511 +:1000B00020746865736520636F6D6D616E64733A5B +:1000C000202768656C7027202D2074686973207460 +:1000D0006578740A2772656C6179202327202D20AA +:1000E0007365742072656C61792023207365747563 +:1000F0007020666F722028312D34290A27736574A9 +:10010000203C444D58206368616E6E656C20233E30 +:10011000205B3C64656C617920696E203130733EF0 +:100120005D27202D206173736F6369617465207290 +:10013000656C61792077697468206368616E6E65AB +:100140006C0A2764656C203C444D58206368616EDE +:100150006E656C20233E27202D2064652D6173730E +:100160006F63696174652072656C61792077697469 +:1001700068206368616E6E656C200A276D696E2069 +:100180003C312E2E3235353E272073657420747233 +:100190006573686F6C642076616C756520666F723C +:1001A0002063757272656E742072656C61790A27BE +:1001B0007072696E7427202D207072696E742061D0 +:1001C00073736F63696174696F6E207461626C65CB +:1001D0000A277361766527202D2073617665206379 +:1001E000757272656E7420636F6E66696720696EE2 +:1001F000204E5652414D0A276C6F616427202D20F6 +:100200006C6F616420636F6E6669672066726F6DE4 +:10021000204E5652414D0A276B696C6C27202D20C9 +:1002200074657374207761746368646F670A276309 +:100230006C65617227202D20636C6561722061738B +:10024000736F63696174696F6E207461626C65209D +:10025000696E2052414D0A00696E76616C696420B6 +:1002600072656C6179230043757272656E742072D9 +:10027000656C61793A2000536574206D696E207653 +:10028000616C756520004E6F2043757272656E74E7 +:100290002072656C617920646566696E65642C20E6 +:1002A000757365202772656C61792720636F6D6DAA +:1002B000616E6400696E76616C69642076616C754C +:1002C00065004D696E696D616C2076616C75657352 +:1002D00020666F722072656C6179733A0044656CB8 +:1002E0006179206D75737420626520696E20302EEF +:1002F0002E3134203130732072616E676500444DB9 +:1003000058204368616E6E656C206D757374206251 +:100310006520696E20312E2E3531322072616E6774 +:10032000650075736167653A202761646420234422 +:100330004D586368616E6E656C205B64656C6179B5 +:100340005F696E5F31307365635D004E6F2043758A +:100350007272656E742072656C617920646566697D +:100360006E65642C20757365202772656C61792732 +:1003700020636F6D6D616E640075736167653A200F +:100380002764656C2023444D586368616E6E656C0C +:1003900000444D58204368616E6E656C206D757326 +:1003A0007420626520696E20312E2E353132207224 +:1003B000616E6765004E6F2043757272656E7420C2 +:1003C00072656C617920646566696E65642C207560 +:1003D0007365202772656C61792720636F6D6D618D +:1003E0006E64003E3E2000080B000202020000097D +:1003F0000400000102020000052400100105240190 +:1004000001010424020605240600010705810310EA +:10041000004009040100020A000000070502024032 +:1004200000000705830240000004030904120100D4 +:1004300002EF020140412336800001010203014125 +:10044000726475696E6F204C4C430041726475692B +:100450006E6F204C656F6E6172646F004D696E69DE +:100460006D616C2076616C75657320666F722072A9 +:10047000656C6179733A00496E76616C69642063DA +:100480006F6D6D616E6400070605040100080A0BBC +:100490000C0D0900000000240027002A002D003068 +:1004A0000000000000250028002B002E0031000075 +:1004B0000000002300260029002C002F0004040463 +:1004C00004040304050202020204030202020206FB +:1004D00006060606060404020202040404080201D9 +:1004E000104080401020408040800802040180407D +:1004F0002010020110801020404020000000020067 +:10050000090F0000030401000C00000000000000BF +:10051000000000000000000000009B1011241FBE1E +:10052000CFEFDAE0DEBFCDBF12E0A0E0B1E0E0E95E +:10053000F0E302C005900D92AE33B107D9F725E084 +:10054000AEE3B2E001C01D92AC39B207E1F712E0B0 +:10055000CEE8D2E004C02197FE010E943018CD38C9 +:10056000D107C9F70E94C2100C9446180C940000E1 +:10057000FC0180913803882311F13FB7F89482E0A1 +:100580008093E9002091F200822F90E0181619065E +:1005900014F481E090E0882339F0289844E64093F1 +:1005A00037034091F1004083222339F02091F2007B +:1005B000211103C02BE62093E8003FBF08958FEF81 +:1005C0009FEF08952FB7F89483E08093E90090910E +:1005D000E800892F807295FF04C09091F20080E4BA +:1005E000891B2FBF08952091ED02260F3327331F5B +:1005F00021323105ECF420911103FC0190E080E000 +:10060000243069F082E00895A091ED022191AC01BF +:1006100043535D4FA40FB52FB11D2C930196861740 +:1006200098F38091ED02680F6093ED0280E00895E9 +:1006300081E0089508958FEF9FEF08958FEF9FEF6A +:1006400008958091C60290E0919581959109089551 +:10065000CF93DF93CB01EA01642F0E94F302CE0116 +:10066000DF91CF910895CF93DF931F92CDB7DEB77F +:10067000698361E0CE0101960E94F30281E090E07F +:100680000F90DF91CF9108958091BE0281110DC02E +:1006900082E08093BA0284E08093BB021092BD0294 +:1006A0001092BC0281E08093BE028AEB92E0089532 +:1006B00081508F3008F047C0E82FF0E0EE59FC4F32 +:1006C0000C9430187F038303710377037B03A30328 +:1006D000A303A30386038C03900394039A03A30349 +:1006E0009E03809180008F77809380000895809191 +:1006F00080008F7DF9CF80918000877FF5CF84B512 +:100700008F7784BD089584B58F7DFBCF8091900055 +:100710008F77809390000895809190008F7DF9CF1E +:1007200080919000877FF5CF8091C0008F77809374 +:10073000C00008958091C0008F7DF9CF8091C200E4 +:10074000877F8093C2000895CF93DF93282F30E0F6 +:10075000F901E550FB4F8491F901E452FB4FD4912C +:10076000F901E354FB4FC491CC23A1F081110E9405 +:100770005803EC2FF0E0EE0FFF1FE155FB4FA59162 +:10078000B491EC91ED2381E090E009F480E0DF91F9 +:10079000CF91089580E090E0FACF1F93CF93DF933D +:1007A000282F30E0F901E550FB4F8491F901E45224 +:1007B000FB4FD491F901E354FB4FC491CC23A9F032 +:1007C000162F81110E945803EC2FF0E0EE0FFF1F4F +:1007D000EF55FB4FA591B4918FB7F894EC9111119F +:1007E00008C0D095DE23DC938FBFDF91CF911F919E +:1007F0000895DE2BF8CFCF93DF9390E0FC01E45215 +:10080000FB4F249183549B4FFC0184918823D1F0AA +:1008100090E0880F991FFC01ED56FB4FA591B49114 +:10082000FC01EF55FB4FC591D49161110EC09FB7EC +:10083000F8948C91E22FE0958E238C932881E2230B +:10084000E8839FBFDF91CF9108958FB7F894EC9123 +:10085000E22BEC938FBFF6CF8251E82FF0E0E957FF +:10086000FB4FE49190917B008E2F880F880F807250 +:100870009F7D892B80937B00E770E064E0937C0090 +:1008800080917A00806480937A0080917A0086FD5E +:10089000FCCF809178009091790008953FB7F8944B +:1008A0008091B6029091B702A091B802B091B902BE +:1008B00026B5A89B05C02F3F19F00196A11DB11DBB +:1008C0003FBFBA2FA92F982F8827BC01CD01620FF7 +:1008D000711D811D911D42E0660F771F881F991FB2 +:1008E0004A95D1F708958F929F92AF92BF92CF927F +:1008F000DF92EF92FF924B015C010E944E046B016C +:100900007C010E944E046C197D098E099F09683E86 +:10091000734081059105A8F321E0821A9108A1088E +:10092000B10888EEC80E83E0D81EE11CF11C8114CA +:100930009104A104B10429F7FF90EF90DF90CF90CC +:10094000BF90AF909F908F90089540914F0250912B +:10095000500220914D0230914E0242175307B4F4D9 +:100960009091E8009570E1F39091E80092FD19C034 +:100970008093F10080914F029091500201968F7305 +:100980009927892B19F48EEF8093E80080914F020C +:100990009091500201969093500280934F0281E013 +:1009A000089580E00895DF92EF92FF920F931F93D6 +:1009B000CF93DF93D82E8A01EB017B01E40EF51E65 +:1009C000CE15DF0559F0D7FE12C0FE0184910E94BA +:1009D000A50421968111F4CF0FEF1FEFC801DF911D +:1009E000CF911F910F91FF90EF90DF900895888134 +:1009F000EECF0F931F93CF93DF931F92CDB7DEB748 +:100A000082E0898342E450E067EE73E080E80E9470 +:100A1000D3040E944403DC0112960D911C91011530 +:100A2000110589F0D801ED91FC910280F381E02D50 +:100A3000BE016F5F7F4FC801099597FD04C0F801A3 +:100A400000851185ECCF89810F90DF91CF911F91A7 +:100A50000F910895615030F02091F100FC01208346 +:100A60000196F8CF289884E6809337030895DC0137 +:100A7000ED91FC910190F081E02D099490E080E0EF +:100A800008958F929F92AF92BF92CF92DF92EF9292 +:100A9000FF920F931F93CF93DF936C017B018A0129 +:100AA00080910B01882309F45CC08091380388236E +:100AB00009F457C08091530280FF05C08091E00087 +:100AC00082608093E000E801B12C8AEFA82E93E0C9 +:100AD000892E2AE3922E209711F4BB20D9F10E948F +:100AE000E20281110AC0AA94AA20D9F161E070E063 +:100AF00080E090E00E947304EECF8C171D0611F089 +:100B00000CF08C2F9FB7F8948092E9002091E800B8 +:100B100025FD02C09FBFDFCF282F30E0C21BD30BC3 +:100B2000F701815020F041914093F100FACFE20E9D +:100B3000F31EBB2021F09092E800B12CEBCF809106 +:100B4000E80085FDE7CF9092E800BB24B39420979E +:100B500009F3F3CF5D9884E68093520210161106D4 +:100B60003CF081E090E0F6019383828310E000E0A6 +:100B7000C801DF91CF911F910F91FF90EF90DF900F +:100B8000CF90BF90AF909F908F900895CF93DF93B9 +:100B90001F92CDB7DEB76983DC01ED91FC91028035 +:100BA000F381E02D41E050E0BE016F5F7F4F09957A +:100BB0000F90DF91CF9108950F931F93CF93DF9301 +:100BC0008C01D0E0C0E0F801EC0FFD1F64916623BA +:100BD00041F08AE395E00E94C605892B11F0219629 +:100BE000F2CFCE01DF91CF911F910F91089583E055 +:100BF0008093E9008091F200882319F08AE38093C2 +:100C0000E80008950E94E20290E00895CF93DF93F8 +:100C10001F92CDB7DEB7FC018485958597FD08C08E +:100C20002FEF3FEF358724870F90DF91CF91089505 +:100C3000CE0101960E94B802019719F4898190E0D3 +:100C4000F3CF8FEF9FEFF0CF0F931F93CF93DF93EF +:100C50001F92CDB7DEB78C01FC018485958597FF87 +:100C60000BC0CE0101960E94B802019771F48981F0 +:100C700090E0F80195878487F801848595850F9029 +:100C8000DF91CF911F910F9108958FEF9FEFF1CFDB +:100C9000FC018485958597FD0BC09FB7F89482E091 +:100CA0008093E9008091F2009FBF90E00196089543 +:100CB0009FB7F89482E08093E9008091F2009FBF93 +:100CC00090E008950F931F93CF93DF9309E313E010 +:100CD000D0E0C0E0CE010E94F817F80181938F01A7 +:100CE0002196C130F2E0DF07A9F789E393E0DF91B5 +:100CF000CF911F910F910895FF920F931F93CF9360 +:100D0000DF9309E313E0D0E0C0E0F801F1908F0138 +:100D1000CE010E94F817F81621F06F2DCE010E9427 +:100D200000182196C130F2E0DF0779F789E393E0FC +:100D3000DF91CF911F910F91FF9008951F93CF9353 +:100D4000DF9385ED8093BC008091C9029091CA0227 +:100D5000A091CB02B091CC020796A11DB11D23E05A +:100D6000B695A795979587952A95D1F72091BC00C0 +:100D700024FD03C01092110352C04091C90250914A +:100D8000CA026091CB027091CC02452B462B472BB7 +:100D900069F30097A105B10541F025E32A95F1F724 +:100DA00000000197A109B109E1CF8091C802C1E01B +:100DB000C093C702882399F1D091B8001091BA006E +:100DC0008091BC008A7B8093BC0060E082E00E943E +:100DD000CD0360E083E00E94CD0310921103C09325 +:100DE00013031092120361E082E00E94CD0361E0E0 +:100DF00083E00E94CD038091B9008E7F8093B9007B +:100E00008091B9008D7F8093B90088E48093B80009 +:100E100085E48093BC001093BA00D093B800DF91B2 +:100E2000CF911F910895E9E3F3E081E092E0DF01C3 +:100E30009C011D9221503040E1F781E090E008953F +:100E4000FB0101900020E9F73197AF01461B570BDA +:100E5000DC01ED91FC910280F381E02D099469E3BE +:100E600071E08AE395E00E94200783EE93E00C9402 +:100E7000DC05CF93DF930E94DC05EC0169E371E0B0 +:100E80008AE395E00E9420078C0F9D1FDF91CF9190 +:100E900008958CEA90E00E94390781E090E008957F +:100EA000CF92DF92EF92FF921F93CF93DF936C016B +:100EB0007B01109140028BE493E0112391F082E2D8 +:100EC00093E022E0C216D10464F0FB018281938199 +:100ED0000E94A617EC0101978115924070F08EEFE9 +:100EE00092E00E94390790E080E0DF91CF911F915E +:100EF000FF90EF90DF90CF90089522E0C216D104CA +:100F000059F0F701848195810E94A6179C014097B2 +:100F10002CF08DED92E0E5CF2FE030E0C75CDC4FA8 +:100F200098819F70612F6150770BAB0161E070E099 +:100F300001C0660F4A95EAF7962B84E0220F331F13 +:100F40008A95E1F7922B988381E090E0CECFCF9302 +:100F5000DF93C0914002C11109C085EB93E00E946C +:100F6000390790E080E0DF91CF91089502971CF45B +:100F700089E793E0F4CFFB01828193810E94A61759 +:100F80009C01215031092115324018F081E993E08C +:100F9000E6CFFC01E75CFC4FC150DD0B21E030E007 +:100FA00001C0220FCA95EAF720958081282320836B +:100FB00081E090E0D8CF8F929F92AF92BF92EF9254 +:100FC000FF920F931F93CF93DF93CDB7DEB7A19717 +:100FD0000FB6F894DEBF0FBECDBF7C01FA01CB0186 +:100FE00019A2223008F42AE08E010F5D1F4F822ED5 +:100FF000912CB12CA12CBF01A50194010E940E18C7 +:10100000F901CA016A300CF5605DD8016E938D015B +:10101000232B242B252B79F790E080E0109721F0EB +:10102000BD01C7010E942007A1960FB6F894DEBF4C +:101030000FBECDBFDF91CF911F910F91FF90EF9029 +:10104000BF90AF909F908F900895695CDECFCF9254 +:10105000DF92EF92FF92CF93DF93AB01BC0177FF5A +:101060001DC06A017C016DE28AE395E00E943705AC +:10107000EC0144275527BA014C195D096E097F0917 +:101080002AE08AE395E00E94DB078C0F9D1FDF9129 +:10109000CF91FF90EF90DF90CF9008952AE08AE300 +:1010A00095E0DF91CF91FF90EF90DF90CF900C947F +:1010B000DB078F929F92AF92BF92CF92DF92EF9217 +:1010C000FF920F931F93CF93DF937C018B016C01F1 +:1010D00082E0C80ED11C4701E5E08E0E911CD0E0E5 +:1010E000C0E0F60141916F0150E070E060E02AE05D +:1010F000C8010E94DB075C016EE2C8010E9437054F +:101100008A0D9B1DC80FD91FC814D90451F7F701C8 +:10111000458150E070E060E02AE0C8010E94DB07F2 +:101120008C0F9D1FDF91CF911F910F91FF90EF903A +:10113000DF90CF90BF90AF909F908F900895CF9306 +:10114000DF93BC018AE395E00E942007EC0169E38C +:1011500071E08AE395E00E9420078C0F9D1FDF91CC +:10116000CF9108958CE391E00E949F080E947C0635 +:1011700081E090E008958FE491E00E949F080E9432 +:10118000620681E090E00895CF93DF93482F50E00E +:1011900070E060E02AE08AE395E00E94DB07EC0162 +:1011A00069E371E08AE395E00E9420078C0F9D1FA0 +:1011B000DF91CF910895029739F4FB0182819381E9 +:1011C0000E94A61780934002809140028150843093 +:1011D00038F088E592E00E94390790E080E00895B9 +:1011E00087E692E00E94DC05809140020E94C408DC +:1011F00081E090E00895CF93C1E068EE73E080E075 +:1012000090E00E9473048C2F0E94C408CF5FC43109 +:10121000A1F781E090E0CF9108954F925F926F9295 +:101220007F92AF92BF92CF92DF92EF92FF920F9395 +:101230001F93CF93DF93C12CD12C7601C39401E08F +:1012400010E063E671E08AE395E00E942007C701A1 +:10125000B6010E94270869E371E08AE395E00E94E5 +:101260002007C6010197580102C0AA0CBB1C8A9531 +:10127000E2F7C9E3D3E0412C512C32014394898138 +:1012800090E08A219B21892BD9F0C301B2010E94F1 +:10129000270868E671E08AE395E00E9420076981EB +:1012A00070E084E0759567958A95E1F7072E000C4C +:1012B000880B990B0E9427088AE691E00E949F08FC +:1012C00021968FEF481A580A680A780A81E0481672 +:1012D00082E058066104710491F68FEFC81AD80AAB +:1012E000E80AF80A85E0C816D104E104F10409F01F +:1012F000A8CF81E090E0DF91CF911F910F91FF90F7 +:10130000EF90DF90CF90BF90AF907F906F905F9005 +:101310004F9008950F931F93CF9382309105A4F4BB +:1013200082EC92E00E94390710E000E0F801E95AEF +:10133000FD4F80810E94C4080F5F1F4F04301105CC +:10134000A9F790E080E03FC0C1E0029751F4FB01B3 +:10135000828193810E94A617C82F84EB92E0CC2350 +:1013600031F000914002011105C086E892E00E9430 +:101370003907E7CF10E0F801EA5AFD4FC0830F5F4D +:101380001D4FC8010E94F817C81721F06C2FC80123 +:101390000E94001887E792E00E94DC054C2F50E085 +:1013A00070E060E02AE08AE395E00E94DB076CE6EB +:1013B00071E08AE395E00E942007809140020E943C +:1013C000C40881E090E0CF911F910F910895CF92D2 +:1013D000DF92EF92FF920F931F93CF93DF936C01F5 +:1013E0008B0186E090E00E948116EC0190935E02F2 +:1013F00080935D02F60101900020E9F7CF018C197E +:101400009D090E9481167C01B6010E943F18F601D9 +:1014100001900020E9F73197EC19FD09EE0DFF1D51 +:101420001082F982E8821B830A8380915502909191 +:1014300056029D838C83D0935602C0935502DF9150 +:10144000CF911F910F91FF90EF90DF90CF90089573 +:101450001F920F920FB60F9211242F933F934F9329 +:101460005F936F937F938F939F93AF93BF93EF930C +:10147000FF938091B900887F803609F44AC0F0F567 +:10148000883209F4A5C018F5803109F499C0B8F480 +:10149000882309F4F5C0883009F492C0FF91EF91D8 +:1014A000BF91AF919F918F917F916F915F914F917C +:1014B0003F912F910F900FBE0F901F90189588317C +:1014C00009F486C0803251F78093100314C0803431 +:1014D00009F49BC040F48033B9F38833F9F6809364 +:1014E000100385ECAEC0803509F483C0883509F45B +:1014F00094C0883499F60E949E06D0CF883909F4AA +:101500008AC038F5883729F050F4883611F08037D2 +:1015100029F683E08093110310920F0355C0883899 +:1015200009F479C0803919F0803809F0B7CF80917B +:101530000F03803208F06FC0E0910F0381E08E0F3F +:1015400080930F038091BB00F0E0E151FD4F808359 +:101550003BC0803B39F0D0F4803A09F477C0883A38 +:1015600009F09CCF84E0809311031092EE02109258 +:10157000ED02F0E0E0E009958091ED0281110FC0ED +:1015800081E08093ED021092CD0209C0803C09F405 +:10159000A8CF883C09F4A5CF883B09F07FCFE09124 +:1015A000EE0281E08E0F8093EE02F0E0E353FD4FF8 +:1015B00080818093BB009091EE028091ED0229C062 +:1015C000809136038093BB0085EC8093BC0066CF8E +:1015D0009091350380913403981758F5E0913503C5 +:1015E00081E08E0F80933503F0E0EC5EFC4F80814C +:1015F000E9CFE091350381E08E0F80933503809130 +:10160000BB00F0E0EC5EFC4F80839091350380914D +:1016100034039817C8F285E8D8CFE091350381E00C +:101620008E0F809335038091BB00F0E0EC5EFC4FA1 +:1016300080838091130381115ECF81E08093120338 +:1016400084EA8093BC001092110328CF85EC80932C +:10165000BC001092110380910F03803230F4E091AE +:101660000F03F0E0E151FD4F108260910F0370E035 +:101670008FEE92E0F0E0E0E0099510920F030ECFBC +:101680001092100338CF1F920F920FB60F921124B1 +:101690002F933F938F939F93AF93BF938091B20209 +:1016A0009091B302A091B402B091B5023091B10211 +:1016B00023E0230F2D3758F50196A11DB11D20936E +:1016C000B1028093B2029093B302A093B402B0939C +:1016D000B5028091B6029091B702A091B802B09184 +:1016E000B9020196A11DB11D8093B6029093B70275 +:1016F000A093B802B093B902BF91AF919F918F911F +:101700003F912F910F900FBE0F901F90189526E8D4 +:10171000230F0296A11DB11DD2CF1F920F920FB6BB +:101720000F9211248F939F938091E1009091E1009B +:10173000937F9093E10083FF0FC01092E90091E046 +:101740009093EB001092EC0092E39093ED001092D6 +:10175000380398E09093F00082FF22C093E09093CA +:10176000E9009091F200992319F09AE39093E80030 +:1017700090915202992341F090915202915090938E +:101780005202911101C05D9A90913703992341F063 +:1017900090913703915090933703911101C0289A8B +:1017A00084FF18C08091E2008E7E81608093E20009 +:1017B0008091E1008F7E8093E100809153028E7EC4 +:1017C0008061809353029F918F910F900FBE0F9075 +:1017D0001F90189580FFF7CF8091E2008E7E806188 +:1017E0008093E2008091E1008E7E8093E100809101 +:1017F00053028E7E8160E5CF1F920F920FB60F923B +:101800001124CF92DF92EF92FF920F931F932F93A9 +:101810003F934F935F936F937F938F939F93AF9378 +:10182000BF93EF93FF93CF93DF93CDB7DEB76C9762 +:10183000DEBFCDBF1092E9008091E80083FF25C094 +:1018400068E0CE0145960E942A0582EF8093E80069 +:101850008D8987FF39C09091E80090FFFCCF982FC9 +:10186000907609F034C19E894F89588D2F89F88C64 +:10187000911131C0803861F5809154028093F1005C +:101880001092F1008EEF8093E8006C960FB6F894FA +:10189000DEBF0FBECDBFDF91CF91FF91EF91BF9122 +:1018A000AF919F918F917F916F915F914F913F91F8 +:1018B0002F911F910F91FF90EF90DF90CF900F909D +:1018C0000FBE0F901F9018959EEF9093E800C7CF22 +:1018D0001092F100D5CF913059F48111D3CF41301E +:1018E000510581F6809154028D7F80935402CACFB6 +:1018F000933049F48111C6CF4130510519F68091DA +:1019000054028260F2CF953041F48091E80080FF6C +:10191000FCCF20682093E300B5CF963009F0A9C032 +:101920000B8D1C8D22E01092E90010925002109253 +:101930004F02F2122EC010924E0210924D020E94DF +:10194000F9041F8299E09983FA8291E09E8390EADC +:1019500098879AEF998720914F0230915002275F24 +:101960003F4F3C832B838D831092E90010925002ED +:1019700010924F0210934E0200934D0249E050E046 +:10198000BE016F5F7F4F80E00E94D3040E94F90484 +:1019900079CF10934E0200934D020E944403DC0164 +:1019A00012960D911C910115110509F451C1D80130 +:1019B000ED91FC910480F581E02DBE016B5E7F4FBF +:1019C000C8010995009709F03EC1F801008511850D +:1019D000EACFF3E0FF120EC08F89882309F440C0DC +:1019E000823061F440E860E18BE494E00E9468108A +:1019F000811148CF81E28093EB0047CF813029F4F9 +:101A000040E86BE08FE394E0F1CF833099F70E94D8 +:101A10004403DC011296ED90FC908E010F5F1F4F86 +:101A20006801E114F10479F0D701ED91FC91068091 +:101A3000F781E02DB801C7010995080F111DF701C5 +:101A4000E084F184EECFD8011C92F60101900020D1 +:101A5000E9F73197BF016C197D0940E0C601C6CF97 +:101A600069E274E0FB01449150E080E80E94D304F5 +:101A700009CF973009F4BECF983021F481E08093EC +:101A8000F10000CF993009F0FDCE837009F0B2CF9C +:101A9000E3E1F1E081E031E096E32191222371F06E +:101AA0008093E9003093EB00DF0111972C91209394 +:101AB000EC009093ED008F5F873079F78EE780938D +:101AC000EA001092EA008F8980933803DBCE8B8D79 +:101AD0009C8D1092E9001092500210924F02909348 +:101AE0004E0280934D02898D811192C08E899D890D +:101AF000913A49F4813209F07DCF47E050E064E04B +:101B000071E080E0B3CF913209F074CF833269F491 +:101B10008F89988DB0E0A0E080930001909301013F +:101B2000A0930201B0930301ADCE803269F480919D +:101B3000E80082FFFCCF67E084E091E00E942A0584 +:101B40008BEF8093E8009ECE823209F09BCE8F8986 +:101B500080930B01EEEFFFE7859194918B3F9C4DB5 +:101B600051F1E0E0F8E08091040190910501A0912D +:101B70000601B0910701803B9440A105B105F1F445 +:101B800080910B0180FD1AC0EE3F8AE0F80789F5CD +:101B900087E797E79183808380916000809351026B +:101BA00088E19BE00FB6F894A895809360000FBE83 +:101BB0009093600067CEEEEFFAE0D5CF80819181FF +:101BC0008737974709F05ECEA895809160008861BD +:101BD000809360008091510280936000EE3F2AE084 +:101BE000F20789F08091FE0A9091FF0A9183808329 +:101BF00049CE808191818737980751F29093FF0AEF +:101C00008093FE0AC5CF1092FF0A1092FE0A3ACEC8 +:101C10000E944403DC0112960D911C9101151105DF +:101C200009F4E8CED801ED91FC910190F081E02D0E +:101C3000BE016B5E7F4FC8010995811123CEF8016B +:101C400000851185EBCF181619060CF41BCED2CEE9 +:101C5000F1E0FF12BECE6DE274E004CF1F920F924E +:101C60000FB60F921124AF92BF92CF92DF92EF92F4 +:101C7000FF920F931F932F933F934F935F936F9315 +:101C80007F938F939F93AF93BF93EF93FF93CF93E4 +:101C9000DF9300D0CDB7DEB72091C8008091CE0091 +:101CA00090E09A83898323FF27C010924C02109200 +:101CB0004B028091C800877F8093C80000000F907E +:101CC0000F90DF91CF91FF91EF91BF91AF919F91D5 +:101CD0008F917F916F915F914F913F912F911F91C4 +:101CE0000F91FF90EF90DF90CF90BF90AF900F904B +:101CF0000FBE0F901F90189524FF0EC010924A023D +:101D00001092490281E090E090934C0280934B0244 +:101D10008091C8008F7ED0CF80914B0290914C0271 +:101D20008230910509F41AC1C8F4019739F6898106 +:101D30009A81892B09F58091AF029091B002892B8D +:101D400001F184E090E090934C0280934B0281E09B +:101D500090E090934A0280934902B0CF833091057E +:101D600009F410C1049709F0A9CF8091490290911C +:101D70004A028130924088F010924C0210924B023D +:101D80009DCF8091AD029091AE02019719F483E04E +:101D900090E0D9CF82E090E0D6CF61E087E00E946A +:101DA000CD0380919C02882309F469C089819A81BE +:101DB000892B09F45EC082E10E942C0410E1459752 +:101DC0000CF010E083E10E942C0445970CF41062A3 +:101DD00084E10E942C0445970CF4106485E10E9474 +:101DE0002C0445970CF41068E0914902F0914A02E6 +:101DF000E75CFC4F80818F70808388E00E94A403A1 +:101E0000892B51F4E0914902F0914A02E75CFC4FC2 +:101E100080818160812B80838CE00E94A403892BC8 +:101E200051F4E0914902F0914A02E75CFC4F808155 +:101E30008260812B808384E00E94A403892B51F46B +:101E4000E0914902F0914A02E75CFC4F8081846096 +:101E5000812B80838BE00E94A403892B51F4E091B5 +:101E60004902F0914A02E75CFC4F80818860182BA0 +:101E700010838091490290914A0201966ACFF12C19 +:101E8000E12C34E6B32EE0914902F0914A02E75C7E +:101E9000FC4F808190E00E2C02C0959587950A94A6 +:101EA000E2F780FF41C0E0914902F0914A02E75C0D +:101EB000FC4F008110E024E0159507952A95E1F785 +:101EC0000F30110521F400915B0210915C02F701C3 +:101ED000E95AFD4F208189819A812817190609F056 +:101EE00064F56701CC0CDD1CF601E75EFE4FA080B7 +:101EF00061E08A2D0E94FB0361E08A2D0E94CD03E0 +:101F000081E090E00115110529F0B09EC001B19E5D +:101F1000900D1124F601EF55FD4F208131812817D6 +:101F2000390710F4918380838FEFE81AF80A24E0D0 +:101F3000E216F10409F0A7CF9CCF012BA9F7F70116 +:101F4000EE0FFF1FE75EFE4F108161E0812F0E94C0 +:101F5000FB0360E0812F0E94CD03E6CF8091AD02AC +:101F60009091AE022091490230914A020197821766 +:101F7000930709F07ECF83E090E090934C0280932A +:101F80004B0277CF61E087E00E94CD0320914902A8 +:101F900030914A028091AD029091AE022817390724 +:101FA00039F489819A81909348028093470261CFE6 +:101FB0008091AD029091AE022091490230914A0287 +:101FC00001968217930739F489819A81909346028A +:101FD000809345024ECF8091AD029091AE02209148 +:101FE000490230914A0202968217930739F4898197 +:101FF0009A8190934402809343023BCF8091AD023B +:102000009091AE022091490230914A0203968217C4 +:10201000930709F053CE89819A819093420280936D +:10202000410281E090E090934A028093490210922D +:102030004C0210924B02809147029091480261E05D +:10204000892B91F18AE00E94FB0361E08AE00E9403 +:10205000CD03809145029091460261E0892B49F1C0 +:1020600089E00E94FB0361E089E00E94CD0380913A +:1020700043029091440261E0892B01F185E00E94C6 +:10208000FB0361E085E00E94CD03809141029091C5 +:10209000420261E0892BB9F086E00E94FB0361E017 +:1020A00086E00E94CD030ACE8AE00E94FB0360E036 +:1020B000CDCF89E00E94FB0360E0D6CF85E00E948F +:1020C000FB0360E0DFCF86E00E94FB0360E0E8CF27 +:1020D000EF92FF920F931F93CF93DF93F82E192F58 +:1020E000E62E042F81E0860F880F0E94A50483E06E +:1020F0000E94A504CF2DD12FEC0EFD2EF11CCE1584 +:10210000DF05B9F007FF13C0FE0184910E94A5040A +:10211000182F80E00E94A504812321968111EFCF22 +:10212000DF91CF911F910F91FF90EF9008958881DB +:10213000EDCF81E0F5CFEAE3F5E01382128288EE7D +:1021400093E0A0E0B0E084839583A683B78385E223 +:1021500091E0918380838FEF9FEF95878487EAE8F2 +:10216000F5E087E391E091838083128213821482E9 +:102170001582E0E9F5E09183808312821382148254 +:1021800015820895CF93DF93CDB7DEB7CE54D10932 +:102190000FB6F894DEBF0FBECDBF789484B58260D1 +:1021A00084BD84B5816084BD85B5826085BD85B5FB +:1021B000816085BD80916E00816080936E00109279 +:1021C00081008091810082608093810080918100F4 +:1021D0008160809381008091800081608093800085 +:1021E0008091910082608093910080919100816044 +:1021F0008093910080919000816080939000809105 +:10220000C10084608093C1008091C100826080938E +:10221000C1008091C10081608093C1008091C300A2 +:1022200081608093C3008091C00082608093C00071 +:102230008091C20081608093C20080917A008460A6 +:1022400080937A0080917A00826080937A008091F6 +:102250007A00816080937A0080917A008068809310 +:102260007A00109238031092540210925302809117 +:10227000D70081608093D70080EA8093D80089B529 +:10228000806189BD89B5826089BD09B400FEFDCF3A +:1022900061E070E080E090E00E9473048091D800DB +:1022A0008F7C80618093D8008091E000807F809354 +:1022B000E0008091E1008E7E8093E1008DE08093CC +:1022C000E200559A209A60E088E00E94FB0360E0FB +:1022D0008CE00E94FB0360E084E00E94FB0360E06E +:1022E0008BE00E94FB0360E082E10E94FB0360E060 +:1022F00083E10E94FB0360E084E10E94FB0360E055 +:1023000085E10E94FB0360E086E10E94FB0360E040 +:1023100087E10E94FB0361E082E00E94FB0361E031 +:1023200087E00E94FB0361E088E00E94CD0361E04A +:102330008CE00E94CD0361E084E00E94CD0361E067 +:102340008BE00E94CD0361E082E10E94CD0361E059 +:1023500083E10E94CD0361E084E10E94CD0361E04E +:1023600085E10E94CD0361E086E10E94CD0361E03A +:1023700087E10E94CD0388E00E94A4032F969FAFBF +:102380008EAF2F978CE00E94A4032D969FAF8EAF47 +:102390002D9784E00E94A4032B969FAF8EAF2B97BE +:1023A0008BE00E94A40329969FAF8EAF29972F96AA +:1023B0008EAD9FAD2F97019709F002C22F961FAEE9 +:1023C0001EAE2F972D968EAD9FAD2D97019709F0DC +:1023D000FEC12D961FAE1EAE2D972B968EAD9FADD6 +:1023E0002B97019709F0FAC12B961FAE1EAE2B97C3 +:1023F00029968EAD9FAD2997019709F0F6C12996D0 +:102400001FAE1EAE299782E10E942C0445970CF066 +:10241000F3C181E090E027969FAF8EAF279783E1CD +:102420000E942C0445970CF0ECC181E090E02596C9 +:102430009FAF8EAF259784E10E942C0445970CF046 +:10244000E5C181E090E023969FAF8EAF239785E1B1 +:102450000E942C0445970CF0DEC181E090E02196AB +:102460009FAF8EAF219786E10E942C0445970CF018 +:10247000D7C181E090E09EAF8DAF87E10E942C0430 +:1024800045970CF0D0C181E090E09093B00280932A +:10249000AF028DAD9EAD2196CEACDFAC21972396D9 +:1024A000EEACFFAC239725960EAD1FAD2597279672 +:1024B000AEADBFAD27972996EEADFFAD29972B9610 +:1024C0006EAD7FAD2B972D964EAD5FAD2D972F96B0 +:1024D0002EAD3FAD2F97880F991F8C0D9D1D880F36 +:1024E000991F8E0D9F1D880F991F800F911F880FB8 +:1024F000991F8A0F9B1F880F991F8E0F9F1F880F90 +:10250000991F860F971F880F991F840F951F880F9B +:10251000991F820F931F9093AE028093AD0280911A +:10252000AD029091AE028D3F914030F08DEF91E081 +:102530009093AE028093AD0278948FEF9FEF9093CB +:1025400047058093460568EE73E080E090E00E94C6 +:10255000730410929B0210925602109255026BED7A +:1025600078E081E891E00E94E70969E477E087E894 +:1025700091E00E94E70962EB78E08CE891E00E942C +:10258000E7096BEB78E081E991E00E94E7096DE0F3 +:1025900079E086E991E00E94E70960E577E08CE95F +:1025A00091E00E94E70967EA77E080EA91E00E9403 +:1025B000E70963E177E084EA91E00E94E7096BEFC5 +:1025C00078E08AEA91E00E94E7096AE879E08FEA18 +:1025D00091E00E94E70910929C028091AF029091D5 +:1025E000B002892B09F42BC186E10E942C04459787 +:1025F0000CF01EC183EB91E00E949F0881E0809364 +:102600009C02E9E3F3E081E092E0DF019C011D928E +:1026100021503040E1F719E1E12E11E0F12E10E0F8 +:1026200000E0D701DC90B2E0EB0EF11C61E08D2DF3 +:102630000E94FB0360E08D2D0E94CD03F801EE0F98 +:10264000FF1FEF55FD4F118210820F5F1F4F0430A7 +:10265000110539F721968EAD9FAD21972396EEACEB +:10266000FFAC239725960EAD1FAD25972796AEADEF +:10267000BFAD27972996EEADFFAD29972B966EAD8E +:102680007FAD2B972D964EAD5FAD2D972F962EAD2E +:102690003FAD2F97880F991F8E0D9F1D880F991F93 +:1026A000800F911F880F991F8A0F9B1F880F991FFA +:1026B0008E0F9F1F880F991F860F971F880F991FD6 +:1026C000840F951F880F991F820F931F90935C02B0 +:1026D00080935B0282E092E00E94F8178093570299 +:1026E00083E092E00E94F8178093580284E092E021 +:1026F0000E94F8178093590285E092E00E94F81733 +:1027000080935A028CE594E00E94390710E000E0C3 +:10271000FF24F394F801E95AFD4F8081811101C033 +:10272000F08280810E94C4080F5F1F4F04301105A2 +:1027300089F760E082E00E94CD038091AD02909124 +:10274000AE02892B31F48091AF029091B002892BB7 +:1027500079F083E08093CC001092CD001092CE00EF +:102760001092C80080E98093C9008EE08093CA006F +:1027700000E010E0FF24F3948AE395E00E9448060D +:10278000892B09F4E5C08AE395E00E940606E82E4D +:10279000EAE08E1709F46BC0FDE08F1709F467C0FB +:1027A00028E08213C2C068E08AE395E00E94370502 +:1027B00080919B02882301F3815080939B02DCCFA0 +:1027C00081E090E02F969FAF8EAF2F97FBCD81E0F9 +:1027D00090E02D969FAF8EAF2D97FFCD81E090E0DA +:1027E0002B969FAF8EAF2B9703CE81E090E029967A +:1027F0009FAF8EAF299707CE27961FAE1EAE2797A5 +:102800000ECE25961FAE1EAE259715CE23961FAE73 +:102810001EAE23971CCE21961FAE1EAE219723CE4F +:102820001EAE1DAE2ACE1092B0021092AF0231CE73 +:102830008FE491E00E949F080E946206ECCE6BED4F +:1028400071E08AE395E00E9420074091AD0250912B +:10285000AE0270E060E02AE08AE395E00E94DB07C8 +:1028600069E371E08AE395E00E94200733CFE091AD +:102870009B02F0E0E15AFD4F108269E371E08AE3C8 +:1028800095E00E94200780915F02882309F441C0EF +:1028900069EE71E08FE592E00E94C4179A83898304 +:1028A0005E0133E0A30EB11CCC24C394D12CEC2CDC +:1028B0009D2C69EE71E090E080E00E94C417D50184 +:1028C0008D939D935D01BEE1CB16D10429F0EFEF0E +:1028D000CE1ADE0A892B59F7C0905D02D0905E02B5 +:1028E000A980BA80C114D104D9F0D6016D917C9130 +:1028F000C5010E943618892B79F4D6011296ED9104 +:10290000FC91BE016F5F7F4F8E2D992D09950E941E +:102910002F0710929B0230CFF601C480D580E2CF02 +:1029200087E794E00E943907F2CF682F8AE395E0A9 +:102930000E943705E0919B02EB3308F01DCF81E048 +:102940008E0F80939B02F0E0E15AFD4FE08214CF9E +:102950008091AF029091B002892B09F480C08FB7AB +:10296000F8948090B2029090B302A090B402B0901C +:10297000B5028FBF4091A9025091AA026091AB02AB +:102980007091AC022A013B01F0E14F0EF7E25F1EAD +:10299000611C711C81E090E0A0E0B0E02FEF4216D6 +:1029A00052066206720618F480E090E0DC01840DA5 +:1029B000951DA61DB71D88159905AA05BB0508F02C +:1029C000F2C084169506A606B70608F058C16BEE4D +:1029D00071E08AE395E00E942007D12CC12CF6011A +:1029E000EE0FFF1FEF55FD4F4081518170E060E019 +:1029F0002AE08AE395E00E94DB0769EE71E08AE352 +:102A000095E00E9420073FEFC31AD30A84E0C8165E +:102A1000D10429F78DEE91E00E949F082FB7F8941A +:102A20008091B2029091B302A091B402B091B5022C +:102A30002FBF8093A9029093AA02A093AB02B093F8 +:102A4000AC02BCC0875E9E4FDC01EC9061E08E2D35 +:102A50000E94FB0360E08E2D0E94CD0333C1809164 +:102A6000AD029091AE02892B09F002C183E392E09E +:102A70000E949F0861E08AE00E94FB0361E08AE017 +:102A80000E94CD0361E089E00E94FB0360E089E0E1 +:102A90000E94CD0361E085E00E94FB0360E085E0D9 +:102AA0000E94CD0361E086E00E94FB0360E086E0C7 +:102AB0000E94CD0368EE73E080E090E00E94730412 +:102AC00061E08AE00E94FB0360E08AE00E94CD039F +:102AD00061E089E00E94FB0361E089E00E94CD0390 +:102AE00061E085E00E94FB0360E085E00E94CD0389 +:102AF00061E086E00E94FB0360E086E00E94CD0377 +:102B000068EE73E080E090E00E94730461E08AE088 +:102B10000E94FB0360E08AE00E94CD0361E089E04F +:102B20000E94FB0360E089E00E94CD0361E085E044 +:102B30000E94FB0361E085E00E94CD0361E086E036 +:102B40000E94FB0360E086E00E94CD0368EE73E024 +:102B500080E090E00E94730461E08AE00E94FB0341 +:102B600060E08AE00E94CD0361E089E00E94FB03FF +:102B700060E089E00E94CD0361E085E00E94FB03F4 +:102B800060E085E00E94CD0361E086E00E94FB03E7 +:102B900061E086E00E94CD0368EE73E080E090E0A3 +:102BA0000E94730463CF481759076A077B0730F404 +:102BB00084169506A606B70608F409CF8FB7F894D1 +:102BC0008090B2029090B302A090B402B090B5028F +:102BD0008FBF40919D0250919E0260919F02709123 +:102BE000A0022A013B01A4E64A0E511C611C711C83 +:102BF00081E090E0A0E0B0E0EFEF4E165E066E06DA +:102C00007E0618F480E090E0DC01840D951DA61D81 +:102C1000B71D88159905AA05BB05C0F5841695064C +:102C2000A606B706E8F1481759076A077B07C0F1FF +:102C300080919C0281110BC086E10E942C04459773 +:102C400034F48FEE91E00E949F08F0929C028091F4 +:102C50009C02882369F086E10E942C04459744F089 +:102C600086E092E00E949F080E947C0610929C02DF +:102C70000115110509F480CD0E9400007DCD481793 +:102C800059076A077B0708F4A2CE98CF481759075F +:102C90006A077B0768F684169506A606B70640F60F +:102CA000D12CC12CC601880F991FFC01EF55FD4F97 +:102CB00020813181232B09F4C5CE80819181019738 +:102CC00091838083BFEFCB1ADB0AE4E0CE16D104F8 +:102CD00049F72FB7F8948091B2029091B302A09176 +:102CE000B402B091B5022FBF80939D0290939E02D3 +:102CF000A0939F02B093A00260E087E00E94CD0302 +:102D000097CF0F931F93CF93DF938230910510F4E9 +:102D100082E090E0E0919A05F0919B0530E020E0A0 +:102D2000B0E0A0E0309799F42115310509F44AC0CC +:102D3000281B390B24303105D8F58A819B81611518 +:102D4000710589F1FB0193838283FE0111C04081EB +:102D500051810281138148175907E0F0481759073C +:102D600099F4109761F012960C93129713961C9396 +:102D70003296CF01DF91CF911F910F91089500936B +:102D80009A0510939B05F4CF2115310551F0421798 +:102D9000530738F0A901DB019A01BD01DF01F801F9 +:102DA000C1CFEF01F9CF90939B0580939A05CDCFCA +:102DB000FE01E20FF31F8193919322503109398371 +:102DC0002883D7CF2091980530919905232B41F482 +:102DD00020910E0130910F013093990520939805B1 +:102DE00020910C0130910D012115310541F42DB7D1 +:102DF0003EB74091100150911101241B350BE09119 +:102E00009805F0919905E217F307A0F42E1B3F0BEC +:102E10002817390778F0AC014E5F5F4F241735074C +:102E200048F04E0F5F1F509399054093980581938A +:102E300091939FCFF0E0E0E09CCFCF93DF9300979A +:102E4000E9F0FC01329713821282A0919A05B091A9 +:102E50009B05ED0130E020E01097A1F42081318145 +:102E6000820F931F209198053091990528173907F3 +:102E700009F061C0F0939905E0939805DF91CF9137 +:102E80000895EA01CE17DF07E8F54A815B819E01CC +:102E900041155105B1F7E901FB83EA834991599145 +:102EA000C40FD51FEC17FD0761F480819181029654 +:102EB000840F951FE90199838883828193819B8385 +:102EC0008A83F0E0E0E012968D919C911397009731 +:102ED000B9F52D913C911197CD010296820F931F68 +:102EE00020919805309199052817390739F63097C0 +:102EF00051F510929B0510929A05B0939905A093F5 +:102F00009805BCCFD383C28340815181840F951F24 +:102F1000C817D90761F44E5F5F4F88819981480FC8 +:102F2000591F518340838A819B819383828321151A +:102F3000310509F0B0CFF0939B05E0939A059ECF41 +:102F4000FD01DC01C0CF13821282D7CFFC0188279C +:102F50009927E89421912032E9F3293010F02E309E +:102F6000C8F32B3241F02D3239F4689404C00E942A +:102F7000F017820F911D219120532A30C0F31EF4C7 +:102F8000909581959F4F089546E955E00E94C91795 +:102F90000895FA01A191B081009719F41097E1F01A +:102FA000CD01DC01CD010D90002011F4C00113C052 +:102FB000FB012191222319F02015D9F7F3CFFB0152 +:102FC0002191201519F41E92119606C02223C1F7F3 +:102FD0000D900020A1F7D001FA01A193B0830895CC +:102FE0007AE0979F902D879F802D910D1124089551 +:102FF000F999FECF92BD81BDF89A992780B50895C1 +:10300000262FF999FECF1FBA92BD81BD20BD0FB604 +:10301000F894FA9AF99A0FBE01960895A1E21A2E31 +:10302000AA1BBB1BFD010DC0AA1FBB1FEE1FFF1F6C +:10303000A217B307E407F50720F0A21BB30BE40BBC +:10304000F50B661F771F881F991F1A9469F7609503 +:103050007095809590959B01AC01BD01CF010895BD +:10306000EE0FFF1F0590F491E02D0994FB01DC01A8 +:103070008D91019080190110D9F3990B0895FB01EE +:10308000DC0101900D920020E1F70895F894FFCF44 +:10309000FFFFFFFF00E100000000000000009C05B2 +:1030A000800000C180810000000A000900050006C0 +:1030B0000000000000C60541050206F705480606A7 +:1030C0000624060000000059080D0A0053617669C5 +:1030D0006E6720454550524F4D2064617461004C2D +:1030E0006F6164696E6720454550524F4D206461A1 +:1030F00074610052656C61793A003B0020666F7222 +:103100002063757272656E742072656C61793A2005 +:103110000072656C61790068656C7000736176653A +:10312000006C6F6164007072696E74007365740086 +:1031300064656C00636C656172006B696C6C006D3A +:10314000696E00456E746572696E67206C656172A8 +:103150006E696E67206D6F6465202620636C656103 +:10316000722073657474696E67730053746172744E +:1031700020416464726573733A20005B005D004512 +:103180006E746572696E67206C6561726E696E67D8 +:10319000206D6F6465004C656176696E67206C65B3 +:1031A00061726E696E67206D6F64652C2073617645 +:1031B000696E67206461746120746F2045455052C8 +:0E31C0004F4D0052656C61792044656D6F00C3 +:00000001FF diff --git a/.pio/build/leonardo/idedata.json b/.pio/build/leonardo/idedata.json new file mode 100644 index 0000000..2b62dd9 --- /dev/null +++ b/.pio/build/leonardo/idedata.json @@ -0,0 +1 @@ +{"env_name": "leonardo", "libsource_dirs": ["/Users/andrey/Documents/Arduino/DMXReceiver/lib", "/Users/andrey/Documents/Arduino/DMXReceiver/.pio/libdeps/leonardo", "/Users/andrey/.platformio/lib", "/Users/andrey/.platformio/packages/framework-arduino-avr/libraries"], "defines": ["PLATFORMIO=50202", "ARDUINO_AVR_LEONARDO", "F_CPU=16000000L", "ARDUINO_ARCH_AVR", "ARDUINO=10808", "USB_VID=0x2341", "USB_PID=0x8036", "USB_PRODUCT=\"Arduino Leonardo\"", "USB_MANUFACTURER=\"Arduino\"", "__AVR_ATmega32U4__"], "includes": {"build": ["/Users/andrey/Documents/Arduino/DMXReceiver/include", "/Users/andrey/Documents/Arduino/DMXReceiver/dmx_receiver_mos_relay_public", "/Users/andrey/Documents/Arduino/DMXReceiver/dmx_receiver_mos_relay_public", "/Users/andrey/.platformio/packages/framework-arduino-avr/libraries/EEPROM/src", "/Users/andrey/Documents/Arduino/DMXReceiver/lib/utils", "/Users/andrey/.platformio/packages/framework-arduino-avr/libraries/Wire/src", "/Users/andrey/Documents/Arduino/DMXReceiver/.pio/libdeps/leonardo/CmdArduino", "/Users/andrey/.platformio/packages/framework-arduino-avr/cores/arduino", "/Users/andrey/.platformio/packages/framework-arduino-avr/variants/leonardo"], "compatlib": ["/Users/andrey/Documents/Arduino/DMXReceiver/lib/utils", "/Users/andrey/Documents/Arduino/DMXReceiver/.pio/libdeps/leonardo/CmdArduino", "/Users/andrey/Documents/Arduino/DMXReceiver/.pio/libdeps/leonardo/CmdArduino", "/Users/andrey/.platformio/packages/framework-arduino-avr/libraries/EEPROM/src", "/Users/andrey/.platformio/packages/framework-arduino-avr/libraries/Wire/src", "/Users/andrey/.platformio/lib/Adafruit BusIO", "/Users/andrey/.platformio/lib/Adafruit GFX Library", "/Users/andrey/.platformio/lib/Adafruit ILI9341", "/Users/andrey/.platformio/lib/Adafruit STMPE610", "/Users/andrey/.platformio/lib/Adafruit TouchScreen", "/Users/andrey/.platformio/lib/ArduinoOTA_ID6178/src", "/Users/andrey/.platformio/lib/GUIslice/src", "/Users/andrey/.platformio/lib/ILI9341_t3", "/Users/andrey/.platformio/lib/ILI9341_t3_ID540", "/Users/andrey/.platformio/lib/XPT2046_Touchscreen", "/Users/andrey/.platformio/lib/XPT2046_Touchscreen_ID542", "/Users/andrey/.platformio/packages/framework-arduino-avr/libraries/HID/src", "/Users/andrey/.platformio/packages/framework-arduino-avr/libraries/SPI/src", "/Users/andrey/.platformio/packages/framework-arduino-avr/libraries/SoftwareSerial/src"], "toolchain": ["/Users/andrey/.platformio/packages/toolchain-atmelavr/lib/gcc/avr/7.3.0/include", "/Users/andrey/.platformio/packages/toolchain-atmelavr/lib/gcc/avr/7.3.0/include-fixed", "/Users/andrey/.platformio/packages/toolchain-atmelavr/avr/include"], "unity": ["/Users/andrey/.platformio/packages/tool-unity"]}, "cc_path": "/Users/andrey/.platformio/packages/toolchain-atmelavr/bin/avr-gcc", "cxx_path": "/Users/andrey/.platformio/packages/toolchain-atmelavr/bin/avr-g++", "gdb_path": "/Users/andrey/.platformio/packages/toolchain-atmelavr/bin/avr-gdb", "prog_path": "/Users/andrey/Documents/Arduino/DMXReceiver/.pio/build/leonardo/firmware.elf", "svd_path": null, "compiler_type": "gcc", "targets": [{"name": "size", "title": "Program Size", "description": "Calculate program size", "group": "Platform"}, {"name": "upload", "title": "Upload", "description": null, "group": "Platform"}, {"name": "uploadeep", "title": "Upload EEPROM", "description": null, "group": "Platform"}, {"name": "fuses", "title": "Set Fuses", "description": null, "group": "Platform"}, {"name": "bootloader", "title": "Burn Bootloader", "description": null, "group": "Platform"}, {"name": "compiledb", "title": "Compilation Database", "description": "Generate compilation database `compile_commands.json`", "group": "Advanced"}, {"name": "clean", "title": "Clean", "group": "General"}, {"name": "cleanall", "title": "Clean All", "group": "General", "description": "Clean a build environment and installed library dependencies"}], "extra": {"flash_images": []}, "cc_flags": "-std=gnu11 -fno-fat-lto-objects -Os -Wall -ffunction-sections -fdata-sections -flto -mmcu=atmega32u4", "cxx_flags": "-fno-exceptions -fno-threadsafe-statics -fpermissive -std=gnu++11 -Os -Wall -ffunction-sections -fdata-sections -flto -mmcu=atmega32u4"} \ No newline at end of file diff --git a/.pio/build/project.checksum b/.pio/build/project.checksum new file mode 100644 index 0000000..2525cab --- /dev/null +++ b/.pio/build/project.checksum @@ -0,0 +1 @@ +ec2a8e409fdc9562855d596d20e824c36c5e6517 \ No newline at end of file diff --git a/.pio/libdeps/leonardo/CmdArduino b/.pio/libdeps/leonardo/CmdArduino new file mode 160000 index 0000000..0c02589 --- /dev/null +++ b/.pio/libdeps/leonardo/CmdArduino @@ -0,0 +1 @@ +Subproject commit 0c02589991754ac7af1a2686ea834a57a179923f diff --git a/.vscode/c_cpp_properties.json b/.vscode/c_cpp_properties.json new file mode 100644 index 0000000..29f7125 --- /dev/null +++ b/.vscode/c_cpp_properties.json @@ -0,0 +1,88 @@ +// +// !!! WARNING !!! AUTO-GENERATED FILE! +// PLEASE DO NOT MODIFY IT AND USE "platformio.ini": +// https://docs.platformio.org/page/projectconf/section_env_build.html#build-flags +// +{ + "configurations": [ + { + "name": "PlatformIO", + "includePath": [ + "/Users/andrey/Documents/Arduino/DMXReceiver/include", + "/Users/andrey/Documents/Arduino/DMXReceiver/dmx_receiver_mos_relay_public", + "/Users/andrey/.platformio/packages/framework-arduino-avr/libraries/EEPROM/src", + "/Users/andrey/Documents/Arduino/DMXReceiver/lib/utils", + "/Users/andrey/.platformio/packages/framework-arduino-avr/libraries/Wire/src", + "/Users/andrey/Documents/Arduino/DMXReceiver/.pio/libdeps/leonardo/CmdArduino", + "/Users/andrey/.platformio/packages/framework-arduino-avr/cores/arduino", + "/Users/andrey/.platformio/packages/framework-arduino-avr/variants/leonardo", + "/Users/andrey/.platformio/lib/Adafruit BusIO", + "/Users/andrey/.platformio/lib/Adafruit GFX Library", + "/Users/andrey/.platformio/lib/Adafruit ILI9341", + "/Users/andrey/.platformio/lib/Adafruit STMPE610", + "/Users/andrey/.platformio/lib/Adafruit TouchScreen", + "/Users/andrey/.platformio/lib/ArduinoOTA_ID6178/src", + "/Users/andrey/.platformio/lib/GUIslice/src", + "/Users/andrey/.platformio/lib/ILI9341_t3", + "/Users/andrey/.platformio/lib/ILI9341_t3_ID540", + "/Users/andrey/.platformio/lib/XPT2046_Touchscreen", + "/Users/andrey/.platformio/lib/XPT2046_Touchscreen_ID542", + "/Users/andrey/.platformio/packages/framework-arduino-avr/libraries/HID/src", + "/Users/andrey/.platformio/packages/framework-arduino-avr/libraries/SPI/src", + "/Users/andrey/.platformio/packages/framework-arduino-avr/libraries/SoftwareSerial/src", + "/Users/andrey/.platformio/packages/tool-unity", + "" + ], + "browse": { + "limitSymbolsToIncludedHeaders": true, + "path": [ + "/Users/andrey/Documents/Arduino/DMXReceiver/include", + "/Users/andrey/Documents/Arduino/DMXReceiver/dmx_receiver_mos_relay_public", + "/Users/andrey/.platformio/packages/framework-arduino-avr/libraries/EEPROM/src", + "/Users/andrey/Documents/Arduino/DMXReceiver/lib/utils", + "/Users/andrey/.platformio/packages/framework-arduino-avr/libraries/Wire/src", + "/Users/andrey/Documents/Arduino/DMXReceiver/.pio/libdeps/leonardo/CmdArduino", + "/Users/andrey/.platformio/packages/framework-arduino-avr/cores/arduino", + "/Users/andrey/.platformio/packages/framework-arduino-avr/variants/leonardo", + "/Users/andrey/.platformio/lib/Adafruit BusIO", + "/Users/andrey/.platformio/lib/Adafruit GFX Library", + "/Users/andrey/.platformio/lib/Adafruit ILI9341", + "/Users/andrey/.platformio/lib/Adafruit STMPE610", + "/Users/andrey/.platformio/lib/Adafruit TouchScreen", + "/Users/andrey/.platformio/lib/ArduinoOTA_ID6178/src", + "/Users/andrey/.platformio/lib/GUIslice/src", + "/Users/andrey/.platformio/lib/ILI9341_t3", + "/Users/andrey/.platformio/lib/ILI9341_t3_ID540", + "/Users/andrey/.platformio/lib/XPT2046_Touchscreen", + "/Users/andrey/.platformio/lib/XPT2046_Touchscreen_ID542", + "/Users/andrey/.platformio/packages/framework-arduino-avr/libraries/HID/src", + "/Users/andrey/.platformio/packages/framework-arduino-avr/libraries/SPI/src", + "/Users/andrey/.platformio/packages/framework-arduino-avr/libraries/SoftwareSerial/src", + "/Users/andrey/.platformio/packages/tool-unity", + "" + ] + }, + "defines": [ + "PLATFORMIO=50202", + "ARDUINO_AVR_LEONARDO", + "F_CPU=16000000L", + "ARDUINO_ARCH_AVR", + "ARDUINO=10808", + "USB_VID=0x2341", + "USB_PID=0x8036", + "USB_PRODUCT=\"Arduino Leonardo\"", + "USB_MANUFACTURER=\"Arduino\"", + "__AVR_ATmega32U4__", + "" + ], + "cStandard": "c11", + "cppStandard": "c++11", + "compilerPath": "/Users/andrey/.platformio/packages/toolchain-atmelavr/bin/avr-gcc", + "compilerArgs": [ + "-mmcu=atmega32u4", + "" + ] + } + ], + "version": 4 +} diff --git a/.vscode/extensions.json b/.vscode/extensions.json new file mode 100644 index 0000000..0f0d740 --- /dev/null +++ b/.vscode/extensions.json @@ -0,0 +1,7 @@ +{ + // See http://go.microsoft.com/fwlink/?LinkId=827846 + // for the documentation about the extensions.json format + "recommendations": [ + "platformio.platformio-ide" + ] +} diff --git a/.vscode/launch.json b/.vscode/launch.json new file mode 100644 index 0000000..4ca3825 --- /dev/null +++ b/.vscode/launch.json @@ -0,0 +1,44 @@ +// AUTOMATICALLY GENERATED FILE. PLEASE DO NOT MODIFY IT MANUALLY +// +// PIO Unified Debugger +// +// Documentation: https://docs.platformio.org/page/plus/debugging.html +// Configuration: https://docs.platformio.org/page/projectconf/section_env_debug.html + +{ + "version": "0.2.0", + "configurations": [ + { + "type": "platformio-debug", + "request": "launch", + "name": "PIO Debug", + "executable": "/Users/andrey/Documents/Arduino/DMXReceiver/.pio/build/leonardo/firmware.elf", + "projectEnvName": "leonardo", + "toolchainBinDir": "/Users/andrey/.platformio/packages/toolchain-atmelavr/bin", + "internalConsoleOptions": "openOnSessionStart", + "preLaunchTask": { + "type": "PlatformIO", + "task": "Pre-Debug" + } + }, + { + "type": "platformio-debug", + "request": "launch", + "name": "PIO Debug (skip Pre-Debug)", + "executable": "/Users/andrey/Documents/Arduino/DMXReceiver/.pio/build/leonardo/firmware.elf", + "projectEnvName": "leonardo", + "toolchainBinDir": "/Users/andrey/.platformio/packages/toolchain-atmelavr/bin", + "internalConsoleOptions": "openOnSessionStart" + }, + { + "type": "platformio-debug", + "request": "launch", + "name": "PIO Debug (without uploading)", + "executable": "/Users/andrey/Documents/Arduino/DMXReceiver/.pio/build/leonardo/firmware.elf", + "projectEnvName": "leonardo", + "toolchainBinDir": "/Users/andrey/.platformio/packages/toolchain-atmelavr/bin", + "internalConsoleOptions": "openOnSessionStart", + "loadMode": "manual" + } + ] +} diff --git a/README.md b/README.md index 6050425..9cd3125 100644 --- a/README.md +++ b/README.md @@ -1,28 +1,67 @@ -DMXReceiver +# DMXReceiver Techinal Specifications -Nominal Input Voltage (DC) 9 to 24 Vdc +Nominal Input Voltage (DC) 9 to 24 Vdc (24V is to much for Relays board) Input Current 10 A Max Output Current 2.5A Max/Ch Number of DMX Channels 4 Addressing DMX Range 1 to 509 -Setting Address +# Advanced features - Smart mode (Activated by turning Switch#10 on): + +Guidance to use + +1. Turn Switch #10 on (SmartMode on now), Switch#5-#8 on (default delay), rest switches off and restart board +2. Put board in Learning mode by turning Switch #9 on +3. Turn off all DMX light +4. Turn on Switch#1 on and then use all lights, which you want to associate with Relay#1 +5. Turn off Switch#1 and all DMX lights +6. Repeat learning for channels 2-4 (with appropriate switches 2-4) +7. Turn off Switch#9 (Learning mode off, all changes will be written to EEPROM) +8. Ajust default delay by switches 1-8 and restart board (delay in tens of seconds. If 0: it will be no delay) + +* When Switch#9 off - Switches 1-8 will define delay, between all DMX channels, associated with Relay turned to off and Relay turned off (in 10th seconds) +* Relay turnes on immediatelly when at least, 1 associated DMX channel in use +* You can ajust individual delay for every channel at step 4, using switches 5-8 (in tens of seconds). Value 15 (on-on-on-on) is reserved for default delay (defined at step 8). + +[SmartMode designed to use togetger with LightHub Smarthome controller](https://github.com/anklimov/lighthub) +Recommeded for control AC power of LED transformers + +* in SmartMode possible to use CLI interface on USB Serial port to control association table, save it to NVRAM and load fron NVRAM (USE 9600,N,8,1 Serial line parameters) + +* Use these commands: 'help' - this text +* 'relay #' - set relay # setup for (1-4)\n +* 'set []' - associate relay with channel +* 'del ' - de-associate relay with channel +* 'print' - print association table +* 'save' - save current config in NVRAM +* 'load' - load config from NVRAM +* 'kill' - test watchdog (there are no WDT yet) +* 'clear' - clear association table in RAM +* 'reboot' - reboot controller (disabled now) + +* When Switch #10 turned off - the board will working as normal DMX relay + +* Setting Address + The DMX address is set using the first 9 switches of the DMX address switch. The address is set as a binary number (with switch 1 the LSB). As the unit is a 4 channel receiver, it will respond to data in the set address, and the following 3 addresses in the DMX data stream. -Using With DMX Input +* Using With DMX Input + In order to use the TinkerKit DMX to PWM Converter with a DMX feed, simply set the desired address and connect the DMX feed to the DMX input. Remember to terminate the DMX feed at the end of the chain with a 120Ω resistor between the DMX + and - lines. -Test Mode +* Test Mode + The TinkerKit set each individual output up to full brightness. This test mode is entered by setting the DMX address to 0 (all switches down). While in this mode, any incoming DMX data is ignored. Once the address is changed from 0, pressing the RESET button will return the device to normal operation. -The firmware allows you to use the DMX receiver module using a mosfet output or a relay one. +* The firmware allows you to use the DMX receiver module using a mosfet output or a relay one. The output mode can be selected changing the value of the define OUTPUT_MODE in this way: MOSFET for mosfet output RELAY for relay output. + diff --git a/compiled/firmware.hex b/compiled/firmware.hex new file mode 100644 index 0000000..51dd229 --- /dev/null +++ b/compiled/firmware.hex @@ -0,0 +1,809 @@ +:100000000C948E020C94B6020C94B6020C94B602B8 +:100010000C94B6020C94B6020C94B6020C94B60280 +:100020000C94B6020C94B6020C94DE0B0C944D0C9E +:100030000C94B6020C94B6020C94B6020C94B60260 +:100040000C94B6020C94B6020C94B6020C94B60250 +:100050000C94B6020C94B6020C94B6020C94940B59 +:100060000C94B6020C947F0E0C94B6020C94B6025B +:100070000C94B6020C94B6020C94B6020C94B60220 +:100080000C94B6020C94B6020C94B6020C94B60210 +:100090000C94790A0C94B6020C94B6020C94B60235 +:1000A0000C94B6020C94B6020C94B6020A55736511 +:1000B00020746865736520636F6D6D616E64733A5B +:1000C000202768656C7027202D2074686973207460 +:1000D0006578740A2772656C6179202327202D20AA +:1000E0007365742072656C61792023207365747563 +:1000F0007020666F722028312D34290A27736574A9 +:10010000203C444D58206368616E6E656C20233E30 +:10011000205B3C64656C617920696E203130733EF0 +:100120005D27202D206173736F6369617465207290 +:10013000656C61792077697468206368616E6E65AB +:100140006C0A2764656C203C444D58206368616EDE +:100150006E656C20233E27202D2064652D6173730E +:100160006F63696174652072656C61792077697469 +:1001700068206368616E6E656C200A276D696E2069 +:100180003C312E2E3235353E272073657420747233 +:100190006573686F6C642076616C756520666F723C +:1001A0002063757272656E742072656C61790A27BE +:1001B0007072696E7427202D207072696E742061D0 +:1001C00073736F63696174696F6E207461626C65CB +:1001D0000A277361766527202D2073617665206379 +:1001E000757272656E7420636F6E66696720696EE2 +:1001F000204E5652414D0A276C6F616427202D20F6 +:100200006C6F616420636F6E6669672066726F6DE4 +:10021000204E5652414D0A276B696C6C27202D20C9 +:1002200074657374207761746368646F670A276309 +:100230006C65617227202D20636C6561722061738B +:10024000736F63696174696F6E207461626C65209D +:10025000696E2052414D0A00696E76616C696420B6 +:1002600072656C6179230043757272656E742072D9 +:10027000656C61793A2000536574206D696E207653 +:10028000616C756520004E6F2043757272656E74E7 +:100290002072656C617920646566696E65642C20E6 +:1002A000757365202772656C61792720636F6D6DAA +:1002B000616E6400696E76616C69642076616C754C +:1002C00065004D696E696D616C2076616C75657352 +:1002D00020666F722072656C6179733A0044656CB8 +:1002E0006179206D75737420626520696E20302EEF +:1002F0002E3134203130732072616E676500444DB9 +:1003000058204368616E6E656C206D757374206251 +:100310006520696E20312E2E3531322072616E6774 +:10032000650075736167653A202761646420234422 +:100330004D586368616E6E656C205B64656C6179B5 +:100340005F696E5F31307365635D004E6F2043758A +:100350007272656E742072656C617920646566697D +:100360006E65642C20757365202772656C61792732 +:1003700020636F6D6D616E640075736167653A200F +:100380002764656C2023444D586368616E6E656C0C +:1003900000444D58204368616E6E656C206D757326 +:1003A0007420626520696E20312E2E353132207224 +:1003B000616E6765004E6F2043757272656E7420C2 +:1003C00072656C617920646566696E65642C207560 +:1003D0007365202772656C61792720636F6D6D618D +:1003E0006E64003E3E2000080B000202020000097D +:1003F0000400000102020000052400100105240190 +:1004000001010424020605240600010705810310EA +:10041000004009040100020A000000070502024032 +:1004200000000705830240000004030904120100D4 +:1004300002EF020140412336800001010203014125 +:10044000726475696E6F204C4C430041726475692B +:100450006E6F204C656F6E6172646F004D696E69DE +:100460006D616C2076616C75657320666F722072A9 +:10047000656C6179733A00496E76616C69642063DA +:100480006F6D6D616E6400070605040100080A0BBC +:100490000C0D0900000000240027002A002D003068 +:1004A0000000000000250028002B002E0031000075 +:1004B0000000002300260029002C002F0004040463 +:1004C00004040304050202020204030202020206FB +:1004D00006060606060404020202040404080201D9 +:1004E000104080401020408040800802040180407D +:1004F0002010020110801020404020000000020067 +:10050000090F0000030401000C00000000000000BF +:1005100000000000000000000000EC1011241FBECD +:10052000CFEFDAE0DEBFCDBF12E0A0E0B1E0EEE356 +:10053000F1E302C005900D92AE33B107D9F725E083 +:10054000AEE3B2E001C01D92AC39B207E1F712E0B0 +:10055000CEE8D2E004C02197FE010E948018CD3879 +:10056000D107C9F70E9413110C949D180C94000038 +:10057000FC0180913803882311F13FB7F89482E0A1 +:100580008093E9002091F200822F90E0181619065E +:1005900014F481E090E0882339F0289844E64093F1 +:1005A00037034091F1004083222339F02091F2007B +:1005B000211103C02BE62093E8003FBF08958FEF81 +:1005C0009FEF08952FB7F89483E08093E90090910E +:1005D000E800892F807295FF04C09091F20080E4BA +:1005E000891B2FBF08952091ED02260F3327331F5B +:1005F00021323105ECF420911103FC0190E080E000 +:10060000243069F082E00895A091ED022191AC01BF +:1006100043535D4FA40FB52FB11D2C930196861740 +:1006200098F38091ED02680F6093ED0280E00895E9 +:1006300081E0089508958FEF9FEF08958FEF9FEF6A +:1006400008958091C60290E0919581959109089551 +:10065000CF93DF93CB01EA01642F0E94F302CE0116 +:10066000DF91CF910895CF93DF931F92CDB7DEB77F +:10067000698361E0CE0101960E94F30281E090E07F +:100680000F90DF91CF9108958091BE0281110DC02E +:1006900082E08093BA0284E08093BB021092BD0294 +:1006A0001092BC0281E08093BE028AEB92E0089532 +:1006B00081508F3008F047C0E82FF0E0EE59FC4F32 +:1006C0000C9480187F038303710377037B03A303D8 +:1006D000A303A30386038C03900394039A03A30349 +:1006E0009E03809180008F77809380000895809191 +:1006F00080008F7DF9CF80918000877FF5CF84B512 +:100700008F7784BD089584B58F7DFBCF8091900055 +:100710008F77809390000895809190008F7DF9CF1E +:1007200080919000877FF5CF8091C0008F77809374 +:10073000C00008958091C0008F7DF9CF8091C200E4 +:10074000877F8093C2000895CF93DF93282F30E0F6 +:10075000F901E550FB4F8491F901E452FB4FD4912C +:10076000F901E354FB4FC491CC23A1F081110E9405 +:100770005803EC2FF0E0EE0FFF1FE155FB4FA59162 +:10078000B491EC91ED2381E090E009F480E0DF91F9 +:10079000CF91089580E090E0FACF1F93CF93DF933D +:1007A000282F30E0F901E550FB4F8491F901E45224 +:1007B000FB4FD491F901E354FB4FC491CC23A9F032 +:1007C000162F81110E945803EC2FF0E0EE0FFF1F4F +:1007D000EF55FB4FA591B4918FB7F894EC9111119F +:1007E00008C0D095DE23DC938FBFDF91CF911F919E +:1007F0000895DE2BF8CFCF93DF9390E0FC01E45215 +:10080000FB4F249183549B4FFC0184918823D1F0AA +:1008100090E0880F991FFC01ED56FB4FA591B49114 +:10082000FC01EF55FB4FC591D49161110EC09FB7EC +:10083000F8948C91E22FE0958E238C932881E2230B +:10084000E8839FBFDF91CF9108958FB7F894EC9123 +:10085000E22BEC938FBFF6CF8251E82FF0E0E957FF +:10086000FB4FE49190917B008E2F880F880F807250 +:100870009F7D892B80937B00E770E064E0937C0090 +:1008800080917A00806480937A0080917A0086FD5E +:10089000FCCF809178009091790008953FB7F8944B +:1008A0008091B6029091B702A091B802B091B902BE +:1008B00026B5A89B05C02F3F19F00196A11DB11DBB +:1008C0003FBFBA2FA92F982F8827BC01CD01620FF7 +:1008D000711D811D911D42E0660F771F881F991FB2 +:1008E0004A95D1F708958F929F92AF92BF92CF927F +:1008F000DF92EF92FF924B015C010E944E046B016C +:100900007C010E944E046C197D098E099F09683E86 +:10091000734081059105A8F321E0821A9108A1088E +:10092000B10888EEC80E83E0D81EE11CF11C8114CA +:100930009104A104B10429F7FF90EF90DF90CF90CC +:10094000BF90AF909F908F90089540914F0250912B +:10095000500220914D0230914E0242175307B4F4D9 +:100960009091E8009570E1F39091E80092FD19C034 +:100970008093F10080914F029091500201968F7305 +:100980009927892B19F48EEF8093E80080914F020C +:100990009091500201969093500280934F0281E013 +:1009A000089580E00895DF92EF92FF920F931F93D6 +:1009B000CF93DF93D82E8A01EB017B01E40EF51E65 +:1009C000CE15DF0559F0D7FE12C0FE0184910E94BA +:1009D000A50421968111F4CF0FEF1FEFC801DF911D +:1009E000CF911F910F91FF90EF90DF900895888134 +:1009F000EECF0F931F93CF93DF931F92CDB7DEB748 +:100A000082E0898342E450E067EE73E080E80E9470 +:100A1000D3040E944403DC0112960D911C91011530 +:100A2000110589F0D801ED91FC910280F381E02D50 +:100A3000BE016F5F7F4FC801099597FD04C0F801A3 +:100A400000851185ECCF89810F90DF91CF911F91A7 +:100A50000F910895615030F02091F100FC01208346 +:100A60000196F8CF289884E6809337030895DC0137 +:100A7000ED91FC910190F081E02D099490E080E0EF +:100A800008958F929F92AF92BF92CF92DF92EF9292 +:100A9000FF920F931F93CF93DF936C017B018A0129 +:100AA00080910B01882309F45CC08091380388236E +:100AB00009F457C08091530280FF05C08091E00087 +:100AC00082608093E000E801B12C8AEFA82E93E0C9 +:100AD000892E2AE3922E209711F4BB20D9F10E948F +:100AE000E20281110AC0AA94AA20D9F161E070E063 +:100AF00080E090E00E947304EECF8C171D0611F089 +:100B00000CF08C2F9FB7F8948092E9002091E800B8 +:100B100025FD02C09FBFDFCF282F30E0C21BD30BC3 +:100B2000F701815020F041914093F100FACFE20E9D +:100B3000F31EBB2021F09092E800B12CEBCF809106 +:100B4000E80085FDE7CF9092E800BB24B39420979E +:100B500009F3F3CF5D9884E68093520210161106D4 +:100B60003CF081E090E0F6019383828310E000E0A6 +:100B7000C801DF91CF911F910F91FF90EF90DF900F +:100B8000CF90BF90AF909F908F900895CF93DF93B9 +:100B90001F92CDB7DEB76983DC01ED91FC91028035 +:100BA000F381E02D41E050E0BE016F5F7F4F09957A +:100BB0000F90DF91CF9108950F931F93CF93DF9301 +:100BC0008C01D0E0C0E0F801EC0FFD1F64916623BA +:100BD00041F08AE395E00E94C605892B11F0219629 +:100BE000F2CFCE01DF91CF911F910F91089583E055 +:100BF0008093E9008091F200882319F08AE38093C2 +:100C0000E80008950E94E20290E00895CF93DF93F8 +:100C10001F92CDB7DEB7FC018485958597FD08C08E +:100C20002FEF3FEF358724870F90DF91CF91089505 +:100C3000CE0101960E94B802019719F4898190E0D3 +:100C4000F3CF8FEF9FEFF0CF0F931F93CF93DF93EF +:100C50001F92CDB7DEB78C01FC018485958597FF87 +:100C60000BC0CE0101960E94B802019771F48981F0 +:100C700090E0F80195878487F801848595850F9029 +:100C8000DF91CF911F910F9108958FEF9FEFF1CFDB +:100C9000FC018485958597FD0BC09FB7F89482E091 +:100CA0008093E9008091F2009FBF90E00196089543 +:100CB0009FB7F89482E08093E9008091F2009FBF93 +:100CC00090E008950F931F93CF93DF9309E313E010 +:100CD000D0E0C0E0CE010E944818F80181938F0156 +:100CE0002196C130F2E0DF07A9F789E393E0DF91B5 +:100CF000CF911F910F9108951F93CF93DF9385EDAF +:100D00008093BC008091C9029091CA02A091CB024D +:100D1000B091CC020796A11DB11D23E0B695A79511 +:100D2000979587952A95D1F72091BC0024FD03C0A3 +:100D30001092110352C04091C9025091CA026091B1 +:100D4000CB027091CC02452B462B472B69F30097C1 +:100D5000A105B10541F025E32A95F1F700000197BF +:100D6000A109B109E1CF8091C802C1E0C093C702D7 +:100D7000882399F1D091B8001091BA008091BC00FD +:100D80008A7B8093BC0060E082E00E94CD0360E03B +:100D900083E00E94CD0310921103C09313031092BD +:100DA000120361E082E00E94CD0361E083E00E94D3 +:100DB000CD038091B9008E7F8093B9008091B900F6 +:100DC0008D7F8093B90088E48093B80085E4809398 +:100DD000BC001093BA00D093B800DF91CF911F915F +:100DE0000895FB0101900020E9F73197AF01461B00 +:100DF000570BDC01ED91FC910280F381E02D099409 +:100E000069E371E08AE395E00E94F10683EE93E0E6 +:100E10000C94DC05CF93DF930E94DC05EC0169E3C1 +:100E200071E08AE395E00E94F1068C0F9D1FDF912F +:100E3000CF9108958CEA90E00E940A0781E090E04B +:100E40000895CF92DF92EF92FF921F93CF93DF939B +:100E50006C017B01109140028BE493E0112391F02F +:100E600082E293E022E0C216D10464F0FB018281A9 +:100E700093810E94F617EC0101978115924070F062 +:100E80008EEF92E00E940A0790E080E0DF91CF9120 +:100E90001F91FF90EF90DF90CF90089522E0C2164F +:100EA000D10459F0F701848195810E94F6179C01C5 +:100EB00040972CF08DED92E0E5CF2FE030E0C75C5D +:100EC000DC4F98819F70612F6150770BAB0161E01F +:100ED00070E001C0660F4A95EAF7962B84E0220F76 +:100EE000331F8A95E1F7922B988381E090E0CECF73 +:100EF000CF93DF93C0914002C11109C085EB93E00D +:100F00000E940A0790E080E0DF91CF910895029758 +:100F10001CF489E793E0F4CFFB01828193810E9466 +:100F2000F6179C01215031092115324018F081E952 +:100F300093E0E6CFFC01E75CFC4FC150DD0B21E004 +:100F400030E001C0220FCA95EAF72095808128235E +:100F5000208381E090E0D8CF8F929F92AF92BF9292 +:100F6000EF92FF920F931F93CF93DF93CDB7DEB72E +:100F7000A1970FB6F894DEBF0FBECDBF7C01FA017A +:100F8000CB0119A2223008F42AE08E010F5D1F4F19 +:100F9000822E912CB12CA12CBF01A50194010E949D +:100FA0005E18F901CA016A300CF5605DD8016E93D4 +:100FB0008D01232B242B252B79F790E080E01097CF +:100FC00021F0BD01C7010E94F106A1960FB6F89469 +:100FD000DEBF0FBECDBFDF91CF911F910F91FF906C +:100FE000EF90BF90AF909F908F900895695CDECF97 +:100FF000CF92DF92EF92FF92CF93DF93AB01BC01D0 +:1010000077FF1DC06A017C016DE28AE395E00E94D2 +:101010003705EC0144275527BA014C195D096E09C3 +:101020007F092AE08AE395E00E94AC078C0F9D1FA0 +:10103000DF91CF91FF90EF90DF90CF9008952AE05D +:101040008AE395E0DF91CF91FF90EF90DF90CF9012 +:101050000C94AC078F929F92AF92BF92CF92DF9287 +:10106000EF92FF920F931F93CF93DF937C018B013D +:101070006C0182E0C80ED11C4701E5E08E0E911C88 +:10108000D0E0C0E0F60141916F0150E070E060E017 +:101090002AE0C8010E94AC075C016EE2C8010E9410 +:1010A00037058A0D9B1DC80FD91FC814D90451F7E5 +:1010B000F701458150E070E060E02AE0C8010E943D +:1010C000AC078C0F9D1FDF91CF911F910F91FF9067 +:1010D000EF90DF90CF90BF90AF909F908F9008954A +:1010E000CF93DF93BC018AE395E00E94F106EC0107 +:1010F00069E371E08AE395E00E94F1068C0F9D1F81 +:10110000DF91CF9108958CE391E00E9470080E94D6 +:10111000620681E090E00895CF93DF93482F50E07E +:1011200070E060E02AE08AE395E00E94AC07EC0101 +:1011300069E371E08AE395E00E94F1068C0F9D1F40 +:10114000DF91CF910895029739F4FB018281938159 +:101150000E94F617809340028091400281508430B3 +:1011600038F088E592E00E940A0790E080E0089558 +:1011700087E692E00E94DC05809140020E948C0884 +:1011800081E090E00895CF93C1E068EE73E080E0E5 +:1011900090E00E9473048C2F0E948C08CF5FC431B2 +:1011A000A1F781E090E0CF9108954F925F926F9206 +:1011B0007F92AF92BF92CF92DF92EF92FF920F9306 +:1011C0001F93CF93DF93C12CD12C7601C39401E000 +:1011D00010E060E571E08AE395E00E94F106C70146 +:1011E000B6010E94F80769E371E08AE395E00E9486 +:1011F000F106C6010197580102C0AA0CBB1C8A95D2 +:10120000E2F7C9E3D3E0412C512C320143948981A8 +:1012100090E08A219B21892BD9F0C301B2010E9461 +:10122000F80765E571E08AE395E00E94F1066981BF +:1012300070E084E0759567958A95E1F7072E000CBC +:10124000880B990B0E94F80787E591E00E947008CF +:1012500021968FEF481A580A680A780A81E04816E2 +:1012600082E058066104710491F68FEFC81AD80A1B +:10127000E80AF80A85E0C816D104E104F10409F08F +:10128000A8CF81E090E0DF91CF911F910F91FF9067 +:10129000EF90DF90CF90BF90AF907F906F905F9076 +:1012A0004F900895CF92DF92EF92FF920F931F938A +:1012B000CF93DF936C018B0186E090E00E94D11602 +:1012C000EC0190935E0280935D02F6010190002094 +:1012D000E9F7CF018C199D090E94D1167C01B60156 +:1012E0000E949618F60101900020E9F73197EC1959 +:1012F000FD09EE0DFF1D1082F982E8821B830A832F +:1013000080915502909156029D838C83D093560212 +:10131000C0935502DF91CF911F910F91FF90EF90F5 +:10132000DF90CF900895FF920F931F93CF93DF9399 +:10133000EC01F62E08811981C8010E944818F816A0 +:1013400021F06F2DC8010E945018CE01DF91CF917E +:101350001F910F91FF900895EF92FF920F931F93AB +:10136000CF93DF9300D0CDB7DEB789E3E82E83E0DB +:10137000F82E10E000E01A830983F70161917F01E4 +:10138000CE0101960E9493090F5F1F4F0130F2E0DA +:101390001F0789F789E393E00F900F90DF91CF91BA +:1013A0001F910F91FF90EF90089589E591E00E94C1 +:1013B00070080E94AC0981E090E00895EF92FF92DE +:1013C0000F931F93CF93DF9300D0CDB7DEB7E9E340 +:1013D000F3E081E092E0DF019C011D92215030405A +:1013E000E1F744E050E061E070E087E592E00E94C0 +:1013F000861887E5E82E82E0F82E02E012E01A83D4 +:101400000983D7016D917D01CE0101960E94930958 +:101410000F5F1F4F0630B2E01B0789F781E090E0B5 +:101420000F900F90DF91CF911F910F91FF90EF9050 +:1014300008950F931F93CF93DF9300D0CDB7DEB7FE +:101440008230910594F482EC92E00E940A0707E54D +:1014500012E0F80181918F010E948C08F2E00B35B7 +:101460001F07B9F790E080E03DC011E0029751F40A +:10147000FB01828193810E94F617182F84EB92E082 +:10148000112331F080914002811105C086E892E07D +:101490000E940A07E7CF90E0FC01EA5AFD4F108353 +:1014A0008F5F9D4F9A838983612FCE0101960E94A1 +:1014B000930987E792E00E94DC05412F50E070E03D +:1014C00060E02AE08AE395E00E94AC076CE671E0F8 +:1014D0008AE395E00E94F106809140020E948C0808 +:1014E00081E090E00F900F90DF91CF911F910F91CD +:1014F00008951F920F920FB60F9211242F933F93CE +:101500004F935F936F937F938F939F93AF93BF930B +:10151000EF93FF938091B900887F803609F44AC029 +:10152000F0F5883209F4A5C018F5803109F499C0A6 +:10153000B8F4882309F4F5C0883009F492C0FF910B +:10154000EF91BF91AF919F918F917F916F915F913B +:101550004F913F912F910F900FBE0F901F901895B4 +:10156000883109F486C0803251F78093100314C08B +:10157000803409F49BC040F48033B9F38833F9F622 +:101580008093100385ECAEC0803509F483C08835A4 +:1015900009F494C0883499F60E947C06D0CF88392B +:1015A00009F48AC038F5883729F050F4883611F0EC +:1015B000803729F683E08093110310920F0355C002 +:1015C000883809F479C0803919F0803809F0B7CF2C +:1015D00080910F03803208F06FC0E0910F0381E02B +:1015E0008E0F80930F038091BB00F0E0E151FD4F1F +:1015F00080833BC0803B39F0D0F4803A09F477C057 +:10160000883A09F09CCF84E0809311031092EE0297 +:101610001092ED02F0E0E0E009958091ED02811179 +:101620000FC081E08093ED021092CD0209C0803C92 +:1016300009F4A8CF883C09F4A5CF883B09F07FCFF7 +:10164000E091EE0281E08E0F8093EE02F0E0E35332 +:10165000FD4F80818093BB009091EE028091ED025E +:1016600029C0809136038093BB0085EC8093BC0039 +:1016700066CF9091350380913403981758F5E09127 +:10168000350381E08E0F80933503F0E0EC5EFC4F74 +:101690008081E9CFE091350381E08E0F809335039F +:1016A0008091BB00F0E0EC5EFC4F808390913503AD +:1016B000809134039817C8F285E8D8CFE0913503BC +:1016C00081E08E0F809335038091BB00F0E0EC5EEB +:1016D000FC4F80838091130381115ECF81E0809362 +:1016E000120384EA8093BC001092110328CF85EC8A +:1016F0008093BC001092110380910F03803230F46C +:10170000E0910F03F0E0E151FD4F108260910F0373 +:1017100070E08FEE92E0F0E0E0E0099510920F03A8 +:101720000ECF1092100338CF1F920F920FB60F9268 +:1017300011242F933F938F939F93AF93BF938091E7 +:10174000B2029091B302A091B402B091B50230916F +:10175000B10223E0230F2D3758F50196A11DB11DCD +:101760002093B1028093B2029093B302A093B4028B +:10177000B093B5028091B6029091B702A091B802E1 +:10178000B091B9020196A11DB11D8093B60290934C +:10179000B702A093B802B093B902BF91AF919F91E5 +:1017A0008F913F912F910F900FBE0F901F90189522 +:1017B00026E8230F0296A11DB11DD2CF1F920F92D2 +:1017C0000FB60F9211248F939F938091E100909117 +:1017D000E100937F9093E10083FF0FC01092E90036 +:1017E00091E09093EB001092EC0092E39093ED0067 +:1017F0001092380398E09093F00082FF22C093E0AB +:101800009093E9009091F200992319F09AE3909354 +:10181000E80090915202992341F090915202915028 +:1018200090935202911101C05D9A909137039923D0 +:1018300041F090913703915090933703911101C07B +:10184000289A84FF18C08091E2008E7E8160809388 +:10185000E2008091E1008F7E8093E100809153024D +:101860008E7E8061809353029F918F910F900FBE67 +:101870000F901F90189580FFF7CF8091E2008E7E29 +:1018800080618093E2008091E1008E7E8093E10090 +:10189000809153028E7E8160E5CF1F920F920FB62A +:1018A0000F921124CF92DF92EF92FF920F931F932A +:1018B0002F933F934F935F936F937F938F939F9358 +:1018C000AF93BF93EF93FF93CF93DF93CDB7DEB783 +:1018D0006C97DEBFCDBF1092E9008091E80083FFD6 +:1018E00025C068E0CE0145960E942A0582EF8093CC +:1018F000E8008D8987FF39C09091E80090FFFCCF08 +:10190000982F907609F034C19E894F89588D2F8980 +:10191000F88C911131C0803861F580915402809328 +:10192000F1001092F1008EEF8093E8006C960FB6F4 +:10193000F894DEBF0FBECDBFDF91CF91FF91EF9145 +:10194000BF91AF919F918F917F916F915F914F91D7 +:101950003F912F911F910F91FF90EF90DF90CF90CB +:101960000F900FBE0F901F9018959EEF9093E80078 +:10197000C7CF1092F100D5CF913059F48111D3CF58 +:101980004130510581F6809154028D7F809354023D +:10199000CACF933049F48111C6CF4130510519F6B1 +:1019A000809154028260F2CF953041F48091E8003A +:1019B00080FFFCCF20682093E300B5CF963009F07C +:1019C000A9C00B8D1C8D22E01092E90010925002EC +:1019D00010924F02F2122EC010924E0210924D023F +:1019E0000E94F9041F8299E09983FA8291E09E8314 +:1019F00090EA98879AEF998720914F023091500290 +:101A0000275F3F4F3C832B838D831092E900109218 +:101A1000500210924F0210934E0200934D0249E083 +:101A200050E0BE016F5F7F4F80E00E94D3040E94B0 +:101A3000F90479CF10934E0200934D020E944403A3 +:101A4000DC0112960D911C910115110509F451C18B +:101A5000D801ED91FC910480F581E02DBE016B5E13 +:101A60007F4FC8010995009709F03EC1F801008534 +:101A70001185EACFF3E0FF120EC08F89882309F4A5 +:101A800040C0823061F440E860E18BE494E00E9461 +:101A9000B910811148CF81E28093EB0047CF8130AC +:101AA00029F440E86BE08FE394E0F1CF833099F7BD +:101AB0000E944403DC011296ED90FC908E010F5FB2 +:101AC0001F4F6801E114F10479F0D701ED91FC9109 +:101AD0000680F781E02DB801C7010995080F111D97 +:101AE000F701E084F184EECFD8011C92F601019059 +:101AF0000020E9F73197BF016C197D0940E0C6016C +:101B0000C6CF69E274E0FB01449150E080E80E9496 +:101B1000D30409CF973009F4BECF983021F481E087 +:101B20008093F10000CF993009F0FDCE837009F069 +:101B3000B2CFE3E1F1E081E031E096E321912223AD +:101B400071F08093E9003093EB00DF0111972C9145 +:101B50002093EC009093ED008F5F873079F78EE74C +:101B60008093EA001092EA008F8980933803DBCEDD +:101B70008B8D9C8D1092E9001092500210924F02B2 +:101B800090934E0280934D02898D811192C08E896F +:101B90009D89913A49F4813209F07DCF47E050E0C8 +:101BA00064E071E080E0B3CF913209F074CF83320A +:101BB00069F48F89988DB0E0A0E080930001909344 +:101BC0000101A0930201B0930301ADCE803269F40C +:101BD0008091E80082FFFCCF67E084E091E00E9402 +:101BE0002A058BEF8093E8009ECE823209F09BCECF +:101BF0008F8980930B01EEEFFFE7859194918B3FE6 +:101C00009C4D51F1E0E0F8E08091040190910501D4 +:101C1000A0910601B0910701803B9440A105B10558 +:101C2000F1F480910B0180FD1AC0EE3F8AE0F807C5 +:101C300089F587E797E7918380838091600080939F +:101C4000510288E19BE00FB6F894A895809360005C +:101C50000FBE9093600067CEEEEFFAE0D5CF8081A3 +:101C600091818737974709F05ECEA89580916000F3 +:101C70008861809360008091510280936000EE3F04 +:101C80002AE0F20789F08091FE0A9091FF0A918381 +:101C9000808349CE808191818737980751F2909354 +:101CA000FF0A8093FE0AC5CF1092FF0A1092FE0A27 +:101CB0003ACE0E944403DC0112960D911C9101154D +:101CC000110509F4E8CED801ED91FC910190F08165 +:101CD000E02DBE016B5E7F4FC8010995811123CEB7 +:101CE000F80100851185EBCF181619060CF41BCEF0 +:101CF000D2CEF1E0FF12BECE6DE274E004CF1F92AF +:101D00000F920FB60F921124AF92BF92CF92DF9233 +:101D1000EF92FF920F931F932F933F934F935F93F5 +:101D20006F937F938F939F93AF93BF93EF93FF93A3 +:101D3000CF93DF9300D0CDB7DEB72091C80080915C +:101D4000CE0090E09A83898323FF27C010924C0233 +:101D500010924B028091C800877F8093C8000000DA +:101D60000F900F90DF91CF91FF91EF91BF91AF91C5 +:101D70009F918F917F916F915F914F913F912F91A3 +:101D80001F910F91FF90EF90DF90CF90BF90AF9099 +:101D90000F900FBE0F901F90189524FF0EC0109249 +:101DA0004A021092490281E090E090934C028093A5 +:101DB0004B028091C8008F7ED0CF80914B029091D2 +:101DC0004C028230910509F41AC1C8F4019739F622 +:101DD00089819A81892B09F58091AF029091B00297 +:101DE000892B01F184E090E090934C0280934B02A8 +:101DF00081E090E090934A0280934902B0CF833013 +:101E0000910509F410C1049709F0A9CF8091490206 +:101E100090914A028130924088F010924C021092C8 +:101E20004B029DCF8091AD029091AE02019719F4C3 +:101E300083E090E0D9CF82E090E0D6CF61E087E008 +:101E40000E94CD0380919C02882309F469C0898196 +:101E50009A81892B09F45EC082E10E942C0410E172 +:101E600045970CF010E083E10E942C0445970CF498 +:101E7000106284E10E942C0445970CF4106485E103 +:101E80000E942C0445970CF41068E0914902F091EF +:101E90004A02E75CFC4F80818F70808388E00E945B +:101EA000A403892B51F4E0914902F0914A02E75CC6 +:101EB000FC4F80818160812B80838CE00E94A40391 +:101EC000892B51F4E0914902F0914A02E75CFC4F02 +:101ED00080818260812B808384E00E94A403892B0F +:101EE00051F4E0914902F0914A02E75CFC4F808195 +:101EF0008460812B80838BE00E94A403892B51F4A2 +:101F0000E0914902F0914A02E75CFC4F80818860D1 +:101F1000182B10838091490290914A0201966ACF52 +:101F2000F12CE12C34E6B32EE0914902F0914A0203 +:101F3000E75CFC4F808190E00E2C02C09595879560 +:101F40000A94E2F780FF41C0E0914902F0914A0211 +:101F5000E75CFC4F008110E024E0159507952A9579 +:101F6000E1F70F30110521F400915B0210915C0242 +:101F700089819A81F701E95AFD4F208128171906B6 +:101F800009F064F56701CC0CDD1CF601E75EFE4F3D +:101F9000A08061E08A2D0E94FB0361E08A2D0E94EF +:101FA000CD0381E090E00115110529F0B09EC0013C +:101FB000B19E900D1124F601EF55FD4F2081318126 +:101FC0002817390710F4918380838FEFE81AF80AF5 +:101FD00024E0E216F10409F0A7CF9CCF012BA9F76A +:101FE000F701EE0FFF1FE75EFE4F108161E0812FCA +:101FF0000E94FB0360E0812F0E94CD03E6CF809119 +:10200000AD029091AE022091490230914A020197AF +:102010008217930709F07ECF83E090E090934C0203 +:1020200080934B0277CF61E087E00E94CD0320913F +:10203000490230914A028091AD029091AE02281778 +:10204000390739F489819A81909348028093470235 +:1020500061CF8091AD029091AE0220914902309102 +:102060004A0201968217930739F489819A819093E5 +:102070004602809345024ECF8091AD029091AE0210 +:102080002091490230914A0202968217930739F44F +:1020900089819A8190934402809343023BCF80913F +:1020A000AD029091AE022091490230914A0203960E +:1020B0008217930709F053CE89819A819093420247 +:1020C0008093410281E090E090934A02809349021C +:1020D00010924C0210924B0280914702909148025C +:1020E00061E0892B91F18AE00E94FB0361E08AE0C4 +:1020F0000E94CD03809145029091460261E0892BB8 +:1021000049F189E00E94FB0361E089E00E94CD0370 +:10211000809143029091440261E0892B01F185E0B6 +:102120000E94FB0361E085E00E94CD0380914102A3 +:102130009091420261E0892BB9F086E00E94FB0396 +:1021400061E086E00E94CD030ACE8AE00E94FB0394 +:1021500060E0CDCF89E00E94FB0360E0D6CF85E050 +:102160000E94FB0360E0DFCF86E00E94FB0360E09B +:10217000E8CFEF92FF920F931F93CF93DF93F82E48 +:10218000192FE62E042F81E0860F880F0E94A504E8 +:1021900083E00E94A504CF2DD12FEC0EFD2EF11C63 +:1021A000CE15DF05B9F007FF13C0FE0184910E9430 +:1021B000A504182F80E00E94A50481232196811197 +:1021C000EFCFDF91CF911F910F91FF90EF90089586 +:1021D0008881EDCF81E0F5CFEAE3F5E0138212824A +:1021E00088EE93E0A0E0B0E084839583A683B78374 +:1021F00085E291E0918380838FEF9FEF95878487BD +:10220000EAE8F5E087E391E091838083128213820C +:1022100014821582E0E9F5E09183808312821382B3 +:10222000148215820895CF93DF93CDB7DEB7CE54D5 +:10223000D1090FB6F894DEBF0FBECDBF789484B538 +:10224000826084BD84B5816084BD85B5826085BDB2 +:1022500085B5816085BD80916E00816080936E0040 +:102260001092810080918100826080938100809132 +:1022700081008160809381008091800081608093E3 +:102280008000809191008260809391008091910004 +:102290008160809391008091900081608093900094 +:1022A0008091C10084608093C1008091C1008260F0 +:1022B0008093C1008091C10081608093C1008091B2 +:1022C000C30081608093C3008091C00082608093CE +:1022D000C0008091C20081608093C20080917A002A +:1022E000846080937A0080917A00826080937A0083 +:1022F00080917A00816080937A0080917A00806872 +:1023000080937A0010923803109254021092530274 +:102310008091D70081608093D70080EA8093D800B5 +:1023200089B5806189BD89B5826089BD09B400FE27 +:10233000FDCF61E070E080E090E00E947304809146 +:10234000D8008F7C80618093D8008091E000807FEE +:102350008093E0008091E1008E7E8093E1008DE02B +:102360008093E200559A209A60E088E00E94FB0387 +:1023700060E08CE00E94FB0360E084E00E94FB03CD +:1023800060E08BE00E94FB0360E082E10E94FB03BF +:1023900060E083E10E94FB0360E084E10E94FB03B4 +:1023A00060E085E10E94FB0360E086E10E94FB03A0 +:1023B00060E087E10E94FB0361E082E00E94FB0392 +:1023C00061E087E00E94FB0361E088E00E94CD03AA +:1023D00061E08CE00E94CD0361E084E00E94CD03C7 +:1023E00061E08BE00E94CD0361E082E10E94CD03B9 +:1023F00061E083E10E94CD0361E084E10E94CD03AE +:1024000061E085E10E94CD0361E086E10E94CD0399 +:1024100061E087E10E94CD0388E00E94A4032F962B +:102420009FAF8EAF2F978CE00E94A4032D969FAF95 +:102430008EAF2D9784E00E94A4032B969FAF8EAFA2 +:102440002B978BE00E94A40329969FAF8EAF29970C +:102450002F968EAD9FAD2F97019709F001C22F9651 +:102460001FAE1EAE2F972D968EAD9FAD2D97019767 +:1024700009F0FDC12D961FAE1EAE2D972B968EAD89 +:102480009FAD2B97019709F0F9C12B961FAE1EAE99 +:102490002B9729968EAD9FAD2997019709F0F5C12D +:1024A00029961FAE1EAE299782E10E942C04459703 +:1024B0000CF0F2C181E090E027969FAF8EAF279796 +:1024C00083E10E942C0445970CF0EBC181E090E081 +:1024D00025969FAF8EAF259784E10E942C044597E7 +:1024E0000CF0E4C181E090E023969FAF8EAF23977C +:1024F00085E10E942C0445970CF0DDC181E090E05D +:1025000021969FAF8EAF219786E10E942C044597BC +:102510000CF0D6C181E090E09EAF8DAF87E10E94C4 +:102520002C0445970CF0CFC181E090E09093B0026D +:102530008093AF028DAD9EAD2196CEACDFAC2197DE +:102540002396EEACFFAC239725960EAD1FAD2597D5 +:102550002796AEADBFAD27972996EEADFFAD299773 +:102560002B966EAD7FAD2B972D964EAD5FAD2D9713 +:102570002F962EAD3FAD2F97880F991F8C0D9D1D67 +:10258000880F991F8E0D9F1D880F991F800F911F17 +:10259000880F991F8A0F9B1F880F991F8E0F9F1FEF +:1025A000880F991F860F971F880F991F840F951FFB +:1025B000880F991F820F931F9093AE028093AD02F4 +:1025C0008091AD029091AE028D3F914030F08DEF41 +:1025D00091E09093AE028093AD0278948FEF9FEFDD +:1025E000909347058093460568EE73E080E090E0A5 +:1025F0000E94730410929B02109256021092550290 +:1026000063EA78E081E891E00E9452096AE177E0AC +:1026100087E891E00E94520965ED79E08CE891E04D +:102620000E94520963E878E081E991E00E94520932 +:1026300065ED78E086E991E00E94520961E277E079 +:102640008CE991E00E94520968E777E080EA91E026 +:102650000E9452096EED79E084EA91E00E945209ED +:1026600063EC78E08AEA91E00E94520969E17AE03D +:102670008FEA91E00E94520910929C028091AF0271 +:102680009091B002892B09F42AC186E10E942C04A2 +:1026900045970CF01DC183EB91E00E94700881E02A +:1026A00080939C02E9E3F3E081E092E0DF019C018A +:1026B0001D9221503040E1F719E1E12E11E0F12E99 +:1026C00010E000E0D701DC90B2E0EB0EF11C61E01D +:1026D0008D2D0E94FB0360E08D2D0E94CD03F8013B +:1026E000EE0FFF1FEF55FD4F118210820F5F1F4F3E +:1026F0000430110539F721968EAD9FAD21972396B1 +:10270000EEACFFAC239725960EAD1FAD259727960F +:10271000AEADBFAD27972996EEADFFAD29972B96AD +:102720006EAD7FAD2B972D964EAD5FAD2D972F964D +:102730002EAD3FAD2F97880F991F8E0D9F1D880FCF +:10274000991F800F911F880F991F8A0F9B1F880F59 +:10275000991F8E0F9F1F880F991F860F971F880F35 +:10276000991F840F951F880F991F820F931F9093B5 +:102770005C0280935B0282E092E00E9448188093A2 +:10278000570283E092E00E9448188093580284E048 +:1027900092E00E9448188093590285E092E00E94DE +:1027A000481880935A028CE594E00E940A0707E5D6 +:1027B00012E0FF24F394F8018081811101C0F082BE +:1027C0000F5F1F4F80810E948C08E2E00B351E07CF +:1027D00091F760E082E00E94CD038091AD0290917C +:1027E000AE02892B31F48091AF029091B002892B17 +:1027F00079F083E08093CC001092CD001092CE004F +:102800001092C80080E98093C9008EE08093CA00CE +:1028100000E010E0FF24F3948AE395E00E9448066C +:10282000892B09F4E5C08AE395E00E940606E82EAC +:10283000FAE08F1709F46BC02DE0821709F467C026 +:1028400038E08313C2C068E08AE395E00E94370550 +:1028500080919B02882301F3815080939B02DCCFFF +:1028600081E090E02F969FAF8EAF2F97FCCD81E057 +:1028700090E02D969FAF8EAF2D9700CE81E090E037 +:102880002B969FAF8EAF2B9704CE81E090E02996D8 +:102890009FAF8EAF299708CE27961FAE1EAE279703 +:1028A0000FCE25961FAE1EAE259716CE23961FAED1 +:1028B0001EAE23971DCE21961FAE1EAE219724CEAD +:1028C0001EAE1DAE2BCE1092B0021092AF0232CED1 +:1028D0008CE391E00E9470080E946206EDCE6BEDE1 +:1028E00071E08AE395E00E94F1064091AD025091BB +:1028F000AE0270E060E02AE08AE395E00E94AC0757 +:1029000069E371E08AE395E00E94F10634CFE0913B +:102910009B02F0E0E15AFD4F108269E371E08AE327 +:1029200095E00E94F10680915F02882309F441C07E +:1029300069EE71E08FE592E00E9414189A83898312 +:102940005E0183E0A80EB11CCC24C394D12CEC2CE6 +:102950009D2C69EE71E090E080E00E941418D50192 +:102960008D939D935D01BEE1CB16D10429F0EFEF6D +:10297000CE1ADE0A892B59F7C0905D02D0905E0214 +:10298000A980BA80C114D104D9F0D6016D917C918F +:10299000C5010E948D18892B79F4D6011296ED910C +:1029A000FC91BE016F5F7F4F8E2D992D09950E947E +:1029B000000710929B0230CFF601C480D580E2CF91 +:1029C00087E794E00E940A07F2CF682F8AE395E038 +:1029D0000E943705E0919B02EB3308F01DCF81E0A8 +:1029E0008E0F80939B02F0E0E15AFD4FE08214CFFE +:1029F0008091AF029091B002892B09F480C08FB70B +:102A0000F8948090B2029090B302A090B402B0907B +:102A1000B5028FBF4091A9025091AA026091AB020A +:102A20007091AC022A013B01F0E14F0EF7E25F1E0C +:102A3000611C711C81E090E0A0E0B0E02FEF421635 +:102A400052066206720618F480E090E0DC01840D04 +:102A5000951DA61DB71D88159905AA05BB0508F08B +:102A6000F2C084169506A606B70608F058C16BEEAC +:102A700071E08AE395E00E94F106D12CC12CF601A9 +:102A8000EE0FFF1FEF55FD4F4081518170E060E078 +:102A90002AE08AE395E00E94AC0769EE71E08AE3E0 +:102AA00095E00E94F1063FEFC31AD30A84E0C816EE +:102AB000D10429F78DEE91E00E9470082FB7F894A9 +:102AC0008091B2029091B302A091B402B091B5028C +:102AD0002FBF8093A9029093AA02A093AB02B09358 +:102AE000AC02BCC0875E9E4FDC01EC9061E08E2D95 +:102AF0000E94FB0360E08E2D0E94CD0333C18091C4 +:102B0000AD029091AE02892B09F002C183E392E0FD +:102B10000E94700861E08AE00E94FB0361E08AE0A5 +:102B20000E94CD0361E089E00E94FB0360E089E040 +:102B30000E94CD0361E085E00E94FB0360E085E038 +:102B40000E94CD0361E086E00E94FB0360E086E026 +:102B50000E94CD0368EE73E080E090E00E94730471 +:102B600061E08AE00E94FB0360E08AE00E94CD03FE +:102B700061E089E00E94FB0361E089E00E94CD03EF +:102B800061E085E00E94FB0360E085E00E94CD03E8 +:102B900061E086E00E94FB0360E086E00E94CD03D6 +:102BA00068EE73E080E090E00E94730461E08AE0E8 +:102BB0000E94FB0360E08AE00E94CD0361E089E0AF +:102BC0000E94FB0360E089E00E94CD0361E085E0A4 +:102BD0000E94FB0361E085E00E94CD0361E086E096 +:102BE0000E94FB0360E086E00E94CD0368EE73E084 +:102BF00080E090E00E94730461E08AE00E94FB03A1 +:102C000060E08AE00E94CD0361E089E00E94FB035E +:102C100060E089E00E94CD0361E085E00E94FB0353 +:102C200060E085E00E94CD0361E086E00E94FB0346 +:102C300061E086E00E94CD0368EE73E080E090E002 +:102C40000E94730463CF481759076A077B0730F463 +:102C500084169506A606B70608F409CF8FB7F89430 +:102C60008090B2029090B302A090B402B090B502EE +:102C70008FBF40919D0250919E0260919F02709182 +:102C8000A0022A013B01A4E64A0E511C611C711CE2 +:102C900081E090E0A0E0B0E0EFEF4E165E066E0639 +:102CA0007E0618F480E090E0DC01840D951DA61DE1 +:102CB000B71D88159905AA05BB05C0F584169506AC +:102CC000A606B706E8F1481759076A077B07C0F15F +:102CD00080919C0281110BC086E10E942C044597D3 +:102CE00034F48FEE91E00E947008F0929C02809183 +:102CF0009C02882369F086E10E942C04459744F0E9 +:102D000086E092E00E9470080E94AC0910929C023A +:102D10000115110509F480CD0E9400007DCD4817F2 +:102D200059076A077B0708F4A2CE98CF48175907BE +:102D30006A077B0768F684169506A606B70640F66E +:102D4000D12CC12CC601880F991FFC01EF55FD4FF6 +:102D500020813181232B09F4C5CE80819181019797 +:102D600091838083BFEFCB1ADB0AE4E0CE16D10457 +:102D700049F72FB7F8948091B2029091B302A091D5 +:102D8000B402B091B5022FBF80939D0290939E0232 +:102D9000A0939F02B093A00260E087E00E94CD0361 +:102DA00097CF0F931F93CF93DF938230910510F449 +:102DB00082E090E0E0919A05F0919B0530E020E000 +:102DC000B0E0A0E0309799F42115310509F44AC02C +:102DD000281B390B24303105D8F58A819B81611578 +:102DE000710589F1FB0193838283FE0111C040814B +:102DF00051810281138148175907E0F0481759079C +:102E000099F4109761F012960C93129713961C93F5 +:102E10003296CF01DF91CF911F910F9108950093CA +:102E20009A0510939B05F4CF2115310551F04217F7 +:102E3000530738F0A901DB019A01BD01DF01F80158 +:102E4000C1CFEF01F9CF90939B0580939A05CDCF29 +:102E5000FE01E20FF31F81939193225031093983D0 +:102E60002883D7CF2091980530919905232B41F4E1 +:102E700020910E0130910F01309399052093980510 +:102E800020910C0130910D012115310541F42DB730 +:102E90003EB74091100150911101241B350BE09178 +:102EA0009805F0919905E217F307A0F42E1B3F0B4C +:102EB0002817390778F0AC014E5F5F4F24173507AC +:102EC00048F04E0F5F1F50939905409398058193EA +:102ED00091939FCFF0E0E0E09CCFCF93DF930097FA +:102EE000E9F0FC01329713821282A0919A05B09109 +:102EF0009B05ED0130E020E01097A1F420813181A5 +:102F0000820F931F20919805309199052817390752 +:102F100009F061C0F0939905E0939805DF91CF9196 +:102F20000895EA01CE17DF07E8F54A815B819E012B +:102F300041155105B1F7E901FB83EA8349915991A4 +:102F4000C40FD51FEC17FD0761F4808191810296B3 +:102F5000840F951FE90199838883828193819B83E4 +:102F60008A83F0E0E0E012968D919C911397009790 +:102F7000B9F52D913C911197CD010296820F931FC7 +:102F800020919805309199052817390739F630971F +:102F900051F510929B0510929A05B0939905A09354 +:102FA0009805BCCFD383C28340815181840F951F84 +:102FB000C817D90761F44E5F5F4F88819981480F28 +:102FC000591F518340838A819B819383828321157A +:102FD000310509F0B0CFF0939B05E0939A059ECFA1 +:102FE000FD01DC01C0CF13821282D7CFFC018827FC +:102FF0009927E89421912032E9F3293010F02E30FE +:10300000C8F32B3241F02D3239F4689404C00E9489 +:103010004018820F911D219120532A30C0F31EF4D5 +:10302000909581959F4F089546E955E00E941918A3 +:103030000895FA01A191B081009719F41097E1F079 +:10304000CD01DC01CD010D90002011F4C00113C0B1 +:10305000FB012191222319F02015D9F7F3CFFB01B1 +:103060002191201519F41E92119606C02223C1F752 +:103070000D900020A1F7D001FA01A193B08308952B +:103080007AE0979F902D879F802D910D11240895B0 +:10309000F999FECF92BD81BDF89A992780B5089520 +:1030A000262FF999FECF1FBA92BD81BD20BD0FB664 +:1030B000F894FA9AF99A0FBE01960895A1E21A2E91 +:1030C000AA1BBB1BFD010DC0AA1FBB1FEE1FFF1FCC +:1030D000A217B307E407F50720F0A21BB30BE40B1C +:1030E000F50B661F771F881F991F1A9469F7609563 +:1030F0007095809590959B01AC01BD01CF0108951D +:10310000EE0FFF1F0590F491E02D0994DC0101C042 +:103110006D9341505040E0F70895FB01DC018D9123 +:10312000019080190110D9F3990B0895FB01DC017E +:0E31300001900D920020E1F70895F894FFCF72 +:10313E00FFFFFFFF00E100000000000000009C0503 +:10314E00800000C180810000000A00090005000611 +:10315E000000000000C60541050206F705480606F8 +:10316E00062406000000002A080D0A004C6F616458 +:10317E00696E6720454550524F4D20646174610061 +:10318E0052656C61793A003B00536176696E672037 +:10319E00454550524F4D20646174610020666F7238 +:1031AE002063757272656E742072656C61793A2057 +:1031BE000072656C61790068656C7000736176658C +:1031CE00006C6F6164007072696E740073657400D8 +:1031DE0064656C00636C656172006B696C6C006D8C +:1031EE00696E00456E746572696E67206C656172FA +:1031FE006E696E67206D6F6465202620636C656155 +:10320E00722073657474696E67730053746172749F +:10321E0020416464726573733A20005B005D004563 +:10322E006E746572696E67206C6561726E696E6729 +:10323E00206D6F6465004C656176696E67206C6504 +:10324E0061726E696E67206D6F64652C2073617696 +:10325E00696E67206461746120746F204545505219 +:0E326E004F4D0052656C61792044656D6F0014 +:00000001FF diff --git a/compiled/upload.sh b/compiled/upload.sh new file mode 100755 index 0000000..01a5fa8 --- /dev/null +++ b/compiled/upload.sh @@ -0,0 +1 @@ +../flashtools/mac/tool-avrdude/avrdude -C ../flashtools/mac/tool-avrdude/avrdude.conf -v -patmega32u4 -cavr109 -P/dev/cu.usbmodem14201 -b57600 -D -Uflash:w:firmware.hex:i diff --git a/dmx_receiver_mos_relay_public.ino b/dmx_receiver_mos_relay_public.ino deleted file mode 100644 index 45dbf03..0000000 --- a/dmx_receiver_mos_relay_public.ino +++ /dev/null @@ -1,405 +0,0 @@ -/* -- customization 20/09/2012 - - ATMEGA32u4 - - Board DMX Receiver V2 - TinkerKit - - This program 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 3 of the License, or - (at your option) any later version. - This program 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 program. If not, see . - */ - -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#define F_OSC 16000000 // Clock frequency -#define BAUD_RATE 250000 - -#define MOSFET 1 -#define RELAY 2 -/* -Here you have to select the output mode accordingly to the receiver type you are using. - Choose MOSFET or RELAY for OUTPUT_MODE - */ -//define OUTPUT_MODE RELAY -#define OUTPUT_MODE MOSFET -#define THR 20 //threshold for analogRead - -#if OUTPUT_MODE == RELAY - -#define PWMpin4 6 // PWM OUT4 -#define PWMpin1 10 // PWM OUT1 -#define PWMpin2 9 // PWM OUT2 -#define PWMpin3 5 // PWM OUT3 - -#else - -#define PWMpin1 6 // PWM OUT1 -#define PWMpin4 10 // PWM OUT4 -#define PWMpin3 9 // PWM OUT3 -#define PWMpin2 5 // PWM OUT2 - -#endif - - - -#define SW1 8 // DIP1 -#define SW2 12 // DIP2 -#define SW3 4 // DIP3 -#define SW4 11 // DIP4 -#define SW5 A0 // DIP5 -#define SW6 A1 // DIP6 -#define SW7 A2 // DIP7 -#define SW8 A3 // DIP8 -#define SW9 A4 // DIP9 -#define SW10 A5 // DIP10 - -#define DE 2 -#define LED 7 -enum { - BREAK, STARTB, STARTADD, DATA}; - -volatile unsigned int dmxStatus; -volatile unsigned int dmxStartAddress; -volatile unsigned int dmxCount = 0 ; -volatile unsigned int ch1,ch2,ch3,ch4; -volatile unsigned int MASTER; - -/*Initialization of USART*/ -void init_USART() -{ - UBRR1L = (uint8_t)(F_CPU/(BAUD_RATE*16L)-1); //Set Baud rate at 250 kbit/s - UBRR1H = (F_CPU/(BAUD_RATE*16L)-1) >> 8; // - UDR1 = 0; - UCSR1A = 0; // clear error flags, disable U2X and MPCM - UCSR1B = (1<= 509) //The receiver manages 4 channels, so you can't set a start address above 509; - dmxStartAddress = 509; - - digitalWrite(DE,LOW); - - sei(); //enable global interrupt - - for (;;) - { - // infinite loop, data will be updated throught interrupt - } - -} - -/*Demo function if dmxStartAddress = 0*/ -void demo() -{ - int bright; - if (OUTPUT_MODE == MOSFET) - { - for (;;) - { - - for (bright = 0; bright < 255; bright++) // infinite loop - { - analogWrite(PWMpin1,bright); - analogWrite(PWMpin2,bright); - analogWrite(PWMpin3,bright); - analogWrite(PWMpin4,bright); - delay(10); - } - - for (bright = 255; bright >= 0; bright--) // infinite loop - { - analogWrite(PWMpin1,bright); - analogWrite(PWMpin2,bright); - analogWrite(PWMpin3,bright); - analogWrite(PWMpin4,bright); - delay(10); - } - - analogWrite(PWMpin1,255); - analogWrite(PWMpin3,255); - delay(10); - analogWrite(PWMpin1,0); - analogWrite(PWMpin3,0); - analogWrite(PWMpin2,255); - analogWrite(PWMpin4,255); - delay(10); - } - } - else if (OUTPUT_MODE == RELAY) - { - for(;;) - { - analogWrite(PWMpin1,255); - analogWrite(PWMpin2,0); - analogWrite(PWMpin3,0); - analogWrite(PWMpin4,0); - delay(1000); - analogWrite(PWMpin1,0); - analogWrite(PWMpin2,255); - analogWrite(PWMpin3,0); - analogWrite(PWMpin4,0); - - delay(1000); - analogWrite(PWMpin1,0); - analogWrite(PWMpin2,0); - analogWrite(PWMpin3,255); - analogWrite(PWMpin4,0); - - delay(1000); - analogWrite(PWMpin1,0); - analogWrite(PWMpin2,0); - analogWrite(PWMpin3,0); - analogWrite(PWMpin4,255); - delay(1000); - } - } -} - - -SIGNAL(USART1_RX_vect) -{ - int temp = UCSR1A; - int dmxByte = UDR1; - - - if (temp&(1<wait for start byte - UCSR1A &= ~(1< the next byte is our first channel - else dmxStatus = STARTADD; // the FE WAS a BREAK -> wait for the right channel - dmxCount=1; - - - } - else - { - dmxStatus = BREAK; // wait for reset (BREAK) it was a framing error - } - goto tail; - break; - - case STARTADD: - - if (dmxCount == dmxStartAddress-1) //Is the next byte channel one? - { - dmxStatus = DATA; //Yes, so let's wait the data - } - dmxCount++; - - break; - - - case DATA: // HERE YOU SHOULD PROCESS THE CHOSEN DMX CHANNELS!!! - if (dmxCount == dmxStartAddress) - { - ch1=dmxByte; - dmxCount++; - } - else if (dmxCount == (dmxStartAddress+1)) - { - ch2=dmxByte; - dmxCount++; - } - else if (dmxCount == (dmxStartAddress+2)) - { - - ch3=dmxByte; - dmxCount++; - - - } - else if (dmxCount == (dmxStartAddress+3)) - { - ch4=dmxByte; - dmxCount=1; - dmxStatus = BREAK; // ALL CHANNELS RECEIVED - - if (OUTPUT_MODE == MOSFET) //Mosfet or Relay receiver? - { - analogWrite(PWMpin1,ch1); // update mosfet outputs - analogWrite(PWMpin2,ch2); - analogWrite(PWMpin3,ch3); - analogWrite(PWMpin4,ch4); - } - else if (OUTPUT_MODE == RELAY) - { - if(ch1 > 0) - { - analogWrite(PWMpin1,255); // update relay outputs - } - else - { - analogWrite(PWMpin1,0); - } - - if(ch2 > 0) - { - analogWrite(PWMpin2,255); - } - else - { - analogWrite(PWMpin2,0); - } - - if(ch3 > 0) - { - analogWrite(PWMpin3,255); - } - else - { - analogWrite(PWMpin3,0); - } - - if(ch4 > 0) - { - analogWrite(PWMpin4,255); - } - else - { - analogWrite(PWMpin4,0); - } - - } - - } - - } - -tail: - asm("nop"); -} \ No newline at end of file diff --git a/dmx_receiver_mos_relay_public/dmx_receiver_mos_relay_public.ino b/dmx_receiver_mos_relay_public/dmx_receiver_mos_relay_public.ino new file mode 100644 index 0000000..7e91e9d --- /dev/null +++ b/dmx_receiver_mos_relay_public/dmx_receiver_mos_relay_public.ino @@ -0,0 +1,803 @@ +/* +- customization 20/09/2012 + - ATMEGA32u4 + - Board DMX Receiver V2 - TinkerKit + + - customization 03/05/2019 + - SmartMode added + + - customization 31/10/2021 + - Command line interface added & some bugs fixed + + This program 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 3 of the License, or + (at your option) any later version. + This program 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 program. If not, see . + */ + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include "Cmd.h" +#include +#include + +#define F_OSC 16000000 // Clock frequency +#define BAUD_RATE 250000 + +#define MOSFET 1 +#define RELAY 2 +/* +Here you have to select the output mode accordingly to the receiver type you are using. + Choose MOSFET or RELAY for OUTPUT_MODE + */ +#define OUTPUT_MODE RELAY +//#define OUTPUT_MODE MOSFET +#define THR 20 //threshold for analogRead + +#if OUTPUT_MODE == RELAY + +#define PWMpin4 6 // PWM OUT4 +#define PWMpin1 10 // PWM OUT1 +#define PWMpin2 9 // PWM OUT2 +#define PWMpin3 5 // PWM OUT3 +#else + +#define PWMpin1 6 // PWM OUT1 +#define PWMpin4 10 // PWM OUT4 +#define PWMpin3 9 // PWM OUT3 +#define PWMpin2 5 // PWM OUT2 +#endif + +short outPins[4]={PWMpin1,PWMpin2,PWMpin3,PWMpin4}; + +#define SW1 8 // DIP1 +#define SW2 12 // DIP2 +#define SW3 4 // DIP3 +#define SW4 11 // DIP4 +#define SW5 A0 // DIP5 +#define SW6 A1 // DIP6 +#define SW7 A2 // DIP7 +#define SW8 A3 // DIP8 +#define SW9 A4 // DIP9 +#define SW10 A5 // DIP10 + +#define DE 2 +#define LED 7 + +enum { + BREAK, STARTB, STARTADD, DATA, SMART}; + +volatile unsigned int dmxStatus; +volatile unsigned int dmxStartAddress; +volatile unsigned int dmxCount = 0 ; +volatile unsigned int ch1,ch2,ch3,ch4; +volatile unsigned int MASTER; +volatile unsigned int smartMode; +volatile unsigned int offDelay; + + +volatile bool learningMode; +byte dmxArray[512+1]; +#define chanMinOffset 514 + + +#define CH_1 1 +#define CH_2 2 +#define CH_3 4 +#define CH_4 8 +#define CHANNELS 4 +volatile unsigned int chanDelay[CHANNELS]; +byte chanMin[CHANNELS]; +//volatile unsigned int chanMax[CHANNELS]; + + +/*Initialization of USART*/ +void init_USART() +{ + UBRR1L = (uint8_t)(F_CPU/(BAUD_RATE*16L)-1); //Set Baud rate at 250 kbit/s + UBRR1H = (F_CPU/(BAUD_RATE*16L)-1) >> 8; // + UDR1 = 0; + UCSR1A = 0; // clear error flags, disable U2X and MPCM + UCSR1B = (1< []' - associate relay with channel\n" + "'del ' - de-associate relay with channel \n" + "'min <1..255>' set treshold value for current relay\n" + "'print' - print association table\n" + "'save' - save current config in NVRAM\n" + "'load' - load config from NVRAM\n" +// "'log [serial_loglevel]' - define log level (0..7)\n" + "'kill' - test watchdog\n" + "'clear' - clear association table in RAM\n" +// "'reboot' - reboot controller" +)); +return 1; +} + +uint8_t currentRelay = 0; + +int cmdFunctionRelay(int arg_cnt, char **args) +{ +if (arg_cnt == 2) currentRelay=atoi(args[1]); + +if (!currentRelay || currentRelay>CHANNELS) + { + debugSerialPort.println(F("invalid relay#")); + return 0; + } +debugSerialPort.print(F("Current relay: ")); +debugSerialPort.println(currentRelay); +return 1; +} + +int cmdFunctionMin(int arg_cnt, char **args) +{ +uint8_t min = 1; +if (arg_cnt < 2) +{ + debugSerialPort.println(F("Minimal values for relays:")); + for (int i=0;i255) + { + debugSerialPort.println(F("invalid value")); + return 0; + } + +if (!currentRelay) + { + debugSerialPort.println(F("No Current relay defined, use 'relay' command")); + return 0; + } + +chanMin[currentRelay-1]=min; +EEPROM.put(chanMinOffset+currentRelay-1,min); + +debugSerialPort.print(F("Set min value ")); +debugSerialPort.print(min); +debugSerialPort.print(" for current relay: "); +debugSerialPort.println(currentRelay); +return 1; +} + + +int cmdFunctionAdd(int arg_cnt, char **args) +{ +int localDelay = 15; + +if (!currentRelay) + { + debugSerialPort.println(F("No Current relay defined, use 'relay' command")); + return 0; + } + +if (arg_cnt<2) + { + debugSerialPort.println(F("usage: 'add #DMXchannel [delay_in_10sec]")); + return 0; + } + +int currentChan = atoi(args[1]); +if (currentChan<1 || currentChan>512) + { + debugSerialPort.println(F("DMX Channel must be in 1..512 range")); + return 0; + } + +if (arg_cnt>2) + { + localDelay = atoi(args[2]); + if (localDelay>15) + { + debugSerialPort.println(F("Delay must be in 0..14 10s range")); + return 0; + } + } + + dmxArray[currentChan] &= 15; //Reset previosly saved delay for the channel + dmxArray[currentChan] |= ((1<<(currentRelay-1)) | (localDelay<<4)); +return 1; +} + +int cmdFunctionDel(int arg_cnt, char **args) +{ + +if (!currentRelay) + { + debugSerialPort.println(F("No Current relay defined, use 'relay' command")); + return 0; + } + +if (arg_cnt<2) + { + debugSerialPort.println(F("usage: 'del #DMXchannel")); + return 0; + } + +int currentChan = atoi(args[1]); +if (currentChan<1 || currentChan>512) + { + debugSerialPort.println(F("DMX Channel must be in 1..512 range")); + return 0; + } + +dmxArray[currentChan] &= ~(1<<(currentRelay-1)); + +return 1; +} + +int cmdFunctionDelay(int arg_cnt, char **args) +{ + +return 1; +} +int cmdFunctionPrint(int arg_cnt, char **args) +{ +for (short r=0; r>4); + debugSerialPort.println(";"); + } + } +return 1; +} + +int cmdFunctionLog(int arg_cnt, char **args) +{ + +return 1; +} + +int cmdFunctionClear(int arg_cnt, char **args) +{ +memset(dmxArray,0,sizeof(dmxArray)); +memset(chanMin,1,sizeof(chanMin)); +EEPROM.put(chanMinOffset,chanMin); + +return 1; +} + +int cmdFunctionReboot(int arg_cnt, char **args) +{ +softRebootFunc(); //Hmm just hung +return 1; +} + +int cmdFunctionKill(int arg_cnt, char **args) +{ //WDT not working on Leonardo + for (byte i = 1; i < 20; i++) { + delay(1000); + debugSerialPort.println(i); + }; +return 1; +} + +int cmdFunctionLoad(int arg_cnt, char **args) +{ + Serial.println("Loading EEPROM data"); + EEPROM.get(0, dmxArray); +return 1; +} + +int cmdFunctionSave(int arg_cnt, char **args) +{ + Serial.println("Saving EEPROM data"); + EEPROM.put(0, dmxArray); +return 1; +} + + +void setup() +{ + + #ifdef WDT_ENABLE + wdt_reset(); // reset watchdog counter + wdt_disable(); + wdt_enable(WDTO_8S); + #endif + /*Declaration of variables*/ + volatile unsigned int address1,address2,address3,address4,address5,address6,address7,address8,address9; + /*Initialization of INPUT*/ + pinMode(SW1,INPUT); + pinMode(SW2,INPUT); + pinMode(SW3,INPUT); + pinMode(SW4,INPUT); + pinMode(SW5,INPUT); + pinMode(SW6,INPUT); + pinMode(SW7,INPUT); + pinMode(SW8,INPUT); + pinMode(SW9,INPUT); + pinMode(SW10,INPUT); + + /*Initialization of OUTPUT*/ + pinMode(DE,OUTPUT); // enable Tx Rx + pinMode(LED,OUTPUT); // led DMX + + /*Setting the pull-up resistors of inputs*/ + digitalWrite( SW1,HIGH); + digitalWrite( SW2,HIGH); + digitalWrite( SW3,HIGH); + digitalWrite( SW4,HIGH); + digitalWrite( SW5,HIGH); + digitalWrite( SW6,HIGH); + digitalWrite( SW7,HIGH); + digitalWrite( SW8,HIGH); + digitalWrite( SW9,HIGH); + digitalWrite( SW10,HIGH); + + /*Calculating address*/ + address1 = digitalRead(SW1); + address2 = digitalRead(SW2); + address3 = digitalRead(SW3); + address4 = digitalRead(SW4); + + if(address1 == 1) + address1 = 0; + else + address1 = 1; + if(address2 == 1) + address2 = 0; + else + address2 = 1; + if(address3 == 1) + address3 = 0; + else + address3 = 1; + + if(address4 == 1) + address4 = 0; + else + address4 = 1; + + + /*Initialization of addresses 5-6-7-8-9 based on a threshold. The threshold avoid noise*/ + if( analogRead(SW5) <= THR) + address5 = 1; + else + address5 = 0; + + if( analogRead(SW6) <= THR) + address6 = 1; + else + address6 = 0; + + if( analogRead(SW7) <= THR) + address7 = 1; + else + address7 = 0; + + if( analogRead(SW8) <= THR) + address8 = 1; + else + address8 = 0; + + if( analogRead(SW9) <= THR) + address9 = 1; + else + address9 = 0; + + if( analogRead(SW10) <= THR) + smartMode = 1; + else + smartMode = 0; + + /*Calculation of dmxStartAddress*/ + dmxStartAddress = (address1*1) + (address2*2) + (address3*4) + (address4*8) + (address5*16) + (address6*32) + (address7*64) + (address8*128) + (address9*256); + + if (dmxStartAddress >= 509) //The receiver manages 4 channels, so you can't set a start address above 509; + dmxStartAddress = 509; + + + sei(); //enable global interrupt + + Serial.begin(9600); + delay(1000); + cmdInit(); + cmdAdd("relay", cmdFunctionRelay); + cmdAdd("help", cmdFunctionHelp); + cmdAdd("save", cmdFunctionSave); + cmdAdd("load", cmdFunctionLoad); + cmdAdd("print", cmdFunctionPrint); + cmdAdd("set", cmdFunctionAdd); + cmdAdd("del", cmdFunctionDel); + //cmdAdd("delay", cmdFunctionDelay); + //cmdAdd("log", cmdFunctionLog); + cmdAdd("clear", cmdFunctionClear); + //cmdAdd("reboot", cmdFunctionReboot); + cmdAdd("kill", cmdFunctionKill); + cmdAdd("min", cmdFunctionMin); + + + + + learningMode = 0; + + if (smartMode) + { + if (analogRead(SW9) <= THR) + { + Serial.println("Entering learning mode & clear settings"); + learningMode = 1; + memset(dmxArray,0,sizeof(dmxArray)); + } + else + { + Serial.println("Loading EEPROM data"); + EEPROM.get(0, dmxArray); + } + + for (byte i=0;i THR)) + { + Serial.println("Leaving learning mode, saving data to EEPROM"); + EEPROM.put(0,dmxArray); + learningMode = 0; + } + + } //SmartMode handler + else if (dmxStartAddress == 0){ //If all dipswitches are 0 + demo(); //call the demo function + } + +//delay (1000); +//digitalWrite(LED,LOW); + + + +} + +/*Demo function if dmxStartAddress = 0*/ +void demo() +{ + int bright; + if (OUTPUT_MODE == MOSFET) + { + for (;;) + { + + for (bright = 0; bright < 255; bright++) // infinite loop + { + analogWrite(PWMpin1,bright); + analogWrite(PWMpin2,bright); + analogWrite(PWMpin3,bright); + analogWrite(PWMpin4,bright); + delay(10); + } + + for (bright = 255; bright >= 0; bright--) // infinite loop + { + analogWrite(PWMpin1,bright); + analogWrite(PWMpin2,bright); + analogWrite(PWMpin3,bright); + analogWrite(PWMpin4,bright); + delay(10); + } + + analogWrite(PWMpin1,255); + analogWrite(PWMpin3,255); + delay(10); + analogWrite(PWMpin1,0); + analogWrite(PWMpin3,0); + analogWrite(PWMpin2,255); + analogWrite(PWMpin4,255); + delay(10); + } + } + else if (OUTPUT_MODE == RELAY) + { + for(;;) + { + Serial.println("Relay Demo"); + + analogWrite(PWMpin1,255); + analogWrite(PWMpin2,0); + analogWrite(PWMpin3,0); + analogWrite(PWMpin4,0); + delay(1000); + analogWrite(PWMpin1,0); + analogWrite(PWMpin2,255); + analogWrite(PWMpin3,0); + analogWrite(PWMpin4,0); + + delay(1000); + analogWrite(PWMpin1,0); + analogWrite(PWMpin2,0); + analogWrite(PWMpin3,255); + analogWrite(PWMpin4,0); + + delay(1000); + analogWrite(PWMpin1,0); + analogWrite(PWMpin2,0); + analogWrite(PWMpin3,0); + analogWrite(PWMpin4,255); + delay(1000); + } + } +} + + +SIGNAL(USART1_RX_vect) +{ + int temp = UCSR1A; + volatile int dmxByte = UDR1; + + + if (temp&(1<wait for start byte + UCSR1A &= ~(1< the next byte is our first channel + else dmxStatus = STARTADD; // the FE WAS a BREAK -> wait for the right channel + dmxCount=1; + } + else + { + dmxStatus = BREAK; // wait for reset (BREAK) it was a framing error + } + goto tail; + break; + + case SMART: + if (dmxCount>512) {dmxStatus = BREAK;break;} + + digitalWrite(LED,HIGH); + if (learningMode) + { + if (dmxByte) // if light is on on appropriate channel - set bit + { + byte localDelay = 0; + + if( analogRead(SW5) <= THR) localDelay |= 16; + if( analogRead(SW6) <= THR) localDelay |= 32; + if( analogRead(SW7) <= THR) localDelay |= 64; + if( analogRead(SW8) <= THR) localDelay |= 128; + dmxArray[dmxCount] &= 15; //Reset previosly saved delay for the channel + if (!digitalRead(SW1)) dmxArray[dmxCount] |= (CH_1 | localDelay); + if (!digitalRead(SW2)) dmxArray[dmxCount] |= (CH_2 | localDelay); + if (!digitalRead(SW3)) dmxArray[dmxCount] |= (CH_3 | localDelay); + if (!digitalRead(SW4)) dmxArray[dmxCount] |= (CH_4 | localDelay); + + } + } + else //operating Mode + { + // if (dmxByte) + for (byte i=0;i> 4; + if (localDelay == 15) localDelay=offDelay; //Default Delay + + if (dmxByte>=chanMin[i]) + { //ON + analogWrite(outPins[i],255); + if (!localDelay) localDelay =1; + else localDelay=localDelay * 100; //tens of second + + if (chanDelay[i] 0) + { + analogWrite(PWMpin1,255); // update relay outputs + } + else + { + analogWrite(PWMpin1,0); + } + + if(ch2 > 0) + { + analogWrite(PWMpin2,255); + } + else + { + analogWrite(PWMpin2,0); + } + + if(ch3 > 0) + { + analogWrite(PWMpin3,255); + } + else + { + analogWrite(PWMpin3,0); + } + + if(ch4 > 0) + { + analogWrite(PWMpin4,255); + } + else + { + analogWrite(PWMpin4,0); + } + + } + + } + + } + +tail: + asm("nop"); +} diff --git a/lib/utils/utils.cpp b/lib/utils/utils.cpp new file mode 100644 index 0000000..5d02eed --- /dev/null +++ b/lib/utils/utils.cpp @@ -0,0 +1,530 @@ +/* Copyright © 2017-2018 Andrey Klimov. All rights reserved. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. + +Homepage: http://lazyhome.ru +GIT: https://github.com/anklimov/lighthub +e-mail anklimov@gmail.com + +*/ + +#include "utils.h" + +#include "stdarg.h" +#include + +#include + + + + +#if defined(__SAM3X8E__) || defined(ARDUINO_ARCH_STM32) +#include +#endif + +#if defined(ESP8266) +extern "C" { +#include "user_interface.h" +} +#endif + + + + +void PrintBytes(uint8_t *addr, uint8_t count, bool newline) { + for (uint8_t i = 0; i < count; i++) { + debugSerialPort.print((addr[i] >> 4,HEX)); + debugSerialPort.print((addr[i] & 0x0f),HEX); + } + if (newline) + debugSerialPort.println(); +} + +const char HEXSTR[] = "0123456789ABCDEF"; + +void SetBytes(uint8_t *addr, uint8_t count, char *out) { + // debugSerialPort.println("SB:"); + for (uint8_t i = 0; i < count; i++) { + *(out++) = HEXSTR[(addr[i] >> 4)]; + *(out++) = HEXSTR[(addr[i] & 0x0f)]; + } + *out = 0; + +} + + +byte HEX2DEC(char i) { + byte v=0; + if ('a' <= i && i <= 'f') { v = i - 97 + 10; } + else if ('A' <= i && i <= 'F') { v = i - 65 + 10; } + else if ('0' <= i && i <= '9') { v = i - 48; } + return v; +} + +void SetAddr(char *out, uint8_t *addr) { + + for (uint8_t i = 0; i < 8; i++) { + *addr = HEX2DEC(*out++) << 4; + *addr++ |= HEX2DEC(*out++); + } +} + +// chan is pointer to pointer to string +// Function return first retrived integer and move pointer to position next after ',' +int getInt(char **chan) { + if (chan && *chan && **chan) + { + //Skip non-numeric values + while (**chan && !(**chan == '-' || (**chan >= '0' && **chan<='9'))) *chan += 1; + int ch = atoi(*chan); + + //Move pointer to next element (after ,) + *chan = strchr(*chan, ','); + if (*chan) *chan += 1; + //debugSerialPort.print(F("Par:")); debugSerialPort.println(ch); + return ch; + } + return 0; +} + + + +#if defined(ARDUINO_ARCH_ESP32) || defined(ESP8266) +unsigned long freeRam () +{return system_get_free_heap_size();} +#endif + +#if defined(__AVR__) +unsigned long freeRam () +{ + extern int __heap_start, *__brkval; + int v; + return (int) &v - (__brkval == 0 ? (int) &__heap_start : (int) __brkval); +} +#endif + +#if defined(ARDUINO_ARCH_STM32) +extern char _end; +extern "C" char *sbrk(int i); + +unsigned long freeRam() { + char *heapend = sbrk(0); + register char *stack_ptr asm( "sp" ); + struct mallinfo mi = mallinfo(); + + return stack_ptr - heapend + mi.fordblks; +} + +#endif + +#if defined(__SAM3X8E__) +extern char _end; +extern "C" char *sbrk(int i); + +unsigned long freeRam() { + char *ramstart = (char *) 0x20070000; + char *ramend = (char *) 0x20088000; + char *heapend = sbrk(0); + register char *stack_ptr asm( "sp" ); + struct mallinfo mi = mallinfo(); + + return stack_ptr - heapend + mi.fordblks; +} + +#endif + +#if defined(NRF5) +extern char _end; +extern "C" char *sbrk(int i); + +unsigned long freeRam() { + char *ramstart = (char *) 0x20070000; + char *ramend = (char *) 0x20088000; + char *heapend = sbrk(0); + register char *stack_ptr asm( "sp" ); + //struct mallinfo mi = mallinfo(); + + return stack_ptr - heapend;// + mi.fordblks; +} + +#endif + + +void parseBytes(const char *str, char separator, byte *bytes, int maxBytes, int base) { + for (int i = 0; i < maxBytes; i++) { + bytes[i] = strtoul(str, NULL, base); // Convert byte + str = strchr(str, separator); // Find next separator + if (str == NULL || *str == '\0') { + break; // No more separators, exit + } + str++; // Point to next character after separator + } +} + + +void printFloatValueToStr(float value, char *valstr) { + #if defined(ESP8266) || defined(ARDUINO_ARCH_ESP32) + sprintf(valstr, "%2.1f", value); + #endif + #if defined(__AVR__) + sprintf(valstr, "%d", (int)value); + int fractional = 10.0*((float)abs(value)-(float)abs((int)value)); + int val_len =strlen(valstr); + valstr[val_len]='.'; + valstr[val_len+1]='0'+fractional; + valstr[val_len+2]='\0'; + #endif + #if defined(__SAM3X8E__) + sprintf(valstr, "%2.1f",value); + #endif +} + +#define ARDBUFFER 16 //Buffer for storing intermediate strings. Performance may vary depending on size. + +int log(const char *str, ...)//TODO: __FlashStringHelper str support +{ + int i, count=0, j=0, flag=0; + char temp[ARDBUFFER+1]; + for(i=0; str[i]!='\0';i++) if(str[i]=='%') count++; //Evaluate number of arguments required to be printed + + va_list argv; + va_start(argv, count); + for(i=0,j=0; str[i]!='\0';i++) //Iterate over formatting string + { + if(str[i]=='%') + { + //Clear buffer + temp[j] = '\0'; + debugSerialPort.print(temp); + j=0; + temp[0] = '\0'; + + //Process argument + switch(str[++i]) + { + case 'd': debugSerialPort.print(va_arg(argv, int)); + break; + case 'l': debugSerialPort.print(va_arg(argv, long)); + break; + case 'f': debugSerialPort.print(va_arg(argv, double)); + break; + case 'c': debugSerialPort.print((char)va_arg(argv, int)); + break; + case 's': debugSerialPort.print(va_arg(argv, char *)); + break; + default: ; + }; + } + else + { + //Add to buffer + temp[j] = str[i]; + j = (j+1)%ARDBUFFER; + if(j==0) //If buffer is full, empty buffer. + { + temp[ARDBUFFER] = '\0'; + debugSerialPort.print(temp); + temp[0]='\0'; + } + } + }; + + debugSerialPort.println(); //Print trailing newline + return count + 1; //Return number of arguments detected +} + +/* Code borrowed from http://forum.arduino.cc/index.php?topic=289190.0 +Awesome work Mark T!*/ + + +__attribute__ ((section (".ramfunc"))) + +void ReadUniqueID( uint32_t * pdwUniqueID ) +{ + unsigned int status ; + +#if defined(__SAM3X8E__) + + /* Send the Start Read unique Identifier command (STUI) by writing the Flash Command Register with the STUI command.*/ + EFC1->EEFC_FCR = (0x5A << 24) | EFC_FCMD_STUI; + do + { + status = EFC1->EEFC_FSR ; + } while ( (status & EEFC_FSR_FRDY) == EEFC_FSR_FRDY ) ; + + /* The Unique Identifier is located in the first 128 bits of the Flash memory mapping. So, at the address 0x400000-0x400003. */ + pdwUniqueID[0] = *(uint32_t *)IFLASH1_ADDR; + pdwUniqueID[1] = *(uint32_t *)(IFLASH1_ADDR + 4); + pdwUniqueID[2] = *(uint32_t *)(IFLASH1_ADDR + 8); + pdwUniqueID[3] = *(uint32_t *)(IFLASH1_ADDR + 12); + + /* To stop the Unique Identifier mode, the user needs to send the Stop Read unique Identifier + command (SPUI) by writing the Flash Command Register with the SPUI command. */ + EFC1->EEFC_FCR = (0x5A << 24) | EFC_FCMD_SPUI ; + + /* When the Stop read Unique Unique Identifier command (SPUI) has been performed, the + FRDY bit in the Flash Programming Status Register (EEFC_FSR) rises. */ + do + { + status = EFC1->EEFC_FSR ; + } while ( (status & EEFC_FSR_FRDY) != EEFC_FSR_FRDY ) ; +#endif +} + + +int _inet_aton(const char* aIPAddrString, IPAddress& aResult) +{ + // See if we've been given a valid IP address + const char* p =aIPAddrString; + while (*p && + ( (*p == '.') || (*p >= '0') || (*p <= '9') )) + { + p++; + } + + if (*p == '\0') + { + // It's looking promising, we haven't found any invalid characters + p = aIPAddrString; + int segment =0; + int segmentValue =0; + while (*p && (segment < 4)) + { + if (*p == '.') + { + // We've reached the end of a segment + if (segmentValue > 255) + { + // You can't have IP address segments that don't fit in a byte + return 0; + } + else + { + aResult[segment] = (byte)segmentValue; + segment++; + segmentValue = 0; + } + } + else + { + // Next digit + segmentValue = (segmentValue*10)+(*p - '0'); + } + p++; + } + // We've reached the end of address, but there'll still be the last + // segment to deal with + if ((segmentValue > 255) || (segment > 3)) + { + // You can't have IP address segments that don't fit in a byte, + // or more than four segments + return 0; + } + else + { + aResult[segment] = (byte)segmentValue; + return 1; + } + } + else + + { + return 0; + } +} + +/** + * Same as ipaddr_ntoa, but reentrant since a user-supplied buffer is used. + * + * @param addr ip address in network order to convert + * @param buf target buffer where the string is stored + * @param buflen length of buf + * @return either pointer to buf which now holds the ASCII + * representation of addr or NULL if buf was too small + */ +char *_inet_ntoa_r(IPAddress addr, char *buf, int buflen) +{ + short n; + char intbuf[4]; + + +buf[0]=0; +for(n = 0; n < 4; n++) { + if (addr[n]>255) addr[n]=-1; + itoa(addr[n],intbuf,10); + strncat(buf,intbuf,buflen); + if (n<3) strncat(buf,".",buflen); +} + return buf; +} + +String toString(const IPAddress& address){ + return String() + address[0] + "." + address[1] + "." + address[2] + "." + address[3]; +} + +void printIPAddress(IPAddress ipAddress) { + for (byte i = 0; i < 4; i++) + if (i < 3) + {debugSerialPort.print((ipAddress[i]),DEC); debugSerialPort.print(F("."));} + else debugSerialPort.print((ipAddress[i])); +} + + + +void printUlongValueToStr(char *valstr, unsigned long value) { + char buf[11]; + int i=0; + for(;value>0;i++){ + unsigned long mod = value - ((unsigned long)(value/10))*10; + buf[i]=mod+48; + value = (unsigned long)(value/10); + } + + for(int n=0;n<=i;n++){ + valstr[n]=buf[i-n-1]; + } + valstr[i]='\0'; +} + + +void scan_i2c_bus() { + byte error, address; + int nDevices; + + debugSerialPort.println(F("Scanning...")); + + nDevices = 0; + for(address = 1; address < 127; address++ ) + { + // The i2c_scanner uses the return value of + // the Write.endTransmisstion to see if + // a device did acknowledge to the address. + Wire.beginTransmission(address); + error = Wire.endTransmission(); + + if (error == 0) + { + debugSerialPort.print(F("\nI2C device found at address ")); + // if (address<16) + // debugSerial<<("0"); + debugSerialPort.print(address); + + nDevices++; + } + else if (error==4) + { + debugSerialPort.print(F("\nUnknow error at address ")); + // if (address<16) + // debugSerial<<("0"); + debugSerialPort.print(address); + } + } + if (nDevices == 0) + debugSerialPort.print(F("No I2C devices found\n")); + else + debugSerialPort.print(F("done\n")); +} + + +#if defined(__SAM3X8E__) +void softRebootFunc() { + RSTC->RSTC_CR = 0xA5000005; +} +#endif + +#if defined(NRF5) || defined (ARDUINO_ARCH_STM32) +void softRebootFunc() { + debugSerial<<"Not implemented"<endTime) && (currTime endTime) || (currTime >shift; + if (!now) now=1; + return now; +} + +struct serial_st +{ + const char verb[4]; + const serialParamType mode; +}; + + +const serial_st serialModes_P[] PROGMEM = +{ + { "8E1", (serialParamType) SERIAL_8E1},//(uint16_t) US_MR_CHRL_8_BIT | US_MR_NBSTOP_1_BIT | UART_MR_PAR_EVEN }, + { "8N1", (serialParamType) SERIAL_8N1}, + { "8E2", (serialParamType) SERIAL_8E2}, + { "8N2", (serialParamType) SERIAL_8N2}, + { "8O1", (serialParamType) SERIAL_8O1}, + { "8O2", (serialParamType) SERIAL_8O2}, +// { "8M1", SERIAL_8M1}, +// { "8S1", SERIAL_8S1}, + { "7E1", (serialParamType) SERIAL_7E1},//(uint16_t) US_MR_CHRL_8_BIT | US_MR_NBSTOP_1_BIT | UART_MR_PAR_EVEN }, + { "7E2", (serialParamType) SERIAL_7E2}, + { "7O1", (serialParamType) SERIAL_7O1}, + { "7O2", (serialParamType) SERIAL_7O2} +#ifndef ARDUINO_ARCH_STM32 + ,{ "7N1", (serialParamType) SERIAL_7N1} + ,{ "7N2", (serialParamType) SERIAL_7N2} +#endif +// { "7M1", SERIAL_7M1}, +// { "7S1", SERIAL_7S1} +} ; + +#define serialModesNum sizeof(serialModes_P)/sizeof(serial_st) + +serialParamType str2SerialParam(char * str) +{ debugSerialPort.print(str); + debugSerialPort.print(F(" =>")); + for(uint8_t i=0; i (SERIAL_8N1); +} +#pragma message(VAR_NAME_VALUE(debugSerial)) +#pragma message(VAR_NAME_VALUE(SERIAL_BAUD)) diff --git a/lib/utils/utils.h b/lib/utils/utils.h new file mode 100644 index 0000000..cba0ef5 --- /dev/null +++ b/lib/utils/utils.h @@ -0,0 +1,61 @@ +/* Copyright © 2017-2018 Andrey Klimov. All rights reserved. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. + +Homepage: http://lazyhome.ru +GIT: https://github.com/anklimov/lighthub +e-mail anklimov@gmail.com + +*/ +#pragma once + +#define Q(x) #x +#define QUOTE(x) Q(x) +#define VALUE_TO_STRING(x) #x +#define VALUE(x) VALUE_TO_STRING(x) +#define VAR_NAME_VALUE(var) #var "=" VALUE(var) + +#include +#include + +#if defined(ESP32) +#define serialParamType uint32_t +#else +#define serialParamType uint16_t +#endif + +#ifndef debugSerialPort +#define debugSerialPort Serial +#endif + +void PrintBytes(uint8_t* addr, uint8_t count, bool newline); +void SetBytes(uint8_t* addr, uint8_t count, char * out); +void SetAddr(char * out, uint8_t* addr); +uint8_t HEX2DEC(char i); +int getInt(char ** chan); + +unsigned long freeRam (); +void parseBytes(const char* str, char separator, byte* bytes, int maxBytes, int base); +int log(const char *str, ...); +void printFloatValueToStr(float value, char *valstr); +void ReadUniqueID( uint32_t * pdwUniqueID ); +int _inet_aton(const char* aIPAddrString, IPAddress& aResult); +char *_inet_ntoa_r(IPAddress addr, char *buf, int buflen); +void printIPAddress(IPAddress ipAddress); +void printUlongValueToStr(char *valstr, unsigned long value); +void scan_i2c_bus(); +void softRebootFunc(); +bool isTimeOver(uint32_t timestamp, uint32_t currTime, uint32_t time, uint32_t modulo = 0xFFFFFFFF); +unsigned long millisNZ(uint8_t shift=0); +serialParamType str2SerialParam(char * str); +String toString(const IPAddress& address); diff --git a/platformio.ini b/platformio.ini new file mode 100644 index 0000000..dbf1b33 --- /dev/null +++ b/platformio.ini @@ -0,0 +1,28 @@ +; PlatformIO Project Configuration File +; +; Build options: build flags, source filter +; Upload options: custom upload port, speed and extra flags +; Library options: dependencies, extra library storages +; Advanced options: extra scripting +; +; Please visit documentation for the other options and examples +; https://docs.platformio.org/page/projectconf.html + +[platformio] +src_dir = dmx_receiver_mos_relay_public +default_envs = leonardo +[env:leonardo] +platform = atmelavr +board = leonardo +monitor_baud = 9600 +monitor_speed = 9600 +;board_build.variant = breakout +;upload_protocol = mbed +;upload_port = /dev/cu.SLAB_USBtoUART +framework = arduino +;build_flags = !python get_build_flags.py nrf52840 + +lib_deps = + https://github.com/anklimov/CmdArduino + +