diff --git a/DMX_Controller/DMX_Controller.cpp.elf b/DMX_Controller/DMX_Controller.cpp.elf deleted file mode 100644 index dbada6b..0000000 Binary files a/DMX_Controller/DMX_Controller.cpp.elf and /dev/null differ diff --git a/DMX_Controller/DMX_Controller.cpp.hex b/DMX_Controller/DMX_Controller.cpp.hex deleted file mode 100644 index 975ddf8..0000000 --- a/DMX_Controller/DMX_Controller.cpp.hex +++ /dev/null @@ -1,1713 +0,0 @@ -:1000000004C100002FC100002DC100002BC1000061 -:1000100029C1000027C1000025C1000023C1000044 -:1000200021C100001FC100001DC100001BC1000054 -:1000300019C1000017C1000015C1000013C1000064 -:1000400011C100000FC100000DC100000BC1000074 -:1000500009C1000007C1000005C100000C94E62D95 -:1000600001C100000C94DE2AFDC000000C947E2B20 -:10007000F9C00000F7C00000F5C00000F3C00000A8 -:10008000F1C00000EFC00000EDC00000EBC00000B8 -:10009000E9C00000E7C00000E5C000000C9414298E -:1000A000E1C00000DFC00000DDC00000DBC00000D8 -:1000B000D9C00000D7C00000D5C00000D3C00000E8 -:1000C000D1C00000CFC00000CDC00000CBC00000F8 -:1000D000C9C00000C7C00000C5C00000C3C0000008 -:1000E000C1C0000000002100240027002A002D00CC -:1000F0003000330001010000040107010A01000083 -:100100002200250028002B002E00310034000201BF -:100110000000050108010B0100002000230026005B -:1001200029002C002F00320000010000030106010D -:10013000090105050505070508080808020202026D -:100140000A0A080804040404010101010101010173 -:100150000303030303030303040707070C0C0C0C3E -:100160000C0C0C0C02020202060606060606060627 -:100170000B0B0B0B0B0B0B0B0102102020080810B4 -:100180002040102040800201020108040201010207 -:1001900004081020408080402010080402018004E0 -:1001A000020180402010080402010804020101023B -:1001B0000408102040800102040810204080000044 -:1001C000090A02080B0C0D070603040100000000D9 -:1001D000000000000000000000000000000000001F -:1001E0000000000000000000000011100F000000DF -:1001F00000000000000000000000000000000000FF -:10020000000000003A018328F62B11241FBECFEF17 -:10021000D1E2DEBFCDBF00E00CBF17E0A0E0B2E04E -:10022000E2E6F5E600E00BBF02C007900D92A638AB -:10023000B107D9F71BBE1CE0A6E8B7E001C01D92CC -:10024000A03FB107E1F712E0CAE0D2E004C0229774 -:10025000FE010E94AB32C430D107C9F70E941A31A7 -:100260000C94AF32CDCEDC0101C06D9341505040B3 -:10027000E0F70895CF92EF920F9383EE9BE06091A9 -:100280002B0740912D0720912F0700913107E09017 -:100290003307C09035070E9417280F91EF90CF9039 -:1002A00008953F924F925F926F927F928F929F92AA -:1002B000AF92BF92CF92DF92EF92FF920F931F9374 -:1002C00081E18093240755245394B4E04B2EA7E09A -:1002D0003A2EFFE09F2EE2E08E2E75E0772E68E04A -:1002E000662E53E0C52E46E0B42E39E0A32E1EE064 -:1002F0000AE02BE0F22E9CE0E92E8DE0D82EBAC168 -:100300008091140760E00E94B83080911C070E9421 -:10031000EA30892B61F4509224076091250770918F -:10032000260780912707909128070E942E2E65E0CE -:1003300070E080E090E00E942E2E80911E070E94C7 -:10034000EA30892B61F4409224076091250770916F -:10035000260780912707909128070E942E2E65E09E -:1003600070E080E090E00E942E2E809120070E9495 -:10037000EA30892B61F4309224076091250770914F -:10038000260780912707909128070E942E2E65E06E -:1003900070E080E090E00E942E2E809122070E9463 -:1003A000EA30892B61F490922407609125077091BF -:1003B000260780912707909128070E942E2E65E03E -:1003C00070E080E090E00E942E2E8091140761E0A2 -:1003D0000E94B8308091160760E00E94B83080918A -:1003E0001C070E94EA30892B61F4809224076091F7 -:1003F00025077091260780912707909128070E9472 -:100400002E2E65E070E080E090E00E942E2E80911C -:100410001E070E94EA30892B61F4709224076091D4 -:1004200025077091260780912707909128070E9441 -:100430002E2E65E070E080E090E00E942E2E8091EC -:1004400020070E94EA30892B61F4609224076091B2 -:1004500025077091260780912707909128070E9411 -:100460002E2E65E070E080E090E00E942E2E8091BC -:1004700022070E94EA30892B61F4109224076091D0 -:1004800025077091260780912707909128070E94E1 -:100490002E2E65E070E080E090E00E942E2E80918C -:1004A000160761E00E94B8308091180760E00E9452 -:1004B000B83080911C070E94EA30892B61F4C09209 -:1004C0002407609125077091260780912707909156 -:1004D00028070E942E2E65E070E080E090E00E94E8 -:1004E0002E2E80911E070E94EA30892B61F4B09273 -:1004F0002407609125077091260780912707909126 -:1005000028070E942E2E65E070E080E090E00E94B7 -:100510002E2E809120070E94EA30892B61F4A09250 -:1005200024076091250770912607809127079091F5 -:1005300028070E942E2E65E070E080E090E00E9487 -:100540002E2E809122070E94EA30892B61F41093AD -:1005500024076091250770912607809127079091C5 -:1005600028070E942E2E65E070E080E090E00E9457 -:100570002E2E8091180761E00E94B83080911A07F2 -:1005800060E00E94B83080911C070E94EA30892BFD -:1005900061F40093240760912507709126078091EC -:1005A0002707909128070E942E2E65E070E080E0DA -:1005B00090E00E942E2E80911E070E94EA30892B27 -:1005C00061F4F092240760912507709126078091CD -:1005D0002707909128070E942E2E65E070E080E0AA -:1005E00090E00E942E2E809120070E94EA30892BF5 -:1005F00061F4E092240760912507709126078091AD -:100600002707909128070E942E2E65E070E080E079 -:1006100090E00E942E2E809122070E94EA30892BC2 -:1006200061F4D0922407609125077091260780918C -:100630002707909128070E942E2E65E070E080E049 -:1006400090E00E942E2E80911A0761E00E94B8303F -:10065000809112070E94EA30892B61F410932407DD -:1006600060912507709126078091270790912807B0 -:100670000E942E2E80912407813109F441CE1F91D2 -:100680000F91FF90EF90DF90CF90BF90AF909F9031 -:100690008F907F906F905F904F903F90089583EE82 -:1006A0009BE06FE041E00E94362683EE9BE00E94D3 -:1006B000202680E090E0E091BD0CF091BE0CE80FA8 -:1006C000F91F1082019622E080309207A1F78091F5 -:1006D00012070E94EA300197D1F36CE271E080E0EA -:1006E00090E00E942E2EA8E8B7E020E030E0E091F4 -:1006F000BD0CF091BE0CE20FF31F8C9180832F5F35 -:100700003F4F129682E02030380789F783EE9BE056 -:1007100066E042E00E94362683EE9BE00C94282699 -:100720000F931F93CF93DF93EC01162F042F83EECB -:100730009BE00E94362683EE9BE060E072E00E9420 -:100740003F32CA30D1053CF4612F6E5F83EE9BE0EF -:10075000402F0E943626CE010A978A35910538F43B -:10076000612F6F5F83EE9BE0402F0E943626C436D8 -:10077000D10534F083EE9BE0612F402F0E94362696 -:1007800083EE9BE0BE014AE050E00E942D32DF91F3 -:10079000CF911F910F910895DF92EF92FF920F93E7 -:1007A0001F93CF93DF93D82E062F682F615083EECF -:1007B0009BE0402F0E94362683EE9BE064E072E0CF -:1007C0000E943F328091180760E00E94B83083EEAB -:1007D0009BE00E942026EE24FF241EC08C2F912F28 -:1007E0006D2D70E0402F50E09BDF809108079091C5 -:1007F00009070197E091BD0CF091BE0CE80FF91FBD -:10080000C083E0910807F0910907EE0FFF1FEA5738 -:10081000F84FC08311837E01809122070E94EA3045 -:100820000197D9F4809112070E94EA300197A9F448 -:10083000809129070E94F32E64E070E00E946032EC -:10084000172FC62FD72F62E370E080E090E00E9460 -:100850002E2EEC16FD0601F3C1CF83EE9BE00E9425 -:1008600028268091180761E00E94B8306CE271E0A0 -:1008700080E090E00E942E2EDF91CF911F910F918A -:10088000FF90EF90DF9008951F9380911A0760E02A -:100890000E94B8301FEF809120070E94EA30019734 -:1008A00009F046C0809112070E94EA30019709F0D2 -:1008B0003FC080910807909109070197E091BD0C16 -:1008C000F091BE0CE80FF91F10836091DF0B70E010 -:1008D000625070404091E00B8FEF90E050E020DFDD -:1008E00064E670E080E090E00E942E2E8091080780 -:1008F000909109070197E091BD0CF091BE0CE80FB3 -:10090000F91F10826091DF0B625083EE9BE04091F3 -:10091000E00B0E94362683EE9BE066E072E00E94C8 -:100920003F3264E670E080E090E00E942E2EB3CF6C -:1009300080911A0761E00E94B8306CE271E080E0BB -:1009400090E00E942E2E83EE9BE06091DF0B4091A1 -:10095000E00B0E9436261F910895CF92DF92EF920E -:10096000FF920F931F938C016DE070E040E050E028 -:10097000D7DE7EE0C72ED12CC00ED11EC60161E1AC -:1009800070E040E050E0CCDE66E8E62E67E0F62E50 -:10099000F801EE0FFF1FEE0DFF1D8081918161E0D8 -:1009A00070E041E050E0BCDEF8013196EE0FFF1F31 -:1009B000EE0DFF1D8081918165E070E041E050E027 -:1009C000AFDEF8013296EE0FFF1FEE0DFF1D8081A6 -:1009D000918169E070E041E050E0A2DEF8013396D9 -:1009E000EE0FFF1FEE0DFF1D808191816DE070E025 -:1009F00041E050E095DEF8013496EE0FFF1FEE0D5A -:100A0000FF1D8081918161E170E041E050E088DE6E -:100A1000F8013596EE0FFF1FEE0DFF1D80819181CD -:100A200061E070E042E050E07BDEF8013696EE0FC8 -:100A3000FF1FEE0DFF1D8081918165E070E042E0B7 -:100A400050E06EDEF8013796EE0FFF1FEE0DFF1D32 -:100A50008081918169E070E042E050E061DEF80160 -:100A60003896EE0FFF1FEE0DFF1D808191816DE026 -:100A700070E042E050E054DEF8013996EE0FFF1FBF -:100A8000EE0DFF1D8081918161E170E042E050E058 -:100A900047DEF8013A96EE0FFF1FEE0DFF1D808135 -:100AA000918161E070E043E050E03ADEF8013B966E -:100AB000EE0FFF1FEE0DFF1D8081918165E070E05C -:100AC00043E050E02DDE045F1F4FF801EE0FFF1FE3 -:100AD000EE0DFF1D8081918169E070E043E050E000 -:100AE0001FDE0F5F1F4F000F111F0E0D1F1DF8019E -:100AF000808191816DE070E043E050E011DECC0C2C -:100B0000DD1CEC0CFD1CF7018081918161E170E03E -:100B100043E050E005DE1F910F91FF90EF90DF90D2 -:100B2000CF900895FF920F931F93CF93DF93F82EEA -:100B300083EE9BE06091DF0B4091E00B0E94362634 -:100B400083EE9BE06AE072E00E943F3283EE9BE01E -:100B50000E9420266091DF0B6E5F6093DF0B83EEB7 -:100B60009BE04091E00B0E9436269BDB60912407BE -:100B70006A3018F000E010E016C083EE9BE04AE017 -:100B800050E00E94DE3183EE9BE06091DF0B4091EC -:100B9000E00B0E94362680912407082F10E0109366 -:100BA000E20B0093E10B809124078E3009F4D8C04A -:100BB00091E0F91691F48A3009F470C08B3009F491 -:100BC00076C08C3009F47AC08D3039F488EC92E02C -:100BD0009093E20B8093E10BDFC063DB80912407ED -:100BE0008E3029F41093E20B0093E10BB9C091E031 -:100BF000F91659F48A3009F451C08B3009F457C002 -:100C00008C3009F45BC08D3009F38A3018F0C0E0F5 -:100C1000D0E029C06091DF0B61506093DF0B83EE61 -:100C20009BE04091E00B0E94362683EE9BE0B801EA -:100C30004AE050E00E942D3283EE9BE06091240751 -:100C40004AE050E00E94DE3180912407C82FD0E0B6 -:100C50006091DF0B6F5F6093DF0B83EE9BE0409151 -:100C6000E00B0E9436261DDB809124078E3089F42C -:100C7000C801B3E0880F991FBA95E1F7000F111F63 -:100C8000800F911FC80FD91FD093E20BC093E10BC7 -:100C900067C091E0F916C1F48A3039F48FEF90E023 -:100CA0009093E20B8093E10B5BC08B3029F41092A0 -:100CB000E20B1092E10B54C08C3019F484E692E000 -:100CC00087CF8D3009F482CF8A3008F049C0609117 -:100CD000DF0B62506093DF0B83EE9BE04091E00BF3 -:100CE0000E94362683EE9BE0B8014AE050E00E9465 -:100CF0002D3283EE9BE0BE014AE050E00E942D328F -:100D00006091DF0B6E5F6093DF0B83EE9BE04091A1 -:100D1000E00B0E94362683EE9BE0609124074AE0B8 -:100D200050E00E94DE3184E690E0089F9001099F28 -:100D3000300D189F300D112480912407280F311D8C -:100D4000CE01F3E0880F991FFA95E1F7CC0FDD1F74 -:100D50008C0F9D1F280F391F3093E20B2093E10B5E -:100D600083EE9BE00E9428266091DF0B70E06250CA -:100D700070404091E00B8091E10B9091E20B50E0CC -:100D8000CFDC6091DF0B64506093DF0B83EE9BE060 -:100D90004091E00B0E94362683EE9BE00E942826BD -:100DA00083EE9BE06091DF0B4091E00B0E943626C2 -:100DB0006CE271E080E090E00E942E2EDF91CF91F6 -:100DC0001F910F91FF90089583EE9BE00E945E2695 -:100DD000A8E8B7E080E090E01D921D92E091BD0C84 -:100DE000F091BE0CE80FF91F1082019622E08030CE -:100DF000920791F783EE9BE00E945E2683EE9BE0D4 -:100E000063E041E00E94362683EE9BE06EE072E0F4 -:100E10000E943F3283EE9BE063E042E00E94362670 -:100E200083EE9BE06EE172E00E943F3283EE9BE036 -:100E300063E143E00E94362683EE9BE00E94202679 -:100E400068EE73E080E090E00E942E2E83EE9BE03F -:100E50000C9428260F931F9303EE1BE0C8010E94F9 -:100E60005E26C80160E040E00E943626C80168E2C4 -:100E700072E00E943F32C80160E041E00E943626E5 -:100E8000C8016AE372E00E943F32C80160E042E0BC -:100E90000E943626C8016DE472E00E943F32C8010C -:100EA00060E043E00E943626C80162E672E00E94DC -:100EB0003F3260EA7FE080E090E00E942E2EC80181 -:100EC0000E945E26C80160E040E00E943626C8010C -:100ED0006EE672E00E943F32C80160E041E00E948D -:100EE0003626C80163E872E00E943F32C80160E024 -:100EF00042E00E943626C80164E972E00E943F3257 -:100F0000C80160E043E00E943626C80168EA72E04A -:100F10000E943F3260EA7FE080E090E00E942E2E47 -:100F2000C8010E945E26C80160E040E00E943626AB -:100F3000C8016BEB72E00E943F32C80160E041E003 -:100F40000E943626C80169EC72E00E943F32C80157 -:100F500060E042E00E943626C8016DED72E00E941A -:100F60003F32C80160E043E00E943626C8016FEEC0 -:100F700072E00E943F3260EA7FE080E090E00E94F1 -:100F80002E2EC8010E945E26C80160E040E00E944B -:100F90003626C80164E073E00E943F32C80160E079 -:100FA00041E00E943626C8016FE073E00E943F32A4 -:100FB000C80160E042E00E943626C8016FE173E09C -:100FC0000E943F32C80160E043E00E943626C8011B -:100FD0006DE273E00E943F3260EA7FE080E090E0E3 -:100FE0000E942E2EC8010E945E26C80160E040E0EB -:100FF0000E943626C80168E373E00E943F32C801B0 -:1010000060E041E00E943626C8016CE473E00E9473 -:101010003F32C80160E042E00E943626C8016BE51D -:1010200073E00E943F3260EA7FE080E090E00E943F -:101030002E2E1F910F910895EF92FF920F931F9301 -:10104000CF93DF9360914107709142078AEB9CE058 -:101050000E94A92A80938C0B882309F494C018E875 -:10106000E12E17E0F12E00E010E0C0E0D0E080912A -:101070008C0B8430E1F0853038F4823081F083309D -:1010800090F4813079F509C08630C9F0863098F047 -:101090008730C9F0883031F51AC08E0123C08E0127 -:1010A00000501E4F1FC08E0100501C4F1BC08E01F0 -:1010B00000501A4F17C08E010050184F13C08E01F8 -:1010C0000050164F0FC08E010050144F0BC080917E -:1010D0004507909146078E010050124F80179107E7 -:1010E0000CF48C018AEB9CE0B8010E94A92AF7015C -:1010F00080831182E091BD0CF091BE0CEC0FFD1FBE -:101100008083219682E090E0E80EF91E92E0C030E4 -:10111000D90709F0ACCF83EE9BE00E945E2683EEF8 -:101120009BE063E041E00E94362683EE9BE06FE6A1 -:1011300073E00E943F3283EE9BE063E042E00E9456 -:10114000362683EE9BE06EE773E00E943F3283EE2B -:101150009BE060918C0B4AE050E00E94DE3183EE10 -:101160009BE06AE042E00E94362683EE9BE00E940C -:10117000202660ED77E080E090E00E942E2E83EE46 -:101180009BE00E942826DF91CF911F910F91FF9045 -:10119000EF900895CF92DF92EF92FF920F931F93FB -:1011A000CF93DF9360914307709144078AEB9CE0F3 -:1011B0000E94A92AC82E60913D0770913E078AEBD4 -:1011C0009CE00E94A92AD82E83EE9BE00E945E2616 -:1011D00080913B0760E070E00E94272F80913707E5 -:1011E00060E070E00E94272FC0E0D0E0EC2CFF24EC -:1011F0000D2D10E083EE9BE0BE0142E050E00E9426 -:101200002D32CC2061F0CF3FD10509F044F4EC162B -:10121000FD062CF080913B07BE010E94272FDD20A8 -:1012200061F0CF3FD10509F044F40C171D072CF0F5 -:1012300080913707BE010E94272F219682E0C1309E -:10124000D807C1F683EE9BE00E945E2683EE9BE00A -:101250000E94202683EE9BE063E040E00E94362659 -:1012600083EE9BE065E873E00E943F3283EE9BE0F3 -:1012700061E041E00E94362683EE9BE065E973E081 -:101280000E943F3283EE9BE060E043E00E943626FE -:1012900083EE9BE069EA73E00E943F3283EE9BE0BD -:1012A00061E04AE050E00E94DE3183EE9BE060EBBB -:1012B00073E00E943F3283EE9BE064E04AE050E03E -:1012C0000E94DE3183EE9BE06BE043E00E94362615 -:1012D00083EE9BE062EB73E00E943F3283EE9BE083 -:1012E00060E04AE050E00E94DE3183EE9BE060EB7C -:1012F00073E00E943F3283EE9BE064E04AE050E0FE -:101300000E94DE3183EE9BE069E042E00E943626D7 -:1013100083EE9BE069EB73E00E943F3260918C0B9F -:10132000662339F483EE9BE06BEB73E00E943F325F -:1013300006C083EE9BE04AE050E00E94DE3183EE7F -:101340009BE06AE042E00E943626809112070E94EC -:10135000EA300197D1F36CE271E080E090E00E9406 -:101360002E2E83EE9BE00E945E2683EE9BE060E0E3 -:1013700040E00E94362683EE9BE06DEB73E00E9416 -:101380003F3283EE9BE060E041E00E94362683EE30 -:101390009BE062ED73E00E943F3283EE9BE060E0F1 -:1013A00042E00E94362683EE9BE063EE73E00E94EB -:1013B0003F3283EE9BE060E043E00E94362683EEFE -:1013C0009BE064EF73E00E943F3283EE9BE062E0BB -:1013D00041E00E94362683EE9BE062E141E00E94FC -:1013E000362683EE9BE069EB73E00E943F3260910A -:1013F0008C0B662339F483EE9BE06BEB73E00E9469 -:101400003F3206C083EE9BE04AE050E00E94DE31AE -:1014100083EE9BE063E141E00E9436268091120753 -:101420000E94EA300197D1F36CE271E080E090E035 -:101430000E942E2E83EE9BE00E942826DF91CF9102 -:101440001F910F91FF90EF90DF90CF900895EF9252 -:10145000FF920F931F93CF93DF9360913D0770919D -:101460003E078AEB9CE00E94A92AF82E6091430770 -:10147000709144078AEB9CE00E94A92AE82E809193 -:10148000FA0B882309F058C0FF2089F4C0E0D0E0AF -:1014900080913707BE010E94272F61E070E080E055 -:1014A00090E00E942E2E2196C038D10589F7EE20BB -:1014B00091F4C0E0D0E080913B076FE770E00E94BC -:1014C000272F61E070E080E090E00E942E2E2196B0 -:1014D000C038D10581F7FF20A1F0C0E0D0E00F2D8A -:1014E00010E00CC080913707BE010E94272F61E0F9 -:1014F00070E080E090E00E942E2E21960C171D07D0 -:101500008CF7EE20A9F0C0E0D0E00F2D10E00DC068 -:1015100080913B076E2D70E00E94272F61E070E004 -:1015200080E090E00E942E2E21960C171D0784F774 -:1015300081E08093FA0B2AC0813041F5C0E0D0E011 -:101540000F2D10E078010894E11CF11C0AC0809175 -:1015500037070E94272F61E070E080E090E00E9452 -:101560002E2EB8016C1B7D0B2196CE15DF0579F769 -:101570008091370760E070E00E94272F80913B0741 -:1015800060E070E00E94272F1092FA0B6CE271E08D -:1015900080E090E00E942E2EDF91CF911F910F915D -:1015A000FF90EF9008952F923F924F925F926F922B -:1015B0007F928F929F92AF92BF92CF92DF92EF92E3 -:1015C000FF920F931F93DF93CF93CDB7DEB763974F -:1015D0000FB6F894DEBF0FBECDBF89837B8B6A8BBD -:1015E00000918D0B10918E0B83EE9BE0602F412FAD -:1015F0000E94362683EE9BE068E074E00E943F3252 -:101600008A899B890D969B838A83EA89FB89389610 -:10161000FD83EC838A899B8903969F838E83EA8965 -:10162000FB893E96F987E8878A899B8909969B877B -:101630008A87EA89FB893496FD87EC876AE0262E43 -:10164000312C8A899B89280E391E0B969F878E879D -:10165000EA89FB893C96F98BE88B57E0852E912C23 -:101660008A899B89880E991E46E0642E712C680E2B -:10167000791E35E0432E512C480E591E6C010894FA -:10168000C11CD11C22E0A22EB12CA80EB91E84E1EF -:10169000E82EF12C8091140760E00E94B830809110 -:1016A00022070E94EA30892B59F460912507709136 -:1016B000260780912707909128070E942E2EC7DECB -:1016C0008091140761E00E94B83080910E070E945B -:1016D000EA30892BF9F46CE271E080E090E00E943E -:1016E0002E2E20918D0B80918E0B90E08E9DA0016F -:1016F0008F9D500D9E9D500D1124222309F424E14D -:101700002150FA01E20FF11DE157F44F8081813041 -:10171000A1F724C0809110070E94EA30892B09F5B7 -:101720006CE271E080E090E00E942E2E20918D0B03 -:1017300080918E0B90E08E9DA0018F9D500D9E9DFF -:10174000500D11242F5F243108F020E0FA01E20F40 -:10175000F11DE157F44F80818130A1F720938D0B6B -:101760004FC180910C070E94EA30892B09F56CE289 -:1017700071E080E090E00E942E2E20918E0B8091EF -:101780008D0B482F50E02F5F243008F020E0822F8F -:1017900090E08E9DF0018F9DF00D9E9DF00D112427 -:1017A000E40FF51FE157F44F8081813061F726C0C7 -:1017B00080910A070E94EA30892B19F56CE271E0EA -:1017C00080E090E00E942E2E20918E0B80918D0B58 -:1017D000482F50E0222309F424E02150822F90E08A -:1017E0008E9DF0018F9DF00D9E9DF00D1124E40F54 -:1017F000F51FE157F44F8081813061F720938E0B04 -:10180000FFC0809112070E94EA30892B09F042CF75 -:101810006CE271E080E090E00E942E2E40918E0BF1 -:1018200060918D0B842F90E08E9DF0018F9DF00DC7 -:101830009E9DF00D1124E60FF11DE157F44F8081BC -:10184000813009F0FBC083EE9BE00E94362683EED8 -:101850009BE06AE074E00E943F3282E0C9C0909150 -:101860008D0B9C3031F480918E0B882309F048C099 -:101870001FC0903181F480918E0B882309F049C0FC -:1018800083EE9BE061E040E00E94362683EE9BE021 -:101890006CE074E0AAC0943029F480918E0B882308 -:1018A000F9F406C0983089F480918E0B882301F5F5 -:1018B00083EE9BE061E040E00E94362683EE9BE0F1 -:1018C0006CE074E00E943F3286C0992339F4809125 -:1018D0008E0B813039F58A899B8977C0943031F439 -:1018E00080918E0B8130E1F4C6016FC0983031F4E5 -:1018F00080918E0B8130E1F4C50167C09C3039F4D2 -:1019000080918E0B813031F58E819F815EC0903148 -:1019100039F480918E0B813031F58C859D8555C0D1 -:10192000992331F480918E0B823031F5C2014DC084 -:10193000943031F480918E0B823031F5C30145C073 -:10194000983031F480918E0B823039F5C4013DC05E -:101950009C3039F480918E0B823041F58C819D81D1 -:1019600034C0903139F480918E0B823041F58A85F4 -:101970009B852BC0992331F480918E0B833059F5D0 -:10198000C10123C0943039F480918E0B833019F556 -:101990008E859F851AC0983039F480918E0B8330E4 -:1019A000D1F48889998911C09C3039F480918E0BCB -:1019B000833089F48A819B8108C0903161F48091E1 -:1019C0008E0B833041F48885998561E070E040E0BA -:1019D00050E00E94900383EE9BE060E140E00E94B3 -:1019E000362683EE9BE06BEB73E00E943F3281E092 -:1019F00000918D0B10918E0B823009F04BCE1FC0E1 -:101A000083EE9BE0602F412F0E94362683EE9BE001 -:101A100060E174E00E943F3283EE9BE060918D0BA9 -:101A200040918E0B0E94362683EE9BE068E074E0C6 -:101A30000E943F3299819130D1F611CFFFCF63964A -:101A40000FB6F894DEBF0FBECDBFCF91DF911F91CF -:101A50000F91FF90EF90DF90CF90BF90AF909F904D -:101A60008F907F906F905F904F903F902F90089550 -:101A70001F93182F83EE9BE00E945E2668EC70E0B7 -:101A800080E090E00E942E2E83EE9BE066E040E036 -:101A90000E94362683EE9BE062E174E00E943F32B2 -:101AA00083EE9BE061E041E00E94362683EE9BE0FE -:101AB0006FE174E00E943F3283EE9BE061E042E020 -:101AC0000E94362683EE9BE063E374E00E943F327F -:101AD00083EE9BE061E043E00E94362683EE9BE0CC -:101AE00067E474E00E943F32123079F01330C1F0A5 -:101AF000113011F583EE9BE061E040E00E94362654 -:101B000083EE9BE06AE574E015C083EE9BE061E044 -:101B100040E00E94362683EE9BE06FE574E00AC049 -:101B200083EE9BE060E040E00E94362683EE9BE07F -:101B300064E674E00E943F3283EE9BE063E140E0A4 -:101B40000E94362660918C0B662339F483EE9BE06D -:101B50006BEB73E00E943F3206C083EE9BE04AE0ED -:101B600050E00E94DE3110928D0B81E080938E0B4D -:101B7000EFE8FBE0DF0198961082148A1C925496DD -:101B80001C925497319611968BE0E33AF807A1F72F -:101B900081E08083848B80A78783838F87A7868754 -:101BA00082A386AB80E060E070E0FDDC80918D0B6D -:101BB000882349F480918E0B813001F18230F1F05D -:101BC000833031F51BC0873071F480918E0B8130EA -:101BD00011F484E013C0823011F485E00FC083302B -:101BE000B9F486E00BC08E3099F480918E0B813071 -:101BF00011F487E003C0823021F488E080938C0BDD -:101C000007C020E030E0833029F421E030E002C05A -:101C100020E030E0C9011F910895EF92FF920F93E9 -:101C20001F93CF93DF9382E023DF019719F421E024 -:101C300030E09AC083EE9BE00E945E2678E8E72EB3 -:101C400077E0F72E00E010E0C0E0D0E080918C0B50 -:101C50008430E1F0853038F4823081F0833090F4C4 -:101C6000813079F509C08630C9F0863098F0873028 -:101C7000C9F0883031F51AC08E0123C08E010050A2 -:101C80001E4F1FC08E0100501C4F1BC08E01005004 -:101C90001A4F17C08E010050184F13C08E0100500C -:101CA000164F0FC08E010050144F0BC08091450796 -:101CB000909146078E010050124F801791070CF447 -:101CC0008C018AEB9CE0B8010E94A92AF70180836D -:101CD0001182E091BD0CF091BE0CEC0FFD1F8083D2 -:101CE000219682E090E0E80EF91E92E0C030D9071C -:101CF00009F0ACCF83EE9BE00E945E2683EE9BE072 -:101D000063E041E00E94362683EE9BE06FE673E0DD -:101D10000E943F3283EE9BE063E042E00E94362661 -:101D200083EE9BE06EE773E00E943F3283EE9BE020 -:101D300060918C0B4AE050E00E94DE3183EE9BE024 -:101D400063E143E00E94362683EE9BE00E9420265A -:101D500068EE73E080E090E00E942E2E83EE9BE020 -:101D60000E94282620E030E0C901DF91CF911F9129 -:101D70000F91FF90EF90089560913F077091400799 -:101D80008AEB9CE00E94A92A682F863908F466E94C -:101D90008091390770E00C94272F1F9360913D07C5 -:101DA00070913E078AEB9CE00E94A92A182F80912F -:101DB0003707612F70E00E94272F112319F410922A -:101DC000FA0B03C081E08093FA0B1F9108950F93E3 -:101DD0001F93CF93DF9383EE9BE00E945E2683EEFA -:101DE0009BE061E041E00E94362683EE9BE06AE6DC -:101DF00074E00E943F3283EE9BE061E042E00E948B -:101E0000362683EE9BE06EE674E00E943F3283EE5E -:101E10009BE063E142E00E94362683EE9BE00E9455 -:101E2000202608E817E0C0E0D0E017C08AEB9CE06D -:101E3000BE0140E00E94B02A82E0C030D80754F4CE -:101E4000F80111821082E091BD0CF091BE0CEC0FF4 -:101E5000FD1F108221960E5F1F4F809145079091C4 -:101E600046078C179D0714F783EE9BE00E945E26C1 -:101E700083EE9BE00E94282683EE9BE062E042E036 -:101E80000E94362683EE9BE061E874E00E943F32B8 -:101E900083EE9BE062E041E00E94362683EE9BE009 -:101EA0006AE674E00E943F3210928C0B68EE73E099 -:101EB00080E090E00E942E2EDF91CF911F910F9134 -:101EC0000895EF92FF920F931F93CF93DF9383E0D8 -:101ED000CFDD019719F421E030E0C7C083EE9BE02D -:101EE0000E945E2683EE9BE061E041E00E94362680 -:101EF00083EE9BE06EE674E00E943F3283EE9BE04F -:101F000061E042E00E94362683EE9BE06EE773E0DC -:101F10000E943F3283EE9BE067E042E00E9436265B -:101F200083EE9BE060918C0B4AE050E00E94DE3132 -:101F300083EE9BE063E143E00E94362683EE9BE064 -:101F40000E942026E6E8EE2EE7E0FE2E00E010E0FC -:101F5000C0E0D0E0F70111821082E091BD0CF09159 -:101F6000BE0CEC0FFD1F108280918C0B8430E1F0D1 -:101F7000853038F4823081F0833090F4813079F507 -:101F800009C08630C9F0863098F08730C9F08830B3 -:101F900031F51AC08E0123C08E0100501E4F1FC0A4 -:101FA0008E0100501C4F1BC08E0100501A4F17C0ED -:101FB0008E010050184F13C08E010050164F0FC0F5 -:101FC0008E010050144F0BC0809145079091460739 -:101FD0008E010050124F801791070CF48C018AEB90 -:101FE0009CE0B80140E00E94B02A219682E090E097 -:101FF000E80EF91E92E0C030D90709F0ABCF83EEAE -:102000009BE00E945E2683EE9BE062E041E00E943E -:10201000362683EE9BE061E874E00E943F3283EE57 -:102020009BE062E042E00E94362683EE9BE06EE792 -:1020300073E00E943F3283EE9BE060918C0B4AE09C -:1020400050E00E94DE3183EE9BE063E143E00E94BA -:10205000362668EE73E080E090E00E942E2E83EE3C -:102060009BE00E94282620E030E0C901DF91CF915B -:102070001F910F91FF90EF900895EF92FF920F93B1 -:102080001F93CF93DF9381E0F3DC019719F421E0F4 -:1020900030E0BFC083EE9BE00E945E2683EE9BE0B3 -:1020A00061E041E00E94362683EE9BE061E974E046 -:1020B0000E943F3283EE9BE061E042E00E943626C0 -:1020C00083EE9BE06EE773E00E943F3283EE9BE07D -:1020D00067E042E00E94362683EE9BE060918C0B25 -:1020E0004AE050E00E94DE3183EE9BE063E143E092 -:1020F0000E94362683EE9BE00E942026F8E8EF2E11 -:10210000F7E0FF2EC0E0D0E000E010E080918C0B03 -:102110008430E1F0853038F4823081F0833090F4FF -:10212000813079F509C08630C9F0863098F0873063 -:10213000C9F0883031F51AC0E80123C0E801C05069 -:10214000DE4F1FC0E801C050DC4F1BC0E801C0508B -:10215000DA4F17C0E801C050D84F13C0E801C05093 -:10216000D64F0FC0E801C050D44F0BC08091450737 -:1021700090914607E801C050D24F8C179D070CF490 -:10218000EC010F5F1F4F8AEB9CE0BE01F70140811D -:102190000E94B02A82E090E0E80EF91E92E0003042 -:1021A000190709F0B3CF83EE9BE00E945E2683EE11 -:1021B0009BE063E041E00E94362683EE9BE062EA0A -:1021C00074E00E943F3283EE9BE063E042E00E94B5 -:1021D000362683EE9BE06EE773E00E943F3283EE8B -:1021E0009BE060918C0B4AE050E00E94DE3183EE70 -:1021F0009BE063E143E00E94362668EE73E080E0F6 -:1022000090E00E942E2E83EE9BE00E94282620E084 -:1022100030E0C901DF91CF911F910F91FF90EF90B6 -:10222000089583EE9BE00E945E2683EE9BE060E0D3 -:1022300040E00E94362683EE9BE060EB74E00E9453 -:102240003F3260918C0B662339F483EE9BE06BEB9D -:1022500073E00E943F3206C083EE9BE04AE050E00C -:102260000E94DE3183EE9BE061E041E00E94362671 -:1022700083EE9BE06AE574E00E943F3283EE9BE0D0 -:1022800061E042E00E94362683EE9BE06FE574E059 -:102290000E943F3283EE9BE061E043E00E943626DD -:1022A00083EE9BE064E674E00E943F3283EE9BE0A5 -:1022B00067E042E00E94362683EE9BE063EC74E028 -:1022C0000E943F3283EE9BE067E041E00E943626A9 -:1022D00083EE9BE06CEC74E00E943F3283EE9BE067 -:1022E00060E143E00E94362683EE9BE065ED74E0FA -:1022F0000E943F3283EE9BE067E043E00E94362677 -:1023000083EE9BE06AED74E00E943F3210928D0BE9 -:1023100081E080938E0BEFE8FBE0DF01989610825E -:10232000148A1C9254961C925497319611968BE005 -:10233000E33AF807A1F781E08083848B80A7828F3E -:1023400086A7868387AB80E060E070E02CD980911F -:102350008D0B882381F480918E0B823029F45DDC13 -:10236000019709F45ECF0895833061F4AADD0197E7 -:1023700009F457CF08958630A9F480918E0B8230EE -:1023800041F425CD813071F478DE019709F449CF0D -:102390000895833011F40C94E406813019F40E94FE -:1023A0004F03D1CF08958F929F92AF92BF92CF9259 -:1023B000DF92EF92FF920F931F93CF93DF930AE088 -:1023C000C02E1BE0D12EB8E08B2E912CA6E9AA2EB0 -:1023D000B12CCFEFD0E060913D0770913E078AEBC2 -:1023E0009CE00E94A92A082F60913F077091400746 -:1023F0008AEB9CE00E94A92AF82E60914107709117 -:1024000042078AEB9CE00E94A92AE82E60914307CC -:10241000709144078AEB9CE00E94A92A182F83EE52 -:102420009BE00E945E2683EE9BE060E040E00E941D -:10243000362683EE9BE063EE74E00E943F32812FEC -:1024400090E06BE070E040E050E00E94900383EE8B -:102450009BE06FE042E00E94362683EE9BE06EEE4A -:1024600074E00E943F3283EE9BE060E041E00E9416 -:10247000362683EE9BE064EF74E00E943F32802FAB -:1024800090E06BE070E041E050E00E94900383EE4A -:102490009BE061E042E00E94362683EE9BE06FEF16 -:1024A00074E00E943F328F2D90E06BE070E042E0DC -:1024B00050E00E94900383EE9BE06FE043E00E94B7 -:1024C000362683EE9BE065ED74E00E943F3283EE9A -:1024D0009BE061E043E00E94362683EE9BE069E0EA -:1024E00075E00E943F328E2D8150883068F083EE77 -:1024F0009BE06BE043E00E94362683EE9BE06CE0BD -:1025000074E00E943F3208C08E2D90E06BE070E0D6 -:1025100043E050E00E949003C0928D0B81E08093D5 -:102520008E0BEFE8FBE0DF0198961082148A1C9274 -:1025300054961C925497319611962BE0E33AF20789 -:10254000A1F781E08287868F82AB8093990B86AB5F -:1025500082A380E060E070E026D880918D0B8A3005 -:1025600009F0E1C180918E0B813009F081C0809328 -:10257000E00BD092DF0B0E9492058091E10B9091CD -:10258000E20B22E0883C920709F045C083EE9BE015 -:102590006AE041E00E94362683EE9BE064E072E050 -:1025A0000E943F328091180760E00E94B83083EEAD -:1025B0009BE00E942026809122070E94EA3001972A -:1025C00009F0C2C1809112070E94EA30019709F018 -:1025D000BBC1809129070E94F32E64E070E00E9445 -:1025E0006032CB016093E10B9093E20B6BE070E003 -:1025F00041E050E00E9490036091E10B7091E20B8A -:10260000809137070E94272F62E370E080E090E01E -:102610000E942E2ED0CF8F3F910569F064F0D093A9 -:10262000E20BC093E10B8FEF90E06BE070E041E0D4 -:1026300050E00E9490036091E10B7091E20B809159 -:1026400037070E94272F4091E10B5091E20B411573 -:10265000510519F41092FA0B06C0141615061CF455 -:1026600081E08093FA0B60913D0770913E0784C032 -:10267000882309F084C01092E00BD092DF0B81E038 -:102680000E9492058091E10B9091E20B22E0883C40 -:10269000920709F045C083EE9BE06AE040E00E94AB -:1026A000362683EE9BE064E072E00E943F32809128 -:1026B000180760E00E94B83083EE9BE00E9420265D -:1026C000809122070E94EA30019709F04DC1809164 -:1026D00012070E94EA30019709F046C1809129074C -:1026E0000E94F32E64E070E00E946032CB016093A0 -:1026F000E10B9093E20B6BE070E040E050E00E9451 -:1027000090036091E10B7091E20B80913B070E9476 -:10271000272F62E370E080E090E00E942E2ED0CF61 -:102720008F3F910569F064F0D093E20BC093E10B09 -:102730008FEF90E06BE070E040E050E00E9490038B -:102740006091E10B7091E20B80913B070E94272F73 -:102750004091E10B5091E20B4115510519F4109293 -:10276000FA0B06C0141615061CF481E08093FA0BD0 -:1027700060914307709144078AEB9CE0D1C082309E -:1027800009F098C08093E00BD092DF0B81E00E94AB -:1027900092058091E10B9091E20B22E0883C920738 -:1027A00009F058C083EE9BE06AE042E00E943626C2 -:1027B00083EE9BE064E072E00E943F328091180754 -:1027C00060E00E94B83083EE9BE00E94202623C088 -:1027D0006BE070E042E050E00E9490036091E10BFA -:1027E0007091E20B809139070E94272F8091E10BB5 -:1027F0009091E20B8539910544F486E990E06BE015 -:1028000070E042E050E00E94900362E370E080E0FC -:1028100090E00E942E2E809122070E94EA300197BC -:1028200009F0B2C0809112070E94EA30019709F0C6 -:10283000ABC0809129070E94F32E64E070E00E94F3 -:102840006032CB017093E20B6093E10B6639710546 -:102850006CF2BECF8F3F910569F064F0D093E20B2C -:10286000C093E10B8FEF90E06BE070E042E050E04E -:102870000E9490038091E10B9091E20B86399105C3 -:1028800064F4B092E20BA092E10B86E990E06BE079 -:1028900070E042E050E00E9490036091E10B709183 -:1028A000E20B809139070E94272F60913F077091BA -:1028B000400732C0833009F04CCE8093E00BD092B9 -:1028C000DF0B81E00E9492058091E10B9091E20B79 -:1028D000099764F09092E20B8092E10B88E090E01F -:1028E0006BE070E043E050E00E9490038091E10BC8 -:1028F0009091E20B892B61F483EE9BE06BE043E067 -:102900000E94362683EE9BE06CE074E00E943F322A -:1029100060914107709142078AEB9CE04091E10B86 -:102920000E94B02A16CE8E3009F013CE80918E0B05 -:10293000833011F439D00DCE823009F00ACE0E94D6 -:10294000CA080E942A0747CD83EE9BE00E942826F2 -:102950008091180761E00E94B8306CE271E080E07D -:1029600090E00E942E2E6FCE83EE9BE00E942826E0 -:102970008091180761E00E94B8306CE271E080E05D -:1029800090E00E942E2EE4CE83EE9BE00E9428264B -:102990008091180761E00E94B8306CE271E080E03D -:1029A00090E00E942E2E81CF83EE9BE00E945E2657 -:1029B00083EE9BE062E140E00E94362683EE9BE0DE -:1029C00069EB73E00E943F3260918C0B662339F40F -:1029D00083EE9BE06BEB73E00E943F3206C083EE18 -:1029E0009BE04AE050E00E94DE3183EE9BE062E033 -:1029F00040E00E94362683EE9BE063E175E00E9492 -:102A00003F3283EE9BE062E041E00E94362683EE97 -:102A10009BE06BE175E00E943F3283EE9BE062E059 -:102A200042E00E94362683EE9BE063E275E00E945E -:102A30003F3283EE9BE062E043E00E94362683EE65 -:102A40009BE06AE275E00E943F3283EE9BE06BE020 -:102A500043E00E94362683EE9BE061E375E00E942E -:102A60003F3283EE9BE06BE040E00E94362683EE2F -:102A70009BE06AE375E00E943F3283EE9BE06BE0EF -:102A800042E00E94362683EE9BE061E475E00E94FE -:102A90003F3283EE9BE06BE041E00E94362683EEFE -:102AA0009BE06BE475E00E943F3281E080938D0BE8 -:102AB00082E080938E0BEFE8FBE0DF0198961082B6 -:102AC000148A1C9254961C925497319611968BE05E -:102AD000E33AF807A1F781E08183858B81A782AB78 -:102AE0008093990B868F82878093900B80E060E0C3 -:102AF00070E00E94D30A80918D0B813029F480917F -:102B00008E0B813009F499D280918D0B813029F49C -:102B100080918E0B823009F43AD080918D0B8130F8 -:102B200029F480918E0B833009F4A4D480918D0B0D -:102B30008A3029F480918E0B833009F49ED68091DF -:102B40008D0B8A3029F480918E0B882309F42BDCBD -:102B500080918D0B8A3031F480918E0B823011F48C -:102B60000E949F2080918D0B813031F480918E0BDB -:102B7000882311F40E94AB1E80918D0B8A3031F4B2 -:102B800080918E0B813011F44CDB0ECF08952F9283 -:102B90003F924F925F926F927F928F929F92AF92ED -:102BA000BF92CF92DF92EF92FF920F931F93DF932A -:102BB000CF93CDB7DEB760970FB6F894DEBF0FBEE8 -:102BC000CDBF81E090E09093090780930807988B30 -:102BD0008F8711E00DE004C021E030E0388B2F87B3 -:102BE00083EE9BE00E945E2683EE9BE060E040E087 -:102BF0000E94362683EE9BE062E575E00E943F323C -:102C000083EE9BE067E040E00E94362660918C0BEB -:102C1000662339F483EE9BE06BEB73E00E943F3256 -:102C200006C083EE9BE04AE050E00E94DE318F85D3 -:102C300098890E94AD043CE030938D0B10928E0B6E -:102C4000EFE8FBE0DF0198961082148A1C925496FC -:102C50001C925497319611968BE0E33AF807A1F74E -:102C60001093930B1093970B10939B0B10939F0B48 -:102C70001083148310871487108B148B108F148F7C -:102C800010A314A310A714A710AB14AB10AFEF85BB -:102C9000F8893C96FA83E9832F853889295F3F4F6D -:102CA0003C832B838F85988902969E838D83EF8545 -:102CB000F8893D96F887EF832F853889285F3F4F45 -:102CC0003A8729878F85988903969C878B87EF851C -:102CD000F8893E96FE87ED87F9E02F2E312C2F855F -:102CE0003889220E331EE4E04E2E512C420E531E24 -:102CF0007AE0672E712C620E731E65E0862E912C91 -:102D0000820E931E59010894A11CB11C56E0C52ED9 -:102D1000D12CC20ED31E4BE0E42EF12CE20EF31E9A -:102D200081E06F8578890E94D30A90918D0B943051 -:102D300039F480918E0B882309F080C072DA50CF6D -:102D4000983039F480918E0B882309F082C02CDEF4 -:102D500047CF9C3091F580918E0B882309F082C07B -:102D60001092E00B0093DF0B8F8598899093E20B14 -:102D70008093E10B80E00E9492058091E10B90919D -:102D8000E20B835F914034F022EF31E03093E20BAD -:102D90002093E10B8091E10B9091E20B892B31F4B0 -:102DA00081E090E09093E20B8093E10BE091E10BE6 -:102DB000F091E20BF88BEF8713CF9031A1F5809162 -:102DC0008E0B882309F05BC01092E00BF1E1F093C9 -:102DD000DF0B2F8538892130310539F48FE090E001 -:102DE0009093E20B8093E10B0AC0EF85F8893E9740 -:102DF000F093E20BE093E10B80E00E94920560917A -:102E0000E10B7091E20BF2E061307F071CF022EFE2 -:102E100031E0E4CE6F3071050CF4DECECB010E97BD -:102E2000988B8F87DDCE992339F480918E0B81307A -:102E300089F5EF85F8891CC0943049F480918E0B98 -:102E4000813099F5B0920907A092080788C09830A0 -:102E500039F480918E0B813099F52D813E817BC0B4 -:102E60009C3059F480918E0B813099F5EB85FC856F -:102E7000F0930907E093080772C0903149F48091FC -:102E80008E0B813079F5509209074092080767C090 -:102E9000992349F480918E0B823079F5909209073D -:102EA000809208075CC0943049F480918E0B823088 -:102EB00079F5D0920907C092080751C0983039F4CB -:102EC00080918E0B823079F52B813C8144C09C30FF -:102ED00039F480918E0B823079F5E985FA85C8CF77 -:102EE000903149F480918E0B823079F53092090748 -:102EF0002092080734C0992349F480918E0B8330C7 -:102F000071F5709209076092080729C0943049F45E -:102F100080918E0B833019F5F0920907E092080733 -:102F20001EC0983039F480918E0B8330C1F4298112 -:102F30003A8111C09C3039F480918E0B833079F442 -:102F4000EF81F88595CF903151F480918E0B8330CD -:102F500031F42D853E853093090720930807809131 -:102F60008E0B8093E00B9F5F9093DF0BE09108073F -:102F7000F0910907EE0FFF1FEA57F84F808191810A -:102F80009093E20B8093E10B81E00E949205809187 -:102F9000E10B9091E20B8456924039F40E94440474 -:102FA0008091DF0B84508093DF0B8091E10B909137 -:102FB000E20BE2E0883C9E0769F48091DF0B8250CF -:102FC0006091E00B0E94CC038091DF0B84508093D2 -:102FD000DF0BA6CE8F3F910599F094F02FEF30E0F4 -:102FE0003093E20B2093E10B6091DF0B70E06E5F9A -:102FF0007F4F4091E00B8FEF90E050E00E949003F4 -:1030000080910807909109070197E091BD0CF0911C -:10301000BE0CE80FF91F8091E10B8083E091080757 -:10302000F0910907EE0FFF1FEA57F84F8091E10B6F -:103030009091E20B9183808373CEBF92CF92DF9207 -:10304000EF92FF920F931F93CF93DF93C1E0D0E0F5 -:1030500048E0B42E09E0E12C32E0F32E2FEFC22E2F -:10306000D12CD0930907C093080783EE9BE00E9400 -:103070005E2683EE9BE060E040E00E94362683EE11 -:103080009BE064E675E00E943F3260918C0B662302 -:1030900039F483EE9BE06BEB73E00E943F3206C095 -:1030A00083EE9BE04AE050E00E94DE3183EE9BE03D -:1030B0006EE042E00E94362683EE9BE065ED74E010 -:1030C0000E943F3283EE9BE06EE043E00E94362692 -:1030D00083EE9BE06BE475E00E943F3283EE9BE061 -:1030E00060E042E00E94362683EE9BE068E775E0F0 -:1030F0000E943F3283EE9BE062E043E00E9436266E -:1031000083EE9BE065E875E00E943F32809188077E -:103110009091890769E070E043E050E00E949003DD -:1031200083EE9BE060E041E00E94362683EE9BE068 -:103130006CE875E00E943F3280918A0790918B077E -:1031400066E070E041E050E00E94900383EE9BE077 -:103150006BE041E00E94362683EE9BE063E975E078 -:103160000E943F3280918C0790918D0761E170E061 -:1031700041E050E00E949003B0928D0B82E080937A -:103180008E0BEFE8FBE0DF0198961082148A1C9208 -:1031900054961C925497319611962BE0E33AF2071D -:1031A000A1F781E0848F80AB81A385AB80E060E0F4 -:1031B00070E00E94D30A80918D0B883009F0E9C03D -:1031C00010918E0B123009F0E4C0809108079091A5 -:1031D000090769E070E042E050E00E94900310931C -:1031E000E00B0093DF0B8091080790910907909303 -:1031F000E20B8093E10B80E00E9492058091E10B4D -:103200009091E20B8150924064F0F092E20BE092D8 -:10321000E10B80E092E069E070E042E050E00E9463 -:1032200090038091E10B9091E20B1816190664F05F -:10323000D093E20BC093E10B81E090E069E070E095 -:1032400042E050E00E949003E091E10BF091E20B2C -:10325000F0930907E0930807EE0FFF1FEA57F84FB6 -:103260008081918169E070E043E050E00E9490032A -:103270008091080790910907019721F582E090E07D -:1032800061E070E041E050E00E94900380918A0785 -:1032900090918B0766E070E041E050E00E9490035F -:1032A00083E090E06CE070E041E050E00E94900329 -:1032B00080918C0790918D0761E170E041E050E0D2 -:1032C0000E949003809108079091090780509240D6 -:1032D00021F58EEF91E061E070E041E050E00E9466 -:1032E00090038091820B9091830B66E070E041E047 -:1032F00050E00E9490038FEF91E06CE070E041E0BD -:1033000050E00E9490038091840B9091850B61E1C5 -:1033100070E041E050E00E94900320910807309156 -:103320000907C90102978E5F914098F5C90101977D -:1033300061E070E041E050E00E949003E0910807F6 -:10334000F0910907EE0FFF1FEC57F84F8081918134 -:1033500066E070E041E050E00E9490038091080731 -:103360009091090701966CE070E041E050E00E9406 -:103370009003E0910807F0910907EE0FFF1FE8574F -:10338000F84F8081918161E170E041E050E00E945E -:10339000900380918D0B883009F05DC080918E0B79 -:1033A000833009F003CF8093E00B0093DF0BE091B3 -:1033B0000807F0910907EE0FFF1FEA57F84F8081C9 -:1033C00091819093E20B8093E10B81E00E94920542 -:1033D0008091E10B9091E20B8456924011F40E948F -:1033E00044048091E10B9091E20B42E0883C940709 -:1033F00029F489E063E00E94CC03D8CE8F3F910589 -:1034000069F064F0D092E20BC092E10B8FEF90E094 -:1034100069E070E043E050E00E949003809108076B -:10342000909109070197E091BD0CF091BE0CE80F57 -:10343000F91F8091E10B8083E0910807F091090763 -:10344000EE0FFF1FEA57F84F8091E10B9091E20BCE -:1034500091838083ABCE8D3009F0A8CE80918E0B06 -:10346000833019F40E941111FCCD823009F09ECEF8 -:103470009BDA9CCE2F923F924F925F926F927F92F7 -:103480008F929F92AF92BF92CF92DF92EF92FF9274 -:103490000F931F93DF93CF9300D000D0CDB7DEB74B -:1034A00083EE9BE00E945E2683EE9BE060E040E0BE -:1034B0000E94362683EE9BE06AE975E00E943F3267 -:1034C00083EE9BE063E041E00E94362683EE9BE0C2 -:1034D00067EA75E00E943F3283EE9BE060E042E0E5 -:1034E0000E94362683EE9BE067EB75E00E943F3238 -:1034F00083EE9BE060E043E00E94362683EE9BE093 -:103500006BEC75E00E943F3281E090E069E070E092 -:1035100041E050E00E94900381E090E069E070E0BB -:1035200042E050E00E94900380E090E069E070E0AB -:1035300043E050E00E94900388E080938D0B81E08F -:1035400080938E0B21E030E040E050E029833A8305 -:103550004B835C83F1E08F2E912CA12CB12C442461 -:1035600055243201EFE8FBE0DF0198961082148ABF -:103570001C9254961C925497319611963BE0E33A74 -:10358000F307A1F741E04087448F40AB42A346AB2D -:1035900080E060E070E00E94D30A80918D0B8E3055 -:1035A000C1F480918E0B8230A1F4A8E8B7E020E04E -:1035B00030E0E091BD0CF091BE0CE20FF31F8C9156 -:1035C00080832F5F3F4F129652E02030350789F7F6 -:1035D000EBD980918D0B8E3009F09DC080918E0BC0 -:1035E000833009F0B9C0140183EE9BE06FE043E043 -:1035F0000E94362683EE9BE060EE75E00E943F322B -:1036000083EE9BE00E94202680E090E0E091BD0CDC -:10361000F091BE0CE80FF91F10820196A2E08130F4 -:103620009A07A1F7610154C0ED81FE813196FE83B6 -:10363000ED83E451F54009F050C00894E11CF11C01 -:10364000011D111D89819A81AB81BC81E816F906A3 -:103650000A071B0709F03FC0C601AA2797FDA095DE -:10366000BA2F481659066A067B060CF46101C6019A -:1036700069E070E040E050E00E94900383EE9BE040 -:1036800063E143E00E943626A50194010DC0C90103 -:103690000197E091BD0CF091BE0CE80FF91F10826C -:1036A0002F5F3F4F4F4F5F4F42165306640675061C -:1036B00074F70894C108D108E091BD0CF091BE0CDC -:1036C000EC0DFD1D9FEF9083A2E0B0E0CA0EDB1E63 -:1036D000EE24FF2487011E821D82809112070E9422 -:1036E000EA30019709F4A0CF83EE9BE00E942826E0 -:1036F00083EE9BE06FE043E00E94362683EE9BE082 -:1037000066EE75E00E943F326CE271E080E090E08E -:103710000E942E2E27CF8830F9F480918E0B8130B5 -:10372000D9F48093E00BB9E0B093DF0BE981FA8123 -:10373000F093E20BE093E10B80E00E949205809110 -:10374000E10B9091E20B9C01442737FD4095542FEB -:1037500029833A834B835C8380918D0B883009F0F9 -:1037600042C080918E0B8230F1F58093E00B39E0FE -:103770003093DF0B9092E20B8092E10B80E00E948D -:1037800092058091E10B9091E20B4C01AA2497FCE9 -:10379000A094BA2C81149104A104B10471F481E0C5 -:1037A00090E069E070E042E050E00E949003E1E0C8 -:1037B0008E2E912CA12CB12C16C041E0841642E033 -:1037C000940640E0A40640E0B4066CF080E092E08D -:1037D00069E070E042E050E00E949003812C72E0CA -:1037E000972EA12CB12C80918D0B883009F0BACE88 -:1037F00080918E0B833009F0B5CE8093E00B59E0B9 -:103800005093DF0B5092E20B4092E10B80E00E945C -:1038100092058091E10B9091E20B2C01662457FCFC -:103820006094762C411451046104710471F481E0B8 -:1038300090E069E070E043E050E00E94900361E0B6 -:10384000462E512C612C712C8DCE81E0481682E0E1 -:10385000580680E0680680E078060CF483CE80E0AD -:1038600092E069E070E043E050E00E949003412C58 -:1038700052E0552E612C712C75CE2F923F924F92B3 -:103880005F926F927F928F929F92AF92BF92CF92F0 -:10389000DF92EF92FF920F931F93DF93CF93CDB7F9 -:1038A000DEB728970FB6F894DEBF0FBECDBF81E01C -:1038B00090E098878F83662477244301AA24BB2451 -:1038C0006501AFEFB0E0BA83A98383EE9BE00E946D -:1038D0005E2683EE9BE060E040E00E94362683EEA9 -:1038E0009BE06CEE75E00E943F3283EE9BE061E06E -:1038F00040E00E94362660918C0B662339F483EEFB -:103900009BE06BEB73E00E943F3206C083EE9BE0CE -:103910004AE050E00E94DE3183EE9BE060E041E04F -:103920000E94362683EE9BE065EF75E00E943F32F1 -:1039300083EE9BE060E042E00E94362683EE9BE04F -:1039400068E076E00E943F3283EE9BE060E043E077 -:103950000E94362683EE9BE06DE176E00E943F32C6 -:1039600089819A8169E070E040E050E00E94900314 -:103970008F81988569E070E041E050E00E949003FB -:10398000C30169E070E042E050E00E949003C5018D -:1039900069E070E043E050E00E949003B8E0B0932B -:1039A0008D0B10928E0BEFE8FBE0DF0198961082F2 -:1039B000148A1C9254961C925497319611962BE0BF -:1039C000E33AF207A1F781E0808780AB848F858797 -:1039D00081A385AB8093970B80E060E070E00E944C -:1039E000D30A80918D0B8D3031F480918E0B813014 -:1039F00011F40E94D41480918D0B8D3009F0AEC06B -:103A000080918E0B823019F40E9411115ECF8330A9 -:103A100009F0DEC0C601B501A40193010E94413244 -:103A200061507240804090405CF083EE9BE06DE01E -:103A300040E00E94362683EE9BE061E376E08BC097 -:103A400083EE9BE06DE040E00E94362683EE9BE033 -:103A500069E376E00E943F3283EE9BE06EE043E054 -:103A60000E94362683EE9BE061E476E00E943F32BE -:103A700091E0E92EF12C012D112D8F819885AA2737 -:103A800097FDA095BA2F8B839C83AD83BE8347C0DF -:103A900091E0E916F1040105110509F057C12B80E9 -:103AA0003C804D805E80A1E02A16A2E03A06A0E0AC -:103AB0004A06A0E05A0634F0261837084808590884 -:103AC0008601750183EE9BE061E140E00E943626AD -:103AD00083EE9BE0B201A1012AE030E00E94EF31C9 -:103AE00065E070E080E090E00E942E2EC101019719 -:103AF0002091BD0C3091BE0C280F391F8981F9012E -:103B00008083F101EE0FFF1FEA57F84FA981BA81B8 -:103B1000B183A0830894E11CF11C011D111DAE149A -:103B2000BF04C006D1060CF0B3CF83EE9BE06DE07E -:103B300040E00E94362683EE9BE068E476E00E9437 -:103B40003F3283EE9BE06EE043E00E94362683EE38 -:103B50009BE06CE476E00E943F3225CF8830C1F5CF -:103B600080918E0B8130A1F58093E00BB9E0B0938A -:103B7000DF0BEF81F885F093E20BE093E10B80E03F -:103B80000E9492058091E10B9091E20B98878F83C0 -:103B9000892B69F481E090E069E070E041E050E059 -:103BA0000E949003A1E0B0E0B887AF8311C0EF811D -:103BB000F885E150F24064F080E092E069E070E066 -:103BC00041E050E00E94900380E092E098878F836C -:103BD00080918D0B883009F042C080918E0B82302D -:103BE000F1F58093E00B99E09093DF0B7092E20B7C -:103BF0006092E10B80E00E9492058091E10B909130 -:103C0000E20B3C01882477FC8094982C61147104A9 -:103C10008104910471F481E090E069E070E042E099 -:103C200050E00E94900301E0602E712C812C912CB9 -:103C300016C0A1E06A16A2E07A06A0E08A06A0E01B -:103C40009A066CF080E092E069E070E042E050E0BB -:103C50000E949003612C12E0712E812C912C809196 -:103C60008D0B883009F042C080918E0B8330F1F5C6 -:103C70008093E00BB9E0B093DF0BB092E20BA0921F -:103C8000E10B80E00E9492058091E10B9091E20BA4 -:103C90005C01CC24B7FCC094DC2CA114B104C10499 -:103CA000D10471F481E090E069E070E043E050E01D -:103CB0000E949003B1E0AB2EB12CC12CD12C16C0C8 -:103CC000E1E0AE16E2E0BE06E0E0CE06E0E0DE06B1 -:103CD0006CF080E092E069E070E043E050E00E9428 -:103CE0009003A12CA2E0BA2EC12CD12C80918D0B77 -:103CF000883009F058CE80918E0B882309F053CE7E -:103D00001092E00BF9E0F093DF0B89819A81909398 -:103D1000E20B8093E10B81E00E949205A091E10B00 -:103D2000B091E20BBA83A983AF3FB10509F00CF45F -:103D30003ACE8FEF90E069E070E040E050E00E9402 -:103D40009003EFEFF0E0FA83E9832DCE260C371CC9 -:103D5000481C591CA8CE7F928F929F92AF92BF921F -:103D6000CF92DF92EF92FF920F931F93DF93CF9347 -:103D7000CDB7DEB764970FB6F894DEBF0FBECDBFE8 -:103D800083EE9BE09BD783EE9BE060E040E06ED744 -:103D900083EE9BE063E576E00E943F3283EE9BE09A -:103DA00065E041E063D783EE9BE067E676E00E9442 -:103DB0003F3283EE9BE069E042E058D783EE9BE020 -:103DC00067E776E00E943F3283EE9BE060E043E0ED -:103DD0004DD783EE9BE06DE776E00E943F3284E0B2 -:103DE00080938D0B83E080938E0BAFE8BBE0FD01E9 -:103DF000B8961C9254961C9254971082148A11966D -:103E000031962BE0A33AB207A1F79E012F5F3F4FF7 -:103E100084E1F90111928A95E9F781E08093930B8F -:103E20009C968C939C97D7968C9355E0752E43E186 -:103E3000842E912C8C0E9D1E69012FEFA22E21E065 -:103E4000B22E80E060E070E00E94D30A80918D0B7A -:103E50008F3031F480918E0B833011F40E94D41492 -:103E600080918D0B843009F056C180918E0B882390 -:103E700009F0F5C083EE9BE0E3D683EE9BE065E0BE -:103E800040E0F4D615E0FF24D9C0809110070E94CD -:103E9000EA30892B79F46AEF70E080E090E00E94CC -:103EA0002E2E1F5F1E3008F015E083EE9BE0612F81 -:103EB00040E0DCD680910E070E94EA30892B79F42D -:103EC0006AEF70E080E090E00E942E2E11501530D5 -:103ED00008F41DE083EE9BE0612F40E0C7D680919F -:103EE0000A070E94EA30892B11F000E014C06AEF43 -:103EF00070E080E090E00E942E2E83EE9BE062E96D -:103F000076E00E943F3283EE9BE0612F40E0AED628 -:103F100001E0FF24F39480910C070E94EA30892B82 -:103F200099F46AEF70E080E090E00E942E2E83EE1C -:103F30009BE064E976E00E943F3283EE9BE0612FD4 -:103F400040E094D6FF2403C0013009F077C0193057 -:103F500019F11A3060F41630B1F0173018F415303A -:103F600049F50EC0173091F0183021F512C01B3002 -:103F7000C9F01B30A0F01C30C1F01D30D9F418C0BE -:103F8000FB821C8217C0FD821E8214C0FF8218862D -:103F900011C0F9861A860EC0FB861C860BC0FD86F2 -:103FA0001E8608C0FF86188A05C0F98A1A8A02C0D0 -:103FB000FB8A1C8A20E030E08B819C81019711F400 -:103FC00021E030E08D819E81019711F42E5F3F4FFB -:103FD0008F819885019711F42C5F3F4F89859A85D1 -:103FE000019711F4285F3F4F8B859C85019711F451 -:103FF000205F3F4F8D859E85019711F4205E3F4FD6 -:104000008F859889019711F4205C3F4F89899A899F -:10401000019711F420583F4F8B899C89019711F427 -:1040200020503F4FC90165E070E043E050E00E943E -:10403000900383EE9BE0612F40E018D68091120739 -:104040000E94EA30019709F420CF68EC70E080E02C -:1040500090E00E942E2E83EE9BE0FAD5F2CE8330C4 -:1040600009F059C08093E00B7092DF0B80E00E9452 -:1040700092058091E10B9091E20B805092407CF090 -:10408000B092E20BA092E10B83EE9BE065E043E08F -:10409000EDD583EE9BE066E976E00E943F32109119 -:1040A000E10B0091E20B83EE9BE065E040E0DED5A2 -:1040B00083EE9BE06AE976E00E943F3283EE9BE06C -:1040C00065E040E0D3D57401812F902F62E070E06D -:1040D0000E9460329C01812F902F62E070E00E946C -:1040E0006032162F072FF70131832083232B29F409 -:1040F00083EE9BE064E976E004C083EE9BE062E936 -:1041000076E00E943F328EEF9FEFE80EF91ECE144C -:10411000DF04D1F696CE64960FB6F894DEBF0FBEDC -:10412000CDBFCF91DF911F910F91FF90EF90DF9066 -:10413000CF90BF90AF909F908F907F9008952F92D7 -:104140003F924F925F926F927F928F929F92AF9227 -:10415000BF92CF92DF92EF92FF920F931F93DF9364 -:10416000CF93CDB7DEB72B970FB6F894DEBF0FBE57 -:10417000CDBF83EE9BE0A2D583EE9BE060E040E004 -:1041800075D583EE9BE064EA76E00E943F32609151 -:104190008C0B662339F483EE9BE06BEB73E00E949B -:1041A0003F3206C083EE9BE04AE050E00E94DE31E1 -:1041B00083EE9BE064E041E059D583EE9BE068EB41 -:1041C00076E00E943F3283EE9BE060E042E04ED515 -:1041D00083EE9BE069EC76E00E943F3283EE9BE049 -:1041E00060E043E043D583EE9BE06DED76E00E9416 -:1041F0003F3289E080938D0B81E080938E0BEFE856 -:10420000FBE0DF0198961082148A1C9254961C924F -:104210005497319611962BE0E33AF207A1F781E02B -:104220008187858F81AB82A386AB31E0632E712CB1 -:1042300021E0822E912C98E0A92EB12C8AE0C82E84 -:10424000CE0101969B878A8783EE9BE06FE043E077 -:104250000DD583EE9BE066EE75E00E943F3283EE63 -:104260009BE0F6D480E060E070E00E94D30A809189 -:104270008D0B893009F09FC080918E0B8130C9F57C -:104280008093E00BC092DF0B7092E20B6092E10B27 -:1042900080E00E9492056090E10B7090E20B611447 -:1042A000710499F481E090E06AE070E041E050E050 -:1042B0000E94900381E090E06AE070E041E050E00D -:1042C0000E94900301E0602E712C8091E10B90918F -:1042D000E20B853691050CF4B7CF84E690E06AE0F6 -:1042E00070E041E050E00E94900314E6612E712CD2 -:1042F000ABCF823081F58093E00BC092DF0B9092C0 -:10430000E20B8092E10B80E00E9492058090E10B2D -:104310009090E20B8114910459F481E090E06AE0FE -:1043200070E042E050E00E949003B1E08B2E912CAF -:104330008091E10B9091E20B09970CF485CF88E016 -:1043400090E06AE070E042E050E00E949003A8E054 -:104350008A2E912C79CF833009F048C08093E00BEE -:10436000C092DF0BB092E20BA092E10B80E00E94C2 -:104370009205A090E10BB090E20BA114B10459F4A6 -:1043800081E090E06AE070E043E050E00E9490033A -:10439000F1E0AF2EB12C8091E10B9091E20B0997E7 -:1043A0000CF452CF88E090E06AE070E042E050E028 -:1043B0000E9490033BC08E30C9F480918E0B8230F6 -:1043C000A9F4A6E8B7E020E030E0E091BD0CF09160 -:1043D000BE0CE20FF31F8C9180832F5F3F4F12962C -:1043E00092E02130390789F70E94D41480918D0B17 -:1043F0008E3009F029CF80918E0B833009F024CFC5 -:104400008A149B04B9F481E090E06AE070E042E035 -:1044100050E00E94900388E090E06AE070E042E0A3 -:1044200050E00E949003E1E08E2E912C78E0A72EC0 -:10443000B12C0ACF83EE9BE06EE043E017D483EE0D -:104440009BE06AE074E00E943F3283EE9BE06FE005 -:1044500043E00CD483EE9BE060EE75E00E943F32B7 -:1044600010E0A814B9040CF411E0EA85FB8529E0FA -:1044700011922A95E9F71123A9F481E090E08815BB -:1044800099055CF0A816B90644F0E1E0F0E0EC0F05 -:10449000FD1FE80FF91F31E0308301968930910547 -:1044A00071F713C088E090E0881699065CF08A15D1 -:1044B0009B0544F0E1E0F0E0EC0FFD1FE80FF91F71 -:1044C00021E020830197882379F783EE9BE0B8D31E -:1044D000112381F084E690E0FC016E9EC0016F9E86 -:1044E000900D7E9E900D11241C01442437FC4094B5 -:1044F000542C32C184E690E09C01629EC001639E10 -:10450000900D729E900D11241C01442437FC4094A0 -:10451000542CDD24D394E1E0F0E0EC0FFD1FED0D11 -:10452000F11D8081813009F07FC083EE9BE063E163 -:1045300040E09CD383EE9BE06D2D4AE050E00E946A -:10454000DE3183EE9BE063E143E090D300E010E0D6 -:1045500034E0D31619F13D1548F082E0D816B1F0D9 -:104560008D15C0F091E0D916B1F50CC0E6E0DE166D -:10457000E9F0DE16B8F0F7E0DF16E1F028E0D21639 -:1045800051F51CC08AEB9CE0B8011DC0B801605019 -:104590007E4F17C0B80160507C4F13C0B801605007 -:1045A0007A4F0FC0B8016050784F0BC0B80160500F -:1045B000764F07C0B8016050744F03C0B801605017 -:1045C000724F8AEB9CE0C5D7E091BD0CF091BE0C18 -:1045D000E00FF11F80830F5F1F4F32E000301307A1 -:1045E00009F0B6CF809112070E94EA30019709F0D6 -:1045F000A9C0EE24FF24870112C061E070E080E0D2 -:1046000090E00E942E2E809112070E94EA30892BA2 -:1046100009F498C00894E11CF11C011D111D2E1411 -:104620003F04400651064CF7D39488E08D1508F4FA -:1046300070CF71CFE1E0F0E0EC0FFD1FED0DF11D4B -:104640008081813009F085C083EE9BE063E140E02A -:104650000DD383EE9BE06D2D4AE050E00E94DE31E9 -:1046600083EE9BE063E143E001D300E010E094E0DF -:10467000D91619F19D1548F0E2E0DE16B1F0ED15FE -:10468000C0F0F1E0DF16B1F50CC026E0D216E9F07B -:10469000D216B8F037E0D316E1F088E0D81651F51D -:1046A0001CC08AEB9CE0B8011DC0B80160507E4F71 -:1046B00017C0B80160507C4F13C0B80160507A4FEA -:1046C0000FC0B8016050784F0BC0B8016050764FF2 -:1046D00007C0B8016050744F03C0B8016050724FFA -:1046E0008AEB9CE036D7E091BD0CF091BE0CE00F58 -:1046F000F11F80830F5F1F4F92E00030190709F010 -:10470000B6CF809112070E94EA300197D9F4EE24C7 -:10471000FF24870111C061E070E080E090E00E941A -:104720002E2E809112070E94EA30892B59F00894AE -:10473000E11CF11C011D111D2E143F044006510601 -:1047400054F707C064EF71E080E090E00E942E2EE5 -:104750007BCDDA9409F06ECF68E0D62E6BCF1F9335 -:1047600011E083EE9BE0AAD283EE9BE060E040E0A4 -:104770007DD283EE9BE062EF76E00E943F3283EED3 -:104780009BE062E042E072D283EE9BE062E077E081 -:104790000E943F3283EE9BE069E042E067D283EE05 -:1047A0009BE06FE574E00E943F3283EE9BE06FE098 -:1047B00042E05CD283EE9BE064E674E00E943F320C -:1047C00083EE9BE062E140E051D283EE9BE069EB37 -:1047D00073E00E943F3260918C0B662339F483EEC4 -:1047E0009BE06BEB73E00E943F3206C083EE9BE0E0 -:1047F0004AE050E00E94DE3110938D0B82E08093FE -:104800008E0BEFE8FBE0DF0198961082148A1C9271 -:1048100054961C925497319611968BE0E33AF80720 -:10482000A1F7158B148F12A380E060E070E00E9466 -:10483000D30A80918D0B883059F480918E0B823091 -:1048400039F40E940D0E019709F48BCF0E94D41405 -:1048500080918D0B8E3059F480918E0B823039F41B -:104860000E94610F019709F47CCF0E94D4148091BB -:104870008D0B813031F480918E0B823011F40E94C7 -:10488000D4141F91089582E061E00E94B8300E9424 -:10489000CD0E0E94BC0E0E941C080E94CA085FCF69 -:1048A00080910A0762E00E94053080910C0762E067 -:1048B0000E94053080910E0762E00E9405308091D1 -:1048C000100762E00E9405308BE062E00E94053034 -:1048D0008091140761E00E9405308091160761E025 -:1048E0000E9405308091180761E00E940530809198 -:1048F0001A0761E00E94053080911C0762E00E9467 -:10490000053080911E0762E00E94053080912007EB -:1049100062E00E9405308091220762E00E9405302B -:104920008091140761E00E94B8308091160761E021 -:104930000E94B8308091180761E00E94B8308091E1 -:104940001A0761E00E94B83080912B0761E00E9455 -:10495000053080912D0761E00E9405308091350778 -:1049600061E00E9405308091330761E00E940530CC -:104970008091310761E00E94053080912F0761E04E -:104980000E9405308091370761E00E94053083EE78 -:104990009BE064E144E020E097D180913B0761E037 -:1049A0000E94053081E090E09093D30C8093D20C6C -:1049B00080E092E09093CF0C8093CE0C8BEB9CE048 -:1049C00060E02BD785E061E00E94053085E060E083 -:1049D0000E94B83086E061E00E94053086E060E029 -:1049E0000E94B83087E061E00E94053087E060E017 -:1049F0000E94B83086E161E00E94053086E160E007 -:104A00000E94B83087E161E00E94053087E160E0F4 -:104A10000E94B83088E161E00E94053088E160E0E2 -:104A20000E94B83089E161E00E94053089E160E0D0 -:104A30000E94B8308AE161E00E9405308AE160E0BE -:104A40000E94B8308BE161E00E9405308BE160E0AC -:104A50000E94B8308CE161E00E9405308CE160E09A -:104A60000E94B8308DE161E00E9405308DE160E088 -:104A70000E94B8308FE161E00E9405308FE160E074 -:104A80000E94B83081E261E00E94053081E260E07E -:104A90000E94B83083E261E00E94053083E260E06A -:104AA0000E94B83085E261E00E94053085E260E056 -:104AB0000E94B83087E261E00E94053087E260E042 -:104AC0000E94B83089E261E00E94053089E260E02E -:104AD0000E94B8308EE261E00E9405308EE260E014 -:104AE0000E94B83080E361E00E94053080E360E01E -:104AF0000E94B83082E361E00E94053082E360E00A -:104B00000E94B83084E361E00E94053084E360E0F5 -:104B10000E94B83086E361E00E94053086E360E0E1 -:104B20000E94B83087E361E00E94053087E360E0CF -:104B30000E94B83088E361E00E94053088E360E0BD -:104B40000E94B83089E361E00E94053089E360E0AB -:104B50000E94B8308AE361E00E9405308AE360E099 -:104B60000E94B8308BE361E00E9405308BE360E087 -:104B70000E94B8308CE361E00E9405308CE360E075 -:104B80000E94B8308DE361E00E9405308DE360E063 -:104B90000E94B8308EE361E00E9405308EE360E051 -:104BA0000E94B8308FE361E00E9405308FE360E03F -:104BB0000E94B83080E461E00E94053080E460E04B -:104BC0000E94B83081E461E00E94053081E460E039 -:104BD0000E94B83082E461E00E94053082E460E027 -:104BE0000E94B83083E461E00E94053083E460E015 -:104BF0000E94B83084E461E00E94053084E460E003 -:104C00000C94B83008950895FC011382128282E555 -:104C100097E0918380830895FC01A081B18118966B -:104C20002D913C9119976FEFF90119950895DC01C9 -:104C3000ED91FC910284F385E02D40E019950895F3 -:104C4000FC016581862F816085836960CF01EFCF8C -:104C5000FC0165816E7F65836860E9CFFC01658139 -:104C6000862F846085836C60CF01E1CFDC011796CD -:104C70009C911797491710F0492F415018968C9125 -:104C80001897803139F4943029F4E42FF0E0E25A97 -:104C9000F84F04C0E42FF0E0EE59F84F8081680F20 -:104CA0006068CD01C4CFDC01ED91FC910284F385F5 -:104CB000E02D41E0199581E090E0089561E0B7DFD3 -:104CC00080ED97E00C94872ECF93DF93EC01423078 -:104CD00018F08C8188608C834F836887222329F0A9 -:104CE000413019F48C8184608C8364E670E080E04C -:104CF00090E0B4D76C8164FD2EC0E881F981028414 -:104D0000F385E02DCE0163E042E0199584E991E15D -:104D1000FED7E881F9810284F385E02DCE0163E0BE -:104D200042E0199584E991E1F2D7E881F9810284A2 -:104D3000F385E02DCE0163E042E0199586E990E02D -:104D4000E6D7E881F9810284F385E02DCE0162E0A7 -:104D500042E0199511C06062CE0169DF84E991E1FA -:104D6000D6D76C816062CE0162DF86E990E0CFD752 -:104D70006C816062CE015BDF6C816062CE0157DFC7 -:104D800084E08D83CE016ADFCE0198DF82E08E83DE -:104D9000CE0166E04CDFCE013FDFDF91CF91089579 -:104DA0000F931F938C01FC01858561E00E94B83050 -:104DB000F801858560E00E94B8301F910F91089539 -:104DC000BF92CF92DF92EF92FF920F931F93CF93F8 -:104DD000DF93D82EC92EB42E282F392FC9018C016C -:104DE000C0E0D0E0E62EFF240DC0B7010C2E02C0BB -:104DF000759567950A94E2F76170F80185850E94C0 -:104E0000B83021960F5F1F4FCB1578F38D2D9C2D59 -:104E1000C7DFDF91CF911F910F91FF90EF90DF904F -:104E2000CF90BF9008950F931F93CF93DF93EC0122 -:104E3000162F042F60E0413009F461E08B850E9459 -:104E4000B8308C858F3F19F060E00E94B830023096 -:104E500089F08C8184FF04C0CE01612F48E00DC031 -:104E6000612F70E084E0759567958A95E1F7CE0132 -:104E700044E0A6DFCE01612F44E0A2DFDF91CF91B5 -:104E80001F910F9108956F927F928F92AF92CF9260 -:104E9000EF920F931F93DF93CF93CDB7DEB73C0113 -:104EA000162F8E2DF301438724870587E686C78654 -:104EB000A08A818A9E85928B9F85938B9889948BFB -:104EC0009989958B61E00E940530F301878561E047 -:104ED0000E940530F301808961E00E940530F301F2 -:104EE000818961E00E9405301123A1F4F3018289D8 -:104EF00061E00E940530F301838961E00E94053082 -:104F0000F301848961E00E940530F301858961E045 -:104F10000E940530F301838561E00E940530F301B2 -:104F200084858F3F19F061E00E940530F30185858B -:104F300061E00E940530112319F0F301148203C0CF -:104F400080E1F3018483F301838560E00E94B8303F -:104F5000F301858560E00E94B830F30184858F3FBE -:104F600019F060E00E94B8308FEFF301868B128653 -:104F70001186CF91DF911F910F91EF90CF90AF905D -:104F80008F907F906F900895DF92EF92FF920F9332 -:104F90001F938C01D62E7A01862F61E00E94053086 -:104FA000D8015696DC9256971A96FC92EE92199773 -:104FB000ED91FC910084F185E02DC80160E0199528 -:104FC0001F910F91FF90EF90DF900895DC01362F35 -:104FD00056962C9156972F3F49F1E22FF0E0E2547C -:104FE000FE4FE491EE2379F019968D919C911A97DA -:104FF000892B19F4822F70E005C06FEF70E0631BFE -:105000007109822F24C719968D919C911A97662356 -:1050100019F0892B39F402C0019721F4822F61E045 -:105020000C94B830822F60E00C94B83008956F92E1 -:105030007F928F92AF92BF92CF92DF92EF92FF92C8 -:105040000F931F933C01162FF42ED22EB02EAE2CB0 -:105050008C2CDADD8AE697E0D3018D939C9300D007 -:105060000F92EDB7FEB73196ADB7BEB711961C9251 -:10507000118212821382C30161E0412F2FEF0F2DA5 -:10508000ED2CCB2C00DF0F900F900F900F901F9105 -:105090000F91FF90EF90DF90CF90BF90AF908F90E7 -:1050A0007F906F90089520911C0C30E080911B0C34 -:1050B000281B3109C901089540911B0C80911C0CDB -:1050C000481718F02FEF3FEF0AC0E42FF0E0E5504B -:1050D000F44F8081282F30E04F5F40931B0CC901B3 -:1050E0000895E0911B0C80911C0CE81718F0EFEF6D -:1050F000FFEF06C0F0E0E550F44F8081E82FF0E0CC -:10510000CF01089508951092430C1092420C88EE3E -:1051100093E0A0E0B0E08093440C9093450CA09302 -:10512000460CB093470C8AE797E09093410C80932C -:10513000400C0895CF92DF92EF92FF920F931F934E -:10514000CF93DF937C016B018A0180913F0C882310 -:10515000A1F0C0E0D0E00DC0D701ED91FC91D601E7 -:10516000AC0FBD1F0190F081E02DC7016C91199526 -:105170002196C017D10780F303C0CB01642F39D02B -:10518000C801DF91CF911F910F91FF90EF90DF90B9 -:10519000CF900895DF93CF930F92CDB7DEB7FC0188 -:1051A000698380913F0C8823C9F080913E0C803246 -:1051B00038F081E090E09383828320E030E014C0F7 -:1051C00080913D0CE82FF0E0E35EF34F99819083EE -:1051D0008F5F80933D0C80933E0C04C0CE010196FE -:1051E00061E007D021E030E0C9010F90CF91DF915D -:1051F0000895482F613210F081E0089580914C0CA1 -:10520000843011F082E008956093970CA6E7BCE02B -:10521000842F9C01F90102C081918D938E2F841BF4 -:105220008617D0F380E008951F920F920FB60F9269 -:105230000BB60F9211242F933F934F935F936F936D -:105240007F938F939F93AF93BF93EF93FF9380913F -:10525000B90090E0887F90708036910509F4F2C023 -:1052600081369105CCF58832910509F47BC08932ED -:105270009105B4F48031910509F46FC08131910535 -:105280003CF4009709F447C1089709F04FC165C085 -:105290008831910509F466C0809709F047C182C042 -:1052A0008034910509F4A4C08134910544F480331D -:1052B000910509F482C0C89709F038C189C08035CA -:1052C000910509F489C08835910509F496C08834A0 -:1052D000910509F02BC1AEC08839910509F413C1BD -:1052E00089399105ECF48837910509F4ABC0893709 -:1052F00091054CF48836910509F4A4C080379105D6 -:1053000009F014C19FC08838910509F4FCC08039A8 -:10531000910509F49DC08038910509F007C198C036 -:10532000803B910509F4C6C0813B91054CF4803A5D -:10533000910509F49FC0883A910509F0F7C0BAC0F9 -:10534000803C910509F4E3C0883C910509F4DFC075 -:10535000883B910509F0EAC0C2C080914D0C809352 -:10536000BB00CFC09091740C8091750C981768F4B5 -:105370009091740CE92FF0E0EC5AF34F8081809308 -:10538000BB009F5F9093740CBCC080914E0C88232F -:1053900009F44BC085ED8093BC008091BC0084FD76 -:1053A000FCCFC2C080E28093B90C85ED8093BC0035 -:1053B0008091BC0084FDFCCFB7C080E38093B90C22 -:1053C00085ED8093BC008091BC0084FDFCCFACC017 -:1053D00088E38093B90C9BC08091740C9091BB00C2 -:1053E000E82FF0E0EC5AF34F90838F5F8093740CBA -:1053F0009091740C8091750C82C08091740C909186 -:10540000BB00E82FF0E0EC5AF34F90838F5F80935E -:10541000740C80914E0C882341F085ED8093BC0084 -:105420008091BC0084FDFCCF7FC081E080934F0C55 -:1054300084EA6EC085ED8093BC008091BC0084FD41 -:10544000FCCF72C083E080934C0C1092B80C59C012 -:105450008091B80C803208F056C08091B80C9091C1 -:10546000BB00E82FF0E0E856F34F90838F5F809306 -:10547000B80C47C08091B80C803230F4E091B80C81 -:10548000F0E0E856F34F108285ED8093BC008091E8 -:10549000BC0084FDFCCF10924C0C6091B80CE091E4 -:1054A000520CF091530C88E99CE070E01995109231 -:1054B000B80C2DC084E080934C0C1092960C109286 -:1054C000970CE091500CF091510C19958091970C2C -:1054D000882329F481E08093970C1092760C9091A8 -:1054E000960CE92FF0E0EA58F34F80818093BB00DF -:1054F0009F5F9093960C9091960C8091970C9817C3 -:1055000010F485EC01C085E88093BC000FC085ECE9 -:105510008093BC0009C01092B90C85ED8093BC004B -:105520008091BC0084FDFCCF10924C0CFF91EF9158 -:10553000BF91AF919F918F917F916F915F914F91AB -:105540003F912F910F900BBE0F900FBE0F901F90A9 -:105550001895F999FECF72BD61BDF89A80B508958E -:10556000F999FECF1FBA72BD61BD40BD0FB6F89468 -:10557000FA9AF99A0FBE0895FC018385882331F4C5 -:105580008091C10087728093C1000895813031F409 -:105590008091C90087728093C9000895823031F4E8 -:1055A0008091D10087728093D1000895833029F4CF -:1055B0008091310187728093310108951F920F927B -:1055C0000FB60F920BB60F9211242F933F934F9368 -:1055D0005F936F937F938F939F93AF93BF93EF935B -:1055E000FF938091C0008093C30C3091C60030932C -:1055F000C40C2091BF0C2093C50C84FF10C0809177 -:10560000C0008F7E8093C0008091D00C9091D10C0F -:105610009093C90C8093C80C81E08093BF0C21301B -:1056200091F4332369F482E08093BF0C8091BB0C2A -:105630009091BC0C01969093C10C8093C00C4BC010 -:105640001092BF0C48C02230A1F48091C80C9091F8 -:10565000C90C01979093C90C8093C80C892BD9F57C -:1056600083E08093BF0CE091BB0CF091BC0C3083C5 -:1056700032C0233081F5E091C00CF091C10CF09361 -:10568000DE0CE093DD0C30834091DD0C5091DE0C9C -:105690004F5F5F4F5093DE0C4093DD0C8091BB0C4D -:1056A0009091BC0C2091CC0C3091CD0C820F931FAB -:1056B0004817590760F01092BF0CE091E10CF0918F -:1056C000E20C309741F08091C60C199504C05093BC -:1056D000C10C4093C00CFF91EF91BF91AF919F918E -:1056E0008F917F916F915F914F913F912F910F908B -:1056F0000BBE0F900FBE0F901F9018951F920F9228 -:105700000FB60F920BB60F9211242F933F934F9326 -:105710005F936F937F938F939F93AF93BF93EF9319 -:10572000FF938091C70C8093DC0C882361F4109266 -:10573000C5008091D90C8093C4001092C60081E00E -:105740008093C70C40C0813081F41092C5008091D5 -:10575000D80C8093C4001092C60082E08093C70CDE -:105760001092CB0C1092CA0C2EC08091CA0C909152 -:10577000CB0C9093DB0C8093DA0CE091BD0CF09194 -:10578000BE0CE80FF91F20812093C6009C012F5FFB -:105790003F4F3093DB0C2093DA0C8091CE0C90912C -:1057A000CF0C2817390759F4E091DF0CF091E00C89 -:1057B000309711F080E019951092C70C04C0309317 -:1057C000CB0C2093CA0CFF91EF91BF91AF919F91A9 -:1057D0008F917F916F915F914F913F912F910F909A -:1057E0000BBE0F900FBE0F901F90189521E030E078 -:1057F0003093D10C2093D00C88E090E09093CD0CA6 -:105800008093CC0C3093D30C2093D20C9093CF0C7C -:105810008093CE0C1092C60C08951F93CF93DF9304 -:10582000EC01162FF894A8DE1C8F112321F487E0D9 -:105830008D8F84E10BC0113021F483E08D8F8AE0DD -:1058400005C0123021F481E08D8F85E08E8F8B8D25 -:105850008F3F29F061E0D9D38B8D61E089D48B85AE -:105860008823D1F481E061E0D0D31092C5008D8D02 -:105870008093C4008091C00082608093C0008091BA -:10588000C2008E608093C2008091C10088648093C2 -:10589000C1001092C60053C08130D1F482E161E0B2 -:1058A000B4D31092CD008D8D8093CC008091C80030 -:1058B00082608093C8008091CA008E608093CA0085 -:1058C0008091C90088648093C9001092CE0037C0CF -:1058D0008230D1F480E161E098D31092D5008D8DB3 -:1058E0008093D4008091D00082608093D00080911A -:1058F000D2008E608093D2008091D1008864809322 -:10590000D1001092D6001BC08330C9F48EE061E054 -:105910007CD3109235018D8D8093340180913001BC -:10592000826080933001809132018E6080933201D9 -:10593000809131018864809331011092360181E0B9 -:105940008C878B899C890DD08A839B834B895C894A -:1059500060E070E00E9433017894DF91CF911F9155 -:1059600008950F931F93CF93DF93BC01823091056D -:1059700010F462E070E0E091EE0CF091EF0C40E08A -:1059800050E0A0E0B0E024C08081918186179707A5 -:10599000D0F08617970771F482819381109729F0D0 -:1059A00013969C938E9312972CC09093EF0C809338 -:1059B000EE0C27C04115510519F08417950718F40E -:1059C0008D01AC01EF01DF01828193819C01F9011E -:1059D0003097D1F641155105F9F0CA01861B970B96 -:1059E0008430910580F48A819B810115110521F095 -:1059F000F8019383828304C09093EF0C8093EE0CA4 -:105A0000FE01329645C0FE01E80FF91F61937193C4 -:105A10000297998388833CC08091EC0C9091ED0CA7 -:105A2000892B41F48091490790914A079093ED0C9E -:105A30008093EC0C40914B0750914C074115510558 -:105A400041F44DB75EB78091470790914807481BD6 -:105A5000590B2091EC0C3091ED0C24173507B0F464 -:105A6000CA01821B930B8617970780F0AB014E5F2C -:105A70005F4F8417950750F0420F531F5093ED0C62 -:105A80004093EC0CF9016193719302C0E0E0F0E007 -:105A9000CF01DF91CF911F910F910895CF93DF93A5 -:105AA0009C01009709F48FC0EC0122971B821A8297 -:105AB0006091EE0C7091EF0C6115710581F4888195 -:105AC0009981820F931F2091EC0C3091ED0C2817D7 -:105AD000390739F5D093ED0CC093EC0C74C0DB01A1 -:105AE00040E050E0AC17BD0708F1BB83AA83FE017C -:105AF00021913191E20FF31FAE17BF0779F48D9119 -:105B00009C911197280F391F2E5F3F4F39832883AF -:105B100012968D919C9113979B838A834115510511 -:105B200071F4D093EF0CC093EE0C4DC012968D9192 -:105B30009C911397AD01009711F0DC01D3CFDA01EE -:105B40001396DC93CE931297FA0121913191E20FD3 -:105B5000F31FCE17DF0769F488819981280F391F59 -:105B60002E5F3F4FFA01318320838A819B8193838B -:105B70008283E0E0F0E0DB0112968D919C91139717 -:105B8000009719F0BC01FD01F6CFAB014E5F5F4FEE -:105B9000DB018D919C91840F951F2091EC0C30912D -:105BA000ED0C2817390779F4309729F41092EF0C8F -:105BB0001092EE0C02C01382128242505040509359 -:105BC000ED0C4093EC0CDF91CF9108951F920F9252 -:105BD0000FB60F9211242F933F938F939F93AF9300 -:105BE000BF938091E70C9091E80CA091E90CB091E3 -:105BF000EA0C3091EB0C0196A11DB11D232F2D5FF6 -:105C00002D3720F02D570196A11DB11D2093EB0CCF -:105C10008093E70C9093E80CA093E90CB093EA0C06 -:105C20008091E30C9091E40CA091E50CB091E60C0E -:105C30000196A11DB11D8093E30C9093E40CA093F9 -:105C4000E50CB093E60CBF91AF919F918F913F917E -:105C50002F910F900FBE0F901F9018959B01AC01D4 -:105C60007FB7F8948091E30C9091E40CA091E50C3F -:105C7000B091E60C66B5A89B05C06F3F19F0019680 -:105C8000A11DB11D7FBFBA2FA92F982F8827860F7E -:105C9000911DA11DB11D62E0880F991FAA1FBB1F96 -:105CA0006A95D1F7BC012DC0FFB7F8948091E30C41 -:105CB0009091E40CA091E50CB091E60CE6B5A89BA0 -:105CC00005C0EF3F19F00196A11DB11DFFBFBA2F0E -:105CD000A92F982F88278E0F911DA11DB11DE2E0DD -:105CE000880F991FAA1FBB1FEA95D1F7861B970B38 -:105CF000885E9340C8F22150304040405040685187 -:105D00007C4F211531054105510571F60895019724 -:105D100039F0880F991F880F991F02970197F1F7A3 -:105D20000895789484B5826084BD84B5816084BD13 -:105D300085B5826085BD85B5816085BDEEE6F0E004 -:105D4000808181608083E1E8F0E010828081826060 -:105D50008083808181608083E0E8F0E080818160E1 -:105D60008083E1EBF0E0808184608083E0EBF0E011 -:105D7000808181608083E1E9F0E0808182608083BE -:105D8000808181608083E0E9F0E0808181608083B0 -:105D9000E1EAF0E08081826080838081816080839D -:105DA000E0EAF0E0808181608083E1E2F1E08081DF -:105DB00082608083808181608083E0E2F1E0808185 -:105DC00081608083EAE7F0E0808184608083808165 -:105DD000826080838081816080838081806880830D -:105DE0001092C1000895382F863308F03653209161 -:105DF0007B00832F86958695869590E081709070C4 -:105E000043E0880F991F4A95E1F7277F282B2093BD -:105E10007B00377080914D078295880F880F807CBA -:105E2000832B80937C0080917A00806480937A0039 -:105E300080917A0086FDFCCF209178004091790016 -:105E4000942F80E030E0282B392BC90108951F934F -:105E5000CF93DF93182FEB0161E0D7D0209709F49F -:105E6000CAC0CF3FD10509F4C9C0E12FF0E0E25428 -:105E7000FE4F8491893009F466C08A30B0F48430D2 -:105E8000F1F1853040F4823059F1833070F5813082 -:105E900009F0AEC020C0873009F443C0883008F054 -:105EA00048C0863009F0A4C034C08D3009F478C0F1 -:105EB0008E3038F48B3009F45AC08C3008F066C04C -:105EC0004CC0803109F480C0813109F487C08F3023 -:105ED00009F08EC06FC084B5806884BDC7BD91C015 -:105EE00084B5806284BDC8BD8CC08091800080680C -:105EF00080938000D0938900C093880082C08091F5 -:105F00008000806280938000D0938B00C0938A00D1 -:105F100078C08091B00080688093B000C093B300D7 -:105F200070C08091B00080628093B000C093B400D4 -:105F300068C080919000806880939000D093990011 -:105F4000C09398005EC08091900080628093900022 -:105F5000D0939B00C0939A0054C0809190008860B9 -:105F600080939000D0939D00C0939C004AC0809184 -:105F7000A00080688093A0008091A0008F7B809318 -:105F8000A000D093A900C093A8003BC08091A000BE -:105F900080628093A000D093AB00C093AA0031C070 -:105FA0008091A00088608093A000D093AD00C09342 -:105FB000AC0027C080912001806880932001D0939D -:105FC0002901C09328011DC0809120018062809327 -:105FD0002001D0932B01C0932A0113C0809120018E -:105FE000886080932001D0932D01C0932C0109C0BB -:105FF000C038D1051CF4812F60E002C0812F61E020 -:10600000B7D0DF91CF911F910895CF93DF93482FA1 -:1060100050E0CA0188589E4FFC0134914E5C5E4F9F -:10602000FA018491882369F190E0880F991FFC019F -:10603000EC51FF4FA591B491FC01E250FF4FC59187 -:10604000D491662351F42FB7F8948C91932F9095A7 -:1060500089238C93888189230BC0623061F42FB728 -:10606000F8948C91932F909589238C938881832B1E -:1060700088832FBF06C09FB7F8948C91832B8C9395 -:106080009FBFDF91CF910895893009F449C08A30CC -:10609000A0F4843051F1853040F4823079F18330BE -:1060A00000F5813009F063C026C0873079F188306F -:1060B00098F5863009F05BC025C08D3009F442C0E8 -:1060C0008E3028F48B30B1F18C30C0F52DC080318A -:1060D00009F442C0813109F445C08F3009F047C04E -:1060E00037C0809180008F7703C0809180008F7DC2 -:1060F00080938000089584B58F7702C084B58F7D2A -:1061000084BD08958091B0008F7703C08091B00066 -:106110008F7D8093B0000895809190008F7707C0A5 -:10612000809190008F7D03C080919000877F809345 -:10613000900008958091A0008F7707C08091A00003 -:106140008F7D03C08091A000877F8093A000089579 -:10615000809120018F7703C0809120018F7D8093F3 -:106160002001089580912001877F80932001089568 -:10617000FF920F931F93F62E482F50E0CA018254CE -:106180009E4FFC012491CA0188589E4FFC01149136 -:106190004E5C5E4FFA0104910023C1F0222311F0FE -:1061A000822F72DFE02FF0E0EE0FFF1FE250FF4F73 -:1061B000A591B4919FB7F894FF2021F48C9110958C -:1061C000812302C08C91812B8C939FBF1F910F91D3 -:1061D000FF9008950F931F93482F50E0CA018254F7 -:1061E0009E4FFC012491CA0188589E4FFC010491E6 -:1061F0004E5C5E4FFA011491112319F420E030E057 -:1062000014C0222311F0822F3FDF812F90E0880FEE -:10621000991F885E9E4FFC01A591B4918C9120E05E -:1062200030E0802311F021E030E0C9011F910F918F -:1062300008950895CF93DF9374DDFBDF0E9450240F -:10624000C0E0D0E00E9443242097E1F30E940000C8 -:10625000F9CF0895CF92DF92EF92FF920F931F93A1 -:10626000CF93DF937C016B018A01C0E0D0E00FC0C7 -:10627000D6016D916D01D701ED91FC910190F081F6 -:10628000E02DC7011995C80FD91F01501040011505 -:10629000110571F7CE01DF91CF911F910F91FF9002 -:1062A000EF90DF90CF900895CF93DF93EC016115CD -:1062B000710519F420E030E00FC0DB010D900020E3 -:1062C000E9F71197A61BB70BE881F9810280F381EA -:1062D000E02DAD0119959C01C901DF91CF91089581 -:1062E0004F925F927F928F929F92AF92BF92CF9286 -:1062F000DF92EF92FF920F931F93DF93CF93CDB76F -:10630000DEB7A1970FB6F894DEBF0FBECDBF2C014C -:10631000742ECB01223008F42AE019A231E2C32EF8 -:10632000D12CCC0EDD1E822E9924AA24BB24672DED -:10633000752FA5019401D7D079018A01C801B70151 -:10634000A50194019ED0472D461B0894C108D10891 -:106350004A3014F4405D01C0495CF6014083E11409 -:10636000F1040105110521F07E2C5F2DC801DFCF5E -:10637000C201B60199DFA1960FB6F894DEBF0FBE39 -:10638000CDBFCF91DF911F910F91FF90EF90DF90E4 -:10639000CF90BF90AF909F908F907F905F904F90E5 -:1063A0000895DC012115310541F4ED91FC91019036 -:1063B000F081E02D642F1995089592CFEF92FF920E -:1063C0000F931F939A01E62EFF2400E010E0B8011E -:1063D000A701E7DF1F910F91FF90EF900895CF92F3 -:1063E000DF92EF92FF920F931F93CF93DF93EC0115 -:1063F0006A017B012115310541F4E881F9810190A1 -:10640000F081E02D642F19951DC02A303105C9F4A3 -:1064100077FF16C0E881F9810190F081E02D6DE2EF -:1064200019958C0144275527BA014C195D096E094D -:106430007F09CE012AE054DF9801280F391F03C0DD -:106440002AE04EDF9C01C901DF91CF911F910F918E -:10645000FF90EF90DF90CF900895EF92FF920F930F -:106460001F937B019A010027F7FC0095102FB801BC -:10647000A701B5DF1F910F91FF90EF90089514CF02 -:106480000895629FD001739FF001829FE00DF11D7E -:10649000649FE00DF11D929FF00D839FF00D749F9E -:1064A000F00D659FF00D9927729FB00DE11DF91F4A -:1064B000639FB00DE11DF91FBD01CF0111240895A7 -:1064C00097FB092E07260AD077FD04D02ED006D0E0 -:1064D00000201AF4709561957F4F0895F6F7909516 -:1064E00081959F4F0895A1E21A2EAA1BBB1BFD01A7 -:1064F0000DC0AA1FBB1FEE1FFF1FA217B307E407A3 -:10650000F50720F0A21BB30BE40BF50B661F771FFA -:10651000881F991F1A9469F76095709580959095DA -:106520009B01AC01BD01CF010895AA1BBB1B51E12A -:1065300007C0AA1FBB1FA617B70710F0A61BB70BF3 -:10654000881F991F5A95A9F780959095BC01CD0198 -:106550000895EE0FFF1F0590F491E02D1994F89423 -:02656000FFCF6B -:10656200303030006100202020005F5F5F004D6509 -:106572006D6F727920456D707469656421004261A6 -:106582006E6B3A2052414D0020205468697320708E -:10659200726F6772616D20697300646973747269E6 -:1065A200627574656420696E2074686500686F7036 -:1065B2006520746861742069742077696C6C20624C -:1065C200650075736566756C2C2062757400574999 -:1065D20054484F555420414E592057415252414E32 -:1065E200545900776974686F7574206576656E20FA -:1065F20074686500696D706C696564207761727298 -:10660200616E7479206F66004D45524348414E5485 -:106612004142494C495459206F66004649544E45FF -:10662200535320464F522041005041525449435542 -:106632004C415220504F52505553452E002020209D -:10664200205468697320697320667265652000733F -:106652006F66747761726520616E6420796F752050 -:106662006172650077656C636F6D6520746F00728F -:106672006564697374726962757465206974007502 -:106682006E646572206365727461696E00636F6E19 -:10669200646974696F6E7300536565207468652060 -:1066A200474E552047454E4552414C005055424CAD -:1066B2004943204C4943454E434500666F72206D65 -:1066C2006F72652064657461696C732E2E2E004DA5 -:1066D200656D6F7279204C6F61646564210042615F -:1066E2006E6B3A200041726475696E6F20444D589A -:1066F2002D35313200546573746572202620436F44 -:106702006E74726F6C6C6572004669726D207600F1 -:106712002E004861726420760062002D004F706581 -:106722006E20536F75726365204C6963656E736585 -:106732003A004669726D3A20474E552047504C2028 -:10674200763300486172643A204F53485720202024 -:106752002076310057696B693A20676F6F2E676C3C -:106762002F356E714A4B74003E002B002D2D2D00EB -:1067720020004D656D6F72792042616E6B3A004266 -:10678200616E6B31202042616E6B34202042616E5B -:106792006B370042616E6B32202042616E6B352096 -:1067A2002042616E6B380042616E6B332020426181 -:1067B2006E6B362020457869740053617665004C13 -:1067C2006F616400436C65617200416C6C004D65E1 -:1067D2006D6F727920436C65616E696E672E2E2E25 -:1067E200004D656D6F727920436C65616E65642141 -:1067F200004D656D6F727920536176696E672E2E3A -:106802002E004D656D6F72792053617665642100AB -:106812004D656D6F72793A202020202020202020A3 -:10682200206200436C656172416C6C00426C616372 -:106832006B4F7574004578697400456D70747952B8 -:10684200414D00204B65794C696768743A0041629A -:106852006F7574004261636B4C696768743A0043F8 -:106862006F6E74726173743A0042616E6B496E6945 -:10687200743A00436F6E7665727400556E69746186 -:106882007279004D61747269780043686173657250 -:10689200004D756C7469706C7900436F6E66696740 -:1068A2000053656375656E636572004D656D6F7249 -:1068B2007900632D2D2D204D6220204578692020FE -:1068C20020202D00556E697461727920436F6E74B9 -:1068D200726F6C3A202062004368616E6E656C3A9A -:1068E200203030310056616C75653A0063303032C9 -:1068F2003D7600633030333D7600436861736572E4 -:106902004348202D2D2D0044656C617920202020E4 -:106912007831303D6D5300466972737420434820CC -:10692200202020202020457869740046696E616C21 -:1069320020434820202020202020537461727400BC -:1069420053746F7020005374617274006220205679 -:10695200616C75650046697273742043482020207B -:1069620020202045786974004D756C7469706C79CB -:106972002020202020204D656D6F727900517561B5 -:106982006E746974792020202020204170706C7907 -:10699200004572726F7221200020202020202020CA -:1069A2000043616C632E2E004F6B21004170706CAE -:1069B20079200042696E3A204F4F4F4F4F4F4F4F51 -:1069C2004F20493D4F6E0031323438313336313247 -:1069D200204F3D4F666600363234323500446563DF -:1069E2003A20303030202020203836202045786967 -:1069F200740049004F00353131004F4F4F4F4F4F18 -:106A02004F4F4F0053656375656E63657220426137 -:106A12006E6B733A2020620044656C6179203030DD -:106A220031783130303D6D53004669727374426182 -:106A32006E6B203030312020457869740046696ED3 -:106A4200616C42616E6B2030303820205374617269 -:106A52007400496E697469616C204D656D6F72795D -:106A62003A00456D70747900010009000C000800BD -:106A72000A000B00260028002A002C001E0020001D -:106A820022002400116400000045002B002D002F7D -:106A9200003100330035000D0004000300FE0FFF3B -:106AA2000FFD0FFC0FFB0F8000F00C000001000037 -:106AB200000053262A31642602260326293100408B -:106AC2001050004014540000000053262A3164265E -:106AD200C427E627132700000000CA289A28532853 -:066AE2005C2871288228E7 -:00000001FF diff --git a/DMX_Controller/DMX_Controller.ino b/DMX_Controller/DMX_Controller.ino index baba026..115e5a3 100644 --- a/DMX_Controller/DMX_Controller.ino +++ b/DMX_Controller/DMX_Controller.ino @@ -3,8 +3,8 @@ // ** ** // ** Arduino DMX-512 Tester Controller ** // ** ** -// ** - Firmware v1.7 ** -// ** - Hardware v0.3 - v0.5 ** +// ** - Firmware v1.8 ** +// ** - Hardware v0.7 ** // ** ** // ** - Compilado en Arduino IDE v1.0.6 ** // ** http://www.arduino.cc/en/Main/OldSoftwareReleases ** @@ -19,9 +19,6 @@ // ** https://bitbucket.org/fmalpartida/new-liquidcrystal/wiki/Home ** // ** - Libreria Encoder v1.2 - pjrc.com ** // ** http://www.pjrc.com/teensy/td_libs_Encoder.html ** -// ** - Simulacion en Proteus v7.7 SP2 ** -// ** - Simulacion en Proteus de Arduino - Microcontrolandos ** -// ** http://microcontrolandos.blogspot.mx/2012/12/arduino-componentes-para-o-proteus.html ** // ** ** // ** Autor: ** // ** ** @@ -57,39 +54,34 @@ // *************************************************************************************************************************** // Librerias -#include // libreria para LCD - ttps://bitbucket.org/fmalpartida/new-liquidcrystal/wiki/Home +#include // libreria para LCD - ttps://bitbucket.org/fmalpartida/new-liquidcrystal/wiki/Home #include #include #include -#include // libreria DMX 4 universos deskontrol four universes DMX library - http://www.deskontrol.net/blog -#include // libreria encoder - http://www.pjrc.com/teensy/td_libs_Encoder.html +#include // libreria DMX 4 universos deskontrol four universes DMX library - http://www.deskontrol.net/blog +#include // libreria encoder - http://www.pjrc.com/teensy/td_libs_Encoder.html // DMX Library -#define DMX512 (0) // (250 kbaud - 2 to 512 channels) Standard USITT DMX-512 -//#define DMX1024 (1) // (500 kbaud - 2 to 1024 channels) Completely non standard - TESTED ok -//#define DMX2048 (2) // (1000 kbaud - 2 to 2048 channels) called by manufacturers DMX1000K, DMX 4x or DMX 1M ??? +#define DMX512 (0) // (250 kbaud - 2 to 512 channels) Standard USITT DMX-512 +//#define DMX1024 (1) // (500 kbaud - 2 to 1024 channels) Completely non standard - TESTED ok +//#define DMX2048 (2) // (1000 kbaud - 2 to 2048 channels) called by manufacturers DMX1000K, DMX 4x or DMX 1M ??? -// Puertos, variables // DMX -int DMX_Data_Flux = 2; // control de flujo de datos para dmx, 0 por default int DMX_Values [515]; // array de valores actuales DMX -int Canal_Actual = 1; -byte Universo_Actual = 0; +int Canal_Actual = 1; // canal actual de dmx +byte Universo_Actual = 0; // universo actual de dmx // Encoder -Encoder myEnc (7, 6); // coneccion de encoder - - // Botones cursor -int Boton_Up = 9; -int Boton_Down = 12; -int Boton_Left = 8; -int Boton_Right = 10; -int Boton_Center = 11; +byte Enc_Center = 8; // pin +byte Enc_CLK = 7; // pin +byte Enc_Data = 6; // pin +Encoder myEnc (Enc_Data, Enc_CLK); // conexion de encoder + + // Cursor +byte Enc_ultima_pos = 1; // saber cual fue la ultima posicion de cursor, para posicionar encoder byte LCD_Col_Pos = 0; // posicion en tiempo real de lcd byte LCD_Row_Pos = 0; // posicion en tiempo real de lcd - - // config de posiciones de lcd Col Row -byte Cursor_Conf[4][20] = +byte Cursor_Conf[4][20] = { {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, @@ -97,83 +89,90 @@ byte Cursor_Conf[4][20] = }; //Teclado Numerico Array -int Boton_Array_1 = 38; -int Boton_Array_2 = 40; -int Boton_Array_3 = 42; -int Boton_Array_4 = 44; -int Boton_Array_A = 30; -int Boton_Array_B = 32; -int Boton_Array_C = 34; -int Boton_Array_D = 36; +byte Boton_Array_1 = 36; // pin +byte Boton_Array_2 = 34; // pin +byte Boton_Array_3 = 32; // pin +byte Boton_Array_4 = 30; // pin +byte Boton_Array_A = 44; // pin +byte Boton_Array_B = 42; // pin +byte Boton_Array_C = 40; // pin +byte Boton_Array_D = 38; // pin byte Boton_Calc = 17; // valor calculado # E * F, 17 sin valor calculado byte Num_Col_Pos = 0; // posicion en tiempo real de lcd byte Num_Row_Pos = 0; // posicion en tiempo real de lcd int Num_Val = 0; // valor generado al calculo long Boton_Delay_Teclado = 100; // delay de lectura de boton - // Potenciometro -int Pot = A15; // entrada de potenciometro - // LCD -int LCD_RS = 43; // puertos de conexion de LCD -int LCD_E = 45; -int LCD_D4 = 47; -int LCD_D5 = 49; -int LCD_D6 = 51; -int LCD_D7 = 53; -LiquidCrystal lcd (LCD_RS, LCD_E, LCD_D4, LCD_D5, LCD_D6, LCD_D7); //LCD setup -int Back_Light_PWM = 13; // salida para PWM de Back Light de LCD -int Contrast_PWM = 4; // salida para pwm de contraste de LCD +byte LCD_RS = 43; // pin +byte LCD_E = 45; // pin +byte LCD_D4 = 47; // pin +byte LCD_D5 = 49; // pin +byte LCD_D6 = 51; // pin +byte LCD_D7 = 53; // pin +byte Back_Light_PWM = 13; // salida para PWM de Back Light de LCD +byte Contrast_PWM = 12; // salida para pwm de contraste de LCD byte Light_On_Off = 0; // saber si esta encendida o apagada, back y key +LiquidCrystal lcd (LCD_RS, LCD_E, LCD_D4, LCD_D5, LCD_D6, LCD_D7); //LCD setup // Key Light -int Key_Light_PWM = 3; // salida para pwm de key light +byte Key_Light_PWM = 11; // pin +byte Key_Light_SW = 3; // pin + + // Light external +byte Light_PWM = 10; // pin +byte Light_SW = 2; // pin // EEPROM -int BackLight_Add = 4094; // direccion de eeprom -int Contrast_Add = 4095; // direccion de eeprom -int Bank_Init_Add = 4093; // direccion de eeprom -int Key_Light_Add = 4092; // direccion de eeprom -int EEPROM_Limit = 4091; // limite de espacios en eeprom para universos +int BackLight_Add = 4094; // direccion de eeprom +int Contrast_Add = 4095; // direccion de eeprom +int Bank_Init_Add = 4093; // direccion de eeprom +int Key_Light_Add = 4092; // direccion de eeprom +int Light_Ext_Add = 4091; // direccion de eeprom +int EEPROM_Limit = 4090; // limite de espacios en eeprom para universos +byte EEPROM_Def_Jumper = 9; // pin void setup() { - // DMX - // pinMode(DMX_Data_Flux, OUTPUT); - - // Botones cursor - pinMode(Boton_Up, INPUT_PULLUP); - pinMode(Boton_Down, INPUT_PULLUP); - pinMode(Boton_Left, INPUT_PULLUP); - pinMode(Boton_Right, INPUT_PULLUP); - pinMode(11, INPUT_PULLUP); //Boton_Center, INPUT_PULLUP); + // Encoder + pinMode(Enc_Center, INPUT_PULLUP); + // no es necesario declarar CLK y data // Botones Teclado numerico - pinMode(Boton_Array_1, OUTPUT); - pinMode(Boton_Array_2, OUTPUT); - pinMode(Boton_Array_3, OUTPUT); - pinMode(Boton_Array_4, OUTPUT); - pinMode(Boton_Array_A, INPUT_PULLUP); - pinMode(Boton_Array_B, INPUT_PULLUP); - pinMode(Boton_Array_C, INPUT_PULLUP); - pinMode(Boton_Array_D, INPUT_PULLUP); - digitalWrite (Boton_Array_1, HIGH); - digitalWrite (Boton_Array_2, HIGH); - digitalWrite (Boton_Array_3, HIGH); - digitalWrite (Boton_Array_4, HIGH); + pinMode(Boton_Array_1, OUTPUT); + pinMode(Boton_Array_2, OUTPUT); + pinMode(Boton_Array_3, OUTPUT); + pinMode(Boton_Array_4, OUTPUT); + pinMode(Boton_Array_A, INPUT_PULLUP); + pinMode(Boton_Array_B, INPUT_PULLUP); + pinMode(Boton_Array_C, INPUT_PULLUP); + pinMode(Boton_Array_D, INPUT_PULLUP); + digitalWrite (Boton_Array_1, HIGH); + digitalWrite (Boton_Array_2, HIGH); + digitalWrite (Boton_Array_3, HIGH); + digitalWrite (Boton_Array_4, HIGH); // LCD - pinMode(LCD_RS, OUTPUT); - pinMode(LCD_E, OUTPUT); - pinMode(LCD_D7, OUTPUT); - pinMode(LCD_D6, OUTPUT); - pinMode(LCD_D5, OUTPUT); - pinMode(LCD_D4, OUTPUT); - pinMode(Back_Light_PWM, OUTPUT); + pinMode(LCD_RS, OUTPUT); + pinMode(LCD_E, OUTPUT); + pinMode(LCD_D7, OUTPUT); + pinMode(LCD_D6, OUTPUT); + pinMode(LCD_D5, OUTPUT); + pinMode(LCD_D4, OUTPUT); + pinMode(Back_Light_PWM, OUTPUT); + pinMode(Contrast_PWM, OUTPUT); lcd.begin(20, 4); //tamaño de LCD // Key Light - pinMode(Key_Light_PWM, OUTPUT); + pinMode(Key_Light_PWM, OUTPUT); + pinMode(Key_Light_SW, INPUT_PULLUP); + + // Light + pinMode(Light_PWM, OUTPUT); + pinMode(Light_SW, INPUT_PULLUP); + + // EEPROM Default + pinMode(EEPROM_Def_Jumper, INPUT); // no tiene pullup fisico // DMX ArduinoDmx0.set_tx_address (1); // poner aqui la direccion de inicio de DMX @@ -181,64 +180,70 @@ void setup() ArduinoDmx0.init_tx (DMX512); // iniciar transmision universo 0, modo estandar DMX512 // no conectados - pinMode (5, OUTPUT); - digitalWrite (5, LOW); - pinMode (22, OUTPUT); - digitalWrite (22, LOW); - pinMode (23, OUTPUT); - digitalWrite (23, LOW); - pinMode (24, OUTPUT); - digitalWrite (24, LOW); - pinMode (25, OUTPUT); - digitalWrite (25, LOW); - pinMode (26, OUTPUT); - digitalWrite (26, LOW); - pinMode (27, OUTPUT); - digitalWrite (27, LOW); - pinMode (28, OUTPUT); - digitalWrite (28, LOW); - pinMode (29, OUTPUT); - digitalWrite (29, LOW); - pinMode (31, OUTPUT); - digitalWrite (31, LOW); - pinMode (33, OUTPUT); - digitalWrite (33, LOW); - pinMode (35, OUTPUT); - digitalWrite (35, LOW); - pinMode (37, OUTPUT); - digitalWrite (37, LOW); - pinMode (39, OUTPUT); - digitalWrite (39, LOW); - pinMode (41, OUTPUT); - digitalWrite (41, LOW); - pinMode (46, OUTPUT); - digitalWrite (46, LOW); - pinMode (48, OUTPUT); - digitalWrite (48, LOW); - pinMode (50, OUTPUT); - digitalWrite (50, LOW); - pinMode (52, OUTPUT); - digitalWrite (52, LOW); - pinMode (A0, OUTPUT); - digitalWrite (A0, LOW); - pinMode (A1, OUTPUT); - digitalWrite (A1, LOW); - pinMode (A2, OUTPUT); - digitalWrite (A2, LOW); - pinMode (A3, OUTPUT); - digitalWrite (A3, LOW); - pinMode (A4, OUTPUT); - digitalWrite (A4, LOW); - pinMode (A5, OUTPUT); - digitalWrite (A5, LOW); - pinMode (A6, OUTPUT); - digitalWrite (A6, LOW); - pinMode (A7, OUTPUT); - digitalWrite (A7, LOW); - pinMode (A8, OUTPUT); - digitalWrite (A8, LOW); - pinMode (A9, OUTPUT); - digitalWrite (A9, LOW); + pinMode (5, OUTPUT); + digitalWrite (5, LOW); + pinMode (6, OUTPUT); + digitalWrite (6, LOW); + pinMode (20, OUTPUT); + digitalWrite (20, LOW); + pinMode (21, OUTPUT); + digitalWrite (21, LOW); + pinMode (22, OUTPUT); + digitalWrite (22, LOW); + pinMode (23, OUTPUT); + digitalWrite (23, LOW); + pinMode (24, OUTPUT); + digitalWrite (24, LOW); + pinMode (25, OUTPUT); + digitalWrite (25, LOW); + pinMode (26, OUTPUT); + digitalWrite (26, LOW); + pinMode (27, OUTPUT); + digitalWrite (27, LOW); + pinMode (28, OUTPUT); + digitalWrite (28, LOW); + pinMode (29, OUTPUT); + digitalWrite (29, LOW); + pinMode (31, OUTPUT); + digitalWrite (31, LOW); + pinMode (33, OUTPUT); + digitalWrite (33, LOW); + pinMode (35, OUTPUT); + digitalWrite (35, LOW); + pinMode (37, OUTPUT); + digitalWrite (37, LOW); + pinMode (39, OUTPUT); + digitalWrite (39, LOW); + pinMode (41, OUTPUT); + digitalWrite (41, LOW); + pinMode (46, OUTPUT); + digitalWrite (46, LOW); + pinMode (48, OUTPUT); + digitalWrite (48, LOW); + pinMode (50, OUTPUT); + digitalWrite (50, LOW); + pinMode (52, OUTPUT); + digitalWrite (52, LOW); + pinMode (A0, OUTPUT); + digitalWrite (A0, LOW); + pinMode (A1, OUTPUT); + digitalWrite (A1, LOW); + pinMode (A2, OUTPUT); + digitalWrite (A2, LOW); + pinMode (A3, OUTPUT); + digitalWrite (A3, LOW); + pinMode (A4, OUTPUT); + digitalWrite (A4, LOW); + pinMode (A5, OUTPUT); + digitalWrite (A5, LOW); + pinMode (A6, OUTPUT); + digitalWrite (A6, LOW); + pinMode (A7, OUTPUT); + digitalWrite (A7, LOW); + pinMode (A8, OUTPUT); + digitalWrite (A8, LOW); + pinMode (A9, OUTPUT); + digitalWrite (A9, LOW); pinMode (A10, OUTPUT); digitalWrite (A10, LOW); pinMode (A11, OUTPUT); @@ -249,51 +254,86 @@ void setup() digitalWrite (A13, LOW); pinMode (A14, OUTPUT); digitalWrite (A14, LOW); + pinMode (A15, OUTPUT); + digitalWrite (A15, LOW); } void loop() { - digitalWrite(2, HIGH); // max 485 como salida, no se deja asignar desde el apuntador Back_Light_Init(); // inicializador de Backlight desde eeprom Contrast_Init(); // inicializador de EEPROM desde eeprom + EEPROM_Default(); // jumper para default eeprom EEPROM_Load_Init(); // valores desde eeprom GUI_About(); // interface grafica de about GUI_Memory_Init(); // interface grafica de memoria } -void Back_Light_Init() +void EEPROM_Default() { - // lee y aplica el ultimo estado del backlight - - byte Back_Light_Value = EEPROM.read(BackLight_Add); - - analogWrite(Back_Light_PWM, Back_Light_Value); - - if (Back_Light_Value == 0) + // jumper cerrado, eeprom a default + // valores default + byte Key_Light_Val_Def = 255; // valor default de keylight + byte Ext_Light_Def = 255; + byte CH_DMX_Val_Def = 0; // valor default de canales DMX + byte Initial_Bank_Def = 1; // banco inicial de memoria a cargar + byte Backlight_Def = 255; + byte Contrast_Def = 150; + + if (digitalRead(EEPROM_Def_Jumper) == 0) { - Light_On_Off = 0; - } + lcd.clear (); + lcd.setCursor(1, 1); + lcd.print("EEPROM Default:"); - if (Back_Light_Value > 0) - { - Light_On_Off = 1; + // canales DMX + for (int ch = 0; ch <= EEPROM_Limit; ch ++) + { + EEPROM.write(ch, CH_DMX_Val_Def); + lcd.setCursor(16, 1); + lcd.print(ch); + } + + // backlight + EEPROM.write(BackLight_Add, Backlight_Def); + // contraste + EEPROM.write(Contrast_Add, Contrast_Def); + // Bank init + EEPROM.write(Bank_Init_Add, Initial_Bank_Def); + // Key light + EEPROM.write(Key_Light_Add, Key_Light_Val_Def); + // Light Ext + EEPROM.write(Light_Ext_Add, Ext_Light_Def); + + lcd.clear (); + lcd.setCursor(1, 0); + lcd.print("EEPROM Default ok!"); + lcd.setCursor(3, 2); + lcd.print("Remove jumper"); + lcd.setCursor(4, 3); + lcd.print("and reset!"); + while(1); } } -void Key_Light_Init() +void Back_Light_Init() { - // lee y aplica el ultimo estado del Key Light + // lee y aplica el ultimo estado del backlight - byte Key_Light_Value = EEPROM.read (Key_Light_Add); - - analogWrite(Key_Light_PWM, Key_Light_Value); + byte Back_Light_Value = EEPROM.read(BackLight_Add); + + // dimmer de pantalla + for (int dim = 0; dim <= Back_Light_Value; dim ++) + { + analogWrite(Back_Light_PWM, dim); + delay(3); // aqui el retardo para el dimmer + } - if (Key_Light_Value == 0) + if (Back_Light_Value == 0) { Light_On_Off = 0; } - if (Key_Light_Value > 0) + if (Back_Light_Value > 0) { Light_On_Off = 1; } @@ -301,7 +341,7 @@ void Key_Light_Init() void Contrast_Init() { - // lee y aplica el ultimo estado del comtrast + // lee y aplica el ultimo estado del contrast byte Contrast_Value = EEPROM.read(Contrast_Add); @@ -379,7 +419,7 @@ void Light_En() Light_On_Off = 0; } -salida: + salida: delay(300); // para impedir repeticion del comando } @@ -454,9 +494,9 @@ void GUI_About() // imprimir about byte Firm_Ver_Ent = 1; - byte Firm_Ver_Dec = 7; + byte Firm_Ver_Dec = 8; byte Hard_Ver_Ent = 0; - byte Hard_Ver_Dec = 5; + byte Hard_Ver_Dec = 7; byte Key_Light_Value = EEPROM.read(Key_Light_Add); byte Back_Light_Value = EEPROM.read(BackLight_Add); @@ -528,10 +568,8 @@ void GUI_About() lcd.setCursor(10, 2); // Blink // lectura del boton centro - while (digitalRead(Boton_Center) == HIGH) - { + while (digitalRead(Enc_Center) == HIGH); - } delay (300); // rebote de boton lcd.clear (); lcd.setCursor(0, 0); @@ -558,10 +596,8 @@ void GUI_About() lcd.setCursor(19, 1); // lectura del boton centro - while (digitalRead(Boton_Center) == HIGH) - { + while (digitalRead(Enc_Center) == HIGH); - } delay (300); // rebote de boton lcd.noBlink (); } @@ -602,7 +638,7 @@ void GUI_Control_Matrix() int Inicial = 1; Canal_Actual = 1; -inicio: + inicio: lcd.clear(); lcd.setCursor (0, 0); @@ -655,7 +691,7 @@ inicio: Cursor_Conf[3][16] = 1; // navegar -Banco: + Banco: GUI_Navegar(1, Inicial); @@ -826,7 +862,7 @@ Banco: goto Salida_DMX; } -Salida_DMX: + Salida_DMX: Num_Row_Pos = LCD_Row_Pos; Num_Col_Pos = LCD_Col_Pos + 1; @@ -876,2928 +912,2915 @@ void GUI_Navegar(byte matrix, int banco) int Boton_Delay_Cursor = 300; // delay de lectura de boton byte LCD_Col_Pos_Ant; // saber el estado anterior para borrar cursor byte LCD_Row_Pos_Ant; // saber el estado anterior para borrar cursor - - // guardar valor anterior de row col + + // guardar valor anterior de row col LCD_Col_Pos_Ant = LCD_Col_Pos; LCD_Row_Pos_Ant = LCD_Row_Pos; - // Dibujar cursor + // Dibujar cursor lcd.setCursor (LCD_Col_Pos, LCD_Row_Pos); - lcd.print(">"); - - // navegacion - -Dibujar: - - byte Dibujar_Cursor = 0; // saber si dibujar cursor para evitar repeticiones en lcd, 0 no dibujar, 1 dibujar >, 2 dibujar + - - // LCD Back Light * - digitalWrite(Boton_Array_1, LOW); // lectura linea 1 - if (digitalRead(Boton_Array_D) == LOW) - { - delay(Boton_Delay_Teclado); - Light_En(); - } - digitalWrite(Boton_Array_1, HIGH); // lectura linea 1 - - // Left - if (digitalRead(Boton_Left) == LOW) - { - delay (Boton_Delay_Cursor); - byte Salida_Left = 0; - byte LCD_Col_Pos_Temp = 0; - LCD_Col_Pos_Temp = LCD_Col_Pos; - - while (Salida_Left == 0) - { - if (LCD_Col_Pos_Temp == 0) - { - LCD_Col_Pos_Temp = 20; - } - - LCD_Col_Pos_Temp = LCD_Col_Pos_Temp - 1; - - if (Cursor_Conf[LCD_Row_Pos][LCD_Col_Pos_Temp] == 1) - { - LCD_Col_Pos = LCD_Col_Pos_Temp; - Dibujar_Cursor = 1; - Salida_Left = 1; - } - } - goto Salida; + lcd.print(">"); + + // navegacion + + Dibujar: + + byte Dibujar_Cursor = 0; // saber si dibujar cursor para evitar repeticiones en lcd, 0 no dibujar, 1 dibujar >, 2 dibujar + + + // LCD Back Light * + digitalWrite(Boton_Array_1, LOW); // lectura linea 1 + if (digitalRead(Boton_Array_D) == LOW) + { + delay(Boton_Delay_Teclado); + Light_En(); + } + digitalWrite(Boton_Array_1, HIGH); // lectura linea 1 + + /* // Left + if (digitalRead(Boton_Left) == LOW) + { + delay (Boton_Delay_Cursor); + byte Salida_Left = 0; + byte LCD_Col_Pos_Temp = 0; + LCD_Col_Pos_Temp = LCD_Col_Pos; + while (Salida_Left == 0) + { + if (LCD_Col_Pos_Temp == 0) + { + LCD_Col_Pos_Temp = 20; + } + LCD_Col_Pos_Temp = LCD_Col_Pos_Temp - 1; + if (Cursor_Conf[LCD_Row_Pos][LCD_Col_Pos_Temp] == 1) + { + LCD_Col_Pos = LCD_Col_Pos_Temp; + Dibujar_Cursor = 1; + Salida_Left = 1; + } + } + goto Salida; } - - // Right - if (digitalRead(Boton_Right) == LOW) - { - delay(Boton_Delay_Cursor); - byte Salida_Right = 0; - byte LCD_Col_Pos_Temp = 0; - LCD_Col_Pos_Temp = LCD_Col_Pos; - - while (Salida_Right == 0) - { - LCD_Col_Pos_Temp = LCD_Col_Pos_Temp + 1; - - if (LCD_Col_Pos_Temp >= 20) - { - LCD_Col_Pos_Temp = 0; // regresar al cero - } - if (Cursor_Conf[LCD_Row_Pos][LCD_Col_Pos_Temp] == 1) - { - LCD_Col_Pos = LCD_Col_Pos_Temp; - Dibujar_Cursor = 1; - Salida_Right = 1; - } - } - goto Salida; - } - - // Down - if (digitalRead(Boton_Down) == LOW) - { - delay(Boton_Delay_Cursor); - byte Salida_Down = 0; - byte LCD_Row_Pos_Temp = 0; - LCD_Row_Pos_Temp = LCD_Row_Pos; + // Right + if (digitalRead(Boton_Right) == LOW) + { + delay(Boton_Delay_Cursor); + byte Salida_Right = 0; + byte LCD_Col_Pos_Temp = 0; + LCD_Col_Pos_Temp = LCD_Col_Pos; + while (Salida_Right == 0) + { + LCD_Col_Pos_Temp = LCD_Col_Pos_Temp + 1; + if (LCD_Col_Pos_Temp >= 20) + { + LCD_Col_Pos_Temp = 0; // regresar al cero + } + if (Cursor_Conf[LCD_Row_Pos][LCD_Col_Pos_Temp] == 1) + { + LCD_Col_Pos = LCD_Col_Pos_Temp; + Dibujar_Cursor = 1; + Salida_Right = 1; + } + } + goto Salida; + } + + // Down + if (digitalRead(Boton_Down) == LOW) + { + delay(Boton_Delay_Cursor); + byte Salida_Down = 0; + byte LCD_Row_Pos_Temp = 0; + LCD_Row_Pos_Temp = LCD_Row_Pos; + while (Salida_Down == 0) + { + LCD_Row_Pos_Temp = LCD_Row_Pos_Temp + 1; + if (LCD_Row_Pos_Temp >= 4) + { + LCD_Row_Pos_Temp = 0; // regresar al cero + } + if (Cursor_Conf[LCD_Row_Pos_Temp][LCD_Col_Pos] == 1) + { + LCD_Row_Pos = LCD_Row_Pos_Temp; + Dibujar_Cursor = 1; + Salida_Down = 1; + } + } + goto Salida; + } + + // Up + if (digitalRead(Boton_Up) == LOW) + { + delay(Boton_Delay_Cursor); + byte Salida_Up = 0; + byte LCD_Row_Pos_Temp; + LCD_Row_Pos_Temp = LCD_Row_Pos; + while (Salida_Up == 0) + { + if (LCD_Row_Pos_Temp <= 0) + { + LCD_Row_Pos_Temp = 4; + } + LCD_Row_Pos_Temp = LCD_Row_Pos_Temp - 1; + if (Cursor_Conf[LCD_Row_Pos_Temp][LCD_Col_Pos] == 1) + { + Dibujar_Cursor = 1; + LCD_Row_Pos = LCD_Row_Pos_Temp; + Salida_Up = 1; + } + } + goto Salida; + }*/ + + // Center + if (digitalRead(Enc_Center) == LOW) + { + delay(Boton_Delay_Cursor); + byte Salida_Center = 0; + while (Salida_Center == 0) + { + if (Cursor_Conf[LCD_Row_Pos][LCD_Col_Pos] == 1) + { + Dibujar_Cursor = 2; // dibujar + + Salida_Center = 1; + } + } + } + + Salida: + + // Dibujar Cursor + if (Dibujar_Cursor > 0) + { + if (Dibujar_Cursor == 1) + { + // borra el anterior + lcd.setCursor (LCD_Col_Pos_Ant, LCD_Row_Pos_Ant); + lcd.print(" "); + // escribir > + lcd.setCursor (LCD_Col_Pos, LCD_Row_Pos); + lcd.print(">"); + // matrix print posicion + if (matrix == 1) + { + // banco inicial + if (LCD_Col_Pos == 12 && LCD_Row_Pos == 0) + { + lcd.setCursor(1, 0); + lcd.print("---"); + goto salida; + } + // banco final + if (LCD_Col_Pos == 16 && LCD_Row_Pos == 0) + { + lcd.setCursor(1, 0); + lcd.print("---"); + goto salir; + } + // Memory + if (LCD_Col_Pos == 4 && LCD_Row_Pos == 0) + { + lcd.setCursor(1, 0); + lcd.print("---"); + goto salida; + } + // Unitary + if (LCD_Col_Pos == 8 && LCD_Row_Pos == 0) + { + lcd.setCursor(1, 0); + lcd.print("---"); + goto salida; + } + // banco 1 + if (LCD_Col_Pos == 0 && LCD_Row_Pos == 1) + { + Numerico_Write (banco, 1, 0); + goto salida; + } + // banco 2 + if (LCD_Col_Pos == 4 && LCD_Row_Pos == 1) + { + Numerico_Write (banco + 1, 1, 0); + goto salida; + } + // banco 3 + if (LCD_Col_Pos == 8 && LCD_Row_Pos == 1) + { + Numerico_Write (banco + 2, 1, 0); + goto salida; + } + // banco 4 + if (LCD_Col_Pos == 12 && LCD_Row_Pos == 1) + { + Numerico_Write (banco + 3, 1, 0); + goto salida; + } + // banco 5 + if (LCD_Col_Pos == 16 && LCD_Row_Pos == 1) + { + Numerico_Write (banco + 4, 1, 0); + goto salida; + } + // banco 6 + if (LCD_Col_Pos == 0 && LCD_Row_Pos == 2) + { + Numerico_Write (banco + 5, 1, 0); + goto salida; + } + // banco 7 + if (LCD_Col_Pos == 4 && LCD_Row_Pos == 2) + { + Numerico_Write (banco + 6, 1, 0); + goto salida; + } + // banco 8 + if (LCD_Col_Pos == 8 && LCD_Row_Pos == 2) + { + Numerico_Write (banco + 7, 1, 0); + goto salida; + } + // banco 9 + if (LCD_Col_Pos == 12 && LCD_Row_Pos == 2) + { + Numerico_Write (banco + 8, 1, 0); + goto salida; + } + // banco 10 + if (LCD_Col_Pos == 16 && LCD_Row_Pos == 2) + { + Numerico_Write (banco + 9, 1, 0); + goto salida; + } + // banco 11 + if (LCD_Col_Pos == 0 && LCD_Row_Pos == 3) + { + Numerico_Write (banco + 10, 1, 0); + goto salida; + } + // banco 12 + if (LCD_Col_Pos == 4 && LCD_Row_Pos == 3) + { + Numerico_Write (banco + 11, 1, 0); + goto salida; + } + // banco 13 + if (LCD_Col_Pos == 8 && LCD_Row_Pos == 3) + { + Numerico_Write (banco + 12, 1, 0); + goto salida; + } + // banco 14 + if (LCD_Col_Pos == 12 && LCD_Row_Pos == 3) + { + Numerico_Write (banco + 13, 1, 0); + goto salida; + } + // banco 15 + if (LCD_Col_Pos == 16 && LCD_Row_Pos == 3) + { + Numerico_Write (banco + 14, 1, 0); + goto salida; + } + + // escribir guion de bancos + salida: + + lcd.setCursor(16, 0); + lcd.print("-"); + + salir: {} + + } + } + else + { + // escribir + + lcd.setCursor (LCD_Col_Pos, LCD_Row_Pos); + lcd.print("+"); + } + + //salida + LCD_Col_Pos_Ant = LCD_Col_Pos; + LCD_Row_Pos_Ant = LCD_Row_Pos; + if (Dibujar_Cursor == 2) + { + goto Salir; + } + else + { + Dibujar_Cursor = 0; + } + } + goto Dibujar; + + Salir: {} - while (Salida_Down == 0) - { - LCD_Row_Pos_Temp = LCD_Row_Pos_Temp + 1; +} - if (LCD_Row_Pos_Temp >= 4) - { - LCD_Row_Pos_Temp = 0; // regresar al cero - } +void GUI_Memory_Init() +{ - if (Cursor_Conf[LCD_Row_Pos_Temp][LCD_Col_Pos] == 1) - { - LCD_Row_Pos = LCD_Row_Pos_Temp; - Dibujar_Cursor = 1; - Salida_Down = 1; - } - } - goto Salida; - } + inicio: - // Up - if (digitalRead(Boton_Up) == LOW) - { - delay(Boton_Delay_Cursor); - byte Salida_Up = 0; - byte LCD_Row_Pos_Temp; - LCD_Row_Pos_Temp = LCD_Row_Pos; + int salir = 0; + lcd.clear (); + + // Texto + lcd.setCursor (0, 0); + lcd.print("Initial Memory:"); + lcd.setCursor (2, 2); + lcd.print("Empty"); + lcd.setCursor (9, 2); + lcd.print("Load"); + lcd.setCursor (15, 2); + lcd.print("Clear"); + + // bank + lcd.setCursor(18, 0); + lcd.print("b"); + + if (Universo_Actual == 0) + { + lcd.print("-"); + } + else + { + lcd.print(Universo_Actual); + } + + // Cursor + LCD_Col_Pos = 1; // posicion de cursor + LCD_Row_Pos = 2; + + // configuracion de cursor + Cursor_Conf_Clear(); // limpiar array + + // Acciones + Cursor_Conf[2][1] = 1; // Empty + Cursor_Conf[2][8] = 1; // Load + Cursor_Conf[2][14] = 1; // Clear + + // navegar + GUI_Navegar(0, 0); + + // Acciones + // Load + if (LCD_Col_Pos == 8 && LCD_Row_Pos == 2) + { + salir = EEPROM_Load(); + if (salir == 1) + { + goto inicio; + } + GUI_Control_Options(); + } + + // Clear + if (LCD_Col_Pos == 14 && LCD_Row_Pos == 2) + { + salir = EEPROM_Clear(); + if (salir == 1) + { + goto inicio; + } + GUI_Control_Options(); + } + + // Empty + if (LCD_Col_Pos == 1 && LCD_Row_Pos == 2) + { + GUI_Control_Options(); + } +} - while (Salida_Up == 0) - { - if (LCD_Row_Pos_Temp <= 0) - { - LCD_Row_Pos_Temp = 4; - } +int GUI_Memory_Bank(byte Opcion) +{ + // regresa 1 si se selecciona salir, de lo contrario 0 + // recibe opcion para pintar en la pantalla lo que se selecciono + + int salir = 0; + lcd.clear (); + delay (200); // retardo para no seleccionar inmediatamente la opcion del banco + + // Texto + lcd.setCursor (6, 0); + lcd.print("Memory Bank:"); + lcd.setCursor (1, 1); + lcd.print("Bank1 Bank4 Bank7"); + lcd.setCursor (1, 2); + lcd.print("Bank2 Bank5 Bank8"); + lcd.setCursor (1, 3); + lcd.print("Bank3 Bank6 Exit"); + + switch (Opcion) + { + case 1: + lcd.setCursor (1, 0); + lcd.print("Save"); + break; + + case 2: + lcd.setCursor (1, 0); + lcd.print("Load"); + break; + + case 3: + lcd.setCursor (0, 0); + lcd.print("Clear"); + break; + } + + // Universo Actual + lcd.setCursor (19, 0); + + if (Universo_Actual == 0) + { + lcd.print("-"); + } + else + { + lcd.print(Universo_Actual); + } + + // Cursor inicial + LCD_Col_Pos = 0; // posicion de cursor + LCD_Row_Pos = 1; + + // configuracion de cursor + Cursor_Conf_Clear(); // limpiar array + + // Acciones + Cursor_Conf[1][0] = 1; // Bank 1 + Cursor_Conf[2][0] = 1; // Bank 2 + Cursor_Conf[3][0] = 1; // Bank 3 + Cursor_Conf[1][7] = 1; // Bank 4 + Cursor_Conf[2][7] = 1; // Bank 5 + Cursor_Conf[3][7] = 1; // Bank 6 + Cursor_Conf[1][14] = 1; // Bank 7 + Cursor_Conf[2][14] = 1; // Bank 8 + Cursor_Conf[3][14] = 1; // Exit + + // navegar + GUI_Navegar(0, 0); + + // Acciones + // Bank 1 + if (LCD_Col_Pos == 0 && LCD_Row_Pos == 1) + { + Universo_Actual = 1; + goto Salida; + } + + // Bank 2 + if (LCD_Col_Pos == 0 && LCD_Row_Pos == 2) + { + Universo_Actual = 2; + goto Salida; + } + + // Bank 3 + if (LCD_Col_Pos == 0 && LCD_Row_Pos == 3) + { + Universo_Actual = 3; + goto Salida; + } + + // Bank 4 + if (LCD_Col_Pos == 7 && LCD_Row_Pos == 1) + { + Universo_Actual = 4; + goto Salida; + } + + // Bank 5 + if (LCD_Col_Pos == 7 && LCD_Row_Pos == 2) + { + Universo_Actual = 5; + goto Salida; + } + + // Bank 6 + if (LCD_Col_Pos == 7 && LCD_Row_Pos == 3) + { + Universo_Actual = 6; + goto Salida; + } + + // Bank 7 + if (LCD_Col_Pos == 14 && LCD_Row_Pos == 1) + { + Universo_Actual = 7; + goto Salida; + } + + // Bank 8 + if (LCD_Col_Pos == 14 && LCD_Row_Pos == 2) + { + Universo_Actual = 8; + goto Salida; + } + + // Exit + if (LCD_Col_Pos == 14 && LCD_Row_Pos == 3) + { + salir = 1; + } + + Salida: + + return salir; +} - LCD_Row_Pos_Temp = LCD_Row_Pos_Temp - 1; +void GUI_Memory() +{ - if (Cursor_Conf[LCD_Row_Pos_Temp][LCD_Col_Pos] == 1) - { - Dibujar_Cursor = 1; - LCD_Row_Pos = LCD_Row_Pos_Temp; - Salida_Up = 1; - } - } - goto Salida; - } - - // Center - if (digitalRead(Boton_Center) == LOW) - { - delay(Boton_Delay_Cursor); - byte Salida_Center = 0; - while (Salida_Center == 0) - { - if (Cursor_Conf[LCD_Row_Pos][LCD_Col_Pos] == 1) - { - Dibujar_Cursor = 2; // dibujar + - Salida_Center = 1; - } - } - } - -Salida: + iniciar: + + // Texto + lcd.clear (); + lcd.setCursor (0, 0); + lcd.print("Memory: b"); + + if (Universo_Actual == 0) + { + lcd.print("-"); + } + else + { + lcd.print(Universo_Actual); + } + + lcd.setCursor (1, 1); + lcd.print("Save"); + lcd.setCursor (1, 2); + lcd.print("Load"); + lcd.setCursor (1, 3); + lcd.print("Clear"); + lcd.setCursor (7, 2); + lcd.print("ClearAll"); + lcd.setCursor (7, 1); + lcd.print("BlackOut"); + lcd.setCursor (16, 3); + lcd.print("Exit"); + lcd.setCursor (7, 3); + lcd.print("EmptyRAM"); + + // Cursor + LCD_Col_Pos = 0; // posicion de cursor + LCD_Row_Pos = 1; + + // configuracion de cursor + Cursor_Conf_Clear(); // limpiar array + + // Acciones + Cursor_Conf[1][0] = 1; // Save + Cursor_Conf[2][0] = 1; // Load + Cursor_Conf[3][0] = 1; // Clear + Cursor_Conf[2][6] = 1; // Clear All + Cursor_Conf[3][6] = 1; // Empty RAM + Cursor_Conf[1][6] = 1; // Black Out + Cursor_Conf[3][15] = 1; // Exit + + // navegar + regresa: + + GUI_Navegar(0, 0); - // Dibujar Cursor - if (Dibujar_Cursor > 0) - { - if (Dibujar_Cursor == 1) - { - // borra el anterior - lcd.setCursor (LCD_Col_Pos_Ant, LCD_Row_Pos_Ant); - lcd.print(" "); - // escribir > - lcd.setCursor (LCD_Col_Pos, LCD_Row_Pos); - lcd.print(">"); - // matrix print posicion - if (matrix == 1) - { - // banco inicial - if (LCD_Col_Pos == 12 && LCD_Row_Pos == 0) - { - lcd.setCursor(1, 0); - lcd.print("---"); - goto salida; - } + // Acciones + // Load + if (LCD_Col_Pos == 0 && LCD_Row_Pos == 2) + { + if (EEPROM_Load() == 1) + { + goto iniciar; + } + goto salida; + } + + // Clear + if (LCD_Col_Pos == 0 && LCD_Row_Pos == 3) + { + if (EEPROM_Clear() == 1) + { + goto iniciar; + } + goto salida; + } + + // Clear All + if (LCD_Col_Pos == 6 && LCD_Row_Pos == 2) + { + EEPROM_Clear_All(); + goto salida; + } + + // Save + if (LCD_Col_Pos == 0 && LCD_Row_Pos == 1) + { + if (EEPROM_Save() == 1) + { + goto iniciar; + } + goto salida; + } + + // Empty RAM + if (LCD_Col_Pos == 6 && LCD_Row_Pos == 3) + { + EEPROM_Empty(); + goto salida; + } + + // Black Out + if (LCD_Col_Pos == 6 && LCD_Row_Pos == 1) + { + Black_Out(); + goto regresa; + } + + // Exit + if (LCD_Col_Pos == 15 && LCD_Row_Pos == 3) {} + + salida: {} - // banco final - if (LCD_Col_Pos == 16 && LCD_Row_Pos == 0) - { - lcd.setCursor(1, 0); - lcd.print("---"); - goto salir; - } +} - // Memory - if (LCD_Col_Pos == 4 && LCD_Row_Pos == 0) - { - lcd.setCursor(1, 0); - lcd.print("---"); - goto salida; - } +void GUI_Control_Secuencer() +{ + // secuenciador de bancos guardados en eeprom + + int Delay_Secuencia = 1; + int First_Bank = 1; + int Final_Bank = 8; + lcd.clear (); + + // Texto + lcd.setCursor (0, 0); + lcd.print("Secuencer Banks: b"); + + if (Universo_Actual == 0) + { + lcd.print("-"); + } + else + { + lcd.print(Universo_Actual); + } + + lcd.setCursor (4, 1); + lcd.print("Delay 001x100=mS"); + lcd.setCursor (0, 2); + lcd.print("FirstBank 001 Exit"); + lcd.setCursor (0, 3); + lcd.print("FinalBank 008 Start"); + + // Cursor + LCD_Col_Pos = 9; // posicion de cursor + LCD_Row_Pos = 1; + + // configuracion de cursor + Cursor_Conf_Clear(); // limpiar array + + // Acciones + Cursor_Conf[1][9] = 1; // Delay + Cursor_Conf[2][9] = 1; // First Bank + Cursor_Conf[3][9] = 1; // Final Bank + Cursor_Conf[2][14] = 1; // Control + Cursor_Conf[3][14] = 1; // start + + inicio: + + lcd.setCursor (15, 3); + lcd.print("Start"); + lcd.noBlink(); + + // navegar + GUI_Navegar(0, 0); - // Unitary - if (LCD_Col_Pos == 8 && LCD_Row_Pos == 0) - { - lcd.setCursor(1, 0); - lcd.print("---"); - goto salida; - } + // Acciones + // Delay + if (LCD_Col_Pos == 9 && LCD_Row_Pos == 1) + { + Num_Row_Pos = 1; + Num_Col_Pos = 10; + Num_Val = Delay_Secuencia; // para dejar el numero que estaba si no se cambia + Numerico_Calc(0); + + if (Num_Val == 0) + { + Numerico_Write (1, 10, 1); + Delay_Secuencia = 1; + Numerico_Write (Delay_Secuencia, 10, 1); + } + else + { + Delay_Secuencia = Num_Val; // por el multiplicador + } + + if (Num_Val > 100) + { + Delay_Secuencia = 100; + Numerico_Write (Delay_Secuencia, 10, 1); + } + + goto inicio; + } + + // First Bank + if (LCD_Col_Pos == 9 && LCD_Row_Pos == 2) + { + Num_Row_Pos = 2; + Num_Col_Pos = 10; + Num_Val = First_Bank; // para dejar el numero que estaba si no se cambia + Numerico_Calc(0); + First_Bank = Num_Val; + + if (Num_Val == 0) + { + First_Bank = 1; + Numerico_Write (First_Bank, 10, 2); + } + + if (Num_Val > 8) + { + Numerico_Write (8, 10, 2); + First_Bank = 8; + } + + goto inicio; + } + + // Final Bank + if (LCD_Col_Pos == 9 && LCD_Row_Pos == 3) + { + Num_Row_Pos = 3; + Num_Col_Pos = 10; + Num_Val = Final_Bank; // para dejar el numero que estaba si no se cambia + Numerico_Calc(0); + Final_Bank = Num_Val; + + if (Num_Val == 0) + { + Final_Bank = 1; + Numerico_Write (Final_Bank, 10, 3); + } + + if (Num_Val > 8) + { + Numerico_Write (8, 10, 2); + Final_Bank = 8; + } + + goto inicio; + } + + // Control + if (LCD_Col_Pos == 14 && LCD_Row_Pos == 2) + { + // restablecer salida dmx como estaba antes de entrar + for (int Canal = 0; Canal <= 512; Canal ++) + { + ArduinoDmx0.TxBuffer[Canal] = DMX_Values[Canal]; // salida a DMX + } + GUI_Control_Options (); + } + + // start + if (LCD_Col_Pos == 14 && LCD_Row_Pos == 3) + { + // validar + if (First_Bank == Final_Bank) + { + First_Bank = 1; + Numerico_Write (First_Bank, 10, 2); + Final_Bank = 8; + Numerico_Write (Final_Bank, 10, 2); + goto inicio; + } + + // LCD + lcd.setCursor (14, 3); + lcd.print("+"); + lcd.setCursor (15, 3); + lcd.print("Stop "); + + // establecer reversa o adelante + byte Adelante_Reversa = 0; // 0 Adelante, 1 Reversa + + // adelante + if (First_Bank < Final_Bank) + { + Adelante_Reversa = 0; + } + + // reversa + if (First_Bank > Final_Bank) + { + Adelante_Reversa = 1; + } + + // establecer bancos a secuenciar + byte Bancos [9] = {0, 0, 0, 0, 0, 0, 0, 0}; + + if (Adelante_Reversa == 0) + { + for (byte Bank = 1; Bank <= 8; Bank ++) + { + if (Bank >= First_Bank && Bank <= Final_Bank) + { + Bancos[Bank] = 1; + } + } + } + + if (Adelante_Reversa == 1) + { + for (byte Bank = 8; Bank >= 1; Bank --) + { + if (Bank <= First_Bank && Bank >= Final_Bank) + { + Bancos[Bank] = 1; + } + } + } + + //Secuenciar + byte value = 0; + lcd.blink(); + + // adelante + if (Adelante_Reversa == 0) + { + + contar: + + for (byte conteo = 1; conteo <= 8; conteo ++) + { + if (Bancos [conteo] == 1) + { + lcd.setCursor (19, 0); + lcd.print(conteo); + lcd.setCursor (19, 3); + for (int canal = 0; canal <= 511; canal ++) + { + switch (conteo) + { + case 1: + value = EEPROM.read(canal); + ArduinoDmx0.TxBuffer[canal] = value; // salida a DMX + break; + + case 2: + value = EEPROM.read(canal + 512); + ArduinoDmx0.TxBuffer[canal] = value; // salida a DMX + break; + + case 3: + value = EEPROM.read(canal + 1024); + ArduinoDmx0.TxBuffer[canal] = value; // salida a DMX + break; + + case 4: + value = EEPROM.read(canal + 1536); + ArduinoDmx0.TxBuffer[canal] = value; // salida a DMX + break; + + case 5: + value = EEPROM.read(canal + 2048); + ArduinoDmx0.TxBuffer[canal] = value; // salida a DMX + break; + + case 6: + value = EEPROM.read(canal + 2560); + ArduinoDmx0.TxBuffer[canal] = value; // salida a DMX + break; + + case 7: + value = EEPROM.read(canal + 3072); + ArduinoDmx0.TxBuffer[canal] = value; // salida a DMX + break; + + case 8: + value = EEPROM.read(canal + 3584); + ArduinoDmx0.TxBuffer[canal] = value; // salida a DMX + break; + } + } + + //delay + long delay_contar = Delay_Secuencia * 100; + + while (digitalRead(Enc_Center) == HIGH) // lectura del boton centro + { + for (long contar = 0; contar <= delay_contar; contar ++) + { + delay(1); + if (digitalRead(Enc_Center) == LOW) + { + goto salida; + } + } + goto Delay_Salir; + } + + salida: + + delay(500); // rebote de boton + goto inicio; + + Delay_Salir: {} + + } + } + goto contar; + } + + // reversa + if (Adelante_Reversa == 1) + { + + contar_rev: + + for (byte conteo = 8; conteo >= 1; conteo --) + { + if (Bancos [conteo] == 1) + { + lcd.setCursor (19, 0); + lcd.print(conteo); + lcd.setCursor (19, 3); + for (int canal = 0; canal <= 511; canal ++) + { + switch (conteo) + { + case 1: + value = EEPROM.read(canal); + ArduinoDmx0.TxBuffer[canal] = value; // salida a DMX + break; + + case 2: + value = EEPROM.read(canal + 512); + ArduinoDmx0.TxBuffer[canal] = value; // salida a DMX + break; + + case 3: + value = EEPROM.read(canal + 1024); + ArduinoDmx0.TxBuffer[canal] = value; // salida a DMX + break; + + case 4: + value = EEPROM.read(canal + 1536); + ArduinoDmx0.TxBuffer[canal] = value; // salida a DMX + break; + + case 5: + value = EEPROM.read(canal + 2048); + ArduinoDmx0.TxBuffer[canal] = value; // salida a DMX + break; + + case 6: + value = EEPROM.read(canal + 2560); + ArduinoDmx0.TxBuffer[canal] = value; // salida a DMX + break; + + case 7: + value = EEPROM.read(canal + 3072); + ArduinoDmx0.TxBuffer[canal] = value; // salida a DMX + break; + + case 8: + value = EEPROM.read(canal + 3584); + ArduinoDmx0.TxBuffer[canal] = value; // salida a DMX + break; + } + } + + //delay + long delay_contar = Delay_Secuencia * 100; + + while (digitalRead(Enc_Center) == HIGH) // lectura del boton centro + { + for (long contar = 0; contar <= delay_contar; contar ++) + { + delay(1); + if (digitalRead(Enc_Center) == LOW) + { + goto salida_rev; + } + } + goto Delay_Salir_Rev; + } + + salida_rev: + + delay(500); // rebote de boton + goto inicio; + + Delay_Salir_Rev: {} + + } + } + goto contar_rev; + } + } + goto inicio; +} - // banco 1 - if (LCD_Col_Pos == 0 && LCD_Row_Pos == 1) - { - Numerico_Write (banco, 1, 0); - goto salida; - } +void Black_Out() +{ + lcd.setCursor (15, 1); + lcd.blink(); - // banco 2 - if (LCD_Col_Pos == 4 && LCD_Row_Pos == 1) - { - Numerico_Write (banco + 1, 1, 0); - goto salida; - } + // limpiar universo + for (int Canal = 1; Canal <= 512; Canal ++) + { + ArduinoDmx0.TxBuffer[Canal - 1] = 0; + } - // banco 3 - if (LCD_Col_Pos == 8 && LCD_Row_Pos == 1) - { - Numerico_Write (banco + 2, 1, 0); - goto salida; - } + // esperar al boton centro para cancelar + while (digitalRead(Enc_Center) == HIGH) {} - // banco 4 - if (LCD_Col_Pos == 12 && LCD_Row_Pos == 1) - { - Numerico_Write (banco + 3, 1, 0); - goto salida; - } + delay(300); // retardo de rebote de boton - // banco 5 - if (LCD_Col_Pos == 16 && LCD_Row_Pos == 1) - { - Numerico_Write (banco + 4, 1, 0); - goto salida; - } + // regresar el universo a su lugar + for (int Canal = 1; Canal <= 512; Canal ++) + { + ArduinoDmx0.TxBuffer[Canal - 1] = DMX_Values[Canal]; + } - // banco 6 - if (LCD_Col_Pos == 0 && LCD_Row_Pos == 2) - { - Numerico_Write (banco + 5, 1, 0); - goto salida; - } + lcd.setCursor (6, 2); + lcd.noBlink(); +} - // banco 7 - if (LCD_Col_Pos == 4 && LCD_Row_Pos == 2) - { - Numerico_Write (banco + 6, 1, 0); - goto salida; - } +int EEPROM_Save() +{ + // guarda el universo en la eeprom + // regresa 1 si se selecciona exit + + int cancel = 0; // regresa 1 si se selecciona salir + int bank; // regresa 1 si se selecciona salir + int EEPROM_Add = 0; // direccion de eeprom para universos + bank = GUI_Memory_Bank(1); // seleccinar banco + + if (bank == 1) + { + cancel = 1; + goto salida; + } + + lcd.clear (); + lcd.setCursor (1, 1); + lcd.print ("Memory Saving..."); + lcd.setCursor (1, 2); + lcd.print ("Bank: "); + lcd.setCursor (7, 2); + lcd.print (Universo_Actual); + lcd.setCursor (19, 3); + lcd.blink(); + + for (int Canal = 0; Canal <= 511; Canal ++) + { + // Escritura de universo EEPROM + switch (Universo_Actual) + { + case 1: + EEPROM_Add = 0 + Canal; + break; + + case 2: + EEPROM_Add = 512 + Canal; + break; + + case 3: + EEPROM_Add = 1024 + Canal; + break; + + case 4: + EEPROM_Add = 1536 + Canal; + break; + + case 5: + EEPROM_Add = 2048 + Canal; + break; + + case 6: + EEPROM_Add = 2560 + Canal; + break; + + case 7: + EEPROM_Add = 3072 + Canal; + break; + + case 8: + EEPROM_Add = 3584 + Canal; + if (EEPROM_Add > EEPROM_Limit) + { + EEPROM_Add = EEPROM_Limit; + } + break; + } + + EEPROM.write(EEPROM_Add, DMX_Values[Canal + 1]); // lectura desde EEPROM + } + + lcd.clear (); + lcd.setCursor (3, 1); + lcd.print ("Memory Saved!"); + lcd.setCursor (3, 2); + lcd.print ("Bank: "); + lcd.print (Universo_Actual); + lcd.setCursor (19, 3); + delay (1000); + lcd.noBlink(); + + salida: + + return cancel; +} - // banco 8 - if (LCD_Col_Pos == 8 && LCD_Row_Pos == 2) - { - Numerico_Write (banco + 7, 1, 0); - goto salida; - } +int EEPROM_Load() +{ + // guarda los valores en la eeprom + // regresa 1 si se selecciona exit + + int cancel = 0; // regresa 1 si se selecciona salir + int bank; // regresa 1 si se selecciona salir + int EEPROM_Add = 0; // seleccion de universo + bank = GUI_Memory_Bank(2); // seleccinar banco + + if (bank == 1) + { + cancel = 1; + goto salida; + } + + lcd.clear (); + + for (int Canal = 1; Canal <= 512; Canal ++) + { + // Escritura de universo EEPROM + switch (Universo_Actual) + { + case 1: + EEPROM_Add = 0 + Canal - 1; + break; + + case 2: + EEPROM_Add = 512 + Canal - 1; + break; + + case 3: + EEPROM_Add = 1024 + Canal - 1; + break; + + case 4: + EEPROM_Add = 1536 + Canal - 1; + break; + + case 5: + EEPROM_Add = 2048 + Canal - 1; + break; + + case 6: + EEPROM_Add = 2560 + Canal - 1; + break; + + case 7: + EEPROM_Add = 3072 + Canal - 1; + break; + + case 8: + EEPROM_Add = 3584 + Canal - 1; + if (EEPROM_Add > EEPROM_Limit) + { + EEPROM_Add = EEPROM_Limit; + } + break; + } + + DMX_Values[Canal] = EEPROM.read(EEPROM_Add); // lectura desde EEPROM + ArduinoDmx0.TxBuffer[Canal - 1] = DMX_Values[Canal]; // salida a DMX + } - // banco 9 - if (LCD_Col_Pos == 12 && LCD_Row_Pos == 2) - { - Numerico_Write (banco + 8, 1, 0); - goto salida; - } + lcd.clear (); + lcd.setCursor (3, 1); + lcd.print ("Memory Loaded!"); + lcd.setCursor (3, 2); + lcd.print ("Bank: "); + lcd.print (Universo_Actual); + lcd.setCursor (19, 3); + lcd.blink(); + delay (1000); + lcd.noBlink(); + + salida: + + return cancel; +} - // banco 10 - if (LCD_Col_Pos == 16 && LCD_Row_Pos == 2) - { - Numerico_Write (banco + 9, 1, 0); - goto salida; - } +void EEPROM_Load_Init() +{ + // carga los valores de los canales DMX de la eeprom al inicio e inicia el streaming de dmx + + int EEPROM_Add = 0; + Universo_Actual = EEPROM.read(Bank_Init_Add); + + if (Universo_Actual == 0) + { + goto salir; + } + + for (int Canal = 1; Canal <= 512; Canal ++) + { + // Escritura de universo EEPROM + switch (Universo_Actual) + { + case 1: + EEPROM_Add = 0 + Canal - 1; + break; + + case 2: + EEPROM_Add = 512 + Canal - 1; + break; + + case 3: + EEPROM_Add = 1024 + Canal - 1; + break; + + case 4: + EEPROM_Add = 1536 + Canal - 1; + break; + + case 5: + EEPROM_Add = 2048 + Canal - 1; + break; + + case 6: + EEPROM_Add = 2560 + Canal - 1; + break; + + case 7: + EEPROM_Add = 3072 + Canal - 1; + break; + + case 8: + EEPROM_Add = 3584 + Canal - 1; + if (EEPROM_Add > EEPROM_Limit) + { + EEPROM_Add = EEPROM_Limit; + } + break; + } + DMX_Values[Canal] = EEPROM.read(EEPROM_Add); // lectura desde EEPROM + ArduinoDmx0.TxBuffer[Canal - 1] = DMX_Values[Canal]; // salida a DMX + } + + lcd.clear (); + lcd.setCursor (3, 1); + lcd.print ("Memory Loaded!"); + lcd.setCursor (3, 2); + lcd.print ("Bank: "); + lcd.print (Universo_Actual); + lcd.setCursor (10, 2); + lcd.blink(); + delay (2000); + lcd.noBlink(); + + salir: {} - // banco 11 - if (LCD_Col_Pos == 0 && LCD_Row_Pos == 3) - { - Numerico_Write (banco + 10, 1, 0); - goto salida; - } +} - // banco 12 - if (LCD_Col_Pos == 4 && LCD_Row_Pos == 3) - { - Numerico_Write (banco + 11, 1, 0); - goto salida; - } +void EEPROM_Empty() +{ + // solo borra la ram + // no hay retorno al menu anterior + + lcd.clear (); + + for (int Canal = 1; Canal <= 512; Canal ++) + { + DMX_Values[Canal] = 0; // lectura desde EEPROM + ArduinoDmx0.TxBuffer[Canal - 1] = 0; // salida a DMX + } + + lcd.clear (); + lcd.setCursor (3, 1); + lcd.print ("Memory Emptied!"); + lcd.setCursor (3, 2); + lcd.print ("Bank: RAM"); + lcd.setCursor (19, 3); + lcd.blink(); + delay (1000); + lcd.noBlink(); +} - // banco 13 - if (LCD_Col_Pos == 8 && LCD_Row_Pos == 3) - { - Numerico_Write (banco + 12, 1, 0); - goto salida; - } +int EEPROM_Clear() +{ + // Pone en ceros la memoria EEPROM + // regresa 1 si se selecciona exit + + int cancel = 0; // regresa 1 si se selecciona salir + int bank; // regresa 1 si se selecciona salir + int EEPROM_Add = 0; // direccion de eeprom para universos + bank = GUI_Memory_Bank(3); // seleccinar banco + + if (bank == 1) // si se selecciono salir + { + cancel = 1; + goto salida; + } + + lcd.clear (); + lcd.setCursor (1, 1); + lcd.print ("Memory Cleaning..."); + lcd.setCursor (1, 2); + lcd.print ("Bank: "); + lcd.setCursor (7, 2); + lcd.print (Universo_Actual); + lcd.setCursor (19, 3); + lcd.blink(); + + for (int Canal = 0; Canal <= 511; Canal ++) + { + DMX_Values[Canal] = 0; // lectura desde EEPROM + ArduinoDmx0.TxBuffer[Canal] = 0; // salida a DMX + // Escritura de universo EEPROM + switch (Universo_Actual) + { + case 1: + EEPROM_Add = 0 + Canal; + break; + + case 2: + EEPROM_Add = 512 + Canal; + break; + + case 3: + EEPROM_Add = 1024 + Canal; + break; + + case 4: + EEPROM_Add = 1536 + Canal; + break; + + case 5: + EEPROM_Add = 2048 + Canal; + break; + + case 6: + EEPROM_Add = 2560 + Canal; + break; + + case 7: + EEPROM_Add = 3072 + Canal; + break; + + case 8: + EEPROM_Add = 3584 + Canal; + if (EEPROM_Add > EEPROM_Limit) + { + EEPROM_Add = EEPROM_Limit; + } + break; + } + + EEPROM.write (EEPROM_Add, 0); // escritura EEPROM + } + lcd.clear (); + lcd.setCursor (2, 1); + lcd.print ("Memory Cleaned!"); + lcd.setCursor (2, 2); + lcd.print ("Bank: "); + lcd.print (Universo_Actual); + lcd.setCursor (19, 3); + delay (1000); + lcd.noBlink(); + + salida: + + return cancel; +} - // banco 14 - if (LCD_Col_Pos == 12 && LCD_Row_Pos == 3) - { - Numerico_Write (banco + 13, 1, 0); - goto salida; - } +void EEPROM_Clear_All() +{ + // Pone en ceros la memoria EEPROM toda + lcd.clear (); + lcd.setCursor (1, 1); + lcd.print ("All"); + lcd.setCursor (1, 2); + lcd.print ("Memory Cleaning..."); + lcd.setCursor (19, 2); + lcd.blink(); + + for (int Canal = 0; Canal <= EEPROM_Limit; Canal ++) + { + EEPROM.write (Canal, 0); // escritura EEPROM + if (Canal <= 511) + { + DMX_Values[Canal + 1] = 0; + ArduinoDmx0.TxBuffer[Canal] = 0; // salida a DMX + } + } + + lcd.clear (); + lcd.noBlink(); + lcd.setCursor (2, 2); + lcd.print ("Memory Cleaned!"); + lcd.setCursor (2, 1); + lcd.print ("All"); + Universo_Actual = 0; + delay (1000); +} - // banco 15 - if (LCD_Col_Pos == 16 && LCD_Row_Pos == 3) - { - Numerico_Write (banco + 14, 1, 0); - goto salida; - } - -salida: - // escribir guion de bancos - lcd.setCursor(16, 0); - lcd.print("-"); -salir: - } - } - else - { - // escribir + - lcd.setCursor (LCD_Col_Pos, LCD_Row_Pos); - lcd.print("+"); - } +void GUI_Control_Options() +{ - //salida - LCD_Col_Pos_Ant = LCD_Col_Pos; - LCD_Row_Pos_Ant = LCD_Row_Pos; + inicio: + + // LCD + lcd.clear (); + lcd.setCursor (18, 0); + lcd.print ("b"); + + if (Universo_Actual == 0) + { + lcd.print ("-"); + } + else + { + lcd.print (Universo_Actual); + } + + lcd.setCursor (2, 0); + lcd.print ("Convert"); + lcd.setCursor (2, 1); + lcd.print ("Unitary"); + lcd.setCursor (2, 2); + lcd.print ("Matrix"); + lcd.setCursor (2, 3); + lcd.print ("Chaser"); + lcd.setCursor (11, 3); + lcd.print ("Multiply"); + lcd.setCursor (11, 0); + lcd.print ("Config"); + lcd.setCursor (11, 2); + lcd.print ("Secuencer"); + lcd.setCursor (11, 1); + lcd.print ("Memory"); + + // Cursor + LCD_Col_Pos = 1; // posicion de cursor + LCD_Row_Pos = 2; + + // configuracion de cursor + Cursor_Conf_Clear(); // limpiar array + + // Acciones + Cursor_Conf[1][1] = 1; // Unitary + Cursor_Conf[2][1] = 1; // Matrix + Cursor_Conf[3][1] = 1; // Chaser + Cursor_Conf[3][10] = 1; // Multiply + Cursor_Conf[0][10] = 1; // Config + Cursor_Conf[2][10] = 1; // Secuencer + Cursor_Conf[1][10] = 1; // Memory + Cursor_Conf[0][1] = 1; // Convert + + // navegar + GUI_Navegar(0, 0); - if (Dibujar_Cursor == 2) - { - goto Salir; - } - else - { - Dibujar_Cursor = 0; - } - } - goto Dibujar; -Salir: {} + // Acciones + // Unitary + if (LCD_Col_Pos == 1 && LCD_Row_Pos == 1) + { + GUI_Control_Unit(); + } + + // Matrix + if (LCD_Col_Pos == 1 && LCD_Row_Pos == 2) + { + GUI_Control_Matrix(); + } + + // Chaser + if (LCD_Col_Pos == 1 && LCD_Row_Pos == 3) + { + GUI_Control_Chaser(); + } + + // Multiply + if (LCD_Col_Pos == 10 && LCD_Row_Pos == 3) + { + GUI_Control_Multiply(); + } + + // Config + if (LCD_Col_Pos == 10 && LCD_Row_Pos == 0) + { + GUI_Config(); + } + + // Secuencer + if (LCD_Col_Pos == 10 && LCD_Row_Pos == 2) + { + GUI_Control_Secuencer(); + } + + // Converter + if (LCD_Col_Pos == 1 && LCD_Row_Pos == 0) + { + //GUI_Convert(); + } + + // Memory + if (LCD_Col_Pos == 10 && LCD_Row_Pos == 1) + { + GUI_Memory(); + goto inicio; + } } -void GUI_Memory_Init() +/*void GUI_Convert() { + int valor = 0; // aqui el valor a calcular + int valor_temp = 0; // aqui el valor temporal para las cuentas + int valor_resto = 0; // aqui el valor del resto de la divicion + int valor_Bin [10] = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0}; // aqui el valor descompuesto en binario + lcd.clear (); + lcd.setCursor (0, 0); + lcd.print ("Bin: OOOOOOOOO I=On"); + lcd.setCursor (5, 1); + lcd.print ("124813612 O=Off"); + lcd.setCursor (9, 2); + lcd.print ("62425"); + lcd.setCursor (0, 3); + lcd.print ("Dec: 000 86 Exit"); -inicio: - - int salir = 0; - lcd.clear (); - - // Texto - lcd.setCursor (0, 0); - lcd.print("Initial Memory:"); - lcd.setCursor (2, 2); - lcd.print("Empty"); - lcd.setCursor (9, 2); - lcd.print("Load"); - lcd.setCursor (15, 2); - lcd.print("Clear"); + // Cursor + LCD_Col_Pos = 4; // posicion de cursor + LCD_Row_Pos = 3; // posicion e cursor - // bank - lcd.setCursor(18, 0); - lcd.print("b"); + // configuracion de cursor + Cursor_Conf_Clear(); // limpiar array - if (Universo_Actual == 0) - { - lcd.print("-"); - } - else - { - lcd.print(Universo_Actual); - } + // Cursores + Cursor_Conf[0][4] = 1; // Bin + Cursor_Conf[3][4] = 1; // Dec + Cursor_Conf[3][15] = 1; // Exit - // Cursor - LCD_Col_Pos = 1; // posicion de cursor - LCD_Row_Pos = 2; + //Navegacion: + calc: + GUI_Navegar(0, 0); - // configuracion de cursor - Cursor_Conf_Clear(); // limpiar array + // Acciones + // Exit + if (LCD_Col_Pos == 15 && LCD_Row_Pos == 3) + { + GUI_Control_Options(); + } - // Acciones - Cursor_Conf[2][1] = 1; // Empty - Cursor_Conf[2][8] = 1; // Load - Cursor_Conf[2][14] = 1; // Clear + // Binario a decimal + if (LCD_Col_Pos == 4 && LCD_Row_Pos == 0) + { + // boton de centro para salir + // boton de lados para navegar + // boton arriba abajo para cambiar valor + byte cursor = 5; // posicion de cursor + int boton_retardo = 250; // retardo de boton para estabilidad + byte calcular = 0; // calcular binario a decimal + byte calcular_val = 0; // valor a meter a la matriz para calcular + lcd.blink(); + lcd.setCursor (5, 0); - // navegar - GUI_Navegar(0, 0); - - // Acciones - // Load - if (LCD_Col_Pos == 8 && LCD_Row_Pos == 2) - { - salir = EEPROM_Load(); - if (salir == 1) - { - goto inicio; + while (digitalRead(Enc_Center) == HIGH) // salida + { + if (digitalRead(Boton_Right) == LOW) + { + delay(boton_retardo); // esperar a estabilidad + cursor = cursor + 1; + if (cursor > 13) + { + cursor = 5; // regresar al principio + } + lcd.setCursor (cursor, 0); } - GUI_Control_Options(); - } - // Clear - if (LCD_Col_Pos == 14 && LCD_Row_Pos == 2) - { - salir = EEPROM_Clear(); - if (salir == 1) + if (digitalRead(Boton_Left) == LOW) { - goto inicio; - } - GUI_Control_Options(); - } - - // Empty - if (LCD_Col_Pos == 1 && LCD_Row_Pos == 2) - { - GUI_Control_Options(); - } -} - -int GUI_Memory_Bank(byte Opcion) -{ - // regresa 1 si se selecciona salir, de lo contrario 0 - // recibe opcion para pintar en la pantalla lo que se selecciono - - int salir = 0; - lcd.clear (); - delay (200); // retardo para no seleccionar inmediatamente la opcion del banco - - // Texto - lcd.setCursor (6, 0); - lcd.print("Memory Bank:"); - lcd.setCursor (1, 1); - lcd.print("Bank1 Bank4 Bank7"); - lcd.setCursor (1, 2); - lcd.print("Bank2 Bank5 Bank8"); - lcd.setCursor (1, 3); - lcd.print("Bank3 Bank6 Exit"); - - switch (Opcion) - { - case 1: - lcd.setCursor (1, 0); - lcd.print("Save"); - break; - - case 2: - lcd.setCursor (1, 0); - lcd.print("Load"); - break; - - case 3: - lcd.setCursor (0, 0); - lcd.print("Clear"); - break; - } - - // Universo Actual - lcd.setCursor (19, 0); - - if (Universo_Actual == 0) - { - lcd.print("-"); - } - else - { - lcd.print(Universo_Actual); - } - - // Cursor inicial - LCD_Col_Pos = 0; // posicion de cursor - LCD_Row_Pos = 1; - - // configuracion de cursor - Cursor_Conf_Clear(); // limpiar array - - // Acciones - Cursor_Conf[1][0] = 1; // Bank 1 - Cursor_Conf[2][0] = 1; // Bank 2 - Cursor_Conf[3][0] = 1; // Bank 3 - Cursor_Conf[1][7] = 1; // Bank 4 - Cursor_Conf[2][7] = 1; // Bank 5 - Cursor_Conf[3][7] = 1; // Bank 6 - Cursor_Conf[1][14] = 1; // Bank 7 - Cursor_Conf[2][14] = 1; // Bank 8 - Cursor_Conf[3][14] = 1; // Exit - - // navegar - GUI_Navegar(0, 0); - - // Acciones - // Bank 1 - if (LCD_Col_Pos == 0 && LCD_Row_Pos == 1) - { - Universo_Actual = 1; - goto Salida; - } - - // Bank 2 - if (LCD_Col_Pos == 0 && LCD_Row_Pos == 2) - { - Universo_Actual = 2; - goto Salida; - } - - // Bank 3 - if (LCD_Col_Pos == 0 && LCD_Row_Pos == 3) - { - Universo_Actual = 3; - goto Salida; - } - - // Bank 4 - if (LCD_Col_Pos == 7 && LCD_Row_Pos == 1) - { - Universo_Actual = 4; - goto Salida; - } - - // Bank 5 - if (LCD_Col_Pos == 7 && LCD_Row_Pos == 2) - { - Universo_Actual = 5; - goto Salida; - } - - // Bank 6 - if (LCD_Col_Pos == 7 && LCD_Row_Pos == 3) - { - Universo_Actual = 6; - goto Salida; - } - - // Bank 7 - if (LCD_Col_Pos == 14 && LCD_Row_Pos == 1) - { - Universo_Actual = 7; - goto Salida; - } - - // Bank 8 - if (LCD_Col_Pos == 14 && LCD_Row_Pos == 2) - { - Universo_Actual = 8; - goto Salida; - } - - // Exit - if (LCD_Col_Pos == 14 && LCD_Row_Pos == 3) - { - salir = 1; - } - -Salida: - - return salir; -} - -void GUI_Memory() -{ - -iniciar: - - // Texto - lcd.clear (); - lcd.setCursor (0, 0); - lcd.print("Memory: b"); - - if (Universo_Actual == 0) - { - lcd.print("-"); - } - else - { - lcd.print(Universo_Actual); - } - - lcd.setCursor (1, 1); - lcd.print("Save"); - lcd.setCursor (1, 2); - lcd.print("Load"); - lcd.setCursor (1, 3); - lcd.print("Clear"); - lcd.setCursor (7, 2); - lcd.print("ClearAll"); - lcd.setCursor (7, 1); - lcd.print("BlackOut"); - lcd.setCursor (16, 3); - lcd.print("Exit"); - lcd.setCursor (7, 3); - lcd.print("EmptyRAM"); - - // Cursor - LCD_Col_Pos = 0; // posicion de cursor - LCD_Row_Pos = 1; - - // configuracion de cursor - Cursor_Conf_Clear(); // limpiar array - - // Acciones - Cursor_Conf[1][0] = 1; // Save - Cursor_Conf[2][0] = 1; // Load - Cursor_Conf[3][0] = 1; // Clear - Cursor_Conf[2][6] = 1; // Clear All - Cursor_Conf[3][6] = 1; // Empty RAM - Cursor_Conf[1][6] = 1; // Black Out - Cursor_Conf[3][15] = 1; // Exit - - // navegar -regresa: - - GUI_Navegar(0, 0); - - // Acciones - // Load - if (LCD_Col_Pos == 0 && LCD_Row_Pos == 2) - { - if (EEPROM_Load() == 1) - { - goto iniciar; - } - goto salida; - } - - // Clear - if (LCD_Col_Pos == 0 && LCD_Row_Pos == 3) - { - if (EEPROM_Clear() == 1) - { - goto iniciar; - } - goto salida; - } - - // Clear All - if (LCD_Col_Pos == 6 && LCD_Row_Pos == 2) - { - EEPROM_Clear_All(); - goto salida; - } - - // Save - if (LCD_Col_Pos == 0 && LCD_Row_Pos == 1) - { - if (EEPROM_Save() == 1) - { - goto iniciar; - } - goto salida; - } - - // Empty RAM - if (LCD_Col_Pos == 6 && LCD_Row_Pos == 3) - { - EEPROM_Empty(); - goto salida; - } - - // Black Out - if (LCD_Col_Pos == 6 && LCD_Row_Pos == 1) - { - Black_Out(); - goto regresa; - } - - // Exit - if (LCD_Col_Pos == 15 && LCD_Row_Pos == 3) - { - - } - -salida: {} -} - -void GUI_Control_Secuencer() -{ - // secuenciador de bancos guardados en eeprom - - int Delay_Secuencia = 1; - int First_Bank = 1; - int Final_Bank = 8; - lcd.clear (); - - // Texto - lcd.setCursor (0, 0); - lcd.print("Secuencer Banks: b"); - - if (Universo_Actual == 0) - { - lcd.print("-"); - } - else - { - lcd.print(Universo_Actual); - } - - lcd.setCursor (4, 1); - lcd.print("Delay 001x100=mS"); - lcd.setCursor (0, 2); - lcd.print("FirstBank 001 Exit"); - lcd.setCursor (0, 3); - lcd.print("FinalBank 008 Start"); - - // Cursor - LCD_Col_Pos = 9; // posicion de cursor - LCD_Row_Pos = 1; - - // configuracion de cursor - Cursor_Conf_Clear(); // limpiar array - - // Acciones - Cursor_Conf[1][9] = 1; // Delay - Cursor_Conf[2][9] = 1; // First Bank - Cursor_Conf[3][9] = 1; // Final Bank - Cursor_Conf[2][14] = 1; // Control - Cursor_Conf[3][14] = 1; // start -inicio: - lcd.setCursor (15, 3); - lcd.print("Start"); - lcd.noBlink(); - - // navegar - GUI_Navegar(0, 0); - - // Acciones - // Delay - if (LCD_Col_Pos == 9 && LCD_Row_Pos == 1) - { - Num_Row_Pos = 1; - Num_Col_Pos = 10; - Num_Val = Delay_Secuencia; // para dejar el numero que estaba si no se cambia - Numerico_Calc(0); - - if (Num_Val == 0) - { - Numerico_Write (1, 10, 1); - Delay_Secuencia = 1; - Numerico_Write (Delay_Secuencia, 10, 1); - } - else - { - Delay_Secuencia = Num_Val; // por el multiplicador - } - - if (Num_Val > 100) - { - Delay_Secuencia = 100; - Numerico_Write (Delay_Secuencia, 10, 1); - } - - goto inicio; - } - // First Bank - if (LCD_Col_Pos == 9 && LCD_Row_Pos == 2) - { - Num_Row_Pos = 2; - Num_Col_Pos = 10; - Num_Val = First_Bank; // para dejar el numero que estaba si no se cambia - Numerico_Calc(0); - First_Bank = Num_Val; - - if (Num_Val == 0) - { - First_Bank = 1; - Numerico_Write (First_Bank, 10, 2); - } - - if (Num_Val > 8) - { - Numerico_Write (8, 10, 2); - First_Bank = 8; - } - - goto inicio; - } - // Final Bank - if (LCD_Col_Pos == 9 && LCD_Row_Pos == 3) - { - Num_Row_Pos = 3; - Num_Col_Pos = 10; - Num_Val = Final_Bank; // para dejar el numero que estaba si no se cambia - Numerico_Calc(0); - Final_Bank = Num_Val; - - if (Num_Val == 0) - { - Final_Bank = 1; - Numerico_Write (Final_Bank, 10, 3); - } - - if (Num_Val > 8) - { - Numerico_Write (8, 10, 2); - Final_Bank = 8; - } - - goto inicio; - } - // Control - if (LCD_Col_Pos == 14 && LCD_Row_Pos == 2) - { - // restablecer salida dmx como estaba antes de entrar - for (int Canal = 0; Canal <= 512; Canal ++) - { - ArduinoDmx0.TxBuffer[Canal] = DMX_Values[Canal]; // salida a DMX - } - GUI_Control_Options (); - } - // start - if (LCD_Col_Pos == 14 && LCD_Row_Pos == 3) - { - // validar - if (First_Bank == Final_Bank) - { - First_Bank = 1; - Numerico_Write (First_Bank, 10, 2); - Final_Bank = 8; - Numerico_Write (Final_Bank, 10, 2); - goto inicio; - } - // LCD - lcd.setCursor (14, 3); - lcd.print("+"); - lcd.setCursor (15, 3); - lcd.print("Stop "); - - // establecer reversa o adelante - byte Adelante_Reversa = 0; // 0 Adelante, 1 Reversa - - // adelante - if (First_Bank < Final_Bank) - { - Adelante_Reversa = 0; - } - - // reversa - if (First_Bank > Final_Bank) - { - Adelante_Reversa = 1; - } - - // establecer bancos a secuenciar - byte Bancos [9] = {0, 0, 0, 0, 0, 0, 0, 0}; - if (Adelante_Reversa == 0) - { - for (byte Bank = 1; Bank <= 8; Bank ++) - { - if (Bank >= First_Bank && Bank <= Final_Bank) - { - Bancos[Bank] = 1; - } - } - } - - if (Adelante_Reversa == 1) - { - for (byte Bank = 8; Bank >= 1; Bank --) - { - if (Bank <= First_Bank && Bank >= Final_Bank) - { - Bancos[Bank] = 1; - } - } - } - - //Secuenciar - byte value = 0; - lcd.blink(); - - // adelante - if (Adelante_Reversa == 0) - { -contar: - for (byte conteo = 1; conteo <= 8; conteo ++) - { - if (Bancos [conteo] == 1) - { - lcd.setCursor (19, 0); - lcd.print(conteo); - lcd.setCursor (19, 3); - for (int canal = 0; canal <= 511; canal ++) - { - switch (conteo) - { - case 1: - value = EEPROM.read(canal); - ArduinoDmx0.TxBuffer[canal] = value; // salida a DMX - break; - - case 2: - value = EEPROM.read(canal + 512); - ArduinoDmx0.TxBuffer[canal] = value; // salida a DMX - break; - - case 3: - value = EEPROM.read(canal + 1024); - ArduinoDmx0.TxBuffer[canal] = value; // salida a DMX - break; - - case 4: - value = EEPROM.read(canal + 1536); - ArduinoDmx0.TxBuffer[canal] = value; // salida a DMX - break; - - case 5: - value = EEPROM.read(canal + 2048); - ArduinoDmx0.TxBuffer[canal] = value; // salida a DMX - break; - - case 6: - value = EEPROM.read(canal + 2560); - ArduinoDmx0.TxBuffer[canal] = value; // salida a DMX - break; - - case 7: - value = EEPROM.read(canal + 3072); - ArduinoDmx0.TxBuffer[canal] = value; // salida a DMX - break; - - case 8: - value = EEPROM.read(canal + 3584); - ArduinoDmx0.TxBuffer[canal] = value; // salida a DMX - break; - } - } - //delay - long delay_contar = Delay_Secuencia * 100; - - while (digitalRead(Boton_Center) == HIGH) // lectura del boton centro - { - for (long contar = 0; contar <= delay_contar; contar ++) - { - delay(1); - if (digitalRead(Boton_Center) == LOW) - { - goto salida; - } - } - goto Delay_Salir; - } - -salida: - - delay(500); // rebote de boton - goto inicio; - -Delay_Salir: {} - - } - } - goto contar; - } - - // reversa - if (Adelante_Reversa == 1) - { - -contar_rev: - - for (byte conteo = 8; conteo >= 1; conteo --) - { - if (Bancos [conteo] == 1) - { - lcd.setCursor (19, 0); - lcd.print(conteo); - lcd.setCursor (19, 3); - for (int canal = 0; canal <= 511; canal ++) - { - switch (conteo) - { - case 1: - value = EEPROM.read(canal); - ArduinoDmx0.TxBuffer[canal] = value; // salida a DMX - break; - - case 2: - value = EEPROM.read(canal + 512); - ArduinoDmx0.TxBuffer[canal] = value; // salida a DMX - break; - - case 3: - value = EEPROM.read(canal + 1024); - ArduinoDmx0.TxBuffer[canal] = value; // salida a DMX - break; - - case 4: - value = EEPROM.read(canal + 1536); - ArduinoDmx0.TxBuffer[canal] = value; // salida a DMX - break; - - case 5: - value = EEPROM.read(canal + 2048); - ArduinoDmx0.TxBuffer[canal] = value; // salida a DMX - break; - - case 6: - value = EEPROM.read(canal + 2560); - ArduinoDmx0.TxBuffer[canal] = value; // salida a DMX - break; - - case 7: - value = EEPROM.read(canal + 3072); - ArduinoDmx0.TxBuffer[canal] = value; // salida a DMX - break; - - case 8: - value = EEPROM.read(canal + 3584); - ArduinoDmx0.TxBuffer[canal] = value; // salida a DMX - break; - } - } - - //delay - long delay_contar = Delay_Secuencia * 100; - - while (digitalRead(Boton_Center) == HIGH) // lectura del boton centro - { - for (long contar = 0; contar <= delay_contar; contar ++) - { - delay(1); - if (digitalRead(Boton_Center) == LOW) - { - goto salida_rev; - } - } - goto Delay_Salir_Rev; - } - -salida_rev: - - delay(500); // rebote de boton - goto inicio; - -Delay_Salir_Rev: {} - - } - } - goto contar_rev; - } - } - goto inicio; -} - -void Black_Out() -{ - lcd.setCursor (15, 1); - lcd.blink(); - - // limpiar universo - for (int Canal = 1; Canal <= 512; Canal ++) - { - ArduinoDmx0.TxBuffer[Canal - 1] = 0; - } - - // esperar al boton centro para cancelar - while (digitalRead(Boton_Center) == HIGH) {} - - delay(300); // retardo de rebote de boton - - // regresar el universo a su lugar - for (int Canal = 1; Canal <= 512; Canal ++) - { - ArduinoDmx0.TxBuffer[Canal - 1] = DMX_Values[Canal]; - } - - lcd.setCursor (6, 2); - lcd.noBlink(); -} - -int EEPROM_Save() -{ - // guarda el universo en la eeprom - // regresa 1 si se selecciona exit - - int cancel = 0; // regresa 1 si se selecciona salir - int bank; // regresa 1 si se selecciona salir - int EEPROM_Add = 0; // direccion de eeprom para universos - bank = GUI_Memory_Bank(1); // seleccinar banco - - if (bank == 1) - { - cancel = 1; - goto salida; - } - - lcd.clear (); - lcd.setCursor (1, 1); - lcd.print ("Memory Saving..."); - lcd.setCursor (1, 2); - lcd.print ("Bank: "); - lcd.setCursor (7, 2); - lcd.print (Universo_Actual); - lcd.setCursor (19, 3); - lcd.blink(); - - for (int Canal = 0; Canal <= 511; Canal ++) - { - // Escritura de universo EEPROM - switch (Universo_Actual) - { - case 1: - EEPROM_Add = 0 + Canal; - break; - - case 2: - EEPROM_Add = 512 + Canal; - break; - - case 3: - EEPROM_Add = 1024 + Canal; - break; - - case 4: - EEPROM_Add = 1536 + Canal; - break; - - case 5: - EEPROM_Add = 2048 + Canal; - break; - - case 6: - EEPROM_Add = 2560 + Canal; - break; - - case 7: - EEPROM_Add = 3072 + Canal; - break; - - case 8: - EEPROM_Add = 3584 + Canal; - if (EEPROM_Add > EEPROM_Limit) - { - EEPROM_Add = EEPROM_Limit; - } - break; - } - EEPROM.write(EEPROM_Add, DMX_Values[Canal + 1]); // lectura desde EEPROM - } - - lcd.clear (); - lcd.setCursor (3, 1); - lcd.print ("Memory Saved!"); - lcd.setCursor (3, 2); - lcd.print ("Bank: "); - lcd.print (Universo_Actual); - lcd.setCursor (19, 3); - delay (1000); - lcd.noBlink(); - -salida: - - return cancel; -} - -int EEPROM_Load() -{ - // guarda los valores en la eeprom - // regresa 1 si se selecciona exit - - int cancel = 0; // regresa 1 si se selecciona salir - int bank; // regresa 1 si se selecciona salir - int EEPROM_Add = 0; // seleccion de universo - bank = GUI_Memory_Bank(2); // seleccinar banco - - if (bank == 1) - { - cancel = 1; - goto salida; - } - - lcd.clear (); - - for (int Canal = 1; Canal <= 512; Canal ++) - { - // Escritura de universo EEPROM - switch (Universo_Actual) - { - case 1: - EEPROM_Add = 0 + Canal - 1; - break; - - case 2: - EEPROM_Add = 512 + Canal - 1; - break; - - case 3: - EEPROM_Add = 1024 + Canal - 1; - break; - - case 4: - EEPROM_Add = 1536 + Canal - 1; - break; - - case 5: - EEPROM_Add = 2048 + Canal - 1; - break; - - case 6: - EEPROM_Add = 2560 + Canal - 1; - break; - - case 7: - EEPROM_Add = 3072 + Canal - 1; - break; - - case 8: - EEPROM_Add = 3584 + Canal - 1; - if (EEPROM_Add > EEPROM_Limit) - { - EEPROM_Add = EEPROM_Limit; - } - break; - } - - DMX_Values[Canal] = EEPROM.read(EEPROM_Add); // lectura desde EEPROM - ArduinoDmx0.TxBuffer[Canal - 1] = DMX_Values[Canal]; // salida a DMX - } - - lcd.clear (); - lcd.setCursor (3, 1); - lcd.print ("Memory Loaded!"); - lcd.setCursor (3, 2); - lcd.print ("Bank: "); - lcd.print (Universo_Actual); - lcd.setCursor (19, 3); - lcd.blink(); - delay (1000); - lcd.noBlink(); - -salida: - - return cancel; -} - -void EEPROM_Load_Init() -{ - // carga los valores en la eeprom al inicio - - int EEPROM_Add = 0; - Universo_Actual = EEPROM.read(Bank_Init_Add); - - if (Universo_Actual == 0) - { - goto salir; - } - - for (int Canal = 1; Canal <= 512; Canal ++) - { - // Escritura de universo EEPROM - switch (Universo_Actual) - { - case 1: - EEPROM_Add = 0 + Canal - 1; - break; - - case 2: - EEPROM_Add = 512 + Canal - 1; - break; - - case 3: - EEPROM_Add = 1024 + Canal - 1; - break; - - case 4: - EEPROM_Add = 1536 + Canal - 1; - break; - - case 5: - EEPROM_Add = 2048 + Canal - 1; - break; - - case 6: - EEPROM_Add = 2560 + Canal - 1; - break; - - case 7: - EEPROM_Add = 3072 + Canal - 1; - break; - - case 8: - EEPROM_Add = 3584 + Canal - 1; - if (EEPROM_Add > EEPROM_Limit) - { - EEPROM_Add = EEPROM_Limit; - } - break; - } - DMX_Values[Canal] = EEPROM.read(EEPROM_Add); // lectura desde EEPROM - ArduinoDmx0.TxBuffer[Canal - 1] = DMX_Values[Canal]; // salida a DMX - } - - lcd.clear (); - lcd.setCursor (3, 1); - lcd.print ("Memory Loaded!"); - lcd.setCursor (3, 2); - lcd.print ("Bank: "); - lcd.print (Universo_Actual); - lcd.setCursor (10, 2); - lcd.blink(); - delay (2000); - lcd.noBlink(); - -salir: {} - -} - -void EEPROM_Empty() -{ - // solo borra la ram - // no hay retorno al menu anterior - - lcd.clear (); - - for (int Canal = 1; Canal <= 512; Canal ++) - { - DMX_Values[Canal] = 0; // lectura desde EEPROM - ArduinoDmx0.TxBuffer[Canal - 1] = 0; // salida a DMX - } - - lcd.clear (); - lcd.setCursor (3, 1); - lcd.print ("Memory Emptied!"); - lcd.setCursor (3, 2); - lcd.print ("Bank: RAM"); - lcd.setCursor (19, 3); - lcd.blink(); - delay (1000); - lcd.noBlink(); -} - -int EEPROM_Clear() -{ - // Pone en ceros la memoria EEPROM - // regresa 1 si se selecciona exit - - int cancel = 0; // regresa 1 si se selecciona salir - int bank; // regresa 1 si se selecciona salir - int EEPROM_Add = 0; // direccion de eeprom para universos - bank = GUI_Memory_Bank(3); // seleccinar banco - - if (bank == 1) // si se selecciono salir - { - cancel = 1; - goto salida; - } - - lcd.clear (); - lcd.setCursor (1, 1); - lcd.print ("Memory Cleaning..."); - lcd.setCursor (1, 2); - lcd.print ("Bank: "); - lcd.setCursor (7, 2); - lcd.print (Universo_Actual); - lcd.setCursor (19, 3); - lcd.blink(); - - for (int Canal = 0; Canal <= 511; Canal ++) - { - DMX_Values[Canal] = 0; // lectura desde EEPROM - ArduinoDmx0.TxBuffer[Canal] = 0; // salida a DMX - // Escritura de universo EEPROM - switch (Universo_Actual) - { - case 1: - EEPROM_Add = 0 + Canal; - break; - - case 2: - EEPROM_Add = 512 + Canal; - break; - - case 3: - EEPROM_Add = 1024 + Canal; - break; - - case 4: - EEPROM_Add = 1536 + Canal; - break; - - case 5: - EEPROM_Add = 2048 + Canal; - break; - - case 6: - EEPROM_Add = 2560 + Canal; - break; - - case 7: - EEPROM_Add = 3072 + Canal; - break; - - case 8: - EEPROM_Add = 3584 + Canal; - if (EEPROM_Add > EEPROM_Limit) - { - EEPROM_Add = EEPROM_Limit; - } - break; - } - - EEPROM.write (EEPROM_Add, 0); // escritura EEPROM - } - lcd.clear (); - lcd.setCursor (2, 1); - lcd.print ("Memory Cleaned!"); - lcd.setCursor (2, 2); - lcd.print ("Bank: "); - lcd.print (Universo_Actual); - lcd.setCursor (19, 3); - delay (1000); - lcd.noBlink(); - -salida: - - return cancel; -} - -void EEPROM_Clear_All() -{ - // Pone en ceros la memoria EEPROM toda - lcd.clear (); - lcd.setCursor (1, 1); - lcd.print ("All"); - lcd.setCursor (1, 2); - lcd.print ("Memory Cleaning..."); - lcd.setCursor (19, 2); - lcd.blink(); - - for (int Canal = 0; Canal <= EEPROM_Limit; Canal ++) - { - EEPROM.write (Canal, 0); // escritura EEPROM - if (Canal <= 511) - { - DMX_Values[Canal + 1] = 0; - ArduinoDmx0.TxBuffer[Canal] = 0; // salida a DMX - } - } - - lcd.clear (); - lcd.noBlink(); - lcd.setCursor (2, 2); - lcd.print ("Memory Cleaned!"); - lcd.setCursor (2, 1); - lcd.print ("All"); - Universo_Actual = 0; - delay (1000); -} - -void GUI_Control_Options() -{ - -inicio: - - // LCD - lcd.clear (); - lcd.setCursor (18, 0); - lcd.print ("b"); - - if (Universo_Actual == 0) - { - lcd.print ("-"); - } - else - { - lcd.print (Universo_Actual); - } - - lcd.setCursor (2, 0); - lcd.print ("Convert"); - lcd.setCursor (2, 1); - lcd.print ("Unitary"); - lcd.setCursor (2, 2); - lcd.print ("Matrix"); - lcd.setCursor (2, 3); - lcd.print ("Chaser"); - lcd.setCursor (11, 3); - lcd.print ("Multiply"); - lcd.setCursor (11, 0); - lcd.print ("Config"); - lcd.setCursor (11, 2); - lcd.print ("Secuencer"); - lcd.setCursor (11, 1); - lcd.print ("Memory"); - - // Cursor - LCD_Col_Pos = 1; // posicion de cursor - LCD_Row_Pos = 2; - - // configuracion de cursor - Cursor_Conf_Clear(); // limpiar array - - // Acciones - Cursor_Conf[1][1] = 1; // Unitary - Cursor_Conf[2][1] = 1; // Matrix - Cursor_Conf[3][1] = 1; // Chaser - Cursor_Conf[3][10] = 1; // Multiply - Cursor_Conf[0][10] = 1; // Config - Cursor_Conf[2][10] = 1; // Secuencer - Cursor_Conf[1][10] = 1; // Memory - Cursor_Conf[0][1] = 1; // Convert - - // navegar - GUI_Navegar(0, 0); - - // Acciones - // Unitary - if (LCD_Col_Pos == 1 && LCD_Row_Pos == 1) - { - GUI_Control_Unit(); - } - - // Matrix - if (LCD_Col_Pos == 1 && LCD_Row_Pos == 2) - { - GUI_Control_Matrix(); - } - - // Chaser - if (LCD_Col_Pos == 1 && LCD_Row_Pos == 3) - { - GUI_Control_Chaser(); - } - - // Multiply - if (LCD_Col_Pos == 10 && LCD_Row_Pos == 3) - { - GUI_Control_Multiply(); - } - - // Config - if (LCD_Col_Pos == 10 && LCD_Row_Pos == 0) - { - GUI_Config(); - } - - // Secuencer - if (LCD_Col_Pos == 10 && LCD_Row_Pos == 2) - { - GUI_Control_Secuencer(); - } - - // Converter - if (LCD_Col_Pos == 1 && LCD_Row_Pos == 0) - { - GUI_Convert(); - } - - // Memory - if (LCD_Col_Pos == 10 && LCD_Row_Pos == 1) - { - GUI_Memory(); - goto inicio - } -} - -void GUI_Convert() -{ - int valor = 0; // aqui el valor a calcular - int valor_temp = 0; // aqui el valor temporal para las cuentas - int valor_resto = 0; // aqui el valor del resto de la divicion - int valor_Bin [10] = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0}; // aqui el valor descompuesto en binario - lcd.clear (); - lcd.setCursor (0, 0); - lcd.print ("Bin: OOOOOOOOO I=On"); - lcd.setCursor (5, 1); - lcd.print ("124813612 O=Off"); - lcd.setCursor (9, 2); - lcd.print ("62425"); - lcd.setCursor (0, 3); - lcd.print ("Dec: 000 86 Exit"); - - // Cursor - LCD_Col_Pos = 4; // posicion de cursor - LCD_Row_Pos = 3; // posicion e cursor - - // configuracion de cursor - Cursor_Conf_Clear(); // limpiar array - - // Cursores - Cursor_Conf[0][4] = 1; // Bin - Cursor_Conf[3][4] = 1; // Dec - Cursor_Conf[3][15] = 1; // Exit - - //Navegacion: - calc: - GUI_Navegar(0, 0); - - // Acciones - // Exit - if (LCD_Col_Pos == 15 && LCD_Row_Pos == 3) - { - GUI_Control_Options(); - } - - // Binario a decimal - if (LCD_Col_Pos == 4 && LCD_Row_Pos == 0) - { - // boton de centro para salir - // boton de lados para navegar - // boton arriba abajo para cambiar valor - byte cursor = 5; // posicion de cursor - int boton_retardo = 250; // retardo de boton para estabilidad - byte calcular = 0; // calcular binario a decimal - byte calcular_val = 0; // valor a meter a la matriz para calcular - lcd.blink(); - lcd.setCursor (5, 0); - - while (digitalRead(Boton_Center) == HIGH) // salida - { - if (digitalRead(Boton_Right) == LOW) - { - delay(boton_retardo); // esperar a estabilidad - cursor = cursor + 1; - if (cursor > 13) - { - cursor = 5; // regresar al principio - } - lcd.setCursor (cursor, 0); - } - - if (digitalRead(Boton_Left) == LOW) - { - delay(boton_retardo); // esperar a estabilidad - cursor = cursor - 1; - if (cursor < 5) - { - cursor = 13; // regresar al final - } - lcd.setCursor (cursor, 0); - } - - if (digitalRead(Boton_Up) == LOW) - { - delay(boton_retardo); // esperar a estabilidad - lcd.print ("I"); - lcd.setCursor (cursor, 0); - calcular_val = 1; - calcular = 1; - } - - if (digitalRead(Boton_Down) == LOW) - { - delay(boton_retardo); // esperar a estabilidad - lcd.print ("O"); - lcd.setCursor (cursor, 0); - calcular_val = 0; - calcular = 1; - } - - if (calcular == 1) - { - calcular = 0; - // agregar a la matriz el valor nuevo - switch (cursor) - { - case 5: // 1 - valor_Bin [1] = calcular_val; - break; - - case 6: // 2 - valor_Bin [2] = calcular_val; - break; - - case 7: // 4 - valor_Bin [3] = calcular_val; - break; - - case 8: // 8 - valor_Bin [4] = calcular_val; - break; - - case 9: // 16 - valor_Bin [5] = calcular_val; - break; - - case 10: // 32 - valor_Bin [6] = calcular_val; - break; - - case 11: // 64 - valor_Bin [7] = calcular_val; - break; - - case 12: // 128 - valor_Bin [8] = calcular_val; - break; - - case 13: // 256 - valor_Bin [9] = calcular_val; - break; - - } - - // calcular valor de binario a decimal - valor = 0; - if (valor_Bin [1] == 1) - { - valor = valor + 1; - } - - if (valor_Bin [2] == 1) - { - valor = valor + 2; - } - - if (valor_Bin [3] == 1) - { - - valor = valor + 4; - } - - if (valor_Bin [4] == 1) - { - valor = valor + 8; - } - - if (valor_Bin [5] == 1) - { - valor = valor + 16; - } - - if (valor_Bin [6] == 1) - { - valor = valor + 32; - } - - if (valor_Bin [7] == 1) - { - valor = valor + 64; - } - - if (valor_Bin [8] == 1) - { - valor = valor + 128; - } - - if (valor_Bin [9] == 1) - { - valor = valor + 256; - } - - // escribir el valor en decimal - Numerico_Write (valor, 5, 3); - lcd.setCursor (cursor, 0); - } - } - delay(200); // esperar a estabilidad - lcd.noBlink(); - goto calc; - } - // Decimal a binario - if (LCD_Col_Pos == 4 && LCD_Row_Pos == 3) - { - Num_Row_Pos = 3; - Num_Col_Pos = 5; - Numerico_Calc (0); - - if (Num_Val == 712) - { - Encoder_Read (5, 3, 0, 511, 8); // Encoder_Read(byte col, byte row, long limit_min, long limit_max, byte control) - } - - if (Num_Val > 511) - { - Num_Val = 511; // corregir valor en pantalla - lcd.setCursor (5, 3); - lcd.print ("511"); - } - - valor = Num_Val; - - // escribir 00000000 en el valor binario para borrar el anterior - lcd.setCursor (5, 0); - lcd.print ("OOOOOOOOO"); - lcd.setCursor (5, 0); - - // calcular binario - valor_temp = valor; - for (byte pos = 9; pos >= 1; pos --) - { - valor_resto = valor_temp % 2; - valor_temp = valor_temp / 2; - valor_Bin [pos] = valor_resto; - if (valor_resto == 0) - { - lcd.print ("O"); - } - else - { - lcd.print ("I"); - } - } - goto calc; - } -} - -void GUI_Config() -{ - Inicio: - - byte Back_Light_Value = EEPROM.read(BackLight_Add); - byte Contrast_Value = EEPROM.read(Contrast_Add); - byte Bank_Init_Value = EEPROM.read(Bank_Init_Add); - byte Key_Light_Value = EEPROM.read(Key_Light_Add); - - // GUI - lcd.clear (); - lcd.setCursor (0, 0); - lcd.print (" KeyLight:"); - Numerico_Write(Key_Light_Value, 11, 0); - lcd.setCursor (15, 2); - lcd.print ("About"); - lcd.setCursor (0, 1); - lcd.print ("BackLight:"); - Numerico_Write(Back_Light_Value, 11, 1); - lcd.setCursor (1, 2); - lcd.print ("Contrast:"); - Numerico_Write(Contrast_Value, 11, 2); - lcd.setCursor (15, 3); - lcd.print ("Exit"); - - // Bank - lcd.setCursor (1, 3); - lcd.print ("BankInit:"); - - if (Bank_Init_Value > 8 || Bank_Init_Value < 1) - { - lcd.setCursor (11, 3); - lcd.print ("---"); - } - else - { - Numerico_Write(Bank_Init_Value, 11, 3); - } - - // Cursor - LCD_Col_Pos = 10; // posicion de cursor - LCD_Row_Pos = 1; // posicion de cursor - - // configuracion de cursor - Cursor_Conf_Clear(); // limpiar array - - // Cursores - Cursor_Conf[1][10] = 1; // Back Light Value - Cursor_Conf[2][10] = 1; // Contrast Value - Cursor_Conf[3][10] = 1; // Bank init Value - Cursor_Conf[0][10] = 1; // Key Light Value - Cursor_Conf[3][14] = 1; // Exit - Cursor_Conf[2][14] = 1; // About - Navegacion: - GUI_Navegar(0, 0); - - // Acciones - //Back Light Value - if (LCD_Col_Pos == 10 && LCD_Row_Pos == 1) - { - Num_Row_Pos = 1; - Num_Col_Pos = 11; - Numerico_Calc (1); - - if (Num_Val == 712) - { - digitalWrite(Boton_Array_3, LOW); // lectura linea 3 - while (digitalRead(Boton_Array_D) == HIGH && digitalRead(Boton_Center) == HIGH) // enter y center para paro - { - Encoder_Read (11, 1, 0, 255, 3); // Encoder_Read(byte col, byte row, long limit_min, long limit_max, byte control) - goto salida; - - } - digitalWrite(Boton_Array_3, HIGH); // lectura linea 3 - delay(300); // retraso para center - } - - if (Num_Val > 255) - { - Num_Val = 255; - Numerico_Write (255, 11, 1); - } - analogWrite(Back_Light_PWM, Num_Val); - -salida: - - // mecanismo para on off Enable - if (Num_Val == 0) - { - Light_On_Off = 0; - } - - if (Num_Val > 0) - { - Light_On_Off = 1; - } - - EEPROM.write(BackLight_Add, Num_Val); // guardar valor nuevo - goto Navegacion; - } - - //Key Light Value - if (LCD_Col_Pos == 10 && LCD_Row_Pos == 0) - { - Num_Row_Pos = 0; - Num_Col_Pos = 11; - Numerico_Calc (1); - - if (Num_Val == 712) - { - digitalWrite(Boton_Array_3, LOW); // lectura linea 3 - while (digitalRead(Boton_Array_D) == HIGH && digitalRead(Boton_Center) == HIGH) // enter y center para paro - { - Encoder_Read (11, 0, 0, 255, 4); // Encoder_Read(byte col, byte row, long limit_min, long limit_max, byte control) - goto salida_key; - } - digitalWrite(Boton_Array_3, HIGH); // lectura linea 3 - delay(300); // retraso para center - goto salida_key; - } - - if (Num_Val > 255) - { - Num_Val = 255; - Numerico_Write (255, 11, 0); - } - - analogWrite(Key_Light_PWM, Num_Val); - -salida_key: - - // mecanismo para on off Enable - if (Num_Val == 0) - { - Light_On_Off = 0; - } - - if (Num_Val > 0) - { - Light_On_Off = 1; - } - - EEPROM.write(Key_Light_Add, Num_Val); // guardar valor nuevo - goto Navegacion; - } - - //Contrast Value - if (LCD_Col_Pos == 10 && LCD_Row_Pos == 2) - { - Num_Row_Pos = 2; - Num_Col_Pos = 11; - Numerico_Calc (1); - - // encoder - if (Num_Val == 712) - { - Encoder_Read (11, 2, 0, 255, 2); // Encoder_Read(byte col, byte row, long limit_min, long limit_max, byte control) - goto salir; - } - - // teclado - if (Num_Val > 255) - { - Num_Val = 255; - Numerico_Write (255, 11, 2); - } - - if (Num_Val < 150) - { - Num_Val = 150; // limite menor de contraste LCD - Numerico_Write (150, 11, 2); - } - - analogWrite(Contrast_PWM, Num_Val); - -salir: - - EEPROM.write(Contrast_Add, Num_Val); // guardar valor nuevo - goto Navegacion; - } - - //Bank init Value - if (LCD_Col_Pos == 10 && LCD_Row_Pos == 3) - { - Num_Row_Pos = 3; - Num_Col_Pos = 11; - Numerico_Calc (1); - if (Num_Val == 712) - { - Encoder_Read (11, 3, 0, 8, 7); // Encoder_Read(byte col, byte row, long limit_min, long limit_max, byte control) - if (EEPROM.read(Bank_Init_Add) == 0) - { - lcd.setCursor (11, 3); - lcd.print("---"); - } - goto Navegacion; - } - - if (Num_Val > 8) - { - Num_Val = 8; - Numerico_Write (8, 11, 3); - } - - if (Num_Val == 0) - { - lcd.setCursor (11, 3); - lcd.print("---"); - } - - EEPROM.write(Bank_Init_Add, Num_Val); // guardar valor nuevo - goto Navegacion; - } - // Exit - if (LCD_Col_Pos == 14 && LCD_Row_Pos == 3) - { - GUI_Control_Options(); - goto Navegacion; - } - - // About - if (LCD_Col_Pos == 14 && LCD_Row_Pos == 2) - { - GUI_About(); - GUI_Licence(); - goto Inicio; - } - - goto Navegacion; -} - -void GUI_Control_Multiply() -{ - int First_Channel = 1; - long Multiply = 0; - long Quantity = 0; - int Value = 255; - -iniciar: - - // LCD - lcd.clear (); - lcd.setCursor (0, 0); - lcd.print ("b Value"); - lcd.setCursor (1, 0); - - if (Universo_Actual == 0) - { - lcd.print("-"); - } - else - { - lcd.print(Universo_Actual); - } - - lcd.setCursor (0, 1); - lcd.print ("First CH Exit"); - lcd.setCursor (0, 2); - lcd.print ("Multiply Memory"); - lcd.setCursor (0, 3); - lcd.print ("Quantity Apply"); - Numerico_Write (Value, 9, 0); - Numerico_Write (First_Channel, 9, 1); - Numerico_Write (Multiply, 9, 2); - Numerico_Write (Quantity, 9, 3); - - // Cursor - LCD_Col_Pos = 8; // posicion de cursor - LCD_Row_Pos = 0; - -Siguiente: - - // configuracion de cursor - Cursor_Conf_Clear(); // limpiar array - - // Acciones - Cursor_Conf[1][8] = 1; // first Channel - Cursor_Conf[3][8] = 1; // quantity - Cursor_Conf[2][8] = 1; // Multiply - Cursor_Conf[1][13] = 1; // control - Cursor_Conf[2][13] = 1; // Memory - Cursor_Conf[3][13] = 1; // apply - Cursor_Conf[0][8] = 1; // value - - // navegar - GUI_Navegar(0, 0); - - // Acciones - // Exit - if (LCD_Col_Pos == 13 && LCD_Row_Pos == 1) - { - GUI_Control_Options(); - } - - // Memory - if (LCD_Col_Pos == 13 && LCD_Row_Pos == 2) - { - GUI_Memory(); - goto iniciar; - } - - // Apply - if (LCD_Col_Pos == 13 && LCD_Row_Pos == 3) - { - // Validar datos - long valid = Multiply * Quantity; - - if (valid > 512) // si no es valido - { - lcd.setCursor(13, 0); - lcd.print("Error! "); - goto Siguiente; - } - - // calcular - lcd.setCursor(13, 0); - lcd.print(" "); - lcd.setCursor(14, 3); - lcd.print("Calc.."); - long canal; - - for (long conteo = 1; conteo <= Quantity; conteo++) - { - if (conteo == 1) - { - canal = First_Channel; - } - - if (conteo != 1) - { - canal = canal + Multiply; - } - - if (canal > 512) - { - canal = canal - Multiply; - conteo = Quantity; - } - - lcd.setCursor(17, 0); - lcd.print(canal); - delay (5); - ArduinoDmx0.TxBuffer[canal - 1] = Value; - DMX_Values[canal] = Value; - } - - lcd.setCursor(13, 0); - lcd.print("Ok!"); - lcd.setCursor(14, 3); - lcd.print("Apply "); - goto Siguiente; - } - // First Channel - if (LCD_Col_Pos == 8 && LCD_Row_Pos == 1) - { - Num_Row_Pos = 1; - Num_Col_Pos = 9; - Num_Val = First_Channel; // para dejar el numero que estaba si no se cambia - Numerico_Calc(0); - First_Channel = Num_Val; - - if (First_Channel == 0) - { - First_Channel = 1; - Numerico_Write (First_Channel, 9, 1); - } - - if (First_Channel > 512) - { - First_Channel = 512; - Numerico_Write (First_Channel, 9, 1); - } - } - // Multiply - if (LCD_Col_Pos == 8 && LCD_Row_Pos == 2) - { - Num_Row_Pos = 2; - Num_Col_Pos = 9; - Num_Val = Multiply; // para dejar el numero que estaba si no se cambia - Numerico_Calc(0); - Multiply = Num_Val; - if (Multiply == 0) - { - Multiply = 1; - Numerico_Write (Multiply, 9, 2); - } - - if (Multiply > 512) - { - Multiply = 512; - Numerico_Write (Multiply, 9, 2); - } - } - // Quantity - if (LCD_Col_Pos == 8 && LCD_Row_Pos == 3) - { - Num_Row_Pos = 3; - Num_Col_Pos = 9; - Num_Val = Quantity; // para dejar el numero que estaba si no se cambia - Numerico_Calc(0); - Quantity = Num_Val; - - if (Quantity == 0) - { - Quantity = 1; - Numerico_Write (Quantity, 9, 3); - } - - if (Quantity > 512) - { - Quantity = 512; - Numerico_Write (Quantity, 9, 3); - } - } - - // Value - if (LCD_Col_Pos == 8 && LCD_Row_Pos == 0) - { - Num_Row_Pos = 0; - Num_Col_Pos = 9; - Num_Val = Value; // para dejar el numero que estaba si no se cambia - Numerico_Calc(1); - Value = Num_Val; - - if (Value > 255) - { - Value = 255; - Numerico_Write (Value, 9, 0); - } - } - goto Siguiente; -} - -void GUI_Control_Chaser() -{ - long Delay = 1; - long First = 1; - long Final = 0; - - // LCD - lcd.clear (); - lcd.setCursor (0, 0); - lcd.print ("ChaserCH ---"); - lcd.setCursor (3, 1); - lcd.print ("Delay x10=mS"); - lcd.setCursor (0, 2); - lcd.print ("First CH Exit"); - lcd.setCursor (0, 3); - lcd.print ("Final CH Start"); - Numerico_Write (Delay, 9, 1); - Numerico_Write (First, 9, 2); - Numerico_Write (Final, 9, 3); - - // Cursor - LCD_Col_Pos = 8; // posicion de cursor - LCD_Row_Pos = 1; - -Siguiente: - - // configuracion de cursor - Cursor_Conf_Clear(); // limpiar array - - // Acciones - Cursor_Conf[1][8] = 1; // Delay - Cursor_Conf[2][8] = 1; // First - Cursor_Conf[3][8] = 1; // Final - Cursor_Conf[2][14] = 1; // control - Cursor_Conf[3][14] = 1; // Start - - // navegar - GUI_Navegar(0, 0); - - // Acciones - // Control - if (LCD_Col_Pos == 14 && LCD_Row_Pos == 2) - { - // regresar el universo a su lugar - for (int Canal = 1; Canal <= 512; Canal ++) - { - ArduinoDmx0.TxBuffer[Canal - 1] = DMX_Values[Canal]; - } - GUI_Control_Options(); - } - - // Start - if (LCD_Col_Pos == 14 && LCD_Row_Pos == 3) - { - long ciclo_longitud = 1300; // numero multiplicador aprox para 1 seg - long ciclo = 0; - long Delay_Cont = 0; - int canal = First; - lcd.setCursor(15, 3); - lcd.print("Stop "); - lcd.blink(); - - // borrar canales previos - for (int Canales = 0; Canales <= 512; Canales ++) - { - ArduinoDmx0.TxBuffer[Canales] = 0; // salida a DMX - } - - while (digitalRead(Boton_Center) == HIGH) // lectura del boton centro - { - ciclo = ciclo + 1; - if (ciclo == ciclo_longitud) - { - Delay_Cont = Delay_Cont + 1; - if (Delay_Cont == Delay) + delay(boton_retardo); // esperar a estabilidad + cursor = cursor - 1; + if (cursor < 5) { - if (canal > Final) - { - canal = First; - } - Numerico_Write (canal, 9, 0); - lcd.setCursor(19, 3); - - // apagar lo anterior - for (long contar = First; contar <= Final; contar ++) - { - ArduinoDmx0.TxBuffer[contar - 1] = 0; - } - // encender el siguiente - ArduinoDmx0.TxBuffer[canal - 1] = 255; - Delay_Cont = 0; - canal = canal + 1; + cursor = 13; // regresar al final } - ciclo = 0; - } + lcd.setCursor (cursor, 0); } - lcd.noBlink(); - lcd.setCursor(15, 3); - lcd.print("Start"); - delay (300); // evita que le gane la descarga del capacitor - goto Siguiente; - } - - // Delay - if (LCD_Col_Pos == 8 && LCD_Row_Pos == 1) - { - Num_Row_Pos = 1; - Num_Col_Pos = 9; - Num_Val = Delay; // para dejar el numero que estaba si no se cambia - Numerico_Calc(0); - Delay = Num_Val; - } - - // First - if (LCD_Col_Pos == 8 && LCD_Row_Pos == 2) - { - Num_Row_Pos = 2; - Num_Col_Pos = 9; - Num_Val = First; // para dejar el numero que estaba si no se cambia - Numerico_Calc(0); - First = Num_Val; - if (First == 0) + if (digitalRead(Boton_Up) == LOW) { - First = 1; - Numerico_Write (First, 9, 2); + delay(boton_retardo); // esperar a estabilidad + lcd.print ("I"); + lcd.setCursor (cursor, 0); + calcular_val = 1; + calcular = 1; } - if (First > 512) + if (digitalRead(Boton_Down) == LOW) { - First = 512; - Numerico_Write (First, 9, 2); + delay(boton_retardo); // esperar a estabilidad + lcd.print ("O"); + lcd.setCursor (cursor, 0); + calcular_val = 0; + calcular = 1; } - } - - // Final - if (LCD_Col_Pos == 8 && LCD_Row_Pos == 3) - { - Num_Row_Pos = 3; - Num_Col_Pos = 9; - Num_Val = Final; // para dejar el numero que estaba si no se cambia - Numerico_Calc(0); - Final = Num_Val; - if (Final == 0) + if (calcular == 1) { - Final = 1; - Numerico_Write (Final, 9, 3); - } + calcular = 0; + // agregar a la matriz el valor nuevo + switch (cursor) + { + case 5: // 1 + valor_Bin [1] = calcular_val; + break; - if (Final > 512) - { - Final = 512; - Numerico_Write (Final, 9, 3); - } - } - goto Siguiente; -} + case 6: // 2 + valor_Bin [2] = calcular_val; + break; -void Numerico_Write (int valor, int col, int row) -{ - // posicionar el valor en los campos 000 + case 7: // 4 + valor_Bin [3] = calcular_val; + break; - lcd.setCursor (col, row); - lcd.print ("000"); + case 8: // 8 + valor_Bin [4] = calcular_val; + break; - if (valor < 10) - { - lcd.setCursor (col + 2, row); - } + case 9: // 16 + valor_Bin [5] = calcular_val; + break; - if (valor > 9 && valor < 100) - { - lcd.setCursor (col + 1, row); - } + case 10: // 32 + valor_Bin [6] = calcular_val; + break; - if (valor > 99) - { - lcd.setCursor (col, row); - } + case 11: // 64 + valor_Bin [7] = calcular_val; + break; - lcd.print (valor); -} + case 12: // 128 + valor_Bin [8] = calcular_val; + break; -void GUI_Control_Unit() -{ + case 13: // 256 + valor_Bin [9] = calcular_val; + break; -Inicio: + } - Canal_Actual = 1; + // calcular valor de binario a decimal + valor = 0; + if (valor_Bin [1] == 1) + { + valor = valor + 1; + } - // GUI - lcd.clear (); - lcd.setCursor (0, 0); - lcd.print ("Unitary Control: b"); + if (valor_Bin [2] == 1) + { + valor = valor + 2; + } - if (Universo_Actual == 0) - { - lcd.print("-"); - } - else - { - lcd.print(Universo_Actual); - } + if (valor_Bin [3] == 1) + { + + valor = valor + 4; + } - lcd.setCursor (14, 2); - lcd.print ("Exit"); - lcd.setCursor (14, 3); - lcd.print ("Memory"); - lcd.setCursor (0, 2); - lcd.print ("Channel: 001"); - lcd.setCursor (2, 3); - lcd.print ("Value:"); - Numerico_Write(DMX_Values[1], 9, 3); - lcd.setCursor (0, 1); - lcd.print ("c002=v"); - Numerico_Write(DMX_Values[2], 6, 1); - lcd.setCursor (11, 1); - lcd.print ("c003=v"); - Numerico_Write(DMX_Values[3], 17, 1); - - // Cursor - LCD_Col_Pos = 8; // posicion de cursor - LCD_Row_Pos = 2; // posicion e cursor - - // configuracion de cursor - Cursor_Conf_Clear(); // limpiar array - - // Cursores - Cursor_Conf[2][8] = 1; // Channel - Cursor_Conf[3][8] = 1; // Value - Cursor_Conf[2][13] = 1; // Control - Cursor_Conf[3][13] = 1; // Memory - - // navegar - -Navegacion: - - GUI_Navegar(0, 0); - - // Acciones - //Channel - if (LCD_Col_Pos == 8 && LCD_Row_Pos == 2) - { - Numerico_Write(Canal_Actual, 9, 2); - Num_Row_Pos = 2; - Num_Col_Pos = 9; - Num_Val = Canal_Actual; // para dejar el numero que estaba si no se cambia - Numerico_Calc (0); + if (valor_Bin [4] == 1) + { + valor = valor + 8; + } - if (Num_Val > 512) - { - Num_Val = 512; - Numerico_Write (512, 9, 2); - } + if (valor_Bin [5] == 1) + { + valor = valor + 16; + } - if (Num_Val < 1) - { - Num_Val = 1; - Numerico_Write (1, 9, 2); - } + if (valor_Bin [6] == 1) + { + valor = valor + 32; + } - // mostrar valor actual del canal - Canal_Actual = Num_Val; - Numerico_Write(DMX_Values[Canal_Actual], 9, 3); + if (valor_Bin [7] == 1) + { + valor = valor + 64; + } - // mostrar anterior y siguiente - if (Canal_Actual == 1) - { - Numerico_Write(2, 1, 1); - Numerico_Write(DMX_Values[2], 6, 1); - Numerico_Write(3, 12, 1); - Numerico_Write(DMX_Values[3], 17, 1); - } + if (valor_Bin [8] == 1) + { + valor = valor + 128; + } - if (Canal_Actual == 512) - { - Numerico_Write(510, 1, 1); - Numerico_Write(DMX_Values[510], 6, 1); - Numerico_Write(511, 12, 1); - Numerico_Write(DMX_Values[511], 17, 1); - } + if (valor_Bin [9] == 1) + { + valor = valor + 256; + } - if (Canal_Actual > 1 && Canal_Actual < 512) - { - Numerico_Write(Canal_Actual - 1, 1, 1); - Numerico_Write(DMX_Values[Canal_Actual - 1], 6, 1); - Numerico_Write(Canal_Actual + 1, 12, 1); - Numerico_Write(DMX_Values[Canal_Actual + 1], 17, 1); + // escribir el valor en decimal + Numerico_Write (valor, 5, 3); + lcd.setCursor (cursor, 0); } + } + delay(200); // esperar a estabilidad + lcd.noBlink(); + goto calc; } - - // Value - if (LCD_Col_Pos == 8 && LCD_Row_Pos == 3) + // Decimal a binario + if (LCD_Col_Pos == 4 && LCD_Row_Pos == 3) { Num_Row_Pos = 3; - Num_Col_Pos = 9; - Num_Val = DMX_Values[Canal_Actual]; // para dejar el numero que estaba si no se cambia - Numerico_Calc (1); - - if (Num_Val == 612) // ubicar - { - Ubicar(); - } - - if (Num_Val == 712) // analogo - { - Encoder_Read(9, 3, 0, 255, 1); // Encoder_Read(byte col, byte row, long limit_min, long limit_max, byte control) - goto Navegacion; - } - - if (Num_Val > 255) - { - Num_Val = 255; - Numerico_Write (255, 9, 3); - } - - // Escribr valor en dmx - ArduinoDmx0.TxBuffer[Canal_Actual - 1] = Num_Val; - DMX_Values[Canal_Actual] = Num_Val; - goto Navegacion; - } - - // Memory - if (LCD_Col_Pos == 13 && LCD_Row_Pos == 3) - { - GUI_Memory(); - goto Inicio; - } - - // Control - if (LCD_Col_Pos == 13 && LCD_Row_Pos == 2) - { - GUI_Control_Options(); - } - - goto Navegacion; -} - -void Ubicar() -{ - digitalWrite(Boton_Array_4, LOW); - - while (digitalRead(Boton_Array_C) == HIGH && digitalRead(Boton_Center) == HIGH) - { - ArduinoDmx0.TxBuffer[Canal_Actual - 1] = 255; - Numerico_Write (255, Num_Col_Pos - 2, Num_Row_Pos); - delay (100); - ArduinoDmx0.TxBuffer[Canal_Actual - 1] = 0; - lcd.setCursor (Num_Col_Pos - 2, Num_Row_Pos); - lcd.print (" "); - delay (100); - } - - digitalWrite(Boton_Array_4, HIGH); - delay(300); // rebote de boton enter - lcd.setCursor (Num_Col_Pos, Num_Row_Pos); -} - -void Numerico_Calc(byte value) -{ - // escritura del numero desde el teclado numerico si value es 1 entra opcion de A 255 y B 0 - - int Num_Val_Temp_1 = 0; - int Num_Val_Temp_2 = 0; - lcd.setCursor (Num_Col_Pos, Num_Row_Pos); - lcd.print("___"); - lcd.blink(); // mostrar cursor - - //Num_Val = 0; - Num_Col_Pos = Num_Col_Pos + 2; - lcd.setCursor (Num_Col_Pos, Num_Row_Pos); - - // primer numero - Numerico_Read(); // leer boton - if (Boton_Calc <= 9) - { - lcd.print (Boton_Calc); // escribir valor calculado - lcd.setCursor (Num_Col_Pos, Num_Row_Pos); - Num_Val = Boton_Calc; // valor calculado - Num_Val_Temp_1 = Boton_Calc; // valor temporal para el acarreo - } + Num_Col_Pos = 5; + Numerico_Calc (0); - if (Boton_Calc == 14) // enter - { - goto Salida; // num val = 0 - } + if (Num_Val == 712) + { + Encoder_Read (5, 3, 0, 511, 8); // Encoder_Read(byte col, byte row, long limit_min, long limit_max, byte control) + } - if (value == 1) // si es un valor - { - if (Boton_Calc == 10) // 255 + if (Num_Val > 511) { - Num_Val = 255; - goto Salida; + Num_Val = 511; // corregir valor en pantalla + lcd.setCursor (5, 3); + lcd.print ("511"); } - if (Boton_Calc == 11) // 000 - { - Num_Val = 0; - goto Salida; - } + valor = Num_Val; - if (Boton_Calc == 12) // ubicar - { - Num_Val = 612; - goto Salida_Option; - } + // escribir 00000000 en el valor binario para borrar el anterior + lcd.setCursor (5, 0); + lcd.print ("OOOOOOOOO"); + lcd.setCursor (5, 0); - if (Boton_Calc == 13) // analogo + // calcular binario + valor_temp = valor; + for (byte pos = 9; pos >= 1; pos --) { - Num_Val = 712; - goto Salida_Option; + valor_resto = valor_temp % 2; + valor_temp = valor_temp / 2; + valor_Bin [pos] = valor_resto; + if (valor_resto == 0) + { + lcd.print ("O"); + } + else + { + lcd.print ("I"); + } } + goto calc; } - // segundo numero - Numerico_Read(); // leer boton - if (Boton_Calc == 14) // enter - { - Num_Val = Num_Val_Temp_1; - goto Salida; // num val = num val anterior - } - - if (value == 1) // si es un valor - { - if (Boton_Calc == 10) // 255 - { - Num_Val = 255; - goto Salida; - } - - if (Boton_Calc == 11) // 000 - { - Num_Val = 0; - goto Salida; - } +}*/ - if (Boton_Calc == 12) // ubicar - { - Num_Val = 612; - goto Salida_Option; - } +void GUI_Config() +{ + Inicio: - if (Boton_Calc == 13) // analogo - { - Num_Val = 712; - goto Salida_Option; - } - } + byte Back_Light_Value = EEPROM.read(BackLight_Add); + byte Contrast_Value = EEPROM.read(Contrast_Add); + byte Bank_Init_Value = EEPROM.read(Bank_Init_Add); + byte Key_Light_Value = EEPROM.read(Key_Light_Add); - if (Boton_Calc <= 9) - { - // recorrer numero ya impreso - Num_Col_Pos = Num_Col_Pos - 1; - lcd.setCursor (Num_Col_Pos, Num_Row_Pos); - lcd.print (Num_Val_Temp_1); - - // dibujar numero nuevo - lcd.print (Boton_Calc); - Num_Val_Temp_2 = Boton_Calc; - Num_Col_Pos = Num_Col_Pos + 1; - lcd.setCursor (Num_Col_Pos, Num_Row_Pos); - } + // GUI + lcd.clear (); + lcd.setCursor (0, 0); + lcd.print (" KeyLight:"); + Numerico_Write(Key_Light_Value, 11, 0); + lcd.setCursor (15, 2); + lcd.print ("About"); + lcd.setCursor (0, 1); + lcd.print ("BackLight:"); + Numerico_Write(Back_Light_Value, 11, 1); + lcd.setCursor (1, 2); + lcd.print ("Contrast:"); + Numerico_Write(Contrast_Value, 11, 2); + lcd.setCursor (15, 3); + lcd.print ("Exit"); - // Tercer numero - Numerico_Read(); // leer boton - if (Boton_Calc == 14) // enter - { - Num_Val = (Num_Val_Temp_1 * 10) + Num_Val_Temp_2; - goto Salida; - } + // Bank + lcd.setCursor (1, 3); + lcd.print ("BankInit:"); - if (value == 1) // si es un valor - { - if (Boton_Calc == 10) // 255 - { - Num_Val = 255; - goto Salida; - } + if (Bank_Init_Value > 8 || Bank_Init_Value < 1) + { + lcd.setCursor (11, 3); + lcd.print ("---"); + } + else + { + Numerico_Write(Bank_Init_Value, 11, 3); + } - if (Boton_Calc == 11) // 000 - { - Num_Val = 0; - goto Salida; - } + // Cursor + LCD_Col_Pos = 10; // posicion de cursor + LCD_Row_Pos = 1; // posicion de cursor - if (Boton_Calc == 12) // ubicar - { - Num_Val = 612; - goto Salida_Option; - } + // configuracion de cursor + Cursor_Conf_Clear(); // limpiar array - if (Boton_Calc == 13) // analogo - { - Num_Val = 712; - goto Salida_Option; - } - } + // Cursores + Cursor_Conf[1][10] = 1; // Back Light Value + Cursor_Conf[2][10] = 1; // Contrast Value + Cursor_Conf[3][10] = 1; // Bank init Value + Cursor_Conf[0][10] = 1; // Key Light Value + Cursor_Conf[3][14] = 1; // Exit + Cursor_Conf[2][14] = 1; // About + Navegacion: + GUI_Navegar(0, 0); - if (Boton_Calc <= 9) - { - // recorrer numero ya impreso - Num_Col_Pos = Num_Col_Pos - 2; - lcd.setCursor (Num_Col_Pos, Num_Row_Pos); - lcd.print (Num_Val_Temp_1); - lcd.print (Num_Val_Temp_2); - - // dibujar numero nuevo - Num_Col_Pos = Num_Col_Pos + 2; - lcd.setCursor (Num_Col_Pos, Num_Row_Pos); - lcd.print (Boton_Calc); - Num_Val = Boton_Calc + (Num_Val_Temp_1 * 100) + (Num_Val_Temp_2 * 10); - } + // Acciones + //Back Light Value + if (LCD_Col_Pos == 10 && LCD_Row_Pos == 1) + { + Num_Row_Pos = 1; + Num_Col_Pos = 11; + Numerico_Calc (1); -Salida: + if (Num_Val == 712) + { + digitalWrite(Boton_Array_3, LOW); // lectura linea 3 + while (digitalRead(Boton_Array_D) == HIGH) //&& digitalRead(Boton_Center) == HIGH) // enter y center para paro + { + Encoder_Read (11, 1, 0, 255, 3); // Encoder_Read(byte col, byte row, long limit_min, long limit_max, byte control) + goto salida; + + } + digitalWrite(Boton_Array_3, HIGH); // lectura linea 3 + delay(300); // retraso para center + } - lcd.noBlink(); + if (Num_Val > 255) + { + Num_Val = 255; + Numerico_Write (255, 11, 1); + } + analogWrite(Back_Light_PWM, Num_Val); - // pintar los ceros antes del numero - Numerico_Write (Num_Val, Num_Col_Pos - 2, Num_Row_Pos); - Num_Col_Pos = Num_Col_Pos - 4; + salida: - // regresar el cursor a su ligar - lcd.setCursor (Num_Col_Pos, Num_Row_Pos); + // mecanismo para on off Enable + if (Num_Val == 0) + { + Light_On_Off = 0; + } -Salida_Option: + if (Num_Val > 0) + { + Light_On_Off = 1; + } - lcd.noBlink(); - lcd.setCursor (Num_Col_Pos, Num_Row_Pos); - delay(300); // rebote de boton -} + EEPROM.write(BackLight_Add, Num_Val); // guardar valor nuevo + goto Navegacion; + } -void Numerico_Read() -{ - long Num_Barrido_Time = 5; // tiempo entre barrido de keys - Boton_Calc = 17; // limpiar valor para lectura + //Key Light Value + if (LCD_Col_Pos == 10 && LCD_Row_Pos == 0) + { + Num_Row_Pos = 0; + Num_Col_Pos = 11; + Numerico_Calc (1); + + if (Num_Val == 712) + { + digitalWrite(Boton_Array_3, LOW); // lectura linea 3 + while (digitalRead(Boton_Array_D) == HIGH && digitalRead(Enc_Center) == HIGH) // enter y center para paro + { + Encoder_Read (11, 0, 0, 255, 4); // Encoder_Read(byte col, byte row, long limit_min, long limit_max, byte control) + goto salida_key; + } + digitalWrite(Boton_Array_3, HIGH); // lectura linea 3 + delay(300); // retraso para center + goto salida_key; + } - while (Boton_Calc == 17) // valor calculado # E * F, 17 sin valor calculado - { - // Barrido - // Linea 1 - digitalWrite(Boton_Array_1, LOW); // lectura linea 1 + if (Num_Val > 255) + { + Num_Val = 255; + Numerico_Write (255, 11, 0); + } - // Lectura 1A = 1 - if (digitalRead(Boton_Array_A) == LOW) - { - Boton_Calc = 1; - delay(Boton_Delay_Teclado); - } + analogWrite(Key_Light_PWM, Num_Val); - delay(Num_Barrido_Time); + salida_key: - // Lectura 1B = 6 - if (digitalRead(Boton_Array_B) == LOW) - { - Boton_Calc = 4; - delay(Boton_Delay_Teclado); - } + // mecanismo para on off Enable + if (Num_Val == 0) + { + Light_On_Off = 0; + } - delay(Num_Barrido_Time); + if (Num_Val > 0) + { + Light_On_Off = 1; + } - // Lectura 1C = 7 - if (digitalRead(Boton_Array_C) == LOW) - { - Boton_Calc = 7; - delay(Boton_Delay_Teclado); - } + EEPROM.write(Key_Light_Add, Num_Val); // guardar valor nuevo + goto Navegacion; + } - delay(Num_Barrido_Time); + //Contrast Value + if (LCD_Col_Pos == 10 && LCD_Row_Pos == 2) + { + Num_Row_Pos = 2; + Num_Col_Pos = 11; + Numerico_Calc (1); - // Lectura 1D = * = 15 - if (digitalRead(Boton_Array_D) == LOW) - { - Boton_Calc = 15; - delay(Boton_Delay_Teclado); - } + // encoder + if (Num_Val == 712) + { + Encoder_Read (11, 2, 0, 255, 2); // Encoder_Read(byte col, byte row, long limit_min, long limit_max, byte control) + goto salir; + } - delay(Num_Barrido_Time); - digitalWrite(Boton_Array_1, HIGH); // lectura linea 1 + // teclado + if (Num_Val > 255) + { + Num_Val = 255; + Numerico_Write (255, 11, 2); + } - // Linea 2 - digitalWrite(Boton_Array_2, LOW); // lectura linea 2 + if (Num_Val < 150) + { + Num_Val = 150; // limite menor de contraste LCD + Numerico_Write (150, 11, 2); + } - // Lectura 2A = 2 - if (digitalRead(Boton_Array_A) == LOW) - { - Boton_Calc = 2; - delay(Boton_Delay_Teclado); - } + analogWrite(Contrast_PWM, Num_Val); - delay(Num_Barrido_Time); + salir: - // Lectura 2B = 5 - if (digitalRead(Boton_Array_B) == LOW) - { - Boton_Calc = 5; - delay(Boton_Delay_Teclado); - } + EEPROM.write(Contrast_Add, Num_Val); // guardar valor nuevo + goto Navegacion; + } - delay(Num_Barrido_Time); + //Bank init Value + if (LCD_Col_Pos == 10 && LCD_Row_Pos == 3) + { + Num_Row_Pos = 3; + Num_Col_Pos = 11; + Numerico_Calc (1); + if (Num_Val == 712) + { + Encoder_Read (11, 3, 0, 8, 7); // Encoder_Read(byte col, byte row, long limit_min, long limit_max, byte control) + if (EEPROM.read(Bank_Init_Add) == 0) + { + lcd.setCursor (11, 3); + lcd.print("---"); + } + goto Navegacion; + } - // Lectura 2C = 8 - if (digitalRead(Boton_Array_C) == LOW) - { - Boton_Calc = 8; - delay(Boton_Delay_Teclado); - } + if (Num_Val > 8) + { + Num_Val = 8; + Numerico_Write (8, 11, 3); + } - delay(Num_Barrido_Time); + if (Num_Val == 0) + { + lcd.setCursor (11, 3); + lcd.print("---"); + } - // Lectura 2D = 0 - if (digitalRead(Boton_Array_D) == LOW) - { - Boton_Calc = 0; - delay(Boton_Delay_Teclado); - } + EEPROM.write(Bank_Init_Add, Num_Val); // guardar valor nuevo + goto Navegacion; + } + // Exit + if (LCD_Col_Pos == 14 && LCD_Row_Pos == 3) + { + GUI_Control_Options(); + goto Navegacion; + } - delay(Num_Barrido_Time); - digitalWrite(Boton_Array_2, HIGH); // lectura linea 2 + // About + if (LCD_Col_Pos == 14 && LCD_Row_Pos == 2) + { + GUI_About(); + GUI_Licence(); + goto Inicio; + } - // Linea 3 - digitalWrite(Boton_Array_3, LOW); // lectura linea 3 + goto Navegacion; +} - // Lectura 3A = 3 - if (digitalRead(Boton_Array_A) == LOW) - { - Boton_Calc = 3; - delay(Boton_Delay_Teclado); - } +void GUI_Control_Multiply() +{ + int First_Channel = 1; + long Multiply = 0; + long Quantity = 0; + int Value = 255; + + iniciar: + + // LCD + lcd.clear (); + lcd.setCursor (0, 0); + lcd.print ("b Value"); + lcd.setCursor (1, 0); + + if (Universo_Actual == 0) + { + lcd.print("-"); + } + else + { + lcd.print(Universo_Actual); + } + + lcd.setCursor (0, 1); + lcd.print ("First CH Exit"); + lcd.setCursor (0, 2); + lcd.print ("Multiply Memory"); + lcd.setCursor (0, 3); + lcd.print ("Quantity Apply"); + Numerico_Write (Value, 9, 0); + Numerico_Write (First_Channel, 9, 1); + Numerico_Write (Multiply, 9, 2); + Numerico_Write (Quantity, 9, 3); + + // Cursor + LCD_Col_Pos = 8; // posicion de cursor + LCD_Row_Pos = 0; + + Siguiente: + + // configuracion de cursor + Cursor_Conf_Clear(); // limpiar array + + // Acciones + Cursor_Conf[1][8] = 1; // first Channel + Cursor_Conf[3][8] = 1; // quantity + Cursor_Conf[2][8] = 1; // Multiply + Cursor_Conf[1][13] = 1; // control + Cursor_Conf[2][13] = 1; // Memory + Cursor_Conf[3][13] = 1; // apply + Cursor_Conf[0][8] = 1; // value + + // navegar + GUI_Navegar(0, 0); - delay(Num_Barrido_Time); + // Acciones + // Exit + if (LCD_Col_Pos == 13 && LCD_Row_Pos == 1) + { + GUI_Control_Options(); + } + + // Memory + if (LCD_Col_Pos == 13 && LCD_Row_Pos == 2) + { + GUI_Memory(); + goto iniciar; + } + + // Apply + if (LCD_Col_Pos == 13 && LCD_Row_Pos == 3) + { + // Validar datos + long valid = Multiply * Quantity; + + if (valid > 512) // si no es valido + { + lcd.setCursor(13, 0); + lcd.print("Error! "); + goto Siguiente; + } + + // calcular + lcd.setCursor(13, 0); + lcd.print(" "); + lcd.setCursor(14, 3); + lcd.print("Calc.."); + long canal; + + for (long conteo = 1; conteo <= Quantity; conteo++) + { + if (conteo == 1) + { + canal = First_Channel; + } + + if (conteo != 1) + { + canal = canal + Multiply; + } + + if (canal > 512) + { + canal = canal - Multiply; + conteo = Quantity; + } + + lcd.setCursor(17, 0); + lcd.print(canal); + delay (5); + ArduinoDmx0.TxBuffer[canal - 1] = Value; + DMX_Values[canal] = Value; + } + + lcd.setCursor(13, 0); + lcd.print("Ok!"); + lcd.setCursor(14, 3); + lcd.print("Apply "); + goto Siguiente; + } + + // First Channel + if (LCD_Col_Pos == 8 && LCD_Row_Pos == 1) + { + Num_Row_Pos = 1; + Num_Col_Pos = 9; + Num_Val = First_Channel; // para dejar el numero que estaba si no se cambia + Numerico_Calc(0); + First_Channel = Num_Val; + + if (First_Channel == 0) + { + First_Channel = 1; + Numerico_Write (First_Channel, 9, 1); + } + + if (First_Channel > 512) + { + First_Channel = 512; + Numerico_Write (First_Channel, 9, 1); + } + } + + // Multiply + if (LCD_Col_Pos == 8 && LCD_Row_Pos == 2) + { + Num_Row_Pos = 2; + Num_Col_Pos = 9; + Num_Val = Multiply; // para dejar el numero que estaba si no se cambia + Numerico_Calc(0); + Multiply = Num_Val; + if (Multiply == 0) + { + Multiply = 1; + Numerico_Write (Multiply, 9, 2); + } + + if (Multiply > 512) + { + Multiply = 512; + Numerico_Write (Multiply, 9, 2); + } + } + + // Quantity + if (LCD_Col_Pos == 8 && LCD_Row_Pos == 3) + { + Num_Row_Pos = 3; + Num_Col_Pos = 9; + Num_Val = Quantity; // para dejar el numero que estaba si no se cambia + Numerico_Calc(0); + Quantity = Num_Val; + + if (Quantity == 0) + { + Quantity = 1; + Numerico_Write (Quantity, 9, 3); + } + + if (Quantity > 512) + { + Quantity = 512; + Numerico_Write (Quantity, 9, 3); + } + } + + // Value + if (LCD_Col_Pos == 8 && LCD_Row_Pos == 0) + { + Num_Row_Pos = 0; + Num_Col_Pos = 9; + Num_Val = Value; // para dejar el numero que estaba si no se cambia + Numerico_Calc(1); + Value = Num_Val; + + if (Value > 255) + { + Value = 255; + Numerico_Write (Value, 9, 0); + } + } + + goto Siguiente; +} - // Lectura 3B = 4 - if (digitalRead(Boton_Array_B) == LOW) - { - Boton_Calc = 6; - delay(Boton_Delay_Teclado); - } +void GUI_Control_Chaser() +{ + long Delay = 1; + long First = 1; + long Final = 0; + + // LCD + lcd.clear (); + lcd.setCursor (0, 0); + lcd.print ("ChaserCH ---"); + lcd.setCursor (3, 1); + lcd.print ("Delay x10=mS"); + lcd.setCursor (0, 2); + lcd.print ("First CH Exit"); + lcd.setCursor (0, 3); + lcd.print ("Final CH Start"); + Numerico_Write (Delay, 9, 1); + Numerico_Write (First, 9, 2); + Numerico_Write (Final, 9, 3); + + // Cursor + LCD_Col_Pos = 8; // posicion de cursor + LCD_Row_Pos = 1; + + Siguiente: + + // configuracion de cursor + Cursor_Conf_Clear(); // limpiar array + + // Acciones + Cursor_Conf[1][8] = 1; // Delay + Cursor_Conf[2][8] = 1; // First + Cursor_Conf[3][8] = 1; // Final + Cursor_Conf[2][14] = 1; // control + Cursor_Conf[3][14] = 1; // Start + + // navegar + GUI_Navegar(0, 0); - delay(Num_Barrido_Time); + // Acciones + // Control + if (LCD_Col_Pos == 14 && LCD_Row_Pos == 2) + { + // regresar el universo a su lugar + for (int Canal = 1; Canal <= 512; Canal ++) + { + ArduinoDmx0.TxBuffer[Canal - 1] = DMX_Values[Canal]; + } + GUI_Control_Options(); + } + + // Start + if (LCD_Col_Pos == 14 && LCD_Row_Pos == 3) + { + long ciclo_longitud = 1300; // numero multiplicador aprox para 1 seg + long ciclo = 0; + long Delay_Cont = 0; + int canal = First; + lcd.setCursor(15, 3); + lcd.print("Stop "); + lcd.blink(); + + // borrar canales previos + for (int Canales = 0; Canales <= 512; Canales ++) + { + ArduinoDmx0.TxBuffer[Canales] = 0; // salida a DMX + } + + while (digitalRead(Enc_Center) == HIGH) // lectura del boton centro + { + ciclo = ciclo + 1; + if (ciclo == ciclo_longitud) + { + Delay_Cont = Delay_Cont + 1; + if (Delay_Cont == Delay) + { + if (canal > Final) + { + canal = First; + } + Numerico_Write (canal, 9, 0); + lcd.setCursor(19, 3); + + // apagar lo anterior + for (long contar = First; contar <= Final; contar ++) + { + ArduinoDmx0.TxBuffer[contar - 1] = 0; + } + // encender el siguiente + ArduinoDmx0.TxBuffer[canal - 1] = 255; + Delay_Cont = 0; + canal = canal + 1; + } + ciclo = 0; + } + } + lcd.noBlink(); + lcd.setCursor(15, 3); + lcd.print("Start"); + delay (300); // evita que le gane la descarga del capacitor + goto Siguiente; + } + + // Delay + if (LCD_Col_Pos == 8 && LCD_Row_Pos == 1) + { + Num_Row_Pos = 1; + Num_Col_Pos = 9; + Num_Val = Delay; // para dejar el numero que estaba si no se cambia + Numerico_Calc(0); + Delay = Num_Val; + } + + // First + if (LCD_Col_Pos == 8 && LCD_Row_Pos == 2) + { + Num_Row_Pos = 2; + Num_Col_Pos = 9; + Num_Val = First; // para dejar el numero que estaba si no se cambia + Numerico_Calc(0); + First = Num_Val; + + if (First == 0) + { + First = 1; + Numerico_Write (First, 9, 2); + } + + if (First > 512) + { + First = 512; + Numerico_Write (First, 9, 2); + } + } + + // Final + if (LCD_Col_Pos == 8 && LCD_Row_Pos == 3) + { + Num_Row_Pos = 3; + Num_Col_Pos = 9; + Num_Val = Final; // para dejar el numero que estaba si no se cambia + Numerico_Calc(0); + Final = Num_Val; + + if (Final == 0) + { + Final = 1; + Numerico_Write (Final, 9, 3); + } + + if (Final > 512) + { + Final = 512; + Numerico_Write (Final, 9, 3); + } + } + goto Siguiente; +} - // Lectura 3C = 9 - if (digitalRead(Boton_Array_C) == LOW) - { - Boton_Calc = 9; - delay(Boton_Delay_Teclado); - } +void Numerico_Write (int valor, int col, int row) +{ + // posicionar el valor en los campos 000 - delay(Num_Barrido_Time); + lcd.setCursor (col, row); + lcd.print ("000"); - // Lectura 3D = 14 - if (digitalRead(Boton_Array_D) == LOW) - { - Boton_Calc = 14; - delay(Boton_Delay_Teclado); - } + if (valor < 10) + { + lcd.setCursor (col + 2, row); + } - delay(Num_Barrido_Time); - digitalWrite(Boton_Array_3, HIGH); // lectura linea 3 + if (valor > 9 && valor < 100) + { + lcd.setCursor (col + 1, row); + } - // Linea 4 - digitalWrite(Boton_Array_4, LOW); // lectura linea 4 + if (valor > 99) + { + lcd.setCursor (col, row); + } - // Lectura 4A = 10 - if (digitalRead(Boton_Array_A) == LOW) - { - Boton_Calc = 10; - delay(Boton_Delay_Teclado); - } + lcd.print (valor); +} - delay(Num_Barrido_Time); +void GUI_Control_Unit() +{ - // Lectura 4B = 11 - if (digitalRead(Boton_Array_B) == LOW) - { - Boton_Calc = 11; - delay(Boton_Delay_Teclado); - } + Inicio: - delay(Num_Barrido_Time); + Canal_Actual = 1; + + // GUI + lcd.clear (); + lcd.setCursor (0, 0); + lcd.print ("Unitary Control: b"); + + if (Universo_Actual == 0) + { + lcd.print("-"); + } + else + { + lcd.print(Universo_Actual); + } + + lcd.setCursor (14, 2); + lcd.print ("Exit"); + lcd.setCursor (14, 3); + lcd.print ("Memory"); + lcd.setCursor (0, 2); + lcd.print ("Channel: 001"); + lcd.setCursor (2, 3); + lcd.print ("Value:"); + Numerico_Write(DMX_Values[1], 9, 3); + lcd.setCursor (0, 1); + lcd.print ("c002=v"); + Numerico_Write(DMX_Values[2], 6, 1); + lcd.setCursor (11, 1); + lcd.print ("c003=v"); + Numerico_Write(DMX_Values[3], 17, 1); + + // Cursor + LCD_Col_Pos = 8; // posicion de cursor + LCD_Row_Pos = 2; // posicion e cursor + + // configuracion de cursor + Cursor_Conf_Clear(); // limpiar array + + // Cursores + Cursor_Conf[2][8] = 1; // Channel + Cursor_Conf[3][8] = 1; // Value + Cursor_Conf[2][13] = 1; // Control + Cursor_Conf[3][13] = 1; // Memory + + // navegar + Navegacion: - // Lectura 4C = 12 - if (digitalRead(Boton_Array_C) == LOW) - { - Boton_Calc = 12; - delay(Boton_Delay_Teclado); - } + GUI_Navegar(0, 0); - delay(Num_Barrido_Time); + // Acciones + //Channel + if (LCD_Col_Pos == 8 && LCD_Row_Pos == 2) + { + Numerico_Write(Canal_Actual, 9, 2); + Num_Row_Pos = 2; + Num_Col_Pos = 9; + Num_Val = Canal_Actual; // para dejar el numero que estaba si no se cambia + Numerico_Calc (0); + + if (Num_Val > 512) + { + Num_Val = 512; + Numerico_Write (512, 9, 2); + } + + if (Num_Val < 1) + { + Num_Val = 1; + Numerico_Write (1, 9, 2); + } + + // mostrar valor actual del canal + Canal_Actual = Num_Val; + Numerico_Write(DMX_Values[Canal_Actual], 9, 3); + + // mostrar anterior y siguiente + if (Canal_Actual == 1) + { + Numerico_Write(2, 1, 1); + Numerico_Write(DMX_Values[2], 6, 1); + Numerico_Write(3, 12, 1); + Numerico_Write(DMX_Values[3], 17, 1); + } + + if (Canal_Actual == 512) + { + Numerico_Write(510, 1, 1); + Numerico_Write(DMX_Values[510], 6, 1); + Numerico_Write(511, 12, 1); + Numerico_Write(DMX_Values[511], 17, 1); + } + + if (Canal_Actual > 1 && Canal_Actual < 512) + { + Numerico_Write(Canal_Actual - 1, 1, 1); + Numerico_Write(DMX_Values[Canal_Actual - 1], 6, 1); + Numerico_Write(Canal_Actual + 1, 12, 1); + Numerico_Write(DMX_Values[Canal_Actual + 1], 17, 1); + } + } + + // Value + if (LCD_Col_Pos == 8 && LCD_Row_Pos == 3) + { + Num_Row_Pos = 3; + Num_Col_Pos = 9; + Num_Val = DMX_Values[Canal_Actual]; // para dejar el numero que estaba si no se cambia + Numerico_Calc (1); + + if (Num_Val == 612) // ubicar + { + Ubicar(); + } + + if (Num_Val == 712) // analogo + { + Encoder_Read(9, 3, 0, 255, 1); // Encoder_Read(byte col, byte row, long limit_min, long limit_max, byte control) + goto Navegacion; + } + + if (Num_Val > 255) + { + Num_Val = 255; + Numerico_Write (255, 9, 3); + } + + // Escribr valor en dmx + ArduinoDmx0.TxBuffer[Canal_Actual - 1] = Num_Val; + DMX_Values[Canal_Actual] = Num_Val; + goto Navegacion; + } + + // Memory + if (LCD_Col_Pos == 13 && LCD_Row_Pos == 3) + { + GUI_Memory(); + goto Inicio; + } + + // Control + if (LCD_Col_Pos == 13 && LCD_Row_Pos == 2) + { + GUI_Control_Options(); + } + + goto Navegacion; +} - // Lectura 4D = 13 - if (digitalRead(Boton_Array_D) == LOW) - { - Boton_Calc = 13; - delay(Boton_Delay_Teclado); - } +void Ubicar() +{ + digitalWrite(Boton_Array_4, LOW); + + while (digitalRead(Boton_Array_C) == HIGH && digitalRead(Enc_Center) == HIGH) + { + ArduinoDmx0.TxBuffer[Canal_Actual - 1] = 255; + Numerico_Write (255, Num_Col_Pos - 2, Num_Row_Pos); + delay (100); + ArduinoDmx0.TxBuffer[Canal_Actual - 1] = 0; + lcd.setCursor (Num_Col_Pos - 2, Num_Row_Pos); + lcd.print (" "); + delay (100); + } + + digitalWrite(Boton_Array_4, HIGH); + delay(300); // rebote de boton enter + lcd.setCursor (Num_Col_Pos, Num_Row_Pos); +} - delay(Num_Barrido_Time); - digitalWrite(Boton_Array_4, HIGH); // lectura linea 4 +void Numerico_Calc(byte value) +{ + // escritura del numero desde el teclado numerico si value es 1 entra opcion de A 255 y B 0 + + int Num_Val_Temp_1 = 0; + int Num_Val_Temp_2 = 0; + lcd.setCursor (Num_Col_Pos, Num_Row_Pos); + lcd.print("___"); + lcd.blink(); // mostrar cursor + + //Num_Val = 0; + Num_Col_Pos = Num_Col_Pos + 2; + lcd.setCursor (Num_Col_Pos, Num_Row_Pos); + + // primer numero + Numerico_Read(); // leer boton + if (Boton_Calc <= 9) + { + lcd.print (Boton_Calc); // escribir valor calculado + lcd.setCursor (Num_Col_Pos, Num_Row_Pos); + Num_Val = Boton_Calc; // valor calculado + Num_Val_Temp_1 = Boton_Calc; // valor temporal para el acarreo + } + + if (Boton_Calc == 14) // enter + { + goto Salida; // num val = 0 + } + + if (value == 1) // si es un valor + { + if (Boton_Calc == 10) // 255 + { + Num_Val = 255; + goto Salida; + } + + if (Boton_Calc == 11) // 000 + { + Num_Val = 0; + goto Salida; + } + + if (Boton_Calc == 12) // ubicar + { + Num_Val = 612; + goto Salida_Option; + } + + if (Boton_Calc == 13) // analogo + { + Num_Val = 712; + goto Salida_Option; + } + } + // segundo numero + Numerico_Read(); // leer boton + if (Boton_Calc == 14) // enter + { + Num_Val = Num_Val_Temp_1; + goto Salida; // num val = num val anterior + } + + if (value == 1) // si es un valor + { + if (Boton_Calc == 10) // 255 + { + Num_Val = 255; + goto Salida; + } + + if (Boton_Calc == 11) // 000 + { + Num_Val = 0; + goto Salida; + } + + if (Boton_Calc == 12) // ubicar + { + Num_Val = 612; + goto Salida_Option; + } + + if (Boton_Calc == 13) // analogo + { + Num_Val = 712; + goto Salida_Option; + } + } + + if (Boton_Calc <= 9) + { + // recorrer numero ya impreso + Num_Col_Pos = Num_Col_Pos - 1; + lcd.setCursor (Num_Col_Pos, Num_Row_Pos); + lcd.print (Num_Val_Temp_1); + + // dibujar numero nuevo + lcd.print (Boton_Calc); + Num_Val_Temp_2 = Boton_Calc; + Num_Col_Pos = Num_Col_Pos + 1; + lcd.setCursor (Num_Col_Pos, Num_Row_Pos); + } + + // Tercer numero + Numerico_Read(); // leer boton + if (Boton_Calc == 14) // enter + { + Num_Val = (Num_Val_Temp_1 * 10) + Num_Val_Temp_2; + goto Salida; + } + + if (value == 1) // si es un valor + { + if (Boton_Calc == 10) // 255 + { + Num_Val = 255; + goto Salida; + } + + if (Boton_Calc == 11) // 000 + { + Num_Val = 0; + goto Salida; + } + + if (Boton_Calc == 12) // ubicar + { + Num_Val = 612; + goto Salida_Option; + } + + if (Boton_Calc == 13) // analogo + { + Num_Val = 712; + goto Salida_Option; + } + } + + if (Boton_Calc <= 9) + { + // recorrer numero ya impreso + Num_Col_Pos = Num_Col_Pos - 2; + lcd.setCursor (Num_Col_Pos, Num_Row_Pos); + lcd.print (Num_Val_Temp_1); + lcd.print (Num_Val_Temp_2); + + // dibujar numero nuevo + Num_Col_Pos = Num_Col_Pos + 2; + lcd.setCursor (Num_Col_Pos, Num_Row_Pos); + lcd.print (Boton_Calc); + Num_Val = Boton_Calc + (Num_Val_Temp_1 * 100) + (Num_Val_Temp_2 * 10); + } + + Salida: + + lcd.noBlink(); + + // pintar los ceros antes del numero + Numerico_Write (Num_Val, Num_Col_Pos - 2, Num_Row_Pos); + Num_Col_Pos = Num_Col_Pos - 4; + + // regresar el cursor a su ligar + lcd.setCursor (Num_Col_Pos, Num_Row_Pos); + + Salida_Option: + + lcd.noBlink(); + lcd.setCursor (Num_Col_Pos, Num_Row_Pos); + delay(300); // rebote de boton +} - // Cursor center "enter" - if (digitalRead(Boton_Center) == LOW) - { - Boton_Calc = 14; - delay(Boton_Delay_Teclado); - } - } +void Numerico_Read() +{ + long Num_Barrido_Time = 5; // tiempo entre barrido de keys + Boton_Calc = 17; // limpiar valor para lectura + + while (Boton_Calc == 17) // valor calculado # E * F, 17 sin valor calculado + { + // Barrido + // Linea 1 + digitalWrite(Boton_Array_1, LOW); // lectura linea 1 + + // Lectura 1A = 1 + if (digitalRead(Boton_Array_A) == LOW) + { + Boton_Calc = 1; + delay(Boton_Delay_Teclado); + } + + delay(Num_Barrido_Time); + + // Lectura 1B = 6 + if (digitalRead(Boton_Array_B) == LOW) + { + Boton_Calc = 4; + delay(Boton_Delay_Teclado); + } + + delay(Num_Barrido_Time); + + // Lectura 1C = 7 + if (digitalRead(Boton_Array_C) == LOW) + { + Boton_Calc = 7; + delay(Boton_Delay_Teclado); + } + + delay(Num_Barrido_Time); + + // Lectura 1D = * = 15 + if (digitalRead(Boton_Array_D) == LOW) + { + Boton_Calc = 15; + delay(Boton_Delay_Teclado); + } + + delay(Num_Barrido_Time); + digitalWrite(Boton_Array_1, HIGH); // lectura linea 1 + + // Linea 2 + digitalWrite(Boton_Array_2, LOW); // lectura linea 2 + + // Lectura 2A = 2 + if (digitalRead(Boton_Array_A) == LOW) + { + Boton_Calc = 2; + delay(Boton_Delay_Teclado); + } + + delay(Num_Barrido_Time); + + // Lectura 2B = 5 + if (digitalRead(Boton_Array_B) == LOW) + { + Boton_Calc = 5; + delay(Boton_Delay_Teclado); + } + + delay(Num_Barrido_Time); + + // Lectura 2C = 8 + if (digitalRead(Boton_Array_C) == LOW) + { + Boton_Calc = 8; + delay(Boton_Delay_Teclado); + } + + delay(Num_Barrido_Time); + + // Lectura 2D = 0 + if (digitalRead(Boton_Array_D) == LOW) + { + Boton_Calc = 0; + delay(Boton_Delay_Teclado); + } + + delay(Num_Barrido_Time); + digitalWrite(Boton_Array_2, HIGH); // lectura linea 2 + + // Linea 3 + digitalWrite(Boton_Array_3, LOW); // lectura linea 3 + + // Lectura 3A = 3 + if (digitalRead(Boton_Array_A) == LOW) + { + Boton_Calc = 3; + delay(Boton_Delay_Teclado); + } + + delay(Num_Barrido_Time); + + // Lectura 3B = 4 + if (digitalRead(Boton_Array_B) == LOW) + { + Boton_Calc = 6; + delay(Boton_Delay_Teclado); + } + + delay(Num_Barrido_Time); + + // Lectura 3C = 9 + if (digitalRead(Boton_Array_C) == LOW) + { + Boton_Calc = 9; + delay(Boton_Delay_Teclado); + } + + delay(Num_Barrido_Time); + + // Lectura 3D = 14 + if (digitalRead(Boton_Array_D) == LOW) + { + Boton_Calc = 14; + delay(Boton_Delay_Teclado); + } + + delay(Num_Barrido_Time); + digitalWrite(Boton_Array_3, HIGH); // lectura linea 3 + + // Linea 4 + digitalWrite(Boton_Array_4, LOW); // lectura linea 4 + + // Lectura 4A = 10 + if (digitalRead(Boton_Array_A) == LOW) + { + Boton_Calc = 10; + delay(Boton_Delay_Teclado); + } + + delay(Num_Barrido_Time); + + // Lectura 4B = 11 + if (digitalRead(Boton_Array_B) == LOW) + { + Boton_Calc = 11; + delay(Boton_Delay_Teclado); + } + + delay(Num_Barrido_Time); + + // Lectura 4C = 12 + if (digitalRead(Boton_Array_C) == LOW) + { + Boton_Calc = 12; + delay(Boton_Delay_Teclado); + } + + delay(Num_Barrido_Time); + + // Lectura 4D = 13 + if (digitalRead(Boton_Array_D) == LOW) + { + Boton_Calc = 13; + delay(Boton_Delay_Teclado); + } + + delay(Num_Barrido_Time); + digitalWrite(Boton_Array_4, HIGH); // lectura linea 4 + + // Cursor center "enter" + if (digitalRead(Enc_Center) == LOW) + { + Boton_Calc = 14; + delay(Boton_Delay_Teclado); + } + } } void Encoder_Read(byte col, byte row, long limit_min, long limit_max, byte control) @@ -3854,7 +3877,7 @@ void Encoder_Read(byte col, byte row, long limit_min, long limit_max, byte contr lcd.blink(); // lectura de teclado - while (digitalRead(Boton_Array_D) == HIGH && digitalRead(Boton_Center) == HIGH) // enter y center para paro + while (digitalRead(Boton_Array_D) == HIGH && digitalRead(Enc_Center) == HIGH) // enter y center para paro { // lectura de encoder read = myEnc.read() / 4; // / 4 porque la libreria muestra 4 numeros en cada paso diff --git a/LCD - EEPROM - Layout.xls b/LCD - EEPROM - Layout.xls new file mode 100644 index 0000000..b93ffa2 Binary files /dev/null and b/LCD - EEPROM - Layout.xls differ diff --git a/LCD - EEPROM - Layout.xlsx b/LCD - EEPROM - Layout.xlsx deleted file mode 100644 index 818f570..0000000 Binary files a/LCD - EEPROM - Layout.xlsx and /dev/null differ diff --git a/README.md b/README.md index 62f993a..fc442f8 100644 --- a/README.md +++ b/README.md @@ -2,7 +2,7 @@ ## **Firmware - LCD 20x4** -[![version](https://img.shields.io/badge/version-1.7_release-brightgreen.svg)](CHANGELOG.md) +[![version](https://img.shields.io/badge/version-1.8_release-brightgreen.svg)](CHANGELOG.md) [![license](https://img.shields.io/badge/licence-GNU_GPL_v3.0-blue)](https://github.com/Arduino-DMX-512-Tester-and-Controller/Arduino-DMX-512-Tester-and-Controller-LCD-20x4-Firmware/blob/master/LICENCE.md) ![GitHub issues](https://img.shields.io/github/issues/Arduino-DMX-512-Tester-and-Controller/Arduino-DMX-512-Tester-and-Controller-LCD-20x4-Firmware) @@ -90,18 +90,28 @@ Herramienta Open Hardware, para pruebas y control de iluminación de espectácul ### ![**Changelog**](CHANGELOG.md) -- **CORREGIDO,** se separa la lectura desde el encoder como función -- **CORREGIDO,** en analogy read "a" cambia por encoder read "e" -- **AGREGADO,** control desde encoder a value de dmx -- **AGREGADO,** control desde encoder a config contraste -- **AGREGADO,** control desde encoder a config backlight -- **AGREGADO,** control desde encoder a config bank init +- **CORREGIR,** cambiar delay por interrupciones de timer +- **CORREGIDO,** Pin Out para hardware v0.7 +- **CORREGIDO,** Pin encoder center al 6 +- **CORREGIDO,** Quitar la programación del potenciómetro +- **CORREGIDO,** Quitar la programación de los cursores +- **CORREGIDO,** pin 6 de encoder center a pull-up +- **CORREGIDO,** pin key light a 11 +- **CORREGIDO,** pin contraste a 12 +- **AGREGAR,** en multiplicador, el valor en tiempo real desde el potenciómetro o teclado +- **AGREGAR,** control chaser desde el potenciómetro, al girar recorre los canales +- **AGREGAR,** EEPROM Default en pin 9 como pull-up +- **AGREGAR,** dimmer para luz led como lámpara en pin 10 +- **AGREGADO,** a EEPROM, espacio para Ext Light +- **AGREGADO,** función para jumper de eeprom default +- **AGREGADO,** dimmer de pantalla al inicio +- **AGREGADO,** índices a posiciones de LCD en el Excel *** ### ![**Hardware**](https://github.com/Arduino-DMX-512-Tester-and-Controller/Arduino-DMX-512-Tester-and-Controller-LCD-20x4-Hardware) -- v0.5 a v0.6 +- v0.7 a v0.8 ***