Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
Revision 4:c6ef863d0b07, committed 2017-09-04
- Comitter:
- GregCr
- Date:
- Mon Sep 04 15:16:44 2017 +0000
- Parent:
- 3:7e3595a9ebe0
- Child:
- 5:e488e6f185f3
- Commit message:
- Candidate release
Changed in this revision
--- a/pram_c005.h Wed Oct 12 08:49:58 2016 +0000
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,6149 +0,0 @@
-const uint32_t pram[] =
-{
-0x33fff9,
-0x33eb4a,
-0x33eb4a,
-0x33eb4a,
-0x33eb4a,
-0x23ffff,
-0xea7fc,
-0xea6df,
-0xea194,
-0xea08a,
-0xea3ff,
-0xea27f,
-0xea5ff,
-0xea46b,
-0xc135f,
-0x30ffe9,
-0x35ffec,
-0xc124f,
-0x31ffe9,
-0x10af01,
-0x35f01,
-0x33fff1,
-0xea194,
-0xea076,
-0xea3fd,
-0xea2ff,
-0xea5fd,
-0xea4ff,
-0xc135f,
-0x30ffdb,
-0x35ffde,
-0xc124f,
-0x31ffdb,
-0x10af01,
-0x35f01,
-0x33ffe3,
-0xea190,
-0xea00f,
-0xea3fc,
-0xea2df,
-0xea5fc,
-0xea4cf,
-0xc135f,
-0x30ffcd,
-0x35ffd0,
-0xc124f,
-0x31ffcd,
-0x10af01,
-0x35f01,
-0x33ffd5,
-0x3aecad,
-0xbdfff,
-0x33ffcc,
-0x378ff,
-0x379ff,
-0xe1be3,
-0x34ffc3,
-0xeacf7,
-0xeabff,
-0x33ffb7,
-0xcafbc,
-0xeabff,
-0xccccc,
-0xcdbbb,
-0xcafc0,
-0xec09b,
-0xcafb1,
-0xed195,
-0x18a801,
-0x18a900,
-0x2affff,
-0xeabff,
-0x16a901,
-0x16a801,
-0x23ffff,
-0xeacf7,
-0xeabff,
-0x23ffff,
-0x4af6b,
-0x1bf55,
-0xeacfd,
-0xeabff,
-0x23ffff,
-0x378ff,
-0x379ff,
-0x4ab6b,
-0x3af868,
-0xeacfd,
-0xeabff,
-0x16a901,
-0x16a801,
-0x23ffff,
-0x378ff,
-0x379ff,
-0x4abde,
-0xe2b8f,
-0xe1bdf,
-0x36ff98,
-0x3af7d6,
-0xeaef5,
-0xeadff,
-0xe1cfd,
-0x32ff93,
-0x4ab6b,
-0xeacfe,
-0x3af84d,
-0xeaefd,
-0xeadff,
-0xcafdb,
-0xcafec,
-0x16a901,
-0x16a801,
-0x23ffff,
-0x378ff,
-0x379ff,
-0xff4d,
-0xff4c,
-0xff4b,
-0x4af6b,
-0x32ff85,
-0x3af7d6,
-0x33ff84,
-0x3af7ff,
-0xeabff,
-0x16a901,
-0x16a801,
-0x23ffff,
-0x378ff,
-0x379ff,
-0x3af6f5,
-0xeabff,
-0x16a901,
-0x16a801,
-0x23ffff,
-0x378ff,
-0x379ff,
-0x4ab6b,
-0x3afe6d,
-0xeabff,
-0x16a901,
-0x16a801,
-0x23ffff,
-0x378ff,
-0x379ff,
-0xeabff,
-0xeac6b,
-0x3af4df,
-0xeacfd,
-0xeabff,
-0x16a901,
-0x16a801,
-0x23ffff,
-0x378ff,
-0x379ff,
-0xfe76,
-0xeacff,
-0xeabff,
-0x3af554,
-0xeabff,
-0x16a901,
-0x16a801,
-0x23ffff,
-0x378ff,
-0x379ff,
-0x4af6b,
-0x1bf56,
-0x3afacf,
-0x3afb07,
-0xeacfd,
-0xeabff,
-0x16a901,
-0x16a801,
-0x23ffff,
-0x4af6b,
-0x1bf3d,
-0x4af6a,
-0x1bf3c,
-0x4af6b,
-0x1bfaf,
-0x4af6a,
-0x1bfae,
-0xea1fd,
-0xea07f,
-0x4af6a,
-0x2cf01,
-0xeacfd,
-0xeabff,
-0x23ffff,
-0x378ff,
-0x379ff,
-0xeabff,
-0xeac6b,
-0x3afa00,
-0xeacfd,
-0xeabff,
-0x16a901,
-0x16a801,
-0x23ffff,
-0x378ff,
-0x379ff,
-0xeabff,
-0xeac6b,
-0x3af967,
-0xeacfd,
-0xeabff,
-0x16a901,
-0x16a801,
-0x23ffff,
-0x378ff,
-0x379ff,
-0xeabff,
-0xeac6b,
-0x3afa7d,
-0xeacfd,
-0xeabff,
-0x16a901,
-0x16a801,
-0x23ffff,
-0x378ff,
-0x379ff,
-0xff76,
-0xff4a,
-0xff49,
-0xff48,
-0xeabff,
-0xeac6b,
-0x3af554,
-0xeabff,
-0x16a901,
-0x16a801,
-0x23ffff,
-0x378ff,
-0x379ff,
-0xff76,
-0x4af6b,
-0x1bf4d,
-0x4af6a,
-0x1bf4c,
-0x4af69,
-0x1bf4b,
-0x4af68,
-0x1bf4a,
-0x4af67,
-0x1bf49,
-0x4af66,
-0x1bf48,
-0xeabff,
-0xeac4d,
-0x3af554,
-0xeabff,
-0x16a901,
-0x16a801,
-0x23ffff,
-0x378ff,
-0x379ff,
-0xeabff,
-0xeacff,
-0xead6b,
-0x3af05e,
-0xeabff,
-0x16a901,
-0x16a801,
-0x23ffff,
-0x378ff,
-0x379ff,
-0xeabfd,
-0xeadff,
-0xeacff,
-0x3af05e,
-0xeabff,
-0x16a901,
-0x16a801,
-0x23ffff,
-0x378ff,
-0x379ff,
-0xeabfe,
-0xeadff,
-0xeacff,
-0x3af05e,
-0xeabff,
-0x16a901,
-0x16a801,
-0x23ffff,
-0x378ff,
-0x379ff,
-0x4ab6b,
-0x4ac6a,
-0x3aeda2,
-0xeacfd,
-0xeabff,
-0x16a901,
-0x16a801,
-0x23ffff,
-0x378ff,
-0x379ff,
-0xeabff,
-0xeac6b,
-0x3aed8e,
-0xeacfd,
-0xeabff,
-0x16a901,
-0x16a801,
-0x23ffff,
-0xea0ef,
-0xea1f6,
-0x18ab00,
-0xebbfb,
-0x2cb00,
-0x18ab00,
-0xe2b01,
-0x2cb00,
-0xea0ee,
-0xea1f6,
-0xeafff,
-0x2cf00,
-0xea0ed,
-0xea1f6,
-0xeafff,
-0x2cf00,
-0xea0ec,
-0xea1f6,
-0x18ab00,
-0xe2b0f,
-0xebbfe,
-0x2cb00,
-0xeafff,
-0x1bfef,
-0xeafff,
-0x1bfec,
-0xeafff,
-0x1bfeb,
-0xeafff,
-0x1bfea,
-0xea0df,
-0xea1f6,
-0x18ab00,
-0xebbf7,
-0x2cb00,
-0x23ffff,
-0x378ff,
-0x379ff,
-0x4ab68,
-0xecb01,
-0xe1bfd,
-0x34fea1,
-0x4af68,
-0x36fea1,
-0xeacf7,
-0xeabff,
-0x33fe84,
-0x4af6b,
-0x1bf54,
-0x4af6a,
-0x1bf53,
-0x4af69,
-0x1bf52,
-0x4af68,
-0x1bf51,
-0x4af67,
-0x1bf50,
-0x4af66,
-0x1bf4f,
-0x4af65,
-0x1bf4e,
-0x4af54,
-0xe1f00,
-0x36fe8d,
-0xeacfd,
-0xeabff,
-0x33fe84,
-0x4af53,
-0xe1f00,
-0x32fe90,
-0x4af52,
-0xe1f00,
-0x32fe90,
-0x51,
-0x3af7d6,
-0xeabff,
-0x16a901,
-0x16a801,
-0x23ffff,
-0x378ff,
-0x379ff,
-0x4af6b,
-0x1bf40,
-0x3af081,
-0xeabff,
-0x16a901,
-0x16a801,
-0x23ffff,
-0x4af6b,
-0x1bf41,
-0xeacfd,
-0xeabff,
-0x23ffff,
-0xeacf7,
-0xeabff,
-0x23ffff,
-0xeacf7,
-0xeabff,
-0x23ffff,
-0x374ff,
-0x375ff,
-0x378ff,
-0x379ff,
-0xcafb4,
-0x4af6f,
-0xe2f01,
-0x1bf6f,
-0x3af7ff,
-0xeaef5,
-0xeadff,
-0xe1cfd,
-0x32fe0e,
-0xef4fe,
-0xcaffb,
-0xe1bff,
-0x32fe18,
-0xef4fd,
-0xcaffb,
-0xe1bff,
-0x32fe20,
-0xcaf4b,
-0xe2bc3,
-0xe1bff,
-0x32fe4f,
-0xeabfe,
-0x3af73e,
-0xeaefd,
-0xeadff,
-0x33fe0e,
-0xeabff,
-0xeacff,
-0x3af624,
-0xef4fb,
-0xcaffb,
-0xe1bff,
-0x32fe22,
-0xcaf4b,
-0xe2be7,
-0xe1bff,
-0x32fe41,
-0xeabff,
-0x3af6c7,
-0x33fe52,
-0xeabff,
-0x3af4be,
-0xef4ef,
-0xcaff5,
-0xe15ff,
-0x32fe25,
-0xe15ff,
-0x32fe28,
-0xef4f7,
-0xcaffb,
-0xe1bff,
-0x32fe33,
-0x3af486,
-0x33fe44,
-0xea029,
-0xea1f7,
-0x18ab00,
-0xe2bf0,
-0xebb8f,
-0x2cb00,
-0xeabfe,
-0x3afd7b,
-0xeabfd,
-0x3afd7b,
-0x33fe35,
-0xeabfe,
-0x3afd0b,
-0x33fe39,
-0xeabff,
-0x3afd0b,
-0x33fe3b,
-0x3afc3e,
-0x33fe48,
-0xea0e2,
-0xea1f6,
-0x18ab00,
-0xe2b3f,
-0x2cb00,
-0xeabfd,
-0x3afe07,
-0x33fe58,
-0xea0e1,
-0xea1f6,
-0xeafbf,
-0x2cf00,
-0xeacd7,
-0xeabff,
-0x3aecbb,
-0xeabfe,
-0x3afe07,
-0x33fe5c,
-0xcafdb,
-0xcafec,
-0x16a901,
-0x16a801,
-0x16a501,
-0x16a401,
-0x23ffff,
-0x374ff,
-0x375ff,
-0x378ff,
-0x379ff,
-0x16affc,
-0x2fb00,
-0xe1bfe,
-0x36fda3,
-0xea038,
-0xea1fa,
-0xeaf7e,
-0x2cf00,
-0xea039,
-0xea1fa,
-0xeafb0,
-0x2cf00,
-0xea0b3,
-0xea1f6,
-0xeafff,
-0x2cf00,
-0xeafeb,
-0x2cf01,
-0xeafff,
-0x2ff01,
-0xeaf38,
-0x2ff02,
-0xea436,
-0xea5ff,
-0xea2e2,
-0xea3f6,
-0xeafbf,
-0x2ff03,
-0x4abf6,
-0xebbef,
-0x1bbf6,
-0x4abf4,
-0xebbdf,
-0x1bbf4,
-0xeaffd,
-0x1bfe1,
-0x4abe4,
-0xebb9f,
-0x1bbe4,
-0xea9bf,
-0xea8fa,
-0xd6f99,
-0x1aab00,
-0xccf9b,
-0x2db00,
-0xea03a,
-0xea1fa,
-0x1eaf03,
-0x2cf00,
-0xe2a03,
-0xbdfff,
-0x4abe5,
-0xe2bbf,
-0xe1bff,
-0x32fdb0,
-0xeafdf,
-0x1bfe5,
-0xea037,
-0xea1fa,
-0x18ab00,
-0xcafbd,
-0xeaeff,
-0x18ab01,
-0xcafbc,
-0xeabff,
-0xcbbdb,
-0xcbcec,
-0x1e1b01,
-0x32fdbd,
-0x1e1c02,
-0x31fdb5,
-0x1aab00,
-0xc49bb,
-0x2db00,
-0xdbf88,
-0xe08ff,
-0x31fdda,
-0x33fd8a,
-0xc1b5f,
-0x32fdb2,
-0xc1c4f,
-0x31fdb9,
-0x33fd8a,
-0xeafbf,
-0x1bfe5,
-0x1eaf00,
-0xe1ffe,
-0x36fda7,
-0x4af6f,
-0xebffd,
-0x1bf6f,
-0x33fd8a,
-0x4af6f,
-0xebffe,
-0x1bf6f,
-0x33fd8a,
-0xea038,
-0xea1fa,
-0xeaffd,
-0x2cf00,
-0xea039,
-0xea1fa,
-0xeafff,
-0x2cf00,
-0xea0b3,
-0xea1f6,
-0xeafff,
-0x2cf00,
-0xeaf9b,
-0x2cf01,
-0xeaffe,
-0x2ff01,
-0xeaf0e,
-0x2ff02,
-0xea408,
-0xea5fe,
-0xea2e1,
-0xea3f6,
-0xeafab,
-0x2ff03,
-0x33fde7,
-0x4abf4,
-0xe2b20,
-0x1bbf4,
-0x4abf6,
-0xe2b10,
-0x1bbf6,
-0x4abe4,
-0xe2b60,
-0x1bbe4,
-0x16af04,
-0x16a901,
-0x16a801,
-0x16a501,
-0x16a401,
-0x23ffff,
-0x375ff,
-0x378ff,
-0x379ff,
-0xcafbc,
-0xea038,
-0xea1fa,
-0xeaffd,
-0x2cf00,
-0xea039,
-0xea1fa,
-0xeafff,
-0x2cf00,
-0xea0b3,
-0xea1f6,
-0xeafff,
-0x2cf00,
-0xeafa5,
-0x2cf01,
-0xe1bfe,
-0x36fd21,
-0xea22d,
-0xea3f7,
-0xea583,
-0xeafff,
-0x2df00,
-0xea02f,
-0xea1f7,
-0x18ab00,
-0xcbfcb,
-0x2cb00,
-0x4abf6,
-0xebbef,
-0x1bbf6,
-0x4abf4,
-0xebbdf,
-0x1bbf4,
-0xeaffd,
-0x1bfe1,
-0x4abe4,
-0xebb9f,
-0x1bbe4,
-0xea9bf,
-0xea8fa,
-0xd6f99,
-0x1aab00,
-0xccf9b,
-0x2db00,
-0xea03a,
-0xea1fa,
-0x2c500,
-0xe2a03,
-0xbdfff,
-0x4abe5,
-0xe2bbf,
-0xe1bff,
-0x32fd27,
-0xeafdf,
-0x1bfe5,
-0xea037,
-0xea1fa,
-0x18ab00,
-0xcafbd,
-0xeaeff,
-0x18ab01,
-0xcafbc,
-0xeabff,
-0xcbbdb,
-0xcbcec,
-0xe1bff,
-0x32fd34,
-0xe1c3d,
-0x34fd2c,
-0x1aab00,
-0xc49bb,
-0x2db00,
-0xdbf88,
-0xe08ff,
-0x31fd50,
-0x33fd1d,
-0xe1bff,
-0x32fd29,
-0xe1c41,
-0x34fd30,
-0x33fd1d,
-0xeafbf,
-0x1bfe5,
-0x4af6f,
-0xebff7,
-0x1bf6f,
-0x33fd1d,
-0xea22e,
-0xea3f7,
-0xea597,
-0x33fd64,
-0x4abf4,
-0xe2b20,
-0x1bbf4,
-0x4abf6,
-0xe2b10,
-0x1bbf6,
-0x4abe4,
-0xe2b60,
-0x1bbe4,
-0xea02f,
-0xea1f7,
-0x18ab00,
-0xe2b03,
-0x2cb00,
-0x16a901,
-0x16a801,
-0x16a501,
-0x23ffff,
-0x378ff,
-0x379ff,
-0xea029,
-0xea1f7,
-0x18ac00,
-0xe2cf0,
-0x2cc00,
-0xe1bff,
-0x32fcbf,
-0xea230,
-0xea3f7,
-0x18ab00,
-0xebb7f,
-0x2cb00,
-0xea9a0,
-0xeafff,
-0x2df00,
-0xea0b3,
-0xea1f6,
-0xeafff,
-0x2cf00,
-0xeaf9b,
-0x2cf01,
-0xeafee,
-0x1bfe1,
-0xea02c,
-0xea1f7,
-0x18ab00,
-0xebbfa,
-0x2cb00,
-0xeacfa,
-0x1aa800,
-0xcafcb,
-0xeaefe,
-0xdbfbb,
-0x30fce4,
-0xdafee,
-0xdbfbb,
-0x34fce7,
-0x1aab00,
-0xccbeb,
-0x2db00,
-0xea06c,
-0xea1f7,
-0x18ab00,
-0xebbcf,
-0x2cb00,
-0x4abe4,
-0xebb9f,
-0x1bbe4,
-0xe2a03,
-0xbdfff,
-0x4abe5,
-0xe2bbf,
-0xe1bff,
-0x36fcce,
-0xeafbf,
-0x1bfe5,
-0x4af6f,
-0xebff7,
-0x1bf6f,
-0xeafdf,
-0x1bfe5,
-0xea06b,
-0xea1f7,
-0x18ab00,
-0xc1b9f,
-0x36fcb8,
-0x18ab00,
-0xc1b9f,
-0x31fcc3,
-0x2d800,
-0xdbfcc,
-0xe0cff,
-0x31fcec,
-0x33fcb8,
-0xea231,
-0xea3f7,
-0x18ab00,
-0xebb6f,
-0x2cb00,
-0xea942,
-0x33fcfc,
-0xea02c,
-0xea1f7,
-0x18ab00,
-0xe2b1f,
-0x2cb00,
-0x4abe4,
-0xe2b20,
-0x1bbe4,
-0x16a901,
-0x16a801,
-0x23ffff,
-0x374ff,
-0x375ff,
-0x378ff,
-0x379ff,
-0x16affb,
-0x2fb00,
-0xeafff,
-0x2ff01,
-0xeafff,
-0x2ff02,
-0x2ff03,
-0xe1bff,
-0x36fc4f,
-0xeafff,
-0x1bf92,
-0x1bf91,
-0xeafb8,
-0x1bf94,
-0xeaf1f,
-0x1bf93,
-0xea45f,
-0xea5ef,
-0xea2fa,
-0xe02ff,
-0x34fc53,
-0xd6f55,
-0xd4f44,
-0xcaf4f,
-0x4cf93,
-0x1bf93,
-0xcaf5f,
-0x4df94,
-0x1bf94,
-0xeafff,
-0x1bf91,
-0xeacd7,
-0xeabff,
-0x2f204,
-0x3aecbb,
-0xeadfe,
-0xeacff,
-0x1ea204,
-0xea037,
-0xea1f7,
-0x18ab00,
-0xe2bdf,
-0xe1bff,
-0x36fc55,
-0xd1fcc,
-0xe1cd8,
-0x34fc83,
-0xe1dfe,
-0x36fc5c,
-0x1e1d00,
-0x36fc71,
-0x41493,
-0x1bf93,
-0x4af94,
-0xc7f5f,
-0x1bf94,
-0xe1dff,
-0x32fc67,
-0x1eaf00,
-0x36fc63,
-0xea03a,
-0xea1f7,
-0xeafd5,
-0x2cf00,
-0xeafd7,
-0x2cf00,
-0xdbf22,
-0xe02ff,
-0x31fc96,
-0x33fc46,
-0xea03a,
-0xea1f7,
-0xeaf35,
-0x2cf00,
-0xeaf37,
-0x2cf00,
-0x33fc67,
-0x4af94,
-0x2ff02,
-0x4af93,
-0x2ff03,
-0x1f1f01,
-0x2ff01,
-0x33fc78,
-0xeadff,
-0x33fc7a,
-0x1eaf01,
-0xe1ffb,
-0x30fc8c,
-0x33fc46,
-0xeafff,
-0x1bf93,
-0x1bf92,
-0x1bf91,
-0xeafd9,
-0x1bf94,
-0xea4df,
-0xea5f6,
-0x33fc97,
-0x1eac03,
-0x1eab02,
-0x16af05,
-0x16a901,
-0x16a801,
-0x16a501,
-0x16a401,
-0x23ffff,
-0x378ff,
-0x379ff,
-0x16aff8,
-0x4ae91,
-0x4ad92,
-0x4ac93,
-0x4ab94,
-0x2fb00,
-0x2fc01,
-0x2fd02,
-0x2fe03,
-0xea022,
-0xea1f7,
-0xeafff,
-0x2cf00,
-0xeabff,
-0x3afcad,
-0x1bb59,
-0x1bc58,
-0xeabfe,
-0x3afcad,
-0x1bb5b,
-0x1bc5a,
-0xea2cf,
-0xea3fc,
-0x4af59,
-0x2df00,
-0x4af58,
-0x2df01,
-0xea0cd,
-0xea1fc,
-0x2cb00,
-0x2cc01,
-0x1aaf00,
-0x1abf01,
-0x36fc18,
-0xcbcbf,
-0x32fc15,
-0x4af6f,
-0xebffb,
-0x1bf6f,
-0x4ac58,
-0x4ab59,
-0xccccc,
-0xcdbbb,
-0x4ae5a,
-0x4ad5b,
-0xc1dbf,
-0x32fc0c,
-0xc1ecf,
-0x31fc08,
-0x4af6f,
-0xebffb,
-0x1bf6f,
-0x4a058,
-0x4a159,
-0xea8ff,
-0xea9ff,
-0xea2cb,
-0xea3fc,
-0x1aae00,
-0xeadff,
-0xcaffc,
-0xcaffb,
-0x37eff,
-0x37dff,
-0x37cff,
-0x37bff,
-0x370ff,
-0x371ff,
-0x378ff,
-0x379ff,
-0x39eb10,
-0x16af08,
-0xcafe0,
-0xcafd1,
-0xcafc8,
-0xcafb9,
-0x4af5a,
-0x2ff07,
-0x4af5b,
-0x2ff06,
-0xeafff,
-0x2ff04,
-0x2ff05,
-0x1aac00,
-0xeabff,
-0xd9fcc,
-0xe5bfe,
-0xcafce,
-0xcafbd,
-0xcafdc,
-0xe6cfe,
-0xcafcb,
-0x37eff,
-0x37dff,
-0x37cff,
-0x37bff,
-0x1eaf0b,
-0x37fff,
-0x1eaf0b,
-0x37fff,
-0x1eaf0b,
-0x37fff,
-0x1eaf0b,
-0x37fff,
-0x39eb10,
-0x16af08,
-0xd6fbb,
-0xd4fcc,
-0xd4fdd,
-0xd4fee,
-0xcce00,
-0xcdd11,
-0xcdc88,
-0xcdb99,
-0xcaf8b,
-0xcaf1c,
-0xcaf0d,
-0xeaeff,
-0xecb25,
-0x1bb3f,
-0x1bc3e,
-0xcaf7b,
-0xcaf6c,
-0x3afa7d,
-0x16af08,
-0x16a901,
-0x16a801,
-0x23ffff,
-0xcafc0,
-0xcafb1,
-0x18af00,
-0x1bf8c,
-0x18af01,
-0x1bf8b,
-0x18af02,
-0x1bf8a,
-0x23ffff,
-0x378ff,
-0x379ff,
-0xea3ff,
-0xea257,
-0xea1fd,
-0xea0ff,
-0xeacff,
-0xeabff,
-0x12af01,
-0x34f01,
-0xd1fcc,
-0xd5fbb,
-0xe1bff,
-0x32fba4,
-0xe1ce0,
-0x34fbab,
-0x3afb8b,
-0x16a901,
-0x16a801,
-0x23ffff,
-0x378ff,
-0x379ff,
-0xea3ff,
-0xea257,
-0xea1fd,
-0xea0ff,
-0xeacff,
-0xeabff,
-0x10af01,
-0x35f01,
-0xd1fcc,
-0xd5fbb,
-0xe1bff,
-0x32fb90,
-0xe1ce0,
-0x34fb97,
-0x3afb49,
-0x16a901,
-0x16a801,
-0x23ffff,
-0xea3fd,
-0xea2df,
-0xeadff,
-0xcafdc,
-0xeabff,
-0xccccc,
-0xcdbbb,
-0xcafc0,
-0xec061,
-0xcafb1,
-0xed195,
-0x18af00,
-0x37fff,
-0x18a001,
-0x16a101,
-0x18af00,
-0x35f01,
-0xd1fdd,
-0xe1dd5,
-0x34fb88,
-0xea3fd,
-0xea2b4,
-0x4af56,
-0xe1ffe,
-0x36fb5c,
-0x4af56,
-0xe1ffb,
-0x36fb5c,
-0xeadff,
-0xcafdc,
-0xeabff,
-0xccccc,
-0xcdbbb,
-0xcafc0,
-0xec00b,
-0xcafb1,
-0xed195,
-0x18af00,
-0x37fff,
-0x18a001,
-0x16a101,
-0x18af00,
-0x35f01,
-0xd1fdd,
-0xe1de5,
-0x34fb6e,
-0x33fb4a,
-0xeadff,
-0xcafdc,
-0xeabff,
-0xccccc,
-0xcdbbb,
-0xcafc0,
-0xec0d5,
-0xcafb1,
-0xed194,
-0x18af00,
-0x37fff,
-0x18a001,
-0x16a101,
-0x18af00,
-0x35f01,
-0xd1fdd,
-0xe1deb,
-0x34fb5b,
-0x23ffff,
-0xea3fd,
-0xea2df,
-0xeadff,
-0xcafdc,
-0xeabff,
-0xccccc,
-0xcdbbb,
-0xcafc0,
-0xec061,
-0xcafb1,
-0xed195,
-0x18af00,
-0x37fff,
-0x18a001,
-0x16a101,
-0x12af01,
-0x2cf00,
-0xd1fdd,
-0xe1dd5,
-0x34fb46,
-0xea3fd,
-0xea2b4,
-0x4af56,
-0xe1ffe,
-0x36fb1a,
-0x4af56,
-0xe1ffb,
-0x36fb1a,
-0xeadff,
-0xcafdc,
-0xeabff,
-0xccccc,
-0xcdbbb,
-0xcafc0,
-0xec00b,
-0xcafb1,
-0xed195,
-0x18af00,
-0x37fff,
-0x18a001,
-0x16a101,
-0x12af01,
-0x2cf00,
-0xd1fdd,
-0xe1de5,
-0x34fb2c,
-0x33fb08,
-0xeadff,
-0xcafdc,
-0xeabff,
-0xccccc,
-0xcdbbb,
-0xcafc0,
-0xec0d5,
-0xcafb1,
-0xed194,
-0x18af00,
-0x37fff,
-0x18a001,
-0x16a101,
-0x12af01,
-0x2cf00,
-0xd1fdd,
-0xe1deb,
-0x34fb19,
-0x23ffff,
-0x4af37,
-0x36fafa,
-0xea0b6,
-0xea1f6,
-0xeafff,
-0x2cf00,
-0xea0b7,
-0xea1f6,
-0xeaff5,
-0x2cf00,
-0xeafff,
-0x1bfe0,
-0x33faf0,
-0xea0b6,
-0xea1f6,
-0xeaff3,
-0x2cf00,
-0xea0b7,
-0xea1f6,
-0xeaff2,
-0x2cf00,
-0xeaff1,
-0x1bfe0,
-0xeafe3,
-0x1bfe5,
-0x23ffff,
-0x4af37,
-0x36fadc,
-0xeadfd,
-0xeae7c,
-0xea04f,
-0xea1fa,
-0xcafdc,
-0xeabff,
-0x2cc00,
-0x2ce01,
-0xea04d,
-0xea1fa,
-0xeaff7,
-0x2cf00,
-0xeaf42,
-0x2cf01,
-0x33fad0,
-0xea04f,
-0xea1fa,
-0xeaff9,
-0x2cf00,
-0xeaf39,
-0x2cf01,
-0xea04d,
-0xea1fa,
-0xeaff7,
-0x2cf00,
-0xeaf41,
-0x2cf01,
-0x23ffff,
-0x378ff,
-0x379ff,
-0x4af56,
-0xe1ffe,
-0x36faa4,
-0x4af56,
-0xe1ffb,
-0x36faa4,
-0xff37,
-0x4abab,
-0xe2b08,
-0x1bbab,
-0xea058,
-0xea1f7,
-0xeafff,
-0x2cf00,
-0x4abcf,
-0xe2b0c,
-0x1bbcf,
-0x4af56,
-0x32fab2,
-0x4abcf,
-0xebbfb,
-0x1bbcf,
-0xeaf3f,
-0x1bfce,
-0xeafbf,
-0x1bfcc,
-0x33fa81,
-0x4af56,
-0xe1ffd,
-0x36faa7,
-0x4abcf,
-0xebbf7,
-0x1bbcf,
-0xeaf1f,
-0x1bfce,
-0xeafdf,
-0x1bfcc,
-0x33fa81,
-0x4abcf,
-0xe2b0c,
-0x33fab8,
-0xfe37,
-0x4abab,
-0xebbf7,
-0x1bbab,
-0x4abcf,
-0xebbf3,
-0x1bbcf,
-0xea058,
-0xea1f7,
-0xeaffd,
-0x2cf00,
-0xea2f5,
-0xea3f8,
-0xeaf63,
-0x2df01,
-0xeaf9e,
-0x2df00,
-0x4af56,
-0xe1ffe,
-0x36fa88,
-0xea0e1,
-0xea1f8,
-0x18ab00,
-0xebbf3,
-0x2cb00,
-0xeafcf,
-0x2df02,
-0x33fa81,
-0xea0e1,
-0xea1f8,
-0x18ab00,
-0xe2b0c,
-0x2cb00,
-0xeafbb,
-0x2df02,
-0x3afaed,
-0x16a901,
-0x16a801,
-0x23ffff,
-0x374ff,
-0x375ff,
-0x379ff,
-0x16affe,
-0xcafc4,
-0xcafb5,
-0xea9ff,
-0x4a03e,
-0x4a13f,
-0xec1d9,
-0x2f100,
-0x2f001,
-0x1cae01,
-0x1cad00,
-0xeabff,
-0xcafbc,
-0xcafe2,
-0xcafd3,
-0x1b136,
-0x1b035,
-0xc1d1f,
-0x32fa66,
-0xc1e0f,
-0x31fa5e,
-0xd6f11,
-0xd4f00,
-0xd1f99,
-0xc131f,
-0x32fa5f,
-0xc120f,
-0x35fa65,
-0x1b931,
-0x1caf00,
-0x1bf94,
-0x1caf01,
-0x1bf93,
-0x1caf02,
-0x1bf92,
-0x1caf03,
-0x1bf91,
-0x1caf03,
-0x1bf91,
-0xcaf9e,
-0xeadff,
-0xcafef,
-0xeeff7,
-0xcaffc,
-0xcbc9b,
-0xea022,
-0xea1f7,
-0x2cb00,
-0xcafeb,
-0xeaefd,
-0xeadff,
-0xdbfbb,
-0x30fa41,
-0xdafee,
-0xdefdd,
-0xdbfbb,
-0x34fa45,
-0xcaf3b,
-0xcaf2c,
-0x39eb18,
-0xeafff,
-0x37fff,
-0xeaffa,
-0x37fff,
-0x39eaea,
-0x16af02,
-0xe1dff,
-0x32fa35,
-0xe1ef0,
-0x34fa08,
-0xece0f,
-0xdffdd,
-0xea021,
-0xea1f7,
-0x18ab00,
-0xe2bf8,
-0xeeef7,
-0xcaffc,
-0xcbbcb,
-0x2cb00,
-0xe13e6,
-0x32fa27,
-0xe12ff,
-0x30fa0d,
-0xea029,
-0xea1f7,
-0x18ab00,
-0xebbfb,
-0x2cb00,
-0x1ea001,
-0x1ea100,
-0x1cae01,
-0x1cad00,
-0xeabff,
-0xcafbc,
-0xcafe2,
-0xec203,
-0xdffd3,
-0xc131f,
-0x32fa15,
-0xc120f,
-0x31fa05,
-0xd6f11,
-0xd4f00,
-0xc131f,
-0x32fa0f,
-0xc120f,
-0x35fa14,
-0x33fa05,
-0xea029,
-0xea1f7,
-0x18ab00,
-0xe2b04,
-0x33fa22,
-0xeaeff,
-0xeadff,
-0x33fa32,
-0x16af02,
-0x16a901,
-0x16a501,
-0x16a401,
-0x23ffff,
-0x374ff,
-0x375ff,
-0xcafc2,
-0xcafb3,
-0x4af37,
-0x36f9c1,
-0xea0c5,
-0xea1f8,
-0x1aaf00,
-0x2cf00,
-0xea4fb,
-0xea5f8,
-0x1cab00,
-0xe2b80,
-0x2eb00,
-0x1aaf01,
-0xeef7f,
-0xcaffe,
-0x1cab00,
-0xcbbeb,
-0x2eb00,
-0xea0fd,
-0xea1f8,
-0x1aaf02,
-0x2cf00,
-0xea0fa,
-0xea1f8,
-0x18ad00,
-0xe2d04,
-0x1aaf03,
-0xeeffb,
-0xcaffc,
-0xcbdcd,
-0x2cd00,
-0x1aaf04,
-0xe1ffe,
-0x36f9ce,
-0x1cab00,
-0xe2b40,
-0x2eb00,
-0xea0d6,
-0xea1f8,
-0x18ab00,
-0xebb7f,
-0x2cb00,
-0xea0bb,
-0xea1f8,
-0x18ab00,
-0xe2b10,
-0x33f96b,
-0x1cab00,
-0xebbbf,
-0x2eb00,
-0xea0d6,
-0xea1f8,
-0x18ab00,
-0xebb7f,
-0x2cb00,
-0xea0bb,
-0xea1f8,
-0x18ab00,
-0xebbef,
-0x33f96b,
-0x1aaf01,
-0xeeff7,
-0xcaffc,
-0x1abc00,
-0xcafcb,
-0xea04b,
-0xea1f9,
-0x2cb00,
-0xea04a,
-0xea1f9,
-0x18ad00,
-0xe2d38,
-0x1aaf02,
-0xeeff7,
-0xcaffc,
-0xcbdcd,
-0x2cd00,
-0xea033,
-0xea1f9,
-0x1aaf03,
-0x2cf00,
-0x1aaf02,
-0xe1ffc,
-0x30f970,
-0x1aae02,
-0xeadff,
-0xeeef7,
-0xcaffe,
-0xecef7,
-0xcafeb,
-0xea055,
-0xea1f9,
-0x2cb00,
-0x1aad01,
-0xe2dfc,
-0xe1dff,
-0x32f97a,
-0xea056,
-0xea1f9,
-0xeaff5,
-0x2cf00,
-0xea04c,
-0xea1f9,
-0x18ad00,
-0xe2d40,
-0x1aaf04,
-0xeefbf,
-0xcaffc,
-0xcbdcd,
-0x2cd00,
-0x1aaf03,
-0x32f97f,
-0xea047,
-0xea1f9,
-0x1aaf05,
-0x2cf00,
-0xea048,
-0xea1f9,
-0x18ab00,
-0xe2b37,
-0x1abb06,
-0x1aaf07,
-0xeefef,
-0xcaffe,
-0xcbbeb,
-0x33f96b,
-0x1b1b05,
-0xea047,
-0xea1f9,
-0x2cb00,
-0x33f989,
-0xcafde,
-0xeadff,
-0xeeef7,
-0xcaffe,
-0xecef7,
-0xcafeb,
-0xea056,
-0xea1f9,
-0x2cb00,
-0x33f998,
-0xea055,
-0xea1f9,
-0xeafdf,
-0x2cf00,
-0x33f9a0,
-0x2cb00,
-0x16a501,
-0x16a401,
-0x23ffff,
-0x374ff,
-0x375ff,
-0xcafc2,
-0xcafb3,
-0x4af37,
-0xe1ffe,
-0x36f924,
-0xea05e,
-0xea1f9,
-0x1aaf00,
-0x2cf00,
-0x1aaf01,
-0x2cf01,
-0x1aaf02,
-0x2cf02,
-0xea058,
-0xea1f9,
-0x18ab00,
-0xe2b18,
-0x1abb03,
-0x2cb00,
-0x4af56,
-0xe1ffd,
-0x36f86b,
-0x1aaf04,
-0x1bfa8,
-0xea05b,
-0xea1f9,
-0x1aaf05,
-0x2cf00,
-0x1aaf06,
-0x2cf01,
-0x1aaf07,
-0x2cf02,
-0x4af56,
-0x32f86b,
-0x1aaf04,
-0xe1ff7,
-0x36f92b,
-0x1aaf04,
-0xe1fef,
-0x36f92b,
-0x1aaf04,
-0xe1fe7,
-0x36f92b,
-0xeaf03,
-0x1bf90,
-0xeafcf,
-0x1bfa9,
-0x1aaf04,
-0xe1ff6,
-0x36f92f,
-0x4abaa,
-0xe2b01,
-0x1bbaa,
-0x33f86b,
-0x4abaa,
-0xe2b06,
-0xebbfe,
-0x33f931,
-0xeafff,
-0x1bf90,
-0xeafff,
-0x1bfa9,
-0x4abaa,
-0xebbf8,
-0x33f931,
-0xea0fc,
-0xea1f8,
-0x1aaf00,
-0x2cf00,
-0xea4de,
-0xea5f8,
-0x1cab00,
-0xe2b1c,
-0x2eb00,
-0x1aaf00,
-0xe1ff9,
-0x30f87f,
-0xea0fa,
-0xea1f8,
-0x18ab00,
-0xebbdf,
-0x2cb00,
-0x1cab00,
-0xebbeb,
-0x2eb00,
-0x1aaf00,
-0xe1ff7,
-0x30f884,
-0xea0df,
-0xea1f8,
-0xeafaa,
-0x2cf00,
-0x1aaf00,
-0xe1ff5,
-0x34f889,
-0xea0fb,
-0xea1f8,
-0x18ab00,
-0xebbf7,
-0x2cb00,
-0x1aaf01,
-0xe1ff5,
-0x30f86b,
-0x1aac01,
-0xeabff,
-0xcafc0,
-0xec0ab,
-0xcafb1,
-0xed194,
-0x18af00,
-0x1bfa8,
-0xea0fc,
-0xea1f8,
-0x18ad00,
-0xe2df0,
-0x1aaf01,
-0xeefef,
-0xcaffc,
-0xcbdcd,
-0x2cd00,
-0x1aac01,
-0xeabff,
-0xccccc,
-0xcdbbb,
-0xcafc0,
-0xec0a0,
-0xcafb1,
-0xed194,
-0x18ae01,
-0x18ad00,
-0x1aaf01,
-0xe1ff8,
-0x30f892,
-0xea05b,
-0xea1f9,
-0xcafdc,
-0xeabff,
-0x2cc00,
-0x2ce01,
-0xeafff,
-0x2cf02,
-0x1aaf01,
-0xe1ff9,
-0x36f89a,
-0x4abaa,
-0xe2b06,
-0xebbfe,
-0x1bbaa,
-0xeaf03,
-0x1bf90,
-0xeafcf,
-0x1bfa9,
-0xea0fa,
-0xea1f8,
-0x18ab00,
-0xebbf7,
-0x2cb00,
-0xea0cc,
-0xea1f8,
-0x18ab00,
-0xe2bc0,
-0x2cb00,
-0x1aaf01,
-0xe1ffb,
-0x30f8bd,
-0x18ab00,
-0xebbbf,
-0x2cb00,
-0xea0c0,
-0xea1f8,
-0x18ab00,
-0xe2b07,
-0x2cb00,
-0xea4be,
-0xea5f8,
-0x1cab00,
-0xe2b07,
-0x2eb00,
-0x1aab01,
-0xecb03,
-0xe1bfd,
-0x30f8a0,
-0x18ab00,
-0xebbf9,
-0x2cb00,
-0x1cab00,
-0xebbfc,
-0x2eb00,
-0xea0fb,
-0xea1f8,
-0x18ab00,
-0xe2b07,
-0x2cb00,
-0x18ab00,
-0x1abb02,
-0x2cb00,
-0x33f86b,
-0x18ab00,
-0xebbfb,
-0x2cb00,
-0x1cab00,
-0xebbfd,
-0x33f8aa,
-0x4abaa,
-0xebbf8,
-0x1bbaa,
-0xeafff,
-0x1bf90,
-0xeafff,
-0x1bfa9,
-0x33f8cd,
-0xea05b,
-0xea1f9,
-0xeafff,
-0x2cf00,
-0xcafdc,
-0xeabff,
-0x2cc01,
-0x2ce02,
-0x33f8d8,
-0xea0fb,
-0xea1f8,
-0x18ab00,
-0xe2b18,
-0x33f902,
-0xea0df,
-0xea1f8,
-0xeafaf,
-0x2cf00,
-0x33f909,
-0xea0fa,
-0xea1f8,
-0x18ab00,
-0xe2b20,
-0x2cb00,
-0x1aaf00,
-0xe1ff8,
-0x36f86e,
-0x1aaf00,
-0xe1ff5,
-0x30f871,
-0x1cab00,
-0xebbf3,
-0x33f911,
-0x1cab00,
-0xebbf7,
-0x33f911,
-0x1cab00,
-0xebbef,
-0x33f911,
-0x16a501,
-0x16a401,
-0x23ffff,
-0xcafbc,
-0x32f85f,
-0x4ab8e,
-0xe2b08,
-0x1bb8e,
-0x4ab8f,
-0xe2b08,
-0x1bb8f,
-0x33f853,
-0x4ab8f,
-0xebbf7,
-0x1bb8f,
-0xe1cfe,
-0x36f856,
-0x4ab8e,
-0xebbf7,
-0x1bb8e,
-0x33f853,
-0x4ab8e,
-0xe2b08,
-0x33f858,
-0x4ab8e,
-0xebbfd,
-0x1bb8e,
-0xe2a03,
-0xbdfff,
-0x23ffff,
-0x375ff,
-0x378ff,
-0x379ff,
-0xcafb5,
-0x1bc57,
-0x4ab83,
-0xe2b20,
-0x1bb83,
-0xef5fe,
-0xcaffb,
-0xe1bff,
-0x36f816,
-0xe1cfe,
-0x36f826,
-0xeacc3,
-0xeabff,
-0x3aecbb,
-0xef5fd,
-0xcaffb,
-0xe1bff,
-0x36f829,
-0x4ab8e,
-0xebbfd,
-0x1bb8e,
-0xef5fb,
-0xcaffb,
-0xe1bff,
-0x32f82d,
-0x4ab8f,
-0xe2b01,
-0xebbcf,
-0x33f810,
-0x3afbb3,
-0x4ab8f,
-0xebbce,
-0x33f810,
-0x4ab8e,
-0xebbfe,
-0x33f836,
-0xeafff,
-0x1bf8d,
-0x4abe3,
-0xebbfd,
-0x1bbe3,
-0xeacc3,
-0xeabff,
-0x3aecbb,
-0xeaffe,
-0x1bf8d,
-0x4abe3,
-0xe2b02,
-0x1bbe3,
-0xeaffd,
-0x1bfe5,
-0x33f83f,
-0xea0e1,
-0xea1f6,
-0x18ab00,
-0xe2b40,
-0x2cb00,
-0x33f83c,
-0x1bb8f,
-0xea0e5,
-0xea1f6,
-0x18ab00,
-0xebbbf,
-0x2cb00,
-0xea0ef,
-0xea1f6,
-0x18ab00,
-0xe2b05,
-0x2cb00,
-0xe2a03,
-0xbdfff,
-0x16a901,
-0x16a801,
-0x16a501,
-0x23ffff,
-0x378ff,
-0x379ff,
-0x4abde,
-0xe2f8f,
-0xcaffc,
-0xe1cdf,
-0x36f7dd,
-0xeafff,
-0x1bf8d,
-0x4abe3,
-0xebbfd,
-0x1bbe3,
-0xeaffd,
-0x1bfe5,
-0xe1caf,
-0x36f7df,
-0xe1c9f,
-0x36f7e1,
-0xe1cbf,
-0x36f7e4,
-0xeaefd,
-0xeadff,
-0xe1ccf,
-0x36f7db,
-0xeaef5,
-0xeadff,
-0x33f7db,
-0xeabfe,
-0x3af6c7,
-0x33f7eb,
-0x3aee02,
-0x33f7ed,
-0x3af3be,
-0x33f7ed,
-0x3af7ac,
-0x33f7eb,
-0xcafdb,
-0xcafec,
-0x16a901,
-0x16a801,
-0x23ffff,
-0x378ff,
-0x379ff,
-0x4abde,
-0xe2f8f,
-0xcaffc,
-0xeafff,
-0x1bf8d,
-0x4abe3,
-0xebbfd,
-0x1bbe3,
-0xeaffd,
-0x1bfe5,
-0xe1caf,
-0x36f7b3,
-0xe1c9f,
-0x36f7b5,
-0xe1cbf,
-0x36f7b8,
-0xe1ccf,
-0x36f7bb,
-0xeaefd,
-0xeadff,
-0xe1cdf,
-0x36f7b1,
-0xeaef5,
-0xeadff,
-0x33f7b1,
-0xeabfe,
-0x3af73e,
-0x33f7c2,
-0xeabff,
-0x3af6c7,
-0x33f7c2,
-0x3aee02,
-0x33f7c6,
-0x3af3be,
-0x33f7c6,
-0xcafdb,
-0xcafec,
-0x16a901,
-0x16a801,
-0x23ffff,
-0x374ff,
-0x375ff,
-0x378ff,
-0x379ff,
-0xea0ee,
-0xea1f6,
-0xeafed,
-0x2cf00,
-0xea0ed,
-0xea1f6,
-0xeafed,
-0x2cf00,
-0xea0ef,
-0xea1f6,
-0x18ab00,
-0xe2b01,
-0xebbe7,
-0x2cb00,
-0x4af55,
-0x32f755,
-0xea035,
-0xea1fa,
-0x18ab00,
-0xe2b7f,
-0xe1bff,
-0x32f774,
-0xea0b3,
-0xea1f6,
-0xeaffc,
-0x2cf00,
-0xeaf8f,
-0x2cf01,
-0xeafef,
-0x1bfe1,
-0x4abe4,
-0xebb9f,
-0x1bbe4,
-0xe2a03,
-0xbdfff,
-0x4abe4,
-0xe2b20,
-0x1bbe4,
-0x4abe5,
-0xe2bbf,
-0xe1bff,
-0x36f776,
-0xeafbf,
-0x1bfe5,
-0x4af6f,
-0xebfdf,
-0x1bf6f,
-0xeacdf,
-0xeabff,
-0x33f743,
-0xeafdf,
-0x1bfe5,
-0x4abf7,
-0xebbfe,
-0x1bbf7,
-0xea035,
-0xea1fa,
-0x18ab00,
-0xe2b7f,
-0xe1bff,
-0x32f763,
-0xeacff,
-0x4abf7,
-0xe2bef,
-0xe1bff,
-0x32f763,
-0xd1fcc,
-0xe1c06,
-0x34f76a,
-0xea0b1,
-0xea1f6,
-0xeaff0,
-0x2cf00,
-0x4ab83,
-0xebbfd,
-0x1bb83,
-0x4abde,
-0xe2bf0,
-0xebbcf,
-0x1bbde,
-0xeaccf,
-0xeabff,
-0x33f743,
-0xea4e8,
-0xea5f6,
-0x1cab00,
-0xebbf6,
-0x2eb00,
-0xeacf5,
-0xeabff,
-0x3aecbb,
-0x1cab00,
-0xebbfb,
-0x2eb00,
-0xeacfa,
-0xeabff,
-0x3aecbb,
-0x1cab00,
-0xebbfd,
-0x2eb00,
-0x33f798,
-0x16a901,
-0x16a801,
-0x16a501,
-0x16a401,
-0x23ffff,
-0x375ff,
-0x378ff,
-0x379ff,
-0xcafb5,
-0xe1bfe,
-0x36f708,
-0x4ab83,
-0xe2b02,
-0x1bb83,
-0x4abf7,
-0xe2b01,
-0x1bbf7,
-0xea035,
-0xea1fa,
-0x18ab00,
-0xe2b7f,
-0xe1bff,
-0x32f724,
-0xeacff,
-0x4abf7,
-0xe2bef,
-0xe1bff,
-0x36f724,
-0xd1fcc,
-0xe1c06,
-0x34f72b,
-0xea0b1,
-0xea1f6,
-0xeaff3,
-0x2cf00,
-0xea0ef,
-0xea1f6,
-0x18ab00,
-0xe2b18,
-0xebbfe,
-0x2cb00,
-0xea0ee,
-0xea1f6,
-0xeaffa,
-0x2cf00,
-0xea0ed,
-0xea1f6,
-0xeaffa,
-0x2cf00,
-0x4af55,
-0x36f6ff,
-0xe15fe,
-0x32f6ff,
-0xea0e8,
-0xea1f6,
-0x18ab00,
-0xe2b0f,
-0x2cb00,
-0x33f6ff,
-0xea0e3,
-0xea1f6,
-0x18ab00,
-0xebbfd,
-0x2cb00,
-0xeaceb,
-0xeabff,
-0x3aecbb,
-0x33f738,
-0x4abde,
-0xe2bf0,
-0xebbdf,
-0x1bbde,
-0xeacdf,
-0xeabff,
-0x16a901,
-0x16a801,
-0x16a501,
-0x23ffff,
-0x378ff,
-0x379ff,
-0x4abde,
-0xe2f8f,
-0xcaffc,
-0xeaefd,
-0xeadff,
-0xe1cbf,
-0x36f6cc,
-0xeafff,
-0x1bf8d,
-0x4abe3,
-0xebbfd,
-0x1bbe3,
-0xeaffd,
-0x1bfe5,
-0xe1caf,
-0x36f6ce,
-0xe1c9f,
-0x36f6d0,
-0xe1cdf,
-0x36f6d2,
-0xe1ccf,
-0x36f6d6,
-0xeaef5,
-0xeadff,
-0xe1cbf,
-0x32f6cc,
-0xeaefd,
-0xeadff,
-0x33f6cc,
-0xeabff,
-0xeacff,
-0x3af624,
-0x33f6dd,
-0x3af7ac,
-0x33f6df,
-0x3aee02,
-0x33f6dd,
-0x3af3be,
-0x33f6dd,
-0xcafdb,
-0xcafec,
-0x16a901,
-0x16a801,
-0x23ffff,
-0x375ff,
-0x378ff,
-0x379ff,
-0xcafb5,
-0x36f683,
-0x4af55,
-0x32f696,
-0xea025,
-0xea1f7,
-0xeafff,
-0x2cf00,
-0x4abf7,
-0xe2b0a,
-0x1bbf7,
-0xea03d,
-0xea1f7,
-0x18ab00,
-0xe2b80,
-0x2cb00,
-0x4abf3,
-0xe2b01,
-0x1bbf3,
-0x4ab96,
-0xe2b08,
-0x1bb96,
-0x4abf4,
-0xe2b04,
-0x1bbf4,
-0x4abf5,
-0xe2b10,
-0x1bbf5,
-0xea02a,
-0xea1f7,
-0x18ab00,
-0xe2b15,
-0x2cb00,
-0xe15ff,
-0x36f69a,
-0x4abde,
-0xe2bf0,
-0xebbcf,
-0x1bbde,
-0xeaccf,
-0xeabff,
-0x33f674,
-0xeabff,
-0x3af73e,
-0xeabff,
-0x33f674,
-0xea0e3,
-0xea1f6,
-0x18ab00,
-0xebbfd,
-0x2cb00,
-0xeaceb,
-0xeabff,
-0x3aecbb,
-0xea0e8,
-0xea1f6,
-0x18ab00,
-0xebbfc,
-0x2cb00,
-0xea0ea,
-0xea1f6,
-0x18ab00,
-0xe2b20,
-0x2cb00,
-0x33f6c0,
-0xeaceb,
-0xeabff,
-0x3aecbb,
-0xea0e3,
-0xea1f6,
-0x18ab00,
-0xebbfd,
-0x2cb00,
-0x4af55,
-0x36f6c0,
-0xea0e8,
-0xea1f6,
-0x18ab00,
-0xe2b0f,
-0x33f68a,
-0x16a901,
-0x16a801,
-0x16a501,
-0x23ffff,
-0xea029,
-0xea1f7,
-0x18a300,
-0x4abf4,
-0xebbfe,
-0x1bbf4,
-0x18ab00,
-0xebb3f,
-0x2cb00,
-0xea06c,
-0xea1f7,
-0x18ab00,
-0xebbcf,
-0x2cb00,
-0xea0b3,
-0xea1f6,
-0xeafff,
-0x2cf00,
-0xeafeb,
-0x2cf01,
-0xeafee,
-0x1bfe1,
-0x4abe4,
-0xebb9f,
-0x1bbe4,
-0xe2a03,
-0xbdfff,
-0x4abe4,
-0xe2b20,
-0x1bbe4,
-0x4abe5,
-0xe2bbf,
-0xe1bff,
-0x36f64c,
-0xeafbf,
-0x1bfe5,
-0xeafdf,
-0x1bfe5,
-0xea06b,
-0xea1f7,
-0x18ab00,
-0xcafbe,
-0xeadff,
-0xdafef,
-0x37fff,
-0xdefdb,
-0x16af01,
-0xcaffc,
-0xeeeef,
-0xe6def,
-0xcbefe,
-0xccecc,
-0xcddbb,
-0xcafce,
-0xece6b,
-0xdffbd,
-0xe0dff,
-0x32f635,
-0xe1e00,
-0x34f631,
-0xeaf00,
-0x1bf98,
-0x33f62b,
-0xefd7f,
-0x32f62d,
-0x1be98,
-0x33f62b,
-0xeafff,
-0x1bf98,
-0x4abf4,
-0xe2b01,
-0x1bbf4,
-0xea029,
-0xea1f7,
-0x2c300,
-0x23ffff,
-0x374ff,
-0x375ff,
-0x378ff,
-0x379ff,
-0x16affe,
-0x2fb00,
-0x2fc01,
-0xea02a,
-0xea1f7,
-0x18ab00,
-0xebbea,
-0x2cb00,
-0xea0b6,
-0xea1f6,
-0xeaff6,
-0x2cf00,
-0x4abe3,
-0xebbfb,
-0x1bbe3,
-0x4abe4,
-0xebbfb,
-0x1bbe4,
-0xeaffb,
-0x1bfe5,
-0x4abf7,
-0xebbf5,
-0x1bbf7,
-0x4abf3,
-0xebbfe,
-0x1bbf3,
-0x4abf5,
-0xebbef,
-0x1bbf5,
-0x4abf4,
-0xebbfb,
-0x1bbf4,
-0x1eaf01,
-0x36f58d,
-0x4ab96,
-0xe2b03,
-0xebbf5,
-0x1bb96,
-0xea025,
-0xea1f7,
-0xeafe0,
-0x2cf00,
-0xea41f,
-0xea5f7,
-0x1cab00,
-0xebbf3,
-0x2eb00,
-0xeacfd,
-0xeabff,
-0x3aecbb,
-0x1cab00,
-0xe2b08,
-0x2eb00,
-0xea03d,
-0xea1f7,
-0x18ab00,
-0xebb7f,
-0x2cb00,
-0xeacf7,
-0xeabff,
-0x3aecbb,
-0x1cab00,
-0xe2b04,
-0x2eb00,
-0xeacbf,
-0xeabff,
-0x1eaf01,
-0x32f589,
-0xea019,
-0xea1f7,
-0x18ab00,
-0xe2bf7,
-0xe1bff,
-0x32f5d0,
-0x1eac00,
-0xeabff,
-0xe2cfe,
-0xeabff,
-0xcbcbf,
-0x32f58f,
-0xea0b3,
-0xea1f6,
-0xeafff,
-0x2cf00,
-0xeaf7f,
-0x2cf01,
-0x4abe3,
-0xe2b04,
-0x1bbe3,
-0x4abe4,
-0xebbbf,
-0x1bbe4,
-0xe2a03,
-0xbdfff,
-0x4abe4,
-0xe2b44,
-0x1bbe4,
-0xeafbb,
-0x1bfe5,
-0xea037,
-0xea1f7,
-0x18ab00,
-0xe2bdf,
-0xe1bff,
-0x32f5b1,
-0x4af6f,
-0xebfbf,
-0x1bf6f,
-0xeaccf,
-0xeabff,
-0x33f589,
-0x4abe4,
-0xe2b04,
-0x1bbe4,
-0xeaffb,
-0x1bfe5,
-0x4af55,
-0x36f59b,
-0xea025,
-0xea1f7,
-0x18ab00,
-0xebbdf,
-0x2cb00,
-0xea0ea,
-0xea1f6,
-0x18ab00,
-0xebbdf,
-0x2cb00,
-0xea0e8,
-0xea1f6,
-0x18ab00,
-0xe2b03,
-0x2cb00,
-0xea0e3,
-0xea1f6,
-0x18ab00,
-0xe2b02,
-0x2cb00,
-0x4abde,
-0xe2bf0,
-0xebbbf,
-0x1bbde,
-0xeacbf,
-0xeabff,
-0x33f589,
-0x3af670,
-0x33f5d0,
-0x4ab96,
-0xe2b03,
-0xebbf7,
-0x33f5fb,
-0x16af02,
-0x16a901,
-0x16a801,
-0x16a501,
-0x16a401,
-0x23ffff,
-0x378ff,
-0x379ff,
-0xcafc2,
-0xcafb3,
-0xcbcbf,
-0x36f577,
-0x1aaf00,
-0x32f570,
-0x1aaf01,
-0x32f570,
-0x1aaf02,
-0x32f570,
-0xff77,
-0xea05a,
-0xea1f7,
-0x18ab00,
-0xe2b20,
-0x2cb00,
-0x33f557,
-0x1aaf00,
-0xe1f00,
-0x36f563,
-0xfd77,
-0xea05a,
-0xea1f7,
-0x18ab00,
-0xe2b20,
-0x2cb00,
-0xcaf3b,
-0xcaf2c,
-0x3afbbc,
-0x33f557,
-0x1aaf01,
-0xe1f00,
-0x32f56d,
-0x1aaf02,
-0xe1f00,
-0x32f56d,
-0xfe77,
-0xea05a,
-0xea1f7,
-0x18ab00,
-0xebbdf,
-0x33f572,
-0x16a901,
-0x16a801,
-0x23ffff,
-0x375ff,
-0x378ff,
-0x379ff,
-0x4adde,
-0xe2f8f,
-0xcaff5,
-0x3af583,
-0xe15df,
-0x36f531,
-0xe15cf,
-0x36f533,
-0xe15bf,
-0x36f536,
-0xe159f,
-0x36f53e,
-0xeacfd,
-0xeabff,
-0xe15af,
-0x36f52e,
-0xeacf5,
-0xeabff,
-0x33f52e,
-0xeafff,
-0x1bf8d,
-0x4abe3,
-0xebbfd,
-0x1bbe3,
-0x3aee0b,
-0xcafc5,
-0x33f545,
-0xeabfe,
-0x3af408,
-0x33f538,
-0x3af521,
-0x33f538,
-0x3af7ac,
-0xcafc5,
-0x33f54b,
-0x16a901,
-0x16a801,
-0x16a501,
-0x23ffff,
-0x378ff,
-0x379ff,
-0x3af3be,
-0xeabff,
-0x3af6c7,
-0xeabff,
-0x16a901,
-0x16a801,
-0x23ffff,
-0x378ff,
-0x379ff,
-0xeabff,
-0xeacfe,
-0x3af624,
-0xeabfe,
-0x3af4be,
-0xea0b3,
-0xea1f6,
-0xeafff,
-0x2cf00,
-0xeaf7f,
-0x2cf01,
-0x4abe3,
-0xe2b04,
-0x1bbe3,
-0x4abe4,
-0xebbbf,
-0x1bbe4,
-0xe2a03,
-0xbdfff,
-0x4abe4,
-0xe2b44,
-0x1bbe4,
-0xeafbb,
-0x1bfe5,
-0xea037,
-0xea1f7,
-0x18ab00,
-0xe2bdf,
-0xe1bff,
-0x32f4fb,
-0x4af6f,
-0xebfbf,
-0x1bf6f,
-0xeaccf,
-0xeabff,
-0x33f4e2,
-0x4af55,
-0x36f4ea,
-0xea025,
-0xea1f7,
-0x18ab00,
-0xebbdf,
-0x2cb00,
-0xea0ea,
-0xea1f6,
-0x18ab00,
-0xebbdf,
-0x2cb00,
-0xea0e8,
-0xea1f6,
-0x18ab00,
-0xe2b03,
-0x2cb00,
-0xea0e3,
-0xea1f6,
-0x18ab00,
-0xe2b02,
-0x2cb00,
-0xeabff,
-0x3af408,
-0xeabff,
-0x16a901,
-0x16a801,
-0x23ffff,
-0xcafc0,
-0xcafb1,
-0xea2db,
-0xea3f8,
-0x1aad00,
-0xe2de0,
-0x18af00,
-0xeefdf,
-0xcaffc,
-0xcbdcd,
-0x2dd00,
-0x18af01,
-0x1bf3b,
-0x18af02,
-0x1bf3a,
-0x18af03,
-0x1bf39,
-0x18af04,
-0x1bf38,
-0x18af01,
-0xe1ffe,
-0x36f4c4,
-0xea0bb,
-0xea1f8,
-0x18ab00,
-0xe2b20,
-0x33f4c0,
-0xea0bb,
-0xea1f8,
-0x18ab00,
-0xebbdf,
-0x2cb00,
-0x23ffff,
-0x378ff,
-0x379ff,
-0xcafbc,
-0x4af75,
-0x32f489,
-0xea229,
-0xea3f7,
-0x1aab00,
-0xe2f0f,
-0x1bf30,
-0xe1cff,
-0x36f4ad,
-0xea01b,
-0xea1f7,
-0x18ab00,
-0xebbf7,
-0x2cb00,
-0x1aab00,
-0xebb8f,
-0x2db00,
-0xea02a,
-0xea1f7,
-0x18ab00,
-0xebbfd,
-0x2cb00,
-0x4abf4,
-0xebbfe,
-0x1bbf4,
-0xeacfd,
-0xeabff,
-0x3aecbb,
-0xea02f,
-0xea1f7,
-0x18ab00,
-0xebbbf,
-0x2cb00,
-0xeacf5,
-0xeabff,
-0x3aecbb,
-0xea032,
-0xea1f7,
-0x18ab00,
-0xebbf7,
-0x2cb00,
-0x3fffff,
-0x3fffff,
-0x3fffff,
-0x3fffff,
-0x3fffff,
-0x18ab00,
-0xe2b08,
-0x2cb00,
-0xfe75,
-0x16a901,
-0x16a801,
-0x23ffff,
-0x4af75,
-0xe1ffe,
-0x32f46a,
-0xea01b,
-0xea1f7,
-0x18ab00,
-0xe2b08,
-0x2cb00,
-0xea02a,
-0xea1f7,
-0x18ab00,
-0xe2b02,
-0x2cb00,
-0xea029,
-0xea1f7,
-0x18ab00,
-0xe2bf0,
-0x4bb30,
-0x2cb00,
-0xea02f,
-0xea1f7,
-0x18ab00,
-0xe2b40,
-0x2cb00,
-0x4abf4,
-0xe2b01,
-0x1bbf4,
-0xff75,
-0x23ffff,
-0xea01d,
-0xea1f7,
-0x18ab00,
-0xebbfc,
-0x2cb00,
-0x4abf4,
-0xebbad,
-0x1bbf4,
-0xea067,
-0xea1f7,
-0x18ab00,
-0xebbfd,
-0x2cb00,
-0x4abf6,
-0xebbfe,
-0x1bbf6,
-0x4abab,
-0xebbfb,
-0x1bbab,
-0x4abf5,
-0xebbdf,
-0x1bbf5,
-0xea066,
-0xea1f7,
-0x18ab00,
-0xebb7f,
-0x2cb00,
-0xea01a,
-0xea1f7,
-0x18ab00,
-0xebb7f,
-0x2cb00,
-0x23ffff,
-0x23ffff,
-0x4abf6,
-0xebbdd,
-0x1bbf6,
-0xea04c,
-0xea1f9,
-0x18ab00,
-0xebbdf,
-0x2cb00,
-0x18ab00,
-0xebbfe,
-0x2cb00,
-0x4abf4,
-0xebbbf,
-0x1bbf4,
-0xea057,
-0xea1f9,
-0x18ab00,
-0xebbfe,
-0x2cb00,
-0xeaff1,
-0x1bf72,
-0xeafe8,
-0x1bf71,
-0x4abe4,
-0xebbe3,
-0x1bbe4,
-0x23ffff,
-0x4acf5,
-0xebcfd,
-0x1bcf5,
-0xea0fb,
-0xea1f8,
-0x18ac00,
-0xe2c20,
-0x2cc00,
-0xea0fa,
-0xea1f8,
-0x18ac00,
-0xe2c03,
-0x2cc00,
-0xe1bff,
-0x36f418,
-0xeaff1,
-0x1bf72,
-0xeaf05,
-0x1bf71,
-0x33f411,
-0x18ab00,
-0xebbfe,
-0x2cb00,
-0xeaff1,
-0x1bf72,
-0xeaf8b,
-0x1bf71,
-0xea0ff,
-0xea1f8,
-0x18ab00,
-0xebbfe,
-0x2cb00,
-0x4abe4,
-0xebbf7,
-0x1bbe4,
-0x23ffff,
-0x375ff,
-0x378ff,
-0x379ff,
-0xcafb5,
-0x4af56,
-0xe1ffb,
-0x36f3ca,
-0x4af3c,
-0x1bfae,
-0xea1fd,
-0xea07f,
-0x4af3c,
-0x2cf01,
-0x4af3c,
-0x2cf02,
-0x3afb07,
-0xea025,
-0xea1f7,
-0x18ab00,
-0xebbbf,
-0x2cb00,
-0xe15ff,
-0x32f3d1,
-0x4af77,
-0xe1ffe,
-0x36f3d6,
-0xea04c,
-0xea1f9,
-0x18ab00,
-0xe2b80,
-0x2cb00,
-0x3af469,
-0x4af37,
-0x36f3d8,
-0x4ab76,
-0x3af42c,
-0xfe34,
-0x4af77,
-0xe1ffd,
-0x32f3c8,
-0xeaffe,
-0x1bf8d,
-0x4abe3,
-0xe2b02,
-0x1bbe3,
-0xeaffd,
-0x1bfe5,
-0x33f3c8,
-0x3af447,
-0x33f3e4,
-0xea04c,
-0xea1f9,
-0x18ab00,
-0xebb7f,
-0x33f3ea,
-0x4ab96,
-0xe2b03,
-0xebbfd,
-0x1bb96,
-0xeabfe,
-0x3af4be,
-0x33f3f1,
-0x3af670,
-0x33f401,
-0x4abde,
-0xe2bf0,
-0xebbaf,
-0x1bbde,
-0xeacaf,
-0xeabff,
-0x16a901,
-0x16a801,
-0x16a501,
-0x23ffff,
-0x378ff,
-0x379ff,
-0x4abe4,
-0xe2b1c,
-0x1bbe4,
-0xea066,
-0xea1f7,
-0x18ab00,
-0xe2b80,
-0x2cb00,
-0xea067,
-0xea1f7,
-0x18ab00,
-0xe2b02,
-0x2cb00,
-0xea01a,
-0xea1f7,
-0x18ab00,
-0xe2b80,
-0x2cb00,
-0x4af37,
-0x36f390,
-0xea0fb,
-0xea1f8,
-0x18ab00,
-0xebbdf,
-0x2cb00,
-0xea0ff,
-0xea1f8,
-0x18ab00,
-0xe2b01,
-0x2cb00,
-0xea0fa,
-0xea1f8,
-0x18ab00,
-0xebbfd,
-0x2cb00,
-0xea0f8,
-0xea1f8,
-0xeaf00,
-0x2cf00,
-0xeaf00,
-0x2cf01,
-0xeaf00,
-0x2cf02,
-0x33f36b,
-0xea057,
-0xea1f9,
-0x18ab00,
-0xe2b01,
-0x2cb00,
-0xea036,
-0xea1f9,
-0x18ab00,
-0xe2bfc,
-0xe1bff,
-0x36f36b,
-0xea24c,
-0xea3f9,
-0x1aab00,
-0xe2b80,
-0x2db00,
-0xea0b3,
-0xea1f6,
-0xeaffd,
-0x2cf00,
-0xeafe8,
-0x2cf01,
-0xeaff1,
-0x1bfe1,
-0x4abe4,
-0xebb9f,
-0x1bbe4,
-0x1aab00,
-0xebbfd,
-0x2db00,
-0xe2a03,
-0xbdfff,
-0x4abe4,
-0xe2b20,
-0x1bbe4,
-0xeaf9f,
-0x1bfe5,
-0x3fffff,
-0x4abf6,
-0xe2b23,
-0x1bbf6,
-0x4abf5,
-0xe2b22,
-0x1bbf5,
-0x4abf4,
-0xe2b52,
-0x1bbf4,
-0x3af486,
-0xea01d,
-0xea1f7,
-0x18ab00,
-0xe2b03,
-0x2cb00,
-0xea025,
-0xea1f7,
-0x18ab00,
-0xe2b40,
-0x2cb00,
-0xea02a,
-0xea1f7,
-0x18ab00,
-0xe2b02,
-0x2cb00,
-0x4ab96,
-0xe2b03,
-0x1bb96,
-0xeafe3,
-0x1bfe5,
-0x4abde,
-0xe2bf0,
-0xebbbf,
-0x1bbde,
-0xeacbf,
-0xeabff,
-0x16a901,
-0x16a801,
-0x23ffff,
-0x374ff,
-0x378ff,
-0x379ff,
-0xcafb4,
-0x3af3be,
-0xcaf4b,
-0xeacfe,
-0x3aeea9,
-0xeabff,
-0x16a901,
-0x16a801,
-0x16a401,
-0x23ffff,
-0x378ff,
-0x379ff,
-0x3aef09,
-0xea0fb,
-0xea1f8,
-0x18ab00,
-0xe2b20,
-0x2cb00,
-0x4ab96,
-0xe2b03,
-0xebbfd,
-0x1bb96,
-0xea025,
-0xea1f7,
-0x18ab00,
-0xe2b80,
-0x2cb00,
-0xea226,
-0xea3f7,
-0x1aab00,
-0xe2b01,
-0x2db00,
-0x18ab00,
-0xebbbf,
-0x2cb00,
-0xeabfe,
-0x3af4be,
-0x3af469,
-0x4abf4,
-0xe2b08,
-0x1bbf4,
-0x4abcf,
-0xe2b80,
-0x1bbcf,
-0x4abde,
-0xe2bf0,
-0xebbaf,
-0x1bbde,
-0xeacfd,
-0xeabff,
-0x16a901,
-0x16a801,
-0x23ffff,
-0x378ff,
-0x379ff,
-0x4ab96,
-0xe2b03,
-0xebbfe,
-0x1bb96,
-0x3af486,
-0xea01a,
-0xea1f7,
-0x18ab00,
-0xe2b80,
-0x2cb00,
-0xea025,
-0xea1f7,
-0x18ab00,
-0xe2b40,
-0x2cb00,
-0x18ab00,
-0xebb7f,
-0x2cb00,
-0xea026,
-0xea1f7,
-0x18ab00,
-0xebbfe,
-0x2cb00,
-0x4abf4,
-0xe2b52,
-0x1bbf4,
-0x4abf5,
-0xe2b20,
-0x1bbf5,
-0x4abf6,
-0xe2b01,
-0x1bbf6,
-0xea01d,
-0xea1f7,
-0x18ab00,
-0xe2b03,
-0x2cb00,
-0xea067,
-0xea1f7,
-0x18ab00,
-0xe2b02,
-0x2cb00,
-0xea066,
-0xea1f7,
-0x18ab00,
-0xe2b80,
-0x2cb00,
-0xeacf0,
-0xeabff,
-0x3aecbb,
-0x3aefcc,
-0x4abf4,
-0xebbf7,
-0x1bbf4,
-0x4abcf,
-0xebb7f,
-0x1bbcf,
-0x4abde,
-0xe2bf0,
-0xebb9f,
-0x1bbde,
-0xeacfd,
-0xeabff,
-0x16a901,
-0x16a801,
-0x23ffff,
-0x378ff,
-0x379ff,
-0xeafff,
-0x1bf8d,
-0x4abe3,
-0xebbfd,
-0x1bbe3,
-0xeaffd,
-0x1bfe5,
-0xfd6d,
-0xf96e,
-0x3af52a,
-0xff74,
-0x4af48,
-0x32f2b4,
-0x4af49,
-0x32f2b4,
-0x4af4a,
-0x36f2a7,
-0xeabff,
-0xeac4a,
-0x3afbbc,
-0xeaffe,
-0x1bf8d,
-0x4abe3,
-0xe2b02,
-0x1bbe3,
-0xeaffd,
-0x1bfe5,
-0xeabfa,
-0xeacfd,
-0x3af84d,
-0x16a901,
-0x16a801,
-0x23ffff,
-0x378ff,
-0x379ff,
-0x4af6c,
-0xebffd,
-0x1bf6c,
-0xfb6e,
-0x4af77,
-0xe1ffe,
-0x36f28b,
-0x4af51,
-0xe1f00,
-0x36f293,
-0x4af56,
-0xe1ffe,
-0x30f293,
-0x4af74,
-0x36f28e,
-0x3af52a,
-0xff72,
-0xff71,
-0xff74,
-0x33f284,
-0xeabfc,
-0x3af281,
-0x33f284,
-0x4af37,
-0x32f284,
-0xea057,
-0xea1f9,
-0x18ab00,
-0xebbfd,
-0x2cb00,
-0x16a901,
-0x16a801,
-0x23ffff,
-0x375ff,
-0x378ff,
-0x379ff,
-0xcafb5,
-0xfe74,
-0x4af52,
-0x32f26e,
-0x4af53,
-0x32f26e,
-0x4af54,
-0x32f26e,
-0xe1bfc,
-0x36f271,
-0x3aee02,
-0x3aefdb,
-0x33f23d,
-0x3af3be,
-0x3af239,
-0x33f23d,
-0xeabff,
-0xeac54,
-0x3afbbc,
-0xeaffe,
-0x1bf8d,
-0x4abe3,
-0xe2b02,
-0x1bbe3,
-0xeaffd,
-0x1bfe5,
-0xe15fc,
-0x36f243,
-0xeafef,
-0x1bf72,
-0xeafdb,
-0x1bf71,
-0x3aee02,
-0x4af51,
-0xe1ffb,
-0x36f23d,
-0x4af51,
-0xe1ffc,
-0x36f246,
-0xeabff,
-0x3af6c7,
-0x4af51,
-0xe1ffd,
-0x36f23d,
-0xea076,
-0xea1fa,
-0x4af6c,
-0x2cf00,
-0xea077,
-0xea1fa,
-0x4af6d,
-0x2cf00,
-0xeabfa,
-0xcaf5c,
-0x3af84d,
-0x33f23d,
-0xeabfe,
-0x3af6c7,
-0x33f23d,
-0xeaff2,
-0x1bf72,
-0xeaf39,
-0x1bf71,
-0x3af3be,
-0x33f25d,
-0x16a901,
-0x16a801,
-0x16a501,
-0x23ffff,
-0x378ff,
-0x379ff,
-0xeaffd,
-0x1bfe5,
-0xeafff,
-0x1bf8d,
-0x4abe3,
-0xebbfd,
-0x1bbe3,
-0xeabff,
-0xeacff,
-0xead50,
-0x3af05e,
-0x16a901,
-0x16a801,
-0x23ffff,
-0x378ff,
-0x379ff,
-0x16aff9,
-0xeafff,
-0x2ff03,
-0x2ff04,
-0x2ff05,
-0x2ff06,
-0x4af77,
-0xe1ffd,
-0x32f1ec,
-0x4af34,
-0xe1ffe,
-0x36f219,
-0xff34,
-0x33f1ec,
-0xeafff,
-0x1bf8d,
-0x4abe3,
-0xebbfd,
-0x1bbe3,
-0x4af48,
-0x32f20e,
-0x4af49,
-0x32f20e,
-0x4af4a,
-0x36f1f4,
-0xeafff,
-0x2ff03,
-0x4af4a,
-0x2ff04,
-0x4af49,
-0x2ff05,
-0x4af48,
-0x2ff06,
-0xeadff,
-0x4ae4d,
-0x4a94c,
-0x4a84b,
-0xcafdb,
-0xcafec,
-0xcaf9d,
-0xcaf8e,
-0x1ece06,
-0x1edd05,
-0x1edc04,
-0x1edb03,
-0x2fe02,
-0x2fd01,
-0x2fc00,
-0xcaf7b,
-0xcaf6c,
-0x3afbbc,
-0xeaffe,
-0x1bf8d,
-0x4abe3,
-0xe2b02,
-0x1bbe3,
-0xeaffd,
-0x1bfe5,
-0x33f21b,
-0x16af07,
-0x16a901,
-0x16a801,
-0x23ffff,
-0x378ff,
-0x379ff,
-0x4abe5,
-0xe2bfd,
-0xe1bff,
-0x32f18f,
-0x4abe5,
-0xe2bfb,
-0xe1bff,
-0x32f194,
-0x4abe5,
-0xe2bf7,
-0xe1bff,
-0x36f1d1,
-0xeafff,
-0x1bf8d,
-0x4abe3,
-0xebbfd,
-0x1bbe3,
-0xeaff5,
-0x1bfe5,
-0xf76c,
-0x33f18e,
-0x4abe5,
-0xe2bef,
-0xe1bff,
-0x36f18e,
-0xeafef,
-0x1bfe5,
-0x51f46,
-0x1bf46,
-0x55f47,
-0x1bf47,
-0xea033,
-0xea1f9,
-0x18ab00,
-0x32f19c,
-0xea23a,
-0xea3f9,
-0xea1fd,
-0xea07f,
-0x1aaf00,
-0x2cf00,
-0xea1fd,
-0xea07f,
-0x18af02,
-0x2cf01,
-0x4afac,
-0x2cf02,
-0xea039,
-0xea1f9,
-0x18ab00,
-0xe2bef,
-0xe1bff,
-0x36f1ac,
-0xbf6c,
-0x51f44,
-0x1bf44,
-0x55f45,
-0x1bf45,
-0x18ab00,
-0xe2bf7,
-0xe1bff,
-0x36f1a3,
-0x51f42,
-0x1bf42,
-0x55f43,
-0x1bf43,
-0xbf6c,
-0x18ab00,
-0xe2b5b,
-0xe1bff,
-0x36f19e,
-0xbf6c,
-0x3af2a4,
-0x33f18e,
-0xea03a,
-0xea1f9,
-0x18ab00,
-0xea1fd,
-0xea07f,
-0xdbfbf,
-0x2cf00,
-0x33f1bd,
-0xeaffb,
-0x1bfe5,
-0xfb6c,
-0x3af229,
-0x33f18e,
-0x3af2c7,
-0x16a901,
-0x16a801,
-0x23ffff,
-0x378ff,
-0x379ff,
-0x16affd,
-0x4abe5,
-0xe2bfd,
-0xe1bff,
-0x32f10a,
-0xeaff7,
-0x1bfe5,
-0xea0f8,
-0xea1f8,
-0x18af00,
-0x2ff00,
-0x18af01,
-0x2ff01,
-0x18af02,
-0x2ff02,
-0x1eab00,
-0xe2bbf,
-0xe1bff,
-0x32f10d,
-0x1eab01,
-0xe2bfb,
-0xe1bff,
-0x36f16a,
-0xeafff,
-0x1bf8d,
-0x4abe3,
-0xebbfd,
-0x1bbe3,
-0xeaffd,
-0x1bfe5,
-0xef6c,
-0x1eab01,
-0xe2bef,
-0xe1bff,
-0x32f110,
-0x1eab01,
-0xe2bf7,
-0xe1bff,
-0x36f161,
-0xfb6d,
-0x1eab00,
-0xe2bdf,
-0xe1bff,
-0x36f14f,
-0xeafff,
-0x1bf8d,
-0x4abe3,
-0xebbfd,
-0x1bbe3,
-0xea095,
-0xea1f8,
-0x18ab00,
-0xe2b9f,
-0xe1bbf,
-0x36f117,
-0x3af52a,
-0xff72,
-0xff71,
-0x1eab02,
-0xe2bbf,
-0xe1bff,
-0x36f125,
-0xea3fd,
-0xea27c,
-0xea091,
-0xea1f8,
-0x18af00,
-0x2df00,
-0xea090,
-0xea1f8,
-0x18af00,
-0x2df01,
-0xea08e,
-0xea1f8,
-0x18af00,
-0x2df02,
-0x1eab01,
-0xe2be7,
-0xe1bff,
-0x32f125,
-0x1eab01,
-0xe2bbf,
-0xe1bff,
-0x36f11c,
-0xbf6c,
-0x51f44,
-0x1bf44,
-0x55f45,
-0x1bf45,
-0xea1fd,
-0xea07f,
-0xea28c,
-0xea3f8,
-0x1aaf00,
-0x2cf00,
-0x18af02,
-0x2cf01,
-0x4afac,
-0x2cf02,
-0x3af2a4,
-0xea0f8,
-0xea1f8,
-0xeaf00,
-0x2cf00,
-0xeaf00,
-0x2cf01,
-0xeaf00,
-0x2cf02,
-0x33f109,
-0x51f46,
-0x1bf46,
-0x55f47,
-0x1bf47,
-0x33f130,
-0x3af30b,
-0x1bc6e,
-0xeafec,
-0x1bf72,
-0xeafe6,
-0x1bf71,
-0x33f14f,
-0xf76d,
-0x3af2a4,
-0x33f166,
-0xfb6c,
-0x3af229,
-0x33f176,
-0x3af2c7,
-0x16af03,
-0x16a901,
-0x16a801,
-0x23ffff,
-0x375ff,
-0x378ff,
-0x379ff,
-0x16affd,
-0xea0f8,
-0xea1f8,
-0x18af00,
-0x2ff00,
-0x18af01,
-0x2ff01,
-0x18af02,
-0x2ff02,
-0xe2f7f,
-0xcaffb,
-0xea5fe,
-0xeaff7,
-0x1bfe5,
-0x7f6c,
-0xe1bff,
-0x36f0ee,
-0x4af6d,
-0xebffe,
-0x1bf6d,
-0x4af3b,
-0xe1fef,
-0x36f0cc,
-0x4af3b,
-0xe1ffe,
-0x36f0e2,
-0xe15ff,
-0x36f0c4,
-0x3af52a,
-0xff72,
-0xff71,
-0x33f0c4,
-0xe1bff,
-0x36f0e8,
-0xeabff,
-0xeac3a,
-0x3af583,
-0x4af77,
-0xe1ffd,
-0x36f0d4,
-0xea5ff,
-0xeaff1,
-0x1bf72,
-0xeaf8b,
-0x1bf71,
-0x33f0e8,
-0xeaffe,
-0x1bf8d,
-0x4abe3,
-0xe2b02,
-0x1bbe3,
-0xeaffd,
-0x1bfe5,
-0x33f0da,
-0xe1bff,
-0x32f0e8,
-0xea5ff,
-0xeabff,
-0xeacff,
-0xead3a,
-0x3af05e,
-0x33f0e8,
-0xea0f8,
-0xea1f8,
-0xeaf00,
-0x2cf00,
-0xeaf00,
-0x2cf01,
-0xeaf00,
-0x2cf02,
-0x16af03,
-0x16a901,
-0x16a801,
-0x16a501,
-0x23ffff,
-0x378ff,
-0x379ff,
-0x16affd,
-0xeaff7,
-0x1bfe5,
-0xea0f8,
-0xea1f8,
-0x18af00,
-0x2ff00,
-0x18af01,
-0x2ff01,
-0x18af02,
-0x2ff02,
-0xe2fdf,
-0xcaffb,
-0xe1bff,
-0x36f0a5,
-0xdf6d,
-0x1eab02,
-0xe2bef,
-0xe1bff,
-0x36f0a0,
-0xbf6d,
-0x1eab02,
-0xe2bfe,
-0xe1bff,
-0x36f08d,
-0xea095,
-0xea1f8,
-0x18ab00,
-0xe2b9f,
-0xe1bbf,
-0x36f092,
-0x3af52a,
-0xff72,
-0xff71,
-0x33f08d,
-0x3af30b,
-0xeafed,
-0x1bf72,
-0xeaf19,
-0x1bf71,
-0xea0f8,
-0xea1f8,
-0xeaf00,
-0x2cf00,
-0xeaf00,
-0x2cf01,
-0xeaf00,
-0x2cf02,
-0x16af03,
-0x16a901,
-0x16a801,
-0x23ffff,
-0x4af40,
-0xe1fdf,
-0x36f064,
-0x4af40,
-0xe1fcf,
-0x36f069,
-0x4af40,
-0xe1fbf,
-0x36f070,
-0xdf40,
-0xeaff0,
-0x1bf33,
-0xeaf1f,
-0x1bf32,
-0xeacf7,
-0xeabff,
-0x33f05f,
-0xeaff6,
-0x1bf33,
-0xeaff5,
-0x1bf32,
-0xeacfd,
-0xeabff,
-0x33f05f,
-0xeaff7,
-0x1bf33,
-0xeafff,
-0x1bf32,
-0x33f06c,
-0xeaff0,
-0x1bf33,
-0xeaf1f,
-0x1bf32,
-0x33f06c,
-0x23ffff,
-0x374ff,
-0x375ff,
-0x378ff,
-0x379ff,
-0xcafb4,
-0xcafd0,
-0xcafc1,
-0x4abde,
-0xe2f8f,
-0xcaff5,
-0xcbdcf,
-0x36f04c,
-0x18af02,
-0x32f029,
-0x18af01,
-0x32f029,
-0x18af00,
-0x32f029,
-0xff77,
-0xe15df,
-0x36f02c,
-0xe15cf,
-0x36f02f,
-0xe15bf,
-0x36f033,
-0xe15af,
-0x36f03c,
-0xeacfd,
-0xeabff,
-0xe159f,
-0x36f024,
-0xeacf5,
-0xeabff,
-0x33f024,
-0xeafff,
-0x1bf8d,
-0x4abe3,
-0xebbfd,
-0x1bbe3,
-0xcaf4b,
-0x3af343,
-0xcafc5,
-0x33f043,
-0xcaf4b,
-0xeacfe,
-0x3aeea9,
-0x33f035,
-0xcaf4b,
-0x3af016,
-0x33f035,
-0x3af7ac,
-0xcafc5,
-0x33f049,
-0xfd77,
-0xcaf1b,
-0xcaf0c,
-0x3afbbc,
-0x33f04b,
-0x16a901,
-0x16a801,
-0x16a501,
-0x16a401,
-0x23ffff,
-0x378ff,
-0x379ff,
-0x3aee02,
-0xeabff,
-0x3af6c7,
-0xeabff,
-0x16a901,
-0x16a801,
-0x23ffff,
-0x375ff,
-0x378ff,
-0x379ff,
-0xcafb5,
-0xeabfe,
-0xeacff,
-0x3af624,
-0xeaecf,
-0xeadff,
-0xe1cbf,
-0x32f006,
-0xcaf5b,
-0xeacff,
-0x3aeea9,
-0xcafce,
-0xeadff,
-0xcafdb,
-0xcafec,
-0x16a901,
-0x16a801,
-0x16a501,
-0x23ffff,
-0x378ff,
-0x379ff,
-0xeaffd,
-0x1bfe5,
-0xfd6d,
-0xf96e,
-0x3af01f,
-0xff74,
-0xff72,
-0xff71,
-0x16a901,
-0x16a801,
-0x23ffff,
-0x378ff,
-0x379ff,
-0xfe6c,
-0xf36e,
-0x4af51,
-0xe1f00,
-0x36efe7,
-0x4af56,
-0xe1ffe,
-0x30efe7,
-0x4af74,
-0x36efe0,
-0x4a832,
-0x4a933,
-0x2affff,
-0xff72,
-0xff71,
-0xff74,
-0x33efde,
-0xeabfb,
-0x3af281,
-0x16a901,
-0x16a801,
-0x23ffff,
-0x378ff,
-0x379ff,
-0xeaffd,
-0x1bfe5,
-0xeafff,
-0x1bf8d,
-0x4abe3,
-0xebbfd,
-0x1bbe3,
-0xeabff,
-0xeac50,
-0x3af554,
-0x16a901,
-0x16a801,
-0x23ffff,
-0x374ff,
-0x375ff,
-0x378ff,
-0x379ff,
-0x4abf5,
-0xebbfb,
-0x1bbf5,
-0xea01e,
-0xea1f7,
-0x18ab00,
-0xebbfd,
-0x2cb00,
-0x4af56,
-0xe1ffd,
-0x36ef55,
-0x4ab9f,
-0xebbfd,
-0x1bb9f,
-0xea026,
-0xea1f7,
-0x18ab00,
-0xebbfe,
-0x2cb00,
-0xea228,
-0xea3f7,
-0x1aab00,
-0xebbfd,
-0x2db00,
-0x4ab9f,
-0xebbfe,
-0x1bb9f,
-0xea01c,
-0xea1f7,
-0x18ab00,
-0xebbdf,
-0x2cb00,
-0x18ab00,
-0xebbbf,
-0x2cb00,
-0xea0e0,
-0xea1f6,
-0x18ab00,
-0xebbfe,
-0x2cb00,
-0xea419,
-0xea5f7,
-0x1cab00,
-0xe2bf7,
-0xe1bff,
-0x32ef95,
-0xea01a,
-0xea1f7,
-0x18ab00,
-0xebbfe,
-0x2cb00,
-0xea029,
-0xea1f7,
-0x18ab00,
-0xebbfe,
-0x2cb00,
-0x1cab00,
-0xe2bf7,
-0xe1bff,
-0x32ef5b,
-0x1aab00,
-0xebbfe,
-0x2db00,
-0xeacfb,
-0xeabff,
-0x3aecbb,
-0x4ab9d,
-0xebbfe,
-0x1bb9d,
-0x4ab9d,
-0xebbfb,
-0x1bb9d,
-0x4ab9d,
-0xe2b04,
-0x1bb9d,
-0x4ab9f,
-0xe2b02,
-0x1bb9f,
-0x4ab9f,
-0xe2b01,
-0x1bb9f,
-0xea0b3,
-0xea1f6,
-0xeaff1,
-0x2cf00,
-0xeaf8b,
-0x2cf01,
-0xeaff0,
-0x1bfe1,
-0x4abe4,
-0xebb9f,
-0x1bbe4,
-0xe2a03,
-0xbdfff,
-0x4abe4,
-0xe2b20,
-0x1bbe4,
-0x4abe5,
-0xe2bbf,
-0xe1bff,
-0x36ef5e,
-0xeafbf,
-0x1bfe5,
-0x4af70,
-0xebffe,
-0x1bf70,
-0xeafdf,
-0x1bfe5,
-0x33ef11,
-0xea027,
-0xea1f7,
-0x18ab00,
-0xebbfe,
-0x2cb00,
-0x33ef89,
-0x4ab9d,
-0xebbdf,
-0x1bb9d,
-0x4ab9f,
-0xebbfd,
-0x1bb9f,
-0xea026,
-0xea1f7,
-0x18ab00,
-0xebbfe,
-0x2cb00,
-0xea228,
-0xea3f7,
-0x1aab00,
-0xebbfd,
-0x2db00,
-0xea01c,
-0xea1f7,
-0x18ab00,
-0xebbdf,
-0x2cb00,
-0x18ab00,
-0xebbbf,
-0x2cb00,
-0xea0e0,
-0xea1f6,
-0x18ab00,
-0xebbfe,
-0x2cb00,
-0xea419,
-0xea5f7,
-0x1cab00,
-0xe2bf7,
-0xe1bff,
-0x32ef2d,
-0xea01a,
-0xea1f7,
-0x18ab00,
-0xebbfe,
-0x2cb00,
-0xea029,
-0xea1f7,
-0x18ab00,
-0xebbfe,
-0x2cb00,
-0x1cab00,
-0xe2bf7,
-0xe1bff,
-0x32ef17,
-0x1aab00,
-0xebbfe,
-0x2db00,
-0xeacfb,
-0xeabff,
-0x3aecbb,
-0x4ab9d,
-0xebbfe,
-0x1bb9d,
-0x4ab9f,
-0xe2b02,
-0x1bb9f,
-0x33ef11,
-0xea027,
-0xea1f7,
-0x18ab00,
-0xebbfe,
-0x2cb00,
-0x33ef21,
-0x4ab83,
-0xebbef,
-0x1bb83,
-0x16a901,
-0x16a801,
-0x16a501,
-0x16a401,
-0x23ffff,
-0x378ff,
-0x379ff,
-0x4ab9d,
-0xe2b20,
-0x1bb9d,
-0x4ab9d,
-0xebbfd,
-0x1bb9d,
-0x4ab9d,
-0xe2b02,
-0x1bb9d,
-0x4ab9f,
-0xebbfe,
-0x1bb9f,
-0x4af56,
-0xe1ffd,
-0x36eeda,
-0xea0b3,
-0xea1f6,
-0xeaff1,
-0x2cf00,
-0xeaf8b,
-0x2cf01,
-0xeaff0,
-0x1bfe1,
-0x4abe4,
-0xebb9f,
-0x1bbe4,
-0xe2a03,
-0xbdfff,
-0x4abe4,
-0xe2b20,
-0x1bbe4,
-0x4abe5,
-0xe2bbf,
-0xe1bff,
-0x36eedf,
-0xeafbf,
-0x1bfe5,
-0x4af70,
-0xebffe,
-0x1bf70,
-0xeafdf,
-0x1bfe5,
-0xeacfd,
-0xeabff,
-0x3aecbb,
-0xeafff,
-0x1bf9d,
-0xea01c,
-0xea1f7,
-0x18ab00,
-0xe2b60,
-0x2cb00,
-0xea028,
-0xea1f7,
-0x18ab00,
-0xe2b03,
-0x2cb00,
-0xea029,
-0xea1f7,
-0x18ab00,
-0xe2b01,
-0x2cb00,
-0xea01e,
-0xea1f7,
-0x18ab00,
-0xe2b02,
-0x2cb00,
-0xea027,
-0xea1f7,
-0x18ab00,
-0xe2b01,
-0x2cb00,
-0xea01a,
-0xea1f7,
-0x18ab00,
-0xe2b01,
-0x2cb00,
-0xea0e0,
-0xea1f6,
-0x18ab00,
-0xe2b01,
-0x2cb00,
-0x4ab9f,
-0xe2b01,
-0x1bb9f,
-0x4ab83,
-0xe2b10,
-0x1bb83,
-0x4abf5,
-0xe2b04,
-0x1bbf5,
-0x16a901,
-0x16a801,
-0x23ffff,
-0x375ff,
-0x378ff,
-0x379ff,
-0xcafb5,
-0x4af3d,
-0x1bfaf,
-0x4ab96,
-0xe2b03,
-0xebbfe,
-0x1bb96,
-0xea019,
-0xea1f7,
-0x18ab00,
-0xe2bf7,
-0xe1bff,
-0x32ee94,
-0xeabff,
-0xe2cfe,
-0xeabff,
-0xcbcbf,
-0x32ee17,
-0xea025,
-0xea1f7,
-0x18ab00,
-0xebb7f,
-0x2cb00,
-0x3aefcc,
-0x3afb07,
-0x4abf4,
-0xebbf7,
-0x1bbf4,
-0x4af37,
-0x36ee4c,
-0x4abf5,
-0xebbfd,
-0x1bbf5,
-0xea2fa,
-0xea3f8,
-0x1aab00,
-0xe2b03,
-0x2db00,
-0xea0ff,
-0xea1f8,
-0x18ab00,
-0xe2b01,
-0x2cb00,
-0x1aab00,
-0xebbfd,
-0x2db00,
-0x4af56,
-0xe1ffb,
-0x36ee54,
-0x1aab00,
-0xe2b01,
-0x2db00,
-0xeafed,
-0x1bf72,
-0xeaf3e,
-0x1bf71,
-0xef5fe,
-0x1bf73,
-0x4abcf,
-0xebb7f,
-0x1bbcf,
-0xe15fd,
-0x36ee62,
-0xea0ff,
-0xea1f8,
-0x18ab00,
-0xebbfe,
-0x2cb00,
-0x4abe4,
-0xebbf7,
-0x1bbe4,
-0x4af77,
-0xe1ffd,
-0x32ee15,
-0xeaffe,
-0x1bf8d,
-0x4abe3,
-0xe2b02,
-0x1bbe3,
-0xeaffd,
-0x1bfe5,
-0x33ee15,
-0x1aab00,
-0xebbfe,
-0x2db00,
-0xeafed,
-0x1bf72,
-0xeaf19,
-0x1bf71,
-0x33ee6e,
-0xe15fe,
-0x36ee1c,
-0x4af41,
-0xe1ffe,
-0x36ee1c,
-0xe15fd,
-0x36ee2a,
-0xea04a,
-0xea1f9,
-0x18ab00,
-0xe2b02,
-0x2cb00,
-0x4abf6,
-0xebbdf,
-0x1bbf6,
-0xea04c,
-0xea1f9,
-0x18ab00,
-0xe2b20,
-0x2cb00,
-0x18ab00,
-0xebbfe,
-0x2cb00,
-0x4abcf,
-0xebb7f,
-0x1bbcf,
-0x4abe4,
-0xebbef,
-0x1bbe4,
-0xeafed,
-0x1bf72,
-0xeaf5f,
-0x1bf71,
-0x33ee5f,
-0xea04a,
-0xea1f9,
-0x18ab00,
-0xebbfd,
-0x2cb00,
-0xea05b,
-0xea1f9,
-0xeafff,
-0x2cf00,
-0xeafff,
-0x2cf01,
-0xeafff,
-0x2cf02,
-0x33ee40,
-0xea04a,
-0xea1f9,
-0x18ab00,
-0xebbfd,
-0x33ee41,
-0x3af670,
-0x33ee94,
-0x4abde,
-0xe2bf0,
-0xebb9f,
-0x1bbde,
-0xeac9f,
-0xeabff,
-0x16a901,
-0x16a801,
-0x16a501,
-0x23ffff,
-0x378ff,
-0x379ff,
-0x3aee02,
-0xeabfe,
-0x3af408,
-0xeabff,
-0x16a901,
-0x16a801,
-0x23ffff,
-0x378ff,
-0x379ff,
-0x4abe4,
-0xe2b18,
-0x1bbe4,
-0x3aef09,
-0x4af37,
-0x32edd3,
-0xea036,
-0xea1f9,
-0x18ab00,
-0xe2bfc,
-0xe1bff,
-0x36eddd,
-0xea0b3,
-0xea1f6,
-0xeafdf,
-0x2cf00,
-0xeaf2f,
-0x2cf01,
-0xeaff1,
-0x1bfe1,
-0x4abe4,
-0xebb9f,
-0x1bbe4,
-0xea04c,
-0xea1f9,
-0x18ab00,
-0xebbfd,
-0x2cb00,
-0xe2a03,
-0xbdfff,
-0x4abe4,
-0xe2b20,
-0x1bbe4,
-0xeaf9f,
-0x1bfe5,
-0x4abcf,
-0xe2b80,
-0x1bbcf,
-0x4abf6,
-0xe2b20,
-0x1bbf6,
-0x4abf4,
-0xe2b08,
-0x1bbf4,
-0x33edbb,
-0xea2f8,
-0xea3f8,
-0xeaf00,
-0x2df00,
-0xeaf00,
-0x2df01,
-0xeaf00,
-0x2df02,
-0x4abcf,
-0xe2b80,
-0x1bbcf,
-0xea0ff,
-0xea1f8,
-0x18ab00,
-0xe2b01,
-0x2cb00,
-0x4abf5,
-0xe2b02,
-0x1bbf5,
-0x4abf4,
-0xe2b08,
-0x1bbf4,
-0xeaffb,
-0x2df02,
-0x4ab96,
-0xe2b03,
-0x1bb96,
-0xea026,
-0xea1f7,
-0x18ab00,
-0xe2b01,
-0x2cb00,
-0xea025,
-0xea1f7,
-0x18ab00,
-0xe2b80,
-0xebbbf,
-0x2cb00,
-0xeafe7,
-0x1bfe5,
-0x4abde,
-0xe2bf0,
-0xebbbf,
-0x1bbde,
-0xeacbf,
-0xeabff,
-0x16a901,
-0x16a801,
-0x23ffff,
-0xcafbd,
-0xea019,
-0xea1f7,
-0x18ab00,
-0xe2bf7,
-0xe1bff,
-0x32ed98,
-0xecdf6,
-0xcafdb,
-0x33ed96,
-0xecdee,
-0xcafdb,
-0xe2be0,
-0x1bb9c,
-0xeecdf,
-0xcaffe,
-0x4ab9c,
-0xcbbeb,
-0x1bb9c,
-0x23ffff,
-0xcafc2,
-0xcafb3,
-0xea028,
-0xea1f7,
-0x18ad00,
-0xe2d3c,
-0x1aaf00,
-0xeeffb,
-0xcaffc,
-0xcbdcd,
-0x2cd00,
-0xea027,
-0xea1f7,
-0x18ad00,
-0xe2de0,
-0x1aaf01,
-0xeefdf,
-0xcaffc,
-0xcbdcd,
-0x2cd00,
-0xea019,
-0xea1f7,
-0x18ad00,
-0xe2d10,
-0x1aaf03,
-0xeefef,
-0xcaffc,
-0xcbdcd,
-0x2cd00,
-0x1aaf02,
-0x36ed67,
-0x18ab00,
-0xebbf7,
-0x2cb00,
-0xea018,
-0xea1f7,
-0xeaff5,
-0x2cf00,
-0x33ed60,
-0x18ab00,
-0xe2b08,
-0x2cb00,
-0xea018,
-0xea1f7,
-0xeafeb,
-0x2cf00,
-0x23ffff,
-0x378ff,
-0x379ff,
-0xeafff,
-0x1bf8d,
-0x4abe3,
-0xebbfd,
-0x1bbe3,
-0x4abe5,
-0xe2bfd,
-0xe1bff,
-0x36ed47,
-0x4af41,
-0xe1ffe,
-0x36ed4f,
-0x3af000,
-0x33ed41,
-0xea04a,
-0xea1f9,
-0x18ab00,
-0xe2b02,
-0x2cb00,
-0xeaffd,
-0x1bfe5,
-0x33ed41,
-0xeafef,
-0x1bfe5,
-0x4abe4,
-0xe2b10,
-0x1bbe4,
-0x3aeff3,
-0x16a901,
-0x16a801,
-0x23ffff,
-0x378ff,
-0x379ff,
-0x16affd,
-0xeafff,
-0x1bf8d,
-0x4abe3,
-0xebbfd,
-0x1bbe3,
-0x4abe5,
-0xe2bfd,
-0xe1bff,
-0x32ed1e,
-0xeaff7,
-0x1bfe5,
-0xea0f8,
-0xea1f8,
-0x18af00,
-0x2ff00,
-0x18af01,
-0x2ff01,
-0x18af02,
-0x2ff02,
-0xe2ffb,
-0xcaffb,
-0xe1bff,
-0x36ed1d,
-0xeaffb,
-0x2cf02,
-0x4af73,
-0x32ed1d,
-0x3aeff3,
-0x33ed1d,
-0x3af000,
-0x16af03,
-0x16a901,
-0x16a801,
-0x23ffff,
-0x374ff,
-0x375ff,
-0x378ff,
-0x379ff,
-0x16affd,
-0xeafff,
-0x1bf8d,
-0x4abe3,
-0xebbfd,
-0x1bbe3,
-0x4abe5,
-0xe2bfd,
-0xe1bff,
-0x32eced,
-0xeaff7,
-0x1bfe5,
-0xea4f8,
-0xea5f8,
-0x1caf00,
-0x2ff00,
-0x1caf01,
-0x2ff01,
-0x1caf02,
-0x2ff02,
-0xe2ffb,
-0xcaffb,
-0xe1bff,
-0x32ecf6,
-0xeaf00,
-0x2ef00,
-0xeaf00,
-0x2ef01,
-0xeaf08,
-0x2ef02,
-0x33ecec,
-0xeaffb,
-0x2ef02,
-0x3af336,
-0x1bc6e,
-0xeaff0,
-0x1bf72,
-0xeafb7,
-0x1bf71,
-0x33ecfd,
-0x3af000,
-0x16af03,
-0x16a901,
-0x16a801,
-0x16a501,
-0x16a401,
-0x23ffff,
-0x378ff,
-0x379ff,
-0x16affd,
-0xeaff7,
-0x1bfe5,
-0xea0f8,
-0xea1f8,
-0x18af00,
-0x2ff00,
-0x18af01,
-0x2ff01,
-0x18af02,
-0x2ff02,
-0x1eab01,
-0xe2b7f,
-0xe1bff,
-0x36ecc7,
-0xef6d,
-0x4af77,
-0xe1ffe,
-0x36eccd,
-0x3af01f,
-0xff72,
-0xff71,
-0x33ecc7,
-0x3af336,
-0x1bc6e,
-0xeaff1,
-0x1bf72,
-0xeaf8b,
-0x1bf71,
-0xea0f8,
-0xea1f8,
-0xeaf00,
-0x2cf00,
-0xeaf00,
-0x2cf01,
-0xeaf00,
-0x2cf02,
-0x16af03,
-0x16a901,
-0x16a801,
-0x23ffff,
-0xea0b3,
-0xea1f6,
-0xcafbe,
-0xeadff,
-0x2ce00,
-0x2cc01,
-0x4abe4,
-0xebbbf,
-0x1bbe4,
-0xe2a03,
-0xbdfff,
-0xeafbf,
-0x1bfe5,
-0x23ffff,
-0x378ff,
-0x379ff,
-0xea0e3,
-0xea1f6,
-0x18ab00,
-0xebbfd,
-0x2cb00,
-0x4ab83,
-0xebbdf,
-0x1bb83,
-0xeafff,
-0x1bf92,
-0x1bf91,
-0xeafcf,
-0x1bf93,
-0xeafc6,
-0x1bf94,
-0xea0c2,
-0xea1f8,
-0xeafeb,
-0x2cf00,
-0x4ab96,
-0xebbfb,
-0x1bb96,
-0xea067,
-0xea1f7,
-0x18ab00,
-0xe2b02,
-0x2cb00,
-0xea01d,
-0xea1f7,
-0x18ab00,
-0xe2b03,
-0x2cb00,
-0xea0f9,
-0xea1f8,
-0xeaf00,
-0x2cf00,
-0x4abab,
-0xebbfe,
-0x1bbab,
-0xea0ef,
-0xea1f6,
-0x18ab00,
-0xebbfa,
-0x2cb00,
-0xeadff,
-0xeae47,
-0xea057,
-0xea1fa,
-0xcafdc,
-0xeabff,
-0x2cc00,
-0x2ce01,
-0xeadff,
-0xeae56,
-0xea055,
-0xea1fa,
-0xcafdc,
-0xeabff,
-0x2cc00,
-0x2ce01,
-0xea053,
-0xea1fa,
-0xeaffa,
-0x2cf00,
-0xeaf75,
-0x2cf01,
-0xeadfd,
-0xeae7f,
-0xea051,
-0xea1fa,
-0xcafdc,
-0xeabff,
-0x2cc00,
-0x2ce01,
-0xea04b,
-0xea1fa,
-0xeaff8,
-0x2cf00,
-0xeaf8a,
-0x2cf01,
-0xeadff,
-0xeae70,
-0xea049,
-0xea1fa,
-0xcafdc,
-0xeabff,
-0x2cc00,
-0x2ce01,
-0xea047,
-0xea1fa,
-0xeaffa,
-0x2cf00,
-0xeaf73,
-0x2cf01,
-0xeadff,
-0xeae6b,
-0xcafdc,
-0xeabff,
-0x1bcdb,
-0x1beda,
-0x5531,
-0xea0e5,
-0xea1f6,
-0x18ab00,
-0xe2b40,
-0x2cb00,
-0x4ab8e,
-0xe2b01,
-0x1bb8e,
-0x4abf5,
-0xebbfe,
-0x1bbf5,
-0x4abe5,
-0xeaf00,
-0x1bfe5,
-0xea035,
-0xea1fa,
-0x18ab00,
-0xe2b7f,
-0xe1bff,
-0x32ec1a,
-0x4abf7,
-0xe2b7f,
-0xe1bff,
-0x32ec1a,
-0xea0b3,
-0xea1f6,
-0xeaffe,
-0x2cf00,
-0xeaf8d,
-0x2cf01,
-0xeafff,
-0x1bfe1,
-0x4abe4,
-0xebb9f,
-0x1bbe4,
-0xe2a03,
-0xbdfff,
-0x4abe5,
-0xe2bbf,
-0xe1bff,
-0x36ec1a,
-0x4af6f,
-0xebfdf,
-0x1bf6f,
-0xeafff,
-0x1bfe4,
-0xeaf00,
-0x1bfe5,
-0x4abde,
-0xe2bf0,
-0xebbdf,
-0x1bbde,
-0xea0b4,
-0xea1f6,
-0xeaffb,
-0x2cf00,
-0xea0b5,
-0xea1f6,
-0xeaffc,
-0x2cf00,
-0x4abe4,
-0xebbfd,
-0x1bbe4,
-0x4abe3,
-0xebbfd,
-0x1bbe3,
-0xea0e1,
-0xea1f6,
-0x18ab00,
-0xebbbf,
-0x2cb00,
-0x4ab8f,
-0xe2bfe,
-0xe1bff,
-0x36eb90,
-0x3afb9f,
-0xeafff,
-0x1bf8d,
-0x4abe3,
-0xebbfd,
-0x1bbe3,
-0x4af56,
-0xe1ffe,
-0x36eb92,
-0x4af56,
-0xe1ffb,
-0x36eb92,
-0xff37,
-0x3afb07,
-0x3afaed,
-0x3afacf,
-0x3af081,
-0xeac94,
-0xeabff,
-0x3afa7d,
-0x4af57,
-0xe1ffd,
-0x36eb96,
-0x4af57,
-0xe1ffc,
-0x36eb99,
-0x4af57,
-0xe1ffb,
-0x36eb9c,
-0xea1fd,
-0xea07f,
-0xeafff,
-0x2cf00,
-0x4afae,
-0x2cf01,
-0x4afae,
-0x2cf02,
-0x4abe4,
-0xebbfe,
-0x1bbe4,
-0xeaffe,
-0x1bfe5,
-0xea076,
-0xea1fa,
-0x4af6c,
-0x2cf00,
-0xea077,
-0xea1fa,
-0x4af6d,
-0x2cf00,
-0x4abe3,
-0xe2b01,
-0x1bbe3,
-0x4abde,
-0xe2b8e,
-0x4bb6e,
-0x1bbde,
-0x4abe5,
-0xe2bfe,
-0xe1bff,
-0x32ebb9,
-0x4abde,
-0xebb7f,
-0x1bbde,
-0xe2a03,
-0xbdfff,
-0xff6c,
-0xff6d,
-0x4abe5,
-0xe2bfe,
-0xe1bff,
-0x32eba7,
-0x4abe3,
-0xebbfe,
-0x1bbe3,
-0x4af72,
-0x4bf71,
-0x32ebab,
-0x731,
-0x33ebd1,
-0x4a871,
-0x4a972,
-0x2affff,
-0x33ebd1,
-0x4abe3,
-0xebbfe,
-0x1bbe3,
-0xeaffe,
-0x1bfe5,
-0x4abdd,
-0xe2bc0,
-0x1bb2f,
-0x3affca,
-0x1bc6e,
-0x33ebd1,
-0xfe74,
-0x3aefdb,
-0x33ebde,
-0xfe74,
-0x3af239,
-0x33ebde,
-0xeabff,
-0xeac4d,
-0x3af554,
-0x33ebde,
-0xfe37,
-0x33ebee,
-0xea0cb,
-0xea1fc,
-0xeaf3f,
-0x2cf00,
-0xff57,
-0xff55,
-0xff54,
-0xff53,
-0xff52,
-0xff50,
-0xff4f,
-0xff4e,
-0xff3f,
-0xff3e,
-0xff3a,
-0xff39,
-0xff38,
-0xdf40,
-0xeaff0,
-0x1bf33,
-0xeaf1f,
-0x1bf32,
-0x51,
-0xff56,
-0xff37,
-0xff41,
-0xff45,
-0xff44,
-0xff47,
-0xff46,
-0xff43,
-0xff42,
-0xff4d,
-0xff4c,
-0xff4b,
-0xff4a,
-0xff49,
-0xff48,
-0xff3b,
-0x4afae,
-0x1bf3c,
-0x4afaf,
-0x1bf3d,
-0x3afb07,
-0x3afaed,
-0x3afacf,
-0xea035,
-0xea1fa,
-0x18ab00,
-0xe2b7f,
-0xe1bff,
-0x32ebde,
-0x4ab8e,
-0xe2bef,
-0xe1bff,
-0x32ebde,
-0xeab00,
-0x3afe6d,
-0x1bc6e,
-0x33ebde,
-0x16a901,
-0x16a801,
-0x23ffff,
-0xe2a1c,
-0xeba1f,
-0x23ffff,
-0xe2a20,
-0xefadf,
-0x32eb4e,
-0x23ffff,
-0x37fff,
-0xcafef,
-0xb7fff,
-0x37fff,
-0x378ff,
-0x379ff,
-0x370ff,
-0x371ff,
-0x372ff,
-0x373ff,
-0x374ff,
-0x375ff,
-0x37eff,
-0x37dff,
-0x37cff,
-0x37bff,
-0xefafb,
-0x36eb37,
-0x33eb1b,
-0xefaf7,
-0x36eb34,
-0x33eb1a,
-0x33eb19,
-0xefafb,
-0x36eb2f,
-0xe2a04,
-0x33eb2a,
-0xefaf7,
-0x36eb2b,
-0xe2a08,
-0x33eb2a,
-0xe2a10,
-0x16ab01,
-0x16ac01,
-0x16ad01,
-0x16ae01,
-0x16a501,
-0x16a401,
-0x16a301,
-0x16a201,
-0x16a101,
-0x16a001,
-0x16a901,
-0x16a801,
-0x17af01,
-0x16af01,
-0x3f1fff,
-0x33eb33,
-0x33eb33,
-0x33eb33,
-0xceebf,
-0xcaffb,
-0xcedcf,
-0xccfbd,
-0xcecec,
-0xcaffe,
-0xccdcd,
-0x3f3fff,
-0x371ff,
-0x370ff,
-0x373ff,
-0x372ff,
-0x1ea007,
-0x1ea10b,
-0xce01d,
-0xcaffe,
-0x1ea30a,
-0xce03c,
-0xccdfd,
-0x1ea209,
-0xce02b,
-0xcdcfc,
-0x1ee008,
-0xcdbfb,
-0x1ea006,
-0xce303,
-0xcccfc,
-0xcdb3b,
-0xce013,
-0xccdfd,
-0xcdc3c,
-0x1ee009,
-0xcdbfb,
-0x1ea005,
-0xce013,
-0xcccfc,
-0xcdb3b,
-0x1ee00a,
-0xccbfb,
-0x1ee104,
-0xccbfb,
-0x16a201,
-0x16a301,
-0x16a001,
-0x16a101,
-0x3f3fff,
-0x371ff,
-0x1eac01,
-0x1ebc02,
-0x36ead2,
-0xeacff,
-0xeabff,
-0xea1f0,
-0xdafee,
-0xdefdd,
-0xdefcc,
-0xdefbb,
-0x1e3c02,
-0x1e7b01,
-0x34ead7,
-0x1ecc02,
-0x1edb01,
-0xdbf11,
-0x34eae3,
-0x33ead4,
-0xebefe,
-0xdbf11,
-0x34eae3,
-0x16a101,
-0x3f3fff,
-0xeabff,
-0xead00,
-0xeae00,
-0x33ead4,
-0x0,
-0x71,
-0x7f,
-0xda,
-0xfd,
-0x5c,
-0x98,
-0xd0,
-0x153,
-0x8e,
-0x86,
-0xa2,
-0xc6,
-0xbc,
-0x53,
-0x11b,
-0xad,
-0x187,
-0x107,
-0x111,
-0x17e,
-0xe7,
-0x125,
-0x4e,
-0x12f,
-0x18f,
-0x8006,
-0x800c,
-0x8012,
-0x8018,
-0x58a,
-0x58b,
-0x58c,
-0x58d,
-0x58c,
-0x58d,
-0x58e,
-0x58f,
-0x590,
-0x591,
-0x592,
-0x593,
-0x608,
-0x609,
-0x60a,
-0x60b,
-0x60c,
-0x60d,
-0x60e,
-0x60f,
-0x610,
-0x50,
-0x51,
-0x54,
-0x55,
-0x56,
-0x57,
-0x63,
-0x6b,
-0x6c,
-0x6d,
-0x6e,
-0x8ce,
-0x8cf,
-0x8d1,
-0x8d2,
-0x8d7,
-0x8d8,
-0x8e6,
-0x6a6,
-0x6a5,
-0x6a4,
-0x6f,
-0x6a3,
-0x6a2,
-0x6a1,
-0x6a7,
-0x6aa,
-0x6b3,
-0x6b4,
-0x6b5,
-0x6b6,
-0x6b7,
-0x6b8,
-0x6b9,
-0x6ba,
-0x6bb,
-0x6bc,
-0x6bd,
-0x6be,
-0x6bf,
-0x6c0,
-0x6c1,
-0x6c2,
-0x6c3,
-0x6c4,
-0x6ca,
-0x6cb,
-0x6cc,
-0x6a9,
-0x702,
-0x703,
-0x704,
-0x705,
-0x70d,
-0x70e,
-0x70f,
-0x710,
-0x711,
-0x712,
-0x713,
-0x714,
-0x724,
-0x73a,
-0x744,
-0x720,
-0x721,
-0x729,
-0x733,
-0x73f,
-0x741,
-0xd0c,
-0xb0a,
-0x908,
-0x0,
-0x1c1b,
-0x1a00,
-0x1000,
-0x2000,
-0x4000,
-0x8001,
-0x2,
-0x4,
-0x4,
-0x15,
-0x552a,
-0xaa55,
-0x5500,
-0x0,
-0x0,
-0x0,
-0x0,
-0x0,
-0x0,
-0x0,
-0x0,
-0x200,
-0x0,
-0x0,
-0x0,
-0x0,
-0x0,
-0x0,
-0x0,
-0x0,
-0x0,
-0x0,
-0x0,
-0x0,
-0x0,
-0x0,
-0x0,
-0x0,
-0x0,
-0x0,
-0x0,
-0x0,
-0x0,
-0x0,
-0x0,
-0x0,
-0x0,
-0x0,
-0x0,
-0x0,
-0x0,
-0x0,
-0x0,
-0x0,
-0x0,
-0x0,
-0x0,
-0x0,
-0x0,
-0x0,
-0x0,
-0x0,
-0x0,
-0x0,
-0x0,
-0x0,
-0x0,
-0x0,
-0x0,
-0x0,
-0x0,
-0x0,
-0x0,
-0x0,
-0x0,
-0x0,
-0x0,
-0x0,
-0x0,
-0x0,
-0x0,
-0x0,
-0x0,
-0x0,
-0x0,
-0x0,
-0x0,
-0x0,
-0x0,
-0x0,
-0x0,
-0x0,
-0x0,
-0x0,
-0x0,
-0x0,
-0x0,
-0x0,
-0x0,
-0x0,
-0x0,
-0x0,
-0x0,
-0x0,
-0x0,
-0x0,
-0x0,
-0x0,
-0x0,
-0x0,
-0x0,
-0x0,
-0x0,
-0x0,
-0x0,
-0x0,
-0x0,
-0x0,
-0x0,
-0x0,
-0x0,
-0x0,
-0x0,
-0x0,
-0x0,
-0x0,
-0x0,
-0x0,
-0x0,
-0x0,
-0x0,
-0x0,
-0x0,
-0x0,
-0x0,
-0x0,
-0x0,
-0x0,
-0x0,
-0x0,
-0x0,
-0x0,
-0x0,
-0x0,
-0x0,
-0x0,
-0x0,
-0x0,
-0x0,
-0x0,
-0x0,
-0x0,
-0x0,
-0x0,
-0x0,
-0x0,
-0x0,
-0x0,
-0x0,
-0x0,
-0x0,
-0x0,
-0x0,
-0x0,
-0x0,
-0x0,
-0x0,
-0x0,
-0x0,
-0x0,
-0x0,
-0x0,
-0x0,
-0x0,
-0x0,
-0x0,
-0x0,
-0x0,
-0x0,
-0x0,
-0x0,
-0x0,
-0x0,
-0x0,
-0x0,
-0x0,
-0x0,
-0x0,
-0x0,
-0x0,
-0x0,
-0x0,
-0x0,
-0x0,
-0x0,
-0x0,
-0x0,
-0x0,
-0x0,
-0x0,
-0x0,
-0x0,
-0x0,
-0x0,
-0x0,
-0x0,
-0x0,
-0x0,
-0x0,
-0x0,
-0x0,
-0x0,
-0x0,
-0x0,
-0x0,
-0x0,
-0x0,
-0x0,
-0x0,
-0x0,
-0x0,
-0x0,
-0x0,
-0x0,
-0x0,
-0x0,
-0x0,
-0x0,
-0x0,
-0x0,
-0x0,
-0x0,
-0x0,
-0x0,
-0x0,
-0x0,
-0x0,
-0x0,
-0x0,
-0x0,
-0x0,
-0x0,
-0x0,
-0x0,
-0x0,
-0x0,
-0x0,
-0x0,
-0x0,
-0x0,
-0x0,
-0x0,
-0x0,
-0x0,
-0x0,
-0x0,
-0x0,
-0x0,
-0x0,
-0x0,
-0x0,
-0x0,
-0x0,
-0x0,
-0x0,
-0x0,
-0x0,
-0x0,
-0x0,
-0x0,
-0x0,
-0x0,
-0x0,
-0x0,
-0x0,
-0x0,
-0x0,
-0x0,
-0x0,
-0x0,
-0x0,
-0x0,
-0x0,
-0x0,
-0x0,
-0x0,
-0x0,
-0x0,
-0x0,
-0x0,
-0x0,
-0x0,
-0x0,
-0x0,
-0x0,
-0x0,
-0x0,
-0x0,
-0x0,
-0x0,
-0x0,
-0x0,
-0x0,
-0x0,
-0x0,
-0x0,
-0x0,
-0x0,
-0x0,
-0x0,
-0x0,
-0x0,
-0x0,
-0x0,
-0x0,
-0x0,
-0x0,
-0x0,
-0x0,
-0x0,
-0x0,
-0x0,
-0x0,
-0x0,
-0x0,
-0x0,
-0x0,
-0x0,
-0x0,
-0x0,
-0x0,
-0x0,
-0x0,
-0x0,
-0x0,
-0x0,
-0x0,
-0x0,
-0x0,
-0x0,
-0x0,
-0x0,
-0x0,
-0x0,
-0x0,
-0x0,
-0x0,
-0x0,
-0x0,
-0x0,
-0x0,
-0x0,
-0x0,
-0x0,
-0x0,
-0x0,
-0x0,
-0x0,
-0x0,
-0x0,
-0x0,
-0x0,
-0x0,
-0x0,
-0x0,
-0x0,
-0x0,
-0x0,
-0x0,
-0x0,
-0x0,
-0x0,
-0x0,
-0x0,
-0x0,
-0x0,
-0x0,
-0x0,
-0x0,
-0x0,
-0x0,
-0x0,
-0x0,
-0x0,
-0x0,
-0x0,
-0x0,
-0x0,
-0x0,
-0x0,
-0x0,
-0x0,
-0x0,
-0x0,
-0x0,
-0x0,
-0x0,
-0x0,
-0x0,
-0x0,
-0x0,
-0x0,
-0x0,
-0x0,
-0x0,
-0x0,
-0x0,
-0x0,
-0x0,
-0x0,
-0x0,
-0x0,
-0x0,
-0x0,
-0x0,
-0x0,
-0x0,
-0x0,
-0x0,
-0x0,
-0x0,
-0x0,
-0x0,
-0x0,
-0x0,
-0x0,
-0x0,
-0x0,
-0x0,
-0x0,
-0x0,
-0x0,
-0x0,
-0x0,
-0x0,
-0x0,
-0x0,
-0x0,
-0x0,
-0x0,
-0x0,
-0x0,
-0x0,
-0x0,
-0x0,
-0x0,
-0x0,
-0x0,
-0x0,
-0x0,
-0x0,
-0x0,
-0x0,
-0x0,
-0x0,
-0x0,
-0x0,
-0x0,
-0x0,
-0x0,
-0x0,
-0x0,
-0x0,
-0x0,
-0x0,
-0x0,
-0x0,
-0x0,
-0x0,
-0x0,
-0x0,
-0x0,
-0x0,
-0x0,
-0x0,
-0x0,
-0x0,
-0x0,
-0x0,
-0x0,
-0x0,
-0x0,
-0x0,
-0x0,
-0x0,
-0x0,
-0x0,
-0x0,
-0x0,
-0x0,
-0x0,
-0x0,
-0x0,
-0x0,
-0x0,
-0x0,
-0x0,
-0x0,
-0x0,
-0x0,
-0x0,
-0x0,
-0x0,
-0x0,
-0x0,
-0x0,
-0x0,
-0x0,
-0x0,
-0x0,
-0x0,
-0x0,
-0x0,
-0x0,
-0x0,
-0x0,
-0x0,
-0x0,
-0x0,
-0x0,
-0x0,
-0x0,
-0x0,
-0x0,
-0x0,
-0x0,
-0x0,
-0x0,
-0x0,
-0x0,
-0x0,
-0x0,
-0x0,
-0x0,
-0x0,
-0x0,
-0x0,
-0x0,
-0x0,
-0x0,
-0x0,
-0x0,
-0x0,
-0x0,
-0x0,
-0x0,
-0x0,
-0x0,
-0x0,
-0x0,
-0x0,
-0x0,
-0x0,
-0x0,
-0x0,
-0x0,
-0x0,
-0x0,
-0x0,
-0x0,
-0x0,
-0x0,
-0x0,
-0x0,
-0x0,
-0x0,
-0x0,
-0x0,
-0x0,
-0x0,
-0x0,
-0x0,
-0x0,
-0x0,
-0x0,
-0x0,
-0x0,
-0x0,
-0x0,
-0x0,
-0x0,
-0x0,
-0x0,
-0x0,
-0x0,
-0x0,
-0x5358,
-0x3132,
-0x3631,
-0x2056,
-0x3141,
-0x2043,
-0x3030,
-0x3500,
-};
-
-#define PRAM_COUNT 6144
--- a/radio.h Wed Oct 12 08:49:58 2016 +0000
+++ b/radio.h Mon Sep 04 15:16:44 2017 +0000
@@ -1,4 +1,5 @@
/*
+ ______ _
/ _____) _ | |
( (____ _____ ____ _| |_ _____ ____| |__
\____ \| ___ | (_ _) ___ |/ ___) _ \
@@ -35,32 +36,49 @@
/*!
* \brief Structure describing the error codes for callback functions
*/
-enum IrqErrorCode_t
+typedef enum
{
- IRQ_HEADER_ERROR_CODE = 0x01,
- IRQ_SYNCWORD_ERROR_CODE = 0x02,
- IRQ_CRC_ERROR_CODE = 0x04,
-};
+ IRQ_HEADER_ERROR_CODE = 0x01,
+ IRQ_SYNCWORD_ERROR_CODE = 0x02,
+ IRQ_CRC_ERROR_CODE = 0x04,
+}IrqErrorCode_t;
enum IrqPblSyncHeaderCode_t
{
- IRQ_PBL_DETECT_CODE = 0x01,
- IRQ_SYNCWORD_VALID_CODE = 0x02,
- IRQ_HEADER_VALID_CODE = 0x04,
+ IRQ_PBL_DETECT_CODE = 0x01,
+ IRQ_SYNCWORD_VALID_CODE = 0x02,
+ IRQ_HEADER_VALID_CODE = 0x04,
};
enum IrqTimeoutCode_t
{
- IRQ_RX_TIMEOUT = 0x00,
- IRQ_TX_TIMEOUT = 0x01,
- IRQ_XYZ = 0xFF,
+ IRQ_RX_TIMEOUT = 0x00,
+ IRQ_TX_TIMEOUT = 0x01,
+ IRQ_XYZ = 0xFF,
};
/*!
* \brief The radio command opcodes
*/
-enum RadioCommands_t;
+typedef enum RadioCommands_e RadioCommands_t;
+
+/*!
+ * \brief The radio callbacks structure
+ * Holds function pointers to be called on radio interrupts
+ */
+typedef struct
+{
+ void ( *txDone )( void ); //!< Pointer to a function run on successful transmission
+ void ( *rxDone )( void ); //!< Pointer to a function run on successful reception
+ void ( *rxPreambleDetect )( void ); //!< Pointer to a function run on successful Preamble detection
+ void ( *rxSyncWordDone )( void ); //!< Pointer to a function run on successful SyncWord reception
+ void ( *rxHeaderDone )( void ); //!< Pointer to a function run on successful Header reception
+ void ( *txTimeout )( void ); //!< Pointer to a function run on transmission timeout
+ void ( *rxTimeout )( void ); //!< Pointer to a function run on reception timeout
+ void ( *rxError )( IrqErrorCode_t errCode ); //!< Pointer to a function run on reception error
+ void ( *cadDone )( bool cadFlag ); //!< Pointer to a function run on channel activity detected
+}RadioCallbacks_t;
/*!
* \brief Class holding the basic communications with a radio
@@ -76,29 +94,42 @@
/*!
* \brief Callback on Tx done interrupt
*/
- void ( *txDone )( );
+ void ( *txDone )( void );
/*!
* \brief Callback on Rx done interrupt
*/
- void ( *rxDone )( );
+ void ( *rxDone )( void );
+
+ /*!
+ * \brief Callback on Rx preamble detection interrupt
+ */
+ void ( *rxPreambleDetect )( void );
+
+ /*!
+ * \brief Callback on Rx SyncWord interrupt
+ */
+ void ( *rxSyncWordDone )( void );
/*!
- * \brief Callback on Rx SyncWord done interrupt
+ * \brief Callback on Rx header received interrupt
*/
- void ( *rxPblSyncWordHeader )( IrqPblSyncHeaderCode_t val );
+ void ( *rxHeaderDone )( void );
/*!
- * \brief Callback on Rx Tx timeout interrupt
- *
- * \param [out] errCode A code indicating the source of the Timeout interrupt
+ * \brief Callback on Tx timeout interrupt
*/
- void ( *rxTxTimeout )( IrqTimeoutCode_t timeoutCode );
+ void ( *txTimeout )( void );
+
+ /*!
+ * \brief Callback on Rx timeout interrupt
+ */
+ void ( *rxTimeout )( void );
/*!
* \brief Callback on Rx error interrupt
*
- * \param [out] errCode A code indicating the type of interrupt ( SyncWord error or CRC error)
+ * \param [out] errCode A code indicating the type of interrupt (SyncWord error or CRC error)
*/
void ( *rxError )( IrqErrorCode_t errCode );
@@ -112,21 +143,25 @@
public:
/*!
* \brief Constructor for radio class
+ * Sets the callbacks functions pointers
*
- * Sets the callbacks functions pointers
+ * \param [in] callbacks The structure of callbacks function pointers
+ * to be called on radio interrupts
+ *
*/
- Radio( void ( *txDone )( ), void ( *rxDone )( ), void ( *rxPblSyncWordHeader )(IrqPblSyncHeaderCode_t val ),
- void ( *rxTxTimeout )( IrqTimeoutCode_t timeoutCode ), void ( *rxError )( IrqErrorCode_t errorCode ),
- void ( *cadDone )( bool channelActivityDetected ) )
+ Radio( RadioCallbacks_t *callbacks )
{
- this->txDone = txDone;
- this->rxDone = rxDone;
- this->rxPblSyncWordHeader = rxPblSyncWordHeader;
- this->rxTxTimeout = rxTxTimeout;
- this->rxError = rxError;
- this->cadDone = cadDone;
+ this->txDone = callbacks->txDone;
+ this->rxDone = callbacks->rxDone;
+ this->rxPreambleDetect = callbacks->rxPreambleDetect;
+ this->rxSyncWordDone = callbacks->rxSyncWordDone;
+ this->rxHeaderDone = callbacks->rxHeaderDone;
+ this->txTimeout = callbacks->txTimeout;
+ this->rxTimeout = callbacks->rxTimeout;
+ this->rxError = callbacks->rxError;
+ this->cadDone = callbacks->cadDone;
}
- virtual ~Radio( ){ };
+ virtual ~Radio( void ){ };
/*!
* \brief Resets the radio
@@ -173,7 +208,7 @@
* \param [in] address Register address
* \param [in] value New register value
*/
- virtual void WriteRegister( uint16_t address, uint8_t value ) = 0;
+ virtual void WriteReg( uint16_t address, uint8_t value ) = 0;
/*!
* \brief Reads multiple radio registers starting at address
@@ -191,7 +226,7 @@
*
* \retval value The register value
*/
- virtual uint8_t ReadRegister( uint16_t address ) = 0;
+ virtual uint8_t ReadReg( uint16_t address ) = 0;
/*!
* \brief Writes Radio Data Buffer with buffer of size starting at offset.
@@ -210,13 +245,6 @@
* \param [in] size Buffer size
*/
virtual void ReadBuffer( uint8_t offset, uint8_t *buffer, uint8_t size ) = 0;
-
- /*!
- * \brief Return firmware version
- *
- * \retval firmware The firmware version
- */
- virtual uint16_t GetFirmwareVersion( void ) = 0;
};
#endif // __RADIO_H__
--- a/sx126x-hal.cpp Wed Oct 12 08:49:58 2016 +0000
+++ b/sx126x-hal.cpp Mon Sep 04 15:16:44 2017 +0000
@@ -14,63 +14,85 @@
*/
#include "sx126x-hal.h"
-#define V1A_WORKAROUNDS
+/*!
+ * \brief Helper macro to create Interrupt objects only if the pin name is
+ * different from NC
+ */
+#define CreateDioPin( pinName, dio ) \
+ if( pinName == NC ) \
+ { \
+ dio = NULL; \
+ } \
+ else \
+ { \
+ dio = new InterruptIn( pinName ); \
+ }
+
+/*!
+ * \brief Helper macro to avoid duplicating code for setting dio pins parameters
+ */
+#define DioAssignCallback( dio, pinMode, callback ) \
+ if( dio != NULL ) \
+ { \
+ dio->mode( pinMode ); \
+ dio->rise( this, static_cast <Trigger>( callback ) ); \
+ }
/*!
* \brief Used to block execution waiting for low state on radio busy pin.
- * Essentially used in SPI communications
*/
-#define WaitBusy( ) while( BUSY == 1 ){ }
-
-
+#define WaitOnBusy( ) while( BUSY == 1 ){ }
/*!
- * \brief Blocking routine for waiting the UART to be writeable
- *
+ * \brief Used to block execution to give enough time to Busy to go up
*/
-#define WaitUartWritable( ) while( RadioUart->writeable( ) == false ){ }
+#define WaitOnCounter( ) for( uint8_t counter = 0; counter < 15; counter++ ) \
+ { __nop( ); }
-/*!
- * \brief Blocking routine for waiting the UART to be readable
- *
- */
-#define WaitUartReadable( ) while( RadioUart->readable( ) == false ){ }
+
+// This code handles cases where assert_param is undefined
+#ifndef assert_param
+#define assert_param( ... )
+#endif
-SX126xHal::SX126xHal( PinName mosi, PinName miso, PinName sclk, PinName nss, PinName busy, PinName dio1, PinName dio2, PinName dio3, PinName rst,
- void ( *txDone )( ), void ( *rxDone )( ), void ( *rxPblSyncWordHeader )( IrqPblSyncHeaderCode_t val ),
- void ( *rxTxTimeout )( IrqTimeoutCode_t timeoutCode ), void ( *rxError )( IrqErrorCode_t errorCode ), void ( *cadDone )( bool channelActivityDetected ),
- void ( *onDioIrq )( ) )
- : SX126x( txDone, rxDone, rxPblSyncWordHeader, rxTxTimeout, rxError, cadDone, onDioIrq ),
+SX126xHal::SX126xHal( PinName mosi, PinName miso, PinName sclk, PinName nss,
+ PinName busy, PinName dio1, PinName dio2, PinName dio3, PinName rst,
+ PinName deviceSelect, PinName antSwPower, RadioCallbacks_t *callbacks )
+ : SX126x( callbacks ),
RadioNss( nss ),
RadioReset( rst ),
BUSY( busy ),
- DIO1( dio1 ),
- DIO2( dio2 ),
- DIO3( dio3 )
+ DeviceSelect( deviceSelect ),
+ antSwitchPower( antSwPower )
{
+ CreateDioPin( dio1, DIO1 );
+ CreateDioPin( dio2, DIO2 );
+ CreateDioPin( dio3, DIO3 );
RadioSpi = new SPI( mosi, miso, sclk );
- RadioUart = NULL;
RadioNss = 1;
RadioReset = 1;
}
-SX126xHal::SX126xHal( PinName tx, PinName rx, PinName busy, PinName dio1, PinName dio2, PinName dio3, PinName rst,
- void ( *txDone )( ), void ( *rxDone )( ), void ( *rxPblSyncWordHeader )( IrqPblSyncHeaderCode_t val ),
- void ( *rxTxTimeout )( IrqTimeoutCode_t timeoutCode ), void ( *rxError )( IrqErrorCode_t errorCode ), void ( *cadDone )( bool channelActivityDetected ),
- void ( *onDioIrq )( ) )
- : SX126x( txDone, rxDone, rxPblSyncWordHeader, rxTxTimeout, rxError, cadDone, onDioIrq ),
- RadioNss( NC ),
- RadioReset( rst ),
- BUSY( busy ),
- DIO1( dio1 ),
- DIO2( dio2 ),
- DIO3( dio3 )
+SX126xHal::~SX126xHal( void )
{
- RadioSpi = NULL;
- RadioUart = new Serial( tx, rx );
- RadioReset = 1;
-}
+ if( this->RadioSpi != NULL )
+ {
+ delete RadioSpi;
+ }
+ if( DIO1 != NULL )
+ {
+ delete DIO1;
+ }
+ if( DIO2 != NULL )
+ {
+ delete DIO2;
+ }
+ if( DIO3 != NULL )
+ {
+ delete DIO3;
+ }
+};
void SX126xHal::SpiInit( void )
{
@@ -81,105 +103,40 @@
wait( 0.1 );
}
-void SX126xHal::UartInit( void )
-{
- RadioUart->format( 9, SerialBase::Even, 1 ); // 8 data bits + 1 even parity bit + 1 stop bit
- RadioUart->baud( 115200 );
-
- // By default the SX126x UART is setup to handle bytes MSB first.
- // In order to setup the radio to use the UART standard way we first send
- // the equivalent of a WriteRegister with reversed bit order in order to
- // change the endianness.
- //@todo
- /*uint8_t regVal = 0;
- RadioUart->putc( 0x98 ); // Reversed opcode for read register (0x19)
- RadioUart->putc( 0x10 ); // Reversed MSB register address (0x08)
- RadioUart->putc( 0x18 ); // Reversed LSB register address (0x18)
- RadioUart->putc( 0x80 ); // Reversed value for reading only 1 byte (0x01)
- regVal = RadioUart->getc( )& 0xF3; // Read reversed value and mask it
-
- RadioUart->putc( 0x18 ); // Reversed opcode for read register (0x18)
- RadioUart->putc( 0x10 ); // Reversed MSB register address (0x08)
- RadioUart->putc( 0x18 ); // Reversed LSB register address (0x18)
- RadioUart->putc( 0x80 ); // Reversed value for writing only 1 byte (0x01)
- RadioUart->putc( regVal ); // The new value of the register*/
-
- // After this point, the UART is running standard mode: 8 data bit, 1 even
- // parity bit, 1 stop bit, 115200 baud, LSB first
- wait_us( 10 );
-}
void SX126xHal::IoIrqInit( DioIrqHandler irqHandler )
{
- assert_param( RadioSpi != 0 || RadioUart != 0 );
+ assert_param( RadioSpi != NULL );
if( RadioSpi != NULL )
{
SpiInit( );
}
- if( RadioUart != NULL )
- {
- UartInit( );
- }
- BUSY.mode( PullDown );
- DIO1.mode( PullDown );
- DIO2.mode( PullDown );
- DIO3.mode( PullDown );
+ BUSY.mode( PullNone );
+ DioAssignCallback( DIO1, PullNone, irqHandler );
+// DioAssignCallback( DIO2, PullNone, irqHandler );
+// DioAssignCallback( DIO3, PullNone, irqHandler );
- DIO1.rise( this, static_cast <Trigger>( irqHandler ) );
- DIO2.rise( this, static_cast <Trigger>( irqHandler ) );
- DIO3.rise( this, static_cast <Trigger>( irqHandler ) );
}
void SX126xHal::Reset( void )
{
__disable_irq( );
- wait( 0.05 );
+ wait_ms( 20 );
+ RadioReset.output( );
RadioReset = 0;
- wait( 0.1 );
+ wait_ms( 50 );
RadioReset = 1;
- wait( 0.05 );
+ RadioReset.input( ); // Using the internal pull-up
+ wait_ms( 20 );
__enable_irq( );
}
-void SX126xHal::ClearInstructionRam( void )
-{
- // Clearing the instruction RAM is writing 0x00s on every bytes of the
- // instruction RAM
- WaitBusy( );
-
- if( RadioSpi != NULL )
- {
- RadioNss = 0;
- RadioSpi->write( RADIO_WRITE_REGISTER ); // Send write register opcode
- RadioSpi->write( ( IRAM_START_ADDRESS >> 8 ) & 0x00FF ); // Send MSB of the first byte address
- RadioSpi->write( IRAM_START_ADDRESS & 0x00FF ); // Send LSB of the first byte address
-
- for( uint16_t address = IRAM_START_ADDRESS; address < ( IRAM_START_ADDRESS + IRAM_SIZE ); address++ )
- {
- RadioSpi->write( 0x00 );
- }
- RadioNss = 1;
- }
- if( RadioUart != NULL )
- {
- // We can't erase the whole instruction RAM in one shot with UART
- // because we need to send the length of register to erase
- // and this length is coded on 1 byte.
- for( uint16_t address = IRAM_START_ADDRESS; address < ( IRAM_START_ADDRESS + IRAM_SIZE ); address++ )
- {
- WriteRegister( address, 0 );
- }
- }
-
- WaitBusy( );
-}
-
void SX126xHal::Wakeup( void )
{
__disable_irq( );
- //Don't wait for DIO0 here
+ //Don't wait for BUSY here
if( RadioSpi != NULL )
{
@@ -188,33 +145,27 @@
RadioSpi->write( 0 );
RadioNss = 1;
}
- if( RadioUart != NULL )
- {
- RadioUart->putc( RADIO_GET_STATUS );
- WaitUartReadable( );
- RadioUart->getc( );
- }
// Wait for chip to be ready.
- WaitBusy( );
-
- #ifdef V1A_WORKAROUNDS
- //V1a workaround: rc64k not enabled after warm_start, rtc_wake_up=0
- WriteRegister(0x91e, ReadRegister(0x91e) | 0x40);
- //rc13m enable bug
- uint8_t txFallbackFunc[2];
- //set to ModeTx2Rc addr = 0fce, so rc is not enabled before ramp down
- txFallbackFunc[0] = 0x0f;
- txFallbackFunc[1] = 0xce;
- WriteRegister(0x00CC, txFallbackFunc, 2);
- #endif
+ WaitOnBusy( );
__enable_irq( );
+
+ AntSwOn( );
}
void SX126xHal::WriteCommand( RadioCommands_t command, uint8_t *buffer, uint16_t size )
{
- WaitBusy( );
+#ifdef ADV_DEBUG
+ printf("cmd: 0x%02x", command );
+ for( uint8_t i = 0; i < size; i++ )
+ {
+ printf("-%02x", buffer[i] );
+ }
+ printf("\n\r");
+#endif
+
+ WaitOnBusy( );
if( RadioSpi != NULL )
{
@@ -226,28 +177,12 @@
}
RadioNss = 1;
}
- if( RadioUart != NULL )
- {
- RadioUart->putc( command );
- if( size > 0 )
- {
- RadioUart->putc( size );
- for( uint16_t i = 0; i < size; i++ )
- {
- RadioUart->putc( buffer[i] );
- }
- }
- }
-
- if( command != RADIO_SET_SLEEP )
- {
- WaitBusy( );
- }
+ WaitOnCounter( );
}
void SX126xHal::ReadCommand( RadioCommands_t command, uint8_t *buffer, uint16_t size )
{
- WaitBusy( );
+ WaitOnBusy( );
if( RadioSpi != NULL )
{
@@ -260,37 +195,11 @@
}
RadioNss = 1;
}
- else if( RadioUart != NULL )
- {
- RadioUart->putc( command );
-
- // Behavior on the UART is different depending of the opcode command
- if( ( command == RADIO_GET_PACKETTYPE ) ||
- ( command == RADIO_GET_RXBUFFERSTATUS ) ||
- ( command == RADIO_GET_RSSIINST ) ||
- ( command == RADIO_GET_PACKETSTATUS ) ||
- ( command == RADIO_GET_IRQSTATUS ) )
- {
- RadioUart->putc( size );
- }
-
- WaitUartReadable( );
- for( uint16_t i = 0; i < size; i++ )
- {
- buffer[i] = RadioUart->getc( );
- }
- }
- else
- {
- buffer[0] = 0xFF;
- }
-
- WaitBusy( );
}
void SX126xHal::WriteRegister( uint16_t address, uint8_t *buffer, uint16_t size )
{
- WaitBusy( );
+ WaitOnBusy( );
if( RadioSpi != NULL )
{
@@ -304,61 +213,16 @@
}
RadioNss = 1;
}
- if( RadioUart != NULL )
- {
- RadioUart->putc( RADIO_WRITE_REGISTER );
- RadioUart->putc( ( address & 0xFF00 ) >> 8 );
- RadioUart->putc( address & 0x00FF );
- RadioUart->putc( size );
- for( uint16_t i = 0; i < size; i++ )
- {
- RadioUart->putc( buffer[i] );
- }
- }
-
- WaitBusy( );
}
-void SX126xHal::WriteRegisterNoBusy( uint16_t address, uint8_t *buffer, uint16_t size )
-{
- if( RadioSpi != NULL )
- {
- RadioNss = 0;
- RadioSpi->write( RADIO_WRITE_REGISTER );
- RadioSpi->write( ( address & 0xFF00 ) >> 8 );
- RadioSpi->write( address & 0x00FF );
- for( uint16_t i = 0; i < size; i++ )
- {
- RadioSpi->write( buffer[i] );
- }
- RadioNss = 1;
- }
- if( RadioUart != NULL )
- {
- RadioUart->putc( RADIO_WRITE_REGISTER );
- RadioUart->putc( ( address & 0xFF00 ) >> 8 );
- RadioUart->putc( address & 0x00FF );
- RadioUart->putc( size );
- for( uint16_t i = 0; i < size; i++ )
- {
- RadioUart->putc( buffer[i] );
- }
- }
-}
-
-void SX126xHal::WriteRegister( uint16_t address, uint8_t value )
+void SX126xHal::WriteReg( uint16_t address, uint8_t value )
{
WriteRegister( address, &value, 1 );
}
-void SX126xHal::WriteRegisterNoBusy( uint16_t address, uint8_t value )
-{
- WriteRegisterNoBusy( address, &value, 1 );
-}
-
void SX126xHal::ReadRegister( uint16_t address, uint8_t *buffer, uint16_t size )
{
- WaitBusy( );
+ WaitOnBusy( );
if( RadioSpi != NULL )
{
@@ -373,54 +237,9 @@
}
RadioNss = 1;
}
- if( RadioUart != NULL )
- {
- RadioUart->putc( RADIO_READ_REGISTER );
- RadioUart->putc( ( address & 0xFF00 ) >> 8 );
- RadioUart->putc( address & 0x00FF );
- RadioUart->putc( size );
- WaitUartReadable( );
- for( uint16_t i = 0; i < size; i++ )
- {
- buffer[i] = RadioUart->getc( );
- }
- }
-
- WaitBusy( );
}
-void SX126xHal::ReadRegisterNoBusy( uint16_t address, uint8_t *buffer, uint16_t size )
-{
-
- if( RadioSpi != NULL )
- {
- RadioNss = 0;
- RadioSpi->write( RADIO_READ_REGISTER );
- RadioSpi->write( ( address & 0xFF00 ) >> 8 );
- RadioSpi->write( address & 0x00FF );
- RadioSpi->write( 0 );
- for( uint16_t i = 0; i < size; i++ )
- {
- buffer[i] = RadioSpi->write( 0 );
- }
- RadioNss = 1;
- }
- if( RadioUart != NULL )
- {
- RadioUart->putc( RADIO_READ_REGISTER );
- RadioUart->putc( ( address & 0xFF00 ) >> 8 );
- RadioUart->putc( address & 0x00FF );
- RadioUart->putc( size );
- WaitUartReadable( );
- for( uint16_t i = 0; i < size; i++ )
- {
- buffer[i] = RadioUart->getc( );
- }
- }
-
-}
-
-uint8_t SX126xHal::ReadRegister( uint16_t address )
+uint8_t SX126xHal::ReadReg( uint16_t address )
{
uint8_t data;
@@ -428,17 +247,9 @@
return data;
}
-uint8_t SX126xHal::ReadRegisterNoBusy( uint16_t address )
-{
- uint8_t data;
-
- ReadRegisterNoBusy( address, &data, 1 );
- return data;
-}
-
void SX126xHal::WriteBuffer( uint8_t offset, uint8_t *buffer, uint8_t size )
{
- WaitBusy( );
+ WaitOnBusy( );
if( RadioSpi != NULL )
{
@@ -451,23 +262,11 @@
}
RadioNss = 1;
}
- if( RadioUart != NULL )
- {
- RadioUart->putc( RADIO_WRITE_BUFFER );
- RadioUart->putc( offset );
- RadioUart->putc( size );
- for( uint16_t i = 0; i < size; i++ )
- {
- RadioUart->putc( buffer[i] );
- }
- }
-
- WaitBusy( );
}
void SX126xHal::ReadBuffer( uint8_t offset, uint8_t *buffer, uint8_t size )
{
- WaitBusy( );
+ WaitOnBusy( );
if( RadioSpi != NULL )
{
@@ -481,24 +280,24 @@
}
RadioNss = 1;
}
- if( RadioUart != NULL )
- {
- RadioUart->putc( RADIO_READ_BUFFER );
- RadioUart->putc( offset );
- RadioUart->putc( size );
- WaitUartReadable( );
- for( uint16_t i = 0; i < size; i++ )
- {
- buffer[i] = RadioUart->getc( );
- }
- }
-
- WaitBusy( );
}
uint8_t SX126xHal::GetDioStatus( void )
{
- return ( DIO3 << 3 ) | ( DIO2 << 2 ) | ( DIO1 << 1 ) | ( BUSY << 0 );
+ return ( *DIO3 << 3 ) | ( *DIO2 << 2 ) | ( *DIO1 << 1 ) | ( BUSY << 0 );
+}
+
+uint8_t SX126xHal::GetDeviceType( void )
+{
+ return( DeviceSelect.read( ) );
}
+void SX126xHal::AntSwOn( void )
+{
+ antSwitchPower = 1;
+}
+void SX126xHal::AntSwOff( void )
+{
+ antSwitchPower = 0;
+}
--- a/sx126x-hal.h Wed Oct 12 08:49:58 2016 +0000
+++ b/sx126x-hal.h Mon Sep 04 15:16:44 2017 +0000
@@ -1,4 +1,5 @@
/*
+ ______ _
/ _____) _ | |
( (____ _____ ____ _| |_ _____ ____| |__
\____ \| ___ | (_ _) ___ |/ ___) _ \
@@ -10,7 +11,7 @@
License: Revised BSD License, see LICENSE.TXT file include in the project
-Maintainer: Miguel Luis and Gregory Cristian
+Maintainer: Miguel Luis, Gregory Cristian & Gilbert Menth
*/
#ifndef __SX126x_HAL_H__
#define __SX126x_HAL_H__
@@ -20,10 +21,10 @@
/*!
* \brief The default value of SPI clock
*/
-#define SX126x_SPI_FREQ_DEFAULT 1000000 // 16000000
+#define SX126x_SPI_FREQ_DEFAULT 16000000
/*!
- * \brief Actual implementation of a SX1280 radio
+ * \brief Actual implementation of a SX126x radio
*/
class SX126xHal : public SX126x
{
@@ -33,37 +34,16 @@
*
* Represents the physical connectivity with the radio and set callback functions on radio interrupts
*/
- SX126xHal( PinName mosi, PinName miso, PinName sclk, PinName nss, PinName busy, PinName dio1, PinName dio2, PinName dio3, PinName rst,
- void ( *txDone )( ), void ( *rxDone )( ), void ( *rxPblSyncWordHeader )( IrqPblSyncHeaderCode_t val ),
- void ( *rxTxTimeout )( IrqTimeoutCode_t timeoutCode ),void ( *rxError )( IrqErrorCode_t errorCode ), void ( *cadDone )( bool channelActivityDetected ),
- void ( *onDioIrq )( ) );
+ SX126xHal( PinName mosi, PinName miso, PinName sclk, PinName nss,
+ PinName busy, PinName dio1, PinName dio2, PinName dio3, PinName rst,
+ PinName deviceSelect, PinName antSwPower, RadioCallbacks_t *callbacks );
/*!
- * \brief Constructor for SX126xHal with UART support
- *
- * Represents the physical connectivity with the radio and set callback functions on radio interrupts
- */
- SX126xHal( PinName tx, PinName rx, PinName busy, PinName dio1, PinName dio2, PinName dio3, PinName rst,
- void ( *txDone )( ), void ( *rxDone )( ), void ( *rxPblSyncWordHeader )( IrqPblSyncHeaderCode_t val ),
- void ( *rxTxTimeout )( IrqTimeoutCode_t timeoutCode ), void ( *rxError )( IrqErrorCode_t errorCode ), void ( *cadDone )( bool channelActivityDetected ),
- void ( *onDioIrq )( ) );
-
- /*!
- * \brief Destructor for SX126xHal with UART support
+ * \brief Destructor for SX126xHal
*
* Take care of the correct destruction of the communication objects
*/
- virtual ~SX126xHal( )
- {
- if( this->RadioSpi != 0 )
- {
- delete RadioSpi;
- }
- if( this->RadioUart != 0 )
- {
- delete RadioUart;
- }
- };
+ virtual ~SX126xHal( void );
/*!
* \brief Soft resets the radio
@@ -71,11 +51,6 @@
virtual void Reset( void );
/*!
- * \brief Clears the instruction ram memory block
- */
- virtual void ClearInstructionRam( void );
-
- /*!
* \brief Wakes up the radio
*/
virtual void Wakeup( void );
@@ -106,9 +81,6 @@
* \param [in] size The number of bytes to write in radio's memory
*/
virtual void WriteRegister( uint16_t address, uint8_t *buffer, uint16_t size );
-
- virtual void WriteRegisterNoBusy( uint16_t address, uint8_t *buffer, uint16_t size );
-
/*!
* \brief Write a single byte of data to the radio memory
@@ -116,9 +88,7 @@
* \param [in] address The address of the first byte to write in the radio
* \param [in] value The data to be written in radio's memory
*/
- virtual void WriteRegister( uint16_t address, uint8_t value );
-
- virtual void WriteRegisterNoBusy( uint16_t address, uint8_t value );
+ virtual void WriteReg( uint16_t address, uint8_t value );
/*!
* \brief Read data from the radio memory
@@ -128,7 +98,6 @@
* \param [in] size The number of bytes to read from radio's memory
*/
virtual void ReadRegister( uint16_t address, uint8_t *buffer, uint16_t size );
- virtual void ReadRegisterNoBusy( uint16_t address, uint8_t *buffer, uint16_t size );
/*!
* \brief Read a single byte of data from the radio memory
@@ -139,15 +108,13 @@
* \retval value The value of the byte at the given address in
* radio's memory
*/
- virtual uint8_t ReadRegister( uint16_t address );
- virtual uint8_t ReadRegisterNoBusy( uint16_t address );
-
+ virtual uint8_t ReadReg( uint16_t address );
/*!
* \brief Write data to the buffer holding the payload in the radio
*
* \param [in] offset The offset to start writing the payload
- * \param [in] buffer The data to be written (aka payload)
+ * \param [in] buffer The data to be written (the payload)
* \param [in] size The number of byte to be written
*/
virtual void WriteBuffer( uint8_t offset, uint8_t *buffer, uint8_t size );
@@ -165,21 +132,39 @@
* \brief Returns the status of DIOs pins
*
* \retval dioStatus A byte where each bit represents a DIO state:
- * [ DIO3 | DIO2 | DIO1 | DIO0 ]
+ * [ DIO3 | DIO2 | DIO1 | BUSY ]
*/
virtual uint8_t GetDioStatus( void );
+ /*!
+ * \brief Returns the device type
+ *
+ * \retval 1: SX1261, 0: sx1262
+ */
+ virtual uint8_t GetDeviceType( void );
+
+ /*!
+ * \brief RF Switch power on
+ */
+ virtual void AntSwOn( void );
+
+ /*!
+ * \brief RF Switch power off
+ */
+ virtual void AntSwOff( void );
+
protected:
SPI *RadioSpi; //!< The SPI object used to communicate with the radio
- Serial *RadioUart; //!< The UART object used to communicate with the radio
- DigitalOut RadioNss; //!< The pin connected to Radio chip select
- DigitalOut RadioReset; //!< The reset pin connected to the radio
- DigitalIn BUSY; //!< The pin connected to DIO0 of the radio (aka busy pin)
+ DigitalOut RadioNss; //!< The pin connected to Radio chip select (active low)
+ DigitalInOut RadioReset; //!< The reset pin connected to the radio
- InterruptIn DIO1; //!< The pin connected to DIO1
- InterruptIn DIO2; //!< The pin connected to DIO2
- InterruptIn DIO3; //!< The pin connected to DIO3
+ DigitalIn BUSY; //!< The pin connected to BUSY
+ InterruptIn *DIO1; //!< The pin connected to DIO1
+ InterruptIn *DIO2; //!< The pin connected to DIO2
+ InterruptIn *DIO3; //!< The pin connected to DIO3
+ DigitalIn DeviceSelect; //!< The pin connected to a pull-up/down to select device
+ DigitalOut antSwitchPower; //!< The pin connected to the RF Switch Power
/*!
* \brief Initializes SPI object used to communicate with the radio
@@ -187,11 +172,6 @@
virtual void SpiInit( void );
/*!
- * \brief Initializes UART object used to communicate with the radio
- */
- virtual void UartInit( void );
-
- /*!
* \brief Sets the callback functions to be run on DIO1..3 interrupt
*
* \param [in] irqHandler A function pointer of the function to be run on every DIO interrupt
--- a/sx126x.cpp Wed Oct 12 08:49:58 2016 +0000
+++ b/sx126x.cpp Mon Sep 04 15:16:44 2017 +0000
@@ -1,26 +1,24 @@
/*
+ ______ _
/ _____) _ | |
( (____ _____ ____ _| |_ _____ ____| |__
\____ \| ___ | (_ _) ___ |/ ___) _ \
_____) ) ____| | | || |_| ____( (___| | | |
(______/|_____)_|_|_| \__)_____)\____)_| |_|
- (C)2016 Semtech
+ (C)2017 Semtech
-Description: Handling of the node configuration protocol
+Description: Generic SX126x driver implementation
License: Revised BSD License, see LICENSE.TXT file include in the project
-Maintainer: Miguel Luis, Gregory Cristian and Matthieu Verdy
+Authors: Miguel Luis, Gregory Cristian
*/
#include "mbed.h"
#include "sx126x.h"
#include "sx126x-hal.h"
-#include "pram_c005.h"
-
/*!
- * Radio registers definition
- *
+ * \brief Radio registers definition
*/
typedef struct
{
@@ -28,424 +26,77 @@
uint8_t Value; //!< The value of the register
}RadioRegisters_t;
-// [TODO] Is this also applicable for the V2 version of the chip
/*!
- * \brief Radio hardware registers initialization definition
+ * \brief Stores the last frequency error measured on LoRa received packet
*/
-// { Address, RegValue }
-
-#define RADIO_INIT_REGISTERS_VALUE \
-{ \
- { 0x0722, 0x53 }, \
- { 0x0889, 0x01 }, \
-}
-
-/*!
- * \brief Radio hardware registers initialization
- */
-const RadioRegisters_t RadioRegsInit[] = RADIO_INIT_REGISTERS_VALUE;
+volatile uint32_t FrequencyError = 0;
void SX126x::Init( void )
{
+ /*!
+ * \brief pin OPT is used to detect if the board has a TCXO or a XTAL
+ *
+ * OPT = 0 >> TCXO; OPT = 1 >> XTAL
+ */
+ DigitalIn OPT( A3 );
+
Reset( );
+
IoIrqInit( dioIrq );
+
Wakeup( );
-/****************************************************/
SetStandby( STDBY_RC );
- WriteRegister( 0x610, 0x10 );
- for( uint16_t i = 0; i < PRAM_COUNT; i++ )
+
+ if( OPT == 0 )
{
- uint32_t val = pram[i];
- WriteRegister( 0x8000 + 4 * i, 0 );
- WriteRegister( 0x8001 + 4 * i, ( val >> 16 ) & 0xff );
- WriteRegister( 0x8002 + 4 * i, ( val >> 8 ) & 0xff );
- WriteRegister( 0x8003 + 4 * i, val & 0xff );
+ SetDio3AsTcxoCtrl( TCXO_CTRL_1_7V, 6400 ); //100 ms
+ WriteReg( REG_XTA_TRIM, 0x2F );
}
- WriteRegister( 0x610, 0x00 );
- WriteCommand( RADIO_SET_PRAMSWAPCMD, ( uint8_t[] ) { 2 } , 1 ); // RADIO_SET_PRAMSWAPCMD = 0x8D,
-/****************************************************/
- SetRegistersDefault( );
-}
+
+ SetPollingMode( );
+
+ AntSwOn( );
+ SetDio2AsRfSwitchCtrl( true );
+
+ SetPacketType( PACKET_TYPE_LORA );
-void SX126x::SetRegistersDefault( void )
-{
- for( uint8_t i = 0; i < sizeof( RadioRegsInit ) / sizeof( RadioRegisters_t ); i++ )
- {
- WriteRegister( RadioRegsInit[i].Addr, RadioRegsInit[i].Value );
- }
+#ifdef USE_CONFIG_PUBLIC_NETOWRK
+ // Change LoRa modem Sync Word for Public Networks
+ WriteReg( REG_LR_SYNCWORD, ( LORA_MAC_PUBLIC_SYNCWORD >> 8 ) & 0xFF );
+ WriteReg( REG_LR_SYNCWORD + 1, LORA_MAC_PUBLIC_SYNCWORD & 0xFF );
+#else
+ // Change LoRa modem SyncWord for Private Networks
+ WriteReg( REG_LR_SYNCWORD, ( LORA_MAC_PRIVATE_SYNCWORD >> 8 ) & 0xFF );
+ WriteReg( REG_LR_SYNCWORD + 1, LORA_MAC_PRIVATE_SYNCWORD & 0xFF );
+#endif
}
-uint16_t SX126x::GetFirmwareVersion( void )
-{
- return( ( ( ReadRegister( 0xA8 ) ) << 8 ) | ( ReadRegister( 0xA9 ) ) );
-}
-
-RadioStatus_t SX126x::GetStatus( void )
+RadioOperatingModes_t SX126x::GetOperatingMode( void )
{
- uint8_t stat = 0;
- RadioStatus_t status;
-
- ReadCommand( RADIO_GET_STATUS, ( uint8_t * )&stat, 1 );
- status.Value = stat;
-
-
- return( status );
+ return OperatingMode;
}
-void SX126x::SetSleep( SleepParams_t sleepConfig )
-{
-
- WriteCommand( RADIO_SET_SLEEP, &sleepConfig.Value, 1 );
- OperatingMode = MODE_SLEEP;
-}
-
-void SX126x::SetStandby( RadioStandbyModes_t standbyConfig )
+void SX126x::CheckDeviceReady( void )
{
- WriteCommand( RADIO_SET_STANDBY, ( uint8_t* )&standbyConfig, 1 );
- if( standbyConfig == STDBY_RC )
+ if( ( GetOperatingMode( ) == MODE_SLEEP ) || ( GetOperatingMode( ) == MODE_RX_DC ) )
{
- OperatingMode = MODE_STDBY_RC;
- }
- else
- {
- OperatingMode = MODE_STDBY_XOSC;
+ Wakeup( );
+ // Switch is turned off when device is in sleep mode and turned on is all other modes
+ AntSwOn( );
}
}
-void SX126x::SetFs( void )
-{
- WriteCommand( RADIO_SET_FS, 0, 0 );
- OperatingMode = MODE_FS;
-}
-
-void SX126x::SetTx( uint32_t timeout )
-{
- uint8_t buf[3];
- buf[0] = ( uint8_t )( ( timeout >> 16 ) & 0xFF );
- buf[1] = ( uint8_t )( ( timeout >> 8 ) & 0xFF );
- buf[2] = ( uint8_t )( timeout & 0xFF );
- WriteCommand( RADIO_SET_TX, buf, 3 );
- OperatingMode = MODE_TX;
-}
-
-void SX126x::SetRx( uint32_t timeout )
-{
- uint8_t buf[3];
- buf[0] = ( uint8_t )( ( timeout >> 16 ) & 0xFF );
- buf[1] = ( uint8_t )( ( timeout >> 8 ) & 0xFF );
- buf[2] = ( uint8_t )( timeout & 0xFF );
- WriteCommand( RADIO_SET_RX, buf, 3 );
- OperatingMode = MODE_RX;
-}
-
-void SX126x::SetRxDutyCycle( uint32_t rxTime, uint32_t sleepTime )
-{
- uint8_t buf[6];
-
- buf[0] = ( uint8_t )( ( rxTime >> 16 ) & 0xFF );
- buf[1] = ( uint8_t )( ( rxTime >> 8 ) & 0xFF );
- buf[2] = ( uint8_t )( rxTime & 0xFF );
- buf[0] = ( uint8_t )( ( sleepTime >> 16 ) & 0xFF );
- buf[1] = ( uint8_t )( ( sleepTime >> 8 ) & 0xFF );
- buf[2] = ( uint8_t )( sleepTime & 0xFF );
- WriteCommand( RADIO_SET_RXDUTYCYCLE, buf, 6 );
- OperatingMode = MODE_RX;
-}
-
-void SX126x::SetCad( void )
-{
- WriteCommand( RADIO_SET_CAD, 0, 0 );
- OperatingMode = MODE_CAD;
-}
-
-void SX126x::SetAutoTxRx( uint32_t time, uint8_t intMode, uint32_t timeout )
-{
- uint32_t compensatedTime = time - ( uint16_t )AUTO_RX_TX_OFFSET;
- uint8_t buf[7];
-
- buf[0] = ( uint8_t )( ( compensatedTime >> 16 ) & 0xFF );
- buf[1] = ( uint8_t )( ( compensatedTime >> 8 ) & 0xFF );
- buf[2] = ( uint8_t )( compensatedTime & 0xFF );
- buf[3] = intMode;
- buf[4] = ( uint8_t )( ( timeout >> 16 ) & 0xFF );
- buf[5] = ( uint8_t )( ( timeout >> 8 ) & 0xFF );
- buf[6] = ( uint8_t )( timeout & 0xFF );
- WriteCommand( RADIO_SET_AUTOTXRX, buf, 7 );
-}
-
-
-void SX126x::SetTxContinuousWave( void )
-{
- WriteCommand( RADIO_SET_TXCONTINUOUSWAVE, 0, 0 );
-}
-
-void SX126x::SetTxContinuousPreamble( void )
-{
- WriteCommand( RADIO_SET_TXCONTINUOUSPREAMBLE, 0, 0 );
-}
-
-void SX126x::SetPacketType( RadioPacketType_t packetType )
-{
- // Save packet type internally to avoid questioning the radio
- this->PacketType = packetType;
-
- WriteCommand( RADIO_SET_PACKETTYPE, ( uint8_t* )&packetType, 1 );
-}
-
-RadioPacketType_t SX126x::GetPacketType( void )
-{
- return this->PacketType;
-}
-
-void SX126x::SetRfFrequency( uint32_t frequency )
-{
- uint8_t buf[4];
- uint32_t freq = 0;
-
- freq = ( uint32_t )( ( double )frequency / ( double )FREQ_STEP );
- buf[0] = ( uint8_t )( ( freq >> 24 ) & 0xFF );
- buf[1] = ( uint8_t )( ( freq >> 16 ) & 0xFF );
- buf[2] = ( uint8_t )( ( freq >> 8 ) & 0xFF );
- buf[3] = ( uint8_t )( freq & 0xFF );
- WriteCommand( RADIO_SET_RFFREQUENCY, buf, 3 );
-}
-
-void SX126x::SetTxParams( int8_t power, RadioRampTimes_t rampTime )
-{
- uint8_t buf[2];
-
- buf[0] = power ;
- buf[1] = ( uint8_t )rampTime;
- WriteCommand( RADIO_SET_TXPARAMS, buf, 2 );
-}
-
-void SX126x::SetCadConfig( RadioLoRaCadSymbols_t cadSymbolNum , uint8_t cadExitMode, uint32_t cadRxTxTimeout)
-{
- uint8_t buf[5];
- buf[0] = ( uint8_t )cadSymbolNum;
- buf[1] = cadExitMode;
- buf[2] = ( uint8_t )( ( cadRxTxTimeout >> 16 ) & 0xFF );
- buf[3] = ( uint8_t )( ( cadRxTxTimeout >> 8 ) & 0xFF );
- buf[4] = ( uint8_t )( cadRxTxTimeout & 0xFF );
- WriteCommand( RADIO_SET_CADPARAMS, buf, 5 );
- OperatingMode = MODE_CAD;
-}
-
-void SX126x::SetBufferBaseAddresses( uint8_t txBaseAddress, uint8_t rxBaseAddress )
-{
- uint8_t buf[2];
-
- buf[0] = txBaseAddress;
- buf[1] = rxBaseAddress;
- WriteCommand( RADIO_SET_BUFFERBASEADDRESS, buf, 2 );
-}
-
-void SX126x::SetModulationParams( ModulationParams_t *modulationParams )
+void SX126x::SetPayload( uint8_t *payload, uint8_t size )
{
- uint8_t n;
- uint32_t tempVal = 0;
- uint8_t buf[8] = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 };
-
- // Check if required configuration corresponds to the stored packet type
- // If not, silently update radio packet type
- if( this->PacketType != modulationParams->PacketType )
- {
- this->SetPacketType( modulationParams->PacketType );
- }
-
- switch( modulationParams->PacketType )
- {
- case PACKET_TYPE_GFSK:
- tempVal = ( uint32_t )( ( double )XTAL_FREQ / ( double )modulationParams->Params.Gfsk.BitRate );
- tempVal = tempVal * 32;
- buf[0] = ( tempVal >> 16 ) & 0xFF;
- buf[1] = ( tempVal >> 8 ) & 0xFF;
- buf[2] = tempVal & 0xFF;
-
- buf[3] = modulationParams->Params.Gfsk.PulseShape;
- buf[4] = modulationParams->Params.Gfsk.BW;
-
- tempVal = ( uint32_t )( ( double )FREQ_STEP * ( double )modulationParams->Params.Gfsk.Fdev );
- buf[5] = ( tempVal >> 16 ) & 0xFF;
- buf[6] = ( tempVal >> 8 ) & 0xFF;
- buf[7] = ( tempVal& 0xFF );
- n = 8;
- break;
-
- case PACKET_TYPE_LORA:
- n = 3;
- buf[0] = modulationParams->Params.LoRa.SpreadingFactor;
- buf[1] = modulationParams->Params.LoRa.Bandwidth;
- buf[2] = modulationParams->Params.LoRa.CodingRate;
- break;
-
- case PACKET_TYPE_RESERVED:
- return;
- }
- WriteCommand( RADIO_SET_MODULATIONPARAMS, buf, n );
-}
-
-void SX126x::SetPacketParams( PacketParams_t *packetParams )
-{
- uint8_t n;
-
- // Check if required configuration corresponds to the stored packet type
- // If not, silently update radio packet type
- if( this->PacketType != packetParams->PacketType )
- {
- this->SetPacketType( packetParams->PacketType );
- }
-
- switch( packetParams->PacketType )
- {
- case PACKET_TYPE_GFSK:
- n = 8;
- break;
- case PACKET_TYPE_LORA:
- n = 5;
- break;
- case PACKET_TYPE_RESERVED:
- return;
- }
- WriteCommand( RADIO_SET_PACKETPARAMS, packetParams->Params.Buffer, n );
-}
-
-void SX126x::GetRxBufferStatus( uint8_t *payloadLength, uint8_t *rxStartBufferPointer )
-{
- uint8_t status[2];
-
- ReadCommand( RADIO_GET_RXBUFFERSTATUS, status, 2 );
-
- *payloadLength = status[0];
- *rxStartBufferPointer = status[1];
-}
-
-void SX126x::GetPacketStatus( PacketStatus_t *pktStatus )
-{
- uint8_t status[3];
-
-
- ReadCommand( RADIO_GET_PACKETSTATUS, status, 3 );
-
- pktStatus->packetType = this -> GetPacketType( );
- switch( pktStatus->packetType )
- {
- case PACKET_TYPE_GFSK:
- pktStatus->Gfsk.RxStatus = status[0];
- pktStatus->Gfsk.RssiSync = -status[1] / 2;
- pktStatus->Gfsk.RssiAvg = -status[2] / 2;
- break;
-
- case PACKET_TYPE_LORA:
- pktStatus->LoRa.RssiPkt = -status[0] / 2;
- ( status[1] < 128 ) ? ( pktStatus->LoRa.SnrPkt = status[1] / 4 ) : ( pktStatus->LoRa.SnrPkt = ( ( status[1] - 256 ) /4 ) );
- pktStatus->LoRa.SignalRssiPkt = -status[2] / 2;
- break;
-
- case PACKET_TYPE_RESERVED:
- // In that specific case, we set everything in the pktStatus to zeros
- // and reset the packet type accordingly
- memset( pktStatus, 0, sizeof( PacketStatus_t ) );
- pktStatus->packetType = PACKET_TYPE_RESERVED;
- break;
- }
-}
-
-int8_t SX126x::GetRssiInst( void )
-{
- int8_t rssi;
-
- ReadCommand( RADIO_GET_RSSIINST, ( uint8_t* )&rssi, 1 );
- return -rssi / 2;
-}
-
-void SX126x::GetStats( RxCounter_t *rxCounter )
-{
- uint8_t status[6];
-
-
- rxCounter->packetType = this -> GetPacketType( );
- ReadCommand( RADIO_GET_STATS, status, 6 );
- rxCounter->NbPktReceived = ( status[0] << 8 ) | status[1];
- rxCounter->NbPktCrcOk = ( status[2] << 8 ) | status[3];
- rxCounter->NbPktLengthError = ( status[4] << 8 ) | status[4];
-}
-
-void SX126x::ResetStats( )
-{
- uint8_t status[6];
-
- memset( status, 0, sizeof( status ) );
- WriteCommand( RADIO_RESET_STATS, status, 6 );
-}
-
-uint8_t SX126x::GetError()
-{
- uint8_t error;
-
- ReadCommand( RADIO_GET_ERROR, &error, 1 );
- return error;
-}
-
-
-void SX126x::SetDioIrqParams( uint16_t irqMask, uint16_t dio1Mask, uint16_t dio2Mask, uint16_t dio3Mask )
-{
- uint8_t buf[8];
-
- buf[0] = ( uint8_t )( ( irqMask >> 8 ) & 0x00FF );
- buf[1] = ( uint8_t )( irqMask & 0x00FF );
- buf[2] = ( uint8_t )( ( dio1Mask >> 8 ) & 0x00FF );
- buf[3] = ( uint8_t )( dio1Mask & 0x00FF );
- buf[4] = ( uint8_t )( ( dio2Mask >> 8 ) & 0x00FF );
- buf[5] = ( uint8_t )( dio2Mask & 0x00FF );
- buf[6] = ( uint8_t )( ( dio3Mask >> 8 ) & 0x00FF );
- buf[7] = ( uint8_t )( dio3Mask & 0x00FF );
- WriteCommand( RADIO_CFG_DIOIRQ, buf, 8 );
-}
-
-uint16_t SX126x::GetIrqStatus( void )
-{
- uint8_t irqStatus[2];
- ReadCommand( RADIO_GET_IRQSTATUS, irqStatus, 2 );
- return ( irqStatus[0] << 8 ) | irqStatus[1];
-}
-
-void SX126x::ClearIrqStatus( uint16_t irq )
-{
- uint8_t buf[2];
-
- buf[0] = ( uint8_t )( ( ( uint16_t )irq >> 8 ) & 0x00FF );
- buf[1] = ( uint8_t )( ( uint16_t )irq & 0x00FF );
- WriteCommand( RADIO_CLR_IRQSTATUS, buf, 2 );
-}
-
-void SX126x::Calibrate( CalibrationParams_t calibParam )
-{
- WriteCommand( RADIO_CALIBRATE, &calibParam.Value, 1 );
-}
-
-void SX126x::SetRegulatorMode( uint8_t mode )
-{
- WriteCommand( RADIO_SET_REGULATORMODE, &mode, 1 );
-}
-
-
-void SX126x::SetLongPreamble( uint8_t enable )
-{
- WriteCommand( RADIO_SET_LONGPREAMBLE, &enable, 1 );
-}
-
-void SX126x::SetPayload( uint8_t *buffer, uint8_t size )
-{
- WriteBuffer( 0x00, buffer, size );
+ WriteBuffer( 0x00, payload, size );
}
uint8_t SX126x::GetPayload( uint8_t *buffer, uint8_t *size, uint8_t maxSize )
{
- uint8_t offset;
+ uint8_t offset = 0;
GetRxBufferStatus( size, &offset );
- if(*size > maxSize)
+ if( *size > maxSize )
{
return 1;
}
@@ -468,14 +119,16 @@
void SX126x::SetCrcSeed( uint16_t seed )
{
uint8_t buf[2];
+
buf[0] = ( uint8_t )( ( seed >> 8 ) & 0xFF );
buf[1] = ( uint8_t )( seed & 0xFF );
-
+
switch( GetPacketType( ) )
{
case PACKET_TYPE_GFSK:
WriteRegister( REG_LR_CRCSEEDBASEADDR, buf, 2 );
break;
+
default:
break;
}
@@ -484,147 +137,721 @@
void SX126x::SetCrcPolynomial( uint16_t polynomial )
{
uint8_t buf[2];
+
buf[0] = ( uint8_t )( ( polynomial >> 8 ) & 0xFF );
buf[1] = ( uint8_t )( polynomial & 0xFF );
-
+
switch( GetPacketType( ) )
{
case PACKET_TYPE_GFSK:
WriteRegister( REG_LR_CRCPOLYBASEADDR, buf, 2 );
break;
+
default:
break;
}
}
-void SX126x::SetWhiteningSeed( uint8_t seed )
+void SX126x::SetWhiteningSeed( uint16_t seed )
{
+ uint8_t regValue = 0;
+
switch( GetPacketType( ) )
{
case PACKET_TYPE_GFSK:
- WriteRegister( REG_LR_WHITSEEDBASEADDR, seed );
+ regValue = ReadReg( REG_LR_WHITSEEDBASEADDR_MSB ) & 0xFE;
+ regValue = ( ( seed >> 8 ) & 0x01 ) | regValue;
+ WriteReg( REG_LR_WHITSEEDBASEADDR_MSB, regValue ); // only 1 bit.
+ WriteReg( REG_LR_WHITSEEDBASEADDR_LSB, ( uint8_t )seed );
break;
+
default:
break;
}
}
-int8_t SX126x::ParseHexFileLine( char* line )
+uint32_t SX126x::GetRandom( void )
+{
+ uint8_t buf[] = { 0, 0, 0, 0 };
+
+ // Set radio in continuous reception
+ SetRx( 0 );
+
+ wait_ms( 1 );
+
+ ReadRegister( RANDOM_NUMBER_GENERATORBASEADDR, buf, 4 );
+
+ SetStandby( STDBY_RC );
+
+ return ( buf[0] << 24 ) | ( buf[1] << 16 ) | ( buf[2] << 8 ) | buf[3];
+}
+
+void SX126x::SetSleep( SleepParams_t sleepConfig )
{
- uint16_t addr;
- uint16_t n;
- uint8_t code;
- uint8_t bytes[256];
+#ifdef ADV_DEBUG
+ printf("SetSleep ");
+#endif
+
+ AntSwOff( );
+
+ WriteCommand( RADIO_SET_SLEEP, &sleepConfig.Value, 1 );
+ OperatingMode = MODE_SLEEP;
+}
- if( GetHexFileLineFields( line, bytes, &addr, &n, &code ) != 0 )
+void SX126x::SetStandby( RadioStandbyModes_t standbyConfig )
+{
+#ifdef ADV_DEBUG
+ printf("SetStandby ");
+#endif
+ WriteCommand( RADIO_SET_STANDBY, ( uint8_t* )&standbyConfig, 1 );
+ if( standbyConfig == STDBY_RC )
+ {
+ OperatingMode = MODE_STDBY_RC;
+ }
+ else
{
- if( code == 0 )
+ OperatingMode = MODE_STDBY_XOSC;
+ }
+}
+
+void SX126x::SetFs( void )
+{
+#ifdef ADV_DEBUG
+ printf("SetFs ");
+#endif
+ WriteCommand( RADIO_SET_FS, 0, 0 );
+ OperatingMode = MODE_FS;
+}
+
+void SX126x::SetTx( uint32_t timeout )
+{
+ uint8_t buf[3];
+
+ OperatingMode = MODE_TX;
+
+#ifdef ADV_DEBUG
+ printf("SetTx ");
+#endif
+
+ buf[0] = ( uint8_t )( ( timeout >> 16 ) & 0xFF );
+ buf[1] = ( uint8_t )( ( timeout >> 8 ) & 0xFF );
+ buf[2] = ( uint8_t )( timeout & 0xFF );
+ WriteCommand( RADIO_SET_TX, buf, 3 );
+}
+
+void SX126x::SetRxBoosted( uint32_t timeout )
+{
+ uint8_t buf[3];
+
+ OperatingMode = MODE_RX;
+
+#ifdef ADV_DEBUG
+ printf("SetRxBoosted ");
+#endif
+
+ WriteReg( REG_RX_GAIN, 0x96 ); // max LNA gain, increase current by ~2mA for around ~3dB in sensivity
+
+ buf[0] = ( uint8_t )( ( timeout >> 16 ) & 0xFF );
+ buf[1] = ( uint8_t )( ( timeout >> 8 ) & 0xFF );
+ buf[2] = ( uint8_t )( timeout & 0xFF );
+ WriteCommand( RADIO_SET_RX, buf, 3 );
+}
+
+void SX126x::SetRx( uint32_t timeout )
+{
+ uint8_t buf[3];
+
+ OperatingMode = MODE_RX;
+
+#ifdef ADV_DEBUG
+ printf("SetRx ");
+#endif
+
+ buf[0] = ( uint8_t )( ( timeout >> 16 ) & 0xFF );
+ buf[1] = ( uint8_t )( ( timeout >> 8 ) & 0xFF );
+ buf[2] = ( uint8_t )( timeout & 0xFF );
+ WriteCommand( RADIO_SET_RX, buf, 3 );
+}
+
+void SX126x::SetRxDutyCycle( uint32_t rxTime, uint32_t sleepTime )
+{
+ uint8_t buf[6];
+
+ SetLongPreamble( true );
+
+ buf[0] = ( uint8_t )( ( rxTime >> 16 ) & 0xFF );
+ buf[1] = ( uint8_t )( ( rxTime >> 8 ) & 0xFF );
+ buf[2] = ( uint8_t )( rxTime & 0xFF );
+ buf[3] = ( uint8_t )( ( sleepTime >> 16 ) & 0xFF );
+ buf[4] = ( uint8_t )( ( sleepTime >> 8 ) & 0xFF );
+ buf[5] = ( uint8_t )( sleepTime & 0xFF );
+ WriteCommand( RADIO_SET_RXDUTYCYCLE, buf, 6 );
+ OperatingMode = MODE_RX_DC;
+}
+
+void SX126x::SetCad( void )
+{
+ WriteCommand( RADIO_SET_CAD, 0, 0 );
+ OperatingMode = MODE_CAD;
+}
+
+void SX126x::SetTxContinuousWave( void )
+{
+#ifdef ADV_DEBUG
+ printf("SetTxContinuousWave ");
+#endif
+ WriteCommand( RADIO_SET_TXCONTINUOUSWAVE, 0, 0 );
+}
+
+void SX126x::SetTxInfinitePreamble( void )
+{
+#ifdef ADV_DEBUG
+ printf("SetTxContinuousPreamble ");
+#endif
+ WriteCommand( RADIO_SET_TXCONTINUOUSPREAMBLE, 0, 0 );
+}
+
+void SX126x::SetStopRxTimerOnPreambleDetect( bool enable )
+{
+ WriteCommand( RADIO_SET_STOPRXTIMERONPREAMBLE, ( uint8_t* )&enable, 1 );
+}
+
+void SX126x::SetLoRaSymbNumTimeout( uint8_t SymbNum )
+{
+ WriteCommand( RADIO_SET_LORASYMBTIMEOUT, &SymbNum, 1 );
+}
+
+void SX126x::SetRegulatorMode( RadioRegulatorMode_t mode )
+{
+#ifdef ADV_DEBUG
+ printf("SetRegulatorMode ");
+#endif
+ WriteCommand( RADIO_SET_REGULATORMODE, ( uint8_t* )&mode, 1 );
+}
+
+void SX126x::Calibrate( CalibrationParams_t calibParam )
+{
+ WriteCommand( RADIO_CALIBRATE, &calibParam.Value, 1 );
+}
+
+void SX126x::SetLongPreamble( uint8_t enable )
+{
+ WriteCommand( RADIO_SET_LONGPREAMBLE, &enable, 1 );
+}
+
+void SX126x::SetPaConfig( uint8_t paDutyCycle, uint8_t HpMax, uint8_t deviceSel, uint8_t paLUT )
+{
+ uint8_t buf[4];
+
+#ifdef ADV_DEBUG
+ printf("SetPaConfig ");
+#endif
+
+ buf[0] = paDutyCycle;
+ buf[1] = HpMax;
+ buf[2] = deviceSel;
+ buf[3] = paLUT;
+ WriteCommand( RADIO_SET_PACONFIG, buf, 4 );
+}
+
+void SX126x::SetRxTxFallbackMode( uint8_t fallbackMode )
+{
+ WriteCommand( RADIO_SET_TXFALLBACKMODE, &fallbackMode, 1 );
+}
+
+void SX126x::SetDioIrqParams( uint16_t irqMask, uint16_t dio1Mask, uint16_t dio2Mask, uint16_t dio3Mask )
+{
+ uint8_t buf[8];
+
+#ifdef ADV_DEBUG
+ printf("SetDioIrqParams ");
+#endif
+
+ buf[0] = ( uint8_t )( ( irqMask >> 8 ) & 0x00FF );
+ buf[1] = ( uint8_t )( irqMask & 0x00FF );
+ buf[2] = ( uint8_t )( ( dio1Mask >> 8 ) & 0x00FF );
+ buf[3] = ( uint8_t )( dio1Mask & 0x00FF );
+ buf[4] = ( uint8_t )( ( dio2Mask >> 8 ) & 0x00FF );
+ buf[5] = ( uint8_t )( dio2Mask & 0x00FF );
+ buf[6] = ( uint8_t )( ( dio3Mask >> 8 ) & 0x00FF );
+ buf[7] = ( uint8_t )( dio3Mask & 0x00FF );
+ WriteCommand( RADIO_CFG_DIOIRQ, buf, 8 );
+}
+
+uint16_t SX126x::GetIrqStatus( void )
+{
+ uint8_t irqStatus[2];
+
+ ReadCommand( RADIO_GET_IRQSTATUS, irqStatus, 2 );
+ return ( irqStatus[0] << 8 ) | irqStatus[1];
+}
+
+void SX126x::SetDio2AsRfSwitchCtrl( uint8_t enable )
+{
+#ifdef ADV_DEBUG
+ printf("SetDio2AsRfSwitchCtrl ");
+#endif
+ WriteCommand( RADIO_SET_RFSWITCHMODE, &enable, 1 );
+}
+
+void SX126x::SetDio3AsTcxoCtrl( RadioTcxoCtrlVoltage_t tcxoVoltage, uint32_t timeout )
+{
+ uint8_t buf[4];
+
+ buf[0] = tcxoVoltage & 0x08;
+ buf[1] = ( uint8_t )( ( timeout >> 16 ) & 0xFF );
+ buf[2] = ( uint8_t )( ( timeout >> 8 ) & 0xFF );
+ buf[3] = ( uint8_t )( timeout & 0xFF );
+
+ WriteCommand( RADIO_SET_TCXOMODE, buf, 4 );
+}
+
+void SX126x::SetRfFrequency( uint32_t frequency )
+{
+ uint8_t buf[4];
+ uint32_t freq = 0;
+
+#ifdef ADV_DEBUG
+ printf("SetRfFrequency ");
+#endif
+
+ freq = ( uint32_t )( ( double )frequency / ( double )FREQ_STEP );
+ buf[0] = ( uint8_t )( ( freq >> 24 ) & 0xFF );
+ buf[1] = ( uint8_t )( ( freq >> 16 ) & 0xFF );
+ buf[2] = ( uint8_t )( ( freq >> 8 ) & 0xFF );
+ buf[3] = ( uint8_t )( freq & 0xFF );
+ WriteCommand( RADIO_SET_RFFREQUENCY, buf, 4 );
+}
+
+void SX126x::SetPacketType( RadioPacketTypes_t packetType )
+{
+#ifdef ADV_DEBUG
+ printf("SetPacketType ");
+#endif
+
+ // Save packet type internally to avoid questioning the radio
+ this->PacketType = packetType;
+
+ if( packetType == PACKET_TYPE_GFSK )
+ {
+ WriteReg( REG_BIT_SYNC, 0x00 );
+ }
+
+ WriteCommand( RADIO_SET_PACKETTYPE, ( uint8_t* )&packetType, 1 );
+}
+
+RadioPacketTypes_t SX126x::GetPacketType( void )
+{
+ return this->PacketType;
+}
+
+void SX126x::SetTxParams( int8_t power, RadioRampTimes_t rampTime )
+{
+ uint8_t buf[2];
+ DigitalIn OPT( A3 );
+
+#ifdef ADV_DEBUG
+ printf("SetTxParams ");
+#endif
+
+ if( GetDeviceType( ) == 1 ) // sx1261
+ {
+ if( power == 15 )
{
- WriteRegister( addr, bytes, n );
+ SetPaConfig( 0x06, 0x00, 0x01, 0x00 );
}
- if( code == 1 )
- { // end of file
- //return 2;
+ else
+ {
+ SetPaConfig( 0x04, 0x00, 0x01, 0x00 );
+ }
+ if( power >= 14 )
+ {
+ power = 14;
+ }
+ else if( power < -3 )
+ {
+ power = -3;
}
- if( code == 2 )
- { // begin of file
- //return 3;
+ }
+ else // sx1262
+ {
+ SetPaConfig( 0x04, 0x07, 0x00, 0x01 );
+ if( power > 22 )
+ {
+ power = 22;
+ }
+ else if( power < -3 )
+ {
+ power = -3;
+ }
+ }
+ buf[0] = power;
+ if( OPT == 0 )
+ {
+ if( ( uint8_t )rampTime < RADIO_RAMP_200_US )
+ {
+ buf[1] = RADIO_RAMP_200_US;
+ }
+ else
+ {
+ buf[1] = ( uint8_t )rampTime;
}
}
else
{
- return 0;
+ buf[1] = ( uint8_t )rampTime;
+ }
+ WriteCommand( RADIO_SET_TXPARAMS, buf, 2 );
+}
+
+void SX126x::SetModulationParams( ModulationParams_t *modulationParams )
+{
+ uint8_t n;
+ uint32_t tempVal = 0;
+ uint8_t buf[8] = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 };
+
+#ifdef ADV_DEBUG
+ printf("SetModulationParams ");
+#endif
+
+ // Check if required configuration corresponds to the stored packet type
+ // If not, silently update radio packet type
+ if( this->PacketType != modulationParams->PacketType )
+ {
+ this->SetPacketType( modulationParams->PacketType );
}
- return 1;
+
+ switch( modulationParams->PacketType )
+ {
+ case PACKET_TYPE_GFSK:
+ n = 8;
+ tempVal = ( uint32_t )( 32 * ( ( double )XTAL_FREQ / ( double )modulationParams->Params.Gfsk.BitRate ) );
+ buf[0] = ( tempVal >> 16 ) & 0xFF;
+ buf[1] = ( tempVal >> 8 ) & 0xFF;
+ buf[2] = tempVal & 0xFF;
+ buf[3] = modulationParams->Params.Gfsk.ModulationShaping;
+ buf[4] = modulationParams->Params.Gfsk.Bandwidth;
+ tempVal = ( uint32_t )( ( double )modulationParams->Params.Gfsk.Fdev / ( double )FREQ_STEP );
+ buf[5] = ( tempVal >> 16 ) & 0xFF;
+ buf[6] = ( tempVal >> 8 ) & 0xFF;
+ buf[7] = ( tempVal& 0xFF );
+ break;
+ case PACKET_TYPE_LORA:
+ n = 4;
+ switch( modulationParams->Params.LoRa.Bandwidth )
+ {
+ case LORA_BW_500:
+ modulationParams->Params.LoRa.LowDatarateOptimize = 0x00;
+ break;
+ case LORA_BW_250:
+ if( modulationParams->Params.LoRa.SpreadingFactor == 12 )
+ {
+ modulationParams->Params.LoRa.LowDatarateOptimize = 0x01;
+ }
+ else
+ {
+ modulationParams->Params.LoRa.LowDatarateOptimize = 0x00;
+ }
+ break;
+ case LORA_BW_125:
+ if( modulationParams->Params.LoRa.SpreadingFactor >= 11 )
+ {
+ modulationParams->Params.LoRa.LowDatarateOptimize = 0x01;
+ }
+ else
+ {
+ modulationParams->Params.LoRa.LowDatarateOptimize = 0x00;
+ }
+ break;
+ case LORA_BW_062:
+ if( modulationParams->Params.LoRa.SpreadingFactor >= 10 )
+ {
+ modulationParams->Params.LoRa.LowDatarateOptimize = 0x01;
+ }
+ else
+ {
+ modulationParams->Params.LoRa.LowDatarateOptimize = 0x00;
+ }
+ break;
+ case LORA_BW_041:
+ if( modulationParams->Params.LoRa.SpreadingFactor >= 9 )
+ {
+ modulationParams->Params.LoRa.LowDatarateOptimize = 0x01;
+ }
+ else
+ {
+ modulationParams->Params.LoRa.LowDatarateOptimize = 0x00;
+ }
+ break;
+ case LORA_BW_031:
+ case LORA_BW_020:
+ case LORA_BW_015:
+ case LORA_BW_010:
+ case LORA_BW_007:
+ modulationParams->Params.LoRa.LowDatarateOptimize = 0x01;
+ break;
+ default:
+ break;
+ }
+ buf[0] = modulationParams->Params.LoRa.SpreadingFactor;
+ buf[1] = modulationParams->Params.LoRa.Bandwidth;
+ buf[2] = modulationParams->Params.LoRa.CodingRate;
+ buf[3] = modulationParams->Params.LoRa.LowDatarateOptimize;
+ break;
+ default:
+ case PACKET_TYPE_NONE:
+ return;
+ }
+ WriteCommand( RADIO_SET_MODULATIONPARAMS, buf, n );
}
-int8_t SX126x::GetHexFileLineFields( char* line, uint8_t *bytes, uint16_t *addr, uint16_t *num, uint8_t *code )
+void SX126x::SetPacketParams( PacketParams_t *packetParams )
{
- uint16_t sum, len, cksum;
- char *ptr;
+ uint8_t n;
+ uint8_t crcVal = 0;
+ uint8_t buf[9] = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 };
- *num = 0;
- if( line[0] != ':' )
- {
- return 0;
- }
- if( strlen( line ) < 11 )
- {
- return 0;
- }
- ptr = line + 1;
- if( !sscanf( ptr, "%02hx", &len ) )
- {
- return 0;
- }
- ptr += 2;
- if( strlen( line ) < ( 11 + ( len * 2 ) ) )
- {
- return 0;
- }
- if( !sscanf( ptr, "%04hx", addr ) )
+#ifdef ADV_DEBUG
+ printf("SetPacketParams ");
+#endif
+
+ // Check if required configuration corresponds to the stored packet type
+ // If not, silently update radio packet type
+ if( this->PacketType != packetParams->PacketType )
{
- return 0;
- }
- ptr += 4;
- if( !sscanf( ptr, "%02hhx", code ) )
- {
- return 0;
- }
- ptr += 2;
- sum = ( len & 255 ) + ( ( *addr >> 8 ) & 255 ) + ( *addr & 255 ) + ( ( *code >> 8 ) & 255 ) + ( *code & 255 );
- while( *num != len )
- {
- if( !sscanf( ptr, "%02hhx", &bytes[*num] ) )
- {
- return 0;
- }
- ptr += 2;
- sum += bytes[*num] & 255;
- ( *num )++;
- if( *num >= 256 )
- {
- return 0;
- }
- }
- if( !sscanf( ptr, "%02hx", &cksum ) )
- {
- return 0;
- }
- if( ( ( sum & 255 ) + ( cksum & 255 ) ) & 255 )
- {
- return 0; // checksum error
+ this->SetPacketType( packetParams->PacketType );
}
- return 1;
+ switch( packetParams->PacketType )
+ {
+ case PACKET_TYPE_GFSK:
+ if( packetParams->Params.Gfsk.CrcLength == RADIO_CRC_2_BYTES_IBM )
+ {
+ SetCrcSeed( CRC_IBM_SEED );
+ SetCrcPolynomial( CRC_POLYNOMIAL_IBM );
+ crcVal = RADIO_CRC_2_BYTES;
+ }
+ else if( packetParams->Params.Gfsk.CrcLength == RADIO_CRC_2_BYTES_CCIT )
+ {
+ SetCrcSeed( CRC_CCITT_SEED );
+ SetCrcPolynomial( CRC_POLYNOMIAL_CCITT );
+ crcVal = RADIO_CRC_2_BYTES_INV;
+ }
+ else
+ {
+ crcVal = packetParams->Params.Gfsk.CrcLength;
+ }
+ n = 9;
+ // convert preamble length from byte to bit
+ packetParams->Params.Gfsk.PreambleLength = packetParams->Params.Gfsk.PreambleLength << 3;
+
+ buf[0] = ( packetParams->Params.Gfsk.PreambleLength >> 8 ) & 0xFF;
+ buf[1] = packetParams->Params.Gfsk.PreambleLength;
+ buf[2] = packetParams->Params.Gfsk.PreambleMinDetect;
+ buf[3] = ( packetParams->Params.Gfsk.SyncWordLength << 3 ); // convert from byte to bit
+ buf[4] = packetParams->Params.Gfsk.AddrComp;
+ buf[5] = packetParams->Params.Gfsk.HeaderType;
+ buf[6] = packetParams->Params.Gfsk.PayloadLength;
+ buf[7] = crcVal;
+ buf[8] = packetParams->Params.Gfsk.DcFree;
+ break;
+ case PACKET_TYPE_LORA:
+ n = 6;
+ buf[0] = ( packetParams->Params.LoRa.PreambleLength >> 8 ) & 0xFF;
+ buf[1] = packetParams->Params.LoRa.PreambleLength;
+ buf[2] = packetParams->Params.LoRa.HeaderType;
+ buf[3] = packetParams->Params.LoRa.PayloadLength;
+ buf[4] = packetParams->Params.LoRa.CrcMode;
+ buf[5] = packetParams->Params.LoRa.InvertIQ;
+ break;
+ default:
+ case PACKET_TYPE_NONE:
+ return;
+ }
+ WriteCommand( RADIO_SET_PACKETPARAMS, buf, n );
+}
+
+void SX126x::SetCadParams( RadioLoRaCadSymbols_t cadSymbolNum, uint8_t cadDetPeak, uint8_t cadDetMin, RadioCadExitModes_t cadExitMode, uint32_t cadTimeout )
+{
+ uint8_t buf[7];
+
+ buf[0] = ( uint8_t )cadSymbolNum;
+ buf[1] = cadDetPeak;
+ buf[2] = cadDetMin;
+ buf[3] = ( uint8_t )cadExitMode;
+ buf[4] = ( uint8_t )( ( cadTimeout >> 16 ) & 0xFF );
+ buf[5] = ( uint8_t )( ( cadTimeout >> 8 ) & 0xFF );
+ buf[6] = ( uint8_t )( cadTimeout & 0xFF );
+ WriteCommand( RADIO_SET_CADPARAMS, buf, 5 );
+ OperatingMode = MODE_CAD;
+}
+
+void SX126x::SetBufferBaseAddresses( uint8_t txBaseAddress, uint8_t rxBaseAddress )
+{
+ uint8_t buf[2];
+
+#ifdef ADV_DEBUG
+ printf("SetBufferBaseAddresses ");
+#endif
+
+ buf[0] = txBaseAddress;
+ buf[1] = rxBaseAddress;
+ WriteCommand( RADIO_SET_BUFFERBASEADDRESS, buf, 2 );
+}
+
+RadioStatus_t SX126x::GetStatus( void )
+{
+ uint8_t stat = 0;
+ RadioStatus_t status;
+
+ ReadCommand( RADIO_GET_STATUS, ( uint8_t * )&stat, 1 );
+ status.Value = stat;
+ return status;
+}
+
+int8_t SX126x::GetRssiInst( void )
+{
+ int8_t rssi;
+
+ ReadCommand( RADIO_GET_RSSIINST, ( uint8_t* )&rssi, 1 );
+ return( -( rssi / 2 ) );
+}
+
+void SX126x::GetRxBufferStatus( uint8_t *payloadLength, uint8_t *rxStartBufferPointer )
+{
+ uint8_t status[2];
+
+ ReadCommand( RADIO_GET_RXBUFFERSTATUS, status, 2 );
+
+ // In case of LORA fixed header, the payloadLength is obtained by reading
+ // the register REG_LR_PAYLOADLENGTH
+ if( ( this->GetPacketType( ) == PACKET_TYPE_LORA ) && ( ReadReg( REG_LR_PACKETPARAMS ) >> 7 == 1 ) )
+ {
+ *payloadLength = ReadReg( REG_LR_PAYLOADLENGTH );
+ }
+ else
+ {
+ *payloadLength = status[0];
+ }
+ *rxStartBufferPointer = status[1];
+}
+
+void SX126x::GetPacketStatus( PacketStatus_t *pktStatus )
+{
+ uint8_t status[3];
+
+ ReadCommand( RADIO_GET_PACKETSTATUS, status, 3 );
+
+ pktStatus->packetType = this -> GetPacketType( );
+ switch( pktStatus->packetType )
+ {
+ case PACKET_TYPE_GFSK:
+ pktStatus->Params.Gfsk.RxStatus = status[0];
+ pktStatus->Params.Gfsk.RssiSync = -status[1] / 2;
+ pktStatus->Params.Gfsk.RssiAvg = -status[2] / 2;
+ pktStatus->Params.Gfsk.FreqError = 0;
+ break;
+
+ case PACKET_TYPE_LORA:
+ pktStatus->Params.LoRa.RssiPkt = -status[0] / 2;
+ ( status[1] < 128 ) ? ( pktStatus->Params.LoRa.SnrPkt = status[1] / 4 ) : ( pktStatus->Params.LoRa.SnrPkt = ( ( status[1] - 256 ) /4 ) );
+ pktStatus->Params.LoRa.SignalRssiPkt = -status[2] / 2;
+ pktStatus->Params.LoRa.FreqError = FrequencyError;
+ break;
+
+ default:
+ case PACKET_TYPE_NONE:
+ // In that specific case, we set everything in the pktStatus to zeros
+ // and reset the packet type accordingly
+ memset( pktStatus, 0, sizeof( PacketStatus_t ) );
+ pktStatus->packetType = PACKET_TYPE_NONE;
+ break;
+ }
+}
+
+RadioError_t SX126x::GetDeviceErrors( void )
+{
+ RadioError_t error;
+
+ ReadCommand( RADIO_GET_ERROR, ( uint8_t * )&error, 2 );
+ return error;
+}
+
+void SX126x::ClearIrqStatus( uint16_t irq )
+{
+ uint8_t buf[2];
+#ifdef ADV_DEBUG
+ printf("ClearIrqStatus ");
+#endif
+ buf[0] = ( uint8_t )( ( ( uint16_t )irq >> 8 ) & 0x00FF );
+ buf[1] = ( uint8_t )( ( uint16_t )irq & 0x00FF );
+ WriteCommand( RADIO_CLR_IRQSTATUS, buf, 2 );
+}
+
+void SX126x::SetPollingMode( void )
+{
+ this->PollingMode = true;
+}
+
+void SX126x::SetInterruptMode( void )
+{
+ this->PollingMode = false;
}
void SX126x::OnDioIrq( void )
{
- if( onCustomDioIrq != NULL )
+ /*
+ * When polling mode is activated, it is up to the application to call
+ * ProcessIrqs( ). Otherwise, the driver automatically calls ProcessIrqs( )
+ * on radio interrupt.
+ */
+ if( this->PollingMode == true )
+ {
+ this->IrqState = true;
+ }
+ else
{
- onCustomDioIrq();
- return;
+ this->ProcessIrqs( );
+ }
+}
+
+void SX126x::ProcessIrqs( void )
+{
+ if( this->PollingMode == true )
+ {
+ if( this->IrqState == true )
+ {
+ __disable_irq( );
+ this->IrqState = false;
+ __enable_irq( );
+ }
+ else
+ {
+ return;
+ }
}
uint16_t irqRegs = GetIrqStatus( );
- LastIrqs = irqRegs;
-// printf("0x%04x\n\r", irqRegs );
ClearIrqStatus( IRQ_RADIO_ALL );
+#ifdef ADV_DEBUG
+ printf("0x%04x\n\r", irqRegs );
+#endif
-#if( SX126x_DEBUG == 1 )
- DigitalOut TEST_PIN_1( D14 );
- DigitalOut TEST_PIN_2( D15 );
- for( int i = 0x8000; i != 0; i >>= 1 )
+ if( ( irqRegs & IRQ_HEADER_VALID ) == IRQ_HEADER_VALID )
{
- TEST_PIN_2 = 0;
- TEST_PIN_1 = ( ( irqRegs & i ) != 0 ) ? 1 : 0;
- TEST_PIN_2 = 1;
+ // LoRa Only
+ FrequencyError = 0x000000 | ( ( 0x0F & ReadReg( 0x076A ) ) << 16 );
+ FrequencyError = FrequencyError | ( ReadReg( 0x076B ) << 8 );
+ FrequencyError = FrequencyError | ( ReadReg( 0x076c ) );
}
- TEST_PIN_1 = 0;
- TEST_PIN_2 = 0;
-#endif
+
+ if( ( irqRegs & IRQ_SYNCWORD_VALID ) == IRQ_SYNCWORD_VALID )
+ {
+ // GFSK Only
+ FrequencyError = 0x000000 | ( ( 0x0F & ReadReg( 0x06B0 ) ) << 8 );
+ FrequencyError = FrequencyError | ( ReadReg( 0x06B1 ) );
+ }
if( ( irqRegs & IRQ_TX_DONE ) == IRQ_TX_DONE )
{
@@ -652,19 +879,27 @@
}
}
+ if( ( irqRegs & IRQ_CAD_DONE ) == IRQ_CAD_DONE )
+ {
+ if( cadDone != NULL )
+ {
+ cadDone( ( irqRegs & IRQ_CAD_ACTIVITY_DETECTED ) == IRQ_CAD_ACTIVITY_DETECTED );
+ }
+ }
+
if( ( irqRegs & IRQ_RX_TX_TIMEOUT ) == IRQ_RX_TX_TIMEOUT )
{
- if( ( rxTxTimeout != NULL ) && ( OperatingMode == MODE_TX ) )
+ if( ( txTimeout != NULL ) && ( OperatingMode == MODE_TX ) )
{
- rxTxTimeout( IRQ_TX_TIMEOUT );
+ txTimeout( );
}
- else if( ( rxTxTimeout != NULL ) && ( OperatingMode == MODE_RX ) )
+ else if( ( rxTimeout != NULL ) && ( OperatingMode == MODE_RX ) )
{
- rxTxTimeout( IRQ_RX_TIMEOUT );
+ rxTimeout( );
}
else
{
- rxTxTimeout( IRQ_XYZ );
+ assert_param( FAIL );
}
}
@@ -697,7 +932,7 @@
}
}
- //IRQ_HEADER_ERROR = 0x0020,
+ //IRQ_HEADER_ERROR = 0x0020,
if( irqRegs & IRQ_HEADER_ERROR )
{
if( rxError != NULL )
@@ -705,19 +940,7 @@
rxError( IRQ_HEADER_ERROR_CODE );
}
}
-
- //IRQ_CAD_DONE = 0x0080,
- //IRQ_CAD_ACTIVITY_DETECTED = 0x0100,
- if( irqRegs & IRQ_CAD_DONE )
- {
- bool detected = ( ( irqRegs & IRQ_CAD_ACTIVITY_DETECTED ) == IRQ_CAD_ACTIVITY_DETECTED );
-
- if( cadDone != NULL )
- {
- cadDone( detected );
- }
-
- }*/
+*/
}
--- a/sx126x.h Wed Oct 12 08:49:58 2016 +0000
+++ b/sx126x.h Mon Sep 04 15:16:44 2017 +0000
@@ -1,16 +1,17 @@
/*
+ ______ _
/ _____) _ | |
( (____ _____ ____ _| |_ _____ ____| |__
\____ \| ___ | (_ _) ___ |/ ___) _ \
_____) ) ____| | | || |_| ____( (___| | | |
(______/|_____)_|_|_| \__)_____)\____)_| |_|
- (C)2016 Semtech
+ (C)2017 Semtech
-Description: Handling of the node configuration protocol
+Description: Generic SX126x driver implementation
License: Revised BSD License, see LICENSE.TXT file include in the project
-Maintainer: Miguel Luis, Gregory Cristian and Matthieu Verdy
+Authors: Miguel Luis, Gregory Cristian
*/
#ifndef __SX126x_H__
#define __SX126x_H__
@@ -42,7 +43,9 @@
* \remark These defines are used for computing the frequency divider to set the RF frequency
*/
#define XTAL_FREQ 32000000
-#define FREQ_STEP ( ( double )( XTAL_FREQ / pow( 2.0, 25.0 ) ) )
+#define FREQ_DIV 33554432
+#define FREQ_STEP 0.95367431640625 // ( ( double )( XTAL_FREQ / ( double )FREQ_DIV ) )
+#define FREQ_ERR 0.47683715820312
/*!
* \brief Compensation delay for SetAutoTx/Rx functions in 15.625 microseconds
@@ -73,55 +76,93 @@
* \brief The address of the register holding the first byte defining the CRC seed
*
*/
-#define REG_LR_CRCSEEDBASEADDR 0x06B9
+#define REG_LR_CRCSEEDBASEADDR 0x06BC
/*!
* \brief The address of the register holding the first byte defining the CRC polynomial
- *
*/
-#define REG_LR_CRCPOLYBASEADDR 0x06BB
+#define REG_LR_CRCPOLYBASEADDR 0x06BE
/*!
* \brief The address of the register holding the first byte defining the whitening seed
*/
-#define REG_LR_WHITSEEDBASEADDR 0x06B6
+#define REG_LR_WHITSEEDBASEADDR_MSB 0x06B8
+#define REG_LR_WHITSEEDBASEADDR_LSB 0x06B9
/*!
- * \brief The address of the instruction RAM and its size
+ * \brief The address of the register holding the packet configuration
*/
-#define IRAM_START_ADDRESS 0x8000
-#define IRAM_SIZE 0x6000
+#define REG_LR_PACKETPARAMS 0x0704
+
+/*!
+ * \brief The address of the register holding the payload size
+ */
+#define REG_LR_PAYLOADLENGTH 0x0702
/*!
* \brief The addresses of the registers holding SyncWords values
*/
-#define REG_LR_SYNCWORDBASEADDRESS 0x06BD
+#define REG_LR_SYNCWORDBASEADDRESS 0x06C0
+
+/*!
+ * \brief The addresses of the register holding LoRa Modem SyncWord value
+ */
+#define REG_LR_SYNCWORD 0x0740
+
+/*!
+ * Syncword for Private LoRa networks
+ */
+#define LORA_MAC_PRIVATE_SYNCWORD 0x1424
+
+/*!
+ * Syncword for Public LoRa networks
+ */
+#define LORA_MAC_PUBLIC_SYNCWORD 0x3444
+/*!
+ * The address of the register giving a 4 bytes random number
+ */
+#define RANDOM_NUMBER_GENERATORBASEADDR 0x0819
/*!
+ * The address of the register holding RX Gain value (0x94: power saving, 0x96: rx boosted)
+ */
+#define REG_RX_GAIN 0x08AC
+
+/*!
+ * The address of the register holding Bit Sync configuration
+ */
+#define REG_BIT_SYNC 0x06AC
+
+/*!
+ * Change the value on the device internal trimming capacitor
+ */
+#define REG_XTA_TRIM 0x0911
+/*!
* \brief Represents the states of the radio
*/
-typedef enum RadioState
+typedef enum
{
- RF_IDLE = 0, //!< The radio is idle
+ RF_IDLE = 0x00, //!< The radio is idle
RF_RX_RUNNING, //!< The radio is in reception state
RF_TX_RUNNING, //!< The radio is in transmission state
RF_CAD, //!< The radio is doing channel activity detection
-} RadioStates_t;
+}RadioStates_t;
/*!
* \brief Represents the operating mode the radio is actually running
*/
-enum RadioOperatingModes_t
+typedef enum
{
- MODE_SLEEP = 0, //! The radio is in sleep mode
+ MODE_SLEEP = 0x00, //! The radio is in sleep mode
MODE_STDBY_RC, //! The radio is in standby mode with RC oscillator
MODE_STDBY_XOSC, //! The radio is in standby mode with XOSC oscillator
MODE_FS, //! The radio is in frequency synthesis mode
MODE_TX, //! The radio is in transmit mode
MODE_RX, //! The radio is in receive mode
+ MODE_RX_DC, //! The radio is in receive duty cycle mode
MODE_CAD //! The radio is in channel activity detection mode
-};
+}RadioOperatingModes_t;
/*!
* \brief Declares the oscillator in use while in standby mode
@@ -129,105 +170,87 @@
* Using the STDBY_RC standby mode allow to reduce the energy consumption
* STDBY_XOSC should be used for time critical applications
*/
-enum RadioStandbyModes_t
+typedef enum
{
- STDBY_RC = 0,
- STDBY_XOSC = 1,
-};
+ STDBY_RC = 0x00,
+ STDBY_XOSC = 0x01,
+}RadioStandbyModes_t;
+
/*!
* \brief Declares the power regulation used to power the device
*
* This command allows the user to specify if DC-DC or LDO is used for power regulation.
* Using only LDO implies that the Rx or Tx current is doubled
*/
-enum RadioRegulatorMode_t
+typedef enum
{
- USE_LDO = 0x00, // default
- USE_DCDC = 0x01,
-};
+ USE_LDO = 0x00, // default
+ USE_DCDC = 0x01,
+}RadioRegulatorMode_t;
/*!
* \brief Represents the possible packet type (i.e. modem) used
*/
-enum RadioPacketType_t
+typedef enum
{
- PACKET_TYPE_GFSK = 0,
- PACKET_TYPE_LORA = 1,
- PACKET_TYPE_RESERVED = 0x0F,
-};
+ PACKET_TYPE_GFSK = 0x00,
+ PACKET_TYPE_LORA = 0x01,
+ PACKET_TYPE_NONE = 0x0F,
+}RadioPacketTypes_t;
/*!
* \brief Represents the ramping time for power amplifier
*/
-enum RadioRampTimes_t
+typedef enum
{
- RAMP_10_US = 0x00,
- RAMP_20_US = 0x01,
- RAMP_40_US = 0x02,
- RAMP_80_US = 0x03,
- RAMP_200_US = 0x04,
- RAMP_800_US = 0x05,
- RAMP_1700_US = 0x06,
- RAMP_3400_US = 0x07,
-};
+ RADIO_RAMP_10_US = 0x00,
+ RADIO_RAMP_20_US = 0x01,
+ RADIO_RAMP_40_US = 0x02,
+ RADIO_RAMP_80_US = 0x03,
+ RADIO_RAMP_200_US = 0x04,
+ RADIO_RAMP_800_US = 0x05,
+ RADIO_RAMP_1700_US = 0x06,
+ RADIO_RAMP_3400_US = 0x07,
+}RadioRampTimes_t;
/*!
* \brief Represents the number of symbols to be used for channel activity detection operation
*/
-enum RadioLoRaCadSymbols_t
+typedef enum
{
LORA_CAD_01_SYMBOL = 0x00,
LORA_CAD_02_SYMBOL = 0x01,
LORA_CAD_04_SYMBOL = 0x02,
LORA_CAD_08_SYMBOL = 0x03,
LORA_CAD_16_SYMBOL = 0x04,
-};
-
+}RadioLoRaCadSymbols_t;
-
-
-
+/*!
+ * \brief Represents the Channel Activity Detection actions after the CAD operation is finished
+ */
+typedef enum
+{
+ LORA_CAD_ONLY = 0x00,
+ LORA_CAD_RX = 0x01,
+ LORA_CAD_LBT = 0x10,
+}RadioCadExitModes_t;
/*!
* \brief Represents the modulation shaping parameter
*/
-enum RadioModShapings_t
+typedef enum
{
+ MOD_SHAPING_OFF = 0x00,
MOD_SHAPING_G_BT_03 = 0x08,
MOD_SHAPING_G_BT_05 = 0x09,
MOD_SHAPING_G_BT_07 = 0x0A,
MOD_SHAPING_G_BT_1 = 0x0B,
-
- MOD_SHAPING_G_BT_03_D = 0x0C,
- MOD_SHAPING_G_BT_05_D = 0x0D,
- MOD_SHAPING_G_BT_07_D = 0x0E,
- MOD_SHAPING_G_BT_1_D = 0x0F,
-
- MOD_SHAPING_RC_BT_03 = 0x10,
- MOD_SHAPING_RC_BT_05 = 0x11,
- MOD_SHAPING_RC_BT_07 = 0x12,
- MOD_SHAPING_RC_BT_1 = 0x13,
-
- MOD_SHAPING_RC_BT_03_D = 0x14,
- MOD_SHAPING_RC_BT_05_D = 0x15,
- MOD_SHAPING_RC_BT_07_D = 0x16,
- MOD_SHAPING_RC_BT_1_D = 0x17,
-
- MOD_SHAPING_RRC_BT_03 = 0x18,
- MOD_SHAPING_RRC_BT_05 = 0x19,
- MOD_SHAPING_RRC_BT_07 = 0x1A,
- MOD_SHAPING_RRC_BT_1 = 0x1B,
-
- MOD_SHAPING_RRC_BT_03_D = 0x1C,
- MOD_SHAPING_RRC_BT_05_D = 0x1D,
- MOD_SHAPING_RRC_BT_07_D = 0x1E,
- MOD_SHAPING_RRC_BT_1_D = 0x1F,
-};
+}RadioModShapings_t;
/*!
* \brief Represents the modulation shaping parameter
*/
-enum RadioRxBandwidth_t
+typedef enum
{
RX_BW_4800 = 0x1F,
RX_BW_5800 = 0x17,
@@ -247,18 +270,15 @@
RX_BW_156200 = 0x1A,
RX_BW_187200 = 0x12,
RX_BW_234300 = 0x0A,
- RX_BW_312000 = 0x18,
+ RX_BW_312000 = 0x19,
RX_BW_373600 = 0x11,
- RX_BW_467000 = 0x1F,
- RX_BW_619300 = 0x18,
- RX_BW_742400 = 0x10,
- RX_BW_929000 = 0x08,
-};
+ RX_BW_467000 = 0x09,
+}RadioRxBandwidth_t;
/*!
* \brief Represents the possible spreading factor values in LoRa packet types
*/
-enum RadioLoRaSpreadingFactors_t
+typedef enum
{
LORA_SF5 = 0x05,
LORA_SF6 = 0x06,
@@ -268,12 +288,12 @@
LORA_SF10 = 0x0A,
LORA_SF11 = 0x0B,
LORA_SF12 = 0x0C,
-};
+}RadioLoRaSpreadingFactors_t;
/*!
* \brief Represents the bandwidth values for LoRa packet type
*/
-enum RadioLoRaBandwidths_t
+typedef enum
{
LORA_BW_500 = 6,
LORA_BW_250 = 5,
@@ -284,142 +304,124 @@
LORA_BW_020 = 9,
LORA_BW_015 = 1,
LORA_BW_010 = 8,
- LORA_BW_007 = 0,
-};
+ LORA_BW_007 = 0,
+}RadioLoRaBandwidths_t;
/*!
* \brief Represents the coding rate values for LoRa packet type
*/
-enum RadioLoRaCodingRates_t
+typedef enum
{
LORA_CR_4_5 = 0x01,
LORA_CR_4_6 = 0x02,
LORA_CR_4_7 = 0x03,
LORA_CR_4_8 = 0x04,
- LORA_CR_LI_4_5 = 0x05,
- LORA_CR_LI_4_6 = 0x06,
- LORA_CR_LI_4_7 = 0x07,
-};
-
-/*!
- * \brief Represents the preamble length values
- */
-enum RadioPreambleLengths_t
-{
- RADIO_PREAMBLE_LENGTH_04_BITS = 0x00, //!< Preamble length: 04 bits
- RADIO_PREAMBLE_LENGTH_08_BITS = 0x01, //!< Preamble length: 08 bits
- RADIO_PREAMBLE_LENGTH_12_BITS = 0x02, //!< Preamble length: 12 bits
- RADIO_PREAMBLE_LENGTH_16_BITS = 0x03, //!< Preamble length: 16 bits
- RADIO_PREAMBLE_LENGTH_20_BITS = 0x04, //!< Preamble length: 20 bits
- RADIO_PREAMBLE_LENGTH_24_BITS = 0x05, //!< Preamble length: 24 bits
- RADIO_PREAMBLE_LENGTH_28_BITS = 0x06, //!< Preamble length: 28 bits
- RADIO_PREAMBLE_LENGTH_32_BITS = 0x07, //!< Preamble length: 32 bits
-};
+}RadioLoRaCodingRates_t;
/*!
* \brief Represents the preamble length used to detect the packet on Rx side
*/
-enum RadioPreambleDetection_t
+typedef enum
{
RADIO_PREAMBLE_DETECTOR_OFF = 0x00, //!< Preamble detection length off
RADIO_PREAMBLE_DETECTOR_08_BITS = 0x04, //!< Preamble detection length 8 bits
- RADIO_PREAMBLE_DETECTOR_12_BITS = 0x05, //!< Preamble detection length 12 bits
- RADIO_PREAMBLE_DETECTOR_16_BITS = 0x06, //!< Preamble detection length 16 bits
- RADIO_PREAMBLE_DETECTOR_20_BITS = 0x07, //!< Preamble detection length 20 bits
-};
-
-/*!
- * \brief The length of sync words
- */
-enum RadioSyncWordLengths_t
-{
- RADIO_SYNCWORD_LENGTH_1_BYTE = 0x00, //!< Sync word length: 1 byte
- RADIO_SYNCWORD_LENGTH_2_BYTE = 0x01, //!< Sync word length: 2 bytes
- RADIO_SYNCWORD_LENGTH_3_BYTE = 0x02, //!< Sync word length: 3 bytes
- RADIO_SYNCWORD_LENGTH_4_BYTE = 0x03, //!< Sync word length: 4 bytes
- RADIO_SYNCWORD_LENGTH_5_BYTE = 0x04, //!< Sync word length: 5 bytes
- RADIO_SYNCWORD_LENGTH_6_BYTE = 0x05, //!< Sync word length: 6 bytes
- RADIO_SYNCWORD_LENGTH_7_BYTE = 0x06, //!< Sync word length: 7 bytes
- RADIO_SYNCWORD_LENGTH_8_BYTE = 0x07, //!< Sync word length: 8 bytes
-};
+ RADIO_PREAMBLE_DETECTOR_16_BITS = 0x05, //!< Preamble detection length 16 bits
+ RADIO_PREAMBLE_DETECTOR_24_BITS = 0x06, //!< Preamble detection length 24 bits
+ RADIO_PREAMBLE_DETECTOR_32_BITS = 0x07, //!< Preamble detection length 32 bit
+}RadioPreambleDetection_t;
/*!
* \brief Represents the possible combinations of SyncWord correlators activated
*/
-enum RadioAddressComp_t
+typedef enum
{
RADIO_ADDRESSCOMP_FILT_OFF = 0x00, //!< No correlator turned on, i.e. do not search for SyncWord
RADIO_ADDRESSCOMP_FILT_NODE = 0x01,
RADIO_ADDRESSCOMP_FILT_NODE_BROAD = 0x02,
-
-};
+}RadioAddressComp_t;
/*!
* \brief Radio packet length mode
*/
-enum RadioPacketLengthModes_t
+typedef enum
{
RADIO_PACKET_FIXED_LENGTH = 0x00, //!< The packet is known on both sides, no header included in the packet
RADIO_PACKET_VARIABLE_LENGTH = 0x01, //!< The packet is on variable size, header included
-};
+}RadioPacketLengthModes_t;
/*!
* \brief Represents the CRC length
*/
-enum RadioCrcTypes_t
+typedef enum
{
RADIO_CRC_OFF = 0x01, //!< No CRC in use
RADIO_CRC_1_BYTES = 0x00,
RADIO_CRC_2_BYTES = 0x02,
RADIO_CRC_1_BYTES_INV = 0x04,
RADIO_CRC_2_BYTES_INV = 0x06,
-};
+ RADIO_CRC_2_BYTES_IBM = 0xF1,
+ RADIO_CRC_2_BYTES_CCIT = 0xF2,
+}RadioCrcTypes_t;
/*!
* \brief Radio whitening mode activated or deactivated
*/
-enum RadioDcFree_t
+typedef enum
{
RADIO_DC_FREE_OFF = 0x00,
- RADIO_DC_FREEMANCHESTER = 0x02,
RADIO_DC_FREEWHITENING = 0x01,
-};
+}RadioDcFree_t;
/*!
* \brief Holds the lengths mode of a LoRa packet type
*/
-enum RadioLoRaPacketLengthsMode_t
+typedef enum
{
LORA_PACKET_VARIABLE_LENGTH = 0x00, //!< The packet is on variable size, header included
LORA_PACKET_FIXED_LENGTH = 0x01, //!< The packet is known on both sides, no header included in the packet
LORA_PACKET_EXPLICIT = LORA_PACKET_VARIABLE_LENGTH,
LORA_PACKET_IMPLICIT = LORA_PACKET_FIXED_LENGTH,
-};
+}RadioLoRaPacketLengthsMode_t;
/*!
* \brief Represents the CRC mode for LoRa packet type
*/
-enum RadioLoRaCrcModes_t
+typedef enum
{
LORA_CRC_ON = 0x01, //!< CRC activated
LORA_CRC_OFF = 0x00, //!< CRC not used
-};
+}RadioLoRaCrcModes_t;
/*!
* \brief Represents the IQ mode for LoRa packet type
*/
-enum RadioLoRaIQModes_t
+typedef enum
{
LORA_IQ_NORMAL = 0x00,
LORA_IQ_INVERTED = 0x01,
-};
+}RadioLoRaIQModes_t;
+
+/*!
+ * \brief Represents the volatge used to control the TCXO on/off from DIO3
+ */
+typedef enum
+{
+ TCXO_CTRL_1_6V = 0x00,
+ TCXO_CTRL_1_7V = 0x01,
+ TCXO_CTRL_1_8V = 0x02,
+ TCXO_CTRL_2_2V = 0x03,
+ TCXO_CTRL_2_4V = 0x04,
+ TCXO_CTRL_2_7V = 0x05,
+ TCXO_CTRL_3_0V = 0x06,
+ TCXO_CTRL_3_3V = 0x07,
+}RadioTcxoCtrlVoltage_t;
/*!
* \brief Represents the interruption masks available for the radio
*
* \remark Note that not all these interruptions are available for all packet types
*/
-enum RadioIrqMasks_t
+typedef enum
{
IRQ_RADIO_NONE = 0x0000,
IRQ_TX_DONE = 0x0001,
@@ -427,33 +429,24 @@
IRQ_PREAMBLE_DETECTED = 0x0004,
IRQ_SYNCWORD_VALID = 0x0008,
IRQ_HEADER_VALID = 0x0010,
- IRQ_HEADER_ERROR = 0x0020,
+ IRQ_HEADER_ERROR = 0x0020,
IRQ_CRC_ERROR = 0x0040,
IRQ_CAD_DONE = 0x0080,
IRQ_CAD_ACTIVITY_DETECTED = 0x0100,
IRQ_RX_TX_TIMEOUT = 0x0200,
- IRQ_RANGING_SLAVE_REQUEST_VALID = 0x0400,
- IRQ_RANGING_SLAVE_REQUEST_DISCARDED = 0x0800,
- IRQ_RANGING_SLAVE_RESPONSE_DONE = 0x1000,
- IRQ_RANGING_MASTER_RESULT_VALID = 0x2000,
- IRQ_RANGING_MASTER_RESULT_TIMEOUT = 0x4000,
-
IRQ_RADIO_ALL = 0xFFFF,
-};
-
-
-
+}RadioIrqMasks_t;
/*!
* \brief Represents all possible opcode understood by the radio
*/
-enum RadioCommands_t
+typedef enum RadioCommands_e
{
RADIO_GET_STATUS = 0xC0,
RADIO_WRITE_REGISTER = 0x0D,
- RADIO_READ_REGISTER = 0x1D,
+ RADIO_READ_REGISTER = 0x1D,
RADIO_WRITE_BUFFER = 0x0E,
- RADIO_READ_BUFFER = 0x1E,
+ RADIO_READ_BUFFER = 0x1E,
RADIO_SET_SLEEP = 0x84,
RADIO_SET_STANDBY = 0x80,
RADIO_SET_FS = 0xC1,
@@ -461,14 +454,13 @@
RADIO_SET_RX = 0x82,
RADIO_SET_RXDUTYCYCLE = 0x94,
RADIO_SET_CAD = 0xC5,
- RADIO_SET_AUTOTXRX = 0x87,
RADIO_SET_TXCONTINUOUSWAVE = 0xD1,
RADIO_SET_TXCONTINUOUSPREAMBLE = 0xD2,
RADIO_SET_PACKETTYPE = 0x8A,
RADIO_GET_PACKETTYPE = 0x11,
RADIO_SET_RFFREQUENCY = 0x86,
RADIO_SET_TXPARAMS = 0x8E,
- RADIO_SET_PA_OPT = 0x95,
+ RADIO_SET_PACONFIG = 0x95,
RADIO_SET_CADPARAMS = 0x88,
RADIO_SET_BUFFERBASEADDRESS = 0x8F,
RADIO_SET_MODULATIONPARAMS = 0x8B,
@@ -477,50 +469,43 @@
RADIO_GET_PACKETSTATUS = 0x14,
RADIO_GET_RSSIINST = 0x15,
RADIO_GET_STATS = 0x10,
- RADIO_RESET_STATS = 0x00,
- RADIO_CFG_DIOIRQ = 0x08,
+ RADIO_RESET_STATS = 0x00,
+ RADIO_CFG_DIOIRQ = 0x08,
RADIO_GET_IRQSTATUS = 0x12,
RADIO_CLR_IRQSTATUS = 0x02,
RADIO_CALIBRATE = 0x89,
RADIO_SET_REGULATORMODE = 0x96,
RADIO_SET_PRAMSWAPCMD = 0x8D,
RADIO_GET_ERROR = 0x17,
- RADIO_SET_LONGPREAMBLE = 0x90,
+ RADIO_SET_TCXOMODE = 0x97,
RADIO_SET_TXFALLBACKMODE = 0x93,
-};
-
-/*!
-* \brief RX_TX_CONTINUOUS and RX_TX_SINGLE are two particular values for TickTime.
-* The former keep the radio in Rx or Tx mode, even after successfull reception
-* or transmission. It should never generate Timeout interrupt.
-* The later let the radio enought time to make one reception or transmission.
-* No Timeout interrupt is generated, and the radio fall in StandBy mode after
-* reception or transmission.
-*/
-#define RX_TX_CONTINUOUS ( TickTime_t ){ RADIO_TICK_SIZE_0015_US, 0xFFFF }
-#define RX_TX_SINGLE ( TickTime_t ){ RADIO_TICK_SIZE_0015_US, 0 }
+ RADIO_SET_RFSWITCHMODE = 0x9D,
+ RADIO_SET_STOPRXTIMERONPREAMBLE = 0x9F,
+ RADIO_SET_LONGPREAMBLE = 0x90,
+ RADIO_SET_LORASYMBTIMEOUT = 0xA0,
+}RadioCommands_t;
/*!
* \brief The type describing the modulation parameters for every packet types
*/
typedef struct
{
- RadioPacketType_t PacketType; //!< Packet to which the modulation parameters are referring to.
- union
+ RadioPacketTypes_t PacketType; //!< Packet to which the modulation parameters are referring to.
+ struct
{
- uint8_t Buffer[8];
struct
{
uint32_t BitRate;
uint32_t Fdev;
- RadioModShapings_t PulseShape:8;
- uint8_t BW;
+ RadioModShapings_t ModulationShaping;
+ uint8_t Bandwidth;
}Gfsk;
struct
{
RadioLoRaSpreadingFactors_t SpreadingFactor; //!< Spreading Factor for the LoRa modulation
RadioLoRaBandwidths_t Bandwidth; //!< Bandwidth for the LoRa modulation
RadioLoRaCodingRates_t CodingRate; //!< Coding rate for the LoRa modulation
+ uint8_t LowDatarateOptimize; //!< Indicates if the modem uses the low datarate optimization
}LoRa;
}Params; //!< Holds the modulation parameters structure
}ModulationParams_t;
@@ -530,38 +515,34 @@
*/
typedef struct
{
- RadioPacketType_t PacketType; //!< Packet to which the packet parameters are referring to.
- union
+ RadioPacketTypes_t PacketType; //!< Packet to which the packet parameters are referring to.
+ struct
{
- uint8_t Buffer[8];
-
/*!
* \brief Holds the GFSK packet parameters
*/
struct
{
- uint8_t PreambleTxLength; //!< The preamble tx length for GFSK packet type
- uint8_t PreambleDetectLength; //!< The preamble rx length for GFSK packet type
-
- RadioSyncWordLengths_t SyncWordLength; //!< The synchronization word length for GFSK packet type
- RadioAddressComp_t AddrComp;
+ uint16_t PreambleLength; //!< The preamble Tx length for GFSK packet type in bit
+ RadioPreambleDetection_t PreambleMinDetect; //!< The preamble Rx length minimal for GFSK packet type
+ uint8_t SyncWordLength; //!< The synchronization word length for GFSK packet type
+ RadioAddressComp_t AddrComp; //!< Activated SyncWord correlators
RadioPacketLengthModes_t HeaderType; //!< If the header is explicit, it will be transmitted in the GFSK packet. If the header is implicit, it will not be transmitted
uint8_t PayloadLength; //!< Size of the payload in the GFSK packet
RadioCrcTypes_t CrcLength; //!< Size of the CRC block in the GFSK packet
- RadioDcFree_t DcFree;
+ RadioDcFree_t DcFree;
}Gfsk;
/*!
* \brief Holds the LoRa packet parameters
*/
struct
{
- uint8_t PreambleLength; //!< The preamble length is the number of LoRa symbols in the preamble. To set it, use the following formula @code Number of symbols = PreambleLength[3:0] * ( 2^PreambleLength[7:4] ) @endcode
+ uint16_t PreambleLength; //!< The preamble length is the number of LoRa symbols in the preamble
RadioLoRaPacketLengthsMode_t HeaderType; //!< If the header is explicit, it will be transmitted in the LoRa packet. If the header is implicit, it will not be transmitted
uint8_t PayloadLength; //!< Size of the payload in the LoRa packet
RadioLoRaCrcModes_t CrcMode; //!< Size of CRC block in LoRa packet
RadioLoRaIQModes_t InvertIQ; //!< Allows to swap IQ for LoRa packet
}LoRa;
-
}Params; //!< Holds the packet parameters structure
}PacketParams_t;
@@ -570,23 +551,24 @@
*/
typedef struct
{
- RadioPacketType_t packetType; //!< Packet to which the packet status are referring to.
- union
+ RadioPacketTypes_t packetType; //!< Packet to which the packet status are referring to.
+ struct
{
struct
{
uint8_t RxStatus;
int8_t RssiAvg; //!< The averaged RSSI
int8_t RssiSync; //!< The RSSI measured on last packet
+ uint32_t FreqError;
}Gfsk;
struct
{
int8_t RssiPkt; //!< The RSSI of the last packet
int8_t SnrPkt; //!< The SNR of the last packet
int8_t SignalRssiPkt;
+ uint32_t FreqError;
}LoRa;
-
- };
+ }Params;
}PacketStatus_t;
/*!
@@ -594,10 +576,10 @@
*/
typedef struct
{
- RadioPacketType_t packetType; //!< Packet to which the packet status are referring to.
- uint16_t NbPktReceived;
- uint16_t NbPktCrcOk;
- uint16_t NbPktLengthError;
+ RadioPacketTypes_t packetType; //!< Packet to which the packet status are referring to.
+ uint16_t PacketReceived;
+ uint16_t CrcOk;
+ uint16_t LengthError;
}RxCounter_t;
/*!
@@ -605,18 +587,18 @@
*/
typedef union
{
- uint8_t Value;
struct
{
- uint8_t Reserved : 1;
- uint8_t ImgEnable : 1;
- uint8_t ADCBulkPEnable : 1; //!< Calibrate ADC bulkP
- uint8_t ADCBulkNEnable : 1; //!< Calibrate ADC bulkN
+ uint8_t RC64KEnable : 1; //!< Calibrate RC64K clock
+ uint8_t RC13MEnable : 1; //!< Calibrate RC13M clock
+ uint8_t PLLEnable : 1; //!< Calibrate PLL
uint8_t ADCPulseEnable : 1; //!< Calibrate ADC Pulse
- uint8_t PLLEnable : 1; //!< Calibrate PLL
- uint8_t RC13MEnable : 1; //!< Calibrate RC13M clock
- uint8_t RC64KEnable : 1; //!< Calibrate RC64K clock
- } Fields;
+ uint8_t ADCBulkNEnable : 1; //!< Calibrate ADC bulkN
+ uint8_t ADCBulkPEnable : 1; //!< Calibrate ADC bulkP
+ uint8_t ImgEnable : 1;
+ uint8_t : 1;
+ }Fields;
+ uint8_t Value;
}CalibrationParams_t;
/*!
@@ -624,17 +606,36 @@
*/
typedef union
{
- uint8_t Value;
struct
{
uint8_t WakeUpRTC : 1; //!< Get out of sleep mode if wakeup signal received from RTC
uint8_t Reset : 1;
uint8_t WarmStart : 1;
uint8_t Reserved : 5;
- } Fields;
-
+ }Fields;
+ uint8_t Value;
}SleepParams_t;
+/*!
+ * \brief Represents the possible radio system error states
+ */
+typedef union
+{
+ struct
+ {
+ uint8_t Rc64kCalib : 1; //!< RC 64kHz oscillator calibration failed
+ uint8_t Rc13mCalib : 1; //!< RC 13MHz oscillator calibration failed
+ uint8_t PllCalib : 1; //!< PLL calibration failed
+ uint8_t AdcCalib : 1; //!< ADC calibration failed
+ uint8_t ImgCalib : 1; //!< Image calibration failed
+ uint8_t XoscStart : 1; //!< XOSC oscillator failed to start
+ uint8_t PllLock : 1; //!< PLL lock failed
+ uint8_t BuckStart : 1; //!< Buck converter failed to start
+ uint8_t PaRamp : 1; //!< PA ramp failed
+ uint8_t : 7; //!< Reserved
+ }Fields;
+ uint16_t Value;
+}RadioError_t;
/*!
* \brief Represents the SX126x and its features
@@ -646,56 +647,49 @@
public:
/*!
* \brief Instantiates a SX126x object and provides API functions to communicates with the radio
- *
- * \param [in] txDone Pointer to a function run on successful transmission
- * \param [in] rxDone Pointer to a function run on successful reception
- * \param [in] rxPblSyncWordHeader Pointer to a function run on successful SyncWord, pbl or header reception
- * \param [in] rxtxTimeout Pointer to a function run on transmission/reception timeout
- * \param [in] rxError Pointer to a function run on reception error
- * \param [in] rangingDone Pointer to a function run on ranging terminated
- * \param [in] cadDone Pointer to a function run on channel activity detected
- *
+ * \param [in] callbacks Pointer to the callbacks structure defining
+ * all callbacks function pointers
*/
- SX126x( void ( *txDone )( ), void ( *rxDone )( ), void ( *rxPblSyncWordHeader )(IrqPblSyncHeaderCode_t val ),
- void ( *rxTxTimeout )( IrqTimeoutCode_t timeoutCode ), void ( *rxError )( IrqErrorCode_t errorCode ),
- void ( *cadDone )( bool channelActivityDetected ), void ( *onDioIrq )( ) ): Radio( txDone, rxDone, rxPblSyncWordHeader, rxTxTimeout, rxError, cadDone )
+ SX126x( RadioCallbacks_t *callbacks ):
+ Radio( callbacks )
{
-
- this->dioIrq = &SX126x::OnDioIrq;
-
- this->onCustomDioIrq = onDioIrq;
-
- this->PacketType = PACKET_TYPE_RESERVED;
+ this->dioIrq = &SX126x::OnDioIrq;
+ this->PacketType = PACKET_TYPE_NONE;
+ this->PollingMode = false;
+ this->IrqState = false;
}
virtual ~SX126x( )
{
}
+private:
/*!
* \brief Holds the internal operating mode of the radio
*/
RadioOperatingModes_t OperatingMode;
-
- uint16_t LastIrqs;
-
-private:
-
/*!
* \brief Stores the current packet type set in the radio
*/
- RadioPacketType_t PacketType;
+ RadioPacketTypes_t PacketType;
+ /*!
+ * \brief Holds a flag raised on radio interrupt
+ */
+ bool IrqState;
/*!
* \brief Hardware DIO IRQ functions
*/
DioIrqHandler dioIrq;
-protected:
+ /*!
+ * \brief Holds the polling state of the driver
+ */
+ bool PollingMode;
- void ( *onCustomDioIrq )( );
+protected:
/*!
* \brief Sets a function to be triggered on radio interrupt
@@ -705,6 +699,12 @@
*/
virtual void IoIrqInit( DioIrqHandler irqHandler ) = 0;
+ /*!
+ * \brief DIOs interrupt callback
+ *
+ * \remark Called to handle all 3 DIOs pins
+ */
+ void OnDioIrq( void );
public:
/*!
* \brief Initializes the radio driver
@@ -712,16 +712,393 @@
void Init( void );
/*!
- * \brief Initializes the radio registers to the recommended default values
+ * \brief Gets the current Operation Mode of the Radip
+ *
+ * \retval RadioOperatingModes_t last operating mode
+ */
+ virtual RadioOperatingModes_t GetOperatingMode( void );
+
+ /*!
+ * \brief Wakeup the radio if it is in Sleep mode and check that Busy is low
+ */
+ virtual void CheckDeviceReady( void );
+
+ /*!
+ * \brief Saves the payload to be send in the radio buffer
+ *
+ * \param [in] payload A pointer to the payload
+ * \param [in] size The size of the payload
+ */
+ void SetPayload( uint8_t *payload, uint8_t size );
+
+ /*!
+ * \brief Reads the payload received. If the received payload is longer
+ * than maxSize, then the method returns 1 and do not set size and payload.
+ *
+ * \param [out] payload A pointer to a buffer into which the payload will be copied
+ * \param [out] size A pointer to the size of the payload received
+ * \param [in] maxSize The maximal size allowed to copy into the buffer
+ */
+ uint8_t GetPayload( uint8_t *payload, uint8_t *size, uint8_t maxSize );
+
+ /*!
+ * \brief Sends a payload
+ *
+ * \param [in] payload A pointer to the payload to send
+ * \param [in] size The size of the payload to send
+ * \param [in] timeout The timeout for Tx operation
+ */
+ void SendPayload( uint8_t *payload, uint8_t size, uint32_t timeout );
+
+ /*!
+ * \brief Sets the Sync Word given by index used in GFSK
+ *
+ * \param [in] syncWord SyncWord bytes ( 8 bytes )
+ *
+ * \retval status [0: OK, 1: NOK]
+ */
+ uint8_t SetSyncWord( uint8_t *syncWord );
+
+ /*!
+ * \brief Sets the Initial value for the LFSR used for the CRC calculation
+ *
+ * \param [in] seed Initial LFSR value ( 2 bytes )
+ *
+ */
+ void SetCrcSeed( uint16_t seed );
+
+ /*!
+ * \brief Sets the seed used for the CRC calculation
+ *
+ * \param [in] seed The seed value
+ *
+ */
+ void SetCrcPolynomial( uint16_t seed );
+
+ /*!
+ * \brief Sets the Initial value of the LFSR used for the whitening in GFSK protocols
+ *
+ * \param [in] seed Initial LFSR value
+ */
+ void SetWhiteningSeed( uint16_t seed );
+
+ /*!
+ * \brief Gets a 32 bits random value generated by the radio
+ *
+ * \remark The radio must be in reception mode before executing this function
+ *
+ * \retval randomValue 32 bits random value
+ */
+ uint32_t GetRandom( void );
+
+ /*!
+ * \brief Sets the radio in sleep mode
+ *
+ * \param [in] sleepConfig The sleep configuration describing data
+ * retention and RTC wake-up
+ */
+ void SetSleep( SleepParams_t sleepConfig );
+
+ /*!
+ * \brief Sets the radio in configuration mode
+ *
+ * \param [in] mode The standby mode to put the radio into
*/
- void SetRegistersDefault( void );
+ void SetStandby( RadioStandbyModes_t mode );
+
+ /*!
+ * \brief Sets the radio in FS mode
+ */
+ void SetFs( void );
+
+ /*!
+ * \brief Sets the radio in transmission mode
+ *
+ * \param [in] timeout Structure describing the transmission timeout value
+ */
+ void SetTx( uint32_t timeout );
+
+ /*!
+ * \brief Sets the radio in reception Boosted mode
+ *
+ * \param [in] timeout Structure describing the transmission timeout value
+ */
+ void SetRxBoosted( uint32_t timeout );
+
+ /*!
+ * \brief Sets the radio in reception mode
+ *
+ * \param [in] timeout Structure describing the reception timeout value
+ */
+ void SetRx( uint32_t timeout );
+
+ /*!
+ * \brief Sets the Rx duty cycle management parameters
+ *
+ * \param [in] rxTime Structure describing reception timeout value
+ * \param [in] sleepTime Structure describing sleep timeout value
+ */
+ void SetRxDutyCycle( uint32_t rxTime, uint32_t sleepTime );
+
+ /*!
+ * \brief Sets the radio in CAD mode
+ */
+ void SetCad( void );
+
+ /*!
+ * \brief Sets the radio in continuous wave transmission mode
+ */
+ void SetTxContinuousWave( void );
+
+ /*!
+ * \brief Sets the radio in continuous preamble transmission mode
+ */
+ void SetTxInfinitePreamble( void );
+
+ /*!
+ * \brief Decide which interrupt will stop the internal radio rx timer.
+ *
+ * \param [in] enable [0: Timer stop after header/syncword detection
+ * 1: Timer stop after preamble detection]
+ */
+ void SetStopRxTimerOnPreambleDetect( bool enable );
+
+ /*!
+ * \brief Set the number of symbol the radio will wait to validate a reception
+ *
+ * \param [in] SymbNum number of LoRa symbols
+ */
+ void SetLoRaSymbNumTimeout( uint8_t SymbNum );
+
+ /*!
+ * \brief Sets the power regulators operating mode
+ *
+ * \param [in] mode [0: LDO, 1:DC_DC]
+ */
+ void SetRegulatorMode( RadioRegulatorMode_t mode );
+
+ /*!
+ * \brief Calibrates the given radio block
+ *
+ * \param [in] calibParam The description of blocks to be calibrated
+ */
+ void Calibrate( CalibrationParams_t calibParam );
+
+ /*!
+ * \brief Activate the extention of the timeout when long preamble is used
+ *
+ * \param [in] enable The radio will extend the timeout to cope with long preamble
+ */
+ void SetLongPreamble( uint8_t enable );
+
+ /*!
+ * \brief Sets the transmission parameters
+ *
+ * \param [in] paDutyCycle Duty Cycle for the PA
+ * \param [in] HpMax 0 for sx1261, 7 for sx1262
+ * \param [in] deviceSel 1 for sx1261, 0 for sx1262
+ * \param [in] paLUT 0 for 14dBm LUT, 1 for 22dBm LUT
+ */
+ void SetPaConfig( uint8_t paDutyCycle, uint8_t HpMax, uint8_t deviceSel, uint8_t paLUT );
/*!
- * \brief Returns the current device firmware version
+ * \brief Defines into which mode the chip goes after a TX / RX done
+ *
+ * \param [in] fallbackMode The mode in which the radio goes
+ */
+ void SetRxTxFallbackMode( uint8_t fallbackMode );
+
+ /*!
+ * \brief Sets the IRQ mask and DIO masks
+ *
+ * \param [in] irqMask General IRQ mask
+ * \param [in] dio1Mask DIO1 mask
+ * \param [in] dio2Mask DIO2 mask
+ * \param [in] dio3Mask DIO3 mask
+ */
+ void SetDioIrqParams( uint16_t irqMask, uint16_t dio1Mask, uint16_t dio2Mask, uint16_t dio3Mask );
+
+ /*!
+ * \brief Returns the current IRQ status
+ *
+ * \retval irqStatus IRQ status
+ */
+ uint16_t GetIrqStatus( void );
+
+ /*
+ * \brief Indicates if DIO2 is used to control an RF Switch
+ *
+ * \param [in] enable true of false
+ */
+ void SetDio2AsRfSwitchCtrl( uint8_t enable );
+
+ /*
+ * \brief Indicates if the Radio main clock is supplied from a tcxo
+ *
+ * \param [in] tcxoVoltage voltage used to control the TCXO
+ * \param [in] timeout time given to the TCXO to go to 32MHz
+ */
+ void SetDio3AsTcxoCtrl( RadioTcxoCtrlVoltage_t tcxoVoltage, uint32_t timeout );
+
+ /*!
+ * \brief Sets the RF frequency
+ *
+ * \param [in] frequency RF frequency [Hz]
+ */
+ void SetRfFrequency( uint32_t frequency );
+
+ /*!
+ * \brief Sets the radio for the given protocol
+ *
+ * \param [in] packetType [PACKET_TYPE_GFSK, PACKET_TYPE_LORA]
+ *
+ * \remark This method has to be called before SetRfFrequency,
+ * SetModulationParams and SetPacketParams
+ */
+ void SetPacketType( RadioPacketTypes_t packetType );
+
+ /*!
+ * \brief Gets the current radio protocol
+ *
+ * \retval packetType [PACKET_TYPE_GFSK, PACKET_TYPE_LORA]
+ */
+ RadioPacketTypes_t GetPacketType( void );
+
+ /*!
+ * \brief Sets the transmission parameters
+ *
+ * \param [in] power RF output power [-18..13] dBm
+ * \param [in] rampTime Transmission ramp up time
+ */
+ void SetTxParams( int8_t power, RadioRampTimes_t rampTime );
+
+ /*!
+ * \brief Set the modulation parameters
+ *
+ * \param [in] modParams A structure describing the modulation parameters
+ */
+ void SetModulationParams( ModulationParams_t *modParams );
+
+ /*!
+ * \brief Sets the packet parameters
+ *
+ * \param [in] packetParams A structure describing the packet parameters
+ */
+ void SetPacketParams( PacketParams_t *packetParams );
+
+ /*!
+ * \brief Sets the Channel Activity Detection (CAD) parameters
*
- * \retval version Firmware version
+ * \param [in] cadSymbolNum The number of symbol to use for CAD operations
+ * [LORA_CAD_01_SYMBOL, LORA_CAD_02_SYMBOL,
+ * LORA_CAD_04_SYMBOL, LORA_CAD_08_SYMBOL,
+ * LORA_CAD_16_SYMBOL]
+ * \param [in] cadDetPeak Limite for detection of SNR peak used in the CAD
+ * \param [in] cadDetMin Set the minimum symbol recognition for CAD
+ * \param [in] cadExitMode Operation to be done at the end of CAD action
+ * [LORA_CAD_ONLY, LORA_CAD_RX, LORA_CAD_LBT]
+ * \param [in] cadTimeout Defines the timeout value to abort the CAD activity
+ */
+ void SetCadParams( RadioLoRaCadSymbols_t cadSymbolNum, uint8_t cadDetPeak, uint8_t cadDetMin, RadioCadExitModes_t cadExitMode, uint32_t cadTimeout );
+
+ /*!
+ * \brief Sets the data buffer base address for transmission and reception
+ *
+ * \param [in] txBaseAddress Transmission base address
+ * \param [in] rxBaseAddress Reception base address
+ */
+ void SetBufferBaseAddresses( uint8_t txBaseAddress, uint8_t rxBaseAddress );
+
+ /*!
+ * \brief Gets the current radio status
+ *
+ * \retval status Radio status
+ */
+ virtual RadioStatus_t GetStatus( void );
+
+ /*!
+ * \brief Returns the instantaneous RSSI value for the last packet received
+ *
+ * \retval rssiInst Instantaneous RSSI
+ */
+ int8_t GetRssiInst( void );
+
+ /*!
+ * \brief Gets the last received packet buffer status
+ *
+ * \param [out] payloadLength Last received packet payload length
+ * \param [out] rxStartBuffer Last received packet buffer address pointer
+ */
+ void GetRxBufferStatus( uint8_t *payloadLength, uint8_t *rxStartBuffer );
+
+ /*!
+ * \brief Gets the last received packet payload length
+ *
+ * \param [out] pktStatus A structure of packet status
+ */
+ void GetPacketStatus( PacketStatus_t *pktStatus );
+
+ /*!
+ * \brief Returns the possible system erros
+ *
+ * \retval sysErrors Value representing the possible sys failures
*/
- virtual uint16_t GetFirmwareVersion( void );
+ RadioError_t GetDeviceErrors( void );
+
+ /*!
+ * \brief Clears the IRQs
+ *
+ * \param [in] irq IRQ(s) to be cleared
+ */
+ void ClearIrqStatus( uint16_t irq );
+
+ /*!
+ * \brief Set the driver in polling mode.
+ *
+ * In polling mode the application is responsible to call ProcessIrqs( ) to
+ * execute callbacks functions.
+ * The default mode is Interrupt Mode.
+ * @code
+ * // Initializations and callbacks declaration/definition
+ * radio = SX126x( mosi, miso, sclk, nss, busy, int1, int2, int3, rst, &callbacks );
+ * radio.Init( );
+ * radio.SetPollingMode( );
+ *
+ * while( true )
+ * {
+ * // IRQ processing is automatically done
+ * radio.ProcessIrqs( ); // <-- here, as well as callback functions
+ * // calls
+ * // Do some applicative work
+ * }
+ * @endcode
+ *
+ * \see SX126x::SetInterruptMode
+ */
+ void SetPollingMode( void );
+
+ /*!
+ * \brief Set the driver in interrupt mode.
+ *
+ * In interrupt mode, the driver communicate with the radio during the
+ * interruption by direct calls to ProcessIrqs( ). The main advantage is
+ * the possibility to have low power application architecture.
+ * This is the default mode.
+ * @code
+ * // Initializations and callbacks declaration/definition
+ * radio = SX126x( mosi, miso, sclk, nss, busy, int1, int2, int3, rst, &callbacks );
+ * radio.Init( );
+ * radio.SetInterruptMode( ); // Optionnal. Driver default behavior
+ *
+ * while( true )
+ * {
+ * // Do some applicative work
+ * }
+ * @endcode
+ *
+ * \see SX126x::SetPollingMode
+ */
+ void SetInterruptMode( void );
/*!
* \brief Resets the radio
@@ -766,7 +1143,7 @@
* \param [in] address Register address
* \param [in] value New register value
*/
- virtual void WriteRegister( uint16_t address, uint8_t value ) = 0;
+ virtual void WriteReg( uint16_t address, uint8_t value ) = 0;
/*!
* \brief Reads multiple radio registers starting at address
@@ -784,7 +1161,7 @@
*
* \retval data Register value
*/
- virtual uint8_t ReadRegister( uint16_t address ) = 0;
+ virtual uint8_t ReadReg( uint16_t address ) = 0;
/*!
* \brief Writes Radio Data Buffer with buffer of size starting at offset.
@@ -808,316 +1185,32 @@
* \brief Gets the current status of the radio DIOs
*
* \retval status [Bit #3: DIO3, Bit #2: DIO2,
- * Bit #1: DIO1, Bit #0: DIO0]
+ * Bit #1: DIO1, Bit #0: BUSY]
*/
virtual uint8_t GetDioStatus( void ) = 0;
/*!
- * \brief Gets the current radio status
- *
- * \retval status Radio status
- */
- virtual RadioStatus_t GetStatus( void );
-
- /*!
- * \brief Sets the radio in sleep mode
- *
- * \param [in] sleepConfig The sleep configuration describing data
- * retention and RTC wake-up
- */
- void SetSleep( SleepParams_t sleepConfig );
-
- /*!
- * \brief Sets the radio in configuration mode
- *
- * \param [in] mode The standby mode to put the radio into
- */
- void SetStandby( RadioStandbyModes_t mode );
-
- /*!
- * \brief Sets the radio in FS mode
- */
- void SetFs( void );
-
- /*!
- * \brief Sets the radio in transmission mode
- *
- * \param [in] timeout Structure describing the transmission timeout value
- */
- void SetTx( uint32_t timeout );
-
- /*!
- * \brief Sets the radio in reception mode
+ * \brief Returns the device type
*
- * \param [in] timeout Structure describing the reception timeout value
- */
- void SetRx( uint32_t timeout );
-
- /*!
- * \brief Sets the Rx duty cycle management parameters
- *
- * \param [in] rxTime Structure describing reception timeout value
- * \param [in] sleepTime Structure describing sleep timeout value
- */
- void SetRxDutyCycle( uint32_t rxTime, uint32_t sleepTime );
-
- /*!
- * \brief Sets the radio in CAD mode
- */
- void SetCad( void );
-
- /*!
- * \brief Sets the radio in continuous wave transmission mode
- */
- void SetTxContinuousWave( void );
-
- /*!
- * \brief Sets the radio in continuous preamble transmission mode
- */
- void SetTxContinuousPreamble( void );
-
- /*!
- * \brief Sets the radio for the given protocol
- *
- * \param [in] packetType [PACKET_TYPE_GFSK, PACKET_TYPE_LORA]
- */
- void SetPacketType( RadioPacketType_t packetType );
-
- /*!
- * \brief Gets the current radio protocol
- *
- * \retval packetType [PACKET_TYPE_GFSK, PACKET_TYPE_LORA]
+ * \retval 1: SX1261, 0: sx1262
*/
- RadioPacketType_t GetPacketType( void );
-
- /*!
- * \brief Sets the RF frequency
- *
- * \param [in] frequency RF frequency [Hz]
- */
- void SetRfFrequency( uint32_t frequency );
-
- /*!
- * \brief Sets the transmission parameters
- *
- * \param [in] power RF output power [-18..13] dBm
- * \param [in] rampTime Transmission ramp up time
- */
- void SetTxParams( int8_t power, RadioRampTimes_t rampTime );
-
- /*!
- * \brief Sets the CAD parameters
- *
- * \param [in] cadSymbolNum The number of symbol to use for channel activity
- * detection operations [LORA_CAD_01_SYMBOL, LORA_CAD_02_SYMBOL,
- * LORA_CAD_04_SYMBOL, LORA_CAD_08_SYMBOL, LORA_CAD_16_SYMBOL]
- */
- void SetCadConfig( RadioLoRaCadSymbols_t cadSymbolNum , uint8_t cadExitMode, uint32_t cadRxTxTimeout);
-
- /*!
- * \brief Sets the data buffer base address for transmission and reception
- *
- * \param [in] txBaseAddress Transmission base address
- * \param [in] rxBaseAddress Reception base address
- */
- void SetBufferBaseAddresses( uint8_t txBaseAddress, uint8_t rxBaseAddress );
-
- /*!
- * \brief Set the modulation parameters
- *
- * \param [in] modParams A structure describing the modulation parameters
- */
- void SetModulationParams( ModulationParams_t *modParams );
-
- /*!
- * \brief Sets the packet parameters
- *
- * \param [in] packetParams A structure describing the packet parameters
- */
- void SetPacketParams( PacketParams_t *packetParams );
-
- /*!
- * \brief Gets the last received packet buffer status
- *
- * \param [out] payloadLength Last received packet payload length
- * \param [out] rxStartBuffer Last received packet buffer address pointer
- */
- void GetRxBufferStatus( uint8_t *payloadLength, uint8_t *rxStartBuffer );
-
- /*!
- * \brief Gets the last received packet payload length
- *
- * \param [out] pktStatus A structure of packet status
- */
- void GetPacketStatus( PacketStatus_t *pktStatus );
-
- /*!
- * \brief Returns value of internal Rx counters when GFSK packet type is used
- *
- * \param [out] rxCounter A structure holding Rx internal counters values
- *
- * \remark The Rx internal counters are only available for GFSK and LoRa packet types.
- */
- void GetStats( RxCounter_t *rxCounter );
-
- void ResetStats();
-
- uint8_t GetError();
+ virtual uint8_t GetDeviceType( void ) = 0;
/*!
- * \brief Returns the instantaneous RSSI value for the last packet received
- *
- * \retval rssiInst Instantaneous RSSI
- */
- int8_t GetRssiInst( void );
-
- /*!
- * \brief Sets the IRQ mask and DIO masks
- *
- * \param [in] irqMask General IRQ mask
- * \param [in] dio1Mask DIO1 mask
- * \param [in] dio2Mask DIO2 mask
- * \param [in] dio3Mask DIO3 mask
- */
- void SetDioIrqParams( uint16_t irqMask, uint16_t dio1Mask, uint16_t dio2Mask, uint16_t dio3Mask );
-
- /*!
- * \brief Returns the current IRQ status
- *
- * \retval irqStatus IRQ status
- */
- uint16_t GetIrqStatus( void );
-
- /*!
- * \brief Clears the IRQs
- *
- * \param [in] irq IRQ(s) to be cleared
+ * \brief RF Switch power on
*/
- void ClearIrqStatus( uint16_t irq );
-
- /*!
- * \brief Calibrates the given radio block
- *
- * \param [in] calibParam The description of blocks to be calibrated
- */
- void Calibrate( CalibrationParams_t calibParam );
-
- /*!
- * \brief Sets the power regulators operating mode
- *
- * \param [in] mode [0: LDO, 1:DC_DC]
- */
- void SetRegulatorMode( uint8_t mode );
-
-
- /*!
- * \brief Sets the chip to automatically receive a packet after the end of a packet transmission
- *
- * \remark The offset is automatically compensated inside the function
- *
- * \param [in] time The delay in 15.625us after which a Rx or Tx is done
- */
- void SetAutoTxRx( uint32_t time, uint8_t intMode, uint32_t timeout );
-
- /*!
- * \brief Enables or disables long preamble detection mode
- *
- * \param [in] enable [0: Disable, 1: Enable]
- */
- void SetLongPreamble( uint8_t enable );
-
- /*!
- * \brief Saves the payload to be send in the radio buffer
- *
- * \param [in] payload A pointer to the payload
- * \param [in] size The size of the payload
- */
- void SetPayload( uint8_t *payload, uint8_t size );
+ virtual void AntSwOn( void ) = 0;
/*!
- * \brief Reads the payload received. If the received payload is longer
- * than maxSize, then the method returns 1 and do not set size and payload.
- *
- * \param [out] payload A pointer to a buffer into which the payload will be copied
- * \param [out] size A pointer to the size of the payload received
- * \param [in] maxSize The maximal size allowed to copy into the buffer
- */
- uint8_t GetPayload( uint8_t *buffer, uint8_t *size, uint8_t maxSize );
-
- /*!
- * \brief Sends a payload
- *
- * \param [in] payload A pointer to the payload to send
- * \param [in] size The size of the payload to send
- * \param [in] timeout The timeout for Tx operation
+ * \brief RF Switch power off
*/
- void SendPayload( uint8_t *payload, uint8_t size, uint32_t timeout );
-
- /*!
- * \brief Sets the Sync Word given by index used in GFSK
- *
- * \param [in] syncWord SyncWord bytes ( 8 bytes )
- *
- * \retval status [0: OK, 1: NOK]
- */
- uint8_t SetSyncWord( uint8_t *syncWord );
-
- /*!
- * \brief Sets the Initial value for the LFSR used for the CRC calculation
- *
- * \param [in] seed Initial LFSR value ( 2 bytes )
- *
- */
- void SetCrcSeed( uint16_t seed );
+ virtual void AntSwOff( void ) = 0;
/*!
- * \brief Sets the seed used for the CRC calculation
- *
- * \param [in] seed The seed value
- *
- */
- void SetCrcPolynomial( uint16_t seed );
-
- /*!
- * \brief Sets the Initial value of the LFSR used for the whitening in GFSK, FloRa and BLE protocols
- *
- * \param [in] seed Initial LFSR value
- */
- void SetWhiteningSeed( uint8_t seed );
-
- /*!
- * \brief DIOs interrupt callback
- *
- * \remark Called to handle all 3 DIOs pins
- */
- void OnDioIrq( void );
-
- /*!
- * \brief Clears the instruction RAM
+ * \brief Process the analysis of radio IRQs and calls callback functions
+ * depending on radio state
*/
- virtual void ClearInstructionRam( void ) = 0;
-
- /*!
- * \brief Parses 1 HEX file line and writes the content to the instruction memory
- *
- * \param [in] line HEX file line string
- *
- * \retval status [0: ERROR, 1:OK]
- */
- int8_t ParseHexFileLine( char* line );
-
- /*!
- * \brief Gets individual fields for the given HEX file line
- *
- * \param [in] line HEX file line string
- * \param [out] bytes Bytes array to be written to the instruction memory
- * \param [out] addr Instruction memory address where to write the bytes array
- * \param [out] num Number of bytes in Bytes array
- * \param [out] code HEX file line type [0: instruction, 1: end of file, 2: begin of file]
- *
- * \retval status [0: ERROR, 1:OK]
- */
- int8_t GetHexFileLineFields( char* line, uint8_t *bytes, uint16_t *addr, uint16_t *num, uint8_t *code );
+ void ProcessIrqs( void );
};
#endif // __SX126x_H__