From 59915c9acb800b66bc94de825b828145ae04a1ed Mon Sep 17 00:00:00 2001 From: hathach Date: Thu, 15 Feb 2018 16:27:51 +0700 Subject: [PATCH] update bootloader --- ...ther52840_bootloader_6.0.0_s140_single.bin | Bin 22396 -> 21808 bytes ...ther52840_bootloader_6.0.0_s140_single.hex | 2471 ++++++++--------- ...ther52840_bootloader_6.0.0_s140_single.zip | Bin 166894 -> 166306 bytes .../drivers_nrf/uart/nrf_drv_uart.c | 1 - .../libraries/bootloader_dfu/bootloader.c | 6 +- .../bootloader_dfu/dfu_bank_internal.h | 2 +- .../bootloader_dfu/dfu_transport_ble.c | 4 +- .../components/libraries/hci/hci_mem_pool.c | 209 +- .../components/libraries/hci/hci_mem_pool.h | 120 +- .../components/libraries/hci/hci_slip.c | 69 +- .../components/libraries/hci/hci_slip.h | 78 +- .../components/libraries/hci/hci_transport.c | 525 ++-- .../components/libraries/hci/hci_transport.h | 168 +- .../libraries/scheduler/app_scheduler.c | 165 +- .../libraries/scheduler/app_scheduler.h | 84 +- .../components/libraries/timer/app_timer.c | 698 ++--- .../components/libraries/timer/app_timer.h | 239 +- .../libraries/timer/app_timer_appsh.c | 34 - .../libraries/timer/app_timer_appsh.h | 44 - src/feather52840.h | 2 +- src/main.c | 29 +- src/make_common.mk | 1 - src/sdk_config.h | 68 +- 23 files changed, 2577 insertions(+), 2440 deletions(-) delete mode 100644 nRF5_SDK_11.0.0_89a8197/components/libraries/timer/app_timer_appsh.c delete mode 100644 nRF5_SDK_11.0.0_89a8197/components/libraries/timer/app_timer_appsh.h diff --git a/bin/feather52840/6.0.0/single/feather52840_bootloader_6.0.0_s140_single.bin b/bin/feather52840/6.0.0/single/feather52840_bootloader_6.0.0_s140_single.bin index 3289f7fb3a59d4728f7a70e79a6d95f4cd9393c9..8af044c594dd336cb0748c41c649c099594b28c8 100755 GIT binary patch delta 6614 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 P9f-Qe*it)0AK-rgw35Fw delta 7343 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 NfZF_Qp&48b@IUdO9zFm7 diff --git a/bin/feather52840/6.0.0/single/feather52840_bootloader_6.0.0_s140_single.hex b/bin/feather52840/6.0.0/single/feather52840_bootloader_6.0.0_s140_single.hex index 97f4578..a1194cb 100644 --- a/bin/feather52840/6.0.0/single/feather52840_bootloader_6.0.0_s140_single.hex +++ b/bin/feather52840/6.0.0/single/feather52840_bootloader_6.0.0_s140_single.hex @@ -9116,22 +9116,22 @@ :104100007A0A002055500B0020337F0106A4E40CEE :084110000020290250100000FC :02000004000FEB -:1040000000800020A1920F00C9920F00CB920F00F8 -:10401000CD920F00CF920F00D1920F000000000050 -:10402000000000000000000000000000894F0F00A9 -:10403000D5920F0000000000D7920F00D9920F0018 -:10404000DB920F00DB920F00697B0F00DB920F0009 -:10405000DB920F00DB920F00DB920F00DB920F0070 -:10406000DB920F00DB920F00DB920F00DB920F0060 -:10407000DB920F00DB920F00DB920F00DB920F0050 -:10408000DB920F0031610F00DB920F00DB920F001B -:10409000F1610F00DB920F0059920F00DB920F00CD -:1040A000DB920F00DB920F00DB920F00DB920F0020 -:1040B000DB920F00DB920F00000000000000000008 -:1040C000DB920F00DB920F00DB920F00DB920F0000 -:1040D000DB920F00DB920F00DB920F00DB920F00F0 -:1040E000DB920F00DB920F00DB920F00000000005C -:1040F00000000000DB920F0000000000DB920F00C8 +:1040000000C0002055900F007D900F007F900F00A2 +:1040100081900F0083900F0085900F00000000003A +:104020000000000000000000000000006D4F0F00C5 +:1040300089900F00000000008B900F008D900F0002 +:104040008F900F008F900F001D790F008F900F0041 +:104050008F900F008F900F008F900F008F900F00A8 +:104060008F900F008F900F008F900F008F900F0098 +:104070008F900F008F900F008F900F008F900F0088 +:104080008F900F0069610F008F900F008F900F00CD +:1040900025620F008F900F000D900F008F900F0082 +:1040A0008F900F008F900F008F900F008F900F0058 +:1040B0008F900F008F900F000000000000000000A4 +:1040C0008F900F008F900F008F900F008F900F0038 +:1040D0008F900F008F900F008F900F008F900F0028 +:1040E0008F900F008F900F008F900F000000000046 +:1040F000000000008F900F00000000008F900F0064 :1041000000000000000000000000000000000000AF :10411000000000000000000000000000000000009F :10412000000000000000000000000000000000008F @@ -9150,53 +9150,53 @@ :1041F00000000000000000000000000000000000BF :1042000010B5054C237833B9044B13B10448AFF310 :1042100000800123237010BD8C40002000000000AE -:10422000E4960F0008B5034B1BB103490348AFF3F5 -:10423000008008BD0000000090400020E4960F00C0 +:1042200098940F0008B5034B1BB103490348AFF343 +:10423000008008BD000000009040002098940F000E :10424000154B002B08BF134B9D46A3F5803A002168 :104250008B460F461348144A121A00F063F80F4BAE :10426000002B00D098470E4B002B00D09847002021 :10427000002104000D000D48002802D00C48AFF3C7 -:10428000008000F02BF82000290000F041FD00F034 -:1042900011F800BF000008000080002000000000AE -:1042A000000000008C400020B05B002000000000F7 +:10428000008000F02BF82000290000F03DFD00F038 +:1042900011F800BF0000080000C00020000000006E +:1042A000000000008C400020785100200000000039 :1042B0000000000008B5074B044613B10021AFF31E :1042C0000080054B1868836A03B19847204600F0C8 -:1042D00031F800BF0000000038960F0070B50D4E99 +:1042D00031F800BF00000000EC930F0070B50D4EE8 :1042E0000D4CA41BA4100025A54209D10B4E0C4C6B -:1042F00005F096F9A41BA4100025A54205D170BDB8 +:1042F00005F070F8A41BA4100025A54205D170BDDF :1043000056F8253098470135EEE756F8253098479E :104310000135F2E7844000208440002084400020E2 :104320008840002002440346934200D1704703F8BE :10433000011BF9E7FEE700BF18DF70470129F8B558 :104340000D4614461F4607D0032912D014B3204649 -:10435000BDE8F84002F0F8BA0F4B1B78052BF5D1F9 +:10435000BDE8F84002F020BA0F4B1B78052BF5D1D1 :104360000E4B1B68002BF1D03A462146042098479B :10437000ECE7094E3378022BE8D1094B5B6898478C :10438000064B35701E68002EE0D03A46214628467E :10439000B047DBE7F8BD00BFB0400020A8400020D8 :1043A000D440002000B5084B89B001221A700523C3 -:1043B0008DF80C30079B009303AB0FCB00F08CFE05 +:1043B0008DF80C30079B009303AB0FCB00F07EFE13 :1043C00009B05DF804FB00BFB140002000B589B022 :1043D00003238DF80C300A4B1B88ADF80E30094BC7 :1043E0005A6804929A68DB680693079B00930592CB -:1043F00003AB0FCB00F070FE002009B05DF804FBAA +:1043F00003AB0FCB00F062FE002009B05DF804FBB8 :10440000E04000202C41002000B589B001238DF848 :104410000C300B4B1B88ADF80E3043F208031A68C2 :10442000084B596804919968DB68069305910092DE -:1044300003AB0FCB00F050FE002009B05DF804FB89 +:1044300003AB0FCB00F042FE002009B05DF804FB97 :10444000E04000202C41002000B589B003AB1422CD :1044500000211846FFF766FF04228DF80C20002289 -:1044600000920FC800F038FE09B05DF804FB0000B0 +:1044600000920FC800F02AFE09B05DF804FB0000BE :1044700030B589B003AC142200212046FFF752FF6B :10448000094B1B88ADF80E30084BDB6806930025FE -:10449000079B8DF80C50009394E80F0000F01CFE71 +:10449000079B8DF80C50009394E80F0000F00EFE7F :1044A000284609B030BD00BFE04000202C4100206C :1044B00008B5084B08481860084B02221A70084BD0 -:1044C000196804F01FFD18B1BDE8084002F03CBABD +:1044C000196804F0F9FB18B1BDE8084002F064B9BE :1044D00008BD00BF444100203C410020B040002006 :1044E000E440002010B50B4B1B788BB90A4802F052 -:1044F00009F908B102F028FA00224FF41601064823 -:1045000002F0C0F8044608B102F01EFA204610BDC1 +:1044F00081F808B102F050F900224FF41601064885 +:1045000002F034F8044608B102F046F9204610BD26 :104510000824FBE7B1400020B44000207FB50C46E2 :1045200003210546CDE900109608684602940396DB :10453000FFF702FFD8B1B4F5805F11D801236846B8 @@ -9205,13 +9205,13 @@ :104560001A46E11AE81AFFF7D9FF0028E6D004B08E :1045700070BD0000F0B585B004A8184B40F80C3DA4 :10458000174B184F184E00241C70184B3946CDE9B4 -:1045900002441C8004F092FC054618B13470284691 +:1045900002441C8004F06CFB054618B134702846B8 :1045A00005B0F0BD43F2080301461B68104A1148EC -:1045B0007B6002F055F808B102F0C6F900224FF412 -:1045C00016010D4802F05EF808B102F0BDF90B4B80 +:1045B0007B6001F0C9FF08B102F0EEF800224FF471 +:1045C00016010D4801F0D2FF08B102F0E5F80B4BDF :1045D00000221A6001233370E1E700BF3D430F0062 :1045E000284100203C410020B0400020E040002055 -:1045F000A5430F003C960F00B4400020AC400020C3 +:1045F000A5430F00F0930F00B4400020AC40002012 :10460000014B1860704700BFA840002070B5436898 :10461000204C0FCB84E80F002278510701D5930777 :1046200031D163689E072ED1A1688D072BD1E06838 @@ -9227,31 +9227,31 @@ :1046C00083689B0728D1164B1B78052B26D1154DE7 :1046D0004468154F2B683A68A4002344934204D9D8 :1046E0004FF0FF332B600C20F8BDFFF7FBFE0028D6 -:1046F000FAD10E482B68B1680068224604F0F2FB3C +:1046F000FAD10E482B68B1680068224604F0CCFA63 :104700000028F1D12B681C443B682C609C4218BFE8 :104710000920E9E70E20E7E71020E5E70820E3E7B6 :10472000B0400020AC400020E44000204441002084 :1047300070B50B4B1D6885B90A4E3378042B0CD12C -:10474000094C0A4B21781A78094800F09BFE10B9F1 +:10474000094C0A4B21781A78094800F08DFE10B9FF :104750000523337070BD2570FCE70820FAE700BF21 :10476000AC400020B0400020284100202C41002017 :10477000E8400020F8B5134B1A78032A074603D007 :10478000042A03D0082419E004221A700E4B1B6877 :10479000002BF7D1FFF7A6FE044678B90B4E7D68D3 :1047A0003378AD005A19402A0AD80948B9682A4610 -:1047B000184404F022FF33781D4435702046F8BDBC +:1047B000184404F0FCFD33781D4435702046F8BDE4 :1047C0000924FBE7B0400020AC4000202841002035 :1047D000E840002038B50D4C2378052B14D10C4B44 :1047E0000C4D1A682B689A420ED106232370FFF7EE -:1047F00079FE40B9084B29681B68586800F07CFEB8 +:1047F00079FE40B9084B29681B68586800F06EFEC6 :1048000008B90723237038BD0820FCE7B04000201A :10481000AC400020E44000204441002010B5084B8B -:104820001B78072B0AD1074801F06CFF08B102F092 -:104830008BF8054BBDE810409B681847082010BD59 +:104820001B78072B0AD1074801F0E4FE08B101F01C +:10483000B3FF054BBDE810409B681847082010BD2A :10484000B0400020B4400020D440002000B589B022 :1048500006238DF80C30079B009303AB0FCB00F0C1 -:104860003BFC09B05DF804FB10B58CB005A800F066 -:10487000CDFD089A002A3BD00B9C02F58053A34241 +:104860002DFC09B05DF804FB10B58CB005A800F074 +:10487000BFFD089A002A3BD00B9C02F58053A3424F :104880002AD91C49A4F5805301EA530343F20801D5 :1048900009688A4208D85800121A00F5805120444D :1048A000FFF73CFE0CB010BD03F580500121CDE9AF @@ -9260,13 +9260,13 @@ :1048D00033FD0028E6D1DEE70123CDE9013492085B :1048E0004FF4805301A803930492FFF725FDD9E705 :1048F0001046D7E700F0FFFF00B58DB005A800F027 -:1049000085FD099860B1089B6BB943F208031B68E9 +:1049000077FD099860B1089B6BB943F208031B68F7 :1049100080080022039001A8CDE90123FFF70CFDD8 :104920000DB05DF804FB0B9A1344F1E700B58DB0B0 -:1049300005A800F06BFD099878B1089B83B943F294 +:1049300005A800F05DFD099878B1089B83B943F2A2 :1049400008031B680393800803214FF4742204902A :1049500001A8CDE90112FFF7EFFC0DB05DF804FBF3 -:104960000B9A1344EEE730B58DB005A800F04EFD6C +:104960000B9A1344EEE730B58DB005A800F040FD7A :104970000898A0B10B9C00F58053A34211D943F2D3 :1049800008031B68984218D8A4F5805323F001054A :10499000421B5B0805F580516019FFF7BFFD0DB0A4 @@ -9274,11 +9274,11 @@ :1049B00001230394FFF7C0FCF1E70E20EFE73EDF91 :1049C000704713DF704718DF704760DF704769DF9B :1049D00070470000032902BF014B01221A70704783 -:1049E000A044002010B5374A86B0034610680090F6 +:1049E000D842002010B5374A86B0034610680090C0 :1049F0005BB10023CDE90333059302A802230293A0 -:104A0000FFF7E1FF08B101F09FFF4FF47420FFF7BB -:104A1000D8FF08B101F098FF2B4B2C494022684683 -:104A200004F0CEFB08B101F08FFF294B01930C225B +:104A0000FFF7E1FF08B101F0C7FE4FF47420FFF794 +:104A1000D8FF08B101F0C0FE2B4B2C49402268465C +:104A200004F0A8FA08B101F0B7FE294B01930C225B :104A3000002102A8FFF776FC01240023019A8DF8DB :104A40000A3002A94020ADF80840FFF7C0FF0C2251 :104A5000194602A8FFF766FC9DF80830019A234327 @@ -9287,17 +9287,17 @@ :104A800002A92320ADF80A30FFF7A1FFC0B9014603 :104A90000C2202A8FFF746FC0623019A8DF8084075 :104AA00002A920208DF80A40ADF80C30FFF78FFFE7 -:104AB00030B901A8FFF789FF10B9064804F0C2FB1E -:104AC00006B010BD40960F0091920F006044002088 -:104AD00000400020D94A0F0004F078B908B50A4A0E -:104AE0001421082001F05CFE08B101F02DFF074AF7 -:104AF0000748012101F0B4FD002240F6CD410548F0 -:104B0000BDE8084001F0BEBD48410020A54B0F00A4 -:104B100044960F00A44400201F2886BF00F01F0009 +:104AB00030B901A8FFF789FF10B9064804F09CFA45 +:104AC00006B010BDF4930F0045900F0098420020EF +:104AD00000400020D94A0F0004F052B808B50A4A35 +:104AE0001421082001F09CFD08B101F055FE074A91 +:104AF0000748012101F028FD002240F6CD4105487C +:104B0000BDE8084001F032BD48410020A54B0F0030 +:104B1000F8930F00DC4200201F2886BF00F01F0022 :104B2000044A4FF0A042012303FA00F0C2F808053E :104B3000704700BF0003005000F5E0724FF0A04343 :104B4000032143F82210FFF7E7BF0000014B18785C -:104B5000704700BFA14400201F288ABF064B4FF0BA +:104B5000704700BFD94200201F288ABF064B4FF084 :104B6000A04300F01F00D3F8103523FA00F0C04333 :104B700000F00100704700BF00030050034661B120 :104B80001F2886BF00F01F0305494FF0A0410122F6 @@ -9309,1213 +9309,1176 @@ :104BE0000E20FFF7CBFF104BD3F8002482B10F4A01 :104BF000C3F80026C3F80426C3F80826C3F80C2619 :104C0000C3F81026C3F81426C3F81826C3F81C26C8 -:104C100010BD00BFC4440020C8440020CA44002086 -:104C2000A1440020C9440020000001403546526ED6 -:104C3000014B1870704700BFC8440020014B01228F -:104C40001A707047C9440020014B00221A70704747 -:104C5000C944002073B5154C416015460023114628 -:104C600023702D0B04F04EF9642255434FF4004697 +:104C100010BD00BFFC4200200043002002430020E2 +:104C2000D942002001430020000001403546526E69 +:104C3000014B1870704700BF00430020014B012258 +:104C40001A70704701430020014B00221A70704710 +:104C50000143002070B5134C4160154600231146F6 +:104C600023702D0B04F028F8642255434FF40046BE :104C70004FF4FA700021E6FB05014FF47A7200232D -:104C800004F02CFB0546684601F068FD23785BB90B -:104C9000FFF795FE01F026FE01A801F05FFDDDE9BA -:104CA00000239B1AAB42F1D902B070BDA044002092 -:104CB0007FB5144E144D012333704FF0A0434FF4D1 -:104CC000804204A8C3F80C25104B40F80C3D00248A -:104CD0002946CDE9024404F0F1F828464FF4E042B9 -:104CE0004FF46D21FFF7B6FF43F208034FF48052F3 -:104CF00019682846FFF7AEFF0E203470FFF70CFF4F -:104D000004B070BDC844002060400020D5490F00A9 -:104D100070B54FF080437C4DD3F81C65D3F81C254B -:104D2000B12A40F0CC8001232B704FF08043002249 -:104D3000C3F81C250124754B754AC3F84025754BF3 -:104D40001B68B3F5742F02D0002001F0FDFD4FF079 -:104D500080531B69B3F5805F02D0002001F0F4FDA1 -:104D60004FF0A0436C4AC3F82C27C3F830276B4B95 -:104D70006B491A68642300BF00BF00BF00BF00BFBB -:104D800000BF00BF00BF8A422FD000BF00BF00BFDE +:104C800004F006FA054601F0C5FC0646237843B950 +:104C9000FFF795FE01F04EFD01F0BCFC801BA84221 +:104CA000F4D970BDD84200207FB5144E144D0123B5 +:104CB00033704FF0A0434FF4804204A8C3F80C2592 +:104CC000104B40F80C3D00242946CDE9024403F086 +:104CD000CFFF28464FF4E0424FF46D21FFF7BAFFB3 +:104CE00043F208034FF4805219682846FFF7B2FFD9 +:104CF0000E203470FFF710FF04B070BD0043002099 +:104D000060400020D5490F0070B54FF08043794DC9 +:104D1000D3F81C65D3F81C25B12A40F0C5800123C7 +:104D20002B704FF080430022C3F81C250124724BE6 +:104D3000724AC3F84025724B1B68B3F5742F02D03A +:104D4000002001F029FD4FF080531B69B3F5805F0F +:104D500002D0002001F020FD4FF0A043694AC3F8C3 +:104D60002C27C3F83027684B68491A68642300BFB2 +:104D700000BF00BF00BF00BF00BF00BF00BF8A422E +:104D80002FD000BF00BF00BF00BF00BF00BF00BFEB :104D900000BF00BF00BF00BF00BF00BF00BF00BF1B :104DA00000BF00BF00BF00BF00BF00BF00BF00BF0B :104DB00000BF00BF00BF00BF00BF00BF00BF00BFFB :104DC00000BF00BF00BF00BF00BF00BF00BF00BFEB :104DD00000BF00BF00BF00BF00BF00BF00BF00BFDB -:104DE00000BF00BF00BF00BF00BF013BC3D10D200B -:104DF000FFF7A2FE0E20FFF79FFE4A4B4A4A05210D -:104E0000002001F0D5FB08B101F09EFD00F0ECF9A7 -:104E100000F070FAB13E18BF012600285FD000F004 -:104E20007BFA08B101F090FD3046FFF7DBFDFFF79C -:104E300055FE00F0D5FA08B101F086FD1CB90B2033 -:104E4000FFF78AFE04462B78002B4ED10B20FFF78C -:104E500083FE10B10C20FFF77FFE00F001002870E8 -:104E6000002C44D00021287800F0D6F908B101F0D8 -:104E70006BFD0B20FFF770FE28B90C20FFF76CFECE -:104E800008B1FFF715FF43F20804284801F03AFC87 -:104E9000206800F003F928B100F02CFA10B920685E -:104EA00000F0F4F9BFF34F8F2149224BCA6802F496 -:104EB000E0621343CB60BFF34F8F00BFFDE7D3F831 -:104EC0001C25A82A0CBF012200222A703FF42DAF16 -:104ED000D3F81C354E2B3FF428AF00242BE7304687 -:104EE000FFF780FDFFF7FAFDA8E70120B5E743F2E1 -:104EF0000803186800F0D2F80028B3D04FF47A7194 -:104F0000204600F089F9B4E7A144002000A0004049 -:104F100001000006141000100C0003008040002067 -:104F20000024F40085670F0098420020A44400206C -:104F300000ED00E00400FA0538B50C46F8B9096840 -:104F4000D9B1104A914215460CD0531A3B2B12D9B5 -:104F50003C22284604F051FB04E0C85CD05413F115 -:104F6000FF33FAD200223C21064801F063FD002302 -:104F7000A887236038BD3D23F1E70E23F9E701231D -:104F8000F7E700BF807F00206FF00203064A9E45CE -:104F900002D1EFF3098101E0EFF308818869A0F104 -:104FA00002000078104700BF394F0F0038B50546A2 -:104FB000A8B10D4C00223C21204601F03BFDA38FFF -:104FC00083420ED1224604F13C0152F8040B45F80D -:104FD000040B8A42F9D10133A387002038BD0E208B -:104FE000FCE70B20FAE700BF807F00203EDF704720 -:104FF00011DF704713DF7047014B01221A707047B1 -:10500000EC440020064B1878012803D1012904BF85 -:105010000221197012B1104601F096BC704700BF12 -:10502000F844002038B5084D084CFFF7DFFF08B101 -:1050300001F08AFC01F056FC2B78023B022B02D9CE -:105040002378002BF1D038BDF8440020EC44002038 -:10505000044B1B7803F0FF011BB9034A084601F01B -:10506000C7BB7047ED440020F94F0F0008B51C2165 -:10507000084803F047FF08B101F066FC00231C223A -:105080000549044803F02EFF18B1BDE8084001F0BF -:105090005BBC08BDF0440020FC44002007B5036859 -:1050A000013303D1002003B05DF804FB01A800F038 -:1050B000C5F9019B1A78012AF4D1588830B1996852 -:1050C00043F208030022186801F0B4FC019B5B88DE -:1050D0001B1A58425841E6E784B02DE9F34108AC69 -:1050E00084E80F009DF82040BDF822800B9D01A8A8 -:1050F000DDE9097600F0A2F954B9394B0122FF210C -:10510000A3F802809D601A701971364B1A7012E074 -:10511000012C17D1324BBA192A449A60A5221A7071 -:10512000FF221A710C9AA3F80280C3E903765D612D -:105130009A612C4B1C70FFF799FF02B0BDE8F0415B -:1051400004B07047032C0FD1019A254B11781970C8 -:10515000518892689A60C3E90376AA2259801A712D -:105160005D61204B0122D1E7022C16D1019A1C4B24 -:105170001178A5290BD100225A809A60FF221A705B -:10518000FF221A710022C3E903225A61E9E719706C -:105190005188926859809A60F2E7052C0ED1FFF78A -:1051A000D5FC40B100F0E8FD08B101F0CDFB0D4B9E -:1051B00003221A70C1E700F07FFAF5E7042C09D149 -:1051C000074B00229A605A80FF221A70019A1279C6 -:1051D0001A71B0E7062CB0D1024B0422E9E700BFF8 -:1051E000FC440020F84400201FB50023CDE9023321 -:1051F000074B019303F03EFE30B906494FF47F237D -:1052000001A84B6003F05AFE05B05DF804FB00BF37 -:1052100005500F00F044002070B504460E46FFF71D -:10522000A9F9054640B94CB100F0DCFC0546FFF792 -:10523000F9FE0CB900F040FA284670BDCEB10E4B15 -:105240000E4A1C700E4B0F481C70214601F008FAE4 -:105250004FF400454FF4FA7000214FF47A720023A6 -:10526000E5FB060104F03AF822460146064801F043 -:1052700009FA00F0FDF9D9E7ED44002051500F0084 -:10528000EC44002048960F00CC44002038B5FFF7CE -:10529000AFFE08B101F058FB14490D68002301244A -:1052A00004FA03F22A4207D05A0903F01F00203201 -:1052B00004FA00F041F822000133272BF0D10C4B07 -:1052C0004FF48032C3F8482343F20804C3F808239C -:1052D00001225A609A602068FFF78CFE08B101F045 -:1052E00033FB2068BDE8384000F0AEB800E100E0D4 -:1052F0000010014007B501A800F0A0F8019B1A7842 -:10530000A52A07D01879A0F1AA035842584103B042 -:105310005DF804FB0120FAE710B5FFF724FB002835 -:1053200050D02C4B2C491A682C4B00BF00BF00BF3B -:1053300000BF00BF00BF00BF00BF8A422FD000BF28 +:104DE00000BF013BC3D10D20FFF7A6FE0E20FFF749 +:104DF000A3FE01F079FB00F0E9F900F06DFAB13E95 +:104E000018BF012600285FD000F078FA08B101F041 +:104E1000C3FC3046FFF7E6FDFFF760FE00F0D2FA74 +:104E200008B101F0B9FC1CB90B20FFF795FE044650 +:104E30002B78002B4ED10B20FFF78EFE10B10C20EB +:104E4000FFF78AFE00F001002870002C44D00021FA +:104E5000287800F0D3F908B101F09EFC0B20FFF791 +:104E60007BFE28B90C20FFF777FE08B1FFF71CFF87 +:104E700043F20804264801F0BDFB206800F000F969 +:104E800028B100F029FA10B9206800F0F1F9BFF359 +:104E90004F8F2049204BCA6802F4E0621343CB6075 +:104EA000BFF34F8F00BFFDE7D3F81C25A82A0CBF26 +:104EB000012200222A703FF434AFD3F81C354E2B68 +:104EC0003FF42FAF002432E73046FFF78BFDFFF7AA +:104ED00005FEA8E70120B5E743F20803186800F0D3 +:104EE000CFF80028B3D04FF47A71204600F086F94D +:104EF000B4E700BFD942002000A000400100000636 +:104F0000141000100C000300804000200024F40066 +:104F1000DC42002000ED00E00400FA0538B50C4644 +:104F2000F8B90968D9B1104A914215460CD0531A04 +:104F30003B2B12D93C22284604F039FA04E0C85C25 +:104F4000D05413F1FF33FAD200223C21064801F07D +:104F50007DFC0023A887236038BD3D23F1E70E23A5 +:104F6000F9E70123F7E700BF807F00206FF002031D +:104F7000064A9E4502D1EFF3098101E0EFF3088173 +:104F80008869A0F102000078104700BF1D4F0F0094 +:104F900038B50546A8B10D4C00223C21204601F051 +:104FA00055FCA38F83420ED1224604F13C0152F8F6 +:104FB000040B45F8040B8A42F9D10133A387002082 +:104FC00038BD0E20FCE70B20FAE700BF807F0020F1 +:104FD0003EDF704711DF704713DF7047014B01223E +:104FE0001A70704724430020064B1878012803D11B +:104FF000012904BF0221197012B1104601F0CCBB87 +:10500000704700BF3043002038B5084D084CFFF70B +:10501000DFFF08B101F0C0FB01F08CFB2B78023BF5 +:10502000022B02D92378002BF1D038BD3043002069 +:1050300024430020044B1B7803F0FF011BB9034AF3 +:10504000084601F011BB704725430020DD4F0F00DB +:1050500008B51C21084803F02FFE08B101F09CFBA5 +:1050600000231C220549044803F016FE18B1BDE8D0 +:10507000084001F091BB08BD2843002034430020C4 +:1050800007B50368013303D1002003B05DF804FBCA +:1050900001A800F0C5F9019B1A78012AF4D15888BB +:1050A00030B1996843F208030022186801F0CEFB82 +:1050B000019B5B881B1A58425841E6E784B02DE9F2 +:1050C000F34108AC84E80F009DF82040BDF8228031 +:1050D0000B9D01A8DDE9097600F0A2F954B9394B1E +:1050E0000122FF21A3F802809D601A701971364BCE +:1050F0001A7012E0012C17D1324BBA192A449A6067 +:10510000A5221A70FF221A710C9AA3F80280C3E933 +:1051100003765D619A612C4B1C70FFF799FF02B01A +:10512000BDE8F04104B07047032C0FD1019A254B24 +:1051300011781970518892689A60C3E90376AA229F +:1051400059801A715D61204B0122D1E7022C16D1E2 +:10515000019A1C4B1178A5290BD100225A809A6024 +:10516000FF221A70FF221A710022C3E903225A613A +:10517000E9E719705188926859809A60F2E7052C26 +:105180000ED1FFF7E3FC40B100F0E8FD08B101F0FB +:1051900003FB0D4B03221A70C1E700F07FFAF5E71D +:1051A000042C09D1074B00229A605A80FF221A7002 +:1051B000019A12791A71B0E7062CB0D1024B042281 +:1051C000E9E700BF34430020304300201FB500232F +:1051D000CDE90233074B019303F026FD30B90649B0 +:1051E0004FF47F2301A84B6003F042FD05B05DF84A +:1051F00004FB00BFE94F0F002843002070B50446B0 +:105200000E46FFF7B7F9054640B94CB100F0DCFC9B +:105210000546FFF7F9FE0CB900F040FA284670BDCC +:10522000CEB10E4B0E4A1C700E4B0F481C7021461F +:1052300001F08AF94FF400454FF4FA7000214FF461 +:105240007A720023E5FB060103F022FF22460146A5 +:10525000064801F08BF900F0FDF9D9E7254300205D +:1052600035500F0024430020FC930F00044300201E +:1052700038B5FFF7AFFE08B101F08EFA14490D689A +:105280000023012404FA03F22A4207D05A0903F04A +:105290001F00203204FA00F041F822000133272BCE +:1052A000F0D10C4B4FF48032C3F8482343F208048A +:1052B000C3F8082301225A609A602068FFF78CFE29 +:1052C00008B101F069FA2068BDE8384000F0AEB8D6 +:1052D00000E100E00010014007B501A800F0A0F8CF +:1052E000019B1A78A52A07D01879A0F1AA03584281 +:1052F000584103B05DF804FB0120FAE710B5FFF751 +:1053000032FB002850D02C4B2C491A682C4B00BF84 +:1053100000BF00BF00BF00BF00BF00BF00BF8A4288 +:105320002FD000BF00BF00BF00BF00BF00BF00BF45 +:1053300000BF00BF00BF00BF00BF00BF00BF00BF75 :1053400000BF00BF00BF00BF00BF00BF00BF00BF65 :1053500000BF00BF00BF00BF00BF00BF00BF00BF55 :1053600000BF00BF00BF00BF00BF00BF00BF00BF45 :1053700000BF00BF00BF00BF00BF00BF00BF00BF35 -:1053800000BF00BF00BF00BF00BF00BF00BF00BF25 -:1053900000BF00BF00BF00BF00BF00BF00BF013B98 -:1053A000C3D1FFF761FA08B101F0CEFAFFF7DBFADB -:1053B00008B101F0C9FAFFF79FFA044638B101F0CD -:1053C000C3FA04E0FFF7B2FA04460028A9D1204648 -:1053D00010BD00BF804000200024F400A086010022 -:1053E00000B589B003AB142200211846FEF79AFFDE -:1053F00002228DF80C20002200920FC8FFF76CFEED -:10540000FFF710FE002009B05DF804FB13B5044659 -:1054100001A800F013F8019B1A7822705A88628064 -:105420009A68A2601A792271DA68E2601A692261C8 -:105430005A6962619B69A36102B010BD014B0360B0 -:10544000704700BF00F00F00F0B50346186880F306 -:1054500008885868FF2464B2EFF30585002D01D158 -:10546000A64600472546064621273FBAF0B4002449 -:10547000002500260027F0B4F92040B2004700BF05 -:10548000F0BD00BF0B2970B50446154630D903891D -:10549000053300EB43030144CA1AD2B2012A27D9CB -:1054A0008B4225D81946134804F0A7F82388522BBD -:1054B00006D1AB0711D062884AF6AF539A420CD09E -:1054C0000F2014E034F8022B824204D02E8896423A -:1054D00003F1010308D1002009E0218900230A34E7 -:1054E0004FF6FE7043F20C059942EBD80B2070BDCD -:1054F0000920FCE71845002008B5002201F09AFABF -:10550000044A5178137843EA0123984214BF0B20D0 -:10551000002008BD1845002073B500230DF10201DD -:1055200001A8ADF80230019301F014FFF8B9019C15 -:1055300025785DB3174B93F83020032A28D00C262A -:1055400006FB00F29958E9B998189D5093F830205D -:105550000132D2B283F83020BDF802300E4A9B08E7 -:10556000013B043443608460084601F041F9019B2B -:1055700033B128B1184601F009FF08B101F0E4F990 -:1055800002B070BD01300428DAD1F0E70720EEE761 -:105590000420ECE724450020E1550F0011B1084636 -:1055A00001F0D2B97047000010B50C230B4A4343F9 -:1055B000D418D15881B192F83010A0680139C9B21D -:1055C00082F830100021D150C4E90111043801F0F3 -:1055D000DDFE08B101F0B8F9002010BD244500201F -:1055E000F8B5214B214E01221A7035460C2796F84A -:1055F000303003B9F8BD002407FB04F3EA5882B148 -:10560000013AE818042A06D8DFE802F019050F036A -:105610002400FFF751F8E0B2FFF7C6FF08B101F030 -:1056200093F90134042CE7D1E1E72B449A685A60DE -:10563000FEF7ECFF0028EED001F086F9EBE7FFF76C -:1056400099F8FFF775F808B101F07EF90120FFF72E -:10565000EFFAE0E7FFF7BEF8FFF7E0F80020BDE85B -:10566000F840FFF7E5BA00BFED44002024450020D4 -:1056700008B50E4B002283F8302003F130011A6088 -:10568000C3E901220C338B42F9D10948FEF7B8FF78 -:1056900001F0F8FD08B101F057F9064801F0DEFD10 -:1056A00008B101F051F9002008BD00BF24450020D9 -:1056B0009D550F0019550F0008B50020FFF774FF26 -:1056C0000120FFF771FF0220FFF76EFF0320FFF7B5 -:1056D0006BFFBDE8084001F01DBE006870476CDF3D -:1056E00070476DDF70476EDF70476FDF704773DFA5 -:1056F000704774DF704776DF704777DF70477ADF77 -:1057000070477CDF70477FDF704786DF704790DF30 -:105710007047A7DF7047A8DF7047A9DF7047AADF8F -:105720007047ADDF704766DF70470C2813D8DFE89D -:1057300000F014121212121209120712120D0B00AD -:1057400002207047032070470420704704290CBFD3 -:10575000052006207047062070470120704701F0A1 -:10576000F3B810B5044608460321FFF7DEFF032116 -:105770000246204603F092F818B1BDE8104001F04F -:10578000E3B810BD10B5124B90B09B798DF8063080 -:10579000044641F230530021382202A8ADF804300B -:1057A000FEF7C0FD02238DF8083001230021ADF87B -:1057B000103002A801AB8DF80A108DF80B4005934C -:1057C00002F05EFD08B101F0BFF810B010BD00BFDF -:1057D000B0450020032810B50B46144620D00428FD -:1057E00025D169B1124B18884FF6FF7398421ED02D -:1057F0001321FFF780FFD0B1BDE8104001F0A4B83D -:10580000104601F089F908B101F09EF8094B1B68B8 -:105810009C420CD101220321074803F03FF8EAE73C -:1058200001211846FFF781FF01210246F4E710BD70 -:105830006840002000460020B04500202DE9F043DC -:10584000424F97F800808BB0B8F1000F37D1404C31 -:10585000182241462046FEF765FD237943F05303A5 -:1058600023713C4B1D782646002D61D0DFF8F49063 -:10587000414610226846FEF755FD1022694609F19F -:10588000070003F0ABFE4D468046D8B90520FFF770 -:1058900079FF2379C4F8009043F00403237184F85E -:1058A0001080C4F80880A4F80C8001222849002048 -:1058B000FFF71DFF08B101F047F801233B700BB063 -:1058C000BDE8F08324480121C0F80090FFF70BFFEA -:1058D00008B101F039F8214B04AA03F1100E9446E7 -:1058E00018685968144603C4083373452246F7D133 -:1058F0002868AA8808901A48AB79ADF824200021BE -:1059000001228DF82630C0F800C0FFF7EEFE08B186 -:1059100001F01AF80420FFF735FF33796FF38203A3 -:105920003371022333742823B3600023B381BCE7AF -:105930000620FFF727FF2379256065F38203237193 -:1059400028232574A360A581AFE700BFE4450020AC -:1059500058450020AC450020FC450020774500203C -:10596000E045002070450020F0B50446B1B002F0DB -:1059700077FD2146904802F0C5FF23881A2B36D0C8 -:105980001DD8112B6CD006D8012B00F0E380102B12 -:1059900059D031B0F0BD132B00F08580142BF8D115 -:1059A000864A258A518D02F1180000238D420CBFD2 -:1059B000014619460732A088FFF7A7FEA0E0512B49 -:1059C00000F0CE800BD81B2B00F0A880232BE0D159 -:1059D0007B4B002211461888FFF799FE90E0552B6B -:1059E00000F0E080562B00F08F80522BD1D1744B09 -:1059F0001C884FF6FF75AC4200F0D080714B1B78CD -:105A0000002B00F0C580012308226F492046FFF7D4 -:105A100084FE002840F0C38002460146022320464F -:105A2000FFF77BFE002840F0BA802A460C21204672 -:105A3000FFF76FFE43F202039842AAD00828A8D0CD -:105A400011285DD1A5E7FFF7F9F801210E20FFF736 -:105A500095F85B4BA2881A805C4B00221A7098E77D -:105A600030AD802325F89C3D594B554C32221A60AD -:105A7000FFF7EAF80020FFF7DBF800210E20FFF720 -:105A80007DF801232A4610A92088FFF748FE08B1B7 -:105A900000F05AFF4F4B1B780BB9FFF7CFFE4FF6C4 -:105AA000FF73238075E7454B03AC9A791868998892 -:105AB0008DF822200790DA1DADF820101733264606 -:105AC00010685168254603C508329A422C46F7D122 -:105AD000414B09AA03F1180715461868596814467E -:105AE00003C40833BB422246F7D11868206034480B -:105AF0003A4A008810AB8521CDE91456FFF703FE22 -:105B000000283FF446AF4AE0A379002B7FF441AF71 -:105B10002B4B13211888FFF7EEFDF1E7237A002BBA -:105B20007FF437AF294A1370294B1968013919607E -:105B300069B910AB14221846FEF7F4FB05228DF864 -:105B40004020149A00920FC8FFF7C6FA21E7FFF72A -:105B500075FE1EE71A4B00211888FFF7E4FDCFE71A -:105B6000A379002B3FF415AFA27B043A022A3FF63B -:105B700010AF022B18BF01238DF840304FF4C173D2 -:105B8000ADF844300E4B10A91888FFF7C4FDB7E7F5 -:105B90001A4619462046FFF7C0FDB1E7082000F07D -:105BA000D3FEF6E6E188064BF72928BFF7211888CF -:105BB000FFF7B7FDA4E700BFB04500207045002007 -:105BC00068400020AC450020A4450020E4450020AA -:105BD0006C400020F745002088450020F245002059 -:105BE00000F0B2BE30B5544A544800231370544AF2 -:105BF00095B0137003F01CFB0546002840F084802C -:105C00005048FEF7FDFC00F031FF054600287BD12F -:105C10004D48FFF7CBF9002879D14C4B01221A707F -:105C200014AC11234A4804F84C3D03F0F1FC4849F8 -:105C300082B22046FFF765FD08B100F085FE08221C -:105C4000002104A8FEF76EFB424A4FF0C87304A877 -:105C5000CDE90423FFF753FD08B100F075FE0021E4 -:105C60000C222046FEF75EFB0823ADF804303A4BC9 -:105C700002932146394B3A48039302F05DFC08B188 -:105C800000F062FE4022002104A8FEF74BFB3549DC -:105C900004A802F03BFC344906A802F037FC334963 -:105CA0000CA802F033FC112304A8ADF84C3002F02C -:105CB00043FF1C22002104A8FEF734FB002340F61A -:105CC000CD42CDE904324FF480420692ADF81E3049 -:105CD00003228DF82030099304A8254B8DF81C2051 -:105CE0000A9302F081FB08B100F02EFE214B302216 -:105CF0001A7007225A70002110229A700846042256 -:105D0000FFF7FBFCFFF79AFD284615B030BD04A84D -:105D1000FFF7E7FC08B100F017FE9DF8113004A86A -:105D200001338DF81130FFF7DAFC00283FF478AF2B -:105D300000F00AFE74E700BFF745002069590F0024 -:105D4000F1450020D5570F0070450020AC450020DC -:105D50004C960F0008001800CD5D0F00E15B0F00AE -:105D6000B045002053960F0067960F007F960F00F6 -:105D70005F570F00F245002010B5114B01221A7039 -:105D8000104B18884FF6FF7398420CD01321FFF781 -:105D9000B2FC08B100F0D8FD02F05CFB08B100F0E5 -:105DA000D3FD002010BD084C2278002AF4D000203A -:105DB000FFF79FFC08B100F0C7FD00232370EBE75D -:105DC000F745002068400020E4450020F0B50B783E -:105DD00089B005460C46092B23D8DFE813F02B00C9 -:105DE000330042000A0018002400FD0006014500AF -:105DF0000B01FEF7EFFC0421FFF797FC042102469C -:105E0000284602F04BFD60B100F09EFD09E0FFF76F -:105E1000B3FF08B100F098FDFEF700FD08B1FEF7F2 -:105E200015FD09B0F0BDFFF7A7FF0028F7D000F07F -:105E30008BFDF4E7724B01221A704B681A78714B94 -:105E40001A70EEE76E4B02261E704B681B78012B12 -:105E5000E7D1FEF76DFC3146FFF767FC024631469D -:105E6000CEE7674B0322EBE70120FEF7E1FE644B30 -:105E70001E78022E2AD0032E4ED0012ED1D104AB93 -:105E8000102218460021FEF74DFA5E4A237A127856 -:105E90008DF81020002203920C2B4FF00302CDE965 -:105EA0000120DCD163681846FFF717FC0590181D28 -:105EB000FFF713FC069003F10800FFF70EFC0790B4 -:105EC00001A8FEF7A3FB0028ABD0C4E7237A13F0A8 -:105ED00003010FD00022C1F1040194469818164620 -:105EE000C0B267680132914207F800C0F6D10133B1 -:105EF000334423720123049363680693237A04A82E -:105F00009B080593FEF736FC00288AD00221FFF794 -:105F10000CFC0221024673E7207A830702D0324646 -:105F200031466DE7384E0190314600F0BDFD014627 -:105F300018B12846FFF715FC73E76168019A3068CD -:105F400003F05BFB019800F033FE01460028F0D11E -:105F500001A9304600F044FE01460028E9D104239F -:105F60000493019B9B08059304A833680693FEF7EE -:105F7000A3FB074640B9254A237A11680B441360F6 -:105F8000234B32681A604CE709281BD11F4B217A3A -:105F90001A68114419601F4B1B78002B3FF441AF66 -:105FA0001D4C2388013B9BB22380002B7FF439AF2B -:105FB000284602F039FC08B100F0C6FC174B1B88DC -:105FC00023802EE7306800F0A7FD014610B1284677 -:105FD000FFF7C7FB3946ACE70E4B01221A700F4A98 -:105FE0008B8813800C4A13801BE70A4A0023137026 -:105FF0000A4AF8E7054B196802F0DAFB03E700BF2D -:10600000F1450020F845002004460020E845002026 -:1060100000460020F0450020EE450020EC45002021 -:10602000437882780133DBB29A4208BF00230278BA -:106030009A421FBF0B704378406803EB430314BFC1 -:1060400000EBC3000020704708B500F0D7FC022821 -:1060500004D006280CBF0120022008BD0020FCE768 -:10606000204B21491A682F2300BF00BF00BF00BF8B -:1060700000BF00BF00BF00BF8A422FD000BF00BFDB -:1060800000BF00BF00BF00BF00BF00BF00BF00BF18 -:1060900000BF00BF00BF00BF00BF00BF00BF00BF08 +:1053800000BF013BC3D1FFF76FFA08B101F004FA87 +:10539000FFF7E9FA08B101F0FFF9FFF7ADFA0446AB +:1053A00038B101F0F9F904E0FFF7C0FA044600282B +:1053B000A9D1204610BD00BF804000200024F40089 +:1053C000A086010000B589B003AB14220021184665 +:1053D000FEF7A8FF02228DF80C20002200920FC8D1 +:1053E000FFF76CFEFFF710FE002009B05DF804FB2C +:1053F00013B5044601A800F013F8019B1A78227037 +:105400005A8862809A68A2601A792271DA68E2602A +:105410001A6922615A6962619B69A36102B010BD79 +:10542000014B0360704700BF00F00F00F0B503466A +:10543000186880F308885868FF2464B2EFF3058584 +:10544000002D01D1A64600472546064621273FBA32 +:10545000F0B40024002500260027F0B4F92040B263 +:10546000004700BFF0BD00BF0B2970B504461546CC +:1054700030D90389053300EB43030144CA1AD2B281 +:10548000012A27D98B4225D81946134803F08FFFEC +:105490002388522B06D1AB0711D062884AF6AF534E +:1054A0009A420CD00F2014E034F8022B824204D030 +:1054B0002E88964203F1010308D1002009E02189DA +:1054C00000230A344FF6FE7043F20C059942EBD8E4 +:1054D0000B2070BD0920FCE75043002008B50022D6 +:1054E00001F0B4F9044A5178137843EA0123984251 +:1054F00014BF0B20002008BD5043002073B50023CB +:105500000DF1020101A8ADF80230019301F0FCFD9C +:10551000F8B9019C25785DB3174B93F83020032A26 +:1055200028D00C2606FB00F29958E9B998189D502E +:1055300093F830200132D2B283F83020BDF8023027 +:105540000E4A9B08013B043443608460084601F026 +:105550008BF8019B33B128B1184601F0F1FD08B179 +:1055600001F01AF902B070BD01300428DAD1F0E779 +:105570000720EEE70420ECE75C430020C5550F0050 +:1055800011B1084601F008B97047000010B50C23AE +:105590000B4A4343D418D15881B192F83010A06817 +:1055A0000139C9B282F830100021D150C4E901118B +:1055B000043801F0C5FD08B101F0EEF8002010BD7F +:1055C0005C430020F8B5214B214E01221A7035466C +:1055D0000C2796F8303003B9F8BD002407FB04F31C +:1055E000EA5882B1013AE818042A06D8DFE802F046 +:1055F00019050F032400FFF75FF8E0B2FFF7C6FFBD +:1056000008B101F0C9F80134042CE7D1E1E72B44DB +:105610009A685A60FEF7FAFF0028EED001F0BCF855 +:10562000EBE7FFF7A7F8FFF783F808B101F0B4F84C +:105630000120FFF7FDFAE0E7FFF7CCF8FFF7EEF8FF +:105640000020BDE8F840FFF7F3BA00BF2543002073 +:105650005C43002008B50E4B002283F8302003F194 +:1056600030011A60C3E901220C338B42F9D1094899 +:10567000FEF7C6FF01F0E0FC08B101F08DF8064826 +:1056800001F0C6FC08B101F087F8002008BD00BF9A +:105690005C43002081550F00FD540F0008B5002029 +:1056A000FFF774FF0120FFF771FF0220FFF76EFF85 +:1056B0000320FFF76BFFBDE8084001F005BD00685F +:1056C00070476CDF70476DDF70476EDF70476FDFCC +:1056D000704773DF704774DF704776DF704777DF9E +:1056E00070477ADF70477CDF70477FDF704786DF67 +:1056F000704790DF7047A7DF7047A8DF7047A9DFCA +:105700007047AADF7047ADDF704766DF70470C282F +:1057100013D8DFE800F01412121212120912071245 +:10572000120D0B00022070470320704704207047C1 +:1057300004290CBF05200620704706207047012071 +:10574000704701F029B810B5044608460321FFF759 +:10575000DEFF03210246204602F07AFF18B1BDE8C1 +:10576000104001F019B810BD10B5124B90B09B79E4 +:105770008DF80630044641F230530021382202A849 +:10578000ADF80430FEF7CEFD02238DF8083001237A +:105790000021ADF8103002A801AB8DF80A108DF889 +:1057A0000B40059302F046FC08B100F0F5FF10B085 +:1057B00010BD00BFE8430020032810B50B46144677 +:1057C00020D0042825D169B1124B18884FF6FF73F9 +:1057D00098421ED01321FFF780FFD0B1BDE81040E2 +:1057E00000F0DABF104601F08DF808B100F0D4FFE8 +:1057F000094B1B689C420CD101220321074802F08F +:1058000027FFEAE701211846FFF781FF0121024641 +:10581000F4E710BD6840002038440020E843002031 +:105820002DE9F043424F97F800808BB0B8F1000F9C +:1058300037D1404C182241462046FEF773FD2379AC +:1058400043F0530323713C4B1D782646002D61D055 +:10585000DFF8F490414610226846FEF763FD1022FF +:10586000694609F1070003F093FD4D468046D8B91B +:105870000520FFF779FF2379C4F8009043F0040373 +:10588000237184F81080C4F80880A4F80C800122E9 +:1058900028490020FFF71DFF08B100F07DFF01231C +:1058A0003B700BB0BDE8F08324480121C0F80090A4 +:1058B000FFF70BFF08B100F06FFF214B04AA03F1C3 +:1058C000100E944618685968144603C4083373458B +:1058D0002246F7D12868AA8808901A48AB79ADF813 +:1058E0002420002101228DF82630C0F800C0FFF7E7 +:1058F000EEFE08B100F050FF0420FFF735FF3379CA +:105900006FF382033371022333742823B3600023BF +:10591000B381BCE70620FFF727FF2379256065F3F5 +:105920008203237128232574A360A581AFE700BFFC +:105930001C44002090430020E44300203444002015 +:10594000AF43002018440020A8430020F0B50446CF +:10595000B1B002F05FFC2146904802F0ADFE238812 +:105960001A2B36D01DD8112B6CD006D8012B00F085 +:10597000E380102B59D031B0F0BD132B00F085809F +:10598000142BF8D1864A258A518D02F11800002384 +:105990008D420CBF014619460732A088FFF7A7FECB +:1059A000A0E0512B00F0CE800BD81B2B00F0A8807C +:1059B000232BE0D17B4B002211461888FFF799FE7C +:1059C00090E0552B00F0E080562B00F08F80522B9A +:1059D000D1D1744B1C884FF6FF75AC4200F0D080DB +:1059E000714B1B78002B00F0C580012308226F4902 +:1059F0002046FFF784FE002840F0C380024601469F +:105A000002232046FFF77BFE002840F0BA802A469A +:105A10000C212046FFF76FFE43F202039842AAD002 +:105A20000828A8D011285DD1A5E7FFF707F90121C3 +:105A30000E20FFF7A3F85B4BA2881A805C4B002274 +:105A40001A7098E730AD802325F89C3D594B554C92 +:105A500032221A60FFF7F8F80020FFF7E9F800217A +:105A60000E20FFF78BF801232A4610A92088FFF7A4 +:105A700048FE08B100F090FE4F4B1B780BB9FFF7C2 +:105A8000CFFE4FF6FF73238075E7454B03AC9A7941 +:105A9000186899888DF822200790DA1DADF820103B +:105AA0001733264610685168254603C508329A42C6 +:105AB0002C46F7D1414B09AA03F11807154618687F +:105AC0005968144603C40833BB422246F7D118680C +:105AD000206034483A4A008810AB8521CDE914563D +:105AE000FFF703FE00283FF446AF4AE0A379002BFE +:105AF0007FF441AF2B4B13211888FFF7EEFDF1E740 +:105B0000237A002B7FF437AF294A1370294B196889 +:105B10000139196069B910AB14221846FEF702FC6E +:105B200005228DF84020149A00920FC8FFF7C6FA9C +:105B300021E7FFF775FE1EE71A4B00211888FFF7D3 +:105B4000E4FDCFE7A379002B3FF415AFA27B043A25 +:105B5000022A3FF610AF022B18BF01238DF8403008 +:105B60004FF4C173ADF844300E4B10A91888FFF7FD +:105B7000C4FDB7E71A4619462046FFF7C0FDB1E756 +:105B8000082000F009FEF6E6E188064BF72928BF59 +:105B9000F7211888FFF7B7FDA4E700BFE84300200E +:105BA000A843002068400020E4430020DC4300209C +:105BB0001C4400206C4000202F440020C0430020E3 +:105BC0002A44002000F0E8BD30B5544A5448002370 +:105BD0001370544A95B0137003F004FA0546002878 +:105BE00040F084805048FEF70BFD00F04BFE054668 +:105BF00000287BD14D48FFF7CBF9002879D14C4BD9 +:105C000001221A7014AC11234A4804F84C3D03F0E9 +:105C1000D9FB484982B22046FFF765FD08B100F084 +:105C2000BBFD0822002104A8FEF77CFB424A4FF08E +:105C3000C87304A8CDE90423FFF753FD08B100F0B1 +:105C4000ABFD00210C222046FEF76CFB0823ADF8CB +:105C500004303A4B02932146394B3A48039302F001 +:105C600045FB08B100F098FD4022002104A8FEF792 +:105C700059FB354904A802F023FB344906A802F079 +:105C80001FFB33490CA802F01BFB112304A8ADF83D +:105C90004C3002F02BFE1C22002104A8FEF742FB30 +:105CA000002340F6CD42CDE904324FF48042069203 +:105CB000ADF81E3003228DF82030099304A8254B3F +:105CC0008DF81C200A9302F069FA08B100F064FD17 +:105CD000214B30221A7007225A70002110229A702C +:105CE00008460422FFF7FBFCFFF79AFD284615B093 +:105CF00030BD04A8FFF7E7FC08B100F04DFD9DF8AA +:105D0000113004A801338DF81130FFF7DAFC0028B8 +:105D10003FF478AF00F040FD74E700BF2F4400204F +:105D20004D590F0029440020B9570F00A843002007 +:105D3000E443002000940F0008001800B15D0F003C +:105D4000C55B0F00E843002007940F001B940F0071 +:105D500033940F0043570F002A44002010B5114B15 +:105D600001221A70104B18884FF6FF7398420CD01E +:105D70001321FFF7B2FC08B100F00EFD02F044FA67 +:105D800008B100F009FD002010BD084C2278002A5F +:105D9000F4D00020FFF79FFC08B100F0FDFC0023C9 +:105DA0002370EBE72F440020684000201C440020B3 +:105DB000F0B50B7889B005460C46092B23D8DFE8EF +:105DC00013F02B00330042000A0018002400FD00ED +:105DD000060145000B01FEF7FDFC0421FFF797FCCF +:105DE00004210246284602F033FC60B100F0D4FCE6 +:105DF00009E0FFF7B3FF08B100F0CEFCFEF70EFD9F +:105E000008B1FEF723FD09B0F0BDFFF7A7FF00289A +:105E1000F7D000F0C1FCF4E7724B01221A704B6816 +:105E20001A78714B1A70EEE76E4B02261E704B68A3 +:105E30001B78012BE7D1FEF77BFC3146FFF767FCAF +:105E400002463146CEE7674B0322EBE70120FEF71F +:105E5000EFFE644B1E78022E2AD0032E4ED0012E68 +:105E6000D1D104AB102218460021FEF75BFA5E4A3E +:105E7000237A12788DF81020002203920C2B4FF019 +:105E80000302CDE90120DCD163681846FFF717FC57 +:105E90000590181DFFF713FC069003F10800FFF7AB +:105EA0000EFC079001A8FEF7B1FB0028ABD0C4E7B9 +:105EB000237A13F003010FD00022C1F104019446AC +:105EC00098181646C0B267680132914207F800C0C0 +:105ED000F6D101333344237201230493636806939C +:105EE000237A04A89B080593FEF744FC00288AD077 +:105EF0000221FFF70CFC0221024673E7207A830798 +:105F000002D0324631466DE7384E0190314600F0FE +:105F1000CFFC014618B12846FFF715FC73E761680E +:105F2000019A306803F043FA019800F029FD014618 +:105F30000028F0D101A9304600F032FD01460028CA +:105F4000E9D104230493019B9B08059304A83368BB +:105F50000693FEF7B1FB074640B9254A237A11683C +:105F60000B441360234B32681A604CE709281BD19D +:105F70001F4B217A1A68114419601F4B1B78002BA4 +:105F80003FF441AF1D4C2388013B9BB22380002B83 +:105F90007FF439AF284602F021FB08B100F0FCFB8A +:105FA000174B1B8823802EE7306800F0ABFC0146BE +:105FB00010B12846FFF7C7FB3946ACE70E4B01226C +:105FC0001A700F4A8B8813800C4A13801BE70A4A09 +:105FD000002313700A4AF8E7054B196802F0C2FA69 +:105FE00003E700BF29440020304400203C44002047 +:105FF000204400203844002028440020264400206B +:1060000024440020094A537891780133DBB2994245 +:1060100008BF0023117899421FBF037050781823DE +:1060200003FB002014BF04300020704740440020D0 +:10603000082910B5044602D0002000F0ADFBD4E9D9 +:106040000030BDE81040184773B5054602A800248B +:1060500000F8014D0E4600F0BFFB0DF10600FFF702 +:10606000D1FF90B106700A4B9DF8062045605A702A +:106070009DF8070000F0D4FB24B9064B4FF48012C2 +:10608000C3F80021204602B070BD0424F0E700BF31 +:106090004044002000E100E0204B21491A682F23F2 :1060A00000BF00BF00BF00BF00BF00BF00BF00BFF8 -:1060B00000BF00BF00BF00BF00BF00BF00BF00BFE8 +:1060B0008A422FD000BF00BF00BF00BF00BF00BF9B :1060C00000BF00BF00BF00BF00BF00BF00BF00BFD8 -:1060D00000BF00BF00BF00BF00BF00BF013BC3D176 -:1060E000704700BF804000200024F4000C4B0D4896 -:1060F0004FF4003210B5C3F8802001244FF48033F0 -:10610000C0F84833C0F808334460FFF7A9FF064BD6 -:10611000846000201860FFF7A3FF044B187010BDC7 -:1061200000E100E0001001401C4600200E46002067 -:106130002DE9F8432649274B0025C1F84051C1F805 -:106140004451C1F84851C1F84C51C1F80051C1F84F -:1061500004511B68002B34D0D1F804451E49DFF8E8 -:106160008C800968641A24F07F442F461A68A24282 -:1061700012D8A41A15441A7CDE6962B1D8F80090CE -:106180001F74D3E90521B9F1000F1ED01046C8478E -:1061900008B100F0D9FBB6B9104B114A1978137841 -:1061A0008B4205D10133DBB2022B08BF00231370F1 -:1061B00012780C4B43F822500B4B4FF48012C3F86B -:1061C0000021BDE8F8833346D0E708469047E2E770 -:1061D00000100140244600201C46002018460020E4 -:1061E000194600201046002000E100E0084600208B -:1061F0002DE9F04FAA4BAB481B68047885B01A46CE -:10620000009303F1180600251778517893788F4290 -:1062100085BF5B180133CB1BDB1BDBB2A34202F152 -:10622000080284BF1C460125B242EDD105B10470BD -:106230009D499E4A9E480B680293007813789842C5 -:1062400000F09D800133DBB2022B08BF00231370E6 -:106250001278984B53F82200029B034423F07F43AB -:106260000B6001230193944BD1F800C01B6803938A -:10627000924B93F800B0924B002193F80080039B5F -:106280005C468E46013CE4B2FF2C7BD1BEF1000F90 -:1062900005D08B4A82F80080834AC2F800C0864D40 -:1062A00001B12B60019A2B68002A40F0C280039A4A -:1062B000D31A18BF012301930021814BD5F800A008 -:1062C0001B780293784B00271E6853460BF1FF3270 -:1062D0005FFA82FBBBF1FF0F40F0B080764A07B156 -:1062E000136013689A4502D1019A002A41D0002B0D -:1062F00000F03A817348DFF8D481D0F804751C6847 -:1063000098F80030BD1B25F07F4503359BB94FF44D -:106310008033C0F84433C0F804336B4B4FF4003281 -:106320004FF00109C3F880211A60C0F80090FFF710 -:1063300097FE88F80090AC422CBF3619761926F0EB -:106340007F46C0F84065D0F80435DB1B23F07F435F -:10635000F61B033326F07F46B3420AD9D0F8043542 -:10636000C0F84035FFF77CFE574B4FF40032C3F8BE -:106370000021534B00221A7005B0BDE8F08F0020B9 -:10638000019070E722B2009D009E05EBC20516F851 -:1063900032206E7896423FF475AF6E6802EB420988 -:1063A00006EBC90A0132AE78D2B2964208BF00228B -:1063B0006E6816F83960022E09D0032EE9D1002B41 -:1063C000E7D04FF000011974DB690121F7E7DAF833 -:1063D00004901E469A46BAF1000FDAD0D14500F07B -:1063E000C6805646DAF81CA0F5E70121CCE01C680F -:1063F000844204D902B12B60201A18605DE7D3F8FB -:106400000CC01F60001B2644DC69BCF1000F07D0E4 -:10641000029AD961324422F07F42C3E9012C194625 -:10642000019A2346002BE2D1002A3FF446AF2B60AD -:1064300043E70022114616461746F3E7009A02EB9F -:10644000CB00002944D190F80180027842453FF406 -:106450003DAF02EB420E90F80290D0F804C001323A -:10646000D2B29145027004BF002202701CF83E2097 -:10647000012A0CEBCE05E8D16A6892F810C0BCF195 -:10648000000FE2D1AC685460EC6894602C69D46071 -:10649000029C6D699561ECB1C2F804C01AE000BFBE -:1064A000284600200C4600201C46002018460020EC -:1064B00019460020104600202446002020460020D7 -:1064C0000D4600200010014000E100E00E460020D3 -:1064D0000A46C9695568344CD2F808E0A5EB060CA9 -:1064E0002CF07F4CA44516D80CEB0E05156000244B -:1064F000C2E901444FF0010414740024D46143B193 -:10650000D2F800C01D68AC452BD8A5EB0C051D606A -:10651000D361012723E0751B25F07F45754502D225 -:10652000AEEB0505E2E700241460E0E7ACEB0E0CEF -:10653000D5F81CE0A846BEF1000F0AD07546D5F884 -:1065400000E0E645F2D3AEEB0C0EC5F800E0AE4637 -:106550004546C2F800C0C2F81CE0EA611A4613467C -:106560006FE798461D46EAE7FFF7C0FD01E7B14532 -:106570000AD1DB69002B7FF438AF0C4901278F600B -:106580009C463946BE46B846D9F800A0D9F81C90BA -:10659000C6F81C90B9F1000F3FF4FBAED9F80060CB -:1065A0005644C9F80060F4E6FEFF7F000010014089 -:1065B0002DE9F84312F0030507468846994614462C -:1065C00002D11E4E12B93260072035E0FFF78EFD72 -:1065D0001B4A1C4BC2F8009003221A70346004F16D -:1065E000180208EB4806F6001146626025706570D7 -:1065F00084F8028008348C423244F6D1124A134B9C -:106600001560134A1570134A1570134AC02115708E -:106610004FF48012C3F8802183F814131A6002F13A -:106620008042A2F56F220020C2F8087583F811138A -:106630000A4BD2F804251A60BDE8F88328460020EA -:1066400008460020204600202446002000E100E00B -:1066500018460020194600200C4600201C46002049 -:10666000074B1B684BB132B128B10368187C20B9C5 -:1066700059745A617047072070470820704700BF5F -:10668000284600202DE9F3411B4C236805460E46A1 -:1066900017467BB370B304292AD9436953B3437CAB -:1066A000012B0CBF88464FF00008FFF7CDFC246893 -:1066B00004EBC0040DF107012046FFF7B1FCA8B1BF -:1066C000012303700D4B4560D3F80435C0E9023651 -:1066D0009DF80730C0E904876370094B4FF48012BE -:1066E000C3F80021002002B0BDE8F0810420FAE7E1 -:1066F0000720F8E70820F6E72846002000100140B0 -:1067000000E100E073B5134D2B680646FBB1F0B114 -:106710004369E3B100240474FFF796FC2D6805EB90 -:10672000C0050DF107012846FFF77AFC68B1022386 -:1067300003709DF8073046606B70074B4FF4801272 -:10674000C3F80021204602B070BD0420FBE70820FA -:10675000F9E700BF2846002000E100E0024BD3F833 -:10676000043503600020704700100140082910B56F -:10677000044602D0002000F0E7F8D4E90030BDE87C -:106780001040184707B5054ACDE9000108216846C1 -:1067900000F02EF803B05DF804FB00BF6D670F003A -:1067A00012F0030310B513D10A4C22604C1CE40014 -:1067B000A4B22244084C2260084A1370084A13709D -:1067C000084A1080084A1180084A1846138010BDF4 -:1067D0000720FCE734460020304600202E460020EB -:1067E0003C460020384600203A4600202C46002037 -:1067F0002DE9F347344D2B888B4206460C4617464D -:106800005DD302A84FF0000800F8018D00F0BCF83D -:10681000DFF8C8E02D499EF800C00B78DAB22C4BA7 -:106820001888824238BF01325FFA8CFC38BF5FFAA9 -:1068300082F8C4453DD091F800800A78D2B29042E7 -:1068400086BF0132D2B200220A709EF800301A468A -:106850000B789A4284BF01301B189B1A1D4A11887D -:106860009BB2994200D213809DF8070000F0B0F867 -:106870004FF6FF73984524D0DFF864A0DAF80030B3 -:106880004FEAC80903EB090243F83870A6B19CB17E -:10689000114B28881B68224608FB0030314602F065 -:1068A000ACFEDAF800304B4400209C8002B0BDE81A -:1068B000F0874FF6FF78D7E700209080F6E70920B1 -:1068C000F4E70420F2E700BF384600202E460020FF -:1068D0003A4600202C460020304600203C4600204E -:1068E00034460020F8B5124C124E254622783378F3 -:1068F0009A421CD010492278237809880F48DBB2CD -:10690000994286BF0133DBB200232B700C4B078802 -:106910001B680C48D2B211B203EBC10C006853F8EB -:106920003130BCF8041002FB07009847DEE7F8BDE1 -:106930003C4600202E4600203A46002038460020E3 -:1069400034460020304600201FB50021CDE902105A -:1069500001AA44F20100ADF8041000F003F805B0FC -:106960005DF804FBBFF34F8F0549064BCA6802F47C -:10697000E0621343CB60BFF34F8F00BFFDE700BF62 -:1069800000ED00E00400FA0570B5EFF3108672B672 -:106990000C4A946801239CB993600B4B0B4DD3F8C0 -:1069A000801029401160C3F88050D3F884105160E2 -:1069B0004FF0FF32C3F88420047006B962B670BD90 -:1069C0000370FAE7A45B002000E100E0FC06FFBDD5 -:1069D00010B5084B9A685AB150B9EFF3108272B6ED -:1069E00005491C680C605C684C60986002B962B62E -:1069F00010BD00BFA45B002000E100E0EFF30583C1 -:106A0000C3F308038BB1103B5AB2002AADBF02F1A9 -:106A1000604303F00F03064A03F56143B4BFD05C43 -:106A200093F800034009C0B270470F20704700BFC1 -:106A300014ED00E02AB113880144884204D11846BD -:106A400070474FF6FF73F7E75BBA10F8012B9BB264 -:106A50005A40C2F30313534083EA03331BB25A0173 -:106A600002F4FF5253409BB2E7E7000038B50A4BEF -:106A70000A4D00241C700A4B2B60FEF767F8A042F9 -:106A800014BF08230223C5E90134C5E90344C5E95D -:106A90000544204638BD00BF3D4600202059002057 -:106AA0004046002000207047F8B507460E4659B30F -:106AB000184C636800250D6043B3FEF747F8A84201 -:106AC00014BF20234FF41673BB4221D3636821689F -:106AD000013B6360E3680133E36023694FF417729D -:106AE00002FB03123260012202FA03F1A2690A4397 -:106AF0005E1CA261FEF72AF8A84214BF07230123F7 -:106B0000334023612846F8BD0E20FCE70420FAE755 -:106B10000C20F8E7205900202DE9F041234CA36810 -:106B20000746002B40D06569ED1AFEF70FF80028E4 -:106B300014BF072301231D402B464FF4177822680A -:106B400008FB032297420BD1012202FA03F1A2694A -:106B50004A40A2611E4600274FF00108464418E053 -:106B60005E1CFDF7F3FF002814BF07230123334009 -:106B700066699E42E3D11027EEE7013BA36063689C -:106B800001336360FDF7E2FF002814BF07250125EC -:106B90003540A36908FA05F51D4202D1A368002B10 -:106BA000EBD13846BDE8F0810427FAE720590020F0 -:106BB00070B50A4D2B6906465C1EFDF7C7FF00281D -:106BC00014BF0723012323402C684FF4177202FBE4 -:106BD00003430020C3F8586270BD00BF2059002055 -:106BE00038B5F0B1E9B1114CE368E3B1013BE360C2 -:106BF000A36865690133A36023684FF4177202FB31 -:106C000005320260D2F858220A60FDF79FFF002883 -:106C100005F1010514BF072301232B406361002008 -:106C200038BD0E20FCE70420FAE700BF2059002001 -:106C30003FB40C49086890B10B4B1C687CB10B4AFF -:106C40001568CDE9025000238DF804300B60136005 -:106C500004AB13E90700234604B030BC184704B066 -:106C600030BC704744590020485900205459002036 -:106C7000DC2810B509D0DD2810D0C02816D1FFF7C8 -:106C8000D7FF0E4B0E4A1A6010BD0E4A0E4B196804 -:106C90001368581C1060C022CA54F2E7094A0A4B14 -:106CA00019681368581C1060DB22F5E7064B054A8B -:106CB000196813685C1C1460C854E2E77040002037 -:106CC000FD6C0F004459002054590020C02802BF19 -:106CD000014B024A1A60704770400020FD6C0F00A3 -:106CE00008B5DB2000F0DAFB10B9024B024A1A604B -:106CF00008BD00BF74400020996E0F00C02810B47A -:106D000009D0DB280BD0094B094A196813685C1CB1 -:106D10001460C85406E05DF8044BFFF789BF054BCB -:106D2000054A1A605DF8044B704700BF54590020B3 -:106D30004459002070400020716C0F0010B5064AC5 -:106D4000064C12682368D05C00F0A8FB10B92368D9 -:106D50000133236010BD00BF585900204C5900205A -:106D600008B5C02000F09AFB28B9034B1B6813B983 -:106D7000024B034A1A6008BD4C59002074400020A1 -:106D80003D6D0F007FB51C4C1C4E1D4D22683368B5 -:106D90009A4219D31B4B2B60FFF7E2FF002829D141 -:106DA000194B01221A70194B1B681BB38DF8042074 -:106DB000174A126802922268039204AA12E9070095 -:106DC00004B0BDE870401847114B22681B689A5CFC -:106DD000C02A03D022689B5CDB2B05D10D4B2A68AF -:106DE0009A4204BF0C4B2B602B689847042801D0B3 -:106DF0001128CBD104B070BD4C590020505900204F -:106E000074400020616D0F003C590020485900205B -:106E1000585900203D6D0F00E16C0F001FB503783D -:106E2000032B044605D1164B1B78022B01D1FFF72B -:106E3000A9FF2378042B20D1124B1A6862B1124BA0 -:106E40001968124B1B68994206D2114B20791B68B6 -:106E500004B0BDE8104018470E4B1B686BB102929E -:106E6000094A0221126803928DF8041004AA12E95B -:106E7000070004B0BDE81040184704B010BD00BFC3 -:106E80003C5900205459002044590020405900200A -:106E9000704000204859002010B50C4A0C4C126874 -:106EA0002368D35CC02B03D0DB2B0CD0042009E07B -:106EB000DC2000F0F3FA28B92368064A0133236086 -:106EC000054B1A6010BDDD20F3E700BF58590020C4 -:106ED0004C5900203D6D0F0074400020014B18609C -:106EE0000020704748590020F0B50C4E377887B025 -:106EF00097B90B4D0FCD6C460FC495E803000623E0 -:106F000084E80300074A3946684600F079FA08B970 -:106F10000123337007B0F0BD0020FBE73C5900208F -:106F200094960F001D6E0F00024B00221A7000F0A5 -:106F3000C9BA00BF3C59002010B5C0B10D4B1A783A -:106F4000012A04D0022A0CBF0420082010BD0A4ADE -:106F500000241460094A1160094A106002221A7064 -:106F6000084B094A1A60FFF70DFF2046EEE7102094 -:106F7000ECE700BF3C5900204C590020505900203C -:106F80005859002074400020616D0F00054B064ADF -:106F90001860064B1960064B00201860054B1A60FC -:106FA000704700BF54590020CD6C0F00405900209D -:106FB0004459002070400020064B07481B68DB0046 -:106FC000DBB20022037004215B4242708270C37006 -:106FD000FFF7B2BF845900205C59002070B52D4CDA -:106FE0002D4E024625462378012B14D002D3022BC6 -:106FF00020D070BD002AFCD12848FFF783FB08B1E0 -:10700000FFF7A2FC264B1B68002BF2D0254ABDE8F7 -:10701000704010781847012AEBD13168224B0631B5 -:107020001868FFF789FF08B1FFF78EFC02232B7069 -:107030000022D8E7022A19D0032A0ED0002AD8D17C -:107040001A4B16481A6041F67F21FFF71BFB0028F8 -:10705000CFD0BDE87040FFF777BC154A1368013305 -:1070600003F00703136000232370E1E70F4A13685E -:10707000052B0AD001331360074B19680A4B063100 -:107080001868BDE87040FFF757BF064B01221A7021 -:10709000E9E700BFA85900209C5900206059002052 -:1070A00098590020A0590020B0590020A459002070 -:1070B00088590020F0B585B004AB03E907009DF8BE -:1070C0000400032878D8DFE800F00802A7AA01200E -:1070D00005B0BDE8F040FFF781BF039E564C032E7C -:1070E00040F28680029D6B7813F00F0269D00E2A61 -:1070F0007ED1042E59D02A78500656D5110654D583 -:107100001A44AB781A44EB781A4412F0FF024CD1BF -:10711000B71E39462846FFF78DFCEB195A78EB5D10 -:1071200043EA0223984240D144492A780B6802F08E -:107130000702D8B282422BD1013303F007030B6060 -:10714000FFF73AFF3E4B012230461A70FFF730FD41 -:1071500008B1FFF7F9FB38494FF41670FFF7A4FCAC -:1071600000285ED0042802D00020FFF7EDFB354850 -:107170000521FFF70BFF08B1FFF7E6FB324B1B6859 -:10718000002B56D04FF0000005B0BDE8F040184786 -:107190004FF416712068FFF7F9FE08B1FFF7D4FB32 -:1071A00005B0BDE8F040FFF707BF20684FF4167147 -:1071B000FFF7ECFE00283CD005B0BDE8F040FFF73B -:1071C000C3BB2978AA780B441344EA78134413F01C -:1071D000FF030DD11D4A12680132C1F3C20102F052 -:1071E0000702914204D11A4A03201370FFF7F6FEFA -:1071F00025681DB14FF416712846D9E70E494FF4A2 -:107200001670FFF751FC80B1042802D02846FFF722 -:107210009BFB0C480521CBE705210A48C8E7032062 -:10722000CAE720684FF41671A3E720684FF416717F -:10723000BEE705B0F0BD00BFAC5900208459002066 -:10724000805900208C590020945900208859002032 -:10725000A05900200220FFF7C1BE0000074B10B567 -:10726000044618600648FFF739FE08B1FFF76CFBCB -:10727000002C0CBF0E20002010BD00BF9459002030 -:10728000B5700F00184A1948002310B51360184A4A -:107290001360184A1360184A1370184A1370184B79 -:1072A000184A01211960184B1960184B1970FFF723 -:1072B000D7F908B1032010BDFFF7D8FB0028FAD199 -:1072C000FFF712FE0028F6D1114C4FF4167021463C -:1072D000FFF7EAFB0028EDD120684FF41671BDE8F6 -:1072E0001040FFF753BE00BFB0590020AC960F000E -:1072F0009C590020A459002080590020A859002042 -:107300008459002055720F0088590020A059002090 -:10731000AC5900200C4A08B5002313600B4A1360D7 -:10732000FFF7C0FB08B1FFF70FFBFFF7FDFD08B14A -:10733000FFF70AFB0648FFF7E5F9042802D1002011 -:10734000FFF702FB002008BD985900209459002047 -:107350006059002037B50D46044698B191B10A4BEB -:1073600019780022019259B101A91A70FFF738FC6F -:10737000019B063B2B8023680433236003B030BDA0 -:107380000420FBE70E20F9E7805900200438FFF7BE -:10739000C3BB000013B50478012C13D104238DF86E -:1073A0000030436812491B7812488DF80430224699 -:1073B00000F004FB104B1C70104B1B68684698478C -:1073C00002B010BD022C09D1C368094909488DF8E3 -:1073D00000400122019300F0F1FAEDE7002CEFD11B -:1073E00002A8032300F8083D044B1B68E7E700BF31 -:1073F000B859002078400020B9590020B459002025 -:10740000F0B5204D064617469C460FCD89B06C4618 -:107410000FC495E80F0084E80F0073690693337C6E -:107420008DF81CC0003318BF01238DF81430737C15 -:107430001548002B14BF0E2300238DF81530F36878 -:107440000293B368039333680193736800930F4BFF -:107450001F600F4B00221A7069460E4A00F0FAF8BE -:1074600068B9336801330AD09DF81D3013B9064856 -:1074700000F066FB01220849034800F09FFA09B0BA -:10748000F0BD00BFB0960F0078400020B459002036 -:10749000B959002095730F00B8590020074908B565 -:1074A00001220870064800F007FA112804D00028CD -:1074B00014BF0320002008BD0420FCE7BA590020B7 -:1074C0007840002008B5024800F082F9002008BD8D -:1074D000784000200028C3B2A8BF00F160424FEA04 -:1074E000501010B5BABF0D4A03F00F0402F5614207 -:1074F0004FEA41114FEA8000C9B200F16040B4BFC9 -:10750000115582F8001300F5614003F01F020123BA -:107510009340C0F88031036010BD00BF14ED00E05F -:107520000023435082B043580193019B02B070473F -:107530000023435082B043580193019B02B070472F -:107540000A4610B54FF48E71FFF7EAFF938A9168EF -:107550009BB2C95C938A01339BB29382C0F81C151D -:1075600010BD1FB5002382688DF800308DF808101B -:1075700083750192D0E900136846984705B05DF81D -:1075800004FB08B502464FF492710068FFF7C8FF8C -:107590004FF484711068FFF7C3FF136801221A606B -:1075A00008BD10B5CB7D0A464FF4847123B9FFF7AF -:1075B000B7FFD0F8183510BDFFF7B2FF537ED16882 -:1075C000D0F81805C854537E0133DBB25376F2E786 -:1075D0001FB501238DF80030054B8DF8080001918F -:1075E0006846D3E90012904705B05DF804FB00BF80 -:1075F000BC5900201F2886BF00F01F00044B4FF02D -:10760000A04300F5E070032243F82020704700BF3C -:10761000000300501F2886BF00F01F00044B4FF0EE -:10762000A04300F5E070022243F82020704700BF1D -:10763000000300501F2886BF00F01F00044A4FF0CF -:10764000A042012303FA00F0C2F80805704700BF0A -:1076500000030050F8B50679594D7601AB1917466D -:10766000DA7E0446002A40F0A8804A7F1A7708682C -:10767000431C04D0FFF7DEFF0868FFF7BBFF4B6831 -:10768000581C0BD01F2B86BF03F01F034D4A4FF031 -:10769000A04203F5E073002042F82300237922681A -:1076A000886905EB43131B7FC2F824052268002B71 -:1076B00068D0087D4B7D0343C2F86C35D1E90002E8 -:1076C0002368C3F80C05C3F814250B7D012B1DD1CD -:1076D0008B685A1C0BD01F2B86BF03F01F03394A3F -:1076E0004FF0A04203F5E073002042F82300C86881 -:1076F000431C04D0FFF79EFFC868FFF77BFFD1E96A -:1077000002202368C3F80805C3F81025AB195F6091 -:107710000B69AB5127B323790A7F206805EB43132C -:107720001B7F002B3BD04FF48871FFF701FF4FF414 -:1077300090712068FFF7FCFE4FF492712068FFF70C -:10774000F7FE4FF4A2712068FFF7F2FE23681E498E -:10775000C3F804132068114640F30730FFF7BAFE60 -:107760002379226805EB43131B7F23B30823354499 -:10777000C2F8003500200123E8752876A875EB765D -:10778000A876F8BD087D4B7D0343C2F86C35D1E97E -:1077900000202368C3F81405C3F80C2595E74FF4BF -:1077A0008E71FFF7BDFE4FF4A2712068FFF7B8FE9F -:1077B00023680649CCE70423D9E70820E1E700BFA6 -:1077C000BC5900200003005010030200800002009A -:1077D0002DE9F0410479344903686401024608192F -:1077E000007F00B10020C3F800050B195B68B3B13E -:1077F0001379106801EB43131B7F002B42D02B4BF6 -:10780000C0F8083313681B0B58B20125400903F078 -:107810001F0305FA03F32030254D45F82030107979 -:10782000136801EB4010007F70B34FF0FF35D3F8C1 -:107830000C05D3F81485D3F80865D3F81075C3F890 -:107840000C55C3F814551368C3F80855C3F8105500 -:10785000451C01D0FFF7DEFEB8F1FF3F02D04046E5 -:10786000FFF7D8FE7A1C02D03846FFF7D3FE731C10 -:1078700002D03046FFF7CEFE21440023CB764B608A -:10788000BDE8F0810B4BBBE74FF0FF35D3F80C059B -:10789000D3F81485D3F80865D3F81075C3F81455D8 -:1078A000C3F80C55CFE700BFBC59002010030200FD -:1078B00000E100E0840202002DE9F04103793E4E30 -:1078C0005B010446F018007F20B101F06040B0F188 -:1078D000005F6DD13344987D00286BD19A75996013 -:1078E000988294F804804FEA4817F5192B7F53B318 -:1078F0004FF490712068FFF71BFE4FF4AC712068C5 -:10790000FFF716FE2368AA7DA968C3F84415C3F8DB -:107910004825236801229A606B6813B10020BDE8F6 -:10792000F0812268D2F82011D2F8583119B9002B11 -:10793000F8D00F2003E0002B14BF0F200020F31914 -:1079400000229A75EBE74FF48E712068FFF7E8FD8F -:10795000236801229A6006EB481841462068FFF729 -:10796000EFFD6B68002BD9D1A97DAA8A91420DD871 -:10797000AB8A9BB2B3F5807FDBD02368D3F81C21A0 -:10798000002AFBD00122DA600020D8E72068D0F876 -:107990001C3123B9AB8A9BB2B3F5807FF7D1AB8A98 -:1079A0009BB2B3F5807FE0D04146FFF7C9FDDBE72E -:1079B0001020B4E71120B2E7BC5900202DE9F843AC -:1079C00003795E4D5B010F46E91806460C7F2CB12A -:1079D00007F06041B1F1005F40F0AB80E918486802 -:1079E00028B13168BCB14FF40474C1F808432B448A -:1079F000DC7DB4B1197E00294ED048B133793268AC -:107A000005EB43152B7F4BB14FF40473C2F80433DD -:107A10001120BDE8F8834FF40174E6E74FF40173D9 -:107A2000F4E7DA75DF605C761C7696F804904FEA2E -:107A3000491805EB0803197F00293ED04FF48871DF -:107A40003068FFF775FD4FF4A2713068FFF770FDE5 -:107A50003368C3F83475C3F83825336804BB012292 -:107A60001A60337932685B01E9184968F9B9D2F8CC -:107A70001041D2F84411D2F8240114B909B90028F0 -:107A8000F5D01D4400239842EB7514BF032018461F -:107A90000029BED00F20BCE71F611A760124C4E77D -:107AA000D3F8002242F02002C3F80022D9E74FF4B5 -:107AB0000473C2F804330020ABE79B7E1BB914B9F2 -:107AC0003046FFF75EFD05EB080730687B685BBB5F -:107AD0004FF4A271FFF724FD05EB49193068D0F887 -:107AE0002431D0F80821D0F8444172B90CB9002BE8 -:107AF000F4D045440022EA75EBB9002CCAD1A97E26 -:107B00003368012271B11A60D5E7002BF1D1002C46 -:107B1000EFD14946FFF745FD7B7EFA7D9A42DDD8DD -:107B20002346E6E75A60C6E74FF40173C0F8043312 -:107B3000C1E710206DE703206BE700BFBC590020B0 -:107B400038B50379074C04EB431305461A7F42B955 -:107B50009B7E33B9FFF715FD2B7904EB431401230A -:107B6000A37638BDBC5900207FB5774C774A237F78 -:107B7000002B64D0D2F82461002E3FD04FF49271D4 -:107B80001046FFF7D5FC02238DF80030D2F8803480 -:107B9000C2F880340393D2F83C358DF80830E3689E -:107BA00001930023E37523766846D4E900139847D0 -:107BB000664AD2F8443173B14FF4A2711046FFF710 -:107BC000B7FCE37D3BB10023E375D2F83C05E168E7 -:107BD000C0B2FFF7FDFC5D4AD2F8203163B14FF42B -:107BE00090711046FFF7A4FCA37D2BB1D2F84C1581 -:107BF0005548C9B2FFF7B5FC04B070BDD2F81031DA -:107C0000002BD5D010464FF48871FFF791FCD2F8C5 -:107C10003C35E07DDBB29842CAD1237EE16863B196 -:107C2000D2F8005225F02005C2F80052E37523690E -:107C3000E3602676FFF7CCFCBAE7E375FAE7D2F803 -:107C40000433990548D5D2F82431002B44D04FF4A1 -:107C500092711046FFF764FC4FF40173C2F80833C9 -:107C6000A37E0BB9012353600223384A8DF80030FC -:107C7000D2F88034C2F880340393E37D8DF8083065 -:107C8000E36801930023E37523766846D4E9001383 -:107C900098472E48D0F81C3133B1A38AA27D9A426E -:107CA00046D92949FFF74CFC284AD2F84431002B29 -:107CB000A2D04FF4A2711046FFF732FCA37E0BB1A5 -:107CC00001231360E37D002B96D00023607EE168E2 -:107CD000E375FFF77DFC8FE71C4DD5F804335B0798 -:107CE000D7D5D5F80831002BD3D017492846FFF750 -:107CF00058FC637EE27D9A42CBD1237E53B1E3757B -:107D00002369E168E3600023607E23766376FFF7F2 -:107D10005FFCBEE7A37E0BB901236B600B4B4FF4F6 -:107D20000172C3F808230023E375607EE168EEE783 -:107D30004FF48E71FFF7F4FBA17D0029B4D0024807 -:107D4000FFF70FFCB0E700BFBC5900200020004047 -:107D50006DDF704772DF704779DF70477DDF7047F6 -:107D600064DF70472DE9F74F0C9CBDF834B02788CD -:107D7000002580468A4691462E46B8F80020B24239 -:107D80000BDC35B12288013AD21B92B2FF2A39D8D6 -:107D9000DA55002003B0BDE8F08FD8F8042052F87F -:107DA0002600019000220DF1030101A8FFF7D8FF82 -:107DB0000028EFD19DF803204A4521D12288002DCB -:107DC00014BF0020022002EB09010144594519DCCF -:107DD0003DB9013292B2228003F802A0228801321A -:107DE000228022880DF103011A4401A8FFF7B8FF91 -:107DF0000028CFD121889DF803200A442280012544 -:107E00000136BAE70C20C5E72DE9F341089CBDF81F -:107E100024501746CDE9004502220646FFF7A2FF8F -:107E200048B9102239463046CDE9084502B0BDE8D0 -:107E3000F041FFF797BF02B0BDE8F0812DE9F04FA8 -:107E4000002316881380436B85B007460D46144601 -:107E5000A3B1022E01D80C206AE11A7802230B701C -:107E6000238801339BB211212380E95423880133F5 -:107E70009BB22380EA542388013323803A6BE2B11A -:107E8000238803F11201B142E5D81121E954238876 -:107E900001339BB210212380E954238801332380CE -:107EA00002F10F03013A218813F80109685421886F -:107EB000934201F101012180F5D197F82E2012B3F0 -:107EC0002388D91CB142C6D80221E9542388013342 -:107ED0009BB21C202380E854238801339BB2013AD3 -:107EE0002380032A00F23181DFE812F0040007004A -:107EF000090014010022EA5402E00122FBE7E954E0 -:107F000023880133238097F82D3053B32388093316 -:107F1000B342A0D802A8FFF71BFF002840F0088159 -:107F200023880822EA54238801339BB21B22238032 -:107F3000EA542088013080B2208006220DF1090128 -:107F4000284401F05AFB23889DF8082006339BB291 -:107F500012F0FE0218BF01222380EA542388013365 -:107F60002380BB7803B323880433B3423FF673AF57 -:107F700002A8FFF7F1FE002840F0DA8023880322F0 -:107F8000EA54238801339BB219222380EA542388C0 -:107F9000BDF8082001339BB2E9182380EA54120A85 -:107FA0004A70238802332380FA78A2B12388D91C2F -:107FB000B1423FF650AF0221E954238801339BB20E -:107FC00001212380E95423880B449BB22380EA5487 -:107FD00023880B4423807A68B2B12388D91CB1422C -:107FE0003FF639AF022192F90020E954238801338A -:107FF0009BB20A212380E954238801339BB223805A -:10800000EA542388013323803B89002B40F084808D -:108010003B8A5BB1CDE900462B460722032107F1DD -:108020001000FFF7F1FE002840F082803B8B53B137 -:10803000CDE900462B461522142107F11800FFF761 -:10804000E3FE002874D13A6A002A74D1D7F824805C -:10805000B8F1000F30D0B8F804302188981C8A1C81 -:108060000244B2423FF6F7AEFE283FF6F4AE0333C9 -:108070006B54238801339BB2FF222380EA54238868 -:1080800001339BB22380B8F80020EA54E918120AA1 -:108090004A702088023080B22080B8F804205AB19B -:1080A000D8F80810002950D0284401F0A6FA2388F7 -:1080B000B8F804201344238097F82C30002B7FD18C -:1080C0003878A8B33B88012B3FD0228802F1020CFC -:1080D000B4453FF6C0AE012805D17B780233134486 -:1080E0009E42FFF4B8AE023EB61A04A9B6B221F819 -:1080F000086D05EB0C00FFF731FEC8B93B78022B89 -:1081000040F0A180BDF80830B34240F2B780ADF82E -:108110000860A1E00322EEE6CDE900462B460622E8 -:10812000022107F10800FFF76FFE00283FF470AF4F -:1081300005B0BDE8F08FB4F800C00CF10603B342FF -:108140003FF689AE1188052901D80720F0E76FF4C2 -:10815000486E01EB0E039BB24FF27D3E7345F4D99E -:108160005388052BF1D96FF44860181880B2704518 -:10817000EBD94FF6FF70814203D0834201D0994280 -:10818000E3D8052305F80C30238801339BB2122174 -:108190002380E954238801339BB223801188E9545A -:1081A000E818090A4170238802339BB22380528861 -:1081B000EA54E918120A4A7023880233238045E7FB -:1081C000BB6A002BC1D04FF000094FF00C0A4FF0F2 -:1081D000160B97F82C305FFA89F293427FF670AF56 -:1081E000B96A0AFB02F201EB0208B8F80430981CE5 -:1081F000FE283FF630AE208803332B54238801330A -:108200009BB2238005F803B0238801339BB22380FF -:108210008A5AEA54E918120A4A702088023080B259 -:108220002080B8F804205AB1D8F8081000298CD062 -:10823000284401F0E2F92388B8F80420134423808D -:1082400009F10109C5E7012B7FF461AF7B789E42FC -:10825000FFF45DAFADF808300821BDF80830FE2B03 -:108260003FF6F9AD22880133AB542288013292B235 -:108270002280A95422881344238059E70921ECE77E -:1082800030B597B01F230D46ADF80430ADF8063079 -:10829000044648B3C3785B0702D4072017B030BD4B -:1082A00001AA06A9FFF7CAFD0028F7D106ACF5B16F -:1082B000EB78002BF1D10DF106020EA92846FFF74D -:1082C000BDFD0028EAD10EADBDF80430ADF80C308C -:1082D00004AABDF80630029402A900200495ADF866 -:1082E0001430FFF737FDD9E7ADF80400DFE7ADF84C -:1082F0000650E9E775DF704776DF70477ADF704731 -:108300007BDF704737B5164B18884FF6FF739842DE -:1083100010D0144A144D1378297B0133DBB29942F3 -:1083200013702C4608D31149FFF7E4FF10B1AB6975 -:1083300003B1984703B030BD002313702B7C33B1D9 -:108340003B21FFF7D9FF10B1AB6903B198476369CF -:10835000002BEFD002A8002200F8042DE9E700BFAF -:10836000DE5900202C5A0020E0590020245A002019 -:1083700037B5174B174A5B881188174C174D994230 -:1083800008D852889A4205D36369F3B900232B7049 -:1083900003B030BD2A783AB16369002BF6D002A849 -:1083A000002200F8042D0EE00D48D4E901130078F6 -:1083B000002818BF19460B48FEF764F90028E5D0DD -:1083C000A369002BE2D09847E0E702A80122E8E782 -:1083D0001C5A0020245A0020E0590020DC590020BB -:1083E0002C5A0020FC59002070B5054606460FCDDA -:1083F000114C0FC495E80700104B84E807000022D9 -:108400001A7032680E489AB113680360536843606B -:10841000FFF774FF78B90B4B0B484FF6FF721A80C9 -:108420000A4B0B4A00211970BDE87040FEF718B9DD -:10843000FFF766FFEEE770BDE0590020DC59002031 -:10844000245A0020DE590020D0960F002C5A00201C -:1084500005830F000148FEF755B900BFFC59002005 -:1084600010B50388112B2DD002D8102B16D010BDBB -:10847000122B3AD0502BFAD11F4CC288E3899A4272 -:10848000F5D1038A022BF2D1837CDB0716D41B487B -:10849000FEF738F90028EAD0A36921E0184B82885A -:1084A0001A8000F1100303CB164A174B106051607D -:1084B00000221A70104BDB89002BD8D1BDE8104088 -:1084C000FFF756BF0E4B0D484FF6FF721A800E4B4A -:1084D00000221A70FEF716F90028C8D0064B9B69D7 -:1084E000002BC4D0BDE81040184700F1080303CBAF -:1084F000044A10605160E1E7E0590020FC59002077 -:10850000DE5900201C5A00202C5A002038B50446A1 -:1085100008460D4601F07CF86560208038BDA0DF7C -:108520007047A2DF7047A5DF7047A6DF7047A8DF5E -:10853000704762DF704700002DE9F0470F4694B0A6 -:108540000546002800F02E81002900F02B814B68A1 -:10855000002B00F027814FF6FF730380924B04AA93 -:1085600003F1100C164618685968144603C4083302 -:1085700063452246F7D114AB41F230520DF10A01A6 -:10858000304623F8482DFFF7D4FF0446002840F07A -:1085900005812A1D19460120FFF7C1FF0446002866 -:1085A00040F0FC809DF80A30AB7101461C220DA8FA -:1085B000FBF7B8FE9DF834300E9443F004038DF8B9 -:1085C000343001AEAB798DF80E30214641F2325392 -:1085D00003223046CDE91044CDE91244ADF80C3009 -:1085E000FBF7A0FE9DF8043064F3030364F3071364 -:1085F0008DF804309DF805304FF0010A6AF303034B -:108600006AF307138DF805309DF806306AF34203CC -:1086100064F3C30364F30413DBB243EA0A032146A1 -:10862000142208A88DF806300DF10C08FBF77AFE2D -:108630004FF0140905F1080308AA0DA9A8880A94A7 -:108640000C94CDE90886ADF82C90FFF76AFF04463C -:10865000002840F0A38001461C220DA8FBF762FE13 -:108660009DF834300E9443F018038DF83430AB7914 -:108670008DF80E30214641F2315303223046CDE9C8 -:108680001044CDE91244ADF80C30FBF74BFE9DF8D9 -:10869000043064F3030364F307138DF804309DF88A -:1086A00005306AF303036AF307138DF805309DF86C -:1086B00006306AF3420364F3C303DBB243F01103F1 -:1086C00021464A4608A88DF80630FBF72BFE1723F3 -:1086D000ADF82C3008AA05F110030DA9A8880A945A -:1086E0000C94CDE90886FFF71CFF0446002855D1FD -:1086F00001461C220DA8FBF715FE9DF834300E94A0 -:1087000043F002038DF83430AB798DF80E302146FA -:1087100041F2345303223046CDE91044CDE91244EE -:10872000ADF80C30FBF7FEFD9DF804306AF303034F -:108730006AF307138DF804309DF8053064F30303E2 -:1087400064F307138DF805309DF806306AF3420391 -:1087500064F3C30364F30413DBB243EA0A03214660 -:108760004A4608A88DF80630FBF7DCFD02230A9381 -:10877000ADF82C3008AA05F120030DA9A8880C97A4 -:10878000CDE90886FFF7CDFE044638B97B68AB62B9 -:10879000BB6803B1EB62054B01221A70204614B08E -:1087A000BDE8F0870E24F9E7D4960F002D5A00207B -:1087B00070B5054686B070B302884FF6FF739A42D3 -:1087C0002BD0174B1B7843B3164C1022080AE170CC -:1087D000207121FA02F0090E072301266071A171B0 -:1087E00002A800216370ADF806302270A670FBF776 -:1087F00099FD2B8AADF808300023ADF80C3002A9A2 -:108800000DF1060328888DF80A60CDE90434FFF7DE -:108810008CFE06B070BD0E20FBE70820F9E700BF14 -:108820002D5A00202E5A002030B5054687B060B37F -:1088300002884FF6FF739A4229D0164B1B7833B348 -:10884000154C112323700B0A6170A3700B0C090ED9 -:10885000E370217105230021102202A8ADF8063033 -:10886000FBF760FD2B8AADF8083001238DF80A3044 -:108870000023ADF80C3002A90DF106032888CDE9DC -:108880000434FFF752FE07B030BD0E20FBE708208E -:10889000F9E700BF2D5A00202E5A002030B50446BB -:1088A00087B038B300884FF6FF73984224D0134B3B -:1088B0001B780BB3124D102369700321ADF806101D -:1088C000AA7000211A4602A82B70FBF72BFD238A01 -:1088D000ADF8083001238DF80A300023ADF80C30D4 -:1088E00002A90DF106032088CDE90435FFF71DFE2E -:1088F00007B030BD0E20FBE70820F9E72D5A002015 -:108900002E5A002070B50D4688B0044640B139B1EA -:10891000826A2AB10B88112B59D003D8102B43D06F -:1089200008B070BD502B42D0512BF9D18B79022B5E -:10893000F6D10A89038A9A42F2D18B7B043B022B3F -:10894000EED99DF8163043F001038DF816300B8AEE -:10895000ADF818304B8AADF81A30022601F1140335 -:108960000822002101A807938DF81060FBF7DAFCBC -:1089700001AAA18A20880196CDF808D0FFF7D3FD7F -:10898000034638B3E36A03B1984740F2FD1304A9E4 -:108990002088ADF81430FFF7CAFD0028C0D0E36A84 -:1089A000002BBDD09847BBE78B882380B8E7C988E8 -:1089B00003899942B4D108238DF81030123535F867 -:1089C000023C8DF81830059504A99047A8E74FF6AA -:1089D000FF73EAE79DF800202088D207D5D504A9C7 -:1089E000ADF81430FFF7A3FD0028D8D1297D4B1E28 -:1089F000072B41D8DFE803F0041A2327292B3E2D4B -:108A000000238DF804306B8A012B05D80622012142 -:108A10002046FFF743FFC0E7012315358DF80C30E2 -:108A20000295A36A01A92046984779E76A8A01233B -:108A30009A428DF80430F0D806220221E8E702239A -:108A40008DF80430EDE70323FAE70423F8E7052364 -:108A5000F6E76B8A022B02D803220821D8E7AA7D09 -:108A60006B7D43EA0223ADF808300BB90723E7E733 -:108A70000623E5E70923E3E70322C9E7A0DF704700 -:108A8000A2DF70472DE9F04381468FB01546984626 -:108A90000E4611B90846FDF757FF15B92846FDF7F0 -:108AA00053FF1C220DEB02000021FBF73BFC9DF85D -:108AB0001C30ADF80490002443F002030127214646 -:108AC000032268468DF81C300894CDE90A44CDE9AC -:108AD0000C448DF80670FBF725FC98F800308DF8F3 -:108AE000003098F801308DF801309DF8023067F3BE -:108AF000420303F0E70364F300032146142202A8B3 -:108B00008DF80230FBF70EFC0A48CDF80CD001AB13 -:108B1000029302AA169B0088ADF8105007A9ADF881 -:108B20001240ADF814500696FFF7AAFF0FB0BDE84B -:108B3000F08300BF6E5A002030B587B006A941F619 -:108B40000A03044621F80C3D01205A4A8DF80E0014 -:108B5000FFF794FF0546002849D12288002A49D111 -:108B6000228952B1544B0093E16804F13C0342F670 -:108B70002420FFF787FF002847D1228A52B14F4BAC -:108B80000093616904F13C0342F62520FFF77AFF68 -:108B900000283AD1228B52B1494B0093E16904F18C -:108BA0003C0342F62720FFF76DFF00282DD1228CD1 -:108BB0004AB1444B0093616A04F13C0342F626201B -:108BC000FFF760FF08BB228D4AB13F4B0093E16A7B -:108BD00004F13C0342F62820FFF754FFA8B9236BA9 -:108BE000ABB9616B002938D1A36B002B42D1284669 -:108BF00007B030BD354B0093616804F13C0342F689 -:108C00002920FFF73FFF0028AAD00546EFE71A68A2 -:108C10008DF810201A68120A8DF811205A888DF8E4 -:108C20001220DA788DF813205A688DF814209B688A -:108C30008DF815301A0A1B0C8DF81730244B8DF85F -:108C400016200093082204F13C0304A942F62320D5 -:108C5000FFF718FF0028C4D0D7E71E4B0A7900930E -:108C6000096804F13C0342F62A20FFF70BFF0028B5 -:108C7000BAD0CAE71A788DF810205A888DF81120DA -:108C8000120A8DF812209A888DF81320120A8DF896 -:108C90001420DB888DF815301B0A8DF816300E4B2A -:108CA0000093072204F13C0304A942F65020FFF789 -:108CB000E9FEAAE76E5A00204E5A0020665A0020AC -:108CC0003E5A0020365A0020705A0020465A002092 -:108CD000785A00205E5A0020565A002029DF70473B -:108CE00028DF704737B50B460C465A6814F80C1B42 -:108CF000DD680092044A5B6952F82550024620461E -:108D0000A84703B030BD00BF805A002038B5184CCA -:108D10002378182202FB03431A795D69012A03D0E4 -:108D2000032A18D00F2015E0124A996910689A6832 -:108D3000DB680003121AB2F5805F1D44014438BF9E -:108D40009208284428BF4FF48062FFF7C7FF08B994 -:108D50000123A37038BD4FF080531869054B80B2D2 -:108D6000B5FBF0F518682844FFF7BAFFEFE700BF3E -:108D7000905A0020885B002070B5134D6C780A2C47 -:108D80001FD02E783444E4B2092C84BF0A3CE4B2EC -:108D9000182606FB0454A261207103C9A360049B3A -:108DA000E360AB7804F1100282E8030023B10020F5 -:108DB0006B7801336B7070BDFFF7A8FF1128F7D1F6 -:108DC000F5E70420F7E700BF905A0020F8B52749DF -:108DD0008B780C462BB1002602288E7002D0032817 -:108DE0003AD0F8BD0D78224A182101FB05411368DD -:108DF00089680133B1EB033F13601BD863781660B9 -:108E0000013B63706B1CDBB218270426092B17FB90 -:108E1000056188BFA5F10903214400202370FFF7F5 -:108E200061FF07FB05430022C3E904621A719A60DF -:108E30009A61DA606378002BD3D0A378002BD0D16D -:108E4000FFF764FF0028CCD01128CAD0217818235E -:108E500003FB0141043105E00B78182202FB0311EA -:108E600004310D20BDE8F840FFF73CBF905A0020C8 -:108E7000885B00200D4A002313600D4A04201380F4 -:108E8000937002F1F001137193609361D360C2E9B2 -:108E9000040318328A42F6D1064A1360064A0020BB -:108EA000C2E90033C2E90233704700BF885B00208B -:108EB000905A0020845B0020805A0020074A1368E3 -:108EC000042B1FBF0B60591C1160054A1DBF0168B0 -:108ED00042F8231000201846704700BF845B002032 -:108EE000805A002013B5CC180C43A40708D1009376 -:108EF00013460A4601460120FFF73EFF02B010BDAF -:108F00001020FBE707B500220B4600920146032024 -:108F1000FFF732FF03B05DF804FB0000054B1B6850 -:108F2000082B01BF044B1868B0FA80F0400918BF45 -:108F300000207047300100103401001008B5FFF721 -:108F4000EDFF40B14FF080430022C3F80C21C3F87D -:108F50001021C3F83825FFF7E1FF002846D04FF075 -:108F600080525E4BD2F80414C3F82015D2F80814CE -:108F7000C3F82415D2F80C14C3F82815D2F810142D -:108F8000C3F82C15D2F81414C3F83015D2F81814FD -:108F9000C3F83415D2F81C14C3F84015D2F82014C5 -:108FA000C3F84415D2F82414C3F84815D2F828148D -:108FB000C3F84C15D2F82C14C3F85015D2F830145D -:108FC000C3F85415D2F83414C3F86015D2F8381425 -:108FD000C3F86415D2F83C14C3F86815D2F84014ED -:108FE000C3F86C15D2F84424C3F87025FFF796FF38 -:108FF00010B13B4B3B4A1A60FFF790FF18B13A4B58 -:10900000FB22C3F81825FFF789FF48B13749384BD1 -:109010000A681B6822F00F0203F00F0313430B6072 -:10902000FFF77CFF18B1334B4FF400721A60FFF763 -:1090300075FF48B14FF08043D3F80024D20744BFF6 -:109040006FF00102C3F800242B4AD2F8883043F4B1 -:109050007003C2F88830BFF34F8FBFF36F8F4FF0AC -:109060001023D3F80022002A03DBD3F80432002BAC -:109070002FDA224B0122C3F80425D3F80024002A5A -:10908000FBD04FF010221221C2F80012D3F80024B6 -:10909000002AFBD04FF010231222C3F80422174BF2 -:1090A0001A46D3F800140029FBD00021C3F8041598 -:1090B000D2F80034002BFBD0BFF34F8F0E49104B7A -:1090C000CA6802F4E0621343CB60BFF34F8F00BF66 -:1090D000FDE70C4B0C4A1A6008BD00BF00C0004001 -:1090E0008C5600404881030000F00040E40E004030 -:1090F000580200104096024000ED00E000E0014000 -:109100000400FA05804000200090D00348DF70473B -:1091100010DF704761DF704708B5FDF723FC08BD1D -:109120002DE9F743214B1B7803F0FF08ABB1204D2D -:10913000204E2B683268B3FA83F77F09A2B963B176 -:1091400044461EE033680198984718E0444616E00C -:109150002A681846904726E034B103B0BDE8F08392 -:10916000002CFAD14446274601A8FFF7CFFF052877 -:109170000446EBD00028E5D0FDF7E6FB0024002FE5 -:10918000EAD10D4FDFF834903B88ADF80430D9F8C0 -:10919000003001A91846FFF7BDFF0528E0D00028E0 -:1091A000D6D0FDF7D1FB002CEED1DCE7985B002098 -:1091B000905B00209C5B00208C5B0020A05B00206B -:1091C00010B511B38C0720D1124C216012490A80CE -:1091D000124A13491360FFF79BFF88B9114B012214 -:1091E0001A70114A92F816335B09012B0FD9042B20 -:1091F0000DD00E4B996821B11A6842F480021A60B2 -:1092000010BD4FF480031360FAE70720F8E742F23D -:109210000200F5E7A05B00208C5B0020945B00203F -:1092200019910F00985B002000E100E0A45B002092 -:1092300018B1034B1860002070470E20704700BF24 -:10924000905B002018B1034B1860002070470E207F -:10925000704700BF9C5B002008B5074B1B682BB113 -:10926000984738B1BDE80840FDF76EBBBDE808403F -:10927000FFF756BF08BD00BF945B002008B511B1D1 -:109280000020FDF761FBBDE80840FFF749BF000083 -:109290000021024A0846FDF7ABBA00BF7D920F00DD -:1092A0000649074A074B9B1A03DD043BC858D050B8 -:1092B000FBDCFFF743FEFAF7C3FF0000F0960F0058 -:1092C000004000208C400020FEE7FEE7FEE7FEE7BE -:1092D000FEE7FEE7FEE7FEE7FEE7FEE753B94AB921 -:1092E000002908BF00281CBF4FF0FF314FF0FF30AE -:1092F00000F072B9ADF1080C6DE904CE00F006F88B -:10930000DDF804E0DDE9022304B070472DE9F04701 -:10931000089E04468846002B4BD18A42154667D9E1 -:10932000B2FA82F24AB1C2F1200701FA02F320FA3E -:1093300007F7954047EA030894404FEA154E230C7F -:10934000B8FBFEF71FFA85FC0EFB178843EA0843BB -:1093500007FB0CF1994209D9EB1807F1FF3080F0B7 -:109360001B81994240F21881023F2B445B1AA4B240 -:10937000B3FBFEF00EFB103344EA034400FB0CFC8D -:10938000A44509D92C1900F1FF3380F00781A445C9 -:1093900040F2048102382C4440EA0740A4EB0C045C -:1093A00000271EB1D4400023C6E900433946BDE87A -:1093B000F0878B4209D9002E00F0EB800027C6E928 -:1093C000000138463946BDE8F087B3FA83F7002F2D -:1093D00047D18B4202D3824200F2FA80841A61EBB9 -:1093E000030301209846002EE0D0C6E90048DDE7DF -:1093F00002B9FFDEB2FA82F2002A40F08F80491BE8 -:109400004FEA154E1FFA85F80127B1FBFEFC230C2D -:109410000EFB1C1143EA014308FB0CF1994207D9EA -:10942000EB180CF1FF3002D2994200F2CD80844655 -:10943000591AA3B2B1FBFEF00EFB101443EA044428 -:1094400008FB00F8A04507D92C1900F1FF3302D220 -:10945000A04500F2B6801846A4EB080440EA0C4090 -:109460009FE7C7F1200CBB4022FA0CFE4EEA030E28 -:1094700001FA07F420FA0CF521FA0CF34FEA1E4822 -:109480002543B3FBF8F92C0C08FB19331FFA8EFAAD -:1094900044EA034309FB0AF49C4202FA07F200FA89 -:1094A00007F10BD91EEB030309F1FF3080F0878031 -:1094B0009C4240F28480A9F1020973441B1BADB2A7 -:1094C000B3FBF8F008FB103345EA034400FB0AFA4B -:1094D000A24508D91EEB040400F1FF336BD2A2456C -:1094E00069D90238744440EA0940A0FB0289A4EB20 -:1094F0000A044C45C2464B4654D351D0002E69D085 -:10950000B1EB0A0564EB030404FA0CFCFD40FC40DB -:109510004CEA0505C6E90054002747E7C2F12003DD -:1095200020FA03F7954001FA02F021FA03F34FEA1B -:10953000154E3843010CB3FBFEF71FFA85F80EFBFE -:10954000173341EA034107FB08F38B4204FA02F4A4 -:1095500007D9691807F1FF3C2FD28B422DD9023F62 -:109560002944CB1A81B2B3FBFEF00EFB103341EA63 -:10957000034100FB08F38B4207D9691800F1FF3C57 -:1095800017D28B4215D902382944C91A40EA074735 -:109590003BE73746304609E70746E7E61846FBE66D -:1095A0004145ABD2B8EB020A69EB0E020138134613 -:1095B000A4E76046E9E7184695E76746D1E78146A4 -:1095C0007CE702382C4447E7ACF1020C2B442FE730 -:1095D000384608E73746E9E6704700BF30B5002453 -:1095E000A24201D1002007E0035D01340D1915F8F6 -:1095F000015CAB42F4D0581B30BD10B5431E0A4489 -:10960000914200D110BD11F8014B03F8014FF7E76B -:10961000034613F8012B002AFBD1181A01387047B2 -:10962000F8B500BFF8BC08BC9E467047F8B500BF4F -:10963000F8BC08BC9E46704700400020B4400020A3 -:1096400000100207A4440020CC440020416461447F -:10965000465500416461667275697420496E64758F -:1096600073747269657300426C75656672756974AE -:109670002046656174686572203532383430005395 -:1096800031333220352E312E302C20352E312E30F4 -:1096900000000000080000000600000005000000B7 -:1096A000070000000100000000E0D7016059002021 -:1096B000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBA -:1096C00000000000000000000000D60107010000BB -:1096D000FC59002023D1BCEA5F782315DEEF12127B -:1096E000000000000000000058ABFF7F01000000F8 -:1096F000000000000000000000000000000000006A -:109700000000000000000000000000000000000059 -:109710000000000000000000000000000000000049 -:109720000000000000000000000000000000000039 -:109730000000000000000000000000000000000029 -:109740000000000000000000000000000000000019 -:109750000000000000D00E00FFFF000032000000FB -:10976000CD6C0F003D6D0F00002000400000000098 -:0C9770000090D00325420F0001420F00C2 +:1060D00000BF00BF00BF00BF00BF00BF00BF00BFC8 +:1060E00000BF00BF00BF00BF00BF00BF00BF00BFB8 +:1060F00000BF00BF00BF00BF00BF00BF00BF00BFA8 +:1061000000BF00BF00BF00BF00BF00BF00BF00BF97 +:1061100000BF00BF013BC3D1704700BF80400020DB +:106120000024F4000C4B0D484FF4003210B5C3F8B6 +:10613000802001244FF48033C0F84833C0F808337E +:106140004460FFF7A9FF064B846000201860FFF74A +:10615000A3FF044B187010BD00E100E000100140E7 +:106160005C4500204D4500202DE9F3412549264B93 +:106170000025C1F84051C1F84451C1F84851C1F857 +:106180004C51C1F80051C1F804511B68002B34D0A8 +:10619000D1F804451D49DFF888800968641A24F0A5 +:1061A0007F442F461A68A24212D8A41A15441A7CBA +:1061B000DE6962B15A691F7400929B69019342467D +:1061C0000821684600F050FA08B100F0E5FABEB9BF +:1061D0000F4B104A197813788B4205D10133DBB28B +:1061E000022B08BF0023137012780B4B43F8225088 +:1061F0000A4B4FF48012C3F8002102B0BDE8F081D1 +:106200003346CFE700100140604500205C45002088 +:1062100058450020594500205045002000E100E08D +:1062200031600F002DE9F74FA44AA549137809788A +:10623000A44C99423BD00133DBB2022B08BF0023B0 +:106240001370A1491278A14B0F6853F822003B1834 +:1062500023F07F4300220B602368154616469446C0 +:1062600013B942B1236006E0196881420DD902B129 +:106270002360091A196001272368DFF858920193F7 +:106280000026BDB9DFF858A263E0401A0E44D96871 +:10629000C3F800C0D3F81CE031B1BA1922F07F4234 +:1062A000C3E90121DD611D4601227346D8E70025BF +:1062B0002F46E1E72846ED69834A43681268DFF814 +:1062C00024E2D0F808C0991A21F07F41714500F20C +:1062D000A980614401600122027422680023C0E9A0 +:1062E0000133C361002A40F0A7802060C9E75A1C2F +:1062F0009AF80210D4F800B0D2B291428AF8002085 +:1063000004BF00228AF80020182202FB03A31A7996 +:106310009868022A73D0032A00F08180012A18D1DC +:10632000017CB1B9DA6842601A6982605A69C26058 +:106330009B698361664B1B78002BBDD04160BBE736 +:10634000984200F09E809846DB69002BF8D100232C +:1063500003749AF800309AF801209A42C7D1236852 +:1063600026B9019A934201D1002F42D0002B00F0B0 +:106370008580D3F80090574C534BD4F804651868C7 +:10638000554F351A3B7825F07F4503359BB94FF4BF +:106390008033C4F84433C4F80433504B4FF4003214 +:1063A0004FF00108C3F880211A60C4F80080FFF79D +:1063B00073FE87F80080A9452CBF4844401920F09F +:1063C0007F40C4F84005D4F804359B1B23F07F437D +:1063D000801B033320F07F4083420AD9D4F8043570 +:1063E000C4F84035FFF758FE3C4B4FF40032C3F879 +:1063F0000021374B00221A7003B0BDE8F08F5B46D6 +:10640000D846A2E78BF81020DBF81CB00123BBF1C3 +:10641000000FF7D1002B9CD0C4F800B099E70023FF +:106420001A46F4E7D31A23F07F43634534BFACEB3D +:106430000303002303604EE70168136899421BD8E9 +:10644000591A1160C26150E7A1EB0C01D3F81CC0CE +:106450001A46BCF1000F0AD06346D3F800C08C4541 +:10646000F2D3ACEB010CC3F800C09C4613460160AC +:10647000C0F81CC0D86104E71346EEE7FFF752FEF0 +:10648000B7E740450CD1DBF81C30236043B90E4917 +:106490000122C9F808200B600D4B1A70FFF7FCFDB4 +:1064A000C2690368C8F81C2012B111680B4413605C +:1064B00023689B4518BF012649E700BF58450020C7 +:1064C00059450020604500205C45002050450020D3 +:1064D0004C450020001001404D45002000E100E047 +:1064E00040440020FEFF7F0008B5FFF71BFE104B65 +:1064F00000200B2218809A700E4B18600E4B1870FB +:106500000E4B18700E4B4FF48012E021C3F880211F +:1065100083F814131A6002F18042A2F56F22C2F8C8 +:10652000080583F81113074BD2F804251A6008BD3B +:106530004044002060450020584500205945002077 +:1065400000E100E05C450020074B9B784BB132B185 +:1065500028B10368187C20B959745A617047072024 +:1065600070470820704700BF404400202DE9F743E2 +:106570001D4FBB7805460E4690469BB390B3042949 +:106580002ED9436973B3437C02A80024012B00F881 +:10659000014D0CBF8946A14600F01EF90DF1060021 +:1065A000FFF730FDD0B101230370104B4560D3F8E5 +:1065B0000435C0E90498C0E902369DF806307B70C6 +:1065C0009DF8070000F02CF924B9094B4FF4801214 +:1065D000C3F80021204603B0BDE8F0830424EFE7B0 +:1065E0000724F7E70824F5E74044002000100140A5 +:1065F00000E100E0064A92783AB130B1426922B136 +:10660000002202740221FFF71FBD0820704700BF5F +:1066100040440020014BD3F80405704700100140AE +:1066200012F0030310B511D1094C22604C1CE40098 +:10663000A4B22244074C2260074A1370074A137021 +:10664000074A1080074A1846118010BD0720FCE752 +:106650006C450020684500206445002074450020FA +:1066600070450020724500202DE9F3472B4D2B8803 +:106670008B4206460C4617464BD302A84FF0000843 +:1066800000F8018D00F0A8F8254B264A18781178FB +:10669000CBB2254909888B4238BF0133C0B238BF1D +:1066A0005FFA83F840452ED092F800801378DBB271 +:1066B000994286BF0133DBB2002313709DF80700B7 +:1066C00000F0AEF84FF6FF73984524D0DFF860A0D5 +:1066D000DAF800304FEAC80903EB090243F83870D2 +:1066E000A6B19CB1114B28881B68224608FB0030DC +:1066F000314602F05CFEDAF800304B4400209C800A +:1067000002B0BDE8F0874FF6FF78D7E70020908011 +:10671000F6E70920F4E70420F2E700BF7045002007 +:106720007445002064450020724500206845002023 +:106730006C450020F8B5124C124D264622782B7875 +:106740009A4200D1F8BD23780F48104A0788126892 +:106750000F48DBB219B202EBC10C006852F83120CD +:10676000BCF8041003FB070090470A4A23781288FC +:10677000DBB29A4286BF0133DBB200233370DDE720 +:106780007445002064450020704500206C450020C1 +:1067900068450020724500201FB50021CDE9021098 +:1067A00001AA44F20100ADF8041000F003F805B0AE +:1067B0005DF804FBBFF34F8F0549064BCA6802F42E +:1067C000E0621343CB60BFF34F8F00BFFDE700BF14 +:1067D00000ED00E00400FA0570B5EFF3108672B624 +:1067E0000C4A946801239CB993600B4B0B4DD3F872 +:1067F000801029401160C3F88050D3F88410516094 +:106800004FF0FF32C3F88420047006B962B670BD41 +:106810000370FAE76C51002000E100E0FC06FFBDC8 +:1068200010B5084B9A685AB150B9EFF3108272B69E +:1068300005491C680C605C684C60986002B962B6DF +:1068400010BD00BF6C51002000E100E02AB11388A8 +:106850000144884204D1184670474FF6FF73F7E7AA +:106860005BBA10F8012B9BB25A40C2F3031353409A +:1068700083EA03331BB25A0102F4FF5253409BB226 +:10688000E7E70000064B074A00201870064B1A6025 +:106890000422C3E90120C3E90300C3E905007047EE +:1068A0007545002078450020E84E00200020704704 +:1068B00030B5F9B1124B5C6800220A60E4B1B0F562 +:1068C000167F1BD8D8681D680130013CD860186954 +:1068D0005C604FF4177404FB00540C60012101FA52 +:1068E00000F49969013000F00300214318619961B7 +:1068F000104630BD0E20FCE70420FAE70C20F8E734 +:10690000E84E0020F0B51D4B9A68A2B359691E6885 +:106910008D1A05F003052C464FF4177707FB046C1E +:10692000604512D1012101FA04F099694140996151 +:10693000002021465E68D3F818C04FF0010E714464 +:106940000024164401F003010AE0013404F00304BA +:10695000A142E3D11020EDE74AB1013A0D460124EE +:106960000EFA05F515EA0C0FA6EB0207F4D00CB1F0 +:10697000C3E90172F0BD0420FCE700BFE84E00202F +:10698000064A13691268013B4FF4177103F00303C1 +:1069900001FB0323C3F8580200207047E84E002093 +:1069A00030B5C0B1B9B10E4BDA68B2B1013ADA60B4 +:1069B0009A681D6801329A605A694FF4177404FB93 +:1069C000025404600132D4F85802086002F0030255 +:1069D0005A61002030BD0E20FCE70420FAE700BF1A +:1069E000E84E00203FB40C49086890B10B4B1C687E +:1069F0007CB10B4A1568CDE9025000238DF80430B4 +:106A00000B60136004AB13E90700234604B030BCED +:106A1000184704B030BC70470C4F0020104F0020C6 +:106A20001C4F0020DC2810B509D0DD2810D0C0286C +:106A300016D1FFF7D7FF0E4B0E4A1A6010BD0E4A53 +:106A40000E4B19681368581C1060C022CA54F2E734 +:106A5000094A0A4B19681368581C1060DB22F5E7D5 +:106A6000064B054A196813685C1C1460C854E2E7B9 +:106A700070400020B16A0F000C4F00201C4F002016 +:106A8000C02802BF014B024A1A60704770400020C4 +:106A9000B16A0F0008B5DB2000F0DAFB10B9024B39 +:106AA000024A1A6008BD00BF744000204D6C0F0000 +:106AB000C02810B409D0DB280BD0094B094A19684B +:106AC00013685C1C1460C85406E05DF8044BFFF7C3 +:106AD00089BF054B054A1A605DF8044B704700BF3B +:106AE0001C4F00200C4F002070400020256A0F0032 +:106AF00010B5064A064C12682368D05C00F0A8FB6B +:106B000010B923680133236010BD00BF204F00205F +:106B1000144F002008B5C02000F09AFB28B9034BA1 +:106B20001B6813B9024B034A1A6008BD144F0020BA +:106B300074400020F16A0F007FB51C4C1C4E1D4DA7 +:106B4000226833689A4219D31B4B2B60FFF7E2FF90 +:106B5000002829D1194B01221A70194B1B681BB34D +:106B60008DF80420174A126802922268039204AA40 +:106B700012E9070004B0BDE870401847114B2268C5 +:106B80001B689A5CC02A03D022689B5CDB2B05D172 +:106B90000D4B2A689A4204BF0C4B2B602B68984718 +:106BA000042801D01128CBD104B070BD144F0020AF +:106BB000184F002074400020156B0F00044F002078 +:106BC000104F0020204F0020F16A0F00956A0F003F +:106BD0001FB50378032B044605D1164B1B78022BF7 +:106BE00001D1FFF7A9FF2378042B20D1124B1A689B +:106BF00062B1124B1968124B1B68994206D2114BB5 +:106C000020791B6804B0BDE8104018470E4B1B6884 +:106C10006BB10292094A0221126803928DF80410A6 +:106C200004AA12E9070004B0BDE81040184704B0F8 +:106C300010BD00BF044F00201C4F00200C4F00204F +:106C4000084F002070400020104F002010B50C4A63 +:106C50000C4C12682368D35CC02B03D0DB2B0CD008 +:106C6000042009E0DC2000F0F3FA28B92368064A82 +:106C700001332360054B1A6010BDDD20F3E700BF30 +:106C8000204F0020144F0020F16A0F0074400020B4 +:106C9000014B186000207047104F0020F0B50C4EDB +:106CA000377887B097B90B4D0FCD6C460FC495E878 +:106CB0000300072384E80300074A3946684600F0CA +:106CC00079FA08B90123337007B0F0BD0020FBE763 +:106CD000044F002048940F00D16B0F00024B00229C +:106CE0001A7000F0C9BA00BF044F002010B5C0B13F +:106CF0000D4B1A78012A04D0022A0CBF0420082068 +:106D000010BD0A4A00241460094A1160094A106043 +:106D100002221A70084B094A1A60FFF70DFF20463D +:106D2000EEE71020ECE700BF044F0020144F0020D6 +:106D3000184F0020204F002074400020156B0F00DA +:106D4000054B064A1860064B1960064B0020186078 +:106D5000054B1A60704700BF1C4F0020816A0F006E +:106D6000084F00200C4F002070400020064B0748C1 +:106D70001B68DB00DBB20022037004215B4242701F +:106D80008270C370FFF7B2BF4C4F0020244F002029 +:106D900070B52D4C2D4E024625462378012B14D07C +:106DA00002D3022B20D070BD002AFCD12848FFF767 +:106DB00021FC08B1FFF7F0FC264B1B68002BF2D03A +:106DC000254ABDE8704010781847012AEBD1316898 +:106DD000224B06311868FFF789FF08B1FFF7DCFC8A +:106DE00002232B700022D8E7022A19D0032A0ED0E2 +:106DF000002AD8D11A4B16481A6041F6E121FFF754 +:106E0000B5FB0028CFD0BDE87040FFF7C5BC154AE0 +:106E10001368013303F00703136000232370E1E7D5 +:106E20000F4A1368052B0AD001331360074B19680A +:106E30000A4B06311868BDE87040FFF757BF064B94 +:106E400001221A70E9E700BF704F0020644F002054 +:106E5000284F0020604F0020684F0020784F00200E +:106E60006C4F0020504F0020F0B585B004AB03E913 +:106E700007009DF80400032878D8DFE800F0080236 +:106E8000A7AA012005B0BDE8F040FFF781BF039E2F +:106E9000564C032E40F28680029D6B7813F00F0251 +:106EA00069D00E2A7ED1042E59D02A78500656D5A4 +:106EB000110654D51A44AB781A44EB781A4412F0F0 +:106EC000FF024CD1B71E39462846FFF7BFFCEB192D +:106ED0005A78EB5D43EA0223984240D144492A782C +:106EE0000B6802F00702D8B282422BD1013303F0C3 +:106EF00007030B60FFF73AFF3E4B012230461A7042 +:106F0000FFF73EFD08B1FFF747FC38494FF4167014 +:106F1000FFF7CEFC00285ED0042802D00020FFF747 +:106F20003BFC35480521FFF70BFF08B1FFF734FCA8 +:106F3000324B1B68002B56D04FF0000005B0BDE867 +:106F4000F04018474FF416712068FFF7F9FE08B1BA +:106F5000FFF722FC05B0BDE8F040FFF707BF20684F +:106F60004FF41671FFF7ECFE00283CD005B0BDE8E9 +:106F7000F040FFF711BC2978AA780B441344EA7853 +:106F8000134413F0FF030DD11D4A12680132C1F3FF +:106F9000C20102F00702914204D11A4A0320137081 +:106FA000FFF7F6FE25681DB14FF416712846D9E7A4 +:106FB0000E494FF41670FFF77BFC80B1042802D015 +:106FC0002846FFF7E9FB0C480521CBE705210A48D5 +:106FD000C8E70320CAE720684FF41671A3E72068CA +:106FE0004FF41671BEE705B0F0BD00BF744F00202E +:106FF0004C4F0020484F0020544F00205C4F002091 +:10700000504F0020684F00200220FFF7C1BE000053 +:10701000074B10B5044618600648FFF739FE08B163 +:10702000FFF7BAFB002C0CBF0E20002010BD00BFE4 +:107030005C4F0020696E0F00184A1948002310B5F4 +:107040001360184A1360184A1360184A1370184ADC +:107050001370184B184A01211960184B1960184B0E +:107060001970FFF771FA08B1032010BDFFF70AFC91 +:107070000028FAD1FFF712FE0028F6D1114C4FF488 +:1070800016702146FFF714FC0028EDD120684FF45C +:107090001671BDE81040FFF753BE00BF784F0020C7 +:1070A00060940F00644F00206C4F0020484F002078 +:1070B000704F00204C4F002009700F00504F0020EF +:1070C000684F0020744F00200C4A08B5002313605D +:1070D0000B4A1360FFF7EAFB08B1FFF75DFBFFF710 +:1070E000FDFD08B1FFF758FB0648FFF783FA0428B7 +:1070F00002D10020FFF750FB002008BD604F0020A8 +:107100005C4F0020284F002037B50D46044698B14B +:1071100091B10A4B19780022019259B101A91A7054 +:10712000FFF73EFC019B063B2B8023680433236062 +:1071300003B030BD0420FBE70E20F9E7484F0020E4 +:107140000438FFF7DFBB000013B50478012C13D11E +:1071500004238DF80030436812491B7812488DF8DB +:107160000430224600F004FB104B1C70104B1B68CF +:107170006846984702B010BD022C09D1C36809497E +:1071800009488DF800400122019300F0F1FAEDE783 +:10719000002CEFD102A8032300F8083D044B1B6824 +:1071A000E7E700BF804F002078400020814F00209B +:1071B0007C4F0020F0B5204D064617469C460FCD6B +:1071C00089B06C460FC495E80F0084E80F0073691E +:1071D0000693337C8DF81CC0003318BF01238DF853 +:1071E0001430737C1548002B14BF0E2300238DF838 +:1071F0001530F3680293B36803933368019373689F +:1072000000930F4B1F600F4B00221A7069460E4A05 +:1072100000F0FAF868B9336801330AD09DF81D30E0 +:1072200013B9064800F066FB01220849034800F044 +:107230009FFA09B0F0BD00BF64940F0078400020B1 +:107240007C4F0020814F002049710F00804F0020AB +:10725000074908B501220870064800F007FA11280E +:1072600004D0002814BF0320002008BD0420FCE740 +:10727000824F00207840002008B5024800F082F9D3 +:10728000002008BD784000200028C3B2A8BF00F14C +:1072900060424FEA501010B5BABF0D4A03F00F0418 +:1072A00002F561424FEA41114FEA8000C9B200F194 +:1072B0006040B4BF115582F8001300F5614003F03F +:1072C0001F0201239340C0F88031036010BD00BF4E +:1072D00014ED00E00023435082B043580193019B1A +:1072E00002B070470023435082B043580193019B82 +:1072F00002B070470A4610B54FF48E71FFF7EAFFEF +:10730000938A91689BB2C95C938A01339BB2938242 +:10731000C0F81C1510BD1FB5002382688DF8003021 +:107320008DF8081083750192D0E9001368469847DC +:1073300005B05DF804FB08B502464FF49271006891 +:10734000FFF7C8FF4FF484711068FFF7C3FF13689D +:1073500001221A6008BD10B5CB7D0A464FF4847136 +:1073600023B9FFF7B7FFD0F8183510BDFFF7B2FF0C +:10737000537ED168D0F81805C854537E0133DBB270 +:107380005376F2E71FB501238DF80030054B8DF8D9 +:10739000080001916846D3E90012904705B05DF8F6 +:1073A00004FB00BF844F00201F2886BF00F01F0091 +:1073B000044B4FF0A04300F5E070032243F8202077 +:1073C000704700BF000300501F2886BF00F01F0059 +:1073D000044B4FF0A04300F5E070022243F8202058 +:1073E000704700BF000300501F2886BF00F01F0039 +:1073F000044A4FF0A042012303FA00F0C2F8080546 +:10740000704700BF00030050F8B50679594D76016A +:10741000AB191746DA7E0446002A40F0A8804A7F5E +:107420001A770868431C04D0FFF7DEFF0868FFF7EF +:10743000BBFF4B68581C0BD01F2B86BF03F01F03EC +:107440004D4A4FF0A04203F5E073002042F82300BC +:1074500023792268886905EB43131B7FC2F8240552 +:107460002268002B68D0087D4B7D0343C2F86C3541 +:10747000D1E900022368C3F80C05C3F814250B7D7D +:10748000012B1DD18B685A1C0BD01F2B86BF03F01C +:107490001F03394A4FF0A04203F5E073002042F881 +:1074A0002300C868431C04D0FFF79EFFC868FFF79D +:1074B0007BFFD1E902202368C3F80805C3F8102533 +:1074C000AB195F600B69AB5127B323790A7F206842 +:1074D00005EB43131B7F002B3BD04FF48871FFF764 +:1074E00001FF4FF490712068FFF7FCFE4FF492719A +:1074F0002068FFF7F7FE4FF4A2712068FFF7F2FE55 +:1075000023681E49C3F804132068114640F307306E +:10751000FFF7BAFE2379226805EB43131B7F23B3E1 +:1075200008233544C2F8003500200123E875287689 +:10753000A875EB76A876F8BD087D4B7D0343C2F8AD +:107540006C35D1E900202368C3F81405C3F80C2575 +:1075500095E74FF48E71FFF7BDFE4FF4A2712068DE +:10756000FFF7B8FE23680649CCE70423D9E70820D3 +:10757000E1E700BF844F0020000300501003020029 +:10758000800002002DE9F041047934490368640168 +:1075900002460819007F00B10020C3F800050B194E +:1075A0005B68B3B11379106801EB43131B7F002BA9 +:1075B00042D02B4BC0F8083313681B0B58B201257F +:1075C000400903F01F0305FA03F32030254D45F869 +:1075D00020301079136801EB4010007F70B34FF03A +:1075E000FF35D3F80C05D3F81485D3F80865D3F824 +:1075F0001075C3F80C55C3F814551368C3F8085533 +:10760000C3F81055451C01D0FFF7DEFEB8F1FF3F6F +:1076100002D04046FFF7D8FE7A1C02D03846FFF76A +:10762000D3FE731C02D03046FFF7CEFE2144002368 +:10763000CB764B60BDE8F0810B4BBBE74FF0FF35DD +:10764000D3F80C05D3F81485D3F80865D3F8107572 +:10765000C3F81455C3F80C55CFE700BF844F002082 +:107660001003020000E100E0840202002DE9F04175 +:1076700003793E4E5B010446F018007F20B101F013 +:107680006040B0F1005F6DD13344987D00286BD12C +:107690009A759960988294F804804FEA4817F51912 +:1076A0002B7F53B34FF490712068FFF71BFE4FF40C +:1076B000AC712068FFF716FE2368AA7DA968C3F89D +:1076C0004415C3F84825236801229A606B6813B1FA +:1076D0000020BDE8F0812268D2F82011D2F858319C +:1076E00019B9002BF8D00F2003E0002B14BF0F2096 +:1076F0000020F31900229A75EBE74FF48E71206891 +:10770000FFF7E8FD236801229A6006EB481841461E +:107710002068FFF7EFFD6B68002BD9D1A97DAA8AFD +:1077200091420DD8AB8A9BB2B3F5807FDBD0236842 +:10773000D3F81C21002AFBD00122DA600020D8E710 +:107740002068D0F81C3123B9AB8A9BB2B3F5807F97 +:10775000F7D1AB8A9BB2B3F5807FE0D04146FFF70B +:10776000C9FDDBE71020B4E71120B2E7844F002009 +:107770002DE9F84303795E4D5B010F46E918064693 +:107780000C7F2CB107F06041B1F1005F40F0AB809D +:10779000E918486828B13168BCB14FF40474C1F8E5 +:1077A00008432B44DC7DB4B1197E00294ED048B18A +:1077B0003379326805EB43152B7F4BB14FF40473DB +:1077C000C2F804331120BDE8F8834FF40174E6E7F2 +:1077D0004FF40173F4E7DA75DF605C761C7696F897 +:1077E00004904FEA491805EB0803197F00293ED0A1 +:1077F0004FF488713068FFF775FD4FF4A27130685F +:10780000FFF770FD3368C3F83475C3F83825336863 +:1078100004BB01221A60337932685B01E9184968B8 +:10782000F9B9D2F81041D2F84411D2F8240114B9B0 +:1078300009B90028F5D01D4400239842EB7514BF08 +:10784000032018460029BED00F20BCE71F611A761E +:107850000124C4E7D3F8002242F02002C3F800223A +:10786000D9E74FF40473C2F804330020ABE79B7EE2 +:107870001BB914B93046FFF75EFD05EB0807306809 +:107880007B685BBB4FF4A271FFF724FD05EB491940 +:107890003068D0F82431D0F80821D0F8444172B9CA +:1078A0000CB9002BF4D045440022EA75EBB9002C4A +:1078B000CAD1A97E3368012271B11A60D5E7002BC5 +:1078C000F1D1002CEFD14946FFF745FD7B7EFA7DD3 +:1078D0009A42DDD82346E6E75A60C6E74FF40173C3 +:1078E000C0F80433C1E710206DE703206BE700BF49 +:1078F000844F002038B50379074C04EB4313054649 +:107900001A7F42B99B7E33B9FFF715FD2B7904EB43 +:1079100043140123A37638BD844F00207FB5774CF4 +:10792000774A237F002B64D0D2F82461002E3FD009 +:107930004FF492711046FFF7D5FC02238DF800300A +:10794000D2F88034C2F880340393D2F83C358DF8F5 +:107950000830E36801930023E37523766846D4E991 +:1079600000139847664AD2F8443173B14FF4A271BC +:107970001046FFF7B7FCE37D3BB10023E375D2F877 +:107980003C05E168C0B2FFF7FDFC5D4AD2F820314A +:1079900063B14FF490711046FFF7A4FCA37D2BB1A7 +:1079A000D2F84C155548C9B2FFF7B5FC04B070BD0C +:1079B000D2F81031002BD5D010464FF48871FFF764 +:1079C00091FCD2F83C35E07DDBB29842CAD1237EEF +:1079D000E16863B1D2F8005225F02005C2F80052E8 +:1079E000E3752369E3602676FFF7CCFCBAE7E3751D +:1079F000FAE7D2F80433990548D5D2F82431002BA0 +:107A000044D04FF492711046FFF764FC4FF40173B9 +:107A1000C2F80833A37E0BB9012353600223384A0E +:107A20008DF80030D2F88034C2F880340393E37DBF +:107A30008DF80830E36801930023E37523766846E8 +:107A4000D4E9001398472E48D0F81C3133B1A38AEB +:107A5000A27D9A4246D92949FFF74CFC284AD2F820 +:107A60004431002BA2D04FF4A2711046FFF732FC34 +:107A7000A37E0BB101231360E37D002B96D000237E +:107A8000607EE168E375FFF77DFC8FE71C4DD5F85C +:107A900004335B07D7D5D5F80831002BD3D017496D +:107AA0002846FFF758FC637EE27D9A42CBD1237EC5 +:107AB00053B1E3752369E168E3600023607E2376B8 +:107AC0006376FFF75FFCBEE7A37E0BB901236B6013 +:107AD0000B4B4FF40172C3F808230023E375607E5B +:107AE000E168EEE74FF48E71FFF7F4FBA17D00290A +:107AF000B4D00248FFF70FFCB0E700BF844F00206E +:107B0000002000406DDF704772DF704779DF7047FB +:107B10007DDF704764DF70472DE9F74F0C9CBDF89F +:107B200034B02788002580468A4691462E46B8F80C +:107B30000020B2420BDC35B12288013AD21B92B24E +:107B4000FF2A39D8DA55002003B0BDE8F08FD8F805 +:107B5000042052F82600019000220DF1030101A833 +:107B6000FFF7D8FF0028EFD19DF803204A4521D127 +:107B70002288002D14BF0020022002EB09010144DD +:107B8000594519DC3DB9013292B2228003F802A0B6 +:107B900022880132228022880DF103011A4401A8B3 +:107BA000FFF7B8FF0028CFD121889DF803200A44B1 +:107BB000228001250136BAE70C20C5E72DE9F34103 +:107BC000089CBDF824501746CDE900450222064620 +:107BD000FFF7A2FF48B9102239463046CDE90845E3 +:107BE00002B0BDE8F041FFF797BF02B0BDE8F081F9 +:107BF0002DE9F04F002316881380436B85B00746AC +:107C00000D461446A3B1022E01D80C206AE11A7861 +:107C100002230B70238801339BB211212380E95486 +:107C2000238801339BB22380EA54238801332380C5 +:107C30003A6BE2B1238803F11201B142E5D8112178 +:107C4000E954238801339BB210212380E95423880F +:107C50000133238002F10F03013A218813F801094F +:107C600068542188934201F101012180F5D197F8F0 +:107C70002E2012B32388D91CB142C6D80221E95460 +:107C8000238801339BB21C202380E85423880133CE +:107C90009BB2013A2380032A00F23181DFE812F01F +:107CA00004000700090014010022EA5402E0012246 +:107CB000FBE7E95423880133238097F82D3053B331 +:107CC00023880933B342A0D802A8FFF71BFF00287E +:107CD00040F0088123880822EA54238801339BB2AC +:107CE0001B222380EA542088013080B220800622A3 +:107CF0000DF10901284401F05AFB23889DF8082062 +:107D000006339BB212F0FE0218BF01222380EA5410 +:107D1000238801332380BB7803B323880433B34221 +:107D20003FF673AF02A8FFF7F1FE002840F0DA80BB +:107D300023880322EA54238801339BB2192223802B +:107D4000EA542388BDF8082001339BB2E918238048 +:107D5000EA54120A4A70238802332380FA78A2B1C7 +:107D60002388D91CB1423FF650AF0221E954238841 +:107D700001339BB201212380E95423880B449BB239 +:107D80002380EA5423880B4423807A68B2B1238885 +:107D9000D91CB1423FF639AF022192F90020E954D3 +:107DA000238801339BB20A212380E95423880133BD +:107DB0009BB22380EA542388013323803B89002B24 +:107DC00040F084803B8A5BB1CDE900462B46072218 +:107DD000032107F11000FFF7F1FE002840F0828038 +:107DE0003B8B53B1CDE900462B461522142107F1F8 +:107DF0001800FFF7E3FE002874D13A6A002A74D114 +:107E0000D7F82480B8F1000F30D0B8F804302188BA +:107E1000981C8A1C0244B2423FF6F7AEFE283FF699 +:107E2000F4AE03336B54238801339BB2FF222380CB +:107E3000EA54238801339BB22380B8F80020EA5427 +:107E4000E918120A4A702088023080B22080B8F8FF +:107E500004205AB1D8F80810002950D0284401F065 +:107E6000A6FA2388B8F804201344238097F82C300E +:107E7000002B7FD13878A8B33B88012B3FD02288D4 +:107E800002F1020CB4453FF6C0AE012805D17B7863 +:107E9000023313449E42FFF4B8AE023EB61A04A960 +:107EA000B6B221F8086D05EB0C00FFF731FEC8B93A +:107EB0003B78022B40F0A180BDF80830B34240F27D +:107EC000B780ADF80860A1E00322EEE6CDE90046F8 +:107ED0002B460622022107F10800FFF76FFE00285B +:107EE0003FF470AF05B0BDE8F08FB4F800C00CF1FE +:107EF0000603B3423FF689AE1188052901D8072051 +:107F0000F0E76FF4486E01EB0E039BB24FF27D3E3B +:107F10007345F4D95388052BF1D96FF448601818CC +:107F200080B27045EBD94FF6FF70814203D0834297 +:107F300001D09942E3D8052305F80C30238801339A +:107F40009BB212212380E954238801339BB2238002 +:107F50001188E954E818090A4170238802339BB25A +:107F600023805288EA54E918120A4A70238802339F +:107F7000238045E7BB6A002BC1D04FF000094FF0CA +:107F80000C0A4FF0160B97F82C305FFA89F29342E7 +:107F90007FF670AFB96A0AFB02F201EB0208B8F88B +:107FA0000430981CFE283FF630AE208803332B5453 +:107FB000238801339BB2238005F803B02388013363 +:107FC0009BB223808A5AEA54E918120A4A70208820 +:107FD000023080B22080B8F804205AB1D8F80810D6 +:107FE00000298CD0284401F0E2F92388B8F8042055 +:107FF0001344238009F10109C5E7012B7FF461AF28 +:108000007B789E42FFF45DAFADF808300821BDF8E3 +:108010000830FE2B3FF6F9AD22880133AB5422889D +:10802000013292B22280A95422881344238059E756 +:108030000921ECE730B597B01F230D46ADF80430A9 +:10804000ADF80630044648B3C3785B0702D4072076 +:1080500017B030BD01AA06A9FFF7CAFD0028F7D165 +:1080600006ACF5B1EB78002BF1D10DF106020EA9AB +:108070002846FFF7BDFD0028EAD10EADBDF804305B +:10808000ADF80C3004AABDF80630029402A9002015 +:108090000495ADF81430FFF737FDD9E7ADF80400CB +:1080A000DFE7ADF80650E9E775DF704776DF704728 +:1080B0007ADF70477BDF704737B5164B18884FF66D +:1080C000FF73984210D0144A144D1378297B013362 +:1080D000DBB2994213702C4608D31149FFF7E4FF35 +:1080E00010B1AB6903B1984703B030BD00231370E2 +:1080F0002B7C33B13B21FFF7D9FF10B1AB6903B142 +:1081000098476369002BEFD002A8002200F8042DE5 +:10811000E9E700BFA64F0020F44F0020A84F002041 +:10812000EC4F002037B5174B174A5B881188174C66 +:10813000174D994208D852889A4205D36369F3B91A +:1081400000232B7003B030BD2A783AB16369002B4D +:10815000F6D002A8002200F8042D0EE00D48D4E964 +:1081600001130078002818BF19460B48FEF7FEF9E6 +:108170000028E5D0A369002BE2D09847E0E702A8E9 +:108180000122E8E7E44F0020EC4F0020A84F002038 +:10819000A44F0020F44F0020C44F002070B50546C6 +:1081A00006460FCD114C0FC495E80700104B84E82C +:1081B000070000221A7032680E489AB113680360F3 +:1081C00053684360FFF774FF78B90B4B0B484FF6C9 +:1081D000FF721A800A4B0B4A00211970BDE87040EB +:1081E000FEF7B2B9FFF766FFEEE770BDA84F0020BB +:1081F000A44F0020EC4F0020A64F002084940F00D5 +:10820000F44F0020B9800F000148FEF7F3B900BF1A +:10821000C44F002010B50388112B2DD002D8102B8D +:1082200016D010BD122B3AD0502BFAD11F4CC28859 +:10823000E3899A42F5D1038A022BF2D1837CDB07D2 +:1082400016D41B48FEF7D6F90028EAD0A36921E02E +:10825000184B82881A8000F1100303CB164A174B83 +:108260001060516000221A70104BDB89002BD8D1AE +:10827000BDE81040FFF756BF0E4B0D484FF6FF729A +:108280001A800E4B00221A70FEF7B4F90028C8D0ED +:10829000064B9B69002BC4D0BDE81040184700F185 +:1082A000080303CB044A10605160E1E7A84F0020A7 +:1082B000C44F0020A64F0020E44F0020F44F0020C0 +:1082C00038B5044608460D4601F07CF8656020800C +:1082D00038BDA0DF7047A2DF7047A5DF7047A6DF7B +:1082E0007047A8DF704762DF704700002DE9F04754 +:1082F0000F4694B00546002800F02E81002900F0BA +:108300002B814B68002B00F027814FF6FF73038011 +:10831000924B04AA03F1100C1646186859681446CB +:1083200003C4083363452246F7D114AB41F23052FF +:108330000DF10A01304623F8482DFFF7D4FF04461B +:10834000002840F005812A1D19460120FFF7C1FFD2 +:108350000446002840F0FC809DF80A30AB710146CD +:108360001C220DA8FBF7DEFF9DF834300E9443F07D +:1083700004038DF8343001AEAB798DF80E30214610 +:1083800041F2325303223046CDE91044CDE9124484 +:10839000ADF80C30FBF7C6FF9DF8043064F303031F +:1083A00064F307138DF804309DF805304FF0010A8F +:1083B0006AF303036AF307138DF805309DF806305E +:1083C0006AF3420364F3C30364F30413DBB243EAC6 +:1083D0000A032146142208A88DF806300DF10C0876 +:1083E000FBF7A0FF4FF0140905F1080308AA0DA937 +:1083F000A8880A940C94CDE90886ADF82C90FFF774 +:108400006AFF0446002840F0A38001461C220DA804 +:10841000FBF788FF9DF834300E9443F018038DF875 +:108420003430AB798DF80E30214641F231530322BE +:108430003046CDE91044CDE91244ADF80C30FBF7DD +:1084400071FF9DF8043064F3030364F307138DF8A0 +:1084500004309DF805306AF303036AF307138DF8BF +:1084600005309DF806306AF3420364F3C303DBB2C0 +:1084700043F0110321464A4608A88DF80630FBF761 +:1084800051FF1723ADF82C3008AA05F110030DA9F0 +:10849000A8880A940C94CDE90886FFF71CFF0446CF +:1084A000002855D101461C220DA8FBF73BFF9DF883 +:1084B00034300E9443F002038DF83430AB798DF8EC +:1084C0000E30214641F2345303223046CDE91044A8 +:1084D000CDE91244ADF80C30FBF724FF9DF80430D1 +:1084E0006AF303036AF307138DF804309DF805302F +:1084F00064F3030364F307138DF805309DF8063029 +:108500006AF3420364F3C30364F30413DBB243EA84 +:108510000A0321464A4608A88DF80630FBF702FFF9 +:1085200002230A93ADF82C3008AA05F120030DA907 +:10853000A8880C97CDE90886FFF7CDFE044638B928 +:108540007B68AB62BB6803B1EB62054B01221A701A +:10855000204614B0BDE8F0870E24F9E788940F0098 +:10856000F54F002070B5054686B070B302884FF60F +:10857000FF739A422BD0174B1B7843B3164C102233 +:10858000080AE170207121FA02F0090E0723012682 +:108590006071A17102A800216370ADF806302270ED +:1085A000A670FBF7BFFE2B8AADF808300023ADF8AC +:1085B0000C3002A90DF1060328888DF80A60CDE978 +:1085C0000434FFF78CFE06B070BD0E20FBE70820D8 +:1085D000F9E700BFF54F0020F64F002030B5054603 +:1085E00087B060B302884FF6FF739A4229D0164BCA +:1085F0001B7833B3154C112323700B0A6170A370E1 +:108600000B0C090EE370217105230021102202A832 +:10861000ADF80630FBF786FE2B8AADF80830012353 +:108620008DF80A300023ADF80C3002A90DF10603D5 +:108630002888CDE90434FFF752FE07B030BD0E2084 +:10864000FBE70820F9E700BFF54F0020F64F0020B8 +:1086500030B5044687B038B300884FF6FF739842B0 +:1086600024D0134B1B780BB3124D102369700321D8 +:10867000ADF80610AA7000211A4602A82B70FBF76D +:1086800051FE238AADF8083001238DF80A3000230B +:10869000ADF80C3002A90DF106032088CDE90435B0 +:1086A000FFF71DFE07B030BD0E20FBE70820F9E7FD +:1086B000F54F0020F64F002070B50D4688B00446F7 +:1086C00040B139B1826A2AB10B88112B59D003D835 +:1086D000102B43D008B070BD502B42D0512BF9D194 +:1086E0008B79022BF6D10A89038A9A42F2D18B7BCD +:1086F000043B022BEED99DF8163043F001038DF8B0 +:1087000016300B8AADF818304B8AADF81A300226B5 +:1087100001F114030822002101A807938DF81060CD +:10872000FBF700FE01AAA18A20880196CDF808D0A7 +:10873000FFF7D3FD034638B3E36A03B1984740F22D +:10874000FD1304A92088ADF81430FFF7CAFD0028F6 +:10875000C0D0E36A002BBDD09847BBE78B8823804D +:10876000B8E7C98803899942B4D108238DF810303D +:10877000123535F8023C8DF81830059504A990475C +:10878000A8E74FF6FF73EAE79DF800202088D2079C +:10879000D5D504A9ADF81430FFF7A3FD0028D8D132 +:1087A000297D4B1E072B41D8DFE803F0041A23274D +:1087B000292B3E2D00238DF804306B8A012B05D820 +:1087C000062201212046FFF743FFC0E701231535AC +:1087D0008DF80C300295A36A01A92046984779E7E5 +:1087E0006A8A01239A428DF80430F0D806220221C9 +:1087F000E8E702238DF80430EDE70323FAE70423CA +:10880000F8E70523F6E76B8A022B02D8032208213A +:10881000D8E7AA7D6B7D43EA0223ADF808300BB997 +:108820000723E7E70623E5E70923E3E70322C9E790 +:10883000A0DF7047A2DF70472DE9F04381468FB07B +:10884000154698460E4611B90846FDF7A5FF15B91D +:108850002846FDF7A1FF1C220DEB02000021FBF7CB +:1088600061FD9DF81C30ADF80490002443F0020334 +:1088700001272146032268468DF81C300894CDE973 +:108880000A44CDE90C448DF80670FBF74BFD98F8CF +:1088900000308DF8003098F801308DF801309DF8E7 +:1088A000023067F3420303F0E70364F30003214659 +:1088B000142202A88DF80230FBF734FD0A48CDF8E7 +:1088C0000CD001AB029302AA169B0088ADF81050A1 +:1088D00007A9ADF81240ADF814500696FFF7AAFFAD +:1088E0000FB0BDE8F08300BF3650002030B587B030 +:1088F00006A941F60A03044621F80C3D01205A4A14 +:108900008DF80E00FFF794FF0546002849D1228814 +:10891000002A49D1228952B1544B0093E16804F1F5 +:108920003C0342F62420FFF787FF002847D1228A24 +:1089300052B14F4B0093616904F13C0342F625208C +:10894000FFF77AFF00283AD1228B52B1494B0093AE +:10895000E16904F13C0342F62720FFF76DFF002890 +:108960002DD1228C4AB1444B0093616A04F13C033F +:1089700042F62620FFF760FF08BB228D4AB13F4B2D +:108980000093E16A04F13C0342F62820FFF754FF0C +:10899000A8B9236BABB9616B002938D1A36B002B4D +:1089A00042D1284607B030BD354B0093616804F1D1 +:1089B0003C0342F62920FFF73FFF0028AAD00546D6 +:1089C000EFE71A688DF810201A68120A8DF8112046 +:1089D0005A888DF81220DA788DF813205A688DF8AD +:1089E00014209B688DF815301A0A1B0C8DF817306F +:1089F000244B8DF816200093082204F13C0304A9AF +:108A000042F62320FFF718FF0028C4D0D7E71E4BFB +:108A10000A790093096804F13C0342F62A20FFF723 +:108A20000BFF0028BAD0CAE71A788DF810205A88B0 +:108A30008DF81120120A8DF812209A888DF81320D3 +:108A4000120A8DF81420DB888DF815301B0A8DF87A +:108A500016300E4B0093072204F13C0304A942F6A2 +:108A60005020FFF7E9FEAAE73650002016500020FC +:108A70002E50002006500020FE4F002038500020CD +:108A80000E50002040500020265000201E50002094 +:108A900029DF704728DF704737B50B460C465A6808 +:108AA00014F80C1BDD680092044A5B6952F82550EB +:108AB00002462046A84703B030BD00BF4850002002 +:108AC00038B5184C2378182202FB03431A795D69E4 +:108AD000012A03D0032A18D00F2015E0124A996901 +:108AE00010689A68DB680003121AB2F5805F1D44B3 +:108AF000014438BF9208284428BF4FF48062FFF732 +:108B0000C7FF08B90123A37038BD4FF0805318691F +:108B1000054B80B2B5FBF0F518682844FFF7BAFFA3 +:108B2000EFE700BF585000205051002070B5134DA2 +:108B30006C780A2C1FD02E783444E4B2092C84BF00 +:108B40000A3CE4B2182606FB0454A261207103C952 +:108B5000A360049BE360AB7804F1100282E8030099 +:108B600023B100206B7801336B7070BDFFF7A8FF55 +:108B70001128F7D1F5E70420F7E700BF585000208F +:108B8000F8B527498B780C462BB1002602288E7049 +:108B900002D003283AD0F8BD0D78224A182101FBF3 +:108BA0000541136889680133B1EB033F13601BD89B +:108BB00063781660013B63706B1CDBB218270426D8 +:108BC000092B17FB056188BFA5F10903214400208B +:108BD0002370FFF761FF07FB05430022C3E904622E +:108BE0001A719A609A61DA606378002BD3D0A37807 +:108BF000002BD0D1FFF764FF0028CCD01128CAD0B9 +:108C00002178182303FB0141043105E00B78182279 +:108C100002FB031104310D20BDE8F840FFF73CBF13 +:108C200058500020505100200D4A002313600D4A77 +:108C300004201380937002F1F0011371936093612B +:108C4000D360C2E9040318328A42F6D1064A13609F +:108C5000064A0020C2E90033C2E90233704700BF70 +:108C600050510020585000204C5100204850002006 +:108C7000074A1368042B1FBF0B60591C1160054A7B +:108C80001DBF016842F8231000201846704700BF3E +:108C90004C5100204850002013B5CC180C43A407B9 +:108CA00008D1009313460A4601460120FFF73EFF14 +:108CB00002B010BD1020FBE707B500220B46009262 +:108CC00001460320FFF732FF03B05DF804FB00000C +:108CD000054B1B68082B01BF044B1868B0FA80F0E5 +:108CE000400918BF00207047300100103401001007 +:108CF00008B5FFF7EDFF40B14FF080430022C3F805 +:108D00000C21C3F81021C3F83825FFF7E1FF002834 +:108D100046D04FF080525E4BD2F80414C3F82015B1 +:108D2000D2F80814C3F82415D2F80C14C3F8281587 +:108D3000D2F81014C3F82C15D2F81414C3F8301557 +:108D4000D2F81814C3F83415D2F81C14C3F840151F +:108D5000D2F82014C3F84415D2F82414C3F84815E7 +:108D6000D2F82814C3F84C15D2F82C14C3F85015B7 +:108D7000D2F83014C3F85415D2F83414C3F860157F +:108D8000D2F83814C3F86415D2F83C14C3F8681547 +:108D9000D2F84014C3F86C15D2F84424C3F87025F7 +:108DA000FFF796FF10B13B4B3B4A1A60FFF790FF6D +:108DB00018B13A4BFB22C3F81825FFF789FF48B1D9 +:108DC0003749384B0A681B6822F00F0203F00F0383 +:108DD00013430B60FFF77CFF18B1334B4FF4007265 +:108DE0001A60FFF775FF48B14FF08043D3F80024B5 +:108DF000D20744BF6FF00102C3F800242B4AD2F817 +:108E0000883043F47003C2F88830BFF34F8FBFF34C +:108E10006F8F4FF01023D3F80022002A03DBD3F822 +:108E20000432002B2FDA224B0122C3F80425D3F899 +:108E30000024002AFBD04FF010221221C2F80012A9 +:108E4000D3F80024002AFBD04FF010231222C3F8DD +:108E50000422174B1A46D3F800140029FBD0002136 +:108E6000C3F80415D2F80034002BFBD0BFF34F8FAA +:108E70000E49104BCA6802F4E0621343CB60BFF3A3 +:108E80004F8F00BFFDE70C4B0C4A1A6008BD00BFB6 +:108E900000C000408C5600404881030000F00040B4 +:108EA000E40E0040580200104096024000ED00E041 +:108EB00000E001400400FA05804000200090D0034B +:108EC00048DF704710DF704761DF704708B5FDF776 +:108ED00071FC08BD2DE9F743214B1B7803F0FF0817 +:108EE000ABB1204D204E2B683268B3FA83F77F096F +:108EF000A2B963B144461EE033680198984718E070 +:108F0000444616E02A681846904726E034B103B07C +:108F1000BDE8F083002CFAD14446274601A8FFF7AC +:108F2000CFFF05280446EBD00028E5D0FDF734FC40 +:108F30000024002FEAD10D4FDFF834903B88ADF8C4 +:108F40000430D9F8003001A91846FFF7BDFF052805 +:108F5000E0D00028D6D0FDF71FFC002CEED1DCE7D6 +:108F600060510020585100206451002054510020CD +:108F70006851002010B511B38C0720D1124C21602C +:108F800012490A80124A13491360FFF79BFF88B900 +:108F9000114B01221A70114A92F816335B09012B0A +:108FA0000FD9042B0DD00E4B996821B11A6842F4E9 +:108FB00080021A6010BD4FF480031360FAE70720A7 +:108FC000F8E742F20200F5E7685100205451002012 +:108FD0005C510020CD8E0F006051002000E100E0C8 +:108FE0006C51002018B1034B1860002070470E2010 +:108FF000704700BF5851002018B1034B1860002083 +:1090000070470E20704700BF6451002008B5074B21 +:109010001B682BB1984738B1BDE80840FDF7BCBBD1 +:10902000BDE80840FFF756BF08BD00BF5C510020F7 +:1090300008B511B10020FDF7AFFBBDE80840FFF710 +:1090400049BF00000021024A0846FDF70DBB00BFE2 +:1090500031900F000649074A074B9B1A03DD043B7A +:10906000C858D050FBDCFFF743FEFBF7E9F80000DF +:10907000A4940F00004000208C400020FEE7FEE793 +:10908000FEE7FEE7FEE7FEE7FEE7FEE7FEE7FEE7B8 +:1090900053B94AB9002908BF00281CBF4FF0FF315F +:1090A0004FF0FF3000F072B9ADF1080C6DE904CE5D +:1090B00000F006F8DDF804E0DDE9022304B07047B3 +:1090C0002DE9F047089E04468846002B4BD18A4282 +:1090D000154667D9B2FA82F24AB1C2F1200701FA05 +:1090E00002F320FA07F7954047EA030894404FEA55 +:1090F000154E230CB8FBFEF71FFA85FC0EFB1788F4 +:1091000043EA084307FB0CF1994209D9EB1807F130 +:10911000FF3080F01B81994240F21881023F2B44BE +:109120005B1AA4B2B3FBFEF00EFB103344EA034417 +:1091300000FB0CFCA44509D92C1900F1FF3380F089 +:109140000781A44540F2048102382C4440EA0740DC +:10915000A4EB0C0400271EB1D4400023C6E9004351 +:109160003946BDE8F0878B4209D9002E00F0EB802C +:109170000027C6E9000138463946BDE8F087B3FA52 +:1091800083F7002F47D18B4202D3824200F2FA804C +:10919000841A61EB030301209846002EE0D0C6E953 +:1091A0000048DDE702B9FFDEB2FA82F2002A40F0A1 +:1091B0008F80491B4FEA154E1FFA85F80127B1FB36 +:1091C000FEFC230C0EFB1C1143EA014308FB0CF1CF +:1091D000994207D9EB180CF1FF3002D2994200F204 +:1091E000CD808446591AA3B2B1FBFEF00EFB1014D9 +:1091F00043EA044408FB00F8A04507D92C1900F104 +:10920000FF3302D2A04500F2B6801846A4EB080452 +:1092100040EA0C409FE7C7F1200CBB4022FA0CFE4D +:109220004EEA030E01FA07F420FA0CF521FA0CF3CA +:109230004FEA1E482543B3FBF8F92C0C08FB193301 +:109240001FFA8EFA44EA034309FB0AF49C4202FA2D +:1092500007F200FA07F10BD91EEB030309F1FF3007 +:1092600080F087809C4240F28480A9F10209734417 +:109270001B1BADB2B3FBF8F008FB103345EA034407 +:1092800000FB0AFAA24508D91EEB040400F1FF33E3 +:109290006BD2A24569D90238744440EA0940A0FB68 +:1092A0000289A4EB0A044C45C2464B4654D351D024 +:1092B000002E69D0B1EB0A0564EB030404FA0CFC40 +:1092C000FD40FC404CEA0505C6E90054002747E78D +:1092D000C2F1200320FA03F7954001FA02F021FAC7 +:1092E00003F34FEA154E3843010CB3FBFEF71FFAA8 +:1092F00085F80EFB173341EA034107FB08F38B4265 +:1093000004FA02F407D9691807F1FF3C2FD28B4207 +:109310002DD9023F2944CB1A81B2B3FBFEF00EFBDC +:10932000103341EA034100FB08F38B4207D9691867 +:1093300000F1FF3C17D28B4215D902382944C91AD3 +:1093400040EA07473BE73746304609E70746E7E686 +:109350001846FBE64145ABD2B8EB020A69EB0E02B8 +:1093600001381346A4E76046E9E7184695E76746E3 +:10937000D1E781467CE702382C4447E7ACF1020C88 +:109380002B442FE7384608E73746E9E6704700BF29 +:1093900030B50024A24201D1002007E0035D013472 +:1093A0000D1915F8015CAB42F4D0581B30BD10B557 +:1093B000431E0A44914200D110BD11F8014B03F83D +:1093C000014FF7E7034613F8012B002AFBD1181AC7 +:1093D00001387047F8B500BFF8BC08BC9E4670471E +:1093E000F8B500BFF8BC08BC9E467047004000209E +:1093F000B440002001000007DC42002004430020AC +:109400004164614446550041646166727569742027 +:10941000496E647573747269657300426C75656634 +:1094200072756974204665617468657220353238DA +:109430003430005331333220352E312E302C20354C +:109440002E312E3000000000080000000600000051 +:109450000500000007000000000000000000D60129 +:10946000284F0020FFFFFFFFFFFFFFFFFFFFFFFF71 +:10947000FFFFFFFF00000000000000000000D60119 +:1094800007010000C44F002023D1BCEA5F782315F8 +:10949000DEEF12120000000000000000A4ADFF7F0C +:1094A00001000000000000000000000000000000BB +:1094B00000000000000000000000000000000000AC +:1094C000000000000000000000000000000000009C +:1094D000000000000000000000000000000000008C +:1094E000000000000000000000000000000000007C +:1094F000000000000000000000000000000000006C +:10950000000000000000000000D00E00FFFF00007F +:1095100032000000816A0F00F16A0F000020004055 +:10952000000000000090D00325420F0001420F0010 :020000041000EA :0810140000400F0000E00F0096 :00000001FF diff --git a/bin/feather52840/6.0.0/single/feather52840_bootloader_6.0.0_s140_single.zip b/bin/feather52840/6.0.0/single/feather52840_bootloader_6.0.0_s140_single.zip index a3422d44f75d70ce0c04f8cce598d4562a2baf52..1dc00cf0ffc99cdbb0a53c4556554280abe4b966 100644 GIT binary patch delta 7059 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 Uzr9+lXHPu?!=moofK}vw0krsQ?*IS* diff --git a/nRF5_SDK_11.0.0_89a8197/components/drivers_nrf/uart/nrf_drv_uart.c b/nRF5_SDK_11.0.0_89a8197/components/drivers_nrf/uart/nrf_drv_uart.c index 68febd9..dc2e790 100644 --- a/nRF5_SDK_11.0.0_89a8197/components/drivers_nrf/uart/nrf_drv_uart.c +++ b/nRF5_SDK_11.0.0_89a8197/components/drivers_nrf/uart/nrf_drv_uart.c @@ -57,7 +57,6 @@ #define NRF_LOG_LEVEL 0 #endif //UART_CONFIG_LOG_ENABLED #include "nrf_log.h" - NRF_LOG_MODULE_REGISTER(); #if (defined(UARTE_IN_USE) && defined(UART_IN_USE)) diff --git a/nRF5_SDK_11.0.0_89a8197/components/libraries/bootloader_dfu/bootloader.c b/nRF5_SDK_11.0.0_89a8197/components/libraries/bootloader_dfu/bootloader.c index eef5ab1..cdc9c50 100644 --- a/nRF5_SDK_11.0.0_89a8197/components/libraries/bootloader_dfu/bootloader.c +++ b/nRF5_SDK_11.0.0_89a8197/components/libraries/bootloader_dfu/bootloader.c @@ -10,6 +10,7 @@ * */ +#include "sdk_common.h" #include "bootloader.h" #include "bootloader_types.h" #include "bootloader_util.h" @@ -25,9 +26,8 @@ #include "pstorage.h" #include "app_scheduler.h" #include "nrf_delay.h" -#include "sdk_common.h" -#include "app_timer_appsh.h" +#include "app_timer.h" #define APP_TIMER_PRESCALER 0 @@ -326,7 +326,7 @@ uint32_t bootloader_dfu_start(bool ota, uint32_t timeout_ms) _terminate_startup_dfu = false; (void) app_timer_create(&_forced_startup_dfu_timer, APP_TIMER_MODE_SINGLE_SHOT, forced_startup_dfu_timer_handler); - app_timer_start(_forced_startup_dfu_timer, APP_TIMER_TICKS(timeout_ms, APP_TIMER_PRESCALER), NULL); + app_timer_start(_forced_startup_dfu_timer, APP_TIMER_TICKS(timeout_ms), NULL); } err_code = dfu_transport_serial_update_start(); diff --git a/nRF5_SDK_11.0.0_89a8197/components/libraries/bootloader_dfu/dfu_bank_internal.h b/nRF5_SDK_11.0.0_89a8197/components/libraries/bootloader_dfu/dfu_bank_internal.h index b939622..898264a 100644 --- a/nRF5_SDK_11.0.0_89a8197/components/libraries/bootloader_dfu/dfu_bank_internal.h +++ b/nRF5_SDK_11.0.0_89a8197/components/libraries/bootloader_dfu/dfu_bank_internal.h @@ -41,7 +41,7 @@ typedef enum } dfu_state_t; #define APP_TIMER_PRESCALER 0 /**< Value of the RTC1 PRESCALER register. */ -#define DFU_TIMEOUT_INTERVAL APP_TIMER_TICKS(300000, APP_TIMER_PRESCALER) /**< DFU timeout interval in units of timer ticks. */ +#define DFU_TIMEOUT_INTERVAL APP_TIMER_TICKS(300000) /**< DFU timeout interval in units of timer ticks. */ #define IS_UPDATING_SD(START_PKT) ((START_PKT).dfu_update_mode & DFU_UPDATE_SD) /**< Macro for determining if a SoftDevice update is ongoing. */ #define IS_UPDATING_BL(START_PKT) ((START_PKT).dfu_update_mode & DFU_UPDATE_BL) /**< Macro for determining if a Bootloader update is ongoing. */ diff --git a/nRF5_SDK_11.0.0_89a8197/components/libraries/bootloader_dfu/dfu_transport_ble.c b/nRF5_SDK_11.0.0_89a8197/components/libraries/bootloader_dfu/dfu_transport_ble.c index 43a6796..a84a927 100644 --- a/nRF5_SDK_11.0.0_89a8197/components/libraries/bootloader_dfu/dfu_transport_ble.c +++ b/nRF5_SDK_11.0.0_89a8197/components/libraries/bootloader_dfu/dfu_transport_ble.c @@ -65,8 +65,8 @@ enum { BLE_CONN_CFG_HIGH_BANDWIDTH = 1 }; #define APP_TIMER_PRESCALER 0 /**< Value of the RTC1 PRESCALER register. */ -#define FIRST_CONN_PARAMS_UPDATE_DELAY APP_TIMER_TICKS(100, APP_TIMER_PRESCALER) /**< Time from the Connected event to first time sd_ble_gap_conn_param_update is called (100 milliseconds). */ -#define NEXT_CONN_PARAMS_UPDATE_DELAY APP_TIMER_TICKS(500, APP_TIMER_PRESCALER) /**< Time between each call to sd_ble_gap_conn_param_update after the first call (500 milliseconds). */ +#define FIRST_CONN_PARAMS_UPDATE_DELAY APP_TIMER_TICKS(100) /**< Time from the Connected event to first time sd_ble_gap_conn_param_update is called (100 milliseconds). */ +#define NEXT_CONN_PARAMS_UPDATE_DELAY APP_TIMER_TICKS(500) /**< Time between each call to sd_ble_gap_conn_param_update after the first call (500 milliseconds). */ #define MAX_CONN_PARAMS_UPDATE_COUNT 3 /**< Number of attempts before giving up the connection parameter negotiation. */ #define APP_ADV_INTERVAL MSEC_TO_UNITS(25, UNIT_0_625_MS) /**< The advertising interval (25 ms.). */ diff --git a/nRF5_SDK_11.0.0_89a8197/components/libraries/hci/hci_mem_pool.c b/nRF5_SDK_11.0.0_89a8197/components/libraries/hci/hci_mem_pool.c index e898e95..49018ab 100644 --- a/nRF5_SDK_11.0.0_89a8197/components/libraries/hci/hci_mem_pool.c +++ b/nRF5_SDK_11.0.0_89a8197/components/libraries/hci/hci_mem_pool.c @@ -1,98 +1,108 @@ -/* Copyright (c) 2013 Nordic Semiconductor. All Rights Reserved. - * - * The information contained herein is property of Nordic Semiconductor ASA. - * Terms and conditions of usage are described in detail in NORDIC - * SEMICONDUCTOR STANDARD SOFTWARE LICENSE AGREEMENT. - * - * Licensees are granted free, non-transferable use of the information. NO - * WARRANTY of ANY KIND is provided. This heading must NOT be removed from - * the file. - * +/** + * Copyright (c) 2013 - 2017, Nordic Semiconductor ASA + * + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without modification, + * are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form, except as embedded into a Nordic + * Semiconductor ASA integrated circuit in a product or a software update for + * such product, must reproduce the above copyright notice, this list of + * conditions and the following disclaimer in the documentation and/or other + * materials provided with the distribution. + * + * 3. Neither the name of Nordic Semiconductor ASA nor the names of its + * contributors may be used to endorse or promote products derived from this + * software without specific prior written permission. + * + * 4. This software, with or without modification, must only be used with a + * Nordic Semiconductor ASA integrated circuit. + * + * 5. Any software provided in binary form under this license must not be reverse + * engineered, decompiled, modified and/or disassembled. + * + * THIS SOFTWARE IS PROVIDED BY NORDIC SEMICONDUCTOR ASA "AS IS" AND ANY EXPRESS + * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + * OF MERCHANTABILITY, NONINFRINGEMENT, AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL NORDIC SEMICONDUCTOR ASA OR CONTRIBUTORS BE + * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE + * GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT + * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * */ - +#include "sdk_common.h" +#if NRF_MODULE_ENABLED(HCI_MEM_POOL) #include "hci_mem_pool.h" -//#include "hci_mem_pool_internal.h" -#include "nordic_common.h" #include #include - -// Adafruit for dual transport serial + ble -#define BLE_TX_BUF_SIZE 4u /**< TX buffer size in bytes. */ -#define BLE_RX_BUF_SIZE 32u /**< RX buffer size in bytes. */ -#define BLE_RX_BUF_QUEUE_SIZE 8u /**< RX buffer element size. */ - -#define SERIAL_TX_BUF_SIZE 32u /**< TX buffer size in bytes. */ -#define SERIAL_RX_BUF_SIZE 600u /**< RX buffer size in bytes. */ -#define SERIAL_RX_BUF_QUEUE_SIZE 2u /**< RX buffer element size. */ - -extern bool is_ota(void); - -#define RX_BUF_SIZE (is_ota() ? BLE_RX_BUF_SIZE : SERIAL_RX_BUF_SIZE) -#define TX_BUF_SIZE (is_ota() ? BLE_TX_BUF_SIZE : SERIAL_TX_BUF_SIZE) -#define RX_BUF_QUEUE_SIZE (is_ota() ? BLE_RX_BUF_QUEUE_SIZE : SERIAL_RX_BUF_QUEUE_SIZE) - -/**@brief RX buffer element instance structure. +/**@brief RX buffer element instance structure. */ -typedef struct +typedef struct { -// uint8_t rx_buffer[RX_BUF_SIZE]; /**< RX buffer memory array. */ - uint8_t rx_buffer[MAX(BLE_RX_BUF_SIZE, SERIAL_RX_BUF_SIZE)]; + uint8_t rx_buffer[HCI_RX_BUF_SIZE]; /**< RX buffer memory array. */ uint32_t length; /**< Length of the RX buffer memory array. */ } rx_buffer_elem_t; -/**@brief RX buffer queue element instance structure. +/**@brief RX buffer queue element instance structure. */ -typedef struct +typedef struct { rx_buffer_elem_t * p_buffer; /**< Pointer to RX buffer element. */ uint32_t free_window_count; /**< Free space element count. */ uint32_t free_available_count; /**< Free area element count. */ uint32_t read_available_count; /**< Read area element count. */ - uint32_t write_index; /**< Write position index. */ - uint32_t read_index; /**< Read position index. */ - uint32_t free_index; /**< Free position index. */ + uint32_t write_index; /**< Write position index. */ + uint32_t read_index; /**< Read position index. */ + uint32_t free_index; /**< Free position index. */ } rx_buffer_queue_t; static bool m_is_tx_allocated; /**< Boolean value to determine if the TX buffer is allocated. */ -static rx_buffer_elem_t m_rx_buffer_elem_queue[MAX(BLE_RX_BUF_QUEUE_SIZE, SERIAL_RX_BUF_QUEUE_SIZE)]; /**< RX buffer element instances. */ +static rx_buffer_elem_t m_rx_buffer_elem_queue[HCI_RX_BUF_QUEUE_SIZE]; /**< RX buffer element instances. */ static rx_buffer_queue_t m_rx_buffer_queue; /**< RX buffer queue element instance. */ uint32_t hci_mem_pool_open(void) { - m_is_tx_allocated = false; + m_is_tx_allocated = false; m_rx_buffer_queue.p_buffer = m_rx_buffer_elem_queue; - m_rx_buffer_queue.free_window_count = RX_BUF_QUEUE_SIZE; + m_rx_buffer_queue.free_window_count = HCI_RX_BUF_QUEUE_SIZE; m_rx_buffer_queue.free_available_count = 0; m_rx_buffer_queue.read_available_count = 0; - m_rx_buffer_queue.write_index = 0; - m_rx_buffer_queue.read_index = 0; - m_rx_buffer_queue.free_index = 0; - + m_rx_buffer_queue.write_index = 0; + m_rx_buffer_queue.read_index = 0; + m_rx_buffer_queue.free_index = 0; + return NRF_SUCCESS; } uint32_t hci_mem_pool_close(void) -{ +{ return NRF_SUCCESS; } uint32_t hci_mem_pool_tx_alloc(void ** pp_buffer) { - static uint8_t tx_buffer[MAX(BLE_TX_BUF_SIZE, SERIAL_TX_BUF_SIZE)]; + static uint8_t tx_buffer[HCI_TX_BUF_SIZE]; uint32_t err_code; - + if (pp_buffer == NULL) { return NRF_ERROR_NULL; } - + if (!m_is_tx_allocated) - { + { m_is_tx_allocated = true; *pp_buffer = tx_buffer; err_code = NRF_SUCCESS; @@ -101,7 +111,7 @@ uint32_t hci_mem_pool_tx_alloc(void ** pp_buffer) { err_code = NRF_ERROR_NO_MEM; } - + return err_code; } @@ -109,51 +119,51 @@ uint32_t hci_mem_pool_tx_alloc(void ** pp_buffer) uint32_t hci_mem_pool_tx_free(void) { m_is_tx_allocated = false; - + return NRF_SUCCESS; } uint32_t hci_mem_pool_rx_produce(uint32_t length, void ** pp_buffer) { - uint32_t err_code; + uint32_t err_code; if (pp_buffer == NULL) { return NRF_ERROR_NULL; - } + } *pp_buffer = NULL; - - if (m_rx_buffer_queue.free_window_count != 0) - { - if (length <= RX_BUF_SIZE) - { - --(m_rx_buffer_queue.free_window_count); - ++(m_rx_buffer_queue.read_available_count); - *pp_buffer = + if (m_rx_buffer_queue.free_window_count != 0) + { + if (length <= HCI_RX_BUF_SIZE) + { + --(m_rx_buffer_queue.free_window_count); + ++(m_rx_buffer_queue.read_available_count); + + *pp_buffer = m_rx_buffer_queue.p_buffer[m_rx_buffer_queue.write_index].rx_buffer; m_rx_buffer_queue.free_index |= (1u << m_rx_buffer_queue.write_index); - // @note: Adjust the write_index making use of the fact that the buffer size is of - // power of two and two's complement arithmetic. For details refer example to book + // @note: Adjust the write_index making use of the fact that the buffer size is of + // power of two and two's complement arithmetic. For details refer example to book // "Making embedded systems: Elicia White". - m_rx_buffer_queue.write_index = - (m_rx_buffer_queue.write_index + 1u) & (RX_BUF_QUEUE_SIZE - 1u); - + m_rx_buffer_queue.write_index = + (m_rx_buffer_queue.write_index + 1u) & (HCI_RX_BUF_QUEUE_SIZE - 1u); + err_code = NRF_SUCCESS; } else { - err_code = NRF_ERROR_DATA_SIZE; - } + err_code = NRF_ERROR_DATA_SIZE; + } } else { - err_code = NRF_ERROR_NO_MEM; + err_code = NRF_ERROR_NO_MEM; } - + return err_code; } @@ -163,16 +173,16 @@ uint32_t hci_mem_pool_rx_consume(uint8_t * p_buffer) uint32_t err_code; uint32_t consume_index; uint32_t start_index; - + if (m_rx_buffer_queue.free_available_count != 0) { // Find the buffer that has been freed - // Start at read_index minus free_available_count and then increment until read index. err_code = NRF_ERROR_INVALID_ADDR; - consume_index = (m_rx_buffer_queue.read_index - m_rx_buffer_queue.free_available_count) & - (RX_BUF_QUEUE_SIZE - 1u); + consume_index = (m_rx_buffer_queue.read_index - m_rx_buffer_queue.free_available_count) & + (HCI_RX_BUF_QUEUE_SIZE - 1u); start_index = consume_index; - + do { if (m_rx_buffer_queue.p_buffer[consume_index].rx_buffer == p_buffer) @@ -183,36 +193,36 @@ uint32_t hci_mem_pool_rx_consume(uint8_t * p_buffer) } else { - consume_index = (consume_index + 1u) & (RX_BUF_QUEUE_SIZE - 1u); + consume_index = (consume_index + 1u) & (HCI_RX_BUF_QUEUE_SIZE - 1u); } } while (consume_index != m_rx_buffer_queue.read_index); - while (!(m_rx_buffer_queue.free_index & (1 << start_index)) && + while (!(m_rx_buffer_queue.free_index & (1 << start_index)) && (m_rx_buffer_queue.free_available_count != 0)) { --(m_rx_buffer_queue.free_available_count); - ++(m_rx_buffer_queue.free_window_count); - start_index = (consume_index + 1u) & (RX_BUF_QUEUE_SIZE - 1u); + ++(m_rx_buffer_queue.free_window_count); + start_index = (consume_index + 1u) & (HCI_RX_BUF_QUEUE_SIZE - 1u); } } else { err_code = NRF_ERROR_NO_MEM; } - - return err_code; + + return err_code; } uint32_t hci_mem_pool_rx_data_size_set(uint32_t length) { // @note: Adjust the write_index making use of the fact that the buffer size is of power - // of two and two's complement arithmetic. For details refer example to book + // of two and two's complement arithmetic. For details refer example to book // "Making embedded systems: Elicia White". - const uint32_t index = (m_rx_buffer_queue.write_index - 1u) & (RX_BUF_QUEUE_SIZE - 1u); - m_rx_buffer_queue.p_buffer[index].length = length; - + const uint32_t index = (m_rx_buffer_queue.write_index - 1u) & (HCI_RX_BUF_QUEUE_SIZE - 1u); + m_rx_buffer_queue.p_buffer[index].length = length; + return NRF_SUCCESS; } @@ -220,34 +230,35 @@ uint32_t hci_mem_pool_rx_data_size_set(uint32_t length) uint32_t hci_mem_pool_rx_extract(uint8_t ** pp_buffer, uint32_t * p_length) { uint32_t err_code; - + if ((pp_buffer == NULL) || (p_length == NULL)) { return NRF_ERROR_NULL; } - + if (m_rx_buffer_queue.read_available_count != 0) { --(m_rx_buffer_queue.read_available_count); - ++(m_rx_buffer_queue.free_available_count); - - *pp_buffer = + ++(m_rx_buffer_queue.free_available_count); + + *pp_buffer = m_rx_buffer_queue.p_buffer[m_rx_buffer_queue.read_index].rx_buffer; - *p_length = + *p_length = m_rx_buffer_queue.p_buffer[m_rx_buffer_queue.read_index].length; - + // @note: Adjust the write_index making use of the fact that the buffer size is of power - // of two and two's complement arithmetic. For details refer example to book - // "Making embedded systems: Elicia White". - m_rx_buffer_queue.read_index = - (m_rx_buffer_queue.read_index + 1u) & (RX_BUF_QUEUE_SIZE - 1u); - + // of two and two's complement arithmetic. For details refer example to book + // "Making embedded systems: Elicia White". + m_rx_buffer_queue.read_index = + (m_rx_buffer_queue.read_index + 1u) & (HCI_RX_BUF_QUEUE_SIZE - 1u); + err_code = NRF_SUCCESS; } else { - err_code = NRF_ERROR_NO_MEM; + err_code = NRF_ERROR_NO_MEM; } - + return err_code; } +#endif //NRF_MODULE_ENABLED(HCI_MEM_POOL) diff --git a/nRF5_SDK_11.0.0_89a8197/components/libraries/hci/hci_mem_pool.h b/nRF5_SDK_11.0.0_89a8197/components/libraries/hci/hci_mem_pool.h index 502265e..25fff09 100644 --- a/nRF5_SDK_11.0.0_89a8197/components/libraries/hci/hci_mem_pool.h +++ b/nRF5_SDK_11.0.0_89a8197/components/libraries/hci/hci_mem_pool.h @@ -1,30 +1,57 @@ -/* Copyright (c) 2013 Nordic Semiconductor. All Rights Reserved. - * - * The information contained herein is property of Nordic Semiconductor ASA. - * Terms and conditions of usage are described in detail in NORDIC - * SEMICONDUCTOR STANDARD SOFTWARE LICENSE AGREEMENT. - * - * Licensees are granted free, non-transferable use of the information. NO - * WARRANTY of ANY KIND is provided. This heading must NOT be removed from - * the file. - * +/** + * Copyright (c) 2013 - 2017, Nordic Semiconductor ASA + * + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without modification, + * are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form, except as embedded into a Nordic + * Semiconductor ASA integrated circuit in a product or a software update for + * such product, must reproduce the above copyright notice, this list of + * conditions and the following disclaimer in the documentation and/or other + * materials provided with the distribution. + * + * 3. Neither the name of Nordic Semiconductor ASA nor the names of its + * contributors may be used to endorse or promote products derived from this + * software without specific prior written permission. + * + * 4. This software, with or without modification, must only be used with a + * Nordic Semiconductor ASA integrated circuit. + * + * 5. Any software provided in binary form under this license must not be reverse + * engineered, decompiled, modified and/or disassembled. + * + * THIS SOFTWARE IS PROVIDED BY NORDIC SEMICONDUCTOR ASA "AS IS" AND ANY EXPRESS + * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + * OF MERCHANTABILITY, NONINFRINGEMENT, AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL NORDIC SEMICONDUCTOR ASA OR CONTRIBUTORS BE + * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE + * GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT + * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * */ - /** @file * - * @defgroup memory_pool Memory pool + * @defgroup hci_mem_pool Memory pool * @{ * @ingroup app_common * * @brief Memory pool implementation * - * Memory pool implementation, based on circular buffer data structure, which supports asynchronous + * Memory pool implementation, based on circular buffer data structure, which supports asynchronous * processing of RX data. The current default implementation supports 1 TX buffer and 4 RX buffers. - * The memory managed by the pool is allocated from static storage instead of heap. The internal - * design of the circular buffer implementing the RX memory layout is illustrated in the picture - * below. + * The memory managed by the pool is allocated from static storage instead of heap. The internal + * design of the circular buffer implementing the RX memory layout is illustrated in the picture + * below. * - * @image html memory_pool.png "Circular buffer design" + * @image html memory_pool.svg "Circular buffer design" * * The expected call order for the RX APIs is as follows: * - hci_mem_pool_rx_produce @@ -37,26 +64,30 @@ * \par Component specific configuration options * * The following compile time configuration options are available to suit various implementations: - * - TX_BUF_SIZE TX buffer size in bytes. - * - RX_BUF_SIZE RX buffer size in bytes. + * - TX_BUF_SIZE TX buffer size in bytes. + * - RX_BUF_SIZE RX buffer size in bytes. * - RX_BUF_QUEUE_SIZE RX buffer element size. */ - + #ifndef HCI_MEM_POOL_H__ #define HCI_MEM_POOL_H__ #include #include "nrf_error.h" +#ifdef __cplusplus +extern "C" { +#endif + /**@brief Function for opening the module. * - * @retval NRF_SUCCESS Operation success. + * @retval NRF_SUCCESS Operation success. */ uint32_t hci_mem_pool_open(void); /**@brief Function for closing the module. * - * @retval NRF_SUCCESS Operation success. + * @retval NRF_SUCCESS Operation success. */ uint32_t hci_mem_pool_close(void); @@ -66,37 +97,37 @@ uint32_t hci_mem_pool_close(void); * * @retval NRF_SUCCESS Operation success. Memory was allocated. * @retval NRF_ERROR_NO_MEM Operation failure. No memory available for allocation. - * @retval NRF_ERROR_NULL Operation failure. NULL pointer supplied. + * @retval NRF_ERROR_NULL Operation failure. NULL pointer supplied. */ uint32_t hci_mem_pool_tx_alloc(void ** pp_buffer); - + /**@brief Function for freeing previously allocated TX memory. * - * @note Memory management follows the FIFO principle meaning that free() order must match the - * alloc(...) order, which is the reason for omitting exact memory block identifier as an + * @note Memory management follows the FIFO principle meaning that free() order must match the + * alloc(...) order, which is the reason for omitting exact memory block identifier as an * input parameter. * * @retval NRF_SUCCESS Operation success. Memory was freed. */ uint32_t hci_mem_pool_tx_free(void); - + /**@brief Function for producing a free RX memory block for usage. * - * @note Upon produce request amount being 0, NRF_SUCCESS is returned. + * @note Upon produce request amount being 0, NRF_SUCCESS is returned. * * @param[in] length Amount, in bytes, of free memory to be produced. * @param[out] pp_buffer Pointer to the allocated memory. * * @retval NRF_SUCCESS Operation success. Free RX memory block produced. * @retval NRF_ERROR_NO_MEM Operation failure. No suitable memory available for allocation. - * @retval NRF_ERROR_DATA_SIZE Operation failure. Request size exceeds limit. - * @retval NRF_ERROR_NULL Operation failure. NULL pointer supplied. + * @retval NRF_ERROR_DATA_SIZE Operation failure. Request size exceeds limit. + * @retval NRF_ERROR_NULL Operation failure. NULL pointer supplied. */ uint32_t hci_mem_pool_rx_produce(uint32_t length, void ** pp_buffer); /**@brief Function for setting the length of the last produced RX memory block. * - * @warning If call to this API is omitted the end result is that the following call to + * @warning If call to this API is omitted the end result is that the following call to * mem_pool_rx_extract will return incorrect data in the p_length output parameter. * * @param[in] length Amount, in bytes, of actual memory used. @@ -104,29 +135,34 @@ uint32_t hci_mem_pool_rx_produce(uint32_t length, void ** pp_buffer); * @retval NRF_SUCCESS Operation success. Length was set. */ uint32_t hci_mem_pool_rx_data_size_set(uint32_t length); - -/**@brief Function for extracting a packet, which has been filled with read data, for further + +/**@brief Function for extracting a packet, which has been filled with read data, for further * processing. * * @param[out] pp_buffer Pointer to the packet data. - * @param[out] p_length Length of packet data in bytes. + * @param[out] p_length Length of packet data in bytes. * - * @retval NRF_SUCCESS Operation success. + * @retval NRF_SUCCESS Operation success. * @retval NRF_ERROR_NO_MEM Operation failure. No packet available to extract. - * @retval NRF_ERROR_NULL Operation failure. NULL pointer supplied. + * @retval NRF_ERROR_NULL Operation failure. NULL pointer supplied. */ uint32_t hci_mem_pool_rx_extract(uint8_t ** pp_buffer, uint32_t * p_length); - + /**@brief Function for freeing previously extracted packet, which has been filled with read data. * * @param[in] p_buffer Pointer to consumed buffer. * - * @retval NRF_SUCCESS Operation success. - * @retval NRF_ERROR_NO_MEM Operation failure. No packet available to free. - * @retval NRF_ERROR_INVALID_ADDR Operation failure. Not a valid pointer. + * @retval NRF_SUCCESS Operation success. + * @retval NRF_ERROR_NO_MEM Operation failure. No packet available to free. + * @retval NRF_ERROR_INVALID_ADDR Operation failure. Not a valid pointer. */ uint32_t hci_mem_pool_rx_consume(uint8_t * p_buffer); - + + +#ifdef __cplusplus +} +#endif + #endif // HCI_MEM_POOL_H__ - + /** @} */ diff --git a/nRF5_SDK_11.0.0_89a8197/components/libraries/hci/hci_slip.c b/nRF5_SDK_11.0.0_89a8197/components/libraries/hci/hci_slip.c index 4c40808..18657db 100644 --- a/nRF5_SDK_11.0.0_89a8197/components/libraries/hci/hci_slip.c +++ b/nRF5_SDK_11.0.0_89a8197/components/libraries/hci/hci_slip.c @@ -1,18 +1,46 @@ -/* Copyright (c) 2013 Nordic Semiconductor. All Rights Reserved. - * - * The information contained herein is property of Nordic Semiconductor ASA. - * Terms and conditions of usage are described in detail in NORDIC - * SEMICONDUCTOR STANDARD SOFTWARE LICENSE AGREEMENT. - * - * Licensees are granted free, non-transferable use of the information. NO - * WARRANTY of ANY KIND is provided. This heading must NOT be removed from - * the file. - * +/** + * Copyright (c) 2013 - 2017, Nordic Semiconductor ASA + * + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without modification, + * are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form, except as embedded into a Nordic + * Semiconductor ASA integrated circuit in a product or a software update for + * such product, must reproduce the above copyright notice, this list of + * conditions and the following disclaimer in the documentation and/or other + * materials provided with the distribution. + * + * 3. Neither the name of Nordic Semiconductor ASA nor the names of its + * contributors may be used to endorse or promote products derived from this + * software without specific prior written permission. + * + * 4. This software, with or without modification, must only be used with a + * Nordic Semiconductor ASA integrated circuit. + * + * 5. Any software provided in binary form under this license must not be reverse + * engineered, decompiled, modified and/or disassembled. + * + * THIS SOFTWARE IS PROVIDED BY NORDIC SEMICONDUCTOR ASA "AS IS" AND ANY EXPRESS + * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + * OF MERCHANTABILITY, NONINFRINGEMENT, AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL NORDIC SEMICONDUCTOR ASA OR CONTRIBUTORS BE + * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE + * GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT + * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * */ - +#include "sdk_common.h" +#if NRF_MODULE_ENABLED(HCI_SLIP) #include "hci_slip.h" #include -#include "hci_transport_config.h" #include "app_uart.h" #include "nrf_error.h" @@ -121,7 +149,7 @@ static uint32_t send_tx_byte_encoded(void) { uint32_t err_code; - switch(mp_tx_buffer[m_tx_buffer_index]) + switch (mp_tx_buffer[m_tx_buffer_index]) { case APP_SLIP_END: err_code = app_uart_put(APP_SLIP_ESC_END); @@ -333,19 +361,19 @@ static uint32_t slip_uart_open(void) app_uart_comm_params_t comm_params = { - HCI_SLIP_UART_RX_PIN_NUMBER, - HCI_SLIP_UART_TX_PIN_NUMBER, - HCI_SLIP_UART_RTS_PIN_NUMBER, - HCI_SLIP_UART_CTS_PIN_NUMBER, - HCI_SLIP_UART_MODE, + HCI_UART_RX_PIN, + HCI_UART_TX_PIN, + HCI_UART_RTS_PIN, + HCI_UART_CTS_PIN, + (app_uart_flow_control_t)HCI_UART_FLOW_CONTROL, false, - HCI_SLIP_UART_BAUDRATE + HCI_UART_BAUDRATE }; err_code = app_uart_init(&comm_params, NULL, slip_uart_eventhandler, - APP_IRQ_PRIORITY_LOW); + APP_IRQ_PRIORITY_LOWEST); if (err_code == NRF_SUCCESS) { @@ -426,3 +454,4 @@ uint32_t hci_slip_rx_buffer_register(uint8_t * p_buffer, uint32_t length) handle_rx_byte = handle_rx_byte_wait_start; return NRF_SUCCESS; } +#endif //NRF_MODULE_ENABLED(HCI_SLIP) diff --git a/nRF5_SDK_11.0.0_89a8197/components/libraries/hci/hci_slip.h b/nRF5_SDK_11.0.0_89a8197/components/libraries/hci/hci_slip.h index cc3b415..16040fb 100644 --- a/nRF5_SDK_11.0.0_89a8197/components/libraries/hci/hci_slip.h +++ b/nRF5_SDK_11.0.0_89a8197/components/libraries/hci/hci_slip.h @@ -1,15 +1,42 @@ -/* Copyright (c) 2013 Nordic Semiconductor. All Rights Reserved. - * - * The information contained herein is property of Nordic Semiconductor ASA. - * Terms and conditions of usage are described in detail in NORDIC - * SEMICONDUCTOR STANDARD SOFTWARE LICENSE AGREEMENT. - * - * Licensees are granted free, non-transferable use of the information. NO - * WARRANTY of ANY KIND is provided. This heading must NOT be removed from - * the file. - * +/** + * Copyright (c) 2013 - 2017, Nordic Semiconductor ASA + * + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without modification, + * are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form, except as embedded into a Nordic + * Semiconductor ASA integrated circuit in a product or a software update for + * such product, must reproduce the above copyright notice, this list of + * conditions and the following disclaimer in the documentation and/or other + * materials provided with the distribution. + * + * 3. Neither the name of Nordic Semiconductor ASA nor the names of its + * contributors may be used to endorse or promote products derived from this + * software without specific prior written permission. + * + * 4. This software, with or without modification, must only be used with a + * Nordic Semiconductor ASA integrated circuit. + * + * 5. Any software provided in binary form under this license must not be reverse + * engineered, decompiled, modified and/or disassembled. + * + * THIS SOFTWARE IS PROVIDED BY NORDIC SEMICONDUCTOR ASA "AS IS" AND ANY EXPRESS + * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + * OF MERCHANTABILITY, NONINFRINGEMENT, AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL NORDIC SEMICONDUCTOR ASA OR CONTRIBUTORS BE + * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE + * GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT + * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * */ - /** @file * * @defgroup hci_slip SLIP module @@ -33,6 +60,10 @@ #include +#ifdef __cplusplus +extern "C" { +#endif + /**@brief Event types from the SLIP Layer. */ typedef enum { @@ -59,7 +90,7 @@ typedef void (*hci_slip_event_handler_t)(hci_slip_evt_t event); /**@brief Function for registering the event handler provided as parameter and this event handler * will be used by SLIP layer to send events described in \ref hci_slip_evt_type_t. * - * @note Multiple registration requests will overwrite any existing registration. + * @note Multiple registration requests will overwrite any existing registration. * * @param[in] event_handler This function is called by the SLIP layer upon an event. * @@ -70,8 +101,8 @@ uint32_t hci_slip_evt_handler_register(hci_slip_event_handler_t event_handler); /**@brief Function for opening the SLIP layer. This function must be called before * \ref hci_slip_write and before any data can be received. * - * @note Can be called multiple times. - * + * @note Can be called multiple times. + * * @retval NRF_SUCCESS Operation success. * * The SLIP layer module will propagate errors from underlying sub-modules. @@ -84,8 +115,8 @@ uint32_t hci_slip_open(void); * transmitted or received in this layer. * * @note This function can be called multiple times and also for an unopened channel. - * - * @retval NRF_SUCCESS Operation success. + * + * @retval NRF_SUCCESS Operation success. */ uint32_t hci_slip_close(void); @@ -95,8 +126,8 @@ uint32_t hci_slip_close(void); * @param[in] p_buffer Pointer to the packet to transmit. * @param[in] length Packet length, in bytes. * - * @retval NRF_SUCCESS Operation success. Packet was encoded and added to the - * transmission queue and an event will be sent upon transmission + * @retval NRF_SUCCESS Operation success. Packet was encoded and added to the + * transmission queue and an event will be sent upon transmission * completion. * @retval NRF_ERROR_NO_MEM Operation failure. Transmission queue is full and packet was not * added to the transmission queue. Application shall wait for @@ -120,10 +151,15 @@ uint32_t hci_slip_write(const uint8_t * p_buffer, uint32_t length); * will be placed in this buffer. * @param[in] length Buffer length, in bytes. * - * @retval NRF_SUCCESS Operation success. + * @retval NRF_SUCCESS Operation success. */ uint32_t hci_slip_rx_buffer_register(uint8_t * p_buffer, uint32_t length); - + + +#ifdef __cplusplus +} +#endif + #endif // HCI_SLIP_H__ - + /** @} */ diff --git a/nRF5_SDK_11.0.0_89a8197/components/libraries/hci/hci_transport.c b/nRF5_SDK_11.0.0_89a8197/components/libraries/hci/hci_transport.c index fe45f24..3506476 100644 --- a/nRF5_SDK_11.0.0_89a8197/components/libraries/hci/hci_transport.c +++ b/nRF5_SDK_11.0.0_89a8197/components/libraries/hci/hci_transport.c @@ -1,25 +1,51 @@ -/* Copyright (c) 2013 Nordic Semiconductor. All Rights Reserved. - * - * The information contained herein is property of Nordic Semiconductor ASA. - * Terms and conditions of usage are described in detail in NORDIC - * SEMICONDUCTOR STANDARD SOFTWARE LICENSE AGREEMENT. - * - * Licensees are granted free, non-transferable use of the information. NO - * WARRANTY of ANY KIND is provided. This heading must NOT be removed from - * the file. - * +/** + * Copyright (c) 2013 - 2017, Nordic Semiconductor ASA + * + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without modification, + * are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form, except as embedded into a Nordic + * Semiconductor ASA integrated circuit in a product or a software update for + * such product, must reproduce the above copyright notice, this list of + * conditions and the following disclaimer in the documentation and/or other + * materials provided with the distribution. + * + * 3. Neither the name of Nordic Semiconductor ASA nor the names of its + * contributors may be used to endorse or promote products derived from this + * software without specific prior written permission. + * + * 4. This software, with or without modification, must only be used with a + * Nordic Semiconductor ASA integrated circuit. + * + * 5. Any software provided in binary form under this license must not be reverse + * engineered, decompiled, modified and/or disassembled. + * + * THIS SOFTWARE IS PROVIDED BY NORDIC SEMICONDUCTOR ASA "AS IS" AND ANY EXPRESS + * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + * OF MERCHANTABILITY, NONINFRINGEMENT, AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL NORDIC SEMICONDUCTOR ASA OR CONTRIBUTORS BE + * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE + * GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT + * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * */ - -#include "hci_transport_config.h" +#include "sdk_common.h" +#if NRF_MODULE_ENABLED(HCI_TRANSPORT) #include "hci_transport.h" #include "hci_slip.h" #include "crc16.h" #include "hci_mem_pool.h" -#include "hci_mem_pool_internal.h" #include "app_timer.h" #include "app_error.h" #include -#include "sdk_common.h" #define PKT_HDR_SIZE 4u /**< Packet header size in number of bytes. */ #define PKT_CRC_SIZE 2u /**< Packet CRC size in number of bytes. */ @@ -30,17 +56,19 @@ #define INITIAL_ACK_NUMBER_EXPECTED 1u /**< Initial acknowledge number expected. */ #define INITIAL_ACK_NUMBER_TX INITIAL_ACK_NUMBER_EXPECTED /**< Initial acknowledge number transmitted. */ #define INVALID_PKT_TYPE 0xFFFFFFFFu /**< Internal invalid packet type value. */ -#define MAX_TRANSMISSION_TIME (ROUNDED_DIV((MAX_PACKET_SIZE_IN_BITS * 1000u), USED_BAUD_RATE)) /**< Max transmission time of a single application packet over UART in units of mseconds. */ -#define RETRANSMISSION_TIMEOUT_IN_MS (3u * MAX_TRANSMISSION_TIME) /**< Retransmission timeout for application packet in units of mseconds. */ -#define APP_TIMER_PRESCALER 0 /**< Value of the RTC1 PRESCALER register. */ -#define RETRANSMISSION_TIMEOUT_IN_TICKS APP_TIMER_TICKS(RETRANSMISSION_TIMEOUT_IN_MS, APP_TIMER_PRESCALER) /**< Retransmission timeout for application packet in units of timer ticks. */ +#define HCI_UART_REG_VALUE_TO_BAUDRATE(BAUDRATE) ((BAUDRATE)/268) /**< Estimated relation between UART baudrate register value and actual baudrate */ +#define MAX_TRANSMISSION_TIME \ + (ROUNDED_DIV((HCI_MAX_PACKET_SIZE_IN_BITS * 1000u), \ + HCI_UART_REG_VALUE_TO_BAUDRATE(HCI_UART_BAUDRATE))) /**< Max transmission time of a single application packet over UART in units of mseconds. */ +#define RETRANSMISSION_TIMEOUT_IN_MS (3u * MAX_TRANSMISSION_TIME) /**< Retransmission timeout for application packet in units of mseconds. */ +#define RETRANSMISSION_TIMEOUT_IN_TICKS APP_TIMER_TICKS(RETRANSMISSION_TIMEOUT_IN_MS) /**< Retransmission timeout for application packet in units of timer ticks. */ #define MAX_RETRY_COUNT 5u /**< Max retransmission retry count for application packets. */ #define ACK_BUF_SIZE 5u /**< Length of module internal RX buffer which is big enough to hold an acknowledgement packet. */ /**@brief States of the TX state machine. */ typedef enum { - TX_STATE_IDLE, /**< State for: no application transmission packet processing in progress. */ + TX_STATE_IDLE, /**< State for: no application transmission packet processing in progress. */ TX_STATE_PENDING, /**< State for: TX in progress in slip layer and TX-done event is waited for to signal the end of transmission. */ TX_STATE_ACTIVE /**< State for: application packet has been delivered to slip for transmission and peer transport entity acknowledgement packet is waited for. */ } tx_state_t; @@ -48,7 +76,7 @@ typedef enum /**@brief TX state machine events. */ typedef enum { - TX_EVENT_STATE_ENTRY, /**< Event for: state entry use case. */ + TX_EVENT_STATE_ENTRY, /**< Event for: state entry use case. */ TX_EVENT_SLIP_TX_DONE, /**< Event for: HCI_SLIP_TX_DONE event use case. */ TX_EVENT_TIMEOUT, /**< Event for: retransmission timeout use case. */ TX_EVENT_VALID_RX_ACK /**< Event for: valid acknowledgement received for TX packet use case. */ @@ -60,8 +88,8 @@ static tx_state_t m_tx_state; /**< Curren static hci_transport_tx_done_handler_t m_transport_tx_done_handle; /**< TX done event callback function. */ static hci_transport_event_handler_t m_transport_event_handle; /**< Event handler callback function. */ static uint8_t * mp_slip_used_rx_buffer; /**< Reference to RX buffer used by the slip layer. */ -static uint32_t m_packet_expected_seq_number; /**< Sequence number counter of the packet expected to be received . */ -static uint32_t m_packet_transmit_seq_number; /**< Sequence number counter of the transmitted packet for which acknowledgement packet is waited for. */ +static uint32_t m_packet_expected_seq_number; /**< Sequence number counter of the packet expected to be received . */ +static uint32_t m_packet_transmit_seq_number; /**< Sequence number counter of the transmitted packet for which acknowledgement packet is waited for. */ static uint8_t * mp_tx_buffer; /**< Pointer to TX application buffer to be transmitted. */ static uint32_t m_tx_buffer_length; /**< Length of application TX packet data to be transmitted in bytes. */ static bool m_is_slip_decode_ready; /**< Boolean to determine has slip decode been completed or not. */ @@ -74,12 +102,12 @@ static uint8_t m_rx_ack_buffer[ACK_BUF_SIZE];/**< RX buf /**@brief Function for validating a received packet. * * @param[in] p_buffer Pointer to the packet data. - * @param[in] length Length of packet data in bytes. + * @param[in] length Length of packet data in bytes. * * @return true if received packet is valid, false in other case. */ static bool is_rx_pkt_valid(const uint8_t * p_buffer, uint32_t length) -{ +{ // Executed packet filtering algorithm order: // - verify packet overall length // - verify data integrity bit set @@ -90,38 +118,38 @@ static bool is_rx_pkt_valid(const uint8_t * p_buffer, uint32_t length) // - verify CRC if (length <= PKT_HDR_SIZE) { - return false; + return false; } - + if (!(p_buffer[0] & DATA_INTEGRITY_MASK)) { return false; - } - + } + if (!(p_buffer[0] & RELIABLE_PKT_MASK)) { return false; - } - - if ((p_buffer[1] & 0x0Fu) != PKT_TYPE_VENDOR_SPECIFIC) - { - return false; } - - const uint32_t expected_checksum = - ((p_buffer[0] + p_buffer[1] + p_buffer[2] + p_buffer[3])) & 0xFFu; - if (expected_checksum != 0) - { + + if ((p_buffer[1] & 0x0Fu) != PKT_TYPE_VENDOR_SPECIFIC) + { return false; } - + + const uint32_t expected_checksum = + ((p_buffer[0] + p_buffer[1] + p_buffer[2] + p_buffer[3])) & 0xFFu; + if (expected_checksum != 0) + { + return false; + } + const uint16_t crc_calculated = crc16_compute(p_buffer, (length - PKT_CRC_SIZE), NULL); const uint16_t crc_received = uint16_decode(&p_buffer[length - PKT_CRC_SIZE]); if (crc_calculated != crc_received) { return false; } - + return true; } @@ -131,7 +159,7 @@ static bool is_rx_pkt_valid(const uint8_t * p_buffer, uint32_t length) * @return sequence number of the next reliable packet expected. */ static __INLINE uint8_t packet_number_expected_get(void) -{ +{ return (uint8_t) m_packet_expected_seq_number; } @@ -146,13 +174,13 @@ static uint8_t header_checksum_calculate(const uint8_t * p_hdr) { // @note: no pointer validation check needed as already checked by calling function. uint32_t checksum; - - checksum = p_hdr[0]; - checksum += p_hdr[1]; - checksum += p_hdr[2]; + + checksum = p_hdr[0]; + checksum += p_hdr[1]; + checksum += p_hdr[2]; checksum &= 0xFFu; checksum = (~checksum + 1u); - + return (uint8_t)checksum; } @@ -162,31 +190,31 @@ static uint8_t header_checksum_calculate(const uint8_t * p_hdr) static void ack_transmit(void) { static uint8_t ack_packet[PKT_HDR_SIZE]; - + // TX ACK packet format: // - Unreliable Packet type // - Payload Length set to 0 // - Sequence Number set to 0 // - Header checksum calculated - // - Acknowledge Number set correctly + // - Acknowledge Number set correctly ack_packet[0] = (packet_number_expected_get() << 3u); - ack_packet[1] = 0; - ack_packet[2] = 0; - ack_packet[3] = header_checksum_calculate(ack_packet); + ack_packet[1] = 0; + ack_packet[2] = 0; + ack_packet[3] = header_checksum_calculate(ack_packet); - // @note: no return value check needed for hci_slip_write(...) call as acknowledgement packets - // are considered to be from system design point of view unreliable packets.Use case where + // @note: no return value check needed for hci_slip_write(...) call as acknowledgement packets + // are considered to be from system design point of view unreliable packets.Use case where // underlying slip layer does not accept a packet for transmission is managed either by: - // - acknowledged by possible future application packet as acknowledgement number header field - // is included - // - protocol peer entity will retransmit the packet - UNUSED_VARIABLE(hci_slip_write(ack_packet, sizeof(ack_packet))); + // - acknowledged by possible future application packet as acknowledgement number header field + // is included + // - protocol peer entity will retransmit the packet + UNUSED_VARIABLE(hci_slip_write(ack_packet, sizeof(ack_packet))); } /**@brief Function for validating a received packet. * - * @param[in] p_buffer Pointer to the packet data. + * @param[in] p_buffer Pointer to the packet data. * * @return sequence number field of the packet header with unrelated data masked out. */ @@ -201,14 +229,14 @@ static __INLINE uint8_t packet_seq_nmbr_extract(const uint8_t * p_buffer) static __INLINE void packet_number_expected_inc(void) { ++m_packet_expected_seq_number; - m_packet_expected_seq_number &= 0x07u; + m_packet_expected_seq_number &= 0x07u; } /**@brief Function for decoding a packet type field. * - * @param[in] p_buffer Pointer to the packet data. - * @param[in] length Length of packet data in bytes. + * @param[in] p_buffer Pointer to the packet data. + * @param[in] length Length of packet data in bytes. * * @return Packet type field or INVALID_PKT_TYPE in case of decode error. */ @@ -216,30 +244,30 @@ static __INLINE uint32_t packet_type_decode(const uint8_t * p_buffer, uint32_t l { // @note: no pointer validation check needed as allready checked by calling function. uint32_t return_value; - + if (length >= PKT_HDR_SIZE) { return_value = (p_buffer[1] & 0x0Fu); - } + } else { return_value = INVALID_PKT_TYPE; - } - + } + return return_value; } /**@brief Function for processing a received vendor specific packet. * - * @param[in] p_buffer Pointer to the packet data. - * @param[in] length Length of packet data in bytes. + * @param[in] p_buffer Pointer to the packet data. + * @param[in] length Length of packet data in bytes. */ static void rx_vendor_specific_pkt_type_handle(const uint8_t * p_buffer, uint32_t length) { // @note: no pointer validation check needed as allready checked by calling function. uint32_t err_code; - + if (is_rx_pkt_valid(p_buffer, length)) { // RX packet is valid: validate sequence number. @@ -247,40 +275,40 @@ static void rx_vendor_specific_pkt_type_handle(const uint8_t * p_buffer, uint32_ if (packet_number_expected_get() == rx_seq_number) { // Sequence number is valid: transmit acknowledgement. - packet_number_expected_inc(); - ack_transmit(); + packet_number_expected_inc(); + ack_transmit(); + + m_is_slip_decode_ready = true; - m_is_slip_decode_ready = true; - err_code = hci_mem_pool_rx_data_size_set(length); APP_ERROR_CHECK(err_code); - err_code = hci_mem_pool_rx_produce(RX_BUF_SIZE, (void **)&mp_slip_used_rx_buffer); + err_code = hci_mem_pool_rx_produce(HCI_RX_BUF_SIZE, (void **)&mp_slip_used_rx_buffer); APP_ERROR_CHECK_BOOL((err_code == NRF_SUCCESS) || (err_code == NRF_ERROR_NO_MEM)); - // If memory pool RX buffer produce succeeded we register that buffer to slip layer - // otherwise we register the internal acknowledgement buffer. + // If memory pool RX buffer produce succeeded we register that buffer to slip layer + // otherwise we register the internal acknowledgement buffer. err_code = hci_slip_rx_buffer_register( - (err_code == NRF_SUCCESS) ? mp_slip_used_rx_buffer : m_rx_ack_buffer, - (err_code == NRF_SUCCESS) ? RX_BUF_SIZE : ACK_BUF_SIZE); + (err_code == NRF_SUCCESS) ? mp_slip_used_rx_buffer : m_rx_ack_buffer, + (err_code == NRF_SUCCESS) ? HCI_RX_BUF_SIZE : ACK_BUF_SIZE); + + APP_ERROR_CHECK(err_code); - APP_ERROR_CHECK(err_code); - if (m_transport_event_handle != NULL) { // Send application event of RX packet reception. const hci_transport_evt_t evt = {HCI_TRANSPORT_RX_RDY}; m_transport_event_handle(evt); - } + } } else { - // RX packet discarded: sequence number not valid, set the same buffer to slip layer in - // order to avoid buffer overrun. - err_code = hci_slip_rx_buffer_register(mp_slip_used_rx_buffer, RX_BUF_SIZE); - APP_ERROR_CHECK(err_code); - - // As packet did not have expected sequence number: send acknowledgement with the + // RX packet discarded: sequence number not valid, set the same buffer to slip layer in + // order to avoid buffer overrun. + err_code = hci_slip_rx_buffer_register(mp_slip_used_rx_buffer, HCI_RX_BUF_SIZE); + APP_ERROR_CHECK(err_code); + + // As packet did not have expected sequence number: send acknowledgement with the // current expected sequence number. ack_transmit(); } @@ -288,14 +316,14 @@ static void rx_vendor_specific_pkt_type_handle(const uint8_t * p_buffer, uint32_ else { // RX packet discarded: reset the same buffer to slip layer in order to avoid buffer - // overrun. - err_code = hci_slip_rx_buffer_register(mp_slip_used_rx_buffer, RX_BUF_SIZE); - APP_ERROR_CHECK(err_code); - } + // overrun. + err_code = hci_slip_rx_buffer_register(mp_slip_used_rx_buffer, HCI_RX_BUF_SIZE); + APP_ERROR_CHECK(err_code); + } } -/**@brief Function for getting the sequence number of a reliable TX packet for which peer protocol +/**@brief Function for getting the sequence number of a reliable TX packet for which peer protocol * entity acknowledgment is pending. * * @return sequence number of a reliable TX packet for which peer protocol entity acknowledgement @@ -313,43 +341,43 @@ static __INLINE uint8_t packet_number_to_transmit_get(void) */ static __INLINE uint8_t expected_ack_number_get(void) { - uint8_t seq_nmbr = packet_number_to_transmit_get(); + uint8_t seq_nmbr = packet_number_to_transmit_get(); ++seq_nmbr; seq_nmbr &= 0x07u; - + return seq_nmbr; } /**@brief Function for processing a received acknowledgement packet. * - * Verifies does the received acknowledgement packet has the expected acknowledgement number and - * that the header checksum is correct. + * Verifies does the received acknowledgement packet has the expected acknowledgement number and + * that the header checksum is correct. * - * @param[in] p_buffer Pointer to the packet data. + * @param[in] p_buffer Pointer to the packet data. * * @return true if valid acknowledgement packet received. */ static __INLINE bool rx_ack_pkt_type_handle(const uint8_t * p_buffer) { // @note: no pointer validation check needed as allready checked by calling function. - + // Verify header checksum. - const uint32_t expected_checksum = + const uint32_t expected_checksum = ((p_buffer[0] + p_buffer[1] + p_buffer[2] + p_buffer[3])) & 0xFFu; if (expected_checksum != 0) - { + { return false; } - + const uint8_t ack_number = (p_buffer[0] >> 3u) & 0x07u; - + // Verify expected acknowledgment number. return (ack_number == expected_ack_number_get()); } -/**@brief Function for incrementing the sequence number counter of the TX packet. +/**@brief Function for incrementing the sequence number counter of the TX packet. */ static __INLINE void packet_number_tx_inc(void) { @@ -365,84 +393,84 @@ static __INLINE void packet_number_tx_inc(void) static void tx_sm_event_handle(tx_event_t event) { uint32_t err_code; - + switch (m_tx_state) { case TX_STATE_IDLE: if (event == TX_EVENT_STATE_ENTRY) - { + { err_code = app_timer_stop(m_app_timer_id); APP_ERROR_CHECK(err_code); - + // Send TX-done event if registered handler exists. - if (m_transport_tx_done_handle != NULL) + if (m_transport_tx_done_handle != NULL) { m_transport_tx_done_handle(m_tx_done_result_code); - } + } } break; - + case TX_STATE_PENDING: if (event == TX_EVENT_SLIP_TX_DONE) - { - // @note: this call should always succeed as called from HCI_SLIP_TX_DONE context + { + // @note: this call should always succeed as called from HCI_SLIP_TX_DONE context // and error cases are managed by dedicated error event from the slip layer. - err_code = hci_slip_write(mp_tx_buffer, - (m_tx_buffer_length + PKT_HDR_SIZE + PKT_CRC_SIZE)); - APP_ERROR_CHECK(err_code); - tx_sm_state_change(TX_STATE_ACTIVE); - } + err_code = hci_slip_write(mp_tx_buffer, + (m_tx_buffer_length + PKT_HDR_SIZE + PKT_CRC_SIZE)); + APP_ERROR_CHECK(err_code); + tx_sm_state_change(TX_STATE_ACTIVE); + } break; - + case TX_STATE_ACTIVE: switch (event) { - case TX_EVENT_VALID_RX_ACK: - // Tx sequence number counter incremented as packet transmission + case TX_EVENT_VALID_RX_ACK: + // Tx sequence number counter incremented as packet transmission // acknowledged by peer transport entity. - packet_number_tx_inc(); + packet_number_tx_inc(); tx_sm_state_change(TX_STATE_IDLE); break; - + case TX_EVENT_STATE_ENTRY: m_tx_retry_counter = 0; - err_code = app_timer_start(m_app_timer_id, - RETRANSMISSION_TIMEOUT_IN_TICKS, + err_code = app_timer_start(m_app_timer_id, + RETRANSMISSION_TIMEOUT_IN_TICKS, NULL); APP_ERROR_CHECK(err_code); break; - + case TX_EVENT_TIMEOUT: if (m_tx_retry_counter != MAX_RETRY_COUNT) { ++m_tx_retry_counter; - // @note: no return value check done for hci_slip_write(...) call as current - // system design allows use case where retransmission is not accepted by the - // slip layer due to existing acknowledgement packet transmission in the - // slip layer. - UNUSED_VARIABLE(hci_slip_write(mp_tx_buffer, - (m_tx_buffer_length + - PKT_HDR_SIZE + - PKT_CRC_SIZE))); - } + // @note: no return value check done for hci_slip_write(...) call as current + // system design allows use case where retransmission is not accepted by the + // slip layer due to existing acknowledgement packet transmission in the + // slip layer. + UNUSED_VARIABLE(hci_slip_write(mp_tx_buffer, + (m_tx_buffer_length + + PKT_HDR_SIZE + + PKT_CRC_SIZE))); + } else { - // Application packet retransmission count reached: + // Application packet retransmission count reached: // - set correct TX done event callback function result code - // - execute state change + // - execute state change // @note: m_tx_retry_counter is reset in TX_STATE_ACTIVE state entry. - m_tx_done_result_code = HCI_TRANSPORT_TX_DONE_FAILURE; + m_tx_done_result_code = HCI_TRANSPORT_TX_DONE_FAILURE; tx_sm_state_change(TX_STATE_IDLE); - } + } break; - + default: // No implementation needed. break; } break; - - default: + + default: // No implementation needed. break; } @@ -465,73 +493,73 @@ static void tx_sm_state_change(tx_state_t new_state) * @param[in] event The event structure. */ void slip_event_handle(hci_slip_evt_t event) -{ +{ uint32_t return_code; - uint32_t err_code; - + uint32_t err_code; + switch (event.evt_type) { - case HCI_SLIP_TX_DONE: + case HCI_SLIP_TX_DONE: tx_sm_event_handle(TX_EVENT_SLIP_TX_DONE); break; - + case HCI_SLIP_RX_RDY: return_code = packet_type_decode(event.packet, event.packet_length); - + switch (return_code) { case PKT_TYPE_VENDOR_SPECIFIC: rx_vendor_specific_pkt_type_handle(event.packet, event.packet_length); break; - + case PKT_TYPE_ACK: if (rx_ack_pkt_type_handle(event.packet)) { - // Valid expected acknowledgement packet received: set correct TX done event + // Valid expected acknowledgement packet received: set correct TX done event // callback function result code and execute state change. - m_tx_done_result_code = HCI_TRANSPORT_TX_DONE_SUCCESS; + m_tx_done_result_code = HCI_TRANSPORT_TX_DONE_SUCCESS; tx_sm_event_handle(TX_EVENT_VALID_RX_ACK); } - - /* fall-through */ + + /* fall-through */ default: - // RX packet dropped: reset memory buffer to slip in order to avoid RX buffer - // overflow. - // If existing mem pool produced RX buffer exists reuse that one. If existing - // mem pool produced RX buffer does not exist try to produce new one. If - // producing fails use the internal acknowledgement buffer. + // RX packet dropped: reset memory buffer to slip in order to avoid RX buffer + // overflow. + // If existing mem pool produced RX buffer exists reuse that one. If existing + // mem pool produced RX buffer does not exist try to produce new one. If + // producing fails use the internal acknowledgement buffer. if (mp_slip_used_rx_buffer != NULL) { - err_code = hci_slip_rx_buffer_register(mp_slip_used_rx_buffer, RX_BUF_SIZE); - APP_ERROR_CHECK(err_code); + err_code = hci_slip_rx_buffer_register(mp_slip_used_rx_buffer, HCI_RX_BUF_SIZE); + APP_ERROR_CHECK(err_code); } else { - err_code = hci_mem_pool_rx_produce(RX_BUF_SIZE, - (void **)&mp_slip_used_rx_buffer); - APP_ERROR_CHECK_BOOL((err_code == NRF_SUCCESS) || + err_code = hci_mem_pool_rx_produce(HCI_RX_BUF_SIZE, + (void **)&mp_slip_used_rx_buffer); + APP_ERROR_CHECK_BOOL((err_code == NRF_SUCCESS) || (err_code == NRF_ERROR_NO_MEM)); err_code = hci_slip_rx_buffer_register( - (err_code == NRF_SUCCESS) ? mp_slip_used_rx_buffer : m_rx_ack_buffer, - (err_code == NRF_SUCCESS) ? RX_BUF_SIZE : ACK_BUF_SIZE); - APP_ERROR_CHECK(err_code); + (err_code == NRF_SUCCESS) ? mp_slip_used_rx_buffer : m_rx_ack_buffer, + (err_code == NRF_SUCCESS) ? HCI_RX_BUF_SIZE : ACK_BUF_SIZE); + APP_ERROR_CHECK(err_code); } break; } break; case HCI_SLIP_RX_OVERFLOW: - err_code = hci_slip_rx_buffer_register(m_rx_ack_buffer, ACK_BUF_SIZE); - APP_ERROR_CHECK(err_code); + err_code = hci_slip_rx_buffer_register(m_rx_ack_buffer, ACK_BUF_SIZE); + APP_ERROR_CHECK(err_code); break; - + case HCI_SLIP_ERROR: APP_ERROR_HANDLER(event.evt_type); break; - + default: - APP_ERROR_HANDLER(event.evt_type); + APP_ERROR_HANDLER(event.evt_type); break; } } @@ -539,36 +567,36 @@ void slip_event_handle(hci_slip_evt_t event) uint32_t hci_transport_evt_handler_reg(hci_transport_event_handler_t event_handler) { - uint32_t err_code; - + uint32_t err_code; + m_transport_event_handle = event_handler; - err_code = hci_slip_evt_handler_register(slip_event_handle); - APP_ERROR_CHECK(err_code); - - return (event_handler != NULL) ? NRF_SUCCESS : NRF_ERROR_NULL; + err_code = hci_slip_evt_handler_register(slip_event_handle); + APP_ERROR_CHECK(err_code); + + return (event_handler != NULL) ? NRF_SUCCESS : NRF_ERROR_NULL; } uint32_t hci_transport_tx_done_register(hci_transport_tx_done_handler_t event_handler) { - uint32_t err_code; - + uint32_t err_code; + m_transport_tx_done_handle = event_handler; - err_code = hci_slip_evt_handler_register(slip_event_handle); - APP_ERROR_CHECK(err_code); - - return (event_handler != NULL) ? NRF_SUCCESS : NRF_ERROR_NULL; + err_code = hci_slip_evt_handler_register(slip_event_handle); + APP_ERROR_CHECK(err_code); + + return (event_handler != NULL) ? NRF_SUCCESS : NRF_ERROR_NULL; } /**@brief Function for handling the application packet retransmission timeout. - * - * This function is registered in the @ref app_timer module when a timer is created on - * @ref hci_transport_open. * - * @note This function must be executed in APP-LO context otherwise retransmission behaviour is + * This function is registered in the @ref app_timer module when a timer is created on + * @ref hci_transport_open. + * + * @note This function must be executed in APP-LO context otherwise retransmission behaviour is * undefined, see @ref nrf51_system_integration_serialization. - * + * * @param[in] p_context The timeout context. */ void hci_transport_timeout_handle(void * p_context) @@ -587,32 +615,32 @@ uint32_t hci_transport_open(void) m_packet_expected_seq_number = INITIAL_ACK_NUMBER_EXPECTED; m_packet_transmit_seq_number = INITIAL_ACK_NUMBER_TX; m_tx_done_result_code = HCI_TRANSPORT_TX_DONE_FAILURE; - - uint32_t err_code = app_timer_create(&m_app_timer_id, - APP_TIMER_MODE_REPEATED, + + uint32_t err_code = app_timer_create(&m_app_timer_id, + APP_TIMER_MODE_REPEATED, hci_transport_timeout_handle); if (err_code != NRF_SUCCESS) - { - // @note: conduct required interface adjustment. - return NRF_ERROR_INTERNAL; - } - - err_code = hci_mem_pool_open(); - VERIFY_SUCCESS(err_code); - - err_code = hci_slip_open(); - VERIFY_SUCCESS(err_code); - - err_code = hci_mem_pool_rx_produce(RX_BUF_SIZE, (void **)&mp_slip_used_rx_buffer); - if (err_code != NRF_SUCCESS) { // @note: conduct required interface adjustment. return NRF_ERROR_INTERNAL; - } - - err_code = hci_slip_rx_buffer_register(mp_slip_used_rx_buffer, RX_BUF_SIZE); - - return err_code; + } + + err_code = hci_mem_pool_open(); + VERIFY_SUCCESS(err_code); + + err_code = hci_slip_open(); + VERIFY_SUCCESS(err_code); + + err_code = hci_mem_pool_rx_produce(HCI_RX_BUF_SIZE, (void **)&mp_slip_used_rx_buffer); + if (err_code != NRF_SUCCESS) + { + // @note: conduct required interface adjustment. + return NRF_ERROR_INTERNAL; + } + + err_code = hci_slip_rx_buffer_register(mp_slip_used_rx_buffer, HCI_RX_BUF_SIZE); + + return err_code; } @@ -622,31 +650,31 @@ uint32_t hci_transport_close(void) m_transport_tx_done_handle = NULL; m_transport_event_handle = NULL; - + err_code = hci_mem_pool_close(); - APP_ERROR_CHECK(err_code); + APP_ERROR_CHECK(err_code); err_code = hci_slip_close(); - APP_ERROR_CHECK(err_code); - + APP_ERROR_CHECK(err_code); + // @note: NRF_ERROR_NO_MEM is the only return value which should never be returned. err_code = app_timer_stop(m_app_timer_id); APP_ERROR_CHECK_BOOL(err_code != NRF_ERROR_NO_MEM); - + return NRF_SUCCESS; -} +} uint32_t hci_transport_tx_alloc(uint8_t ** pp_memory) { - const uint32_t err_code = hci_mem_pool_tx_alloc((void **)pp_memory); + const uint32_t err_code = hci_mem_pool_tx_alloc((void **)pp_memory); if (err_code == NRF_SUCCESS) { - // @note: no need to validate pp_memory against null as validation has already been done + // @note: no need to validate pp_memory against null as validation has already been done // by hci_mem_pool_tx_alloc(...) and visible to us from the method return code. - //lint -e(413) "Likely use of null pointer" - *pp_memory += PKT_HDR_SIZE; + //lint -e(413) "Likely use of null pointer" + *pp_memory += PKT_HDR_SIZE; } - + return err_code; } @@ -663,11 +691,11 @@ uint32_t hci_transport_tx_free(void) */ static __INLINE uint8_t tx_packet_byte_zero_construct(void) { - const uint32_t value = DATA_INTEGRITY_MASK | - RELIABLE_PKT_MASK | - (packet_number_expected_get() << 3u) | - packet_number_to_transmit_get(); - + const uint32_t value = DATA_INTEGRITY_MASK | + RELIABLE_PKT_MASK | + (packet_number_expected_get() << 3u) | + packet_number_to_transmit_get(); + return (uint8_t) value; } @@ -675,41 +703,41 @@ static __INLINE uint8_t tx_packet_byte_zero_construct(void) /**@brief Function for handling the application packet write request in tx-idle state. */ static uint32_t pkt_write_handle(void) -{ - uint32_t err_code; - +{ + uint32_t err_code; + // Set packet header fields. mp_tx_buffer -= PKT_HDR_SIZE; mp_tx_buffer[0] = tx_packet_byte_zero_construct(); - - const uint16_t type_and_length_fields = ((m_tx_buffer_length << 4u) | PKT_TYPE_VENDOR_SPECIFIC); + + const uint16_t type_and_length_fields = ((m_tx_buffer_length << 4u) | PKT_TYPE_VENDOR_SPECIFIC); // @note: no use case for uint16_encode(...) return value. UNUSED_VARIABLE(uint16_encode(type_and_length_fields, &(mp_tx_buffer[1]))); mp_tx_buffer[3] = header_checksum_calculate(mp_tx_buffer); - + // Calculate, append CRC to the packet and write it. - + const uint16_t crc = crc16_compute(mp_tx_buffer, (PKT_HDR_SIZE + m_tx_buffer_length), NULL); // @note: no use case for uint16_encode(...) return value. - UNUSED_VARIABLE(uint16_encode(crc, &(mp_tx_buffer[PKT_HDR_SIZE + m_tx_buffer_length]))); - err_code = hci_slip_write(mp_tx_buffer, (m_tx_buffer_length + PKT_HDR_SIZE + PKT_CRC_SIZE)); + UNUSED_VARIABLE(uint16_encode(crc, &(mp_tx_buffer[PKT_HDR_SIZE + m_tx_buffer_length]))); + err_code = hci_slip_write(mp_tx_buffer, (m_tx_buffer_length + PKT_HDR_SIZE + PKT_CRC_SIZE)); switch (err_code) { case NRF_SUCCESS: tx_sm_state_change(TX_STATE_ACTIVE); break; - + case NRF_ERROR_NO_MEM: - tx_sm_state_change(TX_STATE_PENDING); + tx_sm_state_change(TX_STATE_PENDING); err_code = NRF_SUCCESS; break; - + default: // No implementation needed. break; } - + return err_code; } @@ -717,17 +745,17 @@ static uint32_t pkt_write_handle(void) uint32_t hci_transport_pkt_write(const uint8_t * p_buffer, uint16_t length) { uint32_t err_code; - + if (p_buffer) - { + { switch (m_tx_state) { case TX_STATE_IDLE: mp_tx_buffer = (uint8_t *)p_buffer; - m_tx_buffer_length = length; + m_tx_buffer_length = length; err_code = pkt_write_handle(); break; - + default: err_code = NRF_ERROR_NO_MEM; break; @@ -737,26 +765,26 @@ uint32_t hci_transport_pkt_write(const uint8_t * p_buffer, uint16_t length) { err_code = NRF_ERROR_NULL; } - - return err_code; + + return err_code; } uint32_t hci_transport_rx_pkt_extract(uint8_t ** pp_buffer, uint16_t * p_length) { uint32_t err_code; - + if (pp_buffer != NULL && p_length != NULL) { - uint32_t length = 0; - + uint32_t length = 0; + if (m_is_slip_decode_ready) { m_is_slip_decode_ready = false; err_code = hci_mem_pool_rx_extract(pp_buffer, &length); length -= (PKT_HDR_SIZE + PKT_CRC_SIZE); - - *p_length = (uint16_t)length; + + *p_length = (uint16_t)length; *pp_buffer += PKT_HDR_SIZE; } else @@ -768,12 +796,13 @@ uint32_t hci_transport_rx_pkt_extract(uint8_t ** pp_buffer, uint16_t * p_length) { err_code = NRF_ERROR_NULL; } - + return err_code; } uint32_t hci_transport_rx_pkt_consume(uint8_t * p_buffer) { - return (hci_mem_pool_rx_consume(p_buffer - PKT_HDR_SIZE)); + return (hci_mem_pool_rx_consume(p_buffer - PKT_HDR_SIZE)); } +#endif //NRF_MODULE_ENABLED(HCI_TRANSPORT) diff --git a/nRF5_SDK_11.0.0_89a8197/components/libraries/hci/hci_transport.h b/nRF5_SDK_11.0.0_89a8197/components/libraries/hci/hci_transport.h index 85a4d6a..872cabd 100644 --- a/nRF5_SDK_11.0.0_89a8197/components/libraries/hci/hci_transport.h +++ b/nRF5_SDK_11.0.0_89a8197/components/libraries/hci/hci_transport.h @@ -1,15 +1,42 @@ -/* Copyright (c) 2013 Nordic Semiconductor. All Rights Reserved. - * - * The information contained herein is property of Nordic Semiconductor ASA. - * Terms and conditions of usage are described in detail in NORDIC - * SEMICONDUCTOR STANDARD SOFTWARE LICENSE AGREEMENT. - * - * Licensees are granted free, non-transferable use of the information. NO - * WARRANTY of ANY KIND is provided. This heading must NOT be removed from - * the file. - * +/** + * Copyright (c) 2013 - 2017, Nordic Semiconductor ASA + * + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without modification, + * are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form, except as embedded into a Nordic + * Semiconductor ASA integrated circuit in a product or a software update for + * such product, must reproduce the above copyright notice, this list of + * conditions and the following disclaimer in the documentation and/or other + * materials provided with the distribution. + * + * 3. Neither the name of Nordic Semiconductor ASA nor the names of its + * contributors may be used to endorse or promote products derived from this + * software without specific prior written permission. + * + * 4. This software, with or without modification, must only be used with a + * Nordic Semiconductor ASA integrated circuit. + * + * 5. Any software provided in binary form under this license must not be reverse + * engineered, decompiled, modified and/or disassembled. + * + * THIS SOFTWARE IS PROVIDED BY NORDIC SEMICONDUCTOR ASA "AS IS" AND ANY EXPRESS + * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + * OF MERCHANTABILITY, NONINFRINGEMENT, AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL NORDIC SEMICONDUCTOR ASA OR CONTRIBUTORS BE + * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE + * GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT + * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * */ - /**@file * * @defgroup hci_transport HCI Transport @@ -18,7 +45,7 @@ * * @brief HCI transport module implementation. * - * This module implements certain specific features from the three-wire UART transport layer, + * This module implements certain specific features from the three-wire UART transport layer, * defined by the Bluetooth specification version 4.0 [Vol 4] part D. * * \par Features supported @@ -27,7 +54,7 @@ * * \par Features not supported * - Link establishment procedure: defined by chapter 8 of the specification. - * - Low power: defined by chapter 9 of the specification. + * - Low power: defined by chapter 9 of the specification. * * \par Implementation specific behaviour * - As Link establishment procedure is not supported following static link configuration parameters @@ -35,54 +62,58 @@ * + TX window size is 1. * + 16 bit CCITT-CRC must be used. * + Out of frame software flow control not supported. - * + Parameters specific for resending reliable packets are compile time configurable (clarifed + * + Parameters specific for resending reliable packets are compile time configurable (clarifed * later in this document). - * + Acknowledgement packet transmissions are not timeout driven , meaning they are delivered for - * transmission within same context which the corresponding application packet was received. + * + Acknowledgement packet transmissions are not timeout driven , meaning they are delivered for + * transmission within same context which the corresponding application packet was received. * * \par Implementation specific limitations - * Current implementation has the following limitations which will have impact to system wide + * Current implementation has the following limitations which will have impact to system wide * behaviour: - * - Delayed acknowledgement scheduling not implemented: - * There exists a possibility that acknowledgement TX packet and application TX packet will collide - * in the TX pipeline having the end result that acknowledgement packet will be excluded from the TX + * - Delayed acknowledgement scheduling not implemented: + * There exists a possibility that acknowledgement TX packet and application TX packet will collide + * in the TX pipeline having the end result that acknowledgement packet will be excluded from the TX * pipeline which will trigger the retransmission algorithm within the peer protocol entity. - * - Delayed retransmission scheduling not implemented: + * - Delayed retransmission scheduling not implemented: * There exists a possibility that retransmitted application TX packet and acknowledgement TX packet - * will collide in the TX pipeline having the end result that retransmitted application TX packet + * will collide in the TX pipeline having the end result that retransmitted application TX packet * will be excluded from the TX pipeline. * - Processing of the acknowledgement number from RX application packets: - * Acknowledgement number is not processed from the RX application packets having the end result + * Acknowledgement number is not processed from the RX application packets having the end result * that unnecessary application packet retransmissions can occur. * - * The application TX packet processing flow is illustrated by the statemachine below. + * The application TX packet processing flow is illustrated by the statemachine below. * - * @image html hci_transport_tx_sm.png "TX - application packet statemachine" + * @image html hci_transport_tx_sm.svg "TX - application packet statemachine" * * \par Component specific configuration options * - * The following compile time configuration options are available, and used to configure the - * application TX packet retransmission interval, in order to suite various application specific + * The following compile time configuration options are available, and used to configure the + * application TX packet retransmission interval, in order to suite various application specific * implementations: - * - MAC_PACKET_SIZE_IN_BITS Maximum size of a single application packet in bits. - * - USED_BAUD_RATE Used uart baudrate. + * - MAC_PACKET_SIZE_IN_BITS Maximum size of a single application packet in bits. + * - USED_BAUD_RATE Used uart baudrate. * - * The following compile time configuration option is available to configure module specific + * The following compile time configuration option is available to configure module specific * behaviour: * - MAX_RETRY_COUNT Max retransmission retry count for applicaton packets. */ - + #ifndef HCI_TRANSPORT_H__ #define HCI_TRANSPORT_H__ #include #include "nrf_error.h" +#ifdef __cplusplus +extern "C" { +#endif + /**@brief Generic event callback function events. */ typedef enum { HCI_TRANSPORT_RX_RDY, /**< An event indicating that RX packet is ready for read. */ - HCI_TRANSPORT_EVT_TYPE_MAX /**< Enumeration upper bound. */ + HCI_TRANSPORT_EVT_TYPE_MAX /**< Enumeration upper bound. */ } hci_transport_evt_type_t; /**@brief Struct containing events from the Transport layer. @@ -94,7 +125,7 @@ typedef struct /**@brief Transport layer generic event callback function type. * - * @param[in] event Transport layer event. + * @param[in] event Transport layer event. */ typedef void (*hci_transport_event_handler_t)(hci_transport_evt_t event); @@ -102,104 +133,104 @@ typedef void (*hci_transport_event_handler_t)(hci_transport_evt_t event); typedef enum { HCI_TRANSPORT_TX_DONE_SUCCESS, /**< Transmission success, peer transport entity has acknowledged the transmission. */ - HCI_TRANSPORT_TX_DONE_FAILURE /**< Transmission failure. */ + HCI_TRANSPORT_TX_DONE_FAILURE /**< Transmission failure. */ } hci_transport_tx_done_result_t; /**@brief Transport layer TX done event callback function type. * - * @param[in] result TX done event result code. + * @param[in] result TX done event result code. */ typedef void (*hci_transport_tx_done_handler_t)(hci_transport_tx_done_result_t result); /**@brief Function for registering a generic event handler. * - * @note Multiple registration requests will overwrite any possible existing registration. + * @note Multiple registration requests will overwrite any possible existing registration. * * @param[in] event_handler The function to be called by the transport layer upon an event. * * @retval NRF_SUCCESS Operation success. - * @retval NRF_ERROR_NULL Operation failure. NULL pointer supplied. + * @retval NRF_ERROR_NULL Operation failure. NULL pointer supplied. */ uint32_t hci_transport_evt_handler_reg(hci_transport_event_handler_t event_handler); /**@brief Function for registering a handler for TX done event. * - * @note Multiple registration requests will overwrite any possible existing registration. + * @note Multiple registration requests will overwrite any possible existing registration. * * @param[in] event_handler The function to be called by the transport layer upon TX done * event. * * @retval NRF_SUCCESS Operation success. - * @retval NRF_ERROR_NULL Operation failure. NULL pointer supplied. + * @retval NRF_ERROR_NULL Operation failure. NULL pointer supplied. */ uint32_t hci_transport_tx_done_register(hci_transport_tx_done_handler_t event_handler); - + /**@brief Function for opening the transport channel and initializing the transport layer. * - * @warning Must not be called for a channel which has been allready opened. - * + * @warning Must not be called for a channel which has been allready opened. + * * @retval NRF_SUCCESS Operation success. - * @retval NRF_ERROR_INTERNAL Operation failure. Internal error ocurred. + * @retval NRF_ERROR_INTERNAL Operation failure. Internal error ocurred. */ uint32_t hci_transport_open(void); /**@brief Function for closing the transport channel. * * @note Can be called multiple times and also for not opened channel. - * - * @retval NRF_SUCCESS Operation success. + * + * @retval NRF_SUCCESS Operation success. */ uint32_t hci_transport_close(void); /**@brief Function for allocating tx packet memory. - * + * * @param[out] pp_memory Pointer to the packet data. - * + * * @retval NRF_SUCCESS Operation success. Memory was allocated. * @retval NRF_ERROR_NO_MEM Operation failure. No memory available. - * @retval NRF_ERROR_NULL Operation failure. NULL pointer supplied. + * @retval NRF_ERROR_NULL Operation failure. NULL pointer supplied. */ uint32_t hci_transport_tx_alloc(uint8_t ** pp_memory); /**@brief Function for freeing tx packet memory. * - * @note Memory management works in FIFO principle meaning that free order must match the alloc + * @note Memory management works in FIFO principle meaning that free order must match the alloc * order. - * - * @retval NRF_SUCCESS Operation success. Memory was freed. + * + * @retval NRF_SUCCESS Operation success. Memory was freed. */ uint32_t hci_transport_tx_free(void); /**@brief Function for writing a packet. * - * @note Completion of this method does not guarantee that actual peripheral transmission would + * @note Completion of this method does not guarantee that actual peripheral transmission would * have completed. * - * @note In case of 0 byte packet length write request, message will consist of only transport - * module specific headers. + * @note In case of 0 byte packet length write request, message will consist of only transport + * module specific headers. * - * @retval NRF_SUCCESS Operation success. Packet was added to the transmission queue - * and an event will be send upon transmission completion. + * @retval NRF_SUCCESS Operation success. Packet was added to the transmission queue + * and an event will be send upon transmission completion. * @retval NRF_ERROR_NO_MEM Operation failure. Transmission queue is full and packet was not - * added to the transmission queue. User should wait for + * added to the transmission queue. User should wait for * a appropriate event prior issuing this operation again. - * @retval NRF_ERROR_DATA_SIZE Operation failure. Packet size exceeds limit. - * @retval NRF_ERROR_NULL Operation failure. NULL pointer supplied. + * @retval NRF_ERROR_DATA_SIZE Operation failure. Packet size exceeds limit. + * @retval NRF_ERROR_NULL Operation failure. NULL pointer supplied. * @retval NRF_ERROR_INVALID_STATE Operation failure. Channel is not open. */ uint32_t hci_transport_pkt_write(const uint8_t * p_buffer, uint16_t length); /**@brief Function for extracting received packet. * - * @note Extracted memory can't be reused by the underlying transport layer untill freed by call to + * @note Extracted memory can't be reused by the underlying transport layer untill freed by call to * hci_transport_rx_pkt_consume(). * * @param[out] pp_buffer Pointer to the packet data. - * @param[out] p_length Length of packet data in bytes. + * @param[out] p_length Length of packet data in bytes. * - * @retval NRF_SUCCESS Operation success. Packet was extracted. + * @retval NRF_SUCCESS Operation success. Packet was extracted. * @retval NRF_ERROR_NO_MEM Operation failure. No packet available to extract. - * @retval NRF_ERROR_NULL Operation failure. NULL pointer supplied. + * @retval NRF_ERROR_NULL Operation failure. NULL pointer supplied. */ uint32_t hci_transport_rx_pkt_extract(uint8_t ** pp_buffer, uint16_t * p_length); @@ -209,12 +240,17 @@ uint32_t hci_transport_rx_pkt_extract(uint8_t ** pp_buffer, uint16_t * p_length) * * @param[in] p_buffer Pointer to the buffer that has been consumed. * - * @retval NRF_SUCCESS Operation success. - * @retval NRF_ERROR_NO_MEM Operation failure. No packet available to consume. - * @retval NRF_ERROR_INVALID_ADDR Operation failure. Not a valid pointer. + * @retval NRF_SUCCESS Operation success. + * @retval NRF_ERROR_NO_MEM Operation failure. No packet available to consume. + * @retval NRF_ERROR_INVALID_ADDR Operation failure. Not a valid pointer. */ uint32_t hci_transport_rx_pkt_consume(uint8_t * p_buffer); + +#ifdef __cplusplus +} +#endif + #endif // HCI_TRANSPORT_H__ /** @} */ diff --git a/nRF5_SDK_11.0.0_89a8197/components/libraries/scheduler/app_scheduler.c b/nRF5_SDK_11.0.0_89a8197/components/libraries/scheduler/app_scheduler.c index 829d7f9..9c2d759 100644 --- a/nRF5_SDK_11.0.0_89a8197/components/libraries/scheduler/app_scheduler.c +++ b/nRF5_SDK_11.0.0_89a8197/components/libraries/scheduler/app_scheduler.c @@ -1,22 +1,50 @@ -/* Copyright (c) 2012 Nordic Semiconductor. All Rights Reserved. - * - * The information contained herein is property of Nordic Semiconductor ASA. - * Terms and conditions of usage are described in detail in NORDIC - * SEMICONDUCTOR STANDARD SOFTWARE LICENSE AGREEMENT. - * - * Licensees are granted free, non-transferable use of the information. NO - * WARRANTY of ANY KIND is provided. This heading must NOT be removed from - * the file. - * +/** + * Copyright (c) 2012 - 2017, Nordic Semiconductor ASA + * + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without modification, + * are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form, except as embedded into a Nordic + * Semiconductor ASA integrated circuit in a product or a software update for + * such product, must reproduce the above copyright notice, this list of + * conditions and the following disclaimer in the documentation and/or other + * materials provided with the distribution. + * + * 3. Neither the name of Nordic Semiconductor ASA nor the names of its + * contributors may be used to endorse or promote products derived from this + * software without specific prior written permission. + * + * 4. This software, with or without modification, must only be used with a + * Nordic Semiconductor ASA integrated circuit. + * + * 5. Any software provided in binary form under this license must not be reverse + * engineered, decompiled, modified and/or disassembled. + * + * THIS SOFTWARE IS PROVIDED BY NORDIC SEMICONDUCTOR ASA "AS IS" AND ANY EXPRESS + * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + * OF MERCHANTABILITY, NONINFRINGEMENT, AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL NORDIC SEMICONDUCTOR ASA OR CONTRIBUTORS BE + * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE + * GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT + * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * */ - +#include "sdk_common.h" +#if NRF_MODULE_ENABLED(APP_SCHEDULER) #include "app_scheduler.h" #include #include #include #include "nrf_soc.h" #include "nrf_assert.h" -#include "app_util.h" #include "app_util_platform.h" /**@brief Structure for holding a scheduled event header. */ @@ -35,10 +63,15 @@ static volatile uint8_t m_queue_end_index; /**< Index of queue entry at the static uint16_t m_queue_event_size; /**< Maximum event size in queue. */ static uint16_t m_queue_size; /**< Number of queue entries. */ -#ifdef APP_SCHEDULER_WITH_PROFILER +#if APP_SCHEDULER_WITH_PROFILER static uint16_t m_max_queue_utilization; /**< Maximum observed queue utilization. */ #endif +#if APP_SCHEDULER_WITH_PAUSE +static uint32_t m_scheduler_paused_counter = 0; /**< Counter storing the difference between pausing + and resuming the scheduler. */ +#endif + /**@brief Function for incrementing a queue index, and handle wrap-around. * * @param[in] index Old index. @@ -89,7 +122,7 @@ uint32_t app_sched_init(uint16_t event_size, uint16_t queue_size, void * p_event m_queue_event_size = event_size; m_queue_size = queue_size; -#ifdef APP_SCHEDULER_WITH_PROFILER +#if APP_SCHEDULER_WITH_PROFILER m_max_queue_utilization = 0; #endif @@ -97,7 +130,17 @@ uint32_t app_sched_init(uint16_t event_size, uint16_t queue_size, void * p_event } -#ifdef APP_SCHEDULER_WITH_PROFILER +uint16_t app_sched_queue_space_get() +{ + uint16_t start = m_queue_start_index; + uint16_t end = m_queue_end_index; + uint16_t free_space = m_queue_size - ((end >= start) ? + (end - start) : (m_queue_size + 1 - start + end)); + return free_space; +} + + +#if APP_SCHEDULER_WITH_PROFILER static void queue_utilization_check(void) { uint16_t start = m_queue_start_index; @@ -115,10 +158,10 @@ uint16_t app_sched_queue_utilization_get(void) { return m_max_queue_utilization; } -#endif +#endif // APP_SCHEDULER_WITH_PROFILER -uint32_t app_sched_event_put(void * p_event_data, +uint32_t app_sched_event_put(void const * p_event_data, uint16_t event_data_size, app_sched_event_handler_t handler) { @@ -135,7 +178,7 @@ uint32_t app_sched_event_put(void * p_event_data, event_index = m_queue_end_index; m_queue_end_index = next_index(m_queue_end_index); - #ifdef APP_SCHEDULER_WITH_PROFILER + #if APP_SCHEDULER_WITH_PROFILER // This function call must be protected with critical region because // it modifies 'm_max_queue_utilization'. queue_utilization_check(); @@ -177,51 +220,69 @@ uint32_t app_sched_event_put(void * p_event_data, } -/**@brief Function for reading the next event from specified event queue. - * - * @param[out] pp_event_data Pointer to pointer to event data. - * @param[out] p_event_data_size Pointer to size of event data. - * @param[out] p_event_handler Pointer to event handler function pointer. - * - * @return NRF_SUCCESS if new event, NRF_ERROR_NOT_FOUND if event queue is empty. - */ -static uint32_t app_sched_event_get(void ** pp_event_data, - uint16_t * p_event_data_size, - app_sched_event_handler_t * p_event_handler) +#if APP_SCHEDULER_WITH_PAUSE +void app_sched_pause(void) { - uint32_t err_code = NRF_ERROR_NOT_FOUND; + CRITICAL_REGION_ENTER(); - if (!APP_SCHED_QUEUE_EMPTY()) + if (m_scheduler_paused_counter < UINT32_MAX) { - uint16_t event_index; - - // NOTE: There is no need for a critical region here, as this function will only be called - // from app_sched_execute() from inside the main loop, so it will never interrupt - // app_sched_event_put(). Also, updating of (i.e. writing to) the start index will be - // an atomic operation. - event_index = m_queue_start_index; - m_queue_start_index = next_index(m_queue_start_index); - - *pp_event_data = &m_queue_event_data[event_index * m_queue_event_size]; - *p_event_data_size = m_queue_event_headers[event_index].event_data_size; - *p_event_handler = m_queue_event_headers[event_index].handler; - - err_code = NRF_SUCCESS; + m_scheduler_paused_counter++; } + CRITICAL_REGION_EXIT(); +} - return err_code; +void app_sched_resume(void) +{ + CRITICAL_REGION_ENTER(); + + if (m_scheduler_paused_counter > 0) + { + m_scheduler_paused_counter--; + } + CRITICAL_REGION_EXIT(); +} +#endif //APP_SCHEDULER_WITH_PAUSE + + +/**@brief Function for checking if scheduler is paused which means that should break processing + * events. + * + * @return Boolean value - true if scheduler is paused, false otherwise. + */ +static __INLINE bool is_app_sched_paused(void) +{ +#if APP_SCHEDULER_WITH_PAUSE + return (m_scheduler_paused_counter > 0); +#else + return false; +#endif } void app_sched_execute(void) { - void * p_event_data; - uint16_t event_data_size; - app_sched_event_handler_t event_handler; - - // Get next event (if any), and execute handler - while ((app_sched_event_get(&p_event_data, &event_data_size, &event_handler) == NRF_SUCCESS)) + while (!is_app_sched_paused() && !APP_SCHED_QUEUE_EMPTY()) { + // Since this function is only called from the main loop, there is no + // need for a critical region here, however a special care must be taken + // regarding update of the queue start index (see the end of the loop). + uint16_t event_index = m_queue_start_index; + + void * p_event_data; + uint16_t event_data_size; + app_sched_event_handler_t event_handler; + + p_event_data = &m_queue_event_data[event_index * m_queue_event_size]; + event_data_size = m_queue_event_headers[event_index].event_data_size; + event_handler = m_queue_event_headers[event_index].handler; + event_handler(p_event_data, event_data_size); + + // Event processed, now it is safe to move the queue start index, + // so the queue entry occupied by this event can be used to store + // a next one. + m_queue_start_index = next_index(m_queue_start_index); } } +#endif //NRF_MODULE_ENABLED(APP_SCHEDULER) diff --git a/nRF5_SDK_11.0.0_89a8197/components/libraries/scheduler/app_scheduler.h b/nRF5_SDK_11.0.0_89a8197/components/libraries/scheduler/app_scheduler.h index f52e616..d2470a4 100644 --- a/nRF5_SDK_11.0.0_89a8197/components/libraries/scheduler/app_scheduler.h +++ b/nRF5_SDK_11.0.0_89a8197/components/libraries/scheduler/app_scheduler.h @@ -1,15 +1,42 @@ -/* Copyright (c) 2012 Nordic Semiconductor. All Rights Reserved. - * - * The information contained herein is property of Nordic Semiconductor ASA. - * Terms and conditions of usage are described in detail in NORDIC - * SEMICONDUCTOR STANDARD SOFTWARE LICENSE AGREEMENT. - * - * Licensees are granted free, non-transferable use of the information. NO - * WARRANTY of ANY KIND is provided. This heading must NOT be removed from - * the file. - * +/** + * Copyright (c) 2012 - 2017, Nordic Semiconductor ASA + * + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without modification, + * are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form, except as embedded into a Nordic + * Semiconductor ASA integrated circuit in a product or a software update for + * such product, must reproduce the above copyright notice, this list of + * conditions and the following disclaimer in the documentation and/or other + * materials provided with the distribution. + * + * 3. Neither the name of Nordic Semiconductor ASA nor the names of its + * contributors may be used to endorse or promote products derived from this + * software without specific prior written permission. + * + * 4. This software, with or without modification, must only be used with a + * Nordic Semiconductor ASA integrated circuit. + * + * 5. Any software provided in binary form under this license must not be reverse + * engineered, decompiled, modified and/or disassembled. + * + * THIS SOFTWARE IS PROVIDED BY NORDIC SEMICONDUCTOR ASA "AS IS" AND ANY EXPRESS + * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + * OF MERCHANTABILITY, NONINFRINGEMENT, AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL NORDIC SEMICONDUCTOR ASA OR CONTRIBUTORS BE + * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE + * GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT + * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * */ - /** @file * * @defgroup app_scheduler Scheduler @@ -44,16 +71,21 @@ * @ref ble_sdk_app_hids_mouse and @ref ble_sdk_app_hids_keyboard. * @endif * - * @image html scheduler_working.jpg The high level design of the scheduler + * @image html scheduler_working.svg The high level design of the scheduler */ #ifndef APP_SCHEDULER_H__ #define APP_SCHEDULER_H__ +#include "sdk_config.h" #include #include "app_error.h" #include "app_util.h" +#ifdef __cplusplus +extern "C" { +#endif + #define APP_SCHED_EVENT_HEADER_SIZE 8 /**< Size of app_scheduler.event_header_t (only for use inside APP_SCHED_BUF_SIZE()). */ /**@brief Compute number of bytes required to hold the scheduler buffer. @@ -66,7 +98,7 @@ */ #define APP_SCHED_BUF_SIZE(EVENT_SIZE, QUEUE_SIZE) \ (((EVENT_SIZE) + APP_SCHED_EVENT_HEADER_SIZE) * ((QUEUE_SIZE) + 1)) - + /**@brief Scheduler event handler type. */ typedef void (*app_sched_event_handler_t)(void * p_event_data, uint16_t event_size); @@ -123,31 +155,41 @@ void app_sched_execute(void); * @details Puts an event into the event queue. * * @param[in] p_event_data Pointer to event data to be scheduled. - * @param[in] event_size Size of event data to be scheduled. + * @param[in] event_size Size of event data to be scheduled. * @param[in] handler Event handler to receive the event. * * @return NRF_SUCCESS on success, otherwise an error code. */ -uint32_t app_sched_event_put(void * p_event_data, +uint32_t app_sched_event_put(void const * p_event_data, uint16_t event_size, app_sched_event_handler_t handler); -#ifdef APP_SCHEDULER_WITH_PROFILER /**@brief Function for getting the maximum observed queue utilization. * * Function for tuning the module and determining QUEUE_SIZE value and thus module RAM usage. * + * @note @ref APP_SCHEDULER_WITH_PROFILER must be enabled to use this functionality. + * * @return Maximum number of events in queue observed so far. */ uint16_t app_sched_queue_utilization_get(void); -#endif -#ifdef APP_SCHEDULER_WITH_PAUSE +/**@brief Function for getting the current amount of free space in the queue. + * + * @details The real amount of free space may be less if entries are being added from an interrupt. + * To get the sxact value, this function should be called from the critical section. + * + * @return Amount of free space in the queue. + */ +uint16_t app_sched_queue_space_get(void); + /**@brief A function to pause the scheduler. * * @details When the scheduler is paused events are not pulled from the scheduler queue for * processing. The function can be called multiple times. To unblock the scheduler the * function @ref app_sched_resume has to be called the same number of times. + * + * @note @ref APP_SCHEDULER_WITH_PAUSE must be enabled to use this functionality. */ void app_sched_pause(void); @@ -155,9 +197,15 @@ void app_sched_pause(void); * * @details To unblock the scheduler this function has to be called the same number of times as * @ref app_sched_pause function. + * + * @note @ref APP_SCHEDULER_WITH_PAUSE must be enabled to use this functionality. */ void app_sched_resume(void); + +#ifdef __cplusplus +} #endif + #endif // APP_SCHEDULER_H__ /** @} */ diff --git a/nRF5_SDK_11.0.0_89a8197/components/libraries/timer/app_timer.c b/nRF5_SDK_11.0.0_89a8197/components/libraries/timer/app_timer.c index a2b61b3..222073c 100644 --- a/nRF5_SDK_11.0.0_89a8197/components/libraries/timer/app_timer.c +++ b/nRF5_SDK_11.0.0_89a8197/components/libraries/timer/app_timer.c @@ -1,15 +1,44 @@ -/* Copyright (c) 2012 Nordic Semiconductor. All Rights Reserved. - * - * The information contained herein is property of Nordic Semiconductor ASA. - * Terms and conditions of usage are described in detail in NORDIC - * SEMICONDUCTOR STANDARD SOFTWARE LICENSE AGREEMENT. - * - * Licensees are granted free, non-transferable use of the information. NO - * WARRANTY of ANY KIND is provided. This heading must NOT be removed from - * the file. - * +/** + * Copyright (c) 2012 - 2017, Nordic Semiconductor ASA + * + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without modification, + * are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form, except as embedded into a Nordic + * Semiconductor ASA integrated circuit in a product or a software update for + * such product, must reproduce the above copyright notice, this list of + * conditions and the following disclaimer in the documentation and/or other + * materials provided with the distribution. + * + * 3. Neither the name of Nordic Semiconductor ASA nor the names of its + * contributors may be used to endorse or promote products derived from this + * software without specific prior written permission. + * + * 4. This software, with or without modification, must only be used with a + * Nordic Semiconductor ASA integrated circuit. + * + * 5. Any software provided in binary form under this license must not be reverse + * engineered, decompiled, modified and/or disassembled. + * + * THIS SOFTWARE IS PROVIDED BY NORDIC SEMICONDUCTOR ASA "AS IS" AND ANY EXPRESS + * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + * OF MERCHANTABILITY, NONINFRINGEMENT, AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL NORDIC SEMICONDUCTOR ASA OR CONTRIBUTORS BE + * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE + * GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT + * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * */ - +#include "sdk_common.h" +#if NRF_MODULE_ENABLED(APP_TIMER) #include "app_timer.h" #include #include "nrf.h" @@ -17,10 +46,12 @@ #include "app_error.h" #include "nrf_delay.h" #include "app_util_platform.h" -#include "sdk_common.h" +#if APP_TIMER_CONFIG_USE_SCHEDULER +#include "app_scheduler.h" +#endif -#define RTC1_IRQ_PRI APP_IRQ_PRIORITY_LOW /**< Priority of the RTC1 interrupt (used for checking for timeouts and executing timeout handlers). */ -#define SWI_IRQ_PRI APP_IRQ_PRIORITY_LOW /**< Priority of the SWI interrupt (used for updating the timer list). */ +#define RTC1_IRQ_PRI APP_TIMER_CONFIG_IRQ_PRIORITY /**< Priority of the RTC1 interrupt (used for checking for timeouts and executing timeout handlers). */ +#define SWI_IRQ_PRI APP_TIMER_CONFIG_IRQ_PRIORITY /**< Priority of the SWI interrupt (used for updating the timer list). */ // The current design assumes that both interrupt handlers run at the same interrupt level. // If this is to be changed, protection must be added to prevent them from interrupting each other @@ -29,22 +60,22 @@ STATIC_ASSERT(RTC1_IRQ_PRI == SWI_IRQ_PRI); #define MAX_RTC_COUNTER_VAL 0x00FFFFFF /**< Maximum value of the RTC counter. */ -#define APP_HIGH_USER_ID 0 /**< User Id for the Application High "user". */ -#define APP_LOW_USER_ID 1 /**< User Id for the Application Low "user". */ -#define THREAD_MODE_USER_ID 2 /**< User Id for the Thread Mode "user". */ - #define RTC_COMPARE_OFFSET_MIN 3 /**< Minimum offset between the current RTC counter value and the Capture Compare register. Although the nRF51 Series User Specification recommends this value to be 2, we use 3 to be safer.*/ #define MAX_RTC_TASKS_DELAY 47 /**< Maximum delay until an RTC task is executed. */ -#ifdef NRF51 +#if (APP_TIMER_CONFIG_SWI_NUMBER == 0) #define SWI_IRQn SWI0_IRQn #define SWI_IRQHandler SWI0_IRQHandler -#elif defined(NRF52832_XXAA) || defined(NRF52840_XXAA) -#define SWI_IRQn SWI0_EGU0_IRQn -#define SWI_IRQHandler SWI0_EGU0_IRQHandler +#elif (APP_TIMER_CONFIG_SWI_NUMBER == 1) +#define SWI_IRQn SWI1_IRQn +#define SWI_IRQHandler SWI1_IRQHandler +#else +#error "Unsupported SWI number." #endif +#define MODULE_INITIALIZED (m_op_queue.size != 0) /**< Macro designating whether the module has been initialized properly. */ + /**@brief Timer node type. The nodes will be used form a linked list of running timers. */ typedef struct { @@ -90,57 +121,36 @@ typedef struct } params; } timer_user_op_t; -STATIC_ASSERT(sizeof(timer_user_op_t) <= APP_TIMER_USER_OP_SIZE); -STATIC_ASSERT(sizeof(timer_user_op_t) % 4 == 0); - -/**@brief Structure describing a timer user. +/**@brief Structure describing a timer operations queue. * - * @details For each user of the timer module, there will be a timer operations queue. This queue - * will hold timer operations issued by this user until the timer interrupt handler - * processes these operations. For the current implementation, there will be one user for - * each interrupt level available to the application (APP_HIGH, APP_LOW and THREAD_MODE), - * but the module can easily be modified to e.g. have one queue per process when using an - * RTOS. The purpose of the queues is to be able to have a completely lockless timer - * implementation. + * @details This queue will hold timer operations issued by the application + * until the timer interrupt handler processes these operations. */ typedef struct { uint8_t first; /**< Index of first entry to have been inserted in the queue (i.e. the next entry to be executed). */ uint8_t last; /**< Index of last entry to have been inserted in the queue. */ - uint8_t user_op_queue_size; /**< Queue size. */ - timer_user_op_t * p_user_op_queue; /**< Queue buffer. */ -} timer_user_t; + uint8_t size; /**< Queue size. */ + timer_user_op_t user_op_queue[APP_TIMER_CONFIG_OP_QUEUE_SIZE+1]; /**< Queue buffer. */ +} timer_op_queue_t; -STATIC_ASSERT(sizeof(timer_user_t) == APP_TIMER_USER_SIZE); -STATIC_ASSERT(sizeof(timer_user_t) % 4 == 0); +STATIC_ASSERT(sizeof(timer_op_queue_t) % 4 == 0); -/**@brief User id type. - * - * @details In the current implementation, this will automatically be generated from the current - * interrupt level. - */ -typedef uint32_t timer_user_id_t; +#define CONTEXT_QUEUE_SIZE_MAX (2) -#define CONTEXT_QUEUE_SIZE_MAX (2) - -static uint8_t m_user_array_size; /**< Size of timer user array. */ -static timer_user_t * mp_users = NULL; /**< Array of timer users. */ +static timer_op_queue_t m_op_queue; /**< Timer operations queue. */ static timer_node_t * mp_timer_id_head; /**< First timer in list of running timers. */ static uint32_t m_ticks_latest; /**< Last known RTC counter value. */ static uint32_t m_ticks_elapsed[CONTEXT_QUEUE_SIZE_MAX]; /**< Timer internal elapsed ticks queue. */ static uint8_t m_ticks_elapsed_q_read_ind; /**< Timer internal elapsed ticks queue read index. */ static uint8_t m_ticks_elapsed_q_write_ind; /**< Timer internal elapsed ticks queue write index. */ -static app_timer_evt_schedule_func_t m_evt_schedule_func; /**< Pointer to function for propagating timeout events to the scheduler. */ static bool m_rtc1_running; /**< Boolean indicating if RTC1 is running. */ static bool m_rtc1_reset; /**< Boolean indicating if RTC1 counter has been reset due to last timer removed from timer list during the timer list handling. */ -#ifdef APP_TIMER_WITH_PROFILER -static uint8_t m_max_user_op_queue_utilization; /**< Maximum observed timer user operations queue utilization. */ +#if APP_TIMER_WITH_PROFILER +static uint8_t m_max_user_op_queue_utilization; /**< Maximum observed timer user operations queue utilization. */ #endif -#define MODULE_INITIALIZED (mp_users != NULL) -#include "sdk_macros.h" - /**@brief Function for initializing the RTC1 counter. * * @param[in] prescaler Value of the RTC1 PRESCALER register. Set to 0 for no prescaling. @@ -235,7 +245,7 @@ static void timer_list_insert(timer_node_t * p_timer) if (p_timer->ticks_to_expire <= mp_timer_id_head->ticks_to_expire) { mp_timer_id_head->ticks_to_expire -= p_timer->ticks_to_expire; - + p_timer->next = mp_timer_id_head; mp_timer_id_head = p_timer; } @@ -248,7 +258,7 @@ static void timer_list_insert(timer_node_t * p_timer) ticks_to_expire = p_timer->ticks_to_expire; p_previous = mp_timer_id_head; p_current = mp_timer_id_head; - + while ((p_current != NULL) && (ticks_to_expire > p_current->ticks_to_expire)) { ticks_to_expire -= p_current->ticks_to_expire; @@ -272,17 +282,21 @@ static void timer_list_insert(timer_node_t * p_timer) /**@brief Function for removing a timer from the timer queue. * * @param[in] timer_id Id of timer to remove. + * + * @return TRUE if Capture Compare register must be updated, FALSE otherwise. */ -static void timer_list_remove(timer_node_t * p_timer) +static bool timer_list_remove(timer_node_t * p_timer) { + timer_node_t * p_old_head; timer_node_t * p_previous; timer_node_t * p_current; uint32_t timeout; // Find the timer's position in timer list. + p_old_head = mp_timer_id_head; p_previous = mp_timer_id_head; p_current = p_previous; - + while (p_current != NULL) { if (p_current == p_timer) @@ -296,7 +310,7 @@ static void timer_list_remove(timer_node_t * p_timer) // Timer not in active list. if (p_current == NULL) { - return; + return false; } // Timer is the first in the list @@ -310,6 +324,7 @@ static void timer_list_remove(timer_node_t * p_timer) NRF_RTC1->TASKS_CLEAR = 1; m_ticks_latest = 0; m_rtc1_reset = true; + nrf_delay_us(MAX_RTC_TASKS_DELAY); } } @@ -325,6 +340,8 @@ static void timer_list_remove(timer_node_t * p_timer) { p_current->ticks_to_expire += timeout; } + + return (p_old_head != mp_timer_id_head); } @@ -343,6 +360,15 @@ static void timer_list_handler_sched(void) NVIC_SetPendingIRQ(SWI_IRQn); } +#if APP_TIMER_CONFIG_USE_SCHEDULER +static void timeout_handler_scheduled_exec(void * p_event_data, uint16_t event_size) +{ + APP_ERROR_CHECK_BOOL(event_size == sizeof(app_timer_event_t)); + app_timer_event_t const * p_timer_event = (app_timer_event_t *)p_event_data; + + p_timer_event->timeout_handler(p_timer_event->p_context); +} +#endif /**@brief Function for executing an application timeout handler, either by calling it directly, or * by passing an event to the @ref app_scheduler. @@ -351,15 +377,16 @@ static void timer_list_handler_sched(void) */ static void timeout_handler_exec(timer_node_t * p_timer) { - if (m_evt_schedule_func != NULL) - { - uint32_t err_code = m_evt_schedule_func(p_timer->p_timeout_handler, p_timer->p_context); - APP_ERROR_CHECK(err_code); - } - else - { - p_timer->p_timeout_handler(p_timer->p_context); - } +#if APP_TIMER_CONFIG_USE_SCHEDULER + app_timer_event_t timer_event; + + timer_event.timeout_handler = p_timer->p_timeout_handler; + timer_event.p_context = p_timer->p_context; + uint32_t err_code = app_sched_event_put(&timer_event, sizeof(timer_event), timeout_handler_scheduled_exec); + APP_ERROR_CHECK(err_code); +#else + p_timer->p_timeout_handler(p_timer->p_context); +#endif } @@ -367,7 +394,7 @@ static void timeout_handler_exec(timer_node_t * p_timer) */ static void timer_timeouts_check(void) { - // Handle expired of timer + // Handle expired of timer if (mp_timer_id_head != NULL) { timer_node_t * p_timer; @@ -467,65 +494,6 @@ static bool elapsed_ticks_acquire(uint32_t * p_ticks_elapsed) } -/**@brief Function for handling the timer list deletions. - * - * @return TRUE if Capture Compare register must be updated, FALSE otherwise. - */ -static bool list_deletions_handler(void) -{ - timer_node_t * p_timer_old_head; - uint8_t user_id; - - // Remember the old head, so as to decide if new compare needs to be set. - p_timer_old_head = mp_timer_id_head; - - user_id = m_user_array_size; - while (user_id--) - { - timer_user_t * p_user = &mp_users[user_id]; - uint8_t user_ops_first = p_user->first; - - while (user_ops_first != p_user->last) - { - timer_user_op_t * p_user_op = &p_user->p_user_op_queue[user_ops_first]; - - // Traverse to next operation in queue. - user_ops_first++; - if (user_ops_first == p_user->user_op_queue_size) - { - user_ops_first = 0; - } - - switch (p_user_op->op_type) - { - case TIMER_USER_OP_TYPE_STOP: - // Delete node if timer is running. - timer_list_remove(p_user_op->p_node); - break; - - case TIMER_USER_OP_TYPE_STOP_ALL: - // Delete list of running timers, and mark all timers as not running. - while (mp_timer_id_head != NULL) - { - timer_node_t * p_head = mp_timer_id_head; - - p_head->is_running = false; - mp_timer_id_head = p_head->next; - } - break; - - default: - // No implementation needed. - break; - } - } - } - - // Detect change in head of the list. - return (mp_timer_id_head != p_timer_old_head); -} - - /**@brief Function for updating the timer list for expired timers. * * @param[in] ticks_elapsed Number of elapsed ticks. @@ -546,7 +514,7 @@ static void expired_timers_handler(uint32_t ticks_elapsed, // Auto variable for current timer node. p_timer = mp_timer_id_head; - // Do nothing if timer did not expire + // Do nothing if timer did not expire if (ticks_elapsed < p_timer->ticks_to_expire) { p_timer->ticks_to_expire -= ticks_elapsed; @@ -584,91 +552,115 @@ static void expired_timers_handler(uint32_t ticks_elapsed, */ static bool list_insertions_handler(timer_node_t * p_restart_list_head) { + bool compare_update = false; + timer_node_t * p_timer_id_old_head; - uint8_t user_id; // Remember the old head, so as to decide if new compare needs to be set. p_timer_id_old_head = mp_timer_id_head; - user_id = m_user_array_size; - while (user_id--) + // Handle insertions of timers. + while ((p_restart_list_head != NULL) || (m_op_queue.first != m_op_queue.last)) { - timer_user_t * p_user = &mp_users[user_id]; + timer_node_t * p_timer; - // Handle insertions of timers. - while ((p_restart_list_head != NULL) || (p_user->first != p_user->last)) + if (p_restart_list_head != NULL) { - timer_node_t * p_timer; - - if (p_restart_list_head != NULL) - { - p_timer = p_restart_list_head; - p_restart_list_head = p_timer->next; - } - else - { - timer_user_op_t * p_user_op = &p_user->p_user_op_queue[p_user->first]; - - p_user->first++; - if (p_user->first == p_user->user_op_queue_size) - { - p_user->first = 0; - } - - p_timer = p_user_op->p_node; - - if ((p_user_op->op_type != TIMER_USER_OP_TYPE_START) || p_timer->is_running) - { - continue; - } - - p_timer->ticks_at_start = p_user_op->params.start.ticks_at_start; - p_timer->ticks_first_interval = p_user_op->params.start.ticks_first_interval; - p_timer->ticks_periodic_interval = p_user_op->params.start.ticks_periodic_interval; - p_timer->p_context = p_user_op->params.start.p_context; - - if (m_rtc1_reset) - { - p_timer->ticks_at_start = 0; - } - } - - // Prepare the node to be inserted. - if ( - ((p_timer->ticks_at_start - m_ticks_latest) & MAX_RTC_COUNTER_VAL) - < - (MAX_RTC_COUNTER_VAL / 2) - ) - { - p_timer->ticks_to_expire = ticks_diff_get(p_timer->ticks_at_start, m_ticks_latest) + - p_timer->ticks_first_interval; - } - else - { - uint32_t delta_current_start; - - delta_current_start = ticks_diff_get(m_ticks_latest, p_timer->ticks_at_start); - if (p_timer->ticks_first_interval > delta_current_start) - { - p_timer->ticks_to_expire = p_timer->ticks_first_interval - delta_current_start; - } - else - { - p_timer->ticks_to_expire = 0; - } - } - - p_timer->ticks_at_start = 0; - p_timer->ticks_first_interval = 0; - p_timer->is_running = true; - p_timer->next = NULL; - - // Insert into list - timer_list_insert(p_timer); + p_timer = p_restart_list_head; + p_restart_list_head = p_timer->next; } + else + { + timer_user_op_t * p_user_op = &m_op_queue.user_op_queue[m_op_queue.first]; + + m_op_queue.first++; + if (m_op_queue.first == m_op_queue.size) + { + m_op_queue.first = 0; + } + + p_timer = p_user_op->p_node; + + switch (p_user_op->op_type) + { + case TIMER_USER_OP_TYPE_STOP: + // Delete node if timer is running. + if (timer_list_remove(p_user_op->p_node)) + { + compare_update = true; + } + + p_timer->is_running = false; + continue; + + case TIMER_USER_OP_TYPE_STOP_ALL: + // Delete list of running timers, and mark all timers as not running. + while (mp_timer_id_head != NULL) + { + timer_node_t * p_head = mp_timer_id_head; + + p_head->is_running = false; + mp_timer_id_head = p_head->next; + } + continue; + case TIMER_USER_OP_TYPE_START: + break; + default: + // No implementation needed. + continue; + } + + if (p_timer->is_running) + { + continue; + } + + p_timer->ticks_at_start = p_user_op->params.start.ticks_at_start; + p_timer->ticks_first_interval = p_user_op->params.start.ticks_first_interval; + p_timer->ticks_periodic_interval = p_user_op->params.start.ticks_periodic_interval; + p_timer->p_context = p_user_op->params.start.p_context; + + if (m_rtc1_reset) + { + p_timer->ticks_at_start = 0; + } + } + + // Prepare the node to be inserted. + if ( + ((p_timer->ticks_at_start - m_ticks_latest) & MAX_RTC_COUNTER_VAL) + < + (MAX_RTC_COUNTER_VAL / 2) + ) + { + p_timer->ticks_to_expire = ticks_diff_get(p_timer->ticks_at_start, m_ticks_latest) + + p_timer->ticks_first_interval; + } + else + { + uint32_t delta_current_start; + + delta_current_start = ticks_diff_get(m_ticks_latest, p_timer->ticks_at_start); + if (p_timer->ticks_first_interval > delta_current_start) + { + p_timer->ticks_to_expire = p_timer->ticks_first_interval - delta_current_start; + } + else + { + p_timer->ticks_to_expire = 0; + } + } + + p_timer->ticks_at_start = 0; + p_timer->ticks_first_interval = 0; + p_timer->is_running = true; + p_timer->next = NULL; + + // Insert into list + timer_list_insert(p_timer); } - - return (mp_timer_id_head != p_timer_id_old_head); + + return (compare_update || (mp_timer_id_head != p_timer_id_old_head)); } @@ -676,7 +668,7 @@ static bool list_insertions_handler(timer_node_t * p_restart_list_head) */ static void compare_reg_update(timer_node_t * p_timer_id_head_old) { - // Setup the timeout for timers on the head of the list + // Setup the timeout for timers on the head of the list if (mp_timer_id_head != NULL) { uint32_t ticks_to_expire = mp_timer_id_head->ticks_to_expire; @@ -692,7 +684,7 @@ static void compare_reg_update(timer_node_t * p_timer_id_head_old) cc += (ticks_elapsed < ticks_to_expire) ? ticks_to_expire : ticks_elapsed; cc &= MAX_RTC_COUNTER_VAL; - + rtc1_compare0_set(cc); uint32_t post_counter_val = rtc1_counter_get(); @@ -705,7 +697,7 @@ static void compare_reg_update(timer_node_t * p_timer_id_head_old) { // When this happens the COMPARE event may not be triggered by the RTC. // The nRF51 Series User Specification states that if the COUNTER value is N - // (i.e post_counter_val = N), writing N or N+1 to a CC register may not trigger a + // (i.e post_counter_val = N), writing N or N + 1 to a CC register may not trigger a // COMPARE event. Hence the RTC interrupt is forcefully pended by calling the following // function. rtc1_compare0_set(rtc1_counter_get()); // this should prevent CC to fire again in the background while the code is in RTC-ISR @@ -715,8 +707,10 @@ static void compare_reg_update(timer_node_t * p_timer_id_head_old) } else { +#if (APP_TIMER_KEEPS_RTC_ACTIVE == 0) // No timers are running, stop RTC rtc1_stop(); +#endif //(APP_TIMER_KEEPS_RTC_ACTIVE == 0) } } @@ -730,25 +724,19 @@ static void timer_list_handler(void) uint32_t ticks_elapsed; uint32_t ticks_previous; bool ticks_have_elapsed; - bool compare_update; + bool compare_update = false; timer_node_t * p_timer_id_head_old; - -#ifdef APP_TIMER_WITH_PROFILER + +#if APP_TIMER_WITH_PROFILER { - unsigned int i; + uint8_t size = m_op_queue.size; + uint8_t first = m_op_queue.first; + uint8_t last = m_op_queue.last; + uint8_t utilization = (first <= last) ? (last - first) : (size + 1 - first + last); - for (i = 0; i < APP_TIMER_INT_LEVELS; i++) + if (utilization > m_max_user_op_queue_utilization) { - timer_user_t *p_user = &mp_users[i]; - uint8_t size = p_user->user_op_queue_size; - uint8_t first = p_user->first; - uint8_t last = p_user->last; - uint8_t utilization = (first <= last) ? (last - first) : (size + 1 - first + last); - - if (utilization > m_max_user_op_queue_utilization) - { - m_max_user_op_queue_utilization = utilization; - } + m_max_user_op_queue_utilization = utilization; } } #endif @@ -756,20 +744,18 @@ static void timer_list_handler(void) // Back up the previous known tick and previous list head ticks_previous = m_ticks_latest; p_timer_id_head_old = mp_timer_id_head; - + // Get number of elapsed ticks ticks_have_elapsed = elapsed_ticks_acquire(&ticks_elapsed); - // Handle list deletions - compare_update = list_deletions_handler(); - // Handle expired timers if (ticks_have_elapsed) { expired_timers_handler(ticks_elapsed, ticks_previous, &p_restart_list_head); compare_update = true; } - + + // Handle list insertions if (list_insertions_handler(p_restart_list_head)) { @@ -787,49 +773,46 @@ static void timer_list_handler(void) /**@brief Function for enqueueing a new operations queue entry. * - * @param[in] p_user User that the entry is to be enqueued for. * @param[in] last_index Index of the next last index to be enqueued. */ -static void user_op_enque(timer_user_t * p_user, uint8_t last_index) +static void user_op_enque(uint8_t last_index) { - p_user->last = last_index; + m_op_queue.last = last_index; } /**@brief Function for allocating a new operations queue entry. * - * @param[in] p_user User that the entry is to be allocated for. * @param[out] p_last_index Index of the next last index to be enqueued. * * @return Pointer to allocated queue entry, or NULL if queue is full. */ -static timer_user_op_t * user_op_alloc(timer_user_t * p_user, uint8_t * p_last_index) -{ +static timer_user_op_t * user_op_alloc( uint8_t * p_last_index) +{ uint8_t last; timer_user_op_t * p_user_op; - - last = p_user->last + 1; - if (last == p_user->user_op_queue_size) + + last = m_op_queue.last + 1; + if (last == m_op_queue.size) { // Overflow case. last = 0; } - if (last == p_user->first) + if (last == m_op_queue.first) { // Queue is full. return NULL; } - - *p_last_index = last; - p_user_op = &p_user->p_user_op_queue[p_user->last]; - + + *p_last_index = last; + p_user_op = &m_op_queue.user_op_queue[m_op_queue.last]; + return p_user_op; } /**@brief Function for scheduling a Timer Start operation. * - * @param[in] user_id Id of user calling this function. * @param[in] timer_id Id of timer to start. * @param[in] timeout_initial Time (in ticks) to first timer expiry. * @param[in] timeout_periodic Time (in ticks) between periodic expiries. @@ -837,89 +820,80 @@ static timer_user_op_t * user_op_alloc(timer_user_t * p_user, uint8_t * p_last_i * the timer expires. * @return NRF_SUCCESS on success, otherwise an error code. */ -static uint32_t timer_start_op_schedule(timer_user_id_t user_id, - timer_node_t * p_node, + +static uint32_t timer_start_op_schedule(timer_node_t * p_node, uint32_t timeout_initial, uint32_t timeout_periodic, void * p_context) { uint8_t last_index; - - timer_user_op_t * p_user_op = user_op_alloc(&mp_users[user_id], &last_index); + uint32_t err_code = NRF_SUCCESS; + + CRITICAL_REGION_ENTER(); + timer_user_op_t * p_user_op = user_op_alloc(&last_index); if (p_user_op == NULL) { - return NRF_ERROR_NO_MEM; + err_code = NRF_ERROR_NO_MEM; } - - p_user_op->op_type = TIMER_USER_OP_TYPE_START; - p_user_op->p_node = p_node; - p_user_op->params.start.ticks_at_start = rtc1_counter_get(); - p_user_op->params.start.ticks_first_interval = timeout_initial; - p_user_op->params.start.ticks_periodic_interval = timeout_periodic; - p_user_op->params.start.p_context = p_context; - - user_op_enque(&mp_users[user_id], last_index); + else + { + p_user_op->op_type = TIMER_USER_OP_TYPE_START; + p_user_op->p_node = p_node; + p_user_op->params.start.ticks_at_start = rtc1_counter_get(); + p_user_op->params.start.ticks_first_interval = timeout_initial; + p_user_op->params.start.ticks_periodic_interval = timeout_periodic; + p_user_op->params.start.p_context = p_context; - timer_list_handler_sched(); + user_op_enque(last_index); + } + CRITICAL_REGION_EXIT(); - return NRF_SUCCESS; + if (err_code == NRF_SUCCESS) + { + timer_list_handler_sched(); + } + + return err_code; } /**@brief Function for scheduling a Timer Stop operation. * - * @param[in] user_id Id of user calling this function. * @param[in] timer_id Id of timer to stop. + * @param[in] op_type Type of stop operation * * @return NRF_SUCCESS on successful scheduling a timer stop operation. NRF_ERROR_NO_MEM when there * is no memory left to schedule the timer stop operation. */ -static uint32_t timer_stop_op_schedule(timer_user_id_t user_id, timer_node_t * p_node) +static uint32_t timer_stop_op_schedule(timer_node_t * p_node, + timer_user_op_type_t op_type) { uint8_t last_index; - - timer_user_op_t * p_user_op = user_op_alloc(&mp_users[user_id], &last_index); + uint32_t err_code = NRF_SUCCESS; + + CRITICAL_REGION_ENTER(); + timer_user_op_t * p_user_op = user_op_alloc(&last_index); if (p_user_op == NULL) { - return NRF_ERROR_NO_MEM; + err_code = NRF_ERROR_NO_MEM; } - - p_user_op->op_type = TIMER_USER_OP_TYPE_STOP; - p_user_op->p_node = p_node; - - user_op_enque(&mp_users[user_id], last_index); - - timer_list_handler_sched(); - - return NRF_SUCCESS; -} - - -/**@brief Function for scheduling a Timer Stop All operation. - * - * @param[in] user_id Id of user calling this function. - */ -static uint32_t timer_stop_all_op_schedule(timer_user_id_t user_id) -{ - uint8_t last_index; - - timer_user_op_t * p_user_op = user_op_alloc(&mp_users[user_id], &last_index); - if (p_user_op == NULL) + else { - return NRF_ERROR_NO_MEM; + p_user_op->op_type = op_type; + p_user_op->p_node = p_node; + + user_op_enque(last_index); } - - p_user_op->op_type = TIMER_USER_OP_TYPE_STOP_ALL; - p_user_op->p_node = NULL; - - user_op_enque(&mp_users[user_id], last_index); + CRITICAL_REGION_EXIT(); - timer_list_handler_sched(); + if (err_code == NRF_SUCCESS) + { + timer_list_handler_sched(); + } - return NRF_SUCCESS; + return err_code; } - /**@brief Function for handling the RTC1 interrupt. * * @details Checks for timeouts, and executes timeout handlers for expired timers. @@ -949,56 +923,21 @@ void SWI_IRQHandler(void) } -uint32_t app_timer_init(uint32_t prescaler, - uint8_t op_queues_size, - void * p_buffer, - app_timer_evt_schedule_func_t evt_schedule_func) +ret_code_t app_timer_init(void) { - int i; - - // Check that buffer is correctly aligned - if (!is_word_aligned(p_buffer)) - { - return NRF_ERROR_INVALID_PARAM; - } - // Check for NULL buffer - if (p_buffer == NULL) - { - mp_users = NULL; - return NRF_ERROR_INVALID_PARAM; - } - // Stop RTC to prevent any running timers from expiring (in case of reinitialization) rtc1_stop(); - - m_evt_schedule_func = evt_schedule_func; - - // Initialize users array - m_user_array_size = APP_TIMER_INT_LEVELS; - mp_users = p_buffer; - - // Skip user array - p_buffer = &((uint8_t *)p_buffer)[APP_TIMER_INT_LEVELS * sizeof(timer_user_t)]; - // Initialize operation queues - for (i = 0; i < APP_TIMER_INT_LEVELS; i++) - { - timer_user_t * p_user = &mp_users[i]; - - p_user->first = 0; - p_user->last = 0; - p_user->user_op_queue_size = op_queues_size; - p_user->p_user_op_queue = p_buffer; - - // Skip operation queue - p_buffer = &((uint8_t *)p_buffer)[op_queues_size * sizeof(timer_user_op_t)]; - } + // Initialize operation queue + m_op_queue.first = 0; + m_op_queue.last = 0; + m_op_queue.size = APP_TIMER_CONFIG_OP_QUEUE_SIZE+1; - mp_timer_id_head = NULL; + mp_timer_id_head = NULL; m_ticks_elapsed_q_read_ind = 0; m_ticks_elapsed_q_write_ind = 0; -#ifdef APP_TIMER_WITH_PROFILER +#if APP_TIMER_WITH_PROFILER m_max_user_op_queue_utilization = 0; #endif @@ -1006,17 +945,17 @@ uint32_t app_timer_init(uint32_t prescaler, NVIC_SetPriority(SWI_IRQn, SWI_IRQ_PRI); NVIC_EnableIRQ(SWI_IRQn); - rtc1_init(prescaler); + rtc1_init(APP_TIMER_CONFIG_RTC_FREQUENCY); m_ticks_latest = rtc1_counter_get(); - + return NRF_SUCCESS; } -uint32_t app_timer_create(app_timer_id_t const * p_timer_id, - app_timer_mode_t mode, - app_timer_timeout_handler_t timeout_handler) +ret_code_t app_timer_create(app_timer_id_t const * p_timer_id, + app_timer_mode_t mode, + app_timer_timeout_handler_t timeout_handler) { // Check state and parameters VERIFY_MODULE_INITIALIZED(); @@ -1033,7 +972,7 @@ uint32_t app_timer_create(app_timer_id_t const * p_timer_id, { return NRF_ERROR_INVALID_STATE; } - + timer_node_t * p_node = (timer_node_t *)*p_timer_id; p_node->is_running = false; p_node->mode = mode; @@ -1041,41 +980,11 @@ uint32_t app_timer_create(app_timer_id_t const * p_timer_id, return NRF_SUCCESS; } - -/**@brief Function for creating a timer user id from the current interrupt level. - * - * @return Timer user id. -*/ -static timer_user_id_t user_id_get(void) -{ - timer_user_id_t ret; - - STATIC_ASSERT(APP_TIMER_INT_LEVELS == 3); - - switch (current_int_priority_get()) - { - case APP_IRQ_PRIORITY_HIGH: - ret = APP_HIGH_USER_ID; - break; - - case APP_IRQ_PRIORITY_LOW: - ret = APP_LOW_USER_ID; - break; - - default: - ret = THREAD_MODE_USER_ID; - break; - } - - return ret; -} - - -uint32_t app_timer_start(app_timer_id_t timer_id, uint32_t timeout_ticks, void * p_context) +ret_code_t app_timer_start(app_timer_id_t timer_id, uint32_t timeout_ticks, void * p_context) { uint32_t timeout_periodic; timer_node_t * p_node = (timer_node_t*)timer_id; - + // Check state and parameters VERIFY_MODULE_INITIALIZED(); @@ -1091,19 +1000,18 @@ uint32_t app_timer_start(app_timer_id_t timer_id, uint32_t timeout_ticks, void * { return NRF_ERROR_INVALID_STATE; } - + // Schedule timer start operation timeout_periodic = (p_node->mode == APP_TIMER_MODE_REPEATED) ? timeout_ticks : 0; - return timer_start_op_schedule(user_id_get(), - p_node, + return timer_start_op_schedule(p_node, timeout_ticks, timeout_periodic, p_context); } -uint32_t app_timer_stop(app_timer_id_t timer_id) +ret_code_t app_timer_stop(app_timer_id_t timer_id) { timer_node_t * p_node = (timer_node_t*)timer_id; // Check state and parameters @@ -1113,40 +1021,50 @@ uint32_t app_timer_stop(app_timer_id_t timer_id) { return NRF_ERROR_INVALID_STATE; } - + p_node->is_running = false; + // Schedule timer stop operation - return timer_stop_op_schedule(user_id_get(), p_node); + return timer_stop_op_schedule(p_node, TIMER_USER_OP_TYPE_STOP); } -uint32_t app_timer_stop_all(void) +ret_code_t app_timer_stop_all(void) { // Check state VERIFY_MODULE_INITIALIZED(); - return timer_stop_all_op_schedule(user_id_get()); + return timer_stop_op_schedule(NULL, TIMER_USER_OP_TYPE_STOP_ALL); } -uint32_t app_timer_cnt_get(uint32_t * p_ticks) +uint32_t app_timer_cnt_get(void) { - *p_ticks = rtc1_counter_get(); - return NRF_SUCCESS; + return rtc1_counter_get(); } uint32_t app_timer_cnt_diff_compute(uint32_t ticks_to, - uint32_t ticks_from, - uint32_t * p_ticks_diff) + uint32_t ticks_from) { - *p_ticks_diff = ticks_diff_get(ticks_to, ticks_from); - return NRF_SUCCESS; + return ticks_diff_get(ticks_to, ticks_from); } -#ifdef APP_TIMER_WITH_PROFILER +#if APP_TIMER_WITH_PROFILER uint8_t app_timer_op_queue_utilization_get(void) { return m_max_user_op_queue_utilization; } #endif + +void app_timer_pause(void) +{ + NRF_RTC1->TASKS_STOP = 1; +} + +void app_timer_resume(void) +{ + NRF_RTC1->TASKS_START = 1; +} + +#endif //NRF_MODULE_ENABLED(APP_TIMER) diff --git a/nRF5_SDK_11.0.0_89a8197/components/libraries/timer/app_timer.h b/nRF5_SDK_11.0.0_89a8197/components/libraries/timer/app_timer.h index e5e05d3..9a5bd7e 100644 --- a/nRF5_SDK_11.0.0_89a8197/components/libraries/timer/app_timer.h +++ b/nRF5_SDK_11.0.0_89a8197/components/libraries/timer/app_timer.h @@ -1,15 +1,42 @@ -/* Copyright (c) 2012 Nordic Semiconductor. All Rights Reserved. - * - * The information contained herein is property of Nordic Semiconductor ASA. - * Terms and conditions of usage are described in detail in NORDIC - * SEMICONDUCTOR STANDARD SOFTWARE LICENSE AGREEMENT. - * - * Licensees are granted free, non-transferable use of the information. NO - * WARRANTY of ANY KIND is provided. This heading must NOT be removed from - * the file. - * +/** + * Copyright (c) 2012 - 2017, Nordic Semiconductor ASA + * + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without modification, + * are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form, except as embedded into a Nordic + * Semiconductor ASA integrated circuit in a product or a software update for + * such product, must reproduce the above copyright notice, this list of + * conditions and the following disclaimer in the documentation and/or other + * materials provided with the distribution. + * + * 3. Neither the name of Nordic Semiconductor ASA nor the names of its + * contributors may be used to endorse or promote products derived from this + * software without specific prior written permission. + * + * 4. This software, with or without modification, must only be used with a + * Nordic Semiconductor ASA integrated circuit. + * + * 5. Any software provided in binary form under this license must not be reverse + * engineered, decompiled, modified and/or disassembled. + * + * THIS SOFTWARE IS PROVIDED BY NORDIC SEMICONDUCTOR ASA "AS IS" AND ANY EXPRESS + * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + * OF MERCHANTABILITY, NONINFRINGEMENT, AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL NORDIC SEMICONDUCTOR ASA OR CONTRIBUTORS BE + * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE + * GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT + * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * */ - /** @file * * @defgroup app_timer Application Timer @@ -19,7 +46,7 @@ * @brief Application timer functionality. * * @details This module enables the application to create multiple timer instances based on the RTC1 - * peripheral. Checking for time-outs and invokation of user time-out handlers is performed + * peripheral. Checking for time-outs and invocation of user time-out handlers is performed * in the RTC1 interrupt handler. List handling is done using a software interrupt (SWI0). * Both interrupt handlers are running in APP_LOW priority level. * @@ -32,67 +59,55 @@ * the scheduler. * * @details Use the USE_SCHEDULER parameter of the APP_TIMER_INIT() macro to select if the - * @ref app_scheduler should be used or not. Even if the scheduler is + * @ref app_scheduler should be used or not. Even if the scheduler is * not used, app_timer.h will include app_scheduler.h, so when * compiling, app_scheduler.h must be available in one of the compiler include paths. */ #ifndef APP_TIMER_H__ #define APP_TIMER_H__ - -#include -#include -#include +#include "sdk_config.h" #include "app_error.h" #include "app_util.h" #include "compiler_abstraction.h" +#include "nordic_common.h" +#include +#include +#include -#define APP_TIMER_CLOCK_FREQ 32768 /**< Clock frequency of the RTC timer used to implement the app timer module. */ -#define APP_TIMER_MIN_TIMEOUT_TICKS 5 /**< Minimum value of the timeout_ticks parameter of app_timer_start(). */ +#ifdef __cplusplus +extern "C" { +#endif -#define APP_TIMER_NODE_SIZE 32 /**< Size of app_timer.timer_node_t (used to allocate data). */ -#define APP_TIMER_USER_OP_SIZE 24 /**< Size of app_timer.timer_user_op_t (only for use inside APP_TIMER_BUF_SIZE()). */ -#define APP_TIMER_USER_SIZE 8 /**< Size of app_timer.timer_user_t (only for use inside APP_TIMER_BUF_SIZE()). */ -#define APP_TIMER_INT_LEVELS 3 /**< Number of interrupt levels from where timer operations may be initiated (only for use inside APP_TIMER_BUF_SIZE()). */ +#define APP_TIMER_CLOCK_FREQ 32768 /**< Clock frequency of the RTC timer used to implement the app timer module. */ +#define APP_TIMER_MIN_TIMEOUT_TICKS 5 /**< Minimum value of the timeout_ticks parameter of app_timer_start(). */ -/**@brief Compute number of bytes required to hold the application timer data structures. - * - * @param[in] OP_QUEUE_SIZE Size of queues holding timer operations that are pending execution. - * Note that due to the queue implementation, this size must be one more - * than the size that is actually needed. - * - * @return Required application timer buffer size (in bytes). - */ -#define APP_TIMER_BUF_SIZE(OP_QUEUE_SIZE) \ - ( \ - ( \ - APP_TIMER_INT_LEVELS \ - * \ - (APP_TIMER_USER_SIZE + ((OP_QUEUE_SIZE) + 1) * APP_TIMER_USER_OP_SIZE) \ - ) \ - ) +#ifdef RTX +#define APP_TIMER_NODE_SIZE 40 /**< Size of app_timer.timer_node_t (used to allocate data). */ +#else +#define APP_TIMER_NODE_SIZE 32 /**< Size of app_timer.timer_node_t (used to allocate data). */ +#endif // RTX + +#define APP_TIMER_SCHED_EVENT_DATA_SIZE sizeof(app_timer_event_t) /**< Size of event data when scheduler is used. */ /**@brief Convert milliseconds to timer ticks. * * This macro uses 64-bit integer arithmetic, but as long as the macro parameters are * constants (i.e. defines), the computation will be done by the preprocessor. - * - * When using this macro, ensure that the - * values provided as input result in an output value that is supported by the - * @ref app_timer_start function. For example, when the ticks for 1 ms is needed, the - * maximum possible value of PRESCALER must be 6, when @ref APP_TIMER_CLOCK_FREQ is 32768. - * This will result in a ticks value as 5. Any higher value for PRESCALER will result in a - * ticks value that is not supported by this module. * * @param[in] MS Milliseconds. - * @param[in] PRESCALER Value of the RTC1 PRESCALER register (must be the same value that was - * passed to APP_TIMER_INIT()). * * @return Number of timer ticks. */ -#define APP_TIMER_TICKS(MS, PRESCALER)\ - ((uint32_t)ROUNDED_DIV((MS) * (uint64_t)APP_TIMER_CLOCK_FREQ, ((PRESCALER) + 1) * 1000)) - +#ifndef FREERTOS +#define APP_TIMER_TICKS(MS) \ + ((uint32_t)ROUNDED_DIV( \ + (MS) * (uint64_t)APP_TIMER_CLOCK_FREQ, \ + 1000 * (APP_TIMER_CONFIG_RTC_FREQUENCY + 1))) +#else +#include "FreeRTOSConfig.h" +#define APP_TIMER_TICKS(MS) (uint32_t)ROUNDED_DIV((MS)*configTICK_RATE_HZ,1000) +#endif typedef struct app_timer_t { uint32_t data[CEIL_DIV(APP_TIMER_NODE_SIZE, sizeof(uint32_t))]; } app_timer_t; /**@brief Timer ID type. @@ -104,17 +119,20 @@ typedef app_timer_t * app_timer_id_t; * * @param timer_id Name of the timer identifier variable that will be used to control the timer. */ -#define APP_TIMER_DEF(timer_id) \ - static app_timer_t timer_id##_data = { {0} }; \ - static const app_timer_id_t timer_id = &timer_id##_data +#define APP_TIMER_DEF(timer_id) \ + static app_timer_t CONCAT_2(timer_id,_data) = { {0} }; \ + static const app_timer_id_t timer_id = &CONCAT_2(timer_id,_data) /**@brief Application time-out handler type. */ typedef void (*app_timer_timeout_handler_t)(void * p_context); -/**@brief Type of function for passing events from the timer module to the scheduler. */ -typedef uint32_t (*app_timer_evt_schedule_func_t) (app_timer_timeout_handler_t timeout_handler, - void * p_context); +/**@brief Structure passed to app_scheduler. */ +typedef struct +{ + app_timer_timeout_handler_t timeout_handler; + void * p_context; +} app_timer_event_t; /**@brief Timer modes. */ typedef enum @@ -123,69 +141,11 @@ typedef enum APP_TIMER_MODE_REPEATED /**< The timer will restart each time it expires. */ } app_timer_mode_t; -/**@brief Initialize the application timer module. - * - * @details This macro handles dimensioning and allocation of the memory buffer required by the timer, - * making sure that the buffer is correctly aligned. It will also connect the timer module - * to the scheduler (if specified). - * - * @note This module assumes that the LFCLK is already running. If it is not, the module will - * be non-functional, since the RTC will not run. If you do not use a SoftDevice, you - * must start the LFCLK manually. See the rtc_example's lfclk_config() function - * for an example of how to do this. If you use a SoftDevice, the LFCLK is started on - * SoftDevice init. - * - * - * @param[in] PRESCALER Value of the RTC1 PRESCALER register. This will decide the - * timer tick rate. Set to 0 for no prescaling. - * @param[in] OP_QUEUES_SIZE Size of queues holding timer operations that are pending execution. - * @param[in] SCHEDULER_FUNC Pointer to scheduler event handler - * - * @note Since this macro allocates a buffer, it must only be called once (it is OK to call it - * several times as long as it is from the same location, for example, to do a re-initialization). - */ -/*lint -emacro(506, APP_TIMER_INIT) */ /* Suppress "Constant value Boolean */ -#define APP_TIMER_INIT(PRESCALER, OP_QUEUES_SIZE, SCHEDULER_FUNC) \ - do \ - { \ - static uint32_t APP_TIMER_BUF[CEIL_DIV(APP_TIMER_BUF_SIZE((OP_QUEUES_SIZE) + 1), \ - sizeof(uint32_t))]; \ - uint32_t ERR_CODE = app_timer_init((PRESCALER), \ - (OP_QUEUES_SIZE) + 1, \ - APP_TIMER_BUF, \ - SCHEDULER_FUNC); \ - APP_ERROR_CHECK(ERR_CODE); \ - } while (0) - - - /**@brief Function for initializing the timer module. - * - * Normally, initialization should be done using the APP_TIMER_INIT() macro, because that macro will both - * allocate the buffers needed by the timer module (including aligning the buffers correctly) - * and take care of connecting the timer module to the scheduler (if specified). - * - * @param[in] prescaler Value of the RTC1 PRESCALER register. Set to 0 for no prescaling. - * @param[in] op_queues_size Size of queues holding timer operations that are pending - * execution. Note that due to the queue implementation, this size must - * be one more than the size that is actually needed. - * @param[in] p_buffer Pointer to memory buffer for internal use in the app_timer - * module. The size of the buffer can be computed using the - * APP_TIMER_BUF_SIZE() macro. The buffer must be aligned to a - * 4 byte boundary. - * @param[in] evt_schedule_func Function for passing time-out events to the scheduler. Point to - * app_timer_evt_schedule() to connect to the scheduler. Set to NULL - * to make the timer module call the time-out handler directly from - * the timer interrupt handler. * * @retval NRF_SUCCESS If the module was initialized successfully. - * @retval NRF_ERROR_INVALID_PARAM If a parameter was invalid (buffer not aligned to a 4 byte - * boundary or NULL). */ -uint32_t app_timer_init(uint32_t prescaler, - uint8_t op_queues_size, - void * p_buffer, - app_timer_evt_schedule_func_t evt_schedule_func); +ret_code_t app_timer_init(void); /**@brief Function for creating a timer instance. * @@ -206,9 +166,9 @@ uint32_t app_timer_init(uint32_t prescaler, * @attention The FreeRTOS and RTX app_timer implementation does not allow app_timer_create to * be called on the previously initialized instance. */ -uint32_t app_timer_create(app_timer_id_t const * p_timer_id, - app_timer_mode_t mode, - app_timer_timeout_handler_t timeout_handler); +ret_code_t app_timer_create(app_timer_id_t const * p_timer_id, + app_timer_mode_t mode, + app_timer_timeout_handler_t timeout_handler); /**@brief Function for starting a timer. * @@ -230,7 +190,7 @@ uint32_t app_timer_create(app_timer_id_t const * p_timer_id, * @note When calling this method on a timer that is already running, the second start operation * is ignored. */ -uint32_t app_timer_start(app_timer_id_t timer_id, uint32_t timeout_ticks, void * p_context); +ret_code_t app_timer_start(app_timer_id_t timer_id, uint32_t timeout_ticks, void * p_context); /**@brief Function for stopping the specified timer. * @@ -242,7 +202,7 @@ uint32_t app_timer_start(app_timer_id_t timer_id, uint32_t timeout_ticks, void * * has not been created. * @retval NRF_ERROR_NO_MEM If the timer operations queue was full. */ -uint32_t app_timer_stop(app_timer_id_t timer_id); +ret_code_t app_timer_stop(app_timer_id_t timer_id); /**@brief Function for stopping all running timers. * @@ -250,36 +210,53 @@ uint32_t app_timer_stop(app_timer_id_t timer_id); * @retval NRF_ERROR_INVALID_STATE If the application timer module has not been initialized. * @retval NRF_ERROR_NO_MEM If the timer operations queue was full. */ -uint32_t app_timer_stop_all(void); +ret_code_t app_timer_stop_all(void); /**@brief Function for returning the current value of the RTC1 counter. * - * @param[out] p_ticks Current value of the RTC1 counter. - * - * @retval NRF_SUCCESS If the counter was successfully read. + * @return Current value of the RTC1 counter. */ -uint32_t app_timer_cnt_get(uint32_t * p_ticks); +uint32_t app_timer_cnt_get(void); /**@brief Function for computing the difference between two RTC1 counter values. * * @param[in] ticks_to Value returned by app_timer_cnt_get(). * @param[in] ticks_from Value returned by app_timer_cnt_get(). - * @param[out] p_ticks_diff Number of ticks from ticks_from to ticks_to. * - * @retval NRF_SUCCESS If the counter difference was successfully computed. + * @return Number of ticks from ticks_from to ticks_to. */ uint32_t app_timer_cnt_diff_compute(uint32_t ticks_to, - uint32_t ticks_from, - uint32_t * p_ticks_diff); + uint32_t ticks_from); + -#ifdef APP_TIMER_WITH_PROFILER /**@brief Function for getting the maximum observed operation queue utilization. * * Function for tuning the module and determining OP_QUEUE_SIZE value and thus module RAM usage. * + * @note APP_TIMER_WITH_PROFILER must be enabled to use this functionality. + * * @return Maximum number of events in queue observed so far. */ uint8_t app_timer_op_queue_utilization_get(void); + +/** + * @brief Function for pausing RTC activity which drives app_timer. + * + * @note This function can be used for debugging purposes to ensure + * that application is halted when entering a breakpoint. + */ +void app_timer_pause(void); + +/** + * @brief Function for resuming RTC activity which drives app_timer. + * + * @note This function can be used for debugging purposes to resume + * application activity. + */ +void app_timer_resume(void); + +#ifdef __cplusplus +} #endif #endif // APP_TIMER_H__ diff --git a/nRF5_SDK_11.0.0_89a8197/components/libraries/timer/app_timer_appsh.c b/nRF5_SDK_11.0.0_89a8197/components/libraries/timer/app_timer_appsh.c deleted file mode 100644 index 9755d78..0000000 --- a/nRF5_SDK_11.0.0_89a8197/components/libraries/timer/app_timer_appsh.c +++ /dev/null @@ -1,34 +0,0 @@ -/* Copyright (c) 2014 Nordic Semiconductor. All Rights Reserved. - * - * The information contained herein is property of Nordic Semiconductor ASA. - * Terms and conditions of usage are described in detail in NORDIC - * SEMICONDUCTOR STANDARD SOFTWARE LICENSE AGREEMENT. - * - * Licensees are granted free, non-transferable use of the information. NO - * WARRANTY of ANY KIND is provided. This heading must NOT be removed from - * the file. - * - */ - -#include "app_timer_appsh.h" -#include "app_scheduler.h" - -static void app_timer_evt_get(void * p_event_data, uint16_t event_size) -{ - app_timer_event_t * p_timer_event = (app_timer_event_t *)p_event_data; - - APP_ERROR_CHECK_BOOL(event_size == sizeof(app_timer_event_t)); - p_timer_event->timeout_handler(p_timer_event->p_context); -} - -uint32_t app_timer_evt_schedule(app_timer_timeout_handler_t timeout_handler, - void * p_context) -{ - app_timer_event_t timer_event; - - timer_event.timeout_handler = timeout_handler; - timer_event.p_context = p_context; - - return app_sched_event_put(&timer_event, sizeof(timer_event), app_timer_evt_get); -} - diff --git a/nRF5_SDK_11.0.0_89a8197/components/libraries/timer/app_timer_appsh.h b/nRF5_SDK_11.0.0_89a8197/components/libraries/timer/app_timer_appsh.h deleted file mode 100644 index f92629b..0000000 --- a/nRF5_SDK_11.0.0_89a8197/components/libraries/timer/app_timer_appsh.h +++ /dev/null @@ -1,44 +0,0 @@ -/* Copyright (c) 2014 Nordic Semiconductor. All Rights Reserved. - * - * The information contained herein is property of Nordic Semiconductor ASA. - * Terms and conditions of usage are described in detail in NORDIC - * SEMICONDUCTOR STANDARD SOFTWARE LICENSE AGREEMENT. - * - * Licensees are granted free, non-transferable use of the information. NO - * WARRANTY of ANY KIND is provided. This heading must NOT be removed from - * the file. - * - */ - - #ifndef APP_TIMER_APPSH_H - #define APP_TIMER_APPSH_H - -#include "app_timer.h" - -#define APP_TIMER_SCHED_EVT_SIZE sizeof(app_timer_event_t) /**< Size of button events being passed through the scheduler (is to be used for computing the maximum size of scheduler events). */ - -/**@brief Macro for initializing the application timer module to use with app_scheduler. - * - * @param[in] PRESCALER Value of the RTC1 PRESCALER register. This will decide the - * timer tick rate. Set to 0 for no prescaling. - * @param[in] OP_QUEUES_SIZE Size of queues holding timer operations that are pending execution. - * @param[in] USE_SCHEDULER TRUE if the application is using the app_scheduler, - * FALSE otherwise. - * - * @note Since this macro allocates a buffer, it must only be called once (it is OK to call it - * several times as long as it is from the same location, e.g. to do a reinitialization). - */ -#define APP_TIMER_APPSH_INIT(PRESCALER, OP_QUEUES_SIZE, USE_SCHEDULER) \ - APP_TIMER_INIT(PRESCALER, OP_QUEUES_SIZE, \ - (USE_SCHEDULER) ? app_timer_evt_schedule : NULL) - -typedef struct -{ - app_timer_timeout_handler_t timeout_handler; - void * p_context; -} app_timer_event_t; - -uint32_t app_timer_evt_schedule(app_timer_timeout_handler_t timeout_handler, - void * p_context); -#endif // APP_TIMER_APPSH_H - diff --git a/src/feather52840.h b/src/feather52840.h index b6ed782..f623934 100644 --- a/src/feather52840.h +++ b/src/feather52840.h @@ -60,7 +60,7 @@ #define TX_PIN_NUMBER 6 #define CTS_PIN_NUMBER 7 #define RTS_PIN_NUMBER 5 -#define HWFC true +#define HWFC false // Used as model string in OTA mode #define DIS_MODEL "Bluefruit Feather 52840" diff --git a/src/main.c b/src/main.c index a36e610..d162a17 100644 --- a/src/main.c +++ b/src/main.c @@ -32,11 +32,11 @@ #include #include +#include "nordic_common.h" +#include "sdk_common.h" #include "dfu_transport.h" #include "bootloader.h" #include "bootloader_util.h" -#include "nordic_common.h" -#include "sdk_common.h" #include "nrf.h" #include "nrf_soc.h" @@ -46,7 +46,7 @@ #include "nrf.h" #include "ble_hci.h" #include "app_scheduler.h" -#include "app_timer_appsh.h" +#include "app_timer.h" #include "nrf_error.h" #include "boards.h" @@ -87,7 +87,7 @@ #define APP_TIMER_PRESCALER 0 /**< Value of the RTC1 PRESCALER register. */ #define APP_TIMER_OP_QUEUE_SIZE 4 /**< Size of timer operation queues. */ -#define SCHED_MAX_EVENT_DATA_SIZE MAX(APP_TIMER_SCHED_EVT_SIZE, 0) /**< Maximum size of scheduler events. */ +#define SCHED_MAX_EVENT_DATA_SIZE sizeof(app_timer_event_t) /**< Maximum size of scheduler events. */ #define SCHED_QUEUE_SIZE 20 /**< Maximum number of events in the scheduler queue. */ // Helper function @@ -249,10 +249,17 @@ static uint32_t ble_stack_init(bool init_softdevice) uint32_t err_code; nrf_clock_lf_cfg_t clock_lf_cfg = { +#if 0 .source = NRF_CLOCK_LF_SRC_RC, .rc_ctiv = 16, .rc_temp_ctiv = 2, .accuracy = NRF_CLOCK_LF_ACCURACY_20_PPM +#else + .source = NRF_CLOCK_LF_SRC_XTAL, + .rc_ctiv = 0, + .rc_temp_ctiv = 0, + .accuracy = NRF_CLOCK_LF_ACCURACY_20_PPM +#endif }; if (init_softdevice) @@ -322,7 +329,7 @@ static void scheduler_init(void) /* Initialize a blinky timer to show that we're in bootloader */ (void) app_timer_create(&blinky_timer_id, APP_TIMER_MODE_REPEATED, blinky_handler); - app_timer_start(blinky_timer_id, APP_TIMER_TICKS(LED_BLINK_INTERVAL, APP_TIMER_PRESCALER), NULL); + app_timer_start(blinky_timer_id, APP_TIMER_TICKS(LED_BLINK_INTERVAL), NULL); } @@ -368,7 +375,9 @@ int main(void) led_pin_init(LED_BLUE); // on metro52 will override FRESET // Initialize timer module, already configred to use with the scheduler. - APP_TIMER_APPSH_INIT(APP_TIMER_PRESCALER, APP_TIMER_OP_QUEUE_SIZE, true); +// APP_TIMER_APPSH_INIT(APP_TIMER_PRESCALER, APP_TIMER_OP_QUEUE_SIZE, true); + + app_timer_init(); (void) bootloader_init(); @@ -474,18 +483,16 @@ void freset_erase_and_wait(pstorage_handle_t* hdl, uint32_t addr, uint32_t size) // Time to erase a page is 100 ms max // It is better to force a timeout to prevent lock-up uint32_t timeout_tck = (size/CODE_PAGE_SIZE)*100; - timeout_tck = APP_TIMER_TICKS(timeout_tck, APP_TIMER_PRESCALER); + timeout_tck = APP_TIMER_TICKS(timeout_tck); - uint32_t start_tck; - app_timer_cnt_get(&start_tck); + uint32_t start_tck = app_timer_cnt_get(); while(!_freset_erased_complete) { sd_app_evt_wait(); app_sched_execute(); - uint32_t now_tck; - app_timer_cnt_get(&now_tck); + uint32_t now_tck = app_timer_cnt_get(); if ( (now_tck - start_tck) > timeout_tck ) break; } } diff --git a/src/make_common.mk b/src/make_common.mk index 07f54c4..c4be9d3 100644 --- a/src/make_common.mk +++ b/src/make_common.mk @@ -92,7 +92,6 @@ C_SOURCE_FILES += $(SDK_PATH)/libraries/bootloader_dfu/dfu_transport_serial.c C_SOURCE_FILES += $(SDK_PATH)/libraries/bootloader_dfu/dfu_transport_ble.c C_SOURCE_FILES += $(SDK_PATH)/libraries/timer/app_timer.c -C_SOURCE_FILES += $(SDK_PATH)/libraries/timer/app_timer_appsh.c C_SOURCE_FILES += $(SDK_PATH)/libraries/scheduler/app_scheduler.c C_SOURCE_FILES += $(SDK_PATH)/libraries/util/app_error.c C_SOURCE_FILES += $(SDK_PATH)/libraries/util/app_error_weak.c diff --git a/src/sdk_config.h b/src/sdk_config.h index 49a856a..457e4d1 100644 --- a/src/sdk_config.h +++ b/src/sdk_config.h @@ -47,6 +47,72 @@ #include "app_config.h" #endif +// HCI_SLIP_ENABLED - hci_slip - SLIP protocol implementation used by HCI +//========================================================== +#ifndef HCI_SLIP_ENABLED +#define HCI_SLIP_ENABLED 1 +#endif +// HCI_UART_BAUDRATE - Default Baudrate + +// <323584=> 1200 baud +// <643072=> 2400 baud +// <1290240=> 4800 baud +// <2576384=> 9600 baud +// <3862528=> 14400 baud +// <5152768=> 19200 baud +// <7716864=> 28800 baud +// <10289152=> 38400 baud +// <15400960=> 57600 baud +// <20615168=> 76800 baud +// <30801920=> 115200 baud +// <61865984=> 230400 baud +// <67108864=> 250000 baud +// <121634816=> 460800 baud +// <251658240=> 921600 baud +// <268435456=> 1000000 baud + +#ifndef HCI_UART_BAUDRATE +#define HCI_UART_BAUDRATE 30801920 +#endif + +// HCI_UART_FLOW_CONTROL - Hardware Flow Control + +// <0=> Disabled +// <1=> Enabled + +#ifndef HCI_UART_FLOW_CONTROL +#define HCI_UART_FLOW_CONTROL 0 +#endif + +// HCI_UART_RX_PIN - UART RX pin +#ifndef HCI_UART_RX_PIN +#define HCI_UART_RX_PIN 8 +#endif + +// HCI_UART_TX_PIN - UART TX pin +#ifndef HCI_UART_TX_PIN +#define HCI_UART_TX_PIN 6 +#endif + +// HCI_UART_RTS_PIN - UART RTS pin +#ifndef HCI_UART_RTS_PIN +#define HCI_UART_RTS_PIN 5 +#endif + +// HCI_UART_CTS_PIN - UART CTS pin +#ifndef HCI_UART_CTS_PIN +#define HCI_UART_CTS_PIN 7 +#endif + + +#ifndef HCI_TRANSPORT_ENABLED +#define HCI_TRANSPORT_ENABLED 1 +#endif +// HCI_MAX_PACKET_SIZE_IN_BITS - Maximum size of a single application packet in bits. +#ifndef HCI_MAX_PACKET_SIZE_IN_BITS +#define HCI_MAX_PACKET_SIZE_IN_BITS 8000 +#endif + //#include "nrf_drv_config.h" // nRF_BLE_DFU @@ -1585,7 +1651,7 @@ #ifndef UART0_CONFIG_USE_EASY_DMA -#define UART0_CONFIG_USE_EASY_DMA 1 +#define UART0_CONFIG_USE_EASY_DMA 0 #endif //