completely reworked firmware, added support of inverted signals

This commit is contained in:
Portisch 2018-10-31 13:08:17 +01:00
parent b8e9236bb0
commit 1fa35727cc
11 changed files with 1085 additions and 1631 deletions

View File

@ -1,511 +1,462 @@
:020000040000FA
:10000000021560ED24F8FEEFD39E4015ED2408FDA7
:10001000E433FCC3EF9DEC6480F874809850028058
:1000200001C3220214D07597A5222202196E7EFF09
:10003000EFD394004022EF9480501DE4FDED75F065
:1000400005A42442F582E4341FF583E493B5070444
:10005000AE0580040DBD06E5AF0622021703121E91
:100060007653D87853DBFE121E3AE4900085F022D6
:10007000D2DE220219C1D202121BF0C290C296D265
:1000800080E4FBFD7F10121E211206CE74A4F0D274
:10009000AFE4F539F53AD296053AE53A70020539FA
:1000A000B410F3E539B427EEC296120026300209E7
:1000B000121B2A8E3C8F3D8006753C01753D00E584
:1000C0003D7004E53C640170409000CCE07007F5A1
:1000D00039F53A02028D053AE53A70020539D394B2
:1000E00010E53994274002D296D3E53A9430E539A9
:1000F0009475500302028DE4F539F53A9000CCF086
:100100009000CBF0C29602028DE4F539F53A9000EA
:10011000CCE014602A14700302025F147003020220
:100120001D1470030202332404600302028DE53DB6
:1001300064AA600302028D9000CC04F002028DE5F7
:100140003D9000CBF0A37402F0E53D120C3902059E
:10015000A00173A10185A501A9A601BDA701C6A89B
:1001600001E2A901C9B001D2B1019AC0028DFF001C
:100170000002141206879000A87401F0E490007544
:10018000F07FA1806E12005E9000CC7404F0753B8D
:1001900008E4F53F753E0902028D9000CC7404F02E
:1001A000E4F53F753E0202028DE49000A8F0900055
:1001B00075F07FA612071174A6F002028D1206CE0A
:1001C00074A4F002028D753B089000CC7403F00219
:1001D000028D9000757401F07FB1120711EFF002EB
:1001E000028D1206879000A8E0F538E4F0900075C3
:1001F000F07FA9121AED90007CEFF07D307C751233
:10020000070002028D1206EE90007CEFF0E49000F1
:10021000CCF08079E49000CBF0A3F08070E4F53F5F
:10022000E53DF53EE53ED394009000CC402C7404AF
:10023000F0805A7404253FF582E43400F583E53DEF
:10024000F0053FE53FB53E059000CC800DE53FC38E
:1002500094704039753E709000CC7402F0802EE5A9
:100260003D645570289000CCF0C2029000CBE02491
:1002700060601824FC600F24FE600B14600824F6F4
:100280006004241070077FA0121DEED2029000CBF4
:10029000E0120C3902B6A102E0A402F2A503DAA62C
:1002A00003F6A805C0A905FDB00670B103A6C003FA
:1002B000C8FF000000AA900084E030E70F7DC87CF2
:1002C000001206B77FA3121A640205DA121E32402A
:1002D000030200AA7DE87C031206B77FA20205F59F
:1002E000900084E020E7030200AA7FA4121A6402AF
:1002F00003EE9000CCE060030200AA900085E024A9
:10030000FC6070240460030200AA153B900008E022
:10031000FEA3E0FF7C007D64120C5FC006C00712E4
:1003200016A9D007D006120BA78F49900006E0FE51
:10033000A3E0FF8E4AF54B7C007D64120C5FC00683
:10034000C0071216A9D007D006120BA78F4C754D07
:1003500018900008E0FAA3E0FB900004E0FCA3E0A2
:10036000FDA3E0FEA3E0FF12188C9000747406F069
:100370000204B97F0112002E1216CF60030200AAF8
:10038000E53B601A7F0112002EEF12167F1216C392
:1003900050030205B81206E2121E640205B81206E6
:1003A000EE7FA00205F59000CCE060030200AA9069
:1003B0000004E0FCA3E0FD120700D296121E64C206
:1003C000967FA0121DEE800A7F01121DEEE49000C0
:1003D000CCF0D2021206F70200AA900084E020E7D7
:1003E000030200AA547FF541FD7FA61215EFE490A9
:1003F0000084F00200AA9000CCE060030200AA9002
:100400000085E024FC7003020569240460030200F7
:10041000AA900004E0FF2480600804700DE4F51D3C
:100420008003751D017540FF800F12002E8F40E57F
:1004300040F460051216CFF51D153B12005EE51D58
:1004400014607C0460030200AA900004E0647F70E2
:1004500024A31216F0A3E0FAA3E0FBA3E0F549A35E
:10046000E0F54AA3E0F54BA3E0F54CA3E012070842
:10047000740CF0803BE540F4603112167DF5828EFD
:10048000831216E0740593FA740693FB740993F5CE
:1004900049740793F54A740893F54B740A93F54C25
:1004A000740B931207087401F08005E49000CBF000
:1004B0009000CBE070030200AA121D260200AA9051
:1004C0000004E06480704E900074740CF090000B97
:1004D000E0FF7E00900009E0FCA3E0FD120A47C0A7
:1004E00006C00790000C1216FCC007C00690000D55
:1004F0001216FCAA06AB0790000E1216FC8E4D8F4A
:100500004E8A4B8B4CD049D04A9000051216F09081
:10051000000FE08048E540F4700302062F12167DBC
:100520009000747401F08542828E83740612169ACC
:10053000C006C007740712169AC007C006740812D6
:10054000169AAA06AB07740912169A8E4D8F4E8A18
:100550004B8B4CD049D04A1216E0740A93F54FD019
:1005600003D0021219060200AAE53B70101206F72A
:100570007FA0121DEED202E4F51D0200AAE51D14B3
:10058000601B0460030200AAE540F4600E12167DB1
:100590001216C340061206E2121E64801BE540F4E8
:1005A000601612167D1216C3400EEFFD7C007F010F
:1005B0007E00121C43121E64E4900085F00200AA23
:1005C000900084E0FF30E71C547FF5417DC87C003B
:1005D00012069AAD417FAB1215EFE4900084F0D281
:1005E000020200AA121E3240030200AA7DE87C0328
:1005F00012069A7FAA121DEED2020200AA900004EF
:10060000E025E0F5419000CCE060030200AA9000F4
:1006100085E0700512005E800B900085E064046048
:10062000030200AAE5416007E53EC394045008E4D4
:100630009000CBF00200AA74062541F9E43400755D
:100640004601F5478948C3E53E954124FEF54990AA
:100650000005E0F54A7B017A0079061217887FA031
:10066000121DEE90007CE0FF121AEDD2020200AAE9
:10067000900084E020E7030200AA7FB112180AE488
:10068000900084F00200AA7D327C007F017E00127F
:100690001C43D296121E64C296227F017E00121C59
:1006A00043D296121E64C2969000A8E538F09000DE
:1006B0007CE0FF121AED227F017E00121C43D296CD
:1006C000121E64C29690007CE0FF121AED22900088
:1006D000A87401F0E4900075F07FA4121AED900068
:1006E0007C22EFFD7C007F017E00121C43229000E3
:1006F0007CE0FF121AED2290007CE0FF121AED223E
:100700007F017E00121C4322F54D12188C9000745C
:1007100022121AED90007C22AFE9AEEA120DB78EDC
:10072000088F092093030209A285080A85090BC3D3
:10073000E509950DF511E508950CF510900075E0AB
:1007400014700302099C0460030209C3900085E051
:100750001460650460030209C3900084E060030232
:1007600009C39000A8E0FFAB11AA10AD0FAC0E12A8
:1007700011898F1AE51A648070030209C390007F03
:10078000120E7D900002E510F0A3E511120DC2E4F7
:10079000900074F0900077F090007EF0F51BF51C4F
:1007A000FE7F70FD7B017A007904120C8CE49000CE
:1007B0007DF090008504F022E51A120D9A8E23F543
:1007C00024E51A120E0C70030208D004600302091B
:1007D000C3900004120CD9FFD39400400B90007E0C
:1007E000E09F5004E004F022120E25AE10AF11ABD2
:1007F00007AA06E50F2BFFE50E3AFEE433FDE433CE
:10080000FCC004A905AA06AB07AE0EAF0F120E85F9
:10081000D000120BA78F22120D81FD120003401988
:1008200090000A120D84FDAF22120003400B120C3F
:10083000D6120E766003020954120D81FDAF22120A
:1008400000035009120CD6C3120E564013D3E50F05
:10085000951CE50E951B402B120CD6120E767023BC
:10086000900086120E7D120CE2C083C082120E1D13
:100870007401A806088002C333D8FC4FD082D0830D
:10088000F0801790007A120E7DC290D3951CE50E71
:10089000951B4006850E1B850F1C900088E0700D8F
:1008A000120CE4120D79FF121D83120DBE120CD62C
:1008B000120E7660030209C3121E2A5005E490004E
:1008C00083F0120D7670030209941209D70209947D
:1008D000120CD6FF7E00900004120AE4FDACF01268
:1008E0000A47120DF38E258F26120E25E4850F156B
:1008F000850E14F513F512851119851018F517F5E5
:1009000016900006120D071209C4500F900007122E
:100910000D011209F55004C2908043900008120D99
:10092000011209C4502EAA23A9247BFF90000912AA
:100930000D071209F5501D120CE2C083C082120E81
:100940001D7401A806088002C333D8FC4FD082D0A2
:1009500083F0800AE4900084F0C290A3F02290001B
:1009600088E0700D120CE4120D79FF121D83120D38
:10097000BEAA23A9247BFF90000A120A08120E7651
:100980007041121E2A5005E4900083F0120D76602B
:10099000031209D7C290E4900085F022AF11AE1087
:1009A000801E85080C85090DC3E509950BF50FE53B
:1009B00008950AF50E900075E0147007AF0FAE0EA3
:1009C000120EB722E5159FFFE5149EFE121DE2C32D
:1009D000EF9526EE952522121E3A7D207C037F019D
:1009E0007E00121C1A90007DE0900083F0A3E51AAF
:1009F000F04480F022E5199FFFE5189EFE121DE2EB
:100A0000C3EF9526EE952522BB010CE58229F582E0
:100A1000E5833AF583E0225006E92582F8E622BB19
:100A2000FE06E92582F8E222E58229F582E5833A8D
:100A3000F583E49322BB010689828A83F022500267
:100A4000F722BBFE01F322EF8DF0A4A8F0CF8CF0CB
:100A5000A428CE8DF0A42EFE22BC000BBE0029EFF0
:100A60008DF084FFADF022E4CCF875F008EF2FFF95
:100A7000EE33FEEC33FCEE9DEC984005FCEE9DFE63
:100A80000FD5F0E9E4CEFD22EDF8F5F0EE8420D2AA
:100A90001CFEADF075F008EF2FFFED33FD40079819
:100AA0005006D5F0F222C398FD0FD5F0EA22C2D548
:100AB000EC30E709B2D5E4C39DFDE49CFCEE30E7E1
:100AC00015B2D5E4C39FFFE49EFE120A59C3E49D0C
:100AD000FDE49CFC8003120A5930D507C3E49FFF54
:100AE000E49EFE22BB0110E58229F582E5833AF5FA
:100AF00083E0F5F0A3E0225009E92582F886F008AA
:100B0000E622BBFE0AE92582F8E2F5F008E222E5DA
:100B1000832AF583E993F5F0A3E99322E88FF0A403
:100B2000CC8BF0A42CFCE98EF0A42CFC8AF0EDA474
:100B30002CFCEA8EF0A4CDA8F08BF0A42DCC3825A7
:100B4000F0FDE98FF0A42CCD35F0FCEB8EF0A4FE87
:100B5000A9F0EB8FF0A4CFC5F02ECD39FEE43CFC1C
:100B6000EAA42DCE35F0FDE43CFC2275F008758238
:100B700000EF2FFFEE33FECD33CDCC33CCC5823327
:100B8000C5829BED9AEC99E58298400CF582EE9B2C
:100B9000FEED9AFDEC99FC0FD5F0D6E4CEFBE4CD4A
:100BA000FAE4CCF9A88222B800C1B90059BA002DE4
:100BB000EC8BF084CFCECDFCE5F0CBF97818EF2F9D
:100BC000FFEE33FEED33FDEC33FCEB33FB10D703CC
:100BD000994004EB99FB0FD8E5E4F9FA227818EF75
:100BE0002FFFEE33FEED33FDEC33FCC933C910D7D4
:100BF000059BE99A4007EC9BFCE99AF90FD8E0E4E1
:100C0000C9FAE4CCFB2275F010EF2FFFEE33FEEDB6
:100C100033FDCC33CCC833C810D7079BEC9AE89986
:100C2000400AED9BFDEC9AFCE899F80FD5F0DAE468
:100C3000CDFBE4CCFAE4C8F922D083D082F8E49367
:100C40007012740193700DA3A393F8740193F5824D
:100C50008883E4737402936860EFA3A3A380DFEC3E
:100C60008EF0A4CCC5F0CCCDF8EFA4CEC5F02DFD10
:100C7000E43CFCE8A42EC8C5F03DFDE43CFCEFA438
:100C8000FFE5F028FEE43DFDE43CFC22EF4E60125F
:100C9000EF60010EEDBB010B89828A83F0A3DFFCBC
:100CA000DEFA2289F05007F709DFFCA9F022BBFE2B
:100CB000FCF309DFFCA9F022FCE52F25E0248AF5EE
:100CC00082E43400F58322FF900074E02404F5826E
:100CD000E43400F5832290000BAA23A9247BFF02B1
:100CE0000A08D290900077E024FFFFE434FFFE7CF6
:100CF000007D08120AAE74042FF58274003EF5835D
:100D000022AA23A9247BFF120A08FD7C009000047C
:100D1000120AE4FFAEF0120A47C322120BA7AB0778
:100D2000AA06E4F9F87F407E427D0FFC120BA7E48F
:100D30007BFFFAF9F8120B1CA804A905AA06AB0759
:100D40007F207ED77D757C01120BA7EFF40422AEC5
:100D50002AAF2B7C007D1F120A598E2E8F2F7C000C
:100D60007D05120A59C3E52F9FFDE52E9EFCD3E5B4
:100D7000299DE5289C22900083E0FF90007DE06F94
:100D800022900009AA23A9247BFF020A0853DBFE54
:100D900053DAFE53F7DF53F7BF2275F005A424445E
:100DA000F582E4341FF583E4740193FA740293AE80
:100DB00002227D64120A597C007D0A020A479000D3
:100DC0007DEFF09000887408F022C3E5379FFDE5C1
:100DD000369ED3FCE5339DE5329C22E0FCA3E0FD8A
:100DE000EC547FFAEDD39400EA94002275F0FFA44E
:100DF000FFAEF07C007D64020A59AA2EA92F7BFF6A
:100E0000900002120AE4F53785F0362275F005A449
:100E10002443F582E4341FF583E4931422E0FF9029
:100E20000088E0FE22900088E014F0900077E00453
:100E3000F022E52F2FFFE52E3EFEC3E5299FE52892
:100E40009E22AB46AA47A948854B82758300020AB9
:100E500008900081E0D3FF900077E09F2290007817
:100E6000E527F0A3E528F022852F82852E83E493E1
:100E7000FA740193FB22FF900077E06F22E50EF0F9
:100E8000A3E50FF0227C007D64020C5F540F75F027
:100E900002A4F58285F083227B007A007929AF28AD
:100EA000AE2722D3E52B9494E52A941122EC4480BA
:100EB000AF05F0A3EFF0228E278F28900085E01475
:100EC000604A147003020F942402600302106DC282
:100ED00090900084E0600302106DAF28AE27121DD1
:100EE000B0400302106DE4F529E529120CBBE4F0D3
:100EF000A3F00529E529B40FF0E4900001F0F529ED
:100F0000120E5D9000857401F0D29022900078E07E
:100F1000FCA3E0FDAE047802CEC313CE13D8F92DA6
:100F2000FFEC3EFED3E5289FE5279E4009120E5DAB
:100F3000E4900001F022AF28AE27121A14501F903F
:100F40000001E094004017E4900074F09000887471
:100F500004F0E490007DF09000857402F022C3E577
:100F6000289464E5279400500302105E120E981234
:100F70001397500302106D900001E0120CBB120E8B
:100F800060900001E004F0E0D3940F500302106D74
:100F9000E4021068B290120E981212EF50599000AD
:100FA00088E0B40410E529C454F0120CC7EFF0E453
:100FB000900088F022900074E0FF120CCCE0FEE577
:100FC00029540FFDEE4DF074042F120CCE120D7942
:100FD000FF121D83EFF0900074E004F0900088741D
:100FE00004F0900074E0D39470500302106D121E50
:100FF0003AE49000018071AF28AE27121A145061B4
:10100000121E2A5005E4900083F0120D76604D12F6
:101010001E3A7DF47C017F017E00121C1A90007D37
:10102000E0900083F0900088E07019120CC8C08333
:10103000C082E0FF900001E0540FFEEF4ED082D05E
:1010400083F0800E900001E0C454F0440F120CC7EE
:10105000EFF012106E900084E04480F0C290E480C3
:1010600008121E3AE4900001F0900085F022E4F5A9
:101070002BF52A900074E0FFE52AC39F50397404D1
:10108000252A120CCEE0C4540FFF120CBB120DDB4C
:101090004007EF120CBB120EAD7404252A120CCEC1
:1010A000E0540FFF120CBB120DDB4007EF120CBB1C
:1010B000120EAD052A80BCE4F52A900001E0FFE5A0
:1010C0002AC39F4003021180E52A120CBBE030E7DF
:1010D00003021172AF2A900001E0FEEFC39E4003AD
:1010E00002116EEF25E0248CF582E43400F583E0F4
:1010F000FCA3E0FDEF120CBBECF0A3EDF0E4FE90DE
:101100000074E02401FDE433FCEEC39DEC6480F840
:10111000748098505574042E120CCEE0F9C4540F0C
:10112000FDEF2401FBE433FAEDB50316E4B502123A
:10113000E9540FFDEFC454F04DFD74042E120CCE93
:10114000EDF0EF2401FDE433FC74042E120CCEE02C
:10115000F9540FB50511E4B5040DE954F04FFD74D1
:10116000042E120CCEEDF00E80950F0210D6052B3A
:101170008009E52A120CBBE0547FF0052A0210BA60
:10118000900001E0C3952BF0228F278C288D298AAF
:101190002A8B2B752C80E5277071E4F52D7F0112C9
:1011A000002EEF652D701B120EA34054E52B9450BA
:1011B000E52A9446504A120D4F4045120E325040D7
:1011C0008073E52D120D9A8E2EF52FE52D120E0C43
:1011D000601804702B120E68C002C003120DFAD002
:1011E00003D00212123B50188013120E68C002C0C6
:1011F00003120DFAD003D00212123B5003852D2C9E
:10120000052DE52DC394064094802DAF2712002EA6
:101210008F2D7F0112002EEF652D701C120EA34042
:1012200017E52B9450E52A9446500D120D4F4008B7
:10123000120E325003852D2CAF2C22AD2BAC2AAFD1
:1012400029AE28121247228E308F318C328D33C254
:10125000007C007D64AF03AE02120DB48F828E83DA
:10126000AE36AF37120DB2D3E58294F4E583940124
:1012700040050C7DF48004AC83AD828C838D82D3D9
:10128000EF94F4EE940140067C017DF48004AC06FA
:10129000AD07AE04AF05EB120DE54038EB9582FDCE
:1012A000EA9583FCD3E5319DE5309C403FEB2582F8
:1012B000FDEA3583FCC3E5319DE5309C502E120DCF
:1012C000CA4029E5372FFDE5363EC3120DD3501C29
:1012D000D2008018120DCA4013E5372FFFE5363EC5
:1012E000FEC3E5339FE5329E5002D200A200228E5B
:1012F000308F318B328A338934C201E4F535900066
:1013000001E0FFE535C39F4003021394E531AE30A1
:101310007803CEC313CE13D8F9FDAC06E531AE3059
:101320007802CEC313CE13D8F92DF537EE3CF5363F
:10133000E535120CBBE0FEA3E0FFC39537EE953612
:1013400050028004AE36AF378E368F37E535120C3B
:10135000BBE0FEA3E0FFC39537FDEE9536FCC3ED81
:101360009531EC95305028E5372FFFE5363EFEC32A
:10137000E5319FE5309E5017E53445334532600B2B
:10138000AB32AA33A934E535120A35D201800505FE
:10139000350212FEA201228E2A8F2B8B2C8A2D89D8
:1013A0002EC2001212EF5005D20002143BE4F52FBA
:1013B000900001E0FFE52FC39F400302143B120C95
:1013C000B9E0FCA3E0FDAE047803CEC313CE13D87E
:1013D000F9FBAA06EDAE047802CEC313CE13D8F9FA
:1013E0002BFDEE3A120CB8E0C4F854F0C868FEA326
:1013F000E0C4540F482DFFEC3EFEC3E52B9FFDE5F6
:101400002A9E120CB8E0FAA3E0FBD39DEA9C40268A
:10141000E52B2FFFE52A3EFEC3EB9FEA9E5017E522
:101420002E452D452C600BAB2CAA2DA92EE52F1295
:101430000A35D2008005052F0213B0A20022420017
:10144000C700004200C300004200C900004200C5BE
:1014500000004100CC004100CB00011D0041008490
:1014600000410085004100A8004100750041007C5A
:101470000041007656410089AB41000000410082E6
:101480000042007F0000420002000042008600008F
:1014900042007A000041008100410088004100774D
:1014A0000041007E00410074004100830041007D46
:1014B00000410001004100C0004100C1004100BEE8
:1014C000004100BF004100C2004100BD00C1030057
:1014D000C0E0C0F0C083C082C0D075D000C000C0E2
:1014E00001C002C003C004C005C006C007E598548F
:1014F00003F558F45298E55830E017121E7F90001B
:10150000C0121B88EFF09000C0E004F0E0B41402B9
:10151000E4F0E55830E12E9000C2E0D39400401A88
:101520009000BFE02459F8E6FF121E7C9000BFE057
:1015300004F09000C2E014F08002D2039000BFE0FB
:10154000B42002E4F0D007D006D005D004D003D0F8
:1015500002D001D000D0D0D082D083D0F0D0E03201
:10156000121E85787FE4F6D8FD7581780215AA02EF
:101570000076E493A3F8E493A34003F68001F20815
:10158000DFF48029E493A3F85407240CC8C333C4C0
:10159000540F4420C8834004F456800146F6DFE42B
:1015A000800B010204081020408090143EE47E016C
:1015B0009360BCA3FF543F30E509541FFEE493A39E
:1015C00060010ECF54C025E060A840B8E493A3FAB0
:1015D000E493A3F8E493A3C8C582C8CAC583CAF03C
:1015E000A3C8C582C8CAC583CADFE9DEE780BE8F4B
:1015F000438D44E4FEFDF545121B7524B0F582E4ED
:10160000341FF583740193FA7402938A46F5477F79
:10161000AA121CE6AF43121B7224AFF582E4341FFA
:10162000F583E49314600E047019AA46A9477BFF62
:1016300090000B8009AA46A9477BFF90000A120A76
:1016400008F545EEC39545500774082EFE0D80F34E
:10165000ED04FF121B7224AEF582E4341FF583E41F
:1016600093FF121CE6E4FEEEC39D500974042E1293
:101670001B600E80F27F55121CE6021E79E5407554
:10168000F005A424D8F582E4341EF583740193FA9E
:10169000740293AE028E41F5422293FF7E007404E1
:1016A00093FC740593FD020A47900006E0FEA3E058
:1016B000FF900009E02FFF900008E03EAB07FAE43E
:1016C000F9F822F5828E83740C93FFD3940022EFF5
:1016D00075F005A424D7F582E4341EF583E4932243
:1016E000E493FE740193FF740293FC740393FD2250
:1016F000E0FEA3E0FFA3E0FCA3E0FD22E0FF7E000C
:10170000020A47C0E0C0F0C083C082C0D075D000DC
:10171000C000C001C002C003C004C005C006C007AD
:10172000E5D85487F521F452D8E5F730E508E5F718
:1017300030E603121B9353F7DFE52130E708E5D9C4
:1017400030E003121E86E52130E008E5DA30E003E0
:10175000121C93E52130E108E5DB30E003120718A5
:10176000E52130E208E5DC30E003121E87D007D027
:1017700006D005D004D003D002D001D000D0D0D004
:1017800082D083D0F0D0E0328B438A448945120D59
:101790008D53E2FDE4F54BE54BC39549504FAB4308
:1017A000AA44A945C003C002C001120E42C4120ED1
:1017B0008CD001D002D003120AE4F54D85F04CD252
:1017C000801217FCAB43AA44A945C003C002C00164
:1017D000120E42120E8CD001D002D003120AE4F590
:1017E0004D85F04CC2801217FC054B80AAB290AF19
:1017F0004A154AEF709E43E202C29022FDAC4C7F34
:101800000A7E00121BC4121E6422AE07E4F54312C6
:101810001CDF900001E004FF121CE6121885900006
:1018200001E0FFE543C39F5012121B7C121B65129F
:101830001B7CF583121B6C054380E3900078E0FF6E
:10184000121CE6900078121B6C121885E4F5439088
:101850000074E02401FFE433FEC3E5439FEE64809F
:10186000F8748098501774042543121B600543E5F3
:1018700043541F70DA121E79121E7280D27F5512E5
:101880001CE6021E79121E79121E72228E438F44AC
:101890008C458D46AE02AF03120E85C007AF49AB33
:1018A00007E4FAF9F8D007120D1B900000F0AE4AD9
:1018B000AF4B120E85C007AF4CAB07E4FAF9F8D076
:1018C00007120D1B900082F0E549120DEC90007696
:1018D000EFF0E54C120DEC900089EFF090007FE501
:1018E00043F0A3E544F0900002E545F0A3E546F09F
:1018F000900081E54DF043DA0153F7DF43F74053A1
:10190000DBFE75F9FF228A478B48755180120D8DD9
:1019100053E2FD90007FEEF0A3EFF0900002ECF0B8
:10192000A3EDF0121C6CE4F550E550C3954F503216
:10193000120CC8E05551600AAD4EAC4DAF4CAE4BE9
:101940008008AD4AAC49AF48AE47121D02E551C30D
:1019500013F5517009900074E004F0755180055042
:1019600080C743E202C2909000857404F022C0E078
:10197000C083C082C0D075D000C004C005C006C0FE
:101980000753C87F9000C7E0FEA3E0FF4E700353EB
:10199000C8FB9000C3121AE250099000C7E4F0A3FC
:1019A000F0800DC39000C8E09DF09000C7E09CF06F
:1019B000D007D006D005D004D0D0D082D083D0E0DC
:1019C00032C0E0C083C082C0D075D000C004C00562
:1019D000C006C00753917F9000C9E0FEA3E0FF4E10
:1019E00070035391FB9000C5121AE250099000C990
:1019F000E4F0A3F0800DC39000CAE09DF09000C910
:101A0000E09CF0D007D006D005D004D0D0D082D052
:101A100083D0E032AB07AA06900078E0FEA3E0FF97
:101A20007C00120DB2D3EF94F4EE940140050C7DCE
:101A3000F48004AC06AD07AE04AF05C3900079E0B6
:101A40009FFD900078E09EFCC3ED9BEC9A5013A3A1
:101A5000E02FFF900078E03EFEC3EB9FEA9E50022D
:101A60008001C322AE07E4FDF543121CDF900002A3
:101A7000E0FF121CE6900002121B6C90007AE0FF5F
:101A8000121CE690007A121B6C900086E0FF121C7C
:101A9000E6900086121B6C74042D121B600DBD03B2
:101AA000F67F55121CE6021E79AB07AA06E4F9F888
:101AB0007F407E427D0FFC120BA7A804A905AA0651
:101AC000AB077F207ED77D757C01120BA7C3E49FF7
:101AD000FFE49EFE22AB07AA06E4F9F87FE87E0346
:101AE000FD22E0FCA3E0FDC3EF9DEE9C228F43901E
:101AF000007CE0F5447F0B121E8243DB01120D9047
:101B00001200707D0A7C007F017E00121C43121EB1
:101B10006443E202E4900085F0900084F09000CBF2
:101B2000E543F090007CF0AF44229000C0E0FF90CD
:101B300000BEE0B507057E017F00229000BE121BAB
:101B400088E0FD7C009000BEE004F0E0B41402E404
:101B5000F09000BDE0FEEE4204E4F0AE04AF0522DA
:101B6000F582E43400F583E0FF021CE6A3E0FF0207
:101B70001CE6121CE6E54475F005A422E54325E0C9
:101B8000248AF582E4340022E024A9F582E43400BA
:101B9000F58322120E514003021D65120CC8120E6D
:101BA0001DEFA806088002C313D8FC30E00B90009C
:101BB00000E0FF121E82D29022900082E0FF121EEF
:101BC00082C290228E548F558C568D57121AA912AC
:101BD0001DCAE55724BF9000CAF0E55634FF9000B7
:101BE000C9F09000C5E554F0A3E555F043910422F7
:101BF00012002A121E41121E48121DF9121E6A12EC
:101C00001D9A121E17121E03121E0D121DD6121E31
:101C10004F121E56121E6E021E5D8E2A8F2B8C2CAA
:101C20008D2D121AD5121AB6121DBE9000C7E52CC2
:101C3000F0A3E52DF09000C3E52AF0A3E52BF043D7
:101C4000C804228E458F468C478D48121AD5121A29
:101C5000B6121DCA9000C9E547F0A3E548F0900010
:101C6000C5E545F0A3E546F043910422D290D28029
:101C700090007F121C86121E64C290C280900002E7
:101C8000121C86021E64E0FCA3E0FD7F0A7E0012A7
:101C90001BC422900088E07008900074E004120DCC
:101CA000C2120E2B900088E014F0120E5150030265
:101CB0001CB853E2FDC28022120CC8120E1DEFA800
:101CC00006088002C313D8FC30E00590007680033C
:101CD000900089E07D00FCE4FF121D4722AE077FE3
:101CE000AA121CE6AF06C2039000C1E0B42002E4D1
:101CF000F09000C1E02459F8A607E004F0A3E00446
:101D0000F0228C528D53D280AD07AC067F0A7E0044
:101D1000121BC4121E64C280AD53AC527F0A7E00F7
:101D2000121BC4021E64120DC3E014F090007774FD
:101D300001F09000857403F0121CB853E2FD121CF0
:101D40006C43E202020070AB07AF04EB14600C14AA
:101D5000600E2402700E8DFB8FFC228DE98FEA222B
:101D60008DEB8FEC22E4FDFCFF121D47120D90124B
:101D70001E7653D87853E2FDC280C29090008574DD
:101D800004F0227E1DE4FDEF30E70625E06EFF80C3
:101D900004EF25E0FF0DBD08EE22AF885388AF7534
:101DA0008CA0758DCBEF5440FEEF54104E4288222C
:101DB000C3EF94ACEE940D4003D38001C322AD0772
:101DC000AC06ECF5CBAF058FCA22AD07AC06ECF53F
:101DD00093AF058F9222C2DE75D90575F9FF75960E
:101DE0000122EE30E707C3E49FFFE49EFE22121CAF
:101DF000DD7F55121CE6021E7975E34075E1017521
:101E0000E20222E59154045391FB429122758E54D3
:101E100075892243885022E5C8540453C8FB42C840
:101E20002253984FEB4F4DF59822E5C8C320E201AD
:101E3000D322E591C320E201D32253C8FB53C87FCC
:101E40002275A41175D4CE2275A54175D57722537C
:101E5000F77F75DA4A2253F77F75DB302275E690FB
:101E600075A8B022E59120E2FB22E4F5A92243986F
:101E700010223003FD22C2DE22D299228F9922AF96
:101E800099228F8C2222222201903070000640017C
:101E9000904B19180012C005DC0002BC012C461E34
:101EA00028080BB8232800044C01904B1918002572
:101EB0001C0BB80003840140461E1800000072D8B5
:101EC0000702BC012C264040000BB81C52019001B7
:101ED0000303011846000100FF1E880200FF1E9543
:101EE0000300FF1EA20400FF1EAF0500FF1EBC067C
:101EF00001FF1EC90190307000064001904B191877
:101F00000012C005DC0002BC012C461E28080BB8DC
:101F1000232800044C01904B191800251C0BB80015
:101F200003840140461E1800000072D80702BC015D
:101F30002C264040000BB81C5201900103030118ED
:101F400046000100FF1EF40200FF1F010300FF1FF7
:101F50000E0400FF1F1B0500FF1F280601FF1F3591
:101F60000190307000064001904B19180012C00516
:101F7000DC0002BC012C461E28080BB823280004F4
:101F80004C01904B191800251C0BB800038401402C
:101F9000461E1800000072D80702BC012C264040E3
:101FA000000BB81C52019001030301184600010008
:101FB000FF1F600200FF1F6D0300FF1F7A0400FF78
:0C1FC0001F870500FF1F940601FF1FA1F2
:100000000214007E1DE4FDEF30E70625E06EFF8060
:1000100004EF25E0FF0DBD08EE2253984FEB4F4D46
:10002000F598220213707597A522220216DF8E5BC7
:100030008F5C8C5D8D5E12185D121ACAE55E24BF5E
:100040009000D6F0E55D34FF9000D5F09000D1E54A
:100050005BF0A3E55CF0439104222202148F121B93
:100060006653D87853DAFE121B31E4900080F022F8
:10007000D2DE22021732D202121A32C290C296C2C5
:1000800080E4FBFD7F1012001A12067174A4F0D2F6
:10009000AFE4F53EF53FD296053FE53F7002053EE1
:1000A000B410F3E53EB427EEC296120026300209E2
:1000B0001219598E418F428006754101754200E543
:1000C000427004E541640170409000D8E07007F58B
:1000D0003EF53F020293053FE53F7002053ED39493
:1000E00010E53E94274002D296D3E53F9430E53E9A
:1000F00094755003020293E4F53EF53F9000D8F06A
:100100009000D7F0C296020293E4F53EF53F9000CE
:10011000D8E014602A14700302026514700302020E
:100120002314700302023924046003020293E5429F
:1001300064AA60030202939000D804F0020293E5DF
:10014000429000D7F0A37402F0E542120B52020B6A
:10015000A00173A10183A501A7A601BDA701C6A89F
:1001600001E2A901C9B001D2B10198C00293FF0018
:1001700000021A12062AE49000A2F0900074F07FA8
:10018000A1807212005E9000D87404F0754008E4FB
:10019000F5447543090202939000D87404F0E4F525
:1001A000447543020202939000A27480F0E4900030
:1001B00074F07FA61206A174A6F0020293120671D3
:1001C00074A4F00202937540089000D87403F00202
:1001D00002939000747401F07FB11206A1EFF00257
:1001E000029312062A9000A2E0F53D7480F0E4909C
:1001F0000074F07FA912192290007AEFF07D307C14
:10020000757F017E001219B80202931206839000D6
:100210007AEFF0E49000D8F08079E49000D7F0A372
:10022000F08070E4F544E542F543E543D394009053
:1002300000D8402C7404F0805A74032544F582E4FD
:100240003400F583E542F00544E544B543059000EC
:10025000D8800DE544C3947040397543709000D840
:100260007402F0802EE542645570289000D8F0C2E8
:10027000029000D7E02460601824FC600F24FE6028
:100280000B14600824F66004241070077FA0121A73
:10029000EED2029000D7E0120B5202BCA102E6A4FB
:1002A00002F8A5039CA603B6A80563A905A0B0069D
:1002B00013B10369C0038AFF000000AA90007FE029
:1002C00030E70F7DC87C0012065A7FA3121818026F
:1002D000057D121B2940030200AA7DE87C0312065B
:1002E0005A7FA202059890007FE020E7030200AA4F
:1002F0007FA41218180203AE9000D8E06003020039
:10030000AA900080E024FC6043240460030200AA59
:10031000154012005E900005E0FAA3E0FBFFAE027C
:100320001218CF900007E0F8A3E0888385834DF58D
:100330004E85834FF550900005E0F551A3E0F5524E
:10034000E4F55375541875550602053AE5406011F9
:100350001218D8500302055412068C121B540205C1
:10036000541206837FA00205989000D8E060030233
:1003700000AA1218CF7F017E001219B8D296121B64
:1003800054C2967FA0121AEE800A7F01121AEEE480
:100390009000D8F0D2021206980200AA90007FE0E6
:1003A00020E7030200AA547FFD7FA6121785E49080
:1003B000007FF00200AA9000D8E060030200AA903B
:1003C0000080E024FC700302054024046003020066
:1003D000AA900003E0FF248070057545FF80028F1E
:1003E00045154012005E900003E064806003020443
:1003F00074A3E0FCA3E0FD900008E0FAA3E0FBFF9B
:10040000AE021209A3C006C007900006E0FCA3E0FC
:10041000FDAF03AE021209A3C006C00790000AE0B8
:10042000FF7E00900008E0FCA3E0FD1209A3C006D7
:10043000C00790000B1218C8C007C00690000C122D
:1004400018C8AA06AB0790000D1218C88E518F521B
:100450008A4F8B50D04DD04E90000EE0F553A3E064
:10046000F55475550DD003D002D005D004D007D077
:100470000602053AE545F470030205D21218C124BC
:1004800079F582E4341BF583E493FF7E001218C1F2
:10049000247CF582E4341BF583E493FA740193FD24
:1004A000AC021209A3C006C0071218C1247AF58253
:1004B000E4341BF583E4931218C9C006C007121870
:1004C000C1247EF582E4341B1218A1C006C00712B5
:1004D00018C1247FF582E4341B1218A1C007C0069E
:1004E0001218C12480F582E4341B1218A1AA06ABAD
:1004F000071218C12481F582E4341B1218A11218C6
:10050000C1247BF582E4341BF583E493FD1218C10A
:100510002482F582E4341BF583E493F5548D538EE5
:10052000518F528A4F8B50D04DD04E755501D0030C
:10053000D002D005D004D007D0061216100200AAAF
:10054000E5406018E545F4600B1218D84006120625
:100550008C121B54E4900080F00200AA1206987FCF
:10056000A0803590007FE030E71D7DC87C0012063A
:100570003D90007FE0547FFD7FAB121785E4900033
:100580007FF0D2020200AA121B2940030200AA7DBA
:10059000E87C0312063D7FAA121AEED2020200AADC
:1005A000900003E025E0F5469000D8E060030200EB
:1005B000AA900080E0700512005E800B900080E041
:1005C000640460030200AAE5466007E543C394049F
:1005D0005008E49000D7F00200AA74052546F9E41B
:1005E0003400754A01F54B894CC3E543954624FE1A
:1005F000F54D900004E0F54E7B017A007905121666
:10060000827FA0121AEE90007AE0FF121922D20225
:100610000200AA90007FE020E7030200AA7FB11247
:100620001514E490007FF00200AA7D327C007F0167
:100630007E001219B8D296121B54C296227F017EF8
:10064000001219B8D296121B54C2969000A2E53D32
:10065000F090007AE0FF121922227F017E00121929
:10066000B8D296121B54C29690007AE0FF1219225B
:1006700022E49000A2F0900074F07FA4121922905E
:10068000007A2290007AE0FF12192222EFFD7C000E
:100690007F017E001219B82290007AE0FF12192221
:1006A0002212192290007A228C228D238A248B25F3
:1006B000AE07900080E014607F046003020933906D
:1006C000007FE06003020933C3E5239414E522941C
:1006D00005500EC3E5259414E52494055003020942
:1006E000339000A2E0FFAD0685242C85252DAB2399
:1006F000AA221218E290007DEFF0648070030209D4
:1007000033900001E524F0A3E525F0900083740800
:10071000F0E4900075F090007CF0F508F509FE7F9C
:1007200070FD7B017A007903120B78E490007BF076
:10073000D29090008004F02290007DE0FD75F00DD5
:10074000A424EBF582E4341B120D89FC740193128E
:100750000E7990007DE075F00DA424E3F582E43479
:100760001BF583E493FFD39400400B90007CE09F43
:100770005004E004F02290007DE0F96053FD120E79
:10078000B8120D89120EED9000BF120E3724E7F556
:1007900082E4341B120E421209A39000C1120E37DC
:1007A00024E8F582E4341BF583E493FFE9120D8F0E
:1007B000120EED9000C3120E3724E9F582E4341BCB
:1007C000120E421209A39000C5EEF0A3EFF0803E96
:1007D000900078E0FEA3E0FF9000BFEEF0A3EFF002
:1007E000900081E0FCA3E0FD9000C1ECF0A3EDF0EF
:1007F000A3ECF0A3EDF0A3120E3724EBF582E43462
:100800001B120E42900078E0FCA3E0120E799000DB
:1008100083E014F0900075E004F0AE22AF23E4FC16
:10082000FD9000C7120B46AE24AF25E4FCFD9000FE
:10083000CB120B46120E899000BF120934500E9055
:1008400000CB120E8C9000C1120934400CC3120E62
:10085000C45020120DD0B5071A900078E522F0A3FD
:10086000E523F0C290D3120EC6406A852208852384
:10087000098062120E899000C312094C500E90003C
:10088000CB120E8C9000C512094C400CD3120EC432
:100890004033120DD06F702D900081E522F0A3E55A
:1008A00023F0D290120E08C083C082E0FF90008334
:1008B000E0FE7401A806088002C333D8FC4FD08242
:1008C000D083F08010E490007FF0C290A3F09000FD
:1008D0007D7480F022900083E07015120E08120ED5
:1008E0004DFF12000390007BEFF09000837408F03E
:1008F000120DD06F703D121B215005E490007EF068
:10090000120E4A6027121B317D207C037F017E007E
:1009100012198F90007BE090007EF090007DE090B7
:10092000007FF04480F090007D7480F0C290E490ED
:100930000080F022FFE0FCA3E0FDC3EF9DFFEE9CF2
:10094000FE121AE2C3EF9527EE952622FFE0FCA3E4
:10095000E0FDC3EF9DFFEE9CFE121AE2C3EF952768
:10096000EE952622BB010CE58229F582E5833AF556
:1009700083E0225006E92582F8E622BBFE06E9253F
:1009800082F8E222E58229F582E5833AF583E49351
:1009900022BB010689828A83F0225002F722BBFE25
:1009A00001F322EF8DF0A4A8F0CF8CF0A428CE8D17
:1009B000F0A42EFE22BC000BBE0029EF8DF084FFB8
:1009C000ADF022E4CCF875F008EF2FFFEE33FEEC2B
:1009D00033FCEE9DEC984005FCEE9DFE0FD5F0E952
:1009E000E4CEFD22EDF8F5F0EE8420D21CFEADF051
:1009F00075F008EF2FFFED33FD4007985006D5F056
:100A0000F222C398FD0FD5F0EA22C2D5EC30E709F7
:100A1000B2D5E4C39DFDE49CFCEE30E715B2D5E40D
:100A2000C39FFFE49EFE1209B5C3E49DFDE49CFC58
:100A300080031209B530D507C3E49FFFE49EFE2270
:100A4000BB0110E58229F582E5833AF583E0F5F0F4
:100A5000A3E0225009E92582F886F008E622BBFED1
:100A60000AE92582F8E2F5F008E222E5832AF58317
:100A7000E993F5F0A3E9932275F008758200EF2F52
:100A8000FFEE33FECD33CDCC33CCC58233C5829B54
:100A9000ED9AEC99E58298400CF582EE9BFEED9A7A
:100AA000FDEC99FC0FD5F0D6E4CEFBE4CDFAE4CC16
:100AB000F9A88222B800C1B90059BA002DEC8BF018
:100AC00084CFCECDFCE5F0CBF97818EF2FFFEE33D5
:100AD000FEED33FDEC33FCEB33FB10D70399400400
:100AE000EB99FB0FD8E5E4F9FA227818EF2FFFEE27
:100AF00033FEED33FDEC33FCC933C910D7059BE958
:100B00009A4007EC9BFCE99AF90FD8E0E4C9FAE4B3
:100B1000CCFB2275F010EF2FFFEE33FEED33FDCC52
:100B200033CCC833C810D7079BEC9AE899400AED3C
:100B30009BFDEC9AFCE899F80FD5F0DAE4CDFBE4E4
:100B4000CCFAE4C8F922ECF0A3EDF0A3EEF0A3EFA9
:100B5000F022D083D082F8E4937012740193700D68
:100B6000A3A393F8740193F5828883E473740293CA
:100B70006860EFA3A3A380DFEF4E6012EF60010E69
:100B8000EDBB010B89828A83F0A3DFFCDEFA2289A8
:100B9000F05007F709DFFCA9F022BBFEFCF309DFE8
:100BA000FCA9F0228E228F23900080E014604A146A
:100BB0007003020C8124026003020D5FC29090005A
:100BC0007FE06003020D5FAF23AE22121AB0400334
:100BD000020D5FE4F524E524120D63E4F0A3F005B3
:100BE00024E524B40FF0E4900000F0F524120E93F5
:100BF0009000807401F0D29022900076E0FCA3E097
:100C0000FDAE047802CEC313CE13D8F92DFFEC3E0F
:100C1000FED3E5239FE5229E4009120E93E4900047
:100C200000F022AF23AE221217D1501F900000E037
:100C300094004017E4900073F09000837404F0E493
:100C400090007BF09000807402F022C3E52394644E
:100C5000E52294005003020D50120EF71211845039
:100C600003020D5F900000E0120D63120E969000DB
:100C700000E004F0E0D3940F5003020D5FE4020D96
:100C80005AB290120EF71212CE5059900083E0B46F
:100C90000410E524C454F0120DA1EFF0E490008399
:100CA000F022900073E0FF120DA6E0FEE524540F41
:100CB000FDEE4DF074032F120DA8120E4DFF120021
:100CC00003EFF0900073E004F09000837404F09060
:100CD0000073E0D394705003020D5F121B31E49057
:100CE00000008076AF23AE221217D15066121B216E
:100CF0005005E490007EF0120E4A6052121B317DC6
:100D0000F47C017F017E0012198F90007BE090003F
:100D10007EF0900083E07019120DA2C083C082E0C3
:100D2000FF900000E0540FFEEF4ED082D083F080A1
:100D30000E900000E0C454F0440F120DA1EFF090AB
:100D40000073E0FF12105F90007FE04480F0C290DB
:100D5000E48008121B31E4900000F0900080F02243
:100D6000FCE52A25E02484F582E43400F58322AEF4
:100D700032AF337C007D641209B57C007D0A120914
:100D8000A3D3EF94F4EE940122F583E493FFED7E78
:100D90000075F00DA424E4F582E4341BF583E4939C
:100DA00022FF900073E02403F582E43400F58322EF
:100DB000E53075F00DA424E1F582E4341BF583E4FD
:100DC00093FF7E00AC37AD381209A3AC06AD072205
:100DD00090007DE075F00DA424EAF582E4341BF563
:100DE00083E493FF900075E022E53075F00DA424B4
:100DF000E2F582E4341B22EF75F00DA424EDF582B8
:100E0000E4341BF583E49322900075E024FFFFE4B3
:100E100034FFFE7C007D08120A0A74032FF58274E9
:100E2000003EF58322E53075F00DA424E1F582E45F
:100E3000341BF583E49322EEF0A3EFF0E975F00D97
:100E4000A422F583E493FF7E002290007EE0FF90D1
:100E5000007BE06F22E4F9C3ED9BF582EC9AF58309
:100E6000D3EF9582EE958322E0FCA3E0FDEC547F66
:100E7000FAD3ED9400EA940022FD1209A37C007DD0
:100E8000641209B58E268F27229000C7A3A3E0FE27
:100E9000A3E022900076E522F0A3E523F022AB3C0C
:100EA000AA3BAF35AE34121AA2EF22852C34852D21
:100EB00035AB2BAA2AAD292275F00DA424E6F582C4
:100EC000E4341B22E5239509E522950822ED2BFD4C
:100ED000EC3AFCC3EF9DEE9C22F537740193F53894
:100EE00022540F75F002A4F58285F08322FA740172
:100EF00093FDAC020209A37B007A007924AF23AEF4
:100F00002222E0FEA3E0FFC322EC4480AF05F0A361
:100F1000EFF0228F308A328B33E4F536120DF76D05
:100F20006003AF3622120E25FFD394005003020F48
:100F3000C1120DE9F583E493FED394005003020F30
:100F4000C1E530702DEFD39EE53075F00D400C12E9
:100F50000E2AFD7C00AE32AF33800E120DEEF5830B
:100F6000E493FD7C00AE34AF351209B58E378F386F
:100F70008008E530120D91120ED9120D6F40067ED9
:100F8000017FF480008E398F3AAE34AF35120D7385
:100F900040070C7E017FF480008E3B8F3C120DB029
:100FA000AB3AAA39AF33AE32121A94EF7003021083
:100FB0005C120DE9120DBD120E9E700302105C80D2
:100FC00066120DE9F583E493D394004029E53012CD
:100FD0000D91120ED9AE34AF35120D7340070C7E51
:100FE000017FF480008E3B8F3C120DE9120DBD1283
:100FF0000E9E60688031120E25D39400405EE5306D
:10100000120D91120ED9120D6F40070C7E017FF464
:1010100080008E398F3A120DB0AB3AAA39AF33AE99
:1010200032121AA2EF6035E530120EB8120E42AC41
:1010300037AD381209A3900078EEF0A3EFF0E53059
:1010400075F00DA424E8F582E4341B120E42120957
:10105000A3900081EEF0A3EFF0753601AF36228F3A
:1010600025E4F527F526E5252401FFE433FEC3E555
:10107000269FEE6480F874809850397403252612F8
:101080000DA8E0C4540FFF120D63120E684007EF65
:10109000120D63120F0974032526120DA8E0540FD8
:1010A000FF120D63120E684007EF120D63120F0955
:1010B000052680B2E4F526900000E0FFE526C39FF8
:1010C000400302117BE526120D63E030E7030211B5
:1010D0006DAF26900000E0FEEFC39E400302116951
:1010E000EF25E02486F582E43400F583E0FCA3E0FC
:1010F000FDEF120D63ECF0A3EDF0E4FEE525240115
:10110000FDE433FCEEC39DEC6480F8748098505588
:1011100074032E120DA8E0F9C4540FFDEF2401FB57
:10112000E433FAEDB50316E4B50212E9540FFDEF0E
:10113000C454F04DFD74032E120DA8EDF0EF240100
:10114000FDE433FC74032E120DA8E0F9540FB5052D
:1011500011E4B5040DE954F04FFD74032E120DA8EF
:10116000EDF00E80970F0210D305278009E52612B7
:101170000D63E0547FF005260210B7900000E0C335
:101180009527F0228E258F268B278A288929C20051
:101190001212CE5005D200021228E4F52A90000067
:1011A000E0FFE52AC39F4003021228120D61E0FC14
:1011B000A3E0FDAE047803CEC313CE13D8F9FBAA87
:1011C00006EDAE047802CEC313CE13D8F92BFDEE94
:1011D0003A120D60E0C4F854F0C868FEA3E0C454AD
:1011E0000F482DFFEC3EFEC3E5269FFDE5259E1230
:1011F0000D60E0FAA3E0FBD39DEA9C4026E5262F94
:10120000FFE5253EFEC3EB9FEA9E5017E5294528E2
:101210004527600BAB27AA28A929E52A120991D2F4
:10122000008005052A02119DA20022AFFBAEFC7CC6
:10123000007D0A1209A39000BDEEF0A3EFF090002C
:10124000BD120F029464EE940050030212CD30934D
:101250003B8E0A8F0BC3EF950DF511EE950CF51033
:10126000900074E014601F04706390007DE0FF64E0
:10127000806007120DF764016053AB11AA10AD0F27
:10128000AC0EE4FF803DAF11AE10803E9000BDE09B
:10129000FEA3E08E0CF50DC3950BF50FEE950AF548
:1012A0000E900074E014601E04702290007DE0FF38
:1012B00064806005120DF76014AB0FAA0EAD11AC7F
:1012C000107F010206A8AF0FAE0E120BA4228E2BC8
:1012D0008F2C8B2D8A2E892FC201E4F530900000CF
:1012E000E0FFE530C39F400302136DE52CAE2B7881
:1012F00003CEC313CE13D8F9FDAC06E52CAE2B7884
:1013000002CEC313CE13D8F92DF532EE3CF531E5FC
:1013100030120D63120F029532EE953150028004A7
:10132000AE31AF328E318F32E530120D63120F02C3
:101330009532FDEE9531FCC3ED952CEC952B5028A4
:10134000E5322FFFE5313EFEC3E52C9FE52B9E5095
:1013500017E52F452E452D600BAB2DAA2EA92FE5A5
:1013600030120991D201800505300212DDA201225E
:10137000C0E0C0F0C083C082C0D075D000C000C043
:1013800001C002C003C004C005C006C007E59854F0
:1013900003F55FF45298E55F30E017121B6F900081
:1013A000BA1219FFEFF09000BAE004F0E0B41402B2
:1013B000E4F0E55F30E12E9000BCE0D39400401AE9
:1013C0009000B9E02460F8E6FF121B6C9000B9E0D1
:1013D00004F09000BCE014F08002D2039000B9E069
:1013E000B42002E4F0D007D006D005D004D003D05A
:1013F00002D001D000D0D0D082D083D0F0D0E03263
:1014000012005A787FE4F6D8FD75817F02144A02F3
:101410000076E493A3F8E493A34003F68001F20876
:10142000DFF48029E493A3F85407240CC8C333C421
:10143000540F4420C8834004F456800146F6DFE48C
:10144000800B0102040810204080901596E47E0174
:101450009360BCA3FF543F30E509541FFEE493A3FF
:1014600060010ECF54C025E060A840B8E493A3FA11
:10147000E493A3F8E493A3C8C582C8CAC583CAF09D
:10148000A3C8C582C8CAC583CADFE9DEE780BEC07B
:10149000E0C0F0C083C082C0D075D000C000C001E1
:1014A000C002C003C004C005C006C007E5D8548709
:1014B000F521F452D8E5F730E508E5F730E60312F8
:1014C0001B7653F7DFE52130E708E5D930E003125A
:1014D0001B75E52130E008E5DA30E00312122BE558
:1014E0002130E108E5DB30E003121B77E52130E233
:1014F00008E5DC30E003121B78D007D006D005D019
:1015000004D003D002D001D000D0D0D082D083D07C
:10151000F0D0E032AE07E4F547121A5B900000E02D
:1015200004FF121A6212158F900000E0FFE547C316
:101530009F50121219F31219E61219F3F5831219BA
:10154000ED054780E3900076E0FF121A6290007686
:101550001219ED12158FE4F547900073E02401FF96
:10156000E433FEC3E5479FEE6480F874809850171B
:10157000740325471219E10547E547541F70DA1235
:101580001B69121B6280D27F55121A62021B6912FC
:101590001B69121B62224200D300004200CF0000F0
:1015A0004200D500004200D100004100D8004100B7
:1015B000D70041007F00410080004100A28041002F
:1015C000740041007D8041007A0042000100004229
:1015D0000081000042007800004100830041007556
:1015E0000041007C004100730041007E0041007B0F
:1015F00000410000004100BA004100BB004100B8BA
:10160000004100B9004100BC004100B700C1030027
:101610008A4B8B4C855557755880121A0AE553D35F
:1016200094004019E4F556E556C39553500FAD525A
:10163000AC51AF50AE4F121A0A055680EAE4F55687
:10164000E556C39554503274032557120DA8E05542
:1016500058600AAD52AC51AF50AE4F8008AD4EACA1
:101660004DAF4CAE4B121A0AE558C313F55870052E
:101670000557755880055680C7C290900080740445
:10168000F0228B478A488949E4F54FE54FC3954DD1
:101690005043AB47AA48A949C003C002C001AB4AA6
:1016A000AA4BA94C854F82758300120964FDC412B0
:1016B0000EE1D001D002D003120A40FFAEF0AB47DA
:1016C000AA48A949ED120EE1120A40FDACF0121A27
:1016D0000A054F80B6AF4E154EEF70ACC29022C0D7
:1016E000E0C083C082C0D075D000C004C005C00671
:1016F000C00753C87F9000D3E0FEA3E0FF4E700305
:1017000053C8FB9000CF12189650099000D3E4F014
:10171000A3F0800DC39000D4E09DF09000D3E09C36
:10172000F0D007D006D005D004D0D0D082D083D05E
:10173000E032C0E0C083C082C0D075D000C004C019
:1017400005C006C00753917F9000D5E0FEA3E0FFDF
:101750004E70035391FB9000D112189650099000DF
:10176000D5E4F0A3F0800DC39000D6E09DF090008A
:10177000D5E09CF0D007D006D005D004D0D0D082E0
:10178000D083D0E032AE05AD07E4FCFB7FAA121A8D
:1017900062AF05121A62EE75F00DA42452F582E4D0
:1017A000341CF583E493FFECC39F500774082CFCB2
:1017B0000B80F4EB04FF121A5DE4FCECC39B5009B0
:1017C00074032C1219E10C80F27F55121A62021B6D
:1017D00069AB07AA06900076E0FEA3E0FF120D7346
:1017E00040050C7DF48004AC06AD07AE04AF05C324
:1017F000900077E09FFD900076E09EFCC3ED9BECAF
:101800009A5013A3E02FFF900076E03EFEC3EB9FBB
:10181000EA9E50028001C322AE07E4FDF547121A8A
:101820005B900001E0FF121A629000011219ED9026
:101830000078E0FF121A629000781219ED90008192
:10184000E0FF121A629000811219ED74032D121933
:10185000E10DBD03F67F55121A62021B69AB07AAA0
:1018600006E4F9F87F407E427D0FFC120AB4A8041A
:10187000A905AA06AB077F207ED77D757C01120AD9
:10188000B4C3E49FFFE49EFE22AB07AA06E4F9F886
:101890007FE87E03FD22E0FCA3E0FDC3EF9DEE9C0C
:1018A00022F583E493FF7E00E54575F00DA4247CCA
:1018B000F582E4341BF583E493FC740193FD020983
:1018C000A3E54575F00DA422E0FF7E000209A39078
:1018D0000003E0FCA3E0FD22901B84E493FFD3947B
:1018E00000228F288D298A2A8B2B752E80E52824AB
:1018F00080701EE4F52F120EABAF2F120F13EF60A6
:1019000005852F2E8019052FE52FC3940840E78009
:101910000E120EABAF28120F13EF600385282EAF07
:101920002E228F4790007AE0F5487F0B121B7243FE
:10193000DA011200707D0A7C007F017E001219B866
:10194000121B54E4900080F090007FF09000D7E5E7
:1019500047F090007AF0AF48229000BAE0FF900084
:10196000B8E0B507057E017F00229000B81219FF8C
:10197000E0FD7C009000B8E004F0E0B41402E4F074
:101980009000B7E0FEEE4204E4F0AE04AF05228E14
:10199000288F298C2A8D2B12188912186A121ABEC8
:1019A0009000D3E52AF0A3E52BF09000CFE528F0D6
:1019B000A3E529F043C804228E498F4A8C4B8D4CF5
:1019C00012188912186A121ACA9000D5E54BF0A3B2
:1019D000E54CF09000D1E549F0A3E54AF0439104CD
:1019E00022F582E43400F583E0FF021A62A3E0FFEF
:1019F000021A62E54725E02484F582E4340022E0FF
:101A000024A3F582E43400F583228C598D5AD290B8
:101A1000D280AD07AC067F0A7E0012002E121B5446
:101A2000C290C280AD5AAC597F0A7E0012002E02CD
:101A30001B5412002A121B38121B3F121AF9121BD8
:101A40005A121A7E121B17121B03121B0D121AD6E2
:101A5000121B46121B5E021B4DAE077FAA121A62B2
:101A6000AF06C2039000BBE0B42002E4F09000BBDC
:101A7000E02460F8A607E004F0A3E004F022AF88B9
:101A80005388AF758CA0758DCBEF5440FEEF54108A
:101A90004E428822120E554006120ECD500109AF5B
:101AA0000122120E554006120ECD500109AF01223F
:101AB000C3EF9414EE94054003D38001C322AD0715
:101AC000AC06ECF5CBAF058FCA22AD07AC06ECF542
:101AD00093AF058F9222C2DE75D90575F9FF759611
:101AE0000122EE30E707C3E49FFFE49EFE22121AB4
:101AF000597F55121A62021B6975E34075E1017541
:101B0000E20122E59154045391FB429122758E54D7
:101B100075892243885022E5C8540453C8FB42C843
:101B200022E5C8C320E201D322E591C320E201D31C
:101B30002253C8FB53C87F2275A41175D4CF2275D8
:101B4000A54175D5772253F77F75DA302275E69077
:101B500075A8B022E59120E2FB22E4F5A922439882
:101B600010223003FD22C2DE22D299228F9922AFA9
:101B700099228F8C2222222222011F00015E010362
:101B80000301183C00000D0400017201020201284B
:101B90003C0800081700018601030301183C0000FF
:101BA0001F0A00012C01030301183C0000003B0741
:101BB00001F401020302403C000007120001900101
:101BC000030301183C000017010001C201020201D9
:101BD000183C000124010000D2010202010C3C006B
:101BE00001011F00015E01030301183C00000D0408
:101BF00000017201020201283C080008170001865A
:101C000001030301183C00001F0A00012C0103031B
:101C100001183C0000003B0701F401020302403CB4
:101C20000000071200019001030301183C00001797
:101C3000010001C201020201183C00012401000060
:101C4000D2010202010C3C0001011F00015E0103F0
:101C50000301183C00000D0400017201020201287A
:101C60003C0800081700018601030301183C00002E
:101C70001F0A00012C01030301183C0000003B0770
:101C800001F401020302403C000007120001900130
:101C9000030301183C000017010001C20102020108
:101CA000183C000124010000D2010202010C3C009A
:011CB0000132
:00000001FF

View File

@ -51,19 +51,12 @@ But for this the protocol have to be defined in the RF_Protocols.h file.
01 means:</br>
<img src="https://raw.github.com/Portisch/RF-Bridge-EFM8BB1/master/doc/01_Bit_1.png" width="400" ></br>
BIT_HIGH_TIME is 1081µs.</br>
BIT_HIGH_DUTY = 100% / (1081µs + 453µS) * 1081µs =~ 70%. </br>
10 means:</br>
<img src="https://raw.github.com/Portisch/RF-Bridge-EFM8BB1/master/doc/10_Bit_0.png" width="400" ></br>
BIT_LOW_TIME is 453µs.</br>
BIT_LOW_DUTY = 100% / (1081µs + 453µS) * 453µs =~ 30%.</br>
23 means:</br>
<img src="https://raw.github.com/Portisch/RF-Bridge-EFM8BB1/master/doc/23_Sync_Bit.png" width="400" ></br>
SYNC_HIGH is 2990µs.</br>
SYNC_LOW is 7230µs.</br>
SYNC_BIT_COUNT is default 0.</br>
The bitcount can be counted like this:</br>
@ -88,21 +81,21 @@ The xx is the firmware version (0x00-0xFF)
0xAA: uart sync init<br/>
0xA6: sniffing active<br/>
0x06: data len<br/>
0x02: protocol identifier<br/>
0x01: protocol index<br/>
0xD0-0x55: data<br/>
0x55: uart sync end
STOP:<br/>
Binary: 10101010 10100110 00000110 00000001 11010000 11111001 00110010 00010001 01010101 01010101<br/>
Hex: AA A6 06 02 D0 F9 32 11 55 55<br/>
Hex: AA A6 06 01 D0 F9 32 11 55 55<br/>
DOWN:<br/>
Binary: 10101010 10100110 00000110 00000001 11010000 11111001 00110010 00010001 00110011 01010101<br/>
Hex: AA A6 06 02 D0 F9 32 11 33 55<br/>
Hex: AA A6 06 01 D0 F9 32 11 33 55<br/>
## RF decode from Seamaid_PAR_56_RGB remote (24 bit of data):
Light ON:<br/>
Binary: 10101010 10100110 00000100 00000011 00110010 11111010 10001111 01010101<br/>
Hex: AA A6 04 03 32 FA 8F 55<br/>
Binary: 10101010 10100110 00000010 00000011 00110010 11111010 10001111 01010101<br/>
Hex: AA A6 04 02 32 FA 8F 55<br/>
## Transmiting by command 0xA5
This is the original implemented RF transmit command<br/>
@ -115,7 +108,7 @@ Hex: AA A5 24 E0 01 40 03 84 D0 03 58 55<br/>
0xD0-0x58: 24bit Data<br/>
The high time of the SYNC get calculated by the Tsyn (SYNC low time),<br/>
duty cycle of the high bit is 75% and 25% of the low bit.<br/>
the timing is defined by Tlow and Thigh.<br/>
## Sniffing by command 0xA6
With the command the standard PT226x sniffing gets disabled and the sniffing of the defined protocols in RF_Protocols.h is starting.<br/>
@ -128,70 +121,49 @@ Hex: AA A6 04 03 32 FA 80 55<br/>
0xAA: uart sync init<br/>
0xA6: sniffed RF data<br/>
0x04: data len<br/>
0x03: protocol identifier (Seamaid_PAR_56_RGB)<br/>
0x02: protocol index (Seamaid_PAR_56_RGB)<br/>
0x32-0x80: data<br/>
0x55: uart sync end
## Stop sniffing by command 0xA7
Stop the 0xA6 sniffing and restart the PT226x sniffing.
Stop the 0xA6 sniffing and restart the default PT226x sniffing.
## Transmiting by command 0xA8
There is a new command in the firmware to be able to send RF data.<br/>
Predefined protocols in the RF_Protocols.h file can be used directly by<br/>
using the protocol identifier.<br/>
using the protocol index.<br/>
Hex: AA A8 06 02 D0 F9 32 11 33 55<br/>
Hex: AA A8 06 01 D0 F9 32 11 33 55<br/>
0xAA: uart sync init<br/>
0xA8: transmit RF data<br/>
0x06: data len<br/>
0x02: protocol identifier (ROHRMOTOR24)<br/>
0x02: protocol index (ROHRMOTOR24)<br/>
0xD0-0x33: data<br/>
0x55: uart sync end
#### Universal transmit of a duty cycle based protocol by command 0xA8
When 0x7F get used as protocol identifier the timing can be user defined<br/>
and do not have to be defined in RF_Protocols.h.<br/>
This methode can be used to find correct parameter to define the timing<br/>
in RF_Protocols.h for future.
Hex: AA A8 0D 7F 12 C0 05 DC 02 BC 46 01 2C 1E 08 1E 55<br/>
0xAA: uart sync init<br/>
0xA8: transmit RF data<br/>
0x0D: data len<br/>
0x7F: protocol identifier 0x7F<br/>
0x12-0xC0: SYNC_HIGH<br/>
0x05-0xDC: SYNC_LOW<br/>
0x02-0xBC: BIT_HIGH_TIME<br/>
0x46: BIT_HIGH_DUTY<br/>
0x01-0x2C: BIT_LOW_TIME<br/>
0x1E: BIT_LOW_DUTY<br/>
0x08: BIT_COUNT + SYNC_BIT_COUNT in front of RF data<br/>
0x1E: RF data to send<br/>
0x55: uart sync end<br/>
#### Universal transmit of a time based protocol by command 0xA8
When 0x80 get used as protocol identifier the timing can be user defined<br/>
When 0x80 get used as protocol index the timing can be user defined<br/>
and do not have to be defined in RF_Protocols.h.<br/>
This methode can be used to find correct parameter to define the timing<br/>
This method can be used to find correct parameter to define the timing<br/>
in RF_Protocols.h for future.
<img src="https://raw.github.com/Portisch/RF-Bridge-EFM8BB1/master/doc/pulse_timing.png" width="800" ></br>
Hex: AA A8 0E 80 01 90 1B 58 00 C8 01 02 02 01 0C 1F B0 55<br/>
Hex: AA A8 0F 80 00 0A 00 14 00 C8 01 02 02 01 00 0C 1F B0 55<br/>
0xAA: uart sync init<br/>
0xA8: transmit RF data<br/>
0x0E: data len<br/>
0x80: protocol identifier 0x80<br/>
0x01-0x90: SYNC_HIGH<br/>
0x1B-0x58: SYNC_LOW<br/>
0x0F: data len<br/>
0x80: protocol index 0x80<br/>
0x00-0x0A: SYNC_HIGH FACTOR<br/>
0x00-0x14: SYNC_LOW FACTOR<br/>
0x00-0xC8: PULSE_TIME<br/>
0x01: BIT_0_HIGH FACTOR<br/>
0x02: BIT_0_LOW FACTOR<br/>
0x02: BIT_1_HIGH FACTOR<br/>
0x01: BIT_1_LOW FACTOR<br/>
0x00: SYNC_BIT_COUNT<br/>
0x0C: BIT_COUNT<br/>
0x1F-0xB0: RF data to send<br/>
0x55: uart sync end<br/>
@ -259,8 +231,4 @@ For support/help take a look [here](https://github.com/Portisch/RF-Bridge-EFM8BB
## Beep by command 0xC0
Hex: AA C0 xx xx 55<br/>
Do beep xxxx miliseconds (uint16_t). Like AA C0 03 E8 55 will beep for ~1000ms.
# Next Steps
Add ESPurna support:<br/>
A new protocol have to be implemented to support more RF signals -> have to be defined!
Do beep xxxx miliseconds (uint16_t). Like AA C0 03 E8 55 will beep for ~1000ms.

View File

@ -4,7 +4,7 @@
<property object="CLOCK_0" propertyId="ABPeripheral.included" value="true"/>
<property object="CLOCK_0" propertyId="clock.clockselect.clocksourcedivider" value="SYSCLK / 1"/>
<property object="CLOCK_0" propertyId="clock.clockselect.sysclk" value="24.500 MHz"/>
<property object="CROSSBAR0" propertyId="xbar0.pca0.cex" value="CEX0 and CEX1"/>
<property object="CROSSBAR0" propertyId="xbar0.pca0.cex" value="CEX0"/>
<property object="CROSSBAR0" propertyId="xbar0.uart0.data" value="Enabled"/>
<property object="DefaultMode" propertyId="mode.diagramLocation" value="100, 100"/>
<property object="INTERRUPT_0" propertyId="ABPeripheral.included" value="true"/>
@ -17,6 +17,7 @@
<property object="P0.0" propertyId="ports.settings.iomode" value="Digital Push-Pull Output"/>
<property object="P0.0" propertyId="ports.settings.label" value="T_DATA"/>
<property object="P0.0" propertyId="ports.settings.outputmode" value="Push-pull"/>
<property object="P0.0" propertyId="ports.settings.skip" value="Skipped"/>
<property object="P0.1" propertyId="ports.settings.skip" value="Skipped"/>
<property object="P0.2" propertyId="ports.settings.skip" value="Skipped"/>
<property object="P0.3" propertyId="ports.settings.skip" value="Skipped"/>
@ -40,14 +41,10 @@
<property object="PBCFG_0" propertyId="pbcfg.settings.enablecrossbar" value="Enabled"/>
<property object="PCACH_0" propertyId="ABPeripheral.included" value="true"/>
<property object="PCACH_0" propertyId="pcach.pcachannel.cex0outputpolarity" value="Inverted"/>
<property object="PCACH_0" propertyId="pcach.pcachannel.matchfunction" value="Enabled"/>
<property object="PCACH_0" propertyId="pcach.pcachannelcapturecomparemode.enablechannelcomparatorfunction" value="Enabled"/>
<property object="PCACH_0" propertyId="pcach.pcachannelcapturecomparemode.enablechannelpulsewidthmodulationmoden" value="Enabled"/>
<property object="PCACH_0" propertyId="pcach.pcacontrol.channelcapturecomparemode" value="Predefined 8~11-bit pulse modulator"/>
<property object="PCACH_0" propertyId="pcach.pcachannelcapturecomparemode.enablechannelcapturenegativefunction" value="Enabled"/>
<property object="PCACH_0" propertyId="pcach.pcachannelcapturecomparemode.enablechannelcapturepositivefunction" value="Enabled"/>
<property object="PCACH_0" propertyId="pcach.pcacontrol.channelcapturecomparemode" value="Capture on transition of CEX"/>
<property object="PCACH_1" propertyId="ABPeripheral.included" value="true"/>
<property object="PCACH_1" propertyId="pcach.pcachannelcapturecomparemode.enablechannelcapturenegativefunction" value="Enabled"/>
<property object="PCACH_1" propertyId="pcach.pcachannelcapturecomparemode.enablechannelcapturepositivefunction" value="Enabled"/>
<property object="PCACH_1" propertyId="pcach.pcacontrol.channelcapturecomparemode" value="Capture on transition of CEX"/>
<property object="PCACH_2" propertyId="ABPeripheral.included" value="true"/>
<property object="PCA_0" propertyId="ABPeripheral.included" value="true"/>
<property object="PCA_0" propertyId="pca.pcacountertimerconfiguration.enablepcacountertimeroverflowinterrupt" value="Enabled"/>

View File

@ -18,7 +18,7 @@
#define TDATA_ON 1
#define TDATA_OFF 0
#define Sniffing true
#define Sniffing_On 1
#define SYSCLK 24500000

View File

@ -27,7 +27,6 @@ extern void TIMER16_3_enter_DefaultMode_from_RESET(void);
extern void TIMER_SETUP_0_enter_DefaultMode_from_RESET(void);
extern void PCA_0_enter_DefaultMode_from_RESET(void);
extern void PCACH_0_enter_DefaultMode_from_RESET(void);
extern void PCACH_1_enter_DefaultMode_from_RESET(void);
extern void UART_0_enter_DefaultMode_from_RESET(void);
extern void INTERRUPT_0_enter_DefaultMode_from_RESET(void);
// [Config(Per-Module Mode)Transition Prototypes]$

View File

@ -9,21 +9,15 @@
#define INC_RF_HANDLING_H_
extern uint8_t Compute_CRC8_Simple_OneByte(uint8_t byteVal);
extern uint8_t RFInSync(uint8_t identifier, uint16_t period_pos, uint16_t period_neg);
extern bool CheckDutyCycle(uint8_t current_duty_cycle, uint8_t desired_duty_cycle);
extern uint8_t RFInSync(uint8_t identifier, uint8_t inverse, uint16_t period_pos, uint16_t period_neg);
extern uint8_t PCA0_GetProtocolIndex(uint8_t identifier);
extern void PCA0_InitTransmit(uint16_t sync_high, uint16_t sync_low, uint16_t BIT_HIGH_TIME, uint8_t BIT_HIGH_DUTY,
uint16_t BIT_LOW_TIME, uint8_t BIT_LOW_DUTY, uint8_t bitcount);
extern void SetPCA0DutyCylce(void);
extern void SetTimer0Overflow(uint8_t T0_Overflow);
extern void PCA0_StartTransmit(void);
extern void PCA0_StopTransmit(void);
extern uint8_t PCA0_DoSniffing(uint8_t active_command);
extern void PCA0_StopSniffing(void);
extern void SendRFBuckets(uint16_t *buckets, uint8_t *rfdata, uint8_t n, uint8_t repeats);
extern void SendTimingProtocol(uint16_t sync_high, uint16_t sync_low,
uint16_t bit_0_high, uint16_t bit_0_low, uint16_t bit_1_high, uint16_t bit_1_low,
uint8_t bitcount);
uint8_t sync_bits, uint8_t bitcount, uint8_t position);
extern void Bucket_Received(uint16_t duration);
// 112 byte == 896 bits, so a RF signal with maximum of 896 bits is possible
@ -31,8 +25,6 @@ extern void Bucket_Received(uint16_t duration);
// E.g. 4 buckets have a total overhead of 11, allowing 101 bits (high/low pairs)
#define RF_DATA_BUFFERSIZE 112
#define SWB(val) ((((val) >> 8) & 0x00FF) | (((val) << 8) & 0xFF00))
typedef enum
{
RF_IDLE,
@ -44,8 +36,8 @@ typedef enum
typedef enum
{
// do sniffing by duty cycle
MODE_DUTY_CYCLE,
// do sniffing by timing
MODE_TIMING,
// do sniffing by bucket
// https://github.com/pimatic/RFControl
MODE_BUCKET
@ -54,7 +46,6 @@ typedef enum
#define RF_DATA_RECEIVED_MASK 0x80
extern SI_SEGMENT_VARIABLE(RF_DATA[RF_DATA_BUFFERSIZE], uint8_t, SI_SEG_XDATA);
// RF_DATA_STATUS
// Bit 7: 1 Data received, 0 nothing received
// Bit 6-0: Protocol identifier
@ -62,18 +53,13 @@ extern SI_SEGMENT_VARIABLE(RF_DATA_STATUS, uint8_t, SI_SEG_XDATA);
extern SI_SEGMENT_VARIABLE(rf_state, rf_state_t, SI_SEG_XDATA);
extern SI_SEGMENT_VARIABLE(desired_rf_protocol, uint8_t, SI_SEG_XDATA);
extern SI_SEGMENT_VARIABLE(rf_sniffing_mode, rf_sniffing_mode_t, SI_SEG_XDATA);
extern SI_SEGMENT_VARIABLE(protocol_index_in_sync, uint8_t, SI_SEG_XDATA);
extern SI_SEGMENT_VARIABLE(last_sniffing_command, uint8_t, SI_SEG_XDATA);
extern SI_SEGMENT_VARIABLE(DUTY_CYCLE_HIGH, uint8_t, SI_SEG_XDATA);
extern SI_SEGMENT_VARIABLE(DUTY_CYLCE_LOW, uint8_t, SI_SEG_XDATA);
extern SI_SEGMENT_VARIABLE(T0_HIGH, uint8_t, SI_SEG_XDATA);
extern SI_SEGMENT_VARIABLE(T0_LOW, uint8_t, SI_SEG_XDATA);
extern SI_SEGMENT_VARIABLE(SYNC_HIGH, uint16_t, SI_SEG_XDATA);
extern SI_SEGMENT_VARIABLE(SYNC_LOW, uint16_t, SI_SEG_XDATA);
extern SI_SEGMENT_VARIABLE(BIT_HIGH, uint16_t, SI_SEG_XDATA);
extern SI_SEGMENT_VARIABLE(BIT_LOW, uint16_t, SI_SEG_XDATA);
extern SI_SEGMENT_VARIABLE(BIT_COUNT, uint8_t, SI_SEG_XDATA);
extern SI_SEGMENT_VARIABLE(actual_bit_of_byte, uint8_t, SI_SEG_XDATA);
extern SI_SEGMENT_VARIABLE(actual_bit, uint8_t, SI_SEG_XDATA);

View File

@ -13,240 +13,226 @@
//-----------------------------------------------------------------------------
#include <stdint.h>
#define MIN_FOOTER_LENGTH 3500
/*
* bucket sniffing constants
*/
#define MIN_FOOTER_LENGTH 1300
#define MIN_PULSE_LENGTH 100
#define MAX_BUCKETS 8
/*
* sync constants
*/
#define SYNC_TOLERANCE 10
#define SYNC_TOLERANCE_MAX 500
/*
* number of repeating by default
*/
#define RF_TRANSMIT_REPEATS 8
/*
* undefined protocol index
*/
#define UNDEFINED_INDEX 0x80
/*
* Default Sonoff RF Bridge protocol
*/
#define PT2260_INDEX 0x00
/*
* sniffing type
*/
typedef enum
{
DUTY_CYCLE,
TIMING,
BUCKET
} protocol_type_t;
typedef const struct
{
// Protocol specific identifier
uint8_t IDENTIFIER;
// Protocol type
protocol_type_t protocol_type;
// Protocol data
uint8_t *protocol_data;
} RF_PROTOCOLS;
// typedef for duty cycle protocols
/*
* high low factor
*/
typedef struct
{
// normal high signal time on sync pulse
uint16_t SYNC_HIGH;
// normal low signal time on sync pulse
uint16_t SYNC_LOW;
// bit count of SYNC bits
uint8_t SYNC_BIT_COUNT;
// high time of a logic bit 1
uint16_t BIT_HIGH_TIME;
// high time of a logic bit 0
uint16_t BIT_LOW_TIME;
// duty cycle for logic bit 1
uint8_t BIT_HIGH_DUTY;
// duty cycle for logic bit 0
uint8_t BIT_LOW_DUTY;
// bit count for this protocol
uint8_t BIT_COUNT;
// delay in milliseconds between the repeats
uint8_t REPEAT_DELAY;
} DUTY_CYLCE_PROTOCOL_DATA;
typedef struct
{
uint8_t high;
uint8_t low;
uint8_t HIGH;
uint8_t LOW;
} HIGH_LOW;
// typedef for timing protocols
typedef struct
/*
* typedef for timing protocols
*/
typedef struct TIMING_PROTOCOL_DATA
{
// normal high signal time on sync pulse
uint16_t SYNC_HIGH;
// normal low signal time on sync pulse
uint16_t SYNC_LOW;
// high and low factor for the sync pulse
HIGH_LOW SYNC;
// sync bit count
uint8_t SYNC_BIT_COUNT;
// pulse time
uint16_t PULSE_TIME;
// high time of a logic bit 0
HIGH_LOW bit0;
// time to determine a logic bit 1 or 0
HIGH_LOW bit1;
// high and low factor for bit 0
HIGH_LOW BIT0;
// high and low factor for bit 1
HIGH_LOW BIT1;
// bit count for this protocol
uint8_t BIT_COUNT;
// decode tolerance in %
// decode tolerance in % of the PULSE_TIME
uint8_t TOLERANCE;
// delay in microseconds between the repeats
uint8_t REPEAT_DELAY;
// protocol with inverse pulses
uint8_t INVERSE;
} TIMING_PROTOCOL_DATA;
#define SYNC_TOLERANCE 10
#define SYNC_TOLERANCE_MAX 500
#define DUTY_CYCLE_TOLERANCE 8
#define RF_TRANSMIT_REPEATS 8
#define UNKNOWN_IDENTIFIER 0x00
#define UNDEFINED_DUTY_CYCLE 0x7F
#define UNDEFINED_TIMING 0x80
/*
* PT2260, EV1527,... original RF bridge protocol
* http://www.princeton.com.tw/Portals/0/Product/PT2260_4.pdf
*/
#define PT2260_IDENTIFIER 0x01
#define PT226x_SYNC_MIN 4500
#define PT226x_SYNC_MAX 18000
SI_SEGMENT_VARIABLE(PT2260, static DUTY_CYLCE_PROTOCOL_DATA, SI_SEG_CODE) =
{
400, // SYNC_HIGH
12400, // SYNC_LOW
0, // SYNC_BIT_COUNT
1600, // BIT_HIGH_TIME
400, // BIT_LOW_TIME
75, // BIT_HIGH_DUTY
25, // BIT_LOW_DUTY
24, // BIT_COUNT
0 // REPEAT_DELAY
};
/*
* Rohrmotor24
* https://github.com/bjwelker/Raspi-Rollo/tree/master/Arduino/Rollo_Code_Receiver
*/
#define ROHRMOTOR24_IDENTIFIER 0x02
SI_SEGMENT_VARIABLE(ROHRMOTOR24, static DUTY_CYLCE_PROTOCOL_DATA, SI_SEG_CODE) =
{
4800, // SYNC_HIGH
1500, // SYNC_LOW
0, // SYNC_BIT_COUNT
700, // BIT_HIGH_TIME
300, // BIT_LOW_TIME
70, // BIT_HIGH_DUTY
30, // BIT_LOW_DUTY
40, // BIT_COUNT
8 // REPEAT_DELAY
};
/*
* UNDERWATER PAR56 LED LAMP, 502266
* http://www.seamaid-lighting.com/de/produit/lampe-par56/
*/
#define Seamaid_PAR_56_RGB_IDENTIFIER 0x03
SI_SEGMENT_VARIABLE(Seamaid_PAR_56_RGB, static DUTY_CYLCE_PROTOCOL_DATA, SI_SEG_CODE) =
{
3000, // SYNC_HIGH
9000, // SYNC_LOW
0, // SYNC_BIT_COUNT
1100, // BIT_HIGH_TIME
400, // BIT_LOW_TIME
75, // BIT_HIGH_DUTY
25, // BIT_LOW_DUTY
24, // BIT_COUNT
0 // REPEAT_DELAY
};
/*
* Wall plug Noru
*/
#define NORU_IDENTIFIER 0x04
SI_SEGMENT_VARIABLE(NORU, static DUTY_CYLCE_PROTOCOL_DATA, SI_SEG_CODE) =
{
9500, // SYNC_HIGH
3000, // SYNC_LOW
0, // SYNC_BIT_COUNT
900, // BIT_HIGH_TIME
320, // BIT_LOW_TIME
70, // BIT_HIGH_DUTY
30, // BIT_LOW_DUTY
24, // BIT_COUNT
0 // REPEAT_DELAY
};
/*
* WS-1200 Series Wireless Weather Station
*/
#define WS_1200_IDENTIFIER 0x05
SI_SEGMENT_VARIABLE(WS_1200, static DUTY_CYLCE_PROTOCOL_DATA, SI_SEG_CODE) =
{
0, // SYNC_HIGH
29400, // SYNC_LOW
7, // SYNC_BIT_COUNT
700, // BIT_HIGH_TIME
300, // BIT_LOW_TIME
38, // BIT_HIGH_DUTY
64, // BIT_LOW_DUTY
64, // BIT_COUNT
0 // REPEAT_DELAY
};
/*
* ALDI Remote controlled wall sockets, 4x
*/
#define ALDI_RCWS_IDENTIFIER 0x06
SI_SEGMENT_VARIABLE(ALDI_RCWS, static TIMING_PROTOCOL_DATA, SI_SEG_CODE) =
{
3000, // SYNC_HIGH
7250, // SYNC_LOW
400, // PULSE_TIME
{ 1, 3 }, // bit0 HIGH_LOW
{ 3, 1 }, // bit1 HIGH_LOW
24, // BIT_COUNT
70,
0 // REPEAT_DELAY
};
/*
* Protocol array
* use a value of "0" for SYNC.high, SYNC.low or PULSE_TIME to deactivate some checking while decoding
*/
#define PROTOCOLCOUNT 6
#define PROTOCOLCOUNT 8
#if PROTOCOLCOUNT > 0x7F
#error Too much protocols are defined, stop!
#endif
SI_SEGMENT_VARIABLE(PROTOCOL_DATA[PROTOCOLCOUNT], static const RF_PROTOCOLS, SI_SEG_CODE) =
SI_SEGMENT_VARIABLE(PROTOCOL_DATA[PROTOCOLCOUNT], static const struct TIMING_PROTOCOL_DATA, SI_SEG_CODE) =
{
/*
* PT2260, EV1527,... original RF bridge protocol
* http://www.princeton.com.tw/Portals/0/Product/PT2260_4.pdf
*/
{
PT2260_IDENTIFIER,
DUTY_CYCLE,
&PT2260
//0, // SYNC_HIGH
//0, // SYNC_LOW
{ 1, 31 }, // SYNC HIGH_LOW
0, // SYNC_BIT_COUNT
350, // PULSE_TIME
{ 1, 3 }, // BIT0 HIGH_LOW
{ 3, 1 }, // BIT1 HIGH_LOW
24, // BIT_COUNT
60, // TOLERANCE
0, // REPEAT_DELAY
false // INVERSE
},
/*
* Rohrmotor24
* https://github.com/bjwelker/Raspi-Rollo/tree/master/Arduino/Rollo_Code_Receiver
*/
{
ROHRMOTOR24_IDENTIFIER,
DUTY_CYCLE,
&ROHRMOTOR24
//4800, // SYNC_HIGH
//1500, // SYNC_LOW
{ 13, 4 }, // SYNC HIGH_LOW
0, // SYNC_BIT_COUNT
370, // PULSE_TIME
{ 1, 2 }, // BIT0 HIGH_LOW
{ 2, 1 }, // BIT1 HIGH_LOW
40, // BIT_COUNT
60, // TOLERANCE
8, // REPEAT_DELAY
false // INVERSE
},
/*
* UNDERWATER PAR56 LED LAMP, 502266
* http://www.seamaid-lighting.com/de/produit/lampe-par56/
*/
{
Seamaid_PAR_56_RGB_IDENTIFIER,
DUTY_CYCLE,
&Seamaid_PAR_56_RGB
//3000, // SYNC_HIGH
//9000, // SYNC_LOW
{ 8, 23 }, // SYNC HIGH_LOW
0, // SYNC_BIT_COUNT
390, // PULSE_TIME
{ 1, 3 }, // BIT0 HIGH_LOW
{ 3, 1 }, // BIT1 HIGH_LOW
24, // BIT_COUNT
60, // TOLERANCE
0, // REPEAT_DELAY
false // INVERSE
},
/*
* Wall plug Noru
*/
{
NORU_IDENTIFIER,
DUTY_CYCLE,
&NORU
//9500, // SYNC_HIGH
//3000, // SYNC_LOW
{ 31, 10 }, // SYNC HIGH_LOW
0, // SYNC_BIT_COUNT
300, // PULSE_TIME
{ 1, 3 }, // BIT0 HIGH_LOW
{ 3, 1 }, // BIT1 HIGH_LOW
24, // BIT_COUNT
60, // TOLERANCE
0, // REPEAT_DELAY
false // INVERSE
},
/*
* Alecto WS-1200 Series Wireless Weather Station
*/
{
WS_1200_IDENTIFIER,
DUTY_CYCLE,
&WS_1200
//0, // SYNC_HIGH
//29400 // SYNC_LOW
{ 0, 59 }, // SYNC HIGH_LOW
7, // SYNC_BIT_COUNT
500, // PULSE_TIME
{ 1, 2 },// BIT0 HIGH_LOW
{ 3, 2 },// BIT1 HIGH_LOW
64, // BIT_COUNT
60, // TOLERANCE
0, // REPEAT_DELAY
false // INVERSE
},
/*
* ALDI Remote controlled wall sockets, 4x
*/
{
ALDI_RCWS_IDENTIFIER,
TIMING,
&ALDI_RCWS
//3000, // SYNC_HIGH
//7250, // SYNC_LOW
{ 7, 18 }, // SYNC HIGH_LOW
0, // SYNC_BIT_COUNT
400, // PULSE_TIME
{ 1, 3 }, // BIT0 HIGH_LOW
{ 3, 1 }, // BIT1 HIGH_LOW
24, // BIT_COUNT
60, // TOLERANCE
0, // REPEAT_DELAY
false // INVERSE
},
/*
* HT6P20X chips
* http://www.holtek.com.tw/documents/10179/11842/6p20v170.pdf
*/
{
//10350, // SYNC_LOW
//450, // SYNC_HIGH
{ 23, 1 }, // SYNC HIGH_LOW
0, // SYNC_BIT_COUNT
450, // PULSE_TIME
{ 1, 2 }, // BIT0 HIGH_LOW
{ 2, 1 }, // BIT1 HIGH_LOW
24, // BIT_COUNT
60, // TOLERANCE
0, // REPEAT_DELAY
true // INVERSE
},
/*
* HT12A/HT12E chips
* http://www.holtek.com/documents/10179/116711/2_12ev120.pdf
*/
{
//7560, // SYNC_LOW
//210, // SYNC_HIGH
{ 36, 1 }, // SYNC HIGH_LOW
0, // SYNC_BIT_COUNT
210, // PULSE_TIME
{ 1, 2 }, // BIT0 HIGH_LOW
{ 2, 1 }, // BIT1 HIGH_LOW
12, // BIT_COUNT
60, // TOLERANCE
0, // REPEAT_DELAY
true // INVERSE
}
};

View File

@ -32,7 +32,6 @@ extern void enter_DefaultMode_from_RESET(void) {
TIMER_SETUP_0_enter_DefaultMode_from_RESET();
PCA_0_enter_DefaultMode_from_RESET();
PCACH_0_enter_DefaultMode_from_RESET();
PCACH_1_enter_DefaultMode_from_RESET();
UART_0_enter_DefaultMode_from_RESET();
INTERRUPT_0_enter_DefaultMode_from_RESET();
// [Config Calls]$
@ -77,7 +76,7 @@ extern void PORTS_0_enter_DefaultMode_from_RESET(void) {
// $[P0SKIP - Port 0 Skip]
/***********************************************************************
- P0.0 pin is not skipped by the crossbar
- P0.0 pin is skipped by the crossbar
- P0.1 pin is skipped by the crossbar
- P0.2 pin is skipped by the crossbar
- P0.3 pin is skipped by the crossbar
@ -86,7 +85,7 @@ extern void PORTS_0_enter_DefaultMode_from_RESET(void) {
- P0.6 pin is skipped by the crossbar
- P0.7 pin is skipped by the crossbar
***********************************************************************/
P0SKIP = P0SKIP_B0__NOT_SKIPPED | P0SKIP_B1__SKIPPED | P0SKIP_B2__SKIPPED
P0SKIP = P0SKIP_B0__SKIPPED | P0SKIP_B1__SKIPPED | P0SKIP_B2__SKIPPED
| P0SKIP_B3__SKIPPED | P0SKIP_B4__NOT_SKIPPED
| P0SKIP_B5__NOT_SKIPPED | P0SKIP_B6__SKIPPED | P0SKIP_B7__SKIPPED;
// [P0SKIP - Port 0 Skip]$
@ -181,13 +180,13 @@ extern void PBCFG_0_enter_DefaultMode_from_RESET(void) {
// $[XBR1 - Port I/O Crossbar 1]
/***********************************************************************
- CEX0, CEX1 routed to Port pins
- CEX0 routed to Port pin
- ECI unavailable at Port pin
- T0 unavailable at Port pin
- T1 unavailable at Port pin
- T2 unavailable at Port pin
***********************************************************************/
XBR1 = XBR1_PCA0ME__CEX0_CEX1 | XBR1_ECIE__DISABLED | XBR1_T0E__DISABLED
XBR1 = XBR1_PCA0ME__CEX0 | XBR1_ECIE__DISABLED | XBR1_T0E__DISABLED
| XBR1_T1E__DISABLED | XBR1_T2E__DISABLED;
// [XBR1 - Port I/O Crossbar 1]$
@ -391,49 +390,9 @@ extern void PCACH_0_enter_DefaultMode_from_RESET(void) {
// [PCA0 Settings Save]$
// $[PCA0CPM0 - PCA Channel 0 Capture/Compare Mode]
/***********************************************************************
- Disable negative edge capture
- Disable CCF0 interrupts
- Enable match function
- 8 to 11-bit PWM selected
- Disable positive edge capture
- Enable comparator function
- Enable PWM function
- Disable toggle function
***********************************************************************/
PCA0CPM0 = PCA0CPM0_CAPN__DISABLED | PCA0CPM0_ECCF__DISABLED
| PCA0CPM0_MAT__ENABLED | PCA0CPM0_PWM16__8_BIT
| PCA0CPM0_CAPP__DISABLED | PCA0CPM0_ECOM__ENABLED
| PCA0CPM0_PWM__ENABLED | PCA0CPM0_TOG__DISABLED;
// [PCA0CPM0 - PCA Channel 0 Capture/Compare Mode]$
// $[PCA0CPL0 - PCA Channel 0 Capture Module Low Byte]
// [PCA0CPL0 - PCA Channel 0 Capture Module Low Byte]$
// $[PCA0CPH0 - PCA Channel 0 Capture Module High Byte]
// [PCA0CPH0 - PCA Channel 0 Capture Module High Byte]$
// $[Auto-reload]
// [Auto-reload]$
// $[PCA0 Settings Restore]
// [PCA0 Settings Restore]$
}
//================================================================================
// PCACH_1_enter_DefaultMode_from_RESET
//================================================================================
extern void PCACH_1_enter_DefaultMode_from_RESET(void) {
// $[PCA0 Settings Save]
// Select Capture/Compare register)
PCA0PWM &= ~PCA0PWM_ARSEL__BMASK;
// [PCA0 Settings Save]$
// $[PCA0CPM1 - PCA Channel 1 Capture/Compare Mode]
/***********************************************************************
- Enable negative edge capture
- Disable CCF1 interrupts
- Disable CCF0 interrupts
- Disable match function
- 8 to 11-bit PWM selected
- Enable positive edge capture
@ -441,17 +400,17 @@ extern void PCACH_1_enter_DefaultMode_from_RESET(void) {
- Disable PWM function
- Disable toggle function
***********************************************************************/
PCA0CPM1 = PCA0CPM1_CAPN__ENABLED | PCA0CPM1_ECCF__DISABLED
| PCA0CPM1_MAT__DISABLED | PCA0CPM1_PWM16__8_BIT
| PCA0CPM1_CAPP__ENABLED | PCA0CPM1_ECOM__DISABLED
| PCA0CPM1_PWM__DISABLED | PCA0CPM1_TOG__DISABLED;
// [PCA0CPM1 - PCA Channel 1 Capture/Compare Mode]$
PCA0CPM0 = PCA0CPM0_CAPN__ENABLED | PCA0CPM0_ECCF__DISABLED
| PCA0CPM0_MAT__DISABLED | PCA0CPM0_PWM16__8_BIT
| PCA0CPM0_CAPP__ENABLED | PCA0CPM0_ECOM__DISABLED
| PCA0CPM0_PWM__DISABLED | PCA0CPM0_TOG__DISABLED;
// [PCA0CPM0 - PCA Channel 0 Capture/Compare Mode]$
// $[PCA0CPL1 - PCA Channel 1 Capture Module Low Byte]
// [PCA0CPL1 - PCA Channel 1 Capture Module Low Byte]$
// $[PCA0CPL0 - PCA Channel 0 Capture Module Low Byte]
// [PCA0CPL0 - PCA Channel 0 Capture Module Low Byte]$
// $[PCA0CPH1 - PCA Channel 1 Capture Module High Byte]
// [PCA0CPH1 - PCA Channel 1 Capture Module High Byte]$
// $[PCA0CPH0 - PCA Channel 0 Capture Module High Byte]
// [PCA0CPH0 - PCA Channel 0 Capture Module High Byte]$
// $[Auto-reload]
// [Auto-reload]$

View File

@ -54,22 +54,21 @@ int main (void)
LED = LED_OFF;
BUZZER = BUZZER_OFF;
T_DATA = 1;
T_DATA = 0;
// enable UART
UART0_init(UART0_RX_ENABLE, UART0_WIDTH_8, UART0_MULTIPROC_DISABLE);
// start sniffing if enabled by default
if (Sniffing)
{
// set desired RF protocol PT2260
desired_rf_protocol = PT2260_IDENTIFIER;
rf_sniffing_mode = MODE_DUTY_CYCLE;
PCA0_DoSniffing(RF_CODE_RFIN);
last_sniffing_command = RF_CODE_RFIN;
}
else
PCA0_StopSniffing();
#if Sniffing_On == 1
// set desired RF protocol PT2260
desired_rf_protocol = PT2260_INDEX;
rf_sniffing_mode = MODE_TIMING;
PCA0_DoSniffing(RF_CODE_RFIN);
last_sniffing_command = RF_CODE_RFIN;
#else
PCA0_StopSniffing();
#endif
// enable global interrupts
IE_EA = 1;
@ -145,8 +144,8 @@ int main (void)
BUZZER = BUZZER_OFF;
// set desired RF protocol PT2260
desired_rf_protocol = PT2260_IDENTIFIER;
rf_sniffing_mode = MODE_DUTY_CYCLE;
desired_rf_protocol = PT2260_INDEX;
rf_sniffing_mode = MODE_TIMING;
last_sniffing_command = PCA0_DoSniffing(RF_CODE_LEARN);
// start timeout timer
@ -167,16 +166,16 @@ int main (void)
case RF_ALTERNATIVE_FIRMWARE:
break;
case RF_CODE_SNIFFING_ON:
desired_rf_protocol = UNKNOWN_IDENTIFIER;
rf_sniffing_mode = MODE_DUTY_CYCLE;
desired_rf_protocol = UNDEFINED_INDEX;
rf_sniffing_mode = MODE_TIMING;
PCA0_DoSniffing(RF_CODE_SNIFFING_ON);
last_sniffing_command = RF_CODE_SNIFFING_ON;
break;
case RF_CODE_SNIFFING_OFF:
// set desired RF protocol PT2260
desired_rf_protocol = PT2260_IDENTIFIER;
desired_rf_protocol = PT2260_INDEX;
// re-enable default RF_CODE_RFIN sniffing
rf_sniffing_mode = MODE_DUTY_CYCLE;
rf_sniffing_mode = MODE_TIMING;
PCA0_DoSniffing(RF_CODE_RFIN);
last_sniffing_command = RF_CODE_RFIN;
break;
@ -198,8 +197,8 @@ int main (void)
// enable sniffing for all known protocols
last_desired_rf_protocol = desired_rf_protocol;
desired_rf_protocol = UNKNOWN_IDENTIFIER;
rf_sniffing_mode = MODE_DUTY_CYCLE;
desired_rf_protocol = UNDEFINED_INDEX;
rf_sniffing_mode = MODE_TIMING;
last_sniffing_command = PCA0_DoSniffing(RF_CODE_LEARN_NEW);
// start timeout timer
@ -339,60 +338,48 @@ int main (void)
// init and start RF transmit
case RF_IDLE:
tr_repeats--;
PCA0_StopSniffing();
// byte 0..1: Tsyn
// byte 2..3: Tlow
// byte 4..5: Thigh
// byte 6..7: 24bit Data
// set high time of sync to (Tsyn / 3968) * 128
// set duty cycle of high and low bit to 75 and 25 % - unknown
PCA0_InitTransmit(
SendTimingProtocol(
*(uint16_t *)&RF_DATA[2], // sync high
*(uint16_t *)&RF_DATA[0], // sync low time
*(uint16_t *)&RF_DATA[4], // bit 1 high time
(uint32_t)((100) * (uint32_t)*(uint16_t *)&RF_DATA[4])
/ (*(uint16_t *)&RF_DATA[4] + *(uint16_t *)&RF_DATA[2]), // calculate duty cycle for high bit
*(uint16_t *)&RF_DATA[2], // bit 0 high time
(uint32_t)((100) * (uint32_t)*(uint16_t *)&RF_DATA[2])
/ (*(uint16_t *)&RF_DATA[4] + *(uint16_t *)&RF_DATA[2]), // calculate duty cycle for low bit
24);
*(uint16_t *)&RF_DATA[2], // bit 0 high time
*(uint16_t *)&RF_DATA[4], // bit 0 low time
*(uint16_t *)&RF_DATA[4], // bit 1 high time
*(uint16_t *)&RF_DATA[2], // bit 1 low time
0, // sync bit count
24, // bit count
6); // actual position at the data array
actual_byte = 6;
// start RF transmit
PCA0_StartTransmit();
break;
// wait until data got transfered
case RF_FINISHED:
switch (PROTOCOL_DATA[PCA0_GetProtocolIndex(PT2260_IDENTIFIER)].protocol_type)
if (tr_repeats != 0)
{
case DUTY_CYCLE:
if (PROTOCOL_DATA[PT2260_INDEX].REPEAT_DELAY > 0)
{
if (tr_repeats != 0)
{
SI_VARIABLE_SEGMENT_POINTER(pVar, DUTY_CYLCE_PROTOCOL_DATA, SI_SEG_CODE) = (DUTY_CYLCE_PROTOCOL_DATA *)PROTOCOL_DATA[PCA0_GetProtocolIndex(PT2260_IDENTIFIER)].protocol_data;
if (pVar->REPEAT_DELAY > 0)
{
InitTimer3_ms(1, pVar->REPEAT_DELAY);
// wait until timer has finished
WaitTimer3Finished();
}
rf_state = RF_IDLE;
}
else
{
// restart sniffing if it was active
PCA0_DoSniffing(last_sniffing_command);
// send acknowledge
uart_put_command(RF_CODE_ACK);
// enable UART again
ReadUARTData = true;
}
break;
InitTimer3_ms(1, PROTOCOL_DATA[PT2260_INDEX].REPEAT_DELAY);
// wait until timer has finished
WaitTimer3Finished();
}
rf_state = RF_IDLE;
}
else
{
// restart sniffing if it was active
PCA0_DoSniffing(last_sniffing_command);
// send acknowledge
uart_put_command(RF_CODE_ACK);
// enable UART again
ReadUARTData = true;
}
break;
}
@ -434,8 +421,7 @@ int main (void)
// check if a RF signal got decoded
if ((RF_DATA_STATUS & RF_DATA_RECEIVED_MASK) != 0)
{
uint8_t used_protocol = RF_DATA_STATUS & 0x7F;
uart_put_RF_Data(RF_CODE_SNIFFING_ON, used_protocol);
uart_put_RF_Data(RF_CODE_SNIFFING_ON, RF_DATA_STATUS & 0x7F);
// clear RF status
RF_DATA_STATUS = 0;
@ -451,139 +437,87 @@ int main (void)
// do transmit of the data
switch(rf_state)
{
static protocol_type_t RF_CODE_RFOUT_NEW_PROTOCOL_TYPE = DUTY_CYCLE;
// init and start RF transmit
case RF_IDLE:
switch (RF_DATA[0])
{
case UNDEFINED_DUTY_CYCLE:
RF_CODE_RFOUT_NEW_PROTOCOL_TYPE = DUTY_CYCLE;
protocol_index = 0xFF;
break;
case UNDEFINED_TIMING:
RF_CODE_RFOUT_NEW_PROTOCOL_TYPE = TIMING;
case UNDEFINED_INDEX:
protocol_index = 0xFF;
break;
default:
protocol_index = PCA0_GetProtocolIndex(RF_DATA[0]);
if (protocol_index != 0xFF)
RF_CODE_RFOUT_NEW_PROTOCOL_TYPE = PROTOCOL_DATA[protocol_index].protocol_type;
protocol_index = RF_DATA[0];
break;
}
tr_repeats--;
PCA0_StopSniffing();
switch (RF_CODE_RFOUT_NEW_PROTOCOL_TYPE)
// check if unknown protocol should be used
// byte 0: Protocol index
// byte 1..2: SYNC_HIGH FACTOR
// byte 3..4: SYNC_LOW FACTOR
// byte 5..6: PULSE_TIME
// byte 7: BIT_0_HIGH FACTOR
// byte 8: BIT_0_LOW FACTOR
// byte 9: BIT_1_HIGH FACTOR
// byte 10: BIT_1_LOW FACTOR
// byte 11: SYNC_BIT_COUNT
// byte 12: BIT_COUNT
// byte 13..N: RF data to send
if (RF_DATA[0] == UNDEFINED_INDEX)
{
case DUTY_CYCLE:
SendTimingProtocol(
*(uint16_t *)&RF_DATA[5] * (*(uint16_t *)&RF_DATA[1]), // sync high
*(uint16_t *)&RF_DATA[5] * (*(uint16_t *)&RF_DATA[3]), // sync low time
*(uint16_t *)&RF_DATA[5] * RF_DATA[7], // bit 0 high time
*(uint16_t *)&RF_DATA[5] * RF_DATA[8], // bit 0 low time
*(uint16_t *)&RF_DATA[5] * RF_DATA[9], // bit 1 high time
*(uint16_t *)&RF_DATA[5] * RF_DATA[10], // bit 1 low time
RF_DATA[11], // sync bit count
RF_DATA[12], // bit count
13); // actual position at the data array
}
// byte 0: Protocol identifier 0x01..0x7E
// byte 1..N: data to be transmitted
else
{
if (protocol_index != 0xFF)
{
// check if unknown protocol should be used
// byte 0: Protocol identifier
// byte 1..2: SYNC_HIGH
// byte 3..4: SYNC_LOW
// byte 5..6: BIT_HIGH_TIME
// byte 7: BIT_HIGH_DUTY
// byte 8..9: BIT_LOW_TIME
// byte 10: BIT_LOW_DUTY
// byte 11: BIT_COUNT + SYNC_BIT_COUNT in front of RF data
// byte 12..N: RF data to send
if (RF_DATA[0] == UNDEFINED_DUTY_CYCLE)
{
PCA0_InitTransmit(*(uint16_t *)&RF_DATA[1], *(uint16_t *)&RF_DATA[3],
*(uint16_t *)&RF_DATA[5], RF_DATA[7], *(uint16_t *)&RF_DATA[8], RF_DATA[10], RF_DATA[11]);
actual_byte = 12;
}
// byte 0: Protocol identifier 0x01..0x7E
// byte 1..N: data to be transmitted
else
{
if (protocol_index != 0xFF)
{
SI_VARIABLE_SEGMENT_POINTER(pVar, DUTY_CYLCE_PROTOCOL_DATA, SI_SEG_CODE) = (DUTY_CYLCE_PROTOCOL_DATA *)PROTOCOL_DATA[protocol_index].protocol_data;
PCA0_InitTransmit(
pVar->SYNC_HIGH,
pVar->SYNC_LOW,
pVar->BIT_HIGH_TIME,
pVar->BIT_HIGH_DUTY,
pVar->BIT_LOW_TIME,
pVar->BIT_LOW_DUTY,
pVar->BIT_COUNT
);
actual_byte = 1;
}
else
{
uart_command = NONE;
}
}
// if valid RF protocol start RF transmit
if (uart_command != NONE)
PCA0_StartTransmit();
break;
SendTimingProtocol(
PROTOCOL_DATA[protocol_index].PULSE_TIME * PROTOCOL_DATA[protocol_index].SYNC.HIGH, // sync high
PROTOCOL_DATA[protocol_index].PULSE_TIME * PROTOCOL_DATA[protocol_index].SYNC.LOW, // sync low time
PROTOCOL_DATA[protocol_index].PULSE_TIME * PROTOCOL_DATA[protocol_index].BIT0.HIGH, // bit 0 high time
PROTOCOL_DATA[protocol_index].PULSE_TIME * PROTOCOL_DATA[protocol_index].BIT0.LOW, // bit 0 low time
PROTOCOL_DATA[protocol_index].PULSE_TIME * PROTOCOL_DATA[protocol_index].BIT1.HIGH, // bit 1 high time
PROTOCOL_DATA[protocol_index].PULSE_TIME * PROTOCOL_DATA[protocol_index].BIT1.LOW, // bit 1 low time
PROTOCOL_DATA[protocol_index].SYNC_BIT_COUNT, // sync bit count
PROTOCOL_DATA[protocol_index].BIT_COUNT, // bit count
1); // actual position at the data array
}
case TIMING:
else
{
// check if unknown protocol should be used
// byte 0: Protocol identifier
// byte 1..2: SYNC_HIGH
// byte 3..4: SYNC_LOW
// byte 5..6: PULSE_TIME
// byte 7: BIT_0_HIGH FACTOR
// byte 8: BIT_0_LOW FACTOR
// byte 9: BIT_1_HIGH FACTOR
// byte 10: BIT_1_LOW FACTOR
// byte 11: BIT_COUNT
// byte 12..N: RF data to send
if (RF_DATA[0] == UNDEFINED_TIMING)
{
actual_byte = 12;
SendTimingProtocol(*(uint16_t *)&RF_DATA[1], *(uint16_t *)&RF_DATA[3],
*(uint16_t *)&RF_DATA[5] * RF_DATA[7],
*(uint16_t *)&RF_DATA[5] * RF_DATA[8],
*(uint16_t *)&RF_DATA[5] * RF_DATA[9],
*(uint16_t *)&RF_DATA[5] * RF_DATA[10],
RF_DATA[11]);
}
// byte 0: Protocol identifier 0x01..0x7E
// byte 1..N: data to be transmitted
else
{
if (protocol_index != 0xFF)
{
SI_VARIABLE_SEGMENT_POINTER(pVar, TIMING_PROTOCOL_DATA, SI_SEG_CODE) = (TIMING_PROTOCOL_DATA *)PROTOCOL_DATA[protocol_index].protocol_data;
actual_byte = 1;
SendTimingProtocol(
pVar->SYNC_HIGH,
pVar->SYNC_LOW,
pVar->PULSE_TIME * pVar->bit0.high,
pVar->PULSE_TIME * pVar->bit0.low,
pVar->PULSE_TIME * pVar->bit1.high,
pVar->PULSE_TIME * pVar->bit1.low,
pVar->BIT_COUNT);
}
else
{
uart_command = NONE;
}
}
break;
uart_command = NONE;
}
}
break;
// wait until data got transfered
case RF_FINISHED:
if (tr_repeats == 0)
if (tr_repeats != 0)
{
if (protocol_index != 0xFF)
{
if (PROTOCOL_DATA[PT2260_INDEX].REPEAT_DELAY > 0)
{
InitTimer3_ms(1, PROTOCOL_DATA[PT2260_INDEX].REPEAT_DELAY);
// wait until timer has finished
WaitTimer3Finished();
}
}
rf_state = RF_IDLE;
}
else
{
// restart sniffing if it was active
PCA0_DoSniffing(last_sniffing_command);
@ -593,50 +527,6 @@ int main (void)
// enable UART again
ReadUARTData = true;
// reset type of protocol
RF_CODE_RFOUT_NEW_PROTOCOL_TYPE = DUTY_CYCLE;
}
else
{
switch (RF_CODE_RFOUT_NEW_PROTOCOL_TYPE)
{
case DUTY_CYCLE:
{
if (protocol_index != 0xFF)
{
SI_VARIABLE_SEGMENT_POINTER(pVar, DUTY_CYLCE_PROTOCOL_DATA, SI_SEG_CODE) = (DUTY_CYLCE_PROTOCOL_DATA *)PROTOCOL_DATA[protocol_index].protocol_data;
if (pVar->REPEAT_DELAY > 0)
{
InitTimer3_ms(1, pVar->REPEAT_DELAY);
// wait until timer has finished
WaitTimer3Finished();
}
}
rf_state = RF_IDLE;
break;
}
case TIMING:
{
if (protocol_index != 0xFF)
{
SI_VARIABLE_SEGMENT_POINTER(pVar, TIMING_PROTOCOL_DATA, SI_SEG_CODE) = (TIMING_PROTOCOL_DATA *)PROTOCOL_DATA[protocol_index].protocol_data;
if (pVar->REPEAT_DELAY > 0)
{
InitTimer3_ms(1, pVar->REPEAT_DELAY);
// wait until timer has finished
WaitTimer3Finished();
}
}
rf_state = RF_IDLE;
break;
}
}
}
break;
}
@ -647,8 +537,6 @@ int main (void)
// check if a RF signal got decoded
if ((RF_DATA_STATUS & RF_DATA_RECEIVED_MASK) != 0)
{
uint8_t used_protocol = RF_DATA_STATUS & 0x7F;
InitTimer3_ms(1, 200);
BUZZER = BUZZER_ON;
// wait until timer has finished
@ -658,7 +546,7 @@ int main (void)
desired_rf_protocol = last_desired_rf_protocol;
PCA0_DoSniffing(last_sniffing_command);
uart_put_RF_Data(RF_CODE_LEARN_OK_NEW, used_protocol);
uart_put_RF_Data(RF_CODE_LEARN_OK_NEW, RF_DATA_STATUS & 0x7F);
// clear RF status
RF_DATA_STATUS = 0;

File diff suppressed because it is too large Load Diff

View File

@ -155,30 +155,16 @@ void uart_put_uint16_t(uint8_t command, uint16_t value)
UART0_initTxPolling();
}
void uart_put_RF_Data(uint8_t Command, uint8_t used_protocol)
void uart_put_RF_Data(uint8_t Command, uint8_t protocol_index)
{
uint8_t i = 0;
uint8_t b = 0;
uint8_t bits = 0;
SI_VARIABLE_SEGMENT_POINTER(pVar, uint8_t, SI_SEG_CODE) = PROTOCOL_DATA[used_protocol].protocol_data;
uart_putc(RF_CODE_START);
uart_putc(Command);
switch (PROTOCOL_DATA[used_protocol].protocol_type)
{
case DUTY_CYCLE:
{
bits = ((DUTY_CYLCE_PROTOCOL_DATA *)pVar)->BIT_COUNT;
break;
}
case TIMING:
{
bits = ((TIMING_PROTOCOL_DATA *)pVar)->BIT_COUNT;
break;
}
}
bits = PROTOCOL_DATA[protocol_index].BIT_COUNT;
while(i < bits)
{
@ -188,8 +174,8 @@ void uart_put_RF_Data(uint8_t Command, uint8_t used_protocol)
uart_putc(b+1);
// set identifier for this protocol
uart_putc(PROTOCOL_DATA[used_protocol].IDENTIFIER);
// send index off this protocol
uart_putc(protocol_index);
// copy data to UART buffer
i = 0;